pax_global_header00006660000000000000000000000064143565006740014524gustar00rootroot0000000000000052 comment=c6af8ef4bf44c2d3ed36a136f1799fe263978af4 gnustep-base-1.29.0/000077500000000000000000000000001435650067400142125ustar00rootroot00000000000000gnustep-base-1.29.0/.clang-format000066400000000000000000000044451435650067400165740ustar00rootroot00000000000000# Copyright (C) 2015 Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # Modified from gcc's clang-format config. # clang-format 7.0.1 is required # # To utilize the tool to lines just touched by a patch, use # clang-format-diff script that is usually also packaged with clang-format. # # Example of usage: # git diff -U0 --no-color | clang-format-diff -p1 # (here the tool will generate a patch) # git diff -U0 --no-color | clang-format-diff -p1 -i # (modifications are applied) --- AccessModifierOffset: -2 AlwaysBreakAfterReturnType: TopLevel AlignConsecutiveDeclarations: true BinPackArguments: true BinPackParameters: true BreakBeforeBinaryOperators: All BreakBeforeBraces: Custom # Newer clang-format has BS_GNU BraceWrapping: AfterClass: true AfterControlStatement: true AfterEnum: true AfterFunction: true AfterNamespace: false AfterObjCDeclaration: true AfterStruct: true AfterUnion: true BeforeCatch: true BeforeElse: true IndentBraces: true SplitEmptyFunction: false BreakBeforeTernaryOperators: true ColumnLimit: 80 ConstructorInitializerIndentWidth: 2 ContinuationIndentWidth: 2 ObjCBlockIndentWidth: 2 ObjCSpaceAfterProperty: true ObjCSpaceBeforeProtocolList: true ForEachMacros: [] IndentCaseLabels: false NamespaceIndentation: None PenaltyBreakBeforeFirstCallParameter: 100 DerivePointerAlignment: false PointerAlignment: Right SortIncludes: false SpaceAfterCStyleCast: true SpaceBeforeParens: ControlStatements SpacesBeforeTrailingComments: 1 UseTab: Always AlignEscapedNewlines: Right AlignTrailingComments: true AllowShortFunctionsOnASingleLine: All AlwaysBreakTemplateDeclarations: MultiLine KeepEmptyLinesAtTheStartOfBlocks: false # TODO # MacroBlockBegin: # MacroBlockEnd: gnustep-base-1.29.0/.cvsignore000066400000000000000000000002761435650067400162170ustar00rootroot00000000000000.date .name .patch* .snap* =* *errs *.tar.gz *.patch *-patch config.cache config.guess config.log config.status config.mak base.make gnustep-base.spec gnustep-base-debug.spec autom4te.cache gnustep-base-1.29.0/.github/000077500000000000000000000000001435650067400155525ustar00rootroot00000000000000gnustep-base-1.29.0/.github/scripts/000077500000000000000000000000001435650067400172415ustar00rootroot00000000000000gnustep-base-1.29.0/.github/scripts/dependencies.sh000077500000000000000000000042221435650067400222260ustar00rootroot00000000000000#! /usr/bin/env sh set -ex install_gnustep_make() { echo "::group::GNUstep Make" cd $DEPS_PATH git clone -q -b ${TOOLS_MAKE_BRANCH:-master} https://github.com/gnustep/tools-make.git cd tools-make MAKE_OPTS= if [ -n "$HOST" ]; then MAKE_OPTS="$MAKE_OPTS --host=$HOST" fi if [ -n "$RUNTIME_VERSION" ]; then MAKE_OPTS="$MAKE_OPTS --with-runtime-abi=$RUNTIME_VERSION" fi ./configure --prefix=$INSTALL_PATH --with-library-combo=$LIBRARY_COMBO $MAKE_OPTS || cat config.log make install echo Objective-C build flags: $INSTALL_PATH/bin/gnustep-config --objc-flags echo "::endgroup::" } install_libobjc2() { echo "::group::libobjc2" cd $DEPS_PATH git clone -q https://github.com/gnustep/libobjc2.git cd libobjc2 git submodule sync git submodule update --init mkdir build cd build cmake \ -DTESTS=off \ -DCMAKE_BUILD_TYPE=RelWithDebInfo \ -DGNUSTEP_INSTALL_TYPE=NONE \ -DCMAKE_INSTALL_PREFIX:PATH=$INSTALL_PATH \ ../ make install echo "::endgroup::" } install_libdispatch() { echo "::group::libdispatch" cd $DEPS_PATH # will reference upstream after https://github.com/apple/swift-corelibs-libdispatch/pull/534 is merged git clone -q -b system-blocksruntime https://github.com/ngrewe/swift-corelibs-libdispatch.git libdispatch mkdir libdispatch/build cd libdispatch/build # -Wno-error=void-pointer-to-int-cast to work around build error in queue.c due to -Werror cmake \ -DBUILD_TESTING=off \ -DCMAKE_BUILD_TYPE=RelWithDebInfo \ -DCMAKE_INSTALL_PREFIX:PATH=$INSTALL_PATH \ -DCMAKE_C_FLAGS="-Wno-error=void-pointer-to-int-cast" \ -DINSTALL_PRIVATE_HEADERS=1 \ -DBlocksRuntime_INCLUDE_DIR=$INSTALL_PATH/include \ -DBlocksRuntime_LIBRARIES=$INSTALL_PATH/lib/libobjc.so \ ../ make install echo "::endgroup::" } mkdir -p $DEPS_PATH # Windows MSVC toolchain uses tools-windows-msvc scripts to install non-GNUstep dependencies if [ "$LIBRARY_COMBO" = "ng-gnu-gnu" -a "$IS_WINDOWS_MSVC" != "true" ]; then install_libobjc2 install_libdispatch fi install_gnustep_make gnustep-base-1.29.0/.github/workflows/000077500000000000000000000000001435650067400176075ustar00rootroot00000000000000gnustep-base-1.29.0/.github/workflows/main.yml000066400000000000000000000237731435650067400212720ustar00rootroot00000000000000name: CI on: push: pull_request: workflow_dispatch: inputs: tools_make_branch: description: "tools-make branch" default: "master" required: true tools_windows_msvc_branch: description: "tools-windows-msvc branch (leave empty to use latest pre-built release)" required: false env: APT_PACKAGES: >- pkg-config libgnutls28-dev libffi-dev libicu-dev libxml2-dev libxslt1-dev libssl-dev libavahi-client-dev zlib1g-dev gnutls-bin libcurl4-gnutls-dev # packages for GCC Objective-C runtime APT_PACKAGES_gcc: >- libobjc-10-dev libblocksruntime-dev gobjc # packages for libobjc2 / libdispatch APT_PACKAGES_clang: >- libpthread-workqueue-dev jobs: ########### Linux ########### linux: name: ${{ matrix.name }} runs-on: ubuntu-latest # don't run pull requests from local branches twice if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.repository strategy: fail-fast: false matrix: include: - name: Ubuntu x64 GCC library-combo: gnu-gnu-gnu CC: gcc CXX: g++ - name: Ubuntu x64 Clang gnustep-1.9 library-combo: ng-gnu-gnu runtime-version: gnustep-1.9 CC: clang CXX: clang++ - name: Ubuntu x64 Clang gnustep-2.0 library-combo: ng-gnu-gnu runtime-version: gnustep-2.0 CC: clang CXX: clang++ env: SRC_PATH: ${{ github.workspace }}/source DEPS_PATH: ${{ github.workspace }}/dependencies INSTALL_PATH: ${{ github.workspace }}/build CC: ${{ matrix.CC }} CXX: ${{ matrix.CXX }} LIBRARY_COMBO: ${{ matrix.library-combo }} RUNTIME_VERSION: ${{ matrix.runtime-version }} defaults: run: working-directory: ${{ env.SRC_PATH }} steps: - uses: actions/checkout@v3 with: path: ${{ env.SRC_PATH }} - name: Install packages run: | sudo apt-get -q -y update sudo apt-get -q -y install $APT_PACKAGES $APT_PACKAGES_${{ matrix.library-combo == 'ng-gnu-gnu' && 'clang' || 'gcc' }} # gnustep-2.0 runtime requires ld.gold or lld if [ "$RUNTIME_VERSION" = "gnustep-2.0" ]; then sudo update-alternatives --install "/usr/bin/ld" "ld" "/usr/bin/ld.gold" 10 fi - name: Install dependencies env: TOOLS_MAKE_BRANCH: ${{github.event.inputs.tools_make_branch}} run: ./.github/scripts/dependencies.sh - name: Build source run: | . $INSTALL_PATH/share/GNUstep/Makefiles/GNUstep.sh ./configure make && make install - name: Run tests run: | . $INSTALL_PATH/share/GNUstep/Makefiles/GNUstep.sh make check - name: Upload logs uses: actions/upload-artifact@v3 if: always() with: name: Logs - ${{ matrix.name }} path: | ${{ env.SRC_PATH }}/config.log ${{ env.SRC_PATH }}/Tests/tests.log ########### Windows ########### windows: name: ${{ matrix.name }} runs-on: windows-2019 # don't run pull requests from local branches twice if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.repository strategy: fail-fast: false matrix: include: - name: Windows x86 MinGW GCC allow-test-failures: true arch: i686 msystem: MINGW32 library-combo: gnu-gnu-gnu CC: gcc CXX: g++ - name: Windows x64 MinGW GCC arch: x86_64 msystem: MINGW64 library-combo: gnu-gnu-gnu CC: gcc CXX: g++ - name: Windows x86 MSVC Clang gnustep-2.0 allow-test-failures: true arch: x86 host: i686-pc-windows library-combo: ng-gnu-gnu runtime-version: gnustep-2.0 configure-opts: --disable-tls CC: clang -m32 CXX: clang++ -m32 LDFLAGS: -fuse-ld=lld - name: Windows x64 MSVC Clang gnustep-2.0 arch: x64 host: x86_64-pc-windows library-combo: ng-gnu-gnu runtime-version: gnustep-2.0 configure-opts: --disable-tls CC: clang -m64 CXX: clang++ -m64 LDFLAGS: -fuse-ld=lld env: SRC_PATH: ${{ github.workspace }}\source DEPS_PATH: ${{ github.workspace }}\dependencies INSTALL_PATH: ${{ github.workspace }}\build IS_WINDOWS_MINGW: ${{ startsWith(matrix.msystem, 'MINGW') }} IS_WINDOWS_MSVC: ${{ endsWith(matrix.host, '-pc-windows') }} CC: ${{ matrix.CC }} CXX: ${{ matrix.CXX }} LDFLAGS: ${{ matrix.LDFLAGS }} HOST: ${{ matrix.host }} ARCH: ${{ matrix.arch }} LIBRARY_COMBO: ${{ matrix.library-combo }} RUNTIME_VERSION: ${{ matrix.runtime-version }} CONFIGURE_OPTS: ${{ matrix.configure-opts }} # MSYS2: disable conversion to native-form paths when configuring GNUstep Make # https://www.msys2.org/wiki/Porting/#filesystem-namespaces MSYS2_ARG_CONV_EXCL: --prefix= defaults: run: shell: msys2 {0} working-directory: ${{ env.SRC_PATH }} steps: - uses: actions/checkout@v3 with: path: ${{ env.SRC_PATH }} - name: Set up MSYS2 (MinGW) uses: msys2/setup-msys2@v2 if: env.IS_WINDOWS_MINGW == 'true' with: msystem: ${{ matrix.msystem }} install: > git make pkg-config libxml2-devel libxslt-devel libffi-devel libgnutls-devel icu-devel mingw-w64-${{matrix.arch}}-gcc-objc mingw-w64-${{matrix.arch}}-pkg-config mingw-w64-${{matrix.arch}}-libxml2 mingw-w64-${{matrix.arch}}-libxslt mingw-w64-${{matrix.arch}}-libffi mingw-w64-${{matrix.arch}}-gnutls mingw-w64-${{matrix.arch}}-icu - name: Set up MSYS2 (MSVC) uses: msys2/setup-msys2@v2 if: env.IS_WINDOWS_MSVC == 'true' with: msystem: MSYS install: make autoconf automake libtool # make Windows packages like Clang available in MSYS path-type: inherit - name: Delete MinGW gmake (MSVC) if: env.IS_WINDOWS_MSVC == 'true' # delete /c/Strawberry/c/bin/gmake built for MinGW that is found on runners, because we must use make built for MSYS run: if GMAKE_PATH=`which gmake`; then rm -f "$GMAKE_PATH"; fi - name: Install Windows packages (MSVC) if: env.IS_WINDOWS_MSVC == 'true' shell: cmd run: choco install ninja - name: Set up VS Developer Command Prompt (MSVC) if: env.IS_WINDOWS_MSVC == 'true' uses: ilammy/msvc-dev-cmd@v1 with: arch: ${{ matrix.arch }} - name: Build dependencies (MSVC) if: env.IS_WINDOWS_MSVC == 'true' && github.event.inputs.tools_windows_msvc_branch shell: cmd env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # used by scripts to prevent GitHub rate limit errors run: | mkdir %DEPS_PATH% & cd %DEPS_PATH% git clone -q -b ${{github.event.inputs.tools_windows_msvc_branch}} https://github.com/gnustep/tools-windows-msvc.git || exit /b 1 cd tools-windows-msvc :: use msys2.cmd from setup-msys2 as Bash shell, as it doesn't have msys2_shell.cmd used normally by build.bat set "BASH=msys2 -c" build.bat --prefix=%INSTALL_PATH% --type Release --only-dependencies - name: Install pre-built dependencies (MSVC) if: env.IS_WINDOWS_MSVC == 'true' && !github.event.inputs.tools_windows_msvc_branch shell: cmd run: | mkdir %INSTALL_PATH% & cd %INSTALL_PATH% # download latest pre-built release curl -L -o GNUstep-Windows-MSVC.zip https://github.com/gnustep/tools-windows-msvc/releases/download/latest/GNUstep-Windows-MSVC-${{matrix.arch}}.zip || exit /b 1 # extract excluding debug build and GNUstep components (we need dependencies only) tar -xvf GNUstep-Windows-MSVC.zip --strip 1 --exclude Debug --exclude "**/gnustep*" --exclude "**/GNUstep*" --exclude Foundation --exclude CoreFoundation || exit /b 1 del /Q GNUstep-Windows-MSVC.zip - name: Set environment variables run: | # MSVC: update install path to include [x86|x64]/Release subdir used by build.bat above if [ "$IS_WINDOWS_MSVC" = "true" ]; then INSTALL_PATH=$INSTALL_PATH\\$ARCH\\Release fi # convert Windows paths to Unix paths for MSYS2 shell echo "INSTALL_PATH=`cygpath -u $INSTALL_PATH`" >> $GITHUB_ENV echo "DEPS_PATH=`cygpath -u $DEPS_PATH`" >> $GITHUB_ENV - name: Install dependencies env: TOOLS_MAKE_BRANCH: ${{github.event.inputs.tools_make_branch}} run: ./.github/scripts/dependencies.sh - name: Build source run: | . $INSTALL_PATH/share/GNUstep/Makefiles/GNUstep.sh if [ -n "$HOST" ]; then CONFIGURE_OPTS="$CONFIGURE_OPTS --host=$HOST" fi ./configure $CONFIGURE_OPTS make && make install - name: Run tests continue-on-error: ${{ matrix.allow-test-failures || false }} run: | . $INSTALL_PATH/share/GNUstep/Makefiles/GNUstep.sh # MSVC: build tests for release to match CRT of DLLs if [ "$IS_WINDOWS_MSVC" = "true" ]; then sed -i -e 's/ debug=yes//g' `which gnustep-tests` fi make check - name: Upload logs uses: actions/upload-artifact@v3 if: always() with: name: Logs - ${{ matrix.name }} path: | ${{ env.SRC_PATH }}/config.log ${{ env.SRC_PATH }}/Tests/tests.log gnustep-base-1.29.0/.gitignore000066400000000000000000000031031435650067400161770ustar00rootroot00000000000000# Build products obj config.* GSConfig.h base.make Info-gnustep.plist dynamic-load.h Tests/base/*/GNUmakefile *.log *.sum # Autoconf autom4te.cache # Test products Tests/base/coding/*.type Tests/base/NSBundle/Resources/TestBundle.bundle/ Tests/base/NSBundle/Resources/TestFramework.framework/ Tests/base/NSBundle/Resources/derived_src/ Tests/base/NSConnection/Resources/TestConnection.bundle/ Tests/base/NSInvocation/Resources/InvokeProxy.bundle/ Tests/base/NSURL/Capture.dat Tests/base/NSURL/KAResponse.dat Tests/base/NSURL/SimpleResponse.dat Tests/base/NSURLConnection/Helpers/TestConnection.bundle/ Tests/base/coding/long-8.type Tests/base/coding/ulong-8.type # Editor byproducts *.orig *.swp # MacOS Desktop Services Store .DS_Store # Created by https://www.gitignore.io/api/xcode # Edit at https://www.gitignore.io/?templates=xcode ### Xcode ### # Xcode # # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore ## User settings xcuserdata/ ## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) *.xcscmblueprint *.xccheckout ## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) build/ DerivedData/ *.moved-aside *.pbxuser !default.pbxuser *.mode1v3 !default.mode1v3 *.mode2v3 !default.mode2v3 *.perspectivev3 !default.perspectivev3 ## Xcode Patch *.xcodeproj/* !*.xcodeproj/project.pbxproj !*.xcodeproj/xcshareddata/ !*.xcworkspace/contents.xcworkspacedata /*.gcno ### Xcode Patch ### **/xcshareddata/WorkspaceSettings.xcsettings # End of https://www.gitignore.io/api/xcode gnustep-base-1.29.0/ANNOUNCE000066400000000000000000000145031435650067400153460ustar00rootroot000000000000001 Announcement ************** The GNUstep Base Library, version 1.28.0, is now available. 1.1 What is the GNUstep Base Library? ===================================== The GNUstep Base Library is a library of general-purpose, non-graphical Objective C objects. For example, it includes classes for strings, object collections, byte streams, typed coders, invocations, notifications, notification dispatchers, moments in time, network ports, remote object messaging support (distributed objects), and event loops. It provides functionality that aims to implement the non-graphical portion of the OpenStep standard (the Foundation library). There is more information available at the GNUstep homepage at 'http://www.gnustep.org'. 1.2 Noteworthy changes in version '1.28.0' ========================================== Aside from an assortment of bugfixes, this release includes a lot of improvements for Windows support as well as numerous new classes and methods. Not every bugfix, improvement or a new feature will be listed here. * Reading and setting File Creation Date attribute on Windows. * Added new 'ASSIGNMUTABLECOPY()' macro for consistency with 'ASSIGNCOPY()'. * Replaced character set data headers for URLs with loading these from a standard data source, and updated bitmap representation to use much less space for character sets residing wholly in the base plane, such as the URL charsets (given they are purely ASCII). * Updated character set data with newer Unicode data set. * '[NSURLProtocol -initWithRequest:cachedResponse:client:]' will now retain the client up until the last message is sent to it, which improves compatibility with OS X. * Percent-escaping code in 'NSURL' simplified. * Removed mixed ABI support. * Use of Apple runtime now assumes non-fragile ABI (which is true on modern systems). * Improve typing on method implementation pointers in some classes. * In 'NSHTTPCookie', rewritten code for extracting individual cookies from the HTTP header. * In 'NSKeyedArchiver', implement secure coding methods. * New methods in 'NSDateComponents'. * Improvements in 'NSCalendar' and 'NSLocale' for calendar locale and 'NSDateComponents'. * In 'NSFileManager', use 'utimensat()' to set file modification date, if available. * Correctly stop parsing number being decoded in 'NSJSONSerialization' when encountering a number with an invalid exponent. * Improve OS X compatibility for 'NSURLQueryItem' initializers. * For 'NSFileManager', in 'changeFileAttributes', implement setting creation date for Unix-like systems. Implement reading the creation date if a supported method was detected. * Support reading Android assets from the main bundle in 'NSInputStream'. * Support Android assets directories in 'NSBundle' and 'NSFileManager'. * Implement '-[NSXMLParser initWithStream:]'. * Allow clearer choice between 'sloppy' 'GSSloppyXMLParser' used in 'NSXMLParser' and the libxml2-based 'GSStrictXMLParser'. * Fix building Win32 implementations for 'GSFileHandle' and 'NSMessagePort' with nonfragile ABI. * Use 'NSNumber' and not 'NSString' in '-[NSUserDefaults setBool:forKey:]'. * Posting notification before 'NSThread' exit. * Actually declare optional 'NSFilePresenter' methods as optional. * In 'NSConcreteMapTable', fix replacing existing values in a weak objects map table. * Fix leaks in 'NSOperation'. * Various compat fixes for various MSYS systems, particularly around sockets code. * In 'NSData', 'NSFileManager' and more, various improvements when overwriting and creating files with respect to file attributes (owners, creation timestamp, etc). * Improve 'NSLog' output on Android. * Use 'instancetype' in 'NSURLRequest' header. * Define 'NSAttributedStringKey' and 'NSNotificationName'. * Add new 'NSURL' methods. * In 'GSMime', have '-contentFile' check the 'Content-Type' header before checking 'Content-Disposition'. * Fix a bug linking with WEAK symbols where binutils 2.3.5 would fail to link due to not all expected symbols being exported. * New 'plutil' utility. * Implementation of '[NSData rangeOfData:options:range:]' which finds the 'NSRange' in which the passed data occurs. * Change 'ENTER_POOL'/'LEAVE_POOL' so they no longer wrap the enclosed code in a loop, enabling use in some loops. * New 10.5 methods in 'NSRunLoop'/'NSURLConnection'. * Improve compatibility when building with ICU 68. * Fix compiling libdispatch integration of 'NSRunLoop' on Windows. * Add support for building on Windows with MSVC's Clang by passing the 'configure' flag '--host=x86_64-pc-windows'. Use of an MSYS2 shell without '-devel' packages is recommended. * Implementation of 'NSURLSession' and related classes. This adds some dependencies on more recent versions of 'libcurl', 'libdispatch' etc. * Fix initializing 'NSUUID' from a string. * Disable use of 'libcurl' if its headers are not found. * In 'NSURLProtocol', continue writing data if not all of it was written. * Fix use of GnuTLS under MinGW by using 'send/recv' rather than 'read/write'. * Add support for libobjc2 runtime on Windows. * Fix BOM insertion when generating data from a string using one of the Unicode encodings. 1.3 Where can you get it? How can you compile it? ================================================= The gnustep-base-1.28.0.tar.gz distribution file has been placed at . It is accompanied by gnustep-base-1.28.0.tar.gz.sig, a PGP signature which you can validate by putting both files in the same directory and using: gpg --verify gnustep-base-1.28.0.tar.gz.sig Signature has been created using the key with the following fingerprint: 83AA E47C E829 A414 6EF8 3420 CA86 8D4C 9914 9679 Read the INSTALL file or the GNUstep-HOWTO for installation instructions. 1.4 Where do I send bug reports? ================================ Please log bug reports on the GNUstep project page or send bug reports to . 1.5 Obtaining GNUstep Software ============================== Check out the GNUstep web site. () and the GNU web site. () gnustep-base-1.29.0/CODEOWNERS000066400000000000000000000003421435650067400156040ustar00rootroot00000000000000# These owners will be the default owners for everything in # the repo. Unless a later match takes precedence, # @global-owner1 and @global-owner2 will be requested for # review when someone opens a pull request. * @rfm gnustep-base-1.29.0/COPYING000066400000000000000000000431061435650067400152510ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. 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 Program or any portion of it, thus forming a work based on the Program, 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) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, 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 Program, 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 Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) 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; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, 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 executable. However, as a special exception, the source code 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. If distribution of executable or 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 counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program 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. 5. 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 Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program 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 to this License. 7. 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 Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program 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 Program. 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. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program 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. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies 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 Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, 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 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. 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 PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS Appendix: How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively 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) 19yy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. gnustep-base-1.29.0/COPYING.LIB000066400000000000000000000635061435650067400156640ustar00rootroot00000000000000 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 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! gnustep-base-1.29.0/COPYINGv3000066400000000000000000001045141435650067400155230ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . gnustep-base-1.29.0/ChangeLog000066400000000000000000032263221435650067400157760ustar00rootroot000000000000002022-01-08 Richard Frith-Macdonald * ChangeLog: Update for new release * ANNOUNCE: * NEWS: * Documentation/ReleaseNotes.gsdoc: * Documentation/news.texi: Update release notes for 1.29.0 release. * Version: bump to 1.29.0 2022-12-28 Richard Frith-Macdonald * ChangeLog: Update for new release * ANNOUNCE: * NEWS: * NSTimeZones/NSTimeZones.tar: update * Documentation/ReleaseNotes.gsdoc: * Documentation/news.texi: Update release notes for 1.28.1 release. * Version: bump to 1.28.1 2022-12-09 Richard Frith-Macdonald * Source/NSXMLParser.m: do not process end tag if parsing was aborted while processing start tag. 2022-11-29 Richard Frith-Macdonald * Source/GSHTTPURLHandle.m: Use the https_proxy and http_proxy environment variables if no proxying is specified. Also support those keys as properties in the request (overriding the environment variables) and support the URL protection spece if set. 2022-11-26 Fred Kiefer * Source/Additions/GSXML.m: Remove usage of deprecated function when a newer version of libxml is used. 2022-11-25 Florian Weimer * config/config.poll-dev.c: * config/config.proccmd.c: * config/config.reuseaddr.c: * config/config.vasprintf.c: * config/config.vsprintf.c: Make config tests work with C99 compiler 2022-11-21 Wolfgang Lux * Source/NSFileManager.m: Call NSDirectoryEnumerator's constructor with either YES or NO for the BOOL arguments. Really skip hidden files in enumerations if requested by the options. 2022-11-21 Richard Frith-Macdonald * Headers/Foundation/NSFileHandle.h: * Headers/GNUstepBase/GSTLS.h: * Source/GSHTTPURLHandle.m: * Source/GSSocketStream.m: * Source/GSTLS.m: * Source/NSURLProtocol.m: * Source/externs.m: Fixup to use strict rfc4514 for distinguished names of issuer and owner of certificates. Add GSTLSIssuers and GSTLSOwners properties to reject remote certificates which do not match distinguishd names accepted. This allows encrypted DO to be configured to automatically reject connection attempts which do not have trusted certificates. 2022-11-15 Richard Frith-Macdonald * GSSocketStream.m: * NSFileHandle.m: Use new -[GSTLS pending] method to trigger event handling immediately rather than waiting for more data from the network layer. 2022-11-07 Richard Frith-Macdonald * Headers/GNUstepBase/GSTLS.h: * Source/GSTLS.m: Add -pending method to return the number of bytes in the read bufffer. * Source/NSSocketPort.m: Use the new method to avoid a potential hang on an encrypted DO connection. 2022-10-21 Richard Frith-Macdonald * Source/GSHTTPURLHandle.m: Refactor a litle to avoid code duplication and try to ensure that the connection is mared 'idle' as soon as we have finished I/O (so its URL can be changed). 2022-10-20 Richard Frith-Macdonald * Resources/GSTLS/README: * Source/GSTLS.m: Honor the SSL_CERT_FILE environment variable (for OpenSSL compatibility) if our own user default or environment variable is not used. 2022-10-18 Richard Frith-Macdonald * Source/GSHTTPURLHandle.m: Track whether we have read any data from the server. If a connection is closed by the server while it is being kept alive (ie we are not on first request) and no response data has been read for a request we sent, we assume it was an intentional close and try to establish a new connection to retry the request. This is more tolerant of latency in the network (which could mean that our test tthat the connection is still alive before sending a request could be wrong) and also deals with perverse server implementations which drop long standing connections when the server receives a request rather than when a timeout occurred. 2022-09-15 Hugo Melder * config/config.constant-string-class.m: * Tests/base/NSObject/initialize.m: * Tests/base/NSTask/launch.m: C99 does not support implicit function declarations. Add string.h and unistd.h when applicable. 2022-08-23 Hugo Melder * Tests/base/NSURL/basic.m: Fix URL description and resource specifier test value on win32. * Tests/base/NSURL/test00.m: * Tests/base/NSURL/test01.m: * Tests/base/NSURL/test02.m: * Tests/base/NSURLConnection/test01.m: * Tests/base/NSURLConnection/test02.m: * Tests/base/NSURLConnection/test03.m: * Tests/base/NSURLConnection/test04.m: * Tests/base/NSURLConnection/test05.m: * Tests/base/NSURLConnection/test06.m: * Tests/base/NSURLConnection/test07.m: * Tests/base/NSURLHandle/test00.m: * Tests/base/NSURLHandle/test01.m: Skip all test cases using the GSInetServerStream class as it is broken on win32. 2022-08-16 Hugo Melder * Source/NSPredicate.m: When parsing an NSArray in -expressionValueWithObject:context:, check if the array entry is a NSExpression object. * Tests/base/NSPredicate/basic.m: Test filter operation. 2022-08-16 Hugo Melder * Source/win32/GSFileHandle.m: Support overlapped I/O on standard streams in GSFileHandle. * Source/GSFileHandle.h: Add the isStandardStream instance variable. * Tests/base/NSRunLoop/performers.m: Remove extraneous unistd header from unit test. 2022-08-16 Richard Frith-Macdonald * Source/NSOperation.m: Remove restriction (of 8) on the maximum number of threads, and set that as the default value instead, so the -setMaxConcurrentOperationCount: method can override it. Thanks to https://github.com/wbardwel for the suggestion. 2022-08-11 Hugo Melder * Tests/base/NSTimeZone/use.m: Update NSTimeZone unit test to match macOS behaviour. America/Sao_Paulo has no DST. 2022-08-07 Hugo Melder * Source/NSTimeZone.m: Windows to IANA time zone conversion: remove unsupported TIME_ZONE_ID_DAYLIGHT conversion. * Tests/base/NSTimeZone/use.m: Fix test case to check for the correct standard time zone name. 2022-08-05 Hugo Melder * Tests/base/NSTask/Helpers/GNUmakefile: Fix compilation of NSTask helper test files on Windows MSVC. * Tests/base/NSTask/general.m: * Tests/base/NSTask/launch.m: * Tests/base/NSTask/notify.m: Conditionally use .exe suffix in executable paths. 2022-08-04 Hugo Melder * Tests/base/GSTLS/basic.m: Disable test completly if gnutls is not present. * Tests/base/NSData/additions.m: Check if dataWithContentsOfFile: returns an instance. * Tests/base/NSString/tilde.m: Skip tilde abbreviation test on Windows. 2022-08-04 Hugo Melder * Tests/base/coding/basictypes.m: Fetch the generated .type file directly to avoid size mismatches. * .gitignore: Ignore .type files in the coding unit test directory. 2022-08-03 Hugo Melder * Tests/base/NSBundle/GNUmakefile.preamble * Tests/base/NSBundle/resources2.m Exclude framework loading on Windows, as Windows lacks support for run-time search paths. 2022-07-27 Richard Frith-Macdonald * Source/GSHTTPURLHandle.m: * Source/NSURLProtocol.m: Include body after masked headers in debug output. 2022-05-20 Richard Frith-Macdonald Changes to remove sensitive information from debug logs. * Source/Additions/GSMime.m: Mask out sensitive information in the -description method of the Authorization header. Add method to do similar masking for debug output of HTTP requests. * Source/GSHTTPURLHandle.m: Use new method to mask Authorization header value in debug log of outgoing requests. * Source/NSURLProtocol.m: Use new method to mask Authorization header value in debug log of outgoing requests. 2022-04-14 Richard Frith-Macdonald * Source/NSConnection.m: If we get an exception in a packet from a remote system to which we sent a oneway void message, decode the exception and report it. 2022-04-07 Richard Frith-Macdonald * Source/GSeq.h: Fix normalisation to handle the case where combining diacriticals are repeated in a composed character sequence. Those repeats need to be reduced to a single instance. 2022-04-06 Gregory John Casamento * Headers/Foundation/NSCalendar.h: Add documentation. * Source/NSCalendar.m: Implement getEra:... and getHour:... methods based on Keysight/TestPlant changes * Tests/base/NSCalendar/basic.m: Minor cleanup. * Tests/base/NSCalendar/component-diff.m: Add tests for methods implemented above. 2022-03-07 Gregory John Casamento * Headers/Foundation/NSIndexPath.h: Add declarations for new methods to support collection and table view. New methods are - item, - section, - row, - initWithItem:inSection:, and - initWithRow:inSection: * Source/NSIndexPath.m: Implementation of the methods mentioned above. 2022-03-07 Richard Frith-Macdonald * Source/NSPredicate.m: * Tests/base/NSPredicate/basic.m: Fix for git #243 2022-02-25 Richard Frith-Macdonald * Source/NSDistantObject.m: Check to see whether receiver responds to selector before asking the remote object. Fixes bug in testing to see if distant object responds to -connectionForProxy. 2022-02-17 Richard Frith-Macdonald * Documentation/manual/BaseLibrary.texi: * Documentation/manual/WorkingWithObjects.texi: * Documentation/manual/WritingNewClasses.texi: * Headers/Foundation/NSGarbageCollector.h: * Headers/Foundation/NSObject.h: * Headers/GNUstepBase/GNUstep.h: * Source/Additions/GSInsensitiveDictionary.m: * Source/Additions/GSMime.m: * Source/Additions/GSXML.m: * Source/Additions/NSData+GNUstepBase.m: * Source/GSArray.m: * Source/GSDictionary.m: * Source/GSFFIInvocation.m: * Source/GSFTPURLHandle.m: * Source/GSHTTPAuthentication.m: * Source/GSInternal.h: * Source/GSInvocation.h: * Source/GSSocketStream.m: * Source/NSArray.m: * Source/NSAttributedString.m: * Source/NSBundle.m: * Source/NSCallBacks.m: * Source/NSClassDescription.m: * Source/NSConnection.m: * Source/NSData.m: * Source/NSDateFormatter.m: * Source/NSDistantObject.m: * Source/NSFileHandle.m: * Source/NSHost.m: * Source/NSInvocation.m: * Source/NSKeyValueObserving.m: * Source/NSKeyedUnarchiver.m: * Source/NSMessagePort.m: * Source/NSMessagePortNameServer.m: * Source/NSNotificationCenter.m: * Source/NSNumberFormatter.m: * Source/NSObject.m: * Source/NSPortCoder.m: * Source/NSProcessInfo.m: * Source/NSRunLoop.m: * Source/NSScanner.m: * Source/NSSerializer.m: * Source/NSSet.m: * Source/NSSocketPort.m: * Source/NSSocketPortNameServer.m: * Source/NSSpellServer.m: * Source/NSString.m: * Source/NSTask.m: * Source/NSTimeZone.m: * Source/NSURL.m: * Source/NSURLHandle.m: * Source/NSURLProtocol.m: * Source/NSURLResponse.m: * Source/NSUnarchiver.m: * Source/NSValueTransformer.m: * Tools/AGSOutput.m: * Tools/AGSParser.m: * Tools/HTMLLinker.m: * Tools/autogsdoc.m: * Tools/sfparse.m: Replaced IF_NO_GC() macro calls with the more descriptive IF_NO_ARC() and deprecate it. Searched for and removed obsolete references to garbage collection in comments and documentation. 2022-02-12 Richard Frith-Macdonald * Headers/Foundation/NSExpression.h: * Source/NSPredicate.m: Patched from git #237 by Larry Campbell. 2022-02-11 Richard Frith-Macdonald * Source/GSTLS.m: Fix failure to log handle properly during initialisation (set ivar containing handle earlier). 2022-01-31 Richard Frith-Macdonald * Source/NSURL.m: Fix for git #235 reported by Sergei Golovin Plus, make methods consistent in handling of clients. Plus, make clientForHandle() thread-safe. 2022-01-30 Richard Frith-Macdonald * Source/NSPredicate.m: * Documentation/manual/BaseLibrary.texi: * Documentation/manual/WorkingWithObjects.texi: * Documentation/manual/WritingNewClasses.texi: * Headers/Foundation/NSGarbageCollector.h: * Headers/Foundation/NSObject.h: * Headers/GNUstepBase/GNUstep.h: * Source/Additions/GSInsensitiveDictionary.m: * Source/Additions/GSMime.m: * Source/Additions/GSXML.m: * Source/Additions/NSData+GNUstepBase.m: * Source/GSArray.m: * Source/GSDictionary.m: * Source/GSFFIInvocation.m: * Source/GSFTPURLHandle.m: * Source/GSHTTPAuthentication.m: * Source/GSInternal.h: * Source/GSInvocation.h: * Source/GSSocketStream.m: * Source/NSArray.m: * Source/NSAttributedString.m: * Source/NSBundle.m: * Source/NSCallBacks.m: * Source/NSClassDescription.m: * Source/NSConnection.m: * Source/NSData.m: * Source/NSDateFormatter.m: * Source/NSDistantObject.m: * Source/NSFileHandle.m: * Source/NSHost.m: * Source/NSInvocation.m: * Source/NSKeyValueObserving.m: * Source/NSKeyedUnarchiver.m: * Source/NSMessagePort.m: * Source/NSMessagePortNameServer.m: * Source/NSNotificationCenter.m: * Source/NSNumberFormatter.m: * Source/NSObject.m: * Source/NSPortCoder.m: * Source/NSProcessInfo.m: * Source/NSRunLoop.m: * Source/NSScanner.m: * Source/NSSerializer.m: * Source/NSSet.m: * Source/NSSocketPort.m: * Source/NSSocketPortNameServer.m: * Source/NSSpellServer.m: * Source/NSString.m: * Source/NSTask.m: * Source/NSTimeZone.m: * Source/NSURL.m: * Source/NSURLHandle.m: * Source/NSURLProtocol.m: * Source/NSURLResponse.m: * Source/NSUnarchiver.m: * Source/NSValueTransformer.m: * Tools/AGSOutput.m: * Tools/AGSParser.m: * Tools/HTMLLinker.m: * Tools/autogsdoc.m: * Tools/sfparse.m: Fix for git #233 by Larry Campbell 2022-01-15 Frederik Seiffert * Source/NSPathUtilities.m: Fix NSTemporaryDirectory() returning path with backslashes on Windows. 2022-01-13 Frederik Seiffert * Source/NSTimeZone.m: Fix time zone lookup on Windows MSVC by converting Windows timezone name to IANA identifier. 2022-01-04 Richard Frith-Macdonald * Source/NSOperation.m: Declare private method to avoid compiler warnings. 2022-01-04 Richard Frith-Macdonald * Headers/Foundation/NSString.h: * Source/Additions/GSMime.m: * Source/Additions/Unicode.m: * Resources/English.lproj/Localizable.strings: * Resources/Esperanto.lproj/Localizable.strings: * Resources/French.lproj/Localizable.strings: * Resources/German.lproj/Localizable.strings: * Resources/Italian.lproj/Localizable.strings: * Resources/Japanese.lproj/Localizable.strings: * Resources/Korean.lproj/Localizable.strings: * Resources/Polish.lproj/Localizable.strings: * Resources/SimplifiedChinese.lproj/Localizable.strings: * Resources/Spanish.lproj/Localizable.strings: * Resources/TraditionalChinese.lproj/Localizable.strings: Reinstate lost encoding constants (so that software using the gnustep extenstions should work again). Also tidy some indentation issues. 2021-12-21 Frederik Seiffert * Source/NSOperation.m: fix handling of concurrent NSOperations if isFinished KVO is triggered without the operation being finished, and call completion block for concurrent operations. Also fixes removing dependency observers more than once. 2021-12-14 Frederik Seiffert * Source/NSBundle.m: Default to UTF-8 when reading localized string files without BOM. 2021-12-07 Richard Frith-Macdonald * Source/GSTLS.m: (-disconnect:) try once if we are closing the TCP connection, for up to 10 seconds if trying to keep it available. * Source/NSFileHandle.m: (-sslDisconnect) operate in non-blocking mode so that network issues should not cause a disconnect attempt to hang. This should behave better on heavily loaded systems. 2021-11-23 Richard Frith-Macdonald * configure.ac: check for zlib before bfd * configure: regenerate libbfd may need libz, so we must check for one before checking for the other. 2021-11-21 Gregory John Casamento * Headers/Foundation/NSURLConnection.h: Add NSURLConnectionDataDelegate protocol. * Headers/Foundation/NSURLRequest.h: Add enum for NSURLNetworkServiceType. 2021-11-19 Richard Frith-Macdonald * Helpers/Launch.h: * Helpers/capture.m: * Helpers/keepalive.m: * Helpers/respond.m: * test00.m: * test01.m: * test02.m: Rewrite helper launching so that the test process waits for up to ten seconds for the helper to tell it that it's ready to accept requests. This should make tests run a bit quicker (no longer waiting a fixed interval for the helper to start) while allowing longer for the helpers to start on slow systems, and thus making the tests more reliable. 2021-11-11 Frederik Seiffert * Headers/Foundation/NSBundle.h: Annotate NSBundle localized string function with NS_FORMAT_ARGUMENT. 2021-09-20 Frederik Seiffert * Source/NSFileManager.m: Fix -[NSFileManager URLForDirectory:...] using incorrect NSURL initializer and simplified implementation. 2021-09-16 Richard Frith-Macdonald * Source/NSJSONSerialization.m: * Source/NSURL.m: Fix minor potential leaks. 2021-08-27 Richard Frith-Macdonald * Source/nstzfile.h: deleted (merged into tzdb.h) * Source/tzdb.h: updated (includes nstzfile.h) * Source/NSTimeZone.h: some cleanups Tidies up as suggested by Fred 2021-08-14 Richard Frith-Macdonald * Source/nstzfile.h: Fix by Emmanuel Dreyfus - increase number of transitions allowed, so that we can handle dates further into the future (since v2+ files support that). * Tests/base/NSTimeZone/ParisV1-noMagic.tzdb: * Tests/base/NSTimeZone/ParisV1.tzdb: * Tests/base/NSTimeZone/ParisV2-missingHeader.tzdb: * Tests/base/NSTimeZone/ParisV2.tzdb: * Tests/base/NSTimeZone/localtime.m: Increase the range of testcases 2021-08-11 Richard Frith-Macdonald * Source/tzdb.h: Public domain time zone file parsing etc * Source/NSTimeZone.m: Use code from tzdb.h * Headers/Foundation/NSTimeZone.h: Remove some obsolete comments * configure.ac: check for stdbool.h needed by tzdb.h * configure: regenerate * Headers/GNUstepBase/config.h.in: define for stdbool check * Tests/base/NSTimeZone/Paris.tzdbv1: test timezone file (version 1) * Tests/base/NSTimeZone/Paris.tzdbv2: test timezone file (version 2) * Tests/base/NSTimeZone/localtime.m: Some testcases for v1/v2 Incorporate work by Emmanuel Dreyfus to use public domain tzfile parsing code supporting times too large to fit in 32bit value. The public domain code has some support for the Posix TZ environment variable style string used by version2 to support times after the last transition in the file, but I'm not convinced it works properly, so this may need to be revisited. 2021-08-10 Frederik Seiffert * Source/NSObject: * Source/NSProcessInfo.m: * Source/NSSocketPort.m: * Source:libgnustep-base-entry.m: Initialize Windows Sockets in NSObject only and update to Windows Socket version 2.2. 2021-08-03 Frederik Seiffert * Headers/GNUstepBase/config.h.in: * configure: * configure.ac: Use pkgconfig to find libxslt. 2021-07-29 Frederik Seiffert * Headers/GNUstepBase/config.h.in: * Source/Additions/Unicode.m: * Source/GSICUString.h: * Source/NSCalendar.m: * Source/NSDateFormatter.m: * Source/NSLocale.m: * Source/NSNumberFormatter.m: * Source/NSPredicate.m: * Source/NSRegularExpression.m: * Source/NSString.m: * Source/NSTimeZone.m: * configure: * configure.ac: Add support for using ICU DLL from Windows 10. 2021-07-29 Richard Frith-Macdonald * Source/NSTimeZone.m: * Headers/GNUstepBase/config.h.in: * configure.ac: * configure: Always use builtin header for parsing posix time zone files, so we know that the field names are consistent and so we knw we have a define for the file magic number. 2021-07-26 Richard Frith-Macdonald * Source/NSXMLParser.m: Fix error caused by having methods in category for strict parser overriding methods provided by sloppy parser. 2021-07-22 Richard Frith-Macdonald * Source/nstzfile.h: * Source/NSTimeZone.m: Changes to add support for 64bit transitions used by v2+ of the timezone format. 2021-07-14 Frederik Seiffert * Headers/Foundation/NSLock.h: * Headers/Foundation/NSThread.h: * Headers/GNUstepBase/GSConfig.h.in: * Headers/GNUstepBase/config.h.in: * Source/Additions/GCObject.m: * Source/Additions/GSObjCRuntime.m: * Source/Additions/Unicode.m: * Source/GSAtomic.h: * Source/GSFFCallInvocation.m: * Source/GSFFIInvocation.m: * Source/GSPThread.h: * Source/NSArray.m: * Source/NSCharacterSet.m: * Source/NSDebug.m: * Source/NSException.m: * Source/NSLock.m: * Source/NSObject.m: * Source/NSScanner.m: * Source/NSString.m: * Source/NSThread.m: * Source/NSTimeZone.m: * Source/NSZone.m: * Tests/base/NSThread/GNUmakefile.preamble: * Tests/base/NSThread/late_unregister.m: * Tests/base/NSThread/lazy_thread.m: * config/config.initialize.m: * configure: * configure.ac: Use native threading and locking APIs on Windows, removing dependency on pthread library and using fast Slim Reader/Writer (SRW) locks for NSLock/NSRecursiveLock/NSCondition/NSConditionLock as well as all internal locks. Adds GS_MUTEX_*() macros in GSPThread.h, that are being used for all internal locking instead of pthread APIs. Also adds support for thread priorities on Windows, fixes method signature of +[NSThread setThreadPriority:] to match Apple platforms, and adds error handling in same method. 2021-07-16 Frederik Seiffert * Source/GSICUString.h: * Source/GSICUString.m: Fix possible memory corruption in string handling that occured primarily when using NSRegularExpression with strings longer than 16 characters. 2021-07-02 Frederik Seiffert * Source/Additions/Unicode.m: Fix possible heap corruption when converting to NSNonLossyASCIIStringEncoding. 2021-06-19 Richard Frith-Macdonald * Headers/Foundation/Port.h: * Source/NSSocketPort.m: Extend the API for TLS support in Distributed Objects so that we have separate settings for whether the port is acting as a client or server. 2021-06-19 Richard Frith-Macdonald * Source/GSTLS.m: * Source/NSSocketPort.m: Improve reporting of TLS handshake errors, fix a few leaks and generally make encryption of DO connections better. 2021-06-17 Frederik Seiffert * Source/Additions/Unicode.m: Fix lookup of string encodings with high numeric values in encoding table when they are interpreted as negative numbers for some platforms/compilers (pertains NSUTF16*EndianStringEncoding and NSUTF32*StringEncoding). 2021-06-03 Richard Frith-Macdonald * Headers/GNUstepBase/GSTLS.h: New session ivar for I/O handle. * Source/GSTLS.m: Report the I/O handle in debug logs so we can more easily track which logs refer apply to the objects using a session. * Source/NSSocketPort.m: debug improvements plus fixes to the code for initiating connections so that the initial port information is reliably written to the handle. 2021-06-02 Gregory John Casamento * Headers/Foundation/Foundation.h: Add missing import for NSByteCountFormatter. 2021-05-31 Richard Frith-Macdonald * Headers/GNUstepBase/GSTLS.h: ([GSTLSCredentials selfSigned:]) * Source/GSTLS.m: Add new method to use certtool to generate a key and a self-signed certificate. Use the new method to set up server sessions if no certificate/key is configured. * Headers/Foundation/NSPort.h: ([NSSocketPost setOptionsForTLS:]) * Source/NSSocketPort.m: New methods to configure socket ports to use TLS so that inter-host distributed object connections can be securely encrypted. The class method should turn on encryption for all subsequent connections using socket ports (the instance method can be used to override the effects of the class method for an individual instance). 2021-05-23 Richard Frith-Macdonald * Source/GSStream.m: When we get an event saying that there is space available, we should change the stream status from writing to open (because the write operation completed). This makes the -hasSpaceAvailable method return the correct value when a callback routine is checking to see if it can write. 2021-05-19 Richard Frith-Macdonald * Source/win32/GSFileHandle.m: Fixed bug preventing write of long data (failing to watch for write completion when only part of the data is written). Added some debug 2021-05-15 Richard Frith-Macdonald * Source/GSFileHandle.m: * Source/win32/GSFileHandle.m: When we receive an event telling us the handle is writable, repeatedly write until either all the data we have is written or until the write attempt doesn't write anything. On mswindows this copes with the case of the gnutls write only writing 16KB chunks at a time. 2021-05-05 Richard Frith-Macdonald * configure.ac: Check for declaration of CURLOPT_MAXAGE_CONN * configure: regenerate * Headers/GNUstepBase/config.h.in: regenerate * Source/NSURLSession.m: Use HAVE_DECL_CURLOPT_MAXAGE_CONN to tell whether -setHTTPMaximumConnectionLifetime: can be implemented. This fixes a bug where the method was not implemented even though the version of Curl available supported it. * Tests/base/NSURLSession/test02.m: Add a testcase (hope) to see if -setHTTPMaximumConnectionLifetime: is supported. 2021-04-26 Ivan Vucica * ChangeLog: Update ChangeLog to release 1.28.0. 2021-04-23 Richard Frith-Macdonald * Source/DocMakefile: Ignore GS_EXPORT_CLASS when generating documentation for base/additions. 2021-04-22 Ivan Vucica * ChangeLog: Formatting and email address fixes. * ANNOUNCE: * NEWS: * Documentation/ReleaseNotes.gsdoc: * Documentation/news.texi: Update release notes for a future 1.28.0 release. * Version: Bump version to 1.28.0. 2021-04-14 Richard Frith-Macdonald * Headers/Foundation/NSString.h: * Source/NSString.m: * Source/NSString.m: Fixes for BOM insertion when generating data from a string using one of the unicode encodings. The BOM is inserted in the case where the byte order is important in the specified encoding, but the encoding does not specify which byte order is used. This is the case for NSUnicodeStringEncoding, NSUTF16StringEncoding (which is a synonym for NSUnicodeStringEncoding), and NSUTF32StringEncoding. The bit of this that might impact existing code is that the BOM is now placed at the start of the data even in the string is empty (as on OSX). 2021-03-27 Frederik Seiffert * Headers/GNUstepBase/GSVersionMacros.h: Add GS_IMPORT macro resolving to dllimport annonation on Windows. * Source/NSObject.m: Add support for libobjc2 runtime on Windows. 2021-03-27 Frederik Seiffert * Headers/Foundation/NSConnection.h: * Source/Additions/GSMime.m: * Source/Additions/NSDebug+GNUstepBase.m: * Source/Additions/NSStream+GNUstepBase.m: * Source/GSPrivate.h: * Source/GSTLS.m: * Source/NSArchiver.m: * Source/NSBundle.m: * Source/NSConcreteHashTable.m: * Source/NSConcreteMapTable.m: * Source/NSConnection.m: * Source/NSDate.m: * Source/NSDecimal.m: * Source/NSError.m: * Source/NSExtensionContext.m: * Source/NSExtensionItem.m: * Source/NSFileHandle.m: * Source/NSFileManager.m: * Source/NSHFSFileTypes.m: * Source/NSHTTPCookie.m: * Source/NSHTTPCookieStorage.m: * Source/NSInvocationOperation.m: * Source/NSItemProvider.m: * Source/NSKeyValueCoding.m: * Source/NSKeyValueObserving.m: * Source/NSKeyedArchiver.m: * Source/NSKeyedUnarchiver.m: * Source/NSLocale.m: * Source/NSMetadata.m: * Source/NSMetadataAttributes.m: * Source/NSNetServices.m: * Source/NSObjCRuntime.m: * Source/NSObject.m: * Source/NSPathUtilities.m: * Source/NSPersonNameComponentsFormatter.m: * Source/NSPort.m: * Source/NSSpellServer.m: * Source/NSTimeZone.m: * Source/NSURL.m: * Source/NSURLCredentialStorage.m: * Source/NSURLHandle.m: * Source/NSURLProtectionSpace.m: * Source/NSUserNotification.m: * Source/NSXMLParser.m: * Source/NSZone.m: * Source/externs.m: Export string constants and annotate exported function implementations. Moves scattered string constants to externs.m, and removes obsolete code replacing constant strings. 2021-03-12 Frederik Seiffert * Source/NSFileManager.m: * Source/NSProcessInfo.m: * Source/win32/dirent.h: Add NSFileManager support on Windows MSVC using dirent.h from: https://github.com/tronkko/dirent/blob/master/include/dirent.h Also unifies _CHAR in NSFileManager with GSNativeChar, as they are internally required to be the same. 2021-03-09 Frederik Seiffert * Source/NSRunLoop.m: Fix libdispatch integration compilation error on Windows. 2021-03-05 Richard Frith-Macdonald * Source/GSHTTPURLHandle.m: Rewrite handling of tls handshake to operate asynchronously, attempting continuation of the handshake when the socket becomes readable. The point of this is to prevent recursive entry into the runloop (and possible stack overflow) if the remote end fails to send anything for a while. 2021-03-03 Frederik Seiffert * Headers/Foundation/NSTimer.h: * Source/NSTimer.m: add unscheduled NSTimer block initializer 2021-02-22 Richard Frith-Macdonald * Source/Additions/GSXML.m: Fix potential deadlock found by Wolfgang 2021-02-18 Richard Frith-Macdonald * Source/Additions/GSXML.m: Initialise XMLParser in main thread 2021-02-13 Richard Frith-Macdonald * Source/GSHTTPURLHandle.m: * Source/GSTLS.m: * Source/NSFileHandle.m: Fixes for SSL/TLS support using GNUTLS under MinGW. Use send/recv rather than read/write in TLS push/pull functions (works with winsock and unix) and perform mappings between winsock error codes and unix/gnutls error codes so that we correctly repeat operations whe they fail in non-blocking mode. 2021-02-12 Frederik Seiffert * Headers/Foundation/NSNull.h: Add missing GS_EXPORT_CLASS. * Tests/base/Functions/NSByteSwapping.m: Define M_PI if needed. * configure: * configure.ac: Add support for pthreadVC2 library variant and tweak host OS check for Windows to be more specific. 2021-02-06 Richard Frith-Macdonald * Source/NSURLProtocol.m: Fix failure to send large requests, when the write operation succeeds but we have not written all the data we need to, we should write more as long as the stream has space available. 2021-02-05 Fred Kiefer * Tools/make_strings/StringsFile.m: Write the file in UTF8 format if the string contains any non ASCII character. 2021-02-03 Frederik Seiffert * Tools/GNUmakefile: disable gdomap on Android (unsupported). 2021-02-02 Riccardo Mottola * configure * configure.ac Add check for statbuf.st_mtim if available * Source/NSFileManager.m Use statbuf.st_mtim to get nanosecond precision in modification date, also fix conversion of nanoseconds in creation date. 2021-01-29 Frederik Seiffert * Headers/Foundation/NSAffineTransform.h: * Headers/Foundation/NSAppleEventDescriptor.h: * Headers/Foundation/NSAppleEventManager.h: * Headers/Foundation/NSAppleScript.h: * Headers/Foundation/NSArchiver.h: * Headers/Foundation/NSArray.h: * Headers/Foundation/NSAttributedString.h: * Headers/Foundation/NSAutoreleasePool.h: * Headers/Foundation/NSBackgroundActivityScheduler.h: * Headers/Foundation/NSBundle.h: * Headers/Foundation/NSByteCountFormatter.h: * Headers/Foundation/NSCache.h: * Headers/Foundation/NSCalendar.h: * Headers/Foundation/NSCalendarDate.h: * Headers/Foundation/NSCharacterSet.h: * Headers/Foundation/NSClassDescription.h: * Headers/Foundation/NSCoder.h: * Headers/Foundation/NSComparisonPredicate.h: * Headers/Foundation/NSCompoundPredicate.h: * Headers/Foundation/NSConnection.h: * Headers/Foundation/NSData.h: * Headers/Foundation/NSDate.h: * Headers/Foundation/NSDateComponentsFormatter.h: * Headers/Foundation/NSDateFormatter.h: * Headers/Foundation/NSDateInterval.h: * Headers/Foundation/NSDateIntervalFormatter.h: * Headers/Foundation/NSDictionary.h: * Headers/Foundation/NSDistantObject.h: * Headers/Foundation/NSDistributedLock.h: * Headers/Foundation/NSEnergyFormatter.h: * Headers/Foundation/NSEnumerator.h: * Headers/Foundation/NSError.h: * Headers/Foundation/NSException.h: * Headers/Foundation/NSExpression.h: * Headers/Foundation/NSExtensionContext.h: * Headers/Foundation/NSExtensionItem.h: * Headers/Foundation/NSFileCoordinator.h: * Headers/Foundation/NSFileHandle.h: * Headers/Foundation/NSFileManager.h: * Headers/Foundation/NSFileVersion.h: * Headers/Foundation/NSFileWrapper.h: * Headers/Foundation/NSGarbageCollector.h: * Headers/Foundation/NSHTTPCookie.h: * Headers/Foundation/NSHTTPCookieStorage.h: * Headers/Foundation/NSHashTable.h: * Headers/Foundation/NSHost.h: * Headers/Foundation/NSISO8601DateFormatter.h: * Headers/Foundation/NSInvocation.h: * Headers/Foundation/NSInvocationOperation.h: * Headers/Foundation/NSItemProvider.h: * Headers/Foundation/NSItemProviderReadingWriting.h: * Headers/Foundation/NSJSONSerialization.h: * Headers/Foundation/NSKeyedArchiver.h: * Headers/Foundation/NSLengthFormatter.h: * Headers/Foundation/NSLinguisticTagger.h: * Headers/Foundation/NSLocale.h: * Headers/Foundation/NSLock.h: * Headers/Foundation/NSMapTable.h: * Headers/Foundation/NSMassFormatter.h: * Headers/Foundation/NSMeasurement.h: * Headers/Foundation/NSMeasurementFormatter.h: * Headers/Foundation/NSMetadata.h: * Headers/Foundation/NSMethodSignature.h: * Headers/Foundation/NSNetServices.h: * Headers/Foundation/NSNotification.h: * Headers/Foundation/NSNotificationQueue.h: * Headers/Foundation/NSNumberFormatter.h: * Headers/Foundation/NSObjCRuntime.h: * Headers/Foundation/NSObject.h: * Headers/Foundation/NSObjectScripting.h: * Headers/Foundation/NSOperation.h: * Headers/Foundation/NSOrderedSet.h: * Headers/Foundation/NSOrthography.h: * Headers/Foundation/NSPersonNameComponents.h: * Headers/Foundation/NSPersonNameComponentsFormatter.h: * Headers/Foundation/NSPointerArray.h: * Headers/Foundation/NSPointerFunctions.h: * Headers/Foundation/NSPort.h: * Headers/Foundation/NSPortCoder.h: * Headers/Foundation/NSPortNameServer.h: * Headers/Foundation/NSPredicate.h: * Headers/Foundation/NSProcessInfo.h: * Headers/Foundation/NSProgress.h: * Headers/Foundation/NSPropertyList.h: * Headers/Foundation/NSProtocolChecker.h: * Headers/Foundation/NSProxy.h: * Headers/Foundation/NSRegularExpression.h: * Headers/Foundation/NSRunLoop.h: * Headers/Foundation/NSScanner.h: * Headers/Foundation/NSScriptClassDescription.h: * Headers/Foundation/NSScriptCoercionHandler.h: * Headers/Foundation/NSScriptCommand.h: * Headers/Foundation/NSScriptCommandDescription.h: * Headers/Foundation/NSScriptExecutionContext.h: * Headers/Foundation/NSScriptKeyValueCoding.h: * Headers/Foundation/NSScriptObjectSpecifiers.h: * Headers/Foundation/NSScriptStandardSuiteCommands.h: * Headers/Foundation/NSScriptSuiteRegistry.h: * Headers/Foundation/NSSerialization.h: * Headers/Foundation/NSSet.h: * Headers/Foundation/NSSortDescriptor.h: * Headers/Foundation/NSSpellServer.h: * Headers/Foundation/NSStream.h: * Headers/Foundation/NSString.h: * Headers/Foundation/NSTask.h: * Headers/Foundation/NSTextCheckingResult.h: * Headers/Foundation/NSThread.h: * Headers/Foundation/NSTimeZone.h: * Headers/Foundation/NSTimer.h: * Headers/Foundation/NSURL.h: * Headers/Foundation/NSURLAuthenticationChallenge.h: * Headers/Foundation/NSURLCache.h: * Headers/Foundation/NSURLConnection.h: * Headers/Foundation/NSURLCredential.h: * Headers/Foundation/NSURLCredentialStorage.h: * Headers/Foundation/NSURLDownload.h: * Headers/Foundation/NSURLHandle.h: * Headers/Foundation/NSURLProtectionSpace.h: * Headers/Foundation/NSURLProtocol.h: * Headers/Foundation/NSURLRequest.h: * Headers/Foundation/NSURLResponse.h: * Headers/Foundation/NSURLSession.h: * Headers/Foundation/NSUUID.h: * Headers/Foundation/NSUbiquitousKeyValueStore.h: * Headers/Foundation/NSUndoManager.h: * Headers/Foundation/NSUnit.h: * Headers/Foundation/NSUserActivity.h: * Headers/Foundation/NSUserDefaults.h: * Headers/Foundation/NSUserNotification.h: * Headers/Foundation/NSUserScriptTask.h: * Headers/Foundation/NSValue.h: * Headers/Foundation/NSValueTransformer.h: * Headers/Foundation/NSXMLDTD.h: * Headers/Foundation/NSXMLDTDNode.h: * Headers/Foundation/NSXMLDocument.h: * Headers/Foundation/NSXMLElement.h: * Headers/Foundation/NSXMLNode.h: * Headers/Foundation/NSXMLParser.h: * Headers/Foundation/NSXPCConnection.h: * Headers/GNUstepBase/CXXException.h: * Headers/GNUstepBase/GCObject.h: * Headers/GNUstepBase/GSConfig.h.in: * Headers/GNUstepBase/GSMime.h: * Headers/GNUstepBase/GSTLS.h: * Headers/GNUstepBase/GSVersionMacros.h: * Headers/GNUstepBase/GSXML.h: * Headers/GNUstepBase/NSStream+GNUstepBase.h: * Source/Additions/GSXML.m: * Source/Additions/Makefile.preamble: * Source/CXXException.m: * Source/GNUmakefile: * Source/NSException.m: * Source/NSFileManager.m: * Source/NSPropertyList.m: * Source/NSSocketPort.m: * Source/ObjectiveC2/Makefile.preamble: * Source/common.h: * Source/externs.m: * Source/inet_ntop.m: * Source/inet_pton.m: * Source/libgnustep-base-entry.m: * Source/unix/Makefile.preamble: * Source/win32/GSFileHandle.m: * Source/win32/Makefile.preamble: * Tools/GNUmakefile: * Tools/Makefile.preamble: * Tools/gdnc.m: * Tools/make_strings/make_strings.m: * Tools/pl2link.m: * Tools/plutil.m: * config/config.initialize.m: * configure: * configure.ac: Added support for building on Windows with Clang MSVC target and libobjc2. This requires using a standard (non-MinGW) Clang build that e.g. comes with Visual Studio or is available as pre-built binary from the LLVM website, and requires passing a host to configure like --host=x86_64-pc-windows. The build is best done in an MSYS2 shell that does not have any additional *-devel packages installed that might get picked up by configure. Alternatively --disable-xxx flags can be used to prevent these dependencies to be picked up. Annotates all ObjC class interfaces with GS_EXPORT_CLASS for DLL export/import declarations, and adds missing GS_DECLARE annotations in externs.m, in order for these symbols to be correctly exported in the DLL. 2021-01-21 Fred Kiefer * Tools/pl2link.m (main): Set key StartupWMClass and allow file parameters of the Exec key. Idea by: Josh Freeman 2021-01-21 Richard Frith-Macdonald * Source/NSScanner.m: Fix scanning of zero values. Was checking incorrect variable to avoid assignment to nul pointer. 2021-01-19 Richard Frith-Macdonald * Source/NSKeyValueObserving.m: Fix leak of set * Source/NSPredicate.m: Fix leak evaluating a cast * Source/NSUnit.m: Fix memory leaks * Source/NSData.m: Use NSZoneMalloc and NSZoneRealloc for memory to ensure it is in the correct zone for the instance (and to avoid complaints from static analyser). 2021-01-16 Richard Frith-Macdonald * Source/GSSocketStream.m: Remove stream from handler upon deallocation, to avoid handler sending messages to deallocated stream. 2020-12-30 Richard Frith-Macdonald * Source/NSScanner.m: Fix failure to re-set flag to say whether a string is unicode 2020-12-30 Richard Frith-Macdonald * Source/NSScanner.m: Fix potential problem with new optimisation for direct access to contents of 8bit strings ... when the decimal separator is not an ascii character we may need to convert the 8bit value to unicode. 2020-12-30 Richard Frith-Macdonald * Source/NSScanner.m: * Source/NSString.m: Use new private method to scan double values. 2020-12-30 Richard Frith-Macdonald * Source/NSScanner.m: Remove internal GSScanInt and GSScanDouble functions after moving functionality into the -scanDouble: method. Add private class method to support scanning a string for a double without having to create a new scanner each time (use a shared lock-protected, instance with resetting of the string being scanned). 2020-12-30 Richard Frith-Macdonald * Source/NSPropertyList.m: Remove unused header import 2020-12-30 Richard Frith-Macdonald * Source/GSString.m: Use superclass implementation of -doubleValue and -floatValue 2020-12-29 Richard Frith-Macdonald * Source/NSScanner.m: Change -scanDouble: to call GSScanDouble() to perform conversion. Fix GSScanDouble to cope with leading zeros. 2020-12-15 Frederik Seiffert * configure: * configure.ac: Disable libcurl support when headers are not found 2020-12-15 Richard Frith-Macdonald * Headers/GNUstepBase/GNUstep.h: * Headers/GNUstepBase/GSBlocks.h: * Headers/ObjectiveC2/objc/blocks_runtime.h: * Source/GSString.m: * Source/NSConcreteHashTable.m: * Source/NSConcreteMapTable.m: * Source/NSConnection.m: * Source/NSDistantObject.m: * Source/NSMethodSignature.m: * Source/NSNumberMethods.h: * Tools/gdomap.c: Consistently use __typeof__() rather than typeof() or __typeof() for compatibility (GCC and clang and, perhaps, other future compilers) irrespective of -std= compilation options. 2020-12-15 Richard Frith-Macdonald * Tests/base/NSUUID/basic.m: Fix stupid mistake using wrong string value 2020-12-15 Richard Frith-Macdonald * Source/NSUUID.m: * Tests/base/NSUUID/basic.m: Fix initialisation of NSUUID from string (permit mixed case hex digits) 2020-12-11 Richard Frith-Macdonald * Source/GSStream.m: Fixup incorrect commit 2020-12-11 Richard Frith-Macdonald * Source/GSStream.h: * Source/GSStream.m: Improve diagnostic logging 2020-12-09 Richard Frith-Macdonald * Tools/gdomap.c: Use correct definition for integer type in windows 2020-12-09 Richard Frith-Macdonald * Source/NSFileManager.m: Fix unused variable on windows 2020-12-09 Richard Frith-Macdonald * Source/NSUserDefaults.m: Add fake interface for NSUserDefaultsWin32 to avoid compiler warning 2020-12-09 Richard Frith-Macdonald * Source/NSPathUtilities.m: Only declare variables for systems which use them. 2020-12-07 Richard Frith-Macdonald * Source/NSUUID.m: Fix typo in comment (incorrect RFC number) 2020-12-07 Richard Frith-Macdonald * Source/NSFileCoordinator.m: * Source/NSItemProvider.m: * Source/NSSortDescriptor.m: * Source/NSTimer.m: Avoid compiler warnings when we do not have real blocks 2020-12-07 Richard Frith-Macdonald * Headers/GNUstepBase/GNUstep.h: Use casts to prevent many compiler warnings when using pseudo-blocks 2020-12-07 Richard Frith-Macdonald * Source/NSBackgroundActivityScheduler.m: Fixup to import local headers rather than installed versions 2020-12-07 Richard Frith-Macdonald * Source/NSOperation.m: Avoid compiler warnings on system with pseudo-blocks 2020-12-07 Richard Frith-Macdonald * Source/GSSocketStream.m: Fix format string error in -description 2020-12-07 Richard Frith-Macdonald * Source/GSSocketStream.m: * Source/GSStream.m: Improve diagnostic output 2020-12-06 Richard Frith-Macdonald * Source/GSSocketStream.m: An error in a socketpair only applies to the other socket if still opening 2020-12-04 Richard Frith-Macdonald * Source/GSOrderedSet.m: Use unsigned long for fast enumeration version counter 2020-12-04 Richard Frith-Macdonald * Source/GSCountedSet.m: fix typo 2020-12-04 Richard Frith-Macdonald * Source/Additions/GSInsensitiveDictionary.m: * Source/GSCountedSet.m: * Source/GSDictionary.m: * Source/GSSet.m: * Source/NSConcreteHashTable.m: * Source/NSConcreteMapTable.m: * Source/NSUnarchiver.m: Fix to make value pointed to by mutationsPtr be unsigned long. 2020-12-04 Richard Frith-Macdonald * Source/NSPortCoder.m: Fix range check for decoded 32bit integer 2020-12-04 Richard Frith-Macdonald * Source/NSRunLoop.m: Suppress warnings about use of 'private' functions from libdispatch 2020-12-04 Richard Frith-Macdonald * Source/ObjectiveC2/blocks_runtime.m: Declare external block as const void rather than void for consistency and to avoid compiler warning 2020-12-04 Richard Frith-Macdonald * Source/GSFastEnumeration.h: Suppress dll import warnings for objc_enumerationMutation() on mingw 2020-12-03 Richard Frith-Macdonald * Source/GSValue.m: * Source/NSBackgroundActivityScheduler.m: Avoid compiler warning 2020-12-03 Richard Frith-Macdonald * Source/Additions/Unicode.m: * Source/NSData.m: * Source/NSUUID.m: Use memcpy rather than strncpy/strncat to avoid compiler warnings 2020-12-03 Richard Frith-Macdonald * Tools/NSPropertyList+PLUtil.m: Import missing NSError header 2020-12-03 Richard Frith-Macdonald * Source/NSKeyValueCoding.m: Use memcpy rather than strncpy to avoid compiler warnings 2020-12-03 Richard Frith-Macdonald * Source/NSData.m: Tweaks to avoid compiler warnings 2020-12-03 Richard Frith-Macdonald * Tests/base/NSJSONSerialization/tests00.m: Create temporary file in current directory and delete it when done. This fixes testcase to work on windows. 2020-11-27 Frederik Seiffert * configure: * configure.ac: Detect objc.lib and add libdir to path on Windows. 2020-11-27 Frederik Seiffert * configure: * configure.ac: Prefer dispatch/dispatch.h over dispatch.h. 2020-11-29 Richard Frith-Macdonald * .travis.yml: * Headers/Foundation/NSDebug.h: * Headers/Foundation/NSURLCache.h: * Headers/Foundation/NSURLError.h: * Headers/Foundation/NSURLProtocol.h: * Headers/Foundation/NSURLRequest.h: * Headers/Foundation/NSURLSession.h: * Headers/GNUstepBase/GSConfig.h.in: * Headers/GNUstepBase/config.h.in: * Source/Additions/GSObjCRuntime.m: * Source/Additions/Makefile.preamble: * Source/GNUmakefile: * Source/GSEasyHandle.h: * Source/GSEasyHandle.m: * Source/GSHTTPURLHandle.m: * Source/GSHTTPURLProtocol.h: * Source/GSHTTPURLProtocol.m: * Source/GSMultiHandle.h: * Source/GSMultiHandle.m: * Source/GSNativeProtocol.h: * Source/GSNativeProtocol.m: * Source/GSTLS.m: * Source/GSTaskRegistry.h: * Source/GSTaskRegistry.m: * Source/GSTimeoutSource.h: * Source/GSTimeoutSource.m: * Source/GSTransferState.h: * Source/GSTransferState.m: * Source/GSURLPrivate.h: * Source/GSURLSessionTaskBody.h: * Source/GSURLSessionTaskBody.m: * Source/GSURLSessionTaskBodySource.h: * Source/GSURLSessionTaskBodySource.m: * Source/NSConcretePointerFunctions.m: * Source/NSException.m: * Source/NSMessagePort.m: * Source/NSSocketPort.m: * Source/NSURLCache.m: * Source/NSURLConnection.m: * Source/NSURLProtocol.m: * Source/NSURLRequest.m: * Source/NSURLResponse.m: * Source/NSURLSession.m: * Source/NSXPCConnection.m: * Tests/base/NSURL/Helpers/keepalive.m: * Tests/base/NSURL/test00.m: * Tests/base/NSURLConnection/Helpers/NSURLConnectionTest.h: * Tests/base/NSURLConnection/Helpers/NSURLConnectionTest.m: * Tests/base/NSURLConnection/Helpers/TestCase.m: * Tests/base/NSURLConnection/Helpers/TestWebServer.h: * Tests/base/NSURLConnection/Helpers/TestWebServer.m: * Tests/base/NSURLConnection/Helpers/testTestWebServer.m: * Tests/base/NSURLConnection/test01.m: * Tests/base/NSURLConnection/test02.m: * Tests/base/NSURLConnection/test03.m: * Tests/base/NSURLConnection/test04.m: * Tests/base/NSURLConnection/test05.m: * Tests/base/NSURLConnection/test06.m: * Tests/base/NSURLConnection/test07.m: * Tests/base/NSURLSession/GNUmakefile.preamble: * Tests/base/NSURLSession/TestInfo: * Tests/base/NSURLSession/delegate.g: * Tests/base/NSURLSession/gdbinit: * Tests/base/NSURLSession/test01.m: * Tests/base/NSURLSession/test02.m: * base.make.in: * config.mak.in: * config/addlibrarypath.m4: * configure: * configure.ac: Merge changes for NSURLSession from EngageHub (formerly Brainstorm). NB. NSURLSession is the third generation URL management API in OSX, but the previous two generations still exist and are good for much web-based programming. The NSURLSession code has more deependencies on recent versions of external libraries (libcurl, http/2 support, libdispatch) as well as the latest objective-c runtime and the use of blocks (only available when built using clang and the ng runtime). 2020-11-28 Richard Frith-Macdonald * configure: * configure.ac: Remove obsolete checks for garbage collecting runtime (no longer supported) 2020-11-22 Richard Frith-Macdonald * Source/Additions/NSMutableString+GNUstepBase.m: * Source/GSString.m: Add optimisation for the use of GSImmutableString so that it can make use of the layout of the underlying mutable string that the GSImmutableString is a proxy for. 2020-11-22 Richard Frith-Macdonald * Source/GSString.m: Rewrite -replaceCharactersInRange:withString: to cope with the case where the string argument is the receiver (or some proxy to the receiver etc). 2020-11-22 Richard Frith-Macdonald * Source/Additions/NSMutableString+GNUstepBase.m: Report YES for GSImmutableString being a proxy 2020-11-21 Richard Frith-Macdonald * Source/GSString.m: Fix for text storage objects setting their content to their own immutable proxy. 2020-11-20 Richard Frith-Macdonald * Source/Additions/GSMime.m: Add casts to avoid compiler warnings 2020-11-19 Richard Frith-Macdonald * Source/NSString.m: Minor tidyup for clearer indentation 2020-11-19 Richard Frith-Macdonald * Source/Additions/Unicode.m: Correct checks for validity of the second UTF16 value in a surrogate pair 2020-11-18 Richard Frith-Macdonald * Headers/Foundation/NSFileHandle.h: Declare NSURL before using it. 2020-11-18 Richard Frith-Macdonald * Source/NSDictionary.m: Be defensive about checking for key beginning with @ 2020-11-17 Frederik Seiffert * Headers/Foundation/NSFileHandle.h: * MISSING: * Source/NSFileHandle.m: Add NSFileHandle URL initializers. Also use "instancetype" for all initializers. 2020-11-14 Richard Frith-Macdonald * Headers/GNUstepBase/GSMime.h: * Source/Additions/GSMime.m: Add methods to control size of in-memory queue os emails 2020-11-13 Richard Frith-Macdonald * Source/NSData.m: Fix bug in offset 2020-06-11 Frederik Seiffert * .travis.yml: Output config.log if build fails on CI. 2020-11-13 Richard Frith-Macdonald * Tests/base/NSOperation/threads.m: Allow more time for operations thread to exit on slow machines 2020-11-12 Frederik Seiffert * Source/GSICUString.h: Fix compilation with ICU 68. 2020-11-12 Richard Frith-Macdonald * Tools/plutil.m: Allow synonyms for help and print same message as OSX for unrecognised options. 2020-11-12 Richard Frith-Macdonald * Tools/plutil.m: Fix missing semicolon 2020-11-11 Richard Frith-Macdonald * Source/GSString.m: Avoid building unused functions when new string API is used. 2020-11-07 Richard Frith-Macdonald * Tools/NSPropertyList+PLUtil.h: * Tools/NSPropertyList+PLUtil.m: Trivial format fixes 2020-11-07 Richard Frith-Macdonald * Tools/NSPropertyList+PLUtil.m: * Tools/plutil.m: Fix a check for a null pointer and add various whitespace/indentation tidyups. 2020-11-07 Mingye Wang * Tools/plutil.1: * Tools/plutil.m: plutil: Some documentation 2020-11-06 Richard Frith-Macdonald * Tools/plutil.m: Fixups for format and compilation 2020-10-29 Richard Frith-Macdonald * Source/NSNotificationCenter.m: Improve logging of an exception when posting a notification so that, if possible, we include the details of the notification being posted. 2020-10-27 Gregory John Casamento * Headers/Foundation/NSRunLoop.h: * Source/NSRunLoop.m: fix for compilation error 2020-10-27 Gregory John Casamento * Headers/Foundation/NSURLConnection.h: Add guards for API version 2020-10-26 Gregory John Casamento * Headers/Foundation/NSRunLoop.h: * Headers/Foundation/NSURLConnection.h: * Source/NSRunLoop.m: * Source/NSURLConnection.m: Add methods for 10.5 2020-10-24 Richard Frith-Macdonald * Source/NSDebug.m: Fix use of potentially invalid value from heap 2020-10-13 Richard Frith-Macdonald * Headers/GNUstepBase/GNUstep.h: Change the behavior of ENTER_POOL/LEAVE_POOL so that it no longer wraps the enclosed section of code in a loop (this was causing errors when people used the macros inside loops which contained pre-existing break/continue/return statements). You should not break, continue, or return from such a block of code (to do so could leak an autorelease pool and give objects a longer lifetime than they ought to have. If you wish to leave the block of code early, you should ensure that doing so causes the autorelease pool outside the block to be released promptly (since that will implicitly release the pool created at the start of the block too). 2020-10-12 Adam Fox * Headers/Foundation/NSData.h: * Source/NSData.m: * Tests/base/NSData/search.m: Implementation of [NSData rangeOfData:options:range], adapted from [NSString rangeOfString:options:range]. 2020-10-12 Richard Frith-Macdonald * Tools/AGSHtml.m: Remove break whose use depends on ENTER_POOL/LEAVE_POOL behavior 2020-10-11 Richard Frith-Macdonald * Source/NSOperation.m: Fix retain/release error 2020-10-03 Richard Frith-Macdonald * Source/NSTask.m: Improve comments 2020-09-30 Richard Frith-Macdonald * Source/NSOperation.m: Remove unnecessary retain/release 2020-09-30 Richard Frith-Macdonald * Source/NSOperation.m: Added autorelease pool around each operation to catch any autoreleased objects produced by the operation being executed. This should prevent objects living until the end of the thread. 2020-09-30 Richard Frith-Macdonald * Source/NSInvocationOperation.m: Tidied indentation in code 2020-09-30 Richard Frith-Macdonald * Headers/Foundation/NSOperation.h: whitespace tidyups 2020-09-23 Mingye Wang : * Tools/NSPropertyList+PLUtil.m: * Tools/plutil.m: plutil: Add plutil utility. 2020-09-23 Richard Frith-Macdonald * Tests/base/NSDictionary/general.m: Add test for array as key 2020-09-21 Richard Frith-Macdonald * Source/NSFileManager.m: Tidied some whitespace/indentation and removed obsolete comment 2020-09-18 Riccardo Mottola * .travis.yml: fix typo 2020-09-17 Riccardo Mottola * Source/NSObject.m: Windows linker doesn't really support WEAK symbols, not even with gcc10. binutils 2.3.5 fails to link because not all symbols were exported 2020-09-17 Riccardo Mottola * .travis.yml: Use new option to disable unwind options in Travis build, patch by Frederik Seiffert 2020-09-08 Richard Frith-Macdonald * Source/Additions/GSInsensitiveDictionary.m: * Source/GSDictionary.m: Implement fast enumeration for insensitive dictionary 2020-09-05 Fred Kiefer * Source/NSPersonNameComponentsFormatter.m: Add missing break 2020-08-23 Richard Frith-Macdonald * Tools/gdomap.c: Avoid coverity warning by using memmove rather than strcpy 2020-08-23 Richard Frith-Macdonald * Source/Additions/NSData+GNUstepBase.m: * Source/Additions/GSXML.m: Avoid coverity warning 2020-08-30 Fred Kiefer * Source/NSDateComponentsFormatter.m: Fix use of wrong operator. 2020-08-08 Richard Frith-Macdonald * Source/Additions/GSMime.m: Improve -contentFile to check the content-type header before content-disposition 2020-08-03 Frederik Seiffert * Headers/Foundation/NSURL.h: * MISSING: * Source/NSURL.m: Add NSURL methods: 2020-08-02 Gregory John Casamento * Headers/Foundation/NSNotification.h: Add NSNotificationName typedef 2020-08-02 Gregory John Casamento * Headers/Foundation/NSAttributedString.h: Add NSAttributedStringKey typedef 2020-07-31 Richard Frith-Macdonald * Source/NSFileManager.m: Fix calls to utimensat() which were passing the wrong value for the first argument, which needs to be the file descriptor of the directory containing the file, or AT_FDCWD to use the current directory. 2020-07-31 Richard Frith-Macdonald * Source/NSFileManager.m: Set dates on copy ... it turns our OSX does not behave like Posix 2020-07-31 Richard Frith-Macdonald * Tests/base/NSFileManager/general.m: Add checks for rewriting a file 2020-07-31 Richard Frith-Macdonald Add check for timestamp behavior when writing via NSData method * Tests/base/NSFileManager/general.m: 2020-07-31 Richard Frith-Macdonald * Tests/base/NSFileManager/general.m: Add delay to be clear file date is in past before we copy it 2020-07-30 Richard Frith-Macdonald * Tests/base/NSFileManager/general.m: OSX, unlike Posix, sets the modification and creation dates of a copy to be the same as the original (within floating point limits). 2020-07-29 Richard Frith-Macdonald * Tests/base/NSFileManager/general.m: Add test that creation/modification dates of copy differ from original 2020-07-28 Riccardo Mottola * Headers/GNUstepBase/config.h.in: * Source/NSException.m: * configure: * configure.ac: Explicitely allow disabling unwind, test for header and function too 2020-07-13 Frederik Seiffert * Headers/Foundation/NSURLRequest.h: * Source/NSURLRequest.m: Update NSURLRequest header to use "instancetype". 2020-07-09 Richard Frith-Macdonald * Source/NSObject.m: Move deallocation of zombie map outside lock protected section so that any exception while deallocating will not cause unbalanced lock/unlock 2020-07-09 Richard Frith-Macdonald * Source/NSFileManager.m: When copying objects we should not be attempting to set the creation/modification date of the copy to that of the original. 2020-07-09 Richard Frith-Macdonald * Source/NSLog.m: Add casts to prevent compiler warnings, and comment to explain the new change for android where there is no thread ID available from the operating system. 2020-07-08 Frederik Seiffert * Source/NSLog.m: Don't log current thread if its identical to private thread ID. This makes the log more succinct when GSLogThread is enabled and the system doesn't provide an OS-level thread ID (i.e. GSPrivateThreadID() returns GSCurrentThread()), which would previously cause the NSThread pointer to be logged twice. 2020-07-08 Frederik Seiffert * Source/NSLog.m: * Source/NSProcessInfo.m: Improve NSLog output on Android. We now always set -GSLogSyslog, as stdout/stderr is not available on Android. Also fixes log output containing extraneous date/time. 2020-07-07 Richard Frith-Macdonald * Source/NSData.m: We only need to set the ownership of a newly created file on unix-like systems where the effective user ID may be different from the real user ID. 2020-07-06 Frederik Seiffert * Source/NSThread.m: Fix possible deadlock when becoming multi-threaded. 2020-06-27 Richard Frith-Macdonald * Source/NSString.m: Replace temporary hack with a rewrite of whitespace checking to use our own characterset data (derived from unicode data) on which characters are counted as whitespace for the purpose of capitalising strings. 2020-06-25 Richard Frith-Macdonald * Source/NSData.m: When overwriting a file, do not attempt to set creation date. When creating a file, try to use the real uid when effective uid is that of root. 2020-06-24 Richard Frith-Macdonald * Source/NSString.m: Simple fix to check for whitespace characters using strchr since the old mechanism using characterset bitmap representations was broken by the change to reduce waste in bitmaps (the code assumed the bitmap was bigger than it really is). 2020-06-24 Richard Frith-Macdonald * Tests/base/NSString/NSString_tests.h: Add a few tests for capitalisation 2020-06-23 Richard Frith-Macdonald * Source/GSString.m: * Source/NSString.m: Check for nil arugment to -isEqualToString: 2020-06-23 Richard Frith-Macdonald * Tests/base/NSString/basic.m: an empty string is not equal to nil 2020-06-19 Riccardo Mottola * Source/inet_ntop.m: * Source/inet_pton.m: define WSAAPI to empty if it is undefined, just for safety 2020-06-15 Riccardo Mottola * Source/GSSocketStream.m: * Source/NSHost.m: * Source/inet_ntop.m: * Source/inet_pton.m: specify WSAAPI as return type too, needed for MSYS2-32bit 2020-06-12 Richard Frith-Macdonald * Tests/base/GSTLS/basic.m: Fix by Yavor Doganiv ... disable certificate expiry test except on 64bit systems, because old 32bit systems can't cope with the test certificate end date. 2020-06-11 Frederik Seiffert * Source/NSValueTransformer.m: Fix recursive creation of value transformers. 2020-06-11 Frederik Seiffert * Tests/base/NSValueTransformer/TestInfo: * Tests/base/NSValueTransformer/basic.m: Add tests for NSValueTransformer. 2020-06-10 Frederik Seiffert * Source/NSBundle.m: Fix Android assets support for bundle directories 2020-06-09 Riccardo Mottola * Headers/GNUstepBase/config.h.in: * Source/GSSocketStream.m: * Source/NSHost.m: * configure: * configure.ac: Explicitely test for ws2tcpip.h header, fix library detection on windows for inet_ntop with corrent library, guard includes and definitions with configure results, cleanup header inclusion 2020-06-09 Riccardo Mottola * Tools/gdomap.c: Minor type cast to fix output for platforms where socket is unsigned 2020-06-09 Richard Frith-Macdonald * Source/NSData.m: Do not attempt to alter creation date of newly created file. 2020-06-03 Frederik Seiffert * configure: * configure.ac: Fix finding libiconv via cross.config. 2020-06-05 Richard Frith-Macdonald * Source/NSOperation.m: Fix leak of new operation in -blockOperationWithBlock: method. Make -addExecutionBlock: ensure it works with an on-heap copy of its argument. Tidy code to have NSBlockOperation methods with normal formatting and alphabetical order. Tidy code to use standard macros for memory management. 2020-06-05 Riccardo Mottola * Headers/GNUstepBase/GSConfig.h.in: MSYS and MSYS2 differ in the tricks to include both windows.h and winsock2.h, use __MINGW32_VERSION to differentiate them 2020-06-05 Riccardo Mottola * Source/win32/GSFileHandle.m: Remove unneeded window headers include, since common.h will include GSConfig.h 2020-06-05 Frederik Seiffert * Source/NSConcreteMapTable.m: Fix replacing an existing value in a weak objects map table. 2020-06-05 Frederik Seiffert * Tests/base/NSMapTable/weakObjects.m: Test replacing a weak value in NSMapTable. 2020-06-03 Richard Frith-Macdonald * Source/NSUserDefaults.m: Change -objectForKey: method to get the contents into a buffer (on the stack) and iterate through them rather than creating an autoreleased enumerator. This avoids allocation/autorelease/deallocation of the enumerator (as well as retain/release of the search list by the enumerator) which should give better performance generally and avoid excess object creation when lots of defaults lookups are done in an autorelease pool. 2020-05-29 Richard Frith-Macdonald * Source/NSThread.m: Wrap code for posting of notifications (for becoming multithreaded and for a thread being about to exit) in an autorelease pool. This should avoid possible leakage of objects and warnings during the notification process. 2020-05-29 Richard Frith-Macdonald * Tests/base/NSThread/late_unregister.m: tidy whitespace 2020-05-23 Frederik Seiffert * ChangeLog: * Headers/GNUstepBase/GSConfig.h.in: * Source/GSNetwork.h: * Source/win32/GSFileHandle.m: * config/config.reuseaddr.c: Include winsock2.h before windows.h, as required by MSYS2/MinGW-w64. 2020-05-23 Frederik Seiffert * Headers/Foundation/NSException.h: Fix warning "setjmp" redefined on Windows. 2020-05-15 Frederik Seiffert * .travis.yml: * travis-deps.sh: Set up CI for Windows using MSYS2/MinGW-w64 and GCC. 2020-05-27 Frederik Seiffert * Headers/Foundation/NSFilePresenter.h: Fix optional NSFilePresenter methods not being declared as optional. 2020-05-26 Richard Frith-Macdonald * Source/NSThread.m: On thread exit we must post the notification that it *will* exit before setting the instance variable to say that it has finished. This is tested as the order OSX does it, and makes sense to ensure that, when -isFinished returns YES we can be sure the thread will not do anything else. 2020-05-26 Richard Frith-Macdonald * Tests/base/NSThread/late_unregister.m: Add tests for exactly when notification of thread exit occurs 2020-05-26 Frederik Seiffert * Tests/base/NSUserDefaults/general.m: Extended general tests for NSUserDefaults. 2020-05-26 Richard Frith-Macdonald * Source/NSPortCoder.m: * Source/NSUnarchiver.m: Remove excess whitespace and copy trick to NSPortCoder 2020-05-25 Riccardo Mottola * Source/NSUnarchiver.m: Rewrite lower negative bounds to avoid integer constants underflow of literals 2020-05-25 Frederik Seiffert * Source/NSUserDefaults.m: Store NSNumber instead of NSString for NSUserDefaults -setBool:forKey:. 2020-05-19 Frederik Seiffert * Source/NSBundle.m: * Source/NSFileManager.m: Android assets improvements to support directories 2020-05-15 Gregory John Casamento * Headers/Foundation/NSKeyedArchiver.h: * Source/NSKeyedUnarchiver.m: Add set/get for requiresSecureCoding 2020-05-14 Frederik Seiffert * Headers/Foundation/NSException.h: Fix BASE_NATIVE_OBJC_EXCEPTIONS check with OBJC_ZEROCOST_EXCEPTIONS. 2020-05-13 Frederik Seiffert * Source/win32/GSFileHandle.m: * Source/win32/NSMessagePort.m: Fix building Win32 classes with nonfragile ABI. 2020-05-13 Gregory John Casamento * Headers/Foundation/NSKeyedArchiver.h: * Source/NSKeyedArchiver.m: Add set/get method for requiresSecureCoding 2020-05-12 Gregory John Casamento * Headers/Foundation/NSKeyedArchiver.h: * Source/NSKeyedArchiver.m: Fix fred's suggestions. Put guard and make more general method the one which is called. 2020-05-12 Richard Frith-Macdonald * Source/NSCalendar.m: Casts to fix systems where the UCalendarDateFields enumeration is unsigned. 2020-05-11 Gregory John Casamento * Source/NSKeyedArchiver.m: Send error back 2020-05-11 niwatako <1546218+niwatako@users.noreply.github.com> * Source/NSJSONSerialization.m: Fix exponent validation 2020-05-10 Fred Kiefer * Source/NSISO8601DateFormatter.m: * Source/NSOrthography.m: Clean up some compiler warnings. 2020-05-09 Fred Kiefer * Tests/base/NSLocale/general.m: Mark more tests that depend on locale setting as hopes. * Tests/base/NSURL/basic.m: Use PASS_EQUAL in the downlaod test to get the actual http status reported. * Tests/base/NSXMLParser/parse.m: Mark stream test as hopeful as this isn't implemented at the moment. 2020-05-08 Fred Kiefer * Source/NSXMLParser.m: Fix small bug in last commit that broke all gui applications when there was a commented out section in the user default XML file. 2020-05-08 Richard Frith-Macdonald * Source/NSXMLParser.m: Use RELEASE macro for memory management 2020-05-08 Richard Frith-Macdonald * Source/NSXMLParser.m: Convert to using indexes into a buffer 2020-05-07 Frederik Seiffert * Headers/Foundation/NSLocale.h: * Source/NSLocale.m: NSLocale improvements 2020-05-06 Richard Frith-Macdonald * Source/NSXMLParser.m: Reorganise to make the separation of the two parsers clearer. NSXMLParser is the sloppy parser and can be selected using the dummy subclass GSSloppyXMLParser while, if we have libxml2, we can specifically select the strict parser using the GSStrictXMLParser class. 2020-05-06 Richard Frith-Macdonald * Tests/base/NSXMLParser/basic.m: * Tests/base/NSXMLParser/parse.m: Update testcases to cover both parsers 2020-05-05 Frederik Seiffert * Headers/Foundation/NSXMLParser.h: * Headers/GNUstepBase/GSXML.h: * MISSING: * Source/Additions/GSXML.m: * Source/NSXMLParser.m: * Tests/base/NSXMLParser/parse.m: Implement -[NSXMLParser initWithStream:]. 2020-05-05 Frederik Seiffert * Source/unix/NSStream.m: Add NSInputStream support for reading Android assets from main bundle. 2020-05-05 Richard Frith-Macdonald * Source/NSCharacterSet.m: * Tests/base/NSCharacterSet/general.m: Fix -[NSCharacterSet invertedSet] to work by calling -invert on a mutable copy 2020-05-04 Riccardo Mottola * Source/NSFileManager.m: In changeFileAttributes implement setting of creation date also for Unix, which needs to be done before setting the modification date. Also, implement reading the creation (birth time) date if a supported method was detected. 2020-05-04 alotorev * Source/NSURL.m: * Tests/base/NSURL/basic.m: Improvements suggested by Fred Kiefer for the current pull request 2020-05-04 alotorev * Source/NSURL.m: OSX like behaviour for NSURLQueryItem initialisers Fixed bugs leading to leaks, no autorelease in NSURLComponents factory methods. 2020-05-04 alotorev * Source/NSURL.m: Fixed initialization NSURLComponents with NSURL, should treat a query from NSURL as a percent-encoded string. 2020-05-04 alotorev * Tests/base/NSURL/basic.m: * Tests/base/NSURL/components.m: Added tests to highlight some problems of the current implementation of NSURLQueryItems and NSURLComponent. The tests passed on OSX. 2020-05-01 niwatako <1546218+niwatako@users.noreply.github.com> * Source/NSJSONSerialization.m: Fix loss of buffer in NSJSONSerialization. 2020-05-01 Riccardo Mottola * Source/NSFileManager.m: fix log info 2020-05-01 Riccardo Mottola * ChangeLog: * Headers/GNUstepBase/config.h.in: * Source/NSFileManager.m: * configure: * configure.ac: Use utimensat() to set file modification date, if available. 2020-04-30 Artem Lotorev * .gitignore: * Tests/GNUmakefile: Added param to run a test on a separate object or test file. Added .DS_Store to .gitignore 2020-04-28 Artem Lotorev * Tests/base/NSString/test09.m: Fixed build issue due to wrong argument in the macro 2020-04-28 Artem Lotorev * Tests/base/NSString/test09.m: Added helper method for percent decoding/encoding tests 2020-04-27 Richard Frith-Macdonald * Source/NSString.m: Fixup -stringByAddingPercentEncodingWithAllowedCharacters: to ignore membership of the supplied set if the character is not in the ASCII range. 2020-04-27 Artem Lotorev * Tests/base/NSString/test09.m: Added test for [NSString stringByRemovingPercentEncoding], updated percent-encoding tests with PASS_EQUAL 2020-04-27 Richard Frith-Macdonald * Source/NSString.m: Fix typo spotted by 'alotrev' 2020-04-26 Fred Kiefer * Source/NSLocale.m: Respect NSLocaleCalendarIdentifier if NSLocaleCalendar isn't set. * Headers/Foundation/NSCalendar.h, * Source/NSCalendar.m: Add newer features for NSDateComponents and started to clean up NSCalendar implementation. * Tests/base/NSCalendar/features-10-7.m: Add test for different time zone. 2020-04-25 Fred Kiefer * Headers/Foundation/NSCalendar.h: * Source/NSCalendar.m: Add missing NSDateComponents methods. 2020-04-24 Gregory John Casamento * Headers/Foundation/NSKeyedArchiver.h: * Source/NSKeyedArchiver.m: Start implementing some secure coding methods. 2020-04-21 Richard Frith-Macdonald * Source/NSNotification.m: * Tests/base/NSNotification/basic.m: Override -hash and -isEqual: so that notifications with the same name, object, and userInfo are considered equal. This is the OSX behavior. Add tests for notification equality 2020-04-16 Richard Frith-Macdonald * Source/NSURLResponse.m: Fix for NSURLResponse does not allow for multiple Set-Cookie headers in the same response #85 ... combine multiple header values as a comma separated list. 2020-04-16 Richard Frith-Macdonald * Source/NSOperation.m: Fix for Deadlock in NSOperationQueue #49: If an exception occurs when trying to detach thread, catch it and log it so that locking is not broken by the exception breaking out of the lock protected region. 2020-04-16 Richard Frith-Macdonald * Source/NSHTTPCookie.m: * Tests/base/NSHTTPCookie/basic.m: Add testcase for multiple cookies in a header. Fix error parsing a literal string (writing nul terminator to read only memory) 2020-04-16 Richard Frith-Macdonald * Source/NSHTTPCookie.m: Rewrite code for separating individual cookies from a comma separated header so it better matches what OSX does (and is hopefully a bit simpler). 2020-04-16 Richard Frith-Macdonald * configure: * configure.ac: Fix use of OBJC_RUNTIME_LIB before it was initialised. Thanks to johannes@brakensiek.info for spotting this. 2020-04-15 Richard Frith-Macdonald * Source/Additions/GSInsensitiveDictionary.m: * Source/Additions/GSXML.m: * Source/Additions/NSProcessInfo+GNUstepBase.m: Add casts to avoid compiler warnings about types of method 2020-04-15 Richard Frith-Macdonald * Source/Additions/GSInsensitiveDictionary.m: * Source/Additions/GSMime.m: * Source/Additions/GSObjCRuntime.m: * Source/Additions/GSXML.m: * Source/Additions/NSArray+GNUstepBase.m: * Source/Additions/NSObject+GNUstepBase.m: * Source/Additions/NSProcessInfo+GNUstepBase.m: * Source/Additions/NSPropertyList+GNUstepBase.m: Fully type method implementation pointers to improve compile time type checking. 2020-04-14 Richard Frith-Macdonald * Source/Additions/NSObject+GNUstepBase.m: When building outside GNUstep (additions for apple), include the runtime declarations and fix error in casting self. 2020-04-14 Richard Frith-Macdonald * Headers/GNUstepBase/GSConfig.h.in: * Headers/GNUstepBase/GSVersionMacros.h: * configure: * configure.ac: Remove last vestiges of MIXED ABI support (it didn't really work), and change code to assume that use of the apple runtime means we have the nonfragile ABI (true for modern apple systems we may be interested in using). Regenerate configure script. 2020-04-14 Richard Frith-Macdonald * Source/NSURLProtocol.m: Fix line somehow missed from last commit 2020-04-13 Ivan VuÄica * ANNOUNCE: * Documentation/announce.texi: Normalize the accompanying text for the release announcement across core packages: standardize chapter name and GPG information. 2020-04-13 Richard Frith-Macdonald * Source/NSURL.m: Remove custom code for percent escaping and replace it with standard code using custom charactersets. 2020-04-13 Richard Frith-Macdonald * Tests/base/NSURL/charsets.m: test the URL component character sets 2020-04-13 Richard Frith-Macdonald * Headers/Foundation/NSURLProtocol.h: * Source/NSURLProtocol.m: Fix [NSURLProtocol -initWithRequest:cachedResponse:client:] to retain the client (up until the last message is sent to it) as OSX does. 2020-04-12 Richard Frith-Macdonald * CharSets/URLFragmentAllowedCharSet.h: * CharSets/URLHostAllowedCharSet.h: * CharSets/URLPasswordAllowedCharSet.h: * CharSets/URLPathAllowedCharSet.h: * CharSets/URLQueryAllowedCharSet.h: * CharSets/URLUserAllowedCharSet.h: Removed character set data headers from non-standard location. * NSCharacterSet.m: Fixed to load URL characterset data from standard file. Changed bitmap representation to use much less space for charsets residing wholly in the base plane (in particular the URL charsets which are purely ASCII characters). * NSCharacterSetData.h: Regenerated to contain the URL charactersets and to contain the latest Unicode data (3rd Oct 2019). 2020-04-10 Richard Frith-Macdonald * Tests/base/NSURL/basic.m: Use PASS_EQUAL for better diagnostics 2020-04-10 Richard Frith-Macdonald * Headers/GNUstepBase/GNUstep.h: Add ASSIGNMUTABLECOPY() macro for consistency with ASSIGNCOPY() Wolfgang pointed out that the lack of this macro was uninutitive. 2020-04-09 Riccardo Mottola * Source/NSFileManager.m: Implement read and set of File Creation Date attribute on Windows. 2020-04-09 Riccardo Mottola * Headers/GNUstepBase/config.h.in: * configure: * configure.ac: Add tests for non-POSIX lstat() struct members 2020-04-07 Frederik Seiffert * Source/NSOperation.m: Fix completion block memory management. 2020-04-05 Ivan Vucica * ANNOUNCE: * NEWS: * Documentation/ReleaseNotes.gsdoc: * Documentation/news.texi: Update release notes for 1.27.0. 2020-03-29 Frederik Seiffert * Source/NSThread.m: Use pthread_setname_np result instead of errno, which fixes setting thread name on platforms where errno is not set. 2020-03-29 Frederik Seiffert * Source/NSURLResponse.m: Fix parsing of NSURLResponse content type header. 2020-03-29 Fred Kiefer * Source/NSString.m: Attempt to make calls to GSICUCollatorOpen() more consistent and correct for ICU 65. 2020-03-26 Frederik Seiffert * Headers/Foundation/NSError.h: * Source/NSError.m: Added NSErrorDomain typedef. 2020-03-12 Fred Kiefer * Source/NSURL.m: Fix compiler warnings. * Headers/Foundation/NSLocale.h: * Source/NSLocale.m: Add a few convenience methods from MacOS 10.12. 2020-03-10 Frederik Seiffert * Source/NSURL.m: fix –[NSURLComponents setURL:] throwing exception for URLs that don't have all parts. 2020-03-01 Fred Kiefer * Tests/base/NSBundle/TestInfo, * Tests/base/NSBundle/GNUmakefile.preamble, * Tests/base/NSBundle/resources2.m: Extend test to check for framework resource loading. 2020-03-06 Richard Frith-Macdonald * Resources/Languages/Locale.canonical: Backward compatibility fix for ICU 65 by Fred Kiefer * Resources/Languages/README: Fix trivial typo 2020-02-24 Richard Frith-Macdonald * Source/objc-load.m: update GSPrivateSymbolPath() so that, on the path where LINKER_GETSYMBOL is not available, we attempt to lookup classes using the prefix ._OBJC_CLASS_ for the 2.0 ABI (earlier ABIs use a prefix of __objc_class_name_ for the class definition. 2020-02-17 Richard Frith-Macdonald * Tools/gdomap.c: When building the list of hosts to be probed to see if they have gdomap servers, fix code to include those explicitly defined in the config file. Add -S option to list the addresses of the known gdomap servers. * Tools/gdomap.8: Document the new command line option. 2020-02-11 Richard Frith-Macdonald * Headers/Foundation/NSXPCConnection.h: remove unistd.h since workaround broke blocks code. I guess we have to hope that sys/types.h has gid_t, pid_t, and uid_t on all systems we target. 2020-02-08 Richard Frith-Macdonald * Examples/dictionary.m: * Examples/nsconnection_client.m: * Headers/GNUstepBase/GNUstep.h: * Source/Additions/GSMime.m: * Source/NSConnection.m: * Source/NSDictionary.m: * Source/NSException.m: * Source/NSFileManager.m: * Source/NSFileWrapper.m: * Source/NSTask.m: * Source/NSUserDefaults.m: * Tools/AGSIndex.m: * Tools/AGSOutput.m: * Tools/cvtenc.m: Switch various places away from deprecated CREATE_AUTORELEASE_POOL() to use the ARC-compatible ENTER_POOL and LEAVE_POOL macros. 2020-02-08 Richard Frith-Macdonald * Headers/Foundation/NSXPCConnection.h: Workaround for clash between unistd.h and clang's reserved word __block 2020-02-05 Fred Kiefer * configure.ac: Use pkg-config to check for libxml. * configure: regenerate 2020-01-23 Fred Kiefer * Source/Additions/NSURL+GNUstepBase.m: Handle case where scheme is missing from the URL. 2020-01-20 Fred Kiefer * Source/NSPredicate.m: Allow simple predicates on NSDate. 2020-01-20 Richard Frith-Macdonald * Source/GSTLS.m: remove certificate key password from hash key of credentials since it's unnecessary there and we don't want it to be logged when debug is on (for security, passwords shouldn't appear in logs). 2020-01-12 Fred Kiefer * Source/NSPredicate.m: Add support for NSDate constants. 2020-01-12 Fred Kiefer * Source/NSKeyValueObserving.m: Implement two missing KVO methods on NSArray. 2019-12-15 Fred Kiefer * Headers/GNUstepBase/GSIMap.h: Use GSI_MAP_NODE_IS_EMPTY macros when checking in enumerator. * Source/NSConcreteHashTable.m, * Source/NSConcreteMapTable.m: Revert part of the weak pointer change. 2019-10-17 Frederik Seiffert * Tests/base/NSHashTable/weakObjects.m: * Tests/base/NSMapTable/weakObjects.m: Added tests for [NSHashTable weakObjectsHashTable] and [NSMapTable strongToWeakObjectsMapTable]. 2019-11-26 Niels Grewe * Source/NSRunLoop.m: * Tests/base/NSRunLoop/dispatch.m: Fix runloop integration for libdispatch from swift-corelibs * .travis.yml: * travis-deps.yml: Fix CI related to libdispatch. 2019-11-15 Frederik Seiffert * configure.ac: check for unwind.h * configure: regenerate * Source/NSException.m: Added support for backtrace symbolication using libunwind, which will be used when backtrace() is unavailable. 2019-11-14 Fred Kiefer * Headers/Foundation/NSXPCConnection.h, * Source/NSXPCConnection.m: Fix broken compilation on gcc. 2019-11-12 Richard Frith-Macdonald * NSTimeZones/NSTimeZones.tar: updated to latest info 2019-11-05 Frederik Seiffert * Headers/Foundation/NSProcessInfo.h: * Source/NSPathUtilities.m: * Source/NSProcessInfo.m: Added support for NSTemporaryDirectory() on Android using subfolder in folder returned by Context.getCacheDir(), as there is no official temp dir prior to API level 26. Clean up temp dir on launch in GSInitializeProcessAndroid(). Also use Context.getCacheDir() as NSCachesDirectory (with NSUserDomainMask) on Android. 2019-10-27 Fred Kiefer * Headers/Foundation/NSUnit.h, * Headers/Foundation/NSMeasurement.h, * Headers/Foundation/NSMeasurementFormatter.h, * Headers/Foundation/NSEnergyFormatter.h, * Headers/Foundation/NSLengthFormatter.h, * Headers/Foundation/NSMassFormatter.h, * Source/NSUnit.m, * Source/NSMeasurement.m, * Source/NSMeasurementFormatter.m, * Source/NSEnergyFormatter.m, * Source/NSLengthFormatter.m, * Source/NSMassFormatter.m, * Source/NSUnit.m: More cleanup on the measurement code. 2019-10-29 Wolfgang Lux * Source/GSStream.h, * Source/GSStream.m, * Source/GSSocketStream.m: Use a more sane implementation to redirect event handling to the TLS handler while in a handshake. * Source/GSTLS.m: Fall back to a sane default if the TLS priority setting is invalid. 2019-10-28 Wolfgang Lux * Source/GSSocketStream.m: Prevent premature deallocation when a socket is closed while in a TLS handshake. 2019-10-27 Fred Kiefer * Headers/Foundation/NSUnit.h, * Source/NSUnit.m: Clean up code and fix bugs. 2019-10-17 Frederik Seiffert * Source/GSDispatch.h: * Source/NSArray.m: * Source/NSDictionary.m: * Source/NSIndexSet.m: * Source/NSOrderedSet.m: * Source/NSSet.m: Perform non-concurrent block enumeration calls in place instead of using serial queue to match Apple platforms. 2019-10-25 Frederik Seiffert * Headers/Foundation/NSMapTable.h: * Headers/Foundation/NSHashTable.h: Added generics support to NSMapTable and updated NSMapTable and NSHashTable to use "instancetype". 2019-10-02 Frederik Seiffert * Source/NSDictionary.m: fixed mutable dictionary keyed subscript behavior: assigning nil value via keyed subscript now correctly removes object for key. 2019-09-25 Frederik Seiffert * Headers/Foundation/NSProcessInfo.h: * Source/NSPathUtilities.m: * Source/NSProcessInfo.m: Added support for data directory on Android. This makes GNUstep use the path returned by Context.getFilesDir() as the basis for storing data (e.g. NSUserDefaults) and when querying system directory paths (NSLibraryDirectory, NSApplicationSupportDirectory, etc.). Requires calling a new GSInitializeProcessAndroid() initialization function. 2019-09-25 Richard Frith-Macdonald * Source/NSArray.m: [-removeObjectsInArray:] add checks to prevent possible crashes, particulary if the method argument is the receiver; crash seen by Wolfgang. * Source/GSSocketStream.m: Fix incorrect key when setting old security level. Change internal API name to avoid confusion. 2019-09-21 Richard Frith-Macdonald * Source/GSTLS.m: Re-order code to avoid setting session priority twice. * Source/NSFileHandle.m: Fix so that setting certificate information does not discard any other options already set. 2019-09-16 Alan Jenkins * Tools/gdomap.c: A couple of is_local_net() tests were wrong: they used "&&" with masks, but that is the logical shortcut operator. The correct bitwise operator is "&". The result was that is_local_net() was always returning true! Only allow local processes to send GDO_SERVERS requests. This request is only useful locally. Do not allow remote requests for the server list. Our response can be large, so it would make a great UDP amplification attack. 2019-08-12 Richard Frith-Macdonald * Source/GSSocketStream.m: Fix for hang when writing large https requests. * Source/GSStream.h: improve diagnostics * Source/GSStream.m: improve diagnostics * Source/NSURLProtocol.m: improve diagnostics * Tests/base/NSURLConnection/Helpers/NSURLConnectionTest.m: * Tests/base/NSURLConnection/test05.m: Bugfix and new testcase for https request with large (over 64KB) body. 2019-08-09 Richard Frith-Macdonald * Source/NSRunLoop.m: * Source/NSThread.m: Improve reporting of excess performers so that, when one thread performs selectors in another, you can see the class of the receiver and the selector involved. 2019-08-08 Richard Frith-Macdonald * configure.ac: check for malloc_usable_sizer() * configure: regenerate * Headers/GNUstepBase/config.h.in: regenerate * Headers/Foundation/NSDebug.h: Add GSMemoryBytes() * Headers/GNUstepBase/NSObject+GNUstepBase.h: Rework memory usage reporting extensions API. * Source/Additions/NSMutableString+GNUstepBase.m: * Source/Additions/NSObject+GNUstepBase.m: * Source/GSArray.m: * Source/GSCountedSet.m: * Source/GSDictionary.m: * Source/GSSet.m: * Source/GSString.m: * Source/NSConcreteHashTable.m: * Source/NSConcreteMapTable.m: * Source/NSData.m: * Source/NSDebug.m: * Source/NSDistantObject.m: * Source/NSObject.m: * Source/NSProxy.m: * Source/NSRunLoop.m: Updates for new memory reporting extensions API. The parts of this dealing with the size of the contents of an object are now off by default (trying to calculate the size of an object is problematic if it is mutated while you are doing it) but classes can implement -sizeOfContentExcluding: to turn it on if they are thread-safe. Implementations provided for immutable container objects and for all strings. 2019-08-06 Richard Frith-Macdonald * Source/NSData.m: Implement [NSMutableData+dataWithBytesNoCopy:length:freeWhenDone] 2019-07-28 Fred Kiefer * Source/NSByteCountFormatter.m: Fix to work in non fragile settings. 2019-07-19 Gregory Casamento * Headers/Foundation/NSByteCountFormatter.h * Source/NSByteCountFormatter.m Implementation of NSByteCountFormatter as documented. * Tests/base/NSByteCountFormatter Add test for this class. 2019-07-10 Frederik Seiffert * Headers/Foundation/NSArray.h: * Headers/Foundation/NSOrderedSet.h: Fix generics definition of NSMutableArray and NSMutableOrderedSet. Fix NSArray and NSOrderedSet KVC method types to not use generic type. 2019-07-14 Fred Kiefer * Source/NSUbiquitousKeyValueStore.m: Change to use GNUstep formatting. Move simple methods into base class. Correct the usage of long long NSNumber. 2019-07-10 Gregory Casamento * Headers/Foundation/NSUbiquitousKeyValueStore.h * Source/NSUbiquitousKeyValueStore.m: Implementation of skeletal version of this class for compilation. Also put in place a way to make concrete subclasses for various services. 2019-07-02 Wolfgang Lux * Tests/base/GSTLS/basic.m: Use fixed time zone. 2019-07-02 Gregory John Casamento * Headers/Foundation/NSOrderedSet.h: Added header for class cluster implementation of NSOrderedSet. * Source/NSOrderedSet.m: Implementation of NSOrderedSet and NSMutableOrderedSet * Source/GSOrderedSet.m: Implementation of concrete class. 2019-07-01 Fred Kiefer * Source/GSXML.m (fatalErrorFunction): Use correct function to get line number. * Source/NSOperation.m (_execute): Surround with NS_DURING to free lock on error. 2019-06-11 Richard Frith-Macdonald * Headers/GNUstepBase/GSIArray.h: * Headers/GNUstepBase/NSObject+GNUstepBase.h: * Source/Additions/NSObject+GNUstepBase.m: * Source/GSArray.m: * Source/GSCountedSet.m: * Source/GSDictionary.m: * Source/GSSet.m: * Source/NSArray.m: * Source/NSConcreteHashTable.m: * Source/NSConcreteMapTable.m: * Source/NSData.m: * Source/NSDictionary.m: * Source/NSDistantObject.m: * Source/NSObject.m: * Source/NSProxy.m: * Source/NSSet.m: * Source/NSString.m: Revise mechanism for extention to report memory usage of individual objects. This makes the inclusion of size of objects in ivars a default, while allowing easy extension to include other heap memory. API change not final. 2019-05-23 Frederik Seiffert * configure: * configure.ac: Link against libandroid on Android. * Headers/Foundation/NSBundle.h: * Source/NSBundle.m: Added methods for passing Android asset manager from Java to GNUstep and for getting AAsset/AAssetDir for given path in main bundle. Skip app bundle suffix check on Android. Extended bundle resource paths backbone to check for known paths directly on Android as we can't enumerate directories. Extended -localizations method to check for known localizations directly (requires setting userLanguages in NSUserDefaults). Extracted path cache cleaning into separate method. * Source/GSFileHandle.h: * Source/GSFileHandle.m: Added file handle support for reading Android assets from main bundle. * Source/NSData.m: Added support for reading Android assets from main bundle in readContentsOfFile(). This is also used by all other -initWithContentsOfFile: and related methods from other classes. * Source/NSFileManager.m: Added support for Android assets from main bundle in fileExistsAtPath:isDirectory:, isReadableFileAtPath:, NSDirectoryEnumerator, and copying from assets. Extended GSAttrDictionary with basic support for Android assets. * Source/NSProcessInfo.m: Added +initialize method to auto-initialize NSProcessInfo on Android using fake executable path "/data/data//exe" (Android apps don't have a real executable path). 2019-05-20 Frederik Seiffert * Source/NSLog.m: Have all logs go to syslog on android. * Source/NSThread.m: Spinlock implementation using builtins as implemented by David in libobjc2 * Source/NSRunLoop.m * Headers/GNUstepBase/config.h.in: * configure.ac: This updates the libdispatch runloop integration to be compatible with the Swift corelibs libdispatch release at (https://github.com/apple/swift-corelibs-libdispatch). In that release, the main queue handle and drain functions have been renamed with a "_4CF" (for CoreFoundation) suffix and have moved to private.h, so we now check for the existance of this header and function names. Note that libdispatch must be compiled with INSTALL_PRIVATE_HEADERS=YES. Also fixes the checks for the HAVE_LIBDISPATCH_RUNLOOP define (was inverted) and ensures that both the handle and drain functions are available. 2019-04-16 Richard Frith-Macdonald * Source/NSString.m: Removed public functions which could conflict with application code. Rewrote percent unescaping to avoid possible buffer overruns. * Tests/base/NSString/test09.m: avoid excess logging (for readability of test output). 2019-04-12 Gregory John Casamento * Source/NSCharacterSet.m: Added declarations/implementations for URL*AllowedCharacterSet. * Headers/NSCharacterSet.h: Added declarations here for URL*AllowedCharacterSet * Source/CharSets/*: Added headers to define new charactersets. * Source/NSString.m: Added methods stringByRemovingPercentEncoding/ stringByAddingPercentEncodingWithAllowedCharacterSet: * Header/NSString.h: Added declrations for methods mentioned above. 2019-03-29 Igor Zhukov * Source/NSDateFormatter.m: * configure: * configure.ac: Decrease ICU version requirements to 49 to support Windows 2000. 2019-03-25 Sergii Stoian * Resources/Lanuages/Ukrainian: Fix wrong \U sequence for letter 'i' and short weekdays. 2019-03-18 Wolfgang Lux * Tools/gdomap.c: Fix crash in donames() when getaddrinfo returns an error. 2019-02-27 Richard Frith-Macdonald * Source/Additions/Unidoce.m: comment-out left-over debug logging. * Source/NSJSONSerialization.m: escape characters with codepoint greater than 0x7f. 2019-02-15 Richard Frith-Macdonald * Source/GSMime.m: When encoding quoted words in a header, ensure we don't split multibyte utf-8 characters into separate words. * Tests/base/GSMime/general.m: Add test for encode/decode folded subject line wit a euro symbol at the fold point. 2019-02-14 Richard Frith-Macdonald * Source/GSPrivate.h: * Source/NSBundle.m: * Source/NSPathUtilities.m: * Source/objc-load.m: GSPrivateSymbolPath() simplified by removing the unused argument and consolidated code so that, if the class lookup via dladdr() fails, we fall back to use __objc_dynamic_get_symbol_path(). 2019-02-14 Richard Frith-Macdonald * Source/Additions/GSMime.m: Fix encoded word encoding specifier to be uppercase ('B' or 'Q') as pere strict RFC specification. * Tests/base/GSMime/build.m: Add testcase for correct encoding. 2019-02-13 Richard Frith-Macdonald * Tests/base/GSTLS/basic.m: Update testcase to use correct guard. 2019-02-12 Ivan Vucica * Headers/GNUstepBase/GSTLS.h: Change guard to check for value of GS_USE_GNUTLS and not for its defined state. This preprocessor constant might be defined with a zero value indicating desire not to use GnuTLS, which would still pass the old check. 2019-02-11 Richard Frith-Macdonald * Source/NSObject.m: Improve thread safety with NSZombie particularly on startup/shutdown; be more careful about locking access to the zombieMap and also ensuring we don't raise an exception inside the locked sections (by passing a nil map to the functions). 2019-01-06 Armando Pesenti Gritti * Headers/GNUstepBase/GSTLS.h: Header moved to provide public exposure of TLS classes giving ObjC interface to GNU TLS. * Source/GSTLS.m: New methods to provide certificate expiry times. * Source/DocMakefile: Make documentation from GSTLS.h * Source/GNUmakefile: Install GSTLS.h * Source/GSHTTPURLHandle.m: Adjust location of GSTLS header * Source/GSSocketStream.m: Adjust location of GSTLS header * Source/NSFileHandle.m: Adjust location of GSTLS header * Source/NSURLProtocol.m: Adjust location of GSTLS header * Tests/base/GSTLS: Add tests for certificate expiry Patch by Armando, adjusted by RFM. 2019-01-06 Fred Kiefer * Source/Additions/Unicode.m: Move variable u to the correct scope and initialize it. 2019-01-06 Ivan Vucica * ANNOUNCE: * NEWS: * Documentation/ReleaseNotes.gsdoc: * Documentation/news.texi: Update release notes for 1.26.0. * Version: Bump version to 1.26.0. 2019-01-06 Ivan Vucica * Tests/base/NSBundle/resources.m: Fixed change in 2107c82ca4778e4cf9b8624d1bd1fd60fe104373 which made NSArray *arr become invisible to the "NSBundle GNUstep resources" test set. 2019-01-06 Ivan Vucica * config/icu.m4: * configure.ac: Merge the change to use pkg-config to detect ICU. Patch by Hugh McMaster . Update PR #32 to require ICU 5.0+ and not 4.6+. * configure: Regenerated to incorporate the changes from PR #32. Regenerated with autoconf 2.69. 2019-01-06 Fred Kiefer * Documentation/news.texi: Update release notes for 1.26.0. * ChangeLog: Fix typos in this document. 2019-01-03 Richard Frith-Macdonald * Source/GSTLS.h: * Source/GSTLS.m: * Source/NSFileHandle.m: Track the age of TLS sessions for server connections and, when accepting an incoming connection, replace the current server connection (if the existing one is more than 5 minutes old) so that cached certificate information will be updated from file (eg if a certificate needs to be updated while a server is running). 2018-12-06 Wolfgang Lux * Headers/Foundation/NSObject.h: Remove reference to the copyWithZone: implementation of NSObject, which was removed ages ago. 2018-12-05 Richard Frith-Macdonald * Headers/Foundation/NSURLHandle.h: * Source/NSURLHandle.m: * Source/GSHTTPURLHandle.m: Expose GNUstep specific methods for old code that depends on them. Newer code should use the newer HTTP/HTTPS APIs 2018-12-04 Richard Frith-Macdonald * Headers/GNUstepBase/NSURL+GNUstepBase.h: * Source/NSURL.m: Add [-cacheKey] method to return a key usable for caching HTTP URL connections that go to the same scheme, host and port. * Source/GSHTTPURLHandle.m: New [-setURL:] method to change the URL used by a handle so that a networek connection used by a handle can be re-used if possible (ie if the scheme, host and port parts are unchanged). 2018-08-24 Richard Frith-Macdonald * Source/GSTLS.m: Fixup for last modification ... still verify the certificate (so we can find out who issued/owns it) even if we do not have verification turned on ... the verification setting controls whether we reject the connection. Also fixed off by one bug in getting the issuer and owner distinguished names. 2018-08-13 Richard Frith-Macdonald * Source/GSTLS.m: Change behavior so that when acting as a server we always request that the client sends us a certificate (if it doesn't have one, it should ignore the request). The 'verify' setting should control only whether a request without a certificate is rejected. 2018-08-08 Riccardo Mottola * configure.ac * configure: When checking for pthread_np.h include pthread.h if available or it may fail (e.g. OpenBSD). 2018-08-06 Richard Frith-Macdonald * Source/NSUserDefaults.m: Update the cache on change of volatile domain or search list, not just when perstistent domain values change. 2018-07-19 Richard Frith-Macdonald * NSTimeZones/NSTimeZones.tar: Updated zone info and corrected preferred abbreviation mappings to match OSX. 2018-07-14 Richard Frith-Macdonald * Source/Additions/Unicode.m: improve utf8 validity checks, switch to state machine based utf8 parsing for better performance. * Tests/base/NSString/utf8.m: add a few tests for utf8 parsing. 2018-07-10 Richard Frith-Macdonald * configure.ac: * configure: When using clang, we now supply -fobjc-runtime=gcc to target the gnu/gcc runtime ABI. 2018-07-07 Fred Kiefer * Source/NSString.m: Add primitive implementation for rangeOfComposedCharacterSequencesForRange:. 2018-07-06 Fred Kiefer * Source/GSString.m: Remove GSString copyWithZone:. * Source/NSString.m: Raise exception when no data is provided for the string. This brings our implementation closer to the Cocoa one. * Source/GSString.m: Add similar exceptions. 2018-07-02 Richard Frith-Macdonald * Tests/base/NSString/test00.m: : Move _unicodeString from here... * Source/GSString.m: ... to here. In order to reliably test the internal 16bit unicode implementation we must have a method guaranteed to produce an instance of the correct class. 2018-07-01 Fred Kiefer * Source/NSString.m: Small cleanup for printf registration. * Tests/base/NSString/test00.m: Add David Chisnall's test from newapi branch slightly reformatted. * Source/GSString.m: Remove code that was identical to super class. * Source/GSString.m: Move the method _unicodeString from here... * Tests/base/NSString/test00.m: ...to here. 2018-06-28 Richard Frith-Macdonald * Source/NSXMLParser.m: Fix conversion of numeric entities with large values into UTF-16 surrogate pairs before returning them as string. 2018-06-12 Richard Frith-Macdonald * Documentation/Base.gsdoc: * Source/GSPrivate.h: * Source/NSException.m: * Source/NSUserDefaults.m: Add boolean GSExceptionStackTrace user default to turn on inclusion of stack trace information in the -description of an exception (like the GNUSTEP_STACK_TRACE environment variable). Useful for diagnostic logs of a long running server process. 2018-04-30 Graham Lee * Source/NSCalendar.m (calendarWithIdentifier:): New convenience method implemented by Cocoa. 2018-05-29 Richard Frith-Macdonald * Source/NSObject.m: avoid static initialisation macro for allocation locks in case some systems implement it in a way that doesn't work after static initialisation takes place. 2018-05-27 Fred Kiefer * Tests/base/NSProcessInfo/general.m: Mark test for -systemUptime as hopeful as it may fail in GNU Hurd. Fixes bug #53941. Based on idea by Yavor Doganov 2018-05-21 Fred Kiefer * Source/GSConcreteValueTemplate.m: Add hack to make point and size subclasses for NSValue interchangable. 2018-05-20 Ivan Vucica * Source/NSThread.m: Fix typo in code branch for platforms without pthread_spin_lock(). Check for value of HAVE_PTHREAD_SPIN_LOCK instead of whether the macro is defined. 2018-05-18 Richard Frith-Macdonald * Tools/gdnc.m: Remove a little unused code * Headers/Foundation/NSFileHandle.h: * Source/GSHTTPURLHandle.m: * Source/GSSocketStream.m: * Source/GSTLS.h: * Source/GSTLS.m: * Source/NSURLProtocol.m: Add support for TLS SNI (Server Name Indication) and a new option (GSTLSServerName) to control what name (if any) is passed in the TLS handshake. 2018-05-17 Yavor Doganov * Tests/base/NSNumberFormatter/basic10_4.m: Avoid test failure on big-endian platforms by converting unichar to an NSString. 2018-05-10 Fred Kiefer * Tools/pl2link.m (main): Don't write deprecated fields to desktop link file. Patch by: Josh Freeman 2018-04-24 Richard Frith-Macdonald * configure: regenerate * NSObject.m: tiny cosmetic whitespace tidyup * NSThread.m: move declarations to avoid compiler warning 2018-04-23 Riccardo Mottola * Source/NSThread.m: Detect if platform is missing spin locks and provide an dummy implementation. Emit warning during compilation and runtime (in debug). 2018-04-16 Richard Frith-Macdonald * Source/NSThread.m: ensure that the thread specific memory key is initialised before use. 2018-04-15 Richard Frith-Macdonald * Source/NSException.m: Improve -symbold method on platforms without backtrace support (list addresses with a message to say the symbols are not available). 2018-04-12 Richard Frith-Macdonald * Source/NSLock.m: Using class_createInstance() to allocate locks seems to be causing memory issues and crashes somehow. Temporarily comment out that code to try to get things working again. 2018-04-12 Richard Frith-Macdonald * Source/Additions/Unicode.m: * Source/NSArray.m: * Source/NSCharacterSet.m: * Source/NSString.m: Use pthread mutex directly to try to avoid initialising NSLock too early on during process startup. 2018-04-10 Richard Frith-Macdonald * Source/NSObject.m: Don't set the name of the global lock until after we have make sure that strings and autorelease are set up. 2018-04-10 Richard Frith-Macdonald * Source/Additions/Unicode.m: * Source/GSHTTPAuthentication.m: * Source/GSHTTPURLHandle.m: * Source/GSMDNSNetServices.m: * Source/GSURLPrivate.h: * Source/NSCalendar.m: * Source/NSCharacterSet.m: * Source/NSConnection.m: * Source/NSCountedSet.m: * Source/NSIndexPath.m: * Source/NSKeyValueObserving.m: * Source/NSLocale.m: * Source/NSMessagePort.m: * Source/NSSocketPort.m: * Source/NSUserDefaults.m: * Source/NSValueTransformer.m: Replace the obsolete GSLazyLock code with standard NSLocks now that almost all significant software is multithreaded. 2018-04-10 Richard Frith-Macdonald * Source/NSThread.m: When adding a new thread, set the thread specific memory to point to the object before doing anything else which might attempt to access the thread (causing recursive registration). 2018-04-09 Richard Frith-Macdonald * Source/Additions/unicode/cop.h: Add comment/fixme * Source/Additions/Unicode.m: * Source/NSString.m: Move uni_isnonsp() to NSString.m and make it use nonBaseCharacterSet so that it correctly copes with both surrogate pairs and traditional composed character sequences. NB. David points out that this is not full/correct unicode grapheme cluster handling (it's the main part of the handling for 'legacy' grapheme clusters). 2018-04-04 Richard Frith-Macdonald * Headers/Foundation/NSLock.h: * Headers/Foundation/NSThread.h: * Source/GSPrivate.h: * Source/NSException.m: * Source/NSLock.m: * Source/NSThread.m: Revised code for efficient stack traces and for tracking the use of locks and detecting deadlocks. 2018-03-30 Richard Frith-Macdonald * Source/NSException.m: Fix second argument to backtrace() 2018-03-28 Richard Frith-Macdonald * Source/NSException.m: Use pthread mutexes directly to avoid recursive interactions with tracking NSL:ock activity. 2018-03-27 Richard Frith-Macdonald * Source/GSPrivate.h: * Source/NSDebug.m: * Source/NSException.m: * Source/NSThread.m: * Headers/Foundation/NSThread.h: Move stack info code from NSDebug to NSException so its all in one place and. Make thread call stack addresses method use windows code as well as libbacktrace. Remove unused method. * Source/NSTimeZone.m: Simplify and optimise locking by using pthread_mutex functions directly. 2018-03-26 Richard Frith-Macdonald * Source/NSDebug.m: Avoid recursion in lock tracing when using memory allocation stats. * Source/NSObject.m: Make gnustep_global_lock an untraced lock to avoid recursion issues when tracing. 2018-03-26 Richard Frith-Macdonald * Headers/Foundation/NSLock.h: * Headers/Foundation/NSThread.h: * Source/GSPrivate.h: * Source/NSLock.m: * Source/NSThread.m: Experimental code to add support for tracing locks held by different threads and to report deadlock situations where threads have obtained locks in the wrong order and can never proceed. 2018-03-26 Richard Frith-Macdonald * Source/NSBundle.m: * Source/NSOperation.m: Give locks names to ease debugging * Source/NSObject.m: * Source/NSZone.m: Updates to use pthread mutexes directly rather than NSLock objects in key places for performance. 2018-03-26 Richard Frith-Macdonald * Source/GSPThread.h: * Source/GSException.m: Optimise generation of stack traces to store them in a single simple malloced buffer and only generate an NSArray of return addresses if actually requested. Also adjust output of stack trace to exclude the top few frames involved in generation of the trace, so we see only the frames of interest. 2018-03-16 Richard Frith-Macdonald * Headers/Foundation/NSLock.h: Expose pointer to function handling logging of deadlocks. * Source/NSLock.m: Indirect via pointer so apps can intercept the logging of deadlocks. * Source/GSHTTPURLHandle.m: Provide more detailed debug logging. * Source/NSURLProtocol.m: Provide more detailed debug logs. 2018-02-25 Richard Frith-Macdonald * Source/GSeq.h: Fixup error in last modification. * Source/GSString.m: Add method to reliably get a GSUnicodeString * Tests/base/NSString/test00.m: Fix tests to properly check range searches using all combinations of 8bit and 16bit representation strings. 2018-02-25 Richard Frith-Macdonald * Source/GSeq.h: Fix boundary checks searching for unicode strings. 2018-02-16 Yavor Doganov * Tests/base/NSNumberFormatter/basic10_4.m: Extend test expression to fix test failure with ICU 60.2. 2018-02-11 Richard Frith-Macdonald * Tools/gdomap.c: Fix strncat length limits. 2018-02-09 Richard Frith-Macdonald * Source/NSTimeZone.m: fix missing fieldwidth specified in fscanf call 2018-02-09 Fred Kiefer * Source/NSXMLElement.m(-addAttribute:): Correct linear list code for name spaces. This fixes the last remaining Coverity issue. 2018-02-08 Richard Frith-Macdonald * Source/NSPortCoder.h * Source/NSUnarchiver.h Improve checks for loss of data converting sizes of scalar types. 2018-02-07 Richard Frith-Macdonald * Source/GSAttributedString.m: remove a little dead code * Tests/base/NSMutableAttributedString/test00.m: add sanity checks * Tests/base/NSMutableAttributedString/test01.m: add sanity checks * Source/GSString.m: raise exception on character conversion failure * Source/NSNumberFormatter.m: remove dead code * Source/NSPropertyList.m: avoid warnings using cast to void * Source/NSMessagePortNameServer.m: added security checks * Source/NSDecimal.m: tweak underflow setting for negative numbers * Tools/AGSHtml.m: remove useless test 2018-02-07 Yavor Doganov * Source/NSPortMessage.m (sendBeforeDate:): Invoke -sendBeforeDate:msgid:components:from:reserved: so that the value of _msgid is taken into account. (initWithSendPort:receivePort:components:): Set _msgid to 0. 2018-02-06 Richard Frith-Macdonald * Headers/Foundation/NSException.h: * Source/NSAssertionHandler.m: * Documentation/manual/ExceptionHandling.texi: Update NSAssert() and NSCAssert() to handle variable arguments (as OSX has done) and mark the numbered macros as obsolete. * Source/NSMessagePort.m: * Source/NSSocketPort.m: Log if we fail to turn on keepalive * Source/NSURL.m: fix possible nul pointer dereference * Source/NSPropertyList.m: check step before use * Source/NSDate.m: add comment that we are ignoring non-digits * Source/NSCache.m: use double division for calcualting averrage * Source/NSPredicate.m: check for termination of quoted strings 2018-02-05 Richard Frith-Macdonald * Source/NSPortCoder.m: Remove redundant (always true) conditional. Use cast to mask 64bit values. * Source/NSUnarchiver.m: Remove redundant (always true) conditional. * Source/NSPropertyList.m: Remove dead code * Source/NSDecimal.m: Remove dead code, tweak underflow setting for negated numbbers. * Tools/gdnc.m: Remove dead code 2018-02-04 Richard Frith-Macdonald * Source/GSFileHandle.m: keep checker happy by using return value of setsockopt. * Source/Additions/Unicode.m: ensure iconv handle is closed * Source/NSLocale.m: localeIdentifierFromComponents should cope with collation alone being set. * Source/GSString.m: better handling if character conversion fails. * Source/NSRunLoop.m: suppress warning using cast. * Source/NSTimeZone.m: check that time zone hour is in range 0 to 23 2018-02-03 Richard Frith-Macdonald * Source/GSFTPURLHandle.m: change memcpy to memmove to avoid possible problems with overlapping source and destination areas. * Source/Additions/Unicode.m: ensure iconv handle is closed * Source/NSXMLParser.m: fix incorrect type assignment 2018-02-01 Fred Kiefer * Source/GSFormat.m: Call va_end with the correct parameter. * Source/NSObject+NSComparisonMethods.m: Add missing return. * Source/GSString.m (-replaceCharactersInRange:withString:, -initWithBytesNoCopy:...freeWhenDone:): Remove dead code. * Source/NSDistantObject.m (-initWithCoder:): Remove dead code. * Source/NSPredicate.m (_eval_avg:): Don't devide by zero. Fix issues found by Coverity. 2018-01-26 Richard Frith-Macdonald * NSCharacterSets/GNUmakefile: * NSCharacterSets/alphanumericCharSet.dat: * NSCharacterSets/controlCharSet.dat: * NSCharacterSets/dataToHeader.c: * NSCharacterSets/decimalDigitCharSet.dat: * NSCharacterSets/decomposableCharSet.dat: * NSCharacterSets/illegalCharSet.dat: * NSCharacterSets/letterCharSet.dat: * NSCharacterSets/lowercaseLetterCharSet.dat: * NSCharacterSets/newlineCharSet.dat: * NSCharacterSets/nonBaseCharSet.dat: * NSCharacterSets/punctuationCharSet.dat: * NSCharacterSets/symbolAndOperatorCharSet.dat: * NSCharacterSets/uppercaseLetterCharSet.dat: * NSCharacterSets/whitespaceAndNlCharSet.dat: * NSCharacterSets/whitespaceCharSet.dat: Obsolete files deleted. * NSCharacterSets/README.CharSet: updated * Source/NSCharacterSetData.h: regenerated using the ucsdata library and the charsets tools to take into account the fact that a unicode zero width space should be counted as white space by us. * Source/NSURL.m: A few OSX compatibility tweaks. * Tests/base/NSURL/basic.m: A couple more OSX compatibility tests. 2018-01-25 Richard Frith-Macdonald * Headers/Foundation/NSException.h: * Source/NSException.m: * Source/Additions/NSObject+GNUstepBase.m: Mark exception raising methods with GS_NORETURN_METHOD. Alter noreturn method implementations so the compiler knows that they really don't return. Use pragma to suppress warnings about noreturn methods whose formal declaration says they return an id. 2018-01-23 Richard Frith-Macdonald * Source/Additions/NSNumber+GNUstepBase.m: * Source/GSValue.m: * Source/NSZone.m: * Tools/gdomap.c: Fix various small issues picked by automated checker. 2018-01-19 Richard Frith-Macdonald * Source/Makefile.postamble: Restore optimisation flags (removed 18 years ago) for NSInvocation and NSConnection (and remove obsolete mframe setting) as suggested by Yavor Doganov. 2018-01-15 Richard Frith-Macdonald * Source/NSThread.m: Improve exception message when performing a selector on a finished thread. * Source/NSTask.m: Do not try to notify task completion on a thread that is not executing. * configure.ac: Fix for older versions of pkg-config * configure: regenerate 2018-01-14 Yavor Doganov * Tests/base/NSXMLDocument/basic.m: * Tests/base/NSXMLDocument/cdata.m: * Tests/base/NSXMLNode/basic.m: * Tests/base/NSXMLElement/attributes.m: * Tests/base/NSXMLElement/basic.m: * Tests/base/NSXMLElement/children.m: * Tests/base/NSXMLElement/transfer.m: * Tests/base/NSXMLNode/children.m: * Tests/base/NSXMLNode/description.m: * Tests/base/NSXMLNode/kinds.m: * Tests/base/NSXMLNode/namespaces.m: Skip tests if libxml2 is not available. * Tests/base/NSTimeZone/use.m: Skip one more test if NSLOCALE_SUPPORTED is undefined. * Tests/base/NSRegularExpression/basic.m: Skip all tests if ICU is not available. 2018-01-14 Richard Frith-Macdonald * configure.ac: Remove explicit test for SAX2.h as we now assume it is present based on the version of libxml2. * configure: regenerate * Source/GSXML.m: fix errors in loading/resolving of external entities and fix the parsing methods to correctly return whether the xml was validated against a DTD (when that feature is turned on). * Tests/base/GSXML/basic.m: add a couple of tests for resolving external references and validating against a DTD. 2018-01-14 Yavor Doganov * configure.ac: Use PKG_PROG_PKG_CONFIG instead of AC_PATH_PROG to find pkg-config as it supports cross-compilation. * configure.ac: Bump ICU requirement to >= 50 for UDAT_PATTERN. 2018-01-11 Richard Frith-Macdonald * Source/NSXMLParser.m: OSX compatibility tweaks and correction for setting entity resolution flag in sloppy parser. * Headers/GNUstepBase/GSXML.h: new [-resolveEntities:] method to enable resolving of external entities (now off by default). * Source/Additions/GSXML.m: Changes to turn off resolving of external entity references my default (adding a new method to turn the feature back on) as a security fix to prevent xml injection attacks (eg where an attacker gets the local password file substituted into an xml document). * Tests/base/NSXMLParser/parse.m: external entity resolution test. * Tests/base/GSXML/basic.m: external entity resolution test. 2018-01-04 Richard Frith-Macdonald * Source/NSObject.m: Fix bug with one path to object allocation failing to record the object for memory debuggin purposes. 2018-01-03 Richard Frith-Macdonald * Source/NSURL.m: Tweaks for OSX compatibility ... treat a missing path in an http URL as an empty string rather than as nil. 2018-01-02 Richard Frith-Macdonald * Source/NSFileManager.m: * Tests/base/NSFileManager/general.m: Added Graham Lee's fix for #51592 to not raise an assertion, but rather call the handler if the source file being copied does not exist. 2017-12-21 Richard Frith-Macdonald * Source/NSSocketPort.m: * Source/NSMessagePort.m: * Source/win32/NSMessagePort.m: There is a possible race condition when attempting to write a message to a port; the port handle is added to the run loop and then the loop is entered, but if an event occurs in the loop which invalidates the handle and causes it to be removed from the loop before the lower level code to wait for I/O is entered, the loop may never receive an event on the handle and could wait indefinitely. The solution is not to remove the handle from the loop when it is invalidated or when an event occurs on an invalidated handle, but only remove it in the method which added it. Of course, this means we must make certain to remove it when we should, which means that the loop must be run inside an exception handler which makes sure to remove the handle from the loop before re-raising the exception. 2017-12-31 Ivan Vucica * ANNOUNCE * NEWS * Documentation/ReleaseNotes.gsdoc * Documentation/news.texi: Update release notes for 1.25.1 to take note of compatibility improvement changes since release notes were written, and to fix a typo. 2017-12-21 Riccardo Mottola * Source/NSObject.m: Cleanup previous commit. 2017-12-21 Riccardo Mottola * Source/NSObject.m: Compatibility for OS/compiler not supporting weak symbols. 2017-12-20 Richard Frith-Macdonald * configure.ac: Remove obsolete --enable-objc-nonfragile-abi flag when building for ng. * configure: regenerate 2017-12-19 Richard Frith-Macdonald * Version: 1.25.1 release * Documentation/ReleaseNotes.gsdoc: update for release * Documentation/news.texi: update for release * ANNOUNCE: regenerate * INSTALL: regenerate * NEWS: regenerate * README: regenerate 2017-12-18 Graham Lee * Source/NSJSONSerialization.m: Fix for bug #12 on github. This makes sure that unsigned integer types are written as such, avoiding a potential overflow. * Tests/base/NSJSONSerialization/tests00.m: Test case for above. 2017-12-17 David Chisnall * Source/NSObject.m: Refactor refcount usage. This makes it easier for the runtime to change how reference counts are stored by removing any refcount manipulation from -base when the runtime provides accessors. This should have no functionality change with existing runtimes, but will let newer runtimes drop in alternative representations easily. 2017-12-03 Fred Kiefer * Headers/Foundation/NSFileManager.h * Source/NSFileManager.m: Correct setting the delegate. Add new symbolic link method. 2017-11-16 Richard Frith-Macdonald * Source/NSArray.m: Fix for bug reported on github by zneak. 2017-11-04 Fred Kiefer * Source/GSLocale.m: Protect against GSPrivateNativeCStringEncoding() corrupting the return value of setlocale(). Bug #52331 reported by Jakub Wilk . 2017-10-26 Stefan Bidigaray * Source/NSDateFormatter.m: Fix how UDateFormat is created. Fixes bug #52011. 2017-09-06 Richard Frith-Macdonald * Source/NSThread.m: Improve handling in case where we try to perform a method in a thread and it can't be woken (the pipe to awaken the run loop is full). Instead of blocking forever, give up after a second. Typically pipe buffers are from 4KB to 64KB so a full buffer almost certainly indicates that the thread is hung. 2017-08-24 Stefan Bidigaray * Source/NSLocale.m: Fix bug in ISO code methods. 2017-08-21 Richard Frith-Macdonald * Source/NSURLProtocol.m: Fixed error where the presence of a Location error was taken to indicate a redirect rather than looking at the HTTP status code for a 3xx value. 2017-08-16 Daniel Ferreira * Headers/Foundation/NSURLDownload.h: As of macOS 10.7, NSURLDownloadDelegate is exposed formally as a protocol. This adds the declaration to make this true for GNUstep. 2017-08-15 Daniel Ferreira * Headers/Foundation/NSTextCheckingResult.h: Define missing constants in the NSTextCheckingResult header. 2017-08-04 Daniel Ferreira * Headers/Foundation/NSObjCRuntime.h: Add empty definitions for OSX Availability macros for compatibility purposes. 2017-07-10 Wolfgang Lux * Source/GSString.m (lengthUTF8): Characters outside the BMP cannot be converted to Latin 1 string encoding either. * Tests/base/NSString/pairs.m (main): * Tests/base/NSString/unichar_const.m: Add test cases. 2017-07-07 Riccardo Mottola * Source/NSProcessInfo.m: Fix GetTickCount()/GetTickCount64() for different Windows versions. 2017-07-04 Richard Frith-Macdonald * Source/NSObject.m: When an object's retain count is incremented too far, track it so that we only raise an exception about it once (and make the exception message more informative so we can more easily tell what object has been leaked). 2017-06-29 Daniel Ferreira * Headers/Foundation/NSFileManager.h * Source/NSFileManager.m: Implement a method for getting attribytes of a file system path. Reuse the implementation of -fileSystemAttributesAtPath: for this purpose but export the last system errors to the caller. Make -fileSystemAttributesAtPath: use the new implementation, without exposing error info to the caller. 2017-06-29 Daniel Ferreira * Headers/Foundation/Foundation.h * Headers/Foundation/NSFileCoordinator.h * Headers/Foundation/NSFilePresenter.h * Headers/Foundation/NSFileVersion.h * Headers/Foundation/NSURLSession.h * Source/GNUmakefile * Source/NSFileCoordinator.m * Source/NSFileVersion.m * Source/NSURLSession.m: Generate class stubs (without any method definition) for NSFileCoordinator, NSFilePresenter, NSFileVersion and NSURLSession. 2017-06-29 Daniel Ferreira * Headers/Foundation/NSURLConnection.h: Currently, NSURLConnectionDelegate methods were defined as a category of an NSObject. The same definitions were copied over to a new NSURLConnectionDelegate protocol, introduced in OSX 10.7. 2017-06-29 Daniel Ferreira * Headers/Foundation/NSURLCredential.h * Source/NSURLCredential.m: Declare the NSURLCredentialPersistenceSynchronizable enumeration case to NSURLCredential persistence options. Since GNUstep does not support iCloud synchronization for credentials, this case will default to NSURLCredentialPersistencePermanent. 2017-06-29 Daniel Ferreira * Headers/Foundation/NSURLProtectionSpace.h * Source/GSHTTPAuthentication.m * Source/NSURLProtectionSpace.m: Improve handling of NSURL authentication methods. Make "HTMLForm" authentication a no-op as it should be instead of making it fall back to Basic authentication. Add stubs for NTLM and Negotiate IIS methods. They should be easily implementable given the current framework for authentication methods. Add stubs for ClientCertificate and ServerTrust authentication methods. A blocker for supporting them is the lack of a Security.framework implementation (since they rely on SecTrustRef). They would also require additions to the current SSL handling code for GNUstep https requests. Also stub the -distinguishedNames property of NSURLProtectionSpace, which also deals with certificate-related authentication methods. 2017-06-29 Daniel Ferreira * Headers/Foundation/NSURLRequest.h: Add new values for the NSURLCachePolicy enum. Although NSURLRequestReloadIgnoringLocalAndRemoteCacheData and NSURLRequestReloadRevalidatingCacheData have been left unimplemented, the same applies for the reference platform, so not supporting it does not break API compatibility. 2017-06-29 Daniel Ferreira * Headers/Foundation/NSZone.h: Implement NSMakeCollectable(), an interface which makes CoreFoundation objects eligible for garbage collection. Since garbage collection is a totally deprecated API, and support has now been removed from GNUstep, its implementation is a no-op. 2017-06-29 Daniel Ferreira * Headers/Foundation/NSProcessInfo.h * Source/NSProcessInfo.m: Add stubs for sudden termination APIs and for application activity management methods. 2017-06-29 Daniel Ferreira * Headers/Foundation/NSProcessInfo.h * Source/NSProcessInfo.m * Tests/base/NSProcessInfo/general.m: Introduce the systemUptime property to NSProcessInfo, which can compute platform-independently what is the uptime of the system. 2017-06-29 Daniel Ferreira * Source/NSHTTPCookie.m * Tests/base/NSHTTPCookie/basic.m: Fix a bug in NSHTTPCookie's Set-Cookie parser where it would fail to parse more than one key-only cookie (such as "Secure; HTTPOnly;") in a header. 2017-06-29 Daniel Ferreira * Headers/Foundation/NSHTTPCookie.h * Source/NSHTTPCookie.m * Tests/base/NSHTTPCookie/basic.m: Add support for parsing HTTPOnly cookies (those that cannot be accessed by clients). Implement -[NSHTTPCookie isHTTPOnly]. 2017-06-29 Daniel Ferreira * Headers/Foundation/NSHTTPCookie.h: Make -[NSHTTPCookie isSessionOnly] and -[NSHTTPCookie isSecure] methods become properties if possible, so that they can be also queried as `cookie.sessionOnly` and `cookie.secure`. This increases compatibility with applications that rely on this notation. 2017-06-29 Daniel Ferreira * Headers/Foundation/NSFileManager.h * Source/NSFileManager.m: Create NSFileManagerDelegate, a more modern manner to verify whether to proceed a file operation after an error or whether an operation should actually be performed by NSFileManager. No functionality using the delegate is yet implemented. 2017-06-29 Daniel Ferreira * Headers/Foundation/NSURL.h * Source/NSURL.m * Source/externs.m: Create an unimplemented stub for NSURL's -getResourceValue:... method, which can gather a numerous set of information about a URL. Define the constants which are passed into -getResourceValue:... for requiring information so that a build that relies on this method does not break. 2017-06-29 Daniel Ferreira * Headers/Foundation/NSURL.h: Create the NSURL.fileURL property to increase compatibility with applications that rely on this. 2017-06-29 Daniel Ferreira * Headers/Foundation/NSURL.h * Source/NSURL.m: The OSX filesystem implements "aliases", a species of symlink which tracks its source if it was moved. Create stubs for the NSURL functions which handle these aliases. 2017-06-29 Daniel Ferreira * Headers/Foundation/NSURL.h * Source/NSURL.m: Implement +[NSURL fileURLWithPath:isDirectory:], a class method added in OSX 10.5, which was missing from the implementation. 2017-06-29 Daniel Ferreira * Headers/Foundation/NSCoder.h * Headers/Foundation/NSObject.h * Source/NSCoder.m * Source/NSKeyedUnarchiver.m: Implement stubs for NSSecureCoding which do not break projects that rely on it. 2017-06-29 Daniel Ferreira * Headers/Foundation/NSDate.h * Source/NSDate.m: Declare a system clock change notification. Base still does not emit this notification, but this allows applications that wait for it not to have their build broken. 2017-06-29 Daniel Ferreira * Headers/Foundation/NSObjCRuntime.h: Create the NS_ROOT_CLASS macro, a wrapper around the objc_root_class compiler attribute. 2017-06-29 Daniel Ferreira * Headers/Foundation/NSObjCRuntime.h: Make NS_AVAILABLE and NS_CLASS_AVAILABLE macros no-ops so that their absence does not break projects that rely on it. 2017-06-29 Daniel Ferreira * Headers/Foundation/NSCalendar.h: Update NSCalendarUnit definitions with a newer specification from Cocoa. 2017-06-29 Daniel Ferreira * Headers/Foundation/NSCalendar.h: Add the NSCalendarOptions enum to NSCalendar for compatibility purposes. While NSCalendar does not yet know how to handle them, it will not generate build errors in projects that attempt to use them. 2017-06-29 Daniel Ferreira * Headers/Foundation/NSCalendar.h * Source/NSCalendar.m * Source/NSLocale.m: Add new calendar identifier constants to NSCalendar, to add compatibility for newer OSX applications. Some identifiers do not hold parity with the older equivalents and have been left unimplemented, with the gregorian calendar as a fallback. 2017-06-29 Daniel Ferreira * Headers/Foundation/NSGeometry.h * Source/NSGeometry.m * Tests/base/Functions/NSGeometry1.m: Create the NSEdgeInsets struct in NSGeometry, introduced in OSX 10.7. Add helper functions for creating these insets. This struct is not used in Base. Rather, it is used as part of newer APIs in GUI. 2017-06-29 Daniel Ferreira * Headers/Foundation/FoundationErrors.h: Create a no-file-exists error to the FoundationErrors enums. No function is yet implemented to throw this error, but it has been added for compatibility with applications that handle it. 2017-06-29 Daniel Ferreira * Headers/GNUstepBase/GSVersionMacros.h: To keep compatibility with compilers prior to Objective-C 2.0 support, added in the GCC 4.6 series, we are unable to always declare @property attributes in classes. However, compatibility with dot-syntax applications require us to define properties if we can. We already had some checks for the GS_HAS_DECLARED_PROPERTIES macro to see whether we could or could not declare properties (or whether we should fall back to manual getter/setter defining). However, it seems this macro never got defined. This commit adds this macro, checking whether we possess either GCC >= 4.6 or Clang. 2017-06-29 Daniel Ferreira * .gitignore: Create a .gitignore file to ease Base development using the Git version control system. This stops object files, automake products and test files from being accidentally inserted into the tree. 2017-06-21 Richard Frith-Macdonald * Source/NSDistributedLock.m: Revert recent changes to use O/S specific system calls, and depend on new behavior of the -createDirectoryAtPath:attributes: method instead. Add comment. 2017-06-18 Richard Frith-Macdonald * Source/NSFileManager.m: Make directory creation semantics match OSX * Tests/base/NSFileManager/general.m: Add directory creation testcases * Tests/base/NSDistributedLock/basic.m: Cleanup lock after tests 2017-06-17 Richard Frith-Macdonald * Headers/GNUstepBase/GSIMap.h: Fix GSI_MAP_NODE_IS_EMPTY macros as suggested by Daniel Ferreira 2017-06-16 Richard Frith-Macdonald * Source/NSDistributedLock.m: Change code to create lock directory directly rather than via the NSFileManager methods since Wolfgang pointed out that those methods consider a pre-existing directory to have been successfully created, but the distributed locking logic supposes that an attempt to create an existing directory will fail. * Tests/base/NSDistributedLock: * Tests/base/NSDistributedLock/TestInfo: * Tests/base/NSDistributedLock/basic.m: Add a few simple testcases for NSDistributedLock. 2017-05-19 Richard Frith-Macdonald * Headers/Foundation/NSFileHandle.h: * Source/GSSocketStream.m: * Source/GSTLS.h: * Source/GSTLS.m: * Source/NSFileHandle.m: Add code to make the issuer and owner of a client certificate available when we require/verify an incoming certificate. 2017-05-10 Wolfgang Lux * Tools/gdomap.c (nameServer, donames): Fix incorrect use addresses returned from getaddrinfo. 2017-04-24 Richard Frith-Macdonald * Tools/AGSOutput.m: When generating class/method links, treat '[' as the start of a class/method only if it's the start of a comment or is preceded by white space ... allows array syntax like foo[x] to be used in a comment without attempting to link to a class named 'x'. 2017-04-14 Richard Frith-Macdonald * Version: 1.25.0 release * Documentation/ReleaseNotes.gsdoc: update for release * Documentation/news.texi: update for release * ANNOUNCE: regenerate * INSTALL: regenerate * NEWS: regenerate * README: regenerate 2017-04-09 Richard Frith-Macdonald * Source/NSPredicate.m: * Tests/base/NSPredicate/basic.m: Fixes for bug #47618. 2017-04-09 Richard Frith-Macdonald * Headers/Foundation/NSTask.h: * Source/NSTask.m: Apply OSX compatibility fix for NSTask notifications (bug #49021) by Larry Campbell. 2017-04-03 Richard Frith-Macdonald * Source/NSOperation.m: Fix leak spotted by David Lobron. 2017-04-01 Riccardo Mottola * Source/NSConnection.m Correct format specifier to char* 2017-03-17 Riccardo Mottola * Source/NSFileManager.m:(nextObject of Enumerator) Skip file if no valid filename could be retrieved most probably due to Charset mismatches, this is is more a last resort: probably a lossy conversion should be attempted before. 2017-03-17 Richard Frith-Macdonald * Source/NSTimeZones/NSTimeZones.tar: Updated with latest information. 2017-03-17 Richard Frith-Macdonald * Source/Additions/Unicode.m: Implement NSNonLossyASCIIStringEncoding in a manner compatible with OSX. Added regression tests. 2017-02-11 Wolfgang Lux * Source/GSICUString.m (UTextNSStringAccess, UTextInitWithNSMutableString, UTextInitWithNSString): Fix a serious misunderstanding of the icu string access API: The value of nativeIndexingLimit must not exceed the length of the current chunk. Otherwise icu library macros could miss to properly reinitialize chunks, which, for instance, could lead to returning regular expression matches outside the selected range. 2017-01-06 Richard Frith-Macdonald * Tools/gdomap.c: Use getaddrinfo rather than gethostbyname if available (bug #50032). 2016-12-06 Richard Frith-Macdonald * Tools/AGSParser.m: Fix missing line preventing documentation of enumeration constants. 2016-11-28 Wolfgang Lux * Source/Additions/NSCalendarDate+GNUstepBase.m (weekOfYear): Fix an off by 1 calculation which meant that weekOfYear would return 2 for the first week of a year whenever the first Thursday of that year is 7 Jan, for instance 2016. 2016-11-10 Richard Frith-Macdonald * Source/NSPortCoder.m: * Source/NSUnarchiver.m: Fix for logic error decoding archives created by a machine with a different word size. Was checking the size of the encoded scalar item, but not against the *local* size of the same type. 2016-11-08 Richard Frith-Macdonald * Source/NSObject.m: Fix error in last mod ... was calculating opbject layout incorrectly when fast-ARC moce used on 64bit system. Also simplified by removing special case optimising for single-threaded programs and use inline decrement to improve performance of release. 2016-10-28 Niels Grewe * Source/NSObject.m: Re-enable fast-ARC mode when memory layout and atomic operations support permit. This changes the size of the field where the reference count is stored to the size of a pointer in some configurations. The effective maximum reference count is still 2^24 - 1. 2016-10-27 Wolfgang Lux * Source/NSObject.m: Comment out _ARCCompliantRetainRelease for now because the retain count representation in gnustep-base and libobjc2 differs causing space leaks on 64-bit architectures. 2016-10-24 Richard Frith-Macdonald * Source/NSData.m: Only atempt to read regular files into NSData, * Source/NSMessagePortNameServer.m: Ignore lock directories in the 'names' directory. * Source/NSTask.m Increase files to close from 256 to 2048 to better reflect typical modern system limits. All changes for problems spotted by Wolfgang. 2016-10-21 Richard Frith-Macdonald * Headers/Foundation/NSDate.h: Add documentation * Source/NSDate.m: Tidy up and remove a little redundant code. * Source/NSRunLoop.m: Tidy up and empty autorelease pool more often. * Source/NSTimer.m: Tidy a little and improvde -description 2016-10-14 Richard Frith-Macdonald * Headers/GNUstepBase/GSTLS.h: * Source/GSTLS.m: Fix for double free issues when assigning certificat/key to credentials fails. 2016-10-12 Niels Grewe * Source/NSRegularExpression.m: Fix crashes in libicu due to * ignored error codes. Also fix a few memory leaks. * Tests/base/NSRegularExpression/basic.m: Test cases for this. 2016-10-11 Niels Grewe * Source/GSTLS.m * configure.ac * Headers/GNUstepBase/config.h.in: Check for gnutls_x509_privkey_import2() and use it if available. * configure: Regenerate * Tests/base/GSTLS: Test case for loading an OpenSSL encrypted private key. 2016-10-05 Richard Frith-Macdonald * Source/NSFileManager.m: Check for modification of source file during copy. 2016-10-05 Richard Frith-Macdonald * Source/Additions/Unicode.m: Permit noncharacter unicode codepoints * Source/GSString.m: Permit noncharacter unicode codepoints * Source/NSNotificationQueue.m: Call GSPrivateCheckTasks() * Source/NSRunLoop.m: Let GSPrivateNotifyASAP() check for task exit. 2016-09-19 Niels Grewe > * Source/Additions/GSMime.m (charsetForXml): Fix detection of charset in XML document. * Tests/base/GSMime/xml-charset.m: Test case. 2016-09-16 Wolfgang Lux * Source/Additions/GSMime.m (convertTo7BitSafe): Add missing checks to avoid calling caseInsensitiveCompare: with a nil argument. 2016-09-16 Niels Grewe * Source/GSTLS.m: Fix bug removing mapped certificates. 2016-09-06 Richard Frith-Macdonald * Headers/Foundation/NSScanner.h: * Source/NSScanner.m: * Tests/base/NSScanner/test01.m: Add support for scanHexLongLong method inspired/based on patch from Abbas Raza, but with minor bugfixes, reduced code duplication, and avoiding compiler warnings. 2016-08-30 Abbas Raza * Source/NSJSONSerialization.m: Generate NSError rather than raising exception if the trailing '"' in the dsocument is missing. 2016-08-28 Richard Frith-Macdonald * Source/GSMime.m: Fix typo which was causing premature termination of long headers. 2016-08-19 Richard Frith-Macdonald * config/objc-common.g: Darwin patch by David Wetzel * Source/CompatibilityHeaders.make: Delete obsolete file * configure.ac: Check for libdispatch runloop integration functions * Headers/GNUstepBase/GSConfig.h.in: New define for libdispatch * config.mak.in: New define for libdispatch * Tests/base/NSRunLoop/dispatch.m: Use new define * configure: Regenerate * Source/Additions/Makefile.preamble: * Source/GNUmakefile: * Source/Makefile.postamble: * Source/Makefile.preamble: * Source/ObjectiveC2/Makefile.preamble: * Source/unix/Makefile.preamble: * Source/win32/Makefile.preamble: * Tools/Makefile.preamble: * Tools/make_strings/GNUmakefile.preamble: Mostly tweaks for building cleanly non-flattened and removal of a few long deprecated directories/headers. Configuration time change by David Wetzel for building on OSX 2016-07-27 Niels Grewe * Header/Foundation/NSData.h * Source/NSData.m: Make the deallocator block a direct ivar of NSDataMalloc (or NSMutableDataMalloc respectively). Breaks binary compatibility but avoids reallocating objects based on the initializer used. 2016-07-26 Niels Grewe * Source/NSDictionary.m * Tests/base/NSDictionary/general.m: Fix -getObjects:andKeys: 2016-07-26 Niels Grewe * Headers/Foundation/NSData.h * Source/NSData.m * Tests/base/NSData/general.m: Implement OS X 10.9 method -initWithBytesNoCopy:length:deallocator: that allows customising data deallocation based on a caller supplied block. Also adds test cases for this functionality. 2016-07-26 Richard Frith-Macdonald * Source/GSStream.m: * Source/GSSocketStream.m: In -close we should close the underlying file descriptor (even if the stream has not formally been opened yet) to ensure we don't leak it. In -dealloc, if the file descriptor still exists, we should call the -close method. 2016-07-26 Richard Frith-Macdonald * Source/Additions/NSObject+GNUstepbase.m: use separate lock to protect at exit methods ... avoid conflict/deadlock with multithreaded notification change. 2016-07-18 Larry Campbell * Source/NSThread.m: Send notification about becoming multithreaded when the new thread is registered from outside our API. 2016-07-18 Richard Frith-Macdonald * Source/NSOperation.m: avoid sorting the queue ... keep the array of waiting operations sorted by inserting new operations at the correct position and observing the queuePriority of waiting operations (and re-positiuoning them in the waiting array as necessary). Fix for scalability problem (bug #47926) 2016-07-16 Richard Frith-Macdonald * Source/win32/GSRunLoopCtxt.m: fix bug in return value when polling. The poll method must return YES if any input source fired, including handling of windows messages which are already available and require no wait. 2016-07-15 Richard Frith-Macdonald * configure.ac: * Headers/GNUstepBase/config.h.in: * Source/GSQuickSort.m: * Source/GSShellSort.m: * Source/GSSorting.h: * Source/GSTimSort.m: * Source/NSSortDescriptor.m: Make sorting algorithms selectable at runtime rather than compile time. 2016-07-13 Richard Frith-Macdonald * Source/NSRunLoop.m (-acceptInputForMode:beforeDate:): Closer to OSX behavior ... when accepting input we should fire all timers (possibly repeatedly) since a timer is not counted as an input source. Also simplify housekeeping timer so that it will keep loops running as it does on OSX. 2016-07-12 Niels Grewe * Headers/Foundation/NSObjCRuntime.h * Headers/GNUstepBase/GNUstep.h: Add NS_DESIGNATED_INITIALIZER macro 2016-07-12 Richard Frith-Macdonald * Source/GSICUString.m (UTextNSStringAccess): Fix to use signed integer variables so all the comparisons with zero as a boundary actually work as intended etc (spotted by Wolfgang). * Source/NSRunLoop.m: Closer to OSX behavior ... a nil date is treated like a date in the distant past (ie loop terminates at once), and the (-runUntilDate:) method fires any pending timers when given a date in the past. 2016-07-12 Wolfgang Lux * Source/GSICUString.m (UTextNSStringAccess): Fix unsigned comparison to properly detect integer underflows. 2016-07-06 Niels Grewe * Tests/base/NSRegularExpression/basic.m: Test for -pattern double free. 2016-07-06 Wolfgang Lux * Source/NSRegularExpression.m (-pattern): Fix bug where a UText structure owned by the icu library is incorrectly closed, which was causing a crash when -pattern is called more than once for the same NSRegularExpression. 2016-07-02 Richard Frith-Macdonald * Source/NSKeyValueObserving.m: Remove some unnecessary locking * Source/NSOperation.m: Simplify handling of finishing of operation to avoid occasional deadlock if an operation finishes in one thread while in another thread we are waiting for it. 2016-07-01 Richard Frith-Macdonald * Source/GSICUString.m: For immutable strings, cache the string length in the UText structure to avoid repeated calls to -length 2016-06-30 Richard Frith-Macdonald * Source/GSICUString.m: Re-implement the function to let ICU access the contents of an NSString. The original version looks like it was broken for cases where an algorithm is moving backwards in the string (reverse search and regular expression parsing). I hope the new implementation is correct (or at least clearer); the ICU documentation is minimal and I didn't find any reference/example implementations to work from. 2016-06-28 Richard Frith-Macdonald * Source/NSDebug.m: Yse setjmp/longjmp from NSException.h * Headers/Foundation/NSException.h: On mingw-w64 use the builtin setjmp/longjmp provided by gcc since the mingw version sometimes crashes. 2016-06-28 Richard Frith-Macdonald * SSL: Openssl bundle directory deleted * GNUmakefile: Don't build openssl bundle * Source/NSFileHandle.m: Don't load openssl bundle * configure.ac: remove option to build bundle * configure: regenerate * Documentation/ReleaseNotes.gsdoc: * Documentation/install.texi: * Documentation/news.texi: * Documentation/readme.texi: Updates to note that the obsolete openssl bundle has been removed. 2016-06-26 Richard Frith-Macdonald * Headers/Foundation/NSTask.h: * Source/NSTask.m: * Tests/base/NSTask/general.m: * Tests/base/NSTask/notify.m: Add -terminationReason method from OSX10.5 2016-06-25 Richard Frith-Macdonald * Source/NSMessagePort.m: * config/config.reuseaddr.c: Hack to work around Hurd local domain socket bug. Plus don't try to set SO_REUSEADDR on local domain sockets anyway. 2016-06-25 Richard Frith-Macdonald * Documentation/Base.gsdoc: * Documentation/ReleaseNotes.gsdoc: * Documentation/news.texi: * Source/Makefile.postamble: * Source/NSBundle.m: * Source/NSPathUtilities.m: * Source/NSTask.m: * Source/NSThread.m: * configure: * configure.ac: When using non-flattened environment, the subdirectory name for libraries/binaries is changed for Debian compatibility (and simplicity) to use a directory whose name is of the form architecture/library-combo rather than nested directories of the form cpu/os-abi/library-combo. The architecture name format is a sanitised triplet cpu-os-abi (where previously we had cpu/os-abi). These changes are the first step in making GNUstep work seamlessly with Debian multiarch. To use them you will need to rebuild your entire gnustep installation using a version of gnustep-make which has correspoinding changes to know where to install bbinaries and resources. However, the changes should have no effect on a flattened installation (currently the default). 2016-06-24 Richard Frith-Macdonald * Source/NSDistributedNotificationCenter.m: Double timeout from five to ten seconds when waiting for the server to become reachable. * Tools/gdnc.m: Auto-stop 15 seconds after the last client disconnects rather than immediately ... allowing other clients time to connect. Changes to reduce the chance of gdnc failure on a slow system where the server is not running as a daemon. 2016-06-23 Richard Frith-Macdonald * Source/GSString.m: Optimise getting ascii or utf8 characters from a literal string. 2016-06-22 Richard Frith-Macdonald * Source/NSObject.m: Make sure we treat the reference count as a 32bit integer everywhere, so that atomic operations operate on the correct value on big endian CPUs with different word sizes. * Source/NSOperation.m: When starting an operation, have it retain itself in case it'ss removed from the queue and released while running. * Headers/Foundation/NSDistributedLock.h: Add lock ivar. * Source/NSDistributedLock.m: Make class thread-safe using lock. * Source/Tests/base/KVC/mutable.m: Fix 64bit error in method types. 2016-06-19 Richard Frith-Macdonald * Source/cifframe.m: Use sizeof(NSInteger) as the buffer size for small scalars if we are on an LP64 machine. * Source/NSOperation.m: Retain operation while taking it from queue, releasing after it is finished. Prevent crash if the original owner of the operation releases it while it's in the queue. 2016-06-17 Richard Frith-Macdonald * Source/GSHTTPURLHandle.m: * Source/NSURLprotocol.m: When sending HTTP headers, use RFC2047 rules (as specified in HTTP/1.1 RFC2616) to encode non-ascii characters. 2016-06-17 Niels Grewe * Headers/Foundation/NSRegularExpression.h * Source/NSRegularExpression.m * Tests/base/NSRegularExpression/basic.m: Implement resource limits for regular expression evaluation. Tweaked to roughly match the Cocoa behaviour, but can be changed through the GSRegularExpressionWorkLimit user default. 2016-06-17 Niels Grewe * Source/NSRegularExpression.m: Implement -isEqual: and -hash * Tests/base/NSRegularExpression/basic.m: Test NSCopying 2016-06-14 Richard Frith-Macdonald * Source/GSSocketStream.m: Fix for failure of connect() call. * Source/GSStream.m: Fix event handling for failed streams. * Tests/NSURLConnection/test01.m: Add testcases, fix reset of delegate. Fixes for kfreebsd network stack being clever enough to fail the connect() call if the remote port is on the same machine and has no process listening on it. Reported by Heintzmann 2016-06-08 Richard Frith-Macdonald * Documentation/Base.gsdoc: * Documentation/ReleaseNotes.gsdoc: * Documentation/news.texi: Documentation/release notes preparation for next release. * Source/Makefile.postamble: * Source/NSBundle.m: * Source/NSPathUtilities.m: * Source/NSString.m: * Source/NSTask.m: * configure.ac: Changes to use the new multiarch path component cpu-host rather than a host subdirectory inside a cpu directory. * configure: Regenerate 2016-06-07 Richard Frith-Macdonald * Source/Additions/GSMime.m: Fix output conversion to 7bit to work for quoted-printable. Also, when generating headers, generate conventionally capitalised names. 2016-06-06 Richard Frith-Macdonald * Source/Additions/GSMime.m: Conversion of multipart document between base64 and binary encoding should use quoted-printable rather than base64 for text parts. Rename -convertToBase64 to be -convertTo7BitSafe instead. 2016-05-27 Niels Grewe * Tools/AGSParser.m: Ignore __asm__ directives 2016-05-19 Seong Gu Lee * GNUmakefile: * Source/Additions/Makefile.preamble: * Source/ObjectiveC2/Makefile.preamble: * Source/unix/Makefile.preamble: * Source/win32/Makefile.preamble: mingw64 tweaks 2016-05-18 Richard Frith-Macdonald * Source/NSPredicate.m: attempt fix for bug #47619 2016-05-18 Eric Heintzmann * ChangeLog.2: * Documentation/news.texi: * Headers/Foundation/NSAutoreleasePool.h: * NEWS: * Source/GSSocksParser/GSSocksParser.m: * Source/NSAutoreleasePool.m: * Source/NSConnection.m: * Source/NSKeyedUnarchiver.m: * Tools/AGSParser.m: Fix typos andss spelling erros, including the setPoolCountThreshold: method. 2016-05-15 Richard Frith-Macdonald * Documentation/manual/manual.texi: * Source/GSSocksParser/GSSocks4Parser.m: * Source/GSSocksParser/GSSocks5Parser.m: * Tools/pldes.1: Trivial fixes based on debian package. 2016-05-14 Richard Frith-Macdonald * Headers/GNUstepBase/config.h.in: * Source/NSException.m: * configure.ac: * configure: Make USE_BFD control usage of libbfd and replace runtime warning with a configure time warning about the license issue. 2016-05-14 Richard Frith-Macdonald * Headers/Foundation/NSNotification.h: * Headers/Foundation/NSZone.h: * Headers/GNUstepBase/GSConfig.h.in: * Source/GSQuickSort.m: * Source/GSString.m: * Source/GSTimSort.m: * Source/NSAutoreleasePool.m: * Source/NSConcretePointerFunctions.h: * Source/NSGarbageCollector.m: * Source/NSNotificationCenter.m: * Source/NSObject.m: * Source/NSThread.m: * Source/NSZone.m: Completed(?) removal of GC support. Plus various minor reorganisations to avoid compiler warnings. 2016-05-13 Richard Frith-Macdonald * Source/Additions/GSMime.m: Fix bug encoding very long headers with no whitespace to fold on. * Source/NSThread.m: Avoid use of autorelease pool when setting the name of the thread (fix pointless warnings logs spotted by Wolfgang). 2016-05-06 18:03-EDT Gregory John Casamento * Headers/Foundation/NSString.h: Add containsString: * Headers/GNUstepBase/GSVersionMacros.h: Add 10.10 and 10.11 macros. * Source/NSString.m: Add containsString: implementation. 2016-04-28 Richard Frith-Macdonald * Source/NSAutoreleasePool.m: Check for a pool being deallocated when it has already been deallocated (and raise an exception). 2016-04-23 Marcus Mueller * Source/GSAvahiNetService.m: Avahi-based NSNetServices did crash upon publishing if Avahi daemon did not run. Hardened code for this case which also works correctly if daemon is started later on. 2016-04-08 Richard Frith-Macdonald * Source/NSUserDefaults.m: Remove redundant code. Log domain names when debug is enabled. 2016-04-08 Riccardo Mottola * Source/NSUserDefaults.m: Skip nil domains explicitely and do not use nil values to look them up. 2016-04-04 Niels Grewe * configure.ac: Check for runloop integration hooks in libdispatch * configure * Headers/GNUstepBase/config.h.in * SSL/config.h.in * SSL/configure: Regenerate * Source/NSRunLoop.m: If available, monitor the file descriptor for the libdispatch main queue and drain it when it becomes readable. * Tests/base/NSRunLoop/dispatch.m * Tests/base/NSRunLoop/GNUmakefile.preamble: Tests for libdispatch runloop integration 2016-03-25 Richard Frith-Macdonald * Headers/Foundation/NSObject.h: * Headers/GNUstepBase/GNUstep.h: * Headers/GNUstepBase/GSConfig.h.in: * Headers/GNUstepBase/GSIArray.h: * Headers/GNUstepBase/GSIMap.h: * Source/Additions/GCDictionary.m: * Source/Additions/GSLock.m: * Source/Additions/GSMime.m: * Source/Additions/GSObjCRuntime.m: * Source/Additions/Unicode.m: * Source/GSArray.m: * Source/GSAttributedString.m: * Source/GSConcreteValueTemplate.m: * Source/GSCountedSet.m: * Source/GSDictionary.m: * Source/GSHTTPAuthentication.m: * Source/GSRunLoopCtxt.h: * Source/GSSet.m: * Source/GSString.m: * Source/NSArchiver.m: * Source/NSArray.m: * Source/NSAutoreleasePool.m: * Source/NSCalendar.m: * Source/NSConcreteHashTable.m: * Source/NSConcreteMapTable.m: * Source/NSConcretePointerFunctions.h: * Source/NSConcretePointerFunctions.m: * Source/NSConnection.m: * Source/NSCountedSet.m: * Source/NSData.m: * Source/NSDebug.m: * Source/NSDictionary.m: * Source/NSDistributedNotificationCenter.m: * Source/NSFileManager.m: * Source/NSGarbageCollector.m: * Source/NSHashTable.m: * Source/NSIndexSet.m: * Source/NSKeyValueObserving.m: * Source/NSKeyedArchiver.m: * Source/NSKeyedUnarchiver.m: * Source/NSMapTable.m: * Source/NSMessagePort.m: * Source/NSNotificationCenter.m: * Source/NSNotificationQueue.m: * Source/NSObject.m: * Source/NSPointerArray.m: * Source/NSPortCoder.m: * Source/NSProxy.m: * Source/NSRunLoop.m: * Source/NSSerializer.m: * Source/NSSet.m: * Source/NSSocketPort.m: * Source/NSString.m: * Source/NSThread.m: * Source/NSTimeZone.m: * Source/NSURL.m: * Source/NSURLConnection.m: * Source/NSURLProtocol.m: * Source/NSUnarchiver.m: * Source/NSZone.m: * Source/callframe.m: * Source/unix/GSRunLoopCtxt.m: * Source/win32/GSRunLoopCtxt.m: * Tools/AGSHtml.m: * Tools/AGSOutput.m: * Tools/AGSParser.m: * Tools/autogsdoc.m: * Tools/gdnc.m: * Tools/make_strings/make_strings.m: * configure.ac: * macosx/config.h: Removal of garbage collection support. 2016-03-25 Richard Frith-Macdonald * Source/NSNumber.m: Attempt to fix endianness archiving issue. 2016-03-23 Richard Frith-Macdonald * Source/NSPropertyList.m: Remove unused function. Change binary plist generation to return NO if our index table needs to grow, rather than raising exceptions during normal operation. 2016-03-20 Richard Frith-Macdonald * Documentation/ReleaseNotes.gsdoc: * Documentation/news.texi: * ANNOUNCE: * NEWS: * NSTimeZones/NSTimeZones.tar: * Tools/AGSParser.m: * Version: Update version for new release. Add short news/announce entries. Update timezone information to latest IANA data. Add simple support for generics to autogsdoc. 2016-03-18 Richard Frith-Macdonald * Source/NSUserDefaults.m: Wait longer for locks on slow systems Improve tracking of changes in persistent domains. 2016-03-17 Richard Frith-Macdonald * Headers/GNUstepBase/GSXML.h: * Source/Additions/GSXML.m: * Source/GSHTTPURLHandle.m: * Source/NSConnection.m: * Source/NSDistantObject.m: * Source/NSURLHandle.m: * Source/NSURLRequest.m: Make -setDebug: consistently set/return an integer even if the underlying meaning is boolean. Avoid compiler warnings when calling the method on an id and signature is not known. 2016-03-15 Richard Frith-Macdonald * Source/NSCalendarDate.m: * Source/NSTimeZone.m: Use NSInteger conmsistently (don't mix with int). 2016-03-14 Richard Frith-Macdonald * Source/NSUserDefaults.m: Log if we break the lock. * Source/NSDistributedLock.m: Unlock if dealloc'ed while locked. 2016-03-12 Richard Frith-Macdonald * Source/NSUserDefaults.m: Remove five year old code for converting old style single defaults file to new style (one file per domain). Add some thread safety locks for distriobuted locking in case some thread issue is causing Riccardo's problem. 2016-03-11 Niels Grewe * Headers/Foundation/NSPredicate.h: Include NSString.h so that we the header knows about NSString conforming to NSCopying. 2016-03-10 Richard Frith-Macdonald * Headers/GNUstepBase/NSObject+GNUstepBase.h: * Source/Additions/GSInsensitiveDictionary.m: * Source/Additions/GSMime.m: * Source/Additions/NSObject+GNUstepBase.m: * Source/GSArray.m: * Source/GSDictionary.m: * Source/GSSet.m: * Source/GSString.m: * Source/NSArray.m: * Source/NSBundle.m: * Source/NSFileManager.m: * Source/NSJSONSerialization.m: * Source/NSPointerArray.m: * Source/NSPredicate.m: * Source/NSPropertyList.m: * Source/NSSerializer.m: * Source/NSSet.m: * Source/NSSortDescriptor.m: * Source/NSString.m: * Source/NSTimeZone.m: * Source/NSUserDefaults.m: Deprecate -makeImmutableCopyOnFail: and replace with -makeImmutable. The new method has the essential functionality of the old one, but omits the confusing ownership semantics and is therefore less likely to cause errors (and more amenable to use with ARC.) 2016-03-10 Wolfgang Lux * Headers/Foundation/NSLocale.h: * Source/NSLocale.m (+localeWithLocaleIdentifier:): Add trivial method introduced in OS X 10.6. 2016-03-09 Riccardo Mottola * Headers/Foundation/NSPathUtilities.h * Source/NSPathUtilities.m Add some new path values. 2016-03-09 Niels Grewe * Headers/Foundation/NSPredicate.h * Source/NSPredicate.m * Tests/base/NSPredicate/basic.m: Implementation and tests for +predicateWithBlock: and -evaluateWithObject:substitutionVariables: 2016-03-09 Richard Frith-Macdonald * Source/NSSocketPortNameServer.m: * Source/GSSocketStream.h: * Source/NSTimeZone.m: * Source/GSSocketStream.m: * Source/NSCalendarDate.m: * Source/NSBundle.m: * Source/NSPathUtilities.m: * Source/NSProcessInfo.m: * Source/NSSocketPort.m: * Source/GSRunLoopWatcher.m: * Source/NSUserDefaults.m: * Source/GSStream.m: * Source/NSDebug.m: * Source/GSTLS.m: * Source/NSFileHandle.m: * Source/GSHTTPURLHandle.m: * Source/NSPage.m: * Source/GSRunLoopCtxt.h: * Source/GSPrivate.h: * Source/NSInvocation.m: * Source/NSFileManager.m: * Source/objc-load.m: * Source/NSException.m: * Source/NSURL.m: * Source/NSObject.m: * Source/NSString.m: * Source/cifframe.h: * Source/Additions/NSData+GNUstepBase.m: * Source/Additions/NSError+GNUstepBase.m: * Source/Additions/NSTask+GNUstepBase.m: * Source/NSConnection.m: * Source/GSPortPrivate.h: * Source/NSThread.m: * Source/NSData.m: * Source/NSHost.m: * Source/GSNetwork.h: * Source/NSPipe.m: * Source/GSFileHandle.h: * Source/NSLog.m: * Source/GSFileHandle.m: * Source/NSTask.m: * Tests/base/NSTask/launch.m: * Tests/base/NSURL/basic.m: * Tests/base/NSURL/mystep.m: * Tests/base/NSString/test02.m: More changes to standardise on using _WIN32 define for windows. 2016-03-04 Richard Frith-Macdonald * Source/NSCalendar.m: Fix 64bit issue with undefined components. * Source/NSBundle.m: * Source/NSFileManager.m: * SSL/GSSSLHandle.m: * Headers/GNUstepBase/GSConfig.h.in: * macosx/GNUstepBase/preface.h: Standardise on using _WIN32 and _WIN64 defines, following the informal convention used by all the compilers we might be compiled with. * Source/win32/GSFileHandle.m: Various network/file bugfixes. 2016-03-01 Richard Frith-Macdonald Modifications to last batch of changes in order to get the code to build again on 32bit msys/mingw 2016-03-01 Seong Gu Lee * Headers/GNUstepBase/GSConfig.h.in: * Headers/GNUstepBase/GSTypeEncoding.h: * Source/GSFileHandle.h: * Source/win32/GSFileHandle.m: Tweaks for WIN64 build 2016-02-29 Richard Frith-Macdonald * configure.ac: * configure: * NSCalendar.m: Don't require recent ICU just for the method ([-components:fromDate:toDate:options:]). Leave the method as a no-op if older versions are used. 2016-02-29 Richard Frith-Macdonald * Source/NSFileManager.m: Based on testplant patch, fix bug with ownership when copying subdirectories. * Source/NSTask.m OSX compatibility tweak .. raise an exception if the task can't be launched. * Source/NSNumberFormatter.m: Fixes for symbol indexes. 2016-02-26 Niels Grewe * Headers/Foundation/NSObjCRuntime.h: Declare the FOUNDATION_EXPORT macro as an alias for GS_EXPORT. 2016-02-24 Richard Frith-Macdonald * Headers/Foundation/NSArray.h: * Source/NSArray.m: Correct argument types in ([-objectAtIndexedSubscript:]) and ([setObject:atIndexedSubscript:]) to match OSX. Apply patch by Patrick Laurent to fix bug setting an object at the end of the array. 2016-02-22 Niels Grewe * Headers/Foundation/NSObjCRuntime.h: Add macros for backwards- compatible generics annotations. Also define instancetype if necessary. * Headers/Foundation/NSArray.h: * Headers/Foundation/NSCache.h: * Headers/Foundation/NSDictionary.h: * Headers/Foundation/NSEnumerator.h: * Headers/Foundation/NSSet.h: Update interfaces for instancetype and generics. * Source/NSCache.m: Use NSMapTable instead of NSMutableDictionary. The API contract for NSCache stipulates that keys are not copied, so using a dictionary wasn't apropriate. * Source/NSConnection.m: * Source/NSData.m: Small type safety improvements (mostly to keep the compiler happy). * Source/NSDictionary.m: Change id to id in a few places to avoid compiler warnings. * Tests/base/NSCache: * Tests/base/NSCache/TestInfo: * Tests/base/NSCache/basic.m: * Tests/base/NSCache/cache.m: Test cases eviction from NSCache. Turns out we currently only evict NSDiscardableContent, while the API documentation seems to suggest that cost and count based eviction without NSDiscardableContent is also possible. 2016-02-18 Richard Frith-Macdonald * Source/Additions/GSMime.m: Fold using tabs between key=value tokens in structured headers in the hope that it will improve compatibility with code which doesn't cope well with a space as the folding character. 2016-02-15 Richard Frith-Macdonald * Source/NSFileManager.m: Use NSDebugLog for most debug warnings * Source/NSUserDefaults.m: Restructure to cache flag information from NSProcessInfo directly on initialization, so it can be used when parsing property lists in the argument domain, avoiding any recursion trying to parse arguments. Remove obsolete code for for parsing -GS and --GS argument prefixes specially. Make sure that argument parsiong behavior matches OSX apart from The handling of a lone '-' used as key/value, and for this case document the difference (since the GNUstep behavior is more useful and changing it would have a real chance of breaking existing code). 2016-02-12 Niels Grewe * Headers/Foundation/NSObjCRuntime.h: Define macros for non-null sections if available. 2016-02-10 Richard Frith-Macdonald * Source/NSThread.m: In GSCurrentThread() the check for exiting thread needs to NOT be wrapped in an exception handler, since the exception handling code can attempt to get the current thread, causing recursion. 2016-02-09 Richard Frith-Macdonald * Source/NSUserDefaults.m: Remove dependency on NSUserDefaults in order to parse property list in program arguments ... get boolean defaults settings from the argument domain 2016-02-09 Larry Campbell * Source/NSUserDefaults.m: Fix for bug #46956 2016-02-09 Richard Frith-Macdonald * Tools/gdomap.c: Use uint32_t rather than unsigned long ... we are actually dealing with 4 byte values (from htonl), not native longs, and this can result in buffer overrun when we try copying a 64bit value into a 32bit buffer on a 64bit system. 2016-02-04 Richard Frith-Macdonald * Source/NSData.m: Fix for decoding base64 with unknown characters after a trailing '=' 2016-01-29 Richard Frith-Macdonald * Source/Additions/GSMime.m: keep key=value pairs in structured fields on the same line if possible. 2016-01-29 Niels Grewe * Source/NSThread.m: Automatic 'late' unregistration of thread objects: When +exit is not called, we no longer log a warning and leak the thread object. Instead, we add it to a map table, keyed under the current thread ID, and use that in GSCurrentThread() to find the correct NSThread object if pthread_getspecific wont return it to us. * Tests/base/NSThread/late_unregister.m: Test case for late unregistration. 2016-01-21 Niels Grewe * Source/Additions/GSMime.m: Fix folding of headers containing a '_' character. 2016-01-21 Niels Grewe * Tests/base/GSMime/general.m: Test case for quoted boundary parameter failure. 2016-01-21 Richard Frith-Macdonald * Source/GSString.m: Fix errors in conversion from a constant utf-8 string containing non-ascii characters to latin1 encoded data. * Source/Additions/GSMime.m: Change line folding code to preserve exact whitespace (using encoded words if necessary). Add support for generating more readable 'q' encoded words rather than just base64 encoded. Uses old behavior of folding with a tab character if the GSMimeOldStyleFolding user default is set to YES, though it's likely that this backward compatibility feature will be removed in future. 2015-12-30 Marcus Mueller * Source/NSNumberFormatter.m: fixed a subtle off-by-one formatter bug in conjunction with zero padding and NSNumberFormatterBehavior10_0. * Tests/base/NSNumberFormatter/basic.m: added a test for this particular issue 2015-12-29 Marcus Mueller * Source/NSUserNotification.m: "NSUserNotificationDefaultSoundName" constant string was declared but missing, fixed 2015-12-22 Richard Frith-Macdonald * Source/NSXMLElement.m: For OSX compatibility, raise an exception it we attempt to insert an element which is already the child of some other element. 2015-11-30: Niels Grewe * Source/NSCalendar.m: * Headers/Foundation/NSCalendar.h: Implement -components:fromDate:toDate:options:. (Not handling NSWrapCalendarComponents yet.) * Tests/base/NSCalendar/component-diff.m: Test case for new functionality. 2015-11-22 Riccardo Mottola * Source/NSFileManager.m (createDirectoryAtPath) Should return success even if all path components do exist, as by Apple spec. 2015-11-13 Riccardo Mottola * Source/NSRange.m: (NSRangeFromString) Parse length and location with scanInteger and not scanInt (suggested by Fred Kiefer to fix 64bit) 2015-11-02 Richard Frith-Macdonald * Source/NSXMLElement.m: (insertChild:atIndex:) if the child already has a parent, detach from that before adding to the new parent. OSX compatibility fix. 2015-11-01 Richard Frith-Macdonald * Source/NSXMLDocument.m: When libxml2 is not enabled, create a stub class which will raise an exception on instantiation. 2015-10-31 Richard Frith-Macdonald * Source/NSString.m: Fix for fastpath code for literal string comparison which was ignoring the case insensititve option. Problems spotted by Fred, triggered by a Testplant change. 2015-10-21 Richard Frith-Macdonald * Source/NSBundle.m: remove declaration of unused methods. 2015-10-06 Richard Frith-Macdonald * Source/NSSocketPortNameServer.m: Fix retain/release error causing crash on failure to launch gdomap. 2015-10-05 Niels Grewe * Headers/GNUstepBase/GNUstep.h: Define __has_extension() if the compiler does not support it. * Headers/Foundation/NSObjCRuntime.h: Provide definitions for NS_ENUM and NS_OPTIONS. 2015-10-03 Fred Kiefer * Source/NSPropertyList.m (GSBinaryPLGenerator-storeCount:): Use 0x12 instead of 0x13 for integer count. * Source/NSPropertyList.m (GSBinaryPLParser-readCountAt:): Handle 0x12 correctly. Use same code for 0x13 to read old incorrect written data. Based on change by Josh Freeman 2015-09-23 Wolfgang Lux * Source/NSXMLParser.m: * Tests/base/NSXMLParser/ParseData/quoted-entities.result * Tests/base/NSXMLParser/ParseData/quoted-entities.xml Turn on substitution of entities to match OSX behavior, add tests. 2015-09-22 Richard Frith-Macdonald * Headers/Foundation/NSData.h: * Source/Additions/GSObjCRuntime.m: * Source/GSFFCallInvocation.m: * Source/GSFormat.m: * Source/GSValue.m: * Source/NSArchiver.m: * Source/NSData.m: * Source/NSDecimalNumber.m: * Source/NSKeyValueObserving.m: * Source/NSKeyedArchiver.m: * Source/NSKeyedUnarchiver.m: * Source/NSMethodSignature.m: * Source/NSPortCoder.m: * Source/NSUnarchiver.m: * Source/cifframe.m: Implement support for C99 _Bool type. 2015-09-22 Riccardo Mottola * Headers/GNUstepBase/GSBlocks.h Do not enable weak on mingw, because it works only with ELF. 2015-09-18 Riccardo Mottola * Headers/Foundation/NSError.h * Source/NSError.m Add some 10.6 URL errors 2015-09-16 Richard Frith-Macdonald * configure.ac: fix check for pthread setname to work with older versions of clang which object to autoconf checking for the existence of a function by calling it without args. 2015-09-16 Riccardo Mottola * Headers/Foundation/NSFileManager.h * Source/NSFileManager.m Add simple (files only and no keys handling) implementation of 10.6 method contentsOfDirectoryAtURL. 2015-09-08 Niels Grewe * Source/NSPropertyList.m: Fix writing base64 data. 2015-09-04 Niels Grewe * Source/GSString.m: Optimisation for formatting strings that are stored as UTF-16 (use memcpy instead of looping over the characters). * Tests/base/NSString/unichar_format.m: Test cases for formatting. 2015-09-01 Niels Grewe * Source/NSRegularExpression.m: Fix handling of empty capture groups. 2015-08-30 Richard Frith-Macdonald * Source/NSOperation.m: Fix potential deadlock with adding observers. * Source/NSPropertyList.m: Fix a few mutability errors. Improve parsing NSData performance. Add support for parsing base64 encoded data in text property lists (delimited by <[ and ]>). 2015-08-29 Richard Frith-Macdonald * Source/Additions/GSMime.m: Improve descriptions for debug. * Source/Additions/NSData+GNUstepBase.m: Add escaped representation. * Source/GSHTTPURLHandle.m: Use escaped text format for debug log (and plist armored format) to ensure that we safely log binary data 2015-08-24 Richard Frith-Macdonald * Source/win32/GSFileHandle.m: include winsock2.h earlier for msys2 2015-08-17 Fred Kiefer * Resources/Korean.lproj/Localizable.string: Correct encoding * Resources/Languages/Korean: Add missing quotes. Patch by Seong-Gu Lee 2015-08-17 Richard Frith-Macdonald * Headers/GNUstepBase/NSData+GNUstepBase.h: Simple gzip API * Source/Additions/NSData+GNUstepBase.m: Use zlib to zip/unzip data * Tests/base/NSData/additions.m: tests for NSData additions (gzip) * Tests/base/NSData/Lorum: Data file for compress/uncompress tests 2015-08-16 Richard Frith-Macdonald * configure.ac: Use the compiler provided by gnustep-make unless it's specifically overridden in the environment. 2015-08-07 Niels Grewe * Source/NSPropertyList.m: Cope with certain malformed binary property lists. * Tests/PropertyLists/test01.m * Tests/PropertyLists/cyclic.plist: Test case for binary plists. 2015-08-05 Riccardo Mottola * Source/NSArray.m: Minor cast fixes. 2015-07-27 Richard Frith-Macdonald * Source/GSStream.m: Fix failure to unschedule from run loop if a stream is opened more than once. 2015-07-24 Richard Frith-Macdonald * Headers/GNUstepBase/GSIMap.h: add GSI_MAP_TABLE_S * Source/NSConcreteHashTable.m: * Source/NSConcreteMapTable.m: Pass variable holding run time size calculation as GSI_MAP_TABLE_S 2015-07-22 Richard Frith-Macdonald * Source/NSConcreteHashTable.m: * Source/NSConcreteMapTable.m: Get instance size at run time, so we can compile using nonfragile-abi 2015-07-16 Niels Grewe * Source/GSSet.m * Source/GSCountedSet.m: Fix a few more names. 2015-07-16 Richard Frith-Macdonald * Headers/GNUstepBase/GSIMap.h: * Headers/GNUstepBase/NSObject+GNUstepBase.h: * Source/Additions/GSMime.m: * Source/Additions/NSObject+GNUstepBase.m: * Source/GSArray.m: * Source/GSCountedSet.m: * Source/GSDictionary.m: * Source/GSPrivate.h: * Source/GSSet.m: * Source/GSString.m: * Source/NSArray.m: * Source/NSData.m: * Source/NSDictionary.m: * Source/NSObject.m: * Source/NSSet.m: * Source/NSString.m: Rewriting naive implementations to improve efficiency and fix a few bugs as well as renaming to avoid conflict with old GSCache. 2015-07-16 Niels Grewe * Headers/GNUstepBase/NSHashTable+GNUstepBase.h * Source/Additions/GNUmakefile * Source/Additions/NSHashTable+GNUstepBase.m * Source/GNUmakefile * Tests/base/NSHashTable/additions.m: Implement -addObjectsFromArray: on NSHashTable. 2015-07-15 Richard Frith-Macdonald * Headers/GNUstepBase/GSIMap.h: * Headers/GNUstepBase/NSObject+GNUstepBase.h: * Source/Additions/GSMime.m: * Source/Additions/NSObject+GNUstepBase.m: * Source/GSArray.m: * Source/GSCountedSet.m: * Source/GSDictionary.m: * Source/GSPrivate.h: * Source/GSSet.m: * Source/GSString.m: * Source/NSArray.m: * Source/NSData.m: * Source/NSDictionary.m: * Source/NSObject.m: * Source/NSSet.m: * Source/NSString.m: Extension API to interrogate object memory usage (stolen from GSCache and modified a bit). 2015-07-14 Richard Frith-Macdonald * Source/NSPropertyList.m: Write xml document headers referring to the current location of Apple's property list dtd for compatibility with software expecting to validate using that dtd. Stefan Bidigaray pointed out that the heading we currently write is very out of date. * Source/NSThread.m: On premature thread exist, log native thread ID. * Source/NSLog.m: Optimisations to make logging a little quicker. 2015-07-09 Richard Frith-Macdonald * Source/NSDebug.m: List memory allocation statistics in alphabetical order (by class name) for easier interpretation. Fix bug where the counter for differences was updated when difference listing was not requested. 2015-07-08 Richard Frith-Macdonald * Headers/Foundation/NSLock.h: * Source/NSLock.m: Add extension method -isLockedByCurrentThread for debug purposes. Also make description report the OS thread id of the thread which holds the lock (if any). 2015-07-08 Riccardo Mottola * Headers/GNUstepBase/GSConfig.h.in On NetBSD, undefine the system __weak first. 2015-07-03 Niels Grewe * Tests/base/NSXMLParser/ParseData/namespaced-attributes.xml: * Tests/base/NSXMLParser/ParseData/namespaced-attributes.result: Test case for attribute namespace prefixes. 2015-07-03 Niels Grewe * Source/Additions/GSXML.m: Fix reporting namespace prefixes of attributes when using the SAX2 parser. 2015-06-30 Richard Frith-Macdonald * configure.ac: * configure: * Headers/GNUstepBase/config.h.in: Add test for pthread_mutex_t.__data.__owner Update various tests to silence autoconf warnings. * Source/NSLock.m: If available, use pthread_mutex_t.__data.__owner to print the owning thread ID in the -description method. 2015-06-26 Riccardo Mottola * Source/NSMethodSignature.m * Source/cifframe.m Minor include fixes to avoid malloc.h warnings on OpenBSD. * Source/NSScanner.m Remove set but unused variable. 2015-06-22 Richard Frith-Macdonald * Headers/GNUstepBase/Additions.h: * Headers/GNUstepBase/GSConfig.h.in: * Headers/GNUstepBase/GSVersionMacros.h: Minor tweaks to build and avoid warnings in Yosemite 2015-06-14 Riccardo Mottola * Headers/Foundation/NSData.h * Source/NSData.m base64EncodedDataWithOptions, base64EncodedStringWithOptions: first implementation 2015-06-08 Richard Frith-Macdonald * Source/NSData.m: be strict about '=' padding only occurring at end of base64 encoded data. 2015-06-04 Richard Frith-Macdonald * Source/NSArray.m: Use NSUInteger rather than unsigned, use memory management macros. * Source/NSConnection.m: Changes to avoid compiler warnings. * Headers/Foundation/NSData.h: * Source/NSData.m: add base64 initialisation methods (bug #45240) 2015-06-01 Riccardo Mottola * Headers/Foundation/NSArray.h * Source/NSArray.m Add firstObject: method existing since 10.6 2015-05-26 Richard Frith-Macdonald * Source/NSURLConnection.m: Fix leak of limit date * Source/NSXMLParser.m: Fix leak of string 2015-05-26: Sebastian Reitenbach * Source/Additions/Unicode.m * Tools/AGSOutput.m return NULL or nil instead of NO where pointers are to be returned 2015-05-26 Richard Frith-Macdonald * GSString.m: Fix sign extension bug * Source/NSXMLParser.m: Update to more exactly match OSX behavior * Source/NSDateFormatter.m: attempt to fix functionality broken by additional call to set date format during reset. 2015-05-25 Richard Frith-Macdonald * Source/NSXMLParser.m: Use libxml2 if available. 2015-05-24 Richard Frith-Macdonald * GSString.m: * NSDebug.m: * NSZone.m: Minor optimisations and tidyups 2015-05-23 Richard Frith-Macdonald * Source/GSString.m: Fix failure to check free when done flag before freeing memory. 2015-05-22 Richard Frith-Macdonald * Source/NSString.m: * Source/GSString.m: Some optimisation. Fix -hasPrefix: and -hasSuffix: to use literal search as on OSX. 2015-05-15 Richard Frith-Macdonald * Documentation/install.texi: * ANNOUNCE: * INSTALL: * NEWS: Final updates for 1.24.8 release 2015-05-13 Richard Frith-Macdonald * configure.ac: Tidy compiler and preprocessor detection and use warning for potentially broken compiler selection. * configure: regenerate 2015-05-13 Richard Frith-Macdonald * Version: * Documentation/news.texi: * Documentation/ReleaseNotes.gsdoc: Update in preparation for release * Source/Makefile.postamble: * Makefile.postamble: * GNUmakefile: Apply Yavor Doganov's patch to avoid re-run of configure when we do multiple 'make distclean' invocations (bug #29730). 2015-05-12 Richard Frith-Macdonald * Source/NSTimeZones/NSTimeZones.tar: updated 2015-05-05 Richard Frith-Macdonald * Source/GSString.m: Fix for 64bit systems using TinyString objects ... missing implementations for common methods were making performance dire. 2015-05-02 Niels Grewe * Source/GSSet.m * Source/NSCountedSet.m * Source/NSSet.m: Implement a private method -_countForObject: that enables to correctly check equality of NSSet and NSCountedSet (behaviour verified to match OS X). Fixes bug #43915. * Tests/base/NSCountedSet/equality.m: Test cases for equality behaviour. 2015-04-20 Richard Frith-Macdonald * Source/NSTimeZone.m: Improve caching of common absolute timezones. 2015-04-28 Niels Grewe * Source/NSDateFormatter.m: Properly reinstall the user provided date format when we need to recreate the icu-based date formatter. 2015-04-02 Richard Frith-Macdonald * Source/NSThread.m: If an exception occurs while performing a selector in another thread, catch it and cleanup (and if the caller is waiting, pass the exception back to it). 2015-04-01 Wolfgang Lux * configure.ac: Fix comment syntax and use standard operator in test command. * configure: Regenerated. 2015-03-31 Richard Frith-Macdonald * Source/GSPrivate.h: Internal function to get OS thread ID * Source/NSThread.m: Report thread name and ID in description * Source/NSLog.m: Use new function for thread ID * configure.ac: Detect getaddrinfo and bsd thread id extensions * Headers/GNUstepBase/config.h.in: regenerate * configure: regenerate * Source/NSHost.m: Start of code to use getaddrinfo 2015-03-13 Richard Frith-Macdonald * Source/NSAutoreleasePool.m: Fix a bug leading to crashes on thread exit in cases where deallocation of something in the thread dictionary causes further use of the thread's autorelease pool (which has already been deallocated). 2015-03-10 Niels Grewe * Source/GSTimSort.m: Fix a DoS vulnerability discovered in the Timsort algorithm. For information about the problem please refer to http://www.envisage-project.eu/proving-android-java-and-python-sorting -algorithm-is-broken-and-how-to-fix-it/ 2015-03-08 Richard Frith-Macdonald * Source/NSFileHandle.m: ([-sslHandshakeEstablished:outgoing:]) If we can't create a session, the handshake should fail rather than being retried. Fix infinite loop establish session on closed handle. 2015-02-28 Richard Frith-Macdonald * Headers/GNUstepBase/NSDebug+GNUstepBase.h: Define DLog() and ALog() as suggested by Amr Aboelela 2015-02-28 Richard Frith-Macdonald * configure.ac: Check for gettid availability * configure: Regenerate * Headers/GNUstepBase/config.h.in: Regenerate * Source/GSPrivate.h: Update comment on GSLogThread * Documentation/Base.gsdoc: Update doc of GSLogThread * Source/NSLog.m: Change to log thread ID (to match OSX which now logs the thread ID along with the process ID). Change the meaning of the GSLogThread user default (which used to turn on logging of the thread ID) so that it now turns on logging of the thread name (where a thread name has been set) and the NSThread address if no name has been set. 2015-02-16 Wolfgang Lux * Source/NSData.m (writeToFile:options:error:): Fix leak of open file descriptor on systems where mkstemp is defined. 2015-02-15 Richard Frith-Macdonald * config/objc-sys-dynamic.m4: Check for windows before anything else * configure: regenerate Apparently recent mingw implements headers which folled configure into using dlopen() with doesn't support native windows paths ... change order of checks so we still use the native API. 2015-02-14 Richard Frith-Macdonald * Source/NSThread.m: Be more agressive about releasing thread resources when a thread exists (in particular release the thread's runloop repeatedly for bug #44240) in case of the deallocation of objects causing re-population of thread data. 2015-02-07 Richard Frith-Macdonald * Source/NSData.m: Simplify mingw/unixy ifdefs for writing a file. * Source/NSThread.m: Simplify mingw/unixy ifdefs for sleeping. 2015-02-05 Niels Grewe * Source/GSTLS.m: Use path standardization when setting up TLS data to be mapped to a specific filesystem location. 2015-01-13 Marcus Mueller * Headers/Foundation/Foundation.h: added NSUUID.h 2014-12-28 Wolfgang Lux * configure.ac: * Source/NSThread.m (PTHREAD_SETNAME): Fix detection of the proper pthread_setname_np and pthread_set_name_np variants on FreeBSD, OpenBSD and Darwin. * configure: Regenerated. 2014-12-28 Wolfgang Lux * Source/GSSocketStream.m: Add necessary GSTLSHandler methods when TLS is disabled. * Source/GSTLS.m (standardizedPath): Define private function only when TLS is enabled. 2014-12-23 Richard Frith-Macdonald * Source/NSTimeZone.m: * Source/nstzfile.h: Remove unused include of (possibly) non existent file. 2014-12-23 Riccardo Mottola * Source/GSSocketStream.m Fix code-path for non AF_INET6 * Source/NSDate.m Provide NAN constant for Solaris if not available. 2014-11-29 Sergei Golovin * Tests/base/NSURLConnection: Test helper tool plus a load of tests for NSURLConnection. 2014-11-29 Richard Frith-Macdonald * Source/NSScanner.m: Fixup error in scanning doubles with excess precision (bug #43722). 2014-11-28 johannes@brilliantservice.co.jp * Source/NSThread.m: Set thread name visible to OS * configure.ac: test for pthread_set_name_np() Integrated Johannes patch with some changes to make things work if we set the name before starting the thread. Commend out ms-windows code which doesn't work yet. 2014-11-20 Sergei Golovin * Source/GSSocketStream.m: * Tests/base/NSURL/Helpers/capture.m: * Tests/base/NSURL/testKey.pem: * Tests/base/NSURL/test02.m: * Tests/base/NSURL/testCert.pem: Implement TLS on server socket and make use of it in HTTPS URL helper code. Also, permit NSStream zero length write (it seems OSX allows it). 2014-11-20 Richard Frith-Macdonald * Source/NSRunLoop.m: Avoind some unnecessary retain/release cycles. 2014-11-05 Richard Frith-Macdonald * Source/GSTLS.m: If a user default value is removed while running, revert to the value from the environment or the hard coded fallback rather than continuing to use the previous value from the defaults system. 2014-11-04 Richard Frith-Macdonald * Source/NSThread.m: When handling perform in another thread, check more carefully for inter-thread communications (pipe on unix, event on windows) and make sure we invalidate performers safely outside the lock protected region when I/O is complete. 2014-11-01 Richard Frith-Macdonald * Source/GSHTTPURLHandle.m: Fix leak of handle when starting a new connection after an older one is dropped by the remote end. 2014-10-30 Sergei Golovin * Source/NSURLProtocol.m: Fix memory leak and possible hang on retry (bug #43461). 2014-10-17 Richard Frith-Macdonald * Documentation/news.texi: * Documentation/ReleaseNotes.gsdoc: * Version: Bump subminor version for bugfix release * NSTimeZones/NSTimeZones.tar: update * Source/NSProcessInfo.m: Use separate lock for globally unique string rather than sharing lock intended for other purposes. * Source/GSTLS.m: Change default TLS 'priority' to disable SSLv3.0 as it renders things open to the 'POODLE' attack. Also, print warning if it is expressly requested from the code (though the use of the GSTLSPriority user default will still allow complete control without warnings). 2014-10-11 Marcus Mueller * Headers/GNUstepBase/GSVersionMacros.h: UNAVAILABLE_ATTRIBUTE added 2014-08-19 Wolfgang Lux * configure.ac: * Headers/GNUstepBase/config.h.in: Add test for grantpt function. * configure: Regenerated. 2014-07-25 Richard Frith-Macdonald * Source/Tools/gdomap.c: Unless running on windows, allow new -j command-line argument to specify the path in which the process should be jailed (chroot). The default remains to jail the process in /tmp since there doesn't seem to be a general, portable alternative. 2014-07-25 Richard Frith-Macdonald * Source/GSSocketStream.m: Fix handling TLS handshake in the case where there is a network failure during the handshake (bug#42781). * Source/GSTLS.m: Fix erroneous attempt to load revocation lists. * Tests/base/NSURLConnection/test01.m: https test contributed by Sergei Golovin. 2014-07-25 Richard Frith-Macdonald * configure.ac: Remove compiler charset options * config.mak.in: Remove compiler charset options * configure: regenerate: Yavor pointed out that the gcc manual is wrong and gcc (all the versions we support anyway) always uses utf-8 (as does clang), so we can get rid of stuff intended to try to force it to use utf8 2014-07-13 Yavor Doganov Add large file support (LFS) for NSData. * configure.ac: Call AC_FUNC_FSEEKO/AC_SYS_LARGEFILE. * Source/NSData.m (readContentsOfFile): Use fseeko/ftello and off_t as appropriate. (-initWithContentsOfFile:): Define fileLength of type off_t. * Source/GSFileHandle.m: * Source/win32/GSFileHandle.m: * Source/NSFileManager.m: Remove _FILE_OFFSET_BITS define (now defined globally in config.h). 2014-07-14 Richard Frith-Macdonald * Source/NSRunLoop.m: ([-runMode:beforeDate:]) check performers as well as notifications etc ... should fix bug #39107 2014-02-17 Larry Campbell * Source/NSJSONSerialization.m: * Tests/base/NSJSONSerialization/tests00.m: Fixes for bug #41628 2014-07-12 Yavor Doganov * Tests/GNUmakefile: * Tests/base/Functions/NSGeometry1.m: * Tests/base/NSRunLoop/performers.m: Tweaks for running in sandbox (bug #42740) 2014-07-07 Yunqiang Su (tiny change) * config/config.trampoline.c: * Source/NSObject.m (GSAtomicIncrement, GSAtomicDecrement): Use __mips64 to distinguish MIPS64. 2014-06-30 Yavor Doganov * Tools/GNUmakefile (CONFIG_SYSTEM_LIBS): * Tools/make_strings/GNUmakefile (CONFIG_SYSTEM_LIBS): Define to the empty string to avoid linking the tools against external libraries. 2014-06-30 Yavor Doganov * base.make.in: make base dependencies explicit only when statically linnking (bug #42423) 2014-06-30 Yavor Doganov * GNUmakefile: Use -include for deb.make (for backward compatibility with old versions of gnustep-make). * Documentation/GNUmakefile: * Documentation/General/GNUmakefile: * Source/DocMakefile: * Tools/DocMakefile: Flags alterations to build documentation before base/autogsdoc is installed. * configure.ac: Test whether gnutls needs libgcrypt * Source/GSTLS.h: Use test * Source/GSTLS.m: Use test * configure: regenerate 2014-06-26 Riccardo Mottola * Headers/GNUstepBase/GSTypeEncoding.h * Headers/GNUstepBase/GSVersionMacros.h Substitute #import with #include so that the header can be used in a pure C file without gcc warnings. 2014-06-20 Richard Frith-Macdonald * Source/NSSocketPortNameServer.m: * Source/NSMessagePortNameServer.m: Maps of ports to names modified to treat the ports as non owned pointers rather than non retained objects ... so we simply do pointer comparisons (faster and also safer if we are removing a port which is being deallocated). 2014-06-20 Richard Frith-Macdonald * configure.ac: Temporarily add -O0 to turn off optimisation while checking for the need for shorts to be word-aligned ... should fix the case where the optimiser breaks the test by 'correcting' the misaligned access. * configure: regenerate 2014-06-19 Riccardo Mottola * Source/common.h Include and do not import pure-C header, guard against re-inclusion 2014-06-18 Riccardo Mottola * Source/unix/NSStream.m Add missing includes (in correct order) for open() on most OS, including Solaris. 2014-06-01 Richard Frith-Macdonald * Source/Additions/Unicode.m: Fix buffer overrun. * Source/GSString.m: Fix uninitialised variable. Cure for bug #42483 2014-05-28 Manuel Guesdon * Source/NSUndoManager.m Assert sig is not null in registerUndoWithTarget:selector:object: 2014-05-22 Richard Frith-Macdonald * Source/GSInvocation.h: * Source/NSInvocation.m: * Headers/Foundation/NSInvocation.h: * Tests/base/NSInvocation/test02.m: Reinstate lost code for NS_MESSAGE and NS_INVOCATION macros 2014-05-20 Richard Frith-Macdonald * Source/GSHTTPURLHandle.m: * Source/NSURLProtocol.m: When creating the 'Host' header, omit the port part if the scheme is http/https and the port is the normal 80/443. A workaround for buggy software which doesn't understand the spec saying that the port is 'optional', not 'omitted' in these cases. 2014-05-09 Richard Frith-Macdonald * Source/NSDebug.m: * Headers/Foundation/NSDebug.h: Add GSDebugAllocationRecordObjects() and deprecate GSDebugAllocationActiveRecordingObjects() so we can turn individual object tracking on and off. Move documentation from source to header. 2014-05-08 Richard Frith-Macdonald * Tools/gdomap.m: Fix ifdefs for MINGW to avoid fork relatred code. 2014-05-05 Ivan Vucica * GNUmakefile: gnustep-make's Master/deb.make now included. * Tests/GNUmakefile: gnustep-tests --clean is now permitted to fail. This helps in case 'make {dist,}clean' is called by some automation. 2014-05-01 Richard Frith-Macdonald * Source/GSSocketStream.m: Set initial state of accepted incoming connection streams to be open (otherwise we can't close them). 2014-04-26 Manuel Guesdon * Source/NSKeyValueCoding.m Fix exception msg in setValue:forUndefinedKey: 2014-04-18 Richard Frith-Macdonald * Headers/Foundation/NSHost.h: * Source/NSHost.m: Add OSX 10.6 -localizedName method. 2014-04-12 Richard Frith-Macdonald * Source/NSRegularExpression.m: Check for bad range from ICU and flag an internal error if we see it; mimic OSX behavior when a range limited match fails. 2014-04-11 Fred Kiefer * Headers/Foundation/NSXMLNodeOptions.h: Add new 10.7 options. * Source/NSXMLDocument.m: Use XML_PARSE_NONET as the default option for xmlReadMemory. Add XML_PARSE_NOENT when NSXMLNodeLoadExternalEntitiesNever is set. 2014-03-28 Richard Frith-Macdonald * Source/NSXMLParser.m: If parsing something which contains data which can't be utf-8, generate a parse error. 2014-03-26 Richard Frith-Macdonald * Source/NSConnection.m: handle invalidation of connection while getting root proxy. 2014-03-26 Riccardo Mottola * Source/NSProcessInfo.m (determineOperatingSystem): uname() on solaris may return a positive value on success, not just 0 2014-03-25 Fred Kiefer * Tools/NSOperation.m: ([_finish]) fix logic of 'executing' flag. 2014-03-19 Richard Frith-Macdonald * Tools/gdomap.c: Don't open syslog connection until after we have forked and closed old descriptors .. fix for bug #41751 * Headers/Foundation/NSData.h: * Source/NSData.m: * Source/NSString.m: Fix for bug #41626 * Source/Additions/GSObjCRuntime.m: patch by Mathias Bauer for bool encoding/decoding. 2014-03-11 Richard Frith-Macdonald * Source/Additions/GSMime.m: When generating document with a header containing adjacent non-ascii words which need to be encoded, omit the space between those words for consistency with the change on Fe 3rd. 2014-02-18 Fred Kiefer * Source/NSDateFormatter.m (-initWithDateFormat:allowNaturalLanguage:): Use method -setDateFormat: to get correct behaviour. * Source/NSDateFormatter.m (-setDateFormat:): Use ASSIGNCOPY for _dateFormat. 2014-02-14 Quentin Mathe * Headers/Foundation/NSNotification.h * Source/NSNotificationCenter.m (-addObserverForName:selector:queue:usingBlock:): Added new Mac OS X 10.6 method. 2014-02-14 Quentin Mathe * Headers/Foundation/NSSortDescriptor.h * Source/Foundation/NSSortDescriptor.m (+sortDescriptorWithKey:ascending:selector:, +sortDescriptorWithKey:ascending, -[NSSet sortedArrayUsingDescriptors:]): Added missing Mac OS X 10.6 methods. 2014-02-13 Richard Frith-Macdonald * Source/GSFormat.m: Fix to cope with cases where a format specifies a field width larger than can reasonably fit on the strack ... use the heap. 2014-02-13 Larry Campbell * Source/NSCalendarDate.m: Fixup millisecond formatting to match OSX 2014-02-12 Quentin Mathe * Tools/gsdoc-1_0_4.dtd: Added new DTD version that declares 'package' visibility as a valid ivar qualifier. * Tools/AGSParser.m: Added 'package' visibility parsing. * Tools/AGSOutput.m: * Tools/autogsdoc.m: * Tools/GNUmakefile.m: Updated to refer to the latest DTD version. 2014-02-03 Richard Frith-Macdonald * Source/NSString.m: Fix standardising a path to use unix separators consistently with appending a pathc component ... paths should be (as far as possible) portable, and the filesystem representation methods convert to backslashes as necessary on windows anyway. 2014-02-03 Richard Frith-Macdonald * Source/Additions/GSMime.m: * Headers/GNUstepBase/GSMime.h: Add support for stripping white space between encoded words (RFC2047) 2014-02-02 Yavor Doganov * configure.ac: Force use for fake main on kfreebsd to work around bug handling large number of arguments. * Documentation/coding-standards.texi: * Documentation/manual/manual.texi: * Tools/cvtenc.1: * Tools/pldes.1: * Tools/defaults.1: * Tools/autogsdoc.1: * Tools/gdomap.8: Minor cosmetic tweaks 2014-02-02 Riccardo Mottola * Source/NSString.m (stringByResolvingSymlinksInPath) On GLIBC and FreeBSD use sysconf(_SC_SYMLOOP_MAX) instead of just MAXSYMLINKS. For HURD this is necessary, since the latter is not defined. 2014-01-31 Marcus Mueller * Source/NSUserNotification.m: Implemented repetitions, moved "presented" flagging to the appropriate method (subclassers may have different opinions about presentation, i.e. gnustep-gui might want to prevent presentation if application is already frontmost [the OSX behavior]). Improved -description (similar to OSX's output, eases cross-platform debugging). * Headers/Foundation/Foundation.h: added NSUserNotification.h 2014-01-30 Marcus Mueller * Headers/Foundation/NSUserNotification.h: * Source/NSUserNotification.m: Added default implementation which provides infrastructure but no real transport mechanisms. An implementation utilizing DBus (Desktop Notifications Specification) is provided via DBusKit. 2014-01-26 Fred Kiefer * Headers/Foundation/NSKeyValueObserving.h, * Source/NSKeyValueObserving.m: Add method -keyPathsForValuesAffectingValueForKey:. 2014-01-25 Frederik * Source/NSKeyValueObserving.m: When using (NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew) as option for observeValueForKeyPath:ofObject:change:context:, we should use -valueForKeyPath: instead of -valueForKey: to retrieve the current (initial) value. 2014-01-23 Richard Frith-Macdonald * Source/GSFFCallInvocation.m: * Source/GSFFIInvocation.m: * Source/Additions/GSTypeEncoding.c: * Headers/GNUstepBase/GSIArray.h: * Headers/GNUstepBase/GSTypeEncoding.h: * Headers/GNUstepBase/GSIMap.h: Fixup to use GS_STATIC_INLINE consistently. * Tools/autogsdoc.m: Set up default work map for public macros whose use in headers would otherwise confuse documentation generation. 2014-01-21 Pirmin Braun * Source/NSDecimal.m: Fix for rounding precision. 2014-01-20 Quentin Mathe * Source/NSSet.m: Added missing ([-valueForKey:]) method. 2014-01-20 Quentin Mathe * Source/NSKeyValueMutableArray.m: * Source/NSKeyValueMutableSet.m: Don't post KVO notifications if +automaticallyNotifiesObserversForKey: returns NO, this ensures we match Cocoa behavior. 2014-01-18 Quentin Mathe * Source/NSObject.m (-respondsToSelector, +instancesRespondToSelector:): Fixed to check +resolveInstanceMethod: and +resolveClassMethod: as documented in Cocoa NSObject API. 2014-01-16 Niels Grewe * Source/NSScanner.m: Implement -scanInteger: by conditionally calling -scanInt: or -scanLongLong: based on the pointer size detected at configure time. 2014-01-16 Richard Frith-Macdonald * Source/NSKeyValueObserving.m: Path info lifetime fixups to avoid crashes of the kind reported by Mathias Bauer 2014-01-14 Lubos Dolezel * Source/NSBundle.m: * Headers/Foundation/NSBundle.h: add -resourceURL 2014-01-14 Richard Frith-Macdonald * Source/NSPathUtilities.m: * Documentation/Base.gsdoc: Add GNUSTEP_DEVELOPER_DIR to allow definition of the native path to the msys/mingw development tools on windows. Also improve/fix lookup heuristics. 2014-01-13 Richard Frith-Macdonald * Source/NSString.m: Revert last change to get -isAbsolutePath working on mingw again ... need to analyse startup problem. 2014-01-13 Marcus Mueller * Source/NSString.m: absolute paths on __MINGW__ can also start with "/" if GSPathHandlingRight() is YES, otherwise GNUstep config paths can't be used during startup. 2014-01-11 Marcus Mueller * Source/GSMDNSNetServices.m: minor fixes - does now properly compile on Windows, too. NOTE: If you want to link against Apple's Bonjour SDK on Windows, you have to convert the dnssd.lib from MSVC/__stdcall format to GCC/__cdecl and provide the result as libdns_sd.a. Also, DNSSD_API in dns_sd.h needs to be defined empty. 2014-01-11 Richard Frith-Macdonald * Source/NSPathUtilities.m: The NSDeveloperDirectory key is deprecated on OSX, but lets use it for the development system root. On windows systems this should be the native windows path at which the msys system is installed, found relative to the current process if possible, but otherwise with the GNUstep packages installed, found relative to the package installation directory. In other cases (no specific development environment found) the system root directory is returned. 2014-01-10 Richard Frith-Macdonald * Source/NSFileManager.m: On mingw a file is executable if its extension is in the list provided by the PATHEXT environment variable. * Source/NSTask.m: Simplification/clarification suggested by Riccardo 2014-01-08 Quentin Mathe * Source/NSValueTransformer (+valueTransformerForName:): Fixed to automatically register any available NSValueTransformer subclass that matches the given name and is not yet registered. This behavior is described in the Cocoa API documentation. 2014-01-08 Richard Frith-Macdonald * Source/NSUUID.m: * Source/Additions/NSData+GNUstepBase.m: * Headers/GNUstepBase/NSData+GNUstepBase.h: Move random data generation out to the NSData(GNUstepBase) category. 2014-01-07 Quentin Mathe * Source/NSJSONSerialization.m (writeObject()): Fixed double number serialization to encode 17 significant digits (this matches the max number of significant digits in the double-precision floating point format). This prevents a loss of precision, in case the number has more than 3 digits after the decimal point. * Tests/base/NSJSONSerialization/json.m: Updated to test double number serialization. 2014-01-07 Richard Frith-Macdonald * Source/NSOperation.m: Make sure current queue is set for threads owned by a queue (and return the main queue for the main thread). Avoid needing to create the main queue in the main thread. 2014-01-07 Richard Frith-Macdonald * Source/NSObject.m: Fixed logic error in David's libobjc2 integration for deallocation; should use object_getClass() if the object is NOT a small object, use isa otherwise. 2013-12-31 Marcus Mueller * Headers/Foundation/NSMetadata.h: use GS_PROTOCOLS_HAVE_OPTIONAL for NSMetadataQueryDelegate. Always define the protocol, even if it's empty (so we don't have to adjust any headers), but fallback to the informal protocol if OS version < 10.6 OR compiler doesn't support @optional keyword in protocols. 2013-12-30 Marcus Mueller * Headers/GNUstepBase/GSVersionMacros.h: added macros GS_GCC_MINREQ(maj,min) and GS_CLANG_MINREQ(maj,min) to check for minimum required versions of GCC and CLANG compilers. Changed several occurrences of previous macros to improve readability. Added GS_PROTOCOLS_HAVE_OPTIONAL to correctly mark all appropriate declarations. * Headers/Foundation/NSNetServices.h, * Headers/Foundation/NSStream.h, * Headers/Foundation/NSXMLParser.h, * Headers/GNUstepBase/NSNetServices+GNUstepBase.h, * Source/GSNetServices.h: use GS_PROTOCOLS_HAVE_OPTIONAL macro where appropriate 2013-12-26 Marcus Mueller * Headers/Foundation/NSNetServices.h: * Source/GSAvahiNetService.m: added NSNetServiceListenForConnections option (introduced in OSX 10.9) and accompanying delegate method, currently implemented in GSAvahiNetService.m only. * Headers/Foundation/NSStream.h: fixed typo (_clang_ -> __clang__) 2013-12-24 Richard Frith-Macdonald * Version: make ready for 1.24.6 release * Documentation/news.texi: 1.24.6 news * Documentation/ReleaseNotes.gsdoc: 1.24.6 release notes 2013-12-20 Graham Lee * Headers/Foundation/NSUUID.h: * Source/NSUUID.m: implemented for unix * Tests/base/NSUUID: testcases 2013-12-20 Richard Frith-Macdonald * Source/NSObject.m: initialise defaults system at end of NSObject initialisation, in the hope of preventing deadlocks if the +initialize methods of other classes in different threads try to use defaults. May fix #39125 2013-12-20 Marcus Müller * Headers/Foundation/NSStream.h: OSX compatibilityy ... use formal protocol if possible (bug #40925). * Headers/GNUstepBase/GSVersionMacros.h: OSX 10.9 define added. * Headers/Foundation/NSRunLoop.h: * Source/NSRunLoop.m: Implement ([+mainRunLoop]) 2013-12-13 Fred Kiefer * Headers/Foundation/NSArray.h, * Source/NSArray.m: Move -setValue:forKey: from NSMutableArray to NSArray. Patch by Marcian Lytwyn . 2013-12-07 Wolfgang Lux * Source/Additions/Unicode.m (GSPrivateDefaultCStringEncoding): Use correct feature test for presence of ucnv functions. 2013-12-05 Quentin Mathe * Headers/Foundation/NSDictionary.h: * Source/NSDictionary.m: * Source/Additions/GCDictionary.m: * Source/Additions/GSInsensitiveDictionary.m: * Source/GSDictionary.m: Changed keys argument type to (const id []) in -initWithObjects:forKeys:count: and +dictionaryWithObjects:forKeys:count:, to follow the current Cocoa API. 2013-12-04 Richard Frith-Macdonald * Source/NSURLCredential.m: ([-isEqual:]) needs to take the password and persistence into account, not just the username. 2013-11-29 Riccardo Mottola * Headers/ObjectiveC2/objc/runtime.h * Headers/Foundation/NSObjCRuntime.h Insert some kludge for PTR stuff on systems with fake C99 compatible headers. 2013-11-26 Riccardo Mottola * Headers/GNUstepBase/GSConfig.h.in * configure.ac Detect broken PTR limits (notably solaris 8) and provide replacements * configure regenerated 2013-11-25 Richard Frith-Macdonald * Source/GNUstepBase/GSConfig.h.in: temporarily redefine BOOL while including windows headers, so we don't get conflict between windows and objc booleans. * base.make.in: Add to CONFIG_SYSTEM_LIBS, CONFIG_SYSTEM_LIB_DIR, CONFIG_SYSTEM_INCL So that the libraries/headers used to build base are available for software using base. 2013-11-22 Richard Frith-Macdonald * Source/GSTLS.m: Set errno to EAGAIN if TLS layer fails in a non-fatal way during read/write. Add more/better debug logging. 2013-11-20 Richard Frith-Macdonald * Source/NSUserDefaults.m: Fix for bug 40620 Prevent recursion while parsing process arguments. 2013-11-19 Saso Kiselkov Releasing a GSTLSHandle (created from +[NSFileHandle sslClass]) after the TLS handshake will result in a segfault. Fix it. 2013-11-18 Wolfgang Lux * Headers/GNUstepBase/NSCalendarDate+GNUstepBase.m: * Source/Additions/NSCalendarDate+GNUstepBase.m: Add -isoYear method for compatibility with -weekOfYear 2013-11-07 Riccardo Mottola * Source/GSFormat.m * Source/NSException.m * Source/NSConnection.m Openbsd malloc.h warning fix. 2013-11-05 German Arias * Source/NSUndoManager.m (-undoActionName): Try first with the name of current group. If not, with the name of last object in undo stack. 2013-11-03 German Arias * Source/NSUndoManager.m (-redoMenuTitleForUndoActionName:): * Source/NSUndoManager.m (-undoMenuTitleForUndoActionName:): Return "Redo" and "Undo", respectively, if actionName is null. If not, it removes the item title. 2013-11-01 Richard Frith-Macdonald * Source/GSAttributedString.m: Use exact equality test when removing attribute dictionary from cache. Prevents possibly removing the wrong dictionary in cases where dictionary contents are mutated while in the cache, such that two dictionaries become equal. 2013-10-30 Richard Frith-Macdonald * Source/GSDictionary.m: Add private class GSCachedDictionary which will raise an exception if deallocated without being uncached. * Source/GSAttributedString.m: Use GSCachedDictionary for attributes to aid in detection of things improperly releasing them. 2013-10-29 Richard Frith-Macdonald * Source/GSAttributedString.m: Simplify dictionary caching code and add check to ensure we don't uncache a dictionary which isn't cached. 2012-10-29 Riccardo Mottola * configure.ac: * Headers/GNUstepBase/GSConfig.h.in: * Headers/GNUstepBase/GSTypeEncoding.h: * Headers/GNUstepBase/GNUstep.h: * Headers/Foundation/NSString.h: * Headers/Foundation/NSObjCRuntime.h: * configure: regenerate Use inttypes.h rather than stdint.h as it's more inclusive and works on Solaris where some defines are in the wrong place. 2013-10-29 Richard Frith-Macdonald * Source/NSTimeZone.m: Implement -hash as the hash of the time zone name so that we can find equal timezones in a set/dictionary as we should, rather than onlyn finding identical time zones. 2013-10-28 Richard Frith-Macdonald * Tools/AGSParser.m: Add code to ignore NS_FORMAT_ARGUMENT and NS_FORMAT_FUNCTION macros inside variable declarations. 2013-10-27 Richard Frith-Macdonald * Source/GSFileHandle.m: Fix retention of singletons and add exception if an attempt is made to release too many times. * Tools/make_strings/make_strings.m: fix minor coding standard errrors. * Tests/base/NSFileHandle/basic.m: * Tests/base/NSFileHandle/singleton.m: Correct faulty tests. * Source/NSPredicate.m: ([_evaluateLeftValue:rightValue:object:]) Add missing check for NSNotEqualToPredicateOperatorType spotted by Fred 2013-10-26 Richard Frith-Macdonald * Source/NSPredicate.m: ([_evaluateLeftValue:rightValue:object:]) should return either YES or NO in all cases. 2013-10-25 Richard Frith-Macdonald * Tools/make_strings/StringsFile.m: Fix bogus space after semicolon. 2013-10-25 Richard Frith-Macdonald * Source/GSSocketStream.m: * Source/GSTLS.m: Attempt to better handle TLS handshake failure. 2013-10-24 Richard Frith-Macdonald * Source/GSHTTPURLHandle.m: Close socket immediately on SSL handlshake failure, rather than waiting for cleanup on dealloc. 2013-10-18 Richard Frith-Macdonald * Source/NSPredicate.m: Fix faulty casts of immutable array to mutable. 2013-10-17 Eric Wasylishen * Source/NSException.m: * Headers/Foundation/NSThread.h: Add trivial implementation of +[NSThread callStackSymbols] that uses GSStackTrace. 2013-10-15 Fred Kiefer * Headers/Foundation/NSDate.h, * Source/NSDate.m: Add 10.6 class method dateWithTimeInterval:sinceDate: Patch by Marcian Lytwyn 2013-10-04 Richard Frith-Macdonald * Source/NSTimeZone.m: Fix bug with byte swapping ... use NSByteOrder.h 2013-10-01 Richard Frith-Macdonald * config/config.align.c: Try to more reliably detect whether word alignment is needed. * Source/NSUserDefaults.m: Fix failure to send notification when defaults are updated. 2013-09-18 Richard Frith-Macdonald * Source/GSTLS.h: * Source/GSTLS.m: * Source/NSFileHandle.m: * Headers/Foundation/NSFileHandle.h: Add mechanism to set the contents of TLS certificate and key files in memory rather than reading from disk. Expose TLS property keys in the NSFileHandle header to allow more control over certificates. 2013-09-10 Richard Frith-Macdonald * configure.ac: Check for another unicode header * Headers/GNUstepBase/config.h.in: regenerate * configure: regenerate * Source/Additions/Unicode.m: If ICU is available, use it to obtain default C-string encoding. 2013-09-09 Pirmin Braun * Source/Additions/GSMime.m: When creating a child parser, pass on the flag to say we are parsing HTTP rather than MIME. 2013-09-09 Richard Frith-Macdonald * Source/Additions/GSMime.m: Add comments and a further fallback mechanism for parsing HTTP when the default encoding is set. * Source/NSUnarchiver.m: Fix integer size values to use constants from stdint.h 2013-09-06 Richard Frith-Macdonald * Source/NSUserDefaults.m: Update cache when we synchronise a new domain to disk (was only updating on changes to existing domains). Should fix bug #39300 2013-08-30 Fred Kiefer * Headers/GNUstepBase/GSVersionMacros.h: Fix usage of __APPLE__ macro. Patch by Graham Lee 2013-08-22 Richard Frith-Macdonald * Source/NSScanner.m: GSScanDouble() permit overlong mantissa (more digits than can be represented in a double) and ignore excess digits for compatibility with OSX. Inspired by testplant branch r37004 which tries to allow more digits at the cost of breaking parsing in locales where the decimal point is a comma rather than a dot. 2013-08-22 Richard Frith-Macdonald * Source/NSIndexPath.m: * Source/NSMapTable.m: * Source/NSSocketPortNameServer.m: * Source/GSLocale.m: * Source/NSNetServices.m: * Source/NSTimeZone.m: * Source/NSHashTable.m: * Source/GSSocketStream.m: * Source/NSValueTransformer.m: * Source/NSBundle.m: * Source/NSURLHandle.m: * Source/NSPropertyList.m: * Source/NSAffineTransform.m: * Source/NSPathUtilities.m: * Source/NSScanner.m: * Source/NSDistributedNotificationCenter.m: * Source/NSProcessInfo.m: * Source/NSNotificationQueue.m: * Source/NSSocketPort.m: * Source/NSAttributedString.m: * Source/NSRunLoop.m: * Source/NSOperation.m: * Source/NSObject+NSComparisonMethods.m: * Source/NSFormatter.m: * Source/NSUserDefaults.m: * Source/NSArray.m: * Source/NSMessagePortNameServer.m: * Source/GSStream.m: * Source/NSKeyedArchiver.m: * Source/NSDebug.m: * Source/NSXMLPrivate.h: * Source/NSKeyedUnarchiver.m: * Source/NSPortMessage.m: * Source/NSFileHandle.m: * Source/NSDistributedLock.m: * Source/GSTLS.m: * Source/NSPredicate.m: * Source/NSKeyValueObserving.m: * Source/NSAssertionHandler.m: * Source/GSHTTPURLHandle.m: * Source/GSDispatch.h: * Source/NSPort.m: * Source/NSSortDescriptor.m: * Source/NSMessagePort.m: * Source/win32/NSMessagePort.m: * Source/win32/NSMessagePortNameServer.m: * Source/NSInvocation.m: * Source/NSFileManager.m: * Source/common.h: * Source/NSURLProtocol.m: * Source/NSURLCache.m: * Source/NSNotificationCenter.m: * Source/GSAttributedString.m: * Source/externs.m: * Source/NSCoder.m: * Source/NSHTTPCookieStorage.m: * Source/NSURL.m: * Source/NSString.m: * Source/NSObject.m: * Source/NSDecimalNumber.m: * Source/NSConcreteMapTable.m: * Source/NSPointerFunctions.m: * Source/GSSorting.h: * Source/NSPointerArray.m: * Source/Additions/GCObject.m: * Source/Additions/GSMime.m: * Source/Additions/NSObject+GNUstepBase.m: * Source/Additions/GSXML.m: * Source/Additions/GSObjCRuntime.m: * Source/NSNotification.m: * Source/NSNumber.m: * Source/GSTimSort.m: * Source/NSConnection.m: * Source/GSString.m: * Source/NSHTTPCookie.m: * Source/NSData.m: * Source/NSHost.m: * Source/NSDate.m: * Source/NSMetadata.m: * Source/NSDictionary.m: * Source/GSMDNSNetServices.m: * Source/GSHTTPAuthentication.m: * Source/NSClassDescription.m: * Source/NSSerializer.m: * Source/NSNull.m: * Source/NSValue.m: * Source/NSCountedSet.m: * Source/GSFileHandle.h: * Source/GSFileHandle.m: * Source/NSLock.m: * Source/NSSet.m: * Source/NSLocale.m: * Source/NSTask.m: * Source/NSJSONSerialization.m: * Source/NSCharacterSet.m: * Source/NSPortNameServer.m: * Source/NSXMLParser.m: * Source/NSConcreteHashTable.m: * Source/NSTextCheckingResult.m: * Source/NSEnumerator.m: * Source/GSFTPURLHandle.m: Improve atExit/leak handling to be executed with a thread and an autorelease pool in place. Record as deliberately 'leaked', objects created in +initialize methods and intended to persist until exit. Fix a couple of bugs exposed by turning on clean up of leaked objects. 2013-08-14 Lubos Dolezel * Source/NSBundle.m: add NSBundle pathForAuxiliaryExecutable: and -privateFrameworksPath and their URL counterparts * Headers/GNUstepBase/GSBlocks.h: Fixed the DEFINE_BLOCK_TYPE macro for certain GCC versions 2013-08-12 Richard Frith-Macdonald * Headers/Foundation/NSThread.h: * Source/NSThread.m: Added ([-performSelectorInBackground:withObject:]) convenience method from OSX 10.5 2013-08-10 Ivan Vucica * Source/NSPathUtilities.m: Disabled check for secure temporary directories under Cygwin. Refer to: http://stackoverflow.com/q/9561759/39974 for a possible cause of problems. * Source/objc-load.m: Codepaths used for MinGW are now also used for Cygwin. Even in case of some functionality that should be standard under UNIX systems, it turns out that this functionality is, sadly, not present under Cygwin (e.g. dladdr()). 2013-08-10 Lubos Dolezel * Source/NSBundle.m: add NSBundle bundleURL, builtInPlugInsURL, executableURL 2013-07-26 Richard Frith-Macdonald * Version: make ready for 1.24.5 release * Documentation/news.texi: 1.24.5 news * Documentation/ReleaseNotes.gsdoc: 1.24.5 release notes * NSTimeZones/NSTimeZones.tar: new timezone data * Source/NSTimeZone.m: fix error in zone directory name 2013-07-14 Wolfgang Lux * config/objc-common.g: Add +initialize to fake NSObject class when compiling with the Apple runtime, since it expects that method to be defined. 2013-07-11 Wolfgang Lux * Headers/GNUstepBase/GSVersionMacros.h: Fix definition of GS_OSX_ADJUST, which got things backward (converting a GNUstep style version into an OS X version instead of the other way around). Also make sure that MAC_OS_X_VERSION_MAX_ALLOWED gets converted when used in the definition of GS_OPENSTEP_V. 2013-07-09 Graham Lee * Source/GNUmakefile: * Source/NSInvocationOperation.m: * Headers/Foundation/Foundation.h: * Headers/Foundation/NSInvocationOperation.h: New invocation operation class 2013-07-09 Richard Frith-Macdonald * Source/GSTLS.m: Fix memory leak (credentials) 2013-07-09 Richard Frith-Macdonald * Headers/GNUstepBase/GSVersionMacros.h: Re-add define to set MAC_OS_X_VERSION_MAX_ALLOWED for OSX compatibility. 2013-07-06 Richard Frith-Macdonald * Source/cifframe.m: Fix possible incorrect free of non-malloc'ed memory. * Source/NSHost.m: fix uninitialised data warning * Source/NSMethodSignature.m: fix uninitialised variable * Source/NSPropertyList.m: avoid static analyser warning * Tools/gdomap.c: fix uninitialised data warning * Source/NSObject.m: fixup error in alignment calculation; was assuming that the alignment of a double would do but that's not good enough. On GCC we use the __BIGGEST_ALIGNMENT__ used on the machine, but clang has no support for that, so if it's not defined we now guess 16 rather than __alignof__(double). 2013-07-05 Richard Frith-Macdonald * Source/NSObject.m: Fix error creating instasnce when using the objc2 runtime and garbage collection. * Source/ObjectiveC2/runtime.c: implement class_createInstance() by calling NSAllocateObject() .. perhaps it should be the other way round though. configure.ac: Fix directory order error. configure: regenerate 2013-07-05 Fred Kiefer * Headers/GNUstepBase/GSTypeEncoding.h Include objc.h otherwise __GNU_LIBOBJC__ isn't defined. 2013-07-04 Richard Frith-Macdonald * Source/GSSocksParser/GSSocksParser.h: * Source/GSSocksParser/GSSocksParserPrivate.m: * Source/GSSocksParser/GSSocks4Parser.m: * Source/GSSocksParser/GSSocks5Parser.m: More portability fixes ... this time for mswindows. 2013-07-04 Ibadinov Marat * GSSocksParser/GSSocks5Parser.m: * GSSocksParser/GSSocks5Parser.h: * GSSocksParser/GSSocksParserPrivate.h: * GSSocksParser/GSSocksParser.m: * GSSocksParser/GSSocksParserPrivate.m: * GSSocksParser/GSSocksParser.h: * GSSocksParser/GSSocks4Parser.m: * GSSocksParser/GSSocks4Parser.h: Parsing code for SOCKS versions 4 and 5. 2013-07-03 Sebastian Reitenbach * Source/Additions/GSMime.m 2013-07-03 Ibadinov Marat * Source/Additions/GNUmakefile: * Headers/GNUstepBase/GSTypeEncoding.c: * Headers/GNUstepBase/GSTypeEncoding.h: New type encoding parser. 2013-07-03 Richard Frith-Macdonald * Headers/Foundation/NSException.h: * Headers/Foundation/NSObjCRuntime.h: * Headers/Foundation/NSString.h: * Headers/GNUstepBase/GSVersionMacros.h: * Headers/GNUstepBase/NSString+GNUstepBase.h: * Source/Additions/GCArray.m: * Source/Additions/GSMime.m: * Source/Additions/GSXML.m: * Source/Additions/NSObject+GNUstepBase.m: * Source/GSArray.m: * Source/GSHTTPURLHandle.m: * Source/GSNetServices.h: * Source/GSSocketStream.m: * Source/GSStream.m: * Source/GSString.m: * Source/GSTLS.m: * Source/NSAssertionHandler.m: * Source/NSCalendarDate.m: * Source/NSCallBacks.m: * Source/NSConnection.m: * Source/NSData.m: * Source/NSFileManager.m: * Source/NSIndexPath.m: * Source/NSIndexSet.m: * Source/NSJSONSerialization.m: * Source/NSKeyValueCoding.m: * Source/NSKeyedUnarchiver.m: * Source/NSLog.m: * Source/NSMessagePort.m: * Source/NSNetServices.m: * Source/NSNumber.m: * Source/NSObject.m: * Source/NSOperation.m: * Source/NSPointerArray.m: * Source/NSPortCoder.m: * Source/NSPortMessage.m: * Source/NSRange.m: * Source/NSSocketPort.m: * Source/NSSortDescriptor.m: * Source/NSString.m: * Source/NSThread.m: * Source/NSTimeZone.m: * Source/NSURLResponse.m: * Source/NSUnarchiver.m: * Source/NSXMLParser.m: * Source/unix/GSRunLoopCtxt.m: * Tools/AGSParser.m: Fixes for errors in printf style formats, (mostly 64bit issues) inspired by work done by Ibadinov Marat. 2013-07-01 Richard Frith-Macdonald * configure.ac: Add test for another libicu header * configure: regenerate * Headers/GNUstepBase/config.h.in: regenerate * Source/NSString.m: Add decompose/precompose methods derived from change in testplant branch. * Headers/GNUstepBase/GSVersionMacros.h: OSX compatibility tweak ... handle OSX style 4 digit versionn constants. * Headers/Foundation/NSArray.h: * Headers/Foundation/NSAutoreleasePool.h: * Headers/Foundation/NSBundle.h: * Headers/Foundation/NSCoder.h: * Headers/Foundation/NSComparisonPredicate.h: * Headers/Foundation/NSCompoundPredicate.h: * Headers/Foundation/NSConnection.h: * Headers/Foundation/NSData.h: * Headers/Foundation/NSDate.h: * Headers/Foundation/NSDictionary.h: * Headers/Foundation/NSError.h: * Headers/Foundation/NSException.h: * Headers/Foundation/NSExpression.h: * Headers/Foundation/NSHTTPCookie.h: * Headers/Foundation/NSHTTPCookieStorage.h: * Headers/Foundation/NSIndexPath.h: * Headers/Foundation/NSIndexSet.h: * Headers/Foundation/NSKeyValueObserving.h: * Headers/Foundation/NSLock.h: * Headers/Foundation/NSNetServices.h: * Headers/Foundation/NSObjCRuntime.h: * Headers/Foundation/NSOperation.h: * Headers/Foundation/NSPathUtilities.h: * Headers/Foundation/NSPointerArray.h: * Headers/Foundation/NSPointerFunctions.h: * Headers/Foundation/NSPredicate.h: * Headers/Foundation/NSProcessInfo.h: * Headers/Foundation/NSPropertyList.h: * Headers/Foundation/NSScanner.h: * Headers/Foundation/NSSet.h: * Headers/Foundation/NSSortDescriptor.h: * Headers/Foundation/NSSpellServer.h: * Headers/Foundation/NSStream.h: * Headers/Foundation/NSString.h: * Headers/Foundation/NSTimeZone.h: * Headers/Foundation/NSTimer.h: * Headers/Foundation/NSURL.h: * Headers/Foundation/NSURLAuthenticationChallenge.h: * Headers/Foundation/NSURLCache.h: * Headers/Foundation/NSURLConnection.h: * Headers/Foundation/NSURLCredential.h: * Headers/Foundation/NSURLCredentialStorage.h: * Headers/Foundation/NSURLDownload.h: * Headers/Foundation/NSURLError.h: * Headers/Foundation/NSURLProtectionSpace.h: * Headers/Foundation/NSURLProtocol.h: * Headers/Foundation/NSURLRequest.h: * Headers/Foundation/NSURLResponse.h: * Headers/Foundation/NSValueTransformer.h: * Headers/Foundation/NSXMLElement.h: * Headers/Foundation/NSXMLParser.h: Replace numeric version constants with OSX compatibility macros. 2013-06-27 Richard Frith-Macdonald * Source/NSConcreteMapTable.m: attempt to fix double retain bug introduced by clang/ARC changes. 2013-06-24 Wolfgang Lux * Tools/AGSIndex.m (mergeDictionaries): Fix typo in warning. 2013-06-23 Ivan Vucica * Source/NSFileManager.m: Fixed syntax error. 2013-06-23 Richard Frith-Macdonald * Source/NSFileManager.m: Don't attempt to set ownership of copied file. The code was already doing this right for directories, but not for other file types. 2013-06-21 Lubos Dolezel * Headers/GSBlocks.h: weakly import _Block_copy and _Block_release 2013-06-08 Lubos Dolezel * Source/NSTimeZone.m Implement nextDaylightSavingTimeTransitionAfterDate: 2013-06-06 Sebastian Reitenbach * Source/Additions/Unicode.m Headers/Foundation/NSString.h revert my change from 2013-05-29 breaks decoding of .gorm files in NSString for me on amd64 2013-05-31 Richard Frith-Macdonald * Source/NSLock.m: ([-lockWhenCondition:beforeDate:]) Lock mutex using -lockBeforeDate: so that we can abandon the wait for the condition at the spacified date in the case where we can't even obtain a lock before that date. Fix for bug #39126 2013-05-29 Sebastian Reitenbach * Headers/Foundation/NSString.h make NSStringEncoding enum typdef to NSUInteger * Source/Additions/Unicode.m fix format string to print out NSStringEncoding 2013-05-17 Ivan VuÄica * Source/NSDate.m: In case NAN macro is defined in math.h, prefer that over using the nan() function call. 2013-05-17 Richard Frith-Macdonald * Source/NSMessagePortNameServer.m: fix error in line count check in last change. 2013-05-16 Ivan VuÄica * Source/GSLocale.m: * configure.ac: Added check for whether there is any useful information in struct lconv. Android doesn't have anything there, despite having locale.h, so it makes little sense to try to access the nonexistent fields in GSLocale.m 2013-05-16 Ivan VuÄica * configure.ac: * cross.config: When cross-compiling, obeying an additional setting for Objective-C 2.0 support. Fixed a missing '$' in cross.config. 2013-05-15 Richard Frith-Macdonald * Source/NSMessagePortNameServer.m: fix for bug #38981 2013-05-13 Fred Kiefer * Headers/Foundation/NSKeyedArchiver.h, * Source/NSKeyedUnarchiver.m: Add method -replaceObject:withObject: from gui. 2013-05-13 Fred Kiefer * Tests/base/NSArchiver/stringEncoding.m: Use PASS_EQUAL instead of PASS. 2013-05-13 Richard Frith-Macdonald * Source/ObjectiveC2/runtime.c: when replacing a method, update the cache so we don't use the old version. * Source/NSNotificationCenter.m: trivial tweak to map release code and remove method caching for OSX compatibility :-( * Source/NSPropertyList.m: Fix bug byte swapping unicode in apple binary plist generation. * Tests/base/NSNotification/dynamic.m: Fix crash in testcase. 2013-05-13 Richard Frith-Macdonald * Source/NSURLConnection.m: Release delegate immediately after failure or succeess of communicationm (bug #38955). * Source/Additions/Unicode.m: Fix possible read beyond end of buf. 2013-04-24 Richard Frith-Macdonald * Source/GSMime.m: ([GSMimeParser-parse:]) fix possible infinite recursion when encountering a bad document. 2013-04-22 Richard Frith-Macdonald * Source/GSMime.m: Fix memory management error with excess bytes after parsing mime headers. 2013-04-18 Marcus Muller * Source/NSMetadata.m: Fix to expose variables to compiler building with non-fragile ABI. 2013-04-15 Richard Frith-Macdonald * Source/GNUmakefile: * Source/unix/GNUmakefile: * Source/unix/NSMetadata.m: * Source/win32/GNUmakefile: * Source/win32/NSMetadata.m: * Source/NSMetadata.m: * Headers/Foundation/NSMetadata.h: Move identical system specific metadata code to generic area so we can have system specific subclasses inherit common functionality. Fix instance variables so we won't break binrary compatibility in future. 2013-04-15 Richard Frith-Macdonald * cifframe.m: * GSString.m: * GSTLS.m: * NSArchiver.m: * NSCalendar.m: * NSCoder.m: * NSData.m: * NSDecimal.m: * NSDictionary.m: * NSDistantObject.m: * NSException.m: * NSFileManager.m: * NSHashTable.m: * NSIndexPath.m: * NSLocale.m: * NSMethodSignature.m: * NSNotificationCenter.m: * NSNumberFormatter.m: * NSObject.m: * NSPortCoder.m: * NSProcessInfo.m: * NSProxy.m: * NSRunLoop.m: * NSSocketPort.m: * NSString.m: * NSURL.m: * NSURLProtocol.m: * NSValue.m: * NSXMLDocument.m: * NSXMLNode.m: * NSXMLParser.m: More changes to avoid static analyzer false-positives/non-issues so we can see when real issues arise. Changes remove around 60 warnings and include about half a dozen minor bugfixes. 2013-04-14 Richard Frith-Macdonald * Headers/GNUstepBase/GSIMap.h: * Headers/GNUstepBase/NSObject+GNUstepBase.h: * Source/Additions/GSObjCRuntime.m: * Source/GSFormat.m: * Source/GSPrivate.h: * Source/GSString.m: * Source/NSBundle.m: * Source/NSJSONSerialization.m: * Source/NSKeyValueObserving.m: * Source/NSScanner.m: * Tools/gdomap.c: Tweaks to keep static analyser happy. 2013-04-13 Richard Frith-Macdonald * Headers/GNUstepBase/GNUstep.h: NSInteger/NSUInteger cleanup. * Source/NSAffineTransform.m: Fix -isEqual: for subclassing. * Source/NSObject.m: Remove previously deprecarted function * Source/NSProxy.m: Avoid compiler warning * Source/NSDistantObject.m: Avoid compiler warning 2013-04-12 Richard Frith-Macdonald * Source/NSPortCoder.m: Fix bug looking up class version information. 2013-04-10 Richard Frith-Macdonald * Source/NSScanner.m: improve the algoritm for parsing double values (new algorithm based on public domain pseudo code).. should be more accurate (for bug #38640). 2013-04-08 Richard Frith-Macdonald * Source/NSNotificationCenter.m: Fix bug #38680 2013-04-05 Richard Frith-Macdonald * config/pathtls.m4: Try to guess gnutls flags if no config found * configure: regenerate * Tools/AGSHtml.m: Fix error when title index missing. 2013-04-03 Richard Frith-Macdonald * Source/NSSocketPort.m: Improve/simplify invalidation. * Source/NSXMLParser.m: Fix (implement) parsing of entities inside quoted strings. 2013-03-28 Richard Frith-Macdonald Make release 1.24.4 * Documentation/ReleaseNotes.gsdoc: * Documentation/news.texi: * Headers/Foundation/NSFileManager.h: * Source/NSFileManager.m: Prepare documentation for release 2013-03-26 Richard Frith-Macdonald * Source/NSCalendar.m: * Headers/Foundation/NSCalendar.h: Rewrite NSCalendar instance variable usage to avoid breaking binary compatibility. Fix methods for setting the first week day and the minimum number of days in the first week of a month. 2013-03-25 Richard Frith-Macdonald * Source/NSAffineTransform.m: Fix decoding of keyed archive containing identity transform. * Source/NSString.m: * Tests/base/NSString/tilde.m: Fix to standardize string if necessary to determine whether it has the home directory as a prefix. 2013-03-23 Fred Kiefer * Source/NSXMLNode.m (-XMLStringWithOptions:): Revert change I made on 2012-12-01. 2013-03-20 Richard Frith-Macdonald * Tests/base/NSCalendar/features-10-7.m: * Source/NSCalendar.m: * Headers/Foundation/NSCalendar.h: New OSX 10.7 methods supplied by Lobos Dolezel and rewritten somewhat to avoid breaking binary compatibility. 2013-03-17 Richard Frith-Macdonald * Source/GSSet.m: Some optimisation for set intersection. 2013-03-16 Fred Kiefer * Tests/base/NSLocale/general.m, * Tests/base/NSTimeZone/use.m: Mark more tests that depend on locale setting as hopes. * Tests/base/GSXML/basic.m: Set the timezone of the GSXMLRPC to get the same date string in the output. 2012-03-16 Richard Frith-Macdonald * NSTimeZones/NSTimeZones.tar: * Tools/gsdoc-1_0_0.dtd: * Tools/gsdoc-1_0_1.dtd: * Tools/gsdoc-1_0_2.dtd: * Tools/gsdoc-1_0_3.dtd: * Tools/gsdoc-0_6_5.dtd: * Tools/gsdoc-0_6_6.dtd: * Tools/gsdoc-0_6_7.dtd: * Tools/plist-0_9.dtd: Update/correct FSF address. 2012-03-16 reussandras@gmail.com * base/Source/NSCalendar.m: Add simple quarter calculation. * base/Source/NSPathUtilities.m: Fix bug handling defaults dir config (was treating absolute path as relative). 2012-03-16 Richard Frith-Macdonald * NSTimeZones/NSTimeZones.tar: Update timezone information 2012-03-16 Emmanuel Maillard * configure.ac: checks for pthread library and password structure * Headers/GNUstepBase/config.h.in: new define for password field * Source/NSPathUtilities.m: use new define * configure: regenerate Changes for Android build 2012-03-12 Richard Frith-Macdonald * Source/GSPrivate.h: Change hash function args and add new functions * for incremental hash. * Source/NSString.m: Update to use the private hash function introduced for NSSortdescriptor. * Source/GSString.m: ditto. * Source/NSSortDescriptor.m: Update for new function arguments. * Source/GSPrivateHash.m: Add alternative version of hash functions (old code plus new public domain murmurhash3 code). * Source/GNUmakefile: Build alternative hash functions. build with OLDHASH defined to 0 to get new alternatives. 2012-03-10 Richard Frith-Macdonald * Source/NSFileManager.m: Fix some autorelease pool management issues. 2013-03-09 Sebastian Reitenbach * Tests/base/NSFileManager/general.m remove accidently snucked in header 2013-03-08 Sebastian Reitenbach * Headers/Foundation/NSFileManager.h: * Source/NSFileManager.m: * Tests/base/NSFileManager/general.m: Implement methods forcoping/moving file URLs 2013-03-05 Larry Campbell * Source/NSFileManager.m: Fix for ([-contentsEqualAtPath:andPath:]) compare contents of regular files in subdirectories. 2013-03-05 Sebastian Reitenbach * Source/NSFileManager.m: * Headers/Foundation/NSFileManager.h: ([createDirectoryAtURL:withIntermediateDirectories:attributes:error:]) implemented. Also, for OSX compatibility, RFM 'fixed' the ...error: methods to leave the error value unmodified in the case where no error occurs. 2013-03-03 Sebastian Reitenbach * Source/NSKeyValueObserving.m * Source/NSXMLParser.m char is unsigned on macppc, so don't compare it against negative values 2013-03-01 Richard Frith-Macdonald * Version ... bump subminor number in preparation for next release. 2013-02-28 Richard Frith-Macdonald Make release * Version: * Source/NSRegularExpression.m: * Source/NSURLResponse.m: * Source/NSString.m: * Source/DocMakefile: * Source/GSNetServices.h: * Documentation/news.texi: * Documentation/ReleaseNotes.gsdoc: * Headers/GNUstepBase/GSVersionMacros.h: * Headers/Foundation/NSNetServices.h: * Headers/Foundation/NSBundle.h: * Headers/Foundation/NSXMLDocument.h: * Headers/Foundation/NSXMLNode.h: * Headers/Foundation/NSObjCRuntime.h: * Headers/Foundation/NSXMLDTD.h: * Headers/Foundation/NSXMLDTDNode.h: * Headers/Foundation/NSXMLElement.h: * Headers/Foundation/NSXMLParser.h: * Tools/DocMakefile: * Tools/AGSParser.m: Bump version for new release, add release notes, clean up documentation. 2013-02-28 Richard Frith-Macdonald * Tests/base/NSString/test00.m: Add a few tests for searching subrange of a string. * Source/GSString.m: ([rangeOfCharacterFromSet:options:range:]) Fix for overrun when searching backwards ... spotted by Fred. 2013-02-17 Richard Frith-Macdonald * Source/GSAvahiRunLoopIntegration.m: Remove code which was clearing bitmask values needed to track whether watcher needed to be removed from run loop. 2013-02-16 Richard Frith-Macdonald * Source/NSURL.m: a data url ignores any base URL. * Source/GSAvahiClient.m: remove self from runloop on dealloc. 2013-02-15 Richard Frith-Macdonald * Source/NSPredicate.m: updates to output correct predicate format for binary operators. * Source/NSURL.m: unescape data for -relativePath 2013-02-10 Marcus Muller * Source/GSMDNSNetServices.m: enable whether a delegate is set or not. 2013-02-10 Richard Frith-Macdonald * Source/NSURL.m: For OSX compatibility, if we are creating a relative URL and the base URL has a different scheme from the base, then we ignore the base URL rather than raising an exception. 2013-02-03 Richard Frith-Macdonald * Source/NSThread.m: Fix error in check for perform on finished thread. 2013-01-24 Richard Frith-Macdonald * Source/NSCalendar.m: (-[dateByAddingComponents:toDate:options:]), ([-dateFromComponents:]) add support for missing components. 2013-01-22 Fred Kiefer * Source/NSPredicate.m: Fixup parsing of function expressions. 2013-01-14 Richard Frith-Macdonald * Source/NSLocale.m: ([-_getExemplarCharacterSet]) Fix error in handling returned range (bug #38118 reported by X Y * Source/NSPropertyList.m: Fix encoding of date objects when using the OpenStep format to simply used the description of the3 date. Fixes bug #38017 * Source/NSURLConnection.m: a synchronous download with no response body should return an empty data item rather than nil ... fix for bug #38043 * Source/GSTLS.m: Log a warning message if we load a certificate which has expired or is not yet valid. 2013-01-14 Richard Frith-Macdonald * Source/NSString.m: ([stringByAppendingPathComponent:]) recalculate root of patch correctly before stripping trailing separators. 2013-01-13 Fred Kiefer * Headers/Foundation/NSDistributedNotificationCenter.h, * Source/NSDistributedNotificationCenter.m: Correct the return types of the factory methods. 2013-01-08 Richard Frith-Macdonald * Source/GSString.m: When creating a substring (C) of a substring (B) or a string (A), we now retain the (A) in (C) rather than having (C) retain (B) which in turn retains (A). This has the advantage that it is possible for the intermediate (B) to be released if nothing else ues it. 2013-01-05 00:49-EST Gregory John Casamento * Headers/Foundation/NSMetadata.h: Add _ to delegate. * Source/GNUmakefile: Remove reference to NSMetadata.m * Source/NSMetadata.m: Remove from here and add OS specific implementations. * Source/unix/GNUmakefile: Add new file... * Source/unix/NSMetadata.m: UNIX implementation... * Source/win32/GNUmakefile: Add new file.. * Source/win32/NSMetadata.m: Windows implementation. 2012-12-18 Richard Frith-Macdonald * Source/NSNetServices.m: patch by Marcus Muller to correctly check that either the input or the output stream has been opened. * Source/GSString.m: patch by Stefan Bidi to optimise utf-8 to utf-16 conversion a little. 2012-12-12 Richard Frith-Macdonald * Source/GSMime.m: Fix parsing of final boundary in a multipart document so that the trailing '--' ends the boundary and no CRLF is required. The grammar in RFC1341 says that the final boundary does not need a CRLF terminator. 2012-12-08 Richard Frith-Macdonald * Source/GSTLS.m: * Source/NSNotificationCenter.m: * Source/NSPropertyList.m: Tweaks to avoid compiler warnings spotted by Fred. 2012-12-06 Richard Frith-Macdonald * Source/NSHTTPCookieStorage.m: Don't read store if it doesn't exist. * Source/GSTLS.h: Use time interval for caching * Source/GSTLS.m: More efficient caching 2012-12-06 Richard Frith-Macdonald * Source/NSPropertyList.m: remove a couple of useless debug logs. * Source/GSTLS.h: Add credentials object * Source/GSTLS.m: Implement caching of credentials so that they are shared between different sessions (eg a web server accepting multiple incoming connections can re-use the same credentials for each of them). This is to address a performance issue due to decoding certificate information from file to create new credentials when lots of incoming connections occur. 2012-12-05 Richard Frith-Macdonald * Source/NSFileHandle: ([-sslHandshakeEstablished:outgoing:]) Set the connection into non-blocking mode so that the handshake will not block if the other end refuses to talk to us. 2012-12-01 Fred Kiefer * Source/NSXMLNode.m (-XMLStringWithOptions:): Use macros for versions of libxml2. 2012-11-28 Richard Frith-Macdonald * configure.ac: Fixup ICU test error * configure: regenerate Change tests so that we no longer ignore it when icu-config tells us we have too old a version to use. 2012-11-27 Richard Frith-Macdonald * Source/GSHTTPURLHandle.m: Set content-length header in outgoing request if not already set. * Headers/Additions/GNUstepBase/GSMime.h: * Source/Additions/GSMime.m: Add methods to control line folding. 2012-11-25 14:39-EST Gregory John Casamento * Headers/Foundation/NSMetadata.h * Source/NSMetadata.m: Add NSMetadataQueryAttributeValueTuple and NSMetadataQueryResultGroup classes. 2012-11-21 12:10-EST Gregory John Casamento * Headers/Foundation/NSMetadata.h: Add ivars. * Source/NSMetadata.m: Cleanup compilation error. 2012-11-20 12:50-EST Gregory John Casamento * Headers/Foundation/NSMetadata.h: Declaratioins for constants and NSMetadataItem. * Source/NSMetadata.m: Implementation of NSMetadataItem and definition of constants. 2012-11-19 18:54-CET Ivan VuÄica * Source/GSInvocation.h: Renamed GSFrameInvocation to GSDummyInvocation, to match implementation in Source/NSInvocation.m. 2012-11-18 11:47-EST Gregory John Casamento * Headers/Foundation/NSMetadataQuery.h: Remove old file. * Source/GNUmakefile: Change name to NSMetadata.[hm]. * Source/NSMetadata.m: Add new file with correct name. * Source/NSMetadataQuery.m: Remove old file. 2012-11-18 11:29-EST Gregory John Casamento * Headers/Foundation/Foundation.h: Add NSMetadataQuery.h to include list. * Headers/Foundation/NSMetadataQuery.h: New header for class. * Source/GNUmakefile: Add NSMetadataQuery.[hm] to makefile. * Source/NSMetadataQuery.m: Abstract implementation for NSMetdataQuery. The idea is much like NSFileStream and other classes which have operating system specific implementations. On linux this will, most likely, interface with locate/slocate. I'm not certain what it will talk to on Win32. 2012-11-15 Quentin Mathe * Source/NSAutoreleasePool.m (-emptyPool): Fixed not to push a pool to the cache in the ARC_RUNTIME implementation, -dealloc does it already. For the same current pool instance, the ARC_RUNTIME implementation was calling push_pool_to_cache() twice, once in -emptyPool and another -dealloc. Which meant a pool still in use could be reused, then it was possible to get stuck in an infinite loop. 2012-11-05 Wolfgang Lux * Source/GSFFIInvocation.m (GSFFIInvocationCallback): Generate useful error message when no best typed selector can be found. 2012-11-02 Wolfgang Lux * configure.ac: Use AC_FUNC_STRERROR_R to check for presence and version of the strerror_r function. * Source/Additions/NSError+GNUstepBase.m (-_systemError:): Add conditional code for glibc specific version of strerror_r. * Source/common.h: No longer redefine feature test macros as this could invalidate the autoconf results. * configure: * Headers/GNUstepBase/config.h.in: * SSL/configure: * SSL/config.h.in: Regenerated by autoreconf. 2012-10-30 Richard Frith-Macdonald * Source/Additions/NSError+GNUstepBase.m: * Source/GSFileHandle.m: * Source/GSMDNSNetServices.m: * Source/NSMessagePort.m: * Source/NSSocketPort.m: * Source/NSSocketPortNameServer.m: * Source/NSThread.m: * Source/common.h: Changes to try to get inclusion of system specific features right. In particular, we want strerror_r() to be POSIX complient so that we get correct system erorr messages. 2012-10-28 Richard Frith-Macdonald * Headers/Foundation/NSGeometry.m: Fix so that an empty rect can never intersect any other (including itsself). Reported by Banly Kemiyatorn and Fred Kiefer. 2012-10-26 Richard Frith-Macdonald * Instance/Documentation/texi.make: Fix installation/clean of html documents generated from texi files. 2012-10-25 Quentin Mathe * Headers/GNUstepBase/GSConfig.h.in: Prevent redefinition warnings for __STDC_LIMIT_MACROS and __STC_CONSTANT_MACROS (both are ObjC++ related). 2012-10-22 Thomas Davie * Headers/Foundation/NSSet.h: * Source/NSSet.m: Add -objectsPassingTest: 2012-10-22 Rene Hexel * Source/Additions/GSXML.m: In libxml2 the content and use fields have become private and are only exposed through xmlBufContent() and xmlBufUse() since libxml-2.9.0. Use those macros for newer versions of libxml2. 2012-10-20 Richard Frith-Macdonald * Source/NSConnection.m: Use NSUInteger for array indexes/counters. 2012-10-18 Richard Frith-Macdonald * Source/NSXMLParser.m: Try to fix entity parsing bug #37596 2012-10-17 Richard Frith-Macdonald * Source/NSBundle.m: * Source/NSCalendarDate.m: * Source/NSFileManager.m: * Source/NSJSONSerialization.m: * Source/NSMessagePort.m: * Source/NSMessagePortNameServer.m: * Source/NSPropertyList.m: Avoid autoreleasing things in +initialize when there may be no autorelease pool present ... we don't want to either leak or cause recursive loops when we want to log any leaks. 2012-10-15 Eric Wasylishen * Tests/base/NSArchiver/stringEncoding.m: add test for last commit 2012-10-15 Eric Wasylishen * Source/NSPropertyList.m (-[GSBinaryPLGenerator storeString:): Write unicode strings in big-endian instead of little-endian. The resulting plists now load properly on OS X. Thanks to rdemet for bug report. 2012-10-15 Richard Frith-Macdonald * Headers/Foundation/NSCharacterSet.h: * Source/NSCharacterSet.m: For a long time Apple's docs and headers said that the methods for returning standard charactersets returned 'NSCharacterSet*', which was annoying when they were called on NSMutableCharacterSet. It seems they finally changed to returning id, so we can do the same. 2012-10-12 Richard Frith-Macdonald * Headers/GNUstepBase/NSDebug+GNUstepBase.h: Fix format of logs produced by two of the three method macros ... a bug spotted by Fred. 2012-10-03 Richard Frith-Macdonald * Source/GSFormat.m: for C-string formatting, avoid reading to the nul terminator ... limit to a number of bytes equal to the precision (if any) given in the format. This may be the wrong thing to do when handling multibyte encodings (where a natural expectation is to have precision mean number of characters), but seems legitimate going by current xopen printf documentation. 2012-10-03 Wolfgang Lux * SSL/GSSSLHandle.m (-sslSetOptions): Apply string name change missed during TLS reorganisation. 2012-09-30 Richard Frith-Macdonald * Source/GSSocketStream.m: * Source/GSTLS.m: * Source/GSHTTPURLHandle.m: * Source/NSURLProtocol.m: * Headers/Foundation/NSFileHandle.h: Add GNUstep TLS/SSL options when loading HTTPS URLs. 2012-09-26 Richard Frith-Macdonald * Source/NSUserDefaults.m: Fix error synchronising from changes in database ... was not sending the notification to say we had updated. * Headers/Foundation/NSFileHandle.h: * Source/GSSocketStream.m: * Source/GSTLS.h: * Source/GSTLS.m: * Source/NSFileHandle.m: More TLS reorganisation and adding diagnostics 2012-09-25 Richard Frith-Macdonald * Source/GNUmakefile: * Source/GSSocketStream.m: * Source/NSFileHandle.m: * Headers/Foundation/NSFileHandle.h: * SSL/GSSSLHandle.m: * Source/GSTLS.h: * Source/GSTLS.m: Restructure to separate some of the tls functionality out. 2012-09-24 Richard Frith-Macdonald * Source/NSBundle.m: Fix error spotted by Fred. 2012-09-24 Richard Frith-Macdonald * Headers/Foundation/NSFileHandle.h: deprecate old method for setting certificate and add new one. * SSL/GSSSLHandle.m: Support new method and move generic code to NSFileHandle.m * Source/GSSocketStream.m: Implement NSFileHandle SSL/TLS support using GNUTLS. * Source/NSFileHandle.m: Some ssl/tls restructuring, use GNUTLS if available. * configure.ac: Don't build SSL bundle if isupport is built-in. * GNUmakefile: ditto * base.make.in: ditto ... plus fix to define setting to show whether ICU is avaiable. * configure: regenerate 2012-09-23 Niels Grewe * Source/GSSocketStream.m: Expose GSFileHandle ivars for compilation with the non-fragile ABI. * Headers/GNUstepBase/GSVersionMacros.h: Restore line that was accidentally commented out. 2012-09-23 Niels Grewe * Source/GSTimSort.m: Fix typo. 2012-09-21 Richard Frith-Macdonald * Source/NSArray.m: * Source/NSDate.m: * Source/NSDictionary.m: * Headers/Foundation/NSArray.h: Comment/documentation fixups to avoid warnings etc. * Tools/AGSParser.h: * Tools/AGSParser.m: Fix memory management error causing reference to deallocated object. 2012-09-20 Niels Grewe * Source/GSTimSort.m: A few more timsort bugfixes. 2012-09-20 Niels Grewe * Source/GSTimSort.m: Fix bugs in the timsort implementation. 2012-09-20 Richard Frith-Macdonald * Source/GSQuickSort.m: Fixed this to compile and (apparently) work. 2012-09-20 Richard Frith-Macdonald * configure.ac: Change sort selection to use shellsort by default and to make sort selection internal to gnustep-base rather than public. * configure: regenerate * Headers/GNUstepBase/config.h.in: regenerate * Headers/GNUstepBase/GSConfig.h.in: Remove public sort selection info * Source/GSQuickSort.m: Use config.h to control build/not-build. * Source/NSSortDescriptor.m: Reference the selected sort class to ensure that it is linked in and loaded at runtime. * Source/GSShellSort.m: Fix bug in function arguments. Use config.h to control build/not-build. * Source/GSSorting.h: tidied a little * Source/GSTimSort.m: Use config.h to control build/not-build. The changes are basically to keep sort information internal to base rather than exposing it and, more importantly, to get sorting working again. This involves: 1. minor fix to shellsort to get it to work. 2. change configure script to select shellsort. The problems with the other sorts are: a. quicksort won't even compile b. timsort does compile, but segfaults when you try to give it real-world datasets to sort Anyone wantng to fix these, please do (it would be really cool to have timsort working). 2012-09-19 Niels Grewe * Source/GSSorting.h * Source/NSSortDescriptor.m: Add new generic interface for sorting. * Source/GSTimSort.m: Implement timsort sorting algorithm. * Source/GSQuickSort.m * Source/GSShellSort.m: Factor out previously used sorting algorithms. * Source/GSArray.m * Source/NSArray.m: Modify to use the new sorting interface for sorting using functions, NSSortDescriptor, and NSComparator. Implement NSComparator based sorting and insertion index searching methods. * Source/GNUmakefile: Connect new files to the build. * configure.ac: Add configure switch to allow selection of sort algorithm. * Headers/GNUstepBase/GSConfig.h.in: Add defines for sort algorithm selection. * configure: Regenerate * Headers/Foundation/NSObjCRuntime.h * Headers/Foundation/NSArray.h: Declarations for new NSComparator based sorting methods. * Tests/base/NSArray/general.m * Tests/base/NSArray/blocks.m: Add tests for new functionality. * Tests/base/NSArray/random.plist * Tests/base/NSArray/sorted.plist: Add sorting example data that is large enough to test more sophisticated sorting algorithms. Completely overhaul how we do sorting in -base. GSSorting.h now defines an interface that can be used for all sorting tasks in the library. The actual sort algorithms to use are now plugable. Timsort is the new default sorting algorithm, the existing algorithms, shellsort and quicksort can still be selected using a configure switch, but they do not override timsort completely because they are unstable. Also implement the new NSComparator (blocks) based sorting and insertion index searching methods for NSMutableArray and NSArray. 2012-09-17 12:03-EDT Gregory John Casamento Merged from the testplant branch. * Headers/Foundation/Foundation.h * Headers/Foundation/NSScriptWhoseTests.h * Source/GNUmakefile * Source/NSObject+NSComparisonMethods.m: Move the comparison methods to the header for NSScriptWhoseTests.h, but don't define the abstract class since we don't support Apple script. 2012-09-16 Richard Frith-Macdonald * Source/NSURL.m: * Tests/base/NSURL/basic.m: Add support for data: URL 2012-09-10 Richard Frith-Macdonald * Source/NSJSONSerialization.m: Fix quoting of string output by copying code from WebServices library. 2012-09-10 Richard Frith-Macdonald * Source/NSJSONSerialization.m: * Source/NSPropertyList.m: Improve serialisation of booleans. 2012-09-10 Richard Frith-Macdonald * Headers/Foundation/NSDate.h: Declare new OSX method to add time interval to a date. * Source/NSDate.m: Implement it * Source/NSCalendarDate.m: Ditto * Source/NSRunLoop.m: Add exception handling for run loop performer. 2012-09-10 Sergii Stoian * Source/NSFileManager.m: [createDirectoryAtPath:withIntermediateDirectories:attributes:error:]: Create directories only if it doesn't exist. 2012-09-09 Wolfgang Lux * Source/NSPropertyList.m (-storeString): Add missing variable declaration on big-endian systems. 2012-09-06 Richard Frith-Macdonald * Source/NSPropertyList.m: Don't ignore whitespace in keys and values when parsing XML ... the DTD says everything apart from array and dict contains #PCDATA. 2012-09-05 Richard Frith-Macdonald * Source/NSScanner.m: Compatibility tweak reported by hns@computer.org A string like '1.2eX' where X is not a numeric exponent, needs to be scanned as a float/double up to (but not including) the 'e' (or 'E') rather than being treated as a badly formatted float/double. 2012-09-04 Fred Kiefer * Tests/base/NSXMLDocument/cdata.m: New test case for CDATA. 2012-09-03 Richard Frith-Macdonald * Source/NSTimeZone.m: * Source/NSBundle.m: * Source/NSPropertyList.m: * Source/NSProcessInfo.m: * Source/NSSocketPort.m: * Source/NSRunLoop.m: * Source/NSMessagePortNameServer.m: * Source/NSDistributedLock.m: * Source/GSHTTPURLHandle.m: * Source/NSZone.m: * Source/NSPage.m: * Source/NSMessagePort.m: * Source/NSUnarchiver.m: * Source/win32/GSFileHandle.m: * Source/NSFileManager.m: * Source/common.h: * Source/NSString.m: * Source/Additions/NSData+GNUstepBase.m: * Source/Additions/Unicode.m: * Source/Additions/NSMutableString+GNUstepBase.m: * Source/Additions/NSError+GNUstepBase.m: * Source/Additions/GSMime.m: * Source/Additions/NSString+GNUstepBase.m: * Source/Additions/GCArray.m: * Source/Additions/GSXML.m: * Source/Additions/NSNumber+GNUstepBase.m: * Source/Additions/GSObjCRuntime.m: * Source/GSString.m: * Source/NSObjCRuntime.m: * Source/GSFormat.m: * Source/GSFileHandle.m: * Source/NSTask.m: On windows with mingw we can use strtoull() rather than _strtoui64(). Also, remove redundant header includes since string.h is in common.h 2012-09-03 Niels Grewe * configure.ac: Fallback to the non icu-config check for ICU in the general case. * configure: Regenerate. 2012-09-01 Niels Grewe * configure.ac: Implement `--disable-icu-config' switch to configure for platforms that ship libicu but not icu-config. * configure: Regenerate. 2012-08-27 Richard Frith-Macdonald * Source/NSSstring.m: ([-stringByAppendingPathComponent:]) fix for append to an empty string with a windows path as an argument. 2012-08-26 Niels Grewe * configure.ac: Check for sys/filio.h and whether we need to link libsocket (as on QNX). * configure * SSL/configure * Headers/GNUstepBase/config.h.in: Regenerate. * Source/common.h * Source/GSFileHandle.m * Source/NSMessagePort.m * Source/NSSocketPort.m * Source/NSThread.m * SSL/GSSSLHandle.m: QNX compatibility tweaks. * Tools/gdnc.m * Tools/gdomap.c: Use slog facility for logging on QNX. Compatibility improvements for building for QNX. 2012-08-26 Niels Grewe * configure.ac: Check for QNX slog facilities. * Headers/GNUstepBase/config.h.in * configure: Regenerate * Source/NSLog.m: Implement logging to the QNX slog. Add support for logging to the QNX slog via NSLog(). 2012-08-25 Niels Grewe * configure.ac: Allow a cross-compilation configuration to be specified using the `--with-cross-compilation-info=' switch. Tweak configure script to behave gracefully when cross-compiling. * configure: Regenerate. * cross.config: Add default values for cross-compilation. Make the configure script behave more friendly when cross-compiling. 2012-08-16 Niels Grewe * configure.ac: Check for objc_root_class attribute * configure: Regenerate * config/objc-common.g: Annotate root classes. * Headers/GNUstepBase/config.h.in: Regenerate * Headers/GNUstepBase/GSConfig.h.in: Add macro for root class attribute availability. * Headers/GNUstepBase/GSVersionMacros.h: Define GS_ROOT_CLASS depending on whether the compiler supports it. * Headers/Foundation/NSObject.h: Mark NSObject as a root class. * Headers/Foundation/NSProxy.h: Mark NSProxy as a root class. * Source/NSDistantObject: Mark GSDistantObjectPlaceholder as a root class. * Source/NSObject.m: Mark NSZombie as a root class. Changes to support clang's __attribute__((objc_root_class)). 2012-08-10 Richard Frith-Macdonald * Source/NSScanner.m: Fix error in comment * Tools/pldes.m: Update to more modern APIs * Tools/plser.m: Update to more modern APIs * Source/NSPropertyList.m: Update for usigned long long * Source/NSString.m: Make intValue, integerValue, longLongValue return large unsigned values as negative. Fixes to try to cope with property lists containing very large unsigned integers (top bit set). 2012-08-10 Richard Frith-Macdonald * Source/NSPathUtilities.m: Fix permissions on temporary directory rarther than just failing ... suggestion by Wolfgang. 2012-08-10 Richard Frith-Macdonald * Source/NSFileManager.m: ([-createDirectoryAtPath:attributes:]) OSX compatibility change to no longer create intermediate directories (fixing bug #35672). NB. Code depending on the original incorrect behavior should be updated to use the new method: -createDirectoryAtPath:withIntermediateDirectories:attributes:error: 2012-08-10 Richard Frith-Macdonald * Source/NSSpellServer.m: * Source/NSPropertyList.m: * Source/NSPathUtilities.m: * Source/NSUserDefaults.m: * Source/NSMessagePortNameServer.m: * Source/NSDistributedLock.m: * Source/NSMessagePort.m: * Source/NSHTTPCookieStorage.m: Use new method for creating intermediate directories rater than depending on incorrect behavior of the old method. 2012-08-09 Richard Frith-Macdonald * Source/NSPropertyList.m: Fix problem considering a lack of whitespace at the end of the list as an error. * GSeq.h: Replace tolower() with uni_tolower() where using 8bit strings and the internal coding is latin1 and may not be the same as the native encoding. 2012-08-08 Riccardo Mottola * Tools/AGSParser.m: Add macro detection for MacOS version 10.1 to 10.6 and make GS_API_LATEST the last in priority. 2012-08-08 Richard Frith-Macdonald * Source/GSString.m: Simplify/remove upper and lower case conversion to use superclass implementation avoiding toupper() and tolower(). Change other literal string methods to check that the content is really utf8 in more places. Generally simplify/cleanup a bit. 2012-08-02 Richard Frith-Macdonald * Source/GSValue.m: ([-isEqualToValue:]) add check for self equality and fix error checking tyep signature. * Source/Additions/GSObjCRuntime.m: (GSSelectorTypesMatch) fix to return a true BOOL value. 2012-07-31 Richard Frith-Macdonald * Source/Additions/GSMime.m: Optimisations for chunked encoding. a. Don't resize the buffer for each chunk ... that's very inefficient if the other end sends tiny chunks. Instead, make the buffer big enough to handle all the available data, then shrink back to the decoded size. b. Move method call out of the loop handling individual bytes. 2012-07-30 Richard Frith-Macdonald * Source/NSData.m: ([setLength:]) increase size of buffer in chunks proportional to the current size ... so if we add small amounts to a buffer many, many times, we don't reallocate the memory for each tiny increment. Should make accumulating large amounts of data into a buffer much more efficient. 2012-07-27 Richard Frith-Macdonald * Source/NSKeyValueObserving.m: Try fix for bug #36967 2012-07-27 Richard Frith-Macdonald * Source/NSXMLNode.m: Just report string value as description ... which appears to be what OSX does. * Tests/base/KVC/mutable.m: Add tests based on code by Riccardo. 2012-07-27 Richard Frith-Macdonald * Source/NSKeyValueObserving.m: * Source/GSFFIInvocation.m: * Source/GSPrivate.h: * Source/NSInvocation.m: * Source/cifframe.h: * Source/cifframe.m: Initial attempt at implementing KVO for structure setter methods in general via libffi. 2012-07-27 Fred Kiefer * Source/NSXMLNode.m (-description): Remove trailing newline. This should fix #36976. 2012-07-11 Richard Frith-Macdonald * Source/GSFFCallInvocation.m: * Source/NSKeyValueObserving.m: * Source/Additions/GSObjCRuntime.m: * Source/NSProtocolChecker.m: * Source/GSValue.m: * Source/NSValue.m: Use GSSelectorTypesMatch() for type comparisons. 2012-07-12 19:26-EDT Gregory John Casamento * Source/NSFileManager.m: Correct misspelled ASSIGN which was causing link errors. 2012-07-11 Richard Frith-Macdonald * Source/Additions/GSMime.m: Don't accept documents where header lines contain bytes which can't be converted to a string. 2012-07-11 Richard Frith-Macdonald * Source/NSKeyedArchiver.m: * Source/NSCoder.m: * Source/Additions/GSObjCRuntime.m: * Source/NSArchiver.m: * Headers/GNUstepBase/GSObjCRuntime.h: Have leading type qualifiers and laout information skipped when encoding a value of on ObjC type, rather than objecting that the supplied type string is not a known type. Fix for bug #36824 2012-07-09 Richard Frith-Macdonald * Source/GSFFIInvocation.m: Fix for bug #36706 * Source/NSObject.m: Also, apply patch by Niels Grewe with modsvn commit 2012-07-09 Sebastian Reitenbach * Source/NSThread.m: Fixes test for posix thread scheduling. 2012-07-09 Richard Frith-Macdonald * Source/NSBundle.m: Fixes for bug #34815 ... map between old and new style language names and use the best language specific resource available. * Resources/Languages/Locale.canonical: Add mappings from three letter language names to two letter names where they exist. 2012-07-08 Richard Frith-Macdonald * Headers/GNUstepBase/GSVersionMacros.h: fix for bug #36650 * Source/NSFileManager.m: Apply rewritten patch by Sergey Golovin * Source/NSBundle.m: Fix for bug #34815 ... we shoudl now move to using ISO names. 2012-07-08 Richard Frith-Macdonald * Source/NSURL.m: * Source/NSURLHandle.m: Re-load a cached handle if the content has been invalidated. Set the status of a file handle to not-loaded if the fiel is modified. Should fix bug #36726 2012-07-05 Richard Frith-Macdonald * Source/NSBundle.m: Don't assume that code loading won't be called re-entrantly. 2012-07-05 Quentin Mathe * Source/NSPathUtilities.m: Fixed constant string comparison error reported by Clang SVN trunk r158230 or more recent. See http://llvm.org/viewvc/llvm-project?view=rev&revision=158230 This is a workaround for a Clang compiler bug ... 2012-07-02 Richard Frith-Macdonald * Source/NSBundle.m: Attempted fix for bug #34191 ... change framework class association to keep a map of loaded frameworks/bundles by class for quick lookup and alter code to check the runtime for new frameworks if we are asked for the bundle for a class and we can't find it. 2012-06-27 Richard Frith-Macdonald * Source/NSScanner.m: Fix missing 'else' which was causing a memory leak and minor performance degradation. 2012-06-12 Richard Frith-Macdonald * Source/NSPropertyList.m: Check for nil property list argument. 2012-06-07 Wolfgang Lux * Source/unix/GSRunLoopCtxt.m (-pollUntil:within:): Fix previous change to compile again when using select() instead of poll(). 2012-06-06 Richard Frith-Macdonald * Source/NSSocketPort.m: * Source/unix/GSRunLoopCtxt.m: * Source/NSMessagePort.m: * Source/win32/GSRunLoopCtxt.m: Modify code for getting file descriptors to cope with an unlimited number (allocate buffer on heap if necessary) for server processes with very large numbers of distributed object connections. 2012-04-30 Riccardo Mottola * Source/NSString: Do not include malloc on OpenBSD to avoid warning (and include stdlib always). 2012-04-29 Riccardo Mottola * Source/common.h: Extend David's hack to all known non-glibc platforms 2012-02-28 Richard Frith-Macdonald * Source/NSArchiver.m: * Source/NSUnarchiver.m: * Source/NSPortCoder.m: * Source/Coder.m: Updates to cope with the fact that some BSD ports of gnustep-base used incorrect versioning, and that people have released Gorm files with versioning incompatible with current releases. 1. dissociate coder -systemVersion from the actual system version, so that if people mess with the gnustep-base version, their non-standard releases will still interoperate with normal code. 2. Implement new array encoding/decoding compatible with earlier versions (except if the array contains exactly 0xffffffff items). 3. Raise exception if decoding archives with an unsupported version. 4. Add GSCoderSystemVersion user default to override the system version used for encoding ... for testing and tweaking to generate archives in, or communicate with DO servers using an earlier version. 2012-04-23 Fred Kiefer * Tests/base/NSAutoreleasePool/autorelease_eh.m: Get new test to run with older compilers. 2012-04-23 12:47 theraven * libs/base/trunk/Source/NSAutoreleasePool.m, libs/base/trunk/Tests/base/NSAutoreleasePool/autorelease_eh.m: Fix a bug in the new autorelease pool implementation when pools are destroyed in the wrong order. Test cast by Chris Armstrong! 2012-04-22 Riccardo Mottola * Source/GSString.m Do not include malloc on OpenBSD to avoid warning. 2012-04-18 Fred Kiefer * Tools/pl2link.m (main): Get the category from a new entry named FreeDesktopCategories. Patch by Philippe Roussel . 2012-04-17 Richard Frith-Macdonald * Source/ObjectiveC2/runtime.c: Fi error calculating instance variable offset size as reported/suggested by James Cook 2012-04-16 Richard Frith-Macdonald * configure.ac: Add tests for lossy conversion using iconv and provide options to disable use of iconv or allow use of iconv where //TRANSLIT is missing. * configure: regenerate. 2012-04-15 Richard Frith-Macdonald * Source/Additions/Unicode.m: Fix test for availability of lossy conversion via iconv. 2012-04-10 Sebastian Reitenbach * Tools/make_strings/StringsFile.m * Tools/pl.m some NSInteger -> NSUInteger changes to match return values of methods 2012-04-07 13:54 theraven * Source/NSMethodSignature.m: Fix NSMethodSignature generating nonsense values when it encounters a type encoding including blocks. 2012-04-07 10:45 theraven * Source/GSSocketStream.m: * Source/NSAffineTransform.m: * Source/NSXMLDTDNode.m: * Tools/xmlparse.m: Fix the remaining compiler warnings. 2012-04-07 Fred Kiefer * Source/NSXMLDocument.m: * Source/NSXMLDTD.m: * Source/NSXMLNode.m: * Source/NSXMLDTDNode.m: * Source/NSXMLElement.m: Remove compiler warnings for clang reported by David Chisnall. * Tests/base/NSAutoreleasePool/basic.m: Get to compile again without -C99. 2012-04-06 12:37 theraven * libs/base/trunk/Source/NSConnection.m, libs/base/trunk/Source/NSData.m, libs/base/trunk/Source/NSKeyValueObserving.m: Fix a few compiler warnings caused by type mismatches in NSLog statements. 2012-04-06 12:23 theraven * libs/base/trunk/Headers/Foundation/NSArray.h, libs/base/trunk/Headers/Foundation/NSDictionary.h, libs/base/trunk/Headers/GNUstepBase/GSVersionMacros.h, libs/base/trunk/Source/NSArray.m, libs/base/trunk/Source/NSDictionary.m, libs/base/trunk/Tests/base/NSArray/basic.m, libs/base/trunk/Tests/base/NSDictionary/basic.m: Support for collection subscripting (NSArray and NSDictionary). Yes, the syntax is ugly, but no doubt people will start using it in June... 2012-04-06 12:02 theraven * libs/base/trunk/Source/NSAutoreleasePool.m, libs/base/trunk/Tests/base/NSAutoreleasePool, libs/base/trunk/Tests/base/NSAutoreleasePool/TestInfo, libs/base/trunk/Tests/base/NSAutoreleasePool/basic.m: Use the runtime's ARC autorelease pools if available. 2012-04-04 Fred Kiefer * Source/NSXMLNode.m (+_objectForNode:): Don't create a document object for a private document. * Tests/base/NSXMLNode/transfer.m: New code for test case contributed by Doug Simons. 2012-04-03 Fred Kiefer * Source/NSXMLElement.m, * Source/NSXMLNode.m: Fix compiler error and warning for older version of libxml2. 2012-04-01 Niels Grewe * Source/NSNumber.m: Add special small object class for floats. Previously, NSSmallRepeatableDouble would be used which resulted in the float being printed as a double when calling -stringValue or -description. 2012-03-27 Fred Kiefer * Headers/Foundation/NSObject.h (-error:): Declare return type. Patch by Benoît Garrigues 2012-03-27 Fred Kiefer * Source/NSXMLNode.m (execute_xpath): Clean up. 2012-03-27 Niels Grewe * configure.ac * config.mak.in * Headers/GNUstepBase/GSConfig.h.in * Headers/GNUstepBase/config.h.in: Implement configure check for libdispatch. * configure: Regenerate * Source/GSDispatch.h: Add portability header with macros for compiling with or without libdispatch. * Source/NSArray.m * Source/NSDictionary.m * Source/NSIndexSet.m * Source/NSSet.m * Headers/Foundation/NSIndexSet.h: Implement libdispatch support for block enumeration methods. * Tests/base/NSMutableIndexSet/blocks.m * Tests/base/NSDictionary/blocks.m * Tests/base/NSArray/blocks.m: Test cases for new code. Detect the presence of libdispatch and, if available, use it for collection enumeration methods that take blocks as arguments. This allows us to implement the NSEnumerationConcurrent option of those methods with minimal effort. 2012-03-27 Niels Grewe * Source/NSOperation.m: Remove leftover debugging statements. 2012-03-27 Richard Frith-Macdonald * Source/NSOperation.m: * Source/NSRegularExpression.m: * Headers/GNUstepBase/GSBlocks.h: * Headers/Foundation/NSOperation.h: Get things compiling/linking again with gcc after blocks changes. 2012-03-27 Niels Grewe * Headers/Foundation/NSOperation.h * Headers/GNUstepBase/GSBlocks.h: Fix definitions of blocks without arguments for GCC. 2012-03-27 Fred Kiefer * Source/NSXMLElement.m, * Source/NSXMLNode.m: Better support for namespaces. Corrected -_nodeFollowingInNaturalDirection:, -setStringValue: and -XMLStringWithOptions: 2012-03-26 Niels Grewe * Headers/Foundation/NSOperation.h * Source/NSOperation.m: Implement -setCompletionBlock: and -completionBlock. * Headers/GNUstepBase/GSBlocks: Make blocks without arguments callable * Tests/base/NSOperation/basic.m: Test whether completion blocks work. 2012-03-25 Richard Frith-Macdonald * Source/NSXMLPrivate.h: Change order of includes to ensure libxml2 headers are seen early. 2012-03-23 Fred Kiefer * Source/NSXMLNode.m (-rootDocument): Better test for private document. * Source/NSXMLDTDNode.m (-initWithXMLString:): Use childAtIndex: instead of rootElement. 2012-03-23 Fred Kiefer * Source/NSXMLNode.m (-copyWithZone_): Use value 1 instead of 2 for deep copy. Bug found by Doug Simons . * Source/NSXMLNode.m (-rootDocument): Don't return the private document. * Source/NSXMLNode.m (-nextSibling, -previousSibling): Protect against namspace nodes. * Tests/base/NSXMLNode/transfer.m: New test case for problem reported by Doug Simons. 2012-03-22 Fred Kiefer * Source/NSXMLElement.m, * Source/NSXMLNode.m: Fix memory leak for attribute private documents found by valgrind. * Tests/base/NSXMLNode/namespace.m: Use drain instead of release. 2012-03-22 Fred Kiefer * Source/NSXMLDocument.m (-URI, -setURI:): Specific implementation. * Source/NSXMLPrivate.h: Remove URI ivar. * Source/NSXMLElement.m, * Source/NSXMLNode.m: Full support for namespaces. * Tests/base/NSXMLNode/namespace.m: Test code borrowed from Google data project. 2012-03-21 Fred Kiefer * Source/NSXMLDocument.m: Correct memory management. * Source/NSXMLElement.m, * Source/NSXMLNode.m: Add partial support for namespaces. Try to bracket more libxml2 functions with version checks. 2012-03-21 Richard Frith-Macdonald * Source/NSXMLDocument.m: * Source/NSXMLDTD.m: * Source/NSXMLNode.m: * Source/NSXMLDTDNode.m: * Source/NSXMLElement.m: Bracket everything in test of HAVE_LIBXML2 * configure.ac: * configure: Alter tests for major dependencies (ICU, XML, TLS) so that they all abort configuration unless specifically disabled ... we want a consistent build with all major features. 2012-03-20 Niels Grewe * Headers/Foundation/NSDictionary.h * Source/NSDictionary.m: Implement blocks related enumeration methods. * Tests/base/NSDictionary/blocks.m: Test cases for blocks support. 2012-03-20 Niels Grewe * Headers/Foundation/NSObjCRuntime.h: Define NS_REQUIRES_NIL_TERMINATION macro. 2012-03-20 Richard Frith-Macdonald * Headers/Foundation/NSException.h: Try to make error message more helpful when building with incompatible exception handling settings. 2012-03-18 Fred Kiefer * Source/NSXMLDTDNode.m: Correct node type, at least for entity nodes. * Source/NSXMLDTD.m: Use predefined entities from libxml2. * Source/NSXMLNode.m: Rewrite the ownership transfer to preserve names in dictionaries. 2012-03-17 Fred Kiefer * Source/NSXMLPrivate.h: Remvoe unused ivars. * Source/NSXMLDocument.m: Get DTD from node and and validation in init methods. * Source/NSXMLDTD.m: Implement. * Source/NSXMLNode.m: No children for attribute nodes. * Tests/base/NSXMLNode/basic.m: Test empty attribute children 2012-03-16 Fred Kiefer * Source/NSXMLNode.m (-XMLStringWithOptions:): Protect the different format constants with version checks. 2012-03-14 Fred Kiefer * Source/NSXMLDocument.m (-XMLDataWithOptions:): Correct convesion to NSData. Add some comments. 2012-03-14 Fred Kiefer * Source/NSXMLPrivate.h: Add comments on owner policy. * Source/NSXMLNode.m (-XMLStringWithOptions:): Reimplement to allow closer control over output. * Source/NSXMLDocument.m (-XMLStringWithOptions:): Remove this method. 2012-03-14 Richard Frith-Macdonald * Source/NSXMLPrivate.h: * Source/NSXMLNode.m: * Source/NSXMLElement.m: Fixups to get the code to build on CentOS/RedHat linux. 2012-03-12 Fred Kiefer * Source/NSXMLNode.m (-detach): Don't handle the namespace case. * Source/NSXMLElement.m (-removeNamespaceForPrefix:): Implement. * Tests/base/NSXMLNode/basic.m: Move tests from here ... * Tests/base/NSXMLElement/basic.m: ... to here. 2012-03-12 Fred Kiefer * Source/NSXMLElement.m: Correct used namespace field. * Source/NSXMLNode.m: Implement special handling for namespace nodes. * Tests/base/NSXMLNode/basic.m: Correct method name for namespace node. 2012-03-11 Richard Frith-Macdonald & Fred Kiefer * Source/NSXMLNamespace.m: * Source/GNUmakefile: * Source/NSXMLPrivate.h: * Source/NSXMLNode.m: Revert most of my last change in favour of Fred's changes. 2012-03-11 Richard Frith-Macdonald * Source/NSXMLNamespace.m: New class for namespaces * Source/GNUmakefile: Build with new class * Source/NSXMLDocument.m: * Source/NSXMLPrivate.h: * Source/NSXMLDTD.m: * Source/NSXMLNode.m: * Source/NSXMLDTDNode.m: * Source/NSXMLElement.m: Use a new class for namespaces ... just a placeholder/skeleton so far. Change other classes to know the correct type of their 'node' pointer. 2012-03-11 Richard Frith-Macdonald * Source/NSXMLNode.m: Avoid crash when trying to get the parent of a namespace ... namespaces don't have parents and in fact have a completely different in-memory layout to other 'node' types. 2012-03-11 Richard Frith-Macdonald * Source/NSURLHandle.m: * Source/GSHTTPURLHandle.m: * Source/NSURLProtocol.m: * Headers/Foundation/NSURLProtocol.h: Tweak handling of debug settings to consistently write debug output using NSLog. 2012-03-09 Fred Kiefer * Source/NSXMLNode.m (-copyWithZone:): Don't set object value of copy if it is nil. * Source/NSXMLNode.m (+_objectForNode:): Use correct sub class for decl nodes. * Tests/base/NSXMLNode/basic.m: More tests. 2012-03-08 Fred Kiefer * Source/NSXMLNode.m (-detach, -_insertChild:atIndex:): Maintain doc pointer. * Source/NSXMLDTD.m: Implement a few methods. 2012-03-08 Fred Kiefer * Source/NSXMLNode.m (+_objectForNode:): Add a few more libxml2 node types. 2012-03-07 Richard Frith-Macdonald * Source/GSStream.m: Attempt to fix logic for event handling of data streams. 2012-03-01 Jens Alfke * Headers/GNUstepBase/NSURL+GNUstepBase.h: * Source/Additions/NSURL+GNUstepBase.m: * Source/NSURL.m: New -pathWithEscapes method to enable differentiation between '/' characters in the original path and '%2F' escapes in it. 2012-03-06 Fred Kiefer * Source/NSXMLNode.m (+initialize): Add workaround for Windows xmlFree problem. 2012-03-06 Richard Frith-Macdonald * Source/NSURLProtocol.m: check for parse complete explicitly and remove case where complete is set to NO if using chunked coding ... it seems to be jsut wrong. 2012-03-06 Fred Kiefer * Source/NSXMLNode.m (-copyWithZone:): Use objectValue ivar directly as the subclass NSXMLElement returns a different value. 2012-03-05 Eric Wasylishen * Source/NSUserDefaults.m: * Source/NSConnection.m: * Source/NSCharacterSet.m: * Tools/make_strings/StringsFile.m: * Tools/pl.m: Fix instances where NSNotFound is stored in or compared to an unsigned or int variable. 2012-03-05 Eric Wasylishen * Source/NSString.m: Factor out code for opening an ICU collator into static function GSICUCollatorOpen. Support NSDiacriticInsensitiveSearch. 2012-03-05 Eric Wasylishen * Headers/Foundation/NSString.h (-compare:options:range:locale:): Rename locale parameter from "dict" to "locale". * Source/NSString.m (-compare:options:range:locale:): If locale paramater is not nil and not an NSLocale instance, substitute +[NSLocale currentLocale]. * Source/NSString.m: Clarify some locale related documentation. 2012-03-05 Fred Kiefer * Tests/base/NSXMLElement/attributes.m: Test for changed exception. * Tests/base/NSXMLNode/basic.m: More tests. * Source/NSXMLNode.m: Rewrite object value handling. * Source/NSXMLElement.m (-objectValue): Return @"" when the value is nil. 2012-03-05 Eric Wasylishen * Source/NSString.m (-rangeOfString:options:range:locale:): Correct result range with ICU codepath 2012-03-05 Fred Kiefer * Source/NSXMLElement.m (-addAttribute:): Raise correct exception. * Tests/base/NSXMLNode/children.m: Add test cases for attributes. 2012-03-05 Eric Wasylishen * Tests/base/NSString/locale.m: Expand test of compare: and rangeOfString:. Mark as hopeful for the moment. All pass on Mac OS 10.7. 2012-03-04 Fred Kiefer * Source/NSXMLPrivate.h: Move private method declarations for NSXMLNode to here. * Source/NSXMLDocument.m * Source/NSXMLDTD.m * Source/NSXMLDTDNode.m * Source/NSXMLElement.m * Source/NSXMLNode.m: Clean up and add comments about missing code. 2012-03-03 Fred Kiefer * Source/NSXMLNode.m: Remove all the extra reference handling code and the special retain and release methods. * Tests/base/NSXMLNode/basic.m, * Tests/base/NSXMLNode/children.m: A few more test cases. Validated on MacOSX 10.6. 2012-03-02 Eric Wasylishen * Tests/base/NSString/locale.m: Add a simple test for locale sensitive compare: and rangeOfString: methods. 2012-03-02 Eric Wasylishen * Source/NSString.m: Fix for ICU anchored backwards search 2012-03-02 Fred Kiefer * Source/GSLocale.m (GSDefaultLanguageLocale): Add missing check for LC_MESSAGES definition. 2012-03-02 Richard Frith-Macdonald * Source/NSFileManager.m: fix for bug #35692 2012-03-02 Richard Frith-Macdonald * Source/GSString.m: Compatribility fix ... copy strings implicitly when taking a substring of a string whose buffer is not owned. 2012-03-02 Richard Frith-Macdonald * Source/NSURLConnection.m: Compatibility fix for bug #35686 In this case Cocoa breaks its own convention about delegates not being retained, so we need to do the same. 2012-03-02 Richard Frith-Macdonald * Headers/GNUstepBase/config.h.in: add missing ICU headers * Source/NSString.m: fix minor coding standard violations. 2012-03-01 Jens Alfke * Source/NSString.m: * Source/NSURL.m: Fix decoding of percent escapes with uppercase hex values (bug #35685) 2012-03-01 Eric Wasylishen * Source/NSString.m: Implement a codepath using ICU for -compare:options:range:locale: and -rangeOfString:options:range:locale: when a non-nil locale is provided. * Headers/Foundation/NSString.h (-compare:options:range:locale:): Change type of locale parameter to id; it can be NSDictionary or NSLocale. * configure.ac: add some ICU headers used in NSString change * configure: regenerate 2012-03-01 Graham Lee * Source/GSNetworks.h: import GSPrivate.h 2012-03-01 Richard Frith-Macdonald * Headers/Foundation/NSURLResponse.h: * Source/NSURLResponse.m: Implement new initialiser from 10.7 2012-03-01 Jens Alfke * Source/NSJSONSerialization.m: Use %g for numeric output format. 2012-03-01 Richard Frith-Macdonald * Source/GSRunLoopWatcher.h: * Source/NSXMLPrivate.h: * Source/GSRunLoopCtxt.h: * Source/common.h: * Source/Additions/NSError+GNUstepBase.m: * Source/GSURLPrivate.h: Include config.h via common.h ... and have that turn off _GNU_SOURCE so GNU extensions aren't used and we stick to standard strerror_r 2012-03-01 Fred Kiefer * Source/NSXMLNode.m: More cleanup. 2012-03-01 Richard Frith-Macdonald * Source/NSXMLDocument.m: * Source/NSXMLNode.m: * Source/NSXMLElement.m: Cleanup to conform to coding standards/conventions. Fix lots of functions to be local in scope. Add comments about needing to implement correct object ownership model. 2012-02-27 Doug Simons * Source/NSXMLNode.m: Fix a crashing bug after an invalid xpath expression is used. 2012-02-29 Richard Frith-Macdonald * Source/Additions/NSError+GNUstepBase.m: try to ensure we always get the POSIX version of strerror_h. 2012-02-27 Eric Wasylishen * Source/GSLocale.m: - Deprecate GSSetLocale and GSSetLocaleC; they now do nothing but print a warning. - Introduce GSDefaultLanguageLocale(), which is a substitute for GSSetLocale(LC_MESSAGES, nil), which just returns the current setting of LC_MESSAGES. * Source/NSObject.m (+initialize): Remove GSSetLocaleC call, which was changing the libc locale. * Source/NSUserDefaults.m: Use GSDefaultLanguageLocale() instead of GSSetLocale(LC_MESSAGES, nil) 2012-02-27 Eric Wasylishen * Source/NSArchiver.m (-resetArchiver): Write [self systemVersion] as the archive version instead of 0, because this is what will be stored in the archive if -encodeRootObject: is not called. 2012-02-27 Eric Wasylishen * SSL/configure.ac: Change test for ssl2_clear in -lssl to test for SSL_clear, which is a public function and is acutally used by the SSL bundle. The test for ssl2_clear was failing with OpenSSL 1.0.0e. * SSL/configure: Regenerate 2012-02-28 Richard Frith-Macdonald * Source/NSArchiver.m: * Source/NSUnarchiver.m: * Source/NSPortCoder.m: * Version: Update to 12402 Bump subminor version as suggested by eric Wasylishen, in case there are any archives which would be caugt by the new version number. 2012-02-28 Richard Frith-Macdonald * Source/NSArchiver.m: * Source/NSUnarchiver.m: Revise archive format to allow for variable sized array counts ... original versionallowed for variable encodings of integral types in archived data, but not for the count of the nuymber of items in the array :-( * Source/NSPortCoder.m: Similar fixes for encoding/decoding arrays. 2012-02-27 Fred Kiefer * Source/NSXMLNode.m (-copyWithZone:): Copy name spaces as well. * Source/NSXMLDocument.m (-copyWithZone:): Rewrite copy method. * Source/NSXMLElement.m: Remove copy method. 2012-02-27 Doug Simons Merged to trunk by: greg.casamento@gmail.com * Source/NSXMLDocument.m: Fix bugs in setCharacterEncoding: and copyWithZone: that cause a memory crash when tree is freed. Doug Simons 2012-02-27 Fred Kiefer * Source/NSXMLNode.m (+_objectForNode:): Get the actual class from the document. * Source/NSXMLNode.m (-description): Add a simple description method. * Source/NSXMLDocument.m: Further cleanup. Exchange the contents of -initWithData:... and initWithXMLString:... 2012-02-27 Richard Frith-Macdonald * Source/NSArchiver.m: * Source/NSUnarchiver.m: Alter to support encoding and decoding arrays with NSUInteger counts (ie more than 2^32 objects if on a 64bit system). 2012-02-26 Eric Wasylishen * Source/NSData.m: Various 64-bit compatibility fixes, mostly changing unsgined to NSUInteger. 2012-02-26 Fred Kiefer * Source/NSXMLNode.m (execute_xpath): Use correct node for relative paths. * Source/NSXMLNode.m (isEqualTree): Correct equality test to ignore siblings. * Source/NSXMLNode.m (+elementWithName:stringValue:): Correct recursive call. Patch by Ivan VuÄica * Source/NSXMLElement.m: Add FIXME comments for name space methods. 2012-02-23 Fred Kiefer * Source/NSXMLElement.m: Implement namespace methods. 2012-02-22 Fred Kiefer * Source/NSXMLNode.m (-_nodeFollowingInNaturalDirection:): Correct this method. * Source/NSXMLDocument.m, * Source/NSXMLElement.m: Clean up children methods. 2012-02-22 Fred Kiefer * Source/NSXMLNode.m: Further clean up. * Source/NSXMLDTDNode.m (-initWithXMLString:): Move comment about missing code to here. * Source/NSXMLElement.m (-initWithName:stringValue:): Move subnode creation to here. 2012-02-21 Fred Kiefer * Source/NSXMLNode.m: Clean up helper functions. 2012-02-20 Fred Kiefer * Source/NSAffineTransform.m (-initWithCoder:, -encodeWithCoder:): Add key coding and decoding for NSAffineTransform. 2012-02-19 22:37-EST Gregory John Casamento Doug Simons * Source/NSXMLDocument.m * Source/NSXMLDTD.m * Source/NSXMLDTDNode.m * Source/NSXMLElement.m * Source/NSXMLNode.m * Source/NSXMLPrivate.h: Reimplementation of all DOM classes based on libxml2. Implementation of all methods using libxml2 functions. * Tests/base/NSXMLDocument/basic.m * Tests/base/NSXMLElement/attributes.m * Tests/base/NSXMLElement/children.m * Tests/base/NSXMLNode/basic.m * Tests/base/NSXMLNode/children.m * Tests/base/NSXMLNode/kinds.m: Changes to test for new functionality. 2012-02-08 Lubomir Rintel * Source/NSHTTPCookie.m: * Source/NSHTTPCookieStorage.m: * Source/NSURLConnection.m: * Source/NSURLProtocol.m: * Source/NSURLRequest.m: Enable the use of cookies by default ... addse setting of cookies in requests and improves caching/storing. Original patches rewritten by maintainer to conform to coding standards and for clarity. 2012-02-08 Richard Frith-Macdonald * Source/GSConcreteValueTemplate.m: Don't ask a non-retained object to describe itsself (in case it has gon away) bug#35477 2012-02-07 Niels Grewe * configure.ac: Check for threading library on QNX. * configure: Regenerate. 2012-02-04 Richard Frith-Macdonald * Version: 1.24.1 ... still binary compatibile with 1.24.0 * Source/NSTextCheckingResult.m: * Headers/Foundation/NSTextCheckingResult.h: coding style tidyups 2012-02-03 Adam Fedor * Bump version 2012-02-03 Adam Fedor * Version 1.24.0 * Update announcements 2012-02-03 Richard Frith-Macdonald * Source/NSURL.m: Fixup for bug #35437 2012-01-31 Richard Frith-Macdonald * Source/NSJSONSerialization.m: bugfix for empty strings. * Tests/base/NSJSONSerialization/json.m: add a few emtpy element tests and fixup to be more readable 2012-01-31 Richard Frith-Macdonald * Version: revert last change as Fred pointed out I got it wrong and we shoudl be updating version immediately *after* release. 2012-01-31 Fred Kiefer * Tests/base/NSURLRequest/basic.m: Remove two astray @ characters. 2012-01-30 Richard Frith-Macdonald * Version: Bump version to 1.24.0 in preparation for release. * NSTimeZones/NSTimeZones.tar: Update timezone information 2012-01-30 Richard Frith-Macdonald * Source/NSJSONSerialization.m: Fix buffer overrun reported by Lubomir Rintel 2012-01-30 Richard Frith-Macdonald * Source/NSKeyValueCoding.m: * Source/NSAffineTransform.m: * Source/NSNotificationCenter.m: * Source/NSConnection.m: * Source/GSString.m: Avoid a few static analyser warnings. 2012-01-29 Richard Frith-Macdonald * configure.ac: * Headers/GNUstepBase/config.h.in: * Source/GSFFIInvocation.m: * Source/GSPrivate.h: * Source/NSInvocation.m: If modern ffi is available, use ffi_prep_closure_loc and ffi closure memory management so we get the benefit of ffi library code to work around restrictions of selinux etc. 2012-01-29 Richard Frith-Macdonald * Source/NSUserDefaults.m: Try to deal with the case where a language has been set to the ISO standard name rather than an OpenStep name by converting to an Openstep name as an alternative lookup key. * Source/NSXMLNode.m: Add warning that the DOM classes are not really functional in this release. 2012-01-26 Richard Frith-Macdonald * Source/NSFileManager.m: Fix copying for large files (issue #35381) 2012-01-25 Stefan Bidigaray * Source/NSNumberFormatter.m: Call unum_format* only once. 2012-01-25 Richard Frith-Macdonald * Source/GSSocketStream.m: fix possible nul pointer dereference. * Source/NSHost.m: cache failed lookup by name so that repeated lookups for a band host name do not cause repeated DNS queries. 2012-01-24 Richard Frith-Macdonald * Source/NSURLRequest.m: be tolerant about missing URL on init. 2012-01-10 Richard Frith-Macdonald * Source/GSFFIInvocation.m: Fix selector types comparison to use the correct function for checking equivalent types. 2012-01-10 Richard Frith-Macdonald * config/pathtls.m4: * config/pathxml.m4: Remove incorrect sed call to tidy flags (as suggested by Felix Geyer in bug #34835). 2012-01-16 Eric Wasylishen * Source/NSBundle.m (addBundlePath): Handle nested subdirectories (e.g. [NSBundle pathForLibraryResource: @"Generic-PostScript_Printer-Postscript" ofType: @"ppd" inDirectory: @"PostScript/PPD"] was previously failing.) 2012-01-12 10:10 theraven * libs/base/trunk/Headers/Foundation/NSException.h: Tweak the exception mismatch handling so that if base is using native exceptions and the user doesn't specify an exception mode then we just don't define the NS_ macros, so code that uses @try etc. compiles without requiring every cc line to specify a long -D flag just to be allowed to #import Foundation.h. 2012-01-10 Richard Frith-Macdonald * Source/NSBundle.m: Remove cached paths when the owning bundle is deallocated. Use cache to determine which resource directories to search. 2012-01-09 Richard Frith-Macdonald * Source/NSBundle.m: Crude/simple caching of directory contents to test impact on theme loading ... needs reverting or improving. 2012-01-09 Richard Frith-Macdonald * Source/NSConcretePointerFunctions.m: * Source/NSSocketPort.m: * Source/unix/NSStream.m: * Source/NSKeyedUnarchiver.m: * Source/NSZone.m: * Source/NSMessagePort.m: * Source/win32/GSFileHandle.m: * Source/NSInvocation.m: * Source/NSURLProtocol.m: * Source/Additions/GSMime.m: * Source/Additions/GSXML.m: * Source/NSData.m: * Source/GSAvahiNetService.m: * Source/NSTextCheckingResult.m: Use PRIdPTR and PRIuPTR rather than ld and lu for printf formatting of NSInteger and NSUInteger values. 2012-01-08 Richard Frith-Macdonald * Headers/ObjectiveC2/objc/capabilities.h: * Headers/ObjectiveC2/objc/Availability.h: * Headers/ObjectiveC2/objc/blocks_runtime.h: * Headers/ObjectiveC2/objc/runtime.h: Moved to subdirectory. * Source/Makefile.postamble: * Source/ObjectiveC2/runtime.c: * Source/ObjectiveC2/caps.c: * Source/ObjectiveC2/NSBlocks.m: * Source/ObjectiveC2/blocks_runtime.m: * Headers/GNUstepBase/GSObjCRuntime.h: * Tests/GNUmakefile: * base.make.in: Move ObjectiveC2 headers to objc subdirectory so that we can refer to them using the same objc/headername path as OSX, and use a -I directive to point to the ObjectiveC2 directory to avoid installing on top of the real objc2 library or vie versa. Should make it easier to figure out how to cleanly swith between raeal/emulated objc2 runtimes. This should also mean that old emulated objc2 headers are *not* found at configure time, so configure should be able to tell if a real objc2 runtime has been installed on a system which previously used the old objc runtime. 2012-01-05 Richard Frith-Macdonald * Source/NSXMLDocument.m: * Source/NSXMLPrivate.h: * Source/NSXMLNode.m: * Source/NSXMLElement.m: Replace missing assertion (needed for OSX compatibility) also fix several other issues in node hierarchy handling ... all rather academic since greg's going to rewrite, but these fixes do mean the current code passes the testsuite. It's a bad idea to leave the code and testsuite in an inconsistent state, and the testsuite represents accumulated information about OSX, so we want our code to pass all tests rather than removing tests. 2012-01-06 17:57-EST Gregory John Casamento * Source/NSXMLElement.m: Removing assertion that parent must not be nil per Cocoa documentation for -(id)parent method in NSXMLNode. 2012-01-05 Richard Frith-Macdonald * Source/NSXMLDocument.m: * Source/NSXMLElement.m: * Source/NSXMLNode.m: * Source/NSXMLPrivate.h: Rewrote node hierarchy handling to match OSX documentation and behaviors. Also implemented -hash and -isEqual: to match OSX for NSXMLNode. 2012-01-05 22:20-EST Doug Simons * Source/NSXMLDocument.m: Modify XMLStringWithOptions: to only include the header when version, encoding, or standalone has been set. 2012-01-05 22:20-EST Gregory John Casamento * Source/NSXMLElement.m: in setChildren: set the childCount. 2012-01-05 22:07-EST Gregory John Casamento * Source/NSXMLElement.m: Correct warning in copyWithZone: added return. Correct issue with childCount being out of sync. 2012-01-05 21:33-EST Gregory John Casamento * ChangeLog * Source/NSXMLDocument.m * Source/NSXMLElement.m * Source/NSXMLNode.m: Implement copyWithZone:, correct issues with previous revert. 2012-01-05 Richard Frith-Macdonald * Source/NSXMLDocument.m: * Source/NSXMLElement.m: Replace a few lines accidentally lost. 2012-01-04 Richard Frith-Macdonald * Headers/Foundation/NSXMLDocument.h: * Headers/Foundation/NSXMLNode.h: * Headers/Foundation/NSXMLDTD.h: * Headers/Foundation/NSXMLDTDNode.h: * Headers/Foundation/NSXMLElement.h: * Source/NSXMLDocument.m: * Source/NSXMLPrivate.h: * Source/NSXMLDTD.m: * Source/GSInternal.h: * Source/NSXMLNode.m: * Source/NSXMLDTDNode.m: * Source/NSXMLElement.m: The last revert still left lot's of ABI breakage, but reverting much further would lose a lot of work ... so here's an attempt to fix the ABI breakage by re-hiding instance variables again. 2012-01-04 Richard Frith-Macdonald * Source/GSMDNSNetServices.m: * Source/NSJSONSerialization.m: Cosmetic tweaks (whitespace) 2012-01-04 Richard Frith-Macdonald * Source/NSXMLDocument.m: * Source/NSXMLNode.m: * Source/NSXMLElement.m: * Headers/Foundation/NSXMLDocument.h: * Headers/Foundation/NSXMLNode.h: * Headers/Foundation/NSXMLDTD.h: * Headers/Foundation/NSXMLElement.h: Revert latest changes to restore scheme for preventing ABI breakage and supporting both fragile and non-fragile ABIs.. 2012-01-04 Fred Kiefer * Headers/Foundation/NSXMLDocument.h, * Headers/Foundation/NSXMLDTD.h: Comment out duplicate declaration of ivars to get base to compile again. 2012-01-03 16:33-EST Gregory John Casamento * Headers/Foundation/NSXMLDocument.h * Headers/Foundation/NSXMLElement.h * Headers/Foundation/NSXMLNode.h: Move declarations. * Source/NSXMLDocument.m: Correct parsing issues. * Source/NSXMLElement.m: Remove local declaration of _children * Source/NSXMLNode.m: Remove internal. Move all declarations here directly. 2012-01-03 14:22-EST Gregory John Casamento * Source/NSXMLDocument.m: Implement XMLStringWithOptions: 2012-01-03 13:03-EST Gregory John Casamento * Headers/Foundation/NSXMLElement.h * Headers/Foundation/NSXMLNode.h * Source/NSXMLElement.m * Source/NSXMLNode.m: Move _URI to NSXMLNode. change dealloc accordingly. 2012-01-03 12:42-EST Gregory John Casamento * Source/NSXMLNode.m: Implement copyWithZone: 2012-01-03 12:17-EST Gregory John Casamento * Headers/Foundation/NSXMLNode.h: Add _stringValue * Source/NSXMLNode.m: Change stringValue and setStringValue: resolvingEntities: to assign to _stringValue instead of _objectValue. 2012-01-03 12:06-EST Gregory John Casamento * Source/NSXMLDocument.m: Change stack implementation to use lastObject/removeLastObject to implement the stack instead of inserting and deleting at index 0. * Source/NSXMLElement.m: Implemented XMLStringWithOptions: * Source/NSXMLNode.m: Implemented XMLStringWithOptions:, skeletal implementation of setStringValue:resolvingEntities: 2012-01-03 Fred Kiefer * Source/NSException.m (-raise): Only set the stack when the exception gets first raised. This fixes bug #35192 Patch by Larry Campbell 2012-01-02 22:26-EST Gregory John Casamento * Headers/Foundation/NSXMLElement.h: Change _attributes to be a NSMutableDictionary instead of an NSMutableArray. * Source/NSXMLElement.m: Change implementation of some methods to use an NSMutableDictionary instead of arrays. Initialize ivars in initializer. * Source/NSXMLPrivate.h: Remove redundant method. 2012-01-02 Fred Kiefer * Source/GSSocketStream.m (-initWithInput:output:): Attempt to replace deprecated GNUTLS functions with newer ones for GNUTLS >= 2.12. 2012-01-02 Fred Kiefer * Source/NSArray.m (-objectsAtIndexes:): Fix comparision of unsigned variable with NSNotFound. 2012-01-02 02:26-EST Gregory John Casamento * Source/NSXMLNode.m: Minor correction. Move setName out of private category. * Tests/base/NSXMLNode/children.m: Update test. 2012-01-01 Fred Kiefer * Headers/Foundation/NSXMLDTDNode.h, * Headers/Foundation/NSXMLDTD.h: Remove duplicate declaration of ivar _name to get base to compile again. 2011-12-30 Doug Simons * Source/NSXMLElement.m: Set Elements to be NSXMLElementKind. 2011-12-30 14:22-EST Gregory John Casamento * Headers/Foundation/NSXMLDocument.h * Headers/Foundation/NSXMLElement.h * Headers/Foundation/NSXMLNode.h * Source/NSXMLDocument.m * Source/NSXMLElement.m * Source/NSXMLNode.m * Source/NSXMLPrivate.h * Tests/base/NSXMLNode/children.m * Tests/base/NSXMLNode/kinds.m: First cut at NSXMLDocument implementation. 2011-12-29 Doug Simons * Source/NSCalendarDate.m: Fix -addTimeInterval: to copy calendarFormat of original date. 2011-12-24 Richard Frith-Macdonald * Source/NSConnection.m: Fix retain rount error spotted by (bug #35164) 2011-12-23 Wolfgang Lux * Headers/Foundation/NSTextCheckingResult.h: * Source/NSTextCheckingResult.m (-resultByAdjustingRangesWithOffset:): Implement method. 2011-12-23 Wolfgang Lux * Headers/Foundation/NSTextCheckingResult.h: * Source/NSTextCheckingResult.m: Add copyright notice. * Source/NSTextCheckingResult.m(-result, -range): Raise exception in abstract base class implementation. This is what OS X does. * Source/NSTextCheckingResult.m(-rangeAtIndex): Implement in abstract base class. Raise exception in both method implementations when the index is too big. * Source/NSTextCheckingResult.m(-numberOfRanges): Change incorrect name rangeCount into numberOfRanges. * Source/NSTextCheckingResult.m(-regularExpression): Implement method in the concrete subclass where it was omitted. 2011-12-23 Wolfgang Lux * Source/NSRegularExpression.m (-rangeOfFirstMatchInString:...): Return range (NSNotFound, 0) when no match is found. 2011-12-22 Wolfgang Lux * Source/NSRegularExpression.m (-initWithPattern:options:error:, -pattern, setupRegex, -enumerateMatchesInString:options:range:, FAKE_BLOCK_HACK, -replaceMatchesInString:options:range:, -stringByReplacingMatchesInString:options:range:withTemplate:, replacementStringForResult:inString:offset:template:): Introduce support for libicu versions prior to 4.4, which don't provide the UText interface to regular expressions. 2011-12-22 Wolfgang Lux * Source/NSSocketPort.m (+portNumber:onHost:forceAddress:listener): Fix an uninitialized variable bug, which could lead to returning ports with an incorrect port number. 2011-12-19 Riccardo Mottola * Source/GSString.m: Fix blocking compiler warning (ggc 4.5.3) 2011-12-17 Richard Frith-Macdonald * configure.ac: Try to make detection of compilers which don't support locale/characterset handling for string literals somewhat friendly. * configure: regenerate 2011-12-17 Fred Kiefer * Source/NSPortCoder.m (-versionForClassName:): Use NSInteger for version to avoid compiler warning on 64-bit system. 2011-12-17 Richard Frith-Macdonald * Source/NSUserDefaults.m: Whenever we synchronize in a state where we have changes to write, but are in read-only mode (no database existed on startup, or we couldn't create the lock file on startup), check to see if the database is now writable (we can create the lock file). Should fix problem where new defaults files were not getting created. 2011-12-15 Richard Frith-Macdonald * Source/NSProcessInfo.m: * Source/NSSocketPort.m: * Source/NSMessagePortNameServer.m: * Source/NSDebug.m: * Source/NSDistributedLock.m: * Source/GSHTTPURLHandle.m: * Source/NSMessagePort.m: * Source/NSFileManager.m: * Source/NSString.m: * Source/NSObject.m: * Source/NSThread.m: * Source/NSData.m: * Source/GSNetwork.h: * Source/GSFormat.m: * Source/GSFileHandle.m: * Source/NSTask.m: * SSL/GSSSLHandle.m: * SSL/configure.ac: * SSL/configure: * SSL/config.h.in: * configure.ac: * configure: * Headers/GNUstepBase/config.h.in: * Tools/gdnc.m: Support fcntl.h and signal.h not being in the 'sys' subdirectory (for android and any other systems with that header layout). 2011-12-15 Richard Frith-Macdonald * Headers/Foundation/NSObject.h: * Headers/Foundation/NSObjCRuntime.h: Move a few declarations between headers to match OSX, and update NSNotFound to be NSIntegerMax for compatibility on 64bit platforms. 2011-12-13 Richard Frith-Macdonald * SSL/GSSSLHandle.m: Allow cipher list to be set using GSCipherList default. 2011-12-08 Wolfgang Lux * configure.ac: Fix pkg-config configuration for libffi to make it really work on systems where additional include options are needed. * configure: Regenerated. 2011-12-06 Richard Frith-Macdonald * Tools/AGSParser.m: Fix suggested by Daniel Santos (ifStack was created with incorrect initial content). 2011-12-06 Richard Frith-Macdonald * configure.ac: use pkg-config for libffi if/when available. * configure: regenerate 2011-12-05 Eric Wasylishen * Source/NSFileManager.m: * Headers/Foundation/NSFileManager.h: Add removeItemAtPath:error: method, as a simple wrapper around removeFileAtPath:handler: with no handler. 2011-12-02 Richard Frith-Macdonald * config/config.constant-string-encoding.c: test for string literal encoding behavior ... irrespective of source encoding we need to put utf-8 in the executable. Can't check all cases, so just check the most common one ... that building latin1 source in a latin1 locale produces a utf8 string literal in the executable. * configure.ac: add check for encoding. * config.mak.in: specify charset for string literal in source * base.make.in: specify charset for string literal in executable * configure: regenerate Check compiler behavior ... if well behaved, that's OK, no action to take. If well behaved when given specific options to control input and output encodings, then note the options to be used when building. If neither, then abort with an error message giving the option of disabling unicode string literal checks. 2011-11-21 Richard Frith-Macdonald * Source/NSUserDefaults.m: rewrite to store defaults in multiple files, one for each persistent domain. Probably needs lots of testing and performance tuning. 2011-11-18 Richard Frith-Macdonald * Source/NSJSONSerialization.m: Fix errors in BOM handling and tidy. 2011-11-17 Richard Frith-Macdonald * Source/GSString.m: Fix to compile again (use ifdef to consistently have/not-have tiny strings), and tidy use of whitespace for readability and coding standards. I like the experimental tiny strings idea... will definitely save space, but will need a lot of optimisation (like that of literal strings) to stop it being slow. Until it's about as fast as literal strings, we should probably only enable it on platforms where memory footprint is an issue. Not sure how to do that though. 2011-11-16 20:48 theraven * Source/GSString.m: Store tiny strings (up to 8 ASCII characters) inside the pointer. Strings of this length are fairly common, and this makes them very cheap to store/copy/compare (pointer comparisons test for equality). 8 characters seems to be enough for quite a lot of common uses, such as path components and tokens. There are possibly still some things constructing tiny strings and not using these. 2011-11-16 17:29 theraven * Source/NSNumber.m: Implement the double boxing techniques used by Smalltalk/X and Cincom Smalltalk. Now we can conceal most doubles inside a pointer. This is most useful for LanguageKit, but should save some memory / malloc overhead / heap fragmentation in any code that uses a lot of NSNumbers (e.g. anything that deals with big plists). OS X 10.7 employs a similar trick. 2011-11-15 Adam Fedor * Source/win32/GSFileHandle.m: Fix include location 2011-11-04 Richard Frith-Macdonald * Source/NSPathUtilities.m: Deal with old FIXME saying that whether we create the GNUstep/Library directory should be configurable. Also, break long lines to confiorm to coding standards and for consistency. 2011-11-09 Richard Frith-Macdonald * Source/NSUserDefaults.m: ([-setObject:forKey:]) replace missing return statement after removing object. 2011-11-07 Fred Kiefer * Headers/Foundation/NSXMLParser.h: Turn the NSXMLParserDelegateEventAdditions informal protocol into the protocol NSXMLParserDelegate. 2011-11-07 Fred Kiefer * Source/NSValueTransformer.m ([NSUnarchiveFromDataTransformer-reverseTransformedValue]) ([NSUnarchiveFromDataTransformer-transformedValue]): Use archiver instead of keyed archiver. 2011-11-07 Richard Frith-Macdonald * Source/Additions/GSMime.m: ([+decodeBase64:]) tolerate missing padding and also use of '-' and '_' rather than '+' and '/' as permitted in the "URL and Filename safe" variation given in RFC 4648 2011-11-04 Richard Frith-Macdonald * Source/NSDate.m: ([-timeIntervalSinceDate:]) return NaN if other date is nil (OSX compatibility). 2011-11-02 Richard Frith-Macdonald * Source/NSNumber.m: Fix alignment error when encoding/decoding ... buffer must be aligned so that any datatype can go in it. * Source/cifframe.m: Fix buffer size for small scalar values on 64bit sparc * Source/GSFileHandle.m: Modify read/write to cope with interrupts. 2011-11-01 Richard Frith-Macdonald * Source/GSString.m: Partial restructuring suggested by Fred, plus some more minor optimisation of equality checks for literal strings. 2011-10-28 Richard Frith-Macdonald * Source/GSString.m: Fix error (spotted by Fred) in check of UTF-8 string length against fixed character size string length. 2011-10-28 Richard Frith-Macdonald * Source/GSString.m: Implement more efficient equality tests for utf-8 literal strings and strings in internal representation. Implement rangeOfComposedCharacterSequenceAtIndex: for utf8 literal strings. 2011-10-29 Fred Kiefer * Source/GSeq.h: Replace unsigned with NSUInteger. 2011-10-28 Richard Frith-Macdonald * Source/NSString.m: Fix bug when widening mutable string in replaceOccurrencesOfString:...range: * Source/GSString.m: more efficient check to see if a literal string can be converted to ascii or latin1. Remove unnecessary constraint on when we need to widen strings. 2011-10-28 Fred Kiefer * Tests/base/NSMutableString/basic.m: Add test for replaceOccurrencesOfString:...range: 2011-10-27 Richard Frith-Macdonald * configure.ac: Do not redefine GNUSTEP_CONFIG_FILE in case it confuses gnustep-config. Add check that gnustep-config returns something when asked for the objc libraries. * configure: Regenerate * base.make.in: Add flag to tell compiler to use UTF-8 for literal string constants. 2011-10-25 Richard Frith-Macdonald * configure.ac: fix erroneous define of HAVE_GNUTLS to zero, and add check for building with a different compiler from that used by make. 2011-10-24 Fred Kiefer * Source/NSAffineTransform.m (-initWithCoder:, encodeWithCoder:): Don't do anything for the keyed coding case. * Source/NSDictionary.m (-initWithCoder:): Add another keyed coding case. 2011-10-22 Fred Kiefer * Source/NSProcessInfo.m: Add includes needed for the HAVE_PROCFS case. * Source/common.h: Correct last commit, the #endif was placed incorrectly. 2011-10-20 Richard Frith-Macdonald * Source/common.h: Attempt to workaround clang __block problem 2011-10-20 Richard Frith-Macdonald * Source/NSPathUtilities.m: Fix for bug #34603 2011-10-19 Richard Frith-Macdonald * configure.ac: fixes for gnutls detection and to use the objc libraries provided by gnustep-config. 2011-10-19 Richard Frith-Macdonald * Headers/GNUstepBase/GSFileHandle.h: remove * Source/GSFileHandle.h: add * Source/GNUmakefile: Don't install private header * Source/NSFileHandle.m: * Source/GSFileHandle.m: * SSL/GSSSLHandle.m: Update to make GSFileHandle.h: private as it should be. 2011-10-19 Sebastian Reitenbach * configure.ac: fix typo on gnutls detection. 2011-10-19 Richard Frith-Macdonald * Source/NSPathUtilities.m: Fix failure to load global defaults when system layout/config is locked down (problem reported by Julian Mayer). 2011-10-18 Richard Frith-Macdonald * standalone.conf: example configuration file for a standalone package installation. * Documentation/Base.gsdoc: Documentation improvements for packaging 2011-10-17 Richard Frith-Macdonald * configure.ac: Make sourcing of default config file more reliable. * configure: regenerate. 2011-10-17 Richard Frith-Macdonald * Source/NSBundle.m: * Source/NSPropertyList.m: * Source/NSFileHandle.m: * Source/NSString.m: * Source/DocMakefile: * Documentation/Base.gsdoc: * Headers/Foundation/NSString.h: * Headers/Foundation/NSBundle.h: Documentation cleanups. 2011-10-17 Quentin Mathe * Headers/Foundation/NSXMLNode.h: * Source/NSXMLNode.m: Fixed NSXMLNode compilation when using the "pure" non-fragile ABI (--disable-mixedabi was passed to Base configure). 2011-10-17 Fred Kiefer * Source/NSString.m (-initWithCoder:): In keyed coding the key "NS.bytes" may contain either an NSData or an NSString object. Not sure about the encoding, I am using UTF8. 2011-10-17 Richard Frith-Macdonald * standalone.conf: First draft at a layout for standalone system deployment. 2011-10-15 Richard Frith-Macdonald * Source/common.h: Added Quentin's fix to get Clang to compile this without warnings. 2011-10-15 Richard Frith-Macdonald * Source/ObjectiveC2/NSBlocks.m: * Source/Additions/GSObjCRuntime.m: Fixes to build with latest gcc. 2011-10-15 Gregory Casamento * Documentation/GNUmakefile: * Documentation/README.initialize: Documentation referred to by NSThread warning. 2011-10-15 Richard Frith-Macdonald * config.mak.in: Shift the responsibility for setting up macros controlling thread safety to gnustep-make, and use the compiler -pthread option there. 2011-10-15 Richard Frith-Macdonald * Source/unix/Makefile.preamble: * Source/win32/Makefile.preamble: * Source/ObjectiveC2/Makefile.preamble: * Source/Additions/Makefile.preamble: * Source/Makefile.preamble: * config.mak.in: It seems various BSD operating systems have bugs in their _XOPEN_SOURCE implementation, so we can't generally use it. Try _POSIX_C_SOURCE instead. 2011-10-14 Richard Frith-Macdonald * Source/unix/Makefile.preamble: * Source/win32/Makefile.preamble: * Source/ObjectiveC2/Makefile.preamble: * Source/Additions/Makefile.preamble: * Source/Makefile.preamble: Define _REENTRANT as well as _XOPEN_SOURCE for maximum portability. 2011-10-14 Richard Frith-Macdonald * Source/NSBundle.m: * Source/NSPathUtilities.m: * Source/NSProcessInfo.m: * Source/NSSocketPort.m: * Source/NSRunLoop.m: * Source/NSMessagePortNameServer.m: * Source/unix/GSRunLoopCtxt.m: * Source/unix/NSStream.m: * Source/GSHTTPURLHandle.m: * Source/NSPage.m: * Source/NSMessagePort.m: * Source/win32/GSFileHandle.m: * Source/NSInvocation.m: * Source/NSFileManager.m: * Source/common.h: * Source/NSString.m: * Source/NSThread.m: * Source/NSData.m: * Source/NSHost.m: * Source/GSNetwork.h: * Source/NSPipe.m: * Source/NSLog.m: * Source/GSFormat.m: * Source/GSFileHandle.m: * Source/NSTask.m: * SSL/GSSSLHandle.m: * Tools/gdnc.m: Move/wrap include of unistd.h to work around clang problem. 2011-10-14 Richard Frith-Macdonald * Source/Additions/Unicode.m: Fix test for availability of lossy conversion via iconv. 2011-10-14 Richard Frith-Macdonald * Source/GSString.m: Implement -hash for literal UTF-8 performance. * Source/NSScanner.m: Fix initialisation bug which could cause scanning to fail on some strings. * Source/inet_pton.m: * Source/NSProcessInfo.m: * Source/NSSocketPort.m: * Source/NSUserDefaults.m: * Source/unix/NSStream.m: * Source/inet_ntop.m: * Source/GSHTTPURLHandle.m: * Source/NSMessagePort.m: * Source/GSPrivate.h: * Source/win32/GSFileHandle.m: * Source/win32/NSMessagePort.m: * Source/win32/NSMessagePortNameServer.m: * Source/NSFileManager.m: * Source/Additions/Unicode.m: * Source/Additions/NSError+GNUstepBase.m: * Source/NSThread.m: * Source/GSNetwork.h: * Source/GSFileHandle.m: * Source/NSLock.m: * Source/Makefile.preamble: Fix for thread-safe errno on solaris ... define _XOPEN_SOURCE to 600 2011-10-12 Richard Frith-Macdonald * Source/GSPrivate.h: * Source/NSString.m: * Source/GSString.m: Use UTF-8 literal constant strings now that we require a compiler version which supports them. * Tests/base/NSString/test07.m: Simple test for UTF-8 in literal. * Tests/base/GNUmakefile.super: Ensure all tests are compiled with UTF-8 set as the source code characterset. Shuld fix bug #34486 2011-10-11 Richard Frith-Macdonald * Source/NSString.m: Fix boundary error when getting cString into a buffer. Fix floatValue and doubleValue to support arbitrary length of leading white space. * Source/GSNetwork.h: Check for EAGAIN on nonblocking socket. 2011-10-08 Niels Grewe * Source/Additions/GSMime.m (GSMimeParser -scanToken:): Return an empty string instead of nil when parsing an empty quoted string. 2011-10-08 Richard Frith-Macdonald * Source/GSFileHandle.m: * Source/GSNetwork.h: * Source/GSSocketStream.m: * Source/NSMessagePort.m: * Source/NSSocketPort.m: * Source/NSURLProtocol.m: Check for EALREADY as well as EINPROGRESS as an indicator of an incomplete system call on a non-blocking descriptor. 2011-10-07 Richard Frith-Macdonald * Source/GSHTTPURLHandle.m: Be aggressive about checking for close n the 'connection' header and shutting down the network connection immediately. 2011-10-07 Richard Frith-Macdonald * Source/NSURLProtocol.m: * Source/NSURLConnection.m: Ensure that a synchronous load returns the response. * Tests/base/NSURLConnection/basic.m: add test for above change. 2011-10-04 Richard Frith-Macdonald * Headers/Foundation/NSURL.h: Document that methods creating file URLs raise an exception on being given a nil argument. * Source/NSURL.m: Make file URL initialisers raise on nil argument. * Source/NSBundle.m: Fix to check for nil path when reating file URLs (fix for bug #34468). 2011-10-03 Fred Kiefer * Source/NSPropertyList.m (GSBinaryPLParser -objectAtIndex:): Use long long for all integer types. Before we used signed types which resulted wrong values for negative integers. * Source/NSKeyedUnarchiver.m (-_decodeObject:): Handle the string "$null" as nil all the times. 2011-10-03 Richard Frith-Macdonald * Source/NSHost.m: Update to use inet_pton() and inet_ntop() and to understand IPV6 addresses. * Source/GSNetwork.h: New private functions to work with the internals of a sockaddr irrespective of whether it's IP v4 or v6 * Source/GSSocketStream.h: Move a declaration to GSNetwork.h * Source/GSSocketStream.m: Use new functions. * Source/NSSocketPort.m: Change to be IP v4/v6 agnostic * Source/NSMessagePort.m: Fix header include order. * Source/GSFileHandle.m: Changes to be IP v4/v6 agnostic * Headers/GNUstepBase/GSFileHandle.h: make setter use sockaddr type rather than sockaddr_in so we can use it for ipv6 2011-10-03 Fred Kiefer * Source/NSData.m (-initWithCoder:, -encodeWithCoder): Correct keyed encoding/decoding. 2011-10-02 Richard Frith-Macdonald * Headers/Foundation/NSFileManager.h * Source/NSFileManager.m * Tests/base/NSFileManager/general.m * Headers/Foundation/NSUserDefaults.h * Source/NSUserDefaults.m * Tests/base/NSUserDefaults/basic.m Add a few newer OSX methods for compatibility. 2011-10-01 Niels Grewe * Source/NSXMLNode.m: Properly implement -initWithKind: initializer. Stub out some tree traversal stuff. * Tests/base/NSXMLNode/basic.m: Fix test. Initial work on NSXMLNode. 2011-10-01 Niels Grewe * Tests/base/NSXMLNode/children.m: Test for child de-/re-attachment behaviour. 2011-09-29 julian * Source/NSBundle.m: ([objectForInfoDictionaryKey:]) Add missing one-line implementation. 2011-09-29 Richard Frith-Macdonald * Source/NSNumberFormatter.m: Check for _C_BOOL definition. 2011-09-07 Eric Wasylishen * Source/NSUserDefaults.m: - Refactoring of the code to read the system language list into a separate function, systemLanguages(). - Add support for the LANGUAGE environment variable, a GNU extension. It holds a colon-separated list of locales, and is intended to let the user specify a list of their preferred languages in order. For example, the language settings GUI in Ubuntu modifies the LANGUAGE variable. More info here: http://www.gnu.org/software/gettext/manual/gettext.html#The-LANGUAGE-variable - When populating NSLanguages, "expand" locales into a list of related variants, formed by stripping off region suffixes. This ensures that if a user's environment is set to a regional version of a language (say CanadaFrench) but an application is only traslated into French, the plain French translation will still be used. e.g. if the system locales are {fr_CA, en_CA}, expand the list to {fr_CA, fr, en_CA, en}. * Headers/GNUstepBase/GSLocale.h: * Source/GSLocale.m: New functions GSLocaleVariants and GSLanguagesFromLocale 2011-09-28 Niels Grewe * Tests/base/NSXMLNode/*: Some initial tests for NSXMLNode. Passes on Mac OS X, marked as hopes until GNUstep implements this. 2011-09-19 Richard Frith-Macdonald * Version: Bump version and set required gcc to 4.0.0 2011-09-18 Richard Frith-Macdonald * Documentation/news.texi: * Documentation/ReleaseNotes.gsdoc: Update release notes for ... Version 1.23.0 2011-09-12 Richard Frith-Macdonald * Source/NSConnection.m: When getting the local type information for comparison with that supplied by the remote system, do so by sending -methodSignatureForSelector: to the receiver of the message. 2011-09-07 Richard Frith-Macdonald * Source/GSFFIInvocation.m: Check that we have a typed selector during invocation (copy types from method signature if necessary) so that forwarding won't fail if the runtime does a callback to us without providing the receiver for us to check ... workaround for proxying issues with very old runtimes. 2011-08-27 Richard Frith-Macdonald * Source/NSLock.m: Fix bug #34154 ... logic error locking before date. 2011-08-26 Richard Frith-Macdonald * libs/base/trunk/config/config.objc.m: If we don't assume Object exists in libobjc, we must implement +initialize so that the runtime won't crash when it tries to initialize our class. 2011-08-25 Fred Kiefer * Tests/base/NSObject/test01.m: Only test for -isClass on GNUstep base. * Tests/base/NSObject/initialize.m: Make test compile on MinGW. 2011-08-22 Fred Kiefer * Source/NSObject.m (__builtin_offsetof): Add workaround for build in missing in old versions of gcc. 2011-08-20 Fred Kiefer * Source/Additions/GSMime.m, * Source/unix/NSStream.m, * Source/NSData.m, * Source/NSDistantObject.m, * Source/NSInvocation.m, * Source/NSMessagePort.m, * Source/NSNumber.m, * Source/NSSocketPort.m, * Source/NSURLProtocol.m, * Tools/autogsdoc.m: Temporary revert David's change to use PRIxPTR, PRIuPTR and PRIdPTR. Old compilers don't handled these well. (That change didn't have a ChangeLog entry) 2011-08-17 Fred Kiefer * Source/Additions/GSMime.m: Use specific IMP type for method returning BOOL value. 2011-08-17 Niels Grewe * config/objc-common.h: Include stdlib.h for the prototype of calloc(). 2011-08-17 Riccardo Mottola * Headers/GSIMap.h Additional cast to void* to keep OpenBSD compiler happy. 2011-08-15 Richard Frith-Macdonald * Source/Additions/GSMime.m: Redo fix for incorrect handling of documents with empty headers. 2011-08-14 Richard Frith-Macdonald * Source/Additions/GSMime.m: Revert attempted fix for header end parsing error. 2011-08-06 Richard Frith-Macdonald * Source/Additions/GSMime.m: Attempt fix for recording of excess data in the case where we are parsing mime headers only and the headers are incomplete. 2011-08-13 15:28 David Chisnall * libs/base/trunk/Source/NSBundle.m, libs/base/trunk/Source/NSDateFormatter.m, libs/base/trunk/Source/NSLocale.m, libs/base/trunk/Source/NSNumberFormatter.m, libs/base/trunk/Source/NSRegularExpression.m: Fix the build with the pure non-fragile ABI by declaring macros before using them. 2011-08-13 13:28 David Chisnall * libs/base/trunk/config/config.objc.m: Don't assume Object exists in libobjc. 2011-08-11 Fred Kiefer * Source/NSAffineTransform.m (-appendTransform:) (-prependTransform:): Fix bug in optimisation code by using a local variable. 2011-08-09 08:43 David Chisnall * libs/base/trunk/Source/NSConcreteHashTable.m, libs/base/trunk/Source/NSConcreteMapTable.m: Replace the implementations of NSFastEnumeration in NSConcrete{Hash,Map}Table with ones that work and don't cause people to dereference pointers that are set to random integer values. 2011-08-07 18:00 David Chisnall * libs/base/trunk/Source/NSObject.m: In -finalize, we're pretending to be the Objective-C runtime, so we need to actually use isa directly, rather than the safe version. A better solution would be to call object_dispose(), but this only works for objects created with class_createInstance(). 2011-08-07 16:56 David Chisnall * libs/base/trunk/Source/NSObject.m: When calling -.cxx_dealloc, look up the superclass before calling. This method may destroy the receiver's class, if it's a user-generated one, so we can't guarantee that it is valid after the call. 2011-08-05 17:34 David Chisnall * libs/base/trunk/Source/NSNumber.m: Bracket the runtime.h include in a check. 2011-08-03 12:04 David Chisnall * libs/base/trunk/Headers/Foundation/NSRegularExpression.h, libs/base/trunk/Source/NSRegularExpression.m, libs/base/trunk/Source/NSString.m, libs/base/trunk/Tests/base/NSString/regex.m: Clean up NSRegularExpression, so that it compiles without warnings with or without ICU, but we don't pretend that we support things that we don't and silently return nonsense results to make debugging difficult for GNUstep users. 2011-08-03 Fred Kiefer * Tests/base/NSMutableData/general.m * Tests/base/NSData/general.m * Tests/base/NSFileManager/unrepresentable_filenames.m * Tests/base/NSDate/create.m * Tests/base/GSMime/test01.m * Tests/base/Functions/runtime.m * Tests/base/NSInvocation/general.m * Tests/base/KVC/mutable.m * Tests/base/KVC/path.m * Tests/base/KVC/array.m * Tests/base/NSMapTable/create.m * Tests/base/NSHashTable/create.m * Tests/base/GenericTests/generic.m * Tests/base/NSBundle/resources.m: Remove warnings generated by tests. 2011-08-02 Fred Kiefer * Tests/base/NSJSONSerialization/json.m: Get it compile without C99. * Tests/base/NSString/regex.m: Use an autorelease pool. 2011-08-02 Fred Kiefer * Source/NSThread.m (GSCurrentThread): Use C string in assert, not ObjC string. * Headers/Foundation/NSRegularExpression.h: Add the pattern as ivar. * Source/NSRegularExpression.m: Rewrite to compile with less warnings on systems not supporting ICU. 2011-07-31 16:19 David Chisnall * libs/base/trunk/Headers/Foundation/NSObject.h: Remove the duplicate definition of the NSObject protocol methods in the NSObject class (redundant since they are implicitly added by the class adopting the protocol, and stupid because there was already one copy-and-paste error where they differed slightly). Also replaced all of the references to nonexistent documentation with actual documentation. 2011-07-31 15:31 David Chisnall * libs/base/trunk/Headers/Foundation/NSAutoreleasePool.h, libs/base/trunk/Headers/Foundation/NSException.h, libs/base/trunk/Headers/Foundation/NSObjCRuntime.h, libs/base/trunk/Headers/Foundation/NSObject.h, libs/base/trunk/Source/GSArray.m, libs/base/trunk/Source/GSBlocks.m, libs/base/trunk/Source/GSString.m, libs/base/trunk/Source/NSBundle.m, libs/base/trunk/Source/NSConnection.m, libs/base/trunk/Source/NSDate.m, libs/base/trunk/Source/NSIndexPath.m, libs/base/trunk/Source/NSMessagePort.m, libs/base/trunk/Source/NSNull.m, libs/base/trunk/Source/NSNumber.m, libs/base/trunk/Source/NSPort.m, libs/base/trunk/Source/NSSocketPort.m, libs/base/trunk/Source/NSTimeZone.m, libs/base/trunk/Source/NSURLProtocol.m, libs/base/trunk/Source/NSValue.m: Cleanup: - (void)release; to - (oneway void)release; so everything implementing -release actually implements the one declared in the NSObject protocol. Start marking things that are unavailable in ARC mode as unavailable in ARC mode. 2011-07-26 David Chisnall * Source/NSObject.m: Change the order of the retain count and the padding, so the retain count is always the word before isa. Switch to using the correct kind of alignof (the ABI alignment in structures, not the preferred alignment of the type - this stops us from allocating 4 bytes of padding on x86-32 where there is no need for any) * Source/NSNumber.m: Use the small object support in libobjc2 trunk for 31 / 61-bit signed NSNumbers on 32 / 64-bit platforms respectively. Still to do: add an NSSmallFloat equivalent for 64-bit platforms, storing a float. 2011-07-26 Quentin Mathe * Headers/Foundation/NSObject.h: * Headers/Foundation/NSProxy.h: * Source/NSProxy.m: Fixed missing oneway qualifier on -release return type. Recent Clang trunk complains about it. 2011-07-25 Fred Kiefer * Source/NSJSONSerialization.m: Get this file to compile with standard gcc settings fro GNUstep. 2011-07-25 15:50 David Chisnall * libs/base/trunk/Headers/Foundation/Foundation.h, libs/base/trunk/Headers/Foundation/NSJSONSerialization.h, libs/base/trunk/Source/GNUmakefile, libs/base/trunk/Source/NSJSONSerialization.m, libs/base/trunk/Tests/base/NSJSONSerialization, libs/base/trunk/Tests/base/NSJSONSerialization/TestInfo, libs/base/trunk/Tests/base/NSJSONSerialization/json.m: Added NSJSONSerialization (10.7) implementation. The code path reading from an NSInputStream is not well tested - please try and break it! 2011-07-25 Fred Kiefer * libs/base/trunk/Headers/GNUstepBase/GSIMap.h (GSIMapAddKeyNoRetain): Correct previous change. 2011-07-24 Fred Kiefer * Source/NSAssertionHandler.m, * Headers/GNUstepBase/GSConfig.h.in: Clean up after last commit. * Headers/GNUstepBase/preface.h.in: Remove this obsolete file. 2011-07-24 13:09 David Chisnall * Headers/Foundation/NSArray.h, Headers/Foundation/NSDictionary.h, Headers/Foundation/NSEnumerator.h, Headers/Foundation/NSInvocation.h, Headers/GNUstepBase/GSFileHandle.h, Headers/GNUstepBase/GSIMap.h, Headers/GNUstepBase/preface.h.in, Source/Additions/GCDictionary.m, Source/Additions/GSInsensitiveDictionary.m, Source/Additions/GSLock.m, Source/Additions/NSData+GNUstepBase.m, Source/GSArray.m, Source/GSDictionary.m, Source/GSInvocation.h, Source/NSArray.m, Source/NSAssertionHandler.m, Source/NSCharacterSet.m, Source/NSConcreteHashTable.m, Source/NSConcreteMapTable.m, Source/NSConcretePointerFunctions.h, Source/NSConnection.m, Source/NSCountedSet.m, Source/NSData.m, libs/base/trunk/Source/NSDate.m, Source/NSDebug.m, Source/NSDictionary.m, Source/NSDistantObject.m, Source/NSHost.m, Source/NSIndexPath.m, Source/NSInvocation.m, Source/NSKeyValueObserving.m, Source/NSPointerArray.m, Source/NSProcessInfo.m, Source/NSPropertyList.m, Source/NSTimeZone.m, Source/NSValue.m, Source/unix/NSStream.m, Tests/base/NSHashTable/weak.m, Tests/base/NSPointerArray/weak.m: Lots of little fixes to make -base compile with -Werror (now builds without warnings). Richard: I'm unsure about three of these, which were fixes in memset() calls in: - NSConcreteMapTable.m - NSConcreteHashTable.m - Additions/NSData+GNUstepBase.m Please can you check them? I think they are intended to zero the entire object (rather than the first word), but the lack of comments makes me unsure. Most changes were just tweaks to variable types. I've also removed some dead code from NSInvocation. This was small group of things that were marked for internal use only, but not actually referenced in the code anywhere. Other improvements: - NSArray / NSDictionary fixed up to use the 10.7 (ARC-friendly) prototypes. - getObjects:andKeys: implemented for NSDictionary (10.5 method) - NSPointerArray and NSHashTable now properly support weak objects. - Tests for weak objects in collections. 2011-07-23 16:16 David Chisnall * libs/base/trunk/Headers/GNUstepBase/GSIMap.h, libs/base/trunk/Source/NSConcreteMapTable.m, libs/base/trunk/Source/NSConcretePointerFunctions.h, libs/base/trunk/Tests/base/NSMapTable/weak.m: Add support (and test) for weak keys and values in NSMapTable. This support should work in GC mode. It also works if the runtime supports ARC, even if the compiler does not use this support. 2011-07-23 12:19 David Chisnall * libs/base/trunk/Source/NSObject.m: Remove the zone pointer from objects. Now we always query the zones to find the relevant pointer. Zones are still supported, but we now optimise for the case where they are not used. To disable zone support completely, NSAllocateObject() should ignore the zone and NSDeallocateObject() should skip the zone lookup. 2011-07-22 16:07 David Chisnall * libs/base/trunk/Headers/Foundation/NSArray.h, libs/base/trunk/Source/GSArray.m, libs/base/trunk/Source/NSArray.m: Change id* -> id[] for OS X 10.7 compatibility in NSArray. This change is required for ARC: now, id* means pointer to a single object, id[] means array. 2011-07-22 14:38 David Chisnall * Source/NSRegularExpression.m: Added stub implementation for when GNUstep is built without ICU. 2011-07-20 Eric Wasylishen * Source/NSNumberFormatter.m (-attributedStringForObjectValue:withDefaultAttributes:): Guard against initializing an NSAttributedString with a nil string. 2011-07-20 Eric Wasylishen * Source/GSAttributedString.m: Throw an exception if the string object passed to -initWithString:attributes: doesn't respond to -length, or if it is nil. This is the same behaviour as OS X. * Source/NSAttributedString.m (-init): Call -initWithString:attributes: with @"" instead of nil, since passing nil now causes an exception to be thrown. 2011-07-19 Richard Frith-Macdonald * Source/Makefile.postamble: Install ObjectiveC2 compatibility headers only if that is built (which should be only if no 'real' objc2 library is available). Also generate an objc/runtime.h header to include objectiveC2/runtime.h so that people can just include objc/runtime.h to use the new runtime API irrespective of whether the API is provided by the actual runtime library or by the compatibility library. 2011-07-15 Richard Frith-Macdonald * Source/GNUmakefile: * Source/GSRunLoopWatcher.h: * Source/NSXMLPrivate.h: * Source/unix/GSRunLoopCtxt.m: * Source/win32/GSFileHandle.m: * Source/win32/NSMessagePort.m: * Source/win32/GSRunLoopCtxt.m: * Source/win32/NSStream.m: * Source/common.h: * Source/Additions/GSXML.m: * Source/Additions/GSFunctions.m: * Source/Additions/GSObjCRuntime.m: * Source/GSURLPrivate.h: * SSL/GSSSLHandle.m: * Makefile.postamble: * configure.ac: * Headers/GNUstepBase/GSConfig.h.in: * Headers/GNUstepBase/GSFunctions.h: * Headers/GNUstepBase/GSObjCRuntime.h: * Headers/Foundation/NSZone.h: * Tools/make_strings/make_strings.m: * configure: regenerate Remove references to obsolete header. 2011-07-15 Richard Frith-Macdonald * Source/NSThread.m: Fix faulty assert. 2011-07-12 Richard Frith-Macdonald * Source/NSFileHandle.m: * SSL/GSSSLHandle.m: * Headers/Foundation/NSFileHandle.h: Fixup to let certificate information contain a chaing with intermediate certificate authorities. Simplify handshake using common routine for non-blocking handshake attempt. 2011-07-11 14:31 David Chisnall * Source/NSAutoreleasePool.m, Source/NSThread.m: Lazily initialize POSIX threads, matching OS X behaviour and stopping us from crashing when calling autorelease from a thread that was not previously registered explicitly (yuck!) Also do some quite hacky (and not totally correct) things to try to make sure that we aren't confused into thinking that the first NSThread is the main thread, if it's created on a separate thread. Currently only supported on FreeBSD and OpenBSD. 2011-07-11 12:36 David Chisnall * Source/NSNumber.m: [NSNumber -init] should not destroy itself when called as [super init]. This behaviour was breaking anything that subclassed NSNumber in user code (e.g. PyObjC). 2011-07-11 Fred Kiefer * Source/GSLocale.m (GSLanguageFromLocale): Handle local "C.UTF-8" correctly. Needed for Cygwin. 2011-07-11 Fred Kiefer * config/config.ffi.c: Move declaration of g_dbl to begin of function. Patch by Sebastian Reitenbach 2011-07-11 Fred Kiefer * Source/NSTimeZone.m (+systemTimeZone): Support the OpenSuse key TIMEZONE in /etc/sysconfig/clock. 2011-07-10 Wolfgang Lux * Source/NSObject.m (+zone): Override to ensure that -zone returns a valid zone pointer when it is called on a class object. 2011-07-05 Fred Kiefer * macosx/gnustep.pbproj/project.pbxproj, * Tools/make_strings/GNUmakefile.preamble: Remove references to obsolete directory Headers/Additions. 2011-07-05 Fred Kiefer * Headers/GNUstepBase/GNUstep.h: Define the __has_feature macro, as this file may be used without preface.h being included first. Fixes bug #33708. Patch by Tim Kack . 2011-07-04 11:31 David Chisnall * Source/NSObject.m: Switch the order of the reference count and the zone so that the reference count (in reference counted mode) is always immediately in front of the object. Please test this!! Opt NSObject into the fast path for ARC. ARC will now not call the retain / release / autorelease methods on NSObject or any classes that inherit their implementation of these methods from NSObject. In quick and dirty testing, this gives about a 10-20% speedup. 2011-06-30 14:44 David Chisnall * Headers/Foundation/NSArray.h, Headers/Foundation/NSProxy.h, Headers/GNUstepBase/GSVersionMacros.h, Headers/GNUstepBase/preface.h.in, Source/NSProxy.m: Rewrote NSProxy's -retain / -release to be the same as NSObject, not its own ad-hoc thing. Added declaration of __bridge for use in non-ARC mode. Tweaked arrayWithObjects:count: to take a const id* parameter, to avoid ARC treating it as a write-back parameter. 2011-06-29 15:21 David Chisnall * Headers/Foundation/NSNotification.h, Headers/Foundation/NSZone.h, Headers/GNUstepBase/preface.h.in, Tools/make_strings/make_strings.m: More ARC fixes. We don't want to be using __strong void* in ARC mode (it only makes sense in GC mode and is invalid in ARC mode). 2011-06-29 13:13 David Chisnall * Source/NSObject.m: Add support to NSObject for automatically zeroing __weak references when using ARC. 2011-06-29 11:50 David Chisnall * Headers/Foundation/NSAutoreleasePool.h, Headers/Foundation/NSEnumerator.h, Headers/Foundation/NSException.h, Headers/Foundation/NSZone.h, Headers/GNUstepBase/preface.h.in: ARC-compatibility tweaks in the headers. ARC will not track objects inside structures and rejects code that uses object types that are not __unsafe_unretained qualified inside structures. This quick fix just added this type qualifier on all such structures. Several of these should probably not be in headers at all. 2011-06-26 Wolfgang Lux * Source/NSString.m(-_getStart:end:contentsEnd:forRange:lineSep:, -getLineStart:end:contentsEnd:forRange:, -getParagraphStart:end:contentsEnd:forRange): Fix implementation of getParagraphStart:end:contentsEnd:forRange:. 2011-06-26 Wolfgang Lux * configure.ac: * config/config.ffi.c (cls_struct_combined_fn): Fix the broken test whether libffi works. The test program always failed, but this failure was masked by an incorrect use of AC_TRY_RUN. * configure: Regenerated. 2011-06-23 Fred Kiefer * Headers/Foundation/NSBundle.h, * Source/NSBundle.m: Add a few 10.6 NSURL methods. Based on patch by julian. 2011-06-20 Sebastian Reitenbach * SSL/GSSSLHandle.m: * Headers/GNUstepBase/GSFileHandle.h: Avoid compiler warnings 2011-06-20 Richard Frith-Macdonald * Source/NSObject.m: Keep zombie working until after atext stuff has run. * Source/NSUserDefaults.m: fix possible deref of nul pointer. * Source/Additions/NSObject+GNUstepBase.m: * Headers/GNUstepBase/NSObject+GNUstepBase.h: Make clanup code a bit more flexible by allowin different cleanup methods to be registered. 2011-06-19 Richard Frith-Macdonald * Headers/GNUstepBase/NSObject+GNUstepBase.h: * Source/Additions/NSObject+GNUstepBase.m: * Source/NSArray.m: * Source/NSNotificationCenter.m: * Source/NSObject.m: * Source/NSString.m: * Source/NSTimeZone.m: * Source/NSUserDefaults.m: * Source/NSValue.m: More leak cleanup. 2011-06-19 Richard Frith-Macdonald * Headers/GNUstepBase/NSObject+GNUstepBase.h: * Source/Additions/NSObject+GNUstepBase.m: Add new category with methods for cleanup of long-lived data structures on process exit. * Source/NSObject.m: Check GNUSTEP_SHOULD_CLEAN_UP environment variable and call +shouldCleanUp: if it is set. * Documentation/Base.gsdoc: Document new environment variable. * Source/GSLocale.m: * Source/NSDistributedNotificationCenter.m: * Source/NSUserDefaults.m: * Source/NSNotificationCenter.m: * Source/GSPrivate.h: * Source/externs.m: * Source/NSString.m: Add some cleanup support. Classes may perform cleanup in a +atExit method which is automatically called on process exit. Classes may use [NSObject+leak:] to 'leak' an object so that it is retained for the life of the process, but released immediately before the +atExit methods are called if GNUSTEP_SHOULD_CLEAN_UP is YES. See the NSObject(AtExit) category documentation for details. 2011-06-18 Sebastian Reitenbach * Source/NSObject.m: fix for clang * SSL/GNUmakefile: don't link libobjc ... depend on gnustep-make 2011-06-18 Richard Frith-Macdonald * Headers/Foundation/NSURL.h: * Source/NSURL.m: more 10.6 methods 2011-06-17 Richard Frith-Macdonald * Source/NSXMLParser.m: Fix error with whitespace at end of attributes. * Headers/GNUstepBase/NSURL+GNUstepBase.h: Add method to build a URL from separate components. * Headers/Foundation/NSURL.h: Add some OSX 10.6 methods for path handling, and incorporate documentation from source file. * Source/NSURL.m: Add some OSX 10.6 methods for path handling, fix minor bug checking resource availability, and move documentation to header. * Source/Additions/NSURL+GNUstepBase.m: Add method to build a URL from components. We NEED testcases for these. 2011-06-13 Fred Kiefer * Source/GSAvahiRunLoopIntegration.m: Declare the local methods in the interface. Patch by Sebastian Reitenbach 2011-06-11 Fred Kiefer * Source/NSDateFormatter.m, * Source/NSTimeZone.m, * Source/NSCalendar.m: Protect the name id. Patch by Sebastian Reitenbach 2011-06-09 Richard Frith-Macdonald * configure: Regenerate * config.mak.in: * configure.ac: * Source/Makefile.preamble: * Tools/Makefile.postamble: * Tools/Makefile.preamble: Add --with-gdomap-port= to specify an alternative port 2011-06-07 Richard Frith-Macdonald * Source/Additions/GSLock.m: Remove notification observation on dealloc. 2011-06-04 Fred Kiefer * Headers/Foundation/NSURL.h, * Source/NSURL.m: Add -checkResourceIsReachableAndReturnError: 2011-06-03 Wolfgang Lux * Source/NSString.m: [(-getLineStart:end:contentsEnd:forRange:)] Fix off-by-one error in reported contents end for DOS style lines. 2011-06-02 Riccardo Mottola * Source/NSTimeZone.m: Disable use of tzname on OpenBSD too. 2011-06-02 Richard Frith-Macdonald * Source/NSTimeZone.m: Allow for quotes around zone name in /etc/sysconfig/time on redhat/centos. 2011-06-01 Richard Frith-Macdonald * Source/NSTimeZone.m: Disable use of tzname on FreeBSD as it's not fully implemented there. Add a couple of new mechanisms for guessing the timezone on debina and redhat. 2011-06-01 Richard Frith-Macdonald * Headers/Foundation/NSString.h: Add explicit warnings about OSX compatible modifications to values returned by path methods. * Source/NSTimeZone.m: Don't guess at tzname[0] if the value of daylight shows it's not valid. 2011-05-31 Niels Grewe * Source/NSCallBacks.h: Adjust callback prototypes to use NSUInteger. 2011-05-31 Richard Frith-Macdonald * Headers/GNUstepBase/GNUstep.h: Deprecate autorelease pool macros and make them always create the pool. 2011-05-31 Richard Frith-Macdonald * Headers/Foundation/NSHashTable.h: * Headers/Foundation/NSMapTable.h: * Source/Additions/GSMime.m: * Source/Additions/GSXML.m: * Source/GSAvahiNetService.m: * Source/NSCallBacks.m: * Source/NSConcreteHashTable.m: * Source/NSConcreteMapTable.m: * Source/NSConnection.m: * Source/NSMessagePort.m: * Source/NSSocketPort.m: * Source/NSTask.m: * Source/NSTimeZone.m: * Source/unix/GSRunLoopCtxt.m: * Source/win32/GSRunLoopCtxt.m: Update to use new NSInteger... callback names rather than NSInt... for compatibility with OSX * Source/NSNotificationCenter.m: revert/rewrite recent GC changes to simplify code and preprocessor conditionals and to avoid overheads of using a class as an observation except for GC with cland/libobc2. Is it really needed even then? I guess it would be if we weren't using the Boehm GC library, and were stuck with a GC system which didn't support zeroing weak pointers in unscanned memory. 2011-05-29 Richard Frith-Macdonald * configure.ac: Fix broken atomic ops again. * configure: regenerate 2011-05-30 11:40 David Chisnall * Source/NSData.m: Add a couple of __strong annotations to pointers. Any non-id pointer that can store GC'd memory must be __strong. Currently, this annotation is largely ignored, because the runtime is a lot more lax about what may store pointers than Apple's, but this will be tightened up in the future. 2011-05-28 Fred Kiefer * Source/NSNotificationCenter.m, * Source/NSUserDefaults.m: Remove compiler warnings. 2011-05-28 18:05 David Chisnall * Source/NSPointerArray.m: Make NSPointerArray insert the correct read / write barriers in GC mode. * Source/NSConcretePointerFunctions.h: Add some helper functions to NSConcretePointerFunctions.h that make it easier to do this in the other collections that need to support GC. 2011-05-28 Eric Wasylishen * configure.ac: Tweak atomic ops detection * Sourcen/NSObject.m: Re-enable atomic ops 2011-05-28 14:51 David Chisnall * Source/NSAutoreleasePool.m, * Source/NSObject.m, * Source/NSZone.m: First pass at hybrid GC mode. This will try use retain-release mode if the collector is not running. Code will run in retain/release mode unless something compiled with -fobjc-gc-only is loaded. 2011-05-28 Fred Kiefer * Source/NSString.m (-initWithFormat:locale:): Make sure va_end() gets called. Patch by Stefan Bidigaray . 2011-05-28 12:49 David Chisnall * Source/NSNotificationCenter.m: __weak is only allowed on ivars and globals, so we need to turn the Observation structure into a class. 2011-05-28 Niels Grewe * Source/NSObject.m: Disable atomic ops detection for the time being. 2011-05-27 11:48 David Chisnall * Source/NSAutoreleasePool.m: Make -drain and -release in NSAutoreleasePool do the same thing (rather than one calling the other) in non-GC mode. * Source/Additions/GSMime.m, * Source/Additions/GSObjCRuntime.m, * Source/Additions/NSCalendarDate+GNUstepBase.m, * Source/Additions/NSData+GNUstepBase.m, * Source/NSBundle.m, * Source/NSConnection.m, * Source/NSDebug.m, * Source/NSDistributedNotificationCenter.m, * Source/NSException.m, * Source/NSFileManager.m, * Source/NSKeyedArchiver.m, * Source/NSLog.m, * Source/NSMessagePort.m, * Source/NSMessagePortNameServer.m, * Source/NSPort.m, * Source/NSProcessInfo.m, * Source/NSRunLoop.m, * Source/NSTask.m, * Source/NSTimeZone.m, * Source/NSUserDefaults.m, * Tools/AGSHtml.m, * Tools/AGSIndex.m, * Tools/AGSOutput.m, * Tools/AGSParser.m, * Tools/HTMLLinker.m, * Tools/gspath.m * Tools/pl.m: Replace all -release messages sent to autorelease pools with -drain. In non-GC mode, these are equivalent. In GC mode, these trigger a collection. 2011-05-26 Richard Frith-Macdonald * Source/NSObject.m: Remove useless leftover #define. * configure.ac: Get -march flag passed to build process * configure: regenerate 2011-05-26 Niels Grewe * configure.ac: Add test to check for availability of atomic builtins. * configure: Regenerate. * Headers/GNUstepBase/config.h.in: Regenerate. * Source/NSObject.m: Fix typo. Attempt to set the compiler and linker flags needed to enable compiler intrinsics for atomic operations on platforms where those are available. 2011-05-26 18:29 David Chisnall * Source/simple-load.h: Use RTLD_NOLOAD, if it's supported. 2011-05-26 13:24 David Chisnall * Headers/Foundation/NSNotification.h, * Source/Additions/GSLock.m, * Source/Additions/GSObjCRuntime.m, * Source/Additions/Unicode.m, * Source/GSString.m, * Source/NSThread.m, * Source/NSZone.m: More GC fixes. Most notably, mark the thread object as not collectable, since it's hidden away in TLS where the GC can't find it. 2011-05-25 Richard Frith-Macdonald * Source/NSObject.m: Further tweak of atomic assembly code ... don't really know what I'm doing here ... perhaps theoriginal author (mostly David?) knows more about this assmebly stuff and implementation of atomic primitives on different architectures? 2011-05-25 11:15 David Chisnall * Headers/Foundation/NSZone.h, * Source/GSString.m, * Source/NSData.m, * Source/NSMethodSignature.m, * Source/NSNotificationCenter.m, * Source/NSObject.m, * Source/NSZone.m: More tweaks for garbage collection mode, including making NSNotificationCenter use weak pointers (things are never removed if it uses strong pointers because they remove themselves in the -dealloc method, which is never called, and can't remove themselves in the -finalize method because the -finalize method would not be called until after they have been removed - this is consistent with Apple behaviour). Gorm now works correctly when built with GC enabled. 2011-05-25 Richard Frith-Macdonald * Source/NSObject.m: Attempt fix for atomic assembler on x86 (bug #33392) 2011-05-24 David Chisnall * Source/NSBundle.m * Source/NSGarbageCollector.m * Source/NSKeyValueObserving.m * Source/NSZone.m * Source/NSObject.m * Source/NSAutoreleasePool.m First pass at supporting fully Apple-compatible GC in -base. Code sitting on top of -base should not require modifying (in theory, at least, and unless it does the sort of evil tricks that LanguageKit does for performance). 2011-05-24 Richard Frith-Macdonald * Source/NSAutoreleasePool.m: Try to better cope with bad code which leaks autorelease pools. 1. check number of pools in thread when creating a new one, and raise an exception if too many are created. 2. when deallocating a pool, avoid recursively deallocating child pools so that a large number of pools won't cause stack overflow. 2011-05-23 Richard Frith-Macdonald * Source/NSBundle.m: Fix to resolve links and standardize path to current executable. 2011-05-22 Richard Frith-Macdonald * Source/Additions/GSMime.m: Fixes for encoding quoted-printable document body content. 2011-05-19 Richard Frith-Macdonald * Source/NSPortCoder.m: * Source/NSMethodSignature.m: * Source/GSFFCallInvocation.m: * Source/GSFFIInvocation.m: * Source/NSUnarchiver.m: * Source/NSCoder.m: * Source/cifframe.m: * Source/Additions/GSObjCRuntime.m: * Source/NSConnection.m: * Source/NSData.m: * Source/NSObjCRuntime.m: * Source/NSArchiver.m: Fixup objc header includes for gcc-4.6 2011-05-12 Richard Frith-Macdonald * Source/GSFileHandle.m: * Source/GSHTTPURLHandle.m: * Source/win32/NSMessagePort.m: * Source/win32/NSMessagePortNameServer.m: Include/use errno.h for thread-safe errno support. 2011-05-12 Richard Frith-Macdonald * Source/NSPortCoder.m: * Source/GSConcreteValueTemplate.m: * Source/GSFFCallInvocation.m: * Source/NSKeyedUnarchiver.m: * Source/GSFFIInvocation.m: * Source/NSUnarchiver.m: * Source/NSCoder.m: * Source/NSURL.m: * Source/cifframe.m: * Source/NSConnection.m: * Source/NSData.m: * Source/NSObjCRuntime.m: * Source/GSValue.m: * Source/NSValue.m: * Source/NSArchiver.m: updates for old/new objc api change. 2011-05-12 Fred Kiefer * Source/GSArray.m: Fix keyed decoding for GSMutableArray and GSPlaceholderArray. 2011-05-09 Richard Frith-Macdonald * Source/NSXMLParser.m: treat unknown/undefined encodings as utf-8 so we tolerate bad xml documents better. 2011-05-02 Eric Wasylishen * Source/Additions/GSObjCRuntime.m (GSSelectorFromNameAndTypes): With gcc 4.6 libobjc, GSSelectorFromNameAndTypes was calling some functions like sel_get_any_typed_uid that were not declared (they're declared in objc/objc-api.h which cannot be imported). I had to copy over these function declarations, otherwise incorrect function calls are generated which corrupt selectors (at least on x86-64). 2011-05-02 Richard Frith-Macdonald * Source/NSNumberFormatter.m: Fix broken copying of formatters, cleanup/simplify decoding, cleanup/simplify by removif macros. 2011-04-30 Quentin Mathe * Tools/autogsdoc.m: Fixed OrderedSymbolDeclarations.plist content to take in account that existing .gsdoc files are usually not regenerated. We now create the plist by merging it with the previously output plist file. 2011-04-26 Eric Wasylishen * Source/NSNumberFormatter.m: Move the body of -init to a method called -_NSNumberFormatterInit, and call this in -initWithCoder: so that instances created with -initWithCoder: are initialized correctly. 2011-04-26 Eric Wasylishen * Headers/Foundation/NSObjCRuntime.h: Add CGFLOAT_MIN and CGFLOAT_MAX 2011-04-14 Adam Fedor * VERSION: Bump version 2011-04-14 Adam Fedor * Version 1.22.0 2011-04-12 Richard Frith-Macdonald * Source/Additions/GSObjCRuntime.m (GSSelectorFromNameAndTypes): Comment out case for __GNU_LIBOBJC__ to avoid breakage with gcc-4.6 * Source/NSPathUtilities.m: Minor tweak for running testcases. * Tests/base/NSBundle/resources.m: * Tests/base/NSBundle/basic.m: Skip gnustep library bundle tests if not installed. * Tests/base/NSNumberFormatter/basic.m: Changed a test to a hope for the next release 2011-04-10 Quentin Mathe * Tools/AGSOutput.m (-fitWords:from:to:maxSize:output:): Ensure all paragraphs are output in the same way. Each paragraph starts on a new line now, which results in a GSDoc output that looks a bit better and is easier to parse. 2011-04-09 Nicola Pero * Source/Additions/GSObjCRuntime.m (GSSelectorFromNameAndTypes): Uncommented case for __GNU_LIBOBJC__. 2011-04-09 Nicola Pero * configure.ac: Updated the checks to enable native Objective-C exceptions. If native exceptions were enabled in gnustep-make - because the compiler supports them -, but are disabled here because there is no uncaught exception handler in the runtime, print an explanation without aborting; we now disable them via base.make. * configure: Regnerated. * base.make.in: Set USE_OBJC_EXCEPTIONS to no if we disabled native exceptions when configuring. 2011-04-09 Nicola Pero * Tests/GNUmakefile: Updated comments. 2011-04-08 Nicola Pero * Tests/GNUmakefile: Include rules.make instead of test-tool.make. (TOP_DIR): Define using ':=' instead of '='. (TEST_TOOL_NAMES): Variable removed. 2011-04-08 Nicola Pero * Tools/pl2link.m (main): Fixed determining the installation location with the current filesystem layout (Problem reported by "Philippe Roussel" ). 2011-04-07 Richard Frith-Macdonald * Source/Additions/GSMime.m: Fix failure to connect to mail server. 2011-04-07 Richard Frith-Macdonald * Source/NSNmberFormatter.m: Tweak macros to avoid compiler warnings. 2011-04-07 Chris Armstrong * Source/NSFileManager.m: Fix bug creating intermediary directories. * Tests/base/NSFileManager/general.m: Add test for whether intermediary directories are created. 2011-04-06 Richard Frith-Macdonald * Tools/AGSparser.m: ignore __attribute__ in declarator to fix bug #33008 2011-04-05 Wolfgang Lux * Tests/base/coding/decoding.m: Fix bogus byte swap code for big-endian hosts. 2011-04-05 Richard Frith-Macdonald * Source/NSObject.m: Attempt to fixup C++ constructor/destructor handling to work for all setups. 2011-04-04 Richard Frith-Macdonald * Source/NSTimeZone.m: on mingw release self and return nil if initialiser can't find named timezone. 2011-04-04 Richard Frith-Macdonald * Source/NSBundle.m: ([+initialize]) change to use 'right' path handling so that our core paths are established correctly even if an app has set the wrong path handling mode for the currenty platform. * Tests/base/NSURL/basic.m: * Tests/base/NSString/test02.m: Fix path portability bugs in tests. 2011-04-03 Richard Frith-Macdonald * Source/NSThread.m: fix leak spotted by Fred. 2011-04-03 Sebastian Reitenbach * Source/GNUmakefile: * Source/NSObject.m: * Source/NSTask.m: Tweaks for OpenBSD build 2011-04-03 Richard Frith-Macdonald * Source/unix/GSRunLoopCtxt.m: * Source/win32/GSRunLoopCtxt.m: Fix pointer ownership issue in callbacks in GC environment so we let the garbage collector handle watchers rather than trying to free them explicitly when we shouldn't. 2011-04-03 Richard Frith-Macdonald * Source/NSObject.m: Fix problem with finalization of proxies and remove obsolete runtime call to see if a class respons to selector. 2011-03-31 Riccardo Mottola * Source/ObjectiveC2/Makefile.preamble Add directory of the local headers. 2011-03-31 Richard Frith-Macdonald * Source/Additions/unicode/gsm0338.h: Fix error mapping capital C-cedilla. 2011-03-29 Richard Frith-Macdonald * Headers/GNUstepBase/GSUnion.h: Remove problematic types. * Source/unix/Makefile.preamble: Remove unused include directory * Source/win32/Makefile.preamble: ditto * Source/ObjectiveC2/Makefile.preamble: ditto * Source/Additions/Makefile.preamble: ditto * Source/Additions/Makefile.postamble: link to extra headers for apple so we can build the additons library on a pure apple system again. 2011-03-29 Richard Frith-Macdonald * Headers/GNUstepBase/GSIMap.h: * Headers/GNUstepBase/GSUnion.h: * Source/GSAttributedString.m: * Source/NSArchiver.m: * Source/NSConnection.m: * Source/NSKeyedArchiver.m: * Source/NSNotificationCenter.m: * Source/NSPortCoder.m: * Source/NSSerializer.m: Fixes for problem spotted by David Chisnall ... on a 64bit system where the size of an integer is not the same as the size of a pointer the union holding map keys and values will have undefined content if we assign an integer to it and then use it as a pointer! So, we change to use the .nsu accessor for a pointer sized integer throughout, and we remove all the odd sized union members. 2011-03-28 Riccardo Mottola * Source/NSPathUtilities.m: safer and more portable pointer access * Headers/Foundation/NSNetServices.h Remove forward protocol declarations as they break gcc 2.95. 2011-03-24 Richard Frith-Macdonald * Source/NSAutoreleasePool.m: Clarify/add to comments about linked list operation and remove redundant/useless line of code. 2011-03-23 Fred Kiefer * Source/NSNumberFormatter.m (-stringForObjectValue:): Swapped a few lines of fraction handling code to get the test suite to pass. 2011-03-22 Wolfgang Lux * Source/NSObject.m (-methodSignatureForSelector:): Get method right again in case the method is called on a class object and the old runtime is used. 2011-03-21 Riccardo Mottola * Tests/base/NSNumberFormatter/basic.m: Added new test. 2011-03-18 Nicola Pero * Documentation/GNUmakefile (CODING-STANDARDS_TEXI_FILES, CODING-STANDARDS_DOC_INSTALL_DIR, CODING-STANDARDS_TEXT_MAIN): Removed. (DOCUMENT_TEXT_NAME, TOP_DOC_FILES): Fixed names of files to generate; for example, INSTALL instead of install. 2011-03-18 Riccardo Mottola * Source/NSSortDescriptor.m: Use Cocoa values for the coding keys. 2011-03-18 Richard Frith-Macdonald * Source/Additions/GSObjCRuntime.m: Use old API to work around bug in current sel_registerTypedName(). * Source/GSFFIInvocation.m: Use sel_getTypedName() to safely get a typed selector. 2011-03-17 Wolfgang Lux * Source/NSProcessInfo.m (_gnu_process_args): Use C runtime system functions to access command line arguments and the environment under Darwin/Mac OS X. * configure.ac: Add special case to disable fake-main by default on Darwin/OS X. * configure: Regenerated. 2011-03-17 15:02 David Chisnall * Source/NSObject.m: Correctly call C++ constructors / destructors for C++ 'objects' in ObjC++ ivars. 2011-03-16 Richard Frith-Macdonald * NSTimeZones/NSTimeZones.tar: regenerated wityh latest zone info. * Tests/base/NSCalendarDate: Updated to use standardised locale 2011-03-16 Richard Frith-Macdonald * Source/NSThread.m: Make +initialize thread safety warning optional (disabled using GSSilenceInitializeWarning user default) and more informative. 2011-03-15 Richard Frith-Macdonald * Source/NSNumberFormatter.m: Padding for fractional part comes at the start rather than at the end. 2011-03-14 Stefan Bidigaray * Source/NSNumberFormatter.m (-getObjectValue:forString:errorDescription:): Add implementation. 2011-03-14 Stefan Bidigaray * Source/NSNumberFormatter.m (-getObjectValue:forString:range:error:): Added implementation. * Headers/NSNumberFormatter.h: Fixed a couple of typos. 2011-03-14 Nicola Pero * Resources/GNUmakefile (base-resources_RESOURCE_FILES_INSTALL_DIR): Removed. 2011-03-13 Richard Frith-Macdonald * configure.ac: * configure: * Headers/Additions/GNUstepBase: * Headers/Additions/GNUstepBase/Additions.h: * Headers/Additions/GNUstepBase/config.h.in: * Headers/Additions/GNUstepBase/.cvsignore: * Headers/Additions/GNUstepBase/CXXException.h: * Headers/Additions/GNUstepBase/DistributedObjects.h: * Headers/Additions/GNUstepBase/GCObject.h: * Headers/Additions/GNUstepBase/GNUstep.h: * Headers/Additions/GNUstepBase/GSBlocks.h: * Headers/Additions/GNUstepBase/GSConfig.h.in: * Headers/Additions/GNUstepBase/GSFileHandle.h: * Headers/Additions/GNUstepBase/GSFunctions.h: * Headers/Additions/GNUstepBase/GSIArray.h: * Headers/Additions/GNUstepBase/GSIMap.h: * Headers/Additions/GNUstepBase/GSLocale.h: * Headers/Additions/GNUstepBase/GSLock.h: * Headers/Additions/GNUstepBase/GSMime.h: * Headers/Additions/GNUstepBase/GSObjCRuntime.h: * Headers/Additions/GNUstepBase/GSUnion.h: * Headers/Additions/GNUstepBase/GSVersionMacros.h: * Headers/Additions/GNUstepBase/GSXML.h: * Headers/Additions/GNUstepBase/NSArray+GNUstepBase.h: * Headers/Additions/GNUstepBase/NSAttributedString+GNUstepBase.h: * Headers/Additions/GNUstepBase/NSBundle+GNUstepBase.h: * Headers/Additions/GNUstepBase/NSCalendarDate+GNUstepBase.h: * Headers/Additions/GNUstepBase/NSData+GNUstepBase.h: * Headers/Additions/GNUstepBase/NSDebug+GNUstepBase.h: * Headers/Additions/GNUstepBase/NSFileHandle+GNUstepBase.h: * Headers/Additions/GNUstepBase/NSLock+GNUstepBase.h: * Headers/Additions/GNUstepBase/NSMutableString+GNUstepBase.h: * Headers/Additions/GNUstepBase/NSNetServices+GNUstepBase.h: * Headers/Additions/GNUstepBase/NSNumber+GNUstepBase.h: * Headers/Additions/GNUstepBase/NSObject+GNUstepBase.h: * Headers/Additions/GNUstepBase/NSProcessInfo+GNUstepBase.h: * Headers/Additions/GNUstepBase/NSStream+GNUstepBase.h: * Headers/Additions/GNUstepBase/NSString+GNUstepBase.h: * Headers/Additions/GNUstepBase/NSTask+GNUstepBase.h: * Headers/Additions/GNUstepBase/NSThread+GNUstepBase.h: * Headers/Additions/GNUstepBase/NSURL+GNUstepBase.h: * Headers/Additions/GNUstepBase/preface.h.in: * Headers/Additions/GNUstepBase/Unicode.h: * Headers/GNUstepBase: * Headers/GNUstepBase/config.h.in: * Headers/ObjectiveC2: * Headers/ObjectiveC2/Availability.h: * Headers/ObjectiveC2/blocks_runtime.h: * Headers/ObjectiveC2/capabilities.h: * Headers/ObjectiveC2/runtime.h: * Makefile.postamble: * Source/DocMakefile: * Source/GNUmakefile: * Source/Makefile.postamble: * Source/Makefile.preamble: * Source/ObjectiveC2/Availability.h: * Source/ObjectiveC2/blocks_runtime.h: * Source/ObjectiveC2/capabilities.h: * Source/ObjectiveC2/caps.c: * Source/ObjectiveC2/GNUmakefile: * Source/ObjectiveC2/NSBlocks.m: * Source/ObjectiveC2/runtime.h: * SSL/Makefile.preamble: * Tests/GNUmakefile: * Tools/Makefile.preamble: Simplify header layout. 2011-03-13 Richard Frith-Macdonald * Source/CXXException.m: fix error in include * Tests/GNUmakefile: add info for testing local copy of library 2011-03-13 Richard Frith-Macdonald * configure.ac: * configure: * config.mak.in: * Source/GNUmakefile: * Headers/Additions/GNUstepBase/config.h.in: Add config check for blocks support. * Source/NSObject.m: * Source/ObjectiveC2/blocks_runtime.m: Fixups for mingw 2011-03-12 Stefan Bidigaray * Source/NSNumberFormatter.m: Cache property values and reset them along with the formatter. * Source/NSLocale.m: Add 2 missing unlocks. 2011-03-11 Richard Frith-Macdonald * Source/GSBlocks.m: Added header * Headers/Additions/GNUstepBase/GSBlocks.h: Added header * Headers/Foundation/NSRegularExpression.h: Added header Added missing copyright headers etc. 2011-03-09 Richard Frith-Macdonald * Source/NSUserDefaults.m: Fix bug in resetting ... was ending up with an immutable dictionary for the registration domain. * Source/NSObject.m: fix references to isa. * Source/NSPropertyList.m: Fix unused increments. * Source/NSRunLoop.m: Remove unused code. * Source/NSSocketPort.m: Remove unused code. * Source/NSSocketPortNameServer.m: Remove unused code. * Source/NSTimeZone.m: Fix unused increment. * Source/NSUnarchiver.m: Fix unused assignment. 2011-03-08 Richard Frith-Macdonald * Source/GSAttributedString.m: remove unused assignment * Source/GSFormat.m: remove unused increments * Source/GSHTTPAuthentication.m: remove unused assignment, fix possible use of nil as a dictionary key. * Source/GSHTTPURLHandle.m: remove unused assignment, check length. * Source/GSSocketStream.m: remove unused assignments * Source/GSString.m: remove unused assignments * Source/NSAttributedString.m: (-description) fix leak * Source/NSAutoreleasePool.m: tweak for clang static analyser * Source/NSBundle.m: fix memory leak * Source/NSCachedURLResponse.m: fix error in -copy * Source/NSCalendarDate.m: remove unused increments. * Source/NSDate.m: fix parsing string with ordering too long * Source/NSHTTPCookie.m: remove unused assignments * Source/GSMime.m: fix unused assignments * Source/NSInvocation.m: remove unused code * Source/unix/NSStream.m: remove unused ivar * Tools/gdomap.c: remove unused code 2011-03-08 Richard Frith-Macdonald * Source/GSInternal.h: * Source/NSDateFormatter.m: * Source/NSNumberFormatter.m: Fix for object copying in non-fragile-ivar build spotted by Chris Armstrong. 2011-03-06 Richard Frith-Macdonald * Source/Additions/GSObjCRuntime.m: * Source/Additions/GSXML.m: * Source/Additions/NSData+GNUstepBase.m: * Source/Additions/NSError+GNUstepBase.m: * Source/Additions/Unicode.m: * Source/dld-load.h: * Source/GSFormat.m: * Source/GSMDNSNetServices.m: * Source/GSSocketStream.m: * Source/GSValue.m: * Source/NSArchiver.m: * Source/NSCalendarDate.m: * Source/NSData.m: * Source/NSDebug.m: * Source/NSFileManager.m: * Source/NSHost.m: * Source/NSInvocation.m: * Source/NSKeyValueCoding.m: * Source/NSMessagePort.m: * Source/NSMessagePortNameServer.m: * Source/NSMethodSignature.m: * Source/NSObject.m: * Source/NSPathUtilities.m: * Source/NSPortCoder.m: * Source/NSProcessInfo.m: * Source/NSString.m: * Source/NSTask.m: * Source/NSTimeZone.m: * Source/NSUnarchiver.m: * Source/NSURL.m: * Tools/cvtenc.m: * Tools/defaults.m: * Tools/locale_alias.m: Avoid strcpy and strcat to get rid if some bsd warnings. 2011-03-06 Richard Frith-Macdonald * config/config.initialize.m: Correct formatting. Increase time allowed for threads to do their job, to minimise the chance of a heavily loaded machine giving a wrong result because threads don't get scheduled in time. * configure.ac: check for stck return address extraction * configure: regenerate * Headers/Additions/GNUstepBase/config.h.in: regenerate * Source/NSDebug.m: use function to get return address. 2011-03-06 Thomas Gamper * config/config.initialize.m: add missing include to fix build. Use correct thread handles, adapt sleep times to worst case. Remove C99-ism. 2011-03-06 Richard Frith-Macdonald * Source/NSThread.m: remove obsolete call to objc_set_thread_callback(). * Source/NSDebug.m: Try to improve getting return addresses from stack. 2011-03-05 Richard Frith-Macdonald * Source/GSInternal.h: * Source/NSDateFormatter.m: * Source/NSNumberFormatter.m: * Headers/Foundation/NSPortCoder.h: * Headers/Foundation/NSCache.h: * Headers/Foundation/NSSpellServer.h: * Headers/Foundation/NSDecimalNumber.h: * Headers/Foundation/NSBundle.h: * Headers/Foundation/NSTimer.h: * Headers/Foundation/NSScanner.h: * Headers/Foundation/NSDistributedNotificationCenter.h: * Headers/Foundation/NSComparisonPredicate.h: * Headers/Foundation/NSUndoManager.h: * Headers/Foundation/NSDateFormatter.h: * Headers/Foundation/NSAutoreleasePool.h: * Headers/Foundation/NSUserDefaults.h: * Headers/Foundation/NSXMLNode.h: * Headers/Foundation/NSThread.h: * Headers/Foundation/NSHost.h: * Headers/Foundation/NSRegularExpression.h: * Headers/Foundation/NSKeyedArchiver.h: * Headers/Foundation/NSProtocolChecker.h: * Headers/Foundation/NSError.h: * Headers/Foundation/NSPortMessage.h: * Headers/Foundation/NSFileHandle.h: * Headers/Foundation/NSDistributedLock.h: * Headers/Foundation/NSPort.h: * Headers/Foundation/NSSortDescriptor.h: * Headers/Foundation/NSLocale.h: * Headers/Foundation/NSTask.h: * Headers/Foundation/NSArchiver.h: * Headers/Foundation/NSInvocation.h: * Headers/Foundation/NSFileManager.h: * Headers/Foundation/NSNumberFormatter.h: * Headers/Foundation/NSPortNameServer.h: * Headers/Foundation/NSXMLParser.h: * Headers/Foundation/NSIndexPath.h: * Headers/Additions/GNUstepBase/GSMime.h: Tweaks for running in a garbage collecting environment. 2011-03-05 Richard Frith-Macdonald * Source/NSBundle.m: AbsolutePathOfExecutable() attempt to fix this to return a fully standardised path without symbolic links. * Source/NSFileManager.m: * Headers/Foundation/NSFileManager.h: Rudimentary implementation of a couple of new methods. 2011-03-05 Tom Davie * Source/NSSet.m: * Headers/Foundation/NSSet.h: Add block enumeration. 2011-03-05 Richard Frith-Macdonald * Source/NSUserDefaults.m: Small optimisation suggested by Fred. * config/config.initialize.m: Test for working +initialize * configure.ac: Use test for +initialize thread safety * Headers/Additions/GNUstepBase/config.h.in: regenerate * configure: regenerate * Source/NSThread.m: Log warning when going multithreaded without a reliable runtime. 2011-03-05 Richard Frith-Macdonald * Source/NSNumberFormatter.m: Make error text compatible with OSX * Source/NSSpellServer.m: Use NSLanguages user default * Source/NSBundle.m: Use NSLanguages user default * Source/NSUserDefaults.m: Revert recent attempt to avoid deadlocks (broke thread-safety). Rewrite shared defaults initialisation and user language management to break the complicated interrelationshp between methods which made the initialisation fragile and incomprehensible. Language information derived from operating system or environment variables (rather than the defaults database) is now stored in a new volatile domain. The +userLanguages method just returns the NSLanguages default, and +setUserLanguages: now sets NSLanguages in the new volatile domain. Simplify setup of shared user defaults to avoid deadlocks. 2011-03-04 Richard Frith-Macdonald * Source/NSOperation.m: retain operation while finishing so that it doesn't get deallocated too soon (when the queue removes it). 2011-03-04 Richard Frith-Macdonald * Source/NSNumberFormatter.m: Fix -setAllowsFloats to only operate in input strings. 2011-03-03 Richard Frith-Macdonald * Source/NSKeyValueObserving.m: Fix possible thread race condition. * Source/ObjectiveC2/runtime.c: Fix bogus warning messages. 2011-03-03 Richard Frith-Macdonald * Source/NSOperation.m: re-introduce per-queue thread pool. 2011-03-03 Richard Frith-Macdonald * Source/NSOperation.m: reorganise and simplify code, removing the pool of threads for handling operations (need to re-add this at a later point, but probably as a separate class) ... implement support for 'concurrent' operations (ones which manage their own executions rather than running in a thread provided by the queue. 2011-03-03 Richard Frith-Macdonald * Source/Additions/Unicode.m: Review memory management ... fix possible free of non-heap memory. 2011-03-02 Riccardo Mottola * base/NSNumberFormatter/basic.m: Add test for checking leading zeroes in fractional part. 2011-03-02 Richard Frith-Macdonald * Source/NSObject.m: ([-isMemberOfClass:]) test the class returned by the -class method rather than using the runtime to get the actual class pointer ... fixes for when one class is pretending to be another (key value observing). 2011-03-01 Richard Frith-Macdonald * Source/NSKeyValueObserving.m: Retain object while sending notifications so we don't get deallocated during the process. 2011-03-01 Niels Grewe * Source/GSNetServices.h * Headers/Additions/GNUstepBase/NSNetServices+GNUstepBase.h: Declare a protocol for GNUstep specific delegate methods in NSNetServices. 2011-02-28 Richard Frith-Macdonald * Source/NSAutoreleasePool.m: Implement dummy version for use with garbage collecting runtime. 2011-02-28 Richard Frith-Macdonald * Source/NSTimeZone.m: * Source/NSPortCoder.m: * Source/NSBundle.m: * Source/NSPropertyList.m: * Source/NSDistributedNotificationCenter.m: * Source/NSProcessInfo.m: * Source/NSRunLoop.m: * Source/NSOperation.m: * Source/NSUserDefaults.m: * Source/GSArray.m: * Source/NSMessagePortNameServer.m: * Source/NSKeyedArchiver.m: * Source/NSDebug.m: * Source/NSPort.m: * Source/NSMessagePort.m: * Source/win32/NSMessagePortNameServer.m: * Source/NSFileManager.m: * Source/NSException.m: * Source/NSString.m: * Source/Additions/NSData+GNUstepBase.m: * Source/Additions/GSMime.m: * Source/Additions/NSCalendarDate+GNUstepBase.m: * Source/Additions/GSXML.m: * Source/Additions/GSObjCRuntime.m: * Source/GSSet.m: * Source/NSConnection.m: * Source/NSThread.m: * Source/GSeq.h: * Source/NSLog.m: * Source/NSTask.m: Tweaks to avoid compiler warnings in garbage collecting environment. 2011-02-27 Richard Frith-Macdonald * Tests/GNUmakefile: Use gnustep-make to supply targets. 2011-02-27 Richard Frith-Macdonald * Source/GSFFCallInvocation.m: * Source/ObjectiveC2/runtime.c: * Source/ObjectiveC2/runtime.h: * Source/Additions/GSObjCRuntime.m: Avoid messy runtime differences by using old runtime api for typed selector features not in the Apple runtime. 2011-02-27 Banlu Kemiyatorn * Source/NSOperation.m: Fix error checking condition for dependencies. 2011-02-27 Richard Frith-Macdonald * configure.ac: Look for gc.h in gc subdirectory * configure: regenerate * Headers/Additions/GNUstepBase/config.h.in: regenerate * Source/GNUmakefile: Don't attempt to build GSBlocks.m until it works without causing link failures. * Source/NSPortCoder.m: * Source/NSKeyedArchiver.m: * Source/NSGarbageCollector.m: * Source/NSZone.m: * Source/GSDictionary.m: * Source/GSCountedSet.m: * Source/NSNotificationCenter.m: * Source/GSAttributedString.m: * Source/NSObject.m: * Source/NSConcreteMapTable.m: * Source/Additions/GSMime.m: * Source/Additions/GSObjCRuntime.m: * Source/GSSet.m: * Source/NSConnection.m: * Source/NSThread.m: * Source/NSConcreteHashTable.m: Modify location of gc.h header. 2011-02-27 Richard Frith-Macdonald * Source/ObjectiveC2/runtime.c: * Headers/Additions/GNUstepBase/preface.h.in: * Headers/Additions/GNUstepBase/GSObjCRuntime.h: Remove last vestiges of runtime specific memory allocation apart from obsolete macros (marked as deprecated). 2011-02-26 Richard Frith-Macdonald * Source/NSDecimal.m: Fix NaN comparison in GSDecimalCompare() * Source/NSNumber.m: Better match OSX for double comparison. 2011-02-24 Richard Frith-Macdonald * Source/NSNumber.m: Fix error in float comparison. 2011-02-24 Niels Grewe * Source/NSUserDefaults.m * Source/NSKeyValueObserving.m: Fix typos. 2011-02-23 Richard Frith-Macdonald * Source/NSCalendarDate.m: * Source/NSArray.m: * Source/NSDebug.m: * Source/NSCalendar.m: * Source/NSURLResponse.m: * Source/NSObject.m: * Source/NSDecimalNumber.m: * Source/Additions/GSMime.m: * Source/NSDateFormatter.m: * Source/NSDate.m: * Source/NSDictionary.m: * Source/NSSet.m: * Headers/Foundation/NSCalendarDate.h: * Headers/Foundation/NSDecimalNumber.h: * Headers/Foundation/NSDate.h: * Headers/Foundation/NSArray.h: * Headers/Foundation/NSDictionary.h: * Headers/Foundation/NSSet.h: Tweaks to avoid compiler warnings on mingw and to make the -descriptionWithLocale: method consistently take an id argument as it now does on OSX. 2011-02-23 Richard Frith-Macdonald * Source/GSString.m: Fix bugs in upper and lower casing of constant strings. * Source/NSTask.m: Force check of termination status when we call -isRunning. 2011-02-22 Nicola Pero * Source/GSFFIInvocation.m (gs_find_best_typed_sel): Implemented for __GNU_LIBOBJC__. Tidied up documentation. 2011-02-22 Richard Frith-Macdonald * Source/NSBundle.m: Make private executable path be an absolute path. * Source/NSDateFormatter.m: * Source/NSLocale.m: * Source/NSNumberFormatter.m: * Source/NSTimeZone.m: Remove a few bogus underscores (pointed out by David) which could potentially cause problems with compiler/linker etc. 2011-02-21 Richard Frith-Macdonald * Source/NSString.m: Modified stringByStandardizingPath and stringByDeletingLastPathComponent to better match OSX behavior. 2011-02-21 Richard Frith-Macdonald * Source/NSNumberFormatter.m: * Headers/Foundation/NSNumberFormatter.h: If we don't have ICU then the actual behavior is 10.0 style irrespective of the formatter behavior setting. 2011-02-21 11:05 David Chisnall * Source/GSFFIInvocation.m: Some changes to method type lookup when forwarding. Alway use the compiler-supplied type information if it exists - this is guaranteed to by the correct type encoding for the call frame and lets us deconstruct it correctly. We can then fail gracefully later on when trying to invoke the selector if the types in the callee don't match, rather than by reading nonsense from the stack now. When using the GNUstep runtime, use the safe mechanism for checking whether there is more than one typed selector, and only use that as a guess if it is safe to do so. With the GCC runtime, we are still stuck using the API that it is impossible to use safely (we might be better off just giving up at this point), but now we call this after -methodSignatureForSelector:, so the app developer gets a chance to do the right thing before we do the wrong thing. Also changed the assert to throw an exception if no type signature can be found. This behaviour is consistent with Mac OS X. 2011-02-20 Richard Frith-Macdonald * Source/NSMethodSignature.m: * Source/GSArray.m: * Source/NSKeyValueObserving.m: * Source/GSPrivate.h: * Source/GSDictionary.m: * Source/NSURLProtocol.m: * Source/NSURL.m: * Source/NSObject.m: * Source/NSDecimalNumber.m: * Source/Additions/GSObjCRuntime.m: * Source/Additions/GSInsensitiveDictionary.m: * Source/Additions/GSLock.m: * Source/GSSet.m: * Source/GSString.m: * Source/NSConnection.m: * Source/NSData.m: * Headers/Additions/GNUstepBase/GSObjCRuntime.h: Expose class pointer swizzling function in GSObjCRuntime. Replace direct references to 'isa' pointer with objc_getClass() and objcSetClass() calls (or occasionally calls to the -class method if it seems more appropriate). 2011-02-20 Fred Kiefer * Source/NSNumberFormatter.m (-init): Only check the formatter in the ICU case. 2011-02-20 Richard Frith-Macdonald * Source/GSFFIInvocation.m: * Source/NSCopyObject.m: * Source/NSObject.m: Replace old code directly referencing class_pointer ivar with calls to the new runtime API treating objects as opaque pointers. 2011-02-20 Richard Frith-Macdonald * Source/NSPortCoder.m: * Source/common.h: * Source/NSObject.m: * Source/NSAutoreleasePool.m: * Source/NSProxy.m: * Source/NSSerializer.m: Replace all calls to get_imp() with the new runtime API class_getMethodImplementation(). 2011-02-20 Richard Frith-Macdonald * Source/NSDistributedNotificationCenter.m: * Source/GSFFCallInvocation.m: * Source/GSFFIInvocation.m: * Source/common.h: * Source/NSConnection.m: * Source/NSData.m: Use GSObjCRuntime functions for selector types until/unless we can get a standard runtime API that handles them. 2011-02-19 Richard Frith-Macdonald * Source/NSBundle.m: * Source/NSProcessInfo.m: * Source/NSConcretePointerFunctions.m: * Source/GSFFCallInvocation.m: * Source/NSZone.m: * Source/NSCallBacks.m: * Source/win32/NSMessagePortNameServer.m: * Source/NSFileManager.m: * Source/NSURLProtocol.m: * Source/objc-load.m: * Source/NSException.m: * Source/cifframe.m: * Source/NSLog.m: * Tools/defaults.m: * Tests/base/NSInvocation/Resources/InvokeProxy.m: Remove obsolete calls to objc_malloc() in favour of NSZoneMalloc() or malloc() where using zones is not appropriate. 2011-02-19 Richard Frith-Macdonald * Source/GSFFCallInvocation.m: Updated two obsolete runtime calls * Source/common.h: Revert last change as it seemed pointless to define macros within a private header which reproduce functions we don't actually use (or want to use) within base. I think/hope that the tiny change to GSFFcallInvocation.m is all that was needed. 2011-02-19 16:02 David Chisnall * Source/common.h: Add some macros that map some libobjc functions to their runtime-specific variants. This avoids the need for ugly #ifdefs everywhere (the next commit will try to clean up some of this mess), and lets us use the _np function names everywhere to explicitly note that we are using runtime functions that are not present on OS X - apparently the new GCC runtime does not add this suffix for some reason. 2011-02-16 Richard Frith-Macdonald * Source/NSDecimalNumber.m: * Source/NSNumber.m: Quick hacks to try to get NaN comparison working. 2011-02-16 Richard Frith-Macdonald * Source/NSDateFormatter.m: * Source/NSNumberFormatter.m: Fix -initWithCoder: methods to create internal ivar storage. 2011-02-16 Richard Frith-Macdonald * Source/NSFileManager.m: * Documentation/coding-standards.texi: * Headers/Foundation/NSXMLParser.h: Documentation tweaks. 2011-02-16 Jens Ayton * Source/NSPropertyList.m: Fix to support 64bit integers when parsing an XML property list. 2011-02-16 Richard Frith-Macdonald * Tests/base: import the testsuite here * Tests/GNUmakefile: add trivial makefile to run tests 2011-02-16 Wolfgang Lux * Resources/German.lproj/Localizable.strings: Add translation for undo menu item strings. 2011-02-16 Wolfgang Lux * Source/NSDateFormatter.m (-initWithCoder:, -initWithDateFormat:): Add missing calls to super/self initialization. 2011-02-16 Richard Frith-Macdonald * Source/common.h: * Headers/Additions/GNUstepBase/GNUstep.h: Implement David's idea of allowing some generalisation of the _() macro by using a preprocessor define to set the bundle to be used to lookup localisation information. 2011-02-16 Richard Frith-Macdonald * Source/GSInternal.h: * Source/NSDateFormatter.m: * Source/NSNumberFormatter.m: * Headers/Foundation/NSPortCoder.h: * Headers/Foundation/NSCache.h: * Headers/Foundation/NSSpellServer.h: * Headers/Foundation/NSDecimalNumber.h: * Headers/Foundation/NSBundle.h: * Headers/Foundation/NSTimer.h: * Headers/Foundation/NSScanner.h: * Headers/Foundation/NSDistributedNotificationCenter.h: * Headers/Foundation/NSComparisonPredicate.h: * Headers/Foundation/NSUndoManager.h: * Headers/Foundation/NSDateFormatter.h: * Headers/Foundation/NSAutoreleasePool.h: * Headers/Foundation/NSXMLNode.h: * Headers/Foundation/NSUserDefaults.h: * Headers/Foundation/NSThread.h: * Headers/Foundation/NSHost.h: * Headers/Foundation/NSRegularExpression.h: * Headers/Foundation/NSKeyedArchiver.h: * Headers/Foundation/NSProtocolChecker.h: * Headers/Foundation/NSError.h: * Headers/Foundation/NSPortMessage.h: * Headers/Foundation/NSFileHandle.h: * Headers/Foundation/NSDistributedLock.h: * Headers/Foundation/NSPort.h: * Headers/Foundation/NSSortDescriptor.h: * Headers/Foundation/NSLocale.h: * Headers/Foundation/NSTask.h: * Headers/Foundation/NSArchiver.h: * Headers/Foundation/NSInvocation.h: * Headers/Foundation/NSFileManager.h: * Headers/Foundation/NSNumberFormatter.h: * Headers/Foundation/NSPortNameServer.h: * Headers/Foundation/NSXMLParser.h: * Headers/Foundation/NSIndexPath.h: * Headers/Additions/GNUstepBase/GSMime.h: * Headers/Additions/GNUstepBase/GSVersionMacros.h: * Headers/Additions/GNUstepBase/GSObjCRuntime.h: More work on clarifying the use of the reserved/private data pointer. Reinstate accidentally lost '@private', and add the GS_UNUSED_IVAR attribute as requested by David to avoid static analyser warnings where the reserved pointer is not actually used yet. Tidy up latest files to use GSInternal.h 2011-02-15 Richard Frith-Macdonald * Source/GSLocale.m: * Source/NSTimeZone.m: * Source/NSBundle.m: * Source/NSProcessInfo.m: * Source/NSUndoManager.m: * Source/NSFileHandle.m: * Source/NSSortDescriptor.m: * Source/NSFileManager.m: * Source/common.h: * Source/externs.m: * Source/NSException.m: * Source/NSString.m: * Source/Additions/Unicode.m: * Source/Additions/GSXML.m: * Source/NSLocale.m: * Source/NSTask.m: As suggested by Wolfgang, change the _() macro for localization when used inside base to use the base library bundle rather than the main bundle. 2011-02-14 Stefan Bidigaray * Headers/Foundation/NSDateFormatter.m: * Source/NSDateFormatter.m: Changes for ABI compatibility. * Source/NSNumberFormatter.m: Use unum_clone to copy formatter. 2011-02-14 German Arias * Resources/Spanish.lproj/Localizable.strings: Added localized strings for undo/redo. * Source/NSUndoManager.m: Added GSBaseLocalizedString() function. 2011-02-14 Richard Frith-Macdonald * Source/NSFileManager.m: * Source/GSInternal.h: * Source/DocMakefile: * Source/Additions/GSMime.m: * Source/Additions/GSObjCRuntime.m: * Source/NSConnection.m: * Source/NSDateFormatter.m: * Documentation/coding-standards.texi: * Headers/Foundation/NSBundle.h: * Headers/Foundation/NSPropertyList.h: * Headers/Foundation/NSConnection.h: * Headers/Foundation/NSObjCRuntime.h: * Headers/Foundation/NSFileHandle.h: * Headers/Additions/GNUstepBase/GSMime.h: * Tools/DocMakefile: * Tools/AGSParser.m: Documentation cleanups and fixes ... add new macros to list of symbols to ignore. Add support for @optional and @required. Add support for method attributes. 2011-02-14 Richard Frith-Macdonald * Headers/Foundation/NSPortCoder.h: * Headers/Foundation/NSCache.h: * Headers/Foundation/NSSpellServer.h: * Headers/Foundation/NSDecimalNumber.h: * Headers/Foundation/NSBundle.h: * Headers/Foundation/NSTimer.h: * Headers/Foundation/NSScanner.h: * Headers/Foundation/NSDistributedNotificationCenter.h: * Headers/Foundation/NSComparisonPredicate.h: * Headers/Foundation/NSUndoManager.h: * Headers/Foundation/NSDateFormatter.h: * Headers/Foundation/NSAutoreleasePool.h: * Headers/Foundation/NSUserDefaults.h: * Headers/Foundation/NSXMLNode.h: * Headers/Foundation/NSThread.h: * Headers/Foundation/NSHost.h: * Headers/Foundation/NSRegularExpression.h: * Headers/Foundation/NSKeyedArchiver.h: * Headers/Foundation/NSProtocolChecker.h: * Headers/Foundation/NSError.h: * Headers/Foundation/NSPortMessage.h: * Headers/Foundation/NSFileHandle.h: * Headers/Foundation/NSDistributedLock.h: * Headers/Foundation/NSPort.h: * Headers/Foundation/NSSortDescriptor.h: * Headers/Foundation/NSLocale.h: * Headers/Foundation/NSTask.h: * Headers/Foundation/NSArchiver.h: * Headers/Foundation/NSInvocation.h: * Headers/Foundation/NSFileManager.h: * Headers/Foundation/NSNumberFormatter.h: * Headers/Foundation/NSPortNameServer.h: * Headers/Foundation/NSXMLParser.h: * Headers/Foundation/NSIndexPath.h: * Headers/Additions/GNUstepBase/GSMime.h: * Headers/Additions/GNUstepBase/GSVersionMacros.h: Make the presence of the pointer for reserved/private data clearer and more explicit to try to ensure we actually remember to use it to prevent ABI breakage. * Source/NSNumberFormatter.m: Modified to store new/extra ivars via the _reserved pointer so that NSNumberFormatter can be safely subclassed by code outside the library. 2011-02-13 Stefan Bidigaray * Source/NSNumberFormatter.m: Moved 10.4+ functionality to a subclass. 2011-02-13 Richard Frith-Macdonald * Source/NSPathUtilities.m: NSFullUserName() ... use short name if no long one is available. 2011-02-13 Philippe Roussel * Source/NSPointerArray.m: replace memcpy with memmove for safety. 2011-02-13 Richard Frith-Macdonald * Source/Additions/NSObject+GNUstepBase.m: Use more runtime functions directly. Standardise exception formats. * Source/ObjectiveC2/runtime.c: Fix some cases of dereferencing null pointers. 2011-02-12 Richard Frith-Macdonald * Source/NSObject.m: Obtain NSZombie class pointer using objc_lookUpClass() to avoid the use of NSString inside the NSObject initialize method. Re-order code for safety. Add lots of comments. 2011-02-12 Richard Frith-Macdonald * Source/NSPortCoder.m: * Source/GSPrivate.h: * Source/NSNotificationCenter.m: * Source/NSConcreteMapTable.m: * Source/NSThread.m: * Source/NSSerializer.m: * Headers/Additions/GNUstepBase/GSVersionMacros.h: Update with new GS_CONSUMED macro to try to avoid static analyzer false positives. 2011-02-12 Richard Frith-Macdonald * Source/NSLocale.m: fix memory leak * Source/NSThread.m: * Source/NSNotificationCenter.m: * Source/NSPortCoder.m: * Source/NSSerializer.m: * Source/NSUserDefaults.m: * Source/GSPrivate.h: * Source/Additions/NSObject+GNUstepBase.m: Add code to try to prevent clang static analyser false warnings. 2011-02-12 Richard Frith-Macdonald * Source/GSPrivate.h: * Source/NSObject.m: * Source/Additions/NSObject+GNUstepBase.m: Remove (unused) code for cleanup at program exit. Let's think of a better way (eg runtime support to call a +atExit method). 2011-02-11 Richard Frith-Macdonald * Source/NSThread.m: Avoid some unnecessary locking. I think this completes recommitting of all the changes made with bugfixes to get them all to at least compile/link on my centos and windowsxp systems and to pass the testsuite on centos. 2011-02-11 Richard Frith-Macdonald * Source/GSPrivate.h: Fixed the new GS_BEGINITEMBUF() code ... was causing hard-to-track-down memory corruption which unfortunately didn't show up in the testsuite (or I'd not have re-comitted this code in the first place). 2_011-02-11 Richard Frith-Macdonald * Source/NSKeyValueObserving.m: Recommit Reviewed and tested. * Source/NAutoreleasePool.m: Make +initialize do nothing so that it won't interfere with anythign else when called by [NSObject+initialize] 2011-02-11 Richard Frith-Macdonald * Source/NSLocale.m: Recommit * Source/NSUnarchiver.m: Recommit I have now test these two and recommited them as working. * Source/NSPropertyList.m: Revert These was quietly modified/broken since my last commit ... reverting to the previous tested/working version. 2011-02-11 Richard Frith-Macdonald * Source/NSArray.m: Recommit fixed version * Source/GSICUString.h: Formatting fixups * Source/GSICUString.m: Recommit * Source/NSAttributedString.m: Recommit * Source/NSData.m: Recommit * Source/NSMethodSignature.m: Recommit 2011-02-11 Richard Frith-Macdonald * Source/NSPropertyList.m: Recommit with modification fixed and tested. * Source/NSOperation.m: new tweak to avoid compiler warning. * Source/GSPrivate.h: Recommit most recent version after testing. 2011-02-11 Richard Frith-Macdonald Revert everything back from boken code at 32071 to wrking code at 32051 due to loads of commits of code which have been occurring to fast for anyone to review, and either don't compile or fail the testsuite. Lets go through things checking that they at least compile with gcc and pass the testsuite before we recommit them! 2011-02-11 Richard Frith-Macdonald * Source/GSICUString.m: Fix leak spotted by static analyser. * Source/NSArray.m: Fix error in enumeration changes causing compile failure. 2011-02-11 12:06 David Chisnall * Source/GSPrivate.h: Added exception-safe version of the GS_BEGINITEMBUF() macro. As a side effect, this should silence the zero-sized VLA warnings in the static analyser. Note: This macro is currently only used on GCC 4+ and clang. It depends on __attribute__((cleanup)), which was introduced some time in the 3.x series, but I'm not sure exactly when (3.2 / 3.3 I think), so someone who cares about gcc 3.x can tweak this if they want (not sure if anyone does - I think most people use 2.95, 4.x, or clang). 2011-02-11 Richard Frith-Macdonald * Source/NSArray.m: * Source/NSString.m: * Source/NSPointerArray.m: * Source/NSAttributedString.m: * Source/Additions/GSXML.m: * Source/NSData.m: * Tools/AGSParser.m: Tweaks to try to avoid clang analyser warnings. * Source/NSPropertyList.m: Revert last change. * Source/NSObject.m: Rewrite zombie setup code to avoid crashes caused by latest change. 2011-02-11 Stefan Bidigaray * Source/NSDateFormatter.m: Avoid multiple memory copy operations. 2011-02-10 18:54 David Chisnall * trunk/config/config.joinable.m, trunk/config/objc-common.g: Don't use Object in configure tests (not present in GNUstep runtime). 2011-02-10 18:53 David Chisnall * Source/NSObject.m: Use NSClassFromString() to look up NSZombie class. This has two advantages: 1) Doesn't rely on Apple-incompatible behaviour in the GCC runtime that introduces fun heisenbugs. 2) Doesn't require constructing the dtable for NSZombie if we're not actually using it. 2011-02-10 Richard Frith-Macdonald * Source/NSSpellServer.m: Avoid compiler warning. * Source/NSPathUtilities.m: * Source/NSMessagePortNameServer.m: * Source/NSKeyValueObserving.m: * Source/NSURLProtocol.m: * Source/NSString.m: * Source/NSNumberFormatter.m: * Source/NSXMLParser.m: Fix memory leaks 2011-02-10 11:02 David Chisnall * Headers/Additions/GNUstepBase/GSMime.h, Headers/Additions/GNUstepBase/GSVersionMacros.h, Headers/Foundation/NSArchiver.h, Headers/Foundation/NSAutoreleasePool.h, Headers/Foundation/NSBundle.h, Headers/Foundation/NSCache.h, Headers/Foundation/NSComparisonPredicate.h, Headers/Foundation/NSDateFormatter.h, Headers/Foundation/NSDecimalNumber.h, Headers/Foundation/NSDistributedLock.h, Headers/Foundation/NSDistributedNotificationCenter.h, Headers/Foundation/NSError.h, Headers/Foundation/NSFileHandle.h, Headers/Foundation/NSFileManager.h, Headers/Foundation/NSHost.h, Headers/Foundation/NSIndexPath.h, Headers/Foundation/NSInvocation.h, Headers/Foundation/NSKeyedArchiver.h, Headers/Foundation/NSLocale.h, Headers/Foundation/NSNumberFormatter.h, Headers/Foundation/NSPort.h, Headers/Foundation/NSPortCoder.h, Headers/Foundation/NSPortMessage.h, Headers/Foundation/NSPortNameServer.h, Headers/Foundation/NSProtocolChecker.h, Headers/Foundation/NSRegularExpression.h, Headers/Foundation/NSScanner.h, Headers/Foundation/NSSortDescriptor.h, Headers/Foundation/NSTask.h, Headers/Foundation/NSThread.h, Headers/Foundation/NSTimer.h, Headers/Foundation/NSUndoManager.h, Headers/Foundation/NSUserDefaults.h, Headers/Foundation/NSXMLNode.h, Headers/Foundation/NSXMLParser.h: Add a GS_PADDING_IVAR macro. This defines the void *gs_unused; instance variable with __attribute__((unused)) on clang so that the static analyser only reports unused ivars that we expect to be used. This also makes it slightly easier to add the padding ivar to new classes. Note: The padding ivar has been added to NSRegularExpression. This will break the ABI for anyone subclassing NSRegularExpression, but hopefully that's no one (done before the next release, to make sure that we don't break the ABI between releases, only for people following -trunk). 2011-02-10 Richard Frith-Macdonald * Source/GSSocketStream.m: * Source/NSPropertyList.m: * Source/NSUserDefaults.m: * Source/NSException.m: * Source/NSURL.m: * Source/NSDecimalNumber.m: * Source/Additions/GSMime.m: * Source/GSFileHandle.m: * Source/NSNumberFormatter.m: * Tools/gdomap.c: * Tools/HTMLLinker.m: Fix a couple of minor/theoretical memory leaks and make other code alterations to try to avoid clang static analyser reporting some issues. * Source/GSPrivate.h: * Source/NSObject.m: * Source/Additions/NSObject+GNUstepBase.m: New code to provide a single location to cache information which should exist for the lifetime of the process, and a function to clean it up on process exit. Just a placeholder so far. 2011-02-09 Stefan Bidigaray * Source/NSTimeZone.m: ([-daylightSavingTimeOffsetForDate:]) Implement. 2011-02-09 Stefan Bidigaray * Source/NSTimeZone.m: ([-localizedName:locale:]) Implemented method. 2011-02-09 Stefan Bidigaray * configure: * configure.ac: * Headers/Additions/GNUstepBase/config.h.in: * Source/NSDateFormatter.m: ([-dateFormatFromTemplate:options:locale:]) Fix completely broken method using unicode/udatpg.h. 2011-02-07 Richard Frith-Macdonald * Source/NSLocale.m: Fix canonical identifiers to return the input string if no other value is found. Refrain from putting nil locale identifier in dictionary. Fix leak of components dictionary when returning an existing locale by id. 2011-02-04 Richard Frith-Macdonald * Source/NSConcretePointerFunctions.m: objects with weak memory should not be retained. 2011-02-03 Philippe Roussel * Source/NSPropertyList.m: Fix memory leaks. 2011-02-03 Richard Frith-Macdonald * Source/GSNetServices.h: * Source/GSMDNSNetServices.m: * Headers/Foundation/NSNetServices.h: Tweaks to get MDNS code to compile again. 2011-02-02 Stefan Bidigaray * Source/NSDateFormatter.m: ([-doesRelativeDateFormatting]) ([-setDoesRelativeDateFormatting:]) Implemented methods. 2011-02-01 Richard Frith-Macdonald * Source/NSPointerArray.m: ([-allObjects]) implement missing method. 2011-01-29 Stefan Bidigaray * Source/NSCalendar.m: Handle current calendar updates. 2011-01-29 Richard Frith-Macdonald * Source/NSUserDefaults.m: Fix bug with notifications ... was not always sending them when a domain was modified. 2011-01-29 Stefan Bidigaray * Headers/Foundation/NSLocale.h: Use GS_EXPOSE(NSLocale). * Source/NSLocale.m: ([-autoupdatingCurrentLocale]) Handle locale updates. ([-currentLocale]) Check Locale default for current user's locale. ([-preferredLanguages]) Do not add same language multiple times. 2011-01-28 Stefan Bidigaray * Source/NSNumberFormatter.m: Fixed errors found by test suite. 2011-01-27 Stefan Bidigaray * Source/NSCalendar.m: Add -isEqual:. 2011-01-27 Stefan Bidigaray * Source/NSCalendar.m: Open UCalendar before use. 2011-01-27 Stefan Bidigaray * Source/NSNumberFormatter.m: Set some sensible defaults. 2011-01-26 Stefan Bidigaray * Source/NSLocale.m: Add currency code to locale identifier, if present. * Source/NSDateFormatter.m: Fix crash on dealloc because of autoreleased object. 2011-01-26 Stefan Bidigaray * Source/NSLocale.m: Minor memory mgt fixes. 2011-01-24 Stefan Bidigaray * Source/NSNumberFormatter.m: Fixes for formatter behavior. 2011-01-24 Stefan Bidigaray * Source/NSDateFormatter.m: Check ICU presence in private function. 2011-01-23 Stefan Bidigaray * Headers/Foundation/NSDateFormatter.h: * Source/NSDateFormatter.m: Redo the calendar code. 2011-01-23 Stefan Bidigaray * Headers/Foundation/NSDateFormatter.h: * Source/NSDateFormatter.m: Add calendar. * Source/NSNumberFormatter.m: Compile again. 2011-01-23 Stefan Bidigaray * Source/NSDateFormatter.m: * Source/NSNumberFormatter.m: * Source/NSCalendar.m: Remove use of OS_API_VERSION() in .m files. 2011-01-23 15:42 David Chisnall * Source/NSNumberFormatter.m: Some small fixes in NSNumberFormatter. Mostly stop using == to compare C strings. 2011-01-23 Stefan Bidigaray * Source/NSDateFormatter.m: Initialize UDateFormat before using it. * Source/NSCalendar.m: Implement -components:fromDate:. 2011-01-23 Stefan Bidigaray * Source/NSDateFormatter.m: Implemented a few more methods. 2011-01-22 Stefan Bidigaray * configure: * configure.ac: * Headers/Additions/GNUstepBase/config.h.in: Added check for unicode/udat.h. * Headers/Foundation/NSDateFormatter.h: * Source/NSDateFormatter.m: Implemented a few methods. 2011-01-22 Stefan Bidigaray * Headers/Foundation/NSDateFormatter.h: * Source/NSDateFormatter.m: Added stub for 10.4 and above methods. 2011-01-21 Richard Frith-Macdonald * Source/NSPathUtilities.m: Add support for GlobalDefaults directory * Source/NSUserDefaults.m: Document GlobalDefaults directory * Documentation/Base.gsdoc: Document GlobalDefaults directory Implement suggestion by David Chisnall. New GlobalDefaults directory support ... if there are .plist files in this subdirectory, merge them in before merging in the contents of the GlobalDefaults.plist file. Deprecate use of the old GNUSTEP_EXTRA config file entry. 2011-01-18 Richard Frith-Macdonald * Source/NSPropertyList.m: Fix to cope with NSXMLParser reporting whitespace as character data. 2011-01-18 Richard Frith-Macdonald * Source/NSPropertyList.m: For OSX compatibility we now quote strings in property lists of they contain non-alphanumerics. We also warn when we parse a dictionary with a missing semicolon at the end. * Source/NSXMLParser.m: For OSX compatibility we report all character data as characters and never as ignorable whitespace, though this seems perverse. Implement insertion of default attribute values into elements if we have parsed an !ATTLIST which defines them. 2011-01-17 Richard Frith-Macdonald * Source/GSFormat.m: Print '(null)' rather than '(nil)' for a nil object as this seems to be what OSX does now. * Source/NSXMLParser.m: Implement partial support for declarations. 2011-01-12 Stefan Bidigaray * Source/NSNumberFormatter.m: Implemented more methods. ([-stringForObjectValue:]): Add code for NSNumberFormatterBehavior10_4. 2011-01-11 Stefan Bidigaray * Source/NSLocale.m: Removed NSLog used for debugging. * Source/NSNumberFormatter.m: Fixed decimal separator behavior for OS X > 10.4. 2011-01-11 Richard Frith-Macdonald * Source/NSString.m: ([-stringByStandardizingPath]) Fix bug when dealing with three or more separators at the start of a path ... should condense them to a single separator. Thanks to Robert Slover for pointing this out. 2011-01-10 Richard Frith-Macdonald * configure: regenerate * Headers/Additions/GNUstepBase/config.h.in: regenerate 2011-01-09 Stefan Bidigaray * Source/NSNumberFormatter.m: Implemented a few more methods. * Source/NSLocale.m: Added code requiring NSNumberFormatter code. 2011-01-09 Stefan Bidigaray * Headers/Additions/GNUstepBase/config.h.in: * Headers/Foundation/NSNumberFormatter.h: * Source/NSNumberFormatter.m: Started adding code for new methods. 2011-01-08 Stefan Bidigaray * Source/NSLocale.m: Fixed a few bugs exposed by testsuite. 2011-01-07 Stefan Bidigaray * configure: * configure.ac: Added check for unicode/unum.h. * Headers/Foundation/NSNumberFormatter.h: * Source/NSNumberFormatter.m: Added stub for 10.4+ methods. 2011-01-07 Richard Frith-Macdonald * Source/NSObject.m: Make zombie log message match current OSX. * Source/NSURL.m: Fix -resourceSpecifier by removing incorrect special handling for file URLs. * Source/NSXMLParser.m: Maketolerant of whitespace around the '=' in an attribute. Fix check for xml header being at start of doc. 2011-01-06 Fred Kiefer * Source/NSObject.m (GSAtomicIncrement, GSAtomicDecrement): MIPS64 specific adjustment of atomic functions for mips. Patch by Sebastian Reitenbach . 2011-01-01 Stefan Bidigaray * Headers/Foundation/NSCalendar.h: * Source/NSCalendar.m: Added NSCoding and NSCopying. * Source/NSLocale.m: Implement -isEqual: and do a better job of copying. 2011-01-01 Stefan Bidigaray * Headers/Foundation/NSCalendar.h: * Source/NSLocale.m: Minor fixes. * Source/NSCalendar.m: Implemented +currentCalendar. 2011-01-01 Stefan Bidigaray * Source/NSLocale.m: Fixed typos found by testsuite. 2010-12-31 Stefan Bidigaray * Source/NSCalendar.m: Implemented -dateByAddingComponents:toDate:options: and -dateFromComponents:. 2010-12-31 Stefan Bidigaray * Headers/Foundation/NSCalendar.h: * Source/NSCalendar.m: Added iOS 4.0 and later methods to NSDateComponents. 2010-12-31 Stefan Bidigaray * Resources/GNUmakefile: * Resources/Languages/Locale.canonical: Added mapping to go from long locale identifiers to the shorter identifiers used by ICU. * Source/NSLocale.m: Implemented -canonical* and -preferredLanaguges methods. 2010-12-31 14:03 David Chisnall * Headers/Foundation/NSBundle.h: Add __attribute__ ((format_arg)) to [NSBundle -localizedStringForKey:value:table:]. This informs the compiler that the output can be used anywhere that the first argument can be used, and should silence all of the non-constant format string warnings that we get anywhere that _(@"foo") or similar is used. 2010-12-27 Nicola Pero * Source/GSString.m ([GSCString -encodeWithCoder:]): Explicitly encode NSStringEncoding variables as 'int' so that we can read/write archives across compiler versions. "enum _NSStringEncoding" is an unsigned int, but GCC <= 4.5 incorrectly encodes all enums, regardless of the actual integer type they represent, as a signed int. ([GSMutableString -encodeWithCoder:]): Same change. ([GSUnicodeString -encodeWithCoder:]): Same change. * Source/NSString.m ([NSString -encodeWithCoder:]): Same change. ([NSString -initWithCoder:]): Same change. 2010-12-27 Richard Frith-Macdonald * Source/GSPrivate.h: * Source/NSCalendarDate.m: * Source/NSDate.m: * Source/NSProcessInfo.m: * Source/NSRunLoop.m: Change GSTimeNow() to GSPrivateTimeNow() to indicate scope of function. * Source/NSThread.m: Remove duplicate declaration of obbjc thread callback. * Source/NSXMLParser.m: Try to duplicate OSX behavior in handling start of document. 2010-12-26 Richard Frith-Macdonald * Source/NSString.m: ([-stringByReplacingCharactersInRange:withString:]) fix memory leak. ([-stringByReplacingOccurrencesOfString:withString:options:range:]) ditto. 2010-12-25 Quentin Mathe Improved autogsdoc to output symbols such as methods in their header declaration order along the gsdoc files. Useful for third-party tools that want to generate final documentation from the GSDoc ouput and how the original headers were organized. * Tools/autogsdoc.m: Added OrderedSymbolDeclarations.plist file output and cleaning. * Tools/AGSParser.h: * Tools/AGSParser.m: Added orderedSymbolDecls ivar. (-addOrderedSymbolDeclaration:toUnit:, -orderedSymbolDeclarationsByUnit): Added. (-parseMethodsAsDeclarations:): Modified to call -addOrderedSymbolDeclaration:toUnit:. 2010-12-25 Quentin Mathe * Headers/Foundation/NSString.h: * Source/NSString.m: Added -stringByReplacingCharactersInRange:withString: (Mac OS 10.5 method). 2010-12-25 12:13-EST Gregory John Casamento * Tools/pl2link.m: Changes to better integrate with the GNOME desktop. Removed dummy version number. Added code to find the correct locations of the application and it's icon. 2010-12-24 Nicola Pero * Headers/Foundation/NSPropertList.h: Forward-declare the NSError class if appropriate. 2010-12-24 Nicola Pero * Source/NSObject.m ([+conformsToProtocol:]): Use the new code only if __GNU_LIBOBJC__ is defined. * Source/Additions/GSObjCRuntime.m (GSTypesFromSelector): Updated usage of Modern typed selector API with __GNU_LIBOBJC__. * Source/GSFFIInvocation.m (gs_find_best_typed_sel): Same. (gs_objc_msg_forward2): Same. (GSFFIInvocationCallback): Same. 2010-12-24 Nicola Pero * Source/NSObject.m ([+conformsToProtocol:]): Fixed to iterate over superclasses. Just calling class_conformsToProtcol() is not enough as class_conformsToProtocol() does not iterate over superclasses. ([-conformsToProtocol:]): Updated. 2010-12-23 Nicola Pero * configure.ac: Check for objc_setUncaughtExceptionHandler(). * configure: Regenerated. * Headers/Additions/GNUstepBase/config.h.in: Regenerated. * config/config..setUncaughtExceptionHandler.m: New. * Source/Additions/GSObjCRuntime.m (GSTypesFromSelector): Use sel_getType, not sel_getType_np, if __GNU_LIBOBJC__. (GSSelectorFromNameAndTypes): Use sel_registerTypedName, not sel_registerTypedName_np, if __GNU_LIBOBJC__. * Source/objc-load.h: Do not include objc-api.h. * Source/NSBundle.m (_bundle_load_callback): Use the new API to iterate over classes when __GNU_LIBOBJC__. * Source/NSConnection.m ([NSConnection -forwardInvocation:forProxy:]): Use sel_registerTypedName, not sel_registerTypedName_np, if __GNU_LIBOBJC__. * Source/NSData.m ([NSData -deserializeDataAt:ofObjCType:atCursor:context:]): Use sel_registerTypedName, not sel_registerTypedName_np, if __GNU_LIBOBJC__. Use sel_registerName, not sel_registerTypedName_np, if the type is 0. ([NSDataStatic -deserializeDataAt:ofObjCType:atCursor:context:]): Use sel_registerTypedName, not sel_registerTypedName_np, if __GNU_LIBOBJC__. * Source/NSDistributedNotificationCenter.m ([NSDistributedNotificationCenter -postNotificationName:object:userInfo:selector:to:]): Use sel_registerTypedName, not sel_registerTypedName_np, if __GNU_LIBOBJC__. * Source/NSException.m: Include if HAVE_SET_UNCAUGHT_EXCEPTION_HANDLER. ([NSException +initialize]): Use objc_setUncaughtExceptionHandler if HAVE_SET_UNCAUGHT_EXCEPTION_HANDLER. * Source/NSMethodSignature.m: Do not include objc/encoding.h when __GNU_LIBOBJC__. * Source/NSObject.m ([NSObject -methodSignatureForSelector:]): Use method_getTypeEncoding instead of accessing directly the 'types' field. ([NSObject +poseAsClass:]): Always throw an exception since class_pose_as is now deprecated or unavailable in most Objective-C runtimes. If you need pose-as, and your runtime supports it, call class_pose_as directly. ([NSObject -error:]): Use vprintf and abort directly instead of trying to call objc_verror. * Source/NSThread.m: Define objc_thread_callback if we are later using it. * Source/objc-load.m: Never include objc-api.h or objc-list.h. (GSPrivateLoadModule): Removed 'dynamic_handles' variable, no longer used. Do not call __objc_resolve_class_links if __GNU_LIBOBJC__. * Source/GSFFIInvocation.m: Include when __GNU_LIBOBJC__. (gs_find_best_typed_sel): Use sel_getType instead of sel_getType_np if __GNU_LIBOBJC__. (gs_objc_msg_forward2): Same change. (GSFFIInvocationCallback): Same change. * Source/NSValue.m ([NSValue +valueFromString:]): Added missing return for NSRange values. 2010-12-22 Nicola Pero * Headers/Additions/GNUstepBase/preface.h.in: When using the new GNU Objective-C Runtime library, include instead of and . * Headers/Additions/GNUstepBase/GSObjCRuntime.h: When OBJC2RUNTIME, do not include . * Headers/Additions/GNUstepBase/GSVersionMacros.h: Added FIXME. 2010-12-22 Nicola Pero * config/objc-common.g: Include the correct headers to use the new API if using the GNU Objective-C Runtime library from GCC 4.6. 2010-12-22 Nicola Pero * configure.ac (objc_thread_add): Check removed. * configure: Regenerated. * Headers/Additions/GNUstepBase/config.h.in: Regenerated. * Source/NSThread.m (objc_thread_add): Unused static function removed. 2010-12-22 Adam Fedor * Headers/Foundation/NSCalendar.h: Add NSCopying protocol * Source/NSCalendar.m: Retain ivar. Add copyWithZone: * Source/NSURL.m (-resourceSpecifier): Separate behavior for file scheme vs other schemes. 2010-12-17 Richard Frith-Macdonald * Source/NSCalendar.m: Fix to build with ICU 4.0 * configure.ac: Permit ICU version as old as 4.0 * configure: regenerate 2010-12-16 Stefan Bidigaray * Source/NSCalendar.m: Added code for -maximumRangeOfUnit: and -minimumRangeofUnit:. 2010-12-16 Richard Frith-Macdonald * Source/NSRegularExpression.m: Move towards coding standards compliance * Source/GSICUString.m: ditto 2010-12-16 Richard Frith-Macdonald * configure.ac: Remove redundant/incorrect define of HAVE_ICU. Require ICU version 4.6 or later. Add comments describing how external dependencies are handled. * configure: Regenerate * Headers/Additions/GNUstepBase/config.h.in: Regenerate * config.mak.in: Update for consistency * base.make.in: ditto * Headers/Additions/GNUstepBase/GSConfig.h.in: ditto * Source/GSHTTPURLHandle.m: Improve debug logging a little * Source/NSXMLParser.m: Improve error handling. Use sloppy parser. * Source/NSRegularExpression.m: Use GS_USE_ICU and nnever HAVE_ICU * Source/NSCalendar.m: ditto * Source/NSLocale.m: ditto * Source/GSICUString.m: ditto 2010-12-15 Stefan Bidigaray * Source/GNUmakefile: Install NSCalendar.h. * Headers/Foundation/NSCalendar.h: * Source/NSCalendar.m: Started adding code to NSCalendar. 2010-12-15 Stefan Bidigaray * configure: Regenerate. * Headers/Additions/GNUstepBase/config.h.in: Update for unicode/ucal.h. * Headers/Foundation/NSLocale.h: Added NSLocaleCalendarIdentifier key. * Source/NSLocale.m: Added handling of locale keywords and a few other minor changes. 2010-12-14 Stefan Bidigaray * Source/NSLocale.m: Added NSCalendar dependent code. 2010-12-14 Stefan Bidigaray * Headers/Foundation/Foundation.h: * Source/GNUmakefile: Include NSCalendar. * configure.ac: Check for unicode/ucal.h. * Headers/Foundation/NSCalendar.h: * Source/NSCalendar.m: Add completely empty NSCalendar and NSDateCompoennts classes. 2010-12-14 Stefan Bidigaray * Source/NSLocale.m: Initialize _components before using it and initilize allLocales class variable in +initialize. Also stop adding blank entries to _components dictionary. 2010-12-12 Stefan Bidigaray * Headers/Foundation/NSLocale.h: Added missing constant. * Source/NSLocale.m: Implemented more functionality. 2010-12-06 Riccardo Mottola * Source/NSPathUtilities.m: Make the Desktop directory relative to the user home. 2010-12-03 Richard Frith-Macdonald * Source/Additions/GSMime.m: Fix possible memory corruption when asked to base64 decode corrupt data with too many '=' characters. 2010-12-02 Eric Wasylishen * Source/NSRegularExpression.m: Add a guard so this file isn't compiled if the ICU version is older than 4.4. 2010-11-29 Fred Kiefer * Headers/Foundation/NSPropertyList.h, * Source/NSPropertyList.m: Add a few OSX 10.6 methods. 2010-11-28 Richard Frith-Macdonald * Source/Additions/Unicode.m: Remove unnecessary include of Foundation.h * Source/Additions/GCDictionary.m: ditto * Source/Additions/GCObject.m: ditto * Source/Additions/GCArray.m: ditto * Source/Additions/GSXML.m: ditto * Source/Additions/GSFunctions.m: ditto * Source/Additions/GSObjCRuntime.m: ditto * Headers/Foundation/Foundation.h.install: obsolete file ... removed * Source/Makefile.postamble: Don't install obsolete Foundation.h.install header ... we no longer include Foundation.h anywhere so there's no need to protect against getting the installed version. 2010-11-19 Niels Grewe * Source/NSRegularExpression.m: Rearrange for non-C99 compliant compilers. 2010-11-18 Richard Frith-Macdonald * Source/NSPredicate.m: Fixup use of preprocessor constants. 2010-11-17 Eric Wasylishen * Source/NSPredicate.m: Implement MATCHES and LIKE using ICU * configure.ac: Check for unicode/uregex.h in ICU checks 2010-11-13 Riccardo Mottola * Source/NSPathUtilities.m: Make NSDownloadDirectory and NSDocumentDIrectory relative to the user home and for the user domain only. Behaviour checked on the Mac. 2010-11-05 Richard Frith-Macdonald * Tools/AGSIndex.m: ([-setUnitRef:type:]) Fix incorrect special handling of category methods. 2010-11-02 Larry Campbell * Tools/make_strings/make_strings.m: Fix line missed in last patch. * Source/NSPropertyList.m: Fixes for date serialization byte swaps. 2010-10-31 Larry Campbell * Tools/make_strings/make_strings.m: Permits tool to take nil as the table name argument in NSLocalizedStringFromTable and NSLocalizedStringFromTableInBundle (as does the corresponding OSX utility, genstrings). 2010-10-30 German Arias * Documentation/GNUmakefile: Changes in some files names to correspond with the files provided in the Documentation directory. 2010-10-28 Richard Frith-Macdonald * Headers/Additions/GNUstepBase/GSMime.h * Source/Additions/GSMime.m: Add support for delivery receipts. * Source/NSURLConnection.m: Fix simple leak in ([+sendSynchronousRequest:returningResponse:error:]) 2010-10-27 Richard Frith-Macdonald * Source/GSFFIInvocation.m: Revert David's last change ,which caused crashes by dereferencing a null pointer, even though I had put a comment in the code warning that the pointer could be null! 2010-10-27 Richard Frith-Macdonald * configure.ac: Fix definition of HAVE_ICU * configure: * Headers/Additions/GNUstepBase/config.h.in: regenerate * Headers/Additions/GNUstepBase/GSMime.h * Source/Additions/GSMime.m: wrap long lines * Source/NSLocale.m: Use HAVE_ICU 2010-10-26 Niels Grewe * Source/NSLocale.m: Fix -displayNameForKey:value: to interact properly with libicu for some common cases. 2010-10-22 Richard Frith-Macdonald * Source/ObjectiveC2/GNUmakefile: Do not set -march=i686 when on an x86 system as it breaks compilation for other cpu types. 2010-10-19 Jonathan Gillaspie * Source/Additions/NSError+GNUstepBase.m: Prevent SegFault when FormatMessageW doesn't return a string on Windows. 2010-10-19 Wolfgang Lux * Source/NSURL.m (-absoluteURL): Fix test for an absolute URL, which got things backward. 2010-10-19 Richard Frith-Macdonald * Source/NSURL.m: When making a relative file URL copy the host from the base URL for OSX compatibility. 2010-10-16 16:53-EDT Gregory John Casamento * config/objc-common.g: Correct test. The previous version didn't include the { and the } in the ivar section. This is not correct. * Source/ObjectiveC2/sync.m: Correct license text. 2010-10-13 Richard Frith-Macdonald * Source/NSURL.m: Match OSX behavior with file scheme URLS (treat them like http/https rather than accorinding to the RFCs). 2010-10-12 Richard Frith-Macdonald * Source/Additions/GSXML.m: If we receive an attribute name with no corresponding value, assume it's a minimised attribute in html ... and we should set the value to be the same as the name. 2010-10-12 Richard Frith-Macdonald * Source/Additions/GSObjCRuntime.m: Add support for arbitrary struct get/set since OSX has it at last (not just well-known structs). 2010-10-12 David Chisnall * Source/Additions/GSObjCRuntime.m: Add special case to KVC accessors for libobjc2: If there is a method with the wrong types, try calling the method with the correct types. This enables the TDD-fixup code to run and generate a KVC-compliant version of an existing method. 2010-10-12 Richard Frith-Macdonald * Source/NSURL.m: Exactly match the percent escaping used by OSX. 2010-10-08 Eric Wasylishen * Source/GSAvahiRunLoopIntegration.m: Fix some bugs: - Remove an extra retain of the NSTimer which was leaking memory. - When passed a NULL struct timeval * from avahi, invalidate the timer and don't schedule a new one. 2010-10-04 Richard Frith-Macdonald * Source/NSPredicate.m: Add simple implementation of evalutedObjectExpression 2010-10-01 Richard Frith-Macdonald * Source/Additions/GSObjCRuntime.m: Revert to the working version from the last release. Can't see a changelog for the last change, I guess some local hack was accidentally committed... it broke KVC, which showed up when the testsuite was run. 2010-10-01 Richard Frith-Macdonald * Source/GNUmakefile: Remove reference to non-existent behavior.h * Source/Makefile.postamble: Don't make circular dependency on common.h 2010-10-01 Richard Frith-Macdonald * Source/GSSocketStream.m: * Source/NSSocketPort.m: * Source/NSMessagePort.m: * Source/win32/GSFileHandle.m: * Source/GSNetwork.h: * Source/GSFileHandle.m: Standardise the backlog parameter to listen() calls. 2010-10-01 Richard Frith-Macdonald * Source/NSURL.m: Fix for bug #31153 ... allow hash in path when initialising. * Source/NSURLProtocol.m: Fix thread related crash with deallocation of placeholder object. 2010-09-30 Richard Frith-Macdonald * Source/GSFileHandle.m: Increase the backlog for the listen() call to allow more incoming network connections. 2010-09-30 Richard Frith-Macdonald * Source/NSURLProtocol.m: Remove excess release pointed out by Sergey Golovin (bug 31168) 2010-09-30 Richard Frith-Macdonald * Source/Additions/GSMime.m: restore standardisation of header name lost in last optimisation. Fixes bug #31166 2010-09-28 Eric Wasylishen * Source/objc-load.m: Don't include objc-list with libobjc2 2010-09-28 Eric Wasylishen * Source/GSFFIInvocation.m: Remove dead code (gs_find_by_receiver_best_typed_sel was static inline and never called anywhere) 2010-09-28 Richard Frith-Macdonald * Source/GSString.m: implement lowercaseString and uppercaseString for improved performance. * Source/Additions/GSMime.m: optimise header searches 2010-09-25 Richard Frith-Macdonald * Source/NSTimer.m: ([-fire]) make firing more robust by retaining the target so it cannot be deallocated while we are performing a method on it. Do nothing if timer is already invalidated. 2010-09-24 Richard Frith-Macdonald * Source/NSCharacterSet.m: Build using the faster but more memory hungry implementation. Add comments to say why we are doing so. 2010-09-20 Wolfgang Lux * Source/ObjectiveC2/runtime.c (method_getImplementation, method_getName): Fix unchecked pointer dereferences, which could cause crashes when attempting to invoke a selector which is not implemented by the target. 2010-09-19 Quentin Mathe * Headers/Additions/GNUstepBase/preface.h.in: Added standard C headers included by CoreFoundation.h. 2010-09-17 Wolfgang Lux * Source/NSBundle.m (+bundleForLibrary:version:): Use proper suffix for dynamic libraries on Darwin (.dylib instead of .so). * Source/NSTask.m (-launch): Use fork instead of vfork on Darwin, since setsid will fail while the child process is in the vfork. 2010-09-17 Wolfgang Lux * Source/NSObject.m (-methodSignatureForSelector:): Fix bug were this method would return an incorrect result or crash when asking a class object for the signature of one of its class methods. 2010-09-15 Eric Wasylishen * Source/GSSocketStream.m: * Source/NSPortCoder.m: * Source/NSSocketPort.m: * Source/NSAttributedString.m: * Source/NSKeyValueMutableSet.m: * Source/NSKeyedUnarchiver.m: * Source/NSUnarchiver.m: * Source/GSAttributedString.m: * Source/NSKeyValueMutableArray.m: * Source/NSXMLParser.m: Fix more unsigned int / ints that should be NSUInteger/NSInteger 2010-09-15 Eric Wasylishen * Source/objc-load.m: Don't compile the dynamic_handles code with libobjc2. Note that this appears to be dead code anyway, so maybe it should be removed altogether? 2010-09-15 Eric Wasylishen * Source/NSMessagePort.m: * Source/NSFileManager.m: * Source/NSCharacterSet.m: Fix some method type mismatches. Generally when a private subclass overrides a public method taking a NSUInteger with a method taking an "unsigned" parameter. 2010-09-12 Riccardo Mottola * Source/GSAttributedString.m: Removed dead assignments and unused variable attrs. * Source/GSFormant.m: Removed useless len recalculation. 2010-09-12 Richard Frith-Macdonald * Source/GSConcreteValueTemplate.m: * Source/NSSocketPort.m: * Source/NSSortDescriptor.m: * Source/NSMessagePort.m: * Source/GSAttributedString.m: * Source/NSNumber.m: * Source/GSString.m: * Source/NSHost.m: * Source/NSDate.m: * Source/GSValue.m: Fix return types. 2010-09-10 Richard Frith-Macdonald * Source/NSSocketPort.m: * Source/unix/GSRunLoopCtxt.m: * Source/NSPort.m: * Source/NSMessagePort.m: * Source/win32/GSRunLoopCtxt.m: Remove redundant check for responding to getFds:count: since it's always true. Fix usage of method to correspond to prototype (NSInteger arguments rather than int arguments). * Source/ObjectiveC2/runtime.c: Fix class_getMethodImplementation() and class_getMethodImplementation_stret() so that they don't cause a crash when used with proxies. * Source/NSKeyValueCoding.m: * Source/cifframe.m: * Source/Additions/GSLock.m: * Source/NSDate.m: Tweaks to avoid clang static analyser warnings. 2010-09-09 Eric Wasylishen * Source/NSProtocolChecker.m: Replace a -[Protocol name] with protocol_getName() 2010-09-09 Eric Wasylishen * Source/NSDistantObject.m: #ifdef to disable category on Object was forgotten around the interface 2010-09-09 Riccardo Mottola * Source/unix/GSRunLoopCtxt.m: only access array if port responds to selector, or it is not initialized * Source/NSDate.m: * Source/NSScanner.m: use init return value 2010-09-09 Richard Frith-Macdonald * Source/NSString.m: Fix retain/release bugs spotted by clang. * Source/GSFFIInvocation.m: Revert one line in order to get lookup of types working again so that proxies can still be used. 2010-09-09 Adam Fedor * configure.ac: Check for dladdr without requiring -ldl * configure, Headers/Additions/GNUstepBase/config.h.in: Regen 2010-09-09 Eric Wasylishen * Source/ObjectiveC2/runtime.c: fix a typo * Source/NSObject.m: c90 compatibliity 2010-09-09 Eric Wasylishen * Source/ObjectiveC2/runtime.c: Change sel_getUid to call sel_registerName, in line with OS X behaviour since 10.0 2010-09-02 David Chisnall * Source/NSBundle.m * Source/NSMethodSignature.m * Source/NSDebug.m * Source/GSFFIInvocation.m * Source/GSPrivate.h * Source/NSInvocation.m * Source/NSCopyObject.m * Source/NSObject.m * Source/Additions/GSXML.m * Source/Additions/GSObjCRuntime.m * Source/NSConnection.m * Source/NSObjCRuntime.m * Source/NSProxy.m * Source/NSProtocolChecker.m * Source/NSSerializer.m * Source/NSDistantObject.m * Headers/Foundation/NSInvocation.h * Headers/Additions/GNUstepBase/DistributedObjects.h A huge blob of changes to make -base build with libobjc2, without using the old libobjc2 headers. Most of these changes involve simply removing direct manipulation of any runtime structures and replacing them with runtime function calls. For example class->name becomes class_getName(class) and so on. libobjc2, like the Apple runtime, the NeXT runtime, and every version of the Objective-C spec, calls the class pointer in id isa. A few files now have #define class_pointer isa at the top. This line replaces class_pointer in the old GNU libobjc headers with isa so either class_pointer or isa can be used for accessing the class of an object. Note: object_getClass() should be used in most cases because, in some future version of the runtime, this will skip things like lock classes and other hidden classes (e.g. KVO classes). All of the old forwarding stuff has been removed. Most of this stuff followed convoluted code paths that ended with an exception. A few simply broke in exciting ways. Hopefully no one has used them for the last ten years or so, but we can bring them back with some #ifndef stuff if they're really needed by anyone. There is currently a bug in configure, which prevents dladdr() from being detected, so you need to manually tweak config.h to build - I have not fixed the fall-back code in objc-load.m to work with libobjc2, I just added a new version that uses the loader's functionality directly. Although -base now builds, it builds with a lot of warnings. is missing from a lot of files, so memcpy() and strlen() generate implicit function declaration warnings. Additionally, libobjc2 does still provide the sel_{get,register}_*() functions, but they're wrappers around the newer API ones. These are deprecated and are not exposed in the headers. Although they work, we should be replacing them with the libobjc2 versions as soon as possible. This incorporates a patch by Eric. 2010-09-08 Eric Wasylishen * Source/ObjectiveC2/runtime.h: * Source/ObjectiveC2/runtime.m: Implement protocol_copyMethodDescriptionList, protocol_copyProtocolList, protocol_getMethodDescription, as well as a dummy version of objc_copyProtocolList. * Headers/Additions/GNUstepBase/GSObjCRuntime.h: * Source/Additions/GSObjCRuntime.m: Implement a convenience method, GSProtocolGetMethodDescriptionRecursive 2010-09-08 Richard Frith-Macdonald * Headers/Foundation/NSObject.h: * Source/NSObject.m: Remove old TypedStream methods * Source/NSFileManager.m: Warn if filesystem support is not available. 2010-09-07 Eric Wasylishen * Headers/Additions/GNUstepBase/preface.h.in: Remove include of objc/sarray.h 2010-09-04 Niels Grewe * config/config.non-fragile-ivars.m: Remove useless include of objc-common.g (__has_feature is a built-in clang macro). 2010-09-02 David Chisnall * Source/NSObject.m Improve the efficiency of NSObject's methodSignatureForSelector by: - Moving the linear search over all of the method lists in the class hierarchy to the end. If we found the type info in the protocol list, we were throwing this info away. Doing something expensive and then discarding the result is generally not a good idea. - Replacing the linear search of the method lists with a dtable lookup on libobjc2. The type info for methods is part of the slot, so we only need to do the expensive search at all on the old runtime. With libobjc2, type info lookup costs as little as IMP lookup, so doing things the slow way is not required. 2010-08-31 Richard Frith-Macdonald * Tools/cvtenc.m: Add -Unicode option. Fix to allow reading from stdin * Tools/cvtenc.1: update 2010-08-30 Richard Frith-Macdonald * Source/NSThread.m: try to make inter-thread notification via pipe more robust. * Source/NSTask.m: make windows thread waiting for task into an NSThread so that any thread-dependent code can work. 2010-08-25 Jonathan Gillaspie * Source/Objective2/sync.m: Removed weak declarations 2010-08-24 Wolfgang Lux * Source/GSFileHandle.m (-initWithStandardError, -initWithStandardInput, -initWithStandardOutput): Restore lost assignments which ensure that only one file handle exists for each of the standard channels. This fixes a bug where a run loop might unexpectedly stop watching the standard channels. 2010-08-23 Riccardo Mottola (patch by Yavor Doganov) * configure.ac: Include pthread.h in check program * configure: Regenerate 2010-08-20 Richard Frith-Macdonald * Source/ObjectiveC2/runtime.c: Made objc_disposeClassPair() a no-op if the class pair is already registered .. to prevent it from causing crashes. Made objc_registerClassPair() log error if there is already a class of the name. * Source/ObjectiveC2/sync.m: Replace with Greg's implementation (reported as working though I haven't tested it). 2010-08-19 Richard Frith-Macdonald * configure.ac: Check alignment of pthread types * configure: Regenerate * Headers/Additions/GNUstepBase/GSConfig.h.in: Record alignment 2010-08-18 Richard Frith-Macdonald * Source/NSNumber.m: Modifications to permit generation of NIBs that OSX can read again ... functionality was lost in recent rewrite. 2010-08-17 Richard Frith-Macdonald * Source/NSObject.m: * Source/NSDistantObject.m: Return nil from (methodSignatureForSelector:) if the selector is null. * Source/NSObjcRuntime.m: Register new selector as needed. 2010-08-17 Wolfgang Lux * Source/NSNotificationQueue.m: remove_from_queue_no_release() Add assertions instead of existing hack when removing an item from a corrupted list. 2010-08-17 Richard Frith-Macdonald * Source/NSNotificationQueue.m: notify() .. buffer notifications and remove from list before posting them. Prevents re-entrancy problems where another call to notify() could post (and remove from the list) notifications. 2010-08-13 Eric Wasylishen * Headers/Foundation/NSLocale.h: * Headers/Foundation/NSUserDefaults.h: Fix typo (GSAPI_LAST -> GS_API_LATEST) 2010-08-12 Nicola Pero * Resources/Languages/Locale.aliases: Added many languages which were missing from the list. Data taken from gettext-0.18.1.1/gettext-tools/doc/ISO_639 and gettext-0.18.1.1/gettext-tools/doc/ISO_639-2. 2010-08-10 Richard Frith-Macdonald * Source/NSTask.m: thread-safety fix. 2010-08-10 Richard Frith-Macdonald * Source/NSRunLoop.m: * Source/NSURLProtocol.m: * Source/GSAttributedString.m: * Source/ObjectiveC2/properties.m: * Source/NSProtocolChecker.m: * Source/NSDistantObject.m: * Tools/gdomap.c: Functionless changes to avoid compiler warnings reported by Fred. 2010-08-07 Richard Frith-Macdonald * Source/NSCalendarDate.m: Fix for %p AM/PM parsing to implicitly set us to use twelve hour clock. 2010-08-06 Doug Simons * Source/NSCalendarDate.m: Fix to AM/PM parsing to recognize 12 AM as midnight, not noon. When format calls for a time zone, return nil if no time zone is given (the same as Cocoa). 2010-07-31 Quentin Mathe * Tools/AGSParser.h: * Tools/AGSParser.m: (-canWrapWithParagraphMarkup:, -generateParagraphMarkupForString:): Tweaked paragraph generation to ignore /n/n sequences inside markup. (-parseDeclaration): Added enum documentation parsing. 2010-07-26 Nicola Pero * Documentation/GNUmakefile (REF_DOC_INSTALL_DIR): Use GNUSTEP_DOC, not GNUSTEP_DOCUMENTATION, which has been deprecated for over 3 years. * Documentation/Makefile.postamble (after-uninstall): Rewritten to be more accurate. 2010-07-26 Nicola Pero * Source/NSBundle.m ([+_addFrameworkFromClass:]): Added support for class lists of frameworks with a relative path. If the framework path is relative, convert it to absolute by prepending the launch directory to it, since that must be how the dynamic linker located the framework to load it. 2010-07-22 Richard Frith-Macdonald * Source/NSString.m: Change to use ([-isKindOfClass:]) in a couple of places. Revert David's last change entirely ... in the svn log he said: 'Do the same stupid thing Apple does (return NO), rather than the stupid thing we were doing (segfault), when passing a proxy as the argument to [NSString isEqualToString:]', but this comment seems to be almost entirely wrong as: 1. we don't segfault (on my machines ... perhaps we do on other systems but if so we should find the underlying bug and fix it) 2. Apple (OSX Snow Leopard) doesn't behave that way ... the testsuite (NSProxy test00.m) shows it behaving the saem way as GNUstep. 3. The change also broke string subclasses (bug #30511) 2010-07-19 Niels Grewe * Source/ObjectiveC2/runtime.c: * Source/ObjectiveC2/runtime.h: Add sel_getType_np(), which just calls sel_get_type(). 2010-07-19 Richard Frith-Macdonald * Source/NSPathUtilities.m: User domain handling improvements. Match gnustep-make in allowing absolute paths to be specified for the user domain directories rather than always treating user domain paths as being within the user's home directory. Also, add support for simple field substitution into the path: '%u' --> user name '%i' --> user id '%%' --> '%' * Documentation/Base.gsdoc: Document the new behavior. 2010-07-19 Niels Grewe * Headers/Additions/GNUstepBase/GSConfig.h: Define GS_USE_ICU when the configure script indicates libicu availablity. * Headers/Foundation/Foundation.h: Import NSLocale.h * Source/NSLocale.m: Change tests to use GS_USE_ICU. Make sure that the parts of NSLocale relying on ICU actually get built when libicu is available. 2010-07-17 Quentin Mathe * Tools/autogsdoc.m: * Tools/AGSParser.m: Added the ability to generate paragraph markup. Turned off by default. For each paragraph break ('/n/n' sequence) and when no incompatible elements exist in the scanned paragraph,

tags can be automatically inserted (more explanations in -canWrapWithParagraphMarkup: doc). 2010-07-13 Richard Frith-Macdonald * Headers/Foundation/NSNetServices.h: * Source/GSAvahiClient.h: * Source/GSNetServices.h: * Source/GSAvahiNetService.m: Attempt to get ahavi code working without breaking ABI. 2010-07-13 Niels Grewe * Headers/Foundation/NSNetServices.h: Update to a version working with both mDNSResponder and Avahi. * Source/GSAvahiNetService.m: Fix leftover duplicate variables. * Source/GSNetServices.h: Revert to r30954, but add padding ivars to the Avahi classes. Make Avahi-NSNetServices work again. 2010-07-13 Niels Grewe * Source/NSNetServices.m: Replace with the new version. * Source/GSNetServices.h: Add missing header. Add code missing from the previous patch. 2010-03-27 Niels Grewe * configure.ac: Add check for avahi-client. * configure: Regenerate * base.make.in: Add build-variables for Avahi. * Source/GNUmakefile: Add avahi-based NSNetServices to build * Source/GSAvahiRunLoopIntegration.h: * Source/GSAvahiRunLoopIntegration.m: * Source/GSAvahiClient.h: * Source/GSAvahiClient.m: * Source/GSAvahiNetService.m: * Source/GSAvahiNetServiceBrowser.m: Add avahi-based NSNetServices implementation * Source/GSMDNSNetServies.m: Move mDNS-implementation to this file * Source/GSNetServices.h: New private header for NSNetServices * Source/NSNetServices.m: Abstract superclasses * Headers/Foundation/NSNetServices.h: Adopt to new class structure * Headers/Additions/GNUstepBase/GSConfig.h.in: Add zeroconf related variables. * Header/Additions/GNUstepBase/Additions.h: * Headers/Additions/GNUstepBase/NSNetServices+GNUstepBase.h: Add header with extensions for the avahi-based NSNetService class. Implement NSNetService and NSNetServiceBrowser on top of the avahi-client API. Both classes are now abstract superclasses of the concrete implementations based on the mDNSResponder or avahi-client APIs. The API to be used can be configured with the --with-zeroconf-api=API (mdns, avahi, or any) configure-switch. If both APIs are available, the avahi API will be preferred. 2010-07-12 Richard Frith-Macdonald * Tools/gdomap.c: Fix logic error in recnt mod. Add some debug. 2010-07-03 Richard Frith-Macdonald * Source/Addictions/NSError+GNUstepBase.m: Declare _XOPEN_SOURCE so that glibc gives us the correct version of the strerror_r function. 2010-01-07 Niels Grewe * Source/GNUmakefile * Source/Makefile.postamble: Fix makefile to copy common.h into $GNUSTEP_TARGET_DIR so that it is found when building with a non-flattened namespace. 2010-07-01 Richard Frith-Macdonald * Source/CXXException.m: Fixup to get base to compile again. I think this API needs improving ... this should be an NSException subclass or category, and catching it should be transparent to the developer. 2010-06-29 Richard Frith-Macdonald * Source/NSKeyedUnarchiver.m: Workaround for buggy inttypes.h on older Solaris systems. 2010-06-28 Richard Frith-Macdonald * Source/NSSet.m: Fix incorrect return value in NSMutableSet's -classForCoder method. 2010-06-28 Quentin Mathe * Tools/autogsdoc.m: Improved to search for .m files among the command-line arguments in addition to the current directory and documentation directory. 2010-06-26 Richard Frith-Macdonald * Source/NSObject.m: Remove the Object(NSObjectCompat) category as the use of the Object class is *really* obsolete, and also there appears to be an objc runtime bug whaich adds the category methods to NSZombie even though NSZombie is not a subclass of Object. * Tools/gdomap.c: Avoid strange hang when trying to register on port 0 2010-06-25 Richard Frith-Macdonald * Source/NSURL.m: Implement keyed coding * Source/NSBundle.m: When fetching a localised resource for a specific language, ignore the language list in the user preferences, and just look for that language asn for unlocalised data. 2010-06-25 Richard Frith-Macdonald * Source/NSKeyedArchiver.m: * Source/NSKeyedUnarchiver.m: Implement NSInteger methods and add range checking when decoding. 2010-06-25 Richard Frith-Macdonald * Source/NSLocale.m * Headers/Additions/GNUstepBase/config.h.in * config/icu.m4 * configure.ac * configure * config.mak.in Autoconf support for ICU 2010-06-25 Richard Frith-Macdonald * Headers/Foundation/Foundation.h: add NSLocale * Headers/Foundation/NSLocale.h: rewrite/document * Source/GNUmakefile: add NSLocale * Source/NSLocale.m: fixup headers and disable temporarily (so that base will still build) 2010-06-25 Stef Bidi * Headers/Foundation/NSLocale.h * Source/NSLocale.m Partial NSLocale implementation wrapping ICU 2010-06-23 Richard Frith-Macdonald * Source/NSBundle.m: When looking up paths, if no extension is provided then try to obtain it from the name. Mimics OSX behavior. 2010-06-22 David Wetzel * Headers/Foundation/NSFileManager.h * Source/NSFileManager.m add attributesOfItemAtPath:error: 2010-06-22 Richard Frith-Macdonald * Headers/Additions/GNUstepBase/GSVersionMacros.h: Include header for ObjC2 blocks support if the compiler had that. 2010-06-20 Richard Frith-Macdonald * Version 1.21.1 2010-06-20 Richard Frith-Macdonald * Version 1.20.1 2010-06-19 Richard Frith-Macdonald * Source/NSUserDefaults.m: Remove inappropriate warning (when library used without resources). 2010-06-16 Sergey Golovin * Source/NSTimeZone.m: find timezone from localtime file when it's a copy rather than a link to a file whose name is a timezone name. 2010-06-16 Richard Frith-Macdonald * configure.ac: better control over constant string class * configure: regenerate Don't allow build if compiler doesn't let us set the constant string class ... unless explicitly overridden (add warning). Explicitly deprecate ffcall 2010-06-15 Richard Frith-Macdonald * Source/NSInvocation: For portability, use NSPageSize() to find size for page alignment. * Source/NSString.m: Raise exception on pul pointer passed to +stringWithCString:encoding: as per OSX. * Source/Additions/GSXML.m: Fix minor memory leak * Source/NSArray.m: ([-valueForKey:]) for for @count 2010-06-15 Riccardo Mottola * Source/NSInvocation: Protect page-aligned and unprotect before freeing. 2010-06-13 Richard Frith-Macdonald * Source/Additions/Unicode.m: Fix indirect through null pointer. 2010-06-12 Richard Frith-Macdonald * Source/NSNumber.m: Fix breakage of +numberWith... in subclasses. 2010-06-12 Yavor Doganov * Source/NSZone.m: * Source/GSPThread.h: * Source/objc-load.h: * Source/objc-load.m: * Source/NSException.m: * Source/ObjectiveC2/sync.m: * Source/NSString.m: * Source/NSDecimalNumber.m: * Source/NSDecimal.m: * Source/NSLock.m: * configure.ac: Use autoconf AC_USE_SYSTEM_EXTENSIONS * configure: Regenerate * Headers/Additions/GNUstepBase/config.h.in: Regenerate Simplification of source code by using autoconf to enable extensions for Unix98 thread handling etc. 2010-06-11 Riccardo Mottola * Source/NSZone.m * Source/GSPThread.h * Source/NSLock.m * Source/ObjectiveC2/sync.m: Attempt of fixing test for defining _XOPEN_SOURCE again 2010-06-10 Richard Frith-Macdonald * Source/NSSocketPortNameServer.m: Improve automated gdomap startup log * configure.ac: Don't install gdomap setuid by default. * configure: regenerate 2010-06-10 Richard Frith-Macdonald * Source/NSString.m: Raise exception if a null pointer is passed to +stringWithUTF8String: for compatibility with OSX. * Source/Additions/GSMime.m: Alter hash and isEqual implementations for headers and document so that copies are equal to the original and can be stored and looked up in maps. 2010-06-09 David Wetzel * Source/Additions/GSXML.m: check for NULL string stringWithUTF8String: raises on OSX if you feed it with a NULL string. 2010-06-09 Richard Frith-Macdonald * configure.ac: Check for gcrypt library for TLS * configure: Regenerate * Headers/Additions/GNUstepBase/GSConfig.h.in: Remove unused declaration * Source/NSProcessInfo.m: log and exit rather than raising exception on failure to call internal method to set up argv/envp. * Source/Additions/GSMime.m: Rewrite header parsing to avoid copying email body unnecessarily. Also attempt to parse multipart body without copying too much. 2010-06-09 Yavor Doganov *Source/ObjectiveC2/sync.m: Fix test for defining _XOPEN_SOURCE 2010-06-08 Richard Frith-Macdonald * Source/NSPropertyList.m: When encoding OSX binary property list, try to differentiate between integer and float items which have the same numeric value (bug #30040). 2010-06-08 Richard Frith-Macdonald * Source/NSURL.m: Return nil for -path if initialised with empty string ... OSX compat. 2010-06-08 Richard Frith-Macdonald * Source/GSFFIInvocation.m: Further fixup to earlier invocation breakage ... my previous attempt didn't cover all cases. 2010-06-08 Richard Frith-Macdonald * Source/GSFFIInvocation.m: * Source/cifframe.h: * Source/cifframe.m: Removed distinction between GC and non-GC code. 2010-06-07 Richard Frith-Macdonald * Source/GSInvocation.h: * Source/GSFFIInvocation.m: * Source/NSInvocation.m: * Source/cifframe.h: * Source/cifframe.m: Rework memory management for frame used in FFI invocation so that the memory has a retain count and multiple invocations can use the same frame since it looks like the way FFI works, if you cache the method implementation of a proxy, the same frame memory is re-used in multiple invocations. 2010-06-07 Richard Frith-Macdonald * Source/GSFFIInvocation.m: Fix breakage caused by David's changes. * Source/ObjectiveC2/runtime.m: Fix handling of nul arguments in class_sespondsToSelector(). 2010-06-05 Richard Frith-Macdonald * Tools/Makefile.postamble: Fix breakage of instalation of gdomap (was installing setuid to wrong user ID!). 2010-06-02 Richard Frith-Macdonald * Source/NSTimeZone.m: revert change of order of sources for zone info since tzname does not appear to be more reliable than filename. Allof timezone to be specified as an abbreviation rather than a name. 2010-06-02 Nicola Pero * configure.ac: Added --disable-setuid-gdomap option to disable installing gdomap as setuid. * configure: Regenerated. * config.mak.in (GNUSTEP_INSTALL_GDOMAP_AS_SETUID): New variable. * Tools/Makefile.postamble: (after-install): Instal gdomap as setuid only if GNUSTEP_INSTALL_GDOMAP_AS_SETUID is set to 'yes'. Updated messages for the changes and generally tidied messages up. 2010-06-01 Richard Frith-Macdonald * Source/NSTimeZone.m: add diagnostic to report the source of the timezone name when we can't create the local timezone. Use tzset()/tzname in preference to the name of the default timezone file ... in case of evil systems where the file has the wrong name. 2010-06-01 Richard Frith-Macdonald * Source/Additions/NSPropertyList+GNUstepBase.m: New category to replace property list write functionality no longer present in OSX. * base.make.in: Link with base additions library on OSX 2010-05-30 Richard Frith-Macdonald * Source/Additions/GSMime.m: ([+encodingFromCharset:]) Experimental extension to support NSStringEncoding symbolic constants in string form, in addition to more common characterset names (primarily for gdl2/gsweb). 2010-05-30 Richard Frith-Macdonald * Source/NSString.m: * Source/Additions/NSString+GNUstepBase.m: * Headers/Foundation/NSString.h: * Headers/Additions/GNUstepBase/NSString+GNUstepBase.h: Revert last change ... there's no such method as +encodingNamed: in OSX/OpenStep, so it definitely shouldn't be in NSString.[hm] I think we can debate whether to add it to the additions library, though I'm not sure that it's actually a generally useful addition (if I understand correctly, it's used only in gdl2/gsweb and ought probably to be a category there ... assuming that there's really no existing/standard mechanism to do the job). 2010-05-30 David Wetzel * Source/NSString.m * Source/Additions/NSString+GNUstepBase.m * Headers/Foundation/NSString.h * Headers/Additions/GNUstepBase/NSString+GNUstepBase.h added encodingNamed: 2010-05-30 Richard Frith-Macdonald * Source/NSObject.h: Floating point fix for openbsd suggested by Sebastian Reitenbach 2010-05-30 Wolfgang Lux * Source/NSAttributedString.m (-initWithCoder:, -encodeWithCoder:): Fix keyed archiving and unarchiving of (mutable) attributed strings with multiple attribute ranges. 2010-05-30 Richard Frith-Macdonald * NSTimeZones/NSTimeZones.tar: Update to latest zone info. 2010-05-29 Richard Frith-Macdonald * Source/NSData.m: Attempted fix for bug #29920 2010-05-29 Richard Frith-Macdonald * Source/NSConcreteHashTable.m: * Source/NSHashTable.m: In ([-allObjects]) fix buf overrun (bug #29980). * Source/NSXMLParser.m: Fix off-by-one error handling whitespace. * Headers/Additions/GNUstepBase/GSMime.h: Revert xml charset method. * Source/NSURL.m: Allow a URL made from an empty string (OSX compat). 2010-05-28 Quentin Mathe * Source/NSKeyValueCoding.m: Added missing support to ValueForKey() as described in Apple Key-Value-Coding guide. -isKey is now treated as a KVC-compliant getter, and _isKey and isKey as KVC-compliant ivars. 2010-05-25 Richard Frith-Macdonald * Source/NSPropertyList.m: ([-parser:foundCharacters:]) don't trim the supplied string ... we need to retain whitespace around entities in value test. If inside a element, treat ignorable whitespace as normal whitespace. * Source/NSXMLParser.m: Add support for ignorable whitespace so that it doesn't get handed to the delegate as normal characters. 2010-05-22 Richard Frith-Macdonald * Headers/Foundation/NSObjCRuntime.h: Remove include of stdint.h ... already included by GSConfig.h * Source/ObjectiveC2/runtime.h: Revert 'guarding' of stdint.h inclusion to get things to compile again ... we *require* stdint.h to be present. I guess on any system old enough not to have it, the solution would be to generate and install our own version. 2010-05-21 Riccardo Mottola * Source/ObjectiveC2/runtime.h: correctly import config.h 2010-05-21 Richard Frith-Macdonald * Headers/Additions/GNUstepBase/GSMime.h: Expose xml charset method. * Source/NSXMLParser.m: Determine correct charset when parsing. 2010-05-21 Riccardo Mottola * Source/inet_pton.c Source/ObjectiveC2/runtime.h Headers/Foundation/NSObjCRuntime.h: Guarded stdint.h inclusion. 2010-05-19 Richard Frith-Macdonald * Source/Additions/GSObjCRuntime.m: GSObjCMethodNames() fix for bug #29910 2010-05-10 Adam Fedor * Fix typos, clarify unstable release documentation 2010-05-08 Adam Fedor * Unstable Version 1.21.0 2010-05-08 Adam Fedor * Version 1.20.0 2010-05-06 Richard Frith-Macdonald * Tools/gdomap.c: Limit config files to containing a thousand entries for safety/security. 2010-05-05 Richard Frith-Macdonald * Source/GSHTTPURLHandle.m: * Source/NSURLProtocol.m: Fix for bug #29764 ... add percent escapes to the path when generating the URI in the HTTP request. 2010-05-05 Richard Frith-Macdonald * Source/Tools/gdomap.c: security updates. * Tools/Makefile.postamble: make warning messages a bit clearer and more informative about gdomap being best started at system boot. 2010-05-03 Richard Frith-Macdonald * Headers/Foundation/NSString.h, * Source/NSString.m: Add 10.4 write methods. Fixes part of bug report #29736. 2010-05-02 Fred Kiefer * Headers/Foundation/NSString.h, * Source/NSString.m: Add a few missing 10.4 initWithContentsOfXXX: methods. Fixes part of bug report #29736. 2010-05-01 Wolfgang Lux * Source/Additions/GSObjCRuntime.m (GSObjCAllSubclassesOfClass): Fix bug in previous change that made GSObjCAllSubclassesOfClass return all superclasses instead of all subclasses. 2010-04-30 Richard Frith-Macdonald * Source/Additions/GSObjCRuntime.m: Attempt fix for bug #29720 2010-04-26 Wolfgang Lux * Source/NSObject.m (GSAtomicIncrement, GSAtomicDecrement): Use local labels in PowerPC assembler code to avoid a compile error when this code is inlined more than once. In addition, use the optimized assembler definitions also on PowerPC machines running Darwin/Mac OS X. 2010-04-23 Richard Frith-Macdonald * Source/Additions/NSFileHandle+GNUstepBase.m: fix to only build on OSX 2010-04-22 David Wetzel * Source/Additions/Unicode.m: replace objc_malloc with NSZoneMalloc and objc_free with NSZoneFree * Source/Additions/NSFileHandle+GNUstepBase.m: should work with ipv6 (The old code does fail on Snow Leopard, even with ipv4 addresses.) * Source/Additions/GSXML.m: added GSObjCRuntime.h * Headers/Additions/GNUstepBase/GSObjCRuntime.h: replace objc_malloc with NSZoneMalloc and objc_free with NSZoneFree 2010-04-21 Richard Frith-Macdonald * Source/NSBundle.m: ([mainBundle]) Fix error determining whether the bundle is an app or not ... was breaking lookup of tool resources. 2010-04-19 Richard Frith-Macdonald * Source/cifframe.m (cifframe_type): Fix the cached information for the NSRange type. Was causing incorrect forwarding of NSRange arguments on 64bit systems. 2010-04-18 Nicola Pero Fixed inefficiencies in building the SSL bundle. * SSL/Makefile.postable: Do not create GNUSTEP_TARGET_DIR/config.h from config.h; do not depend on config.status. * SSL/Makefile.preamble: Corresponding updates to includes. 2010-04-18 Nicola Pero Fixed bug 25356 ("make ignoring installation domain configuration on windows"). * configure.ac: Moved the path configuration here so that it is executed at the right time. Removed duplicated code for all the path config options. (AC_CONFIG_SUBDIRS): Removed Source/pathconfig. * configure: Regenerated. * config.mak.in: Merged code from Source/pathconfig/pathconfig.mak.in. * Source/pathconfig: Removed. * GNUmakefile: Do not include Source/pathconfig/pathconfig.mak. * Documentation/GNUmakefile: Same change. * NSTimeZones/GNUmakefile: Same change. * Source/GNUmakefile: Same change. * SSL/GNUmakefile: Same change. * Tools/GNUmakefile: Same change. * Source/Makefile.postamble (after-distclean): Do not remove files in pathconfig/. * Source/NSPathUtilities.m: Do not include pathconfig.h. * GNUmakefile: Include config.mak after common.make. * configure.ac: Exit immediately if GNUSTEP_MAKEFILES can not be determined. * configure.ac: Fixed determining GNUSTEP_LOCAL_HEADERS and GNUSTEP_LOCAL_LIBRARIES when adding them to CPPFLAGS and LDFLAGS. Add GNUSTEP_NETWORK_HEADERS and GNUSTEP_NETWORK_LIBRARIES as well. 2010-04-18 Nicola Pero * configure.ac (AC_CONFIG_SUBDIRS): Fixed list of subdirs by removing Source/mframe, which no longer exists. * configure: Regenerated. 2010-04-16 Richard Frith-Macdonald * Source/NSThread.m: Fix unregistering of threads to properly clean up and deallocate, avoiding descriptor and memory leak. 2010-04-15 Richard Frith-Macdonald * Source/NSConnection.m: when decoding a pointer to an object, autorelease the object to avoid a leak. 2010-04-14 Richard Frith-Macdonald * Source/ObjectiveC2/runtime.c: work around buggy objc_skip_argspec() * Source/NSConnection.m: work around buggy objc_skip_argspec() * Source/NSObjCRuntime.m: Fix NSGetSizeAndAlignment() so it's OSX compatible and can be used to replace objc_skip_argspec() (as that function calls objc_skip_offset() which can skip a character too far). 2010-04-13 Richard Frith-Macdonald * Source/NSArray.m: ([-initWithContentsOfFile:]) added ugly OSX compatibility hack ... return the mutable array deserialized from the property list rather than an instance of the same class as the receiver. The original GNUstep behavior made more sense. 2010-04-13 Richard Frith-Macdonald * Source/NSNotificationQueue.m: Fix error traversing queue. Reverse direction of links in queue to be intuitive/consistent with other linked lists. 2010-04-12 Nicola Pero * configure.ac: Rewritten test for -Wdeclaration-after-statement to be more accurate. * configure: Regenerated. 2010-04-12 Richard Frith-Macdonald * Source/NSObject.m: * Headers/Foundation/NSObject.h: Document behavior of +load and +initialize to preserve information I'm sure I once knew but had forgotten. Obscure details. 2010-04-07 Doug Simons * Source/NSPathUtilities.m: Prefer USERPROFILE for the NSHomeDirectory() on Windows if HOMEPATH is set to '/'. 2010-04-07 Richard Frith-Macdonald * configure.ac: Fix for bug #29291 based on suggestion by Niels Grewe * Source/GSFileHandle.m: Fix possible descriptor leak. 2010-04-06 Wolfgang Lux * Source/cifframe.m (cifframe_type): Fix the defunct test for the standard structure types. The failure to detect those types was causing a substantial space leak in some gui applications. 2010-03-29 Richard Frith-Macdonald * config/config.ffi.c: add test for libffi functionality * configure.ac: use new test * configure: regenerate Greg had the good idea of testing libffi version to make sure it works ... unfortunately I couldn't see an easy way to test the version, so I added a test for functionality adapted from the test case I made for the libffi people to demonstrate a bug in passing floats on 64bit intel. 2010-03-28 Richard Frith-Macdonald * Source/NSDecimalNumber.m: override getter methods of superclass 2010-03-27 Richard Frith-Macdonald * Headers/Foundation/NSException.h: Fix typos in last change (spotted by Eddie McCreary). 2010-03-03 Doug Simons * Source/ObjectiveC2/sync.m: Avoid crash on Windows. 2010-03-25 Riccardo Mottola * Source/GSPThread.h * Source/NSZone.m * Source/ObjectiveC2/sync.m * Source/NSLock.m: change defines for GNU/HURD 2010-03-23 Riccardo Mottola * Source/NSObject.m: Atomic increment and decrement functions for mips 2010-03-19 Richard Frith-Macdonald * config/config.reuseaddr.c: * Examples/nsconnection_client.m: * Examples/nsconnection_server.m: * Headers/Additions/GNUstepBase/GSConfig.h.in: * Headers/Additions/GNUstepBase/GSFileHandle.h: * Headers/Additions/GNUstepBase/GSVersionMacros.h: * Headers/Additions/GNUstepBase/preface.h.in: * Headers/Foundation/NSPort.h: * Headers/Foundation/NSRunLoop.h: * Source/Additions/NSError+GNUstepBase.m: * Source/Additions/NSTask+GNUstepBase.m: * Source/cifframe.h: * Source/GSFileHandle.m: * Source/GSHTTPURLHandle.m: * Source/GSNetwork.h: * Source/GSPortPrivate.h: * Source/GSPrivate.h: * Source/GSRunLoopCtxt.h: * Source/GSRunLoopWatcher.m: * Source/GSSocketStream.m: * Source/GSStream.m: * Source/NSBundle.m: * Source/NSCalendarDate.m: * Source/NSConnection.m: * Source/NSData.m: * Source/NSDebug.m: * Source/NSException.m: * Source/NSFileManager.m: * Source/NSHost.m: * Source/NSInvocation.m: * Source/NSLog.m: * Source/NSObject.m: * Source/NSPage.m: * Source/NSPathUtilities.m: * Source/NSPipe.m: * Source/NSProcessInfo.m: * Source/NSSocketPort.m: * Source/NSSocketPortNameServer.m: * Source/NSString.m: * Source/NSTask.m: * Source/NSThread.m: * Source/NSTimeZone.m: * Source/NSURL.m: * Source/NSUserDefaults.m: * Source/objc-load.m: * Source/ObjectiveC2/blocks_runtime.m: * SSL/GSSSLHandle.m: * Tools/gdnc.m: * Tools/gdomap.c: * Tools/gspath.m: Use __MINGW__ rather than __MINGW32__ for windows tests. 2010-03-18 Richard Frith-Macdonald * Source/Additions/GSMime.m: * Headers/Additions/GNUstepBase/GSMime.h: GSMimeSMTPClient code to send emails now working ... but still very experimental. 2010-03-18 Richard Frith-Macdonald * configure.ac: * config.mak.in: * Source/ObjectiveC2/GNUmakefile: Only build objc synchronisation compatibility code if it is not already in runtime. 2010-03-17 Richard Frith-Macdonald * Source/Additions/GSMime.m: Added preliminary/experimental code for SMTP send. 2010-03-17 Richard Frith-Macdonald * configure: * configure.ac: * Headers/Additions/GNUstepBase/GSConfig.h.in: * Headers/Additions/GNUstepBase/GSVersionMacros.h: Add experimental --enable-mixedabi configure option for building with the nonfragile abi, but able to link with other code which is built with the fragile abi. 2010-03-17 Richard Frith-Macdonald * Source/NSConnection.m: Fix for memory leak ... autorelease objects returned by method in remote process because the invocation won't do it for us (we call -setReturnValue: which will have the invocation retain the object, so when it releases it again later the retain count is the same as at the point when we decoded the object, and another release is needed). I'm not certain this fix is right, but it seems ok. 2010-03-13 Yavor Doganov (tiny change) * Source/NSCalendarDate.m (outputValueWithFormat) ([-initWithString:calendarFormat:locale:]): Recognize %k as conversion format specifier. ([-descriptionWithCalendarFormat:locale:]): Update docstring. 2010-03-17 Anibal Rindisbacher * Headers/Additions/GNUstep/GNUstep.h: Tidy up casts 2010-03-16 Vincent Richomme * Source/Additions/NSFileHandle+GNUstepBase.m: * Tools/gdomap.c: Minor tweaks porting to mingw64 2010-03-16 Richard Frith-Macdonald * Source/NSCharacterSet.m: Optimise for cases when huge ranges of characters are added to a set (as suggested by Fred). 2010-03-15 Adam Fedor Source/Additions/NSFileHandle+GNUstepBase.m: Define INADDR_NONE for Solaris. 2010-03-15 Fred Kiefer * Source/NSString.m (-initWithCoder:): Handle format used for XIB encoding. 2010-03-14 Adam Fedor * Source/NSHTTPCookie.m (+requestHeaderFieldsWithCookies:): Correct format syntax. 2010-03-13 Richard Frith-Macdonald * configure.ac: Note use of nonfragile abi * configure: regenerate * Headers/Additions/GNUstepBase/GSConfig.h.in: save nonfragile abi state * Headers/Additions/GNUstepBase/GSVersionMacros.h: Fix check for nonfragile-abi state, and raise an error if the current compile doesn't atch the state used to build the base library. 2010-03-12 Richard Frith-Macdonald * Source/NSKeyedArchiver.m: Create _+clsMap lazily so it's there for subclasses even if the initialiser was not called. 2010-03-11 12:14-EST Gregory John Casamento * Source/GNUmakefile: Remove reference to synchonization.m. * Source/synchronization.m: Remove, since ObjectiveC2 has been merged. 2010-03-11 Richard Frith-Macdonald * configure: * config.mak.in: * NSCharacterSets/GNUmakefile: * Source/unix/Makefile.preamble: * Source/win32/Makefile.preamble: * Source/ObjectiveC2/Makefile.preamble: * Source/Additions/Makefile.preamble: * Source/Makefile.preamble: * SSL/Makefile.preamble: * configure.ac: * Documentation/manual/GNUmakefile: * Resources/GNUmakefile: * Examples/Makefile.preamble: * Examples/GNUmakefile: * Tools/Makefile.preamble: * Tools/make_strings/GNUmakefile.preamble: Improve setting of warning flags. 2010-03-11 Richard Frith-Macdonald * Source/NSException.m: * configure.ac: * configure: * Headers/Foundation/NSException.h: * Headers/Additions/GNUstepBase/GSConfig.h.in: Improve checks for native-objc-exception support and try to ensure that user code is build with the same settings as base. 2010-03-10 Adam Fedor * Source/NSURLProtocol.m ([_NSHTTPURLProtocol -stream:stream:event]): Add default Content-Type to POST methods if none is present. 2010-03-09 Adam Fedor * Source/NSHTTPCookie.m: Finish off implementation * Source/HSHTTPCookieStorage.m: Finish off implementation. 2010-03-10 Riccardo Mottola * /Source/ObjectiveC2/sync.m, * /Source/NSZone.h, * /Source/GSPThread.h : use proper _XOPEN_SOURCE instead of __USE_UNIX98 to enable needed thread features on glibc 2010-03-08 Roland Schwingel * Source/NSFileManager.m: implement fileSystemNumber for mswindows. 2010-03-08 Richard Frith-Macdonald * Source/NSObject.m: * Source/Additions/GSObjCRuntime.m: * Documentation/Base.gsdoc: * Headers/Additions/GNUstepBase/GSObjCRuntime.h: Add GNUSTEP_BEHAVIOR_DEBUG enovironment variable to turn on logging of the use of behaviors/overrides of class methds by a list of methods from another class. 2010-03-08 Richard Frith-Macdonald * Source/GSArray.m: Re-remove [GSMutableArray count] (GSMutableArray uses the GSArray implementation). * Source/GSDictionary.m: * Source/GSCountedSet.m: * Source/GSSet.m: Add the same sort of NSUInteger fixups that Fred added to GSArray.m * Headers/Additions/GNUstepBase/GSUnion.h: Add support for NSInteger and NSUInteger (so GSCountedSet can use them). 2010-03-07 Fred Kiefer * Source/GSArray.m: Re-add [GSMutableArray count]. Change all method parameters from int or unsigned to NSUInteger to match super classes. 2010-03-07 Richard Frith-Macdonald * Source/Additions/GSObjCRuntime.m: * Headers/Additions/GNUstepBase/GSObjCRuntime.h: Add function to add 'overrides' as a form of programmatically controlled category similar to behaviors, giving an app control over the order in which methods are added to a class. 2010-03-05 Richard Frith-Macdonald * Source/Additions/GSCompatibility.h: * Source/Additions/GSCompatibility.m: * Source/Additions/GSNextRuntime.m: Remove obsolete OSX compatibility files. 2010-03-05 Richard Frith-Macdonald * Source/GSArray.m: * Source/GSDictionary.m: * Source/NSURLProtocol.m: * Source/NSNotificationCenter.m: * Source/GSAttributedString.m: * Source/NSURL.m: * Source/NSObject.m: * Source/NSString.m: * Source/Additions/NSAttributedString+GNUstepBase.m: * Source/Additions/GSInsensitiveDictionary.m: * Source/GSString.m: * Source/NSData.m: * Source/GSValue.m: * Source/NSValue.m: * Source/NSArchiver.m: * Source/NSURLConnection.m: * Headers/Additions/GNUstepBase/GSObjCRuntime.h: Remove reference to GSObjCZone and use -zone instead. 2010-03-05 Richard Frith-Macdonald * Headers/Additions/GNUstepBase/GSObjCRuntime.h: * Source/Additions/GSObjCRuntime.m: Old 'experimental/work-in-progress' functions mostly removed ... GSAllocMethodList() GSAppendMethodToList() GSRemoveMethodFromList() GSMethodListForSelector() GSMethodFromList() GSAddMethodList() GSRemoveMethodList() Other functions rewritten in terms of the new runtime API and marked as deprecated if they add nothing. 2010-03-04 Richard Frith-Macdonald * Source/NSKeyValueObserving.m: use class_addMethod() to add setters to replacement class. 2010-03-03 Richard Frith-Macdonald * Source/NSDate.m: Fix last change to conform to coding standards. * Source/NSCalendarDate.m: Fix last change to avoid attempts to access beyond the end of the format string. 2010-03-03 Richard Frith-Macdonald * Source/ObjectiveC2/runtime.c: Fix class data copying functions to match OSX. * Source/Additions/GSObjCRuntime.m: Implement adding classes using new runtime functions. 2010-03-03 Doug Simons * Source/NSDate.m: Fix natural language date parsing to handle AM/PM. * Source/NSCalendarDate.m: Fix to %I (12-hour clock) to show midnight hour as 12, not 00. Skip over field widths while parsing in init. 2010-03-03 Richard Frith-Macdonald * Source/ObjectiveC2/runtime.c: Bugfixes for getting superclass and for adding ivars to a class. * Source/Additions/GSObjCRuntime.m: Rewrite class creation code in terms of the new runtime api. 2010-03-01 Richard Frith-Macdonald * Headers/Additions/GNUstepBase/behavior.h: * Source/Additions/behavior.m: * Source/Additions/GNUmakefile: Remove obsolete, unused, and long deprecated code. The functionality is still present in GSObjCRuntime.[hm] 2010-03-01 Richard Frith-Macdonald * Headers/Foundation/NSObjCRuntime.h: * Source/NSObjCRuntime.m: Fix NSGetSizeAndAlignment() update argument types to match lates OSX 2010-02-28 Richard Frith-Macdonald Update header files with further changes for non-fragile-abi. Also fixup some GSObjCRuntime.m functions for using the new runtime API. 2010-02-28 Thomas Gamper * runtime.c: Backport another one of David's fixes for @synchronize(class), all necessary flags now are set in objc_allocateMetaClass. 2010-02-27 Richard Frith-Macdonald * runtime.c: * sync.m: * runtime.h: Backport David's fixes for @synchronize(class), suitably modified to build with older compilers. 2010-02-27 Richard Frith-Macdonald * Source/NSObject.m: ([methodSignatureForSelector:]) remote the check (and exception) to see if the sel types are the same as the signature types, since this method is used precisesly when we think we may have a selector with the wrong type information (eg we are using KVC and generated the selector name to access an ivar and the runtime gave us a selector with the type infor for accessing an ivar of another class). Should fix bug #29015 2010-02-26 Richard Frith-Macdonald * Source/NSBundle.m: Apply suggested fix for bug #29012 2010-02-26 Richard Frith-Macdonald * Source/NSOperation.m: * Source/GSInternal.h: * Source/NSConnection.m: * Headers/Foundation/NSConnection.h: * Headers/Foundation/NSOperation.h: * Headers/Additions/GNUstepBase/GSVersionMacros.h: Rework hiding of instance variables for big classes (lots of ivars) where we expect the class lifetime to be long enough that it makes sense to hod the ivars in a private subclass. 2010-02-26 Richard Frith-Macdonald * Source/NSNetServices.m: * Source/NSURLHandle.m: * Source/NSMethodSignature.m: * Source/NSInvocation.m: * Source/NSURL.m: * Source/Additions/Makefile.preamble: * Source/Additions/NSObject+GNUstepBase.m: * Source/Additions/GSFunctions.m: * Source/Additions/NSAttributedString+GNUstepBase.m: * Source/Additions/GSInsensitiveDictionary.m: * Source/NSConnection.m: * Source/NSLock.m: * Headers/Additions/GNUstepBase/GSObjCRuntime.h: Alterations to build additions with NO_GNUSTEP defined ... after all, they should be able to build like that on OSX with the Apple Foundation. 2010-02-25 Richard Frith-Macdonald * Source/NSIndexPath.m: * Source/NSTimeZone.m: * Source/NSURLCredential.m: * Source/GSSocketStream.m: * Source/NSURLHandle.m: * Source/NSTimer.m: * Source/NSScanner.m: * Source/NSDistributedNotificationCenter.m: * Source/NSSocketPort.m: * Source/NSAttributedString.m: * Source/NSRunLoop.m: * Source/NSMethodSignature.m: * Source/GSRunLoopWatcher.m: * Source/GSArray.m: * Source/GSFFCallInvocation.m: * Source/NSKeyValueMutableSet.m: * Source/GSStream.m: * Source/NSKeyedArchiver.m: * Source/unix/NSStream.m: * Source/NSKeyedUnarchiver.m: * Source/NSDistributedLock.m: * Source/NSKeyValueObserving.m: * Source/GSHTTPURLHandle.m: * Source/NSURLCredentialStorage.m: * Source/NSPort.m: * Source/GSFFIInvocation.m: * Source/NSMessagePort.m: * Source/GSDictionary.m: * Source/win32/GSFileHandle.m: * Source/win32/NSMessagePort.m: * Source/win32/NSStream.m: * Source/GSCountedSet.m: * Source/NSUnarchiver.m: * Source/NSInvocation.m: * Source/NSURLProtocol.m: * Source/GSAttributedString.m: * Source/NSKeyValueMutableArray.m: * Source/NSException.m: * Source/NSCopyObject.m: * Source/NSURL.m: * Source/NSObject.m: * Source/NSString.m: * Source/Additions/NSFileHandle+GNUstepBase.m: * Source/Additions/GCDictionary.m: * Source/Additions/GCArray.m: * Source/Additions/GSXML.m: * Source/Additions/GSInsensitiveDictionary.m: * Source/Additions/GSLock.m: * Source/GSSet.m: * Source/NSNotification.m: * Source/NSNumber.m: * Source/GSString.m: * Source/NSConnection.m: * Source/NSAutoreleasePool.m: * Source/NSThread.m: * Source/NSData.m: * Source/NSHost.m: * Source/NSDate.m: * Source/GSValue.m: * Source/NSValue.m: * Source/NSCountedSet.m: * Source/GSFileHandle.m: * Source/NSLock.m: * Source/NSSet.m: * Source/NSCharacterSet.m: * SSL/GSSSLHandle.m: Always DESTROY(self) rather than RELEASE(self) so that the pointer is nil if/when another method is called from the method where self was potentially deallocated. This is so that the libobjc2 runtime doesn't try dereferencing self when it points to a deallocated object. 2010-02-25 Richard Frith-Macdonald * configure.ac: * configure: * Headers/Additions/GNUstepBase/config.h.in: * Source/NSString.m: Update printf handling for very latest glibc 2010-02-25 Richard Frith-Macdonald * configure.ac: Add test for socklen_t type * configure: regenerate * Headers/Additions/GNUstepBase/config.h.in: regenerate * Source/GSNetwork.h: * Source/NSSocketPort.m: Fix for socklen_t * Source/NSMapTable.m: * Source/GSHTTPURLHandle.m: * Source/NSConcreteMapTable.m: * Source/NSConcreteHashTable.m: * Headers/Foundation/NSHashTable.h: * Headers/Foundation/NSMapTable.h: Use NSUInteger values for OSX API compatibility 2010-02-25 Richard Frith-Macdonald * Source/ObjectiveC2/runtime.c: * Source/ObjectiveC2/blocks_runtime.m: Avoid compiler warnings. 2010-02-25 Richard Frith-Macdonald * Source/NSAssertionHandler.m: * Source/NSObject.m: * Source/Additions/NSDebug+GNUstepBase.m: * Source/Additions/GSMime.m: * Source/Additions/NSObject+GNUstepBase.m: * Headers/Foundation/NSObject.h: * Headers/Additions/GNUstepBase/NSObject+GNUstepBase.h: Remove a few old deprecated methods and move others to the additions library. Make GSMime build on OSX 2010-02-23 Riccardo Mottola * Source/ObjectiveC2/runtime.h: provide gcc-style macros * Source/ObjectiveC2/sync.m: removed c99-ism 2010-02-23 Fred Kiefer * Source/NSNumber.m: Autorelease the values returned by the numberWithXXX: methods. 2010-02-22 Wolfgang Lux * Source/NSSpellServer.m (-isWordInUserDictionaries:caseSensitive:): Make sure word is checked against the current list of ignored words regardless of whether the user (already) has a set of learned words in the current language. 2010-02-22 Wolfgang Lux * Source/Additions/Unicode.m (GSToUnicode): Fix my own bug fix to avoid potential null pointer dereferences, as that fix could lead to attempts to free() memory on the stack. 2010-02-22 Richard Frith-Macdonald * Source/NSIndexPath.m: * Source/NSPortCoder.m: * Source/NSCalendarDate.m: * Source/NSPropertyList.m: * Source/GSConcreteValueTemplate.m: * Source/NSScanner.m: * Source/GSFFCallInvocation.m: * Source/NSKeyValueObserving.m: * Source/NSSortDescriptor.m: * Source/GSFFIInvocation.m: * Source/NSUnarchiver.m: * Source/NSInvocation.m: * Source/NSFileManager.m: * Source/NSString.m: * Source/NSObject.m: * Source/NSConcreteMapTable.m: * Source/Additions/GSObjCRuntime.m: * Source/GSSet.m: * Source/GSString.m: * Source/NSConnection.m: * Source/NSAutoreleasePool.m: * Source/NSData.m: * Source/NSDate.m: * Source/NSProxy.m: * Source/NSObjCRuntime.m: * Source/NSProtocolChecker.m: * Source/GSValue.m: * Source/NSSerializer.m: * Source/NSCountedSet.m: * Source/NSSet.m: * Source/NSDistantObject.m: * Source/NSArchiver.m: * Source/NSCharacterSet.m: * Source/NSConcreteHashTable.m: * Headers/Additions/GNUstepBase/NSDebug+GNUstepBase.h: * Headers/Additions/GNUstepBase/GSObjCRuntime.h: Deprecate some GS... runtime wrappers in favour of using the new ObjC2 API where we have emulation for systems which are actually usig the old API. Work in progress. 2010-02-21 Richard Frith-Macdonald * Source/GSString.m: Fix incorrectly initialized zone ivar. Foixes bug #28939 2010-02-20 Richard Frith-Macdonald * Headers/Foundation/NSURL.h: * Headers/Foundation/NSObject.h: * Headers/Foundation/NSString.h: * Headers/Foundation/NSCalendarDate.h: * Headers/Foundation/NSBundle.h: * Headers/Foundation/NSProcessInfo.h: * Headers/Foundation/NSAttributedString.h: * Headers/Foundation/NSUserDefaults.h: * Headers/Foundation/NSThread.h: * Headers/Foundation/NSData.h: * Headers/Foundation/NSArray.h: * Headers/Foundation/NSDebug.h: * Headers/Foundation/NSFileHandle.h: * Headers/Foundation/NSValue.h: * Headers/Foundation/NSLock.h: * Headers/Foundation/NSTask.h: * Headers/Additions/GNUstepBase/GSVersionMacros.h: * Headers/Additions/GNUstepBase/GSObjCRuntime.h: Modified the sense of the 'NO_GNUSTEP' preprocessor constant slightly. It is now always defined (GSVersionMacros.h defines it to zero if it was not defined externally). A sbefore, defining it to 1 should prevent the inclusion of GNUstep specific headers. This change should make it easy for us to change the default behavior at a later date. 2010-02-20 Richard Frith-Macdonald * Source/Makefile.postamble: * Source/GNUmakefile: * configure.ac: * configure: * Headers/Additions/GNUstepBase/GSConfig.h.in: * Headers/Additions/GNUstepBase/GSObjCRuntime.h: Make runtime.h objc2 compatibility header available in installed headers if we are using objc2 compatibility in base. 2010-02-19 Richard Frith-Macdonald * Source/NSConcreteNumber.h: Remove unused file * Source/NSNumberMethods.h: * Source/NSNumber.m: * Source/GSNumberTypes.h: Updates to match OSX behavior. 2010-02-19 Richard Frith-Macdonald * configure.ac: Add check for ObjC2 support in runtime. * config.mak.in: define OBJC2RUNTIME to yes or no * configure: regenerate * Source/GNUmakefile: Build/link ObjectiveC2 compat code if needed * Source/ObjectiveC2/Availability.h: * Source/ObjectiveC2/runtime.c: * Source/ObjectiveC2/GNUmakefile: * Source/ObjectiveC2/properties.m: * Source/ObjectiveC2/sync.m: * Source/ObjectiveC2/blocks_runtime.m: Attempt to build in ObjectiveC2 compatibility functions when we don't have an ObjC2 runtime. 2010-02-19 Richard Frith-Macdonald Simplify header imports with common headers handled in the correct order. 2010-02-18 Richard Frith-Macdonald * Headers/Additions/GNUstepBase/NSDebug+GNUstepBase.h: * Headers/Additions/GNUstepBase/NSThread+GNUstepBase.h: * Source/Additions/NSDebug+GNUstepBase.m: * Source/Additions/NSThread+GNUstepBase.m: * Headers/Additions/GNUstepBase/Additions.h: * Headers/Foundation/Foundation.h: * Headers/Foundation/NSDebug.h: * Headers/Foundation/NSThread.h: * Source/Additions/GNUmakefile: * Source/DocMakefile: * Source/GNUmakefile: * Source/NSDebug.m: * Source/NSOperation.m: Move some gnustep specific extensions into additions library so they can be used to port apps to OSX in future (when the additions library builds on OSX again). 2010-02-18 Richard Frith-Macdonald * SSL/configure.ac: Check for latest thread ID callback * SSL/configure: regenerate * SSL/GSSSLHandle.m: Add thread-safety support callbacks. 2010-02-18 Richard Frith-Macdonald * Source/GNUmakefile: * Headers/Foundation/NSURL.h: * Headers/Foundation/NSObject.h: * Headers/Foundation/NSString.h: * Headers/Foundation/NSCalendarDate.h: * Headers/Foundation/NSBundle.h: * Headers/Foundation/Foundation.h.install: * Headers/Foundation/NSProcessInfo.h: * Headers/Foundation/NSAttributedString.h: * Headers/Foundation/NSData.h: * Headers/Foundation/NSArray.h: * Headers/Foundation/NSFileHandle.h: * Headers/Foundation/NSValue.h: * Headers/Foundation/NSLock.h: * Headers/Foundation/NSTask.h: * Tools/GNUmakefile: Have standard foundation headers include any corresponding GNUstep extension headers unless NO_GNUSTEP is defined (building code with strict OSX compatibility) or GNUSTEP_BASE_INTERNAL is defined (building the base library etc itsself, and needing to ensure we don't accidentally include installed headers from a previous version). 2010-02-18 Richard Frith-Macdonald * Source/NSSpellServer.m: * Source/NSMethodSignature.m: * Source/NSString.m: * Headers/Foundation/NSSpellServer.h: * Headers/Foundation/NSObjCRuntime.h: Fix minor 64bit compatribility errors spotted by Fred. 2010-02-18 Richard Frith-Macdonald * configure.ac: remove obsolete checks for integer limits constants * Headers/Additions/GNUstepBase/config.h.in: regenerate * configure: regenerate * Source/NSScanner.m: * Source/NSNumber.m: * Source/GSFormat.m: New code to define LLONG_MAX,LLONG_MIN,ULLONG_MAX in terms of __LONG_LONG_MAX__ where they are not found in the normal location. 2010-02-16 Richard Frith-Macdonald * Headers/Additions/GNUstepBase/GSXML.h: * Source/Additions/GSXML.m: new method to allow an additional DTD directory to be set for the parser. * Tools/autogsdoc.m: Add flag to allow command line setting of extra DTD directory. * Source/DocMakefile: Set extra DTD directory to the Tools directory so that gsdoc DTDs can be found even when they haven't been installed. 2010-02-16 Niels Grewe * Source/Additions/GSXML.m: Modify to use default catalog when GNUstep specific information cannot be found. 2010-02-16 Richard Frith-Macdonald * Source/NSDistantObject.m: Cache method signatures to avoid asking remote end for them repeatedly. 2010-02-16 Wolfgang Lux * Source/Additions/Unicode.m (GSToUnicode): Fix bug where GSToUnicode attempted to read from a null pointer. 2010-02-15 Richard Frith-Macdonald Various reorganisation tweaks. Enable NSInteger/NSUInteger/CGFloat support at last. 2010-02-15 Fred Kiefer * Source/NSAttributedString.m: Implement keyed decoding for multiple attributes correctly. Based on code by Nikolaus Schaller . 2010-02-14 David Chisnall Rewrote NSNumber implementation. 2010-02-14 Richard Frith-Macdonald Major change merge back of 'reorg' branch into trunk. The gross changes are: 1. reorganisation of categories for additional non OSX methods into separate files in the Additions library. 2. changes to headers to hide instance variables if we are using the non-fragile-abi with clang. 3. additions of a void* instance variable for future expansion to almost all classes (avoid the fragile ivar issue). 4. various code changes to support the nonfragile-abi (the use of @defs is no longer allowed). NB. This revision breaks binary compatibility ... all code using base needs to be rebuilt. However, future releases of the base library should all maintain abi compatibility with the first release based on these changes (at least, as far as class instance size issues are concerned). 2010-02-12 Richard Frith-Macdonald * configure.ac: Remove a couple of obsolete tests and add a couple for new runtime features. * config/config.objc_condition_timed_wait.c: remove * config/config.non-fragile-ivars.m: add * configure: regenerate * Headers/Additions/GNUstepBase/config.h.in: regenerate 2010-02-11 Nicola Pero * Source/Makefile.postamble: Removed obsolete manual dependency rules. Dependencies of object files on header files are automatically computed by gnustep-make, so these rules were superfluous. * Source/GNUmakefile: Compile Additions as a subproject before the two libraries that are built on top of it. This will prevent problems when libraries from the same GNUmakefile are built in parallel. * Source/GNUmakefile (GNUmakefile.local): Do not try including this non-existing file. * Examples/GNUmakefile: Same change. * NSTimeZones/GNUmakefile: Same change. * Resources/GNUmakefile: Same change. * SSL/GNUmakefile: Same change. * Tools/GNUmakefile: Same change. 2010-02-11 07:37-EST Gregory John Casamento * install.sh: Removed configure. 2010-02-09 Riccardo Mottola * Source/NSOperation.m: Move declaration upwards to fix compile error. 2010-02-09 Richard Frith-Macdonald * Source/GSAttributedString.m: * Source/Additions/GSCategories.m: * Headers/Foundation/NSString.h: * Headers/Additions/GNUstepBase/GSCategories.h: Re-instated the immutableProxy mathod, but as a clean category on NSMutableString in the additions library. Use for the -string method of NSAttributedString 2010-02-08 Richard Frith-Macdonald * Source/NSAttributedString.m: minor cosmetic change * Source/GSAttributedString.m: Re-introduce proxy for -string and comment to try to avoid it being accidentally removed again. * Source/GSString.m: Fixups to work properly with string proxies. * Source/NSException.m: Re-instate correct behavior and make the comment about it more emphatic. 2010-02-08 Jonathan Gillaspie * Source/NSException.m * Removed redundant call to _NSFoundationUncaughtExceptionHandler and added else blocks to allow a set uncaught exception handler to NOT exit if capable of recovering. 2010-02-08 Richard Frith-Macdonald * Headers/Foundation/NSOperation.h: * Source/NSOperation.m: Complete implementation of NSOperationQueue (OSX 10.6 apart from the methods using objc2 blocks). 2010-02-06 Richard Frith-Macdonald * Headers/Foundation/NSOperation.h: * Source/NSOperation.m: Partial implementation of NSOperationQueue (OSX Leopard functionality plus a little of Snow Leopard). 2010-02-05 Riccardo Mottola * Headers/Additions/GNUstepBase/GSIMap.h: fixed c99-ism * Headers/Additions/GNUstepBase/GSBlocks.h : provide gcc 2.95 variadic macro 2010-02-04 Richard Frith-Macdonald * Headers/Foundation/NSOperation.h: * Source/NSOperation.m: Implement and document the NSOperation class. As OSX 10.6 minus the objc2 specific 'block' methods. 2010-02-04 Richard Frith-Macdonald * Source/NSLock.m: cleanup indentation etc, and apply fix suggested by David Ayers 2010-02-04 Jonathan Gillaspie * Source/NSLock.m: ([lockWhenCondition:beforeDate:]) Switched to use timeIntervalSince1970. added a loop to lockWhenCondition since pthread_cond_timedwait can return to delay expiring. Hold the lock on a delayed acquire (and YES return). ([tryLockWhenCondition:]) No longer reports a deadlock when we already have the lock, now just returns NO. 2010-02-03 Richard Frith-Macdonald * Source/NSThread.m: Don't use usleep() on windows .. it performas a busy wait so the Sleep() function is better. 2010-02-01 Richard Frith-Macdonald * Source/NSAutoreleasePool.m: * Source/NSThread.m: Tweaks to try and get default thread correctly terminated on exit. 2010-01-30 Fred Kiefer * Source/NSPropertyList.m (GSBinaryPLParser -rootObject, -initWithData:mutability:): Get root index from the binary property list data and use this to return the root object. 2010-01-24 Richard Frith-Macdonald * configure.ac: Option for using libbfd for stack traces * configure: regenerate * Headers/Additions/GNUstepBase/config.h.in: regenerate * Source/NSException.m: Re-instate code for using libbfd to provide symbolic stack traces (because the backtrace_symbols function doesn't work on most platforms). Add warning about the fact that this alters the license of the library. 2010-01-23 Niels Grewe * Source/GSFFCallInvocation.m: * Source/NSZone.m: * Source/Additions/GSObjCRuntime.m: * Source/Additions/GCObject.m: * Source/synchronization.m: * Source/GSPThread.h: * Headers/Additions/GNUstepBase/GSObjCRuntime.h: Updates for switch to using pthreads 2010-01-21 Eric Wasylishen * Headers/Foundation/NSObjCRuntime.h: define CGFLOAT_DEFINED when defining CGFloat. Also check that NSINTEGER_DEFINED and CGFLOAT_DEFINED are undefined before defining NSInterger and CGFloat. 2010-01-21 16:20-EST Gregory John Casamento * install.sh: Add --with-installation-domain=SYSTEM to the script to allow automated build on Windows. 2010-01-20 Richard Frith-Macdonald * Source/NSTask.m: Always remove task from controlling terminal, not just when using pseudo-terminals. This is compatible with OSX behavior (testcase added to the testsuite). Also remove some redundant/duplicate code 2010-01-11 Quentin Mathe * Source/NSFormatter.m (-copyWithZone:, -initWithCoder:, -encodeWithCoder:): Removed the subclass responsibility, in order to have subclasses automatically coding and copying compliant as Cocoa does. You can also now safely call [super copyWithZone:/initWithCoder:] in a subclass. 2010-01-11 Richard Frith-Macdonald * Source/NSMapTable.m: * Source/NSHashTable.m: * Source/NSPropertyList.m: * Source/GSStream.m: * Source/NSURLResponse.m: * Source/NSPointerArray.m: * Source/Additions/GSMime.m: * Source/NSURLRequest.m: Fix mistaken strategy for avoiding clang warnings. 2010-01-11 Fred Kiefer * Source/NSConcreteMapTable.m (NSCreateMapTableWithZone): Set the concreteClass, when this isn't already set. 2010-01-10 Richard Frith-Macdonald * Source/NSMapTable.m: * Source/NSHashTable.m: * Source/NSPropertyList.m: * Source/NSScanner.m: * Source/GSArray.m: * Source/GSStream.m: * Source/NSPredicate.m: * Source/GSHTTPURLHandle.m: * Source/NSURLResponse.m: * Source/NSPointerArray.m: * Source/Additions/GSCategories.m: * Source/Additions/GSMime.m: * Source/NSData.m: * Source/NSSerializer.m: * Source/NSURLRequest.m: * Source/GSFormat.m: * Source/NSXMLParser.m: * SSL/GSSSLHandle.m: * Tools/sfparse.m: * Tools/gdnc.m: * Tools/gdomap.c: * Tools/pl.m: * config/config.loadtest.m: Tweaks towards making base build/work better with clang 2010-01-09 Richard Frith-Macdonald * Source/NSCharacterSetData.h: * NSCharacterSets/newlineCharSet.dat: Add VT ad FF as newline characters for OSX compatibility as suggested by Eric. 2010-01-09 Richard Frith-Macdonald * configure.ac: * Source/NSException.m: * Headers/Additions/GNUstepBase/config.h.in: * config/config.unexpected.m: * config/config.set_unexpected.m: * configure: Modified to suppport native exceptions with libobjc2 which is missing the objc_set_unexpected() function and just uses direct assignment of a function pointer. 2010-01-05 Eric Wasylishen * Headers/Foundation/NSCharacterSet.h * Source/NSCharacterSet.m * Source/NSCharacterSetData.h: Implement +[NSCharacterSet newlineCharacterSet]. This includes rebuilding NSCharacterSetData as described in the mkcharsets README. Note that the Apple docs count 0x000B (vertical tab) and 0x000C (form feed) as newline characters, and include them in newlineCharacterSet and whitespaceAndNewlineCharacterSet, while GNUstep does not at the moment. 2009-12-29 David Chisnall * Source/GSDictionary.m * Source/NSDictionary.m * Headers/Foundation/NSDictionary.h Added fast enumeration support to GSDictionary, and GSMutableSet. * Source/GSSet.m * Source/GSCountedSet.m * Source/NSSet.m * Headers/Foundation/NSSet.h Added fast enumeration support to GSSet, GSMutableSet, and GSCountedSet * Headers/Additions/GNUstepBase/GSIMap.h Added function for implementing fast enumeration with GSIMaps. 2009-12-27 David Chisnall * Source/NSArray.m * Headers/Foundation/NSArray.h Added some block method implementations. * Headers/Foundation/NSObjCRuntime.h Added constants for enumeration. 2009-12-27 David Chisnall * Source/GSFastEnumeration.h: Added macros implementing for..in loops. 2009-12-27 David Chisnall * Headers/Additions/GNUstepBase/GSBlocks.h: Added block macros. 2009-12-23 Wolfgang Lux * Source/NSUndoManager.m (_canCoalesceUndoWithTarget:selector:object): Auxiliary method to support coalescing undo operations in NSTextView. 2009-12-22 17:15-EST Gregory John Casamento * Source/NSObject.m: Conditionally compile weak attribute for Windows since it is not supported by the win32 linker. 2009-12-20 David Chisnall * Source/NSObject.m: Set block superclass. 2009-12-19 13:53-EST Gregory John Casamento * Source/GNUmakefile: Add synchronization.m to GNU_MFILES and correct some formatting. * Source/synchronization.m: Fix @synchronize support on Windows. The __weak__ attribute doesn't work on Windows. 2009-12-11 01:44-EST Gregory John Casamento * Source/synchronization.m: Corrected header text. 2009-12-07 Richard Frith-Macdonald * Source/GSString.m: Use -hash from GSString rather than from NSString to optimise hashing. Fix string comparison error as pointed out by Doug Simons. 2009-12-02 Richard Frith-Macdonald * Source/NSMessagePortNameServer.m: * Source/NSMessagePort.m: On initialisation, remove any old ports/names for the current process idntifier. Also remove ports/names for processes which don't exist. Avoids any possibility of nameserver confusion between two processes with the same ID. 2009-12-01 Richard Frith-Macdonald * Source/NSMessagePortNameServer.m: Tolerate '*' host name. * Source/NSConnection.m: Clarify documentation slightly. * NSSocketPort.m: * win32/GSFileHandle.m: Fixup missing notification changes. 2009-11-27 Richard Frith-Macdonald * Source/NSNotificationQueue.m: Rewrite queue handling to attempt to fix bug #28104 by posting notifications matching the current run loop mode and leaving others queued. Also, change the meanining of a nil modes argument when enqueing a notification to match OSX and assume NSDefaultRunLoopMode. * Source/Additions/GSXML.m: Fix minor sax callback bug. * Source/NSConnection.m: Don't send a response packet if the method is oneway void return type and has no output parameters. 2009-11-27 Richard Frith-Macdonald * Source/NSPropertyList.m: When serializing 'xml' style property lists call -description to ensure that dictionary keys are strings since no other option is permitted in the dtd. 2009-11-27 Richard Frith-Macdonald * Source/NSNotificationQueue.m: * Source/NSRunLoop.m: * Source/unix/GSRunLoopCtxt.m: * Source/win32/GSRunLoopCtxt.m: * Source/GSPrivate.h: Pass current runloop mode to notification functions. Next we need to add code to use this information. 2009-11-26 Richard Frith-Macdonald * Source/NSPropertyList.m: Revert last change, which broke XML generation by placing illegal character entities in the output. Fix menu position problem by adding missing code to unescape the /U escapes we put in the output when we read back in again. NB. should check that we use character entities for all legal characters and only use the escape mechanism for *really* illegal ones (such as the menu location key). 2009-11-26 Wolfgang Lux * Source/NSPropertyList.m (XString): Write out proper XML encoding for control characters. Fixes a bug where menu positions in GUI programs would appear not persistent. 2009-11-24 Richard Frith-Macdonald * Source/GSFFIInvocation.m: make better guess when forward2 is not available in runtime. 2009-11-23 Richard Frith-Macdonald * Source/NSObject.m: Remove spurious semicolons * Source/NSConnection.m: autogsdoc ignore confusing section * Source/NSLock.m: autogsdoc ignore (just use header) * Tools/AGSParser.m: add feature to ignore sections * Tools/autogsdoc.m: document new ignore markup 2009-11-04 Richard Frith-Macdonald * Source/NSAutoreleasePool.m: ([-drain]) Copy undocumented OSX behavior calling -release (suggested by Christopher James Elphinstone Chandler). 2009-10-26 Adam Fedor * Source/Makefile.postamble: Add flag filter for libgnustep-base-entry.m (for GCC 4.4 on MinGW). 2009-10-20 Wolfgang Lux * Source/NSObject.m (NSIncrementExtraRefCount): Properly release allocation lock. 2009-10-12 Richard Frith-Macdonald * Source/NSProcessInfo.m: * Headers/Foundation/NSProcessInfo.h: * Tools/gspath.m: * Tools/plmerge.m: * Tools/xmlparse.m: * Tools/sfparse.m: * Tools/plparse.m: * Tools/pldes.m: * Tools/defaults.m: * Tools/plget.m: * Tools/pl2link.m: * Tools/gdnc.m: * Tools/plser.m: * Tools/autogsdoc.m: * Tools/HTMLLinker.m: * Tools/cvtenc.m: Add function for easy process initialisation when the automatic mechanisms don't work (eg calling ObjC code from within a C or C++ application). 2009-10-11 Eric Wasylishen * Source/NSKeyValueObserving.m: add setters for common structures. 2009-10-10 Richard Frith-Macdonald * Headers/Foundation/NSString.h: * Source/NSString.m: * Source/GSString.m: Remove obsolete immutable proxy method. * Source/NSIndexPath.m: * Source/NSDistributedNotificationCenter.m: * Source/NSAttributedString.m: * Source/GSArray.m: * Source/GSFFCallInvocation.m: * Source/GSFFIInvocation.m: * Source/GSAttributedString.m: * Source/NSConnection.m: * Source/NSThread.m: Replace unnecessary calls to NSDeallocateObject(). 2009-10-07 Adam Fedor * configure.ac: Add librt for sched_yield on solaris. 2009-10-05 Richard Frith-Macdonald * configure.ac: enable ffcall if ffi is disabled * configure: Regenerate * Source/mframe:delete * Source/mframe.m: delete * Source/GSInvocation.h: * Source/GNUmakefile: * Source/NSMethodSignature.m: * Source/GSFFCallInvocation.m: * Source/NSKeyValueObserving.m: * Source/GSFFIInvocation.m: * Source/NSInvocation.m: * Source/cifframe.m: * Source/NSConnection.m: * Source/callframe.m: * Source/NSDistantObject.m: * Headers/Foundation/NSMethodSignature.h: * Headers/Foundation/NSInvocation.h: Update for removal of mframe code. 2009-10-04 Richard Frith-Macdonald * Source/GNUmakefile: * Source/NSMethodSignature.m: * Source/GSFFCallInvocation.m: * Source/mframe/mframe.head: * Source/GSFFIInvocation.m: * Source/NSInvocation.m: * Source/cifframe.h: * Source/mframe.m: * Source/cifframe.m: * Source/NSConnection.m: * Source/callframe.h: * Source/NSObjCRuntime.m: * Source/callframe.m: * Headers/Additions/GNUstepBase/DistributedObjects.h: * Headers/Additions/GNUstepBase/preface.h.in: Remove lots of obsolete code as part of the ong term process of scrapping the old mframe stuff. 2009-10-04 Richard Frith-Macdonald * Source/cifframe.h: Remove unused code * Source/cifframe.m: ditto * Source/callframe.h: ditto * Source/callframe.m: ditto * Source/NSConnection.m: Use NSInvocation functionality directly rather than duplicated versions of the code in ffi/ffcall/mframe specific files. Should simplify things and make maintenance easier. 2009-10-03 Richard Frith-Macdonald * Source/GSInvocation.h: * Source/GSFFIInvocation.m: * Source/NSInvocation.m: Fix to always store return value in memory owned by the GSFFIInvocation object. Fix for bug #27233 2009-10-03 Richard Frith-Macdonald * Source/NSConnection.m: Don't allow the root object of a connection to be released simply because the remote proxy is released ... the connection itsself may have been retained at the remote end, and the code there may call the -rootProxy method and start sending messages to it again. Fix for bug #27128 2009-10-01 Richard Frith-Macdonald * Source/NSPortCoder.m: * Source/NSKeyedArchiver.m: * Source/NSConcreteMapTable.m: * Source/NSConnection.m: * Source/NSSerializer.m: * Source/NSArchiver.m: * Source/NSConcreteHashTable.m: * Headers/Additions/GNUstepBase/GSIMap.h: Explicitly specify types present in GSIUnion 2009-09-30 Richard Frith-Macdonald * Source/NSLock.m: Fix BOOL methods to return YES or NO. * Source/win32/GSFileHandle.m: Implement nul device handle. * Source/NSTask.m: Try to avoid annoying colsole window with mingw32 * Source/GSLocale.m: Try to handle locale setup in non-utf8 locales. 2009-09-27 Richard Frith-Macdonald * Source/win32/GSFileHandle.m: * Source/win32/NSMessagePort.m: * Source/win32/GSRunLoopCtxt.m: * Source/win32/NSStream.m: * Source/win32/NSMessagePortNameServer.m: * Source/NSPipe.m: * Source/NSTask.m: Fixes to try and improve subtask handling on windows. 1. change scheme to create all handles as not inheritable, and just make the handles we want the child to have inheritable while we are launching the child. 2. peek the data on pipes and refrain from notifying about data availability if the pipe doesn't really have data. This is horrid and means we poll pipes ... I guess we really need to be doing async reads instead ... perhaps someone can do that based on the code in Source/win32/NSMessagePort.m which already does it. 2009-09-23 Richard Frith-Macdonald * Source/NSURL.m: OSX compatibility tweaks ... allows initialisation using a string containing a simple path without any scheme. 2009-09-17 Richard Frith-Macdonald * Source/NSIndexSet.m: ([-shiftIndexesStartingAtIndex:by:]) fix to properly merge index ranges when shifting left. 2009-09-15 Richard Frith-Macdonald * Headers/Additions/GNUstepBase/GSMime.h: * Source/Additions/GSMime.m: Add new -excess method to return any excess data left over from parsing. Previously the code just used to NSLog() this data as a warning. 2009-09-14 Richard Frith-Macdonald * Source/NSCalendarDate.m: Workaround for bug in some linux SMP systems * Source/NSConnection.m: fix for bug #27446 2009-09-12 Richard Frith-Macdonald * Source/NSCalendarDate.m: Add optional diagnostics to detect system time changes and warn about them. * Source/NSException.m: Clean up to match coding standards. Fix uninitialised variable bug. * Source/NSObject.m: clean up and fix missing dealloc. * Headers/Foundation/NSURLCredential.h: * Headers/Foundation/NSHTTPCookieStorage.h: * Headers/Foundation/NSException.h: * Headers/Foundation/NSValueTransformer.h: * Headers/Foundation/NSURLAuthenticationChallenge.h: * Headers/Foundation/NSObject.h: * Headers/Foundation/NSString.h: * Headers/Foundation/NSStream.h: * Headers/Foundation/NSThread.h: * Headers/Foundation/NSHTTPCookie.h: * Headers/Foundation/NSURLError.h: * Headers/Foundation/NSURLProtectionSpace.h: * Headers/Foundation/NSURLDownload.h: * Headers/Foundation/NSKeyValueObserving.h: * Headers/Foundation/NSURLRequest.h: * Headers/Foundation/NSURLCredentialStorage.h: * Headers/Foundation/NSInvocation.h: * Headers/Foundation/NSURLResponse.h: * Headers/Foundation/NSURLConnection.h: * Headers/Foundation/NSIndexPath.h: * Headers/Foundation/NSURLProtocol.h: * Headers/Foundation/NSURLCache.h: * Headers/Additions/GNUstepBase/GSVersionMacros.h: Fix up errors in version of feature addition to GNUstep. Some GNUstep version constants had leading zeros so they were interpreted as octal rather than decimal. 2009-09-11 David Chisnall * Source/NSException.m: *Headers/Foundation/NSException.h: Rewrote exception callstack generation to use the backtrace() and backtrace_symbols() code. Implemented the -callStackSymbols method from 10.5 using this. For this to be enabled, the configure script will require a small modification, which Gregory will add later. 2009-09-10 David Chisnall * Source/GSFFIInvocation.m: * Source/NSObject.m: * Headers/Foundation/NSObject.h: Added implementations of the hooks provided by the new runtime. This brings NSObject up to feature-parity with the OS X 10.5 implementation when using the new runtime and up to feature-parity with the 10.6 implementation if you are using the new runtime and compiling with clang. Also removes the objc_mutex_wibble stuff from NSObject in favour of just using NSLocks (which, with the new implementation, are now faster than using objc_mutex_stuff). 2009-09-10 Richard Frith-Macdonald * Source/NSRunLoop.m: ([-limitDateForMode:]) on OSX it seems that only one timer fires each time this method is invoked ... so I rewrote this method to only fire one timer (excluding the private housekeeping one). Changing to only fire one timer actually allows the code to be simpler so it's a good update in its own right, not just a OSX compatibility tweak. I also made incrementing repeated timers a bit more robust, checking that they provide a valid increment time interval and removing them from the loop if they don't. * Source/NSTimer.m: slightly tidy/clarify initialisation code and documentation. 2009-09-08 Richard Frith-Macdonald * configure.ac: * configure: * config.mak.in: * Source/GNUmakefile: Attempt to tidy up config now that pthreads are mandatory. * Source/NSThread.m: Fix various bugs related to thread exit, Prevent crashes at program termination ...nastily obvious on mingw. * Source/Additions/GSLock.m: Remove -dealloc implementations which called -finalize, since the superclass implementationd does that too, and finalizing twice is a bad, bad thing. 2009-09-07 Richard Frith-Macdonald * Headers/Foundation/NSConnection.h: * Source/NSConnection.m: Remove ivars from public header. Improve debug by reporting the connections's registered name and/or the name of the remote port it is connecting to. 2009-09-07 Richard Frith-Macdonald * Source/NSRunLoop.m: * Source/GSRunLoopCtxt.h: Add some logging to help debug problems where code is adding too many events into a run loop. 2009-09-06 Richard Frith-Macdonald * Source/NSLock.m: Fix the ([-tryLock]) and [(-lockBeforeDate:]) implementations for NSLock and NSCondictionLock to return NO for recursive locking. Fix to only initialise mutex attributes once (to avoid leaking a set of attributes with every lock created on platforms where attributes need to be destroyed when no longer used). Reorganise to make it easy to replace method implementations. Fix for bug #25444 ... OSX compatibility change. 2009-09-06 Richard Frith-Macdonald * Source/NSRunLoop.m: Fix for rare problem if someone changes the system time backwards. * configure.ac: Check for pthread.h and type sizes. Insist on having pthread.h in order to build, now that it is a requirement. * configure: Regenerate * Headers/Additions/GNUstepBase/GSConfig.h.in: Declare abstract types. * Source/NSLock.m: including pthread.h * Headers/Foundation/NSLock.h: Avoid including pthread.h Basically, insist on finding pthread.h at configure time, and get size of essential types so we can avoid exposing them directly in our public headers. This should discourage developers from using things they shouldn't, but it does not solve the issue that copies of the base library built with different pthread implementations on the same platform may have binary incompatible NSLock classes (with respect to subclassing as the pthread specific ivars differ in size). However this is *really* unlikely to be an issue in practice. 2009-09-05 David Chisnall * Source/NSEnumeration.m: Added enumeration mutation callback. 2009-09-03 Richard Frith-Macdonald * Source/NSLock.m: Fix a few variable declarations to work with older compilers. Fix indentation/whitespace for coding standards consistency. * Source/NSURLProtocol.m: Fix attempt to use deallocated stream. 2009-09-01 David Chisnall * Source/NSLock.m * Headers/Foundation/NSLock.h Completely rewritten implementations of NSLock.h classes. These are now faster, more complete, OS X-compatible, and most importantly actually work. The old ones, for example, called functions that were not implemented on Windows. * Source/NSThread.m Call pthread functions directly in NSThread instead of via the libobjc abstraction layer. Also fixed a few issues, such as GC not being initialized properly for NSThread subclasses that override -main (Javaism supported by OS X) and tidies up the code in several places, removing premature optimizations, especially those that introduce a test for an unlikely case at the start of a method and thus slow everything down. As a result of this change, GNUstep now depends on an implementation of POSIX threads. This is included as standard on all modern UNIX systems, and as an option on less-modern UNIX systems and non-UNIX systems, including Windows. If you are building GNUstep on Windows, please install the pthreads-win32 package, available from: http://sourceware.org/pthreads-win32/ PLEASE TEST THIS! There may be some code that depended on the old behaviour. I have been running the new NSLock implementation on FreeBSD for a few weeks without issue; please report to me any problems that you have on your platform. 2009-09-01 Richard Frith-Macdonald * Version: bump to 1.19.3 * Documentation/news.texi: update * Documentation/ReleaseNotes.gsdoc: update Make 1.19.3 release. 2009-09-01 Richard Frith-Macdonald * Headers/Foundation/NSCache.h: * Source/NSCache.m: Great additions... tweaked with whitespace changes to conform to coding standards, addition of copyright headers, addition of standard prevention of multiple inclusion, include changes to build independant of any existing installation. 2009-08-31 David Chisnall * Headers/Foundation/NSCache.h: * Headers/Foundation/Foundation.h: * Source/NSCache.m: * Source/GNUmakefile: Added NSCache implementation. 2009-08-31 Richard Frith-Macdonald * Source/NSMessagePort.m: * Source/NSSocketPort.m: * Source/NSConnection.m: Improve -description to include the registered names (if any) of ports. Include full port description in connection description. 2009-08-30 David Chisnall * Headers/Foundation/NSObject.h: Added NSDicardableContent protocol from Snow Leopard. 2009-08-27 Richard Frith-Macdonald * Source/Additions/GSCategories.m: * Source/Additions/GSCompatibility.m: Move -fullPath to correct place to build on OSX 2009-08-27 Richard Frith-Macdonald * Source/NSAttributedString.m: ([-string]) was returning proxy to mutable string ... bad if calling code does not expect it. 2009-08-26 Richard Frith-Macdonald * Headers/Foundation/NSURL.h: * Headers/Additions/GNUstepBase/GSCategories.h: * Source/NSURL.m: * Source/Additions/GSCategories.m: Add new -fulPath method to do what -path used to do, because for OSX compatibility the -path method now returns a path without any trailing slash, making it impossible to reconsitute a URL string from its individual parts :-( * Source/GSHTTPURLHandle.m: * Source/NSURLProtocol.m: Use the new -fullPath method to build the request line sent to the remote web server. 2009-08-25 Richard Frith-Macdonald * Version: bump to 1.19.2 * Documentation/news.texi: update * Documentation/ReleaseNotes.gsdoc: update * Source/DocMakefile: Avoid warning about WINAPI * Source/NSURLDownload.m: Documentation cleanups * Source/NSFileManager.m: ditto * Source/Additions/GSCategories.m: ditto * Source/Additions/GSMime.m: ditto * Source/NSURLConnection.m: ditto * Headers/Foundation/NSTimeZone.h: ditto * Headers/Foundation/NSURLDownload.h: ditto Make 1.19.2 release 2009-08-24 Richard Frith-Macdonald * Source/NSString.m: * Source/GSString.m: * Headers/Foundation/NSString.h: Tweak boolValue behavior to better match OSX and document exact behavior. 2009-08-23 Richard Frith-Macdonald * Source/win32/GSFileHandle.m: Fix for write in background on windows if a write is not already in progress, do it immediately because winsock won't tell us when we can write. Also, improve the test to see if a handle is a socket, as the previous code was not working for incoming connections, resulting in a busy poll rather than a blocking poll, and thus loading the system unnecessarily. 2009-08-21 Riccardo Mottola * Source/NSConnection.m: Joined split-line string constant 2009-08-21 Doug Simons * Source/NSUserDefaults.m: Remove one of the locks in +userLanguages to avoid a deadlock. Patch applied by: Gregory Casamento 2009-08-21 Doug Simons * Source/NSUserDefaults.m: Changes to bulletproof NSUserDefaults from deadlocks when it is accessed by more than one thread. Patch applied by: Gregory Casamento 2009-08-19 Eric Wasylishen * Source/Additions/GSObjCRuntime.m: Behave consistently with MacOS-X when a getter or setter method returns a type of data which is not supported by KVC. 2009-08-15 David Chisnall * Source/NSObject: - Tweaked NSObject to use atomic ops with LLVM as well as gcc (this probably isn't actually needed) - Fixed SIGFPE problem on FreeBSD using proper interfaces instead of an asm hack. * Removes various mframe things from being compiled when ffcall/libffi is used (mframe.m, NSConnection.m, NSInvocation.m) * Turned a nested function in make_strings.m into a macro. 2009-08-12 Richard Frith-Macdonald * Source/NSData.m: Remove some redundant methods and add checks for attempts to use a null pointer to set bytes in the data. * Source/NSCharacterSet.m: Save mem with index set rather than bitmap set 2009-08-11 Fred Kiefer * Source/NSAttributedString.m: Fix keyeded encodgin decoding for both NSAttributedString and NSMutableAttributedString. 2009-08-11 Richard Frith-Macdonald * Source/NSData.m: Fix memory leak introduced with GC changes. * Source/Additions/GSMime.m: Use memmove() as fix for bug #27224 2009-08-10 Richard Frith-Macdonald * Source/NSData.m: Fix memory leak introduced with GC changes. 2009-08-05 Richard Frith-Macdonald * Source/NSFileManager.m: * Headers/Foundation/NSFileManager.h: Updated comments/documentation to say that directory enumeration order is undefined. 2009-08-04 Richard Frith-Macdonald * Tools/AGSHtml.m: Escape non-ascii characters etc in author. 2009-08-04 Richard Frith-Macdonald * Source/NSPropertyList.m: Fix for handling empty key values in XML property lists. 2009-08-03 Richard Frith-Macdonald * Source/NSObject.m: Fix error in memory allocation debug when swizzling a class. 2009-07-30 Quentin Mathe * Headers/Foundation/Foundation.h: Included NSKeyValueObserving.h. 2009-07-28 Richard Frith-Macdonald * Source/NSConnection.m: Correct the text in exception when attempting to read a response on an invalidated connection. * Source/Additions/GSMime.m: Fixup incorrect declaration of method in wrong class implementation. 2009-07-27 David Ayers * Source/Additions/GSCompatibility.m ([-boolValue]): Only compile for OS X Versions below 10.5 and sync implementation with -base. Reported by: Georg Fleischmann 2009-07-23 Richard Frith-Macdonald * GSHTTPURLHandle.m: * NSURLProtocol.m: Include the port in the 'Host' header if it's specified in the URL. 2009-07-21 Richard Frith-Macdonald * Source/GSInternal.h: New macros for CLANG/non-fragile ivar compat. * Source/NSOperation.m: Use new macros. 2009-07-17 Richard Frith-Macdonald * Source/NSOperation.m: Fix includes and text of comments at start of document. 2009-07-16 Richard Frith-Macdonald * Headers/Foundation/NSOperation.h: * Source/NSOperation.m: Various changes for maintainability and coding standards ... nothing which should effect functionality. 2009-07-14 20:02-EDT Gregory John Casamento * Headers/Foundation/NSOperation.h * Source/NSOperation.m: Added initial implementation of NSOperationQueue. 2009-07-13 14:15-EDT Gregory John Casamento * Headers/Foundation/Foundation.h * Headers/Foundation/NSOperation.h * Source/GNUmakefile * Source/NSOperation.m: Initial implementation of NSOperation class. 2009-07-11 Richard Frith-Macdonald * Source/NSConcreteMapTable.m: Add some comments. * Source/NSConcreteHashTable.m: Dito * Headers/Additions/GNUstepBase/GSIMap.h: Make explicit that fields in enumerator are all big enough to hold pointers. 2009-07-04 Richard Frith-Macdonald * Source/NSProcessInfo.m: Add daignostic check. * Source/NSSocketPort.m: Make sure socklen_t is defined. Shoudl fix bug #26856 2009-06-30 Wolfgang Lux * configure.ac: * configure: * config/config.poll-dev.c: Add test to configure to avoid using the broken poll implementation on Mac OS X 10.4 and later, which does not support devices. 2009-06-24 Richard Frith-Macdonald * Source/NSXMLParser.m: ([-parse]) don't split whitespace strings at newline. 2009-06-19 Richard Frith-Macdonald * Source/win32/GSRunLoopCtxt.m: Fix error sending received event handle to watcher. Had broken TCP/IP ports. 2009-06-19 Richard Frith-Macdonald * Source/Additions/Unicode.m: Fix incorrect attempt to free memory we shouldn't. Should fix bug #26843 2009-06-16 Richard Frith-Macdonald * Source/win32/NSMessagePort.m: Don't use NSLog() to report error when writing to mailslot ... it's usually just that the remote end has terminated, so invalidating the port silently is better. * Source/GSFileHandle.m: Adjust code to deal with fstat() returning a failure on windows if the descriptor is a pipe/socket. 2009-06-13 Richard Frith-Macdonald * Headers/Foundation/NSKeyedArchiver.h: * Headers/Foundation/NSArchiver.h: Fix error cleaning up a define. 2009-06-12 Richard Frith-Macdonald * Source/NSDistributedNotificationCenter.m: add explicit size casts to avoid compiler warnings. * Source/NSUserDefaults.m: Save defaults in xml format and add some error checking. * Source/NSPropertyList.m: tolerate NSNumber values used as dictionary keys, by using their string representation. 2009-06-09 Richard Frith-Macdonald * SSL/Source/GSSSLHandle.m: Disable v2 by default due to security issues. GSPermitSSLv2 user default can enable it again. 2009-06-08 Richard Frith-Macdonald * Source/Additions/Unicode.m: Optimise somewhat for converting from unicode (UTF-2) to UTF-8 * Source/GSString.m: Optimise 8 bit string equality tests a little. 2009-06-06 Richard Frith-Macdonald * Source/Additions/Unicode.m: Optimise case where we are converting from unicode to latin1 or ascii. * Source/GSString.m: Optimise -hash method of NXConstantString too. 2009-06-06 Wolfgang Lux * Source/GSFFIInvocation.m (-initWithCallback:returnp:values:frame:signature:): Fix bug #26419 by removing bogus code which was used on targets where MFRAME_STRUCT_BYREF is defined. 2009-06-06 Richard Frith-Macdonald * Source/Additions/Unicode.m: When converting from a characterset to unicode, and we know that there is a one to one correspondence between the characterset values and unicode values, shift the buffer sizing outsize the loop through the characters to avoid unnecessary checks for the end of the buffer in each iteration. Optimisation suggested by Fred Kiefer 2009-06-05 18:12-EDT Gregory John Casamento * Source/NSDistantObject.m: NSProxy subclasses must override -init or an exception will be thrown. This change calls the forwarding mechanism to invoke -init on the remote object. Patch by David Chisnall 2009-06-04 Georg Fleischmann * Source/Additions/unicode/nextstep.h: Fixups for encoding mapping. 2009-06-02 Wolfgang Lux * Source/NSUndoManager.m (-undo, -redo): Call -_begin instead of -beginUndoGrouping to avoid creation of a spurious top-level group while performing undo or redo operations, which was causing the recorded actions to be dropped silently. * Source/NSUndoManager.m (-beginUndoGrouping): Post NSUndoManagerCheckpointNotification also during undo as on OS X. * Source/NSUndoManager.m (-endUndoGrouping): Post NSUndoManagerWillCloseUndoGroupNotification before changing the group so that clients see the same grouping level as on OS X. 2009-05-29 Riccardo Mottola * Source/NSObject.m: Atomic increment and decrement functions for m68k 2009-05-29 Nicola Pero * GNUmakefile: Use $(warning ...) instead of $(info ...) since $(info ...) exists only in GNU make >= 3.81. * NSCharacterSets/GNUmakefile: Same change. * Source/GNUmakefile: Same change. * SSL/GNUmakefile: Same change. * Documentation/GNUmakefile: Same change. * Resources/GNUmakefile: Same change. * NSTimeZones/GNUmakefile: Same change. * Examples/GNUmakefile: Same change. * Tools/GNUmakefile: Same change. 2009-05-27 Richard Frith-Macdonald * Source/NSRunLoop.m: Updates to match latest MacOS-X behavior. The +new and -init methods now return nil. Timers are now treated like input sources for purposes of deciding whether the loop will block and whether performerds will execute. * Source/NSTimer.m: Updates to match latest MacOS-X behavior. The +new and -init methods now return nil. 2009-05-24 Richard Frith-Macdonald * Source/NSThread.m: Use lock to prevent race condition setting up runloop info for thread. 2009-05-23 Richard Frith-Macdonald * Source/NSKeyValueObserving.m: Permit setters which return values. 2009-05-22 Richard Frith-Macdonald * Source/NSFileManager.m: * Source/NSBundle.m: Try to get the path right for loading dynamic library code on windows when NSExecutable doesn't have the .dll path extension. 2009-05-16 Doug Simons * Source/NSCalendarDate.m: Implement field widths for numeric fields in a date format for MacOS-X compatibility. 2009-05-16 Richard Frith-Macdonald * Source/NSURL.m: Add support for file URLs on mswindows. The path may be of the form C:/... rather than /... (and the colon might be a vertical bar). Also makefile fixes for bug #26446 2009-05-11 Adam Fedor * Source/NSXMLParser.m: Fix include location 2009-05-10 Adam Fedor * Version 1.19.1 2009-05-06 Adam Fedor * Documentation/news.texi, Documentation/releasenotes.texi: Update. 2009-05-04 Fred Kiefer * Source/NSObject.m: Correct asm for PPC. Patch by Eric Wasylishen * Source/NSObject.m: Add support for new gcc atomic build ins. Currently still disabled. Patch by David Chisnall 2009-05-04 Richard Frith-Macdonald * NSCharacterSets/GNUmakefile: * Source/GNUmakefile: * SSL/GNUmakefile: * Documentation/GNUmakefile: * Resources/GNUmakefile: * Examples/GNUmakefile: * NSTimeZones/GNUmakefile: * GNUmakefile: * Tools/GNUmakefile: Add help info for the case when gnustep-config can't tell us the location of the makefiles. 2009-05-03 Riccardo Mottola * Source/NSURLProtocol.m: Removed c99-ism 2009-05-03 Richard Frith-Macdonald * Source/GNUmakefile.postamble: remove generated files from pathconfig subdirectory on distclean. 2009-04-27 Richard Frith-Macdonald * Source/NSCalendarDate.m: Fix bug #26360 plus optimise a little. * Source/NSURL.m: Send over DO bycopy as default. 2009-04-27 Richard Frith-Macdonald * Headers/Foundation/NSData.h: * Source/NSData.m: Implement new MacOS-X methods for writing data (no support for returning NSError objects yet). 2009-04-26 Richard Frith-Macdonald * Source/GSFTPURLHandle.m: Implement full support for multiline responses. Fix for bug #26348 2009-04-26 Richard Frith-Macdonald * Headers/Foundation/NSTimeZone.h: * Headers/Foundation/NSPropertyList.h: * Headers/Foundation/NSZone.h: * Source/NSHashTable.m: * Source/NSZone.m: * Source/NSDecimal.m: Fix errors generating documentation. 2009-04-26 Richard Frith-Macdonald * Source/NSFileManager.m: ([changeFileAttributes:atPath:]) optimise to avoid unnecessary creation of NSNumber objects as suggested by Greg. 2009-04-25 Richard Frith-Macdonald * Source/NSFileManager.m: Reinstate incorrectly reverted changes. Fix actual bug in Fred's patched version ... some code incorrectly returning an integer when it should return an NSNumber. 2009-04-25 08:35-EDT Gregory John Casamento * Source/NSFileManager.m: Partial reversion of previous patch. The calls in the method changeAttribues:atPath: to the GSAttrDictionary which is used there were erroneously changed to assume an NSNumber. This was causing a crash in various applications. 2009-04-24 Fred Morcos * Headers/Foundation/NSFileManager.h: * Source/NSFileManager.m: Fix -fileOwnerAccountID and -fileGroupOwnerAccountID to return the correct type. Also fix return type of HFS methods (though these are Apple filesystem specific and do nothing in GNUstep). 2009-04-19 Richard Frith-Macdonald * Source/NSHashTable.m: * Source/NSConcreteHashTable.m: * Source/NSMapTable.m: * Source/NSConcreteMapTable.m: * Headers/Additions/GNUstepBase/GSIMap.h: Changes for GC zeroing weak pointers. Implement enumeration stuff for new classes. Add code to support subclassing. 2009-04-18 Richard Frith-Macdonald * Source/NSArray.m: Implement the ([countByEnumeratingWithState:objects:count:]) method. 2009-04-18 10:15-EDT Gregory John Casamento * Source/GSURLPrivate.h: Addition of private method to NSURLProtocol category. * Source/NSURLConnection.m: Changes to use the new method and to correct bug #26107. Patch by: doug@riverrock.org * Source/NSURLProtocol.m: Addition of static method to look up class which can handle the given connection protocol. Patch by: doug@riverrock.org 2009-04-16 Richard Frith-Macdonald * Headers/Foundation/NSHasTable.h: new OSX 10.5 API * Source/NSHashTable.m: New abstract class * Source/NSConcreteHashTable.m: concrete implementation * Source/NSKeyValueObserving.m: Fix incorrect hash table references. 2009-04-13 Richard Frith-Macdonald * Source/GSString.m: Change placeholder string initialisation so that, in a GC world, it checks to see if the buffer passed to it is collectable and forces a copy if it isn't. This prevents memory leaks when a malloc'ed buffer is passed to the initialiser. 2009-04-11 Richard Frith-Macdonald * Source/GSPrivate.h: New private functions. * Source/NSObject.m: Add function to swizzle isa pointer safely. * Source/NSZone.m: Add function to check for collectable memory. * Source/NSData.m: Add finalisation for shared memory and mapped files. Add finalized subclasses to deal with memory which must be freed when the NSData is collected. 2009-04-11 01:12-EDT Gregory John Casamento * Source/NSLock.m: Move the warning to a debug log. 2009-04-10 Richard Frith-Macdonald * Source/cifframe.m: * Source/callrame.m: Update for GC to use scanned memory to hold pointers we got from the stack so that memory will persist as long as the invocation needs it. 2009-04-10 Richard Frith-Macdonald * Source/GSPrivate.h: * Source/NSString.m: * Source/NSObject.m: * Source/GSString.m: * Source/NSZone.m: GC tweaks ... Improve realloc when in gc world. 2009-04-03 Adam Fedor * Source/NSObject.m: Revert previous patch (David to fix up later). 2009-03-31 Richard Frith-Macdonald * Headers/Foundation/NSInvocation.h: * Source/NSInvocation.m: Remove unused private method pointed out by David Chisnall. 2009-03-31 Richard Frith-Macdonald * Headers/Foundation/NSDebug.h: * Source/mframe.m: * Source/NSObject.m: Cleanups for building with other compilers as suggested/provided by David Chisnall. 2009-03-29 Richard Frith-Macdonald * Source/NSString.m: Fix error in parsing root of UNC path 2009-03-28 Fred Kiefer * Source/NSSocketPort.m (-receivedEvent:...forMode:): Fix usage of ET_WDESC for MINGW32. 2009-03-24 Richard Frith-Macdonald * Source/GSSocketStream.h: * Source/GSSocketStream.m: Avoid unnecessary memory allocation. Use weak pointers to break finalisation cycles. * Source/NSZone.m: Use GC debug unless built with 'debug=no' Allocate memory ignoring pointers into the allocated data. 2009-03-21 Richard Frith-Macdonald * configure.ac: * configure: * Headers/Additions/GNUstepBase/config.h.in: * Source/NSDebug.m: Try using sigsetjmp for dealing with signals during stack trace, in case it helps work arouns bugs in signal handling. 2009-03-21 Richard Frith-Macdonald * Source/NSMessagePort.m: * Source/NSSocketPort.m: Fix to treat exceptional (out of band) event as meaning a readable rather than a writable descriptor. 2009-03-20 Richard Frith-Macdonald * Source/NSURLCredential.m: * Source/NSURLAuthenticationChallenge.m: * Source/NSURLDownload.m: * Source/NSURLCredentialStorage.m: * Source/NSURLResponse.m: * Source/NSURLProtocol.m: * Source/NSURLCache.m: * Source/NSHTTPCookieStorage.m: * Source/NSCachedURLResponse.m: * Source/NSHTTPCookie.m: * Source/NSURLProtectionSpace.m: * Source/GSHTTPAuthentication.m: * Source/NSURLRequest.m: * Source/NSXMLParser.m: * Source/NSURLConnection.m: Fix some errors in header comments. 2009-03-18 Richard Frith-Macdonald * Source/NSNotificationQueue.m: Fix dealloc bug pointed out by Larry Campbell. 2009-03-18 Richard Frith-Macdonald * Source/win32/GSFileHandle.m: * Source/win32/NSMessagePort.m: * Source/win32/NSMessagePortNameServer.m: * Source/NSConcreteMapTable.m: * Source/Additions/GSCompatibility.m: * Source/Additions/GSCategories.m: * Source/NSData.m: Fixes for windows and changes to GC code, plus changes for old compilers which don't support anonymous unions, plus improvement to error reporting on windows, plus fix to correctly rename protected files if possible. 2009-03-16 Richard Frith-Macdonald * Source/NSConcretePointerFunctions.h: Minor GC tweaks * Source/NSMessagePortNameServer.m: Fix map table declaration * Source/NSKeyedUnarchiver.m: ditto * Source/NSKeyValueObserving.m: ditto * Source/NSObject.m: ditto * Source/GNUmakefile: Add NSConcreteMapTable.m * Source/NSConcreteMapTable.m: New file for new class * Source/NSMapTable.m: Change to be an abstract class * Headers/Foundation/NSMapTable.h: Add new MacOS-X 10.5 API * Headers/Additions/GNUstepBase/GSIMap.h: Some changes for new map table API. 2009-03-12 Bernard Cafferelli * configure.ac: Add --disable-zeroconf option to control whether NSNetServices (and a dependency on libdns_sd) is enabled. 2009-03-10 Richard Frith-Macdonald * Headers/Additions/GNUstepBase/GSIArray.h: * Source/NSNotificationCenter.m: * Source/NSRunLoop.m: * Source/NSZone.m: Various small GC bugfixes to get more of testsuite passing. 2009-03-09 Richard Frith-Macdonald * Headers/Additions/GNUstepBase/GSIArray.h: * Headers/Additions/GNUstepBase/GSIMap.h: * Headers/Foundation/NSZone.h: * Source/Additions/GSInsensitiveDictionary.m: * Source/Additions/Unicode.m: * Source/GSAttributedString.m: * Source/GSCountedSet.m: * Source/GSDictionary.m: * Source/GSPrivate.h: * Source/GSSet.m: * Source/NSArchiver.m: * Source/NSConnection.m: * Source/NSHashTable.m: * Source/NSKeyedArchiver.m: * Source/NSKeyedUnarchiver.m: * Source/NSMapTable.m: * Source/NSNotificationCenter.m: * Source/NSPortCoder.m: * Source/NSRunLoop.m: * Source/NSSerializer.m: * Source/NSURL.m: * Source/NSZone.m: * Source/unix/GSRunLoopCtxt.m: * Source/win32/GSRunLoopCtxt.m: More moves towards OSX 10.5 GC compatibility. With GC add some use of typed memory and remove the old GNUstep specific GSAtomicMallocZone() from public API. Still needs new NSHashTable and NSMaptable implementations. 2009-03-08 Richard Frith-Macdonald * Source/GSSocketStream.m: * Source/GSStream.m: * Source/NSConnection.m: * Source/NSKeyedArchiver.m: * Source/NSKeyedUnarchiver.m: * Source/NSObject.m: * Source/NSPort.m: * Source/NSXMLParser.m: GC tweaks to use new API. 2009-03-06 Richard Frith-Macdonald * Source/NSObject.m: Remove unused code for holding reference counts in an external map. 2009-03-02 Richard Frith-Macdonald * Source/GSHTTPURLHandle.m: Implement new mechanism for handling SOAP responses with HTTP status 500. Interim measure lntil the NSURLConnection family of class is more complete. 2009-03-01 Fred Kiefer * Source/NSBundle.m (-localizedStringForKey:value:table): Correct output when NSShowNonLocalizedStrings is YES. 2009-02-28 Richard Frith-Macdonald * Source/NSURLProtocol.m: Fix for retry with authentication based on patch by Philippe Roussel 2009-02-27 Richard Frith-Macdonald * Source/NSKeyValueCoding.m: Fix for bug #25720 as suggested by Michael Johnston 2009-02-26 Richard Frith-Macdonald * Source/NSCharacterSetData.h: * Source/GSRunLoopWatcher.h: * Source/GSRunLoopWatcher.m: * Source/GSRunLoopCtxt.h: Add missing copyright/license comments. 2009-02-25 Richard Frith-Macdonald * Source/NSUndoManager.m: Revert last change (to match OSX 10.5) Also rework a little to recreate undocumented OSX behavior of implicitly creating a top-level undo group if -beginUndoGroup is called for a manager configured with groupByEvent. 2009-02-23 Richard Frith-Macdonald * Source/NSIndexPath.m: * Source/GSSocketStream.h: * Source/NSTimeZone.m: * Source/NSNetServices.m: * Source/NSURLCredential.m: * Source/GSSocketStream.m: * Source/NSURLAuthenticationChallenge.m: * Source/NSCalendarDate.m: * Source/NSPropertyList.m: * Source/GSConcreteValueTemplate.m: * Source/NSAffineTransform.m: * Source/NSConcretePointerFunctions.h: * Source/NSPathUtilities.m: * Source/NSScanner.m: * Source/NSProcessInfo.m: * Source/NSDistributedNotificationCenter.m: * Source/NSNotificationQueue.m: * Source/NSGeometry.m: * Source/NSConcretePointerFunctions.m: * Source/NSRunLoop.m: * Source/NSAttributedString.m: * Source/NSUndoManager.m: * Source/NSMethodSignature.m: * Source/NSUserDefaults.m: * Source/NSArray.m: * Source/GSStream.h: * Source/GSStream.m: * Source/NSKeyedArchiver.m: * Source/NSDebug.m: * Source/unix/NSStream.m: * Source/NSKeyedUnarchiver.m: * Source/NSURLDownload.m: * Source/NSPredicate.m: * Source/NSAssertionHandler.m: * Source/NSZone.m: * Source/NSPort.m: * Source/GSPrivate.h: * Source/win32/NSStream.m: * Source/NSInvocation.m: * Source/NSFileManager.m: * Source/NSURLResponse.m: * Source/NSURLCache.m: * Source/NSCoder.m: * Source/NSException.m: * Source/NSCopyObject.m: * Source/NSURL.m: * Source/NSString.m: * Source/NSObject.m: * Source/NSDecimalNumber.m: * Source/cifframe.m: * Source/Additions/GCArray.m: * Source/Additions/GSXML.m: * Source/Additions/GCDictionary.m: * Source/Additions/GSCategories.m: * Source/Additions/GSMime.m: * Source/NSNumber.m: * Source/NSDecimal.m: * Source/GSString.m: * Source/NSThread.m: * Source/NSHTTPCookie.m: * Source/NSData.m: * Source/NSProxy.m: * Source/NSURLProtectionSpace.m: * Source/NSError.m: * Source/NSDictionary.m: * Source/NSURLRequest.m: * Source/NSValue.m: * Source/NSCountedSet.m: * Source/NSIndexSet.m: * Source/GSFileHandle.m: * Source/NSLock.m: * Source/NSSet.m: * Source/NSArchiver.m: * Source/NSXMLParser.m: * Source/GSURLPrivate.h: * Headers/Foundation/NSTimeZone.h: * Headers/Foundation/NSNetServices.h: * Headers/Foundation/NSCoder.h: * Headers/Foundation/NSException.h: * Headers/Foundation/NSHTTPCookieStorage.h: * Headers/Foundation/NSURLAuthenticationChallenge.h: * Headers/Foundation/NSCompoundPredicate.h: * Headers/Foundation/NSObject.h: * Headers/Foundation/NSSpellServer.h: * Headers/Foundation/NSString.h: * Headers/Foundation/NSCalendarDate.h: * Headers/Foundation/NSDecimalNumber.h: * Headers/Foundation/NSURLHandle.h: * Headers/Foundation/NSPropertyList.h: * Headers/Foundation/NSAffineTransform.h: * Headers/Foundation/NSPathUtilities.h: * Headers/Foundation/NSScanner.h: * Headers/Foundation/NSProcessInfo.h: * Headers/Foundation/NSDistributedNotificationCenter.h: * Headers/Foundation/NSStream.h: * Headers/Foundation/NSComparisonPredicate.h: * Headers/Foundation/NSGeometry.h: * Headers/Foundation/NSNotificationQueue.h: * Headers/Foundation/NSRunLoop.h: * Headers/Foundation/NSDecimal.h: * Headers/Foundation/NSAttributedString.h: * Headers/Foundation/NSUndoManager.h: * Headers/Foundation/NSMethodSignature.h: * Headers/Foundation/NSUserDefaults.h: * Headers/Foundation/NSThread.h: * Headers/Foundation/NSData.h: * Headers/Foundation/NSHTTPCookie.h: * Headers/Foundation/NSArray.h: * Headers/Foundation/NSObjCRuntime.h: * Headers/Foundation/NSProxy.h: * Headers/Foundation/NSURLProtectionSpace.h: * Headers/Foundation/NSKeyedArchiver.h: * Headers/Foundation/NSDebug.h: * Headers/Foundation/NSError.h: * Headers/Foundation/NSURLDownload.h: * Headers/Foundation/NSKeyValueObserving.h: * Headers/Foundation/NSDictionary.h: * Headers/Foundation/NSURLRequest.h: * Headers/Foundation/NSZone.h: * Headers/Foundation/NSValue.h: * Headers/Foundation/NSIndexSet.h: * Headers/Foundation/NSPort.h: * Headers/Foundation/NSLock.h: * Headers/Foundation/NSSet.h: * Headers/Foundation/NSExpression.h: * Headers/Foundation/NSInvocation.h: * Headers/Foundation/NSFileManager.h: * Headers/Foundation/NSXMLParser.h: * Headers/Foundation/NSURLResponse.h: * Headers/Foundation/NSIndexPath.h: * Headers/Foundation/NSURLCache.h: * Headers/Additions/GNUstepBase/GSXML.h: * Headers/Additions/GNUstepBase/GSCategories.h: * Headers/Additions/GNUstepBase/GSMime.h: * Headers/Additions/GNUstepBase/GSFileHandle.h: * Tools/gdnc.h: * Tools/gdnc.m: Conversion of everything to use the new MacOS-X 10.5 API where return values and arguments use the NSInteger, NSUInteger, and CGFloat types. For now, as suggesed by David, the proper 10.5 behavior is turned off and those types are equivalent to the types used by the old API. Edit Headers/Foundation/NSObjCRuntime.h to turn on the new behavior where the integer types are the same size as a pointer, and the float type is actually a double on 64bit processors. 2009-02-23 Richard Frith-Macdonald * Source/NSPortCoder.m: make float and double interchangable to cope with MacOS-X 10.5 API which can use either for CGFloat. 2009-02-23 Richard Frith-Macdonald * Headers/Foundation/NSGeometry.h: * Source/NSGeometry.m: Inspired by Matt Rice's comments on NSEqualRects(), moved the equality testing functions from the header to the implementation file and added conditionally compiled code to allow us to do a fuzzy equality test. Still need to decide whether this is actually the correct thing to do though. 2009-02-22 Richard Frith-Macdonald * Source/NSUnarchiver.m: make float and double interchangable to cope with MacOS-X 10.5 API which can use either for CGFloat. * Source/NSXMLParser.m: optimize sloppy parser somewhat. 2009-02-21 Richard Frith-Macdonald * Source/mframe/i386/linux: * Source/mframe/i386/sysv4.2MP: * Source/mframe/i386/linux-gnu: * Source/mframe/i386/sysv4.2uw2.1.3: * Source/mframe/i386/freebsd: * Source/mframe/i386/openbsd: * Source/mframe/i386/generic: Update/fix macro to build method signature information. 2009-02-20 Richard Frith-Macdonald * configure.ac: Add checks for backtrace() function * Headers/Additions/GNUstepBase/config.h.in: regenerate * configure: regenerate * Source/NSDebug.m: Use backtrace() to get stack if possible ... it's more reliable than gcc's __builtin_frame_address() function. * Source/cifframe.m: Allocate a slightly larger buffer when processing invocations ... somehow this fixes a write outside allocated memory by the ffi library on my 64bit debian system. 2009-02-17 Richard Frith-Macdonald * Source/NSUndoManager.m: Don't post checkpoint notification when beginning top level group. Fix for #25607 2009-02-16 Adam Fedor * configure.ac: Look in LOCAL for headers/libs * Headers/Foundation/NSObjCRuntime.h: Define NSINTEGER_DEFINED. * Headers/Additions/GNUstepBase/GSCategories.h, Headers/Additions/GNUstepBase/GSUnion.h: Additional definitions to compile with apple-apple-apple. 2009-02-16 Richard Frith-Macdonald * Source/pathconfig/configure.ac: Warn if gnustep-config not found. * Source/pathconfig/configure: regenerate * Headers/Foundation/NSPointerArray.h: Add more comments. 2009-02-15 Richard Frith-Macdonald * Source/NSPointerArray.m: Initial implementation. Untested. No coding/decoding support. 2009-02-14 Richard Frith-Macdonald * Source/NSPointerFunctions.m: Add some more functions to be set by options. 2009-02-12 Richard Frith-Macdonald * Source/NSPortCoder.m: Use scanned memory to hold array * Source/NSKeyedUnarchiver.m: ditto * Source/NSFileManager.m: ditto 2009-02-11 Richard Frith-Macdonald * Source/NSUnarchiver.m: * Source/NSString.m: * Source/Additions/GSMime.m: * Source/NSData.m: * Source/GSHTTPAuthentication.m: * Source/NSSerializer.m: * Source/unix/GSRunLoopCtxt.m: * Source/win32/GSRunLoopCtxt.m: Various changes to use unscanned collectable memory with GC. 2009-02-11 Richard Frith-Macdonald * Source/NSNotificationCenter.m: Fix bug removing observations for collected observers. * Headers/Foundation/NSGarbageCollector.h: * Source/NSGarbageCollector.m: * Source/NSObject.m: Update the behavior of the -zone method to match MacOS-X 10.5 and always return the default zone when used with GC. 2009-02-10 Richard Frith-Macdonald * Source/NSConcretePointerFunctions.h: * Source/NSConcretePointerFunctions.m: * Source/NSPointerFunctions.m: * Source/NSPointerArray.m: * Source/GNUmakefile: Partial implementation of concrete pointer functions class. 2009-02-09 Xavier Glattard * Headers/Foundation/NSPredicate.h: * Source/NSPredicate.m: Declare and implement two new methods for filtering NSSet: * [-filterUsingPredicate:] * [+filteredSetUsingPredicate:] 2009-02-09 Richard Frith-Macdonald * Source/win32/NSMessagePortNameServer.m: Fix GC error on windows as reported by Ly Liyi * configure.ac: Check for new GC_allow_register_threads() function. * Source/NSThread.m: Attempt to fix thread registration for GC. * Source/NSObject.m: Initialise finalize on mingw as well as unix. * Source/NSZone.m: Remove unnecessary casts. 2009-02-09 Matt Rice * Headers/Foundation/NSZone.h (GSMakeWeakPointer): Rename class variable to theClass for objc++. 2009-02-09 Richard Frith-Macdonald * Source/NSArray.m: Implement new methods for inserting and replacing objects at indexes in an NSIndexSet. * Headers/Foundation/NSObject.h: Minor whitespace fix * Source/NSNetServices.m: Mark unimplemented method. * Headers/Foundation/NSXMLDocument.h: new class * Headers/Foundation/NSXMLNode.h: new class * Headers/Foundation/NSXMLNodeOptions.h: new class * Headers/Foundation/NSXMLDTD.h: new class * Headers/Foundation/NSXMLDTDNode.h: new class * Headers/Foundation/NSXMLElement.h: new class * Headers/Foundation/Foundation.h: Add new class headers * Source/NSXMLDocument.m: skeleton of class * Source/NSXMLDTD.m: skeleton of class * Source/NSXMLNode.m: skeleton of class * Source/NSXMLDTDNode.m: skeleton of class * Source/NSXMLElement.m: skeleton of class * Source/NSXMLPrivate.h: Private header for all NSXMLNode based stuff. * Source/GNUmakefile: Add new NSXML classes * Source/DocMakefile: ditto Mostly, add the (unimplemented) XML classes introduced in the latest version of MacOS-X. Currently the classes are unimplemented method stubs, but the idea is to wrap libxml2 in a similar way to that in which GSXML does it. NB. The current ivar layout is reverse engineered from MacOS-X on the assumption that we will try to be extremely compatible and use the same (inferred) mechanism of having the libxml2 tree be the master data and only using the objc ivars to cache information when we retrieve it in the form of NSStrings etc. Maybe we will chose to do something different later. 2009-02-09 Richard Frith-Macdonald * Source/Additions/GSObjCRuntime.m: Correct error comparing method signatures. Fixes bug #25520 2009-02-04 Richard Frith-Macdonald * Source/NSBundle.m: Use pointerValue rather than nonretainedObjectValue to hold classes ... because the garbage collector might collect the latter, and we really just need to hold references to classes without sending messages to them. * Headers/Additions/GNUstepBase/GSIArray.h: Alterations for noe Apple GC API * Source/NSIndexSet.m: Use scanned memory for arrays. 2009-02-04 15:00-EST Gregory John Casamento * Source/NSUnarchiver.m: Correct issue with printing class name when the unarchiver can't find the class. 2009-02-04 Richard Frith-Macdonald * Source/NSMapTable.m: * Source/NSHashTable.m: * Source/NSPortCoder.m: * Source/NSKeyedArchiver.m: * Source/NSGarbageCollector.m: * Source/NSZone.m: * Source/GSDictionary.m: * Source/GSCountedSet.m: * Source/GSAttributedString.m: * Source/NSNotificationCenter.m: * Source/Additions/GSInsensitiveDictionary.m: * Source/GSSet.m: * Source/NSConnection.m: * Source/NSSerializer.m: * Source/NSArchiver.m: * Headers/Foundation/NSZone.h: * Headers/Additions/GNUstepBase/GSIMap.h: Scrap GSScannedMallocZone().. not really needed. 2009-02-04 Richard Frith-Macdonald * Source/NSURLProtocol.m: Add some diagnostics and ensure that delegates are removed from streams. * Source/NSURLConnection.m: Add diagnostics for redirect. * Source/GSStream.m: Set delegate to nil after failure. 2009-02-04 David Chisnall * Source/GSArray.m: Further fast enumeration bugfixes. * Source/GSEnumerator.m: ditto. 2009-02-03 Richard Frith-Macdonald * Source/NSZone.m: Restore binary compatibility with earlier code. Thanks to David Chisnall for the idea. 2009-01-30 Richard Frith-Macdonald * Source/NSURL.m: For file URL, make relative path absolute. * Source/GSHTTPURLHandle.m: * Source/Additions/GSMime.m: Change HTTP status code to be an NSNumber rather than NSString for MacOS-X compatibility 2009-01-30 Richard Frith-Macdonald * Documentation/readme.texi: * README: Remove reference to Testing * Examples/nsconnection_server.m: * Examples/diningPhilosophers.m: * Examples/nsconnection_client.m: * Examples/nsconnection.m: Transferred from Testing * Testing: removed Removed Testing subdirectory. Now that locking tests are in the testsuite all the code here is probably obsolete. If we find any cases where that's not the case, we should recover anything we need from svn and add it to the testsuite. 2009-01-30 Richard Frith-Macdonald * Source/NSLock.m: Fixed last change to match MacOS-X behavior. 2009-01-29 17:49-EST Gregory John Casamento * Source/NSLock.m: Change to correct documented/tested and observed inconsistency between Cocoa (and OpenStep) and GNUstep. Reinstatement of correction for bug #25307. Testing on both OpenStep and on Cocoa clearly illustrates that throwing an exception in this case was incorrect. It now emits a warning when the lock is attempted again, but does not throw an exception. * Testing/locktest/locktest.m: Change to test to correctly test [NSConditionLock lock] 2009-01-28 21:48-EST Gregory John Casamento * Testing/locktest/GNUmakefile * Testing/locktest/GNUmakefile.preamble * Testing/locktest/locktest.1 * Testing/locktest/LockTestInfo.plist * Testing/locktest/locktest.m * Testing/locktest/locktest_Prefix.pch * Testing/locktest/locktest.xcodeproj/project.pbxproj * Testing/locktest/PC.project: Test which confirms the behavior observed on Mac OS X/Cocoa. 2009-01-28 Richard Frith-Macdonald * Source/NSEnumerator.m: Fix bug in fast enumeration code. * Source/GSArray.m: Fix bug in array insertion introduced by last patch. 2009-01-28 David Chisnall * Headers/Foundation/NSEnumerator.h: * Source/NSEnumerator.m: * Source/GSArray.m: * Source/GSprivate.h: Add Apple's fast enumeration protocol. 2009-01-28 Richard Frith-Macdonald * Source/NSException.m: Fix problem preventing stack traccces from being generated. 2009-01-27 Richard Frith-Macdonald * Source/NSValue.m: ([valueWithNonretainedObject:]) zero the reference when the object is collected. 2009-01-25 Richard Frith-Macdonald * Source/NSURL.m: Compatibility tweaks for a few MacOS-X oddities... Initialise file URLs with a host of 'localhost' even though they should really have none. Return paths without a trailing slash, even when they were set with one. 2009-01-25 Richard Frith-Macdonald * Source/NSString.m: Fix for bug #25400 * Tools/gdnc.m: Fix failure to log exception (bug #25396) * Tools/gdomap.c: Use snprintf for paranoid double check of data in log buffer. 2009-01-23 Riccardo Mottola * Source/NSPointerFunctions.m, * Headers/Foundation/NSPointerFunctions.h: Fix return pointer type 2009-01-23 Richard Frith-Macdonald * Headers/Additions/GNUstepBase/GNUstep.h: Optimise retain/release management macros for the case where they are dealing with none-nil values. * Headers/Additions/GNUstepBase/GSIMap.h: Some changes moving towards use of typed memory for gc. * Headers/Foundation/NSPointerArray.h: New class header. * Source/NSPointerArray.m: Skeletal (non-working) implementation 2009-01-22 Richard Frith-Macdonald * Source/GSHTTPURLHandle.m: Improve debug logging by including the address of the actual handle concerned so that you can see which handle is doing what when there are multiple handles in use. * Source/NSGarbageCollector.m: Implement last methods. * Headers/Foundation/NSGarbageCollector.h: Improve documentation. * Source/NSAutoreleasePool.m: ([-drain[) Implemented. * Headers/Foundation/NSAutoreleasePool.m: ([-drain]) fix comment. * Source/NSPointerFunctions.m: New class implementation * Headers/Foundation/NSPointerFunctions.h: Fix some declarations * Headers/Foundation/Foundation.h: Include NSPointerFunctions.h * Source/GNUmakefile: Build and install NSPointerFunctions 2009-01-21 Richard Frith-Macdonald * Source/NSUserDefaults.m: ([setObject:forKey:]) copy the object rather than just retaining it. Fixes bug #23570 2009-01-20 Richard Frith-Macdonald * Documentation/manual/ExceptionHandling.texi: Fix error in example of use of NS_VALUERETURN spotted by David Chisnall. 2009-01-20 Richard Frith-Macdonald * Source/NSKeyValueObserving.m: Automtically remove collected observers In a garbage collecting environment. * Headers/Foundation/NSZone.h: * Source/NSZone.m: Add new functions for handling weak pointers. This allows all code which uses the boehm garbage collector header to be localised in NSZone.m and NSGarbageCollector.m * Source/NSNotificationCenter.m: Update to use new functions. * Source/Additions/GSInsensitiveDictionary.m: Fix to use scanned memory in a garbage collecting environment. 2009-01-19 Richard Frith-Macdonald * configure.ac: Add options from pathconfig * configure: regenerate 2009-01-19 Richard Frith-Macdonald * Headers/Foundation/NSZone.h: * Source/NSZone.m: Add NSAllocateCollectable() and NSReallocateCollectable() functions. Move inline stuff from header to source fle so that GC differences are hidden. Change behavior under GC so that the default malloc zone is non-collectable (as under MacOS-X). * Headers/Additions/GNUstepBase/GSIMap.h: Use scanned collectable memory for map. * Source/Additions/GSObjCRuntime.m: Use NSAllocateCollectable() for fast buffer. * Source/GSArray.m: * Source/GSCountedSet.m: * Source/GSDictionary.m: * Source/GSSet.m: * Source/NSArchiver.m: * Source/NSConnection.m: * Source/NSHashTable.m: * Source/NSKeyedArchiver.m: * Source/NSMapTable.m: * Source/NSNotificationCenter.m: * Source/NSObject.m: * Source/NSPortCoder.m: * Source/NSSerializer.m: * Source/NSPropertyList.m: Use scanned collectable memory in places where we allocate memory to hold pointers. This change is needed because of the switch to have the default zone use unscanned uncollectable memory as in MacOS-X. These changes probably just scratch the surface ... we need to review all memory allocation as, anywhere we allocate memory now will need to be done differently under GC. This does mean that all existing code needs more work to port to GC than it otherwise would. On the other hand, a switch to GC is really quite a major design change. 2009-01-17 Wolfgang Lux * Source/unix/GSRunLoopCtxt.m (+awakenedBefore): Fix typo. 2009-01-17 Richard Frith-Macdonald * Source/NSLock.m: Revert last change. The Cocoa documentation actually says nothing about exceptions either way. I recall there was some discussion about lock behavior a few years ago, which concluded that the GNUstep behavior was the best available ... it returns NO if the lock is unavailable, but raises an exception if you try to lock the lock twice from the same thread, since locking twice from the same thread is almost guaranteed to be a programming error. If we want to remove this check, we need to do it consistently for all locks and document the new behavior. 2009-01-16 17:26-EST Gregory John Casamento * Source/NSLock.m: Correction for bug #25307. According to Cocoa documentation, NSConditionLock should return NO, if the lock is unavailable. No exception should be thrown. 2009-01-16 Richard Frith-Macdonald * Source/NSRunLoop.m: Revert temporary hack to work around bug in NSAnimation, hopefully fixed in NSAnimation now. 2009-01-15 Richard Frith-Macdonald * Source/NSRunLoop.m: Cleaned up a little and added hack as a temporary fix for #25327, though I'm suspecting that the actual problme is in the NSAnimation code. 2009-01-15 Richard Frith-Macdonald * Source/NSRunLoop.m: * Source/unix/GSRunLoopCtxt.m: * Source/GSRunLoopCtxt.h: * Source/win32/GSRunLoopCtxt.m: Introduce new method to quickly check for notification of methods to perform in the current loop. 2009-01-14 Richard Frith-Macdonald * Source/NSGarbageCollector.m: Avoid compiler warning * Source/pathconfig/pathconfig.mak.in: Fix syntax error in warning * Headers/Additions/GNUstepBase/GSCategories.h: remove obsolete methods * GNUmakefile: Fix order of includes * Source/GSArray.m: Remove unused line from last change * Source/NSNotificationCenter.m: Remove unused line 2009-01-13 18:35-EST Gregory John Casamento * Source/GSArray.m * Source/NSNotificationCenter.m: Quick fixes for two compiler errors introduced by previous change. 2009-01-13 Richard Frith-Macdonald * Source/NSGarbageCollector.m: Mark the two unimplemented methods. * Source/NSNotificationCenter.m: Automatically remove observers if they are collected by the GC system. * Source/NSThread.m: Make the GC system aware of each thread if poss. * Source/GSArray.m: Don't use inline array class with GC. * configure.ac: Add check for GC_register_my_thread 2009-01-12 Richard Frith-Macdonald * Source/GNUmakefile: * Headers/Foundation/NSGarbageCollector.h: * Source/NSGarbageCollector.m: * Headers/Foundation/Foundation.h: Add new MacOS-X class. 2009-01-12 Richard Frith-Macdonald * Source/NSSocketPort.m: * Source/NSRunLoop.m: * Source/NSMessagePort.m: * Source/NSNotificationCenter.m: * Source/GSAttributedString.m: * Source/NSObject.m: * Source/Additions/GSLock.m: * Source/NSConnection.m: * Source/GSFileHandle.m: * Source/NSLock.m: * Source/NSDistantObject.m: * Source/NSTask.m: * SSL/GSSSLHandle.m: * Documentation/Base.ispell: * Headers/Foundation/NSObject.h: * Headers/Foundation/NSNotification.h: * Headers/Foundation/NSRunLoop.h: * Headers/Foundation/NSPort.h: * Headers/Foundation/NSLock.h: * Headers/Foundation/NSTask.h: * Headers/Additions/GNUstepBase/GSFileHandle.h: Change GC finalization API to match MacOS-X ... abandon libFoundation compatibility in GC behavior. 2009-01-12 Richard Frith-Macdonald * Source/NSIndexPath.m: * Source/NSSocketPortNameServer.m: * Source/NSTimeZone.m: * Source/GSInvocation.h: * Source/GSSocketStream.m: * Source/NSValueTransformer.m: * Source/NSPortCoder.m: * Source/NSSpellServer.m: * Source/NSBundle.m: * Source/NSURLHandle.m: * Source/NSPropertyList.m: * Source/NSPathUtilities.m: * Source/NSProcessInfo.m: * Source/NSDistributedNotificationCenter.m: * Source/GNUmakefile: * Source/NSSocketPort.m: * Source/NSRunLoop.m: * Source/NSUserDefaults.m: * Source/NSArray.m: * Source/NSMessagePortNameServer.m: * Source/NSDebug.m: * Source/NSKeyedUnarchiver.m: * Source/NSKeyValueObserving.m: * Source/GSHTTPURLHandle.m: * Source/GSFFIInvocation.m: * Source/NSMessagePort.m: * Source/NSInvocation.m: * Source/NSFileManager.m: * Source/NSURLResponse.m: * Source/NSURLProtocol.m: * Source/NSException.m: * Source/NSURL.m: * Source/NSString.m: * Source/NSObject.m: * Source/NSDecimalNumber.m: * Source/Additions/GSXML.m: * Source/Additions/GNUmakefile: * Source/Additions/GSCategories.m: * Source/Additions/GCDictionary.m: * Source/Additions/GSMime.m: * Source/GSString.m: * Source/NSConnection.m: * Source/NSThread.m: * Source/NSHost.m: * Source/NSProtocolChecker.m: * Source/GSHTTPAuthentication.m: * Source/NSSerializer.m: * Source/NSClassDescription.m: * Source/GSFileHandle.m: * Source/NSSet.m: * Source/NSDistantObject.m: * Source/NSTask.m: * Source/NSNumberFormatter.m: * Source/GSFTPURLHandle.m: * SSL/GSSSLHandle.m: * configure.ac: * configure: * base.make.in: * Tools/sfparse.m: * Tools/plget.m: * Tools/AGSParser.m: * Tools/autogsdoc.m: * Tools/AGSOutput.m: * Tools/HTMLLinker.m: Tweaks to get things to compile with garbage collection again and (mostly) compile without warnings. 2009-01-09 Richard Frith-Macdonald * Source/NSTimer.m: ([invalidate]) release target and user info. 2009-01-07 Richard Frith-Macdonald * Source/NSBundle.m: Revert last change. Remove undocumented code which looked for operating system specific files. Also changed behavior when given a nil/empty extension to match MacOS-X. Also optimised and simplified code and changed a private method which was missing the leading underscore. 2009-01-07 16:33-EST Gregory John Casamento * Source/NSBundle.m: Correct issue where *-gnustep.* is not searched for when explicitly calling pathForResource:... 2009-01-06 Richard Frith-Macdonald * configure: * config.mak.in: * Source/NSPathUtilities.m: * Source/GNUmakefile: * Source/pathconfig: * Source/pathconfig/configure: * Source/pathconfig/configure.ac: * Source/pathconfig/pathconfig.h.in: * Source/pathconfig/pathconfig.mak.in: * SSL/GNUmakefile: * configure.ac: * Documentation/GNUmakefile: * NSTimeZones/GNUmakefile: * GNUmakefile: * Tools/GNUmakefile: * Testing/GNUmakefile: Move path configuration stuff into separate subdirectry/file so that we can hack it more easily and so that only the code that needs it will include it. 2009-01-06 Nicola Pero * config.mak.in: Check here if GNUSTEP_BASE_DOMAIN and GNUSTEP_INSTALLATION_DOMAIN do not match when using relative paths. If they do not match, print a long explanation of how to fix the problem, and abort. If relative paths are not used, automatically set GNUSTEP_INSTALLATION_DOMAIN to the domain that was chosen at configure time - unless overridden on the command line. * Makefile.postamble: Removed before-all rule that was doing the check now in config.mak.in. * SSL/Makefile.postamble (config.mak): Touch config.mak after running config.status to prevent spurious invocations of config.status. (config.h): Always touch config.h after running config.status for the same reason. 2009-01-06 Nicola Pero * configure.ac: Detect relative paths in the paths that we hardcode into gnustep-base, and set the GNUSTEP_BASE_RELATIVE_PATHS variable if any is found. * configure: Regenerated. * config.mak.in: Added GNUSTEP_BASE_RELATIVE_PATHS. * Makefile.postamble: Only do the automatic reconfiguration at install time if GNUSTEP_BASE_RELATIVE_PATHS is set. Make the message printed when we reconfigure more prominent. 2009-01-05 17:58-EST Gregory John Casamento * Source/NSBundle.m: Use CFBundleExecutable if NSExecutable isn't present when loading the bundle object code. 2009-01-05 Fred Kiefer * Source/NSKeyValueObserving.m (-overrideSetterFor:): Only output a NSDebugLLog() not an NSLog() when the class has no setter for the key. 2009-01-05 Fred Kiefer * Source/NSString.m (-paragraphRangeForRange:, -getParagraphStart:...): Basic implementation of these methods. 2009-01-05 Richard Frith-Macdonald * Source/NSRunLoop.m: check for performers in thread even if there are no input sources available. * Source/unix/GSRunLoopCtxt.m: Add diagnostics * Source/win32/GSRunLoopCtxt.m: Add diagnostics * Testing/thread.m: Change to allow perform in maion thrad to take place and program to terminate. 2009-01-04 Richard Frith-Macdonald * Source/mframe/sparc64/generic: guess at a config * Source/mframe/sparc64/openbsd: guess at a config * Source/mframe/configure.ac: add sparc64 * Source/mframe/configure: regenerate Guess at config for sparc64 openbsd 2009-01-02 Richard Frith-Macdonald * Source/NSBundle.m: ([+bundleForLibrary:]) return nil if the supplied library name is empty. 2008-12-31 Fred Kiefer * Source/NSDecimalNumber.m (-initWithBytes:objCType:): Avoid memory leak and memory corruption by retaining notANumber before returning it. 2008-12-29 Richard Frith-Macdonald * Makefile.postamble (before-all): Remove test for mingw on situation which can occur on all systems, not just mingw. 2008-12-25 11:10-EST Gregory John Casamento * Source/GNUmakefile: Add new NSObjectNSComparisonMethods.m category to the makefile. * Source/NSObject+NSComparisonMethods.m: Added to implement Mac OS X specific methods for comparison of objects. On Cocoa these are in NSScriptWhoseTests.h, but since GNUstep doesn't support Apple Script I've put them in a separate category for now. Some applications use these to do comparisons (even though they are for scripting). The location of these may change in the future depending on if we implement scripting. 2008-12-24 Nicola Pero * configure.ac: Improved help for --with-installation-domain=xxx. If no --with-installation-domain=xxx option is used, and gnustep-config supports the new option --installation-domain-for=gnustep-base, use it to determine the installation domain as accurately as possible (including supporting the environment variable GNUSTEP_INSTALLATION_DOMAIN and the installation-domains.conf file). Otherwise fall back to LOCAL. If an invalid installation domain is provided on the command-line, abort with an error. * configure: Regenerated. * GNUmakefile: Set PACKAGE_NAME before importing common.make. Do not try to set GNUSTEP_BASE_DOMAIN or GNUSTEP_INSTALLATION_DOMAIN. * Makefile.postamble (before-all): Only check that GNUSTEP_BASE_DOMAIN matches GNUSTEP_INSTALLATION_DOMAIN on MinGW. Quote GNUSTEP_BASE_DOMAIN and GNUSTEP_INSTALLATION_DOMAIN to catch the case when one of them is empty. Added ECHO_NOTHING to the rule to suppress ugly code output. Print an error message when reconfiguring automatically. 2008-12-22 Richard Frith-Macdonald * Version 1.19.0 * Documentation/news.texi: * Documentation/ReleaseNotes.gsdoc: Update for new release. * configure.ac: Fix error checking for objc_set_unexpected * configure: regenerate 2008-12-22 Richard Frith-Macdonald * config.mak.in: * configure: * Makefile.postamble: * configure.ac: * GNUmakefile: Update from stable branch. 2008-12-21 Adam Fedor * Update documentation for version 1.18.0 2008-12-19 Nicola Pero * All GNUmakefiles: removed GNUSTEP_CORE_SOFTWARE=YES and added PACKAGE_NAME=gnustep-base. * GNUmakefile: Export PACKAGE_NAME to reduce chances of a problem if a GNUmakefile in a subdirectory is missing it. * Tools/make_strings/GNUmakefile: Do not set PACKAGE_NAME to make_strings. * Testing/synctest/GNUmakefile: Do not set PACKAGE_NAME to Synctest. 2008-12-19 Richard Frith-Macdonald * Source/NSPathUtilities.m: Merge in bugfixes from stable branch. 2008-12-18 Nicola Pero * All GNUmakefiles: added GNUSTEP_CORE_SOFTWARE=YES at the beginning. * GNUmakefile: Export GNUSTEP_CORE_SOFTWARE to reduce chances of a problem if a GNUmakefile in a subdirectory is missing it. * Documentation/General/GNUmakefile: Removed setting GNUSTEP_INSTALLATION_DOMAIN to SYSTEM. 2008-12-17 Richard Frith-Macdonald * Source/NSConnection.m: * Tools/gdnc.m: Enable keepalive only on mswindows and for server connections using NSMessagePort. 2008-12-16 Richard Frith-Macdonald * Source/NSLock.m: Tiny cleanup of lock finalisation process. 2008-12-15 Richard Frith-Macdonald * Source/NSURL.m: When initialising with schem, host and path, allow the host to contain username, password and port as well as just the host. Document this change (which seems to be how MacOS-X works). 2008-12-09 Wolfgang Lux * Source/unix/GSRunLoopCtxt.m (-pollUntil:within): Add missing local variable declaration and fix incorrect arguments for some receivedEvent:type:extra:forMode: messages in the select based implementation. 2008-12-08 Richard Frith-Macdonald * Source/NSKeyedUnarchiver.m: ([versionForClassName:]) implement * Source/NSUnarchiver.m: * Source/NSCoder.m: * Headers/Foundation/NSCoder.h: Update method to return NSInteger. 2008-12-07 Adam Fedor * configure.ac: Add custom objc library check from gnustep-make (So we can find libobjc in LOCAL domain). 2008-12-07 Richard Frith-Macdonald * Headers/Foundation/NSConnection.h: * Source/NSConnection.m: Fix keepalive bugs. 2008-12-07 Richard Frith-Macdonald * Headers/Additions/GNUstepBase/NSTask+GS.h: NSTask category * Headers/Additions/GNUstepBase/GSCategories.h: remove NSTask * Source/NSDistributedNotificationCenter.m: Use new header * Source/NSSocketPortNameServer.m: Use new header Reorganise so we have a lightweight header for the category of NSTask containing additional gnustep specific methods. 2008-12-06 Wolfgang Lux * Source/NSBundle.m (+bundleForLibrary:version:): Fix infinite loop in code dropping the extension from the library name. 2008-12-06 Richard Frith-Macdonald * Source/Additions/GSXML.m: Hack to avoid issues on systems where the xml headers use the reserved word 'id'. 2008-12-06 Richard Frith-Macdonald * Source/Additions/GSCategories.m: ([+launchPathForTool:]) Convenience method to locate a tool in the standard locations or in the PATH so that it can be used as the launch path of a task. 2008-12-05 Nicola Pero * configure.ac: On mingw32, set GNUSTEP_BASE_PATH to GNUSTEP_LOCAL_TOOLS by default to match the new default installation domain. Added new option --with-installation-domain allowing to override this setting. * configure: Regenerated. 2008-12-05 Richard Frith-Macdonald * Source/NSBundle.m: ([bundleForLibrary:version:]) extract version from end of library name if possible. ([_addFrameworkFromClass:]) find the framework directory from path to the dll on windows. 2008-12-04 Richard Frith-Macdonald * Source/Additions/GSObjCRuntime.m: Fix minor thread-safety issue with behaviors ... lock the runtime while modifying method lists. * Source/NSDictionary.m: Fix initialisation order so that if two threads are initialising the cached class info should always be set up in the correct order. * Source/NSSet.m: ditto. 2008-12-04 Richard Frith-Macdonald * Source/NSURL.m: Implement ipv6 addresses as per RFC2732 Fixes #25003 2008-12-02 Richard Frith-Macdonald * Source/NSURLProtocol.m: Add class for caching pairs of socket streams so we can eventually implement connection keepalive. 2008-12-01 Richard Frith-Macdonald * Source/NSKeyValueCoding.m: * Source/NSURLProtocol.m: * Headers/Additions/GNUstepBase/GSObjCRuntime.h: * Testing/nsconnection_client.m: When working with abstract selectors, try to use untyped ones so that we don't confuse checks we put into the method signature code. 2008-11-30 Wolfgang Lux * install.sh: Fix header syntax and provide default for make command argument. 2008-11-28 Richard Frith-Macdonald * config/config.unexpected.m: Add check for objc_set_unexpected * configure.ac: Use new check * configure: Regenerate * Headers/Additions/GNUstepBase/config.h.in: Regenerate * Source/GSSocketStream.m: Fix reliabce on expression evaluation order * Source/NSException.m: Implement uncaught exception handler for when native objc exceptions are enabled. 2008-11-27 Fred Kiefer * configure.ac: Correct typing error in last change. * configure: regenerate 2008-11-27 Richard Frith-Macdonald * configure.ac: check for native exceptions use. * configure: regenerate Disable the use of ffcall with native exceptions as the two are incompatible (ffcall changes the stack so that throwing an exception will crash the process). 2008-11-27 Richard Frith-Macdonald * Source/NSDistributedNotificationCenter.m: * Tools/gdnc.h: * Tools/gdnc.m: Use NSUInteger for the observer ID. 2008-11-27 Richard Frith-Macdonald * Documentation/GNUmakefile: * GNUmakefile: * NSCharacterSets/GNUmakefile: * NSTimeZones/GNUmakefile: * Resources/GNUmakefile: * Source/GNUmakefile: * SSL/GNUmakefile: * Tools/GNUmakefile: Removed GNUSTEP_INSTALLATION_DOMAIN. NB. This means that gnustep-base will now install in the local domain by default, and to get the old behavior you will need to do 'make GNUSTEP_INSTALLATION_DOMAIN=SYSTEM install' The rationale for this change is that the system domain is for resources installed by the operating system packagers, but the local domain is for add-ons you install yourself (to be used by all users of the system), and you don't normally want to overwrite the operating system supplied version by accident. 2008-11-26 10:09-EST Gregory John Casamento * Headers/Additions/GNUstepBase/GSVersionMacros.h: Add defines for earlier version of Mac OS X back to 10.0. * Source/synchronization.m: Correct a problem found during testing. * Testing/synctest/main.m: Updated test. 2008-11-24 Richard Frith-Macdonald * Source/NSObject.m: ([methodSignatureForSelector:]) Check that the types of the selector (if known) and the types of the actual method match. Raise an NSInternalInconsistencyException if they don't. 2008-11-23 Richard Frith-Macdonald * Source/Additions/unicode/gsm0338.h: Add more mappings from unicode characters representing accented letters to simple letters in the gsm alphabet for lossy conversion. 2008-11-22 Richard Frith-Macdonald * re-bump version to 1.17.0 for next release when we make a new unstable branch. 2008-11-21 Richard Frith-Macdonald * Version: set to 1.15.4 for new release on unstable branch. * Documentation/ReleaseNotes.gsdoc: Document the 1.15.4 release Make new release on unstable branch to that it's keeping up with the bugfixes in the stable branch. 2008-11-20 Richard Frith-Macdonald * Headers/Foundation/NSConnection.h: New ivars * Source/NSConnection.m: Add diuagnostic information and implement private mechanism for keepalive (for mswindows, where the NSMessagePort implementation doesn;t know if the remote end has gone away until it attempts to send to it). * Tools/gdnc..m: Use private keepalive mechanism. 2008-11-19 Richard Frith-Macdonald * Source/NSData.m: Fix bug #24883 * Headers/Foundation/NSRange.h: Update to use NSUInteger 2008-11-19 Richard Frith-Macdonald * configure.ac: Changes to tolerate older version of gnutls * configure: regenerate * config/pathtls.m4: Fix typos * Headers/Additions/GNUstepBase/config.h.in: regenerate * Source/GSSocketStream.m: Fix to send required events to handler after SSL or SOCKS module has dealt with them. * Source/GSStream.h: New method to reset sent events mask * Source/GSStream.m: ditto * Source/GSString.m: Fix nil pointer reference 2008-11-18 Richard Frith-Macdonald * Source/NSURL.m: Check class of arguments to designated initialiser * configure.ac: Warn about bug in libkvm * configure: Regenerate * Source/NSProcessInfo.m: Report problem in libkvm and suggest workarounds. 2008-11-17 Roland Schwingel * Source/GSSocketStream.m: * Source/NSPropertyList.m: * Source/NSDistributedNotificationCenter.m: * Source/NSSocketPort.m: * Source/NSRunLoop.m: * Source/GSFFCallInvocation.m: * Source/NSArray.m: * Source/inet_ntop.c: * Source/NSDebug.m: * Source/NSPredicate.m: * Source/GSHTTPURLHandle.m: * Source/GSFFIInvocation.m: * Source/NSMessagePort.m: * Source/win32/GSFileHandle.m: * Source/win32/NSUserDefaults.m: * Source/win32/NSMessagePort.m: * Source/win32/GSRunLoopCtxt.m: * Source/win32/NSMessagePortNameServer.m: * Source/NSKeyValueMutableArray.m: * Source/NSURL.m: * Source/mframe.m: * Source/NSObject.m: * Source/NSString.m: * Source/NSDecimalNumber.m: * Source/cifframe.m: * Source/Additions/GSXML.m: * Source/GSString.m: * Source/NSConnection.m: * Source/NSProxy.m: * Source/GSFormat.m: * Source/NSSet.m: * Source/NSTask.m: * Source/NSCharacterSet.m: * Source/NSNumberFormatter.m: Cosmetic changes plus a couple of fixes for 64bit mswindows. 2008-11-15 Richard Frith-Macdonald * Source/NSProcessInfo.m: Remove useless sysctl command. * Source/NSMessagePort.m: Ensure port is not deallocated while being invalidated. Fix memory leak of port lock. * Source/NSSocketPort.m: ditto 2008-11-15 Wolfgang Lux * Source/NSMessagePort.m (-invalidate, -removeHandle:): Fix potential crash while closing a message port. 2008-11-14 Wolfgang Lux * Source/NSProcessInfo.m (-processorCount, -activeProcessorCount): Improve portability. * Source/NSPathUtilities.m (NSTemporaryDirectory): Use /var/tmp on Darwin since /tmp is cleaned regularly. 2008-10-13 Richard Frith-Macdonald * Source/NSPage.m: Update to use NSUInteger and to cope with large address space in windows. * Headers/Foundation/NSObjCRuntime.h: typedef NSUInteger earlier * Headers/Foundation/NSZone.h: Update to use NSUInteger. * Source/NSProcessInfo.m; implement new MacOS-x 5 methods based on Fred's suggestion and Scotts code as fallback and wiht a version for mswindows too. 2008-10-11 Richard Frith-Macdonald * Source/NSUserDefaults.m: implement KVC methods to get and set values as these appear to be an undocumented feature of MacOS-X (bug #24807). 2008-11-05 17:27-EST Gregory John Casamento * Testing/synctest/GNUmakefile * Testing/synctest/GNUmakefile.postamble * Testing/synctest/GNUmakefile.preamble * Testing/synctest/main.m * Testing/synctest/PC.project * Testing/synctest/PC.project.backup * Testing/synctest/SyncTestInfo.plist: Added test tool for @synchronize. 2008-10-30 Richard Frith-Macdonald * Tools/gdomap.c: Improve error messages and information about the -a option. * Source/NSPredicate.m: parse literal strings 2008-10-29 Richard Frith-Macdonald * Source/NSException.m: Fix stacktrace to be available when built without DEBUG=YES. Check environment variable to activate/deactivate. * Documentation/Basegsdoc: Improve documentation of stack trace. 2008-10-28 Richard Frith-Macdonald * Source/GSString.m: Cope with loads of leading space in intValue and doubleValue. 2008-10-27 Richard Frith-Macdonald * Source/GSFormat.m: Fix possible problem when current unix locale does not use '.' as the decimal separator. 2008-10-27 Nicola Pero * Headers/Foundation/NSFileManager.h: Fixed typo - declare NSError class before referencing it. 2008-10-26 20:59-EDT Gregory John Casamento * Headers/Foundation/NSFileManager.h: Added declaration for new method here. * Source/NSFileManager.m: Added implementation for the method -(BOOL)createDirectoryAtPath:withIntermediateDirectories:attributes: error:. 2008-10-19 Wolfgang Lux * configure.ac: fix test for sychronization in objc runtime. 2008-10-19 Richard Frith-Macdonald * Source/synchronization.m: make internal functions private. 2008-10-16 Richard Frith-Macdonald * Source/NSCalendarDate.m: Fix typo (bug #24573) 2008-10-14 Richard Frith-Macdonald * Source/GSSocketStream.m: Fix for #24564 * Source/inet_pton.c: Fix for #24563 * Source/inet_ntop.c: Fix for #24563 2008-10-12 Larry Campbelln * Source/NSDate.m: Add keyed archiving support. 2008-10-11 Eric Wasylishen * Source/NSBundle.m: fix bug #24320 2008-10-10 Richard Frith-Macdonald * Source/NSTimeZones/NSTimeZones.tar: updated. 2008-10-03 Richard Frith-Macdonald * Source/Additions/GSMime.m: Ensure that we always return NO when we need mo more data to complete parsing. * Source/GSHTTPURLHandle.mL: Fix check for response parse completion. 2008-10-01 Adam Fedor * Source/DocMakefile: Add NSAffineTranform 2008-09-29 22:54-EDT Gregory John Casamento * Source/synchronization.m: Remove uneeded objc_sync_remove_node function. 2008-09-26 Richard Frith-Macdonald * Source/Additions/Unicode.m: Fix compilation problem on systems without iconv. 2008-09-25 00:18-EDT Gregory John Casamento * Source/synchronization.m: Correct issue in objc_sync_remove_node() method where it could do a NULL dereference. Also moved the locks on the tables to the highest level so to reduce the possibility of threading issues. 2008-09-24 17:26-EDT Gregory John Casamento * Source/NSUserDefaults.m: Corrected previous change. 2008-09-24 08:25-EDT Gregory John Casamento * Source/NSUserDefaults.m: -addSuiteNamed change so that we don't rely on the value of NSNotFound being -(2^32)-1 and a rollover to 0. 2008-09-23 20:31-EDT Gregory John Casamento * config.mak.in: Added reference to HAVE_OBJC_SYNC_ENTER * configure: Recompiled script * configure.ac: Changed configure to check for objc_sync_enter function. * Headers/Additions/GNUstepBase/config.h.in: Added #define here for HAVE_OBJC_SYNC_ENTER * Source/GNUmakefile: Added check for the value, if no, then compile synchronization.m * Source/synchronization.m: Implementation for @synchronize support. 2008-09-23 Richard Frith-Macdonald * Source/NSThread.m: add a couple of checks to ensure correct initialisation of class. * Source/NSDate.m: * Source/NSCalendarDate.m: Check for time interval since reference date being NaN, and raise an exception. 2008-09-21 00:05-EDT Gregory John Casamento * COPYINGv3: Adding back in. 2008-09-19 Richard Frith-Macdonald * Source/NSDistributedLock.m: Standardise the path we are given for the lock file. 2008-09-18 Richard Frith-Macdonald * Source/NSThread.m: try to make firing of thread performers more robust. * Source/Additions/GSMime.m: make some NSLog() calls be debug only. 2008-09-14 13:20-EDT Gregory John Casamento * install.sh: Install script for use by compile-all. 2008-08-25 18:55-EDT Gregory John Casamento * COPYINGv3: Remove since GNUstep is now GPLv2 again. * Headers/Foundation/NSNumberFormatter.h * Source/NSNumberFormatter.m: Added methods missing from GNUstep that are present in 10.4 (stringFromNumber:, numberFromString:) 2008-08-25 Fred Kiefer * Source/NSAutoreleasePool.m (-drain): Implement. * Source/NSAutoreleasePool.m (-dealloc): Reset _parent and _child. * Source/NSAutoreleasePool.m (-_endThread:): Free cache of ended thread not of current. 2008-08-20 Yavor Doganov (tiny change) * config/procfs.m4: Check for `proc' in /proc/mounts rather than relying on the output of `mount'; fixes build issue in chroots. Reported by Funda Wang (bug #23876). 2008-07-17 Richard Frith-Macdonald * Source/Additions/GSCategories.m: littleEndian() fix to work on systems with other word sizes. 2008-07-15 Richard Frith-Macdonald * Source/GSPrivate.h: New private function to get range of string func. * Source/NSString.m: Optimise replacing string in string. * Source/GSString.m: New function to return range getting function. * Source/GSeq.h: Fixup comment * Testing/string.m: Add trival check. Optimise ([replaceOccurrencesOfString:withString:options:range:]) 2008-07-11 Richard Frith-Macdonald * Source/Additions/Unicode.m: Add support for byte order specific unicode (including 32bit) via iconv. Change encoding lookup mechanism to cope with new Mac-OS-X encoding values. 2008-07-06 Richard Frith-Macdonald * Source/NSRunLoop.m: * Source/NSArray.m: * Source/NSSortDescriptor.m: * Source/Additions/GSCompatibility.m: * Source/NSDictionary.m: * Source/NSSerializer.m: * Source/NSSet.m: Wherever ([-getObjects:]) is called, check to see if the receiver is a proxy, and if so we populate the buffer by calling ([-objectAtIndex:]) instead. This because a proxy via DO does not know how many itesm are in the buffer and assumes it's only one. 2008-07-06 Richard Frith-Macdonald * configure.ac: use libffi in preference to ffcall as it doesn't mess up the stack. * configure: regenerate 2008-07-02 Richard Frith-Macdonald * Source/NSIndexSet.m: Implement ([-countOfIndexesInRange:]) 2008-06-30 Richard Frith-Macdonald * Source/GSFFIInvocation.m: * Source/NSInvocation.m: * Source/cifframe.h: * Source/cifframe.m: Tweaks to get NS_MESSAGE and NS_INVOCATION working on my 64bit system. 2008-06-28 Richard Frith-Macdonald * configure.ac: Check for sys/mman.h and mprotect * configure: regenerate * Headers/Additions/GNUstepBase/config.h.in: regenerate * Source/GSFFIInvocation.m: Use mmap and mprotect to ensure that closure memory is executable. 2008-06-27 17:22-EDT Gregory John Casamento * Source/NSUnarchiver.m: Issue a warning when the class can't be resolved by the runtime in decodeValueOfObjCType:at:. 2008-06-27 Richard Frith-Macdonald * Source/NSPropertyList.m: sort dictionary keys only if they are strings. This is the new MacOS-X behavior (old behavior was to sort if all responded to compare:). Fixes bug #23727 2008-06-21 Richard Frith-Macdonald * Headers/Foundation/NSException.h * Source/NSException.h Change macros for setting uncaught handler to be functions (to match MacOS-X) and make the pointer itsself be private. 2008-06-18 Richard Frith-Macdonald * Source/NSConnection.m: Fix error getting run loop for current thread when it has not already been set. 2008-06-16 Richard Frith-Macdonald * Headers/Additions/GNUstepBase/GSUnion.h: add NSUInteger type as addr * Headers/Additions/GNUstepBase/GSIMap.h: use addr for GSIMapNodeForSimpleKey() so that it works for pointers on machines where sizeof(int) != sizeof(void*) 2008-06-15 Richard Frith-Macdonald * Source/Additions/GSMime.m: Be more tolerant of illegal data in quoted printable words. 2008-06-13 Richard Frith-Macdonald * Source/Additions/Unicode.m: Fix incorrect adjustment of buffer when handling large string containing multibyte utf-8 data. 2008-06-12 Richard Frith-Macdonald * Update timezones, bump version to 1.17.0 for next release. 2008-06-12 Richard Frith-Macdonald * Documentation/ReleaseNotes.gsdoc: Add information about movement to MacOS-X compatibility. 2008-06-11 David Ayers * Source/NSNumberFormatter.m ([-stringForObjectValue:]): Implement handling of localizesFormat. Return string value of attributedStringForZero if applicable so that formatting for the common case is not short circuted for zero. 2008-06-10 Richard Frith-Macdonald * Tools/AGSHtml.m: if something is scheduled for removal, mark it as 'Likely to be changed/moved/removed' rather than 'deprecated'. 2008-06-10 Richard Frith-Macdonald * Headers/Foundation/NSString.h: * Headers/Foundation/NSBundle.h: * Headers/Foundation/NSSerialization.h: * Headers/Foundation/NSProcessInfo.h: * Headers/Foundation/NSMethodSignature.h: * Headers/Foundation/NSHost.h: * Headers/Foundation/NSArchiver.h: * Headers/Foundation/NSInvocation.h: Fix typo in macro name 2008-06-10 Richard Frith-Macdonald * configure.ac: Check for stdlib.h * Headers/Additions/GNUstepBase/config.h.in: add stdlib.h * configure: Regenerate * Source/NSString.m: Don't use realpath unless PATH_MAX is known * Headers/Foundation/NSObject.h: * Headers/Foundation/NSString.h: * Headers/Foundation/NSBundle.h: * Headers/Foundation/NSSerialization.h: * Headers/Foundation/NSProcessInfo.h: * Headers/Foundation/NSMethodSignature.h: * Headers/Foundation/NSHost.h: * Headers/Foundation/NSArchiver.h: * Headers/Foundation/NSInvocation.h: Mark non-OSX methods as deprecated so we can move them to the additions library or delete them if we want to. 2008-06-08 Richard Frith-Macdonald * COPYINGv3: * NSCharacterSets/GNUmakefile: * Source/NSIndexPath.m: * Source/NSSocketPortNameServer.m: * Source/NSMapTable.m: * Source/GSLocale.m: * Source/GSSocketStream.h: * Source/NSTimeZone.m: * Source/NSNetServices.m: * Source/hpux-load.h: * Source/NSHashTable.m: * Source/GSInvocation.h: * Source/NSURLCredential.m: * Source/GSSocketStream.m: * Source/NSValueTransformer.m: * Source/NSPortCoder.m: * Source/NSURLAuthenticationChallenge.m: * Source/Makefile.postamble: * Source/NSSpellServer.m: * Source/NSCalendarDate.m: * Source/NSBundle.m: * Source/NSKeyValueCoding.m: * Source/NSURLHandle.m: * Source/NSTimer.m: * Source/NSPropertyList.m: * Source/libgnustep-base-entry.m: * Source/GSConcreteValueTemplate.m: * Source/NSAffineTransform.m: * Source/CompatibilityHeaders.make: * Source/NSPathUtilities.m: * Source/NSScanner.m: * Source/NSDistributedNotificationCenter.m: * Source/NSProcessInfo.m: * Source/NSGeometry.m: * Source/NSNotificationQueue.m: * Source/GNUmakefile: * Source/thr-mach.h: * Source/NSSocketPort.m: * Source/NSRunLoop.m: * Source/NSAttributedString.m: * Source/NSUndoManager.m: * Source/NSMethodSignature.m: * Source/thr-mach.m: * Source/NSFormatter.m: * Source/NSUserDefaults.m: * Source/GSArray.m: * Source/GSFFCallInvocation.m: * Source/mframe/configure.ac: * Source/mframe/mframe.head: * Source/mframe/README: * Source/NSKeyValueMutableSet.m: * Source/NSArray.m: * Source/GSStream.h: * Source/NSMessagePortNameServer.m: * Source/objc-gnu2next.m: * Source/GSStream.m: * Source/NSKeyedArchiver.m: * Source/NSDebug.m: * Source/unix/Makefile.preamble: * Source/unix/GNUmakefile: * Source/unix/NSStream.m: * Source/NSKeyedUnarchiver.m: * Source/GSConcreteValue.m: * Source/NSPortMessage.m: * Source/NSURLDownload.m: * Source/NSDistributedLock.m: * Source/NSFileHandle.m: * Source/NSPredicate.m: * Source/simple-load.h: * Source/preface.m: * Source/NSKeyValueObserving.m: * Source/NSAssertionHandler.m: * Source/GSHTTPURLHandle.m: * Source/NSConcreteNumberTemplate.m: * Source/win32-load.h: * Source/NSCallBacks.h: * Source/NSZone.m: * Source/NSPage.m: * Source/NSCallBacks.m: * Source/NSURLCredentialStorage.m: * Source/NSPort.m: * Source/NSSortDescriptor.m: * Source/GSFFIInvocation.m: * Source/NSMessagePort.m: * Source/GSPrivate.h: * Source/GSDictionary.m: * Source/win32/GSFileHandle.m: * Source/win32/Makefile.preamble: * Source/win32/NSMessagePort.m: * Source/win32/GNUmakefile: * Source/win32/NSStream.m: * Source/win32/NSMessagePortNameServer.m: * Source/NSUnarchiver.m: * Source/GSCountedSet.m: * Source/NSConcreteNumber.h: * Source/NSInvocation.m: * Source/dld-load.h: * Source/NSFileManager.m: * Source/NSConcreteNumber.m: * Source/NSURLResponse.m: * Source/thr-pthread.m: * Source/objc-load.h: * Source/NSURLProtocol.m: * Source/NSURLCache.m: * Source/externs.m: * Source/NSNotificationCenter.m: * Source/GSAttributedString.m: * Source/objc-load.m: * Source/NSRange.m: * Source/NSCoder.m: * Source/NSHTTPCookieStorage.m: * Source/NSException.m: * Source/NSKeyValueMutableArray.m: * Source/NSCopyObject.m: * Source/NSURL.m: * Source/cifframe.h: * Source/NSString.m: * Source/NSObject.m: * Source/mframe.m: * Source/DocMakefile: * Source/NSDecimalNumber.m: * Source/NSCachedURLResponse.m: * Source/cifframe.m: * Source/null-load.h: * Source/Additions/Unicode.m: * Source/Additions/GCArray.m: * Source/Additions/GSXML.m: * Source/Additions/GNUmakefile: * Source/Additions/behavior.m: * Source/Additions/GSFunctions.m: * Source/Additions/GSCompatibility.m: * Source/Additions/Makefile.preamble: * Source/Additions/GSObjCRuntime.m: * Source/Additions/GSNextRuntime.m: * Source/Additions/GCDictionary.m: * Source/Additions/GSCategories.m: * Source/Additions/GCObject.m: * Source/Additions/GSInsensitiveDictionary.m: * Source/Additions/GSMime.m: * Source/Additions/GSLock.m: * Source/GSSet.m: * Source/NSNotification.m: * Source/NSNumber.m: * Source/NSDecimal.m: * Source/GSString.m: * Source/NSConnection.m: * Source/NSDateFormatter.m: * Source/GSPortPrivate.h: * Source/NSAutoreleasePool.m: * Source/NSThread.m: * Source/NSData.m: * Source/NSHTTPCookie.m: * Source/NSDate.m: * Source/NSHost.m: * Source/GSNetwork.h: * Source/callframe.h: * Source/NSProxy.m: * Source/NSObjCRuntime.m: * Source/NSURLProtectionSpace.m: * Source/callframe.m: * Source/NSProtocolChecker.m: * Source/NSError.m: * Source/GSeq.h: * Source/NSPipe.m: * Source/GSValue.m: * Source/NSDictionary.m: * Source/Makefile.preamble: * Source/GSHTTPAuthentication.m: * Source/NSClassDescription.m: * Source/NSSerializer.m: * Source/NSNull.m: * Source/NSURLRequest.m: * Source/NSValue.m: * Source/NSCountedSet.m: * Source/NSLog.m: * Source/GSFormat.m: * Source/NSIndexSet.m: * Source/GSFileHandle.m: * Source/NSLock.m: * Source/NSSet.m: * Source/NSDistantObject.m: * Source/NSTask.m: * Source/NSArchiver.m: * Source/win32-def.top: * Source/NSCharacterSet.m: * Source/NSPortNameServer.m: * Source/NSNumberFormatter.m: * Source/NSXMLParser.m: * Source/GSFTPURLHandle.m: * Source/NSEnumerator.m: * Source/GSURLPrivate.h: * Source/NSURLConnection.m: * SSL/GSSSLHandle.m: * SSL/Makefile.postamble: * SSL/Makefile.preamble: * SSL/configure.ac: * SSL/GNUmakefile: * SSL/COPYING.LIB: * Makefile.postamble: * configure.ac: * COPYING: * Headers/Foundation/NSTimeZone.h: * Headers/Foundation/NSNetServices.h: * Headers/Foundation/NSHashTable.h: * Headers/Foundation/NSRange.h: * Headers/Foundation/NSCoder.h: * Headers/Foundation/NSURLCredential.h: * Headers/Foundation/NSHTTPCookieStorage.h: * Headers/Foundation/NSException.h: * Headers/Foundation/NSByteOrder.h: * Headers/Foundation/NSValueTransformer.h: * Headers/Foundation/NSPortCoder.h: * Headers/Foundation/NSURL.h: * Headers/Foundation/NSCompoundPredicate.h: * Headers/Foundation/NSURLAuthenticationChallenge.h: * Headers/Foundation/NSObject.h: * Headers/Foundation/NSString.h: * Headers/Foundation/NSSpellServer.h: * Headers/Foundation/NSCalendarDate.h: * Headers/Foundation/NSDecimalNumber.h: * Headers/Foundation/NSBundle.h: * Headers/Foundation/NSKeyValueCoding.h: * Headers/Foundation/NSPointerFunctions.h: * Headers/Foundation/NSSerialization.h: * Headers/Foundation/NSURLHandle.h: * Headers/Foundation/NSPropertyList.h: * Headers/Foundation/NSTimer.h: * Headers/Foundation/NSAffineTransform.h: * Headers/Foundation/NSNotification.h: * Headers/Foundation/NSPathUtilities.h: * Headers/Foundation/NSScanner.h: * Headers/Foundation/NSDistributedNotificationCenter.h: * Headers/Foundation/NSProcessInfo.h: * Headers/Foundation/NSNotificationQueue.h: * Headers/Foundation/NSComparisonPredicate.h: * Headers/Foundation/NSStream.h: * Headers/Foundation/NSGeometry.h: * Headers/Foundation/NSDecimal.h: * Headers/Foundation/NSRunLoop.h: * Headers/Foundation/NSAttributedString.h: * Headers/Foundation/NSConnection.h: * Headers/Foundation/NSUndoManager.h: * Headers/Foundation/NSDateFormatter.h: * Headers/Foundation/NSMethodSignature.h: * Headers/Foundation/NSAutoreleasePool.h: * Headers/Foundation/NSFormatter.h: * Headers/Foundation/NSUserDefaults.h: * Headers/Foundation/NSThread.h: * Headers/Foundation/NSHTTPCookie.h: * Headers/Foundation/NSData.h: * Headers/Foundation/NSURLError.h: * Headers/Foundation/NSDate.h: * Headers/Foundation/NSHost.h: * Headers/Foundation/NSArray.h: * Headers/Foundation/NSProxy.h: * Headers/Foundation/NSObjCRuntime.h: * Headers/Foundation/NSURLProtectionSpace.h: * Headers/Foundation/NSKeyedArchiver.h: * Headers/Foundation/NSProtocolChecker.h: * Headers/Foundation/NSDebug.h: * Headers/Foundation/NSPortMessage.h: * Headers/Foundation/NSError.h: * Headers/Foundation/NSURLDownload.h: * Headers/Foundation/NSFileHandle.h: * Headers/Foundation/NSDistributedLock.h: * Headers/Foundation/NSPredicate.h: * Headers/Foundation/FoundationErrors.h: * Headers/Foundation/NSKeyValueObserving.h: * Headers/Foundation/NSDictionary.h: * Headers/Foundation/NSErrorRecoveryAttempting.h: * Headers/Foundation/NSClassDescription.h: * Headers/Foundation/NSNull.h: * Headers/Foundation/NSZone.h: * Headers/Foundation/NSURLRequest.h: * Headers/Foundation/NSValue.h: * Headers/Foundation/NSURLCredentialStorage.h: * Headers/Foundation/NSIndexSet.h: * Headers/Foundation/NSPort.h: * Headers/Foundation/NSSortDescriptor.h: * Headers/Foundation/NSLock.h: * Headers/Foundation/NSSet.h: * Headers/Foundation/NSDistantObject.h: * Headers/Foundation/NSExpression.h: * Headers/Foundation/NSTask.h: * Headers/Foundation/NSArchiver.h: * Headers/Foundation/Foundation.h: * Headers/Foundation/NSCharacterSet.h: * Headers/Foundation/NSInvocation.h: * Headers/Foundation/NSFileManager.h: * Headers/Foundation/NSUtilities.h: * Headers/Foundation/NSPortNameServer.h: * Headers/Foundation/NSNumberFormatter.h: * Headers/Foundation/NSXMLParser.h: * Headers/Foundation/NSEnumerator.h: * Headers/Foundation/NSURLResponse.h: * Headers/Foundation/NSURLConnection.h: * Headers/Foundation/NSIndexPath.h: * Headers/Foundation/NSURLProtocol.h: * Headers/Foundation/NSMapTable.h: * Headers/Foundation/NSURLCache.h: * Headers/Additions/GNUstepBase/GSLocale.h: * Headers/Additions/GNUstepBase/GSXML.h: * Headers/Additions/GNUstepBase/DistributedObjects.h: * Headers/Additions/GNUstepBase/behavior.h: * Headers/Additions/GNUstepBase/GSFunctions.h: * Headers/Additions/GNUstepBase/GSConfig.h.in: * Headers/Additions/GNUstepBase/preface.h.in: * Headers/Additions/GNUstepBase/GSObjCRuntime.h: * Headers/Additions/GNUstepBase/GSCategories.h: * Headers/Additions/GNUstepBase/GSIMap.h: * Headers/Additions/GNUstepBase/GCObject.h: * Headers/Additions/GNUstepBase/GSMime.h: * Headers/Additions/GNUstepBase/GSIArray.h: * Headers/Additions/GNUstepBase/GSUnion.h: * Headers/Additions/GNUstepBase/GSLock.h: * Headers/Additions/GNUstepBase/GSVersionMacros.h: * Headers/Additions/GNUstepBase/GSFileHandle.h: * Headers/Additions/GNUstepBase/GNUstep.h: * Headers/Additions/GNUstepBase/objc-gnu2next.h: * Headers/Additions/GNUstepBase/Unicode.h: * Makefile: * GNUmakefile: * macosx/config.h: * base.make.in: * Tools/gspath.m: * Tools/AGSHtml.h: * Tools/plmerge.m: * Tools/xmlparse.m: * Tools/AGSIndex.h: * Tools/AGSHtml.m: * Tools/AGSIndex.m: * Tools/sfparse.m: * Tools/gdnc.h: * Tools/plparse.m: * Tools/pldes.m: * Tools/defaults.m: * Tools/Makefile.postamble: * Tools/locale_alias.m: * Tools/Makefile.preamble: * Tools/DocMakefile: * Tools/gsdoc-1_0_0.dtd: * Tools/plget.m: * Tools/pl2link.m: * Tools/gdnc.m: * Tools/gsdoc-1_0_1.dtd: * Tools/gsdoc-1_0_2.dtd: * Tools/gsdoc-1_0_3.dtd: * Tools/AGSParser.h: * Tools/gsdoc-1_0_1.rnc: * Tools/gsdoc-0_6_5.dtd: * Tools/gsdoc-0_6_6.dtd: * Tools/plser.m: * Tools/gsdoc-0_6_7.dtd: * Tools/AGSOutput.h: * Tools/AGSParser.m: * Tools/autogsdoc.m: * Tools/make_strings/StringsFile.h: * Tools/make_strings/StringsEntry.h: * Tools/make_strings/make_strings.m: * Tools/make_strings/StringsFile.m: * Tools/make_strings/StringsEntry.m: * Tools/make_strings/GNUmakefile: * Tools/make_strings/SourceEntry.h: * Tools/make_strings/make_strings.h: * Tools/make_strings/GNUmakefile.preamble: * Tools/make_strings/SourceEntry.m: * Tools/AGSOutput.m: * Tools/GNUmakefile: * Tools/gdomap.c: * Tools/plist-0_9.dtd: * Tools/gdomap.h: * Tools/HTMLLinker.m: * Tools/pl.m: * Tools/cvtenc.m: * config/config.constant-string-class.m: * Testing/Makefile.postamble: * Testing/exported-strings.m: * Testing/gslock.m: * Testing/GNUmakefile: * Testing/nsattributedstring.m: * Testing/nsmethodsignature.m: * Testing/diningPhilosophers.m: * Testing/gsbehavior.m: * Testing/Makefile.preamble: * Testing/benchmark.m: * COPYING.LIB: Temporarily revert library and essential tools to LGPLv2 so that developers have longer to get used to LGPLv3. Keep non-essential tools and examples at GPLv3 2008-06-07 Richard Frith-Macdonald * Source/NSUserDefaults.m: Fix possible deadlock reported by Larry Campbell, and improve optimisation a little. 2008-06-06 Richard Frith-Macdonald * Source/NSTimeZone.m: Monitor to see if the time zone specified in the user defaults system changes. If so, we update the system zone. 2008-06-06 Richard Frith-Macdonald * Source/GSLocale.m: * Source/NSTimeZone.m: * Source/NSNetServices.m: * Source/NSSpellServer.m: * Source/NSBundle.m: * Source/NSPathUtilities.m: * Source/NSScanner.m: * Source/NSProcessInfo.m: * Source/NSArray.m: * Source/externs.m: * Source/NSCoder.m: * Source/NSString.m: * Source/NSConnection.m: * Source/NSAutoreleasePool.m: * Source/NSData.m: * Source/NSObjCRuntime.m: * Source/NSIndexSet.m: * Source/NSLock.m: * Source/NSSet.m: * Documentation/ReleaseNotes.gsdoc: * Headers/Foundation/NSTimeZone.h: * Headers/Foundation/NSNetServices.h: * Headers/Foundation/NSCoder.h: * Headers/Foundation/NSString.h: * Headers/Foundation/NSSpellServer.h: * Headers/Foundation/NSBundle.h: * Headers/Foundation/NSPathUtilities.h: * Headers/Foundation/NSScanner.h: * Headers/Foundation/NSProcessInfo.h: * Headers/Foundation/NSComparisonPredicate.h: * Headers/Foundation/NSConnection.h: * Headers/Foundation/NSAutoreleasePool.h: * Headers/Foundation/NSUserDefaults.h: * Headers/Foundation/NSData.h: * Headers/Foundation/NSArray.h: * Headers/Foundation/NSObjCRuntime.h: * Headers/Foundation/NSIndexSet.h: * Headers/Foundation/NSLock.h: * Headers/Foundation/NSSet.h: Lots of small OSX10.5 compatibility updates:- Some new enumerations and constant strings. Some new method implementations. Some new empty method stubs. Change NSLocale constant string to GSLocale in preparation for adding the new NSLocal class. 2008-05-25 Richard Frith-Macdonald * configure.ac: For now, only use ffi for sparc64 on solaris as it doesn't appear to work on bsd. 2008-05-24 Nicola Pero * Tools/Makefile.postamble: Use GNUSTEP_DOC_MAN instead of GNUSTEP_DOCUMENTATION_MAN. This requires gnustep-make version 2, but that was already a requirement. (Suggestion by Chris Vetter ). 2008-05-23 Richard Frith-Macdonald * configure.ac: Check for systems which need -lnsl (solaris) Reintroduce use of ffi by default on sparc64 as I just couldn't get ffcall to work at all and the latest ffi seems to work atr least for all the common cases. * Tools/gdnc.m: Fix incorrectly sized instance variable. 2008-05-22 Richard Frith-Macdonald * SSL/GSSSLHandle.m: Attempt to improve error logging. 2008-05-21 Richard Frith-Macdonald * Source/NSRunLoop.m: Fix reference to uninitialised variable. 2008-05-14 Richard Frith-Macdonald * Source/GSArray.m: Fix bug allowing nil to be placed in array. 2008-05-01 Richard Frith-Macdonald * configure.ac: try to use libffi on sparc64 as libffcall does not work. Warn if user tries to enable libffcall. 2008-04-25 Richard Frith-Macdonald * Source/NSPropertyList.m: Use more memory efficient bitmaps for old style property list parsing where we know we are only using 8bit characters. 2008-03-20 David Chisnall * Source/win32/GSRunLoopCtxt.m: Fix bad function call (bug #22676) 2008-03-19 Richard Frith-Macdonald * Source/NSAutoreleasePool.m: Use get_imp() to fetch the implementation of the release method. 2008-03-19 Richard Frith-Macdonald * Source/DocMakefile: include GNUstep.h * Headers/Foundation/NSObject.h: include GNUstep.h for macros * Headers/Foundation/NSBundle.h: move gnustep specific macros out * Headers/Additions/GNUstepBase/GSFunctions.h: undeprecate and add GSLocalizedStringFromTableInFramework from NSBundle.h * Headers/Additions/GNUstepBase/GNUstep.h: Add comments etc. Code changes to avoid duplication of macro definitions, make GNUstep.h usable anywhere, and rename a couple of GNUstep specific extensions to use the GS prefix rather than the (reserved by Apple) NS prefix. 2008-03-18 Riccardo Mottola * Source/GNUMakefile: Added FoundationErrors.h 2008-03-18 Richard Frith-Macdonald * Source/NSString.m: Add a couple of new MacOS-X methods. * Headers/Foundation/NSString.h: ditto * Headers/Foundation/FoundationErrors.h: New list of error codes * Headers/Foundation/Foundation.h: include error codes More MacOS-X compatibility tweaks 2008-03-17 Richard Frith-Macdonald * Headers/Foundation/NSThread.h: * Source/NSThread.m: Add ([+isMainThread]) and ([-isFinished]). Also check that we are not trying to perform a selector on an invalid thread finished. 2008-03-17 Richard Frith-Macdonald * Source/NSRunLoop.m: * Source/unix/GSRunLoopCtxt.m: * Source/GSRunLoopCtxt.h: * Source/GSPrivate.h: * Source/win32/GSRunLoopCtxt.m: * Source/NSConnection.m: * Source/NSThread.m: * Headers/Foundation/NSThread.h: Got round to committing the thread changes held back for last release. Beware ... this code is not properly tested yet. The idea is that it should provide the new (in MacOS-X 10.5) methods to support performing of selectors in other threads. 2008-03-17 Richard Frith-Macdonald * Source/NSPort.m: * Source/NSException.m: * Source/NSConnection.m: * Headers/Foundation/NSException.h: * Headers/Foundation/NSPort.h: Update exceptions to match those in MacOS-X for compatibility. 2008-03-16 Matt Rice * Source/NSException.m: Add NSObjectNotAvailableException. * Headers/Foundation/NSException.h: Ditto. 2008-03-16 Richard Frith-Macdonald * Source/NSDebug.m: Trap sigbus if gcc functions to get stack frame info run off the end of the stack. * Source/NSString.m: Implement ([-decimalValue]) ... undocumented feature of MacOS-X foundation. 2008-03-16 Richard Frith-Macdonald * Source/NSArray.m: * Source/NSSet.m: Add ([-valueForKeyPath:]) to implement KVC aggregate operators. * Source/NSKeyValueCoding.m: When accessing instance variable directly look for _var before var as in MacOS-X 2008-03-14 Nicola Pero * Source/NSDictionary.m ([-initWithObjectsAndKeys:], [+dictionaryWithObjectsAndKeys:]): Improved documentation: tell people to terminate the list with nil. 2008-03-13 Richard Frith-Macdonald * Source/NSAutoreleasePool.m; use ([+instanceMethodForSelector:]) to cache release method implementation for a class. 2008-03-13 Richard Frith-Macdonald * Source/NSKeyValueCoding.m: Make all keypath methods perform recursive evaluation of the path for compatibility with MacOS-X and to permit classes to effectively override the keypath methods. 2008-03-12 Richard Frith-Macdonald * Source/Additions/GSInsensitiveDictionary.m: Include GSCategories.h for NSWarnMLog 2008-03-12 Richard Frith-Macdonald * Source/Additions/GSInsensitiveDictionary.m: Don't do gnustep specific debug if building apple-apple-apple 2008-03-11 Adam Fedor * Version 1.15.3 2008-03-05 Richard Frith-Macdonald * Source/NSPage.m: Removed obsolete includes (see bug #22479) 2008-03-05 Matt Rice * Source/NSKeyValueCoding.m ([-setValue:forKey:]): Pass value to takeValue:forKey:. 2008-03-05 Richard Frith-Macdonald * Source/NSBundle.m Make better guess at what the caller meant when they give us a non-absolute path name on mingw. 2008-03-03 Richard Frith-Macdonald * Source/NSNull.m: Make result of description method match MacOSX * Headers/Foundation/NSKeyValueObserving.h: Add new MacOSX features. * Source/NSKeyValueObserving.m: Rewrite code for handling observations and notifications. Fix various bugs and add new options from version 10.5 of MacOS-X 2008-03-02 Richard Frith-Macdonald * Source/NSKeyValueCoding.m: Avoid calling deprecated methods as a result of KVO overriding them. * Source/NSKeyValueObserving.m: Minor tidyups 2008-02-25 Richard Frith-Macdonald * Headers/Foundation/NSObject.h: Moved some headers to NSObjCRuntime.h * Headers/Foundation/NSObjCRuntime.h: Added NSInteger and NSUInteger for MacOSX compatibiulity. * Headers/Additions/GNUstep/GSVersionMacros.h: Don't declare constants which should be set by the user to say which MacOSX version they want. * Headers/Foundation/NSPointerFunctions.h: New MacOSX declarations ... no definitions yet. 2008-02-23 Richard Frith-Macdonald * Source/NSKeyValueObserving.m: Don't calculate KVO info in cases where there is no observer. 2008-02-22 Richard Frith-Macdonald * Source/mframe/mframe.head: Change function arguments * Source/mframe.m: Support nul termination of type strings * Source/NSMethodSignature.m: nul terminate type strings * Source/NSObjCRuntime.m: update for changed function args 2008-02-21 Richard Frith-Macdonald * Headers/Foundation/NSKeyValueCoding.h: * Headers/Foundation/NSThread.h: * Headers/Foundation/NSKeyValueObserving.h: * Headers/Additions/GNUstepBase/GSXML.h: Documentation fixes. 2008-02-20 Richard Frith-Macdonald * Source/Additiuons/GSObjCRuntime.m: Add support for NSPoint, NSRange, NSSize and NSRect for bug #22277 2008-02-20 Richard Frith-Macdonald * configure.ac: Add convoluted checks to cope with interdependency os some system headers on FreeBSD. * configure: regenerate * Headers/Additions/GNUstepBase/config.h.in: Regenerate * Source/NSFileManager.m: Include sys/cdefs.h when available (for FreeBSD). 2008-02-20 Richard Frith-Macdonald * Source/Additions/Unicode.m: * Headers/Additions/GNUstepBase/GSVersionMacros.h: Minor tweaks for building under leopard. * Source/NSPathUtilities.m: minor thread safety fix. * Source/NSSocketPort.m: remove bogus comment * Source/NSMessagePort.m: remove bogus comment * Source/Additions/Unicode.m: add lockign for nl_langinfo * Source/Additions/GSMime.m: New method to parse headers * Headers/Additions/GNUstepBase/GSMime.h: ditto * Source/NSString.m: Change ([-boolValue]) to match new MacOS-X method. * Source/GSString.m: ditto 2008-02-19 Nicola Pero * Source/GNUmakefile (libgnustep-base_NEEDS_GUI): Set to NO (libgnustep-baseadd_NEEDS_GUI): Set to NO. * SSL/GNUmakefile (SSL_NEEDS_GUI): Set to NO. 2008-02-17 Richard Frith-Macdonald * Source/NSDistributedNotificationCenter.m: Remove delay and change code to immediately release resources used while trying to connect to server. * Source/NSConnection.m: When creating a connection and getting its proxy, release the connection immediately if the proxy is nil, so that repeated calls don't use more resources. * Source/NSMessagePortNameServer.m: Implement distributed locking of names directory. * Source/NSNSAutoreleasePool.m: When emptying pool, add diagnostic message and exceptions where an object we are releasing is bad in some way. * Headers/Foundation/NSPropertyList.h: Clarify/fix documentation of date format. 2008-02-17 19:21-EST Gregory John Casamento * Source/NSDistributedNotificationCenter.m: Added a short wait to the _connect method when starting GDNC to correct bug#22351. Worked with Riccardo Motolla to test this (riccardo@kaffe.org). 2008-02-16 Richard Frith-Macdonald * Source/Additions/GSMime.m: Fix errors in code for folding header lines. 2008-02-14 Richard Frith-Macdonald * Source/GSHTTPURLHandle.m: Remove self as observer of socket while ssl connection is in progress. 2008-02-13 Richard Frith-Macdonald * Source/NSArray.m: Minor optimisation ...use a subarray when returning all objects from an array enumerator. 2008-02-07 Richard Frith-Macdonald * Source/NSXMLParser.m: Fix retain/release error. 2008-02-06 Richard Frith-Macdonald * Source/NSXMLParser.m: Fix bug in sloppy parser, failing to skip space at end of tag and therefore missing the trailing '/' in a collapsed element. 2008-01-28 Adam Fedor * configure.ac: Add option to disable bfd. * Source/inet_pton.c, Source/inet_ntop.c: Add includes to compile on Solaris 2008-01-27 Richard Frith-Macdonald * Source/NSXMLParser.m: Implement reporting of namespace prefixes with libxml2 based parser and with sloppy parser. 2008-01-26 Richard Frith-Macdonald * Source/Additions/NSXML.m: Fixup SAX interface to pass namespace information separately (retain old method for binary backward compatibility). * Source/NSXMLParser.m: Implement handing of namespaces with libxml2 based parser. 2008-01-25 Richard Frith-Macdonald * Source/Additions/NSXML.m: In SAX count namespace declarations in element start as attributes. 2008-01-23 Richard Frith-Macdonald * Source/NSHost.m: Fix minor thread safety issue ... could get release host if another thread clears cache at same time as lookup. 2008-01-21 Fred Kiefer * Resources/Languages/Spanish: Quoting corrections by Matias Adrian . 2008-01-18 Richard Frith-Macdonald * Tools/autogsdoc.m: Fix bug recording sources and outputs in index and dependencies. * Source/NSTimeZone.m: Fix coding style errors and buffer overrun on mswindows reported by Roland Schwingel. 2008-01-14 Nicola Pero * configure.ac: Do not read obsolete GNUSTEP_USER_DIR and do not substitute GNUSTEP_TARGET_USER_DIR. * configure: Regenerated. * Headers/Additions/GNUstepBase/config.h.in: Regenerated. * Source/NSPathUtilities.m: Do not read obsolete GNUSTEP_USER_DIR from the configuration. Ignore it if found. It is never used anywhere. * Documentation/Base.gsdoc: Removed or slightly updated some obsolete documentation on filesystem configuration. 2008-01-10 Richard Frith-Macdonald * Source/inet_pton.c: * Source/inet_ntop.c: * Source/GSNetwork.h: * Source/GNUmakefile: * configure.ac: * configure: Avoid using mswindows getnameinfo function as it doesn't work for Riccardo for some reason ... perhaps older mingw32 doesn't have it. 2008-01-10 Richard Frith-Macdonald * Source/NSPathUtilities.m: Allow '../' to indicate a relocatable resource. Add support for GlobalDefaults.plist. * Source/NSUserDefaults.m: Improve documentation * Documentation/ReleaseNotes.gsdoc: Note recent changes. * Documentation/Base.gsdoc: Improve documentation * Headers/Foundation/NSUserDefaults.h: Improve comments. 2008-01-10 Richard Frith-Macdonald * Source/GSSocketStream.m: tweak TLS code * Source/GSStream.m: simplify socket code * configure.ac: enable gnu tls by default * configure: regenerate 2008-01-09 Richard Frith-Macdonald * Source/GSSocketStream.h: * Source/GSSocketStream.m: * Source/unix/NSStream.m: * Source/GSNetwork.h: Further reorganisation and simplification for socks support. 2008-01-07 Richard Frith-Macdonald * Source/GSSocketStream.h: simplify socket address handling * Source/GSSocketStream.m: ditto + more work on socks * Source/GSStream.h: minor tweaks * Source/GSStream.m:minor tweaks * Source/unix/NSStream.m: simplified socket address handling * Source/GSNetwork.h: add macro to get socket address length * Source/GSHTTPAuthentication.m: Handle arg classh check in init * Source/NSURLRequest.m: ditto * Source/NSURLProtocol.m: attempt to add support for authentication 2008-01-07 Fred Kiefer * Source/NSFileManager.m (-fileSystemAttributesAtPath:): Correct block size for systems using statvfs(). 2008-01-05 Richard Frith-Macdonald * Source/GSSocketStream.m: Try to honor protocol requested. * Source/NSURLProtocol.m: Add https 2008-01-05 Nicola Pero * Source/Additions/GSXML.m ([GSXPathContext -registerNamespaceWithPrefix:href:]): Added new method to support namespaces in XPath expressions. * Headers/Additions/GNUstepBase/GSXML.h: Same. 2008-01-05 Richard Frith-Macdonald * config/pathtls.m4: fixup form mingw32 * configure: regenerate * Source/GSSocketStream.m: Fix missing ifdefs 2008-01-04 Riccardo Mottola * Source/NSKeyValueObserving.m: fixed cc99ism 2008-01-04 Richard Frith-Macdonald * Source/GSSocketStream.h: * Source/GSSocketStream.m: Add rudimentary gnutls support. Client sockets only, no checking of certificates etc. 2007-01-04 Richard Frith-Macdonald * config/pathtls.m4: New checks for gnu tls * configure.ac: Add checks for gnu tls. * config.mak.in: Take note of tls availability * Headers/Additions/GNUstepBase/config.h.in: ditto * base.make.in: ditto * configure: regenerate Preparatory checks for using gnu tls. 2008-01-04 Richard Frith-Macdonald * Source/GSSocketStream.h: derived from GSStream.h * Source/GSSocketStream.m: derived from GSStream.m * Source/GNUmakefile: use new files * Source/GSStream.h: remove code to GSSocketStream.h * Source/GSStream.m: remove code to GSSocketStream.m * Source/unix/NSStream.m: include GSSocketStream.h * Source/win32/NSStream.m: include GSSocketStream.h Minor restructuring for clarity. 2008-01-04 Richard Frith-Macdonald * Headers/Foundation/NSStream.h: Tweak comments. * Source/GSNetwork.h: New file for common networking declarations. * Source/GSStream.h: * Source/GSStream.m: * Source/unix/NSStream.m: * Source/win32/NSStream.m: Extract socket networking code for both unix and windows into semi-abstract superclasses for input/output/server streams so that we avoid huge duplication of code and can maintain the socket code more easily. Alter the behavior of the code on windows so that when the other end closes the connection we should be able to read all data in transit in the same way as on unix (ie don't close the local end until a read/write actually fails). 2008-01-03 Richard Frith-Macdonald * Source/inet_pton.c: Add mswindows implementation of inet_ntop() as well. 2008-01-02 Richard Frith-Macdonald * Source/win32/GSFileHandle.m: rename to GSFileHandleWin32.m * Source/win32/NSUserDefaultsWin32.m: rename to NSUserDefaults.m * Source/win32/NSMessagePortWin32.m: rename to NSMessagePort.m * Source/win32/NSStreamWin32.m: rename to NSStream.m * Source/win32/NSMessagePortNameServerWin32.m: rename to NSMessagePortNameServer.m * Source/win32/GNUmakefile: Rename source files for consistency. 2008-01-01 Adam Fedor * Tools/HTMLLinker.gsdoc: Readded 2008-01-01 Adam Fedor * Version 1.15.2 2007-12-31 Richard Frith-Macdonald * Source/NSMessagePort.m: * Source/NSSocketPort.m: Fix error sending NSPortMessage objects which have not reserved space in their first component. 2007-12-26 Richard Frith-Macdonald * config/config.joinable.m: test for joinable threads. * configure.ac: Add test for setrlimit and joinable threads * configure: regenerate * Headers/Additions/GNUstepBase/config.h.in: regenerate * Source/NSThread.m: implement setting stack size for new threads. Hack in workaround for versions of libobjc which leak thread resource memory. 2007-12-24 Adam Fedor * configure.ac: Don't fail if ffcall trampolines don't work. * configure: regnerate. 2007-12-24 Richard Frith-Macdonald * Source/NSRunLoop.m: Perhaps a bit paranoid, but alter to recheck all timers after any timer is fired, so we ar sure to pick up any changes done to timer fire dates during the firing of a timer. * Source/NSThread.m: Fix memory leak and correct thread startup semantics to be like MacOS-X I hope. 2007-12-22 Richard Frith-Macdonald * Source/NSRunLoop.m: Fix error finding earliest timer for limit date. 2007-12-21 Richard Frith-Macdonald * Source/GSLocale.m: protect locale access with locks. 2007-12-21 David Ayers * Source/NSPathUtilities.m (_POSIX_PTHREAD_SEMANTICS): Define to expose POSIX compliant signatures for get(pw/gr)(nam/uid)_r. * Headers/Additions/GNUstepBase/config.h.in, configure.ac (alloca.h): Check for header. * configure: Regenerate. * Source/mframe.m, Source/cifframe.m, Source/NSConnection.m, Source/callframe.m, Source/GSFormat.m: Include alloca.h where available. 2007-12-20 David Ayers * Headers/Additions/GNUstepBase/GSLock.h: Include GSObjCRuntime.h for GS_EXPORT declaration. * Source/NSFileManager.m (_POSIX_PTHREAD_SEMANTICS): Define to expose POSIX compliant signatures for get(pw/gr)(nam/uid)_r. 2007-12-19 Richard Frith-Macdonald * configure.ac: Add checks for thread-safe versions of some standard library functions. * Headers/Additions/GNUstepBase/config.h.in: Regenerate * configure: Regenerate * Source/NSPathUtilities.m: * Source/NSProcessInfo.m: * Source/NSFileManager.m: * Source/externs.m: * Source/Additions/GSObjCRuntime.m: * Source/Additions/GSCategories.m: * Source/Additions/GSLock.m: * Headers/Foundation/NSObject.h: * Headers/Additions/GNUstepBase/GSLock.h: * Tools/defaults.m: Use thread-safe variants of system functions or pretect unsafe ones using gnustep_global_lock. Fixes part (but not all) of bug #21320 2007-12-17 Fred Kiefer * Source/NSKeyValueObserving.m (-setKeys:triggerChangeNotificationsForDependentKey:): Correct the key strategy of the map. 2007-12-17 Adam Fedor * Source/Makefile.postamble: Use DESTDIR over obsolete INSTALL_ROOT_DIR * configure.ac, config/objc-con-autoload.m4, config/procfs.m4: Some improvements for cross-compiling. 2007-12-15 Fred Kiefer * Source/NSKeyValueObserving.m (-keyPathChanged:): Correct forwarding of changes. 2007-12-15 Fred Kiefer * Source/NSValueTransformer.m, * Source/externs.m: Moved name of standard NSValueTransformers to externs and corrected strings. 2007-12-15 Fred Kiefer * Source/NSKeyValueObserving.m (-overrideSetterFor:): Replace exception with log message. * Source/NSKeyValueObserving.m (-addObserver:...context:): Use original class as key for replacement. 2007-12-15 Fred Kiefer * Source/NSKeyValueObserving.m (-overrideSetterFor:): Manually capitalize the string, as the NSString method capitalizedString lowers all other characters. 2007-12-14 Fred Kiefer * Source/NSKeyValueObserving.m (-overrideSetterFor:): Made aware of dependent key mapping. 2007-12-14 Richard Frith-Macdonald * Source/NSKeyValueObserving.m: Rewrite code for the subclass which handles overriding of setters. Should only override the setters for the keys which have been observed. Compiles but untested! 2007-12-11 Richard Frith-Macdonald * Source/NSUserDefaults.m: catch any exception if som eone breaks our lock on the defaults file. 2007-12-11 Richard Frith-Macdonald * Source/NSIndexSet.m: Test and debug ([-initWithCoder:]) and ([-encodeWithCoder:]) methods for keyed archiving of sets with multiple index ranges. Implement old-style coding/decoding as well. 2007-12-10 Chris Farber * Source/NSKeyValueObserving.m: implement methods needed for gui bindings. 2007-12-08 Richard Frith-Macdonald * Source/NSRunLoop.m: Deal with mutation of timers array during firing of a timer. 2007-12-07 Richard Frith-Macdonald * Headers/Additions/GNUstepBase/GSConfig.h.in: * Headers/Foundation/NSString.h: declare unichar as uint16_t 2007-12-07 Richard Frith-Macdonald * Source/NSRunLoop.m: Keep timers unordered and check all of them each time round ... to avoid bug where a timer is added to more than one run loop mode and firing in one mode could result in badly ordered timers in another mode. Handle resetting of time for repeating timers. Allow timeout handler callbacks to use ([-setFireDate:]) and have it honoured. * Source/NSTimer.m: Remove resetting of fire date from ([-fire]) and move it to the run loop for MacOS-X compatibility. 2007-12-06 Richard Frith-Macdonald * Source/NSRunLoop.m: Report the current mode when producing detailed debug output, for better tracking of problems. 2007-12-06 Richard Frith-Macdonald * Source/NSException.m: fix error reporting module containing code and limit the length of the stack trace. 2007-12-06 Richard Frith-Macdonald * Source/NSURL.m: Increase detail of information about bad URL string on initialisation. Only output debug info if --GNU-Debug=dflt 2007-12-06 Richard Frith-Macdonald * Source/NSException.m: honour environment variable for displaying stack trace. 2007-12-06 Richard Frith-Macdonald * Source/NSIndexSet.m (-initWithCoder:): Implement guessed algorithm for keyed archiving of sets with multiple index ranges. 2007-12-06 Fred Kiefer * Source/NSIndexSet.m (-initWithCoder:): Fix wrong method in last change. 2007-12-05 Richard Frith-Macdonald * Source/NSException.m: Add new MacOS-X method and improve stack trace code. * Source/NSXMLParser.m Add include for NSDictionary. * Documentation/Base.gsdoc: Improve documentation of stack trace. * Headers/Foundation/NSException.h: Add new MacOS-X method. 2007-12-05 David Ayers * Source/NSDecimalNumber.m: (isinf,isnan,isinff,isnanf): Remove. (GSIsNAN,GSIsInf): Attempt a more portable approach with using _ISOC99_SOURCE which is also supported by some BSD's and possibly Solaris. 2007-12-04 Richard Frith-Macdonald * Source/NSFileManager.h: move includes around to fix bug #21718 2007-12-03 David Ayers * Source/NSDecimalNumber.m: (isinf,isnan,isinff,isnanf): Temporary empty definitions of C99 macros for environments which do not define them. 2007-12-03 Fred Kiefer * Source/NSIndexSet.m (-initWithCoder:, -encodeWithCoder) * Source/NSData.m (NSMutableData-initWithCoder:, -encodeWithCoder): Add some keyed encoding/decoding. 2007-12-03 Richard Frith-Macdonald * Source/NSDebug.m: * Source/GSPrivate.h: * Source/NSException.m: * Source/NSThread.m: Rewrite some stackframe handling code for greater efficiency. When raising an exception, just get the current stack and don't bother translating addresses to method/function information until needed by the -description method. Improves performance of exception handling and eliminates the possibility of a recursive exception due to a problem in the stacktrace code. 2007-12-02 David Ayers * Source/NSDecimal.m (GSDecimalDouble): Use NAN when available. * Source/NSDecimalNumber.m ([initWithBytes:objCType:]): Implement initialization with scalar types. Use GSPrivateDefaultLocale to initialze intermediate string to match expectations of initWithString. (NSDecimalNumberClass): Added local class cache. ([+initialize]): Initialize new cache. ([-compare]): Test for all subclasses instead of only NSDecimalNumber instances. * Source/NSCalendarDate.m: Add explicit include of NSDictionary.h. * Source/NSNotification.m: Ditto. * Source/NSURLResponse.m: Ditto. Use available dictionary declartion. * Source/NSURLProtocol.m: Add explicit import of NSData.h. * Source/NSSerializer.m: Add explicit import of NSEnumerator.h. * Source/NSURLConnection.m ([-initWithResponsePointer:andErrorPointer:]): Add declaration. * Source/NSKeyValueMutableArray.m: Various non-functional variable and parameter renames to avoid bogus compiler warnings. * Source/NSKeyValueMutableSet.m: Ditto. 2007-11-30 Richard Frith-Macdonald * Tools/gdomap.h: fix typo 2007-11-29 Marcus Muller * Source/NSKeyValueCoding.m: Make backward compatibility work with situations where we have classes using both new and old APIs in the same executable. 2007-11-29 Richard Frith-Macdonald * Source/GSLocale.m: * Source/NSTimeZone.m: * Source/NSNetServices.m: * Source/NSURLCredential.m: * Source/NSPortCoder.m: * Source/NSURLAuthenticationChallenge.m: * Source/NSKeyValueCoding.m: * Source/NSBundle.m: * Source/NSURLHandle.m: * Source/NSPropertyList.m: * Source/NSAffineTransform.m: * Source/GSRunLoopWatcher.m: * Source/NSUserDefaults.m: * Source/GSArray.m: * Source/GSFFCallInvocation.m: * Source/NSArray.m: * Source/GSStream.m: * Source/NSDebug.m: * Source/unix/NSStream.m: * Source/NSKeyedUnarchiver.m: * Source/GSConcreteValue.m: * Source/NSURLDownload.m: * Source/GSHTTPURLHandle.m: * Source/NSURLCredentialStorage.m: * Source/GSFFIInvocation.m: * Source/GSDictionary.m: * Source/GSCountedSet.m: * Source/NSUnarchiver.m: * Source/win32/NSStreamWin32.m: * Source/NSURLResponse.m: * Source/NSURLProtocol.m: * Source/NSURLCache.m: * Source/GSAttributedString.m: * Source/NSException.m: * Source/NSURL.m: * Source/Additions/GSObjCRuntime.m: * Source/Additions/GSInsensitiveDictionary.m: * Source/GSSet.m: * Source/NSConnection.m: * Source/GSString.m: * Source/NSHost.m: * Source/NSURLProtectionSpace.m: * Source/GSValue.m: * Source/NSDictionary.m: * Source/GSHTTPAuthentication.m: * Source/NSURLRequest.m: * Source/NSCountedSet.m: * Source/GSFormat.m: * Source/GSFileHandle.m: * Source/NSSet.m: * Source/NSArchiver.m: * Source/NSPortNameServer.m: * Source/GSFTPURLHandle.m: * Source/NSEnumerator.m: * Source/GSURLPrivate.h: * Source/NSURLConnection.m: * Headers/Foundation/NSArray.h: * Headers/Foundation/NSFileManager.h: * Headers/Foundation/NSUtilities.h: * Tools/defaults.m: * Tools/make_strings/make_strings.m: * Tools/make_strings/StringsEntry.m: * Testing/nstimezone.m: * Testing/nsarray.m: * Testing/nsprocessinfo.m: * Testing/nsdictionary.m: * Testing/nsset.m: * Testing/nsarchiver.m: * Testing/call.m: * Testing/benchmark.m: * Testing/nsbundle.m: Remove use of deprecated NSUtilities.h header, and add explicit includes of NSDictionary.h, NSEnumerator.h etc. 2007-11-29 Richard Frith-Macdonald * Source/NSKeyValueCoding.m: Remove erroneous check for nil argument in obsolete method ([takeValue:forKey:]). 2007-11-28 Richard Frith-Macdonald * Source/Additions/GSMime.m: Improve code for folding header lines to try to make sure long values don't go beyond the 78 character limit. 2007-11-26 Richard Frith-Macdonald * Source/Additions/GSXML.m: Make check for apple property lists more tolerant. 2007-11-25 Richard Frith-Macdonald * Headers/Foundation/NSThread.h: Add new methods from MacOS 10.5 Add new ivars to match. Add _reserved to preserve binary compatibility over future changes. Make all ivars private. * Source/NSThread.m: Implement some new MacOS-5 stuff and add stubs for stack size and thread cancellation. * Source/NSException.m Implement ([NSThread+callStackReturnAddresses]) Restructure a little to avoid problems when building without debug. 2007-11-09 Adam Fedor * Version 1.15.1 2007-11-06 Roland Schwingel * Source/NSTimeZone.m: In windows use wide (unichar) API 2007-11-05 Richard Frith-Macdonald * Source/NSXML.m: Make sloppy parser available for internal use when parsing bad xml produced by Apple tools. * Source/NSPropertyList.m: Use GSSloppyXMLParser if normal xml2 based parsing fails due to Ap[ple4's inclusioon of illegal characters in the XML. 2007-10-31 Richard Frith-Macdonald * Source/NSUserDefaults.m: ([setBoolForKey:]) changed to store YES or NO as a string for MacOS-X compatibility. 2007-10-30 Adam Fedor * gnustep-base.spec.in: Change Copyright to License. 2007-10-11 Wolfgang Lux * Source/NSUndoManager: Prevent incorrect posting of notifications during undo/redo and avoid unnecessary creation of undo groups. 2007-10-10 Fred Kiefer * Source/NSDecimal.m (NSDecimalMultiplyByPowerOf10): Move check of over/underflow after copy. Patch by Mark Tracy . 2007-10-03 Richard Frith-Macdonald * Source/NSData.m: Fix ([-classForCoder:]) to return base class of cluster (bug #21133) * Source/cifframe.m: avoid compiler warnings (bug #16996) 2007-09-25 Richard Frith-Macdonald * Source/Additions/GSMime.m: Decode headers as latin1 by default if parsing http rather than mime. 2007-09-14 Richard Frith-Macdonald Update files to use LGPL3 and GPL3 licenses. 2007-09-09 Richard Frith-Macdonald * Source/NSNotificationCenter.m: Wrap posting of notification in exception handler to log exceptions. 2007-08-24 23:53-EDT Gregory John Casamento * Headers/Foundation/NSPort.h: Removed commented out declaration in the header. 2007-08-04 David Ayers * Source/GSHTTPURLHandle.m (writeKeyCallBacks): Use retained callbacks for keys. 2007-08-02 Richard Frith-Macdonald * Source/NSProcessInfo.m: Private method to check existence of process. 2007-07-31 Richard Frith-Macdonald * Headers/Foundation/NSRange.h: * Headers/Foundation/NSException.h: * Headers/Foundation/NSGeometry.h: * Headers/Foundation/NSAutoreleasePool.h: * Headers/Additions/GNUstepBase/preface.h.in: * macosx/GNUstepBase/preface.h: Use __typeof__ rather than typeof so that if the header is included in user code which is compiled with a flag to disalow typeof, the code will still work. 2007-07-25 Fred Kiefer * Headers/Foundation/NSErrorRecoveryAttempting.h: Add new file. * Source/GNUmakefile: Install this file. 2007-07-22 Richard Frith-Macdonald * Tools/AGSOutput.m: escape angle brackets in types of function arguments. 2007-07-19 Riccardo Mottola * Source/NSKeyValueCoding.m: * Source/NSKeyValueMutableSet.m: Code cleanup and C99-ism fixes 2007-07-14 Richard Frith-Macdonald * Source/NSKeyValueCoding.m: * Source/NSKeyValueMutableSet.m: * Source/NSArray.m: * Source/NSKeyValueMutableArray.m: Whitespace and initialisation tidyups. 2007-07-11 Richard Frith-Macdonald * Source/NSString.m: For MacOS-X compatibility, alter -propertyList to have the undocumented behavior of parsing strings file format too. 2007-07-10 Chris Farber * Source/NSArray.m ([NSArray -objectsAtIndexes:]): New method. ([NSMutableArray -removeObjectsAtIndexes:]): New method. * Headers/Foundation/NSArray.h: Added the new methods. * Source/NSKeyValueCoding.m ([-mutableArrayValueForKey:]): New method. ([-mutableArrayValueForKeyPath:]): New method. ([-mutableSetValueForKey:]): New method. ([-mutableSetValueForKeyPath:]): New method. ([-valueForUndefinedKey:]): Include key and object in the reason of an NSUndefinedKeyException. * Headers/Foundation/NSKeyValueCoding.h: Added the new methods. * Source/NSKeyValueMutableSet.m: New file. * Source/NSKeyValueMutableArray.m: New file. 2007-07-10 Richard Frith-Macdonald * Source/win32/GSFileHandleWin32.m: Fixup for pipes as suggested by Matthew Jiminez. 2007-06-26 Richard Frith-Macdonald * Source/NSKeyedArchiver.m: * Source/NSKeyedUnarchiver.m: Implement support for arrays of objc types to fix bug #20268 2007-06-21 Richard Frith-Macdonald Rewrite code to support parsing of predicates containing all the '%' format strings (as suggested by Fred). 2007-06-20 Richard Frith-Macdonald * Source/NSPredicate.m: Fix bug #20215 ... scanning of greater than and less than operators. Add code to attempt to support parsing of predicates containing all the '%' format strings ... untested. 2007-06-15 Adam Fedor * Source/NSTimeZone.m ([NSTimeZone +timeZoneArray]): Skip .tab files when looking for zones. 2007-06-14 Richard Frith-Macdonald * Source/NSNumber.m: Implement ([isEqualToValue:]) * Source/NSPredicate.m: Fix bug #20169 2007-06-13 Richard Frith-Macdonald * Source/NSURLHandle.m: ([loadInForeground]) return as soon as load is complete, rather than waiting for up to a second. 2007-06-12 Fred Kiefer * Source/NSPredicate.m: Fake like and matches by using compare:options: and reverted change for string equality. 2007-06-11 Fred Kiefer * Source/NSPredicate.m: Improved predicate parsing. Handle more alternate key strings, implemented BETWEEN, use compare:options: for string equality test and handle in for collections. 2007-06-09 Fred Kiefer * Source/NSPredicate.m: Improved predicate parsing. 2007-06-08 Richard Frith-Macdonald * Source/GSString.m Fix bug getting cString from literal string with illegal (non-ascii) characters. * Source/NSKeyValueCoding.m: Fix backward compatibility issue with NSUnknownKeyException. 2007-06-06 Richard Frith-Macdonald * Source/NSKeyValueCoding.m: Use UTF8 rather than ASCII 2007-06-03 Richard Frith-Macdonald * Source/GSHTTPURLHandle.m: define MSG_DONTWAIT as zero if it's not defined ... it should not be needed anyway if the socket is already non-blocking. 2007-06-03 Richard Frith-Macdonald * Source/win32/GSFileHandleWin32.m: Clean up indentation issues etc. 2007-06-01 Richard Frith-Macdonald * Source/Additions/GSMime.m: Fix problem where any header starting with 'http' would be mangled. 2007-05-31 Richard Frith-Macdonald * Tools/NSKeyValueCoding.m: Minor fix for backward compatibility in ([setNilValueForKey:]). 2007-05-30 Richard Frith-Macdonald * Tools/gdomap.m: Don't trap abort signal. 2007-05-29 Richard Frith-Macdonald * Source/NSData.m: when unable to open a file, log should be debug level rather than warn level. 2007-05-23 Fred Kiefer * Headers/Foundation/NSCompoundPredicate.h: Add some common ivars. * Headers/Foundation/NSExpression.h:Add some common ivar. * Source/NSPredicate.m: Implement a lot of missing functionality for the predicate and expression classes. Clean up formatting. 2007-05-16 Richard Frith-Macdonald * Headers/Foundation/NSNetServices.h: fix bug #19872 2007-05-16 Richard Frith-Macdonald * Source/NSURLConnection.m: Cancel when deallocating. * Source/NSURLProtocol.m: Make sure load is stopped if an error occurs. 2007-05-15 Richard Frith-Macdonald * Source/NSException.m: Permit some recursion in handling uncaught exceptions so that different exception handlers can be tried ... in particular, so that the gui library exception handler can fall back to using the base library handler and get a printout of the exception details when the program terminates. 2007-05-15 Richard Frith-Macdonald * Source/NSURLConnection.m: Minor simplifications. * Source/NSURLProtocol.m: Perform automatic redirect from http://host to http://host/ to standardise URL used for caching as noted in Apple documentation. * Source/NSURLRequest.m: use case insensitive dictionary for headers. * Source/Additions/GSMime.m: fix error makeing tokens lowercase. 2007-05-14 Richard Frith-Macdonald * Source/Additions/GSInsensitiveDictionary.m: For internal use storing values on case insensitive keys. * Source/Additions/GNUmakefile: Build insensitive dictionaries. * Source/GSPrivate.h: Make insensitive dictionaries available. * Source/NSURLResponse.m: Use insensitive dictionaries. * Source/NSURLProtocol.m: Clean up. * Source/Additions/GSMime.m: New stuff to retain case information. * Headers/Additions/GNUstepBase/GSMime.h: ditto. 2007-05-14 Richard Frith-Macdonald * Source/NSURLProtocol.m: * Source/NSURLRequest.m: * Source/NSURLConnection.m: Added tweaks for redirection andvarious comments. 2007-05-14 Richard Frith-Macdonald * Source/Additions/Unicode.m: Avoid using NSString while printing warning about iconv problems ... try to avoid possible recursion etc. 2007-05-13 Richard Frith-Macdonald * Source/NSURLProtocol.m: Replace mystep response parsing code with more reliable/standard-compliant stuff adapted from NSURLHandle.m 2007-05-12 Richard Frith-Macdonald * Source/GSStream.h: New runloop management * Source/GSStream.m: Support scheduling in multiple runloops to match documented MacOS-X behavior. Trigger instant event on error or eof. * Source/unix/NSStream.m: Don't send error and eof events asap, defer until the runloop runs as this is how MacOS-X behaves. * Source/win32/NSStreamWin32.m: ditto. * Source/unix/GSRunLoopCtxt.m: Fix failure to trigger immediate events when there are no non-immediate input sources in th loop. Fix busy poll when there are no non-immediate sources in the loop. * Source/win32/GSRunLoopCtxt.m: ditto 2007-05-12 Richard Frith-Macdonald * Source/NSURLProtocol.m: Fix multiple release of headers. 2007-05-11 Richard Frith-Macdonald * Source/GSStream.m: * Source/unix/NSStream.m: * Source/win32/NSStreamWin32.m: * Headers/Foundation/NSStream.h: First hack at extensions to get address and port properties for network streams. Use localhost if no host is given for connect. * Source/GSFFIInvocation.m: Attempt to use forward2 if available. * Source/NSURLProtocol.m: Fixup some problems with incorporation of code from mySTEP. 2007-05-11 Richard Frith-Macdonald * Source/NSURLResponse.m: * Source/NSURLProtocol.m: * Source/NSURLRequest.m: * Source/GSURLPrivate.h: * Source/NSURLConnection.m: Changes accidentally missed from update on 27th april. 2007-05-02 Nicola Pero * configure.ac: Set GNUSTEP_MAKEFILES to CURRENT_GNUSTEP_MAKEFILES before sourcing GNUstep.sh. Fixes building when paths to hardcode in the library are different from paths used when building, typically a case when packaging. * configure: Regenerated. 2007-04-28 Richard Frith-Macdonald * Source/thr-pthread.m: Set thread attributes detached to avoid memory leak as suggested by Chris Ball 2007-04-27 Richard Frith-Macdonald * Source/NSBundle.m: Reformat for coding standards. Alter library resource lookup to find correct version when multiple versions of the base library are installed and the old unversioned api is used. * Source/NSURLHandle.m: Scheduling tweak. * Source/GSFFCallInvocation.m: Use forward2 if available. * Source/GSFFIInvocation.m: Use forward2 if available. * Source/NSURLRequest.m: Tidyups * Source/NSURLConnection.m: Tidyups * Source/NSURLProtocol.m: Incorporate some concrete protocols from mySTEP ....needs rewriting and then testing. * Headers/Foundation/NSURLRequest.h: Fix typos and improve comments. 2007-04-16 Richard Frith-Macdonald * config/config.forward2.m: Test for forward2 function in runtime. * configure.ac: Run forward2 test * Headers/Additions/GNUstepBase/config.h.in: record forward2 test. * configure: regenerate 2007-04-15 Richard Frith-Macdonald * configure.ac: check for wide character support in printf * config/config.wprintf.c: ditto * configure: regenerate * Headers/Additions/GNUstepBase/config.h.in: regenerate * Source/NSString.m: Don't use wide char support if we don't have it. Should fix bug #19587 2007-04-15 Richard Frith-Macdonald * Source/NSBundle.m: ([+pathForResource:ofType:inRootPath:inDirectory:withVersion:]) Tolerate nil/empty resource name for compatibility with MacOS-X and to fix bug #19588 * Source/NSPredicate.m: Implement ([-filterUsingPredicate:]) for NSMutableArray. * Headers/Foundation/NSPredicate.h: Add the ([-filterUsingPredicate:]) method and document it. * config/config.printf.c: use 'wide' field in info structure to check that it exists. 2007-04-13 Ricccardo Mottola * Source/NSSortDescriptor.m : removed C99-ism 2007-04-13 Ricccardo Mottola * Source/GSHTTPURLHandle.m : removed C99-ism 2007-04-13 Adam Fedor * Version: Fix matching numeric version 2007-04-13 Richard Frith-Macdonald * Source/GSFileHandle.m: ([-readDataOfLength:]) fix bug which could cause short reads. 2007-04-12 Adam Fedor * Tool/HTMLLinker.m: Re-add. * Documentation/coding-standards.texi: Add info section * Documentation/manual/manual.texi: Likewise (patch from Marco Bardelli). * gnustep-base-debug.spec.in: Remove * gnustep-base.spec.in, Documentation/install.texi: Document that gnustep-make 2.0.0 is required. 2007-04-12 Adam Fedor * Version 1.15.0 2007-04-12 Adam Fedor * Version 1.14.0 2007-04-11 Richard Frith-Macdonald * Documentation/news.texi: * Documentation/ReleaseNotes.gsdoc: * Documentation/manual/Compliance.texi: Add new stable release information and fixx a couple of documentation errors. 2007-04-11 Richard Frith-Macdonald * Source/Additions/GSXML.m: * Source/Additions/GSCompatibility.m: * Source/Additions/GSMime.m: * Headers/Foundation/NSString.h: * Headers/Additions/GNUstepBase/GSCategories.h: * Headers/Additions/GNUstepBase/Unicode.h: More macos-x portability fixups. 2007-04-01 Richard Frith-Macdonald * Source/GSLocale.m: * Source/Additions/Unicode.m: * Headers/Foundation/NSString.h: * Headers/Additions/GNUstepBase/Unicode.h: Header/include fixups for macosx portability. 2007-03-30 Richard Frith-Macdonald * Source/NSPredicate.m: ([-parseOr]) Use orPredicateWithSubpredicates rather than andPredicateWithSubpredicates. Fix for bug #19446. * Source/unix/NSStream.m: Fix memory leak. * Source/NSPathUtilities.m: NSSearchPathForDirectoriesInDomains() Don't include empty paths. 2007-03-25 Richard Frith-Macdonald * Source/NSTimer.m: minor optimisation ... avoid unnecessary use of autorelease by doing explicit release instead. 2007-03-22 Richard Frith-Macdonald * Source/NSPathUtilities.m: NSTemporaryDirectory() don't raise exception on error, just log a warning and return nil. * Source/NSDateFormatter.m: When given an empty string to convert to a date, just skip the conversion. 2007-03-21 Nicola Pero * Source/NSBundle.m ([+initialize]): Removed unused check. 2007-03-20 Nicola Pero * Source/NSUserDefaults.m ([+standardUserDefaults]): Fixed bug were the same enumerator variable was reused in the two nested loops and language resources wouldn't be found. Optimized a little by factoring some variables out of the inner loop. Reorganized usage of information from the C locale so that we use it whenever a language resource lookup can not be found and the C locale information is precisely for that language, but not otherwise. 2007-03-19 Nicola Pero * Tools/gsdoc.gsdoc: Removed reference to GNUSTEP_SYSTEM_ROOT; use up-to-date variables such as GNUSTEP_SYSTEM_LIBRARY and GNUSTEP_SYSTEM_DOC. * Tools/gsdoc-1_0_1.rnc: Same change. * Tools/gsdoc.7: Same change. * Tools/gdomap.8: Same change. * INSTALL: Updated. 2007-03-19 Richard Frith-Macdonald * Source/NSDictionary.m: Correct errors in documentation about keys being retained when they are in fact copied. 2007-03-17 Adam Fedor * config/config.trampoline.c: Check for proper CPU macro for Darwin * configure.ac: Don't enable libffi by default on Darwin (patches from Wolfgang Lux). 2007-03-17 Nicola Pero * SSL/GNUmakefile: Install the SSL bundle in the versioned gnustep-base resource directory. * Source/NSFileHandle.m ([+sslClass]): Load the SSL bundle from the versioned gnustep-base resource directory. 2007-03-17 Nicola Pero * Source/Makefile.postamble (before-uninstall): Remove GSConfig.h. 2007-03-17 Nicola Pero * Source/NSBundle.m ([+bundleForLibrary:version:]): Fixed looking up library resource bundle when no version is provided. 2007-03-16 Richard Frith-Macdonald * Source/unix/NSStream.m: * Source/win32/NSStreamWin32.m: Try to ensure that end of stream events are sent reliably. 2007-03-15 Richard Frith-Macdonald * Source/NSPropertyList.m: ([GSBinaryPLParser-readCountAt:]) Handle counts for objects larger than 64KB correctly. 2007-03-14 Richard Frith-Macdonald * configure.ac: By default disable the GNUSTEP_CONFIOG_FILE environment variable on windows so that we don't accidentally use the development config file (with unix style paths) when we want to be using runtime config (with windows paths). * configure: Regenerate * Source/GSPrivate.h: New private function to determine native C-string encoding. * Source/Additions/Unicode.m: ditto * Source/GSLocale.m: Use native C-String encoding to handle locale information strings. 2007-03-14 Nicola Pero * Source/NSUserDefaults.m ([+standardUserDefaults]): Manually lookup gnustep-base language resources without using NSBundle to break the bootstrap chicken-and-egg problem between NSBundle and NSUserDefaults. 2007-03-14 Richard Frith-Macdonald * Source/Additions/GSXML.m: Fix memory leak caused by url handle retaining xmlrpc object as a client. 2007-03-13 Richard Frith-Macdonald * Source/GSLocale.m: Expect locale information (nl_langinfo) to be in default c-string encoding ... though it's debatable how one knows what that should be. 2007-03-12 Richard Frith-Macdonald * NSTimeZones/NSTimeZones.tar: regenerated. * Source/GSString.m: getCString_c() Fix error freeing unallocated memory when converting a zero length constant string to external cstring representation. 2007-03-09 Nicola Pero Implemented library resource bundle versioning. Updated gnustep-base to use versioned resources. * Source/NSBundle ([+bundleForLibrary:version]): New method. Allow to request the resource bundle for a specific version. Changed bundle resource location to be GNUSTEP_LIBRARY/Libraries//Versions//Resources to allow versioned resources and be similar to framework resources - will be handy in the future. Fall back to the old unversioned bundle at GNUSTEP_LIBRARY/Libraries/Resources/ if no specific version is required and no versioned bundle can be found. ([+bundleForLibrary:]): Implemented in terms of +bundleForLibrary:version:. Should be backwards compatible if you're not using resource versioning yet. ([+initialize]): When creating _gnustep_bundle, use [+bundleForLibrary:version:] to get the appropriate version of the bundle. * Headers/Foundation/NSBundle.h ([+bundleForLibrary:version:]): New method; updated documentation for this method and for [+bundleForLibrary:]. * Resources/GNUmakefile: Include ../Version and install into the new versioned directory. * NSTimeZones/GNUmakefile: Same changes. * Source/GNUmakefile: Same changes. * Source/NSBundle.m ([+bundleForClass:]): If we are asked for the bundle for NSObject, return _gnustep_bundle (prepared during +initialize) immediately. * Source/NSTimeZone.m (_time_zone_path): Use bundleForClass: NSObject to get the gnustep-base bundle immediately and safely. * Source/NSUserDefaults.m ([+standardUserDefaults]): Same change. * Source/GNUmakefile (libgnustep-base_INTERFACE_VERSION, libgnustep-baseadd_INTERFACE_VERSION): Use more standard makefile syntax. 2007-03-09 Richard Frith-Macdonald * Source/NSProcessInfo.m: On mswindows, don't count a '.exe' extension as part of the process name. * Source/NSUserDefaults.m: Revert last change ... now done in NSProcessInfo.m 2007-03-08 Richard Frith-Macdonald * Source/Addictions/GSXML.m: Cope with cancellation of load from URL in XMLRPC better. 2007-03-08 Nicola Pero * Source/NSPathUtilities.h (GSAdminToolsDirectory): New directory key. * Source/NSPathUtilities.m: Implemented it. 2007-03-07 Richard Frith-Macdonald * Source/GSHTTPURLHandle.m: Mimic MacOS-X behavior and cancel loading if http status code is not in the 200-299 (success) range. 2007-03-07 Richard Frith-Macdonald * Tools/objctidy.m: Removed ... should not have been added really as it's very unreliable ... better remove before it accidentally gets into a stable release. 2007-03-06 Richard Frith-Macdonald * Source/NSSpellServer.m: Use Library directory in user domain for local dictionaries. * Source/NSDistributedNotificationCenter.m: autolaunch gdnc with the --auto option. * Tools/gdnc.m: Understand --auto to mean that we should shut down automatically when all connections in to us are dropped. 2007-03-06 Nicola Pero * configure.ac: Added GNUSTEP_SYSTEM_USERS_DIR, GNUSTEP_NETWORK_USERS_DIR and GNUSTEP_LOCAL_USERS_DIR. * configure: Regenerated. * Headers/Additions/GNUstepBase/config.h.in: Regenerated. * Source/NSPathUtilities.m: Read and process the new variables; fixed NSUserDirectory to return the proper GNUSTEP_*_USERS_DIR instead of the user's home directory. 2007-03-06 Richard Frith-Macdonald * Source/NSUserDefaults.m: On mswindows, don't count a '.exe' extension as part of the process name when fetching defaults. 2007-03-05 Nicola Pero * configure.ac: Fixed setting default GNUSTEP_*_ADMIN_APPS and GNUSTEP_*_ADMIN_TOOLS when none is found in the config file. * configure.ac: Print out the entire filesystem layout that is hardcoded into gnustep-base. It makes it easier to debug filesystem layout issues. * configure.ac: Read, process and output the new GNUSTEP_*_WEB_APPS variables. * configure.ac: Do not output GNUSTEP_CONFIG_FILE variable which is used nowhere. * configure: Regenerated. * Headers/Additions/GNUstepBase/config.h.in: Added definitions of GNUSTEP_*_WEB_APPS. * Headers/Foundation/NSPathUtilities.h (NSSearchPathDirectory): Added GSWebApplicationsDirectory. * Source/NSPathUtilities.m: Implemented GSWebApplicationsDirectory. 2007-03-05 Richard Frith-Macdonald * Source/NSObject.m: Try using atomic increment/decrement to get performance of retain/release improvement in multithreaded programs. 2007-03-05 Adam Fedor * configure.ac, config/config.trampoline.c: Add trampoline test. 2007-03-05 Richard Frith-Macdonald * Headers/Foundation/NSAffineTransform.h: Add flags to allow optimisation of identity and flipped coordinates(from mySTEP) * Source/NSAffineTransform.m: Add code from mySTEP for, optimising common cases. Fixup optimised code to use B and B consistently. Fixup bug in optimised code for prepending matrix. Add optimised cases for flipped transforms in appand and prepend. Fix bug in ([-transformSize:]) which was causing problems with negative values (MacOS-X allows negative values here, and any issues need to be dealt with by the calling code). 2007-03-04 Richard Frith-Macdonald * Headers/Foundation/NSSpellServer.h: Moved from appkit * Source/NSSpellServer.m: Moved from appkit * Source/GNUmakefile: Add NSSpellServer * Headers/Foundation/Foundation.h: Add NSSpellServer Moved NSSpellServer in from gui/appkit for MacOS-X compatibility 2007-03-02 Richard Frith-Macdonald * Source/GSHTTPURLHandle.m: Cope with nil authentication info * Source/GSHTTPAuthentication.m: Cope with nil credential and catch exceptions in lock protected areas (there shouldn't be any, but best to be safe). 2007-03-01 Nicola Pero * Source/NSBundle.m ([NSBundle +bundleForLibrary:]): Fixed paths to lookup; it wouldn't work with the new filesystem layout changes. * configure.ac: Raise an error if we're asked to import a config file but no such file is found. * configure: Regenerated. 2007-03-01 Richard Frith-Macdonald * Source/NSZone.m: tidy indentation * Source/NSURLCredential.m: * Source/NSURLAuthenticationChallenge.m: * Source/NSURLCredentialStorage.m: * Source/NSURLResponse.m: * Source/NSURLProtocol.m: * Source/NSURLCache.m: * Source/NSHTTPCookieStorage.m: * Source/NSHTTPCookie.m: * Source/NSURLProtectionSpace.m: * Source/NSURLRequest.m: Use standard function to initialise and clear memory, fixing some potential uninitialised memory errors. 2007-03-01 Richard Frith-Macdonald * configure.ac: Restore last reversion and fix actual bug (I hope) which was an incorrect setting of GNUSTEP_SYSTEM_TOOLS to the Admin subdirectory, causing relative path calculations to be wrong. * configure: regenerated. 2007-03-01 Richard Frith-Macdonald * Source/NSBundle.m: * Source/NSPathUtilities.m: * Headers/Foundation/NSBundle.h: * Headers/Additions/GNUstepBase/config.h.in: * gnustep-base.script.spec.in: Remove internal GNUSTEP_..._ROOT variables which are no longer used. * configure.ac: Refrain from defining GNUSTEP_..._ROOT default values in config.h * configure: regenerated. 2007-02-28 Richard Frith-Macdonald * configure.ac: Revert part of change which guaranteed use of bad paths on mingw ... we allow a fallback to ./GNUstep.conf instead. of using paths from make (which is guaranteed to be wrong as the paths it uses are for msys and we need runtime paths for the win32 api). * configure: Regenerated. 2007-02-28 Nicola Pero * configure.ac: If no config file to import is specified, then load the gnustep-make one in preference to the runtime config file, which might be a relative path such as ./GNUstep.conf. On mingw, do not set just GNUSTEP_xxx_ROOT and similar variables to relative paths, but set all of the GNUSTEP_xxx_yyy variables by computing relative paths using gnustep-make's scripts. * configure: Regenerated. 2007-02-28 Richard Frith-Macdonald * Source/NSObject.m: Update suggested by Larry Campbell to use 32 locks for managing retain counts rather than just one, so reducing lock contention when there are lots of threads running. He reports a 50% performance improvement in his program. 2007-02-27 Nicola Pero * GNUmakefile (CVS_MODULE_NAME): Do not set (exports should be done from subversion now). 2007-02-26 Nicola Pero * configure.ac: Updated for new (shorter) GNUSTEP_SYSTEM_DOC_MAN variable names in GNUstep.conf (and similar for other DOC variable names). * Headers/Additions/GNUstepBase/config.h.in: Same change. * Source/NSPathUtilities.m: Same change. * configure: Regenerated. 2007-02-21 Richard Frith-Macdonald * Source/NSCharacterSetData.h: * Source/NSIndexSet.m: * Source/NSCharacterSet.m: Experimental modifications to allow an NSCharacterSet implementation based on NSIndexSet rather than a bitmap representation. The idea is that such an implementation, while often slower, should use much less memory in most cases and may be a better option on handheld devices for instance. To enable the new code, edit to define GNUSTEP_INDEX_CHARSET near the start of NSCharacterSet.m and build. 2007-02-20 Richard Frith-Macdonald * configure.ac: Fixup to locate headers and libraries installed in system root subdirectories again. * configure: Regenerated. * Source/NSNumber.m: Chance description and stringValue methods to return 1/0 rather than YES/NO for compatibility with undocumented MacOS-X implementation detail (bug #19010) 2007-02-19 Nicola Pero * configure.ac: Updated gnustep-config calls for new/final syntax. Do not source GNUstep.sh at the beginning. * configure: Regenerated. * GNUmakefile: Updated gnustep-config calls, plus set GNUSTEP_MAKEFILES properly using :=, not =. * Documentation/GNUmakefile: Same changes. * Examples/GNUmakefile: Same changes. * NSTimeZones/GNUmakefile: Same changes. * NSTimeZones/GNUmakefile: Same changes. * Resources/GNUmakefile: Same changes. * Source/GNUmakefile: Same changes. * SSL/GNUmakefile: Same changes. * Testing/GNUmakefile: Same changes. * Tools/GNUmakefile: Same changes. 2007-02-19 Richard Frith-Macdonald * Source/NSRunLoop.m: ([performSelector:target:argument:order:modes:]) Alter to retain target and arguments to match MacOS-X (bug #19099) * Source/NSString.m: Fixup removal of leading path separator when appending path componet. * Source/NSPropertyList.m: If parsing of xml property list fails, try again with more tolerant parser which accepts illegal characters. Might fix bug #17112 (illegal character in nib) 2007-02-17 Richard Frith-Macdonald * configure.ac: Use gnustep-config if available. * configure: Regenerate * Source/Makefile.postamble * Source/GNUmakefile * Source/Makefile.preamble * SSL/GSSSLHandle.m * SSL/GNUmakefile * GNUmakefile 2007-02-17 Sergii Stoian * Headers/GNUstepBase/GSFileHandle.h: Fix GSConfig.h include. 2007-02-17 Nicola Pero * Source/NSBundle.m (_find_main_bundle_for_tool): New inline function to locate tools resources in the new gnustep-make v2 location for them. ([NSBundle +mainBundle]): (tool resource lookup) Fixed detecting case of an uninstalled tool to work with the gnustep-make v2 as well. Manage the case separately so we always lookup resources only locally for non-installed tools. For installed tools, first use _find_main_bundle_for_tool to look in the new location for tool resources, falling back to the old gnustep-make v1 location if nothing is found in the new one. 2007-02-16 Nicola Pero * configure.ac: Added GNUSTEP_*_ADMIN_APPS and GNUSTEP_*_ADMIN_TOOLS variables. * configure: Regenerated. * Headers/Additions/GNUstepBase/config.h.in: Regenerated. * Source/NSPathUtilities.m: Read the new config variables. Updated NSAdminApplicationDirectory and NSAllApplicationsDirectory for it. 2007-02-15 Richard Frith-Macdonald * Source/NSTimeZone.m: * Source/Makefile.postamble: * Source/NSProcessInfo.m: * Source/GNUmakefile: * Source/NSConcreteNumber.m: * Headers/Foundation/NSCoder.h: * Headers/Foundation/NSByteOrder.h: * Headers/Foundation/NSObject.h: * Headers/Foundation/NSDecimal.h: * Headers/Foundation/Foundation.h: Move GSConfig.h to the GNUstepBase subdirectory so that it doesn't appear at the top level when FHS layout is used, thus avoiding any possible conflict with another file of the same name in /usr/include 2007-02-15 Nicola Pero Important: do not update from trunk if you need stability. * Source/NSPathUtilities.m: Updated all the path routines to work with the new filesystem support, reading and managing the new variables. * configure.ac: Updated for the new filesystem support: prepare for NSPathUtilities.m default values for all the new variables. Make sure to avoid config files overwriting our current GNUSTEP_MAKEFILES variable. * configure: Regenerated. * Headers/Additions/GNUstepBase/config.h.in: Regenerated using autoheaders to get all the new filesystem default variable definitions. 2007-02-14 Nicola Pero * configure.ac (GNUSTEP_MAKE_CONFIG): Output errors to config.log rather than printing them out. * configure.ac: Source GNUstep.sh when we need to get the current makefile setup. Use GNUSTEP_SYSTEM_HEADERS and GNUSTEP_SYSTEM_LIBRARIES (with backwards compatibility settings) to compile. * SSL/configure.ac: Same changes. * configure: Regenerated. * SSL/configure: Regenerated. 2007-02-14 Nicola Pero We're installing gnustep-base using the new GNUSTEP_INSTALLATION_DOMAIN mechanism, so GNUSTEP_INSTALLATION_DIR will not even be defined in makefiles and should never be referenced. * Tools/Makefile.postamble (after-install): Use GNUSTEP_TOOLS, not GNUSTEP_INSTALLATION_DIR/Tools. 2007-02-14 Nicola Pero * Resources/GNUmakefile (base-resources_INSTALL_DIR): New variable to get it working with new gnustep-make. Keep the old one around for older gnustep-makes. * Source/GNUmakefile (libbase-resources_INSTALL_DIR): Same change. 2007-02-14 Roland Schwingel * Source/NSTimeZone.m: windows bugfix for daylight savings time. 2007-02-13 Richard Frith-Macdonald * Source/NSString.m: Don't treat leading '~' in path component or extension as a root when appending that component or extension. 2007-02-07 Richard Frith-Macdonald * Source/NSException.m: Only initialise modLock where stack module symbol handling is supported (fix bug #18938) 2007-02-06 Richard Frith-Macdonald * Documentation/manual/manual.texi: fix format errors * Headers/Foundation/NSException.h: document stack trace * Documentation/Base.gsdoc: document stack trace * Source/NSException.m: control stack trace with environment variable Rewrite module loading code to be thread safe. Use dladdr where available, to get offsets for dynamic library symbols so bfi based lookup of function/method name and line number information can work for libraries as well as the main executable. 2007-02-05 Richard Frith-Macdonald * configure.ac: minor tweak to avoid possible inconsistency in environment used to check LLOGN_MAX and LONG_LONG_MAX presence. * configure: regenerate * Source/GSHTTPURLHandle.m: always remove self as observer for all notifications on a socket when closing it. 2007-02-04 Richard Frith-Macdonald * Headers/Foundation/NSCompoundPredicate.h: * Headers/Foundation/NSComparisonPredicate.h: * Headers/Foundation/NSExpression.h: Fixup version macros * Source/NSDebug.m: Make frame functions safe. * Source/NSException.m: Use non-symbolic stack trace if symbols are not available. * Source/NSIndexSet.m: Add private method for minternal use. * Source/NSMessagePort.m: Fix error releasing uninitialised instance. 2007-01-30 Richard Frith-Macdonald * Source/NSAutoreleasePool.m: Fix bug reporting autorlease count. 2007-01-28 Richard Frith-Macdonald * unix/NSStream.m: * win32/NSStreamWin32.m: Send event if an error occurs in the -open method. 2007-01-25 Richard Frith-Macdonald * Source/NSUserDefaults.m: fix failure to unlock thread lock when unabel to obtain filesystem lock. 2007-01-23 Adam Fedor * Source/NSObject.m ([NSObject +initialize]): Apply BSD FPU fix only on x86 machines. 2007-01-23 Richard Frith-Macdonald * Source/win32/NSMessagePortNameServerWin32.m: * Source/win32/NSMessagePortWin32.m: Bugfixes to try to make win32 nameserver operation more reliable. 2007-01-19 Richard Frith-Macdonald * Tools/defaults.m: Make errors go to stderr and be more informative. 2007-01-17 Richard Frith-Macdonald * Source/NSURLHandle.m: ([resourceData]) make sure value returned is autoreleased. * Source/NSURL.m: Parse string a bit more strictly according to RFC 2007-01-16 Nicola Pero * configure.ac: Fixed url of build guide given in error message when ffcall/ffi is not found. 2007-01-07 Richard Frith-Macdonald * Source/NSNetServices.m: Locking fix pointed out by Chris. Fixes for documentation generation. * Source/DocMakefile: Generate documentation for new classes. * Source/NSXMLParser.m: Fix erroneous semicolons and other autogsdoc warnings. 2007-01-04 Richard Frith-Macdonald * Source/NSBundle.m: (initialize) tiny cleanup to avoid compiler warnings if compiled for NeXT runtime. 2006-12-27 Richard Frith-Macdonald * Source/GSString.m: Fix keyed archiving error. 2006-12-27 Chris B. Vetter * Headers/Foundation/NSNetServices.h: New class * Source/NSNetServices.m: New class * Source/GNUmakefile: Build NSNetServices if dns_sd is available. * configure.ac: Check for usability of dns_sd * Headers/Foundation/Foundation.h: Include NSNetServices.h * Headers/Additions/GNUstepBase/config.h.in: add dns_sd availability * base.make.in: add dns_sd availability * configure: regenerate Support for NSNetServices implemented by Chris. Integrated by Richard (untested). 2006-12-27 Richard Frith-Macdonald * Source/NSUserDefaults.m: remove old defaults as housekeeping observer when we reset. * Source/NSXMLParser.m: deactivate some log messages * Source/NSPropertyList.m: add proplist parser using NSXMLParser to support parsing of MacOS-X property lists even when libxml2 is not available. 2006-12-26 Dr. H. Nikolaus Schaller, Richard Frith-Macdonald * Source/NSXMLParser.m: Implement reduced functionality parser if LIBXML2 is not available. 2006-12-26 Richard Frith-Macdonald * Headers/Foundation/NSValueTransformer.h: * Source/NSValueTransformer.m: Complete implementation. Make thread-safe. Document. 2006-12-25 Dr. H. Nikolaus Schaller * Headers/Foundation/NSValueTransformer.h: * Headers/Foundation/Foundation.h: * Source/NSValueTransformer.h: * Source/GNUmakefile: Initial implementation of NSValueTransformer. 2006-12-25 Richard Frith-Macdonald * Headers/Additions/GNUstep/GSVersionMacros.h: Added MacOS-X compatibility version constants. 2006-12-15 Richard Frith-Macdonald * Source/NSNumberFormatter.m: Changes to match coding standards. Small fix to get it to compile with older versions of gcc. Various changes to avoid compiler warnings with newer gcc. Fix problems of assigning immutable string instances to variables typed as mutable strings. 2006-12-15 Graham J Lee * Source/NSNumberFormatter.m: Implement -stringForObjectValue: 2006-12-15 Richard Frith-Macdonald * Source/mframe.m: * Source/cifframe.m: * Source/callframe.m: Fix error testing whether object is an instance. * Headers/Foundation/NSString.h: * Headers/Foundation/NSPropertyList.h: * Headers/Foundation/NSDistributedNotificationCenter.h: * Headers/Foundation/NSNotificationQueue.h: * Headers/Foundation/NSGeometry.h: * Headers/Foundation/NSDecimal.h: Audit all headers and make more MacOS-X enumeration constant fixups so that we shouldn't need to break binary compatibility for additions to the enumeration constants in future (we hope) there is stll the possibility of apple adding constants which conflict with gnustep extensions, though I've left a big gap between apple and gnu values so that conflict should be unlikely unless they specifically try to do it. 2006-12-14 Richard Frith-Macdonald * Headers/Foundation/NSPathUtilities.h: * Source/NSPathUtilities.m: Update constants to be MacOS-X compatible, including addition of a few more keys added in recent versions. WARNING ... change of constants to match MacOS0X introduces binary incompatibility, so full recompile is required. Fix bug/misfeature of only returning paths which exist on the filesystem ... which broke MacOS-X applications which were correctly expecting to find a non-existent path and create it as a location to store their resources in. 2006-12-13 David Ayers * Source/mframe.m (mframe_do_call), * Source/cifframe.m (cifframe_do_call), * Source/callframe.m (callframe_do_call): Simplify by using GSObjCRuntime functions. Add fallback selector search for invocations passed to proxies. Add debug diagnostics. 2006-12-05 Matt Rice * Source/NSBundle.m (+initialize): Remove usage of classes local array. 2006-12-05 Richard Frith-Macdonald * NSURL.m: Check for missing scheme and return nil. * NSString.m: Check for character conversion failure when getting a CString. 2006-11-30 Richard Frith-Macdonald * Source/GSHTTPURLHandle.m: Limit size of handle cache to 16 to avoid increasing memory usage indefinitely if a program keeps loading different URLs. 2006-11-29 Richard Frith-Macdonald * Source/GSPrivate.h: * Source/win32/GSFileHandleWin32.m: * Source/Additions/GSCategories.m: * Source/GSFileHandle.m: Improve error checking and reporting when establishing a tcp/ip connection. 2006-11-27 Matt Rice * Source/NSObject.m: Fix typo. * Headers/Foundation/NSException.h: Export NSObjectInaccessibleException. 2006-11-25 Richard Frith-Macdonald * Source/NSCalendarDate.m: Fix buffer oiveflow vulnerability when parsing string ... really needs major rewrite for better locale use and full unicode support though. * Source/GSHTTPURLHandle.m: add a little more debug. 2006-11-21 Richard Frith-Macdonald * Source/NSURL.m: Fix potential double load of URL data. * unix/NSStream.m: * win32/NSStreamWin32.m: Re-use socket ports so that programs can start up again immediately after they have shut down. 2006-11-20 Richard Frith-Macdonald * Source/NSCalendarDate.m: Fix to parse timezone names as being whitespace delimited. 2006-11-19 Richard Frith-Macdonald * Source/NSAffineTransform.m: Adapted from old gui code * Headers/Foundation/NSAffineTransform.h: ditto * Source/GNUmakefile: Add NSAffineTransform. * Headers/Foundation/Foundation.h: ditto Add NSAffineTransform for MacOS-X compatibility ... gui specific code is added using a category in the gui library. 2006-11-18 Richard Frith-Macdonald * Source/Additions/GSXML.m: ([setRootNode:]) Add checks for invalid argument and improve documentation. * Source/GSHTTPURLHandle.m: don't keep unecessary read operation in progress on idle connection. 2006-11-15 Nicola Pero Notice: you should now use 'make DESTDIR=/tmp/xxx install' if you want to relocate all the installation into /tmp/xxx/ * Makefile.postamble: Use DESTDIR instead of INSTALL_ROOT_DIR everywhere. 2006-11-15 Nicola Pero * Documentation/GNUmakefile (GNUSTEP_INSTALLATION_DOMAIN): Use GNUSTEP_INSTALLATION_DOMAIN instead of GNUSTEP_INSTALLATION_DIR. * Documentation/General/GNUmakefile: Same change. * NSCharacterSets/GNUmakefile: Same change. * NSTimeZones/GNUmakefile: Same change. * Resources/GNUmakefile: Same change. * Source/GNUmakefile: Same change. * SSL/GNUmakefile: Same change. * Tools/GNUmakefile: Same change. 2006-11-14 Richard Frith-Macdonald * Source/GSHTTPURLHandle.m: fix bug detecting eof in read. Add code to check for eof immediately before writing. 2006-11-14 Adam Fedor * Headers/Additions/GNUstepBase/GSCategories.h: Add GSOnce macros. * Source/Additions/GSFunctions.m: Add GSCategories.h 2006-11-13 Richard Frith-Macdonald * Source/NSCalendarDate.m: Fix a few string parsing errors (check that string matches format in MacOS-X compatible manner). * Source/GSHTTPURLHandle.m: try to detect socket being closed by remote end of connection before we try writing to it. 2006-11-12 Richard Frith-Macdonald * Source/GSHTTPURLHandle.m: Clear pageInfo before load. Improve checking for dropped connections. 2006-11-08 Richard Frith-Macdonald Source/NSIndexSet.m: ([addIndexesInRange:]) Fix for case when added range lies within existing range. 2006-11-08 Richard Frith-Macdonald * Source/Additions/GSXML.m: ([stringByEscapingXML]) Fix bug causing newline characters to be removed from escaped strings. 2006-11-07 David Wetzel * Source/Additions/GSXML.m: Fix error setting start and end element for SAX. 2006-11-06 Richard Frith-Macdonald * Source/NSObject.m: Use %p to print address in description. * Documentation/General/OpenStepCompliance.gsdoc: * Documentation/General/Debugging.gsdoc: * Tools/gsdoc.gsdoc: * Tools/gdomap.gsdoc: * Tools/gsdoc-1_0_1.dtd: * Tools/gsdoc-1_0_1.rnc: * Tools/autogsdoc.m: * Tools/AGSOutput.m: * Tools/autogsdoc.1: * Tools/BaseTools.gsdoc: Minor documentation version fixups. 2006-11-03 Richard Frith-Macdonald * Source/NSString.m: ([stringByAddingPercentEscapesUsingEncoding:]) Improved documentation. * Source/Additions/GSMime.m: Add more charset mappings for where the hyphen after the 'iso' has been omitted. 2006-11-02 Richard Frith-Macdonald * Source/NSString.m: ([stringByAddingPercentEscapesUsingEncoding:]) Make the set of characters escaped compatible with MacOS-X (10.4). 2006-11-01 Richard Frith-Macdonald * Source/NSSortDescriptor.m; minor tidyups * Headers/Foundation/NSSortDescriptor.h: add documentation * Headers/Foundation/NSKeyValueCoding.h: improve version macros * Headers/Foundation/NSKeyValueObserving.h: add include for NSArray 2006-10-31 Richard Frith-Macdonald * Source/NSSocketPortNameServer.m: * Source/NSRunLoop.m: * Source/NSDebug.m: * Source/unix/GSRunLoopCtxt.m: * Source/NSPort.m: * Source/NSConcreteNumber.h: * Source/win32/GSRunLoopCtxt.m: * Source/NSThread.m: * Source/NSSerializer.m: * Documentation/Base.gsdoc: * Headers/Foundation/NSTimeZone.h: * Headers/Foundation/NSHashTable.h: * Headers/Foundation/NSCoder.h: * Headers/Foundation/NSRange.h: * Headers/Foundation/NSURLCredential.h: * Headers/Foundation/NSHTTPCookieStorage.h: * Headers/Foundation/NSException.h: * Headers/Foundation/NSByteOrder.h: * Headers/Foundation/NSPortCoder.h: * Headers/Foundation/NSURL.h: * Headers/Foundation/NSURLAuthenticationChallenge.h: * Headers/Foundation/NSCompoundPredicate.h: * Headers/Foundation/NSObject.h: * Headers/Foundation/NSString.h: * Headers/Foundation/NSCalendarDate.h: * Headers/Foundation/NSDecimalNumber.h: * Headers/Foundation/NSKeyValueCoding.h: * Headers/Foundation/NSBundle.h: * Headers/Foundation/NSSerialization.h: * Headers/Foundation/NSURLHandle.h: * Headers/Foundation/NSPropertyList.h: * Headers/Foundation/NSTimer.h: * Headers/Foundation/NSNotification.h: * Headers/Foundation/NSPathUtilities.h: * Headers/Foundation/NSScanner.h: * Headers/Foundation/NSProcessInfo.h: * Headers/Foundation/NSDistributedNotificationCenter.h: * Headers/Foundation/NSNotificationQueue.h: * Headers/Foundation/NSGeometry.h: * Headers/Foundation/NSStream.h: * Headers/Foundation/NSComparisonPredicate.h: * Headers/Foundation/NSDecimal.h: * Headers/Foundation/NSAttributedString.h: * Headers/Foundation/NSRunLoop.h: * Headers/Foundation/NSConnection.h: * Headers/Foundation/NSUndoManager.h: * Headers/Foundation/NSDateFormatter.h: * Headers/Foundation/NSMethodSignature.h: * Headers/Foundation/NSFormatter.h: * Headers/Foundation/NSAutoreleasePool.h: * Headers/Foundation/NSUserDefaults.h: * Headers/Foundation/NSThread.h: * Headers/Foundation/NSHTTPCookie.h: * Headers/Foundation/NSData.h: * Headers/Foundation/NSURLError.h: * Headers/Foundation/NSHost.h: * Headers/Foundation/NSDate.h: * Headers/Foundation/NSArray.h: * Headers/Foundation/NSObjCRuntime.h: * Headers/Foundation/NSProxy.h: * Headers/Foundation/NSURLProtectionSpace.h: * Headers/Foundation/NSKeyedArchiver.h: * Headers/Foundation/NSDebug.h: * Headers/Foundation/NSProtocolChecker.h: * Headers/Foundation/NSError.h: * Headers/Foundation/NSPortMessage.h: * Headers/Foundation/NSURLDownload.h: * Headers/Foundation/NSFileHandle.h: * Headers/Foundation/NSDistributedLock.h: * Headers/Foundation/NSPredicate.h: * Headers/Foundation/NSKeyValueObserving.h: * Headers/Foundation/NSDictionary.h: * Headers/Foundation/NSClassDescription.h: * Headers/Foundation/NSNull.h: * Headers/Foundation/NSZone.h: * Headers/Foundation/NSURLRequest.h: * Headers/Foundation/NSValue.h: * Headers/Foundation/NSURLCredentialStorage.h: * Headers/Foundation/NSIndexSet.h: * Headers/Foundation/NSPort.h: * Headers/Foundation/NSSortDescriptor.h: * Headers/Foundation/NSLock.h: * Headers/Foundation/NSSet.h: * Headers/Foundation/NSDistantObject.h: * Headers/Foundation/NSExpression.h: * Headers/Foundation/NSTask.h: * Headers/Foundation/NSArchiver.h: * Headers/Foundation/Foundation.h: * Headers/Foundation/NSCharacterSet.h: * Headers/Foundation/NSInvocation.h: * Headers/Foundation/NSFileManager.h: * Headers/Foundation/NSUtilities.h: * Headers/Foundation/NSPortNameServer.h: * Headers/Foundation/NSNumberFormatter.h: * Headers/Foundation/NSXMLParser.h: * Headers/Foundation/NSEnumerator.h: * Headers/Foundation/NSURLResponse.h: * Headers/Foundation/NSURLConnection.h: * Headers/Foundation/NSIndexPath.h: * Headers/Foundation/NSURLProtocol.h: * Headers/Foundation/NSMapTable.h: * Headers/Foundation/NSURLCache.h: * Headers/Additions/GNUstepBase/GSXML.h: * Headers/Additions/GNUstepBase/behavior.h: * Headers/Additions/GNUstepBase/GSFunctions.h: * Headers/Additions/GNUstepBase/GSConfig.h.in: * Headers/Additions/GNUstepBase/GSObjCRuntime.h: * Headers/Additions/GNUstepBase/GSCategories.h: * Headers/Additions/GNUstepBase/GSIMap.h: * Headers/Additions/GNUstepBase/GSIArray.h: * Headers/Additions/GNUstepBase/GSMime.h: * Headers/Additions/GNUstepBase/Unicode.h: Ensure all headers have up to date version macros included. Update to remove obsolete version macro information. Tidy FSF address for consistency. Tidy per-heaader inclusion guard preprocessor definitions. 2006-10-30 Richard Frith-Macdonald * Headers/Foundation/NSUserDefaults.h: * Source/NSUserDefaults.m: Update comments into headers and tag methods with API version information. 2006-10-29 Richard Frith-Macdonald * Source/GSPrivate.h: * Source/Additions/Unicode.m: * Source/GSeq.h: * Headers/Additions/GNUstepBase/Unicode.h: runi_cop should be private in future. remove some redundant code. * Source/Additions/GSMime.m: Add support for some more character encodings. Fix uninitialised variable compiler failed to warn about. 2006-10-27 Richard Frith-Macdonald * Source/NSTask.m: GSPrivateCheckTasks() retain terminated task while handling termination process and notification to prevent possible thread safety issue spotted by Wim. 2006-10-26 Richard Frith-Macdonald * Source/NSPropertyList.m: use declaration of GSArray from GSPrivate.h * Source/GSArray.m: ditto * Source/NSArray.m: ditto * Source/NSSerializer.m ditto * Source/NSConcreteNumberTemplate.m: Use private function to get hash. * Source/NSConcreteNumber.m: ditto * Source/NSNumber.m: ditto * Source/GSPrivate.h: Add hash functions. * Headers/Foundation/NSSortDescriptor.h: Add a little documentation. * Source/NSSortDescriptor.m: Implement better hash/isEqual as suggested by David. Complete rewrite of sorting to avoid lots of heap memory operations ... should be much much faster. 2006-10-25 Richard Frith-Macdonald * configure.ac: Define HAVE_VISIBILITY_ATTRIBUTE if gcc's visibility attribute is both present in the version being used and working on the current platform. * configure: Regenerate * Headers/Additions/GNUstepBase/config.h.in: Regenerate * Source/GSPrivate.h: Only use the visibility attribute if it is available. Avoids warnings (and link errors in at least one case) on systems where it is not fully supported by gcc yet. * Headers/Foundation/NSSortDescriptor.h: Tidy and fix macros marking macos compatibility. * Source/NSSortDescriptor.m: Fix to have usable hash and isEqual (bug #18107). 2006-10-23 Richard Frith-Macdonald * Source/NSCalendarDate: when adding offset to a date, work in the timezone for the date rather than in GMT ... fixes bug #18088 * Source/NSBundle.m: * Source/NSPathUtilities.m: * Source/NSProcessInfo.m: * Source/preface.m: * Source/NSCallBacks.h: * Source/GSPrivate.h: * Source/NSFileManager.m: * Source/objc-load.h: * Source/objc-load.m: * Headers/Additions/GNUstepBase/preface.h.in: More cleanups hiding private functions and removing a few unused bits. 2006-10-20 Richard Frith-Macdonald * Source/Additions/GSPrivate.m: * Source/GSFormat.h: Deleted unused files. * Headers/Foundation/NSError.h: * Source/NSError.m: Updated to current MacOS-X spec. * Source/NSIndexPath.m: * Source/NSSocketPortNameServer.m: * Source/NSTimeZone.m: * Source/NSHashTable.m: * Source/NSBundle.m: * Source/NSPropertyList.m: * Source/libgnustep-base-entry.m: * Source/GSConcreteValueTemplate.m: * Source/NSScanner.m: * Source/NSProcessInfo.m: * Source/NSGeometry.m: * Source/NSSocketPort.m: * Source/NSUndoManager.m: * Source/NSMethodSignature.m: * Source/NSFormatter.m: * Source/NSUserDefaults.m: * Source/NSArray.m: * Source/NSMessagePortNameServer.m: * Source/objc-gnu2next.m: * Source/GSStream.m: * Source/NSDebug.m: * Source/unix/GSRunLoopCtxt.m: * Source/GSConcreteValue.m: * Source/NSDistributedLock.m: * Source/NSFileHandle.m: * Source/preface.m: * Source/NSAssertionHandler.m: * Source/NSConcreteNumberTemplate.m: * Source/GSHTTPURLHandle.m: * Source/NSZone.m: * Source/NSCallBacks.m: * Source/NSMessagePort.m: * Source/GSDictionary.m: * Source/GSPrivate.h: * Source/GSCountedSet.m: * Source/win32/GSFileHandleWin32.m: * Source/win32/GSRunLoopCtxt.m: * Source/win32/NSMessagePortWin32.m: * Source/win32/NSStreamWin32.m: * Source/NSFileManager.m: * Source/NSConcreteNumber.m: * Source/NSNotificationCenter.m: * Source/externs.m: * Source/NSRange.m: * Source/NSException.m: * Source/NSCopyObject.m: * Source/mframe.m: * Source/NSObject.m: * Source/NSString.m: * Source/Additions/Unicode.m: * Source/Additions/GNUmakefile: * Source/Additions/GSCompatibility.m: * Source/Additions/GSCategories.m: * Source/GSSet.m: * Source/GSString.m: * Source/NSThread.m: * Source/NSData.m: * Source/NSHost.m: * Source/NSProxy.m: * Source/NSProtocolChecker.m: * Source/NSPipe.m: * Source/GSValue.m: * Source/NSDictionary.m: * Source/NSClassDescription.m: * Source/NSSerializer.m: * Source/NSNull.m: * Source/NSValue.m: * Source/NSCountedSet.m: * Source/NSLog.m: * Source/GSFormat.m: * Source/NSIndexSet.m: * Source/GSFileHandle.m: * Source/NSLock.m: * Source/NSDistantObject.m: * Source/NSTask.m: * Source/NSPortNameServer.m: * Source/NSNumberFormatter.m: * Source/NSXMLParser.m: * Source/GSFTPURLHandle.m: * Source/NSEnumerator.m: * Source/GSURLPrivate.h: * SSL/GSSSLHandle.m: Move from GSPrivate class to GSPrivate functions as majority prefer that. Make some more private functions use GSPrivate prefix and be unlinkable outside base. Rationalise error string generation. Tidy up FSF address in comments. 2006-10-19 Richard Frith-Macdonald * Documentation/manual/DistributedObjects.texi: Update for current API * Source/NSNotificationQueue.m: * Source/NSSocketPort.m: * Source/NSRunLoop.m: * Source/NSUserDefaults.m: * Source/NSMessagePortNameServer.m: * Source/NSDebug.m: * Source/unix/GSRunLoopCtxt.m: * Source/GSPrivate.h: * Source/win32/GSFileHandleWin32.m: * Source/win32/GSRunLoopCtxt.m: * Source/NSCoder.m: * Source/Additions/GSPrivate.m: * Source/NSAutoreleasePool.m: * Source/NSTask.m: * Headers/Foundation/NSCoder.h: Remove long deprecated coder extensions (old libobjects compatibility). Hide some internal functions. Make some values static. Make function to obtain locale dictionary thread safe. 2006-10-19 Matt Rice * Source/NSBundle.m (_find_framework): initialize file_name variable. 2006-10-19 Richard Frith-Macdonald * Source/NSBundle.m: Strip path extension from main bundle name on cygwin. * Headers/Foundation/NSPortNameServer.h: Improve documentation 2006-10-18 Richard Frith-Macdonald * Source/Makefile.postamble: Remove use of UNICODE_HEADERS which appears to beave been breaking solaris build. 2006-10-18 Richard Frith-Macdonald * Source/Additions/GSPrivate.m: * Source/Additions/Unicode.m: * Source/GSPrivate.h: * Source/NSArray.m: * Source/NSCalendarDate.m: * Source/NSDate.m: * Source/NSDecimalNumber.m: * Source/NSDictionary.m: * Source/NSNotification.m: * Source/NSObject.m: * Source/NSProcessInfo.m: * Source/NSScanner.m: * Source/NSString.m: * Source/NSUserDefaults.m: Experiments with gcc attribute for making functions inaccessible outside the library ... new experimental function GSPrivateDefaultLocale() declared in GSPrivate.h, implemented in Additions/GSPrivate.m seems to work and to be invisible to the linker for external apps. 2006-10-17 Richard Frith-Macdonald * Source/NSPropertyList.m: Fix error writing negative numbers to property list. 2006-10-16 Richard Frith-Macdonald * Source/GSFFCallInvocation.m: * Source/GSFFIInvocation.m: * Source/GSPrivate.h: * Source/Additions/GNUmakefile: * Source/Additions/GSPrivate.m: * Source/Additions/GSCategories.m: Minor further work simplifying and getting rid of unnecessary external symbols etc. 2006-10-13 Richard Frith-Macdonald * Source/NSFileHandle.m: Look for SSL bundle in any domain. * Source/NSTimer.m: Fix minor documentation error. 2006-10-11 Nicola Pero * GNUmakefile (GNUSTEP_INSTALLATION_DOMAIN): Use GNUSTEP_INSTALLATION_DOMAIN instead of GNUSTEP_INSTALLATION_DIR. 2006-10-11 Richard Frith-Macdonald * Source/externs.m: * Source/Additions/Unicode.m: * Source/NSDecimal.m: * Source/GSFormat.m: * Testing/tcpport-server.m: * Testing/exported-strings.m: Make many globals static, remove some obsolete variables etc. 2006-10-11 Nicola Pero * SSL/Makefile.postamble (after-distclean): Remove all configure generated files. (config.mak): Run config.status, not ../config.status. ($(GNUSTEP_TARGET_DIR)/config.h): Run config.status first. Do not try to move config.h into a target specific dir if the target dir is '.'. (config.status): New rule to recreate it. 2006-10-11 Nicola Pero * Source/Additions/Makefile.preamble (ADDITIONAL_INCLUDE_DIRS): Added -I.. so that the compiler finds GSPrivate.h when it's using the non-flattened layout, and it compiles again. * SSL/Makefile.preamble (ADDITIONAL_INCLUDE_DIRS): Added -I../Source for the same reason. 2006-10-10 Richard Frith-Macdonald * Source/NSDecimalNumber.m: Implement coding/decoding 2006-10-09 Nicola Pero * GNUmakefile: Do not include GNUmakefile.local. 2006-10-09 Richard Frith-Macdonald * Source/GSCompatibility.m: Removed ... no longer used * Source/GNUmakefile: Remove GSCompatibility.m * Source/NSGeometry.m: * Source/NSArray.m: * Source/NSDictionary.m: Update to get rid of a couple of functions which were not really needed, slimming down global symbols a bit more. 2006-10-09 Richard Frith-Macdonald * Source/Additions/GSObjCRuntime.m: * Headers/Additions/GNUstepBase/GSObjCRuntime.h: Remove previously deprecated functionality. * Documentation/TypesAndConstants.gsdoc: * Documentation/ReleaseNotes.gsdoc: * Documentation/Functions.gsdoc: * Documentation/BaseAdditions.gsdoc: * Documentation/Base.gsdoc: * ChangeLog: * Tools/AGSHtml.m: * Tools/AGSParser.m: * Tools/autogsdoc.m: * Tools/AGSOutput.m: Update/improve version/deprecation reporting. 2006-10-09 Richard Frith-Macdonald * Headers/Additions/GNUstepBase/unicode: Moved to Source/Additions/unicode * Source/NSSocketPortNameServer.m: * Source/GSLocale.m: * Source/NSTimeZone.m: * Source/GSCompatibility.m: * Source/NSCalendarDate.m: * Source/NSBundle.m: * Source/NSPropertyList.m: * Source/NSPathUtilities.m: * Source/NSScanner.m: * Source/NSProcessInfo.m: * Source/GNUmakefile: * Source/NSSocketPort.m: * Source/NSUserDefaults.m: * Source/GSFFCallInvocation.m: * Source/NSArray.m: * Source/GSStream.m: * Source/NSKeyedArchiver.m: * Source/NSDebug.m: * Source/unix/GSRunLoopCtxt.m: * Source/NSDistributedLock.m: * Source/GSHTTPURLHandle.m: * Source/NSMessagePort.m: * Source/GSPrivate.h: * Source/win32/NSMessagePortNameServerWin32.m: * Source/win32/GSFileHandleWin32.m: * Source/win32/NSUserDefaultsWin32.m: * Source/win32/GSRunLoopCtxt.m: * Source/win32/NSMessagePortWin32.m: * Source/win32/NSStreamWin32.m: * Source/NSInvocation.m: * Source/NSFileManager.m: * Source/objc-load.m: * Source/NSException.m: * Source/NSString.m: * Source/NSObject.m: * Source/NSDecimalNumber.m: * Source/Additions/Unicode.m: * Source/Additions/GSXML.m: * Source/Additions/GSFunctions.m: * Source/Additions/GSCompatibility.m: * Source/Additions/GSCategories.m: * Source/NSDecimal.m: * Source/GSString.m: * Source/NSDateFormatter.m: * Source/NSThread.m: * Source/NSData.m: * Source/NSHost.m: * Source/NSDate.m: * Source/NSObjCRuntime.m: * Source/NSPipe.m: * Source/NSDictionary.m: * Source/NSLog.m: * Source/GSFormat.m: * Source/GSFileHandle.m: * Source/NSTask.m: * Source/NSArchiver.m: * Source/GSFTPURLHandle.m: * SSL/GSSSLHandle.m: * Headers/Foundation/NSException.h: * Headers/Additions/GNUstepBase/GSFunctions.h: * Headers/Additions/GNUstepBase/GSObjCRuntime.h: * Headers/Additions/GNUstepBase/Unicode.h: * Tools/xmlparse.m: * Tools/defaults.m: * Tools/locale_alias.m: * Tools/Makefile.preamble: * Tools/AGSParser.m: * Tools/make_strings/make_strings.m: * Tools/pl.m: * Testing/tcpport-server.m: * Testing/exported-strings.m: * Testing/call.m: * Testing/nsconnection_server.m: * Testing/benchmark.m: * Testing/tcpport-client.m: Continuing effort to reduce global namespace pollution ... made many external variables static (particuarly unicode tables). Changed several global functions to be methods of a private internal class. Also updated several usages of deprecated cString methods to use either UTF8 methods or cString...encoding methods as seemed most appropriate and/or simplest. 2006-10-06 Fred Kiefer * Source/Additions/GSMime.m(GSMimeDocument +initialize): Corrected small bug in last patch. 2006-10-05 Richard Frith-Macdonald * Source/Additions/GSMime.m: Add a couple more charset mappings. * Source/NSRunLoop.m: Move some variables to GSRunLoopCtxt.m * Source/GSHTTPURLHandle.m: Make a global static * Source/NSPort.m: Make two globals static * Source/unix/GSRunLoopCtxt.m: Make variable static. * Source/win32/GSRunLoopCtxt.m: Make variable static. 2006-10-04 Richard Frith-Macdonald * Source/GSHTTPURLHandle.m: * Source/NSHTTPCookieStorage.m: * Source/GSHTTPAuthentication.m: Add a little checking for nil/invalid arguments. Make parsing of authentication a little more tolerant. 2006-10-03 Richard Frith-Macdonald * Version: Bump to version for next release. * configure.ac: Check for utsname * configure: Regenerate * Headers/Additions/GNUstepBase/config.h.in: Regenerate * Headers/Foundation/NSObject.h: Small documentaion improvement * Headers/Foundation/NSProcessInfo.h: Add documentation and update. * Source/NSProcessInfo.m: Moved documentation to header, clean up and complete operating system code. * Testing/nsprocessinfo.m: Trivial test updates. Avoid use of cString 2006-10-02 Nicola Pero More work on having the default flattened gnustep build with just GNUSTEP_MAKEFILES set. Non-flattened builds will still require sourcing GNUstep.sh before configure instead. * configure.ac: Use new variable GNUSTEP_IS_FLATTENED instead of GNUSTEP_FLATTENED, defaulting now to 'yes'. To build non-flattened you have to source GNUstep.sh first. * configure.ac (config.make): When determining objc threading flags in non-flattened mode, look for config.make in a library-combo subdir since that's where it is installed by gnustep-make now. * configure.ac: Extended the error message when the GNUstep conf file is not found. * configure: Regenerated. * SSL/configure.ac: Use GNUSTEP_IS_FLATTENED instead of GNUSTEP_FLATTENED. * SSL/configure: Regenerated. * Source/GNUmakefile: Renamed -DGNUSTEP_FLATTENED to -DGNUSTEP_IS_FLATTENED. This is just for consistency with the new gnustep-make variable name. * Source/NSPathUtilities.m: Same changes. 2006-09-28 Richard Frith-Macdonald * Source/NSBundle.m: Fix for buffer resize error when registering framework info, as suggested by Andreas Hoschler. 2006-09-26 Richard Frith-Macdonald * Source/NSString.m: ([stringByAddingPercentEscapesUsingEncoding:]) Fix to escape '@' (in fact anything not unreserved acording to RFC2396) * Source/NSPathUtilities.m: Fix missing include. 2006-09-21 Richard Frith-Macdonald * Source/NSProcessInfo.m: ([-operatingSystemName]) conform to MacOS-X and return NSMACHOperatingSystem rather than darwin etc. 2006-09-18 Nicola Pero * configure.ac (GNUSTEP_MAKE_CONFIG): Get this config from config-noarch.make (requires gnustep-make > 1.13.0). If failing, fall back to taking it from $GNUSTEP_MAKEFILES/config.make as it was done before (works with gnustep-make < 1.13.0 only though). * configure: Regenerated. 2006-09-13 Richard Frith-Macdonald * Source/Additions/GSXML.m: Add hack to recognize apple plist info and use the GNUstep plist DTD instead if necessary. 2006-09-13 Richard Frith-Macdonald * Headers/Foundation/NSTimeZone.h: * Headers/Foundation/NSHashTable.h: * Headers/Foundation/NSRange.h: * Headers/Foundation/NSCoder.h: * Headers/Foundation/NSURLCredential.h: * Headers/Foundation/NSHTTPCookieStorage.h: * Headers/Foundation/NSException.h: * Headers/Foundation/NSByteOrder.h: * Headers/Foundation/NSPortCoder.h: * Headers/Foundation/NSURL.h: * Headers/Foundation/NSCompoundPredicate.h: * Headers/Foundation/NSURLAuthenticationChallenge.h: * Headers/Foundation/NSString.h: * Headers/Foundation/NSObject.h: * Headers/Foundation/NSCalendarDate.h: * Headers/Foundation/NSDecimalNumber.h: * Headers/Foundation/NSBundle.h: * Headers/Foundation/NSKeyValueCoding.h: * Headers/Foundation/NSSerialization.h: * Headers/Foundation/NSURLHandle.h: * Headers/Foundation/NSPropertyList.h: * Headers/Foundation/NSTimer.h: * Headers/Foundation/NSNotification.h: * Headers/Foundation/NSPathUtilities.h: * Headers/Foundation/NSScanner.h: * Headers/Foundation/NSProcessInfo.h: * Headers/Foundation/NSDistributedNotificationCenter.h: * Headers/Foundation/NSNotificationQueue.h: * Headers/Foundation/NSGeometry.h: * Headers/Foundation/NSStream.h: * Headers/Foundation/NSComparisonPredicate.h: * Headers/Foundation/NSDecimal.h: * Headers/Foundation/NSRunLoop.h: * Headers/Foundation/NSAttributedString.h: * Headers/Foundation/NSConnection.h: * Headers/Foundation/NSUndoManager.h: * Headers/Foundation/NSDateFormatter.h: * Headers/Foundation/NSMethodSignature.h: * Headers/Foundation/NSAutoreleasePool.h: * Headers/Foundation/NSFormatter.h: * Headers/Foundation/NSUserDefaults.h: * Headers/Foundation/NSThread.h: * Headers/Foundation/NSHTTPCookie.h: * Headers/Foundation/NSData.h: * Headers/Foundation/NSURLError.h: * Headers/Foundation/NSDate.h: * Headers/Foundation/NSHost.h: * Headers/Foundation/NSArray.h: * Headers/Foundation/NSProxy.h: * Headers/Foundation/NSObjCRuntime.h: * Headers/Foundation/NSURLProtectionSpace.h: * Headers/Foundation/NSKeyedArchiver.h: * Headers/Foundation/NSProtocolChecker.h: * Headers/Foundation/NSDebug.h: * Headers/Foundation/NSPortMessage.h: * Headers/Foundation/NSError.h: * Headers/Foundation/NSURLDownload.h: * Headers/Foundation/NSDistributedLock.h: * Headers/Foundation/NSFileHandle.h: * Headers/Foundation/NSPredicate.h: * Headers/Foundation/NSKeyValueObserving.h: * Headers/Foundation/NSDictionary.h: * Headers/Foundation/NSClassDescription.h: * Headers/Foundation/NSNull.h: * Headers/Foundation/NSZone.h: * Headers/Foundation/NSURLRequest.h: * Headers/Foundation/NSValue.h: * Headers/Foundation/NSURLCredentialStorage.h: * Headers/Foundation/NSIndexSet.h: * Headers/Foundation/NSPort.h: * Headers/Foundation/NSSortDescriptor.h: * Headers/Foundation/NSLock.h: * Headers/Foundation/NSSet.h: * Headers/Foundation/NSDistantObject.h: * Headers/Foundation/NSExpression.h: * Headers/Foundation/NSTask.h: * Headers/Foundation/NSArchiver.h: * Headers/Foundation/NSCharacterSet.h: * Headers/Foundation/NSInvocation.h: * Headers/Foundation/NSFileManager.h: * Headers/Foundation/NSPortNameServer.h: * Headers/Foundation/NSNumberFormatter.h: * Headers/Foundation/NSXMLParser.h: * Headers/Foundation/NSEnumerator.h: * Headers/Foundation/NSURLResponse.h: * Headers/Foundation/NSURLConnection.h: * Headers/Foundation/NSIndexPath.h: * Headers/Foundation/NSURLProtocol.h: * Headers/Foundation/NSMapTable.h: * Headers/Foundation/NSURLCache.h: * Headers/Additions/GNUstepBase/GSLocale.h: * Headers/Additions/GNUstepBase/GSXML.h: * Headers/Additions/GNUstepBase/DistributedObjects.h: * Headers/Additions/GNUstepBase/behavior.h: * Headers/Additions/GNUstepBase/GSFunctions.h: * Headers/Additions/GNUstepBase/GSObjCRuntime.h: * Headers/Additions/GNUstepBase/GSCategories.h: * Headers/Additions/GNUstepBase/GCObject.h: * Headers/Additions/GNUstepBase/GSIMap.h: * Headers/Additions/GNUstepBase/GSIArray.h: * Headers/Additions/GNUstepBase/GSMime.h: * Headers/Additions/GNUstepBase/GSUnion.h: * Headers/Additions/GNUstepBase/GSLock.h: * Headers/Additions/GNUstepBase/GSFileHandle.h: * Headers/Additions/GNUstepBase/GNUstep.h: * Headers/Additions/GNUstepBase/objc-gnu2next.h: * Headers/Additions/GNUstepBase/Unicode.h: Bracket with 'extern "C"' for inclusion in Objective-C++ programs. * Source/NSNotificationCenter.m: Remove deprecated method. 2006-09-13 Richard Frith-Macdonald * Source/Additions/GSMime.m: When decoding a corrupt encoded word in a header, abandon processing of the header without appending any decoded data. * Headers/Foundation/NSBundle.h: * Source/NSBundle.m: ([pathForResource:ofType:inDirectory:forLocalization:]) implement. 2006-09-10 Richard Frith-Macdonald * Source/NSTimeZone.m: Remove unnecessary check on file name as Roland Schwingel reported that it caught legitimate files on windows. * Source/NSMessagePort.m: * Source/NSSocketPort.m: * Source/NSIndexPath.m: * Source/NSBundle.m: Protect -release with lock and remove object from global table within protected region, to avoid possible double deallocation in a multithreaded process. * Source/unix/NSStream.m: If socklen_t is not defined, assume uint32_t 2006-09-09 Richard Frith-Macdonald * Source/win32/NSMessagePortWin32.m: Restructure to try to avoid deadlock reported by Wim. Also implement -release to remove port from name table so that another thread can't find it in the window between checking the refcount end deallocation. 2006-09-07 Richard Frith-Macdonald * Headers/Foundation/NSObject.h: Fix incorrect backward compatibility setting for openstep version. * Source/NSObject.m: minor tweak ... put debugging code in the object reference counting function rather than the release method. * Source/NSConnection.m: Change release implementation for better protection of global connection table management. 2006-09-06 Richard Frith-Macdonald * Source/NSConnection.m: ([release]) protect with connection table lock to prevent an other thread grabbing the connection while we are deallocating it. Bug reported by Wim Oudshoorn. 2006-08-28 Adam Fedor * Version 1.13.0 2006-08-26 Richard Frith-Macdonald * Source/NSProcessInfo.m: Fix passing int variable to printf format expecting long. * Source/NSTask.m: create windows task as detached process. * NSTimeZones/NSTimeZones./tar: regenerated 2006-08-25 Richard Frith-Macdonald * Source/NSScanner.m: initialisation fix pointed out by David Ayer * Source/NSBundle.m: fix for getting class from gnustep bundle * Source/NSConnection.m: thread deadlock fix based on probelm and solution supplied by Wim Oudshoorn * Source/NSArchiver.m: * Source/NSKeyedArchiver.m: * Source/NSPortCoder.m: Fix possible problem on 64bit CPUs reported by Wim. 2006-08-16 Richard Frith-Macdonald * NSCharacterSets/letterCharSet.dat: * NSCharacterSets/symbolAndOperatorCharSet.dat: * NSCharacterSets/lowercaseLetterCharSet.dat: * NSCharacterSets/uppercaseLetterCharSet.dat: * NSCharacterSets/alphanumericCharSet.dat: * NSCharacterSets/punctuationCharSet.dat: * NSCharacterSets/illegalCharSet.dat: * NSCharacterSets/decimalDigitCharSet.dat: * NSCharacterSets/nonBaseCharSet.dat: * NSCharacterSets/decomposableCharSet.dat: Update for chinese etc. * Source/NSCharacterSetData.h: Update with ranges in UnicodeData.txt * Source/GSStream.m: Add partial implemenmtation of socks5 * Source/Additions/GSMime.m: improve fault tolerance when parsing headers. 2006-08-15 Richard Frith-Macdonald * Source/GSString.m: substring_c(), substring_u() move structure type declaration out of function to help old (pre-gcc-3) compiler, as suggested by Adam. * Source/NSString: ([dataUsingEncoding:allowLossyConversion:]} replace implementation with call to concrete subclass so that we only have one version of this large, complex method to maintain, as suggested by David. 2006-08-14 Richard Frith-Macdonald * Source/NSKeyedArchiver.m: make a guess at how MacOS-X decides to encode objects directly ... if the classForKeyedArchiver method returns a property list class (other then array and dictionary which contain other objects) we try direct coding. 2006-08-13 Richard Frith-Macdonald * Source/GSFormat.m: optimise a bit and fix bug where utf8 (and other multibyte encodings) strings could be truncated at the wrong precision. * Source/NSIndexPath.m: ([indexAtPosition:]) return NSNotFound if given a bad position. ([compare:]) fix to match MacOS-X * Source/NSObject.m: implement CRASH_ON_ZOMBIE * Documentation/Base.gsdoc: document it. * Source/NSArray.m: Fix error in decoding from keyed archive. 2006-08-12 Richard Frith-Macdonald * Source/GSString.m: getCString_c() call getCString_u() to do the work if external encoding != internal encoding. * Source/NSScanner.m: Fix for utf8 * Source/GSFormat.m: remove call to deprecated method. * Source/NSString.m: remove calls to deprecated methods. Fix getCstring... by using concrete class implementation. 2006-08-11 Richard Frith-Macdonald * Source/NSTask.m: Fixup for path validation error on mingw32 * Headers/Foundation/NSStream.h: improve documentation. * Source/GSStream.h: * Source/GSStream.m: * Source/unix/NSStream.m: * Source/win32/NSStreamWin32.m: Add lots of error checking, simplify a little, get local streams on mingw to close down properly. 2006-08-10 Richard Frith-Macdonald * Source/GSStream.m: * Source/win32/NSStreamWin32.m: Fix error in pipe read offset. Imitial implementation of local 'unix domain sockets' (actually named pipe) stream. 2006-08-10 Nicola Pero * configure.ac: Fixed typo in help of --with-default-config option. * configure: Regenerated 2006-08-10 Richard Frith-Macdonald * Source/GSStream.h: * Source/GSStream.m: * Source/unix/NSStream.m: * Source/win32/NSStreamWin32.m: Ensure all events are posted. Fixup for winsock write signalling. 2006-08-09 Richard Frith-Macdonald * Documentation/Base.gsdoc: Improve links to macros. * Headers/Foundation/NSObject.h: Improve versioning documentation * Headers/Foundation/NSNotificationQueue.h: tidied * Headers/Foundation/NSUndoManager.h: ditto * Headers/Foundation/NSAutoreleasePool.h: ditto Documentation improvements and header tidyups. 2006-08-08 Richard Frith-Macdonald * Source/GSStream.h: * Source/GSStream.m: * Source/win32/NSStreamWin32.m: * Source/unix/NSStream.m: If a connection attempt fails, propagate error to sibling stream so both streams in the pair get a failure. Try to make behavior of socket streams MacOs-X like, avoiding repeated notifications of events. 2006-08-07 00:13-EDT Gregory John Casamento * Source/NSData.m: Correct issue in initWithCoder: and encodeWithCoder: with encoding data using keyed archiver. 2006-08-06 Richard Frith-Macdonald * Source/NSPredicate.m: Reorganize initialisation of scanner to avoid implicit cast of zero to a va_listt (fix bug #17336) * Source/Additions/GSObjCRuntime.m: GSObjCMakeClass() fix incorrect calculation of ivar size/offset information as reported in bug #17069 2006-08-04 23:26-EDT Gregory John Casamento * Source/NSKeyedArchiver.m: in _encodeObject:forKey: use replacement if it exists. * Source/NSKeyedUnarchiver.m: in unarchiveObjectWithFile: remove autorelease pool, since the unarchiveObjectWithData: object is already autoreleased, this was causing a crash when unarchiving the object. 2006-07-26 Richard Frith-Macdonald * Source/Additions/GSMime.m: Remove a couple of comments * Headers/Additions/GNUstepBase/GSMime.h: Add improved documentation for the bas64 conversion methods. 2006-07-25 Richard Frith-Macdonald * Source/NSKeyedUnarchiver.m: Reinstate fix of 2006-07-14 which was erroneously reverted on 2006-07-15. 2006-07-19 Jeremy Bettis * Source/win32/NSUserDefaultsWin32.m: The method wantToReadDefaultsSince: was always returning YES. Fixed to work as intended. 2006-07-18 Richard Frith-Macdonald * Source/GSHTTPURLHandle.m: Only queue a new read on a handle if there is not one in progress. Where a connection has been kept alive, we can have an outstanding read intended to determine when the connection is dropped by the remote end. 2006-07-15 17:00 Gregory John Casamento * Source/NSKeyedUnarchiver.m: Partial fix for bug#17112. 2006-07-14 Richard Frith-Macdonald * Source/NSKeyedUnarchiver.m: ([-dealloc]) release objects in array to fix bug #17097 2006-07-07 Richard Frith-Macdonald * Resources/Languages/README: describe how to deal with files where the BOM is missing. * Resources/Languages/Korean: update supplied by YunSong Hwang 2006-07-06 Richard Frith-Macdonald * Tools/gdomap.c: remove unnecessary include of config.h 2006-07-04 Richard Frith-Macdonald * Source/NSTask.m: On mingw32 create subtask with CREATE_NO_WINDOW * Source/GSURLPrivate.h: Generalise GSHTTPAuthentication * Source/GSHTTPAuthentication.m: Generalise to support Basic auth * Source/NSURLProtectionSpace.m: Optimise a little. * Source/GSHTTPURLHandle.m: Changes for GSHTTPAuthentication update. Don't send basic authentication info unless challenged by server. 2006-07-02 Richard Frith-Macdonald * Source/GSHTTPURLHandle.m: Keep count of challenge/authentication to avoid recycling the same authentucation repeatedly. 2006-06-29 Richard Frith-Macdonald * Source/Tools/gdnc.m: Don't try to trap SIGPROF * Source/GSString.m: fix bug getting Cstring. * Source/NSNotificationQueue.m: fix mem leak in multithreaded apps. 2006-06-27 Richard Frith-Macdonald * Source/NSUserDefaults.m: Fix spelling in comment * Source/NSPathUtilities.m: Add GNUSTEP_EXTRA to allow extra info in GSConfigDomain without producing an error message. * Documentation/Base.gsdoc: Document GNUSTEP_EXTRA 2006-06-22 Richard Frith-Macdonald * Source/GSString.m: small optimisation for initialisation with unicode data which happens to be just ascii. 2006-06-20 Richard Frith-Macdonald * Source/GSHTTPDigest.m: deleted * Source/GSHTTPAuthentication.m: added * Source/GNUmakefile: build GSHTTPAuthentication * Source/GSHTTPURLHandle.m: use GSHTTPAuthentication Change class name to something more intuitive and add class methods for mapping domains/URLs to protection space objects. Update code to used cache protection space info to put digest authorisation in place without waiting for challenge. 2006-06-19 Richard Frith-Macdonald * Source/GSURLPrivate.h: Add GSHTTPDigest interface. * Source/GSHTTPDigest.m: Add GSHTTPDigest implementation. * Source/GNUmakefile: Build GSHTTPDigest. * Source/NSURLProtectionSpace.m: Implement ([-hash]) and ([-isEqual:]) * Headers/Foundation/NSURLAuthenticationChallenge.h: Improve comments. Add GSHTTPDigest class to handle HTTP digest authentication. * Source/GSHTTPURLHandle.m: Perform rudimentary digest authentication. 2006-06-17 Richard Frith-Macdonald * Source/GSString.m: Fix memory leak. * Source/NSAutoreleasePool.m: Optimise -emptyPool method. * Source/NSRunLoop.m: Empty autorelease pool after firing each timer/event so that huge memory footprints are less likely to occur. 2006-06-16 Richard Frith-Macdonald * Headers/Foundation/NSURLCredential.h: * Headers/Foundation/NSHTTPCookieStorage.h: * Headers/Foundation/NSURLAuthenticationChallenge.h: * Headers/Foundation/NSHTTPCookie.h: * Headers/Foundation/NSURLError.h: * Headers/Foundation/NSURLProtectionSpace.h: * Headers/Foundation/NSURLDownload.h: * Headers/Foundation/NSURLRequest.h: * Headers/Foundation/NSURLCredentialStorage.h: * Headers/Foundation/Foundation.h: * Headers/Foundation/NSURLResponse.h: * Headers/Foundation/NSURLConnection.h: * Headers/Foundation/NSURLProtocol.h: * Headers/Foundation/NSURLCache.h: Headers for Apple's new URL loading scheme (including documentation). * Source/NSMapTable.m: * Source/NSURLCredential.m: * Source/NSURLAuthenticationChallenge.m: * Source/NSURLHandle.m: * Source/GNUmakefile: * Source/NSURLDownload.m: * Source/NSURLCredentialStorage.m: * Source/NSURLResponse.m: * Source/NSURLProtocol.m: * Source/NSURLCache.m: * Source/NSHTTPCookieStorage.m: * Source/NSURL.m: * Source/DocMakefile: * Source/NSHTTPCookie.m: * Source/NSURLProtectionSpace.m: * Source/NSURLRequest.m: * Source/NSSet.m: * Source/NSURLConnection.m: Skeleton code for Apple's new URL loading scheme (plus minor tweaks to comments in other files). This code is not expected to work yet. Major lacks are ... 1. concrete implementations of protocols 2. on disk cache/storage management 3. thread safety (locking) for shared objects However, I hope it will provide a good starting framework. 2006-06-15 Richard Frith-Macdonald * Additions/GNUstepBase/GSXML.h: New XMLRPC settings to control timezone and to produce compact output. * Source/Additions/GSXML.m: New methods and bugfix for handling string data with no 'string' element markup. * Additions/GNUstepBase/GSMime.h: Fix possible cases of parsing saying that it needs more data when you have passed it an empty data item to terminate parsing. 2006-06-06 Richard Frith-Macdonald * Source/NSURL.m: ([initWithScheme:host:path:]) escape characters in path as required. 2006-06-04 Richard Frith-Macdonald * Source/NSIndexPath.m: * Source/NSSocketPortNameServer.m: * Source/NSTimeZone.m: * Source/NSPortCoder.m: * Source/NSDistributedNotificationCenter.m: * Source/NSAttributedString.m: * Source/GSArray.m: * Source/NSKeyedArchiver.m: * Source/NSKeyedUnarchiver.m: * Source/NSKeyValueObserving.m: * Source/NSUnarchiver.m: * Source/GSAttributedString.m: * Source/Additions/GCArray.m: * Source/Additions/GCDictionary.m: * Source/Additions/GCObject.m: * Source/NSNumber.m: * Source/GSString.m: * Source/NSConnection.m: * Source/NSAutoreleasePool.m: * Source/NSThread.m: * Source/NSData.m: * Source/NSDate.m: * Source/NSNull.m: * Source/NSValue.m: * Source/NSPortNameServer.m: * Headers/Additions/GNUstepBase/preface.h.in: Fixups to avoid spurious compiler warnings. 2006-06-02 Richard Frith-Macdonald * Source/GSHTTPURLHandle.m: Fix uninitialised variable problem. 2006-06-01 Richard Frith-Macdonald * Source/GSString.m: Fix position of external function declaration. Fix use gf getCString methods for length error. * Headers/Foundation/NSGeometry.h: Tweaks for stuff reported as problematic with objective-c++ compile. 2006-05-30 David Ayers * Source/GSPrivate.h (GSCharPtr): New union type to handle alignment issues. (GSString): Use it. * Source/GSString.m ([-initWithBytesNoCopy:length:encoding:freeWhenDone:]): Use GSCharPtr instead of casts to avoid alignment issues. Fix typo's. * Source/NSString.m ([-initWithBytesNoCopy:length:encoding:freeWhenDone:]): Correct grammar in comment. 2006-05-30 Richard Frith-Macdonald * Source/Additions/Unicode.m: Use 'goto' to jump to 'done' label on failure to grow buffer, rather than 'break' ... because the GROW() macro is not aways called where a break gets you to the right place. Fixes bug spotted by David Ayers, and is also clearer code. 2006-05-26 Richard Frith-Macdonald * Tools/objctidy.m: Crude utility to help importing code into GNUstep by trying to reformat common style differences to something like iour coding standards. 2006-05-25 Andrew Ruder * Source/NSConcreteNumberTemplate.m (from NSConcreteNumber.m): * Source/GSConcreteValueTemplate.m (from GSTemplateValue.m): * Source/GNUmakefile: * Source/Makefile.postamble: * Source/GSConcreteValue.m (added): * Source/NSConcreteNumber.m (added): Get rid of use of sed to generate concrete NSNumber/NSValue classes. Use preprocessor to get around generation of additional files. 2006-05-24 Richard Frith-Macdonald * Source/NSPredicate.m: Restore last changes with varargs rewrite using va_copy to try to make code portable. This version compiles on systems where va_list is not a simple pointer, but is untested. * Source/GSString.m: Use GSIsByteEncoding() to test whether an encoding can hold ascii data. 2006-05-24 Richard Frith-Macdonald * Source/NSTimeZone.m: * Source/NSBundle.m: * Source/NSPropertyList.m: * Source/NSProcessInfo.m: * Source/NSPage.m: * Source/NSCallBacks.m: * Source/NSSortDescriptor.m: * Source/NSFileManager.m: * Source/objc-load.m: * Source/NSException.m: * Source/NSString.m: * Source/mframe.m: * Source/cifframe.m: * Source/Additions/Unicode.m: * Source/Additions/GSXML.m: * Source/Additions/GSNextRuntime.m: * Source/NSConnection.m: * Source/callframe.m: Tidy up uses of malloc etc to all go through objc_malloc and friends. 2006-05-23 Richard Frith-Macdonald * Source/Additions/GSMime.m: Fix some cases where parse was saying it needed more data even though it had actually completed. * Source/NSException.m: Don't add stacktrace information if we are not building with debug on. * Source/GSString.m: Minor optimisation ... return @"" for all substrings with a zero length range. 2006-05-22 Richard Frith-Macdonald * Source/NSSerializer.m: Fix longstanding deserialisation problem ... is not retaining cross-referenced items... which is not a problem unless the item happens to be a dictionary key which is copied/released when the corresponding value is added to the dictionary. * Source/GSString.m: Make sure inline strings have 'free' flag set and add comments to say we use it to indicate ownership of buffer rather than whether to free the data. Maybe we should change the flag name? * Source/Additions/Unicode.m: Fix missing brackets in byte order handling for UTF-16. Problem pointed out by David Ayers 2006-05-20 Richard Frith-Macdonald Restore reversions with a bugfix for deserialising ascii strings 2006-05-20 Richard Frith-Macdonald Revert last changes ... passed regression tests but broke some software :-( 2006-05-20 Richard Frith-Macdonald * Source/GSString.m: * Source/NSSerializer.m: Commit more string tidyups and simplifications made while I was travelling. Changed private internal string subclasses so that they can't be re-initialised ... all instances are initialised 'manually' rather than through a method that could be called by other code outside this file ... thus all initialisation by external code goes through ([-initWithBytesNoCopy:length:encoding:shouldFree]) method of the placeholder string. 2006-05-15 Richard Frith-Macdonald * Source/GSHTTPURLHandle.m: Fix error when parsing response with no content. * Source/NSPredicate.m: Revert to previous version as last change contained broken code and wouldn't compile. * Source/NSKeyValueCoding.m: * Source/GSArray.m: * Source/GSFFCallInvocation.m: * Source/NSInvocation.m: * Source/NSCoder.m: * Source/NSObject.m: * Source/Additions/GSCategories.m: * Headers/Foundation/NSLock.h: * Tools/AGSHtml.m: * Tools/autogsdoc.m: Use casts to avoid spurious warnings from gcc-4.1 2006-05-15 Fred Kiefer * Source/NSPredicate.m: Extracted all the parsing into a speparate class GSPredicateScanner. This change is based on code by Nikolaus Schaller , but extends this. 2006-05-14 Richard Frith-Macdonald * Source/NSString.m: * Source/GSString.m: Change to use ([initWithBytesNoCopy:length:encoding:freeWhenDone:]) as the primary/designated initialiser for strings and update code to fix character encoding errors when copying mutable strings in a UTF8 locale (ie where the internal encoding for 8bit strings is not the same as the external encoding). WARNING ... this is a restructuring of functionality which is core to the library. Please use with care and report any bugs found. 2006-05-12 Richard Frith-Macdonald * Source/GSString.m: validate UTF-16 data when producing a Cstring * Source/NSCharacterSetData.h: Add code plane 16 (private use) * Source/NSCharacterSet.m: Fix to support code plane 16 * Source/GSString.m: Attempt to fix error making a mutable copy of an 8bit string when the external Cstring encoding is not the same as the internal one. Use new initWithBytes... method specifying the encoding used in those cases. 2006-05-11 Richard Frith-Macdonald * Headers/Foundation/NSBundle.h: add ([bundleWithIdentifier:]) * Source/NSBundle.m: implement ([bundleWithIdentifier:]) and prevent loading of multiple bundles with the same non-nil identifier. Use standardised path as cache key to prevent same bundle being loaded multiple times via symlinks etc. * Source/NSMessagePortNameServer.m: Fixup for names which contain bad characters for in a filename. * Source/win32/NSMessagePortNameServerWin32.m: ditto 2006-05-10 Richard Frith-Macdonald * Source/Additions/GSMime.m: Check for content-length specified as zero, and mark parsing as complete without attempting to read body. 2006-05-09 Nicolas Roard * Source/NSSortDescriptor.m: use -valueForKeyPath: instead of -valueForKey:. Patch from Saso Kiselkov . 2006-05-09 Dr. H. Nikolaus Schaller * Source/GNUmakefile: * Source/NSPredicate.m: * Headers/Foundation/NSCompoundPredicate.h: * Headers/Foundation/NSComparisonPredicate.h: * Headers/Foundation/NSPredicate.h: * Headers/Foundation/NSExpression.h: * Headers/Foundation/Foundation.h: Basic implementation of NSPredicate and related classes. 2006-05-08 Richard Frith-Macdonald * configure.ac: Check for bfd stuff for stacktrace support. * Source/NSException.m: incorporate code by Lloyd Dupont and Wim Oudshoorn to add a stack trace to a raised exception. Cleaned up and made to conform to coding standards. Rewrote code to build list of binary files from NSBundle. EXPERIMENTAL! Turn this on by building with STACKTRACE defined 2006-05-07 Richard Frith-Macdonald * Source/NSBundle.m: ignore profile/debug extensions in library name when looking for library bundles. 2006-05-06 Fred Kiefer * Resources/Languages/Esperanto: New language file. * Resources/Esperanto.lproj/Localizable.string: New string translations. Patch by Ingolf Jandt . * Resources/Languages/Korean: New language file. * Resources/Korean.lproj/Localizable.string: New string translations. Patch by Hwang YunSong . * Resources/GNUmakefile: Added new languages. 2006-05-05 Richard Frith-Macdonald * Headers/Foundation/NSBundle.h: fix type of _bundleClasses * Source/NSBundle.m: Try to make bundles for libraries behave as well as possible with respect to the code in the libraries. Rather depends on the Info.plist in the resource directory specifying an NSPrincipalClass so that we can look up that class at runtime and determine the file it came from. Added documentation to mmake it clear that this is not reliable (eg impossible for static or non-existent libraries). 2006-04-30 David Ayers * Source/NSString: Define _GNU_SOURCE to make protoype of fwprintf visible. 2006-04-28 Richard Frith-Macdonald * Source/NSKeyedUnarchiver.m: Fix decoding of NSNull objects. * Source/Additions/GSXML.m: Ensure that calls to parse documents handle the success/failure value returned. Improve exception info. 2006-04-27 Richard Frith-Macdonald * Source/NSURL.m: Fix error unescaping uppercase hex digits. 2006-04-26 Saso Kiselkov * Headers/Foundation/NSException.h: Support native exceptions. 2006-04-26 Richard Frith-Macdonald * Source/NSCalendarDate.m: Correction to millisecond fix ... for bug #16426 * Resources/GNUmakefile: Fix installation of Ukrainian language. * Source/NSProcessInfo.m: Always use UTF16 args on mingw32. 2006-04-26 Hubert Chan * config/config.align.c: force compiler not to optimise away the code being tested ... fixes bug #16342 2006-04-26 Marcus Muller * Source/NSKeyValueCoding.m: Fix bug #16386 2006-04-26 Sergii Stoian * Resources/Languages/Russian: Updates and fixes * Resources/Languages/Ukrainian: New file * Resources/Languages/UkrainianRussian: Removed wrong file 2006-04-24 Richard Frith-Macdonald * Source/NSCalendarDate.m: Avoid a couple of minor rounding errors by using floating point constants for millisecond multipliers. 2006-04-24 Alex Perez * Source/NSProcessInfo.m: Elaborated upon the GNU_MISSING_MAIN_FUNCTION_CALL error message, adding a section about the most common cause of the error being mismatched gui and base library versions. Feel free to make more clear or re-word. 2006-04-17 Adam Fedor * Source/NSTimeZone.m: Remove space in @ string define (causes problems with gcc 2.95). 2006-04-14 Jeremy Bettis * Source/win32/GSFileHandleWin32.m: Fix background reading of pipes. Several changes for Openstep compatiblity: Don't queue notification, don't raise exception when asked to read while a background operation is in progress. * Source/win32/GSRunLoopCtxt.m: If there are no handles to block on but there is a timer, sleep until the timer needs to wake up. 2006-04-12 Jeremy Bettis * Source/NSTimeZone.m: Use native time zone files under Solaris. * Source/GSFFCallInvocation.m: If the returning context is expecting a void* but we have a different return type just cast it. This normally is because the method was not declared and has defaulted to returning id. * Source/win32/NSUserDefaultsWin32.m: Write defaults to registry as unicode strings, read in either unicode(REG_SZ) or ascii(REG_BINARY). * Source/win32-load.h: In mingw, fileSystemRepresentation is unicode * Source/objc-load.m: In mingw, fileSystemRepresentation is unicode * Source/NSPropertyList.m (propertyListFromData:mutabilityOption:format:errorDescription:): Don't call memcmp if the data is smaller than 8 bytes. * Source/NSFileManager.m (isExecutableFileAtPath:): Added a comment * Source/NSBundle.m (objc_executable_location): A cast was obsuring a misuse of fileSystemRepresentation 2006-04-10 Fred Kiefer * Source/NSPropertyList.m (BinaryPLGenerator - storeCount:): Corrected line forgotten when applying last patch. 2006-04-04 Richard Frith-Macdonald * Source/Additions/GSXML.m: ([GSSAXHandler-dealloc]) fix memory leak. 2006-04-02 Richard Frith-Macdonald * Source/NSBundle.m: When loading localisation striong files, check the character encoding used and warn if it's not portable and may be producing incorrect messages due to the current default C string encoding not being the same as the one the file was created in. 2006-04-01 Richard Frith-Macdonald * Source/NSCharacterSetData.h: Updated to version with comments. 2006-03-31 Richard Frith-Macdonald * Source/Additions/GSObjCRuntime.m: Add a class for autoreleased memory so it is clearer when using object allocation debugging. 2006-03-28 Richard Frith-Macdonald * Source/GSString.m: Fix error initialising mutable string from unicode char array conmtaining ascii characters. Fix a few memory mleaks. 2006-03-25 Richard Frith-Macdonald * Source/win32/NSStreamWin32.m: Various tidyups for pipe streams. * Source/NSDictionary.m: Avoid compiler warning. * Headers/Additions/GNUstepBase/Unicode.h: Add validation function. * Source/Additions/Unicode.m: Add unicode validation function and alter UTF8 handling to be stricter. * Source/GSString.m: validate unicode when initialising a string. Also create 8bit data strings rather than 16bit where possible. 2006-03-24 Richard Frith-Macdonald * Source/GSRunLoopCtxt.h: * Source/unix/GSRunLoopCtxt.m: * Source/win32/GSRunLoopCtxt.m: Tidy/improve removal of triggered watchers from outer contexts. * Source/NSDictionary.m: ([valueForKey:]) conform to MacOS spec 2006-03-21 Richard Frith-Macdonald * Source/unix/GSRunLoopWatcher.m: deleted * Source/win32/GSRunLoopWatcher.m: deleted * Source/GSRunLoopWatcher.m: combine drom subdirectories. * Source/GNUmakefile: * Source/NSSocketPort.m: * Source/NSRunLoop.m: * Source/GSRunLoopWatcher.h: * Source/GSStream.h: * Source/GSStream.m: * Source/unix/GSRunLoopCtxt.m: * Source/unix/GNUmakefile: * Source/unix/NSStream.m: * Source/GSRunLoopCtxt.h: * Source/NSMessagePort.m: * Source/win32/GSRunLoopCtxt.m: * Source/win32/GNUmakefile: * Source/win32/NSStreamWin32.m: * Source/NSThread.m: * Source/GSFileHandle.m: * Headers/Foundation/NSRunLoop.h: * Headers/Additions/GNUstepBase/GSFileHandle.h: Remove timeout facility for runloop watchers ... can use standard timers instead. This simplifies api/code somewhat. Added new watcher type ET_TRIGGER to count as an input source for the runloop but work by polling rather than waiting for I/O events. This allows NSStream objects to be added to the runloop even if they don't do real I/O (eg memory streams). Added private internal API to allow watchers to adjust how the loop deals with them for each iteration... needed to simulate unix like level-triggered events on windows where events are edge triggered. Rewrote NSStream code to put handling of runloop scheduling in the abstract classes rather than repeat in every subclass. Rewrote NSStream stuff to use new runloop mechanisms to support memory and file streams in runloops. Implemented pipe base NSStream for windows. 2006-03-18 Richard Frith-Macdonald * Tools/AGSOutput.m: Get rid of bogus ' ' * Tools/AGSHtml.m: Fix error in display of category method index. 2006-03-17 Richard Frith-Macdonald * Source/cifframe.h: Add code to try to get ffi muld to work on mingw32 * GNUmakefile: Don't build SSL subproject for mingw32 as it doesn't work. 2006-03-17 Andrew Sveikauskas * Source/thr-mach.h: include objc/objc-api.h * Source/thr-pthread.m: use pthread_yield() except for apple * Source/GNUmakefile: link pthread library on openbsd where it isn't linked to the objc runtime. 2006-03-13 Adam Fedor * Version 1.12.0 2006-03-13 Richard Frith-Macdonald * Source/NSKeyValueCoding.m: Attempt to fix problems introduced into keypath code and reported by Helge ... ensure kvc mnethods are called for each element in the path. * Source/inet_pton.c: fixup for mingw32 * Source/NSTimeZone.m: add missing include 2006-03-12 Richard Frith-Macdonald * Source/NSPropertyList.m: Allow for quoting of numeric/date values in property lists. Fixes bug #16068 2006-03-11 Richard Frith-Macdonald * Headers/Additions/GNUstepBase/GSXML.h: clarify documentation of xml entity escaping methods. * Headers/Foundation/NSInvocation.h: don't use 'class' as macro argument ... should be hermless but is confusing to C++ programmers. 2006-03-10 Richard Frith-Macdonald * Source/NSTimeZone.m: * Source/NSCalendarDate.m: * Source/GSPrivate.h: * Source/NSDate.m: Reorganise/tidy to avoid making some private symbols external. 2006-03-08 Richard Frith-Macdonald * Source/unix/GSRunLoopCtxt.m: Don't hanlde windows messages unless required. * Source/win32/NSStreamWin32.m: Use fileSystemRepresentation rather than cStringUsingEncoding: * Source/NSCalendarDate.m: Support '%T' and '%t' in description. * Source/NSFileManager.m: don't abort directory copy just because we can't set attributes of destination directory. Don't try to copy directories with their old owners. * Source/Additions/GSXML.m: Support #x and #X unescaping. * Source/NSSocketPortNameServer.m: * Source/NSBundle.m: * Source/NSProcessInfo.m: * Source/NSAttributedString.m: * Source/NSArray.m: * Source/NSMessagePortNameServer.m: * Source/GSPrivate.h: * Source/NSInvocation.m: * Source/NSNotificationCenter.m: * Source/NSCoder.m: * Source/mframe.m: * Source/Additions/GSCategories.m: * Source/NSConnection.m: * Source/GSPortPrivate.h: * Source/NSThread.m: * Source/NSNull.m: * Source/NSDistantObject.m: * Source/NSTask.m: * Source/NSPortNameServer.m: * Headers/Foundation/NSTimeZone.h: * Headers/Foundation/NSHashTable.h: * Headers/Foundation/NSRange.h: * Headers/Foundation/NSCoder.h: * Headers/Foundation/NSException.h: * Headers/Foundation/NSByteOrder.h: * Headers/Foundation/NSPortCoder.h: * Headers/Foundation/NSURL.h: * Headers/Foundation/NSObject.h: * Headers/Foundation/NSCalendarDate.h: * Headers/Foundation/NSDecimalNumber.h: * Headers/Foundation/NSKeyValueCoding.h: * Headers/Foundation/NSBundle.h: * Headers/Foundation/NSSerialization.h: * Headers/Foundation/NSURLHandle.h: * Headers/Foundation/NSPropertyList.h: * Headers/Foundation/NSTimer.h: * Headers/Foundation/NSNotification.h: * Headers/Foundation/NSScanner.h: * Headers/Foundation/NSProcessInfo.h: * Headers/Foundation/NSDistributedNotificationCenter.h: * Headers/Foundation/NSGeometry.h: * Headers/Foundation/NSAttributedString.h: * Headers/Foundation/NSDecimal.h: * Headers/Foundation/NSConnection.h: * Headers/Foundation/NSUndoManager.h: * Headers/Foundation/NSDateFormatter.h: * Headers/Foundation/NSMethodSignature.h: * Headers/Foundation/NSAutoreleasePool.h: * Headers/Foundation/NSFormatter.h: * Headers/Foundation/NSUserDefaults.h: * Headers/Foundation/NSThread.h: * Headers/Foundation/NSData.h: * Headers/Foundation/NSDate.h: * Headers/Foundation/NSHost.h: * Headers/Foundation/NSArray.h: * Headers/Foundation/NSProxy.h: * Headers/Foundation/NSObjCRuntime.h: * Headers/Foundation/NSKeyedArchiver.h: * Headers/Foundation/NSProtocolChecker.h: * Headers/Foundation/NSDebug.h: * Headers/Foundation/NSPortMessage.h: * Headers/Foundation/NSError.h: * Headers/Foundation/NSDistributedLock.h: * Headers/Foundation/NSFileHandle.h: * Headers/Foundation/NSKeyValueObserving.h: * Headers/Foundation/NSDictionary.h: * Headers/Foundation/NSClassDescription.h: * Headers/Foundation/NSNull.h: * Headers/Foundation/NSZone.h: * Headers/Foundation/NSValue.h: * Headers/Foundation/NSIndexSet.h: * Headers/Foundation/NSPort.h: * Headers/Foundation/NSSortDescriptor.h: * Headers/Foundation/NSLock.h: * Headers/Foundation/NSSet.h: * Headers/Foundation/NSDistantObject.h: * Headers/Foundation/NSTask.h: * Headers/Foundation/NSCharacterSet.h: * Headers/Foundation/NSInvocation.h: * Headers/Foundation/NSUtilities.h: * Headers/Foundation/NSPortNameServer.h: * Headers/Foundation/NSNumberFormatter.h: * Headers/Foundation/NSXMLParser.h: * Headers/Foundation/NSEnumerator.h: * Headers/Foundation/NSMapTable.h: * Headers/Additions/GNUstepBase/DistributedObjects.h: * Headers/Additions/GNUstepBase/GSCategories.h: Tidied a bit ... wrap some long lines. Remove some old deprecated API. Move some internal API out of external headers. Deprecate a few non-standard API features. Move a bit of non-standard API to the additions library. 2006-03-07 Richard Frith-Macdonald * Source/NSRunLoop.m: * Source/unix/GSRunLoopCtxt.m: * Source/win32/GSRunLoopWatcher.m: * Source/win32/GSRunLoopCtxt.m: * Headers/Foundation/NSRunLoop.h: Add initial attempt at code for adding streams to runloops ... as yet untested and not integrated into the NSStream code. Remove documentation for GNUstep specific loop watcher API and add comments to say that it may be deprecated in a later release if/when we move to using NSStream throughout. * configure.ac: minor documentation corrections. Don't allow environment variable to confuse setup of file location. * configure: regenerated 2006-03-05 Richard Frith-Macdonald * Source/NSRunLoop.m: Optimise timer handling a little and fix very minor bug which would cause runloop to run an extra time on some occasions. * Tools/gdomap.c: Include config.h * configure.ac: Support config file environment variable by default * configure: Regenerate * Documentation/Base.gsdoc: Document default setting for env variable 2006-03-04 Richard Frith-Macdonald * Source/NSRunLoop.m: Rewrite housekeeping timer. * Source/GSRunLoopCtxt.h: Remove obsolete message/selector. * Source/win32/GSRunLoopCtxt.m: Add housekeeping timer. * Source/win32/NSRunLoopWin32.m: remove unused code. * Source/win32/GNUmakefile: remove /NSRunLoopWin32.m * Source/win32/NSStreamWin32.m: minor tidyups * Source/NSThread.m: Use new internal API for housekeeping timer. * Headers/Foundation/NSRunLoop.h: Remove deprecated mingw api Basically, remove deprecated mingw32 specific api, and change housekeeper to try to make it as invisible as possible in terms of side effects. * Source/NSFileManager.m: Fix mingw determination of the ownership of a directory. 2006-03-03 Richard Frith-Macdonald * Tools/gdomap.c: Check for HAVE_STDINT_H for safety of include 2006-03-01 Adam Fedor * configure.ac: Add check for inet_pton. Also check for make- specified GNUstep.conf file * config.make.in: Add variable for inet_pton * Source/inet_pton.c: New file * GNUmakefile: Use it if needed. 2006-03-01 Derek Zhou * Source/GSStream.m: Typo fixes * Source/win32/NSStreamWin32.m: rewrite 2006-03-01 Richard Frith-Macdonald * Source/unix/NSStream.m: Final (hopefully) ifdef to disable ipv6 so systems which don't have it can compile. 2006-02-28 Richard Frith-Macdonald * Source/unix/NSStream.m: More portability fixups ... use AF_UNIX and PF_UNIX if AF_LOCAL and PF_LOCAL are not avaulable. Check for PF_INET6 * Tools/gdomap.c: include stdint.h for uint32_t on systems where it's not included by other headers. 2006-02-27 Richard Frith-Macdonald * Source/Additions/GSXML.m: Helge spotted thread safety issues with the code controlling warnings and the external entity loader. Changed code to modify internals of the parser context and SAX context to set the values in there directly rather than using the global setter mechanism (strangely recommended in the libxml2 docs), so that all setup is made to the individual parser and should not effect other parsers in other threads. * Source/NSUndoManager.m: ([-removeAllActions]) fixed to remove any grouping in progress. 2006-02-27 Richard Frith-Macdonald * Headers/Foundation/NSString.h: Correct return type for ([getCString:maxLength:encoding]) * Source/NSString.m: ([getCString:maxLength:encoding]) make implementation match MacOS-X implementation rather than their docs. Change API for setting path handling mode to be a function we can call before any string/path operations. Maybe final API to be made public? Path handling tweaks based on discussion at FOSDEM * Source/GSString.m: ([getCString:maxLength:encoding]) implemented. * Source/unix/NSStream.m: Portabiulity fixups ... use EPROTO only if defined and use dummy implementations of inet6 cclasses if AF_INET6 is not defined. * Source/NSKeyValueCoding.m: Some optimisation suggested by Helge ... rewrite key path methods to loop rather than recurse. * Source/GSFFIInvocation.m: Avoid compiler warning * Source/NSURL.m: use new getCString... method * Source/NSSerializer.m: ditto * Documentation/Base.gsdoc: Remove env variable to set path handling. * Headers/Additions/GNUstepBase/GSObjCRuntime.h: Slight change to functions for KVC to allow faster implementation. * Source/Additions/GSObjCRuntime.m: ditto 2006-02-24 Richard Frith-Macdonald * NSTimeZone.m: Fix bug in GMT+/-NNNN timezone initialisation so that negative offsets work. Implement GMT and synonyms as internal absolute timezones. Implement GMT-14 to GMT+14 as absolute timezones. 2006-02-23 Richard Frith-Macdonald * Source/NSUserDefaults.m: Restructure for lazy creation of defaults database ... only create when we attempt to write. * Source/NSSocketPort.m: Include GSPrivate.h * Source/NSRunLoop.m: ditto * Source/unix/GSRunLoopCtxt.m: ditto * Source/GSPrivate.h: ditto * Source/win32/GSFileHandleWin32.m: ditto * Source/win32/GSRunLoopCtxt.m: ditto * Headers/Foundation/NSNotificationQueue.h: Move library internal function declarations to GSPrivate.h, thanks to Lloyd Dupont for spotting problem. 2006-02-23 Sheldon Gill * Source/Additions/GSXML.m: URL munging for local DTD cache fixed for Win32 filesystems 2006-02-22 Richard Frith-Macdonald * Source/Additions/GSXML.m: Fix parsing error .. was not recognising base64 elements. * Headers/Foundation/NSPathUtilitites.h: Expand config documentation * NSTimeZone.m: * NSPathUtilities.m: * NSPage.m: * NSException.m: * NSLog.m: Fix some MINGW32 conditional compilation to use __MINGW32__ 2006-02-21 Richard Frith-Macdonald * Source/NSFileManager.m: Ensure that NSBundle is initialised before changing the current directory. * Source/NSBundle.m: Restructure for lazy evaluation of path to executable ... lots of apps never need it. * Source/NSTimeZone.m: Protect some class methods using locking, and provide (slow) fallback mechanisms if some of the files are missing, including fallback to posix stuff in zoneinfo directory if we really have to. 2006-02-20 Richard Frith-Macdonald * NSTimeZones/NSTimeZones.tar: regenerated. 2006-02-19 Richard Frith-Macdonald * Source/NSPathUtilities.m: Make config functions public. * Headers/Foundation/NSPathUtilities.h: Declare config functions. * Source/NSUserDefaults.m: Use config functions and add support for new option to turn off external config file. 2006-02-18 Richard Frith-Macdonald * Source/NSFileManager.m: Fix bug dereferencing nul pointer under some conditions. 2006-02-17 Richard Frith-Macdonald * Source/NSFileManager.m: Implement method to get name of files owner on mingw32. * Source/NSPathUtilities.m: Check that user specific config file is owned by user, as suggested by Sheldon. 2006-02-16 Derek Zhou * Source/GSStream.h: * Source/GSStream.m: * Source/unix/NSStream.m: * Source/win32/NSStreamWin32.m: * Headers/Foundation/NSStream.h: Add server side and pipe stream extensions along with a few fixes. 2006-02-15 Andrew Ruder * Headers/Foundation/NSStream.h: NSRunLoop was not defined in the NSStream header file. (Added @class NSRunLoop;) 2006-02-15 Derek Zhou Richard Frith-Macdonald * Headers/Foundation/NSStream.h: New NSStream, NSInputStream and NSOutputStream classes and constants. * Headers/Foundation/Foundation.h: include NSStream.h * Source/GSStream.h: Internal headers for GSStream and subclasses * Source/GSStream.m: System independent parts of NSStream * Source/unix/NSStream.m: Unix specific class implementations * Source/unix/GNUmakefile: Build NSStream.m * Source/win32/NSStreamWin32.m: Win32 placeholders * Source/win32/GNUmakefile: Build NSStreamWin32.m * Source/GNUmakefile: Build GSStream.m * Source/DocMakefile: Build NSStream documentation Partial implementation of NSStream ... missing SSL, SOCKS, and Win32 (apart from memory streams). 2006-02-15 Andrew Ruder * Headers/Foundation/NSString.h: Fixing the oldest bug in GNUstep? The header has says NSObject since Andrew McCallum added the file on March 18th, 1995 (Just short of 11 years ago). 2006-02-14 Richard Frith-Macdonald * Source/GSFileHandle.m: ([-availabledata]) fix error in last change as we should block, but not for more than a single byte. 2006-02-13 Richard Frith-Macdonald * Source/Additions/GSCategories.m: Fix MD5 digest for 64bit CPU 2006-02-12 Richard Frith-Macdonald * Source/NSIndexPath.m: new * Headers/Foundation/NSIndexPath.h: new * Headers/Foundation/Foundation.h: include NSIndexPath.h * Source/GNUmakefile: build NSIndexPath * Source/DocMakefile: document NSIndexPath 2006-02-10 Richard Frith-Macdonald * Source/win32/GSFileHandleWin32.m: Ignore extraneous write events. * Source/NSString.m: Don't insert native path separators by default. * Source/NSProcessInfo.m: Report correct operating system on windows. 2006-02-07 Richard Frith-Macdonald * Source/GSFileHandle.m: ([-availabledata])a fix logic of non-blocking I/O setting. * Source/NSBundle.m: ([-pathForResource:ofType:inDirectory:]) ignore versioning on windows. 2006-02-05 Richard Frith-Macdonald * Source/NSString.m: (handle_printf_atsign()) extend to support wprintf. 2006-02-01 Richard Frith-Macdonald * Source/Additions/Unicode.m: Try to use iconv transliteration for lossy conversion. When handling unconvertable characters in lossy conversion, substitute a question mark rather than an asterisk for consistency with iconv and other implementations. 2006-01-27 Richard Frith-Macdonald * Source/NSDistributedLock.m: ([description]) implemented 2006-01-20 Richard Frith-Macdonald * Source/NSAutoreleasePool.m: ([addObject:]) fix error in check for missing pool during thread exit. 2006-01-19 Richard Frith-Macdonald * Tools/plget.m: remove unused variable * Source/GGSString.m: optimise ([canBeConvertedToEncoding:]) * Source/NSURL.m: correct misleading/wrong exception text. * Source/NSString.m: mingw path handling tweaks ... build new paths using native separator by default. 2006-01-19 Richard Frith-Macdonald * Headers/Foundation/NSThread.h: * Source/NSAutoreleasePool.m: * Source/NSThread.m: Mimic MacOS-X behavior and create an autorelease pool if necessary to catch any autorelease objects during thread exit. As suggested by Wim Oudshoorn.. 2006-01-18 Richard Frith-Macdonald * Source/Additions/Unicode.m: fix for rare case where we could corrupt the stack ... spotted by Wim Oudshoorn. 2006-01-18 Andrew Ruder * config/addlibrarypath.m4: new file * configure.ac: Use new function to set library paths for netbsd * configure: regenerate 2006-01-17 Richard Frith-Macdonald * Tools/plget.m: New file to extract a string from a plist. * Tools/pldes.1: Include plget * Tools/GNUmakefile: build/install plget. 2006-01-15 Richard Frith-Macdonald * Source/win32/NSMessagePortNameServerWin32.m: * Source/win32/NSMessagePortWin32.m: Add hack to cope with bug reading registry ... better solution welcome if anyone knows one. Add security attributes to message port stuff ... should only let current user on current machine access message ports I hope. 2006-01-12 Richard Frith-Macdonald * Source/NSPathUtilities.m: Fix possible read off end of buffer when parsing config file. 2006-01-11 Richard Frith-Macdonald * Documentation/GNUmakefile: * Documentation/General/GNUmakefile: Fix path to autogsdoc for mingw where the 'obj' symlink doesn't work. 2006-01-11 Richard Frith-Macdonald * Headers/Additions/GNUstepBase/GSUnion.h: * Headers/Foundation/NSByteOrder.h: * Headers/Foundation/NSPort.h: * Source/GSFileHandle.m: * Source/GSFormat.m: * Source/NSData.m: * Source/NSDistantObject.m: * Source/NSMessagePort.m: * Source/NSPortCoder.m: * Source/NSSerializer.m: * Source/NSSocketPort.m: * Source/NSSocketPortNameServer.m: * Source/NSString.m: * Source/NSTimeZone.m: * Source/NSUnarchiver.m: * Source/win32/GSFileHandleWin32.m: * Source/win32/NSMessagePortWin32.m: Update to use sized datatypes from stdint.h now that almost all operating systems support it. * Source/NSCalendarDate.m: Support '%T' and '%t' as supplied by unix date/time locale info. * configure.ac: Ensure uintptr_t and intptr_t exist * configure: regenerate 2006-01-10 Richard Frith-Macdonald * Source/mframe.m: When calculating info about a structure, make sure its alignment is that of its most strictly aligned field and make sure its size is a multiple of its alignment. * Source/NSData.m: ([initWithCoder:]) Fix bug decoding unsigned long into unsigned int variable ... breaks on amd64 2006-01-10 Richard Frith-Macdonald * Source/GSFileHandle.m: * Source/NSAutoreleasePool.m: * Source/NSCallBacks.m: * Source/NSConnection.m: * Source/NSData.m: * Source/NSDictionary.m: * Source/NSDistantObject.m: * Source/NSMessagePort.m: * Source/NSObject.m: * Source/NSProtocolChecker.m: * Source/NSProxy.m: * Source/NSSocketPort.m: * Source/NSTask.m: * Source/NSThread.m: * Source/NSZone.m: * Source/Additions/GSXML.m: * Source/unix/GSRunLoopCtxt.m: Add explicit casts to avoid compiler warnings where we are on a processor where the size of an integer is not the same as the size of a pointer. * Tools/gdomap.c: Add type casts to fix comparisons on 64bit processor 2006-01-09 Richard Frith-Macdonald * Source/win32/GSRunLoopCtxt.m: Apply patch by Jeremy Bettis with fixups for intentation/formatting and minor correction to avoid waiting for an event when we have handled one in the current run of the loop. 2006-01-09 Richard Frith-Macdonald * Source/NSPropertyList.m: When generating binary plist, fix bug in case where we have to increase table size. * Source/NSKeyedArchiver.m: Update to use binary plist format by default rather than xml format ... MacOS-X compatible and works when libxml2 is not available. * Source/NSKeyedUnarchiver.m: Print NSLog error if attempting to decode an xml archive when no libxml2 is available. 2006-01-08 Richard Frith-Macdonald * Source/NSPathUtilities.m: be more consistent in use of defined values from config file. * configure.in: Improve comments/help. Fix error in config where we were attempting OS based decisions before we had determined the OS. Improve default paths on mingw to be relative to the DLL. Load information from make package config fo use during build of base library. Generally try to improve user experience on mingw to make build/install really simple with new config files. * configure: regenerate * Headers/Additions/GNUstepBase/config.h.in: regenerate * Documentation/Base.gsdoc: Attempt to clarify config file operation. 2006-01-07 Fred Kiefer * Source/NSPropertyList.m (BinaryPLGenerator - storeCount:) Handle count > 256*256. Patch by Derek Zhou . 2006-01-04 David Ayers Bug #15353 * Source/NSProcessInfo.m (fallbackInitialisation): Move initialization to avoid compiler error. Reported by Stefan van den Oord (stefan.vandenoord@gmail.com). 2005-12-21 Adam Fedor * Version 1.11.2 2005-12-21 Richard Frith-Macdonald * Tools/AGSHtml.m: Partial update for use of CSS ... as provided by Fabien Vallon. Need to decide where the stylesheet file should come from and where it should be installed. Probably need a new autogsdoc flag for this and some internal api changes. 2005-12-20 Richard Frith-Macdonald * Tools/AGSParser.m: Deal with C++ declaration of external C/ObjC libs. * Tools/AGSHtml.m: Add changes to avoid colons in references to allow dumb windows help system to use our output. Same idea as patch #4569 but (hopefully) doesn't break anything. * Source/DocMakefile: A couple of fixes for building documentation of the additions library. 2005-12-20 Adam Fedor * SSL/configure.ac: Check for GNUSTEP_MAKEFILES not GNUSTEP_SYSTEM_ROOT. 2005-12-15 Richard Frith-Macdonald * Source/NSMessagePort.m: * Source/NSSocketPort.m: Increase maximum supported message size from 10MB to 32MB in recognition of the fact that everything is faster/bigger nowadays and people might actually want to send single messages with that much data in them. 2005-12-13 Richard Frith-Macdonald * Source/Additions/GSXML.m: Fix error parsing date/time in xmlrpc Remove bad characters when escaping string for xml. 2005-12-07 Richard Frith-Macdonald * Source/NSPathUtilities.m: Get paths of system directories (for linux FHS support) from config file. * Documentation/Base.gsdoc: update 2005-12-06 Richard Frith-Macdonald * configure.ac: On mingw, don't get the location of the config file from the make package. Assume ./GNUstep.conf instead, so that the base library is built for distribution (relocatable relative to the library). * configure: regenerate 2005-12-05 Richard Frith-Macdonald * Source/NSProcessInfo.m: Allow ([+initializeWithArguments:count:environment:]) to override the real environment on mingw32. * Source/NSPathUtilities.m: Ignore config files named .GNUstep.conf-ignore (so we can safely disable config file reading and ensure inbuilt defaults are used) * configure.ac: By default, disallow use of GNUSTEP_CONFIG_FILE environment variable. Remove some redundant code. Document better. * configure: regenerate * Documentation/Base.gsdoc: Update for config changes * Tools/autogsdoc.m: add any gsdoc files explicitly specified on command line to generated dependency file for make. 2005-12-02 Richard Frith-Macdonald * configure.ac: Fix bug configuring whether GNUstep.conf can be set in the environment * configure: regenerate 2005-12-01 Richard Frith-Macdonald * Source/NSPathUtilities.m: Add more checks/warnings about improper configuration. * Headers/Foundation/NSException.h: clarify/extend documentation. * Source/NSException.m: move some documentation to header. 2005-11-28 Richard Frith-Macdonald * Headers/Additions/GNUstepBase/GSConfig.h.in: * Headers/Additions/GNUstepBase/GSXML.h: * Headers/Foundation/NSCoder.h: * Headers/Foundation/NSConnection.h: * Headers/Foundation/NSFileManager.h: * Headers/Foundation/NSKeyValueObserving.h: * Headers/Foundation/NSObject.h: * Headers/Foundation/NSPort.h: * Headers/Foundation/NSPortCoder.h: * Headers/Foundation/NSProxy.h: * Headers/Foundation/NSString.h: * Headers/Foundation/NSURL.h: * Headers/Foundation/NSXMLParser.h: * Source/NSArray.m: * Source/NSAttributedString.m: * Source/NSCoder.m: * Source/NSConnection.m: * Source/NSDictionary.m: * Source/NSFileHandle.m: * Source/NSFileManager.m: * Source/NSKeyValueObserving.m: * Source/NSKeyedArchiver.m: * Source/NSKeyedUnarchiver.m: * Source/NSObject.m: * Source/NSPortCoder.m: * Source/NSPortNameServer.m: * Source/NSRunLoop.m: * Source/NSString.m: * Tools/AGSOutput.m: * Tools/gdnc.m: * Tools/gsdoc.gsdoc: Documentation tweaks and minor simplificiations. 2005-11-28 Richard Frith-Macdonald * Tools/AGSOutput.m: * Tools/AGSParser.h: * Tools/AGSParser.m: * Tools/AGSHtml.m: * Tools/autogsdoc.m: * Tools/gsdoc-1_0_3.dtd: * Toold/gsdoc.gsdoc: Added override=dummy attribute for methods which have dummy implementations intendeed to be ocerridden in subclasses. Update to log warning about unimplemented methods which are not tagged as intended to be overridden. 2005-11-22 Richard Frith-Macdonald * Source/NSPathUtilities.m: Restructure so that GNUstepConfig() can be used to set/get the global configuration as suggested by Jeremy Bettis 2005-11-22 Richard Frith-Macdonald * Source/NSPort.m: * Source/NSMessagePort.m: * Source/NSDistributedNotificationCenter.m: * Tools/gdnc.m: Use the NSPortIsMessagePort user default consistently to control whether socket or message ports are used by default. Remove mingw32 specific GSMailslot user default. Source/NSPathUtilities.m: Check for illegal paths (ones which don't appear to be absolute paths) specified in config file ... warn about the bad config, but try to guess what they shjould be for mingw32 2005-11-20 Richard Frith-Macdonald * configure.ac: Add flags to allow detection of headers/libraries installed in the System domain of the GNUstep hierarchy. * configure: regenerate * Source/win32/GSRunLoopCtxt.m: Intercept windows WM_QUIT messages and tell the application to terminate cleanly (or raise an exception if the NSApplication class is not linked). Should allow ms-windows to get a mingw32-based GNUstep app to shut down cleanly. * Source/NSDistributedNotificationCenter.m: Rewrite code for connecting to and starting up daemon to handle the process more quickly and smoothly. Only complain if we can't to connect to it even after launching it and retrying the connection for five seconds. 2005-11-16 Richard Frith-Macdonald * Source/NSProcessInfo.m: * Source/NSUserDefaults.m: Restore reverted changes for code where class initialisation order is not a factor. * Source/NSUser.m: Delete unused file * GNUmakefile: Don't try to build NSUser.m 2005-11-15 Richard Frith-Macdonald Revert last changes ... discovered some apps where ordering of class initialisation caused failures. 2005-11-15 Richard Frith-Macdonald * Tools/gdnc.m: * Source/GSPrivate.h: * Source/NSException.m: * Source/NSObject.m: * Source/NSProcessInfo.m: * Source/NSString.m: * Source/NSUserDefaults.m: Be consistent and access environment variables only via the NSProcessInfo class ...so a program which uses a category to override it can effectively change the environment safely. * Source/NSPathUtilities.m: Restructure code for gatting config, so that a single function can be used to get/set config information for the system or a user. Decrease code duplication. 2005-11-14 Richard Frith-Macdonald * Source/win32/GSFileHandleWin32.m: Move mingw32 implementation of file handle code here. * Source/GSFileHandle.m: Remove mingw32 code. * Source/NSPathUtilitires.m: Fix handling of user config file for when the user name is changed. 2005-11-12 Richard Frith-Macdonald * Source/NSPathUtilities.m: NSOpenStepRootDirectory() remove deprecated status in documentation. Try to clarify doc. Get rid of environment variable. Use native path for mingw32 * Tools/gsdoc.7: Fix obsolete reference to environment variable. * Tools.gsdoc.gsdoc: ditto 2005-11-11 Richard Frith-Macdonald * Applied Willem Rein Oudshoorn's fix for bug #11055, having tested it and found it OK on windows-xp as well as the windows-2003 system he was using. 2005-11-11 Richard Frith-Macdonald * Source/win32/NSMessagePortNameServerWin32.m: fix port lookup in case where named port does not exist. Correct debug logging by class name. * Testing/nsconnection_client.m: don't run large structure test on mingw32 at present ... it crashes (something wrong with the invocation stuff for ffcall and some large structures on mingw32) * Tools/gdnc.m: Obey GSMailslot default on mingw32. * Source/NSDistributedNotificationCenter.m: ditto. * Source/win32/NSMessagePortWin32.m: Fixes for cases where requests we wanted to be async actually complete synchronously. Moves the state of this code from pre-alpha to alpha/beta quality I guess. * Source/preface.m: Change declaration of variables to be pointer to char rather than array of char ... more usual/safe. 2005-11-10 Richard Frith-Macdonald * Source/win32/NSMessagePortWin32.m: more changes * Source/win32/NSMessagePortNameServerWin32.m: ditto Working at least in part (pre-alpha I guess) ... enable with the GSMailslot user default. Known problems - 1. no way of telling if the other end of a connection has gone until we try to write to it. 2. hangup in my testing comms between three threads. 2005-11-09 Richard Frith-Macdonald * Source/win32/NSMessagePortWin32.m: more changes * Source/win32/NSMessagePortNameServerWin32.m: ditto * Source/Tools/AGSOutput.m: search for C/ObjC types in text, and render them as automatically as suggested by Fabien Vallon. 2005-11-08 Richard Frith-Macdonald * Source/win32/NSMessagePortWin32.m: Lots of work towards implementing this, but nothing usable yet (compiles but won't run). * Source/win32/NSMessagePortNameServerWin32.m: ditto * Source/win32/NSUserDefaultsWin32.m: fix value type problem. * Source/win32/GNUmakefile: build NSMessagePortNameServer. * Source/NSMessagePortNameServer.m: fix minor memory leak. 2005-11-07 Richard Frith-Macdonald * Headers/Additions/GNUstepBase/Win32Support.h: removed * Headers/Additions/GNUstepBase/Win32_Utilities.h: removed * Source/NSPathUtilities.m: Don't include unused files. * Source/win32/GNUmakefile: Don't build removed files. * Source/win32/NSUserDefaultsWin32.m: fix '%s' to '%S' * Source/win32/Win32Support.m: removed * Source/win32/Win32_Utilities.m: removed Cleanup ... remove some unused win32 cruft. 2005-11-06 Richard Frith-Macdonald * Documentation/Base.ispell: words from base reference documentation * Documentation/Base.gsdoc: * Headers/Additions/GNUstepBase/GSMime.h: * Headers/Additions/GNUstepBase/GSXML.h: * Headers/Foundation/NSArray.h: * Headers/Foundation/NSCalendarDate.h: * Headers/Foundation/NSCharacterSet.h: * Headers/Foundation/NSConnection.h: * Headers/Foundation/NSData.h: * Headers/Foundation/NSDebug.h: * Headers/Foundation/NSDecimalNumber.h: * Headers/Foundation/NSError.h: * Headers/Foundation/NSFileHandle.h: * Headers/Foundation/NSFormatter.h: * Headers/Foundation/NSIndexSet.h: * Headers/Foundation/NSKeyValueCoding.h: * Headers/Foundation/NSKeyedArchiver.h: * Headers/Foundation/NSLock.h: * Headers/Foundation/NSMethodSignature.h: * Headers/Foundation/NSObject.h: * Headers/Foundation/NSPathUtilities.h: * Headers/Foundation/NSPortMessage.h: * Headers/Foundation/NSPropertyList.h: * Headers/Foundation/NSRunLoop.h: * Headers/Foundation/NSString.h: * Headers/Foundation/NSURL.h: * Headers/Foundation/NSURLHandle.h: * Headers/Foundation/NSXMLParser.h: * Headers/Foundation/NSZone.h: * Source/GSCompatibility.m: * Source/GSCountedSet.m: * Source/GSString.m: * Source/GSTemplateValue.m: * Source/NSArchiver.m: * Source/NSArray.m: * Source/NSCalendarDate.m: * Source/NSClassDescription.m: * Source/NSConnection.m: * Source/NSData.m: * Source/NSDate.m: * Source/NSDebug.m: * Source/NSDictionary.m: * Source/NSDistantObject.m: * Source/NSDistributedLock.m: * Source/NSDistributedNotificationCenter.m: * Source/NSFileHandle.m: * Source/NSFileManager.m: * Source/NSHashTable.m: * Source/NSInvocation.m: * Source/NSLock.m: * Source/NSMapTable.m: * Source/NSObject.m: * Source/NSPathUtilities.m: * Source/NSPortMessage.m: * Source/NSProxy.m: * Source/NSScanner.m: * Source/NSSocketPortNameServer.m: * Source/NSString.m: * Source/NSTask.m: * Source/NSTimeZone.m: * Source/NSTimer.m: * Source/NSURL.m: * Source/NSURLHandle.m: * Source/NSUnarchiver.m: * Source/NSUndoManager.m: * Source/NSUserDefaults.m: * Source/NSValue.m: * Source/Additions/GSCategories.m: * Source/Additions/GSMime.m: * Source/Additions/GSObjCRuntime.m: * Source/Additions/GSXML.m: * Source/Additions/Unicode.m: * Source/win32/NSUserDefaultsWin32.m: * Tools/AGSParser.m: * Tools/autogsdoc.m: * Tools/gdomap.h: Fix typo/spelling mistakes manifesting in reference documentation. I spent half a day going through the tedious process of running all gsdoc output through ispell. 2005-11-05 Richard Frith-Macdonald * Headers/Additions/GNUstepBase/Win32_Utilities.h: * Headers/Foundation/NSFileManager.h: * Headers/Foundation/NSString.h: * Source/NSBundle.m: * Source/NSData.m: * Source/NSFileManager.m: * Source/NSLog.m: * Source/NSPathUtilities.m: * Source/NSProcessInfo.m: * Source/NSString.m: * Source/NSTimeZone.m: * Source/objc-load.m: * Source/win32-load.h: * Source/Additions/GSObjCRuntime.m: * Source/win32/NSMessagePortWin32.m: * Source/win32/NSUserDefaultsWin32.m: * Source/win32/Win32_Utilities.m: Attempt to rationalise mingw32 unicode support, use explicit unicode methods throughput, fix several bugs where APIs were not using unicode when they should have been doing. 2005-11-05 Richard Frith-Macdonald * Source/GSCompatibility.m: don't generate macos-x (xml) property lists if we can't parse them. * Source/GSHTTPURLHandle.m: debug fix for mingw32 * Headers/Foundation/NSFileManager.h: add mingw32 conditionals. * Headers/Foundation/NSString.h: add mingw32 conditionals. * Source/NSMessagePort.m: remove mingw32 stuff * Source/win32/NSMessagePort.m: added partial implementation * Source/win32/NSMessagePortNewServer.m: added skeleton * Source/win32/GNUmakefile: build message port classes 2005-11-04 Richard Frith-Macdonald * configure.ac: Cope with backslashes in values from GNUstep.conf * configure: Regenerated. Improvements for mingw32 systems * Source/NSConnection.m: update obsolete methods. * Source/NSMessagePort.m: start mingw32 implementation 2005-11-01 Richard Frith-Macdonald * Source/NSMessagePort.m: If a socket file already exists when trying to bind to it, try connecting to it to see if there is a program using it, and unlin/retry if there isn't. This is an attempt to handle situations where an old process was not killed cleanly and the new process tries to use the same name. * Source/Additions/GSCategories.m: ([uuencodeInto:name:mode:]) fix error encoding the termination marker of the uuencoded data. * Headers/Foundation/NSPort.h: Declare missing category of NSObject Remove some of the subclass stuff that should be private. * Source/GSPortPrivate.h: Put private port stuff here ... needs more to be moved out of NSPort.h * Source/NSMessagePort.m: Hide instance variables. Use GSPortPrivate.h Add bugfix for possible deadlock situation reported by Wim. * Source/NSSocketPort.m: ditto * Source/NSMessagePortNameServer.m: Use GSPortPrivate.h * Source/NSPort.m: Implement missing informal protocol method. 2005-10-31 Richard Frith-Macdonald * Source/GSHTTPURLHandle.m: retain self for the duration of I/O handler methods where we may make callbacks to clients. In case the client owns the handle, and decides to release it. * Source/GSFileHandle.m: Increase backlog size in listen() to improve perfromance of server objects accepting lots of connections. * Source/NSSocketPort.m: ditto ... though unlikely to be needed. * Source/NSMessagePort.m: ditto * Source/GSTcpPort.m: remove obsolete file * Tools/gstcpport_client.m: ditto * Tools/gstcpport_server.m: ditto 2005-10-30 Richard Frith-Macdonald * Source/NSLog.m: Apply patch #5399 from Jeremy Bettis. Tidy indentation. Fix variable declaration not at start of block (broke compile for older gcc versions). Avoid repeated system calls to get process ID. * Headers/Additions/GNUstepBase/GSRunLoopCtxt.h: Move private header to Source directory. * Headers/Additions/GNUstepBase/GSRunLoopWatcher.h: ditto * Headers/Foundation/NSRunLoop.h: Add event type for handling windows messages. * Source/GNUmakefile: Don't install private headers in public area. * Source/win32/GSRunLoopCtxt.m: Add code to handle windows messages. Check number of handles waited for. Avoid unnecessary heap memory allocation/release. * Source/win32/GSRunLoopWatcher.m: update header path. * Source/win32/NSRunLoopWin32.m: update header path. Deprecate addMsgTarget:withMethod:forMode: as our code for the original addEvent:type:watcher:forMode: can be much more efficient if we don't support that extension. We need to use addEvent:type:watcher:forMode: if we want to implement NSMessagePort using windows messages. if we don't support that as well as the o * Source/win32/NSUserDefaultsWin32.m: update header path. 2005-10-29 Richard Frith-Macdonald * Tools/AGSHtml.m: Revert last change ... it looked OK but it broke internal checking of references. 2005-10-28 Richard Frith-Macdonald * Tools/gdomap.c: standardise on __MINGW32__ * Source/win32/NSUserDefaultsWin32.m: patch #4567 fix a few typos * Source/DocMakefile: get right path for autogsdoc on mingw * Tools/DocMakefile: ditto (patch #4568) * Tools/AGSHtml.m: work round isssues with windows help (patch #4569) Mostly fixes by Jeremy Bettis 2005-10-27 Richard Frith-Macdonald * Tools/AGSParser.m: Fix error setting version numbers for the various standards. Was causing generation of html erroneously saying that things were in neither openstep nor macos-x * configure.ac: Add code to initialise default path/config file information by loading GNUstep.conf config file from the location specified by config.make in the makefiles directory. Add --with-config-file= option to specify the name of the config file to be hard-coded into the library. Overrides the value from the make system if desired. Add --with-default-config= option to specify the config file from which default path values are loaded (at configuration time). This overrides the default behavior of loading values from the file specified by --with-config-file= or in $GNUSTEP_MAKEFILES/config.make Add --disable-importing-config-file for consistency with makefiles package ... not sure we need to keep this option. Add --disable-environment-config-file to prevent use of the GNUSTEP_CONFIG_FILE enviropnment variable. * configure: regenerate * Headers/Additions/GNUstepBase/config.h.in: regenerate to include new path definitions produced by configure script. * Source/GNUmakefile: Ignore variables specifying default paths, these are now set at configure time and can't be changed at make time. * SSL/GNUmakefile: ditto. * Source/NSPathUtilities.m: Remove windows-specific hack which got a few values from the registry ... we want to make use of the GNUstep.conf file simple/consistent across all platforms. Get default values from those defined in config.h 2005-10-26 Richard Frith-Macdonald * Source/NSPathUtilities.m: Drop 'make' style config file parsing and setting on 'sh' style (so we can source the config file). * Source/NSCalendarDate.m: Fix millisecond printing (bug #14863) 2005-10-25 Richard Frith-Macdonald * Source/NSPathUtilities.m: Try to ensure that user root and user library directories exist, so that tools/apps have somewhere to store any resources they don't want to put in the defaults database. 2005-10-23 Jeremy Bettis * Source/NSException.m: Added a few debugging checks in the exception handler code. The handler struct that needs to be removed is passed to _NSRemoveHandler. Therefore, instead of starting at thread->_exception_handler and working your way down through the frames, you can just use the passed in struct. This way, if some bonehead called return in an NS_DURING block, perhaps you can still remove the exception handler without accessing memory that is on a freed section of the stack. 2005-10-23 Richard Frith-Macdonald * Source/NSString.m: remove test method for path handling setup, add environment variable (at least for a while until we are even more sure that there are no problems with do-the-right-thing mode). Remove previously deprecated path methods. * Source/NSFileManager.m: remove previously deprecated path method. * Headers/Foundation/NSString.h: Add missing information about windows peculiarities to comments. * Source/NSUserDefaults.m: More tweaks to use windows registry. also remove test user default for path handling setup. * Source/win32/NSUserDefaultsWin32.m: Rewrite * Source/NSPathUtilities.m: Tweaks for windows. Updates to (optionally) use windows registry to store defaults when GNUSTEP_USER_DEFAULTS_DIR is set to ':REGISTRY:' Based on patch #4299 by Jeremy Bettis, but with rewrites to make use of the code configurable in the GNUstep configuration file, to fix some bugs, and to conform to coding standards, Probably still has bugs to fix, but seems usable now. 2005-10-20 Adam Fedor * Source/NSBundle.m (+pathsForResourcesOfType:inDirectory:, -pathsForResourcesOfType:inDirectory:forLocalization:): Implement. 2005-10-18 Richard Frith-Macdonald * Source/NSUserDefaults.m: Begin applying registry patch. * Source/win32/NSUserDefaultsWin32.m: Registry patch with some work done towards conforming to gnustep coding standards. 2005-10-17 Richard Frith-Macdonald * SSL/GSSSLHandle.m: Don't output log/warning on accept/connect failure if it's just a timeout or disconnect. 2005-10-17 Fred Kiefer * Source/NSNumberFormatter.m (-getObjectValue:forString:errorDescription:, stringForObjectValue:): Respect the settings for decimal and thousands separators. Still a very basic implementation. 2005-10-17 Richard Frith-Macdonald * Source/NSPathUtilities.m: Simplify by removing options for redefining user home directories. Add code to use gnumake format rather than shell format for config files. Fix error in default setup of local root. 2005-10-17 Richard Frith-Macdonald * Source/NSPathUtilities.m: Changes to support relocation of the entire system simply by copying the directory containing it around. 2005-10-16 Richard Frith-Macdonald * Source/NSPathUtilities.m: Set default value for defaults directory (lost in last set of changes). 2005-10-15 Richard Frith-Macdonald * Source/NSPathUtilities.m: Fix retain/release error exposed by recent changes. Rewrite config handling (work in progress ... keeping in sync with make package changes). * Documentation/base.gsdoc: update somewhat. * configure.ac: use GNUSTEP_CONFIG_FILE rather than GNUSTEP_CONFIGURATION_FILE ... for consistency with make. * Headers/Additions/GNUstepBase/config.h.in: ditto * configure: regenerate 2005-10-14 Richard Frith-Macdonald * Source/NSPathUtilities.m: Complete rewrite of config file parsing to try to make it consistent with the escaping and quoting conventions of shells, so the same file can be source'ed by /bin/sh 2005-10-13 Richard Frith-Macdonald * Source/NSPathUtilities.m: Remove some useless functions to clarify code. Add some explanatory comments, make config file parsing a lot more robust. 2005-10-12 Nicola Pero * configure.ac (config_file): Get the location of the configuration file from gnustep-make rather than from a --with-config-file option. Everything works exactly as before, but the --with-config-file option was moved to gnustep-make. * configure: Regenerated. 2005-10-12 Richard Frith-Macdonald * Headers/Foundation/NSPathUtilities.h: Remove deprecated functions. * Source/NSPathUtilities.m: Remove backward compatibility hacks for old GNUsteprc support. Remove deprecated functions. Permit specification of config file Simplify code a little. Fix a retain/release bug. Fix per-user .GNUsteprc parsing to work as documented (ie override the system-window config, not just fill in undefined values). Deprecate use of '~' in per-user .GNUsteprc ... it adds complexity for little utility that I can see ... we can undeprecate it if I'm wrong. * Documentation/Base.gsdoc: Update to remove references to old config scheme. Remove documentation for deprecated '~' in per-user file Clarify how relative/absolute paths in config are treated. 2005-10-10 Richard Frith-Macdonald * Source/NSURLHandle.m: alter file handle to nitice if a file has changed. 2005-10-09 Richard Frith-Macdonald * Headers/Additions/GNUstepBase/GSFileHandle.h: * Headers/Additions/GNUstepBase/GSRunLoopCtxt.h: * Headers/Foundation/NSPort.h: * Headers/Foundation/NSRunLoop.h: * Source/GSFileHandle.m: * Source/NSData.m: * Source/NSFileManager.m: * Source/NSLog.m: * Source/NSRunLoop.m: * Source/NSSocketPort.m: * Source/NSTimeZone.m: Be consistent in usage of __WIN32__ and __MINGW__ 2005-10-09 Richard Frith-Macdonald * Source/NSLog.m: We had complaints about the new code to log output to the windows event log on microsoft ... so this has been changed to be activated by the GSLogSyslog user default (as the windows event log is roughly analogous to syslog on unix) rather than being done by default. * Source/NSTimeZone.m: * Source/NSPathUtilities.m: Fix a few cases where 16bit chartacter strings were being used as 8bit under windows. 2005-10-07 Chris Vetter * Source/NSPropertyList.m: Remove bogus newline generated for BOOL. 2005-10-06 Adam Fedor * Source/NSPage.m: Add include for Cygwin (patch from Tom MacSween). 2005-10-04 Richard Frith-Macdonald * Source/GSTcpPort.m: * Source/NSCallBacks.m: * Source/NSMessagePort.m: * Source/NSMessagePortNameServer.m: * Source/NSSocketPort.m: * Source/win32/GSRunLoopCtxt.m: Attempt to deal with systems where sizeof(int) < sizeof(void*) 2005-10-01 David Ayers * Source/NSString: (dataUsingEncoding:allowLossyConversion:): Use buffer returned by NSZoneRealloc to create the data object. 2005-09-29 Richard Frith-Macdonald * Headers/Additions/GNUstepBase/unicode/gsm0338.h: Map unicode no-break-space character to gsm space rather than to gsm escape character. 2005-09-28 Richard Frith-Macdonald * Source/Additions/GSMime.m: (-convertToBinary, -convertToBase64) new convenience methods for making documents compact or 7bit safe. 2005-09-25 David Ayers * Testing/benchmark.m: Add some NSMapTable tests. 2005-09-23 Richard Frith-Macdonald * Source/Additions/GSMime.m: (-rawMimeData) tolerate nil content of document ... should produce output with empty body. 2005-09-18 Adam Fedor * Version 1.11.1 2005-09-17 Saso Kiselkov * Headers/Foundation/NSInvocation.h: * Source/NSInvocation.m: (-targetRetained, -retainArgumentsIncludingTarget:): Added new methods which allow target to be not retained when arguments are and to check whether it is retained or not (-retainsArguments code moved in -retainArgumentsIncludingTarged and simplified by removing a redundant nested branch statement). * Source/NSUndoManager.m (-forwardInvocation:, -registerUndoWithTarget:selector:object:): Fixed bug #14488 by relying on previous new methods to retain undo invocation (taking in account the fact arguments may have been released before it is called). Patch committed by Quentin Mathe. 2005-09-01 Adam Fedor * Source/NSSortDescriptor.m ([NSArray -sortedArrayUsingDescriptors:sortDescriptors]): Use makeImmutableCopyOnFail:. 2005-08-31 Adam Fedor * Source/GNUmakefile: Install NSSortDescriptor.h 2005-08-31 Richard Frith-Macdonald * Source/NSNumber.m: Improve poor hash function. * Source/NSConcreteNumber.m: Improve poor hash function. * Testing/benchmark.m: Add some NSNumber tests. 2005-08-30 Saso Kiselkov * Headers/Foundation/NSSortDescriptor.h, Source/NSSortDescriptor.m: New files * Headers/Foundation/Foundation.h, Source/GNUmakefile: Add them to list. 2005-08-25 Richard Frith-Macdonald * Source/NSCalendarDate.m: Fix bug subtracting minute interval. * SSL/GSSSLHandle.m: Put handle in non-blocking mode before call to SSL_accept() or SSL_connect() so that we can be interrupted if the remote end doesn't respond (older code can hang waiting for the remote end). 2005-08-22 Adam Fedor * Source/NSGeometry.m (NSStringFromPoint, NSStringFromRect, NSStringFromSize): Add spaces around '='. (Based on suggestion from Matthias Hengartner). 2005-08-12 Adam Fedor * configure.ac: Check if we can read the psinfo struct from /proc (Solaris). * config/procfs.m4: Add psinfo check * config/config.psinfo.c: New file. * Source/NSProcessInfo.m (+load): Read from psinfo if we can. (Based on patch #4234 from Jeremy Bettis, with some modifications). 2005-07-31 Richard Frith-Macdonald * Source/GNUmakefile: Pass GNUSTEP_FLATTENED as preprocessor definitions when building. * Source/NSPathUtilities.m: Use GNUSTEP_FLATTENED and other definitions to fix bug in returning paths for non-flattened systems (code was previously returneing flattened paths irrespective of whether the system was configured flattened or not). 2005-07-30 Jeremy Bettis * Source/NSData.m: Support write to file for windows9x users. 2005-07-27 Adam Fedor * Source/Makefile.postamble (Info-gnustep.plist): Depend on ../Version. 2005-07-24 Jeremy Bettis * Source/NSCalendarDate.m: Fix bug adding interval to date. * Source/NSDebug.m: Implemented _NSNewStringFromCString() for gdb. * Source/GSFormat.m: Fix %S format. * Source/NSObject.m: ([conformsToProtocol:]) return NO if passed nul. * Source/NSBundle.m: be more tolerant. * Source/objc-load.m: Implemented objc_get_symbol_path() for windows. * Source/NSLog.m: On mingw write to debugger and event viewer. 2005-07-24 Richard Frith-Macdonald * Source/NSPathUtilities.m: Fix to avoid duplicate paths. Fix bug in order of application paths. * Tools/gspath.m: new utility to display paths/directories * Tools/gspath.1: man page for gspath * Tools/GNUmakefile: build and install gspath 2005-07-23 Richard Frith-Macdonald * Source/Additions/GSXML.m: fix typo in contributed code for when the additions library is built standalone on MacOS-X * Source/GNUmakefile: Don't build base subprojects when only building additions library! * Headers/Foundation/NSRunLoop.h: Tidy up enumerated type, simplifying mingw ifdefs * Tools/AGSHtml.h: Added defines for building without the gnustep base library. * Tools/gdnc.m: Fix minor documentation error. * Tools/gdnc.1: Fix minor documentation error and add documentation of flags to set public/network servers running. 2005-07-22 Richard Frith-Macdonald * Source/NSDate.m: ([isEqual:]),([isEqualToDate:]) change behavior to match current MacOS-X rather than OpenStep spec, as the old version was confusing and prevented dates being used as dictionary keys or stored in sets properly. 2005-07-21 Adam Fedor * Version 1.11.0 2005-07-18 Richard Frith-Macdonald * Source/NSUnarchiver.m: * Source/NSPortCoder.m: Relax checking of decoded types information to allow int/long/longlong types to be decoded using 'i/l/q' interchangably and 'I/L'Q' interchangably because the compiler may use different encodings on different machines. 2005-07-15 Adam Fedor * ChangeLog, ChangeLog.1, ChangeLog.2, GNUmakefile, Makefile, Makefile.postamble, config.mak.in, configure.ac, Documentation/Base.gsdoc, Documentation/BaseAdditions.gsdoc, Documentation/Functions.gsdoc, Documentation/GNUmakefile, Documentation/Makefile.postamble, Documentation/ReleaseNotes.gsdoc, Documentation/TypesAndConstants.gsdoc, Documentation/announce.texi, Documentation/gnustep-base.texi, Documentation/install.texi, Documentation/news.texi, Documentation/readme.texi, Documentation/General/Debugging.gsdoc, Documentation/General/GNUmakefile, Documentation/General/OpenStepCompliance.gsdoc, Documentation/HtmlNav/docs-web.html, Documentation/HtmlNav/index.html, Documentation/manual/GNUmakefile, Documentation/manual/index.html, Examples/GNUmakefile, Examples/Makefile.postamble, Examples/Makefile.preamble, Examples/custom-zone.m, Examples/dictionary.m, Headers/Additions/GNUstepBase/unicode/*, Source/dld-load.h, Source/hpux-load.h, Source/null-load.h, Source/simple-load.h, Source/win32-load.h, Testing/*, Tools/BaseTools.gsdoc, Tools/DocMakefile, Tools/GNUmakefile, Tools/Makefile.postamble, Tools/Makefile.preamble, Tools/autogsdoc.1, Tools/cvtenc.1, Tools/defaults.1, Tools/gdnc.1, Tools/gdnc.h, Tools/gdomap.c, Tools/gdomap.gsdoc, Tools/gsdoc.gsdoc, Tools/pl.m, Tools/pldes.1, Tools/sfparse.1, Tools/xmlparse.1, Tools/make_strings/GNUmakefile, Tools/make_strings/GNUmakefile.preamble, Tools/make_strings/README, Tools/make_strings/Using.txt, config/*: Further copyright/license updates. 2005-07-15 Richard Frith-Macdonald * Source/NSProcessInfo.m: ([+initialize]) always check to see if things have already been initialised before doing the initialisation here. Based on suggestion by Lloyd Dupont. 2005-07-14 Richard Frith-Macdonald * SSL/GSSSLHandle.m: Retains self when running runloop to allow ssl connect and accept operations. If the connect/accept takes a long time, the caller might give up and release the handle, causing resources to be freed and the ssl operation to crash. Retaining self (and noticing when a disconnect has taken place) prevents that. * Source/Additions/GSXML.m: Fix bug escaping emtities in fault message. 2005-07-13 Nicola Pero * Source/NSBundle.m: When building paths inside framework directories on Mingw (win32), don't add /Versions/%@; the new pseudo-framework support for Mingw does not support framework versioning. 2005-07-12 Nicola Pero * Source/NSBundle.m ([+_addFrameworkFromClass:]), ([-executablePath]): Mangle/demangle framework names so that we can support '-' (and '+') in framework names. Requires latest gnustep-make if you have a framework with '_', '-' or '+' in the name. 2005-07-08 Adam Fedor * Testing/GNUmakefile, Testing/nsfilehandle.m: Minor fixes. 2005-07-08 Richard Frith-Macdonald * Source/objc-load.m: Under mingw print filenames for debug using %S rather than %s 2005-07-08 Richard Frith-Macdonald Recommit all gcc-4 changes ... I was unable to find a problem in them and have been running lots of stuff ok with them for several days now ... perhaps I made a mistake in thinking there was an issue. 2005-07-08 Richard Frith-Macdonald * Source/NSTask.m: Fix bug #13685 ... raise exception on an attempt to re-launch a task. 2005-07-04 Adam Fedor * Documentation/ReleaseNotes.gsdoc: Update. 2005-07-01 Adam Fedor * Documentation/Base.gsdoc, Documentation/BaseAdditions.gsdoc, Documentation/Functions.gsdoc, Documentation/ReleaseNotes.gsdoc, Documentation/TypesAndConstants.gsdoc, Documentation/General/Debugging.gsdoc, Documentation/manual/GNUmakefile, Source/NSMessagePortNameServer.m, Testing/NSData-test.m, Testing/awake.m, Testing/basic.m, Testing/coder.m, Testing/containers.m, Testing/fref.m, Testing/gstcpport-client.m, Testing/gstcpport-server.m, Testing/heap.m, Testing/nsarchiver.m, Testing/nsarray.m, Testing/nscharacterset.m, Testing/nsconnection.m, Testing/nsconnection_client.m, Testing/nsconnection_server.m, Testing/nsdata.m, Testing/nsdate.m, Testing/nsdictionary.m, Testing/nsfilehandle.m, Testing/nsfilemanager.m, Testing/nshashtable.m, Testing/nshost.m, Testing/nsindexset.m, Testing/nsinvocation.m, Testing/nsmaptable.m, Testing/nsnotification.m, Testing/nspathutilities.m, Testing/nsprocessinfo.m, Testing/nsscanner.m, Testing/nsset.m, Testing/nstask.m, Testing/nstimer.m, Testing/nstimezone.m, Testing/nsundomanager.m, Testing/nsxmlparser.m, Testing/nxst.m, Testing/oldserver.h, Testing/prepend.m, Testing/randoms.m, Testing/release.m, Testing/server.h, Testing/string.m, Testing/tcpport-client.m, Testing/tcpport-server.m, Testing/thread-except.m, Testing/thread.m, Testing/values.m, Testing/wgetopt.h, Tools/BaseTools.gsdoc, Tools/autogsdoc.1, Tools/cvtenc.1, Tools/defaults.1, Tools/gdnc.1, Tools/gdomap.8, Tools/gsdoc.7, Tools/locale_alias.m, Tools/pldes.1, Tools/plist-0_9.dtd, Tools/sfparse.1, Tools/xmlparse.1: Add/fix copyright/licenses. 2005-07-01 Richard Frith-Macdonald * Bad day ... accidentally updated makefiles to build KVO stuff in last change ... so I might as well commit the partial implementation of NSKeyValueObserving.[hm] 2005-07-01 Richard Frith-Macdonald * The last change passed regression tests etc, but one program I have has stopped working, so there is a bug somewhere. Reverted change until I can isolate the problem and fix it. 2005-07-01 Richard Frith-Macdonald * Headers/Foundation/NSUserDefaults.h: Fix bad return type * Source/GSArray.m: * Source/GSCountedSet.m: * Source/GSFileHandle.m: * Source/GSSet.m: * Source/GSString.m: * Source/GSeq.h: * Source/NSArchiver.m: * Source/NSArray.m: * Source/NSAttributedString.m: * Source/NSCalendarDate.m: * Source/NSCharacterSet.m: * Source/NSConnection.m: * Source/NSCountedSet.m: * Source/NSData.m: * Source/NSDictionary.m: * Source/NSDistributedNotificationCenter.m: * Source/NSFileManager.m: * Source/NSMessagePort.m: * Source/NSMessagePortNameServer.m: * Source/NSMethodSignature.m: * Source/NSNotification.m: * Source/NSObject.m: * Source/NSPipe.m: * Source/NSPortCoder.m: * Source/NSPropertyList.m: * Source/NSRange.m: * Source/NSScanner.m: * Source/NSSerializer.m: * Source/NSSet.m: * Source/NSSocketPort.m: * Source/NSSocketPortNameServer.m: * Source/NSString.m: * Source/NSThread.m: * Source/NSTimeZone.m: * Source/NSTimer.m: * Source/NSURLHandle.m: * Source/NSUnarchiver.m: * Source/NSUserDefaults.m: * Source/NSValue.m: * Source/mframe.m: * Source/Additions/GSCategories.m: * Source/Additions/GSMime.m: * Source/Additions/GSObjCRuntime.m: * Source/Additions/GSXML.m: * Source/Additions/Unicode.m: * Tools/AGSHtml.m: * Tools/AGSIndex.m: * Tools/AGSOutput.m: * Tools/gdomap.c: * Tools/gdomap.h: * Tools/make_strings/make_strings.m: Tweaks to avoid compiler warnings with gcc-4. Mostly signed pointer casts and bogus interface declarations to allow +class to be called on a class for which we don't have the real interface visible. 2005-07-01 Richard Frith-Macdonald * Source/NSException.m: ([-raise]) Fix behavior to be the same as in MacOS-X (ie call the default uncaught exception handler after whatever handler is set, in case the set handler does not terminate). Ensures that the -raise method cannot return. * Testing/basic.m: Add test for uncaught exception handler. 2005-06-30 Richard Frith-Macdonald * Source/NSSerializer.m: deserializeFromInfo() check that cross reference indices are valid and raise an exception if not ... should fix bug reported by Roland Schwingel, where trying to deserialize a corrupt file could cause a crash. 2005-06-28 Adam Fedor * Source/NSInvocation.m (-getReturnValue:, -setReturnValue:): Only muck with size of buffer if we're using (deprecated) mframe. 2005-06-27 Richard Frith-Macdonald * Source/NSKeyedArchiver.m: Fix typo ... superClass should be superclass 2005-06-25 Richard Frith-Macdonald * Source/GSHTTPURLHandle.m: Preserve case of http headers when writing remote request, so that they can be tailored for remote servers which are buggy in having case sensitivity. When creating default http headers, capitalize the words in the header name, as this is the most common way headers are presented and documented, and thus the least likely to tickle case sensitivity bugs at the remote end of a connection. 2005-06-23 Adam Fedor * Source/mframe.m (mframe_decode_return): Change return struct to fixed size to avoid gcc bug. 2005-06-23 Richard Frith-Macdonald * Headers/Foundation/NSObject.h: * Documentation/coding-standards.texi: Minor documentation fixes. 2005-06-22 Richard Frith-Macdonald * Source/NSKeyValueCoding.m: * Headers/Foundation/NSKeyValueCoding.h: Change NSUnknownKeyException to NSUndefinedKeyException for MacOSX compatibility. Fixes bug #13842 2005-06-21 Richard Frith-Macdonald * Source/NSBundle.m: ([-initWithPath:]) expand paths with tildes. 2005-06-17 Richard Frith-Macdonald * Source/NSConnection.m: Removed bogus NSConnection(ConnectionDelegate) category .. these methods must not be implemented in NSObject. I hope that removing the concrete implementation of the category from the Object class will not cause problems (I believe there used to be problems with older versions of the compiler if we tried to use @selector(NN) where NN was not implemented in the same code unit, but I can't remember what the problems were and when they occurred). * Headers/Foundation/NSConnection.h: Added comments/documentation from NSConnection.h 2005-06-17 Adam Fedor * Remove objc/Protocol.h include from NSObject to avoid warnings with conflicting method signatures. * Headers/Foundation/NSConnection.h: Change Object categories to NSObject. * Source/NSConnection.m: Idem. * Headers/Foundation/NSObject.h: Don't include objc/Protocol.h add a few missing things. * Source/NSDate.m ([NSDate -isEqual:]): Use isKindOfClass. * Source/NSDistantObject.m, Source/NSProtocolChecker.m: Include objc/Protocol.h * Source/NSSerializer.m: Add method sig for performv:: 2005-06-15 Richard Frith-Macdonald * Documentation/manual/WorkingWithObjects.texi: Correct errors in the summary of memory management conventions. * Documentation/manual/WritingNewClasses.texi: Correct examples of memory management in constructor methods. 2005-06-15 Richard Frith-Macdonald * Source/GSFileHandle.m: * Source/NSSocketPort.m: * Source/NSMessagePort.m: Enable KEEPALIVE on stream sockets, so we will notice if the remote end drops the connection. 2005-06-08 Richard Frith-Macdonald * Source/NSCalendardate.m: Fix crash when a nil string is passed to initWithString... methods. 2005-06-06 Adam Fedor * Source/Makefile.preamble: Add objc lib on all platforms Fixes bug #9920. 2005-06-05 Richard Frith-Macdonald * Headers/Foundation/NSObject.h: Add a versioning constant and document a bit better. * Tools/AGSParser.m: Support new version constant and fix version comparison for minor and subminor numbers. * Tools/AGSHtml.m: ditto * Headers/Foundation/NSArchiver.h: convert o new versioning as test. * Documentation/Base.gsdoc: Document version constants. 2005-06-04 Richard Frith-Macdonald * Headers/Foundation/NSObject.h: Add subminor number to versioning macros as apple sometimes add/remove things at subminor versions. Add some constants for versions. * Tools/AGSParser.m: Support subminor version info * Tools/AGSHtml.m: ditto 2005-06-04 Richard Frith-Macdonald * Headers/Foundation/NSFileManager.h: hide private method in enumerator, swap one ivar for a new one keeping size the same. * Headers/Foundation/NSString.h: Mark some deprecated methods. * Source/GSFileHandle.m: Merge in win32 simplifications * Source/NSBundle.m: ditto * Source/NSData.m: ditto * Source/NSFileManager.m: ditto * Source/NSPathUtilities.m: ditto * Source/NSProcessInfo.m: ditto * Source/NSString.m: ditto * Source/NSTask.m: ditto * Source/win32-load.h: ditto Merge in simplifications from the win32 path handling branch and all changes/fixes since. 2005-06-04 Richard Frith-Macdonald * Source/GSFileHandle.m: * Source/NSFileManager.m: Define _FILE_OFFSET_BITS to be 64 so that, on unix-like systems which support large file handling (>2GB) the large file handling routines are used. * Source/NSTask.m: Try to deal with pipes properly when launching under windows. * Source/GSString.m: Fix bug returning unicode string from cString. 2005-05-21 Adam Fedor * Update FSF Address. 2005-05-20 Matt Rice * Source/NSArray.m (NSArray -removeObject:): Fix macro conditional so we release the object. 2005-05-15 19:57 Gregory John Casamento * Source/NSPropertyList.m: Changes to include limits.h rather than explicitly define UINT_MAX. 2005-05-13 Richard Frith-Macdonald * Source/GSHTTPURLHandle.m: Minor improvement to detail of failure reason. 2005-05-11 Richard Frith-Macdonald * Source/GSFileHandle.m: Increase size of buffer for incoming data ... on modern systems we have more memory and a bugger buffer can make a significant performance improvement when reading large amounts of streamed data. New define of READ_SIZE for this buffer ... easily adjusted in one place. 2005-05-10 Sheldon Gill * Resources/GNUmakefile * Resources/Languages/Locale.aliases * Resources/Spanish * Resources/Spanish.lproj/Localizable.strings Spanish language localisation from diemyr@yahoo.es 2005-05-10 Richard Frith-Macdonald * Tools/AGSHtml.h: * Tools/AGSHtml.m: * Tools/AGSParser.m: * Tools/gsdoc-1_0_2.dtd: Support deprecation version as well as addition/removal. 2005-05-09 David Ayers * Source/NSPropertyList.m (OAppend): Revert patch from 2005-02-28. It seems to fix the issue in the wrong place. Further investigation is necessary. 2005-05-09 Richard Frith-Macdonald * Tools/AGSHtml.m: Output 'Releases' rather than 'Standards' as it seems a better term for API version information. * Tools/AGSParser.h: * Tools/AGSParser.m: Parse OS_API_VERSION() and GS_API_VERSION() to produce detailed version information. * Headers/Foundation/NSObject.h: defines of the two version macros for proof of concept. 2005-05-08 Richard Frith-Macdonald * Tools/AGSHtml.h: Support versioning info instead of standards * Tools/AGSHtml.m: ditto * Tools/AGSOutput.m: ditto * Tools/AGSParser.m: ditto * Tools/GNUmakefile: Add new dtd and remove old tool. * Tools/autogsdoc.m: ditto * Tools/gsdoc-1_0_2.dtd: ditto * Tools/gsdoc.m: Remove obsolete tool. * Tools/gsdoc.gsdoc: Updated Changes to support OpenStep/OPENSTEP/MacOS-X versioning and GNUstep versioning, using add/rem attributes to specify the version at which a feature was added to or removed from the API. Drop the old 'standards' mechanism which was too rigid for detailed versioning. 2005-05-08 14:11 Gregory John Casamento * Source/NSPropertyList.m: Corrected setup so that compilation works on Solaris 9. 2005-05-08 Richard Frith-Macdonald * Source/NSString.m: nul terminate properly when a returned 'C string' is actually unicode. * Source/GSString.m: ditto. 2005-05-08 Fred Kiefer * Source/NSPropertyList.m: Added class BinaryPLGenerator to export property lists in Apple binary format. (+ dataFromPropertyList:format:errorDescription:) Use this new class. (+ propertyList:isValidForFormat:) Report NSPropertyListBinaryFormat_v1_0 as a supported format. (GSBinaryPLParser -initWithData:mutability:) Read table start correctly. (GSBinaryPLParser -objectAtIndex:) Better support for numbers. 2005-05-07 Richard Frith-Macdonald * Source/Additions/GSMime.m: Improve handling of text/xml without a charset. Add new method to determine the correct charset in the case where it has to be inferred from the actual data. Follow the instructions in http://www.w3.org/TR/REC-xml/ but be a bit more tolerant. (ebcdic not supported). * Headers/Foundation/GSString.m: Add a few new methods from macosx. * Source/NSString.m: ditto. * Source/GSString.m: ditto. 2005-05-04 Richard Frith-Macdonald * Source/Additions/GSMime.m: If given content of type text/xml without a charset, try to get the charset from the encoding="..." part of the header. 2005-04-29 Richard Frith-Macdonald * Source/GSHTTPURLHandle.m: Remove self as an observer of our file handle on deallocation ... prevent notfications being sent to deallocated object. 2005-04-28 Richard Frith-Macdonald * Documentation/coding-standards.texi: Added what appear to be the generally accepted parts of Sheldon's suggested coding standards additions. * Source/GSHTTPURLHandle.m: Modified to keep watching idle connections and handle things properly when the remote end drops the connection. Should fix occasional trouble when connectioin keepalive is used but the remote host drops the connection between requests. 2005-04-26 Richard Frith-Macdonald * Source/GSHTTPURLHandle.m: remove wProperties and wData from handle in sync. 2005-04-25 Richard Frith-Macdonald * Tools/defaults.m: Fix bug writing defaults whose values should be quoted strings. 2005-04-23 Richard Frith-Macdonald * Source/NSData.m: Fix bug in memory management when serializing an object over 65K in length. 2005-04-20 Richard Frith-Macdonald * Source/NSConnection.m: * Source/NSDistributedNotificationCenter.m: * Tools/gdnc.m: mingw tweaks 2005-04-19 Adam Fedor * Tools/gdomap.c (init_iface): Round size to make sure we don't violate pointer alignment boundaries. 2005-04-14 Richard Frith-Macdonald * Source/Additions/GSMime.m: Add tweak to cope with buggy mailers which insert space after the boundary in a multipart document. 2005-04-13 Adam Fedor * ANNOUNCE, NEWS, Documentation/news.texi, Documentation/ReleaseNotes.gsdoc: Merge in release info from 1.10.3 release branch. 2005-04-12 Richard Frith-Macdonald * Headers/Foundation/NSDistributedNotificationCenter.h: Added GSPublicNotificationCenterType and changed documentation for NSLocalNotificationCenterType to say it's private to the current user. * Source/NSDistributedNotificationCenter.m: Changed so that NSLocalNotificationCenterType is MacOS-X compatible and the new GSPublicNotificationCenterType works like our old implementation. * Source/NSPortNameServer.m: Add detailed message about forthcoming change to make the default port name server deal with message ports rather than socket ports ... for MacOS-X compatibility and security. * Source/externs.m: Added GSPublicNotificationCenterType * Tools/gdnc.m: Changes for new NSDistributedNotificationCenter behavior. Overview ... updated distributed notifications to be private to the owner of the processes by default. Added one-time warning message for developers that NSConnection will be changing the same way. These changes discussed a year or two ago (mostly with Alexander), but nobody ever actually implemented them. * Source/NSPathUtilities.m: Make temporary directory name based on uid so that it is consistent on a unix system where there are multiple named accounts with the same user id (essentially all aliases for a single account). 2005-04-05 Adam Fedor * gnustep-base.spec.in: Update make dependancy 2005-04-05 Richard Frith-Macdonald * Source/NSString.m: ([sttringByAppendingPathComponent:]) Fix bug eliding multiple slashes in path. 2005-04-02 Richard Frith-Macdonald * Source/NSTask.m: Fix missing nul terminator to arguments under win32 2005-04-01 Richard Frith-Macdonald * Source/NSBundle.m: Minor debug/warning log tweaks. * Headers/Foundation/NSBundle.h: Document differences between GNUstep and MacOS-X when initialising using a relative path. * Headers/NSString.h: Fix typo in comment. 2005-03-31 Adam Fedor * ANNOUNCE, NEWS, Documentation/news.texi, Documentation/ReleaseNotes.gsdoc: Merge in release info from 1.10.2 release branch. 2005-03-31 Adam Fedor * Source/NSBundle.m (_find_framework): New function. ([NSBundle +_addFrameworkFromClass:]): Use it. Based on patch from Sheldon Gill. 2005-03-31 Richard Frith-Macdonald * Source/NSString.m: (isAbsolutePath) always treat a path beginning with '/' as absolute except when in windows mode or on windows and not in unix mode. Treat all UNC paths as absolute ... a change made after a lot of trawling the web and looking at examples of UNC path usage. 2005-03-23 Richard Frith-Macdonald * config/pathxml.m4: Fix to get --with-xml-prefix= to work for xml2-config * configure: regenerated 2005-03-22 Richard Frith-Macdonald * Source/Additions/GSMime.m: Fix some charset-encoding mappings. Add utf-7 and utf-16. Add all aliases for ascii and latin1 Document mapping methods better. 2005-03-21 Richard Frith-Macdonald * Headers/Foundation/NSFileManager.h: Add path handling documentation. * Headers/Foundation/NSString.h: Add path handling methods documentation and new method to set global path handling mode. * Source/NSUserDefaults.m: Update path handling mode when defaults are read in. * Source/NSString.m: Implement selectable path handling mode ... gnustep/unix/windows. In the default gnustep mode we try to handle paths in any format and just do the right thing. Also updated handling of path extensions to match MacOSX behavior. * Source/Additions/GSMime.m: Remove deprecated method. Optimise a little by avoiding class lookups. 2005-03-18 Richard Frith-Macdonald * Source/NSPathUtilities.m: Use fprintf rather than NSLog to try to avoid possible recursion when errors occur. 2005-03-17 Richard Frith-Macdonald * Source/NSPathUtilities.m: Tidy variable and function names to fit GNUstep conventions. Simplify code a little. Don't attempt to parse per-user config file if its name is nil or empty string. Support parsing old config options for backward compatibility. 2005-03-15 Richard Frith-Macdonald * Source/Additions/GSMime.m: Ensure last line of base64 encoded data is terminated with crlf for clients which have buggy base64 decodedrs. 2005-03-15 Richard Frith-Macdonald * Source/Additions/GSMime.m: Mark ([setDefaultEncoding:]) as deprecated rather than just removing it ... in case someone has started using it. * Source/NSPathUtilities.m: Tidied a little ... moved a function. * Headers/Additions/GNUstepBase/GSFunctions.h: New header for functions * Headers/Foundation/NSPathUtilities.h: Moved function * Source/DocMakefile: Include GSFunctions.h * Source/GNUmakefile: ditto * Source/Additions/GNUmakefile: Build GSFunctions.m * Source/Additions/GSFunctions.m: New file for extra functions. * Source/NSString.m: ([stringByExpandingTildeInPath]) Improve handling of paths containing mingw drives. * Source/NSDate.m: Use same values for distant past/future as MacOSX * Source/NSCalendarDate.m: Support output of extreme year values. 2005-03-14 Adam Fedor * Continuation of NSPathUtilities patches * configure.ac: Add config-file option * Headers/Foundation/NSPathUtilities.h: Add GSFindNamedFile, more NSSearchPathDirectory enums. * Source/GNUmakefile: Don't install Win32 headers. * Source/NSPathUtilities.m (InitializePathUtilities, ...): Add support for reading standard path locations from a configuration file. Various support functions added/removed to fit. (GSFindNamedFile): New function. (GSSetUserName): Do nothing if the user is the same. (NSHomeDirectoryForUser): Use Windows utilities to get user name (on Windows, of course). (NSFullUserName): Default to NSUserName on Windows. (GSSystemRootDirectory): Mark as deprecated. (GSDefaultsRootForUser): Correctly return the actual defaults directory, not the user directory. (GSStandardPathPrefixes): Mark as deprecated. (NSSearchPathForDirectoriesInDomains): Add platform paths and additional search directories. * Source/NSUserDefaults (pathForUser): Correct use of GSDefaultsRootForUser. Remove obsolete path checking and defaults location checking. (Patches from Sheldon Gill with some modifications). * Documentation/Base.gsdoc: Update documentation. * Headers/Additions/GNUstepBase/Win32_Utilities.h, Source/win32/Win32_Utilities.m: Fix function arguments. 2005-03-12 Sungjin Chun * Source/Additions/GSXML.m: Port to MacOS-X 2005-03-11 Richard Frith-Macdonald * Source/NSPropertyList.m: Handle null object passed to OAppend() * Source/Additions/GSMime.m: Optimise setDefaultCharset: a little Add error checking to setDefaultEncoding: to make sure it sets a valid characterset encoding. Should almost certainly remove this method though ... as it duplicates setDefaultCharset: functionality in a somewhat less useful form. 2005-03-11 David Wetzel * Source/Additions/GSMime.m: * Headers/Additions/GNUstepBase/GSMime.h Added setDefaultEncoding: This is needed in GSWeb if you use utf-8 and faster than using a String as encoding name. 2005-03-09 Richard Frith-Macdonald * Source/NSCharacterSet.m: Fix bug in forming union ... was using wrong length. 2005-03-08 Richard Frith-Macdonald * Source/NSCharacterSetData.h: Add data outside unicode base plane. * Source/NSCharacterSet.m: Change to support all unicode characters rather than just UTF16. The current implementation is still based on (often much larger than before) bitmaps. It may be that the size of the bitmap data is too large for real world use, and we may have to introduce a different storage mechanism. The current mechanism is good for cases where the number of characters in the set is large and those characters are scattered, or where characters are only present in the base plane. Another implementation might be better for cases where characters are clustered into contiguous groups and the groups are scattered through the full range. 2005-03-07 Richard Frith-Macdonald * Headers/Additions/GNUstepBase/GSConfig.h.in: Extra types * configure.ac: Added types for GSConfig.h.in * configure: regenerated * Headers/Foundation/NSCharacterSet.h: New MacOS-X methods * Headers/Foundation/NSIndexSet.h: Remove bogus comment. * Source/GNUmakefile: Don't build NSBitmapCharSet.m * Source/NSBitmapCharSet.h: Removed ... merege into NSCharacterSet.m * Source/NSBitmapCharSet.m: ditto * Source/NSCharacterSet.m: Optimise a few methods. Add new MacOS-X methods (naive implementations) Merge in NSBitmapCharSet as private class 2005-03-06 Matt Rice * Headers/Foundation/NSRunLoop.h: Reorder RunLoopEventType for binary compatibility. 2005-03-06 Richard Frith-Macdonald * Headers/Foundation/NSCharacterSet.h: Add documentation and method ([-capitalizedLetterCharacterSet]) Change name of symbol set to match MacOS-X * Source/NSCharacterSet.m: Add new method and move documentation to header. Include local NSCharacterSetData.h for bitmap data. * Source/NSCharacterSetData.h: New file containing the bitmap data for the standard charactersets. Generated by dev-apps/charsets tools using the latest unicode characterset data today. * Source/NSCharacterSets/README.CharSet: mark as obsolete. * Source/GNUmakefile: No longer build/install NSCharacterSets The standard bitmap data for charactersets is now built in to NSCharacterSet. * Headers/Foundation/NSBitmapChar.h: Moved nonstandard header to private source directory. * Source/NSAutoreleasePool.m: Rewrite deallocation to cause the pool to remain as the current pool during the deallocation process ... Requires deallocation to be done in a loop to avoid possible leaks etc if an object which is being deallocated decides to autorelease something. Also removed a few private methods for simplification. 2005-03-04 Richard Frith-Macdonald * Source/Additions/GSXML.m: GSXMLRPC integrated. * Headers/Additions/GSUstepBase/GSXML.h: GSXMLRPC integrated. 2005-03-03 Adam Fedor * Source/NSFileManager.m (-createFileAtPath:...): Define var at beginning to work on gcc 2.x compilers. 2005-03-03 Adam Fedor * Start on integrating Sheldon Gills NSPathUtilities patches. * Headers/Foundation/NSPathUtilities.h: Depreciate GSSystemRootDirectory, GSStandardPathPrefixes. Add GSPreferencesDirectory to NSSearchPathDirectory enum. Enumerate NSSearchPathDomainMask values. * Headers/Additions/GNUStepBase/Win32Support.h, Headers/Additions/GNUStepBase/Win32_Utilites.h: New files. * Source/GNUmakefile: Add NSPathUtilities.m * Source/NSUser.m: Move everything in here... * Source/NSPathUtilities.m: to here. * Source/win32/GNUmakefile: Add Win32Support.m, Win32_Utilities.m * Source/win32Win32Support.m, Win32_Utilities.m: New files * Testing/nspathutilites.m: New file. (Files and patches from Sheldon Gill with minor modifications). 2005-03-02 Richard Frith-Macdonald * Headers/Foundation/NSKeyValueCoding.h: * Source/NSArray.m: * Source/NSKeyValueCoding.m: * Source/Additions/GSObjCRuntime.m: On the way back from FOSDEM I updated tje key-value-coding stuff to match the lastest version from Apple/MacOS-X panther. I don't use KVC in my code, and have not testcases for it, so would appreciate it if anyone who does could try this out and get bug reports back to me ASAP. 2005-03-01 Adam Fedor * Source/NSBundle.m (+gnustepBundle, +pathForGNUstepResource:ofType:inDirectory:]): Add deprecated log message. * Source/NSNotificationQueue.m, Source/null-load.h: Fix copyright message. 2005-03-01 02:50 Nicola Pero * Source/Makefile.preamble (ADDITIONAL_LIB_DIRS): When building a shared library, depend on all TARGET_SYSTEM_LIBS, not just CONFIG_SYSTEM_LIBS. * Headers/Additions/GNUstepBase/GSObjCRuntime.h: Do not use __declspec(dllexport) on mingw. Use extern instead. 2005-02-28 17:45 Richard Frith-Macdonald * NSCharacterSets/GNUmakefile: Use GNUSTEP_OBJ_DIR_NAME to run data conversion tool, since Tom Koelman points out that the 'obj' subdirectory does not work on windoze due to lack of symlinks. 2005-02-28 17:10 Richard Frith-Macdonald * Source/NSAutoreleasePool.m: * Source/NSCharacterSet.m: * Source/NSproxy.m: Damn ... when I ran the testsuite for the stuff I did at fosdem, it all worked ... but now I find that it was linking to an older version of the base library and actually the changes were broken. The new modifications should (hopefully) fix all breakage. The changes exposed rare bugs in the existing code ... NSCharacterSet was returning immutable copies of the standard character sets when it should return mutable ones, it was also being a bit bad about allocating new instances. NSProxy was failing to implement instanceMethodForSelector:, and NSAutoreleasePool had a bug which could mess up a bit if the objects being deallocated by it autoreleased anything. 2005-02-28 David Ayers * Source/NSPropertyList.m (OAppend): Attempt to transform description of non-proporty-list objects into property list before recursing for OPENSTEP compatibility. 2005-02-27 13:20 Richard Frith-Macdonald * Source/NSConnection.m: Set default timeouts to maximum timeouts for MacOS-X compatibility. 2005-02-27 08:45 Richard Frith-Macdonald * NSCharacterSets/dataToheader.c: new file to convert data files to constant values in a new header (NSCharacterSetData.h). * NSCharacterSets/GNUmakefile: build header from data files, and don't create resource set, since we no longer use the files at runtime. * Source/NSCharacterSet.m: include NSCharacterSetData.h and use it to create the standard charactersets rather than reading from data files. This has two advantages - It avoids the need to install characterset data files with the library, and it means that we have characterset data available immediately (before we need to access the filesystem) so we can use charactersets and NSString methods which depend upon them earlier on in the system initialisation. 2005-02-27 00:50 Richard Frith-Macdonald * Source/NSAutoreleasePool.m: ([-dealloc]) cache method implementations for release calls on the assumption that many of the objects in the pool will be of the same class. Optimisation suggested by Georg Wallmann 2005-02-23 Adam Fedor * configure.ac: Add test to check for poll emulation * Source/NSRunLoop.h: Don't use poll if we're just emulating. * Source/unix/GSRunLoopCtxt.m: Idem. 2005-02-23 14:00 Richard Frith-Macdonald * Headers/Additions/GNUstepBase/GSFileHandle.h: Add windows event * Headers/Foundation/NSPort.h: * Headers/Foundation/NSRunLoop.h: * Source/GNUmakefile: * Source/GSFileHandle.m: * Source/GSLocale.m: * Source/NSMessagePort.m: * Source/NSPipe.m: * Source/NSRunLoop.m: * Source/NSSocketPort.m: * Source/NSThread.m: * Source/NSUser.m: * Source/unix/GNUmakefile: * Source/unix/GSRunLoopCtxt.m: * Source/unix/GSRunLoopWatcher.m: * Source/unix/Makefile.preamble: * Source/win32/GNUmakefile: * Source/win32/GSRunLoopCtxt.m: * Source/win32/GSRunLoopWatcher.m: * Source/win32/Makefile.preamble: * Source/win32/NSRunLoopWin32.m: Applied patch by Luis Cabellos to use native win32 event handling rather than unix style select/poll on a win32 system. Rewrote various chunks to simplify, conform to coding standards, work for me etc. In particular, replaced code for thread synchronisation to use win32 Event rather than pipe. 2005-02-22 Adam Fedor * Branched freeze-1_10_2 for Version: 1.10.2 2005-02-22 14:00 Richard Frith-Macdonald * Documentation/Base.gsdoc: * Source/GSPrivate.h: * Source/NSDebug.m: * Source/NSLog.m: * Source/NSUserDefaults.m: Add GSLogThread to include thread id in NSLog() and debug output. * Source/NSMessagePort.m: * Source/NSSocketPort.m: Remove thread reporting in some debug statements as it can be done universally using GSLogThread. 2005-02-22 11:12 Richard Frith-Macdonald * Source/GSFFCallInvocation.m: * Source/GSFormat.m: * Source/GSString.m: * Source/GSTemplateValue.m: * Source/NSAutoreleasePool.m: * Source/NSData.m: * Source/NSDebug.m: * Source/NSDecimal.m: * Source/NSInvocation.m: * Source/NSMethodSignature.m: * Source/NSScanner.m: * Source/NSThread.m: * Source/NSTimeZone.m: * Source/NSUserDefaults.m: * Source/libgnustep-base-entry.m: * Source/thr-mach.m: * Source/thr-pthread.m: * Source/Additions/GSCategories.m: * Source/Additions/GSObjCRuntime.m: * Source/Additions/Unicode.m: * Source/Additions/behavior.m: Tidy up use of white space a little. 2005-02-21 20:30 Richard Frith-Macdonald * Source/GSFormat.m: Modified code to rewrite output to use correct decimal separator for locale (hopefully). Also made a small performance improvement in processing digits for output. 2005-02-21 14:30 Richard Frith-Macdonald * Source/GSFormat.m: * Source/NSConnection.m: * Source/callframe.m: * Source/cifframe.m: Include malloc.h for systems where it is needed for alloca() * Tools/gdomap.c: Avoid some warnings on mingw32 2005-02-21 14:10 Stefan Urbanek * Source/NSAttributedString.m: Fix loop decoding from archive. 2005-02-18 06:20 Richard Frith-Macdonald * Source/NSString.m: Tidy up some of last patch for unicode filesystem support. * Source/NSFileManager.m: Complete rewrite of unicode filesystem support to make code more readable and to allow it to easily be turned off by commenting out the 'UNICODE' and '_UNICODE' definitions at the start of the file. There is a bug in the mingw runtime which is (currently) still distributed in the 'current' complete mingw distribution ... which breaks unicode filesystem support very badly. So ... you can now either revert to 8bit charset filesystem support, or download a more recent version of the mingw runtime from the mingw site. * Source/NSTask.m: Fix setting environment for mingw ... use own method to get environment rather than examining instance variable, as the variable may not be set. Sort variables because windows needs them in alphabetical order. Fix conversion to unicode. 2005-02-16 14:40 Richard Frith-Macdonald * config/patchxml.m4: Try to detect libxml2 in standard directories exen if xml2-config is not present. * configure.ac: Detect libxml2 becore iconv, in case libxml2 requires iconv (which it usually will on a system where iconv is not built into the standard c library). * confingure: Regenerate * Source/Additions/GSXML.m: Set memory allocation functions to be used by libxml2, so we can use objc_free() to release strings returned by the library, and avoid linker problem with xmlFree() on mingw. 2005-02-15 08:00 Richard Frith-Macdonald * Source/NSTask.m: Fix incorrect version comitted. 2005-02-14 08:00 Richard Frith-Macdonald * Source/NSTask.m: Pass environment settings for mingw based on anonymous bug submission (bug #11360) * Source/NSUser.m: Fix bug #11378 * Tools/gdomap.c: Quote mingw arguments toi fix bug #11854 * Documentation/manual/Introduction.texi: Apply patch by pupeno (bug #11814) 2005-02-10 01:05 Alexander Malmberg * Tools/gdnc.m (main): Remove the program name from the arguments given to the new task. 2005-02-08 11:20 Richard Frith-Macdonald * Source/NSString.m: (unicodeString) rewrite to conform to coding standards and to be more efficient. 2005-02-08 10:10 Richard Frith-Macdonald * Tools/gdnc.m: Rewrite startup code to create a daemon using NSTask rather than calling fork()/spawn() etc. Make arguments more consistent with gpbs * Source/NSTask.m: Minor code layout/indentation tweaks. 2005-02-02 09:40 Richard Frith-Macdonald * Source/NSFileManager.m: Restructure last patch to conform to gnustep coding standards. (localFromOpenStepPath:) for unix paths, expand '~' abbreviations. 2005-01-31 Adam Fedor * Documentation/coding-standards.texi: Add section of documentation. 2005-01-29 03:46 Matt Rice * Source/NSUndoManager.m (-registerUndoWithTarget:selector:object:): Have the invocation to retain it's arguments. (Fixes bug #4692.) 2005-01-21 22:08 Gregory John Casamento * Source/NSUndoManager.m: [NSUndoManager redo] and [NSUndoManager undoNestedGroup] moved the call to actionName to a later point in both methods to get the name from the "groupToRedo" or the "groupToUndo" respectively. This corrects the issue with the wrong name sometimes appearing in the redo/undo menu items. 2005-01-16 07:59 Gregory John Casamento * Source/NSUndoManager.m: Added code to properly set the name of the action when undo/redo is called. 2005-01-16 06:37 Gregory John Casamento * Source/NSUndoManager.m: Check if the group is nil in endUndoGrouping before checking the count. 2005-01-15 06:17 Gregory John Casamento * Source/NSUndoManager.m: Undid previous change here. 2005-01-15 06:13 Gregory John Casamento * Source/NSUndoManager.m: Localized undo/redo menu title. 2005-01-14 06:50 Gregory John Casamento * Source/NSUndoManager.m: Correction for redo. 2005-01-14 05:43 Gregory John Casamento * Source/NSUndoManager.m: Fix forward invocation to not add a group when it doesn't contain any actions. 2005-01-08 Adam Fedor * Source/NSCalendarDate.m: fix time zone for %z format with only 2 digits in -initWithString:calendarFormat:locale: 2005-01-07 Adam Fedor * Source/NSTimeZone.m (+abbreviationDictionary): Retain dictionary (Fixes bug #11516). Copyright @copyright{} 2005 Free Software Foundation Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. gnustep-base-1.29.0/ChangeLog.1000066400000000000000000014774751435650067400161540ustar00rootroot00000000000000Wed Mar 11 17:11:23 1998 Adam Fedor * Version: Version 0.5.0; Wed Mar 11 11:02:49 1998 Scott Christley * doc/gnustep-howto.tmpl.texi: Update. * GNUstep-HOWTO: Regenerate. Tue Mar 10 9:40:00 1998 Richard Frith-Macdonald * Tools/gdomap.c: Changes to permit configuration of gdomap so that it probes a specific list of hosts rather than all hosts on the local net. Also permit compile-time override of port number. * Tools/gdomap.h: Added comments about overriding port used by gdomap. * src/TcpPort.m: (nameServer()) modified for easy compile-time override of port number used. Thu Mar 5 15:40:00 1998 Richard Frith-Macdonald * src/GNUmakefile: removed byte_order.h and added NSByteOrder.h * src/NSData.m: Changed all byte-ordering code to use new byte order functions described in the Rhapsody documentation. * src/NSSerializer.m: Removed unused include file. * src/include/NSByteOrder.h: Added this file containing all the byte-order management functions described in the Rhapsody docs. Wed Mar 4 21:06:00 1998 Richard Frith-Macdonald * src/NSConnection.m: Changed some objects to be OpenStep rather than old libobjects types. Using NSMutableArray rather than Queue for the message queues seems to fixes bug with queue corruption under heavy load. * src/NSHost.m: Added methods for archiving NSHost objects and sending them bycopy over DO at all times. * src/NSRunLoop.m: ([-runUntilDate:forMode:]) modified to exit promptly if there are no more input sources for the run loop. Mon Mar 2 10:04:57 1998 Adam Fedor * ANNOUNCE, NEWS, GNUstep-HOWTO: Update. * doc/faq.tmpl.texi, doc/gnustep-howto.tmpl.texi, doc/news.tmpl.texi: Likewise. * src/GNUmakefile (GENERATED_HAFILES): Add include/o_... Thu Feb 26 12:49:10 1998 Adam Fedor * configure.in: Use AC_CHECK_HEADERS instead of AC_CHECK_HEADER. * src/include/config.h.in: Regenerate. * doc/GNUmakefile (HTML_FILES): Add fac_toc.html * doc/Makefile.postamble: (fac_toc.html): New target. * src/include/NSDictionary.h: Add NSMutableCopying protocol (suggested by David Fritzsche ). Thu Feb 26 8:12:00 1998 Richard Frith-Macdonald * Tools/defaults.m: Removed autorelease debugging. * Tools/dread.m: Removed autorelease debugging. * Tools/dremove.m: Removed autorelease debugging. * Tools/dwrite.m: Removed autorelease debugging. * Tools/gdomap.m: Substantial rewrite with changes to the protocol for name servers to identify themselves to each other. Now handles subnet addressing within a class-c network. Now handles machines with multiple IP addresses more efficiently. Removes addresses from list of known servers after a period in which it fails to contect them. * Tools/gdomap.h: Changed comments to reflect protocol changes. * src/Coder.m: ([-initForReadingWithData:]) removed an inefficient hack for dealing with a problem that should never happen (init methid called on autoreleased object). * src/NSConnection.m: ([+newForInPort:outPort:cancestorConnection:), (-_handleRmc:) removed 'delay_dialog_interruptions' which could result in deadlock in three-way DO conversations. * src/NSPortCoder.m: ([-_doEncodeObject:]) changed so that a copy over-the-wire is a deep copy rather than a shallow one. I think this gives a more expected behaviour, though I don't know what OPENSTEP does. * src/include/NSConnection.h: Removed delay_dialog_interruptions. Sat Feb 14 16:03:07 1998 Scott Christley * configure.in: Check for sys/statvfs.h header file. * configure: Regenerate. * std/include/config.h.in: Regenerate. * src/NSFileManager.m: Include header files only if available. Sat Feb 14 15:50:40 1998 Adam Fedor * src/NXStringTable_scan.c src/lex.pl.m src/lex.sf.m src/proplist.tab.h src/proplist.tab.m src/stringsfile.tab.h src/stringsfile.tab.m: Add regenerated files to repository. Sat Feb 14 13:41:39 1998 Scott Christley * src/include/config.h.in: Create and add back into repository. Thu Feb 12 13:31:00 1998 Adam Fedor * src/NSDictionary.m ([-copy]): New method. Mon Feb 9 13:08:27 1998 Adam Fedor * AUTHORS, ANNOUNCE, README, INSTALL, STATUS, TODO: New files. * configure: Likewise. * +cronscript, +crontab, +patch.sh, Makefile.local, make-*, upload-dist: Removed non-dist files. * src/Makefile.local, src/Makefile.set.nt: Likewise. * GNUmakefile (DIST_FILES): Remove gcc diffs. * Makefile.postamble (regenerate): New target. (snapshot, dist): Update for cvs export. * NSCharacterSets/Makefile.postamble (regenerate): New target. * NSTimeZones/Makefile.postamble: Likewise * Tools/Makefile.postamble: Likewise. * admin/Makefile.postamble: Likewise * checks/Makefile.postamble: Likewise * doc/Makefile.postamble: Likewise * examples/Makefile.postamble: Likewise * src/Makefile.postamble: Likewise * src/NSUserDefaults ([-synchronize]): Check for defaultDatabase and create it it doesn't exist. * src/NSThread.m ([-currentThread]): Set thread data for new thread. * src/NSString.m ([-initWithContentsOfFile:]): Check for NULL data. Patches suggested by Ulrich Steinmetz * src/NSHost.m: Remove arpa/inet.h * src/TcpPort.m: Likewise. * src/UnixFileHandle.m: Likewise. patches from Paul Kunz Thu Feb 5 10:12:00 1998 Richard Frith-Macdonald * src/NSConcreteNumber.m: Defined preprocessor values to handle 'promotion' of numeric types and added private methods to support this. Modified ([-compare:]) to promote numeric values so that comparisons work as expected. Implemented ([-isEqualToNumber:]), Implemented ([-description]) and partially ([-descriptionWithLocale:]) Implemented ([-hash]) so that numbers which compare the same also has the same (so we can use NSNumbers as dictionary keys). * src/NSData.m: Added non-openstep method ([-relinquishAllocatedBytes]) to ask a data object to hand over it's malloced buffer. * src/NSNumber.m: Added initialisation methods specified in Rhapsody documentation. * src/NSString.m: ([-dataUsingEncoding:allowLossyConversion:]) made tiny change for efficiency - moving test outside loop - perhaps the compiler would have optimised it anyway. * src/Port.m: Modified initialisaers to test for failure to create NSData objects and return nil as appropriate. * src/TcpPort.m: ([+newForReceivingFromPortNumber:]) release newly created port before raising exceptions. In both ([-invalidate]) methods we remove the port from the various maps before doing anything else so that invalid ports can't be found by accident during the invalidation process. * src/UnixFileHandle.m: ([-readDataOfLength:]) fixed problem with data object causing read value to be overwritten with nuls. * src/include/NSData.h: Added ([-relinquishAllocatedBytes]) * src/NSValue.h: Added initialisation methods for NSNumber and ([-isEqualToNumber:]) method. Thu Feb 5 10:48:35 1998 Adam Fedor * GNUmakefile (GNUSTEP_MAKEFILES): New variable. Use it to include makefiles. * Likewise for all sub-directory GNUmakefile files. Mon Feb 2 10:11:20 1998 Adam Fedor * Version (GCC_VERSION): Change to 2.8.0 * gcc-2.7.2-objc.diff: Remove. * gcc-2.7.2.1-objc.diff: Likewise. * NSTimeZones/Makefile.postamble (after-install): Remove directories before (re-)installing. * checks/GNUmakefile: Include bundle.make. * checks/invocation2.m: New file. * doc/gnustep-howto.tmpl.texi: Make gcc2.8.0 supported compiler. * doc/news.tmpl.texi: Add recent changes. * src/NSFileManager.m: Include sys/statvfs for mips-sgi-irix6.2 * Tools/gdomap.c: Add IPPORT_USERRESERVED def for sgi. * src/TcpPort.m: Likewise. * src/UdpPort.m: Likewise. (patches from Mike Kienenberger ) Fri Jan 30 20:38:56 1998 Masatake Yamato * src/Invocation.m ([MethodInvocation -initWithTarget:selector:,...]): Add _C_CLASS, a CASE_TYPE to the switch-case labels. Implement default: in the switch-case. I used typeof, a gcc extension. * src/NSMethodSignature.m ([NSMethodSignature -argumentInfoAtIndex:]): Implemented. * src/include/NSInvocation.h (NS_INVOCATION, NS_MESSAGE): New macros. Mon Feb 2 12:54:00 1998 Richard Frith-Macdonald * Tools/defaults.m: Modified to make sure that defaults are all written correctly when reading multile defaults settings from stdin. * src/NSArray.m: Modified or rewrote almost all methods to use unsigned ints rather than ints and to avoid retain/release sequences for the sake of efficiency. Also rewrote property list and sorting methods for much greater efficieny. * src/NSData.m: (readContentsOfFile(NSString*, void**, unsigned*)) fixed bug leaving file open and modified to use ([NSString -fileSystemRepresentation]). Similarly modified ([-writeToFile:atomically;]) and ([-initWithContentsOfMappedFile:]). * src/NSDictionary.m: Modified ([-descriptionInStringsFileFormat]) and ([-descriptionWithLocale:indent:]) for better performance. * src/NSGArray.m: Added implementations of ([-getObjects:]) and ([-getObjects:range:]) so that it is possible to get high speed access to array contents. Added implementation of ([-sortUsingFunction:context:]) for faster sorting of array contents so that property descriptions are generated more quickly. * src/NSGCString.m: Modified various methods so that the _capacity instance variable has the space available for characters in the string without the terminator. Added ([-getCharacters:]) and ([-getCharacters:range:]) implementations. * src/NSGString.m: Modified various methods so that unicode strings are no longer nul terminated and the _capacity instance variable has the number of character spaces available in the string. Added ([-getCharacters:]) and ([-getCharacters:range:]) implementations. Added ([-replaceCharactersInRange:withString:]) implementation. * src/NSString.m: Fixed a few places where it was assumed that string buffers include space for a nul terminator. In ([-compare:options:range:]) made modifications so that literal comparisons now work correctly for ranges other than the entire string. Made some changes to avoid use of malloc/free sequences where not necessary. Made efficiency improvements to append methods. * src/NSUserDefaults.m: ([-initWithContentsOfFile:]) changed to take process name as being the last path component of the full process name. Also added code to retry a few times if the database is locked. * src/TcpPort.m: ([+newForSendingToSockaddr:withAcceptedSocket:pollingInPort:]) Vague attempt to make rapid shutdown/startup of DO more robust. * src/UnixFileHandle.m: (getAddr()) Fixed error in handling service names and permit nil service to mean 'any'. Also use ([NSString -fileSystemRepresentation]) as appropriate. * src/include/NSGArray.h: modified to contain same instance variables as the Array class so we can access them directly in NSGArray.m Mon Jan 26 09:10:39 1998 Adam Fedor * src/NSPage.m (NSRealMemoryAvailable): Add implementation for GNU/Linux (Patch from Matt Jenkins ). * src/Invocation.m (-setArgument:atIndex:): Make argument const. * src/NSInvocation.m (-methodSignature): Make my_sel_type const. Sat Jan 24 15:14:50 1998 Masatake Yamato * src/include/NSMethodSignature.h(-methodType): Declare new category NSMethodSignature(GNU). * src/Invocation.m ([MethodInvocation -setSelector:]): Add code to handle a case that sel_pointer is pointing NULL SEL value. This is far from perfect. Type checking is needed. * src/NSMethodSignature.m Add cpp directives to use `strrchr'. (rtn_type_is_oneway): New function for [NSMethodSignature -isOneway]. ([NSMethodSignature +signatureWithObjCTypes:]): Fix length of memory allocation for strings. Do not copy all the encoding string T to returnTypes. ([NSMethodSignature -isOneway]): Method implemented. ([NSMethodSignature(GNU) -methodType]): New category and method. This is not part of OpenStep spec. This method is used in NSInvocation.m. * src/NSInvocation.m ([NSInvocation +initialize]): Add MethodInvocation class instead of Invocation. ([NSInvocation -methodSignature]): Method implemented. ([NSInvocation +invocationWithMethodSignature:]): Invoke [NSMethodSignature -methodType] instead of [NSMethodSignature -methodReturnType]. Wed Jan 21 17:37:00 1998 Richard Frith-Macdonald * Tools/defaults.m: Fixed bug in handling 'write' operations reading info from stdin - now puts all values into the database correctly. * src/TcpPort.m: ([+newForReceivingFromPortNumber:]) added code to perform retries if the kernel freaks out when asked to select the port to bind to - this has happened to me on linux! Wed Jan 21 11:45:00 1998 Richard Frith-Macdonald * src/GetDefEncoding.m: Modified GetDefEncoding() to us the NSString method - ([+availableStringEncodings]) so we can make the _availableEncodings array local to NSString.m * src/NSString.m: Moved _availableEncodings here from NSString.h Added methods as specified in Rhapsody documentation - ([+pathWithComponents:]), ([-isAbsolutePath]), ([-pathComponents]), ([-stringsByAppendingPaths:]) * src/include/NSString.h: Moved _availableEncodings from here to NSString.m and added declarations for new methods - ([+pathWithComponents:]), ([-isAbsolutePath]), ([-pathComponents]), ([-stringsByAppendingPaths:]) Wed Jan 21 09:41:46 1998 Adam Fedor * src/Makefile.postamble: Change $(LEX) to $(FLEX) and $(YACC) to $(BISON). Add $(GNUSTEP_OBJC_DIR) to targets with ${OEXT}. Tue Jan 20 19:05:00 1998 Richard Frith-Macdonald * Tools/GNUmakefile: Added defaults.m * Tools/defaults.m: New file defaults.m - command line tool like the OPENSTEP defaults command. Renders dread, dwrite and dremove obsolete. * Tools/dread.m: Added -u flag and made numerous bug fixes. * Tools/dremove.m: Added -u flag and made numerous bug fixes. * Tools/dwrite.m: Added -u flag and made numerous bug fixes. * checks/GNUmakefile (TEST_TOOL_NAME): Add nstask. * checks/nsdate.m: Added some year-2000 tests. * checks/nstask.m: New file. * src/Dictionary.m: Removed ([-descriptionWithIndent:]) and the ([-description]) methods - no longer needed for property lists. * src/GNUmakefile: Added NSTask * src/GetDefEncoding.m: Fixed so that the encoding that is read from the environment is accepted. * src/Heap.m: Added implementation of ([-minObject]) to take advantage of the known ordering of a heap - fixes performance problem with large numbers of timers in NSRunLoop. * src/NSArray.m: Implemented many new methods for OPENSTEP - ([+arrayWithArray:]), ([+arrayWithContentsOfFile:]), ([+arrayWithObjects:count:]), ([-getObjects:]), ([-getObjects:range:]), ([-indexOfObjectIdenticalto:inRange:]), ([-indexOfObject:inRange:]), ([-makeObjectsPerformSelector:]), ([-makeObjectsPerformSelector:withObject:]), ([-sortedArrayHint]), ([-sortedArrayUsingFunction:context:hint:]), ([-pathsMatchingExtensions:]), ([-descriptionWithLocale:]), ([-descriptionWithLocale:indent:), ([-replaceObjectsInRange:withObjectsFromArray:]), ([-initWithContentsOfFile:]), ([-removeObject:inRange:]), ([-removeObjectIdenticalTo:inRange:]), ([-removeObjectsInRange:]) Modified ([-makeObjectsPerform:]) and ([-makeObjectsPerform:wihtObject:]) to iterate through array in reverse as specified in OPENSTEP docs. Removed obsolete method - ([-descriptionWithIndent:]) * src/NSArray.m: Implemented new methods for OPENSTEP - ([+dataWithData:]), ([-setData:]) Modified ([-description]) to give tidier output. * src/NSCalendarDate.m: Changed initialisation and creation methods to return type id as in the Rhapsody docs, also changed default format for description to use numeric timezone values as per Rhapsody docs. * src/NSData.m: Implemented new methods for OPENSTEP - ([+dataWithData:]), ([-setData:]) Modified ([-description]) to give tidier output. * NSDate.m: Changed initialisation and creation methods to return type id as in the Rhapsody docs. * src/NSDictionary.m: Implemented new methods for OPENSTEP - ([-keysSortedByValueUsingSelector:]), ([-objectsForKeys:notFoundMarker:]), ([-description]), ([-descriptionInStringsFileFormat]), ([-descriptionWithLocale:]), ([-descriptionWithLocale:indent:]), ([-setDictionary:]), * src/NSFileHandle.m: Added extensions for getting information about sockets used in file handles. * src/NSString.m: Removed ([-quotedCString]) and added new method ([-descriptionForPropertyList]) to do things more neatly. Fixed ([-initWithContentsOfFile:]) to avoid crash when given a bad file name. * src/NSTask.m: Added this OPENSTEP/Rhapsody class. * src/TcpPort.m: Added check for bad data arriving on descriptor in ([-_tryToGetPacketFromReadableFD:]) * src/UnixFileHandle.m: Added stuff for getting information about sockets used in file handles. * src/include/IndexedCollecting.h: Made 'IndexRange' a synonym for NSRange. * src/include/NSArray.h: Changes to reflect the changes in methods implemented in NSArray.m * src/include/NSData.h: Changes to reflect the changes in methods implemented in NSData.m * src/include/NSDate.h: Changed return tpes of initialisation methods to be (id) as in Rhapsody documentation. * src/include/NSDictionary.h: Changes to reflect the changes in methods implemented in NSData.m * src/include/NSFileHandle.h: Changes to reflect the changes in methods implemented in NSFileHandle.m * src/include/NSString.h: Changes to reflect the changes in methods implemented in NSString.m * src/NSTask.h: Added this OPENSTEP/Rhapsody class. * src/include/UnixFileHandle.h: Changes to reflect the changes in methods implemented in UnixFileHandle.m * src/proplist.y: Make parsing less strict - permit dictionaries with or without a semicolon after the last key-value pair. * src/stringsfile.y: Fixed bug in parser - it is legitimate to have a key-value pair without a value - in which case the '=' is omitted. Fri Jan 9 10:04:09 1998 Adam Fedor * Version: Release 0.4.0. Thu Jan 8 09:42:39 1998 Adam Fedor * doc/announce.tmpl.texi: Fixup variable definitions. * doc/news.tmpl.texi: Likewise. * doc/todo.tmpl.texi: Update. Sun Jan 4 13:26:03 1997 Stevo Crvenkovski * doc/news.tmpl.texi: Replace my old e-mail. * src/GNUmakefile : add GetDefEncoding.m and GetDefEncoding.h. * src/GetDefEncoding.m : new file. * src/NSGCString.m ([NSGCString -initWithCStringNoCopy:length:freeWhenDone:]): Move [super init] to the begining of code. * src/NSGCString.m ([NSGMutableCString initWithCapacity:]): Likewise. * src/NSGCString.m ([NSGMutableCString - initWithCStringNoCopy:length:freeWhenDone:]): Likewise. * src/NSGString.m ([NSGString - initWithCharactersNoCopy:length:freeWhenDone:]): Likewise. * src/NSGString.m ([NSGMutableString initWithCapacity:]): Likewise. * src/NSGSequence.m ([NSGSequence decompose]): Check for lenght>1: * src/NSString.m ([NSGString initialize]): Set _DefaultStringEncoding variable using GetDefEncoding(). * src/NSString.m initWithData:encoding:]) : Number of bug fixes. * src/NSString.m ([NSString initWithContentsOfFile:]) : Method rewriten. * src/NSString.m ([NSString hash]) : Method rewriten. * src/NSString.m ([NSString lineRangeForRange:]) : New OPENSTEP method implemented. * src/NSString.m ([NSString getLineStart:end:contentsEnd:forRange:]) : New OPENSTEP method implemented. * src/NSString.m ([NSString capitalizedString]) : Take care of white space characters properly. * src/NSString.m ([NSString defaultCStringEncoding]) : Changed to read new _DefaultStringEncoding variable. * src/NSString.m ([NSString availableStringEncodings]) : New OPENSTEP method implemented. * src/NSString.m ([NSString localizedNameOfStringEncoding]) : New OPENSTEP method implemented. * src/NSString.m ([NSString dataUsingEncoding:allowLossyConversion:}) : Number of bug fixes. * src/NSString.m ([NSString writeToFile:atomically:]) : Attempt to write in default c string encoding, if failed write in Unicode. * src/include/GetDefEncoding.h : New file. * src/include/NSString.h typedef enum _NSStringEncoding Changed to OPENSTEP spec. * src/include/NSString.h declare new OPENSTEP methods. Sat Jan 3 14:05:32 1998 Scott Christley * confdefs.h: Delete transient file. * src/include/Foundation.h: New file. * src/include/NSEnumerator.h: New file. * src/GNUmakefile: Install new header files. * src/include/NSUtilities.h: Move NSEnumerator interface to NSEnumerator.h file. * src/NSObject.m (-copyWithZone:): Eliminate semicolon. * Fix memory allocation function usage. (As reported by Matthias Klose ). * src/Connection.m (-_service_forwardForProxy:): Use function instead of function pointer. * src/Decoder.m (-decodeClass, -decodeSelectorWithName:): Likewise. * src/Invocation.m (-initWithReturnType:): Likewise. (-_initArgframeFrom:withType:retainArgs:): Likewise. (-_deallocArgFrame): Likewise. * src/NSAutoreleasePool.m (-reallyDealloc): Likewise. * src/NSConnection.m (-_service_forwardForProxy:): Likewise. * src/TextCStream.m (-decodeValueOfCType:at:withName:): Likewise. * src/include/objc-gnu2next.h (list_cons): Likewise. (list_remove_head, list_free): Likewise. * src/include/preface.h.in (OBJC_FREE): Likewise. Fri Jan 2 13:04:53 1998 Adam Fedor * doc/Makefile.postamble: Generate html,texi from tmpl.texi files. * doc/announce.tmpl.texi: Renamed from announce.texi * doc/faq.tmpl.texi: Likewise. * doc/gnustep-base.tmpl.texi: Likewise. * doc/gnustep-howto.tmpl.texi: Likewise. * doc/gnustep-zones.tmpl.texi: Likewise. * doc/coding-standards.tmpl.texi: Likewise. * doc/install.tmpl.texi: Likewise. * doc/manual.tmpl.texi: Likewise. * doc/news.tmpl.texi: Likewise. * doc/readme.tmpl.texi: Likewise. * doc/todo.tmpl.texi: Likewise. * NSZone.texi: Removed. * STATUS: removed. * MACHINES: removed. * doc/status.tmpl.texi: New file. Wed Dec 31 13:58:51 1997 Adam Fedor * STATUS: Updated status on a few classes. * doc/GNUmakefile (TOP_DOC_FILES): Add GNUstep-HOWTO. * doc/gnustep-howto.texi: Update documentation. * doc/gnustep-faq.texi: Likewise. * doc/install.texi: Likewise. * doc/readme.texi: Likewise. Mon Dec 29 09:16:34 1997 Adam Fedor * src/Random.m ([Random -randomFloatBetween:and:]): Add lowBound (Fix suggested by Masatake Yamato ). Fri Dec 26 10:25:00 1997 Richard Frith-Macdonald * src/NSCalendarDate.m: ([-dateByAddingYears:months:days:hours:minutes:seconds:]) Fixed bug in wrapping months when adding date to december. * src/NSUserDefaults.m: ([-__createArgumentDictionary]) Fixed to use command line args beginning with a dash as defaults keys. Retained old behaviour for -GS and --GS prefixes for backward compatibility. Fri Dec 19 13:09:28 1997 Adam Fedor * src/NSGeometry.m (NSPointFromString, NSSizeFromString, NSRectFromString): New functions. * src/include/NSGeometry.h: New function defs. * NSCTemplateValue.m (-description): Use them. Tue Dec 16 22:35:00 1997 Richard Frith-Macdonald * src/Decoder.m: Modified to use a single, class-wide dummy object as a placeholder in cross-reference tables. This gives a slight speed and memory usage improvement. * src/MemoryStream.m: Avoid using autorelease where possible in order to improve efficiency. * src/NSConnection.m: ([+rootProxyAtPort:]) modified to refrain from creating a new connection when we already have one for the given output port. * src/Random.m: ([-randomDie:]) Fixed to confirm to description in comments. * src/TcpPort.m: Changed size field in packets to be 4 bytes long rather than 2. This allows messages to be more than 64K bytes long and is essential for things like pasteboard operations. Thu Dec 18 16:17:22 1997 Yoo C. Chung * src/NSProcessInfo.m (_gnu_process_noobjc_args): Use malloc(). (_gnu_noobjc_free_vars): Use free(). Thu Dec 11 13:58:39 1997 Adam Fedor * configure.in: Remove unneeded tests. * GNUmakefile (SUBPROJECTS): Remove checks and examples. Tue Dec 9 17:47:21 1997 Yoo C. Chung * src/include/behavior.h: Include . * src/NSProcessInfo.m: Include . * src/NSPipe.m: Include . * src/NSPage.m: Include . * src/NSLog.m: Include . * src/NSHost.m: Include . * src/NSDistributedLock.m: Include . * src/NSDictionary.m: Include . * src/NSBundle.m ([NSBundle +_bundleResourcePathsWithRootPath:subPath:]): Removed unused variables. * src/NSArray.m: Include ([NSArrayNonCore -descriptionWithIndent:]): Changed argument to unsigned. * src/UnixFileHandle.m: Include and . * src/UdpPort.m: Include . * src/StdioStream.m: Include . * src/Coder.m: Include . * src/NSUser.m (NSHomeDirectoryForUser): Use objc_malloc(). * src/NSData.m ([NSDataMalloc -initWithCoder:]): Check malloc. ([NSMutableDataMalloc -initWithCoder:]): Likewise. * src/List.m: Removed unused macros. Sun Dec 7 23:22:07 1997 Stevo Crvenkovski * src/NSGCString.m ([NSGMutableCString -initWithCharactersNoCopy:length:freeWhenDone:]): Changed to invoke instance of NSGMutableString. * src/NSGString.m ([NSGMutableString -initWithCStringNoCopy:length:freeWhenDone:]): Changed to invoke instance of NSGMutableCString. * src/NSGString.m ([NSGMutableString -initWithCharactersNoCopy:length:freeWhenDone:]): Method implemented. Based on code by Richard Frith-Macdonald * src/NSGCString.m ([NSGMutableCString -initWithCStringNoCopy:length:freeWhenDone:]): Changed to fix memory leak in this method. Code by Richard Frith-Macdonald * src/NSGCString.m ([NSGCString -dealoc]): Changed to avoid compiler warning. * src/NSGCString.m ([NSGCString -initWithCStringNoCopy: length: freeWhenDone:]): Changed to conform with class cluster definition. * src/NSGString.m ([NSGString -initWithCharactersNoCopy: length: freeWhenDone:]): Idem. * src/NSGCString.m ([NSGMutableCString -initWithCapacity]): Idem. * src/NSString.m ([NSString -init]): Idem. * src/NSGCString.m ([NSGCString -init]): Method implemented to conform with class cluster definition. * src/NSGCString.m ([NSGMutableCString -init]): Idem. * src/NSGString.m ([NSGString -init]): Idem. * src/NSGString.m ([NSGMutableString -init]): Idem. * src/NSString.m ([NSString -replaceCharactersInRange: withString:]): Change to be subclass responsibillty. This should be pimitive method. * src/NSGString.m ([NSGString -replaceCharactersInRange: withString:]): Move implementation from NSString here. * src/NSGCString.m ([NSGCString -replaceCharactersInRange: withString:]): Idem. * src/NSString.m ([NSString +stringWithString]): New OPENSTEP method implemented. * src/NSString.m ([NSString -substringFromRange]): Method implemented * src/NSString.m ([NSString -substringWithRange]): New OPENSTEP method implemented. * src/NSString.m ([NSString -hash]): Remove C String implementation as Unicode implementation now works. * src/NSString.m ([NSString -getFileSystemRepresentation]) Correct name of method. * src/NSString.m ([NSString -_normalizedString]):Bug fixed. * src/NSString.m ([NSString -mutableCopy]): Implemented to avoid compiler warning. Why is this warning anyway? Method should be inherited from NSObject. * src/NSString.m ([NSString -deleteCharactersInRange:]): Method implemented. * src/NSString.m ([NSString -insertString: atIndex:]): Method implemented. * src/NSString.m ([NSString -setString:]): Method implemented. * src/NSString.h ([NSString +stringWithString:]): Method declared. * src/NSString.h ([NSString -substringWithRange:]): Method declared. Fri Nov 28 12:52:06 1997 Scott Christley * Tools/GNUmakefile (OBJC_PROGRAM_NAME): Reverse prior change. * Tools/Makefile.postamble (after-install): Install gdomap from the proper directory. * checks/nsattributesstring.m (NSFontAttributeName): New variable. (NSForegroundColorAttributeName): New variable. (NSBackgroundColorAttributeName): New variable. * src/GNUmakefile: Install headers in gnustep not gnustep/base. * src/Makefile.preamble (ADDITIONAL_INSTALL_DIRS): Likewise. * src/NSTimeZone.m (LOCALDBKEY, ZONES_DIR): Make NSStrings. (+getTimeZoneFile:): ZONES_DIR is NSString. * src/o_map.m (INLINE): Use macro so its easy to un-inline functions if debugging. Wed Nov 26 16:08:20 1997 Adam Fedor * Tools/GNUmakefile (OBJC-PROGRAM_NAME): Change from underscore. * checks/GNUmakefile: include new test-tool.make. * examples/GNUmakefile: Likewise. * src/Makefile.postamble (FORCE): New target. * src/ostream.m (_ostream_new_stream_struct): Use "r+" for append or read/write mode. Wed Nov 26 11:30:00 1997 Richard Frith-Macdonald * Tools/dwrite.m: Fix problem with uninitialised variable. * src/NSConnection.m: Added [+connectionByOutPort:] and [+connectionByInPort:OutPort:] methods to lookup connections for use by other barts of the DO system. Added [-_service_retain:] and [-retainTraget:] methods to handle special case of retaining of proxies. * src/NSDistantObject.m: ([+newWithCoder:]) modified to fix two problems to do with proxies passed in a triangle - 1. if passed a proxy to an object in a third server, use any existing connection to that third server if possible rather than creating a new connection. 2. if passed a proxy to an object in a third server, tell the third server to retain it's local object for us. * src/NSUserDefaults.m: various modifications to fix for getting the defaults for a user other than the logged in user - eg when a server process runs setuid to a particular user ID and wants to read the defaults for that user rather than the user who actually launched it. Also - added code to break the lock on the defaults database if it is more than five minutes old. * src/include/DistributedObjects.h: modifications for retaining objects. * src/include/NSPortCoder.h: removed unneccessary include. * src/include/NSUserDefaults.h: minor changes for coping with tasks runnning setuid to a user other than the person who launched them. Fri Nov 21 13:14:31 1997 Adam Fedor * src/NSAttributedString.m (-initWIthString:attributes:): Make designated initializer. * src/NSGAttributedString.m: (_initWithString): Save value of textChars. * src/include/NSAttributedString.h: Update comments, Remove attribute strings. Fixes submitted by . Tue Nov 18 14:13:13 1997 Adam Fedor * src/include/NSNotification.h: Correct placeholder size (bug submitted by Ville-Pertti Keinonen . Wed Nov 12 10:10:33 1997 Adam Fedor * src/NSString.m (-initWithFormat:args:): Print a "null string" when string in format is nil. * src/objc-load.c: Remove ifdef HAVE_CONFIG_H. * doc/gnustep-howto.texi: Update for new gdb patch file. Wed Nov 12 12:30:00 1997 Richard Frith-Macdonald * src/Collection.m: ([Enumerator -dealloc]) added call dealloction method in super class to fix memory leak. * src/KeyedCollection.m: Removed initialisation and deallocation methods for KeyEnumerator as these are done in its super class. * src/NSCharacterSet.m: ([-invertedSet:]) added autorelease for data object (created by mutableCopy) in order to fix memory leak. * src/NSData.m: Replaced line accidentally deleted in section only compiled in for systems without shared memory. Thu Nov 6 19:00:00 1997 Richard Frith-Macdonald * Tools/Makefile.postamble: Modified to install gdomap in cpu/os specific location. * src/Dictionary.m: ([-descriptionWithIndent:]) Modified to encode empty strings as "" so that ascii property lists work when a dictionary entry is empty. * src/NSArray.m: ([-descriptionWithIndent:]) Modified to encode empty strings as "" so that ascii property lists work when a string in the array is empty. * src/TcpPort.m: Modified in various places so that we look in the correct location for gdomap. Thu Nov 6 10:14:39 1997 Adam Fedor * src/GNUmakefile (DEFS): Remove PLATFORM_OS. * src/NSBundle.m: Change platform to gnustep_target_os. * src/ostream.m (ostream_getc, ostream_read, ostream_vscanf): Return EOF if stream_obj returned 0. * doc/gnustep-howto.texi: Use today's date. Wed Nov 5 16:10:32 1997 Scott Christley * src/Invocation.m (-setArgument:atIndex:): Add OpenStep method. * src/NSGSet.m (-member:): Delete method. * src/Set.m (-member:): New method. * src/NSMethodSignature.m (-methodReturnType): Return value. * configure.in: Remove check for threads library. * checks/heap.m: Don't prototype random. * Remove dependency upon config.h by headers files and include directly in source files because the config.h file is system dependent and should not be installed. * src/Archiver.m: Include config.h. * src/Array.m: Likewise. * src/Bag.m: Likewise. * src/BinaryCStream.m: Likewise. * src/BinaryTree.m: Likewise. * src/BinaryTreeNode.m: Likewise. * src/CStream.m: Likewise. * src/CircularArray.m: Likewise. * src/Coder.m: Likewise. * src/Collection.m: Likewise. * src/ConnectedCoder.m: Likewise. * src/Connection.m: Likewise. * src/Decoder.m: Likewise. * src/DelegatePool.m: Likewise. * src/Dictionary.m: Likewise. * src/Encoder.m: Likewise. * src/GapArray.m: Likewise. * src/HashTable.m: Likewise. * src/Heap.m: Likewise. * src/IndexedCollection.m: Likewise. * src/Invocation.m: Likewise. * src/KeyedCollection.m: Likewise. * src/LinkedList.m: Likewise. * src/LinkedListNode.m: Likewise. * src/List.m: Likewise. * src/Lock.m: Likewise. * src/MachPort.m: Likewise. * src/Magnitude.m: Likewise. * src/MallocAddress.m: Likewise. * src/MappedCollector.m: Likewise. * src/MemoryStream.m: Likewise. * src/NSAllocateObject.m: Likewise. * src/NSArchiver.m: Likewise. * src/NSArray.m: Likewise. * src/NSAssertionHandler.m: Likewise. * src/NSAttributedString.m: Likewise. * src/NSAutoreleasePool.m: Likewise. * src/NSBitmapCharSet.m: Likewise. * src/NSBundle.m: Likewise. * src/NSCTemplateValue.m: Likewise. * src/NSCalendarDate.m: Likewise. * src/NSCallBacks.m: Likewise. * src/NSCharacterSet.m: Likewise. * src/NSCoder.m: Likewise. * src/NSConcreteNumber.m: Likewise. * src/NSConcreteValue.m: Likewise. * src/NSConnection.m: Likewise. * src/NSCopyObject.m: Likewise. * src/NSCountedSet.m: Likewise. * src/NSData.m: Likewise. * src/NSDate.m: Likewise. * src/NSDeallocateObject.m: Likewise. * src/NSDebug.m: Likewise. * src/NSDictionary.m: Likewise. * src/NSDistantObject.m: Likewise. * src/NSDistributedLock.m: Likewise. * src/NSEnumerator.m: Likewise. * src/NSException.m: Likewise. * src/NSFileHandle.m: Likewise. * src/NSFileManager.m: Likewise. * src/NSGArchiver.m: Likewise. * src/NSGArray.m: Likewise. * src/NSGAttributedString.m: Likewise. * src/NSGCString.m: Likewise. * src/NSGCountedSet.m: Likewise. * src/NSGDictionary.m: Likewise. * src/NSGSequence.m: Likewise. * src/NSGSet.m: Likewise. * src/NSGString.m: Likewise. * src/NSGeometry.m: Likewise. * src/NSHashTable.m: Likewise. * src/NSHost.m: Likewise. * src/NSInvocation.m: Likewise. * src/NSLock.m: Likewise. * src/NSLog.m: Likewise. * src/NSMapTable.m: Likewise. * src/NSMethodSignature.m: Likewise. * src/NSNotification.m: Likewise. * src/NSNotificationCenter.m: Likewise. * src/NSNotificationQueue.m: Likewise. * src/NSNumber.m: Likewise. * src/NSObjCRuntime.m: Likewise. * src/NSObject.m: Likewise. * src/NSPage.m: Likewise. * src/NSPipe.m: Likewise. * src/NSPort.m: Likewise. * src/NSPortCoder.m: Likewise. * src/NSProcessInfo.m: Likewise. * src/NSProxy.m: Likewise. * src/NSRange.m: Likewise. * src/NSRunLoop.m: Likewise. * src/NSScanner.m: Likewise. * src/NSSerializer.m: Likewise. * src/NSSet.m: Likewise. * src/NSString.m: Likewise. * src/NSThread.m: Likewise. * src/NSTimeZone.m: Likewise. * src/NSTimer.m: Likewise. * src/NSUser.m: Likewise. * src/NSUserDefaults.m: Likewise. * src/NSValue.m: Likewise. * src/NSZone.m: Likewise. * src/NXStringTable.m: Likewise. * src/Notification.m: Likewise. * src/NotificationDispatcher.m: Likewise. * src/OrderedCollection.m: Likewise. * src/Port.m: Likewise. * src/Proxy.m: Likewise. * src/Queue.m: Likewise. * src/RBTree.m: Likewise. * src/RBTreeNode.m: Likewise. * src/RNGAdditiveCongruential.m: Likewise. * src/RNGBerkeley.m: Likewise. * src/Random.m: Likewise. * src/RawCStream.m: Likewise. * src/Set.m: Likewise. * src/SplayTree.m: Likewise. * src/Stack.m: Likewise. * src/StdioStream.m: Likewise. * src/Storage.m: Likewise. * src/Stream.m: Likewise. * src/TcpPort.m: Likewise. * src/TextCStream.m: Likewise. * src/Time.m: Likewise. * src/UdpPort.m: Likewise. * src/Unicode.m: Likewise. * src/UnixFileHandle.m: Likewise. * src/behavior.m: Likewise. * src/externs.m: Likewise. * src/find_exec.c: Likewise. * src/md5.c: Likewise. * src/mframe.m: Likewise. * src/o_array.m: Likewise. * src/o_cbs.m: Likewise. * src/o_hash.m: Likewise. * src/o_list.m: Likewise. * src/o_map.m: Likewise. * src/o_x_bas.m.in: Likewise. * src/o_x_cbs.m.in: Likewise. * src/objc-gnu2next.m: Likewise. * src/ostream.m: Likewise. * src/preface.m: Likewise. * src/win32-entry.m: Likewise. * src/include/preface.h.in: Do not include config.h * src/GNUmakefile: Don't install config.h; add target so that config.h gets moved to target cpu/os dependent directory. * src/Makefile.postamble: Move config.h to target directory. * src/Makefile.preamble: Add target directory to include dirs. * src/NSCalendarDate.m (-initWithString:calendarFormat:locale:): Parse the time zone abbreviation and am/pm indicator. * src/md5.c: Correct license comment. Wed Nov 5 13:36:45 1997 Adam Fedor * doc/GNUmakefile (TEXT_FILES): Add GNUstep-HOWTO * doc/Makefile.postamble (GNUstep-HOWTO): New target. * doc/gnustep-howto.texi: New file. Sun Nov 2 15:47:10 1997 Yoo C. Chung * src/NSTimeZone.m: More effecient implementation of [NSTimeZone -abbreviationDictionary] object enumerator. More robust error logging. Description method changes. Sat Nov 1 06:45:00 1997 Richard Frith-Macdonald * src/NSDistributedLock: New OPENSTEP class implementation. * src/GNUmakefile: Add new class to list. * src/NSFileManager: implemented method ([-removeFileAtPath:handler:]) * src/NSString.m: Added two new (OPENSTEP) methods - ([-fileSystemRepresentation]) and ([-fileSystemRepresentation:maxLength:]) * src/NSUserDefaults.m: ([-synchronize]) modified to do locking using NSDistributedLock * src/Foundation/NSDistributedLock.h: New OPENSTEP class definition. * src/Foundation/NSString.h: Added two new (OPENSTEP) methods. Fri Oct 31 17:00:29 1997 Adam Fedor * GNUmakefile (DIST_FILES): Update files. * src/GNUmakefile: Likewise. * checks/GNUmakefile: Likewise. * examples/GNUmakefile: Likewise. * doc/GNUmakefile: Likewise. * admin/GNUmakefile: Likewise. * NSCharacterSets/GNUmakefile: Likewise. * NSTimeZones/GNUmakefile: Likewise. * Tools/GNUmakefile: Likewise. * Tools/Makefile.postamble (copy-dist): New target. Fri Oct 31 15:16:46 1997 Adam Fedor * NSBundle.README: Removed obsolete file. * README.threads: Likewise. * RELEASE-NOTES: Likewise. * GNUmakefile: Remove obsolete files from DIST. Make Tools the second build target. * Tools/GNUmakefile: Include tool.make and make dread, etc as tools. * Tools/Makefile.preamble: Add uninstalled includes and libraries from ../src. * Tools/dremove.m: Add errno.h. * doc/GNUmakefile: Remove unneeded top-level text files. * doc/announce.texi: Update. * doc/install.texi: Likewise. * doc/news.texi: Likewise. * doc/readme.texi: Likewise. * doc/todo.texi: Likewise. Fri Oct 31 10:26:16 1997 Adam Fedor * GNUmakefile: Renamed from Makefile. * src/GNUmakefile: Likewise. * checks/GNUmakefile: Likewise. * examples/GNUmakefile: Likewise. * doc/GNUmakefile: Likewise. * admin/GNUmakefile: Likewise. * NSCharacterSets/GNUmakefile: Likewise. * NSTimeZones/GNUmakefile: Likewise. * Makefile: Dummy make, tells user to use GNU make. * doc/GNUMakefile: Make more text files. * doc/Makefile.postamble: Clean up to make text files. * NSBundle.README: Update. * examples/Makefile.example.in: Remove obsolete file. * examples/configure.example.in: Likewise. Thu Oct 30 15:20:00 1997 Richard Frith-Macdonald * Tools/GNUmakefile: New format make file with the addition of three new tools - dread, dwrite, dremove * Tools/dread.m: New command line tool to read user defaults database. * Tools/dremove.m: New command line tool to remove defaults from database. * Tools/dwrite.m: New command line tool to modify user defaults. * src/Dictionary.m: ([-descriptionWithIndent:]) modified to produce better property-list type description with escaped special chars. * src/NSArray.m: ([-description]) modified to produce better property-list type description with escaped special chars. * src/NSData.m: ([-writeToFile:atomically:]) changed code for handling temporary file to avoid failure due to cross-device links. * src/NSDictionary.m: ([-writeToFile:atomically:]) implemented this method using NSString. * src/NSString.m: ([-stringByAppendingString:]) fixed memory leak. Added new method ([-quotedCString]) for use in writing property lists. Modified ([-appendFormat:]) so that it doesn't leave temporary strings to be autoreleased - small efficiency gain. * src/NSUserDefaults.m: Various minor fixes to get saving to the defaults database to work. * src/Foundation/NSString.h: Added (GNUstep specific) method - [-quotedCString]. * src/Foundation/NSUserDefaults.h: Added (OPENSTEP specific) method - [-setSearchList:]. Thu Oct 30 13:38:51 1997 Scott Christley * Makefile (GNUSTEP_INSTALLATION_DIR): Make default be system. * NSCharacterSets/Makefile: Likewise. * NSTimeZones/Makefile: Likewise. * Tools/Makefile: Likewise. Use objc.make instead of tool.make as the file does not require the foundation library. * admin/Makefile: Likewise. * checks/Makefile: Likewise. Use test.make so that the programs do not get installed. * doc/Makefile: Likewise. * examples/Makefile: Likewise. Use test.make so that the programs do not get installed. * src/Makefile: Likewise. Alter names to correspond with the new recursive library.make. * src/Makefile.postamble: Uninstall header files. * src/NSBundle.m (+mainBundle): Strip off library combo, target os and target cpu is they are part of the directory list to the executable so that the bundle path is the top level dir. * src/externs.m (NSNonRetainedObjectHashCallbacks): Correct name. Thu Oct 30 14:32:28 1997 Adam Fedor * Makefile (GNUSTEP_INSTALLATION_DIR): New variable. * checks/Makefile (TOOL_NAME): Remove duplicate nsattributedstring. * src/Makefile: Add libgnustep-base_ prefix to appropriate variables. * src/NSProxy.m: Add limits.h for Solaris. Tue Oct 28 10:05:00 1997 Richard Frith-Macdonald * src/NSData.m: Added [-replacementObjectForPortCoder:] method to ensure that NSData objects are always sent bycopy. * src/mframe.m: Modified mframe_do_call() and mframe_build_return() to encode/decode a dummy integer value where a method returns void but is NOT declared as being oneway. Mon Oct 27 16:15:00 1997 Richard Frith-Macdonald * Makefile: Added Tools subproject * NSTimeZones/Makefile.postamble: Added distclean code to remove time-zone files leaving only the tar image. * Tools/Makefile: New make file added. * Tools/Makefile.postamble: New file. * Tools/Makefile.preamble: New file. * Tools/gdomap.c: Moved from the src directory with some minor bug fixes and easing of restrictions on deregistering a name. * Tools/gdomap.h: Moved from the src directory with some minor changes and improvements to comments. * checks/Makefile.postamble: Added some stuff for distclean to remove some fo the temporary data files. * checks/Makefile.preamble: Modified to compile with -g flag even if being linked with non-debug libraries. * checks/nsdate.m: Added checks for new NSCalendarDate features. * src/Coder.m: ([-initForReadingWithData:]) modified use of the [-retainCount] method for newly corrected version. * src/Makefile: Removed references to gdomap.[hc] * src/Makefile.postamble: distclean now removes some automatically generated source files. * src/NSBundle.m: Removed own reference counting support in favour of using the standard mechanism but intercepting [-release] to change deallocation behaviour. * src/NSCalendarDate.m: Implemented [-dayOfWeek], added support for week day names (and abbreviations) in descriptions. Implemented some missing formatting directives in descriptions, Fixed the [-initWithYears:months:days:hours:minutes:seconds:timeZone:] method to use the supplied time zone correctly. Implemented [-dateByAddingYears:months:days:hours:minutes:seconds]. Implemented [-years:months:days:hours:minutes:seconds:sinceDate:]. * src/NSData.m: Fixed shared memory to only remove shared-memory IDs from the system when the last object having mapped the memory is deallocated. * src/NSObject.m: ([-retainCount]) corrected to return the number of times the object has been retained. ([-autorelease]) use [-retainCount] so that this works with classes that have implemented their own retain./release/retainCount. * src/NSProxy.m: Fixed retain counting scheme so that [-retainCount] returns the correct value. * src/NSRunLoop.m: ([-runMode:beforeDate:]) fixed possible problem with passing a date obejct which might have been released unexpectedly. * src/NotificationDispatcher.m: Fixed retain counting scheme so that [-retainCount] returns the correct value. * src/Proxy.m: Fixed retain counting scheme so that [-retainCount] returns the correct value. * src/TcpPort.m: Modified to expect to find gdomap in the Tools directory of the new GNUstep directory standard. * src/include/NSBundle.h: Removed unneeded retsain count variable. * src/include/NSData.h: Conform to NSCoding protocol. * src/include/NSDate.h: Added two OPENSTEP methods. Fri Oct 24 14:36:23 1997 Adam Fedor * Removed unused files. * checks/beh.m, checks/float.c: Removed * examples/nx-client.m, examples/nx-server.m, examples/port-client.m, examples/port-server.m: Likewise. * src/AutoreleasePool.m, src/AutoreleaseStack.m, src/BinaryTreeEltNode.m, src/ConstantString.m, src/EltNodeCollector.m, src/LinkedListEltNode.m, src/Makefile.sed.nt, src/MethodSignature.m, src/NXConnection.m, src/NXProtocolChecker.m, src/NXProxy.m, src/NotificationQueue.m, src/ObjectRetaining.m, src/ProtocolEnforcer.m, src/RBTreeEltNode.m, src/ReleasePool.m, src/RetainingNotifier.m, src/Ring.m, src/RunLoop.m, src/SocketPort.m, src/SunRpcPort.m, src/Thread.m, src/Tree.m, src/TreeNode.m, src/argframe.m, src/data.m, src/eltfuncs.m, src/gnu4next.m, src/gnu4nextrt.m, src/o_vprintf.c, src/vfscanf.c: Likewise. * src/include/AutoreleasePool.h, src/include/AutoreleaseStack.h, src/include/BinaryTreeEltNode.h, src/include/LinkedListEltNode.h, src/include/RBTreeEltNode.h, src/include/SmallInt.h, src/include/SocketPort.h, src/include/abort.h, src/include/allocs.h, src/include/atoz.h, src/include/bitops.h, src/include/data.h, src/include/magic.h, src/include/minmax.h, src/include/number.h: Likewise. Fri Oct 24 20:16:14 1997 Yoo C. Chung * src/StdioStream.m ([StdioStream -dealloc]): Check fp before closing. Wed Oct 22 19:54:07 1997 Yoo C. Chung * src/NSTimeZone.m ([NSTimeZone +initialize]): Fallback time zone now only set to UTC. (NSConcreteTimeZoneDetail): Changed method. ([NSConcreteTimeZoneDetail -timeZoneDetailForDate:]): New method. ([NSConcreteTimeZoneDetail -timeZoneName]): Likewise. ([NSConcreteTimeZoneDetail -timeZoneDetailArray]): Likewise. ([NSTimeZone +timeZoneWithName:]): Updated for changed methods in NSTimeZoneDetail. ([NSInternalTimeTransition -description]): Print class name. ([NSConcreteTimeZone -description]): Likewise. ([NSConcreteAbsoluteTimeZone -description]): Likewise. ([NSConcreteTimeZoneDetail -description]): Likewise. Mon Oct 20 09:51:53 1997 Adam Fedor * Version: Update ftp sites. * checks/Philosopher.h: Removed. * checks/Philosopher.m: Likewise. * checks/basic-old.m: Likewise. * checks/nsarchiving.m: Likewise. * src/Foundation/NSUser.h: Likewise. * src/Foundation/x-basics.h.in: Likewise. * src/Foundation/x-callbacks.h.in: Likewise. * checks/Makefile (HDRS): Add oldserver.h. * doc/Makefile: Add other texi files. * NSCharacterSets/Makefile (DIST_FILES): Remove Makefile.preamble. * NSTimeZones/Makefile (DIST_FILES): Likewise. * NSCharacterSets/Makefile.postamble (copy-dist): Correct copy. * NSTimeZones/Makefile.postamble (copy-dist): Correct dist files. Sat Oct 18 12:27:56 1997 Scott Christley * Get NSTimeZone to work in GNUstep directory structure. * src/NSTimeZone.m (+getAbbreviationFile): New method. (+getRegionsFiles, +getLocalTimeFile): New methods. (+getTimeZoneFile:): New method. (TIME_ZONE_DIR, ABBREV_DICT, REGIONS_FILE, LOCAL_TIME_FILE, ZONES_DIR): Correct paths. (+initialize): Use private method to get resource file name. (+timeZoneWithName:, +abbreviationMap, +timeZoneArray): Likewise. * checks/create-abbrevs.m: New file. * checks/create-regions.m: New file. * checks/nstimezone.m: New file. * checks/Makefile: Add new checks. * src/NSBundle.m (+pathForResource:ofType:inRootPath:inDirectory:withVersion:): If no extension then look for file without extension before calling _bundle_path_for_name() which does not handle the case where the resource name contains a directory path within it. * src/NSBundle.m (+pathForGNUstepResource:ofType:InDirectory:): New method. * src/include/NSBundle.h (+pathForGNUstepResource:ofType:InDirectory:): New method. Fri Oct 17 12:44:18 1997 Scott Christley * src/NotificationDispatcher.m (-init): Make the key callbacks be NSObject for the notification name map table so that isEqual: is used for comparison. Fri Oct 17 09:16:36 1997 Adam Fedor * checks/Makefile.postamble: Add English.lproj dir to copy-dist. * src/NSCalendarDate.m (-descriptionWithCalendarFormat:locale): Use VSPRINTF_LENGTH macro to return string length. * src/NSData.m ([NSMutableDataMalloc -setCapacity:): Use realloc instead of objc_realloc. * src/NSHost.m (-_initWithHostEntry:): Use memcpy instead of memmove. * src/UnixFileHandle.m (getAddr): Remove uneeded htonl. Changes from Richard Frith-Macdonald . * src/NSTimeZone.m: Reformat with better spacing. ([NSTimeZone +initialize]): Find local time zone. Changes from Yoo C. Chung . Thu Oct 16 16:14:31 1997 Scott Christley * checks/Makefile: Add variables to create bundle example. * checks/NXStringTable.example: Move to English.lproj subdir. * checks/nsarray.m: Turn off behaviour debugging. * checks/nsdictionary.m: Add isEqual check. * checks/values.m: Add isEqual check. * src/Collection.m (isEqual:): Don't require that the classes be the same. * src/NSDictionary.m: Fix implementation by creating NSDictionaryNonCore and NSMutableDictionaryNonCore classes; move implemented methods to non-core classes. * src/include/NSDictionary.h: Likewise. * src/NSGDictionary.m: Add behaviour from non-core classes. * src/ObjCRuntime.m (NSClassFromString): Use objc_lookup_class instead of objc_get_class so that the program will not abort if the class is not found. * src/NSTimeZone.M (TIME_ZONE_DIR): Eliminate reference to obsolete GNUSTEP_INSTALL_DIR macro. * src/NSZone.m: Use default zone if zone is NULL. * src/include/NSZone.h: Likewise. * src/behavior.m (behavior_class_add_class): Add debug message. * src/Makefile: Define macros for the target directory and library combo that the library is compiled for. * src/NSBundle.m (gnustep_target_dir, library_combo): New variables. (bundle_object_name): Use the target directory and library combo when determine where the executable file is located. (+_bundleResourcePathsWithRootPath:subPath:): Don't search directory specified by GNUSTEP_LIBRARY_PATH environment variable. * src/NSCharacterSet.m (+_bitmapForSet:number:): Rewrite to search the user, local, and system directories based upon environment variable values. * src/NSData.m (getBytes:range:): Fix range check. (subdataWithRange:, replaceBytesInRange:withBytes:): Likewise. (resetBytesInRange:): Likewise. Wed Oct 1 14:44:17 1997 Adam Fedor * src/NSConnection.m ([-registerName:]): Remove duplicate method. * src/NSDistantObject.m ([-encodeWithCoder:]): Likewise. * src/Proxy.m: ([NSObject -selectorTypeForProxy]): Likewise. * Makefile: Add new subproject. * NSTimeZones: New directory. * NSTimeZones/Makefile: New file. * NSTimeZones/Makefile.postamble: Likewise. * NSTimeZones/NSTimeZones.tar: Likewise. Tue Sep 30 08:57:44 1997 Adam Fedor * src/NSData.m: Remove obsolete includes. * src/NSMutableData.m: Remove file. * src/NSSerializer.m: Remove references to obsolete data classes. Sun Sep 28 21:15:00 1997 Richard Frith-Macdonald * checks/nsdata.m: Added a whole lot of trivial checks. * checks/oldserver.h: Added include file for oldserver.m, oldclient.m * src/Coder.m: ([-initForWritingWithMutableData:]) added code to wrap the NSMutableData object inside a MemoryStream since NSMutableData no longer conforms to the MemoryStreaming protocol. ([-initForReadingWithData:]) added code to wrap the NSData object inside a MemoryStream. ([+unarchiveObjectWithData:]) added code to wrap the NSData object inside a MemoryStream. ([-classForPortCoder:]) changed to [-classForPortCoder] to conform to OpenStep spec. * src/Makefile.in: Removed NSGData.[hm] and NSHData.[hm] * src/MemoryStream.m: Rewritten to use NSData and NSMutableData objects to hold the memory. * src/NSAttributedString.m: ([-classForPortCoder:]) changed to [-classForPortCoder] to conform to OpenStep spec. * src/NSData.m: Extensively rewritten to have the OPENSTEP class cluster architecture. Should support the full OPENSTEP api and have shared memory support and static buffer support as extensions. * src/NSDate.m: ([-classForPortCoder:]) changed to [-classForPortCoder] to conform to OpenStep spec. * src/NSDistantObject.m: ([-classForPortCoder:]) changed to [-classForPortCoder] to conform to OpenStep spec. * src/NSGArchiver.m: ([-archiverData]) modified to cope with changes to NSData and NSMutableData. * src/NSGAttributedString.m: ([-classForPortCoder:]) changed to [-classForPortCoder] to conform to OpenStep spec. * src/NSGCString.m: ([-classForPortCoder:]) changed to [-classForPortCoder] to conform to OpenStep spec. * src/NSGString.m: ([-classForPortCoder:]) changed to [-classForPortCoder] to conform to OpenStep spec. * src/NSPortCoder.m: ([-classForPortCoder:]) changed to [-classForPortCoder] to conform to OpenStep spec. ([-isByCopy]) changed to [-isBycopy] to conform to OpenStep. * src/NSString.m: ([-classForPortCoder:]) changed to [-classForPortCoder] to conform to OpenStep spec. * src/Port.m: ([-classForPortCoder:]) changed to [-classForPortCoder] to conform to OpenStep spec. * src/StdioStream.m: ([-initWithFilename:fmode:]) fixed excessive releases of string. ([-initWithFileDescriptor:fmode:]) fixed excessive releases of string. ([-close]) clear file pointer when it is closed to prevent attempted operations on bad pointer. * src/TcpPort.m: ([-classForPortCoder:]) changed to [-classForPortCoder] to conform to OpenStep spec. Also multiple changes to deal with the rewrite of MemoryStream. * src/UdpPort.m: ([-classForPortCoder:]) changed to [-classForPortCoder] to conform to OpenStep spec. * src/UnixFileHandle.m: Numerous changes improving logging and tidying stuff. failed initialisers should now all return nil rather than raising exceptions. * src/include/MemoryStream.h: Changed this class to use NSData and NSMutableData to hold its contents. Added methods to initialise with a data object so we can wrap an NSData or NSMutableData inside a MemoryStream to give it Streaming behaviour. * src/include/NSData.h: Added some extension methods for creating data objects with static buffers or shared memory buffers. * src/include/NSDistantObject.m: ([-classForPortCoder:]) changed to [-classForPortCoder] to conform to OpenStep spec. * src/include/NSObject.m: ([-classForPortCoder:]) changed to [-classForPortCoder] to conform to OpenStep spec. * src/include/NSPortCoder.m: ([-classForPortCoder:]) changed to [-classForPortCoder], and ([-isByCopy]) changed to [-isBycopy] to conform to OpenStep spec. Fri Sep 26 20:43:12 1997 Adam Fedor * Fix Makefiles so snapshots and releases work again * Makefile: Include missing DIST_FILES * Makefile.postamble: Correct csnap projects. * NSCharacterSets/Makefile: Include missing DIST_FILES. * admin/Makefile: Likewise. * admin/Makefile: Correct snap target. * checks/Makefile: Include missing DIST_FILES. * checks/Makefile.postamble: New file. * examples/Makefile: Include missing DIST_FILES. * examples/Makefile.postamble: New file. * doc/Makefile.postamble: New file. * src/Makefile: Include missing DIST_FILES. * ssrc/Makefile.postamble: Fix AUTHORS depend, copy-dist. * STATUS: Update. * README.foundation: Remove obsolete file. Sat Sep 23 10:18:41 2017 Scott Christley * Convert to GNUstep makefile package. * Makefile: New file. * Makefile.postamble: New file. * config.mak.in: New file. * Makefile.in: Delete. * Makefile.sed.nt: Delete. * Makeconf: Delete. * configure.in (AC_OUTPUT): No longer create the makefiles. * NSCharacterSets/Makefile: New file. * NSCharacterSets/Makefile.postamble: New file. * NSCharacterSets/Makefile.in: Delete. * admin/Makefile: New file. * admin/Makefile.postamble: New file. * admin/Makefile.in: Delete * checks/Makefile: New file. * checks/Makefile.preamble: New file. * checks/Makefile.in: Delete. * checks/Makefile.sed.nt: Delete. * examples/Makefile: New file. * examples/Makefile.preamble: New file. * examples/Makefile.in: Delete. * src/Makefile: New file. * src/Makefile.preamble: New file. * src/Makefile.postamble: New file. * src/Makefile.in: Delete * The installation of the header files was modified slightly to correspond with the GNUstep makefile package. All OpenStep headers go into Foundation while the gnustep-base specific headers go into gnustep/base. * checks/coder.m: Correct header directory. * checks/cstream.m: Likewise. * checks/oldserver.m: Likewise. * checks/string.m: Likewise. * src/include/Connection.h: Likewise. * src/include/NSConnection.h: Likewise. * src/include/NSPortCoder.h: Likewise. * src/include/Notification.h: Likewise. * src/include/NotificationDispatcher.h: Likewise. Mon Sep 22 17:14:32 1997 Adam Fedor * checks/NSData-test.m: Change main to return int. * checks/coder.m: Check for nil names -- Solaris can't print NULL strings. * checks/nsattributedstring.m: Add test to main. * checks/values.m: Remove exception handlers. * doc/coding-standards.texi: New file. * doc/Makefile.in: Add new texi file, CODING-STANDARDS target.. * src/Collection.m ([ConstantCollection -_collectionReleaseContents]): Release only if count > 0. * src/Set.m ([Set dealoc]): Set contents_hash to 0 and call super. * src/Set.m ([Set count]): If !contents_hash return 0; * src/Makefile.in: remove extra Collection.m. * src/NSArray.m ([NSArray -initWithObjects:rest:]): REALLOC before overflow of array. * src/NSConcreteValue.m ([NSConcreteValue -initValue:withObjCType:]): Change exceptions to NSLog and return nil. Fri Sep 22 09:50:52 2017 Scott Christley * src/NSArray (initWithObjects:rest:): Fix count. Tue Sep 16 15:50:39 1997 Adam Fedor * src/Dictionary.m ([Dictionary -descriptionWithIndent:]): Rewrite to pretty-print description. * src/NSDictionary.m ([NSDictionary -description]): Remove redundant method implementation. ([NSDictionary -descriptionWithIndent:]): Likewise. * src/NSArray.m ([NSArray -descriptionWithIndent:]): Implement. * src/NSCTemplateValue ([NSCTemplateValue description]): Add semicolon to last value. * src/NSValue: ([NSValue valueFromString:]): New method. * src/NSNumber: ([NSValue valueFromString:]): Likewise. * src/include/NSValue.h: Define new method. * src/NSCharacterSet.m ([NSCharacterSet -_bitmapForSet:]): Fix test path name. * src/NSString ([NSString initWithFormat:arguments:]): Take care of formatted string case "%*s". ([NSString -stringByAppendingPathComponent:]): Exception only if string starts with '/'. ([NSString -stringByAppendingPathExtension:]): Likewise. Mon Sep 15 21:27:00 1997 Richard Frith-Macdonald * src/NSHData.m: Fixed a couple of bugs occurring when allocation of shared memory segments failed. Also added class methods to query and set the size of the blocks in which shared memory is allocated. * src/include/NSHData.h: Added class methods for query and set of size of shared memory allocation blocks. Sat Sep 13 10:05:57 1997 Scott Christley * The GNU tools for building a DLL on Windows only allow functions and not data to be exported; therefore, all global variables were moved into a separate file, externs.m, and added to the import library for the DLL so that those variables would be accessible outside of the DLL. * configure.in (PIPE): Make the -pipe a configure option. (DLLTOOL): Add support for building DLLs. (disable-static): New configure option to disable the building of the static library when building a shared library. (pcthread, pthread, m): Add checks for pcthread and math libraries. (sys/stat.h, sys/vfs.h, sys/statfs.h, statvfs): Add checks for filesystem related headers and functions. (getcwd): Remove duplicate check. * src/win32-entry.c: Rename to win32-entry.m * src/externs.m: New file. * src/libgnustep-base.def: New file. * src/Connection.m: Move all global variables to externs.m. * src/NSArchive.m: Likewise. * src/NSBundle.m: Likewise. Comment out code that would not compile on WIN32. * src/NSException.m: Likewise. (dealloc): Release instance variables. * src/NSFileManager.m: Likewise. Add WIN32 specific code. * src/NSHashTable.m: Likewise. * src/NSMapTable.m: Likewise. * src/NSThread.m: Likewise. (-init): Set the thread data first. * src/NSUserDefaults.m: Likewise. * src/Stream.m: Likewise. * src/TcpPort.m: Likewise. * src/o_cbs_char_p.m: Likewise. * src/o_cbs_id.m: Likewise. * src/o_cbs_int.m: Likewise. * src/o_cbs_int_p.m: Likewise. * src/o_cbs_void_p.m: Likewise. * checks/Makefile.in: Do not link with math library. * checks/NSData-test.m: Correct directory for include files. * checks/diningPhilosophers.m (WIN32): Check different macro. * checks/nsattributedstring.m (main): New function. * checks/nsbundle.m: Do not include for MINGW32. * src/Makefile.in: Add support for building a DLL. Break out the single install target into multiple targets. * src/NSCalendarDate.m (-descriptionWithCalendarFormat:locale:): Add character string month names. (short_month, long_month): New static arrays. * src/NSDate.m (+timeIntervalSinceReferenceDate): Also test _WIN32. * src/NSCharacterSet.m (NSCharacterSet_PATH): Don't specify full path, just bundle directory. * src/NSDictionary.m (-initWithContentsOfFile:): Make sure the returned object is an NSDictionary. * src/NSObject.m (initialize): Create global lock. (-performSelector:, -performSelector:WithObject:) (-performSelector:withObject:withObject:): New methods. * src/include/NSObject.h: Add prototype for global lock. (-performSelector:, -performSelector:WithObject:) (-performSelector:withObject:withObject:): New methods. * src/NSProcessInfo.m (_gnu_process_args): Check if NULL. For MINGW32, have NSProcessInfo access the global variables directly. * src/NSString.m: Add support for different path components that are supported on WIN32. (rangeOfCharacterFromSet:options:mask:): Correct assert. (-componentsSeparatedByString:): Correct calculation of search range. * src/NSUser.m: Check _WIN32 macro as well. * src/Time.m: Likewise. * src/RunLoop.m (_AIX): Include header file. UNIX is vastly different from WIN32 so separate the functionality into different methods. Move all global variables to externs.m. (-acceptWIN32InputForMode:beforeDate:): New method. (-acceptUNIXInputForMode:beforeDate:): New method. (-acceptInputForMode:beforeDate:): Call the appropriate method depending upon whether a UNIX or WIN32 system. * src/StdioStream.m: Comment out code that would not compile on WIN32. * src/include/StdioStream.h (-rewindStream): Add prototype. * src/find_exec.c: Handle the different path separator in the PATH environment variable and the different path component which is supported on WIN32. Also add common WIN32 extensions to the filename when searching for the executed file. * src/include/NSDate.h (-initWithTimeIntervalSince1970:): ADd missing method prototype. * src/include/NSHashTable.h: Move typedefs that were in NSHashTable.m to here so that externs.m has access to them. * src/include/NSMapTable.h: Move typedefs that were in NSMapTable.m to here so that externs.m has access to them. * src/include/UdpPort.h (WIN32): Use __WIN32__ macro instead. * src/include/fake-main.h: Do not redefine main on MINGW32. * src/include/preface.h.in: Add WIN32 specific definition. Fri Sep 12 12:27:00 1997 Richard Frith-Macdonald * src/NSString.m: Added [-classForPortCoder:]) method for NXConstantString to prevent minor DO memory leak. Fri Sep 12 6:15:00 1997 Richard Frith-Macdonald * src/NSAttributedString.m: Added the [-classForPortCoder:] and [-replacementObjectForPortCoder:] methods to ensure that strings are always sent over DO bycopy. * src/NSDistantObject.m: Fixed the types of the parameters to a few methods to avoid compiler warnings. * src/NSGAttributedString.m: Added the [-classForPortCoder:] and [-replacementObjectForPortCoder:] methods to ensure that strings are always sent over DO bycopy. * src/NSGCString.m: Added the [-classForPortCoder:] and [-replacementObjectForPortCoder:] methods to ensure that strings are always sent over DO bycopy. * src/NSGString.m: Added the [-classForPortCoder:] and [-replacementObjectForPortCoder:] methods to ensure that strings are always sent over DO bycopy. * src/NSHData.m: Added the [-classForPortCoder:] and [-replacementObjectForPortCoder:] methods to ensure that data objects are always sent over DO bycopy. * src/NSProxy.m: Commented out a couple of methods whose OPENSTEP style implementation was incomplete so that the old (working) GNUstep implementation is used. * src/NSRunLoop.m: Moved some code around to fix problems with earlier patch being applied in wrong place. Wed Sep 10 18:03:22 1997 Scott Christley * config.guess: Update. * config.sub: Add mingw32. * src/NSArray.m (-initWithObjects:rest:): The first object is allowed to be nil and the count needs to be reduced by one before calling -initWithObjects:count: Tue Sep 9 10:15:00 1997 Richard Frith-Macdonald * src/NSConnection.m: Made numerous changes to fix memory leak with ports never being released and to fix problems in port invalidation associated with that. Also added code to cope with odd cases like when a remote application dires while we are waiting for a response from it. * src/NSPort.m: Added [-release] method which ensures that ports are invlidated before they are finally deallocated. * src/NSPortCoder.m: Catch exceptions during attempt to write data. * src/NSRunLoop.m: Fixed this so that a count is kept of the number of times a port has been added to the run loop as per the OPENSTEP documentation. * src/TcpPort.m: Fixed a minor retain/release problem. * src/UnixFileHandle.m: Added loads of checks so that attempts to use a file handle which has been closed will fail/generate an exception rather than crashing things! Also modified for changes to NSRunLoop. * src/include/NSRunLoop.h: Modified the interface for adding watchers for events with a count of the number of times they have been added. * src/include/Port.h: Removed [-isValid] - now in NSPort. Tue Aug 26 15:47:54 1997 Adam Fedor * src/NSCTemplateValue.m ([NSCTemplateValue -description]): New method. * src/NSConcreteValue.m ([NSConcreteValue -description]): Likewise. * src/NSNumber.m ([NSNumber -description]): use -stringValue. Fri Aug 29 13:25:51 1997 Adam Fedor * src/Makefile.in: Add LIBS macro. * src/UnixFileHandle.m: Add include for Solaris. * src/NSHData.m: Include errno.h Thu Aug 28 16:15:00 1997 Richard Frith-Macdonald * configure.in: Added check for presence of inet_aton(). * src/Array.m: Added NSSerializer.m * src/NSConnection.m: ([-_initCollectionWithCoder:]): Removed redundant OBJC_MALLOC() which was causing a memory leak. * src/Collection.m: ([-_decodeContentsWithCoder:]): Added code to release newly decoded contents to avoid massive memory leak. * src/Dictionary.m: Restructured deallocation process so that the dictionary gets deallocated properly rather than just it's contents being released. * src/Makefile.in: Added NSDebug.m and NSDebug.h * src/NSAllocateObject.m: Minor modification to permit counting of the number of instances of any object allocated. * src/NSDeallocateObject.m: Minor modification to permit counting of the number of instances of any object deallocated. * src/Debug.m: Added functions for monitoring allocation and deallocation of objects. Also an implementation of strerror() for systems which don't have it. * src/NSHost.m: minor portability fixes. * src/NSPort.m: ([-isValid]): implemented this method. * src/NSSerializer.m: Misc tidying up and minor fixes. * src/Port.m: Removed retain/release methods - these are handled by NSObject. * src/StdioStream.m: Moved implementation of strerror() to NSDebug.m. * src/TcpPort.m: Various alterations to try to ensure that ports are automatically retained and released correctly. * src/UnixFileHandle.m: Various alterations to try to ensure that things are always released correctly. * src/include/NSDebug.h: Interface for debugging facilities. * src/include/NSPort.h: Added variable to handle invalidation. * src/include/NSSerialization.h: Fixed some errors introduced in last change. * src/include/Port.h: Avoid use of bitfields - some compiler versions seem to mess up. * src/include/config.h.in: Added some constants for NSHData and UnixFileHandle. Tue Aug 19 09:45:00 1997 Richard Frith-Macdonald * src/Dictionary.m: Added [-description] to perform OpenStep style description of dictionary contents (for property-list strings). * src/Makefile.in: Added NSSerializer.m * src/NSConnection.m: Implemented [+defaultConnection] method. * src/NSHData.m: Fixed bug in resizing buffer - when going from malloced-memory to shared-memory the buffer contents were not being copied! * src/NSSerializer.m: Implementation of the NSSerializer and NSDeserializer classes for handling property-lists. * src/include/NSConnection.h: Added [-makeNewConnection:sender:]. * src/include/NSDictionary.h: Added [+dictionaryWithObjectsAndKeys:]. * src/include/NSSerialisation.h: Added interface definitions for the NSSerializer and NSDeserializer clases. * src/proplist.l: Fixed pattern definition for matching NSData items and relaxed rules a little to permit newlines. Also fixed severe memory leaks. * src/proplist.y: Fixed excessive number of autoreleases and restructured slightly so that temporary objects are released immediately rather than being autoreleased at the end of the parse - should avoid out-of-memory problems when parsing huge property-lists. Thu Aug 14 14:00:00 1997 Richard Frith-Macdonald * checks/Makefile.in: Renamed client and server to oldclient and oldserver. Created new versions for OpenStep D.O. Added nsdata and nshost. * checks/NSData-test.m: Updated in line with current NSRange code. * checks/client.m: Revised version for OPENSTEP D.O. * checks/nsarchiver.m: Added a couple of checks to do with allocation. * checks/nsarray.m: Added some retain count checks. * checks/nsdata.m: Test memory mapped file initialisation. * checks/nshost.m: Basic tests for nshost class. * checks/nstimer.m: Changed to use NSRunLoop. * checks/oldclient.m: Old version for GNU D.O. * checks/oldserver.h: Old version for GNU D.O. * checks/oldserver.m: Old version for GNU D.O. * checks/server.h: Revised version for OPENSTEP D.O. * checks/server.m: Revised version for OPENSTEP D.O. * checks/tcpport-client.m: Modified for changed tcpport. * checks/tcpport-server.m: Modified for changed tcpport. * configure.in: Added checks for mapped file and shared memory support. * examples/first-server.m: Include NSRunLoop.h rather than RunLoop.h. * examples/second-client.m: Include NSRunLoop.h rather than RunLoop.h. * src/ConnectedCoder.m: ([ConnectedEncoder -dismiss]): Changed the method used to send an encoded packet. * src/Connection.m: ([Connection -_service_forwardForProxy:]): Fixed another memory leak. * src/Dictionary.m: Added [-allKeys] and [-allValues] * src/Invocation.m: Added methods to encode bycopy over OPENSTEP D.O. * src/Makefile.in: Updated for new OPENSTEP D.O. classes etc. * src/NSConnection.m: New implementation for OPENSTEP D.O. * src/NSData.m: Altered to use NSHData as default concrete class and added serialization stuff from libFoundation. * src/NSDate.m: Added methods to ensure that NSDate objects are sent over the wire bycopy. * src/NSDistantObject: New implementation of this OPENSTEP class based on code from Proxy.m * src/NSFileHandle.m: Changed notification names for GNUstep extensions to have a GS prefix rather than an NS prefix. * src/NSGArchiver.m: Changed to work using NSHData objects. * src/NSHData.m: New version of NSData which supports memory mapped files and shared memory for large objects. * src/NSHost.m: A few minor changes to get this to compile without warnings under Linux. * src/NSPort.m: Implementation of this OPENSTEP class as a base class for real port objects. * src/NSPortCoder.m: New implementation of this OPENSTEP class based on the code from ConnectedCoder.m * src/NSProxy.m: New implementation of this class. * src/NSRange.m: (NSMakeRange()): added check for possible integer overflow. * src/NSRunLoop.m: Complete implementation of OPENSTEP API based on the code from RunLoop.m with some rewriting and lots of additions. * src/NSTimer.m: Altered to use NSRunLoop instead of RunLoop * src/Port.m: Changed to use timeouts when sending packets, use the OpenStep notification names, and be encoded bycopy with NSConnection. * src/RunLoop.m: removed this file - NSRunLoop does everything. * src/TcpPort.m: Alterations for revised version of nameserver protocol and to perform timeouts when sending data. * src/UnixFileHandle.m: Updated for changes in notification names and NSRunLoop class. * src/gdomap.c: Improved startup time, changed nameserver protocol to permit 4-byte port IDs (eg mach ports) and to permit the nameserver to be used by non-Distributed-Objects applications. * src/gdomap.c: Imroved nameserver protocol. * src/include/DistributedObjects.h: New header file to contain interface information which is only for internal used by the distributed objects system. * src/include/NSConnection.h: New interface definition file. * src/include/NSData.h: Corrected a few methods to conform to OpenStep. * src/include/NSDictionary.h: Changed methods to require NSObject keys rather than NSStrings. * src/include/NSDistantObject.h: New interface definition file. * src/include/NSFileHandle.h: Changed notification names for extensions. * src/include/NSHData.h: New interface definition file. * src/include/NSPort.h: New interface definition file. * src/include/NSPortCoder.h: New interface definition file. * src/include/NSProxy.h: New interface definition file. * src/include/NSRunLoop.h: Complete interface for NSRunLoop class. * src/include/NSSerialization.h: Fixed typos in method names. * src/include/Port.h: Changed Port to inherit from NSPort and added a timeout to the method for sending data. * src/include/RunLoop.h: Removed RunLoop stuff and changed it to use NSRunLoop instead. * src/include/UnixFileHandle.h: Changed gnustep extension notification names and altered class to work with new NSRunLoop. * src/include/byte_order.h: Incorporated this file from libFoundation. * src/mframe.m: (mframe_do_call()): modified this to tell the decoder function when it has finished so that the decoder can cleanup safely. Thu Aug 28 16:36:03 1997 Adam Fedor * src/NSUser.m (NSUserName): Check for login_name in other places (bug submitted by Manuel Guesdon . Tue Jul 15 13:55:19 1997 Gregor Hoffleit * configure.in: Check for getcwd and pthread library. * src/find_exec.c: Use getcwd if available. Fri Jul 11 13:55:19 1997 Richard Frith-Macdonald * checks/Makefile.in: Added nsfilehandle.m and improved 'clean' * checks/nsfilehandle.m: Rudimentary tests for NSFileHandle class. * src/LinkedList.m ([LinkedList -removeObject:]): Clear the pointer to the list in the removed list element so it know it is no longer in a list. * src/Makefile.in: Added NSFileHandle, UnixFileHandle and NSNotificationQueue. Fixed link libraries for gdomap. * src/NSDate.m: Added code to ensure that NSDate objects are always sent over the wire bycopy. * src/NSFileHandle.m: Implemented this OPENSTEP class in full. * src/NSFileManager.m ([NSFileManager -fileAttributesAtPath:traverseLink:): Fixed to return full list of attributes. ([NSFileManager -findNextFile): Fixed retain/release problem. * src/NSNotificationQueue.m: Imported class from libFoundation and modified for gstep-base with a few bug fixes and thread stuff. * src/NSPipe.m: Implemented this OPENSTEP class in full. * src/NSThread.m: Modified to ensure that a threads dictionary persists until the end of the thread! * src/NSNotificationDispatcher.m: Modified to avoid multiple identical notification observer requests and fixed posting of notifications so that observer requests can be safely removed by notification handlers. * src/RunLoop.m: Modifications for NSNotificationQueue, per-thread default run-loops, and safer file descriptor watching. * src/TcpPort.m: Added include for solaris. * src/UnixFileHandle.m: Wrote this class as a concrete implementation of NSFileHandle. * src/gdomap.c: Modified to make autolaunch of this daemon work more reliably. Also modified to make probes for other servers take place asynchronously. * src/gdomap.h: Tidied comments up a bit. * src/include/NSFileHandle.h: Added this OPENSTEP include file. * src/include/NSNotificationQueue.h: Added this from libFoundation. * src/include/UnixFileHandle.h: Added header file for UnixFileHandle. * src/mframe.m: Hacked this about to get all return types working for DO under linux on i386 family. Requires more work and compiler or Objective-C runtime support for a more general solution. Mon Jul 7 02:40:45 1997 Geoffrey Berry * src/NSString.m ([NSString -componentsSeparatedByString:]): Fixed calculation of new search range. Mon Jun 9 16:05:26 1997 ANOQ of the sun * src/NSAttributedString.m: New file. * src/NSGAttributedString.m: New file. * src/include/NSAttributedString.m: New file. * src/include/NSGAttributedString.m: New file. * src/Makefile.in: Add new files into lists. * checks/nsattributedstring.m: New file. * checks/Makefile.in: Add new file into list. Wed Jun 4 01:04:50 1997 Yoo C. Chung * src/include/preface.h.in: Include . * src/include/NSDate.h (NSTimeZone): Added new method -abbreviationMap. * src/NSCalendarDate.m: Adjust for time zone detail. ([NSCalendarDate -initWithYear:month:day:hour:minute:second:timeZone:]): Set time zone detail properly. ([NSCalendarDate -descriptionWithCalendarFormat:locale:]): Add case for '%Z'. ([NSCalendarDate -initWithString:calendarFormat:locale:]): Use local time zone, not default time zone detail. ([NSCalendarDate -initWithTimeIntervalSinceReferenceDate:]): Adjust for time zone detail. * src/tzfile.h: New file. * configure.in: Add check for endianness and int size. * src/NSTimeZone.m: New implementation. * src/include/NSDate.h (NSTimeZone): Remove unnecessary method declarations. (NSTimeZoneDetail): Likewise. Sun June 02 22:14:21 1997 Stevo Crvenkovski * src/NSGCString.m ([NSGCString -isEqualToString]): C string implementation from old NSString.m moved here and changed to check for class. * src/NSGCString.m ([NSGCString -setString]): Changed to avoid compiler warning. * src/NSGSequence.m ([NSGSequence -compare]): Changed for speed. * src/NSString.m ([NSString -isEqualToString]): New implementation, mutch faster. * src/NSString.m ([NSString -commonPrefixWithString]): Implemented recognition of composed characters. * src/NSString.m ([NXConstantString -characterAtIndex]): Method implemented. Thu May 15 08:59:13 1997 Yoo C. Chung * configure.in: Add check for getcwd(). * src/NSString.m ([NSString +initialize]): Removed casts for register_printf_function. (handle_printf_atsign): Set argument types for GNU libc. Sun May 21 23:12:24 1997 Stevo Crvenkovski * src/NSGSequence.m ([NSGSequence -decompose]): Reorganized code and changed to handle empty strings. * src/NSGSequence.m ([NSGSequence -order]): Added code to handle case when consecutive nonspacing characters have same canonical ordering priority. * src/NSString.m ([NSString -rangeOfComposedCharacterSequenceAtIndex:]): Changed to recognize end of string when last character is nonspacing. * src/NSString.m ([NSString -compare:options:range:]): Handle empty strings. * src/NSString.m ([NSString -hash]): Unicode version implemented and commented out for more testing. * src/NSString.m ([NSString -_normalizedString]): New private method for Unicode. * src/NSString.h ([NSString -_normalizedString]): New private method for Unicode declared. Tue May 20 09:29:47 1997 Adam Fedor * configure.in (VSPRINTF_RETURNS_LENGTH): Define as actual value of variable.. * checks/Makefile.in (LDFLAGS): Include DYNAMIC_LDFLAGS (BUNDLE_NAME.bundle): Add new Resources directory. * checks/nsbundle.m: Remove obsolete NSArgv. * src/MemoryStream.m ([MemoryStream -writeFormat:arguments]): Make sure buffer has at least 128 bytes free space. * src/NSBundle.m ([NSBundle -load]): New method. ([NSBundle -principalClass]): Use it. ([NSBundle +_bundleResourcePathsWithRootPath:subPath:]): New class method (was an instance method). Add search in GNUSTEP_LIBRARY_PATH. ([NSBundle +pathForResource:ofType:inRootPath:inDirectory:withVersion:]): New generalized search method. ([NSBundle +pathForResource:ofType:inDirectory:withVersion:]): Use it. ([NSBundle +pathForResource:ofType:inDirectory:]): Likewise. ([NSBundle -pathForResource:ofType:]): Likewise. ([NSBundle -pathForResource:ofType:inDirectory:]): Likewise. * src/include/NSBundle.h: New method definitions. * src/BinaryCStream.m: Include sys/types.h for SunOS4 definitions. * src/NSData.m: Include unistd.h for SunOS4 definitions. * src/StdioStream.m: Likewise. * src/Time.m: Likewise. Wen May 14 01:07:16 1997 Stevo Crvenkovski * src/NSGCString.m ([NSGCString -initWithCharactersNoCopy:length:freeWhenDone:]): Changed to invoke instance of NSGString. * src/NSGString.m ([NSGString -initWithCStringNoCopy:length:freeWhenDone:]): Changed to invoke instance of NSGCString. * src/NSGString.m ([NSGString -initWithCStringNoCopy:length:]): Method removed - it is in NSString. Sun May 11 10:12:11 1997 Stevo Crvenkovski * src/NSGCString.m ([NSGCString -fastestEncoding:]): Method implemented. * src/NSGCString.m ([NSGCString -smallestEncoding:]): Method implemented. * src/NSGCString.m ([NSGMutableCString -setString:]): C string implementation moved here from old version of NSString. * src/NSGString.m ([NSGString -fastestEncoding:]): Method implemented. * src/NSGString.m ([NSGString -smallestEncoding:]): Method implemented. * src/NSString.m ([NSString -initWithData:encoding:]): Method implemented. * src/NSString.m ([NSString -canBeConvertedToEncoding:]): Method implemented. * src/NSString.m ([NSString -dataUsingEncoding:]): Method implemented. * src/NSString.m ([NSString -dataUsingEncoding: allowLossyConversion]): partial implementation of method. * src/NSString.m ([NSString -fastestEncoding:]): Method implemented. * src/NSString.m ([NSString -smallestEncoding:]): Method implemented. * src/NSString.m ([NSString -stringByExpandingTildeInPath:]): changed for Unicode. * src/NSString.m ([NSString -writeToFile: atomically:useAuxiliaryFile:]): Method implemented. * src/NSString.m ([NXConstantString -fastestEncoding:]): Method implemented. * src/NSString.m ([NXConstantString -smallestEncoding:]): Method implemented. * src/Unicode.m (ustrtostr): changed to detect end of string. * src/Unicode.m (encode_strtoustr): New function. * src/Unicode.m (encode_ustrtostr): New function. Tue May 13 23:36:59 1997 Yoo C. Chung * src/NSString.m ([NSString -initWithFormat:arguments:]): Skip arguments dealt with in vsprintf(). Sun May 11 10:12:11 1997 Stevo Crvenkovski * src/NSString.m ([NSString -stringByAppendingString]): Changed to avoid calling wrong subclass. ([NSString -capitalizedString]): Likewise. ([NSString -lowercaseString]): Likewise. ([NSString -uppercaseString]): Likewise. Mon May 12 11:15:00 1997 Richard Frith-Macdonald * src/Collection.m ([Collection -copyAs:]): Modified so that copied objects are released once the new collection has retained them. This ensures that when the new collection is deallocated, the copied objects it contains are deallocated as well. * src/NSArray.m ([NSArray -initWithArray:]): Free temporary C array opf objects when we are done with it - fixes memory leak. ([NSArray -copy:]) Added method to ensure copyWithZone: is called. ([NSArray -sortUsingSelector:]) Added method. * src/NSDate.m ([NSDate -copyWithZone:]): Sometimes just retain a date. * src/NSObject.m ([NSObject -retainCount]): Take autorelease stuff into account in determining retain count for an object. Added new function 'extraRefCount()' to do what -retainCount used to. Modified -release and -autorelease to use extraRefCount(). * src/include/NSArray.h: Added -sortUsingSelector: Thu May 8 02:10:35 1997 Yoo C. Chung * src/NSString.m: Removed the redefinition of HAVE_REGISTER_PRINTF_FUNCTION. * src/NSZone.m (BUFFER): Reduced buffer size to 4. * src/NSAssertionHandler.m: Include "NSObjCRuntime.h". Use NSLog() to log errors. Reason for exception now identical to log messages. * configure.in: AC_TYPE_SIZE_T, AC_C_INLINE added. * src/include/NSZone.h: Removed inline keywords for functions that are potentially fluid. * src/NSThread.m ([NSThread +detachNewThreadSelector:toTarget:withObject:]): Post NSBecomingMultiThreaded. * src/StdioStream.m: Define _REENTRANT. ([StdioStream -initWithFilename:fmode:]): Use NSLog() to log errors. ([StdioStream -initWithFileDescriptor:fmode:]): Likewise. * src/NSThread.m: Removed [-exceptionHandler] and [-setExceptionHandler]. * src/include/NSThread.h: Likewise. * src/NSException.m: Use member variables directly to obtain and set exception handlers. * src/Makefile.in (FILE_AUTHORS): Added new person. * src/include/NSPage.h: Changed e-mail address. Thu May 8 15:45:00 1997 Richard Frith-Macdonald * src/Proxy.m: (+newForRemoteTarget:connection:) When an existing proxy is substituted for a newly allocated one we must retain it. * src/Proxy.m: (+newWithCoder:) When an object is substituted for a local proxy we must retain it. * src/Connection.m: (forwardForProxy:selector:argframe:) Ensure that objects created by the decoder are autoreleased. * src/Connection.m: (_service_forwardForProxy:) Ensure that objects created by the decoder are autoreleased. * src/Connection.m: (_getReceivedReplyRmcWithSequenceNumber:) Ensure that a newly allocated NSdate objects is released on return from this method. Fixes a memory leak. * src/NSGCString.m: Added an implementation of dealloc which will cause the string contents to be released correctly - fixing a major memory leak. * src/NSString.m (handle_printf_atsign()) Modified so that the '%@' format prints an objects description as it should according to the OpenStep spec. * src/NSString.m (- initWithFormat:arguments:) Modified so that the '%@' format prints an objects description as it should according to the OpenStep spec. * src/NSString.m (- componentsSeparatedByString:) Fixed to produce the final component of the string. * src/NSString.m (- rangeOfString:options:range:) Return a range of length 0 if passed an empty string. * src/NSString.m (- lastPathComponent) Do autorelease for newly created substrings. * src/NSString.m (- pathExtention) Do autorelease for newly created substrings. * src/NSString.m (- stringByAppendingPathComponent:) Added code to handle empty or illegal path components. * src/NSString.m (- stringByAppendingPathExtension:) Added code to handle empty or illegal path extensions. * src/NSString.m (- stringByDeletingLastPathComponent:) Fixed some special cases - autorelease for newly created substrings. * src/NSString.m (- stringByExpandingTildeInPath:) Do autorelease for newly created substrings. * src/NSString.m (- stringByAbbreviatingWithTildeInPath:) Do autorelease for newly created substrings. Wed May 7 15:45:00 1997 Richard Frith-Macdonald * checks/server.m: Removed line which released object which should already have been autoreleased by D.O. mechanism. * src/Coder.m: ([Coder -init]): Modified so that subclasses can be initialised using 'init'. ([Coder -initForReadingWithData:]) Check to see if 'self' has been autoreleased. If it has - be graceful and don't release self again but autorelease the newly created object. I know that this should not be necessary, but it's defensive programming. * src/Makefile: Changed 'make distclean' to remove links to the header files directory so that it's easy to make a clean setup for generating patches. * src/NSArchiver.m: ([NSArchiver -init]): Modified to say that the subclass should handle this. ([NSArchiver +archivedDataWithRootObject:]): Added a release to fix memory leak. * src/NSGArchiver.m: Added implementation of init method. ([NSGArchiver -archiverData]): Addep partial implementation of this method - only works if the archiver was initialised with an NSMutableData object, returns nul otherwise. This probably covers pretty much all the cases where you would want to use this method. * src/NSObject.m: ([NSObject -returnCount]): Fixed this to return zero for the cases where the object is not in the retain count map. * src/include/NSRunLoop.h: Added protocol declarations etc so that you don't need to include RunLoop.h Tue May 6 14:50:35 1997 John Stevens * src/Array.m ([Array -appendObject:]): Check for nil object. ([Array -insetObject:atIndex:]): Likewise. * src/NSArray.m ([NSArray -initWithObjects:rest:]): Good varargs implementation. * src/NSData.m: ([NSData -getBytes:range:]): Check range. ([NData -replaceBytesInRange:withByte:]): Likewise. ([NSData -resetBytesInTange:]): Likewise. Mon May 5 16:00:00 1997 Richard Frith-Macdonald * src/Connection.m: ([Connection -forwardForProxy:selector:argFrame:]): Added code to autorelease newly created objects to avoid memory leak. ([Connection -_service_forwardForProxy:]): Added code to autorelease newly created objects to avoid memory leak. ([Connection -_getReceivedReplyRmcWithSequenceNumber:]): Release locally created NSDate object before returning from method. * src/NSGString.m: ([NSGCString -dealloc:]): Added implementation so that allocated memory can be freed. ([NSGCString -initWithCoder:]): Set flag to say that contents should be freed when object is deallocated. * src/NSGSequence.m: Added +sequenceWithCharactersNoCopy:length:freeWhenDone:. Added -dealloc so that Sequence contents can be freed. ([NSGSequence -initWithCharactersNoCopy:length:freeWhenDone:]): Modified to release sequence contents if necessary (when the designated initialiser is called more than once). ([NSGSequence -decompose]): Fixed memory leak in this method. ([NSGSequence -lowercase]): Fixed memory leak in this method. ([NSGSequence -uppercase]): Fixed memory leak in this method. * src/NSGString.m: Added -dealloc so that string contents can be freed. ([NSGString -encodeWithCoder]): Fixed to encode array of unichar. ([NSGString -initWithCoder]): Fixed to expect encoded array of unichar. * src/NSGMutableString.m: ([NSGMutableString -insertString:atIndex:]): Fixed memory leak. ([NSGMutableString -encodeWithCoder:]): Encode array of unichar. ([NSGMutableString -initWithCoder]): Expect encoded array of unichar. * src/NSString.m: ([NSString -compare:options:range]): Fixed a memory leak. ([NSString -commonPrefixWithString:options:]): Fixed a memory leak. * src/Proxy.m: ([Proxy +newForRemoteTarget:connection:]): When we return an existing Proxy, retain it. ([Proxy +newWithCoder:connection:]): When we return a local object, retain it. * src/RunLoop.m: ([RunLoop -removeReadDescriptor:forMode:]): free enumeration state on return. ([RunLoop -removeWriteDescriptor:forMode:]): free enumeration state on return. ([RunLoop -acceptInputForMode:beforeDate:]): free enumeration states when done with them. * src/include/NSGSequence.h: Added class method +sequenceWithCharactersNoCopy:length:freeWhenDone:. * src/NSDate.m: Added implementations for methods - -copyWithZone:, -encodeWithCoder: -initWithCoder:. * src/include/NSDate.h: Added protocol conformance for NScopying and NSCoding. Sat May 3 12:28:48 1997 Andrew McCallum * src/Makefile.in (GNUSTEP_OTHER_SRCFILES): Add gdomap.c and gdomap.h. * checks/NSData-test.m: New file from John Stevens . * src/Makefile.in (GNUSTEP_HEADERS): Add include/NSConnection.h. * doc/news.texi: Fix typo. * doc/install.texi: Fix typo. * Makefile.in (DIST_FILES): Add config.sub. * src/NSBundle.m: Temporarily comment out some code with #if 0/1 so it will compile. Get Adam Fedor or someone to fix it. * src/NSCharacterSet.m: Likewise. * src/include/NSConnection.h: Include some files. * src/Makefile.in (GNUSTEP_HEADERS): Add NSDistantObject.h. * src/include/NSDistantObject.h: New file. * src/gdomap.c: Delete duplicate copy inside file. * src/TcpPort.m: #include . Define GDOMAP to be 0 for now; have Richard Frith-Macdonald verify that it works for me. (tryWrite): Change type of IFUN to match declaration of signal(). Cast second argument to signal() to avoid warning. ([TcpInPort +newForReceivingFromPortNumber:]): Use P->_PORT_SOCKET not P->_SOCKET, which doesn't exist. Likewise in several other methods. * src/NSString.m: Remove some duplicate methods. * src/NSHost.m: Don't include . Include . * src/Connection.m: Include for delegate method declaration. ([Connection +newForInPort:outPort:ancestorConnection:]): Cast NEWCONN to avoid warning. * src/Makefile.in (GNUSTEP_OTHER_SRCFILES): Move NSHost.m temporarily here until its debugged. (GNUSTEP_MFILES): Temporarily remove NSHost.m. * src/NSDate.m ([NSDate -timeIntervalSince1970]): Remove duplicate method definition. * src/NSArchiver.m ([NSArchiver -init]): New method. (Need for it reported by Richard Frith-Macdonald .) * src/NSArchiver.m ([NSArchiver -encodeClassName:intoClassName:]): Fix typo in method name. * src/include/NSArchiver.h: Fix typo in method name. * src/TcpPort.m (nameServer): Remove the ntohs() conversion of NUM. (Reported by Richard Frith-Macdonald >) * src/NSCharacterSet.m ([NSCharacterSet_PATH]): Value of global variable changed to absolute path. (Reported by Richard Frith-Macdonald .) * checks/Makefile.in (SRCS): Added NSData-test.m. * src/Decoder.m ([Decoder -decodeObjectAt:anObjPtr:name]) [CODER_OBJECT_REPEATED]: Retain the object before returning it by reference. (Reported by Richard Frith-Macdonald .) * src/NSHashTable.m (NSNonRetainedObjectHashCallBacks): Renamed from NSNonRetainedObjectsHashCallBacks to conform to spec. * src/include/NSHashTable.h: Likewise. * src/Makefile.in (UNICODE_HEADERS): New variable. (DIST_FILES): Add UNICODE_HEADERS. (copy-dist): Create directory for unicode. * examples/Makefile.in (RCS_FILES): Added custom-zone.m. * examples/custom-zone.m: New file. * src/NSBundle.m ([NSBundle +pathForResource:ofType:inDirectory:]): Change it from an instance method to a class method, in order to conform to spec. * src/include/NSBundle.h ([NSBundle +pathForResource:ofType:inDirectory:]): Likewise. * src/NSCharacterSet.m ([NSCharacterSet +_bitmapForSet:number:]): Revert last change. * src/Makefile.in (GNUSTEP_HEADERS): Added include/NSHost.h. (GNUSTEP_MFILES): Added NSHost.m. * src/NSCharacterSet.m ([NSCharacterSet +_bitmapForSet:number:]): Use NSBundle's pathForResource:ofType:inDirectory method properly. (Reported by Stevo Crvenkovski .) Fri Apr 25 01:30:00 1997 Richard Frith-Macdonald * src/NSBundle.m: Added missing methods to conform to OpenStep spec, also added [+ pathForResource:ofType:inDirectory:] * src/include/NSBundle.h: Added missing methods to conform to OpenStep spec. Thu Apr 24 10:30:00 1997 Richard Frith-Macdonald * src/Makefile.in: Added stuff to build and install the name server (gdomap). * src/RunLoop.m: Minor change to ensure that repeated timers are not lost. * src/TcpPort.m: Major changes to support use of a name server for handling TCP port numbers and fix a few bugs. * src/gdomap.c: This is the name server source. * src/gdomap.h: This is the name server header file. * src/include/NSRunLoop.h: Added methods for monitoring file descriptors. Sat Mar 29 00:43:18 1997 Yoo C. Chung * src/NSZone.m: New e-mail address. Default default zone alignment problems fixed. Sun Mar 23 19:55:19 1997 Mark Kettenis * src/Makefile.in: Update config.h.in in $(srcdir)/src/include. * configure.in: Look for config.guess in $(srcdir). Sat Mar 22 18:25:43 1997 Mark Kettenis * src/NSDate.m ([NSDate +timeIntervalSinceReferenceDate]): Don't use struct timezone. ([NSDate -timeIntervalSince1970]): New method. ([NSDate -isEqual:]): Correct bug if other specifies a later date. Sun Mar 23 22:14:21 1997 Stevo Crvenkovski * src/NSGString.m: New file Initial implementation of Unicode * src/include/NSGString.h : New file Interface for NSGString * src/NSGSequence.m: New file - class that deals with Unicode composite character sequences * src/include/NSGSequence.h : New file Interface for NSGSequence * src/Unicode.m: New file - functions for Unicode * src/include/Unicode.h : New file * src/Makefile.in: Added NSGString.m, NSGString.h, NSGSequence.m, NSGSequence.h, Unicode.m, Unicode.h * src/NSGCString.m ([NSGCString -length]): Method implemented. ([NSGCString -characterAtIndex]): Changed to work with encodings ([NSGCString -_baseLength]): private method for composite character sequences. ([NSGCString -initWithString:]): CString implementation moved here from NSString.m * src/NSString.m : Changed NSString_concrete_class to NSGString and NSMutableString_concrete_class to NSGMutableCString ([NSString +stringWithCharacters]): Method implemented. ([NSString -initWithCharacters:length:]): Method implemented. ([NSString -stringByAppendingString]): changed for Unicode. ([NSString -rangeOfString]): split method into 8 private _search* methods and implemented full Unicode ([NSString -compare:options:range:]): changed for Unicode. ([NSString -isEqualToString]): changed for Unicode ([NSString -description]): changed. ([NSString -commonPrefixWithString]): changed for Unicode ([NSString -capitalizedString]): changed for Unicode ([NSString -lowercaseString]): changed for Unicode ([NSString -uppercaseString]): changed for Unicode ([NSString -getCString]): changed for Unicode ([NSString -defaultCStringEncoding]): method implemented ([NSString -_baseLength]): private method for composite sequences. ([NSString -stringWithFormat:]): null terminate buffer. *src/unicode : New directory - temporary holds data for unicode functions. *src/unicode/caseconv.h : New file *src/unicode/cop.h : New file *src/unicode/cyrillic.h : New file *src/unicode/decomp.h : New file *src/unicode/nextstep.h : New file Fri Feb 14 08:51:39 1997 Yoo C. Chung * src/NSZone.m: Use [NSString -cStringNoCopy]. Wed Feb 12 13:51:42 1997 Yoo C. Chung * src/NSZone.m (frealloc): memcpy() with proper size. * examples/custom-zone.m (custom_recycle): Release zone name. * src/NSZone.m (frealloc): Moved assignment out of a critical block. Tue Feb 11 22:55:05 1997 Yoo C. Chung * examples/custom-zone.m: New file. Sun Feb 9 20:28:00 1997 Yoo C. Chung * src/NSZone.m (NSZoneRegisterRegion): New function. (NSDeregisterZone): New function. * src/include/NSZone.h: Added 'NSZoneRegisterRegion' and 'NSDeregisterZone'. Thu Mar 6 08:57:29 1997 Scott Christley * src/NSString.m (-substringToIndex:): Should return characters upto but not including the one at index. (lastPathComponent, stringByDeletingLastPathComponent): Modify for -substringToIndex: change. (stringByDeletingPathExtension): Likewise. Tue Mar 4 10:47:18 1997 Scott Christley * src/NSBundle.m: Don't look in gnustep installation library directory; remove previous patch. * src/NSCharacter.m: Create bundle with path instead of using main bundle. * src/NSString.m (-stringByAppendingPathComponent:): Don't even check the length; only care if we found the string at the very last position. (-stringByAppendingPathExtension:): Likewise. * src/include/preface.h.in: Include NSObjCRuntime so that NSLog() is declared. * src/include/NSString.h (+stringWithContentsOfFile:): Add missing declaration. Thu Feb 27 13:46:10 1997 Scott Christley * configure.in: Fill out description of parameter. * src/Makefile.in (GNUSTEP_INSTALL_LIBDIR): Use quotes. * src/NSBundle.m: Add gnustep installation library directory to the directories searched. * src/NSCharacterSet.m (NSCharacterSet_PATH): Don't specify full path, just bundle directory. * src/NSRange.m (NSMakeRange): Correct prototype. * src/include/NSRange.h (NSMakeRange): Likewise. * src/NSString.m (stringByAppendingExtension:): The length will actually be zero if the period isn't found. (stringByAppendingPathComponent:): Likewise. Tue Jan 21 17:09:09 CST 1997 Jeremy Bettis * src/NSGCString.m: Add -appendString:. * src/include/NSString.h: Add +string. * src/NSString.m: (handle_printf_atsign) Take the description of the object before the cStringNoCopy. ([NSString +allocWithZone:],[NSMutableString +allocWithZone:]) Only return the concrete class if [self class] == NSString to allow subclassing. Tue Mar 4 10:51:22 1997 Andrew McCallum * src/NSConnection.m: New file. * src/include/NSConnection.h: Add copyright and fix method declaration. * src/Connection.m ([Connection -registerName:]): New method. ([Connection +newForInPort:outPort:ancestorConnection:]): Ask the delegate for permission to create the new connection. We were already doing it GNUstep-style. Do it OpenStep-style also. * src/NSGArchiver.m ([NSGArchiver -archiverData]): New method. No implementation. The above was actually checked in May 3 1997. * src/Connection.m ([Connection -forwardForProxy:selector:argFrame:]): In nested function decoder(), always set IP to -1 after sending it -dismiss, i.e. in both cases. Fix the assertion at the bottom so that IP is allowed to be nil, which will be the case when mframe_build_return() never calls decoder(), which will happen when we are returning void. * src/Decoder.m ([Decoder -finishDecodingInterconnectedObjects]): Comment fixes. * src/Proxy.m ([Proxy -awakeAfterUsingCoder:]): New method. Needed otherwise we get an infinite loop with Decoder trying to send this message to a Proxy. Mon Mar 3 14:41:01 1997 Andrew McCallum * doc/install.texi: Describe what happens when libieee.a isn't available. * configure.in: Remove obsolete AC_C_CROSS. * doc/Makefile.in (TEXI_FILES): Added gnustep-zones.texi. * src/NSHost.m, src/include/NSHost.h: New files from Luke Howard . Tue Feb 25 17:12:52 1997 Scott Christley * configure.in: Add macro to determine host, build, and target. (whole_archive, no_whole_archive): Optional linker variables for specifying when the linker should include the whole archive. * configure: Regenerate for configure.in changes. * Makefile.in: Force targets. * config.sub: New file. * NSCharacterSets/Makefile.in: Use configure datadir variable. Install character set files in NSCharacterSets subdirectory within GNUstep library install dir. * checks/heap.m: random is rand on _WIN32. * checks/nscharacterset.m: New file * checks/Makefile.in: Add nscharacterset.m. Surround gnustep-base library with new linker variables. * checks/release.m: No malloc.h on _WIN32. * examples/Makefile.in: Surround gnustep-base library with new linker variables. * doc/Makefile.in: Use configure infodir variable. * src/NSFileManager.m: New file. * src/include/NSFileManager.h: New file. * src/Makefile.in: Add NSFileManager files. (GNUSTEP_INSTALL_LIBDIR): New definition. Use configure libdir and includedir variables. Use the LN_S variable for soft links. Slightly modify creation of gnustep/base for platforms which don't support soft links. (install:): Install only the NEXTSTEP_HEADERS into objc directory and eliminate out-dated README file link. (uninstall:): Remove only NEXTSTEP_HEADERS out of objc directory. * src/NSCharacterSets.m (NSCharacterSet_PATH): Search for character set files in NSCharacterSets subdirectory within GNUstep library installation directory. * src/NSDate.m (-initWithTimeIntervalSince1970:): New method. (-timeIntervalSince1970): New method. * src/include/NSDate.h (-initWithTimeIntervalSince1970:): New method. (-timeIntervalSince1970): New method. * src/NSDictionary.m: Changed key datatype from NSString to NSObject to correspond with OpenStep specification. * src/NSGDictionary.m: Likewise. * src/include/NSDictionary.h: Likewise. (+dictionaryWithObjectsAndKeys:,...): Define method. * src/NSNumber.m (+numberWithLong:): Use correct class. * src/NSString.m (-description:): Just return self. (+stringWithContentsOfFile:): New method. (-componentsSeparatedByString:): Fix range calculation and make sure last component is added. (-appendString:): Don't attempt append if nil string. * src/NSUserDefaults.m (__changePersitentDomain:) Corrected spelling of method. * src/TcpPort.m (_socket): Rename to _port_socket to avoid conflict with hidden system variables. * src/include/TcpPort.h (_socket): Likewise. * src/UdpPort.m (_socket): Likewise. * src/include/UdpPort.h (_socket): Likewise. * src/include/NSObject.h: Include fake-main.h. Thu Feb 6 09:20:05 1997 Yoo C. Chung * src/NSZone.m (fcheck): Implemented. (fstats): Likewise. (ncheck): Likewise. (nstats): Likewise. * src/include/NSZone.h: New declarations of 'NSZoneRegisterChunk' and 'NSZoneChunkOverhead'. Include instead of . * src/NSZone.m: Removed 'outmemstr'. Better reasons given when raising exceptions. (frecycle): Use objc_free(). (nrecycle): Likewise. (NSCreateZone): Check allocation of 'zone'. (default_check): New function. (default_stats): Likewise. (fcheck): Likewise. (fstats): Likewise. (ncheck): Likewise. (nstats): Likewise. (NSZoneChunkOverhead): Likewise. (NSZoneRegisterChunk): Likewise. (NSZoneCheck): Likewise. (NSZoneStats): Likewise. (default_zone): Set the zone name to "default". Wed Feb 5 21:29:23 1997 Yoo C. Chung * src/include/NSZone.h (struct _NSZoneStats): New structure. (struct _NSZone): Added 'check' and 'stats'. (NSZoneCheck): New declaration. (NSZoneStats): Likewise. Tue Feb 4 22:39:50 1997 Yoo C. Chung * src/NSZone.m (nmalloc): Return NULL when size is 0. Tue Feb 4 09:16:05 1997 Yoo C. Chung * src/NSZone.m (NSSetDefaultMallocZone): New function. (get_chunk): Use objc_malloc() to get more memory. (nmalloc): Likewise. (NSCreateZone): Likewise. (NSSetZoneName): Removed locks. * src/NSAutoreleasePool.m ([NSAutoreleasePool -dealloc]): Don't check whether we're releasing an already deallocated object. * src/include/NSZone.h (struct _NSZone): Removed mutex. Removed NSZoneMemInUse(). Added NSSetDefaultMallocZone(). * src/NSZone.m: Changed comments. Uses objc_malloc() and friends for default zone. Moved mutex out of NSZone structure. Use mutex functions even in single threaded case. (NSZoneMemInUse): Removed. Fri Jan 24 19:12:18 1997 Yoo C. Chung * src/NSZone.m: Spell checked comments. Tue Jan 21 13:31:11 1997 Yoo C. Chung * src/NSZone.m (default_recycle): New function. (nrealloc): Likewise. (nfree): Likewise. (default_zone): Set common.recycle to default_recycle. (NSCreateZone): Set realloc and free for nonfreeable zone. * src/include/NSThread.h: Add comments. * src/NSThread.m ([NSThread -setExceptionHandler:]): Add comments. ([NSThread -exceptionHandler]): Likewise. ([NSThread +detachNewThreadSelector:toTarget:withObject:]): Set entered_multi_threaded_state to YES. Tue Jan 21 11:18:32 1997 Yoo C. Chung * checks/thread-except.m: New file. * checks/Makefile.in (SRCS): Added thread-except.m. * src/NSAssertionHandler.m ([NSAssertionHandler +currentHandler]): Handle multiple threads. * src/NSException.m: Removed e_handlers. ([NSException -raise]): Support multiple threads. (_NSAddHandler): Likewise. (_NSRemoveHandler): Likewise. * src/NSThread.m ([NSThread -init]): Init _exception_handler. ([NSThread -exceptionHandler]): New method. ([NSThread -setExceptionHandler:]): Likewise. * src/include/NSThread.h (NSThread): Added _exception_handler and new methods exceptionHandler and setExceptionHandler. Mon Jan 20 09:46:00 1997 Yoo C. Chung * src/NSException.m: Use linked list instead of NSArray. Fit lines within 80 columns. * src/NSZone.m (nmalloc): Use CHUNKSIZE to get new block size instead of SIZE. Mon Jan 20 00:15:39 1997 Yoo C. Chung * src/NSAllocateObject.m: Include NSZone.h. * src/NSZone.m: Changed ffree_NSZone and nfree_NSZone to ffree_zone and nfree_zone. Changed lock functions return types to ints. (become_threaded): Set mutex functions. (NSZoneMemInUse): Properly check buffer. (nmalloc): Removed unnecessary declaration of block. (NSCreateZone): Moved assignment of block out of exception handled area. (NSCreateZone): Fixed typo (objc_mutex_deallocate instead of objc_mutex_dealloc). (NSZoneMemInUse): Consider cases when memory is in buffer. * src/NSData.m ([NSData -description]): Frees malloced memory. * src/NSPage.m (NSAllocateMemoryPages): Return NULL if we fail to allocate memory. * src/NSObject.m (NSShouldRetainWithZone): Check match for NSDefaultMallocZone(). Fri Jan 17 20:08:00 1997 Yoo C. Chung * src/o_x_bas.m.in (o_@XX@_zone): Use NSZoneFromPointer(). (_o_@XX@_alloc_with_zone): Remove unnecessary assignment. * src/o_array.m (o_array_alloc): Use NSDefaultMallocZone(). * src/o_hash.m (o_hash_alloc): Likewise. (o_hash_copy): Likewise. * src/o_list.m (o_list_alloc): Likewise. (o_list_copy): Likewise. * src/include/o_array.h (_o_array): Remove zone. It's just a waste of space when we have a very fast NSZoneFromPointer(). * src/include/o_hash.h (_o_hash): Likewise. * src/include/o_list.h (_o_list): Likewise. * src/include/o_map.h (_o_map): Likewise. * src/include/NSZone.h: New implementation. * src/include/NSPage.h: New file. * src/include/NSException.h (NS_HANDLER): Separate declaration and assignment of localException. This is to shut up gcc when we don't use localException. * src/StdioStream.m ([StdioStream -dealloc]): Removed call to fclose(). * src/NSZone.m: New implementation. * src/NSDeallocateObject.m: Simplified. * src/NSAutoreleasePool.m: Included NSZone.h. ([NSAutoreleasePool -dealloc]): Use NSZoneMemInUse(). * src/Makefile.in (GNUSTEP_HEADERS): Added NSPage.h. Sun Jan 12 13:46:38 1997 Andrew McCallum * Version (SUBMINOR_VERSION): Version 0.2.12. There seems to be a problem with Richard's and my patches to distributed objects, but many other bug fixes have been added, NSZone has a complete re-write, -awakeAfterUsingCoder: is now called, and NSString is all cleaned up and ready to go. Richard and I will work on fixing D.O. for the next release. * examples/second-client.m: Include instead of . * examples/second-server.m: Likewise. * examples/first-client.m: Likewise. * examples/first-server.m: Likewise. Finish code necessary for versioning in CStreams and Coders. Test this code by actually making a new format for BinaryCStream; files created with the new format should be, on average, 4/5 the size of the previous ones, and it should be faster. This is now the default format, but files created with the old format should still be readable. * src/BinaryCStream.m (PRE_SIZEOF_PREFIX_FORMAT_VERSION): New macro for old version number. (CURRENT_FORMAT_VERSION): New macro. (DEFAULT_FORMAT_VERSION): Changed from 0 to 1. ([BinaryCStream -_initForReadingFromPostSignatureStream: withFormatVersion:]): New method. ([BinaryCStream -initForWritingToStream:swithFormatVersion:]): New method. (WRITE_SIGNED_TYPE0): Renamed from WRITE_SIGNED_TYPE. (WRITE_SIGNED_TYPE1): New macro. (WRITE_SIGNED_TYPE): New macro for choosing between them. (READ_SIGNED_TYPE0): Renamed from READ_SIGNED_TYPE. (READ_SIGNED_TYPE1): New macro. (READ_SIGNED_TYPE): New macro for choosing between them. (WRITE_UNSIGNED_TYPE0, WRITE_UNSIGNED_TYPE1, WRITE_SIGNED_UNTYPE, READ_UNSIGNED_TYPE0, READ_UNSIGNED_TYPE1, READ_UNSIGNED_TYPE): Likewise. ([BinaryCStream -encodeValueOfCType:at:withName:name]): Don't use `unsigned' as part of the argument to the *_UNSIGNED_TYPE macros, because the macros now include that themselves. * src/CStream.m ([CStream -_initForReadingFromPostSignatureStream: withFormatVersion:]): New method. ([CStream +cStreamReadingFromStream:s]): Use it. ([CStream -initForReadingFromStream:swithFormatVersion:]): Likewise. * src/include/BinaryCStream.h (BinaryCStream): Declare new ivars for holding sizeof C types. * src/include/CStream.h: Declare designated method for reading. * src/include/NSProcessInfo.h: Include Sat Jan 11 16:34:57 1997 Andrew McCallum * src/NSZone.m (NSCreateZone): Call initialize(), so that we won't crash if someone tries to create an object before main() and before initialize() gets called as a constructor. (NSDefaultMallocZone): Likewise. (initialize): Use a static variable to return immediately if we've been run already. * checks/string.m (main): Use NSDefaultMallocZone() instead of NS_NO_ZONE. Thu Jan 9 10:45:10 1997 Andrew McCallum * checks/client.m: Include instead of . (main): Use class NSString instead of String. * checks/server.m: Include instead of . * src/objc/NXStringTable.h (STRVAL): Make it a macro instead of an inline function to avoid warning. * src/NSPage.m (NSLogPageSize): Use NSPageSize() instead of ns_page_size(). (NSRoundDownToMultipleOfPageSize): Likewise. (NSRoundUpToMultipleOfPageSize): Likewise. * src/NSString.m ([NSString -copy]): Use NSDefaultMallocZone() instead of NS_NO_ZONE. * src/NSCharacterSet.m ([NSCharacterSet +_bitmapForSet:number:]): Remove last parameter from calls to [NSBundle pathForResource...]. The method doesn't exist. * src/NSBundle.m: Rearrange #include's a little. * src/Connection.m ([Connection -_getReceivedReplyRmcWithSequenceNumber:]): Break if the RunLoop returns NO. (Reported by Richard Frith-Macdonald .) * src/NSDictionary.m ([NSDictionary +dictionaryWithContentsOfFile:]): Method implemented. (From Scott Christley.) * src/NSString.m ([NSString -initWithFormat:arguments:]): Increase BUFFER_EXTRA by a factor of 500. * src/Foundation/NSZone.h (ZoneLock): Don't prepend OBJC_MUTEX_T with an underscore. * src/mframe.m (mframe_build_return): Change the way values of type smaller than int are returned---don't offset into the int. (Recommended by Richard Frith-Macdonald .) Thu Jan 9 17:06:00 1996 Richard frith-Macdonald * src/NSTimer.m ([NSTimer -compare:]): Added an implementation of 'compare:' which compares timers by fire date. This is required for the timers to be kept in the correct order by the Heap in Runloop. Fixes a problem where a timer could be delayed indefinately. Wed Dec 04 12:39:24 1996 Scott Christley * src/Makefile.sed.nt: remove Foundation directory if it exists before installing header files. Don't regenerate lex.sf.m. * src/NSSet.m (-unionSet:): Implement method. (-intersectSet:, -minusSet:): Implement methods. * src/NSString.m (-initWithContentsOfFile:): Use Win32 specific functions for file operations. * src/md5.c: Include config header file. * src/include/config-win32.h: vsprintf returns length on Win32. * src/NSUser.m (NSHomeDirectoryForUser, NSUserName): Implement Win32 specific versions. Thu Nov 21 12:00:44 1996 Scott Christley * src/include/NSDictionary.h (+dictionaryWithContentsOfFile:): New method. * src/proplist.l (COMMENT, LINE_COMMENT): Added lexical rules for traditional C comments and ObjC line comments. Add carriage return '\r' as part of whitespace rules. * src/lex.pl.m: Regenerated with proplist.l changes. * src/proplist.tab.m: Likewise. * src/NSArray.m (-sortedArrayUsingSelector:): Implemented. (-sortedArrayUsingFunction:context:): Implemented. (-sortUsingFunction:context:): Implemented. * checks/nsarray.m: Add tests for sorting methods. Tue Nov 19 09:06:00 1996 Richard Frith-Macdonald * src/ConnectedCoder.m: Release packet after invoking initialisation method of super which retains it. To fix memory leaks. * src/Connection.m (+rootProxyAtName:onHost:): Return nil if we can't create port. (-forwardForProxy:selector:argFrame:): Modified to cooperate better with mframe_build_return() so that the created decoder is released reliably. Fixes a memory leak. (-_getReceivedReplyRmcWithSequenceNumber:): Added code to release allocated NSDate object on exit - fixes a memory leak. * src/Decoder.m (-_coderCreateReferenceForObject:): Changed code to release dummy object after insertion in array (which retains it). fixes memory leak. * src/Encoder.m (-initForWritingToStream:withFormatVersion: cStreamClass:cStreamFormatVersion:): Release stream after invoking initialisation method of super which retains it. To fix memory leaks. * src/KeyedCollection.m (-dealloc): Added call to NSDeallocateObject() to ensure that the memory used by the enumerator is released. * src/RunLoop.m: Changed code to get timers to work correctly and enabled timer support by default. Fixed all the cases I could spot where the '_current_mode' could be left in the wrong state. Modified so that the object listening on a file descriptor need not be the same as the object speaking on it. Added code to release the enumerator state information for Bags after use - fixes memory leak. * src/mframe.m (mframe_build_return): Modified to cooperate better with [Connection -forwardForProxy:selector:argFrame:]. Mon Jan 6 16:06:21 1997 Andrew McCallum * src/NSDictionary.m ([NSDictionary -initWithContentsOfFile:]): Implemented. (By David Wetzel .) * src/NSAssertionHandler.m [NSAssertionHandler -handleFailureInMethod:object:file: lineNumber:description:]: Use the FORMAT argument! (Reported by Wolfgang Baron .) * src/NSString.m ([NSString -hasPrefix:]): Fix logic to return correct value. (Reported by David Wetzel .) * src/NSString.m ([NSString -description]): Free DEST to prevent memory leak! (Reported by Wolfgang Baron .) * src/NSException.m (_NSUncaughtExceptionHandler): Don't declare it static. (Reported by John Hethcox .) * src/BinaryCStream.m (BITSPERBYTE): If it hasn't been defined after #include's guess that it's 8. * checks/nsscanner.m: Removed RCS keyword. Sat Nov 16 23:39:11 1996 Yoo C. Chung * src/NSPage.m (NSLogPageSize): Fix logic to return correct value. Wed Nov 13 16:27:39 1996 Adam Fedor * aclocal.m4 (OBJC_SYS_DYNAMIC_FLAGS): Check if executable needs dynamic ldflags. * checks/Makefile.in (LDFLAGS): Include dynamic ldflags. (BUNDLE_NAME.bundle): Add new Resources directory. * configure.in: Provide platform definition. Check DIR definitions. * src/Makefile.in (DEFS): Use platform definition. * src/NSBundle.m: Rewrite of NSBundle class to cache bundles and update searching of resources. _bundles and _releasedBundles are static NSMapTables for caching bundles. (bundle_object_name): Use executable name, if provided. (_bundle_resource_path): Use NSString methods. (_bundle_path_for_name): New function. ([NSBundle -_bundleClasses]): New private method. ([NSBundle +mainBundle]): Use NSString methods. ([NSBundle +bundleForClass]): New search process using map tables. ([NSBundle -initWithPath]): Likewise. ([NSBundle -release]): New method. ([NSBundle -retain]): New method. ([NSBundle -retainCount]): New method. ([NSBundle -dealloc]): Release new ivars. ([NSBundle -classNamed:]): Search from new _bundleClasses ivar. ([NSBundle -principalClass:]): New loading protocol. ([NSBundle -_bundleResourcePathsWithDirectory:]): New method. ([NSBundle -pathForResource:ofType:inDirectory:]): New search protocol. ([NSBundle -pathsForResourcesOfType:inDirectory:]): New method. ([NSBundle -localizedStringForKey:value:table:]): Implement. ([NSBundle -resourcePath]): New method. ([NSBundle -infoDictionary]): New method. ([NSBundle -bundleVersion]): Removed. ([NSBundle -setBundleVersion:]): Removed. * NSBundle.h: Add new ivars. Add new OpenStep methods, remove obsolete methods. New localization macros. Wed Nov 13 14:10:00 1996 Richard Frith-Macdonald * src/Connection.m ([Connection +rootProxyAtName:onHost:]): Return nil if we fail to create a port for talking to a remote server. ([Connection forwardForProxy:selector:argFrame:]): Changes to ensure that ConnectedDecoder is correctly dismissed in the case where a DO method returns an object but does not have any parameter values returned. * src/mframe.m (mframe_build_return()): Cooperate with [Connection forwardForProxy:selector:argFrame:] so that it's callback function is called to tell it dismiss the ConnectedDecoder. * src/RunLoop.m ([RunLoop -limitDateForMode:]): Various changes to get timeouts working reliably. Ensure that _current_mode is restored correctly on exit. * src/RunLoop.m ([RunLoop -acceptInputForMode:beforeDate:]): Ensure that _current_mode is restored correctly on exit. Wed Nov 6 11:59:08 1996 Adam Fedor * src/NSLog.m: New file * src/Makefile.in (GNUSTEP_MFILES): Add NSLog.m * src/include/NSObjCRuntime.h: Add NSLog definitions. Mon Nov 4 12:30:05 1996 Adam Fedor * src/objc-load.c: Include . Sat Sep 21 15:18:47 1996 Yoo C. Chung * src/NSZone.m: Use constructor attribute with initialize(). Thu Sep 19 22:09:08 1996 Yoo C. Chung * src/DelegatePool.m: Use NSDefaultMallocZone() instead of NS_NOZONE. * src/NSProcessInfo.m: Likewise. * src/NSObject.m: Use NSDefaultMallocZone() instead of NS_NOZONE. Use NSZoneFromPointer() instead of NSZoneFromPtr(). * src/NSProcessInfo.m: Use NSDefaultMallocZone() instead of 0. And cosmetic changes. * src/NSHashTable.m: Use NSDefaultMallocZone() instead of 0. * src/NSMapTable.m: Likewise. * src/o_map.m: Likewise. * src/NSPage.m: Use valloc() in NSAllocateMemoryPages(). Cosmetic style changes. * src/NSZone.m: Complete rewrite. * src/include/NSZone.h: Extensive modifications. Thu Dec 5 17:20:58 1996 Nick Christopher * NSString.m [NSString -componentsSeparatedByString]: Didn't handle strings with separators longer than a single character and in other cases. * stringsfile.l: The definition of LABEL needed expanding. Sun Jan 5 17:41:37 1997 Andrew McCallum Further changes for the NSString implementation. * src/NSGCString.m ([NSGMutableCString -insertString:atIndex:]): Use -cStringNoCopy instead of the removed method -_cStringContents. * src/include/Stream.h (StreamException): Change type to NSString from id . * src/include/NSUser.h (NSUserName, NSHomeDirectory, NSDirectoryForUser): Change the return types from (char*) to (NSString*). * src/include/NSUserDefaults.h (NSUserName, NSHomeDirectory, NSDirectoryForUser): Declare them unconditionally; before it was conditioned on NEXT_FOUNDATION. * src/include/NSArray.h: Don't include * src/include/Streaming.h: Likewise. * src/include/Port.h: Likewise. * src/include/Coder.h: Likewise. Changes to send -awakeAfterUsingDecoder, and to do the proper object substitution if necessary. * src/Decoder.m ([Decoder +readSignatureFromCStream:csgetClassname: nameformatVersion:version]): Better commented. ([Decoder -_coderSubstituteObject:atReference:]): New method. ([Decoder -_coderPushRootObjectTable]): Better commented. ([Decoder -finishDecodingInterconnectedObjects]): Implement an approach to root-object-based -awakeAfterUsingCoder. ([Decoder -decodeObjectAt:anObjPtr:name]): Send -awakeAfterUsingCoder: here. First see if the object actually responds to it, then send it and make the object substitution if necessary. Also make the appropriate substitution in Decoder's internal tables matching references numbers to objects. * src/Encoder.m (DEFAULT_DEFAULT_FORMAT_VERSION): Renamed from DEFAULT_FORMAT_VERSION, for clarity with variable by the same old name. * checks/fref.m: Add comment and move around headers for easier reading. * src/include/NSAutoreleasePool.h (init_autorelease_thread_vars): Make it a macro instead of a static inline function. This avoids the warning with not optimizing. * checks/Makefile.in (CFLAGS): Remove -O, for easier debugging. (SRCS): Added awake.m. * checks/awake.m: New file, testing -awakeAfterUsingCoder:. Sun Nov 24 09:20:47 1996 Andrew McCallum * src/NSString.m: Fixed `Caveats' comment. ([NSString -commonPrefixWithString:options:]): Method implemeneted. ([NSString -capitalizedString]): Method implemented. ([NSString -lowercaseString]): Method implemented. ([NSString -uppercaseString]): Method implemented. ([NSString -stringByExpandingTildeInPath]): Method implemented. ([NSString -stringByAbbreviatingWithTildeInPath]): Method implemented. ([NSString -stringByStandardizingPath]): Method implemented. ([NSString -_cStringContents]): Method removed. All callers changed to use -cStringNoCopy. ([NSString -objectAtIndex:]): Method removed. * src/include/NSString.h: Moved non-OpenStep methods aside, put some under STRICT_OPENSTEP, others under NO_GNUSTEP. Reordered declarations to match. [NSString -_cStringContents]: Method removed. * src/ostream.m: Don't use old String methods; use NSString methods. * src/include/NSString.h: Don't include and . [!NO_GNUSTEP]: Declare -cStringNoCopy. * src/UdpPort.m: Don't include * src/TextCStream.m ([TextCStream -decodeName:name]): Don't use the non-existant +stringWithCStringNoCopy:. * src/Stream.m ([Stream -readLine]): Likewise. * src/MemoryStream.m ([MemoryStream -readLine]): Likewise. * src/NSString.m ([NSString -cStringNoCopy]): New method. * src/NSGCString.m ([NSGCString -emptyCopy]): Method removed. It was part of the Collecting protocol. ([NSGMutableCString -emptyCopy:]): Likewise. * src/*.m, src/include/*.h: Substitute (NSString*) for (id ). * src/Makefile.in (GNU_MFILES): Remove CString.m, ConstantString.m, MutableString.m, MutableCString.m, String.m. (GNU_HEADERS): Remove include/String.h. * src/NSString.m: Don't include . ([NSString +initialize]): Don't use static variable to prevent getting run twice. Mon Nov 18 11:30:39 1996 Andrew McCallum * STATUS: Removed classes NSBTreeBlock, NSBTreeCursor, NSByteStore, and NSByteStoreFile since they are no longer part of the OpenStep standard. Sat Nov 2 15:39:56 1996 Andrew McCallum * src/Decoder.m ([Decoder -_coderCreateReferenceForInterconnectedObject:]): Autorelease the placeholder object to prevent memory leak. * src/Connection.m ([Connection -forwardForProxy:selector:argFrame:]): Add an assertion that we processed all arguments and dismissed the ConnectedCoder. Thu Oct 31 11:54:42 1996 Andrew McCallum * Version (SUBMINOR_VERSION): Version 0.2.11. * src/Makefile.in (DIST_FILES): Remove include/config-win32.sed. * src/NSString.m (HAVE_REGISTER_PRINTF_FUNCTION): Move definition below #include's. * checks/nsnotification.m ([Observer -gotNotificationFoo:]): Don't use %@ inside printf(). ([Observer -gotNotificationFooNoObject:]): Likewise. * checks/nshashtable.m (main): Avoid adding 0 to the hashtable, because that is currently the o_hash_not_an_element_marker. * src/BinaryCStream.m ([BinaryCStream -encodeValueOfCType:at:withName:name]): Use intermediate float value. ([BinaryCStream -decodeValueOfCType:at:withName:]): Likewise. * src/stringsfile.y: Remove duplicated content. * src/stringsfile.l: Likewise. * src/StdioStream.m: Fix typo. That's HAVE_STRERROR, not HAS_STRERROR. * src/BinaryCStream.m ([BinaryCStream -decodeValueOfCType:at:withName:]): Don't make float and double `volatile'. It conflicts with memcpy. ([BinaryCStream -encodeValueOfCType:at:withName:name]): Likewise. * src/Makefile.in (DEFS): Add comment. * src/NSDictionary.m: Include Foundation/NSException.h to get NSInvalidArgumentException. * src/NSCalendarDate.m ([NSCalendarDate -descriptionWithCalendarFormat:locale:]): Remove unused variables MS and DS. Avoid warning by not trying to sprintf() a zero-length string. * src/include/NSZone.h: Include gnustep/base/config.h instead of preface.h; otherwise we get a dependancy loop on the definition on NSZone. * src/o_array.m: Include gnustep/base/preface.h first. * src/Makefile.in (HEADERS_INSTALL): Added include/config.h. (install): Don't install include/config.h specially, it's now done with the rest of the HEADERS_INSTALL files. (ALL_CPPFLAGS): Don't pass `-include include/config.h' since include/preface.h now does that. * src/include/preface.h.in: Include , and do it first. * src/NSUser.m (NSUserName): Make is work for SOLARIS. (Reported by M. Decugis .) * src/NSUserDefaults.m ([NSUserDefaults -initWithUser:]): Don't try to append to a immutable string! ([NSUserDefautls +standardUserDefaults]): When creating a new defaults, return it, not nil! (Reported by M. Decugis .) * src/BinaryCStream.m ([BinaryCStream -encodeValueOfCType:at:withName:name]): Use memcpy() instead of assignment to get the floats and doubles from the `at:' argument. ([BinaryCStream -decodeValueOfCType:at:withName:]): Likewise, for setting the values. (Reported by M. Decugis .) * src/NSPage.m (getpagesize) [__SOLARIS__]: Define as macro making proper sysconf call. (Reported by M. Decugis .) (NSPageSize): Remove the dependancy on __mach__ to a #define above. * configure.in: Use config/config.vsprintf.c to define VSPRINTF_RETURNS_LENGTH. Deal with different systems for which vsprintf() returns either the length or the char*. * Makefile.in (DIST_FILES): Added config/config.vsprintf.c. * config/config.vsprintf.c: New file. * src/include/preface.h.in (VSPRINTF_LENGTH): New macro; definition depends on VSPRINTF_RETURNS_LENGTH. * src/MemoryStream.m ([MemoryStream -writeFormat:arguments:]): Use VSPRINTF_LENGTH. * src/NSString.m ([NSString -initWithFormat:arguments:]): Likewise. * src/String.m ([String -initWithFormat:arguments:]): Likewise. ([String -initWithCFormat:arguments:]): Likewise. * acconfig.h: Add VS_PRINTF_RETURNS_LENGTH. * src/RunLoop.m ([RunLoop -limitDateForMode:]): Bracket timer firing with a retain/release of the MIN_TIMER. (Reported by Richard Frith-Macdonald .) * Heap.m: Fix index comparisons. (From Richard Frith-Macdonald .) * src/include/RunLoop.h (RunLoop _mode_2_fd_speakers): New ivar. ([RunLoop]): Added new methods for notification of readiness of file descriptors for reading and writing. Done by Richard Frith-Macdonald . * src/RunLoop.m: Added implementation of new methods for notification of readiness of file descriptors for reading and writing. Done by Richard Frith-Macdonald . * examples/first-server.m: Added test of RunLoop FD listening. Done by Richard Frith-Macdonald . * src/mframe.m (method_types_get_next_argument): Do weird argframe workaround not just on m68k, but on all NeXT systems. (Reported by Richard Frith-Macdonald .) * src/RunLoop.m ([RunLoop -acceptInputForMode:beforeDate:]): Fix assignment of TIMEOUT.TV_USEC. (Reported by Richard Frith-Macdonald .) Wed Oct 23 11:19:05 1996 Scott Christley * src/Makefile.sed.nt: Link with ObjC runtime DLL library when making gnustep-base a DLL. * src/NSProcessInfo.m (main): Initialize network library for Win32. * src/RunLoop.m (-acceptInputForMode:beforeDate:): When determining which ports are ready for reading, don't assume that file descriptor for FD_ISSET is an integer. Maintain list of ports we are listening to so that we check those exact ports when determining which are ready for reading. * src/TcpPort.m (invalidate): Use closesocket function on Win32. (_getPacketSize:andReplyPort:fromSocket:inPort:): Use recv instead of read for Win32 as read doesn't work for sockets. (_fillFromSocket:): Likewise. (_writeToSocket:withReplySockaddr:): Use send instead of write for Win32 as write doesn't work for sockets. * src/behavior.m: Don't directly access the ObjC runtime uninstalled dtable variable, use the public function instead. * src/objc-load.m: Likewise. * checks/Makefile.sed.nt: Add specific targets for tcpport-server and tcpport-client. Remove unneeded definitions. Tue Oct 15 15:29:07 1996 Adam Fedor * src/objc-load.c: Use gnu names for objc_load_modules and objc_unload_modules functions as defined in header. * src/include/objc-load.h (objc_load_modules, objc_unload_modules): Use Class not Class*. Fri Oct 18 10:45:10 1996 Scott Christley * Makefile.sed.nt: Always force gnustep/base target. * src/NSDate.m (+timeIntervalSinceReferenceDate): Use native Win32 functions to obtain current time. * src/Time.m (gettimeofday): Win32 implementation, not year 2000 compliant so don't use it. * src/include/NSZone.h: Include preface.c so that NSZone gets configuration settings. Wed Oct 16 10:01:23 1996 Scott Christley * checks/nsdate.m: New file. * src/NSCalendarDate.m: New file. * checks/Makefile.in: Add test program for NSDate classes. * src/Makefile.in (GNUSTEP_MFILES: Add NSCalendarDate.m. * src/NSDate.m: Eliminate use of NSConcreteDate. Utilize the NSCalendarDate class for implementing some methods. * src/include/NSDate.h: Add NSCalendarDate interface. Tue Oct 1 12:56:09 1996 Nicholas Christopher * NSString.m: Implemented -initWithContentsOfFile: and -propertyListFromStringsFileFormat:. * stringsfile.l, stringsfile.y: New files. Fri Oct 25 20:22:37 1996 Andrew McCallum * src/StdioStream.m (strerror) [!HAS_STRERROR]: New function from Richard Frith-Macdonald . * configure.in: Check for strerror(). Fri Sep 27 10:33:07 1996 Adam Fedor * aclocal.m4 (OBJC_CON_AUTOLOAD): New macro. Explicit check for constructor loading. (OBJC_SYS_AUTOLOAD): Insert '_cv' in cache variable name to get it to cache correctly. (OBJC_SYS_DYNAMIC_LINKER): Use headers to determine linker. Check for libraries separately. (OBJC_SYS_DYNAMIC_FLAGS): Check to see if '-shared' load flag works (for DEC Alpha). Thu Sep 26 12:39:18 1996 Adam Fedor * src/ostream.m (ostream_close_memory): Change to OSTREAM_SAVEBUFFER constant. Wed Sep 25 18:32:14 1996 Scott Christley * src/include/config-win32.sed: Delete file. * src/include/config-win32.h: Changes for new config.h.in. * configure.bat: Changes for new config.h.in. * src/Makefile.sed.nt: Changes for new config.h.in. Make sure preface.h is created before creating gnustep/base directory. * src/NSUserDefaults.m: Don't include header file for Win32. * src/Time.m: Specialized time routines for Win32. * src/Makefile.in (distclean): Remove generated files. * admin/example.patch: Remove CVS keywords. * src/NXStringTable.m: Likewise. * src/dld-load.h: Likewise. * src/hpux-load.h: Likewise. * src/include/objc-load.h: Likewise. * src/null-load.h: Likewise. * src/objc/NXStringTable.h: Likewise. * src/simple-load.h: Likewise. Fri Oct 25 18:42:45 1996 Andrew McCallum * src/NSSet.m ([NSSet -anyObject]): Implemented. * src/NSDictionary.m ([NSDictionary +dictionaryWithObjectsAndKeys:]): New method. Wed Sep 25 08:47:33 1996 Andrew McCallum * Version (SUBMINOR_VERSION): Version 0.2.10. * src/NSString.m ([NSString -initWithFormat:arguments:]): Fix bug whereby multiple %@'s in the same format string created incorrect output. * examples/second-client.m: Don't pass %@ directives to printf(); use %s and -cStringNoCopy instead. * examples/second-server.m: Likewise. * doc/install.texi: Add the installation step. Tue Sep 24 11:20:06 1996 Andrew McCallum * Makefile.in (mostlyclean, clean, distclean, maintainer-clean): Reverse order of subdir-cleaning and topdir-cleaning so that we don't force the Makefile to automatically run ./configure for us, (which sometimes happens in the wrong way). * src/NSString.m ([NSString -copy]): New method. Now -copy sent to strings should work. (Added temporarily until this problem is fixed by me overhaul of the string classes to separate Core and NonCore methods.) * checks/string.m (main): Add tests for -copy and -mutableCopy. * src/ostream.m (ostream_open_memory): Cast (const char*) to (char*) when passing to MemoryStream -init... method. * examples/second-client.m (main): Rename `exception' to `localException'. (Reported by Erich Stefan Boleyn .) * admin/HOWTO-patches: Update from libobjects terminology to gstep-base terminology. * doc/install.texi: Mention specification of the GNU runtime in the GNUstep-specific instructions. * configure.in: Warn the user that GNUstep doesn't work with the NeXT Objective C runtime. * src/BinaryCStream.m: Check HAVE_VALUES_H before trying to include ; use if we don't. * configure.in: Add check for needed by BinaryCStream.m. (Reported by Gregor Hoffleit .) * src/NSUserDefaults.m: Don't try to include NeXT's headers; just include GNUstep headers. * src/include/NSUserDefaults.h: Likewise. (Reported by Gregor Hoffleit .) * src/ostream.m (ostream_close_memory): Send -setFreeWhenDone:NO to the MemoryStream, not -release. * src/MemoryStream.m ([MemoryStream -setFreeWhenDone:]): New method. * src/include/MemoryStream.h: Declare new method. (Reported by Adam Fedor .) * aclocal.m4: Do forgotten renames of ac_cv_sys_dld and ac_cv_sys_autoload to objc_cv_sys_dld and objc_cv_sys_autoload. (Reported by Nick Christopher .) * src/include/objc-gnu2next.h: Don't include gnustep/base/objc-malloc.h. * src/NSSet.m ([NSMutableSet -addObjectsFromArray:]): Implemented. Wed Sep 18 09:11:44 1996 Andrew McCallum * Version (SUBMINOR_VERSION): Version 0.2.9. * src/NSString.m (HAVE_REGISTER_PRINTF_FUNCTION): Temporarily set this to 0 until I figure out when register_printf_function's output handler function takes `va_list' and when it takes `void**'. * src/TcpPort.m: Use new ivar name eof_position, not old eofPosition. * src/include/NSZone.h: Don't include gnustep/base/config.h. Tue Sep 17 16:44:15 1996 Andrew McCallum * src/ostream.m (ostream_open_memory): Use new MemoryStream method to specify that buffer should not be deallocated when MemoryStream is deallocated. Don't do the extra retain that was the previous workaround. * src/MemoryStream.m: Rename all uses of ivar eof_position. ([MemoryStream -_initOnMallocBuffer:freeWhenDone:size: eofPosition:prefix:position:]): Method name changed to include freeWhenDone:. Set new ivar. ([MemoryStream -_initOnMallocBuffer:size: eofPosition:prefix:position:]): New method (with old name) that calls above method with `YES' for freeWhenDone:. * src/include/MemoryStream.h: Declare new method. (MemoryStream free_when_done): New ivar. (MemoryStream eof_position): Ivar renamed from eofPosition, to conform to GNU coding standards. * src/Makefile.in (GNU_MFILES): Rename objc_streams.m to ostream.h. (GNU_HEADERS): Rename objc_streams.h to ostream.h. * src/ostream.m: File renamed from src/objc_streams.m. Fix copyright date, and make minor formatting changes. * src/ostream.h: File renamed from src/objc_streams.h. Fix copyright date, and make minor formatting changes. * src/MemoryStream.m (MEMORY_CHECK): Macro deleted. objc_malloc() and friends take care of raising the correct exception. All calls removed. Tue Sep 17 11:43:23 1996 Adam Fedor * src/Makefile.in (GNU_MFILES): Add new file. (GNU_HEADERS): Likewise. * src/MemoryStream.m ([MemoryStream -initWithSize:prefix:position:]): Add error checking. ([MemoryStream -writeBytes:length:]): Likewise. ([MemoryStream -setStreamBufferCapacity:]): Likewise. * src/StdioStream.m ([StdioStream -initWithFilename:fmode]): Add error checking. ([StdioStream -initWithFileDescriptor:fmode]): Likewise. ([StdioStream -writeBytes:length:]): Likewise. ([StdioStream -readBytes:length:]): Likewise. * src/Stream.m ([Stream -writeFormat:]): Implement. ([Stream -setStreamPosition:]): Likewise. * src/MemoryStream.m ([MemoryStream -writeFormat:arguments:]): Implement instead of writeFormat:. ([MemoryStream -setStreamPosition:seekMode:]): Implement instead of -setStreamPostion:. * src/StdioStream.m ([StdioStream -writeFormat:arguments:]): Implement instead of writeFormat:. ([StdioStream -setStreamPosition:seekMode:]): Implement instead of -setStreamPostion:. * src/objc_streams.m: New file. * src/base/objc_streams.h: New file. * src/base/Stream.h: Declare new exception. * src/Stream.m: Define it. * src/base/Streaming.h: Add new enum type. Add -setStreamPostion:seeMode: to protocol. Tue Sep 17 10:33:31 1996 Andrew McCallum * doc/install.texi: Fix typo in use of @code{}. * src/md5.c: Don't include config.h. * Makefile.in (DIST_FILES): Added contents of RCS_FILES. Added acconfig.h. (RCS_FILES): Variable removed. * doc/gnustep-faq.texi: Cause the time stamp to be updated automatically by Emacs. * src/NSScanner.m ([NSScanner -scanRadixUnsignedInt:]): New method. ([NSScanner -_scanInt:]): Deal with overflow better. (?) ([NSScanner -scanLongLong:]): Likewise. * src/include/NSScanner.h: Declare new method. * checks/nsscanner.m: Test new method, -scanRadixUnsignedInt:. Changes from Eric Norum . * src/NSObject.m ([NSObject -doesNotRecognizeSelector:]): Raise NSInvalidArgumentException, not NSGenericException. (Reported by Jeremy Bettis .) Mon Sep 16 20:11:54 CDT 1996 Jeremy Bettis * src/HashTable.m ([HashTable -isKey]): Updated isKey to use the new hash_value_for_key function in the runtime, and thereby allow for nulls in HashTables. Mon Sep 16 15:08:42 1996 Andrew McCallum * aclocal.m4 (DYNAMIC_LINKER): Put double quotes around some $-variable dereferences. (Reported by Richard Frith-Macdonald .) * src/o_vscanf.c: Include . (Reported by Richard Frith-Macdonald .) * src/include/preface.h.in: Don't include gnustep/base/config.h. Note, this file used to define NeXT_runtime and NeXT_cc. These macros will no longer be available to library users. * src/include/config.h.in: File removed. It is not automatically generated by autoheader in src/Makefile. * src/o_vscanf.c: Don't include no-longer-existant gnustep/base/objc-malloc.h. (Reported by Adam Fedor.) * src/Makefile.in (include/config.h.in): New dependancy. (include/config.h): New dependancy. (ALL_CPPFLAGS): Added -include argument to have gcc look at include/config.h. It is no longer included in include/preface.h because other packages that use the installed Base Library may have their own ideas about these macro values. * acconfig.h: New file, needed for autoheader. * configure.in: Use AC_CONFIG_HEADER to put config macros in a file instead of on gcc's command line. Use AC_DEFINE_UNQUOTED to set NeXT_runtime and NeXT_cc instead of using AC_SUBST. * make-dist-diff (diff): Add -N flag so new files will get created. Sat Sep 7 13:37:32 1996 Andrew McCallum * Version (SUBMINOR_VERSION): Version 0.2.8. Beginning of changes related to use of new Objective C runtime. * Makefile.in (DIST_FILES): Remove gcc-objc.patch. Add gcc-2.7.2-objc.diff and gcc-2.7.2.1-objc.diff. * configure.in: Insert -lobjc before rest of LIBS, not after. * src/include/NSThread.h: Remove underscore from front of objc_thread type. * src/NSObject.m: Remove underscores from front of objc_mutex types. ([NSObject -error:]): Use objc_verror(), not _objc_error. * doc/install.texi: Refine instructions for installing pthreads. Wow, is it yucky. * configure.in: Remove check for sel_types_match. That patch was added long ago. * src/include/preface.h.in (OBJC_STRINGIFY): New macro. * src/include/preface.h.in: Don't include objc-malloc.h. * src/Foundation/NSLock.h: Remove underscore from before objc_mutex_t. * src/include/preface.h.in (OBJC_MALLOC): Macro moved here from src/include/objc-malloc.h. (OBJC_VALLOC): Likewise. (OBJC_ATOMIC_MALLOC): Likewise. (OBJC_REALLOC): Likewise. (OBJC_CALLOC): Likewise. (OBJC_FREE): Likewise. * src/mframe.m: Don't include objc-malloc.h. * src/RNGAdditiveCongruential.m: Likewise. * src/NSAutoreleasePool.m: Likewise. * src/MemoryStream.m: Likewise. * src/AutoreleasePool.m: Likewise. * src/Makefile.in (GNU_MFILES): Remove objc-malloc.m. (GNU_HEADERS): Remove include/objc-malloc.h. * src/mframe.m (mframe_build_return): In accordance with Objective C runtime change, use objc_malloc as a function, not a function pointer. * src/behavior.m (behavior_class_add_methods): Likewise. * src/Storage.m ([Storage -initCount:elementSize:description:]): Likewise. ([Storage -shallowCopy]): Likewise. ([Storage -read:]): Likewise. * src/Storage.m ([Storage -initCount:elementSize:description:]): Likewise. * src/NSMutableData.m ([NSMutableData -initWithCapacity:]): Likewise. * src/NSGData.m ([NSGMutableData -initWithCapacity:]): Likewise. * src/NSData.m ([NSMutableData -initWithCapacity:]): Likewise. * src/NSAutoreleasePool.m ([NSAutoreleasePool -init]): Likewise. ([NSAutoreleasePool -addObject:]): Likewise. * src/MemoryStream.m ([MemoryStream -readLine]): Likewise. * src/Invocation.m ([Invocation -initWithCoder:]): Likewise. * src/o_vscanf.c (STRING_ARG): Likewise. (STRING_ADD_CHAR): Likewise, with objc_realloc. * src/NSZone.m: Likewise. * src/Storage.m: Likewise. * src/MemoryStream.m ([MemoryStream -writeBytes:length:]): Likewise. * doc/install.texi: Update instructions for new Objective C runtime patches and for new pthreads. * RELEASE-NOTES: Talk about need for new Objective C runtime to compile this release. End of changes related to use of new Objective C runtime. * config.guess: New version from FSF. * doc/Makefile.in: Added some pattern rules, but commented them out for now. * src/NSGCString.m ([NSGCString -substringFromRange:]): Don't always return a mutable string class; return the same mutable/immutable string class as self. This also simplies the code. * src/NSGCString.m ([NSGCString -substringFromRange:]): New method, overrides superclass method with more efficient implementation. (From Eric Norum.) * src/NSScanner.m: Now that NSCharacterSet's does its own caching, simplify this code. (Changes from Eric Norum .) * src/NSCharacterSet.m (NSCharacterSet_PATH): New macro, replacing BITMAP_PATH. Value partially determined by GNUSTEP_INSTALL_PREFIX. * configure.in: Use AC_CHECKING instead of `echo', so ./configure obeys --quiet and --silent. * src/Makefile.in (DEFS): Add definition of GNUSTEP_INSTALL_PREFIX, equal to $(prefix). This is needed by NSCharacterSet, so it knows where to find the char set data files. Thu Aug 1 10:42:19 1996 Adam Fedor * src/NSCharacterSet.m ([NSCharacterSet -_bitmapForSet:number:]): Retain cached set. Wed Sep 4 11:29:31 1996 Andrew McCallum * doc/gnustep-faq.texi (Why don't we separate the OpenStep standard classes from the GNU-specific classes?): New Q/A pair. (Where can I get a copy?): Removed reference to Rochester's FTP site, which will no longer be used, now that I'm at CMU. Mon Sep 2 10:00:05 1996 Andrew McCallum * Version (SUBMINOR_VERSION): Version 0.2.7. * checks/nsbundle.m: Use new exception variable name. * checks/values.m: Likewise. * src/NSString.m ([NSString -substringFromRange:]): Implement it using CString's for now so we can get it working; (we'll fix everything for Unichar's in the next release). * checks/nsscanner.m: New file from Eric Norum. * Version: Remove spaces around `=' so file can be read by sh. (VERSION): Use curly braces for sh. * src/NSString.m ([NSString -substringFromRange:]): Fix bug in references to string length. * src/NSGArray.m: Declare NonCore classes. * src/NSCharacterSet.m ([NSCharacterSet +_bitmapForSet:number:]): Add an abort() after raising the exception, to avoid gcc warning. * Makefile.in (clean): Fix dependancies so we actually clean-top, not mostlyclean-top. (distclean): Analogously. (maintainer-clean): Analogously. Tue Aug 27 13:38:14 1996 Adam Fedor * src/Connection.m ([Connection -_service_forwardForProxy]): Use new exception variable name. * src/NSCharacterSet.m: ([NSCharacterSet -_bitmapForSet:number:]): Likewise Sat Aug 24 16:41:01 1996 Adam Fedor * src/include/NSException.h (NS_HANDLER): Change local exception variable name. Wed Jul 17 16:04:29 1996 Adam Fedor * NSCharacterSet.m: Cache standard character sets. ([NSCharacterSet +initialize]): New method. ([NSCharacterSet _bitmapForSet:number:]): Return set from cache if available, otherwise find bitmap file and add to cache. All callers changed. Mon Sep 2 09:23:46 1996 Andrew McCallum * src/NSString.m ([NSString -substringFromRange:]): Raise correct exceptions. * src/Makefile.in (install): Make a soft link from `$(includedir)/gnustep/base' to `$(includedir)/objc' the same way we do for `$(includedir)/Foundation'. * src/NSString.m ([NSString -getCharacters:range:]): Fix bug in buffer index. (Reported by Eric Norum .) ([NSString -rangeOfString:aStringoptions:maskrange:aRange]): Implemented. (By Eric Norum.) * src/NSUser.m: Include . Sun Aug 25 16:12:49 1996 Andrew McCallum * checks/Makefile.in (SRCS): Added nsscanner.m from Eric Norum. * src/NSScanner.m: Fix indentation. ([NSScanner +scannerWithString:]): Rewrite to avoid unnecessary local variable. ([NSScanner -initWithString:]): Call [super init]. ([NSScanner -_scanCharactersFromSet:intoString:]): Method renamed to put underscore at the beginning, not in the middle of the method name. All callers changed. ([NSScanner -_skipToNextField]): Likewise. ([NSScanner +localizedScannerWithString:]): New method, unimplemented. ([NSScanner -scanDouble:]): Initialize `unichar c' to avoid warning. ([NSScanner -scanLongLong:]): Don't compare with -(LONG_LONG_MIN), this number is out of range since, in two-complement arithmetic, we have one more negative number than positive numbers. * src/include/NSScanner.h: Include . Fix indentation. Standarize #define wrapper symbol. * src/NSScanner.m, src/include/NSScanner.h: New files from Eric Norum. Sun Aug 11 10:54:49 1996 Andrew McCallum * src/NSUser.m (NSHomeDirectory): Use NSHomeDirectoryForUser instead of the HOME environment variable. * src/NSUserDefaults.m: #include to get declarations for NSUser* functions. (NSUserName): Function removed; it can already be found in NSUser.m. (NSHomeDirectory): Likewise. (NSHomeDirectoryForUser): Likewise. * doc/Makefile.in: Fix typo: properly comment out section. * doc/gnustep-faq.texi: English fixes, and move NSScanner to `implemented' list. * doc/install.texi: English fixes, and mention --enable-shared with Base Library configure directions. * README.foundation: Add note about making a soft link, instead of adding #ifdef's to the code. * NSBundle.README: Change name from libobjects to GNUstep Base Library. * README.first: Likewise. Wed Aug 7 09:06:10 1996 Andrew McCallum * src/mframe.m (mframe_build_return): Remove comment about users responsibility to free returned char*'s; it's no longer true. Mon Aug 5 11:25:30 1996 Andrew McCallum * src/include/NSArray.h: Remove declaration of NonCore classes; just the category is sufficient. Mon Sep 2 09:11:34 1996 Andrew McCallum * src/mframe.m: Use gcc's __builtin_return smarts to find location of `char' and `short' return values; don't use my (possibly wrong) guesses. (retframe_char): New nested function. (retframe_short): New nested function. (mframe_do_call) [_C_CHR, _C_UCHR]: Use retframe_char. [_C_SHT, _C_USHT]: Use retframe_short. * src/NSObject.m ([NSObject -isKindOfClass:]): Fix formatting. Fri Aug 30 17:00:29 1996 Andrew McCallum * src/Dictionary.m ([Dictionary -removeObject:]): Implemented method. (Needs testing!) Thu Jul 11 21:12:41 1996 Andrew McCallum * Version (SUBMINOR_VERSION): Version 0.2.6. Tue Jun 25 12:56:01 1996 Scott Christley * NSCharacterSets/Makefile.in: Remove Makefile when distclean. * admin/Makefile.in: Likewise. * checks/Makefile.in: Change realclean target to maintainer-clean. * doc/Makefile.in: Likewise. * examples/Makefile.in: Likewise. * Makefile.in: Clean the subdirectories first before the top level directory to avoid configuration loop. * checks/Makefile.sed.nt: Change name of runtime initialization routine to use standard "_init_runtime" suffix. * checks/nsarchiver.m: Likewise. * checks/nsarray.m: Likewise. * src/win32-entry.c: Likewise. * src/Makefile.in: Likewise. Clean additional files. * src/NSDate.m: Use __WIN32__ macro instead of WIN32. * src/NSTime.m: Implement Win32 specific time routines. * src/include/config-win32.h: Likewise. Fri Jun 21 16:45:31 1996 Scott Christley * configure.bat: New filenames for Win32 configuration. * src/Makefile.in: (DIST_FILES): Add Win32 configuration files: src/include/config-win32.sed, src/include/config-win32.h. * src/BinaryCStream.m: Rename WIN32 to __WIN32__ to conform to ANSI specifications. Perform any WIN32 customization. * src/NSBundle.m: Likewise. * src/NSPage.m: Likewise. * src/NSProcessInfo.m: Likewise. * src/NSUser.m: Likewise. * src/NSRunLoop.m: Likewise. * src/TcpPort.m: Likewise. * src/UdpPort.m: Likewise. * src/find_exec.c: Likewise. * src/include/TcpPort.h: Likewise. * src/include/Time.h: Likewise. * src/include/config-nt.sed: Renamed to config-win32.sed. * src/include/config-nt.h: Renamed to config-win32.h Thu Jul 11 08:20:34 1996 Andrew McCallum * src/NSAutoreleasePool.m ([NSAutoreleasePool -dealloc]): Remove untrue assertion that SELF be this thread's current pool. (Reported by Adam Fedor.) * checks/Makefile.in (LIBS): Remove -lmcheck. * Version (SUBMINOR_VERSION): Version 0.2.5. * doc/news.texi: Fix typo, replace @ with @@ in email address. * Version (SUBMINOR_VERSION): Version 0.2.4. * src/NSString.m (PRINTF_ATSIGN_VA_LIST): Reverse sense of test. This macro should be defined if libc version is *less than* 5.2. * examples/dictionary.m: Long-overdue update for new collection heirarchy. * examples/textcoding.m (main): Fix typo in comment. * examples/second-server.m: Add comments. * examples/second-client.m (main): To avoid warnings: make SERVER static; get rid of unused variable. * examples/Makefile.in (CFLAGS): Added -Wno-format so we don't get complains about the %@ printf directive. * doc/news.texi: Add news about NSUserDefaults, thread-safety, @%, and NSPage. * doc/readme.texi: Update description of classes, although the list is still incomplete. Wed Jul 10 16:28:14 1996 Andrew McCallum * doc/gnustep-faq.texi: New Q/A about mixing Objective C and C++. Include base-desc.texi for description of Base Library. Update "state of development for Base Library. Correct description of NeXT's archiving. Add ocbi.com ftp site. * doc/base-desc.texi: Improve list of example classes. * doc/announce.texi: Fix comments about NeXT's cc. * doc/machines.texi: Label as out-of-date. * doc/advertisement.texi: Comment out inclusion of machines.texi. * src/NSUserDefaults.m: Fix source to avoid warnings. * src/NSUserDefaults.m: New file from Georg Tuparev. * src/include/NSUserDefaults.h: Likewise. * src/NSUserDefaults.m, src/include/NSUserDefaults.h: Fix formatting to conform to GNU standards. * src/Makefile.in (GNUSTEP_MFILES): Added NSUserDefaults.m. (GNUSTEP_HEADERS): Added include/NSUserDefaults.h. Tue Jul 9 20:05:16 1996 Andrew McCallum * doc/install.texi: Enumerate the steps, and various other corrections. * src/RunLoop.m ([RunLoop -acceptInputForMode:beforeDate:]): Free fd_2_object before returning in case where select() returned 0. (Reported by Marc Decugis .) Mon Jul 8 21:55:11 1996 Andrew McCallum * Version (SUBMINOR_VERSION): Version 0.2.3. * src/Invocation.m ([ArgframeInvocation -dealloc]): Release arguments depending on ARGS_RETAINED, not RETURN_RETAINED. * checks/release.m: New file. * checks/Makefile.in (SRCS): Added release.m. * src/o_map.m (o_map_remove_node): Function renamed from o_map_remove_node_from_its_map(). Free the node after removing it! Otherwise, memory leaks and leaks! * src/NSObject.m (NSDecrementExtraRefCountWasZero): Call renamed function for removing node. * src/NSAutoreleasePool.m (push_pool_to_cache): Avoid unnecessary test. (pop_pool_from_cache): Don't bother conditionally initializing the cache; it will always be initialized when we are here. ([NSAutoreleasePool -dealloc]): Add assertion. ([NSAutoreleasePool -reallyDealloc]): New method. Tue May 28 15:39:36 1996 Adam Fedor * checks/nsmaptable.m: Check for nil map element. * src/Invocation [Invocation -dealloc]: Release return_value only if return_retained. [ArgframeInvocation -dealloc]: Likewise. Sat Jul 6 09:03:25 1996 Andrew McCallum * Version (SUBMINOR_VERSION): gnustep-base version 0.2.2. * doc/install.texi: Describe installation of pthreads. * src/NSObject.m ([NSObject +initialize]): Use o_map_with_callbacks(), instead of the short-cut function o_map_of_non_owned_void_p_to_int(). * src/RunLoop.m ([RunLoop -acceptInputForMode:beforeDate:]): Add comment about arbitrary fd port limit. Fix this eventually. * checks/tcpport-client.m (main): When argc == 1, pass nil for hostname instead of @"localhost". * checks/string.m (main): Add test of copyWithZone. * src/TcpPort.m ([TcpOutPacket -_writeToSocket:withReplySockaddr:]): Use memcpy() instead of cast; some systems have trouble with the cast due to alignment issues. (Reported by Marc Decugis .) ([TcpInPacket +_getPacketSize:andReplyPort:fromSocket:inPort:]): Likewise. * configure.in: Clean up echo'ed message for shared library flags. * gcc-objc.patch: New objc runtime patch from Scott Christley. * Makefile.in (DIST_FILES): Include gcc-objc.patch instead of objc.patch. * doc/install.texi: Update instructions for new objc runtime patch. * src/Foundation/NSAutoreleasePool.h: Include for memset(). A first attempt at making NotificationDispatcher thread-safe. * src/NotificationDispatcher.m ([NotificationDispatcher -init]): Create _LOCK. ([NotificationDispatcher -dealloc]): New method. ([NotificationDispatcher -_addObserver:notificationRequest:name:object:]): Use _LOCK to provide thread-safety. Lock around all access to ivars. ([NotificationDispatcher -removeObserver:]): Likewise. ([NotificationDispatcher -removeObserver:name:object:]): Likewise. ([NotificationDispatcher -postNotification:]): Likewise. All Notification postings are serialized. If this weren't true, the user would have to worry about all kinds of thread-safety issues in unpredictable ways, because there is no way to tell what other objects have asked for notification postings. * src/include/NotificationDispatcher.h (NotificationDispatcher _lock): New ivar. Fix error that occurs when using a TcpOutPort that was created with a default hostname. * src/TcpPort.m ([TcpInPort +newForReceivingFromPortNumber:]): Terminate the hostname at the first dot before looking up with gethostbyname(). If gethostbyname() fails, don't try again with "localhost"; signal an error instead. ([TcpOutPort +newForSendingToPortNumber:onHost:]): When HOSTNAME is empty or nil, don't use "localhost", look up the name of the local machine, and use that. Before this change we could easily get "Can't change reply port of an out port once set" errors. Fri Jul 5 08:59:26 1996 Andrew McCallum Use more-efficient o_map instead NSMapTable for retain counts. * src/NSObject.m (retain_counts): Make it an o_map instead of NSMapTable; (o_map is more efficient). (NSIncrementExtraRefCount): Use o_map interface. (NSDecrementExtraRefCountWasZero): Likewise. ([NSObject +initialize]): Likewise. ([NSObject -retainCount]): Likewise. * src/o_map.m (o_map_node_for_key): New function, non-static, for efficient implementation of NSObject retain count management. (o_map_remove_node_from_its_map): Likewise. Thu Jul 4 21:00:42 1996 Andrew McCallum Make -retain/-release counts thread-safe. * src/NSObject.m (retain_counts_gate): New static variable, mutex for protecting RETAIN_COUNTS. (NSIncrementExtraRefCount): Use it. (NSDecrementExtraRefCountWasZero): Likewise. ([NSObject -retainCount]): Likewise. ([NSObject +initialize]): Allocate RETAIN_COUNTS_GATE. Tue Jun 11 14:50:20 1996 Andrew McCallum Make NSAutoreleasePool thread-safe. * src/include/NSAutoreleasePool.h (struct autorelease_thread_vars): New structure declared. (struct autorelease_cache): Structure declaration removed. (init_autorelease_thread_vars): New static inline function. * src/NSAutoreleasePool.m (ARP_THREAD_VARS): New macro for accessing NSAutoreleasePool's per-thread variables. (current_pool): Static variable removed. (total_autoreleased_objects_count): Likewise. (autorelease_pool_cache): Likewise. (autorelease_pool_size): Likewise. (autorelease_pool_count): Likewise. (push_pool_to_cache): Add (struct autorelease_thread_vars*) argument. All callers changed. (pop_pool_from_cache): Likewise. (push_pool_to_cache): Likewise. (init_pool_cache): New function. ([NSAutoreleasePool +initialize]): Don't initialize the autorelease_pool_cache here. ([NSAutoreleasePool +init]): Use per-thread variables. ([NSAutoreleasePool -autoreleaseCountForObject:]): Likewise. ([NSAutoreleasePool -currentPool:]): Likewise. ([NSAutoreleasePool +currentPool:]): Likewise. ([NSAutoreleasePool -addObject:]): Likewise. ([NSAutoreleasePool +addObject:]): Likewise. ([NSAutoreleasePool -dealloc:]): Likewise. ([NSAutoreleasePool +totalAutoreleasedObjects:]): Likewise. This return value is now only a per-thread count. ([NSAutoreleasePool +resetTotalAutoreleasedObjects:]): Likewise. * src/include/NSThread.h: Make the ivars @public, not @private, so NSAutoreleasePool can efficiently access the _autorelease_vars ivar. (_autorelease_vars): New ivar. * src/NSThread.m ([NSThread -init]): Instead of creating an NSMutableDictionary here, just set the ivar `_thread_dictionary' to nil, and create it later, only on demand. Use `init_autorelease_thread_vars()' to initialize `_autorelease_vars'. ([NSThread -threadDictionary]): If `_thread_dictionary' is nil, create it. * checks/string.m (print_string): Use -cStringNoCopy instead of -cString. (main): Test the use of the `%@' printf format directive. Implement handling of `%@' for non-GNU libc systems. * src/NSString.m: Include . (PRINTF_ATSIGN_VA_LIST): Make it an expression that depends on the libc version, not a boolean constant. ([NSString -initWithFormat:arguments:]): Implement the `%@' printf directive in the case where the available libc doesn't have `register_printf_function()'. It does not currently handle format width specifiers, etc. Mon Jun 10 23:22:58 1996 Andrew McCallum * src/gnustep/base/preface.h.in: Fix comment. Mon Jun 3 12:07:16 1996 Andrew McCallum * src/Makefile.in (gnustep/base): Remove `gnustep' and `base' before trying to recreate them. Fri May 31 10:06:05 1996 Andrew McCallum * src/Makefile.in (gnustep/base): Make a link for `Foundation' when building in a separate directory. * doc/install.texi: Mention making a link from thread.h to thr.h. * src/StdioStream.m ([StdioStream -readBytes:length:]): Don't assert that we get as many bytes as we asked for. * checks/Makefile.in (ALL_CPPFLAGS): Look in ../src/srcdir-include. * examples/Makefile.in (ALL_CPPFLAGS): Likewise. * src/NSLock.m: Include . Fix typo. * src/proplist.l (unescstr): Bug fix from Nathan Urban . This is a feeble attempt to use the correct flags for making a shared library. Other than the GNU-standard flags, so far I've just taken care of the Solaris case. * src/Makefile.in (CFLAGS_SHAREDLIB_GNU): New variable. (CFLAGS_SHAREDLIB_SOLARIS): New variable. (CFLAGS_SHAREDLIB): New variable set from configure. (lib$(LIBRARY_NAME).so.$(VERSION)): Use it. * configure.in (CFLAGS_SHAREDLIB): Figure this out, and AC_SUBST it. * src/Makefile.in (maintainer-clean): Remove *_bas and *_cbs files. (GNU_MFILES): Fix typo. * src/NSProcessInfo.m (__gnustep_base_subinit_args__): No longer declared static; (avoids warning). * src/Makefile.in: Rename all `o-*' files to `o_*', and prepend `o_' to some related files. * src/o-*, src/include/o-*: Rename to `o_'. * src/NSString.m ([NSString -initWithFormat:arguments:]): Increase bsprintf buffer size, and assert that we haven't overrun the buffer. * src/Makefile.in (GNU_OTHER_SRCFILES): Added win32-entry.c and win32-def.top. * src/NSObject.m: Don't declare `errno'. * src/NSAutoreleasePool.m: Don't include . * src/BinaryCStream.m (WRITE_SIGNED_TYPE): Avoid alignment errors by using memcpy() instead of trying to assign to (_TYPE*)(BUFFER+1). (WRITE_UNSIGNED_TYPE): Likewise. Fri May 31 08:20:09 1996 Adam Fedor * src/NSProcessInfo.m (main): Pass `env' variable to gnustep_base_user_main. Tue May 28 09:37:19 1996 Andrew McCallum * src/include/NSPathUtilities.h: New file. * src/Makefile.in (GNUSTEP_HEADERS): Added include/NSPathUtilities.h. * src/NSUser.m: New file. * src/Makefile.in (GNUSTEP_MFILES): Added NSUser.m. * src/NSPage.m: New file. * src/include/NSZone.h (NSPageSize, NSLogPageSize, NSRoundUpToMultipleOfPageSize, NSRoundDownToMultipleOfPageSize, NSRealMemoryAvailable, NSAllocateMemoryPages, NSDeallocateMemoryPages, NSCopyMemoryPages): New functions declared; they are implemented in NSPage.m. * src/Makefile.in (ALL_INCLUDE_FLAGS): Undo last change, except use name `srcdir-include' instead of `include'. This should allow building is a separate directory than the source, yet still avoid confusion between and on win32 systems. (gnustep/base:): Use `srcdir-include' instead of `include' for extra links needed when building in a separate directory than the source. * src/NSException.m (_NSAddHandler): When creating E_QUEUE, don't autorelease and then retain; instead just allocate it un-autoreleased. * checks/Makefile.in (SRCS): Added basic.m. * checks/basic.m: New file. * src/NSLock.m: Include first! Fix indentation. ([NSLock +initialize]): Method removed. ([NSLock -init]): Assert return value from objc_mutex_allocate(), don't just return nil. ([NSConditionLock -initWithCondition:]): Likewise. ([NSRecursiveLock -init]): Likewise. ([NSConditionLock +initialize]): Method removed. ([NSRecursiveLock +initialize]): Method removed. Mon May 27 09:57:34 1996 Andrew McCallum * Makefile.in (DIST_FILES): Added README.ucblib. * src/include/objc-gnu2next.h: Remove "Object (GNUExtentions)" Category. We no longer use Object; we use NSObject. Do our best to use "%@" (Objective-C String object printf-format tag) as little as possible, because, for now, it is not implemented on non-GNU-libc systems. * src/KeyedCollection.m ([ConstantKeyedCollection -description]): Instead of @%, use %s and [s cStringNoCopy]. * src/NSHashTable.m (NSStringFromHashTable): Likewise. (NSHashInsertKnownAbsent): Likewise. * src/NSMapTable.m (NSStringFromMapTable): Likewise. (NSMapInsertKnownAbsent): Likewise. * src/TextCStream.m ([TextCStream -encodeValueOfCType:at:withName:]): Likewise. ([TextCStream -encodeName:n]): Likewise. * src/o-hash.m (o_hash_description): Likewise. * src/x-bas.m.in (_o_@XX@_description): Likewise. * src/NSDictionary.m ([NSDictionary -descriptionWithIndent:]): Use -cStringNoCopy instead of -cString. * src/x-cbs.m.in: Prepend missing `o-' in #include. * src/x-bas.m.in: Likewise. Mon May 20 16:53:57 1996 Adam Fedor * src/include/NSGeometry.h: Include NSString functions only if compiling in Objective-C mode (using "#ifdef __OBJC__"). Tue May 14 20:03:55 1996 Scott Christley * INSTALL.WIN32: Correct grammatical errors. * Makefile.sed.nt: Sed script now handles install and all targets for top level Makefile. * checks/Makefile.sed.nt: Corrections to handle changes to checks/Makefile.in. * configure.bat: Corrections to handle the different directory structure for the header files. * src/BinaryCStream: Eliminate header files not needed on WIN32. * src/Makefile.in (ALL_INCLUDE_FLAGS): Eliminate -I./include flag. (FORCE): New Target. * src/Makefile.sed.nt: New file; somehow got lost. * src/RunLoop.m: Eliminate header files not needed on WIN32. * src/TcpPort.m: Likewise. * src/UdpPort.m: Likewise. * src/include/TcpPort.h: Likewise. * src/include/config-nt.h: New file, got lost during restructuring. * src/include/config-nt.sed: New file, got lost during restructuring. * src/libgnustep-base-entry.c: New file. * src/libgnustep-base.top: New file. Wed May 22 06:56:49 1996 Andrew McCallum * doc/install.texi: Say that the objc patch will be part of gcc 2.8.0. Mon May 13 09:03:55 1996 Andrew McCallum * src/Makefile.in (FILE_AUTHORS): Added "Scott Christley". * src/NSString.m ([NSString -description]): Fix warnings. * src/NSDictionary.m ([NSDictionary -description]): Fix warnings. * src/Makefile.in (GNU_OTHER_SRCFILES): Added proplist.l and proplist.y. (GNU_MFILES): Added lex.pl.m and proplist.tab.m. (YACC): New variable. (GNU_OTHER_SRCFILES): Added proplist., proplist.tab.h and proplist.y. (proplist.tab.m proplist.tab.h): New target. (lex.pl.m): New target. * proplist.y, proplist.l: New files from Nathan Urban. * src/NSData.m ([NSData -description]): Implemented by Nathan Urban. * src/NSArray.m ([NSArrayNonCore -description]): Likewise. * src/NSDictionary.m ([NSDictionary -description]): Likewise. * src/NSString.m ([NSString -description]): Likewise. ([NSString -propertyList]): Likewise. * src/NSThread.m (NSBecomingMultiThreaded, NSThreadExiting): Initialize the notification strings as static strings, not in +initialize. (thread_id_2_nsthread): Renamed from THREAD_LIST. Keep the collection of NSThread's as a maptable, not a NSArray that takes linear time to search! (thread_lock): Renamed from THREAD_LIST_LOCK. (entered_multi_threaded_state): Renamed from ENTERED_MULTI-THREADED_STATE. ([NSThread +initialize]): Don't initialize notification strings here. Don't autorelease the lock! ([NSThread -init]): Initialize _thread_autorelease_pool. Set our thread data to self, for easy, efficient access to this NSThread object later. Put ourselves in the thread collection here, not in +detach... ([NSThread +currentThread]): This will be called often and needs to be fast. Reimplemented so we don't have to acquire a lock and step through an NSArray of threads; instead, just look ourselves up with the objc_thread_get_data(), and furthermore, no lock required. ([NSThread +detachNewThreadSelector:toTarget:withObject:]): Avoid race condition, don't create new NSThread object here. ([NSThread +sleepUntilDate:]): Call -notImplemented:. ([NSThread +exit]): Properly post NSThreadExiting notification, making sure not to hold the lock while we do so. Get the NSThread object efficiently. ([NSThread -threadId]): Removed unnecessary private method. ([NSThread -setThreadId]): Likewise. * src/include/NSLock.h: Include renamed , not . * src/include/NSThread.h: Include renamed , not . Prepend ivars with underscore. Formatting cleanups. * src/Makefile.in (gnustep/base): Use -r test for file existance, not -e. (Reported by Adam Fedor .) * src/BinaryCStream.m: Include for byte-conversion; needed on Solaris. (Reported by Adam Fedor .) * src/Makefile.in (AUTHORS): Also search for "Rewritten by" string. Sun May 12 19:57:53 1996 Andrew McCallum * src/Coder.m ([Coder -encodeConditionalObject:]): Comment additions. ([Coder -decodeObject]): Likewise. * src/Coder.m: Remove many methods from (Coder NSCoderCompatibility), they are now included by adding the behavior from NSCoderNonCore. ([Coder +initialize]): Add behavior from NSCoderNonCore. ([Coder -encodeArrayOfObjCType:count:at:]): Method removed. ([Coder -decodeArrayOfObjCType:count:at:]): Method removed. ([Coder -encodeProperyList:]): Method removed. ([Coder -decodeProperyList:]): Method removed. ([Coder -encodePoint:]): Method removed. ([Coder -decodePoint:]): Method removed. ([Coder -encodeSize:]): Method removed. ([Coder -decodeSize:]): Method removed. ([Coder -encodeRect:]): Method removed. ([Coder -decodeRect:]): Method removed. ([Coder -encodeValuesOfObjCTypes:]): Method removed. ([Coder -decodeValuesOfObjCTypes:]): Method removed. Sat May 11 20:38:10 1996 Andrew McCallum * After consulting other developers, change "Gnustep" to "GNUstep" everywhere. * src/include/NSAutoreleasePool.h (struct autorelease_cache): New data type. * src/include/NSThread.h (NSThread _thread_autorelease_pool): New ivar. * src/NSThread.m: Preparation for thread-safety. ([NSThread -init]): Initialize new ivar. * src/NSAutoreleasePool.m: Comment changes, and preparation for thread-safety. Fri May 10 09:55:40 1996 Andrew McCallum * src/BinaryCStream.m: #include to get BITSPERBYTE on Solaris. (Reported by M. Decugis .) Wed May 8 10:53:07 1996 Andrew McCallum * src/objc-load.c (objc_load_module): Uncomment local vars when needed. (Provided by Bill Bumgarner .) * src/BinaryCStream.m (BITSPERBYTE): Define if not defined and on NeXT. (Provided by Bill Bumgarner .) Tue May 7 10:55:11 1996 Andrew McCallum * src/include/o-map.h: Prepend `o-' in #include. * src/include/o-list.h: Likewise. * src/include/o-hash.h: Likewise. * src/include/o-array.h: Likewise. * src/include/x-cbs.h.in: Likewise. * src/NSCoder.m: Separate implemented, non-core methods into separate class, in preparation for avoiding the duplication of these methods in Coder.m. ([NSCoder +initialize]): New method. (NSCoderNonCore): New class. * src/include/NSCoder.h: Declare new NSCoderNonCore class. * Makefile.in (snapshot-rtag): New target. (dist-rtag): New target. (rdiff): New target. Mon May 6 14:59:03 1996 Andrew McCallum * src/NSGArchiver.m ([NSGArchiver -encodeObjectReference:]): New method. * src/Decoder.m ([Decoder -decodeObjectAt:anObjPtr:name]): Move CREATE_REF_BEFORE_INIT assertion to inside conditional for FREF being true. * src/NSString.m (PRINTF_ATSIGN_VA_LIST): New macro, when 1, undoes previous changes. Previous changes cause crashes with my libc. * configure.in (shared): Prepend missing `lib'. (Reported by Randy Chapman .) * src/Makefile.in: It should now work again to build in a separate directory. Use ${OEXT}, not $(OEXT). (ALL_INCLUDE_FLAGS): Look in ./include, not $(srcdir). (GNU_HEADERS): Remove duplicate NS*.h files. (gnustep/base): Make soft links to the $(srcdir) include files inside ./include. (include/preface.h): Get preface.h.in from the $(srcdir)! * examples/Makefile.in (ALL_CPPFLAGS): Look for source include files in new place. * checks/Makefile.in (ALL_CPPFLAGS): Look for source include files in new place. * src/include/NSZone.h: use #include instead of #import. * doc/gnustep-faq.texi: Added "On what platforms will it run?" * src/NSArray.m ([NSMutableArray +initialize]): Add the NSArrayNonCore methods also. (Reported by Scott Christley.) * src/Makefile.in: Add `o-' prefix to object collection function files. * src/o-array.m, src/o-list.m, src/o-hash.m, src/o-map.m: Renamed from versions without `o-' prefix. This prevents aliasing with Array.m, etc, on systems without case-sensitive filenames. * src/include/o-array.h, src/include/o-hash.h, src/include/o-list.h, src/include/o-map.h: Likewise. * src/NSString.m: All uses of @"" were crashing in Linux libc-5.3.9. (arginfo_func): New function. (handle_printf_atsign): Get the string object without va_arg(). ([NSString +initialize]): Use new function. (Reported and fixed by Kai-Uwe Sattler .) Tue Apr 30 10:19:40 1996 Andrew McCallum * src/NSArray.m ([NSMutableArrayNonCore -removeObject:]): Replace with version that removes all objects equal to argument. ([NSMutableArrayNonCore -removeObjectIdenticalTo:]): Likewise. * checks/nsarray.m (main): Patched from Scott Christley. Fri Apr 19 18:11:30 1996 Andrew McCallum Make NSArchiver do object forward references the same way OpenStep does, so that -encodeConditionalObject: and -decodeObject will work as users expect. The OpenStep-style of forward referencing is actually broken in that it cannot handle cases in which -initWithCoder: deallocates self and substitutes another object for self---this is supposed to be allowed. The GNU-style of forward references robustly handles this case, as well as all the cases that OpenStep handles; the GNU code works through alternate methods: -encodeObjectReference: and -decodeObjectAt:withName:. It is recommended that programmers use the GNU archiving methods. Before these changes, the gnustep-base code that tried to handle the OpenStep-style `-encodeConditionalObject:' and `-decodeObject' did not have the same behavior as NeXT's implementation---in fact it did not do forward references at all. Users' OpenStep code that used the OpenStep methods would have failed badly. These changes implement the OpenStep-style forward references. Now NSArchiver implements OpenStep-style forward references, and Archiver implements GNU-style forward references. Be warned: by necessity, because of limitations of the OpenStep method interface, NSArchiver has the same bug as NeXT's NSArchiver. * src/NSGArchiver.m (USE_OPENSTEP_STYLE_FORWARD_REFERENCES): New macro. (NSGArchiverNullCStream): New class, interface and implementation. ([NSGArchiverNullCStream -encodeValueOfCType:at:withName:]): New method. ([NSGArchiverNullCStream -decodeValueOfCType:at:withName:]): New method. ([NSGArchiver -encodeRootObject:withName:]): New method. ([NSGArchiver -encodeConditionalObject:]): New method. ([NSGArchiver -_coderCreateReferenceForObject:]): New method. ([NSGArchiver -_coderCreateForwardReferenceForObject:]): New method. ([NSGArchiver -_coderForwardReferenceForObject:]): New method. ([NSGArchiver -_objectWillBeInProgress:]): New method. ([NSGArchiver -_objectNoLongerInProgress:]): New method. ([NSGArchiver -defaultDecoderClassname]): New method. ([NSGUnarchiver -_createReferenceBeforeInit]): New method. * src/NSArchiver.m ([NSUnarchiver +initialize]): Test self against NSUnarchiver class. * src/Encoder.m (debug_coder): Make it a static var instead of a #define. ([Encoder -_objectWillBeInProgress:]): New method. ([Encoder -_objectNoLongerInProgress:]): New method. Depending on whether we are doing GNU or OpenStep style forward references one of these two methods will create a backward reference to the object by calling -_coderInternalCreateReferenceForObject:. This will effect whether encoding make forward or backward references to objects in progress. GNU uses forward references, which is robust even when the object's -initWithCoder substitutes another object for self. ([Encoder -_encodeObject:withName:isBycopy:isForwardReference:]): Use new methods. Don't call -_coderInternalCreateReferenceForObject here, let one of the ...InProgress methods do it. * src/Decoder.m (debug_coder): Make it a static var instead of a #define. ([Decoder -_coderCreateReferenceForObject:]): Add a debugging message. ([Decoder -_coderCreateReferenceForInterconnectedObject:]): Autorelease the placeholder object. ([Decoder -_createReferenceBeforeInit]): New method. By default return NO, for the GNU-style forward references. ([Decoder -decodeObjectAt:anObjPtr:name]): [CODER_OBJECT]: Use new method; if it returns true, then we are using non-GNU, OpenStep-style forward references. In this case: (1) don't try to decode the object by sending +newWithCoder:, in fact, raise an error if the object wanted to be decoded that way; (2) call _coderInternalCreateReferenceForObject before sending -initWithCoder, not after; unfortunately this means that -initWithCoder methods cannot substitute another object for self. If it returns false, use the more robust GNU style forward references. The NSGUnarchiver overrides this method to use the OpenStep style. * src/include/Coder.h (Coder): Make ivars public, so NSGArchiver can get at them. (Encoder): Likewise. * src/TextCStream.m ([TextCStream -encodeValueOfCType:at:withName:]): If name is nil or zero-length, make it "Anonymous". (DECODE_ERROR): Add next stream contents to error message. * src/Coder.m: Include gnustep/base/Archiver.h. ([Coder +archivedDataWithRootObject:]): Use Archiver class, not NSArchiver, it matters because now the two classes handle forward references differently. * src/include/NSGArchiver.h: NSGUnarchiver inherits from NSUnarchiver, not NSArchiver! * checks/fref.m: Use Archiver, not NSArchiver, if GNU_ARCHIVING is true. (SELF_REF_DECODE_SUBSTITUTES): New macro. Thu Apr 18 08:31:53 1996 Andrew McCallum * checks/fref.m: Updated to work on NS3.3. * src/Makefile.in (Foundation): Fix dependancy to force proper handling after a cvs checkout. Wed Apr 17 08:56:09 1996 Andrew McCallum Major renaming! "GNU Objective C Class Library" -> "Gnustep Base Library" libobjects.a -> libgnustep-base.a libobjects.tar.gz -> gstep-base.tar.gz -> OBJECTS_* -> GNUSTEP_BASE_* objects_*() -> o_*() R. Andrew McCallum -> Andrew Kachites McCallum (my pre-marriage name) (my post-marriage name) ...and more... * examples/Makefile.in (EXEEXT): New variable. (OEXT): New variable. (LIBEXT): New variable. (SRCS): Remove port-{server,client}.m. * examples/dictionary.m: Warn user that the file hasn't been converted to new collection scheme, and comment out old code. * examples/second-server.m ([SecondServer -addRemoteObject:]): Don't free the string returned; mframe already does it! * examples/stdio-stream.m: Include Foundation/NSString.h. * Makefile.in: Include Makeconf. * checks/server.m: Include TcpPort.h, not SocketPort.h. * checks/client.m: Likewise. * checks/Makefile.in (../src/lib$(LIBRARY_NAME)$(LIBEXT)): New target. * doc/Makefile.in (TEXI_FILES): Rename libobjects.texi to gnustep-base.texi. Add base-desc.texi. * doc/base-desc.texi: New file. * src/include/*.h: Rename all #ifndef macro names to ...GNUSTEP_BASE_INCLUDE. * Rename all `objects_' to `o_'. This mostly affects Albin Jones' map tables, hash table, etc. * src/NSGSet.m ([NSGSet -isEqual:]): Call isEqualToSet: (in superclass). * checks/pipes.m: Include * src/objc/HashTable.h: Use preface.h instead of stdobjects.h. * src/CStream.m ([CStream -writeSignature]): Use new version macro names. * src/include/fake-main.h (main): Define as gnustep_base_user_main, not LibobjectsMain. * src/NSProcessInfo.m (__gnustep_base_subinit_args__): Renamed from libobjects... (main): Use gnustep_base_user_main, not LibobjectsMain. * checks/fref.m (test_fref): Make ARRAY a NSMutableArray, not a NSArray. ([SubFoo -encodeWithCoder:]): Add printf. ([Foo -encodeWithCoder:]): Likewise. * src/o_vscanf.c: Include objc-malloc.h from gnustep/base. * src/Makefile.in (Foundation): Add step to get rid of old Foundation directory that would come from a CVS checkout. * src/include/String.h: Don't include . Don't have String protocol inherit NSString protocol. We were having trouble with circular dependancies. * src/include/Streaming.h: Include String.h, not NSString.h. * src/include/preface.h.in: Use __preface_h_... instead of __stdobjects_h... for wrapper. Include files from gnustep/base. Include fake-main.h, instead of LibobjectsMain.h. * src/Makefile.in (include/preface.h): Make substitutions for macro name, as well as value. * Makeconf (LIBRARY_VAR): New variable. * src/Makefile.in (all): Add dependancy on `Foundation'. (Foundation): New target. * Change all #include to #include . * src/include/preface.h.in: All Makefile-maintained #defines, now have the macro name inserted by Makefile, not just the value. Comment out objects_version global variable and friends. (LAMBDA): Macro removed. (LAMBDA_VOID_PERFORM): Macro removed. (LAMBDA_ID_PERFORM): Macro removed. (LAMBDA_BOOL_PERFORM): Macro removed. * src/preface.m: Update names of global const char's. * Makefile.in: Remove/rename all mention of `objects'. * configure.in: Likewise. * examples/Makefile.in: Likewise. * checks/Makefile.in: Likewise. * Makeconf (LIBRARY_NAME): Remove `lib' prefix. * src/Makefile.in: Don't assume the `lib' prefix is included in $(LIBRARY_NAME). * Makeconf (PACKAGE_NAME): New variable. (LIBRARY_NAME): New variable. (rcs-list-locked): Target removed. * Version: Removed `OBJECTS_' prefix. * src/Makefile.in: Rename all occurrences of `objects/' to `include/'. Rename all occurrences of `Foundation/' to `include/'. Rename all occurrences of `libobjects' to `$(LIBRARY_NAME)'. Rename all occurrences of `OBJECTS_*VERSION' to `*VERSION'. (GNU_NEXT_INCLUDES): Renamed from OBJECTS_NEXT_INCLUDES. (gnustep/base): New target; make symbolic link to `include'. (all): Added dependancy on gnustep/base. (install): Put the include files in gnustep/base. Make a link from $(includedir)/Foundation to $(includedir)/gnustep/base. (installdirs): Make $(includedir)/gnustep/base, not objects and Foundation include directories. (GNU_MFILES): stdobjects.m renamed to preface.m. (GNU_HEADERS): LibobjectsMain.h renamed to fake-main.h. objects.h renamed to all.h. (HEADERS_INSTALL): stdobjects.h renamed to preface.h. (maintainer-clean): Likewise. (DIST_FILES): stdobjects.h.in renamed to preface.h.in. (RCS_FILES): Likewise. (include/preface.h): Target renamed from stdobjects.h. (preface$(OEXT)): Likewise. * src/preface.m: File renamed from stdobjects.m. * src/include/preface.h: File renamed from stdobjects.h. * src/include/fake-main.h: File renamed from LibobjectsMain.h. * src/include/all.h: File renamed from objects.h. * configure.in (AC_OUTPUT): do src/include/config.h, not src/objects/config.h. * src/objects/*, src/Foundation/*: Files moved to src/include. * src/Foundation/NSString.h: Insert contents of * src/Foundation/NSSet.h: Insert contents of * src/Foundation/NSDictionary.h: Insert contents of * src/Foundation/NSCoder.h: Insert contents of * src/Foundation/NSArray.h: Insert contents of Fix error in Decoder, that only affected TextCStream. * src/Decoder.m ([Decoder -decodeObjectAt:anObjPtr:name]): Decode the Unindent *before* decoding the fref; as does Encoder! Tue Apr 16 17:29:02 1996 Andrew McCallum * Version (OBJECTS_SUBMINOR_VERSION): Version 0.2.1. Last version before renaming from libobjects to gnustep-base. * checks/Makefile.in (CFLAGS): Add -Wno-format. (SRCS): Use new, more descriptive file names. * checks/prepend.m: Include NSValue.h * src/NotificationDispatcher.m ([NotificationDispatcher -_addObserver:notificationRequest:name:object:]): Don't release NR here. ([NotificationDispatcher -addInvocation:name:object:]): Release it here. ([NotificationDispatcher -addObserver:selector:name:object:]): Likewise. * src/TcpPort.m (debug_tcpport): Changed from 1 to 0; don't print debugging messages. * src/Proxy.m (debug_proxy): Likewise. * src/Connection.m (debug_connection): Likewise. * src/NSArray.m ([NSArrayNonCore -arrayByAddingObject:]): Autorelease the returned array. ([NSArrayNonCore -arrayByAddingObjectsFromArray:]): Likewise. ([NSArrayNonCore -subarrayWithRange:]): Likewise. * checks/nsarray.m (main): Removed several -autorelease calls that are repetative, now that NSArray autoreleases properly. The test still does not complete successfully. It tries to send -cString to an NSMutableArray. * src/objects/objc-malloc.h: Only declare "id MemoryExchaustedException" #ifdef __OBJC__. This allows to be included in non-ObjC files, i.e. C files. * src/NSZone.m: Include first. * checks/*.m: Many test??.m files renamed with descriptive names. * checks/nsarchiver.m (main): Add extra parens around assignment in while(). * checks/string.m (main): Comment out use of obsolete -withElementsCall:. * checks/nsbundle.m (main): Use object_get_class_name(), not -name. * src/Makefile.in (GNU_MFILES): Re-added Time.m. (o_vscanf$(OEXT), o_vscanf_pic$(OEXT)): New rules that turn off warnings for o_vscanf.c; it generates a bunch of unimportant ones. * src/Time.m ([Time +initialize]): Comment out day/month name handling that depends on old Collection heirarchy. ([Time +indexOfDayName:]): un-implemented. ([Time +nameOfDayIndex:]): Likewise. ([Time +indexOfMonthName:]): Likewise. ([Time +nameOfMonthIndex:]): Likewise. * checks/prepend.m: New file from test13.m. * checks/nxst.m: New file from test11.m. * checks/heap.m: New file from test04.m. * src/Heap.m ([Heap -heapifyFromIndex:]): Swap -compare: receiver and argument, so firstObject is minimum instead of maximum object. ([Heap -addObject:]): Likewise. Mon Apr 15 21:41:17 1996 Andrew McCallum * src/NSGDictionary.m ([NSGDictionaryObjectEnumerator -nextObject]): Return the key, not the object. ([NSGDictionary -objectForKey:]): Method moved from NSGMutableDictionary. ([NSGMutableDictionary +initialize]): Don't use static variable in test. * src/KeyedCollection.m ([KeyEnumerator -initWithCollection:]): New method. ([KeyEnumerator -nextObject]): New method. ([KeyEnumerator -dealloc]): New method. * doc/install.texi: Mention possible need for GNU make. Sun Apr 14 11:58:04 1996 Andrew McCallum Old archiving scheme didn't properly deal with the LinkedListNode's _linked_list ivar. * src/LinkedList.m ([LinkedList -encodeWithCoder:]): New method. ([LinkedList -initWithCoder:]): New method. ([LinkedList -_initCollectionWithCoder:]): Method removed. ([LinkedList -_encodeContentsWithCoder:]): Method removed. ([LinkedList -_decodeContentsWithCoder:]): Method removed. * src/Coder.m ([Coder -encodeConditionalObject:]): Don't use old, removed method name to see if object has already been encoded. Sat Apr 13 13:49:23 1996 Andrew McCallum * src/BinaryCStream.m (debug_binary_coder): Explicitly set to zero. * src/objects/CoderPrivate.h ([Coder (Private) -_coderReferenceForObject:): Renamed from old-xref-scheme "_coderHasObjectReference:. * checks/Makefile.in (SRCS): Added fref.m. Fix a bug with encoding an object whose encoding generates forward references to the object itself. * src/Encoder.m ([Encoder -_encodeObject:withName:isBycopy:isForwardReference:]): See if the object satisfies a forward reference *after* encoding it, not before. This is necessary because the encoding of subobjects may generate forward references to the object. (In a sense, this undoes the last change to this method, but it is significantly different in that we test whether the object is in the object_2_fref table *after* encoding the object; earlier we looked in the table before encoding the object.) As a consequence, the CODER_OBJECT_FORWARD_SATISFIER tag is no longer necessary; this was used to tag an object before it was encoded, but now we understand that we cannot know whether this object satisfies a forward reference until after it has been encoded. Thus, for all objects we encode an unsigned int after encoding the object itself. This unsigned int is either the forward reference number of zero, depending on whether this object satisfies any forward references. * src/Decoder.m ([Decoder -decodeObjectAt:withName:]): Allow for the case in which ANOBJPTR is NULL, and deal with it using a DUMMY_OBJECT local variable. Remove CODER_OBJECT_FORWARD_SATISFIER case. In the CODER_OBJECT case, decode the forward reference number, and deal with it appropriately. See the ChangeLog comments for the Encoder changes. * src/objects/CoderPrivate.h (CODER_OBJECT_FORWARD_SATISFIER): Enum constant removed; it is no longer needed. Note: decoders built after this change will not be able to read data files encoded before this change. * src/Encoder.m ([Encode -_encodeObject:withName:isBycopy:isForwardReference:]): If this object satisfies a forward reference, remove it from the object_2_fref table before encoding the object, since, in the process of encoding the object, we may generate more references to this object, and we don't want to interpret this as another forward reference satisfier; previously an object could get encoded as a forward reference satisfier more than once. Plug a memory leak in decoding. * src/Collection.m ([ConstantCollection -_decodeContentsWithCoder:]): Use alloca(), not objc_malloc(), plugging memory leak. Fri Apr 12 17:08:08 1996 Andrew McCallum * src/objects/Coder.h (Encoder fref_counter): New ivar for guaranteeing that forward references have unique names. Previous use of the MapTable count for this purpose didn't work because we occasionally removed elements from the table, and thus had aliased forward reference numbers. * src/Encoder.m ([Encoder -initForWritingToStream:withFormatVersion:cStreamClass :cStreamFormatVersion:]): Initialize new ivar. ([Encoder -_coderCreateForwardReferenceForObject:]): Use new ivar to `gensym' a new forward reference. * src/Decoder.m ([Decoder -_coderSatisfyForwardReference:withObject:]): Create fref_2_object with NSNonOwnedPointerMapValueCallBacks, not NSObjectMapValueCallBacks. * src/StdioStream.m ([StdioStream -writeBytes:length:]): Check for error condition, and report. Reporting scheme needs fixing. ([StdioStream -readBytes:length:]): Likewise. * src/LinkedList.m ([LinkedList -_decodeContentsWithCoder:]): Step through the new list, and send -setLinkedList:, otherwise the links don't properly know about their parent LinkedList. Wed Apr 10 12:37:35 1996 Andrew McCallum * src/Encoder.m ([Encoder -_coderCreateForwardReferenceForObject:]): Initialize the OBJECT_2_FREF ivar, if it hasn't been already. * configure.in: Init some emacs variables. * src/objc-malloc.m: New file, changed from objc-malloc.c. Raise a MemoryExhaustedException with NSException instead of calling objc_fatal. * src/Makefile.in (GNU_CFILES): Removed objc-malloc.c. (GNU_MFILES): Added objc-malloc.m. * src/objects/objc-malloc.h (MemoryExhaustedException): Declare this global variable; note that now objc-malloc.h cannot be included in .c files, only .m files. * src/NSRunLoop.m: New file. * src/Foundation/NSRunLoop.h: Declare classes NSDate and NSTimer. * src/Makefile.in (GNUSTEP_MFILES): Added NSRunLoop.m. (GNUSTEP_HEADERS): Added Foundation/NSRunLoop.h. * src/NSAutoreleasePool.m ([NSAutoreleasePool -dealloc]): When unintalling ourselves at the current pool, and setting our parent to be the current pool, be sure to set our parent's _CHILD ivar to nil. * src/mframe.m (mframe_do_call): Use sel_get_type() instead of class_get_instance_method() to get the selector type. For some reason the old scheme wasn't getting class methods properly; I should look at this again, though. Tue Apr 9 19:55:44 1996 Andrew McCallum * src/mframe.m (mframe_do_call): When getting the instance method, just use object->class_pointer, not object_get_class(),... because object_get_class() of a class will return the argument, not the metaclass---we want the metaclass. Mon Apr 8 13:19:17 1996 Andrew McCallum * src/TcpPort.m ([TcpInPort +newForReceivingFromPortNumber:]): Bind the socket with INADDR_ANY, (not the host's address), so that others can connect using any of the host's interfaces, including localhost. Add the host's address to _LISTENING_ADDRESS after the bind(). * src/NSDictionary.m ([NSDictionary -allKeysForObject:]): Ask SELF for objectForKey:, not K. (Reported by Robert Quillen ). Sun Mar 31 16:43:42 1996 Andrew McCallum Several small bug fixes. * src/Foundation/NSArray.h: Declare @class NSMutableArrayNonCore, not NSMutableArray. * checks/test02.m (main): Updated for new collection scheme. * src/MappedCollector.m ([MappedCollector -newEnumState]): New method. ([MappedCollector -freeEnumState:]): New method. * src/Random.m (ABS): Remove macro; now defined in objects/stdobjects.h. Separate the core and non-core methods of NSArray implementations to take advantage of the new behavior mechanisms, and to better make use of the non-core methods in the concrete implementation. * src/NSGArray.m ([NSGArray +initialize]): Add the NSArrayNonCore behavior, so we can, once and for all, avoid the need for those odd [super ...] calls, and can remove many methods. ([NSGArray -initWithObjects:count:]): Method removed. ([NSGArray -indexOfObject:]): Method removed. ([NSGArray -objectAtIndex:]): Method removed. ([NSGMutableArray +initialize]): Add the NSMutableArrayNonCore behavior, as above. ([NSGMutableArray -replaceObjectAtIndex:withObject:]): Method removed. * src/Foundation/NSGArray.h (NSGArray, NSGMutableArray): Add placeholder ivars so our instance size matches that of the behavior class that will be added. * src/NSArray.m: Divide methods between NSArray and NSArrayNonCore classes. Add NSArrayNonCore behavior to NSArray. Divide methods between NSMutableArray and NSMutableArrayNonCore classes. Add NSArrayNonCore behavior to NSArray. * src/Foundation/NSArray.h: Separate core and non-core methods. Declare with @class the new classes NSArrayNonCore and NSMutableArrayNonCore. Use the new behavior mechanisms to make it safe to subclass NSNotification. * src/Foundation/NSNotification.h: Include (NSNotification): Add placeholder ivars so our instance size matches that of the behavior class that will be added. * src/objects/Notification.h: Add #ifndef/#endif wrapper around header file. New behavior mechanisms for safe subclassing. * src/behavior.m (behavior_class_add_class): Function renamed from class_add_behavior. Add more explanation to NSCAssert(). (class_add_behavior): New function, calling above function. (behavior_class_add_category): New function. (behavior_class_add_methods): Function renamed from class_add_methods_if_not_there. * src/objects/behavior.h: Declare new function names. * src/behavior.m: Include . (class_add_behavior): Use NSCAssert() to make sure that we don't try to increase the instance size of a class that has been subclassed; (hopeless ivar layout confusion would result). * behavior.m: File renamed from behavior.c. * src/Makefile.in (GNU_CFILES): Removed behavior.c. (GNU_MFILES): Added behavior.m. Sat Mar 30 10:05:17 1996 Andrew McCallum * checks/nsdictionary.m (main): Use renamed method behavior_set_debug. * checks/nsarray.m (main): Use renamed method behavior_set_debug. * src/NSArray.m ([NSArray -lastObject]): Don't assert count; just return nil if it's empty. ([NSMutableArray -removeLastObject]): Don't assert count; raise NSRangeError if it's empty. Make NSAutoreleasePools co-exist with exceptions, safely and without leaks. (Also improve efficiency by using a linked list of arrays instead of realloc when more space is needed, and by using a cache of pools that helps avoid the allocation/deallocation of pools.) * src/NSAutoreleasePool.m: (push_pool_to_cache): New function. (pop_pool_from_cache): New function. ([NSAutoreleasePool +initialize]): New method. ([NSAutoreleasePool +allocWithZone:]): New method. ([NSAutoreleasePool -init]): Method overhauled to initialize new ivar for handling exceptions, _child; also use pool cache. (total_autoreleased_objects_count): New static variable. (BEGINNING_POOL_SIZE): Macro renamed from DEFAULT_SIZE. (autorelease_pool_cache, autorelease_pool_cache_size, autorelease_pool_cache_count): New static variables. ([NSAutoreleasePool -_setChildPool:]): New method, handling stack and dealing with exceptions. ([NSAutoreleasePool -addObject:]): Deal with linked list of arrays. ([NSAutoreleasePool -dealloc]): Deal with exceptions by releasing child pools. Place self into the pool cache instead of deallocating. ([NSAutoreleasePool +resetTotalAutoreleasedObjects]): New method. ([NSAutoreleasePool +totalAutoreleasedObjects]): New method. * src/Foundation/NSAutoreleasePool.h: Declare new ivars and methods. * src/NSArray.m ([NSArray -isEqualToArray:]): Fix typo; reverse test for returning NO. ([NSArray -arrayByAddingObject:]): New function, from Scott Christley. ([NSArray -arrayByAddingObjectsFromArray:]): Likewise. ([NSArray -subarrayWithRange:]): Implemented by Scott Christely. ([NSMutableArray -removeObjectIdenticalTo:]): Don't fail if the object is not present. Initial implementation by Scott Christley overhauled by McCallum. ([NSMutableArray -removeObject:]): Likewise. ([NSMutableArray -removeAllObjects]): Implemented by Scott Christley. ([NSMutableArray -setArray:]): New function, from Scott Christley. * src/Foundation/NSArray.h: Declare new methods. * src/objects/ArrayPrivate.h: Add new semantic to ivar _grow_factor: if it is less than 0, the array capacity grows by -_grow_factor, but never shrinks. (incrementCount): Use the ABS() of _grow_factor. (decrementCount): Only shrink the array capacity if _grow_factor is greater than 0. * src/objects/Array.h (Array _grow_factor): Change type of ivar from unsigned to int. * src/Array.m ([Array +defaultGrowFactor]): Return type changed to int. ([Array -growFactor]): Likewise. * src/objects/stdobjects.h.in (ABS): New macro, defined if not already defined. * src/objects/Array.h: Change return types of "grow factor" methods from unsigned to int. * src/IndexedCollection.m ([IndexedCollection -removeObject:]): Now removes *all* instances of ANOBJECT, not just one. ([IndexedCollection -replaceObject:withObject:]): Now replaces *all* instances of OLDOBJECT, not just one. * src/objects/IndexedCollecting.h (NO_INDEX): Change from UINT_MAX to NSNotFound, so that Array and NSArray can coexist. * checks/test01.m ([ConstantCollection -printCount]): Use object_get_class_name() instead of sending -name. Fri Mar 29 09:47:39 1996 Andrew McCallum Overhaul mframe functions. * src/mframe.m: Overhauled for memory management changes to fix leaks, various other fixes. (MFRAME_STRUCTURES_PASSED_BY_REFERENCE): Renamed from CONNECTION_STRUCTURES_PASSED_BY_REFERENCE. (mframe_dissect_call): Function renamed from dissect_method_call. Remove some redundant if()-else clauses. Clarify case in which OUT_PARAMETERS is true. Use switch statement instead of if-else's. (mframe_do_call): Function renamed from make_method_call. Get the local selector type from the target's Method, not from the selector type; this will more reliably give the correct type string. Don't bother to set OBJECT twice. Remove some redundant if()-else clauses. Use NSParameterAssert, not assert, so we can catch problems, (and not crash the D.O. server). Change the way memory management for decoded arguments is handled to remove memory leaks; use new scheme for DECODER functions that are responsonsible for making sure allocated memory is eventually freed. Use alloca() to allocate space for _C_PTR values, struct's and arrays. Overhaul the way floats and doubles are extracted from the RETFRAME; use functions with __builtin_return, instead of fishing around the RETFRAME. Use switch statement intead of if-else's. Separate cases for char's and short's. Change some local variable names for clarity. (mframe_build_return): Function renamed from dissect_method_return. Remove some redundant if()-else clauses. Use NSParameterAssert, not assert. Change the way memory management for decoded arguments is handled to remove memory leaks; use new scheme for DECODER functions that are responsonsible for making sure allocated memory is eventually freed. Use alloca() to allocate space for _C_PTR values, struct's and arrays. * src/objects/mframe.h: Declare new method names, and comment. * src/Connection.m ([Connection -forwardForProxy:selector:argFrame:]): Use new mframe interface. In the nested function DECODER, autorelease any char*'s that we decode, as required by the new memory reference scheme. ([Connection -_service_forwardForProxy:]): Likewise, for both. * src/Collection.m ([ConstantCollection -_collectionReleaseContents]): Use alloca() instead of malloc() and free(). Fixes to checks for testing new coding of float and double. * checks/server.m ([Server -returnFloat]): Append float const with `f'. Include for -connectionForProxy. * checks/client.m (main): Print the float and double before sending it. * checks/cstream.m (main): Decode the float and double. * src/BinaryCStream.m ([BinaryCStream -encodeValueOfCType:at:withName:]): Encode the exponent as a short, not an int. ([BinaryCStream -decodeValueOfCType:at:withName:]): Likewise, decoding. * src/BinaryCStream.m ([BinaryCStream -encodeValueOfCType:at:withName:]): [_C_CHARPTR]: Don't autorelease the malloc'ed pointer here; thus the behavior is analogous to decoding an object: it gives you a reference, it is the callers responsibility to free it. ([BinaryCStream -decodeValueOfCType:at:withName:]): [_C_DBL]: Fix typo. Use mantissa1, not mantissa2 twice. Fix the scheme for encoding and decoding floats and doubles. The old scheme sometimes lost precision, and it was also very inefficient. * src/BinaryCStream.m: Include (FLOAT_FACTOR): New macro. (WRITE_SIGNED_TYPE): Take new first argument, the pointer for the data. (READ_SIGNED_TYPE): Likewise. (WRITE_UNSIGNED_TYPE): Likewise. (READ_UNSIGNED_TYPE): Likewise. ([BinaryCStream -encodeValueOfCType:at:withName:]): [_C_FLT]: Use new scheme, based on frexp() to turn a float into a series of ints. [_C_DBL]: Likewise. ([BinaryCStream -decodeValueOfCType:at:withName:]): [_C_FLT]: Likewise to match. [_C_DBL]: Likewise. * src/RunLoop.m (debug_run_loop): Changed from 1 to 0; turn off debugging messages. Thu Mar 28 22:59:35 1996 Andrew McCallum * src/MallocAddress.m ([MallocAddress +autoreleaseMallocAddress:]): Fix typo in method name. * src/objects/MallocAddress.h: Fix typo. Tue Mar 26 14:23:13 1996 Andrew McCallum * src/MallocAddress.m ([MallocAddress +initialize]): Use NSNonRetainedObjectMapValueCallBacks, not NSObjectMapValueCallBacks, because otherwise the object will never get dealloc'ed. Send exceptions in the D.O. server back to the client. This is not finished. We still need to address some potential memory leaks. * examples/second-client.m (main): Add a call that causes an exception in the server, and catch the returned exception. * src/Connection.m: In all methods, use NSParameterAssert() instead of assert(), so that it raises an NSException, and doesn't abort(). ([Connection -forwardForProxy:selector:argFrame:]): Decode the flag that indicates whether the return packet hold an exception or the return values. If it holds an exception, decode it and raise it. ([Connection -_service_forwardForProxy:]): Surround the processing of the method request packet with NS_DURING...NS_ENDHANDLER. If an exception is raised, catch it, encode in in a specially flagged packet, and send the packet back to the client. * src/BinaryCStream.m ([BinaryCStream -decodeValueOfCType:at:withName:]): [_C_CHARPTR]: Autorelease the malloc'ed char pointer. Before memory was leaking. * src/Connection.m: Use NSException instead of sending -error: in all methods. * src/Proxy.m: Likewise. * src/NSString.m: Likewise. * src/NSObject.m: Likewise. * src/NSAutoreleasePool.m: Likewise. * src/Encoder.m: Likewise. * src/Decoder.m: Likewise. * src/BinaryCStream.m: Likewise. * src/OrderedCollection.m ([OrderedCollection -putObject:atIndex:]): Return type changed from id to void. Use NSException, not error:. Mon Mar 25 19:27:06 1996 Andrew McCallum Fixing miscellaneous bugs that showed up with -Wall. * src/NXStringTable_scan.l (string_buf_ptr): Init local variable. * src/NSBundle.m ([NSBundle +setSystemLanguages:]): Comment out unused variables. * src/NSData.m ([NSMutableData -resetBytesInRange:]): Cast to avoid warning. ([NSMutableData -initWithLength:]): Likewise. * src/NSValue.m ([NSValueDecoder -initValue:withObjCType:]): Return self. * src/objc-load.c (objc_load_module): Comment out unused variables. * src/UdpPort.m: Include for MAXHOSTNAMELEN. ([UdpInPort -newPacketReceivedBeforeDate:]): Return nil. Sun Mar 24 17:04:24 1996 Andrew McCallum Just a little futzing. * src/UdpPort.m (name_2_port_number): Function renamed from name_to_port_number, and changed to better use IPPORT_USERRESERVED. ([UdpInPort +newForReceivingFromPortNumber:]): Overhauled and commented. Fri Mar 22 08:39:03 1996 Andrew McCallum * src/NSObject.m ([NSObject +initialize]): Use NSNonOwnedPointerOrNullMapKeyCallBacks, not NSNonRetainedObjectsMapKeyCallBacks; keying on addresses, and avoiding a call to -isEqual, is better. Thu Mar 21 20:17:05 1996 Andrew McCallum * src/BinaryCStream.m ([BinaryCStream -encodeValueOfCType:at:withName:name]): [_C_CHARPTR]: Write the string with the host LENGTH, not the network LENGTH! * src/NSGSet.m ([NSGSet -isEqual:]): Make this just compare the id's, not call [super isEqual:]. I did this to prevent an infinite loop while running checks/nsarchiver.m, but I have a feeling that the bug might be in map.c, not here. Look at this again! * src/Set.m ([Set -nextObjectWithEnumState:]): Dereference ENUMSTATE; this change mirrors the earlier change to [NSGSet -nextObject]. * src/KeyedCollection.m ([ConstantKeyedCollection -_decodeContentsWithCoder:]): Reverse order of objects and keys, to match _encodeContentsWithCoder:. * src/Makefile.in (GNUSTEP_CFILES): Removed NSZone.c. (GNUSTEP_MFILES): Added NSZone.m. * NSZone.m: Renamed from NSZone.c. (NSZoneSetName, NSZoneName): New functions; unimplemented. * src/Foundation/NSZone.h: Declare new functions. * src/Makefile.in (objects/stdobjects.h): Create it in the build directory, not $(srcdir). (Reported by Albin Jones.) Thu Mar 21 13:13:35 EST 1996 Albin L. Jones * src/Foundation/NSGeometry.h: Added documentation commentary and reformatted things a little. Also separated the typedef's from the struct declarations in the definitions of NSPoint, NSSize, and NSRect. (This is for conformity to the GNU coding standards.) * src/NSGeometry.m: Added documentation commentary and reformatted things a little. Also added bits of code to guarantee that functions which return BOOL do so. * src/Foundation/NSHashTable.h: Added full documentation. * src/Foundation/NSMapTable.h: Ditto. * src/Foundation/NSRange.h: Separated the typedef from the struct declaration for NSRange. (This is for conformity to the GNU coding standards.) * src/Makefile.in: Added new files to GNU_MFILES, GNU_HEADERS; removed old files from GNU_CFILES, GNU_OTHER_SRCFILES, GNUSTEP_HEADERS, GNUSTEP_MFILES. Removed GNU_BASICS_CFILES, GNU_BASICS_HFILES, GNU_CALLBACKS_CFILES, GNU_CALLBACKS_HFILES; they are no longer needed. * src/Makefile.in (libobjects.so): Replaced dependency objects/stdobjects.h with $(HEADERS_INSTALL). * src/Makefile.in (libobjects.a): Ditto. * src/NSHashTable.m (_NSHT_extra_retain): Fixed annoying "Bus error" bug. * src/NSHashTable.m: Removed the usage of "allocs". Now uses zones only. * src/NSHashTable.m: Many other changes, none fundamental. More comments. * src/NSMapTable.m: Removed the usage of "allocs". Now uses zones only. * src/NSMapTable.m: Many other changes, none fundamental. More comments. * src/abort.c, src/allocs.c., src/atoz.m, src/objects/abort.h src/objects/allocs.h, src/objects/bitops.h, src/objects/minmax.h: Got rid of these, as they were no longer needed. * src/array.c: Became src/array.m. * src/data.c: Became src/data.m. * src/hash.c: Became src/hash.m. * src/list.c: Became src/list.m. * src/map.c: Became src/map.m. * src/callbacks-char_p.c: Became src/cbs-char-p.m. * src/callbacks-id.m: Became src/cbs-id.m. * src/callbacks-int_p.c: Became src/cbs-int-p.m. * src/callbacks-int.c: Became src/cbs-int.m. * src/callbacks-void_p.c: Became src/cbs-void-p.m. * src/callbacks.c: Became src/callbacks.m. * src/number.c: Became src/numbers.c. * src/x-basics.c.in: Became src/x-bas.m.in. * src/x-callbacks.c.in: Became src/x-cbs.m.in. * src/objects/magic.h, src/objects/number.h: Merged to form src/objects/numbers.h. * src/objects/x-basics.h.in: Became src/objects/x-bas.h.in. * src/objects/x-callbacks.h.in: Became src/objects/x-cbs.h.in. * src/array.m, hash.m, list.m, map.m: Removed usage of "allocs", changed to using zones only. Thu Mar 21 19:27:56 1996 Andrew McCallum * src/Makefile.in (CFLAGS): Added -Wno-implicit. * src/BinaryCStream.m: Overhauled to use htonl() and friends. New format is incompatible with the old. * checks/Makefile.in (SRCS): Add coder.m and cstream.m. Wed Mar 20 13:21:16 1996 Andrew McCallum * src/Makefile.in (CC): Added -pipe. Tue Mar 19 12:10:44 1996 Andrew McCallum * checks/server.m: Use new RunLoop mechanism, and new Array method names. ([Server -connection:didConnect:]): Clean up search for invalidated proxies. * checks/client.m: Use new RunLoop mechanism. * src/TcpPort.m (debug_tcp_port): Set to 1. ([TcpInPort -encodeWithCoder:]): Use encodeBytes:.., not encodeValue..; the data is already in network byte-order. ([TcpOutPort -encodeWithCoder:]): Likewise. ([TcpOutPort +newWithCoder:]): Likewise. ([TcpOutPort +newForSendingToSockaddr:withAcceptedSocket:pollingInPort:]): Set entirety of _REMOTE_IN_PORT_ADDRESS to zero. * src/Encoder.m ([Encoder -encodeBytes:count:withName:]): Update for new argument types. * src/Decoder.m ([Decoder -decodeBytes:count:withName:name]): Update for new argument types, and verify read count. * src/objects/Coding.h (Coding -encodeBytes:count:withName:): Use void*, not char* for bytes. (Coding -decodeBytes:count:withName:): Likewise, and pass COUNT, not pointer to COUNT. * src/Encoder.m ([Encoder -encodeBytes:count:withName:]): Method implemented; although it may need to change later. * src/Decoder.m ([Decoder -decodeBytes:count:withName:name]): Likewise. * src/RunLoop.m ([RunLoop -acceptInputForMode:beforeDate:]): If LIMIT_DATE is nil, poll the inputs, but don't wait if there is nothing available immediately. Check to make sure that the LIMIT_DATE hasn't already past; if it has, return immediately, before polling input sources. Mon Mar 18 13:31:38 1996 Andrew McCallum Miscellaneous small fixes, found with -Wall. * src/NSThread.m: Fix indentation. ([NSThread +currentThread]): Add parenthesis around assignment inside while. * src/NSString.m: Include . ([NSString -componentsSeparatedByString:]): Initialize ARRAY! * src/List.m: Include Use OBJC_MALLOC and friends, instead of NX_MALLOC. * src/Decoder.m ([Decoder -finishDecodingInterconnectedObjects]): Comment out temporarily unused AWAKE_SEL local variable. * src/Proxy.m: Raise NSExceptions instead of using -error:. Debug bug the occurs when a client disconnects from the server, and other clients have references to Proxy's of the disconnected client. * examples/second-server.m ([SecondServer -connectionBecameInvalid:]): Correctly detect proxies that should be removed from the array. * examples/second-client.m (main): Run RunLoop properly according to new style. * src/Proxy.m ([Proxy -encodeWithCoder:]): Add a more explanatory error message for the use of invalid Connections. ([Proxy +encodeObject:withConnectedCoder:]): Likewise. ([Proxy -forward::]): Likewise. * src/Connection.m ([Connection -_handleRmc:]): [METHOD_REQUEST]: Fix conditional for which we handle a request immediately. Before it inappropriately queued call backs from the server on which we were waiting, causing us to wait forever. * src/TcpPort.m ([TcpOutPort -encodeWithCoder:]): Add debugging message. ([TcpOutPort +newWithCoder:]): Add debugging message. * src/Proxy.m ([Proxy +encodeObject:withConnectedCoder:]): Assert that triangle connection proxy out port's are valid. Fix tricky autorelease bugs. * examples/second-server.m ([SecondServer -connectionBecameInvalid:]): Don't release REMOTES; it was already autoreleased. (main): Enable double release check with NSObject. * src/NSMapTable.m (NSAllMapTableKeys): Don't autorelease the return value; it was already autoreleased. Too many autoreleases were causing crashes. (NSAllMapTableValues): Likewise. * src/NSObject.m ([NSObject -autorelease]): Print retain and release counts in more helpful error message. * src/NSAutoreleasePool.m ([NSAutoreleasePool -dealloc]): Set CURRENT_POOL to PARENT, even if PARENT is nil. This is correct behavior. Old behavior could cause infinite loops in the PARENT pointers. Remove old vestiges of nil mode used when RunLoop modes were ignored. * src/RunLoop.m ([RunLoop -limitDateForMode:]): Assert mode. ([RunLoop -acceptInputForMode:beforeDate:]): Likewise. * src/NSTimer.m ([NSTimer +scheduledTimerWithTimeInterval:invocation:repeats:]): Add to RunLoopDefaultMode, not nil. ([NSTimer +scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:]): Likewise. * src/Connection.m ([Connection -_getReceivedReplyRmcWithSequenceNumber:]): Run the RunLoop in RunLoopConnectionReplyMode, not nil mode. Update Connection for new RunLoop/Port interaction/interface. * src/Connection.m ([Connection +newForInPort:outPort:ancestorConnection:]): Add the in port to the RunLoop in new RunLoop style. ([Connection -addToRunLoop:forMode:]): Method removed. ([Connection -removeFromRunLoop:forMode:]): Method removed. ([Connection -_getReceivedReplyRmcWithSequenceNumber:]): Use new class method for RunLoop. ([Connection -invalidate]): Remove comment about removing from RunLoop. RunLoop's now automatically remove invalid ports. (RunLoopConnectionReplyMode): New run loop mode string. * src/objects/Connection.h: Remove old methods. Add declaration of new RunLoop mode. Fix the relationship between RunLoop's and Port's. Maintain the fd_set, and information about which Port's are registered with which RunLoop's entirely in the RunLoop. Also implement multiple MODE's with RunLoop's---previously the MODE was ignored: * checks/tcpport-server.m (main): Add port to run loop using new scheme. * checks/tcpport-client.m (main): Likewise. * src/TcpPort.m: Removed methods for dealing remembering locally which RunLoop we've been added to; now the RunLoop manages this. ([TcpInPort +newForReceivingFromPortNumber:]): Don't initialize the the removed ivar ACTIVE_FD_SET. Likewise with _RUN_LOOPS. ([TcpInPort -newPacketReceivedBeforeDate:]): Don't use removed _RUN_LOOPS. ([TcpInPort -old_receivePacketWithTimeout:]): Remove old deprecated method. ([TcpInPort -invokeWithObject:]): Method removed. ([TcpInPort -newPacketReceivedBeforeDate:]): Overhauled to use new RunLoop mechanism. ([TcpInPort -getFds:count:]): New method, called by RunLoop. ([TcpInPort -readyForReadingOnFileDescriptor:]): Likewise. ([TcpInPort -_addClientOutPort:]): Updated for new scheme. ([TcpInPort -_connectedOutPortInvalidated:]): Likewise. ([TcpInPort -addToRunLoop:forMode:]): Method removed. ([TcpInPort -removeFromRunLoop:forMode:]): Method removed. ([TcpInPort -dealloc]): Don't release deleted ivar _RUN_LOOPS. * src/objects/TcpPort.h (TcpInPort _run_loops): Removed ivars. (TcpInPort _client_sock_2_out_port, _client_sock_2_packet): Prepended ivars with underscores. * src/RunLoop.m: Add new explanatory comment at beginning. ([RunLoop -init]): Initialize new ivars. ([RunLoop -currentMode]): New method. ([RunLoop -addFileDescriptor:object:forMode:]): Method replaces -addFileDescriptor:invocation:forMode:, and re-implemented. Not yet functional. ([RunLoop -removeFileDescriptor:forMode:]): Likewise. ([RunLoop -addPort:forMode:]): New method. ([RunLoop -removePort:forMode:]): New method. ([RunLoop -addTimer:forMode:]): Overhauled to do the right thing with the MODE argument. ([RunLoop -acceptInputForMode:beforeDate:]): Method overhauled to ask port objects for their FD's, create FD_2_OBJECT map table on the fly, and initialize FDS on the fly. Now properly removed invalidated ports from the MODE. ([RunLoop -runOnceBeforeDate:forMode:]): New method. ([RunLoop -runOnceBeforeDate:]): New method. ([RunLoop -runUntilDate:forMode:]): New method. ([RunLoop -runUntilDate:]): New method. ([RunLoop +runUntilDate:forMode:]): New method. ([RunLoop +runOnceBeforeDate:]): New method. ([RunLoop +runOnceBeforeDate:forMode:]): New method. ([RunLoop +currentMode]): New method. (RunLoopDefaultMode): New global variable. ([NSObject -performSelector:afterDelay:]): Not implemented. * src/objects/RunLoop.h: Many new methods declared. (RunLoop _mode_2_timers): New ivar. (RunLoop _mode_2_in_ports): New ivar. (RunLoop _mode_2_fd_listeners): New ivar. (RunLoopDefaultMode): New extern variable. * src/objects/RandomGenerating.h (RandomGenerating): Inherit from NSObject protocol. Remove methods +alloc and -init. * src/NSDate.m ([NSDate +distantFuture]): Increase efficiency by caching a single instance in a static variable. ([NSDate +distantPast]): Likewise. Fri Mar 15 19:13:57 1996 Scott Christley * checks/nsarray.m (main): Filled out tests for NSArray and NSMutableArray classes. Sun Mar 17 18:20:17 1996 Andrew McCallum Many miscellaneous small bug fixes, found with -Wall: * src/objects/objects.h: Don't include * src/mframe.m (dissect_method_return): Initialize RETFRAME to NULL to prevent warning. * src/UdpPort.m: Change references to non-existant UdpPacket class to UdpInPacket. * src/objects/UdpPort.h: Declare classes UdpInPacket and UdpOutPacket. * src/TcpPort.m (bzero): New macro, to memset(); for FD_ZERO(). * src/RunLoop.m: Remove references to NAN. Include for memset. (bzero): New macro, to memset(); for FD_ZERO(). * src/NSTimer.m: Remove references to NAN. * src/Proxy.m ([Proxy +newWithCoder:]): Remove unused variable. * src/NotificationDispatcher.m ([NotificationDispatcher -removeObserver:name:object:]): Remove unused variables. * src/NSNotificationCenter.m: Include * src/NSNotification.m: Include * src/NSInvocation.m ([NSInvocation -methodSignature]): Return nil. * src/NSDate.m ([NSDate -initWithString:]): Initialize theTime to 0, to prevent warning. * src/NSData.m ([NSData +_setConcreteClass:]): Include for memset(). * src/NSCountedSet.m ([NSCountedSet -countForObject:]): Return 0. * src/NSBundle.m: Minor comment format fix. * src/Invocation.m: Remove several unused local variables. ([MethodInvocation -invokeWithObject:]): Revert last change: call -invokeWithTarget:, not -subclassResponsibility. * src/NSAllocateObject.m: Include for memset(). * src/NSAutoreleasePool.m ([NSAutoreleasePool -parentAutoreleasePool]): Remove inclusion of eltfuncs.h and collhash.h. Miscellaneous archiving fixes. * src/NSArchiver.m ([NSArchiver +initialize]): Use ==, not = in if test. * src/Encoder.m ([Encoder -_coderCreateReferenceForObject:]): Return the xref! ([Encoder -_coderCreateReferenceForConstPtr:]): Likewise. * src/Coder.m: Return nil for several -notImplemented methods that are to return objects. * src/CStream.m ([CStream -initForWritingToStream:s]): Return the result. * src/TextCStream.m ([TextCStream -decodeName:name]): Pass correct value to debug message. * src/RawCStream.m ([RawCStream -encodeValueOfCType:at:withName:name]): Remove unused variable. ([RawCStream -decodeValueOfCType:at:withName:]): Likewise. Switch on *type, not unused variable. Miscellaneous fixes to collection classes. * src/MutableCString.m ([MutableCString -initWithCoder:]): Remove unused variable n. Return self, not n. * src/OrderedCollection.m ([OrderedCollection -replaceRange:withCollection:]): Return void. ([OrderedCollection -replaceRange:usingCollection:]): Likewise. * src/MappedCollector.m ([MappedCollector -initWithObjects:forKeys:count:]): Return self. * src/LinkedList.m ([LinkedList -initWithObjects:count:]): Return self. * src/KeyedCollection.m ([ConstantKeyedCollection -initWithObjects:forKeys:count:]): Return nil. ([ConstantKeyedCollection -objectAtKey:]): Likewise. ([ConstantKeyedCollection -keyOfObject:]): Likewise. ([ConstantKeyedCollection -withKeysInvoke:]): Return void. ([ConstantKeyedCollection -withKeysInvoke:whileTrue:]): Likewise. ([ConstantKeyedCollection -nextObjectAndKey:withEnumState:]): Return nil. ([ConstantKeyedCollection -copyValuesAs:]): Likewise. ([ConstantKeyedCollection -nextObjectAndKey:withEnumState:]): Likewise. * src/IndexedCollection.m ([ConstantIndexedCollection -prevObjectWithEnumState:]): Use assignment, not equality test for setting enumState to -1. * src/GapArray.m ([GapArray -empty]): Renamed from _collectionEmpty, and implemented to do entire job of emptying. * src/Dictionary.m ([Dictionary -newEnumState]): Removed useless cruft. * src/Collection.m ([ConstantCollection -detectObjectByInvoking:]): Set detectedObject to nil to avoid warning. ([ConstantCollection -maxObject]): Initialize MAX to nil. ([ConstantCollection -minObject]): Initialize MIN to nil. ([Collection -uniqueContents]): Iterate over CP, not SELF. * src/CircularArray.m ([CircularArray -empty]): Renamed from _collectionEmpty, and implemented to do entire job of emptying. * src/Array.m ([Array -empty]): Renamed from _empty, and implemented to do entire job of emptying. Fri Mar 15 13:10:34 1996 Andrew McCallum * doc/Makefile.in (GNUstep-FAQ.html): New target. (GNUstep-FAQ): Rules modified to handle @email{} and @url{}. Tue Mar 12 09:43:32 1996 Andrew McCallum * checks/tcpport-server.m, checks/tcpport-client.m: Method name changes. * checks/Makefile.in (SRCS): Add nstimer.m. * src/TcpPort.m ([TcpInPort +newForReceivingFromPortNumber:]): Initialize _run_loops. ([TcpInPort -addToRunLoop:forMode:]): Use new _run_loops Bag. ([TcpInPort -removeFromRunLoop:forMode:]): Likewise. ([TcpInPort -_connectedOutPortInvalidated:]): Likewise. ([TcpInPort -_addClientOutPort:]): Likewise. ([TcpInPort -dealloc]): Release _run_loops. ([TcpOutPort -outPacketClass]): Method renamed from -packetClass. ([TcpOutPort +outPacketClass]): Likewise. * src/objects/TcpPort.h (TcpInPort _run_loops): Make it a Bag. (TcpInPort _run_loop_modes): Remove ivar. * src/Port.m ([InPort -setReceivedPacketInvocation:]): Assert that _packet_invocation isn't already set. * src/RunLoop.m ([RunLoop -removeFileDescriptor:forMode:]): Add debugging message. * src/NSGSet.m ([NSGSet -member:]): Return value. * src/IndexedCollection.m ([ConstantIndexedCollection -firstObject]): Return nil if empty. ([ConstantIndexedCollection -lastObject]): Likewise. ([ConstantIndexedCollection -prevObjectWithEnumState:]): Use -1 to deal with reversals at extremes. ([ConstantIndexedCollection -nextObjectWithEnumState:]): Use [self count] to deal with reversals at extremes. * src/Connection.m (in_port_2_ancestor): New static variable. ([Connection +initialize]): Initialize it. ([Connection +newForInPort:outPort:ancestorConnection:]): Use new static variable to handle ancestor; (ignore ancestor argument; the method name will be changed later). Set the in-port's packet invocation to the Connection class. Don't call -addToRunLoop.. here, the mechanics of it were already done above. ([Connection -addToRunLoop:forMode:]): Mark it as not implemented, for now. ([Connection -runConnectionUntilDate:]): Don't add to run loop here. ([Connection +invokeWithObject:]): Make it a class method instead of an instance method; alter contents appropriately for this. ([Connection -portIsInvalid:]): Look at in_port_2_ancestor and remove ourselves if necessary. ([Connection -invalidate]): Don't remove ourselves from the run loop here, because we may not be the only one listening. This still needs fixing. * src/ConnectedCoder.m ([ConnectedEncoder -dismiss]): Fix typo in sendPacket: call. * src/IndexedCollection.m: Several minor fixes to return types and return values. Also: ([ReverseEnumerator -nextObject]): Pass pointer to enum_state. ([ConstantIndexedCollection -prevObjectWithEnumState:]): Method overhauled. ([ConstantIndexedCollection -nextObjectWithEnumState:]): Likewise. ([ConstantIndexedCollection -newEnumState]): New method. * src/Foundation/NSGSet.h: Remove #include of objects/elt.h. * src/Foundation/NSGDictionary.h: Likewise. * src/Foundation/NSGArray.h: Likewise. * src/NSGSet.m: Remove #include of objects/eltfuncs.h. * src/NSGDictionary.m: Likewise. * src/NSGCountedSet.m: Likewise. * src/AutoreleasePool.m: Remove #include of objects/collhash.h. * src/TcpPort.m: Updated to conform to new Port class. TcpPacket class split into TcpInPacket and TcpOutPacket. * src/objects/TcpPort.h: Declare new methods and classes. * src/RunLoop.m: Debugging messages conditioned on debug_run_loop. ([RunLoop -runOnceBeforeDate:forMode:]): New method. * src/objects/RunLoop.h: Declare new method. * src/Port.m ([Port +outPacketClass]): Method renamed from packetClass. ([Port -outPacketClass]): Likewise. ([InPort -setReceivedPacketInvocation:]): Method renamed from setPacketInvocation. ([OutPort -sendPacket:]): Method renamed from -sendPacket:withTimeout:. (OutPacket, InPacket): New classes, replacing Packet class. * src/objects/Port.h: Declare new methods and classes. * src/MemoryStream.m ([MemoryStream -initWithCapacity:prefix:]): New method. * src/objects/MemoryStream.h: Declare new method. * src/Connection.m: Remove old-style methods for getting incoming ConnectedCoders. Add new methods that use RunLoop. All callers changed. ([Connection -addToRunLoop:forMode:]): New method. ([Connection -removeFromRunLoop:forMode:]): New method. ([Connection -runConnectionUntilDate:]): New method. ([Connection -runConnection]): Method changed to call above method. ([Connection -_handleRmc:]): New method. ([Connection -_handleQueuedRmcRequests]): New method. ([Connection -_getReceivedReplyRmcFromQueueWithSequenceNumber:]): New method. ([Connection -_getReceivedReplyRmcWithSequenceNumber:]): New method. ([Connection -invokeWithObject:]): New method. ([Connection +newForInPort:outPort:ancestorConnection:]): Set reply_depth ivar. ([Connection -_encoderCreateReferenceForConstPtr:]): Return the xref! * src/objects/Connection.h: Declare new methods. Type arguments with InPort and OutPort, not just Port. (Connection reply_depth): New ivar. * src/ConnectedCoder.m ([ConnectedDecoder +newDecodingWithPacket:connection:]): New method. Old method +newDecodingWithConnection:timeout: is deprecated. * src/objects/ConnectedCoder.h: Declare new method. Mon Mar 11 12:02:04 1996 Andrew McCallum * checks/tcpport-server.m: Updated for RunLoop. * checks/tcpport-client.m: Likewise. * src/RunLoop.m: New file. * src/objects/RunLoop.h: New file. * src/NSTimer.m: New file. * src/Makefile.in (CFLAGS): Add -Wall. (GNU_MFILES): Add RunLoop.m. (GNU_HEADERS): Add objects/RunLoop.h. (GNUSTEP_MFILES): Add NSTimer.m. (GNUSTEP_HEADERS): Add Foundation/NSTimer.h. * src/TcpPort.m ([TcpInPort -receivePacketWithTimeout:]): Completely new implementation that uses the RunLoop. ([TcpInPort -old_receivePacketWithTimeout:]): New method, holding old implementation. ([TcpInPort -invokeWithObject:]): New method, called by RunLoop. ([TcpInPort -_tryToGetPacketFromReadableFD:]): New private method. ([TcpInPort -_addClientOutPort:toRunLoop:forMode:]): New method. ([TcpInPort -addToRunLoop:forMode:]): New method. ([TcpInPort -_removeClientOutPort:fromRunLoop:forMode:]): New method. ([TcpInPort -removeFromRunLoop:forMode:]): New method. ([TcpInPort -_addClientOutPort:]): Add it to the RunLoop. ([TcpInPort -_connectedOutPortInvalidated:]): Remove it from the RunLoop. ([TcpInPort -_addClientOutPort:]): Method renamed from _addOutPort:. * src/objects/TcpPort.h (TcpInPort _run_loop, _run_loop_mode): New ivars. * src/Port.m ([InPort -init]): Set _packet_invocation. ([InPort -setPacketInvocation:]): New method. ([InPort -addToRunLoop:forMode:]): New method. ([InPort -removeFromRunLoop:forMode:]): New method. * src/objects/Port.h: Declare new methods. (Port _packet_invocation): New ivar. * src/NotificationDispatcher.m ([NotificationDispatcher +defaultInstance]): New method. ([NotificationDispatcher -removeObserver:name:object:]): Remove handling of non-existance _nil_observer_array. * src/NSDate.m: Many small formatting changes. (UNIX_REFERENCE_INTERVAL): Macro renamed from UNIX_OFFSET. ([NSConcreteDate -timeIntervalSinceNow]): New method. * src/Invocation.m (return_retained): Change macro from 1 to 0. * src/Foundation/NSTimer.h: Declare NSTimer class interface. * src/Connection.m ([Connection -isValid]): New method. * src/objects/NotificationDispatcher.h ([NotificationDispatcher +defaultInstance]): Declare new method. * src/objects/Notification.h (Notifying): New protocol. (NotificationPosting): New protocol. * src/objects/Connection.h: Declare new method. * src/objects/Array.h (ConstantArray): Inherit from ConstantIndexedCollection, not IndexedCollection. * src/IndexedCollection.m ([IndexedCollection +initialize]): Compare self with IndexedCollection, not KeyedCollection. * doc/gnustep-faq.texi: Changes by Scott Christley. Thu Mar 7 15:51:51 1996 Andrew McCallum * src/TcpPort.m ([TcpInPort -receivePacketWithTimeout:]): Move initialization of select_timeout to inside loop since Linux select() modifies *select_timeout. Wed Mar 6 11:40:02 1996 Andrew McCallum * src/TcpPort.m: Assert is_valid in many places. ([TcpInPort +newForReceivingFromPortNumber:]): Get the address of the host, not localhost=127.0.0.1. ([TcpInPort -invalidate]): Remove ourselves from socket_2_port and port_number_2_port here instead of in -dealloc. ([TcpInPort -description]): Indicate whether we are valid or not in string. ([TcpOutPort -description]): Likewise. ([TcpOutPort -invalidate]): Assert is_valid, don't just conditionally execute body. Remove ourselves from out_port_bag and socket_2_port here, not in -dealloc. ([TcpPacket +_getPacketSize:andReplyPort:fromSocket:inPort:]): If we don't read() full prefix, don't abort(), just return EOF. * src/Proxy.m: Assert that the connection is valid in several places. * src/Connection.m: Assert is_valid in many places. ([Connection +newForInPort:outPort:ancestorConnection:]): Set is_valid to 1. Only ask for notification of out port death if out port is non-nil. ([Connection -portIsInvalid:]): Properly get the port from the notification object. * src/Port.m ([Port -invalidate]): Insist that is_valid is true at the beginning of this method, don't test it and skip the body of this method. Force users to be careful about calling -invalidate more than once. * src/NSMapTable.m (NSAllMapTableValues): Get rid of unused variable ARRAY. Return VALUEARRAY, not unused variable. * examples/second-server.m (announce_new_port): New function. (announce_broken_port): New function. (main): Register them for notifications; let user choose registered name on command line. * examples/second-client.m (main): Use new notification interface. * checks/nsnotification.m (main): Wrap it with an NSAutoreleasePool. * checks/tcpport-server.m (main): Use new notification interface for invocations. * src/NotificationDispatcher.m (NotificationRequest): Ivar names prepended with `_'. (NotificationInvocation): Likewise. (NotificationPerformer): Likewise. ([NotificationDispatcher -_addObserver:notificationRequest:name:object:]): Insist that observer be non-nil; (in the case of Invocation's, the invocation is now the observer). ([NotificationDispatcher -addInvocation:name:object:]): Method renamed from -addObserver:invocation:... Pass the invocation as the observer. Release the NR after it has been added. ([NotificationDispatcher -addObserver:selector:name:object:]): Release the NR after it has been added. ([NotificationDispatcher -_removeFromLinkedListNotificationRequest:]): New method. ([NotificationDispatcher -removeInvocation:]): New method. ([NotificationDispatcher -removeInvocation:name:object:]): New method. ([NotificationDispatcher -removeObserver:]): Use _removeFromLinkedListNotificationRequest:. ([NotificationDispatcher -removeObserver:name:object:]): Likewise. ([NotificationDispatcher +addInvocation:name:object:]): New method. ([NotificationDispatcher +removeInvocation:]): New method. ([NotificationDispatcher +removeInvocation:name:object:]): New method. * src/objects/NotificationDispatcher.h: Declare new methods. * src/Connection.m ([Connection +initialize]): Initialize all_connections_local_targets. ([Connection -addLocalObject:]): Put it in all_connections_local_targets also. ([Connection -removeLocalObject:]): Remove it from all_connections_local_targets also. Tue Mar 5 10:32:51 1996 Andrew McCallum * examples/second-server.m: Use notifications instead of old scheme for invalidation listening. * examples/second-server.h: Don't conform to no-longer-used InvalidationListening protocol. * examples/second-client.m (announce_new_connection): New function. (main): Register it for notifications. Run the connection forever, instead of on a 15 second timeout. * examples/first-client.m (main): Before exit, invalidate the connection, not the proxy. * examples/textcoding.m: Send -close to Archiver, not old -closeCoder. * examples/Makefile.in (first): Force check for re-compilation of libobjects. (second): Likewise. * checks/tcpport-server.m (announce_new_connection): New function. (announce_broken_connection): New function. (main): Register new functions for notifications. Send messages back to clients to test reply port mechanism. * checks/tcpport-client.m: Test the reply port mechanism; look for messages coming back from the server. * checks/server.m: Use Array instead of List. Use NotificationDispatcher to hear about invalid and new connections. Let the user set the registerd name from the command line. * checks/server.h: Update for new server interface. * checks/client.m (main): Let user set registered name from command line. * checks/Makefile.in (SRCS): Added nsnotification.m. (tcpport, remote): Force check of libobjects re-compilation. * doc/Makefile.in (TEXI_FILES): Add gnustep-faq.texi. (GNUstep-FAQ): New target. * src/TcpPort.m: Many ivar names changed for clarity. Some new ivars added; see changes to TcpPort.h. Overhaul of how TcpOutPort's track their remote address. Previously they used the address of their local peer; this is no good when encoding a TcpOutPort on the wire for D.O.; the D.O. reciever needs a way to contact the listen'ing socket of the TcpInPort in order to form a new connection. _remote_in_port_address is now the address of the remote listen'ing socket. Added many comments throughout. All perror() calls changes to be more informative. (debug_tcp_port): Make this a static variable instead of a macro. (init_socket_2_port): Check pre-existance of socket_2_port here instead of callers. ([TcpInPort +newForReceivingFromPortNumber:]): Method overhauled. Don't bind socket to INADDR_ANY because we need to be able to encode our unique host address on the wire for D.O. ([TcpInPort -_listeningSockaddr]): New method. ([TcpInPort -receivePacketWithTimeout:]): Method overhauled. Get the reply port for an incoming packet from the packet prefix. ([TcpInPort -_connectedOutPortInvalidated:]): Add debugging message. ([TcpInPort -classForConnectedCoder:]): Return the TcpOutPort class, not [self class] because we always encode a "send right" (ala Mach), not a "recieve right". ([TcpOutPort +newForSendingToSockaddr:withAcceptedSocket:pollingInPort:]): Method renamed, and majorly overhauled. Now many different combinations of NULL argument do different things. This is now the single designated initializer. We now check both the SOCKADDR and the SOCK argument to find previously-created TcpOutPort's. This method is also used to set the remote_in_port_address of an already-created TcpOutPort. There is more error checking. ([TcpOutPort +newForSendingToPortNumber:onHost:]): Overhauled. ([TcpOutPort +_newWithAcceptedSocket:peeraddr:inPort:]): Overhauled to work with new designated initalizer. ([TcpOutPort -sendPacket:withTimeout:]): Use new low-level Packet interface that deals with reply ports. ([TcpOutPort +packetClass]): New method. (PREFIX_LENGTH_TYPE): New macro. (PREFIX_LENGTH_SIZE): New macro. (PREFIX_ADDRESS_TYPE): New macro. (PREFIX_ADDRESS_SIZE): New macro. (PREFIX_SIZE): New macro. ([TcpPacket -_initForReceivingWithSize:replyPort:]): Use 0 prefix, because the separate +_getPacketSize... method reads those bytes. ([TcpPacket -_writeToSocket:withReplySockaddr:]): Now the prefix includes the sockaddr of the reply port. If ADDR is non-null, set the reply port address portion of the prefix. ([TcpPacket +_getPacketSize:andReplyPort:fromSocket:inPort:]): New method, replacing +readPacketSizeFromSocket:. ([TcpPacket -_fillFromSocket:]): Set Stream's eofPosition properly. Leave Stream's position at zero. (InPortAcceptedClientNotification): New notification string. * src/objects/TcpPort.h: Declare new ivars and notfication strings. * src/Proxy.m: Change many ivar names. (debug_proxy): Temporarily set to 1. ([Proxy +newForRemoteTarget:connection:]): Set new ivar names. Embellish debugging message to include connection. ([Proxy -invalidateProxy]): Return void instead of self. ([Proxy +encodeObject:withConnectedCoder:]): Overhauled, encode tag, and change order of encoding for more efficient encoding. Added many comments. ([Proxy +newWithCoder:]): Likewise, to match. Also added a check to make sure we don't return a bogus pointer for a local object; do this by checking with connection's +includesLocalObject; if it's not there, raise an exception. ([Proxy -forward::]): Call the new forwarding method name in Connection. * src/objects/Proxy.h: Several ivar name changes. Method types fixed. * src/Connection.m (default_in_port_class, default_out_port_class): New static variables, replacing default_port_class. (all_connections_local_targets): New map table; not used yet, though. (debug_connection): Temporarily set to 1. ([Connection +initialize]): Set new static vars. ([Connection +setDefaultInPortClass:]): New method. ([Connection +defaultInPortClass]): New method. ([Connection +setDefaultOutPortClass:]): New method. ([Connection +defaultOutPortClass]): New method. ([Connection -init]): Use new default_in_port_class. ([Connection +new]): Likewise. ([Connection +newWithRootObject:]): Likewise. ([Connection +newRegisteringAtName:withRootObject:]): Likewise. ([Connection +rootProxyAtName:onHost:]): Likewise. ([Connection +rootProxyAtPort:]): Likewise. ([Connection +newForInPort:outPort:ancestorConnection:]): Assert the in port. Embellish the debugging message to print the in port and out port. Set the new connection's in port and out port ivars. Register ourselves as observers of port invalidation with the NotificationDispatcher. Post a notification that a new connection was created. ([Connection -runConnectionWithTimeout:]): Use _serviceReceivedRequestsWithTimeout:. ([Connection -_newReceivedRmcWithTimeout:]): Use decodingClass, not encodingClass. ([Connection -_serviceReceivedRequestsWithTimeout:]): Method name changed from -newReceivedReplyRmcWithSequenceNumber:. ([Connection +includesLocalObject:]): New method; still needs more infrastructure to work, though. ([Connection -inPortClass]): New method. ([Connection -outPortClass]): New method. ([Connection -setInPortClass:aPortClass]): New method. ([Connection -setOutPortClass:aPortClass]): New method. ([Connection -_encoderCreateReferenceForConstPtr:]): Add 1 to map table count to get xref. ([Connection -_decoderCreateReferenceForConstPtr:]): Likewise. ([Connection -dealloc]): Remove ourselves from the NotificationDispatcher. (ConnectionWasCreatedNotification): New notification string. * src/objects/Connection.h (in_port_class, out_port_class): New ivars replacing port_class. Declare methods to get and set them. * src/ConnectedCoder.m (CONNECTED_CODER_FORMAT_VERSION): New macro. ([ConnectedEncoder -_initForWritingWithConnection:sequenceNumber:identifier:]): Get packetClass from the connection's outPort, not the outPortClass. Return self. ([ConnectedDecoder +readSignatureFromCStream:getClassname:formatVersion:]): Fill in name and version. * src/LinkedList.m ([LinkedList -prependObject:]): Fix return type. ([LinkedList -insertObject:atIndex:]): Likewise. * src/Encoder.m ([Encoder -_coderCreateReferenceForObject:]): Insert it in object_2_xref, not const_ptr_2_xref. ([Encoder -_encodeObject:withName:isBycopy:isForwardReference:]): Create the in_progress_table with NSNonOwnedPointerMapKeyCallBacks, not NSObject..; needed by distributed objects so we don't get infinite loop with proxy objects. * src/Decoder.m ([Decoder +readSignatureFromCStream:getClassname:formatVersion:]): Compare got with 6, not 2. ([Decoder -_coderCreateReferenceForObject:]): Add warning comment about a -retain we don't want. Fix this eventually! * src/objects/CoderPrivate.h (SIGNATURE_FORMAT_STRING): Remove "version" from between class name and format version. * src/CStream.m: Use new SIGNATURE_FORMAT_STRING, as defined in objects/CoderPrivate.h. Sat Mar 2 19:33:26 1996 Andrew McCallum Wrote implementation of GNU Notification and NotificationDispatcher classes. Used these as the engines for new versions of the NSNotification* classes. The previous versions of NSNotification and NSNotificationCenter were buggy and slow. The new GNU implementations have some dramatic improvements speed, due to extra use of hash tables, and the use of LinkedList's; they also have some better features. * src/Notification.m: New file. * src/NotificationDispatcher.m: New file. * src/objects/Notification.h: New file. * src/objects/NotificationDispatcher.h: New file. * src/NSNotificationCenter.m: Completely new implementation based on GNU NotificationDispatcher. This version is much faster, and has some better features. * src/NSNotification.m: Completely new implementation based on GNU Notification. * src/Foundation/NSNotification.h: New interface based on GNU Notification and NotificationDispatcher. * src/Makefile.in (GNU_MFILES): Added Notification.m and NotificationDispatcher.m. Removed SocketPort.m. (GNU_HEADERS): Added objects/Notification.h and objects/NotificationDispatcher.h. Removed objects/SocketPort.h. * src/Foundation/NSConnection.h (NSConnectionDeath): New macro. * src/objects/TcpPort.h: Declare new methods and new Notification String. * src/Proxy.m ([Proxy +initialize]): Don't return self. * src/objects/Magnitude.h: Don't include * src/LinkedList.m ([LinkedList -insertObject:after:]): When inserting first object, set _count to 1. ([LinkedList -insertObject:before:]): Likewise. ([LinkedList -appendObject:]): Don't claim ownership here if we're going to call -insertObject:after: later. ([LinkedList -prependObject:]): Likewise. And renamed from prependElement. ([LinkedList -insertObject:atIndex:]): Likewise. ([LinkedList -newEnumState]): New method. ([LinkedList -nextObjectWithEnumState:]): Overhauled. ([LinkedList -prevObjectWithEnumState:]): Likewise. * src/LinkedListNode.m ([LinkedListNode -initialize]): Method removed. ([LinkedListNode -init]): Set _linked_list. * src/Connection.m ([Connection +connectionsCountWithInPort:]): Fix use of END_FOR_ARRAY. ([Connection -invalidate]): Post ConnectionBecameInvalidNotification. (ConnectionBecameInvalidNotification): New extern String. * src/objects/Connection.h (ConnectionBecameInvalidNotification): Declare extern new String. * src/objects/String.h (String): Make the protocol inherit from the NSObject protocol. * src/objects/Collecting.h (ConstantCollecting): Make is inherit from the NSObject protocol. * src/TcpPort.m ([TcpInPort -numberOfConnectedOutPorts]): New method. ([TcpInPort -_connectedOutPortInvalidated:]): Post an InPortClientBecameInvalidNotification. ([TcpInPort -portNumber]): New method. ([TcpInPort -description]): New method. ([TcpOutPort +newWithAcceptedSocket:inPort:]): Fill in the _address ivar. ([TcpOutPort -portNumber]): New method. ([TcpOutPort -description]): New method. * src/Invocation.m ([MethodInvocation -invokeWithObject:]): Make it a -subclassResponsibililty. ([MethodInvocation -initWithArgframe:selector:]): Raise an exception if we are unable to get a non-null selector type string. * src/Port.m ([Port -invalidate]): Post PortBecameInvalidNotification. (PortBecameInvalidNotification): New String object. * src/NSGDictionary.m ([NSGMutableDictionary -objectForKey:]): New method. * src/KeyedCollection.m ([ConstantKeyedCollection -description]): Use object_get_class_name instead of -name. * src/Foundation/NSObject.h (NSObject (NEXSTEP)): Comment out -name method because NSNotification.h declares it with a different type. Eventually we'll have to come up with a more permanent solution. * src/DelegatePool.m ([DelegatePool -forward::]): Fix use of END_FOR_ARRAY. * src/Collection.m ([Enumerator -nextObject]): Pass pointer to ENUM_STATE. ([Enumerator -dealloc]): Likewise. ([ConstantCollection -detectObjectByInvoking:]): Use -returnValueIsTrue. ([ConstantCollection -printForDebugger]): Use object_get_class_name instead of -name because -name is now ambiguously typed. Fri Mar 1 09:53:31 1996 Andrew McCallum * checks/Makefile.in: Removed all invdividual targets for executables. Use general rule that works for GNU make, but may not work for others. (SRCS): Add tcpport-server.m and tcpport-client.m. (tcpport): New target. * src/MachPort.m: Surrounded by #if for mach. * src/Port.m: Overhauled for new Port heirarchy. More changes than I want to list individually. * src/objects/Port.h: Likewise. * src/TcpPort.m, src/objects/TcpPort.h: New files. * src/UdpPort.m, src/objects/UdpPort.h: New files. * src/MachPort.m,src/objects/MachPort.h: New files. * src/Makefile.in (GNU_MFILES): Added UdpPort.m. (GNU_HEADERS): Added objects/UdpPort.h. * src/Makefile.in (GNU_MFILES): Add MachPort.m. (GNU_HEADERS): Add objects/MachPort.h. * src/Encoder.m ([Encoder -_coderCreateReferenceForConstPtr:]): Get xref before asserting it. * src/objects/CoderPrivate.h (WRITE_SIGNATURE_FORMAT_ARGS): Use STRINGIFY() for OBJECTS_PACKAGE_NAME. * src/objects/stdobjects.h.in (STRINGIFY): New macro defined, if not defined already. (XSTRINGIFY): Likewise. * src/objects/Array.h (END_FOR_ARRAY): Macro renamed from FOR_ARRAY_END, and given argument. * src/Connection.m: Overhauled for new collections, coders and ports. More changes than I want to list individually. * src/ConnectedCoder.m: Likewise. * src/objects/ConnectedCoder.h: Likewise. * src/objects/Connection.h: Likewise. * src/Proxy.m: Likewise. * src/objects/Proxy.h: Likewise. All this overhaul work not yet finished. Thu Feb 29 21:49:33 1996 Andrew McCallum * src/Makefile.in (GNUSTEP_MFILES): Re-added Connection.m and ConnectedCoder.m. (GNUSTEP_HEADERS): Removed duplicate Foundation/NSHashTable.h. Wed Feb 28 20:37:27 1996 Andrew McCallum * checks/invocation.m: Test many new features. * src/objects/CoderPrivate.h (SIGNATURE_FORMAT_STRING): Change to include package name and version. (WRITE_SIGNATURE_FORMAT_ARGS): New macro. * src/objects/stdobjects.h.in: New macro. * src/Decoder.m ([Decoder +readSignatureFromCStream:getClassname:formatVersion:]): Get new values. * src/Encoder.m ([Encoder -writeSignature]): Use new macro. * src/Makefile.in (GNU_MFILES): Add TcpPort.m. (GNU_HEADERS): Add objects/TcpPort.h. Sun Feb 25 13:01:50 1996 Andrew McCallum * src/Makefile.in (FILE_AUTHORS): Added "Albin L. Jones". Sat Feb 24 13:47:40 1996 Andrew McCallum * src/Makefile.in (GNUSTEP_MFILES): Add NSInvocation.m. * src/NSInvocation.m: Class implemented using Invocation as behavior. * src/Foundation/NSInvocation.h: Remove ivars. Define so that behavior can be used. * src/Invocation.m (return_retained): New macro. ([Invocation -setReturnValue:]): Retain return value if necessary. ([ArgframeInvocation -_retainArguments]): Add missing local var. ([MethodInvocation -initWithArgframe:type:]): New method. ([MethodInvocation -initWithArgframe:selector:]): Use new method. Set selector using sel_pointer. ([ObjectFunctionInvocation -invokeWithObject:]): Use return_retained, not args_retained. Fri Feb 23 14:35:05 1996 Andrew McCallum * src/Invocation.m ([Invocation -initWithReturnType:]): Use new ivar names. Use calloc instead of malloc. ([Invocation -encodeWithCoder:]): New method. ([Invocation -initWithCoder:]): New method. ([Invocation -classForConnectedCoder:]): New method. ([Invocation -returnType]): Use new ivar name. ([Invocation -setReturnValue:]): New method. ([Invocation -objectReturnValue]): Method implemented. ([Invocation -intReturnValue]): Method implemented. ([Invocation -returnValueIsTrue]): Method implementation finished. ([Invocation -dealloc]): Use new ivar name. Release return type if necessary. ([ArgframeInvocation -_retainArguments]): New method. ([ArgframeInvocation -_initArgframeFrom:withType:retainArgs:]): Method overhauled. ([ArgframeInvocation -initWithArgframe:type:]): Use new method. ([ArgframeInvocation -encodeWithCoder:]): New method. ([ArgframeInvocation -initWithCoder:]): New method. ([ArgframeInvocation -argumentTypeAtIndex:]): Use new ivar name. ([ArgframeInvocation -retainArguments]): New method. ([ArgframeInvocation -argumentsRetained]): New method. ([ArgframeInvocation -_deallocArgframe]): New method. ([ArgframeInvocation -dealloc]): Use new method. Release args if necessary. ([MethodInvocation -_initTargetAndSelPointers]): New method. ([MethodInvocation -initWithArgframe:selector:]): Use new method. ([MethodInvocation -initWithCoder:]): New method. ([MethodInvocation -initWithTarget:selector:...]): Retain args if necessary. ([MethodInvocation -invoke]): Use new ivars. ([MethodInvocation -invokeWithTarget:]): Use -setTarget:. ([MethodInvocation -selector]): Use new ivar. ([MethodInvocation -setSelector:]): Likewise. ([MethodInvocation -target]): Likewise. ([MethodInvocation -setTarget:]): Likewise. ([ObjectMethodInvocation -_initArgObjectPointer]): New method. ([ObjectMethodInvocation -initWithArgframe:selector:]): Use new method. ([ObjectMethodInvocation -initWithCoder:]): New method. ([ObjectMethodInvocation -invokeWithObject:]): New method. (VoidFunctionInvocation): New class implementation. (ObjectFunctionInvocation): New class implementation. * src/objects/Invocation.h: Make -invoke methods return void. Include objects/Invoking.h. (return_type): ivar renamed from encoding. (ArgframeInvocation args_retained): new ivar. (MethodInvocation target_pointer): new ivar. (MethodInvocation sel_pointer): new ivar. (VoidFunctionInvocation): New class. (ObjectFunctionInvocation): New class. * src/objects/Invoking.h: Make -invoke methods return void. * src/Encoder.m ([Encoder +initialize]): Compare self with Encoder, not Coder. ([Encoder +encodeRootObject:withName:toStream:]): Rename method to -close. ([Encoder -encodeSelector:withName:name]): Use sel_get_any_typed_uid instead of sel_get_any_uid. * src/Stream.m ([Stream -close]): Method renamed from -closeStream. * src/objects/Streaming.h: Likewise. * src/StdioStream.m ([Stream -close]): Likewise. * src/MemoryStream.m ([Stream -close]): Likewise. * src/objects/Coder.h ([Coder +setDefaultCStreamClass:]): Declare method. ([Coder +defaultCStreamClass]): Declare method. * src/Coder.m ([Coder -close]): Method renamed from -closeCoding. * src/objects/Coding.h: Likewise. Thu Feb 22 10:03:01 1996 Andrew McCallum * src/NSObject.m (retain_counts): Make it a NSMapTable instead of a coll_hash. (NSIncrementExtraRefCount): Update for new retain_counts type. (NSDecrementExtraRefCountWasZero): Likewise. ([NSObject +initialize]): Likewise. ([NSObject -retainCount]): Likewise. * src/Makefile.in (GNU_HEADERS): Add objects/bitops.h, objects/minmax.h. (GNU_OTHER_SRCFILES): Add md5.h. * src/Makefile.in (GNU_HEADERS): Add objects/Enumerating.h, objects/Invoking.h. * src/Makefile.in (GNU_HEADERS): Add objects/array.h. * Makefile.in (DIST_FILES): Add RELEASE-NOTES. * src/NSString.m ([NSString -hash]): Don't use elt_* function, and use NSHashStringLength. * src/String.m ([String -hash]): Likewise. * src/simple-load.h (__objc_dynamic_find_symbol): Cast to drop const type, and avoid warning. * src/Makefile.in (GNU_MFILES): Remove eltfuncs.m. (GNU_HEADERS): Remove objects/elt.h, objects/eltfuncs.h. * src/Makefile.in (GNU_CFILES): Remove collhash.c. (GNU_HEADERS): Remove objects/collhash.h. * src/CString.m ([CString -initWithCString:range:]): Don't make super call. Fix infinite loop in _collectionDealloc. * src/BinaryCStream.m ([BinaryCStream -decodeValueOfCType:at:withName:]): Make save_type const. * src/AutoreleasePool.m: Don't include . * src/AutoreleaseStack.m: Likewise. * examples/textcoding.m: Overhaul for new collection class scheme to improve distributed objects and NeXT-compatibility. * checks/Makefile.in (SRCS): Add nsmaptable.m and nshashtable.m. * checks/nsarchiver.m: Update for new Archiver classes. * checks/test01.m: Update for new collection classes. * doc/Makefile.in (TEXI_FILES): Add faq.texi. * doc/faq.texi: New file. * src/Foundation/NSGSet.h: Remove ivars, the behavior code now handles this. * src/Foundation/NSGDictionary.h: Likewise. * src/objects/Coder.h: Declare classes Encoder and Decoder; extensive rearrangement of ivars, method names and protocols. * src/objects/RetainingNotifier.h: Don't include * src/objects/Archiver.h: Subclass from Encoder and Decoder, not Coder. * src/Makefile.in (GNUSTEP_OTHER_SRCFILES): Add NSCallBacks.h. (GNUSTEP_HEADERS): Remove Foundation/NSCallBacks.h. * src/Makefile.in (CFLAGS): Remove -Wno-implicit. (GNU_MFILES): Remove BinaryTreeEltNode.m, LinkedListEltNode.m, RNTreeEltNode.m. Add Decoder.m, Encoder.m. Temporarily remove ConnectedCoder.m, Connection.m, RetainingNotifier.m, Time.m. (GNU_CFILES): Add allocs.c. (GNU_OBJS): Change order to create BASICS and CALLBACKS first. (GNU_HEADERS): Remove BinaryTreeEltNode.h, EltNode-h, EltNode-m, LinkedListEltNode.h, RBTreeEltNode.h. (GNUSTEP_MFILES): NSCallBacks.m. (GNUSTEP_HEADERS): Foundation/NSCallBacks.h. * Encoder.m, Decoder.m, NSCallBacks.m: New files. * objects/OrderedCollecting.h, objects/Enumerating.h, objects/Invoking.h, objects/CoderPrivate.h, objects/OrderedCollection.h: New files. * src/Coder.m: Move much of functionality to Encoder.m, Decoder.m, and objects/CoderPrivate.h. * src/Invocation.m ([Invocation -objectReturnValue]): New method. ([Invocation -intReturnValue]): New method. ([Invocation -returnValueIsTrue]): New method. ([Invocation -initWithTarget:selector:...]): Use switch statement to handle value arguments, instead of pointer-to-value arguments. * src/NSConcreteNumber.m ([NumberTemplate -hash]): New method. ([NumberTemplate -isEqual:]): New method. ([NumberTemplate -encodeWithCoder:]): Make this self-contained. ([NumberTemplate -initWithCoder:]): Likewise. * src/NSData.m: Fix typos. * src/Port.m ([Port -encodeWithCoder:]): Fix argument type. * src/OrderedCollection.m: Many fixes, continuing conversion from old IndexedCollection.m * src/NSValue.m ([NSValueDecoder +newWithCoder:]): Comment out for now; I think it needs fixes. ([NSValueDecoder -initWithCoder:]): Likewise. * src/NSNumber.m ([NSNumber -description]): New method. * src/callbacks-char_p.c, src/callbacks-id.m, src/callbacks-int.c, src/callbacks-int_p.c, src/callbacks-void_p.c, src/callbacks.c, src/hash.c, src/list.c, src/map.c, src/objects/allocs.h, src/objects/array.h, src/objects/callbacks.h, src/objects/data.h, src/objects/hash.h, src/objects/list.h, src/objects/map.h, src/objects/objects.h, src/x-basics.c.in, src/x-callbacks.c.in, src/NSHashTable .m, src/NSMapTable.m, src/Foundation/atoz.h, src/Foundation/NSMapTable.h, src/Foundation/NSHashTable.h: New version from Albin Jones, plus fixes by McCallum. Major overhaul of collection class heirarchy to improve distributed objects and NeXT-compatibility. Many classes entirely-reworked. More changes than I want to list here. * src/KeyedCollection.m, src/IndexedCollection.m, src/Heap.m, src/GapArray.m, src/Dictionary.m, src/Bag.m, src/Array.m, src/CircularArray.m, src/Collection.m, src/ConstantString.m, src/DelegatePool.m, src/MappedCollector.m, src/MutableString.m, src/MutableCString.m, src/Queue.m, src/RBTree.m, src/Set.m, src/SplayTree.m, src/Stack.m, src/objects/Array.h, src/objects/Bag.h, src/objects/BinaryTree.h, src/objects/BinaryTreeNode.h, src/objects/Collecting.h, src/objects/Collection.h, src/objects/CollectionPrivate.h, src/objects/Dictionary.h, src/objects/Heap.h, src/objects/IndexedCollecting.h, src/objects/IndexedCollection.h, src/objects/KeyedCollecting.h, src/objects/KeyedCollection.h, src/objects/LinkedList.h, src/objects/LinkedListNode.h, src/MallocAddress.m, src/objects/MappedCollector.h, src/MutableString.m, src/MutableCString.m, src/NSString.m, src/NSGSet.m, src/NSGCString.m, src/NSGDictionary.m, src/NSGCountedSet.m, src/NSGArray.m, src/NSGArchiver.m, src/objects/Queue.h, src/objects/Set.h, src/objects/SplayTree.h, src/objects/Stack.h, src/String.m: Overhaul for new collection class scheme to improve distributed objects and NeXT-compatibility. * src/DelegatePool.m: Overhaul for new collection class scheme to improve distributed objects and NeXT-compatibility. Change several methods to return void. * src/objects/DelegatePool.h: Change many method return types to void. Thu Feb 15 11:18:33 1996 Andrew McCallum * src/Makefile.in (GNU_MFILES): Removed EltNodeCollector.m. (GNU_HEADERS): Removed objects/EltNodeCollector.h. Wed Feb 14 12:23:12 1996 Andrew McCallum * Makefile.in (RCS_FILES): Add INSTALL.WIN32. * src/Makefile.in (RCS_FILES): Add Makefile.sed.nt. * checks/Makefile.in (RCS_FILES): Undo last change. * Makefile.in (RCS_FILES): Undo last change. Tue Feb 13 11:00:51 1996 Andrew McCallum * src/Makefile.in (GNU_MFILES): Added OrderedCollection.m. (GNU_HEADERS): Added objects/OrderedCollection.h and objects/OrderedCollecting.h. * checks/Makefile.in (RCS_FILES): Remove Makefile.sed.nt, (which, as I understand, is supposed to be automatically generated from Makefile.in by configure.bat). (SRCS): Fix typo. * Makefile.in (RCS_FILES): Remove Makefile.sed.nt, (which, as I understand, is supposed to be automatically generated from Makefile.in by configure.bat). * doc/install.texi: Mention objc.patch. * Makefile.in (DIST_FILES): Add objc.patch for thread-safe runtime. * src/RawCStream.m, objects/RawCStream.h: New files. * src/Makefile.in (GNU_MFILES): Added RawCStream.m. (GNU_HEADERS): Added objects/RawCStream.h. * checks/diningPhilosophers.m (main): Cast (int) to (id) in detachNewThread... call. * src/NSNotification.m, src/NSNotificationCenter.m, src/Foundation/NSNotification.h: New files from Georg Tuparev. * src/Makefile.in (GNUSTEP_MFILES): Added NSNotification.m and NSNotificationCenter.m from Georg Tuparev. (GNUSTEP_HEADERS): Added Foundation/NSNotification.h from Georg Tuparev. Mon Feb 5 10:08:56 1996 Scott Christley (scottc@net-community.com) * checks/diningPhilosophers.m: New file * checks/Makefile.in: add diningPhilosophers.m * src/Foundation/NSGeometry.h: Add NSZeroPoint, NSZeroSize, and NSZeroRect constants. Sun Feb 4 18:43:41 1996 Scott Christley (scottc@net-community.com) * checks/Makefile.sed.nt: New file * configure.bat: Added configuration of checks makefile * checks/Makefile.in (RCS_FILES): Add file Makefile.sed.nt Add $(EXEEXT), $(OEXT), $(LIBEXT) extensions * test01.m: Different random() for WIN32 * src/Foundation/NSZone.h: include Sat Feb 3 22:28:52 1996 Scott Christley (scottc@net-community.com) * src/NSLock.m: New file * src/Foundation/NSLock.h: New file * src/NSThread.m: New file * src/Foundation/NSThread.h: New file * src/Makefile.in (GNUSTEP_MFILES): Add NSLock.m, NSThread.m (GNUSTEP_HEADERS): Add Foundation/NSLock.h, Foundation/NSThread.h Fri Feb 2 15:44:20 1996 Scott Christley (scottc@net-community.com) * src/Makefile.in (uninstall): Only uninstall NEXTSTEP_HEADERS Thu Feb 1 19:42:09 1996 Scott Christley (scottc@net-community.com) * src/objects/SocketPort.h: Exclude non-existent headers for WIN32 * src/objects/Time.h: Likewise * src/SocketPort.m: Likewise * src/NSBundle.m: Likewise * src/objects/NSCoder.h: fixed mispelled file name * src/NSCoder.m: remove inclusion of non-existent file * src/Date.m: Exclude non-existent headers for WIN32 * src/NSProcessInfo.m: Likewise * src/find_exec.c: Likewise * Makefile.in (RCS_FILES): Add file configure.bat, Makefile.sed.nt Add $(EXEEXT), $(OEXT), $(LIBEXT) extensions * configure.bat: New file * Makefile.sed.nt: New file * src/Makefile.sed.nt: New file * src/objects/config-nt.h: New file * src/objects/config-nt.sed: New file * src/objc-load.c: Runtime include file changed "objc/list.h" to "objc/objc-list.h" * src/objects/stdobject.h.in: Likewise Mon Feb 12 22:03:05 1996 Andrew McCallum * src/Makefile.in: Fix patch rejects. (GNUSTEP_MFILES): Added NSHashTable.m and NSMapTable.m. (GNUSTEP_HEADERS): Added Foundation/NSHashTable.h and Foundation/NSMapTable.h. Mon Feb 12 21:14:58 1996 Albin L. Jones * src/Makefile.in (GNU_MFILES, GNU_CFILES, GNU_HEADERS): Added the above to the appropriate lists. (GNU_BASICS_CFILES): Created this variable to hold a list of `...-basics.c' files to be made. (GNU_BASICS_HFILES): Similarly. (GNU_CALLBACKS_CFILES): Created this variable to hold a list of `...-callbacks.c' files to be make. (GNU_CALLBACKS_HFILES): Similarly. (GNU_OTHER_SRCFILES): Needed to add `x-basics.c.in', `x-callbacks.c.in', `objects/x-basics.h.in' and `objects/x-callbacks.h.in' to this list. (GNUSTEP_HEADERS): Added `Foundation/atoz.h'. (%-basics.c, %-callbacks.c, objects/%-basics.h, objects/%-callbacks.h): Added these make targets. (array.o, data.o, hash.o, list.o, map.o, objects/array.h, objects/data.h, objects/hash.h, objects/list.h, objects/map.h): Added these make targets. * src/NSHashTable.m, src/NSMapTable.m, src/Foundation/NSHashTable.h, src/Foundation/NSMapTable.h, src/Foundation/atoz.h: Added these. * src/objects/abort.h, src/objects/allocs.h, src/objects/array.h, src/objects/bitops.h, src/objects/callbacks.h, src/objects/data.h, src/objects/hash.h, src/objects/list.h, src/objects/magic.h, src/objects/magic.h, src/objects/minmax.h, src/objects/number.h: Added these. * src/abort.c, src/allocs.c, src/array.c, src/atoz.m, src/callbacks-char_p.c, src/callbacks-id.m, src/callbacks-int.c, src/callbacks-int_p.c, src/callbacks-void_p.c, src/callbacks.c, src/hash.c, src/list.c, src/map.c, src/md5.c, src/md5.h, src/number.c: Added these. Mon Feb 12 20:50:05 1996 Andrew McCallum * checks/invocation.m: New file. * checks/Makefile.in (SRCS): Add invocation.m. * checks/nsarchiver.m: Add test case from Scott Christley. * src/Collection.m ([Collection -withObjectsInvoke:]): New method. * src/objects/Collection.h: Declare new method. * src/Invocation.m ([Invocation -invoke]): Terminate copy of encoding string. Deal with void return type. ([Invocation -invokeWithElement:]): Method removed. ([Invocation -invokeWithObject:]): Make is -subclassResponsibility. ([Invocation -getReturnValue:]): Make sure return_value is non-NULL. ([ArgframeInvocation -initWithArgframe:type:]): Use objc_calloc. ([MethodInvocation -initWithArgframe:selector:]): Try hard to get a selector with a type string. ([MethodInvocation -initWithTarget:selector:...]): New method. ([MethodInvocation -invoke]): Get the target and selector properly. ([MethodInvocation -invokeWithObject:]): New method. * src/objects/Invocation.h: Declare new methods. * src/NSArchiver.m ([NSUnarchiver +allocWithZone:]): New method. * src/Coder.m ([Coder -decodeObject]): Return the object. ([Coder -initForReadingWithData:]): New method. Thu Feb 1 17:04:17 1996 Andrew McCallum * NSData.m, NSDictionary.m, NSEnumerator.m, NSMutableData.m, Port.m, MutableString.m, NSArray.m: Use -subclassResponsibility instead of -notImplemented where appropriate. Wed Jan 31 22:29:57 1996 Andrew McCallum * Makefile.in (DIST_FILES): Add file STATUS. * src/Coder.m ([Coder -_coderCreateReferenceForObject:]): Beginning with this method, put in, but comment out, initial notes for ideas about "tag-less" coder streams; this will allow for smaller archives. Sat Jan 27 20:58:23 1996 Andrew McCallum * examples/textcoding.m (main): Use new Archiver and Unarchiver classes, use new method names. * src/objects/Coding.h (CommonCoding -closeCoding): Renamed from -coderCoder, so it is not so exclusively associated with the Coding class, but also all subclasses that implement a *Coding protocol. * src/Coder.m ([Coder -closeCoding]): Method renamed from -closeCoder. ([Coder +encodeRootObject:withName:toStream:]): Make -closeCoding name change. * src/Coder.m ([Coder +newReadingFromStream:]): Renamed from coderReadingFromStream:, because, for subclasses of Coder, it's silly to have different names for this method. Don't autorelease returned object (I also find this more helpful). All callers changed. ([Coder +newReadingFromFile:]): Likewise. * src/objects/Coder.h: Rename methods. * src/ConnectedCoder.m ([ConnectedCoder +newDecodingWithConnection:timeout:]): Rename coderReadingFromStream to newReadingFromStream, and don't retain. * src/Archiver.m: New file. * src/objects/Archiver.h: New file. * src/Makefile.in (GNU_MFILES): Add Archiver.m. (GNU_HEADERS): Add objects/Archiver.h. Fri Jan 26 10:48:30 1996 Andrew McCallum * Version (OBJECTS_SUBMINOR_VERSION): libobjects version 0.2.0. (OBJECTS_MINOR_VERSION): Version 2. * src/Makefile.in (GNU_HEADERS): Added CStreaming.h. * src/objects/objects.h: Include BinaryCStream.h and TextCStream.h, not the old *Coder.h versions. * src/objects/ConnectedCoder.h (Coder): Make subclass of Coder, not BinaryCoder. * src/TextCStream.m ([TextCStream -encodeValueOfCType:at:withName:]): Remove the asserts that prohibited structs and arrays. ([TextCStream -decodeValueOfCType:at:withName:]): Likewise. * src/BinaryCStream.m: Include the code for handling structs and arrays. * src/objects/Streaming.h: Include instead of . Update checks and examples * checks/server.m: Make it work with the new coding scheme. * checks/client.m: Likewise. * checks/pipes.m (main): Use NSString in -initWithPipeFrom argument. * checks/Makefile.in (SRCS): Remove test08.m, it was for old-style archiving. * examples/textcoding.m (main): Use new coding scheme and @"" strings properly. * examples/stdio-stream.m (main): Likewise. * src/ConnectedCoder.m ([ConnectedCoder +newDecodingWithConnection:timeout:]): Use +coderReadingFromStream, not the deprecated -initReadingFromStream. * src/BinaryCStream.m ([BinaryCStream -decodeName:]): Check for NULL name. * src/Connection.m: encodeObjectBycopy -> encodeBycopyObject (to better match NeXT). * src/Proxy.m: Likewise. * src/Coder.m ([Coder +initialize]): Make BinaryCStream the default, not TextCStream. * src/Coder.m ([Coder -encodeTag:]): Let the cstream handle it, if it can. ([Coder -decodeTag]): Likewise. ([Coder -encodeClass:]): Perform classname mapping ala encodeClassName:intoClassName. ([Coder -_doEncodeBycopyObject:]): Perform callbacks -replacementObjectForCoder, -replacementObjectForArchiver, -classForCoder, -classForArchiver. ([Coder -encodeClassName:intoClassName:]): Fix typos. ([Coder -encodeConditionalObject:]): Don't encode *forward* references, only backward references; apparently NeXT-style decoding (with -decodeObject, instead of GNU's decodeObjectAt:) can't handle them. * src/Foundation/NSArchiver.h: Move NSUnarchiver declaration here from NSUnarchiver.h. * src/NSGArchiver.m: Move implementation of NSGUnarchiver here from NSGUnarchiver.m. * src/Foundation/NSGArchiver.h: Remove ivars; behavior code now handles instance_size. Move NSGUnarchiver here from NSGUnarchiver.h. * src/NSArchiver.m: Move NSUnarchiver implementation here from NSUnarchiver.m. Use subclassResponsibility where correct. ([NSArchiver +initialize]): Make NSGArchiver the concrete class. * src/Makefile.in (GNUSTEP_MFILES): NSUnarchiver.m and NSGUnarchiver.m removed. (GNUSTEP_HEADERS): Foundation/NSUnarchiver.h and Foundation/NSGUnarchiver.h removed. * src/Foundation/NSObject.h ([NSObject -classForArchiver]): Method removed; it's now in NSArchiver.m. ([NSObject -replacementObjectForArchiver:]): Likewise. * src/ConnectedCoder.m (Object (ConnectedCoderCallbacks)): Category methods moved here from Coder.m. * checks/nsarchiver.m (main): Use NSUnarchiver properly. * src/NSException.m (NSInconsistentArchiveException): String removed; it's in NSArchiver.m. * src/NSGArchiver.m ([NSGArchiver +initialize]): Add the behavior of the Coder class. All other methods deleted. * src/NSObject.m: Some minor formatting changes. ([NSObject -classForArchiver]): Method removed; it's in NSArchiver.m. ([NSObject -replacementObjectForArchiver:]): Likewise. * src/Makefile.in (GNUSTEP_MFILES): Remove NSGCoder.m. (GNUSTEP_HEADERS): Remove Foundation/NSGCoder.h. Make use of new behavior size matching to avoid ugliness of forcing ivar layout match when adding behaviors---more robust. * src/NSGArray.m (self): New macro, cast to (Array*) to reflect behavior addition. ([NSGArray -initWithObjects:count:]): Call Array designated initalizer instead of accessing ivars directly. ([NSGMutableArray -initWithCapacity:]): Likewise. ([NSGArray -count]): Method removed, Array behavior will take care of it. ([NSGArray -objectAtIndex:]): Use self to access ivars. * src/Foundation/NSGArray.h: Remove ivars; class_add_behavior now handles instance_size match. * src/behavior.c (class_add_behavior): If necessary, increase instance_size of class to which behavior is being added. Thu Jan 25 10:11:41 1996 Andrew McCallum * src/NSArchiver.m ([NSArchiver +initialize]): Set concrete class to Coder. ([NSArchiver +allocWithZone:]): New method. ([NSArchiver -initForWritingWithMutableData:]): Make this a subclass responsibility. ([NSArchiver -versionForClassName:]): New method. ([NSArchiver +unarchiveObjectWithData:data]): New method. ([NSArchiver +unarchiveObjectWithFile:path]): Call concrete class. ([NSArchiver +classNameEncodedForTrueClassName:]): Likewise. * src/Foundation/NSArchiver.h: Declare new methods. * src/Foundation/NSCoder.h: Fix spelling of argument names. * src/Foundation/NSSet.h: Fix typo, initWithObjects: takes objects, not NSArray's. * src/NSGData.m ([NSGData -writeToFile:atomically:]): Use cStringNoCopy for efficiency. * src/MemoryStream.m ([MemoryStream -init]): New method, otherwise naive creation dies with NULL buffer. * src/objects/Coding.h (Coding -cStream): New method. (Coder -encodeArrayOfObjCType:count:at:withName:): Renamed from -encodeArrayOfObjCType:at:count:withName:, to better match NeXT. (Coder -decodeArrayOfObjCType:count:at:withName:): Likewise. * src/objects/Coder.h (zone): New ivar. * src/Coder.m ([Coder -_initWithCStream:formatVersion:isDecoding:]): Initialize new zone ivar. ([Coder -encodeBycopyObject:withName:]): Renamed from -encodeObjectBycopy, to better match NeXT. ([Coder -decodeObjectAt::name]): Use zone ivar in creating decoded objects. ([Coder -encodeArrayOfObjCType:count:at:withName:]): Renamed from -encodeArrayOfObjCType:at:count:withName:, to better match NeXT. ([Coder -decodeArrayOfObjCType:count:at:withName:]): Likewise. ([Coder +classNameEncodedForTrueClassName:trueName]): New method, for NSCoder compatibility. ([Coder -encodeClassName:trueNameintoClassName:]): Likewise. ([Coder -objectZone]): Likewise. ([Coder -setObjectZone:]): Likewise. ([Coder -encodeValueOfObjCType:at:]): Likewise. ([Coder -encodeArrayOfObjCType:count:at:]): Likewise. ([Coder -encodeBycopyObject:]): Likewise. ([Coder -encodeConditionalObject:]): Likewise. ([Coder -encodeDataObject:]): Likewise. ([Coder -encodeObject:]): Likewise. ([Coder -encodePoint:]): Likewise. ([Coder -encodeRect:]): Likewise. ([Coder -encodeRootObject:]): Likewise. ([Coder -encodeSize:]): Likewise. ([Coder -encodeValuesOfObjCTypes:...:]): Likewise. ([Coder -decodeValueOfObjCType:at:]): Likewise. ([Coder -decodeArrayOfObjCType:count:at:]): Likewise. ([Coder -decodeDataObject]): Likewise. ([Coder -decodeObject]): Likewise. ([Coder -decodePropertyList]): Likewise. ([Coder -decodePoint]): Likewise. ([Coder -decodeRect]): Likewise. ([Coder -decodeSize]): Likewise. ([Coder -decodeValuesOfObjCTypes:...:]): Likewise. ([Coder -systemVersion]): Likewise. ([Coder -versionForClassName:]): Likewise. ([Coder -initForWritingWithMutableData:]): New method, for NSArchiver compatibility. ([Coder +archivedDataWithRootObject:]): Likewise. ([Coder +archiveRootObject:toFile:]): Likewise. ([Coder +unarchiveObjectWithData:data]): Likewise. ([Coder +unarchiveObjectWithFile:path]): Likewise. ([Coder -archiverData]): Likewise. ([Coder -cStream]): New method. * checks/Makefile.in (SRCS): Added nsarchiver.m. * checks/nsarchiver.m: New file. * examples/textcoding.m (main): Use new [Coder -closeCoder] method. * src/StdioStream.m ([StdioStream -isClosed]): Remove bad implementation; currently not implemented. * src/Coder.m ([Coder -initForWritingToStream:withFormatVersion:cStreamClass: cStreamFormatVersion:]): New method. ([Coder -initForWritingToFile:withFormatVersion:cStreamClass: cStreamFormatVersion:]): New method. ([Coder -initForWritingToFile:filenamewithCStreamClass:cStreamClass]): New method. ([Coder +encodeRootObject:withName:nametoStream:]): New method. ([Coder +encodeRootObject:withName:nametoFile:filename]): New method. ([Coder +decodeObjectWithName:namefromStream:]): New method. ([Coder +decodeObjectWithName:namefromFile:filename]): New method. * src/objects/Coder.h: Declare new methods. * src/CStream.m: Use "..withFormatVersion" instead of "formatVersion" in several method names. * src/objects/CStream.h: Declare new method. * src/objects/Coding.h (Coding -closeCoder): New protocol method. (Coding -isClosed): New protocol method. * src/Coder.m ([Coder -initForReadingFromFile:filename]): New method. ([Coder -initForWritingToFile:filename]): New method. ([Coder -closeCoder]): New method. ([Coder -isClosed]): New method. * src/objects/Streaming.h (Streaming -isClosed): New protocol method. * src/Stream.m ([Stream -flushStream]): Do nothing, instead of calling -subclassResponsibility. ([Stream -closeStream]): Likewise. ([Stream -isClosed]): New method, return NO. * src/MemoryStream.m ([MemoryStream -flushStream]): Method removed. * src/StdioStream.m ([StdioStream -isClosed]): New method. * src/MemoryStream.m ([MemoryStream -closeStream]): New method, just flush the stream. Wed Jan 24 09:02:02 1996 Andrew McCallum * src/objects/Streaming.h (Streaming -closeStream): New method; we must separate the idea of "closing" a stream and "deallocating" a stream because of delays in deallocation due to -autorelease. * src/Stream.m ([Stream -closeStream]): New method. * src/StdioStream.m ([StdioStream -closeStream]): New method. * src/CStream.m ([CStream -encodeWithName:valuesOfCTypes:...]): New method. ([CStream -decodeWithName:valuesOfCTypes:...]): New method. * src/objects/CStreaming.h: Declare new methods. * src/String.m ([String -initWithCStringNoCopy:freeWhenDone:]): New method, needed for protocol. * src/Stream.m ([Stream -writeFormat:arguments:]): New method. ([Stream -readFormat:arguments:]): New method. * src/Coder.m (SIGNATURE_FORMAT_STRING): New macro. ([Coder -writeSignature]): Use it. ([Coder +readSignatureFromCStream:getClassname:formatVersion:]): Likewise, and receive (char*) instead of (char**). All callers changed. * src/objects/EltNode-m: Include for @"" in encoding withName:. Use constant string objects instead of C strings where appropriate. * src/Connection.m: Use constant string objects instead of C strings where appropriate. * src/RBTreeNode.m: Include for @"" in encoding withName:. * src/DelegatePool.m: Likewise. * src/BinaryTreeNode.m: Likewise. Tue Jan 23 11:54:54 1996 Andrew McCallum * Set.m, SocketPort.m, TreeNode.m, EltNodeCollector.m, LinkedListNode.m, MutableCString.m, NSGCString.m, Proxy.m, RBTreeNode.m, BinaryCoder.m, BinaryTreeNode.m, Collection.m, Connection.m, DelegatePool.m: Use string objects instead of C strings for name arguments to encoding methods. * src/.cvsignore: Add errs*. * examples/textcoding.m: Update for new Coder organization. * src/objects/Streaming.h (Streaming -writeFormat:arguments:): New method. (Streaming -readFormat:arguments:): New method. * src/objects/Coding.h: Don't include (Coding -encodeValueOfCType:at:withName:): New method. (Coding -decodeValueOfCType:at:withName:): New method. * src/objects/Coder.h: Declare new methods. * src/objects/CStreaming.h: New file. * src/CStream.m: New file. * src/objects/CStream.h: New file. * src/TextCStream.m: New file. * src/objects/TextCStream.h: New file. * src/BinaryCStream.m: New file. * src/objects/BinaryCStream.h: New file. * src/Makefile.in (GNU_MFILES): Add BinaryCStream.m, TextCStream.m and CStream.m. (GNU_HEADERS): Add objects/BinaryCStream.h, objects/TextCStream.h and objects/CStream.h. * src/NSString.m (handle_printf_atsign): Fix type for va_arg (). * src/ConnectedCoder.m ([ConnectedCoder +newEncodingWithConnection:sequenceNumber:identifier:]): Use new Coder initializer. ([ConnectedCoder +newDecodingWithConnection:timeout:]): Likewise. ([ConnectedCoder -dismiss]): Fix typo: use cstream ivar. * src/Coder.m ([Coder -writeSignature]): Write directly to stream ivar. ([Coder +readSignatureFromCStream:getClassname:formatVersion:]): Likewise. ([Coder -initForReadingFromStream:s]): New method. ([Coder -initForWritingToStream:s]): New method. ([Coder +coderWritingToStream:]): New method. ([Coder +coderWritingToFile:]): New method. * src/KeyedCollection.m: Use and protocols in argument types. * src/IndexedCollection.m: Likewise. * src/BinaryTree.m: Likewise. * src/Array.m: Likewise. * src/Makefile.in (GNU_MFILES): Remove BinaryCoder.m. and TextCoder.m (GNU_HEADERS): Remove objects/BinaryCoder.h and objects/TextCoder.h. * src/Proxy.m, src/RBTreeNode.m, src/Set.m, src/SocketPort.m, src/TextCoder.m, src/argframe.m, src/IndexedCollection.m, src/KeyedCollection.m, src/MutableCString.m, src/NSGCString.m, src/NSGCoder.m, src/NXConnection.m, src/Collection.m, src/ConnectedCoder.m, src/Connection.m, src/DelegatePool.m, src/EltNodeCollector.m, src/Array.m, src/BinaryCoder.m: Use new-style method name "..ValueOfObjCType" and "..ValueOfCType", instead of "..ValueOfType" and "..ValueOfSimpleType". * src/NSString.m: This new code, #if HAVE_REGISTER_PRINTF_FUNCTION, a function defined by GNU libc. (handle_printf_atsign): New function to handle %@ in printf strings. ([NSString +initialize]): Register the new printf-handler function. * configure.in (register_printf_function): Check for this function. * src/objects/Coding.h: Use new-style method name "..ValueOfObjCType", instead of "..ValueOfType". Use (id ) instead of (char *) where appropriate. (Encoding -initEncodingOnStream:): Method removed. (Encoding -initEncoding): Method removed. (Encoding -encodeValueOfSimpleType:at:withName:): Method removed. (Decoding -initDecodingOnStream:): Method removed. (Decoding -initDecoding): Method removed. (Decoding -decodeValueOfSimpleType:at:withName:): Method removed. (CommonCoding +defaultFormatVersion): New method. * src/Stream.m ([Stream -rewindStream]): Move method lower in file, to avoid undeclared error. (This is related to creation of SeekableStream protocol.) * src/objects/Streaming.h (Streaming): Include NSObject protocol in Streaming protocol, so we can use NSObject methods on arguments passed with type. * src/StdioStream.m: Use (id ) instead of (char *) where appropriate. ([StdioStream +streamWithFilename:fmode:]): New method. * src/objects/StdioStream.h: Declare new methods. * src/NSCoder.m ([NSCoder -encodeObject:]): Base on -encodeValueOfObjCType, not -encodeValuesOfObjCTypes. * src/Coder.m: Now uses a CStream instance for low-level encoding of variables of C type. Include many more files. Use new-style method name "..ValueOfObjCType", instead of "..ValueOfType". Use (id ) instead of (char *) where appropriate. (DEFAULT_FORMAT_VERSION): Renamed from CODER_FORMAT_VERSION. (default_stream_class): Renamed from defaultStreamClass; (default_cstream_class): New static variable. ([Coder +initialize]): Initialize above two variables. ([Coder +setDefaultCStreamClass:]): New method. ([Coder +defaultCStreamClass]): New method. ([Coder +setDefaultStreamClass:]): New method. ([Coder +defaultStreamClass]): New method. ([Coder +defaultFormatVersion]): New method. ([Coder -writeSignature]): New method, replaces -encodeSignature. ([Coder +readSignatureFromCStream:getClassname:formatVersion:]): New method, replaces decodeSignature. ([Coder -_initWithCStream:formatVersion:isDecoding:f]): New method, replaces _initWithStream:isDecoding. ([Coder +coderReadingFromStream:stream]): New method. ([Coder +coderReadingFromFile:filename]): New method. ([Coder -initForReadingFromStream:formatVersion:]): New method. ([Coder -initForWritingToStream:sformatVersion:version]): New method. ([Coder +decodeObjectFromStream:]): New method. ([Coder +decodeObjectFromFile:filename]): New method. ([Coder -initEncodingOnStream:]): Method removed. ([Coder -initDecodingOnStream:]): Method removed. ([Coder -initEncoding:]): Method removed. ([Coder -initDecoding:]): Method removed. ([Coder -encodeBytes:count:withName:]): Now unimplemented. ([Coder -decodeBytes:count:withName:name]): Likewise. ([Coder -decodeValueOfCType:at:withName:]): New method. ([Coder -encodeValueOfCType:at:withName:]): New method. ([Coder -encodeValueOfObjCType:at:withName:name]): Now longer handles arrays and structs; those are now handled in a CStream method. ([Coder -decodeValueOfObjCType:at:withName:]): Likewise. ([Coder -encodeValueOfSimpleType:at:withName:]): Method removed. ([Coder -decodeValueOfSimpleType:at:withName:]): Method removed. ([Coder -encodeIndent]): Call cstream to handle this, instead of doing nothing. ([Coder -encodeUnindent]): Likewise. ([Coder -decodeIndent]): Likewise. ([Coder -decodeUnindent]): Likewise. ([Coder -encodeName:]): Likewise. ([Coder -decodeName:]): Likewise. ([Coder -formatVersion]): Method renamed from coderFormatVersion. * src/objects/Coder.h: Declare new methods. (cstream): New ivar, replacing "stream". (classname_map): New ivar, but not yet used properly. (concrete_format_version): ivar removed, this is now in the CStream classes. * src/CString.m: Use new-style method name "..ValueOfObjCType", instead of "..ValueOfType". ([CString -initWithCStringNoCopy:freeWhenDone:]): Cast away const type. * src/Stream.m ([Stream -writeLine:]): Replace with more efficient implementation from MemoryStream class. * src/MemoryStream.m: Use (id ) instead of (char *) where appropriate. ([MemoryStream -writeLine:]): Remove method. * src/objects/Collection.h: Don't include ; this helps prevent circular dependances in include files. * src/NSGCString.m ([NSGCString -cStringNoCopy]): New method. * src/CString.m ([CString -cStringNoCopy]): New method. * src/String.m: Use -subclassReponsibility instead of -notImplemented in proper places. ([String -cStringNoCopy]): New method. * src/objects/String.h: Declare new method. * src/Stream.m: Use string object types instead of C-string types in method arguments. Use -subclassReponsibility instead of -notImplemented. * src/objects/Streaming.h (Streaming): Use string object types instead of C-string types in method arguments. * src/CString.m ([CString -initWithCStringNoCopy:freeWhenDone:]): New method. * src/String.m ([String +stringWithCStringNoCopy:freeWhenDone:f]): New method. ([String +stringWithCStringNoCopy:]): New method. * src/objects/String.h: Declare new methods. * src/Coder.m: Don't use ivar interconnected_stack_height. (DOING_ROOT_OBJECT): New macro, defined based on interconnected_stack_height. * src/objects/Coder.h (Coder): Get rid of unnecessary ivar doing_root_object; we can get the same information from ivar interconnected_stack_height. Mon Jan 22 21:32:25 1996 Andrew McCallum * src/NSCoder.m ([NSCoder -encodeObject:]): Implemented. ([NSCoder -decodeObject]): Implemented. ([NSCoder -encodeValueOfObjCType:at:]): Use -subclassResponsibility, not -notImplemented. ([NSCoder -decodeValueOfObjCType:at:]): Likewise. ([NSCoder -encodeDataObject:]): Likewise. ([NSCoder -decodeDataObject]): Likewise. ([NSCoder -versionForClassName:]): Likewise. Mon Jan 22 11:08:55 1996 Andrew McCallum * Version (OBJECTS_SUBMINOR_VERSION): libobjects version 0.1.19. Sat Jan 20 14:27:57 1996 Andrew McCallum * doc/install.texi: Mention GNU/Linux and the need for -lieee. * aclocal.m4: Don't have the initializer-loading test program print anything. (OBJC_SYS_DYNAMIC_FLAGS): Use '' not "" to quote $(CC). Fri Jan 19 12:40:49 1996 Adam Fedor * src/NSBundle.m (objc_executable_location): New function. ([NSBundle +mainBundle]): Get path from NSProcessInfo. * src/NSProcessInfo.m: Remove NSArgv definition. (_gnu_process_args): Remove NSArgv code. * src/objc-load.c: Remove NSArgv declaration. (objc_executable_location): Removed function. (objc_initialize_loading): Make path const char*. * src/Foundation/objc-load.h: Remove objc_executable_location function declaration. * src/objc/HashTable.h: Include stdobjects.h header for LibObjectsMain definition. Fri Jan 19 10:43:32 1996 Andrew McCallum * Version (OBJECTS_SUBMINOR_VERSION): libobjects version 0.1.18. * configure.in (OBJS_INSTALL): Fix typo NeXT_OBJS -> NEXTSTEP_OBJS in when running under NeXTSTEP, but not using NeXT runtime. (Reported by Satoshi Adachi .) * src/NSString.m ([NSString -initWithCString:length:]): Handle case of NULL cString. ([NSString -initWithCString:]): Likewise. (Reported by Adam Fedor .) * src/find_exec.c (objc_find_executable): Make NSBundle work even when CWD isn't in PATH. (Fix provided by Matthias Klose .) * src/Makefile.in (libobjects.so.$OBJECTS_VERSION)): Re-add the -Wl,-soname,libobjects.so.$(OBJECTS_MAJOR_VERSION) argument. Create a soft link named libobjects.so. (install): Install a soft link named libobjects.so. (Fixes sent by Jeremy Bettis .) * Makefile.in: Remove -$(MAKEFLAGS) as argument to recursive calls of $(MAKE); this happens automatically. (Reported by Niels Mvller .) Tue Jan 16 19:33:49 1996 Andrew McCallum * Version (OBJECTS_SUBMINOR_VERSION): libobjects version 0.1.17. Tue Jan 16 13:57:51 1996 Adam Fedor * aclocal.m4 (OBJC_SYS_AUTOLOAD): Define CON_AUTOLOAD if /usr/include/elf.h exists. Use yes/no rather than 1/0. * src/objc-load.c: Update copyright. (objc_load_module): Use CON_AUTOLOAD instead of SYS_AUTOLOAD. Tue Jan 16 12:24:59 1996 Andrew McCallum * src/Makefile.in (HEADERS_INSTALL): Remove objects/config.h. (install): Look for libobjects.so file, not just for configure variable. Remove unwanted `;'. Install objects/config.h from build directory. (Fixes provided by Matthias Klose ). Mon Jan 15 17:07:38 1996 Andrew McCallum * Version (OBJECTS_SUBMINOR_VERSION): libobjects version 0.1.16. (OBJECTS_GCC_VERSION): Updated from 2.7.0 to 2.7.2. (OBJECTS_FTP_MACHINE): Changed to prep. (OBJECTS_FTP_DIRECTORY): Changed to pub/gnu. * NSCharacterSets/Makefile.in (install): Prefix data files with $(srcdir). (Makefile): New target. * src/Makefile.in ($(NSVALUE_MFILES)): Use sed instead of expr to extract number. ($(NSNUMBER_MFILES)): Likewise. * checks/Makefile.in (all): Remove target `bundles' for now; linking them doesn't always work. If people want to test bundles, they can type `make bundles'. * examples/Makefile.in (ALL_CPPFLAGS): -I../src, not -I. (Makefile): Prefix dependancy with $(srcdir). * checks/Makefile.in (ALL_CPPFLAGS): -I../src, not -I. (Makefile): Prefix dependancy with $(srcdir). * Makefile.in (dist): Add -9 to gzip args. (snapshot): Likewise. * doc/install.texi: Remove --enable-shared from first example of installation commands; many people were just copying these commands, ignorant of whether or not their system supported dynamically-linked shared libraries. * checks/Makefile.in: Remove test09; it doesn't work, but it doesn't matter. (SRCS): Remove test09.m. (test09): Remove target. * aclocal.m4: Test whether loading of contructor functions works by actually compiling and running a program, not by looking for /usr/include/elf.h. Tue Jan 16 00:31:19 1996 Gregor Hoffleit * src/NSDate.m ([NSDate -description]): replace strftime() with sprintf() equivalent for NEXTSTEP. Mon Jan 15 15:11:18 1996 Adam Fedor * aclocal.m4 (OBJC_SYS_DYNAMIC_LINKER): Expand macro correctly in dld/defs.h check. Fri Jan 12 11:38:58 1996 Andrew McCallum * examples/Makefile.in (LIBS): Added -lm. * src/NSProcessInfo.m ([NSProcessInfo -globallyUniqueString]): Don't use the %@ printf format directive, since it isn't implemented yet; use %s and -cString instead. (Reported by Gregor Hoffleit .) * aclocal.m4 (OBJC_SYS_AUTOLOAD): Don't define SYS_AUTOLOAD #ifdef mips, gcc doesn't support it, even though elf.h exists. (Perhaps this should be "sgi" instead of "mips"?) * src/NSProcessInfo.m: Don't test !(sgi), since SYS_AUTOLOAD is fixed. * src/find_exec.c (objc_find_executable): #ifdef NeXT, use getwd() instead of getcwd(). (Reported by Gregor Hoffleit .) * src/NSDate.m ([NSDate -description]): Don't use strftime #ifdef NeXT. (Reported by Gregor Hoffleit .) * src/Makefile.in (objects/stdobjects.h): prepend objects/stdobjects.h.in with $(srcdir). * checks/Makefile.in ($(DYNAMIC_OFILES)): Use $(srcdir). ($(BUNDLE_NAMEJ)): Likewise. (Reported by Matthias Klose .) * src/Makefile.in (NXStringTable_scan.o): Removed target; let pattern rule take care of it. ($(NSVALUE_MFILES)): Use $@ instead of $* in expr argument. ($(NSNUMBER_MFILES)): Likewise. (Reported by .) * src/NSMethodSignature.m ([NSMethodSignature +signatureWithObjCTypes:]): Fix typo: change objc_size_of_type to objc_sizeof_type. (Reported by Gregor Hoffleit .) * src/Makefile.in (libobjects.so.$(OBJECTS_VERSION)): Removed "-Wl,-soname,libobjects.so.$(OBJECTS_VERSION)"; gcc does this automatically. (Reported by Matthias Klose .) * src/NSProcessInfo.m: Include for MAXHOSTNAMELEN. (Reported by Matthias Klose .) * src/Makefile.in (ALL_INCLUDE_FLAGS): Add -I. for objects/config.h. (Reported by Matthias Klose ) * checks/Makefile.in (ALL_CPPFLAGS): Likewise. * examples/Makefile.in (ALL_CPPFLAGS): Likewise. Wed Jan 10 10:51:26 1996 Andrew McCallum * src/NSProcessInfo.m: Remove #if NeXT and alternate #include's. * src/Foundation/NSProcessInfo.h: Likewise. (These caused problems reported by John Boller .) * src/Invocation.m ([MethodInvocation -initWithSelector:arguments:]): New method, not implemented. Tue Jan 9 14:07:36 1996 Andrew McCallum * src/Storage.m ([Storage -insertElement:at:]): Increment numElements. (Reported by Revuz Dominique ). * Makefile.in (RCS_FILES): Remove out-of-date MACHINES and CREDITS files. Mon Jan 8 11:05:52 1996 Andrew McCallum * Version (OBJECTS_SUBMINOR_VERSION): Version 0.1.15. * src/NSProcessInfo.m (_GNU_MAX_HOST_NAMELEN): Macro removed; using MAXHOSTNAMELEN from instead. All users changed. (_gnu_process_args): Malloc and fill NSArgv; assignment of char** from *char[] isn't right. * src/NSGCString.m ([NSGCString -emptyCopy]): Use [super emptyCopy], not [super allocCopy]. * src/String.m ([String -emptyCopy]): Method removed; super class implementation is fine. ([String -initWithCString:range:]): Use -subclassResponsibility:, not -notImplemented:. ([String -empty]): Likewise. * configure.in: Remove double-quotes in help string of --enable-shared handling. Sun Jan 7 16:05:04 1996 Andrew McCallum * src/Makefile.in: Changed rules for compiling concrete NSValue and NSNumber classes; the old version no longer worked with shared library compilation, and didn't use the common pattern rule for making the object file. (NSNUMBER_CLUSTER, NSVALUE_CLUSTER): Variables removed. (NSVALUE_MFILES): New variable, replacing NSVALUE_OFILES. (NSNUMBER_MFILES): New variable, replacing NSNUMBER_OFILES. (GNUSTEP_OBJS): Use new vars. Fri Jan 5 17:01:35 1996 Andrew McCallum Clean up shared library building. Building from another directory now works. * configure.in: Add $srcdir where necessary. (LIBOBJECTS_A_OR_SO): Variable removed. (LIBOBJECTS_SO): Defined according to --enabled-shared flag. * src/Makefile.in: (Makeconf): Include it after system configuration section, and from $(srcdir). (SHAREDLIB_CFLAGS, SHAREDLIB_ARFLAGS, USING_SHAREDLIB_CFLAGS, USING_SHAREDLIB_ARFLAGS): Variables removed. (ALL_CFLAGS, ALL_OBJCFLAGS): Don't use removed vars. (%_pic.o: %.m): New pattern rule. (%_pic.o: %.c): New pattern rule. (all): Always build libobjects.a, optionally build .so version. (libobjects.so): Use -shared. Link to ..$(OBJECTS_MAJOR_VERSION). (install): Always install libobjects, optionally install .so version. Install the headers from the $(srcdir). (NSVALUE_OFILES, NSNUMBER_OFILES, NXStringTable_scan.c, dynamic-load.h): Use $(srcdir) properly for these targets. * checks/Makefile.in: Executables now depend on libobjects.a, not @LIBOBJECTS_A_OR_SO@. (LIBS): Don't look in $(srcdir) for library. (copy-dist): Don't use $(srcdir). (Makefile): Likewise. * examples/Makefile.in: Executables now depend on libobjects.a, not @LIBOBJECTS_A_OR_SO@. (LIBS): Don't look in $(srcdir) for library. (OBJECTS_NEXT_INCLUDES): Don't look in non-existant next-includes dir. (copy-dist): Don't use $(srcdir). (Makefile): Likewise. * doc/Makefile.in (TEXT_FILES): New variable. (info): Use it. (MAKEINFO_FLAGS): New variable. Use it in TEXT_FILES targets. (DIST_FILES): Remove version.texi. (clean): rm version.texi and $(TEXT_FILES). * src/NSProcessInfo.m (_gnu_process_args): Use "char **argv" instead of "char *argv[]". Remove cast in assignment of NSArgv. Thu Jan 4 23:12:11 1996 Andrew McCallum * src/Set.m ([Set -removeElement:ifAbsentCall:]): Fix typo; method renamed from -removeElement:ifAbsent:. (Reported by Albert Mietus .) Wed Dec 20 11:30:37 1995 Adam Fedor * src/NSGeometry.m (NSMouseInRect): Handle flipped y-axis. * src/Foundation/NSException.h: Include NSString interface. Fri Nov 24 15:09:22 1995 Andrew McCallum * src/NSArray.m ([NSMutableArray -addObject:]): Use -subclassResponsibility:, not -notImplemented:. ([NSMutableArray -replaceObjectAtIndex:withObject:]): Likewise. ([NSMutableArray -insertObject:atIndex:]): Likewise. ([NSMutableArray -removeObjectAtIndex:]): Likewise. ([NSMutableArray -removeAllObjects]): Likewise. Sun Nov 19 15:29:41 1995 Andrew McCallum * src/NSString.m ([NSString +allocWithZone:]): New method. ([NSString +stringWithCString:byteString]): Use it. ([NSString +stringWithCString:length:]): Likewise. ([NSString +stringWithFormat:]): Likewise. ([NSString +stringWithFormat:arguments:]): Likewise. ([NSMutableString +allocWithZone:]): New method. ([NSMutableString +stringWithCapacity:]): Use it. ([NSMutableString +stringWithCString:length:]): Likewise. Tue Nov 14 11:39:41 1995 Andrew McCallum Some improvement to shared lib support, but since I can't test it, I still don't know if it works. * src/Makefile.in (CFLAGS): Added -O. (SHAREDLIB_CFLAGS,SHAREDLIB_ARFLAGS): Set values here, not in configure.in. (USING_SHAREDLIB_CFLAGS,USING_SHAREDLIB_ARFLAGS): New vars, set by configure. (ALL_CFLAGS, ALL_OBJCFLAGS): Use them. (libobjects.so.$(OBJECTS_VERSION): New target, replacing libobjects.so. Use version numbers. (install): Try to do the right thing with shared/non-shared libs. * configure.in: Update shared library variable names. * checks/Makefile.in: Use configure var, not libobjects.a. Include ../Version. * examples/Makefile.in: Use configure var, not non-existant Makefile var. Include ../Version. Mon Nov 6 12:24:16 1995 Andrew McCallum Shared library support; I'm not sure it works, though. * configure.in: Look for --enabled-shared. (LIBOBJECTS_A_OR_SO, SHAREDLIB_CFLAGS, SHAREDLIB_ARFLAGS): New substitutions. * src/Makefile.in (SHAREDLIB_CFLAGS): New variable. (ALL_CFLAGS): Use it. (ALL_OBJCFLAGS): Likewise. (SHAREDLIB_ARFLAGS): New variable. (libobjects.so): Use it; new target. (all): Depend on configure variable. (install): Changes to install shared library. * examples/Makefile.in: Look for LIBOBJECTS_A_OR_SO, not libobjects.a. * src/NSProcessInfo.m (NSArgv): New global. (_gnu_process_args): Set it. * NSMethodSignature.m: New file; not finished, though. * src/Makefile.in (GNUSTEP_MFILES): Added NSMethodSignature.m. * src/Foundation/NSMethodSignature.h (NSArgumentInfo): Declared. ([NSMethodSignature -argumentInfoAtIndex:]): Uncommented. * doc/install.texi: Warn them that compiling in a different directory than the source will not currently work. Fri Nov 3 11:12:11 1995 Andrew McCallum * src/NSDictionary.m ([NSDictionary +dictionary]): Use +alloc, not _concreteClass. This makes [NSMutableDictionary +dictionary] and friends do the right thing. ([NSDictionary +dictionaryWithObjects:forKeys:count:]): Likewise. ([NSMutableDictionary +dictionaryWithCapacity:]): Likewise. (Problem reported by Kim Shrier .) * src/NSSet.m ([NSSet +set]): Use +alloc, not _concreteClass. This makes [NSMutableSet +set] and friends do the right thing. ([NSSet +setWithObjects:count:]): Likewise. ([NSSet +setWithArray:]): Likewise. ([NSSet +setWithObject:]): Likewise. ([NSSet +setWithObjects:]): Likewise. ([NSMutableSet +setWithCapacity:]): Likewise. * src/NSArray.m ([NSArray +array]): Use +alloc, not _concreteClass. This makes [NSMutableArray +array] and friends do the right thing. ([NSArray +arrayWithObjects:]): Likewise. ([NSMutableArray +arrayWithCapacity:]): Likewise. ([NSArray +arrayWithObject:]): Likewise; and fix condition on exception. * src/NSProcessInfo.m ([NSProcessInfo -hostName]): Remove unnecessary inefficiency: use stack to hold temporary string, not malloc/free; just return the string, not a copy. Conform to GNU coding standards in use of braces. ([NSProcessInfo -processName]): Likewise. Just return the string, not a copy. ([NSProcessInfo -environment]): Likewise. ([NSProcessInfo -arguments]): Likewise. (_gnu_arguments, _gnu_environment): Make them constant classes, not mutable. (_gnu_process_args): Alloc _gnu_processName NSString, don't get an autoreleased string and then retain it. Initialize _gnu_arguments as a constant NSArray, not NSMutableArray. Initialize _gnu_environment as a constant NSDictionary, not NSMutableDictionary. Conform to the GNU coding standards in use of braces. * src/Foundation/NSDictionary.h ([NSDictionary -initWithObjects:forKeys:]): Declare method. This is called dissertation-procrastination. Sun Oct 29 19:41:16 1995 Andrew McCallum * checks/nsset.m: New file. * checks/Makefile.in (SRCS): Added nsset.m. (nsset): New target. * src/NSGArray.m ([NSGArray -objectAtIndex:]): Fix condition on exception. * src/objects/NSSet.h: Moved method declarations from NSMutableSet to NSSet. * NSCountedSet.m, NSGCountedSet.m: New files. * src/objects/NSSet.h: Added NSCountedSet interface. * src/Foundation/NSSet.h: Likewise. * src/Foundation/NSGSet.h: Added NSGCountedSet interface. * src/NSGSet.m: Implemented many methods. * src/Makefile.in (GNUSTEP_MFILES): Added NSCountedSet.m and NSGCountedSet.m. * src/NSArray.m ([NSArray -objectEnumerator]): Autorelease it. ([NSArray -reverseObjectEnumerator]): Likewise. * src/NSGDictionary.m ([NSGDictionary -keyEnumerator]): Autorelease it. ([NSGDictionary -objectEnumerator]): Likewise. Wed Oct 25 20:37:15 1995 Andrew McCallum * src/NSSet.m, src/Foundation/NSSet.h: New files. * src/NSGSet.m, src/Foundation/NSGSet.h: New files. * src/Makefile.in (GNU_HEADERS): Added objects/NSSet.h. (GNUSTEP_MFILES): Added NSGSet.m and NSSet.m. (GNUSTEP_HEADERS): Added Foundation/NSGSet.h and Foundation/NSSet.h. * src/Foundation/NSDictionary.h: Include objects/stdobjects.h, not objects/Dictionary.h. * src/Foundation/NSGDictionary.h: Include objects/Dictionary.h. * src/collhash.c (coll_hash_next): Set STATE to 0 before returning when the list is exhausted. This interacts with [Dictionary -freeEnumState:] and [Set -freeEnumState]. This will all be cleaned up when we start using Albin Jones' tables. (This bug found by Allan Clearwaters.) * src/NSGDictionary.m ([NSGDictionaryKeyEnumerator -initWithDictionary:]): Retain dictionary after it is initialized. * src/NSString.m ([NSString -cString]): Use -subclassResponsibility: instead of -notImplemented: ([NSString -cStringLength]): Likewise. Sun Oct 22 13:53:39 1995 Andrew McCallum Start adding proper NSException's; not done yet. * src/NSGArray.m ([NSGArray -initWithObjects:count:]): Raise exception for nil objects. ([NSGArray -objectAtIndex:]): Raise exception when index too high. * src/NSArray.m ([NSArray +arrayWithObject:]): Raise exception on nil argument. Wed Oct 18 09:48:24 1995 Adam Fedor * NSBundle.REAMDE: Rewrote documentation. * examples/Makefile.example.in: New file. * examples/configure.example.in: Likewise. * examples/Makefile.in: Add new files to RCS_FILES. * src/Foundation/NSGCString.h: New _free_contents ivar. * src/Foundation/String.h: Likewise. * src/CString.m ([CString -initWithCString:range:]): Set _free_contents to YES. ([CString -initWithCoder:]): Likewise. ([CString -dealloc]): Free contents if needed. * src/MutableCString.m ([MutableCString -initWithCapacity:]): Set _free_contents to YES. ([MutableCString -initWithCoder:]): Likewise. ([MutableCString -dealloc]): Free contents if needed. * src/NSGCString ([NSGCString -initWithCStringNoCopy:length:freeWhenDone:]): set _free_contents. ([NSGCString -initWithCoder:]): Set _free_contents to YES; ([NSGCString -dealloc]): Free contents if needed. ([NSGMutableCString -initWithCapacity:]): Set _free_contents to YES. ([NSGMutableCString -initWithCoder:]): Likewise. * src/NSString.m ([NSString -initWithCString:length:]): Set free string. ([NSString -compare:options:]): Range should be maximum of both strings. * src/NSGArray.m ([NSGArray -replaceObjectAtIndex:withObject:]): Implement. * src/NSGeometry.m (NSMouseInRect): Point should not touch sides. Sat Oct 14 14:16:04 1995 Andrew McCallum Remove remnants of "stack of dictionaries"; we only need one. * src/objects/Coder.h (Coder): Renamed ivars from root_object_tables to root_object_table, from forward_object_tables to forward_object_table; changed classes from Stack (of Dictionary's) to Dictionary. * src/Coder.m ([Coder -doInitOnStream:isDecoding:]): Use new ivar names. ([Coder -_coderPushRootObjectTable]): Use new ivar names and don't use Stack. ([Coder -_coderPopRootObjectTable]): Likewise. ([Coder -_coderTopRootObjectTable]): Likewise. ([Coder -_coderPushForwardObjectTable]): Likewise. ([Coder -_coderPopForwardObjectTable]): Likewise. ([Coder -_coderTopForwardObjectTable]): Likewise. ([Coder -_coderForwardObjectsAtReference:]): Don't access ivar directly. ([Coder -_coderPutForwardObjects:atReference:]): Likewise. ([Coder -finishDecodingInterconnectedObjects]): Use new ivar name. ([Coder -dealloc]): Likewise. Mon Oct 9 10:33:13 1995 Andrew McCallum * src/IndexedCollection.m ([IndexedCollection -shallowCopyInReverseAs:]): Return newColl, not self. ([IndexedCollection -withElementsInReverseCall:]): Set flag to YES. ([IndexedCollection -safeWithElementsInReverseCall:]): Likewise. Reported by MURATA, Shuuichirou . * doc/readme.texi (The Class Heirarchy): Fixes from Aleksey Sudakov . Thu Oct 5 11:31:44 1995 Adam Fedor * src/objc-malloc.c (objc_malloc): Declare res before any statements. (__objc_valloc): Likewise. (__objc_realloc): Likewise. (__objc_calloc): Likewise. Sat Sep 30 18:00:22 1995 Andrew McCallum * src/objc-malloc.c (CHECK_ZERO_SIZE): New macro; for making sure we don't pass 0 to malloc and its friends. (Needed on DEC Alpha; problem reported by Adam Fedor.) (__objc_malloc): Use it. (__objc_valloc): Likewise. (__objc_realloc): Likewise. (__objc_calloc): Likewise. Wed Sep 27 18:45:46 1995 Andrew McCallum * Makefile.in (DIST_FILES): Removed DISCUSSION. * src/IndexedCollection.m ([IndexedCollection -getNextElement:withEnumState:]): if isEmpty, return NO. * src/NSObject.m ([NSObject +initialize]): Set default autorelease_class to NSAutoreleasePool. * src/NSProcessInfo.m: Don't try to use __attribute__ ((section ..)) #if (sgi). It doesn't seem to be supported. This probably means that aclocal.m4 needs to be fixed so that it doesn't define SYS_AUTOLOAD in this case. No time now. Adam? * src/Collection.m: Avoid cache_flush when releasing contents. (send_release): Remove function. ([Collection -_releaseContents]): New method. ([Collection -dealloc]): Use it. ([Collection -empty]): Likewise. ([Collection -_safeWithElementsCallNoRetain:]): Use -getNextElement:withEnumState instead of -withElementsCall: to avoid cache_flush. Thu Sep 21 11:07:38 1995 Adam Fedor * src/NSArray.m ([NSArray -indexOfObjectIdenticalTo: -indexOfObject: -containsObject: -removeObjectIdenticalTo: -removeObject:]): Use NSNotFound for non-existant objects. * src/NSBundle.m ([NSBundle -initWithPath:]): Check if bundle for path already exists. * src/NSGArray.m ([NSGArray -indexOfObject:]): Force message to go to super rather than behavior class. * src/NSGCString.m ([NSGCString -emptyCopy]): start with allocCopy. * NSGData.m ([NSGData -copyWithZone: -mutableCopyWithZone:], [NSGMutableData -copyWithZone:]): New methods. Tue Sep 12 18:33:25 1995 Andrew McCallum * Makefile.in (RCS_FILES): Add file aclocal.m4. Tue Sep 12 15:30:27 1995 Adam Fedor This should make dynamic loading work under Solaris. * aclocal.m4: New file. * configure.in: Remove dynamic linking checks. Use OBJC_SYS_DYNAMIC_FLAGS macro from aclocal.m4. * src/NSBundle.m: Make sure index is defined. * src/NSProcessInfo.m: Check ifdef SYS_AUTOLOAD as well as __ELF__ * src/objc-load.c: Likewise. * src/objects/LibobjectsMain.h: Likewise. Sun Sep 10 18:17:56 1995 Andrew McCallum * src/TextCoder.m ([TextCoder -decodeValueOfSimpleType:at:withName:]): Assert the data pointer. * src/Coder.m ([Coder -doInitOnStream:isDecoding:]): Temporarily change in_progress_table from a Set to an Array. I need to fix some problems with Set. ([Coder -startEncodingInterconnectedObjects]): Deal with interconnected_stack_height. ([Coder -finishEncodingInterconnectedObjects]): Likewise. ([Coder -startDecodingInterconnectedObjects]): Likewise. ([Coder -finishDecodingInterconnectedObjects]): Likewise. ([Coder -encodeRootObject:withName:]): Fix bug, whereby we weren't giving what decodeObjectAt:withName: expected. ([Coder -encodeArrayOfType:at:count:withName:]): Don't encode the array count. ([Coder -decodeArrayOfType:at:count:withName:]): Don't expect the array count. Change type on 3rd argument. * src/objects/Coder.h (interconnected_stack_height): New ivar for Coder. * src/objects/Coding.h ([Coding -decodeArrayOfType:at:count:withName:]): Change the 3rd argument type; pass the count directly, not as a pointer. The encoding and decoding of array's no longer records the array count; if necessary, you must do that yourself ahead of time. Fri Sep 8 18:30:54 1995 Andrew McCallum * src/objects/Coder.h (in_progress_table): New ivar in Coder. * src/Coder.m ([Coder -doInitOnStream:isDecoding:]): Init in_progress_table. ([Coder -dealloc]): Release in_progress_table. ([Coder -_encodeObject:withName:isBycopy:isForwardReference:]): If the object is in progress, treat it like a forward reference. Add the object to the in_progess_table before really encoding the object; remove it when done. (NOTE, this isn't an excuse not to set up "encoding interconnected objects" mode; you still must do this first.) Wed Sep 6 09:30:15 1995 Andrew McCallum * Makefile.in (snapshot): Remove the snapshot name so we don't get nested snapshots on failure. Wed Aug 30 09:33:07 1995 Adam Fedor * src/NSCTemplateValue.m ([NSCTemplateValue -encodeWithCoder:]): Code type as a char_ptr. ([NSCTemplateValue -initWithCoder:]): Leave decoding to NSValueDecoder class. * src/NSConcreteNumber.m: Likewise. * src/NSConcreteValue.m: Likewise. * src/NSNumber.m: Clarify error message for abstract methods with "subclassResponsibility". * src/NSValue.m: New NSValueDecoder class. Clarify error message for abstract methods. * /src/TextCoder.m ([TextCoder encodeValueOfSimpleType:at:withName:]): Write reals using "%g". ([TextCoder decodeValueOfSimpleType:at:withName:]): Decode double as "%lf". Mon Aug 28 16:27:03 1995 Andrew McCallum * src/Collection.m ([Collection -empty]): Check if already empty. This avoids a previous malloc(0). Sat Aug 26 13:56:40 CDT 1995 Jeremy Bettis * src/NSProcessInfo.m: Added Linux/ELF support. Linux calls the __libc_subinit functions before the global constructors, therefore the subinit functions must be just vanilla C. Sat Aug 26 12:36:37 1995 Andrew McCallum * Makefile.in (snapshot): Put README.first in the snapshot distribution. * README.first: New file. Thu Aug 24 12:32:54 1995 Andrew McCallum * src/Makefile.in (GNUSTEP_MFILES): Added NSObjCRuntime.m. * src/NSObjCRuntime.m: New file. (NSStringFromSelector, NSSelectorFromString, NSClassFromString, NSStringFromClass): New functions. * src/NSObject.m: Include ([NSObject -description]): Implemented. ([NSObject +description]): Implemented. * src/Makefile.in (FILE_AUTHORS): Added Peter Burka. * volunteers: No longer a soft link to the http file; now it is a text file giving the http address and explaining task coordination. * Makefile.in (snap): New target. (snapshot): New target. (dist): Use new target snap. Wed Aug 23 10:39:21 1995 Andrew McCallum * src/NSTimeZone.m ([NSTimeZone -encodeWithCoder:]): Avoid warning by removing type from argument. ([NSTimeZone -initWithCoder:]): Likewise. * Makefile.in (DIST_FILES): Add file README.foundation. * src/String.m: Fix bug by which [NSString mutableCopy] returned a String, not NSString. ([String -copyWithZone:]): Renamed from -copy. ([String -mutableCopyWithZone:]): Renamed from -mutableCopy. * src/behavior.c: Added comment about superclass methods being overriden. * Makeconf (install, uninstall): New targets. * src/NSAutoreleasePool.m ([NSAutoreleasePool -dealloc]): Removed question comment. Thu Aug 17 17:41:05 1995 Adam Fedor * src/NSData.m ([NSData +allocWithZone:]): New method. ([NSMutableData +allocWithZone:]): Likewise. ([NSData +data, +dataWithBytes:length:, +dataWithBytesNoCopy:length:, +dataWithContentsOfFile:, +dataWithContentsOfMappedFile:]): Allocate using designated allocator. ([NSMutableData +dataWithCapacity:, +dataWithLength:]): Likewise. Wed Aug 17 19:54:17 1995 Peter Burka * src/NSZone.c: malloc.h isn't included on NeXTStep * src/Foundation/NSZone.h: use NeXT's zones only if we're using their runtime, too * src/Foundation/NSDate.h (NSTimeZone, NSTimeZoneDetail): interfaces declared * src/Makefile.in (GNUSTEP_MFILES): Added NSTimeZone.m. * src/NSTimeZone.m: New file. * src/NSTimeZone.m: (NSTimeZone, NSConcreteTimeZone, NSTimeZoneDetail, NSConcreteTimeZoneDetail): implementations defined * src/Foundation/NSDate.h: Added declaration of NSTimeZone. Wed Aug 16 11:58:24 1995 Andrew McCallum * Version (OBJECTS_SUBMINOR_VERSION): Version 0.1.14. * checks/Makefile.in (nsprocessinfo): New target. * src/objects/LibobjectsMain.h: Comment out args to LibobjectsMain so we don't get errors from people's "int main ()". * admin/Makefile.in (ADMIN_FILES): Added tasks. (tasks): New target. * doc/Makefile.in (copy-dist): Remove linking of 'tasks' to admin. * src/NSProcessInfo.m (_GNU_MISSING_MAIN_FUNCTION_CALL): Added Tuparev's email address. * admin/Makefile.in (copy-dist): Use cp instead of ln. (Some of these files are symbolic links themselves, and tar gets confused). * src/Makefile.in (FILE_AUTHORS): Added "Georg Tuparev". * Makefile.in (DIST_FILES): Remove GNUStep-volunteers. It's now in admin/volunteers. * checks/nsprocessinfo.m: Fix typo in includes. (main): Fix warnings in while test. Add newlines to end of printf's. * src/NSProcessInfo.m: Fix indentation. * src/NSProcessInfo.m: Use ELF _libc_subinit for initialization instead of LibobjectsMain. * src/objects/LibobjectsMain.h: Only redefine main if we don't have __ELF__. * src/objects/stdobjects.h.in: Include * src/Makefile.in (GNUSTEP_MFILES): Added NSProcessInfo.m. (GNUSTEP_HEADERS): Added Foundation/NSProcessInfo.h and LibobjectsMain.h. * checks/Makefile.in (SRCS): Added nsprocessinfo.m. * src/NSProcessInfo.m, src/Foundation/NSProcessInfo.h, src/objects/LibobjectsMain.h, checks/nsprocessinfo.m: New files from Georg Tuparev Wed Aug 9 11:27:42 1995 Andrew McCallum * src/NSString.m: Replaced "notImplemented" with "subclassResponsibilty" where appropriate. * admin/Makefile.in (RCS_FILES): Renamed Makefile to Makefile.in. (Makefile, ../config.status): New targets. * admin/Makefile.in: Renamed from Makefile. (srcdir, VPATH): new vars. * configure.in (AC_OUTPUT): Added admin/Makefile. * src/NSString.m: Rename NSCString to NSGCString. ([NXConstantString -release]): Fix return type and return. ([NSString +_setConcreteClass:]): New method. ([NSString +_setConcreteCClass:]): New method. ([NSString +_setMutableConcreteClass:]): New method. ([NSString +_setMutableConcreteCClass:]): New method. ([NSString +_concreteClass]): New method. ([NSString +_concreteCClass]): New method. ([NSString +_mutableConcreteClass]): New method. ([NSString +_mutableConcreteCClass]): New method. ([NSString +initialize]): Initialize new statics that hold concrete classes. ([NSString +stringWithCString:byteString]): Use concrete class method. ([NSString +stringWithCString:length:]): Likewise. ([NSString +stringWithFormat:]): Likewise. ([NSString +stringWithFormat:arguments:]): Likewise. ([NSString -mutableCopyWithZone:]): Likewise. ([NSMutableString +stringWithCapacity:]): Likewise. ([NSMutableString +stringWithCString:length:]): Likewise. * src/Makefile.in: Rename NSCString to NSGCString. * src/Foundation/NSString.h: Likewise. * src/Foundation/NSGCString.h: Likewise. * src/NSGCString.m, src/Foundation/NSGCString.h: Likewise. * src/NSGCString.m: Likewise. * admin/Makefile: New file. * Makefile.in (SUBDIRS): Added admin. * doc/Makefile.in (TOP_DOC_FILES): Remove TODO. (DIST_FILES): Add TODO. (copy-dist): Link TODO to ../snap/admin/tasks. Tue Aug 8 11:32:13 1995 Andrew McCallum * src/NSDate.m ([NSDate -copyWithZone:]): New method. ([NSDate -descriptionWithCalendarFormat:timeZone:]): Uncommented. ([NSDate -dateWithCalendarFormat:timeZone:]): Uncommented. * src/NSAutoreleasePool.m ([NSAutoreleasePool -dealloc]): Use object_get_class() instead of ->isa. * src/Makefile.in (GNUSTEP_HEADERS): Added Foundation/NSDate.h. (GNUSTEP_MFILES): Added NSDate.m. Fri Aug 4 13:39:05 1995 Adam Fedor * src/NSAutoreleasePool.m ([NSAutoreleasePool -addObject:]): Remove double_release checking. Increment released_count after setting released array. ([NSAutoreleasePool -dealloc]): Catch release errors. ([NSAutoreleasePool -enableDoubleReleaseCheck:]): Removed method. * src/NSObject.m ([NSObject -autorelease], [NSObject -release]): Add double_release checking. ([NSObject +enableDoubleReleaseCheck:]): New method. * src/Foundation/NSAutoreleasePool.h: Remove +enableDoubleReleaseCheck:, add +autoreleaseCountForObject:. * src/Foundation/NSObject.h: Add +enableDoubleReleaseCheck:. * src/Foundation/objc-load.h: Include objc-api file. Fri Aug 4 11:08:05 1995 Andrew McCallum * src/MemoryStream.m (debug_memory_stream): Turn debugging off by default. * src/Makefile.in (install): Remove README links before relinking. * src/mframe.m (make_method_call) [__mips__]: Add 4 to offset for float retframe. Yipes, this may be needed for other architectures too. * src/Makefile.in (GNUSTEP_HEADERS): Removed Foundation/NSUser.h. (GNUSTEP_CFILES): Removed NSUser.c. Thu Aug 3 15:48:21 1995 Andrew McCallum * src/mframe.m (make_method_call): Added comment about looking into a problem with returning floats. I need to get back to this later. Mon Jul 31 10:44:22 1995 Adam Fedor * configure.in: Check for HP version of dld library. Add new DYNAMIC_LDFLAGS if hpux version found. * checks/Makefile.in (DYNAMIC_LDFLAGS): New macro. (nsbundle): Use macro in linking. * src/hpux-load.h (__objc_dynamic_link): Specify linking flags to shl_load. (__objc_dynamic_find_symbol): Check for return error from shl_findsym. Fri Jul 28 12:38:22 1995 Adam Fedor * configure.in: Added DYNAMIC_CFLAGS and extra test for hpux. * checks/Makefile.in (DYNAMIC_BUNDLER_LINKER, DYNAMIC_CFLAGS, BUNDLE_NAME, DYNAMIC_MFILES, DYNAMIC_HFILES, DYNAMIC_OFILES, nsbundle, bundles): New macros and targets. * checks/LoadMe.[hm], checks/SecondClass.[hm], checks/MyCategory.[hm], checks/nsbundle.m: New files. * src/NSBundle.m (bundle_object_name, bundle_resource_path, [NSBundle +mainBundle], [NSBundle +setSystemLanguages:]): Remove dependency on NSString for calculating paths. Wed Aug 2 12:04:51 1995 Andrew McCallum * NSBundle.README: Remove reference to gcc-dynamic.patch. Fri Jul 14 17:11:20 1995 Adam Fedor * src/MallocAddress.m ([MallocAddress -dealloc]): Check for object in dictionary before removing. * src/NSArchiver.m: Include NSData header. * src/NSAutoreleasePool.m ([NSAutoreleasePool +autoreleaseCountForObject:]): Initialize count to 0. * src/NSGData.m ([NSGMutableData -setLength:]): Reset eofPosition to size. Wed Aug 2 11:21:55 1995 Andrew McCallum * src/NSString.m ([NXConstantString -dealloc]): New method. ([NXConstantString -cString]): New method. ([NXConstantString -retain]): New method. ([NXConstantString -release]): New method. ([NXConstantString -autorelease]): New method. ([NXConstantString -copyWithZone:]): New method. (From Jeremy Bettis). * src/NSDate.m ([NSDate -isEqual:]): Fix typo. (From Jeremy Bettis). Wed Jul 12 10:22:48 1995 Adam Fedor * NSString.m (componentsSeparatedByString:, substringFromRange:, rangeOfCharacterFromSet:, rangeOfCharacterFromSet:options:, rangeOfCharacterFromSet:options:range:, rangeOfString:, rangeOfString:options:, caseInsensitiveCompare:, hasPrefix:, hasSuffix:, lastPathComponent, pathExtension, stringByAppendingPathComponent:, stringByAppendingPathExtension:, stringByDeletingLastPathComponent, stringByDeletingPathExtension): Implemented methods. * Foundation/NSException.h (_NSAssertArgs, _NSCAssertArgs): Made ',' a separate token to work with ## macro. * Foundation/NSRange.h: Added NSMakeRange declaration. Fri Jun 30 16:02:12 1995 Adam Fedor * NSData.m ([NSData +allocWithZone:]): New method. (_initWithBytesNoCopy:length): New (designated initializer) method. (initWithBytesNoCopy:length:): Make subclass responsibility. (init): Call new designated initializer. ([NSMutableData +allocWithZone:]) New Method. (dataWithCapacity:, dataWithLength:): Allocate using designated allocator. (initWithBytesNoCopy:length:): Make subclass responsibility. * NSGData.m (_initWithBytesNoCopy:length:): Make designated initializer. (initWithBytesNoCopy:length:) Call designated initializer. Wed Aug 2 10:35:31 1995 Andrew McCallum * src/Makefile.in (FILE_AUTHORS): Added "Martin Michlmayr". * NSUser.c, Foundation/NSUser.h: New files from Martin Michlmayr . * src/Makefile.in (GNUSTEP_HEADERS): Added Foundation/NSUser.h. (GNUSTEP_MFILES): Added NSUser.c. Thu Jul 6 10:11:11 1995 Adam Fedor * src/MemoryStream.m ([MemoryStream -writeBytes:length]): Realloc buffer to at least minimum required length. * src/NSCString.m ([NSCString -cString]): Malloc extra byte for '\0' terminator. * src/NSGArray.m ([NSGArray -initWithObjects:count:]): Set _capacity to minimum of 1. ([NSGMutableArray -initWithCapacity:]): Likewise. Wed Jul 5 17:19:21 1995 Andrew McCallum Released version 0.1.13. * src/NSString.m ([NSString -getCharacters:range:]): Decrement, not increment in loop. (Reported by Harmut ). Mon Jul 3 18:10:50 1995 Andrew McCallum * src/NSMethodSignature.m ([NSMethodSignature -dealloc]): Free returnTypes. * src/NSUnarchiver.m: Allow easy user-modification of concrete class. ([NSUnarchiver +_setConcreteClass:]): New method. ([NSUnarchiver +_concreteClass]): New method. ([NSUnarchiver +initialize]): New method. * src/NSArchiver.m: Allow easy user-modification of concrete class. Removed references to NSGData. ([NSArchiver +_setConcreteClass:]): New method. ([NSArchiver +_concreteClass]): New method. ([NSArchiver +initialize]): New method. * src/NSData.m: Allow easy user-modification of concrete class. ([NSData +_setConcreteClass:]): New method. ([NSData +_setMutableConcreteClass:]): New method. ([NSData +_concreteClass]): New method. ([NSData +_mutableConcreteClass]): New method. ([NSData +initialize]): New method. Sat Jul 1 14:32:52 1995 Andrew McCallum * src/objects/README: Capitalize Foundation. * src/NSArray.m: Moved NSArrayEnumerator interface and implementation from separate files to here. * src/Makefile.in (GNUSTEP_MFILES): Remove NSArrayEnumerator.m. (GNUSTEP_HEADERS): Remove Foundation/NSArrayEnumerator.h. * src/Foundation/NSZone.h: Update copyright. * src/Foundation/NSValue.h: Likewise. * src/Foundation/NSGeometry.h: Likewise. * src/Foundation/NSException.h: Likewise. * src/Foundation/NSUnarchiver.h: Likewise. * src/Foundation/NSTimer.h: Likewise. * src/Foundation/NSString.h: Likewise. * src/Foundation/NSSerialization.h: Likewise. * src/Foundation/NSRange.h: Likewise. * src/Foundation/NSObject.h: Likewise. * src/Foundation/NSObjCRuntime.h: Likewise. * src/Foundation/NSMethodSignature.h: Likewise. * src/Foundation/NSInvocation.h: Likewise. * src/Foundation/NSDictionary.h: Likewise. * src/Foundation/NSData.h: Likewise. * src/Foundation/NSCoder.h: Likewise. * src/Foundation/NSCharacterSet.h: Likewise. * src/Foundation/NSBundle.h: Likewise. * src/Foundation/NSBitmapCharSet.h: Likewise. * src/Foundation/NSAutoreleasePool.h: Likewise. * src/Foundation/NSArray.h: Likewise. * src/Foundation/NSArchiver.h: Likewise. * src/Foundation/NSDate.h: Likewise. * src/NSDate.m: Likewise. Fri Jun 30 16:42:10 1995 Andrew McCallum * src/Foundation/NSRange.h (NSLocationInRange): Added __attribute__ ((unused)). (NSMaxRange): Likewise. Fri Jun 30 13:19:24 1995 Adam Fedor * Makefile.in (install): Fixed directory typo. * NSCharacterSets/Makefile.in (INSTALL, INSTALL_PROGRAM, INSTALL_DATA): New variables. (install): Depend on installdirs. Fri Jun 30 09:45:14 1995 Andrew McCallum * (install-sh, mkinstalldirs): Change file permissions to group and all can read and execute. (Reported by Paul Kunz.) * Version (OBJECTS_SUBMINOR_VERSION): Version 0.1.13. * doc/news.texi (Noteworthy changes since version 0.1.12): New section. The "concrete class" configuration idea was proposed by Albin Jones , 10 Jun 1995. * src/NSDictionary.m: Allow easy user-modification of concrete class. ([NSDictionary +_setConcreteClass:]): New method. ([NSDictionary +_setMutableConcreteClass:]): New method. ([NSDictionary +_concreteClass]): New method. ([NSDictionary +_mutableConcreteClass]): New method. ([NSDictionary +initialize]): New method. (NSDictionary_concrete_class, NSMutableDictionary_concrete_class): New static variables. ([NSDictionary -copyWithZone:]): Make a deep copy to conform to spec; it was a shallow copy. * src/NSArray.m: Allow easy user-modification of concrete class. ([NSArray +_setConcreteClass:]): New method. ([NSArray +_setMutableConcreteClass:]): New method. ([NSArray +_concreteClass]): New method. ([NSArray +_mutableConcreteClass]): New method. ([NSArray +initialize]): New method. (NSArray_concrete_class): New static variable. (NSMutableArray_concrete_class): New static variable. ([NSArray +arrayWithObject:]): Don't use addObject:. ([NSArray -copyWithZone:]): Make a deep copy to conform to spec; it was a shallow copy. Wed Jun 28 18:31:36 1995 Andrew McCallum * Makefile.in (rcs-list-locked): Fix typo. Released Version 0.1.12. * Makefile.in (DIST_FILES): Remove gcc patch files. * doc/install.texi: Remove instructions for gcc patches. * examples/Makefile.in (ALL_CPPFLAGS): Look in ../src for includes. * examples/second-server.m: Use release instead of free. * examples/textcoding.m: Likewise. * examples/stdio-stream.m: Likewise. * src/objects/Dictionary.h ([Dictionary initWithType:keyType:capacity]): Declare it. ([Dictionary initWithType:capacity]): Likewise. * Makefile.in (RCS_FILES): Added Makeconf. * checks/Makefile.in (DIST_FILES): Added RCS_FILES. * src/Time.m: Include Sequent support. (Thanks to Matt Nelson ). * src/objects/Time.h: Likewise. * checks/test09.m: Add _SEQUENT_ to lrand48 conditional. * checks/test04.m: Likewise. * checks/test01.m: Likewise. * checks/client.m (main): Use -invalidate, not -release. * examples/first-client.m (main): Likewise. * examples/second-client.m (main): Likewise. * src/Connection.m ([Connection +newForInPort:outPort:ancestorConnection:]): Add comment. I need to fix retain/release for Connection. * checks/Makefile.in: Put src in all dependencies on libobjects.a. (OBJECTS_NEXT_INCLUDES): Look in src directory. (LIBS): Likewise. (ALL_CPPFLAGS): Likewise. * checks/test08.m: Use libobjects' Coder instead of GNU TypedStream. Comment out BinaryTree testing. * src/BinaryTree.m ([BinaryTree -_initCollectionWithCoder:]): Disabled with -notImplemented. I need to fix decoding of this class. * src/LinkedList.m: Added comment. I need to fix decoding of this class. * src/Collection.m ([Collection -_safeWithElementsCallNoRetain:]): Use malloc not alloca. * src/Dictionary.m ([Dictionary -putElement:atKey:]): Release previous element. (Thanks to Paul Burchard ). * src/NSObject.m (NSDecrementExtraRefCountWasZero): Return correct value. (Thanks to Paul Burchard ). * src/Makefile.in (CFLAGS): Remove -Wall. * doc/announce.texi: Use machines.texi. * doc/advertisement.texi: Likewise. * doc/machines.texi: New file. * doc/Makefile.in (TEXI_FILES): Added machines.texi. (info): Removed libobjects.texi and objective-c.texi. (objective-c): Print apology about makeinfo. Sun Jun 25 18:08:26 1995 Andrew McCallum * src/Makefile.in (objects/stdobjects.h): Depend on ../Version, not Makefile.in. (AUTHORS): Fix echo'ing of newlines. * Version (OBJECTS_SUBMINOR_VERSION): Version 0.1.12. (OBJECTS_GCC_VERSION): Upped from 2.6.3 to 2.7.0. Tue Jun 20 12:06:36 1995 Andrew McCallum * Makefile.in (rcs-list-locked): Print subdir names. * checks/Makefile.in: Include $(srcdir)/../Makeconf. (RCS_FILES): New variable. (install, uninstall): New targets. (copy-dist): Converted to new scheme. * examples/Makefile.in: Likewise. * doc/Makefile.in: Change the way top-level dir info files are handled. (TOP_FILES): Variable removed. (.SUFFIXES): Removed. (prefix, infodir): New variables. (copy-dist): Converted to new scheme. * doc/news.texi (Noteworthy changes since version 0.1.10): New section. * src/NSGArchiver.m ([NSGArchiver -initForWritingWithMutableData:]): New method. * src/Makefile.in (prefix, exec_prefix, libdir, includedir): New variables. * Makefile.in: Convert to new scheme with subdirs. Many variable and targets moved to subdir Makefiles. (maintainer-clean, %-subdirs): New targets. * configure.in (AC_OUTPUT): Added NSCharacterSets/Makefile. * NSCharacterSets/Makefile.in (prefix, datadir, charsetdir, INSTALL_FILES): New variables. (installdirs, install, uninstall): New targets. Fri May 26 11:17:54 1995 Adam Fedor * src/objc-load.c (objc_load_module): Don't execute ctor_list on __ELF__ systems. Fri May 19 11:22:42 1995 Andrew McCallum * doc/Makefile.in (copy-dist): Renamed from "dist". * examples/Makefile.in (copy-dist): Renamed from "dist". * checks/Makefile.in (copy-dist): Renamed from "dist". * configure.in (AC_OUTPUT): Prepend "src/" to "objects/config.h". * configure.in (AC_OUTPUT): Added src/Makefile. Changed INSTALL_HEADERS to HEADERS_INSTALL. Changed INSTALL_OBJS to OBJS_INSTALL. Thu May 11 16:09:36 1995 Andrew McCallum * Makefile.in (datadir): According to new standards, use "share" instead of "lib". Mon May 8 16:39:42 1995 Andrew McCallum * Makefile.in (dist): Rename "share" to "NSCharacterSets". (datadir): New variable. (charsetdir): New variable. (install): Install files from NSCharacterSets directory. (installdirs): Make $(datadir) and $(charsetdir). * NSCharacterSets: Directory renamed from "share". Fri May 5 10:46:37 1995 Andrew McCallum * doc/Makefile.in (TOP_FILES): New variable. (dist): Copy TOP_FILES. (version.texi): Remove $(MAKEFLAGS). * Makefile.in (OBJECTS_SUBMINOR_VERSION): Version 0.1.11. (dist): mkdir src and config. Copy share and contents. * configure.in: Use config/ directory prefix where needed. * config: New subdirectory. * config.*: Files moved there. * src/NSException.m (encodeWithCoder:, initWithCoder:): Remove class names from arg type to avoid bogus warnings about protocol conformance. * Makefile.in: Use doc/ and src/ directories. Many changes. * src: New subdirectory. Move source files there. * configure.in: Look for src/Collection.m, not Collection. * configure.in: Create doc/Makefile. * doc: New subdirectory. * doc/Makefile.in: New file. * checks/nsdictionary.m: New file. * checks/Makefile.in (SRCS): Added nsdictionary.m. * Foundation/NSDictionary.h: Uncomment -keyEnumerator and -objectEnumerator. * NSDictionary.m [NSDictionary] (+allocWithZone, +dictionary, +dictionaryWithObjects:forKeys:count:, -initWithObjects:forKeys:, +dictionaryWithObjects:forKeys:, -initWithObjects,forKeys:count:, -init, -initWithDictionary, -count, -objectForKey, -keyEnumerator, -isEqual:, -isEqualToDictionary, -descriptionWithIndent, -allKeys, -allValues, allKeysForObject:, -objectEnumerator, -copyWithZone, -mutableCopyWithZone): Implemented. [NSMutableDictionary] (+allocWithZone:, +dictionaryWithCapacity:, -initWithCapacity:, -initWithObjects:forKeys:count:, -setObject:forKey:, -removeObjectForKey:, removeAllObjects, -removeObjectsForKeys:, addEntriesFromDictionary:): Implemented. (NSGDictionaryKeyEnumerator, NSGDictionaryObjectEnumerator): New classes. * NSGDictionary.m, Foundation/NSGDictionary.h, objects/NSDictionary.h: New files. * Makefile.in (GNU_HEADERS): Added NSDictionary.h. (GNUSTEP_MFILES): Added NSGDictionary.m. (GNUSTEP_HEADERS): Added NSGDictionary.h. * objects/NSArray.h: Fix #ifndef macro name; NSArray, not NSString! * NSString.m (-compare:options:range:): Simple implementation; not complete. * NSArray.m (NSArray +allocWithZone:): Implemented. (NSMutableArray +allocWithZone:): Implemented. * NSGArray.m (-initWithObjects:count:): Retain objects. Thu May 4 11:51:04 1995 Adam Fedor * NSBitmapCharSet.m, Foundation/NSBitmapCharSet.h: Replaced NSData instance variable with char array and rewrote methods to reflect this. * NSCharacterSet.m (characterSetWithCharactersInString:): Create mutable data object for bitmap. (characterSetWithRange:): Added error checking. (deepen): removed. (copyWithZone:, mutableCopyWithZone:): More efficient implementation. (characterSetWithBitmapRepresentation:): Override implementation from super. Wed May 3 15:05:17 1995 Adam Fedor * Makefile.in (GNUSTEP_MFILES, GNUSTEP_HEADERS): Added NSBitmapCharSet. * NSCTemplateValue.m, NSConcreteNumber: Added #line macro so gdb knows which file source came from. * NSBitmapCharSet.m, Foundation/NSBitmapCharSet.h: New files. * NSCharacterSet.m (all methods): Implemented. * NSDictionary.m, Foundation/NSDictionary.h (keyEnumerator, objectEnumerator): Uncommented but left unimplemeneted. * NSNumber.m (valueClassWithObjCType:): Added break's to avoid falling through case statements. * Foundation/NSException.h (_NSAssertArgs, _NSCAssertArgs): Made ',' a separate token to work with ## macro. Wed Apr 26 10:15:51 1995 Adam Fedor * Makefile.in (GNUSTEP_MFILES, GNUSTEP_HEADERS): Added NSCharacterSet. * NSCharacterSet.m, Foundation/NSCharacterSet.h: New files. * NSString.m (componentsSeparatedByString:, substringFromRange:, rangeOfCharacterFromSet:, rangeOfCharacterFromSet:options:, rangeOfCharacterFromSet:options:range:, rangeOfString:, rangeOfString:options:, caseInsensitiveCompare:, hasPrefix:, hasSuffix:, lastPathComponent, pathExtension, stringByAppendingPathComponent:, stringByAppendingPathExtension:, stringByDeletingLastPathComponent, stringByDeletingPathExtension): Implemented methods. * Foundation/NSRange.h: Added NSMakeRange declaration. Wed Apr 26 15:01:07 1995 Andrew McCallum * install.texi: Fixed typo in patch instructions. Too many "..". (Reported by Daniel L. Green .) Thu Apr 20 20:11:23 1995 Andrew McCallum * NSData.m: Include * NSData.m (dataWithBytesNoCopy:length:): Send alloc to NSGData class, not self. Sun Apr 16 02:41:39 1995 Albin L. Jones * NSData.m([NSData -getBytes:range:], [NSData -subdataWithRange:]): Coded these, including the range checking bits. The proper exception is raised. * NSData.m([NSData -dataWithContentsOfFile:], [NSData -dataWithContentsOfMappedFile:], [NSData -initWithContentsOfFile:], [NSData -initWithContentsOfMappedFile:], [NSData -writeToFile:atomically:]): Filled these out, made them do what they were suppossed to. * NSData.m: Added many comments. Maybe I shouldn't have. Thu Apr 20 11:26:45 1995 Adam Fedor * NSCTemplateValue.m, NSConcreteNumber.m, NSConcreteValue.m, NSException.m, NSNumber.m, NSValue.m (encodeWithCoder:, initWithCoder:): Include call to super since NSObject now implements these methods. Mon Apr 17 16:37:06 1995 Andrew McCallum * Makefile.in (OBJECTS_SUBMINOR_VERSION): Version 0.1.10. * examples/second-client.h: Make AppellationObject inherit from NSObject, not Object. * examples/second-server.h: Include NSObject.h from Foundation, not objc. * NSData.m (replaceBytesInRange:withBytes:): Get pointer with -mutableBytes, not -bytes. * Makefile.in (FILE_AUTHORS): Added Jeremy Bettis. * Makefile.in: Change "foundation" to "Foundation". * Foundation: Directory renamed from "foundation". * Connection.m, NSArchiver.m, NSArray.m, NSArrayEnumerator.m, NSAssertionHandler.m, NSAutoreleasePool.m, NSBundle.m, NSCString.m, NSCTemplateValue.m, NSCoder.m, NSConcreteNumber.m, NSConcreteValue.m, NSData.m, NSDate.m, NSDictionary.m, NSEnumerator.m, NSException.m, NSGArchiver.m, NSGArray.m, NSGCoder.m, NSGData.m, NSGUnarchiver.m, NSGeometry.m, NSNumber.m, NSObject.m, NSRange.m, NSString.m, NSUnarchiver.m, NSValue.m, NSZone.c, objc-load.c: Include from , not . * objects/Collection.h, objects/NSCoder.h, objects/String.h, objects/stdobjects.h.in: Likewise. * foundation/NSArchiver.h, foundation/NSArray.h, foundation/NSArrayEnumerator.h, foundation/NSAutoreleasePool.h, foundation/NSBundle.h, foundation/NSCString.h, foundation/NSCoder.h, foundation/NSConcreteNumber.h, foundation/NSConcreteValue.h, foundation/NSData.h, foundation/NSDate.h, foundation/NSException.h, foundation/NSGArchiver.h, foundation/NSGArray.h, foundation/NSGCoder.h, foundation/NSGData.h, foundation/NSGUnarchiver.h, foundation/NSMethodSignature.h, foundation/NSObject.h, foundation/NSRange.h, foundation/NSString.h, foundation/NSUnarchiver.h, foundation/NSUtilities.h, foundation/NSValue.h: Likewise. * examples/first-server.h: Likewise. * checks/nsarchiving.m, checks/nsarray.m, checks/string.m, checks/values.m: Likewise. * objects/NSCoder.h: Fix typo: We're declaring methods of NSCoder, not NSConcreteCoder. * foundation/NSData.h: Insert the interface for NSMutableData. * NSData.m: Insert the implementation of NSMutableData. * foundation/NSGData.h: Don't include . The interface can now be found in Sat Apr 15 14:12:57 1995 Andrew McCallum * Makefile.in (OBJECTS_SUBMINOR_VERSION): Version 0.1.9. * checks/Makefile.in (SRCS): Comment out nsarchiving.m. It's not done yet. * Makefile.in (GNUStep-volunteers): New target to deal with "ln" and disparate filesystem problems. (DIST-FILES): Use the local GNUStep-volunteers file, not the remote volunteers-gnustep file. (dist): Switch back to "ln", not "ln -s". * Stream.m (-initWithMode:, -streamMode): Methods removed. (-isWritable): New method. (-initWithCoder): Renamed from +newWithCoder.m. * objects/Stream.h: Method removed and put into Streaming protocol. Included from objects/Streaming.h. (mode): Instance variable removed. (STREAM_READONLY, STREAM_WRITEONLY, STREAM_READWRITE): enum removed. * objects/Streaming.h: New file. * Makefile.in (GNU_HEADERS): Added objects/Streaming.h. * objects/StdioStream.h (mode): New instance variable, to replace one removed from Stream class. * StdioStream.m (-isWriteable): New method. (-initWithCoder): Renamed and rewritten from +newWithCoder. (-isAtEof): Renamed from -streamEof. (-initWithFilePointer:fmode:): Use new mode ivar. * objects/MemoryStream.h: New protocol . Make MemoryStream class conform to it. * MemoryStream.m (-setStreamBufferCapacity:): Renamed from -setStreamBufferSize. (-streamBufferCapacity): Renamed from -streamBufferSize. (-isWriteable): New method. (-streamBufferPrefix): Renamed from -streamPrefix. * NSArchiver.m, foundation/NSArchiver.m, NSGArchiver.m, NSUnarchiver.m, foundation/NSUnarchiver.h, foundation/NSGArchiver.h, NSGData.m, foundation/NSGData.h: New files. * Makefile.in (GNUSTEP_MFILES): Added NSArchiver.m, NSGArchiver.m, NSGData.m, NSGUnarchiver.m, NSUnarchiver.m. (GNUSTEP_HEADERS): Added foundation/NSArchiver.h, foundation/NSGArchiver.h, foundation/NSGData.h, foundation/NSGUnarchiver.h, foundation/NSUnarchiver.h. * checks/nsarchiving.m: New file. * checks/Makefile.in (SRCS): Added nsarchiving.m. * Makefile.in (GNU_HEADERS): Added objects/NSCoder.h. The GNU-interoperating concrete subclasses of NS classes have the prefix NSG. If people want to write other concrete subclasses (some of which could be more lowlevel-compatible with NeXT's classes, such as in the low-level format used by NSConcreteCoder), they can do so, and use NeXT's classnames, or their own. * NSGArray.m, foundation/NSGArray.h: Renamed from NSConcreteArray. * NSGCoder.m, foundation/NSGCoder.h: Renamed form NSGNUCoder. * Makefile.in: Renamed appropriate files for NSG prefix. * NSCoder.m: Change names from "Concrete"-style to "G"-style. * NSGCoder.m: Likewise. * foundation/NSGArray.h: Likewise. * NSArray.m: Likewise. * NSGArray.m: Likewise. Fri Apr 14 10:59:41 1995 Andrew McCallum * NSAutoreleasePool.m (+enableRelease:, +enableDoubleReleaseCheck:, +setPoolCountThreshhold:): New methods. * foundation/NSAutoreleasePool.h: Declare new methods. * Makefile.in (GNUSTEP_MFILES): Removed NSDate.m; it causes a bunch of compilation errors. (GNUSTEP_OTHER_SRCFILES): Added NSDate.m. Thu Apr 13 11:03:13 1995 Andrew McCallum * NSDate.m: Compare against [NSDate class], not NSDate. * NSDate.m: Fixed indentation. Added some calls to -notImplemented:. * NSDate.m, foundation/NSDate.h: New files from Jeremy Bettis . * Makefile.in (GNUSTEP_HEADERS): Added foundation/NSDate.h. (GNUSTEP_MFILES): Added NSDate.m. * readme.texi: Updated for changes since addition of string classes and retain/release. * NSData.m (-getBytes:range:): Implemented. (-isEqual:): New method. * Now using new ObjC Emacs mode from cc-mode.el (to be included with emacs 19.29), with (c-set-style "GNU"). This will change the way multi-line methods are indented: I used to indent with three spaces, now colons are lined up. All contributors should use the same style. Note that (c-set-style "GNU") has different c-basic-offset than the default. Wed Apr 12 11:15:57 1995 Andrew McCallum * BinaryTree.m (removeElement:): Fix bug whereby the deleted node's parent still had the deleted node as a right child. (Reported by Stephen Peters ). * Collection.m (write:, read:): Put back these old-style archiving methods. (Reported by Stephen Peters ). Sun Apr 9 20:34:32 1995 Andrew McCallum * NSAssertionHandler.m: Fix copyright date and indentation. Sun Apr 9 16:43:03 1995 Adam Fedor (fedor@boulder.colorado.edu) * Makefile.in (GNUSTEP_MFILES): Added NSAssertionHandler.m. * NSAssertionHandler.m: New file. * foundaton/NSException.h: Added NSAssert macros and NSAssertionHandler interface. Sun Apr 9 13:55:28 1995 Andrew McCallum * MallocAddress.m (objectForAddress:): Return nil if address is not maintained by a MallocAddress object. (Used to simply die.) Sat Apr 8 13:04:08 1995 Andrew McCallum * Makefile.in (GNUSTEP_MFILES): Added NSGNUCoder.m. (GNUSTEP_HEADERS): Added foundation/NSGNUCoder.h. (GNUSTEP_OTHER_SRCFILES): Added files NSArchiver.m, foundation/NSArchiver.h. * NSGNUCoder.m, foundation/NSGNUCoder.h, NSArchiver, foundation/NSArchiver.h: New files. * Makefile.in: Rearranged source variables to put GNU/NEXTSTEP/GNUStep files close together. (GNUSTEP_OTHER_SRCFILES): Added NSData.m, foundation/NSData.h. * NSData.m, foundation/NSData.h: New files. * Array.m, BinaryTree.m, BinaryTreeNode.m, CString.m, CircularArray.m, Collection.m, Connection.m, DelegatePool.m, Dictionary.m, EltNodeCollector.m, GapArray.m, LinkedList.m, LinkedListNode.m, MappedCollector.m, MemoryStream.m, MutableCString.m, NSCString.m, NSCoder.m, NSObject.m, NSString.m, Port.m, RBTreeNode.m, RNGAdditiveCongruential.m, RNGBerkeley.m, Random.m, Set.m, Stream.m, TextCoder.m, Time.m: Convert to new Coder scheme. Use -initWithCoder instead of +newWithCoder where appropriate. Remove arguments typed (Coder*). Replace +_newCollectionWithCoder with -_initCollectionWithCoder. * objects/Coding.h (CommonCoding, Encoding, Decoding): New protocols. (SelfCoding): New category of NSObject, interface only, no implementation. This takes the place of the Coding Protocol. (Coding): Protocol removed. * objects/IndexedCollecting.h: Use ConstantIndexedCollecting protocol where appropriate. * objects/Collecting.h: Use ConstantCollecting protocol where appropriate. * objects/KeyedCollection.h: Move protocol conformance to category to avoid bogus gcc complaints. * objects/IndexedCollection.h: Likewise. * Coder.m (-decodeObjectAt:withName:): Create the instance and send -initWithCoder if the object doesn't respond to +newWithCoder. Convert to new protocol and method type scheme. * Proxy.m (RemoteSelfCoding): Renamed category from RemoteCoding. * objects/Proxy.h: Likewise. * objects/Connection.h (ConnectedSelfCoding): Renamed protocol from ConnectedCoding. * objects/Collection.h: Removed Coding protocol. It's already provided by NSObject. * objects/BinaryTreeNode.h: Likewise. * objects/Port.h: Likewise. * objects/LinkedListNode.h: Likewise. * objects/IndexedCollecting.h (ConstantIndexedCollecting): New protocol extracted from IndexedCollecting. * objects/KeyedCollecting.h (ConstantKeyedCollecting): New protocol extracted from KeyedCollecting. * objects/Collecting.h (ConstantCollecting): New protocol extracted from Collecting. Fri Apr 7 16:36:08 1995 Andrew McCallum * checks/nsarray.m (main): Fix serious bug by including `nil' at end of contents list. Test forward and reverse enumerator objects. * NSArray.m (-objectEnumerator, -reverseObjectEnumerator): Implemented methods. * Makefile.in (GNUSTEP_MFILES): Added NSArrayEnumerator.m, NSEnumerator.m. (GNUSTEP_HEADERS): Added foundation/NSArrayEnumerator.h. * NSEnumerator.m, NSArrayEnumerator.m, foundation/NSArrayEnumerator.h: New files. * Connection.m (-dealloc): Remove dealloc of remote_proxies contents. * NSArray.m (-componentsJoinedByString:): Implemented method. * NSCString.m (initWithCapacity:): Make sure that capacity is greater than zero. * Makefile.in (DIST_FILES): Added volunteers-gnustep. Fri Apr 7 15:41:46 1995 Mark Lakata (lakata@nsdssp.lbl.gov) * foundation/NSZone.h: Fixed clash with linux unistd.h. Thu Apr 6 14:47:09 1995 Andrew McCallum * Makefile.in (FILE_AUTHORS): New variable. (AUTHORS): New target. (DIST_FILES): Added AUTHORS. * Makefile.in (DIST_FILES): Add objective-c.texi objective-c.info. (RCS_FILES): Add objective-c.texi. (objective-c.info): New target. (info): Add objective-c.info. * Array.m (-_encodeCollectionWithCoder:): Fix typo. Fix super call. (+_newCollectionWithCoder:): Fix super call. (Reported by allan-europa@mct.co.uk (Allan Clearwaters)). Wed Apr 5 11:22:30 1995 Andrew McCallum * Makefile.in (OBJECTS_SUBMINOR_VERSION): Version 0.1.8. * Makefile.in (NEXTSTEP_DERIVED_CFILES): New variable. (NEXTSTEP_CFILES): NXStringTable_scan.c moved to above. (NEXTSTEP_OBJS): Use NEXTSTEP_DERIVED_CFILES. (DIST_FILES): Add NEXTSTEP_DERIVED_CFILES. (objects/stdobjects.h): Target overhauled. (libobjects.a): Add dependancy on objects/stdobjects.h. (GNU_HEADERS): Remove objects/config.h, objects/stdobjects.h. (INSTALL_HEADERS): Add objects/config.h, objects/stdobjects.h. (NEXTSTEP_HEADERS): Removed README. (GNUSTEP_HEADERS): Likewise. (RCS_FILES): New variable. (rcs-list-locked): New target. (dynamic-load.h): Depend on config.status, for less re-making. (version.texi): Depend on Makefile.in, not Makefile. (realclean): Add objects/stdobjects.h objects/config.h. * objects/stdobjects.h.in: New file. * Makefile.in (GNUSTEP_OTHER_SRCFILES): Added NSConcreteNumber.m, NSCTemplateValue.m. * objects/DelegatePool.h (_last_message_had_receivers): New instance variable. * DelegatePool.m (-delegatePoolLastMessageHadReceivers): New method. (-forward::, init): Set new ivar. * objects/behavior.h (CALL_METHOD_IN_CLASS): Fix typo. * NSArray.m (allocWithZone): Removed method. (arrayWithObjects:, initWithObjects:, initWithArray:, count, indexOfObjectIdenticalTo:, indexOfObject:, isEqualToArray:, makeObjectsPerform:, makeObjectsPerform:withObject:, lastObject, firstObjectCommonWithArray:, arrayWithCapacity:, addObject:, replaceObjectAtIndex:, removeLastObject, insertObject:atIndex:, removeObjectAtIndex:, removeObjectIdenticalTo:, removeObject:, removeAllObjects, addObjectsFromArray:, removeObjectsFromIndices:numIndices:, removeObjectsInArray:, copyWithZone:, mutableCopyWithZone:): Newly implemented or overhauled. * behavior.c (class_add_methods_if_not_there): Only put method implementation in dtable if the dtable is already installed, otherwise, just add it to the class's methods list and let __objc_install_dispatch_table_for_class put it in. Also, change arguments. All callers updated. (check_class_methods): New function. * NSString.m (+initialize): Use static "done". * NSCString.m: Likewise. * checks/test01.m (main): "release" collections intead of "emtpy"ing them. * NSDeallocateObject.m (NSDeallocateObject): Set anObject->class_pointer to 0xdeadface, to help catch message-sends to deallocated objects. * Collection.m (_safeWithElementsCallNoRetain:): New method. (dealloc, empty): Use it. (send_release): New function. (Problem reported by allan-europa@mct.co.uk (Allan Clearwaters)). * Time.m (CLK_TCK): Use _CS_CLK_TCK instead of 3. Tue Apr 4 18:48:59 1995 Andrew McCallum * NSObject.m (+retain, +retainCount, +release, +autorelease): New methods. * checks/Makefile.in (SRCS): Added nsarray.m. * foundation/NSArray.h: Inherit from NSObject, not Array. * NSConcreteArray.m, foundation/NSConcreteArray.h, foundation/NSUtilities.h, objects/NSArray.h: New files. * Makefile.in (GNUSTEP_MFILES): Added NSConcreteArray.m. (GNUSTEP_HEADERS): Added foundation/NSConcreteArray.h, foundation/NSUtilities.h. (GNU_HEADERS): Added objects/NSArray.h. * objects/behavior.h: Added warning in comments. (CALL_METHOD_IN_CLASS): New macro. * objects/String.h: Add Protocol to String Protocol. Tue Apr 4 10:56:02 1995 Andrew McCallum * NSDictionary.m: Fix indentation. * NSCoder.m: Likewise. * NSArray.m: Fixed indentation. (arrayWithObject, arrayWithObjects, initWithArray, initWithObjects, initWithObjects:count:, indexOfObjectIdenticalTo:, firstObjectCommonWithArray, isEqualToArray, sortedArrayUsingFunction, sortedArrayUsingSelector): Implemented. * Time.m (#ifndef CLK_TCK): Define it using sysconf() if not already defined. (CLK_TCK wasn't defined on Solbourne S4000 running OS/MP 4.1B. Reported by Pekka Yrjola .) Mon Apr 3 19:02:37 1995 Andrew McCallum * NSString.m (initialize): No need to add IndexedCollection behavior to NSString, we already added String, and String inherits from IndexedCollection. * Makefile.in (dynamic-load.h): New target, replacing the "one-step" target, which got invoked too often. * Makefile.in (GNUSTEP_HEADERS): Add foundation/NSArray.h, foundation/NSCoder.h, foundation/NSDictionary.h. Mon Apr 3 16:36:36 1995 Adam Fedor (fedor@boulder.colorado.edu) Placeholder non-implementations from Fedor until McCallum does real implementations (that will be aided by and coexist with GNU versions). * NSArray.m, NSCoder.m, NSDictionary.m, foundation/NSArray.h, foundation/NSCoder.h, foundation/NSDictionary.h: new files. Mon Apr 3 15:58:35 1995 Adam Fedor (fedor@boulder.colorado.edu) * configure.in: check for dynamic linking libraries to figure out which *-load.h file to include in objc-load.c. * Makefile.in (one-time): new target. Mon Apr 3 14:55:47 1995 Adam Fedor (fedor@boulder.colorado.edu) * Makefile.in (GNUSTEP_MFILES, GNUSTEP_CFILES, GNUSTEP_HEADERS): Added files from corresponding FEDOR_ lists, removed FEDOR_ lists. (DIST_FILES): added gcc-dynamic.patch, NSBundle.README and GNUSTEP_OTHER_SRCFILES. (NSVALUE_OFILES, NSNUMBER_OFILES): removed multiple target declarations. * NSBundle.m (_bundle_load_callback): Changed Class* to Class. * find_exec.c: new file. * checks/Makefile (LIBS): added math library. (SRCS): Added values.m. Mon Apr 3 11:17:18 1995 Adam Fedor (fedor@boulder.colorado.edu) * Makefile.in: New class cluster targets NSVALUE_OFILES and NSNUMBER_OFILES. * NSBundle.README, NCSTemplateValue.m, NSConcreteNumber.m, NSConcreteValue.m: new files. * NSBundle.m: Use @"" constructs, change Class to a pointer. * NSException.m (encodeWithCoder:, initWithCoder:): take out calls to super until NSCoder gets implemented. * NSGeometry.m: Change includes to look in foundation subdir. * NSNumber.m, NSValue.m: Rewrote as class cluster. * NSRange.m (NSUnionRange): fixed typo - point should be range. (NSMaxRange, NSLocationInRange): Moved to header file. (NSStringFromRange): use @"" construct. * String.m (contentType) : new method. * checks/values.m: new file. * dld-load.h, null-load.h, simple-load.h, hpux-load.h: new files. * foundation/NSArray.h, foundation/NSConcreteNumber.h, foundation/NSConcreteValue.h, foundation/objc-load.h: new files. * gcc-dynamic.patch: likewise. * foundation/NSValue.h: Added methods valueClassWithObjCType: and initValue:withObjCType: for class clusters. * objc-load.c: new file. Mon Apr 3 10:43:11 1995 Andrew McCallum * String.m (initWithType:): Fix previous attempt at avoiding infinite loop. (Reported by Jeremy Bettis ) Sun Apr 2 20:05:04 1995 Andrew McCallum * Makefile.in (OBJECTS_SUBMINOR_VERSION): Version 0.1.7. * checks/string.m: Test mutable strings and "strings as collections of char's". * Connection.m, MutableString.m, NSString.m, Port.m, SocketPort.m, String.m, objects/Connection.h, objects/Invocation.h, objects/Port.h, objects/SocketPort.h, objects/ValueHolding.h, objects/stdobjects.h: Use (id ) instead of (String*). * objects/String.h: Use (id ) instead of (String*) Have String protocol include NSString protcol. * foundation/NSString.h: Define NSString and NSMutableString as protocols. Make the classes conform to them. * NSCString.m: Have increment and decrement functions take int arguments instead of unsigned because I was getting (0 >= -234) == 1. * NSString.m: Added implementations. * foundation/NSString.h: Uncomment method declarations. Now subclass of NSObject, not String. (stringWithFormat:arguments:): Added method. (NSMutableString): Added declaration for class. (NXConstantString): Moved declaration for class to here from objects/String.h. Now subclass of NSCString, not ConstantString. * NSObject.m (perform:with:with:): New method added to (NEXTSTEP) category. * NSException.m: Fix #include's. Fix @"" strings. * ConstantString.m: #if'ed out NXConstantString implementation. Moved to NSString.m * objects/String.h (NXConstantString): Declaration #if'ed out. Moved to foundation/NSString.h. * MallocAddress.m, objects/MallocAddress.h, NSCString.m, foundation/NSCString.m: New files. * Makefile.in (GNU_MFILES): Added MallocAddress.m. (GNU_HEADERS): Added objects/MallocAddress.h, objects/NSString.h. (GNUSTEP_MFILES): Added NSCString.m. (GNUSTEP_HEADERS): Added foundation/NSCString.h. (objects/stdobjects.h): Fixed typo. Sat Apr 1 16:09:04 1995 Andrew McCallum * String.m (initWithType:): Avoid infinite loop by calling designated initializer instead of init. (Reported by Jeremy Bettis ) Sat Apr 1 12:19:13 1995 Andrew McCallum * Makefile.in (OBJECTS_SUBMINOR_VERSION): Version 0.1.6. * NSObject.m (+superclass): New method. * behavior.c (behavior_debug): Fix typo in variable name use. * NSObject.m (+conformsToProtocol:): For now, send conformsTo: to Protocol object. * objects/stdobjects.h (OBJECTS_MAJOR_VERSION, OBJECTS_MINOR_VERSION, OBJECTS_SUBMINOR_VERSION): New #define's. * Makefile.in (OBJECTS_MAJOR_VERSION, OBJECTS_MINOR_VERSION, OBJECTS_SUBMINOR_VERSION): New variables. (OBJECTS_VERSION): define in terms of above. (objects/stdobjects): Set values for OBJECTS_MAJOR_VERSION, OBJECTS_MINOR_VERSION, OBJECTS_SUBMINOR_VERSION. Fri Mar 31 09:10:50 1995 Adam Fedor * NXStringTable.m (readFromFile:): Return the return value from readFromSteam so that errors get passed along. * NXStringTable_scan.l (main): Restart the parser for each new file. This fix works correctly with flex, but is a bad hack and still doesn't work right with lex. Fri Mar 31 10:28:52 1995 Andrew McCallum * configure.in: Added check for times(). * Time.m (HAVE_TIMES): Use this instead of test for solaris and hpux. * configure.in: Added check for valloc(). * objc-malloc.c (HAVE_VALLOC): if not defined, #define valloc malloc. (Reported by Mike Perik for HPUX). Tue Mar 28 12:37:22 1995 Andrew McCallum * gcc-string.patch: New version from Pieter Schoenmakers that should fix patching problems. From ftp://ftp.es.ele.tue.nl/pub/tiggr/gcc-2.6.3-statics.patch. Mon Mar 27 09:35:30 1995 Andrew McCallum * NSObject.m (+conformsToProtocol:): Renamed from -conformsToProtocol. (-conformsToProtocol:): New method. (-conformsTo:): New method. * Time.m (__hpux): Add this to #if for using times(). (Reported by Jan Springer .) Fri Mar 24 12:33:27 1995 Mark Lakata (lakata@nsdssp.lbl.gov) * NSZone.c : added #define WORDSIZE sizeof(double) (NSZoneMalloc): returns machine word aligned pointers. Actually, the word size is assumed to be equal to or smaller than sizeof(double). Fri Mar 24 10:04:54 1995 Andrew McCallum * Makefile.in (GNU_HEADERS): Added new file behavior.h. (GNU_CFILES): Added new file behavior.c. * behavior.c, objects/behavior.h: New files. * NSObject.m (retain): Call NSIncrementExtraRefCount(), not NSShouldRetainWithZone(). (Of course!) (Reported by Adam Fedor ) * Invocation.m (invoke): Fix typo. (Reported by hjl@nynexst.com (H.J. Lu).) Wed Mar 22 16:37:06 1995 Andrew McCallum * Makefile.in (OBJECTS_VERSION): Version 0.1.5. (OBJECTS_FTP_DIRECTORY): Fixed for alpha.gnu. Added many GNUSTEP files. * checks/test06.m: Inherit from NSObject, not Object. * checks/test13.m: Likewise. * checks/server.h: Likewise. * checks/server.m: Likewise. * examples/first-server.h: Likewise. * foundation/NSInvocation.h: Likewise. * examples/second-server.h: Likewise. * checks/client.m: Inherit from NSObject, not Object. Don't free connection object, release it. * IndexedCollection.m: Cast aCollectionClass to (id) so we can send NSObject protocol messages that aren't in Collecting. * Stack.m (initialize): Return void. * examples/port-client.m: Use @"" constant strings. * examples/second-server.m: Likewise. * examples/first-client.m: Likewise. * examples/first-server.m: Likewise. * examples/second-client.m: Likewise. * checks/test03.m (main): Added some #if 0'ed out new tests. * objects/CollectionPrivate.h (DeallocationHelpers): New category containing _empty and _collectionDeallocate. * BinaryCoder.m (encodeValueOfSimpleType:at:withName:): Use #ifndef __CHAR_UNSIGNED__ to prevent compiler warning. * Magnitude.m (compare:): Implemented. * foundation/NSAutoreleasePool.h: Comment fixes. * foundation/NSBundle.h: Likewise. * foundation/NSException.h: Likewise. * foundation/NSGeometry.h: Likewise. * foundation/NSRange.h: Likewise. * foundation/NSValue.h: Likewise. * NSZone.c: Include objects/objc-malloc. Likewise. * objects/String.h: Additional comments. * Invocation.m: Add header comment. * foundation/NSArray.h (arrayWithObjects): Add missing s. * NSBundle.m: Don't include NSObjectPrivate.h. * SocketPort.m: Include objects/String.h. * foundation/NSMethodSignature.h (argumentInfoAtIndex:): Comment out for now. * Set.m (_collectionDealloc): Fix super call. * Dictionary.m (_collectionDealloc): Likewise. * Array.m (_collectionDealloc): Likewise. * RetainingNotifier.m (autorelease): Implemented. * Collection.m (shallowCopyAs:, emptyCopyAs:, copyAs:): Change arg type to (Class). (dealloc, empty): Don't use safe version of makeObjectsPerform:. (_empty, _collectionDealloc): Move to a category. * objects/Collecting.h (shallowCopyAs:, emptyCopyAs:, copyAs:): Change arg type to (Class). * KeyedCollection.m: Likewise. * foundation/NSObject.h (compare:, autoreleaseClass, setAutoreleaseClass, read:, write:): Declare new category methods. * NSObject.m (class): Fix return value. (encodeWithCoder:) #ifdef out for now, until we fix compatibility with GNU Coder. (perform:with:): New method in NEXTSTEP category. * objects/Coder.h (isProxy): Method removed from NSObject(CoderAdditions). * Proxy.m (zone): New method. (isProxy): Remove method from NSObject category. Don't include objects/AutoreleasePool.h. * Coder.m (encodeSelector:withName:): Use sel_get_any_uid() to get sel type if we can't get it the normal way. (newWithCoder:): Use NSAllocateObject. (isProxy): Removed from NSObject category. * objects/Collecting.h (releaseObjects, release): Methods removed. Sat Mar 18 10:38:06 1995 Andrew McCallum * NSObject.m (zone): Implemented. * Makefile.in (GNUSTEP_MFILES): New files NSAllocateObject.m, NSBundle.m, NSCopyObject.m, NSDeallocateObject.m, NSException.m, NSGeometry.m, NSNumber.m. (GNUSTEP_HEADERS): New files foundation/NSBundle.h, foundation/NSException.h, foundation/NSGeometry.h, foundation/NSNumber.h. * NSZone.c: Base on objc_malloc and friends, not malloc. Reformat header comment. * NSAllocateObject.m, NSDeallocateObject.m, NSCopyObject.m: New files. * NSObject.m (NSAllocateObject, NSDeallocateObject, NSCopyObject): These functions moved to separate files. * objc-malloc.c (objc_valloc): New function pointer. (__objc_valloc): New function. * objects/objc-malloc.h (objc_valloc): New function declared. (OBJC_VALLOC): New macro. * Proxy.m (dealloc): Call NSDeallocateObject(). * KeyedCollection.m (dealloc): Deleted. * Dictionary.m (_collectionDealloc): Renamed from dealloc. * Set.m (_collectionDealloc): Likewise. * Array.m (_collectionDealloc): Likewise. * Connection.m: Removed Object(Retaining) category. * Set.m (_empty): Renamed from emtpy. * LinkedList.m (_empty): Likewise. * GapArray.m (_empty): Likewise. * EltNodeCollector.m (_empty): Likewise. * Dictionary.m (_empty): Likewise. * CircularArray.m (_empty): Likewise. * BinaryTree.m (_empty): Likewise. * Bag.m (_empty): Likewise. * Array.m (_empty): Likewise. Fri Mar 17 11:09:29 1995 Andrew McCallum * Coder.m (dealloc): Remove unneccesary releaseObjects. * EltNodeCollector.m (dealloc): Likewise. * Collection.m: Rename method "empty" to "_empty". Rename "releaseObjects" to "empty". * Set.m: Do retain/release/autorelease of contents as appropriate. * BinaryTree.m: Likewise. * CircularArray.m: Likewise. * SplayTree.m: Likewise. * RBTree.m: Likewise. * LinkedList.m: Likewise. * Heap.m: Likewise. * GapArray.m: Likewise. * Dictionary.m: Likewise. * Proxy.m (autorelease): Ask NSObject for autoreleaseClass. Wed Mar 15 17:56:57 1995 Andrew McCallum * Array.m: Do retain/release/autorelease of contents as appropriate. * Bag.m: Likewise. * Makefile.in (DIST_FILES): Added gcc-class.patch and gcc-string.patch. (OBJECTS_GCC_VERSION): Changed from version 2.6.1 to 2.6.3. Tue Mar 14 11:50:23 1995 Andrew McCallum * objects/CollectionPrivate.h (RETAIN_ELT, RELEASE_ELT, AUTORELEASE_ELT): New macros. Sun Mar 12 11:37:10 1995 Andrew McCallum * objects/stdobjects.h: Declare @class String; * objects/Collecting.h (alloc, respondsToSelector:, conformsToProtocol:) removed. * objects/Connection.h: Use String* instead of char*. * objects/SocketPort.h: Likewise. * objects/Port.h: Likewise. * Connection.m: Likewise. * SocketPort.m: Likewise. * Port.m: Likewise. * checks/client.m, checks/server.m: Likewise. * objects/IndexedCollecting.h (IndexRange): changed to location/length from start/end. * IndexedCollection.m: Use location/length instead of start/end. * *.[hm]: Use `release' and `dealloc' instead of `free'. * *.[hm] (initialize): return void. * objects/Collecting.h: Use `release' and `dealloc' instead of `free'. (write:, read:): Removed. (respondsToSelector:, conformsToProtocol:) Renamed from old Object method names to NSObject method names. * NSZone.c: New file, renamed from zone.c. Include foundation/NSZone, not foundation/zone.h. * Makefile.in (GNU_MFILES): Remove AutoreleasePool.m, AutoreleaseStack.m, ObjectRetaining.m. (GNU_HEADERS): Remove AutoreleasePool.h, AutoreleaseStack.h, ObjectRetaining.h * checks/Makefile.in (string): New test program. * objects/Coder.h: Changed superclass from Object to NSObject. * objects/Collection.h: Likewise. * objects/Stream.h: Likewise. * objects/RNGAdditiveCongruential.h: * objects/RNGBerkeley.h: Likewise * objects/Random.h: Likewise. * objects/Magnitude.h: Likewise. * objects/RetainingNotifier.h: Likewise. * objects/BinaryTreeNode.h: Likewise. * objects/LinkedListNode.h: Likewise. * objects/Lock.h: Likewise. * objects/stdobjects.h: Include foundation/NSObject.h instead of objc/Object.h. Sat Mar 11 16:39:18 1995 Andrew McCallum * Makefile.in (NEXTSTEP_MFILES): Renamed from NeXT_MFILES. (NEXTSTEP_CFILES): Renamed from NeXT_CFILES. (NEXTSTEP_OTHER_SRCFILES): Renamed from NeXT_OTHER_SRCFILES. (GNUSTEP_MFILES, GNUSTEP_CFILES, GNUSTEP_HEADERS, GNUSTEP_OBJS): New variables. (GNU_MFILES): Added CString.m, ConstantString.m, MutableCString.m, MutableString.m, String.m. (GNU_HEADERS): Added String.h. (GNUSTEP_HEADERS): Added NSAutoreleasePool.h, NSObjCRuntime.h, NSString.h. (DIST_FILES): Added GNUSTEP files. * configure.in: Renamed variables from NeXT... to NEXTSTEP. Added GNUSTEP variables. * objects/ValueHolding.h (ValueSetting): Methods now return `void' instead of `self'. * foundation/NSZone.h: Renamed from foundation/zone.h. Thu Mar 9 15:05:45 1995 Andrew McCallum * zone.c, foundation/zone.h: New files from Mark Lakata. * Makefile.in (GNUSTEP_HEADERS): Added foundation/NSZone.h. Wed Mar 8 17:35:01 1995 Andrew McCallum * Coder.m: `CLASS' #define no longer necessary, using `Class'. * Proxy.m: Likewise. * Connection.m: Likewise. * objects/stdobjects.h (CLASS): #define removed. * objects/Proxy.h (class): use "Class" instead of "Class*" to match new runtime. * Makefile.in (GNUSTEP_HEADERS): New variable. (DIST_FILES): Added GNUSTEP_HEADERS. * configure.in: Likewise. * configure.in: Renamed NeXT_HEADERS to NEXTSTEP_HEADERS. * Makefile.in: Likewise. * Makefile.in (NeXT_HEADERS): Move from objects/next-includes up to top. (OBJECTS_NEXT_INCLUDES): Look directly in top level directory. (dist, mostlyclean, installdirs): Likewise. Sat Feb 11 16:20:49 1995 Andrew McCallum * Makefile.in (OBJECTS_VERSION): Version 0.1.4. Wed Feb 1 15:26:11 1995 Andrew McCallum * checks/test01.m: Use lrand48() instead of random() if defined(__hpux). * checks/test09.m: Likewise. * checks/test04.m: Likewise. (Patch from Timothy Mooney ) Thu Jan 26 12:52:33 1995 Andrew McCallum * objc-gnu2next.m: Convert Class* to Class. * Proxy.m: Likewise. * Coder.m: Likewise. Fri Jan 13 12:57:50 1995 Andrew McCallum * Makefile.in (OBJECTS_VERSION): Version 0.1.3. * ConnectedCoder.m (newDecodingWithConnection:timeout:): On timeout use objc_free to free the buffer. * checks/client.m (main): Only release remote_peer_obj if it really is a remote object. * examples/second-client.m (main): Only free appellation string if it's from a remote object. Mon Jan 9 12:14:03 1995 Andrew McCallum * RetainingNotifier.m (autorelease): New (unimplemented) method. (Reported by Peter Kristensen ). Fri Jan 6 17:57:08 1995 Andrew McCallum * Makefile.in (DIST_FILES): Added file MACHINES. Tue Dec 13 11:53:54 1994 Andrew McCallum * Makefile.in (OBJECTS_VERSION): Version 0.1.2. * Coder.m (Object (CoderAdditions)): Removed methods retainCount, dealloc, release, retain. * objects/Coder.h (Object (CoderAdditions)): Likewise. Mon Dec 12 14:13:58 1994 Andrew McCallum * Makefile.in (dvi): Now points at libobjects.dvi. (libobjects.dvi): New target, disabled until texinfo.tex is fixed. Fri Dec 9 20:00:56 1994 Andrew McCallum * Makefile.in (ANNOUNCE): depends on news.texi. * Makefile.in (version.texi): Output FTP vars only if non-empty. * Makefile.in (OBJECTS_FTP_MACHINE,OBJECTS_FTP_DIRECTORY): New vars. (version.texi): set OBJECTS_FTP_MACHINE and OBJECTS_FTP_DIRECTORY. * Makefile.in (OBJECTS_VERSION): Bumped to 0.1.1. Wed Dec 7 12:59:32 1994 Andrew McCallum * SocketPort.m: Include #if _AIX. (Reported by Todd B. Templeton .) Sun Nov 20 19:19:13 1994 Andrew McCallum (mccallum@mustang.cs.rochester.edu) * Connection.m (connectionForward,connectionPerformAndDismissCoder): Removed old #if'ed-out versions. Mon Nov 14 10:58:46 1994 Andrew McCallum (mccallum@vein.cs.rochester.edu) * objects/objc-gnu2next.h: (sel_get_uid): Fix typo. (class_is_class, class_is_meta_class, object_is_class, object_is_instance, object_is_meta_class): New functions. The above from a patch by Matthias Klose Sun Nov 13 14:29:37 1994 Andrew McCallum (mccallum@moose.cs.rochester.edu) * Makefile.in (diff): Fix tar call. Add proper arguments to diff. Thu Nov 10 16:51:48 1994 Andrew McCallum (mccallum@vein.cs.rochester.edu) * news.texi (Noteworthy changes since version @samp{0.1.0}): New section. * Makefile.in (TAGS): Use DIST_FILES, not non-existant SRCS. Wed Nov 9 18:34:53 1994 Andrew McCallum (mccallum@vein.cs.rochester.edu) * configure.in: Remove duplicate NeXT_runtime=0. Tue Nov 8 10:44:30 1994 Andrew McCallum (mccallum@moose.cs.rochester.edu) * libobjects.texi (Organization): Updated inheritance tree. * checks/test12.m (main): Free "rng", not "r" twice. * TextCoder.m (encodeName): Do right thing for NULL name. (Above three reported by Stephen Peters ) * Proxy.m (autorelease): New method. * Time.m: Patch for Solaris 2.4. Use times() instead of getrusage(). (Patch from Stephen Peters ) * Makefile.in (GNU_MFILES,GNU_HEADERS): Added AutoreleasePool, AutoreleaseStack and ObjectRetaining. * AutoreleasePool.m: Removed retain_count stuff. Now setting autorelease_class. * ObjectRetaining.m: Removed stack release code. (autorelease_class): New variable. * objects/Retaining.h (autorelease): New method. Added comments. * objects/objc-gnu2next.h: Moved Object(GNUExtentions) category from stdobject.h to here. * Makefile.in (DIST_FILES): Added README.ULTRIX. * Makefile.in (install,installdirs,includedir): Make NEXT_HEADERS install to proper place: objects/next-include/. Fri Nov 4 01:32:27 1994 Andrew McCallum (mccallum@moose.cs.rochester.edu) * Makefile.in (diff): New target. * Makefile.in (ADVERTISEMENT): New target. * Version 0.1.0 released. Thu Nov 3 19:20:28 1994 Andrew McCallum (mccallum@mustang.cs.rochester.edu) * Connection.[hm] (connectionForward:::): Added object argument. Use selectorTypeForProxy: if defined (NeXT_runtime). * Proxy.m (forward::): Added object argument to connectionForward. (selectorTypeForProxy:): Add an Object Category with this method. * Coder.m (decodeName:): Terminate char* with 0. * collhash.c: Use objc_malloc and friends instead of __objc_xmalloc and friends. * StdioStream.m (writeBytes:length:): Use fwrite, not write. (readBytes:length:): Use fread, not read. Wed Nov 2 20:59:36 1994 Andrew McCallum (mccallum@leopard.cs.rochester.edu) * configure.in: Updated for Autoconf 2.0 * Makefile.in (DIST_FILES): Changed install.sh to install-sh. (distclean): Added config.log, config.cache. (prefix, exec_prefix): Updated for Autoconf 2.0 Fri Oct 28 18:20:28 1994 Andrew McCallum (mccallum@mustang.cs.rochester.edu) * *.[hm]: Change many "NeXT_cc" to "NeXT_runtime" * Proxy.[hm]: Add and use _method_types ivar if NeXT_runtime. * objects/objc-gnu2next.h: Many addtional functions #define'd. * objc-gnu2next.m: New file. * Makefile.in (GNU_MFILES): Added objc-gnu2next.m. * BinaryCoder.m (encode,decodeValueOfSimpleType:...): Added code to write to stream directly (i.e. it does its own architecture independent coding). This replaces previous messy code that interfaced with the internals of GNU TypedStream's. * Makefile.in (GNU_MFILES,GNU_HFILES): Removed bcoder-stream.[hm]. Thu Oct 27 17:39:49 1994 Andrew McCallum (mccallum@mustang.cs.rochester.edu) * SocketPort.m (sendPacket:toPort:timeout:, newRemoteWithNumber:onHost:): Added casts to (char*) to prevent warnings on systems that don't have "const" on args to gethostbyname() and sendto(). * ConnectedCoder.h: New #define's METHODTYPE_REQUEST, METHODTYPE_REPLY. * Connection.m (_typeForSelector:remoteTarget:): New method. (_handleMethodTypeRequest:): New method. (doReceivedRequestsWithTimeout:): Watch for METHODTYPE_* msgs. (newReceivedReplyRmcWithSequenceNumber:): Likewise. * Proxy.m (selectorTypeForProxy:): New method. * Proxy.h (_method_types): New instance variable. * mframe.[hm], mtypes.[hm]: New files. * Makefile.in (GNU_MFILES): Added mframe.m (GNU_HFILES): Added mframe.h. (GNU_CFILES): mtypes.c. (GNU_OTHER_SRCFILES): Added mtypes.h. * Connection.m (connectionForward,connectionPerformAndDismissCoder): Use functions in mframe.m instead of previous DO-specific method frame code. Mon Oct 24 18:41:35 1994 Andrew McCallum (mccallum@leopard.cs.rochester.edu) * configure.in: Added AC_HEADER_CHECK for sys/rusage.h and ucbinclude/sys/resource.h needed in Time.m on various SYSV systems. * *.[hm]: Changed method name encodeType: to encodeValueOfType:. Likewise for decodeType and SimpleType method names. Makefile.in (GNU_OTHER_SRCFILES): Removed bzero.c. (DIST_FILES): Added README.BZERO. configure.in: Removed bzero stuff. Thu Oct 20 13:10:50 1994 Andrew McCallum (mccallum@vein.cs.rochester.edu) * IndexedCollection.m (putElement:atKey:): New method, needed for KeyedCollecting protocol. (reported by Niels Mvller ) Wed Oct 19 19:35:32 1994 Andrew McCallum (mccallum@zebra.cs.rochester.edu) * configure.in: Look for libraries "socket" and "nsl", needed for the distributed objects check/example programs on Solaris machine. * checks/test01.m,test04.m,test09.m: Use lrand48 instead of random if on Solaris machine. Tue Oct 18 10:27:29 1994 Andrew McCallum (mccallum@graphite.cs.rochester.edu) * Set.[hm] (*WithCollection:): Renamed from *With:. * *.[hm]: Changed method name "initCapacity" to "initWithCapacity". Changed method names "...Encoding:" to "...(With)Type:" to match Coder method names. Fri Oct 7 17:08:57 1994 Andrew McCallum (mccallum@vein.cs.rochester.edu) * DelegatePool.[hm], Makefile.in: Renamed "DelegateList" to "DelegatePool" to avoid false association with List object. Thu Sep 22 10:06:19 1994 Andrew McCallum (mccallum@llama.cs.rochester.edu) * configure.in: Check for bzero, and include bzero.o in the library if not. (This works around a bug in libobjc.) * Makefile.in (GNU_OBJS): Added @BZERO@. (GNU_OTHER_SRCFILES): Added bzero.c. * *.m: Added methods for Coding where necessary; a few just send -notImplemented: for now. Tue Sep 20 20:11:57 1994 Andrew McCallum (mccallum@llama.cs.rochester.edu) * objects/ValueHolding.h: Divided ValueHolding protocol into ValueGetting and ValueSetting. * GCC-BUGS, CREDITS: new files. * Makefile.in (DIST_FILES): Added GCC-BUGS, CREDITS. Mon Sep 19 14:42:26 1994 Andrew McCallum (mccallum@llama.cs.rochester.edu) * LinkedList.m (successorOfElement,predecessorOfElement): return nil when there is no such element because arg was first or last in list; previously it raised an error. Mon Sep 12 18:54:47 1994 Andrew McCallum (mccallum@vein.cs.rochester.edu) * HashTable.[hm]: Changed GNUHashState to NXHashState. Tue Sep 6 21:11:38 1994 Andrew McCallum (mccallum@vein.cs.rochester.edu) * LinkedList.m, LinkedListNode.m EltNode-m: Added methods for Coding. Sat Aug 20 18:34:38 1994 Andrew McCallum (mccallum@vein.cs.rochester.edu) * examples/*: Added example files: Makefile.in, dictionary.m, port-server.m, port-client.m, first-server.[hm], first-client.m, second-server.[hm], second-client.[hm], textcoding.m Fri Aug 19 18:39:06 1994 Andrew McCallum (mccallum@vein.cs.rochester.edu) * Collection.m, Set.m: Added new methods for Coding. * Makefile.in: Include new files in the distribution. Add new classes: Stream, StdioStream, MemoryStream, Coder, TextCoder, BinaryCoder, Port, SocketPort, Connection, Proxy, ConnectedCoder, Lock, RetainingNotifier. New protocols: Coding, Retaining, Locking. New text files: announce.texi, ANNOUNCE, readme.texi, README. Thu Aug 11 12:30:20 1994 Andrew McCallum (mccallum@vein.cs.rochester.edu) * checks/Makefile.in (CC): Changed from gcc to @CC@. * CircularArray.m (insertElement:atIndex:): Swapped order of incrementCount and CIRCULAR_TO_BASIC. (Test case crash reported by Matthias Klose .) Wed Aug 10 12:30:45 1994 Andrew McCallum (mccallum@raccoon.cs.rochester.edu) * Makefile.in: Defined GNU_MFILES, NeXT_MFILES, GNU_CFILES, NeXT_CFILES, GNU_HEADERS, NeXT_HEADERS, GNU_OTHER_SRCFILES, NeXT_OTHER_SRCFILES. Removed *OFILES. Renamed DISTFILES to DIST_FILES. Tue Aug 9 15:21:43 1994 Andrew McCallum (mccallum@mink.cs.rochester.edu) * Changed name to libobjects. All files changed accordingly. * Makefile.in (DISTFILES): Added install.sh. Mon Aug 8 13:15:46 1994 Andrew McCallum (mccallum@vein.cs.rochester.edu) * Makefile.in (GOBJC_HDRS): Removed gobjc/ReferenceCounting.h. Will be replaced by Retaining protocol. Sun Aug 7 17:13:08 1994 Andrew McCallum (mccallum@vein.cs.rochester.edu) * config.nextcc.h: Created. * configure.in: Update to use config.nextcc.h, define NeXT_cc instead of NXcc. Flipped the logic on NeXT32plus. (Reported by Matthias Klose ) * Time.[hm]: Hack to make it work with Solaris rusage. Fri Jul 22 11:41:32 1994 Andrew McCallum (mccallum@vein.cs.rochester.edu) * Makefile.in (dist): Makefile.depend and Makefile.local forced to be empty files by touch. Sat Jul 16 13:18:10 1994 R. Andrew McCallum (mccallum@ngoma) * configure.in: Define NXcc if using NeXT's cc. Sources #ifdef'ing (NeXT) don't distinguish between NeXT cc and gcc on a NeXT. *.[hm]: Change #ifdef (NeXT) to #ifdef (NXcc) * Makefile.in: include Makefile.local. * zone.c, gobjc/next-includes/zone.h: New files. Wed Jul 6 16:23:16 1994 Andrew McCallum (mccallum@swan.cs.rochester.edu) Changed name to from libcoll to libgobjc: * All files: Changed name to "GNU Objective-C Class Library" in all header comments. * gobjc: Renamed coll to gobjc. * gobjc/stdgobjc.h: Renamed from coll/collstd.h. Removed some declarations that were already in gobjc/objc-malloc.h. * gobjc/next-includes/objc: Created * gobjc/next-includes/objc/ {List.h,HashTable.h,Storage.h,NXStringTable.h}: Moved from gobjc. * Makefile.in: Names changed from libcoll to libgobjc. * gobjc/next-include/objc/*.h: Look in objc instead of coll. * gobjc/next-include/objc/List.h: Changed GNU_ to NX_. Tue Jul 5 15:51:58 1994 Andrew McCallum (mccallum@vein.cs.rochester.edu) * Storage.m (_makeRoomForAnotherIfNecessary): Added self-> to find ivar in assert() call. Reported by ratlifc@ctron.com (Christian A. Ratliff). Tue Jun 7 16:21:57 1994 Andrew McCallum (mccallum@raccoon.cs.rochester.edu) * List.m (incrementCount): Compare numElements and maxElements by >= instead of ==. (Reported by Paul Kunz.) Fri Jun 3 13:26:42 1994 Andrew McCallum (mccallum@zebra.cs.rochester.edu) * LinkedList.m (successorOfElement:,predecessorOfElement:): Added. * (removeElementAtIndex:): Return old element. (Both reported by nisse@lysator.liu.se) Tue May 24 10:13:38 1994 Andrew McCallum (mccallum@brain.cs.rochester.edu) * coll/objc-gnu2next.h (objc_read_types): Removed ## from NXWriteTypes() and NXReadTypes(). -cpp-traditional doesn't like it, and 'args' should never be emtpy anyway. (Reported by Stefan Reich ) * checks/Makefile.in (LIBS): Removed -lobjc, added LIBOBJC, made it conditional on NeXT cc test from configure.in. * configure.in: Added LIBOBJC substitution. * collstd.m: Added missing semicolon to coll_NeXT_cc_version line. * Storage.m (_makeRoomForAnotherIfNecessary): Added assert() checking for non-zero maxElements. * Makefile.in (install): Changed HDRS to INSTALLHDRS. (Reported by Matthias Klose ) Mon May 9 18:30:05 1994 Andrew McCallum (mccallum@vein.cs.rochester.edu) * Storage.m (initCount:elementSize:description): Make sure maxElements >= 1. (Reported by Paul Kunz.) These from Kresten Thorup: * collstd.[hm] (#if NeXT): Added @interface/@end. Added -shouldNotImplement:. * configure.in, collstd.m: Changed NX_COMPILER_RELEASE to NX_CURRENT_COMPILER_RELEASE. Sun May 8 19:40:40 1994 Andrew McCallum (mccallum@vein.cs.rochester.edu) * configure.in: Added check for nested function support. * config.nested.c: Created. * Makefile.in: Removed "-include Makefile.depend". Removed "-include Makefile.local". * List.m (removeObjectAt:): Now returns old object. (Reported by Paul Kunz.) Fri May 6 11:11:17 1994 Andrew McCallum (mccallum@vein.cs.rochester.edu) * collstd.[hm]: Defined coll_NeXT_cc_version. * checks/test11.m: Modified from NXStringTable test code provided by * checks/Makefile.in: Added test11.m, NXStringTable.example. * Makefile.in: Added support for NXStringTable_scan.lex * eltfuncs.m (elt_get_encoding): Fixed bug by adding char_ptr_u. (__init_comp_func_hashtable(): Passing elt_{hash,compare}... to coll_hash_new. Thu May 5 09:47:08 1994 Andrew McCallum (mccallum@vein.cs.rochester.edu) * Makefile.in, configure.in: Automatically check if using NeXT's compiler. If so, add -cpp-traditional, don't compile or install NeXT compatibility classes. If not, compile and install NeXT compatibility classes. MAKEDEFINES now includes $(INCLUDEFLAGS). * StringTable*: Changed name to NXStringTable*. * collstd.[hm]: #ifdef NeXT -compare:. Added. * eltfuncs.m: Changed to use coll/collhash.[hc] instead of objc/hash.[hc]. Added (void*) casts to __objcx[mc]alloc. Tue May 3 14:09:03 1994 Andrew McCallum (mccallum@vein.cs.rochester.edu) * Makefile.in: Removed Makefile.depend target. Tue Apr 19 17:55:45 1994 Andrew McCallum (mccallum@zebra.cs.rochester.edu) * Storage.m (initCount:elementSize:description, setNumSlots): Clear the allocated memory. Patch contributed by Adam Fedor * List.m (addObject:): Now calls insertObject:at:, as does NeXT's. (removeLastObject): Now calls removeObjectAt:, as does NeXT's. The following are minor changes to enable compilation with NeXTSTEP 3.3 cc. Thanks to Kresten Krab Thorup. * Collection.m (allocCopy): #ifdef NeXT object_copy takes 2 args. * DelegateList.m (+initialize): Added. * eltfuncs.m: Define _C_ATOM. Fix hash function types. #ifdef NeXT add definitions for assert, objc_fatal, __objc_xmalloc, __objc_xcalloc. Sat Feb 26 11:39:26 1994 Andrew McCallum (mccallum@vein.cs.rochester.edu) * DelegateList.[hm] (delegateListCollection): Changed name from delegateListList. Changed because what's returned is not a List. (delegateListAddObjectIfAbsent:) Created. Fri Jan 21 13:29:48 1994 Andrew McCallum (mccallum@vein.cs.rochester.edu) * Collection.m (safeWithElementsCall:, safeWithElementsCall:whileTrue:): Removed extra -addContentsOf:. (Reported by Allan Clearwaters ) Fri Dec 17 14:45:30 1993 Andrew McCallum (mccallum@raccoon.cs.rochester.edu) * List.m (insertObject:at:): Fixed bug that occured when trying to insert at index zero on an empty list. (Reported by Paul Kunz) Tue Nov 16 18:40:12 1993 Andrew McCallum (mccallum@vein.cs.rochester.edu) * Collecting.h, Collection.m, *.m: Renamed -includesSameContents: to -contentsEqual:. "Equal" reminds the programmer that "isEqual" is called on content objects. I think "Same" is used by Brad Cox's code to mean something different from "isEqual". Later we could add "contentsSame:" if it proves useful. Don't use "includes" because programmers might think that we are talking about a subset operation here---no this method tests for complete membership equality. IndexedCollecting.h, IndexedCollection.m: Renamed -includesSameContentsInOrder: to -contentsEqualInOrder:. Collection.m (isEqual:): Removed. Now we just let Object take care of equality testing. If you want to test equality of contents, use -hasEqualContents:. Thu Nov 11 17:01:37 1993 Andrew McCallum (mccallum@llama.cs.rochester.edu) * coll/KeyedCollecting.h, KeyedCollection.m: Changed -insertObject:atKey: to putObject:atKey:. In KeyedCollection "insert" doesn't really insert. If there already an object at that key, it replaces. But we can't use replace because there might not be an object at that key yet. "Insert" was a bad name because the method replaces an element if there already is one at that key. "Put" is different from "replace" because "put" can place elements at keys that don't already have elements associated with them. This naming scheme also has the advantage that we can later use "insertObject:atKey: for a collection that allows multiple elements at a single key. * Makefile.in, coll/collstd.h, collstd.m: Moved version information from version.c to collstd files. (version.c): Removed. * Time.m: (indexOf...Name, nameOf...Index): Implemented. Wed Nov 10 13:36:06 1993 Andrew McCallum (mccallum@vein.cs.rochester.edu) * Collection.m: (-includesSameContents:): Added a check for same comparisonFunction. (-compare:): Implemented. * IndexedCollection.m (-indexOfFirstIn:, -indexOfFirstNotIn:): Implemented. * readme.texi, news.texi: Created. Changed Makefile to support these. * checks, checks/Makefile.in: Renamed tests directory to checks. Created autoconf Makefile.in for checks directory. Wed Nov 3 10:27:52 1993 Andrew McCallum (mccallum@vein.cs.rochester.edu) * coll/Collecting.h: (newEnumState, freeEnumState:) Added. Now we can avoid memory leaks. Later we can built an Iterator class on top of these methods if we like. *.m: Make use of new enum state methods. * IndexedCollection.m (indexOfFirstDifference:) Implemented. Tue Nov 2 13:40:34 1993 Andrew McCallum (mccallum@vein.cs.rochester.edu) * RBTree.m (removeElement:,_RBTreeDeleteFixup): Added. RBTree should now be operational. * BinaryTree.m, RBTree (nilNode): Added. Now using this sentinal to make a few operations more efficient. Mon Nov 1 15:07:48 1993 Andrew McCallum (mccallum@vein.cs.rochester.edu) * *.m: Made sure all function pointers are dereferenced when called. * SplayTree.m (-splayNode:, -sortAddElement:byCalling:, -insertElement:after:, -insertElement:before:, -insertElement:atIndex:, -removeElement:, -_doSplayOperationOnNode:): Added. SplayTree should now be operational. * eltfuncs.m (elt_fprintf_elt): Now passing "l" when fprintf'ing ... long elements. * coll/CollectionPrivate.h (RETURN_BY_CALLING_EXCEPTION_FUNCTION): No longer uses __builtin_apply and __builtin_return unnecessarily. Sun Oct 31 12:34:55 1993 Andrew McCallum (mccallum@vein.cs.rochester.edu) * BinaryTree.m (-leftRotateAroundNode:, -rightRotateAroundNode:): Fixed bug occurring when rotation child is nil. (rootNode): Added. * Collection.m, KeyedCollection.m, IndexedCollection.m (-...Object:...): Added CHECK_CONTAINS_OBJECTS_ERROR; Fri Oct 29 14:22:41 1993 Andrew McCallum (mccallum@vein.cs.rochester.edu) * KeyedCollection.m, Collection.m: Removed use of LAMBDA(). Thu Oct 28 15:44:23 1993 Andrew McCallum (mccallum@vein.cs.rochester.edu) * coll/Time.h: Removed from @interface line. Tue Oct 26 8:32:48 1993 Andrew McCallum (mccallum@vein.cs.rochester.edu) * Released version 931026. Mon Oct 25 12:41:28 1993 Andrew McCallum (mccallum@vein.cs.rochester.edu) * coll/*Collecting.h: Removed shallowCopy... methods with weird options. These can be done easily and more flexibly with enumerations. * coll/*Collecting.h, *Colletion.m: Removed definition and use of COLL_NO_ELEMENT, COLL_NO_OBJECT, COLL_NO_KEY, COLL_NO_INDEX. Added ...ifAbsentCall: methods to replace this functionality. * coll/Collecting.h, Collection.m: ...AllOccurrences... methods now return self. Thu Oct 21 17:41:49 1993 Andrew McCallum (mccallum@vein.cs.rochester.edu) * libcoll.texi: Created. Tue Oct 19 10:25:34 1993 Andrew McCallum (mccallum@vein.cs.rochester.edu) * coll/Collecting.h: Changed method name -freeContents to -freeObjects. Both names are pretty clear, and the later has the advantage of compatibility with NeXT. * coll/Collecting.h: Changed method name -containsObjects to -contentsAreObjects. The previous name could be interpretted as testing whether or not the collection was empty; in fact this method just tests whether or not the collection was initialized to hold objects (i.e. initEncoding:@encode(id)). * coll/collstd.h: Added #define's for defining nested functions in the argument position: LAMBDA, LAMBDA_VOID_PERFORM, LAMBDA_ID_PERFORM, LAMBDA_BOOL_PERFORM. * coll/Collecting.h, KeyedCollecting.h, IndexedCollecting.h: Removed many methods for various combinations of perform:, perform:with:, perform:in, perform:in:with:. All these can now be replaced with ...ByCalling: methods now that we can easily define nested functions with the LAMBDA macro's. These methods really ballooned the size of the protocols, and they still didn't provide all the potentially useful conbinations. This new scheme is far more flexible. I left the -makeObjectsPerform: and -makeObjectsPerform:with: for compatibility with NeXT. Mon Oct 18 15:18:01 1993 Andrew McCallum (mccallum@vein.cs.rochester.edu) * eltfuncs.m: Fixed overflow bug in compare functions. Fri Oct 8 11:47:56 1993 Andrew McCallum (mccallum@vein.cs.rochester.edu) * List.m (replaceObjectAt:): Now returns oldObject. (makeObjectsPerform:with:): Now uses perform:with:. Removed -sortUsingMethod:inObject:. * coll/SortedArray.h: removed. Thu Sep 30 10:52:14 1993 Andrew McCallum (mccallum@vein.cs.rochester.edu) * List.m (makeObjectsPerform:, makeObjectsPerform:with:): Removed dependence on _makeObjects...:reverseOrder:. Using #if instead. * Bag.m (removeElement:occurrences:): Added. Bag will now cause error if you try to remove an element that's not there, or not there enough times. Tue Sep 28 11:49:42 1993 Andrew McCallum (mccallum@vein.cs.rochester.edu) * List.m, Storage.m: Now use objc_malloc/OBJC_MALLOC and friends instead of malloc and friends. * Makefile.in, configure.in: Created. Now libcoll works with autoconf. Also made some changes to *.m to take advantage of autoconf. * collstd.m: Changed definition of free(). (thanks to krab@iesd.auc.dk) Mon Sep 27 09:59:25 1993 Andrew McCallum (mccallum@vein.cs.rochester.edu) * Bag.m (-uniqueCount): Added. * HashTable.m (-initKeyDesc:valueDesc:capacity:) Increased portability for {long, unsigned} ints. * IndexedCollecting.h, IndexedCollection.m: Added -safe...InReverse methods. * List.m (copy): Added. In order to force -shallowCopy for compatibility with NeXT. * collhash.[hc] (coll_hash_empty): Added. * Collecting.h, Collection.m: (-safe...) Added these enumerators for doing enumerations while changing the contents of the collection. * Collecting.h, Collection.m: (-initWithContentsOf:) Added. This allows for certain efficiencies, like init'ing an Array with the needed capacity from the start. Sat Sep 25 12:20:18 1993 Andrew McCallum (mccallum@vein.cs.rochester.edu) * Collection.m, KeyedCollection, IndexedCollection.m: Extracted message -comparisonFunction from inside loops to improve efficiency. * Collecting.h, Collection.m: Removed the -shallowCopySelect..., etc methods and replaced them with -withElementsTrueBy..., etc methods. These shallowCopy methods make lots of sense in SmallTalk where garbage collection makes enumeration on temporary collections useful for iteration, but in ObjC I think methods with a little more flexibility would be more helpful. I also wanted to add more options to those {select,reject,collect} methods: 1) the option of deep or shallow copies, 2) the option of changing the class of the new copy. But if done in the old framework this would have exploded the number of methods. The new framework allows all the old functionality, plus the new options, plus the option to do something useful without creating a new collection. Tue Sep 21 11:52:46 1993 Andrew McCallum (mccallum@vein.cs.rochester.edu) * *.m: Added -emptyCopy based on -allocCopy. Subclasses override to take care of instance vars that must change. * Collecting.h, Collection.m: Changed -addCount:... to -addObjectsCount:... and -addElementsCount:... Mon Sep 20 17:05:10 1993 Andrew McCallum (mccallum@vein.cs.rochester.edu) * *.[hm]: Added code for archiving: -write:, writeInit:, writeContents:, -read:, readInit:, readContents:. I'm not sure this division of labor is the best. I'm open to suggestions for different implementations. * *.[hm]: Changed all instances of the word "description" to "encoding". Objective-C already uses @encode() for these things. We shouldn't introduce new vocabulary for refering to the same thing. * *.[hm]: Removed methods that allowed specification of comparison function independent of encoding. This will allow us to archive the comparison function by archiving the encoding. Most people will be able to get custom comparisons by overriding -compare:. If you really, really need some new weird comparisons for non-objects, you can still subclass the collection and override -comparisonFunction. If people think that we will want to want custom comparisons of non-objects *very often*, then we come up with another scheme that still allows meaningful archiving of comparison functions. Sun Sep 19 19:30:02 1993 Andrew McCallum (mccallum@swan.cs.rochester.edu) * coll/eltfuncs.[hm]: Created. Moved functions for manipulating elt's from CollectionPrivate.h to eltfuncs.h. This makes elt a little more separate from libcoll, so others can use it too. I changed the prefix on the names accordingly from coll_ to elt_. Also, added function for getting encoding from comparison function. Also, declared all elt_compare_ and elt_hash_ functions extern. Thu Sep 9 09:49:29 1993 Andrew McCallum (mccallum@vein.cs.rochester.edu) * LinkedListEltNode.[hm], BinaryTreeEltNode.[hm], RBTreeEltNode.[hm]: Created these files and moved EltNode code into them. This cleanly separates the basic LinkedList code from the EltNodeCollector stuff (and similarly for BinaryTree and RBTree). The EltNode stuff strikes me as being a little messy; with this separation we can easily replace it later with something cleaner (if we can think of something cleaner). * elt.h, *.m: Changed elt union names from *_t to *_u, following suggestion of Burchard: *_t should be reserved for type names. Tue Aug 31 11:40:29 1993 Andrew McCallum (mccallum@vein.cs.rochester.edu) * Storage.[hm], List.[hm]: Removed many extra features that aren't in the NeXT implementations. Our goal for these NeXT-based objects should be compatibility, not kitchen-sink features. Let people add features in Categories if they need them. * Storage.[hm]: Fixed return type for -removeLastElement to match NeXT. Unfortunately this conflicts with the IndexedCollecting declaration (NeXT's returns self, IndexedCollecting returns the removed element). I really think methods that remove elemements should return that element. We're just going to have to live with this conflict. * Storage.[hm]: Changed declaration of instance var 'dataPtr' from void** to void*, to match NeXT. * IndexedCollecting.h, IndexedCollection.m: Added -sortContents; Thu Aug 26 17:47:59 1993 Andrew McCallum (mccallum@vein.cs.rochester.edu) * List.m: Changed default order of -makeObjectsPerform... and fixed comment to match NeXTSTEP reality. Wed Jul 10 14:38:23 1993 Andrew McCallum (mccallum@vein.cs.rochester.edu) * BinaryTree.m, RBTree.m, EltNodeCollector.[hm]: Created. Wed Jun 2 11:48:08 1993 Andrew McCallum (mccallum@vein.cs.rochester.edu) * IndexedCollecting.h: Added - successorOfObject: anObject; - predecessorOfObject: anObject; - (elt) successorOfElement: (elt)anElement; - (elt) predecessorOfElement: (elt)anElement; * BinaryTree.h, RBTree.h: Created. Mon May 31 13:33:42 1993 Andrew McCallum (mccallum@vein.cs.rochester.edu) * Time.[hm]: Threw a Time object I wrote a while ago into the .tar file. Maybe someone will find it useful. * IndexedCollecting.h, IndexedCollection.m: Added methods: - (unsigned) indexOfFirstDifference: (id )aColl; - (unsigned) indexOfFirstIn: (id )aColl; - (unsigned) indexOfFirstNotIn: (id )aColl; They fit well with desired functionality for Strings, but may also be generally useful. * Created preliminary String class. It's very preliminary; I just want to see how it will fit with IndexedCollecting. * Overhauled instance variables in heirarchy. Removed all instance variables from abstract superclasses. This makes subclassing an abstract superclass a bit more of a pain, but it helps keep memory requirements down, especially for String, LinkList and all IndexedCollections. Sat May 29 11:27:01 1993 Andrew McCallum (mccallum@vein.cs.rochester.edu) * IndexedCollection.m: Made cast of void* to unsigned more portable. Fri May 28 17:00:14 1993 Andrew McCallum (mccallum@vein.cs.rochester.edu) * IndexedCollecting.h, IndexedCollection.m: Added -insertContentsOf:atIndex: modified from Kresten Krab Thorup. * Collecting.h, Collection.m: Added {Object,Element} to inject, detect, max and min methods. Wed May 26 12:20:21 1993 Andrew McCallum (mccallum@vein.cs.rochester.edu) * Overhauled error generation. Changed #define's so error generation is easier to change again later, if necessary. Error methods now have forwarding capability. See CollectionPrivate.h, Collection.m, IndexedCollectionPrivate.h, IndexedCollection.m. * *.m: Fixed many small bugs found with -Wall. * Created Heap object. * Collection.m: Fixed -includesSameContents. * Collecting.h, Collection.m: Added -isSubsetOf: as written by Kresten Krab Thorup. Removed -includesSubsetOf:. Tue May 25 14:14:33 1993 Andrew McCallum (mccallum@vein.cs.rochester.edu) * Removed ComparedCollecting protocol. Its only purpose was to allow the user to manage a comparison function---this was silly, though, because there already was a comparison function inherited from Collection! No need to have two of them. Now that there is a general interface for user-specified comparison functions, we don't need the ComparedCollecting methods. This is a big help because we no longer have the problem of trying to combine a ComparedCollection class and Array class with some ugly multiple inheritance issues. One disadvantage, however, is that it is slightly more complicated to specify a comparator that is a selector. * Overhauled comparison and hash functions. More changes than I want to describe in detail here... 1) Created temporary versions of hash.[hc] that do what I want, hopefully Kresten's new versions of hash.[hc] will do something like this. Created collhash.[hc]. 2) Added -init... methods that allow the users to specify their own comparison and hash functions instead of accepting the defaults. Mon May 24 10:46:21 1993 Andrew McCallum (mccallum@vein.cs.rochester.edu) * Collecting.h, Collection.m: Removed -initWith:,... and -initDescription:with:,... methods. I don't want to add ..with: version of all -init... methods. People can use addCount,... instead. * Created IdListLink.[hm]. Changed -linkClass in ListedList.m to return [IdListLink class] if LinkedList contains objects. * Collecting.h, elt.h: Moved definition of elt union to * List.m: -isEqual: now checks [List count] at beginning. * List.m: -empty no longer realloc()'s. (for compatibility with NeXT.) * List.[hm]: Added - makeObjectsPerform:(SEL)aSel reverseOrder:(BOOL)flag; - makeObjectsPerform:(SEL)aSel with:anObject reverseOrder:(BOOL)flag; and changed -makeObjectsPerform: and -makeObjectsPerform:with: to call them. This gives the option of compatibility with pre-NeXTSTEP 3.0 List's. Sat May 22 13:53:25 1993 Andrew McCallum (mccallum@vein.cs.rochester.edu) * Collection.m, Collecting.h: Changed type of initialArg from void* to elt in inject.. methods. Fri May 21 18:52:03 1993 Andrew McCallum (mccallum@vein.cs.rochester.edu) * First alpha release announced on gnu-objc@prep.ai.mit.edu Copyright @copyright{} 2005 Free Software Foundation Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. gnustep-base-1.29.0/ChangeLog.2000066400000000000000000023014241435650067400161320ustar00rootroot000000000000002004-12-30 Adam Fedor * Headers/Foundation/NSGeometry.h (NSContainsRect): Change behavior to match Cocoa (sides of rects CAN touch). 2004-12-26 Adam Fedor * Add support for systems that support unichar file paths (e.g. Windows). * Headers/Foundation/NSFileManager.h (-localFromOpenStepPath:, _openStepPathFromLocal:): New methods. (NSDirectoryEnumerator): Updated ivars. * Source/NSFileManager.m: Idem. (-changeCurrentDirectoryPath, changeFileAttributes:, currentDirectoryPath, etc): Update for Windows unichar paths. * Headers/Foundation/NSString.h: (-unicharString, -localFromOpenStepPath:, _openStepPathFromLocal:): New methods. * Source/NSString.m: Idem. * Source/GSFileHandle.m (-initForReadingAtPath:, -initForWritingAtPath, -initForUpdatingAtPath:): Update for Windows unichar paths. * Source/NSData.m (readContentsOfFile, -writeToFile:, initWithContentsOfMappedFile:): Idem. * Source/NSTask.m (NSConcreteWindowsTask): Update for Windows unichar paths. (Patch from Roland Schwingle ) 2004-12-28 Richard Frith-Macdonald * Tools/gdnc.m: Change name of dummy class to avoid Darwin linker problems. * Testing/nsundomanager.m: Trivial test added 2004-12-21 Adam Fedor * Source/NSTimeZone (NSInternalAbbrevDict): Remove class (+abbreviationDictionary): Implement from new one-to-one plist. * NStimeZones/NSTimeZone.tar: Added abbreviations.plist. Regenerated. * Testing/nstimezone.m: New tests. * Source/Additions/GNUmakefile: Remove duplicate Unicode.m. 2004-12-21 David Wetzel * Source/Additions/GNUmakefile: Added Additions_OBJC_FILES += Unicode.m on apple 2004-12-18 David Wetzel * Source/Additions/GSCategories.m ([NSMutableString -replaceString:withString:]): Rewrite to work again. [tmp replaceString:@"&" withString:@"&"]; Did NOT work. 2004-12-12 Adam Fedor * Changes so additions compiles on older Mac OS X 10.1.5 * Source/Additions/GCArray.m (-copyWithZone:): Use more standard array initialization method. (mutableCopyWithZone:, [GCMutableArray -copyWithZone:], [GCMutableArray -mutableCopyWithZone:]): Idem. * Source/Additions/GSCategories.m ([NSData -hexadecimalRepresentation]): Use identically functioning, but older, standard data initialization. * Source/Additions/GSCategories.m ([NSMutableString -replaceString:withString:]): Rewrite to use older, standard methods. * Tools/AGSHtml.m ([AGSHtml -outputNode:to:]): Use GNUstep addition method to replace string. * Tools/autogsdoc.m (main): Idem. (Patch from Markus Hitter). 2004-12-12 Adam Fedor * configure.ac: Avoid improper use of -fXXX-runtime. Add -x objective-c when testing Objective-C programs (Followup for bug #11188). 2004-12-09 Matt Rice * Source/NSUndoManager.m ([-forwardInvocation,-registerUndoWithTarget:selector:object:): Don't clear the redo stack if redoing. 2004-12-07 Adam Fedor * configure.ac: Test for objc forwarding by compiling a program. * config/config.forward.m: New file. (Fixes bug #11188). * Source/GSFormat.m (GSFormat): Assign wchar via var args from an int (Fixes bug #10950). * Testing/string.m: Tests for standardizing path. 2004-12-01 Richard Frith-Macdonald * Source/NSCalendarDate.m: Fix off-by-one bug resulting in printout for december being numeric with '%b' format. Reported by Ludovic 2004-11-30 Adam Fedor * Source/GSFileHandle.m (-setNonBlocking:): Set the isNonBlocking ivar on MingW. Fixes bug #10742. 2004-11-30 Matt Rice * Source/NSBundle.m (-principalClass): If the class specified in NSPrincipalClass key is not found return the first class found. * Headers/Foundation/NSBundle.h (-principalClass): Document the above. 2004-11-29 Adam Fedor * configure.ac: Check for libffi or callback/avcall libs (Patch from Matt Rice). Fixes bug #11134. 2004-11-25 Richard Frith-Macdonald * Tools/gdomap.c: make respond to --help as to -H * Source/NSConnection.m: ([_threadWillExit:]) change to be a class method rather then instance method. Implement removeal of runloop of exiting thread unconditionally from all threads... the code in [removeRunLoop:] is safely lock protected. Use GSRunLoopForThread() for performance throughout. 2004-11-24 15:08 Patrick McFarland * configure.ac: Change "doesn't" to "does not" in an error message to avoid autoconf/m4 quoting issues. * configure: Regenerate. 2004-11-23 David Wetzel * Headers/Additions/GNUstepBase/Unicode.h: added missing #include "GSObjCRuntime.h" 2004-11-23 Richard Frith-Macdonald * Source/NSProcessInfo.m: * Source/NSUserDefaults.m: Improve documentation of --GNU-Debug=... 2004-11-22 Richard Frith-Macdonald * Source/NSPropertyList.m: Initialise harmless uninitialised variable to avoid compiler warning in ([propertyListFromData:mutabilityOption:format:errorDescription:]) fixing bug report #11093 * Source/NSMessagePort.m: ifndef toi fix harmless compiler warning reported as bug #11092 * NSNotificationCenter.[hm]: Remove non-functional setImmutableInPost method to fix bug report #11080 2004-11-20 Richard Frith-Macdonald * Source/NSBundle.m: Fix to ensure that a main bundle exists. Fix to get -executablePath for the main bundle to return the path to the executable. * Tools/gdnc.m: In order to avoid problems on BSD when using the pth library to do threading, we need to fork, close descriptors, and then exec the program again, since closing descriptors messes up the threading library. 2004-11-19 Richard Frith-Macdonald * Tools/pl.m: Make code conform to gnu coding standards. * Source/NSRunLoop.m: ([runMode:beforeDate:]) add autorelease pool to retain old behavior where anything inside a runloop is automatically in the scope of an autorelease pool, and will not be leaked by autoreleasing. Fixes obscure problems with the last limitDateForMode changes. 2004-11-18 Gregory John Casamento * Tools/pl.m: Added a tool I wrote a while back which is an implementation of the pl command (as it is on Mac OS X and OPENSTEP). 2004-11-11 Adam Fedor * Headers/Foundation/NSBundle.h (builtInPlugInsPath): New method. * Source/NSBundle (builtInPlugInsPath): Imeplement (based on patch #3483). 2004-11-10 Richard Frith-Macdonald * Source/NSThread.m: Retain the notification center we use. * Source/NSNotificationCenter.m: Raise exception if anything tries to destroy the default center. 2004-11-04 Adrian Robert * Source/NSRunLoop.m (limitDateForMode:) Correction to housekeeper timer logic so event polling times out within reasonable time. Patch by Alexander Malmberg . 2004-11-04 Georg Fleischmann * Headers/Foundation/NSTimeZone.h, Source/NSTimeZone.m (+knownTimeZoneNames:): New method. 2004-11-03 Richard Frith-Macdonald * Source/NSThread.m: Revert change from september to fix memory leak ... Enrico says it broke some of his GSWorkspace code. Will have to find a better fix ... ensure we don't leak autorelease pools by repeatedly initalising thread autorelease variables. 2004-11-01 Richard Frith-Macdonald * Source/GSFormat.h: Moved around includes somewhat so that the order matches those in the autoconf test for HANDLE_LONG_LONG_MAX and we should therefore get LONG_LONG_MAX defined consistently. 2004-10-31 Richard Frith-Macdonald * Source/NSUserDefaults.m: ([setObject:forKey:]) when given a nil value to set, remove any existing object for the key. Fix for MacOS-X compatibility (bug #10743). * Source/Additions/GSXML.m: Tweaks for 64-bit processors where sizeof int is not sizeof void* Minor optimisaion ... improve hash values. 2004-10-29 Matt Rice * Source/Additions/GSObjCRuntime.m (GSObjCAllSubclassesOfClass, GSObjCDirectSubclassesOfClass): skip meta classes. 2004-10-28 Adam Fedor * Version 1.10.1 * Source/Makefile.postamble (Info-gnustep.plist): Add some compatibility keys. 2004-10-26 Adam Fedor * configure.ac: Standardize order of flags and libs Check for proper defs in tzfile.h. Add sub-configure options so they are listed in help. Add generic include/lib flags option. * config.mak.in: Add load flags variable * base.make.in: Idem. * SSL/configure.ac: Add generic include/lib flags option. * Version: Add numeric value for runtime versioning. * Souce/GNUmakeifle: Add resource set install * Source/Makefile.postamble (Info-gnustep.plist): New target. * Testing/nsbundle.m: Additional tests. * Source/NSTimeZone.m: Check for proper tzfile defs (Fixes #10724). 2004-10-24 Richard Frith-Macdonald * Source/NSDistributedNotificationCenter.m: Changed to explicitly use a socket port name server for network wide notifications. * Source/Additions/GSXML.m: Added ([-abortParser]) * Source/NSXMLParser.m: Use new abort method. 2004-10-21 Fred Kiefer * Source/NSPropertyList.m (GSBinaryPLParser objectAtIndex:): Changed integer handling to unsigned long long to support bigger numbers. 2004-10-20 Richard Frith-Macdonald * Headers/Foundation/Foundation.h: include NSXMLParser * Headers/Foundation/NSXMLParser.h: MacOS compatibility class * Source/DocMakefile: Add NSXMLParser * Source/GNUmakefile: Add NSXMLParser * Source/NSXMLParser.m: Wrap some GSXML functionality for compatibility. * Testing/GNUmakefile: Add nsxmlparser * Testing/nsxmlparser.m: Trivial/basic test for parser Committed the work I did back in May as there have been several expressions of interest. I haven't had time to do work on this and consider the code pre-alpha. Reaching full MacOS-X compatibility may require minor extension to GSXML. 2004-10-17 Matt Rice * Source/GSHTTPURLHandle.m: Don't expect a body where status is 204 or 304 2004-10-13 Adam Fedor * Source/NSBundle.m (_bundle_name_first_match): Remove path extension when comparing name (fixes #10611) 2004-10-13 Richard Frith-Macdonald * Source/Additions/GSXML.m: Fix bug escaping XML special chartacters. 2004-10-11 Richard Frith-Macdonald * Tools/defaults.m: fix for domains and default names contaning spaces. 2004-10-10 Adam Fedor * configure.ac: Check for tzfile.h * Source/NSTimeZone.m: Include system tzfile.h if found. (abbreviationMap): Add abbreviation from systemTimeZone if not already there. (systemTimeZone): Update the search list to look for time zone in TZ, then system location, then tznam. (getTimeZoneFile:): Look for file in system directory first. * Source/nstzfile.h: Renamed from tzfile.h 2004-10-09 Fred Kiefer * Source/NSPropertyList.m: Corrected implementation of class GSBinaryPLParser to support more features of binary property lists. Based on information by Gerriet M. Denkmann . * Source/NSAttributedString.m (-initWithCoder:): * Source/NSNumberFormatter.m (-initWithCoder:): Implemented keyed decoding. 2004-10-05 Adam Fedor * Source/Makefile.postamble (libgnustep-base.def): Search for both T and R symbols to work with multiple mingw/cygwin flavors. 2004-10-05 Richard Frith-Macdonald * Source/Additions/GSGategories.m: make whitespace test safe for unicode characters. 2004-10-04 Richard Frith-Macdonald * Source/GSHTTPURLHandle.m: Fix premature end of read where no content length is specified. 2004-10-03 Richard Frith-Macdonald * Source/Additions/GSXML.m: Add methods for converting XML escape sequences in NSStrings. * NSTimeZones/NSTimeZones.tar: updated 2004-10-02 Richard Frith-Macdonald * Headers/Additions/GNUstepBase/unicode/gsm0338.h: Add mapping for lossy conversion of right-single0quotation-mark to apostrophe. 2004-10-01 Adam Fedor * Documentation/HtmlNav/docs-web.html, Documentation/HtmlNav/index.html: Update pointers. * Source/DocMakefile (before-clean, after-clean): Move obj out of the way so it isn't removed when cleaning docs. * Tools/DocMakefile: Idem. 2004-09-29 Richard Frith-Macdonald * Source/NSNotificationCenter.m: ([_postAndRelease:]) lock table while emptying array of observers to prevent another thread from changing things at the same time. 2004-09-27 23:26 Alexander Malmberg * Source/NSDistantObject.m: Make proxyLocation an enum tag, not a variable. * Source/NSFileManager.m (custom_strdup, append_file_to_path): Make static. * Source/NSString.m (-isEqual:): Clarify documentation. * Source/NSUnarchiver.m (mapClassObject, mapClassName): Make static. * Source/Additions/Unicode.m (GetDefEncoding): Add missing void in the prototype. * Tools/make_strings/make_strings.m (ParseFile): Remove spurious static on the nested function add_arg_ch. 2004-09-27 15:51 Alexander Malmberg * configure.ac: Change SO_REUSADDR to SO_REUSEADDR in the checking message. Reported by Alex Perez. * configure: Regenerate. 2004-09-27 Richard Frith-Macdonald * Source/NSDebug.m: Remove checks for existence of lock ... it always exists, so the checks are useless. * Source/NSThread.m: Refrain from creating thread dictionary in an inactive thread ... we don't want to create new objects in a thread which is in the process of exiting. Also, improve documentation. 2004-09-24 Richard Frith-Macdonald * Source/GSArray.m: Make perform methods enumerate forwards. * Source/Additions/GSXML.m: ([nodeAtIndex:]) fix memory leak. * Source/GSHTTPURLHandle.m: Re-instate change to try to provide better support for connections kept alive. 2004-09-22 Richard Frith-Macdonald * Source/NSHost.m: Use isEqualToString rather than == to test for the special local host name. Fix check for nil hostname in ([_initWithHostEntry:key:]) 2004-09-21 Richard Frith-Macdonald * Source/NSConnection.m: ([_getReplyRmc:]) improve timeout code. 2004-09-20 Richard Frith-Macdonald * Source/NSProxy.m: minor hash optimisation 2004-09-19 Adrian Robert * Headers/Foundation/NSCoder.h * Headers/Foundation/NSFileHandle.h * Headers/Foundation/NSKeyValueCoding.h * Headers/Foundation/NSObject.h * Headers/Foundation/NSSet.h * Source/NSKeyValueCoding.m * Source/NSSet.m: Comment cleanups to improve documentation output and cross-referencing. * Documentation/manual/GSDoc.texi: Add more complete description of cross-referencing. 2004-09-19 Adrian Robert * Headers/Foundation/NSBundle.h * Headers/Foundation/NSConnection.h * Headers/Foundation/NSDistributedNotificationCenter.h * Headers/Foundation/NSPort.h * Headers/Foundation/NSTask.h * Headers/Foundation/NSThread.h * Headers/Foundation/NSURL.h * Headers/Foundation/NSUndoManager.h * Source/NSDistributedNotificationCenter.m * Source/NSTask.m * Source/NSURL.m * Source/NSUndoManager.m * Source/externs.m: Declare constant strings as constant, and move values from source files into externs.m . 2004-09-19 Adrian Robert * Tools/AGSOutput.h (informalProtocols): New array to accumulate informal protocols discovered during processing. * Tools/AGSOutput.h (outputUnit:to:): Accumulate informal protocols found here. * Tools/AGSIndex.h (addInformalProtocols:): New method to copy informal protocol refs. * Tools/AGSIndex.m (addInformalProtocols:): New method. (unitRef:type:unit:): Return unit including category for category methods. * Tools/AGSHtml.h: Add declaration of existing outputIndex.. method. * Tools/AGSHtml.m (makeLink:ofType:inUnit:isRef:) (outputIndex:scope:title:style:target:to:): Make proper references for informal protocols. * Tools/autogsdoc.m: Send informal protocols found by AGSOutput to AGSIndex. 2004-09-16 Richard Frith-Macdonald * Source/NSArray.m: Make objects perform selector in same order as MacOS-X 2004-09-16 David Ayers * Headers/Additions/GNUstepBase/GSObjCRuntime.h: Define encoding macros for the NeXT runtime. * Source/Additions/GSObjCRuntime.m (GSAppendMethodToList): Copy type information. (GSRemoveMethodFromList): Add comment about potential minor leak. 2004-09-14 Richard Frith-Macdonald * Source/NSDateFormatter.m: * Source/NSNumberFormatter.m: Tolerate being given null pointers to return values in. * Tools/gdomap.c: Try both short and long forms of local host name. Report host name used when gethostbyname() fails. 2004-09-13 Adrian Robert * Tools/gsdoc-1_0_1.rnc: Added usage information. * Tools/GNUMakefile: Install it. * Tools/gdomap.8: Refer user to HTML documentation for more info. * Tools/autogsdoc.m: Be willing to parse .c files. * Tools/autogsdoc.1: Document that. * Tools/gdomap.c: Add comment to main so autogsdoc picks up as tool. * Tools/gdomap/gsdoc: New file - docs for gsdoc are actually here, taken from gdomap.h (not readily usable there by gsdoc). * Tools/DocMakefile: Include gdomap in docbuild. * Tools/BaseTools.gsdoc: Add gdomap to main TOC. 2004-09-10 David Ayers * Source/NSArray.m: Consistently terminate macros with semicolons. (arrayByAddingObjectsFromArray) (removeObjectsFromIndices:numIndices:): Insure all declarations precede statements. * Source/NSDictionary.m: Consistently terminate macros with semicolons. * Source/NSSet.m (initWithCoder:): Insure all declarations precede statements. 2004-09-09 Richard Frith-Macdonald * Source/GSString.m: Implement init for GSPlaceHolderString to return an empty inline unicode string. 2004-09-07 Adam Fedor * Documentation/HtmlNav/docs-web.html: Update to work with current web structure. 2004-09-07 Richard Frith-Macdonald * Source/NSSet.m: Fix possible stack overflows. * Source/GSSet.m: ([allObjects]) Fix stack overflow for large sets. * Source/NSTask.m: Fix error testing for task which has been lost. * Source/NSArray.m: Fix possible stack overflows * Source/NSTimer.m: Log uncaught exceptions when timer fires. Thanks to Andre Levey for reporting these. 2004-09-07 Richard Frith-Macdonald * Source/NSArray.m: * Source/NSDictionary.m: * Source/NSSet.m: * Source/NSString.m: Changes to designated initiailiser stuff for MacOS-X compatibility. Call -init to maintain the chain from subclasses to superclasses, but document the 'designated initialisers' as being the richer methods which may be used in GNUstep to make all the other initialisers work. 2004-09-04 Adam Fedor * Version 1.10.0 * Source/GNUmakefile: Define INTERFACE_VERSON explicitly. 2004-09-02 David Ayers * Headers/Additions/GNUstepBase/GSObjCRuntime.h (GS_ATTRIB_DEPRECATED): New macro to use for deprecation attribute which can be deactivated for older compilers. 2004-09-03 19:08 Alexander Malmberg * Tools/gdnc.m (-addObserver:selector:name:object:suspensionBehavior:for:): Fix string reuse. (-postNotificationName:object:userInfo:deliverImmediately:for:): Make sure queued notifications are always released. Don't release obs. 2004-09-02 David Ayers * Source/GSFFCallInvocation.m * Source/GSFFIInvocation.m (gs_protocol_selector): Skip '-' for negative offsets to avoid issues with pre gcc 3.4 generated signatures. 2004-08-26 Adam Fedor * Source/NSProcessInfo.m ([NSProcessInfo +load]): Get environment variables via environ even #ifdef HAVE_KVM (fix/based on #10113). 2004-08-26 Richard Frith-Macdonald * Headers/Foundation/NSURLHandle.h: * Source/GSHTTPURLHandle.m: * Source/NSURLHandle.m: Fix property key names * Source/NSString.m: copy and autorelease potentially mutable strings before returning them. * Headers/Foundation/NSString.h: Document policy and warnings about lifetime and mutablity of strings returned from methods. 2004-08-25 Adrian Robert * Documentation/HtmlNav/index.html: * Documentation/HtmlNav/style.css: * Documentation/HtmlNav/gnustep-header.png: * Documentation/HtmlNav/gnustep-header14.jpg: * Documentation/HtmlNav/masthead-bg.jpg: Changed local HTML docs overview page to use same graphics as web site and a subset of its stylesheet. * Documentation/Makefile.postamble: Changed install accordingly. * Documentation/HtmlNav/docs-web.html: Added this file to be used as overview page for HTML docs when presented on gnustep.org web site. * Headers/Foundation/NSMethodSignature.h: Fixed unclosed tag typo in comment that was stopping docs from being generated. 2004-08-25 Richard Frith-Macdonald * Source/Additions/GSMime.m: Accept iso-10646-ucs-2 2004-08-25 Fred Kiefer * Tools/make_strings/GNUmakefile: Include config.mak to be consistent with the other base makefiles. Without this cross compliation failed for this subproject. 2004-08-24 David Ayers * Source/NSScanner.m: Define _GNU_SOURCE before including other headers. 2004-08-24 Richard Frith-Macdonald * Source/NSPropertyList.m: Always write date using GMT timezone for consistency. Make XML representation MacOS-X compatible. * Source/NSIndexSet.m: ([getIndexes:maxCount:inIndexRange:]) accept null pointer for index range. Consistent with undocumented MacOS-X feature (but we document it). * Headers/Additions/GNUstepBase/DistributedObjects.h: * Source/NSConnection.m: * Source/NSMessagePort.m: * Source/NSSocketPort.m: Use new ([-conversation:]) method to obtain handle for specific network link in use by a connection, and invalidate it when the connection is iunvaliodated. Fixes bug #9798 * Headers/Foundation/NSURLHandle.h: * Source/GSHTTPURLHandle.m: * Source/NSURLHandle.m: Add new property keys for setting certificate information for https. Stopgap until we can clone newer MacOS-X features. Add support for persistent connections for better performance when posting repeatedly to the same server. 2004-08-23 Richard Frith-Macdonald * Source/Additions/GSMime.m: Add content location methods. 2004-08-22 Richard Frith-Macdonald * Source/NSString.m: Various minor optimisations ... uppercaseString and lowercaseString no longer create a new object if no change is needed. Avoid unnecessary calls by using method variants with range arguments if we already know the length of the string. 2004-08-20 Richard Frith-Macdonald * Tools/AGSParser.m: Destory comments after skipping units ... we don't want them included as part of the documentation of the next thing after the unit. Recognize __attribute__((deprecated)) and add a comment. Fix scope of instance variables ... protected by default. 2004-08-20 David Ayers * Headers/Foundation/NSMethodSignature.h: (NSArgumentInfo): Document limitations of NSArgumentInfo's offset and registier information. Match size for NO_GNUSTEP. (NSMethodSignature): Match ivar name with runtime information. * Source/GSFFCallInvocation.m * Source/GSFFIInvocation.m * Source/NSInvocation.m (gs_method_for_receiver_and_selector) ([-invokeWithTarget:]): Use GSGetMethod instead of deprecated GSGetInstanceMethod and GSGetClassMethod. * Source/NSConnection.m ([-_service_typeForSelector]): Ditto. * Source/NSDistantObject.m ([+respondsToSelector]): Ditto. * Source/NSObject.m ([+instanceMethodSignatureForSelector:]) ([-methodSignatureForSelector:]) ([+descriptionForInstanceMethod], [-descriptionForMethod]): Ditto. * Source/NSProtocolChecker.m ([-methodSignatureForSelector]): Ditto. * Source/NSProxy.m ([+methodSignatureForSelector]) ([-methodSignatureForSelector]): Ditto. * Headers/Additions/GNUstepBase/GSObjCRuntime.h (GSFindInstanceVariable, GSGetVariable, GSSetVariable) (GSGetValue, GSSetValue, GSObjCName, GSObjCSelectorName) (GSObjCSelectorTypes, GSGetInstanceMethod, GSGetClassMethod) (GSGetInstanceMethodNotInherited, GSGetClassMethodNotInherited): Add deprecation markers. * Source/Additions/GSObjCRuntime.m (GSSelectorTypesMatch): Ignore structure names. * Testing/nsmethodsignature.m: Added test for nested structures. Reactivated test for signatures from older gcc versions. 2004-08-19 David Ayers * Headers/Additions/GNUstepBase/GSObjCRuntime.h * Source/Additions/GSObjCRuntime.m (GSSelectorTypesMatch): New Function. (gs_skip_type_qualifier_and_layout_info): Ditto. * Source/callframe.m (callframe_do_call): Use GSSelectorTypesMatch instead of sel_types_match. * Source/cifframe.m (cifframe_do_call): Ditto. * Source/mframe.m (mframe_do_call): Ditto. * Source/GSFFCallInvocation.m (GSInvocationCallback): Use NSDebugFLog to NSWarnFLog. * Source/GSFFIInvocation.m (GSFFIInvocationCallback): Ditto. * Testing/nsmethodsignature.m: Use GSSelectorTypesMatch instead of sel_types_match. Test it. 2004-08-18 David Ayers * Testing/nsmethodsignature.m: Add more testing utilities. 2004-08-18 Richard Frith-Macdonald * Source/NSFileHandle.m: Add methods to get local socket info matching mthe existing methods which return remote address/port. * Source/GSFileHandle.m: ditto. 2004-08-17 David Ayers * Testing/GNUmakefile: Reactivate nsinvocation test. * Testing/nsmethodsignature.m (large/smallStruct_id:uchar:ushort:uint...): Correct name. (void_float:double:): New test. (void_double:float:): New test. 2004-08-17 Richard Frith-Macdonald * Source/NSPort.m, Source/NSPortNameServer.m: Fix port type selection for windows. 2004-08-11 Richard Frith-Macdonald * Source/NSPropertyList.m: don't escape single quotes unnecessarily. * Source/NSObject.m: (hash) tweak performance a little. 2004-08-07 Richard Frith-Macdonald * Source/NSPort.m (+initialize), Source/NSPortNameServer.m (systemDefaultPortNameServer): We should be using message ports when we are supposed to be MacOS-X compatible anyway, so check the runtime compatibility setting. Maybe we should be thinking about changing away from the OpenStep behavior as default, and put a warning into the next release? 2004-08-07 02:26 Alexander Malmberg * Source/NSPort.m (+initialize), Source/NSPortNameServer.m (systemDefaultPortNameServer): Check the NSPortIsMessagePort to get the default port class. * Tools/gdnc.m (-init): Comment on some dead code. 2004-05-30 Richard Frith-Macdonald * Source/GSMime.m: When using non-ascii default characterset ensure that the content type header has the appropriate charset parameter added during parsing, so unparsing will work correctly. 2004-08-05 01:59 Alexander Malmberg * Source/NSDistantObject.m (DO_FORWARD_INVOCATION): Warning if we can't do the forwarding. (-methodSignatureForSelector:): If a protocol has been set but doesn't contain info about the selector, forward the request to the other end of the connection. 2004-08-04 David Ayers * Testing/nsmethodsignature.m: New test. * Testing/GNUmakefile: Add new test. 2004-08-02 Adrian Robert * Headers/Foundation/*.h: Some fixes and cleanups to 2004-07-20 documentation changes recommended by Alexander Malmberg. * Tools/AGSHtml.m: Change default doc font to 'serif': it's simple and provides end viewers greater latitude for using their own preferred font. 2004-07-30 23:33 Alexander Malmberg * Source/NSPropertyList.m (parseQuotedString): Handle utf8 data properly. (GSPropertyListFromStringsFormat): Convert the string to utf8 data, not ascii. Set length from the data. (+propertyListFromData:mutabilityOption:format:errorDescription:): Fix a typo in an error message. Set format for normal plist with extensions to NSPropertyListGNUstepFormat. * Source/NSString.m (-propertyList): Convert the string to utf8 data, not ascii. 2004-07-20 Adrian Robert * Headers/Foundation/*.h: Completed documentation of functions, types, constants, and variables. * Source/*.m: Same. * Tools/gsdoc-1_0_1.rnc: New file. Relax-NG version of the GSdoc DTD. This can be used in conjunction with Emacs nxml-mode to edit GSdoc XML source with realtime validation and schema-guided completion. 2004-07-29 Matt Rice David Ayers * Headers/Additions/GNUstepBase/GSObjCRuntime.h * Source/Additions/GSObjCRuntime.m: Make ObjC++ safe. (GSObjCSuper, GSObjCIsKindOf, GSNameFromClass) (GSTypesFromSelector, GSGetMethod, GSFlushMethodCacheForClass) (GSCGetInstanceVariableDefinition) (GSObjCGetInstanceVariableDefinition) (GSMethodListForSelector, GSAddMethodList, GSRemoveMethodList) (GSObjCVersion, GSObjCName, GSObjCSelectorName) (GSObjCSelectorTypes, GSGetInstanceMethod, GSGetClassMethod) (GSGetInstanceMethodNotInherited, GSGetClassMethodNotInherited) (search_for_method_in_class, GSObjCAddMethods): Replace class and this with cls or sel. 2004-07-29 Richard Frith-Macdonald * Source/NSAutoreleasePool.m: ([emptyPool]) reset _released ivar suggested by Cristobal Castillo 2004-07-28 Willem Rein Oudshoorn * Source/GSFileHandle.m ([GSFileHandle -gcFinalize]): if __MINGW__ also close ordinary file descriptor, not only the socket. ([GSFileHandle -closeFile]): in __MINGW__ defined block: changed test of !isStandardFile to isSocket, and make sure that the ordinary file descriptor is also closed. 2004-07-22 Richard Frith-Macdonald * Source/NSPropertyList.m: don't escape tab,cr,lf in output of old style property lists. 2004-07-21 David Ayers * Source/Additions/GSObjCRuntime.m (gs_revert_selector_names_in_list): New function. (GSRemoveMethodList): Also revert selectors for first list. 2004-07-20 Adrian Robert * Tools/autogsdoc.m: Add 'Protocols' index to upper left index panel in HTML frames docs. 2004-07-15 Mateu Batle * Source/GSLocale.m: Patch to use locale when no langinfo available 2004-07-15 Richard Frith-Macdonald * NSTimeZones/NSTimeZones.tar: regenerated 2004-07-14 Adam Fedor * configure.ac: Use generic -with-ffi-{include,library} for finding ffi libraries. 2004-07-13 Andrew Ruder * Source/NSMessagePort.m, Source/NSSocketPort.m: Use memmove instead of memcpy for potentially overlapping moves. 2004-07-10 Richard Frith-Macdonald * Tools/cvtenc.m: Use uppercase 'U' rather than 'u' in unicode escape sequences. 2004-07-09 Adam Fedor * Source/NSFileManager.m ([GSAttrDictionary -fileGroupOwnerAccountName]): Remove Solaris warning - no longer necessary. 2004-07-06 Richard Frith-Macdonald * Tools/AGSHtml.h: Fix printf missing argument bug. 2004-07-05 Richard Frith-Macdonald * Source/Additions/Unicode.m: GSToUnicode() be strict about converting ASCII to unicode. (GetDefEncoding): Don't override default (latin1) encoding to be ascii if we only have the return value of nl_langinfo() to go on. 2004-07-04 Richard Frith-Macdonald * Source/NSString.m: Added two new methods from MacOS-X ([stringByAddingPercentEscapesUsingEncoding:]) and ([stringByReplacingPercentEscapesUsingEncoding:]) 2004-07-03 Richard Frith-Macdonald * Tools/plmerge.m: Portability ... was attempting to set values in a dictionary which may not be mutable. * Source/NSString.m: ([propertyList]) make decoded containers mutable for compatibility with current MacOS-X * Source/NSPropertlyList.m: Fix error generating unicode escapes. 2004-07-02 Richard Frith-Macdonald * Source/NSHost.m: Use UTF8String rather than cString throughout as cString is deprecated. * Source/NSPropertyList.m: Output property list unicode escapes as \U rather than \u for MacOS-X compatibility. Fix a few bugs in old style plists. * Source/GSCompatibility.m: Remove plist stuff which duplicated code in NSPropertyList.m, so we only have one version to worry about. * Source/NSString.m ditto. 2004-07-02 David Ayers * Headers/Foundation/NSMethodSignature.h * Source/NSMethodSignature.m * Source/GSFFCallInvocation.m * Source/GSFFIInvocation.m: Revert last mframe patch. 2004-07-02 Fred Kiefer * Source/NSTimeZone.m: Define structure ttinfo as packed to get it aligned correctly on ARM. Patch from bug report #9452. 2004-07-01 David Ayers * Headers/Foundation/NSMethodSignature.h (_internalMethodTypes): New instance variable. * Source/NSMethodSignature.m: ([+signatureWithObjCTypes]): Store the runtime signature separately from the mframe signature. Document. ([-dealloc]): Free new instance variable. ([-methodInfo]): Use _internalMethodTypes to build argument information. * Source/GSFFCallInvocation.m (GSInvocationCallback) * Source/GSFFIInvocation.m (GSInvocationCallback): Use the selector registered in the runtime for the receiver instead of the constructed selector from the stack to avoid mismatches in the runtime. 2004-06-29 Richard Frith-Macdonald * Source/NSUserDefaults.m: Added MacOS-X compatibility methods .. ([addSuiteNamed:]) and ([removeSuiteNamed:]) 2004-06-27 Richard Frith-Macdonald * Tools/plparse.m: Check for and report illegal (non-ascii) characters in property list. A property list should use \UXXXX escape sequences for non-ascii data. 2004-06-26 17:12 Alexander Malmberg * Source/NSUserDefaults.m (read_only): Remove. 2004-06-25 Richard Frith-Macdonald * Source/NSIndexSet.m: Rewrite range removal to fix bug reported by Fred Kiefer. Add optional sanity check for debugging * Testing/nsindexset.m: Add test for deletion of range which has partial overlap with two others. 2004-06-24 Richard Frith-Macdonald * Source/NSIndexSet.m: Remove some redundant code for clarity. ([containsIndexes:]) implemented. * Source/NSUser.m: NSSearchPathForDirectoriesInDomains() fix for user domain developer directory. * Source/Additions/GSXML.m: SAX2 fixes ... get element attributes from libxml2 properly. Make SAX2 element start/end methods call old methods for compatibility. Tidy somewhat, re-enable SAX2 support. 2004-06-22 Adrian Robert * Tools/AGSHtml.m: Change default font for HTML main content to "palatino linotype,times,serif" (now provides backups). * Tools/AGSOutput.m: Improve GSdoc comments. * Tools/AGSParser.m: Add GSdoc comments. * Tools/autogsdoc.m: Change instanceVarsAtEnd option to default to YES as stated in the documentation. * Tools/gsdoc.gsdoc: Small wording changes. * Tools/gdnc.m: Fix typo in GSdoc comments. 2004-06-22 Adrian Robert * Headers/Additions/GNUstepBase/GSObjCRuntime.h: Fix typos in GSdoc that were causing errors when autogsdoc is run. * Headers/Foundation/*.h * Source/*.m * Source/Additions/GSCategories.m * Source/Additions/Unicode.m: Add GSdoc comments to many files. When a class had no documentation at all, or existing documentation was in the header file, comments were added in the header file. When a class had all or most of its documentation in the source file, comments were added there. (Maybe a policy should be decided for this at some point?) * Source/DocMakefile: Add "NSIndexSet.h" to list to generate GSdoc for. 2004-06-22 Adrian Robert * Documentation/HtmlNav: Add top-level documentation HTML page, that goes in System/Library/Documentation. * Documentation/Makefile.postamble: Install this. * Documentation/Base.gsdoc * Documentation/BaseAdditions.gsdoc * Documentation/General/OpenStepCompliance.gsdoc * Documentation/General/Debugging.gsdoc: Use 1.0.1 DTD; also, minor updates/improvements. * Documentation/manual/*.texi: Major manual update to fill in missing portions. Still more to do, but the basics are complete now. In near term, need a class cluster example (maybe in appendix), and need to write the Java-Guile appendix (maybe this needs to cover StepTalk). * Documentation/manual/GNUmakefile: Update for above (some texi files added/removed). 2004-06-21 Richard Frith-Macdonald * Source/NSCalendarDate.m: ([descriptionWithCalendarFormat:locale:]) Rewritten to support unicode and also to support some extra format specifiers like '%r' which might be used in native O/S locale strings but which are not part of OpenStep/Cocoa. 2004-06-21 Fred Kiefer * Source/NSIndexSet.m: (-indexGreaterThanOrEqualToIndex, -indexGreaterThanIndex:) removed incorrect special case handling. 2004-06-20 Richard Frith-Macdonald * Source/NSUserDefaults.m: ([initForUser:]) carry on and initialise an instance even if the users defaults directory doesn't exist and can't be created. Created instance is read only and a warning is issued. 2004-06-18 Adam Fedor * Tools/gdomap.c (xgethostname): Add missing colon (patch from Tom Koelman). * Tools/Makefile.postamble: Fix missing space. * Souce/Makefile.postamble (before-uninstall): Change from after-uninstall. 2004-06-18 Manuel Guesdon * Source/NSKeyValueCoding.m: fix exception userInfo 2004-06-16 Willem Rein Oudshoorn * Tools/gdomap.c (map_add): Fix off by one bug that causes random crashes in gdomap. 2004-06-14 Adam Fedor * configure.ac: Fix kvm test. Define HAVE_KVM_ENV * Headers/Additions/GNUstepBase/config.h.in, configure: Regenerate * Source/NSProcessInfo: Use it. * Makefile.postamble (after-uninstall): Remove base.make * Source/CompatibilityHeaders.make (before-uninstall): Remove headers * Tools/Makefile.postamble (before-uninstall): Remove dtds, man files. 2004-06-14 Richard Frith-Macdonald * Source/NSDictionary.m: MacOS-X compatibility fix for keyed encoding of empty dictionary. 2004-06-10 Adam Fedor * Version 1.9.2 * Documentation/ReleaseNotes.gsdoc: New file * Documentation/GNUmakefile: Make and install it. * Source/NSRunLoop.m: If _POLL_EMUL_H is defined, use select instead of poll (e.g. Mac OS X). 2004-06-08 David Ayers * Headers/Additions/GNUstepBase/GSObjCRuntime.h * Source/Additions/GSObjCRuntime.m (GSGetInstanceMethod, GSGetClassMethod) (GSGetInstanceMethodNotInherited, GSGetClassMethodNotInherited): Deprecate. (GSGetMethod): New function. 2004-06-06 David Ayers * Source/Additions/GSObjCRuntime.m (GSObjCMethodNames): Unify implementation for both runtimes. (GSGetClassMethodNotInherited): Fix typo. (GSObjCAddClassBehavior): Add call to GSFlushMethodCacheForClass after adding behavior. (BDBGPrintf): Add space before last comma in macro older compilers. 2004-06-05 David Ayers * Headers/Additions/GNUstepBase/GSObjCRuntime.h * Source/Additions/GSObjCRuntime.m (GSMethodList): Define new type. (GSAllocMethodList, GSAppendMethodToList, GSRemoveMethodFromList) (GSMethodListForSelector, GSMethodFromList) (GSAddMethodList, GSRemoveMethodList): New functions. (GSObjCMethodNames, search_for_method_in_class, GSObjCAddMethods) (search_for_method_in_class, GSObjCAddClassBehavior): Use GSMethod and GSMethodList types instead of pointers to runtime structures. * Testing/GNUmakefile * Testing/gsbehavior.m: New tests. 2004-06-05 Richard Frith-Macdonald * Source/GSDictionary.m: Make exceptions a little more informative. * Source/NSString.m: initWithFormat... externalise result of GSFormat so it works when the default character encoding is not the same as the internal 8-bit encoding. * Source/GSString.m: New function to externalize a string. implementations of init with format for concrete classes. 2004-06-04 David Ayers * Source/Additions/GSObjCRuntime.m (BDBGPrintf) New macro. (GSObjCAddClassBehavior, GSObjCAddMethods): Use new macro. (OBJC_VERSION): Move define to where it is needed. (Runtime documenation references): Update links. * Source/GSSet.m (-[GSMutableSet unionSet:]): Remove redundant test. 2004-06-03 Adam Fedor * Source/cifframe.h: Move ffi.h include to fix compile problem on MinGW (Fixes #8267). 2004-06-03 Richard Frith-Macdonald * Source/NSZone.m: Fixed error in malloc of non-freeable zones (bug #9199) was failing to update top of block after allocation. 2004-06-02 Richard Frith-Macdonald * Source/NSUnarchiver.m: Decode class names directly so we can substitute one class name for another. Letting NSData decode classes only supported substitution if both the old and new classes existed in the executable, which is not what was intended. Thanks to Ludovic Marcotte for spotting this bug. * Source/GSHTTPURLHandle.m: Improve debug logging and add support for controlling http version in outgoing request. 2004-05-30 Richard Frith-Macdonald * Source/GSMime.m: Add support for setting default characterset for text elements ... needed for parsing multipart/form-data where the charset is not set in individual parts of the form. * Source/GSXML.h: tempoorarily disable sax2 support ... seem it doesn't work reliably. 2004-05-28 Adam Fedor * configure.ac: Check for kvm access and use it if available. * config/config.kvmopen.c: New file. * Documentation/Base.gsdoc: Fix broken link. * Documentation/coding-standards.texi: Add section. * Documentation/General/GNUmakefile: Include config.mak * Documentation/Tools/GNUmakefile: Idem. * Source/DocMakefile: Make documentation with frames. 2004-05-26 Richard Frith-Macdonald * Source/GSMime.m: When extraneous data is encountered in the input, ignore it (and log a warning) rather than adding it to the message body. Not sure this is right ... perhaps should raise an exception or extend the api toi return the extra data. Anyway, it's better than the previous behavior of adding the bad data to the parsed body. * configure.ac: Set some variables for presnece of stdint.h * Headers/Foundation/NSCoder.h: Remove defines of types in stdint.h * Headers/Additions/GNUstepBase/GSConfig.h.in: either include stdint.h or define alternatives for types used in new MacOS-X coding methods. 2004-05-25 Richard Frith-Macdonald * Source/NSIndexSet.m: ([addIndexesInRange:]) fix bug finding insertion point for new range. ([description]) check for uninitialised instance. 2004-05-24 Richard Frith-Macdonald * Source/NSDate.m: Implement -hash for abstract class and for the concrete subclasses as suggested by Marcus Muller. * Headers/Foundation/NSDebug.h: Add GSOnceFLog() and GSOnceMLog() to log messages the first time the code is executed ... typical usage is to log warnings about deprecated features. 2004-05-21 Adam Fedor * Tools/gdomap.c (xgethostnames): New function (nameServer, donames): Use it. (based on a patch from Matt Rice ). 2004-05-21 Roland Schwingel * Source/NSTimeZone.m: Fix errors in handling of windows registry. 2004-05-18 Richard Frith-Macdonald * configure.ac: Check for SAX2 * Headers/Additions/GNUstepBase/GSXML.h: Add SAX2 methods * Headers/Additions/GNUstepBase/config.h.in: Add SAX2 header * Source/Additions/GSXML.m: Add SAX2 methods and remove use of deprecated functionality if recent (SAX2) API is available to use instead. 2004-05-17 Richard Frith-Macdonald * Source/NSMessagePort.m: * Source/NSMessagePortNameServer.m: Fix based on emailed patch by Roland Schwingel ... ensure we have a thread registered in atexit functions. 2004-05-17 Richard Frith-Macdonald * Headers/Foundation/Foundation.h: Add NSError.h * Headers/Foundation/NSError.h: New MacOS-X compatibility header * Source/DocMakefile: Add NSError * Source/GNUmakefile: Add NSError * Source/NSError.m: new MacOS-X compatibility class. 2004-05-16 Richard Frith-Macdonald * Source/Additions/GSXML.m: Corrected value for cdata in sax-like interface to be an NSData rather than an NSString. * Headers/Additions/GNUstepBase/GSXML.h: ditto 2004-05-14 Richard Frith-Macdonald * Tools/autogsdoc.m: Create output directories if necessary. * Headers/Foundation/NSAutoreleasePool.h: Rationalised a little Moved documentation from source code. * Source/NSAutoreleasePool.m: Rationalised a little Moved documentation to headers. 2004-05-14 Richard Frith-Macdonald * Source/GSFormat.h: * Source/GSFormat.m: * Source/GSPrivate.h: * Source/GSString.m: * Source/GSeq.h: * Source/NSString.m: Updates to allow GSFormat to write directly into an existing string in either 16bit or 8bit format. Also tidyups and modifications to use temporary buffers on stack rather than malloc/free as long as the buffers are reasonably sized. * Testing/benchmark.m: Trivial string format benchmarks ... Performance improvement of 10% for initWithFormat and 90% for appendFormat operations. 2004-05-13 Richard Frith-Macdonald * Source/NSCalendarDate.m: ([initWithString:calendarFormat:locale:]) Corrected to return nil when description does not match format. Also change NSLog to NSDebugMLog for reporting problems, and added a couple of logs. Also changed to accept nil/empty string values for format and description as MacOS-X does. Also changed default year to be current year for compatibility. 2004-05-12 Richard Frith-Macdonald * Source/NSURL.m: ([-loadResourceDataNotifyingClient:usingCache:]) used cached information if requested. Always load using a cached handle so that results will be available to later calls. Addresses bug #8901 2004-05-09 David Ayers * Headers/Additions/GNUstepBase/GSObjCRuntime.h * Source/Additions//GSObjCRuntime.m (GSProtocolFromName): New function. (GSRegisterProtocol): Ditto. (gs_string_hash): New internal function. (gs_find_protocol_named_in_protocol_list): Ditto. (gs_find_protocol_named): Ditto. (gs_init_protocol_lock): Ditto. 2004-05-07 23:48 Alexander Malmberg * Resources/Languages/Hungarian: Add a missing ". 2004-05-06 David Ayers * Headers/Additions/GNUstepBase/GSObjCRuntime.h: * Source/Additions//GSObjCRuntime.m (GSClassList): New function. 2004-05-07 Richard Frith-Macdonald * configure.ac: don't attempt to find xslt support if xml support was disabled or not found. 2004-05-06 David Ayers * Headers/Additions/GNUstepBase/GSObjCRuntime.h * Source/Additions//GSObjCRuntime.m (GSAllocateMutexAt): New function. (_GSObjCRuntimeInitializer): Define local support class. * Headers/Additions/GNUstepBase/objc-gnu2next.h: Fixed minor whitespace issues. (objc_mutex_t, objc_mutex_allocate, objc_mutex_deallocate) (objc_mutex_lock, objc_mutex_unlock, objc_mutex_trylock): Declare for the NeXT runtime. * Source/Additions/GSNextRuntime.m (objc_mutex_allocate, objc_mutex_deallocate) (objc_mutex_lock, objc_mutex_unlock, objc_mutex_trylock): Implement for NeXT runtime. 2004-05-06 Mateu Batle * Tools/gdomap.c: mingw fixes. * Headers/Foundation/NSPort.h: ditto * Source/NSSocketPort.m: ditto 2004-05-03 22:12 Alexander Malmberg * Source/NSString.m (-hash), Source/GSString.m ([NSConstantString -hash]): Fix guard against returning a zero hash. 2004-04-29 23:00 Alexander Malmberg * configure.ac: Test for iconv support by compiling a program that includes the iconv header. * configure: Regenerate. 2004-04-27 Georg Fleischmann * Source/NSCalendarDate.m: (-initWithString:calendarFormat:locale:): avoid exception with time zone abbreviations. * Testing/nsdate.m: Add test for this. (). 2004-04-27 Adam Fedor * Source/GSHTTPURLHandle.m: Get debugFile path using NSTemporaryDirectory() (based on fix from Sheldon Gill). 2004-04-27 Richard Frith-Macdonald * Source/Additions/Unicode.m: Tidy indentation and line lengths. * Documentation/Base.gsdoc: Improve documentation on default charset. 2004-04-26 Richard Frith-Macdonald * Source/NSHashTable.m: End enumerations 'properly' ... no effect in current implementationm, but could be important in future. 2004-04-26 Willem Rein Oudshoorn * Source/libgnustep-base-entry.m (gnustep_base_socket_init): Added braces for if statement (DllMain): Removed old initialization code (gnustep_base_socket_handler): Removd this method plus declaration. * Source/GSFFCallInvocation.m (GSInvocationCallback): Try to find type information if not available, also changes wording of exception when no type information is found. (Fixes #8654) * Source/GSFFIInvocation.m (GSFFIInvocationCallback): Idem 2004-04-25 Richard Frith-Macdonald * Source/NSProtocolChecker.m: Major rewrite ... appeared almost totally non-functional. * Testing/nsconnectiion_server.m: Use NSProtocolChecker as a test. * Source/NSDistantObject.m: ([methodForSelector:]) moved to NSProxy.m * Source/NSProxy.m: ([methodForSelector:]) implemented. 2004-04-23 David Ayers * Source/Additions/GSLock.m ([GSLazyLock -init]) ([GSLazyRecursiveLock -init]): Always invoke supers init so dealloc does not fail on Cocoa. 2004-04-19 Richard Frith-Macdonald * Source/NSDistantObject.m: ([-conformsToProtocol:]) rewritten with various hacks to check locally set protocol (if present) or forward a request to the remote system to check a protocol by name. Works round the fact that the gnu runtime protocol code accesses the ivars of the other protocol directly and so can't work via a proxy. 2004-04-17 01:17 Alexander Malmberg * Headers/Foundation/NSObject.h, Source/NSObject.m, Source/NSMethodSignature.m: Rename 'GNU' categories to 'GNUstep'. Patch from Matt Rice. 'GNU' is a standard define on Hurd, so it can't be used as a name. 2004-04-15 Richard Frith-Macdonald * Source/NSUserDefaults.m: Restore use of flag to prevent infinite recursion logging errors in createing standard defaults ... was lost in last modification. 2004-04-15 15:10 Alexander Malmberg * Tools/Makefile.postamble: Remove attempt to create $(doctemplatesdir). 2004-04-15 14:39 Alexander Malmberg * Source/NSString.m (-stringByResolvingSymlinksInPath): Use -fileSystemRepresentation and -stringWithFileSystemRepresentation: instead of cstring methods. (-getCString:maxLength:range:remainingRange:): Document. (-getCString:, -getCString:maxLength:): Documentation fixes. 2004-04-14 18:20 Alexander Malmberg * Source/Additions/Unicode.m (GSToUnicode): In an utf8 sequence, check the the continuation bytes are valid continuation bytes. 2004-04-13 Richard Frith-Macdonald * Tools/GNUmakefile: * Tools/Makefile.postamble: Stop attempts to install templates removed in Adrian Robert's tidyup. 2004-04-12 Richard Frith-Macdonald * Source/NSUserDefaults.m: Invalidate userLanguages cache with every update to standard defaults, so setting it should work. Use lazy locking for improved performance when single threaded. Reorganise interaction between +standardUserDefaults and +userLanguages for improved startup performance and simplification (only load the database once on startup). Add large comments about the (still messy) interaction between the two methods. 2004-04-11 Richard Frith-Macdonald * Headers/Foundation/NSArchiver.h: New ivar in unarchiver. * Source/NSUnarchiver.m: Simpler scheme to ensure that objects persist until the end of unarchiving ... just store them in an array. * Source/NSNumber.m: Don't deallocate self in initialisers when replacing with cached object ... use release instead in case something else has retained us. 2004-04-09 Gregory John Casamento * Source/NSUnarchiver.m: Temporary rollback of previous fix. 2004-04-09 Richard Frith-Macdonald * Source/NSUnarchiver.m: Retain objects while they are being decoded. Fixes problem reported by Willem Rein Oudshoorn where an object used by more than one object being decoded could be released by one object before being used by the other. Fix -init to call the primary initialiser. 2004-04-09 Willem Rein Oudshoorn * Source/NSTask.m ([NSConcreteWindowsTask -launch]): Set stdin/stdout/stderr file to values provided by the user (Fix #8417) 2004-04-08 Adam Fedor * Tools/autogsdoc.m (main): Move var decl to begginning of block to avoid gcc < 3.0 compiler errors (Fix #8418). 2004-04-06 Richard Frith-Macdonald * Source/NSUserDefaults.m: Modified to operate on a read-only filesystem where the defaults database is missing. Application defaults and command line settings should still work. * Source/GSDictionary.m: fix for keyed archioving reported by Marc Ordinas i Llopis * Source/Additions/GSXML.m: Improve error logging ... add line number and column number to message, also avoid possible buffer overflow. 2004-04-02 Richard Frith-Macdonald * Tools/AGSParser.m: Fix error parsing sequence of protocol names separated by commas. 2004-03-31 Richard Frith-Macdonald * Source/NSKeyedArchiver.m: Encode archive version as a number rather than a string. * Source/NSString.m: ([-hash]) include full string length in the hash. * Source/GSString.m: ditto Disambiguates long strings with a common prefix. * Headers/Additions/GNUstepBase/GSIArray.h: add support for an array with statically allocated memory, which grows by using the heap. * Source/NSNotificationCenter.m: Rewrite posting so that we don't hold a lock on the center while actually posting ... should prevent possible deadlock in multithreaded programs. * Source/NSFileManager.m: ([-fileExistsAtPath:isDirectory:]) set the flag to NO if the path does not exist. (Fixes bug #7532) ([copyPath:toPath:handler:]) Don't copy to existing destination. ([movePath:toPath:handler:]) Don't move to existing destination. (Fixes bug #7525) 2004-03-30 Willem Rein Oudshoorn * Source/NSNotificationCenter.m ([-removeObserver:]): Do not raise an exception when removing nil observer, jusr return. This is WO4.5 and MacOSX behaviour. 2004-03-29 Adam Fedor * Headers/Foundation/NSCoder.h (uint8_t, int32_t, int64_t): Define only ifndef (sugg. from Peter Cooper ) Mon Mar 29 17:19:40 BST 2004 Nicola Pero * Tools/autogsdoc.m: Use @"..." @"..." for concatenated string constants, not @"..." "...". 2004-03-29 Richard Frith-Macdonald * Documentation/Base.gsdoc: * Documentation/BaseAdditions.gsdoc: * Documentation/Functions.gsdoc: * Documentation/TypesAndConstants.gsdoc: Update to latest gsdoc document version. * Documentation/Makefile.postamble: Build Tools documentation. contigure.ac: Add --enable-xslt option to require stylesheet support (in case we want to start uisng it to generate documentation) * Headers/Foundation/NSURLHandle.h: * Source/GSFileHandle.m: * Source/GSHTTPURLHandle.m: * Source/NSFileHandle.m: * Source/NSURLHandle.m: Support binding to specific local ip address for outgoing connections in gnustep extensions. * Source/GSMime.m: ([-setContent:]), ([-addContent:]) Check that content of a multipart document consists of GSMimeDocument objects. 2004-03-29 Adrian Robert * Tools/AGSHtml.h: * Tools/AGSHtml.m: * Tools/AGSIndex.m: * Tools/AGSOutput.m: * Tools/AGSParser.h: * Tools/AGSParser.m: * Tools/gsdoc.gsdoc: * Tools/autogsdoc.m: * Tools/GNUmakefile: Added support for building frames structured project documentation along with various other tidyups. * Tools/cvtenc.m: * Tools/defaults.m: * Tools/gdnc.1: * Tools/gdnc.m: * Tools/gdomap.h: * Tools/pldes.m: * Tools/plmerge.m: * Tools/plparse.m: * Tools/plser.m: * Tools/sfparse.m: * Tools/xmlparse.m: Added/improved documentaition. 2004-03-27 Richard Frith-Macdonald * Source/NSMessagePort.m: * Source/NSMessagePortNameServer.m: Use base library methods for file management rather than unix syscalls. * Headers/Foundation/NSRunLoop.h: * Source/NSRunLoop.m: * Source/NSString.m: * Source/NSTimeZone.m: Various minor documentation tweaks. 2004-03-27 Alexander Malmberg * NSUser.m: Plug some security loopholes in temporary directory 2004-03-27 Mark Allison * Headers/Additions/GNUstepBase/GSXML.h: * Source/Additions/GSXML.m: Add support for stylesheet processing using libxslt if it is available. * configure.ac: Check for presence of libxslt 2004-03-26 Fred Kiefer * Source/NSIndexSet.m: Check before each usage of _other if it is actually set. 2004-03-24 Adam Fedor * Resources/GNUmakefile: Add Languages/Hungarian. * Languages/Hungarian: New file (from Reuss Andras ). * configure.ac: Check for null ac_cv_lib_dl_dladdr. * Documentation/announce.texi: Update bug reporting URL. 2004-03-19 Adam Fedor * Source/NSFileManager.m (-createDirectoryAtPath:attributes:): Return NO if path is nil. (-createFileAtPath:contents:attributes:): Idem. * Source/NSUser.m (NSUserName): Set initial olduid to an invalid uid. 2004-03-16 Richard Frith-Macdonald * Source/NSDictionary.m: Don't use stack as temporary storage for large numbers of objects ... reduce chances of stack overflow. * Source/NSIndexSet.m: Added a few range checks, implemented many methods of mutable class. 2004-03-16 Willem Rein Oudshoorn * Source/NSNotificationCenter.m ([NSNotificationCenter -removeObserver:name:object:]): Just return if all arguments are nil instead of throwing exception. The new behaviour is compatible with MacOSX. 2004-03-15 Richard Frith-Macdonald * Source/GSCompatibility.m: * Source/GSDictionary.m: * Source/NSPropertyList.m: Check for proxies in a few places and avoid pointer code which won't work for them. Also avoid caching imps as a temporary workaround for a problem (not yet understood) with ffi forwarding using a cached imp. 2004-03-12 Richard Frith-Macdonald * Source/Additions/GSCategories.m: * Source/Additions/GSMime.m: New uuencode/uudecode moved from GSMime to a category of NSData and renamed. * Source/NSThread.m: Set flag to saay we are multithreaded before we send out the notifications. Fixes bug in lazy locking and is more compatible with macos-x Fri Mar 12 13:35:25 2004 Nicola Pero * SSL/GNUmakefile: Set GNUSTEP_LOCAL_ADDITIONAL_MAKEFILES before including common.make so that the local base.make is read correctly. 2004-03-07 Adam Fedor * configure.ac: Add HAVE_DLADDR define * Source/simple-load.h (__objc_dynamic_get_symbol_path): Readd ifdefs for dladdr. * Tools/defaults.m: Exit with non-zero status when command is not successful. Sat Mar 6 13:54:28 2004 Nicola Pero * SSL/GNUmakefile: Include common.make before everything else so that the SSL bundle is built again. 2004-03-05 Wim Oudshoorn * Source/NSCalendarDate.m ([NSCalendarDate -descriptionWithCalendarFormat:locale:]): Fixed problem with repeated %b %B %b %B and the like. Fixed problem with missing characters after unrecognixed modifiers. Added support for %c %X and %x. 2004-03-02 Adam Fedor * Source/NSCalendarDate.m (dayOfCommonEra): Make non-static. 2004-03-01 Wim Oudshoorn * Headers/Additions/GNUstepBase/GSIMap.h: Added increment ivar to GSIMapTable struct for allocation size (GSIMapNewNode): When above a certain size only allocate "increment" number of nodes (GSIMapResize): Avoid hash table sizes that are odd (GSIMapInitWithZoneAndCapacity): Put default increment size to 300000 * Source/NSThread.m ([GSPerformHolder +initialize]): #ifdef'ed out code that does not work on MinGW. 2003-02-29 Sheldon Gill * Source/NSTimeZone.m: Added capability on Win32. NSTimeZone now has GSWindowsTimeZone concrete sub-class which uses data from the registry. Based on changes from Jeremy Bettis: 2003-02-29 Sheldon Gill * Source/NSTimeZone.m: Added documentation and clean up. [NSTimeZone initTimeZoneWithName:data:] now uses data. 2004-02-28 Adam Fedor * Version 1.9.1 * Documentation/install.texi, news.texi: Update * configure.ac: Define _GNU_SOURCE for LONG_LONG check * Source/GSFormat.m: Idem. * Source/NSScanner.m: Idem. * Source/simple-load.h: Define RTLD_DEFAULT if not defined. 2004-02-28 17:52 Alexander Malmberg * configure.ac, configure: Define GS_UINT64 properly if there is no 64-bit integer type. * Source/NSIndexSet.m: Don't use casts as lvalues. 2004-02-27 Wim Oudshoorn * Tools/gdomap.c: when using MinGW do not try to chdir to /tmp because it does not always exist. * Source/NSBundle.m ([NSBundle +mainBundle]): on WIN32 strip .exe extension from executable name when constructing mainBundle path. 2004-02-26 David Ayers * Headers/Additions/GNUstepBase/GSCategories.h ([NSLock gcFinalize]): Declare. ([NSRecursiveLock gcFinalize]): Ditto. 2004-02-25 David Ayers * Headers/Additions/GNUstepBase/GSCategories.h: * Source/Additions/GSCompatibility.m (GSCurrentThread) Implement and declare for non *-gnu-*. 2004-02-24 Fred Kiefer * Headers/Foundation/NSDictionary.h: * Source/NSDictionary.m: (-setValue:forKey:) Added MacOSX method with same implementation as takeValue:forKey: 2004-02-24 Richard Frith-Macdonald * Source/GSFormat.m: Fix buffer overrun by strlen() when printing c-strings without nul terminators using '%*.*s' format. * Source/Additions/GSMime.m: Fix cases of possible access beyond buffer and rare overflow writing decoded base64 data. * Headers/Foundation/NSKeyedArchiver.h: Remove stuff saying this is not implemented ... it is now. * Source/NSIndexSet.m: Partial implementation untested ... at least it's a skeleton for people to work on ... committed now because I'm away for a few weeks on holiday. * Headers/Foundation/NSIndexSet.h: Partial documentation. 2004-02-23 Adam Fedor * Source/NSUser.m (NSHomeDirectoryForUser): Allow whitespace in user directory (on Windows). 2004-02-21 Fred Kiefer * Source/NSPropertyList.m: (GSBinaryPLParser -initWithData:mutability:, -offsetForIndex:, -readObjectIndexAt:) Added support for binary pls with size == 3. 2004-02-19 Richard Frith-Macdonald * Source/Additions/GSMime.m: added a couple of uuencoding methods. Integrated (crudely) uuencoding/uudecoding support based on x-uuencode 2004-02-18 David Ayers * Source/Additions/Unicode.m (GetDefEncoding): Replace NSKoreanEUCEncoding with NSKoreanEUCStringEncoding. 2004-02-17 Bruno Haible * Source/Additions/Unicode.m (GetDefEncoding): Use the result of nl_langinfo(CODESET) before falling back on ISO-8859-1. * config/codeset.m4: New file, taken from GNU gettext. * configure.ac: Include it, and invoke AM_LANGINFO_CODESET. 2004-02-17 David Ayers * Headers/Foundation/NSLock.h: Make types of _mutex and _condition opaque to avoid including private thr-mach.h header. * Headers/Foundation/NSThread.h: Do not include private thr-mach.h header. * Source/thr-mach.h: Moved here from Headers/Additions/GNUstepBase/thr-mach.h. * Source/NSLock.m: Include private thr-mach.h header for apple-gnu-gnu. Added defines for typing opaic instance variables and use them in various methods. * Source/NSThread.m: Include private thr-mach.h header for apple-gnu-gnu. * Source/thr-mach.m: Include private thr-mach.h header from new location. * Source/thr-pthread.m: Ditto. * Source/GNUmakefile: Do not install private thr-mach.h header. 2004-02-11 17:47 Alexander Malmberg * Source/NSCountedSet.m (-initWithCoder:): Release objects outside the -addObject: loop to keep the retain count correct. 2004-02-11 Richard Frith-Macdonald * Source/GSHTTPURLHandle.m: Expect to read content data after headers if content-length is non-zero or if content-transfer-encoding is chunked or if server http version is less than 1 2004-02-09 Adam Fedor * configure.ac: Add ffcall dir to INCLUDE_FLAGS. 2004-02-08 Adam Fedor * Source/simple-load.h (__USE_GNU): Define for dlfcn. 2004-02-08 Richard Frith-Macdonald * Source/NSConection.m: Simplify code by using GSLazyLock and GSRecursiveLazylock. Removed unused include of float.h * Source/GSAttributedString.m: * Source/GSTcpPort.m: * Source/NSCharacterSet.m: * Source/NSCountedSet.m: * Source/NSDebug.m: * Source/NSMessagePort.m: * Source/NSSocketPort.m: * Source/NSTimeZone.m: Simplify by using lazy locking. 2004-02-07 Adam Fedor * Source/simple-load.h (__objc_dynamic_get_symbol_path): Remove ifdefs since dladdr is assured to be present. Set handle to default if not specified. 2004-02-04 Fred Kiefer * Source/NSPropertyList.m: (GSBinaryPLParser -objectAtIndex:) Corrected two small errors for the new binary parser. 2004-02-07 Richard Frith-Macdonald * Source/NSKeyedUnarchiver.m: Changes to fix memory leaks. Fix bug handling nil/NSnull reported by Fred. 2004-02-06 Richard Frith-Macdonald * Source/GSHTTPURLHandle.m: If there is no path in the URL, assume '/' 2004-02-04 Fred Kiefer * Source/NSPropertyList.m: Rewrote the object reference handling for new binary parser. 2004-02-02 Richard Frith-Macdonald * Source/NSPropertyList.m: Integrate new parser to NSPropertyListSerialisation. Assume 8bit strings are utf8. 2004-02-04 01:10 Alexander Malmberg * Headers/Foundation/NSObject.h (ASSIGNCOPY), Source/GSDictionary.m (GSI_MAP_RETAIN_KEY), Source/NSNotificationCenter.m (-init), Source/NSProtocolChecker.m (-forwardInvocation:), Source/Additions/GSXML.m (-initWithDocument:): Remove uses of the now deprecated "casts as lvalues" gcc extension. 2004-02-02 Richard Frith-Macdonald * Source/NSPropertyList.m: Added class by Fred Kiefer to decode MacOS-X binary property lists ... heavily modified to try to handle object references and dates (guessed) and to support mutability options. Current code does not get called by the deserialisation method as I need to figure out how to tell which format the property list is in, and for that I need to loook at example archives, which I haven't had time to do yet. Code comitted mainly so it's saved somewhere and so that Fred can have a look and see if I've messed stuff up. 2004-02-02 Roland Schwingel * Source/NSString.m: ([stringByAbbreviatingWithTildeInPath]) fix bug appending last path component. ([localizedNameOfStringEncoding:]) fix load of locliisation bundle. 2004-02-02 Richard Frith-Macdonald * Source/Headers/Foundation/NSPropertyList.h: Use GNUstep rather than GNUStep in property list format names as it seems to be the more common capitalisation. * Source/NSPropertyList.m: Add new methods exposed to java by jigs to avoid java errors with conflicting implementations of the NSPropertyListSerialisation class. 2004-02-01 Richard Frith-Macdonald * Source/Additions/GSMime.h: improve consistency of naming of methods with add/set methods for new headers. * Source/GSHTTPURLHandle.m: ([bgdRead:]) if the headers are complete and there is no content-length, don't expect to read body content. 2004-01-31 Manuel Guesdon * Source/NSNumber.m: Modified numberWithXX: methods to test against abstractClass. If class is not the abstract class, we alloc object of class instead of allocating NSXXNumber objects (cf [NSDecimalNumber numberWithDouble:x] thread) 2004-01-30 Richard Frith-Macdonald * Source/NSString.m: Added two new MacOS-X initialisers. * Headers/Foundation/NSString.h: ditto * Source/NSData.m: ([replaceBytesInRange:withBytes:length:) rewrite to fix crash when new data is smaller than orignal. * Source/NSNumber.m: ([numberWithBool:]) and ([initWithBool:]) returns yes value for any non-zero argument. ([boolValue]) returns either YES or NO. So we are tolerant in what we accept, strict in what we produce. 2004-01-28 Fred Kiefer * Source/NSString.m: Corrected keyed decoding and implemented keyed encoding. 2004-01-28 Richard Frith-Macdonald * Source/NSKeyedUnrchiver.m: Store objects in map while they are decoding themselves so they can be self referential. * Source/GSArray.m: * Source/NSArray.m: * Source/GSSet.m: * Source/NSSet.m: * Source/GSDictionary.m: * Source/NSDictionary.m: * Source/NSString.m: Made keyed decoding able to handle more variations. Added keyed encoding support. 2004-01-27 Fred Kiefer * Source/NSPropertyList.m (nodeToObject()): Fixed bug in handling of data elements. Was using [GSMimeDocument decodeBase64String:] instead of [GSMimeDocument decodeBase64:]. 2004-01-27 Fred Kiefer * Source/GSArray.m: * Source/NSArray.m: * Source/GSSet.m: * Source/NSSet.m: * Source/GSDictionary.m: * Source/NSDictionary.m: * Source/NSString.m: Implemented keyed decoding in [initWithCoder:]. 2004-01-27 Richard Frith-Macdonald * Headers/Foundation/NSKeyedArchiver.h: Expose internals a bit. * Source/NSKeyedArchiver.m: Fix decoding of geometry for locales where a comma is used as a decimal separator. 2004-01-26 Adam Fedor * Documentation/General/GNUmakefile: Update install location 2004-01-25 Adam Fedor * base.make.in: Move LIBXML variable outside gnu-foundation check. * Documentation/GNUmakefile (SUBPROJECTS): Add General * Documentation/General/GNUmakefile: New file. * Documentation/General/Degbugging.gsdoc: Moved to here. * Documentation/General/OpenStepCompliance.gsdoc: Idem. * Source/DocMakefile: Remove OpenStepCompliance.gsdoc 2004-01-25 Richard Frith-Macdonald * Source/NSPropertyList.m: Fix bug in encoding integers as xml. Fix to compile without xml if necessary. * Source/GSPrivate.h: Added internal class for handling old style arrays of items within keyed coding ... should this go elsewhere? * Source/NSCoder.m: Added internal class for keyed coding of arrays of items. * Source/NSKeyedArchiver.m: Added support for ([encodeArrayOfobjCType:count:at:]) and the private ([_encodeArrayOfObjects:forKey:]) method. This completes (afaik) the implementation for archiving ... and it's somewhat tested for xml coding. Time to start using and debugging. * Source/NSKeyedUnarchiver.m: All methods now implemented, but no proper type checking/coercion done, and minimal testing done. No attempt to handle OpenStep style property lists either, just xml! * configure.ac: Insist on libxml2 presence unless told not to. 2004-01-24 Richard Frith-Macdonald * Headers/Foundation/NSKeyedArchiver.h: * Source/NSKeyedArchiver.m: Add keyed version of geometry encoding methods as pointed out by Fred Kiefer. 2004-01-24 Richard Frith-Macdonald * Source/NSKeyedArchiver.m: * Source/NSKeyedUnarchiver.m: Added NSPoint, NSRect, and NSSize coding methods. implemented quick hack of ([decodeValueOfObCType:at:]) Set default property list format to xml ... The MacOS-X binary, format isn't supported yet (if ever), and I'm developing using the comon/portable XML format first anyway. * Source/NSMSoperamulti_test.m: Sort dictionary items in xml output 2004-01-23 Richard Frith-Macdonald * Source/NSSocketPort.m: * Source/NSMessagePort.m: Fixed return form method without unlocking a lock ... could cause a hang. Also, tidied up add/romve watchers in runloops. 2004-01-22 Richard Frith-Macdonald * Headers/Foundation/NSKeyedArchiver.h: Update ivars for unarchiver. * Source/NSKeyedUnarchiver.m: Partial implementation. 2004-01-21 Richard Frith-Macdonald * Headers/Foundation/NSPropertyList.h: serialisation/deserialisation. * Source/NSPropertyList.m: serialisation/deserialisation code partly implemented. * Headers/Foundation/NSCoder.h: Add keyed coding methods. * Source/NSCoder.m: ditto * Headers/Foundation/NSKeyedArchiver.h: new keyed archiver/unarchiver. * Source/NSKeyedArchiver.m: New MacOS-X compatible class implementation. * Source/NSKeyedUnarchiver.m: Stub for new class implementation. * Source/GNUmakefile: build new keyed archiving stuff. * Source/GSCompatibility.m: fix indentation error in xml output. improve output of numeric values in xml format. * Source/Additions/GSMime.m: ([-setContentType:) make argument more strongly typed. ([-encodeBase64:])tweak buffer size. 2004-01-18 Richard Frith-Macdonald * Source/NSDistantObject.m: All code conditional on USE_FFCALL should also be conditional on USE_LIBFFI so it works for both mechanisms. 2004-01-14 Adam Fedor * Source/Additions/GSObjCRuntime.m: Fix previous method def. * Source/Additions/GSXML.m: Idem. * Tools/GNUmakefile (TOOL_NAME): Add cvtenc plmerge sfparse xmlparse for add=yes. * Tools/cvtenc.m: Add includes for compiling with darwin. * Tools/plmerge.m, Tools/sfparse.m, Tools/xmlparse.m: Idem. Suggestions and patches from Stephane Corthesy. 2004-01-13 Richard Frith-Macdonald * Source/NSURLHandle.m: ([-availableResourceData]) remove condition that returns nil while resource is loading. Fix typo in method description. Return copy a of internal variable rather than the actual mutable data object. 2004-01-12 Adam Fedor * SSL/GNUmakefile: Include ../config.mak 2004-01-12 Adam Fedor * Source/Makefile.preamble: Add library depends for baseadd * Source/Additions/GSLock.m: Include GSCategories. * Source/Additions/GSObjCRuntime.m: Define -methodForSelector: since Apple doesn't. * Source/Additions/GSXML.m: Idem as well as GSXPathObject method. Change warnings variable to NSHashTable*. * Tools/AGSHtml.m ([AGSHtml -outputNode:to:]): Change name of block variable to avoid clash * Tools/AGSOutput.m ([AGSOutput -split:]): Initialize local vars. Changes suggested by Stephane Corthesy. 2003-12-20 Sheldon Gill * Source/NSProcessInfo.m (+load): Fix coding standard violations. 2004-01-10 Bruno Haible * Locale.aliases: Add many new locales. Fix typo for EcuadorSpanish. 2004-01-10 Richard Frith-Macdonald * Source/GSCompatiblity.m: PString() fix erroneous use of unichar pointer as if it was a char pointer. 2004-01-08 Alexander Malmberg * Source/Additions/GSMiume.m: Fix bad use of NSString as C-string 2004-01-07 Richard Frith-Macdonald * Source/NSArray.m: minor cleanups to use gnucoding conventions for whitespace and little performance tweak (cache NSNull instance). 2004-01-08 01:48 Alexander Malmberg * Headers/Additions/GNUstepBase/GSCategories.h (GSCurrentThreadDictionary, NSStandardLibraryPaths): Fix the prototypes (add explicit void:s). * Source/GSAttributedString.m (_setAttributesFrom): Initialize range in the aRange.length==0 case. (Found by Andrew Ruder using valgrind.) 2004-01-06 Adam Fedor * Documentation/Base: New directory * Documentation/Base/Debugging.gsdoc: New. 2004-01-06 Manuel Guesdon * Headers/Foundation/NSArray.h/.m: added -setValue:forKey: and -valueForKey: to comply to Mac OS X v10.3 and later documentation. 2004-01-05 Richard Frith-Macdonald * Headers/Additions/GNUstepBase/GSMime.h: add content deletion method * Source/Additions/GSMime.m: add content deletion method ([-deleteContent:]) as counterpart for addition of content, for consistency. 2003-12-30 Fred Kiefer * Headers/Foundation/NSGeometry.h * Headers/Foundation/NSRange.h Added a few additonal Cocoa type definitions. 2003-12-25 Gregory John Casamento & * Source/NSBundle.m: Corrected spelling of "Warning" and "deprecated" in the pathForGNUstepResource:... method. 2003-12-25 Fred Kiefer * Tools/pl2link.m: Adopted to current OpenDesktop specification. 2003-12-23 23:33 Alexander Malmberg * Source/NSCharacterSet.m: Rename 'abstract' to 'abstractClass' and make it static. (+allocWithZone:): Allocate an instance of self if self isn't the abstract class. 2003-12-23 18:38 Alexander Malmberg * Source/NSThread.m: Don't use '\r\n' in printf strings (stdio/libc is responsible for converting it to local convention). (+detachNewThreadSelector:toTarget:withObject:): Don't set entered_multi_threaded_state to NO if the objc_thread_detach call fails. 2003-12-23 18:15 Alexander Malmberg * Documentation/news.texi, Headers/Foundation/NSDebug.h, Source/GSPrivate.h, Source/externs.m, Tools/plist-0_9.dtd: Fix spelling errors in comments. 2003-12-06 12:34 Alexander Malmberg * Headers/Foundation/NSGeometry.h (NSContainsRect): Return NO if bRect is empty. * Source/NSGeometry.m (NSIntegralRect): Calculate the new width and height correctly. 2003-12-01 Richard Frith-Macdonald * Source/NSObject.m: Fix error setting sigpipe handling where sigaction is available. 2003-11-30 Richard Frith-Macdonald * Source/NSNumber.m: Raise exception if user code incorrectly tries to deallocate a cached small number. * Source/NSUser.m: Use geteuid() to determine name of current user under unix. 2003-11-25 Richard Frith-Macdonald * Source/Additions/GSMime.m: fix for incremental parsing so that the parser insists on the crlf after the last boundary in a message (hold a flag to say we are still expecting the crlf). 2003-11-23 S.J.Chun * Headers/Additions/GNUstepBase/GSCategories.h: Change KoreanEUCEncoding to KoreanEUCStringEncoding. * Headers/Foundation/NSString.h, Source/Additions/Unicode.m: Idem. 2003-11-23 Adam Fedor * Version 1.9.0 2003-11-23 Richard Frith-Macdonald * Source/NSTask.m: ([-suspend]) send SIGSTOP as documented ... bug reported by Jim Fowler. 2003-11-22 Adam Fedor * configure.ac: Typo fix - add original CPPFLAGS back when updating netbsd CPPFLAGS. 2003-11-16 Richard Frith-Macdonald * Source/Additions/GSCompatibility.m: Add dummy gcFinalize implementations for NSLock and NSRecursiveLock so that the lazy locking classes can safely call them under MacOS-X 2003-11-10 Richard Frith-Macdonald * Tools/AGSHtml.m: Fix based on email by Chris Vetter to correct presentation of protocol names in index pages. 2003-11-10 David Ayers Based on patches by Philip Moetteli . * Headers/Additions/GNUstepBase/GSCategories.h: Added NSKoreanEUCEncoding. * Headers/Additions/GNUstepBase/GSLock.h * Headers/Additions/GNUstepBase/GSLocale.h: Guard includes for NeXT_Foundation_LIBRARY. * Source/Additions/GSLock.m: Include GNUstepBase/GNUstep.h. * Headers/Additions/GNUstepBase/GSCategories.h * Headers/Foundation/NSString.h: (+[NSString stringWithFormat:arguments:]): Move declaration to GSCategories. * Source/NSString.m * Source/Additions/GSCategories.m: (+[NSString stringWithFormat:arguments:]): Move implementation to Additions. * macosx/config.h: Define HAVE_WCHAR_H. * macosx/gnustep.pbproj/project.pbxproj: Added GSLock files. 2003-11-10 Richard Frith-Macdonald * Source/NSUserDefaults.m: Only obtain distributed lock for reading or writing defaults ... not needed just to check the modification date. Avoids unnecessary filesystem writes. 2003-11-09 Frederic De Jaeger * Source/GSFileHandle.m ([GSFileHandle -initAsClientInBackgroundAtAddress:service:protocol:forModes:]): the boolean 'beenHere' must be declared static. Fixing it. 2003-11-06 David Ayers * Source/GSPrivate.h (GS_REPLACE_CONSTANT_STRING): New macro. * Source/externs.m: Initialize constant strings statically. (GSBuildStrings): Replace static strings with dynamic versions. * Testing/benchmark.m: Added tests for NSString -hash and -copy. Aligned ouput. * Testing/externs.m: New test. * Testing/GNUmakefile: Added externs.m test. Activated ADDITIONAL_TOOLS tests excluding gstcpport tests. * Source/Additions/GSCategories.m: Adjust declared lock type. Added comment. 2003-11-05 18:26 Richard Frith-Macdonald * SSL/GSSSLHandle.m: Add support for server end handles. * Source/NSFileHandle.m: New -sslAccept method for servers. 2003-11-05 14:49 Alexander Malmberg * Source/NSSerializer.m (serializeToInfo): Only save a string as a cstring if it only contains ASCII characters. 2003-11-05 03:10 Alexander Malmberg * Source/GSString.m: Reorganize class heirarchy. Remove unused GSCEmptyString class. Add new concrete leaf classes GSCBufferString and GSCUnicodeString. Make GSString, GSCString, and GSUnicodeString abstract and move the real memory management code to the two new classes. Update the other concrete leaf classes. Update callers. * Source/GSPrivate.h: Update comment about the semantics of the free flag in GSString. * Source/NSSerializer.m: Clarify comments about the cached classes. Use GSCBufferString and GSUnicodeBufferString instead of GSCString and GSUnicodeString when creating string instances. Mon Nov 03 12:30:00 2003 Richard Frith-Macdonald * Source/NSNotificationCenter.m: Use locking at all times until problems with GNUMail threading and notifications are analysed/fixed. Mon Nov 03 08:35:00 2003 Richard Frith-Macdonald * Source/GSString.m: Remove unnecessary -copy implementations for simplicity, and add code to avoid creating substrings of strings which do not own their buffers ... stopgap until Alexander reorganises class hierarchy. 2003-11-02 01:53 Alexander Malmberg * Source/GSString.m ([GSCSubString -copy]): Add as a stopgap workaround for problems uncovered by the previous change. Sat Nov 01 11:10:00 2003 Richard Frith-Macdonald * Source/NSString.m: ([-copyWithZone:]) always do true copy * Source/GSString.m: Where the string data pointed to is not owned by the string instance, have copy operations create new instances rather than retaining the receiver. Sat Nov 01 07:05:00 2003 Richard Frith-Macdonald * Source/NSNotificationCenter.m: Simplify locking code as original code was hanging in GNUMail after Davids recent locking changes ... not sure what the actual problem was, so this change may have merely re-hidden a bug :-( * Source/Additions/Unicode.m: Simplify to use non-recursive lock. * Source/NSCharacterSet.m ([NSCharacterSet _bitmapForSet:number:]): Restore caching while retaining the intended behavior of the previous change (is that intended behavior correct?). Perhaps should maintain a separate cache for each subclass ... or should that be the responsibility of the subclass itsself? 2003-10-31 David Ayers * Source/NSCharacterSet.m ([NSCharacterSet _bitmapForSet:number:]): Insure only instances of NSCharacterSet a stored in the cache but return instances of the receivers class. 2003-10-30 David Ayers * Headers/Additions/GNUstepBase/GSLock.h: Added missing forward declaration. * Headers/Additions/GNUstepBase/GSCategories.h: Remove declaraion of gnustep_global_lock. (GS_INITIALIZED_LOCK): New macro. (+[NSLock newLockAt:]): New method. (+[NSRecursiveLock newLockAt:]): Ditto. * Headers/Foundation/NSLock.h: Ditto. * Source/Additions/GSCategories.m: Replace global lock with local lock. (_GSLockInitializer): New class to initialize local lock safely. (newLockAt): New static function shared by +newLockAt: implementations to safely intialize lock variables. (+[NSLock newLockAt:]): Implemented and documented. (+[NSRecursiveLock newLockAt:]): Ditto. * Source/Additions/GSCompatibility.m: Remove gnustep_global_lock. * Source/Additions/GSObjCRuntime.m: Remove superfluous locking. * Source/Additions/Unicode.m: Use new GS_INITIALIZED_LOCK macro and replace global lock with local lock. Moved out of the #ifdef as reported by Matt Rice (ratmice@yahoo.com). * Source/NSLock.m (-[NSConditionLock lockWhenCondition:beforeDate:]): Implemented. * Testing/gslock.m: New test case. * Testing/GNUmakefile: Add new test case. 2003-10-28 Adam Fedor * configure.ac: Simplify and clarify ffi errors. * macosx/gnustep.pbproj/project.pbxproj: Update for 10.3 (Xcode). * macosx/REAMDE: Add comment (Update from Philip Mötteli ). Tue Oct 28 10:12:00 2003 Richard Frith-Macdonald * Source/NSRunLoop.m: Modified (acceptInputForMode:beforeDate:) and (runMode:beforeDate:) to poll input sources when given a date in the past, rather than ignoring them entirely ... this seems more useful and appears to be consistent with MacOS-X. Updated method documentation. Mon Oct 27 13:37:00 2003 Richard Frith-Macdonald * Source/NSConnection.m: Rewrite/simplify methods dealing with DO retain/release and handling interaction with NSDistantObject. Attempts to make retain/release simpler and more reliable by (among other things) counting the nujmber of times an object is vended by reference. Much care taken to try to ensure that backward compatibility is not broken ... hope it is ok. * Source/NSDistantObject.m: Modified to use slightly simpler interaction with NSConnecxtion, to include count of times an object is vended by reference and to ensure thread safety. * Testing/nsconnection_client.m: Make the -d option produce detailed debug output. * Testing/nsconnection_server.m: ditto. Mon Oct 27 13:24:00 2003 Richard Frith-Macdonald * Source/GNUmakefile: build new lock classes * Source/DocMakefile: document new lock classes. Sun Oct 26 14:45:00 2003 Richard Frith-Macdonald * Source/Additions/GSLock.m: New lazy locking classes as discussed on the developer list. * Headers/Additions/GNUstepBase/GSLock.h: Declare new classes. Please try them out and provide feedback. Sat Oct 25 18:47:00 2003 Richard Frith-Macdonald * configure.ac: Judicious addition on spaces to fix test arguments. Sat Oct 25 06:54:00 2003 Richard Frith-Macdonald * Source/NSCalendarDate.m: ([setCalendarFormat:]),([setTimeZone:]) make nil arguments set default values for MacOS-X compatibility. Document this. 2003-10-24 Adam Fedor * configure.ac: Try to use libffi if ffcall not found. 2003-10-24 David Ayers * Source/GSArray.m: (-[GSMutableArray _raiseRangeExceptionWithIndex:from:]): Declare private method obtained through behavior additions. (-[GSArray _raiseRangeExceptionWithIndex:from:]): Use 'unsigned' in favor of 'int' for index and count. Move private method to the top of implementation context to avoid warnings. (-[GSMutableArray insertObject:atIndex:]): Use 'unsigned' in favor of 'int' for index. (-[GSMutableArray replaceObjectAtIndex:withObject:]): Correct selector name and parameter of method call. (-[GSMutableArray sortUsingFunction:context:]): Correct prototype. Fri Oct 24 07:55:00 2003 Stefan Urbanek * Source/GSArray.m: make exception messages more informative. Thu Oct 23 17:45:00 2003 Richard Frith-Macdonald * Source/NSSocketPort.m: ([portWithNumber:onHost:forceAddress:listener:]) minor fix for bug reported by Bjorn Giesler ... was ignoring requested listening port. 2003-10-22 David Ayers * Source/NSConcreteNumber.h: Moved here from Headers/Foundation/NSConcreteNumber.h. * Source/GNUmakefile: Make NSConcreteNumber.h private. * Source/NSConcreteNumber.m: Include NSConcreteNumber.h from new location. * Source/NSNumber.m: Ditto. * Source/NSURL.m: Include NSValue.h in favor of private NSConcreteNumber.h. * Source/NSURLHandle.m: Do not include NSConcreteNumber.h. 2003-10-21 Adam Fedor * Source/Makefile.postamble (libgnustep-base.def): Generate at compile time using the proper dependencies. Tue Oct 21 18:00:00 2003 Richard Frith-Macdonald * Source/NSDistantObject.m: Retain local objects on creation, and release on deallocation ... don't depend on the connection to do it. * Source/NSConnection.m: Restructured handling of proxies ... remove global tables of local object references and just look in all connections and cache when a local object cannot be found in the current connection. Don't retain local objects ... depend on the NSDistantObject class to do that. Don't keep counters of the number of connections in which a local object reference is used ... it's not needed if we don't need to track whether to release the local object or not. Shorten timeout for deferred deallocation of local object references (temporary measure). * Headers/Foundation/NSDistantObject.h: new ivar for future use keeping track of number of times an object is vended. Tue Oct 21 15:25:00 2003 Richard Frith-Macdonald * Testing/nsconnection_client.m: Add -r option. * Testing/nsconnection_server.m: support registration/degeristration * Testing/server.h: New methods. Add a test (-r) to have the client repeated register/unregister with server, and have server do a callback to the registered object. Should cause a crash if the retain counts of proxies get out of sync. Mon Oct 20 16:50:00 2003 Richard Frith-Macdonald * Headers/Additions/GNUstepBase/GSMime.h: Fix missing copying method declararations. Sat Oct 18 07:10:00 2003 Richard Frith-Macdonald * Source/Additions/Unicode.m: Allow GNUSTEP_STRING_ENCODING to give any supported iconv name in additiuon to OpenStep names. Make check case insensitive. Documentation/Base.gsdoc: Remove obsolete comment that GNUSTEP_STRING_ENCODING may not specify a mu7ltibyte encoding. 2003-10-16 Bruno Haible * Source/NSString.m (initWithContentsOfFile:, initWithContentsOfURL:): Fix recognition of UTF-8 BOM. Fri Oct 17 14:28:49 2003 Nicola Pero * Source/GNUmakefile (LIBRARY_VAR): Unused variable removed. * Source/GNUmakefile (srcdir): Variable removed. * Source/Makefile.preamble: Removed references to srcdir. * Source/Makefile.postamble: Same changes. * Source/Makefile.preamble (ADDITIONAL_LIB_DIRS): Use $(GNUSTEP_OBJ_DIR), not ./$(GNUSTEP_OBJ_DIR). Fri Oct 17 14:15:33 2003 Nicola Pero * Makefile.postamble (.PHONY): Unused target removed. * Makefile.postamble: Use ECHO_NOTHING, ECHO_CREATING, END_ECHO. (after-distclean): Clean everything in a single command. Fri Oct 17 14:04:27 2003 Nicola Pero * Makefile.postamble (regenerate, stamp-regenerate): Do-nothing targets removed. * Tools/Makefile.postamble (after-install): Use ECHO_NOTHING, END_ECHO. * Tools/Makefile.preamble: Commented out unused line. Thu Oct 16 21:45:00 2003 Richard Frith-Macdonald * GSPrivate.h: Try to think of better macro names and documentation for stack/heap allocation. * NSArray.m: Use new macro names. Thu Oct 16 19:30:00 2003 Richard Frith-Macdonald * configure.ac: Check for sigaction() * configure: regenerate * Headers/Additions/GNUstepBase/config.h.in: Notice sigaction * Source/GSFileHandle.m: Remove SIGPIPE code * Source/GSTcpPort.m: ditto * Source/NSMessagePort.m: ditto * Source/NSSocketPort.m: ditto * Source/NSObject.m: New code to ignore SIGPIPE unless it's being explicitly handled. Use sigaction so we can test to see if there is a handler installed without temporarily unsetting it (as signal does) so that it is safe in a multi-threaded system. Thu Oct 16 16:45:00 2003 Richard Frith-Macdonald * Source/GSFileHandle.m: * Source/NSMessagePort.m: * Source/NSSocketPort.m: Only ignore SIGPIPE if there is no handler set up for it. If some other code has set up a handler before GNUstep code is used, we should not be overriding that handler as the external code may later depend on receiving the signal. Many thanks to Nicola for the investigative work leading up to this realisation. Thu Oct 16 15:57:39 2003 Nicola Pero * Source/NSObject.m: Do not include signal.h. Wed Oct 15 12:36:33 2003 Nicola Pero * SSL/Makefile.postamble: Removed regenerate, TAGS and FORCE rules. Removed rule that GSSSLHandle.o depends on GNUSTEP_TARGET_DIR/config.h - this dependency is automatically determined by gnustep-make. Wed Oct 15 12:17:24 2003 Nicola Pero * Source/Makefile.postamble: Removed regenerate, TAGS and FORCE rules. Wed Oct 15 12:14:32 2003 Nicola Pero * NSTimeZones/GNUmakefile: Removed DIST_FILES variable. * NSTimeZones/Makefile.postamble: Removed regenerate rule. Wed Oct 15 12:10:35 2003 Nicola Pero * Tools/GNUmakefile: Removed HEADERS, SOURCES, DIST_FILES variables. * Tools/Makefile.postamble: Removed regenerate, copy-dist and documentation rules. Wed Oct 15 11:48:42 2003 Nicola Pero * Testing/GNUmakefile: Removed HDRS, SRCS, DIST_FILES, DYNAMIC_HFILES, DYNAMIC_MFILES variables. Do not set GNUSTEP_INSTALLATION_DIR. Manually disable installation of LoadMe bundle. * Testing/Makefile.postamble: Removed regenerate and copy-dist rules. Wed Oct 15 11:36:49 2003 Nicola Pero * Examples/GNUmakefile: Removed HDRS, SRCS, DIST_FILES variables. Do not set GNUSTEP_INSTALLATION_DIR. * Examples/Makefile.postamble: Removed regenerate and copy-dist rules. Wed Oct 15 11:23:43 2003 Nicola Pero * Source/Makefile.postamble: Removed rules to rebuild object files depending on headers included. gnustep-make does it automatically without the need of keeping lists updated. 2003-10-14 Bruno Haible * Source/NSString.m (parseQuotedString): Fix interpretation of octal escape sequences. 2003-10-14 Richard Frith-Macdonald * GSPrivate.h: New macros to aid with appropriate use of stack or heap for allocating temporary storage. * NSArray.m: Use new OBUFBEGIN() and OBUFEND() macros. 2003-10-09 Adam Fedor * configure.ac: Add special check for sys/mount.h for NetBSD. * Testing/GNUmakefile: Only make CHECKABLE_TOOLS by default. 2003-10-09 Richard Frith-Macdonald * GSArray.m: memory leak decoding a placeholder fixed. Patch by 2003-10-08 Richard Frith-Macdonald * Tools/gdomap.c: Added some checks that getting/setting uid/gid worked as expected and moved getpwnam() call to where it works. * Source/Additions/GSMime.m: ([GSMimeDocument-rawMimeData:]) bugfix to remove mjime version header from inner documents. * Source/NSDebug.m: Additional functions for tracking memory problems. * Source/NSBundle.m: Fixup for windows. * Source/NSFileManager.m: Fixup for windows. * Source/NSString.m: Fixup for windows. Windows fixups adapted from patch by * Source/NSArray.m: Fix memory leak initialising from coder. * Source/NSCountedSet.m: ditto * Source/NSSet.m: ditto * Source/NSDebug.m: Hook to change allocation checking functions. Memory fixes adapted from patch by 2003-10-07 Richard Frith-Macdonald * Source/Additions/GSMime.m: ([GSMimeDocument-setContentType:]) New convenience method. 2003-10-05 Adam Fedor * Documentation/GNUmakefile: Make manual * Source/DocMakefile: Remove dependencies file when cleaning. * Version: Bump to 1.8.90 2003-10-03 Adam Fedor * configure.ac: Use -Wl for netbsd linker options. 2003-10-02 Richard Frith-Macdonald * Source/Additions/GSMime.m: ([GSMimeDocument-makeBoundary]) fixed memory leak. 2003-09-30 Adam Fedor * config/procfs.m4: Force disable /proc on Irix. Force enable on cygwin. 2003-09-30 Richard Frith-Macdonald * Source/NSThread.m: Protect the function handling notification of the process becoming multi-threaded with a recursive lock. This protection ensures that there is no race condition where two threads can start using GNUstep simultaneously and both end up sending out notifications etc. Not a problem in normal ObjC applications, but a possibility where other non-gnustep code starts multiple threads which want to access gnustep. 2003-09-30 Derek Zhou * Source/NSCharacterSet.m: patch to ensure lock is created as soon as the process goes multi-threaded, therefore avoiding a race condition causing a rare exception. 2003-09-26 Richard Frith-Macdonald * Source/NSString.m: Fix pathExtension bug reported by Roland Schwingel. Was failing to handle the case when a dot appears inside a path component properly. 2003-09-26 Adam Fedor * Version 1.8.0 on branch. 2003-09-25 Richard Frith-Macdonald * Source/NSConnection.m: Fix obscure bug releasing in-progress request information on connection deallocation. 2003-09-23 Adam Fedor * Source/Additions/Makefile.preamble: Add DLL build flag for cyginw * Testing/Makefile.postamble (check): Make CHECKABLE_TOOLS only * Tools/AGSHtml.m: Remove duplicate interface (on *-apple-*) * Tools/AGSIndex.m: Idem. 2003-09-23 Adam Fedor * Source/NSTimeZone.m (+systemTimeZone): Remove tzname extern decl. 2003-09-22 Adam Fedor * configure.ac: Check for getopt * Tools/gdomap.c: Use local getopt if no native getopt 2003-09-21 Adam Fedor * Tools/cvtenc.m (main): Write using local/set encoding when EscapeIn=YES. * Documentation/coding-standards.texi: Add section about object persistance. * configure.ac: Make it possible to override --enable-pass-arguments when on cygwin. * configure: Regenerate using 2.57 2003-09-20 yjchen * Resources/Languages/TraditionalChinese: Quote escaped strings. 2003-09-13 Richard Frith-Macdonald * Source/NSConnection.m: Add a couple of checks to raise exceptions when trying to use a connection from the wrong thread. Also, change the code for handling multithreaded connections so that they are removed from the runloops of exiting threads in response to the thread exit notification. 2003-09-13 David Ayers * Headers/Additions/GNUstepBase/GSCategories.h: Move declarations from Source/Additions/GSCompatibility.h to here. ([NSObject -compare:]): Deprecate. * Source/Additions/GSCompatibility.h: Move contents from here to Headers/Additions/GNUstepBase/GSCategories.h. * Source/Additions/GSCategories.m: ([NSObject -compare:]): Deprecate. * Headers/Foundation/NSObject.h ([NSObject -compare:]): Deprecate. * Source/Additions/GCDictionary.m: Include GNUstepBase/GSCategories.h rather than GSCompatibility.h. * Source/Additions/GCObject.m: Ditto. * Source/Additions/GSMime.m: Ditto. * Source/Additions/GSObjCRuntime.m: Ditto. * Source/Additions/GSXML.m: Ditto. * Source/Additions/Unicode.m: Ditto. * macosx/GNUstepBase/preface.h: Update include for new header structure. 2003-09-11 Adam Fedor * macosx/preface.h: Removed * macosx/GNUstepBase/preface.h: New * macosx/gnustep.pbproj/project.pbxproj: Update (from Philip Moetteli ). 2003-09-11 Philip Moetteli * Source/Additions/GSCompatibility.h * Source/Additions/GSCompatibility.m (NSDecimalFromComponents): Added compatibility function. 2003-09-11 Richard Frith-Macdonald * Source/Unicode.m: Fix minor errors in utf8 handling. Use endian version of UTF16 to avoid iconv inserting BOM where it is not wanted. 2003-09-10 David Ayers * Headers/Additions/GNUstepBase/GSObjCRuntime.h (GSObjCSuper): Added test for uninitialized superclass reference. 2003-09-10 Richard Frith-Macdonald * Source/NSObject.m: Tidy use of GSObjCRuntime a little. 2003-09-10 Pete French * Source/Additions/Unicode.m: patch to use UTF16 rather than UCS2 internally. 2003-09-10 Richard Frith-Macdonald * Source/NSCalendarDate.m: ([years:months:days:hours:minutes:seconds:sinceDate:]) fix to return all positive values for a difference from a date in the past. 2003-09-07 Adam Fedor * Source/NSBundle.m (+_addFrameworkFromClass:): Check _loadingBundle != bundle when removing classes. 2003-09-07 S.J.Chun * Source/Unicode.m: Added Korean encoding * Headers/Foundation/NSString.h: Added Korean encoding * Source/Additions/GSCompatibility.h: Idem. Sun Sep 7 13:35:15 2003 Nicola Pero * configure.ac: Fixed GNUSTEP_HDIR when not flattened. * configure: Regenerated. 2003-09-05 Adam Fedor * Headers/Additions/GNUstepBase/behavior.h: GS_EXPORT functions. 2003-09-04 18:41 Alexander Malmberg * Headers/Foundation/NSDistributedLock.h, Source/NSDistributedLock.m: Change return type of -initWithPath: to id. 2003-09-02 Adam Fedor * configure.ac: Check for tzset * Source/NSTimeZone.m (+systemTimeZone): Use it to find time zone (as a last resort). 2003-09-02 Adam Fedor * Tools/gdnc.m (main): Don't mess with file descriptors on MinGW. 2003-09-01 Adam Fedor * Tools/gdomap.c (main): Move getuid call inside #ifndef MINGW like the others. 2003-08-31 Adam Fedor * Tools/gdnc.m (main): Close any open file descriptors so we can be a proper daemon. Fixes #4938. 2003-08-29 Adam Fedor * config/procfs.m4: Disable procfs for solaris 2003-08-26 Adam Fedor * Source/NSMessagePort.m: For older OS comptibility, define some macros if they are not already defined. * Source/NSMessagePortNameServer.m: Idem. 2003-08-24 David Ayers * Headers/Additions/GNUstepBase/GSObjCRuntime.h (GSObjCClass): Allow nil values. (GSObjCIsInstance): Ditto. (GSObjCIsClass): New function. (GSClassNameFromObject): Ditto. (GSObjCIsKindOf): Use GSObjCSuper() in favor of class_get_super_class(). * Headers/Foundation/NSRange.h (GS_RANGE_CHECK), (CHECK_INDEX_RANGE_ERROR): Use GSNameFromSelector() in favor of sel_get_name(). * Source/GSFFCallInvocation.m (gs_method_for_receiver_and_selector), (gs_find_best_typed_sel), (-[GSFFCallInvocation invokeWithTarget:]), (GSInvocationCallback): Use GSObjCIsInstance() in favor of object_is_instance, GSObjCClass() in favor of object_get_class(), GSObjCIsClass() in favor of object_is_class(), GSNameFromSelector() in favor of sel_get_name(), GSObjCSuper() in favor of class_get_super_class() and GSClassNameFromObject() in favor of object_get_class_name(). * Source/GSFFIInvocation.m (gs_method_for_receiver_and_selector), (gs_find_best_typed_sel), (-[GSFFIInvocation invokeWithTarget:]), (GSFFIInvocationCallback): Use GSObjCIsInstance() in favor of object_is_instance, GSObjCClass() in favor of object_get_class(), GSObjCIsClass() in favor of object_is_class(), GSNameFromSelector() in favor of sel_get_name(), GSObjCSuper() in favor of class_get_super_class() and GSClassNameFromObject() in favor of object_get_class_name(). * Source/NSConnection.m (-[NSConnection forwardForProxy:selector:argFrame:]), (-[NSConnection forwardInvocation:forProxy:]): Use GSNameFromSelector() in favor of sel_get_name(). * Source/NSDistantObject.m (class_is_kind_of): Use GSObjCSuper in favor of class_get_super_class(). (-[NSDistantObject forward::]): Use GSNameFromSelector() in favor of sel_get_name(). * Source/NSInvocation.m (-[NSInvocation invokeWithTarget:]) Use GSObjCSuper() in favor of class_get_super_class(), GSObjCIsInstance() in favor of object_is_instance() (-[NSInvocation description]): Use GSClassNameFromObject in favor of object_get_class_name(). Avoid buffer overflow by using snprintf() in favor of sprintf(). (-[NSInvocation initWithSelector:]): Use GSNameFromSelector() in favor of sel_get_name(). * Source/NSObject.m (GSDescriptionForInstanceMethod), (GSDescriptionForClassMethod), (+[NSObject superclass], (-[NSObject description]), (-[NSObject doesNotRecognizeSelector:]), (-[NSObject performSelector:]), (-[NSObject performSelector:withObject:]), (+[NSObject setVersion:], -[NSObject error:]), (-[NSObject doesNotRecognize:], -[NSObject isClass]), (-[Object description]): Use GSNameFromSelector() in favor of sel_get_name(), GSObjCSuper() in favor of class_get_super_class(), GSClassNameFromObject() in favor of object_get_class_name() and GSObjCIsClass() in favor of object_is_class(). * Source/NSProxy.m (+[NSProxy description]), (-[NSProxy description]), (+[NSProxy superclass]), (-[NSProxy forwardInvocation:]), (-[NSProxy init], (-[NSProxy notImplemented:]), (-[NSProxy performSelector:]), (-[NSProxy performSelector:withObject:]), (-[NSProxy performSelector:withObject:withObject:]): Use GSClassNameFromObject() in favor of object_get_class_name(), GSObjCSuper() in favor of class_get_super_class() and GSNameFromSelector() in favor of sel_get_name(). * Source/Additions/GSCategories.m (-[NSObject notImplemented:]), (-[NSObject shouldNotImplement:]), (-[NSObject subclassResponsibility:]): Use GSNameFromSelector() in favor of sel_get_name() and GSClassNameFromObject() in favor of object_get_class_name(). * Source/Additions/GSCompatibility.h (GS_RANGE_CHECK): Use GSNameFromSelector() in favor of sel_get_name(). * Source/Additions/GSCompatibility.m (+[NSObject notImplemented:]): Use GSNameFromSelector() in favor of sel_get_name() and GSClassNameFromObject() in favor of object_get_class_name(). * Source/Additions/GSObjCRuntime.m (GSObjCMethodNames), (GSObjCAddMethods): Use GSNameFromSelector() in favor of sel_get_name(). * Testing/nsbundle.m (main): Update to reflect filesystem change. Use GSClassNameFromObject() in favor of object_get_class_name(). * Testing/nsconnection_server.m Use GSNameFromSelector() in favor of sel_get_name(). * Testing/Makefile.postamble: Build before checking. 2003-08-23 Adam Fedor * Version 1.7.3 2003-08-23 Adam Fedor * configure.ac: Fix mistake in checking for ffi. * Tools/AGSIndex.m: Add NSString compatibility interface when compiling on apple-apple-apple. * Tools/AGSHtml.m: idem. 2003-08-15 Richard Frith-Macdonald * Source/NSObject.m: Trivial cast to avoid compiler warnings. 2003-08-20 13:59 Alexander Malmberg Clean up code to remove warnings issued by (what will become) gcc 3.4. * Source/GSString.m, Source/NSArchiver.m, Source/NSAttributedString.m, Source/NSRunLoop.m: Don't return values from methods returning void. 2003-08-19 Adam Fedor * configure.ac: Clarify ffi interface warnings and disable_do on apple-apple-apple. Fixes #4824 2003-08-15 Richard Frith-Macdonald * Source/NSObject.m: Move hacked methods for getting protocol method info into functions so we can use them without going through the ObjC runtime. * Source/NSDistantObject.m: When attempting to check protocols, use functions from NSObject.m if the protocol has not been properly initialised (its class pointer is 0x2) as is the case for all but very recent versions of the compiler. FIXME ... this code should be removed at some future date when all common systems have shipped with a working compiler for a while. 2003-08-13 David Ayers * Headers/Additions/GNUstepBase/preface.h: Remove generated file that should have been ignored by entry in .cvsignore. * Source/UnixFileHandle.m: Remove obsolete file. 2003-08-05 Martin Brecher * Tools/gdnc.1: Updated man pages, fixed typos, unified format and layout. Man pages are now installed unprocessed as it should be. * Tools/gdomap.8: ditto. 2003-08-12 Yen-Ju Chen * Source/Additions/Unicode.m (GetAvailableEncodings): Include last encoding. 2003-08-08 Richard Frith-Macdonald * Source/Additions/GSXML.m: save and restore libxml global settings before/after each parse operation. 2003-08-07 Richard Frith-Macdonald * Source/NSString.m: nodeToObject() fix error in handling escape sequences in strings ... only treat a backslash specially when it is immediately followed by 'U' or 'u' and four hexadecimal digits. ensure data ia deallocated promptly. * Source/GSCompatibility.m: match changes to property list escapes * Source/Additions/GSXML.m: change ownership policy so that nodes are owned by theri parents, never by siblings ... prevent stack overflow deallocating nodes in long documents. * Tools/plist-0_9.dtd: document unicode escapes. 2003-08-02 Adam Fedor * Source/NSProxy.m: Fix limit.h -> limits.h 2003-08-02 Yen-Ju Chen * Resources/Languages/TraditionalChinese, Resources/TraditionalChinese.lproj: New * Resources/GNUmakefile: Install them. 2003-08-01 Richard Frith-Macdonald * Source/NSProxy.m: Include limits.h for UINT_MAX * Source/NSProcessInfo.m: Avoid crash when given invalid argument list * Source/NSString.m: Minor cleanup for coding standards and remove pointer dereferencing of object which causes problems with new compiler Problems reported by Alexander and Roland 2003-07-31 David Ayers * Created tag 'pre-header-reorg-20030731'. * Headers/Additions/GNUstepBase: New directory. * Headers/Additions/GNUstepBase/unicode: Ditto. * Headers/Foundation: Ditto. * Headers/gnustep/base: Obsoleted. * Headers/gnustep/unicode: Ditto. * Headers/Additions/GNUstepBase/DistributedObjects.h: Moved here from Headers/gnustep/base. * Headers/Additions/GNUstepBase/GCObject.h: Ditto. * Headers/Additions/GNUstepBase/GNUstep.h: Ditto. * Headers/Additions/GNUstepBase/GSCategories.h: Ditto. * Headers/Additions/GNUstepBase/GSConfig.h.in: Ditto. * Headers/Additions/GNUstepBase/GSFileHandle.h: Ditto. * Headers/Additions/GNUstepBase/GSIArray.h: Ditto. * Headers/Additions/GNUstepBase/GSIMap.h: Ditto. * Headers/Additions/GNUstepBase/GSLocale.h: Ditto. * Headers/Additions/GNUstepBase/GSMime.h: Ditto. * Headers/Additions/GNUstepBase/GSObjCRuntime.h: Ditto. * Headers/Additions/GNUstepBase/GSUnion.h: Ditto. * Headers/Additions/GNUstepBase/GSXML.h: Ditto. * Headers/Additions/GNUstepBase/Unicode.h: Ditto. * Headers/Additions/GNUstepBase/behavior.h: Ditto. * Headers/Additions/GNUstepBase/config.h.in: Ditto. * Headers/Additions/GNUstepBase/objc-gnu2next.h: Ditto. * Headers/Additions/GNUstepBase/preface.h.in: Ditto. * Headers/Additions/GNUstepBase/thr-mach.h: Ditto. * Headers/Additions/GNUstepBase/.cvsignore: Ditto. * Headers/Additions/GNUstepBase/unicode/caseconv.h: Moved here from Headers/gnustep/unicode. * Headers/Additions/GNUstepBase/unicode/cop.h: Ditto. * Headers/Additions/GNUstepBase/unicode/cyrillic.h: Ditto. * Headers/Additions/GNUstepBase/unicode/decomp.h: Ditto. * Headers/Additions/GNUstepBase/unicode/gsm0338.h: Ditto. * Headers/Additions/GNUstepBase/unicode/latin2.h: Ditto. * Headers/Additions/GNUstepBase/unicode/latin9.h: Ditto. * Headers/Additions/GNUstepBase/unicode/nextstep.h: Ditto. * Headers/Additions/GNUstepBase/unicode/thai.h: Ditto. * Headers/Foundation/Foundation.h: Moved here from Headers/gnustep/base. * Headers/Foundation/NSArchiver.h: Ditto. * Headers/Foundation/NSArray.h: Ditto. * Headers/Foundation/NSAttributedString.h: Ditto. * Headers/Foundation/NSAutoreleasePool.h: Ditto. * Headers/Foundation/NSBitmapCharSet.h: Ditto. * Headers/Foundation/NSBundle.h: Ditto. * Headers/Foundation/NSByteOrder.h: Ditto. * Headers/Foundation/NSCalendarDate.h: Ditto. * Headers/Foundation/NSCharacterSet.h: Ditto. * Headers/Foundation/NSClassDescription.h: Ditto. * Headers/Foundation/NSCoder.h: Ditto. * Headers/Foundation/NSConcreteNumber.h: Ditto. * Headers/Foundation/NSConnection.h: Ditto. * Headers/Foundation/NSData.h: Ditto. * Headers/Foundation/NSDate.h: Ditto. * Headers/Foundation/NSDateFormatter.h: Ditto. * Headers/Foundation/NSDebug.h: Ditto. * Headers/Foundation/NSDecimal.h: Ditto. * Headers/Foundation/NSDecimalNumber.h: Ditto. * Headers/Foundation/NSDictionary.h: Ditto. * Headers/Foundation/NSDistantObject.h: Ditto. * Headers/Foundation/NSDistributedLock.h: Ditto. * Headers/Foundation/NSDistributedNotificationCenter.h: Ditto. * Headers/Foundation/NSEnumerator.h: Ditto. * Headers/Foundation/NSException.h: Ditto. * Headers/Foundation/NSFileHandle.h: Ditto. * Headers/Foundation/NSFileManager.h: Ditto. * Headers/Foundation/NSFormatter.h: Ditto. * Headers/Foundation/NSGeometry.h: Ditto. * Headers/Foundation/NSHashTable.h: Ditto. * Headers/Foundation/NSHost.h: Ditto. * Headers/Foundation/NSInvocation.h: Ditto. * Headers/Foundation/NSKeyValueCoding.h: Ditto. * Headers/Foundation/NSLock.h: Ditto. * Headers/Foundation/NSMapTable.h: Ditto. * Headers/Foundation/NSMethodSignature.h: Ditto. * Headers/Foundation/NSNotification.h: Ditto. * Headers/Foundation/NSNotificationQueue.h: Ditto. * Headers/Foundation/NSNull.h: Ditto. * Headers/Foundation/NSNumberFormatter.h: Ditto. * Headers/Foundation/NSObjCRuntime.h: Ditto. * Headers/Foundation/NSObject.h: Ditto. * Headers/Foundation/NSPathUtilities.h: Ditto. * Headers/Foundation/NSPort.h: Ditto. * Headers/Foundation/NSPortCoder.h: Ditto. * Headers/Foundation/NSPortMessage.h: Ditto. * Headers/Foundation/NSPortNameServer.h: Ditto. * Headers/Foundation/NSProcessInfo.h: Ditto. * Headers/Foundation/NSProtocolChecker.h: Ditto. * Headers/Foundation/NSProxy.h: Ditto. * Headers/Foundation/NSRange.h: Ditto. * Headers/Foundation/NSRunLoop.h: Ditto. * Headers/Foundation/NSScanner.h: Ditto. * Headers/Foundation/NSSerialization.h: Ditto. * Headers/Foundation/NSSet.h: Ditto. * Headers/Foundation/NSString.h: Ditto. * Headers/Foundation/NSTask.h: Ditto. * Headers/Foundation/NSThread.h: Ditto. * Headers/Foundation/NSTimeZone.h: Ditto. * Headers/Foundation/NSTimer.h: Ditto. * Headers/Foundation/NSURL.h: Ditto. * Headers/Foundation/NSURLHandle.h: Ditto. * Headers/Foundation/NSUndoManager.h: Ditto. * Headers/Foundation/NSUserDefaults.h: Ditto. * Headers/Foundation/NSUtilities.h: Ditto. * Headers/Foundation/NSValue.h: Ditto. * Headers/Foundation/NSZone.h: Ditto. * Soruce/GSFormat.h: Ditto. * Source/GSInvocation.h: Moved here from Headers/gnustep/base. * Source/objc-load.h: Ditto. * configure.ac: Update to new header structure. * configure: Regenerated. * Makefile.postamble: Remove handling of header-links and update to new header structure. * Source/GNUmakefile: Update to new header structure. Always install GSFileHandle.h, GSLocal.h, GSUnion.h, GSIArray.h, GSIMap.h, preface.h as public headers. Do not install DistributedObjects.h, objc-load.h and thr-mach.h. Install GSMime.h and GSXML.h in GNUstepBase instead of Foundation. Include CompatibilityHeaders.make makefile fragement. * Source/Makefile.preamble: Update to new header structure. Split HEADER_DIR into HEADER_DIR_BASE and HEADER_DIR_FND. * Source/Makefile.postamble: Update to new header structure. Do not install mframe.h. Update for HEADER_DIR split. * Source/CompatibilityHeaders.make: New file which installs dummy headers in the place of the old headers, warning about obsoleting the old location and includeing the header from its new location. * Source/Additions/Makefile.preamble: Update to new header structure. Only add -I../../Headers for *-gnu-*. * Source/*.[hm]: Update includes for new header structure. * Source/Additions/*.m: Ditto. * Source/mframe/mframe.head: Ditto. * Source/.cvsignore: Ignore config.h. * Testing/Makefile.preamble: Update to new header structure. Only add -I../../Headers for *-gnu-*. * Testing/*.[hm]: Update includes for new header structure. * Tools/Makefile.preamble: Update to new header structure. Only add -I../../Headers for *-gnu-*. * Tools/*.[hm]: Update includes for new header structure. * Tools/make_strings/GNUmakefile.preamble: Update to new header structure. Only add -I../../Headers for *-gnu-*. * Source/DocMakefile: Update to new header structure. * SSL/Makefile.preamble: Update to new header structure. * SSL/GSSSLHandle.m: Ditto. * Examples/Makefile.preamble: Use -I../Headers only with *-gnu-*. * Headers/gnustep/base/UnixFileHandle.h: Removed. * Headers/gnustep/base/WindowsFileHandle.h: Ditto. 2003-07-30 Richard Frith-Macdonald * Tools/gdomap.c: Some security fixes and tweaks. 2003-07-28 Richard Frith-Macdonald * Source/GSFFCALLInvocation.m: Make exception text more meaningful * Source/GSFFIInvocation.m: ditto * Source/Additions/GSXML.m: Add a couple of convenience methods to test node type. * Source/Additions/GSMime.m: Add convenience method for putting a new header in a document. * Source/NSCalendarDate.m: Tweak to avoid useless compiler warning. * Source/NSRunLoop.m: ditto * Source/NSURL.m: ditto * Source/Additions/GSMime.m: ditto * Source/Additions/Unicode.m: ditto 2003-07-27 Gregory John Casamento & Alexander Malmberg * Source/Additions/GSObjCRuntime.m: GSObjCMethodNames was not returning all methods for the object given. 2003-07-27 Richard Frith-Macdonald * Source/NSInvocation.m: implement methodSignatureForSelector for proxy. 2003-07-26 Richard Frith-Macdonald * Source/GSFFCALLInvocation.m: Add evil hack to cope with cases where type info was not available and we assumed a method returning an id but the actual method returned void. * config/procfs.m4: Test for procfs using 'mount' 2003-07-25 Richard Frith-Macdonald * Source/NSDistributedNotificationCenter.m: Partially reverted last change ... seemed to cause problems on some systems. * Tools/gdnc.m: ditto. * Source/NSDebug.m: Small thread safely fix. * Source/NSThread.m: Avoid multiple copies of housekeeping timer. * Source/NSConnection.m: Fix thread related memory leak leaving an NSRunLoop in a connection when the connection is no longer using it. * Source/NSURL.m: retain handle while doing background load. 2003-07-23 Richard Frith-Macdonald * Source/NSObject.m: Implement methodSignatureForSelector for zombies * Source/DocMakefile: Only remove directory with stamp for 'clean' 2003-07-22 Adam Fedor * Version 1.7.2 2003-07-22 Jeremy Bettis * Headers/gnustep/base/objc-gnu2next.h (class_nextMethodList): Fix macro to return the method list. 2003-07-22 Richard Frith-Macdonald * Tools/AGSHtml.m: Don't output authors heading if not needed. * Source/NSUser.m: Use HOMEPATH in preference to USERPROFILE for OPENSTEP compatibility and because USERPROFILE generally doesn't work due to the presence of spaces. * Headers/gnustep/base/NSDebug.h: Minor documentation fix. * Headers/gnustep/base/NSHashTable.h: ditto * Headers/gnustep/base/NSPort.h: ditto * Headers/gnustep/base/NSPortNameServer.h: ditto * Source/DocMakefile: Document serialization classes * Source/NSDebug.m: Fix broken cross reference * Source/NSLog.m: ditto * Source/NSMessagePortNameServer.m: Tidied * Source/NSPortNameServer.m: Tidied and documented. * Source/NSSocketPortNameServer.m: Documented and fixed methods to return NO on failure rather than raising exception. * Source/NSUndoManager.m: Fix documentation markup errors. 2003-07-21 Richard Frith-Macdonald * Source/Additions/Unicode.m (GROW): Fix shifting of pointers into local buffer for case where we are leaving room for a null terminator. This avoids moving pointer back before start of buffer. 2003-07-21 Roland Schwingel * Source/libgnustep-base-entry.m: Don't create unnecessary window. Mon Jul 21 11:03:48 2003 Nicola Pero * Tools/HTMLLinker.m: Removed. * Tools/HTMLLinker.html: Removed. * Tools/GNUmakefile: Do not compile it. 2003-07-20 Richard Frith-Macdonald * Source/NSProxy.m: Implement essential methods for a proxy to be vended over an NSConnection. 2003-07-20 17:27 Alexander Malmberg * Source/NSConnection.m (-invalidate): Don't kill the targetToCached timer when invalidating a connection. 2003-07-20 Richard Frith-Macdonald * Source/NSThread.m: Separate out sleeping into a more efficient function and improve use of nanosleep * Source/NSLock.m: Use new private sleeping function from NSThread.m and rewrite code to be more responsive, especially for cases where locks are heavily used for rapid interaction between threads. * Tools/thread.m: Test lockBeforeDate 2003-07-17 Richard Frith-Macdonald * Source/NSRunLoop.m: ([-acceptInputForMode:beforeDate:]) use the NSThread method to sleep rather than re-implementing it. * configure.ac: Check for nanosleep() * Headers/Foundation/config.h.in: Add entry for nanosleep * Source/NSThread.m: Use nanosleep if available. * Headers/Foundation/NSProcessInfo.h: Added new methods - ([-setDebugLoggingEnabled:]) and ([-debugLoggingEnabled]) * Source/NSProcessInfo.m: ditto 2003-07-16 David Ayers * config.make.in: Default to builing -baseadd on non *-gnu-* configurations. 2003-07-15 Richard Frith-Macdonald * Headers/gnustep/base/NSArray.h: Add methods for creating from URL * Headers/gnustep/base/NSDictionary.h: ditto * Source/NSArray.m: ditto * Source/NSDictionary.m: ditto 2003-07-15 David Ayers * Headers/gnustep/base/NSUndoManager.h: Add NSUndoCloseGroupingRunLoopOrdering enum. Replace instance variables _registeredUndo with _runLoopGroupingPending and _actionName with _unused1. * Source/NSUndoManager.m: Added documentation. Added actionName instance variable to PrivateUndoGroup. (-[PrivateUndoGroup actionName]): New method. (-[PrivateUndoGroup setActionName]): Ditto. (-[PrivateUndoGroup dealloc]): Release new instance variable. (-[PrivateUndoGroup initWithParent:]): Initialize actionName. (-[NSUndoManager forwardInvocation]): Implicitly call beginUndoGrouping if group has not been setup and we are grouping by events. Register _loop: invocation if none is already pending and if we are grouping by event. (-[NSUndoManager registerUndoWithTarget:selector:object]): Ditto. (-[NSUndoManager methodSignatureForSelector:]): Overriden to forward request to target supplied by -prepareWithInvocationTarget: if available. (-[NSUndoManager _loop:]): Set flag to determine pending _loop: processing. (-[NSUndoManager init]): Removed access to _actionName. Have receiver default to group by event. (-[NSUndoManager dealloc]): Ditto. (-[NSUndoManager enableUndoRegistration]): Remove access to _registeredUndo. (-[NSUndoManager redo]): Simplified implementation. (-[NSUndoManager redoActionName:]: Retrieve action name from first grouping of the redo stack. (-[NSUndoManager redoMenuTitleForUndoActionName:]): Add comment about localization. (-[NSUndoManager undoMenuTitleForUndoActionName:]): Ditto. (-[NSUndoManager setActionName:]): Forward call to current grouping. (-[NSUndoManager undoActionName:]: Retrieve action name from first grouping of the undo stack. (-[NSUndoManager setRunLoopModes:]): Use correct run loop ordering and set flag for pending _loop: invocation. (-[NSUndoManager undoNestedGroup]): Removed special case handling of _registeredUndo. Raise NSInternalInconsistencyException if grouping is still in progress. Simplified implementation. 2003-07-15 Alexander Malmberg * Source/NSConnection.m: When creating new connection with registered name on host, ensure that send and receive ports are of same class. * Source/NSMessagePort.m: New for private local connections. * Source/NSMessagePortNameServer.m: New for private local connections. * Source/NSPortNameServer.m: Made abstract * Source/NSSocketPortNameServer.m: Concrete version based on original. * Source/NSSocketPort.m: GSTcpPort.m renamed Alexanders modifications added by RFM and altered slightly to use NSSocketPort by default and to refrain from building new code under windows, so this *shouldn't* break any existing code I hope. 2003-07-15 Richard Frith-Macdonald * Source/NSDistributedNotificationCenter.m: Use loopback network interface for local center. * Tools/gdnc.m: ditto. 2003-07-11 David Ayers * Source/GNUmakefile: Make GNUstep.h public. * Source/Additions/GSXML.m: Use cached NSString class variable. * Source/Additions/GSObjCRuntime.m (GSCGetInstanceVariableDefinition): Make more robust. 2003-07-11 Richard Frith-Macdonald * Headers/Foundation/NSPort.h: Tweak for mingw and correct conditional compilation to only include NSSocketPort for MacOS-X * Source/GSFileHandle.m: Incorporate S.J.Chuns mingw fixes with huge simplification to avoid lots of conditional compilation. * Source/GSTcpPort.m: ditto. * Source/NSSocketPort.m: ditto. 2003-07-11 02:33 Alexander Malmberg * Source/NSAssertionHandler.m: Use the correct key to store the NSAssertionHandler in the thread dictionary, and document the storing and the key. 2003-07-09 15:54 Alexander Malmberg * Source/Additions/Unicode.m (GSToUnicode, GSFromUnicode): Make sure dst isn't set to NULL in GSToUnicode, too. Make sure it is set if an allocated buffer turns out not to need resizing. 2003-07-09 02:41 Alexander Malmberg * Source/GSString.m (getCString_u): Rewrite to correctly handle all encodings, the range argument, and the leftoverRange attribute. * Source/Additions/Unicode.m (GSToUnicode): Clarify the documentation (and fix a few typos in it). (GSFromUnicode): Clarify the documentation. Signal failure correctly from the utf8 encoder. Make sure dst isn't set to NULL if zone is NULL but *size is 0. 2003-07-08 Richard Frith-Macdonald * Source/NSString.m: Avoid using atof() in parsing plists ... we don't want libc localised handling of numbers. 2003-07-08 03:44 Alexander Malmberg * Source/Additions/Unicode.m (GSToUnicode, GSFromUnicode): In iconv case, only try to expand the buffer when we really need extra space. Correctly handle all output from flushing iconv. 2003-07-08 03:03 Alexander Malmberg * Source/NSConnection.m (-locateLocalTarget:): The targetToCached map contains CachedLocalObject:s, not GSLocalCounter:s. Extract the GSLocalCounter from the CachedLocalObject. Unlock the global_proxies_gate lock before calling -proxyWithLocal:connection:. 2003-07-07 David Ayers * Headers/gnustep/base/GSObjCRuntime.h: * Source/Additions/GSObjCRuntime.m: Added typedef for GSIVar. (GSCGetInstanceVariableDefinition): New function. (GSObjCGetInstanceVariableDefinition): Ditto. * Testing/nstimer.m ([TestDouble -sayCount]): Quit test after 20 invocations. 2003-07-07 Richard Frith-Macdonald * Source/Source/GSFFCallInvocation.m: gs_objc_msg_forward() trust the selector we are given. Rather than trying to find a better one. * Source/GSFFIInvocation.m: ditto * Source/NSScanner.m: Add a couple of internal utility functions. * Source/NSString.m: Fix floatValue and doubelValue to use non localised conversions. * Source/GSString.m: ditto. 2003-07-06 Adam Fedor * configure.ac: Add -R flags for netbsdelf 2003-07-06 Richard Frith-Macdonald * Tools/AGSHtml.m: Fix bug in linking to category methods from index. * Tools/AGSParser.m: Improve parsing of clock comments. 2003-07-05 Adam Fedor * configure.ac: Add flags for openbsd like freebsd. * Tools/gdnc.1, Tools/gdomap.8: Unzip * Tools/GNUmakefile (MAN1_PAGES): gzip man pages. 2003-07-04 Richard Frith-Macdonald * Source/NSDistributedNotificationCenter.m: Use -setProtocolForProxy: and implement dummy class to work around bug in old compilers. * Tools/gdnc.m: ditto * Source/NSDistantObject.m: Fix for calls to remote system where we can get no method signature. Documented. 2003-07-04 Richard Frith-Macdonald * Source/Source/GSFFCallInvocation.m: Modify to use local type information if it looks like it has come from a protocol ... as too much existing code is broken in that DO server objects which are supposed to conform to protocols in fact do not! * Source/GSFFIInvocation.m: ditto Fri Jul 4 11:09:37 2003 Nicola Pero * NSTimeZones/Makefile.postamble: Make the code more robust by adding rule to create the installation dirs. 2003-07-04 Richard Frith-Macdonald * Source/NSDistantObject.m: Avoid recursion fetching method signature. * Source/NSObject.m: ([methodSignatureForSelector:]) modified to take into account any protocols that the receiver conforms to, so the returned signature has the fullest possible type information. Category Protocol(Fixup) ... evil hack to work around runtime bug. * Source/GSFFCallInvocation.m: Fetch method signature from receiver in preference to using other info. Ensures we have correct info for the object we are sending the message to. * Source/GSFFIInvocation.m: ditto 2003-07-03 Richard Frith-Macdonald * Source/NSCalendarDate: ([-initWithString:calendarFormat:]) default year to 0001 s the gregorian calendar does not go earlier. ([-initWithYear:month:day:hour:minute:second:timeZone:]) don't override a previously set calendar format. 2003-07-01 David Ayers * Headers/gnustep/base/GSObjCRuntime.h/m (GSPrintf), * Headers/gnustep/base/NSObjCRuntime.h (GSPrintf), * Source/NSLog.m (GSPrintf): Moved implementation from NSLog.m to GSObjCRuntime.m and declaration from NSObjCRuntime.h to GSObjCRuntime.h. 2003-07-01 Richard Frith-Macdonald * Source/Additions/Unicode.m: Flush iconv buffer at end of conversion to handle obscure cases where it says it has converted all the input sequence, but hasn't written all the output. 2003-06-30 Richard Frith-Macdonald * Source/Additions/Unicode.m: Add 'UTF-7' so iconv can be used to handle utf7 if available. * Tools/AGSParser.m: Don't always strip asterisks from comments, Check first line of comment to see if it has one first. 2003-06-28 15:48 Alexander Malmberg * Tools/make_strings/StringsFile.h, Tools/make_strings/StringsFile.m, Tools/make_strings/make_strings.h, Tools/make_strings/make_strings.m: Clean up handling of key matching and ignoring. Add --aggressive-remove option. 2003-06-28 Richard Frith-Macdonald * Source/NSBundle.m: Don't NSLog when we can't find a localizable file ... log only when bundle debugging is turned on. 2003-06-27 Richard Frith-Macdonald * Source/NSPipe.m: Fix descriptor leak ... close on dealloc 2003-06-25 Adam Fedor * Tools/gdnc.1.gz: New file (from Martin Brecher). * Tools/GNUmakefile (MAN1_PAGES): Install it 2003-06-24 David Ayers * Source/GSFFCallInvocation.m (gs_method_for_receiver_and_selector): Replace usage of class_get_instance/class_method with GSGetInstance/ClassMethod and Method_t with GSMethod. (gs_find_by_receiver_best_typed_sel): Ditto. (GSInvocationCallback): Ditto. ([GSFFCallInvocation -invokeWithTarget:]): Ditto. * Source/GSFFIInvocation.m (gs_method_for_receiver_and_selector): Ditto. (gs_find_by_receiver_best_typed_sel): Ditto. (GSFFIInvocationCallback): Ditto. ([GSFFIInvocation -invokeWithTarget:]): Ditto. * Source/NSConnection.m ([NSConnection -_service_typeForSelector:]): Ditto. * Source/NSInvocation.m ([NSInvocation -invokeWithTarget:]): Ditto. * Source/NSObject.m ([NSObject +instanceMethodSignatureForSelector:]): Ditto. ([NDObject -methodSignatureForSelector:]): Ditto. ([NSObject +descriptionForInstanceMethod:]): Ditto. ([NSOnject -descriptionForMethod:]: Ditto. * Source/NSProxy.m ([NSProxy +methodSignatureForSelector:]): Ditto. ([NSProxy -methodSignatureForSelector:]): Ditto. * Source/NSDistantObject.m ([NSObject -selectorTypeForProxy:]): Ditto. ([NSDistantObject +respondsToSelector:]): Ditto. Corrected implementation to check class methods instead of instance methods. 2003-06-23 Adam Fedor * Testing/diningPhilosophers.m: Locking and output fixes (from Chris Beaham). * Testing/create-abbrevs, Testing/create-regions: Remove. 2003-06-23 Adam Fedor * Source/NSProcessInfo.m (+load): use the KVM library where available when procfs doesn't work (FreeBSD, others?) (patch from Pete French ). 2003-06-21 David Ayers * Headers/gnustep/base/objc-gnu2next.h: Remove simple mappings for class_get_class_method they cannot work due to different parameter expectations. Added mapping from NeXT->GNU runtime. The other way does not work. Added simple mapping for internal flush function __objc_update_dispatch_table_for_class and _objc_flush_caches. * Headers/gnustep/base/GSObjCRuntime.h/m: Added typedef for GSMethod. (GSGetInstanceMethod): New function. (GSGetClassMethod): Ditto. (GSGetInstanceMethodNotInherited): Ditto. (GSGetClassMethodNotInherited): Ditto. (GSFlushMethodCacheForClass): Ditto. (flush_method_cache_for_class): Removed function which is replaced by GSFlushMethodCacheForClass. (GSObjCGetMethod): Removed function which is replaced by GSGetInstanceMethod and GSGetClassMethod. (GSObjCReplaceMethod): Removed function. 2003-06-21 Adam Fedor * configure.ac: Check for libkvm. * configure, Headers/gnustep/base/config.h.in: Regen. 2003-06-20 Adam Fedor * Documentation/Makefile.postamble (after-clean): Remove Base and BaseAdditions 2003-06-20 Richard Frith-Macdonald * Source/GSString.m: Allow more length when converting unicode string to integer. * Source/NSObject.m: ([methodSignatureForSelector:]) return nil if the receiver does not implement it. 2003-06-20 Adam Fedor * Documentation/Makefile.postamble (after-clean): * Version 1.7.1 * Source/DocMakefile (after-all): Check if Base exists before removing it. 2003-06-19 Adam Fedor * GNUmakefile (SUBPROJECTS): Revert last change. 2003-06-19 Andrew Ruder * Source/Additions/Unicode.m: Increase size of table by one to avoid error if all possible character encodings were supported. Never happens ... but might conceivably do so one day. 2003-06-18 Kazunobu Kuriyama * configure.ac: Add --with--ffcall-include=PATH and --with-ffcall-library=PATH options 2003-06-18 Richard Frith-Macdonald * Source/Additions/GSXML.m: Implement -description for nodes. 2003-06-17 Adam Fedor * GNUmakefile (SUBPROJECTS): Add Documentation 2003-06-17 Chris Vetter * Tools/AGSHtml.m: Tidy up formatting of author output. 2003-06-16 13:36 Alexander Malmberg * Source/GSFormat.m (GSFormat()): Free malloc memory in all cases after handling %s, %S, %@ with strings longer than 8192 characters. 2003-06-15 Richard Frith-Macdonald * Source/NSAutoreleasePool.m: Documented. * Headers/gnustep/base/NSObject.h: Documented memory management macros for autogsdoc. 2003-06-14 Richard Frith-Macdonald * Source/Additions/GSMime.m: Better attempt to infer charset from string only when needed. Don't insert transer encoding header if not needed. 2003-06-11 Adam Fedor * Source/NSNumberFormatter.m (-getObjectValue:forString:errorDescription:): Simple implementation. 2003-06-08 Fred Kiefer * Source/NSString.m In [initWithContentsOfURL:] changed variable test to unichar* to keep the compiler quiet. * Source/Additions/Unicode.m In GSFromUnicode() removed type cast of *_conv_base as the gcc 3.3 compiler complained about it. 2003-06-07 David Ayers * Headers/gnustep/base/GSObjCRuntime.h * Source/Additions/GSObjCRuntime.m : White space patch to better conform with GNU coding standards and improve readability. Wrap deprecated API in NO_DEPRICATED macro. 2003-06-06 David Ayers * Source/GSArray.m: Change syntax of include <> to "" for local headers. Change base/ to gnustep/base/ in includes. Source/GSAttributedString.m, Source/GSCompatibility.m, Source/GSCountedSet.m, Source/GSDictionary.m, Source/GSFFCallInvocation.m, Source/GSFFIInvocation.m, Source/GSFTPURLHandle.m, Source/GSFileHandle.m, Source/GSFormat.m, Source/GSHTTPURLHandle.m, Source/GSLocale.m, Source/GSSet.m, Source/GSString.m, Source/GSTcpPort.m, Source/GSTemplateValue.m, Source/GSValue.m, Source/NSArchiver.m, Source/NSArray.m, Source/NSAssertionHandler.m, Source/NSAttributedString.m, Source/NSAutoreleasePool.m, Source/NSBitmapCharSet.m, Source/NSBundle.m, Source/NSCalendarDate.m, Source/NSCallBacks.h, Source/NSCallBacks.m, Source/NSCharacterSet.m, Source/NSClassDescription.m, Source/NSCoder.m, Source/NSConcreteNumber.m, Source/NSConnection.m, Source/NSCopyObject.m, Source/NSCountedSet.m, Source/NSData.m, Source/NSDate.m, Source/NSDateFormatter.m, Source/NSDebug.m, Source/NSDecimal.m, Source/NSDecimalNumber.m, Source/NSDictionary.m, Source/NSDistantObject.m, Source/NSDistributedLock.m, Source/NSDistributedNotificationCenter.m, Source/NSEnumerator.m, Source/NSException.m, Source/NSFileHandle.m, Source/NSFileManager.m, Source/NSFormatter.m, Source/NSGeometry.m, Source/NSHashTable.m, Source/NSHost.m, Source/NSInvocation.m, Source/NSKeyValueCoding.m, Source/NSLock.m, Source/NSLog.m, Source/NSMapTable.m, Source/NSMethodSignature.m, Source/NSNotification.m, Source/NSNotificationCenter.m, Source/NSNotificationQueue.m, Source/NSNull.m, Source/NSNumber.m, Source/NSNumberFormatter.m, Source/NSObjCRuntime.m, Source/NSObject.m, Source/NSPage.m, Source/NSPipe.m, Source/NSPort.m, Source/NSPortCoder.m, Source/NSPortMessage.m, Source/NSPortNameServer.m, Source/NSProcessInfo.m, Source/NSProtocolChecker.m, Source/NSProxy.m, Source/NSRange.m, Source/NSRunLoop.m, Source/NSScanner.m, Source/NSSerializer.m, Source/NSSet.m, Source/NSSocketPort.m, Source/NSString.m, Source/NSTask.m, Source/NSThread.m, Source/NSTimeZone.m, Source/NSTimer.m, Source/NSURL.m, Source/NSURLHandle.m, Source/NSUnarchiver.m, Source/NSUndoManager.m, Source/NSUser.m, Source/NSUserDefaults.m, Source/NSValue.m, Source/NSZone.m, Source/UnixFileHandle.m, Source/callframe.h, Source/callframe.m, Source/cifframe.h, Source/cifframe.m, Source/externs.m, Source/libgnustep-base-entry.m, Source/mframe.m, Source/objc-gnu2next.m, Source/objc-load.m, Source/preface.m, Source/thr-mach.m, Source/thr-pthread.m, Source/Additions/GCArray.m, Source/Additions/GCDictionary.m, Source/Additions/GCObject.m, Source/Additions/GSCategories.m, Source/Additions/GSCompatibility.h, Source/Additions/GSMime.m, Source/Additions/GSNextRuntime.m, Source/Additions/GSObjCRuntime.m, Source/Additions/GSXML.m, Source/Additions/Unicode.m, Source/Additions/behavior.m: Idem. 2003-06-03 Adam Fedor * Source/mframe/powerpc/darwin: New file. 2003-06-02 Richard Frith-Macdonald * Source/mframe.m: Allow for structure names in type specifications. 2003-05-29 Adam Fedor * configure.ac: Pass on original CPPFLAGS to config.mak. * config/objc-con-autoload.m4: Test for constructors directly. * config/objc-sys-dynamic.m4: Check for dl lib if we are using dladdr. * Source/objc-load.m (objc_get_uninstalled_dtable): Remove unused. * Source/Additions/GSXML.m (unparsedEntityDeclFunction): Add block around START so it will compile on GCC 2. * Testing/nsbundle.m: Errors to stdout. 2003-05-26 Adam Fedor * Testing/Makefile.postamble (check): Define to run all checkable tools (ones that exit in a finite amount of time). * Testing/README: New. 2003-05-23 Richard Frith-Macdonald * Source/Additions/GSXML.m: Some work towards making it possible to subclass GSTreeSAXHandler cleanly, so you can build a tree representation of a document but still handle data incrementally. 2003-05-22 Richard Frith-Macdonald * Source/Additions/GSXML.m: ([GSXPathContext-evaluateExpression:]) Test for NULL return from libxml and return nil rather than trying to dereference the null pointer. New features to record error and warning messages added. * Headers/Foundation/GSXML.h: ([GSXMLParser-messages]) returns saved messages. ([GSXMLParser-saveMessages:]) Says whether to save messages or write to stderr. * Source/Additions/GSObjCRuntime.m: Hack to fix type clash in declaration of __objc_exec_class() 2003-05-19 Adam Fedor * Version 1.7.0. * Documentation/news.texi: Updated. * NSObject: Revert last change 2003-05-20 David Ayers * Headers/gnustep/base/GSObjCRuntime.h (GSObjCGetMethod(), GSObjCReplaceMethod()): Removed declarations for release as these functions will be replaced by a more consistent approach. 2003-05-19 Adam Fedor * Source/NSObject (GSAtExit): New function. (+initialize): Use it with atexit. * Source/objc-load.m (objc_invalidate_dtable): Remove. (objc_load_callback): Don't call it. 2003-05-16 Richard Frith-Macdonald * Source/NSDate.m: Documented. 2003-05-14 Richard Frith-Macdonald * Source/Additions/GSMime.m: Fix occasional error unfolding headers. 2003-05-14 16:50 Alexander Malmberg * Source/NSUser.m, Headers/gnustep/base/NSPathUtilities.h: Add GSApplicationSupportDirectory constant for NSSearchPathForDirectoriesInDomains. 2003-05-14 David Ayers * Tools/Makefile.postamble: Added safe handling of empty MAN1_PAGES variable. * Tools/pl2link.m (main): Initialize variable to supress compiler warning. 2003-05-13 Richard Frith-Macdonald * Source/Tools/gdnc.m: Tidy termination code. * Source/Additions/GSMime.m: ([GSMimeDocument-copyWithZone:]) corrected implementation to do a real copy rather than just a retain. 2003-05-13 15:57 Alexander Malmberg * Tools/gdnc.m (ihandler): Declare variables. 2003-05-12 Richard Frith-Macdonald * Source/Additions/GSXML.m: New -escapedContent method to provide text with the five entities libxml automatically substitutes even when told not to. * Tools/AGSHtml.m: Use -escapedContent to get text suitable for output in html documents. 2003-05-11 Richard Frith-Macdonald * Tools/gdomap.8.gz: Added man page adapted from internal docs by martin@mb-itconsulting.com * Tools/GNUmakefile: Declare man pages to be installed * Tools/Makefile.postamble: Install man pages 2003-05-08 Richard Frith-Macdonald * Tools/xmlparse.m: new utility to parse/validate xml, for testing gsdoc and new style property lists etc. * Source/NSBundle.m: ([+allBundles]) Make sure the main bundle is present. Add some documentation. 2003-05-07 Richard Frith-Macdonald * Source/GSString.m: ([-initWithCStringNocopy:length:freeWhenDone:]) check encodings and convert to unicode if necessary. Thanks to Alaxander for pointing out bug. 2003-05-06 Richard Frith-Macdonald * Source/GSString.m: Fix call to GSFormat() to append to a mutable string whose contents should not be freed. Removed bogus TODO comments saying code broken when defEnc!=intEnc in routines which should never be called when defEnc!=intEnc anyway. * Source/NSData.m: Remove windows specific code for simplification as the standard code actually works as well or better according to * Tools/AGSParser.m: Ignore forward declarations of protocols. 2003-05-05 15:28 Alexander Malmberg * Source/Unicode.m (GSFromUnicode, GSToUnicode): Make sure the internal work buffer isn't returned to the caller. * Source/NSString.m: Clarify some comments, and mark code that is broken when defEnc!=intEnc. (fillHole, makeHole): Remove STABLE_MEMCPY. Use memmove. (transmute): Set the zone to the default zone when transmuting. Check the return value from GSToUnicode. (getCharacters_c): Check the return value from GSToUnicode. 2003-05-02 Richard Frith-Macdonald * Source/GSTcpPort.m: ([dispatch]) catch exceptions handling the port message, so as to ensure that locking won't get out of sync. Mon Apr 28 12:09:44 BST 2003 Nicola Pero * NSCharacterSets/GNUmakefile (base-resources_RESOURCE_FILES_INSTALL_DIR): Define using the full relative path. * Resources/GNUmakefile (base-resources_RESOURCE_FILES_INSTALL_DIR): Idem. 2003-04-27 Adam Fedor * Updates for filesystem change. * GNUmakefile (GNUSTEP_MAKEFILES): Remove * Documentation/GNUmakefile, Examples/GNUmakefile, NSTimeZones/GNUmakefile, SSL/GNUmakefile, SSL/configure.ac, Source/DocMakefile, Source/GNUmakefile, Source/Additions/GNUmakefile, Testing/GNUmakefile, Tools/GNUmakefile: Idem. * configure.ac: Replace $GNUSTEP_SYSTEM_ROOT/Makefiles with $GNUSTEP_MAKEFILES. Replace Libraries with Library/Libraries. Replace Headers with Library/Headers. * Source/mframe/configure.ac: Idem. * NSCharacterSets/GNUmakefile: Use resource-set.make. * Resources/GNUmakefile: Idem. * Resources/GNUmakefile.postamble: Remove before/after install cmds. * Source/NSBundle (+pathForLibraryResource:ofType:inDirectory:): New method. (+pathForGNUstepResource:...): Depreciate. * Source/Additions/GSXML.m: Use it to find DTDs. * Source/GSLocale.m (GSLanguageFromLocale): Use +bundleForLibrary to locate resources. * Source/NSCharacterSet.m (+_bitmapForSet:number:): Idem. * Source/NSUserDefaults.m (+standardUserDefaults): Idem. * Source/Additions/Unicode.m (GSEncodingFromLocale): Idem. * Source/NSTimeZone.m (_time_zone_path): New function. (+systemTimeZone, +getAbbreviationFile, +getRegionsFile, +getTimeZoneFile): Use it. * Source/NSUser.m (NSSearchPathForDirectoriesInDomains): Change libsDir to "Library/Libraries", docDir to "Library/Documentation". * Source/Additions/GSCompatibility.[hm]: Change +pathForGNUstepResource:... to +pathForLibraryResource:... 2003-04-27 Richard Frith-Macdonald * Source/NSUserDefaults.m: ([synchronize]) fix locking to permit recursive call to this method, ensuring the distributed lock is only obtained once. * Headers/gnustep/base/GSCategories.h: removed varargs helper macros * Headers/gnustep/base/GSObjCRuntime.h: and put them here. 2003-04-17 Richard Frith-Macdonald * Headers/gnustep/base/GSCategories.h: * Headers/gnustep/base/NSCalendarDate.h: * Headers/gnustep/base/NSData.h: * Headers/gnustep/base/NSObject.h: * Headers/gnustep/base/NSString.h: * Headers/gnustep/base/NSValue.h: * Headers/gnustep/base/Foundation.h: Tidied use of GSCategories. * Source/NSFileManager.m: ([linkPath:toPath:handler:]) implemented. 2003-04-16 Richard Frith-Macdonald * Headers/gnustep/base/NSUserDefaults.h: remove timer ivar, now unused. * Source/NSRunLoop.m: Support a housekeeping timer which is ignored for purposes of deciding whether the loop shoiuld terminate. * Source/NSThread.m: Set up housekeeping timer to trigger housekeeping notifications in the default mode of the runloop of the main thread. * Source/NSUserDefaults.m: Use housekeeping notifications to trigger synchronise rather than using timers ... avoid circular dependencies. Thanks to Derek Zhou for bug report. 2003-04-15 Richard Frith-Macdonald * Source/NSData.m: Experimantal disable ReadFile and WriteFile on MINGW 2003-04-14 Richard Frith-Macdonald * Source/NSObjCRuntime.m: NSClassFromString(), NSSelectorFromString() avoid doing an unnecessary autorelease. 2003-04-12 Richard Frith-Macdonald * Source/callframe.m: * Source/cifframe.m: Fix error in returning pointer to struct values. 2003-04-11 Richard Frith-Macdonald * Source/NSConnection.m: ([_service_forwardForProxy:]) don't free the decoded selector name ... the NSPortCoder now does it. ([typeForSelector:]) return autoreleased copy of the type string. 2003-04-10 Richard Frith-Macdonald * Source/callframe.m: * Source/cifframe.m: Fix error in returning data via pointer arguments ... was writing to wrong memory location. * Source/GSFFCallInvocation.m: minor tidy up. * Source/NSArchiver.m: Structure encoding/decoding fixes. * Source/NSData.m: Structure encoding/decoding fixes. * Source/NSPortCoder.m: Structure encoding/decoding fixes. Manage memory used by decoded pointers (including c-strings). * Source/NSUnarchiver.m: Structure encoding/decoding fixes. * Source/NSConnectiom.m: Don't try to autorelease decoded pointers. * Testing/server.h: Make large structure have tricky layout. * Testing/nsconnection_client.m: Add harder structure test. * Testing/nsconnection_server.m: Add harder structure test. 2003-04-09 Richard Frith-Macdonald * Source/GSTcpPort.m: * Source/NSData.m: * Source/NSSerializer.m: * Source/NSURL.m: Replace __alignof__() with calls to objc_alignof_type() so that if __alignof__() is broken we can hope that the objc runtime library has a workaround. 2003-04-08 Richard Frith-Macdonald * Headers/gnustep/base/Foundation.h: Include GNUstep extensions from GSCategories.h 2003-04-08 15:37 Alexander Malmberg * Source/NSCalendarDate.m (-initWithString:calendarFormat:locale:): Fix assignment of 'found' in %z handling. 2003-04-07 13:21 Alexander Malmberg * configure.ac: Link directly to the foreign function interfaces section in the build guide in the error message for missing ffi library. * configure: Regenerate. 2003-04-07 Richard Frith-Macdonald * Headers/gnustep/base/GSCategories.h (GS_USEIDLIST and GS_USEIDPAIRLIST): Complete implementation and testing. * Source/NSDictionary.m: Use macro. 2003-04-06 23:30 Alexander Malmberg * Headers/gnustep/base/GSCategories.h (GS_USEIDLIST): Make the implementation match the actual use in NSArray and NSSet. Clarify documentation. 2003-04-06 Richard Frith-Macdonald * Source/NSThread.m: (GSPerformHolder) execute perform operations in the same order in which they were submitted. * Headers/GNUstep/base/GSCategories.h: Added two new macros to agressively optimise the use of varargs when initialising arrays etc by avoiding multiple allocation/reallocation of memory to hold arrays of objects taken from the varargs list. * Source/NSArray.m: Use the new macros. 2003-04-04 Stephane Corthesy * macosx/config.h, macosx/preface.h: Update. * macosx/gnustep.pbproj/project/pbxproj: Use relative paths. 2003-04-04 Adam Fedor * Source/Additions/GSCompatibility.m ([NSString(GSCompatibility) -substringFromRange:]): Add. 2003-04-04 Richard Frith-Macdonald * Headers/Foundation/NSInvocation: Added NS_INVOCATION asnd NS_MESSAGE * Source/NSInvocation.m: Support the two new macros. Documented. * Testing/nsinvocation.m: Trivial tests added. * Documentation/OpenStepCompliance.gsdoc: Updated. * Source/NSConnection.m: ([-forwardInvocation:forProxy:]) set invocation target explicitly, in case this was called as a result of a manual setup of the invocation rather than real forwarding. 2003-04-03 Adam Fedor * Documentation/OpenStepCompliance.gsdoc: New file. * Documentation/Base.gsdoc: Reference it. * Source/DocMakefile: Update. 2003-04-02 Stephane Corthesy * Source/Additions/GSCompatibility.m: Fix up incorrectly applied patch. * Source/Additions/Unicode.m (GSEncodingName): Don't define if NeXT_Foundation_Library. 2003-04-02 Adam Fedor * Headers/gnustep/base/Foundation.h: Revert previous change 2003-04-02 Richard Frith-Macdonald * Source/Additions/GSXML.m: ([-content]) fix to produce string content of elements rather than just text nodes. * Source/GSMime.m: ([-rawMimeData]) ensure that the transfer encoding of a multipart document is 8bit if any of its constituent parts are 8bit or binary 22003-04-01 Richard Frith-Macdonald * Source/NSCalendarDate.m: ([initWithString:calendarFormat:locale:]) add support for %F millisecond initialisation. make trivial simplification of timezone handling. on failure to parse zone using %z, use local time zone. 2003-03-31 Stephane Corthesy * Source/Additions/GCArray.m: Replace retain/release by RETAIN/RELEASE macros. * Source/Additions/GCDictionary.m: Idem. * Source/Additions/GSCompatibility.h: Add NSBundle category. * Source/Additions/GSCompatibility.m (GSEncodingName): New. Add -[NSBundle pathForGNUstepResource:ofType:inDirectory:]. * Source/Additions/GSObjCRuntime.m: Include GNUstep.h. (GSObjCMethodNames): Cast method_name to const char *. 2003-03-31 Adam Fedor * Headers/gnustep/base/Foundation.h: Add GSCategories.h 2003-03-30 Adam Fedor * Headers/gnustep/base/NSString.h: (stringByTrimmingLeadSpaces, stringByTrimmingTailSpaces, stringByTrimmingSpaces, stringByReplacingString:withString:, replaceString:withString:, trimLeadSpaces, trimTailSpaces, trimSpaces): Move to GSCategories.h * Headers/gnustep/base/NSValue.h (valueFromString): Idem. * Source/NSNumber.m (valueFromString:): Move to GSCategories.m * Source/NSString.m: Idem as above. * Source/Additions/GSCategories.m: Methods moved here. * Source/Additions/GSCompatibility.h: Rearrange, add NSDistantObject, NSFileHandle category, GSCurrentThreadDictionary(). * Source/Additions/GSCompatibility.m: Add GSCurrentThreadDictionary NSDistantObject, and NSFileHandle methods. 2003-03-28 20:48 Alexander Malmberg * configure.ac: Fail the configure if neither ffcall nor ffi is available unless --disable-do is passed to configure. Add a message about why a user most likely does not want to build with ffcall and ffi, and with a link to the build guide. * configure: Regenerate. 2003-03-27 Adam Fedor * Source/NSBundle.m ([NSBundle -bundleIdentifier]): New. 2003-03-27 Stephane Corthesy * Tools/autogsdoc.m, AGSHtml.m, AGSIndex.m, AGSOutput.m: Add MacOSX compatibility headers. * Tools/AGSParser.m: Idem. (-log:arguments:): Replace strinWithFormat:arguments: with initWithFormat:arguments: 2003-03-26 David Ayers * Source/NSKeyValueCoding.m: Added documentation. * Source/NSKeyValueCoding.m ([NSObject -takeValue:forKey:]), ([NSObject -valueForKey:]): Corrected search order of instance variables. 2003-03-25 Stephane Corthesy * macosx: New directory holding MacOSX project for building Additions framework. 2003-03-25 Richard Frith-Macdonald * Source/NSURL.m: When loading a resource and attempting to notify a client, check that the client responds to the selectors before sending messages to it. Make ([-loadResourceDataNotifyingClient:usingCache:]) work in background (non-blocking). 2003-03-25 David Ayers * Headers/gnustep/base/GSObjCRuntime.h * Source/Additions/GSObjCRuntime.m (GSObjCGetMethod), (GSObjCReplaceMethod): Added new functions. * Source/Additions/GSObjCRuntime.m (search_for_method_in_class): Renamed static function for NeXT runtime to better reflect reality. (GSObjCAddMethods): Updated usage. (search_for_method_in_class): New static function for GNU runtime. (flush_method_cache_for_class): New static function. * Headers/gnustep/base/GSCategories.h: Included necessary headers. 2003-03-23 Richard Frith-Macdonald * Completed merge of changes from 1.6.0 branch. 2003-03-17 Adam Fedor * Version 1.6.0 2003-03-17 Adam Fedor * Testing/LoadMe.m (afterLoad): Use description, not name. * Testing/nsfilemanager.m: Print some output. Clean up. * Testing/scanner.m, nstimezone.m, release.m: Idem. * config/config.vsprintf, config/config.vasprintf: Rewrite to properly call a variable argument function. 2003-03-14 Adam Fedor * Testing/nsarray.m (compare): Un-nest function. * Source/NSProcessInfo.m (-operatingSystem): Add darwin. 2003-03-13 Richard Frith-Macdonald * Source/NSFileManager.m: ([-isDeletableFileAtPath:]) Fix for the case where the path is a file in the current directory. 2003-03-11 Adam Fedor * configure.ac: Fix some typos (Reported by Alexander Malmberg ). 2003-03-07 Richard Frith-Macdonald * Headers/gnustep/base/NSSet.h: Added a few non-openstep declarations * Source/GSCompatibility.m: OAppend() sort dictionary keys even if locale is nil. 2003-03-06 Richard Frith-Macdonald * Source/NSData.m: Fix reference to zone of deallocated object. Bug reported by Roland Schwingel * Source/NSFileManager.m: Fix typo (using logical or rather than bitwise or) in call to access() Bug reported by Roland Schwingel 2003-02-17 Wim Oudshoorn * GNUmakefile (GNUSTEP_TARGET_INSTALL_PREFIX) (GNUSTEP_TARGET_LOCAL_ROOT, GNUSTEP_TARGET_NETWORK_ROOT): On mingw32 replace / with \\057 to avoid the msys shell translating / with \. 2003-03-04 Richard Frith-Macdonald * config/config.vasprintf.c: * config/config.vsprintf.c: Correct the number of arguments passed so that modern compilers don't fail on these files. A compiler failure is seen by configure as the same as a runtime failure, and configure would infer incorrect runtime behavior! 2003-03-01 Richard Frith-Macdonald * Source/NSSerializer.m: Fix crash when deserializing a corrupt or truncated archive ... raise exception rather than segfaulting. Added code to recognize newer versions of the serialiser format and give up if they are encountered and cannot be handled. * Source/GSTcpPort.m: Added code to recognise newer versions of the port format and give up if they are encountered and cannot be handled. This allows for the addition of decent versioning in later formats. 2003-02-28 Richard Frith-Macdonald * Tools/AGSParser.m: Fix to understand __attribute__() in declaration. 2003-02-27 Richard Frith-Macdonald * Tools/AGSIndex.m: Convert nil content to empty strings before use. * Tools/AGSHtml.m: ditto ... prevent some crashes. 2003-02-24 Richard Frith-Macdonald * Source/NSProcessInfo.m (_gnu_process_args): Tidied patch and add code to print error and abort if argv is null under unixy systems. 2003-02-24 Tom Koelman * Source/NSProcessInfo.m (_gnu_process_args): If argv is 0 (e.g. on MingW) set executable name using module name info. 2003-02-23 Richard Frith-Macdonald * Source/NSUser.m: Don't prepend HOMEDRIVE to HOMEPATH if HOMEPATH already contains a drive letter. 2003-02-22 Richard Frith-Macdonald * Source/Additions/GSObjCRuntime.m: GSObjCSetValue() correct to call ([unableToSetNilForKey:]) when it should. * Source/NSDecimalNumber.m: Override initialisers from NSNumber to create NSDecimalNumber objects ... bug report by David Ayers. 2003-02-21 Richard Frith-Macdonald * Source/NSDistributedNotificationCenter.m: ([_connect]) make the connection to the server usable from any thread. 2003-02-19 Adam Fedor * Source/NSKeyValueCoding.m ([NSObject -handleQueryWithUnboundKey:]): Raise NSUnknownKeyException. ([NSObject -handleTakeValue:forUnboundKey:]): Idem. 2003-02-18 Adam Fedor * Source/GSFFIInvocation.m (GSFFIInvocationCallback): Cast invocation to access ivars correctly. Check validReturn. 2003-02-18 Tom Koelman * Source/NSProcessInfo.m (_gnu_process_args): If argv is 0 (e.g. on MingW) set executable name to empty string. 2003-02-17 Richard Frith-Macdonald * Source/GSString.m: (fillHole) fix memory overrun (read only) and argument order errors (in code not normally compiled) spotted by Manuel Guesdon. 2003-03-23 Richard Frith-Macdonald * Start merged of changes from 1.6.0 branch. 2003-03-20 Richard Frith-Macdonald * Source/GSMime.m: (_unfoldHeader) Check that input pointer doesn't run past end of data. 2003-03-05 15:50 Alexander Malmberg * Source/NSBundle.m (+initialize) [PROCFS_EXE_LINK]: Make sure that the link is a path before using it. 2003-03-03 Richard Frith-Macdonald * Headers/gnustep/base/objc-gnu2next.h: Added some trivial reverse mappings to use gnu runtime from old next code. 2003-03-02 Richard Frith-Macdonald * Headers/gnustep/base/GSObjCRuntime.h: * Source/GSFFIInvocation.m: * Source/GSString.m: * Source/NSInvocation.m: * Source/NSObject.m: * Source/NSPortCoder.m: * Source/NSUnarchiver.m: * Source/Additions/GSObjCRuntime.m: * Source/Additions/Unicode.m: Rename _fastMallocBuffer() to GSAutoreleasedBuffer() for clarity and consistency. Moved implementation from NSObject.m to GSObjCRuntime.m so this is available for use withing the Additions library when built standalone. Add a couple of trivial functions to list ivars and methods. 2003-02-19 Mirko Viviani * Headers/gnustep/base/NSArray.h: fixed declarations. 2003-02-19 David Ayers * Source/NSArray.m (compare()), ([-sortedArrayUsingFunction:context:]), ([-sortedArrayUsingFunction:context:hint:]), ([-sortUsingFunction:context:]): Changed declarations and implementation to account for 64 bit architectures. * Headers/gnustep/base/NSArray.h: Ditto. * Source/NSKeyValueCoding.m ([-takeStoredValuesFromDictionary:]): Implemented. * Headers/gnustep/base/NSKeyValueCoding.h: Ditto. 2003-02-18 Richard Frith-Macdonald * NSObject.m: ([+instancesRespondToSelector:]),([-respondsToSelector]) Return NO when given a null selector unless in MacOS-X compatibility mode. rewritten from patch by Willem Rein Oudshoorn. 2003-02-16 Adam Fedor * Version 1.5.2 * Documentation: Update. * Source/GSFFIInvocation.m (GSFFIInvocationCallback): Autorelease and invalidate the return value object before returning. 2003-02-16 Richard Frith-Macdonald * Source/GSDictionary.m: ([-isEqualToDictionary:]) implement optimised version which does not need to create a key enumerator. * Source/GSArray.m: ditto * Source/GSSet.m: similar minor optimisations. 2003-02-15 15:53 Alexander Malmberg * Source/NSRunLoop.m (-performSelector:target:argument:order:modes:): Order the performers correctly (lower order values first). Correct the documentation. 2003-02-13 Richard Frith-Macdonald * Source/NSTimeZone.m: Fix memory leak when making absolute timezone for offset 0. 2003-02-11 Tom Koelman * Source/NSTask.m: Make arguments into windows quoted strings for mingw. Adjustments to conform to GNUstep style and use static functions to avoid adding methods by RFM. 2003-02-11 Adam Fedor * configure (LDFLAGS): Remove extra spaces that cause problems on Darwin/gcc i2003-02-11 Willem Rein Oudshoorn * Headers/Foundation/NSFileManager.h: Added a little bit to the * documentation of the NSFileManagerHandler protocol. (some documentation markup fixes by RFM also) * Source/NSFileManager.m ([NSFileManager -copyPath:toPath:handler:]): use new private methods to cope with handlers that do not implement the informal protocol. Pass more information to the handler in case of an error. ([NSFileManager -removeFileAtPath:handler:]): see above ([NSFileManager -movePath:toPath:handler:]): see above ([NSFileManager -_copyPath:toPath:handler:]): see above ([NSFileManager -_copyFile:toFile:handler:]): see above, also fixed leaking of file descriptors in case of error without a handler. ([NSFileManager -_sendToHandler:handlerwillProcessPath:path]): new method ([NSFileManager -_proceedAccordingToHandler:handlerforError: errorinPath:path]): new method ([NSFileManager -_proceedAccordingToHandler:handlerforError: errorinPath:pathfromPath:fromPathtoPath:toPath]): new method 2003-02-11 Richard Frith-Macdonald * Source/NSFileManager.m: ([+attributesAt:traverseLink:]) check for null pointer and return nil. Crash reported by Tom Koelman. 2003-02-10 13:56 Alexander Malmberg * Source/NSRunLoop.m [HAVE_POLL] (-pollUntil:within:): Set fdEnd to pollfds_count instead of setting it separately (which was being done incorrectly). 2003-02-07 19:21 Alexander Malmberg * Source/GSAttributedString (-setAttributes:range:): Fix memory leak. 2003-02-06 Richard Frith-Macdonald * Sourcewin32-def.top: Remove recently added external functions. * Source/libgnustep-base.def.in: Regenerated to just contain public classes. The manual hacks are no longer needed as the make system now handles inclusion of symbols from subprojects in dlls. 2003-02-05 Richard Frith-Macdonald * Sourcewin32-def.top: Manually added external functions. * Source/libgnustep-base.def.in: Regenerated to combine external functions and all public classes. * Source/NSConnection.m: ([-init]) creates a connection usable as a server. 2003-02-04 Richard Frith-Macdonald * Source/NSBundle.m: Implement new MacOS-X isLoaded method. * Headers/gnustep/base/NSBundle.h: ditto 2003-02-04 Willem Rein Oudshoorn * Headers/gnustep/base/GSInvocation.h (CLEAR_RETURN_VALUE_IF_OBJECT): * New macro, if invocation returns object release it. (RETAIN_RETURN_VALUE): New macro, if invocation returns object release it. * Source/NSInvocation.m ([NSInvocation -dealloc]): Implement RELEASE * return object ([NSInvocation -setReturnValue:]) Implement RETAIN/RELEASE on return object ([NSInvocation -invokeWithTarget:]): Implement RETAIN/RELEASE on return object, fixed _validReturn flag setting * Source/GSFFIInvocation.m ([GSFFIInvocation -invokeWithTarget:]): Fix _validReturn flag setting, Implement RETAIN/RELEASE on return object. * Source/GSFFCallInvocation.m ([GSFFCallInvocation * -invokeWithTarget:]): Fix _validReturn flag setting. Implement RETAIN/RELEASE on return object. 2003-02-04 Adam Fedor * Headers/gnustep/base/.cvsignore: Don't include config.h.in * Documentation/.cvsignore: Don't include *texi * Source/Additions/GSXML.h: Fix up GSXLM.h include on MacOSX 2003-02-02 Stephane Corthesy Adam Fedor * Headers/gnustep/base/GSObjCRuntime.h (GS_STATIC_INLINE): Rename from FOUNDATION_STATIC_INLINE * Headers/gnustep/base/GCObject.h, GSXML.h: include Foundation/Foundation.h on MacOSX. * Source/Additions/GCArray.m, GCDictionary.m, GCObject.m: Idem. * Source/Additions/GSCompatibility.[hm]: Change category names to GSCompatibility. * Source/Additions/GSNextRuntime.m (ROUND): Expand inline due to gcc 3.1 compile problems. * Source/Additions/Unicode.m: Don't define GetEncodingName on MacOSX Added #ifdef HAVE_ICONV around definition of iconv_stringforencoding(). 2003-02-01 Richard Frith-Macdonald * Source/Additions/Unicode.m: Fix error in check for legality of three-byte utf-8 sequences. 2003-01-31 Richard Frith-Macdonald * Source/NSRunLoop.m: Fix memory leak with timed performs. 2003-01-31 Stephane Corthesy Adam Fedor * Headers/gnustep/base/GSCategories.h: Moved NSString(GSCategories), NSMutableString(GSCategories), and copied NSObject(GSCategories) to here * Headers/gnustep/base/NSString.h, Headers/gnustep/base/NSObject: From here. * Headers/gnustep/base/GSMime.h: Include Foundation on MacOSX. * Source/Additions/GSCategories.m: Fix includes. * Source/Additions/GSCompatibility.h: Defined DebugLog, WarnLog macros. Add Additional NSObject, NSInvocation, NSString and NSProcessInfo methods. Add NSStandardLibraryPaths. * Source/Additions/GSCompatibility.m: Idem. 2003-01-30 Richard Frith-Macdonald * Source/libgnustep-base.def.in: Regenerated 2003-01-27 Richard Frith-Macdonald * Source/Additions/Unicode.m: Fixed bug in utf-8 output for three byte sequences. * Tools/AGSOutput.m: Fix loss of trailing info after a closing square bracket round a class name. * Source/Additions/GCArray.m: make mutable copy shallow for consistency with other arrays. 2003-01-26 Richard Frith-Macdonald * Source/NSString.m: Added new MacOS-X method ... ([MSMutableString-replaceOccurrencesOfString:withString:options:range:]) * Source/Headers/gnustep/base/NSString.h: ditto * Source/Additions/GSCategories.m: Added ([NSData-initWithHexadecimalRepresentation:]) * Source/Headers/gnustep/base/GSCategories.h: ditto 2003-01-26 Adam Fedor * Compiling gdl2 on MacOSX. * Headers/gnustep/base/NSObject.h (-notImplemented:, -subclassResponsibility:, -shouldNotImplement:, -compare:): Move to GSCategories category. * Headers/gnustep/base/NSString.h (-stringByDeletingPrefix:, -stringByDeletingSuffix:, -deleteSuffix:, -deletePrefix:): Idem. * Source/NSObject: Move methods to Additions/GSCategories.m * Source/NSString: Idem. * Source/Additions/GSCompatibility.h (GetEncodingName): Add. * Source/Additions/GSCompatibility.m (GetEncodingName): Cocoa implementation. 2003-01-24 Richard Frith-Macdonald * Source/Additions/GSCategories.m: Changed name of md5 digest method and added -hexadecimalRepresentation. * Source/Additions/GSMime.m: Update for md5 change. * Documentation/GNUmakefile: Fixed error in installation location. * Documentation/Makefile.postamble: Fixed to install BaseAdditions documentation. * Source/md5.c: Tidy up ... removed ... no longer used * Source/md5.h: ditto * Source/numbers.c: ditto * Headers/gnustep/base/numbers.h: ditto 2003-01-23 Richard Frith-Macdonald * Documentation/Base.gsdoc: Refer to additions. * Documentation/BaseAdditions.gsdoc: New intorduction for additions * Headers/gnustep/base/GSCategories.h: Added MD5Digest NSData method * Source/DocMakefile: Build additions documentation separately * Source/Additions/GSCategories.m: Added MD5Digest NSData method * Source/Additions/GSMime.m: Use MD5Digest NSData method. 2003-01-22 Richard Frith-Macdonald * Source/Additions/GSMime.m: ifdefed out my last change ...not sure it was good. * Source/GSFileHandle.m: Removed bogus semicolon which was causing code to be executed repeatedly rather than just once ... trivial optimisation. 2003-01-21 Adam Fedor * Source/Additions/(GCArray.m, GCDictionary.m, GCObject.m, GSCategories.m): Include config.h * Source/Additions/GSMime.m: Add extra arg to some NSDebugMLog to get it to compile right on OSX. 2003-01-20 Richard Frith-Macdonald * Headers/gnustep/unicode/latin9.h: Latin9 string encoding tables * Source/Additions/Unicode.m: Added built-in support for the Latin9 character encoding ... contains the Euro symbol ... nice for european users. * Source/NSArray.m: Make abstract copying implementation like that of latest MacOS-X rather than OPENSTEP ... no relationship between mutability and depth. * Source/NSDictionary.m: ditto * Source/NSSet.m: ditto * Source/GSArray.m: Implement optimised copies ... copying an immutable object just retains it, and copying a mutable object is shallow. * Source/GSDictionary.m: ditto * Source/GSSet.m: ditto 2003-01-16 Richard Frith-Macdonald * Source/NSURL.m: Support MacOS-X style initialisation using a path with a leading slash. 2003-01-09 Richard Frith-Macdonald * Source/Additions/GSCategories.m: Additional ([weekOfYear]) method for NSCalendarDate. * Headers/gnustep/base/GSCategories.h: ditto 2003-01-07 Richard Frith-Macdonald * Source/NSLock.m: * Source/NSPage.m: Mingw fixes ... problems reported by Fred. 2003-01-04 Richard Frith-Macdonald * Source/NSConcreteNumber.m: ([compare:]) explicitly cast to promote values to a type where comparisons can be done without loss of precision. 2003-01-03 Richard Frith-Macdonald * base.make.in: * configure: * configure.ac: * Headers/gnustep/base/GSIArray.h: * Headers/gnustep/base/GSIMap.h: * Headers/gnustep/base/NSGeometry.h: * Headers/gnustep/base/NSInvocation.h: * Source/GSArray.m: * Source/GSAttributedString.m: * Source/GSCompatibility.m: * Source/GSCountedSet.m: * Source/GSDictionary.m: * Source/GSFFCallInvocation.m: * Source/GSFTPURLHandle.m: * Source/GSFileHandle.m: * Source/GSFormat.m: * Source/GSString.m: * Source/GSTcpPort.m: * Source/GSTemplateValue.m: * Source/NSArray.m: * Source/NSAutoreleasePool.m: * Source/NSBundle.m: * Source/NSCalendarDate.m: * Source/NSConcreteNumber.m: * Source/NSCountedSet.m: * Source/NSData.m: * Source/NSDebug.m: * Source/NSInvocation.m: * Source/NSLog.m: * Source/NSMethodSignature.m: * Source/NSNotificationCenter.m: * Source/NSObject.m: * Source/NSPortCoder.m: * Source/NSRunLoop.m: * Source/NSScanner.m: * Source/NSSerializer.m: * Source/NSString.m: * Source/NSTimeZone.m: * Source/NSUnarchiver.m: * Source/mframe.m: * Source/Additions/GSMime.m: * Source/Additions/GSXML.m: * Tools/AGSOutput.m: * Tools/AGSParser.m: * Tools/defaults.m: * Tools/gdomap.c: * Tools/pl2link.m: * Tools/sfparse.m: * Tools/make_strings/StringsFile.m: Tweaks for warning free compilation with gcc-3.4 ... many comparisons os signed and un signed values avoided etc. 2003-01-03 Richard Frith-Macdonald * Tools/AGSHtml.m: Don't try to make a type reference to the superclass of NSObject. 2002-12-31 Richard Frith-Macdonald * Source/NSPage.m: Document all functions. 2002-12-31 Kelvin * Source/NSPage.m (NSRealMemoryAvailable): Add support for MINGW and BeOS. 2002-12-31 Richard Frith-Macdonald * Source/GSEQ.h: Optimisations for normalising sequences, especially where they contain latin1 characters. * Source/Additions/GCDictionary.m: Update map tables for macosx * Source/NSMapTable.m: Update for macosx compatibility, add some documentation and move stuff from externs.m * Source/NSHashTable.m: Update for macosx compatibility, add some documentation and move stuff from externs.m * Source/externs.m: Remove map and hash table stuff * Source/NSException.m: Fix documentation cross ref error. * Source/NSAssertion.m: Improve documentation. * Headers/gnustep/base/NSException.h: Include assertion documentation. * Headers/gnustep/base/NSMapTable.h: Update for macosx compatibility. * Headers/gnustep/base/NSHashTable.h: Ditto * Tools/AGSHtml.m: Fix typo ... excess semicolon in constant output. * Tools/AGSParser.m: Fix error failing to find comment for constants. * Source/NSObjCRuntime.m: Document functions. 2002-12-30 Adam Fedor * SSL/GNUmakefile: Don't compile if base=no * Tools/AGSIndex.h: Include gnustep/base/GSXML.h. * Tools/AGSHtml.m: Include GNUstep.h * Tools/AGSInde.m, Tools/AGSOutput.m, Tools/AGSParser.m, Tools/HTMLLinker.m: Idem. * Tools/GNUmakegile: Only compile autogsdoc when add=yes * Tools/Makefile.preamble: Include -lgnustep-baseadd when add=yes Mon Dec 30 18:19:55 2002 Nicola Pero * configure.ac: Recognize apple OBJC_RUNTIME_LIB. * configure: Regenerated. * Makefile.postamble: Updated check for gnu FOUNDATION_LIB. * Source/Makefile.preamble (libgnustep-baseadd_LIBRARIES_DEPEND_UPON): Do not add -framework Foundation on Apple, it's added automatically by gnustep-make. * Source/GNUmakefile: Updated check for OBJC_RUNTIME_LIB. * Source/Additions/GNUmakefile: Updated checks for OBJC_RUNTIME_LIB and FOUNDATION_LIB. 2002-12-28 Kelvin * Source/NSPage.m: Add BeOS support. * Source/NSProcessInfo.m ([NSProcessInfo -operatingSystem]): Idem (Also added solaris (fedor@gnu.org)). 2002-12-24 Richard Frith-Macdonald * Source/Additions/Unicode.m: Tidied and optimised binary searches. 2002-12-19 Richard Frith-Macdonald * Tools/AGSParser.m: Fix bug handling repeated opeing braces. 2002-12-17 Richard Frith-Macdonald * Tools/AGSIndex.m: Fix error indexing vararg methods. * Source/Additions/Unicode.m: Added home-brewed support for UTF8 to avoid use of iconv where not necessary.q Hope the code is OK :-) 2002-12-12 Richard Frith-Macdonald * Headers/gnustep/base/NSDistributedNotificationCenter.h: add type for LAN-wide notifications. Add ivar to support this. * Source/NSDistributedNotificationCenter.m: Implement support for a LAN-wide notification center. Fully document class. * Tools/gdnc.m: Add new GSNetwork flag to operate as LAN-wide notification center. * Tools/AGSHtml.m: Don't output contents section if there is nothing to show (ie must have at least two sections to index). * Source/NSConnection.m: Add locks to protect proxy cache in timeout. 2002-12-10 Adam Fedor * configure.ac: Enable libffi on darwin by default. 2002-12-10 Richard Frith-Macdonald * Source/NSArray.m: ([removeObjectsFromIndices:numIndices:]) bugfix for sorting by Kelvin Sherlock. * Source/NSConnection.m: Experimental code to keep local objects retained long enough to deal with most cases where the remote process may want them again. * Source/NSHost.m: Don't cache local host name ... it may change due to use of DHCP etc. 2002-12-08 Richard Frith-Macdonald * Source/NSThread.m: Fix race condition firing perform holder. Fix supplied by Philip Derrin. 2002-12-05 Richard Frith-Macdonald * Source/NSUserDefaults.m: Fix uninitialised local variable 'locale' which was causing a crash ... not 100% sure my fix is making the code work as intended. Could Adam please check it? 2002-12-04 Adam Fedor * Headers/gnustep/base/GSLocale.h: Add category arg to SetLocale functions. * Source/GSLocale.m (GSSetLocaleC, GSSetLocale): Update for change. * Source/NSObject.m (+initialize): Idem. * Source/NSUserDefaults.m ([NSUserDefaults +standardUserDefaults]): Idem. 2002-12-04 Richard Frith-Macdonald * Source/NSSerializer.m: bugfix deserialisation ... was trying to read size of date/number when these values were not being serialized. 2002-12-03 Mirko Viviani * Source/NSBundle.m ([NSBundle +initialize]): check for linked framework in two passes, first collect all the framework classes, then add it. The previous routine failed to add all the frameworks. 2002-12-02 Adam Fedor * Port baseadd to MacOSX. * Makefile.postamble (header-links): Don't link gnustep/gui to Foundation for FOUNDATION_LIB=nx * Headers/gnustep/base/NSObjCRuntime.h (FOUNDATION_EXPORT): Define only if not defined already. * Headers/gnustep/base/objc-gnu2next.h: Define _CLS_META, _CLS_CLASS * Source/Makefile.preamble (libgnustep-baseadd_LIBRARIES_DEPEND_UPON): Depend on framework Foudation if FOUNDATION_LIB=nx * Source/objc-gnu2next.m: Move most functions... * Source/Additions/GSNextRuntime.m: ...to here. * Source/Additions/GSCompatibility.[hm]: New files. * Source/Additions/GCDictionary.m: Include it. * Source/Additions/GSMime.m: Idem. * Source/Additions/GSXML.m: Idem. * Source/Additions/GCObject.m: Idem. Null out mutex code on NeXT_RUNTIME (Need a better fix). * Source/Additions/GNUmakefile: Don't compile Unicode.m on FOUNDATION_LIB=nx (not ported yet). * Source/Additions/GSObjCRuntime.m (GSObjCAddClasses): Version for NeXT_RUNTIME. (GSObjCAddClassBehavior): Fixes for NeXT_RUNTIME. * Source/Additions/behavior.m (behavior_class_add_class): Idem. 2002-12-02 Jonathan Gapen * Headers/gnustep/base/NSPort.h: Add NSSocketPort interface. * Source/NSSocketPort.m: New file. New MacOS X class partially implemented; serves as BSD socket wrapper. 2002-12-02 Adam Fedor * base.make.in (CONFIG_SYSTEM_LIBS): Set only if shared=no. * config.make.in (CONFIG_SYSTEM_LIBS): Set only if shared=yes. * Source/Makefile.preamble (libgnustep-base_LIBRARIES_DEPEND_UPON): Depend on $(CONFIG_SYSTEM_LIBS) if shared=yes. 2002-11-29 Richard Frith-Macdonald * Tools/plparse.m: Stefan Urbaneks patch to return 1 on failure. * Tools/sfparse.m: Similar code for this tool. * Source/Additions/GSObjCRuntime.m: Tidied function names * Headers/gnustep/base/GSObjCRuntime.h: ditto. * Source/NSKeyValueCoding.m: Use new function names. 2002-11-28 Richard Frith-Macdonald * Tools/AGSParser.m: Fix so we document static declarations made in headers and only ignore them in implementation. * Tools/AGSOutput.m: Bugfix to output ivar type information. * Tools/AGSHtml.m: Reduce space around examples. Bugs reported by Chris B. Vetter * Source/Additions/GSObjCRuntime.m: Tidied function name conventions. * Headers/gnustep/base/GSObjCRuntime.h: ditto. * Source/NSKeyValueCoding.m: Use new function names. * Source/mframe.m: When scanning arguments, skip type information for things poionted to by a pointer - more efficient than scanning the fine structure and then throwing away the scanned information. * Source/additions/GSMime.m: Fill in 'type' field in multipart/related and fix bug in seaarch by content id. Also minor consistency change to API. 2002-11-27 Manuel Guesdon * Source/Additions/GSObjCRuntime.m: fixed type call typo in GSFindInstanceVariable 2002-11-27 Adam Fedor * configure.ac (INCLUDE_FLAGS): New for holding flags needed for compiling base. * config.make.in (CONFIG_SYSTEM_INCL): Use it. * base.make (CONFIG_SYSTEM_INCL): Remove CPPFLAGS (CONFIG_SYSTEM_DEFS): Remove. * Source/Additions/GNUmakefile: include config.mak 2002-11-27 Richard Frith-Macdonald * Source/Additions/GSObjCRuntime.m: New file with GNUstep extensions from NSObjCRuntime, plus renamed behavior functions, plus a few other runtime manipulation functions. EXPERIMENTAL * Headers/gnustep/base/GSObjCRuntime.h: declarations for above. * Source/GSCompatibility.m: Don't use new format plists when writing descriptions. Also, honor NSWriteOldStylePropertyLists user default to write old style property-lists rather than new style or xml style. * Source/NSUser.m: Use USERPROFILE for default home directory on windoze. * Source/NSArray.m: Write non-xml property lists as ascii. * Source/NSDictionary.m: Write non-xml property lists as ascii. * Source/mframe.m: use objc_alignof_type() as suggested by Roland Schwingel. Long ago the objc runtime version was buggy so mframe implemented its own algorithm. Now the objc runtime one is better. 2002-11-26 Richard Frith-Macdonald * Source/Additions/GCObject.m: Attempt to make garbage collecting thread-safe. * Source/Additions/GCArray.m: Fix count initialising mutable array. * Source/Additions/GSMime.m: Provide a method to generate and return a string suitable for use as a boundary. Make tolerant of multipart messages with 'application' as the message type. Added ([-setBuggyQuotes:]) method for parsing stuff produced by microsoft ;-( 2002-11-25 Richard Frith-Macdonald * Source/NSUserDefaults.m: Treat '-' on its own as an argument rather than the start of a flag name. * Source/Additions/GSMime.m: Place angle brackets around generated content ID. Add method to generate message ID. Tidy comments a little. 2002-11-20 Richard Frith-Macdonald * Source/libgnustep-base.def: Add garbage collecting classes. 2002-11-20 Adam Fedor * Source/NSBundle.m (+preferredLocalizationsFromArray:forPreferences:): Check for array with no objects. ([NSBundle -localizedInfoDictionary]): Idem. 2002-11-20 Richard Frith-Macdonald * Source/Additions/Unicode.m: Work around bug in the redhat 8 iconv library ... was sucessfully opening the encoding "" when it shouldn't. 2002-11-19 Adam Fedor * Version: 1.5.1 * Documentation/news.texi: Updated. 2002-11-19 Adam Fedor * Headers/gnustep/base/NSBundle.h: More documentation. Add missing MacOSX methods. * Source/NSBundle.m (-executablePath): New (-load): Use it. (+pathsForResourcesOfType:inDirectory:): New stub. (-pathsForResourcesOfType:inDirectory:forLocalization:): Idem. (-pathForResource:ofType:inDirectory:forLocalization:): Idem. (+preferredLocalizationsFromArray:): New method. (+preferredLocalizationsFromArray:forPreferences:): Idem. (-localizedInfoDictionary): Idem. (-localizations): Idem. (-preferredLocalizations): Idem. * Source/cifframe.m (cifframe_from_info): Fix so that stucture returns get space allocated. 2002-11-19 Richard Frith-Macdonald * Source/behavior.m: Moved to Source/Additions/behavior.m * Source/Unicode.m: Moved to Source/Additions/Unicode.m * Source/Additions/GCObject.m: new experimental GC class. * Source/Additions/GCArray.m: ditto * Source/Additions/GCDictionary.m: ditto * Headers/gnustep/base/GCObject.h: Garbage collection classes intended for use by gdl2 and gsweb. 2002-11-18 Richard Frith-Macdonald * Source/GSCompatibility.m: Fix for case where a non property list object is found when outputting a description. 2002-11-12 Richard Frith-Macdonald * Source/NSUserDefaults.m: Fix for getting integer, float and bool values when they are stored as NSNumbers (problem reported by Ludovic Marcotte). Also optimise a little. 2002-11-15 Richard Frith-Macdonald * Source/NSThread.m: Port pipe to mingw. * Tools/gdomap.c: Fix for modern mingw interface lookup. Patch by Tom Koelman 2002-11-12 Richard Frith-Macdonald * Source/NSUserDefaults.m: Try again ... get ([-setVolatileDomain:forName:]) and ([-setPersistentDomain:forName:]) to conform to both the OpenStep standard and the current MacOS-X documentation. 2002-11-11 Richard Frith-Macdonald * Source/NSString.m: adocument property list stuff. * Source/NSUserDefaults.m: set integers, floats and bools as NSNumber Bugfix ([-setVolatileDomain:forName:]) was checking wrong list of domains. Tidied. 2002-11-10 Richard Frith-Macdonald * Headers/gnustep/base/NSObject.h: Removed GNUstep plist extensions. * Source/NSObject.m: ditto. * Source/GSCompatibility.m: Implement new plist generator. * Source/NSArray.m: Use new plist code * Source/NSData.m: ditto * Source/NSDictionary.m: ditto * Source/NSSerializer.m: handle NSNumber and NSDate * Source/NSString.m: ditto, plus implement extensions to old plist support so we can encode NSNumber and NSDate values. Remove GNUstep property list extensions from the api ... make more like MacOS and OpenStep spec by having a central mechanism for generating property lists rather than spreading the code across the plist classes. Also ... maintain allocation debug accounting when making objects immutable. 2002-11-09 Richard Frith-Macdonald * Source/NSObject.m: use NSString implementation of ([descriptionWithLocale:indent:to:]) * Source/NSUserDefaults.m: ([setObject:forKey:]) validate and raise exceptions if given bad info. 2002-11-07 02:21 Alexander Malmberg * Source/GSString.m: (-makeImmutableCopyOnFail:): Set isa to correct class. 2002-11-04 Richard Frith-Macdonald * Source/NSArray.m: Ensured some documentation in place for almost all methods. * Source/Additions/GSMime.m: Fix broken method reference. * Source/Additions/GSXML.m: ditto * Source/NSScanner.m: ditto * Source/NSUnarchiver.m: ditto * Tools/AGSIndex.m: Minor fix for superclass reference lookup. * Tools/AGSHtml.m: ditto 2002-11-03 Richard Frith-Macdonald * Source/NSRunLoop.m: Revert to remove unneeded notification setup. * Source/NSThread.m: Rewrite pierres changes, scrapping all conditionally compiled code that would never be used, rewriting unix specific stuff (so it might run under windoze ... not yet tested) removed unnecessary code and simplified, etc etc. Fixed bugs in usage of condition locks so it actually works. * Testing/thread.m: New test to try out performSelectorOnMainThread:withObject:waitUntilDone:modes: 2002-11-02 Pierre-Yves Rivaille * Source/NSRunLoop.m ([NSRunLoop -init]): ask to be informed about NSWillBecomeMultiThreadedNotification if _willBecomeMultiThreaded: method existes. * Source/NSRunLoop.m: new GSAppKitInterThreadRunLoopWatcher private class. ([NSRunLoop -_willBecomeMultiThreaded:]): new method, sets up the lock, the socket and new run loop watcher that'll listen on the socket. [NSObject -performSelectorOnMainThread:withObject:waitUntilDone:modes:]): modified to use the previous changes. 2002-11-01 Richard Frith-Macdonald * Headers/gnustep/base/NSBundle.h: Tidied/corrected documentation markup. * Headers/gnustep/base/NSDate.h: Added NSTimeIntervalSince1970 and removed GSTimeNow() from public API. * Source/NSDate.m: Update to use NSTimeIntervalSince1970 * Source/NSTimer.m: Declare GSTimeNow() locally * Source/NSprocessInfo.m: ditto * Source/Additions/GSMime.m: more tolerant parsing ... ignore excess data in multi-part document. Thu Oct 31 00:46:23 2002 Nicola Pero * Headers/gnustep/base/NSBundle.h: Added more documentation. Wed Oct 30 23:42:50 2002 Nicola Pero * Source/NSBundle.m ([+_addFrameworkFromClass:]): New code locating linked frameworks magically - no matter where they are on disk - by using objc_get_symbol_path(). If that fails or is not available, fall back on the existing code. Fixed NSLog() message. 2002-10-30 Richard Frith-Macdonald * Source/NSThread.m: Implemented and documented new MacOS-X methods - ([-performSelectorOnMainThread:withObject:waitUntilDone:modes:]) and ([-performSelectorOnMainThread:withObject:waitUntilDone:]) Wed Oct 30 03:14:34 2002 Nicola Pero * Headers/gnustep/base/objc-load.h: Added copyright notice. (objc_get_symbol_path): Declare to take a Category *, not a struct objc_category *, argument; documented. * Source/objc-load.m: Include config.h first. Define _GNU_SOURCE if HAVE_DLADDR is defined. (objc_get_symbol_path): Fixed crash with classes or categories with long names. Updated declaration. * config/objc-sys-dynamic.m4 (OBJC_SYS_DYNAMIC_LINKER): Print a message displaying the type of dynamic linker found. Add -ldl on the link line for linux-gnu and other systems, so that dladdr() is actually found. With the 'simple' linker, print a message saying if we found dladdr() or not. (OBJC_SYS_DYNAMIC): Historical unused macro removed. * configure: Regenerated. 2002-10-28 Richard Frith-Macdonald * Source/NSFileManager.m: include statvfs.h if available. 2002-10-26 Adam Fedor * Source/NSException.m: Document. * Source/NSFileHandle.m: Partial Documentation. * Source/NSObject.m: Fix typo in docs. 2002-10-25 Mirko Viviani * Source/NSBundle.m ([NSBundle -load]): set _codeLoaded before loading the bundle. 2002-10-22 Richard Frith-Macdonald * Tools/AGSParser.m: Avoid duplication of method comments when parsing the same file as both header and source. 2002-10-22 Richard Frith-Macdonald * Tools/AGSOutput.m: ([-split:]) In links generated from class and method specifications in square brackets, place a space between the class and the method name. * Tools/gsdoc-1_0_0.dtd: Corrected minor entity errors. 2002-10-21 Adam Fedor * Headers/gnustep/unicode/thai.h: New file. * Headers/gnustep/base/NSString.h (_NSStringEncoding): Add NSISOThaiStringEncoding. * Source/NSString.m (-dataUsingEncoding:allowLossyConversion:): Handle it. * Source/Unicode.m (struct _strenc_ str_encoding_table[]): Idem. (GSEncodingForRegistry): Idem. (GSToUnicode, GSFromUnicode): Idem. (Patches, modified, from Banlu Kemiyatorn ). 2002-10-21 Adam Fedor * Source/GSLocale.m (GSLanguageFromLocale): Implement regardless of HAVE_LOCALE_H. * Source/Unicode.m (GSEncodingForRegistry): New (from [GSFontInfo +encodingForRegistry:encoding:]). (GSEncodingFromLocale): New. (GetDefEncoding): Rearrange encoding check. * Resources/Languages/Locale.encodings: New file. 2002-10-21 Adam Fedor * Documentation/coding-standards.texi: Update. 2002-10-14 Richard Frith-Macdonald Source/NSObject.m: Add ([-makeImmutableCopyOnFail:]) for use by methods wishing to return constant string/array/dictionary etc results after building them using mutable objects they created. Source/GSArray.m: Implement ([makeImmutableCopyOnFail:]) Source/GSString.m: ditto Source/GSDictionary.m: ditto Source/GSSet.m: ditto Source/NSFileManager.m: Use it 2002-10-13 Mirko Viviani * Source/NSBundle.m ([NSBundle +_addFrameworkFromClass:]): remove the classes in the _loadingBundle that does not belong to it but with frameworks linked with it. ([NSBundle +bundleForClass:]): construct a list of NSFramework_* classes loaded with the bundle. ([NSBundle -load]): call _addFrameworkFromClass: for all linked frameworks with the bundle. 2002-10-13 Richard Frith-Macdonald * Tools/AGSHtml.m: Create automatic references to protocols in type specifications of the form (id) * Tools/autogsdoc.m: Add -Files option to read names of files to process as a property list rather than using command line args. Add -Clean flag to remove generated output files and purge generated data from templates. Add -CleanTemplates to completely temove template files. * Tools/AGSParser.m: Warn about private methods and ivars. 2002-10-12 Richard Frith-Macdonald * Source/NSProcessInfo.m: Make safe to reinitialise with args. * Source/Additions/GSXML.m: Correct handling of atttribute values. * Tools/autogsdoc.m: Initialise NSProcessInfo explicitly. 2002-10-11 Richard Frith-Macdonald * Source/NSUserDefaults.m: ([-initWithContentsOfFile:]) check to see if the file is writable and the directory exists. If we can't operate properly, run in read-only ,mode where we try to read the file if possible, but never write defaults back. 2002-10-10 Richard Frith-Macdonald * Source/NSUserDefaults.m: ([-synchronize]) handle locking more carefully ... avoid cpu intensive busy loops and give up after a while. 2002-10-10 Richard Frith-Macdonald * Source/NSLog.m: Added GSPrintf() * Tools/defaults.m: Use GSPrintf() * Tools/pldes.m: ditto * Tools/plser.m: ditto * Tools/plmerge.m: ditto * Tools/plparse.m: ditto * Tools/sfparse.m: ditto * Documentation/Base.gsdoc: Bump gsdoc version to 1.0.0 * Documentation/Functions.gsdoc: ditto * Documentation/TypesAndConstants.gsdoc: ditto * Source/NSLog.m: Fix typo in comment. * Tools/AGSOutput.m: Bump gsdoc version to 1.0.0 * Tools/GNUmakefile: Add gsdoc 1.0.0 dtd * Tools/autogsdoc.m: Bump gsdoc version to 1.0.0 * Tools/gsdoc-0_6_7.dtd: Revert to earlier version * Tools/gsdoc-1_0_0.dtd: New from latest update to 0.6.7 I think the documentation dtd is pretty complete now. 2002-10-09 Richard Frith-Macdonald * Tools/GNUmakefile: revert ... can't build if base library isn't installed. 2002-10-09 Richard Frith-Macdonald * Source/NSLog.m: Lots of documentation added. * Tools/GNUmakefile: build autogsdoc documentation automatically if possible. * Tools/AGSOutput.m: Make automatic cross references for functions. * Source/Docmakefile: Use handcrafted template files. Document the path utilities file. * Documentation/Functions.gsdoc: Handcrafted template. * Documentation/TypesAndConstants.gsdoc: Handcrafted template. 2002-10-08 Richard Frith-Macdonald * Headers/Foundation/NSDebug.h: Make warn logs de-selectable at runtime by setting the NoWarn debug level. Document. Say that debug levels can be added by putting them in the GNU-Debug array in the defaults database. * Source/NSUserDefaults.m: Add contents of the GNU-Debug array to the set of active debug levels. * Tools/AGSParser.m: Updated with support for documenting macros. * Tools/AGSOutput.m: ditto * Tools/AGSHtml.m: ditto 2002-10-07 Richard Frith-Macdonald * Source/NSData.m: Update logging after checks for results of memory allocation. * Source/NSTimeZone.m: Don't abort on failure to allocate memory ... just print a log and continue returning a null pointer. 2002-10-06 Richard Frith-Macdonald * Source/NSData.m: readContentsOfFile() fix use of atomic memory on GC systems ... problem noticed by Fred. Sat Oct 5 19:53:03 2002 Nicola Pero * Source/NSData.m ([NSDataMappedFile -initWithContentsOfMappedFile:]): release self and return nil - rather than returning NO, if the path is bad. 2002-10-05 Richard Frith-Macdonald * Tools/AGSOutput.m: Improve warning code, support text output in chapter/section/subsection. * Tools/AGSParser.m: move concatenation of comments into a single method, make it insert a linebreak between concatenated comments, and make it refrain from appending the same comment onto itsself (which would happen if the same file was parsed twice, as both a header and as source). Treat the 'main()' function specially ... don't document it as a function but insert its comments at the end of the 'chapter' part of the output document. These modifications make it easy to document a directory containing tools, by listing the tool source files as arguments to autogsdoc. Tools/gsdoc_0_6_7.dtd: Fix bug preventing use of text in a chapter! * Source/GSString.m: Implement -UTF8String method for better performance. * Source/NSPortNameServer.m: Improve diagnostic message in exception when reporting failure to register ... try to provide all the info needed to begin diagnosing any problem. * Tools/gdomap.c: Make -M flag work with -N. Make -M flag work when used after -N or -L. Improve diagnostic messages on failure so people know what it is trying to do. 2002-10-04 Richard Frith-Macdonald * Source/NSArray.m: Tidied init from file to ensure that everything is released properly on failure, and we don't generate log messages where a lower level API should be doing it. Added some documentation. * Source/NSDictionary.m: ditto * Source/NSString.m: ditto. Also add support for understanding the unicode BOM at the start of UTF8 data and stripping it. * Source/NSData.m: Tidied read from and write to file, adding lots of logging information. Also documented quite a bit. Resolved all conflicts found with Adam's change ... generally in favor of the most informative logging. * Source/NSPortNameServer.m: On failure to register name, make exception message provide lots of detail/advice for newbies. 2002-10-03 Adam Fedor * Source/NSData.m (readContentsOfFile): Change NSDebugLog(s) to NSWarnLog or NSLog. (-writeToFile:atomically:): Idem. ([NSDataMappedFile -initWithContentsOfMappedFile:]): Idem. * Source/NSDictionary.m ([NSDictionary -initWithContentsOfFile:]): Release ourselves and return nil if file cannot be read. 2002-10-03 Richard Frith-Macdonald * Source/NSRunLoop.m: ([-runMode:beforeDate:]) permit the use of a nil date and document it. This is the behavior MacOS seems to have and seems to be more useful than prohibiting nil dates. 2002-10-02 Richard Frith-Macdonald * Source/NSDistributedLock.m: Document and tidy. * Source/NSTimeZone.m: Don't set system zone prematurely. * Source/NSString.m: Don't bother to cache constant string class. Document it. 2002-10-01 Adam Fedor * config/pathxml.m4: Filter -L/usr/lib out of XML_LIBS. * configure: Regenerate. 2002-10-01 02:21 Alexander Malmberg * Source/NSUserDefaults.m (-synchronize): Handle lockDate being nil. 2002-09-30 Richard Frith-Macdonald * NSTimeZones/NSTimeZones.tar: Updated to latest information. * Source/NSCalendarDate.m: Tidy up a little. * Source/NSTimeZone.m: Rewrite main timezone code for performance - Roughly doubles speed of most NSCalendarDate stuff. * NSThread.m: Fix for single threaded operation ... suggested by Ludovic Marcotte. 2002-09-29 Richard Frith-Macdonald * Source/GSFileHandle.m: Encapsulate read and write operations in new low level methods to ease subclassing. * SSL/GSSSLHandle.m: Use new read and write methods to simplify. 2002-09-28 Richard Frith-Macdonald * Source/NSCalendarDate.m: Fix problem with signed/unsigned type conversion when initialising a date at a daylight savings time boundary, and attempt to improve the code for adding offsets to dates. * Source/Makefile.postamble: patch to fix some warnings in uninstall (by David Ayers). 2002-09-27 Richard Frith-Macdonald * Source/GSTcpPort.m: ([GSTcphandle+initialize]) ignore SIGPIPE in case a socket gets closed while we are writing. 2002-09-26 Richard Frith-Macdonald * Source/Additions/GSMime.m: Fix typo. Thu Sep 26 01:28:33 2002 Nicola Pero * Tools/make_strings/GNUmakefile: Do not include ctool.make. 2002-09-25 Richard Frith-Macdonald * Source/Additions/GSXML.m: Added ([-previousElement]) to match the [(-nextElement]) method. Wed Sep 25 02:46:28 2002 Nicola Pero * Tools/make_strings/make_strings.m (main): Remove "" languages from the list of languages before processing. 2002-09-24 Richard Frith-Macdonald * Source/GSTcpHandle.m: ([-handleForPort:beforeDate:]) fix bug where we could end up using the last (non-matching) handle rather than creating a new one. 2002-09-20 Richard Frith-Macdonald * Source/GSTcpHandle.m: ([-connectToPort:beforeDate:]) Added more informative logging for problem condition reported by Nicila ... perhaps it will help tracking down cause. 2002-09-19 Richard Frith-Macdonald * Source/GSFormat.m: Where a %p format prints a null pointer, print the text (null). * Source/GSTcpHandle.m: Check port for invalidation while looping on write events, so we can fail if we become invalid while sending or connecting, before the port timeout expires. * Source/NSConnection.m: Check connection for invalidation while looping waiting for a reply, so we can fail if we become invalid before the timeout expires. * Source/DocMakefile: Specify template options * Tools/autogsdoc.m: Remove hack to turn templates on by default. Document the use of templates. * Tools/gsdoc-0_6_7.dtd: Hack in more types for indexing ... don't know if the software works for them though. 2002-09-17 Richard Frith-Macdonald * Source/Unicode.m: Restructure conversion from unicode slightly, to make it clearer and more readable and to include handling of lossy conversions. * Headers/gnustep/unicode/gsm0338.h: Added table for lossy conversion from unicode. 2002-09-16 Richard Frith-Macdonald * Tools/AGSParser.m: Bugfix ... look for source files more intelligently. Try both current directory and relative to header. * Tools/AGSOutput.m: When creating template output file for functions etc because none was supplied, take account of the -Up flag and create an up link in it. * Source/GSHTTPURLHandle.m: If response parsing fails, fail the load operation and (conditionally when debug enabled) log an error. 2002-09-16 Richard Frith-Macdonald * Source/NSFileManager.m: Basic/dummy implementations of new MacOS-X methods added. Attribute handling totally rewritten to work in a lazy way ... so we only set up attribute info in the dictionary when we actually need it. Account 'Number' methods and dictionary keys changed to be account 'ID' instead ... in accordance with MacOS-X usage. Documented the class. * Source/NSData.m: ([-writeToFile:atomically:]) implement workaround for bug in windoze implementation of rename() * Source/NSString.m: Remove some redundant code duplicating stuff in GSMime.m 2002-09-15 Richard Frith-Macdonald * Source/NSFileManager.m: MacOS-X ([componentsToDisplayForPath:]) and ([displayNameAtPath:]) methods implemented. Creation date added. * Source/NSString.m: More alterations to GNUstep extension methods to make their names consistent with other methods. Q. Should we deprecate/remove them entirely? * Tools/gsdoc.m: Update for changes to extension methods... though this tool has been deprecated for some time now, so perhaps we should remove it? 2002-09-13 Adam Fedor * Source/cifframe.m (cifframe_guess_struct_size): Recurse if element contains structures. (cifframe_from_info): Alloc room for return value even if caller doesn't use it. Thu Sep 12 11:02:03 2002 Nicola Pero * Source/NSObject.m ([+_becomeMultiThreaded:]): Fixed typo - this method was declared to take a 'NSNotification' rather than a 'NSNotification *' argument. 2002-09-10 Richard Frith-Macdonald * Source/GSLocale.m: Double locking check fix * Source/NSFileManager.m: Double locking check fix Fixes contributed by David Ayers 2002-09-08 Richard Frith-Macdonald * Headers/gnustep/base/GSIArray.h: Minor optimisation * Headers/gnustep/unicode/gsm0338.h: Correct unicode to gsm table * Source/Unicode.m: Correct gsm conversion and optimise unicode to 8-bit charaacter conversion for other character sets. Also correct lossy/non-lossy conversion using iconv. 2002-08-30 Adam Fedor * Version: 1.5.0 2002-08-30 Richard Frith-Macdonald * Source/NSString.m: Implemented new MacOS-X methods - ([-stringByPaddingToLength:withString:startingAtIndex:]), and ([-stringByTrimmingCharactersInSet:]) Tidied a couple of extension method names for consistency and documented several methods. 2002-08-29 Richard Frith-Macdonald * Source/Additions/GSXML.m: Get libxml to put filename in error messages when it is available. 2002-08-28 Richard Frith-Macdonald * Source/Unicode.m: Rewritten the way that iconv is used to decide upon the available encodings ... lazy evaluation so that we don't try to lookup an encoding until we have to. This should improve process startup time (especially in gdb) since the iconv operations seem to be very slow. 2002-08-27 Richard Frith-Macdonald * Source/Additions/GSXML.m: Integrated GSXPath code by Nicola Pero provides an API to use the xpath support built into libxml from version 2.3 onwards. * Source/NSThread.m: Implement new priority methods. * Source/NSObject.m: Raise exception when passed null selector. 2002-08-27 Richard Frith-Macdonald * Source/NSData.m: ([-writeToFile:atomically:]) Removed bogus line which deleted files when it shouldn't. Added new MacOS-X methods supporting NSData objects where the bytes are not owned by the data object. Removed GNUstep extension which provided this functionality before. * Source/NSUserDefaults.m: Use distributed lock to ensure that there is no possible window when the defaults file is invalid ... not all systems guarantee that the rename() system call is atomic. * Source/NSArray.m: New MacOS-X methods ([-initWithArray:copyItems:]) ([-exchangeObjectAtIndex:withObjectAtIndex:]) * Source/NSTimer.m: Update for compatibility with latest MacOS-X * Source/NSObject.m: New ([+isSubclassOfClass:]) and perform cancellation from MacOS-X * Source/NSRunloop.m: New perform cancellation method from MacOS-X proofreading help/fixes from David Ayers. 2002-08-25 Richard Frith-Macdonald * Source/WindowsFileHandle.m: Removed ... no longer used. * Source/GSHTTPURLHandle.m: Don't use getpid() ... not portable. * Tools/gdomap.c: Don't use getuid() under windoze. 2002-08-24 Richard Frith-Macdonald * Source/NSURL.m: ([-initFileURLWithPath:]) check to see if path is a directory and append a trailing slash if necessary. Remove hack to refrain from stripping last patch component in file URLs. 2002-08-24 Richard Frith-Macdonald * Source/NSURL.m: Hacks for compatibility with MacOS-X in returning path of a file URL ... the RFC says we should only return a path for a generic URL (scheme://user:passwd@host:port/path#frag?query) which a file URL certainly isn't. However, for compatibility we now treat a file URL more like a generic one. Also when creating absolute file URLs from base plus relative, the MacOS-X code doesn't strip the last path component of the base URL as it should ... we emulate that too. 2002-08-22 Richard Frith-Macdonald * Source/NSFileManager.m: Fix typo ... missing closing brace under windoze. Reported by Alex Stockdale. 2002-08-21 Richard Frith-Macdonald * Source/NSObject.m: ([-replacementObjectForPortCoder:]) Documented method and removed unused/unwanted code dealing with NSDistantObject (NSDistantObject overrides the method). 2002-08-20 Alexander Malmberg * Source/NSObject.m: Fix silly typo. 2002-08-20 Alexander Malmberg * Source/NSConnection.m: (-removeProxy:) Remove unbalanced release. 2002-08-20 Richard Frith-Macdonald * Source/GSCountedSet.m: * Source/GSFileHandle.m: * Source/NSArchiver.m: * Source/NSData.m: * Source/NSDistributedNotificationCenter.m: * Source/NSHashTable.m: * Source/NSMapTable.m: * Source/NSObjCRuntime.m: * Source/NSObject.m: * Source/NSPortCoder.m: * Source/NSScanner.m: * Source/NSString.m: * Source/Unicode.m: * Source/UnixFileHandle.m: * Source/WindowsFileHandle.m: * Source/callframe.m: * Source/cifframe.m: * Source/mframe.m: Fix trivial typos and spelling errors pointed out by David Ayers. 2002-08-20 Richard Frith-Macdonald * Source/GSCountedSet.m: * Source/NSAutoreleasePool.m: * Source/NSCharacterSet.m: * Source/NSCountedSet.m: * Source/NSData.m: * Source/NSDebug.m: * Source/NSDictionary.m: * Source/NSFileHandle.m: * Source/NSLock.m: * Source/NSNull.m: * Source/NSNumber.m: * Source/NSObject.m: * Source/NSPipe.m: * Source/NSScanner.m: * Source/NSSerializer.m: * Source/NSSet.m: * Source/NSString.m: * Source/NSThread.m: * Source/NSTimeZone.m: * Source/Additions/GSMime.m: * Headers/gnustep/base/NSBundle.h: * Headers/gnustep/base/NSRange.h: * Headers/gnustep/base/NSSet.h: Modify comments to include gsdoc documentation for autogsdoc. This completes the transfer of all gsdoc documentation into the source code. * Documentation/gsdoc: All obsolete files removed. 2002-08-19 Richard Frith-Macdonald * Source/NSProxy.m: Documented all methods and corrected implementation of some introspection methods. 2002-08-16 Richard Frith-Macdonald * Source/Base.gsdoc: Moved to Documentation. * Source/GNUmakefile: Removed documentation building code. * Source/DocMakefile: New file for building refetrence documentation. * Documentation/Base.gsdoc: New from source directory. * Documentation/GNUmakefile: Set up installation directory name. * Documentation/Makefile.postamble: Use ../Source/DocMakefile to build library reference documentation and deal with installation. 2002-08-15 Adam Fedor * configure.ac: Add NetBSD header/ldflag support (Patch from Peter Cooper). * Headers/gnustep/base/GNUstep.h: New compatibility file. 2002-08-15 Richard Frith-Macdonald * SSL/GNUmakefile: Added -lgnustep-base and -lobjc to SSL_BUNDLE_LIBS So that bundle is linked with a dependency on these libraries ... to ensure that dynamic linkage works when the bundle is loaded in from java via jigs. 2002-08-15 Adam Fedor * SSL/configure.ac: Simplified check for libraries. Added socket lib check for Solaris. * Headers/gnustep/base/NSDecimalNumber.h: Add NSNumber category for decimalValue. * Source/NSDecimalNumber.m ([NSNumber -decimalValue]): Implemented. 2002-08-14 Richard Frith-Macdonald * Source/GSString.m: Allow 'true' as boolean value * Source/NSConcreteNumber.m: Output 'YES' as boolean in description. * Source/NSNotificationCenter.m: Fix dumb memory leak. * Source/NSNumber.m: Output 'YES' as boolean in description. * Source/NSUserDefaults.m: Set 'YES' as boolean string. * Headers/Foundation/NSObject.h: Fix v dumb memory leak. * Source/GSHTTPURLHandle.m: Append crlf to separate headers from body rather than just an lf. * SSL: Renamed SSL class and source file to reflect the fact that the code is not unix specific. 2002-08-11 Richard Frith-Macdonald * configure.ac: Check for libxml version 2.3.0 or greater to ensure we have xpath support. * Source/NSDecimalNumber.m: implement ([-getValue:]) and ([-initWithBytes:objCType:]) 2002-08-09 Richard Frith-Macdonald * Source/NSNotificationCenter.m: ([-postNotification:]) Correct to post the actual notification we are given rather than a notification built from that one. Bug report by Alexander Malmberg. 2002-08-08 Richard Frith-Macdonald * Source/NSProcessInfo.m: ([-globallyUniqueString]) Ensure that the string contains no dots, so it can be used as a filename under windoze. * Source/Additions/GSXML.m ([GSXMLNode -setNamespace:]): Documented. 2002-08-07 Richard Frith-Macdonald * Source/NSString.m: ([-boolValue]) Accept 'true' as well as 'YES' * Source/NSThread.m: Modified to avoid using non-standard notification initialisation. * Source/NSNotification.m: Rewritten as abstract/cluster class for implementation compatibility with MacOS-X * Source/NSNotificationCenter.m: Modified posting to behave like the MacOS-X implementation. Implement concrete subclass of NSNotification. * Source/NSUserDefaults.m: Try to make creation of new defaults database an atomic operation. * Source/NSObject.m: Remove dealloc notifications hack ... the dealloc method can now safely be used to refrain from deallocating objects, so I don't think the hack is needed any more. * Source/NSProcessInfo.m: ([-globallyUniqueString]) Update to ensure uniqueness across all hosts, processes, and threads. * Tools/gdomap.c: Tidyup patch by Matthias Klose 2002-07-29 Adam Fedor * Merge changes from 1.4.0 onto main branch. 2002-07-09 Richard Frith-Macdonald * Source/GSTcpHandle.m: Always use runloop in NSConnectionReplyMode to avoid other NSDefaultRunLoopMode events being triggered while executing a DO method. **EXPERIMENTAL** 2002-08-06 Adam Fedor * Source/NSString.m (-getLineStart:end:contentsEnd:forRange:): Change location of start of end char search (Patch from Pete French). 2002-07-27 Adam Fedor * Version: 1.4.0 2002-07-23 Adam Fedor * Source/NSInvocation.m ([GSFrameInvocation -initWithMethodSignature:]): Return nil if signature is nil. * Source/GSFFCallInvocation.m (-initWithMethodSignature:): Idem. * Source/GSFFIInvocation (-initWithMethodSignature:): Idem. 2002-07-20 Adam Fedor * Source/NSDecimal.m: ifdef for compiling on Darwin (report from Carl Eugen). * Source/NSInvocation.m ([-initWithSelector:): Rewrite to use designated initializer. (-initWithTarget:selector:): Idem. 2002-07-18 Adam Fedor * Tools/gdomap.c (main): Write the pidfile before switching away from root, but only if the user is root. 2002-07-17 Adam Fedor * Source/NSString.m (-getLineStart:end:contentsEnd:forRange:): Fix lineEnd and contentEnd check for \r\n (particularly at end of string. Tue Jul 16 16:43:59 2002 Nicola Pero * Headers/gnustep/base/GSXML.h ([GSXMLNode -setNamespace:]): Added missing method essential to use namespaces. * Source/Additions/GSXML.m ([GSXMLNode -setNamespace:]): Implemented. 2002-07-08 Richard Frith-Macdonald * Source/NSFileManager.m: Don't standardise path before converting to filesystem representation. * Tools/gdomap.c: Security enhancement - call setgroups(). 2002-07-03 Adam Fedor * Version: 1.3.4 * configure.ac: Remove warning about libffi * Documentation/news.texi: Update. 2002-07-03 Richard Frith-Macdonald * Source/Additions/GSMime.m: Ensure mime-version header appears before other headers. Fix bug in terminatimg mime data. 2002-07-02 Richard Frith-Macdonald * Tools/gdomap.c: Don't write to pidfile until *after* setuid away from root. Bug reported by James Kehl 2002-07-01 Richard Frith-Macdonald * Source/Additions/GSMime.m: Correct test for multipart content when generating raw data. Fix by Mark Allison 2002-06-30 Richard Frith-Macdonald * Headers/gnustep/base/GSFileHandle.h: New version of UnixFileHandle for combined unix/windoze use. * Source/GSFileHandle.m: New combined unix/windows implementation. * Source/NSFileHandle.m: Use GSFileHandle. * Source/GNUMakefile: Build GSFileHandle. * SSL/GSUnixSSLHandle.m: Update for combined GSFileHandle 2002-06-29 Richard Frith-Macdonald * Source/NSObject.m: ([-respondsToSelector:]) handle nul selectors. Bug report by Andy Ruder 2002-06-28 Richard Frith-Macdonald * Source/NSString.m: Change to quote strings in plist output aggressively (quote characters that don't really need quoting) while still parsing flexibly ... ie handle unquoted strings as long as they don't contain 'special' characters. Fix for Tom Hageman 2002-06-27 Richard Frith-Macdonald * Tools/AGSParser.m: ([-parseDeclaration:]) Correct wrongly positioned autorelease pool in last change. Hope that's the only one. Wed Jun 26 15:32:36 2002 Nicola Pero * base.make.in (OBJC_LIBS): Don't add -lobjc_gc -lgc for gc=yes, now should be done by gnustep-make automatically. Tue Jun 25 13:31:12 2002 Nicola Pero * Tools/AGSHtml.m: Tidy up autorelease pool macros so that it compiles with gc=yes and old compilers. * Tools/AGSParser.m: Idem. * Tools/AGSOutput.m: Idem. * Tools/HTMLLinker.m: Idem. * Tools/autogsdoc.m: Idem. * Tools/gdnc.m: Idem. * Tools/gsdoc.m: Idem. * Tools/make_strings/make_strings.m: Idem. Tue Jun 25 13:13:00 2002 Nicola Pero * Source/Additions/GSMime.m ([-rawMimeData:]): Create the autorelease pool after the other variables, so that it compiles with gc=yes and gcc < 3.x. * Source/NSLog.m (NSLogv): Idem. 2002-06-23 Richard Frith-Macdonald * Headers/Foundation/NSFileHandle.h: add async read of specific length. * Source/NSFileHandle.m: Make the async wconvenience methods call the core ones. * Source/UnixFileHandle.m: Remove async convenience methods and add one to read specified length of data. 2002-06-21 Richard Frith-Macdonald * Source/GSMime.m: add a few consistency checks to raise an exception if we try to unparse a GSMimeDocument with inconsistent headers and content. 2002-06-19 Adam Fedor * Source/GSLocale.m (GSSetLocaleC): Only set locale for LC_CTYPE. 2002-06-18 Richard Frith-Macdonald * Source/NSURL.m: Cope with a URL where the path is missing. Check user, password, host, port parts for illegal characters. Thanks to bug report by Marco Manfredini * Source/GSMime.m: add convenience method for setting document type. Fix error in recent change to base64 encoding. 2002-06-17 Richard Frith-Macdonald * Source/NSTimer.m: Retain target and user info on initialisation Release them on invalidation. Ensure timer is invalidated on deallocation. Documented timer methods. Changes based on bug report by Andy Ruder * Source/NSURL.m: Fixed one possible nul pointer indirection, and added some comments about the internal data structure. Handle percentage escape sequences in user, password, host and port even though MacOS-X only seems to do it for the user name and host. * Tools/plmerge.m: Fixed some crasher bugs where given bad arguments. 2002-06-16 Richard Frith-Macdonald * Source/GSFTPURLHandle.m: simple implementation added * Source/NSURLHandle.m: Register GSFTPURLHandle for ftp scheme. * Source/GSHTTPURLHandle.m: modified so that data being read is reported periodically during the read proces rather than just at end. 2002-06-15 Adam Fedor * Source/NSProcessInfo.m: Include sys/fcntl for Solaris. 2002-06-14 Richard Frith-Macdonald * config/pathxml.m4: Adjust path to headers. * Tools/gsdoc.m: Adjust path to headers. Add warning about deprecation. Patch by e.sammer * Source/NSObject.m: Added some compatibility methods in a categpory of Object. * Source/Additions/GSMime.m: Add a couple of convenience methods. * Source/GSHTTPURLHandle.m: Use one of them. * SSL/Makefile.postample: on distclean, don't need to delete bundle, but do delete config.h explicitly. 2002-06-13 Richard Frith-Macdonald * Source/Additions/GSXML.m: Include NSInvocation.h to avoid compiler warning. 2002-06-12 Richard Frith-Macdonald * Source/NSObject.m: Fix a few errors which crept in to the map table based reference counting. * Examples/GNUmakefile: Permit local makefile to be missing. * Source/UnixFileHandle.m: Added outgoing SOCKS5 support. * Source/NSFileHandle.m: Added SOCKS5 documentation. * Source/Base/gsdoc: Dopcumented SOCKS enironemnet variables and defs. * Source/NSNotification.m: Made -description more informative. * Testing/call.m: Trivial test program for tcp connections. * SSL/GSUnixSSLHandle.m: Updated for socks. * Additions/GSMime.m: Utilites to encode/decode base64 * Source/GSHTTPURLHandle.m: Use encoding. 2002-06-10 Richard Frith-Macdonald * Source/UnixFileHandle.m: Avoid some unnecessary autoreleases. 2002-06-09 Richard Frith-Macdonald * Source/NSObject.m: Implemented and documented -className * Tools/AGSOutput.m: When Verbose = YES log all documentable entities for which no comment text was found. * Source/NSException.m: Added NSParseErrorException and tidied other general exceptions. * Source/extern.m: Removed generic exceptions ... now in NSException.m 2002-06-06 Adam Fedor * Source/cifframe.m (cifframe_from_info): Set value locations after prepping cifframe. 2002-06-06 Richard Frith-Macdonald * Source/NSLog.m: patch by Jeff Teunissen to avoid adding date/time info when using syslog. * Source/NSURL.m: Fix loading codde to set self as client of handle. * Tools/AGSParser.m: Fix to avoid warnings about unimplemented protocols * Headers/gnustep/base/GSXML.h: * Headers/gnustep/base/NSArchiver.h: * Headers/gnustep/base/NSAutoreleasePool.h: * Headers/gnustep/base/NSCoder.h: * Headers/gnustep/base/NSDictionary.h: * Headers/gnustep/base/NSFileHandle.h: * Headers/gnustep/base/NSNotification.h: * Headers/gnustep/base/NSRunLoop.h: * Headers/gnustep/base/NSURL.h: * Headers/gnustep/base/NSURLHandle.h: * Source/GSHTTPURLHandle.m: * Source/NSArray.m: * Source/NSCoder.m: * Source/NSFileHandle.m: * Source/NSNotification.m: * Source/NSRunLoop.m: * Source/NSURLHandle.m: * Source/NSUnarchiver.m: * Source/externs.m: * Source/Additions/GSXML.m: Tidied for documentation purposes ... no substantial code changes Wed Jun 5 17:46:47 2002 Nicola Pero * Source/NSLog.m (_NSLog_standard_printf_handler): Fixed syslogging of strings: add a NULL at the end of strings before feeding them to syslog. 2002-06-05 Richard Frith-Macdonald * Headers/Foundation/NSURL.h: Added a couple of ivars and removed non-standard methods. * Source/NSURL.m: Rewrite everything apart from the code dealing with NSURLHandle objects (and change some of that) to conform to the documentation (I hope) and to try to match behavior with that of MacOS-X. 2002-06-04 Adam Fedor * Headers/gnustep/base/NSByteOrder.h: Hack for bug in gcc 3.1 * Source/externs.m (_gcc3_1_hack): Idem. (modified patch from benhur@inf.ufsm.br). * Source/GSFFIInvocation.m (gs_objc_msg_forward): Alloc closure with fastMallocBuffer. * Documentation/coding-standards.texi: Update. 2002-06-02 Richard Frith-Macdonald * Headers/Foundation/NSObject.h: Removed ([_dealloc]), ([-deallocNotificationsActive]), ([setDeallocNotificationsActive:]) * Source/NSObject.m: Removed ([_dealloc]), ([-deallocNotificationsActive]), ([setDeallocNotificationsActive:]) as these methods are no longer necessary now that the dealloc method itsself is able to refrain from performing deallocation if if wishes (the retain count mechanism can no longer reach a zero retain count). 2002-06-01 Richard Frith-Macdonald * Source/NSObject.m: Change NSDecrementExtraRefCountWasZero() to refrain from decrementing when the count is zero. Documented the retain/release/retainCount methods (and others). * Headers/Foundation/NSObject.h: Documented extra ref count functions. 2002-05-28 Richard Frith-Macdonald * Source/NSObject.m: Change order of zombie initialisation for darwin port. 2002-05-28 Richard Frith-Macdonald * Headers/gnustep/base/GSMime.h: Make set... methods return void. * Source//GSMime.m: Make set... methods return void. Also fix parsing to use different 'specials' for HTTP and MIME * Headers/gnustep/base/GSIMap.h: * Headers/gnustep/base/NSHashTable.h: * Headers/gnustep/base/NSMapTable.h: * Source/GSArray.m: * Source/GSSet.m: * Source/GSTcpPort.m: * Source/NSBundle.m: * Source/NSConnection.m: * Source/NSData.m: * Source/NSHashTable.m: * Source/NSMapTable.m: * Source/NSObject.m: * Source/NSRunLoop.m: Applied patches by James Knight, to improve memory efficiency and insertion.deletion speed to hash and map tables. Also fixes for some GC problems. Fixed minor problem in patch, and added code to call functions to clean up after hash and map enumerations. Modified cleanup function to clear enumerator ... for memory release on GC system. Rewrote enumeration code so that it maintains the characteristic that objects can safely be removed from maps after being enumerated (this feature is used in several places). *WARNING* This introduces a binary incompatibility in that the size of the map table and hash table enumeration types has grown. If you have binaries which use the NSEnumerateHashTable() or the NSEnumeratemapTable() functions, you need to rebuild them. 2002-05-27 Richard Frith-Macdonald * Headers/Foundation/GSMime.h: Tidy up and add convenience methods. * Source/Additions/GSMime.m: Tidy up and add convenience methods. Added methods to convert content between string and data for ease of use from java. Added support for most character sets handled by GNUstep-base. Improved ContentID generation to be both unlikely to recur, and to be guaranteed unique within a process. * Source/NSBundle.m: ([+allBundles]) Don't enumeraste if map table has not been created yet. * Source/NSLog.m: Allow output descriptor to be changed. * Source/NSProcessInfo.m: Add method to change log output to go to another file for applications where stderr has been hijacked. 2002-05-26 Fred Kiefer * Source/Additions/GSXML.m Define GSXMLAttribute in the case when libxml is found. Otherwise it wont compile on MS Windows. 2002-05-26 Richard Frith-Macdonald * Headers/Foundation/GSMime.h: Add GSMimeHeader class. * Source/Additions/GSMime.m: Add GSMimeHeader class. Update API to use GSMimeheaders rather than dictionaries. 2002-05-23 Richard Frith-Macdonald * Source/Additions/GSXML.m: Fix a few errors in last changes. * Source/NSString.m: Updates for GSXML changes. * Tools/AGSHtml.m: Updates for GSXML changes. * Tools/AGSIndex.m: Updates for GSXML changes. 2002-05-22 Richard Frith-Macdonald * Headers/gnustep/base/GSXML.h: Add _parent ivars * Source/Additions/GSXML.m: Implement memory mangement so that the underlying libxml data is not freed unless all objects derived from it have been deallocated. Remove comments warning about original memory management scheme. 2002-05-22 Richard Frith-Macdonald * Source/GSeq.h: Fix bug matching sequences with zero length range. * Headers/gnustep/base/GSMime.h: Tell autogsdoc where to look for source * Headers/gnustep/base/GSXML.h: Updates for consistency etc. * Source/Additions/GSXML.m: ditto * Tools/AGSHtml.m: Modified for changed GSXML * Tools/AGSIndex.m: ditto * Tools/AGSParser.m: ditto * Tools/autogsdoc.m: ditto * Tools/defaults.m: Fixed typo Mostly, changes to make methods which were intended to be private really private, and lots of modifications to make mathod names consistent with OpenStep usage ... suggestions made by many people. * configure.ac: Use better names for GMP and ZLIB flags * configure: regenerate * Headers/gnustep/base/GSConfig.h.in: GMP and ZLIB update * Headers/gnustep/base/NSDecimal.h: GMP update * Headers/gnustep/base/UnixFileHandle.h: ZLIB update * Source/NSDecimal.m: GMP update * Source/UnixFileHandle.m: ZLIB update 2002-05-15 Richard Frith-Macdonald * Source/NSLog.m: Altered logging format for compatibility with MacOS-X (and easier collating). Thanks to report by lcampbell 2002-05-14 Richard Frith-Macdonald * Source/Unicode.m: GSFromUnicode(), GSToUnicode(), bugfix - ensure that returned memory is allocated from specified zone, rather than returning internal buffer. * Tools/AGSIndex.m: When a string mismatch is found when merging, update the output to the new string as well as warning. * Tools/autogsdoc.m: Don't automatically include refs to installed copies of the project being documented. 2002-05-13 Richard Frith-Macdonald * Source/NSFileManager.m: Don't try to release memory using free() when it was allocated using NSZoneMalloc(). * Tools/autogsdoc.m: Improve dependency rule management. * Tools/AGSParser.h: ditto * Tools/AGSParser.m: ditto * Tools/AGSIndex.h: ditto * Tools/AGSIndex.m: ditto Store all dependency information in the .igsdoc file and keep it up to date. Never regenerate a file that doesn't need it. Mostly the changes are to cope with the fact that we now have common files into which all functions, constants, variables, and typedefs within a project are combined. 2002-05-11 Richard Frith-Macdonald * Source/Unicode.m: Rationalise so that all conversion operations go through the two new functions. Gets rid of a load of old code. * Source/GSString.m: ([-replaceCharactersInRange:withString:]) minor performance enhancement when copying from a 16-bit string to an 8-bit string. 2002-05-10 Adam Fedor * Source/Additions/GSXML.m: Change libxml strings to UTF8 (makeText:) New. Add GSXMLDummy for MinGW * Source/Additions/libgnustep-base.def: Remove GSXMLHandler. (patch from Kai Henningsen). 2002-05-10 Richard Frith-Macdonald * Tools/gdnc.m: Make gdnc log to syslog by default, and close stdin, stdout, stderr to run as daemon. * Source/NSUser.m: Restructured path generation code slightly. Added support for system-wide .GNUsteprc with force options. Removed use of FORCE_USER_ROOT and FORCE_DEFAULTS_ROOT * Source/Base/gsdoc: Document the .GNUsteprc files. * Source/NSArray.m: Fix bug with GC pointed out by James Knight 2002-05-09 Richard Frith-Macdonald * Source/GSHTTPURLHandle.m: Insert port information to URL passed to proxy. 2002-05-09 Fred Kiefer * Source/NSBundle.m Use fileSystemRepresentation instead of cString to get the file name to load. 2002-05-08 Richard Frith-Macdonald * Source/NSTask.m: When launching under windoze, don't forget to use the fileSystemRepresentation of the program name. 2002-05-08 Richard Frith-Macdonald * Source/Additions/GSXML.m: Fix function prototype ... gets rid of compiler warning. * Source/GNUmakefile: remove o_vscanf.c ... unused * Source/o_vscanf.c: remove unused file. * Source/mframe.m: Fix compiler warning about unused function. * Source/GSFormat.m: Fix compiler warning about unused var. * Source/NSDebug.m: Fix compiler warning about unused var. * Source/externs.m: Fix compiler warnings ... move some exceptions to source files relating to where they are declared. * Source/NSArchiver.m: define exception. * Source/NSConnection.m: define exception. * Source/NSPort.m: define exception. * Tools/gdomap.c: Remove unused variable (log_perror). 2002-05-07 Adam Fedor * configure.ac: Make all AC_DEFINES define 1 * config/objc-con-autoload.m4: Idem. * config/objc-sys-dynamic.m4: Idem. 2002-05-07 Richard Frith-Macdonald * Source/NSUser.m: mingw path fixes and debugging * Source/NSFileManager.m: ditto 2002-05-06 Adam Fedor * Source/NSMethodSignature.m (-isEqual:): Implemented (from znek@mulle-kybernetik.com). 2002-05-06 Richard Frith-Macdonald * Source/NSMapTable.m: Delete line teft over by accident ... could cause crach if passes nul table. Thanks to Lars Sonchocky-Helldorf * Source/NSCalendarDate.m: ([-initWithString:calendarFormat:]) don't supply current date information as default ... for compatibility with MacOS-X use zero date instead. Thanks to lcampbell. 2002-05-04 Adam Fedor * Testing/nsbundle.m: Update to work without installing bundle. 2002-05-04 Richard Frith-Macdonald * Source/NSUser.m: NSHomeDirectoryForUser() ... fix windoze bug ... was returning the current users home directory irrespective of the user asked for. Now returns nil for other users ... should really find some mechanism to determine home directories for other users. * Source/Additions/GSXML.m: If ([_parseChunk:]) is called with nil data, terminate parsing. Report by Alexander Malmberg. 2002-05-03 Richard Frith-Macdonald * Source/NSAssertion.m: Added comments and fixed bug in handling an assertion in a function ... was calling va_end() before the last use of the arguments. Also, release new handler after adding it to thread dictionary ... fix memory leak. * Source/NSThread.m: Add fprintf of alert message to STDERR if we are unable to determine the current thread. Don't attempt to use NSLog() or similar ... since chances are, without a thread object, that would just crash. In GSRegisterCurrentThread(), add code to handle the case where the NSThread class has not been initialised. * Source/NSObject.m: NSAllocateObject() raise exception if passed something other than a class to allocate an instance of. 2002-05-02 Richard Frith-Macdonald * SSL/GSUnixSSLHandle.m: Change '#if HAVE...' to '#ifdef HAVE_...' * Source/GSFormat.m: ditto * Source/GSHTTPURLHandle.m: ditto * Source/GSTcpPort.m: ditto * Source/NSBundle.m: ditto * Source/NSData.m: ditto * Source/NSDate.m: ditto * Source/NSFileManager.m: ditto * Source/NSHost.m: ditto * Source/NSLock.m: ditto * Source/NSLog.m: ditto * Source/NSPage.m: ditto * Source/NSPipe.m: ditto * Source/NSProcessInfo.m: ditto * Source/NSRunLoop.m: ditto * Source/NSString.m: ditto * Source/NSTask.m: ditto * Source/NSThread.m: ditto * Source/NSUser.m: ditto * Source/UnixFileHandle.m: ditto * Source/WindowsFileHandle.m: ditto * Tools/gsdoc.m: ditto * Tools/autogsdoc.m: ditto Fixes to handle configuration changes where AC_DEFINE is setting preprocessor constants to be empty (but defined) rather than to be 1 2002-05-02 Adam Fedor * configure.ac: Updated to autoconf 2.53 from configure.in * configure, config.h.in: Regenerate. * Source/mframe/configure.ac: Idem. * SSL/configure.ac: Idem. * acconfig.h, aclocal.m4: Remove * config/pathxml.m4: New from aclocal.m4. * config/objc-con-autoload.m4: Updated from aclocal.m4 * config/procfs-exe-link.m4: Idem. * config/procfs.m4: Idem. 2002-05-02 Richard Frith-Macdonald * Source/NSURLHandle.m: Implement ([-hash]) and ([-isEqual:]) based on ([-absoluteString]) rather than simple pointer comparison. * Source/GSHTTPURLHandle.m: ([-bgdConnect]) check for existing headers before writing ... avoid overriding them and only set things that the programmer has not bothered to set. ([-loadInBackGround]) use URL port if available. More fixes thanks to lcampbel via savannah * Headers/Foundation/NSURLHanlde.h: include NSObject.h * Source/UnixFileHadle.h: add missing semicolon thanks to Paul Windey 2002-05-01 Richard Frith-Macdonald * Source/NSURLHandle.m: ([URLHandleClassForURL:]) Fix to return most recently registered class rather than first registered one. Bug report via savannah 2002-04-30 Adam Fedor * Version: 1.3.2 * Documentation/news.texi: Update. * NEWS Regen. 2002-04-29 Richard Frith-Macdonald * Source/NSFileManager.m: Standardise handling for windoze drive specifiers in file paths. * Source/NSUser.m: Use ([-stringWithFileSystemRepresentation:length:]) when importing file names. * Source/NSString.m: Update all path handling methods for windoze changes. Fix several bugs where we did not conform to documentation. 2002-04-28 Richard Frith-Macdonald * Source/NSFileManager.m: Port ([-stringWithFileSystemRepresentation:length:]) to windoze... Have it convert backslashes to slashes etc. 2002-04-25 Richard Frith-Macdonald * Tools/AGSParser.m: Improve handling of identifier mapping so that an identifier mapped to an empty string (or //) an any place where whitespace is permissable is treated as part of that white space. 2002-04-25 Richard Frith-Macdonald * Tools/AGSParser.m: Interpret a mapping to '//' in the WordMap as meaning that the rest of the line containing the mapped value should be ignored. 2002-04-24 Gregory John Casamento * Tools/make_strings/GNUmakefile - modified to prevent build error when building from scratch * Tools/make_strings/GNUmakefile.preamble - added to provide paths to include and lib directories for linking make_strings tool when building from scratch. 2002-04-23 Adam Fedor * Source/GSFFIInvocation.m (-initWithCallback:returnp:values:frame:signature:): Simplify setting values. Structs passed by ref when MFRAME_STRUCT_BYREF. (GSFFIInvokeWithTargetAndImp): Encoding values unneedded now. (gs_objc_msg_forward): Free the closure via NSData. * Source/mframe/powerpc/generic: Fix offset for structs. * Source/mframe/powerpc/linux-gnu: Idem. * Source/mframe/powerpc/darwin: Idem. 2002-04-22 Adam Fedor * Tools/gdomap.c (gdomap_log): For LOG_INFO, write to 1, not 0. * Tools/make_strings: New tool from Alexander Malmberg * Source/Additional/Makefile.preamble (ADDITIONAL_OBJCFLAGS): Add for building DLL on mingw32 2002-04-20 Richard Frith-Macdonald * Source/NSURL.m: ([-absoluteString]) anonymous bugfix applied. 2002-04-19 Richard Frith-Macdonald * Tools/gdnc.m: If given -NSHost specification for the current host, ignore it and use the standard name. * Source/GSTcpPort.m: ([-invalidate]) call superclass implementation at end ... so handles can find this port when they are destroying themselves. Reverses last change I made to this. 2002-04-18 Richard Frith-Macdonald * SSL/COPYING.LIB: New file ... just to make it *REALLY* obvious this code is under the LGPL 2002-04-18 Adam Fedor * Minimally working libffi support. Needs work. * configure.in: Allow libffi to be enabled. * Source/GSFFIInvocation.m: Rewrite. * Source/NSConnection.m (-forwardInvocation:forProxy:): Add libffi function. * Source/NSInvocation.m: Fixup cifframe arg functions. * Source/cifframe.m: Rewrite. * Testing/nsinvocation.m: Bug fix. * Documentation/coding-standards.texi: Remove info dir tag. * Documentation/gnustep-base.texi: Idem. * Resources/Languages/Slovak: New file (from Stefan Urbanek). Thu Apr 18 11:10:04 2002 Nicola Pero * Headers/gnustep/base/NSObjCRuntime.h: Updated #defines and Windows DLL export/import machinery to the new gnustep-make conventions. 2002-04-18 Richard Frith-Macdonald * Tools/gdomap.c: re-order headers so config.h is used on windoze * Source/NSFileManager.m: ([-fileSystemRepresentationWithPath:]) modified to handle MSYS paths with '/drive/' prefix. * Source/GSTcpPort.m: ([-invalidate]) call superclass implementation at start, so flag gets set to say we are not valid, and we avoid any recursive calls. 2002-04-16 Richard Frith-Macdonald * config/config.reuseaddr.c: New test for broken SO_REUSEADDR * configure.in: test for broken SO_REUSEADDR * acconfig.h: Add BROKEN_SO_REUSEADDR * configure: regenerated * Source/UnixFileHandle.m: Use reuseaddr info. * Source/GSTcpPort.m: Use reuseaddr info. * Tools/gdomap.c: Use reuseaddr info. * Source/NSPortNameServer.m: Improved warnings about launching gdomap. * Source/NSDistributedNotification.m: Improved warnings about launching gdnc. * Source/NSException.m: Log uncaught exceptions with executable name. * Source/NSProcessInfo.m: New private function for exception msg. * Source/GSString.m: Applied fix by Malexander Malmberg for transmuting strings where the default encoding is not the same as the internal 8-bit encoding. * Source/Unicode.m: Logic fix for selecting strict conversion from unicode by Alexander Malmberg. 2002-04-12 Richard Frith-Macdonald * Source/Additions/GSXML.m: New method ([-nextElement]) to traverse tree skipping non-element nodes. Also ([-childElement]) to get the first child element of a node. Thu Apr 11 15:34:33 2002 Nicola Pero * Source/GSAttributedString.m ([GSMutableAttributedString -sanity]): Renamed to -_sanity, and changed so that we always compile this in so that regression testcases can use it. 2002-04-08 Richard Frith-Macdonald * Resources/GNUmakefile: install new language files. * Resources/Languages/Russion: language file added. * Resources/Languages/UkraineRussion: language file added. Added language files provided by Serg Stoyan * Source/UnixFileHandle.m: Permit accept/connect on descriptors by default. * Source/WindowsFileHandle.m: ditto * Headers/Foundation/NSProcessInfo.h: Added MacOS-X operating system methods and enum * Source/NSProcessInfo.m: Added operating system methods and documented all methods for autogsdoc. 2002-04-07 Richard Frith-Macdonald * Source/GSString.m: Tidy initialisers for case where the default C-string encoding is not usable internally. * Source/NSLog.m: Try default cString encoding. * Tools/cvtenc.m: Add -EscapeIn and -EscapeOut flags to handle \u escapes in files. * Resources/Languages/Italian: Correct to use \u escapes * Resources/Languages/French: ditto. * Resources/Languages/German: ditto. * Resources/Languages/README: New file to tell editors that they should use \u escapes ... and suggesting use of the cvtenc tool to make the job easy. 2002-04-06 Richard Frith-Macdonald * Source/NSString.m: Fix error in unicode BOM handling Write plist unicode escapes using the conventional \u rather than \U, but read in either form. * Source/GSString.m: Fix error in length of unicode data produced. * Tools/cvtenc.m: Made easy to use and added instructions. Sat Apr 6 02:42:43 2002 Nicola Pero * Source/NSUser.m (NSSearchPathForDirectoriesInDomains): Fixed typo, gnustep_local_root being used instead of gnustep_user_root for developer dirs in user root. 2002-04-05 Richard Frith-Macdonald * Source/NSObject.m: Fix locking bug with NSZombie ... was not locking when adding/removing zombies. * Source/NSString.m: Fix property list parsing code to raise exceptions on failure rather than logging messages. Also check for extra data at end of parsed string. * Tools/ctvenc.m: new tool for converting string encodings. 2002-03-28 Manuel Guesdon * Tools/gsdoc.m: corrected inversed test for missing entities 2002-03-27 Richard Frith-Macdonald * Source/GSPrivate.h: Added function to fetch boolean value from env * Source/NSException.m: Use new function. * Source/NSProcesInfo.m: Implement new function. * Source/NSObject.m: Implement NSZombie functionality. * Headers/Foundation/NSDebug.h: Document NSZombie functionality. 2002-03-25 Richard Frith-Macdonald * Source/NSTask.m: Implement code to watch for child process exit under mingw and rewrite various methods to handle process termination nicely under windoze. * Source/NSException.m: flush stderr ... under windoze stderr is not automatically flushed! * Source/GSWindowsFileHandle.m: watch for exceptional conditions so we can handle socket connection failures in mingw32. Added code to try to cope with standard files properly, not just network sockets. * Source/GSTcpPort.m: ditto. * Source/Unicode.m: GSToUnicode(), GSFromUnicode(), if terminate option is specified, always produce output with a nul terminator even for input of an empty string. 2002-03-22 Richard Frith-Macdonald * SSL/GNUmakefile: Remove -lobjc and -lgnustep-base from bundle libraries ... it should not need them. 2002-03-21 Richard Frith-Macdonald * Source/NSArray.m: Ensure property-list read/write uses UTF8 * Source/NSDictionary.m: ditto * Source/NSConnection.m: Change timeouts to 300 seconds and document all methods. 2002-03-20 Richard Frith-Macdonald * Source/GSString.m: lossyCString_u() handle case where cString contains more bytes than unicode string has characters. * Tools/gdomap.c: Suppress unnecessary warnings except under debug. Implement spawning to run as daemon under windoze. * Toolds/gdnc.m: Run as daemon under windoze. * Source/GSTcpPort.m: Fix to stop multiple servers trying to use the same port under windoze. * Source/WindowsFileHandle.m: Fix to stop multiple servers trying to use the same port under windoze. Fix to return gdomap port even if getservbyname() doesn't. * Source/UnixFileHandle.m: Fix to return gdomap port even if getservbyname() doesn't. * Source/NSTask.m: Try appending .exe extension to paths under windoze. * Source/Unicode.m: GSFromUnicode() fix lossy conversion for cases where output encoding can't handle the unicode. 2002-03-19 Richard Frith-Macdonald * Source/GSString.m: lossyCString_c() fix in line with recent changes ... cope with case where internal coding is not same as external coding. lossyCString_u() fix encoding used. 2002-03-18 Adam Fedor * Tools/gdomap.c (gdomap_log): Write to stdout if prio=LOG_INFO. 2002-03-18 Richard Frith-Macdonald * Source/Unicode.m: Some boundary error fixes by Alexander Malmberg. Fixes to encoding table initialisation. * Source/NSString.m:Fix error in encoding type for initialising from data. By Alexander Malmberg. * Source/GSString.m: Correct string length when transmuting an 8-bit string to a 16-bit string - by Alexander Malmberg. 2002-03-17 Pierre-Yves Rivaille * Source/GSAttributedString.m ([GSMutableAttributedString -replaceCharactersInRange:withString:]): Only keep attribute #0 when removing it would remove all attributes. (patch by Alexander Malmberg) 2002-03-16 Adam Fedor * configure.in: Also configure SSL. 2002-03-16 Richard Frith-Macdonald * Headers/gnustep/base/Unicode.h: Add more options for character encoding conversion routines. * Source/GSPrivate.h: Add a couple of private functions for character encoding management. * Source/GSString.m: Convert throughoput to use new functions for converting from one string encoding to another. Make changes to handle setting of default C string encoding to be an encoding which is incompatible with internal e-bit string objects. * Source/NSString.m: ditto * Source/Unicode.m: new string encoding conversion functions extended with a few new options. Also fixed some memory allocation bugs to cure memory leaks. Rewritten low level support for different character encodings ... should provide more efficient and maintainable conversion between encodings and permit use of wide character encodings and encodings with multibyte sequences as the default C string encoding. Testing ... minimal ... we could do with decent tests for this stuff. So this version must be viewed as possibly very unstable! 2002-03-14 Adam Fedor * Version: 1.3.0 * Documentation/install.texi, readme.texi, ...: Updated 2002-03-14 Richard Frith-Macdonald * Source/NSString.m; Bug report by Manuel Guesdon prompted me to rewrite string trimming extensions. All the tail end trimming was wrong. * Source/Unicode.m: Added two new conversion functions ... untested. The intention is to replace other string conversion with these ones which should localise memory management issues. 2002-03-14 Richard Frith-Macdonald * Tools/gdomap.c: Tidy a little ... fix non-static declarations. * Source/NSString.m: ([-initWithData:encoding:]) Correct the length of the string produced when unicode data is missing its 2 byte prefix. Simplification of code based on suggestion by Yen-Ju Chen * Source/GSString.m: Fixes for cString infor from unicode by Yen-Ju Chen. Wed Mar 13 16:55:49 2002 Nicola Pero * Source/Additions/GSXML.m ([GSSAXHandler -externalSubset:externalID:ystemID:]): Fixed typo, 'ystemID:' instead of 'systemID:'. 2002-03-13 Adam Fedor * Tools/gdomap.c (log): Redefine to gdomap_log to avoid conflict with syslog function on Darwin. * Source/NSProcessInfo.m (main): Use STRINGIFY to get proper name of constant string class. 2002-03-13 Richard Frith-Macdonald * Headers/gnustep/base/NSObjCRuntime.h: Remove bad markup in comments. * Headers/gnustep/base/NSString.h: Remove private class declaration and hide internals of NXConstantString behind dummy interface while improving comments. Fix long overdue declaraction of methods in clsses rather than protocols. * Source/GSUserDefaults.h: removed * Source/GSPrivate.h: added * Source/GSCompatibility.m: fix for hidden private info. * Source/GSString.m: ditto * Source/NSArray.m: ditto * Source/NSCalendarDate.m: ditto * Source/NSDate.m: ditto * Source/NSDecimalNumber.m: ditto * Source/NSDictionary.m: ditto * Source/NSLog.m: ditto * Source/NSObjCRuntime.m: ditto * Source/NSScanner.m: ditto * Source/NSSerializer.m: ditto * Source/NSString.m: ditto * Source/NSUser.m: ditto * Source/NSUserDefaults.m: ditto General tidyups to hide some internal workings which should really not be exposed in public headers. 2002-03-12 Richard Frith-Macdonald * NSTimeZones/NSTimeZones.tar: regenerated with latest data. 2002-03-12 Adam Fedor * Headers/gnustep/base/NSString.h: Add extra ivars needed by Darwin to NXConstantString. * Source/GSString.m: ([NXConstantString +initialize]): Remove constant string class reference setup for Darwin. * Source/NSProcessInfo.m (main): Put it here. Tue Mar 12 11:13:51 2002 Nicola Pero * Source/Additions/GSXML.m ([-isEqualTo:]): Renamed everywhere to isEqual: Tue Mar 12 09:21:20 2002 Nicola Pero * Source/NSAssertionHandler.m ([-handleFailureInMethod:object:file:lineNumber:description:]): Log if the object is a class or an instance. 2002-03-12 Richard Frith-Macdonald * SSL/configure.in: Check GNUstep directories for headers and libraries as well as standard system directories. Tue Mar 12 07:37:44 2002 Nicola Pero * Source/Additions/GSXML.m ([GSXMLNode -properties]): Fixed return type. 2002-03-10 Richard Frith-Macdonald * Headers/gnustep/base/NSInvocation.h: * Headers/gnustep/base/NSNumberFormatter.h: * Headers/gnustep/base/NSObject.h: Minor fixes to build with STRICT_OPENSTEP * Source/NSDistributedNotificationCentre.m: Attempt to start server automatically for other machines. Improve log messages. Sat Mar 9 15:21:04 2002 Adam Fedor * Source/NSDistributedNotificationCenter.m (-_connect): Move check for alternative name so we can get registered. 2002-03-09 Richard Frith-Macdonald * Source/NSDistributedNotificationCentre.m: Try alternative name for server if NSHost is specified ...in case it is running on another host. Sat Mar 9 12:02:45 2002 Adam Fedor * configure.in: Change constant string to FooConstantString * config/config.constant-string-class.m: Work with NeXT_RUNTIME (patch from Markus Hitter [mah@jump-ing.de]). 2002-03-09 Richard Frith-Macdonald * Source/NSFileManager.m: Change copy so that, if the source argument is a symbolic link, we copy the link rather than the thing it points to. * Tools/gdnc.m: Quick hack to register port with other names is NSHost is used. 2002-03-08 Richard Frith-Macdonald * Source/Unicode.m: Added BIG5 encoding * Headers/Foundation/NSString.h: Added BIG5 encoding * Resources/Languages/Locale.aliases: added traditional chinese Extensions for traditional chinese requested by Yen-Ju Chen 2002-03-08 Richard Frith-Macdonald * Source/Additions/GNUmakefile: Include ../../base.make * SSL/GNUmakefile: Include ../base.make from the makefiles directory for builting standalone. * Source/Unicode.m: Added some standard string handling for iconv. * Source/NSString.m: ([-initWithData:encoding:]) return nil on failure to handle encoding. * Source/NSMapTable.m: NSMapInsert() fixed to conform to spec. * Source/NSHashTable.m: NSHashInsert() fixed to conform to spec. Reports by Alexander Malmberg 2002-03-07 Pierre-Yves Rivaille * Source/NSRunLoop.m ([NSRunLoop -acceptInputForMode:]): added a _checkPerformes: call to solve minor issue. (performers would only be called after an event was received) (credits to Alexander Malmberg) 2002-03-07 Richard Frith-Macdonald * SSL/Makefile.posramble: store config.h in system specific subdir. * SSL/Makefile.preamble: Include headers from Source directory so we pick up GSConfig.h 2002-03-06 Richard Frith-Macdonald * Source/autogsdoc.m: store and fetch dependency info in .igsdoc so we can parse the correct source files for each header when we need to. 2002-03-06 Richard Frith-Macdonald * Source/Additions/GNUmakefile: build subproject. * Source/Additions/Makefile.preamble: set include flags. * Source/Additions/GSXML.m: moved implementation here. * Source/Additions/GSMime.m: moved implementation here. * Source/GNUmakefile: build subproject. 2002-03-06 Richard Frith-Macdonald * GNUmakefile: build SSL aggregate project * config.mak.in: Remove SSL info * configure.in: Remove SSL configuration * configure: Regenerate * SSL/GNUmakefile: Build SSL bundle * SSL/GSUnixSSLHandle.m: SSL bundle source from Source directory * SSL/Makefile.postamble: Build SSL bundle * SSL/Makefile.preamble: Build SSL bundle * SSL/config.h.in: Trivial config for SSL bundle * SSL/config.mak.in: SSL info for building bundle. * SSL/configure.in: Configuration for SSKL bundle. * Source/GNUmakefile: Don't build SSL bundle. * Source/GSUnixSSLHandle.m: Moved to SSL directory. * Source/Makefile.postamble: Don't build SSL bundle. * Source/Makefile.preamble: Don't build SSL bundle. Alterations to make the SSL bundle capable of standalone building - for use on systems where the base package has only been installed in binary form. Initial attempt! 2002-03-06 Richard Frith-Macdonald * Source/GSAttributedString.m: Applied fix for left-over attributes at end of string. Patch supplied by Alexander Malmberg . Reformatting to conform to GNUstep standards, and optimisation by me. 2002-03-04 Richard Frith-Macdonald * Tools/autogsdoc.m: Output gsdoc as UTF8 as we should. * Tools/AGSOutput.m: ditto. 2002-03-01 Richard Frith-Macdonald * Source/NSUser.m: When reading .GNUsteprc, if a per user version is not available, use the one in the configured system root directory. 2002-02-28 Adam Fedor * Headers/gnustep/base/objc-gnu2next.h: Add objc-runtime.h * Source/Makefile.preamble: Add ..DEPEND_UPON for all darwin versions. * Source/NSPortCoder.m (-initWithReceivePort:sendPort:components:): Change cast to make MacOSX compiler happy. 2002-02-28 Richard Frith-Macdonald * Source/NSUser.m: rewrite user and defaults root code to standardise and to use .GNUsteprc configuration. Also permit forcing of fixed roots at compile time. Thu Feb 28 16:46:31 2002 Nicola Pero * Source/NSUser.m (NSSearchPathForDirectoriesInDomains): Changed 'Apps' to read 'Applications'. 2002-02-27 Pierre-Yves Rivaille * Source/GSString.m ([GSMutableString -substringWithRange:]): create a new string which size is the range length, not the original string's length. 2002-02-27 Richard Frith-Macdonald * Tools/gdomap.c: Removed obsolete code for shrinking data structures. Added memmove() for overlapped memory moves (Alexander Malmberg) and removed a couple of obsolete functions. * Source/GSValue.m: attempt to correct encoding. * Source/NSKeyValueCoding.m: Fix termination of method names with nuls from report by Manuel Guesdon. * Source/NSDictionary.m: Implement MacOS-X compatible KVC behavior. Include webobjects/eof extension, with warnings. * Headers/Foundation/NSProtocolChecker.h: Change deprecated import to include. 2002-02-26 Richard Frith-Macdonald * Tools/gdomap.c: Improve fetching interface info on mingw ... ignore non-internet interfaces. NB. The mingw winsock2.h header is buggy ... to work properly you need to change the size of a struct sockaddr field from sa_data[14] to sa_data[22] Tue Feb 26 18:01:26 2002 Nicola Pero * Source/NSBundle.m: Removed all _releasedBundles machinery. Removed custom implementation of -release. Retain a bundle after we load it. This fixes -bundleForClass: and simplifies considerably the code. * Source/NSBundle.m: Whenever possible, use [self method] rather than [NSBundle method] to invoke a class method, for efficiency. * Source/NSBundle.m (objc_executable_location): Compute directly from _executable_path - using mainBundle is unsafe. Tue Feb 26 17:35:03 2002 Nicola Pero * Source/NSBundle.m (_bundle_load_callback): Completely ignore categories. (Suggestion by Gerrit Van Dyk ). 2002-02-26 Richard Frith-Macdonald * Source/GSTemplateValue.m: Implement initialize method to set the version of concrete classes to be that of the abstract class which actually performs encoding/decoding ... should correct archiving. Problem reported by Gerrit Van Dyk * Tools/GSIndex.m: tidied a little * Tools/GSParser.m: mark when things are implemented. * Tools/GSOutput.m: warn about unimplemented items. 2002-02-26 Pierre-Yves Rivaille * Source/NSUnarchiver.m ([NSUnarchiver +classNameDecodedForArchiveClassName:]): ([NSUnarchiver -classNameDecodedForArchiveClassName:]): return nil if the class name is not present. 2002-02-26 Richard Frith-Macdonald * Source/GSTcpPort.m: Fixes to work on mingw. * Source/NSHost.m: Update for current winsock on mingw. * Source/NSPortNameServer.m: Update for current winsock on mingw. * Source/WindowsFileHandle.m: Fix to work for basic socket I/O. * Tools/gdomap.c: many changes ... several fixes to work on mingw rewrite some clumsy inefficient code, make variables and functions local. etc. * Source/NSUnarchiver.m: ([versionForClassName:]) return NSNotFound if the class name was not present. Mon Feb 25 15:26:38 2002 Nicola Pero * Source/NSBundle.m ([-initWithPath:]): Return nil if the path can't be read. Fixed memory leak in case of nil argument. * Headers/gnustep/base/NSBundle.h: Documented some methods. 2002-02-25 Richard Frith-Macdonald * Source/GNUmakefile: Move xml and mime classes into an additional library, and make base library depend on it. EXPERIMENTAL. * Tools/gdomap.c: Try to get output working again after last changes. Add first attempt at MINGW support for getting network interface info. library, and make base library depend on it. EXPERIMENTAL - activate using 'make add=yes' 2002-02-25 Richard Frith-Macdonald * Source/NSObject.m: Rewrote key-value coding key manipulation to use a char array for speed. Moved functions for converting between object internals in scalar types and NSNumbers etc to NSObjCRuntime.m. Re-implemented path methods to fix incorrect implementation as pointed out by Manuel Guesdon. * Headers/Foundation/NSObjCRuntime.h: New functions from NSObject * Source/NSObjCRuntime.m: New functions from NSObject * Source/NSKeyValueCoding.m: Put key value coding methods here for clarity and ease of documentation. 2002-02-24 Richard Frith-Macdonald * Source/NSTask.m: Removed NSLogs() accidantally left in after debugging. Reported by Fred Kiefer. * Tools/gdomap.c: Use syslog for logging ... patch by Matthias Klose almost entirely rewritten to be portable. * configure.in: Minor additions for time header/functions * configure: regenerated 2002-02-23 Richard Frith-Macdonald * Headers/Foundation/NSObjCRuntime.h: Fix error in last change ... GSSelectorFromName() should not create a new selector while HSSelectorFromNameAndTypes() should. 2002-02-22 Alexander Malmberg * Headers/gnustep/base/NSArray.h: insertion position api update. * Source/NSArray.m: insertion position api update. * Source/GSArray.m: insertion position api update. Make insertion position api consistent with sorting api. 2002-02-21 Richard Frith-Macdonald * Source/NSValue.m: Fixed bug in archiving NSValue objects ... was creating faulty archives which would crash on unarchiving. * Headers/Foundation/NSObjCRuntime.h: Made GS... function names more consistent with NeXT/Apple ones. Provide new ivar handling API. Don't crash when asked for a class which does not exist. * Source/NSObject.m: partial conversion to new runtime api. * Source/NSData.m: partial conversion to new runtime api. Don't raise an exception if a class we are deserializing does not exist. Just warn and return a nul class. * Source/NSArchiver.m: better clasname handling. * Source/NSUnarchiver.m: try to gracefully handle the case where an archive contains the name of a class we don't have linked in to our code. * Source/NSPortCoder.m: ditto. 2002-02-20 Richard Frith-Macdonald * Source/NSUser.m: locking erro fixed by Stephen brandon 2002-02-20 Richard Frith-Macdonald * Headers/Foundation/NSInvocation.h: Remove _argframe ivar * Source/NSInvocation.m: Simplify by removing _argframe ivar and using _frame throughout to hold arguments. Fix checks for valid frame. * Source/callframe.m: Initialise newly created frame with zeros so that setting an object in an invocation should work when the invocation is retaining its contents. * configure.in: Disable ffi and warn about it. * configure: regenerated * Source/NSRunLoop.m: ([acceptInputForMode:beforeDate:]) block until limit date even if no I/O is possible. * Source/NSUserDefaults.m: Patch by Alexander Malmberg to try all listed locales rather than giving up at first failure. * Headers/gnustep/base/GSUnion.h: Enclose types bitmask in brackets to avoid *all* types being included in the union! Should decrease memory footprint and increase speed of many classes. * Source/NSString.m: ([stringByStandardizingPath]) memory leak fixed and windows path check fixed ... patch by Michael Scheibler. Also commented/documented the method. 2002-02-13 Richard Frith-Macdonald * Source/NSUserDefaults.m: Removed some code that was doing nothing, and tidied a little. 2002-02-13 Richard Frith-Macdonald * Headers/Foundation/NSPathUtilities.h: GSDefaultsRootForUser() function added. * Source/NSUser.m: Many alterations to do with correcting the file paths used to use GNUSTEP_USER_ROOT, and to get them to vary nicely when GSSetUserName() is called. Added function GSDefaultsRootForUser() to get a defaults directory based on a new environment varibale, or use GNUSTEP_USER_ROOT. * Source/NSUserDefaults.m: Use GSDefaultsRootForUser() Fix a few bugs in setting up defaults database. Move defaults database to the Defaults subdirectory. * Source/Headers/GSIMap.h: Fix error in last commit. 2002-02-13 Richard Frith-Macdonald * Source/NSString.m: ([stringByExpandingTildeInPath]) fix bug in handling ~username/... format. * Headers/Foundation/GSIMap.h: GSIMapCleanMap() rewrote to empty the map efficiently. Added an option to refrain from calling it when emptying a map that doesn't need keys and values releasing. * Source/GSAttributedString.m: don't clean maps on emptying. * Source/GSFFCallInvocation.m: ditto * Source/NSArchiver.m: ditto * Source/NSConnection.m: ditto * Source/NSObject.m: ditto * Source/NSPortCoder.m: ditto * Source/NSSerializer.m: ditto Changes inspired by Pierre-Tves Rivaille 2002-02-12 Richard Frith-Macdonald * Tools/AGSHtml.m: support for merging types and functions etc. * Tools/AGSIndex.m: ditto * Tools/AGSOutput.h: ditto * Tools/AGSOutput.m: ditto * Tools/autogsdoc.m: ditto Put stuff in place for merging info revert key-value coding changes. * Source/NSString.m: Fix bug in datausingEncoding:allowLossyConversion: pointed out by Stephen Brandon. Mon Feb 11 15:11:31 2002 Nicola Pero * Source/GSString.m (NSImmutableString): Implemented copy, copyWithZone:, mutableCopy, mutableCopyWithZone:, so that the string can be copied, and the copy no longer tracks the parent. 2002-02-10 Michael Hanni * Source/NSObjCRuntime.m: changed NSAssert() to NSCAssert() from last change. Also added NSException.h include to make compile correctly and quietly. 2002-02-10 Manuel Guesdon * Source/NSObject.m: changes to enable derived object KeyValueCoding process chnages (EOGenericRecord for example). o added: _infoForInstanceVariableNamed:retType:retSize:retOffset: _getValueForKey:selector:type:size:offset: _setValueForKey:object:selector:type:size:offset: _handleQueryWithUnboundKey: _handleTakeValue:forUnboundKey: o modified: storedValueForKey: takeStoredValue:forKey: valueForKey: takeValue:forKey: To use added method. * Source/NSObjCRuntime.m: o added NSAssert in GSGetInstanceVariable() and GSSetInstanceVariable() * Headers/gnustep/base/NSKeyValueCoding: o added: _infoForInstanceVariableNamed:retType:retSize:retOffset: _getValueForKey:selector:type:size:offset: _setValueForKey:object:selector:type:size:offset: _handleQueryWithUnboundKey: _handleTakeValue:forUnboundKey: Sat Feb 9 01:45:48 2002 Nicola Pero * Source/NSBundle.m ([+bundleForTool:]): Removed. We switch to a better API, which is to have a tool use +mainBundle, in the same way as applications do, to retrieve the main resource bundle for itself. ([+mainBundle]): Modified to support tools as well as applications. * Headers/gnustep/base/NSBundle.h ([+bundleForTool:]): Removed. 2002-02-08 Richard Frith-Macdonald * Headers/Foundation/NSTask.h: New method -validatedLaunchPath to check that an executable exists at the specified path or any alternative version corresponding to host, OS, and library-combo directories. Returns the actual path to the binary. * Source/NSTask.m: Implemented new mathod and added autogsdoc comments. * Source/NSBundle.m: Cotrrected error in comments. 2002-02-06 Richard Frith-Macdonald * Headers/Foundation/NSString.m: Additioanl method -immutableProxy * Source/NSString.m: ditto * Source/GSString.m: New classes for immutable proxy, one generic version, and one efficient version for accessing the main GNUstep mutable striong objects. * Source/GSAttributedString: use immutable proxy. New code to provide a proxy for a mutable string which will provide read-only access to it. 2002-02-05 Richard Frith-Macdonald * Source/NSString.m: ([-rangeOfCharacterFromSet:options:range:]) fix to return NSNotFound as location if character not present - bug reported by Nicola Pero. 2002-02-04 Richard Frith-Macdonald * Tools/gsdoc.m: loader() if entity id is missing, try to load url as a file. * Tools/AGSParser.m: Fixes for handling typedefs, constants, varibales and functions. * Tools/AGSOutput.[hm]: ditto * Tools/AGSHtml.m: ditto Preliminary support for C language added. 2002-02-03 Richard Frith-Macdonald * Source/GNUmakefile: use -WordMap flag with autogsdoc to cope with C-preprocessor constants that would otherwise confuse parsing. * Source/NSDictionary.m: Tidy to match interface. * Source/NSDistantObject.m: Tidy to match interface. * Source/NSPortCoder.m: Tidy to match interface. * Source/NSScanner.m: Tidy to match interface. Remove some illegal semicolons after method names. * Source/NSTimer.m: Tidy to match interface. * Tools/AGSParser.h: Handle word mappings. * Tools/AGSParser.m: Handle word mappings and deal with function attributes. * Tools/autogsdoc.m: Handle word mappings and make default logging less verbose. 2002-02-02 Richard Frith-Macdonald * Source/NSObject.m: Fix some maptable problems when using non-local reference counts. * Source/NSMapTable.m: Improve warning logging for dodgy practices. * Source/NSHashTable.m: ditto * Tools/AGSHtml.m: A couple of minor fixes for systems where the xml parser does not discard whitespace as it should. 2002-02-01 Richard Frith-Macdonald * Documentation/manual: New directory containing Objective-C and GNUstep-base programming manual/tutorial produced at Brainstorm. The intention was to produce a pretty complete manual and then release it, but we ran out of funding, so I'm releasing the work to date. * Source/NSObject.m: Go back to using local refcounts now that new map table code is thoroughly tested. 2002-02-01 Richard Frith-Macdonald * Source/Makefile.preamble: remove old GSI api support * Headers/Foundation/NSHashTable.h: ditto * Headers/Foundation/NSMapTable.h: ditto 2002-02-01 Richard Frith-Macdonald * Source/GSAttributedString.m: Move to assuming new GSI api. * Source/NSHashTable.m: ditto * Source/NSMapTable.m: ditto * Source/GSCountedSet.m: ditto * Source/GSDictionary.m: ditto * Source/GSFFCallInvocation.m: ditto * Source/NSArchiver.m: ditto * Source/NSConnection.m: ditto * Source/NSFileManager.m: ditto * Source/NSNotificationCenter.m: ditto * Source/NSObject.m: ditto * Source/NSPortCoder.m: ditto * Source/NSRunLoop.m: ditto * Source/NSSerializer.m: ditto * Source/NSUnarchiver.m: ditto 2002-02-01 Richard Frith-Macdonald * Source/NSHashTable.m: Fixed bug intorduced by last change to add error checking!! * Source/GSAttributedString.m: Make new or old GSI stuff optional. * Source/GSCountedSet.m: ditto * Source/GSDictionary.m: ditto * Source/GSFFCallInvocation.m: ditto * Source/NSArchiver.m: ditto * Source/NSConnection.m: ditto * Source/NSFileManager.m: ditto * Source/NSNotificationCenter.m: ditto * Source/NSObject.m: ditto * Source/NSPortCoder.m: ditto * Source/NSRunLoop.m: ditto * Source/NSSerializer.m: ditto * Source/NSUnarchiver.m: ditto Interim phase ... version of source which should build with new or old GSIMap and GSIArray APIs at the defination of GSI_NEW 2002-01-31 Adam Fedor * Old/*: Removed (now at ftp://ftp.gnustep.org/pub/gnustep/old/gnustep-obsolete.tar.gz). 2002-01-31 Richard Frith-Macdonald * Source/NSMapTable.m: * Source/NSHashTable.m: Add checks for nul tables and either log warnings and be tolerant, or raise exceptions. Thu Jan 31 15:35:21 2002 Nicola Pero * Source/NSObject.m ([-doesNotRecognizeSelector:]): Modified exception message to print out if we are an instance or a class object. For example, no longer 'IvarProxy does not recognize initWithClass:' but rather 'IvarProxy(class) does not recognize initWithClass:'. ([-doesNotRecognize:]): Idem. ([-subclassResponsibility:]): Similar change. ([-shouldNotImplement:]): Similar change. ([-notImplemented:]): Similar change. 2002-01-31 Richard Frith-Macdonald * Headers/gnustep/base/GSIArray.h: Use array as parameter to macros. * Source/GSAttributedString.m: Update for GSIArray change. * Source/GSCountedSet.m: Update for GSIArray change. * Source/GSDictionary.m: Update for GSIArray change. * Source/GSFFCallInvocation.m: Update for GSIArray change. * Source/NSArchiver.m: Update for GSIArray change. * Source/NSConnection.m: Update for GSIArray change. * Source/NSFileManager.m: Update for GSIArray change. * Source/NSNotificationCenter.m: Update for GSIArray change. * Source/NSObject.m: Update for GSIArray change. * Source/NSPortCoder.m: Update for GSIArray change. * Source/NSRunLoop.m: Update for GSIArray change. * Source/NSSerializer.m: Update for GSIArray change. * Source/NSUnarchiver.m: Update for GSIArray change. 2002-01-30 Richard Frith-Macdonald * Headers/Foundation/NSRunLoop.h: Go back to new version. * Source/NSRunLoop.m: Back to new (hopefully bug-free) version ... fixed a fence-post error in examining descriptors. Enabled poll() support if the O/S supports it. Converted to use standard debug logging keyed on NSRunLoop. Fixed poll code to call any available event handler when an error occurs on a descriptor. * configure.in: Improve check for sa_len 2002-01-30 Richard Frith-Macdonald * Headers/gnustep/base/GSIMap.h: Fix bug cleaning table and add option to specify type of enumerator structure externally. * Headers/gnustep/base/NSHashTable.h: Modify to conform to MacOS-X documentation and to work with GSIMAP stuff. * Headers/gnustep/base/NSMapTable.h: ditto * Headers/gnustep/base/o_array.h: deleted * Headers/gnustep/base/o_cbs.h: deleted * Headers/gnustep/base/o_hash.h: deleted * Headers/gnustep/base/o_list.h: deleted * Headers/gnustep/base/o_map.h: deleted * Headers/gnustep/base/o_x_bas.h.in: deleted * Headers/gnustep/base/o_x_cbs.h.in: deleted * Source/GNUmakefile: Remove o_... rules * Source/GSTcpPort.m: Remove unused include file * Source/Makefile.postamble: remove o_... rules * Source/NSCallBacks.h: Remove o_... info * Source/NSCallBacks.m: remove o_... info * Source/NSHashTable.m: Rewrite to use GSIMAP * Source/NSMapTable.m: Rewrite to use GSIMAP * Source/NSObject.m: Use GSIMAP for reference counts. * Source/NSRunLoop.m: Fix function prototypes for map table callbacks. * Source/externs.m: Remove o_... stuff and tidy callbacks. * Source/o_array.m: deleted * Source/o_cbs.m: deleted * Source/o_cbs_char_p.m: deleted * Source/o_cbs_id.m: deleted * Source/o_cbs_int.m: deleted * Source/o_cbs_int_p.m: deleted * Source/o_cbs_void_p.m: deleted * Source/o_hash.m: deleted * Source/o_list.m: deleted * Source/o_map.m: deleted * Source/o_x_bas.m.in: deleted * Source/o_x_cbs.m.in: deleted Masses of changes to simplify codebase and standardise all maptable code. Hopefully, the new NSMapTable code now conforms to the spec. 2002-01-30 Richard Frith-Macdonald * Headers/Foundation/NSRunLoop.h: revert * Source/NSRunLoop.m: revert Revert to earlier version temporarily, while I try to track down an obscure bug causing problems with some DO applications. Tue Jan 29 13:49:23 2002 Nicola Pero * configure.in: Removed garbage left over - doubled message for objc thread flags checking. * configure: Regenerated. Tue Jan 29 10:57:30 2002 Nicola Pero * Makefile.postamble (configure): Rule removed. It was causing problems on systems without autoconf. (base.make, config.mak): Do not depend on configure. 2002-01-29 Richard Frith-Macdonald * Headers/Foundation/NSRunLoop.h: More updates to ivars. * Headers/Foundation/NSRunLoop.m: Completed re-entrancy fixes in (I hope) a reasonably efficient manner. 2002-01-28 Richard Frith-Macdonald * Headers/Foundation/NSRunLoop.h: Removed previously deprecated methods. Completely changed ivar layout. * Headers/Foundation/NSRunLoop.m: Removed previously deprecated methods. Completely changed ivar layout. Modified most methods to work with changed ivar layout. Now stores per-mode context information in a new GSRunLoopCtxt class - one instance for each mode used in each runloop instance. Rewrite select() and poll() based mechanisms using the new class - should hopefully be more efficient and fix minor and obscure problems with re-entrancy. ### WARNING ... radical change ... may be buggy ... WARNING ### 2002-01-23 Kaelin Colclasure * configure.in: Check for poll(2) system call and header file. * configure: Regenerated. * config.h.in: Regenerated. * Source/NSRunLoop.m ([-acceptInputForMode:beforeDate:]): Refactored to put all code specific to the select(2) system call into a separate method. ([-_pollInputForMode:withTimeout:]): New private method with two implementations. If HAVE_POLL is defined, the poll version is used. Otherwise, we fall back to select. 2002-01-25 Richard Frith-Macdonald * acconfig.h: Add HAVE_SA_LEN * configure.in: Check for sa_len in sockaddr in struct ifreq * configure: regenerate * Headers/gnustep/base/config.h.in: regenerate * Tools/gdomap.c: Add patch by Pete French to handle variable length socket addresses ... modified to work with the rest of the world where we don't have such things. 2002-01-24 Richard Frith-Macdonald * Source/NSRunLoop.m: Correct returns from within exception handler. * Source/NSUserDefaults.m: use NSDefaultRunLoopMode. * Headers/gnustep/unicode/gsm0338.h: New character set mapping. * Source/Unicode.m: Add support for the GSM default alphabet. * Headers/gnustep/base/GSIMap.h: Add support for macros update when built with GSM_NEW defined (for use with NSMapTable in future). Various source files updated to use new GSI macros. Mon Jan 21 17:08:42 2002 Nicola Pero * Source/Makefile.postamble (after-uninstall): Removed GSConfig.h and mframe.h when uninstalling. 2002-01-16 Richard Frith-Macdonald * Source/NSRunLoop.m: Wrap code in exception handlers to reset current runloop mode if an exception occurs ... may remove this again if the performance is too bad. Use initialiser for NSTimer to avoid having to put timers into the autorelease pool. * Headers/Foundation/NSTimer.h: Expose GNUstep initialiser since OpenStep and MacOS-X don't have one. Wed Jan 16 13:46:24 2002 Nicola Pero Fixed dynamical loading of frameworks. * Source/NSBundle.m ([-_addFrameworkForClass:]): Fixed, should never be run during dynamical loading. * Source/NSBundle.m (_bundle_load_callback): Major simplification. Most code removed. Should run faster too. ([-load]): Do not DESTROY _bundle_load_callback's related variables. Wed Jan 16 12:30:20 2002 Nicola Pero * Source/NSBundle.m (_addFrameworkFromClass:): Fixed third argument of strncmp to be 12, not 12*sizeof(char). 2002-01-16 Richard Frith-Macdonald * Source/NSRunLoop.m: Modify to have a nil current mode if the loop is not running (MacOS-X compatibility) and documented the change for autogsdoc. Tue Jan 15 02:53:56 2002 Nicola Pero * Source/Makefile.postamble (after-distclean): Always remove SSL.bundle, regardless of any flags. 2002-01-13 Richard Frith-Macdonald * Tools/AGSParser.m: Mostly implemented parsing of C declarations (function, typedef, constant and variable). 2002-01-11 Richard Frith-Macdonald * Headers/Foundation/NSArchiver.h: tidyups * Source/NSDictionary.m: tidyups * Tools/AGSParser.m: a couple of declaration parsing fixes added, along with quite a bit of debugging. Function declaration parsing not yet working. 2002-01-10 Richard Frith-Macdonald * Source/NSDistributedNotificationCentre.m: Use NSHost user default to determine which server to connect to. * Tools/AGSParser.m: Minor parsing fixes ... correct GS_EXPORT Wed Jan 9 11:55:54 2002 Nicola Pero * configure.in: Call AC_CONFIG_AUX_DIR with $GNUSTEP_SYSTEM_ROOT/Makefiles arg so that gnustep-make's config.guess and config.sub are used. * configure: Regenerated. * config.guess: Removed. * config.sub: Removed. * install-sh: Removed. * mkinstalldirs: Removed. * Source/mframe/configure.in: Set AC_CONFIG_AUX_DIR to $GNUSTEP_SYSTEM_ROOT/Makefiles. * Source/mframe/configure: Regenerated. * Source/mframe/config.guess: Removed. * Source/mframe/config.sub: Removed. Wed Jan 9 11:08:57 2002 Nicola Pero * config.guess: Updated to latest version. * config.sub: Idem. 2002-01-08 Richard Frith-Macdonald * Tools/AGSHtml.h: * Tools/AGSHtml.m: * Tools/AGSIndex.h: * Tools/AGSIndex.m: * Tools/AGSOutput.h: * Tools/AGSOutput.m: * Tools/AGSParser.h: * Tools/AGSParser.m: * Tools/autogsdoc.m: * Tools/gsdoc-0_6_7.dtd: Updated for several changes ... Support documentation of instance variables Index class and category method names identically Extend index to have a listing of methods by unit Extend index to have a listing of ivariablese by class Use new extensions to double speed of generation of method indexes for classes. 2002-01-07 Adam Fedor * Version: 1.1.0 * Documentation/news.texi: Update * Source/NSObject.m (GSGetValue): Add case for void return (suggestion from ml@sbuilders.com). * Resources/Languages/Dutch: Change currency to Euro. * Resources/Languages/French: Likewise. * Resources/Languages/German: Likewise. * Resources/Languages/Italian: Likewise. * Old languages files renamed to *.Old 2002-01-07 Richard Frith-Macdonald * Tools/AGSHtml.m: Minor speedup. * Tools/AGSOutput.m: Put something in place of empty descriptions. * Tools/AGSParser.m: Rewrite handling of standards information to fix bug in NO_GNUSTEP handling. * Source/GNUmakefile: Don't document concrete number stuff ... not public. Sun Jan 6 22:33:55 2002 Nicola Pero * Tools/HTMLLinker.m: Rewritten to fixup links by link name rather than link file. Can now be used to link HTML files generated by autogsdoc. * Tools/HTMLLinker.html: Updated for changes. * Tools/GNUmakefile: Install HTMLLinker.html. 2002-01-06 Richard Frith-Macdonald * Tools/autogsdoc.m: Minor bugfix ... any .h file processed should also be processed as a .gsdoc file to produce indexes and html. * Tools/AGSHtml.m: List *all* methods for a class in its method summary, even if they are in categories or are documented in other files. 2002-01-05 Richard Frith-Macdonald * Tools/autogsdoc.m: Simplify by removing SourceDirectory default. Change mechanism for handling multiple source files for one header (need capability to write dependency rules for make). * Tools/AGSParser.[hm]: Add mechanism to return list of source files on which a document depends. * Tools/gsdoc-0_6_7.dtd: Permit wider use of index element. * Tools/AGSHtml.m: ditto, and support indexing of category methods along with class methods. * Source/GNUmakefile (Base_AGSDOC_FLAGS): Remove the SourceDirectory option ... now assumed to be the current directory for simplicity. * Source/Base.gsdoc: Add class and protocol indexes. 2002-01-04 Richard Frith-Macdonald * Source/GNUmakefile (Base_AGSDOC_FLAGS): Fix to use -HeaderDirectory and -SourceDirectory to get docs to build again... hopefully with both sets of make rules. Fri Jan 4 15:44:02 2002 Nicola Pero * base.make.in (GNUSTEP_BASE_HAVE_LIBXML): Define. * Source/GNUmakefile (Base_AGSDOC_FLAGS): Do not use -HeaderDirectory. (Base_HEADER_FILES_DIR): Define. * Source/GNUmakefile: Include documentation.make only if doc=yes is passed on the command line. * Tools/GNUmakefile: Idem. 2002-01-04 Richard Frith-Macdonald * Tools/autogsdoc.m: Rearrange code somewhat and remove auto generation of index and 'up' links ... now requires an explicit -Up if you want one. Fix to support multiple source files parsed per interface file. * Tools/GNUmakefile: Add -Up for documentation generation * Source/GNUmakefile: ditto Fri Jan 4 11:42:23 2002 Nicola Pero * Tools/HTMLLinker.m: Implemented -FixupAllLinks, -PathMappings, -PathMappingsFile options. Made -CheckLinks default to YES. Added support for specifying a directory as input or destination file, meaning all html files found in the directory. Never attempt to fixup links starting with mailto: or news: or without a filename, even if running with -FixupAllLinks YES. * Tools/HTMLLinker.html: New file. 2002-01-03 Richard Frith-Macdonald * Source/autogsdoc.m: Fixup bug in html relocation code ... was failing to adjust string length variable correctly. 2002-01-03 Adam Fedor * Headers/gnustep/base/NSString.h: Extern constant string class reference for Darwin added. * Source/GSString.m ([NXConstantString +initialize]): Setup constant string class reference variable for Darwin. * Source/NSObject.m: Don't put reference count and zone with object on Darwin. * Source/behavior.m (NeXT_RUNTIME/behavior_class_add_class): Use NeXT runtime functions. Pass only one method_list at a time. (NeXT_RUNTIME/behavior_class_add_methods): Only look at one method_list at a time. (NeXT_RUNTIME/search_for_method_in_list): Use NeXT runtime functions. Thu Jan 3 19:38:42 2002 Nicola Pero * Tools/HTMLLinker.m: New tool. * Tools/GNUmakefile: Compile the new tool. * Tools/Makefile.preamble (ADDITIONAL_OBJCFLAGS): Use -Wall. 2002-01-03 Adam Fedor * Source/GSFFCallInvocation.m (gs_method_for_receiver_and_selector): Correct test for class. * Source/GNUmakefile (AUTHORS): Remove target. * AUTHORS: Remove. * Admin/: Remove. * configure.bat: Likewise. 2002-01-03 Richard Frith-Macdonald * Header/Foundation/GSXML.h: Correction standards complience * Source/GSXML.m: A few documentation tidyups * Tools/autogsdoc.m: Some tidyups for improved performance and added code to relocate html documents. * Source/AGSIndex.[hm]: Minor API change to ease index handling, bugfix for class index generation. * Source/AGSHtml.m: Made index handling more consistent. 2002-01-02 Adam Fedor * configure.in: Show openssl as enabled by default in help. Check for more headers. * Source/NSTask.m: Move #includes to front, remove redundancies. * Source/GSXML.m ([(non-libxml)GSXMLNode +forwardInvocation]): Implement. * Documentation/GNUmakefile: Remove gnustep-base.texi * Documentation/install.texi: Update. * Documentation/news.texi: Likewise. * Tools/autogsdoc.m (main): When no libxml, abort with a useful error message. 2002-01-02 Richard Frith-Macdonald * Source/GSXML.m: Tidied some methods and added autogsdoc comments. * Source/NSData.[hm]: implement ([-writeToURL:atomically:]) * Source/GSXML.[hm]: Tidy document API to be more consistent with other classes. Add some autogsdoc comments. * Tools/AGSIndex.m: Bugfix in setting links to superclasses. * Tools/AGSOutput.m: Infinite recursion fix. 2002-01-01 Richard Frith-Macdonald * Source/GNUmakefile: Use new -Standards flag for autogsdoc * Tools/AGSparser.[hm]: New support for standards and some tidyups * Tools/AGSHtml.[hm]: Improved output and simplified a little. * Tools/autogsdoc.m: New Standards flag to turn on support for generation of standards complience notes in documentation. Tue Jan 1 11:18:35 2002 Nicola Pero * Source/NSFileManager.m (custom_strdup): New inline function to simplify code. (append_file_to_path): Use it. ([NSDirectoryEnumerator -initWithDirectoryPath: recurseIntoSubdirectories:followSymlinks:justContents:]): Idem. ([NSDirectoryEnumerator -nextObject]): Fixed memory leak (Reported by Brian Alliet ). 2001-12-31 Richard Frith-Macdonald * Source/behavior.m: behavior_class_add_methods() bugfix to ensure that despatch table is updated properly. search_for_method_in_list() deleted ... use version in gnu runtime. * Source/NSUserDefaults.m: Removed use of distributed lock ... we use atomic writes to file, so we don't need it. Also restructured a little to reduce file accesses when synchronising. Also tidied comments a little for autogsdoc. 2001-12-29 Adam Fedor * Source/behavior.m (class_add_behavior): Add depreciated function back. 2001-12-27 Adam Fedor * Headers/gnustep/base/objc-gnu2next.h: Disable __builtin functions for GCC < 3.x (darwin). * Headers/gnustep/base/behavior.h: New defs for darwin/NeXT. Remove depreciated function. * Source/GSSet.m (+initialize): Use new behavior function in place of depreciated one. * Source/behavior.m (behavior_class_add_class): On darwin, allow NXConstantString class to increase in size. (behavior_class_add_category): New/rewrite for darwin methodLists structure. (behavior_class_add_methods): Likewise. (search_for_method_in_list): Likewise. * Source/NSObject.m: Move ALIGN definition outside of #if (NSDecrementExtraRefCountWasZero): Change NSAssert to NSCAssert. * Source/mframe.m (method_types_get_first_argument): Use method_types_get_next_argument. * Source/Makefile.preamble: Additional flags for darwin linking. * Source/libgnustep-base.def: Updated for new/removed classes. 2001-12-26 Richard Frith-Macdonald * Tools/autogsdoc.m: Add options for better control of index file and turning off dependency checking (for slightly more efficient running under make). Also added flag to enable/disable html generation. * Tools/AGSHtml.m: Fix a few errors in achnors and links to document titles. 2001-12-22 Richard Frith-Macdonald * Tools/autogsdoc.m: Fix bug in handling args introduceed by last modification. Removed next and prev linkage at Nicolas suggestion. 2001-12-21 Richard Frith-Macdonald * Tools/autogsdoc.m: Simplify file processing and cleanup so that spurious linkage and indexing is not done when run on a single file. Fri Dec 21 13:50:50 2001 Nicola Pero * Source/NSBundle.m ([+bundleForLibrary:]): New method. ([+bundleForTool:]): New method. * Headers/gnustep/base/NSBundle.h: Declare them. Fri Dec 21 11:48:49 2001 Nicola Pero * NSTimeZones/Makefile.postamble (timezonedir, before-install): Unused targets removed. 2001-12-19 Richard Frith-Macdonald * Source/GSXML.m: Check validation status at parse completion. * Source/NSUserDefaults.m: Ensure flags are initialised. * Source/GSCompatibility.m: Set GNUstep DTD for propertyLists. * Tools/plist-0_9.dtd: GNUstep property list DTD. * Source/autogsdoc.m: Improve dependency checking ... only regenerate project index when necessary, thus avoiding some gsdoc file parsing. Wed Dec 19 02:17:09 2001 Nicola Pero * Source/NSThread.m (GSRegisterCurrentThread): Use @defs to access protected variables of NSThread otherwise GCC 3.1 refuses to compile it. (GSUnregisterCurrentThread): Idem. Tue Dec 18 18:02:07 2001 Nicola Pero * Source/NSObject.m ([+conformsToProtocol:]): Fixed - it was checking that the metaclass conforms to the protocol rather than the class, which was causing it to fail for protocols implemented in categories. 2001-12-18 Richard Frith-Macdonald Many source files modified to contain date, version, and title info. * Tools/AGSHtml.m: Fix 'standards' output. Implement date and version. * Tools/AGSOutput.m: Add 'standards' support for class, category, and protocol. Use new standards info from parser. * Tools/AGSParser.h: New method to set current standards. * Tools/AGSParser.m: Implement simplistic parsing of preprocessor conditionals to set current standards based on STRICT_MACOS_X, STRICT_OPENSTEP, and NO_GNUSTEP. The presence of markup in the comments still takes precedence over this mechanism. 2001-12-18 Richard Frith-Macdonald * Source/GSXML.m: Bugfixes in setting parse behavior ... now turns on validation properly. * Tools/gsdoc-0_6_7.dtd: added 'scope' to index element and added a 'title' type to list files in a project. * Tools/AGSHtml.h: * Tools/AGSHtml.m: Output tidyups and general format improvements. Add links to other documents in project. Add support for 'index' element with both file and project scope. * Tools/autogsdoc.m: Clean up a little and handle gsdoc files listed as source files better .... now looks for them in the source directory. Added automatic generation of an 'index' file for a project where the first source file listed in the project is not a gsdoc file. 2001-12-17 Richard Frith-Macdonald * Headers/gnustep/base/GSMime.h: Updates for autogsdoc * Headers/gnustep/base/GSXML.h: ditto * Headers/gnustep/base/NSArray.h: ditto * Headers/gnustep/base/NSAttributedString.h: ditto * Headers/gnustep/base/NSAutoreleasePool.h: ditto * Headers/gnustep/base/NSCalendarDate.h: ditto * Headers/gnustep/base/NSCharacterSet.h: ditto * Headers/gnustep/base/NSCoder.h: ditto * Headers/gnustep/base/NSConnection.h: ditto * Headers/gnustep/base/NSData.h: ditto * Headers/gnustep/base/NSDate.h: ditto * Headers/gnustep/base/NSDistantObject.h: ditto * Headers/gnustep/base/NSDistributedNotificationCenter.h: ditto * Headers/gnustep/base/NSInvocation.h: ditto * Headers/gnustep/base/NSLock.h: ditto * Headers/gnustep/base/NSMethodSignature.h: ditto * Headers/gnustep/base/NSNotification.h: ditto * Headers/gnustep/base/NSObject.h: ditto * Headers/gnustep/base/NSProxy.h: ditto * Headers/gnustep/base/NSRunLoop.h: ditto * Headers/gnustep/base/NSSet.h: ditto * Headers/gnustep/base/NSTimeZone.h: ditto * Headers/gnustep/base/NSTimer.h: ditto * Headers/gnustep/base/NSURL.h: ditto * Headers/gnustep/base/NSUndoManager.h: ditto * Headers/gnustep/base/NSUserDefaults.h: ditto * Headers/gnustep/base/NSValue.h: ditto * Source/GSArray.m: ditto * Source/GSAttributedString.m: ditto * Source/GSCompatibility.m: ditto * Source/GSCountedSet.m: ditto * Source/GSDictionary.m: ditto * Source/GSFFCallInvocation.m: ditto * Source/GSFFIInvocation.m: ditto * Source/GSFormat.m: ditto * Source/GSHTTPURLHandle.m: ditto * Source/GSLocale.m: ditto * Source/GSMime.m: ditto * Source/GSSet.m: ditto * Source/GSString.m: ditto * Source/GSTcpPort.m: ditto * Source/GSUnixSSLHandle.m: ditto * Source/GSValue.m: ditto * Source/GSXML.m: ditto * Source/NSArchiver.m: ditto * Source/NSArray.m: ditto * Source/NSAssertionHandler.m: ditto * Source/NSAttributedString.m: ditto * Source/NSAutoreleasePool.m: ditto * Source/NSBitmapCharSet.m: ditto * Source/NSBundle.m: ditto * Source/NSCalendarDate.m: ditto * Source/NSCallBacks.m: ditto * Source/NSCharacterSet.m: ditto * Source/NSClassDescription.m: ditto * Source/NSCoder.m: ditto * Source/NSConnection.m: ditto * Source/NSCopyObject.m: ditto * Source/NSCountedSet.m: ditto * Source/NSData.m: ditto * Source/NSDate.m: ditto * Source/NSDateFormatter.m: ditto * Source/NSDebug.m: ditto * Source/NSDecimal.m: ditto * Source/NSDecimalNumber.m: ditto * Source/NSDictionary.m: ditto * Source/NSDistantObject.m: ditto * Source/NSDistributedLock.m: ditto * Source/NSDistributedNotificationCenter.m: ditto * Source/NSEnumerator.m: ditto * Source/NSException.m: ditto * Source/NSFileHandle.m: ditto * Source/NSFileManager.m: ditto * Source/NSFormatter.m: ditto * Source/NSGeometry.m: ditto * Source/NSHashTable.m: ditto * Source/NSHost.m: ditto * Source/NSInvocation.m: ditto * Source/NSLock.m: ditto * Source/NSLog.m: ditto * Source/NSMapTable.m: ditto * Source/NSMethodSignature.m: ditto * Source/NSNotification.m: ditto * Source/NSNotificationCenter.m: ditto * Source/NSNotificationQueue.m: ditto * Source/NSNull.m: ditto * Source/NSNumber.m: ditto * Source/NSNumberFormatter.m: ditto * Source/NSObjCRuntime.m: ditto * Source/NSPage.m: ditto * Source/NSPipe.m: ditto * Source/NSPort.m: ditto * Source/NSPortCoder.m: ditto * Source/NSPortMessage.m: ditto * Source/NSPortNameServer.m: ditto * Source/NSProcessInfo.m: ditto * Source/NSProtocolChecker.m: ditto * Source/NSProxy.m: ditto * Source/NSRange.m: ditto * Source/NSRunLoop.m: ditto * Source/NSScanner.m: ditto * Source/NSSerializer.m: ditto * Source/NSSet.m: ditto * Source/NSString.m: ditto * Source/NSTask.m: ditto * Source/NSThread.m: ditto * Source/NSTimeZone.m: ditto * Source/NSTimer.m: ditto * Source/NSURL.m: ditto * Source/NSURLHandle.m: ditto * Source/NSUnarchiver.m: ditto * Source/NSUndoManager.m: ditto * Source/NSUser.m: ditto * Source/NSUserDefaults.m: ditto * Source/NSValue.m: ditto * Source/NSZone.m: ditto * Source/Unicode.m: ditto * Source/UnixFileHandle.m: ditto * Source/WindowsFileHandle.m: ditto * Source/behavior.m: ditto * Source/callframe.m: ditto * Source/cifframe.m: ditto * Source/externs.m: ditto * Source/libgnustep-base-entry.m: ditto * Source/mframe.m: ditto * Source/o_array.m: ditto * Tools/AGSParser.m: ditto Ensure that initial comments in source code are sutogsdoc comments so copyright and author information will be used. Fix inconsistencies between arguments in headers and source files. Fix various bugs exposed by autogsdoc ... mostly cases where there is a semicolon after a method name in a method implementation (this is illegal, but the gcc compiler currently ignores it). 2001-12-17 Richard Frith-Macdonald * Tools/AGSHtml.m: Provide list of methods in each class. * Tools/AGSIndex.m: New method to list methods in a unit. * Tools/AGSIndex.h: New method to list methods in a unit. * Tools/AGSOutput.m: Support (name) syntax for specifying a protocol cross reference using [(name)-method] * Tools/autogsdoc.m: Improve documentation of method references. * Tools/AGSparser.m: Handle @class statements. Improve standardisation of the format of types. 2001-12-16 Richard Frith-Macdonald * Source/NSObject.m: Make initial comment an autogsdoc comment. * Tools/gsdoc-0_6_7.dtd: Fix protocol error reported by Adam * Tools/AGSHtml.h: * Tools/AGSHtml.m: * Tools/AGSIndex.h: * Tools/AGSIndex.m: * Tools/AGSOutput.h: * Tools/AGSOutput.m: * Tools/AGSParser.h: * Tools/AGSParser.m: * Tools/autogsdoc.m: Tidied initial comments to take advantage of new code to parse author and copyright details. Fixed several minor bugs in various parts of the software. Updated documentation. 2001-12-15 Fred Kiefer * Tools/pl2link.m Better handling of MIME types. 2001-12-15 Richard Frith-Macdonald Many minor cleanups and bugfixes for autogsdoc. Alpha-test support for building base library documentation using autogsdoc ... lots of work remains to be done to improve the html output from autogsdoc and to add autogsdoc comments to the base library source code. * Tools/AGSIndex.h: improve merge control * Tools/AGSIndex.m: ditto * Tools/AGSHtml.h: new methods for cleaner indexing. * Tools/AGSHtml.m: ditto * Tools/AGSParser.m: minor bugfixes. Tools/GNUmakefile: Build autogsdoc documentation using autogsdoc. * Tools/autogsdoc.m: Fix minor dependency error. Fix for indexing where a version of the project being built is already installed. * Tools/gsdoc-0_6_7.dtd: Fix ivar support * Source/GSFFCallInvocation.m: minor debug output improvement. * Source/GNUmakefile: add basic instructions to build (but not install) documentation using autogsdoc. Don't want to install yet, as this is very much alpha-test stuff. 2001-12-13 Adam Fedor * Tools/pl2link.m: New file (from FredKiefer@gmx.de). 2001-12-12 Adam Fedor * Headers/gnustep/base/NSDebug.h: Include NSDebugLog functions when GSDIAGNOSE is defined. 2001-12-12 Richard Frith-Macdonald * Source/GSHTTPURLHandle.m: Remove GSHTPPropertyBodyKey ... make the ([writeData:]) method do nothing until the page is reloaded, so its behavior is consistent with ([writeProperty:forKey:]) and can be used in conjunction with background loading (ie all I/O is done during the load). * Source/NSURL.m: load resource data after setting it to force I/O 2001-12-11 Manuel Guesdon * Source/NSString.m: corrected bug in +stringByTrimmingSpaces (there was an exception when the string contains only spaces). 2001-12-08 Richard Frith-Macdonald * Documentation/gsdoc/NSDistantObjectRequest.gsdoc: note that the class does not exist (and why). 2001-12-08 Gregory Casamento * Source/GNUmakefile added SSL_LIB_DIRS += -L$(GNUSTEP_OBJ_DIR) to prevent build from failing when building from scratch. 2001-12-08 Richard Frith-Macdonald * Source/NSAttributedString.m: ([initWithCoder:]) fix typo. 2001-12-07 Adam Fedor * Headers/gnustep/base/NSDebug.h: Add NSDebugLog functions when GSWARN is defined (not DEBUG). 2001-12-07 Richard Frith-Macdonald * Source/GSHTTPURLHandle.m: Understand GSHTPPropertyBodyKey so we can set data to be posted in background. 2001-12-06 Richard Frith-Macdonald * Source/GNUmakefile: Add library dependencies for SSL bundle ... it needs libobjc and libgnustep-base to be linked. * Source/NSFileHandle.m: Only try to load SSL bundle if asked for. Mon Dec 5 16:32:31 2001 Adam Fedor * Source/GSHTTPURLHandle.m: Include sys/fcntl.h for O_WRONLY, etc (on Solaris). 2001-12-04 Richard Frith-Macdonald * Source/GNUmakefile: Add flags for SSL and rules to build bundle * Source/GSHTTPURLHandle.m: use +sslClass * Source/GSUnixSSLHandle.m: Extract SSL support for bundle to this file. * Source/Makefile.preamble: Add flags for SSL * Source/NSFileHandle.m: Add +sslClass and automated loading of bundle * Source/UnixFileHandle.m: Remove SSL support. * Headers/gnustep/base/NSFileHandle.h: Add +sslClass * Headers/gnustep/base/UnixFileHandle.h: Tidy a little. * config.mak.in: Add variables needed by SSL bundle * configure.in: Update to build SSL bundle by default. * configure: regenerated The above changes made to move SSL support into a bundle and add a +sslClass to NSFileHandle to return the class from the bundle if it is available. Changed the http url handle support to use this. 2001-12-04 Richard Frith-Macdonald * Source/NSValue.m: polish last set of changes - Optimisation ... cut memory allocation/deallocation to a minimum. Versioning ... set NSValue version number and attempt to decode old format objects. Simplification ... remove redundant code in placeholder class. Fixes ... allocate new objects in correct memory zone, I think a few others I forgot. * Source/NSNumberFormatter.m (-initWithCoder:): Avoid unnecessary autorelease/retain sequences. (-init): Fix illegal re-initialisation of initialised values and avoid unnecessary use of autorelease. 2001-12-03 Laurent Julliard * Source/NSNumberFormatter.m (-initWithCoder:): decoded objects must be retained 2001-12-03 Richard Frith-Macdonald * Source/NSValue.m: Fix coding/decoding to use serialization code to maintain byte order and word size compatibility. * Source/GSValue.m: ditto * Testing/values.m: added encoding/decoding tests. * Source/GSMime.m: Tidied handling of continuations a little. * Source/GSHTTPURLHandle.m: Added some debug logging. Sat Dec 1 10:11:18 2001 Nicola Pero * Makefile.postamble (base.make): Depend on configure. (config.mak): Idem. Sat Dec 1 09:29:43 2001 Nicola Pero * Makefile.postamble (base.make): New target. (config.mak): New target. 2001-11-29 Richard Frith-Macdonald * Source/NSScanner.m: Fix memory leak when initialised with something other than a constant string. 2001-11-28 Adam Fedor * Documentation/gsdoc/Base.gsdoc: Add NSLanguages summary. 2001-11-27 Richard Frith-Macdonald * Source/NSConnection.m: Put a limit of around a second on how long the delay between polling for incoming packets can grow to ... improve response on heavily loaded systems. * Source/GSHTTPURLHandle.m: ditto * Tools/autogsdoc.m: Tidied structure a little and added file modification date checks to see whether files should be regenerated or not. 2001-11-24 Fred Kiefer * Headers/Foundation/NSURL.h Declare NSNumber, so that it compiles without complaining. 2001-11-23 Laurent Julliard * Source/NSNumberFormatter.m (-encodeWithCoder:, -initWithCode:): fixed buggy encoder and decoder and code cleanup. 2001-11-22 Laurent Julliard * Headers/gnustep/base/Foundation.h: Fixed NSNumberFormatter.h missing. Thu Nov 22 00:52:57 2001 Nicola Pero * GNUmakefile (CVS_MODULE_NAME): Define. 2001-11-21 Richard Frith-Macdonald * Tools/AGSOutput.m: * Tools/AGSOutput.h: * Tools/AGSIndex.h: * Tools/AGSIndex.m: * Tools/AGSParser.h: * Tools/AGSParser.m: * Tools/AGSHtml.h: * Tools/AGSHtml.m: * Tools/autogsdoc.m: Many bugfixes and enhancements ... generate html as well as gsdoc. 2001-11-19 Richard Frith-Macdonald * Source/GSXML.m: Implement NSCopying protocol for most classes. 2001-11-19 Adam Fedor * Source/simple-load.h (__objc_dynamic_get_symbol_path): Fix typo. * Tools/gdomap.c (nameServer): Print strerror before exiting for more helpful message. 2001-11-13 Richard Frith-Macdonald * Source/NSUser.m: * Headers/Foundation/NSUserDefaults.h: * Documentation/gsdoc/NSUserDefaults.gsdoc: * Source/NSUserDefaults.m: Changed the method name +resetUserDefaults to be +resetStandardUserDefaults for compatibility with MacOS-X, which has now implemented an equivalent for the GNUstep method. * Source/NSPortNameServer.m: When removing a port, remove from internal name tables even if gdomap reports no name to unregister. In ([-removePort:]) retain set of names for duration of operation - fix suggested by Gerrit Van Dyk 2001-11-12 Richard Frith-Macdonald * Source/NSNumber.m: describe char and unsigned char as numbers rather than ascii characters. Use g format for floats. Use 'true' and 'false' for boolean output ... for MacOS-X compatibility. * Source/NSConcreteNumber.m: ditto * Source/GSFormat.m: Fix bug in formatting short integers - was trying to treat them as full sized. * headers/Foundation/NSString.h: Fix error in initWithFormat:locale:,... * Source/NSString.m: ditto ... was missing varargs * Documentation/gsdoc/NSNumber.gsdoc: document changes. * Documentation/gsdoc/NSString.gsdoc: document changes. * Testing/values.m: Added some number output tests. * Source/NSUserDefaults.m: Locking bug fixed ... was locking before lock had been created. * Source/libgnustep-base.def: Removed defunct class * Source/NSHost.m: Support initialisation with an address for which there is no corrsponding host name. 2001-11-09 Richard Frith-Macdonald * Documentation/gsdoc/Base.gsdoc: * Source/GSCompatibility.m: * Source/GSMime.m: * Source/GSUserDefaults.h: * Source/NSArray.m: * Source/NSCalendarDate.m: * Source/NSDate.m: * Source/NSDecimalNumber.m: * Source/NSDictionary.m: * Source/NSFileHandle.m: * Source/NSGeometry.m: * Source/NSLog.m: * Source/NSScanner.m: * Source/NSString.m: * Source/NSUserDefaults.m: Modify user defaults usage to cache some defaults used internally and provide private accessors for speed. Add default to force logging to be done via syslog since logging to stderr within code called via JIGS from a servlet engine may cause severe problems if the servlet engine is using descriptor 2 for other purposes. 2001-11-09 Richard Frith-Macdonald * Source/GSMime.m: modifications made to support HTTP continuation responses for buggy webservers which send them when they shouldn't. 2001-11-08 Richard Frith-Macdonald * Source/GSHTTPHURLHandle.m: handle writing of nil properties and use of empty strings as proxy settings. Minimise delays when tunneling SSL * Source/UnixFileHandle.m: Improve error logging with ssl. 2001-11-07 Richard Frith-Macdonald * Headers/foundation/NSUserDefaults.h: Add _lock ivar * Source/NSUserDefaults.m: initial attempt at thread-safety. 2001-11-07 Richard Frith-Macdonald * Headers/Foundation/NSString.h: removed stringByTrimming...Whitespace methods as they just duplicate the stringByTrimming...Spaces * Source/NSString.m: ditto Optimised the space trimming methods - avoid using character sets and creating unnecessary intermediary objects. 2001-11-07 Richard Frith-Macdonald * Source/NSUserDefaults.m: force defaults data to be read/write only to the user. Supplied by Ludovic Marcotte Wed Nov 7 09:04:51 2001 Nicola Pero After this change you need the latest gnustep-make to compile. * Source/Makefile.postamble: Removed rules to manually compile NSInvocation.m, NSConnection.m and mframe.m. (mframe.m_FILE_FILTER_OUT_FLAGS): Set to filter out optimization flags when compiling mframe.m. (NSConnection.m_FILE_FILTER_OUT_FLAGS): Idem. (NSInvocation.m_FILE_FILTER_OUT_FLAGS): Idem. 2001-11-01 Adam Fedor * Source/NSData.m: Add an include to avoid some warnings. Tue Oct 30 14:33:48 2001 Nicola Pero * Testing/benchmark.m (bench_object): Added test showing that a call to super in a category method - no matter if a class or an instance method - has the same big performance hit that a class method invocation has - at least with the current GNU runtime. 2001-10-28 Adam Fedor * Source/NSFileManager.m (_attributesAtPath:traverseLink:forCopy:): Make NSLog message into fprintf to avoid recursion. * Source/NSUserDefaults.m (pathForUser): Create ~/GNUstep/Library if it doesn't exist. 2001-10-26 Adam Fedor * configure (z): Check for gzseek in zlib since older zlibs don't have it. Fix check for LLONG_MAX (check if includes exist), same with uintmax_t * Source/GSFormat.h: Include stdint.h or inttypes.h if we have it. Proper check for LONG_LONG_MAX or LLONG_MAX. 2001-10-25 Adam Fedor * aclocal.m4 (AC_SYS_PROCFS): Typo fix, use AC_ARG_ENABLE. Make sure cache var is set to no if disabled. (AC_SYS_PROCFS_EXE_LINK): Likewise. * configure.in: Check for LLONG_MAX. Check for -lcipher. (Patch from chrisv@web4inc.com with modifications). * Source/GSFormat.m: If we have LLONG_MAX, define LONG_LONG_MAX to match. * Source/NSScanner.m: Likewise. 2001-10-24 Richard Frith-Macdonald * configure.in: Check for zlib * Headers/gnustep/base/GSConfig.h.in: Define HAVE_ZLIB * Headers/gnustep/base/NSFileHandle.h: Add useCompression extension * Headers/gnustep/base/UnixFileHandle.h: ditto * Source/UnixFileHandle.m: Add support for read/write with compression using zlib. Activate with -useCompression 2001-10-19 Richard Frith-Macdonald * Headers/Foundation/NSNumberFormatter.h: ivars aded and updated. * Source/NSNumberFormatter.m: implemented dealloc, copy, coding and all the ivar setting/getting methods. 2001-10-18 Richard Frith-Macdonald * Source/NSString.m: ([+stringWithCString:]) check for nul pointer. 2001-10-17 Adam Fedor * configure.in (GNUSTEP_LDIR): Look for libobjc in .../$LIBRARY_COMBO first. 2001-10-16 Adam Fedor * Source/GNUmakefile: Strip drive names from paths. * Source/GSXML.m: Add dummy GSXMLParser when not using libxml. * Source/NSBundle.m (_absolutePathOfExecutable:): Check for 'Path' variable also (for Windows). * Source/NSUser.m (GSStringFromWin32EnvironmentVariable): New function. (NSHomeDirectoryForUser): Use it. (setupPathNames): Prepend systemDrive to compiled in root paths. (patches from stephen@brandonitconsulting.co.uk). * Source/NSFileManager.m (_attributesAtPath:traverseLink:forCopy:): On (sparc && DEBUG) disable the setgrent functions which cause gdb to crash. 2001-10-15 Richard Frith-Macdonald * Source/GNUmakefile: * Source/GSXML.m: * Headers/Foundation/GSXML.h: Build and install dummy version if libxml is not available. * Tools/GNUmakefile: * Tools/AGSIndex.h: * Tools/AGSIndex.m: * Tools/AGSOutput.h: * Tools/AGSOutput.m: * Tools/AGSParser.h: * Tools/AGSParser.m: * Tools/autogsdoc.m: Many bugfixes and additions, bew code to generate indexes. 2001-10-15 Richard Frith-Macdonald * Tools/AGSOutput.m: Added new 'unit' pseudo-markup to permit control over chapter layout for a chapter containing class, category, or protocol documentation. 2001-10-14 Fred Kiefer * Source/Unicode.m: In iconv_cstrtoustr() and iconv_ustrtocstr() report if a iconv conversion cannot be found. Also added a type convert to the iconv call, so that the compiler wont report a type mismatch. 2001-10-13 Adam Fedor * Headers/gnustep/base/NSPathUtilities.h (GSSystemRootDirectory): New function. * Source/GNUmakefile: Define GNUSTEP_LOCAL_ROOT and GNUSTEP_NETWORK_ROOT paths on compile line. * Source/NSUser.m (setupPathNames): Use compiled in paths as backup if environment variables not found. (GSStandardPathPrefixes): Make sure a non-nil result is returned. (GSSystemRootDirectory). Implement. * Source/NSDistributedNotificationCenter.m (_connect): Use it to find gdnc. * Source/NSPortNameServer.m (initialize): Use it to find gdomap. 2001-10-13 Richard Frith-Macdonald * Source/GSFFCallInvocation.m: Change #import to #include * Source/NSProtocolChecker.m: Change #import to #include * Testing/containers.m: Change #import to #include * Tools/AGSOutput.h: Return string rather than writing to file * Tools/AGSOutput.m: Return string rather than writing to file * Tools/autogsdoc.m: Hnalde file writing. * Tools/plmerge.m: Change #import to #include 2001-10-11 Richard Frith-Macdonald * Tools/GNUmakefile: Addend new files. * Tools/AGSOutput.h: Support class for autogsdoc * Tools/AGSOutput.m: ditto * Tools/AGSParser.h: ditto * Tools/AGSParser.m: ditto * Tools/autogsdoc.m: New tool to generate gsdoc files from ObjC header and source files. Uses comments with a '/**' prefix (like javadoc) to provide nice information about classes and/or methods. This is very much an initial/alpha version but it is already quite useful. 2001-10-06 Richard Frith-Macdonald * Source/NSConnection.m: Increase default timeouts to max value. Improve algorithm for polling for messages when waiting for a reply in multithreaded mode ... use fibonacci sequence for delays rather than doubling each time. * Headers/Foundation/NSConnection.h: Remove default timeout constant. * configure.in: Check for float.h, not for values.h * Documentation/gsdoc/NSConnection.gsdoc: updated. 2001-10-05 Richard Frith-Macdonald * NSTimeZones/NSTimeZones.tar: Updated to latest info. 2001-10-02 Richard Frith-Macdonald * Source/NSLog.m: _NSLog_standard_printf_handler() modified to output message as UTF8 data if it can't be done as ASCII 2001-09-27 Richard Frith-Macdonald * Source/NSString: setupQuotables() ... add several characters to the set of those valid in an unquoted string ... so read back of NSNumber values encoded as strings works ... problem reported by Rene Cornilis. 2001-09-26 Richard Frith-Macdonald * Source/GNUmakefile: install DistributedObjects.h in gnustep/base rather than Foundation .... but it's an internal header - should it be installed at all? 2001-09-25 Adam Fedor * configure.in: Typo in saving CPPFLAGS during iconv test. 2001-09-21 Adam Fedor * configure.in: Typo in iconv cached value. * Headers/gnustep/base/NSGeometry.h: Make const values static also. * Source/NSConnection.m: Remove obsolete BROKEN_NESTED code. * Source/Unicode.m: Dynamically determine best Unicode encoding. 2001-09-21 Richard Frith-Macdonald * Headers/gnustep/base/DistributedObjects.h: * Source/GSFFCallInvocation.m: * Source/NSConnection.m: * Source/NSInvocation.m: * Source/callframe.h: * Source/callframe.m: Modifications to callframe handling to store pointers to data to be freed in order to be able to tidy up after an exception ... Appears to cure memory leak in ffcall code. No fix yest for mframe or ffi code. 2001-09-20 Richard Frith-Macdonald * Testing/nsconnection_client.m: Added simple exception tests * Testing/nsconnection_server.m: Added simple exception tests * Testing/server.h: Added simple exception tests 2001-09-19 Richard Frith-Macdonald * Source/NSConnection.m: rewrite ethod call code. * Source/callframe.h: ditto * Source/callframe.m: ditto * Source/cifframe.h: ditto * Source/cifframe.m: ditto * Source/mframe.m: ditto * Source/mframe/mframe.head: ditto * Headers/gnustep/base/DistributedObjects.h: Adde new DOContext struct. Rewrite code for moving data to/from method call stackframes and encoding/decoding it. The functions to encode/decode each data item are no longer nested, and pass a context structure around which provides for more information to be passed between the various layers of the process so that the whole thing is thread-safe and we don't get cases where code in one place tries to work with an object that was released in another place. Tested pretty extensively for libffcall stuff, with the simple test programs for maframe, and not at all for libffi. 2001-09-19 Adam Fedor * configure.in: Put CPPFLAGS in quotes 2001-09-14 Adam Fedor * configure.in: Remove redundancies in iconv checking. Remove redundant AC_SUBST(LIBS) lines. 2001-09-12 Adam Fedor * Source/thr-pthread.m (objc_yield): Replace pthread_yield with sched_yield. 2001-09-11 Adam Fedor * configure.in: Make sure to subst HAVE_PTHREAD_H into config.mak 2001-09-08 Richard Frith-Macdonald * Source/GSCompatibility.m: GSXMLPlMake() unused argument removed. * Source/NSData.m: Unused and commented out XML plist code removed. * Source/NSString.m: ditto * Source/NSArray.m: Generate XML plists only when writing to file or to URL, not for the -description... methods. This is what MacOS-X does. * Source/NSDictionary.m: ditto 2001-09-05 Adam Fedor * configure.in: Define BROKEN_NESTED_FUNCTIONS if compiler sucks. * Source/NSArray.m (-sortedArrayUsingSelector:): Remove nested function. ([NSMutableArray -sortUsingSelector:]): Likewise. * Source/NSConnection.m (-forwardForProxy:selector:argFrame:): Use external encode/decode functions if BROKEN_NESTED_FUNCTIONS. (-forwardInvocation:forProxy:): Likewise. (-_service_forwardForProxy:): Likewise. * Source/mframe.m (mframe_build_return_opts): Remove and consolidate nested functions. (mframe_handle_return): Likewise. 2001-08-31 Adam Fedor * Resources/French/Localizable.strings: Update (from Michael Scheibler ). Fri Aug 31 11:58:42 2001 Nicola Pero * Documentation/gsdoc/NSFunctions.gsdoc: Documented the localization functions/macros: NSLocalizedString, NSLocalizedStringFromTable, NSLocalizedStringFromTableInBundle, NSLocalizedStaticString, _ and __. 2001-08-30 Adam Fedor * Tools/sfparse.m: Add code to convert files to Unicode. * Resources/German/Localizable.strings: Convert to Unicode. * Resources/French/Localizable.strings: Likewise. Thu Aug 30 20:03:19 2001 Nicola Pero * Source/objc-load.m (objc_load_module): Reset the load callbacks to 0 when we abort loading the module because of an error (Reported by Michael Scheibler ). Thu Aug 30 13:08:17 2001 Nicola Pero * Documentation/gsdoc/NSObject.gsdoc: Added description of the class; documented alloc, allocWithZone:, class, new, dealloc methods. 2001-08-29 Adam Fedor * Source/objc-gnu2next.m (next_objc_msg_send): Fix incorrect def. Mon Aug 28 23:45:15 2001 Nicola Pero * Source/NSCalendarDate.m ([+dateWithString:calendarFormat:]): Call alloc on self, rather than on the hardcoded NSCalendarDate class, so it works in subclasses. ([+dateWithString:calendarFormat:locale:]): Idem. ([+dateWithYear:month:day:hour:minute:second:timeZone:]): Idem. 2001-08-28 Georg Fleischmann * base/Source/NSCalendarDate.m [NSCalendarDate descriptionWithCalendarFormat:locale:]: make milliseconds work (%F) 2001-08-28 Adam Fedor * Headers/gnustep/base/objc-gnu2next.h: More defs. * Source/NSObject.m (-methodSignatureForSelector:): Use sel_get_type. * Source/mframe.m (method_types_get_first_argument): New function. (method_types_get_sizeof_arguments): Likewise. * Source/objc-gnu2next.m (next_objc_msg_sendv): Use them. 2001-08-21 Willem Rein Oudshoorn * Source/GSFFCallInvocation.m: Clearified comments (gs_method_for_receiver_and_selector) added (GSInvocationCallback): Check if forwardInvocation: is implemented to avoid infinite recursion bug. Fri Aug 24 12:34:56 2001 Nicola Pero * Source/NSUserDefaults.m ([-__createArgumentDictionary]): Make sure we don't crash trying to parse an argument as a property list. Fri Aug 24 10:23:02 2001 Nicola Pero * Resources/Italian.lproj/Localizable.strings: New file. * Resources/GNUmakefile (LANGUAGES): Added Italian. 2001-08-21 Adam Fedor * Resources/English.lproj/Localizable.strings: New file * Resources/German.lproj/Localizable.strings: Likewise. * Resources/French.lproj/Localizable.strings: Likewise. * Resources/GNUmakefile: Install them. (files from michael.scheibler@onevision.de) * config/config.loadtest.m: Make Test inheret from Object (Darwin objc checks that classes implement forward::). * config/config.objc.m: Likewise. 2001-08-20 Pierre-Yves Rivaille * Documentation/gsdoc/ NSPipe.{gsdoc, html}: this class has been forgotten * Documentation/gsdoc/{Base, NSObject, NSPort}.{gsdoc, html}: updates to the links to show NSPipe 2001-08-16 Richard Frith-Macdonald * Tools/gsdoc.m: ([-initWithFileName:]) call xmlKeepBlanksDefault(0) to handle change in recent libxml whitespace handling. 2001-08-10 Richard Frith-Macdonald * Source/NSDistantObject.m: Tidy method lookup code. * Source/NSString.m: Handle nil content when parsing xml elements. 2001-08-06 Willem Rein Oudshoorn * Source/GSFFCallInvocation.m: Forwarding: thread safe, handle missing typeinformation better, performance improvement. Minor tidyups by RFM 2001-08-06 Richard Frith-Macdonald * Source/GSMime.m: ([-decodeData:fromRange:intoData:withContext:]) One line fix suggested by Stephen Brandon * Source/GSMime.m: ([-_decodeBody:]) fix parsing multipart documents as there was an error in the logic for testing to see if the sub docs had been parsed correctly. 2001-08-03 Adam Fedor * Source/NSObject.m: Don't decl __objc_responds_to on Darwin * Source/NSProxy.m: Likewise. 2001-08-03 Richard Frith-Macdonald * Headers/Foundation/Unicode.h: API Change * Source/Unicode.m: API Change ... remove old string conversion functions and replace with two functions, both of which differentiate between lengths of the source strings and sizes of destination buffers. * Source/NSString.m: Update for changes to Unicode.[hm] * Source/GSString.m: Update for changes to Unicode.[hm] 2001-08-02 Richard Frith-Macdonald * Source/NSPortNameServer.m: Log the host we are connecting to when we produce a warning for a failure of a link to gdomap. * Source/GSHTTPURLHandle.m: ([-propertyForKeyIfAvailable:]) return nil if the property is not available. 2001-08-01 Richard Frith-Macdonald * Documentation/gsdoc/Base.gsdoc: Documented all the uses of environment variables I could find. * Source/NSUserDefaults.m: __createArgumentDictionary ... handle property lists as arguments correctly. * Source/NSUser.m: Added GSTooldDirectory to listable paths. 2001-07-31 Richard Frith-Macdonald * Source/GSFFCallInvocation.m: attempt to guess type signature when compiler gives us an untyped selector. * Headers/Foundation/NSObject.h: ASSIGN(), ASSIGNCOPY(), minor reordering to make these macros thread-safe. 2001-07-30 Adam Fedor * Headers/gnustep/base/NSObjCRuntime.h: Export additional functions and variables for Windows DLLs. * Headers/gnustep/base/NSObject.h: Likewise. * Headers/gnustep/base/Unicode.h: Likewise. * Headers/gnustep/base/preface.h.in: Define __WIN32__ ifndef on MINGW32. * Testing/nsarray.m: Use NSCParameterAssert. * Testing/nsconnection.m: Cleanup for MinGW/Cygwin. Sat Jul 21 23:25:14 2001 Wim Oudshoorn * Source/NSHost.m ([NSHost +hostWithName:]): Added forgotten argument to NSLog(). 2001-07-19 Richard Frith-Macdonald * Source/UnixFileHandle.m: Don't abort aread/write attempts that fail on EAGAIN or EINTR ... retry them instead. Avoid unexpected exceptions when trying to write a large volume of data quicker then the output device can handle. * Source/WindowsFileHandle.m: ditto 2001-07-19 Adam Fedor * Documentation/readme.texi: Explain the license for GNUstep more clearly. * README: Regen. Thu Jul 19 12:41:22 2001 Nicola Pero * config/config.objc.m: New file. * configure.in: Added new test to check whether Objective-C really works. If it doesn't, abort immediately telling the user to fix their compiler installation first. (AC_CHECK_HEADERS): Don't check for libguile.h * configure: Regenerated. 2001-07-17 Richard Frith-Macdonald * Source/Unicode.m: Removed bogus tests for character zero in string conversion functions ... OpenStep strings are not nul terminated, so the code terminated conversions prematurely. Tue Jul 17 15:00:52 2001 Nicola Pero * Makefile.postamble (after-distclean): Depend on remove-header-links; do not remove links here. (remove-header-links): New target removing header links; different implementation on mingw32 and on non-migw32. Do not remove Source/Foundation. (.PHONY): Added, with header-links and remove-header-links. 2001-07-16 Adam Fedor * Headers/gnustep/base/objc-gnu2next.h: New definitions for sel functions, rearrange some things. * Headers/gnustep/base/objc-load.h: Change category type for compatibility with NeXT. * Source/objc-load.m: Likewise. * Source/GSCompatibility.m (+defaultsChanged:): Typo in method name. 2001-07-16 Richard Frith-Macdonald * Source/NSString.m: Finish off and enable XML property list code * Source/GSCompatibility.m: ditto 2001-07-16 Adam Fedor * Source/NSUserDefaults.m ([NSUserDefaults +userLanguages]): Put MINGW languages in array (Fix from "Michael Scheibler" ). 2001-07-16 Richard Frith-Macdonald * Source/NSArray.m: Added ([writeToURL:atomically:]) for MacOS-X compatibility * Source/NSDictionary.m: ditto 2001-07-15 Richard Frith-Macdonald * Source/NSProcessInfo.m: Added -processIdentifier for compatibility with MacOS-X * Source/NSTask.m: Added -processIdentifier, -suspend, and -resume for compatibility with MacOS-X * Source/NSPortNameServer.m: Modified removal methods to return a boolean success/failure status for MacOS-X compatibility. 2001-07-14 Adam Fedor * Headers/gnustep/base/objc-gnu2next.h: More function defs. * Headers/gnustep/base/objc-load.h (objc_get_symbol_path): Correct def to match function decl. * Source/NSDistantObject.m (-selectorTypeForProxy:): Declare variable in NeXT implementation. * Source/NSInvocation.m (-invokeWithTarget:): Special def for NeXT. * Source/thr-pthread.m: Add forward decl of __objc_thread_detach. 2001-07-12 Richard Frith-Macdonald * Source/NSAttributedString.m: ([addAttributes:range:]) corrected bogus range check (report by Michael Scheibler) * Source/NSString.m: ([descriptionWithLocale:...]) as special case quote strings beginning with a slash ... property lists can otherwise confuse strings with leading slashes as comments. 2001-07-11 Adam Fedor * Source/objc-load.m: Include objc-load.h on NeXT systems. 2001-07-11 Richard Frith-Macdonald * Source/NSFileManager.m: ([fileSystemRepresentationWithPath:]) MINGW fix contributed by Michael Scheibler 2001-07-10 Richard Frith-Macdonald * Source/NSUserDefaults.m: Update date/time designations to arrays * Source/NSDate.m: Update to use date/time designation arrays. 2001-07-09 Richard Frith-Macdonald * Source/objc-load.m: Remove bogus include of objc-load.h on non-NeXT systems. 2001-07-09 Adam Fedor * configure.in: Check for pthread.h - for compiling on Darwin. * Source/GNUmakefile: Compile thr-pthread.m conditionally. * Source/thr-pthread.m: New file. * Source/null-load.h (__objc_dynamic_get_symbol_path): New def. * Source/objc-load.m: Use NeXT load methods on Darwin. 2001-07-07 Richard Frith-Macdonald * Source/NSUser.m: NSSearchPathForDirectoriesInDomains() Set up default values if environment variables are missing. Use common code for getting path prefixes and search directories. 2001-07-07 Richard Frith-Macdonald * Source/NSData.m: readContentsOfFile() hack added to permit reading of files like those in the /proc filesystem which don't support lengths. * Source/NSString.m: ([-initWithFormat:locale:]) use dummy local variable to try to get compilation to work on alpha ... untested as I don't have an alpha system. 2001-07-02 Richard Frith-Macdonald * Source/NSString.m: Never init nocopy with null pointer - increase chance of double initialisation being detected. 2001-06-27 Richard Frith-Macdonald * Source/callframe.m: callframe_do_call_opts(), callframe_build_return_opts() fixed memory leaks. Performance improvements - callframe_from_info() use a single malloc to allocate memory for the entire callframe. callframe_free() use a single free() * Source/NSConnection.m: Wait only 0.1 millisecond for first try checking for events ... CPUs are getting faster. * Source/NSTimer.m: Set minimum timer to 0.1 milliseconds ... 2001-06-26 Adam Fedor * Source/NSUserDefaults.m (+userLanguages): On MingW systems, check locale for language name. 2001-06-26 Richard Frith-Macdonald * Source/NSSerializer.m: While deserializing, check strings to see if they are really unicode, and create cStrings if they are not. Minor memory usage optimisation. 2001-06-21 Richard Frith-Macdonald * Source/NSConnection.m: Change some deprecated runloop methods for standard ones. * Source/NSRunLoop.m: ([runMode:beforeDate:]) Check for task completion and send out notifications if required. * Source/NSTask.m: ([waitUntilExit]) schedule a timer so that the run loop waits rather than polling as fast as the CPU allows. 2001-06-20 Richard Frith-Macdonald * Source/NSTask.m: handleSignal() ... reset signal handler for systems that don't have BSD signal semantics. Report by jan trembulak * Source/GSString.m: getCString_c(), getCString_u() reverse logic of returning remaining range ... report by Michael Scheibler 2001-06-15 Adam Fedor * Version: 1.0.2 2001-06-15 Richard Frith-Macdonald * Source/NSFileManager.m: ([-removeFileAtpath:handler:]) Check for illegal paths as specified in the MacOS-X documentation. * Source/Makefile.postamble: Update to rebuild files for XML and SSL support when config.h changes. 2001-06-14 Richard Frith-Macdonald * Source/NSuserDefaults.m: Fix +resetUserDefaults to retain the NSRegistrationDomain information ... was losing it when this method was called in response to the user name being initially set. ([-registerDefaults:]) fix for when no dictionary found. Use NSLanguages rather than Languages as key for the languages list. * Source/NSUser.m: GSSetUserName() ... only reset the user defaults if the name is actually changed - and not if it is being initialised. When standardUserDefaults are first obtained, the user name should be initialised as part of that process anyway. * Source/NSFileManager.m: ([-removeFileAtpath:handler:]) Fix this method so it *doesn't* follow symbolic links. This makes it conform to the documentation and prevents accidental removal of entire directory hierarchies! Wed Jun 13 19:43:16 2001 Nicola Pero * Source/NSFileManager.m ([-createSymbolicLinkAtPath:pathContent:]): Fixed - the call to symlink was using old path instead of new path and viceversa. 2001-06-12 Adam Fedor * Documentation/news.texi: Update * Documentation/gsdoc/NSArray.gsdoc: Updates (from Pierre-Yves Rivaille ). 2001-06-11 Adam Fedor * configure.in (enable-openssl): New option, disabled by default. * Documentation/install.texi: document it. 2001-06-09 Adam Fedor * Source/externs.m: Change definition of exception strings and some functions to match headers. 2001-06-09 Richard Frith-Macdonald * Source/NSString.m: parseQuotedString() ... fix for parsing octal and hex escape sequences. 2001-06-09 Nicola Pero * configure.in (VERSION): Output a message saying that we are checking for the version, and which version we find. 2001-06-07 Richard Frith-Macdonald * Source/NSConnection.m: Control caching of port coders by a simple boolean, and disable it by default. 2001-06-07 Adam Fedor * aclocal.m4: Add special case for cygwin in CON_AUTOLOAD. 2001-06-07 Richard Frith-Macdonald * Source/GSAttributedString.m: When caching attribute dictionaries we make an immutable copy of the dictionary with shallow copy. 2001-06-06 Nicola Pero Configuration part of constant string support with gcc-3.0 * config/config.constant-string-class.m: New config test. * configure.in: Added test for -fconstant-string-class option in compiler, by compiling and running config.constant-string-class.m. Output different NX_CONST_STRING_CLASS and NX_CONST_STRING_CPPFLAGS depending on results of this test. * base.make.in (CONFIG_SYSTEM_INCL): Added NX_CONST_STRING_CPPFLAGS. * Headers/gnustep/base/GSConfig.h.in: Renamed NXCONST to NX_CONST_STRING_CLASS. * configure: Updated. 2001-06-06 Richard Frith-Macdonald * Source/NSScanner.m: ([scanHexInt:]) fix for scanning number consisting just of a zero. Reported by Tom Koelman 2001-06-06 Richard Frith-Macdonald Changes for constant string support with gcc-3.0 * configure.in: Just substitute NXCONST * Headers/gnustep/base/GSConfig.h.in: Use NXCONST to redefine NXConstantString * Headers/gnustep/base/NSString.h: new constantStringClass method. * Source/GSString.m: new constantStringClass method. * Source/NSObject.m: Use NSConstantStringClass. * Source/NSScanner.m: Use NSConstantStringClass. * Source/NSString.m: implement constantStringClass method. 2001-06-06 Nicola Pero * Source/mframe.m: Reactivated inling nested functions after gcc 3.0 was fixed to compile them again. 2001-06-05 Nicola Pero * GNUmakefile: If GNUSTEP_MAKEFILES is not set, tell the user it needs to source GNUstep.sh and then exit with an error. 2001-06-05 Nicola Pero * Source/mframe.m: Disabled inlining of nested functions. This should allow gnustep-base to be compiled using gcc 3.0. 2001-06-05 Richard Frith-Macdonald * Source/GSString.m: ([replaceCharactersInRange:withString:]) Fix error appending unicode string to C string. 2001-06-01 Richard Frith-Macdonald * Source/NSString.m: Patch by David Relson applied 2001-06-01 Richard Frith-Macdonald Optimisations suggested by Guenther Fuerthaller * Source/NSZone.m: NSZonefromPointer() check for empty zones list before locking. * Source/NSData.m: more efficient dealloc implementation for NSMutableDataMalloc. 2001-06-01 Nicola Pero * Source/NSCalendarDate.m ([-descriptionWithCalendarFormat:locale:]): Fixed %w (day of the week) to output a single digit number rather than a two digit one. 2001-05-31 Adam Fedor * Headers/gnustep/base/NSObjCRuntime.h (GSLastErrorStr): Define new OS-independant strerror like function. * Source/GSFormat.m: Use it. * Source/GSTcpPort.m, Source/NSData.m, Source/NSDistributedLock.m, Source/NSFileManager.m, Source/NSPipe.m, Source/NSRunLoop.m, Source/NSTask.m, Source/UnixFileHandle.m, Source/WindowsFileHandle.m: Likewise. * Source/NSObjCRuntime.m (GSLastErrorStr): New function (suggestion from "Michael Scheibler" ). * Headers/gnustep/base/behavior.h: Include objc-class.h on NeXT_RUNTIME. * Headers/gnustep/base/objc-gnu2next.h: New inline functions. * Source/NSDistantObject.m (-selectorTypeForProxy): Simplify NeXT_RUNTIME implementation. 2001-05-29 Adam Fedor * Version: 1.0.1 * Resources/Languages/Dutch: New file (from Dennis Leeuw ). 2001-05-28 Adam Fedor * Headers/gnustep/base/objc-gnu2next.h (class_is_class): New. * Source/NSAssertionHandler.m (-handleFailureInMethod...): Use OpenStep functions to get class/sel names. * Source/NSBundle.m (+initialize): NeXT_RUNTIME method to find classes. 2001-05-26 Mirko Viviani * Source/NSDebug.m (_NSPrintForDebugger): new function to support print object (po) cmd of gdb. 2001-05-25 Adam Fedor * configure.in: Use -lobjc with NeXT_RUNTIME. * Headers/gnustep/base/behavior.h: Include objc.h on NeXT_RUNTIME. * Source/GSFormat.m: Replace assert with NSCParameterAssert 2001-05-23 Adam Fedor * configure.in: Check for libgiconv * Unicode.m: Include giconv.h if available. 2001-05-22 Adam Fedor * configure.in: Check CPP handling of LONG_LONG_MAX * Source/GSFormat.m: Undef LONG_LONG_MAX if not handled * Source/GSeq.h: Set static selectors to NULL. * Source/NSString.m (+initialize): Set selectors here instead. * Source/GSString.m (setup): ...And here. 2001-05-22 Richard Frith-Macdonald * Headers/Foundation/NSSet.h: Added ([-setSet:]) * Source/GSSet.m: Optimise ([-unionSet:]) * Source/GSArray.m: Tidy NSWarnMLog macros. * Source/GSAttributedString.m: ditto * Source/GSCountedSet.m: ditto * Source/GSDictionary.m: ditto * Source/NSArray.m: ditto * Source/NSDictionary.m: ditto * Source/NSSet.m: Implement ([-setSet:]) 2001-05-18 Richard Frith-Macdonald * Source/NSDate.m: check for nil dates in some init methods so we return nil on initialisation failure rather than raising an exception. I believe that init failures should deallocate their objects and return nil. * Source/NSArray.m: ([-initWithContentsOfFile:]) include filename in NSWarnMLog() message. * Source/NSDictionary.m: ([-initWithContentsOfFile:]) use NSWarnMLog 2001-05-14 Adam Fedor * Headers/gnustep/base/objc-gnu2next.h: Add apply_t prototype. * Source/objc-gnu2next.m: Include stdio.h. * Source/GSFormat.m: Don't compare LONG_LONG_MAX if not defined 2001-05-15 Richard Frith-Macdonald * Source/NSString.m: ([stringByDeletingPathExtension]) rewrite to conform to MacOS-X documentation. ([pathComponents]) ditto. * Headers/Foundation/NSInvocation.h: Added extra methods for setting an invocation to invoke super implementation of method. * Source/NSInvocation.m: Added extra methods for setting an invocation to invoke super implementation of method. * Source/GSFFCallInvocation.m: support invoke of super implementation. 2001-05-14 Adam Fedor * Headers/gnustep/base/objc-gnu2next.h: Add error prototypes. * Source/objc-gnu2next.m: Include preface.h, define error funcs. 2001-05-12 Richard Frith-Macdonald * Source/NSObject.m: Removed some unused obsolete code. * Source/NSProxy.m: Modified ([methodSignatureForSelector:]) and ([respondsToSelector:]) to work for existing methods and raise exception for non-existant methods. The MacOS-X docs says they raise exceptions, but I think it makes sense for them to work for methods that are actually implemented in the proxy. 2001-05-11 Adam Fedor * Source/NSArchiver.m ([NSArchiver -encodeValueOfObjCType:at:]): Use signed char to encode _C_CHR. * Source/NSPortCoder.m ([NSPortCoder -decodeValueOfObjCType:at:]): Be lenient about decoding [un]signed chars. * Source/NSUnarchiver.m: Likewise. * Source/GSTemplateValue.m (-encodeWithCoder:): Use signed char to encode/decode type info. * Source/GSValue.m: Likewise. * Source/NSConcreteNumber.m: Likewise. * Source/NSNumber.m: Likewise. * Source/NSValue.m: Likewise. 2001-05-10 Richard Frith-Macdonald * Source/NSConnection.m: Use respondsToSelector rather than respondsTo * Source/NSRunLoop.m: ditto ... and tidy up categories to avoid compiler warnings. * Source/NSAutoreleasePool.m: Add ([+freeCache]) method to clear out the cache of pools in the current thread. * Documentation/gsdoc/NSAutoreleasePool.gsdoc: basic class documentation inlcuding normal GNUstep extensions. 2001-05-08 Richard Frith-Macdonald * Tools/gdomap.c: Fixes to last modifications - provided by Chris B Vetter. * Source/NSString.m: Fix memory allocation of a unichar buffer to correct size. * Source/NSPipe.m: Log an error if we can't open a new pipe. * Source/NSTask.m: Slight tidyup 2001-05-04 Nicola Pero * Source/NSObject.m (GSGetValue): Call handleQueryWithUnboundKey: rather than handleTakeValue:forUnboundKey: when no property binding is found. 2001-05-04 Nicola Pero * configure.in: Abort if GNUSTEP_SYSTEM_ROOT is empty, printing a message saying that you must run the GNUstep configuration script before configuring the base library. * configure: Regenerated. 2001-05-04 Adam Fedor * Headers/gnustep/base/objc-gnu2next.h: Add arglist_h def. Add encoding functions defs. * Source/mframe.m: Include stdio and ctype. * Source/mframe/mframe.foot (mframe_arg_addr): Use marg_getRef if NeXT_RUNTIME. 2001-05-04 Richard Frith-Macdonald * Source/NSDate.m: GSTimeNow() remove volatile typespec and move initialisation of interval in the hope of fixing a problem with float operations. In any case, the code is tidier. * Tools/gdomap.c: If started as root, try to become user nobody before resorting to uid -2 (like NFS). 2001-05-03 Adam Fedor * configure.in: Don't use -lobjc with NeXT_RUNTIME. Check for -lm. * Headers/gnustep/base/objc-gnu2next.h: Add sel_register_name * Source/behavior.m: Add define hacks for Darwin. 2001-05-03 Richard Frith-Macdonald * Source/NSObject: ([+initialize]) Move GSSetLocale() after platform specific code with conditionally compiled variable declarations. Should make this work on BSD and MINGW again. 2001-05-02 Mirko Viviani * Source/NSObject.m ([NSObject +initialize]): fixed a FreeBSD specific code bug introduced by the call of GSSetLocaleC(). Wed May 2 13:19:13 2001 Nicola Pero * Source/UnixFileHandle.m (id): Redefine `id' when including openssl header files to avoid syntax errors from 3.x serie gcc compilers. 2001-05-02 Richard Frith-Macdonald * Source/NSTimeZone: ([-initWithName:]) fix for trivial locking bug. 2001-04-30 Adam Fedor * Source/behavior.m: Rewrite to work with NeXT runtime. * Headers/gnustep/base/objc-gnu2next.h: Add some extra translations. 2001-04-30 Richard Frith-Macdonald * Source/NSString.m: parseQuotedString() handle \U escape sequences of eight digit hex encoded unicode values. ([descriptionWithLocale:indent:to@]) handle unicode strings by using \U escape sequences in output C string. 2001-04-28 Fred Kiefer * Source/NSString.m: Corrected bug in last optimization for the parsing of property list. Now the bitmap representation is retained not the characterset itself. This did cause undeterministic problems when reading in the Info.plist. 2001-04-28 Richard Frith-Macdonald * Source/NSLog.m: Use RETAIN/RELEASE * Source/GSLocale.m: Set up NSDecimalSeparator and NSThousandsSeparator from locale if possible. Fix bug dereferencing nil pointer. * Source/GSFormat.m: Hack to rewrite output from sprintf of floats and doubles to use the value in NSDecimalSeparator. 2001-04-27 Nicola Pero * Source/NSString.m: Minor optimization for parsing property lists: cache the bitmap representation of hexdigit, quotable and whitespace character sets, and use it directly to determine whether a character is member or not of these sets. 2001-04-26 Richard Frith-Macdonald * Source/NSString.m: ([+initialize]) protect with flag so it is safe to call this method more than once. * Source/externs.m: GSBuildStrings() call +initialize method for NSString to ensure that the class is properly initialised even if this function has been called from NSObjects +initialize, which was in turn called in preparation for NSString initialisation! 2001-04-25 Adam Fedor * configure.in: Much simplified NeXT checks. Just use LIBRARY_COMBO to check runtime. * Source/o_vscanf.c: Remove objc-gnu2next.h 2001-04-25 Richard Frith-Macdonald * Headers/Foundation/GSXML.h: Many changes to restore encapsulation of libxml previously broken by someone... Partly as a matter of good OO programming practice, partly so that the library can be used effectively from Java (via JIGS). Moved libxml header includes out of this file. Removed typedefs for libxml constants and changed 'type' methods to return 'int'. Added class methods for mapping between integer type values and constant string type values. Added a typeDescription method to GSXMLAttribute for consistency. * Source/GSXML.m: include required headers and update to implement changes in API. Also fixed bug in implementation of typeDescription method for GSXMLNamespace. * Documentation/gsdoc/GSXMLNode.gsdoc: Updated to reflect current API * Documentation/gsdoc/GSXMLNamespace.gsdoc: ditto * Documentation/gsdoc/GSXMLAttribute.gsdoc: ditto 2001-04-25 Nicola Pero * base.make.in: (GNUSTEP_BASE_VERSION), (GNUSTEP_BASE_MAJOR_VERSION), (GNUSTEP_BASE_MINOR_VERSION), (GNUSTEP_BASE_SUBMINOR_VERSION): New variables providing the gnustep-base version. 2001-04-24 Adam Fedor * Headers/gnustep/base/objc-gnu2next.h: Remove TypedStream defs 2001-04-24 Richard Frith-Macdonald * Source/NSObject.m: Fixes for string capitalisation in key-value methods. 2001-04-23 Adam Fedor * configure.in: Simplify NeXT checks. * Headers/gnustep/base/NSLock.h: Fix NeXT_RUNTIME typo. * Headers/gnustep/base/objc-gnu2next.h: Change *_EXPORT to extern * Source/o_vscanf.c: include objc-gnu2next.h * Source/NSConnection.m: Fix test for NeXT_RUNTIME define. * Source/NSDistantObject.m: Likewise. * Source/callframe.m: Likewise. * Source/cifframe.m: Likewise. * Source/mframe.m: Likewise. 2001-04-24 Nicola Pero * Testing/benchmark.m (bench_object): Use a choice of the 10 more used classes when benchmarking class method invocation, rather than always using `NSObject'. Added bench for NSClassFromString. 2001-04-23 Nicola Pero * Source/GSValue.m ([-getValue:]): Fixed typo - was raising exception on non-NULL buffer rather than NULL. 2001-04-23 Nicola Pero * Source/NSBundle.m ([+initialize]): Fixed segmentation fault when NSSearchPathForDirectoriesInDomains returns an empty array. This used to appear when GNUSTEP_SYSTEM_ROOT was unset. * Source/NSUser.m (NSSearchPathForDirectoriesInDomains): Read GNUSTEP_SYSTEM_ROOT, GNUSTEP_LOCAL_ROOT, GNUSTEP_NETWORK_ROOT and GNUSTEP_USER_ROOT only once, then cache them. Do not crash if some of them are nil. If GNUSTEP_SYSTEM_ROOT is nil, fprintf a log message, and try using /usr/GNUstep/System. Use new ADD_PATH macro to simplify code. Autorelease returned array which was previously leaked. 2001-04-22 Georg Fleischmann * Source/GSAttributedString.m: ([replaceCharactersInRange:withString:]) recalculate effective range after removing attributes. 2001-04-23 Richard Frith-Macdonald * Source/GSLocale.m: Only call setlocale() in GSSetLocaleC() * Source/NSObject.m: ([+initialize]) call GSSetLocaleC() after other initialisation, to try to ensure that locale stuff is set up early before any attempt is made to use locale dependent code. * Source/NSString.m: ([-stringByExpandingTildeInPath:]) fix suggested by David Wetzel. * Source/GSValue.m: Fix abort when initialising value with illegal type. Also fix all other uses of objc_sizeof_type(), add some checks to conform to documentation, and some optimisations. 2001-04-22 Nicola Pero * Testing/benchmark.m: Modified messages to give a better idea of the order of magnitudes involved; added benchmarks for retain/release, autorelease/retain and locking/unlocking. 2001-04-21 Nicola Pero * Source/NSString.m ([-fileSystemRepresentation]): Cache the default file manager. 2001-04-21 Richard Frith-Macdonald * config/config.proccmd.c: New test for behavior of /proc cmdline * acconfig.h: New CMDLINE_TERMINATED constant * configure.in: Use test to set CMDLINE_TERMINATED * configure: regenerated * Headers/Foundation/config.h.in: regenerated * Source/NSProcessInfo.m : ([+load]) modified to use CMDLINE_TERMINATED to decide how to use /proc/$$/cmdline when determining process args. Should now work 100% on all linux versions I hope. 2001-04-20 Richard Frith-Macdonald * Source/NSData.m ([NSMutableDataMalloc -replaceBytesInRange:withBytes:]): Check length, not capacity! Conform to documentation, and avoid possibility of 'hole' in data. * Source/NSInvocation.m: _get_arg() indirection fix suggested by Michael Scheibler. 2001-04-20 Nicola Pero * Source/NSFileManager.m (NSDirectoryEnumerator): Rewritten to be faster. ([NSFileManager -directoryContentsAtPath:]), ([NSFileManager -subpathsAtPath:]): Use the new init method for NSDirectoryEnumerator. ([NSFileManager -contentsEqualAtPath:andPath:]): Spare some method calls. ([NSFileManager -fileSystemRepresentationWithPath:]): Cleaned preprocessor directives. * Headers/gnustep/base/NSFileManager.h (NSDirectoryEnumerator): Changed ivars in sync. 2001-04-19 Nicola Pero * Documentation/gsdoc/NSFunctions.gsdoc: Documented GSDebugAllocation* functions. * Documentation/gsdoc/NSRecursiveLock.gsdoc: Fixed syntax error. * Documentation/gsdoc/*.html: Regenerated. 2001-04-19 Nicola Pero To help with debugging memory leaks, you can now ask to the library to track all allocated instances of a certain class. * Source/NSDebug.m (table_entry): Added fields to allow recording the list of allocated instances if required. (GSDebugAllocationActiveRecordingObjects): New function. (GSDebugAllocationAdd): Modified to take an additional argument - the object being allocated -, and to record it in the list of instances for the class if recording instances of that class has been activated. (GSDebugAllocationRemote): Add a similar additional argument; remove the object from the list of instances if recording instances is activated. (GSDebugAllocationListRecordedObjects): New function. * Source/NSObject.m: Updated all occurrences of GSDebugAllocationAdd and GSDebugAllocationRemove to pass the allocated/removed object as well. * Headers/gnustep/base/NSDebug.h: Updated. 2001-04-19 Nicola Pero * Source/GSTcpPort.m ([GSTcpPort -dealloc]): Fixed memory leak: release address string. 2001-04-19 Richard Frith-Macdonald * Source/NSTask.m: Tidied code a little, added safety checks for usePseudoTerminal method. * Source/NSData.m: ([writeToFile:atomically:]) create new files with permission 0644 modified by umask. Init tmppath for MINGW. * Tools/gsdoc.m: Use memory management macros and attempt to get back to something like conformance with coding standards. * Documentation/gsdoc/NSTask.gsdoc: documentation fleshed out. 2001-04-16 Adam Fedor * aclocal.m4: Detect the xm2-config script. 2001-04-14 Mirko Viviani * configure.in: fixed fake main for 'new' FreeBSD targets. 2001-04-13 Adam Fedor * Source/GSFFCallInvocation.m (GSInvocationCallback): Generate an exception for an invalid selector. 2001-04-12 Adam Fedor * Headers/gnustep/base/NSObjCRuntime: Revert to using class_pointer. * Headers/gnustep/base/objc-gnu2next.h: Redefine class_pointer. 2001-04-12 Richard Frith-Macdonald * Source/NSProcessInfo.m ([load]): Fixed single line change somehow missed from last patch. 2001-04-12 Adam Fedor * Headers/gnustep/base/NSLock.h: Include thrmach.h if NeXT_RUNTIME. * Headers/gnustep/base/NSThread.h: Likewise. * Headers/gnustep/base/NSObjCRuntime: Include objc-gnu2next.h if NeXT_RUNTIME, use common objc functions for compatibility. * Headers/gnustep/base/objc-gnu2next.h: Update, simplify. * Headers/gnustep/base/thr-mach.h: New file * Source/thr-mach.m: New file * Source/GNUmakefile: Update to conditionally compile NeXT files * Documentation/gsdoc/NSRecursiveLock.gsdoc: Update. 2001-04-12 Richard Frith-Macdonald * Source/NSString.m: For efficiency, use _DefaultStringEncoding throughout, rather than calling +defaultCStringEncoding. This is safe since the documentation explicitly states that the encoding cannot be changed programmatically ... so we don't have to worry about someone adding a category to change that. When converting data to/from strings, optimise to simple cString stuff if the specified encoding is the defautl encoding. Tidied some stuff to conform better to coding standards. * Source/Unicode.m GetDefEncoding(): prohibit UTF8 from being the default cString encoding ... the default cString encoding must consist of 7 or 8 bit characters, and must contain ASCII as a subset. We really should think of a generalised test for that. Use GetDefEncoding() throughout rather than defaultCStringEncoding. * Source/GSString.m: Use GetDefEncoding() to get c string encoding. 2001-04-11 Nicola Pero * Source/NSString.m ([-initWithData:encoding:]): When working with a generic but non-unicode encoding, do not treat a single character string with no null terminator as an empty string. This should fix passing single character strings over DO. * Source/NSThread.m ([+registerCurrentThread]), ([+unregisterCurrentThread]): Removed. 2001-04-11 Richard Frith-Macdonald * Source/GSFFCallInvocation.m: bugfix encoding ... pass correct method type information so that the other end knows whether this is a oneway message or not. Corrects major memory leak. * Source/NSConnection.m: bugfix to handle situations where the other end sends a response and we are not expecting it. Also added various bits of debugging and ensured that all NSPortCoder objects are cached. 2001-04-10 Adam Fedor * Headers/gnustep/base/preface.h.in: Correct NeXT_RUNTIME name * Documentation/gsdoc/NSLock.h: Documented. 2001-04-10 Richard Frith-Macdonald * Source/NSTask.m: Bugfix to send out task termination notification and clean up correctly when a task is killed by a signal rather than exiting cleanly. 2001-04-09 Adam Fedor * 1.0 branch merged into main. 2001-04-06 Nicola Pero * Source/NSString.m (pathSepMember): Made trivial and inlined. ([-stringsByAppendingPaths:]): Count the array only once, not for any loop in the cycle. 2001-04-05 Richard Frith-Macdonald * Source/NSUser.m: NSTemporaryDirectory() rewrite for improved security and reliability. Expect MINGW update soon. 2001-04-02 Richard Frith-Macdonald * Source/NSUser.m: Tidied some stuff to conform to coding standards. Added FIXME where unsure of code. Tidied code to get name of user. * configure.in: Added checks for a few functions needed to get user. 2001-03-37 Jonathan Gapen * Source/NSString.m: New private function to compute the scalar value of a high-low surrogate pair. New surrogate range class variables. Optimize ([-hasPrefix]) and ([-hasSuffix]) by using NSAnchoredSearch. Add UTF-8 code to ([-dataUsingEncoding:allowLossyConversion:]). 2001-03-26 Jonathan Gapen * Source/Makefile.preamble: No need to define HAVE_LIBXML here. * Source/NSBundle.m: ([+initialize]) and ([+pathForGNUstepResource: ofType:inDirectory:]) now use NSSearchPathForDirectoriesInDomains() to find directories, rather than use env vars directly. * Source/NSCharacterSet.m: Ditto for ([_-bitmapForSet:]). * Source/NSDictionary.m: Make NSLog() include the filename in ([-initWithContentsOfFile:]). * Source/NSUser.m: Re-implement NSStandardApplicationPaths() and NSStandardLibraryPaths() with NSSearchPathsForDirectoriesInDomains(). In latter function, support $GNUSTEP_SYSTEM_ROOT/Developer/Demos. 2001-03-21 Jonathan Gapen * config/nextcc.m4, config/objc-con-autoload.m4, config/procfs.m4, config/objc-sys-dynamic.m4, config/procfs-exe-link.m4: Autoconf macros used by configure.in. 2001-04-08 Adam Fedor * Version: 1.0.0 * NEWS: Regenerated. * Source/NSLock.m (-tryLock): Return NO if our thread has already has the lock (like OpenStep). (-lockBeforeDate:): block until date if our thread already has the lock (like OpenStep). * Source/NSData.m ([NSMutableDataMalloc -replaceBytesInRange:withBytes:]): Check capacity, not length. 2001-04-04 Adam Fedor * config.guess: Update to latest version * config.sub: Likewise. 2001-04-01 2001 Nicola Pero * Source/GSValue.m ([-description]): Bug fix - was crashing upon using %@ instead of %s for a char *. 2001-03-31 Adam Fedor * Documentation/announce.texi: Update. * Documentation/install.texi: Likewise. * Testing/Makefile.preamble: Set BUNDLE_LIBS on mingw and cygwin. * Testing/nsbundle.m: add NSProcessInfo's initializeWithArguments:... 2001-03-28 Richard Frith-Macdonald * Source/NSProcessInfo.m: ([+load]) Fix in parsing of command line arguments from /proc filesystem. On newer kernels the command line arguments are terminated by a nul, on older systems they are separated by a nul. The old code would add an extra (empty) argument to all processes on newer kernels. The new code will lose a trailing empty argument on older kernels :-( I view it as the lesser of two evils since the extra empty arg confuses/breaks a lot of tools. 2001-03-27 Richard Frith-Macdonald * Source/NSFileManager.m: Fix file copying for MINGW by using windows native copy function - fix by Michael Scheibler. Also tidied to conform to coding standards, and fixed to use O_BINARY where the system defines it. 2001-03-26 Richard Frith-Macdonald * Headers/Foundation/NSObject.h: GS_EXPORT updates for MINGW * Headers/Foundation/NSObCRuntime.h: ditto * Headers/Foundation/NSRange.h: ditto * Source/NSRange.m: ditto Fixes suggested by Michael Scheibler 2001-03-24 Richard Frith-Macdonald * Source/NSData.m: ([-replaceBytesInRange:withBytes:]) bugfix ... revert to check using '>' rather than '>=' to conform to documentation and to be consistent with use of ranges in general. * Documentation/gsdoc/NSMutableData.gsdoc: documented primitive methods. * Documentation/gsdoc/NSFunctions.gsdoc: Some documentation for NSRange added. 2001-03-23 Adam Fedor * Source/NSData.m: ([-replaceBytesInRange:withBytes:]) Check location >= size. 2001-03-23 Richard Frith-Macdonald * Source/NSData.m: ([-replaceBytesInRange:withBytes:]) bugfix ... extend data if range has location in data, but extent beyond data. 2001-03-23 Adam Fedor * Source/NSSerializer.m (serializeToInfo): Use memcpy to serialize strings on machines that need word alignment. * Source/NSTimeZone.m (decode): For decoding, likewise. * Testing/thread-except.m: Use autorelease pools. 2001-03-23 Richard Frith-Macdonald * Source/NSFileManager.m: MINGW fixes by Michael Scheibler. ([_attributesAtPath:traverseLink:forCopy:]) fix 'cos windows lacks symbolic links. ([-changeFileAttributes:atPath:]) workaround for windows directories not having modification times. ([-fileSystemAttributesAtPath:]) fix for large volumes (matching change for unix too ... use unsigned long long). 2001-03-23 Richard Frith-Macdonald * Source/NSObject.m: ([-methodSignatureForSelector:]) try to get a valid method signature any way we can ... check for a valid method first, use selector types next. Avoid crash when given nul selector as an argument. * Source/NSMethodSignature.m: ([+signatureWithObjCTypes:]) don't crash when given nul pointer as argument. 2001-03-19 Jonathan Gapen * Source/NSString.m: Implement ([-localizedStringWithFormat:]). Fix ([-localizedCompare:]) and ([-localizedCaseInsensitiveCompare:]). (They will work when ([-compare:options:range:locale:]) works.) Fix ([-initWithContentsOfFile:]) and ([-initWithContentsOfURL:]) so that they deal with 1 byte of data, and clarify Unicode BOM test with new class variables byteOrderMark and byteOrderMarkSwapped. In ([-initWithData:encoding:]) and ([-initWithCoder:]), don't treat the default C string encoding the same as ASCII. GCC 3.0 supports UTF-8 as a C string encoding, so this behavior is undesirable. 2001-03-19 Jonathan Gapen * Source/NSAutoreleasePool.m, Source/NSCharacterSet.m, Source/NSHashTable.m, Source/NSMapTable.m, Source/NSZone.m: Update from %s/([-cString]) to %@ for format strings. * Source/NSDecimal.m: In GSDecimalFromString(), use ([-lossyCString]) instead of ([-cString]) which should (in the future) always return ASCII-range decimal digits in place of digits from other languages. 2001-03-19 Nicola Pero * Source/NSThread.m: registerCurrentThread and unregisterCurrentThread turned into functions - called GSRegisterCurrentThread and GSUnregisterCurrentThread. * Headers/gnustep/base/NSThread.h: Updated for change. * Source/NSThread.m (GSRegisterCurrentThread): Call objc_thread_add before creating the NSThread object using a method call. (GSUnregisterCurrentThread): Post the NSThreadWillExit notification. 2001-03-19 Jonathan Gapen * Source/NSString.m: In ([-rangeOfComposedCharacterSequenceAtIndex:]), use the NSCharacterSet non-base character set to identify non-base characters. In ([-cStringLength]), do not allow lossy string conversion. In ([+localizedNameOfStringEncoding:]), use NSBundle's ([-gnustepBundle]) rather than looking in root path. 2001-03-17 Richard Frith-Macdonald * Headers/Foundation/NSThread.h: Remove unused ivar. * Source/NSThread.m: Revise scheme for deallocation of thread dictionary ... keep it operating to avoid problems with stuff trying to use it while deing deallocated. Log memory leaks. * Source/NSRunLoop.m: ([+currentRunLoop]) return nil if there is no thread dictionary available (shouldn't happen). * Source/NSString.m: MINGW path handling fixes by Michael Scheibler stringByAppendingPath, isAbsolurtePath, and stringByStandardizingPath. 2001-03-16 Nicola Pero * Source/Makefile.postamble (after-install): Removed old code for creating /etc/services.add when packaging. * Makefile.postamble ($(INSTALL_ROOT_DIR)$(GNUSTEP_MAKEFILES)/Additional): New target; create the directory. (before-install): Don't create the directory, but depend on the new target. * Resources/GNUmakefile.postamble: Idem for $(languagedir). * NSCharacterSets/Makefile.postamble: Idem for $(charsetdir). * NSTimeZones/Makefile.postamble: Idem for $(timezonedir). 2001-03-16 Manuel Guesdon * Tools/pl*.m: added #include to avoid GNUSTEP Internal Error 2001-03-14 Adam Fedor * Source/libgnustep-base.def: Remove some classes that aren't used on MinGW32. 2001-03-13 Adam Fedor * configure.in: Check and set EXEEXT needed by some tests. * aclocal.m4: Fixes for constructor test. 2001-03-12 Jonathan Gapen * Headers/gnustep/base/NSString.h: Change NSCyrillicStringEncoding to NSISOCyrillicStringEncoding, and likewise for Greek, Arabic, and Hebrew, to avoid ambiguity. Add enum values for all remaining ISO-8859 character sets, plus UTF-7. * Source/GSXML.m: Update pursuant to above changes. * Source/NSString.m: Ditto. * Source/Unicode.m: Ditto. 2001-03-11 Adam Fedor * Source/NSThread.m: Remove runtime.h include since this isn't normally installed by objc, add back in extern variables. 2001-03-10 Adam Fedor * Version 0.9.2 * Makefile.postamble (before-install): Remove extra '/' before GNUSTEP_MAKEFILES * configure.in: Check for objc_thread_add in runtime. * Source/NSThread.m (objc_thread_add): Define only if not in runtime (objc_thread_remove): Likewise. 2001-03-10 Manuel Guesdon * GSXML.m/.h: added errer, warning and fatal error methods with line and col parameters in GSSAXHandler. 2001-03-08 Richard Frith-Macdonald * Headers/gnustep/base/NSCalendarDate.h: * Headers/gnustep/base/NSTimeZone.h: New files for MacOS-X compatibility * Headers/gnustep/base/Foundation.h: Add NSCalendarDate and NSTimeZone * Headers/gnustep/base/NSDate.h: Remove info in new files. * Source/GNUmakefile: Add new NSCalendarDate and NSTimeZone files. * Source/NSCalendarDate.m: Update for header changes. * Source/NSDate.m: ditto * Source/NSDateFormatter.m: ditto * Source/NSLog.m: ditto * Source/NSString.m: ditto * Source/NSTimeZone.m: ditto 2001-03-07 Adam Fedor * Source/NSInvocation.m (-initWithTarget:selector:): Correct copying of unhandled argument types. 2001-03-07 Richard Frith-Macdonald * Source/NSObject.m: ([methodSignatureForSelector:]) reliability fix suggested by Manuel Guesdon 2001-03-06 Adam Fedor * Source/libgnustep-base.def: Regenerate. 2001-03-05 Richard Frith-Macdonald * Source/NSUserDefaults.m: Changed ([+setUserLanguages:]) to use NSLanguages. * Documentation/gsdoc/NSUserDefaults.gsdoc: documented the ([+setUserlanguages:]) method. 2001-03-04 Jonathan Gapen * Documentation/gsdoc/NSCharacterSet.gsdoc: Documented some methods. * Headers/gnustep/unicode/caseconv.h: Updated case-mapping tables. * Source/NSBitmapCharSet.m: Added sanity check to initWithBitmap: * Source/Unicode.m: Changed uni_toupper() and uni_tolower() to use direct lookup in two-level tables, rather than a linear search. 2001-03-03 Richard Frith-Macdonald * Source/NSBundle.m: Corrected ([-_bundleResourcePathsWithRootPath:subPath:]) to use ([NSUserDefaults +userLanguages]) to get language array again. * Documentation/gsdoc/NSUserDefaults.gsdoc: Updated and added information about +userLanguages 2001-03-03 Adam Fedor * Source/NSInvocation.m: Add missing static inline to __get_arg (patch from David Relson ). 2001-03-03 Richard Frith-Macdonald * Source/NSSerializer.m: * Source/NSURLHandle.m: * Source/NSUnarchiver.m: * Source/GSFormat.m: * Source/GSHTTPURLHandle.m: * Source/GSMime.m: * Source/GSString.m: * Source/NSDictionary.m: * Source/NSPortNameServer.m: Various minor changes to avoid compiler warnings. * Source/NSFileManager.m: ([-fileSystemRepresentationWithPath:]) Use CYGWIN_HOME as suggested by Michael Scheibler * Source/NSUser.m: NSHomeDirectoryForUser() fix for home path on NT by Michael Scheibler. 2001-03-01 Jonathan Gapen * NSCharacterSets/whitespaceCharSet.dat, NSCharacterSets/whitespaceAndNlCharSet.dat: Add tab character. 2001-03-01 Nicola Pero * aclocal.m4 (AC_SYS_PROCFS): Reverted last change in code to detect the /proc filesystem as it didn't work on my gnu-linux: /proc/0 does not exist, but the /proc filesystem works perfectly. * configure.in (GS_FAKE_MAIN): Fixed typo in last change which caused fake main definition to take place even when both +load and /proc worked. * configure: Regenerated. 2001-02-28 Jonathan Gapen * configure.in: Begin autoconf clean-up; replace tests for NeXT compiler, /proc, and exe link with external macros; add support for FreeBSD /proc/curproc/file link. * acconfig.h: Remove definition now handled by macro. * aclocal.m4, configure, Headers/gnustep/base/config.h.in: Regen. * Source/NSBundle.m: Take exe link from PROCFS_EXE_LINK define. * Source/NSProcessInfo.m: HAVE_PROC_FS -> HAVE_PROCFS 2001-02-28 Adam Fedor * Source/win32-load.h (__objc_dynamic_get_symbol_path): New function. * Source/GSHTTPURLHandle.m ([GSHTTPURLHandle -loadInBackground]): Use GSUnixSSLHandle only if not __MINGW__ 2001-02-27 Jonathan Gapen * NSCharacterSets/README.CharSet: Update notes. * NSCharacterSets/*.dat: Regenerate with v3.0.1 of UnicodeData.txt (ftp://ftp.unicode.org/Public/UNIDATA/UnicodeData.txt) 2001-02-27 Adam Fedor * configure.in: Fix openssl config so it defines HAVE_OPENSSL only if all headers and libs available. * configure, acconfig.h, Headers/gnustep/base/config.h.in: Regen. * Source/UnixFileHandle.m: Use HAVE_OPENSSL. 2001-02-27 Nicola Pero * Source/NSLock.m: Commented out extra token after #endif directive. * Headers/gnustep/base/GSXML.h: Idem. 2001-02-27 Nicola Pero * configure.in (Version): source it as ./Version rather than Version (suggested by Juliusz Chroboczek ). * configure: Regenerated. 2001-02-26 Mirko Viviani * Source/NSConcreteNumber.m (NumberTemplate): added precision to float and double TYPE_FORMAT. 2001-02-25 Adam Fedor * configure.in (cppflags_temp): Corrected to save CPPFLAGS not CFLAGS> 2001-02-25 Richard Frith-Macdonald * Source/GSLocale.m: Removed YESSTR and NOSTR support for simplicity. 2001-02-24 Nicola Pero * Resources/Languages/French: New file (contributed by Frederic De Jaeger). * Resources/GNUmakefile (LANGUAGES): Added French. 2001-02-23 Richard Frith-Macdonald * Tools/gdomap.c: Fixed bug in handling '-a' option and enhanced to support multicast probing of networks specified in '-a' file. 2001-02-22 Nicola Pero * Headers/gnustep/base/NSBundle.h: Added three new localization macros: _(), __() and NSLocalizedStaticString (). 2001-02-22 Nicola Pero * Resources/Languages/Italian: New file. * Resources/GNUmakefile (LANGUAGES): Added Italian. 2001-02-22 Richard Frith-Macdonald * Source/NSUserDefaults.m: Fixes to prevent problems obtaining languages array due to attempts to use partially constructed standard user defaults object. 2001-02-21 Adam Fedor * Documenation/install.texi: Update. * Documenation/news.texi: Likewise. * INSTALL, NEWS: Regen. 2001-02-21 Richard Frith-Macdonald * Source/NSString.m: Fix memory leak reported by thoran@free.fr parsePlItem() 2001-02-17 Nicola Pero * Source/GNUmakefile (PACKAGE_NAME): Fixed typo - was gnutep-base rather than gnustep-base. 2001-02-20 Mirko Viviani * Source/GSXML.m|.h ([GSXMLAttribute -ns]): get attribute namespace. 2001-02-19 Richard Frith-Macdonald * Source/GSLocale.m: Tidy, defined __USE_GNU to get YESSTR and NOSTR on later versions of glibc. * Source/NSString.m: Log more info when parsing a property list fails. 2001-02-13 Adam Fedor * Version: 0.9.1 * configure.in: Fix test for stdint.h 2001-02-11 Manuel Guesdon * GSXML.m: testing lib!=NULL and string!=NULL before doing something in -GSXMLNode content -GSXMLNode name -GSXMLNode ns -GSXMLNode nsDef * NSString.m: handle NULL bytes in -initWithUTF8String: (Treat it as zero length string and NSDebugMLog a warning). 2001-02-09 Jonathan Gapen More FreeBSD build fixes: * acconfig.h: Add recent definitions. * configure.in: Add test for wchar.h header. * configure: Regenerate. * Headers/gnustep/base/config.h.in: Regenerate. * Source/GSFormat.m: Typedef wint_t if wchar.h not available. * Source/NSTask.m: Change #if TIOCNOTTY to #ifdef TIOCNOTTY. 2001-02-08 Nicola Pero * INSTALL: Updated installation instructions. 2001-02-08 Richard Frith-Macdonald Fixes reported by David Wetzel ... * Source/GSFormat.h: Add header for wchar * Source/NSCoder.m: Remove spurious semicolon * Source/dynamic-load.h: correct argument to dlsym() 2001-02-08 Richard Frith-Macdonald * Source/GSString.m: permit nil string when replacing characters in range. Treat as an empty string rather than raising exception. 2001-02-07 Jonathan Gapen * Source/NSFileManager.m: Make disk space report work on FreeBSD. On all Unix platforms, report disk space available to non-root users. 2001-02-07 Richard Frith-Macdonald * Source/GSFormat.m: merged in some more fixes by Kai. 2001-02-07 Richard Frith-Macdonald * Source/GSFormat.m: Fixed error in PAD() macro - it was failing to decrement a counter - and looping forever. Fixed error in formatted output of string arguments ... was crashing with range exception. 2001-02-04 Richard Frith-Macdonald * Source/NSTask.m: Added gnustep specific feature to run task in pseudo terminal. 2001-02-02 Richard Frith-Macdonald Integrated patch for unicode support for ([-initWithFormat:]) by Kai Henningsen. Modified to support efficient append with format to a unicode string. * configure.in: Test for data type used by GSFormat * Headers/gnustep/base/GSFormat.h: file declaring GSFormat info. * Source/GSFormat.m: Source for format support. * Source/NSString.m: Use GSFormat() to implement ([-initWithFormat:]) * Source/GSString.m: use GSFormat() to implement ([-appendFormat:]) 2001-01-31 Richard Frith-Macdonald * Source/NSDate.m: pass dates over DO bycopy unless explicitly byref. * Source/NSTimeZone.m: pass time zones over DO bycopy unless explicitly byref. Use placeholder class for newly created objects - to improve eficiency of selection of classes in cluster. Updated to use MacOS-X initialisation methods. 2001-01-30 Michael Hanni * Source/.cvsignore: tweaked to cover a few more items. * Makefile.postamble: distclean removes created file: base.make. * configure.in: patched to fix bug in libxml detection macro (reviewed by: Nicola Pero ) * configure: Regenerated. 2001-01-30 Nicola Pero * gnustep-base.script.spec.in: Fixed, tidied. * configure.in (CPPFLAGS): Added -I$GNUSTEP_HDIR so that custom libobjc headers are used - this should fix ffcall detection. * configure: Regenerated. 2001-01-30 Richard Frith-Macdonald * Headers/Foundation/NSDate.h: Partial support added for MacOS-X * Source/NSTimeZone.m: Updates to encode all time zones as the abstract class, and added MacOS-X methods. * Source/NSCalendarDate.m: Use NSTimeZone rather than NSTimeZoneDetail throughout ... provide MacOS-X compatibility. * Source/NSDate.m: Fix milliseconds error creating date on MINGW 2001-01-29 Adam Fedor * configure.in: Remove check for alternate libobjc and Headers include. Fix typo in setting cppflags_temp in GMP test. * Source/Makefile.preamble (ADDITIONAL_INSTALL_DIRS): Don't make .../gnustep/Foundation * Source/Makefile.postamble (after-install): Don't install headers in .../gnustep/Foundation 2001-01-29 Nicola Pero * GNUmakefile: Include local base.make. * Admin/GNUmakefile: Idem. * Documentation/GNUmakefile: Idem. * Documentation/gsdoc/GNUmakefile: Idem. * Examples/GNUmakefile: Idem. * NSCharacterSets/GNUmakefile: Idem. * NSTimeZones/GNUmakefile: Idem. * Testing/GNUmakefile: Idem. * Tools/GNUmakefile: Idem. * Resources/GNUmakefile: Idem. * Source/GNUmakefile: Idem. * configure.in (tests for ffi): set CONFIG_SYSTEM_LIBS too (test for iconv): test taken from the make package. (AC_OUTPUT): Generate base.make. * configure: Regenerated. * base.make.in: New file. * Makefile.postamble (before-install): Install base.make. 2001-01-29 Nicola Pero * NSTimeZones/NSTimeZones.tar: Updated. 2001-01-28 Jonathan Gapen * Source/NSUser.m: In NSSearchPathForDirectoriesInDomains(), added support for NSDeveloperDirectory, NSAdminDirectory, and the new GSLibrariesDirectory. * Headers/gnustep/base/NSPathUtilities.h: Added new enum value GSLibrariesDirectory, to support GNUstep's Libraries dir. 2001-01-26 Adam Fedor * gnustep-base.script.spec.in: New file, rpm script for installing gdomap, updating ld.conf, etc. 2001-01-26 Richard Frith-Macdonald * Source/NSArray.m: Fix failure to assign result of init to self (similar fixes in various other files). * Tools/gsdoc.m: Fix error in parsing items containing mixed elements. * Documentation/gsdoc/NSTimeZone.gsdoc: Fix erro in markup. 2001-01-25 Richard Frith-Macdonald * configure.in: Add check for rexcent versions of gmp 2001-01-25 Richard Frith-Macdonald * Source/NSException.m: Modify default handler to permit simple exit as well as abort. * Documentation/gsdoc/Base.gsdoc: documented environmnet variable CRASH_ON_ABORT 2001-01-21 Richard Frith-Macdonald * Source/NSString.m: Fixes for OPENSTEP compatibility in string path operations - patch provided by Pierre-Yves Rivaille, plus another fix by me. 2001-01-19 Nicola Pero * gnustep-base.spec.in: Updated copyright and attempt at improving description. 2001-01-19 Nicola Pero * config/config.loadtest.m: Added dummy NXConstStr implementation for libobjc which do not include it. * configure.in: Simplified check for thread flags. gnustep-make already gets them - simply get them from config.make here. * configure: Regenerated. * config/config_thread.m: Removed. 2001-01-17 Adam Fedor * Version: Prerelease version 0.9.0 * configure.in: Change check for installed libobjc to match gstep-make 2001-01-18 Nicola Pero * Source/GNUmakefile: Simplified name to gnustep-base. * gnustep-base.spec.in: Changed Group to Development/Libraries. * gnustep-base-debug.spec.in: Idem. * NSTimeZones/NSTimeZones.tar: Removed hard links to avoid rpm problems with hard links. 2001-01-18 Richard Frith-Macdonald * Source/NSHost.m: New method ([-_addName:]) to add a name to a host. Use it to add the local hostname to the 127.0.0.1 host if there is no IP address set up for the local machine. * Source/NSRunLoop.m: ([-acceptInputForMode:beforeDate:]) improve handling of available descriptors - each descriptor may be available for more than one type of event. 2001-01-17 Mirko Viviani * Source/GSXML.m|.h ([GSXMLDocument -stringValue]): dump document in a string. Wed Jan 17 16:46:09 2001 Nicola Pero * GNUmakefile: Added PACKAGE_NEEDS_CONFIGURE and RPM_DISABLE_RELOCATABLE. * GNUmakefile: Simplified name to gnustep-base. * gnustep-base.spec.in: New file. * gnustep-base-debug.spec.in: Idem. * gnustep-base.spec: Move to gnustep-base.spec.old. 2001-01-13 Richard Frith-Macdonald * Source/GSMime.m: ([-decodeData:fromrange:intoData:withContext:]) Added destination data cpacity information to context so that correct positioning can be maintained over a sequence of calls using a chunked http context. * Source/GSAttributedString.m: Fixed bug initialising from an empty attributed string, and fixed bug replacing characters in range, when an attribute range location is the same s the location of the replaced characters. 2001-01-12 Richard Frith-Macdonald * Source/GSXML.m: ([-GSXMLDocument setRoot:]) set root node to be owned by libxml, so we don't free it's memory ourselves. * Headers/gnustep/base/NSValue.h: Added range methods. * Source/GNUmakefile: Rename value files to GS prefix and remove concrete value header. * Source/Makefile.postamble: Build GS value files. rather than NS * Source/NSValue.m: Added range methods and updated for change to naming conventions. Added abstract placeholder class. Fixed encoding to store the abstract class in the archive. * Testing/values.m: Added range check * Source/GSTemplateValue.m: Renamed for consistency. Adapted encoding/decoding for storing abstract class in archive. * Source/GSValue.m: ditto * Headers/gnustep/base/NSConcreteValue.h: private info removed * Source/NSCTemplateValue.m: Renamed for consistency * Source/NSConcreteValue.m: ditto 2001-01-10 Nicola Pero * Source/GSAttributedString.m ([GSAttributedString -length]), ([GSMutableAttributedString -length]): Added for speed. 2001-01-10 Richard Frith-Macdonald * Source/Unicode.m: Fix bug in checking possible default string encodings . reported by Stefan Urbanek 2001-01-10 Richard Frith-Macdonald Tidyup by removing 'NonCore' categories. 2001-01-09 Richard Frith-Macdonald General tidyups to simplify code and to make class names consistent with the other libraries. * Headers/Foundation/NSGAttributedString.h: removed * Source/NSGAttributedString.m: renamed to GSAttributedString.m concrete classes renamed for consistency with other gstep libs. * Source/NSGDictionary.m: renamed to GSDictionary.m concrete classes renamed for consistency with other gstep libs. * Source/NSAttributedString.m: classes renamed * Source/NSDictionary.m: classes renamed * Source/GNUmakefile: replace NSGAttrinbutedString with and NSGDictionary with GS prefixed classes. Don't try to install old header. * Source/NSString.m: updates for class renaming. * Source/NSSerializer.m: ditto 2001-01-08 Adam Fedor * configure.in: Enable ffcall by default (unless the libraries don't exist). 2001-01-08 Richard Frith-Macdonald * Headers/Foundation/NSGArray.h: removed * Headers/Foundation/NSArray.h: merge core/non-core classes. * Source/GNUmakefile: replace NSGArray with GSArray. * Source/NSGArray.m: converted to GSArray.m * Source/NSArray.m: simplified by merging core/non-core classes. Use placeholder class when allocating constant arrays. * Source/GSArray.m: simplified version of GSArray.m Added GSPlaceholderArray. * Source/NSSerializer.m: use GSInlineArray where possible. * Source/GSSet.m: Provide decoding of NSGSet for backward compatibility. * Source/NSException.m: Avoid recursion in exception handler. 2001-01-04 Richard Frith-Macdonald * Tools/gsdoc.gsdoc: Tidied and fixed a few typos/spelling errors. 2001-01-04 Jonathan Gapen * configure.in, aclocal.m4, acconfig.h: Replace libxml detection with autoconf macro from libxml 2.2.10 installation. * configure, Headers/gnustep/base/config.h.in: Regenerate. * Headers/gnustep/base/GSXML.h, base/Source/GSXML.m, base/Tools/gsdoc.m: Use proper libxml #includes. 2001-01-03 Adam Fedor * configure.in: Change test for objc forwarding hook to match gcc patch. * Source/GSFFCallInvocation.m: Use new forwarding hook. 2001-01-03 Richard Frith-Macdonald * Source/NSBundle.m: fix for checking windows executable file extensions - reported by michael.scheibler@onevision.de 2001-01-03 Mirko Viviani * Source/NSObjCRuntime.m (GSInstanceVariableInfo): fixes. * Source/NSObject.m ([NSObject -handleQueryWithUnboundKey:]): raise an exception. ([NSObject -handleTakeValue:forUnboundKey:]): changed exception. ([NSObject -unableToSetNilForKey:]): likewise. ([NSObject -storedValueForKey:]), ([NSObject -valueForKey:]): check for null selector before calling respondsToSelector: ([NSObject -takeStoredValue:forKey:]), ([NSObject -takeValue:forKey:]): likewise. Call GSSetValue with correct values. (GSSetValue): fixed ivar implementation. (GSGetValue): likewise. ([NSObject -methodSignatureForSelector:]): FreeBSD fix. * Source/NSEnumerator.m|.h ([NSEnumerator -allObjects]): implemented. * Source/Unicode.m (GetDefEncoding): do not emit the warning for NSISOLatin1StringEncoding. 2000-12-26 Adam Fedor * configure.in: Look for libxml2 (patch from Kim Shrier ). * acconfig.h: Define LIBXML2 * Headers/gnustep/base/config.h.in: Regenerate * Headers/gnustep/base/GSXML.h: Include libxml2.h if found. * Source/GSXML.m: Likewise. * Tools/gsdoc.m: Likewise. (patches from Kim Shrier ). 2000-12-22 Adam Fedor * Source/GSFFCallInvocation.m: Remove powerpc specific defs 2000-12-21 Richard Frith-Macdonald * Source/NSDistantObject.m: Modified DO_FORWARD_INVOCATION() macro and its uses so that they actually do what was intended :-) Also, modified implementation of methodSignatureForSelector: for ffcall library to prevent recursion. 2000-12-21 Richard Frith-Macdonald * Headers/Foundation/GSIMap.h: On initialisation set number of nodes to exactly equal capacity, for improved memory efficiency. * Source/Makefile.postamble: correct dependencies for GSIMap. * Source/GSCountedSet.m: Use map enumerator rather than messing with the internals of a GSIMap directly. * Source/GSSet.m: ditto * Source/NSConnection.m: ditto * Source/NSGDictionary.m: ditto * Source/NSNotificationCenter.m: ditto * Source/NSString.m: property list memory leak fixed. 2000-12-18 Richard Frith-Macdonald * Source/NSGAttributedString.m: Fix logic errors setting attributes. 2000-12-18 Adam Fedor * Source/Makefile.postamble (libgnustep.def): Rebuild manually rather than automatically. 2000-12-14 Richard Frith-Macdonald * Source/Unicode.m: Tidied to conform to coding standards and changed to use ISOLatin1 as the default cString encoding. * Source/GSString.m: Fixed bug getting cString from unicode string - raise exception when it should. * Source/NSString.m: ditto. Also use lossyCString in various places rather than cString. 2000-12-13 Nicola Pero * Headers/gnustep/base/NSRange.h, Source/NSRange.m: Inlined NSMakeRange. 2000-12-12 Nicola Pero * Source/NSDebug.m (table_entry): Added peak field. (GSDebugAllocationAdd): Set peak counter if needed. (GSDebugAllocationClassList), (GSDebugAllocationTotal), (GSDebugAllocationPeak): New functions. * Headers/gnustep/base/NSDebug.h: Added corresponding declarations. 2000-12-08 Adam Fedor * Set up DO and NSInvocation to use foreign-function interface library. * configure.in: Add check for --enable-ffcall * Documentation/gnustep-base.texi: Update * Documentation/install.texi: Likewise. * Documentation/readme.texi: Likewise. * Documentation/gsdoc/NSTimeZone.gsdoc: Update. * Headers/gnustep/base/NSConnection.h: New forward method. * Headers/gnustep/base/NSInvocation.h: New frame ivar. * Source/GNUmakefile: Conditionally compile in FFI classes if enabled. * Source/NSConnection.m (-forwardInvocation:forProxy:): New method. (_service_forwardForProxy:): For FFCALL don't autorelease memory, call proper forwarding function. * Source/NSDistantObject.m (forwardInvocation:): Implement. (methodSignatureForSelector:): For FFCALL, forward through invocation. (conformsToProtocol:): Likewise. (respondsToSelector:): Likewise. * Source/NSInvocation.m: Convert to abstract class with subclasses based on FFI interface. (_get_arg, _set_arg, _arg_addr): New functions based on FFI interface. (+allocWithZone:): Alloc proper concrete class. (+initialize): Set proper concrete class. (-initWithCoder:): Replace self with proper concrete class. (initWithArgframe:selector:): Make subclassResponsibility. (initWithMethodSignature:): Likewise. (returnFrame:): Likewise. Implement GSFrameInvocation * Source/GSFFCallInvocation: New file. * Source/GSFFIInvocation: Likewise. * Source/cifframe.[hm]: Likewise. * Source/callframe.[hm]: Likewise. 2000-12-07 Richard Frith-Macdonald * Source/NSGSet.m: renamed to GSSet.m for consistency, tidied. * Source/NSGCountedSet.m: renamed to GSCountedSet.m for consistency. * Headers/Foundation/NSGSet.h: removed - obsolete. * Headers/Foundation/NSSet.h: si9mplified back to single class * Source/NSSet.m: Updated and tidied. Fixed coding class for mutable sets. Removed non-core classes. 2000-12-05 Richard Frith-Macdonald * Source/NSURLHandle.m: minor mods to background loading. * Source/GNUmakefile: * Source/Makefile.postamble: * Source/Makefile.preamble: * Tools/Makefile.preamble: Updated for flattened directory structure. 2000-12-02 Richard Frith-Macdonald * Source/NSDate.m: GSTime() added millisecond info. * Source/NSCalendarDate.m: GSTime() added millisecond info. * Headers/Foundation/NSDate.h: GSTime() added millisecond info. * Source/NSObject.m: key-value-coding restructured and implemented for non-object values. 2000-11-30 Richard Frith-Macdonald * Source/NSCalendarDate.m: ([-initWithString:calendarFormat:locale:]) Bugfixes to fill in missing information using current date/time and to implement missing format codes. 2000-11-27 Richard Frith-Macdonald * Source/NSClassDescription.m: New MacOS-X class added. * Headers/Foundation/NSClassDescription.m: New MacOS-X class added. * Headers/Foundation/NSKeyvalueCoding.m: New MacOS-X protocol added. * Source/NSObject.m: New MacOS-X key value coding methods added. Only objects currently supported - needs work to support scalar types too! 2000-11-23 Mirko Viviani * Source/NSBundle.m ([NSBundle +_addFrameworkFromClass:]): fixed an autorelease problem. (reported by Gerald Siebke ) 2000-11-22 Richard Frith-Macdonald * Source/GSTcpPort.m: ([-connectToPort:beforeDate:]) added locking to prevent possible problems with two threads trying to get root object of a new connection at the same time. * Documentation/gsdoc/NSURLHandle.gsdoc: Added subclass information. 2000-11-22 Richard Frith-Macdonald * Headers/gnustep/base/NSAutoreleasePool.h: Changed proivate method for cleanup at end of thread. * Headers/gnustep/base/NSThead.h: New ivar to mark when we are deallocating. * Source/NSAutoreleasePool.m: Added parameter to _endThread so we can safely end a thread without it being the current one. * Source/NSThread.m: Now clean up autorelease pools *after* everything elese, while deallocating the thread. This is to cope with objects that try to access the thread dictionary while autoreleasing. -threadDictionary modified to return nil during deallocation rather than creating a new ductionary. 2000-11-21 Richard Frith-Macdonald * Source/externs.m: Removed obsolete http body key. * Source/GSHTTPURLHandle.m: Removed obsolete http body key. * Headers/Foundation/NSURLHandle.h: Removed obsolete http body key. 2000-11-20 Nicola Pero * Source/NSConnection.m: ([NSConnection -invalidate]) Fixed typo in multi-thread support. 2000-11-18 Richard Frith-Macdonald * Source/NSURLHandle.m: Implemented setting and gettign of properties for file handles using NSFileManager. * Source/GSHTTPURLHandle.m: Implemented ([-writeData:]). Rewrote posting mechanism using new implementation. Modified so that old method of writing bodyn properties still works for the moment. * configure.in: Added tests for GMP library - needed in future. * Headers/Foundation/NSDecimal.h: include GSConfig.h for HAVE_GMP * Source/NSDecimal.m: test for truth value of HAVE_GMP * Headers/Foundation/GSConfig.h.in: add HAVE_GMP support, but override to '0' until GMP support is fully implemented. 2000-11-17 Richard Frith-Macdonald * Headers/Foundation/GSMime.h: Added GSMimeEncodingContext etc * Headers/Foundation/NSURLHandle.h: Added some more property keys. * Source/GSMime.m: Update to add method for general decoding of different transfer encoding types including chunked (for http1.1). Recognise end of data in chunked encoding or by content length. * Source/GSHTTPURLHandle.m: Added new class for http and https support. * Source/NSURLHandle.m: Register class for http and https support. * Source/externs.m: Added property keys for URL handles. * Documentation/gsdoc/GSMime.gsdoc: updated * Documentation/gsdoc/GSMimeDocument.gsdoc: updated * Documentation/gsdoc/GSMimeParser.gsdoc: updated 2000-11-16 Richard Frith-Macdonald * Source/NSUserDefaults.m: ([-userLanguages]) updated to ensure we don't get empty strings in the language list. * Headers/Foundation/GSMime.h: Revised API * Source/GSMime.m: Revised API to make more sense * Documentation/gsdoc/GSMime.gsdoc: ditto * Documentation/gsdoc/GSMimeDocument.gsdoc: ditto * Documentation/gsdoc/GSMimeParser.gsdoc: ditto 2000-11-16 Richard Frith-Macdonald * Source/NSURL.m: ([-explode]) bugfix for parsing username/password provided by mark@brainstorm.co.uk 2000-11-16 Richard Frith-Macdonald * Source/GSTcpPort.m: Altered all GSTcpHandle debug output to include current thread. Added locking for read/write operations on handle. Hopefully all thread-safe now :-) 2000-11-15 Richard Frith-Macdonald * Source/NSConnection.m: ([-_getReplyRmc:]) added semi-busy wait for when the connection is being used from multiple threads. 2000-11-15 Richard Frith-Macdonald * configure.in: Added checks for OpenSSL * Headers/gnustep/base/NSFileHandle.h: Added info for SSL handles. * Source/UnixFileHandle.m: Added GSUnixSSLHandle class based on code by 2000-11-15 Richard Frith-Macdonald * Source/NSBundle.m: Minor tidying to avoid compiler warnings. * Source/NSFileManager.m: ditto Tue Nov 14 23:44:14 2000 Adam Fedor * Source/GSString.m: Add limits.h (for Solaris) 2000-11-14 Adam Fedor * Source/GSLocale.m: Put LANGINFO_H ifdefs around include of langinfo.h. 2000-11-14 Richard Frith-Macdonald * Source/GSTcpPort.m: ([GSTcpHandle -receivedEvent:type:extra:forMode:]) added locks around write operations for multi-threaded operation. newDataWithEncodedPort() modified to encode local host as an empty string, and other hosts by name rather than address. decodePort() added new parameter so that an empty string can be decoded as the host to which the GSTcpHandle is talking. Modified in various places to keep a record of the IP address of the remote end of the connection, so we can pass this to decodePort() ([-getFds:count:]) fixed error in determining set of file descriptors to listen to - resulted in two threads listening to the same descriptor at the same time! 2000-11-13 Richard Frith-Macdonald * Source/NSGAttributedString.m: partial rewrite to cache/unique dictionaries and to coalesce adjacent regions of string with the same attributes when setting attributes. 2000-11-12 Fred Kiefer * Source/NSArray.m: Corrected [NSMutableArray arrayWithObject:] to return obj instead of self. Fri Nov 10 12:30:27 2000 Nicola Pero Added some GNUstep extensions to NSThread to allow JIGS to transparently map java threads to gnustep threads (and vice versa): * Headers/gnustep/base/NSThread.h, Source/externs.m: (NSThreadDidStartNotification): New notification. * Source/NSThread.m ([NSThread -_sendThreadMethod]): Post the NSThreadDidStartNotification. * Source/NSThread.m, Headers/gnustep/base/NSThread.h ([+registerCurrentThread]), ([+unregisterCurrentThread]): New methods. 2000-11-10 Mirko Viviani * Source/NSBundle.m ([NSBundle +_addFrameworkFromClass:]): avoid crash when called with Nil class. 2000-11-10 Richard Frith-Macdonald * Source/GSTcpPort.m: Added some locking tweaks for writing data. * Source/GSString.m: Fix for decoding obsolete string classes. 2000-11-09 Richard Frith-Macdonald * Source/NSPort.m: ([-setDelegate:]) corrected assertion to allow delegate to be set to nil. Bug reported by cornils@mail.desy.de 2000-11-08 Richard Frith-Macdonald * Source/GSString.m: ([GSMutableString substringWithRange:]) fix to initialize inline string classes correctly. 2000-11-06 Adam Fedor * Documentation: Move tmpl.texi files to texi and update GNUmakefile Mon Nov 6 16:55:26 2000 Nicola Pero * Documentation/GNUmakefile: Install ANNOUNCE, NEWS, INSTALL, BUGS, README, STATUS into Documentation/Developer/Base/ReleaseNotes/$(VERSION); install CODING-STANDARDS and coding-standards into Documentation/Developer/CodingStandards; install gnustep-base into Documentation/Developer/Base/Manual. * Documentation/gsdoc/GNUmakefile (Base_DOCUMENTATION_INSTALL_DIR): Install gsdoc reference in Documentation/Developer/Base/Reference. 2000-11-06 Richard Frith-Macdonald * Source/NSString.m: handle_printf_atsign() - use lossyCString to get string to print. This is a temporary *HACK* - we need a proper unicode supporting initWithFormat: * Source/GSString.m: ([GSMutableString substringWithRange:]) fix to allocate inline string classes for substrings. 2000-11-04 Richard Frith-Macdonald * Source/NSCalendarDate.m ([NSCalendarDate -initWithString: calendarFormat:locale:]): try getting timezone by name before attempting by abbreviation - thus preserving exact name isf possible. 2000-11-03 Mirko Viviani * Source/NSCalendarDate.m ([NSCalendarDate -initWithString: calendarFormat:locale:]): assign calendar format. 2000-11-03 Richard Frith-Macdonald * Source/NSString.m: Update for placeholder class. * Source/GSString.m: Updates for optimisations using placeholder class. 2000-11-01 Richard Frith-Macdonald * Source/GSXML.m: External entity loader revisions completed. * Documentation/gsdoc/GSXML.gsdoc: changes to api * Documentation/gsdoc/GSXMLParser.gsdoc: ditto * Documentation/gsdoc/GSSAXHandler.gsdoc: ditto 2000-11-01 Manuel Guesdon * Headers/Foundation/GSXML.h: added GSXMLNode propertiesAsDictionaryWithKeyTransformationSel: * Source/GSXML.m: added GSXMLNode propertiesAsDictionaryWithKeyTransformationSel: 2000-11-01 Richard Frith-Macdonald * Source/NSUserDefaults.m: Fixed uninitialised variable bug. * Source/NSString.m: Fixed error in xml property list parsing * Source/GSXML.m: Various SAX things to use default implementation. 2000-10-31 Richard Frith-Macdonald * Source/NSString.m: Implemented ([-initWithCharactersNoCopy:length:freeWhenDone:]) and ([-initWithCStringNoCopy:length:freeWhenDone:]) for NSMutableString. ([-initWithCStringNoCopy:length:freeWhenDone:]) for NSString. 2000-10-31 Richard Frith-Macdonald Loads of files modified, fast.x removed. Found it unexpectedly easy to tidy up so that all functions for accessing the runtime are now in NSObjCRuntime.h. Now all :-) we need are Apple runtime implementations, configuration auto-detect for the apple runtime, and loads of updating of any bits of code that call the runtime directly. 2000-10-31 Richard Frith-Macdonald * Headers/gnustep/base/NSGString.h: * Headers/gnustep/base/NSGCString.h: * Source/NSGString.m: * Source/NSGCString.m: Removed classes - no longer used. * Headers/gnustep/base/NSObjCRuntime.h: * Headers/gnustep/base/fast.x: * Source/GSString.m: * Source/Makefile.postamble: * Source/NSArchiver.m: * Source/NSCTemplateValue.m: * Source/NSConcreteValue.m: * Source/NSCountedSet.m: * Source/NSDate.m: * Source/NSDictionary.m: * Source/NSDistantObject.m: * Source/NSGSet.m: * Source/NSNumber.m: * Source/NSObject.m: * Source/NSScanner.m: * Source/NSSerializer.m: * Source/NSSet.m: * Source/NSUnarchiver.m: Changed calls to 'fastClass()' to use 'GSObjCClassOfObject()' and added that to NSObjCRuntime.h. Removed central class and implementation caching from NSObject.m and fast.x since it was not being effectively used. New intention to do removal of fast.x and add similar functionality to NSObjCRuntime.h - intention being to combine functionality of fast access to the runtime, and hiding both GNU and Apple runtime behind a single interface. 2000-10-30 Richard Frith-Macdonald * Source/NSURLHandle.m: Wrap all locking with exception handlers to ensure that locks are released. * Headers/gnustep/base/NSInvocation.h: Removed non-standard macros * Headers/gnustep/base/behavior.h: Removed unused macro CALL_METHOD_IN_CLASS() * Source/GSString.m: * Source/GSXML.m: * Source/NSArchiver.m: * Source/NSArray.m: * Source/NSAttributedString.m: * Source/NSData.m: * Source/NSDictionary.m: * Source/NSGArray.m: * Source/NSGAttributedString.m: * Source/NSGCString.m: * Source/NSGDictionary.m: * Source/NSGeometry.m: * Source/NSObject.m: * Source/NSPortCoder.m: * Source/NSProcessInfo.m: * Source/NSRange.m: * Source/NSRunLoop.m: * Source/NSScanner.m: * Source/NSSerializer.m: * Source/NSString.m: * Source/NSUnarchiver.m: * Source/NSUserDefaults.m: Updated to move static SEL variable initialisation to +initialize methods so that it should (I think) work with the Apple runtime. 2000-10-29 Adam Fedor * configure.in: Check for langinfo. * Source/GSLocale.m (GSDomainFromDefaultLocale): Return nil dict if langinfo info not available. * acconfig.h: Add HAVE_DLADDR * Headers/gnustep/base/config.h.in: Regenerate. * Source/simple-load.h (__objc_dynamic_get_symbol_path): Return nil if not HAVE_DLADDR. 2000-10-29 Richard Frith-Macdonald * Source/GSString.m: New inline string classes added to avoid calls to malloc in some cases. Changed all deallocation methods to call NSDeallocateObject() directy for efficiency. * Source/NSString.m: Use new inline string classes for creation of strings where we know the length of the data in advaance. 2000-10-28 Mirko Viviani * Headers/gnustep/base/NSBundle.h: added ivar. * Source/NSBundle.m ([NSBundle +_addFrameworkFromClass:]): new private method to parse NSFramework_* classes. (_bundle_load_callback): added framework support. Wrap classes in a NSValue to avoid implicit initialization. ([NSBundle +allBundles]): added framework support. ([NSBundle +allFrameworks]): implemented. ([NSBundle +bundleForClass:]): get classes from NSValue object. ([NSBundle -classNamed:]): likewise. * Headers/gnustep/base/objc-load.h (LINKER_GETSYMBOL): new define. * Source/objc-load.m (objc_get_symbol_path): get lib path of a Class or Category. * Source/simple-load.h (__objc_dynamic_get_symbol_path): indentifies lib path of a symbol. * Source/dld-load.h (__objc_dynamic_get_symbol_path): not supported. * Source/hpux-load.h (__objc_dynamic_get_symbol_path): not implemented. * Source/mframe/mframe.foot (mframe_get_arg): typ declaration fix. (mframe_set_arg): idem * Headers/gnustep/base/config.h.in: added HAVE_DLADDR * aclocal.m4 (OBJC_SYS_DYNAMIC_LINKER): test for dladdr() * configure.in: added --with-libxml-include and --with-libxml-library, added -I/usr/local/include and -L/usr/local/lib for FreeBSD. 2000-10-27 Richard Frith-Macdonald * Source/NSObject.m: Reverted last change - +new has to do alloc, init or break classes that expect to use their own allocation mechanisms. Similarly, +alloc must call the ([+allocWithZone:]) method. We can't make optimisations that break with the OpenStep spec and MacOS documentation - they would break production code. Of course, private classes can do this. 2000-10-27 Lyndon Tremblay * Source/NSObject.m ([NSObject +new]): No longer sends 2 messages, uses NSAllocateObject(). ([NSObject +alloc]): Likewise, no message sending within the method. 2000-10-27 Richard Frith-Macdonald * Source/NSURLHandle.m: Make class registration thread safe. Tidy initialisation to use designated initialiser. 2000-10-27 Adam Fedor * Added localization support * configure.in: Look for locale.h * Resources: New directory, files for languages. * Headers/gnustep/base/NSUserDefaults.h: Add missing localization keys. * Source/GSLocale.m: New functions for dealing with locales. * Source/NSUserDefaults.m (-_unlocalizedDefaults): New method. (-sharedUserDefaults): Set up Language domain. (-userLanguages): Create our own defaults, if necessary, to avoid recursion with sharedUserDefaults. (__createStandardSearchList): Put NSGlobalDomain before Language domain to match MacOSX docs (wasn't specified in OpenStep docs). * Documentation/gsdoc/NSUserDefaults.m: Updated. * Tools/locale_alias.m: New test-tool mostly for maintainance use. 2000-10-26 Richard Frith-Macdonald * Source/NSData.m: When deserialising selectors, register new selectors if they don't already exist - so we can unarchive a selector into a program where no objects implements it (we might still want to use it over DO or to store in another archive). Change suggested by N.Pero. * Source/GSMime.m: Mime parser classes partially written. * Headers/Foundation/GSMime.h: mime class headers * Documentation/gsdoc/GSMime.gsdoc: documentation * Documentation/gsdoc/GSMimeDocument.gsdoc: documentation * Documentation/gsdoc/GSMimeParser.gsdoc: documentation Various files partially implemented to add MIME parsing support. Intended to aid implementation of HTTP version of NSURLHandle. 2000-10-24 Adam Fedor * Source/NSCalendarDate.m (-initWithString:calendarFormat:locale:): Set format if nil. (-addYear:month:day:hour:minute:second:): Use signed ints. 2000-10-24 Richard Frith-Macdonald * Source/GSString.m: Implement ([-substringWithRange:]) and ([-substringFromRange:]) equally. The 'from' method is the 'official OpenStep' one, the 'with' method is a MacOS-X compatibility addition. * Source/NSAttributedString.m: Added ([-attributedSubstringWithRange:]) in the expectation that Apple will rename the method and remove ([-attributedSubstringFromRange:]) * Source/NSScanner.m: Use substringWithRange. * Source/NSProxy.m: Implement ([-forward::]) to use ([-forwardInvocation:]). Implement ([-conformsToProtocol:]) to raise exception, Implement ([-respondsToSelector:]) to raise exception. * Source/NSDistantObject.m: Implement ([-conformsToProtocol:]) to forward to remote. Implement ([-respondsToSelector:]) to forward. 2000-10-24 Fred Kiefer * Source/NSAttributedString.m: Added begin/endEditing to all complex methods on NSMutableAttributedString as necessary for NSTextStorage. * Source/GSString.m: Changed all substringFromRange: to substringWithRange: as this is the basic method. 2000-10-23 Richard Frith-Macdonald * Source/NSString.m: ([-fastestEncoding]), ([-smallestEncoding]) implemented to return NSUnicodeStringEncoding. Use new string classes more effectively - let GSString turn itsself into either GSCString or GSUstring when initialised. Merged in code from propList.h * Source/GSString.m: ([-dataUsingEncoding:allowLossyConversion:]) bugfixes for cString reported by Freed Kiefer Removed 'ascii' flag - more trouble than a minor optimisation is worth. Fixed transmute() to be careful about freeing old string. * Source/Unicode.m: encode_ustrtostr_strict() return 0 on failure. 2000-10-21 Richard Frith-Macdonald * Headers/Foundation/NSNull.h: New placeholder class. * Source/NSNull.m: New placeholder class. * Source/GNUmakefile: Build NSNull and install header. * Documentation/gsdoc/GNUmakefile: Build NSNull documentation * Documentation/gsdoc/NSNull.gsdoc: NSNull documentation 2000-10-20 Richard Frith-Macdonald * Source/NSString.m: ([-initWithCharacters:length:]) use ([-initWithCStringNoCopy:length:freeWhenDone:]) if possible. * Source/GSString.m: Much tidying up. Added two new concrete classes for substrings. * Source/NSCalendarDate.m: ([-initWithString:calendarFormat:locale:]) avoid any attempt to read beyond the supplied string. 2000-10-16 Richard Frith-Macdonald Attempts to make sure that when members of a class cluster are encoded (either for archiving or for sending over DO), they are encoded as the abstract class hiding the other classes in the cluster - this should mean that (in future) changes in the private concrete classes used should not effect existing archives and running DO applications. * Source/NSDate.m: Implement -classForCoder to encode as the abstract class. Implement ([-encodeWithCoder:]) and ([-initWithCoder:]) in abstract class. * Source/NSDictionary.m: Implement -classForCoder to encode as the abstract class. Implement ([-encodeWithCoder:]) and ([-initWithCoder:]) in abstract class. * Source/NSArray.m: Implement -classForCoder to encode as the abstract class. * Source/NSAttributedString.m: Implement -classForCoder to encode as the abstract class. Implement ([-encodeWithCoder:]) and ([-initWithCoder:]) in abstract class. * Source/NSGAttributedString.m: Remove coding/encoding stuff - now done in abstract class. * Source/NSNumber.m: Implement -classForCoder to encode numbers as the abstract class. Modified ([-encodeWithCoder:]) and ([-initWithCoder:]) to encode objc type when encoding as abstract class. * Source/NSConcreteNumber.m: Modified encoding method to mirror abstract class method. Old ([-initWithCoder:]) method retained to decode old format records from archives. 2000-10-11 Adam Fedor * Source/NSObject.m (+initialize): Initialize Window sockets on MINGW. * Source/libgnustep-base-entry.m (gnustep_base_socket_init): New function. 2000-10-10 Richard Frith-Macdonald * Source/GSString.m: fillHole() fixed error in copying bytes. 2000-10-09 Richard Frith-Macdonald * Source/NSGAttributedString.m: ([-setAttributes:range:]) Fixed obscure bug - use ASSIGNCOPY rather than ASSIGN to prevent mutable dictionaries being placed in attributed string. 2000-10-09 Richard Frith-Macdonald Major rewrite of NSString. There was a fundamental architectural problem in the old implementation ... if you had an NSGMutableCString object, and used any method that appends (or replaces) characters in that string, there was a problem in that the characters being added may not be representable in the default character set. This means that we needed the concrete mutable strring class to be able to mutate itsself from an 8-bit string to a 16-bit string when necessary (we can't just allocate a new object, because we have no way of returning it to the caller). We could not handle this simply by changing the class pointer in the instance (and reallocating and modifying the memory actually storing the characters of course). The problem with this is that the method implementations of the object may have been cached in the user code (quite likely if you want high performance from a mutable string) - and subsequent use of those cached implementations would still try to treat the contents of the string as 8-bit characters. The solution adopted was to make the standard mutable string class contain a flag to adjust its behavior so that each method treats the char data as either 8 or 16 bit. This makes for ugly code, partially tidied by use of inline functions. For most of the methods implemented for the constant strings (rather than being inherited from the abstract class) we now have two inline functions for 8-bit and 16-bit implementations. The GSUString and GSCString objects have method implementations that simply called the appropriate function. The GSMString implementation of each method tests the flag and calls the appropriate inline function. * Headers/gnustep/base/NSString.h: Remove NSGCString, NSGString, NSGMutableCStrng and NSGMutableString. Add GSString interface and new version of NXConstantString interface. * Headers/gnustep/base/fast.x: Remove string caching information. * Source/GNUmakefile: Don't build old concrete strings or install their headers. Do build new concrete string (GSString.m) * Source/GSCompatibility.m: Don't use private concrete strings. * Source/GSeq.h: Various modifications for new string classes. * Source/NSArray.m: Don't use private concrete strings. * Source/NSData.m: Don't use private concrete strings. * Source/NSDictionary.m: Don't use private concrete strings. * Source/NSGAttributedString.m: Don't use private concrete strings. * Source/NSGCString.m: No longer used. * Source/NSGDictionary.m: Don't use private concrete strings. * Source/NSGString.m: No longer used. * Source/NSNotificationCenter.m: Don't use private concrete strings. * Source/NSObjCRuntime.m: Don't use private concrete strings. * Source/NSObject.m: Don't cache string information. * Source/NSScanner.m: Modified to use new concrete strings. * Source/NSSerializer.m: Modified to use new concrete strings. * Source/NSString.m: Modified to use new concrete strings. Rewrote various methods to work in terms of the primitive string methods. Implemented encoding and decoding at this level so we don't encode concrete string classes in archives. * Source/externs.m: Modified to use new concrete strings. * Source/propList.h: Modified to use new concrete strings. * Source/GSString.m: New string classes, plus decoding for old ones. 2000-10-05 Richard Frith-Macdonald * Source/Makefile.preamble (ADDITIONAL_CPPFLAGS): Replace DEFS (lost in last change) to set default paths for NSBundle etc. * Source/NSString.m: Minor range fixes. * Source/NSGString.m: initialisation fixes. 2000-10-04 Adam Fedor * Source/Makefile.preamble (ADDITIONAL_CPPFLAGS): Add CONFIG_SYSTEM_DEFS. 2000-10-05 Fred Kiefer * Source/Unicode.m: Changed available encodings if HAVE_ICONV is defined. This is still a static definition. 2000-10-02 Adam Fedor * configure.in: Update required libxml version to 2.2.3 2000-09-30 Mirko Viviani * Source/NSDistantObject.m ([GSDistantObjectPlaceHolder +respondsToSelector:]): implemented. * Source/NSProcessInfo.m ([NSProcessInfo +load]): bug fix for FreeBSD. * configure.in: enable_fake_main not enabled by default for FreeBSD-elf 2000-09-30 Fred Kiefer * Headers/gnustep/base/Unicode.h: Merged in GetDefEncoding.h New function GetAvailableEncodings. * Source/Unicode.m: Merged in GetDefEncoding.m New function GetAvailableEncodings. Updated the encoding arrays. * Headers/gnustep/base/GetDefEncoding.h: * Source/GetDefEncoding.m: This are now obsolete and therfore removed. * Source/NSString.m: Use GetAvailableEncodings in [availableStringEncodings] 2000-09-30 Richard Frith-Macdonald * Source/NSString.m: ([-initWithUTFString:length:]), ([-initWithData:encoding]) create UTF strings as 8-bit strings if they actually only contain ascii characters. * Source/GSXML.m: Create strings from UTF8 data throughout. * Headers/gnustep/base/NSObject.h: (CREATE_AUTORELEASE_POOL) use +new to avoid a message despatch overhead (combine allocWithZone and init). 2000-09-29 Richard Frith-Macdonald * Source/GSCompatibility.m: Fix stupid error in last modification - missed part of method name. * Source/GNUmakefile: Fix to get headers installed in $(GNUSTEP_SYSTEM_ROOT)/Headers/Foundation again. * Source/Makefile.postamble: Add code to install headers in $(GNUSTEP_SYSTEM_ROOT)/Headers/gnustep/Foundation as well - is this really necessary? * Headers/Foundation/GSXML.h: Removed new methods used for HTML parser * Source/GSXML.m: Renamed internal methods for xml/html parser differentiation and declared in private interface. Tidied to conform to coding standards. Added casts to prevent compiler warnings. * Documentation/gsdoc/GSXML.gsdoc: added html parser info 2000-09-29 Manuel Guesdon -- You'll need libxml2 v >= 2.2.3 to compile GSXML -- * Headers/Foundation/GSXML.h: added GSHTMLParser and GSHTMLSAXHandler * Source/GSXML.m: added GSHTMLParser and GSHTMLSAXHandler use of _private member of parser context instead of user_data which is not a freely useable user_data in libxml 2000-09-27 Richard Frith-Macdonald * Source/GSCompatibility.m: Use OpenStep standard string initialisation. * Source/NSSerializer.m: Use OpenStep stanrd initializers. * Source/NSUnarchiver.m: ditto * Source/NSData.m: Simplify by removing memory management extensions. * Source/NSGCString.m: ditto * Source/NSGString.m: ditto * Source/NSObject.m: ditto * Source/NSString.m: ditto * Source/externs.m: Removed unused NXConstantString assignments. * Source/GSXML.m: ([-propertiesAsDictionary]) bugfix adding nil object to dictionary. ([-externalSubset:externalID:systemID:]) method added. Fixes suggested by mguesdon@oxymium.net 2000-09-26 Lyndon Tremblay * Headers/Foundation/NSObject.h (CREATE_AUTORELEASE_POOL): Saves 1 message call. (RECREATE_AUTORELEASE_POOL): Added to reuse existing variables. 2000-09-25 Richard Frith-Macdonald * Source/NSURLHandle.m: ([-addClient:]) ensure that clients are only recorded once. * Documentation/gsdoc/NSURLHandle.gsdoc: flesh out descriptions and add type and protocol information. 2000-09-24 Adam Fedor * configure.in: Check for rint in math library... 2000-09-22 Richard Frith-Macdonald * Headers/gnustep/base/NSData.h: Added URL methods. * Headers/gnustep/base/GSXML.h: Reorganized init methods in line with Manuels ideas but with naming consistent with other classes. * Source/NSData.m: Added URL methods. * Source/NSURL.m: First attempt (untested) at code to load data. tolerate URLs where the network part is missing and the '//' left out. * Source/GSXML.m: Reorganized init methods in line with Manuels ideas but with naming consistent with other classes. Correct methods for setting parser behavior for the object concerned rather than default behavior for all parsers. Support NSURL parsing. * Source/propList.h: Update for change in GSXMLParser API. * Documentation/gsdoc/GSXMLParser.gsdoc: update for new initialisation methods. * Source/NSArray.m: Put code in place to generate XML proplists * Source/NSDictionary.m: Put code in place to generate XML proplists * Source/GSCompatibility.m: Put code in place to generate XML proplists but disable it until working entity replacement is done. 2000-09-21 Adam Fedor * configure.in: Check for rint. * Source/GSCompatibility.m: Define rint if not available. * Source/NSData.m (readContentsOfFile): Remove incorrectly used variable (MINGW). * Source/NSFileManager.m (-removeFileAtPath:handler:): Use more direct check if path is a dir. (directoryContentsAtPath): Likewise. (isExecutableFileAtPath): On MINGW, Return YES if a directory. (fileSystemRepresentationWithPath:): On MINGW, fix up paths that might come from Unix-like shells, like Cygwin bash, so they can be used with Windows functions. * Source/NSRunLoop.m (-acceptInputForMode:beforeDate:): On MINGW, check for errno==0 and continue as if there was no error. * Source/NSString.m (fileSystemRepresentation): Use NSFileManager's implementation. (getFileSystemRepresentation:): Likewise. (isAbsolutePath): Check fileSystemRepresentation. * Source/NSTask.m: Use fileSystemRepresentation instead of cString. * Source/NSUser.m (NSHomeDirectoryForUser): On MINGW, return nil if no home found. * Source/NSUser.m (pathForUser): Use GNUSTEP_ROOT if no user home found. * Testing/nsconnection_client.m: Use impl of getopt for MINGW. * Testing/nsconnection_server.m: Likewise. * Testing/nsscanner.m: Likewise. * Testing/nstask.m: Launch an appropriate Windows task. * Testing/nsstring.m: Catch exception during inappropriate string replacement. 2000-09-21 Richard Frith-Macdonald * Headers/gnustep/base/NSURLHandle.h: tidy up. * Source/NSURLHandle.m: Implement class and add simple implementation of a concrete subclass for handling file URLs. 2000-09-20 Richard Frith-Macdonald * Headers/gnustep/base/GSXML.h: Added ([-parser:]) and removed redundant 'length' info from callbacks. * Source/GSXML.m: Added ([-parser:]), tidied ([-parser]), fixed scope of functions, and removed redundant 'length' info from callbacks. * Documenttion/gsdoc/GSXMLParser.gsdoc: document ([-parser:]) * Documentation/gsdoc/GSSAXHandler.gsdoc: update for removal of redundant 'length' info on some callbacks. * Source/externs.m: Initialise strings using NSGCString because the NSString class +initialize method may not have completed when this is done - so NSString won't have cached its cocrete and abstract classes. * Source/GSCompatibility.m: Partial write of code to generate MacOS-X compatible (XML) property-list text. * Tools/gsdoc.m: Major (3 hours) effort to get code back to something vaguely like conformance with coding standards! Hope nothing got broken. 2000-09-19 Richard Frith-Macdonald * Headers/gnustep/base/GSXML.h: * Source/GSXML.m: Revert to earlier version to remove formatting/coding-standards errors, broken GSSAXHandler class, and complexity adding api additions. Continued integration of Michael Pakhantsovs code. Added Manuels +xmlEncodingStringForStringEncoding with tidying. Added Manuels -typeDescription with rewrite for performance. * Documenttion/gsdoc/GSXMLParser.gsdoc: added xmlEncodingStringForStringEncoding * Documenttion/gsdoc/GSXMLNode.gsdoc: added -typeDescription * Documentation/gsdoc/GSSAXHandler.gsdoc: added -parser method. 2000-09-19 Manuel Guesdon You'll need libxml2 v >= 2.2.3 to compile GSXML * Source/GSXML.m & Headers/Foundation/GSXML.h: corrected bugs, added added non guessing construction methods in GSXMLParser added -typeDescription in GSXMLNode added +xmlEncodingStringForStringEncoding: in GSXMLParser added inParserContext:(void*)parserContext parameter for GSSAXHandler 2000-09-19 Richard Frith-Macdonald * Source/NSURLHandle.m: Implemented subclass registry. 2000-09-19 Fred Kiefer * Headers/gnustep/base/Unicode.h: New functions encode_ustrtostr_strict() and encode_unitochar_strict() * Source/NSString.m: Impelemented [initWithUTF8String:] * Source/NSGCString.m: * Source/NSGString.m: Implemented method [dataUsingEncoding:allowLossyConversion:] * Source/Unicode.m: New strict methods for string conversion. 2000-09-15 Adam Fedor * configure.in: Turn off enable_fake_main if on MinGW. * Source/WindowsFileHandle.m: New class. * Source/NSFileHandle.m: Use it on MinGW * Source/NSTask.m: Break into concrete subclasses for Unix and Windows. * Source/NSProcessInfo.m: on MinGW, don't try to redefine __argv, __argc, etc. * Source/libgnustep_base_entry.m: Renamed from win32-entry.m * Tools/gdnc.m: Don't fork on MinGW * Tools/gdomap.c: Define MINGW ifdef MINGW32. 2000-09-15 Richard Frith-Macdonald * Source/GSXML.m: made method names more consistent. * Headers/gnustep/base/GSXML.h: made method names more consistent. * Documentation/gsdoc/GNUmakefile: Added GSXML files * Documentation/gsdoc/base.gsdoc: Added link to GSXML * Documentation/gsdoc/GSXML.gsdoc: Overview of XML parsing. * Documentation/gsdoc/GSSAXHandler.gsdoc: event parsing handler class. * Documentation/gsdoc/GSXMLAttribute.gsdoc: xml attribute wrapper. * Documentation/gsdoc/GSXMLDocument.gsdoc: xml document wrapper. * Documentation/gsdoc/GSXMLNamespace.gsdoc: xml namespace wrapper. * Documentation/gsdoc/GSXMLNode.gsdoc: xml node wrapper. * Documentation/gsdoc/GSXMLParser.gsdoc: xml parser wrapper. 2000-09-15 Richard Frith-Macdonald * Source/UnixFileHandle.m: conform to GCFinalization protocol. 2000-09-14 Adam Fedor * configure.in: Check for windows.h 2000-09-14 Richard Frith-Macdonald * Headers/gnustep/base/NSLock.h: conform to GCFinalization protocol. * Source/NSLock.m: deallocate mutex in gcFinalize. Don't raise an exception if mutex deallocation fails. 2000-09-13 Adam Fedor * Remove dependance on Source/Foundation link, additional MINGW ports. * Makefile.postamble (header-links): Remove Source/Foundation link. * Source/Makefile.preamble (HEADER_DIR): New variable. (ADDITIONAL_INCLUDE_DIRS): Include ../Headers. * Source/GNUmakefile (GENERATED_HEADERS): Change Foundation to $(HEADER_DIR). * Source/Makefile.postamble: Likewise. * Source/GSTcpPost.m: Update to handle MINGW (mostly copied from gdomap.c). * Source/NSFileManager.m (-findNextFile): Check if lstat, geteuid implemented. * Source/NSHost.m: Change includes for MINGW. * Source/NSPortNameServer.m: Likewise. * Source/NSPipe.m (init): Port to MINGW. * configure.in: Do preface.h substitutions here. * Source/Makefile.postamble (preface.h): Remove target. 2000-09-12 Richard Frith-Macdonald * Source/GSCompatibility.m: new file for MacOSX compatibility flags * Source/GNUmakefile: add GSCompatibility.m * Source/NSGeometry.m: Use GSMacOSXCompatibleGeometry() function to decide whether to produce MacOS-X format strings. * Source/propList.h: Parse MacOS-X format property lists as well as OpenStep format ones. 2000-09-12 Adam Fedor * configure.in: Check for symlin, readlink. * Source/GNUmakefile: Don't compile UnixFileHandle.m on mingw. (Will create WindowsFileHandle later...). * Source/NSFileManager.m (-createDirectoryAtPath:attributes:]): Create subpaths on mingw. (isDeletableFileAtPath:): Implement for mingw. (createSymbolicLinkAtPath): Implement only if HAVE_SYMLINK (pathContentOfSymbolicLinkAtPath): Implement only if HAVE_READLINK 2000-09-13 Fred Kiefer * Headers/gnustep/base/Unicode.h: Make function encode_ustrtostr public * Headers/gnustep/base/NSString.h: Added extra encodings. Added missing methods * Source/NSString.m: Added basic implementation for missing methods [stringWithUTF8String:], [initWithUTF8String:], [UTF8String], [stringWithContentsOfURL:], [initWithContentsOfURL:], [writeToURL:atomically:], [localizedCaseInsensitiveCompare:], [localizedCompare:], [compare:options:range:locale:] * Source/NSGCString.m: [getCharacters:] and [getCharacters:range:] use higher level methods for conversion. * Source/Unicode.m: Added conversion with iconv, this needs HAVE_ICONV. Made normal conversions faster by unrolling the case switch. 2000-09-12 Richard Frith-Macdonald * Makefile.postamble (header-links): Restore functionality on unix lost in last change, also (for MINGW) copy header files to the Source/Foundation directory in addition to Headers/Foundation. * Source/NSConnection.m: Address problems reported by georg@ist.org ... ([-connectionWithRegisteredName:host:usingNameServer:]) avoid returning local server connection - create new connection to it if necessary. ([-rootProxy]) return root object if sent to server connection. Also added some more debug statements. * Source/NSDistantObject.m: ([-methodForSelector:]) implemented to (hopefully) fix problem in pasteboard stuff. 2000-09-11 Adam Fedor * Mingw fixes. * Makefile.postamble (header-links): if MINGW, copy header files to Foundation (Mingw's gcc can't handle links). * Source/mframe/configure.in: Check target, not host. * Source/NSDate.m (GSTimeNow): Fix typo. * Source/NSData.m (readContentsOfFile): Fix up vars for MINGW. (-writeToFile:atomically:): Likewise. 2000-09-11 Richard Frith-Macdonald * Headers/gnustep/base/GSXML.h: new classes for parsing XML * Source/GSXML.m: new classes for parsing XML * Source/Makefile.preamble: Define HAVE_LIBXML if appropriate. * Source/GNUMakefile: Build new classes if appropriate. * Tools/Makefile.preamble: Removed libxml stuff - now done globally. 2000-09-10 Richard Frith-Macdonald * Source/NSCalendarDate: ([-initWithString:calendarFormat:locale:]) modify parsing to be more tolerant of numeric fields that are smaller than the expected size, but warn about unexpected format. 2000-09-08 Richard Frith-Macdonald * Source/NSAttributedString.m: Make -description produce output in same format as MacOS-X * Source/NSDistributedNotificationCenter.m: update method return types for macOS-X complience. * Headers/gnustep/base/NSDistributedNotificationCenter.h: ditto. 2000-09-08 Richard Frith-Macdonald * Source/NSGString.m: Removed obsolete methods and added range checks. * Source/NSGCString.m: ditto. * Source/NSAttributedString.m: Fix fencepost error in -description. 2000-09-08 Richard Frith-Macdonald * Source/NSRunLoop.m: ([-_checkPerformers:]) When a loop executes the method to deal with a ([-performSelector:target:argument:order:modes]), we cancel the request rather than leaving it to be actioned again next time round the loop. 2000-09-07 Richard Frith-Macdonald * Source/NSGeometry.m: Add code to parse MacOS-X format strings. Also produce MacOS-X format strings if the GSMacOSXCompatibleGeometry or GSMacOSXCompatible default is YES (the former overrides the latter). * Source/NSException.m: ([-name]) and ([-reason]) modifide to ensure that a nil is never returned. 2000-09-01 Fred Kiefer * Headers/gnustep/base/NSString.h: Added new encodings from specification * Headers/gnustep/base/NSNumberFormatter.h: * Source/NSNumberFormatter.m: Added skeleton for this class *Source/GNUmakefile: Added NSNumberFormatter.[hm] 2000-08-27 Manuel Guesdon * Tools/gsdoc-0_6_6.dtd: added elements for gnustep-db doc generator * Tools/gsdoc.m: handle gnustep-db doc generator 2000-08-24 Manuel Guesdon * Tools/gsdoc-0_6_6.dtd: added prjref element which enable explicit links between projects * Tools/gsdoc.m: handle prjref remove extensions from files in gsdocrefs (one day we'll generate other formats :-) 2000-08-23 Fred Kiefer * Headers/gnustep/base/NSDecimal.h: Use signed char for exponent, as char may be unsigned on some machines * Source/NSDecimal.m: Corrected some bugs and added a basic implementation based on GMP (Still not complete) 2000-08-23 Adam Fedor * Source/NSDebug.m (NSFrameAddress): New function (NSReturnAddress): Likewise. (NSCountFrames): Likewise. (impementation from alex@orderfusion.com). 2000-08-16 Manuel Guesdon * Tools/gsdoc-0_6_6.dtd: added conform for category * Tools/gsdoc.m: correct bugs and added inter/intra-projects link generations * Tools/AutoDocTemplate.gsdoc: correct problems * Tools/indextemplate.gsdoc: correct problems 2000-08-16 Richard Frith-Macdonald * Source/NSDebug.m: Fix memory leak when adding new class to array of those being recorded - report by Frederic.De.Jaeger 2000-08-13 Manuel Guesdon * Tools/gsdoc.gsdoc: added examples on how to use AutoDoc and GSDoc. 2000-08-13 Manuel Guesdon * Tools/GNUmakefile: added DocTemplates * Tools/Makefile.postamble: added DocTemplates * Tools/indextemplate.gsdoc: New file. Use it as template for gsdoc index generation * Tools/AutoDocTemplate.gsdoc: New File: Use it as template for AutoDoc source-to-documentation generation. 2000-08-13 Manuel Guesdon * Tools/gsdoc-0_6_6.dtd: added ivariable, constant and stylesheet * Tools/gsdoc.m: added ivariable, constant and stylesheet support added index generation * Tools/gsdoc.gsdoc: added parameters documentation 2000-08-13 Richard Frith-Macdonald * Documentation/gsdoc/NSString.gsdoc: add documentation for replacing strings within the reciever. * Documentation/gsdoc/NSMutableString.gsdoc: ditto 2000-08-08 Richard Frith-Macdonald * Headers/gnustep/base/all.h: Moved to Old as obsolete file. * Headers/gnustep/base/Arch: dittoiver.m * Headers/gnustep/base/Archiver.h: ditto * Headers/gnustep/base/Array.h: ditto * Headers/gnustep/base/ArrayPrivate.h: ditto * Headers/gnustep/base/Bag.h: ditto * Headers/gnustep/base/BinaryCStream.h: ditto * Headers/gnustep/base/BinaryTree.h: ditto * Headers/gnustep/base/BinaryTreeNode.h: ditto * Headers/gnustep/base/CircularArray.h: ditto * Headers/gnustep/base/CircularArrayPrivate.h: ditto * Headers/gnustep/base/Coder.h: ditto * Headers/gnustep/base/CoderPrivate.h: ditto * Headers/gnustep/base/Coding.h: ditto * Headers/gnustep/base/Collecting.h: ditto * Headers/gnustep/base/Collection.h: ditto * Headers/gnustep/base/CollectionPrivate.h: ditto * Headers/gnustep/base/CStream.h: ditto * Headers/gnustep/base/CStreaming.h: ditto * Headers/gnustep/base/DelegatePool.h: ditto * Headers/gnustep/base/Dictionary.h: ditto * Headers/gnustep/base/Enumerating.h: ditto * Headers/gnustep/base/GapArray.h: ditto * Headers/gnustep/base/GapArrayPrivate.h: ditto * Headers/gnustep/base/Heap.h: ditto * Headers/gnustep/base/IndexedCollecting.h: ditto * Headers/gnustep/base/IndexedCollection.h: ditto * Headers/gnustep/base/IndexedCollectionPrivate.h: ditto * Headers/gnustep/base/InvalidationListening.h: ditto * Headers/gnustep/base/Invocation.h: ditto * Headers/gnustep/base/Invoking.h: ditto * Headers/gnustep/base/KeyedCollecting.h: ditto * Headers/gnustep/base/KeyedCollection.h: ditto * Headers/gnustep/base/LinkedList.h: ditto * Headers/gnustep/base/LinkedListNode.h: ditto * Headers/gnustep/base/Locking.h: ditto * Headers/gnustep/base/Mach: dittoPort.m * Headers/gnustep/base/MachPort.h: ditto * Headers/gnustep/base/Magnitude.h: ditto * Headers/gnustep/base/MappedCollector.h: ditto * Headers/gnustep/base/MemoryStream.h: ditto * Headers/gnustep/base/NotificationDispatch: dittoer.m * Headers/gnustep/base/NotificationDispatcher.h: ditto * Headers/gnustep/base/OldNSConnection.h: ditto * Headers/gnustep/base/OldNSPortCoder.h: ditto * Headers/gnustep/base/OrderedCollecting.h: ditto * Headers/gnustep/base/OrderedCollection.h: ditto * Headers/gnustep/base/Ordering.h: ditto * Headers/gnustep/base/Port.h: ditto * Headers/gnustep/base/Queue.h: ditto * Headers/gnustep/base/RandomGenerating.h: ditto * Headers/gnustep/base/Random.h: ditto * Headers/gnustep/base/RawCStream.h: ditto * Headers/gnustep/base/RBTree.h: ditto * Headers/gnustep/base/RBTreeNode.h: ditto * Headers/gnustep/base/Retaining.h: ditto * Headers/gnustep/base/RNGAdditiveCongruential.h: ditto * Headers/gnustep/base/RNGBerkeley.h: ditto * Headers/gnustep/base/RunLoop.h: ditto * Headers/gnustep/base/Set.h: ditto * Headers/gnustep/base/SplayTree.h: ditto * Headers/gnustep/base/Stack.h: ditto * Headers/gnustep/base/StdioStream.h: ditto * Headers/gnustep/base/Stream.h: ditto * Headers/gnustep/base/Streaming.h: ditto * Headers/gnustep/base/TcpPort.h: ditto * Headers/gnustep/base/TextCStream.h: ditto * Headers/gnustep/base/Time.h: ditto * Headers/gnustep/base/UdpPort.h: ditto * Headers/gnustep/base/ValueHolding.h: ditto * Source/Array.m: ditto * Source/Bag.m: ditto * Source/BinaryCStream.m: ditto * Source/BinaryTree.m: ditto * Source/BinaryTreeNode.m: ditto * Source/CircularArray.m: ditto * Source/Coder.m: ditto * Source/Collection.m: ditto * Source/CStream.m: ditto * Source/Decoder.m: ditto * Source/DelegatePool.m: ditto * Source/Dictionary.m: ditto * Source/Encoder.m: ditto * Source/GapArray.m: ditto * Source/Heap.m: ditto * Source/IndexedCollection.m: ditto * Source/Invocation.m: ditto * Source/KeyedCollection.m: ditto * Source/LinkedList.m: ditto * Source/LinkedListNode.m: ditto * Source/Magnitude.m: ditto * Source/MappedCollector.m: ditto * Source/MemoryStream.m: ditto * Source/OldNSConnection.m: ditto * Source/OldNSPortCoder.m: ditto * Source/OrderedCollection.m: ditto * Source/Port.m: ditto * Source/Queue.m: ditto * Source/Random.m: ditto * Source/RawCStream.m: ditto * Source/RBTree.m: ditto * Source/RBTreeNode.m: ditto * Source/RNGAdditiveCongruential.m: ditto * Source/RNGBerkeley.m: ditto * Source/Set.m: ditto * Source/SplayTree.m: ditto * Source/Stack.m: ditto * Source/StdioStream.m: ditto * Source/Stream.m: ditto * Source/TcpPort.m: ditto * Source/TextCStream.m: ditto * Source/UdpPort.m: ditto * Testing/cstream.m: ditto * Testing/invocation_char.m: ditto * Testing/invocation_int.m: ditto * Testing/invocation_long.m: ditto * Testing/invocation.m: ditto * Testing/invocation_short.m: ditto * Testing/ostream.h: ditto * Testing/ostream.m: ditto * Testing/pipes.m: ditto 2000-08-07 Adam Fedor * Merge 0.6.6 branch into main. 2000-07-24 Richard Frith-Macdonald * Tools/gdomap.c: Permit dumping of internal table of known peer nameservers when sent SIGUSR1 2000-07-20 Richard Frith-Macdonald * Tools/gdomap.c: Bugfix for GDO_NAMES (patch provided by Bjoern) 2000-07-18 Richard Frith-Macdonald * Tools/gdomap.h: Add new GDO_NAMES command. * Tools/gdomap.c: Incorporate MINGW port by Bjoern.Giesler@gmx.de after modifications to conform to coding standards. Add GDO_NAMES support to list all registered names. 2000-07-16 Fred Kiefer * Headers/gnustep/base/NSDecimal.h: * Headers/gnustep/base/NSDecimalNumber.h: Included missing functions and changed type definition. * Source/NSDecimal.m: Basic implementation of NSDecimal. An implementation using GMP will follow. * Source/NSDecimalNumber.m: Use the NSDecimal functions for this class * Source/GNUMakefile: Add NSDecimal and NSDecimalNumber 2000-08-06 Adam Fedor * Version 0.6.6 released. * Source/NSTimer.m (-compare:): Add return to quiet warning. 2000-08-04 Richard Frith-Macdonald * Source/NSPortNameServer.m: include netinet/in.h as needed on FreeBSD to define values used in arpa/inet.h 2000-08-03 Richard Frith-Macdonald * Source/NSHost: ([_initWithHostEntry:key:]) workaround for buggy host entries with missing h_aliases 2000-08-03 Richard Frith-Macdonald * NSTimeZones/NSTimeZones.tar: Updated to latest (July 31st) info 2000-08-02 Adam Fedor * Version: Update version number * Documentation/announce.tmpl.texi: Update * Documentation/readme.tmpl.texi: Likewise. * Documentation/news.tmpl.texi: Likewise. * Documentation/todo.tmpl.texi: Likewise. * ANNOUNCE, BUGS, NEWS, README: Regenerate 2000-08-02 Adam Fedor * Testing/nsconnection_client.m: Rewrite, organize. * Testing/nsconnection_server.m: Likewise. 2000-08-02 Richard Frith-Macdonald * Source/GSTcpPort.m: ([-removeHandle:]) corrected logic for releasing self when port was created and retained by an incoming connection. 2000-08-01 Adam Fedor * Source/NSConcreteNumber.m (-compare:): Add return at end to quiet compiler warning. * Source/NSFileHandle.m: Change +fileHandle... methods to use abstracts class's allocWithZone. * Source/libgnustep-base.def: Update for new/removed classes. 2000-08-01 Richard Frith-Macdonald * Source/NSCalendarDate.m: Correct order of args to lastDayOfGregorianMonth() * Source/NSPortCoder.m: Handle classes encoded as objects specially. * Source/NSArchiver.m: ditto. * Source/NNSUnarchiver.m: ditto. 2000-07-31 Richard Frith-Macdonald * Source/Foundation/NSDebug.h: removed GS_IMPORT * Source/Foundation/NSObjCRuntime.h: ditto * Source/Foundation/GSConfig.h.in: ditto 2000-07-31 Richard Frith-Macdonald * Source/NSString.m: implement -cStringLength correctly in terms of other methods of the abstract class, rather than making the subclass do it. Cache [-characterAtIndex:] implementation for speed throughout. * Source/Unicode.m: Remove uslen() function - unused and unsafe. Tidied code and optimised a little. * Source/Foundation/Unicode.h: Remove uslen() * Source/NSNumber.m: Check for nul argument to [-compare:] * Source/NSDate.m: ditto * Source/NSObject.m: ditto * Source/NSConcreteNumber.m: ditto * Source/NSTimer.m: ditto 2000-07-30 Richard Frith-Macdonald * Tools/nconnection.m: Trivial test of basic inter-thread use of DO taken from example code in Applde documentation. 2000-07-29 Richard Frith-Macdonald Varous cluster classes - Bugfix to let allocWithZone work for new concrete subclasses in the cluster. * Source/NSPortCoder.m: Accept classes when asked to decode object. * Source/NSUnarchiver.m: ditto. 2000-07-28 Richard Frith-Macdonald * Source/NSConnection.m: Don't create/use locks until the app goes multi-threaded. * Source/GSTcpPort.m: ditto. 2000-07-27 Richard Frith-Macdonald * Source/GSTcpPort.m: Fix stupid error in last bugfix * Source/Foundation/GSConfig.h.in: define GS_SIZEOF_VOIDP * configure.in: provide GS_SIZEOF_VOIDP 2000-07-27 Richard Frith-Macdonald * Source/NSThread.m: clarify code for getting current thread. 2000-07-27 Richard Frith-Macdonald * Source/Foundation/NSDebug.h: Bugfix reported by Frederic.De.Jaeger to prevent incorrect processor handling of cases where logging format string has no arguments. 2000-07-26 Richard Frith-Macdonald * Source/GSTcpPort.m: When given bad data on a socket, log a message and invalidate the socket handle rather than raising an exception and crashing. Should make system more robust in the face of attacks. 2000-07-24 Adam Fedor * Source/GSTcpPort.m (-sendBeforeDate:msgid:components:from:reserved:]): Correct typo. 2000-07-24 Richard Frith-Macdonald Testing directory tidied to reflect removal of old classes. * Source/NSTimer.m: Tidied a little. 2000-07-23 Richard Frith-Macdonald Old DO code removed along with associated libObjects classes that it required - library slimmed down. 2000-07-21 Richard Frith-Macdonald * Source/NSGCString.m: implement methods to get numeric values. * Source/NSGString.m: implement methods to get numeric values. 2000-07-19 Adam Fedor * Documentation/news.tmpl.texi: Update. * Documentation/todo.tmpl.texi: Update. 2000-07-18 Richard Frith-Macdonald * Tools/Makefile.postamble: Improve warning messages for gdomap install * Source/NSProcessInfo.m: Change __MINGW32__ to __MINGW__ * Source/GSTcpPort.m: improve encoding of local port for send over wire 2000-07-17 Adam Fedor * Source/NSZone.m: Remove duplicate function definitions (when GS_WITH_GC is 1) already defined in NSZone.h. 2000-07-17 Richard Frith-Macdonald * Source/externs.m: Some evil casts to avoid compiler warnings about assigning to constant variables when we initiallise them. * Source/NSGSet.m: implemented [-anyObject] and [-allObjects] * Source/NSSet.m: Fix to encode subclasses as abstract class. Remove unused methods for set/get concrete class * Source/NSCountedSet.m: ditto * Source/NSNumber.m: Use explicitly signed types for portability - particularly for systems (eg PPC) where char is not signed by default. * Source/NSConcrete.m: ditto. * Source/NSConcreteNumber.m: ditto. * Source/Foundation/NSValue.h: ditto * Source/Foundation/NSConcreteNumber.h: ditto * Source/NSArray.m: Remove unused methods for set/get concrete class * Source/NSDictionary.m: ditto. * Source/NSString.m: ditto. * Source/NSAttributedString.m: ditto. * Source/NSHost.m: store names and addresses in sets for improved performance (comparisons). Encode host as an address other than loopback if possible. Add code for a new '+localHost' method to try to get ALL names/addresses of current host. * Source/NSPortNameServer.m: Use new localHost method. * Source/GSTcpPort.m: Use new localHost method. 2000-07-16 Adam Fedor * Tools/GNUmakefile (gdomap): Make as a C-tool rather than an Objective-C program (no need for libobjc). 2000-07-07 Jonathan Gapen * Source/NSString.m: (-initWithFormat:), (-initWithFormat:locale:), (-initWithFormat:arguments:) now implemented by calling (-initWithFormat:locale:arguments:) * Source/externs.m: Add strings defined in MacOS X documentation, and useful strings from OPENSTEP 4.2. 2000-07-07 Richard Frith-Macdonald * Source/GSTcpPort.m: set size for return buffer of getsockbyname() 2000-07-07 Richard Frith-Macdonald * Source/NSRunLoop.m: Minor optimisation in select(), also update servicing oorder of inputs to provide fairer allocation of processing. 2000-07-06 Richard Frith-Macdonald * Source/NSConnection.m: Some thread safety improvements. 2000-07-06 Richard Frith-Macdonald * Source/GSTcpPort.m: Add code to cope with machines requiring word alignment for memory references. 2000-07-05 Richard Frith-Macdonald * Tools/Makefile.postabmle: Create directory for DTDs if needed 2000-07-05 Richard Frith-Macdonald * Source/GSTcpHandle.m: fix error resetting size of data to be read - could cause occasional crashes! 2000-07-05 Richard Frith-Macdonald * Source/NSConnection.m: Update to use GSIMap rather than NSMap in order to regain performance lost by adding code to ensure that reply packets cannot be leaked. Fixed error in old connection code - due to a typing error a line had got deleted that was removing the connection from the global table on deallocation. * Source/NSPortNameServer.m: Fix to avoid errors when given bad nameserver IP address info. 2000-07-04 Richard Frith-Macdonald * Makefile.preamble: define GS_NEW_DO to specify whether the new or the old DO code is to be used. Change the define and rebuild the library if you need the old DO code. Advantages of new code - MacOS-X compatibly Should work between different processor architectures and word sizes Might work for inter-thread communication Approx 25% faster Permit packet authentication/encryption Disadvantages - not well tested - development version removed many old methods. * Headers/gnustep/base/GSConnection.h: removed - merged into NSConnection.h * Headers/gnustep/base/GSPortCoder.h: removed - merged into NSPortCoder.h * Source/GSConnection.m: removed - merged into NSConnection.m * Source/GSPortCoder.m: removed - merged into NSPortCoder.m * Source/NSPortNameServer.m: Use GS_NEW_DO define to determine default port class * Documentation/gsdoc/NSConnection.gsdoc: Added descriptions of all the methods in the new implementation. The class is perilously close to being fully documented! * Documentation/gsdoc/...: updated all files to use new dtd. 2000-07-04 Richard Frith-Macdonald * Source/GSConnection.m: Improved coder caching and added code for multiple thread support. * Source/GSPortCoder.m: Improved performance of class version lookup and tidied. * Source/GSTcpPort.m: Ensure we don't remain in the run loop any longer than necessary. * Source/NSArchiver.m: minor tidyup * Source/NSDistantObject.m: minor performance tweak * Source/NSUnarchiver.m: minor tidyup. * Source/NSPortNameServer.m: Update for MacOS-X 2000-07-03 Richard Frith-Macdonald * Source/GSConnection.m: Cache coders fro performance. * Source/GSPortCoder.m: support re-use. * Source/GSTcpPort.m: tidy locking. * Source/NSData.m: optimize +new * Source/NSGCString.m: optimize -hash * Source/NSGDictionary.m: optimize string hashing * SourceNSObject.m: Call GSBuildStrings() for global constants. * Source/NSPort.m: Create GSTcpPort by default. * Source/externs.m: GSBuildStrings() now used to make string constants that support cached hash values * Testing/client.m: Added simple benchmarking. * Testing/server.m: Added method for simple benchmarking. * Testing/server.h: Added method for simple benchmarking. * Tools/gdnc.m: String OPENSTEP use of DO 2000-07-02 Richard Frith-Macdonald * Source/GSConnection.m: Implementation almost complete * Source/GSPortCoder.m: Completed * Source/GSTcpPort.m: tidied for MacOS-X compatibility * Source/NSArchiver.m: Bugfix encoding structures containing arrays * Source/NSData.m: minor tidy * Source/NSDistantObject.m: update for new implementation * Source/NSInvocation.m: bugfix decoding * Source/NSPort.m: update for MacOS-X complience * Source/NSPortNameServer.m: tidied * Testing/client.m: Update * Testing/server.m: update 2000-06-30 Adam Fedor libgstep-base now compiles (and links) into a DLL on Cygwin. * configure.in: Typo in checking for cygwin. * Headers/gnustep/base/NSHashTable.h: GS_EXPORT functions. * Headers/gnustep/base/NSMapTable.h: Likewise. * Source/Makefile.postamble (libgnustep-base.def) Target to generate def file. * Source/libgnustep-base.def: Updated. * Source/NSProcessInfo.m: Error message if GS_PASS_ARGUMENTS. Don't define main if GS_PASS_ARGUMENTS. 2000-06-30 Richard Frith-Macdonald * Headers/gnustep/base/NSDate.h: Added GSTime() function * Source/NSDate.m: More efficient MINGW date creation * Source/NSCalendarDate.m: optimised date creation from yymmddhhmmss * Source/NSData.m: MINGW file read and write operations added (untested) * Source/NSFileManager.m: MINGW file operations updated. 2000-06-30 Richard Frith-Macdonald Coding/decoding modifications to make system more in line with OPENSTEP/MacOS-X. Tidyup of global string constants. Advanced development of DO rewrite. * Headers/gnustep/base/DistributedObjects.h: removed obsolete info * Headers/gnustep/base/GSConnection.h: improved and tidied * Headers/gnustep/base/GSPortCoder.h: private method for connection * Headers/gnustep/base/NSArchiver.h: remove libobjects compatibility * Headers/gnustep/base/NSCoder.h: added libobjects compatibility * Headers/gnustep/base/NSException.h: tidied * Headers/gnustep/base/NSPortMessage.h: private method for connections * Headers/gnustep/base/NSRunLoop.h: tidied string constants. * Headers/gnustep/unicode/decomp.h: tidied to avoid compiler warning. * Source/GSConnection.m: largely implemented (untested) * Source/GSPortCoder.m: more efficient data coding * Source/NSArchiver.m: moved global constants to externs.m * Source/NSAttributedString.m: don't call super coding methods. * Source/NSCoder.m: add libobjects compatibility * Source/NSConnection.m: tidied a few bugs * Source/NSDistantObject.m: don't call super coding methods. * Source/NSGAttributedString.m: don't call super coding methods. * Source/NSHost.m: don't call super coding methods. * Source/NSNotification.m: don't call super coding methods. * Source/NSObject.m: tidied a little * Source/NSPort.m: moved global constants to externs.m * Source/NSPortMessage.m: new access method for connections. * Source/NSRunLoop.m: moved global constants to externs.m * Source/NSTimeZone.m: don't call super coding methods. * Source/NSURL.m: don't call super coding methods. * Source/NSUnarchiver.m: tidied. * Source/externs.m: Tdied and added new global constants. 2000-06-28 Adam Fedor Extension to force process args to be forwarded by the user. * configure.in (enable-pass-arguments): New switch that forces user to call NSProcessInfo initialization with process arguments. * Headers/gnustep/base/GSConfig.h.in (GS_PASS_ARGUMENTS): New define. * Source/NSProcessInfo.m (+initializeWithArguments:count:environment:): New method. * Tools/defaults.m (main): Update to call method if GS_PASS_ARGUMENTS. * Tools/gdnc.m: Likewise. * Tools/gsdoc.m: Likewise. * Tools/pldes.m: Likewise. * Tools/plmerge.m: Likewise. * Tools/plparse.m: Likewise. * Tools/plser.m: Likewise. * Tools/sfparse.m: Likewise. * Source/behavior.m: Define __objc_uninstalled_dtable if not available from runtime. 2000-06-28 Richard Frith-Macdonald Various minor tidyups for distributed objects - and included development code for NSConnection rewrite. * Headers/gnustep/base/DistributedObjects.h: removed obsolete methods * Headers/gnustep/base/GSConnection.h: temporary (development) class * Headers/gnustep/base/GSPortCoder.h: private method for GSConnection * Headers/gnustep/base/NSConnection.h: tidied * Source/GSConnection.m: temporary (development) class * Source/GSPortCoder.m: private method for GSConnection * Source/NSConnection.m: tidied a little - retain/release fixes * Source/NSDistantObject.m: tidied a little - use OPENSTEP method for creating new connection. * Source/NSPortCoder.m: tidied to work without GNU specific code. 2000-06-27 Adam Fedor * Fixes on solaris/gcc 2.8.0 * configure.in: Check for whoami location. * Source/Makefile.postamble: Use it. * Tools/Makefile.postamble: Use it. * Tools/gsdoc.m: Make sure exit status is 0 when no libxml * Makefile.postamble: Don't make documentation on install. Can't guarentee that library path is setup correctly yet. * Source/NSData.m: Correct sense of NEEDS_WORD_ALIGN test. 2000-06-27 Richard Frith-Macdonald * Source/NSPort.m: Add default support for coding using the encodePortObject and decodePortObject methods. * Source/NSData.m: Use encodeDataObject and decodeDataObject 2000-06-26 Adam Fedor * Source/NSTimer.m (-invalidate): Remove assertion. 2000-06-26 Richard Frith-Macdonald * Source/GSPortCoder.m: Rewrite of NSPortCoder - under development. * Headers/gnustep/base/GSPortCoder.h: ditto * Source/GNUmakefile: Build GSPortCoder 2000-06-26 Richard Frith-Macdonald * Source/NSCoder.m: Use AUTORELEASE and tidy up. * Source/NSArchiver.m: Fix bug in ([-replaceObject:withObject:]) * Source/NSObject.m: Optimise default replacementObjectForPortCoder 2000-06-23 Richard Frith-Macdonald * Source/NSFileHandle.m: Use AUTORELEASE and tidy up. 2000-06-21 Adam Fedor * Shared library (DLL) fixes on Windows * configure.in: Check for alternate objc (DLL) libraries. Look for objc_get_uninstalled_dtable. * Source/behavior.m (behavior_class_add_methods): Don't look for uninstalled_dtable if no objc_get_uninstalled_dtable. (check_class_methods): Remove unused. * Source/objc-load.m: Likewise. * Headers/gnustep/base/NSObjCRuntime.h: Define GS_EXPORT * Headers/gnustep/base/NSZone.h: Define functions either static or extern depending on whether NSZone.m is being compiled. * Source/NSZone.m: Remove duplicate functions. * Source/Makefile.preamble (LIBRARIES_DEPEND_UPON): Add -lobjc if on windows. * Source/UdpPort.m: Use NSMutableArray. 2000-06-19 Adam Fedor * Source/NSBundle.m (_bundle_name_first_match): Work even when filename has a directory component. (patch from Julian van Greunen ). 2000-06-21 Richard Frith-Macdonald * Source/NSScanner.m: ([-scanHexInt:]) fixed to permit leading 0x or 0X * Documentation/gsdoc/NSScanner.gsdoc: fleshed out * Tools/Makefile.postamble: Added documentation target - build before install * Tools/gsdoc-0_6_6.dtd: New dtd under development - add java support, permit multiple indices at end of document, permit
element. * Tools/gsdoc.m: Update to work with current dtd * Tools/gsdoc.gsdoc: Add a little more text on document body structure. 2000-06-20 Richard Frith-Macdonald * configure.in: Added check for recent libxml * config.mak.in: Added defeine for HAVE_LIBXML * Tools/gsdoc.m: Added from GSDoc and modified for standard libxml 2.0 installation * Tools/gsdoc-0_6_5.dtd: Added from GSDoc * Tools/gsdoc.gsdoc: Added from GSDoc * Tools/gnustep.gsdoc: Added from GSDoc * GSDoc: all removed * Examples: removed obsolete code. 2000-06-19 Richard Frith-Macdonald * Source/NSDate.m: Remove obsolete classForConnectedCoder method * Source/NSPort.m: ditto * Source/NSTcpPort.m: ditto * Source/NSUdpPort.m: ditto * Source/GNUmakefile: remove ConnectedCoder * Source/ConnectedCoder.m: removed * Headers/gnustep/base/ConnectedCoder.h: removed 2000-06-16 Richard Frith-Macdonald Removal of non-OpenStep unused classes. * Headers/gnustep/base/Archiver.h: removed * Headers/gnustep/base/Array.h: removed * Headers/gnustep/base/ArrayPrivate.h: removed * Headers/gnustep/base/Bag.h: removed * Headers/gnustep/base/BinaryTree.h: removed * Headers/gnustep/base/BinaryTreeNode.h: removed * Headers/gnustep/base/CircularArray.h: removed * Headers/gnustep/base/CircularArrayPrivate.h: removed * Headers/gnustep/base/Collecting.h: removed * Headers/gnustep/base/Collection.h: removed * Headers/gnustep/base/CollectionPrivate.h: removed * Headers/gnustep/base/DelegatePool.h: removed * Headers/gnustep/base/Dictionary.h: removed * Headers/gnustep/base/GapArray.h: removed * Headers/gnustep/base/GapArrayPrivate.h: removed * Headers/gnustep/base/Heap.h: removed * Headers/gnustep/base/IndexedCollecting.h: removed * Headers/gnustep/base/IndexedCollection.h: removed * Headers/gnustep/base/IndexedCollectionPrivate.h: removed * Headers/gnustep/base/InvalidationListening.h: removed * Headers/gnustep/base/Invocation.h: removed * Headers/gnustep/base/Invoking.h: removed * Headers/gnustep/base/KeyedCollecting.h: removed * Headers/gnustep/base/KeyedCollection.h: removed * Headers/gnustep/base/LinkedList.h: removed * Headers/gnustep/base/LinkedListNode.h: removed * Headers/gnustep/base/Magnitude.h: removed * Headers/gnustep/base/MappedCollector.h: removed * Headers/gnustep/base/NotificationDispatcher.h: removed * Headers/gnustep/base/OrderedCollecting.h: removed * Headers/gnustep/base/OrderedCollection.h: removed * Headers/gnustep/base/Queue.h: removed * Headers/gnustep/base/RBTree.h: removed * Headers/gnustep/base/RBTreeNode.h: removed * Headers/gnustep/base/RNGAdditiveCongruential.h: removed * Headers/gnustep/base/RNGBerkeley.h: removed * Headers/gnustep/base/Random.h: removed * Headers/gnustep/base/RandomGenerating.h: removed * Headers/gnustep/base/RunLoop.h: removed * Headers/gnustep/base/Set.h: removed * Headers/gnustep/base/SplayTree.h: removed * Headers/gnustep/base/Stack.h: removed * Headers/gnustep/base/Time.h: removed * Headers/gnustep/base/all.h: removed * Source/Archiver.m: removed * Source/Array.m: removed * Source/Bag.m: removed * Source/BinaryTree.m: removed * Source/BinaryTreeNode.m: removed * Source/CircularArray.m: removed * Source/Collection.m: removed * Source/DelegatePool.m: removed * Source/Dictionary.m: removed * Source/GapArray.m: removed * Source/Heap.m: removed * Source/IndexedCollection.m: removed * Source/Invocation.m: removed * Source/KeyedCollection.m: removed * Source/LinkedList.m: removed * Source/LinkedListNode.m: removed * Source/Magnitude.m: removed * Source/MappedCollector.m: removed * Source/NotificationDispatcher.m: removed * Source/OrderedCollection.m: removed * Source/Queue.m: removed * Source/RBTree.m: removed * Source/RBTreeNode.m: removed * Source/RNGAdditiveCongruential.m: removed * Source/RNGBerkeley.m: removed * Source/Random.m: removed * Source/Set.m: removed * Source/SplayTree.m: removed * Source/Stack.m: removed * Source/GNUmakefile: remove referenced to reomved classes 2000-06-16 Richard Frith-Macdonald * Headers/gnustep/base/NSGArchiver.h: removed obsolete file. * Source/NSGArchiver.m: removed obsolete file. * configure.in: Check for existence of NSArray.m to find source * Headers/gnustep/base/NSDictionary.h: Remove unused headers. * Headers/gnustep/base/Port.h: ditto * Headers/gnustep/base/NSConnection.h: ditto * Headers/gnustep/base/TcpPort.h: ditto * Headers/gnustep/base/NSGArray.h: ditto * Headers/gnustep/base/NSSet.h: ditto * Headers/gnustep/base/NSGSet.h: ditto * Headers/gnustep/base/NSRange.h: ditto * Source/Coder.m: Removed dependencies on some old classes * Source/Decoder.m: ditto * Source/Port.m: ditto * Source/TcpPort.m: ditto * Source/UdpPort.m: ditto * Source/NSGCString.m: ditto * Source/NSGString.m: ditto * Source/NSObject.m: ditto * Source/NSString.m: ditto 2000-06-15 Adam Fedor * Headers/gnustep/base/NSObject.h: Add base/preface include 2000-06-13 Adam Fedor * configure.in: Look for getopt.h * Source/NSBundle.m (+_absolutePathOfExecutable:): Add '.' if not already in path. * Source/NSPage.m: Use malloc if no valloc. * Testing/GNUmakefile: Remove non-OpenStep tests. * Tools/gdomap.c: Change WIN32 to MINGW. Check if IFF_POINTOPOINT is defined. * Headers/gnustep/base/*h: Remove preface include from headers. Change extern function and var definitions to GS_EXPORT for better handling of DLLs * Headers/gnustep/base/NSObjCRuntime.h: Set definition of GS_EXPORT based on using or compiling DLL 2000-06-11 Adam Fedor * Headers/gnustep/base/preface.h.in: Define MINGW if MINW32. * Headers/gnustep/base/TcpPort.h: Change WIN32 to MINGW since CYGWIN has unix-like services. * Headers/gnustep/base/UdpPort.h: Likewise. * Source/GSTcpPort.m, Source/NSData.m, Source/NSDate.m, Source/NSFileManager.m, Source/NSHost.m, Source/NSLog.m, Source/NSPage.m, Source/NSProcessInfo.m, Source/NSString.m, Source/NSThread.m, Source/NSUser.m, Source/UdpPort.m, Source/UnixFileHandle.m, : Likewise. * Source/Makefile.postamble: touch generated h files so they aren'y re-copied every compile. * Source/NSBundle.m (_absolutePathOfExecutable:): New method. (mainBundle): Use it. * Source/NSTask.m (launch): Likewise. * Source/find_exec.m: Removed. 2000-06-09 Richard Frith-Macdonald * Source/GSeq.h: Reverted bogus change. 2000-06-06 Adam Fedor * Code cleanup to help with Windows port. * configure.in: Check for some extra headers. Remove obsolete stuff. * Source/BinaryCStream.m: Fix includes for WIN32 * Source/NSCalandarDate.m: Likewise. * Source/NSDate.m: Likewise. * Source/NSLog.m: Likewise. * Source/NSPipe.m: Likewise. * Source/NSProcessInfo.m: Likewise. * Source/NSRunLoop.m: Likewise. * Source/NSUserDefaults.m: Likewise. * Source/StdioStream.m: Likewise. * Source/UdpPort.m: Likewise. * Tools/gdomap.c: Likewise. * Source/NSBinaryCStream: Use NSByteOrder functions. * Source/UdpPort.m: Likewise. * Source/Invocation.m (initWithTarget:selector:): Use proper cast. * Source/NSFileManager.m (-isExecutableFileAtPath): Typo. * Source/NSPage.m (getpagesize): New function for WIN32 * Source/NSString.m (-indexOfString): New method. * Source/NSBundle.m (bundle_directory_readable, bundle_file_readable, _bundle_name_first_match): New functions use NSFileManager instead of unix dir functions. (-initWithPath:) Use them. (-pathForResource:...): Likewise. (-pathsForResource:...): Likewise. 2000-06-02 Richard Frith-Macdonald * Headers/gnustep/base/NSConnection.h: Changed reply_depth ivar to be called request_depth instead. * Source/NSConnection.m: Changed reply_depth ivar to request_depth and modified code to make independent conversation queueing effective on the basis of incoming requests being handled rather than outgoing replies. This should make it work for oneway methods. Tue May 30 19:54:25 2000 Nicola Pero * Source/NSProcessInfo.m ([NSProcessInfo +load]): If environ == NULL, abort with an informative message rather than crashing without explanations. 2000-05-27 Richard Frith-Macdonald * Source/NSBundle.m: Protect all use of map tables of bundles using lock - should make class thread-safe. 2000-05-25 Adam Fedor * Headers/gnustep/base/GSIArray.h: remove config.h * Headers/gnustep/base/GSIMap.h: Likewise. 2000-05-24 Richard Frith-Macdonald * Source/NSFileManager.m: ([-directoryContentsAtPath:]) Don't follow symbolic links 2000-05-23 Adam Fedor * Source/NSBundle.m (+initialize): Check if /proc/self/exe returns a real link, otherwise get path from NSProcessInfo. * NSData: Correct #ifdef NEEDS_WORD_ALIGN to #if 2000-05-22 Richard Frith-Macdonald * Source/GSeq.h: comparison with zero length range is always NSOrderdSame 2000-05-21 Richard Frith-Macdonald * Source/NSDistantObject.m: ([-methodSignatureForSelector:]) Re-fix attempting to handle creation of local method signature rather than returning a proxy to a remote one. Dumb error in first attempt. 2000-05-10 Adam Fedor * NSBundle.m (-classNamed:): Hacks for getting classes from _gnustep_bundle. (-principalClass): Likewise. (-load): Don't try to call load bundle if we are _gnustep_bundle. 2000-05-09 Richard Frith-Macdonald * Source/NSDistantObject.m: ([-methodSignatureForSelector:]) Fix attempting to handle creation of local method signature rather than returning a proxy to a remote one. 2000-05-07 Richard Frith-Macdonald * Source/NSCalendarDate.m: ([-descriptionWithCalendarFormat:locale:]) fix '%y' format for any year - bug reported by David Relson 2000-05-06 James Dessart * Documentation/gsdoc/NSString.gsdoc : * Documentation/gsdoc/NSString.html : Added some basic doc 2000-05-04 Richard Frith-Macdonald * Source/NSUser.m: NSHomeDirectoryForUser() protect with locks for thread safety. 2000-05-02 Adam Fedor * configure.in: Add check for word alignment. Also don't define HAVE_SYS_PROC_EXE on systems that need fake main. * Headers/gnustep/base/config.h.in: Add define if word-align needed. * Source/NSData.m: ([NSDataStatic -deserializeTypeTag:andCrossRef:atCursor:]): Use memcpy if word alignment needed. ([NSMutableDataMalloc -serializeTypeTag:andCrossRef:]): Likewise. 2000-04-28 Richard Frith-Macdonald * Source/NSConnection.m: ([+defaultConnection]) create receive port. 2000-04-26 Richard Frith-Macdonald * Source/NSHost.m: Improve logging of host/net configuration errors * Source/GSTcpPort.m: ditto * Source/TcpPort.m: ditto 2000-04-25 Adam Fedor * Source/NSBundle.m (+initialize): retain _executable_path. 2000-04-25 Richard Frith-Macdonald * Source/NSAttributedString.m: Optimised - cache method implementations wherever possible in order to avoid objc runtime overheads. 2000-04-23 Richard Frith-Macdonald * Source/NSAttributedString.m: Corrected code of ([-attribute:atIndex:longestEffectiveRange:inRange:]) so that it compares attributes correctly. 2000-04-20 Jonathan Gapen * Tools/plmerge.m: New tool to merge property lists. * Tools/plser.m: Fix error message. (deserialize => serialize) * Tools/GNUmakefile: Add plmerge. 2000-04-20 Richard Frith-Macdonald * Tools/gdomap.c: Don't do chdir/chroot on sysv - it screws up their streams so we can't handle incoming connections. 2000-04-20 Richard Frith-Macdonald * Source/NSCalendarDate.m: Fix memory leak when initialising from string. 2000-04-20 Richard Frith-Macdonald * Source/GSTcpPort.m: define INADDR_NONE to be -1 on systems where it is not defined. 2000-04-19 Richard Frith-Macdonald * Source/NSThread.m: rewrite * Source/NSCountedSet.m: minor fix in new unique method * Source/NSGCountedSet.m: ditto 2000-04-18 Adam Fedor * base/configure.in: add a test to see whether a symlink '/proc/self/exe' exists * base/Headers/gnustep/base/config.h.in: Add a definition for the test result * base/Source/NSBundle.m: Move the discovery of the process' executable file to +initialize; add code to discover it from /proc, if possible (patches from Jonathan Gapen ) 2000-04-18 Richard Frith-Macdonald * Documentation/gsdoc/NSCountedSet.gsdoc: Method descriptions fleshed out, including GNUstep additional methods and related functions. * Documentation/gsdoc/NSDeserializer.gsdoc: GNUstep specific extension method documented. * GSDoc/gnustep.gsdoc: Fixed use of 'standards' element. * Headers/NSSerialization.h: Removed some extensions. * Headers/NSSet.h: Added some extensions for uniquing. * Source/NSCountedSet.m: Added uniquing methods and functions. * Source/NSGCountedSet.m: Added optimised uniquing methods. * Source/NSSerializer.m: Simplified uniquing code using stuff from NSCountedSet. * Testing/benchmark.m: included uniquing serialization/deserialization. 2000-04-14 Richard Frith-Macdonald * Source/mframe.m: Update to handle '-' in stack position information in type encodings. * Source/Invocation.m: ditto * Source/objc-gnu2next.m: ditto * Source/mframe/*/generic: ditto 2000-04-08 Adam Fedor * Source/NSString.m: Include NSISOLatin2StringEncoding coding. * Source/Unicode.m (encode_chartouni): Implement latin2 encoding. (encode_unitochar): Likewise. (patches from Stefan Urbanek ). 2000-04-05 Richard Frith-Macdonald * Source/NSCalendarDate.m: Bugfix intialising from string. 2000-04-05 Richard Frith-Macdonald * Headers/gnustep/base/NSException.h: remove 'volatile' from function and method declarations - no longer supported in gcc. * Source/NSException.m: ditto 2000-04-05 Richard Frith-Macdonald * Tools/gdomap.c: init_probe() fix bug placing incorrect responder address in broadcast probe. 2000-04-02 Richard Frith-Macdonald * Source/NSAttributedString.m: Infinite loop fix by Fred Kiefer to ([replaceCharactersInRange:withAttributedString:]) 2000-03-29 Richard Frith-Macdonald * Source/NSUserDefaults.m: typo reported by karl@nfox.com fixed. 2000-03-28 Richard Frith-Macdonald * Source/NSDictionary.m: Fix to avoid crash on being asked to init with contents of a nil dictionary. 2000-03-28 Richard Frith-Macdonald * Headers/gnustep/base/NSRunLoop.h: Added event type for exceptional conditions on a file descriptor and removed obsolete methods. * Source/NSRunLoop.m: Added support for monitoring for exceptional conditions on a file descriptor and removed obsolete methods for handling file descriptors. 2000-03-26 Richard Frith-Macdonald * NSTimeZones/NSTimeZones.tar: Updated to latest information available from elsie.nci.nih.gov 2000-03-25 Jonathan Gapen * Source/NSUser.m: Added new MacOS X function, NSSearchPathForDirectoriesInDomains() * Headers/gnustep/base/NSPathUtilities.h: Added prototype and argument definitions for the above function. 2000-03-23 Adam Fedor * Source/....m: include config.h * Tools/*.m: Likewise. * Headers/gnustep/base/preface.h.in: Implement VASPRINTF_LENGTH when vasprintf does not return length. 2000-03-23 Mirko Viviani * Source/NSString.m: ([-initWithFormat:arguments:]) added implementation using vasprintf() to avoid stack problems. * Headers/gnustep/base/preface.h.in: added VASPRINT_* definitions. 2000-03-23 Richard Frith-Macdonald NSNumber - more extensive rewrite/optimisation ... * Headers/gnustep/base/NSValue.h: simplified * Source/NSNumber.m: Implemented efficient abstract methods and improved caching. * Source/NSConcreteNumber.m: More efficient implementations including some previously missing methods. 2000-03-23 Adam Fedor * configure.in: Check for vasprintf function * config/config.vasprintf.c: New file. 2000-03-22 Richard Frith-Macdonald NSNumber optimisation ... * Headers/gnustep/base/NSValue.h: Added a couple of GNUstep specific functions for obtaining cached information about methods of NSNumber subclasses and hashes of small integer values. * Source/NSNumber.m: Added caches for small integer numbers and for booleans. Also added caching mechamism for methods and order info for NSNumber concrete subclasses. * Source/NSConcreteNumber.m: Added support for much more efficient compare and fast hash for small integers. 2000-03-19 Richard Frith-Macdonald * Source/NSUserDefaults.m: ([-description]) implemented. * Source/NSArray.m: ([-descriptionWithLocale:indent:]) put space after comma even when doing unformatted description. * Source/NSDictionary.m: ([-descriptionWithLocale:indent:]) put space after semicolon and around equals even when doing unformatted description. Don't sort array items in unformatted description. 2000-03-19 Richard Frith-Macdonald * Source/NSGAttributedString.m: ([setAttributes:range:]) make sure attributes are set when old range starts at start of new range. 2000-03-18 Richard Frith-Macdonald * Tools/gdomap.c: Become an unpriveliged user after binding to port 538 (for which we need to be root). This should relieve some security considerations. 2000-03-18 Richard Frith-Macdonald * Source/NSNumber.m: Added private methods from concrete class. 2000-03-17 Adam Fedor * Documentation/coding-standards.tmpl.texi: Update 2000-03-17 Richard Frith-Macdonald Changed so that property lists are output in a compact form when no locale is supplied. * Documentation/gsdoc/NSObject.gsdoc: Added documentation of the various description methods. * GSDoc/gsdoc.m: Bugfixes for text in descriptions. * Headers/gnustep/base/NSObject.h: Updated description methods * Source/NSArray.m: Updated to be closer to MacOS description. * Source/NSDictionary.m: ditto. * Source/NSGCString.m: ditto. * Source/NSGString.m: ditto. * Source/NSObject.m: added more description methods. * Tools/defaults.m: updated to use locale. * Tools/dread.m: ditto. * Tools/pldes.m: ditto. Fri Mar 17 07:47:00 2000 Richard Frith-Macdonald * Source/NSGString.m: Add checks to safely (and more efficiently) handle deletion and insertion of zero-length ranges. * Source/NSGCString.m: ditto. Thu Mar 16 11:37:00 2000 Richard Frith-Macdonald * Source/NSRange.m: NSRangeFromString() bugfix by karl@nfox.com * Source/NSData.m: ([-hash]) new implementation by karl Sat Mar 11 21:04:00 2000 Richard Frith-Macdonald * GSDoc/gsdoc.m: Updated for recent version of xml library. Fri Mar 10 10:45:00 2000 Richard Frith-Macdonald * GSDoc/gsdoc-0_6_5.dtd: Altered to add standard conformance to individual methods and to make standards rigorous. * GSDoc/gsdoc.m: Updated for changes to dtd. Thu Mar 09 18:07:00 2000 Richard Frith-Macdonald * Source/NSAttributedString.m: Varius bugfixes. * Source/NSGAttributedString.m: ditto. 2000-03-07 Adam Fedor * configure.in: Remove obsolete header checks for Time class. Wed Mar 08 07:40:00 2000 Richard Frith-Macdonald * Source/NSAttributedString.m: Bugfix by fred Kiefer for extending attributes. Related bugfixes by me, plus tidying up. 2000-03-06 Adam Fedor * config.guess: Better guess of NetBSD systems. Sat mar 04 10:08:00 2000 Richard Frith-Macdonald * Tools/Makefile.postamble: improved messages about gdomap installation. Mon Feb 28 15:27:00 2000 Richard Frith-Macdonald * GSDoc: Added GSDoc subdirectory to contain tool for converting gsdoc documentation to HTML format. * Documentation/gsdoc: Added skeleton documentation for the OpenStep/MacOS-X foundation classes in the gsdoc subdirectory. Sun Feb 27 08:37:00 2000 Richard Frith-Macdonald * Headers/gnustep/base/NSPortMessage.m: use separate ivars for ports. * Source/NSPortMessage.m: modified to use separate ivars for send and receive ports so that we can easily pass mutable array for send. Fri Feb 25 12:56:00 2000 Richard Frith-Macdonald * Source/NSPort.m: provide default implementations for methods dealing with adding connections to run loop. * Source/NSRunLoop.m: Check to see if ports have been invalidated and remove them from run loop if they have. Thu Feb 24 21:05:00 2000 Richard Frith-Macdonald * Source/NSBundle.m: ([-initWithPath:]) added code suggested by jagapen@whitewater.chem.wisc.edu to handle relative paths. * Source/NSObject.m: Added catagory of 'Object' so that containers can safely hold non-NSObject descended objects. Thu Feb 24 15:55:00 2000 Richard Frith-Macdonald * Source/TcpPort.m: Removed some unused code. * Source/GSTcpPort.m: Added new port implementation - non-functional as yet, but it represents quite a bit of work so I thought I'd put it somewhare safe from my hard disk crashing. Thu Feb 24 08:30:00 2000 Richard Frith-Macdonald * Source/NSUser.m: NSOpenStepRootDirectory() use GNUSTEP_ROOT Tue Feb 22 15:03:46 2000 Nicola Pero * Headers/Foundation/NSPort.h: Fixed typo: changed `@class NSArray` to `@class NSMutableArray` to make it compile. Tue Feb 22 07:31:00 2000 Richard Frith-Macdonald * Tools/gdomap.c: Reinstated '-p' flag to disable probes and added code to do probes by broadcast to the local network rather than by probing machines individually if possible. 2000-02-20 Matthias Klose * Tools/gdomap.c (main): Add -I option to write the pid to. Mon Feb 21 13:44:00 2000 Richard Frith-Macdonald * Source/NSRunLoop.m: Use sel_eq() for selector comparison so that we are guaranteed to match correctly when removing actions from the runloop. Fri Feb 6 14:54:00 2000 Manuel Guesdon * Source/NSCalendarDate.m: handle nil and empry string in -initWithString:calendarFormat:locale: * ChangeLog: Replace 1999 by 2000 for last modifications :-) Fri Feb 4 17:20:00 2000 Richard Frith-Macdonald * Source/NSPortNameServer.m: New methods for use by NSConnection * Foundation/NSPortNameServer.h: ditto * Source/NSConnection.m: Tidied a little and added ([-registerName:]) * Source/NSConnection.h: ditto 2000-02-17 Adam Fedor * Version: 0.6.5 released. 2000-02-16 Adam Fedor * gnustep-base.spec: Newfile Wed Feb 16 06:28:00 2000 Richard Frith-Macdonald * Source/NSAssertionHandler.m: Applied patch by David relson to change output format for function assertions, fixed error in format string, and made similar changes for method assertions. 2000-02-14 Adam Fedor * Version: Update version number * Documentation/announce.tmpl.texi: Update * Documentation/readme.tmpl.texi: Likewise. * Documentation/news.tmpl.texi: Likewise. * Documentation/todo.tmpl.texi: Likewise. * ANNOUNCE, BUGS, NEWS, README: Regenerate Fri Feb 11 06:27:00 2000 Richard Frith-Macdonald * Source/NSZone.m: Tidied indentation etc to GNU style. Thu Feb 10 23:01:00 2000 Richard Frith-Macdonald * Source/NSDebug.m: Patch by David Relson to change memory allocation report and add thread-safety. Modified by me to automatically use locking if necessary, to tidy up, and to fix a couple of bugs in lock/unlock sequencing. All new stuff - but since the previous version was completely unusable in a multithreaded environment I don't think we are running any risk by adding this here. Thu Feb 10 15:00:00 2000 Richard Frith-Macdonald Changes to fix possible crashes where task completion notifications are sent at inappropriate times due to SIGCHLD. * Source/NSTask.m: Move signal handler code to GSChecktasks() and have the signal handler simply set a flag to say work needs doing. * Source/NSRunLoop.m: Add calls to GSCheckTasks() so that we notice the death of a child. Thu Feb 10 14:13:00 2000 Richard Frith-Macdonald * Source/UnixFileHandle.m: ([-receivedEvent:type:extra: forMode:]) fix so that incoming connections are closed when their file handle is deallocated. Thu Feb 10 9:34:00 2000 Richard Frith-Macdonald * Headers/gnustep/base/preface.h.in: Added tests to see if _C_LNG_LNG and _C_ULNG_LNG are defined in the objc compiler headers and, if not, define them. Long long support was added in gcc 2.8 (minimum compiler version recommended for GNUstep), but the defines were missing from the headers :-( * Source/NSArchiver.m: Remove conditional compile for long long stuff. * Source/NSData.m: ditto * Source/NSUnarchiver.m: ditto * Source/mframe.m: ditto 2000-02-09 Adam Fedor * Documentation/gnustep-base.tmpl.texi: Update. * Documentation/news.tmpl.texi: Likewise. * Documentation/readme.tmpl.texi:Likewise. * Headers/gnustep/base/NSObjCRuntime.h: Include preface for stdargs. Wed Feb 9 17:44:00 2000 Richard Frith-Macdonald * Headers/gnustep/base/NSObjCRuntime.h: fix for header dependencies. * Headers/gnustep/base/Unicode.h: ditto * Source/NSDebug.m: ditto Tue Feb 8 23:00:00 2000 Richard Frith-Macdonald * Source/NSRunLoop.m: ([acceptInputForMode:beforeDate:]) fix handling of notifications in idle queue. 2000-02-08 Adam Fedor * config.guess: New version * config.sub: Likewise. Tue Feb 8 23:00:00 2000 Richard Frith-Macdonald * Source/NSArray.m: Move ([writeToFile:atomically:]) from mutable array to array code. Tue Feb 8 12:44:00 2000 Richard Frith-Macdonald * Source/Foundation/HSConfig.h.in: Added some GC macros * Source/NSData.m: Attempt to remove temporary file if an atomic write attempt fails. Sat Feb 5 8:47:00 2000 Richard Frith-Macdonald * Source/Foundation/NSDebug.h: Add missing function prototype - Patch by David Relson 2000-01-27 Adam Fedor * Tools/gdomap.c (init_iface): Check to see if an interface is up (using SIOCGIFFLAGS), and then get the address information before checking whether the address is in the AF_INET family (patch from Jonathan Gapen ). Sun Jan 16 9:10:00 1999 Richard Frith-Macdonald Moved objc-load.c to objc-load.m and filnd-exec.c to find-exec.m Added logging functions to objc-load.m so that logging can be enabled at runtime using --GNU-Debug=NSBundle Sun Jan 9 15:20:00 2000 Richard Frith-Macdonald * Source/NSGAttributedString.m: ([-attributesAtIndex:effectiveRange:]) fixed illegal parameter - reported by jagapen@whitewater.chem.wisc.edu Wed Jan 5 16:22:00 2000 Richard Frith-Macdonald * Source/NSData.m: when serializing selectors, cope with untyped selectors instead of crashing. Wed Jan 5 14:37:00 2000 Richard Frith-Macdonald * Source/NSTimeZone.m: Changed order of lookup to determine the local timezone: 1. User defaults with key 'Local Time Zone' 2. GNUSTEP_TZ environment variable 3. $GNUSTEP_SYSTEM_ROOT/Libraries/Resources/NSTimeZones/localtime 4. TZ environment variable 5. Use UTC This means that the TZ environment variable can now safely be used for non-GNUstep timezones as long as GNUSTEP_TZ is defined (or a localtime) file exists. Wed Jan 5 10:00:00 2000 Richard Frith-Macdonald * NSTimeZones/NSTimeZones.tar: Made a revised set of timezones with timezone names offset from GMT corresponding to common usage (as in OPENSTEP) rather than strict Posix interpretation. Also added detailed instructions to the README file and added a small makefile to build the abbreviations/regions tools. Tue Jan 4 22:40:00 2000 Richard Frith-Macdonald * Source/NSCalendarDate.m: ([-yearOfCommonEra]) fix rounding error. Tue Dec 21 13:27:00 1999 Richard Frith-Macdonald Fixes suggested by karl@nfox.com * Source/propList.h: Bugfix parsing larger lists. * Source/NSProcessInfo.m: Avoid use of freopen() * Source/GSeq.h: for ranges not found, return NSNotFound as the location rather than 0 - for compatibility with Apple. * NSDeserializer.m: Return nil if given nil data or an object that is not a data object. 1999-12-19 David Lazaro * configure.in (objc_thread_lib): Added support for FreeBSD native POSIX threads (from the reentrant C library, libc_r). Made this the first option to test as this is the best working one. * configure: New build to support the above mentioned. Fri Dec 17 17:55:00 1999 Richard Frith-Macdonald Fix error in last change. Fri Dec 17 7:03:00 1999 Richard Frith-Macdonald * Source/NSGAttributedString.m: Patch (slightly modified) by Adam Fedor to permit setting attributes on an empty string (as a no-op). Wed Dec 15 18:50:00 1999 Richard Frith-Macdonald * Source/NSHost.m: Update again - record current host name for duration of process and cache hosts keyed on the name under which they were created. This can result in multiple cache entries for the same host, but this seems to be necessary as DNS name <--> address mappings can be asymmetric. Thanks to dan@services.iiruc.ro for pointing this out. Wed Dec 15 17:30:00 1999 Richard Frith-Macdonald * Source/Foundation/NSObject.h: dealloc notification stuff for Helge * Source/NSObject.m: dealloc notification stuff for Helge Wed Dec 15 2:18:00 1999 Richard Frith-Macdonald * Source/UnixFileHandle.m: Chck to see if we are given a bad address. * Source/NSHost.m: major rewrite Tue Dec 14 8:40:00 1999 Richard Frith-Macdonald * Source/NSTimeZone.m: ([+getTimeZoneFile:]) Removed misleading comment and hack. ([+timeZoneWithName:]) Fixed bug in loading timezone data file (unusual formats could cause a crash). * Source/NSScanner.m: ([-initWithString:]) fix to handle being passed a nil string (use an empty string and log an error). * NSTimeZones/NSTimeZones.tar: updated to latest info and made sure files are in the correct place. Mon Dec 13 13:31:00 1999 Chris Ball * Source/NSTimeZone.m: Replaced the original, correct comment and removed Richard's replacement incorrect comment. Fri Dec 9 17:00:00 1999 Chris Ball Sorry, I did a commit one directory to deep. * Source/NSArray.m: NSMutableArray's compared against a garbage pointer on removal. This causes real problems on SMP machines. * Source/NSGarray.m * Source/NSCalendarDate.m: DateByAddingYears lost timeZone info. InitWithString didn't deal with adjacent format specifiers. * Source/NSDate.m: addTimeInterval messed up timeZone if used with calendarDate * Source/NSLock.m: Trylock was broken and lockBeforeDate was unimplemented * Source/NSObject.m: The release code was broken for SMP machine use. * Source/NSTimeZone.m: The GMT+-** files are in the root directory on OpenStep and are in Etc/ on GNUstep so check both. Mon Dec 13 12:20:00 1999 Richard Frith-Macdonald Fixes for cball's changes (who is cball?, and why didn't s/he produce a ChangeLog entry or conform to GNU indentation? It took me hours to tidy this up). * Source/NSDate.m: ([NSGDate -addTimeInterval:]) removed bogus implementation of method (inherits from NSDate). * Source/NSCalendarDate.m: Added implementation of ([-addTimeInterval:]) with specific code for NSCalendarDate. Reformatted code to GNUstep style. * Source/NSGArray.m: ([-removeObjectIdenticalTo:]) and ([-removeObjectIdenticalTo:inRange:]) reverted to correct code. ([-removeObject:]) and ([-removeObjectIdenticalTo:inRange:]) removed changes and added fixes so that methods are safe where multiple objects equal to the object to be removed are present in the array. * Source/NSArray.m: Similar fixes for object removal. * Source/NSObject.m: Rewritten mutex code so that mutexes are not used for retain/release unless the app is multi-threaded. Wed Dec 1 19:36:00 1999 Richard Frith-Macdonald * Source/NSArray.m: When sorting, treat illegal return values from the comparator the same way as OPENSTEP does, but log a warning. * Source/NSGArray.m: ditto * Source/NSDictionary.m ditto Fri Nov 26 19:46:00 1999 Richard Frith-Macdonald * Headers/Foundation/NSString.h: Tidied and fixed return types for for a few methods. * Source/NSString.m: ditto. * Headers/NSRange.h: Added NSRangeFromString() * Source/NSRange.m: Implemented NSRangeFromString() Sun Nov 21 6:35:00 1999 Richard Frith-Macdonald * Source/NSNotificationQueue.m: Applied patch by Dan Pascu to fix bug in removal of notificatiosn from queues. Also tidied indentation etc to conform to GNU standards. * Source/UnixFileHandle.m: ([-availableData]) fixed to block when no data is availabvle on a comms channel - as per spec. This bug was also reported by Dan * Source/NSHost.m: Use inet_aton() if available. 1999-11-18 Adam Fedor * Source/GNUmakefile: Install unicode headers. * Source/Makefile.postamble: Script for doing unicode installation. (patches from Christopher Seawood ). Thu Nov 18 15:23:00 1999 Richard Frith-Macdonald * Headers/Foundation/NSPage.h: removed * Headers/Foundation/NSZone.h: incorporated NSPage.h * Source/GNUmakefile: Remove reference to NSPage.h * Source/NSZone.m: Remove reference to NSPage.h Sun Nov 7 14:04:00 1999 Richard Frith-Macdonald * Source/o_vscanf.c Reverted to earlier version - the last fix was causing distributed objects to fail! I don't know why, but DO seems more important than the bugfix - so, pending a rewrite of DO encoding/decoding to remove the dependency on the old stream code, we need to leave this as it is. 1999-11-09 Adam Fedor * Source/o_vscanf.c (o_vscanf): Don't count '\n' as whitespace. Sun Nov 7 14:04:00 1999 Richard Frith-Macdonald * Source/Foundation/NSDebug.h: Added NSWarnLog(), NSWarnFLog() and NSWarnMLog() macros to log warnings about potential programming errors. * Source/NSArray.m: Change to use NSWarnMLog() for warnings. * Source/NSGArray.m: ditto * Source/NSGCountedSet.m: ditto * Source/NSGDictionary.m: ditto * Source/NSGSet.m: ditto Thu Nov 4 1999 Michael Hanni * Source/NSObject.m: added FreeBSD specific code in initialization so that the FPU is intialized with the correct exception flag. This allows NSConnection to work on FreeBSD (gdnc, gdomap, gpbs.) Thu Nov 4 10:52:00 1999 Richard Frith-Macdonald * Source/NSArray.m: use NSLog() to warn about attempts to remove nil. * Source/NSGArray.m: ditto * Source/NSGCountedSet.m: ditto * Source/NSGDictionary.m: ditto * Source/NSGSet.m: ditto Fri Oct 29 10:08:00 1999 Richard Frith-Macdonald * Source/NSInvocation.m: ([-initWithTarget:selector:]) possible fix for structure arguments grabbed from varargs. Tue Oct 19 11:28:00 1999 Richard Frith-Macdonald * Source/NSScanner.m: skipToNextField() - cope with a nil set of characters to be skipped. Fri Oct 15 01:28:16 1999 Lyndon Tremblay * Source/NSURL.m: (-[scheme]) removed a hopefully accidentally placed space character in a call to (-[NSString rangeOfString]). Tue Sep 12 14:00:00 1999 Richard Frith-Macdonald * Source/NSConnection.m: Removed pointer cross-reference support as it provided little performance improvement and was responsible for a few bugs I've never been able to track down, and major problems if the maps at either end of the link get out of sync (which is unavoidable in some rare circumstances). * Headers/Foundation/NSConnection.h: Removed cross-reference maps * Source/ConnectedCoder.m: Removed pointer cross-reference support * Source/NSPortCoder.m: Removed pointer cross-reference support Fri Sep 8 12:05:00 1999 Richard Frith-Macdonald * configure.in: Correct path to include file for checking thread support (bug reported by kai@cats.ms). Tue Sep 5 11:21:00 1999 Richard Frith-Macdonald * Source/NSUserDefaults.m: Fix for crash when reading corrupt file. Also -added code to create ~/GNUstep directory if needed. Mon Sep 4 11:06:00 1999 Richard Frith-Macdonald * Tools/gdomap.c: better debug output (hopefully) Wed Sep 29 21:34:00 1999 Richard Frith-Macdonald * Source/NSData.m: More GC updates (atomic data buffer) * Source/NSGString.m: ditto * Source/NSGCString.m: ditto * Source/NSObject.m: More GC updates * Source/NSZone.m: ditto * Source/mframe.m: ditto * Source/objc-gnu2next.m: ditto * Headers/Foundation/GSIMap.h: ditto Tue Sep 28 20:54:00 1999 Richard Frith-Macdonald * Source/NSArray.m: Tidy for GC stuff * Source/NSAttributedString.m: ditto * Source/NSCallBacks.m: ditto * Source/NSConnection.m: ditto * Source/NSData.m: ditto * Source/NSDateFormatter.m: ditto * Source/NSFileManager.m: ditto * Source/NSGArray.m: ditto * Source/NSGCountedSet.m: ditto * Source/NSGDictionary.m: ditto * Source/NSGSet.m: ditto * Source/NSInvocation.m: ditto * Source/NSNotificationCenter.m: ditto * Source/NSObject.m: ditto * Source/NSPortNameServer.m: ditto * Source/NSProcessInfo.m: ditto * Source/NSRunLoop.m: ditto * Source/NSScanner.m: ditto * Source/NSString.m: ditto * Source/NSTimeZone.m: ditto * Source/NSUnarchiver.m: ditto * Source/NSUndoManager.m: ditto * Source/NSUserDefaults.m: ditto * Source/TcpPort.m: ditto * Source/propList.h: ditto Tue Sep 28 11:45:00 1999 Richard Frith-Macdonald * Source/NSArray.m: ([+allocWithZone:]) tiny optimisation. * Source/NSCountedSet.m: Some optimisation. * Source/NSTask.m: implement ([-interrupt]) to send SIGINT. * Source/NSUserDefaults.m: ([-searchList]) return constant array. Various tidying up and optimisations. ([-persistentDomainForName:]) fixed memory leak. ([-volatileDomainForName:]) return constant dictionary. ([-setPersistentDomain:forName:]) make mutable copy. ([-setVolatileDomain:forName:]) ditto * Source/NSObject.m: GC tweaks * Source/NSZone.m: added zone for atomic GC * Headers/Foundation/NSZone.h: added zone GSAtomicMallocZone() * Headers/Foundation/GSIArray.h: Remove special case for zero zone * Headers/Foundation/GSIMap.h: ditto. Tue Sep 28 5:54:00 1999 Richard Frith-Macdonald * Source/NSTask.m: ([_collectChiled]) bugfix suggested by karl@nfox.com Mon Sep 27 21:15:00 1999 Richard Frith-Macdonald * Source/NSScanner.m: Fix error introduced into skipToNextField() macro my my last rewrite - sorry. Thanks to N. Pero for narrowing down the problem to a level where I could locate it. * Source/NSGeometry.m: optimised. 1999-09-24 Adam Fedor * configure.in: Add check for Objective-C headers. Thu Sep 23 20:09:00 1999 Richard Frith-Macdonald * Source/Invocation.m: VARARGS fix by ani joshi Tue Sep 21 20:26:00 1999 Richard Frith-Macdonald * Headers/Foundation/NSPortNameServer.h: Tidied and removed a few ivars. * Source/NSPortNameServer.m: Rewritten to be a bit clearer and to permit parallel lookup on multiple hosts. Sun Sep 19 6:07:00 1999 Richard Frith-Macdonald * NSString.m: Fix bug in ([+stringByStandardizingPath]) with trailing slash. Thu Sep 16 19:20:00 1999 Richard Frith-Macdonald Change request from Helge * Source/externs.m: added NSNonRetainedObjectMapValueCallBacks * Headers/Foundation/NSMapTable.h: ditto. Thu Sep 16 8:40:00 1999 Richard Frith-Macdonald Changes to minimise naming conflicts by making sure that all ivars of public classes are prefixed with a underscore. * Headers/Foundation/NSArchiver.h: prefix ivars with underscore and tidy * Headers/Foundation/NSArray.h: ditto * Headers/Foundation/NSAttributedString.h: ditto * Headers/Foundation/NSAutoreleasePool.h: ditto * Headers/Foundation/NSBitmapCharSet.h: ditto * Headers/Foundation/NSBundle.h: ditto * Headers/Foundation/NSCharacterSet.h: ditto * Headers/Foundation/NSCoder.h: ditto * Headers/Foundation/NSData.h: ditto * Headers/Foundation/NSDate.h: ditto * Headers/Foundation/NSDateFormatter.h: ditto * Headers/Foundation/NSDictionary.h: ditto * Headers/Foundation/NSDistantObject.h: ditto * Headers/Foundation/NSDistributedLock.h: ditto * Headers/Foundation/NSDistributedNotificationCenter.h: ditto * Headers/Foundation/NSException.h: ditto * Headers/Foundation/NSFileHandle.h: ditto * Headers/Foundation/NSFileManager.h: ditto * Headers/Foundation/NSGAttributedString.h: ditto * Headers/Foundation/NSHost.h: ditto * Headers/Foundation/NSInvocation.h: ditto * Headers/Foundation/NSLock.h: ditto * Headers/Foundation/NSMethodSignature.h: ditto * Headers/Foundation/NSNotification.h: ditto * Headers/Foundation/NSNotificationQueue.h: ditto * Headers/Foundation/NSPort.h: ditto * Headers/Foundation/NSPortMessage.h: ditto * Headers/Foundation/NSPortNameServer.h: ditto * Headers/Foundation/NSProtocolChecker.h: ditto * Headers/Foundation/NSScanner.h: ditto * Headers/Foundation/NSSet.h: ditto * Headers/Foundation/NSTask.h: ditto * Headers/Foundation/NSURL.h: ditto * Headers/Foundation/NSURLHandle.h: ditto * Headers/Foundation/NSUndoManager.h: ditto * Headers/Foundation/NSUserDefaults.h: ditto * Source/NSArchiver.m: ditto * Source/NSAutoreleasePool.m: ditto * Source/NSBitmapCharSet.m: ditto * Source/NSCalendarDate.m: ditto * Source/NSDate.m: ditto * Source/NSDateFormatter.m: ditto * Source/NSDistantObject.m: ditto * Source/NSDistributedLock.m: ditto * Source/NSDistributedNotificationCenter.m: ditto * Source/NSException.m: ditto * Source/NSFileManager.m: ditto * Source/NSGAttributedString.m: ditto * Source/NSGSet.m: ditto * Source/NSHost.m: ditto * Source/NSInvocation.m: ditto * Source/NSLock.m: ditto * Source/NSMethodSignature.m: ditto * Source/NSNotificationCenter.m: ditto * Source/NSNotificationQueue.m: ditto * Source/NSPort.m: ditto * Source/NSPortMessage.m: ditto * Source/NSPortNameServer.m: ditto * Source/NSProtocolChecker.m: ditto * Source/NSScanner.m: ditto * Source/NSTask.m: ditto * Source/NSURL.m: ditto * Source/NSURLHandle.m: ditto * Source/NSUndoManager.m: ditto * Source/NSUserDefaults.m: ditto * Source/Port.m: ditto * Source/TcpPort.m: ditto * Source/UdpPort.m: ditto Tue Sep 14 20:44:00 1999 Richard Frith-Macdonald * Source/NSArray.m: Huge amounts of optimisation. Memory leak fixed in ([-initWithFile:]). * Source/NSGArray.m: Optimisations of less-used methods, including implementation of fast enumerators. Tue Sep 14 15:11:00 1999 Richard Frith-Macdonald * Source/NSTimer.m: minor optimisations * Headers/NSRunLoop.h: modification for optimisation of performers * Source/NSRunLoop.m: minor optimisations, plus bugfix for performers (was removing performers after they had been fired - shouldn't). Mon Sep 13 6:45:00 1999 Richard Frith-Macdonald Miscellaneous minor bugfixes plus, * Source/NSDate.m: Year 2001 bug fixed - had silly assertion in generation of time interval since reference date for current time. * Source/NSScanner.m: optimised (well, mostly). * Headers/Foundation/NSScanner.h: update for optimisatio). Sun Sep 12 20:22:00 1999 Richard Frith-Macdonald * Source/NSDictionary.m: optimise by avoiding objc method lookup overheads wherever possible. * Source/NSGDictionary.m: likewise. Fri Sep 3 11:57:00 1999 Richard Frith-Macdonald * Source/NSString.m: speed up path handling a bit by caching method for testing for path separators - also fixed appending of path extensions and components to be according to spec. Sat Aug 21 6:26:00 1999 Richard Frith-Macdonald * Tools/gdomap.c: Fix for probing for other gdomap processes on the net. 1999-08-19 Michael Hanni * Source/NSObjCRuntime.m: patch from Tim Bissell to help in debugging. (show which non-existant ivar you wanted.) 1999-09-07 Adam Fedor * Version: 0.6.0 * configure.in: Add test for solaris libraries, freebsd threads. * Source/mframe/config.guess: Update to latest version * Source/mframe/config.sub: Likewise. Sun Sep 5 9:00:00 1999 Richard Frith-Macdonald * config/config_thread.m: new file * configure.in: Update to check to see if obc runtime uses threads so that we can include the thread library if necessary - and later onbjc tests won't all fail on threaded systems. Also - force use of fake-main stuff on bsd systems. * Source/NSProcessInfo.m: Remove bsd workaround - didn't work. 1999-08-29 Michael Hanni * Source/NSObjCRuntime.m: added a patch from Tim Bissell . Adds better debugging information for non-existent ivars. Sat Sep 4 6:20:00 1999 Richard Frith-Macdonald Various process-info related bugfixes. * Source/NSBundle.m: Use arguments list for argv[0] for full path. * Source/NSLog.m: use processName directly in log. * Source/NSProcessInfo.m: Fix process name to be last path component of argv[0], and add workaround for buggy /proc filesystems that append a newline to arguments. * Source/NSUserDefaults.m: use processName directly for domain name. Thu Sep 2 9:03:00 1999 Richard Frith-Macdonald * Source/NSTask.m: exec process with argv[0] set to full path of the executable rather than just the program name. Tue Aug 31 15:47:00 1999 Richard Frith-Macdonald * Source/NSTimer.m: Set minimum timeout to 0.01s rather than 1.0s. This seems a more reasonable value - a 1 second delay is too big. 1999-08-29 Adam Fedor * Source/NSLog.m (_NSLog_standard_printf_handler): Use cStringLength. Wed Aug 25 15:28:00 1999 Richard Frith-Macdonald Fixes for memory leaks in parsing property lists. * Source/propList.h: release new strings asap * Source/NSString.m: autorelease value returned by parsing plists. * Source/NSGString.m: ditto. * Source/NSGCString.m: ditto. Wed Aug 25 11:37:00 1999 Richard Frith-Macdonald * Source/Makefile.postamble: Added rules to build some files without optimisation, to avoid optimiser breaking them. 1999-08-23 Pedro Ivo Andrade Tavares * Headers/gnustep/base/NSByteOrder.h: changed the NSByteStore struct to comply to Mac OS X documentation. 1999-08-22 Adam Fedor * Documentation/gnustep-base.tmpl.texi: New with GNUstep specific documentation. * Documentation/news.tmpl.texi: update Fri Aug 20 16:17:00 1999 Richard Frith-Macdonald * NSNotificationQueue.m: notifyIdle() fix to send ASAP notifications even when no idle notifications are waiting. Thu Aug 19 16:20:00 1999 Richard Frith-Macdonald * Source/NSCalendarDate.m: Various memory-leak fixes. * Source/NSTimeZone.m: Various memory leak fixes. Sat Aug 7 17:30:00 1999 Richard Frith-Macdonald * Testing/tcpport-server.m: fixes to work with NSNotificationCenter. 1999-08-10 Adam Fedor * configure.in: Move objc_conditioned_wait test so it gets proper LIBS setup * Source/mframe/configure: Regenerate using autoconf 2.13 1999-08-08 Adam Fedor * Source/NSPort.m (-sendBeforeDate:): Change return type to BOOL as per the spec. * Source/NSPortMessage.m: Likewise. (patch from Pedro Ivo Andrade Tavares ). * configure.in: Rewrite +load method test. 1999-08-08 Manuel Guesdon * Source/NSGString.m (stringIncrementCountAndMakeHoleAt and stringDecrementCountAndFillHoleAt): Added a test for null length/size. Added NSCAssert on index/size/count/capacity 1999-08-05 Adam Fedor * Source/NSLock.m ([NSConditionLock -lockWhenCondition:beforeDate:]): Implement (Patch from Patrick Stein ). * configure.in: Check for objc_condition_timewait. * Source/NSString.m (-initWithFormat:arguments:): Don't advance vsprintf arguments on powerpc. * Source/mframe/powerpc/linux-gnu (MFRAME_ARG_ENCODING): Fix alignment of small structures. * many files: Changed FSF mailing address Fri Aug 6 13:25:00 1999 Richard Frith-Macdonald Portability fixes for compilers that don't leave enough space in an NXConstantString object for the _hash ivar of NSGCString. * Source/NSGCString.m: don't use _hash ivar of NXConstantString. * Source/NSGString.m: don't use _hash ivar of NXConstantString. * Source/Foundation/NSString.h: Add warning comment about the ivar layout for NXConstantString. Thu Aug 5 10:20:00 1999 Richard Frith-Macdonald * Tools/gdomap.c: prb_add() maintain server info in date order. prb_del() removed, bugfixes to notice when a server dies. Tue Aug 3 12:36:54 1999 Adam Fedor * Source/NSInvocation.m (-initWithTarget:selector:): Hack for sparc and ppc machines to align structs on word boundaries. * mframe/sparc/solaris2.6: New file with fix for putting small structures at correct offset. Mon Aug 2 8:10:00 1999 Richard Frith-Macdonald * Source/propList.h: parseQuotedString() fix for parsing octal escape sequences - hope it's right now. Sun Aug 1 7:25:00 1999 Richard Frith-Macdonald * Source/NSBundle.m: ([+localizedStringForKey:value:table:]) Fixed so that debugging behavior only takes place when NSShowNonLocalizedStrings default is 'YES'. 1999-07-29 Adam Fedor * config.guess: Updated from latest version + fix for Netwinder. * config.sub: Likewise. * Headers/gnustep/base/Foundation.h: Include NSPage.h * Headers/gnustep/base/NSPortCoder.h: Remove ref to Port.h Wed Jul 28 15:53:00 1999 Richard Frith-Macdonald * Source/NSObject.m: ([+isKindOfClass:]) Fixed to return NO except when both the argument and the receiver are NSObject - as specified in the MacOS-X documentation. Thanks to Helge for pointing this out. Mon Jul 26 21:22:00 1999 Richard Frith-Macdonald Fix cStrings to use unsigned char throughout - to avoid problems with character sets other than ascii. Suggested by Kai Henningsen. * Headers/Foundation/NSGCString.h: Use unsigned chars. * Source/NSGCString.m: Use unsigned chars. * Source/GSeq.h: Use unsigned chars. * Source/propList.h: Use unsigned chars. Fri Jul 23 22:20:00 1999 Richard Frith-Macdonald * Source/UnixFileHandle.m: Tidy a little and make sure that non-blocking mode is reset when a descriptor is closed. * Source/NSPortNameServer.mL Fixed error in lookup when host name is specified. Thu Jul 22 13:55:00 1999 Richard Frith-Macdonald * Source/NSTimeZone.m: ([-initWithOffset:]) bugfix by Kai Henningsen * acconfig.h: Removed old libc method of getting NSProcessInfo stuff. * aclocal.m4: Removed old libc method of getting NSProcessInfo stuff. * configure.in: Added new '/proc' method of getting NSProcessInfo stuff by Nico Pero, with modifications and --enable-fake-main * Headers/GSConfig.h.in: New NSProcessInfo stuff * Headers/NSObject.h: Remove fake-main include - use GSConfig.h * Headers/config.h.in: Remove fake-main include - use GSConfig.h * Headers/preface.h.in: Remove fake-main include - use GSConfig.h * Source/GNUmakefile: Remove fake-main.h * Source/Makefile.postamble: NSProcessInfo.o depends on GSConfig.h * Source/NSLog.m: Bugfix - set up pointer to log function. * Source/NSProcessInfo.m: Remove old hack for getting process info and add new '/proc' method, along with improvements to the fake-main mechanism. Tue Jul 20 15:45:00 1999 Richard Frith-Macdonald * Source/NSCalendarDate.m: ([initWithString:calendarFormat:locale:]) updated to get default format and locale info. Tue Jul 20 10:12:00 1999 Richard Frith-Macdonald * Source/NSString.m: Update code for standardising paths - now conforms to MacOS-X spec (more or less). Thu Jul 15 6:26:00 1999 Richard Frith-Macdonald * Headers/Foundation/NSURL.h: Tidied * Headers/Foundation/NSURLHandle.h: Tidied * Headers/Foundation/Foundation.h: inlcude NSURL.h and NSURLHandle.h Wed Jul 14 20:19:00 1999 Richard Frith-Macdonald * Source/NSThread.m: Make sure that a thread retains the target object and argument of the method with which it is detached. * Testing/diningPhilosophers.m: Fixed bug - was passing non NSObject argument. Wed Jul 14 16:58:00 1999 Richard Frith-Macdonald * Source/NSAttributedString.m: Fixed ([allocWithZone:]) so that subclasses should work correctly. Wed Jul 14 10:32:17 1999 Adam Fedor * Testing/Makefile.preamble: Fix include path the headers. Other testing fixes Tue Jul 13 17:08:00 1999 Richard Frith-Macdonald * Source/NSUser.m: Implemented NSStandardApplicationPaths(), NSStandardLibraryPaths(), and GSStandardPathPrefixes(). Mon Jul 12 5:00:00 1999 Richard Frith-Macdonald * Source/NSString.m: Bugfixes in ([stringByStandardizingPath:]) as suggested by Pascal Bourguignon. Also fix to do substitutions throughout path, also use realpath() for resolving links if possible. * configure.in: Check for realpath() Sat Jul 10 13:52:20 1999 Adam Fedor * Makefile.postamble: Create Foundation link in Source directory * Source/Makefile.postamble: Remove link to Foundation (work around bug in make?) Thu Jul 8 22:21:54 1999 Adam Fedor * Changes for new directory layout. * Makefile.postamble: Link Foundation from gnustep/base * configure.in: Change location of generated include files. * Source/mframe/configure.in: Change mframe.h location. * Tools/Makefile.preamble: Change base header locations. * Source/Makefirl.postamble: Likewise. Sat Jul 3 21:05:00 1999 Richard Frith-Macdonald * Source/NSCallBacks.m: Changes for garbage collection. * Source/NSDateFormatter.m: ditto. * Source/NSDictionary.m: ditto. * Source/NSDistributedLock.m: ditto. * Source/NSDistributedNotificationCenter.m: ditto. * Source/NSGArray.m: ditto. * Source/NSGCString.m: ditto. * Source/NSGCountedSet.m: ditto. * Source/NSGDictionary.m: ditto. * Source/NSGSet.m: ditto. * Source/NSHost.m: ditto. * Source/NSInvocation.m: ditto. * Source/NSNotification.m: ditto. * Source/NSProtocolChecker.m: ditto. * Source/NSScanner.m: ditto. * Source/NSSerializer.m: ditto. * Source/NSSet.m: ditto. * Source/NSData.m: ditto. * Source/NSPortNameServer.m: ditto. * Source/NSUndoManager.m: ditto. * Source/NSURL.m: ditto. Fri Jul 2 14:20:00 1999 Richard Frith-Macdonald * Source/GSeq.h: Fix boundary error when searching for string in string. * Source/NSString.m: Don't allocate contents for string with 0 length. * Source/NSGString.m: ditto * Source/NSGCString.m: ditto Fri Jul 2 8:45:00 1999 Richard Frith-Macdonald * Source/NSUnarchiver.m: In designated initialiser, catch exceptions and deallocate self before re-throwing in order to prevent memory leak. Thu Jul 1 14:00:00 1999 Richard Frith-Macdonald Patch by Kai Henningsen to improve debug slightly. * Source/NSObject.m: improved exception messages. Wed Jun 30 22:30:00 1999 Richard Frith-Macdonald * Source/NSArray.m: Tidied for garbage collection. * Source/PropList.h: Tidied for garbage collection. * Source/include/Unicode.h: Added missing prototyp. Tue Jun 29 17:50:00 1999 Richard Frith-Macdonald Patches by Hai Henningsen * Source/NSString.m: Fix for stringByAppendingPathExtension * Source/Unicode.m: Several bugfixes in AND logic. Mon Jun 28 11:48:00 1999 Richard Frith-Macdonald * Source/include/NSConnection.h: Fixed spelling error reported by Olivier.Saut@dptmaths.ens-cachan.fr * Source/NSConnection.m: ditto Sat Jun 26 7:40:00 1999 Richard Frith-Macdonald * Source/NSRunLoop.m: Fix error in last mod. * Source/NSTask.m: Allow for bsd setpgrp() * Souyrce/configure.in: Allow for bsd setpgrp() Fri Jun 25 11:30:00 1999 Richard Frith-Macdonald * Source/NSRunLoop.m: Use autorelease pools in ([limitDateForMode:]) and ([acceptInputForMode:beforeDate:]) Thu Jun 24 20:30:00 1999 Richard Frith-Macdonald * Source/include/GSIMap.h: Tweaks to avoid compiler warnings. * Source/include/NSNotification.h: ditto. * Source/propList.h: ditto. * Source/Collection.m: ditto. * Source/TcpPort.m: ditto. * Source/UnixFileHandle.m: ditto. * Source/NSArchiver.m: ditto. * Source/NSArchiver.m: ditto. * Source/NSCalendarDate.m: ditto. * Source/NSCoder.m: ditto. * Source/NSConcreteValue.m: ditto. * Source/NSConnection.m: ditto. * Source/NSData.m: ditto. * Source/NSDate.m: ditto. * Source/NSDictionary.m: ditto. * Source/NSDistributedNotificationCenter.m: ditto. * Source/NSGAttributedString.m: ditto. * Source/NSGCountedSet.m: ditto. * Source/NSGCString.m: ditto. * Source/NSGDictionary.m: ditto. * Source/NSHost.m: ditto. * Source/NSLock.m: ditto. * Source/NSNotificationCenter.m: ditto. * Source/NSNotificationQueue.m: ditto. * Source/NSNumber.m: ditto. * Source/NSObjCRuntime.m: ditto. * Source/NSObject.m: ditto. * Source/NSPage.m: ditto. * Source/NSPortNameServer.m: ditto. * Source/NSScanner.m: ditto. * Source/NSSerializer.m: ditto. * Source/NSString.m: ditto. * Source/NSTask.m: ditto. * Source/NSTimeZone.m: ditto. * Source/NSThread.m: ditto. * Source/NSUnarchiver.m: ditto. * Source/NSURL.m: ditto. * Source/NSURLHandle.m: ditto. * Source/NSUserDefaults.m: ditto. * Source/NSZone.m: ditto. * Tools/gdomap.c: ditto. * Tools/gdnc.m: ditto. * Tools/plparse.m: ditto. * Tools/sfparse.m: ditto. * Tools/pldes.m: ditto. * Tools/plser.m: ditto. 1999-06-24 Adam Fedor * Source/include/GSIArray.h (GSIArrayRemoveLastItem): New function. (GSIArrayLastItem): Likewise. (GSIArrayCopyWithZone): Likewise. Tue Jun 22 16:15:00 1999 Richard Frith-Macdonald * Source/NSThread.m: Various changes to tidy up notification handling to avoid warning messages and to ensure that observers get notified before the application becomes multi-threaded. Mon Jun 21 20:55:00 1999 Richard Frith-Macdonald * Source/NSFileManager.m: Fixed error recursing into directory. * Source/include/NSFileManager.h: tidied. Mon Jun 21 9:45:00 1999 Richard Frith-Macdonald Mostly updates of range checking code and change of FastArray and FastMap to use the prefix GSI (GnuStepInline) rather than Fast - less likely to conflict with other names. * Source/include/NSRange.h: Added GS_RANGE_CHECK() macro for consistent range checking. * Source/include/FastArray.x: Renamed to GSIArray.h * Source/include/FastMap.x: Renamed to GSIMap.h * Source/include/NSArchiver.h: Changed Fast to GSI * Source/NSString.m: Use GS_RANGE_CHECK() * Source/NSGString.m: ditto * Source/NSGCString.m: ditto * Source/NSAttributedString.m: ditto * Source/NSGAttributedString.m: ditto * Source/NSData.m: ditto * Source/NSArray.m: ditto * Source/NSGArray.m: ditto * Source/GNUmakefile: Renamed Fast... to GSI... * Source/Makefile.postamble: Renamed Fast... to GSI... * Source/NSArchiver.m: ditto * Source/NSGCountedSet.m: ditto * Source/NSGDictionary.m: ditto * Source/NSGSet.m: ditto * Source/NSNotificationCenter.m: ditto * Source/NSRunLoop.m: ditto * Source/NSSerializer.m: ditto * Source/NSUnarchiver.m: ditto Fri Jun 18 8:36:00 1999 Richard Frith-Macdonald * Source/NSFileManager.m: Fix lookup of fileGroupOwnerAccountName Fix test for symbolic links, add diagnostic info, fix copy to produce files owned by current user. * Source/include/NSFileManager.h: tidyup * Source/include/NSObject.h: fixup for ASSIGN macro - should work for all objects. Thu Jun 17 14:30:00 1999 Richard Frith-Macdonald * Source/include/NSNotification.h: Update to MacOS-X specs. * Source/NSNotification.m: Tidied * Source/NSNotificationCenter.m: Complete rewrite for performance (order of magnitude improvement) and GC. Thu Jun 17 12:00:00 1999 Richard Frith-Macdonald * Tools/gdnc.m: Only use OpenStep NSNotificationCenter methods. * Source/NSConnection.m: ditto * Source/NSDistributedNotificationCenter.m: ditto * Source/NSPort.m: ditto * Source/NSPortNameServer.m: ditto * Source/NSSerializer.m: ditto * Source/Port.m: ditto * Source/TcpPort.m: ditto Mon Jun 14 10:20:00 1999 Richard Frith-Macdonald * Source/NSConcreteValue.m: Update for MacOS-X and for GC * Source/NSCTemplateValue.m: Update for MacOS-X and for GC * Source/NSNumber.m: Update for MacOS-X and for GC, optimised * Source/NSConcreteNumber.m: Update for MacOS-X and for GCC, optimised * Source/NSValue.m: Update for MacOS-X and for GC * Source/include/NSValue.h: Update for MacOS-X and for GC Sat Jun 12 15:50:00 1999 Richard Frith-Macdonald * Source/NSConcreteValue.m: Implemented [hash and isEqualToValue * Source/include/NSConcreteValue.h: Change NSString ivar to char* for performance reasons. * Source/NSCTemplateValue.m: Implemented hash and optimised. Thu Jun 4 13:55:00 1999 Richard Frith-Macdonald * Source/NSCharacterSet.m: prepare for GC * Source/NSString.m: prepare for GC * Source/NSTimer.m: tidied and added timeInterval method * Source/include/NSTimer.h: tidied and added timeInterval method * Source/NSArchiver.m: Fixed memory leak in ([-init]) Tue Jun 2 10:50:00 1999 Richard Frith-Macdonald * Source/NSSerializer.m: Added uniquing for deserialized strings. * Source/include/NSSerialization.h: likewise. Tue Jun 2 5:45:00 1999 Richard Frith-Macdonald * Source/TcpPort.m: Fixed to compile cleanly under cygwin. * Source/UnixFileHandle.m: ditto * Source/NSHost.m: ditto * Source/NSProcessInfo.m: ditto * Source/NSRunLoop.m: ditto Fri May 28 14:30:00 1999 Richard Frith-Macdonald * Source/NSString.m: Fixed error on growing mutable strings - could cause unreasonable growth when generating property lists. Thu May 27 11:00:00 1999 Richard Frith-Macdonald * Source/NSArchiver.m: Fix memory leak reported by frederic.chauvin@lemel.fr and ready for garbage collection. * Source/NSUnarchiver.m: Ready for garbage collection. * Source/NSTimeZone.m: Fix memory leak reported by frederic.chauvin@lemel.fr. Ready for garbage collection. * Source/NSCalendarDate.m: Fix bug in decrementing date past start of month. Ready for garbage collection. Wed May 26 18:35:00 1999 Richard Frith-Macdonald * Source/include/NSSerialization.h: include NSObject.h * Source/NSSerializer.m: Deserialization optimisation (15%) * Source/NSArray.m: write descriptions to cstrings. * Source/NSDictionary.m: write descriptions to cstrings. * Source/NSGCString.m: description optimisation (15%). Wed May 26 12:25:00 1999 Richard Frith-Macdonald * Source/NSUnarchiver.m: Fixed libobjects compatibility methods to use decodeObject to get the name from the archive. Sun May 23 20:38:00 1999 Richard Frith-Macdonald * Source/TcpPort.m: Fixed retain/release loop causing ports occasionally to be kept in existence when they should disappear. Fri May 21 19:35:00 1999 Richard Frith-Macdonald * Source/include/NSObject.h: Added NSExtraRefCount() * Source/NSObject.m: Added NSExtraRefCount() Fri May 21 16:50:00 1999 Richard Frith-Macdonald * Source/include/NSThread.h: Update notification names to MacOS-X with defines for OpenStep compatibility. * Source/NSThread.m: Update notification names to MacOS-X * Source/externs.m: Update thread notification names to MacOS-X Fri May 21 16:40:00 1999 Richard Frith-Macdonald * Source/include/NSZone.h: Added NSZoneMallocAtomic() for Helge and in anticipation of adding garbage collection support some day. Fri May 21 9:56:00 1999 Richard Frith-Macdonald * Source/include/NSObject.h: Bracket macro definitions with #ifndef in case they are already defined. Thu May 20 20:30:00 1999 Richard Frith-Macdonald * Source/NSUserDefaults.m: Don't load defaults unless we need to. * Source/include/NSUserDefaults.h: Keep modification timestamp. Thu May 20 10:50:00 1999 Richard Frith-Macdonald * Source/GSeq.h: Add support for comparison and search. * Source/NSString.m: Use comparison and search functions from GSeq.h * Source/NSGString.m: Use comparison and search functions from GSeq.h * Source/NSGCString.m: Use comparison and search functions from GSeq.h * Source/Makefile.postamble: Make all string files depend on GSeq.h * Source/NSRunLoop.m: Don't retain receiver of runloop watcher. Wed May 19 21:25:00 1999 Richard Frith-Macdonald * Source/GSeq.h: New file to replace NSGSequence stuff * Source/NSString.m: Rewrite all methods using sequences. * Source/NSGString.m: Remove reference to NSGSequence. * Source/include/NSString.h: Remove unused method (_normalize). * Source/NSGSequence.m: Removed * Source/include/NSGSequence.h: Removed Tue May 18 9:00:00 1999 Richard Frith-Macdonald * Source/NSRunLoop.m: ([-acceptInputForMode:beforeDate:]) check that run loop watcher objects exist in map before trying to use them. Fri May 14 20:00:00 1999 Richard Frith-Macdonald * Tools/pldes.m: new tool to deserialise serialised property lists. * Tools/plser.m: new tool to serialise text property lists. * Tools/GNUmakefile: add pldes and plser Mon May 11 15:00:00 1999 Manuel Guesdon * Source/NSArray.m: getObjects: (id*)aBuffer range: (NSRange)aRange corrected bug in for: replace c by e Tue May 11 10:40:00 1999 Richard Frith-Macdonald * Source/include/preface.h: Attempt to standardise win32 conditional compilation by using __WIN32__ throughout. * NSDate.m: Standardize win32 stuff using __WIN32__ Open files with "rb" or "wb" only for winw3. * NSFileManager.m: Standardize win32 stuff using __WIN32__ * NSHost.m: Standardize win32 stuff using __WIN32__ * NSLog.m: Standardize win32 stuff using __WIN32__ * NSProcessInfo.m: Standardize win32 stuff using __WIN32__ * NSString.m: Standardize win32 stuff using __WIN32__ * NSTask.m: Standardize win32 stuff using __WIN32__ * NSThread.m: Standardize win32 stuff using __WIN32__ * NSUser.m: Standardize win32 stuff using __WIN32__ * NSUserDefaults.m: Standardize win32 stuff using __WIN32__ * Time.m: Standardize win32 stuff using __WIN32__ * UnixFileHandle.m: Standardize win32 stuff using __WIN32__ * NSData.m: Standardize win32 stuff using __WIN32__ * NSTimeZone.m: Standardize win32 stuff using __WIN32__ Open files with "rb" or "wb" only for winw3. Mon May 10 8:00:00 1999 Richard Frith-Macdonald * Source/NSString.m: ([-rangeOfComposedCharacterSequenceAtIndex:]) optimised. * Source/NSGString.m: ([-rangeOfComposedCharacterSequenceAtIndex:]) implemented. * Source/NSGCString.m: ([-rangeOfComposedCharacterSequenceAtIndex:]) * Source/NSGSequence.m: various parts optimised. * Source/include/NSThread.h: add gcontext ivar. Fri May 7 15:12:00 1999 Richard Frith-Macdonald * Source/NSBundle.m: Modified ([-release]) to avoid unnecessary work and to refrain from caching bundles unless they have loaded code (or are the main bundle or the gnustep bundle). Thu May 6 21:00:00 1999 Richard Frith-Macdonald * Source/NSUnarchiver.m: Don't retain/release unless necessary. * Source/NSUserDefaults.m: ditto * Source/NSNotification.m: ditto * Source/NSFileManager.m: ditto * Source/NSBundle.m: ditto * Source/NSRunLoop.m: ditto * Source/NSAutoreleasePool.m: Bugfix in dealloc - would leave count of retained objects set high - caused deallocs of nil objects. Thu May 6 17:06:00 1999 Richard Frith-Macdonald * Source/NSString.m: Minor optimisations - use ([-allocWithZone:]) * Source/NSGCString.m: ditto * Source/NSGDictionary.m: ditto * Source/NSArray.m: ditto * Source/NSDictionary.m: ditto * Source/NSSet.m: ditto * Source/NSGCountedSet.m: ditto * Source/NSData.m: ditto Thu May 6 13:40:00 1999 Richard Frith-Macdonald * Source/propList.h: new file * Source/NSString.m: include propList.h for property-list parsing. * Source/NSGString.m: ditto * Source/NSGCString.m: ditto * Source/NSTask.m: Minor fixes for win32 * Source/NSLog.m: ditto * Source/NSProcessInfo.m: ditto * Source/NSFileManager.m: ditto 1999-04-28 Adam Fedor * Source/NSRunLoop.m (aSort): Redefine to take FastArrayItem as arguments. * Source/include/FastArray.x (FastArrayInsertionPosition): Fully specify sorter function for better type checking. (FastArrayCheckSort): Likewise. 1999-04-27 Adam Fedor * configure.in: Check for sys/mount.h for NSFileManager functions on FreeBSD Fri Apr 23 23:35:00 1999 Richard Frith-Macdonald * Source/NSCalendarDate.m: Applied bugfixes by Jeremy Bettis to better cope with month ends. Fri Apr 23 15:00:00 1999 Richard Frith-Macdonald * Source/NSBundle.m: Improved localisation - avoid possibility of recursion problems if an error occurs reading localisation info. * Source/NSDate.m: Added classes for distant past and distant future. 1999-04-22 Adam Fedor * configure.in: Don't abort if nested functions don't work. Not sure we even have any. * Source/NSBundle.m (-localizedStringForKey:value:table:): Log a message if no localized key found (per OpenStep specs). * Source/include/NSBundle.h (NSLocalizedStringFromTableInFramework): New GNUstep specific macro. * NSCharacterSets/GNUmakefile: Install in Resources rather than Resources/gnustep. * NSTimeZones/GNUmakefile: Likewise. * Source/NSCharacterSet.m: Look in new location. * Source/NSTimeZone.m: Likewise. Thu Apr 22 21:50:00 1999 Richard Frith-Macdonald * Source/NSBundle.m: Improved localisation - added stuff for internal use by the GNUstep system. * Source/NSBundle.h: ditto. * Source/FastArray.x: Removed assertions for performance. Thu Apr 22 11:35:00 1999 Richard Frith-Macdonald * Source/NSRunLoop.m: Optimisation and tidyup. * Source/NSTimer.m: Minor bugfixes. * Source/include/FastArray.x: Bugfix for array insertion. * Source/include/NSRunLoop.h: Remove limit ivar. * Source/include/NSTimer.h: Use NSDate again. Wed Apr 21 20:25:00 1999 Richard Frith-Macdonald * Source/NSAttributedString.m: Tidied. * Source/Source/NSAutoreleasePool.m: Thread exit code added * Source/NSCalendarDate.m: Tidied * Source/NSConnection.m: ditto * Source/NSException.m: Tidied and added description * Source/NSRunLoop.m: Optimisation, bugfixes, and removal of cruft. * Source/NSThread.m: Clean up autorelease pools on exit. * Source/NSTimer.m: Optimise use in runloop. * Source/include/FastArray.x: Bugfix for sorted array. * Source/include/NSAutoreleasePool.h: Mod for threads. * Source/include/NSObject.h: More retain/release macros. * Source/include/NSRunLoop.h: Optimise limit date. * Source/include/NSTimer.h: Optimise use with run loop. Tue Apr 20 16:50:00 1999 Richard Frith-Macdonald * Source/Makefile.postamble: NSRunLoop.m uses FastArray.x * Source/NSConnection.m: Tiny performance optimisation. * Source/NSDate.m: Minor fixes to class cluster. * Source/NSGDictionary.m: fixed typo. * Source/NSNotificationQueue.m: Optimised runloop interaction. * Source/NSRunLoop.m: Optimisaed notification queue interaction. * Source/NSTimer.m: Optimisation for run loop. * Source/NSUnarchiver.m: Fixed typo. * Source/include/FastArray.x: Support sorted insertion. * Source/include/NSDate.h: Tidied. * Source/include/NSNotificationQueue.h: Change runloop interface. * Source/include/NSTimer.h: Change runloop interface. Mon Apr 19 14:40:00 1999 Richard Frith-Macdonald * Source/NSThread.m: Fast thread access (GSCurrentThread()) etc. * Source/NSAssertionHandler.m: Use fast thread access. * Source/NSConnection.m: Use fast thread access. * Source/NSException.m: Use fast thread access. * Source/NSNotificationQueue.m: Use fast thread access. * Source/NSRunLoop.m: Use fast thread access plus other optimisations. * Source/NSAutoreleasePool.m: Speed up thread access. * Source/NSDate.m: Rewrite as calss cluster - MacOS-X compatibility. * Source/NSCalendarDate.m: Modifications to work with NSDate. * Source/NSGDictionary.m: Minor tidyup. * Source/NSGSequence.m: Minor optimisation - really needs a rewrite. * Source/NSDebug.m: Added function to report all allocations. Fri Apr 16 20:16:00 1999 Richard Frith-Macdonald * Source/include/NSGeometry.h: Don't pollute macro name space with MAX and MIN. * Source/include/NSRange.h: ditto Thu Apr 15 10:50:00 1999 Richard Frith-Macdonald * Source/include/NSHost.h: Use #ifdefs to prevent multiple inclusion. Thu Apr 15 9:47:00 1999 Richard Frith-Macdonald * Source/UnixFileHandle.m: ([-fileDescriptor]) return a valid file descriptor (for /dev/null) for the null device. * Source/NSTask.m: ([-launch]) Add code to reset signals in subprocess and to close all file descriptors (except stdin, stdout and stderr). Wed Apr 14 14:32:00 1999 Richard Frith-Macdonald * Source/NSPortNameServer.m: Don't suspend thread while waiting for gdomap to start up. * Source/NSDistributedNotificationCenter.m: Don't suspend thread while waiting for gdnc to start up. Wed Apr 14 10:50:00 1999 Richard Frith-Macdonald * Source/NSBundle: ([+allBundles]) implemented (ignoring the frameworks issue). Extra internal GNUstep specific methods provided - ([+_gnustep_target_cpu]), ([+_gnustep_target_dir]) ([+_gnustep_target_os]), ([+_library_combo]) So that we can easily determine wrapper path information. * Source/NSTaks: Preparation for garbage collecting. Major work on launching - now makes intelligent use of launch path. Tries various GNUstep directories - if unable to find executable that way, resorts to using the unix PATH environment variable. * Source/NSPortNameServer.m: Removed a couple of unix specific calls. * Source/NSDistributedNotificationCenter.m: Removed a couple of unix specific calls. * Tools/Makefile.postamble: Install gdnc in non-library specific dir. Tue Apr 13 22:05:00 1999 Richard Frith-Macdonald * Source/NSBundle.m: Updated to use Info.plist if Info-gnustep.plist is not available. Also updated to look in alternative directories for the object file to load... If not in the machine/os/lib-combo subdirectory, tries the machine/os directory and then the top-level directory. Also updated to cope with the case where the NSExecutable entry of the Info.plist specifies a path rather than a simple file name. * Source/NSUser.m: Implemented NSFullUserName() Mon Apr 12 13:15:00 1999 Richard Frith-Macdonald * Source/NSCountedSet.m: Make copying behavior be same as OPENSTEP * Source/NSSet.m: Fix memory scribbling bug in ([-initWithSet:]) * Source/NSGSet.m: Tidied types in fast map. * Source/NSGArray.m: Minor optimisationin copy etc. * Source/NSGDictionary.m: Tidied types in fast map. * Source/NSSerializer.m: Tidied types in fast map and array. * Source/NSArchiver.m: Tidied types in fast map and array. * Source/NSUnarchiver.m: Tidied types in fast map and array. * Source/FastArray.x: Tidied, fixed init bug, movied to include * Source/FastMap.x: Tidied, moved to include * Source/NSZone.m: Dummy zone for use with GC. * Source/include/NSZone.h: Dummy zone for use with GC. * Source/include/GSUnion.h: Unions for use with Fast... * Source/include/FastArray.x: New from Source * Source/include/FastMap.x: New from Source * Source/GNUmakefile: Added FastArray.x, FastMap.x, GSUnion.h * Source/Makefile.postamble: Added FastArray.x FastMap.x GSUnion.h. * NSCharacterSets/GNUmakefile: List all new character set names. Fri Apr 9 22:04:00 1999 Richard Frith-Macdonald * Source/NSGAttributedString.m: Final optimisation - remove almost all objc runtime overhead. Combined changes should result in a factor of 2 to 10 speedup (depending on operation) over original code. Fri Apr 9 16:22:00 1999 Richard Frith-Macdonald * Source/NSAttributedString.m: Implement tracking of changes to string returned by [-mutableString] method. Simplified initialisation. * Source/include/NSAttributedString.h: Updated. * Source/NSGAttributedString.m: Rewrite to get rid of all known problems and to boost performance hugely. * Source/include/NSGAttributedString.h: Updated. * Source/NSString.m: ([-_baseCount]) optimised. * Source/NSGString.m: ([-_baseCount]) optimised. 1999-04-09 Adam Fedor * NSCharacterSets: Updated sets to Version 2.1.8 * Souce/NSCharacterSet.m: Updated to reflect new names of character sets. 1999-04-08 Adam Fedor * configure.in: Remove test for libobjc.a Thu Apr 8 12:40:00 1999 Richard Frith-Macdonald * Source/NSArray.m: Make copying behavior consistent with OPENSTEP. * Source/NSDictionary.m: Make copying behavior consistent with OPENSTEP. * Source/NSSet.m: Make copying behavior consistent with OPENSTEP. Wed Apr 7 12:22:00 1999 Richard Frith-Macdonald * Source/NSCharacterSet.m: Use punctuationCharSet.dat 1999-04-06 Adam Fedor * NSCharacterSets/punctuationCharSet.dat: New file Mon 5 7:33:00 1999 Richard Frith-Macdonald * Source/NSRange.m: Moved most functions into header file, while including header to generate linkable versions. * Source/include/NSGeometry.h: Define MIN and MAX if required. * Source/include/NSRange.h: Define MIN and MAX if required and make most range functions a efficiency. Thu Mar 11 10:30:00 1999 Richard Frith-Macdonald * Source/NSDebug.m: Added two new functions for logging messags. * Source/include/NSDebug.h: Added four new logging macros. * Source/NSBundle.m: Updated to use new NSDebugMLLog() macro. Wed Mar 10 09:54:00 1999 Richard Frith-Macdonald * Source/FastMap.x: FastMapNodeForKey() - special case for empty map return 0 immediately. Fast for empty maps, marginally slower othrwise. * Source/NSProcessInfo.m: Removed [-debugArray], Added [-debugSet], Added GSDebugSet() function for rapid debug level testing. * Source/include/NSProcessInfo.h: Remove [-debugArray], Add [-debugSet] * Source/include/NSDebug.h: Rewrite NSDebugLog() and NSDebugLLog() to be much more efficient - now minimal performance impact. 1999-03-09 Adam Fedor * Source/include/NSObjCRuntime.h: Define some OpenStep cpp vars. * Source/include/NSException.h (NS_VALUERETURN): Fix. Tue Mar 9 5:16:00 1999 Richard Frith-Macdonald * configure.in: Added tests for syslog * Source/include/config.h.in: Added definitions for syslog * Source/NSLog.m: Added locking for multi-thread serialisation and added syslog support when write to stderr fails. 1999-03-08 Adam Fedor * Merged dawn branch to main. Wed Mar 3 5:32:00 1999 Richard Frith-Macdonald * Source/NSUser.m: Fixed a typo reported by twhite@rogers.wave.ca * Source/TcpPort.m: Fixed typos. Tue Mar 2 15:07:00 1999 Richard Frith-Macdonald * Source/TcpPort.m: If the host has no IP address, try finding the address of 'localhost' and, if that fails, use 127.0.0.1 Tue Mar 2 11:25:00 1999 Richard Frith-Macdonald * NSTimeZones/Makefile.postamble: Updated to preserve old localtime * NSTimeZones.tar: Updated to use the latest available zone info. Tue Mar 2 08:04:00 1999 Richard Frith-Macdonald * Merge in 'dawn' CVS branch. Tue Feb 23 12:03:00 1999 Richard Frith-Macdonald * Source/include/NSObject.h: Fixed bugin in ASSIGNCOPY() macro and added CREATE_AUTORELEASE_POOL() macro for libFoundation compatibility. * Source/include/NSRunLoop.h: Added GCFinalization protocol. * Source/NSRunLoop.m: Tidied a little, added GC macro use, fixed minor bug, and added slight performance improvement. Mon Feb 22 5:40:00 1999 Richard Frith-Macdonald Merged in alterations from main cvs branch made to wrong place 'cos dawn branch was already created :-( * Source/NSData.m: preserve file attributes when writing atomically * Source/NSUser.m: Bugfixes for consistent naming of current user. * Source/NSUserDefaults.m: Bugfixes so that running apps as root doesn't mess up defaults database. * Source/NSFileManager.m: Create files with correct ownership when process is setuid to root - and provide facility for NSData to do same. * Source/NSArray.m: Merged enumerator bugfix - missing @end Sun Feb 21 19:30:00 1999 Richard Frith-Macdonald * Source/NSFileManager.m: Attempt to fix problems with directory enumeration. Sat Feb 20 20:30:00 1999 Richard Frith-Macdonald * Source/NSUser.m: Added GSSetUserName() and rewrote NSUserName() to work consistently - use the LOGNAME environment variable as first choice of username. * Source/include/NSPathUtilities.h: Added GSSetUserName() * Source/NSUserDefaults.m: Added GNUstep specific method - ([+resetUserDefaults]) to reset the standard defaults in the event of a change os username. Also changed to create defaults withe correct ownership, and to create a defaults file containing a valid (empty) dictionary. * Source/include/NSUserDefaults.h: Added ([+resetUserDefaults]) * Source/NSData.m: Try to preserve file ownership etc with ([-writeToFile:atomically:]) * Source/NSFileManager.m: ([-changeFileAttributes:atPath:]) added code to handle owner and group names if owner and group IDs are not supplied. Also added code to ensure that programs running setuid to root create new files and directories with the ownership of their actual login user by default. 1999-02-19 Michael Hanni * Version 0.5.5 Released. Tue Mar 2 17:04:51 1999 Adam Fedor * Source/TcpPort.m ([GSTcpPort +portWithNumber:onHost:beforeDate:]): Fix typo in variable. Change include to (Needed on solaris). 1999-03-01 Adam Fedor * Update documentation. 1999-02-28 Adam Fedor * Source/Makefile.postamble: Don't install services if not root. (patches submitted by Christopher Seawood ). Tue Feb 23 12:03:00 1999 Richard Frith-Macdonald * Source/include/NSObject.h: Fixed bugin in ASSIGNCOPY() macro and added CREATE_AUTORELEASE_POOL() macro for libFoundation compatibility. * Source/include/NSRunLoop.h: Added GCFinalization protocol. * Source/NSRunLoop.m: Tidied a little, added GC macro use, fixed minor bug, and added slight performance improvement. 1999-02-22 Adam Fedor * Version: update version. * Source/NSProcessInfo.m: Change missing main message. Mon Feb 22 5:40:00 1999 Richard Frith-Macdonald Merged in alterations from main cvs branch made to wrong place 'cos dawn branch was already created :-( * Source/NSData.m: preserve file attributes when writing atomically * Source/NSUser.m: Bugfixes for consistent naming of current user. * Source/NSUserDefaults.m: Bugfixes so that running apps as root doesn't mess up defaults database. * Source/NSFileManager.m: Create files with correct ownership when process is setuid to root - and provide facility for NSData to do same. * Source/NSArray.m: Merged enumerator bugfix - missing @end 1999-02-19 Adam Fedor * Source/NSHost.m ([NSHost +currentHost]): Check for host not found. ([NSHost +hostWithName:]): Check for nil arg. ([NSHost +hostWithAddress:]): Likewise. * Testing/release.m: Make array mutable. * Testing/fref.m: Switch to NSArchiver/NSUnarchiver Wed Feb 17 8:52:00 1999 Richard Frith-Macdonald * Source/NSProcessInfo.m: Include process name in arguments list as in the OPENSTEP implementation - suggested by dirk@object-factory.com * Source/NSUserDefaults.m: Adjust for change to NSProcessInfo * Source/Tools/defaults.m: ditto * Source/Tools/dread.m: ditto. * Source/Tools/dwrite.m: ditto. * Source/Tools/dremove.m: ditto. * Source/Tools/plparse.m: ditto. * Source/Tools/sfparse.m: ditto. Tue Feb 16 15:35:00 1999 Richard Frith-Macdonald * Source/NSArray.m: ([-removeObjectsFromIndices:]) rewrite to work according to spec. * Testing/nsarray.m: Fixed check on joining strings. Mon Feb 15 06:14:00 1999 Richard Frith-Macdonald * Source/include/NSDebug.h: Declare strerror() if not known to system * Source/NSTask.m: Include NSDebug.h and don't declare errno. Thu Feb 12 00:57:00 1999 Manuel Guesdon * Source/include/NSString.h: declaration of categories: NSString (GSString) NSString(GSTrimming) NSMutableString (GSString) NSMutableString (GSTrimming) * Source/NSString.m: implementation of these categories * Source/include/NSObject.h: added ASSIGNCOPY Same as ASSIGN but copy the value * Source/include/NSURL.h: New class * Source/include/NSURLHandle.h: New class * Source/NSURL.m: New class [see the note in the file] * Source/NSURLHandle.m: New class [see the note in the file] * GNUMakefile: added NSURL.m and NSURLHandle.m Fri Feb 12 16:20:00 1999 Richard Frith-Macdonald * Source/NSGeometry.m: Removed most functions - into header * Source/include/NSGeometry.h: Made most functions inline for speed. * Makefile.postamble: NSGeometry.o depends on NSGeometry.h Thu Feb 11 19:25:00 1999 Manuel Guesdon * Source/NSObjCRuntime.m: Fixed error in GSGetInstanceVariable name: GSGetIinstanceVariable transformed to GSGetInstanceVariable Thu Feb 11 9:51:00 1999 Richard Frith-Macdonald * Source/NSString.m: Fixed error in property-list parsing - was not taking into account octal and hexadecimal escape sequences. Thu Feb 11 9:51:00 1999 Richard Frith-Macdonald * Source/NSUserDefaults.m: ([-dealloc]) invalidate timer so we can't get sent a timeout message after d4eallocation - fixes occasional crashes when the defaults database has been unreadable. Thu Feb 11 7:27:00 1999 Richard Frith-Macdonald * Source/NSConnection.m: Tidy up with bugfixes and better distributed retain/release for triangle connections. * Source/NSDistantObject.m: ditto * Source/TcpPort.m: ditto * Source/include/DistributedObjects.h: ditto * Source/include/NSConnection.h: ditto * Source/include/NSDistantObject.h: ditto 1999-02-09 Adam Fedor * Source/HashTable.m: Moved to extensions. * Source/List.m, Source/NXStringTable*, Source/Storage.m, Source/objc/HashTable.h, Source/objc/List.h, Source/objc/NXStringTable.h, Source/objc/Storage.h: Likewise. Tue Feb 9 14:08:00 1999 Richard Frith-Macdonald * Source/NSProcessInfo.m: Fixed login in #if construct so things will link again. 1999-02-08 Adam Fedor * Source/include/fake-main.h: Leave off __ELF__, only use autoload of init method if SYS_AUTOLOAD. * Source/NSProcessInfo.m: Likewise. Mon Feb 8 10:05:00 1999 Richard Frith-Macdonald * Source/include/NSByteOrder.h: Implemented a full set of byte-swapping inline functions for integers with known sizes. * Source/NSData.m: Corrected serialization/deserialization routines to do byte-swapping using new functions. * Source/UnixFileHandle.m: Use new byte-swapping functions rather than htonl(), htons(), ntohl(), ntohs(). * Source/NSUnarchiver.m: Use new byte-swapping functions. 1999-02-04 Adam Fedor * config/config.printf.c: New file. * configure.in: Test for broken register_printf function. * Source/NSLog.m (_NSLog_standard_printf_handler): Use fputs to avoid possible double expansion of format chars. 1999-02-04 Matthias Klose * Source/include/NSObject.h: eval value in ASSIGN macro only once. Thu Feb 4 13:10:00 1999 Richard Frith-Macdonald * Source/NSString.m: ([-dataUsingEncoding:allowLossyConversion:]) Removed spurious trailing nul and other spurious code having no effect - formatted to be readable. Thu Feb 4 13:10:00 1999 Richard Frith-Macdonald Deleted all the old property-list and strings-file parsing stuff. * Source/NSBitmapCharSet.m: ([-formUnionWithCharacterSet]) corrected to use bitwise or rather than logical or. ([-formIntersectionWithCharacterSet:]) corrected to use bitwise and rather than logical and. * Source/NSString.m: Implemented handwritten parser code for ([-propertyList]) and ([-propertyListFromStringsFileFormat]) which supports unicode strings, is 64-bit clean, and raises exceptions as it should when given a badly formatted string to parse. This replaces the old lex/bison code (which did none of these things) and runs just as fast! Just hope that if there are any bugs they show up in time to fix for the 0.6 release. * Tools/GNUmakefile: Added plparse and sfparse. * Tools/plparse.m: New tool to parse a property-list and report errors. * Tools/sfparse.m: New tool to parse a strings-file and report errors. Wed Feb 3 12:45:00 1999 Richard Frith-Macdonald * Source/FastArray.x: Don't use value returned by RETAIN macro. * Source/FastMap.x: Don't use value returned by RETAIN macros. * Source/NSGDictionary.m: Fix to assign values in RETAIN macros as suggested by mguesdon@sbuilders.com Tue Feb 2 15:35:00 1999 Richard Frith-Macdonald * Source/NSZone.m: nrecycle() bugfix - was persisting after memory had actually been returned to system malloc. Tue Feb 2 11:20:00 1999 Richard Frith-Macdonald * Source/mframe/alpha/linux-gnu: First 'real' port to alpha. * Source/mframe/alpha/generic: ditto 1999-02-01 Adam Fedor * Source/UnixFileHandle.m: Switch include of netinet/in.h. * Source/NSObject.m: Undef ALIGN before define'ing. * Source/NSZone.m: Likewise. * Source/mframe/configure.in: Recognize any version of freebsd or openbsd. * Source/mframe/i386/freebsd: New file, copy of generic. * Source/mframe/i386/openbsd: Likewise. (Bug reports from Michael Hanni ). Mon Feb 1 11:25:00 1999 Richard Frith-Macdonald Patch supplied by eric@skatter.usask.ca * Testing/nsscanner.m: Explicitly include NSString.h. Cleaned up autorelease pool handling. Fixed some printf arguments that didn't match their formats. Added tests for scanHexInt:. * Source/include/NSScanner.h: Add declarations for scanInt: and scanHexInt: methods. * Source/NSScanner.m Added scanHexInt: method. Cleaned up some comments. Added conditional compile to let scanDouble: accept numbers like 1.234eFoo (as 1.234). For now, numbers like this are rejected. Mon Feb 1 11:25:00 1999 Richard Frith-Macdonald * src/NSArray.m: ([-initWithContentsOfFile:]) Fixed memory leak. * src/NSDictionary.m: ([-initWithContentsOfFile:]) Fixed memory leak. * src/NSData.m: Tidied indentation and 64-bit clean serialization of strings, classes, and selectors. Sat Jan 30 5:55:00 1999 Richard Frith-Macdonald Tidying up brain-damaged changes I made while ill. * src/NSConnection.m: Tidied proxy handling a bit * src/NSDistantObject.m: Tidied - made closer to OpenStep spec. Fri Jan 29 11:00:00 1999 Richard Frith-Macdonald * src/NSArchiver.m: Implemented ([-encodeDataObject:]) * src/NSUnarchiver.m: Implemented ([-decodeDataObject]) 1999-01-28 Adam Fedor * GNUmakefile (SUBPROJECTS): Change directory names * configure.in: Update for new directories. Thu Jan 28 16:45:00 1999 Richard Frith-Macdonald * src/include/NSObject.h: Preliminaries for addition of GC * src/include/NSZone.h: ditto * src/NSObject.m: ditto * src/NSZone.m: ditto Thu Jan 28 11:40:00 1999 Richard Frith-Macdonald * src/include/GSConfig.h.in: Added gsaddr type - integer with same size as a pointer. * configure.in: Added gsaddr type and fixed a coiuple of typos. * src/NSUnarchiver.m: include NSByteOrder.h Thu Jan 28 9:20:00 1999 Richard Frith-Macdonald * src/Makefile.postamble: Tidied distclean stuff - suggested by jagapen@whitewater.chem.wisc.edu Wed Jan 27 12:00:00 1999 Richard Frith-Macdonald * configure.n: More type-size stuff * src/include/GSConfig.h.in: More type-size stuff * src/include/NSData.h: Changed GNUstep extensions and added constants for coder support. * src/include/NSArchiver.h: Changes for handling systems with differing type sizes. * src/include/NSByteOrder.h: Changes and additions for handling systems with differing type sizes. * src/NSData.m: Changed GNUstep extensions for coder support in order to make handling of type-size information easier. * src/NSArchiver.m: Encode type-size info and write more efficiently. * src/NSUnarchiver.m: Decode type-size info. * src/UnixFileHanlde.m: Use localhost if given no host for connect. Tue Jan 26 15:45:00 1999 Richard Frith-Macdonald * configure.in: More stuff for type-size info * src/include/GSConfig.h.in: More stuff for type-size info. * src/FastArray.x: Allow types with fixed sizes in array. * src/FastMap.x: Allow types with fixed sizes in map. Tue Jan 26 8:15:00 1999 Richard Frith-Macdonald * src/NSThread.m: ([-sleepUntilDate:]) cast argument of usleep() to be integer rather than float - suggested by stark@easynet.fr Sun Jan 24 8:50:00 1999 Richard Frith-Macdonald * src/NSConnection.m: Preliminary work for handling DO between machines wiuth different pointer sizes. * src/NSDistantObject.m: ditto * src/include/NSConnection.h: ditto * src/include/NSDistantObject.h: ditto * src/include/DistributedObjects.h: ditto Tue Jan 19 12:20:00 1999 Richard Frith-Macdonald * src/NSUserDefaults.m: Fixed to update periodically from disk and to post notifications if the on-disk copy has changed. * src/include/NSUserDefaults.m: Changed vtimer info for update. Fri Jan 15 10:45:00 1999 Richard Frith-Macdonald * src/NSObjCRuntime.m: Added GSGetInstanceVariable() and GSSetInstanceVariable() methods - extensions to gnustep. * src/NSObjCRuntime.h: ditto Tue Jan 12 4:10:00 1999 Richard Frith-Macdonald * src/NSProcessInfo.m: Fix for GNU/Linux-powerpc (__PPC__) to get class initialised with argument info. * src/include/fake-main.h: ditto Mon Jan 11 16:45:00 1999 Richard Frith-Macdonald Fixes for bugs reported by Benhur-de-Oliveira.Stein@imag.fr * src/NSDictionary.m: ([-initWithObjectsAndKeys:]) fixed test for nil. * src/NSSet.m: Added makeObjectsPerformSelector methods. * src/NSString.m: ([-rangeOfComposedCharacterSequenceAtIndex:]) find range from before the index if necessary. * Tidied allocation methods in NSArray.m NSDictionary.m Sat Jan 8 6:00:00 1999 Richard Frith-Macdonald * src/NSPortNameServer.m: Raise exception on failure to register name. Fri Jan 8 9:20:00 1999 Richard Frith-Macdonald * src/NSObject.m: Cache a few more classes. * src/include/fast.x: Add a few more classes to cache. * checks/benchmark.m: Benchmark classname lookup overhead. * src/Makefile.postamble: Improve dependencies. Wed Jan 6 22:05:00 1999 Richard Frith-Macdonald * src/UnixFileHandle.m: Fixed error in last change to ([-closeFile]) which could fail to remove descriptors from runloop properly. Wed Jan 6 10:30:00 1999 Richard Frith-Macdonald * mframe/alpha/linux-gnu: First rough attempt at making a config file for the DEC alpha. * mframe/alpha/gneric: ditto. Tue Jan 5 20:30:00 1999 Richard Frith-Macdonald * configure.in: New stuff for making byte-order and type-size information available in GSConfig.h * src/NSTask.m: Set process group for child process and preliminary code for keeping track of active child tasks and handlign sigchld. * src/UnixFileHandle.m: Modified ([-closeFile]) to send notifications if there are any asynchronous operations in progress. * src/include/Foundation.h: include GSConfig.h * src/include/NSObject.h: include GSConfig.h * src/include/NSByteOrder.h: Use GS_WORDS_BIGENDIAN from GSConfig.h * src/include/GSConfig.h.in: Add typedefs for types with known size. * src/include/config.h.in: Added HAVE_SETPGID and HAVE_SETPGRP Tue Jan 5 9:45:00 1999 Richard Frith-Macdonald * src/NSTask.m: Workaround for bug in linux waitpid(), general tidying, clean up descriptors in child process. * src/NSString.m: ([-dataUsingEncoding:]) fixed memory leak. Mon Jan 4 15:35:00 1999 Richard Frith-Macdonald * src/NSInvocation.m: Fix for machines that pass structures by ref. * mframe/powerpc/linux-gnu: Machine definition added for powerpc. Mon Jan 4 9:05:00 1999 Richard Frith-Macdonald * src/o_vscanf.c: Don't make local copy of va_list parameter by assignment - doesn't work on machines where a va_list is an array. Sat Jan 2 12:48:51 1999 Adam Fedor * configure.in: Configure subdir src/mframe properly using AC_CONFIG_SUBDIRS Sat Dec 26 8:20:00 1998 Richard Frith-Macdonald * src/NSString.m: Make compare with range of length zero always return NSOrderedSame Sat Dec 19 01:26:06 1998 Matthias Klose * NSCharacterSets/Makefile.postamble: Use macro MKDIRS. * NSTimeZones/Makefile.postamble: likewise * src/Makefile.postamble: likewise Sat Dec 19 10:45:58 1998 Adam Fedor * src/mframe/configure.in: Test for empty subdir (patch from Matthias Klose ). Fri Dec 18 14:39:46 1998 Matthias Klose * */*: include instead of . * src/Makefile.postamble: reflect this change in srcdir-include. Fri Dec 18 18:15:00 1998 Richard Frith-Macdonald Foundation.h: Added NSPathUtilities.h NSObject.h: Added GNUstep specific methods for describing a property-list to a stream. NSDate.h: Moved natural language methods to right place. NSObject.m: Added GNUstep specific extensions for describing a property-list to a stream, updated -description to spec. NSProxy.m: Tidied format and description method. NSArray.m: Added GNUstep specific extensions for describing a property-list to a stream. NSDictionary.m: ditto NSAttributedString.m: Tidied ([-replacementObjectForPortCoder:]) NSGAttributedString.m: ditto NSGCString.m: ditto NSGString.m: ditto NSString.m: ditto NSConcreteNumber.m: Added ([-replacementObjectForPortCoder:]) NSCoder.m: Cope nicely with encode/decode of nil property-list. Thu Dec 17 16:12:18 1998 Matthias Klose * {,*}/GNUmakefile: Include Version and GNUmakefile.local where missing. * configure: Add links to GNUmakefile.local Thu Dec 17 14:30:00 1998 Richard Frith-Macdonald NSCoder.m: ([-decodePropertyList:]) bugfix - use NSDeserializer Thu Dec 17 9:30:00 1998 Richard Frith-Macdonald NSCalendarDate.m: Try to cope gracefully when locale info is not available and we want to display a date. Use numeric month and week designations and hard-code am/pm NSUser.m: include NSProcessInfo.h Wed Dec 16 20:30:00 1998 Richard Frith-Macdonald Various modifications suggested by and . All untested. src/include/Port.h: ([+newForReceivingFromRegisteredName:fromPort:]) Additional method for DO through firewalls. src/include/NSConnection.h: Addittional method for DO through firewall ([+newRegisteringAtName:atPort:withRootObject:]) Additional method for DO through firewalls. src/NSTask.h: Updated to MacOS-X spec - accepts NSPipes. src/TcpPort.m: ([+newForReceivingFromRegisteredName:fromPort:]) Additional method for DO through firewalls. Removed obsolete name server code. src/NSConnection.m: Addittional method for DO through firewall ([+newRegisteringAtName:atPort:withRootObject:]) src/NSTask.m: Updated to MacOS-X spec - accepts NSPipes. Tue Dec 15 13:25:10 1998 Adam Fedor * src/NSUser.m (NSFullUserName): New function (not implemented). (NSStandardApplicationPaths): Likewise. (NSStandardLibraryPaths): Likewise. (NSTemporaryDirectory): New function (implemented). (NSOpenStepRootDirectory): Likewise. * src/include/NSPathUtilities.h: Defined new functions. * src/include/NSUserDefaults.h: Removed duplicate definitions. Mon Dec 14 6:30:00 1998 Richard Frith-Macdonald * src/GNUmakefile: Put mframe.h in a machine/os specific directory. * src/Makefile.postamble: Install mframe.h in machine/os specific dir * src/NSConnection.m: include mframe.h form new location. * src/NSInvocation.m: ditto * src/NSMethodSignature.m: ditto * src/NSObjCRuntime.m: ditto * src/NSSerializer.m: ditto * src/mframe.m: ditto Sat Dec 12 21:10:00 1998 Richard Frith-Macdonald src/NSUserDefaults.m: ([+standardUserDefaults]) set flag to avoid infinite recursion on initialisation. Error reported by Matthias Klose Sat Dec 12 17:40:00 1998 Richard Frith-Macdonald * src/include/GSConfig.h.in: Added new file for machine/os specific info that is relevent to things outside the base library. * configure.in: Build GSConfig.h * configure: Build GSConfig.h * src/GNUmakefile: Move GSConfig.h into place * src/Makefile.postamble: Install GSConfig.h * src/include/NSByteOrder.h: include GSConfig.h Sat Dec 12 15:40:00 1998 Richard Frith-Macdonald * Tools/Makefile.postamble: Added check that you are installing gdomap as root and output warnign if not. Mon Dec 7 10:00:34 1998 Adam Fedor * src/NSConcreteNumber.m ([NumberTemplate -descriptionWithLocale:]): Print BOOL value as a special case. * src/NSProcessInfo.m: Use fake-main if FreeBSD. * src/include/fake-main.h: Likewise. Sun Dec 6 20:30:00 1998 Richard Frith-Macdonald * src/NSDate.m: removed +initialize - moved default locale info to NSUserDefaults. * src/NSUserDefaults.m: Added code to set up default locale info. Thu Dec 3 16:30:00 1998 Richard Frith-Macdonald * src/NSDictionary.m: Removed filesystem methods - conflict with versions in NSFileManger. * src/include/NSDictionary.h: Ditto * src/NSFileManager.m: Updated dictionary access methods to MacOS spec * src/include/NSFileManager.h: Ditto. * src/include/NSUserDefaults.h: Made constant strings 'const'. * src/include/externs.m: Made constant strings 'const'. Thu Dec 3 11:00:46 1998 Adam Fedor * aclocal.m4: Add OBJC_CON_AUTOLOAD and OBJC_SYS_AUTOLOAD requirements to OBJC_SYS_DYNAMIC_LINKER test. Wed Dec 2 16:11:05 1998 Adam Fedor * src/NSDictionary.m (-fileGroupOwnerAccountName): New method. (-fileModificationDate): Likewise. (fileOwnerAccountName): Likewise. (filePosixPermissions): Likewise. (fileSize): Likewise. (fileSystemFileNumber): Likewise. (fileSystemNumber): Likewise. (fileType): Likewise. * src/include/NSDictionary.h: New methods. Contributed by Camile TROILLARD . Wed Dec 2 20:30:00 1998 Richard Frith-Macdonald * src/GNUmakefile: Added NSDateFormatter * src/Makefile.postamle: Bugfix in installation - was adding service entries when not needed. * src/NSDate.m: Added natural language support. * src/NSDateFormatter.m: Implemented this class. * src/externs.m: Added natural language support. * src/include/Foundation.h: Added missing headers. * src/include/NSDate.h: Added natural language stuff. * src/include/NSDateFormatter.h: Contributed by Camile TROILLARD and updated to match implementation. * src/include/NSDecimalNumber.h: Added header (contributed by Camile) - no implementation yet. * src/include/NSDecimal.h: Added header - no implementation yet. * src/include/NSUserDefaults.h: Added natural language stuff. Tue Dec 1 09:31:59 1998 Adam Fedor * src/Makefile.postamble: new variable INSTALL_ROOT_DIR, such that /etc/services can be installed somewhere (need this for building Debian binary packages). Patch from Matthias Klose . Mon Nov 30 10:20:00 1998 Richard Frith-Macdonald * src/NSTask: Minor bugfix -ignore SIGCHLD * src/NSUserDefaults: bugfix in registerDefaults: was replacing rather than addning defaults. Also changed to cache dictionaryRepresaentation. * src/include/NSUserDefaults.h: Added ivar to cache dictionary representation. * src/include/NSDate.h: Updated header for a couple of fixes. * src/NSDate.m: Initialise locale stuff. * src/NSCalendarDate.m: Use locale stuff. Fri Nov 27 21:30:00 1998 Richard Frith-Macdonald * src/NSPortNameServer.m: ([_open]) changed to stop attempts to restart the name server when a connect to ANOTHER host fails. Also improved log messages to identify the host we failed to connect to. Also added support for overriding the default port fo the name server. * Tools/gdomap.h: updated comments to talk about NSPortNameServer.m Fri Nov 27 13:45:00 1998 Richard Frith-Macdonald * src/NSObjCRuntime.m: minor performance improvment. * src/NSUnarchiver.m: more performance improvements. * src/NSObject.m: Fix error introduced in last mod. Thu Nov 26 13:35:00 1998 Richard Frith-Macdonald * src/NSObject.m: ([+instanceRespondToSelector:]) and ([-respondsToSelector:]) changed to use __objc_responds_to() for an order of magnitude performance boost. Thu Nov 26 11:00:00 1998 Richard Frith-Macdonald * src/NSRunLoop.m: Bugfix in ([-addEvent:type:watcher:forMode:]) to get the count of numbers of time a watcher has added a descriptor correct. Wed Nov 25 16:27:52 1998 Adam Fedor * src/include/fast.x: Add #ifndef/#define around file. Wed Nov 25 20:45:00 1998 Richard Frith-Macdonald * src/NSPortNameServer.m: Made more tolerant of badly set up systems. * src/Makefile.postamble: Modified to make rule for placing gdomap in /etc/services more portable. Tue Nov 24 4:10:00 1998 Richard Frith-Macdonald * src/Tools/GNUmakefile: removed make_services * src/Tools/make_services.m: Removed - moved to gui library. * src/NSBundle.m: Changed Info.plist to Info-gnustep.plist since that's what GNUstep uses instead. Fri Nov 20 20:10:00 1998 Richard Frith-Macdonald * src/Makefile.postamble: Added dependencies for FastArray.x and added simple stuff to append gdomap port entries to /etc/services after install (if not already present). Fri Nov 20 14:30:00 1998 Richard Frith-Macdonald * src/NSSerializer.m: Added GNUstep specific methods for controlling format to optimise serialisation for property lists containing repeated strings. * src/include/NSSerializer.h: ditto * src/FastArray.x: inline implementation of fast array code for stuff that doesn't need to be retained etc. Minimal functionality so far. * src/Fastmap.x: Tidied indentation etc. * src/include/NSArchiver.h: Use FastArray * src/NSUnarchiver.m: Use FastArray * src/NSAutorleasePool.m: Optimize implementation of +new * src/NSArray.m: Use ([NSAutoreleasePool +new]) * src/NSDictionary.m: Use ([NSAutoreleasePool +new]) * src/NSFileManager.m: Use ([NSAutoreleasePool +new]) * src/NSPort.m: Use ([NSAutoreleasePool +new]) Thu Nov 19 21:30:00 1998 Richard Frith-Macdonald * src/Archiver.m: Got rid of 'assert' - replace with 'NSAssert' etc. * src/BinaryTree.m: ditto * src/Coder.m: ditto * src/Collection.m: ditto * src/ConnectedCoder.m: ditto * src/Invocation.m: ditto * src/LinkedList.m: ditto * src/MachPort.m: ditto * src/NSAutoreleasePool.m: ditto * src/NSBundle.m: ditto * src/NSConnection.m: ditto * src/NSCountedSet.m: ditto * src/NSDate.m: ditto * src/NSDistantObject.m: ditto * src/NSGArchiver.m: ditto * src/NSGSequence.m: ditto * src/NSObject.m: ditto * src/NSPortCoder.m: ditto * src/NSRunLoop.m: ditto * src/NSSet.m: ditto * src/NSTimer.m: ditto * src/NSZone.m: ditto * src/NotificationDispatcher.m: ditto * src/OrderedCollection.m: ditto * src/Port.m: ditto * src/Random.m: ditto * src/Storage.m: ditto * src/TcpPort.m: ditto * src/UdpPort.m: ditto * src/behavior.m: ditto * src/mframe.m: ditto Thu Nov 19 16:00:00 1998 Richard Frith-Macdonald * src/include/NSSerializer.h: Removed erroneous protocol conformance for NSSerializer and NSDeserializer. * src/NSSerializer.m: Complete rewrite - full OpenStep compatibility and huge speed increase. * doc/todo.tmpl.texi: Update todo list. * checks/benchmark.m: Added benchmarks for serializing/deserializing property lists and archiving/unarchiving them. * src/NSString.m: Fix bug returning arrya in completePathIntoString Thu Nov 19 12:30:00 1998 Richard Frith-Macdonald * src/NSData.m: ([-encodeWithCoder:]) bugfix for case where data object is of length zero. Wed Nov 18 9:20:00 1998 Richard Frith-Macdonald * Tools/make_services.m: New tool * Tools/GNUmakefile: Added make_services * Tools/Makefile.postamble: Tidied installation for gdnc * src/NSDistributedNotificationCenter.m: Start server with full path. Mon Nov 16 14:29:35 1998 Adam Fedor * src/NSBundle.m [+allBundles]: New method (unimplemented). [+allFrameworks]: Likewise. * src/NSCharacterSet.m [+punctuationCharacterSet]: Likewise. * src/NSLock.m [-lockBeforeDate:]: Likewise. [-lockWhenCondition:beforeDate:]: Likewise. * src/NSConnection.m: Likewise. * src/include/NSBundle.h: New methods; * src/include/NSCharacterSet.h: Likewise. * src/include/NSLock.h: Likewise. * src/include/NSConnection.h: Likewise (fixes from TROILLARD Camille ). * src/include/fast.x: Fix /* in comment. Thu Nov 12 17:30:00 1998 Richard Frith-Macdonald src/NSFormatter.m: New class src/include/NSFormatter.h: New class src/NSRunLoop.m: Misc optimisations src/NSGString.m: slight ([-cString]) optimisation. src/NSGCString.m: slight ([-cString]) optimisation. src/NSObject.m: fast allocation of temporary memory. src/include/fast.x: fast allocation of temporary memory. Tue Nov 10 11:00:00 1998 Richard Frith-Macdonald * src/NSScanner.m: ([-scanString:intoString:]) bugfix to check length of the string we are looking for and simply return NO if it is longer than the data remaining in the string being scanned. Previously it would have raised an exception - which it shouldn't. Mon Nov 9 20:45:00 1998 Richard Frith-Macdonald * src/externs.m: corrected notification name for user defaults. * src/NSUserDefaults.m: corrected notification name. * src/include/NSUserDefaults.h: corrected notification name. Mon Nov 9 11:30:00 1998 Richard Frith-Macdonald * src/externs.m: fixed error in hashtable constants. * src/NSDistributedNotificationCenter.m: pugfix in check for posting of notification. Changed to pass selectors as strings. * Tools/gdnc.h: Pass selectors as strings. make posting oneway * Tools/gdnc.m: Pass selectors as strings, plus many bugfixes. Mon Nov 2 17:30:00 1998 Richard Frith-Macdonald Tidied header files for NO_GNUSTEP/STRICT_OPENSTEP stuff. * src/NSDistributedNotificationCenter.m: New class (untested) * src/include/NSDistributedNotificationCenter.m: New class * src/GNUmakefile: Added NSDistributedNotificationCenter * src/Tools/gdnc.m: Server for distributed notifications (untested) * src/Tools/gdnc.h: Include for distributed notifications * src/Tools/GNUmakefile: Added gdnc Fri Oct 30 09:00:00 1998 Richard Frith-Macdonald * src/include/NSPortNameServer.h: Added ([-removePort:]) method in a GNUstep catagory so that ports can unregister all their names at one go. Added maps of names and ports to keep track. * src/include/Port.h: removed [-invalidate] - inherit from NSPort * src/Port.m: removed [-invalidate] - inherit from NSPort * src/NSPort.m: made [-invalidate] method remove all the ports names from the name server and send the invalidation notification. * src/NSPortNameServer.m: Keep track of name/port mappings and, the first time a name is registered for a port, tell gdomap to remove any pre-existing names for that port (left around from a crashed server perhaps). Thu Oct 29 13:30:00 1998 Richard Frith-Macdonald * src/UnixFileHandle.m: Improved handling of error conditions on background connection operations. Disable SIGPIPE to avoid abort when we attempt to write to a socket that's closed by the other end. * src/TCPPort.m: Modified to use NSPortNameServer, also changed to disable SIGPIPE on initialisation only, not on every write. * src/include/NSPortNameServer.h: new class. * src/NSPortNameServer.m: new class. * src/GNUmakefile: Added NSPortNameServer. Wed Oct 28 14:30:00 1998 Richard Frith-Macdonald * Tools/gdomap.c: Added command-line options to lookup, register, and unregister a name for a port - basically for debugging purposes. * src/TcpPort.m: Modified port registration code to cope with the case where a server dies and is restarted, and tries to use the same ip port number it has before it died. * checks/nsinvocation.m: Added archiving checks. * src/NSInvocation.m: Archiver bugfixes * src/include/NSInvocation.h: Archiver bugfixes * src/NSData.m: Serialisation bugfixes * src/NSArchiver.m: Archiver bugfixes * src/NSUnarchiver.m: Archiver bugfixes Tue Oct 27 08:45:00 1998 Richard Frith-Macdonald Corrected all the collection classes to return the count of objects in the collection as the ([-hash]) in conformance with the latest documentation. Mon Oct 26 10:30:00 1998 Richard Frith-Macdonald * src/NSGCString.m: Implemented ([-copy]) and ([-copyWithZone:]) to work without invoking any methods uing the runtime - much faster. * src/NSObject.m: Bugfix and performance improvement to the -perform... methods. They previously threw an exception if the method referred to by the selector was not implemented (when they should have tried forwarding instead) rather than when passed a nul selector. Sun Oct 25 08:00:00 1998 Richard Frith-Macdonald * src/NSObject.m: Cache implementation for adding object to autorelease pool to avoid objc runtime messaging overhead. * src/NSAutoreleasePool.m: Cache implementation for adding object to * src/NSAutoreleasePool.m: Cache implementation for adding object to autorelease pool to avoid objc runtime messaging overhead. * src/NSGCString.m: Implemented ([+allocWithZone:]) * src/NSGString.m: Implemented ([+allocWithZone:]) Sat Oct 24 11:30:00 1998 Richard Frith-Macdonald * src/NSArchiver.m: New implementation * src/NSArchiver.m: New file * src/GNUmakefile: Added NSUnarchiver.m * src/include/NSArchiver.h: New version New Archiver/unarchiver - OPENSTEP complient (I think). Basic functionality tested fairly thoroughly, some of the more unusual bits untested so far. Mechanisms for adding other backends in place, but untested. Performance may be around four times that of the old version though there is still a little (very little) room for improvement. Thu Oct 22 21:45:00 1998 Richard Frith-Macdonald * src/NSData.m: Added support for serialisation of Class and SEL types and made a more efficient version of the main deserialisation code in the NSDataStatic class. Wed Oct 21 13:30:00 1998 Richard Frith-Macdonald * src/NSData.m: Reorganized and optimised. * src/NSGArray.m: optimised coding/decoding * src/NSGCountedSet.m: optimised coding/decoding * src/NSGDictionary.m: optimised coding/decoding * src/NSGSet.m: optimised coding/decoding * src/NSObject.m: cache data classes * src/NSString.m: Added (nonstandard) ([-boolValue]) method * src/include/NSData.h: Added ([-relinquishAllocatedBytesFromZone:]) * src/include/NSString.h: Added (nonstandard) ([-boolValue]) method * src/include/NSPortMessage.h: Added (as yet unused) class. * src/NSPortMessage.m: Added (as yet unused) skeleton implementation. Thu Oct 17 08:15:00 1998 Richard Frith-Macdonald * src/NSGDictionary.m: Added checks for invalid parameters. * src/NSGSet.m: Added checks for invalid parameters. * src/NSGCountedSet.m: Added checks for invalid parameters. Thu Oct 15 08:13:12 1998 Masatake Yamato * src/NSString.m ([NSString -completePathIntoString:caseSensitive:matchesIntoArray:filterTypes:]): Implement. Thu Oct 15 06:15:00 1998 Richard Frith-Macdonald * src/BinaryCStream.m: Update system version number * src/NSCalendarDate.m: Implemented ([-copyWithZone:]) * src/NSCountedSet.m: Rewrite ([-copyWithZone:]) * src/include/NSData.h: Added GNUstep specific method for more efficient zone use. * src/NSData.m: Modified throughout to use NSZone functions for managing content memory. * src/NSGArray.m: Modified to use NSZone functions for managing content memory. Also tidied coding methods. * src/include/NSGCString.h: Modified to use NSZone for contents. * src/NSGCString.m: Modified to use NSZone for contents and fixed bug in coding (couldn't cope with embedded nuls in string). * src/NSGDictionary.m: Modified to use NSZone for contents. * src/include/NSGString.h: Modified to use NSZone for contents. * src/NSGString.m: Modified to use NSZone for contents. * src/NSObject.m: Added fastZone() function. * src/PortCoder.m: Updated system version number * src/include/NSSet.h: Added ([+setWithSet:]) * src/NSSet.m: Added ([+setWithSet:]) and fixed ([-copyWithZone:]) * src/include/NSString.h: Added GNUstep specific methods for faster use of zones. * src/NSString.m: Modified to use NSZone functions for contents. * src/include/NSZone.h: Removed non-existent methods and changed structure layout to support NSZoneFromPointer() * src/NSZone.m: Rewrite to support NSZoneFromPointer(), NSRecycleZone() and fix a couple of bugs. Needs more work to make simpler and more efficient. * src/include/fast.x: Added fastZone() Wed Oct 14 11:29:11 1998 Masatake Yamato * src/NSString.m ([NSString -stringByResolvingSymlinksInPath]): Implement. Wed Oct 14 10:27:47 1998 Masatake Yamato * src/NSString.m ([NSString +pathWithComponents:]): Use the first object of components as the base path string instead of null string([NSString string]). Tue Oct 13 09:24:17 1998 Adam Fedor * src/include/NSNotification.h: Addd placeholder in NSNotificationCenter for size of NotificationDispatcher. The Oct 8 15:15:00 1998 Richard Frith-Macdonald * src/FastMap.x: Minor bugfixes and updates. * src/NSArray.m: Optimisation - don't use malloc unless really needed. * src/NSCountedSet.m: Tidied * src/NSSet.m: Tidied - core/non-core separation made. * src/NSGArray.m: Rewrite - simpler and faster. * src/NSGCountedSet.m: Rewrite to use FastMap (and work). * src/NSGDictionary.m: Tidied initialisation. * src/NSGSet.m: Rewrite to use FastMap - much faster. * src/include/NSSet.h: tidied - core/non-core stuff. Tue Oct 6 16:35:48 1998 Adam Fedor * aclocal.m4: Add win32 test * configure.in: Use DYNAMIC_LINKER test. * src/GNUmakefile: Add win32-load.h * src/win32-load.h: New file. Tue Oct 6 16:45:00 1998 Richard Frith-Macdonald * src/FastMap.x: New map table for dictionaries. * src/include/fast.x: New stuff for avoiding objc message overheads. * src/NSGCString.m: Hashing and comparison performance improvments * src NSGDictionary.m: Optimisation * src NSGString.m: Optimisation * src/NSObject.m: Optimisation * src/NSString.m: Optimisation Sat Oct 3 23:00:00 1998 Richard Frith-Macdonald * src/NSString.m: Moved NXConstantString stuff out to NSGCString.m * src/NSGCString.m: Added NXConstantString (inherits from NSGCString) and modified for efficient ([-isEqual:]) and ([-isEqualToString:]) methods. Thu Sep 30 17:45:00 1998 Richard Frith-Macdonald More performance work - huge improvement in dictionary lookup and perhaps 15 percent improvement elsewhere. * src/NSString.m: ([-hash]) changed hash generation to produce a more evenly distributed value so that dictionary lookup works better for large dictionaries full of similar keys. * src/NSDictionary.m: ([+dictionaryWithObjectsAndKeys:,...]) fixed memory leak. * src/include/NSGDictionary.h: Removed - not needed. * src/NSGDictionary.m.old: Backup added. * src/NSGDictionary.m: Complete rewrite. * src/FastMap.x: New map table stuff for NSGDictionary. Thu Sep 30 7:00:00 1998 Richard Frith-Macdonald Changes to slightly more than double the speed of dictionary lookups for string keys. * src/NSGString: Added efficient -isEqual and -isEqualToString * src/NSGCString: Speeded up -isEqual and -isEqualToString Thu Sep 30 4:40:00 1998 Richard Frith-Macdonald * src/NSAutoreleasePool: Added NSLog to ([+addObject:]) to warn when an object is autoreleased without a pool being present. This should avoid many mistakes by newbies who don't understand the retain/release/autorelease mechanism (perhaps it'll encourage them to read up about it). It also serves as a useful reminder when you DO know what you are doing. Wed Sep 30 14:35:00 1998 Richard Frith-Macdonald * Removed MallocAddress class - use ([NSData +dataWithBytesNoCopy:length:]) instead. * src/NSConnection.m: ([-forwardForProxy:selector:argFrame:]) modifield to cope better when passed a selector without types. * src/Encoder.m: Modified to encode selector without type if needed. * Tools/dwrite.m: Removed references to cStringNoCopy * src/BinaryTree.m: Removed references to cStringNoCopy * src/Collection.m: Removed references to cStringNoCopy * src/Encoder.m: Removed references to cStringNoCopy * src/KeyedCollection.m: Removed references to cStringNoCopy * src/MemoryStream.m: Removed references to cStringNoCopy * src/NSCalendarDate.m: Removed references to cStringNoCopy * src/NSData.m: Removed references to cStringNoCopy * src/NSGCString.m: Removed references to cStringNoCopy * src/NSGString.m: Removed references to cStringNoCopy * src/NSHashTable.m: Removed references to cStringNoCopy * src/NSLog.m: Removed references to cStringNoCopy * src/NSMapTable.m: Removed references to cStringNoCopy * src/NSPortCoder.m: Removed references to cStringNoCopy * src/NSString.m: Removed references to cStringNoCopy * src/NSTimeZone.m: Removed references to cStringNoCopy * src/NSUser.m: Removed references to cStringNoCopy * src/NSZone.m: Removed references to cStringNoCopy * src/StdioStream.m: Removed references to cStringNoCopy * src/Stream.m: Removed references to cStringNoCopy * src/TextCStream.m: Removed references to cStringNoCopy * src/UdpPort.m: Removed references to cStringNoCopy * src/UnixFileHandle.m: Removed references to cStringNoCopy * src/lex.pl.m: Removed references to cStringNoCopy * src/lex.sf.m: Removed references to cStringNoCopy * src/mframe.m: Removed references to cStringNoCopy * src/o_hash.m: Removed references to cStringNoCopy * src/o_x_base.m.in: Removed references to cStringNoCopy Tue Sep 29 13:05:00 1998 Richard Frith-Macdonald * src/include/Foundation.h: Added some missing files. * src/NSDistantObject.m: Fixed ([-methodSignatureForSelector:)] Mon Sep 28 17:02:33 1998 Adam Fedor * src/include/NSObject.h (-perform:, -perform:withObject:, -perform:withObject:withObject:): Remove definitions (use performSelector:... instead. (+class, +superclass, +setVersion:, +version): Add. Rearrange some other method definitions. * src/include/NSProxy.h: Likewise. * src/NSObject.m (+class): Add. (-perform:, -perform:withObject:, -perform:withObject:withObject:): Depreciate these methods. * src/Proxy.m: Likewise. * src/Collection.m: Use performSelector instead of perform. * src/IndexedCollection.m: Likewise. * src/NSArray.m: Likewise. * src/NSRunLoop.m: Likewise. * src/NSSet.m: Likewise. * src/NSTimer.m: Likewise. * src/NotificationDispatcher.m: Likewise. * src/NSException (-initWithCoder:): Fix object decoding. Fri Sep 18 10:20:55 1998 Adam Fedor * src/include/preface.h.in (MIN, MAX): Rewrite macros (suggestion from Tom Hageman . Thu Sep 10 06:05:00 1998 Richard Frith-Macdonald * src/NSFileHandle.m: Implemented [(-waitForDataInBackground]) * src/UnixFileHandle.m: Implemented [(-waitForDataInBackground]) * src/include/NSFileHandle.h: Added [(-waitForDataInBackground]) * src/externs.m: Fixed error in hash callbacks name. * src/Set.m: Fixed error in hash callbacks name. * src/include/NSHashTable.h: Fixed error in hash callbacks name. * src/NSRunLoop.m: minor efficiency hack - don't use autoreleasing arrray construction methods when we are going to retain immediately. Fri Sep 04 08:05:00 1998 Richard Frith-Macdonald * src/NSUserDefaults.m: ([-setObjectsforKey:], [-removeObjectForKey:]) fixed to make domain dictionarys mutable if required. * src/externs.m: Updated notification name for defaults. * src/include/NSUserDefaults.h: Updated notification name. Mon Aug 31 16:28:58 1998 Adam Fedor * src/NSBundle.m (+mainBundle:): Remove *_obj directory to find main bundle path. Wed Sep 02 14:15:00 1998 Richard Frith-Macdonald * src/Coder.m: ([-decodeObject:]) fixed to autorelease as it should. * src/NSCalendarDate.m, src/NSException.m, src/NSGAttributedString.m, src/NSHost.m, src/NSLog.m, src/NSProcessInfo.m, src/NSTimeZone.m: tidied coding/decoding and logging. * src/NSString.m: Added implementation of [-zone] for constnat strings. Wed Sep 02 13:15:00 1998 Richard Frith-Macdonald * src/NSRunLoop.m: ([-cancelPerformSelector:target:argument:]) bugfix supplied by masata-y@is.aist-nara.ac.jp - was incrementing loop index when should have been decrementing. Mon Aug 24 09:22:17 1998 Adam Fedor * doc/gnustep-base.tmpl.texi: Fix up doc problems. * doc/todo.tmpl.texi: Likewise. Thu Aug 20 11:50:23 1998 Adam Fedor * src/mframe.m (mframe_next_arg): Fixes from Richard Frith-Macdonald . Tud Aug 13 21:15:00 1998 Richard Frith-Macdonald Rewrite of maframe stuff and associated things to get DO and NSInvocations working for ALL data types. Configuration files for GNU/Linux on a PC and sunos4.1.3 on sparc provided (and tested). * src/NSObject: Fixed code to local reference counts to get object alignment right on machines that have strict restrictions on the alignment of doubles (eg sparc). Also updated forwarding of invocations to work with new code. * src/NSInvocation.m: Rewrite from scratch to use new mframe code. * src/NSMethodSignature.m: Rewrite from scratch to use new mframe code. * src/mframe.m: Modified to use new information set up by config * configure.in: Run configure in src/mframe * src/mframe: New configuration directory for mframe stuff. * src/include/mframe.h: Deleted - now generated by config process. Wed Aug 12 14:55:00 1998 Richard Frith-Macdonald * src/NSBundle: ([+initialize]) modified to take account of the environment variables GNUSTEP_TARGET_DIR, GNUSTEP_TARGET_CPU, GNUSTEP_TARGET_OS, and LIBRARY_COMBO to override the defaults. Fri Aug 4 10:55:00 1998 Richard Frith-Macdonald * src/GNUmakefile: Removed NSAllocateObject.m and NSDeallocateObject.m (contents merged into NSObject.m). * src/NSObject.m: Modified to perform storage of retain counts local to the objects concerned in order to speed up performance - also modified to cache an objects zone with it - in order to maintain (or better) current performance when we get the NSZone code fixed to work with malloced memory. * src/include/NSObjCRuntime.h: Removed NSDebugLog() * src/include/NSDebug.h: Added new version of NSDebugLog() * src/include/NSProcessInfo.h: Added [-debugArray] method. * src/NSProcessInfo.m: Added [-debugArray] method and modified to parse arguments list and remove debug options, putting them in a mutable array (returned by [-debugArray]). * src/externs.m: Removed NSDebugLogging. * src/NSBundle.m: Modified to use new version of NSDebugLog(). Thu Aug 3 15:35:00 1998 Richard Frith-Macdonald * src/include/NSGCString.h: Added _hash instance variable. * src/include/NSGString.h: Added _hash instance variable. * src/NSGCString.m: Added implementation of [-hash] to handle caching of strings hash value, also added implementation of a few other methods for the sake of performance. Modified NSGMutableCString methods to reset hash cache when string is modified. * src/NSGString.m: Added implementation of [-hash] to handle caching of strings hash value. Modified NSGMutableString methods to reset hash cache when string is modified. * src/NSString.m: Misc performance hacks - use alloca() rather than malloc/free where possible etc. YMMV, but the above changes got me a 20% performance improvement in the app I was working with. * src/o_map.m: Don't use o_map_key_callbacks() - access the field in the structure directly to avoid the function-call overhead as this function was being called LOTS of times. Only a tiny performance improvement - but every little helps. Thu Jul 30 16:00:00 1998 Richard Frith-Macdonald * src/include/NSSet.h: Corrected protocol conformance * src/NSSet.m: Added ([-encodeWithCoder:]), ([-initWithCoder:]). Fixed ([-copyWithZone:]) to remove memory and to simply retain where possible. Implemented ([-description]) and ([-descriptionWithLocale:]). * src/NSGCountedSet.m: Removed ([-initWithCapacity:]) and fixed enumerator. * src/include/NSDictionary.h: Added ([+dictionaryWithObject:forKey:]) and corrected protocol conformance. * src/NSDictionary.m: Added ([+dictionaryWithObject:forKey:]) Wed Jul 29 15:00:00 1998 Richard Frith-Macdonald * src/Collection.m: Removed [-copy] * src/include/Collecting.h: likewise * src/NSAttributedString.m: fixed ([-copy]) and ([-isEqual:]) * src/NSCharacterSet.m: implemented (inefficiently) ([-isEqual:]) Wed Jul 29 9:10:00 1998 Richard Frith-Macdonald * src/TcpPort.m: typecast to get rid of warning * src/NSCharacterSet.m: Added NSCoding methods. * src/NSBitmapCharSet.m: Added NSCoding methods. * src/NSHost.m: typecast to get rid of warning. * src/NSData.m: ([-copy]) removed. * src/NSDictionary.m: ([-copy]) removed. * src/NSGSequence.m: ([-copy]) removed. * src/NSScanner.m: ([-copy]) removed. * src/NSArray.m: ([-copy]) removed. * src/NSAttributedString.m: ([-copy]) removed. * src/NSString.m: ([-copy]) removed. * src/NSObject.m: ([-copyWithZone:]) modified to conform strictly to Rhapsody docs. Added ([+instanceMethodSignatureForSelector:]). * src/include/IndexedCollectionPrivate.h: fixed include for NSString.h * src/Makefile.postamble: modified rule for building srcdir-include stuff so that it works for me. * src/NSException.m: ([-copyWithZone:]) typecast to get rid of warning. * src/NSValue.m: ([-copyWithZone:]) typecast to get rid of warning. * src/NSDistantObject.m: fixed ([-classForPortCoder]) for Protocol. Tue Jul 28 12:57:54 1998 Adam Fedor * src/GNUmakefile: Remove NEXTSTEP classes. * src/NSConcreteNumber [-copy]: Removed. [-copyWithZone:]: Likewise. * src/NSNumber: [-copy]: Implement [-copyWithZone:]: Likewise. * src/NSDate.m [-copyWithZone:]: Correct implementation. * src/NSException.m [-copyWithZone:]: Likewise. * src/NSPort.m: [-copyWithZone:]: Likewise. * src/NSValue.m: [-copyWithZone:]: Likewise. Tue Jul 21 09:15:32 1998 Adam Fedor * src/GNUmakefile: Removed redundant classes. * src/Connection: Removed. * src/Lock: Likewise. * src/Notification: Likewise. * src/Proxy: Likewise. * src/include/Connection.h, src/include/Lock.h, src/include/Notification.h, src/include/Proxy.h: Likewise. * src/include/RetainingNotifier.h: Removed. * src/libgnustep-base.def: Removed reference to redundant classes. * src/include/ConnectedCoder.h: Likewise * src/include/NSConnection.h: Likewise * src/include/NSNotification.h: Likewise * src/include/NSPort.h: Likewise * src/include/all.h: Likewise * src/ConnectedCoder.m: Likewise * src/Makefile.postamble: Likewise * src/MachPort.m: Likewise * src/NSConnection.m: Likewise * src/NotificationDispatcher.m: Likewise * src/NSNotification.m: Likewise * src/Port.m: Likewise * src/TcpPort.m: Likewise * src/behavior.m: Likewise * src/NSThread.m: Likewise * src/UdpPort.m: Likewise * examples/first-client.m, examples/first-server.h, examples/first-server.m, examples/second-client.h, examples/second-client.m, examples/second-server.h, examples/second-server.m: Removed. * src/NSRunLoop.m: Add time.h (For GNU/Linux-2.0) * src/TcpPort.m: Likewise. * src/UdpPort.m: Likewise. * sec/UnixFileHandle.m: Likewise. Wed Jul 20 21:25:00 1998 Richard Frith-Macdonald * src/Decoder.m: ([-decodeClass]) modified to ensure correct decoding instances of classes relying on multiple inheritance. Tue Jul 14 16:26:36 1998 Adam Fedor * src/Makefile.postamble (gnustep/base): Fixup dir creation. (Foundation): Likewise. * src/externs.m: New NSDebugLogging variable. * src/include/NSObjCRuntime: Change NSDebugLog so it works when DEBUG is defined and NSDebugLogging is set. * src/NSBundle.m: Use it. * src/include/Foundation.h: Include NSTimer.h * src/include/NSObject.h: Define +instanceMethodSignatureForSelector: Tue Jul 14 10:06:31 1998 Masatake Yamato * checks/nsset.m : Added new testing functions. (intersects_set_test): Likewise. (is_subset_of_set_test): Likewise. * src/include/NSSet.h ([NSSet -setWithObjects:]): Remove the type declaration of arguments, "NSArray *". The arguments should be declared as id. * src/NSSet.m ([NSSet -isSubsetOfSet:otherSet]): Implement. ([NSSet -intersectsSet:otherSet]): Likewise. Wed Jul 15 12:45:00 1998 Richard Frith-Macdonald * src/Invocation.m: Rewrote ([-invoke]) to retrieve return values correctly by using mframe_decode_return() * src/NSCharacterSet.m: Fixed ([-copyWithZone:]) to avoid using the (non-existant) NSObject method. * src/NSFileHandle.m: Modified method for making socket connections and added a synchronous version. * src/NSObjCRuntime.m: Tidied and added NSGetSizeAndAlignment(). * src/NSObject.m: Removed ([-copyWithZone:]) and ([-mutableCopyWithZone:]) (which shiould not exist in NSObject). * src/NSString.m: Fixed implementation of the ([-rangeOfCharacterFromSet:options:range:]) method. * src/UnixFileHandle.m: Various bug fixes for synchronous operations. * src/mframe.m: Added mframe_decode_return() function to get the return value out of a retframe. * src/include/NSCharacterSet.h: Modified to say we conform to the NSCoding protocol (whith the spec says we should). * src/include/NSFileHandle.h: Altered methods for making a network call. * src/include/NSObjCRuntime.h: Added NSGetSizeAndAlignment(). * src/include/NSObject.h: Removed stuff saying we conform to the NSCoding and NSCopying protocols (we shouldn't) and removed the ([-copyWithZone:]) and ([-mutableCopyWithZone:]) methods - which shouldn't be there. * src/include/UnixFileHandle.h: Altered methods for making a network connection. * src/include/mframe.h: Added mframe_decode_return() function. Tue Jul 14 16:06:16 1998 Masatake Yamato * checks/invocation_*.m : New test files. * checks/invocation2.m: Removed the file. * src/include/NSInvocation.h (NS_INVOCATION, NS_MESSAGE): Added new arguments to the macros. These macros don't require SEL type argument to specify the method to invoke now. * checks; Added invocation_char.m, invocation_short.m, invocation_int.m and invocation_long.m Fri Jul 10 21:43:30 1998 Adam Fedor * src/include/GapArrayPrivate.h (gapMoveGaptTo): Change - to +. * docs/todo.tmpl.texi: Updates Fri Jun 25 20:45:00 1998 Richard Frith-Macdonald * src/TcpPort.m: Improved debug code and added method to turn it on - ([+setDebug:]) * src/NSConnection.m: Changed code so that if a process sends us a 'release' for an object local to us, which it vended to a third party, we retain the object for 30 seconds before releasing it in order to give the third party time to connect to us and retain it. Improved debug code and added method to turn it on - ([+setDebug:]) * src/NSDistributedObject.m: Added flag to say whether an object has been vended to a third party. Improved debug code and added method to turn it on - ([+setDebug:]) * src/include/NSDistantObject.h: Added flag. Thu Jun 24 22:05:00 1998 Richard Frith-Macdonald * src/proplist.y: Make parser more tolerant - permit a comma after the final element in an array. * src/NSData.m: Added ([NSMutableData +data]) * src/Unicode.m: Efficiency hack for conversion to/from unicode * src/include/NSArray.h: Added ([-writeToFile:Atomically:]) * src/include/NSString.h: Added GSUndefinedEncoding and comment to make sure nobody deletes it - needed for efficiency hack in Unicode.m Fri Jun 19 13:37:37 1998 Adam Fedor * NSObject (+isKindOfClass:): New method (patch from Bruce Ide ). (+isMemberOfClass): Likewise. Tue Jun 16 09:48:18 1998 Adam Fedor * src/NSProtocolChecker.m, src/include/NSProtocolChecker.h: New files. (from Mike Kienenberger ) Fri May 29 10:16:09 1998 Adam Fedor * doc/news.tmpl.texi: Fixed typo. * doc/readme.tmpl.texi: Likewise. (patch from doko@cs.tu-berlin.de (Matthias Klose)). * src/ostream.m (ostream_save_buffer): Retain stream. * src/include/MemoryStream.h: Remove outdated methods. * src/include/NSException.h (NS_VALUERETURN): New macro. Thu May 28 10:45:00 1998 Richard Frith-Macdonald * Tools/gdomap.c: Added code to cope with systems where we can't determine what network interfaces are active. * checks/heap.m: Portability fix for svr4 systems. * configure.in: Improved portability to svr4 systems. * src/NSMethodSignature.m: Changed order of includes to fix compilation on svr4 systems. * src/NSPage.m: Altered to use 'sysconf(_SC_PAGESIZE)' to get page size on svr4 systems. * src/NSTask.m: Altered to use 'kill()' rather than 'killpg()' on svr4 * src/NSThread.m: Altered to use 'sleep()' rather than 'usleep()' on svr4 * src/include/config.h.in: Added a couple of configuration constants for portability - HAVE_KILLPG and HAVE_USLEEP Thu May 21 09:38:14 1998 Adam Fedor * src/NSUser.m (NSUserName): Use getpwuid for BSD machines (patch provided by Stefanos Kiakas ). * src/GetDefEncoding.c (GetDefEncoding): Change binary AND to logical AND. (GetEncoding): Likewise (patch provided by David Fritzsche ). Wed May 20 15:26:50 1998 Richard Frith-Macdonald * src/GNUmakefile: Added NSUndoManager.[hm] * src/Invocation.m: ([-_initArgframeFrom:withType:retainArgs:]) fixed memory leak due to failing to set 'args_retained' flag. * src/NSObject.m: ([-forward::]) modified to call (forwardInvocation:) method so we can conform to OpenStep spec. * src/NSUndoManager.m: Implementation of new class. * src/include/NSUndoManager.h: Interface for new class. Wed May 13 13:18:35 1998 Adam Fedor * src/NSArray.m ([NSArray -initWithContentsOfFile:]): Move definition from NSMutableArray. * NSBundle.m (+initialize): New method. (+mainBundle): Use recursive lock. (-initWithPath:) Likewise. * Unicode.m (encode_chartouni): Cast char to unsigned before to unichar (patch provided by David Fritzsche ). Fri May 1 14:26:50 1998 Masatake Yamato * src/mframe.m(mframe_do_call): before allocating a storage for returned structure, check stack_argsize. Mon Apr 27 15:45:00 1998 Richard Frith-Macdonald * src/include/mframe.h: Added three new functions to enable passing of pointers using the mframe routines. * src/mframe.m: Added mframe_dissect_call_opts(), mframe_do_call_opts(), and mframe_build_return_opts() so that we may pass pointers to and from functions in other languages rather than using the DO behaviour which is to copy a single object when given a pointer. Tue Apr 21 15:45:00 1998 Richard Frith-Macdonald * src/NSMethodSignature.m: ([+signatureWithObjCTypes:]) rewritten to use some macros from libFoundation (adapted from gcc) to handle creation of NSMethodSignature objects where the types string passed in does not contain the position information of the arguments. Thu Apr 16 13:45:00 1998 Richard Frith-Macdonald * checks/client.m: enable testing of DO strucuture return. * checks/server.m: fix typo in keyword * src/KeyedCollection.m: ([-decodeContentsWithCoder:]) fixed a memory leak. * src/mframe.m: Fixed a few bugs in returning structures - now works properly on GNU/Linux intel. Can anyone figure out how to handle all this stuff using autoconf? Mon Apr 20 09:23:58 1998 Adam Fedor * src/NSLock.m: Eliminate busy waiting from NSConditionLock * src/NSLock.h: add instance variable and rename "value" to support changes to NSConditionLock * src/NSLock.m: Raise appropriate exceptions * src/NSLock.m: Prevent NSLock and NSConditionLock from being locked recursively * src/NSThread.m: -sleepUntilDate: implemented * src/NSThread.m: remove calls to objc_get_thread_data except in currentThread message * src/BinaryCStream.m: Replace assert's with NS*Assert * src/CStream.m.orig: Likewise * src/Decoder.m: Likewise * src/Encoder.m: Likewise * src/MemoryStream.m: Likewise * src/RawCStream.m: Likewise * src/TextCStream.m: Likewise * src/ostream.m.orig: Likewise (patches from Quetzalcoatl Bradley ). * src/NSFileManager.h: Include pwd.h if we have it * configure.in: Check for pwd.h * configure: regenerate. * src/include/config.h.in: Likewise. Wed Apr 15 09:54:25 1998 Adam Fedor * src/NSFileManager.m ([NSFileManager -fileAttributesAtPath:traverseLink:]): Add NSFileOwnerAccountName. * src/externs.m: Add NSFileOwnerAccountName definition. (patch provided by Marcus Mueller ) * src/NSThread.m (-sleepUntilDate:): Implemented (from Quetzalcoatl Bradley ). Sun Apr 5 20:07:28 1998 Scott Christley * Utilize documentation rules in Makefile Package. * doc/GNUmakefile: Rewrite to use Makefile Package. * doc/Makefile.postamble: Remove old obsolete rules. * Documentation which covers GNUstep as a whole versus just gstep-base has been moved to the top level Documentation dir. * GNUstep-HOWTO: Delete. * doc/gnustep-base.tmpl.texi: GNUstep-HOWTO and FAQ removed. Add variable so that included files know they are within the main document. * doc/gnustep-howto.tmpl.texi: Delete. * doc/faq.tmpl.texi: Delete. * doc/announce.tmpl.texi: Don't include version.texi needlessly. * doc/news.tmpl.texi: Don't include version.texi needlessly. * doc/todo.tmpl.texi: Don't include version.texi needlessly. * src/GNUmakefile: Don't compile Random class as the name too often conflicts with user apps. * src/GetDefEncoding.m: Reformat. * src/NSArray.m (-replaceObjectsInRange:withObjectsFromArray:): Fix range check. Use enumerator instead of count. Wed Apr 1 18:45:00 1998 Richard Frith-Macdonald * Tools/gdomap.m: Modified code so that we make sure we have at least one valid route to any gdomap process which has probed us. This is to cope with machines which send out info about all their interfaces when one or more of the interfaces is not working. * src/checks/nstask.m: added test for environment setting. * src/NSCalendarDate.m: Fixed bug in initialisation where daylight savings time is in operation - was adjusting in wrong direction. * src/NSRunLoop.m: Added NSObject catagory for the methods - ([NSObject +cancelPreviousPerformRequestsWithTarget:selector:object:]), ([NSObject -performSelector:withObject:afterDelay:]), and ([NSObject -performSelector:withObject:afterDelay:inModes:]) * src/NSTask.m: Various bug fixes as a result of running the test suite. All seems to work ok now. * src/NSDate.h: Changed order of declaractions so this can be included within NSObject.h * src/NSObject.h: Added run-loop integration methods - ([NSObject +cancelPreviousPerformRequestsWithTarget:selector:object:]), ([NSObject -performSelector:withObject:afterDelay:]), and ([NSObject -performSelector:withObject:afterDelay:inModes:]) * src/NSRunLoop.h: Added an instance variable to keep track of queued delayed actions to be performed on objects. Tue Mar 31 11:32:03 1998 Adam Fedor * aclocal.m4 (OBJC_CON_AUTOLOAD): Improved test. Check nm output for indicator functions. * configure: Regenerate. * checks/GNUmakefile (LoadMe_RESOURCE_FILES): Changed name. * doc/gnustep-howto.tmpl.texi: Update. * doc/status.tmpl.texi: Likewise. Fri Mar 20 11:15:00 1998 Richard Frith-Macdonald * checks/client.m: Added some tests for passing objects byref * checks/server.h: Added ([-sendByref:]) to protocol. * checks/server.m: Added ([-sendByref:]) for testing 'byref'. * src/Coder.m: Added ([-encodeByrefObject:]) * src/Encoder.m: Added ([-_doEncodeByrefObject:]) and changed the designated encoding method throughout from ([-_encodeObject:withName:isBycopy:isForwardReference:]) to ([-_encodeObject:withName:isBycopy:isByref:isForwardReference:]) * src/NSCoder.m: Added ([-encodeBytes:length:]), ([-encodeByrefObject:]) and ([-decodeBytesWithReturnedLength:]) * src/NSConnection.m: Modified ([-forwardForProxy:selector:argFrame:]) and ([-_service_forwardForProxy:]) methods to handle byref flag. * src/NSDictionary.m: Added ([+dictionaryWithDictionary:]) * src/NSPortCoder.m: Added ([-isByref]) and ([-_doEncodeByrefObject:]) methods and modified ([-_doEncodeBycopyObject:]) to handle byref flag. * src/include/Coding.h: Added ([-encodeByrefObject:]) * src/include/NSCoder.h: Added ([-encodeBytes:length:]), ([-encodeByrefObject:]) and ([-decodeBytesWithReturnedLength:]) * src/include/NSDictionary.h: Fixed prototype for the ([+dictionaryWithDictionary:]) method. * src/include/NSPortCoder.h: Added ([-isByref]) * src/objc-gnu2next.m: Added _F_BYREF flag code Fri Mar 13 15:05:00 1998 Richard Frith-Macdonald * src/NSCalendarDate.m: ([-descriptionWithCalendarFormat:locale:]) Fixed bug in displaying time-zone - was displaying minutes and seconds when should have been showing hours and minutes. Wed Mar 11 11:56:00 1998 Richard Frith-Macdonald * src/NSArray.m: ([-copyWithZone:]) changed to use the NSShouldRetainWithZone() function. * src/NSCalendarDate.m: ([-dealloc]) don't release the timezone - we never retain it anyway (should we?) ([-setCalendarFormat:]) make a copy of the string we are given in case it gets changed or deleted. * src/NSConcreteNumber.m: ([-copyWithZone:]) fixed to use the NSShouldRetainWithZone() function. * src/NSData.m: ([-copyWithZone:]) fixed to use the NSShouldRetainWithZone() function. * src/NSDictionary.m: ([-copyWithZone:]) fixed to use the NSShouldRetainWithZone() function. * src/NSHost.m: Added ([-awakeAfterUsingCoder:]) * src/NSNumber.m: Added ([-copy]) and ([-copyWithZone:]) * src/NSString.m: ([-copyWithZone:]) fixed to use the NSShouldRetainWithZone() function. * src/TcpPort.m: Commented out unnecessary warning message. * src/NSTimeZone.m: Modified ([-encodeWithCoder:]) and ([-awakeAfterUsingCoder:]) so that the local timezone is encoded specially and is restored as whatever the local timezone of the restoring application is. * src/NSValue.m: Added ([-copy]) and ([-isEqualToValue:]) Tue Mar 10 17:05:00 1998 Richard Frith-Macdonald * src/NSArray.m: ([-copyWithZone:]) rewritten to avoid doing unnecessary copy of non-mutable objects and to fix memory leak. * src/NSCTemplateValue.m: ([-isEqaul:]) and ([-isEqualToValue:]) implemented. * src/NSCalendarDate.m: ([-initWithCoder:]) and ([-encodeWithCoder:]) implemented. * src/NSConcreteNumber.m: ([-copy]) and ([-copyWithZone:]) implemented to do simple retains. * src/NSDictionary.m: ([-copyWithZone:]) rewritten to avoid doing unnecessary copy of non-mutable objects and to fix memory leak. * src/NSGString.m: ([-cString]) fixed crash when called on empty string. * src/NSTimeZone.m: ([-awakeAfterUsingCoder:]) implemented to handle decopding of archived objects correctly. * src/include/NSValue.h: Added ([-isEqualToValue:]) Copyright @copyright{} 2005 Free Software Foundation Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. gnustep-base-1.29.0/Documentation/000077500000000000000000000000001435650067400170235ustar00rootroot00000000000000gnustep-base-1.29.0/Documentation/.cvsignore000066400000000000000000000005401435650067400210220ustar00rootroot00000000000000=* version.tmpl.texi version.texi gnustep-base.info gnustep-base_toc.html gnustep-base_1.html gnustep-base_2.html gnustep-base_3.html gnustep-base_4.html gnustep-base_5.html gnustep-base_6.html CODING-STANDARDS STATUS TODO INSTALL NEWS README ANNOUNCE BUGS *.log *.dvi *.ps *.html *.info *.aux *.toc *.cp *.fn *.vr *.tp *.ky *.pg *.ps *.vrs *.cl *.pr gnustep-base-1.29.0/Documentation/Base.gsdoc000066400000000000000000001161161435650067400207240ustar00rootroot00000000000000 GNUstep Base $Revision$ $Date$ 2005 Free Software Foundation, Inc. Base

The GNUstep Base library is a free software package implementing the API of the OpenStep Foundation Kit (tm), including later additions. This documentation package describes the core of the Base library, for documentation on additional classes, see the BaseAdditions documentation package.

Read the Release Notes for the current release.

Compatibility

GNUstep is generally compatible with the OpenStep specification and with recent developments of the MacOS (cocoa) API. Where MacOS deviates from the OpenStep API, GNUstep generally attempts to support both versions. In some cases the newer MacOS APIs are incompatible with OpenStep, and GNUstep usually supports the richer version. See the OpenStep Compliance section for more information on OpenStep Compliance.

In order to deal with compatibility issues, GNUstep uses two mechanisms - it provides conditionally compiled sections of the library header files, so that software can be built that will conform strictly to a particular API, and it provides user default settings to control the behavior of the library at runtime.

Conditional compilation

Adding an option to a makefile to define one of the following preprocessor constants will modify the API visible to software being compiled -

GS_GNUSTEP_V Specifies the software version of the header being included.
Features in that header which are declared as having been introduced at or before the specified version, and not being removed until or after the specified version are available.
The version consists of five or six digits ... a major number (0-99) followed by a minor number (00-99) and a subminor number (00-99).
Features in the header file are marked as belonging to different version ranges using the GS_API_VERSION macro.
NB. This is the native versioning of the library being used via the header file. You can use this mechanism in your own libraries and frameworks.
GS_OPENSTEP_V Used only for the software version in sequence of OpenStep specification and the NeXT/Apple implementation of that specification and its extensions.
Features in the header being included which are declared as having been introduced at or before the specified version, and not being removed until or after the specified version are available.
The version consists of five or six digits ... a major number (1-99) followed by a minor number (00-99) and a subminor number (00-99).
A major number of 1 indicates the OpenStep specification ... available as the GS_API_OSSPEC preprocessor constant.
A major number of 4 indicates the OPENSTEP implementation ... available as the GS_API_OPENSTEP preprocessor constant.
A major number of 10 indicates the MacOS-X implementation ... available as the GS_API_MACOSX preprocessor constant.
Features in the header file are marked as belonging to different version ranges using the GS_API_VERSION macro.
For MacOS-X compatibility, if this constant is not defined and MAC_OS_X_VERSION_MAX_ALLOWED is defined, then GS_OPENSTEP_V is defined to be MAC_OS_X_VERSION_MAX_ALLOWED.
Similarly, for MacOS-X we define MAC_OS_X_VERSION_10_2, MAC_OS_X_VERSION_10_3 etc as the appropriate numeric version numbers.

NB These preprocessor constants are used in developer code (ie the code that users of GNUstep write) rather than by the GNUstep software itself. They permit a developer to ensure that he/she does not write code which depends upon API not present on other implementations (in practice, MacOS-X or some old OPENSTEP systems).
The actual GNUstep libraries are always built with the full GNUstep API in place, so that the feature set is as consistent as possible.

The presence of these macros is also used by autogsdoc to generate information about which version of the API a particular feature belongs to.

User defaults GNU-Debug

An array of strings that lists debug levels to be used within the program. These debug levels are merged with any which were set on the command line or added programmatically to the set given by the [NSProcessInfo-debugSet] method.

GSExceptionStackTrace

Setting the user default GSExceptionStackTrace to YES will cause the stack trace at the point when an exception occurs to be included as part of the text returned by the -description method of the exception.
That effect may also be obtained by setting the GNUSTEP_STACK_TRACE environment variable before starting a program.

GSLogSyslog

Setting the user default GSLogSyslog to YES will cause log/debug output to be sent to the syslog facility (on systems which support it), rather than to the standard error stream. This is useful in environments where stderr has been re-used strangely for some reason.
On mswindows, where syslog does not exist, this flag instead controls whether log/debug output is sent to the windows event log.

GSLogOffset

Setting the user default GSLogOffset to YES will cause NSLog and debug output to include the current time zone offset in the timestamp of the logged message.
This is useful when comparing logs from machines in different countries.

GSLogThread

Setting the user default GSLogThread to YES will cause NSLog and debug output to include the current thread name in the logged message.
This may be useful for debugging multi-threaded applications.

GSMacOSXCompatible

Setting the user default GSMacOSXCompatible to YES will cause MacOS compatible behavior to be the default at runtime. This default may however be overridden to provide more fine grained control of system behavior.

GSOldStyleGeometry

Specifies whether the functions for producing strings describing geometric structures (NSStringFromPoint(), NSStringFromSize(), and NSStringFromRect()) should produce strings conforming to the OpenStep specification or to MacOS-X behavior. The functions for parsing those strings should cope with both cases anyway.

GSSOCKS

May be used to specify a default SOCKS5 server (and optionally a port separated from the server by a colon) to which tcp/ip connections made using the NSFileHandle extension methods should be directed.
This default overrides the SOCKS5_SERVER and SOCKS_SERVER environment variables.

GSSortAlgorithm

May be used to specify the sort algorithm used for sorting arrays etc. The current options are QuickSort, ShellSort, and TimSort, with TimSort being the default.
NB. The QuickSort and ShellSort are 'unstable' algorithms, which means that the order of equal objects may be changed by a sort. Selecting these may break code which assumes that sorting is stable.

Local Time Zone

Used to specify the name of the timezone to be used by the NSTimeZone class.

NSWriteOldStylePropertyLists

Specifies whether text property-list output should be in the default MacOS-X format (XML), or in the more human readable (but less powerful) original OpenStep format.

Reading of property lists is supported in either format, but only if GNUstep is built with the libxml library (which is needed to handle XML parsing).

NB. MacOS-X generates illegal XML for some strings - those which contain characters not legal in XML. GNUstep always generates legal XML, at the cost of a certain degree of compatibility. GNUstep XML property lists use a backslash to escape illegal characters, and consequently any string containing either a backslash or an illegal character will be written differently to the same string on MacOS-X.

NSLanguages

An array of strings that lists the users preferred languages, in order or preference. If not found the default is just English.

Environment variables

There are some environment variables used by GNUstep base, where there would be problems obtaining data from the defaults system.

CRASH_ON_ABORT

The default exception handler will either cause the program to simply terminate, or to crash - leaving a core dump. The standard behavior is to leave a core dump if the library was built for debugging, and to simply exit if it was not.

The CRASH_ON_ABORT environment variable can be used to override this behavior. If this is defined to NO, FALSE, or 0 then the program will simply exit when an exception occurs. Any other value of the variable will cause the program to generate a core dump.

CRASH_ON_ZOMBIE

When the a message is sent to a zombie object (see the NSZombieEnabled environment variable) the base library allows you to specify whether the program should continue after logging the message, or have the program abort.
By default, the program will attempt to continue.

The CRASH_ON_ZOMBIE variable can be used to override this behavior. If this is defined to YES, TRUE, or 1 then the program will log the message sent to the zombie and then abort, producing a core dump on systems where that is possible.

GNUSTEP_SHOULD_CLEAN_UP

When this is set to YES, the GNUstep extension method +setShouldCleanUp: is called when the NSObject class is initialised, this turns on recording of some intentionally leaked memory (data structures intended to persist for the whole life of the process), and activates cleanup of that memory on process exit so that external tools such as valgrind will not report the memory as possibly lost.

Use of this facility is a work in progress ... many classes do not yet clean up after themselves when this is enabled.

GNUSTEP_STACK_TRACE

When this is set to YES a human readable stack trace (with function names and line numbers) is added to the output of the description method of a raised exception object.
NB. This behavior may also be enabled by setting the GSExceptionStackTrace user default to YES.
This only works if gnustep was built with support for it using libbfd, so it may not be available on all systems.

When this is set to NO the raw stack trace provided by [NSException-callStackReturnAddresses] is disabled.
The possible reasons for disabling this are:
1. that the feature is implemented using a function of the gcc compiler to provide stack addresses, and the function is buggy on some systems/compiler versions, and will cause a signal to be sent which would crash your program if not caught. The GNUstep code catches the signal and recovers using a signal handler, but there have been two reports of this not working with no known cause.
2. that you have code which uses exceptions in a way in which they were not designed to be used ... so that they are routinely and frequently called rather than being called only occasionally when exceptional conditions occur. In this case you may want to disable the stack frame generation implicit in each raised exception, in order to improve performance.

When this is not set, or is set to a non-boolean value, the stack trace handling on exceptions is MacOS-X compatible ... stack return addresses are available but a human readable trace back is not logged.

GNUSTEP_STRING_ENCODING

This is used to specify the default encoding for 8-bit strings (those used by 'cstring' methods of NSString).
It may be any of the 8-bit encodings supported by your system.

If this environment variable is not set, GNUstep attempts to use the characterset specified by your operating systems, locale information (using the standard nl_langinfo function) if possible.

If there is no usable operating system defined characterset, GNUstep defaults to NSISOLatin1StringEncoding.

GNUSTEP_HOST_CPU

Used in place of GNUSTEP_TARGET_CPU if the other is missing. Please do not use this to locate resources; for architecture dependent resources use GNUSTEP_TARGET_DIR.

GNUSTEP_HOST_DIR

Used in place of GNUSTEP_TARGET_DIR if the other is missing.

GNUSTEP_HOST_OS

Used in place of GNUSTEP_TARGET_OS if the other is missing. Please do not use this to locate resources; for architecture dependent resources use GNUSTEP_TARGET_DIR.

GNUSTEP_TARGET_CPU

Overrides the default value of the machine (hardware) name used on this system. Please do not use this to locate resources; for architecture dependent resources use GNUSTEP_TARGET_DIR.

GNUSTEP_TARGET_DIR

Overrides the default path used to locate subdirectories for GNUstep binaries within bundles and applications. This is normally equivalent to a path made up of the GNUSTEP_TARGET_CPU and GNUSTEP_TARGET_OS

GNUSTEP_TARGET_OS

Overrides the default value of the operating system name used on this system. Please do not use this to locate resources; for architecture dependent resources use GNUSTEP_TARGET_DIR.

GNUSTEP_TZ

Used to specify the timezone to be used if there is no timezone specified in the user defaults system. The preferred mechanism is to use the 'Local Time Zone' value from the user defaults system.

GNUSTEP_CONFIG_FILE

This functionality may have been disabled if the base library was configured/built with the --disable-environment-config-file option.
If it is operational (ie unless you've deliberately disabled it), the environment variable overrides the normal path to the gnustep config file used to determine the locations of paths for the gnustep system (see later).
This is provided to support situations such as when you install into a sandbox during packaging, or where you may want to simultaneously run applications using different sets of resources but linked to a single copy of the base library, or you want to use an alternative config file for some reason.

GNUSTEP_BEHAVIOR_DEBUG A boolean (YES or NO) which can be used to turn on debug logging (to stderr) of the GSObjCRuntime functions to add/override methods in a class using a list of methods from another class. HOMEDRIVE

Used on ms-windows to locate the home directory if the HOMEPATH environment variable is also used.

HOMEPATH

Used on ms-windows to locate the home directoryb in conjunction with HOMEDRIVE. If this is just a backslash then the USERPROFILE variable is used if possible.

LANGUAGES

If there is no NSLanguages user default set, and there is no language information available in the native system locale mechanism, then this environment variable is used to provide a list of the languages that the user prefers to use. languages listed in this variable must be separated by semicolons.

LOGNAME

This is used as the default value for the current user (as returned by the NSUserName() functions). If it is not specified, or contains an illegal value, other methods are used to get the user name.

LIBRARY_COMBO

Used to override the default value of the combination of standard libraries used to build binaries. This value locates the final subdirectory used to locate binaries.

NSDeallocateZombies

This may be used in conjunction with NSZombieEnabled to specify whether the objects should really be deallocated. If you set this to YES, the zombie logging will only work until the deallocated memory is re-used.

NSZombieEnabled

If this is set to YES, then deallocation of an object causes the object to be morphed into a Zombie ... a special object which will call the GNUstep specific GSLogZombie() function to log the method call.
If GNUstep-base was built for debugging (make debug=yes), you can set a breakpoint in this function and examine the process memory when you are running under a debugger.
As this overrides actual object deallocation, all memory allocated for objects will be leaked unless the NSDeallocateZombies environment variable is also set.
You can use the CRASH_ON_ZOMBIE environment variable to force an abort after the message is logged.

SOCKS5_SERVER

Specifies the default socks server to be used when making outgoing tcp/ip connections using NSFileHandle. This may also specify a port after the host name (and separated from it by a colon).
This environment variable is used only if the GSSOCKS user default is not set.

SOCKS_SERVER

Equivalent to SOCKS5_SERVER, but used only if that is not defined.

TZ

Used to specify the timezone to be used if there is no timezone specified by any other mechanism. The preferred mechanism is to use the 'Local Time Zone' value from the user defaults system.

USERPROFILE

Used on windows to identify the home directory of the current used (unless HOMEPATH and HOMEDRIVE are set to point to an individual user's home).

GNUstep Configuration File

This file is the master configuration file for GNUstep. It can be used to set the base location of all the standard paths that GNUstep programs use or know about. The location of this file depends on how the Base library was configured and/or what operating system it was configured on. On a GNU/Linux system, the default would be /etc/GNUstep/GNUstep.conf for instance, while on mswindows it would be ./GNUstep.conf (the leading './' here indicates that the file is located relative to the base library, on windows this is the location of the base library DLL, which is normally the same location as command line tools).

If setting up GNUstep in a sandbox for packaging it as part of an operating system distribution, you may well want a special configuration for use within the sandbox. The normal way to do that would be to create a GNUstep.conf file in /tmp and set the GNUSTEP_CONFIG_FILE environment variable to point to that while doing the packaging setup.

NB. The gnustep-make package sets up a configuration file to be used when building GNUstep software, and gnustep-base normally uses that same file, but it is important to be aware that the two configuration files are not necessarily the same since one is required to provide environment variables used while building and installing software, but the other is used when gnustep tools and applications are run (ie in a target/deployment environment).
In particular it is normal for the two files to differ on mswindows (where the build environment is an UNIX-like MSYS shell, using the its own paths, but the deployment environment is native-windows using real windows paths).

The location of the GNUstep configuration file can be specified when the base library is configured, using the --with-config-file= option of the configure script.
This configuration file is not actually required to exist, and if it does not exist, then default values will be used for the standard path locations (these default values may be specified using the --with-default-config= option of the configure script.
If you want to force the internal defaults to be used, you can use --with-config-file= to specify a path with a trailing '/' (ie with no filename) as the base library will refrain from trying to load configuration from a file of no name.
System paths are defined by the following:

GNUSTEP_SYSTEM_APPS This is where System GUI Applications get installed.
Traditionally it is /usr/GNUstep/System/Applications.
GNUSTEP_SYSTEM_ADMIN_APPS This is where System GUI Applications that only the Administrator can use get installed.
Traditionally it is /usr/GNUstep/System/Applications/Admin.
GNUSTEP_SYSTEM_WEB_APPS This is where System Web Applications (GSWeb, SOPE) get installed.
Traditionally it is /usr/GNUstep/System/Library/WebApplications.
GNUSTEP_SYSTEM_TOOLS This is where System Command-Line Tools get installed.
Traditionally it is /usr/GNUstep/System/Tools.
GNUSTEP_SYSTEM_ADMIN_TOOLS This is where System Command-Line Tools that only the Administrator can use get installed. Important: this should not be in the PATH of normal users.
Traditionally it is /usr/GNUstep/System/Tools/Admin.
GNUSTEP_SYSTEM_LIBRARY This is where System resources get installed. This directory will contain a lot of executable code since *step traditionally likes to bundle executables and resources together.
Traditionally it is /usr/GNUstep/System/Library.
GNUSTEP_SYSTEM_HEADERS This is where System headers get installed. They are the library .h headers.
Traditionally it is /usr/GNUstep/System/Library/Headers.
GNUSTEP_SYSTEM_LIBRARIES This is where System libraries get installed. By libraries we mean the shared/static object files that you can link into programs.
Traditionally it is /usr/GNUstep/System/Library/Libraries.
GNUSTEP_SYSTEM_DOC This is where System documentation get installed. This is known not to contain any executable, so we keep it separate.
Traditionally it is /usr/GNUstep/System/Library/Documentation.
GNUSTEP_SYSTEM_DOC_MAN This is where System man pages get installed.
Traditionally it is /usr/GNUstep/System/Library/Documentation/man.
GNUSTEP_SYSTEM_DOC_INFO This is where System info pages get installed.
Traditionally it is /usr/GNUstep/System/Library/Documentation/info.

In addition to the above SYSTEM domain paths, there are corresponding LOCAL, NETWORK, and USER domain paths (with the same names except for replacing 'SYSTEM' with 'LOCAL', 'NETWORK', or 'USER'.
All these paths must be absolute, except for the USER domain paths which, if not absolute, are considered to be with the user's home directory.
NB. as a special case a path may begin with './' or '../' when it is to be resolved to an absolute path relative to the location of the GNUstep configuration file. So while such paths appear to be relative, they actually produce absolute locations at runtime since the location of the configuration file is known.
Finally, for paths in the USER domain only, a limited substitution into the path is performed at runtime as follows:
'%u' is replaced by the user name
'%i' is replaced by the user ID
'%%' is replaced by a single '%'

The GNUSTEP_DEVELOPER_DIR path may be used to specify where the development system is located. On most systems this should be the default value of '/', but on windows it should be the location of the msys/mingw filesystem (so that msys development tools can be found).

Other paths for each user are defined by the following:

GNUSTEP_USER_CONFIG_FILE Name of user configuration file (eg. '.GNUstep.conf') relative to the user's home directory.
Can be specified as an empty string to ensure that no user specific config file is loaded.
GNUSTEP_USER_DEFAULTS_DIR Name of directory for user defaults files. Always relative to the user's home directory except:
On mswindows this may be set to be ':REGISTRY:' to have defaults stored in the windows registry rather than in the standard file format.
On any system this may be set to ':INTERNAL:' to use only internal defaults domains (NSArgumentDomain, NSRegistrationDomain, and GSConfigDomain).

The user's home directory is taken to be the standard home directory for that user on the system
On unix, that is the user's home directory from the password file, while on windows it's the value given by the HOMEDRIVE and HOMEPATH environment variables (or the USERPROFILE environment variable if the others can't be used).

NB. The presence of a path in the configuration (and therefore its inclusion in the paths provided by the API at runtime) does not guarantee that the directory at that path actually exists in the local filesystem.
However the GNUSTEP_CREATE_LIBRARY_PATH configuration value may be set to YES to tell the library to create the most commonly used per-user directory (GNUSTEP_USER_LIBRARY) on startup if it does not already exist.

All the above values from the configuration file are made available in the NSUserDefaults system at runtime, in the GSConfigDomain (along with any defaults provided in property lists in the GlobalDefaults subdirectory or in the GlobalDefaults.plist file in the same directory as the config file).
The .plist files in the GlobalDefaults subdirectory are merged into the defaults system in an unpredictable order, but the values from the GlobalDefaults.plist are merged in after the other values and will take precedence.
The global defaults files allow packagers and system administrators to provide defaults settings for all users of a particular GNUstep installation.
It is recommended that each software package provides its own defaults in the GlobalDefaults subdirectory, while the GlobalDefaults.plist file should be reserved for other system-wide settings.

The exact format of the configuration file is expected to be that of a basic unix "conf" style file, with one key = value per line (the format a unix shell can 'source' in order to define shell variables).
This configuration file uses the escape sequence and quoting conventions of the standard bourne shell.
The only Keys permitted are those listed above, and all consist of uppercase letters, digits, and underscores, and must not begin with a digit.
A value may be any quoted string (or an unquoted string containing no white space).
Lines beginning with a hash '#' are deemed comment lines and ignored.
The backslash character may be used as an escape character anywhere in the file except within a singly quoted string (where it is taken literally).
A backslash followed immediately by a newline (except in a singly quoted string) is removed completely along with the newline ... it thus serves to join lines so that they are treated as a single line.
NB. Since ms-windows uses backslash characters in paths, it is a good idea to specify path values in the config file as singly quoted strings to avoid having to double all occurrences of the backslash.

Relocatable packages

The configuration files system has two features which make it possible to build standalone packages containing the entire GNUstep system in a form which can be moved anywhere and just run.

Firstly, variables in the configuration file which define paths, are expected to by full path specifications, except for the special case in which they begin with dot-slash (./) or dot-dot-slash (../).
In this case the path from the variable is appended to the path of the directory containing the configuration file (or the path specified to contain the configuration file if no configuration file exists) to form the value used.
So, if you configure other paths relative to the configuration file, you can relocate everything when you move the configuration file.

Secondly, If the value of the path built in to the base library as the location of the config file (or specified by the GNUSTEP_CONFIG_FILE environment variable unless that option was disabled when the base library was configured) begins with a dot-slash (./) or dot-dot-slash (../) then the path used for that file is made relative to the base library.
The base library contains code to determine its own location, so this allows it to locate the configuration file, and by reading the configuration file it determines where all other resources are located.

So you can bundle the whole lot together in one directory, and configure various relative paths in that directory, then move the directory around wherever you like.
However, if your operating system needs to know where to find the libraries it will load, you will have to tell it where they are ... typically you do this by setting an environment variable such as LD_LIBRARY_PATH to contain the full path to the directory you put the libraries in.

Standalone packages

While the recommended setup for GNUstep is to install the core packages in a standard location on your system, and then install applications which make use of those core libraries, it is sometimes desirable to have standalone applications which don't need the core to be installed.
This is a special case of the relocatable packages described above, in which all your application's dependencies are built as relocatable packages using a filesystem layout which lets them all be stored within your application directory.

As an aide to easy creation of such standalone packages we provide two template gnustep configuration files for a common setup where things are stored in a 'standalone' subdirectory of your application wrapper.
You configure/install gnustep-make with the 'standalone' filesystem layout, then you configure/build/install gnustep-base with the 'standalone.conf' default configuration file, and build/install the other libraries/packages your app depends upon.
This leaves you with a 'standalone' directory containing all the relocatable code, which you can then copy into your app wrapper to provide a complete standalone system.

To set up the relocatable standalone resources: cd make ./configure --with-layout=standalone make install . ~/standalone/Makefile/GNUstep.sh cd ../base ./configure --with-config-file=./GNUstep.conf --with-default-config=standalone.conf make install cd ../gui make install cd ../back make install To copy them to your application and run it using them: (cd ~; tar -cf - standalone) | (cd MyApp.app; tar -xpf -) export LD_LIBRARY_PATH=`pwd`/MyApp.app/standalone MyApp.app/MyApp
Lock-Down

If you wish to lock down a production system for distribution so that users can't change the config file and mess up paths, you can specify the config file name as a path with a trailing slash so that the base library will not read it, and will use the built in default values.
To do this, you would configure using options like --disable-environment-config-file with --with-config-file=/not-used/ and --with-default-config=myConfig where myConfig is a file containing the paths you want to use in the locked down system.
The paths from that file will be built in to the base library as defaults, and library will use them rather than attempting to read a config file at runtime.
You can lock down a relocatable system by using this procedure with './' as the config file path and relative paths in myConfig... a user could then move the entire package around, but would not be able to edit a configuration file to alter the paths within the package.

.GNUstep.conf files

The user specific configuration file is read after the system configuration file and may generally override values from the main file. To prevent the use specific file from being read, the system manager may define GNUSTEP_USER_CONFIG_FILE in the main file to be an empty string.
In any case, the user specific file is not read if a program is running setuid.

Unless disabled (as specified above) the presence of a .GNUstep.conf file in a users home directory permits the user to customize file locations using all the same commands as the system directory, though any attempt to redefine GNUSTEP_USER_CONFIG_FILE is of course ignored.
Attempts to redefine the users home directory at this level are also ignored.

The defaults database for a user is stored in the location given by GNUSTEP_USER_DEFAULTS_DIR in the config file. This is usually a relative path (default, the GNUstep/Defaults subdirectory) taken to specify a subdirectory of the user's home directory.
On mswindows this may be set to be ':REGISTRY:' to have defaults stored in the windows registry rather than in the standard file format.
On any system this may be set to ':INTERNAL:' to use only internal defaults domains (NSArgumentDomain, NSRegistrationDomain, and GSConfigDomain).

API Documentation Functions Types and Constants gnustep-base-1.29.0/Documentation/Base.ispell000066400000000000000000001347601435650067400211220ustar00rootroot00000000000000aBaseUrl abbreviationDictionary abbreviationForDate abbreviationMap aBlock aBool abortParsing absoluteGregorianDay absolutePathOfExecutable absoluteString absoluteURL aBuffer ac acceptConnectionInBackground acceptConnectionInBackgroundAndNotify acceptConnectionInBackgroundAndNotifyForModes acceptInputForMode accessInstanceVariablesDirectly accessor aChange aCharacter aClass aClassName aClassObject aCode aCoder aComment aConnection aContext aCount actionName aData aDate addAttribute addAttributes addCharactersInRange addCharactersInString addClient addConnection addEntriesFromDictionary addEvent addImp addIndex addIndexes addIndexesInRange addMsgTarget addObject addObjectsFromArray addObserver addPort addr addRequestMode addRunLoop addSuiteNamed addTimeInterval addTimer addYear aDecoder aDefaultValue aDescription aDictionary aDomain aDouble aFile aFlag aFloat aFormat afterDelay aHost ai aKey alength aLength alignp allBundles allConnections allFrameworks allKeys allKeysForObject allObjects alloc allocWithZone allowLossyConversion allowNaturalLanguage allowsFloats allowsKeyedCoding allowsNaturalLanguage allValues aLocale aLoop alphanumericCharacterSet aMaximum aMessage aMinimum aMode aModel aName aNamespaceURI anArchiver anArgument anArray anAttributeDict anAttributeName ancestorConn andCrossRef andPath anElementName anEncoder anError anErrorString anId anID anIndex anInteger anInvocation anObj anObject anObject's anObserver anOption anoq aNotationName anotherArray anotherDate anotherPort anotherRange anUnarchiver anURL anyObject aParser aPath API APIs aPlane aPoint aPoint's aPointer aPort app appendAttributedString appendBytes appendData appendFormat appendString AppKit aPrefix aPropertyList aProtocol aPublicID aQualifierName aRange aRange's archivedDataWithRootObject archiverData archiverDidFinish archiveRootObject archiverWillFinish aRect aRect's arg argc argFrame argframe argFrameLength arglist argList args argsRetained argumentInfoAtIndex argumentsRetained argv arrayByAddingObject arrayByAddingObjectsFromArray arrayForKey arrayWithArray arrayWithCapacity arrayWithContentsOfFile arrayWithContentsOfURL arrayWithObject arrayWithObjects asapQueue aScheme ascii asClassName aSel aSelector aSelectorName aSet aSignature aSize aSize's ASSIGNCOPY aStream aString aSystemID aTarget atCursor aTimeZone aTimeZoneName atIndex atof atoi atPath attr attributedString attributedStringForNil attributedStringForNotANumber attributedStringForObjectValue attributedStringForZero attributedSubstringFromRange attributedSubstringWithRange attributeKeys attributeName attributesAtIndex attributesForNegativeValues attributesForPositiveValues aType au aURL aUrlString authenticateComponents authenticationData authenticationDataForComponents automaticallyNotifiesObserversForKey autorelease autoreleaseClass autoreleaseCount autoreleaseCountForObject autoreleased autoreleases autoreleasing availableData availableResourceData availableStringEncodings aValue aVersion awakeAfterUsingCoder aWhitespaceString aZone backgroundLoadDidFailWithReason baseLength baseURL beforeDate beginEditing beginLoadInBackground beginUndoGrouping behavior Bettis bitfield bitmapRepresentation BN BOM BOOL boolForKey boolValue bPoint bPoint's br bRange bRange's breakLock bRect bRect's bSize bSize's btw buf bufferSize builtin builtInPlugInsPath bundleClasses bundleForClass bundleForLibrary bundleIdentifier bundlePath bundleType bundleVersion bundleWithPath bycopy byref byteString ca cachedHandleForURL calendarDate calendarFormat callback callBacks callbacks canBeConvertedToEncoding canceled cancelLoadInBackground cancelPerformSelector cancelPerformSelectorsWithTarget cancelPreviousPerformRequestsWithTarget canFree canInitWithURL cannotDecodeObjectOfClassName canRedo canUndo capitalized capitalizedLetterCharacterSet capitalizedString cartesian caseInsensitiveCompare caseless caseSensitive center centerLock certFile CFBundleIdentifier cframe ch changeCurrentDirectoryPath changeFileAttributes changeFlag changeKind characterAtIndex characterIsMember characterset characterSetWithBitmapRepresentation characterSetWithCharactersInString characterSetWithContentsOfFile characterSetWithRange charactersToBeSkipped charValue Christley classCount classDescription classDescriptionForClass classForArchiver classForClassName classForCoder classForKeyedArchiver classForKeyedUnarchiver classForPortCoder className classNamed classNameDecodedForArchiveClassName classNameEncodedForTrueClassName classNameForClass classNames ClassWithManyMethods closeFile closeOnDealloc cMantissa cmd co coalesceMask codeLoaded color colorado columnNumber com commonPrefixWithString comp compareRange completePathIntoString componentsJoinedByString componentsSeparatedByString componentsToDisplayForPath conf configureAsServer conformsToProtocol connectionForProxy connectionWithReceivePort connectionWithRegisteredName const constantStringClass cont containsIndex containsIndexes containsIndexesInRange containsObject containsValueForKey contentsAtPath contentsEnd contentsEndIndex contentsEqualAtPath controlCharacterSet copyItems copyPath copyWithZone countForObject cpu createDirectoryAtPath createFileAtPath createSymbolicLinkAtPath cremona CRLF crossreference CString cString cStringLength CStrings cStringUsingEncoding currentConversation currentDirectoryPath currentHandler currentHost currentMode currentPool currentRunLoop currentThread customized cybercity DatabaseErrors datafiles dataForKey dataFromPropertyList dataItem dataUsingEncoding dataWithBytes dataWithBytesNoCopy dataWithCapacity dataWithContentsOfFile dataWithContentsOfMappedFile dataWithContentsOfURL dataWithData dataWithLength dataWithSharedBytes dataWithShmID dateByAddingYears dateFormat dateWithCalendarFormat dateWithNaturalLanguageString dateWithString dateWithTimeIntervalSince dateWithTimeIntervalSinceNow dateWithTimeIntervalSinceReferenceDate dateWithYear dayOfCommonEra dayOfMonth dayOfWeek dayOfYear DD de dealloc debugLoggingEnabled debugSet decimalDigitCharacterSet decimalNumber decimalNumberBy decimalNumberByAdding decimalNumberByDividingBy decimalNumberByMultiplyingBy decimalNumberByMultiplyingByPowerOf decimalNumberByRaisingToPower decimalNumberByRoundingAccordingToBehavior decimalNumberBySubtracting decimalNumberHandlerWithRoundingMode decimalNumberWithDecimal decimalNumberWithMantissa decimalNumberWithString decimalSeparator decimalValue decodeArrayOfObjCType decodeArrayOfObjectsForKey decodeBoolForKey decodeBytesForKey decodeBytesWithReturnedLength decodeClassName decodeDataObject decodeDoubleForKey decodeFloatForKey decodeIndent decodeInt decodeIntForKey decodeObject decodeObjectAt decodeObjectForKey decodePoint decodePointForKey decodePortObject decodePropertyList decodePropertyListForKey decodeRect decodeRectForKey decodeSize decodeSizeForKey decodeValueOfCType decodeValueOfObjCType decodeValuesOfObjCTypes decomposableCharacterSet defaultBehavior defaultCenter defaultConnection defaultCStringEncoding defaultDecimalNumberHandler defaultManager defaultName defaultQueue defaultTimeZone defaultValue deflist deletable deleteCharactersInRange deletePrefix deleteSuffix deliverImmediately dependentKey dequeueNotificationsMatching deregister deregistered Deregisters desc descriptionInStringsFileFormat descriptionWithCalendarFormat descriptionWithLocale deserialisation Deserialises deserialization deserialize deserializeAlignedBytesLengthAtCursor deserializeBytes deserialized deserializeDataAt deserializeHeaderAt deserializeIntAtCursor deserializeIntAtIndex deserializeInts deserializeObjectAt deserializePropertyListFromData deserializePropertyListLazilyFromData deserializeTypeTag deserializing dest detachNewThreadSelector dflt dict dictionaryForKey dictionaryRepresentation dictionaryWithCapacity dictionaryWithContentsOfFile dictionaryWithContentsOfURL dictionaryWithDictionary dictionaryWithObject dictionaryWithObjects dictionaryWithObjectsAndKeys dictionaryWithValuesForKeys didChange didChangeValueForKey didConnect didDecodeObject didEncodeObject didEndElement didEndMappingPrefix didLoadBytes didStartElement didStartMappingPrefix dir directDataAccess directoryAttributes directoryContentsAtPath directoryKey disableUndoRegistration displayNameAtPath distantFuture distantPast dk DNS DOCTYPE doesNotRecognizeSelector domainMask domainName doubleValue DTD dX dx dY dy earlierDate EDESC editingStringForObjectValue edu effectiveRange eg elcom elems elsie EMBL emptyPool EN enableDoubleReleaseCheck enableMultipleThreads enableRelease enableUndoRegistration encodeArrayOfObjCType encodeArrayOfObjects encodeBool encodeBycopyObject encodeByrefObject encodeBytes encodeClassName encodeConditionalObject encodeDataObject encodeDouble encodeFloat encodeIndent encodeInt encodeObject encodeObjectAt encodePoint encodePortObject encodePropertyList encodeRect encodeRootObject encodeSize encodeValueOfCType encodeValueOfObjCType encodeValuesOfObjCTypes encodeWithCoder EndConstants endEditing EndFunctions ENDHANDLER endian endIndex endLoadInBackground EndMacros EndNSArchiverConstants EndNSAutoreleasePoolTypedefs EndNSBundleConstants EndNSBundleMacros EndNSCalendarDateFunctions EndNSClassDescriptionConstants EndNSConnectionConstants EndNSDateConstants EndNSDateTypedefs EndNSDebugFunctions EndNSDebugMacros EndNSDebugVariables EndNSDecimalFunctions EndNSDecimalMacros EndNSDecimalTypedefs EndNSDistributedNotificationCenterConstants EndNSDistributedNotificationCenterTypedefs EndNSErrorConstants EndNSExceptionConstants EndNSExceptionFunctions EndNSExceptionMacros EndNSExceptionTypedefs EndNSExceptionVariables EndNSFileHandleConstants EndNSFileManagerConstants EndNSGeometryConstants EndNSGeometryFunctions EndNSGeometryTypedefs EndNSGeometryVariables EndNSHashTableConstants EndNSHashTableFunctions EndNSHashTableTypedefs EndNSInvocationMacros EndNSKeyedArchiverConstants EndNSKeyValueCodingConstants EndNSKeyValueObservingConstants EndNSKeyValueObservingTypedefs EndNSLockMacros EndNSMapTableConstants EndNSMapTableFunctions EndNSMapTableTypedefs EndNSMapTableVariables EndNSMethodSignatureTypedefs EndNSNotificationQueueFunctions EndNSNotificationQueueTypedefs EndNSNotificationQueueVariables EndNSObjCRuntimeFunctions EndNSObjCRuntimeVariables EndNSObjectFunctions EndNSObjectMacros EndNSObjectTypedefs EndNSObjectVariables EndNSPathUtilitiesFunctions EndNSPathUtilitiesTypedefs EndNSPortConstants EndNSPortTypedefs EndNSProcessInfoFunctions EndNSPropertyListTypedefs EndNSRangeFunctions EndNSRangeMacros EndNSRangeTypedefs EndNSRangeVariables EndNSRunLoopConstants EndNSRunLoopTypedefs EndNSSetFunctions EndNSStringTypedefs EndNSStringVariables EndNSTaskConstants EndNSThreadConstants EndNSThreadFunctions EndNSUndoManagerConstants EndNSURLConstants EndNSURLHandleConstants EndNSURLHandleTypedefs EndNSUserDefaultsConstants EndNSValueFunctions EndNSValueTypedefs EndNSXMLParserConstants EndNSXMLParserTypedefs EndNSZoneFunctions EndNSZoneTypedefs EndNSZoneVariables endThread EndTypedefs endUndoGrouping EndVariables enqueueNotification enum enumeratorAtPath env EOF eric errorDescription errorDictionary errorWithDomain EST eventListener exceptionDuringOperation exceptionWithName exchangeObjectAtIndex executablePath existingPortWithNumber expandTilde ext extensionSeparator extraBytes extraLength failureReason fallback fastestEncoding favor fd fds fedor fileAttributes fileAttributesAtPath fileCreationDate fileDescriptor fileExistsAtPath fileExtensionHidden fileGroupOwnerAccountID fileGroupOwnerAccountName fileHandleAsClientAtAddress fileHandleAsClientInBackgroundAtAddress fileHandleAsServerAtAddress fileHandleForReading fileHandleForReadingAtPath fileHandleForUpdatingAtPath fileHandleForWriting fileHandleForWritingAtPath fileHandleWithNullDevice fileHandleWithStandardError fileHandleWithStandardInput fileHandleWithStandardOutput fileHFSCreatorCode fileHFSTypeCode fileIsAppendOnly fileIsImmutable fileManager fileModificationDate fileName fileOwnerAccountID fileOwnerAccountName filePosixPermissions fileSize filesystem fileSystemAttributesAtPath fileSystemFileNumber fileSystemNumber fileSystemRepresentation fileSystemRepresentationWithPath filesystems fileType fileURLWithPath filterTypes finalization finishDecoding finishEncoding fireDate firstIndex firstObject firstObjectCommonWithArray flashnet floatForKey floatValue flushCachedData flushHostCache fmt foo forceAddress forClass forClassName forElement forKey ForKey forKeyPath forKeys forLocalization formatString formIntersectionWithCharacterSet forMode forModes formUnionWithCharacterSet forName forPreferences forProxy forRange forString forUnboundKey forUndefinedKey forwardForProxy forwardInvocation foundAttributeDeclarationWithName foundCDATA foundCharacters foundComment foundElementDeclarationWithName foundExternalEntityDeclarationWithName foundIgnorableWhitespace foundInternalEntityDeclarationWithName foundNotationDeclarationWithName foundProcessingInstructionWithTarget foundUnparsedEntityDeclarationWithName frameLength frameworkVersion FredKiefer free'ing freeable freeCache freeWhenDone friday frith fromData fromObjectsAtIndexes FromPath fromRunLoop ftp func functionName gcc gcontext gdnc GDNCHost Georg getArgument getArgumentTypeAtIndex getBytes getCharacters getCString getFds getFileSystemRepresentation getIndexes getKey getLineStart getObjects getObjectValue getReturnValue GetUserName getValue getVersion globallyUniqueString gmodel GMT gmx GNUmakefile GNUstep gnustep gnustepBundle GNUstepExtensions GNUstepOpenSSL GNUsteprc Gomoku gorm gov gran GregorianDate gregorianDateFromAbsolute groupingLevel groupsByEvent GSApplicationSupportDirectory GSAtomicMallocZone GSBreakTime GSCurrentThread GSCurrentThreadDictionary GSDebugAllocation GSDebugAllocationActive GSDebugAllocationActiveRecordingObjects GSDebugAllocationAdd GSDebugAllocationClassList GSDebugAllocationCount GSDebugAllocationList GSDebugAllocationListAll GSDebugAllocationListRecordedObjects GSDebugAllocationPeak GSDebugAllocationRemove GSDebugAllocationTagRecordedObject GSDebugAllocationTotal GSDebugFunctionMsg GSDebugMethodMsg GSDebugSet GSDefaultsRootForUser GSDIAGNOSE gsdoc GSFileHandleConnectCompletionNotification GSFileHandleNotificationError GSFileHandleWriteCompletionNotification GSHTTPPropertyCertificateFileKey GSHTTPPropertyKeyFileKey GSHTTPPropertyLocalHostKey GSHTTPPropertyMethodKey GSHTTPPropertyPasswordKey GSHTTPPropertyProxyHostKey GSHTTPPropertyProxyPortKey GSIMap GSLibrariesDirectory GSLocalizedString GSLocalizedStringFromTable GSLogLock GSLogSyslog GSLogThread GSMacOSXCompatible GSNetwork GSNetworkNotificationCenterType GSNotifyASAP GSNotifyIdle GSNotifyMore GSNumberInfo GSNumberInfoFromObject GSObjCRuntime GSOnceFLog GSOnceMLog GSOutOfMemory GSPrintf GSPublicNotificationCenterType GSRegisterCurrentThread GSSetDebugAllocationFunctions GSSetUserName GSSmallHash GSSOCKS GSTime GSToolsDirectory gsu GSUnique GSUniquing GSUnregisterCurrentThread GSUPurge GSUSet GSWARN GSXML GSXMLParser gt Guesdon gui gvadd handleFailureInFunction handleFailureInMethod handlePortMessage handleQueryWithUnboundKey handleTakeValue hasCollected HashMap hasLaunched hasMemberInPlane hasNotified hasPrefix hasSuffix hasTerminated hasThousandSeparators hdl hexadecimalRepresentation hexData HFS HH HHHMM HHMM hksys hostName hostWithAddress hostWithName hourOfDay html http https hu HURD IDENT idleQueue ie iff ifndef illegalCharacterSet immutableProxy inArchiveName increaseLengthBy independentConversationQueueing indexGreaterThanIndex indexGreaterThanOrEqualToIndex indexLessThanIndex indexLessThanOrEqualToIndex indexOfObject indexOfObjectIdenticalTo indexSet indexSetWithIndex indexSetWithIndexesInRange inDirectory infoDict infoDictionary inIndexRange init initFileURLWithPath initForReadingWithData initForWritingWithMutableData initialization initialize initialized initializer initializers initializes initializeWithArguments initializing initWithArgframe initWithArray initWithAttributedString initWithBool initWithBytes initWithBytesNoCopy initWithCapacity initWithChar initWithCharacters initWithCharactersNoCopy initWithCoder initWithCondition initWithContentsOfFile initWithContentsOfMappedFile initWithContentsOfURL initWithCString initWithCStringNoCopy initWithData initWithDateFormat initWithDecimal initWithDictionary initWithDomain initWithDouble initWithFileDescriptor initWithFireDate initWithFloat initWithFormat initWithHexadecimalRepresentation initWithIndex initWithIndexesInRange initWithIndexSet initWithInt initWithLength initWithLocal initWithLong initWithLongLong initWithMachMessage initWithMachPort initWithMantissa initWithMethodSignature initWithName initWithNativeHandle initWithNotificationCenter initWithObjects initWithObjectsAndKeys initWithPath initWithReceivePort initWithRoundingMode initWithScheme initWithSelector initWithSendPort initWithSet initWithShort initWithString initWithTarget initWithTimeInterval initWithTimeIntervalSince initWithTimeIntervalSinceNow initWithTimeIntervalSinceReferenceDate initWithUnsignedChar initWithUnsignedInt initWithUnsignedLong initWithUnsignedLongLong initWithUnsignedShort initWithURL initWithUser initWithUTF initWithYear inModes INNN inout InPort inRange insertAttributedString insertionPosition insertObject insertString instanceMethodForSelector instanceMethodSignatureForSelector instancesRespondToSelector int intBuffer integerForKey internet intersectSet intersectsIndexesInRange intersectsSet interthread intitialisers intoClassName intoData intoString ints intValue inv invalidateClassDescriptionCache inverseForRelationshipKey invertedSet invocationWithMethodSignature invokeWithTarget IP IPV isa isAbsolutePath isAtEnd isBycopy isByref isDaylightSavingTime isDaylightSavingTimeForDate isDaylightSavingTimeZone isDeletableFileAtPath isDirectory isEqual isEqualToArray isEqualToAttributedString isEqualToData isEqualToDate isEqualToDictionary isEqualToHost isEqualToIndexSet isEqualToNumber isEqualToSet isEqualToString isEqualToTimeZone isEqualToValue isExecutableFileAtPath isFileURL isHostCacheEnabled isInstance isKey isKindOfClass isLoaded isMemberOfClass isMultiThreaded isNegative isOneway isPartialStringValid isProxy isReadableFileAtPath isRedoing isReg isRunning isSubclassOfClass isSubsetOfSet isSupersetOfSet isUndoing isUndoRegistrationEnabled isValid isValidForFormat isWritableFileAtPath itsself ivar ivariable january jeremy JPStringEncoding jupiter Kachites keyArray keyCallBacks keyEnumerator keysSortedByValueUsingSelector Kiefer Kienenberger knownTimeZoneNames kr LAN laplace lastDayOfGregorianMonth lastError lastIndex lastObject lastPathComponent laterDate launchedTaskWithLaunchPath launchPath leftOperand leftoverRange len lengthOfBytesUsingEncoding letterCharacterSet levelsOfUndo li libFoundation libObjects libraryName limitDate limitDateForMode lineEndIndex lineNumber lineRangeForRange linkPath linux lli llu loadComplete loadInBackground loadInForeground loadResourceDataNotifyingClient loc localeDictionary localException localhost localHost Localizable localization localizationName localizations localizationsArray localize localized localizedCaseInsensitiveCompare localizedCompare localizedDescription localizedInfoDictionary localizedNameOfStringEncoding localizedScannerWithString localizedStringForKey localizedStringWithFormat localizesFormat localObjects localtime localTimeZone lockBeforeDate lockDate lockPath lockTime lockWhenCondition lockWithPath loginName loginName's LOGNAME longCharacterIsMember longestEffectiveRange longLongValue longValue lossyCString lowercaseLetterCharacterSet lowercaseString lproj lt lu lukeh machPort MacOS MacOSX MacroSetup mainBundle mainFrame makeImmutableCopyOnFail makeNewConnection makeObjectsPerform makeObjectsPerformSelector malloc matchesIntoArray max's maxCount maximumDecimalNumber maximumLengthOfBytesUsingEncoding maxint maxLength McCallum mccallum md mdata MDYH methodForSelector methodInfo methodReturnLength methodReturnType methodSignature methodSignatureForSelector methodType methodTypes mguesdon mingw minimumDecimalNumber minusSet minuteOfHour mircea mirko mit mnethod modePtr monday monthOfYear motd movePath msg msgid mstats mswindows multipleThreadsEnabled multithreaded mutabilityOption mutableArrayValueForKey mutableArrayValueForKeyPath mutableBytes mutableContainers mutableCopy mutableCopyWithZone mutableString mutationKind mutex MyApp myDigest myLock myProtocol MyProtocol MyServerClass myString myTarget myUniquingSet nameInArchive nameMap namePtr nameserver nameservers namesForPort namespace namespaces namespaceURI NaN narrowObject nativeHandle nbsp nci negativeFormat newAddObjectFunc newAttributedString newAttributes newBytes newCapacity newConn newConnection newData newEditingString newLength newList newLockAt newModes newName newObject newProxyForInvocation newProxyForMessage newRegisteringAtName newRemoveObjectFunc newRoundingBehavior newSeparator newString newVals newWithName NeXT nextday nextline nextObject NeXTstep nicola nih NNN nonBaseCharacterSet nonfreeable nonretainedObjectValue Norum notAKeyMarker notANumber notationName notFoundMarker notificationCenter notificationCenterForType notificationName notificationWithName notImplemented NoWarn NS NSAddHandler NSAdminApplicationDirectory NSAllApplicationsDirectory NSAllDomainsMask NSAllHashTableObjects NSAllLibrariesDirectory NSAllMapTableKeys NSAllMapTableValues NSAllocateMemoryPages NSAllocateObject NSAMPMDesignation NSAnchoredSearch NSApplication NSApplicationDirectory NSArchiver NSArgumentDomain NSArgumentInfo NSArray NSASCIIStringEncoding NSAssert NSAssertionHandler NSAttributedString NSAutoreleasePool NSBackwardsSearch NSBIG NSBSDOperatingSystem NSBundle NSBundleDidLoadNotification NSCalculationDivideByZero NSCalculationError NSCalculationLossOfPrecision NSCalculationNoError NSCalculationOverflow NSCalculationUnderflow NSCalendarDate NSCaseInsensitiveSearch NSCAssert NSCharacterConversionException NSCharacterSet NSClassDescription NSClassDescriptionNeededForClassNotification NSClassDescriptionPrimitives NSClassFromString NSCoder NSCoding NSCompareHashTables NSCompareMapTables NSComparisonResult NSConditionLock NSConnection NSConnection's NSConnectionDelegate NSConnectionDidDieNotification NSConnectionDidInitializeNotification NSConnectionLocalCount NSConnectionProxyCount NSConnectionRepliesReceived NSConnectionRepliesSent NSConnectionreplyMode NSConnectionReplyMode NSConnectionRequestsReceived NSConnectionRequestsSent NSConnections NSConstantString NSConstantStringClassReference NSContainsRect NSCopyHashTableWithZone NSCopying NSCopyMapTableWithZone NSCopyMemoryPages NSCopyObject NSCountedSet NSCountFrames NSCountHashTable NSCountMapTable NSCParameterAssert NSCreateHashTable NSCreateHashTableWithZone NSCreateMapTable NSCreateMapTableWithZone NSCreateZone NSCurrencyString NSCurrencySymbol NSData NSDate NSDateFormatString NSDateFormatter NSDates NSDateTimeOrdering NSDeallocateMemoryPages NSDeallocateObject NSDeallocateZombies NSDebug NSDebugFLLog NSDebugFLog NSDebugFRLog NSDebugLLog NSDebugLog NSDebugMLLog NSDebugMLog NSDebugMRLog NSDecimal NSDecimalAdd NSDecimalCompact NSDecimalCompare NSDecimalCopy NSDecimalDigits NSDecimalDivide NSDecimalDouble NSDecimalFromComponents NSDecimalFromString NSDecimalIsNotANumber NSDecimalMax NSDecimalMaxDigit NSDecimalMaxSize NSDecimalMin NSDecimalMultiply NSDecimalMultiplyByPowerOf NSDecimalNormalize NSDecimalNoScale NSDecimalNumber NSDecimalNumberBehaviors NSDecimalNumberHandler NSDecimalPower NSDecimalRound NSDecimalSeparator NSDecimalString NSDecimalSubtract NSDecimalXXX NSDecrementExtraRefCountWasZero NSDefaultMallocZone NSDefaultRunloopMode nsdefaultrunloopmode NSDefaultRunLoopMode NSDemoApplicationDirectory NSDeserializer NSDeveloperApplicationDirectory NSDeveloperDirectory NSDictionary NSDirectoryEnumerator NSDistantObject NSDistributedLock NSDistributedNotificationCenter NSDivideByZero NSDivideRect NSDocumentationDirectory NSEarlierTimeDesignations NSEndHashTableEnumeration NSEndMapTableEnumeration NSEnumerateHashTable NSEnumerateMapTable NSEnumerator NSEqualPoints NSEqualRanges NSEqualRects NSEqualSizes NSError NSException NSExtraRefCount NSFailedAuthentication NSFailedAuthenticationException NSFileAppendOnly NSFileAttributes NSFileCreationDate NSFileDeviceIdentifier NSFileExtensionHidden NSFileGroupOwnerAccountID NSFileGroupOwnerAccountName NSFileHandle NSFileHandleConnectionAcceptedNotification NSFileHandleDataAvailableNotification NSFileHandleNotificationDataItem NSFileHandleNotificationFileHandleItem NSFileHandleNotificationMonitorModes NSFileHandleOperationException NSFileHandleReadCompletionNotification NSFileHandleReadToEndOfFileCompletionNotification NSFileHFSCreatorCode NSFileHFSTypeCode NSFileImmutable NSFileManager NSFileManagerHandler NSFileModificationDate NSFileOwnerAccountID NSFileOwnerAccountName NSFilePosixPermissions NSFileReferenceCount NSFileSize NSFileSystemFileNumber NSFileSystemFreeNodes NSFileSystemFreeSize NSFileSystemNodes NSFileSystemNumber NSFileSystemSize NSFileType NSFileTypeBlockSpecial NSFileTypeCharacterSpecial NSFileTypeDirectory NSFileTypeFifo NSFileTypeRegular NSFileTypeSocket NSFileTypeSymbolicLink NSFileTypeUnknown NSFoo NSFormalName NSFormatter NSFrameAddress NSFreeHashTable NSFreeMapTable NSFullUserName NSGB NSGenericException NSGeometry NSGeometryKeyedCoding NSGetSizeAndAlignment NSGetUncaughtExceptionHandler NSGlobalDomain NSGNULinuxOperatingSystem NSGSM NSHandler NSHashEnumerator NSHashGet NSHashInsert NSHashInsertIfAbsent NSHashInsertKnownAbsent NSHashRemove NSHashTable NSHashTableCallBacks NSHashTableCallbacks NSHeight NSHomeDirectory NSHomeDirectoryForUser NSHost NSHourNameDesignations NSHPUXOperatingSystem NSHTTPPropertyErrorPageDataKey NSHTTPPropertyRedirectionHeadersKey NSHTTPPropertyServerHTTPVersionKey NSHTTPPropertyStatusCodeKey NSHTTPPropertyStatusReasonKey NSInconsistentArchiveException NSIncrementExtraRefCount NSIndexSet NSInsetRect NSIntegralRect NSInternalInconsistencyException NSInternationalCurrencyString NSIntersectionRange NSIntersectionRect NSIntersectsRect NSIntHashCallBacks NSIntMapKeyCallBacks NSIntMapValueCallBacks NSInvalidArchiveOperationException NSInvalidArgument NSInvalidArgumentException NSInvalidUnarchiveOperationException NSInvocation NSIsEmptyRect NSISO NSISOArabicStringEncoding NSISOCyrillicStringEncoding NSISOGreekStringEncoding NSISOHebrewStringEncoding NSISOLatin NSISOThaiStringEncoding NSJapaneseEUCStringEncoding NSKeyedArchiver NSKeyedArchiverDelegate NSKeyedArchiverObjectSubstitution NSKeyedUnarchiver NSKeyedUnarchiverDelegate NSKeyedUnarchiverObjectSubstitution NSKeyValueChange NSKeyValueChangeIndexesKey NSKeyValueChangeKindKey NSKeyValueChangeNewKey NSKeyValueChangeOldKey NSKeyValueCoding NSKeyValueObserverNotification NSKeyValueObserverRegistration NSKeyValueObserving NSKeyValueObservingCustomization NSKeyValueObservingOptions NSKeyValueSetMutationKind NSKOI NSKoreanEUCStringEncoding NSLanguageCode NSLanguageName NSLanguages NSLaterTimeDesignations NSLibraryDirectory NSLiteralSearch NSLoadedClasses NSLocalDomainMask NSLocale NSLocalizedDescriptionKey NSLocalizedStaticString NSLocalizedString NSLocalizedStringFromTable NSLocalizedStringFromTableInBundle NSLocalNotificationCenterType NSLocationInRange NSLock NSLocking NSLog NSLogDescriptor NSLogPageSize NSLogv NSMACHErrorDomain NSMACHOperatingSystem NSMachPort NSMacOSRomanStringEncoding NSMainThreadPerformAdditions NSMakePoint NSMakeRange NSMakeRect NSMakeSize NSMallocAtomic NSMallocException NSMapEnumerator NSMapGet NSMapInsert NSMapInsertIfAbsent NSMapInsertKnownAbsent NSMapMember NSMapRemove NSMapTable NSMapTableKeyCallBacks NSMapTableValueCallBacks NSMaxRange NSMaxX NSMaxXEdge NSMaxY NSMaxYEdge NSMessagePort NSMessagePortNameServer NSMethodSignature NSMidX NSMidY NSMinX NSMinXEdge NSMinY NSMinYEdge NSMonthNameArray NSMouseInRect NSMutableArray NSMutableAttributedString NSMutableCharacterSet NSMutableCopying NSMutableData NSMutableDictionary NSMutableIndexSet NSMutableSet NSMutableString NSMutableValue NSNetworkDomainMask NSNextDayDesignations NSNextHashEnumeratorItem NSNextMapEnumeratorPair NSNextNextDayDesignations NSNEXTSTEPStringEncoding NSNonLossyASCIIStringEncoding NSNonOwnedPointerHashCallBacks NSNonOwnedPointerMapKeyCallBacks NSNonOwnedPointerMapValueCallBacks NSNonOwnedPointerOrNullMapKeyCallBacks NSNonRetainedObjectHashCallBacks NSNonRetainedObjectMapKeyCallBacks NSNonRetainedObjectMapValueCallBacks NSNotFound NSNotification NSNotificationCenter NSNotificationCoalescing NSNotificationCoalescingOnName NSNotificationCoalescingOnSender NSNotificationNoCoalescing NSNotificationQueue NSNotificationQueueList NSNotificationSuspensionBehavior NSNotificationSuspensionBehaviorCoalesce NSNotificationSuspensionBehaviorDeliverImmediately NSNotificationSuspensionBehaviorDrop NSNotificationSuspensionBehaviorHold NSNull NSNumber NSNumberFormatter NSObjCRuntime NSObjCTypeSerializationCallBack NSObject NSObject's NSObjectHashCallBacks NSObjectMapKeyCallBacks NSObjectMapValueCallBacks NSObjects NSOffsetRect NSOpenStepRootDirectory NSOrderedAscending NSOrderedDescending NSOrderedSame NSOSF NSOSStatusErrorDomain NSOwnedPointerHashCallBacks NSOwnedPointerMapKeyCallBacks NSOwnedPointerMapValueCallBacks NSPageSize NSParameterAssert NSParseErrorException NSPathUtilities NSPipe NSPoint NSPointArray NSPointerToStructHashCallBacks NSPointFromString NSPointInRect NSPointPointer NSPort NSPortCoder NSPortDelegateMethods NSPortDidBecomeInvalidNotification NSPortMessage NSPortNameServer NSPortTimeoutException NSPOSIXErrorDomain NSPostASAP NSPostingStyle NSPostNow NSPostWhenIdle NSPrincipalClass NSPriorDayDesignations NSProcess NSProcessInfo NSPropertyList NSPropertyListFormat NSPropertyListGNUstepBinaryFormat NSPropertyListGNUstepFormat NSPropertyListImmutable NSPropertyListMutabilityOptions NSPropertyListMutableContainers NSPropertyListMutableContainersAndLeaves NSPropertyListOpenStepFormat NSPropertyListSerialization NSPropertyListXMLFormat NSProprietaryStringEncoding NSProtocolChecker NSProxy NSRange NSRangeException NSRangeExceptionRaise NSRangeFromString NSRangePointer NSRealMemoryAvailable NSRect NSRectArray NSRectEdge NSRectFromString NSRectPointer NSRecursiveLock NSRecycleZone NSRegistrationDomain NSRemoveHandler NSResetHashTable NSResetMapTable NSReturnAddress NSRoundBankers NSRoundDown NSRoundDownToMultipleOfPageSize NSRoundingMode NSRoundPlain NSRoundUp NSRoundUpToMultipleOfPageSize NSRunLoop NSRunLoopMode NSScanner NSSearchPathDirectory NSSearchPathDomainMask NSSearchPathForDirectoriesInDomains NSSelectorFromString NSSerialization NSSerializer NSSet NSSetUncaughtExceptionHandler NSSetZoneName NSShiftJISStringEncoding NSShortDateFormatString NSShortMonthNameArray NSShortTimeDateFormatString NSShortWeekDayNameArray NSShouldRetainWithZone NSShowNonLocalizedStrings NSSize NSSizeArray NSSizeFromString NSSizePointer NSSocketNativeHandle NSSocketPort NSSocketPortNameServer NSSolarisOperatingSystem NSStandardApplicationPaths NSStandardLibraryPaths NSString NSStringEncoding NSStringFromClass NSStringFromHashTable NSStringFromMapTable NSStringFromPoint NSStringFromRange NSStringFromRect NSStringFromSelector NSStringFromSize NSStrings NSSunOSOperatingSystem NSSymbolStringEncoding NSSystemDomainMask NSTargetObjectUserInfoKey NSTask NSTaskDidTerminateNotification NSTemporaryDirectory NSThisDayDesignations NSThousandsSeparator NSThread NSThreadDidStartNotification NSThreadWillExitNotification NSTimeDateFormatString NSTimeFormatString NSTimeInterval NSTimeIntervalSince NSTimer NSTimeZone NSTimeZoneDetail NSTimeZones NSUnarchiver NSUncaughtExceptionHandler NSUndefinedKeyException NSUnderlyingErrorKey NSUndoManager NSUndoManagerCheckpointNotification NSUndoManagerDidOpenUndoGroupNotification NSUndoManagerDidRedoChangeNotification NSUndoManagerDidUndoChangeNotification NSUndoManagerWillCloseUndoGroupNotification NSUndoManagerWillRedoChangeNotification NSUndoManagerWillUndoChangeNotification NSUnicodeStringEncoding NSUnionRange NSUnionRect NSUnknownUserInfoKey NSURL NSURLClient NSURLFileScheme NSURLHandle NSURLHandleClient NSURLHandleLoadFailed NSURLHandleLoadInProgress NSURLHandleLoadSucceeded NSURLHandleNotLoaded NSURLHandleStatus NSUserDefaults NSUserDefaultsDidChangeNotification NSUserDirectory NSUserDomainMask NSUserName NSUTF NSValue NSWarnFLog NSWarnLog NSWarnMLog NSWeekDayNameArray NSWidth NSWillBecomeMultiThreadedNotification NSWindows NSWindowsCP NSWindowsNTOperatingSystem NSWriteOldStylePropertyLists NSXMLParser NSXMLParserDelegateEventAdditions NSXMLParserError NSXMLParserErrorDomain NSXMLParserLocatorAdditions NSYearMonthWeekDesignations NSZeroPoint NSZeroRect NSZeroSize NSZombie NSZombieEnabled nszone NSZone NSZoneCalloc NSZoneCheck NSZoneFree NSZoneFromPointer NSZoneMalloc NSZoneMallocAtomic NSZoneName NSZoneRealloc NSZoneStats NT nul num numArgs numberOfArguments numberValue numberWithBool numberWithChar numberWithDouble numberWithFloat numberWithInt numberWithLong numberWithLongLong numberWithShort numberWithUnsignedChar numberWithUnsignedInt numberWithUnsignedLong numberWithUnsignedLongLong numberWithUnsignedShort numBytes numericString numIndices numInts numItems NXConstantString nxcslen nxcsptr Oancea obj objc ObjC objCType objectAtIndex objectCount objectEnumerator objectForKey ObjectiveC objectsForKeys objectZone observationInfo observeValueForKeyPath offsetInFile ofObjCType ofObject ofType oneway onHost onth OOO op OpenSSL openstep OpenStep OperatingSystem operatingSystem operatingSystemName ops optimization optimized OptionalPortRunLoop OR'd org organization organize organized originalClasses originalKey originalSelectedRange originalSelRangePtr originalString origSelRange origString os OSes OSSPEC otherArray otherDate otherDictionary otherNumber otherPath otherSet otherString outputArray outputFormat outputName ovadd ovidiu ovrem padIndex padString parameterString parseErrorOccurred parserDidEndDocument parserDidStartDocument parserError partialString partialStringPtr pathComponents pathContent pathContentOfSymbolicLinkAtPath pathExtension pathForGNUstepResource pathForLibraryResource pathForResource pathsForResourcesOfType pathsMatchingExtensions pathWithComponents PEMpasswd performSelector performSelectorOnMainThread pero persistentDomainForName persistentDomainNames plist pm pointerCount pointerValue pointValue portCoderWithReceivePort portForName portMap portNum portNumber portWithMachPort portWithNumber pos poseAsClass positionInData positiveFormat posix postable POSTed postingStyle postNotification postNotificationName pre Predescu preferencesArray preferredLocalizations preferredLocalizationsFromArray prepareWithInvocationTarget pri principalClass printf privateKey proc processIdentifier processInfo processName programmatic programmatically ProjectCenter propertyForKey propertyForKeyIfAvailable propertyKey propertyList propertyListFromData propertyListFromStringsFileFormat propertyValue proposedSelectedRange proposedSelRangePtr protocolCheckerWithTarget proxyWithLocal proxyWithTarget ptr publicID punctuationCharacterSet qual qualifiedName raiseOnDivideByZero raiseOnExactness raiseOnOverflow raiseOnUnderflow rangeLimit rangeOfCharacterFromSet rangeOfComposedCharacterSequenceAtIndex rangeOfString rangeValue ratain rccr RDESC readDataInBackground readDataInBackgroundAndNotifyLength readDataOfLength readDataToEndOfFile readHandle readInBackgroundAndNotify readInBackgroundAndNotifyForModes readInProgress README readToEndOfFileInBackground readToEndOfFileInBackgroundAndNotify readToEndOfFileInBackgroundAndNotifyForModes realloc receivedEvent receivePort receivingPort recognize recognizes reconstitution rect rectValue recv redoActionName redoMenuItemTitle redoMenuTitleForUndoActionName reenabled registerClassDescription registerDefaults registerName registerPort registerUndoWithTarget registerURLHandleClass registree registrees relativePath relativeString relativeToURL REM remainingRange remoteObjects remoteTarget removeAll removeAllActions removeAllActionsWithTarget removeAllIndexes removeAllObjects removeAttribute removeCharactersInRange removeCharactersInString removeClient removeConnection removeEvent removeFileAtPath removeIndex removeIndexes removeIndexesInRange removeLastObject removeMsgForMode removeObject removeObjectAtIndex removeObjectForKey removeObjectIdenticalTo removeObjectsForKeys removeObjectsFromIndices removeObjectsInArray removeObjectsInRange removeObserver removePersistentDomainForName removePort removePortForName removeRequestMode removeRunLoop removeSuiteNamed removeVolatileDomainForName replaceBytesInRange replaceCharactersInRange replacementObjectForArchiver replacementObjectForCoder replacementObjectForKeyedArchiver replacementObjectForPortCoder replaceObject replaceObjectAtIndex replaceObjectsInRange replaceOccurrencesOfString replaceString replyTimeout requestedZone requestModes requestTimeout requiresTypedMemory reservedSpaceLength resetArchiver resetBytesInRange resetStandardUserDefaults resetSystemTimeZone resetUnarchiverWithData resetUserDefaults resolveExternalEntityName resourceData resourceDataDidBecomeAvailable resourceDataUsingCache resourceDidFailLoadingWithReason resourcePath resourceSpecifier respondsToSelector retainArguments retainArgumentsIncludingTarget retainCount retainTargetFlag returnedLength returnFrame returnInvocationAndDestroyProxy retval reverseObjectEnumerator RFC RFCs rfm richard rightOperand RNNN ro rootObject rootProxy rootProxyForConnectionWithRegisteredName roundingBehavior roundingMode RPORT rr RStringEncoding rtf runInNewThread runloop RunLoopEvents RunLoopEventType runLoopModes runMode runUntilDate saturday sbuilders scanCharactersFromSet scanDecimal scanDouble scanFloat scanHexInt scanInt scanLocation scanLongLong scannerWithString scanRadixUnsignedInt scanString scanUpToCharactersFromSet scanUpToString scheduledTimerWithTimeInterval scottc searchList searchRange secondOfMinute secondsFromGMT secondsFromGMTForDate secsToBeAdded seekToEndOfFile seekToFileOffset sel selectorTypeForProxy sendBeforeDate sendPort sendsToSuper sendToSuper serialization serialize serializeAlignedBytesLength serialized serializeDataAt serializeHeaderAt serializeInt serializeInts serializeObjectAt serializePropertyList serializes serializeTypeTag setActionName setAllowsFloats setArgument setArguments setArray setAttributedString setAttributedStringForNil setAttributedStringForNotANumber setAttributedStringForZero setAttributes setAutoreleaseClass setBool setBundleVersion setCalendarFormat setCapacity setCaseSensitive setCharactersToBeSkipped setClass setClassName setCurrentDirectoryPath setData setDebugLoggingEnabled setDecimalSeparator setDefaultBehavior setDefaultTimeZone setDelegate setDictionary setEnvironment setFireDate setFloat setFormat setGroupsByEvent setHasThousandSeparators setHostCacheEnabled setIndependentConversationQueueing setInteger setKey setKeys setLaunchPath setLength setLevelsOfUndo setLocale setLocalizesFormat setLockingDisabled setLogFile setMaximum setMinimum setMsgid setNegativeFormat setNilValueForKey setObject setObjectZone setObservationInfo setOutputFormat setPersistentDomain setPoolCountThreshhold setPositiveFormat setProcessName setProperty setProtocolForProxy setReplyTimeout setRequestMode setRequestTimeout setResourceData setReturnValue setRootObject setRoundingBehavior setRunLoopModes setScanLocation setSearchList setSelector setSendsToSuper setSet setShouldProcessNamespaces setShouldReportNamespacePrefixes setShouldResolveExternalEntities setStandardError setStandardInput setStandardOutput setString setSuspended setTarget setTextAttributesForNegativeValues setTextAttributesForPositiveValues setThousandSeparator setThreadPriority setTimeZone setuid setUserLanguages setValue setValuesForKeysWithDictionary setVersion setVolatileDomain setWithArray setWithCapacity setWithObject setWithObjects setWithSet SGML sharedInstance shiftIndexesStartingAtIndex shmID shortValue shouldBeCompact shouldCopy shouldFree shouldListen shouldMakeNewConnection shouldNotImplement shouldProceedAfterError shouldProcessNamespaces shouldReportNamespacePrefixes shouldResolveExternalEntities shouldUseCache sig signatureWithObjCTypes sinceDate sizep sizeValue skatter skipDescendents skippable skipSet sleepUntilDate smallestEncoding snu socketAddress socketLocalAddress socketLocalService socketProtocol socketService Solaris SomeSpecificProtocol sortedArrayHint sortedArrayUsingFunction sortedArrayUsingSelector sortUsingFunction sortUsingSelector sourceData specialization specialized src SS SSL sslAccept sslClass sslConnect sslDisconnect sslSetCertificate standardError standardInput standardizedURL standardOutput standardUserDefaults StartConstants StartFunctions startIndex startingAtIndex StartMacros StartNSArchiverConstants StartNSAutoreleasePoolTypedefs StartNSBundleConstants StartNSBundleMacros StartNSCalendarDateFunctions StartNSClassDescriptionConstants StartNSConnectionConstants StartNSDateConstants StartNSDateTypedefs StartNSDebugFunctions StartNSDebugMacros StartNSDebugVariables StartNSDecimalFunctions StartNSDecimalMacros StartNSDecimalTypedefs StartNSDistributedNotificationCenterConstants StartNSDistributedNotificationCenterTypedefs StartNSErrorConstants StartNSExceptionConstants StartNSExceptionFunctions StartNSExceptionMacros StartNSExceptionTypedefs StartNSExceptionVariables StartNSFileHandleConstants StartNSFileManagerConstants StartNSGeometryConstants StartNSGeometryFunctions StartNSGeometryTypedefs StartNSGeometryVariables StartNSHashTableConstants StartNSHashTableFunctions StartNSHashTableTypedefs StartNSInvocationMacros StartNSKeyedArchiverConstants StartNSKeyValueCodingConstants StartNSKeyValueObservingConstants StartNSKeyValueObservingTypedefs StartNSLockMacros StartNSMapTableConstants StartNSMapTableFunctions StartNSMapTableTypedefs StartNSMapTableVariables StartNSMethodSignatureTypedefs StartNSNotificationQueueFunctions StartNSNotificationQueueTypedefs StartNSNotificationQueueVariables StartNSObjCRuntimeFunctions StartNSObjCRuntimeVariables StartNSObjectFunctions StartNSObjectMacros StartNSObjectTypedefs StartNSObjectVariables StartNSPathUtilitiesFunctions StartNSPathUtilitiesTypedefs StartNSPortConstants StartNSPortTypedefs StartNSProcessInfoFunctions StartNSPropertyListTypedefs StartNSRangeFunctions StartNSRangeMacros StartNSRangeTypedefs StartNSRangeVariables StartNSRunLoopConstants StartNSRunLoopTypedefs StartNSSetFunctions StartNSStringTypedefs StartNSStringVariables StartNSTaskConstants StartNSThreadConstants StartNSThreadFunctions StartNSUndoManagerConstants StartNSURLConstants StartNSURLHandleConstants StartNSURLHandleTypedefs StartNSUserDefaultsConstants StartNSValueFunctions StartNSValueTypedefs StartNSXMLParserConstants StartNSXMLParserTypedefs StartNSZoneFunctions StartNSZoneTypedefs StartNSZoneVariables StartTypedefs StartVariables stats stderr stdin stdout storedValueForKey strftime stringArrayForKey stringByAbbreviatingWithTildeInPath stringByAddingPercentEscapesUsingEncoding stringByAppendingFormat stringByAppendingPathComponent stringByAppendingPathExtension stringByAppendingString stringByDeletingLastPathComponent stringByDeletingPathExtension stringByDeletingPrefix stringByDeletingSuffix stringByExpandingTildeInPath stringByPaddingToLength stringByReplacingPercentEscapesUsingEncoding stringByReplacingString stringByResolvingSymlinksInPath stringByStandardizingPath stringByTrimmingCharactersInSet stringByTrimmingLeadSpaces stringByTrimmingSpaces stringByTrimmingTailSpaces StringEncoding stringForKey stringForObject stringForObjectValue stringsByAppendingPaths stringValue stringWithCapacity stringWithCharacters stringWithContentsOfFile stringWithContentsOfURL stringWithCString stringWithFileSystemRepresentation stringWithFormat stringWithString stringWithUTF struct structs stylesheeturl subarray subarrayWithRange subclassing subclassResponsibility subdataWithRange subminor subPath subpathsAtPath subsect substringFromIndex substringFromRange substringToIndex substringWithRange summarizes sunday super's superclasses suspensionBehavior svr symbolCharacterSet synchronize synchronizeFile syslog systemDefaultPortNameServer systemID systemTimeZone systemVersion tableName takeStoredValue takeStoredValuesFromDictionary takeValue takeValuesFromDictionary targetRetained taskId tbl tcp terminationStatus textAttributesForNegativeValues textAttributesForPositiveValues theValue thousandSeparator threadDictionary threadPriority thursday timedOutEvent TimedPerformers timeInterval timeIntervalSince timeIntervalSinceDate timeIntervalSinceNow timeIntervalSinceReferenceDate timerWithTimeInterval timestamp timeZone timeZoneAbbreviation timeZoneArray timeZoneDetail timeZoneDetailArray timeZoneDetailForDate timeZoneForSecondsFromGMT timeZoneName timezones timeZoneSecondsFromGMT timeZoneWithAbbreviation timeZoneWithName titlecase toFile toManyRelationshipKeys toObjectsAtIndexes toOneRelationshipKeys toPath ToPath toRunLoop toTarget toURI transmuteClassTo traverseLink triggerChangeNotificationsForDependentKey trimLeadSpaces trimSpaces trimTailSpaces trueName truncateFileAtOffset tryLock tryLockWhenCondition tuesday Tuparev txt TypedStream typeForSelector typePtr TypesAndConstants TZ tznam tzset UI uint uk unableToSetNilForKey unarchived unarchiveObjectWithData unarchiveObjectWithFile unarchiver unarchiverDidFinish unarchivers unarchiverWillFinish unarchiving UNC undoActionName undoMenuItemTitle undoMenuTitleForUndoActionName undoNestedGroup unescaped unichar unicode uninitialized unintialized unionSet uniqued uniques uniquing unix unlockWithCondition unsignedCharValue unsignedIntValue unsignedLongLongValue unsignedLongValue unsignedShortValue uppercaseLetterCharacterSet uppercaseString uref URF url URLHandle URLHandleClassForURL URLHandleResourceDidBeginLoading URLHandleResourceDidCancelLoading URLHandleResourceDidFinishLoading urlHandleSubclass URLHandleUsingCache URLResourceDidCancelLoading URLResourceDidFinishLoading URLs urlString URLWithString usask useAuxiliaryFile useCompression usePseudoTerminal userDefaults userInfo userLanguages userName username users's useStoredAccessor usingCache usingFunction usingNameServer usingObjects usingSelector UTC utf utilizing uudecodeInto uuencoded uuencodeInto UXXXX va val validatedLaunchPath validateKey validateValue validationErrorOccurred validNumber validReturn valueCallBacks valueClassWithObjCType valueForKey valueForKeyPath valueForUndefinedKey valueFromString valuesAtIndexes valuesForKeys valueWithBytes valueWithNonretainedObject valueWithPoint valueWithPointer valueWithRange valueWithRect valueWithSize var vararg vars VER versatileObject versionForClassName vip viviani volatileDomainForName volatileDomainNames waitForDataInBackground waitForDataInBackgroundAndNotify waitForDataInBackgroundAndNotifyForModes waitUntilDone waitUntilExit WDESC webserver wednesday weekOfYear whitespaceAndNewlineCharacterSet whitespaceCharacterSet wildcard wildcards willChange willChangeValueForKey willEncodeObject willProcessPath willReplaceObject WINMSG withAttributedString withBehavior withBytes withData withDefaultAttributes withMethod withName withNameServer withObjCType withObject withObjectAtIndex withObjectsFromArray withRootObject withSetMutation withString withVersion writeable writeData writeHandle writeInBackgroundAndNotify writeInProgress writeProperty writeToFile writeToURL WSAEVENT www xedoc xml XP xref xxx yearOfCommonEra YMDH Yoo YYYY zlib ZNSZoneFree ZZZZ gnustep-base-1.29.0/Documentation/BaseAdditions.gsdoc000066400000000000000000000024451435650067400225620ustar00rootroot00000000000000 GNUstep Base Additions $Revision$ $Date$ 2005 Free Software Foundation, Inc. Base Additions

The GNUstep base additions package comes with the GNUstep base package, and provides additional non-standard classes and additional features for standard classes. It is also intended to be built standalone for use on systems where the GNUstep base is not installed, but where an alternative Foundation is available.

gnustep-base-1.29.0/Documentation/Functions.gsdoc000066400000000000000000000014071435650067400220160ustar00rootroot00000000000000 Functions 2005 Free Software Foundation, Inc. Function index Macro index gnustep-base-1.29.0/Documentation/GNUmakefile000066400000000000000000000072161435650067400211030ustar00rootroot00000000000000# # doc makefile for the GNUstep Base Library # Copyright (C) 1995 Free Software Foundation, Inc. # # Written by: Andrew Kachites McCallum # # This file is part of the GNUstep Base Library. # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public # License as published by the Free Software Foundation; either # version 3 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public # License along with this library; if not, write to the Free # Software Foundation, Inc., 51 Franklin Street, Fifth Floor, # Boston, MA 02111 USA. ifeq ($(GNUSTEP_MAKEFILES),) GNUSTEP_MAKEFILES := $(shell gnustep-config --variable=GNUSTEP_MAKEFILES 2>/dev/null) ifeq ($(GNUSTEP_MAKEFILES),) $(warning ) $(warning Unable to obtain GNUSTEP_MAKEFILES setting from gnustep-config!) $(warning Perhaps gnustep-make is not properly installed,) $(warning so gnustep-config is not in your PATH.) $(warning ) $(warning Your PATH is currently $(PATH)) $(warning ) endif endif ifeq ($(GNUSTEP_MAKEFILES),) $(error You need to set GNUSTEP_MAKEFILES before compiling!) endif PACKAGE_NAME = gnustep-base GNUSTEP_LOCAL_ADDITIONAL_MAKEFILES=../base.make include $(GNUSTEP_MAKEFILES)/common.make -include ../Version -include ../config.mak # The documents to be generated DOCUMENT_NAME = coding-standards ifeq ($(HAVE_LIBXML),1) DOCUMENT_NAME += ReleaseNotes endif SUBPROJECTS = manual General # The text documents to be generated DOCUMENT_TEXT_NAME = \ INSTALL NEWS README ANNOUNCE TOP_DOC_FILES = INSTALL NEWS README ANNOUNCE gnustep-base_TEXI_FILES = \ version.texi \ gnustep-base.texi \ gnustep-zones.texi gnustep-base_DOC_INSTALL_DIR = Developer/Base/Manual coding-standards_TEXI_FILES = \ coding-standards.texi coding-standards_DOC_INSTALL_DIR = Developer/CodingStandards INSTALL_TEXI_FILES = version.texi INSTALL_TEXT_MAIN = install.texi INSTALL_DOC_INSTALL_DIR = Developer/Base/ReleaseNotes/$(VERSION) NEWS_TEXI_FILES = version.texi NEWS_TEXT_MAIN = news.texi NEWS_DOC_INSTALL_DIR = Developer/Base/ReleaseNotes/$(VERSION) README_TEXI_FILES = version.texi README_TEXT_MAIN = readme.texi README_DOC_INSTALL_DIR = Developer/Base/ReleaseNotes/$(VERSION) ANNOUNCE_TEXI_FILES = version.texi ANNOUNCE_TEXT_MAIN = announce.texi ANNOUNCE_DOC_INSTALL_DIR = Developer/Base/ReleaseNotes/$(VERSION) ReleaseNotes_DOC_INSTALL_DIR = Developer/Base/ ReleaseNotes_AGSDOC_FILES = \ ReleaseNotes.gsdoc # # Hack ... using the -DocumentationDirectory flag overrides the value # used by the make package, and puts our output in the documentation # directory. # #ReleaseNotes_AGSDOC_FLAGS = -DocumentationDirectory . ReleaseNotes_AGSDOC_FLAGS = -DTDs ../Tools # Use local version of autogsdoc in case it is not installed LD_LIBRARY_PATH := $(dir $(CURDIR))/Source/$(GNUSTEP_OBJ_DIR_NAME):$(LD_LIBRARY_PATH) AUTOGSDOC=../Tools/$(GNUSTEP_OBJ_DIR_NAME)/autogsdoc BASE_MAKE_LOADED=yes # # NB. Library reference documentation is generated by rules in the postamble # file using the make file ../Source/DocMakefile. If headers are added to the # library, you need to modify that file to get the autogsdoc tool to use them. # REF_DOC_INSTALL_DIR = $(GNUSTEP_DOC)/Developer -include Makefile.preamble include $(GNUSTEP_MAKEFILES)/documentation.make include $(GNUSTEP_MAKEFILES)/aggregate.make -include Makefile.postamble gnustep-base-1.29.0/Documentation/General/000077500000000000000000000000001435650067400204005ustar00rootroot00000000000000gnustep-base-1.29.0/Documentation/General/Debugging.gsdoc000066400000000000000000000145411435650067400233210ustar00rootroot00000000000000 Debugging with GDB Copyright (C) 2005 Free Software Foundation, Inc. Debugging

GDB is the GNU debugger and is the main method used for debugging Objective-C programs. Full support for debugging Objective-C with GDB was added in version 6.0. This document will describe the various features of GDB that help with debugging Objective-C programs. However, GDB is a very complex program, and not everything that it can do will be described here.

Basic GDB usage

To start the debugger, specify the program you want to debug:

gdb myprogram

With GNUstep you can also use the debugtool and debugapp scripts to begin a debugging session:

debugapp MyApp.app

Following is a short list of important commands that gdb accepts. After this list, a more detailed explaination of each command is given.

run args - Run the program break func/method - Stop at a function or method print var/func - Print value of a variable/function backtrace - List the fuction stack frame value - Move up and down the fuction stack help - Get help on gdb commands quit - Quit the program
The run command

This command starts the program inside the debugger. You can optionally add arguments to the run command and these arguments will get passed directly to the program as normal command-line arguments. For instance, you might want to start an application and open a file:

run -NSOpen=afile.txt
The break command

This command instructs the debugger to stop when it reaches a certain location in the program. The syntax for break can be very complex. However we will only cover some simple examples. One instance is to break on a particular line number.

break afile.m:345

will stop the debugger at line 345 in the file afile.m.

break a_function

will tell the debugger to stop at the beggining of the a_function function. Finally, and most importantly for Objective-C programs, you can enter a fully-qualified or partially-qualified method name to stop at. A fully qualified Objective-C method name is specified as

-[Class methodName]

where the minus sign is used to indicate an instance method and a plus sign (not shown) is used to indicate a class method. The class name Class and method name methodName are enclosed in brackets, similar to the way messages are specified in Objective-C source code. For example, to set a breakpoint at the create instance method of class Fruit in the program currently being debugged, enter:

break -[Fruit create]

One can also specify just a method name:

break initWithValue:

gdb will automatically determine what class this method belongs to. If there is more than one class that implements this method, you will be presented with a list of classes that implement the method from which you must chose one.

The print command

The print command can be used to display a wide variety of information that gdb knows about the program. As with the break command, the variety of things you can do is very large, but we will discuss only a few of the things that can be done. Below are several simple examples of printing the value of a variable.

print aVariable print anIvar print self->anIvar print anArray[4] print aStruct.subvalue print *(int *)pointerValue

Note that you can specify variables in the same way you specify them in source code, using array subscripts, pointer dereferences, etc. You can also set the value of a variable using print:

print aVariable = 4

One can also print the value of a function. Here gdb will actually call the function you specify and return the output:

print my_function(4, "hithere")

When debugging Objective-C programs, the same thing can be done with methods.

print -[object hash]

A special command has been added to gdb to print the description of an object (based on the method of the same name). This is the print-object (or po) command:

po anObject

Which is the same as typing

print -[myObject desciption]
Other command

The clear, info line, jump, and list commands also accept Objective-C method syntax for specifying locations.

gnustep-base-1.29.0/Documentation/General/GNUmakefile000066400000000000000000000036651435650067400224640ustar00rootroot00000000000000# # Makefile for GNUstep Base Library documentation. # # Copyright (C) 2002 Free Software Foundation, Inc. # # Written by: Richard Frith-Macdonald # # This file is part of the GNUstep Base Library. # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public # License as published by the Free Software Foundation; either # version 3 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public # License along with this library; if not, write to the Free # Software Foundation, Inc., 51 Franklin Street, Fifth Floor, # Boston, MA 02111 USA # PACKAGE_NAME = gnustep-base include $(GNUSTEP_MAKEFILES)/common.make include ../../config.mak DOCUMENT_NAME = General General_DOC_INSTALL_DIR = Developer/Base General_AGSDOC_FILES = \ Debugging.gsdoc \ OpenStepCompliance.gsdoc \ # # Hack ... using the -DocumentationDirectory flag overrides the value # used by the make package, and puts our output in the documentation # directory. # #General_AGSDOC_FLAGS = -DocumentationDirectory . General_AGSDOC_FLAGS = -DTDs ../../Tools # Use local version of autogsdoc in case it is not installed AUTOGSDOC=../../Tools/$(GNUSTEP_OBJ_DIR_NAME)/autogsdoc BASE_MAKE_LOADED=yes include $(GNUSTEP_MAKEFILES)/documentation.make # # Ensure that our destination subdirectory exists in the Documentation # directory, and temporarily copy the base source file here for autogsdoc # to use. # #before-all:: # # Clean up temporary files used while generating documentation. # after-clean:: if [ -d General ]; then \ $(RM) General/stamp; \ $(RM) General/dependencies; \ rmdir General; \ fi gnustep-base-1.29.0/Documentation/General/OpenStepCompliance.gsdoc000066400000000000000000000062061435650067400251550ustar00rootroot00000000000000 OpenStep Compliance 2005 Free Software Foundation, Inc. Classes

This file documents the complance of all the classes in the GNUstep Base library. Note that the following is just a best guess as to the compliance of the classes. Each class was checked to make sure it implemented all the documented OpenStep methods and functions. In addition, extensive testing has been performed on the GNUstep Base Library, and it is believed, to the best of our knowledge, that it operates according to the OpenStep specification, with the caveat that there are always bugs in any implementation and there are most likely bugs in the current implementation that we are not aware of.

The following classes conform to the OpenStep specification:

NSArchiver NSArray NSAssertionHandler NSAutoreleasePool NSBundle NSCalendarDate NSCharacterSet NSCoder NSConditionLock NSConnection NSCountedSet NSData NSDate NSDeserializer NSDictionary NSDistantObject NSEnumerator NSException NSInvocation NSLock NSMethodSignature NSMutableArray NSMutableCharacterSet NSMutableData NSMutableDictionary NSMutableSet NSMutableString NSNotification NSNotificationCenter NSNotificationQueue NSNumber NSObject NSProcessInfo NSProxy NSRecursiveLock NSRunLoop NSScanner NSSerializer NSSet NSString NSThread NSTimer NSTimeZone NSTimeZoneDetail NSUnarchiver NSUserDefaults NSValue All Protocols All Functions

The following OpenStep classes are not implemented. The usefulness of these classes it marginal so it is likely that we will never implement these classes. However, we would be pleased to accept their contribution should anyone care to implement them and assign the copyright to the Free Software Foundation.

NSBTreeBlock NSBTreeCursor NSByteStore NSByteStoreFile
gnustep-base-1.29.0/Documentation/HtmlNav/000077500000000000000000000000001435650067400203745ustar00rootroot00000000000000gnustep-base-1.29.0/Documentation/HtmlNav/README.txt000066400000000000000000000015771435650067400221040ustar00rootroot00000000000000 The files aside from "docs-web.html" here get installed into '$GNUSTEP_SYSTEM_ROOT/Library/Documentation'. They provide a simple means for the user to navigate through the various GNUstep documentation that gets installed there. It includes links for the GUI documentation, which may not necessarily be installed, but it points out that the links might not work. This approach seemed better than maintaining two separate index files for GUI and Base. If you add documentation, you should also add links to it in this HTML file. The file "docs-web.html" is meant to be installed on the gnustep.org web site. The entire contents of a freshly built $GNUSTEP_SYSTEM_ROOT/Library/Documentation should be put into a subdirectory of that site's main directory, then the file "docs-web.html" copied there. (Its name can be changed if needed, and the other html, css, and jpg files can be removed.) gnustep-base-1.29.0/Documentation/HtmlNav/docs-web.html000066400000000000000000000207701435650067400227730ustar00rootroot00000000000000 GNUstep.org
GNUstep.org

GNUstep System Documentation

This is the system documentation for GNUstep, including both user and developer documentation. GNUstep provides an object-oriented application framework and tool set for use on a wide variety of computer platforms. It is based on the original OpenStep specification created by NeXT, Inc. (now Apple). (Top)

User Documentation

The links here provide some basic information on setting up and using a GNUstep system.

User FAQ (PDF)
Developer FAQ (PDF)
How-To (PDF)
Filesystem Layout (PDF)
The GUI portion of GNUstep.

Developer Documentation

The links here describe the development facilities provided under GNUstep. The Base Programming Manual introduces GNUstep as a whole, Objective-C, its main language, and the Base library, its basic set of non-graphical utility classes. The Make Utility makes project building easy and is highly recommended. The "API" links go to Javadoc-like reference pages on the Base and other GNUstep libraries.

Base Programming Manual (PDF)
Make Utility  (Release notes) (PDF)
Command-line Tools
 
Base Library API  (Release notes)
Base Additions API
 
OpenStep and OS X Compliance
GNUstep Coding Standards (PDF)
Debugging Information
The GUI portion of GNUstep.
GUI Programming Manual (PDF)
 
GUI Library API  (Release notes)
GUI Additions API
OpenStep and OS X Compliance

Development Tools

Project Center provides an integrated development environment (IDE) for GNUstep. Gorm is a graphical user interface construction tool. Using these, developers can quickly design and build cross-platform applications in Objective-C or Java.



gnustep-base-1.29.0/Documentation/HtmlNav/gnustep-header14.jpg000066400000000000000000000310311435650067400241540ustar00rootroot00000000000000ÿØÿàJFIFHHÿÛC      ÿÛC  ÿÀJ0"ÿÄ  ÿÄR  !a1A QWq–Ó"2BR‘´#¡³3CVbefr•±²ð $ÁÒÔdgtu‚¤¦ÑáÿÄÿÄ4!1ab¡áAQ"±2qÁð#3B‘$RñÿÚ ?Ž[½Ì½Ì'nA¹Nµåi(î÷1Øž?p=_Ô ß©³“V©2ØvJ.¨N à…ž`C( äµ¼©(ØÝ³ÃÚ´¤ÊÈé}£øyTõjPT\YóQ3ø$û€áˆäMñ<¡;‘+E% ØÎïs Ûow‚Ñ•&î÷‰ÓÀ·IꆸÎ^·4¢fí+Qm-Ï7ÌÔìê²[B³Ð¥°žu'ÌòQˆ ¹ßÀUN•èݵªRÈúÝJ~vl„€JÑ2¹a×ÏðK¢8Øù]åât[°ñ‡Éª™ðAx¥ÜDRûÇ6»ÛÚézP)Õ *iôÊìÜœ¨rŽ•(6ÛëBA9êpL]t|ÁjÛ¸â³SGºì¨ÿävþr9ÙÅÐX1.s@ÊiNªiÏÜPW©úílIÌ_S”ô¿K©Rzœ'‡q ,%n ²9¹P$„§kˆ»BßÓ¾4¯Ë2Ö•\•™4ÓrŒ8úR¥ÛYj$žª'©†æƒÝ3—:]]—wgÕîYD>rFYqÐÓÃ>Ymkœ?øÆs’ÍUéö?„f;Œi@ý9xz 4°ž6£Æïx•¢5HºYDå*s™TšÔ >­:€p@óC€ÌÙ꜂9 ¶­šÌ´­‘Oi·j Ê ŠŒêRRf ÆPœ(á°p2rUÓ–.owŽŒ&SÚñYÞ›éàºö‹ËIÔøÃÒzmBY©Ù »Ê–ÄÌ»È mæ×6ÒT…¤H øˆ’œZp©;£uç¯k5§g´Îv`%H$­Ú;«=Y9%¢z!Ãþʺò©q—A\Ïš0=÷Õ#øæ£èZü¼ôú•rÛZ{~».–ïdÌÉH±>ÚU+6¤%Rë$à)aЈ#9) æbñ2Aˆin BÓ M’3kæw¼½â`ñoÂÌö‡ÝÂéµZ~¡¦5'ÊXp¥K]%Òr%ÝWšNÏŽ0zŒªoÿÖc©¬™ì:,Žc˜ê*͸”áK´¯Ên ZÍÕSp?5$ÚÌÝCu¬<‚¥á<£®GN±[{½âê8áW/¢¦†Ò¯ì•‹½Þ1`${á%æÍŸÙhÄ1­}eÓ4¾‰O»x—Ó»R«¸iU›šBŸ8_*öž™Ckå8<ªåQÁÇCãŒî4óBèVÍŒš’W~q¹Ï_žÞh2SËøF:¸¬ÄRÐW3Ç&Œ øßTãš‹ôœ+–ÒÑîó•/ù% –GŒlmCd˜Öì\HÕUïxŸÜðí§å`Þõ á%ÌRª 1*d'¶G*ÛR0å99]ûÝâà=ŠæÒ=TíW“þÅq±„¹‘Ѳåëƒï‚º“_¢¡ëZÒª7H»¤”ä&&R¬9+6úÝq‰‚P]o ;d©8§CÓ}@ÒûÙú-ýmOÐg÷ìËJ,ÍH+iáøI þ$“ûã‰rb±i·/>ëu6(ÚCnýT¡â¯…Y½ ›”ºm™ÉŠÖOÌìÑI™§¾A!§ @ J€%+x ¡ŽïxrÞ}ßÒô†oª¡pKÒåQ+Ofn`©¶„TøsVG2RI†FäuálŒ ŸuùK­¢‚²~t‡½Gá…«“RîOä›”Õ`±üãfO-'—í¯¯\ž¾q)iÜ ðÏW¢š•&¡V©ÓÁ!SR—hõ ­)#§Ÿ^‘F{‘w\+›ÑS\?é ¯öIŽ>5³D6êx-°dyÊZc„þ%-:¤Ô¥éÏ6Ì£®2ŸçŒº²°‚R1޽G„S¶ïxMÞïäua‰ñ^g—_ºË#šú¡J_ð}¤v~¶q/\µ/dÎ*•)l½PhHÍl/u2ÍŒœ§«¦Ÿpa 5ž¬ê陫SÞª[úJeÊâX—C¯Ë¶µTœ%%kÀû„S6÷x¼mRV?ìõÓÿ»›{þq“ù¬qi][õ.‚@ŸàBnË]雸¬I½Õ,ÍËÔeê2©PüI ]G€q1W:½¥Wf‹kLí•v²YBòS¬d³<‰y²FpJJH=R Að‡ß òú‹Hâ·O.^tÐ$ç+²ÒŽ951²ÕQ¥ºì²z¼ yå$þ"QËÌ'w¤]ûR‘né}b±mKÜ¥?=/&—æœe¾VT¢æÙJÜ <¸鬸æ*d“Á‰9Ùïó Nk$ˆ¼ !T>ïx7{õz¡6ÖM¶íJK#Á ÛrÓ'ó\Â]QüÕÿºíÄãé\Ô­µ?Ž˜™´)ª{²œuó;Ûùþ–L£Ý3÷{ÃÆÁ¹äíV¦T*É[´Òä…i¤g™É)”_² ?hÛíVÜMǦ”¾e¤'ÖíÉש¯$ù¨!EÖOËhFâ,[jíJ†œÝbr¤°víË´ÉÏ/Àr²èQeõôHYòDAΤ8U  6<¼­¹Ë3S«6ÌòÒó²3 ¾ßèL4@So$ù¥Ä)*ÜD~–MÛ=eêu&㧆ÝzQì­‡‡3O¡@¥Æ–<Ò´)I#öVc¥ÌRªZ‡¦ÿ͙ى]Z²¥K ÈL6Q1U¦7•B2^—‘ø”×@ D0ôöÂrñ¨MÔjsj¢ÙôÅ#ùV¦+^Vp‰vâëîʆÓó=" ñ”æVe7¢÷¥F½ôÞ‹M£Î¶‰' ‡O*ó®„§ñã¶üãŠ8mæÔ¥)…,ò¨ac.¥#P£×æéUY7©Õ)WKs2Ó ”8ÒÁÁ ¨"%¥ùxÚ¶kT»v­fÓëo¶Ùe»NióêÖÜ’ŽKehVURx·_$–ÎÙ µµ6ƒ)$ÚQ©(CA™Y)úƒTÛ¾–]?º%õþ[W¿ßÿæ kƒŠ®³[V¬Q;êÏ2X[‹JÂùJyH)È9éƒ7{½Ìdødnh~aíÄ+ñ$¢ŸßÝúÿ-«ßï‡ÿóCYé·¦'˜˜uo¾êÊÝqÅ•)j'%Dž¤“Ô“ [½Ìcv;ÀÁ`«]ׇ»nfóãJíéV·÷®IW_F9¿ eaç•ß ¶³ùC댷1é4ÕqîŸcøFbpú<8{¨P(Ó:åwH®Nr©(emYGÑÊ´Ë,‚äÙ#s”%ÆQÌ®¡Ä˜‚tNÏÐ+æì”ºïEÍÑmùÚ‹)š¨ÉŠÙan'œ&Pœ¤gyˆ¦ýÞñx\UÜv瞊z~Qç’íb«HnÞ¦£<®¾ÐHõÉ¥'' RyÁÁÀ[é¤QfçxÍ€|asÍ‹Ñ[;ZE.× NgŽ­ñ¿)Ç5Aé=uMZÚ4´(¡bv¤R pAä–ÁÌV‡îg ñ¿hãÿ¾f,—ÒŽ®[?F;ÎTÿä–…1ÿëöC?°ïÑ/p¥Å]XlTèN¸ Yúìܯ¨ÓçjkÍW{==`Ñ_ã?Ûý8gŇ Õ}ÔCY¡33RÒú£äSgÕ•ªEÃ’e_#À€ BÏé'ºUˆbÌÛÒÓLK¼¶&X[N¶²•!@äGPAEÒð·Å³Äš¿¡:äÄ¥J蛓2­;<¸Y8?³29²$Žd¡‘Â<ËúOû…&‘+r;¡Nî9ÕË蟡ô…/û%En÷‹Õô„Ë3Nôh5#, eåëôöZY!)JÀ>=PÆìKáÆðÿ©QÄê.Ù ngŽ­ûò‘üsQcÞ”rÚ:9ÿÆT¿ä–Š¥ÓÛ¥6n¾X÷‚Ð\E ¿%RRÉPaô:@yå‹¢ã÷MêÚ§ÁÕ«|ØÌ.åþoLš‚›NézŸ0Ð+}¼uXO#J ø •à˜SÌdN<5N1p¸Gû½ââýŠæÒVÿçŸØ®)8J‚GRz<Ì^÷vöŠð#qÞš†Òí•Õæ\¬L7:6Õ+ Ë 6§?„^*“‘˜ŸÄ·Ô–¥ªmÕ7qÄæ£õ¢¡üJᇻÞ7nš÷óS®;‡“kùR©1;Èzrã¡òæ÷Âìt›£@YHÕvm&Ö»ÿE5\V-`É8¼&zAñ¹)<„’Bo Ôá@…'="Ô4ß=ÕzcNµZ’öÃÓØiç'šLíõ眬s5’F9’¤§Ä¬c1Ã*¼ØuFz¯¦³÷ ß}NP%*ÒÒÎ>ÒÚ9R2Êm´¨©ÜN ”¢¦ðN"±äå§j‰jtŒ«Ó• ‡’Ë̶Tã‹$”¤ •pŽafnõ_µ,4= ³3øG éµœ5kK\½ _mºÍ-N¢@¸pÜÃK9;JQJ TO*–œ„V¶ïx½-pfsOý†Ý¾Oó‰«F•Ju—– Œ×; úÊG)$&ʻŠîİ2>Hˆqº5~éLÀ¦–”·{Åãð0®oEtÿ¤*¿Ù&(›v/K5sz%ëÇý!UþÉ1ˆÿ`~aK ?©ú*?ÝïïxNÝî`Ýîc¬²R±ïF¢ù¸êºÇú‰5üt”N]fãŠÅÑn júw[³«µj=¦rfIL†–e€”@°GŒ@ÿFjù¸ð»Gú…5üt”s^>WËé?¾GþÇNþ ¨àÉ 'Ç¿€ sæaÁêkÖ=%:eR´ª”æôþæmÉ©GYB”ä¶T‚Oôžbœ7{ÂvïsïsHpñAy=Vg½Ò~$£»Þ>¬ú]=è¸ÓZfª™ ;+ù‰DZ›õ9drKË©!פ„À‚FOCœâ>yíÄÊQ¨/ÞUF4™w¶)Žà¦fd •¬g*m BˆðRŠG1uÅ71=ÿgvR~mÕ?51§Vû¯8³ø–µz‘*=É9Žv?ëtmkÅ_Ó˜Ÿd´æ£ðC¢·#÷µ&å¶§®a*S.ý¨åzm9,ã¡€rSÊ ƒ×*c‰Þ"j\Ck»UïRrkRØ2´*k« [M¨‚·\#¦âÈ€pJA<¼Æ=P¨•{–ãj•E“\ìêÁQ PJ[@ñZÔN:•(€#·P,{jKv “¼=YÍ©šå^qR6쫸ÉBzqCð·ËŸ ¡Çp?9%Îæ¢çºAUApP¥)A)J=IN!öÓÌã+m9ÆT‚8’ Ôê  bNô¬mœƒ-cP%hR rëå| ÑŸ?%µž—”•]Ú©*•§”¸õÃ+PF2 4„¨äT=Þq³;ý¿ŸéU”{¨Ó¹…d|~Èœq'©çübU°-=Cå—C6ö¢N8 SÒµ®PTz–‚ ”šPy?•ä—;™Ðêbà*°jb±GngjªŠº>zÞÀ*QŸegú4$%Yu%HW!ð$&+A£¢ ¢yi¥ÇPÔª¤¥çze3”IeÎSoÆV=m¡ Vûª ;,ȵs'8lç =‘yÜ÷5³XzBŸ#+©Ò¨Tí­D•¦*Ÿ-<ÛÈP˜­J6  ÔêÀW PO*2[JÈ) gf¬Û GZä`NYâõ2Rm7ÔûYJg&R[¦´¢JÏâóæ%XcPu"cSêOZº[ÛŸ››3ÅÊáÚrƒ©»eص+¹É¹÷fZ Z”ü*¯_žJÉ£Ç.:¯4œ©D’ï ŸT§ÈÚ–”«Ô« ”érQ‡×—çß#•Ss88.(t~#ð2PnÛú¿z&JRpKÑíÙSL¡RÚØ‘“Ä¥°r¥’\YRÕæ¨i‡0ŒƒÊAq·%¥PNZeêéG­KàÌHNµ4Ðÿ9µ…ëL*ê]1ª½]2Ê 3ꘑZHRW.öe@[q&Û½ã§] ]Zl^ÿÒTh)Eº€0@ T“ÄÕSaLäù°?hD£H bθ·u:W˜l¿$Ëü³»¬,<͵(GG¿­÷d¶¶³–»‚FiÔoX§¼K²3`ŽRPNzF#‡#¾X72«´¹2”Ë·]:Yr”Ög\ —­È¸Iršê‰ª•4¢qŸÃÐòEo±õ Ñq`ïxÈw¿î‡ÅÓd™iyêí®&'íö(•y²™Ú2òAfe¾¥8 ¤9ŽUcÈôŽo½Þ-(–ÒRÝïÝî!3v=n÷‰ƒj4R¦ïx]§K¬Ó Ÿ¢ìÚ‹,g  \YìLüãR™E[Ò­TjeÉ:ZÕÊÖ—¦Õ6ÙGЉ'^ú£~·:™$»+ʆçÖ€ÓŒ´y“$Ðêõ”|V}ý=ñ Öi<©"niÔ[}Î?Íú„~HY[‰J|Iœ%n÷éUK»8®‰GáA÷¬ŽŸ¸u‰“IRÛyàf—Ê8/–ïxNÝî`Ýîa¢’~çx¼_F…Z™'À•ØÔíJVMÓ~M)(~a($zŒÈç(³s¼gr0â!ÛÇ’éiÙ™}ñÂ&’k…Jjê¡ÜÔëPÜÏÔeÜmrÕŽž°ÐP%]ÝI ÷…ô­¯ õâÓ©¾‰Z=&ðBÈDõ½,ê\èCkZàÜùÅPÁ4#.{Ç•'9Ž7JRÛÜ#ëõÅVD³vk4†Š°äÕZµ),Óc§Rï2‡_ÕJn†,+@ø Ó»2¹!tëßE¾kRê1A“™Oò[KAt¯ ™ÁÁåRP"•ˆ¥ Îðnw‰ËÒ ÏCò“Kn­}p¢½n¶Òn³Nm´”Ͷ`‚>røÍšbcÒoªïK>‡ÙTû4 ¤«þæÀèGCÖ"–çÎ ÎñFòï.Í¢œ’mT··;Äžáã‹ Dáê²ä­!H¸¬©—·gíÙçJY+ eÆV2Zp€P*ÇP¬ E=Îðn|ã ö2Fåp°¨m´ØWªÏ\(jQzgÍKN²‚}^»m3Sm¥dd6´ó’r J{7g¤cE¬‹t]°¦ªs … F=ºU1£ä®Tþ3ïåNhE$n|àÜïñ€Ãƒë^עѶ‘u=QÕ‹×Xµrzô¾ª¦¥W|4ÚC ò²Ê3„ dàg$åD’I<hn|àÜùÇHÐYˆµÒt¾ë²x˜Ó«Î¬ÔÄÍ.sÈTç”BTòÚ—™C« …) ¨„)ñ#Æ%ÏSé÷T-?•²(÷ -ÊÄã“f¹+.Ð^ðd'“i÷ ?Ñ«9Ç–3û¹óƒsç:&:A!âÈioºÞÜùFÔJv™X”¨Ó¦Þ¨K<—¥¦eÜ(q•¤‚•¡@å*0¹óƒsç*éXV¥qwýÛ=oéýðCZJ¬Iº&М5W—G:K¸ u9éð?¤?Y)€{ãGsççÎ*Ž6DomMÄ»R··;Å‚ðÃÇ}oF­I;ÿ¥L^6 ± ~UÀ'éh'% <®¶:áµù+H®ÍÎðn|áI&nW„4– ÷<"}7Z-t‹—›w6;B|/>;ØÇ7žw?8„œOqËqk}µ3dYô§¬Í=uÀfÒû¡SÕ0•e)x¤”¶€@VÚJ²GU(tŠþÜùÆ9ã4x8cvmIê×J÷ à·÷>Qž~Ñ¡¹Þ ÏœoYéX ülÔ4†«ó¥M]r§Ôô¨“Z}v–µœ¯h,„8ÚŽT[%Q*© œÛÜÒªŠ¼i¶Û«º×•)Ù+5¦ê$«ô²ò¹A'ÏúN±CÛŸ87>qÏ“ .6 öZ+Ú)L(8±¹ø‹º¤¤Ä‘¶lc¥Êe.…­ÇpG¬> 0§0yBGáH$ ’¥*&î|£Gs¼Ÿ8ØÆ26åh ©u¸Ù[ÛŸ(²ŽxÊÓàr§¦wE 矮ÌÍNº‡ér2ÎKúR œ˜B²ëø~YŠÉÜïçÎ#,L™¹^›Ia°·wc×?hÐÜùÁ¹ó‹”)KÞ5âÑá÷‰zåçyÓ«:\í°õ1¦¨²ìºðus2î‚C®¶@a@IÉdÂ^çΖ“¯5Hͱ(™ÕÊ1´¹„²ŸÂ ­C ÁÁê"qAÏU½Ï«JwœûFâf‰$àr—FdIK”þ‹‹—œñÇãp©Y÷`yE…]œbiÅë诤ðõD¶îµßkµhô4>䌰“rfXË¡0\åQi\§“'#!=qç-ZfϬ;üµBBº—¦ä„ä®Ožû'¨=|cvÙ¦7CœšªÓë”ʽYÖ„• S'xL¾Caeµ¤-<¨RÈ$c›0¤c$¢} Í6—6ëÕ?ÛþA´´þzJaïY·eŸÙ©™WKn\õ€L²\™2Œçñ(c˜õTž^9s^U›ª°‰š“é 2’Ü””º6åd›òm–ÇD$¼ø’OXõ|ÕÙšº›£Sç¡Qõ x PA;ŽàtæqeK'ǨB<ÝâÖŠÔ¨e¸^YýcùGåy(þøÔçTyç‹,¤”S4´¨õ Ž„xŽùmÝòz“+#j_S¦æ@KVíÑ6³•r™‚ÁÙwQçmGÄ #—?hÊ])VAü¢.ÜS)®’UÅRZþzVM׿‘ªtgp »=,•H¤$r¥’VÖTóÕ$˜ö—J˜ôðÔ­9§&yeÙ›ºAvµi×H5‰&ƒô™ÅI+q±°ONl9ï1 TJVR R H ô b¸Ük)ôRpõRòùÿÃí¿¨ª!ûŠŽëVýί²df×’TÛkaK'%L'ÍQÃÊÍ”«–:¶>ju+ÖÃt©É{šÙ›m†¹ðŸ[•Aœ–VNnv ž xÇ"Üï2µÉsOºN¤êEU,Qoë‚—.:%‰ZËí·ÓÃðcÏÝ ËÖ}bq²…j}Ðñ)®Ì$þð¬Ç.ÜùÁ¹ó‡‘žÉY©^¥V¬Öê·[¬NUæ¼7§&VòñþÒŽcM<©ê<}æ57>pnw‹8(ÒÞÜùA¹òÏœŸ8KŸ´=¬K¶VÛºf˜­K¹P´êòÆF½$ÙÎ0¢qèmIKˆ?´1œësççÎ…À£içzÚs6}Ú™34ÝR“4Èš¤UXf~YDò8œø˜ROT¨Ÿi%â…ŽkÞ”äÚj²¯‰WªÖrÜS’ްA›£<®…érN UÓ¥Uxô#0™uص;nIº¼¤Ë7£2¼H×éùT»½X=YtÕ§P9ÆGX¤8ÿ©×²{Ñu@LÏK?t®}ºÌ»{r×=!ÀŠ’Q€o…I”~Y Çë^˜“¶îU-äËÛ—ªÀ4ª˜ O(ž¤¹.øÙR¼s¶1Ÿ8ŽAxWŒzÝ÷õƒ(â4LuÝ]°)ÈQt[WBX÷Ù5#?³¼.|ü3(̽ ‰”›RVü„žêÝ@ŸŸ¨¢¬ãjm²á¶Hl(¥9 äÇ ÝíÈ©­™:à õ˜• U¥N—,¬¬~l­ìü¡@Ô£E±S»ÓëŽ=K\Ëõ¤¥uyõƒ1‚:†ŸÂÊ|qŒ«ÄCO+$œ“’cvå“n—~Tä˜W4¢^+•PðSKm‘óJ’cñ¥MOK®iE2”æÏô³oå-§°>*W¹)É‹Ej³(˳“¡–°:-j8J:’O±96ÒÔܼ¶}Q€B èVOŠrª?)ºŒ»rfŸKJ‘'Óu倘#ÌãôR<“ùœ˜HÜï»N–öçÊ Ï”hî|àÜùÃJ–žçxÇ<8½¥8‹øû¨ÿ\T>ôÒœEü}Ô®*z8;ç¿…»aÍ7yà燴§u늇ރÚSˆ¿ºõÅCïA¼:{øFÚnóÁÏ/iN"þ>ê?×½´§u늇ރxt÷ð‡4Ý烞^ÒœEü}Ô®*ziN"þ>ê?×½ðéïái»Ï<8½¥8‹øû¨ÿ\T>ôÒœEü}Ô®*z áÓßÂ6Ówžxq{Jqñ÷Qþ¸¨}è=¥8‹øû¨ÿ\T>ôç¿„l9¦ï<ðâö”â/ãî£ýqPûÐ{Jqñ÷Qþ¸¨}è7‡OØsMÞx9áÅí)Ä_ÇÝGúâ¡÷ ö”â/ãî£ýqPûÐožþ°æ›¼ðsËÚSˆ¿ºõÅCïAí)Ä_ÇÝGúâ¡÷ Þ=ü#aÍ7yà燴§u늇ރÚSˆ¿ºõÅCïA¼:{øFÚonwŒsËÚSˆ¿ºõÅCïAí)Ä_ÇÝGúâ¡÷ Þ=ü#aÍ7yã;áÃí)Ä_ÇÝGúâ¡÷ ö”â/ãî£ýqPûÐožþ°æ›¼ñÎðáö”â/ãî£ýqPûÐ{Jqñ÷Qþ¸¨}è7‡OØsMÞx9áÅí)Ä_ÇÝGúâ¡÷ ö”â/ãî£ýqPûÐožþ°æ›¼ðsËÚSˆ¿ºõÅCïAí)Ä_ÇÝGúâ¡÷ Þ=ü#aÍ7yà燴§u늇ރÚSˆ¿ºõÅCïA¼:{øFÚnóÁÏ/iN"þ>ê?×½´§u늇ރxt÷ð‡4Ý烞^ÒœEü}Ô®*ziN"þ>ê?×½ðéïái»Ï Ô·¶­»‰Ð®R©42;ó<‚Gæcôö”â/ãî£ýqPûÐ{Jqñ÷Qþ¸¨}è>§¿„l9¤¹*µF™1»NŸ˜sö¥ßRçÊc«ÛÕ‰š“vÅJ¢¦æêLOϾ‰µ0Øy^¯(‡[ XNTÉ?ˆŸêÏ=¥8‹øû¨ÿ\T>ôÒœEü}Ô®*z"q÷þ=ü& ¯TÛ.¢IÉ=I1çžÞÒœEü}Ô®*ziN"þ>ê?×½Þ=ü%°æ›<ðsö‡7´§u늇ރÚSˆ¿ºõÅCïA¼:{øFÚló÷Œd{áÏí)Ä_ÇÝGúâ¡÷ ö”â/ãî£ýqPûÐožþ°æº¾Ô¦%´æîr\§Ö)ÚnX«õj{ÕÁ]}k¨ó}0y¾¦J1MâCPiÒ ¦ZVåžeq„L­ tðB4=¥8‹øû¨ÿ\T>ôÒœEü}Ô®*z 1Ôâr÷ð¥±Ò­9ôJyÙ.04Åæ”P¥\òMxáÇÚ‡_xQŪ0$njŒ’UÌ™y— Æ2¢Æ{{áOÚSˆ¿ºõÅCïAí)Ä_ÇÝGúâ¡÷¡Œ}ËßÂŽÃN)»Ï<8½¥8‹øû¨ÿ\T>ôÒœEü}Ô®*z%¼:{øFÚnóÁÏ/iN"þ>ê?×½´§u늇ރxt÷ð‡4Ý烞^ÒœEü}Ô®*ziN"þ>ê?×½ðéïái»Ï<8½¥8‹øû¨ÿ\T>ôÒœEü}Ô®*z áÓßÂ6Ówž¶ÝãpÚ5Ÿ¡T.Óè-ÍÊ:„»-4‚(u¥‚‡‚Hy`ÇiN"þ>ê?×½´§u늇ބqàèYßÂ6Ó­ÚÞ›\ŠRëüå‘T_S5o1$I=I•yAHî=ÉEÙTY§ ¢j5¿:ÙÇ*'·ä]ëã|€ŒõÂÈïˆoûJqñ÷Qþ¸¨}è=¥8‹øû¨ÿ\T>ôGçˆàÞþØR•ÕaO£ªî;\$x”ܲªÀ÷á+$ü€&(rT;^씪T¯ |àc;²”Æ™SÈRJVÙQJ2RO1÷õ†Ç´§u늇ރÚSˆ¿ºõÅCïCùóÿ^þ°éNb饮VEB€ÔõNZY2É›p© B ’Êp ‚9RyЇOmÔ+ «Érzdº9[l”6=É@HùQö”â/ãî£ýqPûÐ{Jqñ÷Qþ¸¨}ècø÷ð‡4Ý烞^ÒœEü}Ô®*ziN"þ>ê?×½xt÷ð–ÚonwŒsËÚSˆ¿ºõÅCïAí)Ä_ÇÝGúâ¡÷ Þ=ü#aÍÿÙgnustep-base-1.29.0/Documentation/HtmlNav/index.html000066400000000000000000000151721435650067400223770ustar00rootroot00000000000000 GNUstep System Documentation
GNUstep.org

GNUstep System Documentation

This is the system documentation for GNUstep, including both user and developer documentation. GNUstep provides an object-oriented application framework and tool set for use on a wide variety of computer platforms. It is based on the original OpenStep specification created by NeXT, Inc. (now Apple). (Web site)

User Documentation

The links here provide some basic information on setting up and using a GNUstep system.

User FAQ (PDF)
Developer FAQ (PDF)
How-To (PDF)
Filesystem Layout (PDF)
The following links will work only if you have installed the GUI portion of GNUstep.

Developer Documentation

The links here describe the development facilities provided under GNUstep. The Base Programming Manual introduces GNUstep as a whole, Objective-C, its main language, and the Base library, its basic set of non-graphical utility classes. The Make Utility makes project building easy and is highly recommended. The "API" links go to Javadoc-like reference pages on the Base and other GNUstep libraries.

Base Programming Manual (PDF)
Make Utility  (Release notes) (PDF)
Command-line Tools
 
Base Library API  (Release notes)
Base Additions API
 
OpenStep and OS X Compliance
GNUstep Coding Standards (PDF)
Debugging Information
The following links will work only if you have installed the GUI portion of GNUstep.
GUI Programming Manual (PDF)
 
GUI Library API  (Release notes)
GUI Additions API
OpenStep and OS X Compliance

Development Tools

Project Center provides an integrated development environment (IDE) for GNUstep. Gorm is a graphical user interface construction tool. Using these, developers can quickly design and build cross-platform applications in Objective-C or Java.



gnustep-base-1.29.0/Documentation/HtmlNav/masthead-bg.jpg000066400000000000000000000007301435650067400232520ustar00rootroot00000000000000ÿØÿàJFIFddÿìDuckyPÿîAdobedÀÿÛ„      ÿÀJ2ÿÄY a™‘ÿÚ ?ó•uí+‚W@¨¥D+¥!](WEgU•*¡]WP+¥ ê…Pf×QJèÐ…@¨Ð+ Íª5  WT*P®]©Fmu* W@®]¥ è3ªÐ+ W@®P+¡ôÖUj @( M(”šQÃMEZh% Ð) vQÇÚ)ØØÞØ>°ú6ó˜èž˜˜˜˜˜˜?ÿÙgnustep-base-1.29.0/Documentation/HtmlNav/style.css000066400000000000000000000024271435650067400222530ustar00rootroot00000000000000*{padding:0;margin:0;border:0;} body { background: #fff; color: #282931; background: #fff; font-family: "Trebuchet MS", Trebuchet, Tahoma, sans-serif; font-size: 10pt; margin: 0px; padding: 0px; } a { color: #37425f; } a:link { color: #37425f; } a:visited { color: #37425f; } a:hover { color: black; } h1 { font-size: 20pt; font-weight: 900; } h2 { font-size: 16pt; font-weight: bold; } h3 { font-size: 16pt; font-weight: normal; } h4 { font-size: 12pt; font-weight: bold; } h1,h2,h3,h4 { margin-top: 0px; margin-bottom: 3pt; padding-top: 10pt; } .floatright { float: right; } .floatleft { float: left; } /* #424f6f; */ .header { background-image: url("masthead-bg.jpg"); background-repeat: repeat-x; height: 74px; margin: 0px 100px 0px 100px; background-color: #424f6f; /* width: 100%; height: 72px; background-color: #3f4c6c; margin: 0px 100px 0px 100px; */ } .header img { display: block; border: 0px; } .container { margin: 0px 100px 0px 100px; border-left: 1px dashed #282931; border-right: 1px dashed #282931; } .content { padding: 5pt 5pt; border-bottom: 1pt solid #e8e8e8; } .content * { line-height: 18pt; } ul,ol { margin-left: 14pt; } blockquote { margin: 6pt; padding: 0 6pt; border-left: 3px solid #ccc; } gnustep-base-1.29.0/Documentation/Makefile.postamble000066400000000000000000000075101435650067400224530ustar00rootroot00000000000000# # Makefile.postamble # # Copyright (C) 1997 Free Software Foundation, Inc. # # Author: Scott Christley # # This file is part of the GNUstep Base Library. # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public # License as published by the Free Software Foundation; either # version 3 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public # License along with this library; see the file COPYING.LIB. # If not, write to the Free Software Foundation, # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # Makefile.postamble # # Project specific makefile rules # # Uncomment the targets you want. # The double colons (::) are important, do not make them single colons # otherwise the normal makefile rules will not be performed. # # Things to do before compiling # before-all:: # After building local documentation, we need to run the special makefile # in the source directory to generate library reference documentation from # the source code. after-all:: ifeq ($(HAVE_LIBXML),1) $(MAKE) -C ../Source -f DocMakefile $(MAKE) -C ../Tools -f DocMakefile endif # Things to do before installing # before-install:: # Install the library reference documentation manually # after-install:: ifeq ($(HAVE_LIBXML),1) rm -rf $(REF_DOC_INSTALL_DIR)/Base/Reference rm -rf $(REF_DOC_INSTALL_DIR)/BaseAdditions/Reference rm -rf $(REF_DOC_INSTALL_DIR)/Tools/Reference $(MKDIRS) $(REF_DOC_INSTALL_DIR)/Base/Reference $(MKDIRS) $(REF_DOC_INSTALL_DIR)/BaseAdditions/Reference $(MKDIRS) $(REF_DOC_INSTALL_DIR)/Tools/Reference (cd Base; $(TAR) cf - .) | \ (cd $(REF_DOC_INSTALL_DIR)/Base/Reference; $(TAR) xf -) (cd BaseAdditions; $(TAR) cf - .) | \ (cd $(REF_DOC_INSTALL_DIR)/BaseAdditions/Reference; $(TAR) xf -) (cd BaseTools; $(TAR) cf - .) | \ (cd $(REF_DOC_INSTALL_DIR)/Tools/Reference; $(TAR) xf -) ifneq ($(CHOWN_TO),) $(CHOWN) -R $(CHOWN_TO) \ $(REF_DOC_INSTALL_DIR/Base) $(REF_DOC_INSTALL_DIR/BaseAdditions) $(REF_DOC_INSTALL_DIR/Tools) endif endif cp -f HtmlNav/index.html $(REF_DOC_INSTALL_DIR)/.. cp -f HtmlNav/style.css $(REF_DOC_INSTALL_DIR)/.. cp -f HtmlNav/gnustep-header14.jpg $(REF_DOC_INSTALL_DIR)/.. cp -f HtmlNav/masthead-bg.jpg $(REF_DOC_INSTALL_DIR)/.. # Things to do before uninstalling # before-uninstall:: # Things to do after uninstalling after-uninstall:: rm -rf $(REF_DOC_INSTALL_DIR)/Base/Reference rm -rf $(REF_DOC_INSTALL_DIR)/BaseAdditions/Reference rm -rf $(REF_DOC_INSTALL_DIR)/Tools/Reference -rmdir $(REF_DOC_INSTALL_DIR) # Things to do before cleaning # before-clean:: # Things to do after cleaning after-clean:: ifeq ($(HAVE_LIBXML),1) $(MAKE) -C ../Source -f DocMakefile clean $(MAKE) -C ../Tools -f DocMakefile clean endif rm -rf Base rm -rf BaseAdditions rm -rf BaseTools # Things to do before distcleaning # before-distclean:: # Things to do after distcleaning # after-distclean:: # Things to do before checking # before-check:: # Things to do after checking # after-check:: version.texi: ../Version rm -f version.texi echo '@set GNUSTEP-BASE-VERSION' $(GNUSTEP_BASE_VERSION) \ > version.texi echo '@set GCC-VERSION $(GCC_VERSION)' \ >> version.texi if [ $(GNUSTEP_BASE_FTP_MACHINE) ]; then \ echo '@set GNUSTEP-BASE-FTP-MACHINE $(GNUSTEP_BASE_FTP_MACHINE)' \ >> version.texi; fi if [ $(GNUSTEP_BASE_FTP_DIRECTORY) ]; then \ echo '@set GNUSTEP-BASE-FTP-DIRECTORY $(GNUSTEP_BASE_FTP_DIRECTORY)' \ >> version.texi; fi regenerate: $(DOCUMENT_TEXT_NAME) mv $(TOP_DOC_FILES) .. gnustep-base-1.29.0/Documentation/ReleaseNotes.gsdoc000066400000000000000000002003731435650067400224420ustar00rootroot00000000000000 GNUstep Base Release Notes $Revision$ $Date$ 2005-2022 Free Software Foundation, Inc. Base Release Notes

The release notes include descriptions of API changes, behaviour changes and other information that might help developers and users migrate to using a newer version of the library.

Version 1.29.0

Bugfix release to increment library version number to reflect ABI changes which should have been noticed before 1.28.1 release.

Version 1.28.1

Aside from an assortment of bugfixes, this release includes a lot of improvements for Windows support as well as security features.

Not every bugfix, improvement or a new feature will be listed here.

Configuration: Make config tests work with C99 compiler.
GSTLS: Use strict rfc4514 for distinguished names of issuer and owner of certificates. Add GSTLSIssuers and GSTLSOwners properties to reject remote certificates which do not match distinguishd names accepted. This allows encrypted DO to be configured to automatically reject connection attempts which do not have trusted certificates. Add -pending method allowing NSFileHandle and NSStream to detect when there is buffered data in the TLS layer that they could read. Honor the SSL_CERT_FILE environment variable for OpenSSL compatibility. GSXML.m: Remove usage of deprecated function when a newer version of libxml is used.
NSCalendar: New methods with testcases and documentation.
NSConnection: Add debug output reporting the details of any exception returned over a DO connection from the remote process or thread.
NSFileHandle: On ms-windows support overlapped I/O on standard streams.
NSFileManager: Fix bug creating NSDirectoryEnumerator instances, and ensure we eeally skip hidden files in enumerations if requested by the options.
NSIndexPath: New methods to support collection and table view.
NSLock: Use native APIs on ms-windows. NSOperation: Fix various bugs in operation finishing, completion block, and removal of dependency observers. Remove the maximum number of threads restriction and use the setting from -setMaxConcurrentOperationCount: instead.
NSPredicate: fix error parsing an array whose entry is an NSExpression object.
NSRegularExpression: Fix possible corruption when using ICU strings longer than 16 characters. NSSocketPort: APIs to permit Distributed Objects connections to be TLS encrypted for secure inter-process communications. NSString: Use ICU on ms-windows. Fix various obscure bugs. NSTask: Use .exe extension implicitly if needed on ms-windows. NSThread: Use native APIs on ms-windows. NSTimeZone: Rewrite to support the latest (v2+) timezone file format and transition data held as 64bit values rather than the 32bit values needed so far. ms-windows compatibility fixes. NSURL: Improve handling of clients (including making client lookup thread-safe). When making a request to retrieve an http/https URL, improve debug output, mask sensitive authentication header detials, and provide delegate metods/api to permite callers to filter the debug log to remove any other sensitive information.
NSURLHandle: Use the https_proxy and http_proxy environment variables if no proxying is specified. Also support those keys as properties in the request (overriding the environment variables) and support the URL protection space if set. Improve handling of the remote end dropping the connection (reconnect if the request has not been sent).
NSXMLParser: do not process end tag if parsing was aborted while processing start tag.
Testcases: Changes to work with a C99 compiler. Fixes for NSTask tests to work on ms-windows. Exclude NSBundle framework tests on ms-windows. Skip tilde abbreviation tests on ms-windows. Skip GSInetServerStream based testcases on win32
Version 1.27.0

Aside from an assortment of bugfixes, this release includes a lot of improvements for Android support as well as numerous new classes and methods.

Expose GNU TLS wrappers and add methods to get certificate expiry.
Improve thread safety when using zombies, particularly on statup/shutdown.
Improvements for Ukrainian localization.
Decreased ICU requirements to 49 to support Windows 2000.
Simplifications and fixes in GSPrivateSymbolPath().
GSMime improvements (word encoding specifier, utf-8 improvements encoding quoted words with multibyte characters)
NSJSONSerialization fixes for codepoints over 0x7f.
NSCharacterSet support for URL*AllowedCharacterSet and declarations for new character sets.
NSString implementations for new methods stringByRemovingPercentEncoding/ stringByAddingPercentEncodingWithAllowedCharacterSet:.
Fixed a crash in gdomap when an invalid hostname is given for the -M option.
In NSString.m, removed functions urldecode() and ishex() which were mistakenly neither namespaced nor declared static and thus could have conflicted with non-library code.
Fixed libdispatch configuration switch so --enable-libdispatch works correctly; correctly checking for HAVE_LIBDISPATCH_RUNLOOP.
Updated libdispatch runloop integration so it is compatible with Swift's corelibs libdispatch release (from github.com/apple/swift-corelibs-libdispatch). The libdispatch must be compiled with INSTALL_PRIVATE_HEADERS=YES.
In NSThread, spinlocks implemented using builtins to be able to target platforms without pthread_spin_lock(), such as Android targeting API level < 24.
In NSLog on Android, send logs to syslog.
Implementation of NSOrderedSet.
When ./configuring, link against libandroid on Android.
In NSBundle, allow integrating with Android asset manager using +[NSBundle setJavaAssetManager:withJNIEnv:], enabling use of mainBundle's pathForResource:ofType:, -URLForResource:ofType: and similar; referencing Info.plist if it exists in Android assets; use of NSFileManager's fileExistsAtPath: et al and isReadableFileAtPath:; reading files using NSFileHandle APIs; use of NSDirectoryEnumerator to enumerate Android assets from the main bundle.
In NSBundle, localization support on Android.
In NSProcessInfo, automatic initialization on Android using a fake executable path (/data/data/<app identifier>/Resources).
In NSData, improvements in reading Android assets.
Various improvements in the mechanism to report memory usage of individual objects.
Skeletal implementation of NSUbiquitousKeyValueStore.
Implementation of NSByteCountFormatter.
Fixes to writing large HTTPS requests (GSSocketStream, NSURLProtocol).
In gdomap.c, fix detection of local networks.
In NSArray's -removeObjectsInArray:, prevent some crashes.
In GSTLS, avoid setting session priority twice.
In NSFileHandle, fix so that setting certificate information does not discard any other options already set.
In GSXML's -fatalErrorFunction, use the correct function to get the line number.
In NSOperation's _execute, ensure lock gets released on an error by surrounding with NS_DURING.
Generics support in NSHashTable.
Implementation of NSProgress.
Skeleton implementation of NSURLComponents.
In NSSortDescriptor, added -sortDescriptorWithKey:ascending:descending:.
In NSOperationQueue, added -addOperationWithBlock.
In NSFileManager, added -URLForDirectory:inDomain:appropriateForURL:create:error: and -enumeratorAtURL:includingPropertiesForKeys:options:errorHandler:. Also added NSItemReplacementDirectory constant, and updated stub implementation for -URLForDirectory:shouldCreate:error:. Added -initWithDirectoryPath:... with additional parameters skipHidden and errorHandler.
In NSDictionary, fixed keysSortedByValueUsingComparator:.
Moved NSFileWrapper from -gui to -base.
Added NSFilePresenter, NSFileVersion and NSFileCoordinator.
Added NSPersonComponents and NSPersonNameComponentsFormatter.
Added units of measurement classes such as NSUnit, NSMeasurement, NSMeasurementFormatter, NSEnergyFormatter, NSLengthFormatter, NSMassFormatter.
In NSUnit, support for NSUnitArea, NSUnitConcentrationMass, NSUnitDispersion, NSUnitElectricCharge, NSUnitIlluminance, NSUnitElectricCurrent, NSUnitElectricPotentionDifference, NSElectricResistance, NSUnitMass, NSUnitEnergy, NSUnitFrequency, NSUnitPower, NSUnitSpeed, NSUnitFuelEfficiency, NSUnitPressure, NSUnitVolume, NSUnitLength.
Support for data directory on Android introduces GSInitializeProcessAndroid and makes use of the path returned by Context.getFilesDir() as the basis for storing data (e.g. NSUserDefaults) and when querying for directory paths (NSLibraryDirectory, NSApplicationSupportDirectory, etc.).
Placeholder NSScript* classes. Added NSUserActivity, NSObjectScripting, NSHFSFileTypes, NSAppleEventManager and NSAppleEventDescriptor.
Added NSDateInterval intersectionWithDateInterval:.
Added NSBackgroundActivityScheduler.
Added NSISO8601DateFormatter and NSMetadataAttributes.
Added NSOrtogrpahy and NSLinguisticTagger.
Added NSExtensionItem, NSExtensionContext, NSExtensionRequestHandling, and NSItemProvider and NSItemProviderReadingWriting.
Updated timezone info for NSTimeZones.
On Android, support for NSTemporaryDirectory to use Context.getCacheDir(), and cleaning it up in GSInitializeProcessAndroid() given there is no support for temp directory before Android API 26. Also used with NSCachesDirectory + NSUserDomainMask.
NSXPCConnection fixes.
NSException symbolication support using libunwind (used when backtrace() is unavailable).
Travis build improvements to use new runloop integration and gnustep-2.0 runtime.
In NSKeyValueObserving, implement two missing methods for NSArray: -addObserver:options:context: and -removeObserver:fromObjectsAtIndexes:forKeyPath:.
Updated NSUUID to use instancetype.
Added support for NSDate constants in NSPredicate.
Fixed a NSTimer bug with blocks.
In GSTLS, do not put password in the hash key of the credentials, and to avoid logging it when debugging is on.
Improvements in NSConcreteHashTable and NSConcreteMapTable.
In various places, switch away from deprecated CREATE_AUTORELEASE_POOL() to use the ARC-compatible ENTER_POOL and LEAVE_POOL macros.
When building the list of hosts to be probed to see if they have gdomap servers, fix code to include those explicitly defined in the config file. Add -S option to list the addresses of the known gdomap servers.
Backward compatibility fix for ICU 65.
Update GSPrivateSymbolPath() so that, on the path where LINKER_GETSYMBOL is not available, we attempt to lookup classes using the prefix ._OBJC_CLASS_ for the 2.0 ABI (earlier ABIs use a prefix of __objc_class_name_ for the class definition.
Fix parsing of NSURLResponse content type header.
Fix for class lookup when using the 2.0 ABI.
Fixed NSURLComponents setURL: throwing exceptions when URL didn't have all expected parts caused by rangeOfString: throwing for nil values.
Added NSURLQueryItem implementation.

Version 1.26.0

A new stable release.
Improve utf8 validity checks.
Make point and size subclasses for NSValue interchangable.
Add support for TLS SNI. Always request certificate from client and update certificates after 5 minutes.
Don't write deprecated fields to desktop link file.
Use NSLock instead of GSLazyLock and other improvements for multithreaded processes.
Clean up of NSString cluster.
Update NSAssert() and NSCAssert() to handle variable arguments (as OSX has done) and mark the numbered macros as obsolete.
Various improvements in tests.
Require ICU >= 50.
ICU is now detected using pkg-config.
Improve XML parsing.
Make NSXMLNode ivar a union representing different types, instead of assuming it will contain different underlying class types in different contexts. This is important for the new libobjc2 ABI.
OSX compatibility changes to NSURL.
NSFileManager call error handle on missing file.
Dummy spinlock implementation for platforms that don't support it.
Internationalization improvements: Japanese translation, Turkish translation, Polish translation.
Various improvements for new libobjc2 "v2 ABI", including things like a new NSConstantString implementation, making GS_REPLACE_CONSTANT_STRING a noop with the new ABI, etc.
Improvements for stack traces, exception handling and dead lock detection.
Other more minor bugfixes and cleanups. Many found by Coverity scan results.
As usual, this release also contains an update to include the most recent international timezone data.

Version 1.25.1

A new stable release.
Unicode fixes for characters outside the base plane
Stubs for some new OSX methods
Various new OSX compatibility macro and type definitions
NSFileManager fixes and tweaks to match OSX implementation
NSDistributedLock bugfix for pre-existing lock directories
Alternative sort algorithms selectable at runtime
Compatibility-related changes for environments not supporting weak symbols
Other more minor bugfixes and cleanups.
As usual, this release also contains an update to include the most recent international timezone data.

Version 1.25.0

A new stable release.
Removes garbage collection support (though for now the NSGarbageCollector class remains as a stub).
Changes multi-architecture support to match the scheme used by Debian.
OpenSSL bundle removed since it didn't match GNUTLS support.
Improved support for 64bit little-endian systems.
Ported to Debian/Hurd.
ICU string (regexp in particular) fixes.
OSX compatibity changes in NSRunLoop behavior and NSTask.
Alternative sort algorithms selectable at runtime.
Many bugfixes and cleanups.
As usual, this release also contains an update to include the most recent international timezone data.

Version 1.24.9

A new stable (bugfix) release.
Niels added support for generics.
Support for 'ng' runtime library (latest language features enabled)
Performance optimisations and improved diagnostic messages.
Garbage Collection deprecated (support to be removed).
As usual, this release also contains an update to include the most recent international timezone data.

Version 1.24.8

A new stable (bugfix) release.
The release contains a variety of bugfixes as well as some performance optimisations (particularly in the use of tiny string objects by the new objc runtime on 64bit systems).
Thread naming and logging of threads by NSLog() has been made consistent with the latest OSX releases, making debugging of multithreaded code a little easier.
Sergei Golovin has added NSURLConnection regression tests (while fixing a few bugs there).
As usual, this release also contains an update to include the most recent international timezone data.

Version 1.24.7

A new stable (bugfix) release.
The release has various platform/portability tweaks, as well as a variety of bugfixes.
The default HTTPS connection configuration is modified to disable SSLv3.0 support (to prevent the 'POODLE' security attack).
This release also contains an update to include the most recent international timezone data.

Version 1.24.6

A new stable (bugfix) release.
This release contains a new class (NSUUID) and several new methods.
The OSX version compatibility macros have been updated to add the latest version of OSX.
The release has various platform/portability tweaks, as well as a variety of bugfixes.

Version 1.24.5

A new stable (bugfix) release.
The main reason for this version is to release a collection of minor bugfixes before making more extensive changes which will break ABI compatibility and appear in a 1.25 branch.
This release contains a new class (NSInvocationOperation) and a few new methods.
The OSX version compatibility macros have been updated to permit use of the same numeric values as on OSX.
The release has been through the clang static analyzer (with minor issues resolved) and has had clang's printf format checking used to correct issues (mostly with NSInteger/NSUInteger on 64bit systems) with printf formats in various debug/logging messages.
Timezone data was updated for this release.

Version 1.24.4

A new stable (bugfix) release.
The main reason for this version is the inclusion of the latest available time zone data (something accidentally omitted from the previous release).
Most of the other changes in this version are fairly minor portability and bugfixes (and the addition of a number of new testcases).
API changes are limited to the addition of a few OSX-10.7 methods for NSCalendar and a few new NSFileManager methods for working with URLs.
Finally, there is experimental code to change the hashing algorithm used in the library ... enabling it will cause slower hash generation but a better distribution of hash values ... which might improve the performance of large collections.

Version 1.24.3

A new stable release.
Many changes in this version are behavior updates/improvements but there are also new APIs, none of which should effect binary compatibility with earlier 1.24.x releases.
An important change at the configure stage is that configure policy now requires you to explicitly disable features in order to build if external packages that those features depend on are missing. This should ensure that builds of base contain consistent feature sets unless you really want to change that.

The main changes are:
Implementation of the NSXML DOM classes (previously stubs). This is by far the biggest chunk of new code in this release. The DOM support has a dependency on the libxml2 library.
Implementation of cookies in the NSURLConnection related classes.
Implementation of common HTTPS support in the NSURLConnection related classes and the older NSURLHandle. The HTTPS support has a dependency on the gnutls library.
Implementation of new sorting code for faster sorting and to allow sorting algorithms to be changed.
Many changes to add support for ObjectiveC-2.0 additions.
Implementation of Encoding/Decoding of NSAffineTransform.
Many, many minor bugfixes and tweaks.

Version 1.24.0

A new stable release.
Most changes in this version are behavior updates/improvements rather than new API, but you should be aware that there is a binary incompatibility on 64bit systems in that the value of the NSNotFound constant there is now 64bits rather than 32bits.

With this release the official supported compiler for GNUstep is gcc-4.0 and later, and the base library has been tested using recent gcc development snapshots.

The main changes are:
Support for the GNU LANGUAGES environment variable and other locale improvements.
Caching of file and directory path information within bundles.
IPV6 support for NSHost and networking operations.
Support for UTF-8 string literals in source (compiler permitting).
Improved support for building standalone application bundles.
And of course, lots of bugfixes and OSX compatibility tweaks.

One this that didn't make it into this release was functioning NSXML DOM classes. For DOM style work you still need to use the GSXML classes, however there is active work on implementing NSXMLNode and friends as wrappers round the corresponding libxml2 classes, and we hope/expect these to be ready soon.

Version 1.23.0

A new stable release with many minor bugfixes and tweaks.
The main changes however are David Chisnall's work adding support of the clang compiler and Objective-C 2.0 language/runtime (the compiler/runtime combination now provides full support for the Objective-C 2.0 language).
Garbage collection using clang and libobjc2 is now available in addition to the existing gcc runtime garbage collection support.
Going beyond that, for people who don't like garbage collection, there is now support for automated reference counting, where the clang compiler adds reference count calls to manage object lifetimes, relieving the application developer from the need to manage reference counts.

An important point to note is that this is the last release to support the gcc-2.9.5 compiler. In future, while releases may work with older systems, the formal requirement will be a gcc-4.x series compiler or later and base may also depend on support for the C99 standard being available.
This change is being made in order avoid developers needing to spend a great deal of time keeping code working for obsolete systems which are no longer used in practice.

Version 1.22.0

A new stable release with many updates and changes. In addition to many new classes and methods, there is now a regression test framework included in the base release.

In addition, base now supports and uses the Objective-C 2.0 runtime API from Apple and we encourage anyone programming with GNUstep to move to using this new runtime and the new functionality it supports. Note however, there is currently no compiler/runtime combination that completely supports the Objective-C 2.0 specification, but we would recommend the following:

gcc (pre 4.6) and GNUstep libobjc is the preferred compiler/runtime for stability (best tested) gcc 4.6 and GNU libobjc for experimental ObjC2 with garbage collection but without blocks clang and GNUstep libobjc2 for experimental ObjC2 without garbage collection but with blocks. New Test Framework Please look at the README file in the TestFramework directory of the make package for more information on how to use and write test cases. NSTimeZones Updated with the latest zone info. NSNumberFormatter and NSDateFormatter Implemented a number of methods. NSLocale and NSCalendar Initial implementation of these classes. The libicu 4.0 library is now required for full operation of these classes. NSNumber Fix the +numberWith... methods to work for subclasses of NSNumber rather than creating instances of the default class. NSFileManager Implemented a few new methods NSSet Add block enumeration NSOperation Implement support for concurrent operations NSRegularExpression Also requires libicu for full functionality. NSTimeZone Implement some more methods NSNetServices Implement avahi-based services
Version 1.21.1

This is an unstable snapshot release but is functionally identical to the 1.20-1 stable bugfix release, made to ensure that the latest available snapshot version of the unstable branch is at least as up to date as the latest stable release.
The changes in this release are a timezone handling update to the latest zone information, various minor bug fixes and portability updates, some small cleanups and optimizations, a few tweaks to help packagers, and finally an alteration to the additions library on OSX to add a category to re-enable serialization of property lists in the more readable and compact OpenStep format (something the most recent versions of OSX lost).

NSAttributedString Fixes for keyed archiving/unarchiving. NSData Improve reading of non-standard files (eg /proc filesystem). NSHashTable Fix minor buffer overrun. NSInvocation Fix for problem with FFI when caching the method implementation of a proxy. NSNumber Fix the +numberWith... methods to work for subclasses of NSNumber rather than creating instances of the default class. NSKeyValueCoding Fix -isKey for KVC compliance. NSPropertyList Fix whitespace handling in XML property lists.
Allow OpenStep style property lists to be written on OSX.
NSTimeZone Update to latest zone information.
Update list of timezone abbreviations.
Improve diagnostics when no timezone is set.
GSObjCMethodNames Fix broken implementation. ObjectiveC2 compatibility Bugfix for selector lookup issue.
Working implementation of checks for conformance to protocols.
Installation of gdomap The installation process used to install gdomap setuid to root by default (for developers/hackers) and packagers were supposed to change that to not be setid, and start gdomap as root at system boot time. But packagers weren't doing that. The installation is now changed to install non-setuid by default giving packagers more of an incentive to start gdomap properly. Update of fake-main mechanism The fake-main mechanism for obtaining program arguments and environment requires the library to link to the gnustep_user_main function in any program which uses it. This caused problems where a distribution packaging system refuses to allow unresolved link symbols in a library. The code was reworked to use a weak reference to a local function, avoiding this problem.
Version 1.21.0

This is an unstable release synchronized with the 1.20.0 stable release. There have been major changes and reorganizations to support, among other things, the new non-fragile ABI from clang. These changes, although they break binary compatibility with previous releases, should allow all future releases to maintain compatibility.

Objective-C 2 Add compatibility code for Objective-C 2.0 when it is not provided by the compiler or objc library. Some runtime wrappers for Objective-C have been deprecated in favour of new 2.0 API. Additions library Reorganized so all GNUstep extensions are in the Additions library files. Mac OS X Compatibility Various improvements for compatibility including use of NSInteger/NSUInteger/CGFloat non-fragile ABI Support added for this ABI from clang includes additions of an extra ivar for future expansion and hiding of ivars in some classes. NSOperation Complete NSOperation and NSOperationQueue (compatible with 10.6 apart from blocks). Fast Enumeration Support was added. NSLock Complete rewrite of NSLock so they are faster, more complete and OS X-compatible. NSLock now depends on POSIX threads.
Version 1.19.3

This is a new unstable snapshot release of the base library almost identical to 1.19.2 but containing a bugfix for the introduction of a change in the behavior of NSURL's -path method to match OSX. We add a new -fullPath method which returns the actual path of the URL the way the old -path implementation did. This is necessary because the OSX behavior is to strip any trailing '/' from a path so that it's no longer possible to reliably build a URL string from its component parts.

Version 1.19.2

This is a new unstable snapshot release of the base library. It may contain minor binary incompatibilities with the previous unstable release, but should generally work with software compiled for that release.

This is primarily intended as a bugfix release prior to major rewrite of NSLock code by David Chisnall. As such, most changes are bugfixes and performance tweaks. Some of the main ones are listed below.

NSCalendarDate Add OSX compatible field widths in date formats. NSCharacterSet Uses a much more compact internal representation to decrease the memory footprint of applications which make extensive use of character sets. NSFileHandle Fixes for socket connections on mswindows. NSRunLoop Adds OSX compatibility changes with timers acting like input sources for determining blocking. NSString Performance improvements converting between 8bit and 16bit character representations. NSURL Support file URLs on mswindows. Include 'Host' header in requests to conform to W3C standards. NSUserDefaults Fixes for improved thread safety. Now stores to file in XML format. Key Value Coding/Observing Various improvements for OSX compatibility.
Version 1.19.1

A great deal of improvements have occurred recently. This includes many improvements in garbage collection (first to get it working again). Also many Mac OS X 10.5 methods and classes have been added, as well as compatibility improvements.

Highlights: NSData Implemented new Mac OS X methods for writing data. NSFileManager Fix -fileOwnerAccountID and -fileGroupOwnerAccountID to return the correct type. NSHashTable, NSMapTable New Mac OS X 10.5 API classes. Garbage Collection Get GC working again. Fixes in various classes to work better with GC. Mac OS X 10.5 Return Types Methods have been converted to use return types and arguments of NSInteger, NSUInteger and CGFloat. For now, these types are equivalent to the old types. This can be changed in NSObjCRuntime.h so that integer types are the same size as a pointer, and the float type is actually a double on 64bit processors. NSArray New methods for inserting objects with NSIndexSet
Version 1.19.0

This is a new unstable release of the base library. Note that gnustep-core is now installed in the LOCAL domain by default instead of the SYSTEM domain. You may want to remove old installations in the SYSTEM domain to avoid any incompatibility problems. Or you can force installation in SYSTEM using make GNUSTEP_INSTALLATION_DOMAIN=SYSTEM install.

Highlights: NSBundle Improve lookup of versioned library resources and improve location of resources based on the location of the executable under ms-windows. NSConnection Adds a new keepalive mechanism to check connections at periodic intervals to see if the other end is still there. This is enabled for message ports on ms-windows, where the operating system does not inform us when the other end goes away, and is not needed on the socket based connections on Unix. NSException Implement full support for native objective-c exceptions, though this requires a fix for the objc runtime which is not yet available in gcc. The patch for the runtime can be found at http://gcc.gnu.org/bugzilla/show_bug.cgi?id=27466 NSTask Adds a new method in a category in the Additions library ... The +launchPathForTool: method will locate a named tool by looking in all the standard locations in the USER, LOCAL, NETWORK and SYSTEM domains, and also by looking in PATH. Portability and compatibility work There are various minor changes to improve portability (both improved configuration/detection of system software and runtime improvements) to different operating systems such as 64bit ms-windows. There are also various improvements to MacOS-X compatibility. @synchronize Implementation of runtime support for @synchronize.
Version 1.15.4

This is an unstable release.

Highlights: NSArray New OSX method stubs. NSAutoreleasePool Dummy OSX method (-drain). NSBundle New OSX method stubs. NSCoder New OSX10.5 methods for NSInteger implemented. NSConnection New OSX10.5 methods for server connections implemented.
A keepalive facility so that daemons can tell (on mswindows) that all client processes have gone away, and shut themselves down.
NSData New OSX method stubs. NSException Implement stack address reporting. NSIndexSet Add OSX10.5 stub for countOfIndexesInRange NSKeyvalueObserving OSX10.5 additions implemented NSSet Implemented new OSX methods. NSStream Implemented basic SSL/TLS support using gnu-TLS. NSThread Implemented new OSX methods. NSLock, NSRecursiveLock, NSConditionLock Implemented names. GSXML, NSXMLParser Fully support namespace handling and fix bugs. NSKeyValueCoding, NSKeyValueObserving Made fully functional and MacOS-X compatible. Windows 64bit Changes so that the library can be built/used for 64bit windows. @synchronize Support for new ObjC language feature.

The current emphasis of the base library is MacOS-X compatibility, and the headers in this release mark many non-MacOS-X methods as being scheduled for removal by the next unstable release (from 1.17.0).
These methods will mostly be moved to the 'additions' library, (which can be built stand-alone in conjunction with the Cocoa Foundation framework as libgnustep-baseadd on OSX) and their declarations will be in the headers of that library (<GNUstepBase/...>) rather than in the Foundation directory.
NB. The markup in the headers and documentation should not be assumed to be exhaustive ... it is planned that the next stable release of the base library will enforce MacOS-X compatibility by default, and you will have to explicitly include headers from <GNUstepBase/...> in order to use GNUstep specific additions.
You should track the unstable branch of the base library (subversion trunk) to find out what changes your software actually needs to make.

The TODO list for MacOS-X 10.5 compatibility follows, this is all stuff which would ideally be done by the next stable release of this library.

Remove all non OSX10.5 declarations from standard headers Implement most new method stubs. Implement new OSX10.5 NSCalendar class. Implement new OSX10.5 NSLocale class. Implement new OSX10.5 NSOperation class. Implement new OSX10.5 XML classes. Implement NSInteger coding for NSCoder subclasses. Implement support for now enumerated values in NSComparisonPredicate. Implement new OSX10.5 features of NSDateFormatter. Implement new OSX10.5 features of NSExpression. Implement new OSX10.5 features of NSPredicate. Implement new OSX10.5 features of NSFileManager. Implement new OSX10.5 features of NSProcessInfo. Implement new OSX10.5 NSHashTable class. Implement new OSX10.5 NSMapTable class. Implement new OSX10.5 NSPointerArray class. Implement new OSX10.5 NSLocale additions. Implement new OSX10.5 features of NSNumberFormatter. Implement new OSX10.5 features of NSNumber/NSValue. Update NSDistributedNotificationCenter with new OSX methods.
Version 1.15.3

This is an unstable release.

Highlights: Configuration/NSUserDefaults Syntax within the configuration file extended so that a leading '../' in a path name denotes a relative path in a relocatable installation.
New 'GlobalDefaults.plist' file in the same directory as the main GNUstep config file allows packagers/sysadmins to set up global defaults easily.
NSStream Addition of TLS/SSL support using GNU TLS on both unix-like and mswindows systems. First draft.
Additions of SOCKS proxying support for socket streams. First draft.
NSURLConnection Added support for https using new stream code.
Added support for basic and digest authentication.
Version 1.15.2

This is an unstable release. Bug fixes include improved thread safety and Key-Value observing.

Highlights: NSException New MacOS X methods and improved stack trace. NSThread New methods from Mac OS 10.5 and new ivars NSDecimal and NSDecimalNumber Many improvements
Version 1.15.1

This is an unstable release. There have been many bug fixes, but also a few method additions and changes to some headers. Also the license for this release is now GPLv3 and LGPLv3.

Highlights: NSUserDefaults Stores YES or NO as a string for MacOS X compatibility. NSErrorRecoveryAttempting Added header (and some support in the GUI library). NSArray Added some new methods to handle multiple objects. Key-Value Coding More support for key-value coding. NSPredicate Much improved parsing. Ivars have changed in some of the predicate classes.
Version 1.15.0

This is an unstable release from 1.14.0. It is otherwise identical to the 1.14.0 release. Releases in the 1.15 series may not be forward compatible with previous 1.15 releases.

Version 1.14.0

This is a stable release ... all programs linked with earlier versions of the library and wishing to use this latest stable release need to be rebuilt from source.
This release should be used in conjunction with the latest stable release of the other gnustep core components.

This release continues the process of cleanup and restructuring to further improve MacOS-X compatibility, fix bugs, optimize performance, and improve portability between different hardware/operating system platforms.

Highlights: NSAffineTransform Imported from GUI library for MacOS-X compatibility. NSBundle Implemented library resource versioning. NSException Support provision of stack trace information in exceptions. NSObject Fixes for lock contention with retain/release, so the performance of massively multi-threaded applications is much better. NSNetServices New MacOS-X class implemented. NSPathUtilities Uses new gnustep-make features to provide native filesystem integration. NSPropertyList XML property list parsing supported even if libxml2 not available. NSSpellServer Imported from GUI library for MacOS-X compatibility. NSValueTransformer New MacOS-X class implemented.
Version 1.13.1

This is a bugfix release improving the stability and security of applications using the base library. Programs dynamically linked with the existing stable release will automatically benefit from these changes once this version is installed.

NSBundle Fix for crash when initializing the bundle system in an application linked with many frameworks. NSCalendarDate Fix for buffer overrun problem when initializing date from string. Also fixed to return nil when initializing from some illegal strings. NSConnection Some locking fixes to avoid rare deadlocks in heavily multi-threaded applications. NSDecimalNumber Fix to handle current locale properly when initializing. NSIndexSet Fix bug adding indexes in a range which lies within a range already in the set. NSPropertyList Fix problem writing negative numbers into old-style property list. NSString Fix for problem with keyed archiving of simple strings. NSURL Fix a potential repeated load of the same resource. Also fix to return nil when initialised with a string which does not contain a URL scheme. NSURLHandle Improve handling of persistent connections when the remote host drops the connection unexpectedly. GSXML Fix bug causing removal of newline characters from escaped strings. Fix error setting start end end element for SAX.
Version 1.13.0

Several sets of classes have been added for dealing with URLs and predicates. A few minor api changes have occurred as well.

Character sets Character sets were improved with regard to ranges (Chinese characters, etc). Keyed Archiving Better compatibility with MacOSX. In particular, some guesses are made as to how some objects should be encoded. GNUstep configuration file Extra keys are allowed in the configuration file with the definition of the GNUSTEP_EXTRA key. URL Loading Headers and a basic framework for Apple's new URL loading scheme were added, although this is not fully implemented yet. Objective-C++ Most of the code was updated to compile nicely with the new gcc objective-c++ compiler. NSString designated initialiser The GNUstep designated initialiser for the NSString class cluster has changed to -initWithBytesNoCopy:length:encoding:freeWhenDone: from -initWithCharactersNoCopy:length:freeWhenDone: and older code sub classing NSString will need to be updated. NSBundle bundleWithIndentifier: The NSBundle method +bundleWithIdentifier: was added. NSPredicate A basic implementation of the NSPredicate classes (NSPredicate, NSComparisonPredicate, NSCompoundPredicate, NSExpression) was added. Stack traces Support for getting stack traces via bfd was added experimentally. You have to define STACKTRACE when compiling base to get this. Languages Added new language files Esperanto, Korean, and Ukrainian. Run loops Removed the timeout facility for run loop watchers - you should use standard timers instead. The watcher interface is deprecated anyway.
Version 1.12.0

There have been a number of API changes and several methods have been depreciated in this release. Although current GNUstep programs that use these methods will still work in this version, there are enough changes that a new library version was considered useful.

NSCoder deprecated methods Several methods using the old libObjects style scheme withName: are now deprecated. You can use the new NSKeyedArchiver and NSKeyedUnarchiver functionality to perform the same function in a much more portable way. NSPortCoder, NSPortMessage private methods The private method _components was removed from the public interface. NSString -getCString:maxLength:encoding: The return type of this function was changed to BOOL. NSBundle deprecated and private methods Several deprecated and private methods were removed from the public interface including +gnustepBundle, and +pathForGNUstepResource:ofType:inDirectory:. NSNotificationCenter deprecated method The GNUstep method setLockingDisabled: method was deprecated. NSNotificationQueue private functions Private functions GSNotifyASAP, GSNotifyIdle, and GSNotifyMore were removed from public interface. NSRunLoop watcher API updates and other changes We are starting to integrate the Cocoa NSStream classes into GNUstep, which allow you to do much the same things as the GNUstep-specific run loop watcher API was intended. At some point the watcher API will be deprecated as it will be redundant with NSStream functionality. Also the deprecated win32 specific methods for NSRunLoop were removed. NSAttributedString deprecated method The non-standard attributedSubstringWithRange: method (just a synonym for the real method) was deprecated. NSConnection, NSDistantObject method removal Several legacy methods from the original GNU Connection class were removed or moved to the additions category of the library. NSAutoreleasePool private methods The private method _endThread: was removed from the public interface. NSPortNameServer private methods Several private methods were removed from the public interface. NSStream, NSIndexPath New classes added to the library. NSUserDefaults improvements User defaults were restructured to create the defaults lazily and can be set to not write to an external file at all, for developers who wish to use the library as a stand-alone library or in other situations where using external resources is not desired.
Version 1.11.2 GNUstep.conf and relocation Support for GNUstep.conf and relocation of the filesystem is much improved in this release. Windows platform The WM_QUIT message is now intercepted to allow an application to terminate cleanly. NSMessagePort - Windows platform NSMessagePort was implemented on Windows platforms. NSOpenStepRootDirectory This function has been un-deprecated, and the documentation clarified so it is easier to understand what it does and does not do. GNUsteprc Deprecated support for system-wide GNUsteprc files has been removed.
Version 1.11.1 NSSortDescriptor New class. NSStringFromPoint, NSStringFromRect, NSStringFromSize Functions now output strings that can be read by old OpenStep implementations (but can also still be read by GNUstep and MacOSX). Debugging support More support for debugging on mingw, including writing logs to debugger and event viewer.
Version 1.11.0

The interface version of the base library has changed in this release. Applications, libraries and tools that wish to use this new version must be recompiled (otherwise, they'll use the older version of the library).

Window's changes A lot of the behavior of path handling in the base library has changed with respect to Window's machines. Windows native paths are used throughout. The fileSystemRepresentation methods now use utf-16 as the external c-string representation on windows. The local to openstep and openstep to local methods are now deprecated and do nothing. Other changes to classes and class variables have also occurred (detailed below). Path/Startup configuration At the startup of any application or tool, GNUstep used to look at various environment variables in order to find the location of various data directories and other things. GNUstep still does this, but the environment variables are no longer required to find these files. In addition the configuration files used to override certain path behavior has been changed and expanded. See the base library documentation on GNUstep Configuration Files for more information. NSCharacterSets Character sets are included in the library itself instead of being loaded from a data file. Also, the NSBitmapCharSet API has been removed. NSPathUtilities Depreciated functions GSSystemRootDirectory and GSStandardPathPrefixes. In addition, beware of using the function NSOpenStepRoot, which may not necessarily return the information you need (see the documentation for this function for more info). Enumeration values for NSSearchPathDirectory have changed. NSRunLoop NSRunLoop and related classes now use native win32 event handling on Window's machines. See also GSFileHandle, NSSocketPort and NSMessagePort. GSFileHandle This GNUstep specific class has a new ivar on Windows. NSSocketPort, NSMessagePort This class has a new ivar on Windows. NSPortNameServer A one-time warning is printed concerning a future change in which nsconnections will only work between processes owned by the same account on the same machine, for MacOSX compatibility and security. If inter-host/user communication is desired, the developer will need to set this explicitly. Keyed Encoding Work was done in many classes to support keyed encoding. It may not be fully implemented in every class, however.
Version 1.10.3

This release includes a few minor bug fixes.

Version 1.10.2

This release is most likely the last release in this series, aside from possible bug fixes. It was was branched from CVS on Feb 22, 2005.

NSContainsRect behavior change The definition of NSContainsRect has changed to correspond with the current Mac OS X/Cocoa definition. The sides of the bRect can touch aRect. Unichar file paths Windows supports unichar file paths, but there isn't really an API for handling this. GNUstep-specific methods for dealing with this have been added, NSFileManager's -localFromOpenStepPath and openStepPathFromLocal and equivalent methods for NSString. In most cases the Base library should handle this problem internally, but it's possible that there are cases where the developer wants to handle the file name explicitly with system-specific functions. NSDictionaryErnumerator Some ivars in NSDictionaryEnumerator have changed types, but the total storage space has not changed. This may cause problems if you access ivars directly, perhaps through a subclass. NSNotification -setImmutablePost This GNUstep extension method was removed. NSPort extension methods Unimplemented GNUstep extension methods -close, -outPackedClass, and +outPackedClass were removed. NSTimeZone -abbreviationDictionary NSTimeZone's abbreviation dictionary is now a proper one-to-one dictionary.
Version 1.10.1

Runtime version discovery of library A developer can discover the version of the base library that is loaded using the NSBundle methods [[NSBundle bundleForLibrary: @"gnustep-base"] infoDictionary] and retrieving the GSBundleVersion key. NSXMLParser class added This is a Cocoa class that has been added for compatibility. The class is still alpha state. NSArray makeObjectsPerformSelector: The order of iteration through objects was changed to match Cocoa. Designated initializer changes The designated initializer for NSArray, NSDictionary, NSSet, and NSString for MacOS X compatibility. Like MacOS X, you can call [super init] to initialize the class from a subclass, although it is prefered that you use the designated initializer, with it's richer set of initializers.
Version 1.10.0

Interface version change The interface version of the base library has changed in this release, as it will in all future releases with a new minor number (that's the second number in the release number). Applications, libraries and tools that wish to use this new version must be recompiled (otherwise, they'll use the older version of the library). There is no single reason for this change. Arguably, it should have been done long ago. NSString clarification The NSString documentation contains some clarification on the lifetime of returned NSString objects. URL classes support persistent connections The NSURLHandle and other classes have support for persistent connections. NSMethodSignature clarification Recent compiler releases have exposed a flaw in the way GNUstep gathers signature information. The documentation explains how the information for offset and registers may not be reliable. Mac OS X compatibility There have been many fixes in various classes for Mac OS X compatibility, particularly relating to XML encoding.
Version 1.9.2

GSMime parsing ignores extraneous data When extraneous data is encountered in the input, it is ignored (and a warning logged) rather than adding it to the message body. Not sure this is right though, perhaps we should raise an exception or extend the api to return the extra data. Anyway, it's better than the previous behavior of adding the bad data to the parsed body. New log functions GSOnceFlag and GSOnceMLog Log messages the first time the code is executed. Typical usage is to log warnings about deprecated features. NSError New MacOSX compatibility class GSObjCRuntime Multiple new runtime functions that work with both GNU and Apple runtimes. These functions allow you to look at method lists, add and remove methods (for instance, if you want to make sure your method in a category overrides another method in a category). NSProtocolChecker rewritten Was previously almost non-functional. autogsdoc Support added for building frames structured documentation. Add the flag -MakeFrames YES to the autogsdoc command line. Binary incompatibilities NSUnarchiver, GSIMapTable have new ivars added to them. Tools and applications that use these classes may need to be recompiled after the new library is installed.
gnustep-base-1.29.0/Documentation/TypesAndConstants.gsdoc000066400000000000000000000016031435650067400234700ustar00rootroot00000000000000 Types and Constants 2005 Free Software Foundation, Inc. Type index Variable index Constant index gnustep-base-1.29.0/Documentation/announce.texi000066400000000000000000000037531435650067400215340ustar00rootroot00000000000000@c -*- texinfo -*- @chapter Announcement @c set the vars GNUSTEP-BASE-VERSION and GNUSTEP-BASE-GCC-VERSION @ifclear GSTEP-BASE-MAIN @include version.texi @end ifclear The GNUstep Base Library, version @value{GNUSTEP-BASE-VERSION}, is now available. @section What is the GNUstep Base Library? The GNUstep Base Library is a library of general-purpose, non-graphical Objective C objects. For example, it includes classes for strings, object collections, byte streams, typed coders, invocations, notifications, notification dispatchers, moments in time, network ports, remote object messaging support (distributed objects), and event loops. It provides functionality that aims to implement the non-graphical portion of the OpenStep standard (the Foundation library). There is more information available at the GNUstep homepage at @samp{http://www.gnustep.org}. @set ANNOUNCE-ONLY @include news.texi @clear ANNOUNCE-ONLY @section Where can you get it? How can you compile it? @ifset GNUSTEP-BASE-FTP-MACHINE The gnustep-base-@value{GNUSTEP-BASE-VERSION}.tar.gz distribution file has been placed at @url{ftp://@value{GNUSTEP-BASE-FTP-MACHINE}/@value{GNUSTEP-BASE-FTP-DIRECTORY}}. It is accompanied by gnustep-base-@value{GNUSTEP-BASE-VERSION}.tar.gz.sig, a PGP signature which you can validate by putting both files in the same directory and using: @example gpg --verify gnustep-base-@value{GNUSTEP-BASE-VERSION}.tar.gz.sig @end example Signature has been created using the key with the following fingerprint: @example 83AA E47C E829 A414 6EF8 3420 CA86 8D4C 9914 9679 @end example @end ifset Read the INSTALL file or the GNUstep-HOWTO for installation instructions. @section Where do I send bug reports? Please log bug reports on the GNUstep project page @url{http://savannah.gnu.org/bugs/?group=gnustep} or send bug reports to @email{bug-gnustep@@gnu.org}. @section Obtaining GNUstep Software Check out the GNUstep web site. (@url{http://www.gnustep.org/}) and the GNU web site. (@url{http://www.gnu.org/}) gnustep-base-1.29.0/Documentation/coding-standards.texi000066400000000000000000000476261435650067400231610ustar00rootroot00000000000000\input texinfo @c -*-texinfo-*- @setfilename gs-standards.info @set DATE 26 Jun 1996 @dircategory GNU organization @direntry * GNUstepStandards: (gs-standards). Coding Standards for GNUstep Libraries. @end direntry @ifinfo Copyright @copyright{} 1997-2005 Free Software Foundation Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided also that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions. @end ifinfo @setchapternewpage odd @settitle Coding Standards for GNUstep Libraries @titlepage @finalout @title Coding Standards for GNUstep Libraries @flushright @value{DATE} @end flushright @author Adam Fedor @page @vskip 0pt plus 1filll Copyright @copyright{} 1997-2005 Free Software Foundation Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided also that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions. @end titlepage @node Top @top Coding Standards @menu * Introduction:: * ChangeLog Entries:: * Coding Style:: * ObjectiveC:: * Memory Management:: * Error Handling:: * Variable Declaration:: * Naming Conventions:: * Object Persistence:: * Documentation:: * Before You Commit:: * Contributing:: @end menu @c ****************************************************************** @node Introduction, ChangeLog Entries, Top, Top @chapter Introduction This document explains the official coding standards which developers for GNUstep should follow. Note that these standards are in addition to GNU coding standards, not a replacement of them. To summarise, always add a ChangeLog message whenever your commit a change. Make sure your patch, if possible, improves the operation of the library, not just fixes things - i.e. there are many places where things are just hacked together from long ago and really aren't correct. It's better to rewrite the whole thing correctly, then just make some temporary fix. Some particular pieces of code which may seem odd or wrong may in fact be there for particular and obscure, but necessary reasons. If you have questions, ask on @email{bug-gnustep@@gnu.org} or @email{gnustep-dev@@gnu.org}. @c ****************************************************************** @node ChangeLog Entries, Coding Style, Introduction, Top @section ChangeLog Entries Always include a ChangeLog entry for work that you do. Look for the ChangeLog file in the current directory or look up to any number of parent directories. Typically there is one for each library. Emacs currently formats the header like this: @example 2000-03-11 Adam Fedor @end example and formats changes to functions/methods like this: @example * Source/NSSlider.m ([NSSlider -initWithFrame:]): @end example to which you add your own comments on the same line (with word wrapping). Although if you're making similar changes to multiple methods, it's ok to leave out the function/method name. Important: Changelog entries should state what was changed, not why it was changed. It's more appropriate to put that in the source code, where someone can find it, or in the documentation. @c ****************************************************************** @node Coding Style, ObjectiveC, ChangeLog Entries, Top @section Coding Style The point is not what style is 'better' in the abstract -- it's what style is standard and readily usable by all the people wanting to use/work on GNUstep. A reasonably good consistent style is better for collaborative work than a collection of styles irrespective of their individual merits. If you commit changes that don't conform to the project standards, that just means that someone else will have a tedious time making the necessary corrections (or removing your changes). The GNUstep coding standards are essentially the same as the GNU coding standards (@url{http://www.gnu.org/prep/standards_toc.html}), but here is a summary of the essentials. White space should be used for clarity throughout. In particular, variable declarations should be separated from code by a blank line and function/method implementations should be separated by a blank line. Tabs should not be used (use spaces instead). If you do use them (please don't) they really, really, must be for tab-stops at the standard intervals of 8 spaces. All binary operators should be surrounded by white space with the exception of the comma (only a trailing white space), and the @code{.} and @code{->} structure member references (no space). @example x = y + z; x += 2; x = ptr->field; x = record.member; x++, y++; @end example Brackets should have space only before the leading bracket and after the trailing bracket (as in this example), though there are odd occasions where those spaces might be omitted ((eg. when brackets are doubled)). This applies to square brackets too. Where round brackets are used to enclose function or macro paramters, there is no space between the function romacro name and the opening bracket, and where round brackets are used for type-casts or at the end of a statement, there is normally no space between the closing bracket and the following expression or semicolon- @example a = (int)b; - (void) methodWithArg1: (int)arg1 andArg2: (float)arg2; a = foo(ax, y, z); @end example The placement of curly brackets is part of the indentation rules. the correct GNU style is to indent by two spaces @example if (...) @{ ... @} @end example For function implementations, the function names must begin on column zero (types on the preceding line). For function predeclaration, the types and the name should appear on the same line if possible. @example static int myFunction(int a, int b); static int myFunction(int a, int b) @{ return a + b; @} @end example The curly brackets enclosing function and method implementations should be based in column 0. Indentation is in steps of two spaces. @example int myMax(int a, int b) @{ if (a < b) @{ return b; @} return a; @} @end example Lines longer than 80 columns must be split up, if possible with the line wrap occurring immediately before an operator. The wrapped lines are indented by two spaces form the original. @example if ((conditionalTestVariable1 > conditionaltestVariable2) && (conditionalTestvariable3 > conditionalTestvariable4)) @{ // Do something here. @} @end example Some things the standards seem to think are 'should' rather than 'must': Multiline comments should use @code{/* ... */} while single line comments may use @code{//}. In a C/ObjC variable declaration, the @samp{*} refers to the variable, not to the type, so you write @example char *foo; @end example not @example char* foo; @end example Using the latter approach encourages newbie programmers to thing they can declare two pointer variables by writing @example char* foo,bar; @end example when of course they need @example char *foo, *bar; @end example or (in my opinion better) @example char *foo; char *bar; @end example An exception to the indentation rules for Objective-C: We normally don't break long methods by indenting subsequent lines by two spaces, but make the parts of the method line up instead. The way to do this is indent so the colons line up. @example [receiver doSomethingWith: firstArg and: secondArg also: thirdArg]; @end example That's the style used mostly in the GNUstep code - and therefore the one I try to keep to, however, the standard two space indentation is also acceptable (and sometimes necessary to prevent the text exceeding the 80 character line length limit). @example [receiver doSomethingWith: firstArg and: secondArg also: thirdArg]; @end example My own preference (not part of the standard in any way) is to generally use curly brackets for control constructs, even where only one line of code is involved @example if (a) @{ x = y; @} @end example Where using conditional compilation you should comment the #else and #endif with the condition expression used in the #if line, to make it easy to find the matching lines. @example #if condition // some code here #else /* not condition */ #endif /* condition */ @end example @c ****************************************************************** @node ObjectiveC, Memory Management, Coding Style, Top @section ObjectiveC Since GNUstep is primarily written in ObjectiveC the C language coding standards largely apply with modifications as specified in the previous section. Most code is expect to be written in traditional ObjectiveC, but classes implementing newer APIs designed by Apple will sometimes need to be written using ObjectiveC-2.0, though compatibility with old compilers should be maintained wherever possible, and preprocessor macros must be used to at least conditionally build new code without breaking old code. One ObjectiveC-2.0 feature (the dot ('.') operator) is forbidden though. One problem is that, while apparently simple, the actual operation of this feature in unusual cases is actually undefined and varies between compiler versions. The more serious problem is that the feature is simply very bad style because it looks like a simple structure field access and yet the code is really doing something very different and much more expensive, so use of the feature tends to lead to performance problems, bugs, and less explicit/readable code. @c ****************************************************************** @node Memory Management, Error Handling, ObjectiveC, Top @section Memory Management We encourage the use of the following macros to ease retain and release and as a convenience for managing code which should work in both a conventional retain counting environment and one with automatic reference counting (ARC) @itemize @bullet @item ASSIGN(object,value) to assign an object variable, performing the appropriate retain/release as necessary. @item ASSIGNCOPY(object,value) to copy the value and assign it to the object. @item DESTROY(object) to release an object variable and set it to nil. @item ENTER_POOL and LEAVE_POOL to bracket statements which should be performed inside their own auutorlease context. @end itemize @c ****************************************************************** @node Error Handling, Variable Declaration, Memory Management, Top @section Error Handling Initialisation methods (e.g. -init) should, upon failure to initialise the class, release itself and return nil. This may mean in certain cases, that it should catch exceptions, since the calling method will be expecting a nil object rather than an exception on failure. However, init methods should endeavour to provide some information, via NSLog, on the failure. All other methods should cause an exception on failure*, unless returning nil is a valid response (e.g. [dictionary objectForKey: nil]) or if documented otherwise. Failure here is a relative term. I'd interpret failure to occur when either system resources have been exceeded, an operation was performed on invalid data, or a required precondition was not met. On the other hand, passing a nil object as a parameter (as in [(NSMutableData *)data appendData: nil]), or other "unusual" requests should succeed in a reasonable manner (or return nil, if appropriate) and/or reasonable default values could be used. If an error is recoverable or it does not damage the internal state of an object, it's ok not to raise an error. At the very least, though, a message should be printed through NSLog. Special care should be taken in methods that create resources like allocate memory or open files or obtain general system resources (locks, shared memory etc.) from the kernel. If an exception is generated between the allocation of the resource and its disposal, the resource will be simply lost without any possibility to release. The code should check for exceptions and if something bad occurs it should release all the allocated resources and re-raise the exception. Unfortunately there is no nice way to do this automatically in OpenStep. Java has the "finally" block which is specifically designed for this task. A similar mechanism exists in libFoundation with the CLEANUP and FINALLY blocks. @c ****************************************************************** @node Variable Declaration, Naming Conventions, Error Handling, Top @section Variable Declaration All variables should be declared at the beginning of a block. The new C99 standard (and gcc 3.X) allow variables to be declared anywhere in a block, including after executable code. However, in order to be compatible with older compilers, all GNUstep programs should keep the old behaviour. Certainly we would consider it a bug to introduce code into the GNUstep libraries which stopped them compiling with one of the commonly used compilers. Instance variables in public APIs should generally be limited to those which are explicitly declared to be public and which will never change (we want to avoid breaking ABI between releases by changing instance variable layouts). Eventually compilers supporting a non-fragile ABI will be available and this will no longer be an issue, but until then we need to deal with the fragile API instance variable problem. The standard mechanism to support this is to provide a single private pointer variable (void *_internal;) which will be used to point to an area of memory containing the actual instance variables used internally. The internal implementation is then free to change without any change to the size of instances of the class. The GNUstep-base library has a standardised set of macros for writing code which deals with use of an _internal pointer to instance variables at the same time as allowing the instance variables to be used directly in the class if the code is built using the non-fragile ABI. @c ****************************************************************** @node Naming Conventions, Object Persistence, Variable Declaration, Top @section Naming Conventions The convention for naming items in GNUstep differs from the GNU standard as it needs to be compatible with OpenStep/MacOS-X. Public classes, variables, functions and constants begin with the NS prefix if they are part of the OpenStep or MacOS-X APIs, and begin with GS if they are GNUstep extensions. GNUstep extensions must not use the NS prefix. Class, public function, and global variable names have the first letter of each word in the name capitalised (underscores are not used). @example @@class NSRunLoop; GSSetUserName(); NSGenericException; @end example Method and instance variable names are similarly capitalised, except that the first letter of the first word is usually not capitalised (there are a few exceptions to this where the first word is an acronym and all the letters in it are capitals). Underscores are not used in these names except to indicate that the method/variable is private, in which case the name begins with an underscore. @example @{ int publicInstanceVariable; int _privateInstanceVariable; @} - (void) publicMethod; - (void) _privateMethod; @end example The names of accessor methods (methods used to set or get the value of an instance variable) must mirror the names of the instance variables. The name of a setter method is of the form 'setVar' where 'Var' is the instance variable name with any leading underscore removed and with the first letter converted to uppercase. The name of the getter method is the same as the instance variable name (with any leading underscore removed). @example @{ int _amplitude; int frequency; @} - (int) amplitude; - (int) frequency; - (void) setAmplitude: (int)anAmplitude; - (void) setFrequencey: (int)aFrequency; @end example @c ****************************************************************** @node Object Persistence, Documentation, Naming Conventions, Top @section Object Persistence The standard method of saving and restoring object information in GNUstep is through the use of the -encodeWithCoder: and -initWithCoder: methods. Any object which requires persistence implements these methods. They are used, for instance by Gorm, to save GUI interface elements. It is important that all changes to these methods be backward compatible with previously stored archives (for instance, those created by Gorm). The easiest way to do this is to use class version numbers to indicate which archive configuration should be read. Modern implementations are expected to suppoort keyed archiving and should use the same keys that are used in OSX. @c ****************************************************************** @node Documentation, Before You Commit, Object Persistence, Top @section Documentation Document every method you change or add! This makes it easier to fix our lack of documentation and keep up to date with changes. Make sure you do not copy either the OpenStep or Cocoa documentation. Some methods are so simple you might have to intentionally reword the documentation so it is different. Public documentation should be in the header files, formatted so that the autogsdoc tool can extract it. @c ****************************************************************** @node Before You Commit, Contributing, Documentation, Top @section Before You Commit @itemize @bullet @item Make sure you have a ChangeLog entry @item Make sure any new method/class is documented in the header file. or @file{Appkit/Appkit.h} if appropriate. @item If you have added a class, add the class to @file{Foundation/Foundation.h} @item If you have updated and configure checks, be sure to run both autoconf and autoheader. @item Make sure everything still compiles at least on the most common platform (ie Intel processor, GNU/Linux operating system, with the GCC compiler and ObjC runtime), and ideally on ms-windows too. @item Make sure you've tested the change and contributed testcase code to the testsuite. Run the testsuite on the systems where you compiled. @item Make sure that documentation generation still works by running 'make' in the Documentation directory. @end itemize @c ****************************************************************** @node Contributing, , Before You Commit, Top @section Contributing Contributing code is not difficult. Here are some general guidelines: @itemize @bullet @item We maintain the right to accept or reject potential contributions. Generally, the only reasons for rejecting contributions are cases where they duplicate existing or nearly-released code, contain unremovable specific machine dependencies, or are somehow incompatible with the rest of the library. @item Acceptance of contributions means that the code is accepted for adaptation into GNUstep. We reserve the right to make various editorial changes in code. Very often, this merely entails formatting, maintenance of various conventions, etc. Contributors are always given authorship credit and shown the final version for approval. @item Contributors must assign their copyright to FSF via a form sent out upon acceptance. Assigning copyright to FSF ensures that the code may be freely distributed. @item Assistance in providing documentation, test files, and debugging support is strongly encouraged. @end itemize Extensions, comments, and suggested modifications of existing GNUstep features are also very welcome. @bye gnustep-base-1.29.0/Documentation/gnustep-base.texi000066400000000000000000000177171435650067400223300ustar00rootroot00000000000000\input texinfo @c -*-texinfo-*- @c %**start of header @settitle User's Guide to the GNUstep Base Library @setfilename gstep-base.info @c %**end of header @defcodeindex cl @defcodeindex pr @ignore I'm using cindex for concepts, findex for methods, functions and macros, prindex for protocols, and clindex for classes. @end ignore @ifinfo @format * gstep-base:: The GNUstep Base Library @end format @end ifinfo @c set the vars GNUSTEP-BASE-VERSION and GCC-VERSION @include version.texi @ifinfo This file documents the features and implementation of The GNUstep Base Library. Copyright (C) 1999 Free Software Foundation, Inc. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided also that the section entitled ``GNU General Public License'' is included exactly as in the original, and provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that the section entitled ``GNU General Public License'' and this permission notice may be included in translations approved by the Free Software Foundation instead of in the original English. @end ifinfo @iftex @finalout @c @smallbook @c @cropmarks @end iftex @setchapternewpage odd @titlepage @title User's Guide to the @title GNUstep Base Library @sp 3 @subtitle Version @value{GNUSTEP-BASE-VERSION} @author Adam Fedor (fedor@@gnu.org) @page @vskip 0pt plus 1filll Copyright @copyright{} 1999 Free Software Foundation, Inc. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided also that the section entitled ``GNU Library General Public License'' is included exactly as in the original, and provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that the section entitled ``GNU Library General Public License'' may be included in a translation approved by the author instead of in the original English. @end titlepage @node Top, Overview, (dir), (dir) @top gstep-base This manual documents some configuration and installation issues with the GNUstep Base Library and also differences between the Base Library and libraries that implement the OpenStep Foundation specification and the MacOS-X Foundation implementation. @menu * Overview:: * Implementation:: @end menu @node Overview, Implementation, Top, Top @chapter Overview *The GNUstep Base Library (gstep-base) requires the GNUstep Makefile Package (gstep-make) to compile. A recent GCC compiler may also be needed as well as other libraries. You should consult the @file{GNUstep-HOWTO} document that comes with the GNUstep Core Libraries package (gstep-core) or information on supported machines on the web site @url{http://www.gnustep.org/information}. Documentation for individual classes is included in gsdoc (and html) format in the gsdoc directory. @node Implementation, , Overview, Top @chapter Implementation Details @menu * Memory Management:: * Memory Allocation:: * Reference Counting:: @end menu @node Memory Management, Memory Allocation, Implementation, Implementation @section Memory Management The OpenStep standard defines an reference-count based memory management scheme which the GNUstep libraries support. GNUstep also supports garbage collection using the Boehm conservative garbage collecting library, though this is currently (October 1999) in a pre-alpha state. @node Memory Allocation, Reference Counting, Memory Management, Implementation @section Memory Allocation Normally, memory is allocated in zones. Most memory is allocated from a default area (returned by the NSDefaultMallocZone()) function. In some cases where you want to ensure that a group of objects are all located in roughly the same area of memory (for performance reasons) you might create a special zone large enough to accomodate the objects you wish to create, and allocate the objects from that area. This will minimise the paging that your application needs to do in accessing those objects frequently. With the low price of RAM in modern systems, paging is likely to be much less of a problem nowadays, and the need for zoning memory is much lower than it used to be. At a low-level, memory allocation is performed by two functions - NSAllocateObject() and NSDeallocateObject(), but you need never normally deal with these functions - they are there for when you need an unusual degree of control or performance. These are the functions called by [NSObject +allocWithZone:] and [NSObject -dealloc]. If you call NSAllocateObject() directly to create an instance of a class, you may break some functionality of that class (such as caching of frequently used objects). Generally, objects are created using the methods +alloc, -copy, -mutableCopy and are destroyed using -dealloc. The allocation methods are covers for the more versatile +allocWithZone:, -copyWithZone: and -mutableCopyWithZone: methods (which specify the zone from which the memory is to be allocated, rather than forcing you to use the default zone). NSObject also provides +new, which is simply a cover for the combination of a +alloc and a -init. The -dealloc method returns the memory occupied by the object to the zone from which it was originally allocated, it can use the -zone method to determine which zone this is. Explicit memory allocation and deallocation is efficient - but when you pass objects around inside a program (and especially from/to libraries etc) it quickly becomes difficult and/or inefficient to keep track of who owns an object and should be responsible for calling it's deallocation method. To take this problem away, some mechanism is needed. The OpenStep specification provides a reference counting mechanism along with a set of conventions that make memory management easy. In addition to this, the GNU Objective-C compiler and the GNUstep system provide a memory sweeping garbage collection mechanism (using the Boehm conservative garbage collection library). @node Reference Counting, , Memory Allocation, Implementation @section Reference Counting The reference counting scheme for object allocation/deallocation is quite simple. Objects are normally created with a reference count of 1. An objects reference count may be increased by callsing -retain, and decreased by calling -release. If a -release would make the reference count become zero, the -dealloc method is automatically called to destroy the object - freeing its memory. This simple scheme then becomes more complicated with the addition of the -autorelease method. When -autorelease is called for an object, the object is added to the currently active autorelease pool. When the autorelease pool is later destroyed, every object in the pool will have a -release message sent to it for each time it was added to the pool. Thus, sending an -autorelease method to an object is equivalent to sending a -release at some future point. In general, when a method (other than the alloc..., copy..., mutableCopy... and new... methods) returns an object, that object will have been autoreleased, so you don't need to worry about releasing it yourself. However, if you wish to store the object for any length of time, you will need to send it a retain message, and then send it a release when you have finished with it. @bye gnustep-base-1.29.0/Documentation/gnustep-zones.texi000066400000000000000000000555541435650067400225550ustar00rootroot00000000000000\input texinfo @c -*- texinfo -*- @c %**start of header @setfilename gnustep-zones.info @settitle Memory Management in GNUstep @c %**end of header @ifinfo @format * GNUstep Zones: (gnustep-zones). Memory management in GNUstep. @end format @end ifinfo @ifinfo This explains how to use dynamic memory allocation with the GNUstep base library. Copyright (C) 1997 Yoo C. Chung and Free Software Foundation, Inc. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. @ignore Permission is granted to process this file through @TeX{} and print the results, provided the printed document carries copying permission notice identical to this one except for the removal of this paragraph (this paragraph not being relevant to the printed manual). @end ignore Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided also that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions. @end ifinfo @titlepage @title Memory Management in GNUstep @author Yoo C. Chung (wacko@@power1.snu.ac.kr) @page @vskip 0pt plus 1filll Copyright @copyright{} 1997 Yoo C. Chung and Free Software Foundation, Inc. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided also that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions. @end titlepage @c important TODO: Need examples! @ifinfo @node Top, Memory Management, (dir), (dir) @comment node-name, next, previous, up @top Memory Management in GNUstep This explains how to use dynamic memory allocation when using the GNUstep Base Library. @end ifinfo @menu * Memory Management:: Dynamically allocating memory. * Concept Index:: Index of concepts. * Function Index:: Index of functions. * Data Type Index:: Index of data types. @end menu @node Memory Management, Concept Index, Top, Top @comment node-name, next, previous, up @chapter Memory Management @cindex Memory management GNUstep uses zones for dynamic memory allocation. @menu * Memory Management Concepts:: An introduction to concepts and terminology. * Introduction to Zones:: What are zones? * Creating Zones:: How to create zones. * Allocating Memory:: How to get memory from zones. * Resizing Memory:: How to resize memory within zones. * Freeing Memory:: Save memory by freeing unused memory. * Finding Zones:: Finding the zone that contains a chunk. * Recycling Zones:: When you don't need a zone anymore. * Naming Zones:: Zones have names. * Zone Customization:: Custom zones are possible. * Zone Consistency Checking:: Checking for errors. * Zone Statistics:: Obtaining statistics about a zone. * Zone Function Summary:: Summary of zone functions and structures. @end menu @node Memory Management Concepts, Introduction to Zones, Memory Management, Memory Management @comment node-name, next, previous, up @section Memory Management Concepts @cindex Memory management concepts A program does not always know how much memory it needs for its data (in fact, this is the case in most programs). One might statically allocate (this means that the amount of memory is determined at compile time) memory with some large size, but this can be either a huge waste or memory might run out. So memory must be allocated at runtime in these cases. This is called @dfn{dynamic memory allocation}. Memory returned by a dynamic memory allocator is usually called a @dfn{memory block} or a @dfn{memory chunk}. Here we call them memory chunks. @ignore We might give a better introduction here. But be careful not to give a long and boring one. Keep it simple! We might also give references to books where one can learn more about memory management. @end ignore @node Introduction to Zones, Creating Zones, Memory Management Concepts, Memory Management @comment node-name, next, previous, up @section Introduction to Zones @cindex Zone introduction Any reasonably complete C library will contain the functions @code{malloc} and @code{free}. One uses these functions for dynamic memory allocation in many C programs. These functions usually use all of the memory for potential allocation. This could result in two memory chunks being allocated far from each other in the virtual memory space, which could lead to increased paging. Zones can be used to allocate many related memory chunks close to each other. A @dfn{zone} is an area (actually a set of areas) in memory where related chunks of memory can be allocated from. This might help in reducing paging on virtual memory systems. Each zone can have different behavior (@pxref{Zone Customization}). The GNUstep Base Library uses zones for dynamic memory allocation. The functions that are used to obtain memory chunks from zones are thread safe. @ignore Should give a more detailed and more understandable introduction. Might include a little history as well. @end ignore @node Creating Zones, Allocating Memory, Introduction to Zones, Memory Management @comment node-name, next, previous, up @section Creating Zones @cindex Creating zones @cindex Default zone In order to use a zone, it must first be created. You create zones with @code{NSCreateZone}, which is declared in @file{NSZone.h}. @deftypefun NSZone* NSCreateZone (size_t @var{start}, size_t @var{gran}, BOOL @var{canFree}) Creates a memory zone which starts with a size of at least @var{start} bytes and grows by at least @var{gran} bytes when needed. If @var{canFree} is @code{YES}, then memory chunks allocated in the zone can be freed. If @var{canFree} is @code{NO}, then memory chunks allocated in the zone cannot be freed unless the whole zone is recycled, nor can they be resized. A pointer pointing to the newly created zone is returned. If @var{start} is zero, the zone will start out with some default size. If @var{gran} is zero, the zone will grow by some default number of bytes when the zone needs more memory. If there isn't enough memory to create the zone, a @code{NSMallocException} is raised. @end deftypefun We might want to use a zone that cannot free memory chunks in a situation where we need to allocate many chunks of memory and free them all at once after using them by recycling the zone (@pxref{Recycling Zones}), since a zone that cannot free memory chunks allocates memory faster than one that is able to free memory chunks. This is because a zone that cannot free memory chunks has a lot less bookkeeping to worry about. You do not have to explicitly create a zone to dynamically allocate memory, since there already exists a default zone. A pointer to the default zone can be obtained with @code{NSDefaultMallocZone}, which is also declared in @file{NSZone.h}. @deftypefun NSZone* NSDefaultMallocZone (void) Returns the default memory allocation zone. The default default zone cannot be recycled. @end deftypefun @node Allocating Memory, Resizing Memory, Creating Zones, Memory Management @comment node-name, next, previous, up @section Allocating Memory Chunks @cindex Allocating memory chunks In order to allocate a memory chunk from a zone, we need to use @code{NSZoneMalloc}, which is declared in @file{NSZone.h}. @deftypefun {void*} NSZoneMalloc (NSZone *@var{zone}, size_t @var{size}) Allocate @var{size} bytes from the zone pointed to by @var{zone}. A pointer to the allocated memory chunk is returned. If @var{size} is zero @code{NULL} is returned. If there is not enough memory to allocate @var{size} bytes, a @code{NSMallocException} is raised. @end deftypefun The contents of the allocated memory are uninitialized and unpredictable. We can allocate memory filled with zeroes with @code{NSZoneCalloc}, which is also declared in @file{NSZone.h}. @deftypefun void* NSZoneCalloc (NSZone *@var{zone}, size_t @var{elems}, size_t @var{bytes}) Allocate memory for @var{elems} elements (each of which are @var{bytes} bytes) from the zone pointed to by @var{zone}. The memory chunk is initialized with zeroes. If either @var{elems} or @var{bytes} is zero, NULL is returned. If there is not enough memory for the request, a @code{NSMallocException} is raised. @end deftypefun One should not depend on @code{NSZoneMalloc} and @code{NSZoneCalloc} returning @code{NULL} when the request size is zero. It's bad style, not to mention that this might change in the future, or might behave differently on custom zones (@pxref{Zone Customization}). The zone containing a memory chunk allocated by @code{NSZoneMalloc} or @code{NSZoneCalloc} can be found with @code{NSZoneFromPointer} (@pxref{Finding Zones}). @node Resizing Memory, Freeing Memory, Allocating Memory, Memory Management @comment node-name, next, previous, up @section Resizing Memory Chunks @cindex Resizing memory chunks Sometimes one doesn't know how large a memory chunk one might need in advance. For example, if a memory chunk is a buffer for a line from a file, then no matter how large the buffer is, there might always be line that won't fit into the buffer. @c The above example was stolen from the libc manual. One can resize a memory chunk by using @code{NSZoneRealloc}, which is declared in @file{NSZone.h}. @deftypefun void* NSZoneRealloc (NSZone *@var{zone}, void *@var{ptr}, size_t @var{size}) Resizes the memory chunk pointed to by @var{ptr} to @var{size} bytes. If the memory chunk needs to be relocated, then the original contents will be copied to the new location. @var{ptr} may be @code{NULL}, in which case a new memory chunk will be allocated from the zone. The pointer to the resized memory chunk is returned. If @var{size} is zero, the memory chunk pointed to by @var{ptr} is freed. If there is not enough memory to resize the chunk, a @code{NSMallocException} is raised. @end deftypefun One shouldn't depend on @code{NSZoneRealloc} freeing the pointer with a size argument of zero or allocating a new chunk with a pointer argument of @code{NULL}, because it's bad style (in my humble opinion). @node Freeing Memory, Finding Zones, Resizing Memory, Memory Management @comment node-name, next, previous, up @section Freeing Memory Chunks @cindex Freeing memory chunks A memory chunk may no longer be needed after it is used. Then it would be better to free the memory chunk so it can be reused for other memory allocation requests. A memory chunk can be freed with @code{NSZoneFree}, which is declared in @file{NSZone.h}. @deftypefun void NSZoneFree (NSZone *@var{zone}, void *@var{ptr}) This frees the allocated memory chunk that @var{ptr} points at. The memory chunk must have been allocated from the zone pointed to by @var{zone}. @end deftypefun Note that unlike the C library function @code{free}, calling @code{NSZoneFree} with a pointer argument of @code{NULL} is an error. @node Finding Zones, Recycling Zones, Freeing Memory, Memory Management @comment node-name, next, previous, up @section Finding Zones Containing a Memory Chunk @cindex Finding zones Sometimes one might need to find out the zone that contains a memory chunk. For example, objects derived from @code{NSObject} usually need to find out the zone it resides in to deallocate itself. One can find the zone with @code{NSZoneFromPointer}, which is declared in @file{NSZone.h}. @deftypefun NSZone* NSZoneFromPointer (void *@var{ptr}) Finds the zone that contains the memory chunk pointed to by @var{ptr} and returns a pointer to it. @var{ptr} must be a pointer returned by @code{NSZoneMalloc} or @code{NSZoneRealloc}. @end deftypefun @code{NSZoneFromPointer} takes a constant amount of time regardless of how many zones or memory chunks there are, so it would save space to use @code{NSZoneFromPointer} instead of saving the zone separately. @node Recycling Zones, Naming Zones, Finding Zones, Memory Management @comment node-name, next, previous, up @section Recycling Zones @cindex Recycling zones A zone can become useless after a while. Then it would be better to recycle the zone to save memory. This can be done with @code{NSRecycleZone}, which is declared in @file{NSZone.h}. @deftypefun void NSRecycleZone (NSZone *@var{zone}) This function recycles the zone. All memory in the zone will be reclaimed. @end deftypefun Note that when a zone in GNUstep are recycled, all memory in the zone will be recycled, unlike zones in the Foundation Kit of OpenStep, where zones that can free memory return live objects to the default zone. @node Naming Zones, Zone Customization, Recycling Zones, Memory Management @comment node-name, next, previous, up @section Naming Zones @cindex Naming zones @cindex Zone names Memory allocation zones can be named. You might want to do this as a debugging aid. You can set the name of a zone with @code{NSSetZoneName} and obtain the name of a zone with @code{NSZoneName}, which are declared in @file{NSZone.h}. @deftypefun void NSSetZoneName (NSZone *@var{zone}, NSString *@var{name}) This sets a name for the zone pointed to by @var{zone}. If @var{name} is @code{nil}, the name of the zone will be unset if there was a name previously set. Otherwise a copy will be made of @var{name} in the default zone, and the name of the zone will be set to the copy. @end deftypefun @deftypefun NSString* NSZoneName (NSZone *@var{zone}) Returns the name for the zone pointed to by @var{zone}. Don't release it unless you have retained it. @end deftypefun @node Zone Customization, Zone Consistency Checking, Naming Zones, Memory Management @comment node-name, next, previous, up @section Customization @cindex Customizing zones The behavior of memory allocation zones can be customized in GNUstep, unlike zones with the Foundation Kit of OpenStep, which has a fixed default zone and only two kinds of zones possible. @menu * Setting Default Zone:: The default zone can be changed. * Creating Custom Zones:: Zones with customized behavior can be created. @end menu @node Setting Default Zone, Creating Custom Zones, Zone Customization, Zone Customization @comment node-name, next, previous, up @subsection Setting the Default Zone @cindex Setting default zone Initially there is a default default zone. But the performance of the default allocator might not be satisfactory for a program. In such cases, you may want to change the default zone to a zone that has more satisfactory performance. You can do this with @code{NSSetDefaultMallocZone}, which is declared in @file{NSZone.h}. @deftypefun void NSSetDefaultMallocZone (NSZone *@var{zone}) This sets the default memory allocation zone to the zone pointed to by @var{zone}. @end deftypefun You shouldn't change the default zone unless you know what you're doing. Note that @code{NSSetDefaultMallocZone} is not defined by OpenStep. @node Creating Custom Zones, , Setting Default Zone, Zone Customization @comment node-name, next, previous, up @subsection Creating Custom Zones @cindex Creating a custom zone @tindex struct _NSZone A zone with a custom behavior and implementation can be created. For example, all memory chunks allocated within a zone may have the same size, in which case a much more simpler allocator than the default one can be used. A custom zone can be created by appropriately setting the members of the structure @code{NSZone} (actually this is a typedef to @code{struct _NSZone}), which is declared in @file{NSZone.h}. @deftp {Data Type} NSZone This is actually a typedef to @code{struct _NSZone}. This structure contains the following members, all of which must be set to be properly used as a zone. @table @code @item void *(*malloc)(NSZone *@var{zone}, size_t @var{size}) This is a pointer to the function that allocates @var{size} bytes from the zone pointed to by @var{zone}. (@pxref{Allocating Memory}) @item void *(*realloc)(NSZone *@var{zone}, void *@var{ptr}, size_t @var{size}) This is a pointer to the function that resizes the memory chunk pointed to by @var{ptr}, which was allocated from the zone pointed to by @var{zone}, to @var{size} bytes. (@pxref{Resizing Memory}) @item void (*free)(NSZone *@var{zone}, void *@var{ptr}) This is a pointer to the function that returns the memory chunk pointed to be @var{ptr} to the zone pointed to by @var{zone}. (@pxref{Freeing Memory}) @item void (*recycle)(NSZone *@var{zone}) This is a pointer to the function that recycles the zone pointed to by @var{zone}. (@pxref{Recycling Zones}) @item BOOL (*check)(NSZone *@var{zone}) This is a pointer to the function that checks the integrity of the zone that is pointed to by @var{zone}. (@pxref{Zone Consistency Checking}) @item struct NSZoneStats (*stats)(NSZone *@var{zone}) This is a pointer to the function that returns statistics about the zone pointed to by @var{zone}. (@pxref{Zone Statistics}) @item size_t gran This holds the granularity of the zone. (@pxref{Creating Zones}) @item NSString *name This points to the name of the zone. (@pxref{Naming Zones}) @end table @end deftp To create the functions that a zone uses, you'll probably have to use @code{NSZoneRegisterChunk} and @code{NSZoneChunkOverhead}, which are also declared in @file{NSZone.h}. @deftypefun void* NSZoneRegisterChunk (NSZone *@var{zone}, void *@var{chunk}) This registers the memory chunk pointed to by @var{chunk} so that @code{NSZoneFromPointer} will work (@pxref{Finding Zones}). A pointer to the beginning of the memory that should actually be returned to the user is returned. @end deftypefun @deftypefun size_t NSZoneChunkOverhead (void) This returns the overhead that is needed for @code{NSZoneFromPointer} (@pxref{Finding Zones}) to work in bytes. @end deftypefun Creating a custom zone could be an error prone process, so don't use them unless you know what you're doing (and willing to go through a potentially long debugging process). Note that @code{NSZoneRegisterChunk} and @code{NSZoneChunkOverhead} are not defined in OpenStep. @node Zone Consistency Checking, Zone Statistics, Zone Customization, Memory Management @comment node-name, next, previous, up @section Zone Consistency Checking @cindex Checking consistency of a zone You can check the integrity of a zone by using @code{NSZoneCheck}, which is declared in @file{NSZone.h}. @deftypefun BOOL NSZoneCheck (NSZone *@var{zone}) Checks the integrity of the zone pointed to by @var{zone}. Returns @code{YES} if there are no errors, returns @code{NO} otherwise. @end deftypefun Note that @code{NSZoneCheck} is not defined in OpenStep. @node Zone Statistics, Zone Function Summary, Zone Consistency Checking, Memory Management @comment node-name, next, previous, up @section Zone Statistics @cindex Zone statistics You can obtain statistics about a zone with @code{NSZoneStats} which returns the statistics in a @code{struct NSZoneStats}. These are declared in @file{NSZone.h}. @deftp {Data Type} {struct NSZoneStats} This structure type is used to return statistics about a zone, and has the following members: @table @code @item size_t bytes_total This is the total size of memory managed by the zone, in bytes. @item size_t chunks_used This is the number of memory chunks in use in the zone. @item size_t bytes_used This is the number of bytes in use. @item size_t chunks_free This is the number of memory chunks that are not in use. @item size_t bytes_free This is the number of bytes managed by the zone that are not in use. @end table @end deftp @deftypefun {struct NSZoneStats} NSZoneStats (NSZone *@var{zone}) This returns statistics about the zone pointed to by @var{zone} in a structure of type @code{struct NSZoneStats}. @end deftypefun Note that @code{NSZoneStats} (and obviously @code{struct NSZoneStats}) is not defined in OpenStep. @node Zone Function Summary, , Zone Statistics, Memory Management @comment node-name, next, previous, up @section Summary Here is a summary of the functions and data types that work with memory allocation zones, which are all declared in @file{NSZone.h}: @table @code @item NSZone* NSCreateZone (size_t @var{start}, size_t @var{gran}, BOOL @var{canFree}) Creates a zone. (@pxref{Creating Zones}) @item NSZone* NSDefaultMallocZone (void) Returns the default zone. (@pxref{Creating Zones}) @item void* NSZoneMalloc (NSZone *@var{zone}, size_t @var{size}) Allocates memory from a zone. (@pxref{Allocating Memory}) @item void* NSZoneCalloc (NSZone *@var{zone}, size_t @var{elems}, size_t @var{bytes}) Allocates memory initialized with zeroes from a zone. (@pxref{Allocating Memory}) @item void* NSZoneRealloc (NSZone *@var{zone}, void *@var{ptr}, size_t @var{size}) Resizes a memory chunk that had been allocated from a zone. (@pxref{Resizing Memory}) @item void NSZoneFree (NSZone *@var{zone}, void *@var{ptr}) Returns a memory chunk to the zone. (@pxref{Freeing Memory}) @item NSZone* NSZoneFromPointer (void *@var{ptr}) Finds the zone that contains a memory chunk. (@pxref{Finding Zones}) @item void NSRecycleZone (NSZone *@var{zone}) Recycles a zone. (@pxref{Recycling Zones}) @item void NSSetZoneName (NSZone *@var{zone}, NSString *@var{name}) Sets a name for a zone. (@pxref{Naming Zones}) @item NSString* NSZoneName (NSZone *@var{zone}) Returns the name for a zone. (@pxref{Naming Zones}) @item void NSSetDefaultMallocZone (NSZone *@var{zone}) Set the default zone. (@pxref{Setting Default Zone}) @item void* NSZoneRegisterChunk (NSZone *@var{zone}, void *@var{chunk}) Function used in custom zones to register a memory chunk. (@pxref{Creating Custom Zones}) @item void* NSZoneChunkOverhead (void) Function used in custom zones to find overhead for each memory chunk. (@pxref{Creating Custom Zones}) @item BOOL NSZoneCheck (NSZone *@var{zone}) Checks the integrity of a zone. (@pxref{Zone Consistency Checking}) @item struct NSZoneStats NSZoneStats (NSZone *@var{zone}) Returns statistics about a zone. (@pxref{Zone Statistics}) @item NSZone Typedef to @code{struct _NSZone}, which is a structure type that actually holds the zone. (@pxref{Creating Custom Zones}) @item struct NSZoneStats Structure type used to return statistics about a zone. (@pxref{Zone Statistics}) @end table @node Concept Index, Function Index, Memory Management, Top @comment node-name, next, previous, up @unnumbered Concept Index @printindex cp @node Function Index, Data Type Index, Concept Index, Top @comment node-name, next, previous, up @unnumbered Function Index @printindex fn @node Data Type Index, , Function Index, Top @comment node-name, next, previous, up @unnumbered Data Type Index @printindex tp @bye gnustep-base-1.29.0/Documentation/install.texi000066400000000000000000000136671435650067400214010ustar00rootroot00000000000000@c This is a generic INSTALL file for utilities distributions. @c If this package does not come with, e.g., installable documentation or @c data files, please ignore the references to them below. @c set the vars GNUSTEP_BASE_VERSION and GNUSTEP_BASE_GCC_VERSION @include version.texi @node Top, Introduction, (dir), (dir) @menu * Introduction:: * Configuration:: * Compilation:: @end menu @node Introduction, Configuration, Top, Top @section Introduction If you are installing this package as part of the GNUstep core packages, read the file GNUstep-HOWTO for more complete instructions on how to install the entire GNUstep package (including this library). GNUstep-HOWTO is located in the gnustep-make package or at @url{http://www.gnustep.org} This version of gnustep-base requires gnustep-make version 2.0.0 or higher. Other external libraries that you may need to install include: @itemize @item ffi (HIGHLY RECOMMENDED) @item icu (HIGHLY RECOMMENDED) @item gnutls (HIGHLY RECOMMENDED) @item libxml2 (RECOMMENDED) @item libxslt (OPTIONAL) @item iconv (OPTIONAL, not needed if you have glibc) @item openssl (OPTIONAL, not needed if you have gnutls) @end itemize If you are installing the GNUstep libraries individually, make sure you have installed the GNUstep Makefile package (gnustep-make) already, and you have sourced the makefile script: @example . $GNUSTEP_SYSTEM_ROOT/Library/Makefiles/GNUstep.sh @end example See the GNUstep-HOWTO for more information. After installing this library you should install gnustep-gui if you are going to use graphical applications. When you configure this library, make sure you use the same configuration options as with gstep-make. Some additional options to configure are described below. Quick installation instructions: @example ./configure make make install @end example To make and install the documentation: @example cd Documentation make make install @end example @node Configuration, Compilation, Introduction, Top @section Configuration Configuration is performed by running the @file{configure} program at a shell prompt. You may want to use some of the optional arguments to the @file{configure} program. Type @code{configure --help} for a list of these. It is not likely that you will need to use the @code{--prefix} option, since gstep-base will automatically install in the directory specified by the @code{GNUSTEP_SYSTEM_ROOT} environment variable (specified when you installed gnustep-make). Some configuration options for the base library need to be specified when configuring the gnustep-make package. In most cases, it is a good idea to specify the same configuration options when configuring both packages, just to make sure. Also make sure you've read the machine-specific instructions for your particular operating system and CPU. These instructions come with the GNUstep-HOWTO and are also located at the GNUstep web site at @url{http://www.gnustep.org}. @menu * Reading Command-Line Arguments:: * FFI Library:: @end menu @node Reading Command-Line Arguments, FFI Library, Configuration, Configuration @subsection Reading Command-Line Arguments There are two features that change how GNUstep gets access to command-line arguments and environment variables (normally passed to the program in the @code{main()} function. These features are @code{--enable-pass-arguments} and the @code{--enable-fake-main} option(s). The fake-main option @emph{secretly} renames the @code{main()} function and substitutes it's own function which stores the command line arguments before calling the real main. The pass-arguments option absolves GNUstep of any effort to get the command-line arguments and instead forces the developer to insert the line @example [NSProcessInfo initializeWithArguments:argv count:argc environment:env]; @end example in the @code{main()} function of their program. Normally, the configure script will determine if a program can read process information directly from the system (for use by the class NSProcessInfo) and enable or disable the fake-main hack automatically, but if you find that configure is not doing this correctly, you can force the fake-main hack to be used, which will always work. Note that if the fake-main hack is enabled, you need to include the header file GSConfig.h in you main program -- this is done by default if you include NSObject.h or Foundation.h. If you want to avoid the whole idea of the fake-main hack, you can use the pass-arguments option. In this case you will be forced to call the NSProcessInfo initializeWithArguments method to pass the program arguments to NSProcessInfo (This would be done automatically if you use the NSApplicationMain function in a gui application). @node FFI Library, , Reading Command-Line Arguments, Configuration @subsection FFI Library GNUstep's NSInvocations and Distributed Objects code involves detailed manipulation of the stack and function calls using a library that implements a Foreign-Function Interface (FFI), such as the libffi library. Use of libffi is automatically enabled if the libffi library is found (and the same with ffcall, although libffi takes precedence), unless specifically disabled with @code{--disable-do}. @node Compilation, , Configuration, Top @section Compilation To compile this library, type make. After this is complete, type make install (make sure you are the root user). Some additional options you can use with make are @samp{debug=yes} to make a debugging version of the library and @samp{shared=no} to make a static version of the library. See the gstep-make package for more information on these options. If you can't install gstep-base as root, be sure to edit the @file{Tools/gdomap.h} file and uncomment the last line. @ifinfo Copyright @copyright{} 2005 Free Software Foundation Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. @end ifinfo @bye gnustep-base-1.29.0/Documentation/manual/000077500000000000000000000000001435650067400203005ustar00rootroot00000000000000gnustep-base-1.29.0/Documentation/manual/.cvsignore000066400000000000000000000001371435650067400223010ustar00rootroot00000000000000*.log *.dvi *.ps *.html *.info *.aux *.toc *.cp *.fn *.vr *.tp *.ky *.pg *.ps *.vrs *.cl *.pr gnustep-base-1.29.0/Documentation/manual/AdvancedMessaging.texi000066400000000000000000000373651435650067400245540ustar00rootroot00000000000000@paragraphindent 0 @node Advanced Messaging @chapter Advanced Messaging @cindex advanced messaging @cindex messaging, advanced techniques Objective-C provides some additional possibilities for message routing besides the capabilities described so far (inheritance and categories). One of the most important is that it is possible for an object, upon receiving a message it has not been set up to respond to, to @i{forward} that message to another object. A second important capability, which forwarding relies on, is the ability to represent method implementations directly in code. This supports various reflective operations as well as optimization where messages are sent many times. @section How Messaging Works Sending an Objective-C message requires three types of information: @itemize @bullet @item The message @b{receiver} - the object which is to perform the request. @item The message @b{selector} - this identifies the message, and is used to locate the excecutable code of the corresponding @b{method} by searching the structure of the class, and if necessary its superclasses, for an implementation. @item The message @b{arguments} - once the implementation has been found, these are simply passed to the method on the stack as in an ordinary function call. @end itemize In the message '@code{[taskArray insertObject: anObj atIndex: i]}', the receiver is ``@code{taskArray}'', the selector is ``@code{insertObject:atIndex:}'', and the arguments are ``@code{anObj}'' and ``@code{i}''. Notice that the selector includes the argument titles and both colons, but not the argument names. In other words, this method might have been declared as '@code{- (void) insertObject: (id)anObject atIndex: (unsigned)index;}', but the ``@code{anObject}'' and ``@code{index}'' are just used for tracking the arguments within the method implementation code and not for looking up the method itself. The following sequence of events would occur on sending this message at runtime: @enumerate @item The internal @code{isa} pointer of the @b{receiver} (@code{taskArray}) is used to look up its class. @item The class representation is searched for a method implementation matching the @b{selector} (@code{insertObject:atIndex:}). If it is not found, the class's superclass is searched, and recursively its superclass, until an implementation is found. @item The implementation is called, as if it were a C function, using the @b{arguments} given (@code{anObj} and @code{i}), and the result is returned to the code sending the message. @end enumerate In fact, when the method implementation is actually called, it additionally receives two @i{implicit} arguments: the @b{receiver} and the @b{selector}. These additional hidden arguments may be referred to in the source code by the names @code{self} and @code{_cmd}. The process of looking up the method implementation in the receiver at runtime is known as dynamic binding. This is part of what makes the language powerful and flexible, but it is inevitably (despite clever caching strategies used in the runtime library) a little slower than a simple function call in C. There are, however, ways of short-circuiting the process in cases where performance is at a premium. Before discussing this, we must first cover the concepts of selectors and implementations in greater detail. @section Selectors So far we have been using the following syntax to send messages to objects: @example [myArray removeObjectIdenticalTo: anObject]; @end example The example sends the message named @code{removeObjectIdenticalTo:} to @code{myArray} with the argument @code{anObject}. An alternative method of writing this is the following: @example SEL removalSelector = @@selector(removeObjectIdenticalTo:); [myArray performSelector: removalSelector withObject: anObject]; @end example Here, the first line obtains the desired method selector in the form of a compiled representation (not the full ASCII name), and the second line sends the message as before, but now in an explicit form. Since the message that is sent is now effectively a variable set at runtime, this makes it possible to support more flexible runtime functioning. @subsection The Target-Action Paradigm One conventional way of using selectors is called the @i{target-action} paradigm, and provides a means for, among other things, binding elements of a graphical user interface together at runtime. The idea is that a given object may serve as a flexible signal sender if it is given a receiver (the @i{target}) and a selector (the @i{action}) at runtime. When the object is told to send the signal, it sends the selector to the receiver. In some variations, the object passes itself as an argument. The code to implement this paradigm is simple - @example - (id) performAction @{ if (target == nil || action == 0) @{ return nil; // Target or action not set ... do nothing @} if ([target respondsToSelector: action] == NO) @{ return nil; // Target cannot deal with action ... do nothing @} return [target performSelector: action withObject: self]; @} @end example As an example, consider a graphical button widget that you wish to execute some method in your application when pressed. @example [button setTarget: bigMachine] [button setAction: @@selector(startUp:)]; @end example Here, @code{button} stores the given target and action in instance variables, then when it is pressed, it internally calls a method like @code{performAction} shown above, and sends the message ``@code{[bigMachine startUp: button]}''. If you are used to programming with events and listeners in Java, the target-action paradigm provides a lighter-weight alternative for the most common case where only one object needs to be informed when an event occurs. Rather than writing or extending a special-purpose adaptor class, you just register the method you want called directly with the actuating element. If you need to send the event to multiple objects, however, you would need to write a special method to multiplex the event out. This would be approximately comparable effort to what is always required in Java, and is only needed in the minority of cases. @subsection Obtaining Selectors In addition to using the compile-time @code{@@selector} operator, there are a couple of other ways of obtaining selectors. @itemize @bullet @item In a method implementation, you can always obtain the current selector from the variable @code{_cmd}: @example - (void) removeObjectIdenticalTo: (id)anObject @{ SEL mySelector = _cmd; // ... @} @end example @item At any point, you can use the @code{NSSelectorFromString()} function - @example SEL mySelector = NSSelectorFromString(@@"removeObjectIdenticalTo:"); @end example In reality, you would never use @code{NSSelectorFromString} for a constant string as shown; @code{@@selector} would do and is more efficient, since is a compile-time operator. Its chief utility lies in the case where the selector name is in a variable value (for whatever reason). @end itemize If you ever need to test the contents of a @code{SEL} variable for equality with another, you should use the function @code{sel_eq()} provided as part of the GNU Objective-C runtime library. This is necessary because, while the compiler tries to ensure that compile-time generated references to selectors for a particular message point to the same structure, selectors produced at runtime, or in different compilation units, will be different and a simple pointer equality test will not do. @subsection Avoiding Messaging Errors when an Implementation is Not Found Using @b{typed} objects as shown below, the compiler would forewarn you if the @code{anObject} was unable to respond to the @code{alert:} message, as it knows what type of object @code{anObject} is: @example SomeClass *anObject; // an instance of the 'SomeClass' class anObject = [[SomeClass alloc] init]; // build and initialize the object [anObject alert: additionalObject]; // compiler warns if 'alert:' not // defined in SomeClass or a superclass @end example However at times the compiler will not forewarn you that a message will attempt to invoke a method that is not in the @b{receiver's} repertoire. For instance, consider the code below where @code{anObject} is not known to implement the @code{alert:} message: @example id anObject; // arbitrary object; anObject = [[SomeClass alloc] init]; // build and initialize object [anObject alert: additionalObject]; // compiler cannot check whether // 'alert' is defined @end example In this case, the compiler will not issue a warning, because it only knows that @code{anObject} is of type @code{id} @dots{} so it doesn't know what methods the object implements. At runtime, if the Objective-C runtime library fails to find a @b{method implementation} for the @code{alert:} message in the @code{SomeClass} class or one of its superclasses, an exception is generated. This can be avoided in one of two ways. The first way is to check in advance whether the method is implemented: @example if ([anObject respondsToSelector: @@selector(alert:)] == YES) @{ [anObject alert: additionalObject]; // send it a message. @} else @{ // Do something else if the object can't be alerted @} @end example The second way is for the object the message was sent to to @i{forward} it somewhere else. @section Forwarding @cindex forwarding What actually happens when the GNU Objective-C runtime is unable to find a method implementation associated with an object for a given selector is that the runtime instead sends a special @code{forwardInvocation:} message to the object. (Other Objective-C runtimes do the same, but with a slightly different message name and structure.) The object is then able to use the information provided to handle the message in some way, a common mechanism being to forward the message to another object known as a @b{delegate}, so that the other object can deal with it. @example - (void) forwardInvocation: (NSInvocation*)invocation @{ if ([forwardee respondsToSelector: [invocation selector]]) return [invocation invokeWithTarget: forwardee]; else return [self doesNotRecognizeSelector: [invocation selector]]; @} @end example @itemize @bullet @item @b{@code{invocation}} is an instance of the special @code{NSInvocation} class containing all the information about the original message sent, including its @b{selector} and its arguments. @item @b{@code{forwardee}} is an instance variable containing the @code{id} of an object which has been determined to be likely to implement methods that this object does not. @item The @b{@code{NSInvocation}} class has a convenience method that will pass the message on to a target object given as argument. @item The @b{@code{doesNotRecognizeSelector}} method is a fallback which is implemented in @code{NSObject}. Unless it has been overidden, its behavior is to raise a runtime exception (a @code{NSInvalidArgumentException} to be exact), which generates an error message and aborts. @end itemize Forwarding is a powerful method for creating software patterns. One of these is that forwarding can be used to in effect provide a form of multiple inheritance. Note, however that, unlike inheritance, a forwarded method will not show up in tests like @code{respondsToSelector} and @code{isKindOfClass:}. This is because these methods search the inheritance path, but ignore the forwarding path. (It is possible to override them though.) Another pattern you may come across is @i{surrogate object}: surrogates forward messages to other objects that can be assumed to be more complex. The @code{forwardInvocation:} method of the surrogate object receives a message that is to be forwarded; it determines whether or not the receiver exists, and if it does not, then it will attempt to create it. A @b{proxy} object is a common example of a surrogate object. A proxy object is useful in a remote invocation context, as well as certain scenarios where you want one object to fulfill functions of another. @ignore Need to talk about NSMethodSignature and methodSignatureForSelector? @end ignore @section Implementations Recall that when a message is sent, the runtime system searches for a method implementation associated with the recipient object for the specified selector. (Behind the scenes this is carried out by a function ``@code{objc_msgSend()}''.) This may necessitate searches across multiple superclass objects traversing upwards in the inheritance hierarchy, and takes time. Once the runtime finds an implementation for a class, it will cache the information, saving time on future calls. However, even just checking and accessing the cache has a cost associated with it. In performance-critical situations, you can avoid this by holding on to an implementation yourself. In essence, implementations are function pointers, and the compiler provides a datatype for storing them when found at runtime: @example SEL getObjSelector = @@selector(getObjectAtIndex:); // get the 'getObjectAtIndex' implementation for NSArray 'taskArray' IMP getObjImp = [taskArray methodForSelector: getObjSelector]; // call the implementation as a function id obj = (getObjImp)( taskArray, getObjSelector, i ); @end example Here, we ask the runtime system to find the '@code{taskArray}' object's implementation of '@code{getObjectAtIndex}'. The runtime system will use the same algorithm as if you were performing a method call to look up this code, and then returns a function pointer to it. In the next line, this pointer is used to call the function in the usual C fashion. Notice that the signature includes both the object and the selector -- recall that these are the two implicit arguments, @code{self} and @code{_cmd}, that every method implementation receives. The actual type definition for @code{IMP} allows for a variable number of additional arguments, which are the explicit arguments to the method call: @example typedef id (*IMP)(id, SEL, ...); @end example The return type of @code{IMP} is @code{id}. However, not all methods return @code{id}; for these others you can still get the implementation, but you cannot use an @code{IMP} variable and instead must cast it yourself. For example, here is such a cast for a method taking a double and returning '@code{double}': @example double (*squareFunc)( id, SEL, double ); double result; squareFunc = (double (*)( id, SEL, double )) [mathObj methodForSelector: @@selector(squareOf:)]; result = squareFunc(mathObj, @@selector(squareOf:), 4); @end example You need to declare such a function pointer type for any method that returns something besides @code{id} or @code{int}. It is not necessary to declare the argument list (@code{double}) as we did above; the first line could have been ``@code{double (*squareFunc)( id, SEL, @b{...} )}'' instead. An excellent exposition of the amount of time saved in using @code{methodForSelector} and other details of the innards of Objective-C and the Foundation may be found here: @url{http://www.mulle-kybernetik.com/artikel/Optimization/opti-3.html}. You should realize that it is only worth it to acquire the @code{IMP} if you are going to call it a large number of times, and if the code in the method implementation itself is not large compared with the message send overhead. In addition, you need to be careful not to call it when it might be the wrong function. Even when you are sure of the class of the object you are calling it on, Objective-C is sufficiently dynamic that the correct function could change as a program runs. For example, a new category for a class could be loaded, so that the implementation of a method changes. Similarly, a class could be loaded that poses as another, or one that was posing stops doing so. In general, @code{IMPs} should be acquired just before they are to be used, then dropped afterwards. @comment Making Forwarding Transparent @page gnustep-base-1.29.0/Documentation/manual/BaseLibrary.texi000066400000000000000000001312571435650067400234030ustar00rootroot00000000000000@paragraphindent 0 @node Base Library @chapter Base Library @cindex base library The GNUstep Base library is an implementation of the OpenStep @i{Foundation}, a nongraphical API supporting for data management, network and file interaction, date and time handling, and more. Much of the API consists of classes with defined methods, but unlike many ``class libraries'' it also includes functions and macros when these are more appropriate to the functionality. Note that many other APIs developed subsequently to OpenStep are also called ``Foundation'' -- the Java standard classes and the Microsoft Windows C++ class library are two prominent examples. In OpenStep, however, the term only applies to a non-graphical library; the graphical component is referred to as the @i{Application Kit}, or ``AppKit'' for short. Although the OpenStep API underwent several refactorings subsequent to its first release as part of NeXTstep, deprecated and superseded classes and functions have not been retained. Therefore the library still boasts a minimal footprint for its functionality. In some cases, GNUstep has supplemented the OpenStep API, not to provide alternative means of achieving the same goals, but to add new functionality, usually relating to technology that did not exist when the OpenStep specification was finalized, but has not, for whatever reason, been added by Apple to the Cocoa APIs. These additions are called, appropriately enough, the @i{Base Additions} library, and include classes, functions, and macros. XML parsing facilities, for example, are provided as part of this library. In addition, methods are sometimes added to Foundation classes. These are specially marked in the documentation and can even be excluded at compile time (a warning will be generated if you try to use them) if you are writing code intended to be ported to OpenStep or Cocoa compliant systems. In addition, Cocoa has made additions to OpenStep and these are marked as ``MacOS-X''. For information on how to set compile flags, see @ref{Compliance to Standards}. In deciding whether to use a given API, you need to weigh the likelihood you will need to port the application to a platform where it will not be available, and in that case, how much effort would be required to do without the API. If you are aiming for full portability from the start (only a recompile needed), then you should of course avoid APIs that will not be available. However in other cases it can be better to use whichever APIs are best suited initially so that early development and debugging will be as efficient as possible -- as long as major redesign would not be required to later avoid these APIs. Below, the Base and Base Additions APIs are covered in overview fashion, organized according to functionality. For detailed documentation on individual classes and functions, you should consult the GSDoc API references for @uref{../Reference/index.html, Base} and @uref{../../BaseAdditions/Reference/index.html, Base Additions}. It may be helpful, when reading this chapter, to keep a copy of this open in another browser window for reference. @section Copying, Comparing, Hashing Objects Often in object-oriented code you need to make a duplicate copy of an existing object. The @code{NSObject} method @code{-(id) copy} provides a standard means of acquiring a copy of the object. The @i{depth} of the copy is not defined. That is, if an object has instance variables or other references to other objects, they may either themselves be copied or just the references to them will be copied. The root class @code{NSObject} does @i{not} implement the copy method directly; instead it calls the @code{-copyWithZone} method, which is the sole method defined in the @code{@i{NSCopying}} informal protocol. @code{NSObject} does not implement this protocol. If you want objects of your class to support copying, you must implement this method yourself. If it is not implemented, the @code{-copy} method will raise an exception if you call it. There is a related method @code{-(id) mutableCopy} (and an @code{@i{NSMutableCopying}} informal protocol with a @code{mutableCopyWithZone} method) which will be explained in the following section. GNUstep, largely via the @code{NSObject} class, provides a basic framework for comparing objects for equality and ordering, used for sorting, indexing, and other programming tasks. These operations are also used in several crucial places elsewhere within the base library itself. For example, containers such as lists, sets, and hash maps are discussed in the next section utilize these methods. The @code{- (BOOL) isEqual} method in @code{NSObject} is useful when you want to compare objects with one another: @example if ([anObject isEqual: anotherObject]) @{ // do something ... @} @end example The default implementation returns @code{YES} only if the two objects being compared are the exact same object (which is the same as the result that would be returned using '@code{==}' to perform the comparison). Sometimes it is useful to have two objects to be equal if their internal state is the same, as reflected in instance variables, for example. In this case, you can override @code{isEqual} in your class to perform such a comparison. The @code{-(unsigned int)hash} method is useful for indexing objects, and should return the same value for two objects of the same class that @code{isEqual} each other. The same reasoning applies as for the @code{isEqual} method -- if you want this to depend on internal state rather than the identity of the object itself, override it. The default @code{hash} value is based on the memory address occupied by the object. The @code{-(NSComparisonResult) compare: (id)object} method is used in Cocoa for comparing objects. It should return @code{NSOrderedAscending} if the receiver is less than the argument, @code{NSOrderedDescending} if it is greater, otherwise @code{NSOrderedSame}. Note that this is not meaningful for many types of objects, and is actually deprecated in GNUstep for this reason. The @code{-(NSString *) description} method in @code{NSObject} returns a short description of the object, often used for debugging. The default implementation lists the object's class and memory location. If you want other information you can override it. The methods discussed in this section are all very similar to counterparts in Java: the @code{equals} and @code{hashCode} methods, and the @code{@i{Comparable}} interface. @section Object Containers GNUstep defines three major utility classes for holding collections of other objects. @code{NSArray} is an ordered collection of objects, each of which may occur in the collection multiple times. @code{NSSet} is an unordered collection of unique objects (according to @code{isEqual} and/or @code{hash}). @code{NSDictionary} is an unordered collection of key-value pairs. The keys form a set (and must be unique), however there are no restrictions on the collection of values. The @code{-hash} and @code{-isEqual} @code{NSObject} methods discussed above are used by collection instances to organize their members. All collections @code{retain} their members (see @ref{Objects}). Unlike container APIs in some other languages, notably Java, instances of these GNUstep classes are all @i{immutable} -- once created, you cannot add or remove from them. If you need the ability to make changes (often the case), use the mutable classes @code{NSMutableArray}, @code{NSMutableSet}, and @code{NSMutableDictionary}. The @code{-mutableCopy} method mentioned in the previous section will return the mutable version of a container regardless of whether the original was mutable or not. Likewise, the @code{-copy} method returns an immutable version. You should generally use immutable variants of objects when you don't need to modify them, because their implementations are more efficient. Often it is worthwhile to convert a mutable object that has just been built into an immutable one if it is going to be heavily accessed. Also unlike container objects in Java, GNUstep containers possess utility methods. For example, Arrays can sort their members, or send a message to each member individually (like the @code{map} function in Lisp). Sets can determine whether they are equal to or subsets of other sets. Dictionaries can save to and restore themselves from specially formatted files. In addition to the three container types already mentioned, there is a fourth, @code{NSCountedSet}. This is an unordered collection whose elements need not be unique, however the number of times a given unique element has been added is tracked. This behavior is also known as @i{bag} semantics. All collection classes support returning an @code{NSEnumerator} object which will enumerate over the elements of the collection. Note that if a mutable collection is modified while an enumerator is being used, the results are not defined. Collections do not allow @code{nil} values or keys, but you can explicitly represent a nil object using the special @code{NSNull} class. You simply use the singleton returned from @code{[NSNull null]}. The four container types just described handle objects, but not primitives such as @code{float} or @code{int}. For this, you must use an @code{NSHashTable} or @code{NSMapTable}. Despite their names, these are not classes, but data types. A set of functions is defined for dealing with them. Each can store and retrieve arbitrary pointers keyed by other arbitrary pointers. However you are responsible for implementing the hashing yourself. To create an @code{NSHashTable}, use the function @code{NSCreateHashtable}. @code{NSHashInsert} and @code{NSHashGet} are the major functions, but there are many others. There is a mostly parallel but more sophisticated set of functions dealing with @code{NSMapTables}. @ignore Need to explain why NSHashTable and NSMapTable are not classes, if there is a good reason for it, or else make excuses for why it is the (at first glance rather crappy) way it is... @end ignore @section Data and Number Containers The data containers discussed in the previous section, with the exception of @code{NSHashTable} and @code{NSMapTable}, can store objects, but not primitive types such as @code{int}s or @code{float}s. The @code{NS...Table} structures are not always appropriate for a given task. For this case, GNUstep offers two alternatives. @subsection NSData The @code{NSData} and @code{NSMutableData} classes manage a buffer of bytes as an object. The contents of the buffer can be anything that can be stored in memory, a 4-dimensional array of @code{double} for example (stored as a linear sequence). Optionally, objects of these classes can take care of the memory management for the buffer, growing it as needed and freeing it when they are released. @subsection NSValue The @code{NSValue} class can wrap a single primitive value as an object so it can be used in the containers and other places where an object reference is needed. Once initialized, an @code{NSValue} is immutable, and there is no @code{NSMutableValue} class. You initialize it by giving it a pointer to the primitive value, and you should be careful this does not get freed until after the @code{NSValue} is no longer used. You can specify to the @code{NSValue} what type the primitive is so this information can be accessed later: @example int n = 10; NSValue *theValue = [NSValue value: &n withObjCType: @@encode(int)]; // ... int *m = (int *) [theValue pointerValue]; @end example Here, @code{@@encode} is a compile-time operator that converts the data type into a string (char *) code used at runtime to refer to the type. Object ids can also be stored within @code{NSValue}s if desired. Note that in the above case, the @code{NSValue} will be pointing to invalid data once the local variable @code{@i{n}} goes out of scope. If you want to wrap @code{int} or other numeric values, you should use @code{NSNumber} (a subclass of @code{NSValue}) instead. This maintains its own copy of the data and provides convenience methods for accessing the value as a primitive. @example int n = 10; NSNumber *theNumber = [NSNumber numberWithInt: n]; // ... int m = [theNumber intValue]; float f = [theNumber floatValue]; // this is also valid @end example Notice that @code{@i{n}}'s value is used in the initialization, not a pointer to it. @subsection NSNumber @code{NSNumber} has a subclass called @code{NSDecimalNumber} that implements a number of methods for performing decimal arithmetic to much higher precision than supported by ordinary @code{long double}. The behavior in terms of rounding choices and exception handling may be customized using the @code{NSDecimalNumberHandler} class. Equivalent functionality to the @code{NSDecimalNumber} class may be accessed through functions, mostly named @code{NSDecimalXXX}. Both the class and the functions use a structure also called @code{NSDecimal}: @example typedef struct @{ signed char exponent; // Signed exponent - -128 to 127 BOOL isNegative; // Is this negative? BOOL validNumber; // Is this a valid number? unsigned char length; // digits in mantissa. unsigned char cMantissa[2*NSDecimalMaxDigit]; @} @end example Instances can be initialized using the @code{NSDecimalFromString(NSString *)} function. @subsection NSRange, NSPoint, NSSize, NSRect There are also a few types (not classes) for representing common composite structures. @code{NSRange} represents an integer interval. @code{NSPoint} represents a floating point 2-d cartesian location. @code{NSSize} represents a 2-d floating point extent (width and height). @code{NSRect} contains a lower-left point and an extent. A number of utility functions are defined for handling rectangles and points. @ignore Again, why aren't these things objects? Efficiency? @end ignore @section Date/Time Facilities GNUstep contains the @code{NSDate} class and the @code{NSCalendarDate} classes for representing and handling dates and times. @code{NSDate} has methods just relating to times and time differences in the abstract, but not calendar dates or time zones. These features are added in the @code{NSCalendarDate} subclass. The @code{NSTimeZone} class handles time zone information. @section String Manipulation and Text Processing Basic string handling in the GNUstep Base library was covered in @ref{Objective-C, ,Strings in GNUstep}. Here, we introduce a number of additional string and text processing facilities provided by GNUstep. @subsection NSScanner and Character Sets The @code{NSScanner} class can be thought of as providing a combination of the capabilities of the C @code{sscanf()} function and the Java @code{StringTokenizer} class. It supports parsing of NSStrings and extraction of numeric values or substrings separated by delimiters. @code{NSScanner} works with objects of a class @code{NSCharacterSet} and its subclasses @code{NSMutableCharacterSet}, @code{NSBitmapCharSet}, and @code{NSMutableBitmapCharSet}, which provide various means of representing sets of unicode characters. @subsection Attributed Strings @i{Attributed strings} are strings that support the association of @i{attributes} with ranges of characters within the string. Attributes are name-value pairs represented by an @code{NSDictionary} and may include standard attributes (used by GNUstep GUI classes for font and other characteristics during rendering) as well as programmer-defined application specific attributes. The classes @code{NSAttributedString} and @code{NSMutableAttributedString} represent attributed strings. They are not subclasses of @code{NSString}, though they bundle an instance of one. @ignore Need a lot more explanation -- where do you look for info on standard attributes, what are common usage patterns, etc.. @end ignore @subsection Formatters @i{Formatters} are classes providing support for converting complex values into text strings. They also provide some support for user editing of strings to be converted back into object equivalents. All descend from @code{NSFormatter}, which defines basic methods for obtaining either an attributed string or a regular string for an object value. Specific classes include @code{NSDateFormatter} for @code{NSDate} objects, @code{NSNumberFormatter} for @code{NSNumber} objects. Instances of these classes can be customized for specific display needs. @section File Handling A number of convenience facilities are provided for platform-independent access to the file system. The most generally useful is the @code{NSFileManager} class, which allows you to read and save files, create/list directories, and move or delete files and directories. In addition to simply listing directories, you may obtain an @code{NSDirectoryEnumerator} instance from it, a subclass of @code{NSEnumerator} which provides a full listing of all the files beneath a directory and its subdirectories. If you need to work with path names but don't need the full @code{NSFileManager} capabilities, @code{NSString} provides a number of path-related methods, such as @code{-stringByAppendingPathComponent:} and @code{-lastPathComponent}. You should use these instead of working directly with path strings to support cross-platform portability. @code{NSFileHandle} is a general purpose I/O class which supports reading and writing to both files and network connections, including ordinary and encrypted (SSL) socket connections, and the standard in / standard out streams familiar from Unix systems. You can obtain instances through methods like @code{+fileHandleForReadingAtPath:(NSString *)path} and @code{+fileHandleAsServerAtAddress:(NSString *)address service:(NSString *)service protocol:(NSString *)protocol}. The network-related functions of @code{NSFileHandle} (which are a GNUstep extension not included in Cocoa) will be covered in a later section. Note this class also supports gzip compression for reading and writing. Finally, GNUstep also provides some miscellaneous filesystem-related utility functions, including @code{NSTemporaryDirectory()} and @code{NSHomeDirectoryForUser()}. @section Persistence and Serialization GNUstep provides robust facilities for persisting objects to disk or sending them over a network connection (to implement @ref{Distributed Objects, Distributed Objects}). One class of facilities is referred to as @i{property list serialization}, and is only usually used for @code{NSDictionary} and @code{NSArray} container objects, and @code{NSNumber}, @code{NSData}, @code{NSString}, and @code{NSDate} member objects. It utilizes primarily text-based formats. Saving to and loading back from a serialized property list representation will preserve values but not necessarily the classes of the objects. This makes property list representations robust across platforms and library changes, but also makes it unsuitable for certain applications. @i{Archiving}, the second class of GNUstep persistence facilities, provides for the persistence of a @i{graph} of arbitrary objects, with references to one another, taking care to only persist each individual object one time no matter how often it is referred to. Object class identities are preserved, so that the behavior of a reloaded object graph is guaranteed to be the same as the saved one. On the other hand, the classes for these objects must be available at load time. @subsection Property List Serialization Serialized property list representations (sometimes referred to as ``@i{plists}'') are typically saved and restored using methods in collection classes. For example the @code{NSDictionary} class has @code{-writeToFile:atomically:} to save, @code{+dictionaryWithContentsOfFile} to restore, and @code{NSArray} has similar methods. Alternatively, if you wish to save/restore individual @code{NSData} or other objects, you can use the @code{NSPropertyListSerialization} class. (There are also @code{NSSerializer} and @code{NSDeserializer} classes, but these are deprecated in Mac OS X and are not really needed in GNUstep either, so should not be used.) Serialized property lists can actually be written in one of three different formats -- plain text, XML, and binary. Interconversion amongst these is possible using the @code{pldes} and @code{plser} command-line tools (see the @uref{../../Tools/Reference/index.html, tools reference}). @ignore Still need: the XML format; how to specify format in output; discussion of compatibility with OS X; using serialization with NSData. @end ignore @subsection Archives Archiving utilizes a binary format that is cross-platform between GNUstep implementations, though not between GNUstep and Mac OS X Cocoa. Archiving, like serialization in Java, is used both for saving/restoring objects on disk and for interprocess communications with @ref{Distributed Objects, Distributed Objects}. For an object to be archivable, it must adopt the @code{NSCoding} protocol. The coding process itself is managed by instances of the @code{NSCoder} class and its subclasses: @table @code @item NSCoder Base class, defines most of the interface used by the others. @item NSArchiver, NSUnarchiver Sequential archives that can only be saved and restored en masse. @item NSKeyedArchiver, NSKeyedUnarchiver Random access archives that can be read from and written to on an individual-object basis and provide more robust integrity in the face of class changes. @item NSPortCoder Used for @ref{Distributed Objects, Distributed Objects}. @end table The basic approach to accessing or creating an archive is to use one of the convenience methods in an @code{NSCoder} subclass: @table @code @item + (BOOL) archiveRootObject: (id)object toFile: (NSString *)file Save object and graph below it to file. '@code{YES}' returned on success. Both @code{NSArchiver} and @code{NSKeyedArchiver} support. @item + (NSData *) archivedDataWithRootObject: (id)object Save object and graph below it to a byte buffer. Both @code{NSArchiver} and @code{NSKeyedArchiver} suport. @item + (id) unarchiveObjectWithFile: (NSString *)file Load object graph from file. Both @code{NSUnarchiver} and @code{NSKeyedUnarchiver} support. @item + (id) unarchiveObjectWithData: (NSData *)data Load object graph from byte buffer. Both @code{NSUnarchiver} and @code{NSKeyedUnarchiver} support. @end table To obtain more specialized behavior, instantiate one of the classes above and customize it (through various method calls) before instigating the primary archiving or unarchiving operation. From the perspective of the objects being archived, the @code{NSCoding} protocol declares two methods that must be implemented: @table @code @item -(void) encodeWithCoder: (NSCoder *)encoder This message is sent by an @code{NSCoder} subclass or instance to request the object to archive itself. The implementation should send messages to @code{encoder} to save its essential instance variables. If this is impossible (for whatever reason) an exception should be raised. @item -(id) initWithCoder: (NSCoder *)decoder This message is sent by an @code{NSCoder} subclass or instance to request the object to restore itself from an archive. The implementation should send messages to @code{decoder} to load its essential instance variables. An exception should be raised if there is a problem restoring state. @end table Here is an example @code{NSCoding} implementation: @example @@interface City : PoliticalUnit @{ private float latitude; float longitude; CensusData *censusData; State *state; @} // ... @@end ... @@implementation City - (void) encodeWithCoder: (NSCoder *)coder @{ [super encodeWithCoder:coder]; // always call super first if (![coder allowsKeyedCoding]) @{ [coder encodeValueOfObjCType: @@encode(float) at: &latitude]; [coder encodeValueOfObjCType: @@encode(float) at: &longitude]; [coder encodeObject: censusData]; [coder encodeConditionalObject: state]; @} else @{ [coder encodeFloat: latitude forKey: @@"City.latitude"]; [coder encodeFloat: longitude forKey: @@"City.longitude"]; [coder encodeObject: censusData forKey: @@"City.censusData"]; [coder encodeConditionalObject: state forKey: @@"City.state"]; @} return; @} - (id) initWithCoder: (NSCoder *)coder @{ self = [super initWithCoder:coder]; // always assign 'self' to super init.. if (![coder allowsKeyedCoding]) @{ // Must decode keys in same order as encodeWithCoder: [coder decodeValueOfObjCType: @@encode(float) at: &latitude]; [coder decodeValueOfObjCType: @@encode(float) at: &longitude]; censusData = [[coder decodeObject] retain]; state = [[coder decodeObject] retain]; @} else @{ // Can decode keys in any order censusData = [[coder decodeObjectForKey: @@"City.censusData"] retain]; state = [[coder decodeObjectForKey: @@"City.state"] retain]; latitude = [coder decodeFloatForKey: @@"City.latitude"]; longitude = [coder decodeFloatForKey: @@"City.longitude"]; @} return self; @} // ... @@end @end example The primary wrinkle to notice here is the check to @code{[coder allowsKeyedCoding]}. The object encodes and decodes its instance variables using keys if this returns '@code{YES}'. Keys must be unique within a single inheritance hierarchy -- that is, a class may not use keys the same as its superclass or any of its ancestors or sibling classes. Keyed archiving provides robustness against class changes and is therefore to be preferred in most cases. For example, if instance variables are added at some point to the @code{City} class above, this will not prevent earlier versions of the class from restoring data from a later one (they will just ignore the new values), nor does it prevent a later version from initializing from an earlier archive (it will not find values for the added instance variables, but can set these to defaults). Finally, notice the use of @code{encodeConditionalObject} above for @code{state}, in contrast to @code{encodeObject} for census data. The reason the two different methods are used is that the @code{City} object @i{owns} its census data, which is an integral part of its structure, whereas the @code{state} is an auxiliary reference neither owned nor retained by @code{City}. It should be possible to store the cities without storing the states. Thus, the @code{encodeConditionalObject} method is called, which only stores the @code{State} if it is already being stored unconditionally elsewhere during the current encoding operation. Note that within a given archive, an object will be written only once. Subsequent requests to write the same object are detected and a reference is written rather than the full object. @ignore Mention awake, substitution on encode, etc..? @end ignore @section Utility The GNUstep Base library provides a number of utility classes that don't fall under any other function category. The @code{NSUserDefaults} class provides access to a number of system- and user-dependent settings that should affect tool and application behavior. You obtain an instance through sending @code{[NSUserDefaults standardUserDefaults]}. The instance provides access to settings indexed by string keys. The standard keys used are documented @uref{../../../User/Gui/DefaultsSummary.html, here}. Users can adjust settings for particular keys using the @i{@code{@uref{../../Tools/Reference/defaults.html, defaults}}} command. The @code{NSProcessInfo} class provides access to certain information about the system environment such as the operating system and host name. It also provides support for process logging (see @ref{Exception Handling, Logging, Logging}). You obtain an instance through sending @code{[NSProcessInfo processInfo]}. The @code{NSUndoManager} class provides a general mechanism for supporting @i{undo} of user operations in applications. Essentially, it allows you to store sequences of messages and receivers that need to be invoked to undo or redo an action. The various methods in this class provide for grouping of sets of actions, execution of undo or redo actions, and tuning behavior parameters such as the size of the undo stack. Each application entity with its own editing history (e.g., a document) should have its own undo manager instance. Obtain an instance through a simple @code{[[NSUndoManager alloc] init]} message. The @code{NSProtocolChecker} and @code{NSProxy} classes provide message filtering and forwarding capabilities. If you wish to ensure at runtime that a given object will only be sent messages in a certain protocol, you create an @code{NSProtocolChecker} instance with the protocol and the object as arguments: @example id versatileObject = [[ClassWithManyMethods alloc] init]; id narrowObject = [NSProtocolChecker protocolCheckerWithTarget: versatileObject protocol: @@protocol(SomeSpecificProtocol)]; return narrowObject; @end example This is often used in conjunction with distributed objects to expose only a subset of an objects methods to remote processes. The @code{NSProxy} class is another class used in conjunction with distributed objects. It implements no methods other than basic @code{NSObject} protocol methods. To use it, create a subclass overriding @code{-(void) forwardInvocation:} and @code{- (NSMethodSignature) methodForSelector:}. By appropriate implementations here, you can make an @code{NSProxy} subclass instance act like an instance of any class of your choosing. @ignore Much more needed about this -- why is a special class needed since all objects have a forwardInvocation method, what is -methodForSelector and do all classes that want to implement -forwardInvocation need to implement it as well (in which case need to add to discussion in Advanced Messaging), ... @end ignore The @code{NSBundle} class provides support for run-time dynamic loading of libraries and application resources, usually termed ``Bundles''. A bundle consists of a top-level directory containing subdirectories that may include images, text files, and executable binaries or shared libraries. The ``.app'' directory holding a NeXTstep/OpenStep/GNUstep/Cocoa application is actually a bundle, as are the ``Frameworks'' containing shared libraries together with other resources. Bundles and frameworks are covered in @ref{Bundles and Frameworks}. @section Notifications GNUstep provides a framework for sending messages between objects within a process called @i{notifications}. Objects register with an @code{NSNotificationCenter} to be informed whenever other objects post @code{NSNotification}s to it matching certain criteria. The notification center processes notifications synchronously -- that is, control is only returned to the notification poster once every recipient of the notification has received it and processed it. Asynchronous processing is possible using an @code{NSNotificationQueue}. This returns immediately when a notification is added to it, and it will periodically post the oldest notification on its list to the notification center. In a multithreaded process, notifications are always sent on the thread that they are posted from. An @code{NSNotification} consists of a string name, an object, and optionally a dictionary which may contain arbitrary associations. Objects register with the notification center to receive notifications matching either a particular name, a particular object, or both. When an object registers, it specifies a message selector on itself taking an @code{NSNotification} as its sole argument. A message will be sent using this selector whenever the notification center receives a matching notification in a post. Obtain a notification center instance using @code{NSNotificationCenter +defaultCenter}. An @code{NSDistributedNotificationCenter} may be used for interprocess communication on the same machine. Interprocess notification will be slower than within-process notification, and makes use of the @uref{../../Tools/Reference/gdnc.html, gdnc} command-line tool. Notifications are similar in some ways to @i{events} in other frameworks, although they are not used for user interface component connections as in Java (message forwarding and the target-action paradigm are used instead). In addition, the GNUstep GUI (AppKit) library defines an @code{NSEvent} type for representing mouse and keyboard actions. @section Networking and RPC GNUstep provides some general network-related functionality, as well as classes supporting @ref{Distributed Objects, distributed objects} and related forms of inter-process communication. @subsection Basic Networking GNUstep provides the following classes handling basic network communications: @table @code @item NSHost Holds and manages information on host names and IP addresses. Use the @code{+currentHost}, @code{+hostWithName:}, or @code{+hostWithAddress:} class methods to obtain an instance. @item NSFileHandle On Unix, network connections are treated analogously to files. This abstraction has proven very useful, so GNUstep supports it in the @code{NSFileHandle} class, even on non-Unix platforms. You may use the class methods @code{+fileHandleAsServerAtAddress:(NSString *)address service:(NSString *)service protocol:(NSString *)protocol} and corresponding client methods to access one side of a connection to a port on a networked machine. (To use pipes, see the next section.) @item NSURL Provides methods for working with URLs and the data accessible through them. Once an @code{NSURL} is constructed, data may be loaded asynchronously through @code{NSURL -loadResourceDataNotifyingClient:usingCache:} or synchronously through @code{NSURL -resourceDataUsingCache:}. It can also be obtained through @code{NSString +stringWithContentsOfURL:} or @code{NSData +dataWithContentsOfURL:}. @item NSURLHandle This class provides additional control over the URL contents loading process. Obtain an instance through @code{NSURL -URLHandleUsingCache:}. @end table @subsection Remote Process Communications GNUstep provides a number of classes supporting @ref{Distributed Objects, distributed objects} and related forms of inter-process communication. In most cases, you only need to know about the @code{NSConnection} class, but if you require additional control over distributed objects, or if you wish to use alternative forms of communications such as simple messaging, you may use the classes listed here. @table @code @item NSConnection This is the primary class used for registering and acquiring references to distributed objects. @item NSDistantObject When a client acquires a remote object reference through @code{NSConnection +rootProxyForConnectionWithRegisteredName:}, the returned object is an instance of this class, which is a subclass of @code{NSProxy}. Since usually you will just cast your reference to this to a particular protocol, you do not need to refer to the @code{NSDistantObject} class directly. @item NSPort, NSPortMessage Behind the scenes in distributed objects, @code{NSPort} objects handle both network communications and serialization/deserialization for sending messages to remote objects and receiving the results. The actual data sent over the network is encapsulated by @code{NSPortMessage} objects, which consist of two ports (sender and receiver) and a body consisting of one or more @code{NSData} or @code{NSPort} objects. (Data in the @code{NSData} must be in network byte order.) @item NSSocketPort, NSMessagePort If you want to send custom messages between processes yourself, you can use these classes. @code{NSSocketPort} can communicate to processes on the same or remote machines. @code{NSMessagePort} is optimized for local communications only. @item NSPortNameServer, NSSocketPortNameServer, NSMessagePortNameServer The @code{NSPortNameServer} class and subclasses are used behind the scenes by the distributed objects system to register and look up remotely-accessible objects. @end table @section Threads and Run Control A GNUstep program may initiate independent processing in two ways -- it can start up a separate process, referred to as a @i{task}, much like a @i{fork} in Unix, or it may spawn multiple @i{threads} within a single process. Threads share data, tasks do not. Before discussing tasks and threads, we first describe the @i{run loop} in GNUstep programs. @subsection Run Loops and Timers @code{NSRunLoop} instances handle various utility tasks that must be performed repetitively in an application, such as processing input events, listening for distributed objects communications, firing @code{NSTimer}s, and sending notifications and other messages asynchronously. In general, there is one run loop per thread in an application, which may always be obtained through the @code{+currentRunLoop} method, however unless you are using the AppKit and the [NSApplication] class, the run loop will not be started unless you explicitly send it a @code{-run} message. At any given point, a run loop operates in a single @i{mode}, usually @code{NSDefaultRunLoopMode}. Other modes are used for special purposes and you usually need not worry about them. An @code{NSTimer} provides a way to send a message at some time in the future, possibly repeating every time a fixed interval has passed. To use a timer, you can either create one that will automatically be added to the run loop in the current thread (using the @code{-addTimer:forMode:} method), or you can create it without adding it then add it to a run loop of your choosing later. @subsection Tasks and Pipes You can run another program as a subprocess using an @code{NSTask} instance, and communicate with it using @code{NSPipe} instances. The following code illustrates. @example NSTask *task = [[NSTask alloc] init]; NSPipe *pipe = [NSPipe pipe]; NSFileHandle *readHandle = [pipe fileHandleForReading]; NSData *inData = nil; [task setStandardOutput: pipe]; [task setLaunchPath: [NSHomeDirectory() stringByAppendingPathComponent:@@"bin/someBinary"]]; [task launch]; while ((inData = [readHandle availableData]) && [inData length]) @{ [self processData:inData]; @} [task release]; @end example Here, we just assume the task has exited when it has finished sending output. If this might not be the case, you can register an observer for @ref{Base Library, notifications, Notifications} named @code{NSTaskDidTerminateNotification}. @subsection Threads and Locks @i{Threads} provide a way for applications to execute multiple tasks in parallel. Unlike separate processes, all threads of a program share the same memory space, and therefore may access the same objects and variables. GNUstep supports multithreaded applications in a convenient manner through the @code{NSThread} and @code{NSLock} classes and subclasses. @code{NSThread +detachNewThreadSelector:toTarget:withObject:} allows you to initiate a new thread and cause a message to be sent to an object on that thread. The thread can either run in a ``one-shot'' manner or it can sit in loop mode (starting up its own instance of the @code{NSRunLoop} class) and communicate with other threads using part of the @ref{Distributed Objects, distributed objects} framework. Each thread has a dictionary (accessed through @code{-threadDictionary} that allows for storage of thread-local variables. Because threads share data, there is the danger that examinations of and modifications to data performed concurrently by more than one thread will occur in the wrong order and produce unexpected results. (Operations with immutable objects do not present this problem unless they are actually deallocated.) GNUstep provides the @code{@i{NSLocking}} protocol and the @code{NSLock} class and subclasses to deal with this. @code{@i{NSLocking}} provides two methods: @code{-lock} and @code{-unlock}. When an operation needs to be performed without interference, enclose it inside of lock-unlock: @example NSArray *myArray; NSLock *myLock = [[NSLock alloc] init]; // ... [myLock lock]; if (myArray == nil) @{ myAray = [[NSMutableArray alloc] init]; [myArray addObject: someObject]; @} [myLock unlock]; @end example This code protects '@code{myArray}' from accidentally being initialized twice if two separate threads happen to detect it is @code{nil} around the same time. When the @code{lock} method is called, the thread doing so is said to @i{acquire} the lock. No other thread may subsequently acquire the lock until this one has subsequently @i{relinquished} the lock, by calling @code{unlock}. Note that the lock object should be initialized @i{before} any thread might possibly need it. Thus, you should either do it before any additional threads are created in the application, or you should enclose the lock creation inside of another, existing, lock. The @code{-lock} method in the @code{@i{NSLocking}} protocol blocks indefinitely until the lock is acquired. If you would prefer to just check whether the lock can be acquired without committing to this, you can use @code{NSLock -tryLock} or @code{NSLock -lockBeforeDate:}, which return @code{YES} if they succeed in acquiring the lock. @code{NSRecursiveLock} is an @code{NSLock} subclass that may be locked multiple times by the same thread. (The @code{NSLock} implementation will not allow this, causing the thread to deadlock (freeze) when it attempts to acquire the lock a second time.) Each @code{lock} message must be balanced by a corresponding @code{unlock} before the lock is relinquished. @code{NSConditionLock} stores an @code{int} together with its lock status. The @code{-lockWhenCondition:(int)value} and related methods request the lock only if the condition is equal to that passed in. The condition may be changed using the @code{unlockWithCondition:(int)value} method. This mechanism is useful for, e.g., a producer-consumer situation, where the producer can ``tell'' the consumer that data is available by setting the condition appropriately when it releases the lock it acquired for adding data. Finally, the @code{NSDistributedLock} class does not adopt the @code{@i{NSLocking}} protocol but supports locking across processes, including processes on different machines, as long as they can access a common filesystem. If you are writing a class library and do not know whether it will be used in a multithreaded environment or not, and would like to avoid locking overhead if not, use the @code{NSThread +isMultiThreaded} method. You can also register to receive @code{NSWillBecomeMultiThreadedNotification}s. You can also use the @code{GSLazyLock} and @code{GSLazyRecursiveLock} classes (see next section) which handle this automatically. @subsection Using @code{NSConnection} to Communicate Between Threads You can use the distributed objects framework to communicate between threads. This can help avoid creating threads repeatedly for the same operation, for example. While you can go through the full process of registering a server object by name as described in @ref{Distributed Objects, distributed objects}, a lighter weight approach is to create @code{NSConnection}s manually: @example // code in Master... - startSlave @{ NSPort *master; NSPort *slave; NSArray *ports; NSConnection *comms; master = [NSPort port]; slave = [NSPort port]; comms = [[NSConnection alloc] initWithReceivePort: master sendPort: slave]; [comms setRootObject: self]; portArray = [NSArray arrayWithObjects: slave, master, nil]; [NSThread detachNewThreadSelector: @@selector(newWithCommPorts:) toTarget: [Slave class] withObject: ports]; @} // code in Slave... + newWithCommPorts: (NSArray *)ports @{ NSConnection *comms; NSPort *slave = [ports objectAtIndex: 0]; NSPort *master = [ports objectAtIndex: 1]; comms = [NSConnection connectionWithReceivePort: slave sendPort: master]; // create instance and assign to 'self' self = [[self alloc] init]; [(id)[comms rootProxy] setServer: self]; [self release]; [[NSRunLoop currentRunLoop] run]; @} @end example @section GNUstep Additions The @uref{../../BaseAdditions/Reference/index.html, Base Additions} library consists of a number of classes, all beginning with '@code{GC}' or '@code{GS}', that are not specified in OpenStep or Cocoa but have been deemed to be of general utility by the GNUstep developers. The library is designed so that it can be built and installed on a system, such as OS X, where GNUstep is not available but an alternate Foundation implementation is. It contains the following categories of classes: @table @code @item GSXMLxxx Classes for parsing XML using DOM- or SAX-like APIs, for processing XPath expressions, and for performing XSLT transforms. These are implemented over the @uref{http://xmlsoft.org, libxml2} C library, and using them should for the most part protect you from the frequent API changes in that library. @item GSHtmlXxx Classes for parsing HTML documents (not necessarily XHTML). @item GSMimeXxx Classes for handling MIME messages or HTML POST documents. @item GSLazyXxx Classes implementing ``lazy'' locking that do not actually attempt any locking unless running in a multithreaded application. See @ref{Base Library, , Threads and Run Control}. @end table All of these classes have excellent API reference documentation and you should look @uref{../../BaseAdditions/Reference/index.html, there} for further information. @page gnustep-base-1.29.0/Documentation/manual/Bundles.texi000066400000000000000000000013061435650067400225670ustar00rootroot00000000000000@node Bundles and Frameworks @appendix Application Resources: Bundles and Frameworks @cindex bundles @cindex frameworks @cindex resources, application @i{TBD} @ignore GNUstep does not have frameworks as such but it still has bundles and the means of loading them. IMHO frameworks ought to be reconsidered since they are a very useful construct. Java uses them to great benefit now (resources go into jars, which are like frameworks, and there are .war and .ear archive types with more specialized roles). It is true that dylib loading is a system-dependent process, however this could be solved by the use of symbolic links on unix systems, and post-install copying on Windows systems. @end ignore @page gnustep-base-1.29.0/Documentation/manual/Compliance.texi000066400000000000000000000112031435650067400232420ustar00rootroot00000000000000@node Compliance to Standards @appendix GNUstep Compliance to Standards @cindex standards, GNUstep compliance to @cindex standards compliance @cindex OpenStep compliance @cindex OS X compatibility GNUstep is generally compatible with the OpenStep specification and with recent developments of the MacOS-X (Cocoa) API. Where MacOS deviates from the OpenStep API, GNUstep generally attempts to support both versions. In some cases the newer MacOS APIs are incompatible with OpenStep, and GNUstep usually supports the richer version. In order to deal with compatiblity issues, GNUstep uses two mechanisms - it provides conditionally compiled sections of the library header files, so that software can be built that will conform strictly to a particular API, and it provides user default settings to control the behavior of the library at runtime. @section Conditional Compilation @cindex compilation, conditional Adding an option to a makefile to define one of the following preprocessor constants will modify the API visible to software being compiled - @deffn preprocessor NO_GNUSTEP GNUstep specific extensions to the OpenStep and MacOS cocoa APIs are excluded from the headers if this is defined to a non-zero value. @end deffn @deffn preprocessor STRICT_MACOS_X Only methods and classes that are part of the MacOS cocoa API are made available in the headers if this is defined. @end deffn @deffn preprocessor STRICT_OPENSTEP Only methods and classes that are part of the OpenStep specification are made available in the headers if this is defined. @end deffn Note, these preprocessor constants are used in developer code (ie the code that users of GNUstep write) rather than by the GNUstep software itself. They permit a developer to ensure that he/she does not write code which depends upon API not present on other implementations (in practice, MacOS-X or some old OPENSTEP systems). The actual GNUstep libraries are always built with the full GNUstep API in place, so that the feature set is as consistent as possible. @section User Defaults @cindex user defaults, API compliance User defaults may be specified ... @deffn defaults GNU-Debug An array of strings that lists debug levels to be used within the program. These debug levels are merged with any which were set on the command line or added programmatically to the set given by the [NSProcessInfo-debugSet] method. @end deffn @deffn defaults GSLogSyslog Setting the user default GSLogSyslog to YES will cause log/debug output to be sent to the syslog facility (on systems which support it), rather than to the standard error stream. This is useful in environments where stderr has been re-used strangely for some reason. @end deffn @deffn defaults GSMacOSXCompatible Setting the user default GSMacOSXCompatible to YES will cause MacOS compatible behavior to be the default at runtime. This default may however be overridden to provide more fine grained control of system behavior. @end deffn @deffn defaults GSOldStyleGeometry Specifies whether the functions for producing strings describing geometric structures (NSStringFromPoint(), NSStringFromSize(), and NSStringFromRect()) should produce strings conforming to the OpenStep specification or to MacOS-X behavior. The functions for parsing those strings should cope with both cases anyway. @end deffn @deffn defaults GSSOCKS May be used to specify a default SOCKS5 server (and optionally a port separated from the server by a colon) to which tcp/ip connections made using the NSFileHandle extension methods should be directed. This default overrides the SOCKS5_SERVER and SOCKS_SERVER environment variables. @end deffn @deffn defaults {Local Time Zone} Used to specify the name of the timezone to be used by the NSTimeZone class. @end deffn @deffn defaults NSWriteOldStylePropertyLists Specifies whether text property-list output should be in the default MacOS-X format (XML), or in the more human readable (but less powerful) original OpenStep format. Reading of property lists is supported in either format, but only if GNUstep is built with the libxml library (which is needed to handle XML parsing). NB. MacOS-X generates illegal XML for some strings - those which contain characters not legal in XML. GNUstep always generates legal XML, at the cost of a certain degree of compatibility. GNUstep XML property lists use a backslash to escape illegal chatracters, and consequently any string containing either a backslash or an illegal character will be written differently to the same string on MacOS-X. @end deffn @deffn defaults NSLanguages An array of strings that lists the users prefered languages, in order or preference. If not found the default is just English. @end deffn gnustep-base-1.29.0/Documentation/manual/DistributedObjects.texi000066400000000000000000001136041435650067400247740ustar00rootroot00000000000000@paragraphindent 0 @node Distributed Objects @chapter Distributed Objects @cindex distributed objects Until now we have been concentrating on using the Objective-C language to create programs that execute in a single process. But what if you want your program to interact with objects in other processes, perhaps running on different machines? As a simple example, we may have a client process that needs to access a telephone directory stored on a remote server. The client process could send a message to the server that contained a person's name, and the server could respond by returning that person's number. The GNUstep base library provides a powerful set of classes that make this type of remote messaging not only possible, but easy to program. So what do these classes do and how can we use them? To answer that we must first look at the way code interacts with objects in a single process, and then look at how we can achieve the same interaction with objects that exist in different processes. @section Object Interaction @cindex object interaction, remote objects To continue with the example above, if the telephone directory existed in the same process as the code that was accessing it, then a simple message would return the wanted telephone number. @example NSString *wantedNumber = [telephoneDirectory teleNumber: personName]; @end example Now object and method names just hold pointers to memory addresses. The code executed at run time in response to the @code{teleNumber} message is located at an address held by the name of the responding method (a variable), while data in the telephone directory is located at an address held by the @code{telephoneDirectory} variable. In a single process these addresses can be accessed by the client code at run time, but if the telephone directory is located on a remote server, then the address of the remote object is not known in the client process (the @code{telephoneDirectory} object and its responding method are said to exist in a separate 'address space'). The Objective-C run-time library was not designed for this inter-process communication or 'remote messaging'. @section The GNUstep Solution @cindex distributed objects @cindex remote objects @cindex client/server processes @cindex NSConnection class @cindex NSProxy class @cindex NSRunLoop class GNUstep overcomes these limitations by providing you with classes that form what is known as a 'distributed objects' architecture that extends the capabilities of the run-time system. With the addition of a few lines of code in the client and server programs, these extensions allow you to send a message to a remote process by constructing a simple Objective-C statement. In the telephone directory example, the statement to retrieve the telephone number would now look something like this: @example NSString *wantedNumber = [proxyForDirectory teleNumber: personName]; @end example Compare this to the original statement: @example NSString *wantedNumber = [telephoneDirectory teleNumber: personName]; @end example Notice that the only difference between the two statements is the name of the object receiving the message, i.e. @code{proxyForDirectory} rather than @code{telephoneDirectory}. GNUstep makes it as simple as this to communicate with an object in another process. The variable @code{proxyForDirectory} is known as a 'proxy' for the remote @code{telephoneDirectory} object. A proxy is simply a substitute for the remote object, with an address in the 'address space' of the local client process, that receives messages and forwards them on to the remote server process in a suitably coded form. Let us now take a look at the additional lines of code required to make this 'remote messaging' possible. @subsection Code at the Server @cindex distributed objects, client code In order to respond to client messages, the responding server object must be set as the 'root object' of an instance of the @code{NSConnection} class, and this @code{NSConnection} must be registered with the network by name. Making an object available to client processes in this way is known as 'vending' the object. The registered name for the @code{NSConnection} is used by the client when obtaining a proxy for the responding server object over the network. The only other code you need to consider is the code that listens for incoming messages. This 'runloop', as it is known, is started by sending a @code{run} message to an instance of the @code{NSRunLoop} class. Since an @code{NSRunLoop} object is created automatically for each process, there is no need to create one yourself. Simply get the default runloop, which is returned by the @code{+currentRunLoop} class method. When the runloop detects an incoming message, the message is passed to the root object of the @code{NSConnection}, which performs a method in response to the message and returns a variable of the appropriate type. The @code{NSConnection} manages all inter-process communication, decoding incoming messages and encoding any returned values. @comment{Sequence diagram would be really useful here.} The code to vend the @code{telephoneDirectory} object and start the runloop would look something like this: @example /* * The main() function: Set up the program * as a 'Distributed Objects Server'. */ int main(void) @{ /* * Remember, create an instance of the * NSAutoreleasePool class. */ CREATE_AUTORELEASE_POOL(pool); /* * Get the default NSConnection object * (a new one is automatically created if none exists). */ NSConnection *connXion = [NSConnection defaultConnection]; /* * Set the responding server object as * the root object for this connection. */ [connXion setRootObject: telephoneDirectory]; /* * Try to register a name for the NSConnection, * and report an error if this is not possible. */ if ([connXion registerName: @@"DirectoryServer"] == NO) @{ NSLog(@@"Unable to register as 'DirectoryServer'"); NSLog(@@"Perhaps another copy of this program is running?"); exit(1); @} /* Start the current runloop. */ [[NSRunLoop currentRunLoop] run]; /* Release the pool */ RELEASE(pool); return 0; @} @end example These additional lines of code turn a program into a distributed objects server, ready to respond to incoming client messages. @subsection Code at the Client @cindex distributed objects, client code At the client, all you need do is obtain a proxy for the responding server object, using the name that was registered for the @code{NSConnection} at the server. @example /* Create an instance of the NSAutoreleasePool class */ CREATE_AUTORELEASE_POOL(pool); /* Get the proxy */ id proxy = [NSConnection rootProxyForConnectionWithRegisteredName: @i{registeredServerName}]; /* The rest of your program code goes here */ /* Release the pool */ RELEASE(pool); @end example The code that obtains the proxy automatically creates an NSConnection object for managing the inter-process communication, so there is no need to create one yourself. The above example serves to establish a secure connection between processes which are run by the same person and are both on the same host. If you want your connections to work between different host or between programs being run by different people, you do this slightly differently, telling the system that you want to use 'socket' ports, which make TCP/IP connections over the network. @example int main(void) @{ CREATE_AUTORELEASE_POOL(pool); /* * Create a new socket port for your connection. */ NSSocketPort *port = [NSSocketPort port]; /* * Create a connection using the socket port. */ NSConnection *connXion = [NSConnection connectionWithReceivePort: port sendPort: port]; /* * Set the responding server object as * the root object for this connection. */ [connXion setRootObject: telephoneDirectory]; /* * Try to register a name for the NSConnection, * and report an error if this is not possible. */ if ([connXion registerName: @@"DirectoryServer" withNameServer: [NSSocketPortNameServer sharedInstance]] == NO) @{ NSLog(@@"Unable to register as 'DirectoryServer'"); NSLog(@@"Perhaps another copy of this program is running?"); exit(1); @} [[NSRunLoop currentRunLoop] run]; RELEASE(pool); return 0; @} @end example In the above example, we specify that the socket port name server is used to register the name for the connection ... this makes the connection name visible to processes running on other machines. The client side code is as follows @example /* Create an instance of the NSAutoreleasePool class */ CREATE_AUTORELEASE_POOL(pool); /* Get the proxy */ id proxy = [NSConnection rootProxyForConnectionWithRegisteredName: @i{registeredServerName} host: @i{hostName} usingNameServer: [NSSocketPortNameServer sharedInstance]]; /* The rest of your program code goes here */ /* Release the pool */ RELEASE(pool); @end example If the @i{hostName} in this statement is 'nil' or an empty string, then only the local host will be searched to find the @i{registeredServerName}. If @i{hostName} is "*", then all hosts on the local network will be searched. In the telephone directory example, the code to obtain the proxy from any host on the network would be: @example id proxyForDirectory = [NSConnection rootProxyForConnectionWithRegisteredName: @@"DirectoryServer" host: @@"*" usingNameServer: [NSSocketPortNameServer sharedInstance]]; @end example With this additional line of code in the client program, you can now construct a simple Objective-C statement to communicate with the remote object. @example NSString *wantedNumber = [proxyForDirectory teleNumber: personName]; @end example @subsection Using a Protocol @cindex protocol for distributed objects @cindex distributed objects, using a protocol A client process does not need to know the class of a remote server object to avoid run-time errors, it only needs to know the messages to which the remote object responds. This can be determined by the client at run-time, by asking the server if it responds to a particular message before the message is sent. If the methods implemented at the server are stated in a formal protocol, then the client can ask the server if it conforms to the protocol, reducing the network traffic required for the individual message/response requests. A further advantage is gained at compile time, when the compiler will issue a warning if the server fails to implement any method declared in the protocol, or if the client contains any message to which the server cannot respond. The protocol is saved to a header file and then included in both client and server programs with the usual compiler @code{#include} directive. Only the server program needs to implement the methods declared in the protocol. To enable compiler checking in the client program, extend the type declaration for the proxy to this protocol, and cast the returned proxy object to the same extended type. In the telephone directory example, if the declared protocol was @code{TelephoneDirectory}, declared in header file @code{protocolHeader.h}, then the client code would now look like this: @example #include "protocolHeader.h"; /* Extend the type declaration */ id proxyForDirectory; /* Cast the returned proxy object to the extended type */ proxyForDirectory = (id) [NSConnection rootProxyForConnectionWithRegisteredName: @@"DirectoryServer" usingNameServer: [NSSocketPortNameServer sharedInstance]]; @end example Since class names and protocol names do not share the same 'address space' in a process, the declared protocol and the class of the responding server object can share the same name, making code easier to understand. For example, @code{proxyForDirectory} at the client could be a proxy for an instance of the @code{TelephoneDirectory} class at the server, and this class could implement the @code{TelephoneDirectory} protocol. @subsection Complete Code for Telephone Directory Application Here we provide the rest of the code needed for client and server to actually run the above example. @b{Code At Server} @example #include /* Include the TelephoneDirectory protocol header file */ #include "TelephoneDirectory.h" /* * Declare the TelephoneDirectory class that * implements the 'teleNumber' instance method. */ @@interface TelephoneDirectory : NSObject @@end /* * Define the TelephoneDirectory class * and the instance method (teleNumber). */ @@implementation TelephoneDirectory : NSObject - (char *) teleNumber: (char *) personName @{ if (strcmp(personName, "Jack") == 0) return " 0123 456"; else if (strcmp(personName, "Jill") == 0) return " 0456 789"; else return " Number not found"; @} @@end /* main() function: Set up the program as a 'Distibuted Objects Server'. */ /* [use code from server example above ...] */ @end example @b{Code at Client} @example #include /* Include the TelephoneDirectory protocol header file */ #include "TelephoneDirectory.h" /* * The main() function: Get the telephone number for * 'personName' from the server registered as 'DirectoryServer'. */ int main(int argc, char *argv[]) @{ char *personName = argv[1]; char *returnedNumber; id proxyForDirectory; CREATE_AUTORELEASE_POOL(pool); /* Acquire the remote reference. */ proxyForDirectory = (id) [NSConnection rootProxyForConnectionWithRegisteredName: @@"DirectoryServer" host: @@"*" usingNameServer: [NSSocketPortNameServer sharedInstance]]; if (proxyForDirectory == nil) printf("\n** WARNING: NO CONNECTION TO SERVER **\n"); else printf("\n** Connected to server **\n"); if (argc == 2) // Command line name entered @{ returnedNumber = (char *)[proxyForDirectory teleNumber: personName]; printf("\n%s%s%s%s%s\n", "** (In client) The telephone number for ", personName, " is:", returnedNumber, " **"); @} else printf("\n** No name entered **\n"); printf("\n%s\n\n", "** End of client program **"); RELEASE(pool); return 0; @} @end example To get this running, all you need do is create two directories, one for the client and one for the server. Each directory will hold a makefile, the client or server source code, and a copy of the protocol header file. When the files compile, first run the server and then the client. You can try this on the same machine, or on two different machines (with GNUstep installed) on the same LAN. What happens when you run the client without the server? How would you display a "No Server Connection" warning at the client? @subsection GNUstep Distributed Objects Name Server @cindex gdomap @cindex Distributed Objects Name Server, GNUstep You might wonder how the client finds the server, or, rather, how it finds the directory the server lists itself in. For the default connection type (a connection only usable on the local host between processes run by the same person), a private file (or the registry on ms-windows) is used to hold the name registration information. For connections using socket ports to communicate between hosts, an auxiliary process will automatically be started on each machine, if it isn't running already, that handles this, allowing the server to register and the client to send a query behind the scenes. This @i{GNUstep Distributed Objects Name Server} runs as '@code{gdomap}' and binds to port 538. See the manual page or the HTML ``GNUstep Base Tools'' @uref{../../Tools/Reference/index.html, documentation} for further information. @subsection Look Ma, No Stubs! One difference you may have noticed in the example we just looked at from other remote method invocation interfaces such as CORBA and Java RMI was that there are @i{no stub classes}. The source of this great boon is described at the end of this chapter: @ref{Distributed Objects, , Language Support for Distributed Objects}. @section A More Involved Example @cindex distributed objects, example (no error checking) @cindex game server example Now we will look at an example called GameServer that uses distributed objects in a client/server game. Actually the game itself is not implemented, just its distributed support structure, and while the code to vend an object and connect to a remote process is similar to that already shown, the code does show a number of additional techniques that can be used in other client/server programs. Here are the requirements we will implement: @itemize @bullet @item When the client attempts to join the game, the server checks that the client is entitled to join, based on the last time the client played. The rule is: if the client lost the last game, then they cannot re-play for the next 2 hours; but if the client won the last game, then they can re-play the game at any time (a reward for winning).@* @item The server also makes sure the client is not already connected and playing the game (i.e. they cannot play two games at the same time - that would be cheating).@* @item In addition to a proxy for the server being obtained at the client, a proxy for the client is received at the server. This allows two-way messaging, where the client can send messages to the server and the server can send messages to the client (e.g. the state of play may be affected by the actions of other players, or by other events at the server).@* Two protocols will therefore be required, one for the methods implemented at the server and one for those implemented at the client. @end itemize Have a look at the program code in the following sections and added comments. Can you work out what is happening at the server and client? If you have any difficulties then refer to the relevant sections in this manual, or to class documentation @uref{../Reference/index.html, here} or at the Apple web site. @subsection Protocol Adopted at Client We have chosen @code{GameClient} as the name of both the protocol adopted at the client and the class of the responding client object. The header file declaring this protocol will simply declare the methods that the class must implement. @example @@protocol GameClient - (void) clientMessage: (bycopy NSString *)theMessage; - (int) clientReply; // Other methods would be added that // reflect the nature of the game. @@end @end example The protocol will be saved as @code{GameClient.h}. @subsection Protocol Adopted at Server We have chosen @code{GameServer} as the name of both the protocol adopted at the server and the class of the responding server object. The header file declaring this protocol will simply declare the methods that the class must implement. @example @@protocol GameServer - (BOOL) mayJoin: (id)client asPlayer: (bycopy NSString*)name; - (int) startGame: (bycopy NSString*)name; - (BOOL) endGame: (bycopy NSString*)name; // Other methods would be added that // reflect the nature of the game. @@end @end example The protocol will be saved as @code{GameServer.h}. @subsection Code at the Client The client code contains the @code{main} function and the @code{GameClient} class declaration and implementation. The @code{main()} function attempts to connect to the server, while the @code{GameClient} class adopts the @code{GameClient} protocol. @example #include #include "GameServer.h" #include "GameClient.h" /* * GameClient class declaration: * Adopt the GameClient protocol. */ @@interface GameClient : NSObject @@end /* * GameClient class implementation. */ @@implementation GameClient /* * Implement clientMessage: as declared in the protocol. * The method simply prints a message at the client. */ - (void) clientMessage: (NSString*)theMessage @{ printf([theMessage cString]); @} /* * Implement clientReply: as declared in the protocol. * The method simply returns the character entered * at the client keyboard. */ - (int) clientReply @{ return getchar(); @} @@end // End of GameClient class implementation. /* * The main function of the client program. */ int main(int argc, char **argv) @{ CREATE_AUTORELEASE_POOL(pool); id server; int result; NSString *name; id client; /* * The NSUserName() function returns the name of the * current user, which is sent to the server when we * try to join the game. */ name = NSUserName(); /* * Create a GameClient object that is sent to * the server when we try to join the game. */ client = AUTORELEASE([GameClient new]); /* * Try to get a proxy for the root object of a server * registered under the name 'JoinGame'. Since the host * is '*', we can connect to any server on the local network. */ server = (id)[NSConnection rootProxyForConnectionWithRegisteredName: @@"JoinGame" host: @@"*" usingNameServer: [NSSocketPortNameServer sharedInstance]]; if (server == nil) @{ printf("\n** No Connection to GameServer **\n"); result = 1; @} /* * Try to join the game, passing a GameClient object as * the client, and our user-name as name. The 'client' * argument will be received as a proxy at the server. */ else if ([server mayJoin: client asPlayer: name] == NO) @{ result = 1; // We cannot join the game. @} else @{ /* * At this point, we would actually start to play the game. */ [server startGame: name]; // Start playing game. [server endGame: name]; // Finally end the game. result = 0; @} RELEASE(pool); return result; @} @end example To summarise the code at the client: @itemize @bullet @item We obtained a proxy for the server and can now communicate with the server using the methods declared in the @code{GameServer} protocol.@* @item We passed a @code{GameClient} object and our user-name to the server (the @code{GameClient} object is received as a proxy at the server). The server can now communicate with the client using the methods declared in the @code{GameClient} protocol.@* @item When the game is in progress, the server can alter the state of the client object to reflect the success of the player. @end itemize @subsection Code at the Server The server code contains the @code{main} function and the @code{GameServer} class declaration and implementation. The @code{main()} function vends the server's root object and starts the runloop, while the @code{GameServer} class adopts the @code{GameServer} protocol. The class also implements methods that initialise and deallocate the root object's instance variables (dictionaries that hold player information). @example #include #include "GameServer.h" #include "GameClient.h" /* * GameServer class declaration: * Adopt the GameServer protocol and declare * GameServer instance variables. */ @@interface GameServer : NSObject @{ NSMutableDictionary *delayUntil; // Delays to re-joining GameServer. NSMutableDictionary *currentPlayers; // Proxies to each client. NSMutableDictionary *hasWon; // Success in game for each player. @} @@end /* * GameServer class implementation. */ @@implementation GameServer /* Initialise GameServer's instance variables. */ - (id) init @{ self = [super init]; if (self != nil) @{ /* * Create a dictionary for a maximum of * 10 named players that will hold a * re-joining time delay. */ delayUntil = [[NSMutableDictionary alloc] initWithCapacity: 10]; /* * Create a dictionary that will hold the * names of these players and a proxy for * the received client objects. */ currentPlayers = [[NSMutableDictionary alloc] initWithCapacity: 10]; /* * Create a dictionary that will record * a win for any of these named players. */ hasWon = [[NSMutableDictionary alloc] initWithCapacity: 10]; @} return self; @} /* Release GameServer's instance variables. */ - (void) dealloc @{ RELEASE(delayUntil); RELEASE(currentPlayers); RELEASE(hasWon); [super dealloc]; @} /* * Implement mayJoin:: as declared in the protocol. * Adds the client to the list of current players. * Each player is represented at the server by both * name and by proxy to the received client object. * A player cannot join the game if they are already playing, * or if joining has been delayed until a later date. */ - (BOOL) mayJoin: (id)client asPlayer: (NSString*)name @{ NSDate *delay; // The time a player can re-join the game. NSString *aMessage; if (name == nil) @{ NSLog(@@"Attempt to join nil user"); return NO; @} /* Has the player already joined the game? */ if ([currentPlayers objectForKey: name] != nil) @{ /* Inform the client that they cannot join. */ aMessage = @@"\nSorry, but you are already playing GameServer!\n"; [client clientMessage: aMessage]; return NO; @} /* Get the player's time delay for re-joining. */ delay = [delayUntil objectForKey: name]; /* * Can the player join the game? Yes if there is * no restriction or if the time delay has passed; * otherwise no, they cannot join. */ if (delay == nil || [delay timeIntervalSinceNow] <= 0.0) @{ /* Remove the old restriction on re-joining the game. */ [delayUntil removeObjectForKey: name]; /* Add the player to the list of current players. */ [currentPlayers setObject: client forKey: name]; [hasWon setObject: @@"NO" forKey: name]; // They've not won yet. /* Inform the client that they have joined the game. */ aMessage = @@"\nWelcome to GameServer\n"; [client clientMessage: aMessage]; return YES; @} else @{ /* Inform the client that they cannot re-join. */ aMessage = @@"\nSorry, you cannot re-join GameServer yet.\n"; [client clientMessage: aMessage]; return NO; @} @} /* * Implement startGame: as declared in the protocol. * Simply ask the player if they want to win, and get * there reply. */ - (int) startGame: (NSString *)name @{ NSString *aMessage; id client; int reply; client = [currentPlayers objectForKey: name]; aMessage = @@"\nDo you want to win this game? (Y/N ) ... "; [client clientMessage: aMessage]; reply = [client clientReply]; if (reply == 'y' || reply == 'Y') [hasWon setObject: @@"YES" forKey: name]; // They win. else [hasWon setObject: @@"NO" forKey: name]; // They loose. return 0; @} /* * Implement endGame: as declared in the protocol. * Removes a player from the game, and either sets * a restriction on the player re-joining or removes * the current restriction. */ - (BOOL) endGame: (NSString*)name @{ id client; NSString *aMessage, *yesOrNo; NSDate *now, *delay; NSTimeInterval twoHours = 2 * 60 * 60; // Seconds in 2 hours. if (name == nil) @{ NSLog(@@"Attempt to end nil user"); return NO; @} now = [NSDate date]; delay = [now addTimeInterval: twoHours]; client = [currentPlayers objectForKey: name]; yesOrNo = [hasWon objectForKey: name]; if ([yesOrNo isEqualToString: @@"YES"]) // Has player won? @{ /* * Player wins, no time delay to re-joining the game. * Remove any re-joining restriction and send * a message to the client. */ [delayUntil removeObjectForKey: name]; aMessage = @@"\nWell played: you can re-join GameServer at any time.\n"; [client clientMessage: aMessage]; @} else // Player lost @{ /* * Set a time delay for re-joining the game, * and send a message to the client. */ [delayUntil setObject: delay forKey: name]; aMessage = @@"\nYou lost, but you can re-join GameServer in 2 hours.\n"; [client clientMessage: aMessage]; @} /* Remove the player from the current game. */ [currentPlayers removeObjectForKey: name]; [hasWon removeObjectForKey: name]; return YES; @} @@end // End of GameServer class implementation /* * The main function of the server program simply * vends the root object and starts the runloop. */ int main(int argc, char** argv) @{ CREATE_AUTORELEASE_POOL(pool); GameServer *server; NSSocketPort *port; NSConnection *connXion; server = AUTORELEASE([GameServer new]); port = [NSSocketPort port]; connXion = [NSConnection connectionWithReceivePort: port sendPort: port]; [connXion setRootObject: server]; [connXion registerName: @@"JoinGame" withNameServer: [NSSocketPortNameServer sharedInstance]]; [[NSRunLoop currentRunLoop] run]; RELEASE(pool); return 0; @} @end example To summarise the code at the server: @itemize @bullet @item We vend the server's root object and start a runloop, allowing clients to connect with the server.@* @item When we receive a proxy for a client object, we communicate with that client using methods declared in the @code{ClientServer} protocol.@* @item We create three dictionary objects, each referenced by player name. @code{currentUsers} holds proxies for each of the current players; @code{delayUntil} holds times when each player can re-join the game; and @code{hasWon} holds a string for each player, which is set to "YES" if the player wins.@* @item When the game is in progress, the server can alter the state of each client object to reflect the success of each player. @end itemize I hope you managed to understand most of the code in this example. If you are reading the on-screen version, then you can copy and paste the code to suitably named files, create makefiles, and then make and run each program. What message is displayed if you immediately try to re-join a game after losing? And after winning? @i{Exercise: Modify the server code so that the server records the number of wins for each player, and displays this information at both the start and end of each game.} @section Language Support for Distributed Objects Objective-C provides special 'type' qualifiers that can be used in a protocol to control the way that message arguments are passed between remote processes, while at run time, the run-time system transparently uses what is known as 'forward invocation' to forward messages to a remote process. (See @ref{Advanced Messaging, , Forwarding}.) @subsection Protocol Type Qualifiers @cindex protocol type qualifiers @cindex in, out, and inout type qualifiers @cindex out, type qualifier @cindex oneway, type qualifier @cindex bycopy and byref type qualifiers When message arguments are passed by value then the receiving method can only alter the copy it receives, and not the value of the original variable. When an argument is passed by reference (as a pointer), the receiving method has access to the original variable and can alter that variable's data. In this case the argument is effectively passed 'in' to the method, and then passed 'out' of the method (on method return). When an argument is passed by reference to a remote object, the network must handle this two-way traffic, whether or not the remote object modifies the received argument. Type qualifiers can be used in a protocol to control the way these messages are handled, and to indicate whether or not the sending process will wait for the remote process to return. @itemize @bullet @item The @b{oneway} qualifier is used in conjunction with a @code{void} return type to inform the run-time system that the sending process does not need to wait for the receiving method to return (known as 'asynchronous' messaging). The protocol declaration for the receiving method would look something like this:@*@* @code{- (@b{oneway} void)noWaitForReply;}@*@* @item The @b{in, out } and @b{inout} qualifiers can be used with pointer arguments to control the direction in which an argument is passed. The protocol declaration for the receiving methods would look something like this:@* @example /* * The value that 'number' points to will be passed @b{in} to the remote process. * (No need to return the argument's value from the remote process.) */ @code{- setValue: (@b{in} int *)number;} /* * The value that 'number' points to will be passed @b{out} of the remote process. * (No need to send the argument's value to the remote process.) */ @code{- getValue: (@b{out} int *)number;} /* * The value that 'number' points to is first passed @b{in} to the remote * process, but will eventually be the value that is passed @b{out} of the * remote process. (Send and return the argument's value.) */ @code{- changeValue: (@b{inout} int *)number;} @end example Passing of arguments by reference is very restricted in Objective-C. it applies only to pointers to C data types, not to objects, and except for the special case of a pointer to a nul terminated C string (@b{char*}) the pointer is assumed to refer to a single data item of the specified type. @example /* * A method passing an unsigned short integer by reference. */ @code{- updateCounter: (@b{inout} unsigned shortn *)value;} /* * A method passing a structure by reference. */ @code{- updateState: (@b{inout} struct stateInfo *)value;} /* * As a special case, a char (or equivalent typedef) passed by reference * is assumed to be a nul terminated string ... there is no way to pass * a single character by reference: */ @code{- updateBuffer: (@b{inout} char *)str;} @end example @item The @b{bycopy} and @b{byref} qualifiers can be used in a protocol when the argument or return type is an object.@*@* An object is normally passed by reference and received in the remote process as a proxy. When an object is passed by copy, then a copy of the object will be received in the remote process, allowing the remote process to directly interact with the copy. Protocol declarations would look something like this:@* @example /* * Copy of object will be received in the remote process. */ - sortNames: (@b{bycopy} id)listOfNames; /* * Copy of object will be returned by the remote process. */ - (@b{bycopy} id)returnNames; @end example By default, large objects are normally sent @b{byref}, while small objects like @code{NSStrings} are normally sent @b{bycopy}, but you cannot rely on these defaults being adopted and should explicitly state the qualifier in the protocol.@*@* The @b{bycopy} qualifier can also be used in conjunction with the @b{out} qualifier, to indicate that an object will be passed @b{out} of the remote process by copy rather than by proxy (no need to send the object).@* @example /* * The object will not be received in the remote process, but the object * will be returned @b{bycopy}. */ - sortAndReturn: (@b{bycopy out} id *)listOfNames; @end example You should be aware that some classes ignore the @b{bycopy} qualifier and the object will be sent by reference. The @b{bycopy} qualifier will also be ignored if the remote process does not have the class of the object in its address space, since an object's instance variables are accessed through the object's methods.@*@* When a copy of an object is sent to a remote process, only the object's instance variables are sent and received (an object's methods exist in the address space of the object's class, not in the address space of the individual object). @end itemize @subsection Message Forwarding @cindex message forwarding, distributed objects @cindex forward invocation, distributed objects If you have used other remote invocation mechanisms such as CORBA or Java RMI, you may have noticed a big difference from these in the GNUstep Distributed Object paradigm -- there are no ``stub'' classes, either on the client or the server. This tremendously simplifies the use of remote invocation and is possible due to the Objective-C message-forwarding facility (@ref{Advanced Messaging, , Forwarding}). In GNUstep, there are proxies on the client and server side that handle network communications and serialization/deserialization of arguments and return values just as in CORBA and RMI, but when it comes to responding to the client and server protocol method calls themselves, they are intercepted through the use of the @code{forwardInvocation:} method, where they can be passed on to the registered client and server objects through the ordinary Objective-C message sending mechanism. @section Error Checking @cindex error checking, distributed objects @cindex distributed objects, error checking When dealing with distributed objects your code must be able to handle the following situations: failure to vend the server object, exceptions raised at run-time, and failure of the network connection. @subsection Vending the Server Object When vending the server object, your code must be able to handle the situation in which the network does not accept the proposed registered name for the server. @subsection Catching Exceptions There are two situations to consider. @itemize @bullet @item An @code{NSPortTimeoutException} is raised.@*@* This exception is raised if a message takes too long to arrive at the remote process, or if a reply takes too long to return. This will happen if the remote process is busy, has hung, or if there is a problem with the network. The best way to handle the exception is to close the connection to the remote process.@*@* @item An exception is raised in the remote process while the remote process is executing a method.@*@* In most cases you can deal directly with these exceptions in the process in which they were raised; i.e. without having to consider the network connection itself. @end itemize @subsection The Connection Fails You can register an observer object to receive a notification, in the form of a @code{connectionDidDie:} message, when a registered connection fails. The argument to this message will be an @code{NSNotification} object that returns the failed connection when it receives an @code{object} message. See @ref{Base Library, , Event-Based Communications} for more information on notifications. To receive this 'notification' the observer must implement the @code{connectionDidDie:} method, but can be an instance of any class. The observer can then handle the failure gracefully, by releasing any references to the failed connection and releasing proxies that used the connection. Registering an object to receive this notification is described in more detail in the @code{NSConnection} class documentation. @comment{Need some comments on reference counting and disposal.} @page gnustep-base-1.29.0/Documentation/manual/ExceptionHandling.texi000066400000000000000000000546571435650067400246170ustar00rootroot00000000000000@paragraphindent 0 @node Exception Handling @chapter Exception Handling, Logging, and Assertions @cindex exception facilities @cindex logging facilities @cindex assertion facilities No matter how well a program is designed, if it has to interact with a user or other aspect of the outside world in any way, the code is bound to occasionally meet with cases that are either invalid or just plain unexpected. A very simple example is when a program asks the user to enter a filename, and the user enters the name of a file that does not exist, or does not enter a name at all. Perhaps a valid filename @i{is} entered, but, due to a previous disk write error the contents are garbled. Any number of things can go wrong. In addition, programmer error inevitably occurs and needs to be taken account of. Internal functions may be called with invalid arguments, either due to unexpected paths being taken through the code, or silly things like typos using the wrong variable for something. When these problems happen (and they @i{will} happen), it is better to handle them gracefully than for the program to crash, or worse, to continue processing but in an erroneous way. To allow for this, many computer languages provide two types of facilities. The first is referred to as @i{exception handling} or sometimes @i{error trapping}. The second is referred to as @i{assertion checking}. Exceptions allow the program to catch errors when they occur and react to them explicitly. Assertions allow a programmer to establish that certain conditions hold before attempting to execute a particular operation. GNUstep provides both of these facilities, and we will cover each in turn. The assertion facility is tied in with the GNUstep @i{logging} facilities, so we describe those as well. To use any of the facilities described in this chapter requires that you include @code{Foundation/NSException.h}. @section Exceptions @cindex exceptions @cindex NSException class @cindex NS_DURING macro @cindex NS_HANDLER macro @cindex NS_ENDHANDLER macro @cindex NSUncaughtExceptionHandler GNUstep exception handling provides for two things: @enumerate @item When an error condition is detected during execution, control is passed to a special error-handling routine, which is given information on the error that occurred. @item This routine may itself, if it chooses, pass this information up the function call stack to the next higher level of control. Often higher level code is more aware of the context in which the error is occurring, and can therefore make a better decision as to how to react. @end enumerate @subsection Catching and Handling Exceptions GNUstep exception handling is implemented through the macros @code{NS_DURING}, @code{NS_HANDLER}, and @code{NS_ENDHANDLER} in conjunction with the @code{NSException} class. The following illustrates the pattern: @example NS_DURING @{ // do something risky ... @} NS_HANDLER @{ // a problem occurred; inform user or take another tack ... @} NS_ENDHANDLER // back to normal code... @end example For instance: @example - (DataTree *) readDataFile: (String *)filename @{ ParseTree *parse = nil; NS_DURING @{ FileHandle *handle = [self getFileHandle: filename]; parse = [parser parseFile: handle]; if (parse == nil) @{ NS_VALUERETURN(nil); @} @} NS_HANDLER @{ if ([[localException name] isEqualToString: MyFileNotFoundException]) @{ return [self readDataFile: fallbackFilename]; @} else if ([[localException name] isEqualToString: NSParseErrorException]) @{ return [self readDataFileInOldFormat: filename]; @} else @{ [localException raise]; @} @} NS_ENDHANDLER return [[DataTree alloc] initFromParseTree: parse]; @} @end example Here, a file is parsed, with the possibility of at least two different errors: not finding the file and the file being misformatted. If a problem does occur, the code in the @code{NS_HANDLER} block is jumped to. Information on the error is passed to this code in the @code{localException} variable, which is an instance of @code{NSException}. The handler code examines the name of the exception to determine if it can implement a work-around. In the first two cases, an alternative approach is available, and so an alternative value is returned. If the file is found but the parse simply produces a nil parse tree, the @code{NS_VALUERETURN} macro is used to return nil to the @code{readDataFile:} caller. Note that it is @i{not} allowed to simply write ``@code{return nil;}'' inside the NS_DURING block, owing to the nature of the behind-the-scenes C constructs implementing the mechanism (the @code{setjmp()} and @code{longjmp()} functions). If you are in a void function not returning a value, you may use simply ``@code{NS_VOIDRETURN}'' instead. Finally, notice that in the third case above the handler does not recognize the exception type, so it passes it one level up to the caller by calling @code{-raise} on the exception object. @subsection Passing Exceptions Up the Call Stack If the caller of @code{-readDataFile:} has enclosed the call inside its own @code{NS_DURING} @dots{} @code{NS_HANDLER} @dots{} @code{NS_ENDHANDLER} block, it will be able to catch this exception and react to it in the same way as we saw here. Being at a higher level of execution, it may be able to take actions more appropriate than the @code{-readDataFile:} method could have. If, on the other hand, the caller had @i{not} enclosed the call, it would not get a chance to react, but the exception would be passed up to the caller of @i{this} code. This is repeated until the top control level is reached, and then as a last resort @code{NSUncaughtExceptionHandler} is called. This is a built-in function that will print an error message to the console and exit the program immediately. If you don't want this to happen it is possible to override this function by calling @code{NSSetUncaughtExceptionHandler(fn_ptr)}. Here, @code{fn_ptr} should be the name of a function with this signature (defined in @code{NSException.h}): @example void NSUncaughtExceptionHandler(NSException *exception); @end example One possibility would be to use this to save files or any other unsaved state before an application exits because of an unexpected error. @subsection Where do Exceptions Originate? You may be wondering at this point where exceptions come from in the first place. There are two main possibilities. The first is from the Base library; many of its classes raise exceptions when they run into error conditions. The second is that application code itself raises them, as described in the next section. Exceptions do @i{not} arise automatically from C-style error conditions generated by C libraries. Thus, if you for example call the @code{strtod()} function to convert a C string to a double value, you still need to check @code{errno} yourself in standard C fashion. Another case that exceptions are @i{not} raised in is in the course of messaging. If a message is sent to @code{nil}, it is silently ignored without error. If a message is sent to an object that does not implement it, the @code{forwardInvocation} method is called instead, as discussed in @ref{Advanced Messaging}. @subsection Creating Exceptions If you want to explicitly create an exception for passing a particular error condition upwards to calling code, you may simply create an @code{NSException} object and @code{raise} it: @example NSException myException = [[NSException alloc] initWithName: @@"My Exception" reason: @@"[Description of the cause...]" userInfo: nil]; [myException raise]; // code in block after here is unreachable.. @end example The @code{userInfo} argument here is a @code{NSDictionary} of key-value pairs containing application-specific additional information about the error. You may use this to pass arbitrary arguments within your application. (Because this is a convenience for developers, it should have been called @code{developerInfo}..) Alternatively, you can create the exception and raise it in one call with @code{+raise}: @example [NSException raise: @@"My Exception" format: @@"Parse error occurred at line %d.",lineNumber]; @end example Here, the @code{format} argument takes a printf-like format analogous to @code{[NSString -stringWithFormat:]} discussed @ref{Objective-C, previously, Strings in GNUstep}. In general, you should not use arbitrary names for exceptions as shown here but constants that will be recognized throughout your application. In fact, GNUstep defines some standard constants for this purpose in @code{NSException.h}: @table @code @item NSCharacterConversionException An exception when character set conversion fails. @item NSGenericException A generic exception for general purpose usage. @item NSInternalInconsistencyException An exception for cases where unexpected state is detected within an object. @item NSInvalidArgumentException An exception used when an invalid argument is passed to a method or function. @item NSMallocException An exception used when the system fails to allocate required memory. @item NSParseErrorException An exception used when some form of parsing fails. @item NSRangeException An exception used when an out-of-range value is encountered. @end table Also, some Foundation classes define their own more specialized exceptions: @table @code @item NSFileHandleOperationException (NSFileHandle.h) An exception used when a file error occurs. @item NSInvalidArchiveOperationException (NSKeyedArchiver.h) An archiving error has occurred. @item NSInvalidUnarchiveOperationException (NSKeyedUnarchiver.h) An unarchiving error has occurred. @item NSPortTimeoutException (NSPort.h) Exception raised if a timeout occurs during a port send or receive operation. @item NSUnknownKeyException (NSKeyValueCoding.h) An exception for an unknown key. @end table @subsection When to Use Exceptions As might be evident from the @code{-readDataFile:} example above, if a certain exception can be anticipated, it can also be checked for, so you don't necessarily need the exception mechanism. You may want to use exceptions anyway if it simplifies the code paths. It is also good practice to catch exceptions when it can be seen that an unexpected problem might arise, as any time file, network, or database operations are undertaken, for instance. Another important case where exceptions are useful is when you need to pass detailed information up to the calling method so that it can react appropriately. Without the ability to raise an exception, you are limited to the standard C mechanism of returning a value that will hopefully be recognized as invalid, and perhaps using an @code{errno}-like strategy where the caller knows to examine the value of a certain global variable. This is inelegant, difficult to enforce, and leads to the need, with void methods, to document that ``the caller should check @code{errno} to see if any problems arose''. @section Logging @cindex logging @cindex NSLog function @cindex NSDebugLog function @cindex NSWarnLog function @cindex profiling facilities GNUstep provides several distinct logging facilities best suited for different purposes. @subsection NSLog The simplest of these is the @code{NSLog(NSString *format, ...)} function. For example: @example NSLog(@@"Error occurred reading file at line %d.", lineNumber); @end example This would produce, on the console (stderr) of the application calling it, something like: @example 2004-05-08 22:46:14.294 SomeApp[15495] Error occurred reading file at line 20. @end example The behavior of this function may be controlled in two ways. First, the user default @code{GSLogSyslog} can be set to ``@code{YES}'', which will send these messages to the syslog on systems that support that (Unix variants). Second, the function GNUstep uses to write the log messages can be overridden, or the file descriptor the existing function writes to can be overridden: @comment{Need ref to where user defaults are explained.} @example // these changes must be enclosed within a lock for thread safety NSLock *logLock = GSLogLock(); [logLock lock]; // to change the file descriptor: _NSLogDescriptor = ; // to change the function itself: _NSLog_printf_handler = ; [logLock unlock]; @end example Due to locking mechanisms used by the logging facility, you should protect these changes using the lock provided by @code{GSLogLock()} (see @ref{Base Library, , Threads and Run Control} on locking). The @code{NSLog} function was defined in OpenStep and is also available in Mac OS X Cocoa, although the overrides described above may not be. The next set of logging facilities to be described are only available under GNUstep. @subsection NSDebugLog, NSWarnLog The facilities provided by the @code{NSDebugLog} and @code{NSWarnLog} families of functions support source code method name and line-number reporting and allow compile- and run-time control over logging level. The @code{NSDebugLog} functions are enabled at compile time by default. To turn them off, set @code{'diagnose = no'} in your makefile, or undefine @code{GSDIAGNOSE} in your code before including @code{NSDebug.h}. To turn them off at runtime, call @code{[[NSProcessInfo processInfo] setDebugLoggingEnabled: NO]}. (An @code{NSProcessInfo} instance is automatically instantiated in a running GNUstep application and may be obtained by invoking @code{[NSProcessInfo processInfo]}.) At runtime, whether or not logging is enabled, a debug log method is called like this: @example NSDebugLLog(@@"ParseError", @@"Error parsing file at line %d.", lineNumber); @end example Here, the first argument to @code{NSDebugLog}, ``@code{ParseError}'', is a string @i{key} that specifies the category of message. The message will only actually be logged (through a call to @code{NSLog()}) if this key is in the set of active debug categories maintained by the @code{NSProcessInfo} object for the application. Normally, this list is empty. There are three ways for string keys to make it onto this list: @itemize @item Provide one or more startup arguments of the form @code{--GNU-Debug=} to the program. These are processed by GNUstep and removed from the argument list before any user code sees them. @item Call @code{[NSProcessInfo debugSet]} at runtime, which returns an @code{NSMutableSet}. You can add (or remove) strings to this set directly. @item The @code{GNU-Debug} user default nay contain a comma-separated list of keys. However, note that @code{[NSUserDefaults standardUserDefaults]} must first be called before this will take effect (to read in the defaults initially). @end itemize While any string can be used as a debug key, conventionally three types of keys are commonly used. The first type expresses a ``level of importance'' for the message, for example, ``Debug'', ``Info'', ``Warn'', or ``Error''. The second type of key that is used is class name. The GNUstep Base classes used this approach. For example if you want to activate debug messages for the @code{NSBundle}'' class, simply add '@code{NSBundle}' to the list of keys. The third category of key is the default key, '@code{dflt}'. This key can be used whenever the specificity of the other key types is not required. Note that it still needs to be turned on like any other logging key before messasges will actually be logged. There is a family of @code{NSDebugLog} functions with slightly differing behaviors: @table @code @item NSDebugLLog(key, format, args,...) Basic debug log function already discussed. @item NSDebugLog(format, args,...) Equivalent to @code{NSDebugLLog} with key ``dflt'' (for default). @item NSDebugMLLog(key, format, args,...) Equivalent to @code{NSDebugLLog} but includes information on which method the logging call was made from in the message. @item NSDebugMLog(format, args,...) Same, but use 'dflt' log key. @item NSDebugFLLog(key, format, args,...) As @code{NSDebugMLLog} but includes information on a function rather than a method. @item NSDebugFLog(format, args,...) As previous but using 'dflt' log key. @end table The implementations of the @code{NSDebugLog} functions are optimized so that they consume little time when logging is turned off. In particular, if debug logging is deactivated at compile time, there is NO performance cost, and if it is completely deactivated at runtime, each call entails only a boolean test. Thus, they can be left in production code. There is also a family of @code{NSWarn} functions. They are similar to the @code{NSDebug} functions except that they do not take a key. Instead, warning messages are shown by default unless they are disabled at compile time by setting @code{'warn = no'} or undefining @code{GSWARN}, or at runtime by @i{adding} ``@code{NoWarn}'' to @code{[NSProcessInfo debugSet]}. (Command-line argument @code{--GNU-Debug=NoWarn} and adding ``NoWarn'' to the @code{GNU-Debug} user default will also work.) @code{NSWarnLog()}, @code{NSWarnLLog()}, @code{NSWarnMLLog}, @code{NSWarnMLog}, @code{NSWarnFLLog}, and @code{NSWarnFLog} are all similar to their @code{NSDebugLog} counterparts. @subsection Last Resorts: GSPrintf and fprintf Both the @code{NSDebugLog} and the simpler @code{NSLog} facilities utilize a fair amount of machinery - they provide locking and timestamping for example. Sometimes this is not appropriate, or might be too heavyweight in a case where you are logging an error which might involve the application being in some semi-undefined state with corrupted memory or worse. You can use the @code{GSPrintf()} function, which simply converts a format string to UTF-8 and writes it to a given file: @example GSPrintf(stderr, "Error at line %d.", n); @end example If even this might be too much (it uses the @code{NSString} and @code{NSData} classes), you can always use the C function @code{fprintf()}: @example fprintf(stderr, "Error at line %d.", n); @end example Except under extreme circumstances, the preferred logging approach is either @code{NSDebugLog}/@code{NSWarnLog}, due the the compile- and run-time configurability they offer, or @code{NSLog}. @subsection Profiling Facilities GNUstep supports optional programmatic access to object allocation statistics. To initiate collection of statistics, call the function @code{GSDebugAllocationActive(BOOL active)} with an argument of ``@code{YES}''. To turn it off, call it with ``@code{NO}''. The overhead of statistics collection is only incurred when it is active. To access the statistics, use the set of @code{GSDebugAllocation...()} functions defined in @code{NSDebug.h}. @section Assertions @cindex assertions @cindex NSAssert macro @cindex NSAssertionHandler class Assertions provide a way for the developer to state that certain conditions must hold at a certain point in source code execution. If the conditions do not hold, an exception is automatically raised (and succeeding code in the block is not executed). This avoids an operation from taking place with illegal inputs that may lead to worse problems later. The use of assertions is generally accepted to be an efficient means of improving code quality, for, like unit testing, they can help rapidly uncover a developer's implicit or mistaken assumptions about program behavior. However this is only true to the extent that you carefully design the nature and placement of your assertions. There is an excellent discussion of this issue bundled in the documentation with Sun's Java distribution. @comment{Add link to appropriate java.sun.com page.} @subsection Assertions and their Handling Assertions allow the developer to establish that certain conditions hold before undertaking an operation. In GNUstep, the standard means to make an assertion is to use the @code{NSAssert} or @code{NSCAssert} macros. The general form of these macros is: @example NSAssert(, , ); @end example For instance: @example NSAssert(x == 10, "X should have been 10, but it was %d.", x); @end example If the test '@code{x == 10}' evaluates to @code{true}, @code{NSLog()} is called with information on the method and line number of the failure, together with the format string and argument. The resulting console message will look like this: @example Foo.m:126 Assertion failed in Foo(instance), method Bar. X should have been 10, but it was 5. @end example After this is logged, an exception is raised of type '@code{NSInternalInconsistencyException}', with this string as its description. If you need to make an assertion inside a regular C function (not an Objective-C method), use the equivalent macro @code{NSCAssert()}, etc.. @i{@b{Note}}, you can completely disable assertions (saving the time for the boolean test and avoiding the exception if fails) by putting @code{#define NS_BLOCK_ASSERTIONS} before you include @code{NSException.h}. @subsection Custom Assertion Handling The aforementioned behavior of logging an assertion failure and raising an exception can be overridden if desired. You need to create a subclass of @code{NSAssertionHandler} and register an instance in each thread in which you wish the handler to be used. This is done by calling: @example [[[NSThread currentThread] threadDictionary] setObject:myAssertionHandlerInstance forKey:@"NSAssertionHandler"]; @end example See @ref{Base Library, , Threads and Run Control} for more information on what this is doing. @section Comparison with Java @cindex exception handling, compared with Java @cindex logging, compared with Java @cindex assertion handling, compared with Java GNUstep's exception handling facilities are, modulo syntax, equivalent to those in Java in all but three respects: @itemize @item There is no provision for a ``finally'' block executed after either the main code or the exception handler code. @item You cannot declare the exception types that could be raised by a method in its signature. In Java this is possible and the compiler uses this to enforce that a caller should catch exceptions if they might be generated by a method. @item Correspondingly, there is no support in the @ref{GSDoc, documentation system} for documenting exceptions potentially raised by a method. (This will hopefully be rectified soon.) @end itemize The logging facilities provided by @code{NSDebugLog} and company are similar to but a bit more flexible than those provided in the Java/JDK 1.4 logging APIs, which were based on the IBM/Apache Log4J project. The assertion facilities are similar to but a bit more flexible than those in Java/JDK 1.4 since you can override the assertion handler. @page gnustep-base-1.29.0/Documentation/manual/GNUmakefile000066400000000000000000000027751435650067400223650ustar00rootroot00000000000000# # Makefile for GNUstep base manual # # Copyright (C) 2005 Free Software Foundation, Inc. # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public # License as published by the Free Software Foundation; either # version 3 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public # License along with this library. # If not, write to the Free Software Foundation, # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. PACKAGE_NAME = gnustep-base include $(GNUSTEP_MAKEFILES)/common.make -include ../../config.mak GNUSTEP_MAKEINFO_FLAGS = -D NO-TEXI2HTML DOCUMENT_NAME = manual manual_TEXI_FILES = \ foreword.texi \ manual.texi \ AdvancedMessaging.texi \ BaseLibrary.texi \ Compliance.texi \ DistributedObjects.texi \ ExceptionHandling.texi \ GNUstepMake.texi \ GSDoc.texi \ Introduction.texi \ ObjcAndJavaC++.texi \ ObjcLanguage.texi \ JavaAndGuile.texi \ WorkingWithObjects.texi \ WritingNewClasses.texi manual_DOC_INSTALL_DIR = Developer/Base/ProgrammingManual include $(GNUSTEP_MAKEFILES)/documentation.make gnustep-base-1.29.0/Documentation/manual/GNUstepMake.texi000066400000000000000000000143131435650067400233200ustar00rootroot00000000000000@node Make @appendix Using the GNUstep Make Package @cindex GNUstep Make package @cindex Make package, GNUstep Reference/doc on the GNUstep make package; mainly examples of various types of projects. @section Makefile Contents @paragraphindent 0 @b{Note. Type @code{man make} for assistance.} Make files comprise four key content types: @itemize @bullet @item @b{Comments} @code{#} prefixes comments. @item @b{Macros} @code{SRC=main.m} assigns a macro that is implemented as:@code{gcc $(SRC)} and is interpreted as: @code{gcc main.m} @item @b{Explicit rules} Explicit rules are used to indicate which files depend upon supporting files and the commands required for their compilation: @example targetfile : sourcefiles commands @end example A Tab precedes each command that must be implemented on the source files in order to create the target file: @example main: main.m List.h gcc -o main main.m List.h @end example @item @b{Implicit rules} Implicit rules broadly echo explicit variants but do not specify commands, rather the extensions indicate which commands are performed: @code{servertest.o: servertest.c io.h} @* is interpreted as: @* @code{$(CC) $(CFLAGS) -c servertest.c io.h} @end itemize @subsection Makefile Example @example # The following two lines force the standard make to recognize the # Objective-C .m suffix. .SUFFIXES: .o .m .m.o: $(CC) -c $(CFLAGS) $< # Macro declarations CC = gcc CFLAGS = -g LIBS = -lobjc SRC=main.m Truck.m Station.m Vehicle.m OBJ=main.o Truck.o Station.o Vehicle.o # Explicit rules hist: $(OBJ) $(CC) $(CFLAGS) -o main $(OBJ) $(LIBS) # Implicit rules Truck.o: Truck.h Truck.m Station.o: Truck.h Station.h Station.m Vehicle.o: Truck.h Vehicle.h Vehicle.m main.o: Station.h Vehicle.h @end example @subsection Makefile Structure The following Makefile defines a project: @example # # A GNUmakefile # # Check that the GNUSTEP_MAKEFILES environment variable is set ifeq ($(GNUSTEP_MAKEFILES),) GNUSTEP_MAKEFILES := $(shell gnustep-config --variable=GNUSTEP_MAKEFILES 2>/dev/null) ifeq ($(GNUSTEP_MAKEFILES),) $(error You need to set GNUSTEP_MAKEFILES before compiling!) endif endif # Include the common variables include $(GNUSTEP_MAKEFILES)/common.make # Build an Objective-C program OBJC_PROGRAM_NAME = simple # Objective-C files requiring compilation simple_OBJC_FILES = source.m -include GNUmakefile.preamble # Include in the rules for making Objective-C programs include $(GNUSTEP_MAKEFILES)/objc.make -include GNUmakefile.postamble @end example To compile a package that uses the Makefile Package, type @code{make} in the top-level directory of the package. A non-GNUstep Objective-C file may be compiled by adding @code{-lobjc on} at the command line. @subsection Debug and Profile Information By default the Makefile Package does not flag the compiler to generate debugging information that is generated by typing: @code{make debug=yes} This command also causes the Makefile Package to turn off optimization. It is therefore necessary to override the optimization flag when running Make if both debugging information and optimization is required. Use the variable OPTFLAG to override the optimization flag. By default the Makefile Package does not instruct the compiler to create profiling information that is generated by typing: @code{make profile=yes} @sp 1 @subsection Static, Shared and DLLs By default the Makefile Package generates a shared library if it is building a library project type, and it will link with shared libraries if it is building an application or command-line tool project type. To tell the Makefile Package not to build using shared libraries but using static libraries instead, type: @code{make shared=no} This default is only applicable on systems that support shared libraries; systems that do not support shared libraries will always build using static libraries. Some systems support DLLs that are a form of shared libraries; on these systems DLLs are built by default unless the Makefile Package is told to build using static libraries instead. @section Project Types Projects are divided into different types. To create a project of a specific type, a make file is specified: @code{include $(GNUSTEP_MAKEFILES)/application.make} Each project type is independent, and if you want to create two project types in the same directory (e.g. a tool and a Java program), include both the desired make files in your main Make file. @itemize @bullet @item Aggregate - aggregate.make An Aggregate project holds several sub-projects that are of any valid project type (including the Aggregate type). The only project variable is the SUBPROJECTS variable: @code{Aggregate project: SUBPROJECTS} SUBPROJECTS defines the directory names that hold the sub-projects that the Aggregate project should build. @item Graphical Applications - application.make An application is an Objective-C program that includes a GUI component, and by default links in all the GNUstep libraries required for GUI development, such as the Base and GUI libraries. @item Bundles - bundle.make A bundle is a collection of resources and code that can be used to enhance an existing application or tool dynamically using the NSBundle class from the GNUstep base library. @item Command Line C Tools - ctool.make A ctool is a project that uses only C language files. Otherwise it is similar to the ObjC project type. @item Documentation - documentation.make The Documentation project provides rules to use various types of documentation such as texi and LaTeX documentation, and convert them into finished documentation like info, PostScript, HTML, etc. @item Frameworks - framework.make A Framework is a collection of resources and a library that provides common code that can be linked into a Tool or Application. In many respects it is similar to a Bundle. @item Java - java.make This project provides rules for building java programs. It also makes it easy to make java projects that interact with the GNUstep libraries. @item Libraries - library.make The Makefile Package provides a project type for building libraries that may be static, shared, or dynamic link libraries (DLLs). The latter two variants are supported only on some platforms. @end itemize gnustep-base-1.29.0/Documentation/manual/GSDoc.texi000066400000000000000000000133571435650067400221430ustar00rootroot00000000000000@paragraphindent 0 @node GSDoc @appendix The GNUstep Documentation System @cindex gsdoc GNUstep includes its own documentation system for producing HTML, PDF, and other readable documents for developers and users. (It also includes facilities for ``Help'' accessed within applications, but these are not covered here.) It is based on @i{GSdoc}, an XML language designed specifically for writing documentation for the @uref{http://www.gnustep.org, GNUstep project}. In practice, that means that it is designed for writing about software, and in particular, for writing about Objective-C classes. It may be used to write narrative documentation by hand, and it can also be autogenerated by the @i{autogsdoc} tool, which parses Objective-C source files and documents classes, methods, functions, macros, and variables found therein, picking up on special comments when provided to enhance the documentation. You can read more about GSdoc itself in this @uref{../../Tools/Reference/gsdoc.html, document}. The @i{autogsdoc} tool is described @uref{../../Tools/Reference/autogsdoc.html, here}. (Both of these documents are part of the @uref{../../Tools/Reference/index.html, Base Tools} documentation.) @section Quick Start The basic approach to using GSdoc is this: when writing source code, put comments that begin with ``@code{/**}'' instead of the usual C ``@code{/*}'' in your @code{@@interface} or @code{@@implementation} file above class, variable, and method declarations. If you have any functions or macros you are making available put such comments in front of them too. The comments still end with the regular ``@code{*/}'', no ``@code{**/}'' is necessary. @example /** * The point class represents 2-d locations independently of any graphical * representation. */ @@interface Point : NSObject @{ // instance variables ... @} /** * New point at 0,0. */ + new; // ... /** * Return point's current X position. */ - (float) x; // ... @@end @end example When you are finished, invoke @i{autogsdoc} giving it the names of all your header files. (It will find the implementation files automatically, as long as they have the same names; alternatively, give it the names of the implementation files as well.) This will produce a set of HTML files describing your classes. If you include the '@code{-MakeFrames YES}' argument, the HTML will be structured into frames for easy navigation. (Autogsdoc, like all GNUstep command line tools, is found in the $@{GNUSTEP_SYSTEM_ROOT@}/Tools directory.) You can also generate documentation automatically using the GNUstep make utility. Consult its primary @uref{../../Make/Manual/make_toc.html, documentation} for details. The short story is: @example include $(GNUSTEP_MAKEFILES)/common.make DOCUMENT_NAME = MyProject MyProject_AGSDOC_FILES = MyProject_AGSDOC_FLAGS = include $(GNUSTEP_MAKEFILES)/documentation.make @end example Usually this is put into a separate makefile called ``@code{DocMakeFile}'' in the source directory. @section Cross-Referencing GSdoc provides the ability to reference entities both within the project and in external projects. When writing GSdoc comments in source code, references are particularly easy to create. To refer to an argument of the method or function you are documenting, just type it normally; it will be presented in a special type face in the final documentation to show it is an argument. To refer to another method within the same class you are documenting, just type its selector with the + or - sign in front. This will be converted into a hyperlink in output forms that support that. To refer to another class, you just type the class's name in [Brackets]. To refer to a method in another class, put the method selector after the name, as in [Class-methodWithArg1:andArg2:] (do not include a space). To refer to a protocol, use [(BracketsAndParentheses)] instead of just brackets. To refer to a category, use [Class(Category)]. For methods in these two cases, put the method name outside the parentheses. To refer to a function, simply type its name suffixed by parentheses(). @section Comment the Interface or the Implementation? Since @code{autogsdoc} picks up comments both from interface/header files and implementation/source files, you might be wondering where it is best to put them. There is no consensus on this issue. If you put them in the interface, then anyone you distribute your library to (with the headers but not the source) will be able to generate the documentation. The header file carries all of the specification for the class's behavior. On the other hand, if you put the comments in the implementation, then people editing the source code will have the method descriptions handy when they need them. If @i{autogsdoc} finds comments for the same entity in both interface and implementation, they are concatenated in the result. Nonetheless, the recommendation of this author is that you put the comments in the header, since this is more within the spirit of Objective-C, where the interface file declares the behavior of a class. @section Comparison with OS X Header Doc and Java JavaDoc The HTML output from all of these systems is roughly comparable. In terms of and comments needed in the source code to produce good class documentation, the GSdoc / autogsdoc system aims for maximal simplicity. In practice, requiring lots of special formatting makes developers less likely to document things, therefore, as described above, GSdoc does not require it, letting the parser do the work instead of the person. In terms of non-HTML output formats and control over the HTML format, these are not provided with GSdoc, yet, but there are plans to provide them through the use of XSLT as a presentation layer. @page gnustep-base-1.29.0/Documentation/manual/Introduction.texi000066400000000000000000000475621435650067400236720ustar00rootroot00000000000000@paragraphindent 0 @node Introduction @chapter Introduction The aim of this manual is to introduce you to the Objective-C language and the GNUstep development environment, in particular the Base library. The manual is organised to give you a tutorial introduction to the language and APIs, by using examples whenever possible, rather than providing a lengthy abstract description. While Objective-C is not a difficult language to learn or use, some of the terms may be unfamiliar, especially to those that have not programmed using an object-oriented programming language before. Whenever possible, concepts will be explained in simple terms rather than in more advanced programming terms, and comparisons to other languages will be used to aid in illustration. @section What is Object-Oriented Programming? @cindex object-oriented programming There are several object-oriented (OO) programming languages in common use today and you have probably heard of some of them: C++ and Java for example, and of course Objective-C. OO languages all have one thing in common: they allow you to design and write programs in a different way than if you used a traditional procedural language like C or Pascal. Procedural languages provide the programmer with basic building blocks that consist of data types, (integers, characters, float etc) and functions that act on that data. This forces the program designer to design the program using these same building blocks. Quite often this requires quite a leap in imagination between what the program must do and how it can be implemented. Object-oriented languages allow the program designer to think in terms of building blocks that are closer to what the program will actually do. Rather than think in terms of data and functions that act on that data, OO languages provide you with objects and the ability to send messages to those objects. Objects are, in a sense, like mini programs that can function on their own when requested by the program or even another object. For example, an object may exist that can draw a rectangle in a window; all you need to do as a programmer is send the appropriate messages to that object. The messages could tell the object the size of the rectangle and position in the window, and of course tell the object to draw itself. Program design and implementation is now reduced to sending messages to the appropriate objects rather than calling functions to manipulate data. @subsection Some Basic OO Terminology @cindex basic OO terminology OO languages add to the vocabulary of more traditional programming languages, and it may help if you become familiar with some of the basic terms before jumping in to the language itself. @b{Objects} As stated previously, an object is one of the basic building blocks in OO programming. An object can receive messages and then act on these messages to alter the state of itself (the size and position of a rectangle object for example). In software an object consists of instance variables (data) that represent the state of the object, and methods (like C functions) that act on these variables in response to messages. Rather than 'calling' one of its methods, an object is said to 'perform' one of its methods in response to a message. (A method is known as a 'member function' in C++.) @b{Classes} All objects of the same type are said to be members of the same class. To continue with the rectangle example, every rectangle could belong to a rectangle class, where the class defines the instance variables and the methods of all rectangles. A class definition by itself does not create an object but instead acts like a template for each object in that class. When an object is created an 'instance' of that class is said to exist. An instance of a class (an object) has the same data structure (instance variables) and methods as every other object in that class. @b{Inheritance} When you define a new class you can base it on an existing class. The new class would then 'inherit' the data structure and methods of the class that you based it on. You are then free to add instance variables and methods, or even modify inherited methods, to change the behavior of the new class (how it reacts to messages). The base class is known as the 'superclass' and the new class as the 'subclass' of this superclass. As an example, there could be a superclass called 'shapes' with a data structure and methods to size, position and draw itself, on which you could base the rectangle class. @b{Polymorphism} Unlike functions in a procedural program such as C, where every function must have a unique name, a method (or instance variable) in one class can have the same name as that in another class. This means that two objects could respond to the same message in completely different ways, since identically named methods may do completely different things. A draw message sent to a rectangle object would not produce the same shape as a draw message sent to a circle object. @b{Encapsulation} An object hides its instance variables and method implementations from other parts of the program. This encapsulation allows the programmer that uses an object to concentrate on what the object does rather than how it is implemented. Also, providing the interface to an object does not change (the methods of an object and how they respond to received messages) then the implementation of an object can be improved without affecting any programs that use it. @b{Dynamic Typing and Binding} Due to polymorhism, the method performed in response to a message depends on the class (type) of the receiving object. In an OO program the type, or class, of an object can be determined at run time (dynamic typing) rather than at compile time (static typing). The method performed (what happens as a result of this message) can then be determined during program execution and could, for example, be determined by user action or some other external event. Binding a message to a particular method at run time is known as dynamic binding. @section What is Objective-C? @cindex what is Objective-C? @cindex Objective-C, what is? Objective-C is a powerful object-oriented (OO) language that extends the procedural language ANSI C with the addition of a few keywords and compiler directives, plus one syntactical addition (for sending messages to objects). This simple extension of ANSI C is made possible by an Objective-C runtime library (libobjc) that is generally transparent to the Objective-C programmer. During compilation of Objective-C source code, OO extensions in the language compile to C function calls to the runtime library. It is the runtime library that makes dynamic typing and binding possible, and that makes Objective-C a true object-oriented language. Since Objective-C extends ANSI C with a few additional language constructs (the compiler directives and syntactical addition), you may freely include C code in your Objective-C programs. In fact an Objective-C program may look familiar to the C programmer since it is constructed using the traditional @code{main} function. @example #include #include int main (void) @{ /* Objective C and C code */ return(0); @} @end example Objective-C source files are compiled using the standard GNU @b{gcc} compiler. The compiler recognises Objective-C source files by the @code{.m} file extension, C files by the @code{.c} extension and header files by the @code{.h} extension. As an example, the command @b{$gcc -o testfile testfile.m -lobjc} would compile the Objective-C source file @code{testfile.m} to an executable named @code{testfile}. The @code{-lobjc} compiler option is required for linking an Objective-C program to the runtime library. (On GNU/Linux systems you may also need the @code{-lpthreads} option.) The GNUstep @b{make} utility provides an alternative (and simple) way to compile large projects, and this useful utility is discussed in the next section. Relative to other languages, Objective-C is more dynamic than C++ or Java in that it binds all method calls at runtime. Java gets around some of the limitations of static binding with explicit runtime ``reflection'' mechanisms. Objective-C has these too, but you do not need them as often as in Java, even though Objective-C is compiled while Java is interpreted. More information can be found in Appendix @ref{Objective-C Java and C++}. @section History @cindex history of Objective-C @cindex Objective-C, history @cindex history of NeXTstep @cindex NeXTstep, history @cindex history of OpenStep @cindex OpenStep, history Objective-C was specified and first implemented by Brad Cox and his company Stepstone Corporation during the early 1980's. They aimed to minimally incorporate the object-oriented features of Smalltalk-80 into C. Steve Jobs's NeXT licensed Objective-C from StepStone in 1988 to serve as the foundation of the new NeXTstep development and operating environment. NeXT implemented its own compiler by building on the @i{gcc} compiler, modifications that were later contributed back to gcc in 1991. No less than three runtime libraries were subsequently written to serve as the GNU runtime; the one currently in use was developed by Danish university student Kresten Krab Thorup. Smalltalk-80 also included a class library, and Stepstone's Objective-C implementation contained its own library based loosely on it. This in turn influenced the design of the NeXTstep class libraries, which are what GNUstep itself is ultimately based on. After NeXT exited the hardware business in the early 1990s, its Objective-C class library and development environment, @i{NeXTstep}, was renamed @i{OpenStep} and ported to run on several different platforms. Apple acquired NeXT in 1996, and after several years figuring out how to smooth the transition from their current OS, they released a modified, enhanced version of the NeXTstep operating system as Mac OS X, or ``10'' in 1999. The class libraries in OS X contain additions related to new multimedia capabilities and integration with Java, but their core is still essentially the OpenStep API. This API consists of two parts: the @i{Foundation}, a collection of non-graphical classes for data management, network and file interaction, date and time handling, and more, and the @i{AppKit}, a collection of user interface widgets and windowing machinery for developing full-fledged graphical applications. GNUstep provides implementations of both parts of this API, together with a graphical engine for rendering AppKit components on various platforms. @section What is GNUstep? @cindex what is GNUstep? @cindex GNUstep, what is? GNUstep is an object-oriented development environment that provides the Objective-C programmer with a range of utilities and libraries for building large, cross-platform, applications and tools. It is split into three components: @b{Base}, non-graphical classes corresponding to the NeXTstep @i{Foundation} API, @b{GUI}, consisting of graphical classes corresponding to the NeXTstep @i{AppKit} API, and @b{Back}, a modular framework for rendering instance of the GUI classes on multiple platforms. GNUstep is generally compatible with the OpenStep specification and with recent developments of the MacOS (Cocoa) API. Where MacOS deviates from the OpenStep API, GNUstep generally attempts to support both versions. See Appendix @ref{Compliance to Standards} for more detailed information. This manual does not discuss the full functionality of GNUstep but concentrates on using the GNUstep Base library to create non-graphical programs, and the GNUstep @b{make} utility to compile these programs. Further information about GNUstep can be found at @url{http://gnustep.org}. @subsection GNUstep Base Library @cindex GNUstep base library The GNUstep base library contains a powerful set of non-graphical Objective-C classes that can readily be used in your programs. At present there are approximately 70 different classes available, including classes to handle strings and arrays, dates and times, distributed objects, URLs and file systems (to name but a few). It is similar to but more stable than the non-graphical portion of the Java Development Kit (JDK) API (see Appendix @ref{Objective-C Java and C++} for more information). Classes in the base library are easily identified since they begin with the upper case characters 'NS', as in @code{NSString}. Some examples in this manual use classes from the base library, but for complete documentation on the base library see the @uref{../Reference/index.html, API documentation}. @subsection GNUstep Make Utility @cindex GNUstep make utility @cindex make utility, GNUstep The GNUstep @b{make} utility is the GNU version of the UNIX make utility, plus a number of predefined rules specialized for building GNUstep projects. So what does it do? It simplifies the process of building (compiling and linking) a large project. You simply type @b{make} at the command prompt and the make utility takes care of file dependencies, only re-compiling source files that have changed, or that depend on files that have changed, since the last 'make' (a header file for example). It also takes care of including the proper GNUstep header and library references automatically. Before using @b{make} you must first create a 'makefile' that lists all the files and file dependencies in your project. The easiest way to do this is to copy an existing makefile and change it to suit your own project. The make utility will be used to build the Objective-C examples shown in this manual, and when an example can be compiled then the makefile will also be shown. For a full description of the make utility see its @uref{../../Make/Manual/make_toc.html, documentation}. @subsection A Word on the Graphical Environment @cindex graphical programming @cindex AppKit @cindex GUI The GNUstep @b{GUI} component is discussed @uref{../../Gui/ProgrammingManual/manual_toc.html, elsewhere}, but a brief overview is useful here. GNUstep GUI provides a collection of classes for developing graphical applications, including windows, controls (also known as widgets, and back-end components for event handling and other functions. Internally, the implementation is divided into two components, the @i{back end} and the @i{front end}. The front end provides the API to the developer, and makes display postscript (DPS) calls to the back end to implement it. The back-end converts the DPS calls into calls to the underlying window system. If you install GNUstep from source, you must first compile and install the front end, then compile and install the back end. Implementations of the back-end have been produced for both X11 (Linux/UNIX systems), and Windows. There is also a quasi-native display postscript system similar to what was available on the NeXT but using Ghostscript to render to X11. This implementation is largely complete, but proved to be inefficient and difficult to optimize relative to the current back-end framework (which converts the DPS from the front end to window drawing commands immediately rather than relying on a postscript stack). @comment{Add brief blurbs on Gorm and Renaissance.} @subsection The GNUstep Directory Layout @cindex directory layout @cindex filesystem layout @cindex layout, filesystem The directories of a GNUstep installation are organized in a fashion that balances compatibility with NeXTstep/OpenStep/OS X with traditional Unix filesystem conventions. The highest level of organization consists of four @i{domains} - the System, Local, Network, and Users. @i{System} holds the main GNUstep installation, including the Base and GUI libraries and documentation. @i{Local} holds third party applications, custom extension libraries, etc., analogously to @code{/usr/local} on a Unix system. @i{Network} mounts shared files in a networked environment. @i{Users} usually exists as @code{$HOME/GNUstep} and holds preferences files and personal application data. There is further @uref{../../../User/GNUstep/filesystem_toc.html, documentation} available on the complete directory layout. Usually, on a Unix-type system, the GNUstep installation will be found under @code{/usr/lib/GNUstep}. @section Building Your First Objective-C Program @cindex your first Objective-C program The following example will show you how to create and compile an Objective-C program. The example simply displays a text message on the screen, and there are easier ways to to do this, but the example does demonstrate a number of object-oriented features of Objective-C, and also demonstrates the use of @b{make} to compile an Objective-C program. @enumerate @item Create a new project directory to hold your project.@*@* @item Create the following Objective-C source code using your favourite text editor and save it in the project directory with the filename @code{source.m}. @example #include /* * The next #include line is generally present in all Objective-C * source files that use GNUstep. The Foundation.h header file * includes all the other standard header files you need. */ #include /* * Declare the Test class that implements the class method (classStringValue). */ @@interface Test + (const char *) classStringValue; @@end /* * Define the Test class and the class method (classStringValue). */ @@implementation Test + (const char *) classStringValue; @{ return "This is the string value of the Test class"; @} @@end /* * The main() function: pass a message to the Test class * and print the returned string. */ int main(void) @{ printf("%s\n", [Test classStringValue]); return 0; @} @end example The text between comment markers (/* */) is ignored by the compiler but indicates to someone reading the source file what each part of the program does. The program is an example of a (class) method responding to a message. Can you see how it works?@*@* A message is sent to the @code{Test} class as an argument to @code{printf()}, requesting the string value of that class. The @code{Test} class performs its @code{classStringValue} method in response to this message and returns a string that is finally printed. No object is created in this program since a class method does not require an instance of a class in order to respond to a message.@*@* You will learn more about class methods in the next chapter.@*@* @item Now create the makefile, again using your favourite text editor, and save it in the same project directory with the filename @code{GNUmakefile}. @example include $(GNUSTEP_MAKEFILES)/common.make TOOL_NAME = LogTest LogTest_OBJC_FILES = source.m include $(GNUSTEP_MAKEFILES)/tool.make @end example If you look at the makefile above you will notice the two lines that tell the make utility to build a tool with the filename @code{LogTest} from the Objective-C source file @code{source.m}. You could copy and modify this makefile for later projects you may have: just change the tool name and list the new source files.@*@* The two 'include' lines are just a way of keeping your makefile simple, by including two 'ready-made' makefiles that someone else created.@*@* @item Before you can execute this makefile you must first set your GNUstep environment variables. Among other things this defines the @code{GNUSTEP_MAKEFILES} variable referenced above. The simplest way to do this is to execute one of the following commands (you must first locate your GNUstep installation manually): C shell:@* @code{source /System/Library/Makefiles/GNUstep.csh} Bourne shell:@* @code{. /System/Library/Makefiles/GNUstep.sh} On most Unix systems, GNUstep is installed in @code{/usr/lib/GNUstep}. (@uref{../../../User/GNUstep/filesystem_toc.html, Directory layout documentation}.) @item You can now compile the project using make. At the system command prompt, change to the project directory and enter the @b{make} command.@*@* @item Run the program (on Unix enter @b{./obj/LogTest} at the command prompt). The message "This is the string value of the Test class" will be displayed (assuming there were no errors). @end enumerate You have now compiled and run your first Objective-C program. Hungry for more? Then read on. gnustep-base-1.29.0/Documentation/manual/JavaAndGuile.texi000066400000000000000000000002011435650067400234560ustar00rootroot00000000000000@node Java and Guile @appendix Programming GNUstep in Java and Guile @cindex Java and Guile, programming GNUstep @i{TBD} @page gnustep-base-1.29.0/Documentation/manual/ObjcAndJavaC++.texi000066400000000000000000000161761435650067400235410ustar00rootroot00000000000000@node Objective-C Java and C++ @appendix Differences and Similarities Between Objective-C, Java, and C++ @cindex Objective-C and Java, differences and similarities @cindex differences and similarities, Objective-C and Java @cindex Objective-C and C++, differences and similarities @cindex differences and similarities, Objective-C and C++ @paragraphindent 0 This appendix explains the differences/similarities between Objective-C and Java. It does not cover the Java Interface to GNUstep (JIGS; see @ref{Java and Guile}), but is included to help people who want to learn Objective-C and know Java already. @section General @itemize @bullet @item C programmers may learn Objective-C in hours (though real expertise obviously takes much longer). @item Java has global market acceptance. @item Objective-C is a compiled OO programming language. @item Java is both compiled and interpreted and therefore does not offer the same run-time performance as Objective-C. @item Objective-C features efficient, transparent Distributed Objects. @item Java features a less efficient and less transparent Remote Machine Interface. @item Objective-C has basic CORBA compatibility through official C bindings, and full compatibility through unofficial Objective-C bindings. @item Java has CORBA compatibility through official Java bindings. @item Objective-C is portable across heterogeneous networks by virtue of a near omnipresent compiler (gcc). @item Java is portable across heterogeneous networks by using client-side JVMs that are software processors or runtime environments. @end itemize @section Language @itemize @bullet @item Objective-C is a superset of the C programming language, and may be used to develop non-OO and OO programs. Objective-C provides access to scalar types, structures and to unions, whereas Java only addresses a small number of scalar types and everything else is an object. Objective-C provides zero-cost access to existing software libraries written in C, Java requires interfaces to be written and incurs runtime overheads. @item Objective-C is dynamically typed but also provides static typing. Java is statically typed, but provides type-casting mechanisms to work around some of the limitations of static typing. @item Java tools support a convention of a universal and distributed name-space for classes, where classes may be downloaded from remote systems to clients. Objective-C has no such conventions or tool support in place. @item Using Java, class definitions may not be extended or divided through the addition of logical groupings. Objective-C provides categories as a solution to this problem. @item Objective-C provides delegation (the benefits of multiple inheritance without the drawbacks) at minimal programming cost. Java requires purpose written methods for any delegation implemented. @item Java provides garbage collection for memory management. Objective-C provides manual memory management, reference counting, and garbage collection as options. @item Java provides interfaces, Objective-C provides protocols. @end itemize @section Source Differences @itemize @bullet @item Objective-C is based on C, and the OO extensions are comparable with those of Smalltalk. The Java syntax is based on the C++ programming language. @item The object (and runtime) models are comparable, with Java's implementation having a subset of the functionality of that of Objective-C. @end itemize @section Compiler Differences @itemize @bullet @item Objective-C compilation is specific to the target system/environment, and because it is an authentic compiled language it runs at higher speeds than Java. @item Java is compiled into a byte stream or Java tokens that are interpreted by the target system, though fully compiled Java is possible. @end itemize @section Developer's Workbench @itemize @bullet @item Objective-C is supported by tools such as GNUstep that provides GUI development, compilation, testing features, debugging capabilities, project management and database access. It also has numerous tools for developing projects of different types including documentation. @item Java is supported by numerous integrated development environments (IDEs) that often have their origins in C++ tools. Java has a documentation tool that parses source code and creates documentation based on program comments. There are similar features for Objective-C. @item Java is more widely used. @item Objective-C may leverage investment already made in C based tools. @end itemize @section Longevity @itemize @bullet @item Objective-C has been used for over ten years, and is considered to be in a stable and proven state, with minor enhancements from time to time. @item Java is evolving constantly. @end itemize @section Databases @itemize @bullet @item Apple's EOF tools enable Objective-C developers to build object models from existing relational database tables. Changes in the database are automatically recognised, and there is no requirement for SQL development. @item Java uses JDBC that requires SQL development; database changes affect the Java code. This is considered inferior to EOF. Enterprise JavaBeans with container managed persistence provides a limited database capability, however this comes with much additional baggage. Other object-relational tools and APIs are being developed for Java (ca. 2004), but it is unclear which of these, if any, will become a standard. @end itemize @section Memory @itemize @bullet @item For object allocation Java has a fixed heap whose maximum size is set when the JVM starts and cannot be resized unless the JVM is restarted. This is considered to be a disadvantage in certain scenarios: for example, data read from databases may cause the JVM to run out of memory and to crash. @item Objective-C's heap is managed by the OS and the runtime system. This can typically grow to consume all system memory (unless per-process limits have been registered with the OS). @end itemize @section Class Libraries @itemize @bullet @item Objective-C: Consistent APIs are defined by the OpenStep specification. This is implemented by GNUstep and Mac OS X Cocoa. Third-party APIs are available (called Frameworks). @item Java: APIs are defined and implemented by the Sun Java Development Kit distributions. Other providers of Java implementations (IBM, BEA, etc.) implement these as well. @item The Java APIs are complex owing to the presence of multiple layers of evolution while maintaining backwards compatibility. Collections, IO, and Windowing are all examples of replicated functionality, in which the copies are incompletely separated, requiring knowledge of both to use. @item The OpenStep API is the result of continuing evolution but backward compatibility was maintained by the presence of separate library versions. Therefore the API is clean and nonredundant. Style is consistent. @item The OpenStep non-graphical API consists of about 70 classes and about 150 functions. @item The equivalent part of the Java non-graphical API consists of about 230 classes. @item The OpenStep graphical API consists of about 120 classes and 30 functions. @item The equivalent part of the Java graphical API consists of about 450 classes. @end itemize gnustep-base-1.29.0/Documentation/manual/ObjcLanguage.texi000066400000000000000000000716621435650067400235300ustar00rootroot00000000000000@paragraphindent 0 @node Objective-C @chapter The Objective-C Language In the previous chapter you were introduced to some basic object-oriented programming terms. This chapter will expand on these terms, and introduce you to some new ones, while concentrating on how they apply to the Objective-C language and the GNUstep base library. First let us look at some non OO additions that Objective-C makes to ANSI C. @section Non OO Additions Objective-C makes a few non OO additions to the syntax of the C programming language that include: @itemize @bullet @item A boolean data type (@code{BOOL}) capable of storing either of the values @code{YES} or @code{NO}.@* A @code{BOOL} is a scalar value and can be used like the familiar @code{int} and @code{char} data types.@* A @code{BOOL} value of @code{NO} is zero, while @code{YES} is non-zero. @item The use of a pair of slashes (@code{//}) to mark text up to the end of the line as a comment. @item The @code{#import} preprocessor directive was added; it directs the compiler to include a file only if it has not previously been included for the current compilation. This directive should only be used for Objective-C headers and not ordinary C headers, since the latter may actually rely on being included more than once in certain cases to support their functionality. @end itemize @section Objects @cindex objects @c objects Object-oriented (OO) programming is based on the notion that a software system can be composed of objects that interact with each other in a manner that parallels the interaction of objects in the physical world. This model makes it easier for the programmer to understand how software works since it makes programming more intuitive. The use of objects also makes it easier during program design: take a big problem and consider it in small pieces, the individual objects, and how they relate to each other. Objects are like mini programs that can function on their own when requested by the program or even another object. An object can receive messages and then act on these messages to alter the state of itself (the size and position of a rectangle object in a drawing program for example). In software an object consists of instance variables (data) that represent the state of the object, and methods (like C functions) that act on these variables in response to messages. As a programmer creating an application or tool, all you need do is send messages to the appropriate objects rather than call functions that manipulate data as you would with a procedural program. The syntax for sending a message to an object, as shown below, is one of the additions that Objective-C adds to ANSI C. @example [objectName message]; @end example Note the use of the square [ ] brackets surrounding the name of the object and message. Rather than 'calling' one of its methods, an object is said to 'perform' one of its methods in response to a message. The format that a message can take is discussed later in this section. @subsection Id and nil Objective-C defines a new type to identify an object: @code{id}, a type that points to an object's data (its instance variables). The following code declares the variable '@code{button}' as an object (as opposed to '@code{button}' being declared an integer, character or some other data type). @example id button; @end example When the button object is eventually created the variable name '@code{button}' will point to the object's data, but before it is created the variable could be assigned a special value to indicate to other code that the object does not yet exist. Objective-C defines a new keyword @code{nil} for this assignment, where @code{nil} is of type @code{id} with an unassigned value. In the button example, the assignment could look like this: @example id button = nil; @end example which assigns @code{nil} in the declaration of the variable. You can then test the value of an object to determine whether the object exists, perhaps before sending the object a message. If the test fails, then the object does not exist and your code can execute an alternative statement. @example if (anObject != nil) ... /* send message */ else ... /* do something else */ @end example The header file @code{objc/objc.h} defines @code{id}, @code{nil}, and other basic types of the Objective-C language. It is automatically included in your source code when you use the compiler directive @code{#include } to include the GNUstep Base class definitions. @subsection Messages @cindex messages A message in Objective-C is the mechanism by which you pass instructions to objects. You may tell the object to do something for you, tell it to change its internal state, or ask it for information. A message usually invokes a method, causing the receiving object to respond in some way. Objects and data are manipulated by sending messages to them. Like C-functions they have return types, but function specific to the object. Objects respond to messages that make specific requests. Message expressions are enclosed in square brackets and include the receiver or object name and the message or method name along with any arguments. To send a message to an object, use the syntax: @code{[receiver messagename];} where @code{receiver} is the object. @sp 1 The run-time system invokes object methods that are specified by messages. For example, to invoke the display method of the mySquare object the following message is used: @code{[mySquare display];} @sp 1 Messages may include arguments that are prefixed by colons, in which case the colons are part of the message name, so the following message is used to invoke the @code{setFrameOrigin::} method: @code{[button setFrameOrigin: 10.0 : 10.0];} @sp 1 Labels describing arguments precede colons: @code{[button setWidth: 20.0 height: 122.0];} invokes the method named @code{setWidth:height:} @sp 1 Messages that take a variable number of arguments are of the form: @code{[receiver makeList: list, argOne, argTwo, argThree];} @sp 1 A message to @code{nil} does NOT crash the application (while in Java messages to @code{null} raise exceptions); the Objective-C application does nothing. For example: @code{[nil display];} will do nothing. If a message to @code{nil} is supposed to return an object, it will return @code{nil}. But if the method is supposed to return a primitive type such as an @code{int}, then the return value of that method when invoked on @code{nil}, is undefined. The programmer therefore needs to avoid using the return value in this instance. @subsection Polymorphism @cindex polymorphism Polymorphism refers to the fact that two different objects may respond differently to the same message. For example when client objects receive an alike message from a server object, they may respond differently. Using Dynamic Binding, the run-time system determines which code to execute according to the object type. @section Classes @cindex classes A @b{class} in Objective-C is a @i{type of object}, much like a structure definition in C except that in addition to variables, a class has code -- method implementations -- associated with it. When you create an @i{instance} of a class, also known as an @i{object}, memory for each of its variables is allocated, including a pointer to the class definition itself, which tells the Objective-C runtime where to find the method code, among other things. Whenever an object is sent a message, the runtime finds this code and executes it, using the variable values that are set for this object. @subsection Inheritance @cindex inheritance Most of the programmer's time is spent defining classes. Inheritance helps reduce coding time by providing a convenient way of reusing code. For example, the @code{NSButton} class defines data (or instance variables) and methods to create button objects of a certain type, so a subclass of @code{NSButton} could be produced to create buttons of another type - which may perhaps have a different border colour. Equally @code{NSTextField} can be used to define a subclass that perhaps draws a different border, by reusing definitions and data in the superclass. Inheritance places all classes in a logical hierarchy or tree structure that may have the @code{NSObject} class at its root. (The root object may be changed by the developer; in GNUstep it is @code{NSObject}, but in ``plain'' Objective-C it is a class called ``@code{Object}'' supplied with the runtime.) All classes may have subclasses, and all except the root class do have superclasses. When a class object creates a new instance, the new object holds the data for its class, superclass, and superclasses extending to the root class (typically @code{NSObject}). Additional data may be added to classes so as to provide specific functions and application logic. When a new object is created, it is allocated memory space and its data in the form of its instance variables are initialised. Every object has at least one instance variable (inherited from @code{NSObject}) called @code{isa}, which is initialized to refer to the object's class. Through this reference, access is also afforded to classes in the object's inheritance path. In terms of source code, an Objective-C class definition has an: @itemize @bullet @item @i{interface} declaring instance variables, methods and the superclass name; and an @item @i{implementation} that defines the class in terms of operational code that implements the methods. @end itemize Typically these entities are confined to separate files with @code{.h} and @code{.m} extensions for Interface and Implementation files, respectively. However they may be merged into one file, and a single file may implement multiple classes. @subsection Inheritance of Methods @cindex inheriting methods Each new class inherits methods and instance variables from another class. This results in a class hierarchy with the root class at the core, and every class (except the root) has a superclass as its parent, and all classes may have numerous subclasses as their children. Each class therefore is a refinement of its superclass(es). @subsection Overriding Methods @cindex overriding methods Objects may access methods defined for their class, superclass, superclass' superclass, extending to the root class. Classes may be defined with methods that overwrite their namesakes in ancestor classes. These new methods are then inherited by subclasses, but other methods in the new class can locate the overridden methods. Additionally redefined methods may include overridden methods. @subsection Abstract Classes @cindex abstract class @cindex class, abstract Abstract classes or abstract superclasses such as @code{NSObject} define methods and instance variables used by multiple subclasses. Their purpose is to reduce the development effort required to create subclasses and application structures. When we get technical, we make a distinction between a pure abstract class whose methods are defined but instance variables are not, and a semi-abstract class where instance variables are defined). An abstract class is not expected to actually produce functional instances since crucial parts of the code are expected to be provided by subclasses. In practice, abstract classes may either stub out key methods with no-op implementations, or leave them unimplemented entirely. In the latter case, the compiler will produce a warning (but not an error). Abstract classes reduce the development effort required to create subclasses and application structures. @subsection Class Clusters @cindex class cluster @cindex cluster, classes A class cluster is an abstract base class, and a group of private, concrete subclasses. It is used to hide implementation details from the programmer (who is only allowed to use the interface provided by the abstract class), so that the actual design can be modified (probably optimised) at a later date, without breaking any code that uses the cluster. Consider a scenario where it is necessary to create a class hierarchy to define objects holding different types including @b{chars}, @b{ints}, @b{shorts}, @b{longs}, @b{floats} and @b{doubles}. Of course, different types could be defined in the same class since it is possible to @b{cast} or @b{change} them from one to the next. Their allocated storage differs, however, so it would be inefficient to bundle them in the same class and to convert them in this way. The solution to this problem is to use a class cluster: define an abstract superclass that specifies and declares components for subclasses, but does not declare instance variables. Rather this declaration is left to its subclasses, which share the @b{programmatic interface} that is declared by the abstract superclass. When you create an object using a cluster interface, you are given an object of another class - from a concrete class in the cluster. @section NSObject: The Root Class @cindex NSObject @cindex root class @cindex class, root In GNUstep, @code{NSObject} is a root class that provides a base implementation for all objects, their interactions, and their integration in the run-time system. @code{NSObject} defines the @code{isa} instance variable that connects every object with its class. In other Objective-C environments besides GNUstep, @code{NSObject} will be replaced by a different class. In many cases this will be a default class provided with the Objective-C runtime. In the GNU runtime for example, the base class is called @code{Object}. Usually base classes define a similar set of methods to what is described here for @code{NSObject}, however there are variations. The most basic functions associated with the @code{NSObject} class (and inherited by all subclasses) are the following: @itemize @bullet @item allocate instances @item connect instances to their classes @end itemize In addition, @code{NSObject} supports the following functionality: @itemize @bullet @item initialize instances @item deallocate instances @item compare self with another object @item archive self @item perform methods selected at run-time @item provide reflective information at runtime to queries about declared methods @item provide reflective information at runtime to queries about position in the inheritance hierarchy @item forward messages to other objects. @end itemize @subsection The NSObject Protocol In fact, the @code{NSObject} class is a bit more complicated than just described. In reality, its method declarations are split into two components: essential and ancillary. The essential methods are those that are needed by @i{any} root class in the GNUstep/Objective-C environment. They are declared in an ``@code{NSObject} protocol'' which should be implemented by any other root class you define (see @ref{Classes, ,Protocols}). The ancillary methods are those specific to the @code{NSObject} class itself but need not be implemented by any other root class. It is not important to know which methods are of which type unless you actually intend to write an alternative root class, something that is rarely done. @section Static Typing @cindex static typing Recall that the @code{id} type may be used to refer to any class of object. While this provides for great runtime flexibility (so that, for example, a generic @code{List} class may contain objcts of any instance), it prevents the compiler from checking whether objects implement the messages you send them. To allow type checking to take place, Objective-C therefore also allows you to use class names as variable types in code. In the following example, type checking verifies that the @code{myString} object is an appropriate type. @example // compiler verifies, if anObject's type is known, that it is an NSString: NSString *myString = anObject; // now, compiler verifies that NSString declares an int 'length' method: int len = [myString length]; @end example Note that objects are declared as pointers, unlike when @code{id} is used. This is because the pointer operator is implicit for @code{id}. Also, when the compiler performs type checking, a subclass is always permissible where any ancestor class is expected, but not vice-versa. @subsection Type Introspection Static typing is not always appropriate. For example, you may wish to store objects of multiple types within a list or other container structure. In these situations, you can still perform type-checking manually if you need to send an untyped object a particular message. The @code{isMemberOfClass:} method defined in the @code{NSObject} class verifies that the receiver is of a specific class: @example if ([namedObject isMemberOfClass: specificClass] == YES) @{ // code here @} @end example The test will return false if the object is a member of a subclass of the specific class given - an exact match is required. If you are merely interested in whether a given object @i{descends} from a particular class, the @code{isKindOfClass:} method can be used instead: @example if ([namedObject isKindOfClass: specificClass] == YES) @{ // code here @} @end example There are other ways of determining whether an object responds to a particular method, as will be discussed in @ref{Advanced Messaging}. @subsection Referring to Instance Variables @cindex instance variables, referring to As you will see later, classes may define some or all of their instance variables to be @i{public} if they wish. This means that any other object or code block can access them using the standard ``@code{->}'' structure access operator from C. For this to work, the object must be statically typed (not referred to by an @code{id} variable). @example Bar *bar = [foo getBar]; int c = bar->value * 2; // 'value' is an instance variable @end example In general, direct instance variable access from outside of a class is not recommended programming practice, aside from in exceptional cases where performance is at a premium. Instead, you should define special methods called @i{accessors} that provide the ability to retrieve or set instance variables if necessary: @example - (int) value @{ return value; @} - (void) setValue: (int) newValue @{ value = newValue; @} @end example While it is not shown here, accessors may perform arbitrary operations before returning or setting internal variable values, and there need not even be a direct correspondence between the two. Using accessor methods consistently allows this to take place when necessary for implementation reasons without external code being aware of it. This property of @i{encapsulation} makes large code bases easier to maintain. @section Working with Class Objects Classes themselves are maintained internally as objects in their own right in Objective-C, however they do not possess the instance variables defined by the classes they represent, and they cannot be created or destroyed by user code. They do respond to class methods, as in the following: @example id result = [SomeClassName doSomething]; @end example Classes respond to the class methods their class defines, as well as those defined by their superclasses. However, it is not allowed to override an inherited class method. You may obtain the class object corresponding to an instance object at runtime by a method call; the class object is an instance of the ``@code{Class}'' class. @example // all of these assign the same value id stringClass1 = [stringObject class]; Class stringClass2 = [stringObject class]; id stringClass3 = [NSString class]; @end example Classes may also define a version number (by overriding that defined in @code{NSObject}): @code{int versionNumber = [NSString version];} This facility allows developers to access the benefits of versioning for classes if they so choose. @subsection Locating Classes Dynamically Class names are about the only names with global visibility in Objective-C. If a class name is unknown at compilation but is available as a string at run time, the GNUstep library @code{NSClassFromString} function may be used to return the class object: @example if ([anObject isKindOf: NSClassFromString("SomeClassName")] == YES) @{ // do something ... @} @end example The function returns @code{Nil} if it is passed a string holding an invalid class name. Class names, global variables and functions (but not methods) exist in the same name space, so no two of these entities may share the same name. @section Naming Constraints and Conventions @cindex naming constraints @cindex naming conventions The following lists the full uniqueness constraints on names in Objective-C. @itemize @bullet @item Neither gGlobal variables nor function names may share the same name as classes, because all three entities are allocated the same (global) name space. @item A class may define methods using the same names as those held in other classes. (See @ref{Objective-C, ,Overriding Methods} above.) @item A class may define instance variables using the same names as those held in other classes. @item A class category may have the same name as another class category. @item An instance method and a class method may share the same name. @item A protocol may have the same name as a class, category, or any other entity. @item A method and an instance variable may share the same name. @end itemize There are also a number of conventions used in practice. These help to make code more readable and also help avoid naming conflicts. Conventions are particularly important since Objective-C does not have any namespace partitioning facilities like Java or other languages. @itemize @bullet @item Class, category and protocol names begin with an uppercase letter. @item Methods, instance variables, and variables holding instances begin with a lowercase letter. @item Second and subsequent words in a name should begin with a capital letter, as in ``ThisIsALongName'', not ``Thisisalongname''. As can be seen, this makes long names more readable. @item Classes intended to be used as libraries (Frameworks, in NeXTstep parlance) should utilize a unique two or three letter prefix. For example, the Foundation classes all begin with 'NS', as in ``NSArray, and classes in the OmniFoundation from Omni Group (a popular library for OpenStep) began with ``OF''. @item Classes and methods intended to be used only be the developers maintaining them should be prefixed by an underscore, as in ``_SomePrivateClass'' or ``_somePrivateMethod''. Capitalization rules should still be followed. @item Functions intended for global use should beging with a capital letter, and use prefixing conventions as for classes. @end itemize @ignore @subsection Pitfalls of Using Class Names (To be completed.) @end ignore @section Strings in GNUstep Strings in GNUstep can be handled in one of two ways. The first way is the C approach of using an array of @code{char}. In this case you may use the ``@code{STR}'' type defined in Objective-C in place of @code{char[]}. The second approach is to rely on the @code{NSString} class and associated subclasses in the GNUstep Base library, and compiler support for them. Using this approach allows use of the methods in the @uref{../Reference/NSString.html, NSString API}. In addition, the @code{NSString} class provides the means to initialize strings using printf-like formats. The @code{NSString} class defines objects holding raw @b{Unicode} character streams or @b{strings}. Unicode is a 16-bit worldwide standard used to define character sets for all spoken languages. In GNUstep parlance the Unicode character is of type @b{unichar}. @subsection Creating NSString Static Instances A @b{static} instance is allocated at compile time. The creation of a static instance of @code{NSString} is achieved using the @code{@@"..."} construct and a pointer: @example NSString *w = @@"Brainstorm"; @end example Here, @code{w} is a variable that refers to an @code{NSString} object representing the ASCII string "Brainstorm". @subsection NSString +stringWithFormat: The class method @code{stringWithFormat:} may also be used to create instances of @code{NSString}, and broadly echoes the @code{printf()} function in the C programming language. @code{stringWithFormat:} accepts a list of arguments whose processed result is placed in an @code{NSString} that becomes a return value as illustrated below: @example int qos = 5; NSString *gprsChannel; gprschannel = [NSString stringWithFormat: @@"The GPRS channel is %d", qos]; @end example The example will produce an @code{NSString} called @code{gprsChannel} holding the string "The GPRS channel is 5". @code{stringWithFormat:} recognises the @code{%@@} conversion specification that is used to specify an additional @code{NSString}: @example NSString *one; NSString *two; one = @@"Brainstorm"; two = [NSString stringWithFormat: @@"Our trading name is %@@", one]; @end example The example assigns the variable @code{two} the string "Our trading name is Brainstorm." The @code{%@@} specification can be used to output an object's description - as returned by the @code{NSObject} @code{-description} method), which is useful when debugging, as in: @example NSObject *obj = [anObject aMethod]; NSLog (@@"The method returned: %@@", obj); @end example @subsection C String Conversion When a program needs to call a C library function it is useful to convert between @code{NSString}s and standard ASCII C strings (not fixed at compile time). To create an @code{NSString} using the contents of the returned C string (from the above example), use the @code{NSString} class method @code{stringWithCString:}: @example char *function (void); char *result; NSString *string; result = function (); string = [NSString stringWithCString: result]; @end example To convert an @code{NSString} to a standard C ASCII string, use the @code{cString} method of the @code{NSString} class: @example char *result; NSString *string; string = @@"Hi!"; result = [string cString]; @end example @subsection NSMutableString @code{NSString}s are immutable objects; meaning that once they are created, they cannot be modified. This results in optimised @code{NSString} code. To modify a string, use the subclass of @code{NSString}, called @code{NSMutableString}. Use a @code{NSMutableString} wherever a @code{NSString} could be used. An @code{NSMutableString} responds to methods that modify the string directly - which is not possible with a generic @code{NSString}. To create a @code{NSMutableString}use @code{stringWithFormat:}: @example NSString *name = @@"Brainstorm"; NSMutableString *str; str = [NSMutableString stringWithFormat: @@"Hi!, %@@", name]; @end example While @code{NSString}'s implementation of @code{stringWithFormat:} returns a @code{NSString}, @code{NSMutableString}'s implementation returns an @code{NSMutableString}. @b{Note. Static strings created with the @code{@@"..."} construct are always immutable.} @code{NSMutableString}s are rarely used because to modify a string, you normally create a new string derived from an existing one. A useful method of the @code{NSMutableString} class is @code{appendString:}, which takes an @code{NSString} argument, and appends it to the receiver: @example NSString *name = @@"Brainstorm"; NSString *greeting = @@"Hello"; NSMutableString *s; s = AUTORELEASE ([NSMutableString new]); [s appendString: greeting]; [s appendString: @@", "]; [s appendString: name]; @end example This code produces the same result as: @example NSString *name = @@"Brainstorm"; NSString *greeting = @@"Hello"; NSMutableString *s; s = [NSMutableString stringWithFormat: @@"%@@, %@@", greeting, name]; @end example @subsection Loading and Saving Strings The the GNUstep Base library has numerous string manipulation features, and among the most notable are those relating to writing/reading strings to/from files. To write the contents of a string to a file, use the @code{writeToFile:atomically:} method: @example #include int main (void) @{ CREATE_AUTORELEASE_POOL(pool); NSString *name = @@"This string was created by GNUstep"; if ([name writeToFile: @@"/home/nico/testing" atomically: YES]) @{ NSLog (@@"Success"); @} else @{ NSLog (@@"Failure"); @} RELEASE(pool); return 0; @} @end example @code{writeToFile:atomically:} returns YES for success, and NO for failure. If the atomically flag is YES, then the library first writes the string into a file with a temporary name, and, when the writing has been successfully done, renames the file to the specified filename. This prevents erasing the previous version of filename unless writing has been successful. This is a useful feature, which should be enabled. To read the contents of a file into a string, use @code{stringWithContentsOfFile:}, as shown in the following example that reads @code{@@"/home/Brainstorm/test"}: @example #include int main (void) @{ CREATE_AUTORELEASE_POOL(pool); NSString *string; NSString *filename = @@"/home/nico/test"; string = [NSString stringWithContentsOfFile: filename]; if (string == nil) @{ NSLog (@@"Problem reading file %@@", filename); /* * * */ @} /* * */ RELEASE(pool); return 0; @} @end example @page gnustep-base-1.29.0/Documentation/manual/WorkingWithObjects.texi000066400000000000000000000522461435650067400247720ustar00rootroot00000000000000@paragraphindent 0 @node Objects @chapter Working with Objects @cindex working with objects @cindex objects, working with Objective-C and GNUstep provide a rich object allocation and memory management framework. Objective-C affords independent memory allocation and initialization steps for objects, and GNUstep supports three alternative schemes for memory management. @section Initializing and Allocating Objects @cindex objects, initalizing and allocating @cindex allocating objects Unlike most object-oriented languages, Objective-C exposes memory allocation for objects and initialization as two separate steps. In particular, every class provides an '@code{+alloc}' method for creating blank new instances. However, initialization is carried out by an instance method, not a class method. By convention, the default initialization method is '@code{-init}'. The general procedure for obtaining a newly initialized object is thus: @example id newObj = [[SomeClass alloc] init]; @end example Here, the call to @code{alloc} returns an uninitialized instance, on which @code{init} is then invoked. (Actually, @code{alloc} @i{does} set all instance variable memory to 0, and it initializes the special @code{isa} variable mentioned earlier which points to the object's class, allowing it to respond to messages.) The @code{alloc} and @code{init} calls may be collapsed for convenience into a single call: @example id newObj = [SomeClass new]; @end example The default implementation of @code{new} simply calls @code{alloc} and @code{init} as above, however other actions are possible. For example, @code{new} could be overridden to reuse an existing object and just call @code{init} on it (skipping the @code{alloc} step). (Technically this kind of instantiation management can be done inside @code{init} as well -- it can deallocate the receiving object and return another one in its place. However this practice is not recommended; the @code{new} method should be used for this instead since it avoids unnecessary memory allocation for instances that are not used.) @subsection Initialization with Arguments In many cases you want to initialize an object with some specific information. For example a @code{Point} object might need to be given an @i{x, y} position. In this case the class may define additional initializers, such as: @example id pt = [[Point alloc] initWithX: 1.5 Y: 2.0]; @end example Again, a @code{new} method may be defined, though sometimes the word ``new'' is not used in the name: @example id pt = [Point newWithX: 1.5 Y: 2.0]; // alternative id pt = [Point pointAtX: 1.5 Y: 2.0]; @end example In general the convention in Objective-C is to name initializers in a way that is intuitive for their classes. Initialization is covered in more detail in @ref{Classes, ,Instance Initialization}. Finally, it is acceptable for an @code{init...} method to return @code{nil} at times when insufficient memory is available or it is passed an invalid argument; for example the argument to the @code{NSString} method @code{initWithContentsOfFile:} may be an erroneous file name. @subsection Memory Allocation and Zones @cindex Zones Memory allocation for objects in GNUstep supports the ability to specify that memory is to be taken from a particular region of addressable memory. In the days that computer RAM was relatively limited, it was important to be able to ensure that parts of a large application that needed to interact with one another could be held in working memory at the same time, rather than swapping back and forth from disk. This could be done by specifying that particular objects were to be allocated from a particular region of memory, rather than scattered across all of memory at the whim of the operating system. The OS would then keep these objects in memory at one time, and swap them out at the same time, perhaps to make way for a separate portion of the application that operated mostly independently. (Think of a word processor that keeps structures for postscript generation for printing separate from those for managing widgets in the onscreen editor.) With the growth of computer RAM and the increasing sophistication of memory management by operating systems, it is not as important these days to control the regions where memory is allocated from, however it may be of use in certain situations. For example, you may wish to save time by allocating memory in large chunks, then cutting off pieces yourself for object allocation. If you know you are going to be allocating large numbers of objects of a certain size, it may pay to create a zone that allocates memory in multiples of this size. The GNUstep/Objective-C mechanisms supporting memory allocation are therefore described here. The fundamental structure describing a region of memory in GNUstep is called a @i{Zone}, and it is represented by the @code{NSZone} struct. All @code{NSObject} methods dealing with the allocation of memory optionally take an @code{NSZone} argument specifying the Zone to get the memory from. For example, in addition to the fundamental @code{alloc} method described above, there is the @code{allocWithZone:} method: @example + (id) alloc; + (id) allocWithZone: (NSZone*)zone; @end example Both methods will allocate memory to hold an object, however the first one automatically takes the memory from a default Zone (which is returned by the @code{NSDefaultMallocZone()} function). When it is necessary to group objects in the same area of memory, or allocate in chunks - perhaps for performance reasons, you may create a Zone from where you would allocate those objects by using the @code{NSCreateZone} function. This will minimise the paging required by your application when accessing those objects frequently. In all normal yuse however, you should confine yourself to the default zone. Low level memory allocation is performed by the @code{NSAllocateObject()} function. This is rarely used but available when you require more advanced control or performance. This function is called by @code{[NSObject +allocWithZone:]}. However, if you call @code{NSAllocateObject()} directly to create an instance of a class you did not write, you may break some functionality of that class, such as caching of frequently used objects. Other @code{NSObject} methods besides @code{alloc} that may optionally take Zones include @code{-copy} and @code{-mutableCopy}. For 95% of cases you will probably not need to worry about Zones at all; unless performance is critical, you can just use the methods without zone arguments, that take the default zone. @subsection Memory Deallocation @cindex memory deallocation Objects should be deallocated from memory when they are no longer needed. While there are several alternative schemes for managing this process (see next section), they all eventually resort to calling the @code{NSObject} method @code{-dealloc}, which is more or less the opposite of @code{-alloc}. It returns the memory occupied by the object to the Zone from which it was originally allocated. The @code{NSObject} implementation of the method deallocates only instance variables. Additional allocated, unshared memory used by the object must be deallocated separately. Other entities that depend solely on the deallocated receiver, including complete objects, must also be deallocated separately. Usually this is done by subclasses overriding @code{-dealloc} (see @ref{Classes, ,Instance Deallocation}). As with @code{alloc}, the underlying implementation utilizes a function (@code{NSDeallocateObject()}) that can be used by your code if you know what you are doing. @section Memory Management @cindex memory management In an object-oriented environment, ensuring that all memory is freed when it is no longer needed can be a challenge. To assist in this regard, there are three alternative forms of memory management available in Objective-C: @itemize @minus @item Explicit@* You allocate objects using @code{alloc}, @code{copy} etc, and deallocate them when you have finished with them (using @code{dealloc}). This gives you complete control over memory management, and is highly efficient, but error prone. @item Retain count@* You use the OpenStep retain/release mechanism, along with autorelease pools which provide a degree of automated memory management. This gives a good degree of control over memory management, but requires some care in following simple rules. It's pretty efficient. @end itemize The recommended approach is to use some standard macros defined in @code{NSObject.h} which encapsulate the retain/release/autorelease mechanism, but which permit efficient use of Automated reference Counts (ARC) if you build your software with that. We will justify this recommendation after describing the three alternatives in greater detail. @subsection Explicit Memory Management @cindex memory management, explicit This is the standard route to memory management taken in C and C++ programs. As in standard C when using @code{malloc}, or in C++ when using @code{new} and @code{delete}, you need to keep track of every object created through an @code{alloc} call and destroy it by use of @code{dealloc} when it is no longer needed. You must make sure to no longer reference deallocated objects; although messaging them will not cause a segmentation fault as in C/C++, it will still lead to your program behaving in unintended ways. This approach is generally @i{not} recommended since the Retain/Release style of memory management is significantly less leak-prone while still being quite efficient. @subsection OpenStep-Style (Retain/Release) Memory Management @cindex memory management, OpenStep-style @cindex memory management, retain count The standard OpenStep system of memory management employs retain counts. When an object is created, it has a retain count of 1. When an object is retained, the retain count is incremented. When it is released the retain count is decremented, and when the retain count goes to zero the object gets deallocated. @example Coin *c = [[Coin alloc] initWithValue: 10]; // Put coin in pouch, [c retain]; // Calls 'retain' method (retain count now 2) // Remove coin from pouch [c release]; // Calls 'release' method (retain count now 1) // Drop in bottomless well [c release]; // Calls 'release' ... (retain count 0) then 'dealloc' @end example One way of thinking about the initial retain count of 1 on the object is that a call to @code{alloc} (or @code{copy}) implicitly calls @code{retain} as well. There are a couple of default conventions about how @code{retain} and @code{release} are to be used in practice. @itemize @item @i{If a block of code causes an object to be allocated, it ``owns'' this object and is responsible for releasing it. If a block of code merely receives a created object from elsewhere, it is @b{not} responsible for releasing it.} @item @i{More generally, the total number of @code{retain}s in a block should be matched by an equal number of @code{release}s.} @end itemize Thus, a typical usage pattern is: @example NSString *msg = [[NSString alloc] initWithString: @@"Test message."]; NSLog(msg); // we created msg with alloc -- release it [msg release]; @end example Retain and release must also be used for instance variables that are objects: @example - (void)setFoo:(FooClass *newFoo) @{ // first, assert reference to newFoo [newFoo retain]; // now release reference to foo (do second since maybe newFoo == foo) [foo release]; // finally make the new assignment; old foo was released and may // be destroyed if retain count has reached 0 foo = newFoo; @} @end example Because of this retain/release management, it is safest to use accessor methods to set variables even within a class: @example - (void)resetFoo @{ FooClass *foo = [[FooClass alloc] init]; [self setFoo: foo]; // since -setFoo just retained, we can and should // undo the retain done by alloc [foo release]; @} @end example @b{Exceptions} In practice, the extra method call overhead should be avoided in performance critical areas and the instance variable should be set directly. However in all other cases it has proven less error-prone in practice to consistently use the accessor. There are certain situations in which the rule of having retains and releases be equal in a block should be violated. For example, the standard implementation of a container class @code{retain}s each object that is added to it, and @code{release}s it when it is removed, in a separate method. In general you need to be careful in these cases that retains and releases match. @subsubsection Autorelease Pools One important case where the retain/release system has difficulties is when an object needs to be transferred or handed off to another. You don't want to retain the transferred object in the transferring code, but neither do you want the object to be destroyed before the handoff can take place. The OpenStep/GNUstep solution to this is the @i{autorelease pool}. An autorelease pool is a special mechanism that will retain objects it is given for a limited time -- always enough for a transfer to take place. This mechanism is accessed by calling @code{autorelease} on an object instead of @code{release}. @code{Autorelease} first adds the object to the active autorelease pool, which retains it, then sends a @code{release} to the object. At some point later on, the pool will send the object a second @code{release} message, but by this time the object will presumably either have been retained by some other code, or is no longer needed and can thus be deallocated. For example: @example - (NSString *) getStatus @{ NSString *status = [[NSString alloc] initWithFormat: "Count is %d", [self getCount]]; // set to be released sometime in the future [status autorelease]; return status; @} @end example Any block of code that calls @code{-getStatus} can also forego retaining the return value if it just needs to use it locally. If the return value is to be stored and used later on however, it should be retained: @example ... NSString *status = [foo getStatus]; // 'status' is still being retained by the autorelease pool NSLog(status); return; // status will be released automatically later @end example @example ... currentStatus = [foo getStatus]; // currentStatus is an instance variable; we do not want its value // to be destroyed when the autorelease pool cleans up, so we // retain it ourselves [currentStatus retain]; @end example @b{Convenience Constructors} A special case of object transfer occurs when a @i{convenience} constructor is called (instead of @code{alloc} followed by @code{init}) to create an object. (Convenience constructors are class methods that create a new instance and do not start with ``new''.) In this case, since the convenience method is the one calling @code{alloc}, it is responsible for releasing it, and it does so by calling @code{autorelease} before returning. Thus, if you receive an object created by any convenience method, it is autoreleased, so you don't need to release it if you are just using it temporarily, and you DO need to retain it if you want to hold onto it for a while. @example - (NSString *) getStatus @{ NSString *status = [NSString stringWithFormat: "Count is %d", [self getCount]]; // 'status' has been autoreleased already return status; @} @end example @b{Pool Management} An autorelease pool is created automatically if you are using the GNUstep GUI classes, however if you are just using the GNUstep Base classes for a nongraphical application, you must create and release autorelease pools yourself: @example NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; @end example Once a pool has been created, any autorelease calls will automatically find it. To close out a pool, releasing all of its objects, simply release the pool itself: @example [pool release]; @end example To achieve finer control over autorelease behavior you may also create additional pools and release them in a nested manner. Calls to @code{autorelease} will always use the most recently created pool. Finally, note that @code{autorelease} calls are significantly slower than plain @code{release}. Therefore you should only use them when they are necessary. @subsubsection Avoiding Retain Cycles One difficulty that sometimes occurs with the retain/release system is that cycles can arise in which, essentially, Object A has retained Object B, and Object B has also retained Object A. In this situation, neither A nor B will ever be deallocated, even if they become completely disconnected from the rest of the program. In practice this type of situation may involve more than two objects and multiple retain links. The only way to avoid such cycles is to be careful with your designs. If you notice a situation where a retain cycle could arise, remove at least one of the links in the chain, but not in such a way that references to deallocated objects might be mistakenly used. @subsubsection Summary The following summarizes the retain/release-related methods: @multitable @columnfractions 0.25 0.75 @item Method @tab Description @item @code{-retain} @tab increases the reference count of an object by 1 @item @code{-release} @tab decreases the reference count of an object by 1 @item @code{-autorelease} @tab decreases the reference count of an object by 1 at some stage in the future @item @code{+alloc} and @code{+allocWithZone:} @tab allocates memory for an object, and returns it with retain count of 1 @item @code{-copy}, @code{-mutableCopy}, @code{copyWithZone:} and @code{-mutableCopyWithZone:} @tab makes a copy of an object, and returns it with retain count of 1 @item @code{-init} and any method whose name begins with @code{init} @tab initialises the receiver, returning the retain count unchanged. @code{-init} has had no effect on the reference count. @item @code{-new} and any method whose name begins with @code{new} @tab allocates memory for an object, initialises it, and returns the result. @item @code{-dealloc} @tab deallocates object immediately (regardless of value of retain count) @item convenience constructors @tab allocate memory for an object, and returns it in an autoreleased state (retain=1, but will be released automatically at some stage in the future). These constructors are class methods whose name generally begins with the name of the class (initial letter converted to lowercase). @end multitable The following are the main conventions you need to remember: @itemize @item If a unit of code allocates, retains, or copies an object, the same unit, loosely speaking, is responsible for releasing or autoreleasing it at some future point. It is best to balance retains and releases within each individual block of code. @item If you receive an object, it should remain valid until the object which provided it is sent another message or until the autorelease pool which was in use at the point when you received it is emptied. So you can usually expect it to remain valid for the rest of the current method call and can even return it as the result of the method. If you need to store it away for future use (e.g. as an instance variable, or to use after emptying/destroying an autorelease pool, or to be used after sending another message to the object's owner), you must retain it. @item The retain counts mentioned are guidelines only ... more sophisticated classes often perform caching and other tricks, so that @code{+alloc} methods may retain an instance from a cache and return it, and @code{-init} methods may release their receiver and return a different object (possibly obtained by retaining a cached object). In these cases, the retain counts of the returned objects will obviously differ from the simple examples, but the ownership rules (how you should use the returned values) remain the same. @end itemize @ignore Special examples: delegate, target @end ignore @subsection ObjC-2 and Automated Reference Counting @cindex ObjC-2 , automated reference counting @cindex ARC When using a compiler and runtime supporting ObjC-2 and ARC, the reference counting for objects is handled by the compiler. To enable easy development (to ObjC-1) code, a number of macros are provided which encapsulate the manual reference counting required when ARC is not available. @multitable @columnfractions 0.25 0.75 @item Macro @tab Functionality @item @code{RETAIN(foo);} @tab @code{[foo retain];} @item @code{RELEASE(foo);} @tab @code{[foo release];} @item @code{AUTORELEASE(foo);} @tab @code{[foo autorelease];} @item @code{ASSIGN(foo, bar);} @tab @code{[bar retain]; [foo release]; foo = bar;} @item @code{ASSIGNCOPY(foo, bar);} @tab @code{[foo release]; foo = [bar copy];} @item @code{ASSIGNMUTABLECOPY(foo, bar);} @tab @code{[foo release]; foo = [bar mutableCopy];} @item @code{DESTROY(foo);} @tab @code{[foo release]; foo = nil;} @item @code{ENTER_POOL} @tab Like @@autoreleasepool this introduces a code block with a manually created autorelease pool. @item @code{LEAVE_POOL} @tab This ends a block created by an ENTER_POOL destroying the autorelease pool created at the start of the block @item @code{DEALLOC} @tab @code{[super dealloc];} @item @code{IF_NO_ARC(...)} @tab Code to be compiled only if ARC is not in use @end multitable In the assignment ``convenience'' macros, appropriate @code{nil} checks are made so that no retain/release messages are sent to @code{nil}. @page gnustep-base-1.29.0/Documentation/manual/WritingNewClasses.texi000066400000000000000000001021411435650067400246050ustar00rootroot00000000000000@paragraphindent 0 @node Classes @chapter Writing New Classes @cindex writing new classes Objective-C class definitions are always divided into two parts: an @i{interface} and an @i{implementation}. This division mirrors the common C library division into a header file with function declarations, which is distributed to all users of a library, and a source file with the implementations, which is only used to compile the library and is generally not distributed to users. A class interface declares instance variables, methods and the superclass name, while the implementation file holds the operational code that implements those methods. Typically the interface and implementation are held in separate files, using the @code{.h} and @code{.m} extensions, respectively. They may, however, be merged into one file, and a single file may implement many classes. @section Interface @cindex interface The interface is included in the source using @code{#include}: @example #include "SomeClass.h" @end example To ensure that a Header file is included only once, it is usual to protect it with pre-compiler defines: @example #ifndef _MY_CLASS_H_INCLUDED #define _MY_CLASS_H_INCLUDED /* HEADER FILE */ #endif @end example This is the standard C technique to protect header files from being included more than once. A cleaner alternative, introduced in Objective-C, is to use the @code{#import} directive instead of @code{#include}. The compiler will automatically include @code{#import}ed files no more than once, even if multiple @code{import} statements are encountered. Thus, you can do away with the messy preprocessor conditionals in the header file. You should be careful, however, to only use @code{#import} for Objective-C interface headers, and continue using @code{#include} for standard C files. It is possible, though not likely, that regular C headers may rely on being included multiple times in some cases. Also, you may need to include the compiler directive @code{-Wno-import} to gcc to avoid a didactic warning to this effect. @comment The role of the interface @subsection Interface Capabilities The interface file declares new classes that can be used by source code, holding all the information necessary to use the classes from other Objective-C code. Firstly, the file reveals to the programmer the position of the class in the class hierarchy by defining exactly which is the superclass. Secondly, it informs programmers of what variables are inherited when they create subclasses. Finally, the interface file may inform other software entities of the messages that can be sent to the class object and to the instances of the class. Interface files use the @code{.h} extension as for ordinary C header files. (If you use emacs, put a line ``@code{// -*-ObjC-*-}'' at the top of your file to use the correct mode.) @comment Writing an interface (syntax) Here is an example of a class interface declaration: @example #import @@interface Point : NSObject @{ @@private // instance variables only accessible to instances of this class ... @@protected // instance variables accessible to instances of this class or subclasses float x; float y; @@public // instance variables accessible by all code ... @} // class methods + (id) new; + (id) newWithX: (float)x0 Y: (float)y0; + (Point*) point; + (Point*) pointWithX: (float)x0 Y: (float)y0; // instance methods - (id) init; - (id) initWithX: (float)x0 Y: (float)y0; - (float) x; // (field accessor) - (float) y; - (void) setX: (float)newX; - (void) setY: (float)newY; @@end @end example @itemize @bullet @item The interface file should import the interface of the superclass of the class it is defining. @item The interface is enclosed between the compiler directives @code{@@interface} and @code{@@end}. @item @code{@@interface Point : Object} names the class and links it to the superclass. If no superclass is named, and the directive is without a colon, the compiler assumes that a root class is being created. You more than likely don't want to do this. @item Braces enclose declared instance variables; each class's instance will have all these instance variables including instance variables inherited from the superclass, and from the superclass of the superclass, extending to the root class. @item Instance variables may be declared as @code{private}, @code{protected}, or @code{public}. An instance's @i{private} variables may only be accessed by instances of this class. An instance's @i{protected} variables may be accessed by instances of this class or instances of subclasses of this class. @i{Public} variables may be accessed by any code. This is analogous to the usage in C++ and Java. If you do not mark your instance variable declaration explicitly, it is made @code{protected} by default. @item Method declarations that begin with a "+" sign are class methods, and are defined for the class object. Thus, you can call them without creating an instance, and their implementations do not have access to any instance variables. A class object inherits class methods from superclasses. @item Method declarations that begin with a "-" sign are instance methods, and are defined for class instances. Class instances inherit instance methods from superclasses. @item A method may share the name of an instance variable. @item A method return type is declared using the C syntax for type casts: @example - (float) x; @end example which is a method returning a float. @item Argument types can be declared in the same way as method return types: @example - (void) setX: (float)newX; @end example which is a method that returns nothing, and takes a single float as its argument. Note. The default type for methods and messages (@code{id}) is assumed when a return or argument type is not explicitly declared. For example, '@code{-name}' implicitly means a method returning @code{id} (i.e. an object). It is usually better to avoid this and use explicit typing as in @example - (NSString*) name; @end example @end itemize @subsection Including Interfaces Source code (including Objective-C implementation and interface files) may integrate interfaces using @code{#import} (or @code{#include}). Thereafter the source module may utilize the classes in those interfaces so as to: @itemize @bullet @item Make instances of them. @item Send messages to invoke methods declared for them. @item Refer to instance variables in them. @end itemize With the exception of the root class, all working interfaces integrate a superclass using either @code{#import} or @code{#include} -- as was seen in the previous simplified interface file example. As a result the vast majority of class files begin with a standard form that includes their superclasses, and thus places them in the class hierarchy: @example #import "SomeSuperclass.h" @@interface SomeClass : SomeSuperclass @{ // instance variables ... @} // method declarations ... @@end @end example @subsection Referring to Classes - @@class It is possible for a source module to refer to classes without including their interface files. This is useful when you just need to tell the compiler that a certain word is a class name, but you want to avoid the overhead of including the whole interface file for that class. For example, to inform the compiler that @code{Border} and @code{Square} are classes without including their full interface file, the following syntax is used: @code{@@class Border, Square;} Class names may also appear in interface files at times when instance variables, return values and arguments are statically typed: @example #import "Foundation/NSObject.h" @@class Point @@interface Square : NSObject @{ @@protected Point *lowerLeft; float sideLength; @} + (id) newWithLowerLeft: (Point *)lowerLeft sideLength: (float)sideLength; - (id) initWithLowerLeft: (Point *)lowerLeft sideLength: (float)sideLength; - (Point *) lowerLeft; - (float) sideLength; - (void) setLowerLeft: (Point *)newLowerLeft; - (void) setSideLength: (float)newSideLength; @@end @end example Here, we see the @code{Point} class we declared earlier being used as a component in @code{Square}'s definition. Because this class is only referred to here to declare variables and method signatures, it suffices to reference it only using the @code{@@class} directive. On the other hand, the implementation file may need to send messages to @code{Point} instances and would be better of importing the interface in this case. The compiler will produce a warning if you don't include it, and no type checking can be performed (to see if class instances respond to the messages you send to them), but compilation will succeed. It is best to take advantage of type-checking when you can, however, and include interfaces that messages are to be sent to. There is one situation where you @i{must} include the interface however. If you are implementing a new class, you always need to include the interface of the superclass; @code{@@class} cannot be used in this case because the compiler needs to know the details of the superclass and its instance variables etc., so as to create a fully working new class. If you try using @code{@@class} in this situation, compilation will abort. @section Implementation An interface file declares a class, while an implementation file implements it. The separation between the interface and implementation file yields a black box concept where the programmer using the class need only be concerned with the interface and its declared methods, superclasses, and instance variables. The implementation of classes is transparent to the programmer who may use them without detailed knowledge of their structures. Implementation files use the @code{.m} extension, to distinguish them from ordinary C files. @subsection Writing an Implementation An implementation file contents are encapsulated between @code{@@implementation} and @code{@@end} directives: @example #import "Point.h" @@implementation Point // method implementations + (id)new @{ // statements ... @} + (id)newWithX: (float)x Y: (float)y @{ // statements ... @} // ... - (void)setY: (float)newY @{ // statements ... @} @@end @end example The implementation file uses @code{#import} to include a named interface file holding all declarations. Then it places method implementations for the class between @code{@@implementation} and @code{@@end} directives. Each method declared in the interface must be implemented. Instance variables may be referred to in instance methods (the ones with a ``-'' in front of them) but not class methods (the ones with a ``+''). @example - (float) x @{ return x; @} - (void) setX: (float)newX @{ x = newX; @} @end example @subsection Super and Self To assist in writing instance methods, Objective-C provides the two reserved words @b{@code{self}} and @b{@code{super}}. @code{Self} is used to refer to the current instance, and is useful for, among other things, invoking other methods on the instance: @example - (Foo *) foo @{ if (![self fooIsInitialized]) [self initializeFoo]; return foo; @} @end example @code{Super} is used to refer to method implementations in the superclass of the instance. It is useful when overriding methods and when writing initializers, as discussed in the next section. @subsection Instance Initialization Instance initialization is one of the trickier aspects of getting started in Objective-C. Recall that instances of a class are created by use of the class @code{alloc} method (inherited from @code{NSObject}) but are initialized by instance methods. This works a little differently than in C++ and Java, where constructors are special methods that are neither class nor instance methods. In particular, since initializer methods are inherited instance methods, they may still be called even if you have not implemented them in your class. For example, it is always valid to invoke @example SomeComplexClass *c = [[SomeComplexClass alloc] init]; @end example Even if you have not implemented @code{init} in @code{SomeComplexClass}, the superclass's implementation will be invoked, or, ultimately, @code{NSObject}'s if no other ancestors implement it. Obviously, this could result in some of @code{SomeComplexClass}'s internal state being left uninitialized. For this reason, you should always either provide an @code{init} implementation, or document whether it should be used. We will return to this concern below. Typically, a class will also provide one or more @code{initWith...} methods for initialization with arguments, and it may optionally also provide @code{+new} methods and convenience class methods that act like constructors. The general approach to implementing these is illustrated here for the @code{Point} class. @example + new @{ Point *point; // note "self" refers to the "Point" _class_ object! point = [[self allocWithZone: NSDefaultMallocZone()] init]; return point; @} + newWithX: (float)x0 Y: (float)y0 @{ Point *point; point = [[self allocWithZone: NSDefaultMallocZone()] initWithX: x Y: y]; return point; @} + point @{ Point *point; // note "self" refers to the "Point" _class_ object! point = [self new]; return AUTORELEASE(point); @} + pointWithX: (float)x0 Y: (float)y0 @{ Point *point; point = [self newWithX: x Y: y]; return AUTORELEASE(point); @} - init @{ return [self initWithX: 0.0 Y: 0.0]; @} // this is the "designated" initializer - initWithX: (float)x0 Y: (float)y0 @{ self = [super init]; if (self != nil) @{ x = x0; y = y0; @} return self; @} @end example Notice that, first, the convenience constructors (@code{new} and @code{newWithX:Y:}) execute @code{[self allocWithZone:]} to begin with. The ``@code{self}'' here refers to the @i{class} object, since it is used inside a @i{class} method. Thus the effect is the same as if ``@code{[Point alloc]}'' had been executed in external code. Second, notice that the other convenience constructors (@code{point} and @code{pointWithX:Y:}) autorelease the new instance before returning it. This is to follow the rules of memory management discussed in @ref{Objects, earlier, Memory Management}. Third, note that the @code{new..} methods each call a corresponding @code{init...} method. It is not necessary to maintain such a one to one correspondence but it is a common convention to have the convenience implementations rely on instance @code{init} methods as shown. Fourth, note that the use of @code{[self allocWithZone: NSDefaultMallocZone()]} rather than @code{[self alloc]} is generally unnecessary, but provides a slight efficiency gain since @code{+alloc} is implemented by calling @code{+allocWithZone:} on the default zone. @b{Designated Initializer} Finally, notice that the @code{initWithX:Y:} method is marked as the ``designated'' initializer. This concept is important to ensure proper initialization for classes within a hierarchy. The designated initializer should be the one with the most control over the nature of the new instance, and should be the one that all other initializers ``ground out'' in. In other words, all other initializers should be chained so that they either call the designated initializer, or they call another initializer that (eventually) calls it. The importance of having a designated initializer is this: when a subclass is created, it need only override the designated initializer to ensure that all of its instances are properly initialized. If this is not done, external code could invoke an initializer that initializes only the superclass's instance variables, and not the subclass's. To avoid this, each class designates a ``ground out'' initializer to which other initializers ultimately delegate. Then the subclass overrides this initializer, and in its own designated initializer, makes a call to it, to ensure that the superclass is initialized properly. Thus: @example @@implementation SuperClass - initWithA: (int)a @{ return [self initWithA:a B:0]; // 0 is default value @} // designated init for SuperClass - initWithA: (int)a B: (int)b @{ self = [super init]; myA = a; myB = b; return self; @} @@end @@implementation SubClass // overrides SuperClass's designated init - initWithA: (int)a B: (int)b @{ return [self initWithA: (int)a B: (int)b C: (int)c]; @} // designated init for SubClass - initWithA: (int)a B: (int)b C: (int)c @{ self = [super initWithA: a B: b]; myC = c; return self; @} @@end @end example @comment{This example is way too abstract to make sense..} Note, as shown above, unlike in some other object-oriented languages, '@code{self}' is a variable that can be redefined. For example, we could have written the @code{new} constructor above like this: @example @{ self = [[self alloc] init]; // note "self" now refers to the new instance! [self setX: 1.0]; return self; @} @end example Another point to note is that Objective-C does not enforce calling superclass initializers before carrying out subclass initialization. Although above the first call in the designated initializer was always @code{[super ...]}, this was not required, and if you need to set something up before @code{super} acts, you are free to do so. @subsection Flexible Initialization As mentioned before, it is possible for an initialization process to, if desired, return not a new object but an existing object. This may be done in one of two ways. If you are doing it from a convenience class method like @code{new}, then use something like the following: @example + new @{ if (singleton == nil) singleton = [[self alloc] init]; return singleton; @} @end example Note this example presupposes the existence of a class variable, '@code{singleton}'. Class variables as such don't exist in Objective-C but can be simulated, as discussed below. If you want to possibly return an existing instance from an init instance method like @code{init}, the procedure is slightly more complicated: @example - init @{ if (singleton != nil) @{ RELEASE(self); self = RETAIN(singleton); @} else @{ singleton = self; @} return self; @} @end example Here, we explicitly @b{deallocate} the current instance and replace it with the desired existing instance. Because this might happen, you should always be careful to use the returned value from an @code{init} method: @example id anObject = [SomeClass alloc]; // this is bad: [anObject init]; // anObject might have been deallocated! // do this instead: anObject = [anObject init]; @end example One scenario where this actually occurs in the GNUstep libraries is with the class @code{NSConnection}. It only permits one connection to exist between any two ports, so if you call @code{initWithReceivePort:sendPort:} when a connection for the ports exists, the method will deallocate the newly allocated instance, and return the current conflicting object, rather than the receiver. In general, it is better to catch this type of requirement in a ``@code{new}'' class method rather than an instance ``@code{init}'' method so as to avoid the unnecessary allocation of instances that will not be used, however this is not always possible given other design constraints. @subsection Instance Deallocation As described in @ref{Objects, the previous chapter, Memory Management}, objects should be deallocated when they are no longer needed. When ARC is not being used, this is done through explicit calls to the @code{dealloc} method. When ARC @i{is} being used, @code{dealloc} is still called implicitly, and should be implemented. However the tasks of the @code{dealloc} method are fewer in this case. When ARC is @i{not} used, the @code{dealloc} method must release all other objects that this instance has retained. Usually these are those instance variables that are objects rather than primitive types. In certain cases such as container classes, other objects must be released as well. In addition, if the instance has acquired any external resources, such as a network connection or open file descriptor, these should be relinquished as well. Likewise, any memory that has been directly allocated through use of @code{malloc} or other functions should be released. When ARC @i{is} active, the @code{dealloc} method is still responsible to relinquish external resources, but other GNUstep objects must not be released, since they will be managed by ARC. If you cannot be sure whether your class will be running in an ARC environment, you should use the RETAIN/RELEASE macros instead of the function calls. Here is an example of a @code{dealloc} implementation: @example - dealloc @{ RELEASE(anInstanceVariableObject); NSZoneFree(NULL, myMemory); DEALLOC @} @end example Here, we use the @code{RELEASE} macro to release an instance variable, and the @code{NSZoneFree} function to free memory that was earlier allocated with @code{NSZoneMalloc} or a related function. (See @ref{Base Library} for discussion of GNUstep's raw memory allocation functions.) The @code{NULL} used indicates that the memory was from the default zone, and is equivalent to saying '@code{NSDefaultMallocZone()}' instead. Finally, notice we end with the DEALLOC macro to call the superclass implementation (but not for ARC). This should always be done in @code{dealloc} implementations, and you should never concern yourself with deallocating structures that are associated with a superclass, since it will take care of this itself. @section Protocols @cindex protocols @cindex protocols, formal Protocols in Objective-C provide a level of flexibility beyond class structure in determining what messages objects respond to. They are similar to interfaces in Java but more flexible. There are two types of protocol in Objective-C: @b{informal} protocols, where we document methods to which objects will respond, and specify how they should behave, and @b{formal} protocols, where we provide a list of methods that an object will support in a format where the compiler can check things, and the runtime can also check that an object conforms to the protocol. Informal protocols are merely convention, but are useful where we want to say that some system will work as long as it (or its delegate) implements some subset of a group of methods. Formal protocols are of more use when we want the compiler or runtime to check that an object implements all of a group of methods itself. Formal protocols form an inheritance hierarchy like classes, and a given class may conform to more than one protocol. Thus, formal protocols are identical in many respects to Java @i{interfaces}. As in Java, a particularly important use of protocols is in defining the methods that an object in a remote process can respond to @dots{} by setting the protocol used by a local proxy object, you can avoid having to send messages to the remote process to check what methods are available - you can simply check the local protocol object. This will be covered later in @ref{Distributed Objects}. Informal protocols are closely associated with @i{Categories}, another Objective-C language facility, and will be discussed in the next section. @subsection Declaring a Formal Protocol A formal protocol is declared as a series of method declarations, just like a class interface. The difference is that a protocol declaration begins with @code{@@protocol} rather than @code{@@interface}, and has an optional @b{super} protocol specified in angle brackets. @example @@protocol List - (void) add: (id) item; - (void) remove: (id) item; - getAtIndex: (int)idx; - (void) clear; @@end @@protocol LinkedList - (void) addFirst: (id)item; - (void) addLast: (id)item; - getFirst; - getLast; @@end @end example @subsection Implementing a Formal Protocol If you want your class to conform to a protocol, you declare it in your interface, and implement the methods in your declaration: @example @@interface BiQueue @{ // instance variables ... @} // method declarations ... // [don't need to redeclare those for the LinkedList protocol] - takeFirst - takeLast @@end ... @@implementation BiQueue // must implement both List's and LinkedList's methods ... - add: (id) item @{ // ... @} - addFirst: (id)item @{ // ... @} @@end @end example To declare conformance to multiple protocols, do something like this: @example @@interface ContainerWindow < List, Window > ... @@end @end example The implementation must include all methods in both protocols. @subsection Using a Formal Protocol To use a formal protocol, simply send objects the messages in the protocol. If you want type-checking, you must either use the type of a class implementing the protocol, or use a special syntax: @example ... BiQueue queue = [[BiQueue alloc] init]; // send a LinkedList message [queue addFirst: anObject]; // alternatively, we may stipulate only that an object conforms to the // protocol in the following way: id todoList = [system getTodoList]; task = [todoList getFirst]; ... @end example In the last part of this example, we declare that @code{todoList} is an object that conforms to the @code{LinkedList} protocol, but do not specify what class it may be an instance of. If you are not sure the returned object does indeed conform to the protocol you are interested in, you can check it: @example if ([anObject conformsToProtocol: aProtocol] == YES) @{ // We can go ahead and use the object. @} else @{ NSLog(@@"Object of class %@@ ignored ... does not conform to protocol", NSStringFromClass([anObject class])); @} @end example Finally, you can specify an object conforming to @i{multiple} protocols in the same way you declare it in an interface: @example id windowContainerOfUnknownClass; @end example @section Categories @cindex categories Categories provide a way in Objective-C to add new methods to an existing class, without declaring a subclass. Once the category is declared and implemented, all instances of the existing class that are created will include the capability to respond to the new methods. Furthermore, subclasses of the class will inherit these methods. However, it is not possible to add instance variables to a class using a category. Categories do not have an obvious parallel in other major object-oriented languages (with the exception of Ruby), but it is well worth taking the trouble to understand them and the benefits they can provide. A category is declared in connection with the class it is going to modify. (You can think of it as a new ``category'' of instances of this class.) @example #import "Point.h" @@interface Point (Transformable) - translateByX: (float)tx Y: (float)ty; - rotateByAngle: (float)radians; - scaleByAmountX: (float)xscale Y: (float)yscale; @@end @end example You then provide an implementation file more or less analogously to that for a class, where you implement just the new methods: @example #import "PointTransformable.h" @@implementation Point (Transformable) - (void) translateByX: (float)tx Y: (float)ty @{ x += tx; y += ty; return self; @} - (void) rotateByAngle: (float)radians @{ // ... @} - (void) scaleByAmountX: (float)xscale Y: (float)yscale @{ // ... @} @@end @end example Notice that you have access to instance variables of the class you are creating a category of; this includes private and protected variables. One of the primary uses of categories is illustrated by this example. Suppose you are working with a third party drawing package that uses some geometrical classes such as @code{Point} and @code{Line}. You are developing an animation program based on the package and need the ability to move things around. Rather than employing a complex subclassing or aggregation scheme to add these capabilities, you simply define the @code{Transformable} category for each of the geometrical entities. At runtime, all instances of these entities, whether created by you or the package itself, have the additional methods. The presence of these methods does not affect the existing operation of this or any third party package, but allows you to conveniently implement the enhanced functionality you need. @subsection Category Overrides You can also use categories to override methods that a class already has. If you do so, you cannot access an existing implementation in the class itself, however you can still call @code{[super someMethod]} to access an implementation inherited from a superclass. You obviously need to be careful not to break existing functionality. You can add multiple categories to a class by declaring them and implementing them separately. Instances of the class will then implement @i{all} of the categories declared. The order in which the category implementations are searched for methods is not defined, therefore you cannot override a method implemented in one category with an implementation in another. @subsection Categories as an Implementation Tool Categories are not just useful for extending an existing class. Another major use for categories is to separate the implementation of a @i{new} class into a number of source files. (Each file implements one category of the new class, and at runtime instances of the class respond to the methods in all the categories.) The benefits of this program development strategy include: grouping subject-oriented methods; incremental compilation for large classes; helping to logically divide the class when being created by a number of developers; and, permitting configuration-specific classes targeting particular applications. @subsection Categories and Protocols As described in the previous section, in addition to the @i{formal} protocol facility described, Objective-C provides for @i{informal} protocols. An informal protocol is essentially a category declaration without an implementation. Usually, the informal protocol is declared as a category for a high-level object, such as @code{NSObject}, then each class that actually wishes to implement something in the protocol lists the methods it chooses to implement in its interface and provides implementations in its implementation. @comment{Need to add some motivation -- how/why/when is this useful?} @section Simulating Private and Protected Methods Unlike most object-oriented languages Objective-C does not provide for method scoping. Instead, all methods are effectively public. Often, however, it is useful to have internal ``utility'' methods that help a class do its job but are hidden from external use. Rather than cluttering up the class's API with a bunch of methods marked ``do not use'', one wants to make these methods visible only to subclasses, or only to the class itself. Categories can help in this regard. @b{Using Categories} One common approach is to define a category within a class's @i{implementation} file: @example #import "Point.h" @@interface Point (Private) -(BOOL) isPositiveQuadrant; @@end @@implementation Point // public method implementations ... @@end @@implementation Point (Private) -(BOOL) isPositiveQuadrant @{ return (x > 0) && (y > 0) ? YES : NO; @} @@end @end example All of this code would appear in the file @code{Point.m}. What this does is add a category to Point defining the private methods. Since external code only ``knows about'' @code{Point} through its interface file, these additional methods are effectively invisible. However, you should be aware that external code is not prevented from actually calling the private methods, if it happens to know about them. However the compiler will produce a warning if you try to do this with a typed variable: @example Point *p = [[Point alloc] init]; // works, but produces a compile warning BOOL b = [p isPositiveQuadrant]; @end example The bright side of this is it allows you to simulate @i{protected} methods as well. For this, the writer of a subclass must be informed in some way about the protected methods, and they will need to put up with the compiler warnings. Alternatively, you could declare the Protected category in a separate interface file (e.g., ``@code{PointProtected.h}''), and provide this interface file with the understanding that it should only be imported and used by a subclass's interface file. @b{Using Convention} Another approach to providing @i{protected} methods that the class or subclass can use is to prefix these methods with an underscore ('_'). These methods will still be visible publicly, but programmers will know, by convention, not to use them externally, and the @ref{GSDoc, GNUstep documentation system} will automatically mark these in API documentation as off-limits. An alternative approach to providing @i{private} methods is to simply declare them as functions within the implementation file itself. The catch to this is that these functions will @i{not} have access to the class's instance variables. You will need to pass these in manually whenever you invoke them from an ordinary method. @section Simulating Class Variables While Objective-C does not provide for variables that are associated with the class as a whole rather than an instance, these are often useful. It is possible to simulate them to a limited extent by declaring static variables in the implementation file for the class (inside the @code{@@implementation} block). The variables will not be available to subclasses, unless they explicitly declare them ``@code{extern}'' and are compiled at the same time. @ignore @section The +load and +initialize Class Methods @end ignore @ignore @section Class ``Posing'' @end ignore @page ... gnustep-base-1.29.0/Documentation/manual/chap5-1-Forwarding.eps000066400000000000000000000000311435650067400242410ustar00rootroot00000000000000ÅÐÓÆ)I gnustep-base-1.29.0/Documentation/manual/foreword.texi000066400000000000000000000020301435650067400230150ustar00rootroot00000000000000@c @unnumbered Foreword The aim of this document is to provide a GNUstep/Objective-C programming manual (primarily tutorial in style) for the language, the GNUstep Base library, and the GNUstep Make package. While to focus is on Objective-C, the GNUstep libraries can also be used from Java and Guile, and some information on this usage is also included. The manual does not cover installation instructions as these vary from system to system, and are documented fairly well in the GNUstep @uref{../../../User/GNUstep/gnustep-howto_toc.html, HOWTO}. The target audience for this manual is the C, C++, or Java programmer that wishes to learn to use Objective-C effectively. We assume that, while the reader is able to understand English, it is quite possibly not their native language. For detailed class reference documentation the reader is directed to the GNUstep Base Library @uref{../Reference/index.html, , documentation}, and to the Apple Cocoa Objective-C Foundation documentation (available through @url{http://www.apple.com}). gnustep-base-1.29.0/Documentation/manual/index.html000066400000000000000000000050761435650067400223050ustar00rootroot00000000000000 GNUstep Objective-C programming manual
Brainstorm logo

$Revision$ $Date$

Brainstorm Objective-C programming manual

The aim of this manual is to provide a tutorial and reference manual to the use of the Objective-C language with the GNUstep-base library. We want it to be readable enough for programmers with a reasonable understanding of C or Java ... even if english is not the programmers first/main language. We also want it to cover the language in enough depth to teach people how to get its full benefits, and understand its use in the Brainstorm software environment.

The programing manual is a work in progress. At the time of writing this, I believe that the overall structure is roughly correct and the actual content of the document is perhaps one third filled in. Once the content is complete, the document will probably need a good bit of editorial work to make it more readable and to check consistency etc.

The manual source is in texinfo format ... and is built automatically to info, html, and postscript format.

Please send comments/criticisms/corrections to richard@brainstorm.co.uk or nicola@brainstorm.co.uk

gnustep-base-1.29.0/Documentation/manual/manual.texi000066400000000000000000000077731435650067400224660ustar00rootroot00000000000000\input texinfo @c -*-texinfo-*- @c %**start of header @setfilename gs-base.info @settitle Objective-C GNUstep Base Programming Manual @c %**end of header @dircategory Software libraries @direntry * GNUstepBase: (gs-base). Objective-C Language and GNUstep Base Library Programming Manual. @end direntry @ifinfo Copyright @copyright{} 2001 Free Software Foundation Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided also that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions. @end ifinfo @setchapternewpage odd @titlepage @title Objective-C Language @title and GNUstep Base Library @title Programming Manual @author Francis Botto (Brainstorm) @author Richard Frith-Macdonald (Brainstorm) @author Nicola Pero (Brainstorm) @author Adrian Robert @page @vskip 0pt plus 1filll Copyright @copyright{} 2001-2004 Free Software Foundation Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided also that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions. @end titlepage @contents @ifnothtml @iftex @include foreword.texi @end iftex @end ifnothtml @c **Top node and master menu @node Top @top Objective-C Programming Manual @include foreword.texi @menu * Introduction:: An introduction to object-oriented programming * Objective-C:: An introduction to the Objective-C language * Objects:: Working with objects; memory management * Classes:: How to create a new class * Advanced Messaging:: How messaging works, and advanced techniques * Exception Handling:: Exception handling, assertion, and logging facilities * Distributed Objects:: Working with distributed objects * Base Library:: Using the classes in the GNUstep Base library * GSDoc:: The GNUstep documentation system * Bundles and Frameworks::The GNUstep Applicaton Resource Framework * Objective-C Java and C++:: Comparison between Objective-C, Java, and C++ * Java and Guile:: Programming GNUstep in Java and Guile * Compliance to Standards:: GNUstep and the OpenStep and Mac OS X APIs * Make:: Using the Package to build GNUstep "Objects" @end menu @c **end Top node and master menu @page @c Chapter 1, Introduction @include Introduction.texi @c Chapter 2, The Objective-C Language @include ObjcLanguage.texi @c Chapter 3, Working with Objects @include WorkingWithObjects.texi @c Chapter 4, Writing New Classes @include WritingNewClasses.texi @c Chapter 5, Advanced Messaging @include AdvancedMessaging.texi @c Chapter 6, Exception Handling, Assertions, and Logging @include ExceptionHandling.texi @c Chapter 7, Distributed Objects @include DistributedObjects.texi @c Chapter 8, Base Library @include BaseLibrary.texi @c Appendix A: GSDoc @include GSDoc.texi @c Appendix B: Bundles and Frameworks @include Bundles.texi @c Appendix C: Comparison between Objective-C, Java, and C++ @include ObjcAndJavaC++.texi @c Appendix D: Programming GNUstep in Java and Guile @include JavaAndGuile.texi @c Appendix E: GNUstep Compliance to Standards @include Compliance.texi @c Appendix F: Using the GNUstep Make Package @include GNUstepMake.texi @unnumbered Concept Index @printindex cp @bye gnustep-base-1.29.0/Documentation/news.texi000066400000000000000000001564661435650067400207140ustar00rootroot00000000000000@ifclear GSTEP-BASE-MAIN @include version.texi @end ifclear @ifclear ANNOUNCE-ONLY @chapter News The currently released version of the library is @samp{@value{GNUSTEP-BASE-VERSION}}. See the @url{ReleaseNotes.html} document for more information. @end ifclear This is a bugfix release increasing the library version number to reflect ABI change that should have been included when the previous release was made. @section Noteworthy changes in version @samp{1.29.0} @itemize @bullet @item Library version changed from 1.28 to 1.29 @end itemize @ifclear ANNOUNCE-ONLY @section Noteworthy changes in version @samp{1.28.1} @itemize @bullet @item Many changes to make building and testcases work on ms-windows (particularly with the MSVC target and when using a strict C99 compiler). @item Support for native locking on ms-windows. @item Support for overlapped I/O on ms-windows. @item New timezone handling code to deal with v2+ of the timezone format. @item TLS support for secure Distributed Objects connections. @item Masking of sensitive information in http/https debug logs. @item a variety of bugfixes. @end itemize @section Noteworthy changes in version @samp{1.28.0} Aside from an assortment of bugfixes, this release includes a lot of improvements for Windows support as well as numerous new classes and methods. Not every bugfix, improvement or a new feature will be listed here. @itemize @bullet @item Reading and setting File Creation Date attribute on Windows. @item Added new @code{ASSIGNMUTABLECOPY()} macro for consistency with @code{ASSIGNCOPY()}. @item Replaced character set data headers for URLs with loading these from a standard data source, and updated bitmap representation to use much less space for character sets residing wholly in the base plane, such as the URL charsets (given they are purely ASCII). @item Updated character set data with newer Unicode data set. @item @code{[NSURLProtocol -initWithRequest:cachedResponse:client:]} will now retain the client up until the last message is sent to it, which improves compatibility with OS X. @item Percent-escaping code in @code{NSURL} simplified. @item Removed mixed ABI support. @item Use of Apple runtime now assumes non-fragile ABI (which is true on modern systems). @item Improve typing on method implementation pointers in some classes. @item In @code{NSHTTPCookie}, rewritten code for extracting individual cookies from the HTTP header. @item In @code{NSKeyedArchiver}, implement secure coding methods. @item New methods in @code{NSDateComponents}. @item Improvements in @code{NSCalendar} and @code{NSLocale} for calendar locale and @code{NSDateComponents}. @item In @code{NSFileManager}, use @code{utimensat()} to set file modification date, if available. @item Correctly stop parsing number being decoded in @code{NSJSONSerialization} when encountering a number with an invalid exponent. @item Improve OS X compatibility for @code{NSURLQueryItem} initializers. @item For @code{NSFileManager}, in @code{changeFileAttributes}, implement setting creation date for Unix-like systems. Implement reading the creation date if a supported method was detected. @item Support reading Android assets from the main bundle in @code{NSInputStream}. @item Support Android assets directories in @code{NSBundle} and @code{NSFileManager}. @item Implement @code{-[NSXMLParser initWithStream:]}. @item Allow clearer choice between 'sloppy' @code{GSSloppyXMLParser} used in @code{NSXMLParser} and the libxml2-based @code{GSStrictXMLParser}. @item Fix building Win32 implementations for @code{GSFileHandle} and @code{NSMessagePort} with nonfragile ABI. @item Use @code{NSNumber} and not @code{NSString} in @code{-[NSUserDefaults setBool:forKey:]}. @item Posting notification before @code{NSThread} exit. @item Actually declare optional @code{NSFilePresenter} methods as optional. @item In @code{NSConcreteMapTable}, fix replacing existing values in a weak objects map table. @item Fix leaks in @code{NSOperation}. @item Various compat fixes for various MSYS systems, particularly around sockets code. @item In @code{NSData}, @code{NSFileManager} and more, various improvements when overwriting and creating files with respect to file attributes (owners, creation timestamp, etc). @item Improve @code{NSLog} output on Android. @item Use @code{instancetype} in @code{NSURLRequest} header. @item Define @code{NSAttributedStringKey} and @code{NSNotificationName}. @item Add new @code{NSURL} methods. @item In @code{GSMime}, have @code{-contentFile} check the @code{Content-Type} header before checking @code{Content-Disposition}. @item Fix a bug linking with WEAK symbols where binutils 2.3.5 would fail to link due to not all expected symbols being exported. @item New @code{plutil} utility. @item Implementation of @code{[NSData rangeOfData:options:range:]} which finds the @code{NSRange} in which the passed data occurs. @item Change @code{ENTER_POOL}/@code{LEAVE_POOL} so they no longer wrap the enclosed code in a loop, enabling use in some loops. @item New 10.5 methods in @code{NSRunLoop}/@code{NSURLConnection}. @item Improve compatibility when building with ICU 68. @item Fix compiling libdispatch integration of @code{NSRunLoop} on Windows. @item Add support for building on Windows with MSVC's Clang by passing the @code{configure} flag @code{--host=x86_64-pc-windows}. Use of an MSYS2 shell without @code{-devel} packages is recommended. @item Implementation of @code{NSURLSession} and related classes. This adds some dependencies on more recent versions of @code{libcurl}, @code{libdispatch} etc. @item Fix initializing @code{NSUUID} from a string. @item Disable use of @code{libcurl} if its headers are not found. @item In @code{NSURLProtocol}, continue writing data if not all of it was written. @item Fix use of GnuTLS under MinGW by using @code{send/recv} rather than @code{read/write}. @item Add support for libobjc2 runtime on Windows. @item Fix BOM insertion when generating data from a string using one of the Unicode encodings. @end itemize @section Noteworthy changes in version @samp{1.27.0} Aside from an assortment of bugfixes, this release includes a lot of improvements for Android support as well as numerous new classes and methods. @itemize @bullet @item Expose GNU TLS wrappers and add methods to get certificate expiry. @item Improve thread safety when using zombies, particularly on statup/shutdown. @item Improvements for Ukrainian localization. @item Decreased ICU requirements to 49 to support Windows 2000. @item Simplifications and fixes in GSPrivateSymbolPath(). @item GSMime improvements (word encoding specifier, utf-8 improvements encoding quoted words with multibyte characters) @item NSJSONSerialization fixes for codepoints over 0x7f. @item NSCharacterSet support for URL*AllowedCharacterSet and declarations for new character sets. @item NSString implementations for new methods stringByRemovingPercentEncoding/ stringByAddingPercentEncodingWithAllowedCharacterSet:. @item Fixed a crash in gdomap when an invalid hostname is given for the -M option. @item In NSString.m, removed functions urldecode() and ishex() which were mistakenly neither namespaced nor declared static and thus could have conflicted with non-library code. @item Fixed libdispatch configuration switch so --enable-libdispatch works correctly; correctly checking for HAVE_LIBDISPATCH_RUNLOOP. @item Updated libdispatch runloop integration so it is compatible with Swift's corelibs libdispatch release (from github.com/apple/swift-corelibs-libdispatch). The libdispatch must be compiled with INSTALL_PRIVATE_HEADERS=YES. @item In NSThread, spinlocks implemented using builtins to be able to target platforms without pthread_spin_lock(), such as Android targeting API level < 24. @item In NSLog on Android, send logs to syslog. @item Implementation of NSOrderedSet. @item When ./configuring, link against libandroid on Android. @item In NSBundle, allow integrating with Android asset manager using +[NSBundle setJavaAssetManager:withJNIEnv:], enabling use of mainBundle's pathForResource:ofType:, -URLForResource:ofType: and similar; referencing Info.plist if it exists in Android assets; use of NSFileManager's fileExistsAtPath: et al and isReadableFileAtPath:; reading files using NSFileHandle APIs; use of NSDirectoryEnumerator to enumerate Android assets from the main bundle. @item In NSBundle, localization support on Android. @item In NSProcessInfo, automatic initialization on Android using a fake executable path (/data/data//Resources). @item In NSData, improvements in reading Android assets. @item Various improvements in the mechanism to report memory usage of individual objects. @item Skeletal implementation of NSUbiquitousKeyValueStore. @item Implementation of NSByteCountFormatter. @item Fixes to writing large HTTPS requests (GSSocketStream, NSURLProtocol). @item In gdomap.c, fix detection of local networks. @item In NSArray's -removeObjectsInArray:, prevent some crashes. @item In GSTLS, avoid setting session priority twice. @item In NSFileHandle, fix so that setting certificate information does not discard any other options already set. @item In GSXML's -fatalErrorFunction, use the correct function to get the line number. @item In NSOperation's _execute, ensure lock gets released on an error by surrounding with NS_DURING. @item Generics support in NSHashTable. @item Implementation of NSProgress. @item Skeleton implementation of NSURLComponents. @item In NSSortDescriptor, added -sortDescriptorWithKey:ascending:descending:. @item In NSOperationQueue, added -addOperationWithBlock. @item In NSFileManager, added -URLForDirectory:inDomain:appropriateForURL:create:error: and -enumeratorAtURL:includingPropertiesForKeys:options:errorHandler:. Also added NSItemReplacementDirectory constant, and updated stub implementation for -URLForDirectory:shouldCreate:error:. Added -initWithDirectoryPath:... with additional parameters skipHidden and errorHandler. @item In NSDictionary, fixed keysSortedByValueUsingComparator:. @item Moved NSFileWrapper from -gui to -base. @item Added NSFilePresenter, NSFileVersion and NSFileCoordinator. @item Added NSPersonComponents and NSPersonNameComponentsFormatter. @item Added units of measurement classes such as NSUnit, NSMeasurement, NSMeasurementFormatter, NSEnergyFormatter, NSLengthFormatter, NSMassFormatter. @item In NSUnit, support for NSUnitArea, NSUnitConcentrationMass, NSUnitDispersion, NSUnitElectricCharge, NSUnitIlluminance, NSUnitElectricCurrent, NSUnitElectricPotentionDifference, NSElectricResistance, NSUnitMass, NSUnitEnergy, NSUnitFrequency, NSUnitPower, NSUnitSpeed, NSUnitFuelEfficiency, NSUnitPressure, NSUnitVolume, NSUnitLength. @item Support for data directory on Android introduces GSInitializeProcessAndroid and makes use of the path returned by Context.getFilesDir() as the basis for storing data (e.g. NSUserDefaults) and when querying for directory paths (NSLibraryDirectory, NSApplicationSupportDirectory, etc.). @item Placeholder NSScript* classes. Added NSUserActivity, NSObjectScripting, NSHFSFileTypes, NSAppleEventManager and NSAppleEventDescriptor. @item Added NSDateInterval intersectionWithDateInterval:. @item Added NSBackgroundActivityScheduler. @item Added NSISO8601DateFormatter and NSMetadataAttributes. @item Added NSOrtogrpahy and NSLinguisticTagger. @item Added NSExtensionItem, NSExtensionContext, NSExtensionRequestHandling, and NSItemProvider and NSItemProviderReadingWriting. @item Updated timezone info for NSTimeZones. @item On Android, support for NSTemporaryDirectory to use Context.getCacheDir(), and cleaning it up in GSInitializeProcessAndroid() given there is no support for temp directory before Android API 26. Also used with NSCachesDirectory + NSUserDomainMask. @item NSXPCConnection fixes. @item NSException symbolication support using libunwind (used when backtrace() is unavailable). @item Travis build improvements to use new runloop integration and gnustep-2.0 runtime. @item In NSKeyValueObserving, implement two missing methods for NSArray: -addObserver:options:context: and -removeObserver:fromObjectsAtIndexes:forKeyPath:. @item Updated NSUUID to use instancetype. @item Added support for NSDate constants in NSPredicate. @item Fixed a NSTimer bug with blocks. @item In GSTLS, do not put password in the hash key of the credentials, and to avoid logging it when debugging is on. @item Improvements in NSConcreteHashTable and NSConcreteMapTable. @item In various places, switch away from deprecated CREATE_AUTORELEASE_POOL() to use the ARC-compatible ENTER_POOL and LEAVE_POOL macros. @item When building the list of hosts to be probed to see if they have gdomap servers, fix code to include those explicitly defined in the config file. Add -S option to list the addresses of the known gdomap servers. @item Backward compatibility fix for ICU 65. @item Update GSPrivateSymbolPath() so that, on the path where LINKER_GETSYMBOL is not available, we attempt to lookup classes using the prefix ._OBJC_CLASS_ for the 2.0 ABI (earlier ABIs use a prefix of __objc_class_name_ for the class definition. @item Fix parsing of NSURLResponse content type header. @item Fix for class lookup when using the 2.0 ABI. @item Fixed NSURLComponents setURL: throwing exceptions when URL didn't have all expected parts caused by rangeOfString: throwing for nil values. @item Added NSURLQueryItem implementation. @end itemize @section Noteworthy changes in version @samp{1.26.0} @itemize @bullet @item Improve utf8 validity checks. @item Make point and size subclasses for NSValue interchangable. @item Add support for TLS SNI. Always request certificate from client and update certificates after 5 minutes. @item Don't write deprecated fields to desktop link file. @item Use NSLock instead of GSLazyLock and other improvements for multithreaded processes. @item Clean up of NSString cluster. @item Update NSAssert() and NSCAssert() to handle variable arguments (as OSX has done) and mark the numbered macros as obsolete. @item Various improvements in tests. @item Require ICU >= 50. @item ICU is now detected using pkg-config. @item Improve XML parsing. @item Make NSXMLNode ivar a union representing different types, instead of assuming it will contain different underlying class types in different contexts. This is important for the new libobjc2 ABI. @item OSX compatibility changes to NSURL. @item NSFileManager call error handle on missing file. @item Dummy spinlock implementation for platforms that don't support it. @item Internationalization improvements: Japanese translation, Turkish translation, Polish translation. @item Various improvements for new libobjc2 "v2 ABI", including things like a new NSConstantString implementation, making GS_REPLACE_CONSTANT_STRING a noop with the new ABI, etc. @item Improvements for stack traces, exception handling and dead lock detection. @item Other more minor bugfixes and cleanups. Many found by Coverity scan results. @item As usual, this release also contains an update to include the most recent international timezone data. @end itemize @section Noteworthy changes in version @samp{1.25.1} @itemize @bullet @item Unicode fixes for characters outside the base plane @item Stubs for some new OSX methods @item Various new OSX compatibility macro and type definitions @item NSFileManager fixes and tweaks to match OSX implementation @item NSDistributedLock bugfix for pre-existing lock directories @item Alternative sort algorithms selectable at runtime @item Compatibility-related changes for environments not supporting weak symbols @item Other more minor bugfixes and cleanups. @item As usual, this release also contains an update to include the most recent international timezone data. @end itemize @section Noteworthy changes in version @samp{1.25.0} @itemize @bullet @item Garbage collection support removed (NSGarbageCollector stub remains) @item Support for Debian style multi-architecture installations added @item OpenSSL bundle removed since it didn't match GNUTLS support @item Ported to Debian/Hurd @item ICU string (regexp in particular) fixes @item OSX compatibity changes in NSRunLoop and NSTask behavior @item Alternative sort algorithms selectable at runtime @item Many bugfixes and cleanups. @item As usual, this release also contains an update to include the most recent international timezone data. @end itemize @section Noteworthy changes in version @samp{1.24.9} @itemize @bullet @item Niels added support for generics @item Support for 'ng' runtime library (latest language features enabled) @item Performance optimisations and improved diagnostic messages @item Garbage Collection deprecated (support to be removed) @item As usual, this release also contains an update to include the most recent international timezone data. @end itemize @section Noteworthy changes in version @samp{1.24.8} @itemize @bullet @item Performance optimisations (particularly in the use of tiny string objects by the new objc runtime on 64bit systems). @item Thread naming and logging of threads by NSLog() has been made consistent with the latest OSX releases, making debugging of multithreaded code a little easier. @item Sergei Golovin has added NSURLConnection regression tests (while fixing a few bugs there). @item As usual, this release also contains an update to include the most recent international timezone data. @item Various other bugfixes. @end itemize @section Noteworthy changes in version @samp{1.24.7} @itemize @bullet @item TLS and other security improvements (note, SSLv3.0 is disabled by default in order to prevent the 'POODLE' attack). @item Latest timezone data included. @item Various other bugfixes. @end itemize @section Noteworthy changes in version @samp{1.24.6} @itemize @bullet @item NSUUID implemented @item New OSX version macros @item TLS support improvements @item Various new methods for OSX compatibility @item Various other bugfixes @end itemize @section Noteworthy changes in version @samp{1.24.5} @itemize @bullet @item NSInvocationOperation @item OSX version compatibility macro improvements @item Static analyzer fixes (mostly printf format string issues) @item Various other bugfixes @end itemize @section Noteworthy changes in version @samp{1.24.4} @itemize @bullet @item Updated time zone data @item OSX 10.7 NSCalendar methods @item Portability improvments and minor bugfixes @item More testcases in the testsuite @end itemize @section Noteworthy changes in version @samp{1.24.3} @itemize @bullet @item Implementation of the NSXML DOM classes @item Implementation of consistent TLS/SSL support @item Implementation of new/selectable sorting algorithms @item More explicit dependencies on external libraries. @end itemize @section Noteworthy changes in version @samp{1.24.0} @itemize @bullet @item There is binary incompatibility on 64bit systems in that the value of the NSNotFound constant there is now 64bits rather than 32bits. @item gcc-4.0 is the minimum official supported compiler for GNUstep @item Support for the GNU LANGUAGES environment variable and other locale improvements @item IPV6 support for NSHost and networking operations @item Support for UTF-8 string literals in source (compiler permitting) @end itemize @section Noteworthy changes in version @samp{1.23.0} @itemize @bullet @item Support for automatic reference counting (ARC) when using clasng and the GNUstep Objective-C 2.0 runtime 1.5 or later. @item Full support for weak references in NSHashTable, NSMapTable and NSPointerArray when using clang and the GNUstep Objective-C 2.0 runtime 1.5 or later. @end itemize @section Noteworthy changes in version @samp{1.22.0} @itemize @bullet @item Many updates and new classes @item There is now a regression test framework included with the package @item New support for Objective-C 2.0 @end itemize @section Noteworthy changes in version @samp{1.21.1} This is an (unstable) copy of the 1.20.1 release @section Noteworthy changes in version @samp{1.20.1} This is a stable bugfix release. There are no major changes or binary incompatibilities, but this release does include an update of timezone handling to include the latest zone information. @section Noteworthy changes in version @samp{1.21.0} This is an (unstable) copy of the 1.20.0 release @section Noteworthy changes in version @samp{1.20.0} This is a stable release. There have been major changes and reorganizations to support, among other things, the new non-fragile ABI from clang. These changes, although they break binary compatibility with previous releases, should allow all future releases to maintain compatibility. @section Noteworthy changes in version @samp{1.19.3} @itemize @bullet @item Bugfix to work around OSX behavior of [NSURL-path] @end itemize @section Noteworthy changes in version @samp{1.19.2} @itemize @bullet @item Various OSX compatibility improvements. @item String handling performance improvements. @item Several minor bugfixes. @end itemize @section Noteworthy changes in version @samp{1.19.1} @itemize @bullet @item New Mac OS X methods for writing data in NSData @item New classes NSHashTable and NSMapTable @item Garbage collection now works again and is much improved. @item Method return types and arguments have been changed for Mac OS X 10.5 @end itemize @section Noteworthy changes in version @samp{1.19.0} @itemize @bullet @item Support for native objective-c exceptions @item Connection keepalive for ms-windows @item Path utitlites fix for ms-windows @item Changes to build on 64bit ms-windows @item Support for @@synchronize @end itemize @section Noteworthy changes in version @samp{1.15.3} @itemize @bullet @item Extended NSUserDefaults so it recognizes ../ as a relative path. @item Added TLS/SSL support for NSStream based on GNU TLS @item Added support for https to NSURLConnection using new stream code and added basic support for digest authentication. @item Fixed various problems with and added new options to KVO. @end itemize @section Noteworthy changes in version @samp{1.15.2} Bug fixes include improved thread safety (and a change to the NSThread class structure) and Key-Value observing. @section Noteworthy changes in version @samp{1.15.1} This is an unstable release. There may be API and ABI changes from previous releases. The licesne hase changed to GPLv3 and LGPLv3. Mostly bug fixes, but a few improvements in NSPredicates and Key-Value coding have been added. @section Noteworthy changes in version @samp{1.15.0} This is an unstable release from 1.14.0. It is otherwise identical to the 1.14.0 release. Releases in the 1.15 series may not be forward compatible with previous 1.15 releases. @section Noteworthy changes in version @samp{1.14.0} Many portability (particularly for ms-windows) and MacOS-X compatibility fixes. New MacOS-X classes and incorporation of NSAffineTransform and NSSpellServer which were formerly in the gui library. Improved performance of amssively multithreaded programs. @section Noteworthy changes in version @samp{1.13.1} Various minor bugs and MacOS-X incompatibilities fixed. One important fix for a possible buffer overrun attack when initialising NSDate objects from strings. One fix for a serious (crash) bug when initialising the bundles system in an application which has a lot of frameworks linked to it. See the release notes for more details. @section Noteworthy changes in version @samp{1.13.0} Several sets of classes have been added for dealing with urls and predicates. A few minor api changes have occured as well. @section Noteworthy changes in version @samp{1.12.0} There have been a number of API changes and several methods have been depreciated in this release. Although current GNUstep programs that use these methods will still work in this version, there are enough changes that a new library version was considered useful. See the release notes for more details. New NSStream classes where added to the library. User defaults were restructured to create the defaults lazily and can be set to not write to an external file at all, for developers who wish to use the library as a stand-alone library or in other situations where using external resources is not desired. @section Noteworthy changes in version @samp{1.11.2} @itemize @bullet @item Support for GNUstep.conf and relocation of the filesystem is much improved in this release. @item The WM_QUIT message is now intercepted to allow an application to terminate cleanly. @item NSMessagePort was implemented on Windows platforms. @item Deprecated support for system-wide GNUsteprc files has been removed. @item Some support for keeping user defaults in the Windows registry implemented. @end itemize @section Noteworthy changes in version @samp{1.11.1} @itemize @bullet @item New Cocoa class NSSortDescriptor @item NSStringFrom... functions now output strings that can be read by old OpenStep implementations (but can also still be read by GNUstep and MacOSX). @item More support for debugging on mingw, including writing logs to debugger and event viewer. @end itemize @section Noteworthy changes in version @samp{1.11.0} This release is binary incompatible with previous releases. The interface version of the library has changed so that apps, tools and libraries that use the base library need to be recompiled to use this new version. @itemize @bullet @item Window's path handling has changed to use native paths throughout. @item Startup/configuration of the libraries no longer requires environement variables. @item Character sets are included in the library rather than being read from data files. @item NSRunLoop and related classes use natvie win32 event handling on Windows machines. @end itemize @section Noteworthy changes in version @samp{1.10.3} This version includes a few minor bug fixes. @section Noteworthy changes in version @samp{1.10.2} This version mostly includes minor fixes and updates. @itemize @bullet @item The definition of NSContainsRect has changed to correspond with the current Mac OS X/Cocoa def - the sides of the bRect can touch aRect. @item Add support for systems that support unichar file paths (e.g. Windows). @item Use a proper one-to-one abbreviation dictionary for NSTimeZone. @end itemize @section Noteworthy changes in version @samp{1.10.1} This version mostly includes minor fixes and updates. @itemize @bullet @item Runtime discovery of the library version is possible. @item NSXMLParser class added. Not completely implemented. @item NSArrays makeObjectsPerformSelector iterates in same order as MacOS X. @item Designated initializers for NSArray, NSDictionary, NSSet, and NSString have been changed for MacOS X compatibility. @end itemize @section Noteworthy changes in version @samp{1.10.0} Note the interface version of the library has changed so that apps, tools and libraries the use the base library need to be recompiled to use it. @itemize @bullet @item A large majority of the library classes have been documented thanks to the efforts of Adrian Robert @item URL classes support persistant connections @item Mac OSX XML compatibility fixes. @end itemize @section Noteworthy changes in version @samp{1.9.2} @itemize @bullet @item GSMime parsing ignores extraneous data @item New log functions GSOnceFlag and GSOnceMLog @item New class NSError @item Multiple new function in GSObjCRuntime @item NSProtocolChecker rewritten @item autogsdoc support added for building frames @item Binary incompatibility: NSUnarchiver, GSIMapTable have new ivars added @end itemize @section Noteworthy changes in version @samp{1.9.1} @itemize @bullet @item Default string encoding taken from system nl_langinfo if not set with GNUSTEP_STRING_ENCODING. @item NSKeyedArchiver/NSKeyedUnarchiver classes added. @item NSPropertyLists class added, also decodes Mac OS X binary propery lists. @end itemize @section Noteworthy changes in version @samp{1.9.0} @itemize @bullet @item Lazy locking implemented (see GSLock documentation) @item MacOSX PB files updated to 10.3 @item DO retain/release implementation simplified and also handles some complex DO retain/release problems. @item GNUSTEP_STRING_ENCODING now supports any valid iconv name. @item gdomap uid/gid fixes @item NSString subclass heirarchy reorganized to fix problems with copying and ownership of data. @end itemize @section Noteworthy changes in version @samp{1.8.0} Read the NEWS file for a complete list of changes since the last stable version. The major change is that the header files (both in the package and when installed) are in different locations. Also, due to filesystem changes in gnustep-make, several components of gnustep-base are located in different locations. Generally this should not affect the compilation or running of applications and tools. @section Noteworthy changes in version @samp{1.7.4} @itemize @bullet @item Added Korean encoding @item Updated use of ObjCRuntime functions. @end itemize @section Noteworthy changes in version @samp{1.7.3} Note in this version there have been large changes to the location of header files (both in the package and when installed). It's possible (though unlikely) that certain applications that rely on GNUstep specific headers may not compile because of this. @itemize @bullet @item A number of Protocol and DO fixes. @item New TraditionalChinese language. @end itemize @section Noteworthy changes in version @samp{1.7.2} @itemize @bullet @item NSUndoManager improvements @item New NSMessagePort implementation. @item Private GSTcpPort becomre NSSocketPort. @item Improvements to handle selectors better over remote connections. @end itemize @section Noteworthy changes in version @samp{1.7.1} Bug fixes. @section Noteworthy changes in version @samp{1.7.0} See gnustep-make for comments on the filesystem change. Some components of gnustep-base are now stored in different directories and in some cases you should use different methods to look for them. Use +pathForLibraryResource:ofType:inDirectory: instead of +pathForGNUstepResource:. Also try using +bundleForLibrary:. gnustep-base is now documentated as OpenStep complient. Other changes: @itemize @bullet @item Add GSApplicationSupportDirectory for NSSearchPathForDirectoriesInDomains. @item Added man page for gdomap @end itemize @section Noteworthy changes in version @samp{1.6.0} @itemize @bullet @item More MinGW support @item New MacOSX compatible methods. @item The Base Additions library compiles on native OSX. @item autogsdoc produces better, cleaner docs. @item Built-in garbage collecting classes. @item Any many many bug fixes and minor improvements. @end itemize @section Noteworthy changes in version @samp{1.5.1} @itemize @bullet @item Port NSThread to MingW @item Better framework support in NSBundle @item Added Thai string encodings. @item New makeImmutableCopyOnFail: method. @item Lots of autogsdoc improvements, Updated gsdoc DTD to 1.0 version. @item Added GSPrintf for logging to stdout. @item Warning logs selectable at runtime. @item NSTimeZone code rewritten for speed. @end itemize @section Noteworthy changes in version @samp{1.5.0} @itemize @bullet @item New MacOSX methods implemented (NSString, NSArray, NSObject) @item Fixed bug that occationally deleted user defaults. @item Tcp connections use runloop in NSConnectionReplyMode. @end itemize @section Noteworthy changes in version @samp{1.4.0} @itemize @bullet @item gdomap - security bug fixes. @end itemize @section Noteworthy changes in version @samp{1.3.4} This is a first pre-release version for 1.4. This version also fixes a potentially destructive bug in gdomap. All users are urged to upgrade to this version as soon as possible. @itemize @bullet @item gdomap - don't write pidfile until after setuid away from root @item New combined Unix/Windows version of NSFileHandle @end itemize @section Noteworthy changes in version @samp{1.3.3} Note there are interface and binary changes in this release that require you to recompile all applications and tools that use gnustep-base. @itemize @bullet @item Rewrite of NSURL (NOTE: Requires recompilation of all apps!) @item NSMapTable fix (also requires recompilation). @item Hack to avoid bug in gcc 3.1 @item MacOSX compatibility changes: -dealloc, NSLog @item Add NSZombie class. @item GC improvements @item Support for system-wide .GNUsteprc @end itemize @section Noteworthy changes in version @samp{1.3.2} @itemize @bullet @item Corrections for handling Windows file paths, etc @item Other fixes for Windows - DO now works on Windows @item New localization/internationalization tool make_strings @item Experimental libffi support. @item Handle running tools/apps on other hosts @item Updated files and new tool for handling different encodings (cvtenc). @item Unicode and UTF8 handling improvements. @end itemize @section Noteworthy changes in version @samp{1.3.0} @itemize @bullet @item Moved additional classes into subprojects and/or bundles to make it easier to port these to other Foundation libraries.. @item Traditional Chinese extensions added. @item Better support for resources (bundles) @item Ports and DO work on MingW. @item Better KeyValueCoding support (for EOF). @item New, partially finished Objective-C/Foundation programming manual. @end itemize @section Noteworthy changes in version @samp{1.1.0} @itemize @bullet @item Removed use of distributed lock to sync defaults file. @item Compiles on Darwin (but does not work yet). @item New tool autogsdoc for inline Objective-C documentation. @item Some NSBundle convienience methods for associating resources with libraries and tools (like a lightweight framework). @item URL classes improved and more robust. @item SSL classes compiled as a separate bundle due to license problems. @item Better operation in MinGW environment. @item New localization files. @item XML property lists @end itemize @section Noteworthy changes in version @samp{1.0.2} Mostly a bug fix release to work with the new gcc 3.0. @itemize @bullet @item Added support for special gcc 3.0 options (constant string support). @end itemize @section Noteworthy changes in version @samp{1.0.1} @itemize @bullet @item Many fixes to work better with Darwin (still not there). @item Fixes to work with BSD Unix @item Added some missing methods, better conformance to MacOSX Docs. @item Added support for invoking super implementation (mostly for writting bridges from other languages). @item Works better with gcc 3.x, newer kernels. @item More memory debugging support. @end itemize @section Noteworthy changes in version @samp{1.0.0} @itemize @bullet @item Fix parsing of arguments for new linux kernels. @item File manager and other fixes for mingw @item Fix alignment issues on CPUs that require it. @item Update unicode support and fixes @end itemize @section Noteworthy changes in version @samp{0.9.1} @itemize @bullet @item New MacOSX compatible files for NSCalendarDate, NSTimeZone @item NSUserDefaults now uses NSLanguages not Languages @item Various improvements for Windows platforms @item NSCharacterSets updated to v3.0.1 of Unicode data. @item Added some gettext compatible localization macros. @end itemize @section Noteworthy changes in version @samp{0.9.1} @itemize @bullet @item Fixes for building on FreeBSD @item Unicode support for -initWithFormat: @item NSDate pass dates over DO bycopy unless explicit byref. @item Updated for Makefile package changes. @end itemize @section Noteworthy changes in version @samp{0.9.0} @itemize @bullet @item Workaround when no host IP set. @item Standardized non-NS filenames @item Lots of code simplifications and standardization. @item Added key/value methods to NSObject. @item Updated DO and NSInvocation to use ffcall libraries. @item New GSHTTPURLHandle class for http and https support. @item New GSMime class for MIME parsing @item Made DO threadsafe. @item Added extension to NSThread to allow JIGS to map java threads to gnustep threads. @item Modifications to make it easier to port to Apple runtime. @item Added framework support to NSBundle @item Added localization support @item Better unicode conversion. @item New NSNull class. @item Major rewrite of NSString @item Port to MinGW/Windows @item Removed obsolete classes. @end itemize @section Noteworthy changes in version @samp{0.6.6} @itemize @bullet @item Lots of new documentation. @item Completely rewritten Distributed Object to be much more compatible with the MacOS-X API (and incidentally, closer to the original OpenStep standard). @item Support to compile library as a DLL on Windows (still cygwin only). @item Removed lots of obsolete classes. @item New tools for handling property lists. @item More optimization of classes. @end itemize @section Noteworthy changes in version @samp{0.6.5} @itemize @bullet @item Better debugging information. @item Timezone information rewritten to work more like GNUstep wants it rather than strict Posix. @item Added support for FreeBSD native POSIX threads @item Better garbage collection support. @item Lots of optimizations and bug fixes. @end itemize @section Noteworthy changes in version @samp{0.6.0} Most of the changes to the Base Library are bug fixes and updates to include MacOS-X specifications. Although the base library hasn't been extensively tested, it is currently used in several commercial products and installations, and is considered to be fairly stable. @itemize @bullet @item Some changes to eventually allow the use of automatic garbage collection. @item Better localization support in NSBundle. @item Performance boosts in many classes. @end itemize @section Noteworthy changes in version @samp{0.5.5} Too many changes to mention in detail, but here is a list of a few: @itemize @bullet @item Many base classes have been rewritten with tonnes of performance improvements that in many cases make it as fast as or faster than the NeXT implementation. @item DO and archiving has received many improvements that help it work on a variety of different platforms. @item Configuration and compilation has been greatly improved and fool proofed. @item There are several new tools for handling services, defaults, and pasteboards. @end itemize @section Noteworthy changes in version @samp{0.5.1} @itemize @bullet @item Additional runtime functions for interaction with Guile and ObjC-Guile library. @end itemize @section Noteworthy changes in version @samp{0.5.0} @itemize @bullet @item Improvements to the NSInvocation class, from Masatake Yamato @email{masata-y@@aist-nara.ac.jp}. @item Implemented several new OpenStep methods and classes (e.g. NSTask) and speed improvements for others (NSArray, NSData, NSString), from Richard Frith-Macdonald @email{richard@@brainstorm.co.uk}. @item gdomap now handles subnet addressing and machines with multiple IP addresses from Richard Frith-Macdonald @email{richard@@brainstorm.co.uk}. @end itemize @section Noteworthy changes in version @samp{0.4.0} @itemize @bullet @item New tools for maintaining the defaults database. @item Use the new GNUstep Makefile Package to compile the library, tools checks, and everything else. @item An implementation of NSDistributedLock @item NSData implemented as a class cluster including a class to allocate shared VM memory. @item Big NSTimeZone improvements, as well as inclusion of time zone files, from Yoo C. Chung @email{wacko@@laplace.snu.ac.kr}. @item Major improvements to distributed objects and many related clases from Richard Frith-Macdonald @email{richard@@brainstorm.co.uk}. Also added a nameserver. @item Major rewrite of NSString, include Unicode strings from Stevo Crvenkovski @email{stevo@@btinternet.com} @item A rewrite of the NSBundle class from Adam Fedor @email{fedor@@gnu.org} @item Addition of a C-language style stream package. @item Better support for threads and locking. @item Support for running on Windows from Scott Christley @email{scottc@@net-community.com} @item Many, many, many, many bug fixes and new classes. @end itemize @section Noteworthy changes since version @samp{0.1.19} @itemize @bullet @item The library has changed its name from @samp{libobjects} to @samp{libgnustep-base}. The Apr 17 ChangeLog entry contains a list of the way various other names were changed. @item The library now requires a patch to gcc-2.7.2. The patch adds thread-safe features to the GNU Objective C runtime. Each thread has its own exception handler and assertion handler, thanks to Yoo C. Chung @email{wacko@@power1.snu.ac.kr}. @item Distributed Objects is much improved. Exceptions in the server are sent back to the client. Ungracefully closed connections are gracefully handled. @item NSUserDefaults has been implemented, thanks to Georg Tuparev @email{tuparev@@NMR.EMBL-Heidelberg.DE}. @item NSScanner has been implemented, thanks to Eric Norum @email{Eric.Norum@@usask.ca}. @item NSCharacterSet has a new caching scheme, and is now faster than NeXT's implementation, thanks to Adam Fedor. @item Preliminary thread-safety work has been done. NSObject and NSAutoreleasePool should be thread-safe. @item The "%@@" printf directive now works on systems without GNU libc. @item The NS*Page* functions have been implemented. @item The mframe and behavior functions have been overhauled and better commented. @item The NSHashTable and NSMapTable functions have been implemented, thanks to Albin Jones @email{albin.jones@@dartmouth.edu}. Albin has also implemented underlying GNU functions that provide functions for arrays and linked lists of C-type variables. @item The NSThread class has been implemented. Thanks to Scott Christley @email{scottc@@net-community.com}, the NSLock class has been implemented. @item A RunLoop class has been implemented, and is used for listening to Port objects. It is used for Distributed Objects. There is also an NSRunLoop class based on RunLoop. @item The NSTimer class has been implemented, although its use with RunLoops is currently disabled. @item The Notification mechanism has been implemented. It makes good use of hash tables and linked lists in order to be fast. @item The Invocation class heirarchy has been fleshed out and now works. @item The collection classes have been overhauled to better handle distributed objects, and for better compatibility with NeXT's method names. A new separation has been made in the abstract collection classes: IndexedCollections contain objects accessible by an integer key, but the user cannot insert at an arbitrary key; these are useful for sorted collections, such as SplayTree's. OrderedCollection can have their order determined by the user; i.e. users can send @samp{-insertObject:atIndex:}, etc. There is a new set of rich enumeration methods based on Invocations. @item Port class heirarchy has been overhauled. There are now classes for TCP ports, UDP ports, and Mach ports. Only the TCP ports are currently functional. @item GNU-style archiving has had an overhaul, and the GNUstep NSArchiver class is functional, but not strongly tested. It does not yet call -awakeUsingCoder:. I have separated the high-level archiving of groups of objects from the low-level format of how C-types are written. There are several new classes. CStream is a subclass of Stream that knows how to encode C-type variables in a machine independent way; this class has two concrete subclasses: BinaryCStream, and TextCStream. Plug these backends into Coder to get different style low-level formats for archiving. Floats and doubles are now encoded more efficiently. NSArchiver is built on top of Coder. You can actually send all the Coder methods to NSArchiver and vice-versa. GNU classes BinaryCoder and TextCoder are gone. @item Several new OpenStep functions have been implemented: NSHomeDirectory, NSUserName, NSHomeDirectoryForUser, NSPageSize, NSLogPageSize, NSroundUpToMultipleOfPageSize, NSRoundDownToMultipleOfPageSize, NSRealMemoryAvailable, NSAllocateMemoryPages, NSDeallocateMemoryPages, NSCopyMemoryPages. @item ...and many bug fixes. @end itemize @section Noteworthy changes since version @samp{0.1.14} @itemize @bullet @item Can be made as a shared library by passing @samp{--enabled-shared} to `configure'. Thanks to Jan Kybic @email{kybic@@earn.cvut.cz} and Bryan Headley @email{bwh@@mail.lnd.coretech.com} for suggestions. @item New classes NSSet, NSMutableSet, NSCountedSet. New concrete classes NSGSet, NSGMutableSet, NSGCountedSet. New test program nsset.m. New class NSMethodSignature. @item Running './configure' and building the library in a different directory than the source works as it should, according to the GNU standards. @item Dynamic loading fixes for Solaris, thanks to Adam Fedor. @item Fixes to Coder correct bugs with encoding/decoding wildly interconnected objects. (My application uses a "Suffix Tree" structure: a Tree, and a LinkedList that winds its way through the leaves of the tree; the LinkedList nodes also have pointers back to the tree nodes.) @item NSTimeZone implemented, thanks to Peter Burka @email{peter@@bert.psyc.upei.ca} @item NSData fixes, thanks to Adam Fedor. @item NSObjCRuntime functions implemented. NSObject description methods implemented. @item Bug fixes in NSString, NSDictionary, NSArray, NSGeometry and other places. @end itemize @section Noteworthy changes since version @samp{0.1.13} @itemize @bullet @item NSProcessInfo class, thanks to Georg Tuparev. @item NSDate now more operational, thanks to Jeremy Bettis. @item Autorelease checking improved, thanks to Adam Fedor. @item NSString concrete classes now more configurable. Several new methods implemented. @item Many bug fixes. @end itemize @section Noteworthy changes since version @samp{0.1.12} @itemize @bullet @item Bug fixes: installation; NSArray and NSDictionary copying; NSArray, NSDictionary, NSData, NSArchiver, NSUnarchiver concrete class configurability; NSString -getCharacter:range:. See the ChangeLog for more details. @end itemize @section Noteworthy changes since version @samp{0.1.10} @itemize @bullet @item Now using @file{src}, @file{config} and @file{doc} directories to un-clutter the top-level directory. @item New GNUStep classes implemented: NSDictionary, NSMutableDictionary; concrete classes NSGDictionary, NSGMutableDictionary; enumeration classes NSGDictionaryKeyEnumerator, NSGDictionaryObjectEnumerator. @item More methods in NSData are implemented, thanks to Albin Jones. @item More methods in NSString are implemented; we have new classes NSCharacterSet and NSBitmapCharSet; all thanks to Adam Fedor. @item And several bug fixes. See the ChangeLog for details. @end itemize @section Noteworthy changes since version @samp{0.1.9} @itemize @bullet @item Renamed "foundation" include file directory to "Foundation", in accordance with OpenStep. @item Several bug fixes, including a problem with a missing file in 0.1.9. @end itemize @section Noteworthy changes since version @samp{0.1.8} @itemize @bullet @item Many new GNUStep classes: NSEnumerator, NSArrayEnumerator, NSCoder, NSArchiver, NSUnarchiver, NSData, NSMutableData, NSGCoder, NSGArchiver, NSGUnarchiver, NSGData, NSGMutableData. Much coding and prep work has been done to make archiving work (see the ChangeLog), but it's not quite ready for action yet. @item New GNUStep classes implemented by others: Thanks to Adam Fedor, NSAssertionHandler. Thanks to Jeremy Bettis, NSDate. @item Overhauled encoding and decoding. The Coder now sends -initWithCoder by default, but will still send the more flexible +newWithCoder if the class implements it. See objects/Coding.h. The Stream class interface has been changed slightly. There are two new protocols for Streams. @item Several new debug-aiding methods implemented in NSAutoreleasePool. @item Separated Constant Collection protocols from changeable ones. Eventually I'll separate the classes too. @item Included an outline for the GNU Objective C Language Manual. The GNU project is looking for volunteers to help flesh it out. Send email to Martin Michlmayr @email{tbm@@ihq.com} or Andrew McCallum @email{mccallum@@gnu.ai.mit.edu}. @item Include the AUTHORS file, needed for legal reasons. Include the @file{GNUStep-volunteers} file. @item Several bug fixes: Typo in Array.m; Linux header file frobbing in NSZone.h; typo causing crash in checks/nsarray.m; bad deallocation in Collection.m; typo in BinaryTree.m; put -write: and -read: implementations back in Collection.m. @end itemize @section Noteworthy changes since version @samp{0.1.7} @itemize @bullet @item Thanks to Adam Fedor @email{fedor@@boulder.colorado.edu}, classes NSBundle, NSNumber and NSValue are now operational. He also provided stubs for NSArray, NSCoder and NSDictionary. @item NSArray has been fleshed out. There are new classes NSConcreteArray and NSConcreteMutableArray. Basic operations with the NSArray class cluster now work, and it is set up to coexist nicely with the GNU collection heirarchy. Next I'll do NSDictionary in a similar style. @item From Adam Fedor, there is a new patch to the gcc Objective C runtime that aids dynamic linking. You'll have to apply this patch and reinstall the runtime before you can compile this version of libgnustep-base. @item Several bug fixes, including two serious ones in Collection deallocation and behavior adding. See the ChangeLog for details. @end itemize @section Noteworthy changes since version @samp{0.1.5} @itemize @bullet @item Better string handling. NSString is now fleshed out, and I've implemented a scheme by which the GNU String object and OpenStep's NSString can coexist nicely. The OpenStep classes declare their string arguments with (NSString*) just like the standard says, but the preferred (more flexible) way to declare string arguments is (id ); and these two types are set up so that they coexist. There is still more to be done. NSString has several unimplemented methods; GNU String needs some more work. @item Newly implemented classes: MallocAddress, NSString, NSMutableString, NSCString, NSMutableCString. @item Thanks to Pieter Schoenmakers @email{tiggr@@es.ele.tue.nl} we have a new version of the gcc-string.patch that should apply more smoothly. @item Thanks to Adam Fedor @email{fedor@@boulder.colorado.edu} for a bug fix to NXStringTable's. @item Thanks to Mark Lakata @email{lakata@@nsdssp.lbl.gov} for a bug fix to NSZone.c. @ignore @item Thanks to Jeremy Bettis @email{jbettis@cse.unl.edu} for implementing NSDate. (We're waiting for the assignment paperwork to go through before it's included in the release.) @end ignore @item Several bug fixes. Thanks to those who reported them. Credits are in the ChangeLog. @end itemize @section Noteworthy changes since version @samp{0.1.3} This release not well tested at all. We desperately need someone to write a test suite using dejagnu. Any volunteers? I made this release now in order to share the progress that is being made on GNUSTEP. @itemize @bullet @item New GNUSTEP implementations: NSObject, NSAutoreleasePool, NSZone. Thanks to Mark Lakata for NSZone. @item New GNUSTEP implementations included, but not compiled: NSBundle, NSException, NSGeometry, NSNumber, NSValue. Many thanks Adam Fedor. @item Many new GNU classes: String classes! String, MutableString, ConstantString. One interesting feature of the GNU string classes is that that, just like in Smalltalk, they are part of the Collection heirarchy---all the methods you are used to using on other collections can be used on these "collections of characters". You can create ConstantStrings using the @@"" syntax. @item Entire library converted to use @code{retain}, @code{release}, @code{autorelease}, @code{dealloc} instead of @code{free}. @end itemize @section Noteworthy changes since version @samp{0.1.0} @itemize @bullet @item New category: ObjectRetaining. New classes: AutoreleasePool, AutoreleaseStack. @item Bug fixes: Install next-includes properly. New instructions in README.ULTRIX. Time.m patched for Solaris 2.4. test12.m free fix. @end itemize @section Noteworthy changes in version @samp{0.1.0} @itemize @bullet @item Renamed the library from @samp{libcoll} to @samp{libgnustep-base}. (See the end of the file @samp{DISCUSSION} for the background on this name choice.) Several file names changed to reflect this. GNU class interfaces are now included with @samp{objects} prefix, e.g. @samp{#include }. @item Many new classes. Pseudo-random number classes Random, RNGBerkeley and RNGAdditiveCongruential. New stream classes Stream, StdioStream and MemoryStream. New coder classes Coder, TextCoder and BinaryCoder. New network packet transmission classes Port and SocketPort. New remote object messaging classes Connection, Proxy and ConnectedCoder. New protocols Coding and Retaining. New, but unimplemented: Lock and Locking. New but soon-to-disapppear: RetainingNotifier, InvalidationListening. @item Some bug fixes: Fixed the assert typo in Storage.m. The Time class now compiles under Solaris. Fixed insertion bug in CircularArray. NXStringTable_scan.l can now be compiled with lex, not just flex, (thanks to Adam Fedor @email{adam@@bastille.rmnug.org}). Properly detect the difference between gcc running under NEXTSTEP and NeXT's cc. Using autoconf version 2.0. Renamed DelegateList to DelegatePool. Renamed some collection hierarchy methods for better consistency. @item Some directory reorganization so that NeXT-compatible files can be included in the standard way, e.g. #include . Some other NeXT-compatibility improvements: Changed @samp{GNU} prefix to @samp{NX} in List and HashTable. New files zone.[hc] containing dummy stubs for NeXT-compatible zone functions. @end itemize @section Noteworthy changes in version @samp{940524} @itemize @bullet @item A NeXT-compatible NXStringTable object, thanks to Adam Fedor @email{adam@@bastille.rmnug.org}. @item SplayTree and RBTree classes now operational. More methods in Time class implemented. @item Some API cleanup: -delegateListList changed to -delegateListCollection. -includesSameContents: changed to -contentsEqual:. -insertObject:atKey: changed to -putObject:atKey:. See the ChangeLog for more detail. @item Configuration by autoconf in the self-tests directory. Configuration script tests GCC nested functions. Configuration script detects NEXTSTEP and makes the appropriate adjustments, including skipping the NeXT-compatibility classes. @item Bug fixes: BinaryTree rotate methods fixed. Fixed the way @code{ifNone:} and @code{ifAbsent:} functions were called. Fixed the way long elements are printed. Added methods for preventing memory leaks by unfinished enumerations: @code{-newEnumState} and @code{-freeEnumState:}. Several bug fixes in List and Storage; changes for better NeXT-compability. And more. @end itemize @section Noteworthy changes in version @samp{931026} @itemize @bullet @item Installation using @samp{./configure} and @samp{autoconf} @item New BinaryTree and RBTree(unfinished) classes. Rewritten LinkedList class. @item A new scheme for holding non-object elements in classes that require object contents; EltNodeCollector class. @item Archiving with -write: and -read: methods. This involved removing the ability to set the comparison function independent of content type. @item Removed COLL_NO_ELEMENT and friends. Now there are no arbitrary restrictions on which long int's can be stored. Like in Smalltalk, ...ifAbsentCall: methods have been added to replace this functionalty. @item Added a LABMDA() macro for defining small functions in the arg position. @item Removed many ...perform: methods. Use instead the more flexible ...call: methods with LABMDA(). @item Renamed ...Description: methods to ...Encoding: for better use of already-defined objc keyword: @@encode(). @item New in the Collecting protocol: Filtered enumerating instead of filtered shallowCopy'ing. Enumerations still safe when modifying the contents. @item The beginnings of documentation in libcoll.texi. @item Many bug fixes. @item ...and more. @end itemize Also see the @samp{ChangeLog} file for more detail. @ifinfo Copyright @copyright{} 2005 Free Software Foundation Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. @end ifinfo @end ifclear @c end ifclear ANNOUNCE_ONLY gnustep-base-1.29.0/Documentation/readme.texi000066400000000000000000000052741435650067400211630ustar00rootroot00000000000000@chapter Readme @c set the vars GNUSTEP-BASE-VERSION and GCC-VERSION @include version.texi The GNUstep Base Library is a library of general-purpose, non-graphical Objective C objects. For example, it includes classes for strings, object collections, byte streams, typed coders, invocations, notifications, notification dispatchers, moments in time, network ports, remote object messaging support (distributed objects), and event loops. It provides functionality that aims to implement the non-graphical portion of the Apple's Cocoa frameworks (the Foundation library) which came from the OpenStep standard. @section Initial reading The file @samp{NEWS} has the library's feature history. The files @samp{INSTALL} or @samp{GNUstep-HOWTO} (from the web site) gives instructions for installing the library. @section License The GNUstep libraries and library resources are covered under the GNU Lesser Public License. This means you can use these libraries in any program (even non-free programs). If you distribute the libraries along with your program, you must make the improvements you have made to the libraries freely available. You should read the COPYING.LIB file for more information. All files in the @file{Source}, @file{Headers} @file{NSCharacterSets}, @file{NSTimeZones}, and @file{Resources} directories and subdirectories under this are covered under the LGPL. GNUstep tools, test programs, and other files are covered under the GNU Public License. This means if you make changes to these programs, you cannot charge a fee, other than distribution fees, for others to use the program. You should read the COPYING file for more information. All files in the @file{Documentation}, @file{Examples}, @file{Tools}, @file{config}, and @file{macosx} directories are covered under the GPL. With GNUstep-Base, we strongly recommend the use of the ffcall libraries, which provides stack frame handling for NSInvocation and NSConnection. "Ffcall is under GNU GPL. As a special exception, if used in GNUstep or in derivate works of GNUstep, the included parts of ffcall are under GNU LGPL" (Text in quotes provided by the author of ffcall). @section How can you help? @itemize @bullet @item Give us feedback! Tell us what you like; tell us what you think could be better. Please log bug reports on the GNUstep project page @url{http://savannah.gnu.org/bugs/?group=gnustep} or send bug reports to @email{bug-gnustep@@gnu.org}. @end itemize @example Happy hacking! @end example @ifinfo Copyright @copyright{} 2005 Free Software Foundation Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. @end ifinfo gnustep-base-1.29.0/Examples/000077500000000000000000000000001435650067400157705ustar00rootroot00000000000000gnustep-base-1.29.0/Examples/.cvsignore000066400000000000000000000002431435650067400177670ustar00rootroot00000000000000Makefile *errs dictionary textcoding stdio-stream port-server port-client first-server first-client second-server second-client stdio-stream.txt textcoding.txt gnustep-base-1.29.0/Examples/.gdbinit000066400000000000000000000000131435650067400174030ustar00rootroot00000000000000dir ../src gnustep-base-1.29.0/Examples/GNUmakefile000066400000000000000000000040761435650067400200510ustar00rootroot00000000000000# # examples makefile for the GNUstep Base Library # # Copyright (C) 1997 Free Software Foundation, Inc. # # Written by: Scott Christley # # This file is part of the GNUstep Base Library. # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public # License as published by the Free Software Foundation; either # version 3 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public # License along with this library; if not, write to the Free # Software Foundation, Inc., 51 Franklin Street, Fifth Floor, # Boston, MA 02111 USA. # ifeq ($(GNUSTEP_MAKEFILES),) GNUSTEP_MAKEFILES := $(shell gnustep-config --variable=GNUSTEP_MAKEFILES 2>/dev/null) ifeq ($(GNUSTEP_MAKEFILES),) $(warning ) $(warning Unable to obtain GNUSTEP_MAKEFILES setting from gnustep-config!) $(warning Perhaps gnustep-make is not properly installed,) $(warning so gnustep-config is not in your PATH.) $(warning ) $(warning Your PATH is currently $(PATH)) $(warning ) endif endif ifeq ($(GNUSTEP_MAKEFILES),) $(error You need to set GNUSTEP_MAKEFILES before compiling!) endif PACKAGE_NAME = gnustep-base GNUSTEP_LOCAL_ADDITIONAL_MAKEFILES = ../base.make include $(GNUSTEP_MAKEFILES)/common.make -include ../config.mak # The tools to be created TEST_TOOL_NAME = \ dictionary \ nsconnection \ nsconnection_client \ nsconnection_server \ # The Objective-C source files to be compiled to create each tool dictionary_OBJC_FILES = dictionary.m nsconnection_OBJC_FILES = nsconnection.m nsconnection_client_OBJC_FILES = nsconnection_client.m nsconnection_server_OBJC_FILES = nsconnection_server.m include Makefile.preamble include $(GNUSTEP_MAKEFILES)/test-tool.make include Makefile.postamble gnustep-base-1.29.0/Examples/Makefile.postamble000066400000000000000000000033671435650067400214260ustar00rootroot00000000000000# # Makefile.postamble # # Copyright (C) 1997 Free Software Foundation, Inc. # # Author: Scott Christley # # This file is part of the GNUstep Base Library. # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public # License as published by the Free Software Foundation; either # version 3 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public # License along with this library; see the file COPYING.LIB. # If not, write to the Free Software Foundation, # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # Makefile.postamble # # Project specific makefile rules # # Uncomment the targets you want. # The double colons (::) are important, do not make them single colons # otherwise the normal makefile rules will not be performed. # # Things to do before compiling # before-all:: # Things to do after compiling # after-all:: # Things to do before installing # before-install:: # Things to do after installing # after-install:: # Things to do before uninstalling # before-uninstall:: # Things to do after uninstalling # after-uninstall:: # Things to do before cleaning # before-clean:: # Things to do after cleaning # after-clean:: # Things to do before distcleaning # before-distclean:: # Things to do after distcleaning # after-distclean:: # Things to do before checking # before-check:: # Things to do after checking # after-check:: gnustep-base-1.29.0/Examples/Makefile.preamble000066400000000000000000000035031435650067400212170ustar00rootroot00000000000000# # examples makefile for the GNUstep Base Library # # Copyright (C) 1997 Free Software Foundation, Inc. # # Written by: Scott Christley # # This file is part of the GNUstep Base Library. # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public # License as published by the Free Software Foundation; either # version 3 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public # License along with this library; if not, write to the Free # Software Foundation, Inc., 51 Franklin Street, Fifth Floor, # Boston, MA 02111 USA. # # # Makefile.preamble # # Project specific makefile variables, and additional # # Do not put any Makefile rules in this file, instead they should # be put into Makefile.postamble. # # # Flags dealing with compiling and linking # # Additional flags to pass to the preprocessor ADDITIONAL_CPPFLAGS = $(WARN_FLAGS) # Additional flags to pass to the Objective-C compiler ADDITIONAL_OBJCFLAGS = # Additional flags to pass to the C compiler ADDITIONAL_CFLAGS = # Additional include directories the compiler should search ifeq ($(FOUNDATION_LIB),gnu) ADDITIONAL_INCLUDE_DIRS = -I../Headers endif # Additional LDFLAGS to pass to the linker ADDITIONAL_LDFLAGS = # Additional library directories the linker should search ADDITIONAL_LIB_DIRS = -L../Source/$(GNUSTEP_OBJ_DIR) # # Flags dealing with installing and uninstalling # # Additional directories to be created during installation ADDITIONAL_INSTALL_DIRS = gnustep-base-1.29.0/Examples/custom-zone.m000066400000000000000000000143021435650067400204310ustar00rootroot00000000000000/* Example implementation of a custom zone. Copyright (C) 2005 Free Software Foundation Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. by Yoo C. Chung WARNING: Very little testing has been done, so there is no guarantee that it will work at all. I wouldn't use it for real applications, anyway. */ #include #include #include #include typedef struct _block { struct _block *next; } block; typedef struct _free_chunk { size_t size; struct _free_chunk *next; } free_chunk; typedef struct _custom_zone { NSZone common; objc_mutex_t mutex; free_chunk *free_list; block *block_list; } custom_zone; void custom_free (NSZone *zone, void *ptr); void* custom_malloc (NSZone *zone, size_t size) { free_chunk *chunk; custom_zone *zptr = (custom_zone*)zone; /* Round up 'size' for alignment. */ if (size%sizeof(double) > 0) size = (size/sizeof(double)+1)*sizeof(double); objc_mutex_lock(zptr->mutex); /* Check free list for chunks big enough for request. */ chunk = zptr->free_list; while (chunk != NULL && chunk->size < size) chunk = chunk->next; if (chunk == NULL) /* Get more memory for the zone. */ { size_t new_size, block_size; block *new_block; /* Consider overhead. */ new_size = sizeof(block)+sizeof(size_t)+NSZoneChunkOverhead()+size; /* Round up to a multiple of the granularity. */ if (new_size%zone->gran > 0) block_size = (new_size/zone->gran+1)*zone->gran; else block_size = new_size; /* Get memory from the default zone. You can get memory from somewhere else if you want. We catch exceptions here since we will want to unlock our mutex. */ NS_DURING new_block = NSZoneMalloc(NSDefaultMallocZone(), block_size); NS_HANDLER objc_mutex_unlock(zptr->mutex); [localException raise]; NS_ENDHANDLER /* Register the block as used by the zone. */ NSZoneRegisterRegion(zone, new_block, (void*)new_block+block_size); /* Add to block list. */ new_block->next = zptr->block_list; zptr->block_list = new_block; if (block_size > new_size) /* Add slack to the free list. */ { chunk = (void*)new_block+new_size; chunk->size = block_size-new_size-sizeof(size_t)-NSZoneChunkOverhead(); chunk->next = zptr->free_list; zptr->free_list = chunk; } chunk = (void*)new_block+sizeof(block); chunk->size = new_size-sizeof(size_t)-NSZoneChunkOverhead(); } objc_mutex_unlock(zptr->mutex); return NSZoneRegisterChunk(zone, (void*)chunk+sizeof(size_t)); } void* custom_realloc (NSZone *zone, void *ptr, size_t size) { size_t oldsize; /* Round up for alignment. */ if (size%sizeof(double) > 0) size = (size/sizeof(double)+1)*sizeof(double); /* Get size of given memory chunk. */ oldsize = *((size_t*)(ptr-(NSZoneChunkOverhead()+sizeof(size_t)))); if (oldsize < size) /* Allocate a larger chunk and move contents there. */ { void *newptr; newptr = custom_malloc(zone, size); memcpy(newptr, ptr, size); custom_free(zone, ptr); return newptr; } else return ptr; // Return old memory chunk. } void custom_free (NSZone *zone, void *ptr) { free_chunk *chunk; custom_zone *zptr = (custom_zone*)zone; objc_mutex_lock(zptr->mutex); chunk = ptr-(NSZoneChunkOverhead()+sizeof(size_t)); /* Add chunk to free list. */ chunk->next = zptr->free_list; zptr->free_list = chunk; objc_mutex_unlock(zptr->mutex); } void custom_recycle (NSZone *zone) { block *cur_block, *next_block; custom_zone *zptr = (custom_zone*)zone; /* Deallocating the mutex first assures us that no other thread will be doing anything at the time we recycle the zone. Though another thread using the zone after it's been recycled is another matter. :) */ objc_mutex_deallocate(zptr->mutex); NSDeregisterZone(zone); /* Go through the block list and return them to the default zone. */ cur_block = zptr->block_list; while (cur_block != NULL) { next_block = cur_block->next; NSZoneFree(NSDefaultMallocZone(), cur_block); cur_block = next_block; } /* Free the zone name if it has been set. */ if (zone->name != nil) [(zone->name) release]; /* Free the data structure holding the zone. */ NSZoneFree(NSDefaultMallocZone(), zone); } BOOL custom_check (NSZone *zone) { [NSException raise: NSGenericException format: @"Not implemented"]; return NO; // Won't be reached. } struct NSZoneStats custom_stats (NSZone *zone) { struct NSZoneStats dummy; [NSException raise: NSGenericException format: @"Not implemented"]; return dummy; // Won't be reached. } NSZone* CreateCustomZone (size_t start, size_t gran) { free_chunk *chunk; block *new_block; custom_zone *zone; /* Round up for alignment. */ if (start%sizeof(double) > 0) start = (start/sizeof(double)+1)*sizeof(double); if (gran%sizeof(double) > 0) gran = (gran/sizeof(double)+1)*sizeof(double); zone = NSZoneMalloc(NSDefaultMallocZone(), sizeof(custom_zone)); zone->common.malloc = custom_malloc; zone->common.realloc = custom_realloc; zone->common.free = custom_free; zone->common.recycle = custom_recycle; zone->common.check = custom_check; zone->common.stats = custom_stats; zone->common.gran = gran; zone->common.name = nil; // We could set a default name, instead. zone->mutex = objc_mutex_allocate(); /* Catch exceptions to prevent memory leaks. */ NS_DURING new_block = NSZoneMalloc(NSDefaultMallocZone(), start); NS_HANDLER objc_mutex_deallocate(zone->mutex); NSZoneFree(NSDefaultMallocZone(), zone); [localException raise]; NS_ENDHANDLER new_block->next = NULL; chunk = (void*)new_block+sizeof(block); chunk->size = start-(sizeof(block)+sizeof(size_t)+NSZoneChunkOverhead()); zone->block_list = new_block; zone->free_list = chunk; NSZoneRegisterRegion((NSZone*)zone, new_block, (void*)new_block+start); return (NSZone*)zone; } gnustep-base-1.29.0/Examples/dictionary.m000066400000000000000000000027021435650067400203140ustar00rootroot00000000000000/* A simple demonstration of the NSDictionary object. Copyright (C) 2005 Free Software Foundation Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. In this example the NSDictionary holds int's which are keyed by strings. */ #include #include #include #include #include int main() { NSMutableDictionary *d; ENTER_POOL /* Create a Dictionary object. */ d = [[NSMutableDictionary alloc] initWithCapacity: 32]; /* Load the dictionary with some items */ [d setObject: [NSNumber numberWithInt: 1] forKey: @"one"]; [d setObject: [NSNumber numberWithInt: 2] forKey: @"two"]; [d setObject: [NSNumber numberWithInt: 3] forKey: @"three"]; [d setObject: [NSNumber numberWithInt: 4] forKey: @"four"]; [d setObject: [NSNumber numberWithInt: 5] forKey: @"five"]; [d setObject: [NSNumber numberWithInt: 6] forKey: @"six"]; NSLog(@"There are %u elements stored in the dictionary\n", [d count]); NSLog(@"Element %d is stored at \"%s\"\n", [[d objectForKey: @"three"] intValue], "three"); NSLog(@"Removing element stored at \"three\"\n"); [d removeObjectForKey: @"three"]; NSLog(@"Now there are %u elements stored in the dictionary\n", [d count]); LEAVE_POOL exit(0); } gnustep-base-1.29.0/Examples/diningPhilosophers.m000066400000000000000000000063661435650067400220310ustar00rootroot00000000000000/* diningPhilosophers.h Five hungry philosophers testing locks and threads This program loops indefinitely. Copyright (C) 1996 Free Software Foundation, Inc. Author: Scott Christley Date: 1996 This file is part of the GNUstep Application Kit Library. This file is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this file; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #include #include #include #include // Conditions #define NO_FOOD 1 #define FOOD_SERVED 2 // NSLocks ... umm I mean forks id forks[5]; id fork_lock; // // A class of hungry philosophers // @interface Philosopher : NSObject { int chair; } // Instance methods - (void)sitAtChair:(NSNumber*)position; - (int)chair; @end @implementation Philosopher // Instance methods - (void)sitAtChair:(NSNumber*)position { int i; // Sit down chair = [position intValue]; // Its a constant battle to feed yourself while (1) { [fork_lock lockWhenCondition:FOOD_SERVED]; // Get the fork to our left [forks[chair] lockWhenCondition:FOOD_SERVED]; // Get the fork to our right [forks[(chair + 1) % 5] lockWhenCondition:FOOD_SERVED]; [fork_lock unlock]; // Start eating! printf("Philosopher %d can start eating.\n", chair); fflush(stdout); for (i = 0;i < 100000; ++i) { if ((i % 10000) == 0) printf("Philosopher %d is eating.\n", chair); fflush(stdout); } // Done eating printf("Philosopher %d is done eating.\n", chair); fflush(stdout); // Drop the fork to our left [forks[chair] unlock]; // Drop the fork to our right [forks[(chair + 1) % 5] unlock]; // Wait until we are hungry again for (i = 0;i < 1000000 * (chair + 1); ++i) ; } // We never get here, but this is what we should do [NSThread exit]; } - (int)chair { return chair; } @end // // my main for the test app // int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; int i; id p[5]; // Create the locks for (i = 0;i < 5; ++i) { forks[i] = [[NSConditionLock alloc] initWithCondition:NO_FOOD]; [forks[i] lock]; } fork_lock = [[NSConditionLock alloc] initWithCondition:NO_FOOD]; [fork_lock lock]; // Create the philosophers for (i = 0;i < 5; ++i) p[i] = [[Philosopher alloc] init]; // Have them sit at the table for (i = 0;i < 5; ++i) [NSThread detachNewThreadSelector:@selector(sitAtChair:) toTarget:p[i] withObject: [NSNumber numberWithInt: i]]; // Now let them all eat [fork_lock unlockWithCondition:FOOD_SERVED]; for (i = 0;i < 5; ++i) [forks[i] unlockWithCondition:FOOD_SERVED]; while (1); [arp release]; } gnustep-base-1.29.0/Examples/nsconnection.m000066400000000000000000000044551435650067400206560ustar00rootroot00000000000000/* Test/example program for the base library Copyright (C) 2005 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is part of the GNUstep Base Library. */ #include id myServer; @interface Tester : NSObject { } + (void) connectWithPorts: (NSArray*)portArray; + (void) setServer: (id)anObject; + (void) startup; - (int) doIt; - (void) testPerform: (id)anObject; @end @implementation Tester + (void) connectWithPorts: (NSArray*)portArray { NSAutoreleasePool *pool; NSConnection *serverConnection; Tester *serverObject; pool = [[NSAutoreleasePool alloc] init]; serverConnection = [NSConnection connectionWithReceivePort: [portArray objectAtIndex: 0] sendPort: [portArray objectAtIndex: 1]]; serverObject = [[self alloc] init]; [serverObject performSelectorOnMainThread: @selector(testPerform:) withObject: @"84" waitUntilDone: NO]; [(id)[serverConnection rootProxy] setServer: serverObject]; [serverObject release]; [[NSRunLoop currentRunLoop] run]; [pool release]; [NSThread exit]; return; } + (void) setServer: (id)anObject { myServer = [anObject retain]; NSLog(@"Got %d", [myServer doIt]); exit(0); } + (void) startup { NSPort *port1; NSPort *port2; NSArray *portArray; NSConnection *conn; port1 = [NSPort port]; port2 = [NSPort port]; conn = [[NSConnection alloc] initWithReceivePort: port1 sendPort: port2]; [conn setRootObject: self]; /* Ports switched here. */ portArray = [NSArray arrayWithObjects: port2, port1, nil]; [NSThread detachNewThreadSelector: @selector(connectWithPorts:) toTarget: self withObject: portArray]; return; } - (int) doIt { return 42; } - (void) testPerform: (id)anObject { NSLog(@"Test perform: %@", anObject); } @end int main(int argc, char *argv[], char **env) { NSAutoreleasePool *pool; #if LIB_FOUNDATION_LIBRARY || defined(GS_PASS_ARGUMENTS) [NSProcessInfo initializeWithArguments:argv count:argc environment:env]; #endif pool = [[NSAutoreleasePool alloc] init]; [NSConnection setDebug: YES]; [Tester startup]; [[NSRunLoop currentRunLoop] run]; [pool release]; return 0; } gnustep-base-1.29.0/Examples/nsconnection_client.m000066400000000000000000000375141435650067400222160ustar00rootroot00000000000000/* Test/example program for the base library Copyright (C) 2005 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is part of the GNUstep Base Library. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "server.h" #include "wgetopt.h" /* * Dummy declaration with different bycopy/byref info from the one * in the server ... we expect the info from the server to be used. */ @interface Dummy : NSObject - (id) quietBycopy: (byref id)a; @end @interface CallbackClient : NSObject - (BOOL) callback; @end @implementation CallbackClient - (BOOL) callback { return YES; } @end @interface Auth : NSObject @end @implementation Auth - (BOOL) authenticateComponents: (NSMutableArray*)components withData: (NSData*)authData { unsigned count = [components count]; while (count-- > 0) { id obj = [components objectAtIndex: count]; if ([obj isKindOfClass: [NSData class]] == YES) { NSMutableData *d = [obj mutableCopy]; unsigned l = [d length]; char *p = (char*)[d mutableBytes]; while (l-- > 0) p[l] ^= 42; [components replaceObjectAtIndex: count withObject: d]; RELEASE(d); } } return YES; } @end int con_data (id prx) { id pool; BOOL b, br; unsigned char uc, ucr; char c, cr; short s, sr; int i, ir; long l, lr; float flt, fltr; double dbl, dblr; char *str; id obj; small_struct ss = {12}; foo ffoo = {'Z', 1234.5678, 99, "cow", 9876543}; foo bck; printf("Testing data sending\n"); printf("Boolean:\n"); b = YES; printf(" sending %d", b); br = [prx sendBoolean: b]; printf(" got %d", br); if (b == !br) printf(" ...ok\n"); else printf(" *** ERROR ***\n"); br = b = YES; printf(" sending ptr to %d", br); [prx getBoolean: &br]; printf(" got %d", br); if (b == !br) printf(" ...ok\n"); else printf(" *** ERROR ***\n"); printf(" error is ok (due to incorrect encoding by gcc)\n"); #define TEST_CALL(test, send, got, sendp, var, varr, val, msg1, msg2) \ pool = [NSAutoreleasePool new]; \ printf(test); \ var = val; \ printf(send, var); \ varr = [prx msg1 var]; \ printf(got, varr); \ if (varr != (var+ADD_CONST)) \ printf(" *** ERROR ***\n"); \ else \ printf(" ...ok\n"); \ varr = var = val+1; \ printf(sendp, varr); \ [prx msg2 &varr]; \ printf(got, varr); \ if (varr != (var+ADD_CONST)) \ printf(" *** ERROR ***\n"); \ else \ printf(" ...ok\n"); \ [pool release]; #define TEST_FCALL(test, send, got, sendp, var, varr, val, msg1, msg2) \ pool = [NSAutoreleasePool new]; \ printf(test); \ var = val; \ printf(send, var); \ varr = [prx msg1 var]; \ printf(got, varr); \ if (varr - (var+ADD_CONST) > 1e-3) \ printf(" *** ERROR ***\n"); \ else \ printf(" ...ok\n"); \ varr = var = val+1; \ printf(sendp, varr); \ [prx msg2 &varr]; \ printf(got, varr); \ if (varr - (var+ADD_CONST) > 1e-3) \ printf(" *** ERROR ***\n"); \ else \ printf(" ...ok\n"); \ [pool release]; TEST_CALL("UChar:\n", " sending %d", " got %d", " sending ptr to %d", uc, ucr, 23, sendUChar:, getUChar:) printf(" error is ok (due to incorrect encoding by gcc)\n"); TEST_CALL("Char:\n", " sending %d", " got %d", " sending ptr to %d", c, cr, 23, sendChar:, getChar:) printf(" error is ok (due to incorrect encoding by gcc)\n"); TEST_CALL("Short:\n", " sending %hd", " got %hd", " sending ptr to %hd", s, sr, 23, sendShort:, getShort:) TEST_CALL("Int:\n", " sending %d", " got %d", " sending ptr to %d", i, ir, 23, sendInt:, getInt:) TEST_CALL("Long:\n", " sending %ld", " got %ld", " sending ptr to %ld", l, lr, 23, sendLong:, getLong:) TEST_FCALL("Float:\n", " sending %f", " got %f", " sending ptr to %f", flt, fltr, 23.2, sendFloat:, getFloat:) TEST_FCALL("Double:\n", " sending %g", " got %g", " sending ptr to %g", dbl, dblr, 23.2, sendDouble:, getDouble:) flt = 2.718; dbl = 3.14159265358979323846264338327; printf(" sending double %f, float %f\n", dbl, flt); [prx sendDouble:dbl andFloat:flt]; pool = [NSAutoreleasePool new]; printf("String:\n"); str = "My String 1"; printf(" sending (%s)", str); str = [prx sendString: str]; printf(" got (%s)\n", str); [pool release]; pool = [NSAutoreleasePool new]; str = "My String 3"; printf(" sending ptr to (%s)", str); [prx getString: &str]; printf(" got (%s)\n", str); [pool release]; pool = [NSAutoreleasePool new]; printf("Small Struct:\n"); //printf(" sending %x", ss.z); //ss = [prx sendSmallStruct: ss]; //printf(" got %x\n", ss.z); printf(" sending ptr to %x", ss.z); [prx getSmallStruct: &ss]; printf(" got %x\n", ss.z); [pool release]; #if 1 || !defined(__MINGW__) pool = [NSAutoreleasePool new]; printf("Struct:\n"); memcpy(&bck, &ffoo, sizeof(bck)); printf(" sending c='%c',d=%g,i=%d,s=%s,l=%ld", ffoo.c, ffoo.d, ffoo.i, ffoo.s, ffoo.l); ffoo = [prx sendStruct: ffoo]; printf(" got c='%c',d=%g,i=%d,s=%s,l=%ld\n", ffoo.c, ffoo.d, ffoo.i, ffoo.s, ffoo.l); memcpy(&ffoo, &bck, sizeof(bck)); printf(" sending ptr to c='%c',d=%g,i=%d,s=%s,l=%ld", ffoo.c, ffoo.d, ffoo.i, ffoo.s, ffoo.l); [prx getStruct: &ffoo]; printf(" got c='%c',d=%g,i=%d,s=%s,l=%ld\n", ffoo.c, ffoo.d, ffoo.i, ffoo.s, ffoo.l); [pool release]; #endif pool = [NSAutoreleasePool new]; printf("Object:\n"); obj = [NSObject new]; [prx addObject: obj]; // FIXME: Why is this needed? printf(" sending %s", [[obj description] cString]); obj = [prx sendObject: obj]; printf(" got %s\n", [[obj description] cString]); printf(" sending ptr to %s", [[obj description] cString]); [prx getObject: &obj]; printf(" got %s\n", [[obj description] cString]); [pool release]; printf("Many Arguments:\n"); [prx manyArgs:1 :2 :3 :4 :5 :6 :7 :8 :9 :10 :11 :12]; printf("Done\n"); return 0; } int con_messages (id prx) { id obj; Protocol *pc = @protocol(ClientProtocol); Protocol *ps = @protocol(ServerProtocol); obj = [NSObject new]; printf("Conforms to protocol (remote) should be 1: %d\n", [prx conformsToProtocol: ps]); printf("Conforms to protocol (remote) should be 0: %d\n", [prx conformsToProtocol: pc]); [prx setProtocolForProxy: ps]; printf("Conforms to protocol (local) should be 1: %d\n", [prx conformsToProtocol: ps]); printf("Conforms to protocol (local) should be 0: %d\n", [prx conformsToProtocol: pc]); printf("Oneway Void message:\n"); [prx shout]; printf(" ok\n"); printf("Testing exception in method with return value:\n"); NS_DURING { [prx exceptionTest1]; printf(" ERROR\n"); } NS_HANDLER { printf(" ok ... %s\n", [[localException description] cString]); } NS_ENDHANDLER printf("Testing exception in method with void return:\n"); NS_DURING { [prx exceptionTest2]; printf(" ERROR\n"); } NS_HANDLER { printf(" ok ... %s\n", [[localException description] cString]); } NS_ENDHANDLER printf("Testing exception in oneway void method:\n"); NS_DURING { [prx exceptionTest3]; printf(" ok\n"); } NS_HANDLER { printf(" ERROR ... %s\n", [[localException description] cString]); } NS_ENDHANDLER /* this next line doesn't actually test callbacks, it tests sending the same object twice in the same message. */ printf("Send same object twice in message\n"); [prx sendObject: prx]; printf(" ok\n"); printf("performSelector:\n"); if (prx != [prx performSelector: GSSelectorFromName("self")]) printf(" ERROR\n"); else printf(" ok\n"); printf("Testing bycopy/byref:\n"); [prx sendBycopy: obj]; [prx quietBycopy: obj]; #ifdef _F_BYREF [prx sendByref: obj]; [prx sendByref: @"hello"]; [prx sendByref: [NSDate date]]; { NSMutableString *str = [NSMutableString string]; [prx modifyByref: str]; printf(" Modified '%s'\n", [str lossyCString]); } #endif printf(" ok\n"); printf("Done\n"); return 0; } int con_benchmark (id prx) { int i; NSDate *d = [NSDate date]; NSMutableData *sen = [NSMutableData data]; id localObj; id rep; printf("Benchmarking\n"); [sen setLength: 100000]; rep = [prx sendObject: sen]; printf(" Sent: 0x%p, Reply: 0x%p, Length: %d\n", sen, rep, [rep length]); localObj = [[NSObject alloc] init]; [prx addObject: localObj]; // FIXME: Why is this needed? for (i = 0; i < 10000; i++) { #if 0 k = [prx count]; for (j = 0; j < k; j++) { id remote_peer_obj = [prx objectAt: j]; } #endif [prx echoObject: localObj]; } printf(" Delay is %f\n", [d timeIntervalSinceNow]); printf("Done\n"); return 0; } int con_statistics (id prx) { int j; id localObj, cobj, a, o; printf("------------------------------------------------------------\n"); printf("Printing Statistics\n"); localObj = [[NSObject alloc] init]; [prx outputStats: localObj]; printf(" >>list proxy's hash is 0x%d\n", [prx hash]); printf(" >>list proxy's self is 0x%p = 0x%p\n", [prx self], prx); printf(" >>proxy's description is (%s)\n", [[prx description] lossyCString]); cobj = [prx connectionForProxy]; o = [cobj statistics]; a = [o allKeys]; for (j = 0; j < [a count]; j++) { id k = [a objectAtIndex:j]; id v = [o objectForKey:k]; printf(" %s - %s\n", [k cString], [[v description] cString]); } printf("------------------------------------------------------------\n"); return 0; } int con_loop (id prx) { NSAutoreleasePool *arp; id cobj; arp = [NSAutoreleasePool new]; [prx addObject: [NSObject new]]; // So loss of this connection is logged. cobj = [prx connectionForProxy]; printf("%d\n", [cobj retainCount]); printf("%s\n", [[[cobj statistics] description] cString]); //printf("%s\n", GSDebugAllocationList(YES)); printf("loop left running idle for 30 seconds\n"); [[NSRunLoop currentRunLoop] runUntilDate: [NSDate dateWithTimeIntervalSinceNow: 30]]; [cobj invalidate]; [arp release]; return 0; } int con_objects (id prx) { int j, k; id localObj; localObj = [NSObject new]; [prx addObject:localObj]; k = [prx count]; for (j = 0; j < k; j++) { id remote_peer_obj = [prx objectAt:j]; printf("triangle %d object proxy's hash is 0x%x\n", j, (unsigned)[remote_peer_obj hash]); #if 0 /* xxx look at this again after we use release/retain everywhere */ if ([remote_peer_obj isProxy]) [remote_peer_obj release]; #endif remote_peer_obj = [prx objectAt:j]; printf("repeated triangle %d object proxy's hash is 0x%x\n", j, (unsigned)[remote_peer_obj hash]); } return 0; } int con_callback (id prx) { int j, k; id localObj; localObj = [CallbackClient new]; [prx registerClient: localObj]; k = 1000; for (j = 0; j < k; j++) { ENTER_POOL [prx unregisterClient: localObj]; [prx registerClient: localObj]; [prx tryClientCallback]; if (j < 10 || j %10 == 0) printf("repeated client registration and callback %d\n", j); LEAVE_POOL } printf("repeated client registration and callback %d\n", j); RELEASE(localObj); return 0; } void usage(const char *program) { printf("Usage: %s [-ds] [t|b|m|l|o] [host] [server]\n", program); printf(" -d - Debug connection\n"); printf(" -s - Print Statistics\n"); printf(" -t - Data type test [default]\n"); printf(" -b - Benchmark test\n"); printf(" -m - Messaging test\n"); printf(" -l - Loop test\n"); printf(" -o - Objects test\n"); printf(" -c - Connect test\n"); printf(" -r - Registration and callback test\n"); } typedef enum { NO_TEST, TYPE_TEST, BENCHMARK_TEST, MESSAGE_TEST, LOOP_TEST, OBJECT_TEST, CONNECT_TEST, CALLBACK_TEST } test_t; int main (int argc, char *argv[], char **env) { int c, debug, stats; test_t type_test; id cobj, prx; unsigned connect_attempts; NSAutoreleasePool *arp; NSPortNameServer *ns; Auth *auth; #if !defined(__MINGW__) extern int optind; extern char *optarg; #endif [NSProcessInfo initializeWithArguments: argv count: argc environment: env]; arp = [NSAutoreleasePool new]; auth = [Auth new]; GSDebugAllocationActive(YES); setvbuf(stdout, 0, _IONBF, 0); debug = 0; type_test = 0; stats = 0; while ((c = wgetopt(argc, argv, "hdtbmslocr")) != EOF) switch (c) { case 'd': debug++; break; case 't': type_test = TYPE_TEST; break; case 'b': type_test = BENCHMARK_TEST; break; case 'm': type_test = MESSAGE_TEST; break; case 's': stats = 1; break; case 'l': type_test = LOOP_TEST; break; case 'o': type_test = OBJECT_TEST; break; case 'c': type_test = CONNECT_TEST; break; case 'r': type_test = CALLBACK_TEST; break; case 'h': usage(argv[0]); exit(0); break; default: #if 0 usage(argv[0]); exit(1); #endif break; } if (type_test == NO_TEST) type_test = TYPE_TEST; if (type_test == CONNECT_TEST) connect_attempts = 100000; else connect_attempts = 1; if (debug > 0) { [NSConnection setDebug: debug]; [NSDistantObject setDebug: debug]; [NSObject enableDoubleReleaseCheck: YES]; } ns = [NSSocketPortNameServer sharedInstance]; while (connect_attempts-- > 0) { if (optind < argc) { if (optind+1 < argc) prx = [NSConnection rootProxyForConnectionWithRegisteredName: [NSString stringWithCString: argv[optind+1]] host: [NSString stringWithCString:argv[optind]] usingNameServer: ns]; else prx = [NSConnection rootProxyForConnectionWithRegisteredName: @"test2server" host:[NSString stringWithCString:argv[optind]] usingNameServer: ns]; } else prx = [NSConnection rootProxyForConnectionWithRegisteredName: @"test2server" host: @"" usingNameServer: ns]; if (prx == nil) { printf("ERROR: Failed to connect to server\n"); return -1; } if (type_test == CONNECT_TEST) { NSLog(@"Made connection\n"); if (connect_attempts > 0) { RELEASE(arp); arp = [NSAutoreleasePool new]; } } } #if 1 /* Check that we can retain the connection, release the proxy, * and then regain the proxy from the connection. */ cobj = RETAIN([prx connectionForProxy]); RELEASE(arp); arp = [NSAutoreleasePool new]; prx = [cobj rootProxy]; AUTORELEASE(cobj); #else cobj = [prx connectionForProxy]; #endif [cobj setDelegate:auth]; [cobj setRequestTimeout:180.0]; [cobj setReplyTimeout:180.0]; [prx print: "This is a message from the client. Starting Tests!"]; switch (type_test) { case TYPE_TEST: con_data (prx); break; case BENCHMARK_TEST: con_benchmark (prx); break; case MESSAGE_TEST: con_messages (prx); break; case LOOP_TEST: con_loop (prx); break; case OBJECT_TEST: con_objects (prx); break; case CALLBACK_TEST: con_callback (prx); break; default: break; } if (stats) con_statistics (prx); [cobj invalidate]; [arp release]; return 0; } gnustep-base-1.29.0/Examples/nsconnection_server.m000066400000000000000000000307341435650067400222430ustar00rootroot00000000000000/* Test/example program for the base library Copyright (C) 2005 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is part of the GNUstep Base Library. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #define IN_SERVER 1 #include "server.h" #include "wgetopt.h" @implementation Server - (NSData*) authenticationDataForComponents: (NSMutableArray*)components { unsigned count = [components count]; while (count-- > 0) { id obj = [components objectAtIndex: count]; if ([obj isKindOfClass: [NSData class]] == YES) { NSMutableData *d = [obj mutableCopy]; unsigned l = [d length]; char *p = (char*)[d mutableBytes]; while (l-- > 0) p[l] ^= 42; [components replaceObjectAtIndex: count withObject: d]; RELEASE(d); } } return [NSData data]; } - init { the_array = [[NSMutableArray alloc] init]; return self; } - (unsigned) count { return [the_array count]; } - (void) addObject: o { [the_array addObject:o]; } - objectAt: (unsigned)i { if (i < [the_array count]) return [the_array objectAtIndex: i]; else return nil; } - echoObject: obj { return obj; } - (int) exceptionTest1 { [NSException raise: @"Test1" format: @"exception1"]; return 111; } - (void) exceptionTest2 { [NSException raise: @"Test2" format: @"exception2"]; } - (void) exceptionTest3 { [NSException raise: @"Test3" format: @"exception3"]; } - print: (const char *)msg { printf(">>%s<<\n", msg); fflush(stdout); return self; } - (BOOL) sendBoolean: (BOOL)b { printf("(%s) got %d, returning %d\n", GSNameFromSelector(_cmd), (int)b, (int)(!b)); fflush(stdout); return !b; } /* This causes problems, because the runtime encodes this as "*", a string! */ - (void) getBoolean: (BOOL*)bp { BOOL rbp = !(*bp); printf("(%s) got %d, returning %d\n", GSNameFromSelector(_cmd), (int)*bp, (int)rbp); fflush(stdout); *bp = rbp; } - (unsigned char) sendUChar: (unsigned char)num { unsigned char rnum = num + ADD_CONST; printf("(%s) got %d, returning %d\n", GSNameFromSelector(_cmd), (int)num, (int)rnum); fflush(stdout); return rnum; } /* This causes problems, because the runtime encodes this as "*", a string! */ - (void) getUChar: (unsigned char *)num { unsigned char rnum = *num + ADD_CONST; printf("(%s) got %d, returning %d\n", GSNameFromSelector(_cmd), (int)(*num), (int)rnum); *num = rnum; fflush(stdout); } - (char) sendChar: (char)num { char rnum = num + ADD_CONST; printf("(%s) got %d, returning %d\n", GSNameFromSelector(_cmd), (int)num, (int)rnum); fflush(stdout); return rnum; } - (void) getChar: (char *)num { char rnum = *num + ADD_CONST; printf("(%s) got %d, returning %d\n", GSNameFromSelector(_cmd), (int)(*num), (int)rnum); *num = rnum; fflush(stdout); } - (short) sendShort: (short)num { short rnum = num + ADD_CONST; printf("(%s) got %hd, returning %hd\n", GSNameFromSelector(_cmd), num, rnum); fflush(stdout); return rnum; } - (void) getShort: (short *)num { short rnum = *num + ADD_CONST; printf("(%s) got %hd, returning %hd\n", GSNameFromSelector(_cmd), (*num), rnum); *num = rnum; fflush(stdout); } - (int) sendInt: (int)num { int rnum = num + ADD_CONST; printf("(%s) got %d, returning %d\n", GSNameFromSelector(_cmd), num, rnum); fflush(stdout); return rnum; } - (void) getInt: (int *)num { int rnum = *num + ADD_CONST; printf("(%s) got %d, returning %d\n", GSNameFromSelector(_cmd), *num, rnum); *num = rnum; fflush(stdout); } - (long) sendLong: (long)num { long rnum = num + ADD_CONST; printf("(%s) got %ld, returning %ld\n", GSNameFromSelector(_cmd), num, rnum); fflush(stdout); return rnum; } - (void) getLong: (long *)num { long rnum = *num + ADD_CONST; printf("(%s) got %ld, returning %ld\n", GSNameFromSelector(_cmd), *num, rnum); *num = rnum; fflush(stdout); } - (float) sendFloat: (float)num { float rnum = num + ADD_CONST; printf("(%s) got %f, returning %f\n", GSNameFromSelector(_cmd), num, rnum); fflush(stdout); return rnum; } - (void) getFloat: (float *)num { float rnum = *num + ADD_CONST; printf("(%s) got %f, returning %f\n", GSNameFromSelector(_cmd), *num, rnum); *num = rnum; fflush(stdout); } - (double) sendDouble: (double)num { double rnum = num + ADD_CONST; printf("(%s) got %g, returning %g\n", GSNameFromSelector(_cmd), num, rnum); fflush(stdout); return rnum; } - (void) getDouble: (double *)num { double rnum = *num + ADD_CONST; printf("(%s) got %g, returning %g\n", GSNameFromSelector(_cmd), *num, rnum); *num = rnum; fflush(stdout); } - (small_struct) sendSmallStruct: (small_struct)str { char rnum = str.z + ADD_CONST; printf("(%s) got %d, returning %d\n", GSNameFromSelector(_cmd), str.z, rnum); fflush(stdout); str.z = rnum; return str; } - (void) getSmallStruct: (small_struct *)str { char rnum = str->z + ADD_CONST; printf("(%s) got %d, returning %d\n", GSNameFromSelector(_cmd), str->z, rnum); fflush(stdout); str->z = rnum; } - (foo) sendStruct: (foo)f { foo f2 = {'A', 123.456, 1, "horse", 987654}; printf("(%s) got c='%c', d=%g, i=%d, s=%s, l=%lu", GSNameFromSelector(_cmd), f.c, f.d, f.i, f.s, f.l); fflush(stdout); printf(" returning c='%c', d=%g, i=%d, s=%s, l=%lu\n", f2.c, f2.d, f2.i, f2.s, f2.l); fflush(stdout); return f2; } - (void) getStruct: (foo *)f { foo f2 = {'A', 123.456, 1, "horse", 987654}; printf("(%s) got c='%c', d=%g, i=%d, s=%s, l=%lu", GSNameFromSelector(_cmd), f->c, f->d, f->i, f->s, f->l); fflush(stdout); printf(" returning c='%c', d=%g, i=%d, s=%s, l=%lu\n", f2.c, f2.d, f2.i, f2.s, f2.l); fflush(stdout); *f = f2; } - sendObject: (id)str { printf ("(%s) got object (%s)\n", GSNameFromSelector(_cmd), GSClassNameFromObject(str)); fflush(stdout); return str; } - (void) getObject: (id *)str { static NSString *ret = @"hello"; printf ("(%s) got object (%s)\n", GSNameFromSelector(_cmd), GSClassNameFromObject(*str)); *str = ret; printf(" returning (%s)\n", [*str cString]); fflush(stdout); } - (char *) sendString: (char *)str { printf ("(%s) got string (%s)", GSNameFromSelector(_cmd), str); str[0] = 'N'; printf(" returning (%s)\n", str); fflush(stdout); return str; } - (void) getString: (char **)str { static char *ret = "hello"; printf ("(%s) got string (%s)", GSNameFromSelector(_cmd), *str); *str = ret; printf(" returning (%s)\n", *str); fflush(stdout); } - (oneway void) shout { printf ("(%s) got it\n", GSNameFromSelector(_cmd)); fflush(stdout); } /* sender must also respond to 'bounce:count:' */ - bounce: sender count: (int)c { printf ("(%s) got message %d, bouncing back %d", GSNameFromSelector(_cmd), c, c-1); fflush(stdout); if (--c) [sender bounce:self count:c]; return self; } - (void) outputStats:obj { id c = [obj connectionForProxy]; id o = [c statistics]; id a = [o allKeys]; int j; printf("------------------------------------------------------------\n"); printf("Printing Statistics\n"); printf(" Number of connections - %d\n", [[NSConnection allConnections] count]); printf(" This connection -\n"); for (j = 0; j < [a count]; j++) { id k = [a objectAtIndex:j]; id v = [o objectForKey:k]; printf(" %s - %s\n", [k cString], [[v description] cString]); } printf("------------------------------------------------------------\n"); fflush(stdout); } /* Doesn't work because GCC generates the wrong encoding: "@0@+8:+12^i+16" */ - sendArray: (int[3])a { printf(" >> array %d %d %d\n", a[0], a[1], a[2]); fflush(stdout); return self; } - sendStructArray: (struct myarray)ma { printf(" >>struct array %d %d %d\n", ma.a[0], ma.a[1], ma.a[2]); fflush(stdout); return self; } - sendDouble: (double)d andFloat: (float)f { printf("(%s) got double %f, float %f\n", GSNameFromSelector(_cmd), d, f); fflush(stdout); return self; } - quietBycopy: (bycopy id)o { printf(" >> quiet bycopy class is %s\n", GSClassNameFromObject(o)); fflush(stdout); return self; } - sendBycopy: (bycopy id)o { printf(" >> bycopy class is %s\n", GSClassNameFromObject(o)); fflush(stdout); return self; } #ifdef _F_BYREF - sendByref: (byref id)o { printf(" >> byref class is %s\n", GSClassNameFromObject(o)); fflush(stdout); return self; } - modifyByref: (byref NSMutableString *)o { printf(" >> byref class is %s\n", GSClassNameFromObject(o)); fflush(stdout); [o appendString: @"hello"]; return self; } #endif - manyArgs: (int)i1 : (int)i2 : (int)i3 : (int)i4 : (int)i5 : (int)i6 : (int)i7 : (int)i8 : (int)i9 : (int)i10 : (int)i11 : (int)i12 { printf("manyArgs: got %d %d %d %d %d %d %d %d %d %d %d %d\n", i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12); fflush(stdout); return self; } - connectionBecameInvalid: notification { id anObj = [notification object]; if ([anObj isKindOfClass: [NSConnection class]]) { int i, count = [the_array count]; for (i = count-1; i >= 0; i--) { id o = [the_array objectAtIndex: i]; if ([o isProxy] && [o connectionForProxy] == anObj) [the_array removeObjectAtIndex: i]; } if (count != [the_array count]) printf("$$$$$ connectionBecameInvalid: removed from the_array\n"); } else { [self error:"non Connection is invalid"]; } return self; } - (NSConnection*) connection: ancestor didConnect: newConn { printf("%s\n", GSNameFromSelector(_cmd)); [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(connectionBecameInvalid:) name: NSConnectionDidDieNotification object: newConn]; [newConn setDelegate: self]; return newConn; } - (oneway void) registerClient: (id)client { ASSIGN(registered_client, client); } - (oneway void) unregisterClient: (id)client { DESTROY(registered_client); } - (BOOL) tryClientCallback { return [registered_client callback]; } @end void usage(const char *program) { printf("Usage: %s [-d -t#] [server_name]\n", program); printf(" -d - Debug connection\n"); printf(" -t - Timeout after # seconds\n"); } int main(int argc, char *argv[], char **env) { int i, debug, timeout; id s = [[Server alloc] init]; id l; id o = [[NSObject alloc] init]; NSConnection *c; NSPortNameServer *ns; NSPort *port; NSAutoreleasePool *arp = [NSAutoreleasePool new]; #if !defined(__MINGW__) extern int optind; extern char *optarg; #endif l = [NSProtocolChecker protocolCheckerWithTarget: s protocol: @protocol(ServerProtocol)]; [NSProcessInfo initializeWithArguments: argv count: argc environment: env]; debug = 0; timeout = 0; while ((i = wgetopt(argc, argv, "hdt:")) != EOF) switch (i) { case 'd': debug++; break; case 't': timeout = atoi(optarg);; break; case 'h': usage(argv[0]); exit(0); break; default: #if 0 usage(argv[0]); exit(1); #endif break; } #if NeXT_runtime [NSDistantObject setProtocolForProxies:@protocol(AllProxies)]; #endif if (debug > 0) { [NSDistantObject setDebug: debug]; [NSConnection setDebug: debug]; [NSObject enableDoubleReleaseCheck: YES]; } ns = [NSSocketPortNameServer sharedInstance]; port = [NSSocketPort port]; c = [NSConnection connectionWithReceivePort: port sendPort: port]; [c setRootObject: l]; if (optind < argc) [c registerName: [NSString stringWithUTF8String: argv[optind]] withNameServer: ns]; else [c registerName: @"test2server" withNameServer: ns]; [[NSNotificationCenter defaultCenter] addObserver: s selector: @selector(connectionBecameInvalid:) name: NSConnectionDidDieNotification object: c]; [c setDelegate: s]; [s addObject: o]; printf(" list's hash is 0x%x\n", (unsigned)[l hash]); printf(" object's hash is 0x%x\n", (unsigned)[o hash]); printf("Running...\n"); if (timeout) [[NSRunLoop currentRunLoop] runUntilDate: [NSDate dateWithTimeIntervalSinceNow: timeout]]; else [[NSRunLoop currentRunLoop] run]; printf("Finished\n"); [arp release]; exit(0); } gnustep-base-1.29.0/Examples/server.h000066400000000000000000000056071435650067400174570ustar00rootroot00000000000000/* Test/example program for the base library Copyright (C) 2005 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is part of the GNUstep Base Library. */ #ifndef _server_h #define _server_h #include @interface NSConnection (Debug) + (int) setDebug: (int)aFlag; @end @interface NSDistantObject (Debug) + (int) setDebug: (int)aFlag; @end typedef struct _small_struct { unsigned char z; } small_struct; typedef struct _foo { char c; double d; int i; char *s; unsigned long l; } foo; struct myarray { int a[3]; }; #define ADD_CONST 47 @protocol ClientProtocol - (BOOL) callback; @end @protocol ServerProtocol - (void) addObject: (id)o; - (BOOL) sendBoolean: (BOOL)b; - (void) getBoolean: (BOOL*)bp; - (unsigned char) sendUChar: (unsigned char)uc; - (void) getUChar: (unsigned char *)ucp; - (char) sendChar: (char)uc; - (void) getChar: (char *)ucp; - (short) sendShort: (short)num; - (void) getShort: (short *)num; - (int) sendInt: (int)num; - (void) getInt: (int *)num; - (long) sendLong: (long)num; - (void) getLong: (long *)num; - (float) sendFloat: (float)num; - (void) getFloat: (float *)num; - (double) sendDouble: (double)num; - (void) getDouble: (double *)num; - sendDouble: (double)dbl andFloat: (float)flt; - (small_struct) sendSmallStruct: (small_struct)str; - (void) getSmallStruct: (small_struct *)str; - (foo) sendStruct: (foo)str; - (void) getStruct: (foo *)str; - (id) sendObject: (id)str; - (void) getObject: (id *)str; - (char *) sendString: (char *)str; - (void) getString: (char **)str; - print: (const char *)str; - objectAt: (unsigned)i; - (unsigned) count; - echoObject: obj; - (oneway void) shout; - bounce: sender count: (int)c; - (oneway void) outputStats:obj; - sendArray: (int[3])a; - sendStructArray: (struct myarray)ma; - sendBycopy: (bycopy id)o; #ifdef _F_BYREF - sendByref: (byref id)o; - modifyByref: (byref NSMutableString *)o; #endif - manyArgs: (int)i1 : (int)i2 : (int)i3 : (int)i4 : (int)i5 : (int)i6 : (int)i7 : (int)i8 : (int)i9 : (int)i10 : (int)i11 : (int)i12; - (int) exceptionTest1; - (void) exceptionTest2; - (oneway void) exceptionTest3; - (oneway void) registerClient: (id)client; - (oneway void) unregisterClient: (id)client; - (BOOL) tryClientCallback; @end #ifdef IN_SERVER /* * We don't want the client to know about some methods, so we can * check that they work when it doesn't know them. */ @protocol privateServer - quietBycopy: (bycopy id)o; @end @interface Server : NSObject { id the_array; id registered_client; } @end #else @interface Server : NSObject { id the_array; id registered_client; } @end #endif #endif /* _server_h */ gnustep-base-1.29.0/Examples/wgetopt.h000066400000000000000000000024361435650067400176370ustar00rootroot00000000000000/* Test/example program for the base library Copyright (C) 2005 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is part of the GNUstep Base Library. */ /* A simple implementation of getopt() */ static int indexof(char c, char *string) { int i; for (i = 0; i < strlen(string); i++) { if (string[i] == c) { return i; } } return -1; } static char *optarg; static int optind; static char wgetopt(int argc, char **argv, char *options) { static char *arg; int index; char retval = '\0'; optarg = NULL; if (optind == 0) { optind = 1; } while (optind < argc) { arg = argv[optind]; if (strlen(arg) == 2) { if (arg[0] == '-') { if ((index = indexof(arg[1], options)) != -1) { retval = arg[1]; if (index < strlen(options)) { if (options[index+1] == ':') { if (optind < argc-1) { optind++; optarg = argv[optind]; } else { return -1; /* ':' given, but argv exhausted */ } } } } } } optind++; return retval; } return -1; } gnustep-base-1.29.0/GNUmakefile000066400000000000000000000050121435650067400162620ustar00rootroot00000000000000# # Main Makefile for GNUstep Base Library. # # Copyright (C) 1997 Free Software Foundation, Inc. # # Written by: Scott Christley # # This file is part of the GNUstep Base Library. # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public # License as published by the Free Software Foundation; either # version 2 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 # General Public License for more details. # # You should have received a copy of the GNU General Public # License along with this library; if not, write to the Free # Software Foundation, Inc., 51 Franklin Street, Fifth Floor, # Boston, MA 02111 USA # ifeq ($(GNUSTEP_MAKEFILES),) GNUSTEP_MAKEFILES := $(shell gnustep-config --variable=GNUSTEP_MAKEFILES 2>/dev/null) ifeq ($(GNUSTEP_MAKEFILES),) $(warning ) $(warning Unable to obtain GNUSTEP_MAKEFILES setting from gnustep-config!) $(warning Perhaps gnustep-make is not properly installed,) $(warning so gnustep-config is not in your PATH.) $(warning ) $(warning Your PATH is currently $(PATH)) $(warning ) endif endif ifeq ($(GNUSTEP_MAKEFILES),) $(error You need to set GNUSTEP_MAKEFILES before compiling!) endif GNUSTEP_CORE_SOFTWARE = YES export GNUSTEP_CORE_SOFTWARE RPM_DISABLE_RELOCATABLE = YES PACKAGE_NEEDS_CONFIGURE = YES PACKAGE_NAME = gnustep-base export PACKAGE_NAME SVN_MODULE_NAME = base SVN_BASE_URL = svn+ssh://svn.gna.org/svn/gnustep/libs # # Include local (new) configuration - this will prevent the old one # (if any) from $(GNUSTEP_MAKEFILES)/Additional/base.make to be included # GNUSTEP_LOCAL_ADDITIONAL_MAKEFILES=base.make include $(GNUSTEP_MAKEFILES)/common.make include ./Version -include config.mak # Helper variable to check if the generated makefiles are present. If # they are not, the tree is clean so prevent make from recursing into # subprojects when clean/distclean is being invoked again. _have_makefiles := $(shell test -f config.mak -o -f base.make && echo yes) # # The list of subproject directories # ifeq ($(_have_makefiles),yes) SUBPROJECTS = Source SUBPROJECTS += Tools NSTimeZones Resources Tests endif -include Makefile.preamble include $(GNUSTEP_MAKEFILES)/aggregate.make -include $(GNUSTEP_MAKEFILES)/Master/deb.make -include Makefile.postamble gnustep-base-1.29.0/Headers/000077500000000000000000000000001435650067400155655ustar00rootroot00000000000000gnustep-base-1.29.0/Headers/Foundation/000077500000000000000000000000001435650067400176735ustar00rootroot00000000000000gnustep-base-1.29.0/Headers/Foundation/Foundation.h000066400000000000000000000166541435650067400221660ustar00rootroot00000000000000/* Global include file for the GNUstep Base Library. Copyright (C) 1997 Free Software Foundation, Inc. Written by: Scott Christley Date: Sep 1997 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __Foundation_h_GNUSTEP_BASE_INCLUDE #define __Foundation_h_GNUSTEP_BASE_INCLUDE #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #ifdef __has_include # if __has_include() # include # endif # if __has_include() # include # endif #endif #endif /* __Foundation_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/FoundationErrors.h000066400000000000000000000113511435650067400233500ustar00rootroot00000000000000/* Interface for FoundationErrors for GNUstep Copyright (C) 2008 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 2008 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __FoundationErrors_h_GNUSTEP_BASE_INCLUDE #define __FoundationErrors_h_GNUSTEP_BASE_INCLUDE #import #import #if OS_API_VERSION(MAC_OS_X_VERSION_10_4, GS_API_LATEST) /* These are those of the NSError code values for the NSCocoaErrorDomain * which are defined in the foundation/base library. */ enum { NSFileErrorMaximum = 1023, NSFileErrorMinimum = 0, NSFileLockingError = 255, NSFileNoSuchFileError = 4, NSFileReadCorruptFileError = 259, NSFileReadInapplicableStringEncodingError = 261, NSFileReadInvalidFileNameError = 258, NSFileReadNoPermissionError = 257, NSFileReadNoSuchFileError = 260, NSFileReadUnknownError = 256, NSFileReadUnsupportedSchemeError = 262, NSFileWriteInapplicableStringEncodingError = 517, NSFileWriteInvalidFileNameError = 514, NSFileWriteFileExistsError = 516, NSFileWriteNoPermissionError = 513, NSFileWriteOutOfSpaceError = 640, NSFileWriteUnknownError = 512, NSFileWriteUnsupportedSchemeError = 518, NSFormattingError = 2048, NSFormattingErrorMaximum = 2559, NSFormattingErrorMinimum = 2048, NSKeyValueValidationError = 1024, NSUserCancelledError = 3072, NSValidationErrorMaximum = 2047, NSValidationErrorMinimum = 1024, #if OS_API_VERSION(MAC_OS_X_VERSION_10_5, GS_API_LATEST) NSExecutableArchitectureMismatchError = 3585, NSExecutableErrorMaximum = 3839, NSExecutableErrorMinimum = 3584, NSExecutableLinkError = 3588, NSExecutableLoadError = 3587, NSExecutableNotLoadableError = 3584, NSExecutableRuntimeMismatchError = 3586, NSFileReadTooLargeError = 263, NSFileReadUnknownStringEncodingError = 264, #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) NSFileWriteVolumeReadOnlyError = 642, NSPropertyListErrorMaximum = 4095, NSPropertyListErrorMinimum = 3840, NSPropertyListReadCorruptError = 3840, NSPropertyListReadStreamError = 3842, NSPropertyListReadUnknownVersionError = 3841, NSPropertyListWriteStreamError = 3851, #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_7, GS_API_LATEST) #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_8, GS_API_LATEST) NSFeatureUnsupportedError = 3328, NSXPCConnectionErrorMaximum = 4224, NSXPCConnectionErrorMinimum = 4096, NSXPCConnectionInterrupted = 4097, NSXPCConnectionInvalid = 4099, NSXPCConnectionReplyInvalid = 4101, #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_9, GS_API_LATEST) NSUbiquitousFileErrorMaximum = 4607, NSUbiquitousFileErrorMinimum = 4352, NSUbiquitousFileNotUploadedDueToQuotaError = 4354, NSUbiquitousFileUbiquityServerNotAvailable = 4355, NSUbiquitousFileUnavailableError = 4353, #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_10, GS_API_LATEST) NSPropertyListWriteInvalidError = 3852, NSUserActivityConnectionUnavailableError = 4609, NSUserActivityErrorMaximum = 4863, NSUserActivityErrorMinimum = 4608, NSUserActivityHandoffFailedError = 4608, NSUserActivityHandoffUserInfoTooLargeError = 4611, NSUserActivityRemoteApplicationTimedOutError = 4610, #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_11, GS_API_LATEST) NSBundleErrorMaximum = 5119, NSBundleErrorMinimum = 4992, NSCoderErrorMaximum = 4991, NSCoderErrorMinimum = 4864, NSCoderReadCorruptError = 4864, NSCoderValueNotFoundError = 4865, #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_12, GS_API_LATEST) NSCloudSharingConflictError = 5123, NSCloudSharingErrorMaximum = 5375, NSCloudSharingErrorMinimum = 5120, NSCloudSharingNetworkFailureError = 5120, NSCloudSharingNoPermissionError = 5124, NSCloudSharingOtherError = 5375, NSCloudSharingQuotaExceededError = 5121, NSCloudSharingTooManyParticipantsError = 5122, #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_13, GS_API_LATEST) NSCoderInvalidValueError = 4866, #endif GSFoundationPlaceHolderError = 9999 }; #endif #endif gnustep-base-1.29.0/Headers/Foundation/FoundationLegacySwiftCompatibility.h000066400000000000000000000022331435650067400270460ustar00rootroot00000000000000/* Definition of header FoundationLegacySwiftCompatibility Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory Casamento Date: Tue Nov 12 23:50:29 EST 2019 This file is part of the GNUstep Library. 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 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 USA. */ #ifndef _FoundationLegacySwiftCompatibility_h_GNUSTEP_BASE_INCLUDE #define _FoundationLegacySwiftCompatibility_h_GNUSTEP_BASE_INCLUDE #include #endif gnustep-base-1.29.0/Headers/Foundation/NSAffineTransform.h000066400000000000000000000045471435650067400234030ustar00rootroot00000000000000/* NSAffineTransform.h Copyright (C) 1996 Free Software Foundation, Inc. Author: Ovidiu Predescu Date: August 1997 Rewrite for MacOS-X compatibility: Richard Frith-Macdonald, 1999 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSAffineTransform_h_GNUSTEP_BASE_INCLUDE #define __NSAffineTransform_h_GNUSTEP_BASE_INCLUDE #import #import #import typedef struct { CGFloat m11; CGFloat m12; CGFloat m21; CGFloat m22; CGFloat tX; CGFloat tY; } NSAffineTransformStruct; GS_EXPORT_CLASS @interface NSAffineTransform : NSObject { #if GS_EXPOSE(NSAffineTransform) @private NSAffineTransformStruct _matrix; BOOL _isIdentity; // special case: A=D=1 and B=C=0 BOOL _isFlipY; // special case: A=1 D=-1 and B=C=0 BOOL _pad1 GS_UNUSED_IVAR; BOOL _pad2 GS_UNUSED_IVAR; #endif } + (NSAffineTransform*) transform; - (void) appendTransform: (NSAffineTransform*)aTransform; - (id) initWithTransform: (NSAffineTransform*)aTransform; - (void) invert; - (void) prependTransform: (NSAffineTransform*)aTransform; - (void) rotateByDegrees: (CGFloat)angle; - (void) rotateByRadians: (CGFloat)angleRad; - (void) scaleBy: (CGFloat)scale; - (void) scaleXBy: (CGFloat)scaleX yBy: (CGFloat)scaleY; - (void) setTransformStruct: (NSAffineTransformStruct)val; - (NSPoint) transformPoint: (NSPoint)aPoint; - (NSSize) transformSize: (NSSize)aSize; - (NSAffineTransformStruct) transformStruct; - (void) translateXBy: (CGFloat)tranX yBy: (CGFloat)tranY; @end #endif /* __NSAffineTransform_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSAppleEventDescriptor.h000066400000000000000000000025531435650067400244140ustar00rootroot00000000000000/* Definition of class NSAppleEventDescriptor Copyright (C) 2019 Free Software Foundation, Inc. By: heron Date: Fri Nov 1 00:25:01 EDT 2019 This file is part of the GNUstep Library. 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 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 USA. */ #ifndef _NSAppleEventDescriptor_h_GNUSTEP_BASE_INCLUDE #define _NSAppleEventDescriptor_h_GNUSTEP_BASE_INCLUDE #include #if OS_API_VERSION(MAC_OS_X_VERSION_10_0, GS_API_LATEST) #if defined(__cplusplus) extern "C" { #endif GS_EXPORT_CLASS @interface NSAppleEventDescriptor : NSObject @end #if defined(__cplusplus) } #endif #endif /* GS_API_MACOSX */ #endif /* _NSAppleEventDescriptor_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSAppleEventManager.h000066400000000000000000000025341435650067400236470ustar00rootroot00000000000000/* Definition of class NSAppleEventManager Copyright (C) 2019 Free Software Foundation, Inc. By: heron Date: Fri Nov 1 00:25:06 EDT 2019 This file is part of the GNUstep Library. 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 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 USA. */ #ifndef _NSAppleEventManager_h_GNUSTEP_BASE_INCLUDE #define _NSAppleEventManager_h_GNUSTEP_BASE_INCLUDE #include #if OS_API_VERSION(MAC_OS_X_VERSION_10_0, GS_API_LATEST) #if defined(__cplusplus) extern "C" { #endif GS_EXPORT_CLASS @interface NSAppleEventManager : NSObject @end #if defined(__cplusplus) } #endif #endif /* GS_API_MACOSX */ #endif /* _NSAppleEventManager_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSAppleScript.h000066400000000000000000000025531435650067400225400ustar00rootroot00000000000000 /* Definition of class NSAppleScript Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory John Casamento Date: Thu Sep 26 09:49:55 EDT 2019 This file is part of the GNUstep Library. 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 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 USA. */ #ifndef _NSAppleScript_h_GNUSTEP_BASE_INCLUDE #define _NSAppleScript_h_GNUSTEP_BASE_INCLUDE #include #if defined(__cplusplus) extern "C" { #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_0, GS_API_LATEST) GS_EXPORT_CLASS @interface NSAppleScript : NSObject @end #if defined(__cplusplus) } #endif #endif /* GS_API_MACOSX */ #endif /* _NSAppleScript_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSArchiver.h000066400000000000000000000210331435650067400220470ustar00rootroot00000000000000/** Interface for NSArchiver for GNUStep Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. Written by: Andrew Kachites McCallum Rewrite by: Richard Frith-Macdonald Date: March 1995 This file is part of the GNUstep Base Library. 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 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 USA. AutogsdocSource:NSUnarchiver.m AutogsdocSource:NSArchiver.m */ #ifndef __NSArchiver_h_GNUSTEP_BASE_INCLUDE #define __NSArchiver_h_GNUSTEP_BASE_INCLUDE #import #import #if defined(__cplusplus) extern "C" { #endif @class NSMutableArray, NSMutableDictionary, NSMutableData, NSData, NSString; #if OS_API_VERSION(GS_API_OSSPEC,GS_API_LATEST) GS_EXPORT_CLASS @interface NSArchiver : NSCoder { #if GS_EXPOSE(NSArchiver) @private NSMutableData *_data; /* Data to write into. */ id _dst; /* Serialization destination. */ IMP _serImp; /* Method to serialize with. */ IMP _tagImp; /* Serialize a type tag. */ IMP _xRefImp; /* Serialize a crossref. */ IMP _eObjImp; /* Method to encode an id. */ IMP _eValImp; /* Method to encode others. */ #ifndef _IN_NSARCHIVER_M #define GSIMapTable void* #endif GSIMapTable _clsMap; /* Class cross references. */ GSIMapTable _cIdMap; /* Conditionally coded. */ GSIMapTable _uIdMap; /* Unconditionally coded. */ GSIMapTable _ptrMap; /* Constant pointers. */ GSIMapTable _namMap; /* Mappings for class names. */ GSIMapTable _repMap; /* Mappings for objects. */ #ifndef _IN_NSARCHIVER_M #undef GSIMapTable #endif unsigned _xRefC; /* Counter for cross-reference. */ unsigned _xRefO; /* Counter for cross-reference. */ unsigned _xRefP; /* Counter for cross-reference. */ unsigned _startPos; /* Where in data we started. */ BOOL _encodingRoot; BOOL _initialPass; #endif #if GS_NONFRAGILE #else /* Pointer to private additional data used to avoid breaking ABI * when we don't have the non-fragile ABI available. * Use this mechanism rather than changing the instance variable * layout (see Source/GSInternal.h for details). */ @private id _internal GS_UNUSED_IVAR; #endif } /* Initializing an archiver */ - (id) initForWritingWithMutableData: (NSMutableData*)mdata; /* Archiving Data */ + (NSData*) archivedDataWithRootObject: (id)rootObject; + (BOOL) archiveRootObject: (id)rootObject toFile: (NSString*)path; /* Getting data from the archiver */ - (NSMutableData*) archiverData; /* Substituting Classes */ - (NSString*) classNameEncodedForTrueClassName: (NSString*) trueName; - (void) encodeClassName: (NSString*)trueName intoClassName: (NSString*)inArchiveName; #if OS_API_VERSION(GS_API_MACOSX,GS_API_LATEST) /* Substituting Objects */ - (void) replaceObject: (id)object withObject: (id)newObject; #endif @end #if GS_API_VERSION(GS_API_NONE,011700) @interface NSArchiver (GNUstep) /* * Re-using the archiver - the 'resetArchiver' method resets the internal * state of the archiver so that you can re-use it rather than having to * destroy it and create a new one. * NB. you would normally want to issue a 'setLength:0' message to the * mutable data object used by the archiver as well, othewrwise the next * root object encoded will be appended to data. */ - (void) resetArchiver; /* * Subclassing with different output format. * NSArchiver normally writes directly to an NSMutableData object using * the methods - * [-serializeTypeTag:] * to encode type tags for data items, the tag is the * first byte of the character encoding string for the * data type (as provided by '@encode(xxx)'), possibly * with the top bit set to indicate that what follows is * a crossreference to an item already encoded. * [-serializeCrossRef:], * to encode a crossreference number either to identify the * following item, or to refer to a previously encoded item. * Objects, Classes, Selectors, CStrings and Pointer items * have crossreference encoding, other types do not. * [-serializeData:ofObjCType:context:] * to encode all other information. * * And uses other NSMutableData methods to write the archive header * information from within the method: * [-serializeHeaderAt:version:classes:objects:pointers:] * to write a fixed size header including archiver version * (obtained by [self systemVersion]) and crossreference * table sizes. The archiver will do this twice, once with * dummy values at initialisation time and once with the real * values. * * To subclass NSArchiver, you must implement your own versions of the * four methods above, and override the 'directDataAccess' method to * return NO so that the archiver knows to use your serialization * methods rather than those in the NSMutableData object. */ - (BOOL) directDataAccess; - (void) serializeHeaderAt: (unsigned)positionInData version: (unsigned)systemVersion classes: (unsigned)classCount objects: (unsigned)objectCount pointers: (unsigned)pointerCount; @end #endif GS_EXPORT_CLASS @interface NSUnarchiver : NSCoder { #if GS_EXPOSE(NSUnarchiver) @private NSData *data; /* Data to write into. */ Class dataClass; /* What sort of data is it? */ id src; /* Deserialization source. */ IMP desImp; /* Method to deserialize with. */ void (*tagImp)(id, SEL, unsigned char*, unsigned*,unsigned*); IMP dValImp; /* Method to decode data with. */ #ifndef _IN_NSUNARCHIVER_M #define GSIArray void* #endif GSIArray clsMap; /* Class crossreference map. */ GSIArray objMap; /* Object crossreference map. */ GSIArray ptrMap; /* Pointer crossreference map. */ #ifndef _IN_NSUNARCHIVER_M #undef GSIArray #endif unsigned cursor; /* Position in data buffer. */ unsigned version; /* Version of archiver used. */ NSZone *zone; /* Zone for allocating objs. */ NSMutableDictionary *objDict; /* Class information store. */ NSMutableArray *objSave; #endif #if GS_NONFRAGILE #else /* Pointer to private additional data used to avoid breaking ABI * when we don't have the non-fragile ABI available. * Use this mechanism rather than changing the instance variable * layout (see Source/GSInternal.h for details). */ @private id _internal GS_UNUSED_IVAR; #endif } /* Initializing an unarchiver */ - (id) initForReadingWithData: (NSData*)anObject; /* Decoding objects */ + (id) unarchiveObjectWithData: (NSData*)anObject; + (id) unarchiveObjectWithFile: (NSString*)path; /* Managing */ - (BOOL) isAtEnd; - (NSZone*) objectZone; - (void) setObjectZone: (NSZone*)aZone; - (unsigned int) systemVersion; /* Substituting Classes */ + (NSString*) classNameDecodedForArchiveClassName: (NSString*)nameInArchive; + (void) decodeClassName: (NSString*)nameInArchive asClassName: (NSString*)trueName; - (NSString*) classNameDecodedForArchiveClassName: (NSString*)nameInArchive; - (void) decodeClassName: (NSString*)nameInArchive asClassName: (NSString*)trueName; #if OS_API_VERSION(GS_API_MACOSX,GS_API_LATEST) /* Substituting objects */ - (void) replaceObject: (id)anObject withObject: (id)replacement; #endif @end #if OS_API_VERSION(GS_API_NONE,GS_API_NONE) && GS_API_VERSION(1,GS_API_LATEST) @interface NSUnarchiver (GNUstep) - (unsigned) cursor; - (void) resetUnarchiverWithData: (NSData*)anObject atIndex: (unsigned)pos; - (BOOL) directDataAccess; - (void) deserializeHeaderAt: (unsigned*)pos version: (unsigned*)v classes: (unsigned*)c objects: (unsigned*)o pointers: (unsigned*)p; @end #endif /* Exceptions */ /** * Specified in OpenStep to be raised by [NSArchiver] or subclasses if there * are problems initializing or encoding. Not currently used. * NSInternalInconsistencyException usually raised instead. */ GS_EXPORT NSString * const NSInconsistentArchiveException; #endif /* OS_API_VERSION */ #if defined(__cplusplus) } #endif #endif /* __NSArchiver_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSArray.h000066400000000000000000000407651435650067400213770ustar00rootroot00000000000000/* Interface for NSArray for GNUStep Copyright (C) 1995-2015 Free Software Foundation, Inc. Written by: Andrew Kachites McCallum Created: 1995 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSArray_h_GNUSTEP_BASE_INCLUDE #define __NSArray_h_GNUSTEP_BASE_INCLUDE #import #import #import #import #import #if defined(__cplusplus) extern "C" { #endif @class NSString; @class NSURL; @class NSIndexSet; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) enum { NSBinarySearchingFirstEqual = (1UL << 8), /** Specifies that the binary * search should find the first object equal in the array. */ NSBinarySearchingLastEqual = (1UL << 9), /** Specifies that the binary * search should find the last object equal in the array. */ NSBinarySearchingInsertionIndex = (1UL << 10), /** Specifies that the binary * search should find the index at which an equal object should be inserted * in order to keep the array sorted */ }; typedef NSUInteger NSBinarySearchingOptions; #endif GS_EXPORT_CLASS @interface GS_GENERIC_CLASS(NSArray, __covariant ElementT) : NSObject + (instancetype) array; + (instancetype) arrayWithArray: (GS_GENERIC_CLASS(NSArray, ElementT) *)array; + (instancetype) arrayWithContentsOfFile: (NSString*)file; #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) + (instancetype) arrayWithContentsOfURL: (NSURL*)aURL; #endif + (instancetype) arrayWithObject: (id)anObject; + (instancetype) arrayWithObjects: (id)firstObject, ...; + (instancetype) arrayWithObjects: (const id[])objects count: (NSUInteger)count; - (GS_GENERIC_CLASS(NSArray, ElementT) *) arrayByAddingObject: (GS_GENERIC_TYPE(ElementT))anObject; - (GS_GENERIC_CLASS(NSArray, ElementT) *) arrayByAddingObjectsFromArray: (GS_GENERIC_CLASS(NSArray, ElementT)*)anotherArray; - (BOOL) containsObject: (GS_GENERIC_TYPE(ElementT))anObject; /** * Returns the number of elements contained in the receiver. */ - (NSUInteger) count; - (void) getObjects: (__unsafe_unretained GS_GENERIC_TYPE(ElementT)[])aBuffer; - (void) getObjects: (__unsafe_unretained GS_GENERIC_TYPE(ElementT)[])aBuffer range: (NSRange)aRange; - (NSUInteger) indexOfObject: (GS_GENERIC_TYPE(ElementT))anObject; - (NSUInteger) indexOfObject: (GS_GENERIC_TYPE(ElementT))anObject inRange: (NSRange)aRange; - (NSUInteger) indexOfObjectIdenticalTo: (GS_GENERIC_TYPE(ElementT))anObject; - (NSUInteger) indexOfObjectIdenticalTo: (GS_GENERIC_TYPE(ElementT))anObject inRange: (NSRange)aRange; - (instancetype) init; - (instancetype) initWithArray: (GS_GENERIC_CLASS(NSArray, ElementT)*)array; #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) - (instancetype) initWithArray: (GS_GENERIC_CLASS(NSArray, ElementT)*)array copyItems: (BOOL)shouldCopy; #endif - (instancetype) initWithContentsOfFile: (NSString*)file; #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) - (instancetype) initWithContentsOfURL: (NSURL*)aURL; #endif - (instancetype) initWithObjects: (GS_GENERIC_TYPE(ElementT)) firstObject, ...; /** * This should initialize the array with count (may be zero) objects.
* Retains each object placed in the array.
* Calls -init (which does nothing but maintain MacOS-X compatibility), * and needs to be re-implemented in subclasses in order to have all * other initialisers work. */ - (instancetype) initWithObjects: (const GS_GENERIC_TYPE(ElementT)[])objects count: (NSUInteger)count; - (GS_GENERIC_TYPE(ElementT)) lastObject; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) - (GS_GENERIC_TYPE(ElementT)) firstObject; #endif /** * Returns the object at the specified index. * Raises an exception of the index is beyond the array. */ - (GS_GENERIC_TYPE(ElementT)) objectAtIndex: (NSUInteger)index; #if OS_API_VERSION(MAC_OS_X_VERSION_10_4, GS_API_LATEST) - (GS_GENERIC_CLASS(NSArray, ElementT) *) objectsAtIndexes: (NSIndexSet *)indexes; #endif - (GS_GENERIC_TYPE(ElementT)) firstObjectCommonWithArray: (GS_GENERIC_CLASS(NSArray, ElementT) *)otherArray; - (BOOL) isEqualToArray: (NSArray*)otherArray; #if OS_API_VERSION(GS_API_OPENSTEP, GS_API_MACOSX) - (void) makeObjectsPerform: (SEL)aSelector; - (void) makeObjectsPerform: (SEL)aSelector withObject: (id)argument; #endif #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) - (void) makeObjectsPerformSelector: (SEL)aSelector; - (void) makeObjectsPerformSelector: (SEL)aSelector withObject: (id)arg; #endif - (NSData*) sortedArrayHint; - (GS_GENERIC_CLASS(NSArray, ElementT)*) sortedArrayUsingFunction: (NSComparisonResult (*)(id, id, void*))comparator context: (void*)context; - (GS_GENERIC_CLASS(NSArray, ElementT)*) sortedArrayUsingFunction: (NSComparisonResult (*)(id, id, void*))comparator context: (void*)context hint: (NSData*)hint; - (GS_GENERIC_CLASS(NSArray, ElementT)*) sortedArrayUsingSelector: (SEL)comparator; - (GS_GENERIC_CLASS(NSArray, ElementT)*) subarrayWithRange: (NSRange)aRange; - (NSString*) componentsJoinedByString: (NSString*)separator; - (GS_GENERIC_CLASS(NSArray, NSString*)*) pathsMatchingExtensions: (GS_GENERIC_CLASS(NSArray, NSString*)*)extensions; - (GS_GENERIC_CLASS(NSEnumerator, ElementT)*) objectEnumerator; - (GS_GENERIC_CLASS(NSEnumerator, ElementT)*) reverseObjectEnumerator; - (NSString*) description; - (NSString*) descriptionWithLocale: (id)locale; - (NSString*) descriptionWithLocale: (id)locale indent: (NSUInteger)level; - (BOOL) writeToFile: (NSString*)path atomically: (BOOL)useAuxiliaryFile; #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) - (BOOL) writeToURL: (NSURL*)url atomically: (BOOL)useAuxiliaryFile; - (id) valueForKey: (NSString*)key; - (void) setValue: (id)value forKey: (NSString*)key; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) DEFINE_BLOCK_TYPE(GSEnumeratorBlock, void, GS_GENERIC_TYPE(ElementT), NSUInteger, BOOL*); DEFINE_BLOCK_TYPE(GSPredicateBlock, BOOL, GS_GENERIC_TYPE(ElementT), NSUInteger, BOOL*); /** * Enumerate over the collection using the given block. The first argument is * the object and the second is the index in the array. The final argument is * a pointer to a BOOL indicating whether the enumeration should stop. Setting * this to YES will interrupt the enumeration. */ - (void) enumerateObjectsUsingBlock: (GSEnumeratorBlock)aBlock; /** * Enumerate over the collection using the given block. The first argument is * the object and the second is the index in the array. The final argument is * a pointer to a BOOL indicating whether the enumeration should stop. Setting * this to YES will interrupt the enumeration. * * The opts argument is a bitfield. Setting the NSNSEnumerationConcurrent flag * specifies that it is thread-safe. The NSEnumerationReverse bit specifies * that it should be enumerated in reverse order. */ - (void) enumerateObjectsWithOptions: (NSEnumerationOptions)opts usingBlock: (GSEnumeratorBlock)aBlock; /** * Enumerate over the specified indexes in the collection using the given * block. The first argument is the object and the second is the index in the * array. The final argument is a pointer to a BOOL indicating whether the * enumeration should stop. Setting this to YES will interrupt the * enumeration. * * The opts argument is a bitfield. Setting the NSNSEnumerationConcurrent flag * specifies that it is thread-safe. The NSEnumerationReverse bit specifies * that it should be enumerated in reverse order. */ - (void) enumerateObjectsAtIndexes: (NSIndexSet*)indexSet options: (NSEnumerationOptions)opts usingBlock: (GSEnumeratorBlock)block; /** * Returns the indexes of the objects in a collection that match the condition * specified by the block. * * The opts argument is a bitfield. Setting the NSNSEnumerationConcurrent flag * specifies that it is thread-safe. The NSEnumerationReverse bit specifies * that it should be enumerated in reverse order. */ - (NSIndexSet *) indexesOfObjectsWithOptions: (NSEnumerationOptions)opts passingTest: (GSPredicateBlock)predicate; /** * Returns the indexes of the objects in a collection that match the condition * specified by the block. */ - (NSIndexSet*) indexesOfObjectsPassingTest: (GSPredicateBlock)predicate; /** * Returns the indexes of the objects in a collection that match the condition * specified by the block and are in the range specified by the index set. * * The opts argument is a bitfield. Setting the NSNSEnumerationConcurrent flag * specifies that it is thread-safe. The NSEnumerationReverse bit specifies * that it should be enumerated in reverse order. */ - (NSIndexSet*) indexesOfObjectsAtIndexes: (NSIndexSet*)indexSet options: (NSEnumerationOptions)opts passingTest: (GSPredicateBlock)predicate; /** * Returns the index of the first object in the array that matches the * condition specified by the block. * * The opts argument is a bitfield. Setting the NSNSEnumerationConcurrent flag * specifies that it is thread-safe. The NSEnumerationReverse bit specifies * that it should be enumerated in reverse order. */ - (NSUInteger) indexOfObjectWithOptions: (NSEnumerationOptions)opts passingTest: (GSPredicateBlock)predicate; /** * Returns the index of the first object in the array that matches the * condition specified by the block. */ - (NSUInteger) indexOfObjectPassingTest: (GSPredicateBlock)predicate; /** * Returns the index of the first object in the specified range in a collection * that matches the condition specified by the block. * * The opts argument is a bitfield. Setting the NSNSEnumerationConcurrent flag * specifies that it is thread-safe. The NSEnumerationReverse bit specifies * that it should be enumerated in reverse order. */ - (NSUInteger) indexOfObjectAtIndexes: (NSIndexSet*)indexSet options: (NSEnumerationOptions)opts passingTest: (GSPredicateBlock)predicate; /** Returns a sorted array using the comparator to determine the * order of objects. */ - (GS_GENERIC_CLASS(NSArray, ElementT) *) sortedArrayUsingComparator: (NSComparator)comparator; /** Returns a sorted array using the block to determine the order of objects. * * The opts argument is a bitfield. Setting the NSSortConcurrent flag * specifies that it is thread-safe. The NSSortStable bit specifies that * it should keep equal objects in the same order. */ - (GS_GENERIC_CLASS(NSArray, ElementT) *) sortedArrayWithOptions: (NSSortOptions)options usingComparator: (NSComparator)comparator; /** * Performs a binary search of the array within the specified range for the * index of an object equal to obj according to cmp. * If NSBinarySearchingInsertionIndex is specified, searches for the index * at which such an object should be inserted. */ - (NSUInteger) indexOfObject: (id)key inSortedRange: (NSRange)range options: (NSBinarySearchingOptions)options usingComparator: (NSComparator)comparator; #endif /** * Accessor for subscripting. This is called by the compiler when you write * code like anArray[12]. It should not be called directly. */ - (GS_GENERIC_TYPE(ElementT)) objectAtIndexedSubscript: (NSUInteger)anIndex; @end GS_EXPORT_CLASS @interface GS_GENERIC_CLASS(NSMutableArray, ElementT) : GS_GENERIC_CLASS(NSArray, ElementT) + (instancetype) arrayWithCapacity: (NSUInteger)numItems; /** * Adds anObject at the end of the array, thus increasing the size of * the array. The object is retained upon addition. */ - (void) addObject: (GS_GENERIC_TYPE(ElementT))anObject; - (void) addObjectsFromArray: (GS_GENERIC_CLASS(NSArray, ElementT)*)otherArray; #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) - (void) exchangeObjectAtIndex: (NSUInteger)i1 withObjectAtIndex: (NSUInteger)i2; #endif /** * Initialise the array with the specified capacity ... this * should ensure that the array can have numItems added efficiently.
* Calls -init (which does nothing but maintain MacOS-X compatibility), * and needs to be re-implemented in subclasses in order to have all * other initialisers work. */ - (instancetype) initWithCapacity: (NSUInteger)numItems; /** * Inserts an object into the receiver at the specified location.
* Raises an exception if given an array index which is too large.
* The size of the array increases by one.
* The object is retained by the array. */ - (void) insertObject: (GS_GENERIC_TYPE(ElementT))anObject atIndex: (NSUInteger)index; #if OS_API_VERSION(MAC_OS_X_VERSION_10_4, GS_API_LATEST) - (void) insertObjects: (GS_GENERIC_CLASS(NSArray, ElementT) *)objects atIndexes: (NSIndexSet *)indexes; #endif /** * Removes an object from the receiver at the specified location.
* The size of the array decreases by one.
* Raises an exception if given an array index which is too large.
*/ - (void) removeObjectAtIndex: (NSUInteger)index; - (void) removeObjectsAtIndexes: (NSIndexSet *)indexes; /** * Places an object into the receiver at the specified location.
* Raises an exception if given an array index which is too large.
* The object is retained by the array. */ - (void) replaceObjectAtIndex: (NSUInteger)index withObject: (GS_GENERIC_TYPE(ElementT))anObject; #if OS_API_VERSION(MAC_OS_X_VERSION_10_4, GS_API_LATEST) - (void) replaceObjectsAtIndexes: (NSIndexSet *)indexes withObjects: (GS_GENERIC_CLASS(NSArray, ElementT)*)objects; #endif - (void) replaceObjectsInRange: (NSRange)aRange withObjectsFromArray: (GS_GENERIC_CLASS(NSArray, ElementT)*)anArray; - (void) replaceObjectsInRange: (NSRange)aRange withObjectsFromArray: (GS_GENERIC_CLASS(NSArray, ElementT)*)anArray range: (NSRange)anotherRange; - (void) setArray: (GS_GENERIC_CLASS(NSArray, ElementT) *)otherArray; - (void) removeAllObjects; - (void) removeLastObject; - (void) removeObject: (GS_GENERIC_TYPE(ElementT))anObject; - (void) removeObject: (GS_GENERIC_TYPE(ElementT))anObject inRange: (NSRange)aRange; - (void) removeObjectIdenticalTo: (GS_GENERIC_TYPE(ElementT))anObject; - (void) removeObjectIdenticalTo: (GS_GENERIC_TYPE(ElementT))anObject inRange: (NSRange)aRange; - (void) removeObjectsInArray: (GS_GENERIC_CLASS(NSArray, ElementT)*)otherArray; - (void) removeObjectsInRange: (NSRange)aRange; - (void) removeObjectsFromIndices: (NSUInteger*)indices numIndices: (NSUInteger)count; - (void) sortUsingFunction: (NSComparisonResult (*)(GS_GENERIC_TYPE(ElementT), GS_GENERIC_TYPE(ElementT),void*))compare context: (void*)context; - (void) sortUsingSelector: (SEL)comparator; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) /** * Sorts the array using the specified comparator block. */ - (void) sortUsingComparator: (NSComparator)comparator; /** * Sorts the array using the specified comparator block and options. */ - (void) sortWithOptions: (NSSortOptions)options usingComparator: (NSComparator)comparator; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_8, GS_API_LATEST) /** Set method called by the compiler with array subscripting.
* Replaces the object at anIndex or, if anIndex is the length of the array, * this method appends abObject to the array. */ - (void) setObject: (GS_GENERIC_TYPE(ElementT))anObject atIndexedSubscript: (NSUInteger)anIndex; #endif @end #if defined(__cplusplus) } #endif #if !NO_GNUSTEP && !defined(GNUSTEP_BASE_INTERNAL) #import #endif #endif /* __NSArray_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSAttributedString.h000066400000000000000000000121211435650067400236000ustar00rootroot00000000000000/* NSAttributedString.h String class with attributes Copyright (C) 1997,1999 Free Software Foundation, Inc. Written by: ANOQ of the sun Date: November 1997 Rewrite by: Richard Frith-Macdonald Date: April 1999 This file is part of GNUStep-base 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 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. If you are interested in a warranty or support for this source code, contact Scott Christley for more information. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110 USA. */ /* Warning - [-initWithString:attributes:] is the designated initialiser, * but it doesn't provide any way to perform the function of the * [-initWithAttributedString:] initialiser. * In order to work youd this, the string argument of the * designated initialiser has been overloaded such that it * is expected to accept an NSAttributedString here instead of * a string. If you create an NSAttributedString subclass, you * must make sure that your implementation of the initialiser * copes with either an NSString or an NSAttributedString. * If it receives an NSAttributedString, it should ignore the * attributes argument and use the values from the string. */ #ifndef __NSAttributedString_h_GNUSTEP_BASE_INCLUDE #define __NSAttributedString_h_GNUSTEP_BASE_INCLUDE #import #if defined(__cplusplus) extern "C" { #endif #import #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) #import #import #import #import GS_EXPORT_CLASS @interface NSAttributedString : NSObject { } //Creating an NSAttributedString - (id) initWithString: (NSString*)aString; - (id) initWithAttributedString: (NSAttributedString*)attributedString; - (id) initWithString: (NSString*)aString attributes: (NSDictionary*)attributes; //Retrieving character information - (NSUInteger) length; /** Returns the string content of the receiver.
* NB. this is actually a proxy to the internal content (which may change) * so if you need an immutable instance you should copy the returned value, * not just retain it. */ - (NSString*) string; //Primitive method! //Retrieving attribute information - (NSDictionary*) attributesAtIndex: (NSUInteger)index effectiveRange: (NSRange*)aRange; //Primitive method! - (NSDictionary*) attributesAtIndex: (NSUInteger)index longestEffectiveRange: (NSRange*)aRange inRange: (NSRange)rangeLimit; - (id) attribute: (NSString*)attributeName atIndex: (NSUInteger)index effectiveRange: (NSRange*)aRange; - (id) attribute: (NSString*)attributeName atIndex: (NSUInteger)index longestEffectiveRange: (NSRange*)aRange inRange: (NSRange)rangeLimit; //Comparing attributed strings - (BOOL) isEqualToAttributedString: (NSAttributedString*)otherString; //Extracting a substring - (NSAttributedString*) attributedSubstringFromRange: (NSRange)aRange; @end //NSAttributedString GS_EXPORT_CLASS @interface NSMutableAttributedString : NSAttributedString { } //Retrieving character information - (NSMutableString*) mutableString; //Changing characters - (void) deleteCharactersInRange: (NSRange)aRange; //Changing attributes - (void) setAttributes: (NSDictionary*)attributes range: (NSRange)aRange; //Primitive method! - (void) addAttribute: (NSString*)name value: (id)value range: (NSRange)aRange; - (void) addAttributes: (NSDictionary*)attributes range: (NSRange)aRange; - (void) removeAttribute: (NSString*)name range: (NSRange)aRange; //Changing characters and attributes - (void) appendAttributedString: (NSAttributedString*)attributedString; - (void) insertAttributedString: (NSAttributedString*)attributedString atIndex: (NSUInteger)index; - (void) replaceCharactersInRange: (NSRange)aRange withAttributedString: (NSAttributedString*)attributedString; - (void) replaceCharactersInRange: (NSRange)aRange withString: (NSString*)aString; //Primitive method! - (void) setAttributedString: (NSAttributedString*)attributedString; //Grouping changes - (void) beginEditing; - (void) endEditing; @end //NSMutableAttributedString typedef NSString* NSAttributedStringKey; #endif /* GS_API_MACOSX */ #if defined(__cplusplus) } #endif #if !NO_GNUSTEP && !defined(GNUSTEP_BASE_INTERNAL) #import #endif #endif /* __NSAttributedString_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSAutoreleasePool.h000066400000000000000000000245651435650067400234240ustar00rootroot00000000000000/* Interface for NSAutoreleasePool for GNUStep Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. Written by: Andrew Kachites McCallum Date: 1995 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSAutoreleasePool_h_GNUSTEP_BASE_INCLUDE #define __NSAutoreleasePool_h_GNUSTEP_BASE_INCLUDE #import #import #if defined(__cplusplus) extern "C" { #endif @class NSAutoreleasePool; @class NSThread; /** * Each thread has its own copy of these variables. { NSAutoreleasePool *current_pool; // current pool for thread unsigned total_objects_count; // total #/autoreleased objects over thread's lifetime id *pool_cache; // cache of previously-allocated pools, int pool_cache_size; // used internally for recycling int pool_cache_count; } */ typedef struct autorelease_thread_vars { /* The current, default NSAutoreleasePool for the calling thread; the one that will hold objects that are arguments to [NSAutoreleasePool +addObject:]. */ __unsafe_unretained NSAutoreleasePool *current_pool; /* The total number of objects autoreleased since the thread was started, or since -resetTotalAutoreleasedObjects was called in this thread. (if compiled in) */ unsigned total_objects_count; /* A cache of NSAutoreleasePool's already alloc'ed. Caching old pools instead of deallocating and re-allocating them will save time. */ __unsafe_unretained id *pool_cache; int pool_cache_size; int pool_cache_count; } thread_vars_struct; /* Initialize an autorelease_thread_vars structure for a new thread. This function is called in NSThread each time an NSThread is created. TV should be of type `struct autorelease_thread_vars *' */ #define init_autorelease_thread_vars(TV) \ memset (TV, 0, sizeof (__typeof__ (*TV))) /** * Each pool holds its objects-to-be-released in a linked-list of these structures. { struct autorelease_array_list *next; unsigned size; unsigned count; id objects[0]; } */ typedef struct autorelease_array_list { struct autorelease_array_list *next; unsigned size; unsigned count; __unsafe_unretained id objects[0]; } array_list_struct; /** *

* The standard OpenStep system of memory management employs retain counts. * When an object is created, it has a retain count of 1. When an object * is retained, the retain count is incremented. When it is released the * retain count is decremented, and when the retain count goes to zero the * object gets deallocated. *

*

* A simple retain/release mechanism has problems with passing objects * from one scope to another, * so it's augmented with autorelease pools. You can use the * AUTORELEASE() macro to call the [NSObject-autorelease] * method, which adds an object to the current autorelease pool by * calling [NSAutoreleasePool+addObject:].
* An autorelease pool simply maintains a reference to each object * added to it, and for each addition, the autorelease pool will * call the [NSObject-release] method of the object when the pool * is released. So doing an AUTORELEASE() is just the same as * doing a RELEASE(), but deferred until the current autorelease * pool is deallocated. *

*

* The NSAutoreleasePool class maintains a separate stack of * autorelease pools objects in each thread. *

*

* When an autorelease pool is created, it is automatically * added to the stack of pools in the thread. *

*

* When a pool is destroyed, it (and any pool later in * the stack) is removed from the stack. *

*

* This mechanism provides a simple but controllable and reasonably * efficient way of managing temporary objects. An object can be * autoreleased and then passed around and used until the topmost * pool in the stack is destroyed. *

*

* Most methods return objects which are either owned by autorelease * pools or by the receiver of the method, so the lifetime of the * returned object can be assumed to be the shorter of the lifetime * of the current autorelease pool, or that of the receiver on which * the method was called.
* The exceptions to this are those object returned by - *

* * [NSObject+alloc], [NSObject+allocWithZone:] * * Methods whose names begin with alloc return an uninitialised * object, owned by the caller. * * [NSObject-init] * * Methods whose names begin with init return an initialised * version of the receiving object, owned by the caller.
* NB. The returned object may not actually be the same as the * receiver ... sometimes an init method releases the original * receiver and returns an alternative. *
* [NSObject+new] * * Methods whose names begin with new combine the effects of * allocation and initialisation. * * [NSObject-copy], [(NSCopying)-copyWithZone:] * * Methods whose names begin with copy create a copy of the receiver * which is owned by the caller. * * * [NSObject-mutableCopy], [(NSMutableCopying)-mutableCopyWithZone:] * * * Methods whose names begin with mutableCopy create a copy of the receiver * which is owned by the caller. * *
*/ GS_EXPORT_CLASS NS_AUTOMATED_REFCOUNT_UNAVAILABLE @interface NSAutoreleasePool : NSObject { #if GS_EXPOSE(NSAutoreleasePool) && !__has_feature(objc_arc) /* For re-setting the current pool when we are dealloc'ed. */ NSAutoreleasePool *_parent; /* This pointer to our child pool is necessary for co-existing with exceptions. */ NSAutoreleasePool *_child; /* A collection of the objects to be released. */ struct autorelease_array_list *_released; struct autorelease_array_list *_released_head; /* The total number of objects autoreleased in this pool. */ unsigned _released_count; /* The method to add an object to this pool */ void (*_addImp)(id, SEL, id); #endif #if GS_NONFRAGILE #else /* Pointer to private additional data used to avoid breaking ABI * when we don't have the non-fragile ABI available. * Use this mechanism rather than changing the instance variable * layout (see Source/GSInternal.h for details). */ @private id _internal GS_UNUSED_IVAR; #endif } /** * Adds anObj to the current autorelease pool.
* If there is no autorelease pool in the thread, * a warning is logged and the object is leaked (ie it will not be released). */ + (void) addObject: (id)anObj; /** * Allocate and return an autorelease pool instance.
* If there is an already-allocated NSAutoreleasePool available, * save time by just returning that, rather than allocating a new one.
* The pool instance becomes the current autorelease pool for this thread. */ + (id) allocWithZone: (NSZone*)zone; /** * Adds anObj to this autorelease pool. */ - (void) addObject: (id)anObj; /** * Raises an exception - pools should not be autoreleased. */ - (id) autorelease; #if OS_API_VERSION(MAC_OS_X_VERSION_10_4, GS_API_LATEST) /** * Intended to trigger a garbage collection run (if needed) when called in * a garbage collected environment.
* In a non-garbage collected environment, this method implements the * undocumented MacOS-X behavior, and releases the receiver. */ - (void) drain; #endif /** * Destroys the receiver (calls -dealloc). */ - (oneway void) release; /** * Raises an exception ... pools should not be retained. */ - (id) retain; #if OS_API_VERSION(GS_API_NONE, GS_API_NONE) /** *

* Counts the number of times that the specified object occurs * in autorelease pools in the current thread. *

*

* This method is slow and should probably only be * used for debugging purposes. *

*/ + (unsigned) autoreleaseCountForObject: (id)anObject; /** * Return the currently active autorelease pool. */ + (id) currentPool; /** *

* Specifies whether objects contained in autorelease pools are to * be released when the pools are deallocated (by default YES). *

*

* You can set this to NO for debugging purposes. *

*/ + (void) enableRelease: (BOOL)enable; /** *

* When autorelease pools are deallocated, the memory they used * is retained in a cache for re-use so that new polls can be * created very quickly. *

*

* This method may be used to empty that cache, ensuring that * the minimum memory is used by the application. *

*/ + (void) freeCache; /** *

* Specifies a limit to the number of objects that may be added to * an autorelease pool. When this limit is reached an exception is * raised. *

*

* You can set this to a smallish value to catch problems with code * that autoreleases too many objects to operate efficiently. *

*

* Default value is maxint. *

*/ + (void) setPoolCountThreshold: (unsigned)c; /** * Return the number of objects in this pool. */ - (unsigned) autoreleaseCount; /** * Empties the current pool by releasing all the autoreleased objects * in it. Also destroys any child pools (ones created after * the receiver in the same thread) causing any objects in those pools * to be released.
* This is a low cost (efficient) method which may be used to get rid of * autoreleased objects in the pool, but carry on using the pool. */ - (void) emptyPool; #endif @end #if defined(__cplusplus) } #endif #endif /* __NSAutoreleasePool_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSBackgroundActivityScheduler.h000066400000000000000000000064221435650067400257440ustar00rootroot00000000000000/* Definition of class NSBackgroundActivityScheduler Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory John Casamento Date: Fri Oct 25 00:52:54 EDT 2019 This file is part of the GNUstep Library. 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 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 USA. */ #ifndef _NSBackgroundActivityScheduler_h_GNUSTEP_BASE_INCLUDE #define _NSBackgroundActivityScheduler_h_GNUSTEP_BASE_INCLUDE #include #include #include #if OS_API_VERSION(MAC_OS_X_VERSION_10_10, GS_API_LATEST) #if defined(__cplusplus) extern "C" { #endif // is the activity finished? enum { NSBackgroundActivityResultFinished = 1, NSBackgroundActivityResultDeferred = 2, }; typedef NSInteger NSBackgroundActivityResult; // How the activity will be treated... this is declared in NSObjCRuntime on macOS. enum { NSQualityOfServiceUserInteractive = 0x21, NSQualityOfServiceUserInitiated = 0x19, NSQualityOfServiceUtility = 0x11, NSQualityOfServiceBackground = 0x09, NSQualityOfServiceDefault = -1 }; typedef NSInteger NSQualityOfService; @class NSString, NSTimer; # ifndef __has_feature # define __has_feature(x) 0 # endif //# if __has_feature(blocks) //typedef void(^NSBackgroundActivityCompletionHandler)(NSBackgroundActivityResult result) GSScheduledBlock; //# else DEFINE_BLOCK_TYPE(NSBackgroundActivityCompletionHandler, void, NSBackgroundActivityResult); DEFINE_BLOCK_TYPE(GSScheduledBlock, void, NSBackgroundActivityCompletionHandler); //# endif GS_EXPORT_CLASS @interface NSBackgroundActivityScheduler : NSObject { NSString *_identifier; NSQualityOfService _qualityOfService; NSTimeInterval _interval; NSTimeInterval _tolerance; BOOL _repeats; BOOL _shouldDefer; NSTimer *_timer; NSActivityOptions _opts; id _token; NSString *_reason; BLOCK_SCOPE GSScheduledBlock _block; } - (instancetype) initWithIdentifier: (NSString *)identifier; - (NSString *) identifier; - (void) setIdentifier: (NSString *)identifier; - (NSQualityOfService) qualityOfService; - (void) setQualityOfService: (NSQualityOfService)qualityOfService; - (BOOL) repeats; - (void) setRepeats: (BOOL)flag; - (NSTimeInterval) interval; - (void) setInterval: (NSTimeInterval)interval; - (NSTimeInterval) tolerance; - (void) setTolerance: (NSTimeInterval)tolerance; - (BOOL) shouldDefer; - (void) setShouldDefer: (BOOL)flag; - (void) scheduleWithBlock: (GSScheduledBlock)block; - (void) invalidate; @end #if defined(__cplusplus) } #endif #endif /* GS_API_MACOSX */ #endif /* _NSBackgroundActivityScheduler_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSBundle.h000066400000000000000000000620141435650067400215210ustar00rootroot00000000000000/** Interface for NSBundle for GNUStep -*-objc-*- Copyright (C) 1995, 1997, 1999, 2001, 2002 Free Software Foundation, Inc. Written by: Adam Fedor Date: 1995 Updates by various authors. Documentation by Nicola Pero This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSBundle_h_GNUSTEP_BASE_INCLUDE #define __NSBundle_h_GNUSTEP_BASE_INCLUDE #import #if defined(__cplusplus) extern "C" { #endif #import #import #ifdef __ANDROID__ #include #endif @class NSString; @class NSArray; @class NSDictionary; @class NSMutableArray; @class NSMutableDictionary; #if OS_API_VERSION(MAC_OS_X_VERSION_10_5,GS_API_LATEST) enum { NSBundleExecutableArchitectureI386 = 0x00000007, NSBundleExecutableArchitecturePPC = 0x00000012, NSBundleExecutableArchitecturePPC64 = 0x01000012, NSBundleExecutableArchitectureX86_64 = 0x01000007 }; #endif /** * Notification posted when a bundle is loaded. The notification object is * the [NSBundle] itself. The notification also contains a userInfo * dictionary, containing the single key 'NSLoadedClasses', * mapped to an [NSArray] containing the names of each class and category * loaded (as strings). */ GS_EXPORT NSString* const NSBundleDidLoadNotification; /** * A user default affecting the behavior of * [NSBundle-localizedStringForKey:value:table:]. If set, the value of the * key will be returned as an uppercase string rather than any localized * equivalent found. This can be useful during development to check where * a given string in the UI is "coming from". */ GS_EXPORT NSString* const NSShowNonLocalizedStrings; /** * When an [NSBundle] loads classes and posts a * NSBundleDidLoadNotification, its userInfo dictionary * contains this key, mapped to an [NSArray] containing the names of each * class and category loaded (as strings). */ GS_EXPORT NSString* const NSLoadedClasses; /**

NSBundle provides methods for locating and handling application (and tool) resources at runtime. Resources includes any time of file that the application might need, such as images, nib (gorm or gmodel) files, localization files, and any other type of file that an application might need to use to function. Resources also include executable code, which can be dynamically linked into the application at runtime. These files and executable code are commonly put together into a directory called a bundle.

NSBundle knows how these bundles are organized and can search for files inside a bundle. NSBundle also handles locating the executable code, linking this in and initializing any classes that are located in the code. NSBundle also handles Frameworks, which are basically a bundle that contains a library archive. The organization of a framework is a little difference, but in most respects there is no difference between a bundle and a framework.

There is one special bundle, called the mainBundle, which is basically the application itself. The mainBundle is always loaded (of course), but you can still perform other operations on the mainBundle, such as searching for files, just as with any other bundle.

*/ GS_EXPORT_CLASS @interface NSBundle : NSObject { #if GS_EXPOSE(NSBundle) @public NSString *_path; NSMutableArray *_bundleClasses; Class _principalClass; NSDictionary *_infoDict; NSMutableDictionary *_localizations; unsigned _bundleType; BOOL _codeLoaded; unsigned _version; NSString *_frameworkVersion; #endif #if GS_NONFRAGILE #else /* Pointer to private additional data used to avoid breaking ABI * when we don't have the non-fragile ABI available. * Use this mechanism rather than changing the instance variable * layout (see Source/GSInternal.h for details). */ @private id _internal GS_UNUSED_IVAR; #endif } /** Return an array enumerating all the bundles in the application. This * does not include frameworks. */ + (NSArray*) allBundles; /** Return an array enumerating all the frameworks in the application. This * does not include normal bundles. */ + (NSArray*) allFrameworks; /** *

Return the bundle containing the resources for the executable. If * the executable is an application, this is the main application * bundle (the xxx.app directory); if the executable is a tool, this * is a bundle 'naturally' associated with the tool: if the tool * executable is xxx/Tools/ix86/linux-gnu/gnu-gnu-gnu/Control then the * tool's main bundle directory is xxx/Tools/Resources/Control. *

*

NB: traditionally tools didn't have a main bundle -- this is a recent * GNUstep extension, but it's quite nice and it's here to stay. *

*

The main bundle is where the application should put all of its * resources, such as support files (images, html, rtf, txt, ...), * localization tables, .gorm (.nib) files, etc. gnustep-make * (/ProjectCenter) allows you to easily specify the resource files to * put in the main bundle when you create an application or a tool. *

*/ + (NSBundle*) mainBundle; /** *

Return the bundle to which aClass belongs. If aClass was loaded * from a bundle, return the bundle; if it belongs to a framework * (either a framework linked into the application, or loaded * dynamically), return the framework; if it belongs to a library, * return the bundle for that library; in all other cases, return the * main bundle. *

*

Please note that GNUstep supports plain shared libraries, while the * openstep standard, and other openstep-like systems, do not; the * behaviour when aClass belongs to a plain shared library is to return * a bundle for that library, but might be changed. :-) *

*/ + (NSBundle*) bundleForClass: (Class)aClass; /** Returns the bundle for the specified identifier (see -bundleIdentifier) * as long as the bundle has already been loaded. This never causes a * bundle to be loaded. */ + (NSBundle*) bundleWithIdentifier: (NSString*)identifier; /** Return a bundle for the path at path. If path doesn't exist or is * not readable, return nil. If you want the main bundle of an * application or a tool, it's better if you use +mainBundle. */ + (NSBundle*) bundleWithPath: (NSString*)path; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6,GS_API_LATEST) + (NSBundle*) bundleWithURL: (NSURL*)url; #endif /** Returns an absolute path for a resource name with the extension in the specified bundlePath. See also -pathForResource:ofType:inDirectory: for more information on searching a bundle. */ + (NSString*) pathForResource: (NSString*)name ofType: (NSString*)extension inDirectory: (NSString*)bundlePath; /** This method has been deprecated. Version numbers were never implemented so this method behaves exactly like +pathForResource:ofType:inDirectory:. */ + (NSString*) pathForResource: (NSString*)name ofType: (NSString*)extension inDirectory: (NSString*)bundlePath withVersion: (int)version; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6,GS_API_LATEST) + (NSURL*) URLForResource: (NSString*)name withExtension: (NSString*)extension subdirectory: (NSString*)subpath inBundleWithURL: (NSURL*)bundleURL; #endif /** * Init the bundle for reading resources from path.
* The MacOS-X documentation says that the path must be a full path to * a directory on disk. However, it (in MacOS-X) version 10.3 at least) * actually accepts relative paths too.
* The GNUstep behavior is similar in that it accepts a relative path, * but GNUstep converts it to an absolute path by referring to the * current working directory when the is initialised, so an absolute * path is then used and a warning message is printed.
* On MacOS-X using a bundle initialised with a relative path will cause * a crash if the current working directory is changed between the point * at which the bundle was initialised and that at which it is used.
* If path is nil or can't be accessed, initWithPath: deallocates the * receiver and returns nil.
* If a bundle for that path already existed, it is returned in place * of the receiver (and the receiver is deallocated).
* If the -bundleIdentifier is not nil, and a bundle with the same * identifier already exists, the existing bundle is returned in place * of the receiver (and the receiver is deallocated). */ - (id) initWithPath: (NSString*)path; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6,GS_API_LATEST) - (id) initWithURL: (NSURL*)url; #endif /** Return the path to the bundle - an absolute path. */ - (NSString*) bundlePath; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6,GS_API_LATEST) - (NSURL*) bundleURL; #endif /** Returns the class in the bundle with the given name. If no class of this name exists in the bundle, then Nil is returned. */ - (Class) classNamed: (NSString*)className; /** Returns the principal class of the bundle. This is the class specified by the NSPrincipalClass key in the Info-gnustep property list contained in the bundle. If this key or the specified class is not found, the class returned is arbitrary, although it is typically the first class compiled into the archive. */ - (Class) principalClass; /**

Returns an array of paths for all resources with the specified extension and residing in the bundlePath directory. bundlePath can be any type of directory structure, but typically it is used to search for resources in a application or framework. For example, one could search for tiff files in the MyApp.app application using [NSBundle pathsForResourcesOfType: @"tiff" inDirectory: @"MyApp.app"]. It will search in any Resources subdirectory inside bundlePath as well as the main directory for resource files. If extension is nil or empty, all resources are returned.

*/ + (NSArray*) pathsForResourcesOfType: (NSString*)extension inDirectory: (NSString*)bundlePath; /**

Returns an array of paths for all resources with the specified extension and residing in the bundlePath directory. If extension is nil or empty, all bundle resources are returned.

*/ - (NSArray*) pathsForResourcesOfType: (NSString*)extension inDirectory: (NSString*)subPath; /**

Returns an absolute path for a resource name with the extension in the specified bundlePath. Directories in the bundle are searched in the following order:

root path/Resources/subPath root path/Resources/subPath/"language.lproj" root path/subPath root path/subPath/"language.lproj"

where language.lproj can be any localized language directory inside the bundle.

If extension is nil or empty, then the first file exactly matching name (ie with no extension) is returned.

*/ - (NSString*) pathForResource: (NSString*)name ofType: (NSString*)extension inDirectory: (NSString*)subPath; /** Returns an absolute path for a resource name with the extension in the receivers bundle path. See -pathForResource:ofType:inDirectory:. */ - (NSString*) pathForResource: (NSString*)name ofType: (NSString*)extension; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6,GS_API_LATEST) - (NSURL*) URLForResource: (NSString*)name withExtension: (NSString*)extension; - (NSURL*) URLForResource: (NSString*)name withExtension: (NSString*)extension subdirectory: (NSString*)subpath; - (NSURL*) URLForResource: (NSString*)name withExtension: (NSString*)extension subdirectory: (NSString*)subpath localization: (NSString*)localizationName; #endif /** *

Returns the value for the key found in the strings file tableName, or * Localizable.strings if tableName is nil. *

*

If the user default NSShowNonLocalizedStrings is set, the * value of the key will be returned as an uppercase string rather than any * localized equivalent found. This can be useful during development to check * where a given string in the UI is "coming from".

*/ - (NSString*) localizedStringForKey: (NSString*)key value: (NSString*)value table: (NSString*)tableName NS_FORMAT_ARGUMENT(1); /** Returns the absolute path to the resources directory of the bundle. */ - (NSString*) resourcePath; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6,GS_API_LATEST) /** Returns the absolute path to the resources directory of the bundle. */ - (NSURL *) resourceURL; #endif /** Returns the full path to the plug-in subdirectory of the bundle. */ - (NSString *) builtInPlugInsPath; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6,GS_API_LATEST) /** Returns the full path to the plug-in subdirectory of the bundle. */ - (NSURL *) builtInPlugInsURL; #endif /** Returns the full path to the private frameworks subdirectory of the bundle. */ - (NSString *) privateFrameworksPath; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6,GS_API_LATEST) /** Returns the full path to the private frameworks subdirectory of the bundle. */ - (NSURL *) privateFrameworksURL; #endif /** Returns the bundle identifier, as defined by the CFBundleIdentifier key in the infoDictionary */ - (NSString *) bundleIdentifier; /** Returns the bundle version. */ - (unsigned) bundleVersion; /** Set the bundle version */ - (void) setBundleVersion: (unsigned)version; #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) /** * Returns subarray of given array containing those localizations that are * used to locate resources given environment and user preferences. */ + (NSArray *) preferredLocalizationsFromArray: (NSArray *)localizationsArray; /** * Returns subarray of given array containing those localizations that are * used to locate resources given environment given user preferences (which * are used instead of looking up the preferences of the current user). */ + (NSArray *) preferredLocalizationsFromArray: (NSArray *)localizationsArray forPreferences: (NSArray *)preferencesArray; #if OS_API_VERSION(MAC_OS_X_VERSION_10_2,GS_API_LATEST) /** * Returns a boolean indicating whether code for the bundle has been loaded. */ - (BOOL) isLoaded; #endif /** * This method returns the same information as * -pathsForResourcesOfType:inDirectory: except that only non-localized * resources and resources that match the localization localizationName * are returned.
* The GNUstep implementation places localised resources in the array * before any non-localised resources. */ - (NSArray*) pathsForResourcesOfType: (NSString*)extension inDirectory: (NSString*)subPath forLocalization: (NSString*)localizationName; /** * This is like -pathForResource:ofType:inDirectory: but returns only * resources matching localizationName (preferentially), or non-localized * resources. */ - (NSString*) pathForResource: (NSString*)name ofType: (NSString*)extension inDirectory: (NSString*)subPath forLocalization: (NSString*)localizationName; /** Returns the info property list associated with the bundle. */ - (NSDictionary*) infoDictionary; #if OS_API_VERSION(MAC_OS_X_VERSION_10_2,GS_API_LATEST) /** Returns a localized info property list based on the preferred * localization or the most appropriate localization if the preferred * one cannot be found. */ - (NSDictionary*) localizedInfoDictionary; /** Not implemented */ - (NSString*) developmentLocalization; /** Not implemented */ - (id) objectForInfoDictionaryKey: (NSString *)key; #endif /** Returns all the localizations in the bundle. */ - (NSArray*) localizations; /** * Returns the list of localizations that the bundle uses to search * for information. This is based on the user's preferences. */ - (NSArray*) preferredLocalizations; /** Loads any executable code contained in the bundle into the application. Load will be called implicitly if any information about the bundle classes is requested, such as -principalClass or -classNamed:. */ - (BOOL) load; #if OS_API_VERSION(MAC_OS_X_VERSION_10_2,GS_API_LATEST) /** * Not implemented */ - (BOOL) unload; #endif /** Returns the path to the executable code in the bundle */ - (NSString *) executablePath; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6,GS_API_LATEST) - (NSURL *) executableURL; #endif - (NSString *) pathForAuxiliaryExecutable: (NSString *) executableName; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6,GS_API_LATEST) - (NSURL *)URLForAuxiliaryExecutable: (NSString *) executableName; #endif #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_5,GS_API_LATEST) /** Not implemented */ - (NSArray *) executableArchitectures; /** Not implemented */ - (BOOL) preflightAndReturnError: (NSError **)error; /** Not implemented */ - (BOOL) loadAndReturnError: (NSError **)error; #endif @end #if GS_API_VERSION(GS_API_NONE, 011700) /** * Augments [NSBundle], including methods for handling libraries in the GNUstep * fashion, for rapid localization, and other purposes. */ @interface NSBundle (GNUstep) /** This method is an experimental GNUstep extension, and might change. *

Return a bundle to access the resources for the (static or shared) library * libraryName, with interface version interfaceVersion. *

*

Resources for shared libraries are stored into * GNUSTEP_LIBRARY/Libraries/libraryName/Versions/interfaceVersion/Resources/; * this method will search for the first such existing directory and return it. *

*

libraryName should be the name of a library without the * lib prefix or any extensions; interfaceVersion is the * interface version of the library (eg, it's 1.13 in libgnustep-base.so.1.13; * see library.make on how to control it). *

*

This method exists to provide resource bundles for libraries and has no * particular relationship to the library code itsself. The named library * could be a dynamic library linked in to the running program, a static * library (whose code may not even exist on the host machine except where * it is linked in to the program), or even a library which is not linked * into the program at all (eg. where you want to share resources provided * for a library you do not actually use). *

*

The bundle for the library gnustep-base is a special case ... * for this bundle the -principalClass method returns [NSObject] and the * -executablePath method returns the path to the gnustep-base dynamic * library (if it can be found). As a general rule, library bundles are * not guaranteed to return values for these methods as the library may * not exist on disk. *

*/ + (NSBundle *) bundleForLibrary: (NSString *)libraryName version: (NSString *)interfaceVersion; /** This method is a equivalent to bundleForLibrary:version: with a nil * version. */ + (NSBundle *) bundleForLibrary: (NSString *)libraryName; /** Find a resource in the "Library" directory. */ + (NSString*) pathForLibraryResource: (NSString*)name ofType: (NSString*)extension inDirectory: (NSString*)bundlePath; /** Cleans up the path cache for the bundle. */ - (void) cleanPathCache; #ifdef __ANDROID__ /** * Sets the Java Android asset manager. * The developer can call this method to enable asset loading via NSBundle. */ + (void) setJavaAssetManager: (jobject)jassetManager withJNIEnv: (JNIEnv *)env; /** * Returns the native Android asset manager. */ + (AAssetManager *) assetManager; /** * Returns the Android asset for the given path if path is in main bundle * resources and asset exists. * Uses `AASSET_MODE_UNKNOWN` to open the asset if it exists. * The returned object must be released using AAsset_close(). */ + (AAsset *) assetForPath: (NSString *)path; /** * Returns the Android asset for the given path if path is in main bundle * resources and asset exists. * Uses the given mode to open the AAsset if it exists. * The returned object must be released using AAsset_close(). */ + (AAsset *) assetForPath: (NSString *)path withMode: (int)mode; /** * Returns the Android asset dir for the given path if path is in main bundle * resources and the asset directory exists. * The returned object must be released using AAssetDir_close(). */ + (AAssetDir *) assetDirForPath: (NSString *)path; #endif /* __ANDROID__ */ @end #endif /* GNUSTEP */ /** *

* This function (macro) is used to get the localized * translation of the string key. * key is looked up in the * Localizable.strings file for the current * language. The current language is determined by the * available languages in which the application is * translated, and by using the NSLanguages user * defaults (which should contain an array of the languages * preferred by the user, in order of preference). *

*

* Technically, the function works by calling * localizedStringForKey:value:table: on the * main bundle, using @"" as value, and * nil as the table. The comment * is ignored when the macro is expanded; but when we have * tools which can generate the * Localizable.strings files automatically from * source code, the comment will be used by the * tools and added as a comment before the string to * translate. Upon finding something like *

*

* * NSLocalizedString (@"My useful string", * @"My useful comment about the string"); * *

*

* in the source code, the tools will generate a comment and the line *

*

* * " My useful string" = "My useful string"; * *

*

* in the Localizable.strings file (the * translator then can use this as a skeleton for the * Localizable.strings for his/her own language, * where she/he can replace the right hand side with the * translation in her/his own language). The comment can * help the translator to decide how to translate when it is * not clear how to translate (because the original string is * now out of context, and out of context might not be so * clear what the string means). The comment is totally * ignored by the library code. *

*

* If you don't have a comment (because the string is so * self-explanatory that it doesn't need it), you can leave * it blank, by using @"" as a comment. If the * string might be unclear out of context, it is recommended * that you add a comment (even if it is unused for now). *

*/ #define NSLocalizedString(key, comment) \ [[NSBundle mainBundle] localizedStringForKey: (key) value: @"" table: nil] /** * This function (macro) does the same as * NSLocalizedString, but uses the table * table rather than the default table. This * means that the string to translate will be looked up in a * different file than Localizable.strings. For * example, if you pass DatabaseErrors as the * table, the string will be looked up for * translation in the file * DatabaseErrors.strings. This allows you to * have the same string translated in different ways, by * having a different translation in different tables, and * choosing between the different translation by choosing a * different table. */ #define NSLocalizedStringFromTable(key, tbl, comment) \ [[NSBundle mainBundle] localizedStringForKey: (key) value: @"" table: (tbl)] /** * This function is the full-blown localization function (it * is actually a macro). It looks up the string * key for translation in the table * table of the bundle bundle * (please refer to the NSBundle documentation for more * information on how this lookup is done). * comment is a comment, which is ignored by the * library (it is discarded when the macro is expanded) but which * can be used by tools which parse the source code and generate * strings table to provide a comment which the translator can * use when translating the string. */ #define NSLocalizedStringFromTableInBundle(key, tbl, bundle, comment) \ [bundle localizedStringForKey: (key) value: @"" table: (tbl)] #if defined(__cplusplus) } #endif #if !NO_GNUSTEP && !defined(GNUSTEP_BASE_INTERNAL) #import #endif #endif /* __NSBundle_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSByteCountFormatter.h000066400000000000000000000075401435650067400241130ustar00rootroot00000000000000/* Definition of class NSByteCountFormatter Copyright (C) 2019 Free Software Foundation, Inc. Written by: Gregory Casamento Date: July 2019 This file is part of the GNUstep Library. 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 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 USA. */ #ifndef _NSByteCountFormatter_h_GNUSTEP_BASE_INCLUDE #define _NSByteCountFormatter_h_GNUSTEP_BASE_INCLUDE #import #import #import #import #if defined(__cplusplus) extern "C" { #endif @class NSString, NSAttributedString, NSDictionary, NSError, NSLocale, NSNumber; #if OS_API_VERSION(MAC_OS_X_VERSION_10_8, GS_API_LATEST) enum { NSByteCountFormatterUseDefault = 0, NSByteCountFormatterUseBytes = 1UL << 0, NSByteCountFormatterUseKB = 1UL << 1, NSByteCountFormatterUseMB = 1UL << 2, NSByteCountFormatterUseGB = 1UL << 3, NSByteCountFormatterUseTB = 1UL << 4, NSByteCountFormatterUsePB = 1UL << 5, NSByteCountFormatterUseEB = 1UL << 6, NSByteCountFormatterUseZB = 1UL << 7, NSByteCountFormatterUseYBOrHigher = 0x0FFUL << 8, NSByteCountFormatterUseAll = 0x0FFFFUL }; typedef NSInteger NSByteCountFormatterUnits; enum { NSByteCountFormatterCountStyleFile = 0, NSByteCountFormatterCountStyleMemory = 1, NSByteCountFormatterCountStyleDecimal = 2, NSByteCountFormatterCountStyleBinary = 3, }; typedef NSInteger NSByteCountFormatterCountStyle; GS_EXPORT_CLASS @interface NSByteCountFormatter : NSFormatter { #if GS_EXPOSE(NSByteCountFormatter) #endif #if GS_NONFRAGILE # if defined(GS_NSByteCountFormatter_IVARS) @public GS_NSByteCountFormatter_IVARS; # endif #else /* Pointer to private additional data used to avoid breaking ABI * when we don't have the non-fragile ABI available. * Use this mechanism rather than changing the instance variable * layout (see Source/GSInternal.h for details). */ @private id _internal GS_UNUSED_IVAR; #endif } - (NSFormattingContext) formattingContext; - (void) setFormattingContext: (NSFormattingContext)ctx; - (NSByteCountFormatterCountStyle) countStyle; - (void) setCountStyle: (NSByteCountFormatterCountStyle)style; - (BOOL) allowsNonnumericFormatting; - (void) setAllowsNonnumericFormatting: (BOOL)flag; - (BOOL) includesActualByteCount; - (void) setIncludesActualByteCount: (BOOL)flag; - (BOOL) isAdaptive; - (void) setAdaptive: (BOOL)flag; - (NSByteCountFormatterUnits) allowedUnits; - (void) setAllowedUnits: (NSByteCountFormatterUnits)units; - (BOOL) includesCount; - (void) setIncludesCount: (BOOL)flag; - (BOOL) includesUnit; - (void) setIncludesUnit: (BOOL)flag; - (BOOL) zeroPadsFractionDigits; - (void) setZeroPadsFractionDigits: (BOOL)flag; - (NSString *) stringForObjectValue: (id)obj; /* Beta methods... - (NSString *) stringFromMeasurement: (NSMeasurement *)measurement; End beta methods. */ - (NSString *)stringFromByteCount: (long long)byteCount; + (NSString *)stringFromByteCount: (long long)byteCount countStyle: (NSByteCountFormatterCountStyle)countStyle; @end #if defined(__cplusplus) } #endif #endif /* GS_API_MACOSX */ #endif /* _NSByteCountFormatter_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSByteOrder.h000066400000000000000000000443411435650067400222120ustar00rootroot00000000000000/* NSByteOrder functions for GNUStep Copyright (C) 1998 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 1998 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSByteOrder_h_GNUSTEP_BASE_INCLUDE #define __NSByteOrder_h_GNUSTEP_BASE_INCLUDE #import #import #if defined(__cplusplus) extern "C" { #endif /* * OPENSTEP type definitions for Byte ordering. */ typedef uint32_t NSSwappedFloat; typedef uint64_t NSSwappedDouble; typedef enum { NS_UnknownByteOrder, NS_LittleEndian, NS_BigEndian } NSByteOrder; /* * Function prototypes. */ #if (__GNUC__ == 2) && (__GNUC_MINOR__ <= 6) && !defined(__attribute__) # define __attribute__(x) #endif /* * First the GNUstep functions for byte swapping */ static inline uint16_t GSSwapI16(uint16_t in) __attribute__((unused)); static inline uint32_t GSSwapI32(uint32_t in) __attribute__((unused)); static inline uint64_t GSSwapI64(uint64_t in) __attribute__((unused)); static inline gsu128 GSSwapI128(gsu128 in) __attribute__((unused)); static inline uint16_t GSSwapBigI16ToHost(uint16_t in) __attribute__((unused)); static inline uint32_t GSSwapBigI32ToHost(uint32_t in) __attribute__((unused)); static inline uint64_t GSSwapBigI64ToHost(uint64_t in) __attribute__((unused)); static inline gsu128 GSSwapBigI128ToHost(gsu128 in) __attribute__((unused)); static inline uint16_t GSSwapHostI16ToBig(uint16_t in) __attribute__((unused)); static inline uint32_t GSSwapHostI32ToBig(uint32_t in) __attribute__((unused)); static inline uint64_t GSSwapHostI64ToBig(uint64_t in) __attribute__((unused)); static inline gsu128 GSSwapHostI128ToBig(gsu128 in) __attribute__((unused)); static inline uint16_t GSSwapLittleI16ToHost(uint16_t in) __attribute__((unused)); static inline uint32_t GSSwapLittleI32ToHost(uint32_t in) __attribute__((unused)); static inline uint64_t GSSwapLittleI64ToHost(uint64_t in) __attribute__((unused)); static inline gsu128 GSSwapLittleI128ToHost(gsu128 in) __attribute__((unused)); static inline uint16_t GSSwapHostI16ToLittle(uint16_t in) __attribute__((unused)); static inline uint32_t GSSwapHostI32ToLittle(uint32_t in) __attribute__((unused)); static inline uint64_t GSSwapHostI64ToLittle(uint64_t in) __attribute__((unused)); static inline gsu128 GSSwapHostI128ToLittle(gsu128 in) __attribute__((unused)); #if (__GNUC__ == 3) && (__GNUC_MINOR__ == 1) /* gcc 3.1 with option -O2 generates bad (i386?) code when compiling the following inline functions inside a .m file. A call to a dumb function seems to work. */ extern void _gcc3_1_hack(void); #endif static inline uint16_t GSSwapI16(uint16_t in) { union swap { uint16_t num; uint8_t byt[2]; } dst; union swap *src = (union swap*)∈ #if (__GNUC__ == 3) && (__GNUC_MINOR__ == 1) _gcc3_1_hack(); #endif dst.byt[0] = src->byt[1]; dst.byt[1] = src->byt[0]; return dst.num; } static inline uint32_t GSSwapI32(uint32_t in) { union swap { uint32_t num; uint8_t byt[4]; } dst; union swap *src = (union swap*)∈ #if (__GNUC__ == 3) && (__GNUC_MINOR__ == 1) _gcc3_1_hack(); #endif dst.byt[0] = src->byt[3]; dst.byt[1] = src->byt[2]; dst.byt[2] = src->byt[1]; dst.byt[3] = src->byt[0]; return dst.num; } static inline uint64_t GSSwapI64(uint64_t in) { union swap { uint64_t num; uint8_t byt[8]; } dst; union swap *src = (union swap*)∈ #if (__GNUC__ == 3) && (__GNUC_MINOR__ == 1) _gcc3_1_hack(); #endif dst.byt[0] = src->byt[7]; dst.byt[1] = src->byt[6]; dst.byt[2] = src->byt[5]; dst.byt[3] = src->byt[4]; dst.byt[4] = src->byt[3]; dst.byt[5] = src->byt[2]; dst.byt[6] = src->byt[1]; dst.byt[7] = src->byt[0]; return dst.num; } static inline gsu128 GSSwapI128(gsu128 in) { union swap { gsu128 num; uint8_t byt[16]; } dst; union swap *src = (union swap*)∈ #if (__GNUC__ == 3) && (__GNUC_MINOR__ == 1) _gcc3_1_hack(); #endif dst.byt[0] = src->byt[15]; dst.byt[1] = src->byt[14]; dst.byt[2] = src->byt[13]; dst.byt[3] = src->byt[12]; dst.byt[4] = src->byt[11]; dst.byt[5] = src->byt[10]; dst.byt[6] = src->byt[9]; dst.byt[7] = src->byt[8]; dst.byt[8] = src->byt[7]; dst.byt[9] = src->byt[6]; dst.byt[10] = src->byt[5]; dst.byt[11] = src->byt[4]; dst.byt[12] = src->byt[3]; dst.byt[13] = src->byt[2]; dst.byt[14] = src->byt[1]; dst.byt[15] = src->byt[0]; return dst.num; } /* * Now the OpenStep functions */ static inline NSSwappedDouble NSConvertHostDoubleToSwapped(double num) __attribute__((unused)); static inline NSSwappedFloat NSConvertHostFloatToSwapped(float num) __attribute__((unused)); static inline double NSConvertSwappedDoubleToHost(NSSwappedDouble num) __attribute__((unused)); static inline float NSConvertSwappedFloatToHost(NSSwappedFloat num) __attribute__((unused)); static inline unsigned int NSSwapInt(unsigned int in) __attribute__((unused)); static inline unsigned long long NSSwapLongLong(unsigned long long in) __attribute__((unused)); static inline unsigned long NSSwapLong(unsigned long in) __attribute__((unused)); static inline unsigned short NSSwapShort(unsigned short in) __attribute__((unused)); static inline NSSwappedDouble NSSwapDouble(NSSwappedDouble num) __attribute__((unused)); static inline NSSwappedFloat NSSwapFloat(NSSwappedFloat num) __attribute__((unused)); static inline NSByteOrder NSHostByteOrder(void) __attribute__((unused)); static inline double NSSwapBigDoubleToHost(NSSwappedDouble num) __attribute__((unused)); static inline float NSSwapBigFloatToHost(NSSwappedFloat num) __attribute__((unused)); static inline unsigned int NSSwapBigIntToHost(unsigned int num) __attribute__((unused)); static inline unsigned long long NSSwapBigLongLongToHost(unsigned long long num) __attribute__((unused)); static inline unsigned long NSSwapBigLongToHost(unsigned long num) __attribute__((unused)); static inline unsigned short NSSwapBigShortToHost(unsigned short num) __attribute__((unused)); static inline NSSwappedDouble NSSwapHostDoubleToBig(double num) __attribute__((unused)); static inline NSSwappedFloat NSSwapHostFloatToBig(float num) __attribute__((unused)); static inline unsigned int NSSwapHostIntToBig(unsigned int num) __attribute__((unused)); static inline unsigned long long NSSwapHostLongLongToBig(unsigned long long num) __attribute__((unused)); static inline unsigned long NSSwapHostLongToBig(unsigned long num) __attribute__((unused)); static inline unsigned short NSSwapHostShortToBig(unsigned short num) __attribute__((unused)); static inline double NSSwapLittleDoubleToHost(NSSwappedDouble num) __attribute__((unused)); static inline float NSSwapLittleFloatToHost(NSSwappedFloat num) __attribute__((unused)); static inline unsigned int NSSwapLittleIntToHost(unsigned int num) __attribute__((unused)); static inline unsigned long long NSSwapLittleLongLongToHost(unsigned long long num) __attribute__((unused)); static inline unsigned long NSSwapLittleLongToHost(unsigned long num) __attribute__((unused)); static inline unsigned short NSSwapLittleShortToHost(unsigned short num) __attribute__((unused)); static inline NSSwappedDouble NSSwapHostDoubleToLittle(double num) __attribute__((unused)); static inline NSSwappedFloat NSSwapHostFloatToLittle(float num) __attribute__((unused)); static inline unsigned int NSSwapHostIntToLittle(unsigned int num) __attribute__((unused)); static inline unsigned long long NSSwapHostLongLongToLittle(unsigned long long num) __attribute__((unused)); static inline unsigned long NSSwapHostLongToLittle(unsigned long num) __attribute__((unused)); static inline unsigned short NSSwapHostShortToLittle(unsigned short num) __attribute__((unused)); /* * Basic byte swapping routines and type conversions */ static inline NSSwappedDouble NSConvertHostDoubleToSwapped(double num) { union dconv { double number; NSSwappedDouble sd; }; return ((union dconv *)&num)->sd; } static inline NSSwappedFloat NSConvertHostFloatToSwapped(float num) { union fconv { float number; NSSwappedFloat sf; }; return ((union fconv *)&num)->sf; } static inline double NSConvertSwappedDoubleToHost(NSSwappedDouble num) { union dconv { double number; NSSwappedDouble sd; }; return ((union dconv *)&num)->number; } static inline float NSConvertSwappedFloatToHost(NSSwappedFloat num) { union fconv { float number; NSSwappedFloat sf; }; return ((union fconv *)&num)->number; } static inline unsigned int NSSwapInt(unsigned int in) { #if GS_SIZEOF_INT == 2 return GSSwapI16(in); #else #if GS_SIZEOF_INT == 4 return GSSwapI32(in); #else #if GS_SIZEOF_INT == 8 return GSSwapI64(in); #else return GSSwapI128(in); #endif #endif #endif } static inline unsigned long long NSSwapLongLong(unsigned long long in) { #if GS_SIZEOF_LONG_LONG == 2 return GSSwapI16(in); #else #if GS_SIZEOF_LONG_LONG == 4 return GSSwapI32(in); #else #if GS_SIZEOF_LONG_LONG == 8 return GSSwapI64(in); #else return GSSwapI128(in); #endif #endif #endif } static inline unsigned long NSSwapLong(unsigned long in) { #if GS_SIZEOF_LONG == 2 return GSSwapI16(in); #else #if GS_SIZEOF_LONG == 4 return GSSwapI32(in); #else #if GS_SIZEOF_LONG == 8 return GSSwapI64(in); #else return GSSwapI128(in); #endif #endif #endif } static inline unsigned short NSSwapShort(unsigned short in) { #if GS_SIZEOF_SHORT == 2 return GSSwapI16(in); #else #if GS_SIZEOF_SHORT == 4 return GSSwapI32(in); #else #if GS_SIZEOF_SHORT == 8 return GSSwapI64(in); #else return GSSwapI128(in); #endif #endif #endif } static inline NSSwappedDouble NSSwapDouble(NSSwappedDouble num) { return GSSwapI64(num); } static inline NSSwappedFloat NSSwapFloat(NSSwappedFloat num) { return GSSwapI32(num); } #if GS_WORDS_BIGENDIAN static inline NSByteOrder NSHostByteOrder(void) { return NS_BigEndian; } /* * Swap Big endian to host */ static inline uint16_t GSSwapBigI16ToHost(uint16_t in) { return in; } static inline uint32_t GSSwapBigI32ToHost(uint32_t in) { return in; } static inline uint64_t GSSwapBigI64ToHost(uint64_t in) { return in; } static inline gsu128 GSSwapBigI128ToHost(gsu128 in) { return in; } static inline double NSSwapBigDoubleToHost(NSSwappedDouble num) { return NSConvertSwappedDoubleToHost(num); } static inline float NSSwapBigFloatToHost(NSSwappedFloat num) { return NSConvertSwappedFloatToHost(num); } static inline unsigned int NSSwapBigIntToHost(unsigned int num) { return num; } static inline unsigned long long NSSwapBigLongLongToHost(unsigned long long num) { return num; } static inline unsigned long NSSwapBigLongToHost(unsigned long num) { return num; } static inline unsigned short NSSwapBigShortToHost(unsigned short num) { return num; } /* * Swap Host to Big endian */ static inline uint16_t GSSwapHostI16ToBig(uint16_t in) { return in; } static inline uint32_t GSSwapHostI32ToBig(uint32_t in) { return in; } static inline uint64_t GSSwapHostI64ToBig(uint64_t in) { return in; } static inline gsu128 GSSwapHostI128ToBig(gsu128 in) { return in; } static inline NSSwappedDouble NSSwapHostDoubleToBig(double num) { return NSConvertHostDoubleToSwapped(num); } static inline NSSwappedFloat NSSwapHostFloatToBig(float num) { return NSConvertHostFloatToSwapped(num); } static inline unsigned int NSSwapHostIntToBig(unsigned int num) { return num; } static inline unsigned long long NSSwapHostLongLongToBig(unsigned long long num) { return num; } static inline unsigned long NSSwapHostLongToBig(unsigned long num) { return num; } static inline unsigned short NSSwapHostShortToBig(unsigned short num) { return num; } /* * Swap Little endian to Host */ static inline uint16_t GSSwapLittleI16ToHost(uint16_t in) { return GSSwapI16(in); } static inline uint32_t GSSwapLittleI32ToHost(uint32_t in) { return GSSwapI32(in); } static inline uint64_t GSSwapLittleI64ToHost(uint64_t in) { return GSSwapI64(in); } static inline gsu128 GSSwapLittleI128ToHost(gsu128 in) { return GSSwapI128(in); } static inline double NSSwapLittleDoubleToHost(NSSwappedDouble num) { return NSConvertSwappedDoubleToHost(NSSwapDouble(num)); } static inline float NSSwapLittleFloatToHost(NSSwappedFloat num) { return NSConvertSwappedFloatToHost(NSSwapFloat(num)); } static inline unsigned int NSSwapLittleIntToHost(unsigned int num) { return NSSwapInt(num); } static inline unsigned long long NSSwapLittleLongLongToHost(unsigned long long num) { return NSSwapLongLong(num); } static inline unsigned long NSSwapLittleLongToHost(unsigned long num) { return NSSwapLong(num); } static inline unsigned short NSSwapLittleShortToHost(unsigned short num) { return NSSwapShort(num); } /* * Swap Host to Little endian */ static inline uint16_t GSSwapHostI16ToLittle(uint16_t in) { return GSSwapI16(in); } static inline uint32_t GSSwapHostI32ToLittle(uint32_t in) { return GSSwapI32(in); } static inline uint64_t GSSwapHostI64ToLittle(uint64_t in) { return GSSwapI64(in); } static inline gsu128 GSSwapHostI128ToLittle(gsu128 in) { return GSSwapI128(in); } static inline NSSwappedDouble NSSwapHostDoubleToLittle(double num) { return NSSwapDouble(NSConvertHostDoubleToSwapped(num)); } static inline NSSwappedFloat NSSwapHostFloatToLittle(float num) { return NSSwapFloat(NSConvertHostFloatToSwapped(num)); } static inline unsigned int NSSwapHostIntToLittle(unsigned int num) { return NSSwapInt(num); } static inline unsigned long long NSSwapHostLongLongToLittle(unsigned long long num) { return NSSwapLongLong(num); } static inline unsigned long NSSwapHostLongToLittle(unsigned long num) { return NSSwapLong(num); } static inline unsigned short NSSwapHostShortToLittle(unsigned short num) { return NSSwapShort(num); } #else static inline NSByteOrder NSHostByteOrder(void) { return NS_LittleEndian; } /* * Swap Big endian to host */ static inline uint16_t GSSwapBigI16ToHost(uint16_t in) { return GSSwapI16(in); } static inline uint32_t GSSwapBigI32ToHost(uint32_t in) { return GSSwapI32(in); } static inline uint64_t GSSwapBigI64ToHost(uint64_t in) { return GSSwapI64(in); } static inline gsu128 GSSwapBigI128ToHost(gsu128 in) { return GSSwapI128(in); } static inline double NSSwapBigDoubleToHost(NSSwappedDouble num) { return NSConvertSwappedDoubleToHost(NSSwapDouble(num)); } static inline float NSSwapBigFloatToHost(NSSwappedFloat num) { return NSConvertSwappedFloatToHost(NSSwapFloat(num)); } static inline unsigned int NSSwapBigIntToHost(unsigned int num) { return NSSwapInt(num); } static inline unsigned long long NSSwapBigLongLongToHost(unsigned long long num) { return NSSwapLongLong(num); } static inline unsigned long NSSwapBigLongToHost(unsigned long num) { return NSSwapLong(num); } static inline unsigned short NSSwapBigShortToHost(unsigned short num) { return NSSwapShort(num); } /* * Swap Host to Big endian */ static inline uint16_t GSSwapHostI16ToBig(uint16_t in) { return GSSwapI16(in); } static inline uint32_t GSSwapHostI32ToBig(uint32_t in) { return GSSwapI32(in); } static inline uint64_t GSSwapHostI64ToBig(uint64_t in) { return GSSwapI64(in); } static inline gsu128 GSSwapHostI128ToBig(gsu128 in) { return GSSwapI128(in); } static inline NSSwappedDouble NSSwapHostDoubleToBig(double num) { return NSSwapDouble(NSConvertHostDoubleToSwapped(num)); } static inline NSSwappedFloat NSSwapHostFloatToBig(float num) { return NSSwapFloat(NSConvertHostFloatToSwapped(num)); } static inline unsigned int NSSwapHostIntToBig(unsigned int num) { return NSSwapInt(num); } static inline unsigned long long NSSwapHostLongLongToBig(unsigned long long num) { return NSSwapLongLong(num); } static inline unsigned long NSSwapHostLongToBig(unsigned long num) { return NSSwapLong(num); } static inline unsigned short NSSwapHostShortToBig(unsigned short num) { return NSSwapShort(num); } /* * Swap Little endian to Host */ static inline uint16_t GSSwapLittleI16ToHost(uint16_t in) { return in; } static inline uint32_t GSSwapLittleI32ToHost(uint32_t in) { return in; } static inline uint64_t GSSwapLittleI64ToHost(uint64_t in) { return in; } static inline gsu128 GSSwapLittleI128ToHost(gsu128 in) { return in; } static inline double NSSwapLittleDoubleToHost(NSSwappedDouble num) { return NSConvertSwappedDoubleToHost(num); } static inline float NSSwapLittleFloatToHost(NSSwappedFloat num) { return NSConvertSwappedFloatToHost(num); } static inline unsigned int NSSwapLittleIntToHost(unsigned int num) { return num; } static inline unsigned long long NSSwapLittleLongLongToHost(unsigned long long num) { return num; } static inline unsigned long NSSwapLittleLongToHost(unsigned long num) { return num; } static inline unsigned short NSSwapLittleShortToHost(unsigned short num) { return num; } /* * Swap Host to Little endian */ static inline uint16_t GSSwapHostI16ToLittle(uint16_t in) { return in; } static inline uint32_t GSSwapHostI32ToLittle(uint32_t in) { return in; } static inline uint64_t GSSwapHostI64ToLittle(uint64_t in) { return in; } static inline gsu128 GSSwapHostI128ToLittle(gsu128 in) { return in; } static inline NSSwappedDouble NSSwapHostDoubleToLittle(double num) { return NSConvertHostDoubleToSwapped(num); } static inline NSSwappedFloat NSSwapHostFloatToLittle(float num) { return NSConvertHostFloatToSwapped(num); } static inline unsigned int NSSwapHostIntToLittle(unsigned int num) { return num; } static inline unsigned long long NSSwapHostLongLongToLittle(unsigned long long num) { return num; } static inline unsigned long NSSwapHostLongToLittle(unsigned long num) { return num; } static inline unsigned short NSSwapHostShortToLittle(unsigned short num) { return num; } #endif #if defined(__cplusplus) } #endif #endif /* __NSByteOrder_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSCache.h000066400000000000000000000124371435650067400213170ustar00rootroot00000000000000/* Interface for NSCache for GNUStep Copyright (C) 2009 Free Software Foundation, Inc. Written by: David Chisnall Created: 2009 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSCache_h_GNUSTEP_BASE_INCLUDE #define __NSCache_h_GNUSTEP_BASE_INCLUDE #import #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) #import #if defined(__cplusplus) extern "C" { #endif @class NSString; @class NSMapTable; @class GS_GENERIC_CLASS(NSMutableArray, ElementT); GS_EXPORT_CLASS @interface GS_GENERIC_CLASS(NSCache, KeyT, ValT) : NSObject { #if GS_EXPOSE(NSCache) @private /** The maximum total cost of all cache objects. */ NSUInteger _costLimit; /** Total cost of currently-stored objects. */ NSUInteger _totalCost; /** The maximum number of objects in the cache. */ NSUInteger _countLimit; /** The delegate object, notified when objects are about to be evicted. */ id _delegate; /** Flag indicating whether discarded objects should be evicted */ BOOL _evictsObjectsWithDiscardedContent; /** Name of this cache. */ NSString *_name; /** The mapping from names to objects in this cache. */ NSMapTable *_objects; /** LRU ordering of all potentially-evictable objects in this cache. */ GS_GENERIC_CLASS(NSMutableArray, ValT) *_accesses; /** Total number of accesses to objects */ int64_t _totalAccesses; #endif #if GS_NONFRAGILE #else /* Pointer to private additional data used to avoid breaking ABI * when we don't have the non-fragile ABI available. * Use this mechanism rather than changing the instance variable * layout (see Source/GSInternal.h for details). */ @private id _internal GS_UNUSED_IVAR; #endif } /** * Returns the maximum number of objects that are supported by this cache. */ - (NSUInteger) countLimit; /** * Returns the total cost of all objects held in the cache. */ - (NSUInteger) totalCostLimit; /** * Returns the cache's delegate. */ - (id) delegate; /** * Returns whether objects stored in this cache which implement the * NSDiscardableContent protocol are removed from the cache when their contents * are evicted. */ - (BOOL) evictsObjectsWithDiscardedContent; /** * Returns the name associated with this cache. */ - (NSString*) name; /** * Returns an object associated with the specified key in this cache. */ - (GS_GENERIC_TYPE(ValT)) objectForKey: (GS_GENERIC_TYPE(KeyT))key; /** * Removes all objects from this cache. */ - (void) removeAllObjects; /** * Removes the object associated with the given key. */ - (void) removeObjectForKey: (GS_GENERIC_TYPE(KeyT))key; /** * Sets the maximum number of objects permitted in this cache. This limit is * advisory; caches may choose to disregard it temporarily or permanently. A * limit of 0 is used to indicate no limit; this is the default. */ - (void) setCountLimit: (NSUInteger)lim; /** * Sets the delegate for this cache. The delegate will be notified when an * object is being evicted or removed from the cache. */ - (void) setDelegate: (id)del; /** * Sets whether this cache will evict objects that conform to the * NSDiscardableContent protocol, or simply discard their contents. */ - (void) setEvictsObjectsWithDiscardedContent: (BOOL)b; /** * Sets the name for this cache. */ - (void) setName: (NSString*)cacheName; /** * Adds an object and its associated cost. The cache will endeavor to keep the * total cost below the value set with -setTotalCostLimit: by discarding the * contents of objects which implement the NSDiscardableContent protocol. */ - (void) setObject: (GS_GENERIC_TYPE(ValT))obj forKey: (GS_GENERIC_TYPE(KeyT))key cost: (NSUInteger)num; /** * Adds an object to the cache without associating a cost with it. */ - (void) setObject: (GS_GENERIC_TYPE(ValT))obj forKey: (GS_GENERIC_TYPE(KeyT))key; /** * Sets the maximum total cost for objects stored in this cache. This limit is * advisory; caches may choose to disregard it temporarily or permanently. A * limit of 0 is used to indicate no limit; this is the default. */ - (void) setTotalCostLimit: (NSUInteger)lim; @end /** * Protocol implemented by NSCache delegate objects. */ @protocol NSCacheDelegate /** * Delegate method, called just before the cache removes an object, either as * the result of user action or due to the cache becoming full. */ - (void) cache: (NSCache*)cache willEvictObject: (id)obj; @end #if defined(__cplusplus) } #endif #endif //OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) #endif /* __NSCache_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSCalendar.h000066400000000000000000000313271435650067400220240ustar00rootroot00000000000000/* NSCalendar.h Copyright (C) 2010 Free Software Foundation, Inc. Written by: Stefan Bidigaray Date: December, 2010 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 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; see the file COPYING.LIB. If not, see or write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __NSCalendar_h_GNUSTEP_BASE_INCLUDE #define __NSCalendar_h_GNUSTEP_BASE_INCLUDE #import #if OS_API_VERSION(MAC_OS_X_VERSION_10_4, GS_API_LATEST) #include #include @class NSDate; @class NSCalendar; @class NSLocale; @class NSString; @class NSTimeZone; #if defined(__cplusplus) extern "C" { #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) GS_EXPORT NSString *const NSCalendarIdentifierGregorian; GS_EXPORT NSString *const NSCalendarIdentifierBuddhist; GS_EXPORT NSString *const NSCalendarIdentifierChinese; GS_EXPORT NSString *const NSCalendarIdentifierCoptic; GS_EXPORT NSString *const NSCalendarIdentifierEthiopicAmeteMihret; GS_EXPORT NSString *const NSCalendarIdentifierEthiopicAmeteAlem; GS_EXPORT NSString *const NSCalendarIdentifierHebrew; GS_EXPORT NSString *const NSCalendarIdentifierISO8601; GS_EXPORT NSString *const NSCalendarIdentifierIndian; GS_EXPORT NSString *const NSCalendarIdentifierIslamic; GS_EXPORT NSString *const NSCalendarIdentifierIslamicCivil; GS_EXPORT NSString *const NSCalendarIdentifierJapanese; GS_EXPORT NSString *const NSCalendarIdentifierPersian; GS_EXPORT NSString *const NSCalendarIdentifierRepublicOfChina; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_10, GS_API_LATEST) GS_EXPORT NSString *const NSCalendarIdentifierIslamicTabular; GS_EXPORT NSString *const NSCalendarIdentifierIslamicUmmAlQura; #endif // NSCalendarOptions enum // These values are currently NOT supported in this NSCalendar implementation. #if OS_API_VERSION(MAC_OS_X_VERSION_10_9, GS_API_LATEST) typedef NSUInteger NSCalendarOptions; enum { NSCalendarWrapComponents = (1UL << 0), NSCalendarMatchStrictly = (1ULL << 1), NSCalendarSearchBackwards = (1ULL << 2), NSCalendarMatchPreviousTimePreservingSmallerUnits = (1ULL << 8), NSCalendarMatchNextTimePreservingSmallerUnits = (1ULL << 9), NSCalendarMatchNextTime = (1ULL << 10), NSCalendarMatchFirst = (1ULL << 12), NSCalendarMatchLast = (1ULL << 13) }; #endif typedef NSUInteger NSCalendarUnit; /* Old-style NSCalendarUnit declarations, deprecated */ enum { NSEraCalendarUnit = (1UL << 1), NSYearCalendarUnit = (1UL << 2), NSMonthCalendarUnit = (1UL << 3), NSDayCalendarUnit = (1UL << 4), NSHourCalendarUnit = (1UL << 5), NSMinuteCalendarUnit = (1UL << 6), NSSecondCalendarUnit = (1UL << 7), NSWeekCalendarUnit = (1UL << 8), NSWeekdayCalendarUnit = (1UL << 9), NSWeekdayOrdinalCalendarUnit = (1UL << 10), #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) NSQuarterCalendarUnit = (1UL << 11), #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_7, GS_API_LATEST) NSWeekOfMonthCalendarUnit = (1UL << 12), NSWeekOfYearCalendarUnit = (1UL << 13), NSYearForWeekOfYearCalendarUnit = (1UL << 14), #endif }; /* New-style NSCalendarUnit declarations */ enum { #if OS_API_VERSION(MAC_OS_X_VERSION_10_9, GS_API_LATEST) NSCalendarUnitEra = (1UL << 1), NSCalendarUnitYear = (1UL << 2), NSCalendarUnitMonth = (1UL << 3), NSCalendarUnitDay = (1UL << 4), NSCalendarUnitHour = (1UL << 5), NSCalendarUnitMinute = (1UL << 6), NSCalendarUnitSecond = (1UL << 7), NSCalendarUnitWeekday = (1UL << 9), NSCalendarUnitWeekdayOrdinal = (1UL << 10), #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) NSCalendarUnitQuarter = (1UL << 11), #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_7, GS_API_LATEST) NSCalendarUnitWeekOfMonth = (1UL << 12), NSCalendarUnitWeekOfYear = (1UL << 13), NSCalendarUnitYearForWeekOfYear = (1UL << 14), NSCalendarUnitNanosecond = (1 << 15), NSCalendarUnitCalendar = (1 << 20), // FIXME: unimplemented NSCalendarUnitTimeZone = (1 << 21) // FIXME: unimplemented #endif }; enum { NSWrapCalendarComponents = (1UL << 0) }; enum { NSDateComponentUndefined = NSIntegerMax, NSUndefinedDateComponent = NSDateComponentUndefined }; GS_EXPORT_CLASS @interface NSDateComponents : NSObject { @private void *_NSDateComponentsInternal; /* FIXME ... remove dummy fields at next binary incompatible release */ void *_dummy1; void *_dummy2; void *_dummy3; void *_dummy4; void *_dummy5; void *_dummy6; void *_dummy7; void *_dummy8; void *_dummy9; void *_dummy10; void *_dummy11; void *_dummy12; } - (NSInteger) day; - (NSInteger) era; - (NSInteger) hour; - (NSInteger) minute; - (NSInteger) month; - (NSInteger) second; - (NSInteger) week; - (NSInteger) weekday; - (NSInteger) weekdayOrdinal; - (NSInteger) year; - (void) setDay: (NSInteger) v; - (void) setEra: (NSInteger) v; - (void) setHour: (NSInteger) v; - (void) setMinute: (NSInteger) v; - (void) setMonth: (NSInteger) v; - (void) setSecond: (NSInteger) v; - (void) setWeek: (NSInteger) v; - (void) setWeekday: (NSInteger) v; - (void) setWeekdayOrdinal: (NSInteger) v; - (void) setYear: (NSInteger) v; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) - (NSInteger) quarter; - (void) setQuarter: (NSInteger) v; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_7, GS_API_LATEST) - (NSCalendar *) calendar; - (NSTimeZone *) timeZone; - (void) setCalendar: (NSCalendar *) cal; - (void) setTimeZone: (NSTimeZone *) tz; /** *

* Computes a date by using the components set in this NSDateComponents * instance. *

*

* A calendar (and optionally a time zone) must be set prior to * calling this method. *

*/ - (NSDate *) date; /** Returns the number of the week in this month. */ - (NSInteger) weekOfMonth; /** * Returns the number of the week in this year. * Identical to calling week. */ - (NSInteger) weekOfYear; /** * The year corresponding to the current week. * This value may differ from year around the end of the year. * * For example, for 2012-12-31, the year number is 2012, but * yearForWeekOfYear is 2013, since it's already week 1 in 2013. */ - (NSInteger) yearForWeekOfYear; - (NSInteger) nanosecond; /** Sets the number of the week in this month. */ - (void) setWeekOfMonth: (NSInteger) v; /** * Sets the number of the week in this year. * Identical to calling -setWeek. */ - (void) setWeekOfYear: (NSInteger) v; /** * Sets the year number for the current week. * See the explanation at -yearForWeekOfYear. */ - (void) setYearForWeekOfYear: (NSInteger) v; - (void) setNanosecond: (NSInteger) v; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_8, GS_API_LATEST) - (BOOL) leapMonth; - (void) setLeapMonth: (BOOL) v; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_9, GS_API_LATEST) - (BOOL) isValidDate; - (BOOL) isValidDateInCalendar: (NSCalendar *) calendar; - (NSInteger) valueForComponent: (NSCalendarUnit) unit; - (void) setValue: (NSInteger) value forComponent: (NSCalendarUnit) unit; #endif @end GS_EXPORT_CLASS @interface NSCalendar : NSObject { @private void *_NSCalendarInternal; /* FIXME ... remove dummy fields at next binary incompatible release */ void *_dummy1; void *_dummy2; void *_dummy3; } /** * Returns the current calendar. */ + (id) currentCalendar; /** * Create a calendar with the given string as identifier. */ + (id) calendarWithIdentifier: (NSString *) string; /** * Instantiate a calendar with the given string as identifier. */ - (id) initWithCalendarIdentifier: (NSString *) string; /** * Returns the calendar identifier for the receiver. */ - (NSString *) calendarIdentifier; /** * Returns the calendar units specified by unitFlags for the given date object. */ - (NSDateComponents *) components: (NSUInteger) unitFlags fromDate: (NSDate *) date; /** * Compute the different between the specified components in the two dates. * Values are summed up as long as now higher-granularity unit is specified. * That means if you want to extract the year and the day from two dates * which are 13 months + 1 day apart, you will get 1 as the result for the year * but the rest of the difference in days. (29 <= x <= 32, depending on the * month). * * Please note that the NSWrapCalendarComponents option that should affect the * calculations is not presently supported. */ - (NSDateComponents *) components: (NSUInteger) unitFlags fromDate: (NSDate *) startingDate toDate: (NSDate *) resultDate options: (NSUInteger) opts; /** * Returns a date object created by adding the NSDateComponents in comps to * to object date with the options specified by opts. */ - (NSDate *) dateByAddingComponents: (NSDateComponents *) comps toDate: (NSDate *) date options: (NSUInteger) opts; /** * Creates an NSDate from NSDateComponents in comps. */ - (NSDate *) dateFromComponents: (NSDateComponents *) comps; /** * Returns the locale of the receiver. */ - (NSLocale *) locale; /** * Sets the locale of the receiver. */ - (void)setLocale: (NSLocale *) locale; /** * Returns the integer value of the first weekday (0-6). */ - (NSUInteger) firstWeekday; /** * Set the integer first weekday of the week (0-6). */ - (void) setFirstWeekday: (NSUInteger) weekday; /** * Returns the minimum number of days in the first week of the receiver. */ - (NSUInteger) minimumDaysInFirstWeek; /** * Sets the minimum number of days in the first week of the receiver. */ - (void) setMinimumDaysInFirstWeek: (NSUInteger) mdw; /** * Returns the NSTimeZone associated with the receiver. */ - (NSTimeZone *) timeZone; /** * Sets tz as the current NSTimeZone of the receiver. */ - (void) setTimeZone: (NSTimeZone *) tz; /** * Returns the maximum range of unit. */ - (NSRange) maximumRangeOfUnit: (NSCalendarUnit) unit; /** * Returns the minimum range of unit. */ - (NSRange) minimumRangeofUnit: (NSCalendarUnit) unit; /** * Returns the ordinality of unit smaller within the * unit larger with the given date. */ - (NSUInteger) ordinalityOfUnit: (NSCalendarUnit) smaller inUnit: (NSCalendarUnit) larger forDate: (NSDate *) date; /** * Returns the range of unit smaller in larger in date. */ - (NSRange) rangeOfUnit: (NSCalendarUnit) smaller inUnit: (NSCalendarUnit) larger forDate: (NSDate *) date; #if OS_API_VERSION(MAC_OS_X_VERSION_10_5, GS_API_LATEST) /** * A calendar that tracks changes to the user's calendar. */ + (id) autoupdatingCurrentCalendar; /** * Returns by referene the started time and duration of a given unit containing the given date. */ - (BOOL) rangeOfUnit: (NSCalendarUnit) unit startDate: (NSDate **) datep interval: (NSTimeInterval *)tip forDate: (NSDate *)date; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_9, GS_API_LATEST) /** * Returns by reference the era, year, month, and day from the given date. */ - (void) getEra: (NSInteger *)eraValuePointer year: (NSInteger *)yearValuePointer month: (NSInteger *)monthValuePointer day: (NSInteger *)dayValuePointer fromDate: (NSDate *)date; /** * Returns by reference the hour, minute, second, and nanosecond from the given date. */ - (void) getHour: (NSInteger *)hourValuePointer minute: (NSInteger *)minuteValuePointer second: (NSInteger *)secondValuePointer nanosecond: (NSInteger *)nanosecondValuePointer fromDate: (NSDate *)date; /** * Returns by reference the era, year, week of year, and weekday from the given date. */ - (void) getEra: (NSInteger *)eraValuePointer yearForWeekOfYear: (NSInteger *)yearValuePointer weekOfYear: (NSInteger *)weekValuePointer weekday: (NSInteger *)weekdayValuePointer fromDate: (NSDate *)date; /** * Returns the integer value of the specified unit from the given date. */ - (NSInteger) component: (NSCalendarUnit)unit fromDate: (NSDate *)date; #endif @end #if defined(__cplusplus) } #endif #endif /* OS_API_VERSION(MAC_OS_X_VERSION_10_4, GS_API_LATEST) */ #endif /* __NSCalendar_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSCalendarDate.h000066400000000000000000000122131435650067400226130ustar00rootroot00000000000000/* Interface for NSCalendarDate for GNUStep Copyright (C) 1994, 1996, 1999 Free Software Foundation, Inc. This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSCalendarDate_h_GNUSTEP_BASE_INCLUDE #define __NSCalendarDate_h_GNUSTEP_BASE_INCLUDE #import #import #if defined(__cplusplus) extern "C" { #endif @class NSTimeZone; @class NSTimeZoneDetail; GS_EXPORT_CLASS @interface NSCalendarDate : NSDate { #if GS_EXPOSE(NSCalendarDate) NSTimeInterval _seconds_since_ref; NSString *_calendar_format; NSTimeZone *_time_zone; #endif } // Getting an NSCalendar Date + (id) calendarDate; + (id) dateWithString: (NSString*)description calendarFormat: (NSString*)format; + (id) dateWithString: (NSString*)description calendarFormat: (NSString*)format locale: (NSDictionary*)dictionary; + (id) dateWithYear: (NSInteger)year month: (NSUInteger)month day: (NSUInteger)day hour: (NSUInteger)hour minute: (NSUInteger)minute second: (NSUInteger)second timeZone: (NSTimeZone*)aTimeZone; // Initializing an NSCalendar Date - (id) initWithString: (NSString*)description; - (id) initWithString: (NSString*)description calendarFormat: (NSString*)format; - (id) initWithString: (NSString*)description calendarFormat: (NSString*)fmt locale: (NSDictionary*)locale; - (id) initWithYear: (NSInteger)year month: (NSUInteger)month day: (NSUInteger)day hour: (NSUInteger)hour minute: (NSUInteger)minute second: (NSUInteger)second timeZone: (NSTimeZone*)aTimeZone; // Retrieving Date Elements - (NSInteger) dayOfCommonEra; - (NSInteger) dayOfMonth; - (NSInteger) dayOfWeek; - (NSInteger) dayOfYear; - (NSInteger) hourOfDay; - (NSInteger) minuteOfHour; - (NSInteger) monthOfYear; - (NSInteger) secondOfMinute; - (NSInteger) yearOfCommonEra; /** *

Returns a calendar date formed by adding the specified offsets to the * receiver. The offsets are added in order, years, then months, then * days, then hours then minutes then seconds, so if you add 1 month and * forty days to 20th September, the result will be 9th November. *

*

This method understands leap years and tries to adjust for daylight * savings time changes so that it preserves expected clock time. *

*

The returned date has the calendar format and timezone of the receiver. *

*/ - (NSCalendarDate*) addYear: (NSInteger)year month: (NSInteger)month day: (NSInteger)day hour: (NSInteger)hour minute: (NSInteger)minute second: (NSInteger)second; // Getting String Descriptions of Dates - (NSString*) description; - (NSString*) descriptionWithCalendarFormat: (NSString*)format; - (NSString*) descriptionWithCalendarFormat: (NSString*)format locale: (NSDictionary*)locale; - (NSString*) descriptionWithLocale: (id)locale; // Getting and Setting Calendar Formats - (NSString*) calendarFormat; - (void) setCalendarFormat: (NSString*)format; // Getting and Setting Time Zones - (void) setTimeZone: (NSTimeZone*)aTimeZone; #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) - (NSTimeZone*) timeZone; #endif #if OS_API_VERSION(GS_API_OPENSTEP, GS_API_MACOSX) - (NSTimeZoneDetail*) timeZoneDetail; #endif @end #if OS_API_VERSION(GS_API_NONE, GS_API_NONE) @interface NSCalendarDate (GregorianDate) - (NSInteger) lastDayOfGregorianMonth: (NSInteger)month year: (NSInteger)year; - (NSInteger) absoluteGregorianDay: (NSInteger)day month: (NSInteger)month year: (NSInteger)year; - (void) gregorianDateFromAbsolute: (NSInteger)d day: (NSInteger*)day month: (NSInteger*)month year: (NSInteger*)year; @end #endif #if OS_API_VERSION(GS_API_OPENSTEP, GS_API_MACOSX) @interface NSCalendarDate (OPENSTEP) - (NSCalendarDate*) dateByAddingYears: (NSInteger)years months: (NSInteger)months days: (NSInteger)days hours: (NSInteger)hours minutes: (NSInteger)minutes seconds: (NSInteger)seconds; - (void) years: (NSInteger*)years months: (NSInteger*)months days: (NSInteger*)days hours: (NSInteger*)hours minutes: (NSInteger*)minutes seconds: (NSInteger*)seconds sinceDate: (NSDate*)date; @end #endif #if !NO_GNUSTEP && !defined(GNUSTEP_BASE_INTERNAL) #import #endif #if defined(__cplusplus) } #endif #endif /* __NSCalendarDate_h_GNUSTEP_BASE_INCLUDE*/ gnustep-base-1.29.0/Headers/Foundation/NSCharacterSet.h000066400000000000000000000167601435650067400226670ustar00rootroot00000000000000/* Interface for NSCharacterSet for GNUStep Copyright (C) 1995 Free Software Foundation, Inc. Written by: Adam Fedor Date: 1995 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSCharacterSet_h_GNUSTEP_BASE_INCLUDE #define __NSCharacterSet_h_GNUSTEP_BASE_INCLUDE #import #import #import #if defined(__cplusplus) extern "C" { #endif @class NSData; /** * Represents a set of unicode characters. Used by [NSScanner] and [NSString] * for parsing-related methods. */ GS_EXPORT_CLASS @interface NSCharacterSet : NSObject /** * Returns a character set containing letters, numbers, and diacritical * marks. Note that "letters" includes all alphabetic as well as Chinese * characters, etc.. */ + (id) alphanumericCharacterSet; #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) /** * Returns a character set containing letters in the unicode * Titlecase category. */ + (id) capitalizedLetterCharacterSet; #endif /** * Returns a character set containing control and format characters. */ + (id) controlCharacterSet; /** * Returns a character set containing characters that represent * the decimal digits 0 through 9. */ + (id) decimalDigitCharacterSet; /** * Returns a character set containing individual characters that * can be represented also by a composed character sequence. */ + (id) decomposableCharacterSet; /** * Returns a character set containing unassigned and explicitly illegal * character values. */ + (id) illegalCharacterSet; /** * Returns a character set containing letters, including all alphabetic as * well as Chinese characters, etc.. */ + (id) letterCharacterSet; /** * Returns a character set that contains the lowercase characters. * This set does not include caseless characters, only those that * have corresponding characters in uppercase and/or titlecase. */ + (id) lowercaseLetterCharacterSet; #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) /** * Returns a character set containing the newline characters, values * 0x000A and 0x000D and nextline 0x0085 character. */ + (id) newlineCharacterSet; /** * Returns allowed characers for URL fragment component. */ + (id) URLFragmentAllowedCharacterSet; /** * Returns allowed characers for URL host component. */ + (id) URLHostAllowedCharacterSet; /** * Returns allowed characers for URL password component. */ + (id) URLPasswordAllowedCharacterSet; /** * Returns allowed characers for URL path component. */ + (id) URLPathAllowedCharacterSet; /** * Returns allowed characers for URL query component. */ + (id) URLQueryAllowedCharacterSet; /** * Returns allowed characers for URL USER component. */ + (id) URLUserAllowedCharacterSet; #endif /** * Returns a character set containing characters for diacritical marks, which * are usually only rendered in conjunction with another character. */ + (id) nonBaseCharacterSet; /** * Returns a character set containing punctuation marks. */ + (id) punctuationCharacterSet; #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) /** * Returns a character set containing mathematical symbols, etc.. */ + (id) symbolCharacterSet; #endif /** * Returns a character set that contains the uppercase characters. * This set does not include caseless characters, only those that * have corresponding characters in lowercase and/or titlecase. */ + (id) uppercaseLetterCharacterSet; /** * Returns a character set that contains the whitespace characters, * plus the newline characters, values 0x000A and 0x000D and nextline * 0x0085 character. */ + (id) whitespaceAndNewlineCharacterSet; /** * Returns a character set that contains the whitespace characters. */ + (id) whitespaceCharacterSet; /** * Returns a character set containing characters as encoded in the * data object (8192 bytes) */ + (id) characterSetWithBitmapRepresentation: (NSData*)data; /** * Returns set with characters in aString, or empty set for empty string. * Raises an exception if given a nil string. */ + (id) characterSetWithCharactersInString: (NSString*)aString; /** * Returns set containing unicode index range given by aRange. */ + (id) characterSetWithRange: (NSRange)aRange; #if OS_API_VERSION(GS_API_OPENSTEP, GS_API_MACOSX) /** * Initializes from a bitmap (8192 bytes representing 65536 values).
* Each bit set in the bitmap represents the fact that a character at * that position in the unicode base plane exists in the characterset.
* File must have extension ".bitmap". * To get around this load the file into data yourself and use * [NSCharacterSet -characterSetWithBitmapRepresentation]. */ + (id) characterSetWithContentsOfFile: (NSString*)aFile; #endif /** * Returns a bitmap representation of the receiver's character set * (suitable for archiving or writing to a file), in an NSData object.
*/ - (NSData*) bitmapRepresentation; /** * Returns YES if the receiver contains aCharacter, NO if * it does not. */ - (BOOL) characterIsMember: (unichar)aCharacter; #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) /** * Returns YES if the receiver contains at least one character in the * specified unicode plane. */ - (BOOL) hasMemberInPlane: (uint8_t)aPlane; #endif /** * Returns a character set containing only characters that the * receiver does not contain. */ - (NSCharacterSet*) invertedSet; #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) /** * Returns YES is all the characters in aSet are present in the receiver. */ - (BOOL) isSupersetOfSet: (NSCharacterSet*)aSet; /** * Returns YES is the specified 32-bit character is present in the receiver. */ - (BOOL) longCharacterIsMember: (UTF32Char)aCharacter; #endif @end /** * An [NSCharacterSet] that can be modified. */ GS_EXPORT_CLASS @interface NSMutableCharacterSet : NSCharacterSet /** * Adds characters specified by unicode indices in aRange to set. */ - (void) addCharactersInRange: (NSRange)aRange; /** * Adds characters in aString to set. */ - (void) addCharactersInString: (NSString*)aString; /** * Set intersection of character sets. */ - (void) formIntersectionWithCharacterSet: (NSCharacterSet*)otherSet; /** * Set union of character sets. */ - (void) formUnionWithCharacterSet: (NSCharacterSet*)otherSet; /** * Drop given range of characters. No error for characters not currently in * set. */ - (void) removeCharactersInRange: (NSRange)aRange; /** * Drop characters in aString. No error for characters not currently in * set. */ - (void) removeCharactersInString: (NSString*)aString; /** * Remove all characters currently in set and add all other characters. */ - (void) invert; @end #if defined(__cplusplus) } #endif #endif /* __NSCharacterSet_h_GNUSTEP_BASE_INCLUDE*/ gnustep-base-1.29.0/Headers/Foundation/NSClassDescription.h000066400000000000000000000045611435650067400235640ustar00rootroot00000000000000/* Interface for NSClassDescription for GNUStep Copyright (C) 2000 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 2000 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSClassDescription_h_GNUSTEP_BASE_INCLUDE #define __NSClassDescription_h_GNUSTEP_BASE_INCLUDE #import #import #import #if defined(__cplusplus) extern "C" { #endif #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) @class NSArray; @class NSDictionary; @class NSString; /** * Posted by [NSClassDescription+classDescriptionForClass:] when a class * description cannot be found for a class. The implementation will check * again after the notification is (synchronously) processed, allowing * descriptions to be registered lazily. */ GS_EXPORT NSString* const NSClassDescriptionNeededForClassNotification; GS_EXPORT_CLASS @interface NSClassDescription : NSObject + (NSClassDescription*) classDescriptionForClass: (Class)aClass; + (void) invalidateClassDescriptionCache; + (void) registerClassDescription: (NSClassDescription*)aDescription forClass: (Class)aClass; - (NSArray*) attributeKeys; - (NSString*) inverseForRelationshipKey: (NSString*)aKey; - (NSArray*) toManyRelationshipKeys; - (NSArray*) toOneRelationshipKeys; @end @interface NSObject (NSClassDescriptionPrimitives) - (NSArray*) attributeKeys; - (NSClassDescription*) classDescription; - (NSString*) inverseForRelationshipKey: (NSString*)aKey; - (NSArray*) toManyRelationshipKeys; - (NSArray*) toOneRelationshipKeys; @end #endif #if defined(__cplusplus) } #endif #endif gnustep-base-1.29.0/Headers/Foundation/NSCoder.h000066400000000000000000000270571435650067400213540ustar00rootroot00000000000000/* Interface for NSCoder for GNUStep Copyright (C) 1995, 1996 Free Software Foundation, Inc. Written by: Andrew Kachites McCallum Date: 1995 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSCoder_h_GNUSTEP_BASE_INCLUDE #define __NSCoder_h_GNUSTEP_BASE_INCLUDE #import #import #import #import #import #if defined(__cplusplus) extern "C" { #endif @class NSMutableData, NSData, NSString; /** *

Top-level class defining methods for use when archiving (encoding) * objects to a byte array or file, and when restoring (decoding) objects. * Generally only subclasses of this class are used directly - [NSArchiver], * [NSUnarchiver], [NSKeyedArchiver], [NSKeyedUnarchiver], or [NSPortCoder]. *

*

NSPortCoder is used within the distributed objects * framework. For archiving to/from disk, the Keyed... classes are * preferred for new implementations, since they provide greater * forward/backward compatibility in the face of class changes.

*/ GS_EXPORT_CLASS @interface NSCoder : NSObject // Encoding Data /** * Encodes array of count structures or objects of given type, which may be * obtained through the '@encode(...)' compile-time operator. * Usually this is used for primitives though it can be used for objects as * well. */ - (void) encodeArrayOfObjCType: (const char*)type count: (NSUInteger)count at: (const void*)array; /** * Can be ignored. */ - (void) encodeBycopyObject: (id)anObject; /** * Can be ignored. */ - (void) encodeByrefObject: (id)anObject; /** * Stores bytes directly into archive. */ - (void) encodeBytes: (void*)d length: (NSUInteger)l; /** * Encode object if it is/will be encoded unconditionally by this coder, * otherwise store a nil. */ - (void) encodeConditionalObject: (id)anObject; /** * Encode an instance of [NSData]. */ - (void) encodeDataObject: (NSData*)data; /** * Encodes a generic object. This will usually result in an * [(NSCoding)-encodeWithCoder:] message being sent to anObject so it * can encode itself. */ - (void) encodeObject: (id)anObject; /** * Encodes a property list by calling [NSSerializer -serializePropertyList:], * then encoding the resulting [NSData] object. */ - (void) encodePropertyList: (id)plist; /** * Encodes a point structure. */ - (void) encodePoint: (NSPoint)point; /** * Encodes a rectangle structure. */ - (void) encodeRect: (NSRect)rect; /** * Store object and objects it refers to in archive (i.e., complete object * graph). */ - (void) encodeRootObject: (id)rootObject; /** * Encodes a size structure. */ - (void) encodeSize: (NSSize)size; /** * Encodes structure or object of given type, which may be obtained * through the '@encode(...)' compile-time operator. Usually * this is used for primitives though it can be used for objects as well. */ - (void) encodeValueOfObjCType: (const char*)type at: (const void*)address; /** * Multiple version of [-encodeValueOfObjCType:at:]. */ - (void) encodeValuesOfObjCTypes: (const char*)types,...; // Decoding Data /** * Decodes array of count structures or objects of given type, which may be * obtained through the '@encode(...)' compile-time operator. * Usually this is used for primitives though it can be used for objects as * well. Objects will be retained and you must release them. */ - (void) decodeArrayOfObjCType: (const char*)type count: (NSUInteger)count at: (void*)address; /** * Retrieve bytes directly from archive. */ - (void*) decodeBytesWithReturnedLength: (NSUInteger*)l; /** * Decode an instance of [NSData]. */ - (NSData*) decodeDataObject; /** * Decodes a generic object. Usually the class will be read from the * archive, an object will be created through an alloc call, * then that class will be sent an [(NSCoding)-initWithCoder:] message. */ - (id) decodeObject; /** * Decodes a property list from the archive previously stored through a call * to [-encodePropertyList:]. */ - (id) decodePropertyList; /** * Decodes a point structure. */ - (NSPoint) decodePoint; /** * Decodes a rectangle structure. */ - (NSRect) decodeRect; /** * Decodes a size structure. */ - (NSSize) decodeSize; /** * Decodes structure or object of given type, which may be obtained * through the '@encode(...)' compile-time operator. Usually * this is used for primitives though it can be used for objects as well, * in which case you are responsible for releasing them. */ - (void) decodeValueOfObjCType: (const char*)type at: (void*)address; /** * Multiple version of [-decodeValueOfObjCType:at:]. */ - (void) decodeValuesOfObjCTypes: (const char*)types,...; // Managing Zones /** * Returns zone being used to allocate memory for decoded objects. */ - (NSZone*) objectZone; /** * Sets zone to use for allocating memory for decoded objects. */ - (void) setObjectZone: (NSZone*)zone; // Getting a Version /** * Returns *Step version, which is not the release version, but a large number, * by specification <1000 for pre-OpenStep. This implementation returns * a number based on the GNUstep major, minor, and subminor versions. */ - (unsigned int) systemVersion; /** * Returns current version of class (when encoding) or version of decoded * class (decoded). Version comes from [NSObject -getVersion]. * */ - (NSInteger) versionForClassName: (NSString*)className; #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) /* * Include GSConfig.h for typedefs/defines of uint8_t, int32_t int64_t */ #import /** * Returns a flag indicating whether the receiver supported keyed coding. * the default implementation returns NO. Subclasses supporting keyed * coding must override this to return YES. */ - (BOOL) allowsKeyedCoding; /** * Returns a class indicating whether an encoded value corresponding * to aKey exists. */ - (BOOL) containsValueForKey: (NSString*)aKey; /** * Returns a boolean value associated with aKey. This value must previously * have been encoded using -encodeBool:forKey: */ - (BOOL) decodeBoolForKey: (NSString*)aKey; /** * Returns a pointer to a byte array associated with aKey.
* Returns the length of the data in aLength.
* This value must previously have been encoded using * -encodeBytes:length:forKey: */ - (const uint8_t*) decodeBytesForKey: (NSString*)aKey returnedLength: (NSUInteger*)alength; /** * Returns a double value associated with aKey. This value must previously * have been encoded using -encodeDouble:forKey: or -encodeFloat:forKey: */ - (double) decodeDoubleForKey: (NSString*)aKey; /** * Returns a float value associated with aKey. This value must previously * have been encoded using -encodeFloat:forKey: or -encodeDouble:forKey:
* Precision may be lost (or an exception raised if the value will not fit * in a float) if the value was encoded using -encodeDouble:forKey:, */ - (float) decodeFloatForKey: (NSString*)aKey; /** * Returns an integer value associated with aKey. This value must previously * have been encoded using -encodeInt:forKey:, -encodeInt32:forKey:, or * -encodeInt64:forKey:.
* An exception will be raised if the value does not fit in an integer. */ - (int) decodeIntForKey: (NSString*)aKey; /** * Returns a 32-bit integer value associated with aKey. This value must * previously have been encoded using -encodeInt:forKey:, * -encodeInt32:forKey:, or -encodeInt64:forKey:.
* An exception will be raised if the value does not fit in a 32-bit integer. */ - (int32_t) decodeInt32ForKey: (NSString*)aKey; /** * Returns a 64-bit integer value associated with aKey. This value must * previously have been encoded using -encodeInt:forKey:, * -encodeInt32:forKey:, or -encodeInt64:forKey:. */ - (int64_t) decodeInt64ForKey: (NSString*)aKey; /** * Returns an object value associated with aKey. This value must * previously have been encoded using -encodeObject:forKey: or * -encodeConditionalObject:forKey: */ - (id) decodeObjectForKey: (NSString*)aKey; /** * Encodes aBool and associates the encoded value with aKey. */ - (void) encodeBool: (BOOL) aBool forKey: (NSString*)aKey; /** * Encodes the data of the specified length and pointed to by aPointer, * and associates the encoded value with aKey. */ - (void) encodeBytes: (const uint8_t*)aPointer length: (NSUInteger)length forKey: (NSString*)aKey; /** * Encodes anObject and associates the encoded value with aKey, but only * if anObject has already been encoded using -encodeObject:forKey: */ - (void) encodeConditionalObject: (id)anObject forKey: (NSString*)aKey; /** * Encodes aDouble and associates the encoded value with aKey. */ - (void) encodeDouble: (double)aDouble forKey: (NSString*)aKey; /** * Encodes aFloat and associates the encoded value with aKey. */ - (void) encodeFloat: (float)aFloat forKey: (NSString*)aKey; /** * Encodes an int and associates the encoded value with aKey. */ - (void) encodeInt: (int)anInteger forKey: (NSString*)aKey; /** * Encodes 32 bit integer and associates the encoded value with aKey. */ - (void) encodeInt32: (int32_t)anInteger forKey: (NSString*)aKey; /** * Encodes a 64 bit integer and associates the encoded value with aKey. */ - (void) encodeInt64: (int64_t)anInteger forKey: (NSString*)aKey; /** * Encodes anObject and associates the encoded value with aKey. */ - (void) encodeObject: (id)anObject forKey: (NSString*)aKey; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_5, GS_API_LATEST) /** * Encodes an NSInteger and associates the encoded value with key. */ - (void) encodeInteger: (NSInteger)anInteger forKey: (NSString *)key; /** * Decodes an NSInteger associated with the key. */ - (NSInteger) decodeIntegerForKey: (NSString *)key; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_8, GS_API_LATEST) #if GS_HAS_DECLARED_PROPERTIES @property (nonatomic, assign) BOOL requiresSecureCoding; #else - (BOOL) requiresSecureCoding; - (void) setRequiresSecureCoding: (BOOL)requires; #endif - (id) decodeObjectOfClass: (Class)cls forKey: (NSString *)key; - (id) decodeObjectOfClasses: (NSSet *)classes forKey: (NSString *)key; #endif @end #if defined(__cplusplus) } #endif #endif /* __NSCoder_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSComparisonPredicate.h000066400000000000000000000075421435650067400242500ustar00rootroot00000000000000/* Interface for NSComparisonPredicate for GNUStep Copyright (C) 2005 Free Software Foundation, Inc. Written by: Dr. H. Nikolaus Schaller Created: 2005 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSComparisonPredicate_h_GNUSTEP_BASE_INCLUDE #define __NSComparisonPredicate_h_GNUSTEP_BASE_INCLUDE #import #if OS_API_VERSION(MAC_OS_X_VERSION_10_4, GS_API_LATEST) #import #import #if defined(__cplusplus) extern "C" { #endif typedef enum _NSComparisonPredicateModifier { NSDirectPredicateModifier=0, NSAllPredicateModifier, NSAnyPredicateModifier } NSComparisonPredicateModifier; typedef enum _NSComparisonPredicateOptions { NSCaseInsensitivePredicateOption=0x01, NSDiacriticInsensitivePredicateOption=0x02 } NSComparisonPredicateOptions; typedef enum _NSPredicateOperatorType { NSLessThanPredicateOperatorType = 0, NSLessThanOrEqualToPredicateOperatorType, NSGreaterThanPredicateOperatorType, NSGreaterThanOrEqualToPredicateOperatorType, NSEqualToPredicateOperatorType, NSNotEqualToPredicateOperatorType, NSMatchesPredicateOperatorType, NSLikePredicateOperatorType, NSBeginsWithPredicateOperatorType, NSEndsWithPredicateOperatorType, NSInPredicateOperatorType, NSCustomSelectorPredicateOperatorType #if OS_API_VERSION(MAC_OS_X_VERSION_10_5,GS_API_LATEST) , NSContainsPredicateOperatorType = 99, NSBetweenPredicateOperatorType #endif } NSPredicateOperatorType; GS_EXPORT_CLASS @interface NSComparisonPredicate : NSPredicate { #if GS_EXPOSE(NSComparisonPredicate) NSComparisonPredicateModifier _modifier; SEL _selector; NSUInteger _options; NSPredicateOperatorType _type; #endif #if GS_NONFRAGILE #else /* Pointer to private additional data used to avoid breaking ABI * when we don't have the non-fragile ABI available. * Use this mechanism rather than changing the instance variable * layout (see Source/GSInternal.h for details). */ @private id _internal GS_UNUSED_IVAR; #endif @public NSExpression *_left; NSExpression *_right; } + (NSPredicate *) predicateWithLeftExpression: (NSExpression *)left rightExpression: (NSExpression *)right customSelector: (SEL)sel; + (NSPredicate *) predicateWithLeftExpression: (NSExpression *)left rightExpression: (NSExpression *)right modifier: (NSComparisonPredicateModifier)modifier type: (NSPredicateOperatorType)type options: (NSUInteger) opts; - (NSComparisonPredicateModifier) comparisonPredicateModifier; - (SEL) customSelector; - (NSPredicate *) initWithLeftExpression: (NSExpression *)left rightExpression: (NSExpression *)right customSelector: (SEL)sel; - (id) initWithLeftExpression: (NSExpression *)left rightExpression: (NSExpression *)right modifier: (NSComparisonPredicateModifier)modifier type: (NSPredicateOperatorType)type options: (NSUInteger) opts; - (NSExpression *) leftExpression; - (NSUInteger) options; - (NSPredicateOperatorType) predicateOperatorType; - (NSExpression *) rightExpression; @end #if defined(__cplusplus) } #endif #endif /* 100400 */ #endif gnustep-base-1.29.0/Headers/Foundation/NSCompoundPredicate.h000066400000000000000000000036701435650067400237200ustar00rootroot00000000000000/* Interface for NSCompoundPredicate for GNUStep Copyright (C) 2005 Free Software Foundation, Inc. Written by: Dr. H. Nikolaus Schaller Created: 2005 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSCompoundPredicate_h_GNUSTEP_BASE_INCLUDE #define __NSCompoundPredicate_h_GNUSTEP_BASE_INCLUDE #import #if OS_API_VERSION(MAC_OS_X_VERSION_10_4, GS_API_LATEST) #import #if defined(__cplusplus) extern "C" { #endif enum { NSNotPredicateType = 0, NSAndPredicateType, NSOrPredicateType }; typedef NSUInteger NSCompoundPredicateType; GS_EXPORT_CLASS @interface NSCompoundPredicate : NSPredicate { #if GS_EXPOSE(NSCompoundPredicate) NSCompoundPredicateType _type; NSArray *_subs; #endif } + (NSPredicate *) andPredicateWithSubpredicates: (NSArray *)list; + (NSPredicate *) notPredicateWithSubpredicate: (NSPredicate *)predicate; + (NSPredicate *) orPredicateWithSubpredicates: (NSArray *)list; - (NSCompoundPredicateType) compoundPredicateType; - (id) initWithType: (NSCompoundPredicateType)type subpredicates: (NSArray *)list; - (NSArray *) subpredicates; @end #if defined(__cplusplus) } #endif #endif /* 100400 */ #endif gnustep-base-1.29.0/Headers/Foundation/NSConnection.h000066400000000000000000000225421435650067400224110ustar00rootroot00000000000000/* Interface for GNU Objective-C version of NSConnection Copyright (C) 1997,2000 Free Software Foundation, Inc. Original by: Andrew Kachites McCallum Version for OPENSTEP by: Richard Frith-Macdonald Created: August 1997, updated June 2000 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSConnection_h_GNUSTEP_BASE_INCLUDE #define __NSConnection_h_GNUSTEP_BASE_INCLUDE #import #import #import #import #import #import #import #if defined(__cplusplus) extern "C" { #endif @class NSDistantObject; @class NSPort; @class NSPortNameServer; @class NSData; @class NSInvocation; /* * Keys for the NSDictionary returned by [NSConnection -statistics] */ /* These in OPENSTEP 4.2 */ /** * Key for dictionary returned by [NSConnection-statistics]: number of * messages replied to so far by the remote connection. */ GS_EXPORT NSString* const NSConnectionRepliesReceived; /** * Key for dictionary returned by [NSConnection-statistics]: number of * messages sent so far to the remote connection. */ GS_EXPORT NSString* const NSConnectionRepliesSent; /** * Key for dictionary returned by [NSConnection-statistics]: number of * messages received so far from the remote connection. */ GS_EXPORT NSString* const NSConnectionRequestsReceived; /** * Key for dictionary returned by [NSConnection-statistics]: number of * messages sent so far to the remote connection. */ GS_EXPORT NSString* const NSConnectionRequestsSent; /* These Are GNUstep extras */ /** * GNUstep-specific key for dictionary returned by [NSConnection-statistics]: * number of local objects currently in use remotely. */ GS_EXPORT NSString* const NSConnectionLocalCount; /* Objects sent out */ /** * GNUstep-specific key for dictionary returned by [NSConnection-statistics]: * number of remote objects currently in use. */ GS_EXPORT NSString* const NSConnectionProxyCount; /* Objects received */ /* * NSConnection class interface. * * A few methods are in the specification but not yet implemented. */ GS_EXPORT_CLASS @interface NSConnection : NSObject { #if GS_NONFRAGILE # if defined(GS_NSConnection_IVARS) @public GS_NSConnection_IVARS; # endif #else @private id _internal; #endif } + (NSArray*) allConnections; + (NSConnection*) connectionWithReceivePort: (NSPort*)r sendPort: (NSPort*)s; + (NSConnection*) connectionWithRegisteredName: (NSString*)n host: (NSString*)h; + (NSConnection*) connectionWithRegisteredName: (NSString*)n host: (NSString*)h usingNameServer: (NSPortNameServer*)s; + (id) currentConversation; + (NSConnection*) defaultConnection; + (NSDistantObject*) rootProxyForConnectionWithRegisteredName: (NSString*)n host: (NSString*)h; + (NSDistantObject*) rootProxyForConnectionWithRegisteredName: (NSString*)n host: (NSString*)h usingNameServer: (NSPortNameServer*)s; #if OS_API_VERSION(MAC_OS_X_VERSION_10_5,GS_API_LATEST) + (id) serviceConnectionWithName: (NSString *)name rootObject: (id)root; + (id) serviceConnectionWithName: (NSString *)name rootObject: (id)root usingNameServer: (NSPortNameServer *)server; #endif - (void) addRequestMode: (NSString*)mode; - (void) addRunLoop: (NSRunLoop*)loop; - (id) delegate; - (void) enableMultipleThreads; - (BOOL) independentConversationQueueing; - (id) initWithReceivePort: (NSPort*)r sendPort: (NSPort*)s; - (void) invalidate; - (BOOL) isValid; - (NSArray*)localObjects; - (BOOL) multipleThreadsEnabled; - (NSPort*) receivePort; - (BOOL) registerName: (NSString*)name; - (BOOL) registerName: (NSString*)name withNameServer: (NSPortNameServer*)svr; - (NSArray*) remoteObjects; - (void) removeRequestMode: (NSString*)mode; - (void) removeRunLoop: (NSRunLoop *)loop; - (NSTimeInterval) replyTimeout; - (NSArray*) requestModes; - (NSTimeInterval) requestTimeout; - (id) rootObject; - (NSDistantObject*) rootProxy; - (void) runInNewThread; - (NSPort*) sendPort; - (void) setDelegate: anObj; - (void) setIndependentConversationQueueing: (BOOL)flag; - (void) setReplyTimeout: (NSTimeInterval)to; - (void) setRequestMode: (NSString*)mode; - (void) setRequestTimeout: (NSTimeInterval)to; - (void) setRootObject: anObj; - (NSDictionary*) statistics; @end /** * This category represents an informal protocol to which NSConnection * delegates may conform ... These methods are not actually implemented * by NSObject, so implementing these methods in your class has the effect * documented. */ @interface NSObject (NSConnectionDelegate) /** *

* This is not an NSConnection method, but is a method that may * be implemented by the delegate of an NSConnection object. *

*

* If the delegate implements this method, the NSConnection will * invoke the method for every message request or reply it receives * from the remote NSConnection. The delegate should use the * authentication data to check all the NSData objects * in the components array (ignoring NSPort objects), * and return YES if they are valid, NO otherwise. *

*

* If the method returns NO then an * NSFailedAuthentication exception will be raised. *

*

* In GNUstep the components array is mutable, allowing * you to replace the NSData objects with your own version. *

*/ - (BOOL) authenticateComponents: (NSMutableArray*)components withData: (NSData*)authenticationData; /** *

* This is not an NSConnection method, but is a method that may * be implemented by the delegate of an NSConnection object. *

*

* If the delegate implements this method, the NSConnection will * invoke the method for every message request to reply it sends * to the remote NSConnection. The delegate should generate * authentication data by examining all the NSData objects * in the components array (ignoring NSPort objects), * and return the authentication data that can be used by the * remote NSConnection. *

*

* If the method returns nil then an * NSGenericException exception will be raised. *

*

* In GNUstep the components array is mutable, allowing * you to replace the NSData objects with your own version. *

*/ - (NSData*) authenticationDataForComponents: (NSMutableArray*)components; /** *

* This is not an NSConnection method, but is a method that may * be implemented by the delegate of an NSConnection object. *

*

* If the delegate implements this method, it will be called * whenever a new NSConnection is created that has this * NSConnection as its parent. The delegate may take this * opportunity to adjust the configuration of the new * connection and may return a boolean value to tell the * parent whether the creation of the new connection is to * be permitted or not. *

*/ - (BOOL) connection: (NSConnection*)parent shouldMakeNewConnection: (NSConnection*)newConnection; - (NSConnection*) connection: (NSConnection*)ancestorConn didConnect: (NSConnection*)newConn; /** * An old fashioned synonym for -connection:shouldMakeNewConnection: - * don't use this. */ - (BOOL) makeNewConnection: (NSConnection*)newConnection sender: (NSConnection*)parent; @end /* * NSRunLoop mode, NSNotification name and NSException strings. */ /** * [NSRunLoop] mode for [NSConnection] objects waiting for replies. * Mainly used internally by distributed objects system. */ GS_EXPORT NSString * const NSConnectionReplyMode; /** * Posted when an [NSConnection] is deallocated or it is notified its port is * deactivated. (Note, connections to remote ports don't get such a * notification.) Receivers should deregister themselves for notifications * from the given connection. */ GS_EXPORT NSString * const NSConnectionDidDieNotification; /** * Posted when an [NSConnection] is initialized. */ GS_EXPORT NSString * const NSConnectionDidInitializeNotification; /* OPENSTEP */ /** * Raised by an [NSConnection] on receiving a message that it or its delegate * cannot authenticate. */ GS_EXPORT NSString * const NSFailedAuthenticationException; /* MacOS-X */ GS_EXPORT NSString * const NSDestinationInvalidException; GS_EXPORT NSString * const NSObjectInaccessibleException; GS_EXPORT NSString * const NSObjectNotAvailableException; #if defined(__cplusplus) } #endif #endif /* __NSConnection_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSData.h000066400000000000000000000303171435650067400211620ustar00rootroot00000000000000/* Interface for NSData for GNUStep Copyright (C) 1995 Free Software Foundation, Inc. Written by: Andrew Kachites McCallum Date: 1995 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSData_h_GNUSTEP_BASE_INCLUDE #define __NSData_h_GNUSTEP_BASE_INCLUDE #import #import #import #import #import #if defined(__cplusplus) extern "C" { #endif #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) @class NSError; @class NSURL; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_6,GS_API_LATEST) enum { NSDataSearchBackwards = (1UL << 0), NSDataSearchAnchored = (1UL << 1), }; typedef NSUInteger NSDataSearchOptions; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_9,GS_API_LATEST) enum { NSDataBase64DecodingIgnoreUnknownCharacters = (1UL << 0) }; typedef NSUInteger NSDataBase64DecodingOptions; enum { NSDataBase64Encoding64CharacterLineLength = (1UL << 0), NSDataBase64Encoding76CharacterLineLength = (1UL << 1), NSDataBase64EncodingEndLineWithCarriageReturn = (1UL << 4), NSDataBase64EncodingEndLineWithLineFeed = (1UL << 5), }; typedef NSUInteger NSDataBase64EncodingOptions; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_4,GS_API_LATEST) enum { NSMappedRead = 1, NSUncachedRead = 2 }; enum { NSDataWritingAtomic = 1 }; /* The original name for this was NSAtomicWrite ... need for backward comapat */ #define NSAtomicWrite NSDataWritingAtomic #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_9,GS_API_LATEST) DEFINE_BLOCK_TYPE(GSDataDeallocatorBlock, void, void*, NSUInteger); #endif GS_EXPORT_CLASS @interface NSData : NSObject // Allocating and Initializing a Data Object + (id) data; + (id) dataWithBytes: (const void*)bytes length: (NSUInteger)length; + (id) dataWithBytesNoCopy: (void*)bytes length: (NSUInteger)length; #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) + (id) dataWithBytesNoCopy: (void*)aBuffer length: (NSUInteger)bufferSize freeWhenDone: (BOOL)shouldFree; #endif + (id) dataWithContentsOfFile: (NSString*)path; + (id) dataWithContentsOfMappedFile: (NSString*)path; #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) + (id) dataWithContentsOfURL: (NSURL*)url; #endif + (id) dataWithData: (NSData*)data; #if OS_API_VERSION(MAC_OS_X_VERSION_10_9,GS_API_LATEST) - (id) initWithBase64EncodedData: (NSData*)base64Data options: (NSDataBase64DecodingOptions)options; - (id) initWithBase64EncodedString: (NSString*)base64String options: (NSDataBase64DecodingOptions)options; /** * * Initialize the receiver to hold memory pointed to by bytes without copying. * When the receiver is deallocated, the memory will be freed using the user * supplied deallocBlock. Note that passing a block that (either directly or * indirectly) holds a strong reference the receiver will cause a retain cycle. */ - (instancetype) initWithBytesNoCopy: (void*)bytes length: (NSUInteger)length deallocator: (GSDataDeallocatorBlock)deallocBlock; #endif - (id) initWithBytes: (const void*)aBuffer length: (NSUInteger)bufferSize; - (id) initWithBytesNoCopy: (void*)aBuffer length: (NSUInteger)bufferSize; #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) - (id) initWithBytesNoCopy: (void*)aBuffer length: (NSUInteger)bufferSize freeWhenDone: (BOOL)shouldFree; #endif - (id) initWithContentsOfFile: (NSString*)path; - (id) initWithContentsOfMappedFile: (NSString*)path; #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) - (id) initWithContentsOfURL: (NSURL*)url; #endif - (id) initWithData: (NSData*)data; // Accessing Data - (const void*) bytes; - (NSString*) description; - (void) getBytes: (void*)buffer; - (void) getBytes: (void*)buffer length: (NSUInteger)length; - (void) getBytes: (void*)buffer range: (NSRange)aRange; - (NSData*) subdataWithRange: (NSRange)aRange; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6,GS_API_LATEST) - (NSRange) rangeOfData: (NSData *)dataToFind options: (NSDataSearchOptions)mask range: (NSRange)searchRange; #endif // base64 #if OS_API_VERSION(MAC_OS_X_VERSION_10_9,GS_API_LATEST) - (NSData *) base64EncodedDataWithOptions: (NSDataBase64EncodingOptions)options; - (NSString *) base64EncodedStringWithOptions: (NSDataBase64EncodingOptions)options; #endif // Querying a Data Object - (BOOL) isEqualToData: (NSData*)other; - (NSUInteger) length; /** *

Writes a copy of the data encapsulated by the receiver to a file * at path. If the useAuxiliaryFile flag is YES, this writes to a * temporary file and then renames that to the file at path, thus * ensuring that path exists and does not contain partially written * data at any point. *

*

On success returns YES, on failure returns NO. *

*/ - (BOOL) writeToFile: (NSString*)path atomically: (BOOL)useAuxiliaryFile; #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) /** * Writes a copy of the contents of the receiver to the specified URL. */ - (BOOL) writeToURL: (NSURL*)anURL atomically: (BOOL)flag; #endif // Deserializing Data - (unsigned int) deserializeAlignedBytesLengthAtCursor: (unsigned int*)cursor; - (void) deserializeBytes: (void*)buffer length: (unsigned int)bytes atCursor: (unsigned int*)cursor; - (void) deserializeDataAt: (void*)data ofObjCType: (const char*)type atCursor: (unsigned int*)cursor context: (id )callback; - (int) deserializeIntAtCursor: (unsigned int*)cursor; - (int) deserializeIntAtIndex: (unsigned int)index; - (void) deserializeInts: (int*)intBuffer count: (unsigned int)numInts atCursor: (unsigned int*)cursor; - (void) deserializeInts: (int*)intBuffer count: (unsigned int)numInts atIndex: (unsigned int)index; #if OS_API_VERSION(MAC_OS_X_VERSION_10_4,GS_API_LATEST) /** *

Writes a copy of the data encapsulated by the receiver to a file * at path. If the NSDataWritingAtomic option is set, this writes to a * temporary file and then renames that to the file at path, thus * ensuring that path exists and does not contain partially written * data at any point. *

*

On success returns YES, on failure returns NO. *

*/ - (BOOL) writeToFile: (NSString *)path options: (NSUInteger)writeOptionsMask error: (NSError **)errorPtr; /** * Writes a copy of the contents of the receiver to the specified URL. */ - (BOOL) writeToURL: (NSURL *)url options: (NSUInteger)writeOptionsMask error: (NSError **)errorPtr; #endif @end #if OS_API_VERSION(GS_API_NONE, GS_API_NONE) /* * We include special support for coding/decoding - adding methods for * serializing/deserializing type-tags and cross-references. * * A type-tag is a byte containing - * Bit7 Set to indicate that the tag is for a cross-reference. * Bit5-6 A value for the size of the type or cross-reference. * Bit0-4 A value representing an Objective-C type. */ #define _GSC_NONE 0x00 /* No type information. */ #define _GSC_XREF 0x80 /* Cross reference to an item. */ #define _GSC_SIZE 0x60 /* Type-size info mask. */ #define _GSC_MASK 0x1f /* Basic type info mask. */ /* * If the tag is for a cross-reference, the size field defines the * size of the cross-reference value - * _GSC_X_0 (no crossref), _GSC_X_1, _GSC_X_2, _GSC_X_4 */ #define _GSC_X_0 0x00 /* nil or null pointer */ #define _GSC_X_1 0x20 /* 8-bit cross-ref */ #define _GSC_X_2 0x40 /* 16-bit cross-ref */ #define _GSC_X_4 0x60 /* 32-bit cross-ref */ /* * If the tag is for an integer value, the size field defines the * size of the the encoded integer - * _GSC_I16, _GSC_I32, _GSC_I64, _GSC_I128 * The file GSConfig.h (produced by the configure script) defines the * size codes for this machines 'natural' integers - * _GSC_S_SHT, _GSC_S_INT, _GSC_S_LNG, _GSC_S_LNG_LNG */ #define _GSC_I16 0x00 #define _GSC_I32 0x20 #define _GSC_I64 0x40 #define _GSC_I128 0x60 /* * For the first sixteen types, the size information applies to the * size of the type, for the second sixteen it applies to the * following cross-reference number (or is zero if no crossref follows). */ #define _GSC_MAYX 0x10 /* Item may have crossref. */ /* * These are the types that can be archived - */ #define _GSC_CHR 0x01 #define _GSC_UCHR 0x02 #define _GSC_SHT 0x03 #define _GSC_USHT 0x04 #define _GSC_INT 0x05 #define _GSC_UINT 0x06 #define _GSC_LNG 0x07 #define _GSC_ULNG 0x08 #define _GSC_LNG_LNG 0x09 #define _GSC_ULNG_LNG 0x0a #define _GSC_FLT 0x0b #define _GSC_DBL 0x0c #define _GSC_BOOL 0x0d #define _GSC_ID 0x10 #define _GSC_CLASS 0x11 #define _GSC_SEL 0x12 #define _GSC_PTR 0x13 #define _GSC_CHARPTR 0x14 #define _GSC_ARY_B 0x15 #define _GSC_STRUCT_B 0x16 #define _GSC_CID 0x17 /* Class encoded as id */ @interface NSData (GNUstepExtensions) + (id) dataWithShmID: (int)anID length: (NSUInteger) length; + (id) dataWithSharedBytes: (const void*)bytes length: (NSUInteger) length; /* * -deserializeTypeTag:andCrossRef:atCursor: * This method is provided in order to give the GNUstep version of * NSUnarchiver maximum possible performance. */ - (void) deserializeTypeTag: (unsigned char*)tag andCrossRef: (unsigned int*)ref atCursor: (unsigned int*)cursor; @end #endif GS_EXPORT_CLASS @interface NSMutableData : NSData + (id) dataWithCapacity: (NSUInteger)numBytes; + (id) dataWithLength: (NSUInteger)length; - (id) initWithCapacity: (NSUInteger)capacity; - (id) initWithLength: (NSUInteger)length; // Adjusting Capacity - (void) increaseLengthBy: (NSUInteger)extraLength; - (void) setLength: (NSUInteger)size; - (void*) mutableBytes; // Appending Data - (void) appendBytes: (const void*)aBuffer length: (NSUInteger)bufferSize; - (void) appendData: (NSData*)other; // Modifying Data - (void) replaceBytesInRange: (NSRange)aRange withBytes: (const void*)bytes; #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) - (void) replaceBytesInRange: (NSRange)aRange withBytes: (const void*)bytes length: (NSUInteger)length; #endif - (void) resetBytesInRange: (NSRange)aRange; - (void) setData: (NSData*)data; // Serializing Data - (void) serializeAlignedBytesLength: (unsigned int)length; - (void) serializeDataAt: (const void*)data ofObjCType: (const char*)type context: (id )callback; - (void) serializeInt: (int)value; - (void) serializeInt: (int)value atIndex: (unsigned int)index; - (void) serializeInts: (int*)intBuffer count: (unsigned int)numInts; - (void) serializeInts: (int*)intBuffer count: (unsigned int)numInts atIndex: (unsigned int)index; @end #if OS_API_VERSION(GS_API_NONE, GS_API_NONE) @interface NSMutableData (GNUstepExtensions) /* * Capacity management - GNUstep gives you control over the size of * the data buffer as well as the 'length' of valid data in it. */ - (NSUInteger) capacity; - (id) setCapacity: (NSUInteger)newCapacity; - (int) shmID; /* Shared memory ID for data buffer (if any) */ /* * -serializeTypeTag: * -serializeTypeTag:andCrossRef: * These methods are provided in order to give the GNUstep version of * NSArchiver maximum possible performance. */ - (void) serializeTypeTag: (unsigned char)tag; - (void) serializeTypeTag: (unsigned char)tag andCrossRef: (unsigned int)xref; @end #endif #if defined(__cplusplus) } #endif #if !NO_GNUSTEP && !defined(GNUSTEP_BASE_INTERNAL) #import #endif #endif /* __NSData_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSDate.h000066400000000000000000000252511435650067400211670ustar00rootroot00000000000000/* Interface for NSDate for GNUStep Copyright (C) 1994, 1996, 1999 Free Software Foundation, Inc. This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSDate_h_GNUSTEP_BASE_INCLUDE #define __NSDate_h_GNUSTEP_BASE_INCLUDE #import #import #if defined(__cplusplus) extern "C" { #endif GS_EXPORT NSString * const NSSystemClockDidChangeNotification; /** * Time interval difference between two dates, in seconds. */ typedef double NSTimeInterval; /** * Time interval between the unix standard reference date of 1 January 1970 * and the OpenStep reference date of 1 January 2001
* This number comes from:
* (((31 years * 365 days) + 8 days for leap years) = total number of days
* 24 hours * 60 minutes * 60 seconds)
* This ignores leap-seconds. */ GS_EXPORT const NSTimeInterval NSTimeIntervalSince1970; #import @class NSArray; @class NSCalendarDate; @class NSData; @class NSDictionary; @class NSString; @class NSTimeZone; @class NSTimeZoneDetail; GS_EXPORT_CLASS @interface NSDate : NSObject { } /** Returns an autoreleased instance with the current date/time. */ + (instancetype) date; #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) /** Returns an autoreleased instance representing the date and time given * by string. The value of string may be a 'natural' specification as * specified by the preferences in the user defaults database, allowing * phrases like 'last tuesday' */ + (instancetype) dateWithNaturalLanguageString: (NSString*)string; /** *

Returns an autoreleased instance representing the date and time given * by string. The value of string may be a 'natural' specification as * specified by the preferences in the user defaults database, allowing * phrases like 'last tuesday' *

* The locale contains keys such as - * * NSDateTimeOrdering * Controls the use of ambiguous numbers. This is done as a * sequence of the letters D(ay), M(onth), Y(ear), and H(our). * YMDH means that the first number encountered is assumed to be a * year, the second a month, the third a day, and the last an hour. * * NSEarlierTimeDesignations * An array of strings for times in the past.
* Defaults are ago, last, past, prior *
* NSHourNameDesignations * An array of arrays of strings identifying the time of day. * Each array has an hour as its first value, and one or more words * as subsequent values.
* Defaults are: (0, midnight), (10, morning), (12, noon, lunch), * (14, afternoon), (19, dinner). *
* NSLaterTimeDesignations * An array of strings for times in the future.
* Default is next *
* NSNextDayDesignations * The day after today. Default is tomorrow. * * NSNextNextDayDesignations * The day after tomorrow. Default is nextday. * * NSPriorDayDesignations * The day before today. Default is yesterday. * * NSThisDayDesignations * Identifies the current day. Default is today. * * NSYearMonthWeekDesignations * An array giving the word for year, month, and week.
* Defaults are year, month and week. *
*
*/ + (instancetype) dateWithNaturalLanguageString: (NSString*)string locale: (NSDictionary*)locale; #endif /** Returns an autoreleased instance with the date and time value given * by the string using the ISO standard format YYYY-MM-DD HH:MM:SS +/-HHHMM * (all the fields of which must be present). */ + (instancetype) dateWithString: (NSString*)description; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6,GS_API_LATEST) /** Returns an autoreleased NSDate instance whose value is offset from * that of the given date by the specified interval in seconds. */ + (instancetype) dateWithTimeInterval: (NSTimeInterval)seconds sinceDate: (NSDate*)date; #endif /** Returns an autoreleased instance with the offset from the unix system * reference date of 1 January 1970, GMT. */ + (instancetype) dateWithTimeIntervalSince1970: (NSTimeInterval)seconds; /** Returns an autoreleased instance with the offset from the current * date/time given by seconds (which may be fractional). */ + (instancetype) dateWithTimeIntervalSinceNow: (NSTimeInterval)seconds; /** Returns an autoreleased instance with the offset from the OpenStep * reference date of 1 January 2001, GMT. */ + (instancetype) dateWithTimeIntervalSinceReferenceDate: (NSTimeInterval)seconds; /** Returns an autoreleased instance with the date/time set in the far * past. */ + (instancetype) distantPast; /** Returns an autoreleased instance with the date/time set in the far * future. */ + (instancetype) distantFuture; /** Returns the time interval between the reference date and the current * time. */ + (NSTimeInterval) timeIntervalSinceReferenceDate; /** Returns an autorelease date instance formed by adding the specified * time interval in seconds to the receiver's time interval. */ - (instancetype) addTimeInterval: (NSTimeInterval)seconds; /** Returns the time interval between the receivers value and the * OpenStep reference date of 1 Jan 2001 GMT. */ - (NSComparisonResult) compare: (NSDate*)otherDate; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6,GS_API_LATEST) /** Returns an autoreleased NSDate instance whose value is offset from * that of the receiver by the specified interval. */ - (instancetype) dateByAddingTimeInterval: (NSTimeInterval)ti; #endif /** Returns an autoreleased instance of the [NSCalendarDate] class whose * date/time value is the same as that of the receiver, and which uses * the formatString and timeZone specified. */ - (NSCalendarDate*) dateWithCalendarFormat: (NSString*)formatString timeZone: (NSTimeZone*)timeZone; /** Returns a string representation of the receiver formatted according * to the default format string, time zone, and locale. */ - (NSString*) description; /** Returns a string representation of the receiver formatted according * to the specified format string, time zone, and locale. */ - (NSString*) descriptionWithCalendarFormat: (NSString*)format timeZone: (NSTimeZone*)aTimeZone locale: (NSDictionary*)l; /** Returns a string representation of the receiver formatted according * to the default format string and time zone, but using the given locale. */ - (NSString*) descriptionWithLocale: (id)locale; /** Returns the earlier of the receiver and otherDate.
* If the two represent identical date/time values, returns the receiver. */ - (NSDate*) earlierDate: (NSDate*)otherDate; /** Returns an instance initialised with the current date/time. */ - (instancetype) init; /** Returns an instance with the date and time value given * by the string using the ISO standard format YYYY-MM-DD HH:MM:SS +/-HHHMM * (all the fields of which must be present). */ - (instancetype) initWithString: (NSString*)description; /** Returns an instance with the given offset from anotherDate. */ - (instancetype) initWithTimeInterval: (NSTimeInterval)secsToBeAdded sinceDate: (NSDate*)anotherDate; #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) /** Returns an instance with the offset from the unix system * reference date of 1 January 1970, GMT. */ - (instancetype) initWithTimeIntervalSince1970: (NSTimeInterval)seconds; #endif /** Returns an instance with the offset from the current date/time. */ - (instancetype) initWithTimeIntervalSinceNow: (NSTimeInterval)secsToBeAdded; /** * Returns an instance with the given offset from the OpenStep * reference date of 1 January 2001, GMT. */ - (instancetype) initWithTimeIntervalSinceReferenceDate: (NSTimeInterval)secs; /** Returns NO if other is not a date, otherwise returns the result of * calling the -isEqualtoDate: method. */ - (BOOL) isEqual: (id)other; /** Returns whether the receiver is exactly equal to other, to the limit * of the NSTimeInterval precision.
* This is the behavior of the current MacOS-X system, not that of the * OpenStep specification (which counted two dates within a second of * each other as being equal).
* The old behavior meant that two dates equal to a third date were not * necessarily equal to each other (confusing), and meant that there was * no reasonable way to use a date as a dictionary key or store dates * in a set. */ - (BOOL) isEqualToDate: (NSDate*)other; /** Returns the earlier of the receiver and otherDate.
* If the two represent identical date/time values, returns the receiver. */ - (NSDate*) laterDate: (NSDate*)otherDate; /** Returns the time interval between the receivers value and the * unix system reference date of 1 January 1970, GMT. */ - (NSTimeInterval) timeIntervalSince1970; /** Returns the time interval between the receivers value and that of the * otherDate argument. If otherDate is earlier than the receiver, the * returned value will be positive, if it is later it will be negative.
* For current (2011) OSX compatibility, this method returns NaN if otherDate * is nil ... do not write code depending on that behavior. */ - (NSTimeInterval) timeIntervalSinceDate: (NSDate*)otherDate; /** Returns the time interval between the receivers value and the * current date/time. If the receiver represents a date/time in * the past this will be negative, if it is in the future the * returned value will be positive. */ - (NSTimeInterval) timeIntervalSinceNow; /** Returns the time interval between the receivers value and the * OpenStep reference date of 1 Jan 2001 GMT. */ - (NSTimeInterval) timeIntervalSinceReferenceDate; @end #if defined(__cplusplus) } #endif #endif /* __NSDate_h_GNUSTEP_BASE_INCLUDE*/ gnustep-base-1.29.0/Headers/Foundation/NSDateComponentsFormatter.h000066400000000000000000000120241435650067400251130ustar00rootroot00000000000000/* Definition of class NSDateComponentsFormatter Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory Casamento Date: Wed Nov 6 00:24:02 EST 2019 This file is part of the GNUstep Library. 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 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 USA. */ #ifndef _NSDateComponentsFormatter_h_GNUSTEP_BASE_INCLUDE #define _NSDateComponentsFormatter_h_GNUSTEP_BASE_INCLUDE #include #include #if OS_API_VERSION(MAC_OS_X_10_10, GS_API_LATEST) #if defined(__cplusplus) extern "C" { #endif enum { // "1:10; may fall back to abbreviated units in some cases (such as 3d)" NSDateComponentsFormatterUnitsStylePositional = 0, // "1h 10m" NSDateComponentsFormatterUnitsStyleAbbreviated, // "1hr, 10min" NSDateComponentsFormatterUnitsStyleShort, // "1 hour, 10 minutes" NSDateComponentsFormatterUnitsStyleFull, // "One hour, ten minutes" NSDateComponentsFormatterUnitsStyleSpellOut, // "1hr 10min" - Brief is shorter than Short NSDateComponentsFormatterUnitsStyleBrief, }; typedef NSInteger NSDateComponentsFormatterUnitsStyle; enum { //drop none, pad none NSDateComponentsFormatterZeroFormattingBehaviorNone = (0), //Positional units: drop leading zeros, pad other zeros. All others: drop all zeros. NSDateComponentsFormatterZeroFormattingBehaviorDefault = (1 << 0), // Off: "0h 10m", On: "10m" NSDateComponentsFormatterZeroFormattingBehaviorDropLeading = (1 << 1), // Off: "1h 0m 10s", On: "1h 10s" NSDateComponentsFormatterZeroFormattingBehaviorDropMiddle = (1 << 2), // Off: "1h 0m", On: "1h" NSDateComponentsFormatterZeroFormattingBehaviorDropTrailing = (1 << 3), NSDateComponentsFormatterZeroFormattingBehaviorDropAll = (NSDateComponentsFormatterZeroFormattingBehaviorDropLeading | NSDateComponentsFormatterZeroFormattingBehaviorDropMiddle | NSDateComponentsFormatterZeroFormattingBehaviorDropTrailing), // Off: "1:0:10", On: "01:00:10" NSDateComponentsFormatterZeroFormattingBehaviorPad = (1 << 16), }; typedef NSUInteger NSDateComponentsFormatterZeroFormattingBehavior; @class NSString, NSDate; GS_EXPORT_CLASS @interface NSDateComponentsFormatter : NSFormatter { NSCalendar *_calendar; NSDate *_referenceDate; BOOL _allowsFractionalUnits; BOOL _collapsesLargestUnit; BOOL _includesApproximationPhrase; NSFormattingContext _formattingContext; NSInteger _maximumUnitCount; NSDateComponentsFormatterZeroFormattingBehavior _zeroFormattingBehavior; NSCalendarUnit _allowedUnits; NSDateComponentsFormatterUnitsStyle _unitsStyle; } - (NSString *) stringForObjectValue: (id)obj; - (NSString *) stringFromDateComponents: (NSDateComponents *)components; - (NSString *) stringFromDate: (NSDate *)startDate toDate: (NSDate *)endDate; - (NSString *) stringFromTimeInterval: (NSTimeInterval)ti; - (NSDateComponentsFormatterUnitsStyle) unitsStyle; - (void) setUnitsStyle: (NSDateComponentsFormatterUnitsStyle)style; - (NSCalendarUnit) allowedUnits; - (void) setAllowedUnits: (NSCalendarUnit)units; - (NSDateComponentsFormatterZeroFormattingBehavior) zeroFormattingBehavior; - (void) setZeroFormattingBehavior: (NSDateComponentsFormatterZeroFormattingBehavior)behavior; - (NSCalendar *) calendar; - (void) setCalender: (NSCalendar *)calendar; - (NSDate *) referenceDate; - (void) setReferenceDate: (NSDate *)referenceDate; - (BOOL) allowsFractionalUnits; - (void) setAllowsFractionalUnits: (BOOL)allowsFractionalUnits; - (NSInteger) maximumUnitCount; - (void) setMaximumUnitCount: (NSInteger)maximumUnitCount; - (BOOL) collapsesLargestUnit; - (void) setCollapsesLargestUnit: (BOOL)collapsesLargestUnit; - (BOOL) includesApproximationPhrase; - (void) setIncludesApproximationPhrase: (BOOL)includesApproximationPhrase; - (NSFormattingContext) formattingContext; - (void) setFormattingContext: (NSFormattingContext)formattingContext; - (BOOL) getObjectValue: (id*)obj forString: (NSString *)string errorDescription: (NSString **)error; + (NSString *) localizedStringFromDateComponents: (NSDateComponents *)components unitsStyle: (NSDateComponentsFormatterUnitsStyle)unitsStyle; @end #if defined(__cplusplus) } #endif #endif /* GS_API_MACOSX */ #endif /* _NSDateComponentsFormatter_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSDateFormatter.h000066400000000000000000000236151435650067400230550ustar00rootroot00000000000000/* Interface for NSDateFormatter for GNUStep Copyright (C) 1998 Free Software Foundation, Inc. Header Written by: Camille Troillard Created: November 1998 Modified by: Richard Frith-Macdonald This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSDateFormatter_h_GNUSTEP_BASE_INCLUDE #define __NSDateFormatter_h_GNUSTEP_BASE_INCLUDE #import #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) #import @class NSCalendar, NSLocale, NSArray; #if defined(__cplusplus) extern "C" { #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_4, GS_API_LATEST) enum { NSDateFormatterNoStyle = 0, NSDateFormatterShortStyle = 1, NSDateFormatterMediumStyle = 2, NSDateFormatterLongStyle = 3, NSDateFormatterFullStyle = 4 }; typedef NSUInteger NSDateFormatterStyle; enum { NSDateFormatterBehaviorDefault = 0, NSDateFormatterBehavior10_0 = 1000, NSDateFormatterBehavior10_4 = 1040 }; typedef NSUInteger NSDateFormatterBehavior; #endif /** *

Class for generating text representations of [NSDate]s and * [NSCalendarDate]s, and for converting strings into instances of these * objects. Note that [NSDate] and [NSCalendarDate] do contain some * string conversion methods, but using this class provides more control * over conversion.

*

See the [NSFormatter] documentation for description of the basic methods * for formatting and parsing that are available.

*

The basic format of a format string uses "%" codes to represent * components of the date. Thus, for example, @"%b %d, %Y" * specifies strings similar to "June 18, 1991". The full list of codes is * as follows:

* * %% * a '%' character * %a * abbreviated weekday name * %A * full weekday name * %b * abbreviated month name * %B * full month name * %c * shorthand for "%X %x", the locale format for date and time * %d * day of the month as a decimal number (01-31) * %e * same as %d but does not print the leading 0 for days 1 through 9 * (unlike strftime(), does not print a leading space) * %F * milliseconds as a decimal number (000-999) * %H * hour based on a 24-hour clock as a decimal number (00-23) * %I * hour based on a 12-hour clock as a decimal number (01-12) * %j * day of the year as a decimal number (001-366) * %m * month as a decimal number (01-12) * %M * minute as a decimal number (00-59) * %p * AM/PM designation for the locale * %S * second as a decimal number (00-59) * %w * weekday as a decimal number (0-6), where Sunday is 0 * %x * date using the date representation for the locale, including the * time zone (produces different results from strftime()) * %X * time using the time representation for the locale (produces * different results from strftime()) * %y * year without century (00-99) * %Y * year with century (such as 1990) * %Z * time zone name (such as Pacific Daylight Time; produces different * results from strftime()) * %z * time zone offset in hours and minutes from GMT (HHMM) * */ GS_EXPORT_CLASS @interface NSDateFormatter : NSFormatter { #if GS_EXPOSE(NSDateFormatter) NSString *_dateFormat; BOOL _allowsNaturalLanguage; #endif #if GS_NONFRAGILE # if defined(GS_NSDateFormatter_IVARS) @public GS_NSDateFormatter_IVARS; # endif #else /* Pointer to private additional data used to avoid breaking ABI * when we don't have the non-fragile ABI available. * Use this mechanism rather than changing the instance variable * layout (see Source/GSInternal.h for details). */ @private id _internal GS_UNUSED_IVAR; #endif } /* Initializing an NSDateFormatter */ /** * Initialize with given specifier string format. See class description for * how to specify a format string. If flag is YES, string-to-object * conversion will attempt to process strings as natural language dates, such * as "yesterday", or "first Tuesday of next month" if straight format-based * conversion fails. */ - (id) initWithDateFormat: (NSString *)format allowNaturalLanguage: (BOOL)flag; /* Determining Attributes */ /** * Returns whether initialized to support natural language formatting. If * YES, string-to-object conversion will attempt to process strings as * natural language dates, such as "yesterday", or "first Tuesday of next * month" if straight format-based conversion fails. */ - (BOOL) allowsNaturalLanguage; /** * Returns format string initialized with, specifying how dates are formatted, * for object-to-string conversion, and how they are parsed, for * string-to-object conversion. For example, @"%b %d, %Y" * specifies strings similar to "June 18, 1991". */ - (NSString *) dateFormat; #if OS_API_VERSION(MAC_OS_X_VERSION_10_4, GS_API_LATEST) + (NSDateFormatterBehavior) defaultFormatterBehavior; + (void) setDefaultFormatterBehavior: (NSDateFormatterBehavior) behavior; - (NSDateFormatterBehavior) formatterBehavior; - (void) setFormatterBehavior: (NSDateFormatterBehavior) behavior; - (BOOL) generatesCalendarDates; - (void) setGeneratesCalendarDates: (BOOL) flag; - (BOOL) isLenient; - (void) setLenient: (BOOL) flag; - (NSDate *) dateFromString: (NSString *) string; - (NSString *) stringFromDate: (NSDate *) date; - (BOOL) getObjectValue: (out id *) obj forString: (NSString *) string range: (inout NSRange *) range error: (out NSError **) error; - (void) setDateFormat: (NSString *) string; - (NSDateFormatterStyle) dateStyle; - (void) setDateStyle: (NSDateFormatterStyle) style; - (NSDateFormatterStyle) timeStyle; - (void) setTimeStyle: (NSDateFormatterStyle) style; - (NSCalendar *) calendar; - (void) setCalendar: (NSCalendar *) calendar; - (NSDate *) defaultDate; - (void) setDefaultDate: (NSDate *) date; - (NSLocale *) locale; - (void) setLocale: (NSLocale *) locale; - (NSTimeZone *) timeZone; - (void) setTimeZone: (NSTimeZone *) tz; - (NSDate *) twoDigitStartDate; - (void) setTwoDigitStartDate: (NSDate *) date; - (NSString *) AMSymbol; - (void) setAMSymbol: (NSString *) string; - (NSString *) PMSymbol; - (void) setPMSymbol: (NSString *) string; - (NSArray *) weekdaySymbols; - (void) setWeekdaySymbols: (NSArray *) array; - (NSArray *) shortWeekdaySymbols; - (void) setShortWeekdaySymbols: (NSArray *) array; - (NSArray *) monthSymbols; - (void) setMonthSymbols: (NSArray *) array; - (NSArray *) shortMonthSymbols; - (void) setShortMonthSymbols: (NSArray *) array; - (NSArray *) eraSymbols; - (void) setEraSymbols: (NSArray *) array; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_5, GS_API_LATEST) - (NSDate *) gregorianStartDate; - (void) setGregorianStartDate: (NSDate *) date; - (NSArray *) longEraSymbols; - (void) setLongEraSymbols: (NSArray *) array; - (NSArray *) quarterSymbols; - (void) setQuarterSymbols: (NSArray *) array; - (NSArray *) shortQuarterSymbols; - (void) setShortQuarterSymbols: (NSArray *) array; - (NSArray *) standaloneQuarterSymbols; - (void) setStandaloneQuarterSymbols: (NSArray *) array; - (NSArray *) shortStandaloneQuarterSymbols; - (void) setShortStandaloneQuarterSymbols: (NSArray *) array; - (NSArray *) shortStandaloneMonthSymbols; - (void) setShortStandaloneMonthSymbols: (NSArray *) array; - (NSArray *) standaloneMonthSymbols; - (void) setStandaloneMonthSymbols: (NSArray *) array; - (NSArray *) veryShortMonthSymbols; - (void) setVeryShortMonthSymbols: (NSArray *) array; - (NSArray *) veryShortStandaloneMonthSymbols; - (void) setVeryShortStandaloneMonthSymbols: (NSArray *) array; - (NSArray *) shortStandaloneWeekdaySymbols; - (void) setShortStandaloneWeekdaySymbols: (NSArray *) array; - (NSArray *) standaloneWeekdaySymbols; - (void) setStandaloneWeekdaySymbols: (NSArray *) array; - (NSArray *) veryShortWeekdaySymbols; - (void) setVeryShortWeekdaySymbols: (NSArray *) array; - (NSArray *) veryShortStandaloneWeekdaySymbols; - (void) setVeryShortStandaloneWeekdaySymbols: (NSArray *) array; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) + (NSString *) localizedStringFromDate: (NSDate *) date dateStyle: (NSDateFormatterStyle) dateStyle timeStyle: (NSDateFormatterStyle) timeStyle; + (NSString *) dateFormatFromTemplate: (NSString *) aTemplate options: (NSUInteger) opts locale: (NSLocale *) locale; - (BOOL) doesRelativeDateFormatting; - (void) setDoesRelativeDateFormatting: (BOOL) flag; #endif @end #endif #if defined(__cplusplus) } #endif #endif /* _NSDateFormatter_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSDateInterval.h000066400000000000000000000044361435650067400226760ustar00rootroot00000000000000/* Definition of class NSDateInterval Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory Casamento Date: Wed Oct 9 16:24:13 EDT 2019 This file is part of the GNUstep Library. 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 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 USA. */ #ifndef _NSDateInterval_h_GNUSTEP_BASE_INCLUDE #define _NSDateInterval_h_GNUSTEP_BASE_INCLUDE #include #include #if defined(__cplusplus) extern "C" { #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_12, GS_API_LATEST) GS_EXPORT_CLASS @interface NSDateInterval : NSObject { NSTimeInterval _duration; NSDate *_startDate; } // Init - (instancetype) init; - (instancetype) initWithStartDate: (NSDate *)startDate duration: (NSTimeInterval)duration; - (instancetype) initWithStartDate: (NSDate *)startDate endDate: (NSDate *)endDate; // Access - (NSDate *) startDate; - (void) setStartDate: (NSDate *)startDate; - (NSDate *) endDate; - (void) setEndDate: (NSDate *)endDate; - (NSTimeInterval)duration; - (void) setDuration: (NSTimeInterval)duration; // Compare - (NSComparisonResult) compare: (NSDateInterval *)dateInterval; - (BOOL) isEqualToDateInterval: (NSDateInterval *)dateInterval; // Determine - (BOOL) intersectsDateInterval: (NSDateInterval *)dateInterval; - (NSDateInterval *) intersectionWithDateInterval: (NSDateInterval *)dateInterval; // Contain - (BOOL) containsDate: (NSDate *)date; @end #if defined(__cplusplus) } #endif #endif /* GS_API_MACOSX */ #endif /* _NSDateInterval_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSDateIntervalFormatter.h000066400000000000000000000050441435650067400245560ustar00rootroot00000000000000 /* Definition of class NSDateIntervalFormatter Copyright (C) 2019 Free Software Foundation, Inc. By: heron Date: Wed Oct 9 16:23:55 EDT 2019 This file is part of the GNUstep Library. 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 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 USA. */ #ifndef _NSDateIntervalFormatter_h_GNUSTEP_BASE_INCLUDE #define _NSDateIntervalFormatter_h_GNUSTEP_BASE_INCLUDE #include #if defined(__cplusplus) extern "C" { #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_10, GS_API_LATEST) enum { NSDateIntervalFormatterNoStyle = 0, NSDateIntervalFormatterShortStyle = 1, NSDateIntervalFormatterMediumStyle = 2, NSDateIntervalFormatterLongStyle = 3, NSDateIntervalFormatterFullStyle = 4 }; typedef NSUInteger NSDateIntervalFormatterStyle; @class NSCalendar, NSLocale, NSDateInterval; GS_EXPORT_CLASS @interface NSDateIntervalFormatter : NSFormatter { NSLocale *_locale; NSCalendar *_calendar; NSTimeZone *_timeZone; NSString *_dateTemplate; NSDateIntervalFormatterStyle _dateStyle; NSDateIntervalFormatterStyle _timeStyle; } // Properties - (NSLocale *) locale; - (void) setLocale: (NSLocale *)locale; - (NSCalendar *) calendar; - (void) setCalendar: (NSCalendar *)calendar; - (NSTimeZone *) timeZone; - (void) setTimeZone: (NSTimeZone *)timeZone; - (NSString *) dateTemplate; - (void) setDateTemplate: (NSString *)dateTemplate; - (NSDateIntervalFormatterStyle) dateStyle; - (void) setDateStyle: (NSDateIntervalFormatterStyle)dateStyle; - (NSDateIntervalFormatterStyle) timeStyle; - (void) setTimeStyle: (NSDateIntervalFormatterStyle)timeStyle; // Create strings - (NSString *)stringFromDate:(NSDate *)fromDate toDate:(NSDate *)toDate; - (NSString *)stringFromDateInterval:(NSDateInterval *)dateInterval; @end #if defined(__cplusplus) } #endif #endif /* GS_API_MACOSX */ #endif /* _NSDateIntervalFormatter_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSDebug.h000066400000000000000000000337631435650067400213470ustar00rootroot00000000000000/* Interface to debugging utilities for GNUStep and OpenStep Copyright (C) 1997-2020 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: August 1997 Extended by: Nicola Pero Date: December 2000, April 2001 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSDebug_h_GNUSTEP_BASE_INCLUDE #define __NSDebug_h_GNUSTEP_BASE_INCLUDE #import #include #if !NO_GNUSTEP # if defined(GNUSTEP_BASE_INTERNAL) # import "Foundation/NSObject.h" # import "GNUstepBase/NSDebug+GNUstepBase.h" # else # import # import # endif #endif #if defined(__cplusplus) extern "C" { #endif /** Protocol for a delegate, set as an extension in some classes, to handle * debug logging of low level I/O. The rationale for this protocol is that * on occasion debug logging may be required, but the data being logged may * contain sensitive information which should not be writtent to file. In * that situation, the delegate may filter/mask the sensitive information * from the logs by taking over the simpel writing to stderr that the inbuilt * debug logging provides. */ @protocol GSLogDelegate /** Method sent to the delegate to ask it to log a chunk of data that * has been read. The delegate should return YES if it has handled * the logging, NO if it wants the default mechanism to be used.
* The handle is the object which is performing the read operation. */ - (BOOL) getBytes: (const uint8_t*)bytes ofLength: (NSUInteger)length byHandle: (NSObject*)handle; /** Method sent to the delegate to ask it to log a chunk of data that * has been written (or is immediately going to be written). * The delegate should return YES if it has handled the logging, * NO if it wants the default logging mechanism to be used.
* The handle is the object which is performing the write operation. */ - (BOOL) putBytes: (const uint8_t*)bytes ofLength: (NSUInteger)length byHandle: (NSObject*)handle; @end /* * Functions for debugging object allocation/deallocation * * Internal functions: * GSDebugAllocationAdd() is used by NSAllocateObject() * GSDebugAllocationRemove() is used by NSDeallocateObject() * * Public functions: * GSDebugAllocationActive() * GSDebugAllocationBytes() * GSDebugAllocationCount() * GSDebugAllocationTotal() * GSDebugAllocationPeak() * GSDebugAllocationClassList() * GSDebugAllocationList() * GSDebugAllocationListAll() * * GSSetDebugAllocationFunctions() * * When the previous functions have allowed you to find a memory leak, * and you know that you are leaking objects of class XXX, but you are * hopeless about actually finding out where the leak is, the * following functions could come handy as they allow you to find * exactly *what* objects you are leaking (warning! these functions * could slow down your system appreciably - use them only temporarily * and only in debugging systems): * * GSDebugAllocationRecordObjects() * GSDebugAllocationListRecordedObjects() * GSDebugAllocationTagRecordedObject() */ /** * A global variable that you can use to enable debug behaviour in * your program. */ extern BOOL NSDebugEnabled; #ifndef NDEBUG /** * Used internally by NSAllocateObject() ... you probably don't need this. */ GS_EXPORT void GSDebugAllocationAdd(Class c, id o); /** * Used internally by NSDeallocateObject() ... you probably don't need this. */ GS_EXPORT void GSDebugAllocationRemove(Class c, id o); /** * This function activates or deactivates object allocation debugging.
* Returns the previous state.
* You should call this function to activate * allocation debugging before using any of the other allocation * debugging functions such as GSDebugAllocationList() or * GSDebugAllocationTotal().
* Object allocation debugging * should not affect performance too much, and is very useful * as it allows you to monitor how many objects of each class * your application has allocated. */ GS_EXPORT BOOL GSDebugAllocationActive(BOOL active); /** * This function activates or deactivates byte counting for allocation.
* Returns the previous state.
* You may call this function to activate additional checks to see how * much memory is allocated to hold each object allocated. When this is * enabled, listing the allocated objects will also list the number of bytes * of heap memory allocated to hold the objects.
*/ GS_EXPORT BOOL GSDebugAllocationBytes(BOOL active); /** *

* Returns the number * of instances of the specified class which are currently * allocated. This number is very important to detect memory * leaks. If you notice that this number is constantly * increasing without apparent reason, it is very likely a * memory leak - you need to check that you are correctly * releasing objects of this class, otherwise when your * application runs for a long time, it will eventually * allocate so many objects as to eat up all your system's * memory ... *

*

* This function, like the ones below, returns the number of * objects allocated/released from the time when * GSDebugAllocationActive() was first called. A negative * number means that in total, there are less objects of this * class allocated now than there were when you called * GSDebugAllocationActive(); a positive one means there are * more. *

*/ GS_EXPORT int GSDebugAllocationCount(Class c); /** * Returns the peak * number of instances of the specified class which have been * concurrently allocated. If this number is very high, it * means at some point in time you had a situation with a * huge number of objects of this class allocated - this is * an indicator that probably at some point in time your * application was using a lot of memory - so you might want * to investigate whether you can prevent this problem by * inserting autorelease pools in your application's * processing loops. */ GS_EXPORT int GSDebugAllocationPeak(Class c); /** * Returns the total * number of instances of the specified class c which have been * allocated - basically the number of times you have * allocated an object of this class. If this number is very * high, it means you are creating a lot of objects of this * class; even if you are releasing them correctly, you must * not forget that allocating and deallocating objects is * usually one of the slowest things you can do, so you might * want to consider whether you can reduce the number of * allocations and deallocations that you are doing - for * example, by recycling objects of this class, uniquing * them, and/or using some sort of flyweight pattern. It * might also be possible that you are unnecessarily creating * too many objects of this class. Well - of course some times * there is nothing you can do about it. */ GS_EXPORT int GSDebugAllocationTotal(Class c); /** * This function returns a NULL * terminated array listing all the classes for which * statistical information has been collected. Usually, you * call this function, and then loop on all the classes returned, * and for each one you get current, peak and total count by * using GSDebugAllocationCount(), GSDebugAllocationPeak() and * GSDebugAllocationTotal(). */ GS_EXPORT Class* GSDebugAllocationClassList(void); /** * This function returns a newline separated list of the classes * which have instances allocated, and the instance counts. * If the 'changeFlag' argument is YES then the list gives the number * of instances allocated/deallocated since the function was * last called with that setting. This function only returns the * current count of instances (not the peak or total count), but its * output is ready to be displayed or logged. */ GS_EXPORT const char* GSDebugAllocationList(BOOL changeFlag); /** * This function returns a newline * separated list of the classes which have had instances * allocated at any point, and the total count of the number * of instances allocated for each class. The difference with * GSDebugAllocationList() is that this function returns also * classes which have no objects allocated at the moment, but * which had in the past. */ GS_EXPORT const char* GSDebugAllocationListAll(void); /** * DEPRECATED ... use GSDebugAllocationRecordObjects instead. */ GS_EXPORT void GSDebugAllocationActiveRecordingObjects(Class c); /** * This function activates (or deactivates) tracking all allocated * instances of the specified class c.
* Turning on tracking implicitly turns on memory debug (counts) * for all classes (GSAllocationActive()).
* Deactivation of tracking releases all currently tracked instances * of the class (but deactivation of general counting does not).
* The previous tracking state as reported as the return value of * this function.
* This tracking can slow your application down, so you should use it * only when you are into serious debugging. * Usually, you will monitor your application by using the functions * GSDebugAllocationList() and similar, which do not slow things down * much and return * the number of allocated instances; when * (if) by studying the reports generated by these functions * you have found a leak of objects of a certain class, and * if you can't figure out how to fix it by looking at the * code, you can use this function to start tracking * allocated instances of that class, and the following one * can sometime allow you to list the leaked objects directly. */ GS_EXPORT BOOL GSDebugAllocationRecordObjects(Class c, BOOL newState); /** * This function returns an array * containing all the allocated objects of a certain class * which have been recorded ... to start the recording, you need * to invoke GSDebugAllocationRecordObjects(). * Presumably, you will immediately call [NSObject-description] on them * to find out the objects you are leaking. The objects are * returned in an autoreleased array, so until the array is deallocated, * the objects are not released. */ GS_EXPORT NSArray *GSDebugAllocationListRecordedObjects(Class c); /** * This function associates the supplied tag with a recorded * object and returns the tag which was previously associated * with it (if any).
* If the object was not recorded, the method returns nil
* The tag is retained while it is associated with the object.
* If the tagged object is deallocated, the tag is released * (so you can track the lifetime of the object by having the tag * perform some operation when it is released).
* See also the NSDebugFRLog() and NSDebugMRLog() macros. */ GS_EXPORT id GSDebugAllocationTagRecordedObject(id object, id tag); /** * This functions allows to set own function callbacks for debugging allocation * of objects. Useful if you intend to write your own object allocation code. */ GS_EXPORT void GSSetDebugAllocationFunctions( void (*newAddObjectFunc)(Class c, id o), void (*newRemoveObjectFunc)(Class c, id o)); #endif /** * Enable/disable zombies. *

When an object is deallocated, its isa pointer is normally modified * to the hexadecimal value 0xdeadface, so that any attempt to send a * message to the deallocated object will cause a crash, and examination * of the object within the debugger will show the 0xdeadface value ... * making it obvious why the program crashed. *

*

Turning on zombies changes this behavior so that the isa pointer * is modified to be that of the NSZombie class. When messages are * sent to the object, instead of crashing, NSZombie will use NSLog() to * produce an error message. By default the memory used by the object * will not really be freed, so error messages will continue to * be generated whenever a message is sent to the object, and the object * instance variables will remain available for examination by the debugger. *

* The default value of this boolean is NO, but this can be controlled * by the NSZombieEnabled environment variable. */ GS_EXPORT BOOL NSZombieEnabled; /** * Enable/disable object deallocation. *

If zombies are enabled, objects are by default not * deallocated, and memory leaks. The NSDeallocateZombies variable * lets you say that the the memory used by zombies should be freed. *

*

Doing this makes the behavior of zombies similar to that when zombies * are not enabled ... the memory occupied by the zombie may be re-used for * other purposes, at which time the isa pointer may be overwritten and the * zombie behavior will cease. *

* The default value of this boolean is NO, but this can be controlled * by the NSDeallocateZombies environment variable. */ GS_EXPORT BOOL NSDeallocateZombies; /** * Retrieve stack information. Use caution: uses built-in gcc functions * and currently only works up to 100 frames. */ GS_EXPORT void *NSFrameAddress(NSUInteger offset); /** * Retrieve stack information. Use caution: uses built-in gcc functions * and currently only works up to 100 frames. */ GS_EXPORT void *NSReturnAddress(NSUInteger offset); /** * Retrieve stack information. Use caution: uses built-in gcc functions * and currently only works up to 100 frames. */ GS_EXPORT NSUInteger NSCountFrames(void); #if defined(__cplusplus) } #endif #endif gnustep-base-1.29.0/Headers/Foundation/NSDecimal.h000066400000000000000000000211651435650067400216500ustar00rootroot00000000000000/* NSDecimal types and functions Copyright (C) 1998 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: November 1998 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSDecimal_h_GNUSTEP_BASE_INCLUDE #define __NSDecimal_h_GNUSTEP_BASE_INCLUDE #import #import #import #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) #if USE_GMP #include #endif #if defined(__cplusplus) extern "C" { #endif /** * Enumerated type for specifying decimal rounding behavior. Can be one of * NSRoundDown (always round down), NSRoundUp * (always round up), NSRoundPlain ("normal" rounding (up from * .5 or above, down otherwise), NSRoundBankers (as "Plain" but * .5 rounds to make last remaining digit even). See the * [(NSDecimalNumberBehaviors)] protocol. */ enum { NSRoundPlain, /* Round .5 up */ NSRoundDown, NSRoundUp, NSRoundBankers /* Make last digit even */ }; typedef NSUInteger NSRoundingMode; /** * Enumerated type for specifying a decimal calculation error. Can be one of * the following: * * NSCalculationNoError * No error occurred. * NSCalculationLossOfPrecision * The number can't be represented in 38 significant digits. * NSCalculationOverflow * The number is too large to represent. * NSCalculationUnderflow * The number is too small to represent. * NSCalculationDivideByZero * The caller tried to divide by 0. * */ enum { NSCalculationNoError = 0, NSCalculationLossOfPrecision, NSCalculationUnderflow, /* result became zero */ NSCalculationOverflow, NSCalculationDivideByZero }; typedef NSUInteger NSCalculationError; /** * Give a precision of at least 38 decimal digits * requires 128 bits. */ #define NSDecimalMaxSize (16/sizeof(mp_limb_t)) #define NSDecimalMaxDigit 38 #define NSDecimalNoScale 128 /** *

Structure providing equivalent functionality, in conjunction with a set * of functions, to the [NSDecimalNumber] class.

typedef struct { signed char exponent; // Signed exponent - -128 to 127 BOOL isNegative; // Is this negative? BOOL validNumber; // Is this a valid number? unsigned char length; // digits in mantissa. unsigned char cMantissa[2*NSDecimalMaxDigit]; } NSDecimal; *

Instances can be initialized using the NSDecimalFromString(NSString *) * function.

*/ typedef struct { signed char exponent; /* Signed exponent - -128 to 127 */ BOOL isNegative; /* Is this negative? */ BOOL validNumber; /* Is this a valid number? */ #if USE_GMP mp_size_t size; mp_limb_t lMantissa[NSDecimalMaxSize]; #else unsigned char length; /* digits in mantissa. */ unsigned char cMantissa[NSDecimalMaxDigit]; #endif } NSDecimal; /** Returns whether decimal represents an invalid number (i.e., an "NaN" as might result from an overflow or a division by zero). */ static inline BOOL NSDecimalIsNotANumber(const NSDecimal *decimal) { return (decimal->validNumber == NO); } /** Copies value of decimal number to preallocated destination. */ GS_EXPORT void NSDecimalCopy(NSDecimal *destination, const NSDecimal *source); /** Tries to reduce memory used to store number internally. */ GS_EXPORT void NSDecimalCompact(NSDecimal *number); /** * Returns NSOrderedDescending, NSOrderedSame, or * NSOrderedAscending depending on whether leftOperand is * greater than, equal to, or less than rightOperand. */ GS_EXPORT NSComparisonResult NSDecimalCompare(const NSDecimal *leftOperand, const NSDecimal *rightOperand); /** * Rounds number to result such that it has at most scale digits to the right * of its decimal point, according to mode (see the * [(NSDecimalNumberBehaviors)] protocol). The result should be preallocated * but can be the same as number. */ GS_EXPORT void NSDecimalRound(NSDecimal *result, const NSDecimal *number, NSInteger scale, NSRoundingMode mode); /** * Sets the exponents of n1 and n2 equal to one another, adjusting mantissas * as necessary to preserve values. This makes certain operations quicker. */ GS_EXPORT NSCalculationError NSDecimalNormalize(NSDecimal *n1, NSDecimal *n2, NSRoundingMode mode); /** * Adds two decimals and returns result to 38-digit precision. See the * [(NSDecimalNumberBehaviors)] protocol for a description of mode and the * return value. The result should be preallocated but can be the same as * left or right. */ GS_EXPORT NSCalculationError NSDecimalAdd(NSDecimal *result, const NSDecimal *left, const NSDecimal *right, NSRoundingMode mode); /** * Subtracts two decimals and returns result to 38-digit precision. See the * [(NSDecimalNumberBehaviors)] protocol for a description of mode and the * return value. The result should be preallocated but can be the same as * left or right. */ GS_EXPORT NSCalculationError NSDecimalSubtract(NSDecimal *result, const NSDecimal *left, const NSDecimal *right, NSRoundingMode mode); /** * Multiplies two decimals and returns result to 38-digit precision. See the * [(NSDecimalNumberBehaviors)] protocol for a description of mode and the * return value. The result should be preallocated but can be the same as * l or r. */ GS_EXPORT NSCalculationError NSDecimalMultiply(NSDecimal *result, const NSDecimal *l, const NSDecimal *r, NSRoundingMode mode); /** * Divides l by rr and returns result to 38-digit precision. See the * [(NSDecimalNumberBehaviors)] protocol for a description of mode and the * return value. The result should be preallocated but can be the same as * l or rr. */ GS_EXPORT NSCalculationError NSDecimalDivide(NSDecimal *result, const NSDecimal *l, const NSDecimal *rr, NSRoundingMode mode); /** * Raises n to power and returns result to 38-digit precision. See the * [(NSDecimalNumberBehaviors)] protocol for a description of mode and the * return value. The result should be preallocated but can be the same as * n or power. */ GS_EXPORT NSCalculationError NSDecimalPower(NSDecimal *result, const NSDecimal *n, NSUInteger power, NSRoundingMode mode); /** * Multiplies n by 10^power and returns result to 38-digit precision. See the * [(NSDecimalNumberBehaviors)] protocol for a description of mode and the * return value. The result should be preallocated but can be the same as * n. */ GS_EXPORT NSCalculationError NSDecimalMultiplyByPowerOf10(NSDecimal *result, const NSDecimal *n, short power, NSRoundingMode mode); /** * Returns a string representing the full decimal value, formatted according * to locale (send nil here for default locale). */ GS_EXPORT NSString* NSDecimalString(const NSDecimal *decimal, NSDictionary *locale); // GNUstep extensions to make the implementation of NSDecimalNumber totaly // independent for NSDecimals internal representation /** Give back the biggest NSDecimal in (preallocated) result. */ GS_EXPORT void NSDecimalMax(NSDecimal *result); /** Give back the smallest NSDecimal in (preallocated) result. */ GS_EXPORT void NSDecimalMin(NSDecimal *result); /** Give back the value of a NSDecimal as a double in (preallocated) result. */ GS_EXPORT double NSDecimalDouble(NSDecimal *number); /** * Create a NSDecimal with a mantissa, exponent and a negative flag in * (preallocated) result. */ GS_EXPORT void NSDecimalFromComponents(NSDecimal *result, unsigned long long mantissa, short exponent, BOOL negative); /** * Create a NSDecimal from a string using the locale, in (preallocated) * result. */ GS_EXPORT void NSDecimalFromString(NSDecimal *result, NSString *numberValue, NSDictionary *locale); #if defined(__cplusplus) } #endif #endif #endif gnustep-base-1.29.0/Headers/Foundation/NSDecimalNumber.h000066400000000000000000000352041435650067400230200ustar00rootroot00000000000000/* Interface of NSDecimalNumber class Copyright (C) 1998 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: November 1998 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSDecimalNumber_h_GNUSTEP_BASE_INCLUDE #define __NSDecimalNumber_h_GNUSTEP_BASE_INCLUDE #import #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) #import #import #import #if defined(__cplusplus) extern "C" { #endif @class NSDecimalNumber; /** * This protocol encapsulates information about how an [NSDecimalNumber] * should round and process exceptions. Usually you can just create objects * of the [NSDecimalNumberHandler] class, which implements this protocol, but * if you don't want to use that class you can create your own implementing * it. */ @protocol NSDecimalNumberBehaviors /** *

Specifies behavior when, in the course of applying method to leftOperand * and rightOperand, an [NSDecimalNumber] instance encounters given error.

*

error has four possible constant values:

* * NSCalculationLossOfPrecision * The number can't be represented in 38 significant digits. * NSCalculationOverflow * The number is too large to represent. * NSCalculationUnderflow * The number is too small to represent. * NSCalculationDivideByZero * The caller tried to divide by 0. * * *

Behavior on error can be one of the following:

* * Raise an exception. * Return nil. The calling method will return its value as though no * error had occurred. If error is * NSCalculationLossOfPrecision, method will return an * imprecise value, constrained to 38 significant digits. If error is * NSCalculationUnderflow or * NSCalculationOverflow, method will return * NSDecimalNumber's notANumber. You shouldn't * return nil if error is NSDivideByZero. * * Correct the error and return a valid NSDecimalNumber. * The calling method will use this as its own return value. * */ - (NSDecimalNumber*) exceptionDuringOperation: (SEL)method error: (NSCalculationError)error leftOperand: (NSDecimalNumber*)leftOperand rightOperand: (NSDecimalNumber*)rightOperand; /** * Specifies how [NSDecimalNumber]'s decimalNumberBy... methods * round their return values. This should be set to one of the following * constants: * * NSRoundDown * Always round down. * NSRoundUp * Always round up. * NSRoundPlain * Round to the closest possible return value. Halfway (e.g. .5) * rounds up for positive numbers, down for negative (towards larger absolute * value). * NSRoundBankers * Round to the closest possible return value, but halfway (e.g. .5) * rounds towards possibility whose last digit is even. * */ - (NSRoundingMode) roundingMode; /** * Specifies the precision of the values returned by [NSDecimalNumber]'s * decimalNumberBy... methods, in terms of the number of * digits allowed after the decimal point. This can be negative, implying * that the precision should be, e.g., 100's, 1000's, etc.. For unlimited * precision, set to NSDecimalNoScale. */ - (short) scale; @end /** * A utility class adopting [(NSDecimalNumberBehaviors)] protocol. Can be used * to control [NSDecimalNumber] rounding and exception-handling behavior, by * passing an instance as an argument to any [NSDecimalNumber] method ending * with ...Behavior:. */ GS_EXPORT_CLASS @interface NSDecimalNumberHandler : NSObject { #if GS_EXPOSE(NSDecimalNumberHandler) NSRoundingMode _roundingMode; short _scale; BOOL _raiseOnExactness; BOOL _raiseOnOverflow; BOOL _raiseOnUnderflow; BOOL _raiseOnDivideByZero; #endif #if GS_NONFRAGILE #else /* Pointer to private additional data used to avoid breaking ABI * when we don't have the non-fragile ABI available. * Use this mechanism rather than changing the instance variable * layout (see Source/GSInternal.h for details). */ @private id _internal GS_UNUSED_IVAR; #endif } /** * Provides an instance implementing the default behavior for the * [NSDecimalNumber] class. 38 decimal digits, rounded to closest return * value (NSRoundPlain). Exceptions raised on overflow, * underflow, and divide by zero. */ + (id)defaultDecimalNumberHandler; /** * Constructor setting all behavior. (For more precise control over error * handling, create your own class implementing the [(NSDecimalNumberBehaviors)] * protocol.) */ + (id)decimalNumberHandlerWithRoundingMode:(NSRoundingMode)roundingMode scale:(short)scale raiseOnExactness:(BOOL)raiseOnExactness raiseOnOverflow:(BOOL)raiseOnOverflow raiseOnUnderflow:(BOOL)raiseOnUnderflow raiseOnDivideByZero:(BOOL)raiseOnDivideByZero; /** * Initializer setting all behavior. (For more precise control over error * handling, create your own class implementing the [(NSDecimalNumberBehaviors)] * protocol.) */ - (id)initWithRoundingMode:(NSRoundingMode)roundingMode scale:(short)scale raiseOnExactness:(BOOL)raiseOnExactness raiseOnOverflow:(BOOL)raiseOnOverflow raiseOnUnderflow:(BOOL)raiseOnUnderflow raiseOnDivideByZero:(BOOL)raiseOnDivideByZero; @end /** *

Class that implements a number of methods for performing decimal * arithmetic to arbitrary precision. The behavior in terms of rounding * choices and exception handling may be customized using the * [NSDecimalNumberHandler] class, and defaults to * [NSDecimalNumberHandler+defaultDecimalNumberHandler].

* *

Equivalent functionality to the NSDecimalNumber class may * be accessed through functions, mostly named NSDecimalXXX, * e.g., NSDecimalMin(). Both the class and the functions use a structure * called NSDecimal.

* *

Note that instances of NSDecimalNumber are immutable.

*/ GS_EXPORT_CLASS @interface NSDecimalNumber : NSNumber { #if GS_EXPOSE(NSDecimalNumber) NSDecimal data; #endif } /** * Returns the default rounding/precision/exception handling behavior, which * is same as [NSDecimalNumberHandler+defaultDecimalNumberHandler] unless it * has been explicitly set otherwise. */ + (id )defaultBehavior; /** * Sets the default rounding/precision/exception handling behavior to the * given behavior. If this is not called, behavior defaults to * [NSDecimalNumberHandler+defaultDecimalNumberHandler]. */ + (void)setDefaultBehavior:(id )behavior; /** * Return maximum positive value that can be represented. */ + (NSDecimalNumber *)maximumDecimalNumber; /** * Return minimum negative value (not the smallest positive value) * that can be represented. */ + (NSDecimalNumber *)minimumDecimalNumber; /** * Return a fixed value representing an NaN. */ + (NSDecimalNumber *)notANumber; /** * Return a constant object with a value of one. */ + (NSDecimalNumber *)one; /** * Return a constant object with a value of zero. */ + (NSDecimalNumber *)zero; /** * New instance with given value. Note an NSDecimal may be created using the * function NSDecimalFromString(). */ + (NSDecimalNumber *)decimalNumberWithDecimal:(NSDecimal)decimal; /** * New instance by component. Note that the precision of this initializer is * limited. */ + (NSDecimalNumber *)decimalNumberWithMantissa:(unsigned long long)mantissa exponent:(short)exponent isNegative:(BOOL)isNegative; /** * New instance from string. Arbitrary precision is preserved, though calling * one of the decimalNumberBy... methods will return a result * constrained by the current scale. Number format * is parsed according to current default locale. */ + (NSDecimalNumber *)decimalNumberWithString:(NSString *)numericString; /** * New instance from string. Arbitrary precision is preserved, though calling * one of the decimalNumberBy... methods will return a result * constrained by the current scale. Number format * is parsed according to given locale. */ + (NSDecimalNumber *)decimalNumberWithString:(NSString *)numericString locale:(NSDictionary *)locale; /** * Initialize with given value. Note an NSDecimal may be created using the * function NSDecimalFromString(). */ - (id)initWithDecimal:(NSDecimal)decimal; /** * Initialize by component. Note that the precision of this initializer is * limited. */ - (id)initWithMantissa:(unsigned long long)mantissa exponent:(short)exponent isNegative:(BOOL)flag; /** * Initialize from string. Arbitrary precision is preserved, though calling * one of the decimalNumberBy... methods will return a result * constrained by the current scale. Number format * is parsed according to current default locale. */ - (id)initWithString:(NSString *)numberValue; /** * Initialize from string. Arbitrary precision is preserved, though calling * one of the decimalNumberBy... methods will return a result * constrained by the current scale. Number format * is parsed according to given locale. */ - (id)initWithString:(NSString *)numberValue locale:(NSDictionary *)locale; /** * Returns the Objective-C type (@encode(...) compatible) of the * data contained NSDecimalNumber, which is by convention "d" * (for double), even though this is not strictly accurate. */ - (const char *)objCType; /** * Return underlying value as an NSDecimal structure. */ - (NSDecimal)decimalValue; /** * Returns string version of number formatted according to locale. */ - (NSString *)descriptionWithLocale:(id)locale; /** * Returns underlying value as a double, which may be an * approximation if precision greater than the default of 38. */ - (double)doubleValue; /** * Compares with other number, returning less, greater, or equal. */ - (NSComparisonResult)compare:(NSNumber *)decimalNumber; /** * Adds self to decimalNumber and returns new result, using +defaultBehavior * for rounding/precision/error handling. */ - (NSDecimalNumber *)decimalNumberByAdding:(NSDecimalNumber *)decimalNumber; /** * Adds self to decimalNumber and returns new result, using given behavior * for rounding/precision/error handling. */ - (NSDecimalNumber *)decimalNumberByAdding:(NSDecimalNumber *)decimalNumber withBehavior:(id)behavior; /** * Divides self by decimalNumber and returns new result, using +defaultBehavior * for rounding/precision/error handling. */ - (NSDecimalNumber *)decimalNumberByDividingBy:(NSDecimalNumber *)decimalNumber; /** * Divides self by decimalNumber and returns new result, using given behavior * for rounding/precision/error handling. */ - (NSDecimalNumber *)decimalNumberByDividingBy:(NSDecimalNumber *)decimalNumber withBehavior:(id )behavior; /** * Multiplies self by decimalNumber and returns new result, using * +defaultBehavior for rounding/precision/error handling. */ - (NSDecimalNumber *)decimalNumberByMultiplyingBy:(NSDecimalNumber *)decimalNumber; /** * Multiplies self by decimalNumber and returns new result, using given * behavior for rounding/precision/error handling. */ - (NSDecimalNumber *)decimalNumberByMultiplyingBy:(NSDecimalNumber *)decimalNumber withBehavior:(id )behavior; /** * Multiplies self by given power of 10 and returns new result, using * +defaultBehavior for rounding/precision/error handling. */ - (NSDecimalNumber *)decimalNumberByMultiplyingByPowerOf10:(short)power; /** * Multiplies self by given power of 10 and returns new result, using given * behavior for rounding/precision/error handling. */ - (NSDecimalNumber *)decimalNumberByMultiplyingByPowerOf10:(short)power withBehavior:(id )behavior; /** * Raises self to given positive integer power and returns new result, using * +defaultBehavior for rounding/precision/error handling. */ - (NSDecimalNumber *)decimalNumberByRaisingToPower:(NSUInteger)power; /** * Raises self to given positive integer power and returns new result, using * given behavior for rounding/precision/error handling. */ - (NSDecimalNumber *)decimalNumberByRaisingToPower:(NSUInteger)power withBehavior:(id )behavior; /** * Subtracts decimalNumber from self and returns new result, using * +defaultBehavior for rounding/precision/error handling. */ - (NSDecimalNumber *)decimalNumberBySubtracting: (NSDecimalNumber *)decimalNumber; /** * Subtracts decimalNumber from self and returns new result, using given * behavior for rounding/precision/error handling. */ - (NSDecimalNumber *)decimalNumberBySubtracting: (NSDecimalNumber *)decimalNumber withBehavior:(id )behavior; /** * Returns rounded version of underlying decimal. */ - (NSDecimalNumber *)decimalNumberByRoundingAccordingToBehavior:(id )behavior; @end /** * Interface for obtaining an NSDecimalNumber value from an ordinary * NSNumber. */ @interface NSNumber (NSDecimalNumber) /** * Obtaining an NSDecimalNumber version of an ordinary NSNumber. */ - (NSDecimal) decimalValue; @end #if defined(__cplusplus) } #endif #endif #endif gnustep-base-1.29.0/Headers/Foundation/NSDictionary.h000066400000000000000000000157021435650067400224170ustar00rootroot00000000000000/* Interface for NSDictionary for GNUStep Copyright (C) 1995, 1996, 1999 Free Software Foundation, Inc. Written by: Andrew Kachites McCallum Date: 1995 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef _NSDictionary_h_GNUSTEP_BASE_INCLUDE #define _NSDictionary_h_GNUSTEP_BASE_INCLUDE #import #import #import #import #if defined(__cplusplus) extern "C" { #endif @class GS_GENERIC_CLASS(NSArray, ElementT); @class GS_GENERIC_CLASS(NSSet, ElementT); @class NSString, NSURL; GS_EXPORT_CLASS @interface GS_GENERIC_CLASS(NSDictionary, __covariant KeyT:id, __covariant ValT) : NSObject + (instancetype) dictionary; + (instancetype) dictionaryWithContentsOfFile: (NSString*)path; #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) + (instancetype) dictionaryWithContentsOfURL: (NSURL*)aURL; #endif + (instancetype) dictionaryWithDictionary: (NSDictionary*)otherDictionary; + (instancetype) dictionaryWithObject: (GS_GENERIC_TYPE(ValT))object forKey: (GS_GENERIC_TYPE(KeyT))key; + (instancetype) dictionaryWithObjects: (GS_GENERIC_CLASS(NSArray,ValT)*)objects forKeys: (GS_GENERIC_CLASS(NSArray,KeyT)*)keys; + (instancetype) dictionaryWithObjects: (const GS_GENERIC_TYPE(ValT)[])objects forKeys: (const GS_GENERIC_TYPE_F(KeyT,id)[])keys count: (NSUInteger)count; + (instancetype) dictionaryWithObjectsAndKeys: (id)firstObject, ...; - (GS_GENERIC_CLASS(NSArray,KeyT)*) allKeys; - (GS_GENERIC_CLASS(NSArray,KeyT)*) allKeysForObject: (GS_GENERIC_TYPE(ValT))anObject; - (GS_GENERIC_CLASS(NSArray,ValT)*) allValues; - (NSUInteger) count; // Primitive - (NSString*) description; - (NSString*) descriptionInStringsFileFormat; - (NSString*) descriptionWithLocale: (id)locale; - (NSString*) descriptionWithLocale: (id)locale indent: (NSUInteger)level; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) DEFINE_BLOCK_TYPE(GSKeysAndObjectsEnumeratorBlock, void, GS_GENERIC_TYPE_F(KeyT,id), GS_GENERIC_TYPE(ValT), BOOL*); - (void) enumerateKeysAndObjectsUsingBlock: (GSKeysAndObjectsEnumeratorBlock)aBlock; - (void) enumerateKeysAndObjectsWithOptions: (NSEnumerationOptions)opts usingBlock: (GSKeysAndObjectsEnumeratorBlock)aBlock; #endif - (void) getObjects: (__unsafe_unretained GS_GENERIC_TYPE(ValT)[])objects andKeys: (__unsafe_unretained GS_GENERIC_TYPE_F(KeyT,id)[])keys; - (instancetype) init; - (instancetype) initWithContentsOfFile: (NSString*)path; #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) - (instancetype) initWithContentsOfURL: (NSURL*)aURL; #endif - (instancetype) initWithDictionary: (GS_GENERIC_CLASS(NSDictionary,KeyT, ValT)*)otherDictionary; - (id) initWithDictionary: (GS_GENERIC_CLASS(NSDictionary,KeyT, ValT)*)other copyItems: (BOOL)shouldCopy; - (id) initWithObjects: (GS_GENERIC_CLASS(NSArray,KeyT)*)objects forKeys: (GS_GENERIC_CLASS(NSArray,ValT)*)keys; - (id) initWithObjectsAndKeys: (GS_GENERIC_TYPE(ValT))firstObject, ...; - (id) initWithObjects: (const GS_GENERIC_TYPE(ValT)[])objects forKeys: (const GS_GENERIC_TYPE_F(KeyT,id)[])keys count: (NSUInteger)count; // Primitive - (BOOL) isEqualToDictionary: (GS_GENERIC_CLASS(NSDictionary,KeyT, ValT)*)other; - (GS_GENERIC_CLASS(NSEnumerator,KeyT)*) keyEnumerator; // Primitive #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) DEFINE_BLOCK_TYPE(GSKeysAndObjectsPredicateBlock, BOOL, GS_GENERIC_TYPE_F(KeyT,id), GS_GENERIC_TYPE(ValT), BOOL*); - (GS_GENERIC_CLASS(NSSet,KeyT)*) keysOfEntriesPassingTest: (GSKeysAndObjectsPredicateBlock)aPredicate; - (GS_GENERIC_CLASS(NSSet,KeyT)*) keysOfEntriesWithOptions: (NSEnumerationOptions)opts passingTest: (GSKeysAndObjectsPredicateBlock)aPredicate; #endif - (GS_GENERIC_CLASS(NSArray,ValT)*) keysSortedByValueUsingSelector: (SEL)comp; - (GS_GENERIC_CLASS(NSArray,ValT)*) keysSortedByValueUsingComparator:(NSComparator)cmptr; - (GS_GENERIC_CLASS(NSArray,ValT)*) keysSortedByValueWithOptions:(NSSortOptions)opts usingComparator:(NSComparator)cmptr; - (GS_GENERIC_CLASS(NSEnumerator,ValT)*) objectEnumerator; // Primitive - (GS_GENERIC_TYPE(ValT)) objectForKey: (GS_GENERIC_TYPE(KeyT))aKey; // Primitive - (GS_GENERIC_CLASS(NSArray,ValT)*) objectsForKeys: (GS_GENERIC_CLASS(NSArray,KeyT)*)keys notFoundMarker: (GS_GENERIC_TYPE(ValT))marker; #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) - (GS_GENERIC_TYPE(ValT)) valueForKey: (NSString*)key; #endif - (BOOL) writeToFile: (NSString*)path atomically: (BOOL)useAuxiliaryFile; #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) - (BOOL) writeToURL: (NSURL*)url atomically: (BOOL)useAuxiliaryFile; #endif /** * Method called by array subscripting. */ - (GS_GENERIC_TYPE(ValT)) objectForKeyedSubscript: (GS_GENERIC_TYPE(KeyT))aKey; @end GS_EXPORT_CLASS @interface GS_GENERIC_CLASS(NSMutableDictionary, KeyT:id, ValT) : GS_GENERIC_CLASS(NSDictionary, KeyT, ValT) + (instancetype) dictionaryWithCapacity: (NSUInteger)numItems; - (void) addEntriesFromDictionary: (GS_GENERIC_CLASS(NSDictionary, KeyT, ValT)*)otherDictionary; - (instancetype) initWithCapacity: (NSUInteger)numItems; // Primitive - (void) removeAllObjects; /** * Removes the object with the specified key from the receiver. This method * is primitive. */ - (void) removeObjectForKey: (GS_GENERIC_TYPE(KeyT))aKey; - (void) removeObjectsForKeys: (GS_GENERIC_CLASS(NSArray, KeyT) *)keyArray; - (void) setObject: (GS_GENERIC_TYPE(ValT))anObject forKey: (GS_GENERIC_TYPE(KeyT))aKey; // Primitive - (void) setDictionary: (GS_GENERIC_CLASS(NSDictionary, KeyT, ValT)*)otherDictionary; #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) - (void) setValue: (GS_GENERIC_TYPE(ValT))value forKey: (NSString*)key; - (void) takeStoredValue: (GS_GENERIC_TYPE(ValT))value forKey: (NSString*)key; - (void) takeValue: (GS_GENERIC_TYPE(ValT))value forKey: (NSString*)key; #endif /** * Method called by array subscripting. */ - (void) setObject: (GS_GENERIC_TYPE(ValT))anObject forKeyedSubscript: (GS_GENERIC_TYPE(KeyT))aKey; @end #if defined(__cplusplus) } #endif #endif gnustep-base-1.29.0/Headers/Foundation/NSDistantObject.h000066400000000000000000000045131435650067400230450ustar00rootroot00000000000000/* Interface for GNU Objective-C version of NSDistantObject Copyright (C) 1997 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Based on code by: Andrew Kachites McCallum Created: August 1997 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSDistantObject_h_GNUSTEP_BASE_INCLUDE #define __NSDistantObject_h_GNUSTEP_BASE_INCLUDE #import #import #if defined(__cplusplus) extern "C" { #endif @class NSConnection; GS_EXPORT_CLASS @interface NSDistantObject : NSProxy { #if GS_EXPOSE(NSDistantObject) @public NSConnection *_connection; id _object; unsigned _handle; Protocol *_protocol; unsigned _counter; void *_sigs; #endif } + (NSDistantObject*) proxyWithLocal: (id)anObject connection: (NSConnection*)aConnection; /* * NB. Departure from the OpenStep/MacOS spec - the type of a target * is an integer, not an id, since we can't safely pass id's * between address spaces on machines with different pointer sizes. */ + (NSDistantObject*) proxyWithTarget: (unsigned)anObject connection: (NSConnection*)aConnection; - (NSConnection*) connectionForProxy; - (id) initWithLocal: (id)anObject connection: (NSConnection*)aConnection; - (id) initWithTarget: (unsigned)target connection: (NSConnection*)aConnection; - (NSMethodSignature*) methodSignatureForSelector: (SEL)aSelector; - (void) setProtocolForProxy: (Protocol*)aProtocol; @end #if defined(__cplusplus) } #endif #endif /* __NSDistantObject_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSDistributedLock.h000066400000000000000000000037211435650067400234030ustar00rootroot00000000000000/* Interface for NSDistributedLock for GNUStep Copyright (C) 1997 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 1997 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSDistributedLock_h_GNUSTEP_BASE_INCLUDE #define __NSDistributedLock_h_GNUSTEP_BASE_INCLUDE #import #import @class NSDate; @class NSLock; @class NSString; #if defined(__cplusplus) extern "C" { #endif GS_EXPORT_CLASS @interface NSDistributedLock : NSObject { #if GS_EXPOSE(NSDistributedLock) NSString *_lockPath; NSDate *_lockTime; NSLock *_localLock; #endif #if GS_NONFRAGILE #else /* Pointer to private additional data used to avoid breaking ABI * when we don't have the non-fragile ABI available. * Use this mechanism rather than changing the instance variable * layout (see Source/GSInternal.h for details). */ @private id _internal GS_UNUSED_IVAR; #endif } + (NSDistributedLock*) lockWithPath: (NSString*)aPath; - (id) initWithPath: (NSString*)aPath; - (void) breakLock; - (NSDate*) lockDate; - (BOOL) tryLock; - (void) unlock; @end #if defined(__cplusplus) } #endif #endif /* __NSDistributedLock_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSDistributedNotificationCenter.h000066400000000000000000000112211435650067400262740ustar00rootroot00000000000000/* Interface of NSDistributedNotificationCenter class Copyright (C) 1998 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: October 1998 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSDistributedNotificationCenter_h_GNUSTEP_BASE_INCLUDE #define __NSDistributedNotificationCenter_h_GNUSTEP_BASE_INCLUDE #import #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) #import #import #import #if defined(__cplusplus) extern "C" { #endif /** * Enumeration of possible values for specifying how * [NSDistributedNotificationCenter] deals with notifications when the * process to which the notification should be delivered is suspended: { NSNotificationSuspensionBehaviorDrop, // drop the notification NSNotificationSuspensionBehaviorCoalesce, // drop all for this process but the latest-sent notification NSNotificationSuspensionBehaviorHold, // queue all notifications for this process until it is resumed NSNotificationSuspensionBehaviorDeliverImmediately // resume the process and deliver } */ enum { NSNotificationSuspensionBehaviorDrop = 1, NSNotificationSuspensionBehaviorCoalesce = 2, NSNotificationSuspensionBehaviorHold = 3, NSNotificationSuspensionBehaviorDeliverImmediately = 4 }; typedef NSUInteger NSNotificationSuspensionBehavior; /** * Type for [NSDistributedNotificationCenter+notificationCenterForType:] - * localhost current user broadcast only. This is the only type on OS X. */ GS_EXPORT NSString* const NSLocalNotificationCenterType; #if OS_API_VERSION(GS_API_NONE, GS_API_NONE) /** * Type of [NSDistributedNotificationCenter+notificationCenterForType:] - * all users on the local host. This type is available only on GNUstep. */ GS_EXPORT NSString* const GSPublicNotificationCenterType; /** * Type of [NSDistributedNotificationCenter+notificationCenterForType:] - * localhost and LAN broadcast. This type is available only on GNUstep. */ GS_EXPORT NSString* const GSNetworkNotificationCenterType; #endif GS_EXPORT_CLASS @interface NSDistributedNotificationCenter : NSNotificationCenter { #if GS_EXPOSE(NSDistributedNotificationCenter) NSRecursiveLock *_centerLock; /* For thread safety. */ NSString *_type; /* Type of notification center. */ id _remote; /* Proxy for center. */ BOOL _suspended; /* Is delivery suspended? */ #endif #if GS_NONFRAGILE #else /* Pointer to private additional data used to avoid breaking ABI * when we don't have the non-fragile ABI available. * Use this mechanism rather than changing the instance variable * layout (see Source/GSInternal.h for details). */ @private id _internal GS_UNUSED_IVAR; #endif } + (id) defaultCenter; + (NSDistributedNotificationCenter*) notificationCenterForType: (NSString*)type; - (void) addObserver: (id)anObserver selector: (SEL)aSelector name: (NSString*)notificationName object: (NSString*)anObject; - (void) addObserver: (id)anObserver selector: (SEL)aSelector name: (NSString*)notificationName object: (NSString*)anObject suspensionBehavior: (NSNotificationSuspensionBehavior)suspensionBehavior; - (void) postNotification: (NSNotification*)notification; - (void) postNotificationName: (NSString*)notificationName object: (NSString*)anObject; - (void) postNotificationName: (NSString*)notificationName object: (NSString*)anObject userInfo: (NSDictionary*)userInfo; - (void) postNotificationName: (NSString*)notificationName object: (NSString*)anObject userInfo: (NSDictionary*)userInfo deliverImmediately: (BOOL)deliverImmediately; - (void) removeObserver: (id)anObserver name: (NSString*)notificationName object: (NSString*)anObject; - (void) setSuspended: (BOOL)flag; - (BOOL) suspended; @end #if defined(__cplusplus) } #endif #endif #endif gnustep-base-1.29.0/Headers/Foundation/NSEnergyFormatter.h000066400000000000000000000047141435650067400234300ustar00rootroot00000000000000/* Definition of class NSEnergyFormatter Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory John Casamento Date: Tue Oct 8 13:30:10 EDT 2019 This file is part of the GNUstep Library. 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 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 USA. */ #ifndef _NSEnergyFormatter_h_GNUSTEP_BASE_INCLUDE #define _NSEnergyFormatter_h_GNUSTEP_BASE_INCLUDE #import #if OS_API_VERSION(MAC_OS_X_VERSION_10_10, GS_API_LATEST) #if defined(__cplusplus) extern "C" { #endif @class NSNumberFormatter, NSString; enum { NSEnergyFormatterUnitJoule = 11, NSEnergyFormatterUnitKilojoule = 14, NSEnergyFormatterUnitCalorie = (7 << 8) + 1, NSEnergyFormatterUnitKilocalorie = (7 << 8) + 2, }; typedef NSInteger NSEnergyFormatterUnit; GS_EXPORT_CLASS @interface NSEnergyFormatter : NSFormatter { BOOL _isForFoodEnergyUse; NSNumberFormatter *_numberFormatter; NSFormattingUnitStyle _unitStyle; } - (NSNumberFormatter *) numberFormatter; - (void) setNumberFormatter: (NSNumberFormatter *)formatter; - (NSFormattingUnitStyle) unitStyle; - (void) setUnitStyle: (NSFormattingUnitStyle)style; - (BOOL) isForFoodEnergyUse; - (void) setForFoodEnergyUse: (BOOL)flag; - (NSString *) stringFromValue: (double)value unit: (NSEnergyFormatterUnit)unit; - (NSString *) stringFromJoules: (double)numberInJoules; - (NSString *) unitStringFromValue: (double)value unit: (NSEnergyFormatterUnit)unit; - (NSString *) unitStringFromJoules: (double)numberInJoules usedUnit: (NSEnergyFormatterUnit *)unitp; - (BOOL) getObjectValue:(id *)obj forString: (NSString *)string errorDescription: (NSString **)error; @end #if defined(__cplusplus) } #endif #endif /* GS_API_MACOSX */ #endif /* _NSEnergyFormatter_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSEnumerator.h000066400000000000000000000034501435650067400224300ustar00rootroot00000000000000/* NSEnumerator.h Copyright (C) 1998 Free Software Foundation, Inc. Author: Scott Christley Date: January 1998 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSEnumerator_h_GNUSTEP_BASE_INCLUDE #define __NSEnumerator_h_GNUSTEP_BASE_INCLUDE #import #import #if defined(__cplusplus) extern "C" { #endif @class GS_GENERIC_CLASS(NSArray, ElementT); typedef struct { unsigned long state; __unsafe_unretained id *itemsPtr; unsigned long *mutationsPtr; unsigned long extra[5]; } NSFastEnumerationState; @protocol NSFastEnumeration - (NSUInteger) countByEnumeratingWithState: (NSFastEnumerationState *)state objects: (__unsafe_unretained id[])stackbuf count: (NSUInteger)len; @end GS_EXPORT_CLASS @interface GS_GENERIC_CLASS(NSEnumerator, IterT) : NSObject - (GS_GENERIC_CLASS(NSArray, IterT) *) allObjects; - (GS_GENERIC_TYPE(IterT)) nextObject; @end #if defined(__cplusplus) } #endif #endif /* __NSEnumerator_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSError.h000066400000000000000000000162101435650067400213760ustar00rootroot00000000000000/** Interface for NSError for GNUStep Copyright (C) 2004,2006 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: May 2004 This file is part of the GNUstep Base Library. 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 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 USA. AutogsdocSource: NSError.m */ #ifndef __NSError_h_GNUSTEP_BASE_INCLUDE #define __NSError_h_GNUSTEP_BASE_INCLUDE #import #import #if OS_API_VERSION(MAC_OS_X_VERSION_10_3,GS_API_LATEST) #if defined(__cplusplus) extern "C" { #endif @class NSArray, NSDictionary, NSString; typedef NSString* NSErrorDomain; /** * Key for user info dictionary component which describes the error in * a human readable format. */ GS_EXPORT NSString* const NSLocalizedDescriptionKey; /** * Where one error has caused another, the underlying error can be stored * in the user info dictionary using this key. */ GS_EXPORT NSString* const NSUnderlyingErrorKey; #if OS_API_VERSION(MAC_OS_X_VERSION_10_4,GS_API_LATEST) /** * This key can be used to store the file path of a resource involved * in the error (eg unreadable file). */ GS_EXPORT NSString* const NSFilePathErrorKey; /** * Key for an [NSNumber] containing an NSStringEncoding value. */ GS_EXPORT NSString* const NSStringEncodingErrorKey; /** * This can be used to store the URLK involved in the error. */ GS_EXPORT NSString* const NSURLErrorKey; /** * Key to store a string describing what caused the error to occur. */ GS_EXPORT NSString* const NSLocalizedFailureReasonErrorKey; /** * Key to store an [NSArray] of strings suitable for use as the * titles of buttons in an alert panel used to attempt error * recovery in a GUI application. */ GS_EXPORT NSString* const NSLocalizedRecoveryOptionsErrorKey; /** * Key to store a string providing a hint on how to use the buttons * in an alert panel. */ GS_EXPORT NSString* const NSLocalizedRecoverySuggestionErrorKey; /** * Key to store an object which can be used to attempt to recover from * the error. */ GS_EXPORT NSString* const NSRecoveryAttempterErrorKey; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_6,GS_API_LATEST) /** * NSURL to indicate the URL which did not load, in the NSURLErrorDomain. */ GS_EXPORT NSString* const NSURLErrorFailingURLErrorKey; /** * NSString in the NSURLDomain to indicate the object for the URL that did not load. * This supersedes NSErrorFailingURLStringKey */ GS_EXPORT NSString* const NSURLErrorFailingURLStringErrorKey; #endif /** * Domain for system errors (on MACH). */ GS_EXPORT NSErrorDomain const NSMACHErrorDomain; /** * Domain for system errors. */ GS_EXPORT NSErrorDomain const NSOSStatusErrorDomain; /** * Domain for system and system library errors. */ GS_EXPORT NSErrorDomain const NSPOSIXErrorDomain; #if OS_API_VERSION(MAC_OS_X_VERSION_10_4,GS_API_LATEST) /** * Domain for Foundation and AppKit (base and gui) errors. */ GS_EXPORT NSErrorDomain const NSCocoaErrorDomain; #endif /** * Error information class.
* NSError instances are used to pass information about runtime errors * from lower levels to higher levels of the program.
* These should be used instead of exceptions where an error is caused * by external factors (such as a resource file not being present) * rather than a programming error (where NSException should be used). */ GS_EXPORT_CLASS @interface NSError : NSObject { #if GS_EXPOSE(NSError) @private int _code; NSString *_domain; NSDictionary *_userInfo; #endif #if GS_NONFRAGILE #else /* Pointer to private additional data used to avoid breaking ABI * when we don't have the non-fragile ABI available. * Use this mechanism rather than changing the instance variable * layout (see Source/GSInternal.h for details). */ @private id _internal GS_UNUSED_IVAR; #endif } /** * Creates and returns an autoreleased NSError instance by calling * -initWithDomain:code:userInfo: */ + (id) errorWithDomain: (NSErrorDomain)aDomain code: (NSInteger)aCode userInfo: (NSDictionary*)aDictionary; /** * Return the error code ... which is not globally unique, just unique for * a particular domain. */ - (NSInteger) code; /** * Return the domain for this instance. */ - (NSErrorDomain) domain; /** * Initialises the receiver using the supplied domain, code, and info.
* The domain must be non-nil. */ - (id) initWithDomain: (NSErrorDomain)aDomain code: (NSInteger)aCode userInfo: (NSDictionary*)aDictionary; /** * Return a human readable description for the error.
* The default implementation uses the value from the user info dictionary * if it is available, otherwise it generates a generic one from domain * and code. */ - (NSString *) localizedDescription; #if OS_API_VERSION(MAC_OS_X_VERSION_10_4,GS_API_LATEST) /** * Return a human readable explanation of the reason for the error * (if known). This should normally be a more discursive explanation * then the short one provided by the -localizedDescription method.
* The default implementation uses the value from the user info dictionary * if it is available, otherwise it returns nil. */ - (NSString *) localizedFailureReason; /** * Returns an array of strings to be used as titles of buttons in an * alert panel when offering the user optionbs to try to recover from * the error.
* The default implementation uses the value from the user info dictionary * if it is available, otherwise it returns nil. */ - (NSArray *) localizedRecoveryOptions; /** * Returns a string used as the secondary text in an alert panel, * suggesting how the user might select an option to attempt to * recover from the error.
* The default implementation uses the value from the user info dictionary * if it is available, otherwise it returns nil. */ - (NSString *) localizedRecoverySuggestion; /** * Not yet useful in GNUstep.
* The default implementation uses the value from the user info dictionary * if it is available, otherwise it returns nil. */ - (id) recoveryAttempter; #endif /** * Return the user info for this instance (or nil if none is set)
* The NSLocalizedDescriptionKey should locate a human readable * description in the dictionary.
* The NSUnderlyingErrorKey key should locate an * NSError instance if an error is available describing any * underlying problem.
*/ - (NSDictionary*) userInfo; @end #if defined(__cplusplus) } #endif #endif #endif /* __NSError_h_GNUSTEP_BASE_INCLUDE*/ gnustep-base-1.29.0/Headers/Foundation/NSErrorRecoveryAttempting.h000066400000000000000000000035701435650067400251570ustar00rootroot00000000000000/** Interface for NSErrorRecoveryAttempting for GNUStep Copyright (C) 2007 Free Software Foundation, Inc. Written by: Fred Kiefer Date: July 2007 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSErrorRecoveryAttempting_h_GNUSTEP_BASE_INCLUDE #define __NSErrorRecoveryAttempting_h_GNUSTEP_BASE_INCLUDE #import #if OS_API_VERSION(MAC_OS_X_VERSION_10_4, GS_API_LATEST) #import #if defined(__cplusplus) extern "C" { #endif /** * These methods define the informal error recovery protocol */ @interface NSObject (NSErrorRecoveryAttempting) - (BOOL) attemptRecoveryFromError: (NSError*)error optionIndex: (unsigned int)recoveryOptionIndex; - (void) attemptRecoveryFromError: (NSError*)error optionIndex: (unsigned int)recoveryOptionIndex delegate: (id)delegate didRecoverSelector: (SEL)didRecoverSelector contextInfo: (void*)contextInfo; @end #if defined(__cplusplus) } #endif #endif #endif /* __NSErrorRecoveryAttempting_h_GNUSTEP_BASE_INCLUDE*/ gnustep-base-1.29.0/Headers/Foundation/NSException.h000066400000000000000000000521731435650067400222530ustar00rootroot00000000000000/** Interface for NSException for GNUStep Copyright (C) 1995, 1996 Free Software Foundation, Inc. Written by: Adam Fedor Date: 1995 This file is part of the GNUstep Base Library. 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 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 USA. NSException and NSAssertionHandler class reference AutogsdocSource: NSAssertionHandler.m AutogsdocSource: NSException.m */ #ifndef __NSException_h_GNUSTEP_BASE_INCLUDE #define __NSException_h_GNUSTEP_BASE_INCLUDE #import #import #if defined(_NATIVE_OBJC_EXCEPTIONS) # define USER_NATIVE_OBJC_EXCEPTIONS 1 #elif BASE_NATIVE_OBJC_EXCEPTIONS && defined(OBJC_ZEROCOST_EXCEPTIONS) # define USER_NATIVE_OBJC_EXCEPTIONS 1 # define _NATIVE_OBJC_EXCEPTIONS 1 #endif #if !BASE_NATIVE_OBJC_EXCEPTIONS && USER_NATIVE_OBJC_EXCEPTIONS #error "There are two separate exception handling mechanisms available ... one based on the standard setjmp() function (which does not require special compiler support), and one 'native' version where the compiler manages the exception handling. If you try to use both in the same executable, exception handlers will not work... which can be pretty disastrous. This error is telling you that the gnustep-base library was built using one form of exception handling, but that the gnustep-make package you are using is building code to use the other form of exception handling ... with the consequence that exception handling would be broken in the program you are building. So, somehow your gnustep-base and gnustep-make package are incompatible, and you need to replace one of them with a version configured to match the other." #if BASE_NATIVE_OBJC_EXCEPTIONS #error "gnustep-base is configured to use 'native' exceptions, but you are building for 'traditional' exceptions." #else #error "gnustep-base is configured to use 'traditional' exceptions, but you are building for 'native' exceptions." #endif #endif #import #include #include #if defined(__WIN64__) /* This hack is to deal with the fact that currently (June 2016) the * implementation of longjmp in mingw-w64 sometimes crashes in msvcrt.dll * but the builtin version provided by gcc seems to work. */ #undef setjmp #define setjmp(X) __builtin_setjmp(X) #undef longjmp #define longjmp(X,Y) __builtin_longjmp(X,Y) #endif #if defined(__cplusplus) extern "C" { #endif @class NSDictionary; /**

The NSException class helps manage errors in a program. It provides a mechanism for lower-level methods to provide information about problems to higher-level methods, which more often than not, have a better ability to decide what to do about the problems.

Exceptions are typically handled by enclosing a sensitive section of code inside the macros NS_DURING and NS_HANDLER, and then handling any problems after this, up to the NS_ENDHANDLER macro:

NS_DURING code that might cause an exception NS_HANDLER code that deals with the exception. If this code cannot deal with it, you can re-raise the exception like this [localException raise] so the next higher level of code can handle it NS_ENDHANDLER

The local variable localException is the name of the exception object you can use in the NS_HANDLER section. The easiest way to cause an exception is using the +raise:format:,... method.

If there is no NS_HANDLER ... NS_ENDHANDLER block enclosing (directly or indirectly) code where an exception is raised, then control passes to the uncaught exception handler function and the program is then terminated.
The uncaught exception handler is set using NSSetUncaughtExceptionHandler() and if not set, defaults to a function which will simply print an error message before the program terminates.

*/ GS_EXPORT_CLASS @interface NSException : NSObject { #if GS_EXPOSE(NSException) @private NSString *_e_name; NSString *_e_reason; void *_reserved; #endif } /** * Create an an exception object with a name, reason and a dictionary * userInfo which can be used to provide additional information or * access to objects needed to handle the exception. After the * exception is created you must -raise it. */ + (NSException*) exceptionWithName: (NSString*)name reason: (NSString*)reason userInfo: (NSDictionary*)userInfo; /** * Creates an exception with a name and a reason using the * format string and any additional arguments. The exception is then * raised using the -raise method. */ + (void) raise: (NSString*)name format: (NSString*)format,... NS_FORMAT_FUNCTION(2,3) GS_NORETURN_METHOD; /** * Creates an exception with a name and a reason string using the * format string and additional arguments specified as a variable * argument list argList. The exception is then raised * using the -raise method. */ + (void) raise: (NSString*)name format: (NSString*)format arguments: (va_list)argList NS_FORMAT_FUNCTION(2,0) GS_NORETURN_METHOD; #if OS_API_VERSION(MAC_OS_X_VERSION_10_5,GS_API_LATEST) && GS_API_VERSION( 11501,GS_API_LATEST) /** Returns an array of the call stack return addresses at the point when * the exception was raised. Re-raising the exception does not change * this value. */ - (NSArray*) callStackReturnAddresses; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_6,GS_API_LATEST) && GS_API_VERSION( 11903,GS_API_LATEST) /** * Returns an array of the symbolic names of the call stack return addresses. * Note that, on some platforms, symbols are only exported in * position-independent code and so these may only return numeric addresses for * code in static libraries or the main application. */ - (NSArray*) callStackSymbols; #endif /** * Initializes a newly allocated NSException object with a * name, reason and a dictionary userInfo. */ - (id) initWithName: (NSString*)name reason: (NSString*)reason userInfo: (NSDictionary*)userInfo; /** Returns the name of the exception. */ - (NSString*) name; /** * Raises the exception. All code following the raise will not be * executed and program control will be transfered to the closest * calling method which encapsulates the exception code in an * NS_DURING macro.
* If the exception was not caught in a macro, the currently set * uncaught exception handler is called to perform final logging * and the program is then terminated.
* If the uncaught exception handler fails to terminate the program, * then the default behavior is to terminate the program as soon as * the uncaught exception handler function returns.
* NB. all other exception raising methods call this one, so if you * want to set a breakpoint when debugging, set it in this method. */ - (void) raise GS_NORETURN_METHOD; /** Returns the exception reason. */ - (NSString*) reason; /** Returns the exception userInfo dictionary.
*/ - (NSDictionary*) userInfo; @end /** An exception when character set conversion fails. */ GS_EXPORT NSString* const NSCharacterConversionException; /** Attempt to use an invalidated destination. */ GS_EXPORT NSString* const NSDestinationInvalidException; /** A generic exception for general purpose usage. */ GS_EXPORT NSString* const NSGenericException; /** An exception for cases where unexpected state is detected within an object. */ GS_EXPORT NSString* const NSInternalInconsistencyException; /** An exception used when an invalid argument is passed to a method * or function. */ GS_EXPORT NSString* const NSInvalidArgumentException; /** Attempt to use a receive port which has been invalidated. */ GS_EXPORT NSString * const NSInvalidReceivePortException; /** Attempt to use a send port which has been invalidated. */ GS_EXPORT NSString * const NSInvalidSendPortException; /** An exception used when the system fails to allocate required memory. */ GS_EXPORT NSString* const NSMallocException; /** An exception when a remote object is sent a message from a thread * unable to access the object. */ GS_EXPORT NSString* const NSObjectInaccessibleException; /** Attempt to send to an object which is no longer available. */ GS_EXPORT NSString* const NSObjectNotAvailableException; /** UNused ... for MacOS-X compatibility. */ GS_EXPORT NSString* const NSOldStyleException; #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) /** An exception used when some form of parsing fails. */ GS_EXPORT NSString* const NSParseErrorException; #endif /** Some failure to receive on a port. */ GS_EXPORT NSString * const NSPortReceiveException; /** Some failure to send on a port. */ GS_EXPORT NSString * const NSPortSendException; /** * Exception raised by [NSPort], [NSConnection], and friends if sufficient * time elapses while waiting for a response, or if the receiving port is * invalidated before a request can be received. See * [NSConnection-setReplyTimeout:]. */ GS_EXPORT NSString * const NSPortTimeoutException; /* OPENSTEP */ /** An exception used when an illegal range is encountered ... usually this * is used to provide more information than an invalid argument exception. */ GS_EXPORT NSString* const NSRangeException; /** * The actual structure for an NSHandler. You shouldn't need to worry about it. */ typedef struct _NSHandler { jmp_buf jumpState; /* place to longjmp to */ struct _NSHandler *next; /* ptr to next handler */ __unsafe_unretained NSException *exception; } NSHandler; /** * This is the type of the exception handler called when an exception is * generated and not caught by the programmer. See * NSGetUncaughtExceptionHandler(), NSSetUncaughtExceptionHandler(). */ typedef void NSUncaughtExceptionHandler(NSException *exception); /** * Returns the exception handler called when an exception is generated and * not caught by the programmer (by enclosing in NS_DURING and * NS_HANDLER...NS_ENDHANDLER). The default prints * an error message and exits the program. You can change this behavior by * calling NSSetUncaughtExceptionHandler(). */ GS_EXPORT NSUncaughtExceptionHandler * NSGetUncaughtExceptionHandler(); /** *

Sets the exception handler called when an exception is generated and * not caught by the programmer (by enclosing in NS_DURING and * NS_HANDLER...NS_ENDHANDLER). The default prints * an error message and exits the program. proc should take a single argument * of type NSException *. *

*

NB. If the exception handler set by this function does not terminate * the process, the process will be terminateed anyway. This is a safety * precaution to ensure that, in the event of an exception being raised * and not handled, the program does not try to continue running in a * confused state (possibly doing horrible things like billing customers * who shouldn't be billed etc), but shuts down as cleanly as possible. *

*

Process termination is normally accomplished by calling the standard * exit function of the C runtime library, but if the environment variable * CRASH_ON_ABORT is set to YES or TRUE or 1 the termination will be * accomplished by calling the abort function instead, which should cause * a core dump to be made for debugging. *

*

The value of proc should be a pointer to a function taking an * [NSException] instance as an argument. *

*/ GS_EXPORT void NSSetUncaughtExceptionHandler(NSUncaughtExceptionHandler *handler); /* NS_DURING, NS_HANDLER and NS_ENDHANDLER are always used like: NS_DURING some code which might raise an error NS_HANDLER code that will be jumped to if an error occurs NS_ENDHANDLER If any error is raised within the first block of code, the second block of code will be jumped to. Typically, this code will clean up any resources allocated in the routine, possibly case on the error code and perform special processing, and default to RERAISE the error to the next handler. Within the scope of the handler, a local variable called "localException" holds information about the exception raised. It is illegal to exit the first block of code by any other means than NS_VALRETURN, NS_VOIDRETURN, or just falling out the bottom. */ #if USER_NATIVE_OBJC_EXCEPTIONS # define NS_DURING @try { # define NS_HANDLER } @catch (NSException * localException) { # define NS_ENDHANDLER } # define NS_VALRETURN(val) return (val) # define NS_VALUERETURN(object, id) return (object) # define NS_VOIDRETURN return #elif !USER_NATIVE_OBJC_EXCEPTIONS && !BASE_NATIVE_OBJC_EXCEPTIONS /** Private support routine. Do not call directly. */ GS_EXPORT void _NSAddHandler( NSHandler *handler ); /** Private support routine. Do not call directly. */ GS_EXPORT void _NSRemoveHandler( NSHandler *handler ); #define NS_DURING { NSHandler NSLocalHandler; \ _NSAddHandler(&NSLocalHandler); \ if (!setjmp(NSLocalHandler.jumpState)) { #define NS_HANDLER _NSRemoveHandler(&NSLocalHandler); } else { \ NSException __attribute__((unused)) *localException \ = NSLocalHandler.exception; \ { #define NS_ENDHANDLER }}} #define NS_VALRETURN(val) do { __typeof__(val) temp = (val); \ _NSRemoveHandler(&NSLocalHandler); \ return(temp); } while (0) #define NS_VALUERETURN(object, id) do { id temp = object; \ _NSRemoveHandler(&NSLocalHandler); \ return(temp); } while (0) #define NS_VOIDRETURN do { _NSRemoveHandler(&NSLocalHandler); \ return; } while (0) #endif // _NATIVE_OBJC_EXCEPTIONS /* ------------------------------------------------------------------------ */ /* Assertion Handling */ /* ------------------------------------------------------------------------ */ /** *

NSAssertionHandler objects are used to raise exceptions on behalf of * macros implementing assertions.
* Each thread has its own assertion handler instance.
*

*

The macros work together with the assertion handler object to * produce meaningful exception messages containing the name of the * source file, the position within that file, and the name of the * ObjC method or C function in which the assertion failed. *

*

An NSAssertionHandler instance is created on demand for each thread * and is stored in the thread's dictionary under the key NSAssertionHandler. * A custom NSAssertionHandler can be used by adding it to the thread * dictionary under this key. *

* The assertion macros are: * NSAssert(), NSCAssert(), * NSAssert1(), NSCAssert1(), * NSAssert2(), NSCAssert2(), * NSAssert3(), NSCAssert3(), * NSAssert4(), NSCAssert4(), * NSAssert5(), NSCAssert5(), * NSParameterAssert(), NSCParameterAssert()
* The numbered macros arre obsolete, dating from a time when NSAssert() and * NSCAssert() did not support a variable number of arguments. */ GS_EXPORT_CLASS @interface NSAssertionHandler : NSObject + (NSAssertionHandler*) currentHandler; - (void) handleFailureInFunction: (NSString*)functionName file: (NSString*)fileName lineNumber: (NSInteger)line description: (NSString*)format,... GS_NORETURN_METHOD; - (void) handleFailureInMethod: (SEL)aSelector object: object file: (NSString*)fileName lineNumber: (NSInteger)line description: (NSString*)format,... GS_NORETURN_METHOD; @end GS_EXPORT NSString *const NSAssertionHandlerKey; #ifdef NS_BLOCK_ASSERTIONS #define NSAssert(condition, desc, args...) #define NSCAssert(condition, desc, args...) #else /** Used in an ObjC method body.
* See [NSAssertionHandler] for details.
* When condition is false, raise an exception using desc and args. */ #define NSAssert(condition, desc, args...) \ do { \ if (!(condition)) { \ [[NSAssertionHandler currentHandler] \ handleFailureInMethod: _cmd \ object: self \ file: [NSString stringWithUTF8String: __FILE__] \ lineNumber: __LINE__ \ description: (desc) , ## args]; \ } \ } while(0) /** Used in plain C code (not in an ObjC method body).
* See [NSAssertionHandler] for details.
* When condition is false, raise an exception using desc */ #define NSCAssert(condition, desc, args...) \ do { \ if (!(condition)) { \ [[NSAssertionHandler currentHandler] \ handleFailureInFunction: [NSString stringWithUTF8String: \ __PRETTY_FUNCTION__] \ file: [NSString stringWithUTF8String: __FILE__] \ lineNumber: __LINE__ \ description: (desc) , ## args]; \ } \ } while(0) #endif /** Used in an ObjC method body (obsolete ... use NSAssert).
* See [NSAssertionHandler] for details.
* When condition is false, raise an exception using desc and arg1, arg2, * arg3, arg4, arg5 */ #define NSAssert5(condition, desc, arg1, arg2, arg3, arg4, arg5) \ NSAssert((condition), (desc), (arg1), (arg2), (arg3), (arg4), (arg5)) /** Used in an ObjC method body (obsolete ... use NSAssert).
* See [NSAssertionHandler] for details.
* When condition is false, raise an exception using desc and arg1, arg2, * arg3, arg4 */ #define NSAssert4(condition, desc, arg1, arg2, arg3, arg4) \ NSAssert((condition), (desc), (arg1), (arg2), (arg3), (arg4)) /** Used in an ObjC method body (obsolete ... use NSAssert).
* See [NSAssertionHandler] for details.
* When condition is false, raise an exception using desc and arg1, arg2, * arg3 */ #define NSAssert3(condition, desc, arg1, arg2, arg3) \ NSAssert((condition), (desc), (arg1), (arg2), (arg3)) /** Used in an ObjC method body (obsolete ... use NSAssert).
* See [NSAssertionHandler] for details.
* When condition is false, raise an exception using desc and arg1, arg2 */ #define NSAssert2(condition, desc, arg1, arg2) \ NSAssert((condition), (desc), (arg1), (arg2)) /** Used in an ObjC method body (obsolete ... use NSAssert).
* See [NSAssertionHandler] for details.
* When condition is false, raise an exception using desc and arg1 */ #define NSAssert1(condition, desc, arg1) \ NSAssert((condition), (desc), (arg1)) /** Used in an ObjC method body.
* See [NSAssertionHandler] for details.
* When condition is false, raise an exception saying that an invalid * parameter was supplied to the method. */ #define NSParameterAssert(condition) \ NSAssert((condition), @"Invalid parameter not satisfying: %s", #condition) /** Obsolete ... use NSCAssert().
* See [NSAssertionHandler] for details.
* When condition is false, raise an exception using desc and arg1, arg2, * arg3, arg4, arg5 */ #define NSCAssert5(condition, desc, arg1, arg2, arg3, arg4, arg5) \ NSCAssert((condition), (desc), (arg1), (arg2), (arg3), (arg4), (arg5)) /** Obsolete ... use NSCAssert().
* See [NSAssertionHandler] for details.
* When condition is false, raise an exception using desc and arg1, arg2, * arg3, arg4 */ #define NSCAssert4(condition, desc, arg1, arg2, arg3, arg4) \ NSCAssert((condition), (desc), (arg1), (arg2), (arg3), (arg4)) /** Obsolete ... use NSCAssert().
* See [NSAssertionHandler] for details.
* When condition is false, raise an exception using desc and arg1, arg2, * arg3 */ #define NSCAssert3(condition, desc, arg1, arg2, arg3) \ NSCAssert((condition), (desc), (arg1), (arg2), (arg3)) /** Obsolete ... use NSCAssert().
* See [NSAssertionHandler] for details.
* When condition is false, raise an exception using desc and arg1, arg2 */ #define NSCAssert2(condition, desc, arg1, arg2) \ NSCAssert((condition), (desc), (arg1), (arg2)) /** Obsolete ... use NSCAssert().
* See [NSAssertionHandler] for details.
* When condition is false, raise an exception using desc and arg1 */ #define NSCAssert1(condition, desc, arg1) \ NSCAssert((condition), (desc), (arg1)) /** Used in plain C code (not in an ObjC method body).
* See [NSAssertionHandler] for details.
* When condition is false, raise an exception saying that an invalid * parameter was supplied to the method. */ #define NSCParameterAssert(condition) \ NSCAssert((condition), @"Invalid parameter not satisfying: %s", #condition) #if defined(__cplusplus) } #endif #endif /* __NSException_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSExpression.h000066400000000000000000000046031435650067400224470ustar00rootroot00000000000000/* Interface for NSExpression for GNUStep Copyright (C) 2005 Free Software Foundation, Inc. Written by: Dr. H. Nikolaus Schaller Created: 2005 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSExpression_h_GNUSTEP_BASE_INCLUDE #define __NSExpression_h_GNUSTEP_BASE_INCLUDE #import #if OS_API_VERSION(MAC_OS_X_VERSION_10_4, GS_API_LATEST) #import #if defined(__cplusplus) extern "C" { #endif @class NSArray; @class NSMutableDictionary; @class NSString; enum { NSConstantValueExpressionType=0, NSEvaluatedObjectExpressionType, NSVariableExpressionType, NSKeyPathExpressionType, NSFunctionExpressionType, NSKeyPathCompositionExpressionType }; typedef NSUInteger NSExpressionType; GS_EXPORT_CLASS @interface NSExpression : NSObject { #if GS_EXPOSE(NSExpression) NSExpressionType _type; #endif } + (NSExpression *) expressionForConstantValue: (id)obj; + (NSExpression *) expressionForEvaluatedObject; + (NSExpression *) expressionForFunction: (NSString *)name arguments: (NSArray *)args; + (NSExpression *) expressionForKeyPath: (NSString *)path; + (NSExpression *) expressionForVariable: (NSString *)string; - (NSArray *) arguments; - (id) constantValue; - (NSExpressionType) expressionType; - (id) expressionValueWithObject: (id)object context: (NSMutableDictionary *)context; - (NSString *) function; - (id) initWithExpressionType: (NSExpressionType) type; - (NSString *) keyPath; - (NSExpression *) operand; - (NSString *) variable; @end #if defined(__cplusplus) } #endif #endif /* 100400 */ #endif /* __NSExpression_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSExtensionContext.h000066400000000000000000000044301435650067400236270ustar00rootroot00000000000000/* Definition of class NSExtensionContext Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory Casamento Date: Sun Nov 10 03:59:38 EST 2019 This file is part of the GNUstep Library. 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 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 USA. */ #ifndef _NSExtensionContext_h_GNUSTEP_BASE_INCLUDE #define _NSExtensionContext_h_GNUSTEP_BASE_INCLUDE #include #if OS_API_VERSION(MAC_OS_X_VERSION_10_10, GS_API_LATEST) #if defined(__cplusplus) extern "C" { #endif DEFINE_BLOCK_TYPE(GSExtensionContextReturningItemsCompletionHandler, void, BOOL); DEFINE_BLOCK_TYPE(GSOpenURLCompletionHandler, void, BOOL); @class NSError, NSArray, NSURL; GS_EXPORT_CLASS @interface NSExtensionContext : NSObject { NSArray *_inputItems; } - (void) setInputItems: (NSArray *)inputItems; - (NSArray *) inputItems; - (void)completeRequestReturningItems: (NSArray *)items completionHandler: (GSExtensionContextReturningItemsCompletionHandler)completionHandler; - (void)cancelRequestWithError:(NSError *)error; - (void)openURL: (NSURL *)URL completionHandler: (GSOpenURLCompletionHandler)completionHandler; @end GS_EXPORT NSString* const NSExtensionItemsAndErrorsKey; GS_EXPORT NSString* const NSExtensionHostWillEnterForegroundNotification; GS_EXPORT NSString* const NSExtensionHostDidEnterBackgroundNotification; GS_EXPORT NSString* const NSExtensionHostWillResignActiveNotification; GS_EXPORT NSString* const NSExtensionHostDidBecomeActiveNotification; #if defined(__cplusplus) } #endif #endif /* GS_API_MACOSX */ #endif /* _NSExtensionContext_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSExtensionItem.h000066400000000000000000000041521435650067400231020ustar00rootroot00000000000000/* Definition of class NSExtensionItem Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory Casamento Date: Sun Nov 10 03:59:46 EST 2019 This file is part of the GNUstep Library. 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 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 USA. */ #ifndef _NSExtensionItem_h_GNUSTEP_BASE_INCLUDE #define _NSExtensionItem_h_GNUSTEP_BASE_INCLUDE #include #if OS_API_VERSION(MAC_OS_X_VERSION_10_10, GS_API_LATEST) #if defined(__cplusplus) extern "C" { #endif @class NSAttributedString, NSArray, NSDictionary; GS_EXPORT_CLASS @interface NSExtensionItem : NSObject { NSAttributedString *_attributedTitle; NSAttributedString *_attributedContentText; NSArray *_attachments; NSDictionary *_userInfo; } - (NSAttributedString *) attributedTitle; - (void) setAttributedTitle: (NSAttributedString *)string; - (NSAttributedString *) attributedContentText; - (void) setAttributedContentText: (NSAttributedString *)string; - (NSArray *) attachments; - (void) setAttachments: (NSArray *)attachments; - (NSDictionary *) userInfo; - (void) setUserInfo: (NSDictionary *) userInfo; @end GS_EXPORT NSString * const NSExtensionItemAttributedTitleKey; GS_EXPORT NSString * const NSExtensionItemAttributedContentTextKey; GS_EXPORT NSString * const NSExtensionItemAttachmentsKey; #if defined(__cplusplus) } #endif #endif /* GS_API_MACOSX */ #endif /* _NSExtensionItem_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSExtensionRequestHandling.h000066400000000000000000000027251435650067400253050ustar00rootroot00000000000000/* Definition of class NSExtensionRequestHandling Copyright (C) 2019 Free Software Foundation, Inc. By: heron Date: Sun Nov 10 04:00:05 EST 2019 This file is part of the GNUstep Library. 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 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 USA. */ #ifndef _NSExtensionRequestHandling_h_GNUSTEP_BASE_INCLUDE #define _NSExtensionRequestHandling_h_GNUSTEP_BASE_INCLUDE #include #if OS_API_VERSION(MAC_OS_X_VERSION_10_0, GS_API_LATEST) #if defined(__cplusplus) extern "C" { #endif @class NSExtensionContext; @protocol NSExtensionRequestHandling - (void) beginRequestWithExtensionContext: (NSExtensionContext *)context; @end #if defined(__cplusplus) } #endif #endif /* GS_API_MACOSX */ #endif /* _NSExtensionRequestHandling_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSFileCoordinator.h000066400000000000000000000122471435650067400233760ustar00rootroot00000000000000/* Definition of class NSFileCoordinator Copyright (C) 2019 Free Software Foundation, Inc. Implemented by: Gregory Casamento Date: Sep 2019 Original File by: Daniel Ferreira This file is part of the GNUstep Library. 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 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 USA. */ #ifndef __NSFileCoordinator_h_GNUSTEP_BASE_INCLUDE #define __NSFileCoordinator_h_GNUSTEP_BASE_INCLUDE #import #import #if OS_API_VERSION(MAC_OS_X_VERSION_10_7,GS_API_LATEST) @class NSArray, NSError, NSMutableDictionary, NSOperationQueue, NSSet; @protocol NSFilePresenter; enum { NSFileCoordinatorReadingWithoutChanges = 1 << 0, NSFileCoordinatorReadingResolvesSymbolicLink = 1 << 1, NSFileCoordinatorReadingImmediatelyAvailableMetadataOnly = 1 << 2, NSFileCoordinatorReadingForUploading = 1 << 3, }; typedef NSUInteger NSFileCoordinatorReadingOptions; enum { NSFileCoordinatorWritingForDeleting = 1 << 0, NSFileCoordinatorWritingForMoving = 1 << 1, NSFileCoordinatorWritingForMerging = 1 << 2, NSFileCoordinatorWritingForReplacing = 1 << 3, NSFileCoordinatorWritingContentIndependentMetadataOnly = 1 << 4, }; typedef NSUInteger NSFileCoordinatorWritingOptions; GS_EXPORT_CLASS @interface NSFileAccessIntent : NSObject { NSURL *_url; BOOL _isRead; NSInteger _options; } + (instancetype) readingIntentWithURL: (NSURL *)url options: (NSFileCoordinatorReadingOptions)options; + (instancetype) writingIntentWithURL: (NSURL *)url options: (NSFileCoordinatorWritingOptions)options; - (NSURL *) URL; @end DEFINE_BLOCK_TYPE(GSNoEscapeReadWriteHandler, void, NSURL*, NSURL*); DEFINE_BLOCK_TYPE(GSNoEscapeNewURLHandler, void, NSURL*); DEFINE_BLOCK_TYPE(GSAccessorCallbackHandler, void, NSError*); DEFINE_BLOCK_TYPE(GSDualWriteURLCallbackHandler, void, NSURL*, NSURL*); DEFINE_BLOCK_TYPE_NO_ARGS(GSBatchAccessorCompletionHandler, void); DEFINE_BLOCK_TYPE(GSBatchAccessorCompositeBlock, void, GSBatchAccessorCompletionHandler); GS_EXPORT_CLASS @interface NSFileCoordinator : NSObject { id _purposeIdentifier; BOOL _isCancelled; } + (NSArray *) filePresenters; - (NSString *) purposeIdentifier; - (void) setPurposeIdentifier: (NSString *)ident; // copy - (void)cancel; - (void)coordinateAccessWithIntents: (NSArray *)intents queue: (NSOperationQueue *)queue byAccessor: (GSAccessorCallbackHandler)accessor; - (void)coordinateReadingItemAtURL: (NSURL *)readingURL options: (NSFileCoordinatorReadingOptions)readingOptions writingItemAtURL: (NSURL *)writingURL options: (NSFileCoordinatorWritingOptions)writingOptions error: (NSError **)outError byAccessor: (GSNoEscapeReadWriteHandler)readerWriter; - (void)coordinateReadingItemAtURL: (NSURL *)url options: (NSFileCoordinatorReadingOptions)options error: (NSError **)outError byAccessor: (GSNoEscapeNewURLHandler)reader; - (void)coordinateWritingItemAtURL: (NSURL *)url options: (NSFileCoordinatorWritingOptions)options error:(NSError **)outError byAccessor: (GSNoEscapeNewURLHandler)writer; - (void)coordinateWritingItemAtURL: (NSURL *)url1 options: (NSFileCoordinatorWritingOptions)options1 writingItemAtURL: (NSURL *)url2 options: (NSFileCoordinatorWritingOptions)options2 error: (NSError **)outError byAccessor: (GSDualWriteURLCallbackHandler)writer; - (void)itemAtURL: (NSURL *)oldURL didMoveToURL: (NSURL *)newURL; - (void)itemAtURL: (NSURL *)oldURL willMoveToURL: (NSURL *)newURL; - (void)itemAtURL: (NSURL *)url didChangeUbiquityAttributes: (NSSet *)attributes; - (void)prepareForReadingItemsAtURLs: (NSArray *)readingURLs options: (NSFileCoordinatorReadingOptions)readingOptions writingItemsAtURLs: (NSArray *)writingURLs options: (NSFileCoordinatorWritingOptions)writingOptions error: (NSError **)outError byAccessor: (GSBatchAccessorCompositeBlock)batchAccessor; @end #endif #endif gnustep-base-1.29.0/Headers/Foundation/NSFileHandle.h000066400000000000000000000415311435650067400223040ustar00rootroot00000000000000/** Interface for NSFileHandle for GNUStep Copyright (C) 1997 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 1997 This file is part of the GNUstep Base Library. 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 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 USA. AutogsdocSource: NSFileHandle.m AutogsdocSource: NSPipe.m */ #ifndef __NSFileHandle_h_GNUSTEP_BASE_INCLUDE #define __NSFileHandle_h_GNUSTEP_BASE_INCLUDE #import #import #import #if defined(__cplusplus) extern "C" { #endif @class NSData; @class NSError; @class NSString; @class NSURL; GS_EXPORT_CLASS @interface NSFileHandle : NSObject // Allocating and Initializing a FileHandle Object + (instancetype) fileHandleForReadingAtPath: (NSString*)path; + (instancetype) fileHandleForWritingAtPath: (NSString*)path; + (instancetype) fileHandleForUpdatingAtPath: (NSString*)path; + (instancetype) fileHandleWithStandardError; + (instancetype) fileHandleWithStandardInput; + (instancetype) fileHandleWithStandardOutput; + (instancetype) fileHandleWithNullDevice; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) + (instancetype) fileHandleForReadingFromURL: (NSURL*)url error:(NSError**)error; + (instancetype) fileHandleForWritingToURL: (NSURL*)url error:(NSError**)error; + (instancetype) fileHandleForUpdatingURL: (NSURL*)url error:(NSError**)error; #endif - (id) initWithFileDescriptor: (int)desc; - (id) initWithFileDescriptor: (int)desc closeOnDealloc: (BOOL)flag; - (id) initWithNativeHandle: (void*)hdl; - (id) initWithNativeHandle: (void*)hdl closeOnDealloc: (BOOL)flag; // Returning file handles - (int) fileDescriptor; - (void*) nativeHandle; // Synchronous I/O operations - (NSData*) availableData; - (NSData*) readDataToEndOfFile; - (NSData*) readDataOfLength: (unsigned int)len; - (void) writeData: (NSData*)item; // Asynchronous I/O operations - (void) acceptConnectionInBackgroundAndNotify; - (void) acceptConnectionInBackgroundAndNotifyForModes: (NSArray*)modes; - (void) readInBackgroundAndNotify; - (void) readInBackgroundAndNotifyForModes: (NSArray*)modes; - (void) readToEndOfFileInBackgroundAndNotify; - (void) readToEndOfFileInBackgroundAndNotifyForModes: (NSArray*)modes; - (void) waitForDataInBackgroundAndNotify; - (void) waitForDataInBackgroundAndNotifyForModes: (NSArray*)modes; // Seeking within a file - (unsigned long long) offsetInFile; - (unsigned long long) seekToEndOfFile; - (void) seekToFileOffset: (unsigned long long)pos; // Operations on file - (void) closeFile; - (void) synchronizeFile; - (void) truncateFileAtOffset: (unsigned long long)pos; @end // Notification names. /** * Posted when one of the [NSFileHandle] methods * acceptConnectionInBackground... succeeds and has connected to a * stream-type socket in another process. The notification's * userInfo dictionary will contain the [NSFileHandle] for the near * end of the connection (associated to the key * 'NSFileHandleNotificationFileHandleItem'). */ GS_EXPORT NSString * const NSFileHandleConnectionAcceptedNotification; /** * Posted when one of the [NSFileHandle] methods * waitForDataInBackground... has been informed that data is * available. The receiving [NSFileHandle] is passed in the notification. */ GS_EXPORT NSString * const NSFileHandleDataAvailableNotification; /** * Posted when one of the [NSFileHandle] methods readDataInBackground... has * consumed data. The receiving [NSFileHandle] is passed in the * notification's userInfo dictionary associated to the key * 'NSFileHandleNotificationDataItem'. */ GS_EXPORT NSString * const NSFileHandleReadCompletionNotification; /** * Posted when one of the [NSFileHandle] methods * readToEndOfFileInBackground... has finished. The receiving * [NSFileHandle] is passed in the notification's userInfo dictionary * associated to the key 'NSFileHandleNotificationDataItem'. */ GS_EXPORT NSString * const NSFileHandleReadToEndOfFileCompletionNotification; // Keys for accessing userInfo dictionary in notification handlers. /** * Dictionary key for [NSFileHandle] notifications used to access an * [NSData] object containing received data. */ GS_EXPORT NSString * const NSFileHandleNotificationDataItem; /** * Dictionary key for [NSFileHandle] notifications used to mark the * [NSFileHandle] that has established a stream-socket connection. */ GS_EXPORT NSString * const NSFileHandleNotificationFileHandleItem; /** * Dictionary key for [NSFileHandle] notifications postable to certain run * loop modes, associated to an NSArray containing the modes allowed. */ GS_EXPORT NSString * const NSFileHandleNotificationMonitorModes; // Exceptions /** * Exception raised when attempts to read from an [NSFileHandle] channel fail. */ GS_EXPORT NSString * const NSFileHandleOperationException; GS_EXPORT_CLASS @interface NSPipe : NSObject { #if GS_EXPOSE(NSPipe) @private NSFileHandle *_readHandle; NSFileHandle *_writeHandle; #endif #if GS_NONFRAGILE #else /* Pointer to private additional data used to avoid breaking ABI * when we don't have the non-fragile ABI available. * Use this mechanism rather than changing the instance variable * layout (see Source/GSInternal.h for details). */ @private id _internal GS_UNUSED_IVAR; #endif } + (id) pipe; - (NSFileHandle*) fileHandleForReading; - (NSFileHandle*) fileHandleForWriting; @end #if OS_API_VERSION(GS_API_NONE, GS_API_NONE) // GNUstep class extensions @interface NSFileHandle (GNUstepExtensions) + (id) fileHandleAsServerAtAddress: (NSString*)address service: (NSString*)service protocol: (NSString*)protocol; + (id) fileHandleAsClientAtAddress: (NSString*)address service: (NSString*)service protocol: (NSString*)protocol; + (id) fileHandleAsClientInBackgroundAtAddress: (NSString*)address service: (NSString*)service protocol: (NSString*)protocol; + (id) fileHandleAsClientInBackgroundAtAddress: (NSString*)address service: (NSString*)service protocol: (NSString*)protocol forModes: (NSArray*)modes; - (void) readDataInBackgroundAndNotifyLength: (unsigned)len; - (void) readDataInBackgroundAndNotifyLength: (unsigned)len forModes: (NSArray*)modes; - (BOOL) readInProgress; - (NSString*) socketAddress; - (NSString*) socketLocalAddress; - (NSString*) socketLocalService; - (NSString*) socketService; - (NSString*) socketProtocol; - (BOOL) useCompression; - (void) writeInBackgroundAndNotify: (NSData*)item forModes: (NSArray*)modes; - (void) writeInBackgroundAndNotify: (NSData*)item; - (BOOL) writeInProgress; @end /** * Where OpenSSL is available, you can use the subclass returned by +sslClass * to handle SSL connections.
* The -sslAccept method is used to do SSL handshake and start an * encrypted session on a channel where the connection was initiated * from the far end.
* The -sslConnect method is used to do SSL handshake and start an * encrypted session on a channel where the connection was initiated * from the near end.
* The -sslDisconnect method is used to end the encrypted session. * The -sslSetCertificate:privateKey:PEMpasswd: method is used to * establish a client certificate before starting an encrypted session.
* NB. Some of these methods may block while performing I/O on the network * connection, (though they should run the current runloop while doing so) * so you should structure your code to handle that. In particular, if you * are writing a server application, you should initiate a background accept * to allow another incoming connection before you perform an * -sslAccept on a connection you have just accepted. */ @interface NSFileHandle (GNUstepTLS) /** Returns the class to handle ssl enabled connections. */ + (Class) sslClass; /** Repeatedly attempt an incoming handshake for up to 30 seconds or until * the handshake completes. */ - (BOOL) sslAccept; /** Repeatedly attempt an outgoing handshake for up to 30 seconds or until * the handshake completes. */ - (BOOL) sslConnect; /** * Shuts down the SSL connection to the system that the handle is talking to. */ - (void) sslDisconnect; /** * Make a non-blocking handshake attempt. Calls to this method should be * repeated until the method returns YES indicating that the handshake * completed. If the method returns YES indicating completion of the * handshake, the result indicates whether the handshake succeeded in * establishing a connection or not.
* The default implementation simply returns YES and sets result to NO.
* This is implemented by an SSL handling subclass to perform real work. */ - (BOOL) sslHandshakeEstablished: (BOOL*)result outgoing: (BOOL)isOutgoing; /** If the session verified a certificate from the remote end, returns the * name of the certificate issuer in the form "C=xxxx,O=yyyy,CN=zzzz" as * described in RFC2253. Otherwise returns nil. */ - (NSString*) sslIssuer; /** If the session verified a certificate from the remote end, returns the * name of the certificate owner in the form "C=xxxx,O=yyyy,CN=zzzz" as * described in RFC2253. Otherwise returns nil. */ - (NSString*) sslOwner; /** Deprecated ... use -sslSetOptions: instead */ - (void) sslSetCertificate: (NSString*)certFile privateKey: (NSString*)privateKey PEMpasswd: (NSString*)PEMpasswd; /** * Sets options to be used to configure this channel before the handshake.
* Returns nil on success, or an error message if some options could not * be set.
* You may use the same options as property settings with the GNUstep * implementation of NSStream.
* Expects key value pairs with the following names/meanings: * * GSTLSCAFile * A string identifying the full path to the file containing any * trusted certificate authorities to be used when verifying a certificate * presented by the remote end of a connection. * * GSTLSCertificateFile * The path to a PEM encoded certificate used to identify this end * of the connection. This option must be set for handing an * incoming connection, but is optional for outgoing connections.
* This must be used in conjunction with GSTLSCertificateKeyFile. *
* GSTLSCertificateKeyFile * The path to a PEM encoded key used to unlock the certificate * file for the connection. The key in the file may or may not be * encrypted, but if it is encrypted you must specify * GSTLSCertificateKeyPassword. * * GSTLSCertificateKeyPassword * A string to be used as the password to decrypt a key which was * specified using GSTLSKeyPassword. * * GSTLSDebug * A boolean specifying whether diagnostic debug is to be enabled * to log information about a connection where the handshake fails.
*
* GSTLSIssuers * An array of distinguished names (in RFC4514 format) listing the * permitted issuers of the remote certificate. If this is present and the * issuer of the remote certificate is not in the array, the connection * handshake is failed. * * GSTLSOwners * An array of distinguished names (in RFC4514 format) listing the * permitted owners/subjects of the remote certificate. If this is present * and the owner/subject of the remote certificate is not in the array, the * connection handshake is failed. * * GSTLSPriority * A GNUTLS priority string describing the ciphers etc which may be * used for the connection. In addition the string may be one of * SSLv3, or TLSv1 to use the appropriate general settings * for negotiating a connection of the specified type. * * GSTLSRemoteHosts * A comma delimited list of host names to be allowed when verifying * the certificate of the host we are connecting to.
* If this is not specified, all the names provided by NSHost are used. *
* GSTLSRevokeFile * The full path of a file containing certificate revocation * information for certificates issued by our trusted authorites but * no longer valid. * * GSTLSServerName * By default the TLS layer when making an HTTPS request sets the * 'Server Name Indication' (SNI) to be the name of the host in the URL * that is being fetched.
* This option allows the SNI to be set for other connections and permits * overriding of the default behavior for HTTPS requests. Setting the * value of GSTLSServerName to an empty string will prevent the SNI from * being sent in the TLS handshake (this is sometimes desirable to prevent * information leakage; the SNI information is sent unencrypted).
* Some web servers require SNI in order to tell what hostname an HTTPS * request is for and decide which certificate to present to the client. *
* GSTLSVerify * A boolean specifying whether we should require the remote end to * supply a valid certificate in order to establish an encrypted connection. * *
*/ - (NSString*) sslSetOptions: (NSDictionary*)options; /** Sets the known (cached) data content for the specified file name.
* Calling this with a nil data object will remove any existing value * from the cache.
* You may use this method to control what data is used for specified * file names when those file names are used as a result of SSL/TLS * options being set for a file handle or stream. */ + (void) setData: (NSData*)data forTLSFile: (NSString*)fileName; @end /** Dictionary key for the path to a PEM encoded certificate authority * file. */ GS_EXPORT NSString * const GSTLSCAFile; /** Dictionary key for the path to a PEM encoded certificate used * to identify this end of a connection. */ GS_EXPORT NSString * const GSTLSCertificateFile; /** Dictionary key for the path to a PEM encoded private key used * to unlock the certificate used by this end of a connection. */ GS_EXPORT NSString * const GSTLSCertificateKeyFile; /** Dictionary key for the password used to decrypt the key file used * to unlock the certificate used by this end of a connection. */ GS_EXPORT NSString * const GSTLSCertificateKeyPassword; /** Dictionary key for a boolean to enable TLS debug for a session. */ GS_EXPORT NSString * const GSTLSDebug; /** Dictionary key for a GNUTLS priority setting for a session. */ GS_EXPORT NSString * const GSTLSPriority; /** Dictionary key for an array of issuers to use in certificate verification. */ GS_EXPORT NSString * const GSTLSIssuers; /** Dictionary key for an array of owners to use in certificate verification. */ GS_EXPORT NSString * const GSTLSOwners; /** Dictionary key for a list of hosts to use in certificate verification. */ GS_EXPORT NSString * const GSTLSRemoteHosts; /** Dictionary key for the path to a PEM encoded certificate revocation * file. */ GS_EXPORT NSString * const GSTLSRevokeFile; /** Dictionary key for the value controlling the Server Name Indication * (SNI) sent as part of the TLS handshake. */ GS_EXPORT NSString * const GSTLSServerName; /** Dictionary key for a boolean to enable certificate verification. */ GS_EXPORT NSString * const GSTLSVerify; // GNUstep Notification names. /** * Notification posted when an asynchronous [NSFileHandle] connection * attempt (to an FTP, HTTP, or other internet server) has succeeded. */ GS_EXPORT NSString * const GSFileHandleConnectCompletionNotification; /** * Notification posted when an asynchronous [NSFileHandle] write * operation (to an FTP, HTTP, or other internet server) has succeeded. */ GS_EXPORT NSString * const GSFileHandleWriteCompletionNotification; /** * Message describing error in asynchronous [NSFileHandle] accept,read,write * operation. */ GS_EXPORT NSString * const GSFileHandleNotificationError; #endif #if defined(__cplusplus) } #endif #if !NO_GNUSTEP && !defined(GNUSTEP_BASE_INTERNAL) #import #endif #endif /* __NSFileHandle_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSFileManager.h000066400000000000000000000730741435650067400224720ustar00rootroot00000000000000/** NSFileManager.h Copyright (C) 1997,1999-2005 Free Software Foundation, Inc. Author: Mircea Oancea Author: Ovidiu Predescu Date: Feb 1997 This file is part of the GNUstep Base Library. 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 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 USA. File management
Path handling

The rules for path handling depend on the value in the GNUSTEP_PATH_HANDLING environment variable and, to some extent, on the platform on which the program is running.
The understood values of GNUSTEP_PATH_HANDLING are unix and windows. If GNUSTEP_PATH_HANDLING is any other value (or has not been set), GNUstep interprets this as meaning it should try to do-the-right-thing
In the default mode of operation the system is very tolerant of paths and allows you to work with both unix and windows style paths. The consequences of this are apparent in the path handling methods of [NSString] rather than in [NSFileManager].

unix

On all Unix platforms, Path components are separated by slashes and file names may contain any character other than slash.
The file names . and .. are special cases meaning current directory and the parent of the current directory respectively.
Multiple adjacent slash characters are treated as a single separator.

Here are various examples: / An absolute path to the root directory. /etc/motd An absolute path to the file named motd in the subdirectory etc of the root directory. .. A relative path to the parent of the current directory. program.m A relative path to the file program.m in the current directory. Source/program.m A relative path to the file program.m in the subdirectory Source of the current directory. ../GNUmakefile A relative path to the file GNUmakefile in the directory above the current directory.
windows

On Microsoft Windows the native paths may be either UNC or drive-relative, so GNUstep supports both.
Either or both slash (/) and backslash (\) may be used as separators for path components in either type of name.
UNC paths follow the general form //host/share/path/file, but must at least contain the host and share parts, i.e. //host/share is a UNC path, but //host is not
Drive-relative names consist of an optional drive specifier (consisting of a single letter followed by a single colon) followed by an absolute or relative path.
In both forms, the names . and .. are refer to the current directory and the parent directory as in unix paths.

Here are various examples: //host/share/file An absolute UNC path to a file called file in the top directory of the export point share on host. C: A relative path to the current directory on drive C. C:program.m A relative path to the file program.m on drive C. C:\program.m An absolute path to the file program.m in the top level directory on drive C. /Source\program.m A drive-relative path to program.m in the directory Source on the current drive. \\name A drive-relative path to name in the top level directory on the current drive. The '\\' is treated as a single backslash as this is not a UNC name (there must be both a host and a share part in a UNC name).
gnustep

In the default mode, GNUstep handles both unix and windows paths so it treats both slash (/) and backslash (\) as separators and understands the windows UNC and drive relative path roots.
However, it treats any path beginning with a slash (/) as an absolute path if running on a unix system.

Portability

Attempting to pass absolute paths between applications working on different systems is fraught with difficulty ... just don't do it.
Where paths need to be passed around (eg. in property lists or archives) you should pass relative paths and use a standard mechanism to construct an absolute path in the receiving application, for instance, appending the relative path to the home directory of a user.

Even using relative paths you should take care ... Use only the slash (/) as a path separator, not backslash (\). Never use a backslash (\) in a file name. Avoid colons in file names. Use no more than three letters in a path extension. Remember that, while GNUstep will manipulate both windows and unix paths, any path actually used to reference a file or directory must be valid on the local system.
Tilde substitution

GNUstep handles substitution of tilde (~) as follows:
If a path is just ~ or begins ~/ then the value returned by NSHomeDirectory() is substituted for the tilde.
If a path is of the form ~name or begins with a string like ~name/ then name is used as the argument to NSHomeDirectoryForUser() and the return value from that method (if non-nil) is used to replace the tilde.

*/ #ifndef __NSFileManager_h_GNUSTEP_BASE_INCLUDE #define __NSFileManager_h_GNUSTEP_BASE_INCLUDE #import #import #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) #import #import #import #if defined(__cplusplus) extern "C" { #endif @class NSNumber; @class NSString; @class NSData; @class NSDate; @class NSArray; @class NSMutableArray; @class NSEnumerator; @class NSDirectoryEnumerator; @class NSError; @class NSURL; @protocol NSFileManagerDelegate; /* MacOS-X defines OSType as a 32bit unsigned integer. */ #ifndef OSTYPE_DECLARED typedef uint32_t OSType; #define OSTYPE_DECLARED #endif DEFINE_BLOCK_TYPE(GSDirEnumErrorHandler, BOOL, NSURL*, NSError*); enum _NSDirectoryEnumerationOptions { NSDirectoryEnumerationSkipsSubdirectoryDescendants = 1L << 0, NSDirectoryEnumerationSkipsPackageDescendants = 1L << 1, NSDirectoryEnumerationSkipsHiddenFiles = 1L << 2 }; typedef NSUInteger NSDirectoryEnumerationOptions; GS_EXPORT_CLASS @interface NSFileManager : NSObject { #if GS_EXPOSE(NSFileManager) @private id _delegate; NSString *_lastError; #endif #if GS_NONFRAGILE #else /* Pointer to private additional data used to avoid breaking ABI * when we don't have the non-fragile ABI available. * Use this mechanism rather than changing the instance variable * layout (see Source/GSInternal.h for details). */ @private id _internal GS_UNUSED_IVAR; #endif } /** * Returns a shared default file manager which may be used throughout an * application. */ + (NSFileManager*) defaultManager; #if OS_API_VERSION(MAC_OS_X_VERSION_10_5, GS_API_LATEST) #if GS_HAS_DECLARED_PROPERTIES @property (assign) id delegate; #else - (id) delegate; - (void) setDelegate: (id)delegate; #endif #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_5, GS_API_LATEST) - (NSDictionary *) attributesOfItemAtPath: (NSString*)path error: (NSError**)error; /** * Copies the item specified by the src path to the * location specified by the dst path. If the src is a directory, * it is copied recursively with all of its contents.
* Errors are returned in the error variable. * Returns YES on success, NO otherwise. */ - (BOOL) copyItemAtPath: (NSString*)src toPath: (NSString*)dst error: (NSError**)error; /** * Moves a file or directory specified by src to * its destination specified by dst, errors are * returned in error.
* Returns YES on success, NO otherwise. */ - (BOOL) moveItemAtPath: (NSString*)src toPath: (NSString*)dst error: (NSError**)error; /** * Removes the file or directory specified by the path * to be removed. If the path points to a directory, * the directory is deleted recursively.
* Returns YES on success, otherwise NO. */ - (BOOL) removeItemAtPath: (NSString*)path error: (NSError**)error; /** * Copies the a file or directory specified by the src URL to the * location specified by the dst URL. If the src is a directory, * it is copied recursively with all of its contents.
* Errors are returned in the error variable. * Returns YES on success, NO otherwise. */ - (BOOL) copyItemAtURL: (NSURL*)src toURL: (NSURL*)dst error: (NSError**)error; /** * Moves a file or directory specified by src to * its destination specified by dst, errors are * returned in error.
* Returns YES on success, NO otherwise. */ - (BOOL) moveItemAtURL: (NSURL*)src toURL: (NSURL*)dst error: (NSError**)error; /** * Removes the file or directory specified by the url * to be removed. If the url points to a directory, * the directory is deleted recursively.
* Returns YES on success, otherwise NO. */ - (BOOL) removeItemAtURL: (NSURL*)url error: (NSError**)error; /** * Creates a symbolic link at the path * that point to the destination path.
* Returns YES on success, otherwise NO. */ - (BOOL) createSymbolicLinkAtPath: (NSString*)path withDestinationPath: (NSString*)destPath error: (NSError**)error; - (BOOL) setAttributes:(NSDictionary *)attributes ofItemAtPath:(NSString *)path error:(NSError **)error; #endif /** * Changes the current directory used for all subsequent operations.
* All non-absolute paths are interpreted relative to this directory.
* The current directory is set on a per-task basis, so the current * directory for other file manager instances will also be changed * by this method. */ - (BOOL) changeCurrentDirectoryPath: (NSString*)path; - (BOOL) changeFileAttributes: (NSDictionary*)attributes atPath: (NSString*)path; - (NSArray*) componentsToDisplayForPath: (NSString*)path; - (NSData*) contentsAtPath: (NSString*)path; - (BOOL) contentsEqualAtPath: (NSString*)path1 andPath: (NSString*)path2; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) /** * Returns an array of NSURL of the contents of the specified directory.
* The listing is shallow and does not recurse into subdirectories. * The special files '.' and '..' are excluded but it can return * hidden files.
* The only mask option supported is * NSDirectoryEnumerationSkipsHiddenFiles.
* The current implementation handles only files and property keys are ignored. */ - (NSArray*) contentsOfDirectoryAtURL: (NSURL*)url includingPropertiesForKeys: (NSArray*)keys options: (NSDirectoryEnumerationOptions)mask error: (NSError **)error; /** * Locates and, optionally, creates the specified common directory in * domain */ - (NSURL *)URLForDirectory: (NSSearchPathDirectory)directory inDomain: (NSSearchPathDomainMask)domain appropriateForURL: (NSURL *)url create: (BOOL)shouldCreate error: (NSError **)error; /** * Enumerate over the contents of a directory. */ - (NSDirectoryEnumerator *)enumeratorAtURL: (NSURL *)url includingPropertiesForKeys: (NSArray *)keys options: (NSDirectoryEnumerationOptions)mask errorHandler: (GSDirEnumErrorHandler)handler; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_5, GS_API_LATEST) /** * Returns an array of NSStrings of the contents of the * specified directory.
* The listing does not recursively list subdirectories.
* The special files '.' and '..' are not listed.
* Indicates an error by returning nil (eg. if path is not a directory or * it can't be read for some reason). */ - (NSArray*) contentsOfDirectoryAtPath: (NSString*)path error: (NSError**)error; - (NSDictionary*) attributesOfFileSystemForPath: (NSString*)path error: (NSError**)error; #endif - (BOOL) copyPath: (NSString*)source toPath: (NSString*)destination handler: (id)handler; - (BOOL) createDirectoryAtPath: (NSString *)path withIntermediateDirectories: (BOOL)flag attributes: (NSDictionary *)attributes error: (NSError **) error; - (BOOL) createDirectoryAtURL: (NSURL *)url withIntermediateDirectories: (BOOL)flag attributes: (NSDictionary *)attributes error: (NSError **) error; - (BOOL) createDirectoryAtPath: (NSString*)path attributes: (NSDictionary*)attributes; - (BOOL) createFileAtPath: (NSString*)path contents: (NSData*)contents attributes: (NSDictionary*)attributes; - (BOOL) createSymbolicLinkAtPath: (NSString*)path pathContent: (NSString*)otherPath; - (NSString*) currentDirectoryPath; - (NSArray*) directoryContentsAtPath: (NSString*)path; - (NSString*) displayNameAtPath: (NSString*)path; /** *

Returns an enumerator which can be used to return each item with * the directory at path in turn. *

*

The enumeration is recursive ... following all nested subdirectories. *

*

The order in which directory contents are enumerated is undefined, * and in the current implementation the natural order of the underlying * filesystem is used. *

*/ - (NSDirectoryEnumerator*) enumeratorAtPath: (NSString*)path; /** Returns the attributes dictionary for the file at the specified path. * If that file is a symbolic link, the flag determines whether the attributes * returned are those of the link or those of the destination file. */ - (NSDictionary*) fileAttributesAtPath: (NSString*)path traverseLink: (BOOL)flag; /** * Returns YES if a file (or directory etc) exists at the specified path. */ - (BOOL) fileExistsAtPath: (NSString*)path; /** * Returns YES if a file (or directory etc) exists at the specified path.
* If the isDirectory argument is not a nul pointer, stores a flag * in the location it points to, indicating whether the file is a * directory or not.
*/ - (BOOL) fileExistsAtPath: (NSString*)path isDirectory: (BOOL*)isDirectory; - (NSDictionary*) fileSystemAttributesAtPath: (NSString*)path; /** * Convert from OpenStep internal string format to a string in * the local filesystem format, suitable for passing to system functions.
* This representation may vary between filesystems.
* Converts the standard path separator ('/') and path extension ('.') * characters to the local representation if necessary.
* On mingw32 systems, the filesystem representation is 16-bit unicode and is * expected to be used in conjunction with the variants of system calls which * work with unicode strings.
* Raises an exception if the character conversion is not possible. */ - (const GSNativeChar*) fileSystemRepresentationWithPath: (NSString*)path; - (BOOL) isExecutableFileAtPath: (NSString*)path; - (BOOL) isDeletableFileAtPath: (NSString*)path; - (BOOL) isReadableFileAtPath: (NSString*)path; - (BOOL) isWritableFileAtPath: (NSString*)path; - (BOOL) linkPath: (NSString*)source toPath: (NSString*)destination handler: (id)handler; - (BOOL) movePath: (NSString*)source toPath: (NSString*)destination handler: (id)handler; - (NSString*) pathContentOfSymbolicLinkAtPath: (NSString*)path; /** * Removes the file or directory at path, using a * handler object which should respond to * [NSObject(NSFileManagerHandler)-fileManager:willProcessPath:] and * [NSObject(NSFileManagerHandler)-fileManager:shouldProceedAfterError:] * messages. */ - (BOOL) removeFileAtPath: (NSString*)path handler: (id)handler; /** * Convert to OpenStep internal string format from a string in * the local filesystem format, as returned by system functions.
* This representation may vary between filesystems.
* The GNUstep version of this method currently does not bother to change * any path separator and extension characters to the standard values * ('/' and '.' respectively) as the path handling methods of [NSString] * should be able to handle native format strings.
* On mingw32 systems, the filesystem representation is 16-bit unicode and * is expected to have come from the variant of a system call which works * with unicode strings. */ - (NSString*) stringWithFileSystemRepresentation: (const GSNativeChar*)string length: (NSUInteger)len; - (NSArray*) subpathsAtPath: (NSString*)path; @end /* NSFileManager */ /** * An informal protocol to which handler objects should conform * if they wish to deal with copy and move operations performed * by NSFileManager. */ @interface NSObject (NSFileManagerHandler) /** *

When an error occurs during a copy or move operation, the file manager * will send this message to the handler, and will use the return value to * determine whether the operation should proceed. If the method returns * YES then the operation will proceed after the error, if it returns NO * then it will be aborted. *

*

If the handler does not implement this method it will be treated as * if it returns NO. *

* The error dictionary contains the following * * "Error" * contains a description of the error. * * "Path" * contains the path that is being processed when * an error occurred. If an error occurs during an * operation involving two files, like copying, and * it is not clear which file triggers the error it * will default to the source file. * * "FromPath" * (Optional) contains the path involved in reading. * * "ToPath" * (Optional) contains the path involved in writing. * * * *

Note that the FromPath is a GNUstep extension. *

*

Also the FromPath and ToPath are filled * in when appropriate. So when copying a file they will typically * both have a value and when reading only FromPath. *

*/ - (BOOL) fileManager: (NSFileManager*)fileManager shouldProceedAfterError: (NSDictionary*)errorDictionary; /** * The file manager sends this method to the handler immediately before * performing part of a directory move or copy operation. This provides * the handler object with information it can use in the event of an * error, to decide whether processing should proceed after the error. */ - (void) fileManager: (NSFileManager*)fileManager willProcessPath: (NSString*)path; @end /** *

This is a subclass of NSEnumerator which provides a full * listing of all the files beneath a directory and its subdirectories. * Instances can be obtained through [NSFileManager-enumeratorAtPath:]. *

* *

This implementation is optimized and performance should be comparable * to the speed of standard Unix tools for large directories.

* *

The order in which directory contents are enumerated is undefined, * and in the current implementation the natural order of the underlying * filesystem is used.

*/ GS_EXPORT_CLASS @interface NSDirectoryEnumerator : NSEnumerator { #if GS_EXPOSE(NSDirectoryEnumerator) @private void *_stack; /* GSIArray */ NSString *_topPath; NSString *_currentFilePath; NSFileManager *_mgr; GSDirEnumErrorHandler _errorHandler; struct _NSDirectoryEnumeratorFlags // tag for objc++ w/gcc 4.6 { BOOL isRecursive: 1; BOOL isFollowing: 1; BOOL justContents: 1; BOOL skipHidden: 1; } _flags; #endif #if GS_NONFRAGILE #else /* Pointer to private additional data used to avoid breaking ABI * when we don't have the non-fragile ABI available. * Use this mechanism rather than changing the instance variable * layout (see Source/GSInternal.h for details). */ @private id _internal GS_UNUSED_IVAR; #endif } - (NSDictionary*) directoryAttributes; - (NSDictionary*) fileAttributes; - (void) skipDescendents; @end /* NSDirectoryEnumerator */ /* File Attributes */ /** File attribute key in dictionary returned by [NSFileManager-fileAttributesAtPath:traverseLink:]. */ GS_EXPORT NSString* const NSFileAppendOnly; /** File attribute key in dictionary returned by [NSFileManager-fileAttributesAtPath:traverseLink:]. */ GS_EXPORT NSString* const NSFileCreationDate; /** File attribute key in dictionary returned by [NSFileManager-fileAttributesAtPath:traverseLink:]. */ GS_EXPORT NSString* const NSFileDeviceIdentifier; /** File attribute key in dictionary returned by [NSFileManager-fileAttributesAtPath:traverseLink:]. */ GS_EXPORT NSString* const NSFileExtensionHidden; /** File attribute key in dictionary returned by [NSFileManager-fileAttributesAtPath:traverseLink:]. */ GS_EXPORT NSString* const NSFileGroupOwnerAccountID; /** File attribute key in dictionary returned by [NSFileManager-fileAttributesAtPath:traverseLink:]. */ GS_EXPORT NSString* const NSFileGroupOwnerAccountName; /** File attribute key in dictionary returned by [NSFileManager-fileAttributesAtPath:traverseLink:]. */ GS_EXPORT NSString* const NSFileHFSCreatorCode; /** File attribute key in dictionary returned by [NSFileManager-fileAttributesAtPath:traverseLink:]. */ GS_EXPORT NSString* const NSFileHFSTypeCode; /** File attribute key in dictionary returned by [NSFileManager-fileAttributesAtPath:traverseLink:]. */ GS_EXPORT NSString* const NSFileImmutable; /** File attribute key in dictionary returned by [NSFileManager-fileAttributesAtPath:traverseLink:]. */ GS_EXPORT NSString* const NSFileModificationDate; /** File attribute key in dictionary returned by [NSFileManager-fileAttributesAtPath:traverseLink:]. */ GS_EXPORT NSString* const NSFileOwnerAccountID; /** File attribute key in dictionary returned by [NSFileManager-fileAttributesAtPath:traverseLink:]. */ GS_EXPORT NSString* const NSFileOwnerAccountName; /** File attribute key in dictionary returned by [NSFileManager-fileAttributesAtPath:traverseLink:]. */ GS_EXPORT NSString* const NSFilePosixPermissions; /** File attribute key in dictionary returned by [NSFileManager-fileAttributesAtPath:traverseLink:]. */ GS_EXPORT NSString* const NSFileReferenceCount; /** File attribute key in dictionary returned by [NSFileManager-fileAttributesAtPath:traverseLink:]. */ GS_EXPORT NSString* const NSFileSize; /** File attribute key in dictionary returned by [NSFileManager-fileAttributesAtPath:traverseLink:]. */ GS_EXPORT NSString* const NSFileSystemFileNumber; /** File attribute key in dictionary returned by [NSFileManager-fileAttributesAtPath:traverseLink:]. */ GS_EXPORT NSString* const NSFileSystemNumber; /** File attribute key in dictionary returned by [NSFileManager-fileAttributesAtPath:traverseLink:]. */ GS_EXPORT NSString* const NSFileType; /* File Types */ /** Possible value for 'NSFileType' key in dictionary returned by [NSFileManager-fileAttributesAtPath:traverseLink:]. */ GS_EXPORT NSString* const NSFileTypeDirectory; /** Possible value for 'NSFileType' key in dictionary returned by [NSFileManager-fileAttributesAtPath:traverseLink:]. */ GS_EXPORT NSString* const NSFileTypeRegular; /** Possible value for 'NSFileType' key in dictionary returned by [NSFileManager-fileAttributesAtPath:traverseLink:]. */ GS_EXPORT NSString* const NSFileTypeSymbolicLink; /** Possible value for 'NSFileType' key in dictionary returned by [NSFileManager-fileAttributesAtPath:traverseLink:]. */ GS_EXPORT NSString* const NSFileTypeSocket; /** Possible value for 'NSFileType' key in dictionary returned by [NSFileManager-fileAttributesAtPath:traverseLink:]. */ GS_EXPORT NSString* const NSFileTypeFifo; /** Possible value for 'NSFileType' key in dictionary returned by [NSFileManager-fileAttributesAtPath:traverseLink:]. */ GS_EXPORT NSString* const NSFileTypeCharacterSpecial; /** Possible value for 'NSFileType' key in dictionary returned by [NSFileManager-fileAttributesAtPath:traverseLink:]. */ GS_EXPORT NSString* const NSFileTypeBlockSpecial; /** Possible value for 'NSFileType' key in dictionary returned by [NSFileManager-fileAttributesAtPath:traverseLink:]. */ GS_EXPORT NSString* const NSFileTypeUnknown; /* FileSystem Attributes */ /** File system attribute key in dictionary returned by [NSFileManager-fileAttributesAtPath:traverseLink:]. */ GS_EXPORT NSString* const NSFileSystemSize; /** File system attribute key in dictionary returned by [NSFileManager-fileAttributesAtPath:traverseLink:]. */ GS_EXPORT NSString* const NSFileSystemFreeSize; /** File system attribute key in dictionary returned by [NSFileManager-fileAttributesAtPath:traverseLink:]. */ GS_EXPORT NSString* const NSFileSystemNodes; /** File system attribute key in dictionary returned by [NSFileManager-fileAttributesAtPath:traverseLink:]. */ GS_EXPORT NSString* const NSFileSystemFreeNodes; /* Easy access to attributes in a dictionary */ @interface NSDictionary(NSFileAttributes) - (NSDate*) fileCreationDate; - (BOOL) fileExtensionHidden; - (OSType) fileHFSCreatorCode; - (OSType) fileHFSTypeCode; - (BOOL) fileIsAppendOnly; - (BOOL) fileIsImmutable; - (unsigned long long) fileSize; - (NSString*) fileType; - (NSNumber*) fileOwnerAccountID; - (NSString*) fileOwnerAccountName; - (NSNumber*) fileGroupOwnerAccountID; - (NSString*) fileGroupOwnerAccountName; - (NSDate*) fileModificationDate; - (NSUInteger) filePosixPermissions; - (NSUInteger) fileSystemNumber; - (NSUInteger) fileSystemFileNumber; @end #if OS_API_VERSION(MAC_OS_X_VERSION_10_5,GS_API_LATEST) @protocol NSFileManagerDelegate #if GS_PROTOCOLS_HAVE_OPTIONAL @optional #else @end @interface NSObject (NSFileManagerDelegate) #endif - (BOOL)fileManager: (NSFileManager *)fileManager shouldCopyItemAtPath: (NSString *)srcPath toPath: (NSString *)dstPath; - (BOOL)fileManager: (NSFileManager *)fileManager shouldCopyItemAtURL: (NSURL *)srcURL toURL: (NSURL *)dstURL; - (BOOL)fileManager: (NSFileManager *)fileManager shouldProceedAfterError: (NSError *)error copyingItemAtPath: (NSString *)srcPath toPath: (NSString *)dstPath; - (BOOL)fileManager: (NSFileManager *)fileManager shouldProceedAfterError: (NSError *)error copyingItemAtURL: (NSURL *)srcURL toURL: (NSURL *)dstURL; - (BOOL)fileManager: (NSFileManager *)fileManager shouldMoveItemAtPath: (NSString *)srcPath toPath: (NSString *)dstPath; - (BOOL)fileManager: (NSFileManager *)fileManager shouldMoveItemAtURL: (NSURL *)srcURL toURL: (NSURL *)dstURL; - (BOOL)fileManager: (NSFileManager *)fileManager shouldProceedAfterError: (NSError *)error movingItemAtPath: (NSString *)srcPath toPath: (NSString *)dstPath; - (BOOL)fileManager: (NSFileManager *)fileManager shouldProceedAfterError: (NSError *)error movingItemAtURL: (NSURL *)srcURL toURL: (NSURL *)dstURL; - (BOOL)fileManager: (NSFileManager *)fileManager shouldLinkItemAtPath: (NSString *)srcPath toPath: (NSString *)dstPath; - (BOOL)fileManager: (NSFileManager *)fileManager shouldLinkItemAtURL: (NSURL *)srcURL toURL: (NSURL *)dstURL; - (BOOL)fileManager: (NSFileManager *)fileManager shouldProceedAfterError: (NSError *)error linkingItemAtPath: (NSString *)srcPath toPath: (NSString *)dstPath; - (BOOL)fileManager: (NSFileManager *)fileManager shouldProceedAfterError: (NSError *)error linkingItemAtURL: (NSURL *)srcURL toURL: (NSURL *)dstURL; - (BOOL)fileManager: (NSFileManager *)fileManager shouldRemoveItemAtPath: (NSString *)path; - (BOOL)fileManager: (NSFileManager *)fileManager shouldRemoveItemAtURL: (NSURL *)URL; - (BOOL)fileManager: (NSFileManager *)fileManager shouldProceedAfterError: (NSError *)error removingItemAtPath: (NSString *)path; - (BOOL)fileManager: (NSFileManager *)fileManager shouldProceedAfterError: (NSError *)error removingItemAtURL: (NSURL *)URL; @end #endif #if defined(__cplusplus) } #endif #endif #endif /* __NSFileManager_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSFilePresenter.h000066400000000000000000000062521435650067400230610ustar00rootroot00000000000000/* Definition of class NSFilePresenter Copyright (C) 2019 Free Software Foundation, Inc. Implemented by: Gregory Casamento Date: Sep 2019 Original File by: Daniel Ferreira This file is part of the GNUstep Library. 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 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 USA. */ #ifndef __NSFilePresenter_h_GNUSTEP_BASE_INCLUDE #define __NSFilePresenter_h_GNUSTEP_BASE_INCLUDE #import @class NSError, NSFileVersion, NSOperationQueue, NSSet; #if OS_API_VERSION(MAC_OS_X_VERSION_10_7,GS_API_LATEST) DEFINE_BLOCK_TYPE_NO_ARGS(GSFilePresenterCompletionHandler, void); DEFINE_BLOCK_TYPE(GSFilePresenterSubitemDeletionHandler, void, NSError*); DEFINE_BLOCK_TYPE_NO_ARGS(GSFilePresenterReacquirer, void); DEFINE_BLOCK_TYPE(GSFilePresentedItemChangesWithCompletionHandler, void, NSError*); @protocol NSFilePresenter - (NSURL *) presentedItemURL; - (NSOperationQueue *) presentedItemOperationQueue; #if GS_PROTOCOLS_HAVE_OPTIONAL @optional #else @end @interface NSObject (NSFilePresenter) #endif - (NSURL *) primaryPresentedItemURL; - (NSString *) observedPresentedItemUbiquityAttributes; - (void) accommodatePresentedItemDeletionWithCompletionHandler: (GSFilePresenterCompletionHandler)completionHandler; - (void) accommodatePresentedSubitemDeletionAtURL:(NSURL *)url completionHandler: (GSFilePresenterSubitemDeletionHandler)completionHandler; - (void) presentedItemDidChange; - (void) presentedItemDidChangeUbiquityAttributes: (NSSet *)attributes; // 10.13 - (void) presentedItemDidGainVersion: (NSFileVersion *)version; - (void) presentedItemDidLoseVersion: (NSFileVersion *)version; - (void) presentedItemDidMoveToURL: (NSURL *)newURL; - (void) presentedItemDidResolveConflictVersion: (NSFileVersion *)version; - (void) presentedSubitemAtURL: (NSURL *)oldURL didMoveToURL: (NSURL *)newURL; - (void) presentedSubitemAtURL: (NSURL *)url didGainVersion: (NSFileVersion *)version; - (void) presentedSubitemAtURL: (NSURL *)url didLoseVersion: (NSFileVersion *)version; - (void) presentedSubitemAtURL: (NSURL *)url didResolveConflictVersion: (NSFileVersion *)version; - (void) presentedSubitemDidAppearAtURL: (NSURL *)url; - (void) presentedSubitemDidChangeAtURL: (NSURL *)url; - (void) relinquishPresentedItemToReader: (GSFilePresenterReacquirer)reader; - (void) relinquishPresentedItemToWriter: (GSFilePresenterReacquirer)writer; - (void) savePresentedItemChangesWithCompletionHandler: (GSFilePresentedItemChangesWithCompletionHandler)completionHandler; @end #endif #endif gnustep-base-1.29.0/Headers/Foundation/NSFileVersion.h000066400000000000000000000063541435650067400225420ustar00rootroot00000000000000/* Definition of class NSFileVersion Copyright (C) 2019 Free Software Foundation, Inc. Implemented by: Gregory Casamento Date: Sep 2019 Original File by: Daniel Ferreira This file is part of the GNUstep Library. 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 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 USA. */ #ifndef __NSFileVersion_h_GNUSTEP_BASE_INCLUDE #define __NSFileVersion_h_GNUSTEP_BASE_INCLUDE #import @class NSArray, NSDate, NSDictionary, NSError, NSString, NSURL, NSPersonNameComponents; #if OS_API_VERSION(MAC_OS_X_VERSION_10_7,GS_API_LATEST) enum { NSFileVersionReplacingByMoving = 1 << 0 }; typedef NSUInteger NSFileVersionReplacingOptions; enum { NSFileVersionAddingByMoving = 1 << 0 }; typedef NSUInteger NSFileVersionAddingOptions; GS_EXPORT_CLASS @interface NSFileVersion : NSObject { @private NSURL *_fileURL; NSURL *_contentsURL; id _persistentIdentifier; id _nonLocalVersion; BOOL _isResolved; BOOL _isDiscardable; BOOL _hasThumbnail; BOOL _hasLocalContents; BOOL _conflict; NSString *_localizedName; NSString *_localizedNameOfSavingComputer; NSDate *_modificationDate; } // Initializers + (NSFileVersion *)currentVersionOfItemAtURL: (NSURL *)url; + (NSArray *)otherVersionsOfItemAtURL: (NSURL *)url; + (NSFileVersion *)versionOfItemAtURL: (NSURL *)url forPersistentIdentifier: (id)persistentIdentifier; + (NSURL *)temporaryDirectoryURLForNewVersionOfItemAtURL: (NSURL *)url; + (NSFileVersion *)addVersionOfItemAtURL: (NSURL *)url withContentsOfURL: (NSURL *)contentsURL options: (NSFileVersionAddingOptions)options error: (NSError **)outError; + (NSArray *)unresolvedConflictVersionsOfItemAtURL: (NSURL *)url; + (BOOL)removeOtherVersionsOfItemAtURL: (NSURL *)url error: (NSError **)outError; // instance methods... - (BOOL) isDiscardable; - (void) setDiscardable: (BOOL)flag; - (BOOL) isResolved; - (void) setResolved: (BOOL)flag; - (NSDate *) modificationDate; - (NSPersonNameComponents *) originatorNameComponents; - (NSString *) localizedName; - (NSString *) localizedNameOfSavingComputer; - (BOOL) hasLocalContents; - (BOOL) hasThumbnail; - (NSURL *) URL; - (BOOL) conflict; - (id) persistentIdentifier; - (BOOL) removeAndReturnError: (NSError **)outError; - (NSURL *) replaceItemAtURL: (NSURL *)url options: (NSFileVersionReplacingOptions)options error: (NSError **)error; @end #endif #endif gnustep-base-1.29.0/Headers/Foundation/NSFileWrapper.h000066400000000000000000000116251435650067400225320ustar00rootroot00000000000000/* NSFileWrapper.h NSFileWrapper objects hold a file's contents in dynamic memory. Copyright (C) 1996 Free Software Foundation, Inc. Author: Felipe A. Rodriguez Date: Sept 1998 This file is part of the GNUstep BASE Library. 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 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; see the file COPYING.LIB. If not, see or write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _GNUstep_H_NSFileWrapper #define _GNUstep_H_NSFileWrapper #import #import @class NSData; @class NSDictionary; @class NSError; @class NSMutableDictionary; @class NSString; @class NSURL; typedef enum { GSFileWrapperDirectoryType, GSFileWrapperRegularFileType, GSFileWrapperSymbolicLinkType } GSFileWrapperType; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) enum { NSFileWrapperReadingImmediate = 1, NSFileWrapperReadingWithoutMapping = 2, }; typedef NSUInteger NSFileWrapperReadingOptions; enum { NSFileWrapperWritingAtomic = 1, NSFileWrapperWritingWithNameUpdating = 2, }; typedef NSUInteger NSFileWrapperWritingOptions; #endif GS_EXPORT_CLASS @interface NSFileWrapper : NSObject { NSString *_filename; NSString *_preferredFilename; NSMutableDictionary *_fileAttributes; GSFileWrapperType _wrapperType; id _wrapperData; id _icon; } // // Initialization // // Init instance of directory type - (id)initDirectoryWithFileWrappers:(NSDictionary *)docs; // Init instance of regular file type - (id)initRegularFileWithContents:(NSData *)data; // Init instance of symbolic link type - (id)initSymbolicLinkWithDestination:(NSString *)path; // Init an instance from the file, directory, or symbolic link at path. // This can create a tree of instances - (id)initWithPath:(NSString *)path; // with a directory instance at the top // Init an instance from data in standard serial format. Serial format // is the same as that used by NSText's RTFDFromRange: method. This can // create a tree of instances with a directory instance at the top - (id)initWithSerializedRepresentation:(NSData *)data; // // General methods // // write instace to disk at path. if directory type, this method is recursive // if flag is YES, the wrapper will be updated with the name used in writing // the file - (BOOL)writeToFile:(NSString *)path atomically:(BOOL)atomicFlag updateFilenames:(BOOL)updateFilenamesFlag; - (NSData *)serializedRepresentation; - (void)setFilename:(NSString *)filename; - (NSString *)filename; - (void)setPreferredFilename:(NSString *)filename; - (NSString *)preferredFilename; - (void)setFileAttributes:(NSDictionary *)attributes; - (NSDictionary *)fileAttributes; - (BOOL)isRegularFile; - (BOOL)isDirectory; - (BOOL)isSymbolicLink; - (BOOL)needsToBeUpdatedFromPath:(NSString *)path; - (BOOL)updateFromPath:(NSString *)path; // // Directory type methods // // these messages raise an exception when sent to non-directory type wrappers! - (NSString *)addFileWrapper:(NSFileWrapper *)doc; - (void)removeFileWrapper:(NSFileWrapper *)doc; - (NSDictionary *)fileWrappers; - (NSString *)keyForFileWrapper:(NSFileWrapper *)doc; - (NSString *)addFileWithPath:(NSString *)path; - (NSString *)addRegularFileWithContents:(NSData *)data preferredFilename:(NSString *)filename; - (NSString *)addSymbolicLinkWithDestination:(NSString *)path preferredFilename:(NSString *)filename; // // Regular file type methods // - (NSData *)regularFileContents; // // Symbolic link type methods // - (NSString *)symbolicLinkDestination; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) - (id)initSymbolicLinkWithDestinationURL:(NSURL *)url; - (id)initWithURL:(NSURL *)url options:(NSFileWrapperReadingOptions)options error:(NSError **)outError; - (BOOL)matchesContentsOfURL:(NSURL *)url; - (BOOL)readFromURL:(NSURL *)url options:(NSFileWrapperReadingOptions)options error:(NSError **)outError; - (NSURL *)symbolicLinkDestinationURL; - (BOOL)writeToURL:(NSURL *)url options:(NSFileWrapperWritingOptions)options originalContentsURL:(NSURL *)originalContentsURL error:(NSError **)outError; #endif @end #endif // _GNUstep_H_NSFileWrapper gnustep-base-1.29.0/Headers/Foundation/NSFormatter.h000066400000000000000000000133471435650067400222600ustar00rootroot00000000000000/* Interface of NSFormatter class Copyright (C) 1998 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: November 1998 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSFormatter_h_GNUSTEP_BASE_INCLUDE #define __NSFormatter_h_GNUSTEP_BASE_INCLUDE #import #import #import #import #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) #if defined(__cplusplus) extern "C" { #endif enum { NSFormattingContextUnknown = 0, NSFormattingContextDynamic, NSFormattingContextStandalone, NSFormattingContextListItem, NSFormattingContextBeginningOfSentence, NSFormattingContextMiddleOfSentence, }; typedef NSInteger NSFormattingContext; enum { NSFormattingUnitStyleShort = 1, NSFormattingUnitStyleMedium, NSFormattingUnitStyleLong, }; typedef NSInteger NSFormattingUnitStyle; @class NSString, NSAttributedString, NSDictionary; /** * This abstract class defines the interface for classes that support * conversion between strings and objects of various types. GNUstep * provides two concrete implementations of this class: [NSDateFormatter] * and [NSNumberFormatter]. Others may be implemented for specialized * applications. */ GS_EXPORT_CLASS @interface NSFormatter : NSObject /** * This method calls [-stringForObjectValue:] then marks up the string with * attributes if it should be displayed specially. For example, in an * application you may want to display out-of-range dates or numbers in * italics. This is an optional method and may return nil to indicate that * an attributed string is not provided. */ - (NSAttributedString*) attributedStringForObjectValue: (id)anObject withDefaultAttributes: (NSDictionary*)attr; /** * For use in applications where user interactively edits a string. If the * version of the string for editing purposes should look different from the * string displayed (returned by [-stringForObjectValue:] or * [-attributedStringForObjectValue:withDefaultAttributes:]), return that * here. For example, the edited string may contain formatting codes or * similar that are not displayed in the final string. The default * implementation simply returns [-stringForObjectValue:]. */ - (NSString*) editingStringForObjectValue: (id)anObject; /** * Primary method for converting a string to an object through parsing. * anObject and error are output parameters; you should allocate memory for * one pointer each for the variables passed into these methods. The * returned object will have been created through alloc-init. * If there is a problem with conversion, a constant-string description of * what went wrong is returned through error, and NO is returned, otherwise * YES. */ - (BOOL) getObjectValue: (id*)anObject forString: (NSString*)string errorDescription: (NSString**)error; /** * Checks whether partialString could, if it were completed, be * parsed into a valid object. newString and error are output parameters; * you should allocate memory for one pointer each for the variables passed * into these methods. This method is set up to be called after every * keystroke during user editing. If it returns NO, it optionally returns * newString to replace what the user was editing; if it doesn't, the editor * should delete the last character the user typed. */ - (BOOL) isPartialStringValid: (NSString*)partialString newEditingString: (NSString**)newString errorDescription: (NSString**)error; /** * Checks whether a change to a string leaves it a valid string that, if it * were completed, could be parsed into a valid object. origString contains * the string before the proposed change, and origSelRange contains the range * that is updated in the proposed change. partialStringPtr contains the new * string to validate and proposedSelRangePtr holds the selection range that * will be used if the string is accepted or replaced. Basically, this method * returns YES if partialStringPtr is valid, otherwise NO and may replace * partialStringPtr and proposedSelectedRange with improved values, and may * report the reason in error. */ - (BOOL) isPartialStringValid: (NSString**)partialStringPtr proposedSelectedRange: (NSRange*)proposedSelRangePtr originalString: (NSString*)origString originalSelectedRange: (NSRange)originalSelRangePtr errorDescription: (NSString**)error; /** * Primary method for converting an object to a string through formatting. * Object will be converted to string according to the formatter's * implementation and init parameters. There is no default handling if the * class of anObject is not what the formatter expects, and usually nil * will be returned in this case. */ - (NSString*) stringForObjectValue: (id)anObject; @end #if defined(__cplusplus) } #endif #endif #endif gnustep-base-1.29.0/Headers/Foundation/NSGarbageCollector.h000066400000000000000000000046201435650067400235060ustar00rootroot00000000000000/** Interface for NSGarbageCollector for GNUStep Copyright (C) 2009 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: Jan 2009 This file is part of the GNUstep Base Library. 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 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 USA. AutogsdocSource: NSGarbageCollector.m */ #ifndef _NSGarbageCollector_h_GNUSTEP_BASE_INCLUDE #define _NSGarbageCollector_h_GNUSTEP_BASE_INCLUDE #import #if OS_API_VERSION(MAC_OS_X_VERSION_10_5, GS_API_LATEST) #import #if defined(__cplusplus) extern "C" { #endif GS_EXPORT_CLASS @interface NSGarbageCollector : NSObject /** Obsolete ... returns nil because garbage collection no longer exists. */ + (id) defaultCollector; /** Obsolete ... does nothing because garbage collection no longer exists. */ - (void) collectIfNeeded; /** Obsolete ... does nothing because garbage collection no longer exists. */ - (void) collectExhaustively; /** Obsolete ... does nothing because garbage collection no longer exists. */ - (void) disable; /** Obsolete ... does nothing because garbage collection no longer exists. */ - (void) disableCollectorForPointer: (void *)ptr; /** Obsolete ... does nothing because garbage collection no longer exists. */ - (void) enable; /** Obsolete ... does nothing because garbage collection no longer exists. */ - (void) enableCollectorForPointer: (void *)ptr; /** Obsolete ... returns NO because garbage collection no longer exists. */ - (BOOL) isCollecting; /** Obsolete ... returns NO because garbage collection no longer exists. */ - (BOOL) isEnabled; /** Returns the default zone. */ - (NSZone*) zone; @end #if defined(__cplusplus) } #endif #endif #endif gnustep-base-1.29.0/Headers/Foundation/NSGeometry.h000066400000000000000000000367311435650067400221120ustar00rootroot00000000000000/* Interface for NSGeometry routines for GNUStep * Copyright (C) 1995 Free Software Foundation, Inc. * * Written by: Adam Fedor * Date: 1995,199 * * This file is part of the GNUstep Base Library. * * 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 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 USA. */ #ifndef __NSGeometry_h_GNUSTEP_BASE_INCLUDE #define __NSGeometry_h_GNUSTEP_BASE_INCLUDE #import #import #import #if defined(__cplusplus) extern "C" { #endif /**** Type, Constant, and Macro Definitions **********************************/ #ifndef MAX #define MAX(a,b) \ ({__typeof__(a) _MAX_a = (a); __typeof__(b) _MAX_b = (b); \ _MAX_a > _MAX_b ? _MAX_a : _MAX_b; }) #define GS_DEFINED_MAX #endif #ifndef MIN #define MIN(a,b) \ ({__typeof__(a) _MIN_a = (a); __typeof__(b) _MIN_b = (b); \ _MIN_a < _MIN_b ? _MIN_a : _MIN_b; }) #define GS_DEFINED_MIN #endif /** { CGFloat x; CGFloat y; }

Represents a 2-d cartesian position.

*/ typedef struct _NSPoint NSPoint; struct _NSPoint { CGFloat x; CGFloat y; }; #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) /** Array of NSPoint structs. */ typedef NSPoint *NSPointArray; /** Pointer to NSPoint struct. */ typedef NSPoint *NSPointPointer; #endif /** { CGFloat width; CGFloat height; }

Floating point rectangle size.

*/ typedef struct _NSSize NSSize; struct _NSSize { CGFloat width; CGFloat height; }; #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) /** Array of NSSize structs. */ typedef NSSize *NSSizeArray; /** Pointer to NSSize struct. */ typedef NSSize *NSSizePointer; #endif /** { NSPoint origin; NSSize size; }

Rectangle.

*/ typedef struct _NSRect NSRect; struct _NSRect { NSPoint origin; NSSize size; }; #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) /** Array of NSRect structs. */ typedef NSRect *NSRectArray; /** Pointer to NSRect struct. */ typedef NSRect *NSRectPointer; #endif enum { NSMinXEdge = 0, NSMinYEdge = 1, NSMaxXEdge = 2, NSMaxYEdge = 3 }; /** Sides of a rectangle. { NSMinXEdge, NSMinYEdge, NSMaxXEdge, NSMaxYEdge } */ typedef NSUInteger NSRectEdge; /** { CGFloat top; CGFloat left; CGFloat bottom; CGFloat right; }

A description of the distance between the edges of two rectangles.

*/ #if OS_API_VERSION(MAC_OS_X_VERSION_10_7, GS_API_LATEST) typedef struct NSEdgeInsets { CGFloat top; CGFloat left; CGFloat bottom; CGFloat right; } NSEdgeInsets; #endif /** Point at 0,0 */ static const NSPoint NSZeroPoint __attribute__((unused)) = {0.0,0.0}; /** Zero-size rectangle at 0,0 */ static const NSRect NSZeroRect __attribute__((unused)) = {{0.0,0.0},{0.0,0.0}}; /** Zero size */ static const NSSize NSZeroSize __attribute__((unused)) = {0.0,0.0}; #if OS_API_VERSION(MAC_OS_X_VERSION_10_7, GS_API_LATEST) /** Zero edge insets **/ static const NSEdgeInsets NSEdgeInsetsZero __attribute__((unused)) = {0.0,0.0,0.0,0.0}; #endif /**** Function Prototypes ****************************************************/ /* * All but the most complex functions are declared static inline in this * header file so that they are maximally efficient. In order to provide * true functions (for code modules that don't have this header) this * header is included in NSGeometry.m where the functions are no longer * declared inline. */ #ifdef IN_NSGEOMETRY_M #define GS_GEOM_SCOPE extern #define GS_GEOM_ATTR #else #define GS_GEOM_SCOPE static inline #define GS_GEOM_ATTR __attribute__((unused)) #endif /** Create Basic Structures... **/ GS_GEOM_SCOPE NSPoint NSMakePoint(CGFloat x, CGFloat y) GS_GEOM_ATTR; /** Returns an NSPoint having x-coordinate X and y-coordinate Y. */ GS_GEOM_SCOPE NSPoint NSMakePoint(CGFloat x, CGFloat y) { NSPoint point; point.x = x; point.y = y; return point; } GS_GEOM_SCOPE NSSize NSMakeSize(CGFloat w, CGFloat h) GS_GEOM_ATTR; /** Returns an NSSize having width w and height h. */ GS_GEOM_SCOPE NSSize NSMakeSize(CGFloat w, CGFloat h) { NSSize size; size.width = w; size.height = h; return size; } GS_GEOM_SCOPE NSRect NSMakeRect(CGFloat x, CGFloat y, CGFloat w, CGFloat h) GS_GEOM_ATTR; /** Returns an NSRect having point of origin (x, y) and size {w, h}. */ GS_GEOM_SCOPE NSRect NSMakeRect(CGFloat x, CGFloat y, CGFloat w, CGFloat h) { NSRect rect; rect.origin.x = x; rect.origin.y = y; rect.size.width = w; rect.size.height = h; return rect; } /** Constructs NSEdgeInsets. **/ #if OS_API_VERSION(MAC_OS_X_VERSION_10_7, GS_API_LATEST) GS_GEOM_SCOPE NSEdgeInsets NSEdgeInsetsMake(CGFloat top, CGFloat left, CGFloat bottom, CGFloat right) GS_GEOM_ATTR; GS_GEOM_SCOPE NSEdgeInsets NSEdgeInsetsMake(CGFloat top, CGFloat left, CGFloat bottom, CGFloat right) { NSEdgeInsets edgeInsets; edgeInsets.top = top; edgeInsets.left = left; edgeInsets.bottom = bottom; edgeInsets.right = right; return edgeInsets; } #if OS_API_VERSION(MAC_OS_X_VERSION_10_10, GS_API_LATEST) /** Compares two edge insets for equality. **/ GS_EXPORT BOOL NSEdgeInsetsEqual(NSEdgeInsets e1, NSEdgeInsets e2); #endif #endif /** Get a Rectangle's Coordinates... **/ GS_GEOM_SCOPE CGFloat NSMaxX(NSRect aRect) GS_GEOM_ATTR; /** Returns the greatest x-coordinate value still inside aRect. */ GS_GEOM_SCOPE CGFloat NSMaxX(NSRect aRect) { return aRect.origin.x + aRect.size.width; } GS_GEOM_SCOPE CGFloat NSMaxY(NSRect aRect) GS_GEOM_ATTR; /** Returns the greatest y-coordinate value still inside aRect. */ GS_GEOM_SCOPE CGFloat NSMaxY(NSRect aRect) { return aRect.origin.y + aRect.size.height; } GS_GEOM_SCOPE CGFloat NSMidX(NSRect aRect) GS_GEOM_ATTR; /** Returns the x-coordinate of aRect's middle point. */ GS_GEOM_SCOPE CGFloat NSMidX(NSRect aRect) { return aRect.origin.x + (aRect.size.width / 2.0); } GS_GEOM_SCOPE CGFloat NSMidY(NSRect aRect) GS_GEOM_ATTR; /** Returns the y-coordinate of aRect's middle point. */ GS_GEOM_SCOPE CGFloat NSMidY(NSRect aRect) { return aRect.origin.y + (aRect.size.height / 2.0); } GS_GEOM_SCOPE CGFloat NSMinX(NSRect aRect) GS_GEOM_ATTR; /** Returns the least x-coordinate value still inside aRect. */ GS_GEOM_SCOPE CGFloat NSMinX(NSRect aRect) { return aRect.origin.x; } GS_GEOM_SCOPE CGFloat NSMinY(NSRect aRect) GS_GEOM_ATTR; /** Returns the least y-coordinate value still inside aRect. */ GS_GEOM_SCOPE CGFloat NSMinY(NSRect aRect) { return aRect.origin.y; } GS_GEOM_SCOPE CGFloat NSWidth(NSRect aRect) GS_GEOM_ATTR; /** Returns aRect's width. */ GS_GEOM_SCOPE CGFloat NSWidth(NSRect aRect) { return aRect.size.width; } GS_GEOM_SCOPE CGFloat NSHeight(NSRect aRect) GS_GEOM_ATTR; /** Returns aRect's height. */ GS_GEOM_SCOPE CGFloat NSHeight(NSRect aRect) { return aRect.size.height; } GS_GEOM_SCOPE BOOL NSIsEmptyRect(NSRect aRect) GS_GEOM_ATTR; /** Returns 'YES' iff the area of aRect is zero (i.e., iff either * of aRect's width or height is negative or zero). */ GS_GEOM_SCOPE BOOL NSIsEmptyRect(NSRect aRect) { return ((NSWidth(aRect) > 0) && (NSHeight(aRect) > 0)) ? NO : YES; } /** Modify a Copy of a Rectangle... **/ GS_GEOM_SCOPE NSRect NSOffsetRect(NSRect aRect, CGFloat dx, CGFloat dy) GS_GEOM_ATTR; /** Returns the rectangle obtained by translating aRect * horizontally by dx and vertically by dy. */ GS_GEOM_SCOPE NSRect NSOffsetRect(NSRect aRect, CGFloat dx, CGFloat dy) { NSRect rect = aRect; rect.origin.x += dx; rect.origin.y += dy; return rect; } GS_GEOM_SCOPE NSRect NSInsetRect(NSRect aRect, CGFloat dX, CGFloat dY) GS_GEOM_ATTR; /** Returns the rectangle obtained by moving each of aRect's * horizontal sides inward by dy and each of aRect's vertical * sides inward by dx.
* NB. For MacOS-X compatability, this is permitted to return * a rectanglew with nagative width or height, strange as that seems. */ GS_GEOM_SCOPE NSRect NSInsetRect(NSRect aRect, CGFloat dX, CGFloat dY) { NSRect rect; rect = NSOffsetRect(aRect, dX, dY); rect.size.width -= (2 * dX); rect.size.height -= (2 * dY); return rect; } /** Divides aRect into two rectangles (namely slice and remainder) by * "cutting" aRect---parallel to, and a distance amount from the given edge * of aRect. You may pass 0 in as either of slice or * remainder to avoid obtaining either of the created rectangles. */ GS_EXPORT void NSDivideRect(NSRect aRect, NSRect *slice, NSRect *remainder, CGFloat amount, NSRectEdge edge); /** Returns a rectangle obtained by expanding aRect minimally * so that all four of its defining components are integers. */ GS_EXPORT NSRect NSIntegralRect(NSRect aRect); /** Compute a Third Rectangle from Two Rectangles... **/ GS_GEOM_SCOPE NSRect NSUnionRect(NSRect aRect, NSRect bRect) GS_GEOM_ATTR; /** Returns the smallest rectangle which contains both aRect * and bRect (modulo a set of measure zero). If either of aRect * or bRect is an empty rectangle, then the other rectangle is * returned. If both are empty, then the empty rectangle is returned. */ GS_GEOM_SCOPE NSRect NSUnionRect(NSRect aRect, NSRect bRect) { NSRect rect; if (NSIsEmptyRect(aRect) && NSIsEmptyRect(bRect)) return NSMakeRect(0.0,0.0,0.0,0.0); else if (NSIsEmptyRect(aRect)) return bRect; else if (NSIsEmptyRect(bRect)) return aRect; rect = NSMakeRect(MIN(NSMinX(aRect), NSMinX(bRect)), MIN(NSMinY(aRect), NSMinY(bRect)), 0.0, 0.0); rect = NSMakeRect(NSMinX(rect), NSMinY(rect), MAX(NSMaxX(aRect), NSMaxX(bRect)) - NSMinX(rect), MAX(NSMaxY(aRect), NSMaxY(bRect)) - NSMinY(rect)); return rect; } GS_GEOM_SCOPE NSRect NSIntersectionRect(NSRect aRect, NSRect bRect) GS_GEOM_ATTR; /** Returns the largest rectangle which lies in both aRect and * bRect. If aRect and bRect have empty intersection (or, rather, * intersection of measure zero, since this includes having their * intersection be only a point or a line), then the empty * rectangle is returned. */ GS_GEOM_SCOPE NSRect NSIntersectionRect (NSRect aRect, NSRect bRect) { if (NSMaxX(aRect) <= NSMinX(bRect) || NSMaxX(bRect) <= NSMinX(aRect) || NSMaxY(aRect) <= NSMinY(bRect) || NSMaxY(bRect) <= NSMinY(aRect)) { return NSMakeRect(0.0, 0.0, 0.0, 0.0); } else { NSRect rect; if (NSMinX(aRect) <= NSMinX(bRect)) rect.origin.x = bRect.origin.x; else rect.origin.x = aRect.origin.x; if (NSMinY(aRect) <= NSMinY(bRect)) rect.origin.y = bRect.origin.y; else rect.origin.y = aRect.origin.y; if (NSMaxX(aRect) >= NSMaxX(bRect)) rect.size.width = NSMaxX(bRect) - rect.origin.x; else rect.size.width = NSMaxX(aRect) - rect.origin.x; if (NSMaxY(aRect) >= NSMaxY(bRect)) rect.size.height = NSMaxY(bRect) - rect.origin.y; else rect.size.height = NSMaxY(aRect) - rect.origin.y; return rect; } } /** Test geometric relationships... **/ /** Returns 'YES' iff aRect's and bRect's origin and size are the same. */ GS_EXPORT BOOL NSEqualRects(NSRect aRect, NSRect bRect) GS_GEOM_ATTR; /** Returns 'YES' iff aSize's and bSize's width and height are the same. */ GS_EXPORT BOOL NSEqualSizes(NSSize aSize, NSSize bSize) GS_GEOM_ATTR; /** Returns 'YES' iff aPoint's and bPoint's x- and y-coordinates * are the same. */ GS_EXPORT BOOL NSEqualPoints(NSPoint aPoint, NSPoint bPoint) GS_GEOM_ATTR; GS_GEOM_SCOPE BOOL NSMouseInRect(NSPoint aPoint, NSRect aRect, BOOL flipped) GS_GEOM_ATTR; /** Returns 'YES' iff aPoint is inside aRect. */ GS_GEOM_SCOPE BOOL NSMouseInRect(NSPoint aPoint, NSRect aRect, BOOL flipped) { if (flipped) { return ((aPoint.x >= NSMinX(aRect)) && (aPoint.y >= NSMinY(aRect)) && (aPoint.x < NSMaxX(aRect)) && (aPoint.y < NSMaxY(aRect))) ? YES : NO; } else { return ((aPoint.x >= NSMinX(aRect)) && (aPoint.y > NSMinY(aRect)) && (aPoint.x < NSMaxX(aRect)) && (aPoint.y <= NSMaxY(aRect))) ? YES : NO; } } GS_GEOM_SCOPE BOOL NSPointInRect(NSPoint aPoint, NSRect aRect) GS_GEOM_ATTR; /** Just like 'NSMouseInRect(aPoint, aRect, YES)'. */ GS_GEOM_SCOPE BOOL NSPointInRect(NSPoint aPoint, NSRect aRect) { return NSMouseInRect(aPoint, aRect, YES); } GS_GEOM_SCOPE BOOL NSContainsRect(NSRect aRect, NSRect bRect) GS_GEOM_ATTR; /** Returns 'YES' iff aRect totally encloses bRect. NOTE: For * this to be the case, aRect cannot be empty, nor can any side * of bRect go beyond any side of aRect. Note that this behavior * is different than the original OpenStep behavior, where the sides * of bRect could not touch aRect. */ GS_GEOM_SCOPE BOOL NSContainsRect(NSRect aRect, NSRect bRect) { return (!NSIsEmptyRect(bRect) && (NSMinX(aRect) <= NSMinX(bRect)) && (NSMinY(aRect) <= NSMinY(bRect)) && (NSMaxX(aRect) >= NSMaxX(bRect)) && (NSMaxY(aRect) >= NSMaxY(bRect))) ? YES : NO; } #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) GS_GEOM_SCOPE BOOL NSIntersectsRect(NSRect aRect, NSRect bRect) GS_GEOM_ATTR; /** Returns YES if aRect and bRect have non-zero intersection area (intersecting at a line or a point doesn't count). */ GS_GEOM_SCOPE BOOL NSIntersectsRect(NSRect aRect, NSRect bRect) { /* Note that intersecting at a line or a point doesn't count */ return (NSMaxX(aRect) <= NSMinX(bRect) || NSMaxX(bRect) <= NSMinX(aRect) || NSMaxY(aRect) <= NSMinY(bRect) || NSMaxY(bRect) <= NSMinY(aRect) || NSIsEmptyRect(aRect) || NSIsEmptyRect(bRect)) ? NO : YES; } #endif /** Get a String Representation... **/ #ifdef __OBJC__ /** Returns an NSString of the form "{x=X; y=Y}", where * X and Y are the x- and y-coordinates of aPoint, respectively. */ GS_EXPORT NSString * NSStringFromPoint(NSPoint aPoint); /** Returns an NSString of the form "{x=X; y=Y; width=W; height=H}", * where X, Y, W, and H are the x-coordinate, y-coordinate, * width, and height of aRect, respectively. */ GS_EXPORT NSString * NSStringFromRect(NSRect aRect); /** Returns an NSString of the form "{width=W; height=H}", where * W and H are the width and height of aSize, respectively. */ GS_EXPORT NSString * NSStringFromSize(NSSize aSize); /** Parses point from string of form "{x=a; y=b}". (0,0) returned if parsing fails. */ GS_EXPORT NSPoint NSPointFromString(NSString* string); /** Parses size from string of form "{width=a; height=b}". Size of 0,0 returned if parsing fails. */ GS_EXPORT NSSize NSSizeFromString(NSString* string); /** Parses point from string of form "{x=a; y=b; width=c; height=d}". Rectangle of 0 size at origin returned if parsing fails. */ GS_EXPORT NSRect NSRectFromString(NSString* string); #endif /* __OBJC__ */ #ifdef GS_DEFINED_MAX #undef GS_DEFINED_MAX #undef MAX #endif #ifdef GS_DEFINED_MIN #undef GS_DEFINED_MIN #undef MIN #endif #if defined(__cplusplus) } #endif #endif /* __NSGeometry_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSHFSFileTypes.h000066400000000000000000000027571435650067400225650ustar00rootroot00000000000000/* Definition of class NSHFSFileTypes Copyright (C) 2019 Free Software Foundation, Inc. By: heron Date: Fri Nov 1 00:25:22 EDT 2019 This file is part of the GNUstep Library. 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 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 USA. */ #ifndef _NSHFSFileTypes_h_GNUSTEP_BASE_INCLUDE #define _NSHFSFileTypes_h_GNUSTEP_BASE_INCLUDE #include #if OS_API_VERSION(MAC_OS_X_VERSION_10_0, GS_API_LATEST) #if defined(__cplusplus) extern "C" { #endif @class NSString; GS_EXPORT NSString *NSFileTypeForHFSTypeCode(NSUInteger hfsFileTypeCode); GS_EXPORT NSUInteger NSHFSTypeCodeFromFileType(NSString *fileTypeString); GS_EXPORT NSString *NSHFSTypeOfFile(NSString *fullFilePath); #if defined(__cplusplus) } #endif #endif /* GS_API_MACOSX */ #endif /* _NSHFSFileTypes_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSHTTPCookie.h000066400000000000000000000212771435650067400222270ustar00rootroot00000000000000/* Interface for NSHTTPCookie for GNUstep Copyright (C) 2006 Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 2006 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSHTTPCookie_h_GNUSTEP_BASE_INCLUDE #define __NSHTTPCookie_h_GNUSTEP_BASE_INCLUDE #import #if OS_API_VERSION(MAC_OS_X_VERSION_10_2,GS_API_LATEST) && GS_API_VERSION( 11300,GS_API_LATEST) #import #if defined(__cplusplus) extern "C" { #endif @class NSArray; @class NSDate; @class NSDictionary; @class NSString; @class NSURL; GS_EXPORT NSString * const NSHTTPCookieComment; /** Obtain text of the comment */ GS_EXPORT NSString * const NSHTTPCookieCommentURL; /** Obtain the comment URL */ GS_EXPORT NSString * const NSHTTPCookieDiscard; /** Obtain the sessions discard setting */ GS_EXPORT NSString * const NSHTTPCookieDomain; /** Obtain cookie domain */ GS_EXPORT NSString * const NSHTTPCookieExpires; /** Obtain cookie expiry date */ GS_EXPORT NSString * const NSHTTPCookieMaximumAge; /** Obtain maximum age (expiry) */ GS_EXPORT NSString * const NSHTTPCookieName; /** Obtain name of cookie */ GS_EXPORT NSString * const NSHTTPCookieOriginURL; /** Obtain cookie origin URL */ GS_EXPORT NSString * const NSHTTPCookiePath; /** Obtain cookie path */ GS_EXPORT NSString * const NSHTTPCookiePort; /** Obtain cookie ports */ GS_EXPORT NSString * const NSHTTPCookieSecure; /** Obtain cookie security */ GS_EXPORT NSString * const NSHTTPCookieValue; /** Obtain value of cookie */ GS_EXPORT NSString * const NSHTTPCookieVersion; /** Obtain cookie version */ /** * An instance of the NSHTTPCookie class is a single, immutable http cookie. * It can be initialised with properties from a dictionary and has accessor * methods to obtain the cookie values.
* The class supports unversioned cookies (sometimes referred to as version 0) * as originally produced by netscape, as well as more recent standardised * and versioned cookies. */ GS_EXPORT_CLASS @interface NSHTTPCookie : NSObject { #if GS_EXPOSE(NSHTTPCookie) @private void *_NSHTTPCookieInternal; #endif } /** * Allocates and returns an autoreleasd instance using -initWithProperties: * to initialise it from properties. */ + (id) cookieWithProperties: (NSDictionary *)properties; /** * Returns an array of cookies parsed from the headerFields and URL * (assuming that the headerFields came from a response to a request * sent to the URL).
* The headerFields dictionary must contain at least all the headers * relevant to cookie setting ... other headers are ignored. */ + (NSArray *) cookiesWithResponseHeaderFields: (NSDictionary *)headerFields forURL: (NSURL *)URL; /** * Returns a dictionary of header fields that can be used to add the * specified cookies to a request. */ + (NSDictionary *) requestHeaderFieldsWithCookies: (NSArray *)cookies; /** * Returns a string which may be used to describe the cookie to the * user, or nil if no comment is set. */ - (NSString *) comment; /** * Returns a URL where the user can find out about the cookie, or nil * if no comment URL is set. */ - (NSURL *) commentURL; /** * Returns the domain to which the cookie should be sent.
* If there is a leading dot then subdomains should also receive the * cookie as specified in RFC 2965. */ - (NSString *) domain; /** * Returns the expiry date of the receiver or nil if there is no * such date. */ - (NSDate *) expiresDate; /** * Initialises the receiver with a dictionary of properties.
* Unrecognised keys are ignored.
* Returns nil if a required key is missing or if an illegal * value is specified for a key. * * NSHTTPCookieComment * * The [NSString] comment for the cookie (if any).
* This is nil by default and for unversioned cookies. *
* NSHTTPCookieCommentURL * * The [NSString] or [NSURL] URL to get the comment for the cookie.
* This is nil by default and for unversioned cookies. *
* NSHTTPCookieDomain * * The [NSString] specified the domain to which the cookie applies.
* This is extracted from NSHTTPCookieOriginURL if not specified. *
* NSHTTPCookieDiscard * * A [NSString] (either TRUE or FALSE) saying whether the cookie * is to be discarded when the session ends.
* Defaults to FALSE except for versioned cookies where * NSHTTPCookieMaximumAge is unspecified. *
* NSHTTPCookieExpires * * The [NSDate] or [NSString] (format Wdy, DD-Mon-YYYY HH:MM:SS GMT) * specifying when an unversioned cookie expires and ignored for * versioned cookies. * * NSHTTPCookieMaximumAge * * An [NSString] containing an integer value specifying the longest time * (in seconds) for which the cookie is valid.
* This defaults to zero and is only meaningful for versioned cookies. *
* NSHTTPCookieName * * An [NSString] ... obvious ... no default value. * * NSHTTPCookieOriginURL * * An [NSString] or [NSURL] specifying the URL which set the cookie.
* Must be supplied if NSHTTPCookieDomain is not. *
* NSHTTPCookiePath * * An [NSString] specifying the path from the cookie.
* If unspecified this value is determined from NSHTTPCookieOriginURL * or defaults to '/'. *
* NSHTTPCookiePort * * An [NSString] containing a comma separated list of integer port * numbers. This is valid for versioned cookies and defaults to * an empty string. * * NSHTTPCookieSecure * * An [NSString] saying whether the cookie may be sent over * insecure connections.
* The default is FALSE meaning that it may be sent insecurely. *
* NSHTTPCookieValue * * An [NSString] containing the whole value of the cooke.
* This parameter must be provided. *
* NSHTTPCookieVersion * * An [NSString] specifying the cookie version ... for an * unversioned cookie (the default) this is '0'.
* Also supports version '1'. *
*
*/ - (id) initWithProperties: (NSDictionary *)properties; /** * Returns whether the receiver should only be sent over * secure connections. */ #if GS_HAS_DECLARED_PROPERTIES @property (readonly, getter=isSecure) BOOL secure; #else - (BOOL) isSecure; #endif /** * Returns whether the receiver should be destroyed at the end of the * session. */ #if GS_HAS_DECLARED_PROPERTIES @property (readonly, getter=isSessionOnly) BOOL sessionOnly; #else - (BOOL) isSessionOnly; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_6,GS_API_LATEST) #if GS_HAS_DECLARED_PROPERTIES @property (readonly, getter=isHTTPOnly) BOOL HTTPOnly; #else - (BOOL) isHTTPOnly; #endif #endif /** * Returns the name of the receiver. */ - (NSString *) name; /** * Returns the URL path within the cookie's domain for which * this cookie must be sent. */ - (NSString *) path; /** * Returns the list of ports to which the receiver should be sent, * or nil if the cookie can be used for any port. */ - (NSArray *) portList; /** * Returns a dictionary representation of the receiver which could be * used as the argument for -initWithProperties: to recreate a copy * of the receiver. */ - (NSDictionary *) properties; /** * Returns the value of the receiver. */ - (NSString *) value; /** * Returns 0 for an unversioned Netscape style cookie or a * positive integer for a versioned cookie. */ - (NSUInteger) version; @end #if defined(__cplusplus) } #endif #endif /* 100200 */ #endif /* __NSHTTPCookie_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSHTTPCookieStorage.h000066400000000000000000000065421435650067400235520ustar00rootroot00000000000000/* Interface for NSHTTPCookieStorage for GNUstep Copyright (C) 2006 Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 2006 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSHTTPCookieStorage_h_GNUSTEP_BASE_INCLUDE #define __NSHTTPCookieStorage_h_GNUSTEP_BASE_INCLUDE #import #if OS_API_VERSION(MAC_OS_X_VERSION_10_2,GS_API_LATEST) && GS_API_VERSION( 11300,GS_API_LATEST) #import #if defined(__cplusplus) extern "C" { #endif @class NSArray; @class NSHTTPCookie; @class NSURL; enum { NSHTTPCookieAcceptPolicyAlways, NSHTTPCookieAcceptPolicyNever, NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain }; /** * NSHTTPCookieAcceptPolicyAlways Accept all cookies * NSHTTPCookieAcceptPolicyNever Reject all cookies * NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain Accept cookies * only from the main document domain */ typedef NSUInteger NSHTTPCookieAcceptPolicy; /** * Posted to the distributed notification center when the cookie * accept policy is changed. */ GS_EXPORT NSString * const NSHTTPCookieManagerAcceptPolicyChangedNotification; /** * Posted when the set of cookies changes */ GS_EXPORT NSString * const NSHTTPCookieManagerCookiesChangedNotification; /** * The NSHTTPCookieStorage class provides a shared instance which handles * the shared cookie store.
*/ GS_EXPORT_CLASS @interface NSHTTPCookieStorage : NSObject { #if GS_EXPOSE(NSHTTPCookieStorage) @private void *_NSHTTPCookieStorageInternal; #endif } /** * Returns the shared instance. */ + (NSHTTPCookieStorage *) sharedHTTPCookieStorage; /** * Returns the current cookie accept policy. */ - (NSHTTPCookieAcceptPolicy) cookieAcceptPolicy; /** * Returns an array of all managed cookies. */ - (NSArray *) cookies; /** * Returns an array of all known cookies to send to URL. */ - (NSArray *) cookiesForURL: (NSURL *)URL; /** * Deletes cookie from the shared store. */ - (void) deleteCookie: (NSHTTPCookie *)cookie; /** * Sets a cookie in the store, replacing any existing cookie with the * same name, domain and path. */ - (void) setCookie: (NSHTTPCookie *)cookie; /** * Sets the current cookie accept policy. */ - (void) setCookieAcceptPolicy: (NSHTTPCookieAcceptPolicy)cookieAcceptPolicy; /** * Adds to the shared store following the policy for * NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain */ - (void) setCookies: (NSArray *)cookies forURL: (NSURL *)URL mainDocumentURL: (NSURL *)mainDocumentURL; @end #if defined(__cplusplus) } #endif #endif /* 100200 */ #endif /* __NSHTTPCookieStorage_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSHashTable.h000066400000000000000000000211671435650067400221470ustar00rootroot00000000000000/* NSHashTable interface for GNUStep. * Copyright (C) 1994, 1995, 1996, 1997, 2002 Free Software Foundation, Inc. * * Author: Albin L. Jones * Created: Mon Dec 12 23:56:03 EST 1994 * Updated: Thu Mar 21 15:13:46 EST 1996 * Serial: 96.03.21.06 * Modified by: Richard Frith-Macdonald * * This file is part of the GNUstep Base Library. * * 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 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, 02111 USA. */ #ifndef __NSHashTable_h_GNUSTEP_BASE_INCLUDE #define __NSHashTable_h_GNUSTEP_BASE_INCLUDE 1 #import /**** Included Headers *******************************************************/ #import #import #import #import #if defined(__cplusplus) extern "C" { #endif @class GS_GENERIC_CLASS(NSArray, ElementT); @class GS_GENERIC_CLASS(NSSet, ElementT); /**** Type, Constant, and Macro Definitions **********************************/ enum { NSHashTableStrongMemory = NSPointerFunctionsStrongMemory, NSHashTableZeroingWeakMemory = NSPointerFunctionsZeroingWeakMemory, NSHashTableCopyIn = NSPointerFunctionsCopyIn, NSHashTableObjectPointerPersonality = NSPointerFunctionsObjectPointerPersonality, NSHashTableWeakMemory = NSPointerFunctionsWeakMemory }; typedef NSUInteger NSHashTableOptions; GS_EXPORT_CLASS @interface GS_GENERIC_CLASS(NSHashTable, ElementT) : NSObject + (instancetype) hashTableWithOptions: (NSPointerFunctionsOptions)options; + (instancetype) hashTableWithWeakObjects; /** * Creates a hash table that uses zeroing weak references (either using the * automatic reference counting or garbage collection mechanism, depending on * which mode this framework is compiled in) so that objects are removed when * their last other reference disappears. */ + (instancetype) weakObjectsHashTable; - (instancetype) initWithOptions: (NSPointerFunctionsOptions)options capacity: (NSUInteger)initialCapacity; - (instancetype) initWithPointerFunctions: (NSPointerFunctions*)functions capacity: (NSUInteger)initialCapacity; /** Adds the object to the receiver. */ - (void) addObject: (GS_GENERIC_TYPE(ElementT))object; /** Returns an array containing all objects in the receiver. */ - (GS_GENERIC_CLASS(NSArray, ElementT)*) allObjects; /** Returns any objct from the receiver, or nil if the receiver contains no * objects. */ - (GS_GENERIC_TYPE(ElementT)) anyObject; /** Returns YES if the receiver contains an item equal to anObject, or NO * otherwise. */ - (BOOL) containsObject: (GS_GENERIC_TYPE(ElementT))anObject; /** Return the number of items atored in the receiver. */ - (NSUInteger) count; /** Removes from the receiver any items which are not also present in 'other'. */ - (void) intersectHashTable: (GS_GENERIC_CLASS(NSHashTable, ElementT)*)other; /** Returns YES if the receiver and 'other' contain any items in common. */ - (BOOL) intersectsHashTable: (GS_GENERIC_CLASS(NSHashTable, ElementT)*)other; /** Returns YES if the receiver and 'other' contain equal sets of items. */ - (BOOL) isEqualToHashTable: (GS_GENERIC_CLASS(NSHashTable, ElementT)*)other; /** Returns YES fi all the items in the receiver are also present in 'other' */ - (BOOL) isSubsetOfHashTable: (GS_GENERIC_CLASS(NSHashTable, ElementT)*)other; /** Returns an item stored in the receiver which is equal to the supplied * object argument, or nil if no matchi is found. */ - (GS_GENERIC_TYPE(ElementT)) member: (GS_GENERIC_TYPE(ElementT))object; /** Removes from the receivr all those items which are prsent in both * the receiver and in 'other'. */ - (void) minusHashTable: (GS_GENERIC_CLASS(NSHashTable, ElementT)*)other; /** Return an enumerator for the receiver. */ - (GS_GENERIC_CLASS(NSEnumerator, ElementT)*) objectEnumerator; /** Return an NSPointerFunctions value describing the functions used by the * receiver to handle its contents. */ - (NSPointerFunctions*) pointerFunctions; /** Removes all objects. */ - (void) removeAllObjects; /** Remove the object (or any equal object) from the receiver. */ - (void) removeObject: (GS_GENERIC_TYPE(ElementT))object; /** Returns a set containing all the objects in the receiver. */ - (GS_GENERIC_CLASS(NSSet, ElementT)*) setRepresentation; /** Adds to the receiver thse items present in 'other' which were * not present in the receiver. */ - (void) unionHashTable: (GS_GENERIC_CLASS(NSHashTable, ElementT)*)other; @end /** * Type for enumerating.
* NB. Implementation detail ... in GNUstep the layout must * correspond to that used by the GSIMap macros. */ typedef struct { void *map; void *node; size_t bucket; } NSHashEnumerator; /** Callback functions for an NSHashTable. See NSCreateHashTable() .
*/ typedef struct _NSHashTableCallBacks { /** NSUInteger (*hash)(NSHashTable *, const void *) ... * Hashing function. NOTE: Elements with equal values must have equal hash * function values. The default if NULL uses the pointer addresses * directly.
*/ NSUInteger (*hash)(NSHashTable *, const void *); /** BOOL (*isEqual)(NSHashTable *, const void *, const void *) * ... Comparison function. The default if NULL uses '=='. *
*/ BOOL (*isEqual)(NSHashTable *, const void *, const void *); /** void (*retain)(NSHashTable *, const void *) ... * Retaining function called when adding elements to the table. * The default if NULL is a no-op (no reference counting).
*/ void (*retain)(NSHashTable *, const void *); /** void (*release)(NSHashTable *, void *) ... Releasing * function called when a data element is removed from the table. * The default if NULL is a no-op (no reference counting).
*/ void (*release)(NSHashTable *, void *); /** NSString *(*describe)(NSHashTable *, const void *) ... * Description function. The default if NULL prints boilerplate.
*/ NSString *(*describe)(NSHashTable *, const void *); } NSHashTableCallBacks; GS_EXPORT const NSHashTableCallBacks NSIntegerHashCallBacks; GS_EXPORT const NSHashTableCallBacks NSIntHashCallBacks; /*DEPRECATED*/ GS_EXPORT const NSHashTableCallBacks NSNonOwnedPointerHashCallBacks; GS_EXPORT const NSHashTableCallBacks NSNonRetainedObjectHashCallBacks; GS_EXPORT const NSHashTableCallBacks NSObjectHashCallBacks; GS_EXPORT const NSHashTableCallBacks NSOwnedPointerHashCallBacks; GS_EXPORT const NSHashTableCallBacks NSPointerToStructHashCallBacks; GS_EXPORT NSHashTable * NSCreateHashTable(NSHashTableCallBacks callBacks, NSUInteger capacity); GS_EXPORT NSHashTable * NSCreateHashTableWithZone(NSHashTableCallBacks callBacks, NSUInteger capacity, NSZone *zone); GS_EXPORT NSHashTable * NSCopyHashTableWithZone(NSHashTable *table, NSZone *zone); GS_EXPORT void NSFreeHashTable(NSHashTable *table); GS_EXPORT void NSResetHashTable(NSHashTable *table); GS_EXPORT BOOL NSCompareHashTables(NSHashTable *table1, NSHashTable *table2); GS_EXPORT NSUInteger NSCountHashTable(NSHashTable *table); GS_EXPORT void * NSHashGet(NSHashTable *table, const void *element); GS_EXPORT NSArray * NSAllHashTableObjects(NSHashTable *table); GS_EXPORT void NSEndHashTableEnumeration(NSHashEnumerator *enumerator); GS_EXPORT NSHashEnumerator NSEnumerateHashTable(NSHashTable *table); GS_EXPORT void * NSNextHashEnumeratorItem(NSHashEnumerator *enumerator); GS_EXPORT void NSHashInsert(NSHashTable *table, const void *element); GS_EXPORT void NSHashInsertKnownAbsent(NSHashTable *table, const void *element); GS_EXPORT void * NSHashInsertIfAbsent(NSHashTable *table, const void *element); GS_EXPORT void NSHashRemove(NSHashTable *table, const void *element); GS_EXPORT NSString * NSStringFromHashTable(NSHashTable *table); #if defined(__cplusplus) } #endif #endif /* __NSHashTable_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSHost.h000066400000000000000000000072531435650067400212310ustar00rootroot00000000000000/* Interface for host class Copyright (C) 1996, 1997 Free Software Foundation, Inc. Written by: Luke Howard Date: 1996 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSHost_h_GNUSTEP_BASE_INCLUDE #define __NSHost_h_GNUSTEP_BASE_INCLUDE #import #import #if defined(__cplusplus) extern "C" { #endif @class NSString, NSArray, NSSet; /** * Instances of this class encapsulate host information. Constructors based * on host name or numeric address are provided. */ GS_EXPORT_CLASS @interface NSHost : NSObject { #if GS_EXPOSE(NSHost) @private NSSet *_names; NSSet *_addresses; #endif #if GS_NONFRAGILE #else /* Pointer to private additional data used to avoid breaking ABI * when we don't have the non-fragile ABI available. * Use this mechanism rather than changing the instance variable * layout (see Source/GSInternal.h for details). */ @private id _internal GS_UNUSED_IVAR; #endif } /** * Get current host object. */ + (NSHost*) currentHost; /** * Get info for host with given DNS name. */ + (NSHost*) hostWithName: (NSString*)name; /** * Get a host object. Hosts are cached for efficiency. The address * must be an IPV4 "dotted decimal" string, e.g. NSHost aHost = [NSHost hostWithAddress:@"192.42.172.1"]; */ + (NSHost*) hostWithAddress: (NSString*)address; /** * Set host cache management. * If enabled, only one object representing each host will be created, and * a shared instance will be returned by all methods that return a host. */ + (void) setHostCacheEnabled: (BOOL)flag; /** * Return host cache management. * If enabled, only one object representing each host will be created, and * a shared instance will be returned by all methods that return a host. */ + (BOOL) isHostCacheEnabled; /** * Clear cache of host info instances. */ + (void) flushHostCache; /** * Compare hosts. * Hosts are equal if they share at least one address */ - (BOOL) isEqualToHost: (NSHost*) aHost; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6,GS_API_LATEST) /** * If the receiver is the currentHost, returns the default name of the * computer, otherwise returns nil. */ - (NSString*) localizedName; #endif /** * Return host name. Chosen arbitrarily if a host has more than one. */ - (NSString*) name; /** * Return all known names for host. */ - (NSArray*) names; /** * Return host address in "dotted decimal" notation, e.g. "192.42.172.1". * Chosen arbitrarily if a host has more than one. */ - (NSString*) address; /** * Return all known addresses for host in "dotted decimal" notation, * e.g. "192.42.172.1". */ - (NSArray*) addresses; @end #if GS_API_VERSION(GS_API_NONE,011700) /** * Adds synonym for +currentHost. */ @interface NSHost (GNUstep) /** * Synonym for +currentHost. */ + (NSHost*) localHost; /* All local IP addresses */ @end #endif #if defined(__cplusplus) } #endif #endif gnustep-base-1.29.0/Headers/Foundation/NSISO8601DateFormatter.h000066400000000000000000000065171435650067400237510ustar00rootroot00000000000000/* Definition of class NSISO8601DateFormatter Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory John Casamento Date: Tue Oct 29 04:43:13 EDT 2019 This file is part of the GNUstep Library. 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 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 USA. */ #ifndef _NSISO8601DateFormatter_h_GNUSTEP_BASE_INCLUDE #define _NSISO8601DateFormatter_h_GNUSTEP_BASE_INCLUDE #include #if OS_API_VERSION(MAC_OS_X_VERSION_10_0, GS_API_LATEST) #if defined(__cplusplus) extern "C" { #endif enum { NSISO8601DateFormatWithYear = (1UL << 0), NSISO8601DateFormatWithMonth = (1UL << 1), NSISO8601DateFormatWithWeekOfYear = (1UL << 2), NSISO8601DateFormatWithDay = (1UL << 4), NSISO8601DateFormatWithTime = (1UL << 5), NSISO8601DateFormatWithTimeZone = (1UL << 6), NSISO8601DateFormatWithSpaceBetweenDateAndTime = (1UL << 7), NSISO8601DateFormatWithDashSeparatorInDate = (1UL << 8), NSISO8601DateFormatWithColonSeparatorInTime = (1UL << 9), NSISO8601DateFormatWithColonSeparatorInTimeZone = (1UL << 10), NSISO8601DateFormatWithFractionalSeconds = (1UL << 11), NSISO8601DateFormatWithFullDate = NSISO8601DateFormatWithYear | NSISO8601DateFormatWithMonth | NSISO8601DateFormatWithDay | NSISO8601DateFormatWithDashSeparatorInDate, NSISO8601DateFormatWithFullTime = NSISO8601DateFormatWithTime | NSISO8601DateFormatWithColonSeparatorInTime | NSISO8601DateFormatWithTimeZone | NSISO8601DateFormatWithColonSeparatorInTimeZone, NSISO8601DateFormatWithInternetDateTime = (NSISO8601DateFormatWithFullDate | NSISO8601DateFormatWithFullTime), }; typedef NSUInteger NSISO8601DateFormatOptions; @class NSTimeZone, NSString, NSDate, NSDateFormatter; GS_EXPORT_CLASS @interface NSISO8601DateFormatter : NSFormatter { NSTimeZone *_timeZone; NSISO8601DateFormatOptions _formatOptions; NSDateFormatter *_formatter; } - (NSTimeZone *) timeZone; - (void) setTimeZone: (NSTimeZone *)tz; - (NSISO8601DateFormatOptions) formatOptions; - (void) setFormatOptions: (NSISO8601DateFormatOptions)options; - (NSString *) stringFromDate: (NSDate *)date; - (NSDate *) dateFromString: (NSString *)string; + (NSString *) stringFromDate: (NSDate *)date timeZone: (NSTimeZone *)timeZone formatOptions: (NSISO8601DateFormatOptions)formatOptions; @end #if defined(__cplusplus) } #endif #endif /* GS_API_MACOSX */ #endif /* _NSISO8601DateFormatter_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSIndexPath.h000066400000000000000000000103521435650067400221720ustar00rootroot00000000000000/** Interface for NSIndexPath for GNUStep Copyright (C) 2006 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: Feb 2006 This file is part of the GNUstep Base Library. 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 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 USA. AutogsdocSource: NSIndexPath.m */ #ifndef _NSIndexPath_h_GNUSTEP_BASE_INCLUDE #define _NSIndexPath_h_GNUSTEP_BASE_INCLUDE #import #import #if defined(__cplusplus) extern "C" { #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_4,GS_API_LATEST) && GS_API_VERSION( 10200,GS_API_LATEST) /** * Instances of this class represent a series of indexes into a hierarchy * of arrays.
* Each instance is a unique shared object. */ GS_EXPORT_CLASS @interface NSIndexPath : NSObject { #if GS_EXPOSE(NSIndexPath) @private NSUInteger _hash; NSUInteger _length; NSUInteger *_indexes; #endif #if GS_NONFRAGILE #else /* Pointer to private additional data used to avoid breaking ABI * when we don't have the non-fragile ABI available. * Use this mechanism rather than changing the instance variable * layout (see Source/GSInternal.h for details). */ @private id _internal GS_UNUSED_IVAR; #endif } /** * Return a path containing the single value anIndex. */ + (id) indexPathWithIndex: (NSUInteger)anIndex; /** * Return a path containing all the indexes in the supplied array. */ + (id) indexPathWithIndexes: (NSUInteger*)indexes length: (NSUInteger)length; #if OS_API_VERSION(MAC_OS_X_VERSION_10_11,GS_API_LATEST) /** * Return a path containing an item number and section. */ + (NSIndexPath *) indexPathForItem: (NSInteger)item inSection: (NSInteger)section; /** * Return an index number identifying an item in a collection view */ - (NSInteger) item; /** * Return an index number identifying a section in a collection view */ - (NSInteger) section; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_13,GS_API_LATEST) /** * Return a path containing row number and section. */ + (NSIndexPath *) indexPathForRow: (NSInteger)item inSection: (NSInteger)section; /** * Return an index number identifying a row in a table view */ - (NSInteger) item; #endif /** * Compares other with the receiver.
* Returns NSOrderedSame if the two are identical.
* Returns NSOrderedAscending if other is less than the receiver in a * depth-wise comparison.
* Returns NSOrderedDescending otherwise. */ - (NSComparisonResult) compare: (NSIndexPath*)other; /** * Copies all index values from the receiver into aBuffer. */ - (void) getIndexes: (NSUInteger*)aBuffer; /** * Return the index at the specified position or NSNotFound if there * is no index at the specified position. */ - (NSUInteger) indexAtPosition: (NSUInteger)position; /** * Return path formed by adding anIndex to the receiver. */ - (NSIndexPath *) indexPathByAddingIndex: (NSUInteger)anIndex; /** * Return path formed by removing the last index from the receiver. */ - (NSIndexPath *) indexPathByRemovingLastIndex; /** * Returns the shared instance containing the specified index, creating it * and destroying the receiver if necessary. */ - (id) initWithIndex: (NSUInteger)anIndex; /** * Returns the shared instance containing the specified index array, * creating it and destroying the receiver if necessary. */ - (id) initWithIndexes: (NSUInteger*)indexes length: (NSUInteger)length; /** * Returns the number of index values present in the receiver. */ - (NSUInteger) length; @end #endif #if defined(__cplusplus) } #endif #endif gnustep-base-1.29.0/Headers/Foundation/NSIndexSet.h000066400000000000000000000154441435650067400220400ustar00rootroot00000000000000/** Interface for NSIndexSet, NSMutableIndexSet for GNUStep Copyright (C) 2004 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: Feb 2004 This file is part of the GNUstep Base Library. 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 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 USA. AutogsdocSource: NSIndexSet.m */ #ifndef _NSIndexSet_h_GNUSTEP_BASE_INCLUDE #define _NSIndexSet_h_GNUSTEP_BASE_INCLUDE #import #import #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) #import #import #if defined(__cplusplus) extern "C" { #endif /** * Instances of this class are collections of unsigned integers in the * range 0 to NSNotFound-1.
* Each integer can appear in a collection only once. */ GS_EXPORT_CLASS @interface NSIndexSet : NSObject { #if GS_EXPOSE(NSIndexSet) void *_data; #endif } /** * Return an empty set. */ + (id) indexSet; /** * Return a set containing the single value anIndex, or returns nil if * anIndex is NSNotFound. */ + (id) indexSetWithIndex: (NSUInteger)anIndex; /** * Return a set containing all the values in aRange, or returns nil if * aRange contains NSNotFound. */ + (id) indexSetWithIndexesInRange: (NSRange)aRange; /** * Returns YES if the receiver contains anIndex, NO otherwise. */ - (BOOL) containsIndex: (NSUInteger)anIndex; /** * Returns YES if the receiver contains all the index values present * in aSet, NO otherwise. */ - (BOOL) containsIndexes: (NSIndexSet*)aSet; /** * Returns YES if the receiver contains all the index values present * in aRange, NO otherwise. */ - (BOOL) containsIndexesInRange: (NSRange)aRange; /** * Returns the number of index values present in the receiver. */ - (NSUInteger) count; #if OS_API_VERSION(MAC_OS_X_VERSION_10_5,GS_API_LATEST) /** Not implemented * Returns the number of indexes set within the specified range. */ - (NSUInteger) countOfIndexesInRange: (NSRange)range; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_6,GS_API_LATEST) DEFINE_BLOCK_TYPE(GSIndexSetEnumerationBlock, void, NSUInteger, BOOL*); - (void) enumerateIndexesInRange: (NSRange)range options: (NSEnumerationOptions)opts usingBlock: (GSIndexSetEnumerationBlock)aBlock; /** * Enumerate all indices in the set by applying a block to them. */ - (void) enumerateIndexesUsingBlock: (GSIndexSetEnumerationBlock)aBlock; - (void) enumerateIndexesWithOptions: (NSEnumerationOptions)opts usingBlock: (GSIndexSetEnumerationBlock)aBlock; #endif /** * Returns the first index value in the receiver or NSNotFound if the * receiver is empty. */ - (NSUInteger) firstIndex; /** * Copies index values into aBuffer until there are no index values left or * aBuffer is full (assuming that the size of aBuffer is given by aCount).
* Only copies index values present in aRange and copies them in order.
* Returns the number of index values placed in aBuffer.
* Modifies aRange to start after the last index value copied.
* If aRange is a null pointer, this method attempts to get all * index values from the set (and of course no range can be returned in it). */ - (NSUInteger) getIndexes: (NSUInteger*)aBuffer maxCount: (NSUInteger)aCount inIndexRange: (NSRangePointer)aRange; /** * Return the first index value in the receiver which is greater than * anIndex. */ - (NSUInteger) indexGreaterThanIndex: (NSUInteger)anIndex; /** * Return the first index value in the receiver which is greater than * or equal to anIndex. */ - (NSUInteger) indexGreaterThanOrEqualToIndex: (NSUInteger)anIndex; /** * Return the first index value in the receiver which is less than * anIndex. */ - (NSUInteger) indexLessThanIndex: (NSUInteger)anIndex; /** * Return the first index value in the receiver which is less than * or equal to anIndex. */ - (NSUInteger) indexLessThanOrEqualToIndex: (NSUInteger)anIndex; /** * Initialise the receiver to contain anIndex. Returns the initialised * object or nil if anIndex is NSNotFound. */ - (id) initWithIndex: (NSUInteger)anIndex; /** * Initialise the receiver to contain all index values in aRange. * Returns the initialised object or nil if aRange contains NSNotFound. */ - (id) initWithIndexesInRange: (NSRange)aRange; /** * Initialises the receiver with the index values from aSet. */ - (id) initWithIndexSet: (NSIndexSet*)aSet; /** * Returns YES if the receiver contains any index values which lie in aRange, * No otherwise. */ - (BOOL) intersectsIndexesInRange: (NSRange)aRange; /** * Tests two index sets for equality and returns either YES or NO. */ - (BOOL) isEqualToIndexSet: (NSIndexSet*)aSet; /** * Returns the last index value in the receiver or NSNotFound if the * receiver is empty. */ - (NSUInteger) lastIndex; @end GS_EXPORT_CLASS @interface NSMutableIndexSet : NSIndexSet /** * Adds anIndex to the set of indexes stored in the receiver. */ - (void) addIndex: (NSUInteger)anIndex; /** * Adds all the indexes from aSet to the set of indexes stored in the receiver. */ - (void) addIndexes: (NSIndexSet*)aSet; /** * Adds all the indexes in aRange to the set of indexes stored in the receiver. */ - (void) addIndexesInRange: (NSRange)aRange; /** * Removes all indexes stored in the receiver. */ - (void) removeAllIndexes; /** * Removes anIndex from the set of indexes stored in the receiver. */ - (void) removeIndex: (NSUInteger)anIndex; /** * Removes all the indexes in aSet from the set of indexes * stored in the receiver. */ - (void) removeIndexes: (NSIndexSet*)aSet; /** * Removes all the indexes in aRange from the set of indexes * stored in the receiver. */ - (void) removeIndexesInRange: (NSRange)aRange; /** * Moves all the indexes from anIndex upwards by the amount specified.
* If amount is negative, index values below anIndex will be overwritten * by the shifted values.
* If amount is positive, a 'hole' will be left in the index range after * anIndex. */ - (void) shiftIndexesStartingAtIndex: (NSUInteger)anIndex by: (NSInteger)amount; @end #if defined(__cplusplus) } #endif #endif #endif gnustep-base-1.29.0/Headers/Foundation/NSInvocation.h000066400000000000000000000111031435650067400224120ustar00rootroot00000000000000/* Interface for NSInvocation for GNUStep Copyright (C) 1998,2003 Free Software Foundation, Inc. Author: Richard Frith-Macdonald Date: 1998 Based on code by: Andrew Kachites McCallum This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSInvocation_h_GNUSTEP_BASE_INCLUDE #define __NSInvocation_h_GNUSTEP_BASE_INCLUDE #import #import #if defined(__cplusplus) extern "C" { #endif GS_EXPORT_CLASS @interface NSInvocation : NSObject { #if GS_EXPOSE(NSInvocation) @public NSMethodSignature *_sig; void *_cframe; void *_retval; id _target; SEL _selector; unsigned int _numArgs; void *_info; BOOL _argsRetained; BOOL _targetRetained; BOOL _validReturn; BOOL _sendToSuper; void *_retptr; #endif #if GS_NONFRAGILE #else /* Pointer to private additional data used to avoid breaking ABI * when we don't have the non-fragile ABI available. * Use this mechanism rather than changing the instance variable * layout (see Source/GSInternal.h for details). */ @private id _internal GS_UNUSED_IVAR; #endif } /* * Creating instances. */ + (NSInvocation*) invocationWithMethodSignature: (NSMethodSignature*)_signature; /* * Accessing message elements. */ - (void) getArgument: (void*)buffer atIndex: (NSInteger)index; - (void) getReturnValue: (void*)buffer; - (SEL) selector; - (void) setArgument: (void*)buffer atIndex: (NSInteger)index; - (void) setReturnValue: (void*)buffer; - (void) setSelector: (SEL)aSelector; - (void) setTarget: (id)anObject; - (id) target; /* * Managing arguments. */ - (BOOL) argumentsRetained; - (void) retainArguments; #if OS_API_VERSION(GS_API_NONE,GS_API_NONE) && GS_API_VERSION( 11101,GS_API_LATEST) - (BOOL) targetRetained; - (void) retainArgumentsIncludingTarget: (BOOL)retainTargetFlag; #endif /* * Dispatching an Invocation. */ - (void) invoke; - (void) invokeWithTarget: (id)anObject; /* * Getting the method signature. */ - (NSMethodSignature*) methodSignature; @end #if GS_API_VERSION(GS_API_NONE, 011700) @interface NSInvocation (GNUstep) /** * Returns the status of the flag set by -setSendsToSuper: */ - (BOOL) sendsToSuper; /** * Sets the flag to tell the invocation that it should actually invoke a * method in the superclass of the target rather than the method of the * target itself.
* This extension permits an invocation to act like a regular method * call sent to super in the method of a class. */ - (void) setSendsToSuper: (BOOL)flag; @end #endif /** For use by macros only. */ @interface NSInvocation (MacroSetup) - (id) initWithMethodSignature: (NSMethodSignature*)aSignature; + (id) _newProxyForInvocation: (id)target; + (id) _newProxyForMessage: (id)target; + (NSInvocation*) _returnInvocationAndDestroyProxy: (id)proxy; @end /** * Creates and returns an autoreleased invocation containing a * message to an instance of the class. The 'message' consists * of selector and arguments like a standard ObjectiveC method * call.
* Before using the returned invocation, you need to set its target. */ #define NS_INVOCATION(aClass, message...) ({\ id __proxy = [NSInvocation _newProxyForInvocation: aClass]; \ [__proxy message]; \ [NSInvocation _returnInvocationAndDestroyProxy: __proxy]; \ }) /** * Creates and returns an autoreleased invocation containing a * message to the target object. The 'message' consists * of selector and arguments like a standard ObjectiveC method * call. */ #define NS_MESSAGE(target, message...) ({\ id __proxy = [NSInvocation _newProxyForMessage: target]; \ [__proxy message]; \ [NSInvocation _returnInvocationAndDestroyProxy: __proxy]; \ }) #if defined(__cplusplus) } #endif #endif /* __NSInvocation_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSInvocationOperation.h000066400000000000000000000034761435650067400243110ustar00rootroot00000000000000/**Interface for NSInvocationOperation for GNUStep Copyright (C) 2013 Free Software Foundation, Inc. Written by: Graham Lee Date: 2013 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSInvocationOperation_h_GNUSTEP_BASE_INCLUDE #define __NSInvocationOperation_h_GNUSTEP_BASE_INCLUDE #import #if OS_API_VERSION(MAC_OS_X_VERSION_10_5, GS_API_LATEST) #if defined(__cplusplus) extern "C" { #endif @class NSInvocation; @class NSException; GS_EXPORT_CLASS @interface NSInvocationOperation : NSOperation { @private NSInvocation *_invocation; NSException *_exception; void *_reserved; } - (id) initWithInvocation: (NSInvocation *)inv; - (id) initWithTarget: (id)target selector: (SEL)aSelector object: (id)arg; - (NSInvocation *) invocation; - (id) result; @end GS_EXPORT NSString* const NSInvocationOperationVoidResultException; GS_EXPORT NSString* const NSInvocationOperationCancelledException; #if defined(__cplusplus) } #endif #endif /* OS_API_VERSION */ #endif /* __NSInvocationOperation_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSItemProvider.h000066400000000000000000000170371435650067400227260ustar00rootroot00000000000000/* Definition of class NSItemProvider Copyright (C) 2019 Free Software Foundation, Inc. By: heron Date: Sun Nov 10 04:00:17 EST 2019 This file is part of the GNUstep Library. 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 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 USA. */ #ifndef _NSItemProvider_h_GNUSTEP_BASE_INCLUDE #define _NSItemProvider_h_GNUSTEP_BASE_INCLUDE #include #if OS_API_VERSION(MAC_OS_X_VERSION_10_10, GS_API_LATEST) #if defined(__cplusplus) extern "C" { #endif @class NSItemProvider, NSProgress, NSData, NSError, NSURL, NSProgress, NSDictionary;; DEFINE_BLOCK_TYPE(GSProviderCompletionHandler, void, NSData*, NSError**); DEFINE_BLOCK_TYPE(GSProviderURLCompletionHandler, void, NSURL*, NSError**); DEFINE_BLOCK_TYPE(GSProviderURLBOOLCompletionHandler, void, NSURL*, BOOL, NSError**); DEFINE_BLOCK_TYPE(GSProgressHandler, NSProgress*, GSProviderCompletionHandler); DEFINE_BLOCK_TYPE(GSProgressURLBOOLHandler, NSProgress*, GSProviderURLBOOLCompletionHandler); DEFINE_BLOCK_TYPE(GSItemProviderWritingHandler, id, NSError**); DEFINE_BLOCK_TYPE(GSItemProviderReadingHandler, id, NSError**); DEFINE_BLOCK_TYPE(GSProgressItemProviderWritingLoadHandler, NSProgress*, GSItemProviderWritingHandler); DEFINE_BLOCK_TYPE(GSProgressItemProviderReadingLoadHandler, NSProgress*, GSItemProviderReadingHandler); DEFINE_BLOCK_TYPE(NSItemProviderCompletionHandler, void, id, NSError**); DEFINE_BLOCK_TYPE(NSItemProviderLoadHandler, NSItemProviderCompletionHandler, Class, NSDictionary*); enum { NSItemProviderRepresentationVisibilityAll = 0, NSItemProviderRepresentationVisibilityTeam = 1, NSItemProviderRepresentationVisibilityGroup = 2 , NSItemProviderRepresentationVisibilityOwnProcess = 3, }; typedef NSInteger NSItemProviderRepresentationVisibility; enum { NSItemProviderFileOptionOpenInPlace = 1, }; typedef NSInteger NSItemProviderFileOptions; @protocol NSItemProviderWriting - (NSArray *) writableTypeIdentifiersForItemProvider; - (void) setWritableTypeIdentifiersForItemProvider: (NSArray *)anArray; + (NSItemProviderRepresentationVisibility) itemProviderVisibilityForRepresentationWithTypeIdentifier: (NSString *)typeIdentifier; - (NSItemProviderRepresentationVisibility) itemProviderVisibilityForRepresentationWithTypeIdentifier: (NSString *)typeIdentifier; - (NSProgress *) loadDataWithTypeIdentifier: (NSString *)typeIdentifier forItemProviderCompletionHandler: (GSProviderCompletionHandler)completionHandler; @end @protocol NSItemProviderReading - (NSArray *) readableTypeIdentifiersForItemProvider; - (void) setReadableTypeIdentifiersForItemProvider: (NSArray *)array; + (instancetype) objectWithItemProviderData: (NSData *)data typeIdentifier: (NSString *)typeIdentifier error: (NSError **)outError; @end GS_EXPORT_CLASS @interface NSItemProvider : NSObject - (instancetype) init; - (void) registerDataRepresentationForTypeIdentifier: (NSString *)typeIdentifier visibility: (NSItemProviderRepresentationVisibility)visibility loadHandler: (GSProgressHandler)loadHandler; - (void) registerFileRepresentationForTypeIdentifier: (NSString *)typeIdentifier fileOptions: (NSItemProviderFileOptions)fileOptions visibility: (NSItemProviderRepresentationVisibility)visibility loadHandler: (GSProgressURLBOOLHandler)loadHandler; - (NSArray *) registeredTypeIdentifiers; - (NSArray *) registeredTypeIdentifiersWithFileOptions: (NSItemProviderFileOptions)fileOptions; - (BOOL) hasItemConformingToTypeIdentifier: (NSString *)typeIdentifier; - (BOOL) hasRepresentationConformingToTypeIdentifier: (NSString *)typeIdentifier fileOptions: (NSItemProviderFileOptions)fileOptions; - (NSProgress *) loadDataRepresentationForTypeIdentifier: (NSString *)typeIdentifier completionHandler: (GSProviderCompletionHandler)completionHandler; - (NSProgress *) loadFileRepresentationForTypeIdentifier: (NSString *)typeIdentifier completionHandler: (GSProviderURLCompletionHandler)completionHandler; - (NSProgress *) loadInPlaceFileRepresentationForTypeIdentifier: (NSString *)typeIdentifier completionHandler: (GSProviderURLBOOLCompletionHandler)completionHandler; - (NSString *) suggestedName; - (void) setSuggestedName: (NSString *)suggestedName; - (instancetype) initWithObject: (id)object; - (void) registerObject: (id)object visibility: (NSItemProviderRepresentationVisibility)visibility; - (void) registerObjectOfClass: (Class)aClass // NSItemProviderWriting conforming class... visibility: (NSItemProviderRepresentationVisibility)visibility loadHandler: (GSItemProviderWritingHandler)loadHandler; - (BOOL) canLoadObjectOfClass: (Class)aClass; - (NSProgress *) loadObjectOfClass: (Class)aClass // NSItemProviderReading conforming class... completionHandler: (GSItemProviderReadingHandler)completionHandler; - (instancetype) initWithItem: (id)item typeIdentifier: (NSString *)typeIdentifier; // designated init - (instancetype) initWithContentsOfURL: (NSURL *)fileURL; - (void) registerItemForTypeIdentifier: (NSString *)typeIdentifier loadHandler: (NSItemProviderLoadHandler)loadHandler; - (void)loadItemForTypeIdentifier: (NSString *)typeIdentifier options: (NSDictionary *)options completionHandler: (NSItemProviderCompletionHandler)completionHandler; @end // Preview support GS_EXPORT NSString * const NSItemProviderPreferredImageSizeKey; @interface NSItemProvider (NSPreviewSupport) - (NSItemProviderLoadHandler) previewImageHandler; - (void) setPreviewImageHandler: (NSItemProviderLoadHandler) previewImageHandler; - (void) loadPreviewImageWithOptions: (NSDictionary *)options completionHandler: (NSItemProviderCompletionHandler)completionHandler; @end GS_EXPORT NSString * const NSExtensionJavaScriptPreprocessingResultsKey; GS_EXPORT NSString * const NSExtensionJavaScriptFinalizeArgumentKey; GS_EXPORT NSString * const NSItemProviderErrorDomain; enum { NSItemProviderUnknownError = -1, NSItemProviderItemUnavailableError = -1000, NSItemProviderUnexpectedValueClassError = -1100, NSItemProviderUnavailableCoercionError = -1200 }; typedef NSInteger NSItemProviderErrorCode; #if defined(__cplusplus) } #endif #endif /* GS_API_MACOSX */ #endif /* _NSItemProvider_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSItemProviderReadingWriting.h000066400000000000000000000026101435650067400255530ustar00rootroot00000000000000/* Definition of class NSItemProviderReadingWriting Copyright (C) 2019 Free Software Foundation, Inc. By: heron Date: Sun Nov 10 04:00:24 EST 2019 This file is part of the GNUstep Library. 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 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 USA. */ #ifndef _NSItemProviderReadingWriting_h_GNUSTEP_BASE_INCLUDE #define _NSItemProviderReadingWriting_h_GNUSTEP_BASE_INCLUDE #include #if OS_API_VERSION(MAC_OS_X_VERSION_10_0, GS_API_LATEST) #if defined(__cplusplus) extern "C" { #endif GS_EXPORT_CLASS @interface NSItemProviderReadingWriting : NSObject @end #if defined(__cplusplus) } #endif #endif /* GS_API_MACOSX */ #endif /* _NSItemProviderReadingWriting_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSJSONSerialization.h000066400000000000000000000036141435650067400236200ustar00rootroot00000000000000#import "Foundation/NSObject.h" @class NSData; @class NSError; @class NSInputStream; @class NSOutputStream; enum { /** * Collection classes created from reading a JSON stream will be mutable. */ NSJSONReadingMutableContainers = (1UL << 0), /** * Strings in a JSON tree will be mutable. */ NSJSONReadingMutableLeaves = (1UL << 1), /** * The parser will read a single value, not just a */ NSJSONReadingAllowFragments = (1UL << 2) }; enum { /** * When writing JSON, produce indented output intended for humans to read. * If this is not set, then the writer will not generate any superfluous * whitespace, producing space-efficient but not very human-friendly JSON. */ NSJSONWritingPrettyPrinted = (1UL << 0) }; /** * A bitmask containing flags from the NSJSONWriting* set, specifying options * to use when writing JSON. */ typedef NSUInteger NSJSONWritingOptions; /** * A bitmask containing flags from the NSJSONReading* set, specifying options * to use when reading JSON. */ typedef NSUInteger NSJSONReadingOptions; /** * NSJSONSerialization implements serializing and deserializing acyclic object * graphs in JSON. */ GS_EXPORT_CLASS @interface NSJSONSerialization : NSObject + (NSData*) dataWithJSONObject: (id)obj options: (NSJSONWritingOptions)opt error: (NSError **)error; + (BOOL) isValidJSONObject: (id)obj; + (id) JSONObjectWithData: (NSData *)data options: (NSJSONReadingOptions)opt error: (NSError **)error; + (id) JSONObjectWithStream: (NSInputStream *)stream options: (NSJSONReadingOptions)opt error: (NSError **)error; + (NSInteger) writeJSONObject: (id)obj toStream: (NSOutputStream *)stream options: (NSJSONWritingOptions)opt error: (NSError **)error; @end gnustep-base-1.29.0/Headers/Foundation/NSKeyValueCoding.h000066400000000000000000000363511435650067400231660ustar00rootroot00000000000000 /* Interface for NSKeyValueCoding for GNUStep Copyright (C) 2000 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 2000 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSKeyValueCoding_h_GNUSTEP_BASE_INCLUDE #define __NSKeyValueCoding_h_GNUSTEP_BASE_INCLUDE #import #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) #import #if defined(__cplusplus) extern "C" { #endif @class NSArray; @class NSMutableArray; @class NSSet; @class NSMutableSet; @class NSDictionary; @class NSError; @class NSString; /** An exception for an unknown key in [NSObject(NSKeyValueCoding)]. */ GS_EXPORT NSString* const NSUndefinedKeyException; /** *

This describes an informal protocol for key-value coding, a * mechanism whereby the fields of an object may be accessed and set using * generic methods in conjunction with string keys rather than field-specific * methods. Key-based access loses compile-time validity checking, but can be * convenient in certain kinds of situations.

* *

The basic methods are implemented as a category of the [NSObject] class, * but other classes override those default implementations to perform more * specific operations.

*/ @interface NSObject (NSKeyValueCoding) /** * Controls whether the NSKeyValueCoding methods may attempt to * access instance variables directly. * NSObject's implementation returns YES. */ + (BOOL) accessInstanceVariablesDirectly; /** * Controls whether -storedValueForKey: and -takeStoredValue:forKey: may use * the stored accessor mechanism. If not the calls get redirected to * -valueForKey: and -takeValue:forKey: effectively changing the search order * of private/public accessor methods and instance variables. * NSObject's implementation returns YES. */ + (BOOL) useStoredAccessor; /** * Returns a dictionary built from values obtained for the specified keys.
* By default this is derived by calling -valueForKey: for each key. * Any nil values obtained are represented by an [NSNull] instance. */ - (NSDictionary*) dictionaryWithValuesForKeys: (NSArray*)keys; /** * Deprecated ... use -valueForUndefinedKey: instead. */ - (id) handleQueryWithUnboundKey: (NSString*)aKey; /** * Deprecated, use -setValue:forUndefinedKey: instead. */ - (void) handleTakeValue: (id)anObject forUnboundKey: (NSString*)aKey; /** * Returns a mutable array value for a given key. This method: * * Searches the receiver for methods matching the patterns * insertObject:in<Key>AtIndex: and * removeObjectFrom<Key>AtIndex:. If both * methods are found, each message sent to the proxy array will result in the * invocation of one or more of these methods. If * replaceObjectIn<Key>AtIndex:withObject: * is also found in the receiver it * will be used when appropriate for better performance. * If the set of methods is not found, searches the receiver for a the * method set<Key>:. Each message sent to the proxy array will result in * the invocation of set<Key>: * If the previous do not match, and accessInstanceVariablesDirectly * returns YES, searches for an instance variable matching _<key> or * <key> (in that order). If the instance variable is found, * messages sent * to the proxy object will be forwarded to the instance variable. * If none of the previous are found, raises an NSUndefinedKeyException * * */ - (NSMutableArray*) mutableArrayValueForKey: (NSString*)aKey; /** * Returns a mutable array value for the given key path. */ - (NSMutableArray*) mutableArrayValueForKeyPath: (NSString*)aKey; /** * Returns a mutable set value for a given key. This method: * * Searches the receiver for methods matching the patterns * add<Key>Object:, remove<Key>Object:, * add<Key>:, and remove<Key>:, which * correspond to the NSMutableSet methods addObject:, removeObject:, * unionSet:, and minusSet:, respectively. If at least one addition * and one removal method are found, each message sent to the proxy set * will result in the invocation of one or more of these methods. If * intersect<Key>: or set<Key>: * is also found in the receiver, the method(s) * will be used when appropriate for better performance. * If the set of methods is not found, searches the receiver for a the * method set<Key>:. Each message sent to the proxy set will result in * the invocation of set<Key>: * If the previous do not match, and accessInstanceVariablesDirectly * returns YES, searches for an instance variable matching _<key> or * <key> (in that order). If the instance variable is found, * messages sent * to the proxy object will be forwarded to the instance variable. * If none of the previous are found, raises an NSUndefinedKeyException * * */ - (NSMutableSet*) mutableSetValueForKey: (NSString *)aKey; /** * Returns a mutable set value for the given key path. */ - (NSMutableSet*) mutableSetValueForKeyPath: (NSString*)aKey; /** * This method is invoked by the NSKeyValueCoding mechanism when an attempt * is made to set an null value for a scalar attribute. This implementation * raises an NSInvalidArgument exception. Subclasses my override this method * to do custom handling. (E.g. setting the value to the equivalent of 0.) */ - (void) setNilValueForKey: (NSString*)aKey; /** * Sets the value if the attribute associated with the key in the receiver. * The object is converted to a scalar attribute where applicable (and * -setNilValueForKey: is called if a nil value is supplied). * Tries to use a standard accessor of the form setKey: where 'Key' is the * supplied argument with the first letter converted to uppercase.
* If the receiver's class allows +accessInstanceVariablesDirectly * it continues with instance variables: * * _key * _isKey * key * isKey * * Invokes -setValue:forUndefinedKey: if no accessor mechanism can be found * and raises NSInvalidArgumentException if the accessor method doesn't take * exactly one argument or the type is unsupported (e.g. structs). * If the receiver expects a scalar value and the value supplied * is the NSNull instance or nil, this method invokes * -setNilValueForKey: . */ - (void) setValue: (id)anObject forKey: (NSString*)aKey; /** * Retrieves the object returned by invoking -valueForKey: * on the receiver with the first key component supplied by the key path. * Then invokes -setValue:forKeyPath: recursively on the * returned object with rest of the key path. * The key components are delimited by '.'. * If the key path doesn't contain any '.', this method simply * invokes -setValue:forKey:. */ - (void) setValue: (id)anObject forKeyPath: (NSString*)aKey; /** * Invoked when -setValue:forKey: / -takeStoredValue:forKey: are called with * a key which can't be associated with an accessor method or instance * variable. Subclasses may override this method to add custom handling. * NSObject raises an NSUndefinedKeyException, with a userInfo dictionary * containing NSTargetObjectUserInfoKey with the receiver an * NSUnknownUserInfoKey with the supplied key entries.
* Called when the key passed to -setValue:forKey: cannot be used. */ - (void) setValue: (id)anObject forUndefinedKey: (NSString*)aKey; /** * Uses -setValue:forKey: to place the values from aDictionary in the * receiver. */ - (void) setValuesForKeysWithDictionary: (NSDictionary*)aDictionary; /** * Returns the value associated with the supplied key as an object. * Scalar attributes are converted to corresponding objects. * Uses private accessors in favor of the public ones, if the receiver's * class allows +useStoredAccessor. Otherwise this method invokes * -valueForKey:. * The search order is:
* Private accessor methods: * * _getKey * _key * * If the receiver's class allows +accessInstanceVariablesDirectly * it continues with instance variables: * * _key * key * * Public accessor methods: * * getKey * key * * Invokes -handleTakeValue:forUnboundKey: if no accessor mechanism can be * found and raises NSInvalidArgumentException if the accessor method takes * takes any arguments or the type is unsupported (e.g. structs). */ - (id) storedValueForKey: (NSString*)aKey; /** * Sets the value associated with the supplied in the receiver. * The object is converted to the scalar attribute where applicable. * Uses the private accessors in favor of the public ones, if the * receiver's class allows +useStoredAccessor . * Otherwise this method invokes -takeValue:forKey: . * The search order is:
* Private accessor methods: * * _setKey: * * If the receiver's class allows accessInstanceVariablesDirectly * it continues with instance variables: * * _key * key * * Public accessor methods: * * setKey: * * Invokes -handleTakeValue:forUnboundKey: * if no accessor mechanism can be found * and raises NSInvalidArgumentException if the accessor method doesn't take * exactly one argument or the type is unsupported (e.g. structs). * If the receiver expects a scalar value and the value supplied * is the NSNull instance or nil, this method invokes * -unableToSetNilForKey: . */ - (void) takeStoredValue: (id)anObject forKey: (NSString*)aKey; /** * Iterates over the dictionary invoking -takeStoredValue:forKey: * on the receiver for each key-value pair, converting NSNull to nil. */ - (void) takeStoredValuesFromDictionary: (NSDictionary*)aDictionary; /** * Sets the value if the attribute associated with the key in the receiver. * The object is converted to a scalar attribute where applicable. * Uses the public accessors in favor of the private ones. * The search order is:
* Accessor methods: * * setKey: * _setKey: * * If the receiver's class allows +accessInstanceVariablesDirectly * it continues with instance variables: * * key * _key * * Invokes -handleTakeValue:forUnboundKey: * if no accessor mechanism can be found * and raises NSInvalidArgumentException if the accessor method doesn't take * exactly one argument or the type is unsupported (e.g. structs). * If the receiver expects a scalar value and the value supplied * is the NSNull instance or nil, this method invokes * -unableToSetNilForKey: .
* Deprecated ... use -setValue:forKey: instead. */ - (void) takeValue: (id)anObject forKey: (NSString*)aKey; /** * Retrieves the object returned by invoking -valueForKey: * on the receiver with the first key component supplied by the key path. * Then invokes -takeValue:forKeyPath: recursively on the * returned object with rest of the key path. * The key components are delimited by '.'. * If the key path doesn't contain any '.', this method simply * invokes -takeValue:forKey:.
* Deprecated ... use -setValue:forKeyPath: instead. */ - (void) takeValue: (id)anObject forKeyPath: (NSString*)aKey; /** * Iterates over the dictionary invoking -takeValue:forKey: * on the receiver for each key-value pair, converting NSNull to nil.
* Deprecated ... use -setValuesForKeysWithDictionary: instead. */ - (void) takeValuesFromDictionary: (NSDictionary*)aDictionary; /** * Deprecated ... use -setNilValueForKey: instead. */ - (void) unableToSetNilForKey: (NSString*)aKey; /** * Returns a boolean indicating whether the object pointed to by aValue * is valid for setting as an attribute of the receiver using the name * aKey. On success (YES response) it may return a new value to be used * in aValue. On failure (NO response) it may return an error in anError.
* The method works by calling a method of the receiver whose name is of * the form validateKey:error: if the receiver has implemented such a * method, otherwise it simply returns YES. */ - (BOOL) validateValue: (id*)aValue forKey: (NSString*)aKey error: (out NSError**)anError; /** * Returns the result of calling -validateValue:forKey:error: on the receiver * using aPath to determine the key value in the same manner as the * -valueForKeyPath: method. */ - (BOOL) validateValue: (id*)aValue forKeyPath: (NSString*)aKey error: (out NSError**)anError; /** * Returns the value associated with the supplied key as an object. * Scalar attributes are converted to corresponding objects.
* The search order is:
* Accessor methods: * * getKey * key * * If the receiver's class allows +accessInstanceVariablesDirectly * it continues with private accessors: * * _getKey * _key * * and then instance variables: * * key * _key * * Invokes -setValue:forUndefinedKey: * if no accessor mechanism can be found * and raises NSInvalidArgumentException if the accessor method takes * any arguments or the type is unsupported (e.g. structs). */ - (id) valueForKey: (NSString*)aKey; /** * Returns the object returned by invoking -valueForKeyPath: * recursively on the object returned by invoking -valueForKey: * on the receiver with the first key component supplied by the key path. * The key components are delimited by '.'. * If the key path doesn't contain any '.', this method simply * invokes -valueForKey: . */ - (id) valueForKeyPath: (NSString*)aKey; /** * Invoked when -valueForKey: / -storedValueForKey: are called with a key, * which can't be associated with an accessor method or instance variable. * Subclasses may override this method to add custom handling. NSObject * raises an NSUndefinedKeyException, with a userInfo dictionary containing * NSTargetObjectUserInfoKey with the receiver an NSUnknownUserInfoKey with * the supplied key entries.
*/ - (id) valueForUndefinedKey: (NSString*)aKey; /** * Iterates over the array sending the receiver -valueForKey: * for each object in the array and inserting the result in a dictionary. * All nil values returned by -valueForKey: are replaced by the * NSNull instance in the dictionary. */ - (NSDictionary*) valuesForKeys: (NSArray*)keys; @end #if defined(__cplusplus) } #endif #endif /* GS_API_MACOSX */ #endif gnustep-base-1.29.0/Headers/Foundation/NSKeyValueObserving.h000066400000000000000000000206201435650067400237110ustar00rootroot00000000000000/* Interface for NSKeyValueObserving for GNUStep Copyright (C) 2005 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 2005 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSKeyValueObserving_h_GNUSTEP_BASE_INCLUDE #define __NSKeyValueObserving_h_GNUSTEP_BASE_INCLUDE #import #if OS_API_VERSION(MAC_OS_X_VERSION_10_3,GS_API_LATEST) && GS_API_VERSION( 10200,GS_API_LATEST) #import #import #if defined(__cplusplus) extern "C" { #endif @class NSIndexSet; @class NSSet; @class NSString; enum { NSKeyValueObservingOptionNew = 1, NSKeyValueObservingOptionOld = 2 #if OS_API_VERSION(MAC_OS_X_VERSION_10_5,GS_API_LATEST) , NSKeyValueObservingOptionInitial = 4, NSKeyValueObservingOptionPrior = 8 #endif }; typedef NSUInteger NSKeyValueObservingOptions; enum { NSKeyValueChangeSetting = 1, NSKeyValueChangeInsertion = 2, NSKeyValueChangeRemoval = 3, NSKeyValueChangeReplacement = 4 }; typedef NSUInteger NSKeyValueChange; enum { NSKeyValueUnionSetMutation = 1, NSKeyValueMinusSetMutation = 2, NSKeyValueIntersectSetMutation = 3, NSKeyValueSetSetMutation = 4 }; typedef NSUInteger NSKeyValueSetMutationKind; GS_EXPORT NSString *const NSKeyValueChangeIndexesKey; GS_EXPORT NSString *const NSKeyValueChangeKindKey; GS_EXPORT NSString *const NSKeyValueChangeNewKey; GS_EXPORT NSString *const NSKeyValueChangeOldKey; #if OS_API_VERSION(MAC_OS_X_VERSION_10_5,GS_API_LATEST) GS_EXPORT NSString *const NSKeyValueChangeNotificationIsPriorKey; #endif /* Given that the receiver has been registered as an observer * of the value at a key path relative to an object, * be notified that the value has changed. * The change dictionary always contains an NSKeyValueChangeKindKey entry * whose value is an NSNumber wrapping an NSKeyValueChange * (use [NSNumber-intValue]). The meaning of NSKeyValueChange * depends on what sort of property is identified by the key path: * * For any sort of property (attribute, to-one relationship, * or ordered or unordered to-many relationship) NSKeyValueChangeSetting * indicates that the observed object has received a -setValue:forKey: * message, or that the key-value coding-compliant set method for the * key has been invoked, or that a -willChangeValueForKey: or * -didChangeValueForKey: pair has otherwise been invoked. * * For an _ordered_ to-many relationship, NSKeyValueChangeInsertion, * NSKeyValueChangeRemoval, and NSKeyValueChangeReplacement indicate * that a mutating message has been sent to the array returned by * a -mutableArrayValueForKey: message sent to the object, or that * one of the key-value coding-compliant array mutation methods for * the key has been invoked, or that a -willChange:valuesAtIndexes:forKey: * or -didChange:valuesAtIndexes:forKey: pair has otherwise been invoked. * * For an _unordered_ to-many relationship (introduced in Mac OS 10.4), * NSKeyValueChangeInsertion, NSKeyValueChangeRemoval, * and NSKeyValueChangeReplacement indicate that a mutating * message has been sent to the set returned by a -mutableSetValueForKey: * message sent to the object, or that one of the key-value * coding-compliant set mutation methods for the key has been invoked, * or that a -willChangeValueForKey:withSetMutation:usingObjects: * or -didChangeValueForKey:withSetMutation:usingObjects: pair has * otherwise been invoked. * * For any sort of property, the change dictionary always contains * an NSKeyValueChangeNewKey entry if NSKeyValueObservingOptionNew * was specified at observer-registration time, likewise for * NSKeyValueChangeOldKey if NSKeyValueObservingOptionOld was specified. * See the comments for the NSKeyValueObserverNotification informal * protocol methods for what the values of those entries will be. * For an _ordered_ to-many relationship, the change dictionary * always contains an NSKeyValueChangeIndexesKey entry whose value * is an NSIndexSet containing the indexes of the inserted, removed, * or replaced objects, unless the change is an NSKeyValueChangeSetting. * context is always the same pointer that was passed in at * observer-registration time. */ @interface NSObject (NSKeyValueObserving) - (void) observeValueForKeyPath: (NSString*)aPath ofObject: (id)anObject change: (NSDictionary*)aChange context: (void*)aContext; @end @interface NSObject (NSKeyValueObserverRegistration) - (void) addObserver: (NSObject*)anObserver forKeyPath: (NSString*)aPath options: (NSKeyValueObservingOptions)options context: (void*)aContext; - (void) removeObserver: (NSObject*)anObserver forKeyPath: (NSString*)aPath; @end @interface NSArray (NSKeyValueObserverRegistration) - (void) addObserver: (NSObject*)anObserver toObjectsAtIndexes: (NSIndexSet*)indexes forKeyPath: (NSString*)aPath options: (NSKeyValueObservingOptions)options context: (void*)aContext; - (void) removeObserver: (NSObject*)anObserver fromObjectsAtIndexes: (NSIndexSet*)indexes forKeyPath: (NSString*)aPath; @end /** * These methods are sent to the receiver when observing it active * for a key and the key is about to be (or has just been) changed. */ @interface NSObject (NSKeyValueObserverNotification) /** */ - (void) didChangeValueForKey: (NSString*)aKey; /** */ - (void) didChange: (NSKeyValueChange)changeKind valuesAtIndexes: (NSIndexSet*)indexes forKey: (NSString*)aKey; /** */ - (void) willChangeValueForKey: (NSString*)aKey; /** */ - (void) willChange: (NSKeyValueChange)changeKind valuesAtIndexes: (NSIndexSet*)indexes forKey: (NSString*)aKey; #if OS_API_VERSION(MAC_OS_X_VERSION_10_4,GS_API_LATEST) /** */ - (void) didChangeValueForKey: (NSString*)aKey withSetMutation: (NSKeyValueSetMutationKind)mutationKind usingObjects: (NSSet*)objects; /** */ - (void) willChangeValueForKey: (NSString*)aKey withSetMutation: (NSKeyValueSetMutationKind)mutationKind usingObjects: (NSSet*)objects; #endif @end /** * These methods permit modifications to the observing system. */ @interface NSObject(NSKeyValueObservingCustomization) /** * Specifies whether the class should send the notification methods of * the NSKeyValueObserverNotification protocol when instances of the * class receive messages to change the value for the key.
* The default implementation returns YES. */ + (BOOL) automaticallyNotifiesObserversForKey: (NSString*)aKey; /** * Tells the observing system that when NSKeyValueObserverNotification * protocol messages are sent for any key in the triggerKeys array, * they should also be sent for dependentKey. */ + (void) setKeys: (NSArray*)triggerKeys triggerChangeNotificationsForDependentKey: (NSString*)dependentKey; #if OS_API_VERSION(MAC_OS_X_VERSION_10_5,GS_API_LATEST) /** * Returns a set of key paths for properties whose values affect the value * of the specified dependentKey. */ + (NSSet*) keyPathsForValuesAffectingValueForKey: (NSString*)dependentKey; #endif /** * Returns a reference to the observation information for the receiver * as stored using the -setObservationInfo: method.
* The default implementation returns information from a global table. */ - (void*) observationInfo; /** * Stores observation information for the receiver. By default this is * done in a global table, but classes may implement storage in an instance * variable or some other scheme (for improved performance). */ - (void) setObservationInfo: (void*)observationInfo; @end #if defined(__cplusplus) } #endif #endif /* 100300 */ #endif /* __NSKeyValueObserving_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSKeyedArchiver.h000066400000000000000000000476651435650067400230540ustar00rootroot00000000000000/** Interface for NSKeyedArchiver for GNUStep Copyright (C) 2004 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: January 2004 This file is part of the GNUstep Base Library. 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 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 USA. AutogsdocSource: NSKeyedArchiver.m AutogsdocSource: NSKeyedUnarchiver.m */ #ifndef __NSKeyedArchiver_h_GNUSTEP_BASE_INCLUDE #define __NSKeyedArchiver_h_GNUSTEP_BASE_INCLUDE #import #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) #if defined(__cplusplus) extern "C" { #endif #import #import #import @class NSMutableDictionary, NSMutableData, NSData, NSString; /** * Implements keyed archiving of object graphs. This archiver * should be used instead of [NSArchiver] for new implementations. Classes * implementing [(NSCoding)] should check the [NSCoder-allowsKeyedCoding] * method and if the response is YES, encode/decode their fields using the * ...forKey: [NSCoder] methods, which provide for more robust * forwards and backwards compatibility. */ GS_EXPORT_CLASS @interface NSKeyedArchiver : NSCoder { #if GS_EXPOSE(NSKeyedArchiver) @private NSMutableData *_data; /* Data to write into. */ id _delegate; /* Delegate controls operation. */ NSMapTable *_clsMap; /* Map classes to names. */ #ifndef _IN_NSKEYEDARCHIVER_M #define GSIMapTable void* #endif GSIMapTable _cIdMap; /* Conditionally coded. */ GSIMapTable _uIdMap; /* Unconditionally coded. */ GSIMapTable _repMap; /* Mappings for objects. */ #ifndef _IN_NSKEYEDARCHIVER_M #undef GSIMapTable #endif unsigned _keyNum; /* Counter for keys in object. */ NSMutableDictionary *_enc; /* Object being encoded. */ NSMutableArray *_obj; /* Array of objects. */ NSPropertyListFormat _format; BOOL _requiresSecureCoding; #endif #if GS_NONFRAGILE #else /* Pointer to private additional data used to avoid breaking ABI * when we don't have the non-fragile ABI available. * Use this mechanism rather than changing the instance variable * layout (see Source/GSInternal.h for details). */ @private id _internal GS_UNUSED_IVAR; #endif } /** * Encodes anObject and returns the resulting data object. */ + (NSData*) archivedDataWithRootObject: (id)anObject; #if OS_API_VERSION(MAC_OS_X_VERSION_10_13,GS_API_LATEST) /** * Encodes anObject and returns the resulting data object. Allows * secure coding if specified. Returns an error if an object * violates secure coding rules. */ + (NSData *) archivedDataWithRootObject: (id)anObject requiringSecureCoding: (BOOL)requiresSecureCoding error: (NSError **)error; #endif /** * Encodes anObject and writes the resulting data ti aPath. */ + (BOOL) archiveRootObject: (id)anObject toFile: (NSString*)aPath; /** * Returns the class name with which the NSKeyedArchiver class will encode * instances of aClass, or nil if no name mapping has been set using the * +setClassName:forClass: method. */ + (NSString*) classNameForClass: (Class)aClass; /** * Sets the class name with which the NSKeyedArchiver class will encode * instances of aClass. This mapping is used only if no class name * mapping has been set for the individual instance of NSKeyedArchiver * being used.
* The value of aString must be the name of an existing class.
* If the value of aString is nil, any mapping for aClass is removed. */ + (void) setClassName: (NSString*)aString forClass: (Class)aClass; /** * Returns whether the current instance of the archiver needs secure * coding. */ - (BOOL) requiresSecureCoding; /** * Sets whether the current instance of the archiver needs secure * coding. */ - (void) setRequiresSecureCoding: (BOOL)flag; /** * Returns any mapping for the name of aClass which was previously set * for the receiver using the -setClassName:forClass: method.
* Returns nil if no such mapping exists, even if one has been set * using the class method +setClassName:forClass: */ - (NSString*) classNameForClass: (Class)aClass; /** * Returns the delegate set for the receiver, or nil of none is set. */ - (id) delegate; /** * Encodes aBool and associates the encoded value with aKey. */ - (void) encodeBool: (BOOL)aBool forKey: (NSString*)aKey; /** * Encodes the data of the specified length and pointed to by aPointer, * and associates the encoded value with aKey. */ - (void) encodeBytes: (const uint8_t*)aPointer length: (NSUInteger)length forKey: (NSString*)aKey; /** * Encodes anObject and associates the encoded value with aKey, but only * if anObject has already been encoded using -encodeObject:forKey: */ - (void) encodeConditionalObject: (id)anObject forKey: (NSString*)aKey; /** * Encodes aDouble and associates the encoded value with aKey. */ - (void) encodeDouble: (double)aDouble forKey: (NSString*)aKey; /** * Encodes aFloat and associates the encoded value with aKey. */ - (void) encodeFloat: (float)aFloat forKey: (NSString*)aKey; /** * Encodes anInteger and associates the encoded value with aKey. */ - (void) encodeInt: (int)anInteger forKey: (NSString*)aKey; /** * Encodes anInteger and associates the encoded value with aKey. */ - (void) encodeInt32: (int32_t)anInteger forKey: (NSString*)aKey; /** * Encodes anInteger and associates the encoded value with aKey. */ - (void) encodeInt64: (int64_t)anInteger forKey: (NSString*)aKey; /** * Encodes anObject and associates the encoded value with aKey. */ - (void) encodeObject: (id)anObject forKey: (NSString*)aKey; /** * Ends the encoding process and causes the encoded archive to be placed * in the mutable data object supplied when the receiver was initialised.
* This method must be called at the end of encoding, and nothing may be * encoded after this method is called. */ - (void) finishEncoding; /** * Initialise the receiver to encode an archive into the supplied * data object. */ - (id) initForWritingWithMutableData: (NSMutableData*)data; /** * Returns the output format of the archived data ... this should default * to the MacOS-X binary format, but we don't support that yet, so the * -setOutputFormat: method should be used to set a supported format. */ - (NSPropertyListFormat) outputFormat; /** * Sets the name with which instances of aClass are encoded.
* The value of aString must be the name of an existing class. */ - (void) setClassName: (NSString*)aString forClass: (Class)aClass; /** * Sets the receivers delegate. The delegate should conform to the * NSObject(NSKeyedArchiverDelegate) informal protocol.
* NB. the delegate is not retained, so you must ensure that it is not * deallocated before the archiver has finished with it. */ - (void) setDelegate: (id)anObject; /** * Specifies the output format of the archived data ... this should default * to the MacOS-X binary format, but we don't support that yet, so the * -setOutputFormat: method should be used to set a supported format. */ - (void) setOutputFormat: (NSPropertyListFormat)format; @end /** * Implements keyed unarchiving of object graphs. The keyed archiver * should be used instead of [NSArchiver] for new implementations. Classes * implementing [(NSCoding)] should check the [NSCoder-allowsKeyedCoding] * method and if the response is YES, encode/decode their fields using the * ...forKey: [NSCoder] methods, which provide for more robust * forwards and backwards compatibility. */ GS_EXPORT_CLASS @interface NSKeyedUnarchiver : NSCoder { #if GS_EXPOSE(NSKeyedUnarchiver) @private NSDictionary *_archive; id _delegate; /* Delegate controls operation. */ NSMapTable *_clsMap; /* Map classes to names. */ NSArray *_objects; /* All encoded objects. */ NSDictionary *_keyMap; /* Local object name table. */ unsigned _cursor; /* Position in object. */ NSString *_archiverClass; NSString *_version; #ifndef _IN_NSKEYEDUNARCHIVER_M #define GSIArray void* #endif GSIArray _objMap; /* Decoded objects. */ #ifndef _IN_NSKEYEDUNARCHIVER_M #undef GSIArray #endif NSZone *_zone; /* Zone for allocating objs. */ BOOL _requiresSecureCoding; #endif #if GS_NONFRAGILE #else /* Pointer to private additional data used to avoid breaking ABI * when we don't have the non-fragile ABI available. * Use this mechanism rather than changing the instance variable * layout (see Source/GSInternal.h for details). */ @private id _internal GS_UNUSED_IVAR; #endif } /** * Returns class substituted for class name specified by aString when * encountered in the archive being decoded from, or nil if there is no * specific translation mapping. Each instance also maintains a translation * map, which is searched first for a match during decoding. */ + (Class) classForClassName: (NSString*)aString; /** * Sets class substituted for class name specified by aString when * encountered in the archive being decoded from, or nil if there is no * specific translation mapping. Each instance also maintains a translation * map, which is searched first for a match during decoding. */ + (void) setClass: (Class)aClass forClassName: (NSString*)aString; /** * Decodes from byte array in data and returns resulting root object. */ + (id) unarchiveObjectWithData: (NSData*)data; /** * Decodes from file contents at aPath and returns resulting root object. */ + (id) unarchiveObjectWithFile: (NSString*)aPath; /** * Returns whether the current instance of the archiver needs secure * coding. */ - (BOOL) requiresSecureCoding; /** * Sets whether the current instance of the archiver needs secure * coding. */ - (void) setRequiresSecureCoding: (BOOL)flag; /** * Returns class substituted for class name specified by aString when * encountered in the archive being decoded from, or nil if there is no * specific translation mapping. The class as a whole also maintains a * translation map, which is searched on decoding if no match found here. */ - (Class) classForClassName: (NSString*)aString; /** * Sets class substituted for class name specified by aString when * encountered in the archive being decoded from, or nil if there is no * specific translation mapping. Each instance also maintains a translation * map, which is searched first for a match during decoding. */ - (BOOL) containsValueForKey: (NSString*)aKey; /** * Sets class substituted for class name specified by aString when * encountered in the archive being decoded from, or nil if there is no * specific translation mapping. Each instance also maintains a translation * map, which is searched first for a match during decoding. */ - (void) setClass: (Class)aClass forClassName: (NSString*)aString; /** * Returns a boolean value associated with aKey. This value must previously * have been encoded using -encodeBool:forKey: */ - (BOOL) decodeBoolForKey: (NSString*)aKey; /** * Returns a pointer to a byte array associated with aKey.
* Returns the length of the data in aLength.
* This value must previously have been encoded using * -encodeBytes:length:forKey: */ - (const uint8_t*) decodeBytesForKey: (NSString*)aKey returnedLength: (NSUInteger*)length; /** * Returns a double value associated with aKey. This value must previously * have been encoded using -encodeDouble:forKey: or -encodeFloat:forKey: */ - (double) decodeDoubleForKey: (NSString*)aKey; /** * Returns a float value associated with aKey. This value must previously * have been encoded using -encodeFloat:forKey: or -encodeDouble:forKey:
* Precision may be lost (or an exception raised if the value will not fit * in a float) if the value was encoded using -encodeDouble:forKey:, */ - (float) decodeFloatForKey: (NSString*)aKey; /** * Returns an integer value associated with aKey. This value must previously * have been encoded using -encodeInt:forKey:, -encodeInt32:forKey:, or * -encodeInt64:forKey:.
* An exception will be raised if the value does not fit in an integer. */ - (int) decodeIntForKey: (NSString*)aKey; /** * Returns a 32-bit integer value associated with aKey. This value must * previously have been encoded using -encodeInt:forKey:, * -encodeInt32:forKey:, or -encodeInt64:forKey:.
* An exception will be raised if the value does not fit in a 32-bit integer. */ - (int32_t) decodeInt32ForKey: (NSString*)aKey; /** * Returns a 64-bit integer value associated with aKey. This value must * previously have been encoded using -encodeInt:forKey:, * -encodeInt32:forKey:, or -encodeInt64:forKey:. */ - (int64_t) decodeInt64ForKey: (NSString*)aKey; /** * Returns an object value associated with aKey. This value must * previously have been encoded using -encodeObject:forKey: or * -encodeConditionalObject:forKey: */ - (id) decodeObjectForKey: (NSString*)aKey; /** * Returns the delegate of the unarchiver. */ - (id) delegate; /** * Tells receiver that you are done retrieving from archive, so the delegate * should be allowed to perform close-up operations. */ - (void) finishDecoding; /** * Prepare to read data from key archive (created by [NSKeyedArchiver]). * Be sure to call -finishDecoding when done. */ - (id) initForReadingWithData: (NSData*)data; /** * Sets the receivers delegate. The delegate should conform to the * NSObject(NSKeyedUnarchiverDelegate) informal protocol.
* NB. the delegate is not retained, so you must ensure that it is not * deallocated before the unarchiver has finished with it. */ - (void) setDelegate: (id)delegate; @end /** * Internal methods. Do not use. */ @interface NSKeyedArchiver (Internal) - (void) _encodeArrayOfObjects: (NSArray*)anArray forKey: (NSString*)aKey; - (void) _encodePropertyList: (id)anObject forKey: (NSString*)aKey; @end /** * Internal methods. Do not use. */ @interface NSKeyedUnarchiver (Internal) - (id) _decodeArrayOfObjectsForKey: (NSString*)aKey; - (id) _decodePropertyListForKey: (NSString*)aKey; - (BOOL) replaceObject: (id)oldObj withObject: (id)newObj; @end /* Exceptions */ GS_EXPORT NSString * const NSInvalidArchiveOperationException; GS_EXPORT NSString * const NSInvalidUnarchiveOperationException; /** * Informal protocol implemented by delegates of [NSKeyedArchiver]. */ @interface NSObject (NSKeyedArchiverDelegate) /** * Sent when encoding of anObject has completed except in the case * of conditional encoding. */ - (void) archiver: (NSKeyedArchiver*)anArchiver didEncodeObject: (id)anObject; /** * Sent when anObject is about to be encoded (or conditionally encoded) * and provides the receiver with an opportunity to change the actual * object stored into the archive by returning a different value (otherwise * it should return anObject).
* The method is not called for encoding of nil or for encoding of any * object for which has already been called.
* The method is called after the -replacementObjectForKeyedArchiver: * method. */ - (id) archiver: (NSKeyedArchiver*)anArchiver willEncodeObject: (id)anObject; /** * Sent when the encoding process is complete. */ - (void) archiverDidFinish: (NSKeyedArchiver*)anArchiver; /** * Sent when the encoding process is about to finish. */ - (void) archiverWillFinish: (NSKeyedArchiver*)anArchiver; /** * Sent whenever object replacement occurs during encoding, either by the * -replacementObjectForKeyedArchiver: method or because the delegate has * returned a changed value using the -archiver:willEncodeObject: method. */ - (void) archiver: (NSKeyedArchiver*)anArchiver willReplaceObject: (id)anObject withObject: (id)newObject; @end /** * Informal protocol implemented by delegates of [NSKeyedUnarchiver]. */ @interface NSObject (NSKeyedUnarchiverDelegate) /** * Sent if the named class is not available during decoding.
* The value of aName is the class name being decoded (after any name mapping * has been applied).
* The classNames array contains the original name of the class encoded * in the archive, and is followed by each of its superclasses in turn.
* The delegate may either return a class object for the unarchiver to use * to continue decoding, or may return nil to abort the decoding process. */ - (Class) unarchiver: (NSKeyedUnarchiver*)anUnarchiver cannotDecodeObjectOfClassName: (NSString*)aName originalClasses: (NSArray*)classNames; /** * Sent when anObject is decoded. The receiver may return either anObject * or some other object (including nil). If a value other than anObject is * returned, it is used to replace anObject. */ - (id) unarchiver: (NSKeyedUnarchiver*)anUnarchiver didDecodeObject: (id)anObject; /** * Sent when unarchiving is about to complete. */ - (void) unarchiverDidFinish: (NSKeyedUnarchiver*)anUnarchiver; /** * Sent when unarchiving has been completed. */ - (void) unarchiverWillFinish: (NSKeyedUnarchiver*)anUnarchiver; /** * Sent whenever object replacement occurs during decoding, eg by the * -replacementObjectForKeyedArchiver: method. */ - (void) unarchiver: (NSKeyedUnarchiver*)anUnarchiver willReplaceObject: (id)anObject withObject: (id)newObject; @end /** * Methods by which a class may control its archiving by the [NSKeyedArchiver]. */ @interface NSObject (NSKeyedArchiverObjectSubstitution) /** * This message is sent to objects being encoded, to allow them to choose * to be encoded a different class. If this returns nil it is treated as * if it returned the class of the object.
* After this method is applied, any class name mapping set in the archiver * is applied to its result.
* The default implementation returns the result of the -classForArchiver * method. */ - (Class) classForKeyedArchiver; /** * This message is sent to objects being encoded, to allow them to choose * to be encoded a different object by returning the alternative object.
* The default implementation returns the result of calling * the -replacementObjectForArchiver: method with a nil argument.
* This is called only if no mapping has been set up in the archiver already. */ - (id) replacementObjectForKeyedArchiver: (NSKeyedArchiver*)archiver; @end /** * Methods by which a class may control its unarchiving by the * [NSKeyedArchiver]. */ @interface NSObject (NSKeyedUnarchiverObjectSubstitution) /** * Sent during unarchiving to permit classes to substitute a different * class for decoded instances of themselves.
* Default implementation returns the receiver.
* Overrides the mappings set up within the receiver. */ + (Class) classForKeyedUnarchiver; @end /** * Methods for encoding/decoding points, rectangles, and sizes. */ @interface NSCoder (NSGeometryKeyedCoding) /** * Encodes an NSPoint object. */ - (void) encodePoint: (NSPoint)aPoint forKey: (NSString*)aKey; /** * Encodes an NSRect object. */ - (void) encodeRect: (NSRect)aRect forKey: (NSString*)aKey; /** * Encodes an NSSize object. */ - (void) encodeSize: (NSSize)aSize forKey: (NSString*)aKey; /** * Decodes an NSPoint object. */ - (NSPoint) decodePointForKey: (NSString*)aKey; /** * Decodes an NSRect object. */ - (NSRect) decodeRectForKey: (NSString*)aKey; /** * Decodes an NSSize object. */ - (NSSize) decodeSizeForKey: (NSString*)aKey; @end #if defined(__cplusplus) } #endif #endif /* GS_API_MACOSX */ #endif /* __NSKeyedArchiver_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSLengthFormatter.h000066400000000000000000000051251435650067400234150ustar00rootroot00000000000000/* Definition of class NSLengthFormatter Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory John Casamento Date: Tue Oct 8 13:30:33 EDT 2019 This file is part of the GNUstep Library. 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 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 USA. */ #ifndef _NSLengthFormatter_h_GNUSTEP_BASE_INCLUDE #define _NSLengthFormatter_h_GNUSTEP_BASE_INCLUDE #import #if OS_API_VERSION(MAC_OS_X_VERSION_10_10, GS_API_LATEST) #if defined(__cplusplus) extern "C" { #endif enum { NSLengthFormatterUnitMillimeter = 8, NSLengthFormatterUnitCentimeter = 9, NSLengthFormatterUnitMeter = 11, NSLengthFormatterUnitKilometer = 14, NSLengthFormatterUnitInch = (5 << 8) + 1, NSLengthFormatterUnitFoot = (5 << 8) + 2, NSLengthFormatterUnitYard = (5 << 8) + 3, NSLengthFormatterUnitMile = (5 << 8) + 4, }; typedef NSInteger NSLengthFormatterUnit; @class NSNumberFormatter, NSString; GS_EXPORT_CLASS @interface NSLengthFormatter : NSFormatter { BOOL _isForPersonHeightUse; NSNumberFormatter *_numberFormatter; NSFormattingUnitStyle _unitStyle; } - (NSNumberFormatter *) numberFormatter; - (void) setNumberFormatter: (NSNumberFormatter *)formatter; - (NSFormattingUnitStyle) unitStyle; - (void) setUnitStyle: (NSFormattingUnitStyle)style; - (BOOL) isForPersonHeightUse; - (void) setForPersonHeightUse: (BOOL)flag; - (NSString *) stringFromValue: (double)value unit: (NSLengthFormatterUnit)unit; - (NSString *) stringFromMeters: (double)numberInMeters; - (NSString *) unitStringFromValue: (double)value unit: (NSLengthFormatterUnit)unit; - (NSString *) unitStringFromMeters: (double)numberInMeters usedUnit: (NSLengthFormatterUnit *)unit; - (BOOL) getObjectValue: (id *)obj forString: (NSString *)string errorDescription: (NSString **)error; @end #if defined(__cplusplus) } #endif #endif /* GS_API_MACOSX */ #endif /* _NSLengthFormatter_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSLinguisticTagger.h000066400000000000000000000231401435650067400235510ustar00rootroot00000000000000/* Definition of class NSLinguisticTagger Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory John Casamento Date: Sat Nov 2 21:37:50 EDT 2019 This file is part of the GNUstep Library. 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 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 USA. */ #ifndef _NSLinguisticTagger_h_GNUSTEP_BASE_INCLUDE #define _NSLinguisticTagger_h_GNUSTEP_BASE_INCLUDE #include #include #include #if OS_API_VERSION(MAC_OS_X_VERSION_10_7, GS_API_LATEST) #if defined(__cplusplus) extern "C" { #endif @class NSString, NSArray, NSOrthography; typedef NSString* NSLinguisticTagScheme; GS_EXPORT NSLinguisticTagScheme const NSLinguisticTagSchemeTokenType; GS_EXPORT NSLinguisticTagScheme const NSLinguisticTagSchemeLexicalClass; GS_EXPORT NSLinguisticTagScheme const NSLinguisticTagSchemeNameType; GS_EXPORT NSLinguisticTagScheme const NSLinguisticTagSchemeNameTypeOrLexicalClass; GS_EXPORT NSLinguisticTagScheme const NSLinguisticTagSchemeLemma; GS_EXPORT NSLinguisticTagScheme const NSLinguisticTagSchemeLanguage; GS_EXPORT NSLinguisticTagScheme const NSLinguisticTagSchemeScript; typedef NSString* NSLinguisticTag; /* Tags for NSLinguisticTagSchemeTokenType */ GS_EXPORT NSLinguisticTag const NSLinguisticTagWord; GS_EXPORT NSLinguisticTag const NSLinguisticTagPunctuation; GS_EXPORT NSLinguisticTag const NSLinguisticTagWhitespace; GS_EXPORT NSLinguisticTag const NSLinguisticTagOther; /* Tags for NSLinguisticTagSchemeLexicalClass */ GS_EXPORT NSLinguisticTag const NSLinguisticTagNoun; GS_EXPORT NSLinguisticTag const NSLinguisticTagVerb; GS_EXPORT NSLinguisticTag const NSLinguisticTagAdjective; GS_EXPORT NSLinguisticTag const NSLinguisticTagAdverb; GS_EXPORT NSLinguisticTag const NSLinguisticTagPronoun; GS_EXPORT NSLinguisticTag const NSLinguisticTagDeterminer; GS_EXPORT NSLinguisticTag const NSLinguisticTagParticle; GS_EXPORT NSLinguisticTag const NSLinguisticTagPreposition; GS_EXPORT NSLinguisticTag const NSLinguisticTagNumber; GS_EXPORT NSLinguisticTag const NSLinguisticTagConjunction; GS_EXPORT NSLinguisticTag const NSLinguisticTagInterjection; GS_EXPORT NSLinguisticTag const NSLinguisticTagClassifier; GS_EXPORT NSLinguisticTag const NSLinguisticTagIdiom; GS_EXPORT NSLinguisticTag const NSLinguisticTagOtherWord; GS_EXPORT NSLinguisticTag const NSLinguisticTagSentenceTerminator; GS_EXPORT NSLinguisticTag const NSLinguisticTagOpenQuote; GS_EXPORT NSLinguisticTag const NSLinguisticTagCloseQuote; GS_EXPORT NSLinguisticTag const NSLinguisticTagOpenParenthesis; GS_EXPORT NSLinguisticTag const NSLinguisticTagCloseParenthesis; GS_EXPORT NSLinguisticTag const NSLinguisticTagWordJoiner; GS_EXPORT NSLinguisticTag const NSLinguisticTagDash; GS_EXPORT NSLinguisticTag const NSLinguisticTagOtherPunctuation; GS_EXPORT NSLinguisticTag const NSLinguisticTagParagraphBreak; GS_EXPORT NSLinguisticTag const NSLinguisticTagOtherWhitespace; /* Tags for NSLinguisticTagSchemeNameType */ GS_EXPORT NSLinguisticTag const NSLinguisticTagPersonalName; GS_EXPORT NSLinguisticTag const NSLinguisticTagPlaceName; GS_EXPORT NSLinguisticTag const NSLinguisticTagOrganizationName; enum { NSLinguisticTaggerUnitWord, NSLinguisticTaggerUnitSentence, NSLinguisticTaggerUnitParagraph, NSLinguisticTaggerUnitDocument }; typedef NSUInteger NSLinguisticTaggerUnit; enum { NSLinguisticTaggerOmitWords = 1 << 0, NSLinguisticTaggerOmitPunctuation = 1 << 1, NSLinguisticTaggerOmitWhitespace = 1 << 2, NSLinguisticTaggerOmitOther = 1 << 3, NSLinguisticTaggerJoinNames = 1 << 4 }; typedef NSUInteger NSLinguisticTaggerOptions; DEFINE_BLOCK_TYPE(GSLinguisticTagRangeBoolBlock, void, NSLinguisticTag, NSRange, BOOL); DEFINE_BLOCK_TYPE(GSLinguisticTagRangeRangeBoolBlock, void, NSLinguisticTag, NSRange, NSRange, BOOL); GS_EXPORT_CLASS @interface NSLinguisticTagger : NSObject { NSArray *_schemes; NSString *_string; NSString *_dominantLanguage; NSArray *_tokenArray; NSArray *_orthographyArray; NSUInteger _options; } - (instancetype) initWithTagSchemes: (NSArray *)tagSchemes options: (NSUInteger)opts; - (NSArray *) tagSchemes; - (NSString *) string; - (void) setString: (NSString *)string; + (NSArray *) availableTagSchemesForUnit: (NSLinguisticTaggerUnit)unit language: (NSString *)language; + (NSArray *) availableTagSchemesForLanguage: (NSString *)language; - (void) setOrthography: (NSOrthography *)orthography range: (NSRange)range; - (NSOrthography *) orthographyAtIndex: (NSUInteger)charIndex effectiveRange: (NSRangePointer)effectiveRange; - (void) stringEditedInRange: (NSRange)newRange changeInLength: (NSInteger)delta; - (NSRange) tokenRangeAtIndex: (NSUInteger)charIndex unit: (NSLinguisticTaggerUnit)unit; - (NSRange) sentenceRangeForRange: (NSRange)range; - (void) enumerateTagsInRange: (NSRange)range unit: (NSLinguisticTaggerUnit)unit scheme: (NSLinguisticTagScheme)scheme options: (NSLinguisticTaggerOptions)options usingBlock: (GSLinguisticTagRangeBoolBlock)block; - (NSLinguisticTag) tagAtIndex: (NSUInteger)charIndex unit: (NSLinguisticTaggerUnit)unit scheme: (NSLinguisticTagScheme)scheme tokenRange: (NSRangePointer)tokenRange; - (NSArray *) tagsInRange: (NSRange)range unit: (NSLinguisticTaggerUnit)unit scheme: (NSLinguisticTagScheme)scheme options: (NSLinguisticTaggerOptions)options tokenRanges: (NSArray **)tokenRanges; - (void) enumerateTagsInRange: (NSRange)range scheme: (NSLinguisticTagScheme)tagScheme options: (NSLinguisticTaggerOptions)opts usingBlock: (GSLinguisticTagRangeRangeBoolBlock)block; - (NSLinguisticTag) tagAtIndex: (NSUInteger)charIndex scheme: (NSLinguisticTagScheme)scheme tokenRange: (NSRangePointer)tokenRange sentenceRange: (NSRangePointer)sentenceRange; - (NSArray *) tagsInRange: (NSRange)range scheme: (NSString *)tagScheme options: (NSLinguisticTaggerOptions)opts tokenRanges: (NSArray **)tokenRanges; - (NSString *) dominantLanguage; + (NSString *) dominantLanguageForString: (NSString *)string; + (NSLinguisticTag) tagForString: (NSString *)string atIndex: (NSUInteger)charIndex unit: (NSLinguisticTaggerUnit)unit scheme: (NSLinguisticTagScheme)scheme orthography: (NSOrthography *)orthography tokenRange: (NSRangePointer)tokenRange; + (NSArray *)tagsForString: (NSString *)string range: (NSRange)range unit: (NSLinguisticTaggerUnit)unit scheme: (NSLinguisticTagScheme)scheme options: (NSLinguisticTaggerOptions)options orthography: (NSOrthography *)orthography tokenRanges: (NSArray **)tokenRanges; + (void) enumerateTagsForString: (NSString *)string range: (NSRange)range unit: (NSLinguisticTaggerUnit)unit scheme: (NSLinguisticTagScheme)scheme options: (NSLinguisticTaggerOptions)options orthography: (NSOrthography *)orthography usingBlock: (GSLinguisticTagRangeBoolBlock)block; - (NSArray *) possibleTagsAtIndex: (NSUInteger)charIndex scheme: (NSString *)tagScheme tokenRange: (NSRangePointer)tokenRange sentenceRange: (NSRangePointer)sentenceRange scores: (NSArray **)scores; @end @interface NSString (NSLinguisticAnalysis) - (NSArray *) linguisticTagsInRange: (NSRange)range scheme: (NSLinguisticTagScheme)scheme options: (NSLinguisticTaggerOptions)options orthography: (NSOrthography *)orthography tokenRanges: (NSArray **)tokenRanges; - (void) enumerateLinguisticTagsInRange: (NSRange)range scheme: (NSLinguisticTagScheme)scheme options: (NSLinguisticTaggerOptions)options orthography: (NSOrthography *)orthography usingBlock: (GSLinguisticTagRangeRangeBoolBlock)block; @end #if defined(__cplusplus) } #endif #endif /* GS_API_MACOSX */ #endif /* _NSLinguisticTagger_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSLocale.h000066400000000000000000000200611435650067400215030ustar00rootroot00000000000000/* NSLocale.h Copyright (C) 2010 Free Software Foundation, Inc. Written by: Stefan Bidigaray, Richard Frith-Macdonald Date: June, 2010 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 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; see the file COPYING.LIB. If not, see or write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __NSLocale_h_GNUSTEP_BASE_INCLUDE #define __NSLocale_h_GNUSTEP_BASE_INCLUDE #import #if OS_API_VERSION(MAC_OS_X_VERSION_10_4, GS_API_LATEST) #import #if defined(__cplusplus) extern "C" { #endif @class NSMutableDictionary; @class NSString; @class NSCharacterSet; typedef NSUInteger NSLocaleLanguageDirection; enum { NSLocaleLanguageDirectionUnknown = 0, NSLocaleLanguageDirectionLeftToRight = 1, NSLocaleLanguageDirectionRightToLeft = 2, NSLocaleLanguageDirectionTopToBottom = 3, NSLocaleLanguageDirectionBottomToTop = 4 }; GS_EXPORT NSString * const NSCurrentLocaleDidChangeNotification; // // NSLocale Component Keys // GS_EXPORT NSString * const NSLocaleIdentifier; GS_EXPORT NSString * const NSLocaleLanguageCode; GS_EXPORT NSString * const NSLocaleCountryCode; GS_EXPORT NSString * const NSLocaleScriptCode; GS_EXPORT NSString * const NSLocaleVariantCode; GS_EXPORT NSString * const NSLocaleExemplarCharacterSet; GS_EXPORT NSString * const NSLocaleCalendarIdentifier; GS_EXPORT NSString * const NSLocaleCalendar; GS_EXPORT NSString * const NSLocaleCollationIdentifier; GS_EXPORT NSString * const NSLocaleUsesMetricSystem; GS_EXPORT NSString * const NSLocaleMeasurementSystem; GS_EXPORT NSString * const NSLocaleDecimalSeparator; GS_EXPORT NSString * const NSLocaleGroupingSeparator; GS_EXPORT NSString * const NSLocaleCurrencySymbol; GS_EXPORT NSString * const NSLocaleCurrencyCode; GS_EXPORT NSString * const NSLocaleCollatorIdentifier; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) GS_EXPORT NSString * const NSLocaleQuotationBeginDelimiterKey; GS_EXPORT NSString * const NSLocaleQuotationEndDelimiterKey; GS_EXPORT NSString * const NSLocaleAlternateQuotationBeginDelimiterKey; GS_EXPORT NSString * const NSLocaleAlternateQuotationEndDelimiterKey; #endif // // NSLocale Calendar Keys // GS_EXPORT NSString * const NSGregorianCalendar; GS_EXPORT NSString * const NSBuddhistCalendar; GS_EXPORT NSString * const NSChineseCalendar; GS_EXPORT NSString * const NSHebrewCalendar; GS_EXPORT NSString * const NSIslamicCalendar; GS_EXPORT NSString * const NSIslamicCivilCalendar; GS_EXPORT NSString * const NSJapaneseCalendar; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) GS_EXPORT NSString * const NSRepublicOfChinaCalendar; GS_EXPORT NSString * const NSPersianCalendar; GS_EXPORT NSString * const NSIndianCalendar; GS_EXPORT NSString * const NSISO8601Calendar; #endif /** * Provides information describing language, date and time, and currency * information. */ GS_EXPORT_CLASS @interface NSLocale : NSObject { #if GS_EXPOSE(NSLocale) @private NSString *_localeId; NSMutableDictionary *_components; #endif #if GS_NONFRAGILE #else /* Pointer to private additional data used to avoid breaking ABI * when we don't have the non-fragile ABI available. * Use this mechanism rather than changing the instance variable * layout (see Source/GSInternal.h for details). */ @private id _internal GS_UNUSED_IVAR; #endif } #if OS_API_VERSION(MAC_OS_X_VERSION_10_5, GS_API_LATEST) /** Returns a version of the current locale which automatically updates * when locale settngs are changed. */ + (id) autoupdatingCurrentLocale; #endif /** Returns an array of NSStrings with all the available locale identifiers. */ + (NSArray *) availableLocaleIdentifiers; /** Returns the caoninical identifier for a language represented by * the supplied string. */ + (NSString *) canonicalLanguageIdentifierFromString: (NSString *)string; /** Returns the canonical identifier for a locale represented by the * supplied string. */ + (NSString *) canonicalLocaleIdentifierFromString: (NSString *)string; /** Returns the direction in which the language is written. */ + (NSLocaleLanguageDirection) characterDirectionForLanguage: (NSString *)isoLangCode; #if OS_API_VERSION(MAC_OS_X_VERSION_10_5, GS_API_LATEST) /** Returns a list of available ISO currency code strings. */ + (NSArray *) commonISOCurrencyCodes; #endif /** Parses the supplied locale identifier and returns a dictionary containing * its components.
* Components are NSLocaleLanguageCode, NSLocaleCountryCode, NSLocaleCalendar. */ + (NSDictionary *) componentsFromLocaleIdentifier: (NSString *)string; /** Returns the current locale information. */ + (instancetype) currentLocale; /** Returns an array of NSString representing all known country codes. */ + (NSArray *) ISOCountryCodes; /** Returns an array of NSString representing all known currency codes. */ + (NSArray *) ISOCurrencyCodes; /** Returns an array of NSString representing all known language codes. */ + (NSArray *) ISOLanguageCodes; /** Returns the direction in which lines of text in the specified * language are written. */ + (NSLocaleLanguageDirection) lineDirectionForLanguage: (NSString*)isoLangCode; /** Builds and returns a locale idntifier from the individual components * supplied in dict.
* Components are NSLocaleLanguageCode, NSLocaleCountryCode, NSLocaleCalendar. */ + (NSString *) localeIdentifierFromComponents: (NSDictionary*)dict; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) /** Returns the standard locale identifier for the windows locale code. */ + (NSString *) localeIdentifierFromWindowsLocaleCode: (uint32_t)lcid; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) /** Returns a locale initialised with the given locale identifier. */ + (instancetype) localeWithLocaleIdentifier:(NSString *)string; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_5, GS_API_LATEST) /** Returns an array of preferred languages. Sorted from most preferred to * leave preferred. */ + (NSArray *) preferredLanguages; #endif /** Returns the the system locale. */ + (instancetype) systemLocale; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) /** Returns the windows locale code corresponding to the staqndard locale * identifier. */ + (uint32_t) windowsLocaleCodeFromLocaleIdentifier: (NSString *)localeIdentifier; #endif /** Returns the localised representation of the supplied value converted * on the basis that it represents information whose type is specified by * the key. */ - (NSString *) displayNameForKey: (NSString *)key value: (id)value; /** Initialises the receiver to be the locale specified by the identifier. * This may result in replacement of the receiver by an existing locale. */ - (instancetype) initWithLocaleIdentifier: (NSString *)string; /** Returns the canonical identifier for the receiver (which * may differ from the identifgier used to create the receiver * since different identifiers may map to the same locale). */ - (NSString *) localeIdentifier; /** Returns the named object from the receiver locale. */ - (id) objectForKey: (id)key; #if OS_API_VERSION(MAC_OS_X_VERSION_10_12, GS_API_LATEST) - (NSString *) languageCode; - (NSString *) countryCode; - (NSString *) scriptCode; - (NSString *) variantCode; - (NSCharacterSet *) exemplarCharacterSet; - (NSString *) collationIdentifier; - (NSString *) collatorIdentifier; #endif @end #if defined(__cplusplus) } #endif #endif /* OS_API_VERSION(MAC_OS_X_VERSION_10_4, GS_API_LATEST) */ #endif /* __NSLocale_h_GNUSTEPBASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSLock.h000066400000000000000000000215161435650067400212020ustar00rootroot00000000000000/* NSLock.h Definitions for locking protocol and classes Copyright (C) 1996 Free Software Foundation, Inc. Author: Scott Christley Date: 1996 This file is part of the GNUstep Objective-C Library. 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 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. If you are interested in a warranty or support for this source code, contact Scott Christley for more information. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110 USA. */ #ifndef __NSLock_h_GNUSTEP_BASE_INCLUDE #define __NSLock_h_GNUSTEP_BASE_INCLUDE #import #import #import #if defined(__cplusplus) extern "C" { #endif /** * Protocol defining lock and unlock operations. */ @protocol NSLocking /** * Block until acquiring lock. */ - (void) lock; /** * Relinquish lock. */ - (void) unlock; @end /** *

Simplest lock for protecting critical sections of code. *

*

An NSLock is used in multi-threaded applications to protect * critical pieces of code. While one thread holds a lock within a piece of * code, another thread cannot execute that code until the first thread has * given up its hold on the lock. The limitation of NSLock is * that you can only lock an NSLock once and it must be unlocked * before it can be acquired again.
Other lock classes, notably * [NSRecursiveLock], have different restrictions. *

*/ GS_EXPORT_CLASS @interface NSLock : NSObject { #if GS_EXPOSE(NSLock) @protected gs_mutex_public_t _mutex; NSString *_name; #endif } #if !NO_GNUSTEP /** Report whether this lock is held by the current thread.
* Raises an exception if this is not supported by the system lock mechanism. */ - (BOOL) isLockedByCurrentThread; #endif /** * Try to acquire lock and return before limit, YES if succeeded, NO if not. */ - (BOOL) lockBeforeDate: (NSDate*)limit; /** * Block until acquiring lock. */ - (void) lock; /** * Try to acquire lock and return immediately, YES if succeeded, NO if not. */ - (BOOL) tryLock; /** * Relinquish lock. */ - (void) unlock; #if OS_API_VERSION(MAC_OS_X_VERSION_10_5,GS_API_LATEST) /** Return the name of the receiver or nil of none has been set. */ - (NSString*) name; /** Sets the name of the receiver (for use in debugging). */ - (void) setName: (NSString*)name; #endif @end /** * NSCondition provides an interface to POSIX condition variables. */ GS_EXPORT_CLASS @interface NSCondition : NSObject { #if GS_EXPOSE(NSCondition) @protected gs_cond_public_t _condition; gs_mutex_public_t _mutex; NSString *_name; #endif } /** * Blocks and atomically unlocks the receiver. * This method should only be called when the receiver is locked. * The caller will then block until the receiver is sent either a -signal * or -broadcast message from another thread. At which * point, the calling thread will reacquire the lock. */ - (void) wait; /** * Blocks the calling thread and acquires the lock, in the same way as -wait. * Returns YES if the condition is signaled, or NO if the timeout is reached. */ - (BOOL) waitUntilDate: (NSDate*)limit; /** * Wakes wany one of the threads that are waiting on this condition. */ - (void) signal; /** * Wakes all threads that are waiting on this condition. */ - (void) broadcast; /** * Sets the name used for debugging messages. */ - (void) setName: (NSString*)newName; /** * Returns the name used for debugging messages. */ - (NSString*) name; @end /** * Lock that allows user to request it only when an internal integer * condition is equal to a particular value. The condition is set on * initialization and whenever the lock is relinquished. */ GS_EXPORT_CLASS @interface NSConditionLock : NSObject { #if GS_EXPOSE(NSConditionLock) @protected NSCondition *_condition; int _condition_value; NSString *_name; #endif } /** * Initialize lock with given condition. */ - (id) initWithCondition: (NSInteger)value; /** * Return the current condition of the lock. */ - (NSInteger) condition; #if !NO_GNUSTEP /** Report whether this lock is held by the current thread.
* Raises an exception if this is not supported by the system lock mechanism. */ - (BOOL) isLockedByCurrentThread; #endif /* * Acquiring and releasing the lock. */ /** * Acquire lock when it is available and the internal condition is equal to * value. Blocks until this occurs. */ - (void) lockWhenCondition: (NSInteger)value; /** * Relinquish the lock, setting internal condition to value. */ - (void) unlockWithCondition: (NSInteger)value; /** * Try to acquire lock regardless of condition and return immediately, YES if * succeeded, NO if not. */ - (BOOL) tryLock; /** * Try to acquire lock if condition is equal to value and return immediately * in any case, YES if succeeded, NO if not. */ - (BOOL) tryLockWhenCondition: (NSInteger)value; /* * Acquiring the lock with a date condition. */ /** * Try to acquire lock and return before limit, YES if succeeded, NO if not. */ - (BOOL) lockBeforeDate: (NSDate*)limit; /** * Try to acquire lock, when internal condition is equal to condition_to_meet, * and return before limit, YES if succeeded, NO if not. */ - (BOOL) lockWhenCondition: (NSInteger)condition_to_meet beforeDate: (NSDate*)limitDate; /** * Block until acquiring lock. */ - (void) lock; /** * Relinquish lock. */ - (void) unlock; #if OS_API_VERSION(MAC_OS_X_VERSION_10_5,GS_API_LATEST) /** Return the name of the receiver or nil of none has been set. */ - (NSString*) name; /** Sets the name of the receiver (for use in debugging). */ - (void) setName: (NSString*)name; #endif @end /** * Allows the lock to be recursively acquired by the same thread. * * If the same thread locks the mutex (n) times then that same * thread must also unlock it (n) times before another thread * can acquire the lock. */ GS_EXPORT_CLASS @interface NSRecursiveLock : NSObject { #if GS_EXPOSE(NSRecursiveLock) @protected gs_mutex_public_t _mutex; NSString *_name; #endif } #if !NO_GNUSTEP /** Report whether this lock is held by the current thread.
* Raises an exception if this is not supported by the system lock mechanism. */ - (BOOL) isLockedByCurrentThread; #endif /** * Try to acquire lock regardless of condition and return immediately, YES if * succeeded, NO if not. */ - (BOOL) tryLock; /** * Try to acquire lock and return before limit, YES if succeeded, NO if not. */ - (BOOL) lockBeforeDate: (NSDate*)limit; /** * Block until acquiring lock. */ - (void) lock; /** * Relinquish lock. */ - (void) unlock; #if OS_API_VERSION(MAC_OS_X_VERSION_10_5,GS_API_LATEST) /** Return the name of the receiver or nil of none has been set. */ - (NSString*) name; /** Sets the name of the receiver (for use in debugging). */ - (void) setName: (NSString*)name; #endif @end #if !NO_GNUSTEP typedef void NSLock_error_handler(id obj, SEL _cmd, BOOL stop, NSString *msg); /** Code may replace this function pointer in order to intercept the normal * logging of a deadlock. */ GS_EXPORT NSLock_error_handler *_NSLock_error_handler; /** Controls tracing of locks for deadlocking. */ @interface NSObject (GSTraceLocks) /** Sets whether newly created lock objects (NSCondition, NSConditionLock, * NSLock, NSRecursiveLock but NOT NSDistributedLock) should be created so * that their use by threads is traced and deadlocks can be detected.
* Returns the old value of the setting. */ + (BOOL) shouldCreateTraceableLocks: (BOOL)shouldTrace; /** Creates and returns a single autoreleased traced condition. */ + (NSCondition*) tracedCondition; /** Creates and returns a single autoreleased traced condition lock. */ + (NSConditionLock*) tracedConditionLockWithCondition: (NSInteger)value; /** Creates and returns a single autoreleased traced lock. */ + (NSLock*) tracedLock; /** Creates and returns a single autoreleased traced recursive lock. */ + (NSRecursiveLock*) tracedRecursiveLock; @end #endif #if defined(__cplusplus) } #endif #if !NO_GNUSTEP && !defined(GNUSTEP_BASE_INTERNAL) #import #endif #endif /* __NSLock_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSMapTable.h000066400000000000000000000260551435650067400220020ustar00rootroot00000000000000/* NSMapTable interface for GNUStep. * Copyright (C) 1994, 1995, 1996, 2002, 2009 Free Software Foundation, Inc. * * Author: Albin L. Jones * Created: Tue Dec 13 00:05:02 EST 1994 * Updated: Thu Mar 21 15:12:42 EST 1996 * Serial: 96.03.21.05 * Modified by: Richard Frith-Macdonald * Updated: March 2009 * * This file is part of the GNUstep Base Library. * * 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 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 USA. */ #ifndef __NSMapTable_h_GNUSTEP_BASE_INCLUDE #define __NSMapTable_h_GNUSTEP_BASE_INCLUDE 1 #import /**** Included Headers *******************************************************/ #import #import #import #import #import #if defined(__cplusplus) extern "C" { #endif /**** Type, Constant, and Macro Definitions **********************************/ enum { NSMapTableStrongMemory = NSPointerFunctionsStrongMemory, NSMapTableZeroingWeakMemory = NSPointerFunctionsZeroingWeakMemory, NSMapTableCopyIn = NSPointerFunctionsCopyIn, NSMapTableObjectPointerPersonality = NSPointerFunctionsObjectPointerPersonality, NSMapTableWeakMemory = NSPointerFunctionsWeakMemory }; typedef NSUInteger NSMapTableOptions; GS_EXPORT_CLASS @interface GS_GENERIC_CLASS(NSMapTable, KeyT, ValT) : NSObject /** Return a map table initialised using the specified options for * keys and values. */ + (instancetype) mapTableWithKeyOptions: (NSPointerFunctionsOptions)keyOptions valueOptions: (NSPointerFunctionsOptions)valueOptions; /** Convenience method for creating a map table to store object values * using object keys. */ + (instancetype) mapTableWithStrongToStrongObjects; /** Convenience method for creating a map table to store non-retained * object values with retained object keys. */ + (instancetype) mapTableWithStrongToWeakObjects; /** Convenience method for creating a map table to store retained * object values with non-retained object keys. */ + (instancetype) mapTableWithWeakToStrongObjects; /** Convenience method for creating a map table to store non-retained * object values with non-retained object keys. */ + (instancetype) mapTableWithWeakToWeakObjects; /** Convenience method for creating a map table to store object values * using object keys. The collection will retain both the key and the value. */ + (instancetype) strongToStrongObjectsMapTable; /** Convenience method for creating a map table to store object values * using object keys. The collection will retain the key, the value will be a * zeroing weak reference. */ + (instancetype) strongToWeakObjectsMapTable; /** Convenience method for creating a map table to store object values * using object keys. The collection will retain the value, the key will be a * zeroing weak reference. */ + (instancetype) weakToStrongObjectsMapTable; /** Convenience method for creating a map table to store object values * using object keys. The collection will use zeroing weak references for both * the key and the value. */ + (instancetype) weakToWeakObjectsMapTable; /** Initialiser using option bitmasks to describe the keys and values. */ - (instancetype) initWithKeyOptions: (NSPointerFunctionsOptions)keyOptions valueOptions: (NSPointerFunctionsOptions)valueOptions capacity: (NSUInteger)initialCapacity; /** Initialiser using full pointer function information to describe * the keys and values. */ - (instancetype) initWithKeyPointerFunctions: (NSPointerFunctions*)keyFunctions valuePointerFunctions: (NSPointerFunctions*)valueFunctions capacity: (NSUInteger)initialCapacity; /** Return the number of items stored in the map. */ - (NSUInteger) count; /** Return a dictionary containing the keys and values in the receiver. */ - (NSDictionary*) dictionaryRepresentation; /** Return an enumerator able to enumerate the keys in the receiver. */ - (GS_GENERIC_CLASS(NSEnumerator, KeyT)*) keyEnumerator; /** Return an NSPointerFunctions value describind the functions used by the * receiver to handle keys. */ - (NSPointerFunctions*) keyPointerFunctions; /** Return an enumerator able to enumerate the values in the receiver. */ - (GS_GENERIC_CLASS(NSEnumerator, ValT)*) objectEnumerator; /** Return the object stored under the specified key. */ - (GS_GENERIC_TYPE(ValT)) objectForKey: (GS_GENERIC_TYPE(KeyT))aKey; /** Empty the receiver of all stored values. */ - (void) removeAllObjects; /** Remove the object stored under the specified key. */ - (void) removeObjectForKey: (GS_GENERIC_TYPE(KeyT))aKey; /** Store the object under the specified key, replacing any object which * was previously stored under that key. */ - (void) setObject: (GS_GENERIC_TYPE(ValT))anObject forKey: (GS_GENERIC_TYPE(KeyT))aKey; /** Return an NSPointerFunctions value describind the functions used by the * receiver to handle values. */ - (NSPointerFunctions*) valuePointerFunctions; @end /** * Type for enumerating.
* NB. Implementation detail ... in GNUstep the layout must * correspond to that used by the GSIMap macros. */ typedef struct { void *map; void *node; size_t bucket; } NSMapEnumerator; /** * Callback functions for a key. */ typedef struct _NSMapTableKeyCallBacks { /* * Hashing function. Must not modify the key.
* NOTE: Elements with equal values must * have equal hash function values. */ NSUInteger (*hash)(NSMapTable *, const void *); /** * Comparison function. Must not modify either key. */ BOOL (*isEqual)(NSMapTable *, const void *, const void *); /** * Retaining function called when adding elements to table.
* Notionally this must not modify the key (the key may not * actually have a retain count, or the retain count may be stored * externally to the key, but in practice this often actually * changes a counter within the key). */ void (*retain)(NSMapTable *, const void *); /** * Releasing function called when a data element is * removed from the table. This may decrease a retain count or may * actually destroy the key. */ void (*release)(NSMapTable *, void *); /** * Description function. Generates a string describing the key * and does not modify the key itself. */ NSString *(*describe)(NSMapTable *, const void *); /** * Quantity that is not a key to the map table. */ const void *notAKeyMarker; } NSMapTableKeyCallBacks; /** * Callback functions for a value. */ typedef struct _NSMapTableValueCallBacks NSMapTableValueCallBacks; struct _NSMapTableValueCallBacks { /** * Retaining function called when adding elements to table.
* Notionally this must not modify the element (the element may not * actually have a retain count, or the retain count may be stored * externally to the element, but in practice this often actually * changes a counter within the element). */ void (*retain)(NSMapTable *, const void *); /** * Releasing function called when a data element is * removed from the table. This may decrease a retain count or may * actually destroy the element. */ void (*release)(NSMapTable *, void *); /** * Description function. Generates a string describing the element * and does not modify the element itself. */ NSString *(*describe)(NSMapTable *, const void *); }; /* Quantities that are never map keys. */ #define NSNotAnIntMapKey ((const void *)0x80000000) #define NSNotAPointerMapKey ((const void *)0xffffffff) GS_EXPORT const NSMapTableKeyCallBacks NSIntegerMapKeyCallBacks; GS_EXPORT const NSMapTableKeyCallBacks NSIntMapKeyCallBacks; /*DEPRECATED*/ GS_EXPORT const NSMapTableKeyCallBacks NSNonOwnedPointerMapKeyCallBacks; GS_EXPORT const NSMapTableKeyCallBacks NSNonOwnedPointerOrNullMapKeyCallBacks; GS_EXPORT const NSMapTableKeyCallBacks NSNonRetainedObjectMapKeyCallBacks; GS_EXPORT const NSMapTableKeyCallBacks NSObjectMapKeyCallBacks; GS_EXPORT const NSMapTableKeyCallBacks NSOwnedPointerMapKeyCallBacks; GS_EXPORT const NSMapTableValueCallBacks NSIntegerMapValueCallBacks; GS_EXPORT const NSMapTableValueCallBacks NSIntMapValueCallBacks; /*DEPRECATED*/ GS_EXPORT const NSMapTableValueCallBacks NSNonOwnedPointerMapValueCallBacks; GS_EXPORT const NSMapTableValueCallBacks NSNonRetainedObjectMapValueCallBacks; GS_EXPORT const NSMapTableValueCallBacks NSObjectMapValueCallBacks; GS_EXPORT const NSMapTableValueCallBacks NSOwnedPointerMapValueCallBacks; GS_EXPORT NSMapTable * NSCreateMapTable(NSMapTableKeyCallBacks keyCallBacks, NSMapTableValueCallBacks valueCallBacks, NSUInteger capacity); GS_EXPORT NSMapTable * NSCreateMapTableWithZone(NSMapTableKeyCallBacks keyCallBacks, NSMapTableValueCallBacks valueCallBacks, NSUInteger capacity, NSZone *zone); GS_EXPORT NSMapTable * NSCopyMapTableWithZone(NSMapTable *table, NSZone *zone); GS_EXPORT void NSFreeMapTable(NSMapTable *table); GS_EXPORT void NSResetMapTable(NSMapTable *table); GS_EXPORT BOOL NSCompareMapTables(NSMapTable *table1, NSMapTable *table2); GS_EXPORT NSUInteger NSCountMapTable(NSMapTable *table); GS_EXPORT BOOL NSMapMember(NSMapTable *table, const void *key, void **originalKey, void **value); GS_EXPORT void * NSMapGet(NSMapTable *table, const void *key); GS_EXPORT void NSEndMapTableEnumeration(NSMapEnumerator *enumerator); GS_EXPORT NSMapEnumerator NSEnumerateMapTable(NSMapTable *table); GS_EXPORT BOOL NSNextMapEnumeratorPair(NSMapEnumerator *enumerator, void **key, void **value); GS_EXPORT NSArray * NSAllMapTableKeys(NSMapTable *table); GS_EXPORT NSArray * NSAllMapTableValues(NSMapTable *table); GS_EXPORT void NSMapInsert(NSMapTable *table, const void *key, const void *value); GS_EXPORT void * NSMapInsertIfAbsent(NSMapTable *table, const void *key, const void *value); GS_EXPORT void NSMapInsertKnownAbsent(NSMapTable *table, const void *key, const void *value); GS_EXPORT void NSMapRemove(NSMapTable *table, const void *key); GS_EXPORT NSString *NSStringFromMapTable (NSMapTable *table); #if defined(__cplusplus) } #endif #endif /* __NSMapTable_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSMassFormatter.h000066400000000000000000000047051435650067400231020ustar00rootroot00000000000000 /* Definition of class NSMassFormatter Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory John Casamento Date: Mon Sep 30 15:58:21 EDT 2019 This file is part of the GNUstep Library. 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 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 USA. */ #ifndef _NSMassFormatter_h_GNUSTEP_BASE_INCLUDE #define _NSMassFormatter_h_GNUSTEP_BASE_INCLUDE #import #if OS_API_VERSION(MAC_OS_X_VERSION_10_10, GS_API_LATEST) #if defined(__cplusplus) extern "C" { #endif enum { NSMassFormatterUnitGram = 11, NSMassFormatterUnitKilogram = 14, NSMassFormatterUnitOunce = (6 << 8) + 1, NSMassFormatterUnitPound = (6 << 8) + 2, NSMassFormatterUnitStone = (6 << 8) + 3, }; typedef NSInteger NSMassFormatterUnit; @class NSNumberFormatter; GS_EXPORT_CLASS @interface NSMassFormatter : NSObject { NSNumberFormatter *_numberFormatter; BOOL _isForPersonMassUse; NSFormattingUnitStyle _unitStyle; } - (NSNumberFormatter *) numberFormatter; - (void) setNumberFormatter: (NSNumberFormatter *)formatter; - (NSFormattingUnitStyle) unitStyle; - (void) setUnitStyle: (NSFormattingUnitStyle)style; - (BOOL) isForPersonMassUse; - (void) setForPersonMassUse: (BOOL)flag; - (NSString *)stringFromValue: (double)value unit: (NSMassFormatterUnit)unit; - (NSString *)stringFromKilograms: (double)numberInKilograms; - (NSString *)unitStringFromValue: (double)value unit: (NSMassFormatterUnit)unit; - (NSString *)unitStringFromKilograms: (double)numberInKilograms usedUnit: (NSMassFormatterUnit *)unitp; - (BOOL) getObjectValue: (id*)obj forString: (NSString *)string errorDescription: (NSString **)error; @end #if defined(__cplusplus) } #endif #endif /* GS_API_MACOSX */ #endif /* _NSMassFormatter_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSMeasurement.h000066400000000000000000000037141435650067400225770ustar00rootroot00000000000000/* Definition of class NSMeasurement Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory John Casamento Date: Mon Sep 30 15:58:21 EDT 2019 This file is part of the GNUstep Library. 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 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 USA. */ #ifndef _NSMeasurement_h_GNUSTEP_BASE_INCLUDE #define _NSMeasurement_h_GNUSTEP_BASE_INCLUDE #import #if OS_API_VERSION(MAC_OS_X_VERSION_10_0, GS_API_LATEST) #if defined(__cplusplus) extern "C" { #endif @class NSUnit; GS_EXPORT_CLASS @interface NSMeasurement : NSObject { NSUnit *_unit; double _doubleValue; } // Creating Measurements - (instancetype) initWithDoubleValue: (double)doubleValue unit: (NSUnit *)unit; // Accessing unit and value - (NSUnit *) unit; - (double) doubleValue; // Conversion - (BOOL) canBeConvertedToUnit: (NSUnit *)unit; - (NSMeasurement *) measurementByConvertingToUnit: (NSUnit *)unit; // Operating - (NSMeasurement *) measurementByAddingMeasurement: (NSMeasurement *)measurement; - (NSMeasurement *) measurementBySubtractingMeasurement: (NSMeasurement *)measurement; @end #if defined(__cplusplus) } #endif #endif /* GS_API_MACOSX */ #endif /* _NSMeasurement_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSMeasurementFormatter.h000066400000000000000000000046111435650067400244600ustar00rootroot00000000000000/* Definition of class NSMeasurementFormatter Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory John Casamento Date: Mon Sep 30 15:58:21 EDT 2019 This file is part of the GNUstep Library. 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 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 USA. */ #ifndef _NSMeasurementFormatter_h_GNUSTEP_BASE_INCLUDE #define _NSMeasurementFormatter_h_GNUSTEP_BASE_INCLUDE #import #if OS_API_VERSION(MAC_OS_X_VERSION_10_12, GS_API_LATEST) #if defined(__cplusplus) extern "C" { #endif @class NSLocale, NSMeasurement, NSNumberFormatter, NSUnit; enum { NSMeasurementFormatterUnitOptionsProvidedUnit = (1UL << 0), NSMeasurementFormatterUnitOptionsNaturalScale = (1UL << 1), NSMeasurementFormatterUnitOptionsTemperatureWithoutUnit = (1UL << 2), }; typedef NSUInteger NSMeasurementFormatterUnitOptions; GS_EXPORT_CLASS @interface NSMeasurementFormatter : NSFormatter { NSMeasurementFormatterUnitOptions _unitOptions; NSFormattingUnitStyle _unitStyle; NSLocale *_locale; NSNumberFormatter *_numberFormatter; } - (NSMeasurementFormatterUnitOptions) unitOptions; - (void) setUnitOptions: (NSMeasurementFormatterUnitOptions) unitOptions; - (NSFormattingUnitStyle) unitStyle; - (void) setUnitStyle: (NSFormattingUnitStyle)style; - (NSLocale *) locale; - (void) setLocale: (NSLocale *)locale; - (NSNumberFormatter *) numberFormatter; - (void) setNumberFormatter: (NSNumberFormatter *)numberFormatter; - (NSString *)stringFromMeasurement: (NSMeasurement *)measurement; - (NSString *)stringFromUnit: (NSUnit *)unit; @end #if defined(__cplusplus) } #endif #endif /* GS_API_MACOSX */ #endif /* _NSMeasurementFormatter_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSMetadata.h000066400000000000000000000115071435650067400220310ustar00rootroot00000000000000/**Interface for NSMetadataQuery for GNUStep Copyright (C) 2012 Free Software Foundation, Inc. Written by: Gregory Casamento Date: 2012 This file is part of the GNUstep Base Library. 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 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 USA. AutogsdocSource: NSMetadataQuery.h */ #ifndef __NSMetadata_h_GNUSTEP_BASE_INCLUDE #define __NSMetadata_h_GNUSTEP_BASE_INCLUDE #import #import #import #import @class NSPredicate, NSMutableDictionary, NSDictionary, NSMutableArray; @protocol NSMetadataQueryDelegate; GS_EXPORT_CLASS @interface NSMetadataItem : NSObject { #if GS_EXPOSE(NSMetadataItem) @private void *_NSMetadataItemInternal; /** Private internal data */ #endif } - (NSArray *) attributes; - (id) valueForAttribute: (NSString *)key; - (NSDictionary *) valuesForAttributes: (NSArray *)keys; @end // Metdata Query Constants... GS_EXPORT NSString * const NSMetadataQueryUserHomeScope; GS_EXPORT NSString * const NSMetadataQueryLocalComputerScope; GS_EXPORT NSString * const NSMetadataQueryNetworkScope; GS_EXPORT NSString * const NSMetadataQueryUbiquitousDocumentsScope; GS_EXPORT NSString * const NSMetadataQueryUbiquitousDataScope; GS_EXPORT NSString * const NSMetadataQueryDidFinishGatheringNotification; GS_EXPORT NSString * const NSMetadataQueryDidStartGatheringNotification; GS_EXPORT NSString * const NSMetadataQueryDidUpdateNotification; GS_EXPORT NSString * const NSMetadataQueryGatheringProgressNotification; /* Abstract interface for metadata query... */ GS_EXPORT_CLASS @interface NSMetadataQuery : NSObject { #if GS_EXPOSE(NSMetadataQuery) @private void *_NSMetadataQueryInternal; /** Private internal data */ #endif } /* Instance methods */ - (id) valueOfAttribute: (id)attr forResultAtIndex: (NSUInteger)index; - (NSArray *) groupedResults; - (NSDictionary *) valueLists; - (NSUInteger) indexOfResult: (id)result; - (NSArray *) results; - (id) resultAtIndex: (NSUInteger)index; - (NSUInteger) resultCount; // Enable/Disable updates - (void) enableUpdates; - (void) disableUpdates; // Status of the query... - (BOOL) isStopped; - (BOOL) isGathering; - (BOOL) isStarted; - (void) stopQuery; - (BOOL) startQuery; // Search URLS - (void) setSearchItemURLs: (NSArray *)urls; - (NSArray *) searchItemURLs; // Search scopes - (void) setSearchScopes: (NSArray *)scopes; - (NSArray *) searchScopes; // Notification interval - (void) setNotificationBatchingInterval: (NSTimeInterval)interval; - (NSTimeInterval) notificationBatchingInterval; // Grouping Attributes. - (void) setGroupingAttributes: (NSArray *)attrs; - (NSArray *) groupingAttributes; - (void) setValueListAttributes: (NSArray *)attrs; - (NSArray *) valueListAttributes; // Sort descriptors - (void) setSortDescriptors: (NSArray *)attrs; - (NSArray *) sortDescriptors; // Predicate - (void) setPredicate: (NSPredicate *)predicate; - (NSPredicate *) predicate; // Delegate - (void) setDelegate: (id)delegate; - (id) delegate; @end @protocol NSMetadataQueryDelegate #if OS_API_VERSION(MAC_OS_X_VERSION_10_6,GS_API_LATEST) && GS_PROTOCOLS_HAVE_OPTIONAL @optional #else @end @interface NSObject (NSMetadataQueryDelegate) #endif // GS_PROTOCOLS_HAVE_OPTIONAL - (id) metadataQuery: (NSMetadataQuery *)query replacementObjectForResultObject: (NSMetadataItem *)result; - (id) metadataQuery: (NSMetadataQuery *)query replacementValueForAttribute: (NSString *)attribute value: (id)attributeValue; @end GS_EXPORT_CLASS @interface NSMetadataQueryAttributeValueTuple : NSObject { #if GS_EXPOSE(NSMetadataQueryAttributeValueTuple) @private /** Private internal data */ void *_NSMetadataQueryAttributeValueTupleInternal; #endif } - (NSString *) attribute; - (id) value; - (NSUInteger) count; @end GS_EXPORT_CLASS @interface NSMetadataQueryResultGroup : NSObject { #if GS_EXPOSE(NSMetadataQueryResultGroup) @private void *_NSMetadataQueryResultGroupInternal; /** Private internal data */ #endif } - (NSString *) attribute; - (id) value; - (NSArray *) subgroups; - (NSUInteger) resultCount; - (id) resultAtIndex: (NSUInteger)index; - (NSArray *) results; @end #endif gnustep-base-1.29.0/Headers/Foundation/NSMetadataAttributes.h000066400000000000000000000303131435650067400240740ustar00rootroot00000000000000/* Definition of NSMetadataAttributes Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory John Casamento Date: Tue Oct 29 00:53:11 EDT 2019 This file is part of the GNUstep Library. 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 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 USA. */ #ifndef _NSMetadataAttributes_h_GNUSTEP_BASE_INCLUDE #define _NSMetadataAttributes_h_GNUSTEP_BASE_INCLUDE #include #if OS_API_VERSION(MAC_OS_X_VERSION_10_0, GS_API_LATEST) #if defined(__cplusplus) extern "C" { #endif @class NSString; GS_EXPORT NSString* const NSMetadataItemAcquisitionMakeKey; GS_EXPORT NSString* const NSMetadataItemAcquisitionModelKey; GS_EXPORT NSString* const NSMetadataItemAlbumKey; GS_EXPORT NSString* const NSMetadataItemAltitudeKey; GS_EXPORT NSString* const NSMetadataItemApertureKey; GS_EXPORT NSString* const NSMetadataItemAppleLoopDescriptorsKey; GS_EXPORT NSString* const NSMetadataItemAppleLoopsKeyFilterTypeKey; GS_EXPORT NSString* const NSMetadataItemAppleLoopsLoopModeKey; GS_EXPORT NSString* const NSMetadataItemAppleLoopsRootKeyKey; GS_EXPORT NSString* const NSMetadataItemApplicationCategoriesKey; GS_EXPORT NSString* const NSMetadataItemAttributeChangeDateKey; GS_EXPORT NSString* const NSMetadataItemAudiencesKey; GS_EXPORT NSString* const NSMetadataItemAudioBitRateKey; GS_EXPORT NSString* const NSMetadataItemAudioChannelCountKey; GS_EXPORT NSString* const NSMetadataItemAudioEncodingApplicationKey; GS_EXPORT NSString* const NSMetadataItemAudioSampleRateKey; GS_EXPORT NSString* const NSMetadataItemAudioTrackNumberKey; GS_EXPORT NSString* const NSMetadataItemAuthorAddressesKey; GS_EXPORT NSString* const NSMetadataItemAuthorEmailAddressesKey; GS_EXPORT NSString* const NSMetadataItemAuthorsKey; GS_EXPORT NSString* const NSMetadataItemBitsPerSampleKey; GS_EXPORT NSString* const NSMetadataItemCameraOwnerKey; GS_EXPORT NSString* const NSMetadataItemCFBundleIdentifierKey; GS_EXPORT NSString* const NSMetadataItemCityKey; GS_EXPORT NSString* const NSMetadataItemCodecsKey; GS_EXPORT NSString* const NSMetadataItemColorSpaceKey; GS_EXPORT NSString* const NSMetadataItemCommentKey; GS_EXPORT NSString* const NSMetadataItemComposerKey; GS_EXPORT NSString* const NSMetadataItemContactKeywordsKey; GS_EXPORT NSString* const NSMetadataItemContentCreationDateKey; GS_EXPORT NSString* const NSMetadataItemContentModificationDateKey; GS_EXPORT NSString* const NSMetadataItemContentTypeKey; GS_EXPORT NSString* const NSMetadataItemContentTypeTreeKey; GS_EXPORT NSString* const NSMetadataItemContributorsKey; GS_EXPORT NSString* const NSMetadataItemCopyrightKey; GS_EXPORT NSString* const NSMetadataItemCountryKey; GS_EXPORT NSString* const NSMetadataItemCoverageKey; GS_EXPORT NSString* const NSMetadataItemCreatorKey; GS_EXPORT NSString* const NSMetadataItemDateAddedKey; GS_EXPORT NSString* const NSMetadataItemDeliveryTypeKey; GS_EXPORT NSString* const NSMetadataItemDescriptionKey; GS_EXPORT NSString* const NSMetadataItemDirectorKey; GS_EXPORT NSString* const NSMetadataItemDisplayNameKey; GS_EXPORT NSString* const NSMetadataItemDownloadedDateKey; GS_EXPORT NSString* const NSMetadataItemDueDateKey; GS_EXPORT NSString* const NSMetadataItemDurationSecondsKey; GS_EXPORT NSString* const NSMetadataItemEditorsKey; GS_EXPORT NSString* const NSMetadataItemEmailAddressesKey; GS_EXPORT NSString* const NSMetadataItemEncodingApplicationsKey; GS_EXPORT NSString* const NSMetadataItemExecutableArchitecturesKey; GS_EXPORT NSString* const NSMetadataItemExecutablePlatformKey; GS_EXPORT NSString* const NSMetadataItemEXIFGPSVersionKey; GS_EXPORT NSString* const NSMetadataItemEXIFVersionKey; GS_EXPORT NSString* const NSMetadataItemExposureModeKey; GS_EXPORT NSString* const NSMetadataItemExposureProgramKey; GS_EXPORT NSString* const NSMetadataItemExposureTimeSecondsKey; GS_EXPORT NSString* const NSMetadataItemExposureTimeStringKey; GS_EXPORT NSString* const NSMetadataItemFinderCommentKey; GS_EXPORT NSString* const NSMetadataItemFlashOnOffKey; GS_EXPORT NSString* const NSMetadataItemFNumberKey; GS_EXPORT NSString* const NSMetadataItemFocalLength35mmKey; GS_EXPORT NSString* const NSMetadataItemFocalLengthKey; GS_EXPORT NSString* const NSMetadataItemFontsKey; GS_EXPORT NSString* const NSMetadataItemFSContentChangeDateKey; GS_EXPORT NSString* const NSMetadataItemFSCreationDateKey; GS_EXPORT NSString* const NSMetadataItemFSNameKey; GS_EXPORT NSString* const NSMetadataItemFSSizeKey; GS_EXPORT NSString* const NSMetadataItemGenreKey; GS_EXPORT NSString* const NSMetadataItemGPSAreaInformationKey; GS_EXPORT NSString* const NSMetadataItemGPSDateStampKey; GS_EXPORT NSString* const NSMetadataItemGPSDestBearingKey; GS_EXPORT NSString* const NSMetadataItemGPSDestDistanceKey; GS_EXPORT NSString* const NSMetadataItemGPSDestLatitudeKey; GS_EXPORT NSString* const NSMetadataItemGPSDestLongitudeKey; GS_EXPORT NSString* const NSMetadataItemGPSDifferentalKey; GS_EXPORT NSString* const NSMetadataItemGPSDOPKey; GS_EXPORT NSString* const NSMetadataItemGPSMapDatumKey; GS_EXPORT NSString* const NSMetadataItemGPSMeasureModeKey; GS_EXPORT NSString* const NSMetadataItemGPSProcessingMethodKey; GS_EXPORT NSString* const NSMetadataItemGPSStatusKey; GS_EXPORT NSString* const NSMetadataItemGPSTrackKey; GS_EXPORT NSString* const NSMetadataItemHasAlphaChannelKey; GS_EXPORT NSString* const NSMetadataItemHeadlineKey; GS_EXPORT NSString* const NSMetadataItemIdentifierKey; GS_EXPORT NSString* const NSMetadataItemImageDirectionKey; GS_EXPORT NSString* const NSMetadataItemInformationKey; GS_EXPORT NSString* const NSMetadataItemInstantMessageAddressesKey; GS_EXPORT NSString* const NSMetadataItemInstructionsKey; GS_EXPORT NSString* const NSMetadataItemIsApplicationManagedKey; GS_EXPORT NSString* const NSMetadataItemIsGeneralMIDISequenceKey; GS_EXPORT NSString* const NSMetadataItemIsLikelyJunkKey; GS_EXPORT NSString* const NSMetadataItemISOSpeedKey; GS_EXPORT NSString* const NSMetadataItemIsUbiquitousKey; GS_EXPORT NSString* const NSMetadataItemKeySignatureKey; GS_EXPORT NSString* const NSMetadataItemKeywordsKey; GS_EXPORT NSString* const NSMetadataItemKindKey; GS_EXPORT NSString* const NSMetadataItemLanguagesKey; GS_EXPORT NSString* const NSMetadataItemLastUsedDateKey; GS_EXPORT NSString* const NSMetadataItemLatitudeKey; GS_EXPORT NSString* const NSMetadataItemLayerNamesKey; GS_EXPORT NSString* const NSMetadataItemLensModelKey; GS_EXPORT NSString* const NSMetadataItemLongitudeKey; GS_EXPORT NSString* const NSMetadataItemLyricistKey; GS_EXPORT NSString* const NSMetadataItemMaxApertureKey; GS_EXPORT NSString* const NSMetadataItemMediaTypesKey; GS_EXPORT NSString* const NSMetadataItemMeteringModeKey; GS_EXPORT NSString* const NSMetadataItemMusicalGenreKey; GS_EXPORT NSString* const NSMetadataItemMusicalInstrumentCategoryKey; GS_EXPORT NSString* const NSMetadataItemMusicalInstrumentNameKey; GS_EXPORT NSString* const NSMetadataItemNamedLocationKey; GS_EXPORT NSString* const NSMetadataItemNumberOfPagesKey; GS_EXPORT NSString* const NSMetadataItemOrganizationsKey; GS_EXPORT NSString* const NSMetadataItemOrientationKey; GS_EXPORT NSString* const NSMetadataItemOriginalFormatKey; GS_EXPORT NSString* const NSMetadataItemOriginalSourceKey; GS_EXPORT NSString* const NSMetadataItemPageHeightKey; GS_EXPORT NSString* const NSMetadataItemPageWidthKey; GS_EXPORT NSString* const NSMetadataItemParticipantsKey; GS_EXPORT NSString* const NSMetadataItemPathKey; GS_EXPORT NSString* const NSMetadataItemPerformersKey; GS_EXPORT NSString* const NSMetadataItemPhoneNumbersKey; GS_EXPORT NSString* const NSMetadataItemPixelCountKey; GS_EXPORT NSString* const NSMetadataItemPixelHeightKey; GS_EXPORT NSString* const NSMetadataItemPixelWidthKey; GS_EXPORT NSString* const NSMetadataItemProducerKey; GS_EXPORT NSString* const NSMetadataItemProfileNameKey; GS_EXPORT NSString* const NSMetadataItemProjectsKey; GS_EXPORT NSString* const NSMetadataItemPublishersKey; GS_EXPORT NSString* const NSMetadataItemRecipientAddressesKey; GS_EXPORT NSString* const NSMetadataItemRecipientEmailAddressesKey; GS_EXPORT NSString* const NSMetadataItemRecipientsKey; GS_EXPORT NSString* const NSMetadataItemRecordingDateKey; GS_EXPORT NSString* const NSMetadataItemRecordingYearKey; GS_EXPORT NSString* const NSMetadataItemRedEyeOnOffKey; GS_EXPORT NSString* const NSMetadataItemResolutionHeightDPIKey; GS_EXPORT NSString* const NSMetadataItemResolutionWidthDPIKey; GS_EXPORT NSString* const NSMetadataItemRightsKey; GS_EXPORT NSString* const NSMetadataItemSecurityMethodKey; GS_EXPORT NSString* const NSMetadataItemSpeedKey; GS_EXPORT NSString* const NSMetadataItemStarRatingKey; GS_EXPORT NSString* const NSMetadataItemStateOrProvinceKey; GS_EXPORT NSString* const NSMetadataItemStreamableKey; GS_EXPORT NSString* const NSMetadataItemSubjectKey; GS_EXPORT NSString* const NSMetadataItemTempoKey; GS_EXPORT NSString* const NSMetadataItemTextContentKey; GS_EXPORT NSString* const NSMetadataItemThemeKey; GS_EXPORT NSString* const NSMetadataItemTimeSignatureKey; GS_EXPORT NSString* const NSMetadataItemTimestampKey; GS_EXPORT NSString* const NSMetadataItemTitleKey; GS_EXPORT NSString* const NSMetadataItemTotalBitRateKey; GS_EXPORT NSString* const NSMetadataItemURLKey; GS_EXPORT NSString* const NSMetadataItemVersionKey; GS_EXPORT NSString* const NSMetadataItemVideoBitRateKey; GS_EXPORT NSString* const NSMetadataItemWhereFromsKey; GS_EXPORT NSString* const NSMetadataItemWhiteBalanceKey; GS_EXPORT NSString* const NSMetadataUbiquitousItemContainerDisplayNameKey; GS_EXPORT NSString* const NSMetadataUbiquitousItemDownloadingErrorKey; GS_EXPORT NSString* const NSMetadataUbiquitousItemDownloadingStatusCurrent; GS_EXPORT NSString* const NSMetadataUbiquitousItemDownloadingStatusDownloaded; GS_EXPORT NSString* const NSMetadataUbiquitousItemDownloadingStatusKey; GS_EXPORT NSString* const NSMetadataUbiquitousItemDownloadingStatusNotDownloaded; GS_EXPORT NSString* const NSMetadataUbiquitousItemDownloadRequestedKey; GS_EXPORT NSString* const NSMetadataUbiquitousItemHasUnresolvedConflictsKey; GS_EXPORT NSString* const NSMetadataUbiquitousItemIsDownloadedKey; GS_EXPORT NSString* const NSMetadataUbiquitousItemIsDownloadingKey; GS_EXPORT NSString* const NSMetadataUbiquitousItemIsExternalDocumentKey; GS_EXPORT NSString* const NSMetadataUbiquitousItemIsSharedKey; GS_EXPORT NSString* const NSMetadataUbiquitousItemIsUploadedKey; GS_EXPORT NSString* const NSMetadataUbiquitousItemIsUploadingKey; GS_EXPORT NSString* const NSMetadataUbiquitousItemPercentDownloadedKey; GS_EXPORT NSString* const NSMetadataUbiquitousItemPercentUploadedKey; GS_EXPORT NSString* const NSMetadataUbiquitousItemUploadingErrorKey; GS_EXPORT NSString* const NSMetadataUbiquitousItemURLInLocalContainerKey; GS_EXPORT NSString* const NSMetadataUbiquitousSharedItemCurrentUserPermissionsKey; GS_EXPORT NSString* const NSMetadataUbiquitousSharedItemCurrentUserRoleKey; GS_EXPORT NSString* const NSMetadataUbiquitousSharedItemMostRecentEditorNameComponentsKey; GS_EXPORT NSString* const NSMetadataUbiquitousSharedItemOwnerNameComponentsKey; GS_EXPORT NSString* const NSMetadataUbiquitousSharedItemPermissionsReadOnly; GS_EXPORT NSString* const NSMetadataUbiquitousSharedItemPermissionsReadWrite; GS_EXPORT NSString* const NSMetadataUbiquitousSharedItemRoleOwner; GS_EXPORT NSString* const NSMetadataUbiquitousSharedItemRoleParticipant; #if defined(__cplusplus) } #endif #endif /* GS_API_MACOSX */ #endif /* _NSMetadataAttributes_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSMethodSignature.h000066400000000000000000000072001435650067400234060ustar00rootroot00000000000000/* Interface for NSMethodSignature for GNUStep Copyright (C) 1995, 1998 Free Software Foundation, Inc. Written by: Andrew Kachites McCallum Date: 1995 Rewritten: Richard Frith-Macdonald Date: 1998 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSMethodSignature_h_GNUSTEP_BASE_INCLUDE #define __NSMethodSignature_h_GNUSTEP_BASE_INCLUDE #import #import #if defined(__cplusplus) extern "C" { #endif /** *

Class encapsulating type information for method arguments and return * value. It is used as a component of [NSInvocation] to implement message * forwarding, such as within the distributed objects framework. Instances * can be obtained from the [NSObject] method * [NSObject-methodSignatureForSelector:].

* *

Basically, types are represented as Objective-C @encode(...) * compatible strings. The arguments are * numbered starting from 0, including the implicit arguments * self (type id, at position 0) and * _cmd (type SEL, at position 1).

*/ GS_EXPORT_CLASS @interface NSMethodSignature : NSObject { #if GS_EXPOSE(NSMethodSignature) @private const char *_methodTypes; NSUInteger _argFrameLength; NSUInteger _numArgs; void *_info; #endif } /** * Build a method signature directly from string description of return type and * argument types, using the Objective-C @encode(...) type codes. */ + (NSMethodSignature*) signatureWithObjCTypes: (const char*)t; /** * Number of bytes that the full set of arguments occupies on the stack, which * is platform(hardware)-dependent. */ - (NSUInteger) frameLength; /** * Returns Objective-C @encode(...) compatible string. Arguments * are numbered starting from 0, including the implicit arguments * self (type id, at position 0) and * _cmd (type SEL, at position 1).
* Type strings may include leading type qualifiers. */ - (const char*) getArgumentTypeAtIndex: (NSUInteger)index; /** * Pertains to distributed objects; method is asynchronous when invoked and * return should not be waited for. */ - (BOOL) isOneway; /** * Number of bytes that the return value occupies on the stack, which is * platform(hardware)-dependent. */ - (NSUInteger) methodReturnLength; /** * Returns an Objective-C @encode(...) compatible string * describing the return type of the method. This may include type * qualifiers. */ - (const char*) methodReturnType; /** * Returns number of arguments to method, including the implicit * self and _cmd. */ - (NSUInteger) numberOfArguments; @end #if defined(__cplusplus) } #endif #endif /* __NSMethodSignature_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSNetServices.h000066400000000000000000000313361435650067400225450ustar00rootroot00000000000000/* Interface for NSNetServices for GNUstep Copyright (C) 2006 Free Software Foundation, Inc. Written by: Chris B. Vetter Date: 2006 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSNetServices_h_GNUSTEP_BASE_INCLUDE #define __NSNetServices_h_GNUSTEP_BASE_INCLUDE #import #import #import #if defined(__cplusplus) extern "C" { #endif enum { NSNetServicesUnknownError = -72000L, NSNetServicesCollisionError = -72001L, NSNetServicesNotFoundError = -72002L, NSNetServicesActivityInProgress = -72003L, NSNetServicesBadArgumentError = -72004L, NSNetServicesCancelledError = -72005L, NSNetServicesInvalidError = -72006L, NSNetServicesTimeoutError = -72007L }; /** * * * NSNetServicesUnknownError
* An unknown error occurred. *

*
* * NSNetServicesCollisionError
* The given registration has had a name collision. Registration should * be cancelled and tried again with a different name. *

*
* * NSNetServicesNotFoundError
* The service could not be found. *

*
* * NSNetServicesActivityInProgress
* A request is already in progress. *

*
* * NSNetServicesBadArgumentError
* An invalid argument was used to create the object. *

*
* * NSNetServicesCancelledError
* The request has been cancelled. *

*
* * NSNetServicesInvalidError
* The service was improperly configured. *

*
* * NSNetServicesTimeoutError
* The request has timed out before a successful resolution. *

*
*
*/ typedef NSUInteger NSNetServicesError; enum { NSNetServiceNoAutoRename = 1 << 0 #if OS_API_VERSION(MAC_OS_X_VERSION_10_9,GS_API_LATEST) ,NSNetServiceListenForConnections = 1 << 1 #endif }; typedef NSUInteger NSNetServiceOptions; GS_EXPORT NSString * const NSNetServicesErrorCode; GS_EXPORT NSString * const NSNetServicesErrorDomain; @class NSInputStream; @class NSOutputStream; @class NSRunLoop; @class NSNetService; @class NSNetServiceBrowser; @protocol NSNetServiceDelegate #if OS_API_VERSION(MAC_OS_X_VERSION_10_6,GS_API_LATEST) && GS_PROTOCOLS_HAVE_OPTIONAL @optional #else @end @interface NSObject (NSNetServiceDelegateMethods) #endif /** * Notifies the delegate that the network is ready to publish the service. * *

See also:
* [NSNetService-publish]
*

*/ - (void) netServiceWillPublish: (NSNetService *) sender; /** * Notifies the delegate that the service was successfully published. * *

See also:
* [NSNetService-publish]
*

*/ - (void) netServiceDidPublish: (NSNetService *) sender; /** * Notifies the delegate that the service could not get published. * *

See also:
* [NSNetService-publish]
*

*/ - (void) netService: (NSNetService *) sender didNotPublish: (NSDictionary *) errorDict; /** * Notifies the delegate that the network is ready to resolve the service. * *

See also:
* [NSNetService-resolveWithTimeout:]
*

*/ - (void) netServiceWillResolve: (NSNetService *) sender; /** * Notifies the delegate that the service was resolved. * *

See also:
* [NSNetService-resolveWithTimeout:]
*

*/ - (void) netServiceDidResolveAddress: (NSNetService *) sender; /** * Notifies the delegate that the service could not get resolved. * *

See also:
* [NSNetService-resolveWithTimeout:]
*

*/ - (void) netService: (NSNetService *) sender didNotResolve: (NSDictionary *) errorDict; /** * Notifies the delegate that the request was stopped. * *

See also:
* [NSNetService-stop]
*

*/ - (void) netServiceDidStop: (NSNetService *) sender; /** * Notifies the delegate that the TXT record has been updated. * *

See also:
* [NSNetService-startMonitoring]
* [NSNetService-stopMonitoring] *

*/ - (void) netService: (NSNetService *) sender didUpdateTXTRecordData: (NSData *) data; #if OS_API_VERSION(MAC_OS_X_VERSION_10_9,GS_API_LATEST) /** * Notifies the delegate that the service, which must have been published with * option NSNetServiceListenForConnections, received a new connection. * In order to communicate with the connecting client, you must -open * the streams and schedule them with a runloop. * To reject a connection, just -open and immediately -close both streams. */ - (void) netService: (NSNetService *) sender didAcceptConnectionWithInputStream: (NSInputStream *) inputStream outputStream: (NSOutputStream *)outputStream; #endif @end /** * * * NSNetServiceBrowserDelegate protocol description * *

* *

* *

* *

*
*

* This protocol must be adopted by any class wishing to implement * an [NSNetServiceBrowser] delegate. *

*/ @protocol NSNetServiceBrowserDelegate #if OS_API_VERSION(MAC_OS_X_VERSION_10_6,GS_API_LATEST) && GS_PROTOCOLS_HAVE_OPTIONAL @optional #else @end @interface NSObject (NSNetServiceBrowserDelegateMethods) #endif /** * Notifies the delegate that the search is about to begin. * *

See also:
* [NSNetServiceBrowser-netServiceBrowser:didNotSearch:]
*

*/ - (void) netServiceBrowserWillSearch: (NSNetServiceBrowser *)aNetServiceBrowser; /** * Notifies the delegate that the search was unsuccessful. * *

See also:
* [NSNetServiceBrowser-netServiceBrowserWillSearch:]
*

*/ - (void) netServiceBrowser: (NSNetServiceBrowser *) aNetServiceBrowser didNotSearch: (NSDictionary *) errorDict; /** * Notifies the delegate that the search was stopped. * *

See also:
* [NSNetServiceBrowser-stop]
*

*/ - (void) netServiceBrowserDidStopSearch: (NSNetServiceBrowser *)aNetServiceBrowser; /** * Notifies the delegate that a domain was found. * *

See also:
* [NSNetServiceBrowser-searchForBrowsableDomains]
* [NSNetServiceBrowser-searchForRegistrationDomains]
*

*/ - (void) netServiceBrowser: (NSNetServiceBrowser *) aNetServiceBrowser didFindDomain: (NSString *) domainString moreComing: (BOOL) moreComing; /** * Notifies the delegate that a domain has become unavailable. * *

See also:
*
*

*/ - (void) netServiceBrowser: (NSNetServiceBrowser *) aNetServiceBrowser didRemoveDomain: (NSString *) domainString moreComing: (BOOL) moreComing; /** * Notifies the delegate that a service was found. * *

See also:
* [NSNetServiceBrowser-searchForServicesOfType:inDomain:]
*

*/ - (void) netServiceBrowser: (NSNetServiceBrowser *) aNetServiceBrowser didFindService: (NSNetService *) aNetService moreComing: (BOOL) moreComing; /** * Notifies the delegate that a service has become unavailable. * *

See also:
*
*

*/ - (void) netServiceBrowser: (NSNetServiceBrowser *) aNetServiceBrowser didRemoveService: (NSNetService *) aNetService moreComing: (BOOL) moreComing; @end /** * * * NSNetService class description * *

* *

* *

* *

*
*

* [NSNetService] lets you publish a network service in a domain using * multicast DNS. Additionally, it lets you resolve a network service that * was discovered by [NSNetServiceBrowser]. This class is an abstract * superclass for concrete implementations of its functionality. *

*/ GS_EXPORT_CLASS @interface NSNetService : NSObject { #if GS_EXPOSE(NSNetService) id _delegate; void *_netService; void *_reserved; #endif } + (NSData *) dataFromTXTRecordDictionary: (NSDictionary *) txtDictionary; + (NSDictionary *) dictionaryFromTXTRecordData: (NSData *) txtData; - (id) initWithDomain: (NSString *) domain type: (NSString *) type name: (NSString *) name; - (id) initWithDomain: (NSString *) domain type: (NSString *) type name: (NSString *) name port: (NSInteger) port; - (void) removeFromRunLoop: (NSRunLoop *) aRunLoop forMode: (NSString *) mode; - (void) scheduleInRunLoop: (NSRunLoop *) aRunLoop forMode: (NSString *) mode; #if OS_API_VERSION(MAC_OS_X_VERSION_10_5,GS_API_LATEST) - (NSInteger) port; - (void) publishWithOptions: (NSNetServiceOptions)options; #endif - (void) publish; - (void) resolve; - (void) resolveWithTimeout: (NSTimeInterval) timeout; - (void) stop; - (void) startMonitoring; - (void) stopMonitoring; - (id) delegate; - (void) setDelegate: (id) delegate; - (NSArray *) addresses; - (NSString *) domain; - (NSString *) hostName; - (NSString *) name; - (NSString *) type; - (NSString *) protocolSpecificInformation; - (void) setProtocolSpecificInformation: (NSString *) specificInformation; - (NSData *) TXTRecordData; - (BOOL) setTXTRecordData: (NSData *) recordData; - (BOOL) getInputStream: (NSInputStream **) inputStream outputStream: (NSOutputStream **) outputStream; @end /** * * * NSNetServiceBrowser class description * *

* *

* *

* *

*
*

* [NSNetServiceBrowser] asynchronously lets you discover network domains * and, additionally, search for a type of network service. It sends its * delegate a message whenever it discovers a new network service, and * whenever a network service goes away. *

*

* Each [NSNetServiceBrowser] performs one search at a time. So in order * to perform multiple searches simultaneously, create multiple instances. * This class is an abstract superclass for concrete implementations of its * functionality. *

*/ GS_EXPORT_CLASS @interface NSNetServiceBrowser : NSObject { #if GS_EXPOSE(NSNetServiceBrowser) id _delegate; void *_netServiceBrowser; void *_reserved; #endif } - (id) init; - (void) removeFromRunLoop: (NSRunLoop *) aRunLoop forMode: (NSString *) mode; - (void) scheduleInRunLoop: (NSRunLoop *) aRunLoop forMode: (NSString *) mode; - (void) searchForAllDomains; - (void) searchForBrowsableDomains; - (void) searchForRegistrationDomains; - (void) searchForServicesOfType: (NSString *) serviceType inDomain: (NSString *) domainName; - (void) stop; - (id) delegate; - (void) setDelegate: (id) delegate; @end /** * * * NSNetServiceDelegate protocol description * *

* *

* *

* *

*
*

* This protocol must be adopted by any class wishing to implement * an [NSNetService] delegate. *

*/ #if !NO_GNUSTEP && !defined(GNUSTEP_BASE_INTERNAL) #import #endif #if defined(__cplusplus) } #endif #endif /* __NSNetServices_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSNotification.h000066400000000000000000000062241435650067400227370ustar00rootroot00000000000000/** Interface for NSNotification and NSNotificationCenter for GNUstep Copyright (C) 1996,1999 Free Software Foundation, Inc. Written by: Andrew Kachites McCallum Rewrite by: Richard Frith-Macdonald Created: March 1996 This file is part of the GNUstep Base Library. 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 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 USA. AutogsdocSource: NSNotification.m AutogsdocSource: NSNotificationCenter.m */ #ifndef __NSNotification_h_GNUSTEP_BASE_INCLUDE #define __NSNotification_h_GNUSTEP_BASE_INCLUDE #import #import #import #import #if defined(__cplusplus) extern "C" { #endif @class NSString; @class NSDictionary; @class NSLock; @class NSOperationQueue; typedef NSString* NSNotificationName; GS_EXPORT_CLASS @interface NSNotification : NSObject /* Creating a Notification Object */ + (NSNotification*) notificationWithName: (NSString*)name object: (id)object; + (NSNotification*) notificationWithName: (NSString*)name object: (id)object userInfo: (NSDictionary*)info; /* Querying a Notification Object */ - (NSString*) name; - (id) object; - (NSDictionary*) userInfo; @end #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) DEFINE_BLOCK_TYPE(GSNotificationBlock, void, NSNotification *); #endif GS_EXPORT_CLASS @interface NSNotificationCenter : NSObject { #if GS_EXPOSE(NSNotificationCenter) @private void *_table; #endif } + (NSNotificationCenter*) defaultCenter; - (void) addObserver: (id)observer selector: (SEL)selector name: (NSString*)name object: (id)object; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) - (id) addObserverForName: (NSString *)name object: (id)object queue: (NSOperationQueue *)queue usingBlock: (GSNotificationBlock)block; #endif - (void) removeObserver: (id)observer; - (void) removeObserver: (id)observer name: (NSString*)name object: (id)object; - (void) postNotification: (NSNotification*)notification; - (void) postNotificationName: (NSString*)name object: (id)object; - (void) postNotificationName: (NSString*)name object: (id)object userInfo: (NSDictionary*)info; @end #if defined(__cplusplus) } #endif #endif /*__NSNotification_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSNotificationQueue.h000066400000000000000000000102571435650067400237450ustar00rootroot00000000000000/* NSNotificationQueue.h Copyright (C) 1995, 1996 Ovidiu Predescu and Mircea Oancea. All rights reserved. Author: Mircea Oancea This file is part of libFoundation. Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. We disclaim all warranties with regard to this software, including all implied warranties of merchantability and fitness, in no event shall we be liable for any special, indirect or consequential damages or any damages whatsoever resulting from loss of use, data or profits, whether in an action of contract, negligence or other tortious action, arising out of or in connection with the use or performance of this software. */ /* Interface for NSNotificationQueue for GNUStep Copyright (C) 1996 Free Software Foundation, Inc. Modified by: Richard Frith-Macdonald This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSNotificationQueue_h_GNUSTEP_BASE_INCLUDE #define __NSNotificationQueue_h_GNUSTEP_BASE_INCLUDE #import #import #if defined(__cplusplus) extern "C" { #endif @class NSArray; @class NSNotification; @class NSNotificationCenter; /* * Posting styles into notification queue */ /** * Enumeration of possible timings for distribution of notifications handed * to an [NSNotificationQueue]: { NSPostWhenIdle, // post when runloop is idle NSPostASAP, // post soon NSPostNow // post synchronously } */ enum { NSPostWhenIdle = 1, NSPostASAP = 2, NSPostNow = 3 }; typedef NSUInteger NSPostingStyle; /** * Enumeration of possible ways to combine notifications when dealing with * [NSNotificationQueue]: { NSNotificationNoCoalescing, // don't combine NSNotificationCoalescingOnName, // combine all registered with same name NSNotificationCoalescingOnSender // combine all registered with same object } */ enum { NSNotificationNoCoalescing = 0, NSNotificationCoalescingOnName = 1, NSNotificationCoalescingOnSender = 2 }; typedef NSUInteger NSNotificationCoalescing; /* * NSNotificationQueue class */ /** * Structure used internally by [NSNotificationQueue]. */ struct _NSNotificationQueueList; GS_EXPORT_CLASS @interface NSNotificationQueue : NSObject { #if GS_EXPOSE(NSNotificationQueue) @public NSNotificationCenter *_center; struct _NSNotificationQueueList *_asapQueue; struct _NSNotificationQueueList *_idleQueue; NSZone *_zone; #endif } /* Creating Notification Queues */ + (NSNotificationQueue*) defaultQueue; - (id) initWithNotificationCenter: (NSNotificationCenter*)notificationCenter; /* Inserting and Removing Notifications From a Queue */ - (void) dequeueNotificationsMatching: (NSNotification*)notification coalesceMask: (NSUInteger)coalesceMask; - (void) enqueueNotification: (NSNotification*)notification postingStyle: (NSPostingStyle)postingStyle; - (void) enqueueNotification: (NSNotification*)notification postingStyle: (NSPostingStyle)postingStyle coalesceMask: (NSUInteger)coalesceMask forModes: (NSArray*)modes; @end #if defined(__cplusplus) } #endif #endif /* __NSNotificationQueue_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSNull.h000066400000000000000000000027131435650067400212220ustar00rootroot00000000000000/* Interface for NSNull for GNUStep Copyright (C) 2000 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 2000 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSNull_h_GNUSTEP_BASE_INCLUDE #define __NSNull_h_GNUSTEP_BASE_INCLUDE #import #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) #import #if defined(__cplusplus) extern "C" { #endif /* * An object to use as a placeholder - in collections for instance. */ GS_EXPORT_CLASS @interface NSNull : NSObject + (NSNull*) null; @end #if defined(__cplusplus) } #endif #endif /* GS_API_MACOSX */ #endif /* __NSNull_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSNumberFormatter.h000066400000000000000000000413361435650067400234300ustar00rootroot00000000000000/* Definition of class NSNumberFormatter Copyright (C) 1999 Free Software Foundation, Inc. Written by: Fred Kiefer Date: July 2000 Updated by: Richard Frith-Macdonald Sept 2001 This file is part of the GNUstep Library. 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 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 USA. */ #ifndef _NSNumberFormatter_h_GNUSTEP_BASE_INCLUDE #define _NSNumberFormatter_h_GNUSTEP_BASE_INCLUDE #import #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) #import #import #import #if defined(__cplusplus) extern "C" { #endif @class NSString, NSAttributedString, NSDictionary, NSError, NSLocale, NSNumber; #if OS_API_VERSION(MAC_OS_X_VERSION_10_4, GS_API_LATEST) enum { NSNumberFormatterNoStyle = 0, NSNumberFormatterDecimalStyle = 1, NSNumberFormatterCurrencyStyle = 2, NSNumberFormatterPercentStyle = 3, NSNumberFormatterScientificStyle = 4, NSNumberFormatterSpellOutStyle = 5 }; typedef NSUInteger NSNumberFormatterStyle; enum { NSNumberFormatterBehaviorDefault = 0, NSNumberFormatterBehavior10_0 = 1000, NSNumberFormatterBehavior10_4 = 1040 }; typedef NSUInteger NSNumberFormatterBehavior; enum { NSNumberFormatterPadBeforePrefix = 0, NSNumberFormatterPadAfterPrefix = 1, NSNumberFormatterPadBeforeSuffix = 2, NSNumberFormatterPadAfterSuffix = 3 }; typedef NSUInteger NSNumberFormatterPadPosition; enum { NSNumberFormatterRoundCeiling = 0, NSNumberFormatterRoundFloor = 1, NSNumberFormatterRoundDown = 2, NSNumberFormatterRoundUp = 3, NSNumberFormatterRoundHalfEven = 4, NSNumberFormatterRoundHalfDown = 5, NSNumberFormatterRoundHalfUp = 6 }; typedef NSUInteger NSNumberFormatterRoundingMode; #endif /** *

This class is currently not fully implemented! All set * methods will work, but stringForObject: will ignore the format completely. * The documentation below describes what the behavior SHOULD * be...

* *

A specialization of the [NSFormatter] class for generating string * representations of numbers ([NSNumber] and [NSDecimalNumber] instances) and * for parsing numeric values in strings.

* *

See the [NSFormatter] documentation for description of the basic methods * for formatting and parsing that are available.

* *

There are no convenience initializers or constructors for this class. * Instead, to obtain an instance, call alloc init and then -setFormat: .

* *

The basic format of a format string uses "#" signs to represent digits, * and other characters to represent themselves, in a context-dependent way. * Thus, for example, @"#,###.00" means to print the number * ending in .00 if it has no decimal part, otherwise print two decimal * places, and to print one comma if it is greater than 1000. Thus, 1000 * prints as "1,000.00", and 1444555.979 prints as "1444,555.98" (see * -setRoundingBehavior:).

* *

After setting the format, you may change the thousands separator and * decimal point using set methods, or by calling -setLocalizesFormat: .

* *

You may set separate formats to be used for positive numbers, negative * numbers, and zero independently.

* *

In addition, this class supports attributed strings (see * [NSAttributedString]), so that you can specify font and color attributes, * among others, to display aspects of a number. You can assign specific sets * of attributes for positive and negative numbers, and for specific cases * including 0, NaN, and nil...

*/ GS_EXPORT_CLASS @interface NSNumberFormatter : NSFormatter { #if GS_EXPOSE(NSNumberFormatter) @private BOOL _hasThousandSeparators; BOOL _allowsFloats; BOOL _localizesFormat; unichar _thousandSeparator; unichar _decimalSeparator; NSDecimalNumberHandler *_roundingBehavior; NSDecimalNumber *_maximum; NSDecimalNumber *_minimum; NSAttributedString *_attributedStringForNil; NSAttributedString *_attributedStringForNotANumber; NSAttributedString *_attributedStringForZero; NSString *_negativeFormat; NSString *_positiveFormat; NSDictionary *_attributesForPositiveValues; NSDictionary *_attributesForNegativeValues; #endif #if GS_NONFRAGILE # if defined(GS_NSNumberFormatter_IVARS) @public GS_NSNumberFormatter_IVARS; # endif #else /* Pointer to private additional data used to avoid breaking ABI * when we don't have the non-fragile ABI available. * Use this mechanism rather than changing the instance variable * layout (see Source/GSInternal.h for details). */ @private id _internal GS_UNUSED_IVAR; #endif } /** * Returns the format string this instance was initialized with. */ - (NSString*) format; /** * Sets format string. See class description for more information. */ - (void) setFormat: (NSString*)aFormat; /** * Returns whether this format should defer to the locale in determining * thousands separator and decimal point. The default is to NOT localize. */ - (BOOL) localizesFormat; /** * Set whether this format should defer to the locale in determining thousands * separator and decimal point. The default is to NOT localize. */ - (void) setLocalizesFormat: (BOOL)flag; /** * Returns format used for negative numbers. */ - (NSString*) negativeFormat; /** * Sets format used for negative numbers. See class description for more * information. */ - (void) setNegativeFormat: (NSString*)aFormat; /** * Returns format used for positive numbers. */ - (NSString*) positiveFormat; /** * Sets format used for positive numbers. See class description for more * information. */ - (void) setPositiveFormat: (NSString*)aFormat; // Attributed Strings /** * Returns the exact attributed string used for nil values. By default this * is an empty string. */ - (NSAttributedString*) attributedStringForNil; /** * Sets the exact attributed string used for nil values. By default this * is an empty string. */ - (void) setAttributedStringForNil: (NSAttributedString*)newAttributedString; /** * Returns the exact attributed string used for NaN values. By default this * is the string "NaN" with no attributes. */ - (NSAttributedString*) attributedStringForNotANumber; /** * Sets the exact attributed string used for NaN values. By default this * is the string "NaN" with no attributes. */ - (void) setAttributedStringForNotANumber: (NSAttributedString*)newAttributedString; /** * Returns the exact attributed string used for zero values. By default this * is based on the format for zero values, if set, or the format for positive * values otherwise. */ - (NSAttributedString*) attributedStringForZero; /** * Sets the exact attributed string used for zero values. By default this * is based on the format for zero values, if set, or the format for positive * values otherwise. */ - (void) setAttributedStringForZero: (NSAttributedString*)newAttributedString; /** * Returns the attributes to apply to negative values (whole string), when * -attributedStringForObjectValue:withDefaultAttributes: is called. Default * is none. */ - (NSDictionary*) textAttributesForNegativeValues; /** * Sets the attributes to apply to negative values (whole string), when * -attributedStringForObjectValue:withDefaultAttributes: is called. Default * is none. */ - (void) setTextAttributesForNegativeValues: (NSDictionary*)newAttributes; /** * Returns the attributes to apply to positive values (whole string), when * -attributedStringForObjectValue:withDefaultAttributes: is called. Default * is none. */ - (NSDictionary*) textAttributesForPositiveValues; /** * Sets the attributes to apply to positive values (whole string), when * -attributedStringForObjectValue:withDefaultAttributes: is called. Default * is none. */ - (void) setTextAttributesForPositiveValues: (NSDictionary*)newAttributes; // Rounding.. this should be communicated as id, // not NSDecimalNumberHandler, but this is the way OpenStep and OS X do it.. /** * Returns object specifying the rounding behavior used when truncating * decimal digits in formats. Default is * [NSDecimalNumberHandler+defaultDecimalNumberHandler]. */ - (NSDecimalNumberHandler*) roundingBehavior; /** * Sets object specifying the rounding behavior used when truncating * decimal digits in formats. Default is * [NSDecimalNumberHandler+defaultDecimalNumberHandler]. */ - (void) setRoundingBehavior: (NSDecimalNumberHandler*)newRoundingBehavior; // Separators /** * Returns whether thousands separator should be used, regardless of whether * it is set in format. (Default is YES if explicitly set in format.) */ - (BOOL) hasThousandSeparators; /** * Sets whether thousands separator should be used, regardless of whether * it is set in format. (Default is YES if explicitly set in format.) */ - (void) setHasThousandSeparators: (BOOL)flag; /** * Returns thousands separator used; default is ','. */ - (NSString*) thousandSeparator; /** * Sets thousands separator used; default is ','. */ - (void) setThousandSeparator: (NSString*)newSeparator; /** * Returns whether number parsing will accept floating point values or generate * an exception (only int values are valid). Default is YES. */ - (BOOL) allowsFloats; /** * Sets whether number parsing will accept floating point values or generate * an exception (only int values are valid). Default is YES. */ - (void) setAllowsFloats: (BOOL)flag; /** * Returns thousands separator used; default is '.'. */ - (NSString*) decimalSeparator; /** * Sets thousands separator used; default is '.'. */ - (void) setDecimalSeparator: (NSString*)newSeparator; // Maximum/minimum /** * Returns maximum value that will be accepted as valid in number parsing. * Default is none. */ - (NSDecimalNumber*) maximum; /** * Sets maximum value that will be accepted as valid in number parsing. * Default is none. */ - (void) setMaximum: (NSDecimalNumber*)aMaximum; /** * Returns minimum value that will be accepted as valid in number parsing. * Default is none. */ - (NSDecimalNumber*) minimum; /** * Sets minimum value that will be accepted as valid in number parsing. * Default is none. */ - (void) setMinimum: (NSDecimalNumber*)aMinimum; #if OS_API_VERSION(MAC_OS_X_VERSION_10_4, GS_API_LATEST) /** Sets the behavior of the formatter.
* NB. If GNUstep has been built without the ICU library, * NSNumberFormatterBehavior10_0 is currently used irrespective of * this setting. */ - (void) setFormatterBehavior: (NSNumberFormatterBehavior) behavior; /** Returns the behavior of the receiver, either the default behavior * set for number formatters, or the behavior specified by an earlier * call to the -setFormatterBehavior: method. */ - (NSNumberFormatterBehavior) formatterBehavior; /** Sets the default behavior of number formatters.
* NB. If GNUstep has been built without the ICU library, * NSNumberFormatterBehavior10_0 is currently used irrespective of * this setting. */ + (void) setDefaultFormatterBehavior: (NSNumberFormatterBehavior) behavior; /** Returns the formatter behavior previously set as the default * using the +setDefaultFormatterBehavior: method. */ + (NSNumberFormatterBehavior) defaultFormatterBehavior; - (void) setNumberStyle: (NSNumberFormatterStyle) style; - (NSNumberFormatterStyle) numberStyle; - (void) setGeneratesDecimalNumbers: (BOOL) flag; - (BOOL) generatesDecimalNumbers; - (void) setLocale: (NSLocale *) locale; - (NSLocale *) locale; - (void) setRoundingIncrement: (NSNumber *) number; - (NSNumber *) roundingIncrement; - (void) setRoundingMode: (NSNumberFormatterRoundingMode) mode; - (NSNumberFormatterRoundingMode) roundingMode; - (void) setFormatWidth: (NSUInteger) number; - (NSUInteger) formatWidth; - (void) setMultiplier: (NSNumber *) number; - (NSNumber *) multiplier; - (void) setPercentSymbol: (NSString *) string; - (NSString *) percentSymbol; - (void) setPerMillSymbol: (NSString *) string; - (NSString *) perMillSymbol; - (void) setMinusSign: (NSString *) string; - (NSString *) minusSign; - (void) setPlusSign: (NSString *) string; - (NSString *) plusSign; - (void) setExponentSymbol: (NSString *) string; - (NSString *) exponentSymbol; - (void) setZeroSymbol: (NSString *) string; - (NSString *) zeroSymbol; - (void) setNilSymbol: (NSString *) string; - (NSString *) nilSymbol; - (void) setNotANumberSymbol: (NSString *) string; - (NSString *) notANumberSymbol; - (void) setNegativeInfinitySymbol: (NSString *) string; - (NSString *) negativeInfinitySymbol; - (void) setPositiveInfinitySymbol: (NSString *) string; - (NSString *) positiveInfinitySymbol; - (void) setCurrencySymbol: (NSString *) string; - (NSString *) currencySymbol; - (void) setCurrencyCode: (NSString *) string; - (NSString *) currencyCode; - (void) setInternationalCurrencySymbol: (NSString *) string; - (NSString *) internationalCurrencySymbol; - (void) setPositivePrefix: (NSString *) string; - (NSString *) positivePrefix; - (void) setPositiveSuffix: (NSString *) string; - (NSString *) positiveSuffix; - (void) setNegativePrefix: (NSString *) string; - (NSString *) negativePrefix; - (void) setNegativeSuffix: (NSString *) string; - (NSString *) negativeSuffix; - (void) setTextAttributesForZero: (NSDictionary *) newAttributes; - (NSDictionary *) textAttributesForZero; - (void) setTextAttributesForNil: (NSDictionary *) newAttributes; - (NSDictionary *) textAttributesForNil; - (void) setTextAttributesForNotANumber: (NSDictionary *) newAttributes; - (NSDictionary *) textAttributesForNotANumber; - (void) setTextAttributesForPositiveInfinity: (NSDictionary *) newAttributes; - (NSDictionary *) textAttributesForPositiveInfinity; - (void) setTextAttributesForNegativeInfinity: (NSDictionary *) newAttributes; - (NSDictionary *) textAttributesForNegativeInfinity; - (void) setGroupingSeparator: (NSString *) string; - (NSString *) groupingSeparator; - (void) setUsesGroupingSeparator: (BOOL) flag; - (BOOL) usesGroupingSeparator; - (void) setAlwaysShowsDecimalSeparator: (BOOL) flag; - (BOOL) alwaysShowsDecimalSeparator; - (void) setCurrencyDecimalSeparator: (NSString *) string; - (NSString *) currencyDecimalSeparator; - (void) setGroupingSize: (NSUInteger) number; - (NSUInteger) groupingSize; - (void) setSecondaryGroupingSize: (NSUInteger) number; - (NSUInteger) secondaryGroupingSize; - (void) setPaddingCharacter: (NSString *) string; - (NSString *) paddingCharacter; - (void) setPaddingPosition: (NSNumberFormatterPadPosition) position; - (NSNumberFormatterPadPosition) paddingPosition; - (void) setMinimumIntegerDigits: (NSUInteger) number; - (NSUInteger) minimumIntegerDigits; - (void) setMinimumFractionDigits: (NSUInteger) number; - (NSUInteger) minimumFractionDigits; - (void) setMaximumIntegerDigits: (NSUInteger) number; - (NSUInteger) maximumIntegerDigits; - (void) setMaximumFractionDigits: (NSUInteger) number; - (NSUInteger) maximumFractionDigits; /** * Returns the number for this string. */ - (NSNumber *) numberFromString: (NSString *) string; /** * Returns the string version of this number based on the format * specified. */ - (NSString *) stringFromNumber: (NSNumber *) number; - (BOOL) getObjectValue: (out id *) anObject forString: (NSString *) aString range: (NSRange *) rangep error: (out NSError **) error; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_5, GS_API_LATEST) - (void) setUsesSignificantDigits: (BOOL) flag; - (BOOL) usesSignificantDigits; - (void) setMinimumSignificantDigits: (NSUInteger) number; - (NSUInteger) minimumSignificantDigits; - (void) setMaximumSignificantDigits: (NSUInteger) number; - (NSUInteger) maximumSignificantDigits; - (void) setCurrencyGroupingSeparator: (NSString *) string; - (NSString *) currencyGroupingSeparator; - (void) setLenient: (BOOL) flag; - (BOOL) isLenient; - (void) setPartialStringValidationEnabled: (BOOL) enabled; - (BOOL) isPartialStringValidationEnabled; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) + (NSString *) localizedStringFromNumber: (NSNumber *) num numberStyle: (NSNumberFormatterStyle) localizationStyle; #endif @end #if defined(__cplusplus) } #endif #endif /* GS_API_MACOSX */ #endif /* _NSNumberFormatter_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSObjCRuntime.h000066400000000000000000000241361435650067400224740ustar00rootroot00000000000000/** Interface to ObjC runtime for GNUStep Copyright (C) 1995, 1997, 2000 Free Software Foundation, Inc. Written by: Andrew Kachites McCallum Date: 1995 This file is part of the GNUstep Base Library. 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 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 USA. AutogsdocSource: NSObjCRuntime.m AutogsdocSource: NSLog.m */ #ifndef __NSObjCRuntime_h_GNUSTEP_BASE_INCLUDE #define __NSObjCRuntime_h_GNUSTEP_BASE_INCLUDE #ifdef __cplusplus #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 #endif #endif #import #import #import #import #include #include #include /* NS_INLINE */ #if !defined(NS_INLINE) #define NS_INLINE static inline #endif /* PA HP-UX kludge. */ #if defined(__hppa__) && defined(__hpux__) && !defined(PRIuPTR) #define PRIuPTR "lu" #endif /* IRIX kludge. */ #if defined(__sgi) /* IRIX 6.5 provides all definitions, but only for C99 compilations. */ #define PRId8 "hhd" #define PRIu8 "hhu" #if (_MIPS_SZLONG == 32) #define PRId64 "lld" #define PRIu64 "llu" #endif /* This doesn't match , which always has "lld" here, but the arguments are uint64_t, int64_t, which are unsigned long, long for 64-bit in . */ #if (_MIPS_SZLONG == 64) #define PRId64 "ld" #define PRIu64 "lu" #endif /* This doesn't match , which has "u" here, but the arguments are uintptr_t, which is always unsigned long. */ #define PRIuPTR "lu" #endif /* Solaris < 10 kludge. */ #if defined(__sun__) && defined(__svr4__) && !defined(PRIuPTR) #if defined(__arch64__) || defined (__x86_64__) #define PRIuPTR "lu" #define PRIdPTR "ld" #define PRIxPTR "lx" #else #define PRIuPTR "u" #define PRIdPTR "d" #define PRIxPTR "x" #endif #endif /* These typedefs must be in place before GSObjCRuntime.h is imported. */ #if !defined(NSINTEGER_DEFINED) typedef intptr_t NSInteger; typedef uintptr_t NSUInteger; # define NSIntegerMax INTPTR_MAX # define NSIntegerMin INTPTR_MIN # define NSUIntegerMax UINTPTR_MAX #endif /* !defined(NSINTEGER_DEFINED) */ #if !defined(CGFLOAT_DEFINED) #if GS_SIZEOF_VOIDP == 8 #define CGFLOAT_IS_DBL 1 typedef double CGFloat; #define CGFLOAT_MIN DBL_MIN #define CGFLOAT_MAX DBL_MAX #else typedef float CGFloat; #define CGFLOAT_MIN FLT_MIN #define CGFLOAT_MAX FLT_MAX #endif #endif /* !defined(CGFLOAT_DEFINED) */ #define NSINTEGER_DEFINED 1 #define CGFLOAT_DEFINED 1 #ifndef NS_AUTOMATED_REFCOUNT_UNAVAILABLE # if __has_feature(objc_arc) # define NS_AUTOMATED_REFCOUNT_UNAVAILABLE \ __attribute__((unavailable("Not available with automatic reference counting"))) # else # define NS_AUTOMATED_REFCOUNT_UNAVAILABLE # endif #endif #if defined(__cplusplus) extern "C" { #endif /* * We can have strongly typed enums in C++11 mode or when the objc_fixed_enum * feature is availble. */ #if (__has_feature(objc_fixed_enum) || (__cplusplus && (__cplusplus > 199711L) && __has_extension(cxx_strong_enums))) # define _GS_NAMED_ENUM(ty, name) enum name : ty name; enum name : ty # define _GS_ANON_ENUM(ty) enum : ty # if __cplusplus # define NS_OPTIONS(ty,name) ty name; enum : ty # else # define NS_OPTIONS(ty,name) NS_ENUM(ty,name) # endif #else // this provides less information, but works with older compilers # define _GS_NAMED_ENUM(ty, name) ty name; enum # define _GS_ANON_ENUM(ty) enum # define NS_OPTIONS(ty, name) NS_ENUM(ty, name) #endif // A bit of fairy dust to expand NS_ENUM to the correct variant #define _GS_GET_ENUM_MACRO(_first,_second,NAME,...) NAME /* The trick here is that placing the variadic args first will push the name * that the _GS_GET_ENUM_MACRO expands to into the correct position. */ #define NS_ENUM(...) _GS_GET_ENUM_MACRO(__VA_ARGS__,_GS_NAMED_ENUM,_GS_ANON_ENUM)(__VA_ARGS__) /* * If the compiler supports nullability qualifiers, we define the macros for * non-null sections. */ #if __has_feature(nullability) # define NS_ASSUME_NONNULL_BEGIN _Pragma("clang assume_nonnull begin") # define NS_ASSUME_NONNULL_END _Pragma("clang assume_nonnull end") #else # define NS_ASSUME_NONNULL_BEGIN # define NS_ASSUME_NONNULL_END #endif #if !__has_feature(nullability) # ifndef _Nullable # define _Nullable # endif # ifndef _Nonnull # define _Nonnull # endif # ifndef _Null_unspecified # define _Null_unspecified # endif #endif /* * Any argument that is passed inside a block is not going to escape * the runtime of the function itself. */ #if __has_attribute(noescape) # define NS_NOESCAPE __attribute__((noescape)) #else # define NS_NOESCAPE #endif /* * Prevent NSError from being imported by Swift as a method that throws. */ #if __has_attribute(swift_error) # define NS_SWIFT_NOTHROW __attribute__((swift_error(none))) #else # define NS_SWIFT_NOTHROW #endif /* * Backwards compatibility macro for instance type. */ #if !__has_feature(objc_instancetype) # define instancetype id #endif /* * Backwards compatibility macros for Objective-C lightweight generics. */ #if __has_feature(objc_generics) # define GS_GENERIC_CLASS(clz, ...) clz<__VA_ARGS__> # define GS_GENERIC_TYPE_F(typeRef, fallback) typeRef #else # define GS_GENERIC_CLASS(clz, ...) clz # define GS_GENERIC_TYPE_F(typeRef, fallback) fallback #endif #define GS_GENERIC_TYPE(typeRef) GS_GENERIC_TYPE_F(typeRef, id) /** * Backwards compatibility macro for the objc_designated_initializer attribute */ #if __has_attribute(objc_designated_initializer) # define NS_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) #else # define NS_DESIGNATED_INITIALIZER #endif /** Bitfield used to specify options to control enumeration over collections. */ typedef NS_OPTIONS(NSUInteger, NSEnumerationOptions) { NSEnumerationConcurrent = (1UL << 0), /** Specifies that the enumeration * is concurrency-safe. Note that this does not mean that it will be * carried out in a concurrent manner, only that it can be. */ NSEnumerationReverse = (1UL << 1) /** Specifies that the enumeration should * happen in the opposite of the natural order of the collection. */ }; /** Bitfield used to specify options to control the sorting of collections. */ typedef NS_OPTIONS(NSUInteger, NSSortOptions) { NSSortConcurrent = (1UL << 0), /** Specifies that the sort * is concurrency-safe. Note that this does not mean that it will be * carried out in a concurrent manner, only that it can be. */ NSSortStable = (1UL << 4), /** Specifies that the sort should keep * equal objects in the same order in the collection. */ }; #import #if OS_API_VERSION(MAC_OS_X_VERSION_10_5,GS_API_LATEST) GS_EXPORT NSString *NSStringFromProtocol(Protocol *aProtocol); GS_EXPORT Protocol *NSProtocolFromString(NSString *aProtocolName); #endif GS_EXPORT SEL NSSelectorFromString(NSString *aSelectorName); GS_EXPORT NSString *NSStringFromSelector(SEL aSelector); GS_EXPORT SEL NSSelectorFromString(NSString *aSelectorName); GS_EXPORT Class NSClassFromString(NSString *aClassName); GS_EXPORT NSString *NSStringFromClass(Class aClass); GS_EXPORT const char *NSGetSizeAndAlignment(const char *typePtr, NSUInteger *sizep, NSUInteger *alignp); #if OS_API_VERSION(GS_API_NONE, GS_API_NONE) /* Logging */ /** * OpenStep spec states that log messages go to stderr, but just in case * someone wants them to go somewhere else, they can implement a function * like this and assign a pointer to it to _NSLog_printf_handler. */ typedef void NSLog_printf_handler (NSString* message); GS_EXPORT NSLog_printf_handler *_NSLog_printf_handler; GS_EXPORT int _NSLogDescriptor; @class NSRecursiveLock; GS_EXPORT NSRecursiveLock *GSLogLock(void); #endif GS_EXPORT void NSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2); GS_EXPORT void NSLogv(NSString *format, va_list args) NS_FORMAT_FUNCTION(1,0); #ifndef YES #define YES 1 #endif #ifndef NO #define NO 0 #endif #ifndef nil #define nil 0 #endif /** * Contains values NSOrderedSame, NSOrderedAscending * NSOrderedDescending, for left hand side equals, less than, or * greater than right hand side. */ typedef NS_ENUM(NSInteger, NSComparisonResult) { NSOrderedAscending = (NSInteger)-1, NSOrderedSame, NSOrderedDescending }; enum {NSNotFound = NSIntegerMax}; DEFINE_BLOCK_TYPE(NSComparator, NSComparisonResult, id, id); /** * Declare the foundation export macro as an alias to GS_EXPORT */ #define FOUNDATION_EXPORT GS_EXPORT /** * Declare NSExceptionName */ typedef NSString* NSExceptionName; #if defined(__cplusplus) } #endif /** * Declare Apple availability macros for compatibility purposes as no-ops. */ #define NS_CLASS_AVAILABLE(...) #define NS_AVAILABLE(...) #define NS_AVAILABLE_MAC(...) #define NS_DEPRECATED(...) #define NS_DEPRECATED_MAC(...) #define NS_ENUM_AVAILABLE(...) #define NS_ENUM_AVAILABLE_MAC(...) #define NS_ENUM_DEPRECATED(...) #define NS_ENUM_DEPRECATED_MAC(...) #define NS_CLASS_AVAILABLE(...) #define NS_CLASS_DEPRECATED(...) #define NS_CLASS_AVAILABLE_MAC(...) #define NS_CLASS_DEPRECATED_MAC(...) #define NS_UNAVAILABLE /* Define root class NS macro */ #ifndef NS_ROOT_CLASS #if __has_attribute(objc_root_class) #define NS_ROOT_CLASS __attribute__((objc_root_class)) #else #define NS_ROOT_CLASS #endif #endif /* Undefine "interface" defined in Visual Studio MSVC headers. */ #if defined(_MSC_VER) && defined(interface) #undef interface #endif #endif /* __NSObjCRuntime_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSObject.h000066400000000000000000000536221435650067400215230ustar00rootroot00000000000000/**Interface for NSObject for GNUStep Copyright (C) 1995, 1996, 1998 Free Software Foundation, Inc. Written by: Andrew Kachites McCallum Date: 1995 This file is part of the GNUstep Base Library. 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 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 USA. AutogsdocSource: NSObject.m */ #ifndef __NSObject_h_GNUSTEP_BASE_INCLUDE #define __NSObject_h_GNUSTEP_BASE_INCLUDE #import #import #import #import #if defined(__cplusplus) extern "C" { #endif @class NSArchiver; @class NSArray; @class NSCoder; @class NSDictionary; @class NSPortCoder; @class NSMethodSignature; @class NSMutableString; @class NSRecursiveLock; @class NSString; @class NSInvocation; @class Protocol; /** * The NSObject protocol describes a minimal set of methods that all * objects are expected to support. You should be able to send any * of the messages listed in this protocol to an object, and be safe * in assuming that the receiver can handle it. */ @protocol NSObject /** * Returns the class of the receiver. If the receiver is a proxy, then this * may return the class of the proxy target. Use -isProxy to determine whether * the receiver is a proxy. If you wish to find the real class of the * receiver, ignoring proxies, then use object_getClass(). */ - (Class) class; /** * Returns the superclass of receiver's class. If the receiver is a proxy, * then this may return the class of the proxy target. Use -isProxy to * determine whether the receiver is a proxy. If you wish to find the real * superclass of the receiver's class, ignoring proxies, then use * class_getSuperclass(object_getClass()). */ - (Class) superclass; /** * Returns whether the receiver is equal to the argument. Defining equality is * complex, so be careful when implementing this method. Collections such as * NSSet depend on the behaviour of this method. In particular, this method * must be commutative, so for any objects a and b: * * [a isEqual: b] == [b isEqual: a] * * This means that you must be very careful when returning YES if the argument * is of another class. For example, if you define a number class that returns * YES if the argument is a string representation of the number, then this will * break because the string will not recognise your object as being equal to * itself. * * If two objects are equal, then they must have the same hash value, however * equal hash values do not imply equality. */ - (BOOL) isEqual: (id)anObject; /** * Returns YES if the receiver is an instance of the class, an instance of the * subclass, or (in the case of proxies), an instance of something that can be * treated as an instance of the class. */ - (BOOL) isKindOfClass: (Class)aClass; /** * Returns YES if the receiver is an instance of the class or (in the case of * proxies), an instance of something that can be treated as an instance of the * class. * * Calling this method is rarely the correct thing to do. In most cases, a * subclass can be substituted for a superclass, so you should never need to * check that an object is really an instance of a specific class and not a * subclass. */ - (BOOL) isMemberOfClass: (Class)aClass; /** * Returns YES if the receiver is a proxy, NO otherwise. The default * implementation of this method in NSObject returns NO, while the * implementation in NSProxy returns YES. */ - (BOOL) isProxy; /** * Returns a hash value for the object. All objects that are equal *MUST* * return the same hash value. For efficient storage in sets, or as keys in * dictionaries, different objects should return hashes spread evenly over the * range of an integer. * * An object may not return different values from this method after being * stored in a collection. This typically means that ether the hash value must * be constant after the object's creation, or that the object may not be * modified while stored in an unordered collection. */ - (NSUInteger) hash; /** * Returns the receiver. In a proxy, this may (but is not required to) return * the proxied object. */ - (id) self; /** * Performs the specified selector. The selector must correspond to a method * that takes no arguments. */ - (id) performSelector: (SEL)aSelector; /** * Performs the specified selector, with the object as the argument. This * method does not perform any automatic unboxing, so the selector must * correspond to a method that takes one object argument. */ - (id) performSelector: (SEL)aSelector withObject: (id)anObject; /** * Performs the specified selector, with the objects as the arguments. This * method does not perform any automatic unboxing, so the selector must * correspond to a method that takes two object arguments. */ - (id) performSelector: (SEL)aSelector withObject: (id)object1 withObject: (id)object2; /** * Returns YES if the object can respond to messages with the specified * selector. The default implementation in NSObject returns YES if the * receiver has a method corresponding to the method, but other classes may * return YES if they can respond to a selector using one of the various * forwarding mechanisms. */ - (BOOL) respondsToSelector: (SEL)aSelector; /** * Returns YES if the receiver conforms to the specified protocol. */ - (BOOL) conformsToProtocol: (Protocol*)aProtocol; /** * Increments the reference count of the object and returns the receiver. In * garbage collected mode, this method does nothing. In automated reference * counting mode, you may neither implement this method nor call it directly. */ - (id) retain NS_AUTOMATED_REFCOUNT_UNAVAILABLE; /** * Decrements the reference count of the object and destroys if it there are no * remaining references. In garbage collected mode, this method does nothing. * In automated reference counting mode, you may neither implement this method * nor call it directly. */ - (oneway void) release NS_AUTOMATED_REFCOUNT_UNAVAILABLE; /** * Performs a deferred -release operation. The object's reference count is * decremented at the end of the scope of the current autorelease pool, * identified either by a -drain message sent to the current NSAutoreleasePool * instance, or in more recent versions of Objective-C by the end of an * @autorelease_pool scope. * * In garbage collected mode, this method does nothing. In automated reference * counting mode, you may neither implement this method nor call it directly. */ - (id) autorelease NS_AUTOMATED_REFCOUNT_UNAVAILABLE; /** * Returns the current retain count of an object. This does not include the * result of any pending autorelease operations. * * Code that relies on this method returning a sane value is broken. For * singletons, it may return NSUIntegerMax. Even when it is tracking a retain * count, it will not include on-stack pointers in manual retain/release mode, * pointers marked as __unsafe_unretain or __weak in ARC mode, or pending * autorelease operations. Its value is therefore largely meaningless. It can * occasionally be useful for debugging. */ - (NSUInteger) retainCount NS_AUTOMATED_REFCOUNT_UNAVAILABLE; /** * Returns the description of the object. This is used by the %@ format * specifier in strings. */ - (NSString*) description; /** * Returns the zone of the object. */ - (NSZone*) zone NS_AUTOMATED_REFCOUNT_UNAVAILABLE; @end /** * This protocol must be adopted by any class wishing to support copying - * ie where instances of the class should be able to create new instances * which are copies of the original and, where a class has mutable and * immutable versions, where the copies are immutable. */ @protocol NSCopying /** * Called by [NSObject-copy] passing NSDefaultMallocZone() as zone.
* This method returns a copy of the receiver and, where the receiver is a * mutable variant of a class which has an immutable partner class, the * object returned is an instance of that immutable class.
* The new object is not autoreleased, and is considered to be * 'owned' by the calling code ... which is therefore responsible for * releasing it.
* In the case where the receiver is an instance of a container class, * it is undefined whether contained objects are merely retained in the * new copy, or are themselves copied, or whether some other mechanism * entirely is used. */ - (id) copyWithZone: (NSZone*)zone; @end /** * This protocol must be adopted by any class wishing to support * mutable copying - ie where instances of the class should be able * to create mutable copies of themselves. */ @protocol NSMutableCopying /** * Called by [NSObject-mutableCopy] passing NSDefaultMallocZone() as zone.
* This method returns a copy of the receiver and, where the receiver is an * immutable variant of a class which has a mutable partner class, the * object returned is an instance of that mutable class. * The new object is not autoreleased, and is considered to be * 'owned' by the calling code ... which is therefore responsible for * releasing it.
* In the case where the receiver is an instance of a container class, * it is undefined whether contained objects are merely retained in the * new copy, or are themselves copied, or whether some other mechanism * entirely is used. */ - (id) mutableCopyWithZone: (NSZone*)zone; @end /** * This protocol must be adopted by any class wishing to support * saving and restoring instances to an archive, or copying them * to remote processes via the Distributed Objects mechanism. */ @protocol NSCoding /** * Called when it is time for receiver to be serialized for writing to an * archive or network connection. Receiver should record all of its instance * variables using methods on aCoder. See documentation for [NSCoder], * [NSArchiver], [NSKeyedArchiver], and/or [NSPortCoder] for more information. */ - (void) encodeWithCoder: (NSCoder*)aCoder; /** * Called on a freshly allocated receiver when it is time to reconstitute from * serialized bytes in an archive or from a network connection. Receiver * should load all of its instance variables using methods on aCoder. See * documentation for [NSCoder], [NSUnarchiver], [NSKeyedUnarchiver], and/or * [NSPortCoder] for more information. */ - (id) initWithCoder: (NSCoder*)aDecoder; @end @protocol NSSecureCoding + (BOOL)supportsSecureCoding; @end GS_EXPORT_CLASS GS_ROOT_CLASS @interface NSObject { /** * Points to instance's class. Used by runtime to access method * implementations, etc.. Set in +alloc, Unlike other instance variables, * which are cleared there. */ Class isa; } #if OS_API_VERSION(MAC_OS_X_VERSION_10_5, GS_API_LATEST) /** On a system which performs garbage collection, you should implement * this method to execute code when the receiver is collected.
* You must not call this method yourself (except when a subclass * calls the superclass method within its own implementation). */ - (void) finalize; #endif #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) - (NSString*) className; #endif + (id) allocWithZone: (NSZone*)z; + (id) alloc; + (Class) class; /** * This method is automatically invoked on any class which implements it * when the class is loaded into the runtime.
* It is also invoked on any category where the method is implemented * when that category is loaded into the runtime.
* The +load method is called directly by the runtime and you should never * send a +load message to a class yourself.
* This method is called before the +initialize message is sent * to the class, so you cannot depend on class initialisation having been * performed, or upon other classes existing (apart from superclasses of * the receiver, since +load is called on superclasses before it is called * on their subclasses).
* As a gross generalisation, it is safe to use C code, including * most ObjectiveC runtime functions within +load, but attempting to send * messages to ObjectiveC objects is likely to fail.
* In GNUstep, this method is implemented for NSObject to perform some * initialisation for the base library.
* If you implement +load for a class, don't call [super load] in your * implementation. */ + (void) load; /** * This message is automatically sent to a class by the runtime. It is * sent once for each class, just before the class is used for the first * time (excluding any automatic call to +load by the runtime).
* The message is sent in a thread-safe manner ... other threads may not * call methods of the class until +initialize has finished executing.
* If the class has a superclass, its implementation of +initialize is * called first.
* If the class does not implement +initialize then the implementation * in the closest superclass may be called. This means that +initialize may * be called more than once, and the recommended way to handle this by * using the * * if (self == [classname class]) * * conditional to check whether the method is being called for a subclass.
* You should never call +initialize yourself ... let the runtime do it.
* You can implement +initialize in your own class if you need to. * NSObject's implementation handles essential root object and base * library initialization.
* It should be safe to call [super initialize] in your implementation * of +initialize. */ + (void) initialize; + (IMP) instanceMethodForSelector: (SEL)aSelector; + (NSMethodSignature*) instanceMethodSignatureForSelector: (SEL)aSelector; + (BOOL) instancesRespondToSelector: (SEL)aSelector; + (BOOL) isSubclassOfClass: (Class)aClass; + (id) new; + (void) poseAsClass: (Class)aClassObject; + (id) setVersion: (NSInteger)aVersion; + (NSInteger) version; - (id) awakeAfterUsingCoder: (NSCoder*)aDecoder; - (Class) classForArchiver; - (Class) classForCoder; - (id) copy; - (void) dealloc; - (void) doesNotRecognizeSelector: (SEL)aSelector; - (void) forwardInvocation: (NSInvocation*)anInvocation; - (id) init; - (IMP) methodForSelector: (SEL)aSelector; - (NSMethodSignature*) methodSignatureForSelector: (SEL)aSelector; - (id) mutableCopy; - (id) replacementObjectForArchiver: (NSArchiver*)anArchiver; - (id) replacementObjectForCoder: (NSCoder*)anEncoder; - (Class) superclass; #if OS_API_VERSION(MAC_OS_X_VERSION_10_5, GS_API_LATEST) /** * This method will be called when attempting to send a message a class that * does not understand it. The class may install a new method for the given * selector and return YES, otherwise it should return NO. * * Note: This method is only reliable when using the GNUstep runtime. If you * require compatibility with the GCC runtime, you must also implement * -forwardInvocation: with equivalent semantics. This will be considerably * slower, but more portable. */ + (BOOL) resolveClassMethod: (SEL)name; /** * This method will be called when attempting to send a message an instance * that does not understand it. The class may install a new method for the * given selector and return YES, otherwise it should return NO. * * Note: This method is only reliable when using the GNUstep runtime. If you * require compatibility with the GCC runtime, you must also implement * -forwardInvocation: with equivalent semantics. This will be considerably * slower, but more portable. */ + (BOOL) resolveInstanceMethod: (SEL)name; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) /** * Returns an auto-accessing proxy for the given object. This proxy sends a * -beginContentAccess message to the receiver when it is created and an * -endContentAccess message when it is destroyed. This prevents an object * that implements the NSDiscardableContent protocol from having its contents * discarded for as long as the proxy exists. * * On systems using the GNUstep runtime, messages send to the proxy will be * slightly slower than direct messages. With the GCC runtime, they will be * approximately two orders of magnitude slower. The GNUstep runtime, * therefore, is strongly recommended for code calling this method. */ - (id) autoContentAccessingProxy; /** * If an object does not understand a message, it may delegate it to another * object. Returning nil indicates that forwarding should not take place. The * default implementation of this returns nil, but care should be taken when * subclassing NSObject subclasses and overriding this method that * the superclass implementation is called if returning nil. * * Note: This method is only reliable when using the GNUstep runtime and code * compiled with clang. If you require compatibility with GCC and the GCC * runtime, you must also implement -forwardInvocation: with equivalent * semantics. This will be considerably slower, but more portable. */ - (id) forwardingTargetForSelector: (SEL)aSelector; #endif @end /** * Used to allocate memory to hold an object, and initialise the * class of the object to be aClass etc. The allocated memory will * be extraBytes larger than the space actually needed to hold the * instance variables of the object.
* This function is used by the [NSObject+allocWithZone:] method. */ GS_EXPORT id NSAllocateObject(Class aClass, NSUInteger extraBytes, NSZone *zone); /** * Used to release the memory used by an object.
* This function is used by the [NSObject-dealloc] method. */ GS_EXPORT void NSDeallocateObject(id anObject); /** * Used to copy anObject. This makes a bitwise copy of anObject to * memory allocated from zone. The allocated memory will be extraBytes * longer than that necessary to actually store the instance variables * of the copied object.
*/ GS_EXPORT NSObject * NSCopyObject(NSObject *anObject, NSUInteger extraBytes, NSZone *zone); /** * Returns a flag to indicate whether anObject should be retained or * copied in order to make a copy in the specified zone.
* Basically, this tests to see if anObject was allocated from * requestedZone and returns YES if it was. */ GS_EXPORT BOOL NSShouldRetainWithZone(NSObject *anObject, NSZone *requestedZone); GS_EXPORT BOOL NSDecrementExtraRefCountWasZero(id anObject); GS_EXPORT NSUInteger NSExtraRefCount(id anObject); GS_EXPORT void NSIncrementExtraRefCount(id anObject); #if OS_API_VERSION(GS_API_NONE, GS_API_NONE) /** Global lock to be used by classes when operating on any global data that invoke other methods which also access global; thus, creating the potential for deadlock. */ GS_EXPORT NSRecursiveLock *gnustep_global_lock; @interface NSObject (NEXTSTEP) - (id) error:(const char *)aString, ...; /* - (const char *) name; Removed because OpenStep has -(NSString*)name; */ @end #if GS_API_VERSION(GS_API_NONE, 011700) @interface NSObject (GNUstep) + (void) enableDoubleReleaseCheck: (BOOL)enable; @end #endif #endif #import /** * Declares some methods for sending messages to self after a fixed delay. * (These methods are in OpenStep and OS X.) */ @interface NSObject (TimedPerformers) /** * Cancels any perform operations set up for the specified target * in the current run loop. */ + (void) cancelPreviousPerformRequestsWithTarget: (id)obj; /** * Cancels any perform operations set up for the specified target * in the current loop, but only if the value of aSelector and argument * with which the performs were set up match those supplied.
* Matching of the argument may be either by pointer equality or by * use of the [NSObject-isEqual:] method. */ + (void) cancelPreviousPerformRequestsWithTarget: (id)obj selector: (SEL)s object: (id)arg; /** * Sets given message to be sent to this instance after given delay, * in any run loop mode. See [NSRunLoop]. */ - (void) performSelector: (SEL)s withObject: (id)arg afterDelay: (NSTimeInterval)seconds; /** * Sets given message to be sent to this instance after given delay, * in given run loop modes. See [NSRunLoop]. */ - (void) performSelector: (SEL)s withObject: (id)arg afterDelay: (NSTimeInterval)seconds inModes: (NSArray*)modes; @end #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) /** * The NSDiscardableContent protocol is used by objects which encapsulate data * which may be discarded if resource constraints are exceeded. These * constraints are typically, but not always, related memory. */ @protocol NSDiscardableContent /** * This method is called before any access to the object. It returns YES if * the object's content is still valid. The caller must call -endContentAccess * once for every call to -beginContentAccess; */ - (BOOL) beginContentAccess; /** * Discards the contents of the object if it is not currently being edited. */ - (void) discardContentIfPossible; /** * This method indicates that the caller has finished accessing the contents of * the object adopting this protocol. Every call to -beginContentAccess must * be be paired with a call to this method after the caller has finished * accessing the contents. */ - (void) endContentAccess; /** * Returns YES if the contents of the object have been discarded, either via a * call to -discardContentIfPossible while the object is not in use, or by some * implementation dependent mechanism. */ - (BOOL) isContentDiscarded; @end #endif #if defined(__cplusplus) } #endif #if !NO_GNUSTEP && !defined(GNUSTEP_BASE_INTERNAL) #import #endif #endif /* __NSObject_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSObjectScripting.h000066400000000000000000000025221435650067400233770ustar00rootroot00000000000000/* Definition of class NSObjectScripting Copyright (C) 2019 Free Software Foundation, Inc. By: heron Date: Fri Nov 1 00:25:37 EDT 2019 This file is part of the GNUstep Library. 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 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 USA. */ #ifndef _NSObjectScripting_h_GNUSTEP_BASE_INCLUDE #define _NSObjectScripting_h_GNUSTEP_BASE_INCLUDE #include #if OS_API_VERSION(MAC_OS_X_VERSION_10_0, GS_API_LATEST) #if defined(__cplusplus) extern "C" { #endif GS_EXPORT_CLASS @interface NSObjectScripting : NSObject @end #if defined(__cplusplus) } #endif #endif /* GS_API_MACOSX */ #endif /* _NSObjectScripting_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSOperation.h000066400000000000000000000237461435650067400222610ustar00rootroot00000000000000/**Interface for NSOperation for GNUStep Copyright (C) 2009,2010 Free Software Foundation, Inc. Written by: Gregory Casamento Written by: Richard Frith-Macdonald Date: 2009,2010 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSOperation_h_GNUSTEP_BASE_INCLUDE #define __NSOperation_h_GNUSTEP_BASE_INCLUDE #import #if OS_API_VERSION(MAC_OS_X_VERSION_10_5, GS_API_LATEST) #if defined(__cplusplus) extern "C" { #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) #import DEFINE_BLOCK_TYPE_NO_ARGS(GSOperationCompletionBlock, void); DEFINE_BLOCK_TYPE_NO_ARGS(GSBlockOperationBlock, void); #endif @class NSMutableArray; enum { NSOperationQueuePriorityVeryLow = -8, NSOperationQueuePriorityLow = -4, NSOperationQueuePriorityNormal = 0, NSOperationQueuePriorityHigh = 4, NSOperationQueuePriorityVeryHigh = 8 }; typedef NSInteger NSOperationQueuePriority; GS_EXPORT_CLASS @interface NSOperation : NSObject { #if GS_NONFRAGILE # if defined(GS_NSOperation_IVARS) @public GS_NSOperation_IVARS # endif #else @private id _internal; #endif } /** Adds a dependency to the receiver.
* The receiver is not considered ready to execute until all of its * dependencies have finished executing.
* You must not add a particular object to the receiver more than once.
* You must not create loops of dependencies (this would cause deadlock).
*/ - (void) addDependency: (NSOperation *)op; /** Marks the operation as cancelled (causes subsequent calls to the * -isCancelled method to return YES).
* This does not directly cause the receiver to stop executing ... it is the * responsibility of the receiver to call -isCancelled while executing and * act accordingly.
* If an operation in a queue is cancelled before it starts executing, it * will be removed from the queue (though not necessarily immediately).
* Calling this method on an object which has already finished executing * has no effect. */ - (void) cancel; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) /** * Returns the block that will be executed after the operation finishes. */ - (GSOperationCompletionBlock) completionBlock; #endif /** Returns all the dependencies of the receiver in the order in which they * were added. */ - (NSArray *) dependencies; /** This method should return YES if the -cancel method has been called.
* NB. a cancelled operation may still be executing. */ - (BOOL) isCancelled; /** This method returns YES if the receiver handles its own environment or * threading rather than expecting to run in an evironment set up elsewhere * (eg, by an [NSOperationQueue] instance).
* The default implementation returns NO. */ - (BOOL) isConcurrent; /** This method should return YES if the receiver is currently executing its * -main method (even if -cancel has been called). */ - (BOOL) isExecuting; /** This method should return YES if the receiver has finished executing its * -main method (irrespective of whether the execution completed due to * cancellation, failure, or success). */ - (BOOL) isFinished; /** This method should return YES when the receiver is ready to begin * executing. That is, the receiver must have no dependencies which * have not finished executing.
* Also returns YES if the operation has been cancelled (even if there * are unfinished dependencies).
* An executing or finished operation is also considered to be ready. */ - (BOOL) isReady; /** * This is the method which actually performs the operation ... * the default implementation does nothing.
* You MUST ensure that your implemention of -main does not raise any * exception or call [NSThread-exit] as either of these will terminate * the operation prematurely resulting in the operation never reaching * the -isFinished state.
* If you are writing a concurrent subclass, you should override -start * instead of (or as well as) the -main method. */ - (void) main; /** Returns the priority set using the -setQueuePriority method, or * NSOperationQueuePriorityNormal if no priority has been set. */ - (NSOperationQueuePriority) queuePriority; /** Removes a dependency from the receiver. */ - (void) removeDependency: (NSOperation *)op; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) /** * Sets the block that will be executed when the operation has finished. */ - (void) setCompletionBlock: (GSOperationCompletionBlock)aBlock; #endif /** Sets the priority for the receiver. If the value supplied is not one of * the predefined queue priorities, it is converted into the next available * defined value moving towards NSOperationQueuePriorityNormal. */ - (void) setQueuePriority: (NSOperationQueuePriority)priority; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) /** Sets the thread priority to be used while executing then -main method. * The priority change is implemented in the -start method, so if you are * replacing -start you are responsible for managing this.
* The valid range is 0.0 to 1.0 */ - (void) setThreadPriority: (double)prio; #endif /** This method is called to start execution of the receiver.
*

For concurrent operations, the subclass must override this method * to set up the environment for the operation to execute, must execute the * -main method, must ensure that -isExecuting and -isFinished return the * correct values, and must manually call key-value-observing methods to * notify observers of the state of those two properties.
* The subclass implementation must NOT call the superclass implementation. *

*

For non-concurrent operations, the default implementation of this method * performs all the work of setting up environment etc, and the subclass only * needs to override the -main method. *

*/ - (void) start; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) /** Returns the thread priority to be used executing the -main method. * The default is 0.5 */ - (double) threadPriority; /** This method blocks the current thread until the receiver finishes.
* Care must be taken to avoid deadlock ... you must not call this method * from the same thread that the receiver started in. */ - (void) waitUntilFinished; #endif @end GS_EXPORT_CLASS @interface NSBlockOperation : NSOperation { @private NSMutableArray *_executionBlocks; void *_reserved; } // Managing the blocks in the Operation + (instancetype) blockOperationWithBlock: (GSBlockOperationBlock)block; - (void) addExecutionBlock: (GSBlockOperationBlock)block; - (NSArray *) executionBlocks; @end /** * NSOperationQueue */ // Enumerated type for default operation count. enum { NSOperationQueueDefaultMaxConcurrentOperationCount = -1 }; GS_EXPORT_CLASS @interface NSOperationQueue : NSObject { #if GS_NONFRAGILE # if defined(GS_NSOperationQueue_IVARS) @public GS_NSOperationQueue_IVARS # endif #else @private id _internal; #endif } #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) /** If called from within the -main method of an operation which is * currently being executed by a queue, this returns the queue instance * in use. */ + (id) currentQueue; /** Returns the default queue on the main thread. */ + (id) mainQueue; #endif /** Adds an operation to the receiver. */ - (void) addOperation: (NSOperation *)op; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) /** Adds multiple operations to the receiver and (optionally) waits for * all the operations in the queue to finish. */ - (void) addOperations: (NSArray *)ops waitUntilFinished: (BOOL)shouldWait; /** This method wraps a block in an operation and adds it to the queue. */ - (void) addOperationWithBlock: (GSBlockOperationBlock)block; #endif /** Cancels all outstanding operations in the queue. */ - (void) cancelAllOperations; /** Returns a flag indicating whether the queue is currently suspended. */ - (BOOL) isSuspended; /** Returns the value set using the -setMaxConcurrentOperationCount: * method, or NSOperationQueueDefaultMaxConcurrentOperationCount if * none has been set.
*/ - (NSInteger) maxConcurrentOperationCount; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) /** Return the name of this operation queue. */ - (NSString*) name; /** Return the number of operations in the queue at an instant. */ - (NSUInteger) operationCount; #endif /** Returns all the operations in the queue at an instant. */ - (NSArray *) operations; /** Sets the number of concurrent operations permitted.
* The default (NSOperationQueueDefaultMaxConcurrentOperationCount) * means that the queue should decide how many it does based on * system load etc. */ - (void) setMaxConcurrentOperationCount: (NSInteger)cnt; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) /** Sets the name for this operation queue. */ - (void) setName: (NSString*)s; #endif /** Marks the receiver as suspended ... while suspended an operation queue * will not start any more operations. */ - (void) setSuspended: (BOOL)flag; /** Waits until all operations in the queue have finished (or been cancelled * and removed from the queue). */ - (void) waitUntilAllOperationsAreFinished; @end #if defined(__cplusplus) } #endif #endif #endif /* __NSOperation_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSOrderedSet.h000066400000000000000000000233741435650067400223560ustar00rootroot00000000000000/** Interface for NSOrderedSet, NSMutableOrderedSet for GNUStep Copyright (C) 2019 Free Software Foundation, Inc. Written by: Gregory John Casamento Created: May 17 2019 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef _NSOrderedSet_h_GNUSTEP_BASE_INCLUDE #define _NSOrderedSet_h_GNUSTEP_BASE_INCLUDE #if OS_API_VERSION(MAC_OS_X_VERSION_10_7,GS_API_LATEST) #import #import #import #import #import #import #if defined(__cplusplus) extern "C" { #endif @class GS_GENERIC_CLASS(NSArray, ElementT); @class GS_GENERIC_CLASS(NSEnumerator, ElementT); @class GS_GENERIC_CLASS(NSSet, ElementT); @class GS_GENERIC_CLASS(NSDictionary, KeyT:id, ValT); @class NSString; @class NSPredicate; GS_EXPORT_CLASS @interface GS_GENERIC_CLASS(NSOrderedSet, __covariant ElementT) : NSObject // class methods + (instancetype) orderedSet; + (instancetype) orderedSetWithArray:(GS_GENERIC_CLASS(NSArray, ElementT)*)objects; + (instancetype) orderedSetWithArray:(GS_GENERIC_CLASS(NSArray, ElementT)*)objects range: (NSRange)range copyItems:(BOOL)flag; + (instancetype) orderedSetWithObject:(GS_GENERIC_TYPE(ElementT))anObject; + (instancetype) orderedSetWithObjects:(GS_GENERIC_TYPE(ElementT))firstObject, ...; + (instancetype) orderedSetWithObjects:(const GS_GENERIC_TYPE(ElementT)[])objects count:(NSUInteger) count; + (instancetype) orderedSetWithOrderedSet:(GS_GENERIC_CLASS(NSOrderedSet, ElementT)*)aSet; + (instancetype) orderedSetWithSet:(GS_GENERIC_CLASS(NSSet, ElementT)*)aSet; + (instancetype) orderedSetWithSet:(GS_GENERIC_CLASS(NSSet, ElementT)*)aSet copyItems:(BOOL)flag; // instance methods - (instancetype) initWithArray:(GS_GENERIC_CLASS(NSArray, ElementT)*)array; - (instancetype) initWithArray:(GS_GENERIC_CLASS(NSArray, ElementT)*)array copyItems:(BOOL)flag; - (instancetype) initWithArray:(GS_GENERIC_CLASS(NSArray, ElementT)*)array range:(NSRange)range copyItems:(BOOL)flag; - (instancetype) initWithObject:(id)object; - (instancetype) initWithObjects:(GS_GENERIC_TYPE(ElementT))firstObject, ...; - (instancetype) initWithObjects:(const GS_GENERIC_TYPE(ElementT)[])objects count:(NSUInteger)count; - (instancetype) initWithOrderedSet:(GS_GENERIC_CLASS(NSOrderedSet, ElementT)*)aSet; - (instancetype) initWithOrderedSet:(GS_GENERIC_CLASS(NSOrderedSet, ElementT)*)aSet copyItems:(BOOL)flag; - (instancetype) initWithOrderedSet:(GS_GENERIC_CLASS(NSOrderedSet, ElementT)*)aSet range: (NSRange)range copyItems:(BOOL)flag; - (instancetype) initWithSet:(GS_GENERIC_CLASS(NSSet, ElementT)*)aSet; - (instancetype) initWithSet:(GS_GENERIC_CLASS(NSSet, ElementT)*)aSet copyItems:(BOOL)flag; - (instancetype) init; - (NSUInteger) count; - (BOOL)containsObject:(GS_GENERIC_TYPE(ElementT))anObject; - (void) enumerateObjectsAtIndexes:(NSIndexSet *)indexSet options:(NSEnumerationOptions)opts usingBlock:(GSEnumeratorBlock)aBlock; - (void) enumerateObjectsUsingBlock: (GSEnumeratorBlock)aBlock; - (void) enumerateObjectsWithOptions:(NSEnumerationOptions)opts usingBlock:(GSEnumeratorBlock)aBlock; - (GS_GENERIC_TYPE(ElementT)) firstObject; - (GS_GENERIC_TYPE(ElementT)) lastObject; - (GS_GENERIC_TYPE(ElementT)) objectAtIndex: (NSUInteger)index; - (GS_GENERIC_TYPE(ElementT)) objectAtIndexedSubscript:(NSUInteger)index; - (GS_GENERIC_CLASS(NSArray, ElementT)*) objectsAtIndexes:(NSIndexSet *)indexes; - (NSUInteger) indexOfObject:(GS_GENERIC_TYPE(ElementT))objects; - (NSUInteger) indexOfObject: (id)key inSortedRange: (NSRange)range options: (NSBinarySearchingOptions)options usingComparator: (NSComparator)comparator; - (NSUInteger) indexOfObjectAtIndexes:(NSIndexSet *)indexSet options:(NSEnumerationOptions)opts passingTest:(GSPredicateBlock)predicate; - (NSUInteger) indexOfObjectPassingTest:(GSPredicateBlock)predicate; - (NSUInteger) indexOfObjectWithOptions:(NSEnumerationOptions)opts passingTest:(GSPredicateBlock)predicate; - (NSIndexSet *) indexesOfObjectsAtIndexes:(NSIndexSet *)indexSet options:(NSEnumerationOptions)opts passingTest:(GSPredicateBlock)predicate; - (NSIndexSet *)indexesOfObjectsPassingTest:(GSPredicateBlock)predicate; - (NSIndexSet *) indexesOfObjectsWithOptions:(NSEnumerationOptions)opts passingTest:(GSPredicateBlock)predicate; - (GS_GENERIC_CLASS(NSEnumerator, ElementT)*) objectEnumerator; - (GS_GENERIC_CLASS(NSEnumerator, ElementT)*) reverseObjectEnumerator; - (NSOrderedSet *)reversedOrderedSet; - (void) getObjects: (__unsafe_unretained GS_GENERIC_TYPE(ElementT)[])aBuffer range: (NSRange)aRange; // Key value coding support - (void) setValue: (id)value forKey: (NSString*)key; - (id) valueForKey: (NSString*)key; // Comparing Sets - (BOOL) isEqualToOrderedSet: (NSOrderedSet *)aSet; // Set operations - (BOOL) intersectsOrderedSet: (NSOrderedSet *)aSet; - (BOOL) intersectsSet: (NSSet *)aSet; - (BOOL) isSubsetOfOrderedSet: (NSOrderedSet *)aSet; - (BOOL) isSubsetOfSet:(NSSet *)aSet; // Creating a Sorted Array - (GS_GENERIC_CLASS(NSArray, ElementT) *) sortedArrayUsingDescriptors:(NSArray *)sortDescriptors; - (GS_GENERIC_CLASS(NSArray, ElementT) *) sortedArrayUsingComparator: (NSComparator)comparator; - (GS_GENERIC_CLASS(NSArray, ElementT) *) sortedArrayWithOptions: (NSSortOptions)options usingComparator: (NSComparator)comparator; // Filtering Ordered Sets - (NSOrderedSet *)filteredOrderedSetUsingPredicate: (NSPredicate *)predicate; // Describing a set - (NSString *) description; - (NSString *) descriptionWithLocale: (NSLocale *)locale; - (NSString *) descriptionWithLocale: (NSLocale *)locale indent: (BOOL)flag; // Convert to other types - (GS_GENERIC_CLASS(NSArray, ElementT) *) array; - (GS_GENERIC_CLASS(NSSet, ElementT) *) set; @end // Mutable Ordered Set GS_EXPORT_CLASS @interface GS_GENERIC_CLASS(NSMutableOrderedSet, ElementT) : GS_GENERIC_CLASS(NSOrderedSet, ElementT) // Creating a Mutable Ordered Set + (instancetype)orderedSetWithCapacity: (NSUInteger)capacity; - (instancetype)initWithCapacity: (NSUInteger)capacity; - (instancetype) init; - (void)addObject:(GS_GENERIC_TYPE(ElementT))anObject; - (void)addObjects:(const GS_GENERIC_TYPE(ElementT)[])objects count:(NSUInteger)count; - (void)addObjectsFromArray:(GS_GENERIC_CLASS(NSArray, ElementT)*)otherArray; - (void)insertObject:(GS_GENERIC_TYPE(ElementT))object atIndex:(NSUInteger)index; - (void)setObject:(GS_GENERIC_TYPE(ElementT))object atIndexedSubscript:(NSUInteger)index; - (void)insertObjects:(GS_GENERIC_CLASS(NSArray, ElementT)*)array atIndexes:(NSIndexSet *)indexes; - (void)removeObject:(GS_GENERIC_TYPE(ElementT))object; - (void)removeObjectAtIndex:(NSUInteger)index; - (void)removeObjectsAtIndexes:(NSIndexSet *)indexes; - (void)removeObjectsInArray:(GS_GENERIC_CLASS(NSArray, ElementT)*)otherArray; - (void)removeObjectsInRange:(NSRange)range; - (void)removeAllObjects; - (void)replaceObjectAtIndex:(NSUInteger)index withObject:(GS_GENERIC_TYPE(ElementT))object; - (void) replaceObjectsAtIndexes: (NSIndexSet *)indexes withObjects: (GS_GENERIC_CLASS(NSArray, ElementT)*)objects; - (void) replaceObjectsInRange:(NSRange)range withObjects:(const GS_GENERIC_TYPE(ElementT)[])objects count: (NSUInteger)count; - (void)setObject:(GS_GENERIC_TYPE(ElementT))object atIndex:(NSUInteger)index; - (void)moveObjectsAtIndexes:(NSIndexSet *)indexes toIndex:(NSUInteger)index; - (void) exchangeObjectAtIndex:(NSUInteger)index withObjectAtIndex:(NSUInteger)otherIndex; - (void)filterUsingPredicate:(NSPredicate *)predicate; - (void) sortUsingDescriptors:(NSArray *)descriptors; - (void) sortUsingComparator: (NSComparator)comparator; - (void) sortWithOptions: (NSSortOptions)options usingComparator: (NSComparator)comparator; - (void) sortRange: (NSRange)range options:(NSSortOptions)options usingComparator: (NSComparator)comparator; - (void) intersectOrderedSet:(GS_GENERIC_CLASS(NSOrderedSet, ElementT)*)aSet; - (void) intersectSet:(GS_GENERIC_CLASS(NSSet, ElementT)*)aSet; - (void) minusOrderedSet:(GS_GENERIC_CLASS(NSOrderedSet, ElementT)*)aSet; - (void) minusSet:(GS_GENERIC_CLASS(NSSet, ElementT)*)aSet; - (void) unionOrderedSet:(GS_GENERIC_CLASS(NSOrderedSet, ElementT)*)aSet; - (void) unionSet:(GS_GENERIC_CLASS(NSSet, ElementT)*)aSet; - (instancetype) initWithCoder: (NSCoder *)coder; @end #if defined(__cplusplus) } #endif #endif /* OS_API_VERSION check */ #endif /* _NSOrderedSet_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSOrthography.h000066400000000000000000000037671435650067400226300ustar00rootroot00000000000000/* Definition of class NSOrthography Copyright (C) 2019 Free Software Foundation, Inc. By: heron Date: Tue Nov 5 03:43:39 EST 2019 This file is part of the GNUstep Library. 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 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 USA. */ #ifndef _NSOrthography_h_GNUSTEP_BASE_INCLUDE #define _NSOrthography_h_GNUSTEP_BASE_INCLUDE #include #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) #if defined(__cplusplus) extern "C" { #endif @class NSDictionary, NSString, NSArray; GS_EXPORT_CLASS @interface NSOrthography : NSObject { NSDictionary *_languageMap; NSString *_dominantScript; } - (instancetype) initWithDominantScript: (NSString *)script languageMap: (NSDictionary *)map; - (NSString *) dominantScript; - (NSDictionary *) languationMap; - (NSArray *) languagesForScript: (NSString *)script; - (NSString *) dominantLanguageForScript: (NSString *)script; - (NSString *) dominantLanguage; - (NSArray *) allScripts; - (NSArray *) allLanguages; + (instancetype) defaultOrthographyForLanguage: (NSString *)language; + (instancetype) orthographyWithDominantScript: (NSString *)script languageMap: (NSDictionary *)map; @end #if defined(__cplusplus) } #endif #endif /* GS_API_MACOSX */ #endif /* _NSOrthography_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSPathUtilities.h000066400000000000000000000246131435650067400231030ustar00rootroot00000000000000/** Interface to file path utilities for GNUStep Copyright (C) 1996-2016 Free Software Foundation, Inc. Written by: Andrew Kachites McCallum Created: May 1996 This file is part of the GNUstep Base Library. 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 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 USA. AutogsdocSource: NSPathUtilities.m */ #ifndef __NSPathUtilities_h_GNUSTEP_BASE_INCLUDE #define __NSPathUtilities_h_GNUSTEP_BASE_INCLUDE #import #import #if defined(__cplusplus) extern "C" { #endif @class NSDictionary; @class NSMutableDictionary; @class NSString; #if OS_API_VERSION(GS_API_NONE, GS_API_NONE) /** * This extension permits a change of username from that specified in the * LOGNAME environment variable. Using it will almost certainly cause * trouble if the process does not posses the file access privileges of the * new name. This is provided primarily for use by processes that run as * system-manager and need to act as particular users. It uses the * [NSUserDefaults +resetUserDefaults] extension to reset the defaults system * to use the defaults belonging to the new user. */ GS_EXPORT void GSSetUserName(NSString *aName); /** * Returns a mutable copy of the system-wide configuration used to * determine paths to locate files etc.
* If the newConfig argument is non-nil it is used to set the config * overriding any other version. You should not change the config * after the user defaults system has been initialised as the new * config will not be picked up by the defaults system.
*
* A typical sequence of operation might be to
* Call the function with a nil argument to obtain the configuration * information currently in use (usually obtained from the main GNUstep * configuration file).
* Modify the dictionary contents.
* Call the function again passing back in the modified config.
*
* If you call this function with a non-nil argument before the system * configuration file has been read, you will prevent the file from * being read. However, you must take care doing this that creation * of the config dictionary you are going to pass in to the function * does not have any side-effects which would cause the config file * to be read earlier.
* If you want to prevent the user specific config file from being * read, you must set the GNUSTEP_USER_CONFIG_FILE value in the * dictionary to be an empty string. */ GS_EXPORT NSMutableDictionary* GNUstepConfig(NSDictionary *newConfig); /** * Returns the location of the defaults database for the specified user. * This uses the same information you get from GNUstepConfig() and * GNUstepUserConfig() and builds the path to the defaults database * fromm it. */ GS_EXPORT NSString* GSDefaultsRootForUser(NSString *userName); /** * The config dictionary passed to this function should be a * system-wide config as provided by GNUstepConfig() ... and * this function merges in user specific configuration file * information if such a file exists and is owned by the user.
* NB. If the GNUSTEP_USER_CONFIG_FILE value in the system-wide * config is an empty string, no user-specifc config will be * read. */ GS_EXPORT void GNUstepUserConfig(NSMutableDictionary *config, NSString *userName); #endif GS_EXPORT NSString *NSUserName(void); GS_EXPORT NSString *NSHomeDirectory(void); GS_EXPORT NSString *NSHomeDirectoryForUser(NSString *loginName); #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) enum { NSApplicationDirectory = 1, /** Applications */ NSDemoApplicationDirectory, /** Demos */ NSDeveloperApplicationDirectory, /** Deprecated */ NSAdminApplicationDirectory, /** Administration */ NSLibraryDirectory, /** Library */ NSDeveloperDirectory, /** Developer (deprecated on OSX). */ NSUserDirectory, /** user home directories */ NSDocumentationDirectory, /** Documentation */ #if OS_API_VERSION(MAC_OS_X_VERSION_10_2, GS_API_LATEST) NSDocumentDirectory, /** Documents */ #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_3, GS_API_LATEST) NSCoreServicesDirectory, /** CoreServices */ #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_4, GS_API_LATEST) NSDesktopDirectory = 12, /** location of users desktop */ NSCachesDirectory = 13, /** location of users cache files */ NSApplicationSupportDirectory = 14, /** location of app support files */ #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_5, GS_API_LATEST) NSDownloadsDirectory = 15, /** location of downloaded files */ #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) NSMoviesDirectory = 17, /** location of video/movie files */ NSMusicDirectory = 18, /** location of music files */ NSPicturesDirectory = 19, /** location of picture/images files */ NSItemReplacementDirectory = 99, /** pass to URLFirDirectory:inDomain: appropriateForURL:create:error to create a temporary directory */ #endif NSAllApplicationsDirectory = 100, /** all app directories */ NSAllLibrariesDirectory = 101, /** all library resources */ #if OS_API_VERSION(MAC_OS_X_VERSION_10_8, GS_API_LATEST) NSTrashDirectory = 102, /** location of the trash directory */ #endif #define GSApplicationSupportDirectory NSApplicationSupportDirectory /* GNUstep Directory Identifiers * Start at 1000, we hope Apple will never overlap. */ GSLibrariesDirectory = 1000, /** libraries (binary code) */ GSToolsDirectory, /** non-gui programs */ GSFontsDirectory, /** font storage */ GSFrameworksDirectory, /** frameworks */ GSWebApplicationsDirectory, /** web applications (GSWeb or SOPE) */ GSAdminToolsDirectory /** admin non-gui programs */ }; /** * Enumeration of possible requested directory type specifiers for * NSSearchPathForDirectoriesInDomains() function. On a traditional * GNUstep filesystem layout these correspond to the subdirectories * that may be found in the various domains, such as "Library" * and "Applications". In a different filesystem layout these * directories might be located anywhere on disk. { NSApplicationDirectory, NSDemoApplicationDirectory, NSDeveloperApplicationDirectory, NSAdminApplicationDirectory, NSLibraryDirectory, NSDeveloperDirectory, NSUserDirectory, NSDocumentationDirectory, NSDocumentDirectory, NSCoreServiceDirectory, NSDesktopDirectory, NSCachesDirectory, NSApplicationSupportDirectory NSAllApplicationsDirectory, NSAllLibrariesDirectory, NSItemReplacementDirectory, GSLibrariesDirectory, GSToolsDirectory, GSAdminToolsDirectory, GSFontsDirectory, GSFrameworksDirectory, GSWebApplicationsDirectory } */ typedef NSUInteger NSSearchPathDirectory; enum { NSUserDomainMask = 1, /** The user's personal items */ NSLocalDomainMask = 2, /** Local for all users on the machine */ NSNetworkDomainMask = 4, /** Public for all users on network */ NSSystemDomainMask = 8, /** Standard GNUstep items */ NSAllDomainsMask = 0x0ffff /** all domains */ }; /** * Mask type for NSSearchPathForDirectoriesInDomains() function. A bitwise OR * of one or more of NSUserDomainMask, NSLocalDomainMask, * NSNetworkDomainMask, NSSystemDomainMask, NSAllDomainsMask. */ typedef NSUInteger NSSearchPathDomainMask; /** * Returns an array of search paths to look at for resources.
* The paths are returned in domain order: * USER, LOCAL, NETWORK then SYSTEM.
* The presence of a path in this list does not mean that the * path actually exists in the filesystem.
* If you are wanting to locate an existing resource, you should normally * call this function with NSAllDomainsMask, but if you wish to find the * path in which you should create a new file, you would generally * specify a particular domain, and then create the path in the file * system if it does not already exist. */ GS_EXPORT NSArray *NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory directoryKey, NSSearchPathDomainMask domainMask, BOOL expandTilde); /** * Returns the full username of the current user. * If unable to determine this, returns the standard user name. */ GS_EXPORT NSString *NSFullUserName(void); /** * Returns the standard paths in which applications are stored and * should be searched for. Calls NSSearchPathForDirectoriesInDomains()
* Refer to the GNUstep File System Hierarchy documentation for more info. */ GS_EXPORT NSArray *NSStandardApplicationPaths(void); /** * Returns the standard paths in which resources are stored and * should be searched for. Calls NSSearchPathForDirectoriesInDomains()
* Refer to the GNUstep File System Hierarchy documentation for more info. */ GS_EXPORT NSArray *NSStandardLibraryPaths(void); /** * Returns the name of a directory in which temporary files can be stored. * Under GNUstep this is a location which is not readable by other users. *
* If a suitable directory can't be found or created, this function raises an * NSGenericException. */ GS_EXPORT NSString *NSTemporaryDirectory(void); /** * Returns the location of the root directory of the file * hierarchy. This lets you build paths in a system independent manner * (for instance the root on unix is '/' but on windows it is 'C:\') * by appending path components to the root.
* Don't assume that /System, /Network etc exist in this path (generally * they don't)! Use other path utility functions such as * NSSearchPathForDirectoriesInDomains() to find standard locations * for libraries, applications etc.
* Refer to the GNUstep File System Hierarchy documentation for more info. */ GS_EXPORT NSString *NSOpenStepRootDirectory(void); #endif /* GS_API_MACOSX */ #if defined(__cplusplus) } #endif #endif /* __NSPathUtilities_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSPersonNameComponents.h000066400000000000000000000040241435650067400244220ustar00rootroot00000000000000/* Definition of class NSPersonNameComponents Copyright (C) 2019 Free Software Foundation, Inc. Implemented by: Gregory Casamento Date: Sep 2019 This file is part of the GNUstep Library. 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 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 USA. */ #ifndef __NSPersonNameComponents_h_GNUSTEP_BASE_INCLUDE #define __NSPersonNameComponents_h_GNUSTEP_BASE_INCLUDE #if OS_API_VERSION(MAC_OS_X_VERSION_10_7,GS_API_LATEST) #import @class NSString; GS_EXPORT_CLASS @interface NSPersonNameComponents : NSObject { @private NSString *_namePrefix; NSString *_givenName; NSString *_middleName; NSString *_familyName; NSString *_nameSuffix; NSString *_nickname; NSPersonNameComponents *_phoneticRepresentation; } - (NSString *) namePrefix; - (void) setNamePrefix: (NSString *)namePrefix; - (NSString *) givenName; - (void) setGivenName: (NSString *)givenName; - (NSString *) middleName; - (void) setMiddleName: (NSString *)middleName; - (NSString *) familyName; - (void) setFamilyName: (NSString *)familyName; - (NSString *) nameSuffix; - (void) setNameSuffix: (NSString *)nameSuffix; - (NSString *) nickname; - (void) setNickname: (NSString *)nickname; - (NSPersonNameComponents *) phoneticRepresentation; - (void) setPhoneticRepresentation: (NSPersonNameComponents *)pr; @end #endif #endif gnustep-base-1.29.0/Headers/Foundation/NSPersonNameComponentsFormatter.h000066400000000000000000000065071435650067400263160ustar00rootroot00000000000000/* Definition of class NSPersonNameComponents Copyright (C) 2019 Free Software Foundation, Inc. Implemented by: Gregory Casamento Date: Sep 2019 This file is part of the GNUstep Library. 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 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 USA. */ #ifndef __NSPersonNameComponentsFormatter_h_GNUSTEP_BASE_INCLUDE #define __NSPersonNameComponentsFormatter_h_GNUSTEP_BASE_INCLUDE #import #import #if OS_API_VERSION(MAC_OS_X_VERSION_10_11,GS_API_LATEST) // Style... enum { NSPersonNameComponentsFormatterStyleDefault = 0, NSPersonNameComponentsFormatterStyleShort, NSPersonNameComponentsFormatterStyleMedium, NSPersonNameComponentsFormatterStyleLong, NSPersonNameComponentsFormatterStyleAbbreviated }; typedef NSUInteger NSPersonNameComponentsFormatterStyle; // Options... enum { NSPersonNameComponentsFormatterPhonetic = (1UL << 1) }; typedef NSUInteger NSPersonNameComponentsFormatterOptions; @class NSString; GS_EXPORT_CLASS @interface NSPersonNameComponentsFormatter : NSFormatter { @private BOOL _phonetic; NSPersonNameComponentsFormatterStyle _style; NSPersonNameComponentsFormatterOptions _nameOptions; } // Designated init... + (NSString *) localizedStringFromPersonNameComponents: (NSPersonNameComponents *)components style: (NSPersonNameComponentsFormatterStyle)nameFormatStyle options: (NSPersonNameComponentsFormatterOptions)nameOptions; // Setters - (NSPersonNameComponentsFormatterStyle) style; - (void) setStyle: (NSPersonNameComponentsFormatterStyle)style; - (BOOL) isPhonetic; - (void) setPhonetic: (BOOL)flag; // Convenience methods... - (NSString *) stringFromPersonNameComponents: (NSPersonNameComponents *)components; - (NSAttributedString *) annotatedStringFromPersonNameComponents: (NSPersonNameComponents *)components; - (NSPersonNameComponents *) personNameComponentsFromString: (NSString *)string; - (BOOL)getObjectValue: (id *)obj forString: (NSString *)string errorDescription: (NSString **)error; @end // components for attributed strings; GS_EXPORT NSString * const NSPersonNameComponentKey; GS_EXPORT NSString * const NSPersonNameComponentGivenName; GS_EXPORT NSString * const NSPersonNameComponentFamilyName; GS_EXPORT NSString * const NSPersonNameComponentMiddleName; GS_EXPORT NSString * const NSPersonNameComponentPrefix; GS_EXPORT NSString * const NSPersonNameComponentSuffix; GS_EXPORT NSString * const NSPersonNameComponentNickname; GS_EXPORT NSString * const NSPersonNameComponentDelimiter; #endif #endif gnustep-base-1.29.0/Headers/Foundation/NSPointerArray.h000066400000000000000000000107711435650067400227320ustar00rootroot00000000000000/**Interface for NSPointerArray for GNUStep Copyright (C) 2009 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 2009 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSPointerArray_h_GNUSTEP_BASE_INCLUDE #define __NSPointerArray_h_GNUSTEP_BASE_INCLUDE #import #import #import #if OS_API_VERSION(MAC_OS_X_VERSION_10_5, GS_API_LATEST) #if defined(__cplusplus) extern "C" { #endif /** * An NSPointerArray acts like a standard mutable array except that it * can contain nil and even non-object values.
* The count can also be set causing the array to shrink (discarding items) * or grow (adding nil/zero items). */ GS_EXPORT_CLASS @interface NSPointerArray : NSObject /** Allocate an instance, initialise using initWithOptions: and * return it autoreleased. */ + (id) pointerArrayWithOptions: (NSPointerFunctionsOptions)options; /** Allocate an instance, initialise using initWithPointerFunctions: and * return it autoreleased. */ + (id) pointerArrayWithPointerFunctions: (NSPointerFunctions *)functions; /** Returns a new pointer array for storing strong (retained) references to * objects. */ + (id) strongObjectsPointerArray; /** Returns a new pointer array for storing zeroing weak references to objects. */ + (id) weakObjectsPointerArray; /** Removes all nil/zero items from the array. */ - (void) compact; // eliminate NULLs /** Returns the number of items in the array. */ - (NSUInteger) count; /** Initialises the receiver with the specified options. */ - (id) initWithOptions: (NSPointerFunctionsOptions)options; /** Initialises the receiver using the supplied object. */ - (id) initWithPointerFunctions: (NSPointerFunctions*)functions; /** Adds an item at the end of the array. */ - (void) addPointer: (void*)pointer; /** Inserts an item at the specified index causing all higher indexed * items to be adjusted upwards.
* WARNING ... the Apple documented (and implemented in MacOS-X 10.5) * behavior is to raise an exception if index is the same as the count of * items in the array. This is insane ... for arrays, data and strings you * can insert at the end of an object to append to it, so the behavior of * this class in MacOS is inconsistent and must be considered buggy. */ - (void) insertPointer: (void*)pointer atIndex: (NSUInteger)index; /** Returns the item at the given index or raises an exception if index * is out of range. */ - (void*) pointerAtIndex: (NSUInteger)index; /** Returns an autorelease NSPointerFunctions instance giving the * functions in use by the receiver. */ - (NSPointerFunctions*) pointerFunctions; /** Removes the item at the specified index, adjusting the positions of * all higher indexed items. */ - (void) removePointerAtIndex: (NSUInteger)index; /* Replaces the item at the specified index. The index must be less than * the current count or an exception is raised. */ - (void) replacePointerAtIndex: (NSUInteger)index withPointer: (void*)item; /** Sets the number of items in the receiver. Adds nil/zero items to pad * the end of the array, or removes extraneous items from the end. */ - (void) setCount: (NSUInteger)count; @end @interface NSPointerArray (NSArrayConveniences) /** Creates an instance configured to hold objects and prevent them from * being garbage collected. */ + (id) pointerArrayWithStrongObjects; /** Creates an instance configured to hold objects, allowing them to be * garbage collected and replaced by nil if/when they are collected. */ + (id) pointerArrayWithWeakObjects; /** Returns an array containing all the non-nil objects from the receiver. */ - (NSArray*) allObjects; @end #if defined(__cplusplus) } #endif #endif #endif gnustep-base-1.29.0/Headers/Foundation/NSPointerFunctions.h000066400000000000000000000120551435650067400236210ustar00rootroot00000000000000/**Interface for NSPointerFunctions for GNUStep Copyright (C) 2008 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 2008 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSPointerFunctions_h_GNUSTEP_BASE_INCLUDE #define __NSPointerFunctions_h_GNUSTEP_BASE_INCLUDE #import #if OS_API_VERSION(MAC_OS_X_VERSION_10_5, GS_API_LATEST) #if defined(__cplusplus) extern "C" { #endif /** Options flags come in three groups ...
* Memory management options (only one of which may be set)
* Personality options (only one of which may be set)
* Others. */ enum { /** Garbage collected strong references , or retain counting if GC * is not active. */ NSPointerFunctionsStrongMemory = (0<<0), /** Garbage collected weak references */ NSPointerFunctionsZeroingWeakMemory = (1<<0), /** Non-GC memory */ NSPointerFunctionsOpaqueMemory = (2<<0), /** Heap (calloc/free) memory */ NSPointerFunctionsMallocMemory = (3<<0), /** MACH virtual memory (not implemented) */ NSPointerFunctionsMachVirtualMemory = (4<<0), /** Uses read and write barriers appropriate for either automatic reference * counting or garbage collection. Note that the GNUstep implementation will * behave correctly when used with manual or automatic reference counting, as * long as the Objective-C runtime supports automatic reference counting. */ NSPointerFunctionsWeakMemory = (5<<0), /** Use the -hash and -isEqual: methods for storing objects, and the * -description method to describe them. */ NSPointerFunctionsObjectPersonality = (0<<8), /** Use the pointer (shifted) as a hash, and compare for bitwise quality. */ NSPointerFunctionsOpaquePersonality = (1<<8), /** Use the pointer (shifted) as a hash, and compare for bitwise quality, * but use -description to desribe the objects. */ NSPointerFunctionsObjectPointerPersonality = (2<<8), /** Use strcmp for comparison and a hash of the string contents. Describe * assuming that the string contains UTF-8 data. */ NSPointerFunctionsCStringPersonality = (3<<8), /** Use memcmp for comparison and a hash of the sructure contents. * A size function must be set so that the size of the memcmp and hash * are known, */ NSPointerFunctionsStructPersonality = (4<<8), /** Use unmodified integer value for both hash and equality test. */ NSPointerFunctionsIntegerPersonality = (5<<8), /** Request the memory acquire function to allocate/copy items. */ NSPointerFunctionsCopyIn = (1<<16) }; /** An integer value containing memory option, personality option, * and copying option. */ typedef NSUInteger NSPointerFunctionsOptions; GS_EXPORT_CLASS @interface NSPointerFunctions : NSObject + (id) pointerFunctionsWithOptions: (NSPointerFunctionsOptions)options; - (id) initWithOptions: (NSPointerFunctionsOptions)options; - (void* (*)(const void *item, NSUInteger (*size)(const void *item), BOOL shouldCopy)) acquireFunction; - (NSString *(*)(const void *item)) descriptionFunction; - (NSUInteger (*)(const void *item, NSUInteger (*size)(const void *item))) hashFunction; - (BOOL (*)(const void *item1, const void *item2, NSUInteger (*size)(const void *item))) isEqualFunction; - (void (*)(const void *item, NSUInteger (*size)(const void *item))) relinquishFunction; - (void) setAcquireFunction: (void* (*)(const void *item, NSUInteger (*size)(const void *item), BOOL shouldCopy))func; - (void) setDescriptionFunction: (NSString *(*)(const void *item))func; - (void) setHashFunction: (NSUInteger (*)(const void *item, NSUInteger (*size)(const void *item)))func; - (void) setIsEqualFunction: (BOOL (*)(const void *item1, const void *item2, NSUInteger (*size)(const void *item)))func; - (void) setRelinquishFunction: (void (*)(const void *item, NSUInteger (*size)(const void *item))) func; - (void) setSizeFunction: (NSUInteger (*)(const void *item))func; - (void) setUsesStrongWriteBarrier: (BOOL)flag; - (void) setUsesWeakReadAndWriteBarriers: (BOOL)flag; - (NSUInteger (*)(const void *item)) sizeFunction; - (BOOL) usesStrongWriteBarrier; - (BOOL) usesWeakReadAndWriteBarriers; @end #if defined(__cplusplus) } #endif #endif /* OS_API_VERSION(MAC_OS_X_VERSION_10_5, GS_API_LATEST) */ #endif /* __NSPointerFunctions_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSPort.h000066400000000000000000000226111435650067400212330ustar00rootroot00000000000000/** Interface for abstract superclass NSPort for use with NSConnection Copyright (C) 1997,2002 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: August 1997 This file is part of the GNUstep Base Library. 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 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 USA. AutogsdocSource: NSPort.m AutogsdocSource: NSSocketPort.m AutogsdocSource: NSMessagePort.m */ #ifndef __NSPort_h_GNUSTEP_BASE_INCLUDE #define __NSPort_h_GNUSTEP_BASE_INCLUDE #import #import #import #if defined(_WIN32) #include #include #else #include #define SOCKET int #endif #if defined(__cplusplus) extern "C" { #endif @class NSMutableArray; @class NSConnection; @class NSDate; @class NSRunLoop; @class NSString; @class NSPortMessage; @class NSHost; @interface NSObject(NSPortDelegateMethods) /** * Subclasses of NSPort send this message to their delegate on receipt * of a port message. */ - (void) handlePortMessage: (NSPortMessage*)aMessage; @end /** *

NSPort is an abstract class defining interfaces underlying * communications in the distributed objects framework. Each side of a * connection will have an NSPort object, responsible for sending * and receiving [NSPortMessage]s, which are then passed to delegates when * received. The NSPort must be added to the [NSRunLoop] as an * input source.

* *

This class also implements the functionality of the * NSMachPort class on OS X.

*/ GS_EXPORT_CLASS @interface NSPort : NSObject { #if GS_EXPOSE(NSPort) BOOL _is_valid; id _delegate; #endif } /** * Basic constructor returns object capable of send and receive.
* By default, the port returned is an instance of [NSMessagePort] * capable only of host-local communication. However, the * NSPortIsMessagePort user default may be set to NO to * change the behavior so that the returned value is an instance of * the [NSSocketPort] class. */ + (NSPort*) port; /** * NSMachPort compatibility method. */ + (NSPort*) portWithMachPort: (NSInteger)machPort; /** * Returns the object that received messages will be passed off to. */ - (id) delegate; /** * Sets the object that received messages will be passed off to. */ - (void) setDelegate: (id)anObject; /** * Basic initializer sets up object capable of send and receive. * See +port for more details. */ - (id) init; /** * NSMachPort compatibility method. */ - (id) initWithMachPort: (NSInteger)machPort; /** * NSMachPort compatibility. */ - (NSInteger) machPort; /** * Mark port as invalid, deregister with listeners and cease further network * operations. Subclasses should override and call super. */ - (void) invalidate; /** * Returns whether port has been marked invalid. */ - (BOOL) isValid; #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) /** * Adds to run loop as input source to be notified for input in given mode. * This method is for use by subclasses. */ - (void) addConnection: (NSConnection*)aConnection toRunLoop: (NSRunLoop*)aLoop forMode: (NSString*)aMode; /** * Removes from run loop as input source to be notified for input in given mode. * This method is for use by subclasses. */ - (void) removeConnection: (NSConnection*)aConnection fromRunLoop: (NSRunLoop*)aLoop forMode: (NSString*)aMode; /** * Returns amount of space used for header info at beginning of messages. * Subclasses should override (this implementation returns 0). */ - (NSUInteger) reservedSpaceLength; /** * Internal method for sending message, for use by subclasses. */ - (BOOL) sendBeforeDate: (NSDate*)when msgid: (NSInteger)msgid components: (NSMutableArray*)components from: (NSPort*)receivingPort reserved: (NSUInteger)length; /** * Internal method for sending message, for use by subclasses. */ - (BOOL) sendBeforeDate: (NSDate*)when components: (NSMutableArray*)components from: (NSPort*)receivingPort reserved: (NSUInteger)length; #endif @end /** * Notification posted when an instance of [NSPort] or a subclass becomes * invalid. */ GS_EXPORT NSString* const NSPortDidBecomeInvalidNotification; #define PortBecameInvalidNotification NSPortDidBecomeInvalidNotification #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) /** * Native socket type. */ typedef SOCKET NSSocketNativeHandle; /** *

An [NSPort] implementation for network object communications based on * BSD sockets. Can be used for interthread/interprocess * communications between same or different hosts (though on same host * [NSMessagePort] will be more efficient).

* *

Note that this class is incompatible with the latest OS X version.

*/ GS_EXPORT_CLASS @interface NSSocketPort : NSPort { #if GS_EXPOSE(NSSocketPort) NSRecursiveLock *myLock; NSHost *host; /* OpenStep host for this port. */ NSString *address; /* Forced internet address. */ uint16_t portNum; /* TCP port in host byte order. */ SOCKET listener; NSMapTable *handles; /* Handles indexed by socket. */ NSDictionary *tlscopts; /* TLS client options */ NSDictionary *tlssopts; /* TLS server options */ #if defined(_WIN32) WSAEVENT eventListener; NSMapTable *events; #endif #endif #if GS_NONFRAGILE #else /* Pointer to private additional data used to avoid breaking ABI * when we don't have the non-fragile ABI available. * Use this mechanism rather than changing the instance variable * layout (see Source/GSInternal.h for details). */ @private id _internal GS_UNUSED_IVAR; #endif } /** * Look up and return an existing NSSocketPort given a host and * number, or return nil if one has not been created. */ + (NSSocketPort*) existingPortWithNumber: (uint16_t)number onHost: (NSHost*)aHost; /** * This is the preferred initialisation method for NSSocketPort. *
* number should be a TCP/IP port number or may be zero for a port on * the local host.
* aHost should be the host for the port or may be nil for the local * host.
* addr is the IP address that MUST be used for this port - if it is nil * then, for the local host, the port uses ALL IP addresses, and for a * remote host, the port will use the first address that works.
* shouldListen specifies whether to listen on the port initially. */ + (NSSocketPort*) portWithNumber: (uint16_t)number onHost: (NSHost*)aHost forceAddress: (NSString*)addr listener: (BOOL)shouldListen; /** * Returns IP address of underlying socket. */ - (NSString*) address; /** * This is a callback method used by the NSRunLoop class to determine which * descriptors to watch for the port. */ - (void) getFds: (NSInteger*)fds count: (NSInteger*)count; /** * Delegates processing of a message. */ - (void) handlePortMessage: (NSPortMessage*)m; /** * Returns host that the underlying socket is connected to. */ - (NSHost*) host; /** * Returns port number of underlying socket. */ - (uint16_t) portNumber; #if !NO_GNUSTEP /** Sets the default options for use of TLS by socket ports.
* Setting nil (the default) means that TLS is not used.
* Setting an empty dictionary means that TLS is used with normal options. */ + (void) setClientOptionsForTLS: (NSDictionary*)opts; /** Sets the default options for use of TLS by socket ports.
* Setting nil (the default) means that TLS is not used.
* Setting an empty dictionary means that TLS is used with normal options. */ + (void) setServerOptionsForTLS: (NSDictionary*)opts; /** Overrides the default options for use of TLS by the receiver.
* Setting nil (the default) means that TLS is not used.
* Setting an empty dictionary means that TLS is used with normal options.
* This method has no effect on network sessions which are already established. */ - (void) setClientOptionsForTLS: (NSDictionary*)opts; /** Overrides the default options for use of TLS by the receiver.
* Setting nil (the default) means that TLS is not used.
* Setting an empty dictionary means that TLS is used with normal options.
* This method has no effect on network sessions which are already established. */ - (void) setServerOptionsForTLS: (NSDictionary*)opts; #endif @end /** * An [NSPort] implementation for network object communications * which can be used for interthread/interprocess communications * on the same host, but not between different hosts. */ GS_EXPORT_CLASS @interface NSMessagePort : NSPort { #if GS_EXPOSE(NSMessagePort) void *_internal; #endif } @end #endif #if defined(__cplusplus) } #endif #endif /* __NSPort_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSPortCoder.h000066400000000000000000000145631435650067400222170ustar00rootroot00000000000000/* Interface for NSPortCoder object for distributed objects Copyright (C) 2000 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: June 2000 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSPortCoder_h_GNUSTEP_BASE_INCLUDE #define __NSPortCoder_h_GNUSTEP_BASE_INCLUDE #import #import #if defined(__cplusplus) extern "C" { #endif @class NSMutableArray; @class NSMutableDictionary; @class NSConnection; @class NSPort; /** * This class is an [NSCoder] implementation specialized for sending objects * over network connections for immediate use (as opposed to the archivers * which persist objects for reconstitution after an indefinite term). It is * used to help implement the distributed objects framework by the * [NSConnection] class. Even for highly specialized applications, you * probably do not need to use this class directly. */ //FIXME: the above is what Apple's docs say, but looking at the code the // NSConnection is actually created by this class rather than the other way // around, so maybe the docs should be changed.. GS_EXPORT_CLASS @interface NSPortCoder : NSCoder { #if GS_EXPOSE(NSPortCoder) @private NSMutableArray *_comp; NSConnection *_conn; BOOL _is_by_copy; BOOL _is_by_ref; // Encoding BOOL _encodingRoot; BOOL _initialPass; id _dst; /* Serialization destination. */ IMP _eObjImp; /* Method to encode an id. */ IMP _eValImp; /* Method to encode others. */ #ifndef _IN_PORT_CODER_M #define GSIMapTable void* #endif GSIMapTable _clsMap; /* Class cross references. */ GSIMapTable _cIdMap; /* Conditionally coded. */ GSIMapTable _uIdMap; /* Unconditionally coded. */ GSIMapTable _ptrMap; /* Constant pointers. */ #ifndef _IN_PORT_CODER_M #undef GSIMapTable #endif unsigned _xRefC; /* Counter for cross-reference. */ unsigned _xRefO; /* Counter for cross-reference. */ unsigned _xRefP; /* Counter for cross-reference. */ // Decoding id _src; /* Deserialization source. */ IMP _dDesImp; /* Method to deserialize with. */ void (*_dTagImp)(id,SEL,unsigned char*,unsigned*,unsigned*); IMP _dValImp; /* Method to decode data with. */ #ifndef _IN_PORT_CODER_M #define GSIArray void* #endif GSIArray _clsAry; /* Class crossreference map. */ GSIArray _objAry; /* Object crossreference map. */ GSIArray _ptrAry; /* Pointer crossreference map. */ #ifndef _IN_PORT_CODER_M #undef GSIArray #endif NSMutableDictionary *_cInfo; /* Class version information. */ unsigned _cursor; /* Position in data buffer. */ unsigned _version; /* Version of archiver used. */ NSZone *_zone; /* Zone for allocating objs. */ #endif #if GS_NONFRAGILE #else /* Pointer to private additional data used to avoid breaking ABI * when we don't have the non-fragile ABI available. * Use this mechanism rather than changing the instance variable * layout (see Source/GSInternal.h for details). */ @private id _internal GS_UNUSED_IVAR; #endif } /** * Create a new instance for communications over send and recv, and send an * initial message through send as specified by comp. */ + (NSPortCoder*) portCoderWithReceivePort: (NSPort*)recv sendPort: (NSPort*)send components: (NSArray*)comp; /** * Initialize a new instance for communications over send and recv, and send an * initial message through send as specified by comp. */ - (id) initWithReceivePort: (NSPort*)recv sendPort: (NSPort*)send components: (NSArray*)comp; /** * Returns the NSConnection using this instance. */ - (NSConnection*) connection; /** * Return port object previously encoded by this instance. Mainly for use * by the ports themselves. */ - (NSPort*) decodePortObject; /** * Processes and acts upon the initial message the receiver was initialized * with.. */ - (void) dispatch; /** * Encodes aPort so it can be sent to the receiving side of the connection. * Mainly for use by the ports themselves. */ - (void) encodePortObject: (NSPort*)aPort; /** * Returns YES if receiver is in the process of encoding objects by copying * them (rather than substituting a proxy). This method is mainly needed * internally and by subclasses. */ - (BOOL) isBycopy; /** * Returns YES if receiver will substitute a proxy when encoding objects * rather than by copying them. This method is mainly needed * internally and by subclasses. */ - (BOOL) isByref; @end /** * This informal protocol allows an object to control the details of how an * object is sent over the wire in distributed objects Port communications. */ @interface NSObject (NSPortCoder) /** * Must return the class that will be created on the remote side * of the connection. If the class to be created is not the same * as that of the object returned by replacementObjectForPortCoder: * then the class must be capable of recognising the object it * actually gets in its initWithCoder: method. * The default operation is to return NSDistantObject unless the * object is being sent bycopy, in which case the objects actual * class is returned. To force bycopy operation the object should * return its own class. */ - (Class) classForPortCoder; /** * This message is sent to an object about to be encoded for sending * over the wire. The default action is to return an NSDistantObject * which is a local proxy for the object unless the object is being * sent bycopy, in which case the actual object is returned. * To force bycopy, an object should return itself. */ - (id) replacementObjectForPortCoder: (NSPortCoder*)aCoder; @end #if defined(__cplusplus) } #endif #endif /* __NSPortCoder_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSPortMessage.h000066400000000000000000000075341435650067400225470ustar00rootroot00000000000000/* NSPortMessage interface for GNUstep Copyright (C) 1998 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: October 1998 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSPortMessage_h_GNUSTEP_BASE_INCLUDE #define __NSPortMessage_h_GNUSTEP_BASE_INCLUDE #import #import #import #if defined(__cplusplus) extern "C" { #endif /** *

The data transported for distributed objects communications is sent over * the network encapsulated by NSPortMessage objects, which consist of two * [NSPort]s (sender and receiver, not sent over the network) and a body * consisting of one or more [NSData] or [NSPort] objects. (Data in the * [NSData] must be in network byte order.)

* *

See the [NSConnection] and [NSPortCoder] classes.

*/ @interface NSPortMessage : NSObject { #if GS_EXPOSE(NSPortMessage) @private unsigned _msgid; NSPort *_recv; NSPort *_send; NSMutableArray *_components; #endif #if GS_NONFRAGILE #else /* Pointer to private additional data used to avoid breaking ABI * when we don't have the non-fragile ABI available. * Use this mechanism rather than changing the instance variable * layout (see Source/GSInternal.h for details). */ @private id _internal GS_UNUSED_IVAR; #endif } /** * OpenStep compatibility. */ - (id) initWithMachMessage: (void*)buffer; /** Initializes to send message described by items (which should * contain only [NSPort] and/or [NSData] objects, with contents in network * byte order) over aPort. If/when a reply to the message is sent, it will * arrive on anotherPort. */ - (id) initWithSendPort: (NSPort*)aPort receivePort: (NSPort*)anotherPort components: (NSArray*)items; /** * Request that the message be sent before when. Will block until either * sends it (returns YES) or when expires (returns NO). The latter may occur * if many messages are queued up (by multiple threads) faster than they can * be sent over the network. */ - (BOOL) sendBeforeDate: (NSDate*)when; /** * Returns the message components originally used to constitute this message. */ - (NSArray*) components; /** * For an outgoing message, returns the port the receiver will send itself * through. For an incoming message, returns the port replies to the receiver * should be sent through. */ - (NSPort*) sendPort; /** * For an outgoing message, returns the port on which a reply to this message * will arrive. For an incoming message, returns the port this message * arrived on. */ - (NSPort*) receivePort; /** * Sets ID for message. This is not used by the distributed objects system, * but may be used in custom ways by cooperating applications to sort or * otherwise organize messages. */ - (void) setMsgid: (unsigned)anId; /** * Returns ID for message. This is not used by the distributed objects * system, but may be used in custom ways by cooperating applications to sort * or otherwise organize messages. Set to 0 initially. */ - (unsigned) msgid; @end #if defined(__cplusplus) } #endif #endif gnustep-base-1.29.0/Headers/Foundation/NSPortNameServer.h000066400000000000000000000062341435650067400232260ustar00rootroot00000000000000/** Interface of NSPortNameServer class for Distributed Objects Copyright (C) 1998,1999,2003 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: October 1998 This file is part of the GNUstep Base Library. 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 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 USA. NSPortNameServer class reference AutogsdocSource: NSPortNameServer.m AutogsdocSource: NSSocketPortNameServer.m AutogsdocSource: NSMessagePortNameServer.m */ #ifndef __NSPortNameServer_h_GNUSTEP_BASE_INCLUDE #define __NSPortNameServer_h_GNUSTEP_BASE_INCLUDE #import #import #import #if OS_API_VERSION(GS_API_MACOSX,HS_API_LATEST) #if defined(__cplusplus) extern "C" { #endif @class NSPort, NSString, NSMutableArray; GS_EXPORT_CLASS @interface NSPortNameServer : NSObject + (id) systemDefaultPortNameServer; - (NSPort*) portForName: (NSString*)name; - (NSPort*) portForName: (NSString*)name onHost: (NSString*)host; - (BOOL) registerPort: (NSPort*)port forName: (NSString*)name; - (BOOL) removePortForName: (NSString*)name; @end GS_EXPORT_CLASS @interface NSSocketPortNameServer : NSPortNameServer { #if GS_EXPOSE(NSSocketPortNameServer) NSMapTable *_portMap; /* Registered ports information. */ NSMapTable *_nameMap; /* Registered names information. */ #endif #if GS_NONFRAGILE #else /* Pointer to private additional data used to avoid breaking ABI * when we don't have the non-fragile ABI available. * Use this mechanism rather than changing the instance variable * layout (see Source/GSInternal.h for details). */ @private id _internal GS_UNUSED_IVAR; #endif } + (id) sharedInstance; - (NSPort*) portForName: (NSString*)name onHost: (NSString*)host; - (BOOL) registerPort: (NSPort*)port forName: (NSString*)name; - (BOOL) removePortForName: (NSString*)name; @end GS_EXPORT_CLASS @interface NSMessagePortNameServer : NSPortNameServer + (id) sharedInstance; /** Returns the [NSMessagePort] instance registered for the specified name * if it exists on the local host. */ - (NSPort*) portForName: (NSString*)name; /** Returns the port registered for the specified name (if it exists).
* The host must be an empty string or nil, since [NSMessagePort] instances * on other hosts are inaccessible from the current host. */ - (NSPort*) portForName: (NSString*)name onHost: (NSString*)host; @end #if defined(__cplusplus) } #endif #endif #endif gnustep-base-1.29.0/Headers/Foundation/NSPredicate.h000066400000000000000000000067471435650067400222230ustar00rootroot00000000000000/* Interface for NSPredicate for GNUStep Copyright (C) 2005 Free Software Foundation, Inc. Written by: Dr. H. Nikolaus Schaller Created: 2005 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSPredicate_h_GNUSTEP_BASE_INCLUDE #define __NSPredicate_h_GNUSTEP_BASE_INCLUDE #import #if OS_API_VERSION(MAC_OS_X_VERSION_10_4, GS_API_LATEST) #import #import #import #import #import #if defined(__cplusplus) extern "C" { #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) DEFINE_BLOCK_TYPE(GSBlockPredicateBlock, BOOL, id, GS_GENERIC_CLASS(NSDictionary,NSString*,id)*); #endif GS_EXPORT_CLASS @interface NSPredicate : NSObject + (NSPredicate *) predicateWithFormat: (NSString *)format, ...; + (NSPredicate *) predicateWithFormat: (NSString *)format argumentArray: (NSArray *)args; + (NSPredicate *) predicateWithFormat: (NSString *)format arguments: (va_list)args; + (NSPredicate *) predicateWithValue: (BOOL)value; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) + (NSPredicate *) predicateWithBlock: (GSBlockPredicateBlock)block; #endif - (BOOL) evaluateWithObject: (id)object; - (NSString *) predicateFormat; - (NSPredicate *) predicateWithSubstitutionVariables: (GS_GENERIC_CLASS(NSDictionary,NSString*,id)*)variables; #if OS_API_VERSION(MAC_OS_X_VERSION_10_5, GS_API_LATEST) - (BOOL) evaluateWithObject: (id)object substitutionVariables: (GS_GENERIC_CLASS(NSDictionary,NSString*,id)*)variables; #endif @end @interface GS_GENERIC_CLASS(NSArray, ElementT) (NSPredicate) /** Evaluate each object in the array using the specified predicate and * return an array containing all the objects which evaluate to YES. */ - (GS_GENERIC_CLASS(NSArray, ElementT) *) filteredArrayUsingPredicate: (NSPredicate *)predicate; @end @interface NSMutableArray (NSPredicate) /** Evaluate each object in the array using the specified predicate and * remove each objects which evaluates to NO. */ - (void) filterUsingPredicate: (NSPredicate *)predicate; @end @interface GS_GENERIC_CLASS(NSSet, ElementT) (NSPredicate) /** Evaluate each object in the set using the specified predicate and * return an set containing all the objects which evaluate to YES. */ - (GS_GENERIC_CLASS(NSSet, ElementT) *) filteredSetUsingPredicate: (NSPredicate *)predicate; @end @interface NSMutableSet (NSPredicate) /** Evaluate each object in the set using the specified predicate and * remove each objects which evaluates to NO. */ - (void) filterUsingPredicate: (NSPredicate *)predicate; @end #if defined(__cplusplus) } #endif #endif /* 100400 */ #endif /* __NSPredicate_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSProcessInfo.h000066400000000000000000000252761435650067400225530ustar00rootroot00000000000000/* Interface for NSProcessInfo for GNUStep Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. Written by: Georg Tuparev, EMBL & Academia Naturalis, Heidelberg, Germany Tuparev@EMBL-Heidelberg.de Last update: 08-aug-1995 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSProcessInfo_h_GNUSTEP_BASE_INCLUDE #define __NSProcessInfo_h_GNUSTEP_BASE_INCLUDE #import #import #ifdef __ANDROID__ #include #endif #if defined(__cplusplus) extern "C" { #endif @class NSArray; @class NSMutableArray; @class NSDictionary; @class NSData; @class NSMutableSet; #if OS_API_VERSION(MAC_OS_X_VERSION_10_9,GS_API_LATEST) typedef uint64_t NSActivityOptions; enum { NSActivityIdleDisplaySleepDisabled = (1ULL << 40), NSActivityIdleSystemSleepDisabled = (1ULL << 20), NSActivitySuddenTerminationDisabled = (1ULL << 14), NSActivityAutomaticTerminationDisabled = (1ULL << 15), NSActivityUserInitiated = (0x00FFFFFFULL | NSActivityIdleSystemSleepDisabled), NSActivityUserInitiatedAllowingIdleSystemSleep = (NSActivityUserInitiated & ~NSActivityIdleSystemSleepDisabled), NSActivityBackground = 0x000000FFULL, NSActivityLatencyCritical = 0xFF00000000ULL, }; #endif #if OS_API_VERSION(GS_API_MACOSX,GS_API_LATEST) /** * Constants returned by the -operatingSystem method. * NB. The presence of a constant in this list does *NOT* imply that * the named operating system is supported. Some values are provided * for MacOS-X compatibility or are obsolete and provided for * backward compatibility. */ enum { NSWindowsNTOperatingSystem = 1, NSWindows95OperatingSystem, NSSolarisOperatingSystem, NSHPUXOperatingSystem, NSMACHOperatingSystem, NSSunOSOperatingSystem, NSOSF1OperatingSystem, #if OS_API_VERSION(GS_API_NONE,GS_API_NONE) GSGNULinuxOperatingSystem = 100, GSBSDOperatingSystem, GSBeOperatingSystem, GSCygwinOperatingSystem #if GS_API_VERSION(0,011500) // Defines of deprecated constants for backward compatibility #define NSGNULinuxOperatingSystem GSGNULinuxOperatingSystem #define NSBSDOperatingSystem GSBSDOperatingSystem #define NSBeOperatingSystem GSBeOperatingSystem #define NSCygwinOperatingSystem GSCygwinOperatingSystem #endif /* GS_API_VERSION(0,011500) */ #endif /* OS_API_VERSION(GS_API_NONE,GS_API_NONE) */ }; #endif /* OS_API_VERSION(GS_API_MACOSX,GS_API_LATEST) */ GS_EXPORT_CLASS @interface NSProcessInfo: NSObject /** * Returns the shared NSProcessInfo object for the current process. */ + (NSProcessInfo*) processInfo; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6,GS_API_LATEST) #if GS_HAS_DECLARED_PROPERTIES @property (readonly) NSUInteger systemUptime; #else - (NSUInteger) systemUptime; #endif #endif /** * Returns an array containing the arguments supplied to start this * process.
* NB. In GNUstep, any arguments of the form --GNU-Debug=... * are not included in this array ... they are part of the * debug mechanism, and are hidden so that setting debug variables * will not effect the normal operation of the program.
* Please note, the special --GNU-Debug=... syntax differs from * that which is used to specify values for the [NSUserDefaults] system.
* User defaults are set on the command line by specifying the default name * (with a leading hyphen) as one argument, and the default value as the * following argument. The arguments used to set user defaults are * present in the array returned by this method. */ - (NSArray*) arguments; /** * Returns a dictionary giving the environment variables which were * provided for the process to use. */ - (NSDictionary*) environment; /** * Returns a string which may be used as a globally unique identifier.
* The string contains the host name, the process ID, a timestamp and a * counter.
* The first three values identify the process in which the string is * generated, while the fourth ensures that multiple strings generated * within the same process are unique. */ - (NSString*) globallyUniqueString; /** * Returns the name of the machine on which this process is running. */ - (NSString*) hostName; #if OS_API_VERSION(GS_API_MACOSX,GS_API_LATEST) /** * Return a number representing the operating system type.
* The known types are listed in the header file, but not all of the * listed types are actually implemented ... some are present for * MacOS-X compatibility only.
* * NSWindowsNTOperatingSystem - used for Windows NT, and later * NSWindows95OperatingSystem - probably never to be implemented * NSSolarisOperatingSystem - used for Sun Solaris * NSHPUXOperatingSystem - used for HP/UX * NSMACHOperatingSystem - MacOSX and perhaps Hurd in future? * NSSunOSOperatingSystem - Used for Sun Sun/OS * NSOSF1OperatingSystem - Used for OSF/1 (probably obsolete) * GSGNULinuxOperatingSystem - the GNUstep 'standard' * GSBSDOperatingSystem - BSD derived operating systems * GSBeperatingSystem - Used for Be-OS (probably obsolete) * GSCygwinOperatingSystem - cygwin unix-like environment * */ - (NSUInteger) operatingSystem; /** * Return a human readable string representing the operating system type.
* The supported types are - * * NSWindowsNTOperatingSystem - used for Windows NT, and later * NSWindows95OperatingSystem - probably never to be implemented * NSSolarisOperatingSystem - used for Sun Solaris * NSHPUXOperatingSystem - used for HP/UX * NSMACHOperatingSystem - MacOSX and perhaps Hurd in future? * NSSunOSOperatingSystem - Used for Sun Sun/OS * NSOSF1OperatingSystem - Used for OSF/1 (probably obsolete) * GSGNULinuxOperatingSystem - the GNUstep 'standard' * GSBSDOperatingSystem - BSD derived operating systems * GSBeperatingSystem - Used for Be-OS (probably obsolete) * GSCygwinOperatingSystem - cygwin unix-like environment * */ - (NSString*) operatingSystemName; /** * Returns a human readable version string for the current operating system * version. */ #if OS_API_VERSION(MAC_OS_X_VERSION_10_2,GS_API_LATEST) - (NSString *) operatingSystemVersionString; #endif /** * Returns the process identifier number which uniquely identifies * this process on this machine. */ - (int) processIdentifier; #endif /** * Returns the process name for this process. This may have been set using * the -setProcessName: method, or may be the default process name (the * file name of the binary being executed). */ - (NSString*) processName; /** * Change the name of the current process to newName. */ - (void) setProcessName: (NSString*)newName; #if OS_API_VERSION(MAC_OS_X_VERSION_10_5,GS_API_LATEST) /** Not implemented */ - (NSUInteger) processorCount; /** Not implemented */ - (NSUInteger) activeProcessorCount; /** Not implemented */ - (unsigned long long) physicalMemory; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_6,GS_API_LATEST) - (void) enableSuddenTermination; - (void) disableSuddenTermination; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_9,GS_API_LATEST) DEFINE_BLOCK_TYPE_NO_ARGS(GSPerformActivityBlock, void); DEFINE_BLOCK_TYPE(GSPerformExpiringActivityBlock, void, BOOL); - (id) beginActivityWithOptions: (NSActivityOptions)options reason: (NSString *)reason; - (void) endActivity:(id)activity; - (void) performActivityWithOptions:(NSActivityOptions)options reason: (NSString *)reason usingBlock: (GSPerformActivityBlock)block; - (void) performExpiringActivityWithReason: (NSString *)reason usingBlock: (GSPerformExpiringActivityBlock)block; #endif @end #if GS_API_VERSION(GS_API_NONE,011700) /** * Provides GNUstep-specific methods for controlled debug logging (a GNUstep * facility) and an internal/developer-related method. */ @interface NSProcessInfo (GNUstep) /** * Set the file to which NSLog output should be directed.
* Returns YES on success, NO on failure.
* By default logging goes to standard error. */ - (BOOL) setLogFile: (NSString*)path; /** Obsolete ... the GSInitializeProcess() function has the same effect and * can be called more easily from other languages (particularly C). */ + (void) initializeWithArguments: (char**)argv count: (int)argc environment: (char**)env; #ifdef __ANDROID__ - (jobject) androidContext; - (NSString *) androidFilesDir; - (NSString *) androidCacheDir; #endif @end /** * Fallback/override function.
* The developer must call this method to initialize * the NSProcessInfo system if none of the system-specific hacks to * auto-initialize it are working.
* It is also safe to call this function to override the effects * of the automatic initialisation, which some applications may need * to do when using GNUstep libraries embedded within other frameworks. */ GS_EXPORT void GSInitializeProcess(int argc, char **argv, char **envp); #ifdef __ANDROID__ /** * Android process initialization function. * This should be called on Android to initialize GNUstep with the JNI * environment and application context, which is used to set up support * for the Android data directory and asset loading via NSBundle. */ GS_EXPORT void GSInitializeProcessAndroid(JNIEnv *env, jobject context); #endif /** * Function for rapid testing to see if a debug level is set.
* This is used by the debugging macros.
* If debug logging has been turned off, this returns NO even if * the specified level exists in the set of debug levels. */ GS_EXPORT BOOL GSDebugSet(NSString *level); #endif /* GS_API_NONE */ #if defined(__cplusplus) } #endif #if !NO_GNUSTEP && !defined(GNUSTEP_BASE_INTERNAL) #import #endif #endif /* __NSProcessInfo_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSProgress.h000066400000000000000000000121361435650067400221140ustar00rootroot00000000000000/* Definition of class NSProgress Copyright (C) 2019 Free Software Foundation, Inc. Written by: Gregory Casamento Date: July 2019 This file is part of the GNUstep Library. 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 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 USA. */ #ifndef _NSProgress_h_GNUSTEP_BASE_INCLUDE #define _NSProgress_h_GNUSTEP_BASE_INCLUDE #import #import #import #import #if defined(__cplusplus) extern "C" { #endif @class GS_GENERIC_CLASS(NSArray, ElementT); @class GS_GENERIC_CLASS(NSDictionary, KeyT:id, ValT); @class NSNumber, NSURL, NSProgress; #if OS_API_VERSION(MAC_OS_X_VERSION_10_9, GS_API_LATEST) typedef NSString* NSProgressKind; typedef NSString* NSProgressUserInfoKey; typedef NSString* NSProgressFileOperationKind; DEFINE_BLOCK_TYPE_NO_ARGS(GSProgressCancellationHandler, void); DEFINE_BLOCK_TYPE_NO_ARGS(GSProgressPausingHandler, void); DEFINE_BLOCK_TYPE(NSProgressPublishingHandler, void, NSProgress*); DEFINE_BLOCK_TYPE_NO_ARGS(NSProgressUnpublishingHandler, void); DEFINE_BLOCK_TYPE_NO_ARGS(GSProgressPendingUnitCountBlock, void); DEFINE_BLOCK_TYPE_NO_ARGS(GSProgressResumingHandler, void); GS_EXPORT_CLASS @interface NSProgress : NSObject { #if GS_EXPOSE(NSProgress) #endif #if GS_NONFRAGILE # if defined(GS_NSProgress_IVARS) @public GS_NSProgress_IVARS; # endif #else /* Pointer to private additional data used to avoid breaking ABI * when we don't have the non-fragile ABI available. * Use this mechanism rather than changing the instance variable * layout (see Source/GSInternal.h for details). */ @private id _internal GS_UNUSED_IVAR; #endif } // Creating progress objects... - (instancetype) initWithParent: (NSProgress *)parent userInfo: (NSDictionary *)userInfo; + (NSProgress *) discreteProgressWithTotalUnitCount: (int64_t)unitCount; + (NSProgress *) progressWithTotalUnitCount: (int64_t)unitCount; + (NSProgress *) progressWithTotalUnitCount: (int64_t)unitCount parent: (NSProgress *)parent pendingUnitCount: (int64_t)portionOfParentTotalUnitCount; // Current progress + (NSProgress *) currentProgress; - (void) becomeCurrentWithPendingUnitCount: (int64_t)unitCount; - (void) addChild: (NSProgress *)child withPendingUnitCount: (int64_t)inUnitCount; - (void) resignCurrent; // Reporting progress - (int64_t) totalUnitCount; - (void) setTotalUnitCount: (int64_t)unitCount; - (int64_t) completedUnitCount; - (void) setCompletedUnitCount: (int64_t)unitCount; - (NSString *) localizedDescription; - (NSString *) localizedAdditionalDescription; // Observing progress - (double) fractionCompleted; // Controlling progress - (BOOL) isCancellable; - (BOOL) isCancelled; - (void) cancel; - (void) setCancellationHandler: (GSProgressCancellationHandler) handler; - (BOOL) isPausable; - (BOOL) isPaused; - (void) pause; - (void) setPausingHandler: (GSProgressPausingHandler) handler; - (void) resume; - (void) setResumingHandler: (GSProgressResumingHandler) handler; // Progress Information - (BOOL) isIndeterminate; - (void) setIndeterminate: (BOOL)flag; - (NSProgressKind) kind; - (void) setKind: (NSProgressKind)k; - (void) setUserInfoObject: (id)obj forKey: (NSProgressUserInfoKey)key; - (GS_GENERIC_CLASS(NSDictionary,NSProgressUserInfoKey,id) *)userInfo; // Instance property accessors... - (void) setFileOperationKind: (NSProgressFileOperationKind)k; - (NSProgressFileOperationKind) fileOperationKind; - (void) setFileUrl: (NSURL *)u; - (NSURL *) fileUrl; - (BOOL) isFinished; - (BOOL) isOld; - (void) setEstimatedTimeRemaining: (NSNumber *)n; - (NSNumber *) estimatedTimeRemaining; - (void) setFileCompletedCount: (NSNumber *)n; - (NSNumber *) fileCompletedCount; - (void) setFileTotalCount: (NSNumber *)n; - (NSNumber *) fileTotalCount; - (void) setThroughput: (NSNumber *)n; - (NSNumber *) throughtput; // Instance methods - (void) publish; - (void) unpublish; - (void) performAsCurrentWithPendingUnitCount: (int64_t)unitCount usingBlock: (GSProgressPendingUnitCountBlock)work; // Type methods + (id) addSubscriberForFileURL: (NSURL *)url withPublishingHandler: (NSProgressPublishingHandler)publishingHandler; + (void) removeSubscriber: (id)subscriber; @end @protocol NSProgressReporting - (NSProgress *) progress; @end #if defined(__cplusplus) } #endif #endif /* GS_API_MACOSX */ #endif /* _NSProgress_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSPropertyList.h000066400000000000000000000267261435650067400230020ustar00rootroot00000000000000/** Interface for NSPropertyList for GNUstep Copyright (C) 2004-2020 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: January 2004 This file is part of the GNUstep Base Library. 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 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 USA. AutogsdocSource: NSPropertyList.m */ #ifndef __NSPropertyList_h_GNUSTEP_BASE_INCLUDE #define __NSPropertyList_h_GNUSTEP_BASE_INCLUDE #import #import #if defined(__cplusplus) extern "C" { #endif #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) @class NSData, NSString, NSInputStream, NSOutputStream; enum { NSPropertyListImmutable = 0, NSPropertyListMutableContainers, NSPropertyListMutableContainersAndLeaves }; /** * Describes the mutability to use when generating objects during * deserialisation of a property list. * * NSPropertyListImmutable * all objects in created list are immutable * NSPropertyListMutableContainers * dictionaries, arrays, strings and data objects are mutable * */ typedef NSUInteger NSPropertyListMutabilityOptions; enum { NSPropertyListOpenStepFormat = 1, NSPropertyListXMLFormat_v1_0 = 100, NSPropertyListBinaryFormat_v1_0 = 200, NSPropertyListGNUstepFormat = 1000, NSPropertyListGNUstepBinaryFormat }; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6,GS_API_LATEST) typedef NSUInteger NSPropertyListWriteOptions; typedef NSUInteger NSPropertyListReadOptions; @class NSError; #endif /** * Specifies the serialisation format for a serialised property list. * * NSPropertyListOpenStepFormat * the most human-readable format * NSPropertyListXMLFormat_v1_0 * portable and readable * NSPropertyListBinaryFormat_v1_0 * the standard format on macos-x * NSPropertyListGNUstepFormat * extension of OpenStep format * NSPropertyListGNUstepBinaryFormat * efficient, hardware independent * */ typedef NSUInteger NSPropertyListFormat; /** *

The NSPropertyListSerialization class provides facilities for * serialising and deserializing property list data in a number of * formats. A property list is roughly an [NSArray] or [NSDictionary] object, * with these or [NSNumber], [NSData], [NSString], or [NSDate] objects * as members. (See below.)

*

You do not work with instances of this class, instead you use a * small number of class methods to serialize and deserialize * property lists. *


* A property list may only be one of the following classes - * * [NSArray] * * An array which is either empty or contains only property list * objects.
* An array is delimited by round brackets and its contents are comma * separated (there is no comma after the last array element). * * ( "one", "two", "three" ) * * In XML format, an array is an element whose name is array * and whose content is the array content. * * <array><string>one</string><string>two</string><string>three</string></array> * *
* [NSData] * * A data object is represented as a series of pairs of hexadecimal * characters (each pair representing a byte of data) enclosed in angle * brackets. (Spaces are ignored). * * < 54637374 696D67 > * * Base64 can be used since Base 1.24.9: * * <[VGNzdGltZw==]> * * In XML format, a data object is an element whose name is * data and whose content is a stream of base64 encoded bytes. * * [NSDate] * * Date objects were not traditionally allowed in property lists * but were added when the XML format was introduced. GNUstep provides * an extension to the traditional property list format to * support date objects, but older code will not read * property lists containing this extension.
* This format consists of an asterisk followed by the letter 'D' then a * date/time in YYYY-MM-DD HH:MM:SS +/-ZZZZ format, all enclosed within * angle brackets. * * <*D2002-03-22 11:30:00 +0100> * * In XML format, a date object is an element whose name is * date and whose content is a date in the format * YYYY-MM-DDTHH:MM:SSZ (or the above dfate format). * * <date>2002-03-22T11:30:00Z</date> * *
* [NSDictionary] * * A dictionary which is either empty or contains only string * keys and property list objects.
* A dictionary is delimited by curly brackets and its contents are * semicolon terminated (there is a semicolon after each value). * Each item in the dictionary is a key/value pair with an equals sign * after the key and before the value. * * { * "key1" = "value1"; * } * * In XML format, a dictionary is an element whose name is * dict and whose content consists of pairs of * string key and other property list objects. * * <dict> * <key>key1</key> * <string>value1</string> * </dict> * *
* [NSNumber] * * Number objects were not traditionally allowed in property lists * but were added when the XML format was introduced. GNUstep provides * an extension to the traditional property list format to * support number objects, but older code will not read * property lists containing this extension.
* Numbers are stored in a variety of formats depending on their values. * * boolean ... either <*BY> for YES or * <*BN> for NO.
* In XML format this is either <true /> or * <false /> *
* integer ... <*INNN> where NNN is an * integer.
* In XML format this is <integer>NNN<integer> *
* real ... <*RNNN> where NNN is a real * number.
* In XML format this is <real>NNN<real> *
*
*
* [NSString] * * A string is either stored literally (if it contains no spaces or special * characters), or is stored as a quoted string with special characters * escaped where necessary.
* Escape conventions are similar to those normally used in ObjectiveC * programming, using a backslash followed by - * * \ a backslash character * " a quote character * b a backspace character * n a newline character * r a carriage return character * t a tab character * OOO (three octal digits) * an arbitrary ascii character * UXXXX (where X is a hexadecimal digit) * a an arbitrary unicode character * * * "hello world & others" * * In XML format, the string is simply stored in UTF8 format as the * content of a string element, and the only character * escapes required are those used by XML such as the * '&lt;' markup representing a '<' character. * * <string>hello world &amp; others</string>" * *
*
*/ GS_EXPORT_CLASS @interface NSPropertyListSerialization : NSObject { } /** * Creates and returns a data object containing a serialized representation * of plist. The argument aFormat is used to determine the way in which the * data is serialised, and the anErrorString argument is a pointer in which * an error message is returned on failure (nil is returned on success). */ + (NSData*) dataFromPropertyList: (id)aPropertyList format: (NSPropertyListFormat)aFormat errorDescription: (NSString**)anErrorString; /** * Returns a flag indicating whether it is possible to serialize aPropertyList * in the format aFormat. */ + (BOOL) propertyList: (id)aPropertyList isValidForFormat: (NSPropertyListFormat)aFormat; /** * Deserialises dataItem and returns the resulting property list * (or nil if the data does not contain a property list serialised * in a supported format).
* The argument anOption is used to control whether the objects making * up the deserialized property list are mutable or not.
* The argument aFormat is either null or a pointer to a location * in which the format of the serialized property list will be returned.
* Either nil or an error message will be returned in anErrorString. */ + (id) propertyListFromData: (NSData*)data mutabilityOption: (NSPropertyListMutabilityOptions)anOption format: (NSPropertyListFormat*)aFormat errorDescription: (NSString**)anErrorString; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6,GS_API_LATEST) + (NSData *) dataWithPropertyList: (id)aPropertyList format: (NSPropertyListFormat)aFormat options: (NSPropertyListWriteOptions)anOption error: (out NSError**)error; + (id) propertyListWithData: (NSData*)data options: (NSPropertyListReadOptions)anOption format: (NSPropertyListFormat*)aFormat error: (out NSError**)error; + (id) propertyListWithStream: (NSInputStream*)stream options: (NSPropertyListReadOptions)anOption format: (NSPropertyListFormat*)aFormat error: (out NSError**)error; + (NSInteger) writePropertyList: (id)aPropertyList toStream: (NSOutputStream*)stream format: (NSPropertyListFormat)aFormat options: (NSPropertyListWriteOptions)anOption error: (out NSError**)error; #endif @end #endif /* GS_API_MACOSX */ #if defined(__cplusplus) } #endif #endif /* __NSPropertyList_h_GNUSTEP_BASE_INCLUDE*/ gnustep-base-1.29.0/Headers/Foundation/NSProtocolChecker.h000066400000000000000000000041011435650067400233670ustar00rootroot00000000000000/* Interface for NSProtocolChecker for GNUStep Copyright (C) 1995 Free Software Foundation, Inc. Written by: Mike Kienenberger Date: Jun 1998 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSProtocolChecker_h_GNUSTEP_BASE_INCLUDE #define __NSProtocolChecker_h_GNUSTEP_BASE_INCLUDE #import #import #import #if defined(__cplusplus) extern "C" { #endif @class Protocol; GS_EXPORT_CLASS @interface NSProtocolChecker : NSProxy { #if GS_EXPOSE(NSProtocolChecker) @private Protocol *_myProtocol; NSObject *_myTarget; #endif #if GS_NONFRAGILE #else /* Pointer to private additional data used to avoid breaking ABI * when we don't have the non-fragile ABI available. * Use this mechanism rather than changing the instance variable * layout (see Source/GSInternal.h for details). */ @private id _internal GS_UNUSED_IVAR; #endif } // Creating a checker + (id) protocolCheckerWithTarget: (NSObject*)anObject protocol: (Protocol*)aProtocol; - (id) initWithTarget: (NSObject*)anObject protocol: (Protocol*)aProtocol; // Reimplemented NSObject methods - (void) forwardInvocation: (NSInvocation*)anInvocation; // Getting information - (Protocol*) protocol; - (NSObject*) target; @end #if defined(__cplusplus) } #endif #endif gnustep-base-1.29.0/Headers/Foundation/NSProxy.h000066400000000000000000000046631435650067400214370ustar00rootroot00000000000000/* Interface for GNU Objective-C version of NSProxy Copyright (C) 1997 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: August 1997 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSProxy_h_GNUSTEP_BASE_INCLUDE #define __NSProxy_h_GNUSTEP_BASE_INCLUDE #import #import #if defined(__cplusplus) extern "C" { #endif GS_EXPORT_CLASS GS_ROOT_CLASS @interface NSProxy { @public Class isa; #if !(GS_NONFRAGILE == 1) @private /** * Legacy compatibility ivar. Remove in the next ABI-breaking release. */ NSUInteger _retain_count; #endif } + (id) alloc; + (id) allocWithZone: (NSZone*)z; + (id) autorelease; + (Class) class; + (NSString*) description; + (BOOL) isKindOfClass: (Class)aClass; + (BOOL) isMemberOfClass: (Class)aClass; /** */ + (void) load; /** */ + (oneway void) release; + (BOOL) respondsToSelector: (SEL)aSelector; + (id) retain; + (NSUInteger) retainCount; - (id) autorelease; - (Class) class; - (BOOL) conformsToProtocol: (Protocol*)aProtocol; - (void) dealloc; - (NSString*) description; - (void) forwardInvocation: (NSInvocation*)anInvocation; - (NSUInteger) hash; - (id) init; - (BOOL) isEqual: (id)anObject; - (BOOL) isKindOfClass: (Class)aClass; - (BOOL) isMemberOfClass: (Class)aClass; - (BOOL) isProxy; - (NSMethodSignature*) methodSignatureForSelector: (SEL)aSelector; - (oneway void) release; - (BOOL) respondsToSelector: (SEL)aSelector; - (id) retain; - (NSUInteger) retainCount; - (id) self; - (Class) superclass; - (NSZone*) zone; @end #if defined(__cplusplus) } #endif #endif /* __NSProxy_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSRange.h000066400000000000000000000153401435650067400213440ustar00rootroot00000000000000/* * Copyright (C) 1995,1999 Free Software Foundation, Inc. * * Written by: Adam Fedor * Date: 1995 * * This file is part of the GNUstep Base Library. * * 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 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 USA. */ #ifndef __NSRange_h_GNUSTEP_BASE_INCLUDE #define __NSRange_h_GNUSTEP_BASE_INCLUDE #import /**** Included Headers *******************************************************/ #import #if defined(__cplusplus) extern "C" { #endif @class NSException; @class NXConstantString; /**** Type, Constant, and Macro Definitions **********************************/ #ifndef MAX #define MAX(a,b) \ ({__typeof__(a) _MAX_a = (a); __typeof__(b) _MAX_b = (b); \ _MAX_a > _MAX_b ? _MAX_a : _MAX_b; }) #define GS_DEFINED_MAX #endif #ifndef MIN #define MIN(a,b) \ ({__typeof__(a) _MIN_a = (a); __typeof__(b) _MIN_b = (b); \ _MIN_a < _MIN_b ? _MIN_a : _MIN_b; }) #define GS_DEFINED_MIN #endif /** * { NSUInteger location; NSUInteger length; } *

* The NSRange type is used to specify ranges of locations, * typically items in an array, characters in a string, and bytes * in a data object. *

*

* As 'boundary' or 'fencepost' errors are a particularly common * problem in programming, it is important that you understand * how an NSRange works. *

*

* An NSRange consists of a location and a length. The * points that are considered to lie in a range are the integers from * the location to the location plus the length, so the number * of points in a range is the length of the range plus one.
* However, if you consider these points like the marks on a * ruler, you can only store information between * points. So the number of items that can be stored in a range * is the length of the range. *

*/ typedef struct _NSRange NSRange; struct _NSRange { NSUInteger location; NSUInteger length; }; #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) /** Pointer to an NSRange structure. */ typedef NSRange *NSRangePointer; #endif /**** Function Prototypes ****************************************************/ /* * All but the most complex functions are declared static inline in this * header file so that they are maximally efficient. In order to provide * true functions (for code modules that don't have this header) this * header is included in NSRange.m where the functions are no longer * declared inline. */ #ifdef IN_NSRANGE_M #define GS_RANGE_SCOPE extern #define GS_RANGE_ATTR #else #define GS_RANGE_SCOPE static inline #define GS_RANGE_ATTR __attribute__((unused)) #endif GS_RANGE_SCOPE NSUInteger NSMaxRange(NSRange range) GS_RANGE_ATTR; /** Returns top end of range (location + length). */ GS_RANGE_SCOPE NSUInteger NSMaxRange(NSRange range) { return range.location + range.length; } GS_RANGE_SCOPE BOOL NSLocationInRange(NSUInteger location, NSRange range) GS_RANGE_ATTR; /** Returns whether location is greater than or equal to range's location * and less than its max. */ GS_RANGE_SCOPE BOOL NSLocationInRange(NSUInteger location, NSRange range) { return (location >= range.location) && (location < NSMaxRange(range)); } /** Convenience method for raising an NSRangeException. */ GS_EXPORT void _NSRangeExceptionRaise (void); /* NB: The implementation of _NSRangeExceptionRaise is: [NSException raise: NSRangeException format: @"Range location + length too great"]; _NSRangeExceptionRaise is defined in NSRange.m so that this file (NSRange.h) can be included without problems in the implementation of the base classes themselves. */ GS_RANGE_SCOPE NSRange NSMakeRange(NSUInteger location, NSUInteger length) GS_RANGE_ATTR; /** Creates new range starting at location and of given length. */ GS_RANGE_SCOPE NSRange NSMakeRange(NSUInteger location, NSUInteger length) { NSRange range; NSUInteger end = location + length; if (end < location || end < length) { _NSRangeExceptionRaise (); } range.location = location; range.length = length; return range; } GS_RANGE_SCOPE BOOL NSEqualRanges(NSRange range1, NSRange range2) GS_RANGE_ATTR; /** Returns whether range1 and range2 have same location and length. */ GS_RANGE_SCOPE BOOL NSEqualRanges(NSRange range1, NSRange range2) { return ((range1.location == range2.location) && (range1.length == range2.length)); } GS_RANGE_SCOPE NSRange NSUnionRange(NSRange range1, NSRange range2) GS_RANGE_ATTR; /** Returns range going from minimum of aRange's and bRange's locations to maximum of their two max's. */ GS_RANGE_SCOPE NSRange NSUnionRange(NSRange aRange, NSRange bRange) { NSRange range; range.location = MIN(aRange.location, bRange.location); range.length = MAX(NSMaxRange(aRange), NSMaxRange(bRange)) - range.location; return range; } GS_RANGE_SCOPE NSRange NSIntersectionRange(NSRange range1, NSRange range2) GS_RANGE_ATTR; /** Returns range containing indices existing in both aRange and bRange. If * the returned length is 0, the location is undefined and should be ignored. */ GS_RANGE_SCOPE NSRange NSIntersectionRange (NSRange aRange, NSRange bRange) { NSRange range; if (NSMaxRange(aRange) < bRange.location || NSMaxRange(bRange) < aRange.location) return NSMakeRange(0, 0); range.location = MAX(aRange.location, bRange.location); range.length = MIN(NSMaxRange(aRange), NSMaxRange(bRange)) - range.location; return range; } @class NSString; /** Returns string of form {location=a, length=b}. */ GS_EXPORT NSString *NSStringFromRange(NSRange range); /** Parses range from string of form {location=a, length=b}; returns range with 0 location and length if this fails. */ GS_EXPORT NSRange NSRangeFromString(NSString *aString); #ifdef GS_DEFINED_MAX #undef GS_DEFINED_MAX #undef MAX #endif #ifdef GS_DEFINED_MIN #undef GS_DEFINED_MIN #undef MIN #endif #if defined(__cplusplus) } #endif #endif /* __NSRange_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSRegularExpression.h000066400000000000000000000155211435650067400237720ustar00rootroot00000000000000 /* Definition of class NSRegularExpression Copyright (C) 2011 Free Software Foundation, Inc. This file is part of the GNUstep Library. 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 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 USA. */ #ifndef _NSRegularExpression_h_GNUSTEP_BASE_INCLUDE #define _NSRegularExpression_h_GNUSTEP_BASE_INCLUDE #import #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) #import #import "GNUstepBase/GSBlocks.h" #import "GNUstepBase/GSConfig.h" #if defined(__cplusplus) extern "C" { #endif @class NSString, NSTextCheckingResult; typedef NSUInteger NSRegularExpressionOptions; static const NSRegularExpressionOptions NSRegularExpressionCaseInsensitive = 1<<0; static const NSRegularExpressionOptions NSRegularExpressionAllowCommentsAndWhitespace = 1<<1; static const NSRegularExpressionOptions NSRegularExpressionIgnoreMetacharacters = 1<<2; static const NSRegularExpressionOptions NSRegularExpressionDotMatchesLineSeparators = 1<<3; static const NSRegularExpressionOptions NSRegularExpressionAnchorsMatchLines = 1<<4; static const NSRegularExpressionOptions NSRegularExpressionUseUnixLineSeparators = 1<<5; static const NSRegularExpressionOptions NSRegularExpressionUseUnicodeWordBoundaries = 1<<6; typedef NSUInteger NSMatchingFlags; static const NSMatchingFlags NSMatchingProgress = 1<<0; static const NSMatchingFlags NSMatchingCompleted = 1<<1; static const NSMatchingFlags NSMatchingHitEnd = 1<<2; static const NSMatchingFlags NSMatchingRequiredEnd = 1<<3; static const NSMatchingFlags NSMatchingInternalError = 1<<4; typedef NSUInteger NSMatchingOptions; static const NSMatchingOptions NSMatchingReportProgress = 1<<0; static const NSMatchingOptions NSMatchingReportCompletion = 1<<1; static const NSMatchingOptions NSMatchingAnchored = 1<<2; static const NSMatchingOptions NSMatchingWithTransparentBounds = 1<<3; static const NSMatchingOptions NSMatchingWithoutAnchoringBounds = 1<<4; DEFINE_BLOCK_TYPE(GSRegexBlock, void, NSTextCheckingResult*, NSMatchingFlags, BOOL*); #ifndef GSREGEXTYPE # define GSREGEXTYPE void #endif /** * NSRegularExpression is used to inspect and manipulate strings using regular * expressions. The interface is thread safe: The same NSRegularExpression * object may be used to concurrently perform matching on multiple threads. * * To guard against regular expressions with extremely poor performance, the * underlying matcher will abort after a certain number of steps. This is * controlled using the GSRegularExpressionWorkLimit user default. The value of * this default key represents the number of steps executed by the match engine, * so it is only indirectly correlated with the time taken to execute the * pattern, but it usually in the order of milliseconds. The preset 1500, * setting value to 0 disables the work limit. */ GS_EXPORT_CLASS @interface NSRegularExpression : NSObject { #if GS_EXPOSE(NSRegularExpression) @private GSREGEXTYPE *regex; NSRegularExpressionOptions options; #endif #if GS_NONFRAGILE #else /* Pointer to private additional data used to avoid breaking ABI * when we don't have the non-fragile ABI available. * Use this mechanism rather than changing the instance variable * layout (see Source/GSInternal.h for details). */ @private id _internal GS_UNUSED_IVAR; #endif } // GNUstep, like OS X, uses libicu to provide the NSRegularExpression // implementation. If you have configured GNUstep without this support then it // will not work, so these methods are hidden. #if GS_USE_ICU || GS_UNSAFE_REGEX + (NSRegularExpression*) regularExpressionWithPattern: (NSString*)aPattern options: (NSRegularExpressionOptions)opts error: (NSError**)e; - (id) initWithPattern: (NSString*)aPattern options: (NSRegularExpressionOptions)opts error: (NSError**)e; + (NSRegularExpression*) regularExpressionWithPattern: (NSString*)aPattern options: (NSRegularExpressionOptions)opts error: (NSError**)e; - (id) initWithPattern: (NSString*)aPattern options: (NSRegularExpressionOptions)opts error: (NSError**)e; - (NSString*) pattern; - (void) enumerateMatchesInString: (NSString*)string options: (NSMatchingOptions)options range: (NSRange)range usingBlock: (GSRegexBlock)block; - (NSUInteger) numberOfMatchesInString: (NSString*)string options: (NSMatchingOptions)options range: (NSRange)range; - (NSTextCheckingResult*) firstMatchInString: (NSString*)string options: (NSMatchingOptions)options range: (NSRange)range; - (NSArray*) matchesInString: (NSString*)string options: (NSMatchingOptions)options range: (NSRange)range; - (NSRange) rangeOfFirstMatchInString: (NSString*)string options: (NSMatchingOptions)options range: (NSRange)range; - (NSUInteger) replaceMatchesInString: (NSMutableString*)string options: (NSMatchingOptions)options range: (NSRange)range withTemplate: (NSString*)templat; - (NSString*) stringByReplacingMatchesInString: (NSString*)string options: (NSMatchingOptions)options range: (NSRange)range withTemplate: (NSString*)templat; - (NSString*) replacementStringForResult: (NSTextCheckingResult*)result inString: (NSString*)string offset: (NSInteger)offset template: (NSString*)templat; #if GS_HAS_DECLARED_PROPERTIES @property (readonly) NSRegularExpressionOptions options; @property (readonly) NSUInteger numberOfCaptureGroups; #else - (NSRegularExpressionOptions) options; - (NSUInteger) numberOfCaptureGroups; #endif #endif // GS_USE_ICU @end #if defined(__cplusplus) } #endif #endif /* GS_API_MACOSX */ #endif /* _NSRegualrExpression_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSRunLoop.h000066400000000000000000000160051435650067400217050ustar00rootroot00000000000000/* Interface for NSRunLoop for GNUStep Copyright (C) 1996 Free Software Foundation, Inc. Written by: Andrew Kachites McCallum Created: March 1996 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSRunLoop_h_GNUSTEP_BASE_INCLUDE #define __NSRunLoop_h_GNUSTEP_BASE_INCLUDE #import #import #if defined(__cplusplus) extern "C" { #endif @class NSTimer, NSDate, NSPort; typedef NSString* NSRunLoopMode; /** * Run loop mode used to deal with input sources other than NSConnections or * dialog windows. Most commonly used. Defined in * Foundation/NSRunLoop.h. */ GS_EXPORT NSRunLoopMode const NSDefaultRunLoopMode; GS_EXPORT NSRunLoopMode const NSRunLoopCommonModes; GS_EXPORT_CLASS @interface NSRunLoop : NSObject { #if GS_EXPOSE(NSRunLoop) @private NSString *_currentMode; NSMapTable *_contextMap; NSMutableArray *_contextStack; NSMutableArray *_timedPerformers; void *_extra; #endif } /** * Returns the run loop instance for the current thread. */ + (NSRunLoop*) currentRunLoop; #if OS_API_VERSION(MAC_OS_X_VERSION_10_5,GS_API_LATEST) /** * Returns the run loop instance of the main thread. */ + (NSRunLoop*) mainRunLoop; #endif - (void) acceptInputForMode: (NSString*)mode beforeDate: (NSDate*)limit_date; - (void) addTimer: (NSTimer*)timer forMode: (NSString*)mode; - (NSString*) currentMode; - (NSDate*) limitDateForMode: (NSString*)mode; - (void) run; /** * Calls -limitDateForMode: to determine if a timeout occurs before the * specified date, then calls -acceptInputForMode:beforeDate: to run the * loop once.
* The specified date may be nil ... in which case the loop runs * until the limit date of the first input or timeout.
* If the specified date is in the past, this runs the loop once only, * to handle any events already available.
* If there are no input sources or timers in mode, this method * returns NO without running the loop (irrespective of the supplied * date argument), otherwise returns YES. */ - (BOOL) runMode: (NSString*)mode beforeDate: (NSDate*)date; - (void) runUntilDate: (NSDate*)date; @end @interface NSRunLoop(OPENSTEP) - (void) addPort: (NSPort*)port forMode: (NSString*)mode; - (void) cancelPerformSelectorsWithTarget: (id)target; - (void) cancelPerformSelector: (SEL)aSelector target: (id)target argument: (id)argument; - (void) configureAsServer; - (void) performSelector: (SEL)aSelector target: (id)target argument: (id)argument order: (NSUInteger)order modes: (NSArray*)modes; - (void) removePort: (NSPort*)port forMode: (NSString*)mode; @end /** This type specifies the kinds of event which may be 'watched' in a * run loop. */ typedef enum { #ifdef _WIN32 ET_HANDLE, /* Watch for an I/O event on a handle. */ ET_RPORT, /* Watch for message arriving on port. */ ET_WINMSG, /* Watch for a message on a window handle. */ ET_TRIGGER /* Trigger immediately when the loop runs. */ #else ET_RDESC, /* Watch for descriptor becoming readable. */ ET_WDESC, /* Watch for descriptor becoming writeable. */ ET_RPORT, /* Watch for message arriving on port. */ ET_EDESC, /* Watch for descriptor with out-of-band data. */ ET_TRIGGER /* Trigger immediately when the loop runs. */ #endif } RunLoopEventType; /** This protocol defines the mandatory interface a run loop watcher must * provide in order for it to be notified of events occurring in the loop * it is watching.
* Optional methods are documented in the NSObject(RunLoopEvents) * category. */ @protocol RunLoopEvents /** This is the message sent back to a watcher when an event is observed * by the run loop.
* The 'data', 'type' and 'mode' arguments are the same as the arguments * passed to the -addEvent:type:watcher:forMode: method.
* The 'extra' argument varies. For an ET_TRIGGER event, it is the same * as the 'data' argument. For other events on unix it is the file * descriptor associated with the event (which may be the same as the * 'data' argument, but is not in the case of ET_RPORT).
* For windows it will be the handle or the windows message assciated * with the event. */ - (void) receivedEvent: (void*)data type: (RunLoopEventType)type extra: (void*)extra forMode: (NSString*)mode; @end /** This informal protocol defiens optional methods of the run loop watcher. */ @interface NSObject (RunLoopEvents) /** Called by the run loop to find out whether it needs to block to wait * for events for this watcher. The shouldTrigger flag is used to inform * the run loop if tit should immediately trigger a received event for the * watcher. */ - (BOOL) runLoopShouldBlock: (BOOL*)shouldTrigger; @end /** * The run loop watcher API was originally intended to perform two * tasks ... * 1. provide the most efficient API reasonably possible to integrate * unix networking code into the runloop. * 2. provide a standard mechanism to allow people to contribute * code to add new I/O mechanisms to GNUstep (OpenStep didn't allow this). * It succeeded in 1, and partially succeeded in 2 (adding support * for the win32 API). */ @interface NSRunLoop(GNUstepExtensions) /** Adds a watcher to the receiver ... the watcher is used to monitor events * of the specified type which are associted with the event handle data and * it operates in the specified run loop modes.
* The watcher is not retained, but remains in place until a corresponding * call to -removeEvent:type:forMode:all: is made. If is the watchers * responsibility to ensure that it is removed from the run loop safely. */ - (void) addEvent: (void*)data type: (RunLoopEventType)type watcher: (id)watcher forMode: (NSString*)mode; /** Removes a watcher from the receiver ... the watcher must have been * previously added using -addEvent:type:watcher:forMode:
* This method mirrors exactly one addition of a watcher unless removeAll * is YES, in which case it removes all additions of watchers matching the * other paramters. */ - (void) removeEvent: (void*)data type: (RunLoopEventType)type forMode: (NSString*)mode all: (BOOL)removeAll; @end #if defined(__cplusplus) } #endif #endif /*__NSRunLoop_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSScanner.h000066400000000000000000000072571435650067400217110ustar00rootroot00000000000000/* Definitions for NSScanner class Copyright (C) 1996,1999 Free Software Foundation, Inc. Author: Eric Norum Created: 1996 This file is part of the GNUstep Objective-C Library. 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 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 USA. */ #ifndef __NSScanner_h_GNUSTEP_BASE_INCLUDE #define __NSScanner_h_GNUSTEP_BASE_INCLUDE #import #import #import #import #if defined(__cplusplus) extern "C" { #endif /* * NSScanner class */ GS_EXPORT_CLASS @interface NSScanner : NSObject { #if GS_EXPOSE(NSScanner) @private NSString *_string; NSCharacterSet *_charactersToBeSkipped; BOOL (*_skipImp)(NSCharacterSet*, SEL, unichar); NSDictionary *_locale; NSUInteger _scanLocation; unichar _decimal; BOOL _caseSensitive; BOOL _isUnicode; #endif #if GS_NONFRAGILE #else /* Pointer to private additional data used to avoid breaking ABI * when we don't have the non-fragile ABI available. * Use this mechanism rather than changing the instance variable * layout (see Source/GSInternal.h for details). */ @private id _internal GS_UNUSED_IVAR; #endif } /* * Creating an NSScanner */ + (id) localizedScannerWithString: (NSString*)aString; + (id) scannerWithString: (NSString*)aString; - (id) initWithString: (NSString*)aString; /* * Getting an NSScanner's string */ - (NSString*) string; /* * Configuring an NSScanner */ - (NSUInteger) scanLocation; - (void) setScanLocation: (NSUInteger)anIndex; - (BOOL) caseSensitive; - (void) setCaseSensitive: (BOOL)flag; - (NSCharacterSet*) charactersToBeSkipped; - (void) setCharactersToBeSkipped: (NSCharacterSet *)aSet; - (NSDictionary*)locale; - (void)setLocale:(NSDictionary*)localeDictionary; /* * Scanning a string */ - (BOOL) scanInt: (int*)value; - (BOOL) scanHexInt: (unsigned int*)value; - (BOOL) scanLongLong: (long long*)value; - (BOOL) scanFloat: (float*)value; - (BOOL) scanDouble: (double*)value; - (BOOL) scanString: (NSString*)string intoString: (NSString**)value; - (BOOL) scanCharactersFromSet: (NSCharacterSet*)aSet intoString: (NSString**)value; - (BOOL) scanUpToString: (NSString*)string intoString: (NSString**)value; - (BOOL) scanUpToCharactersFromSet: (NSCharacterSet*)aSet intoString: (NSString**)value; - (BOOL) isAtEnd; #if OS_API_VERSION(GS_API_NONE, GS_API_NONE) - (BOOL) scanRadixUnsignedInt: (unsigned int*)value; - (BOOL) scanRadixUnsignedLongLong: (unsigned long long*)value; #endif #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) - (BOOL) scanDecimal: (NSDecimal*)value; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_5, GS_API_LATEST) - (BOOL) scanHexLongLong: (unsigned long long*)value; /** Not implemented */ - (BOOL) scanHexDouble: (double *)result; /** Not implemented */ - (BOOL) scanHexFloat: (float *)result; /** Not implemented */ - (BOOL) scanInteger: (NSInteger *)value; #endif @end #if defined(__cplusplus) } #endif #endif /* __NSScanner_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSScriptClassDescription.h000066400000000000000000000026421435650067400247470ustar00rootroot00000000000000 /* Definition of class NSScriptClassDescription Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory John Casamento Date: Sep 2019 This file is part of the GNUstep Library. 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 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 USA. */ #ifndef _NSScriptClassDescription_h_GNUSTEP_BASE_INCLUDE #define _NSScriptClassDescription_h_GNUSTEP_BASE_INCLUDE #include #if defined(__cplusplus) extern "C" { #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_0, GS_API_LATEST) GS_EXPORT_CLASS @interface NSScriptClassDescription : NSClassDescription @end #if defined(__cplusplus) } #endif #endif /* GS_API_MACOSX */ #endif /* _NSScriptClassDescription_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSScriptCoercionHandler.h000066400000000000000000000026111435650067400245310ustar00rootroot00000000000000 /* Definition of class NSScriptCoercionHandler Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory John Casamento Date: Sep 2019 This file is part of the GNUstep Library. 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 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 USA. */ #ifndef _NSScriptCoercionHandler_h_GNUSTEP_BASE_INCLUDE #define _NSScriptCoercionHandler_h_GNUSTEP_BASE_INCLUDE #include #if defined(__cplusplus) extern "C" { #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_0, GS_API_LATEST) GS_EXPORT_CLASS @interface NSScriptCoercionHandler : NSObject @end #if defined(__cplusplus) } #endif #endif /* GS_API_MACOSX */ #endif /* _NSScriptCoercionHandler_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSScriptCommand.h000066400000000000000000000025411435650067400230520ustar00rootroot00000000000000 /* Definition of class NSScriptCommand Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory John Casamento Date: Sep 2019 This file is part of the GNUstep Library. 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 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 USA. */ #ifndef _NSScriptCommand_h_GNUSTEP_BASE_INCLUDE #define _NSScriptCommand_h_GNUSTEP_BASE_INCLUDE #include #if defined(__cplusplus) extern "C" { #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_0, GS_API_LATEST) GS_EXPORT_CLASS @interface NSScriptCommand : NSObject @end #if defined(__cplusplus) } #endif #endif /* GS_API_MACOSX */ #endif /* _NSScriptCommand_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSScriptCommandDescription.h000066400000000000000000000026301435650067400252550ustar00rootroot00000000000000 /* Definition of class NSScriptCommandDescription Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory John Casamento Date: Sep 2019 This file is part of the GNUstep Library. 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 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 USA. */ #ifndef _NSScriptCommandDescription_h_GNUSTEP_BASE_INCLUDE #define _NSScriptCommandDescription_h_GNUSTEP_BASE_INCLUDE #include #if defined(__cplusplus) extern "C" { #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_0, GS_API_LATEST) GS_EXPORT_CLASS @interface NSScriptCommandDescription : NSObject @end #if defined(__cplusplus) } #endif #endif /* GS_API_MACOSX */ #endif /* _NSScriptCommandDescription_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSScriptExecutionContext.h000066400000000000000000000026161435650067400250070ustar00rootroot00000000000000 /* Definition of class NSScriptExecutionContext Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory John Casamento Date: Sep 2019 This file is part of the GNUstep Library. 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 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 USA. */ #ifndef _NSScriptExecutionContext_h_GNUSTEP_BASE_INCLUDE #define _NSScriptExecutionContext_h_GNUSTEP_BASE_INCLUDE #include #if defined(__cplusplus) extern "C" { #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_0, GS_API_LATEST) GS_EXPORT_CLASS @interface NSScriptExecutionContext : NSObject @end #if defined(__cplusplus) } #endif #endif /* GS_API_MACOSX */ #endif /* _NSScriptExecutionContext_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSScriptKeyValueCoding.h000066400000000000000000000026041435650067400243450ustar00rootroot00000000000000 /* Definition of class NSScriptKeyValueCoding Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory John Casamento Date: Sep 2019 This file is part of the GNUstep Library. 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 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 USA. */ #ifndef _NSScriptKeyValueCoding_h_GNUSTEP_BASE_INCLUDE #define _NSScriptKeyValueCoding_h_GNUSTEP_BASE_INCLUDE #include #if defined(__cplusplus) extern "C" { #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_0, GS_API_LATEST) GS_EXPORT_CLASS @interface NSScriptKeyValueCoding : NSObject @end #if defined(__cplusplus) } #endif #endif /* GS_API_MACOSX */ #endif /* _NSScriptKeyValueCoding_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSScriptObjectSpecifiers.h000066400000000000000000000026161435650067400247220ustar00rootroot00000000000000 /* Definition of class NSScriptObjectSpecifiers Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory John Casamento Date: Sep 2019 This file is part of the GNUstep Library. 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 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 USA. */ #ifndef _NSScriptObjectSpecifiers_h_GNUSTEP_BASE_INCLUDE #define _NSScriptObjectSpecifiers_h_GNUSTEP_BASE_INCLUDE #include #if defined(__cplusplus) extern "C" { #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_0, GS_API_LATEST) GS_EXPORT_CLASS @interface NSScriptObjectSpecifiers : NSObject @end #if defined(__cplusplus) } #endif #endif /* GS_API_MACOSX */ #endif /* _NSScriptObjectSpecifiers_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSScriptStandardSuiteCommands.h000066400000000000000000000026471435650067400257370ustar00rootroot00000000000000 /* Definition of class NSScriptStandardSuiteCommands Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory John Casamento Date: Sep 2019 This file is part of the GNUstep Library. 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 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 USA. */ #ifndef _NSScriptStandardSuiteCommands_h_GNUSTEP_BASE_INCLUDE #define _NSScriptStandardSuiteCommands_h_GNUSTEP_BASE_INCLUDE #include #if defined(__cplusplus) extern "C" { #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_0, GS_API_LATEST) GS_EXPORT_CLASS @interface NSScriptStandardSuiteCommands : NSObject @end #if defined(__cplusplus) } #endif #endif /* GS_API_MACOSX */ #endif /* _NSScriptStandardSuiteCommands_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSScriptSuiteRegistry.h000066400000000000000000000025771435650067400243270ustar00rootroot00000000000000 /* Definition of class NSScriptSuiteRegistry Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory John Casamento Date: Sep 2019 This file is part of the GNUstep Library. 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 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 USA. */ #ifndef _NSScriptSuiteRegistry_h_GNUSTEP_BASE_INCLUDE #define _NSScriptSuiteRegistry_h_GNUSTEP_BASE_INCLUDE #include #if defined(__cplusplus) extern "C" { #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_0, GS_API_LATEST) GS_EXPORT_CLASS @interface NSScriptSuiteRegistry : NSObject @end #if defined(__cplusplus) } #endif #endif /* GS_API_MACOSX */ #endif /* _NSScriptSuiteRegistry_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSScriptWhoseTests.h000066400000000000000000000027571435650067400236150ustar00rootroot00000000000000/* Global include file for the GNUstep Base Library. Copyright (C) 1997 Free Software Foundation, Inc. Date: Sep 2012 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSScriptWhoseTests_h_GNUSTEP_BASE_INCLUDE #define __NSScriptWhoseTests_h_GNUSTEP_BASE_INCLUDE #import @interface NSObject (NSComparisonMethods) - (BOOL) doesContain: (id) object; - (BOOL) isCaseInsensitiveLike: (id) object; - (BOOL) isEqualTo: (id) object; - (BOOL) isGreaterThan: (id) object; - (BOOL) isGreaterThanOrEqualTo: (id) object; - (BOOL) isLessThan: (id) object; - (BOOL) isLessThanOrEqualTo: (id) object; - (BOOL) isLike: (NSString *)object; - (BOOL) isNotEqualTo: (id) object; @end #endif /* __NSScriptWhoseTests_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSSerialization.h000066400000000000000000000151711435650067400231270ustar00rootroot00000000000000/* Protocol for NSSerialization for GNUStep Copyright (C) 1995 Free Software Foundation, Inc. Written by: Andrew Kachites McCallum Date: 1995 Updated by: Richard Frith-Macdonald Date: 1998 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSSerialization_h_GNUSTEP_BASE_INCLUDE #define __NSSerialization_h_GNUSTEP_BASE_INCLUDE #import #import #if defined(__cplusplus) extern "C" { #endif @class NSData, NSMutableData; /** * Objects that are not standard property list constituents can adopt this * protocol to allow themselves to be serialized by an [NSSerializer] and * deserialized by an [NSDeserializer]. Note, this mechanism has been * deprecated and you should instead use [NSArchiver] and related facilities * to serialize objects that are not ordinary property lists. */ @protocol NSObjCTypeSerializationCallBack /** * Decodes an object of given type from data at position cursor. */ - (void) deserializeObjectAt: (id*)object ofObjCType: (const char *)type fromData: (NSData*)data atCursor: (unsigned*)cursor; /** * Encode the given object of given type into data, using a string not a * binary representation. */ - (void) serializeObjectAt: (id*)object ofObjCType: (const char *)type intoData: (NSMutableData*)data; @end /** *

This class is deprecated in favor of * [NSPropertyListSerialization].

* *

It provides a means of producing a byte-array (actually string) * representation of a property list (NSArray or NSDictionary plus limited * contents).

*/ GS_EXPORT_CLASS @interface NSSerializer: NSObject /** *

Serialize given property list (NSArray or NSDictionary plus limited * contents) into byte array.

*

Deprecated in favor of * [NSPropertyListSerialization+dataFromPropertyList:format:errorDescription:]. *

*/ + (NSData*) serializePropertyList: (id)propertyList; /** *

Serialize given property list (NSArray or NSDictionary plus limited * contents) into given mutable byte array.

*

Deprecated in favor of * [NSPropertyListSerialization+dataFromPropertyList:format:errorDescription:]. *

*/ + (void) serializePropertyList: (id)propertyList intoData: (NSMutableData*)d; @end #if GS_API_VERSION(GS_API_NONE, 011700) /** * GNUstep extends serialization by having the option to make the * resulting data more compact by ensuring that repeated strings * are only stored once. If the property-list has a lot of repeated * strings in it, this will be both faster and more space efficient * but it will be slower if the property-list has few repeated * strings. The default is NOT to generate compact versions of the data. * * The [+shouldBeCompact:] method sets default behavior. * The [+serializePropertyList:intoData:compact:] method lets you * override the default behavior. */ @interface NSSerializer (GNUstep) /** * Specify whether to produce compacted format, with repeated strings only * written once. */ + (void) shouldBeCompact: (BOOL)flag; /** * As [NSSerializer+serializePropertyList:intoData:] but specify whether to * produce compacted format. */ + (void) serializePropertyList: (id)propertyList intoData: (NSMutableData*)d compact: (BOOL)flag; @end #endif /** * This class is deprecated in favor of * [NSPropertyListSerialization]. It provides a means of recovering a * property list (NSArray or NSDictionary plus limited contents) from a * byte-array (actually string) representation. */ GS_EXPORT_CLASS @interface NSDeserializer: NSObject /** * Recover a property list (NSArray or NSDictionary plus limited * contents) from a byte array. * Deprecated in favor of * [NSPropertyListSerialization * +propertyListFromData:mutabilityOption:format:errorDescription:]. */ + (id) deserializePropertyListFromData: (NSData*)data atCursor: (unsigned int*)cursor mutableContainers: (BOOL)flag; /** * Recover a property list (NSArray or NSDictionary plus limited * contents) from a byte array. * Deprecated in favor of * [NSPropertyListSerialization * +propertyListFromData:mutabilityOption:format:errorDescription:]. */ + (id) deserializePropertyListFromData: (NSData*)data mutableContainers: (BOOL)flag; /** * Recover a property list (NSArray or NSDictionary plus limited contents) * from a byte array. If the data at cursor has a length greater than * length, a proxy is substituted for the actual property list as long as the * constituent objects of that property list are not accessed. * Deprecated in favor of * [NSPropertyListSerialization * +propertyListFromData:mutabilityOption:format:errorDescription:]. */ + (id) deserializePropertyListLazilyFromData: (NSData*)data atCursor: (unsigned*)cursor length: (unsigned)length mutableContainers: (BOOL)flag; @end #if OS_API_VERSION(GS_API_NONE, GS_API_NONE) /** *

GNUstep extends deserialization by having the option to make the * resulting data more compact by ensuring that repeated strings * are only stored once. If the property-list has a lot of repeated * strings in it, this will be more space efficient but it will be * slower (though other parts of your code may speed up through more * efficient equality testing of uniqued strings). * The default is NOT to deserialize uniqued strings.

* *

The [+uniquing:] method turns uniquing on/off. * Uniquing is done using a global [NSCountedSet] - see its documentation * for details.

*/ @interface NSDeserializer (GNUstep) /** * Turns uniquing (collapsing of multiple instances of a single string in the * output to one full copy plus references) on/off. */ + (void) uniquing: (BOOL)flag; @end #endif #if defined(__cplusplus) } #endif #endif /* __NSSerialization_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSSet.h000066400000000000000000000212251435650067400210420ustar00rootroot00000000000000/** Interface for NSSet, NSMutableSet, NSCountedSet for GNUStep Copyright (C) 1995, 1996, 1998 Free Software Foundation, Inc. Written by: Andrew Kachites McCallum Created: Sep 1995 This file is part of the GNUstep Base Library. 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 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 USA. AutogsdocSource: NSSet.m AutogsdocSource: NSCountedSet.m */ #ifndef _NSSet_h_GNUSTEP_BASE_INCLUDE #define _NSSet_h_GNUSTEP_BASE_INCLUDE #import #import #import #import #if defined(__cplusplus) extern "C" { #endif @class GS_GENERIC_CLASS(NSArray, ElementT); @class GS_GENERIC_CLASS(NSEnumerator, ElementT); @class GS_GENERIC_CLASS(NSDictionary, KeyT:id, ValT); @class NSString; GS_EXPORT_CLASS @interface GS_GENERIC_CLASS(NSSet, __covariant ElementT) : NSObject + (instancetype) set; + (instancetype) setWithArray: (GS_GENERIC_CLASS(NSArray, ElementT)*)objects; + (instancetype) setWithObject: (GS_GENERIC_TYPE(ElementT))anObject; + (instancetype) setWithObjects: (GS_GENERIC_TYPE(ElementT))firstObject, ...; #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) + (instancetype) setWithObjects: (const GS_GENERIC_TYPE(ElementT)[])objects count: (NSUInteger)count; #endif + (instancetype) setWithSet: (GS_GENERIC_CLASS(NSSet, ElementT)*)aSet; - (GS_GENERIC_CLASS(NSArray, ElementT)*) allObjects; - (GS_GENERIC_TYPE(ElementT)) anyObject; - (BOOL) containsObject: (GS_GENERIC_TYPE(ElementT))anObject; - (NSUInteger) count; - (NSString*) description; - (NSString*) descriptionWithLocale: (id)locale; - (instancetype) init; - (instancetype) initWithArray: (GS_GENERIC_CLASS(NSArray, ElementT)*)other; - (instancetype) initWithObjects: (GS_GENERIC_TYPE(ElementT))firstObject, ...; - (instancetype) initWithObjects: (const GS_GENERIC_TYPE(ElementT)[])objects count: (NSUInteger)count; - (instancetype) initWithSet: (GS_GENERIC_CLASS(NSSet, ElementT)*)other; - (instancetype) initWithSet: (GS_GENERIC_CLASS(NSSet, ElementT)*)other copyItems: (BOOL)flag; - (BOOL) intersectsSet: (GS_GENERIC_CLASS(NSSet, ElementT)*)otherSet; - (BOOL) isEqualToSet: (GS_GENERIC_CLASS(NSSet, ElementT)*)other; - (BOOL) isSubsetOfSet: (GS_GENERIC_CLASS(NSSet, ElementT)*)otherSet; - (void) makeObjectsPerform: (SEL)aSelector; - (void) makeObjectsPerform: (SEL)aSelector withObject: (id)argument; #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) - (void) makeObjectsPerformSelector: (SEL)aSelector; - (void) makeObjectsPerformSelector: (SEL)aSelector withObject: (id)argument; #endif - (GS_GENERIC_TYPE(ElementT)) member: (GS_GENERIC_TYPE(ElementT))anObject; - (GS_GENERIC_CLASS(NSEnumerator, ElementT)*) objectEnumerator; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) DEFINE_BLOCK_TYPE(GSSetEnumeratorBlock, void, GS_GENERIC_TYPE(ElementT), BOOL*); DEFINE_BLOCK_TYPE(GSSetFilterBlock, BOOL, GS_GENERIC_TYPE(ElementT), BOOL*); /** * Enumerate over the collection using a given block. The first argument is * the object. The second argument is a pointer to a BOOL indicating * whether the enumeration should stop. Setting this to YES will interupt * the enumeration. */ - (void) enumerateObjectsUsingBlock:(GSSetEnumeratorBlock)aBlock; /** * Enumerate over the collection using the given block. The first argument is * the object. The second argument is a pointer to a BOOL indicating whether * the enumeration should stop. Setting this to YES will interrupt the * enumeration. * * The opts argument is a bitfield. Setting the NSNSEnumerationConcurrent flag * specifies that it is thread-safe. The NSEnumerationReverse bit specifies * that it should be enumerated in reverse order. */ - (void) enumerateObjectsWithOptions: (NSEnumerationOptions)opts usingBlock: (GSSetEnumeratorBlock)aBlock; - (GS_GENERIC_CLASS(NSSet, ElementT) *) objectsPassingTest: (GSSetFilterBlock)aBlock; - (GS_GENERIC_CLASS(NSSet, ElementT) *) objectsWithOptions: (NSEnumerationOptions)opts passingTest: (GSSetFilterBlock)aBlock; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_5,GS_API_LATEST) - (GS_GENERIC_CLASS(NSSet, ElementT) *) setByAddingObject: (GS_GENERIC_TYPE(ElementT))anObject; - (GS_GENERIC_CLASS(NSSet, ElementT) *) setByAddingObjectsFromSet: (GS_GENERIC_CLASS(NSSet, ElementT) *)other; - (GS_GENERIC_CLASS(NSSet, ElementT) *) setByAddingObjectsFromArray: (GS_GENERIC_CLASS(NSArray, ElementT) *)other; #endif @end GS_EXPORT_CLASS @interface GS_GENERIC_CLASS(NSMutableSet, ElementT): GS_GENERIC_CLASS(NSSet, ElementT) + (instancetype) setWithCapacity: (NSUInteger)numItems; - (void) addObject: (GS_GENERIC_TYPE(ElementT))anObject; - (void) addObjectsFromArray: (GS_GENERIC_CLASS(NSArray, ElementT)*)array; - (instancetype) initWithCapacity: (NSUInteger)numItems; - (void) intersectSet: (GS_GENERIC_CLASS(NSSet, ElementT)*)other; - (void) minusSet: (GS_GENERIC_CLASS(NSSet, ElementT)*)other; - (void) removeAllObjects; - (void) removeObject: (GS_GENERIC_TYPE(ElementT))anObject; #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) - (void) setSet: (GS_GENERIC_CLASS(NSSet, ElementT)*)other; #endif - (void) unionSet: (GS_GENERIC_CLASS(NSSet, ElementT)*)other; @end GS_EXPORT_CLASS @interface GS_GENERIC_CLASS(NSCountedSet, ElementT) : GS_GENERIC_CLASS(NSMutableSet, ElementT) - (NSUInteger) countForObject: (GS_GENERIC_TYPE(ElementT))anObject; @end #if OS_API_VERSION(GS_API_NONE, GS_API_NONE) /** * Utility methods for using a counted set to handle uniquing of objects. */ @interface GS_GENERIC_CLASS(NSCountedSet, ElementT) (GNU_Uniquing) /** *

* This method removes from the set all objects whose count is * less than or equal to the specified value. *

*

* This is useful where a counted set is used for uniquing objects. * The set can be periodically purged of objects that have only * been added once - and are therefore simply wasting space. *

*/ - (void) purge: (NSInteger)level; /** *

* If the supplied object (or one equal to it as determined by * the [NSObject-isEqual:] method) is already present in the set, the * count for that object is incremented, the supplied object * is released, and the object in the set is retained and returned. * Otherwise, the supplied object is added to the set and returned. *

*

* This method is useful for uniquing objects - the init method of * a class need simply end with - * * return [myUniquingSet unique: self]; * *

*/ - (GS_GENERIC_TYPE(ElementT)) unique: (GS_GENERIC_TYPE(ElementT)) NS_CONSUMED anObject NS_RETURNS_RETAINED; @end /* * Functions for managing a global uniquing set. */ /* * GSUniquing() turns on/off the action of the GSUnique() function. * if uniquing is turned off, GSUnique() simply returns its argument. * */ void GSUniquing(BOOL flag); /* * GSUnique() returns an object that is equal to the one passed to it. * If the returned object is not the same object as the object passed in, * the original object is released and the returned object is retained. * Thus, an -init method that wants to implement uniquing simply needs * to end with 'return GSUnique(self);' */ id GSUnique(id NS_CONSUMED anObject) NS_RETURNS_RETAINED; /* * Management functions - */ /* * GSUPurge() can be used to purge infrequently referenced objects from the * set by removing any objec whose count is less than or equal to that given. * */ void GSUPurge(NSUInteger count); /* * GSUSet() can be used to artificially set the count for a particular object * Setting the count to zero will remove the object from the global set. */ id GSUSet(id anObject, NSUInteger count); #endif /* GS_API_NONE */ #if defined(__cplusplus) } #endif #endif gnustep-base-1.29.0/Headers/Foundation/NSSortDescriptor.h000066400000000000000000000137411435650067400233010ustar00rootroot00000000000000/* Interface for NSSortDescriptor for GNUStep Copyright (C) 2005 Free Software Foundation, Inc. Written by: Saso Kiselkov Date: 2005 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSSortDescriptor_h_GNUSTEP_BASE_INCLUDE #define __NSSortDescriptor_h_GNUSTEP_BASE_INCLUDE #import #if OS_API_VERSION(MAC_OS_X_VERSION_10_3,GS_API_LATEST) #import #import #import #if defined(__cplusplus) extern "C" { #endif @class NSString; /** * Instances of this class are used to perform multi-level sorts of * arrays containging collections or other objects whose properties * can be obtained using key names. */ GS_EXPORT_CLASS @interface NSSortDescriptor : NSObject { #if GS_EXPOSE(NSSortDescriptor) @private NSString *_key; BOOL _ascending; SEL _selector; NSComparator _comparator; #endif #if GS_NONFRAGILE #else /* Pointer to private additional data used to avoid breaking ABI * when we don't have the non-fragile ABI available. * Use this mechanism rather than changing the instance variable * layout (see Source/GSInternal.h for details). */ @private id _internal GS_UNUSED_IVAR; #endif } /** Returns a flag indicating whether the sort descriptor sorts objects * in ascending order (YES) or descending order (NO). */ - (BOOL) ascending; /** Returns the result of comparing object1 to object2 using the property * whose key is defined in the receiver and using the selector of the * receiver. If the receiver performs a descending order sort, the * result of this comparison is the opposite of that prroduced by * applying the selector. */ - (NSComparisonResult) compareObject: (id)object1 toObject: (id)object2; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) /**

Returns an autoreleased sort descriptor for comparisons using the * 'compare:' selector and the specified key and ordering.

* *

See also -initWithKey:ascending:.

*/ + (id) sortDescriptorWithKey: (NSString *)aKey ascending: (BOOL)ascending; /**

Returns an autoreleased sort descriptor initialized to perform * comparisons in the specified order using aSelector to compare the property * aKey of each object.

* *

See also -initWithKey:ascending:selector:.

*/ + (id) sortDescriptorWithKey: (NSString *)aKey ascending: (BOOL)ascending selector: (SEL)aSelector; /**

Returns an autoreleased sort descriptor initialized to perform * comparisons in the specified order using the comparator to compare * the property aKey of each object.

* *

See also -initWithKey:ascending:selector:.

*/ + (id)sortDescriptorWithKey: (NSString *)key ascending: (BOOL)ascending comparator: (NSComparator)cmptr; /** * Initialises the receiver to perform comparisons in the specified order * using the comparator to compare the property key of each object. */ - (id) initWithKey: (NSString *)key ascending: (BOOL)ascending comparator: (NSComparator)cmptr; #endif /** Initialises the receiver for comparisons using the 'compare:' selector * and the specified key and ordering. */ - (id) initWithKey: (NSString *)key ascending: (BOOL)ascending; /** * Initialises the receiver to perform comparisons in the specified order * using selector to compare the property key of each object. */ - (id) initWithKey: (NSString *)key ascending: (BOOL)ascending selector: (SEL)selector; /** Returns the key used to obtain the property on which comparisons are based. */ - (NSString *) key; /** Returns the selector used to compare the properties of objects. */ - (SEL) selector; /** Returns a copy of the receiver which compares and sorts in reversed * order. */ - (id) reversedSortDescriptor; @end @interface GS_GENERIC_CLASS(NSArray, ElementT) (NSSortDescriptorSorting) /** * Produces a sorted array using the mechanism described for * [NSMutableArray-sortUsingDescriptors:] */ - (GS_GENERIC_CLASS(NSArray, ElementT) *) sortedArrayUsingDescriptors: (NSArray *)sortDescriptors; @end @interface NSMutableArray (NSSortDescriptorSorting) /** * This method works like this: first, it sorts the entire * contents of the array using the first sort descriptor. Then, * after each sort-run, it looks whether there are sort * descriptors left to process, and if yes, looks at the partially * sorted array, finds all portions in it which are equal * (evaluate to NSOrderedSame) and applies the following * descriptor onto them. It repeats this either until all * descriptors have been applied or there are no more equal * portions (equality ranges) left in the array. */ - (void) sortUsingDescriptors: (NSArray *)sortDescriptors; @end #if OS_API_VERSION(MAC_OS_X_VERSION_10_6,GS_API_LATEST) @interface GS_GENERIC_CLASS(NSSet, ElementT) (NSSortDescriptorSorting) /** * Produces a sorted array from using the mechanism described for * [NSMutableArray-sortUsingDescriptors:] */ - (GS_GENERIC_CLASS(NSArray, ElementT) *) sortedArrayUsingDescriptors: (NSArray *)sortDescriptors; @end #endif #if defined(__cplusplus) } #endif #endif /* 100400 */ #endif /* __NSSortDescriptor_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSSpellServer.h000066400000000000000000000121071435650067400225540ustar00rootroot00000000000000/* NSSpellServer.h Class to allow a spell checker to be available to other apps Copyright (C) 1996 Free Software Foundation, Inc. Author: Gregory John Casamento Date: 2001 Author of previous version: Scott Christley Date: 1996 This file is part of the GNUstep Base Library. 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 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; see the file COPYING.LIB. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _GNUstep_H_NSSpellServer #define _GNUstep_H_NSSpellServer #import #import #import #if defined(__cplusplus) extern "C" { #endif // Forward declarations @class NSConnection; @class NSMutableArray; @class NSMutableDictionary; #if OS_API_VERSION(MAC_OS_X_VERSION_10_5,GS_API_LATEST) GS_EXPORT NSString *const NSGrammarCorrections; GS_EXPORT NSString *const NSGrammarRange; GS_EXPORT NSString *const NSGrammarUserDescription; #endif GS_EXPORT_CLASS @interface NSSpellServer : NSObject { #if GS_EXPOSE(NSSpellServer) @private id _delegate; BOOL _caseSensitive GS_UNUSED_IVAR; unsigned char _dummy[3] GS_UNUSED_IVAR; NSMutableDictionary *_userDictionaries; NSString *_currentLanguage; NSArray *_ignoredWords; #endif #if GS_NONFRAGILE #else /* Pointer to private additional data used to avoid breaking ABI * when we don't have the non-fragile ABI available. * Use this mechanism rather than changing the instance variable * layout (see Source/GSInternal.h for details). */ @private id _internal GS_UNUSED_IVAR; #endif } // Checking in Your Service - (BOOL) registerLanguage: (NSString *)language byVendor: (NSString *)vendor; // Assigning a Delegate - (id) delegate; - (void) setDelegate: (id)anObject; // Running the Service - (void) run; // Checking User Dictionaries - (BOOL) isWordInUserDictionaries: (NSString *)word caseSensitive: (BOOL)flag; @end /** This is an informal protocol since the NSSpellChecker will need to use a proxy object to call these methods. These methods need to be implemented by the spell service so that the NSSpellServer instance call call them when necessary. */ @interface NSObject (NSSpellServerDelegate) /** *

* This method is called when the user begins spell checking the document. * The parameters are: sender the spell server instance which * invoked this method, stringToCheck this is the string which * the spell service is going to attempt to find misspelled words in, * language the language to check in, wordCount the * number of words checked, and countOnly a flag which dictates * if them method checks the spelling or just counts the words in the given * string. *

*

* Returns a range for any word it finds that is misspelled. *

*/ - (NSRange) spellServer: (NSSpellServer *)sender findMisspelledWordInString: (NSString *)stringToCheck language: (NSString *)language wordCount: (int32_t *)wordCount countOnly: (BOOL)countOnly; /** * Attempts to guess the correct spelling of word. */ - (NSArray *) spellServer: (NSSpellServer *)sender suggestGuessesForWord: (NSString *)word inLanguage: (NSString *)language; /** * Records the new word in the user's dictionary for the given language. */ - (void) spellServer: (NSSpellServer *)sender didLearnWord: (NSString *)word inLanguage: (NSString *)language; /** * Forgets the given word in the user's dictionary for the given language. */ - (void) spellServer: (NSSpellServer *)sender didForgetWord: (NSString *)word inLanguage: (NSString *)language; #if OS_API_VERSION(MAC_OS_X_VERSION_10_3,GS_API_LATEST) /** Not implemented */ - (NSArray *) spellServer: (NSSpellServer *)sender suggestCompletionsForPartialWordRange: (NSRange)range inString: (NSString *)string language: (NSString *)language; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_5,GS_API_LATEST) /** Not implemented */ - (NSRange) spellServer: (NSSpellServer *)sender checkGrammarInString: (NSString *)stringToCheck language: (NSString *)language details: (NSArray **)details; #endif @end #if !NO_GNUSTEP // Function to create name for spell server GS_EXPORT NSString* GSSpellServerName(NSString *vendor, NSString *language); #endif #if defined(__cplusplus) } #endif #endif // _GNUstep_H_NSSpellServer gnustep-base-1.29.0/Headers/Foundation/NSStream.h000066400000000000000000000214061435650067400215430ustar00rootroot00000000000000/** Interface for NSStream for GNUStep Copyright (C) 2006 Free Software Foundation, Inc. Written by: Derek Zhou Date: 2006 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 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 USA. */ #ifndef __NSStream_h_GNUSTEP_BASE_INCLUDE #define __NSStream_h_GNUSTEP_BASE_INCLUDE #import #if OS_API_VERSION(MAC_OS_X_VERSION_10_4,GS_API_LATEST) && GS_API_VERSION( 10200,GS_API_LATEST) #import #if defined(__cplusplus) extern "C" { #endif enum { NSStreamStatusNotOpen = 0, NSStreamStatusOpening = 1, NSStreamStatusOpen = 2, NSStreamStatusReading = 3, NSStreamStatusWriting = 4, NSStreamStatusAtEnd = 5, NSStreamStatusClosed = 6, NSStreamStatusError = 7 }; typedef NSUInteger NSStreamStatus; enum { NSStreamEventNone = 0, NSStreamEventOpenCompleted = 1, NSStreamEventHasBytesAvailable = 2, NSStreamEventHasSpaceAvailable = 4, NSStreamEventErrorOccurred = 8, NSStreamEventEndEncountered = 16 }; typedef NSUInteger NSStreamEvent; @class NSError; @class NSHost; @class NSInputStream; @class NSOutputStream; @class NSString; @class NSRunLoop; @class NSURL; /** * NSStream is an abstract class for objects representing streams. */ GS_EXPORT_CLASS @interface NSStream : NSObject /** * Creates and returns by reference an NSInputStream object and NSOutputStream * object for a socket connection with the specified port on host. */ + (void) getStreamsToHost: (NSHost *)host port: (NSInteger)port inputStream: (NSInputStream **)inputStream outputStream: (NSOutputStream **)outputStream; /** * Closes the receiver.
* Repeated calls to this method on the same stream are quietly ignored. */ - (void) close; /** * Returns the receiver's delegate. */ - (id) delegate; /** * Opens the receiving stream.
* Upon completion of the open operation, an NSStreamEventOpenCompleted * event is sent to the recevier's delegate.
* Repeated calls to this method on the same stream are quietly ignored. */ - (void) open; /** * Returns the receiver's property for the specified key. */ - (id) propertyForKey: (NSString *)key; /** * Removes the receiver from the NSRunLoop specified by aRunLoop * running in the mode.
* Attempts to remove the receiver from a run loop or a mode in * which it has not been scheduled are quietly ignored. */ - (void) removeFromRunLoop: (NSRunLoop *)aRunLoop forMode: (NSString *)mode; /** * Schedules the receiver on aRunLoop using the specified mode.
* You must not attempt to add a stream to more than one run loop, * but you may call this method multiple times to add the receiver * in different modes for the same run loop. */ - (void) scheduleInRunLoop: (NSRunLoop *)aRunLoop forMode: (NSString *)mode; /** * Sets the receiver's delegate. */ - (void) setDelegate: (id)delegate; /** * Sets the value of the property specified by key to property, returns YES * if the key-value pair are accepted by the receiver. */ - (BOOL) setProperty: (id)property forKey: (NSString *)key; /** * Returns an NSError object representing the stream error, or nil if no error * has been encountered. */ - (NSError *) streamError; /** * Returns the receiver's status. */ - (NSStreamStatus) streamStatus; @end @class NSData; /** * NSInputStream is a subclass of NSStream that provides read-only * stream functionality. */ GS_EXPORT_CLASS @interface NSInputStream : NSStream /** * Creates and returns an initialized NSInputStream object * for reading from data. */ + (id) inputStreamWithData: (NSData *)data; /** * Creates and returns an initialized NSInputStream object that reads data from * the file at the specified path. */ + (id) inputStreamWithFileAtPath: (NSString *)path; /** * Creates and returns an initialized NSInputStream object that reads data from * the specified URL. */ + (id) inputStreamWithURL: (NSURL *)url; /** * Returns a pointer to the read buffer in buffer and, by reference, the number * of bytes available in len. */ - (BOOL) getBuffer: (uint8_t **)buffer length: (NSUInteger *)len; /** * Returns YES if the receiver has bytes available to read. * The receiver may also return YES if a read must be attempted * in order to determine the availability of bytes. */ - (BOOL) hasBytesAvailable; /** * Returns an initialized NSInputStream object for reading from data. */ - (id) initWithData: (NSData *)data; /** * Returns an initialized NSInputStream object for reading from the file at the * specified path. */ - (id) initWithFileAtPath: (NSString *)path; /** * Returns an initialized NSInputStream object for reading from the * specified URL. */ - (id) initWithURL: (NSURL *)url; /** * Reads up to len bytes into buffer, returning the actual number of bytes read. */ - (NSInteger) read: (uint8_t *)buffer maxLength: (NSUInteger)len; @end /** * NSOutputStream is a subclass of NSStream that provides * write-only stream functionality. */ GS_EXPORT_CLASS @interface NSOutputStream : NSStream /** * Creates and returns an initialized NSOutputStream object * that can write to buffer, up to a maximum of capacity bytes. */ + (id) outputStreamToBuffer: (uint8_t *)buffer capacity: (NSUInteger)capacity; /** * Creates and returns an initialized NSOutputStream object * for writing to the file specified by path. */ + (id) outputStreamToFileAtPath: (NSString *)path append: (BOOL)shouldAppend; /** * Creates and returns an initialized NSOutputStream object * that will write stream data to memory. */ + (id) outputStreamToMemory; /** * Returns YES if the receiver can be written to, * or if a write must be attempted * in order to determine if space is available. */ - (BOOL) hasSpaceAvailable; /** * Returns an initialized NSOutputStream object that can write to buffer, * up to a maximum of capacity bytes. */ - (id) initToBuffer: (uint8_t *)buffer capacity: (NSUInteger)capacity; /** * Returns an initialized NSOutputStream object for writing to the file * specified by path.
* If shouldAppend is YES, newly written data will be appended to any * existing file contents. */ - (id) initToFileAtPath: (NSString *)path append: (BOOL)shouldAppend; /** * Returns an initialized NSOutputStream object that will write to memory. */ - (id) initToMemory; /** * Writes the contents of buffer, up to a maximum of len bytes, * to the receiver. */ - (NSInteger) write: (const uint8_t *)buffer maxLength: (NSUInteger)len; @end GS_EXPORT NSString * const NSStreamDataWrittenToMemoryStreamKey; GS_EXPORT NSString * const NSStreamFileCurrentOffsetKey; GS_EXPORT NSString * const NSStreamSocketSecurityLevelKey; GS_EXPORT NSString * const NSStreamSocketSecurityLevelNone; GS_EXPORT NSString * const NSStreamSocketSecurityLevelSSLv2; GS_EXPORT NSString * const NSStreamSocketSecurityLevelSSLv3; GS_EXPORT NSString * const NSStreamSocketSecurityLevelTLSv1; GS_EXPORT NSString * const NSStreamSocketSecurityLevelNegotiatedSSL; GS_EXPORT NSString * const NSStreamSocketSSLErrorDomain; GS_EXPORT NSString * const NSStreamSOCKSErrorDomain; GS_EXPORT NSString * const NSStreamSOCKSProxyConfigurationKey; GS_EXPORT NSString * const NSStreamSOCKSProxyHostKey; GS_EXPORT NSString * const NSStreamSOCKSProxyPasswordKey; GS_EXPORT NSString * const NSStreamSOCKSProxyPortKey; GS_EXPORT NSString * const NSStreamSOCKSProxyUserKey; GS_EXPORT NSString * const NSStreamSOCKSProxyVersion4; GS_EXPORT NSString * const NSStreamSOCKSProxyVersion5; GS_EXPORT NSString * const NSStreamSOCKSProxyVersionKey; #if OS_API_VERSION(MAC_OS_X_VERSION_10_7,GS_API_LATEST) && GS_PROTOCOLS_HAVE_OPTIONAL @protocol NSStreamDelegate @optional - (void) stream: (NSStream*)sStream handleEvent: (NSStreamEvent)anEvent; @end #else /** * Informal protocol for delegates of instance of the [NSStream] class. */ @interface NSObject (NSStreamDelegate) - (void) stream: (NSStream*)sStream handleEvent: (NSStreamEvent)anEvent; @end #endif #if defined(__cplusplus) } #endif #if !NO_GNUSTEP && !defined(GNUSTEP_BASE_INTERNAL) #import #endif #endif /* 100200 */ #endif /* __NSStream_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSString.h000066400000000000000000001504741435650067400215660ustar00rootroot00000000000000/* Interface for NSString for GNUstep Copyright (C) 1995, 1996, 1999 Free Software Foundation, Inc. Written by: Andrew Kachites McCallum Date: 1995 This file is part of the GNUstep Base Library. 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 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 USA. */ /** Portable path handling

Portable path handling (across both unix-like and mswindows operating systems) requires some care. A modern operating system uses the concept of a single root to the filesystem, but mswindows has multiple filesystems with no common root, so code must be aware of this. There is also the more minor issue that windows often uses a backslash as a separator between the components of a path and unix-like systems always use forward slash.
On windows there is also the issue that two styles of path are used, most commonly with a drive letter and a path on that drive (eg. 'C:\directory\file') but also UNC paths (eg. '//host/share/directory/file') so path handling functions must deal with both formats.

GNUstep has three path handling modes, 'gnustep', 'unix', and 'windows'. The mode defaults to 'gnustep' but may be set using the GSPathHandling() function.
You should probably stick to using the default 'gnustep' mode in which the path handling methods cope with both 'unix' and 'windows' style paths in portable and tolerant manner:
Paths are read in literally so they can be in the native format provided by the operating system or in a non-native format. See [NSFileManager-stringWithFileSystemRepresentation:length:].
Paths are written out using the native format of the system the application is running on (eg on windows slashes are converted to backslashes). See [NSFileManager-fileSystemRepresentationWithPath:].
The path handling methods accept either a forward or backward slash as a path separator when parsing any path.
Unless operating in 'unix' mode, a leading letter followed by a colon is considered the start of a windows style path (the drive specifier), and a path beginning with something of the form '//host/share/' is considered the start of a UNC style path.
The path handling methods add forward slashes when building new paths internally or when standardising paths, so those path strings provide a portable representation (as long as they are relative paths, not including system specific roots).
An important case to note is that on windows a path which looks at first glance like an absolute path may actually be a relative one.
'C:file' is a relative path because it specifies a file on the C drive but does not say what directory it is in.
Similarly, '/dir/file' is a relative path because it specifies the full location fo a file on a drive, but does not specify which drive it is on.

As a consequence of this path handling, you are able to work completely portably using relative paths (adding components, extensions and relative paths to a pth, or removing components, extensions and relative paths from a path etc), and when you save paths as strings in files which may be transferred to another platform, you should save a relative path.
When you need to know absolute paths of various points in the filesystem, you can use various path utility functions to obtain those absolute paths. For instance, instead of saving an absolute path to a file, you might want to save a path relative to a user's home directory. You could do that by calling NSHomeDirectory() to get the home directory, and only saving the part of the full path after that prefix.

*/ #ifndef __NSString_h_GNUSTEP_BASE_INCLUDE #define __NSString_h_GNUSTEP_BASE_INCLUDE #import #import #import #if defined(__cplusplus) extern "C" { #endif /** * Type for representing unicode characters. (16-bit) */ typedef uint16_t unichar; #if OS_API_VERSION(MAC_OS_X_VERSION_10_5,GS_API_LATEST) #define NSMaximumStringLength (INT_MAX-1) #endif @class GS_GENERIC_CLASS(NSArray, ElementT); @class NSCharacterSet; @class NSData; @class NSDictionary; #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) @class NSError; @class NSLocale; @class NSURL; #endif #define NSMaximumStringLength (INT_MAX-1) enum { NSCaseInsensitiveSearch = 1, NSLiteralSearch = 2, NSBackwardsSearch = 4, NSAnchoredSearch = 8, NSNumericSearch = 64 /* MacOS-X 10.2 */ #if OS_API_VERSION(MAC_OS_X_VERSION_10_5,GS_API_LATEST) , NSDiacriticInsensitiveSearch = 128, NSWidthInsensitiveSearch = 256, NSForcedOrderingSearch = 512 #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_7,GS_API_LATEST) , /** * Treats the search string as a regular expression. This option may be * combined with NSCaseInsensitiveSearch and NSAnchoredSearch, but no other * search options. * * This option may only be used with the -rangeOfString: family of methods. */ NSRegularExpressionSearch = 1024 #endif }; typedef NSUInteger NSStringCompareOptions; /** *

Enumeration of available encodings for converting between bytes and * characters (in [NSString]s). The ones that are shared with OpenStep and * Cocoa are: NSASCIIStringEncoding, NSNEXTSTEPStringEncoding, * NSJapaneseEUCStringEncoding, NSUTF8StringEncoding, * NSISOLatin1StringEncoding, NSSymbolStringEncoding, * NSNonLossyASCIIStringEncoding, NSShiftJISStringEncoding, * NSISOLatin2StringEncoding, NSUnicodeStringEncoding, * NSWindowsCP1251StringEncoding, NSWindowsCP1252StringEncoding, * NSWindowsCP1253StringEncoding, NSWindowsCP1254StringEncoding, * NSWindowsCP1250StringEncoding, NSISO2022JPStringEncoding, * NSMacOSRomanStringEncoding, NSProprietaryStringEncoding.

* *

Additional encodings available under GNUstep are: * NSKOI8RStringEncoding, NSISOLatin3StringEncoding, * NSISOLatin4StringEncoding, NSISOCyrillicStringEncoding, * NSISOArabicStringEncoding, NSISOGreekStringEncoding, * NSISOHebrewStringEncoding, NSISOLatin5StringEncoding, * NSISOLatin6StringEncoding, NSISOThaiStringEncoding, * NSISOLatin7StringEncoding, NSISOLatin8StringEncoding, * NSISOLatin9StringEncoding, NSChineseEUCStringEncoding, NSUTF7StringEncoding, * NSGSM0338StringEncoding, NSBig5StringEncoding, * NSKoreanEUCStringEncoding, NSDOSLatinUSStringEncoding, * NSDOSGreekStringEncoding, NSDOSBalticRimStringEncoding, * NSDOSLatin1StringEncoding, NSDOSGreek1StringEncoding, * NSDOSLatin2StringEncoding, NSDOSCyrillicStringEncoding, * NSDOSTurkishStringEncoding, NSDOICortugueseStringEncoding, * NSDOSIcelandicStringEncoding, NSDOSHebrewStringEncoding, * NSDOSCanadianFrenchStringEncoding, NSDOSArabicStringEncoding, * NSDOSNordicStringEncoding, NSDOSRussianStringEncoding, * NSDOSGreek2StringEncoding, NSDOSThaiStringEncoding, * NSDOSJapaneseStringEncoding, NSDOSChineseSimplifStringEncoding, * NSDOSKoreanStringEncoding, NSDOSChineseTradStringEncoding, * NSWindowsHebrewStringEncoding, NSWindowsArabicStringEncoding, * NSWindowsBalticRimStringEncoding, NSWindowsVietnameseStringEncoding * NSWindowsKoreanJohabStringEncoding.

*/ typedef enum _NSStringEncoding { /* NB. Must not have an encoding with value zero - so we can use zero to tell that a variable that should contain an encoding has not yet been initialised */ GSUndefinedEncoding = 0, NSASCIIStringEncoding = 1, /* 0..127 only */ NSNEXTSTEPStringEncoding = 2, NSJapaneseEUCStringEncoding = 3, NSUTF8StringEncoding = 4, NSISOLatin1StringEncoding = 5, NSSymbolStringEncoding = 6, NSNonLossyASCIIStringEncoding = 7, NSShiftJISStringEncoding = 8, /* kCFStringEncodingDOSJapanese */ NSISOLatin2StringEncoding = 9, NSUnicodeStringEncoding = 10, NSWindowsCP1251StringEncoding = 11, /* Cyrillic; same as AdobeStandardCyrillic */ NSWindowsCP1252StringEncoding = 12, /* WinLatin1 */ NSWindowsCP1253StringEncoding = 13, /* Greek */ NSWindowsCP1254StringEncoding = 14, /* Turkish */ NSWindowsCP1250StringEncoding = 15, /* WinLatin2 */ NSISO2022JPStringEncoding = 21, /* ISO 2022 Japanese encoding for e-mail */ NSMacOSRomanStringEncoding = 30, NSUTF16StringEncoding = NSUnicodeStringEncoding, /* An alias for NSUnicodeStringEncoding */ NSUTF16BigEndianStringEncoding = 0x90000100, /* NSUTF16StringEncoding encoding with explicit endianness specified */ NSUTF16LittleEndianStringEncoding = 0x94000100, /* NSUTF16StringEncoding encoding with explicit endianness specified */ NSUTF32StringEncoding = 0x8c000100, NSUTF32BigEndianStringEncoding = 0x98000100, /* NSUTF32StringEncoding encoding with explicit endianness specified */ NSUTF32LittleEndianStringEncoding = 0x9c000100, /* NSUTF32StringEncoding encoding with explicit endianness specified */ NSProprietaryStringEncoding = 0x00010000, /* Exclusive to GNUstep */ NSGSM0338StringEncoding = 65, // GSM (mobile phone) default alphabet /* NSStringEncoding Appendix */ // NSMacOSRomanStringEncoding = 0x80000000, // defined as 30 NSMacOSJapaneseStringEncoding = 0x80000001, NSMacOSTraditionalChineseStringEncoding = 0x80000002, NSMacOSKoreanStringEncoding = 0x80000003, NSMacOSArabicStringEncoding = 0x80000004, NSMacOSHebrewStringEncoding = 0x80000005, NSMacOSGreekStringEncoding = 0x80000006, NSMacOSCyrillicStringEncoding = 0x80000007, // missing 08 NSMacOSDevanagariStringEncoding = 0x80000009, NSMacOSGurmukhiStringEncoding = 0x8000000a, NSMacOSGujaratiStringEncoding = 0x8000000b, NSMacOSOriyaStringEncoding = 0x8000000c, NSMacOSBengaliStringEncoding = 0x8000000d, NSMacOSTamilStringEncoding = 0x8000000e, NSMacOSTeluguStringEncoding = 0x8000000f, NSMacOSKannadaStringEncoding = 0x80000010, NSMacOSMalayalamStringEncoding = 0x80000011, NSMacOSSinhaleseStringEncoding = 0x80000012, NSMacOSBurmeseStringEncoding = 0x80000013, NSMacOSKhmerStringEncoding = 0x80000014, NSMacOSThaiStringEncoding = 0x80000015, NSMacOSLaotianStringEncoding = 0x80000016, NSMacOSGeorgianStringEncoding = 0x80000017, NSMacOSArmenianStringEncoding = 0x80000018, NSMacOSSimplifiedChineseStringEncoding = 0x80000019, NSMacOSTibetanStringEncoding = 0x8000001a, NSMacOSMongolianStringEncoding = 0x8000001b, NSMacOSEthiopicStringEncoding = 0x8000001c, NSMacOSCentralEuropeanRomanStringEncoding = 0x8000001d, NSMacOSVietnameseStringEncoding = 0x8000001e, NSMacOSExtendedArabicStringEncoding = 0x8000001f, // missing 20 /* The following use script code 0, smRoman */ NSMacOSSymbolStringEncoding = 0x80000021, NSMacOSDingbatsStringEncoding = 0x80000022, NSMacOSTurkishStringEncoding = 0x80000023, NSMacOSCroatianStringEncoding = 0x80000024, NSMacOSIcelandicStringEncoding = 0x80000025, NSMacOSRomanianStringEncoding = 0x80000026, NSMacOSCelticStringEncoding = 0x80000027, NSMacOSGaelicStringEncoding = 0x80000028, NSMacOSKeyboardSymbolsStringEncoding = 0x80000029, /* The following use script code 4, smArabic */ NSMacOSFarsiStringEncoding = 0x8000008c, /* The following use script code 7, smCyrillic */ NSMacOSUkrainianStringEncoding = 0x80000098, /* The following use script code 32, smUnimplemented */ NSMacOSInuitStringEncoding = 0x800000ec, NSMacVT100StringEncoding = 0x800000fc, /* VT100/102 font from Comm Toolbox: Latin-1 repertoire + box drawing etc */ /* ICecial Mac OS encodings*/ NSMacHFSStringEncoding = 0x800000ff, /* Unicode & ISO UCS encodings begin at 0x100 */ // NSUnicodeStringEncoding = 0x80000100, // NSUTF8StringEncoding = 0x88000100, // defined as 4 // NSUTF16StringEncoding = 0x90000100, // NSUTF16BigEndianStringEncoding = 0x90000100, // NSUTF16LittleEndianStringEncoding = 0x94000100, // NSUTF32StringEncoding = 0x8c000100, // NSUTF32BigEndianStringEncoding = 0x98000100, // NSUTF32LittleEndianStringEncoding = 0x9c000100, #if OS_API_VERSION(MAC_OS_X_VERSION_10_6,GS_API_LATEST) NSUTF7StringEncoding = 0x84000100, /* kTextEncodingUnicodeDefault + kUnicodeUTF7Format RFC2152 */ NSUTF7IMAPStringEncoding = 0x80000A10, /* UTF-7 (IMAP folder variant) RFC3501 */ #endif /* ISO 8-bit and 7-bit encodings begin at 0x200 */ // NSISOLatin1StringEncoding = 0x80000201, /* ISO 8859-1, defined as 5 */ // NSISOLatin2StringEncoding = 0x80000202, /* ISO 8859-2, defined as 9 */ NSISOLatin3StringEncoding = 0x80000203, /* ISO 8859-3 */ NSISOLatin4StringEncoding = 0x80000204, /* ISO 8859-4 */ NSISOCyrillicStringEncoding = 0x80000205, /* ISO 8859-5 */ NSISOArabicStringEncoding = 0x80000206, /* ISO 8859-6, StringEncoding=ASMO 708, StringEncoding=DOS CP 708 */ NSISOGreekStringEncoding = 0x80000207, /* ISO 8859-7 */ NSISOHebrewStringEncoding = 0x80000208, /* ISO 8859-8 */ NSISOLatin5StringEncoding = 0x80000209, /* ISO 8859-9 */ NSISOLatin6StringEncoding = 0x8000020a, /* ISO 8859-10 */ NSISOThaiStringEncoding = 0x8000020b, /* ISO 8859-11 */ // missing 0c NSISOLatin7StringEncoding = 0x8000020d, /* ISO 8859-13 */ NSISOLatin8StringEncoding = 0x8000020e, /* ISO 8859-14 */ NSISOLatin9StringEncoding = 0x8000020f, /* ISO 8859-15 */ #if OS_API_VERSION(MAC_OS_X_VERSION_10_4,GS_API_LATEST) NSISOLatin10StringEncoding = 0x80000210, /* ISO 8859-16 */ #endif NSISOLatinArabicStringEncoding = NSISOArabicStringEncoding, NSISOLatinBalticRimStringEncoding = NSISOLatin7StringEncoding, NSISOLatinCelticStringEncoding = NSISOLatin8StringEncoding, NSISOLatinCyrillicStringEncoding = NSISOCyrillicStringEncoding, NSISOLatinGreekStringEncoding = NSISOGreekStringEncoding, NSISOLatinHebrewStringEncoding = NSISOHebrewStringEncoding, NSISOLatinNordicStringEncoding = NSISOLatin6StringEncoding, NSISOLatinThaiStringEncoding = NSISOThaiStringEncoding, NSISOLatinTurkishStringEncoding = NSISOLatin5StringEncoding, /* MS-DOS & Windows encodings begin at 0x400 */ NSDOSLatinUSStringEncoding = 0x80000400, /* code page 437 */ NSDOSGreekStringEncoding = 0x80000405, /* code page 737 (formerly code page 437G) */ NSDOSBalticRimStringEncoding = 0x80000406, /* code page 775 */ NSDOSLatin1StringEncoding = 0x80000410, /* code page 850, "Multilingual" */ NSDOSGreek1StringEncoding = 0x80000411, /* code page 851 */ NSDOSLatin2StringEncoding = 0x80000412, /* code page 852, Slavic */ NSDOSCyrillicStringEncoding = 0x80000413, /* code page 855, IBM Cyrillic */ NSDOSTurkishStringEncoding = 0x80000414, /* code page 857, IBM Turkish */ NSDOICortugueseStringEncoding = 0x80000415, /* code page 860 */ NSDOSIcelandicStringEncoding = 0x80000416, /* code page 861 */ NSDOSHebrewStringEncoding = 0x80000417, /* code page 862 */ NSDOSCanadianFrenchStringEncoding = 0x80000418, /* code page 863 */ NSDOSArabicStringEncoding = 0x80000419, /* code page 864 */ NSDOSNordicStringEncoding = 0x8000041A, /* code page 865 */ NSDOSRussianStringEncoding = 0x8000041B, /* code page 866 */ NSDOSGreek2StringEncoding = 0x8000041C, /* code page 869, IBM Modern Greek */ NSDOSThaiStringEncoding = 0x8000041D, /* code page 874, also for Windows */ NSDOSJapaneseStringEncoding = 0x80000420, /* code page 932, also for Windows */ NSDOSChineseSimplifStringEncoding = 0x80000421, /* code page 936, also for Windows */ NSDOSKoreanStringEncoding = 0x80000422, /* code page 949, also for Windows; Unified Hangul Code */ NSDOSChineseTradStringEncoding = 0x80000423, /* code page 950, also for Windows */ NSWindowsLatin1StringEncoding = 0x80000500, /* code page 1252 */ NSWindowsLatin2StringEncoding = 0x80000501, /* code page 1250, Central Europe */ NSWindowsCyrillicStringEncoding = 0x80000502, /* code page 1251, Slavic Cyrillic */ NSWindowsGreekStringEncoding = 0x80000503, /* code page 1253 */ NSWindowsLatin5StringEncoding = 0x80000504, /* code page 1254, Turkish */ NSWindowsHebrewStringEncoding = 0x80000505, /* code page 1255 */ NSWindowsArabicStringEncoding = 0x80000506, /* code page 1256 */ NSWindowsBalticRimStringEncoding = 0x80000507, /* code page 1257 */ NSWindowsVietnameseStringEncoding = 0x80000508, /* code page 1258 */ NSWindowsKoreanJohabStringEncoding = 0x80000510, /* code page 1361, for Windows NT */ // NSASCIIStringEncoding = 0x80000600, /* 0..127 defined as 1 */ NSJIS_X0201_76StringEncoding = 0x80000620, NSJIS_X0208_83StringEncoding = 0x80000621, NSJIS_X0208_90StringEncoding = 0x80000622, NSJIS_X0212_90StringEncoding = 0x80000623, NSJIS_C6226_78StringEncoding = 0x80000624, #if OS_API_VERSION(MAC_OS_X_VERSION_10_5,GS_API_LATEST) NSShiftJIS_X0213StringEncoding = 0x80000628, /* Shift-JIS format encoding of JIS X0213 planes 1 and 2*/ #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_5,GS_API_LATEST) NSShiftJIS_X0213_MenKuTenStringEncoding = 0x80000629, /* JIS X0213 in plane-row-column notation */ NSShiftJIS_X0213_00StringEncoding = 0x80000629, /* Shift-JIS format encoding of JIS X0213 planes 1 and 2 (DEPRECATED) */ #endif NSGB_2312_80StringEncoding = 0x80000630, NSGBK_95StringEncoding = 0x80000631, /* annex to GB 13000-93; for Windows 95 */ NSGB_18030_2000StringEncoding = 0x80000632, NSKSC_5601_87StringEncoding = 0x80000640, /* same as KSC 5601-92 without Johab annex */ NSKSC_5601_92_JohabStringEncoding = 0x80000641, /* KSC 5601-92 Johab annex */ NSCNS_11643_92_P1StringEncoding = 0x80000651, /* CNS 11643-1992 plane 1 */ NSCNS_11643_92_P2StringEncoding = 0x80000652, /* CNS 11643-1992 plane 2 */ NSCNS_11643_92_P3StringEncoding = 0x80000653, /* CNS 11643-1992 plane 3 (was plane 14 in 1986 version) */ /* ISO 2022 collections begin at 0x800 */ NSISO2022JapaneseStringEncoding = 0x80000820, NSISO2022Japanese2StringEncoding = 0x80000821, NSISO2022Japanese1StringEncoding = 0x80000822, /* RFC 2237*/ NSISO2022Japanese3StringEncoding = 0x80000823, /* JIS X0213*/ NSISO2022ChineseStringEncoding = 0x80000830, NSISO2022ExtendedChineseStringEncoding = 0x80000831, NSISO2022KoreanStringEncoding = 0x80000840, /* EUC collections begin at 0x900 */ NSEUCJapaneseStringEncoding = 0x80000920, /* ISO 646, 1-byte katakana, JIS 208, JIS 212 */ NSEUCChineseStringEncoding = 0x80000930, /* ISO 646, GB 2312-80 */ NSEUCTaiwanChineseStringEncoding = 0x80000931, /* ISO 646, CNS 11643-1992 Planes 1-16 */ NSEUCKoreanStringEncoding = 0x80000940, /* ISO 646, KS C 5601-1987 */ NSKoreanEUCStringEncoding = NSEUCKoreanStringEncoding, NSChineseEUCStringEncoding = NSEUCChineseStringEncoding, NSTaiwanChineseEUCStringEncoding = NSEUCTaiwanChineseStringEncoding, /* Misc standards begin at 0xA00 */ // NSShiftJISStringEncoding = 0x80000A01, /* plain Shift-JIS */ NSKOI8RStringEncoding = 0x80000A02, /* Russian internet standard */ NSBig5StringEncoding = 0x80000A03, /* Big-5 (has variants) */ NSMacRomanLatin1StringEncoding = 0x80000A04, /* Mac OS Roman permuted to align with ISO Latin-1 */ NSHZ_GB_2312StringEncoding = 0x80000A05, /* HZ (RFC 1842, for Chinese mail & news) */ NSBig5_HKSCS_1999StringEncoding = 0x80000A06, /* Big-5 with Hong Kong ICecial char set supplement*/ #if OS_API_VERSION(MAC_OS_X_VERSION_10_4,GS_API_LATEST) NSVISCIIStringEncoding = 0x80000A07, /* RFC 1456, Vietnamese */ NSKOI8UStringEncoding = 0x80000A08, /* RFC 2319, Ukrainian */ NSBig5EStringEncoding = 0x80000A09, /* Taiwan Big-5E standard */ #endif /* Other platform encodings*/ NSNextStepLatinStringEncoding = 0x80000B01, /* NextStep Latin encoding */ #if OS_API_VERSION(MAC_OS_X_VERSION_10_4,GS_API_LATEST) NSNextStepJapaneseStringEncoding = 0x80000B02, /* NextStep Japanese encoding */ #endif // NSNonLossyASCIIStringEncoding = 0x80000bff, /* EBCDIC & IBM host encodings begin at 0xC00 */ NSEBCDICUSStringEncoding = 0x80000C01, /* basic EBCDIC-US */ NSEBCDICCP037StringEncoding = 0x80000C02, /* code page 037, extended EBCDIC (Latin-1 set) for US,Canada... */ } NSStringEncoding; enum { NSOpenStepUnicodeReservedBase = 0xF400 }; #if OS_API_VERSION(MAC_OS_X_VERSION_10_4,GS_API_LATEST) enum { NSStringEncodingConversionAllowLossy = 1, NSStringEncodingConversionExternalRepresentation = 2 }; typedef NSUInteger NSStringEncodingConversionOptions; #endif /** *

* NSString objects represent an immutable string of Unicode 3.0 * characters. These may be accessed individually as type * unichar, an unsigned short.
* The [NSMutableString] subclass represents a modifiable string. Both are * implemented as part of a class cluster and the instances you receive may * actually be of unspecified concrete subclasses. *

*

* A constant NSString can be created using the following syntax: * @"...", where the contents of the quotes are the * string, using only ASCII characters. *

*

* A variable string can be created using a C printf-like format, * as in [NSString stringWithFormat: @"Total is %f", t]. *

*

* To create a concrete subclass of NSString, you must have your * class inherit from NSString and override at least the two * primitive methods - -length and -characterAtIndex: *

*

* In general the rule is that your subclass must override any * initialiser that you want to use with it. The GNUstep * implementation relaxes that to say that, you may override * only the designated initialiser and the other * initialisation methods should work. *

*

* Where an NSString instance method returns an NSString object, * the class of the actual object returned may be any subclass * of NSString. The actual value returned may be a new * autoreleased object, an autoreleased copy of the receiver, * or the receiver itsself. While the abstract base class * implementations of methods (other than initialisers) will * avoid returning mutable strings by returning an autoreleased * copy of a mutable receiver, concrete subclasses may behave * differently, so code should not rely upon the mutability of * returned strings nor upon their lifetime being greater than * that of the receiver which returned them. *

*/ GS_EXPORT_CLASS @interface NSString :NSObject + (instancetype) string; + (instancetype) stringWithCharacters: (const unichar*)chars length: (NSUInteger)length; #if OS_API_VERSION(MAC_OS_X_VERSION_10_4,GS_API_LATEST) && GS_API_VERSION( 10200,GS_API_LATEST) + (instancetype) stringWithCString: (const char*)byteString encoding: (NSStringEncoding)encoding; #endif + (instancetype) stringWithCString: (const char*)byteString length: (NSUInteger)length; + (instancetype) stringWithCString: (const char*)byteString; + (instancetype) stringWithFormat: (NSString*)format, ... NS_FORMAT_FUNCTION(1,2); + (instancetype) stringWithContentsOfFile:(NSString *)path; // Initializing Newly Allocated Strings - (instancetype) init; #if OS_API_VERSION(MAC_OS_X_VERSION_10_4,GS_API_LATEST) && GS_API_VERSION( 10200,GS_API_LATEST) - (instancetype) initWithBytes: (const void*)bytes length: (NSUInteger)length encoding: (NSStringEncoding)encoding; - (instancetype) initWithBytesNoCopy: (void*)bytes length: (NSUInteger)length encoding: (NSStringEncoding)encoding freeWhenDone: (BOOL)flag; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_4,GS_API_LATEST) + (instancetype) stringWithContentsOfFile: (NSString*)path usedEncoding: (NSStringEncoding*)enc error: (NSError**)error; - (instancetype) initWithContentsOfFile: (NSString*)path usedEncoding: (NSStringEncoding*)enc error: (NSError**)error; + (instancetype) stringWithContentsOfFile: (NSString*)path encoding: (NSStringEncoding)enc error: (NSError**)error; - (instancetype) initWithContentsOfFile: (NSString*)path encoding: (NSStringEncoding)enc error: (NSError**)error; + (instancetype) stringWithContentsOfURL: (NSURL*)url usedEncoding: (NSStringEncoding*)enc error: (NSError**)error; - (instancetype) initWithContentsOfURL: (NSURL*)url usedEncoding: (NSStringEncoding*)enc error: (NSError**)error; + (instancetype) stringWithContentsOfURL: (NSURL*)url encoding: (NSStringEncoding)enc error: (NSError**)error; - (instancetype) initWithContentsOfURL: (NSURL*)url encoding: (NSStringEncoding)enc error: (NSError**)error; - (BOOL) writeToFile: (NSString*)path atomically: (BOOL)atomically encoding: (NSStringEncoding)enc error: (NSError**)error; - (BOOL) writeToURL: (NSURL*)url atomically: (BOOL)atomically encoding: (NSStringEncoding)enc error: (NSError**)error; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_5,GS_API_LATEST) - (NSString*)stringByReplacingOccurrencesOfString: (NSString*)replace withString: (NSString*)by options: (NSStringCompareOptions)opts range: (NSRange)searchRange; - (NSString*)stringByReplacingOccurrencesOfString: (NSString*)replace withString: (NSString*)by; - (NSString*) stringByReplacingCharactersInRange: (NSRange)aRange withString: (NSString*)by; #endif - (instancetype) initWithCharactersNoCopy: (unichar*)chars length: (NSUInteger)length freeWhenDone: (BOOL)flag; - (instancetype) initWithCharacters: (const unichar*)chars length: (NSUInteger)length; - (instancetype) initWithCStringNoCopy: (char*)byteString length: (NSUInteger)length freeWhenDone: (BOOL)flag; - (instancetype) initWithCString: (const char*)byteString length: (NSUInteger)length; - (instancetype) initWithCString: (const char*)byteString; - (instancetype) initWithString: (NSString*)string; - (instancetype) initWithFormat: (NSString*)format, ... NS_FORMAT_FUNCTION(1,2); - (instancetype) initWithFormat: (NSString*)format arguments: (va_list)argList NS_FORMAT_FUNCTION(1,0); - (instancetype) initWithData: (NSData*)data encoding: (NSStringEncoding)encoding; - (instancetype) initWithContentsOfFile: (NSString*)path; // Getting a String's Length - (NSUInteger) length; // Accessing Characters - (unichar) characterAtIndex: (NSUInteger)index; - (void) getCharacters: (unichar*)buffer; - (void) getCharacters: (unichar*)buffer range: (NSRange)aRange; // Combining Strings - (NSString*) stringByAppendingFormat: (NSString*)format, ... NS_FORMAT_FUNCTION(1,2); - (NSString*) stringByAppendingString: (NSString*)aString; // Dividing Strings into Substrings - (GS_GENERIC_CLASS(NSArray, NSString*) *) componentsSeparatedByString: (NSString*)separator; - (NSString*) substringFromIndex: (NSUInteger)index; - (NSString*) substringToIndex: (NSUInteger)index; // Finding Ranges of Characters and Substrings - (NSRange) rangeOfCharacterFromSet: (NSCharacterSet*)aSet; - (NSRange) rangeOfCharacterFromSet: (NSCharacterSet*)aSet options: (NSUInteger)mask; - (NSRange) rangeOfCharacterFromSet: (NSCharacterSet*)aSet options: (NSUInteger)mask range: (NSRange)aRange; - (NSRange) rangeOfString: (NSString*)string; - (NSRange) rangeOfString: (NSString*)string options: (NSUInteger)mask; - (NSRange) rangeOfString: (NSString*)aString options: (NSUInteger)mask range: (NSRange)aRange; // Determining Composed Character Sequences - (NSRange) rangeOfComposedCharacterSequenceAtIndex: (NSUInteger)anIndex; #if OS_API_VERSION(MAC_OS_X_VERSION_10_2,GS_API_LATEST) /** Returns a copy of the receiver normalised using the KD form. */ - (NSString *) decomposedStringWithCompatibilityMapping; /** Returns a copy of the receiver normalised using the D form. */ - (NSString *) decomposedStringWithCanonicalMapping; /** Returns a copy of the receiver normalised using the KC form. */ - (NSString *) precomposedStringWithCompatibilityMapping; /** Returns a copy of the receiver normalised using the C form. */ - (NSString *) precomposedStringWithCanonicalMapping; #endif // Converting String Contents into a Property List - (id) propertyList; - (NSDictionary*) propertyListFromStringsFileFormat; // Identifying and Comparing Strings - (NSComparisonResult) compare: (NSString*)aString; - (NSComparisonResult) compare: (NSString*)aString options: (NSUInteger)mask; - (NSComparisonResult) compare: (NSString*)aString options: (NSUInteger)mask range: (NSRange)aRange; - (BOOL) hasPrefix: (NSString*)aString; - (BOOL) hasSuffix: (NSString*)aString; - (BOOL) isEqual: (id)anObject; - (BOOL) isEqualToString: (NSString*)aString; - (NSUInteger) hash; // Getting a Shared Prefix - (NSString*) commonPrefixWithString: (NSString*)aString options: (NSUInteger)mask; // Changing Case - (NSString*) capitalizedString; - (NSString*) lowercaseString; - (NSString*) uppercaseString; // Getting C Strings - (const char*) cString; #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) #if OS_API_VERSION(MAC_OS_X_VERSION_10_4,GS_API_LATEST) && GS_API_VERSION( 10200,GS_API_LATEST) - (const char*) cStringUsingEncoding: (NSStringEncoding)encoding; - (BOOL) getCString: (char*)buffer maxLength: (NSUInteger)maxLength encoding: (NSStringEncoding)encoding; - (instancetype) initWithCString: (const char*)byteString encoding: (NSStringEncoding)encoding; - (NSUInteger) lengthOfBytesUsingEncoding: (NSStringEncoding)encoding; - (NSUInteger) maximumLengthOfBytesUsingEncoding: (NSStringEncoding)encoding; #endif #endif - (NSUInteger) cStringLength; - (void) getCString: (char*)buffer; - (void) getCString: (char*)buffer maxLength: (NSUInteger)maxLength; - (void) getCString: (char*)buffer maxLength: (NSUInteger)maxLength range: (NSRange)aRange remainingRange: (NSRange*)leftoverRange; // Getting Numeric Values - (float) floatValue; - (int) intValue; // Working With Encodings - (BOOL) canBeConvertedToEncoding: (NSStringEncoding)encoding; - (NSData*) dataUsingEncoding: (NSStringEncoding)encoding; /** Conversion to an encoding where byte order matters but is not specified * (NSUnicodeStringEncoding, NSUTF16StringEncoding, NSUTF32StringEncoding) * produces data with a Byte Order Marker (BOM) at the start of the data. */ - (NSData*) dataUsingEncoding: (NSStringEncoding)encoding allowLossyConversion: (BOOL)flag; + (NSStringEncoding) defaultCStringEncoding; - (NSString*) description; - (NSStringEncoding) fastestEncoding; - (NSStringEncoding) smallestEncoding; /** * Attempts to complete this string as a path in the filesystem by finding * a unique completion if one exists and returning it by reference in * outputName (which must be a non-nil pointer), or if it finds a set of * completions they are returned by reference in outputArray, if it is non-nil. * filterTypes can be an array of strings specifying extensions to consider; * files without these extensions will be ignored and will not constitute * completions. Returns 0 if no match found, else a positive number that is * only accurate if outputArray was non-nil. */ - (NSUInteger) completePathIntoString: (NSString**)outputName caseSensitive: (BOOL)flag matchesIntoArray: (NSArray**)outputArray filterTypes: (NSArray*)filterTypes; /** * Converts the receiver to a C string path expressed in the character * encoding appropriate for the local host file system. This string will be * automatically freed soon after it is returned, so copy it if you need it * for long.
* NB. On mingw32 systems the filesystem representation of a path is a 16-bit * unicode character string, so you should only pass the value returned by * this method to functions expecting wide characters.
* This method uses [NSFileManager-fileSystemRepresentationWithPath:] to * perform the conversion. */ - (const GSNativeChar*) fileSystemRepresentation; /** * Converts the receiver to a C string path using the character encoding * appropriate to the local file system. This string will be stored * into buffer if it is shorter (number of characters) than size, * otherwise NO is returned.
* NB. On mingw32 systems the filesystem representation of a path is a 16-bit * unicode character string, so the buffer you pass to this method must be * twice as many bytes as the size (number of characters) you expect to * receive.
* This method uses [NSFileManager-fileSystemRepresentationWithPath:] to * perform the conversion. */ - (BOOL) getFileSystemRepresentation: (GSNativeChar*)buffer maxLength: (NSUInteger)size; /** * Returns a string containing the last path component of the receiver.
* The path component is the last non-empty substring delimited by the ends * of the string, or by path separator characters.
* If the receiver only contains a root part, this method returns it.
* If there are no non-empty substrings, this returns an empty string.
* NB. In a windows UNC path, the host and share specification is treated as * a single path component, even though it contains separators. * So a string of the form '//host/share' may be returned.
* Other special cases are apply when the string is the root. * * @"foo/bar" produces @"bar" * @"foo/bar/" produces @"bar" * @"/foo/bar" produces @"bar" * @"/foo" produces @"foo" * @"/" produces @"/" (root is a special case) * @"" produces @"" * @"C:/" produces @"C:/" (root is a special case) * @"C:" produces @"C:" * @"//host/share/" produces @"//host/share/" (root is a special case) * @"//host/share" produces @"//host/share" * */ - (NSString*) lastPathComponent; /** * Returns a new string containing the path extension of the receiver.
* The path extension is a suffix on the last path component which starts * with the extension separator (a '.') (for example .tiff is the * pathExtension for /foo/bar.tiff).
* Returns an empty string if no such extension exists. * * @"a.b" produces @"b" * @"a.b/" produces @"b" * @"/path/a.ext" produces @"ext" * @"/path/a." produces @"" * @"/path/.a" produces @"" (.a is not an extension to a file) * @".a" produces @"" (.a is not an extension to a file) * */ - (NSString*) pathExtension; /** * Returns a string where a prefix of the current user's home directory is * abbreviated by '~', or returns the receiver (or an immutable copy) if * it was not found to have the home directory as a prefix. */ - (NSString*) stringByAbbreviatingWithTildeInPath; /** * Returns a new string with the path component given in aString * appended to the receiver.
* This removes trailing path separators from the receiver and the root * part from aString and replaces them with a single slash as a path * separator.
* Also condenses any multiple separator sequences in the result into * single path separators. * * @"" with @"file" produces @"file" * @"path" with @"file" produces @"path/file" * @"/" with @"file" produces @"/file" * @"/" with @"file" produces @"/file" * @"/" with @"/file" produces @"/file" * @"path with @"C:/file" produces @"path/file" * * NB. Do not use this method to modify strings other than filesystem * paths as the behavior in such cases is undefined ... for instance * the string may have repeated slashes or slash-dot-slash sequences * removed. */ - (NSString*) stringByAppendingPathComponent: (NSString*)aString; /** * Returns a new string with the path extension given in aString * appended to the receiver after an extensionSeparator ('.').
* If the receiver has trailing path separator characters, they are * stripped before the extension separator is added.
* If the receiver contains no components after the root, the extension * cannot be appended (an extension can only be appended to a file name), * so a copy of the unmodified receiver is returned.
* An empty string may be used as an extension ... in which case the extension * separator is appended.
* This behavior mirrors that of the -stringByDeletingPathExtension method. * * @"Mail" with @"app" produces @"Mail.app" * @"Mail.app" with @"old" produces @"Mail.app.old" * @"file" with @"" produces @"file." * @"/" with @"app" produces @"/" (no file name to append to) * @"" with @"app" produces @"" (no file name to append to) * * NB. Do not use this method to modify strings other than filesystem * paths as the behavior in such cases is undefined ... for instance * the string may have repeated slashes or slash-dot-slash sequences * removed. */ - (NSString*) stringByAppendingPathExtension: (NSString*)aString; /** * Returns a new string with the last path component (including any final * path separators) removed from the receiver.
* A string without a path component other than the root is returned * without alteration.
* See -lastPathComponent for a definition of a path component. * * @"hello/there" produces @"hello" (a relative path) * @"hello" produces @"" (a relative path) * @"/hello" produces @"/" (an absolute unix path) * @"/" produces @"/" (an absolute unix path) * @"C:file" produces @"C:" (a relative windows path) * @"C:" produces @"C:" (a relative windows path) * @"C:/file" produces @"C:/" (an absolute windows path) * @"C:/" produces @"C:/" (an absolute windows path) * @"//host/share/file" produces @"//host/share/" (a UNC path) * @"//host/share/" produces @"//host/share/" (a UNC path) * @"//path/file" produces @"//path" (an absolute Unix path) * * NB. Do not use this method to modify strings other than filesystem * paths as the behavior in such cases is undefined ... for instance * the string may have repeated slashes or slash-dot-slash sequences * removed. */ - (NSString*) stringByDeletingLastPathComponent; /** * Returns a new string with the path extension removed from the receiver.
* Strips any trailing path separators before checking for the extension * separator.
* NB. This method does not consider a string which contains nothing * between the root part and the extension separator ('.') to be a path * extension. This mirrors the behavior of the -stringByAppendingPathExtension: * method. * * @"file.ext" produces @"file" * @"/file.ext" produces @"/file" * @"/file.ext/" produces @"/file" (trailing path separators are ignored) * @"/file..ext" produces @"/file." * @"/file." produces @"/file" * @"/.ext" produces @"/.ext" (there is no file to strip from) * @".ext" produces @".ext" (there is no file to strip from) * * NB. Do not use this method to modify strings other than filesystem * paths as the behavior in such cases is undefined ... for instance * the string may have repeated slashes or slash-dot-slash sequences * removed. */ - (NSString*) stringByDeletingPathExtension; /** * Returns a string created by expanding the initial tilde ('~') and any * following username to be the home directory of the current user or the * named user.
* Returns the receiver or an immutable copy if it was not possible to * expand it. */ - (NSString*) stringByExpandingTildeInPath; /** * First calls -stringByExpandingTildeInPath if necessary.
* Replaces path string by one in which path components representing symbolic * links have been replaced by their referents.
* Removes a leading '/private' if the result is valid.
* If links cannot be resolved, returns an unmodified copy of the receiver. */ - (NSString*) stringByResolvingSymlinksInPath; /** * Returns a standardised form of the receiver, with unnecessary parts * removed, tilde characters expanded, and symbolic links resolved * where possible.
* NB. Refers to the local filesystem to resolve symbolic links in * absolute paths, and to expand tildes ... so this can't be used for * general path manipulation.
* If the string is an invalid path, the unmodified receiver is returned.
*

* Uses -stringByExpandingTildeInPath to expand tilde expressions.
* Simplifies '//' and '/./' sequences and removes trailing '/' or '.'.
*

*

* For absolute paths, uses -stringByResolvingSymlinksInPath to resolve * any links, then gets rid of '/../' sequences and removes any '/private' * prefix. *

*/ - (NSString*) stringByStandardizingPath; // for methods working with decomposed strings - (int) _baseLength; #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) /** * Concatenates the path components in the array and returns the result.
* This method does not remove empty path components, but does recognize an * empty initial component as a special case meaning that the string * returned will begin with a slash. */ + (NSString*) pathWithComponents: (NSArray*)components; /** * Returns YES if the receiver represents an absolute path ...
* Returns NO otherwise.
* An absolute path in unix mode is one which begins * with a slash or tilde.
* In windows mode a drive specification (eg C:) followed by a slash or * backslash, is an absolute path, as is any path beginning with a tilde.
* In any mode a UNC path (//host/share...) is always absolute.
* In the default gnustep path handling mode, * the rules are the same as for windows, * except that a path whose root is a slash denotes an absolute path * when running on unix and a relative path when running under windows. */ - (BOOL) isAbsolutePath; /** * Returns the path components of the receiver separated into an array.
* If the receiver begins with a root sequence such as the path separator * character (or a drive specification in windows) then that is used as the * first element in the array.
* Empty components are removed.
* If a trailing path separator (which was not part of the root) was present, * it is added as the last element in the array. */ - (NSArray*) pathComponents; /** * Returns an array of strings made by appending the values in paths * to the receiver. */ - (NSArray*) stringsByAppendingPaths: (NSArray*)paths; + (NSString*) localizedStringWithFormat: (NSString*)format, ... NS_FORMAT_FUNCTION(1,2); + (instancetype) stringWithString: (NSString*)aString; + (instancetype) stringWithContentsOfURL: (NSURL*)url; + (instancetype) stringWithUTF8String: (const char*)bytes; - (instancetype) initWithFormat: (NSString*)format locale: (NSDictionary*)locale, ... NS_FORMAT_FUNCTION(1,3); - (instancetype) initWithFormat: (NSString*)format locale: (NSDictionary*)locale arguments: (va_list)argList NS_FORMAT_FUNCTION(1,0); - (instancetype) initWithUTF8String: (const char *)bytes; - (instancetype) initWithContentsOfURL: (NSURL*)url; - (NSString*) substringWithRange: (NSRange)aRange; - (NSComparisonResult) caseInsensitiveCompare: (NSString*)aString; - (NSComparisonResult) compare: (NSString*)string options: (NSUInteger)mask range: (NSRange)compareRange locale: (id)locale; - (NSComparisonResult) localizedCompare: (NSString *)string; - (NSComparisonResult) localizedCaseInsensitiveCompare: (NSString *)string; - (BOOL) writeToFile: (NSString*)filename atomically: (BOOL)useAuxiliaryFile; - (BOOL) writeToURL: (NSURL*)url atomically: (BOOL)atomically; - (double) doubleValue; + (NSStringEncoding*) availableStringEncodings; + (NSString*) localizedNameOfStringEncoding: (NSStringEncoding)encoding; - (void) getLineStart: (NSUInteger *)startIndex end: (NSUInteger *)lineEndIndex contentsEnd: (NSUInteger *)contentsEndIndex forRange: (NSRange)aRange; - (NSRange) lineRangeForRange: (NSRange)aRange; - (const char*) lossyCString; - (NSString*) stringByAddingPercentEscapesUsingEncoding: (NSStringEncoding)e; - (NSString*) stringByPaddingToLength: (NSUInteger)newLength withString: (NSString*)padString startingAtIndex: (NSUInteger)padIndex; - (NSString*) stringByReplacingPercentEscapesUsingEncoding: (NSStringEncoding)e; - (NSString*) stringByTrimmingCharactersInSet: (NSCharacterSet*)aSet; - (const char *)UTF8String; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_9,GS_API_LATEST) - (NSString *) stringByAddingPercentEncodingWithAllowedCharacters: (NSCharacterSet *)aSet; - (NSString *) stringByRemovingPercentEncoding; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_3,GS_API_LATEST) /** Not implemented */ - (void) getParagraphStart: (NSUInteger *)startIndex end: (NSUInteger *)parEndIndex contentsEnd: (NSUInteger *)contentsEndIndex forRange: (NSRange)range; /** Not implemented */ - (NSRange) paragraphRangeForRange: (NSRange)range; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_5,GS_API_LATEST) /** * Returns YES when scanning the receiver's text from left to right * finds an initial digit in the range 1-9 or a letter in the set * ('Y', 'y', 'T', 't').
* Any trailing characters are ignored.
* Any leading whitespace or zeros or signs are also ignored.
* Returns NO if the above conditions are not met. */ - (BOOL) boolValue; - (GS_GENERIC_CLASS(NSArray, NSString*) *) componentsSeparatedByCharactersInSet: (NSCharacterSet *)separator; - (NSInteger) integerValue; - (long long) longLongValue; /** Not implemented */ - (NSRange) rangeOfComposedCharacterSequencesForRange: (NSRange)range; /** Not implemented */ - (NSRange) rangeOfString: (NSString *)aString options: (NSStringCompareOptions)mask range: (NSRange)searchRange locale: (NSLocale *)locale; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_10,GS_API_LATEST) /** * Returns YES if the receiver contains string, otherwise, NO. */ - (BOOL) containsString: (NSString *)string; #endif #if OS_API_VERSION(GS_API_NONE, GS_API_NONE) + (Class) constantStringClass; #endif /* GS_API_NONE */ @end GS_EXPORT_CLASS @interface NSMutableString : NSString // Creating Temporary Strings + (instancetype) string; + (instancetype) stringWithCharacters: (const unichar*)characters length: (NSUInteger)length; + (instancetype) stringWithCString: (const char*)byteString length: (NSUInteger)length; + (instancetype) stringWithCString: (const char*)byteString; + (instancetype) stringWithFormat: (NSString*)format, ... NS_FORMAT_FUNCTION(1,2); + (instancetype) stringWithContentsOfFile: (NSString*)path; + (NSMutableString*) stringWithCapacity: (NSUInteger)capacity; // Initializing Newly Allocated Strings - (instancetype) initWithCapacity: (NSUInteger)capacity; // Modify A String - (void) appendFormat: (NSString*)format, ... NS_FORMAT_FUNCTION(1,2); - (void) appendString: (NSString*)aString; - (void) deleteCharactersInRange: (NSRange)range; - (void) insertString: (NSString*)aString atIndex: (NSUInteger)loc; - (void) replaceCharactersInRange: (NSRange)range withString: (NSString*)aString; - (NSUInteger) replaceOccurrencesOfString: (NSString*)replace withString: (NSString*)by options: (NSUInteger)opts range: (NSRange)searchRange; - (void) setString: (NSString*)aString; @end #ifdef __OBJC_GNUSTEP_RUNTIME_ABI__ # if __OBJC_GNUSTEP_RUNTIME_ABI__ >= 20 # define GNUSTEP_NEW_STRING_ABI # endif #endif /** *

The NXConstantString class is used to hold constant 8-bit character * string objects produced by the compiler where it sees @"..." in the * source. The compiler generates the instances of this class - which * has three instance variables -

* * a pointer to the class (this is the sole ivar of NSObject) * a pointer to the 8-bit data * the length of the string * *

In older versions of the compiler, the isa variable is always set to * the NXConstantString class. In newer versions a compiler option was * added for GNUstep, to permit the isa variable to be set to another * class, and GNUstep uses this to avoid conflicts with the default * implementation of NXConstantString in the ObjC runtime library (the * preprocessor is used to change all occurrences of NXConstantString * in the source code to NSConstantString).

*

Since GNUstep will generally use the GNUstep extension to the * compiler, you should never refer to the constant string class by * name, but should use the [NSString+constantStringClass] method to * get the actual class being used for constant strings.

* What follows is a dummy declaration of the class to keep the compiler * happy. */ GS_EXPORT_CLASS @interface NXConstantString : NSString { @public #ifdef GNUSTEP_NEW_STRING_ABI /** * Flags. The low 16 bits are reserved for the compiler, the top 16 for use * by the Foundation Framework. Currently only the low 2 bits are used, to * indicate the encoding of the string, with the following values: * * 0. ASCII (UTF-8 using only 7-bit characters) * 1. UTF-8 * 2. UTF-16 * 3. UTF-32 * */ uint32_t flags; /** * The number of characters (UTF-16 code units) in the string. */ uint32_t nxcslen; /** * The number of bytes in the string. For fixed-length encodings, this is a * fixed multiple of nxcslen, but for UTF-8 it can be different. */ uint32_t size; /** * Hash value. */ uint32_t hash; /** * Pointer to the byte data of the string. Note that `char*` is the correct * type only if the low two bits of the flags indicate that this is an ASCII * or UTF-8 string, otherwise it is a pointer to 16- or 32-bit characters in * native byte order. */ const char * const nxcsptr; #else const char * const nxcsptr; const unsigned int nxcslen; #endif } @end #ifdef NeXT_RUNTIME /** For internal use with NeXT runtime; needed, until Apple Radar 2870817 is fixed. */ extern struct objc_class _NSConstantStringClassReference; #endif #if defined(__cplusplus) } #endif #if !NO_GNUSTEP && !defined(GNUSTEP_BASE_INTERNAL) #import #import #endif #endif /* __NSString_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSTask.h000066400000000000000000000106471435650067400212170ustar00rootroot00000000000000/* Interface for NSTask for GNUstep Copyright (C) 1998 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 1998 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSTask_h_GNUSTEP_BASE_INCLUDE #define __NSTask_h_GNUSTEP_BASE_INCLUDE #import #import #import #import #import #import #if defined(__cplusplus) extern "C" { #endif DEFINE_BLOCK_TYPE_NO_ARGS(GSTaskTerminationHandler, void); @class NSThread; #if OS_API_VERSION(MAC_OS_X_VERSION_10_5,GS_API_LATEST) enum { NSTaskTerminationReasonExit = 1, NSTaskTerminationReasonUncaughtSignal = 2 }; typedef NSInteger NSTaskTerminationReason; #endif GS_EXPORT_CLASS @interface NSTask : NSObject { #if GS_EXPOSE(NSTask) @protected NSString *_currentDirectoryPath; NSString *_launchPath; NSArray *_arguments; NSDictionary *_environment; id _standardError; id _standardInput; id _standardOutput; int _taskId; int _terminationStatus; BOOL _hasLaunched; BOOL _hasTerminated; BOOL _hasCollected; BOOL _hasNotified; NSThread *_launchingThread; NSTaskTerminationReason _terminationReason; GSTaskTerminationHandler _handler; #endif #if GS_NONFRAGILE #else /* Pointer to private additional data used to avoid breaking ABI * when we don't have the non-fragile ABI available. * Use this mechanism rather than changing the instance variable * layout (see Source/GSInternal.h for details). */ @private id _internal GS_UNUSED_IVAR; #endif } + (NSTask*) launchedTaskWithLaunchPath: (NSString*)path arguments: (NSArray*)args; /* * Querying task parameters. */ - (NSArray*) arguments; - (NSString*) currentDirectoryPath; - (NSDictionary*) environment; - (NSString*) launchPath; - (id) standardError; - (id) standardInput; - (id) standardOutput; /* * Setting task parameters. */ - (void) setArguments: (NSArray*)args; - (void) setCurrentDirectoryPath: (NSString*)path; - (void) setEnvironment: (NSDictionary*)env; - (void) setLaunchPath: (NSString*)path; - (void) setStandardError: (id)hdl; - (void) setStandardInput: (id)hdl; - (void) setStandardOutput: (id)hdl; /* * Obtaining task state */ - (BOOL) isRunning; #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) - (int) processIdentifier; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_5,GS_API_LATEST) - (NSTaskTerminationReason) terminationReason; #endif - (int) terminationStatus; /* * Handling a task. */ - (void) interrupt; - (void) launch; #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) - (BOOL) resume; - (BOOL) suspend; #endif - (void) terminate; - (void) waitUntilExit; #if OS_API_VERSION(GS_API_NONE, GS_API_NONE) - (BOOL) usePseudoTerminal; - (NSString*) validatedLaunchPath; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_13, GS_API_LATEST) + (NSTask *) launchedTaskWithExecutableURL: (NSURL *)url arguments: (NSArray *)arguments error: (NSError **)error terminationHandler: (GSTaskTerminationHandler)terminationHandler; - (BOOL) launchAndReturnError: (NSError **)error; - (NSURL *) executableURL; - (NSURL *) currentDirectoryURL; #endif @end /** * Notification posted when an [NSTask] terminates, either due to the * subprocess ending or the [NSTask-terminate] method explicitly being * called. */ GS_EXPORT NSString* const NSTaskDidTerminateNotification; #if defined(__cplusplus) } #endif #if !NO_GNUSTEP && !defined(GNUSTEP_BASE_INTERNAL) #import #endif #endif /* __NSTask_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSTextCheckingResult.h000066400000000000000000000070361435650067400240720ustar00rootroot00000000000000/* Copyright (C) 2011 Free Software Foundation, Inc. This file is part of the GNUstep Library. 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 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 USA. */ #import "NSObject.h" #import "NSGeometry.h" @class NSArray; @class NSDate; @class NSDictionary; @class NSOrthography; @class NSRegularExpression; @class NSString; @class NSTimeZone; @class NSURL; typedef uint64_t NSTextCheckingType; enum { NSTextCheckingTypeOrthography = 1ULL << 0, NSTextCheckingTypeSpelling = 1ULL << 1, NSTextCheckingTypeGrammar = 1ULL << 2, NSTextCheckingTypeDate = 1ULL << 3, NSTextCheckingTypeAddress = 1ULL << 4, NSTextCheckingTypeLink = 1ULL << 5, NSTextCheckingTypeQuote = 1ULL << 6, NSTextCheckingTypeDash = 1ULL << 7, NSTextCheckingTypeReplacement = 1ULL << 8, NSTextCheckingTypeCorrection = 1ULL << 9, #if OS_API_VERSION(MAC_OS_X_VERSION_10_7, GS_API_LATEST) NSTextCheckingTypeRegularExpression = 1ULL << 10, NSTextCheckingTypePhoneNumber = 1ULL << 11, NSTextCheckingTypeTransitInformation = 1ULL << 12 #endif }; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) typedef uint64_t NSTextCheckingTypes; // a combination of types enum { NSTextCheckingAllSystemTypes = 0xffffffffULL, NSTextCheckingAllCustomTypes = 0xffffffffULL << 32, NSTextCheckingAllTypes = (NSTextCheckingAllSystemTypes | NSTextCheckingAllCustomTypes) }; #endif /** * NSTextCheckingResult is an abstract class encapsulating the result of some * operation that checks */ GS_EXPORT_CLASS @interface NSTextCheckingResult : NSObject #if GS_HAS_DECLARED_PROPERTIES @property(readonly) NSDictionary *addressComponents; @property(readonly) NSDictionary *components; @property(readonly) NSDate *date; @property(readonly) NSTimeInterval duration; @property(readonly) NSArray *grammarDetails; @property(readonly) NSUInteger numberOfRanges; @property(readonly) NSOrthography *orthography; @property(readonly) NSString *phoneNumber; @property(readonly) NSRange range; @property(readonly) NSRegularExpression *regularExpression; @property(readonly) NSString *replacementString; @property(readonly) NSTextCheckingType resultType; @property(readonly) NSTimeZone *timeZone; @property(readonly) NSURL *URL; #else - (NSDictionary*) addressComponents; - (NSDictionary*) components; - (NSDate*) date; - (NSTimeInterval) duration; - (NSArray*) grammarDetails; - (NSUInteger) numberOfRanges; - (NSOrthography*) orthography; - (NSString*) phoneNumber; - (NSRange) range; - (NSRegularExpression*) regularExpression; - (NSString*) replacementString; - (NSTextCheckingType) resultType; - (NSTimeZone*) timeZone; - (NSURL*) URL; #endif + (NSTextCheckingResult*) regularExpressionCheckingResultWithRanges: (NSRangePointer)ranges count: (NSUInteger)count regularExpression: (NSRegularExpression*)regularExpression; - (NSRange) rangeAtIndex: (NSUInteger)idx; - (NSTextCheckingResult*) resultByAdjustingRangesWithOffset: (NSInteger)offset; @end gnustep-base-1.29.0/Headers/Foundation/NSThread.h000066400000000000000000000363271435650067400215270ustar00rootroot00000000000000/* Control of executable units within a shared virtual memory space Copyright (C) 1996 Free Software Foundation, Inc. Original Author: Scott Christley Rewritten by: Andrew McCallum Created: 1996 This file is part of the GNUstep Objective-C Library. 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 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 USA. */ #ifndef __NSThread_h_GNUSTEP_BASE_INCLUDE #define __NSThread_h_GNUSTEP_BASE_INCLUDE #import #if defined(GNUSTEP_BASE_INTERNAL) #import "Foundation/NSAutoreleasePool.h" // for struct autorelease_thread_vars #import "Foundation/NSException.h" // for NSHandler #else #import #import #endif @class NSArray; @class NSDate; @class NSMutableDictionary; #if defined(__cplusplus) extern "C" { #endif /** * This class encapsulates OpenStep threading. See [NSLock] and its * subclasses for handling synchronisation between threads.
* Each process begins with a main thread and additional threads can * be created using NSThread. The GNUstep implementation of OpenStep * has been carefully designed so that the internals of the base * library do not use threading (except for methods which explicitly * deal with threads of course) so that you can write applications * without threading. Non-threaded applications are more efficient * (no locking is required) and are easier to debug during development. */ GS_EXPORT_CLASS @interface NSThread : NSObject { #if GS_EXPOSE(NSThread) @public id _target; id _arg; SEL _selector; NSString *_name; NSUInteger _stackSize; BOOL _cancelled; BOOL _active; BOOL _finished; NSHandler *_exception_handler; // Not retained. NSMutableDictionary *_thread_dictionary; struct autorelease_thread_vars _autorelease_vars; id _gcontext; void *_runLoopInfo; // Per-thread runloop related info. #endif #if GS_NONFRAGILE # if defined(GS_NSThread_IVARS) @public GS_NSThread_IVARS; # endif #else /* Pointer to private additional data used to avoid breaking ABI * when we don't have the non-fragile ABI available. * Use this mechanism rather than changing the instance variable * layout (see Source/GSInternal.h for details). */ @private id _internal GS_UNUSED_IVAR; #endif } /** *

* Returns the NSThread object corresponding to the current thread. *

*

* NB. In GNUstep the library internals use the GSCurrentThread() * function as a more efficient mechanism for doing this job - so * you cannot use a category to override this method and expect * the library internals to use your implementation. *

*/ + (NSThread*) currentThread; /** *

Create a new thread - use this method rather than alloc-init. The new * thread will begin executing the message given by aSelector, aTarget, and * anArgument. This should have no return value, and must set up an * autorelease pool if retain/release memory management is used. It should * free this pool before it finishes execution.

*/ + (void) detachNewThreadSelector: (SEL)aSelector toTarget: (id)aTarget withObject: (id)anArgument; /** * Terminates the current thread.
* Normally you don't need to call this method explicitly, * since exiting the method with which the thread was detached * causes this method to be called automatically. */ + (void) exit; /** * Returns a flag to say whether the application is multi-threaded or not.
* An application is considered to be multi-threaded if any thread other * than the main thread has been started, irrespective of whether that * thread has since terminated.
* NB. This method returns YES if called within a handler processing * NSWillBecomeMultiThreadedNotification */ + (BOOL) isMultiThreaded; + (void) sleepUntilDate: (NSDate*)date; - (NSMutableDictionary*) threadDictionary; #if OS_API_VERSION(MAC_OS_X_VERSION_10_2,GS_API_LATEST) \ && GS_API_VERSION( 10200,GS_API_LATEST) + (BOOL) setThreadPriority: (double)pri; + (double) threadPriority; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_5,GS_API_LATEST) \ && GS_API_VERSION( 11501,GS_API_LATEST) /** Returns an array of the call stack return addresses. */ + (NSArray*) callStackReturnAddresses; /** Returns a boolean indicating whether this thread is the main thread of * the process. */ + (BOOL) isMainThread; /** Returns the main thread of the process. */ + (NSThread*) mainThread; /** Suspends execution of the process for the specified period. */ + (void) sleepForTimeInterval: (NSTimeInterval)ti; /** Cancels the receiving thread. */ - (void) cancel; /** */ - (id) init; /** Initialises the receiver to send the message aSelector to the object aTarget * with the argument anArgument (which may be nil).
* The arguments aTarget and aSelector are retained while the thread is * running. */ - (id) initWithTarget: (id)aTarget selector: (SEL)aSelector object: (id)anArgument; /** Returns a boolean indicating whether the receiving * thread has been cancelled. */ - (BOOL) isCancelled; /** Returns a boolean indicating whether the receiving * thread has been started (and has not yet finished or been cancelled). */ - (BOOL) isExecuting; /** Returns a boolean indicating whether the receiving * thread has completed executing. */ - (BOOL) isFinished; /** Returns a boolean indicating whether this thread is the main thread of * the process. */ - (BOOL) isMainThread; /** FIXME ... what does this do? */ - (void) main; /** Returns the name of the receiver. */ - (NSString*) name; /** Sets the name of the receiver. */ - (void) setName: (NSString*)aName; /** Sets the size of the receiver's stack. */ - (void) setStackSize: (NSUInteger)stackSize; /** Returns the size of the receiver's stack. */ - (NSUInteger) stackSize; /** Starts the receiver executing. */ - (void) start; #endif @end /** * Extra methods to permit messages to be sent to an object such that they * are executed in another thread.
* The main thread is the thread in which the GNUstep system is started, * and where the GNUstep gui is used, it is the thread in which gui * drawing operations must be performed. */ @interface NSObject(NSThreadPerformAdditions) #if GS_API_VERSION(MAC_OS_X_VERSION_10_2, GS_API_LATEST) /** *

This method performs aSelector on the receiver, passing anObject as * an argument, but does so in the main thread of the program. The receiver * and anObject are both retained until the method is performed. *

*

The selector is performed when the runloop of the main thread next * runs in one of the modes specified in anArray.
* Where this method has been called more than once before the runloop * of the main thread runs in the required mode, the order in which the * operations in the main thread is done is the same as that in which * they were added using this method. *

*

If there are no modes in anArray, * the method has no effect and simply returns immediately. *

*

The argument aFlag specifies whether the method should wait until * the selector has been performed before returning.
* NB. This method does not cause the runloop of * the main thread to be run ... so if the runloop is not executed by some * code in the main thread, the thread waiting for the perform to complete * will block forever. *

*

As a special case, if aFlag == YES and the current thread is the main * thread, the modes array is ignored and the selector is performed immediately. * This behavior is necessary to avoid the main thread being blocked by * waiting for a perform which will never happen because the runloop is * not executing. *

*/ - (void) performSelectorOnMainThread: (SEL)aSelector withObject: (id)anObject waitUntilDone: (BOOL)aFlag modes: (NSArray*)anArray; /** * Invokes -performSelectorOnMainThread:withObject:waitUntilDone:modes: * using the supplied arguments and an array containing common modes.
* These modes consist of NSRunLoopMode, NSConnectionReplyMode, and if * in an application, the NSApplication modes. */ - (void) performSelectorOnMainThread: (SEL)aSelector withObject: (id)anObject waitUntilDone: (BOOL)aFlag; #endif #if GS_API_VERSION(MAC_OS_X_VERSION_10_5, GS_API_LATEST) /** *

This method performs aSelector on the receiver, passing anObject as * an argument, but does so in the specified thread. The receiver * and anObject are both retained until the method is performed. *

*

The selector is performed when the runloop of aThread next * runs in one of the modes specified in anArray.
* Where this method has been called more than once before the runloop * of the thread runs in the required mode, the order in which the * operations in the thread is done is the same as that in which * they were added using this method. *

*

If there are no modes in anArray, * the method has no effect and simply returns immediately. *

*

The argument aFlag specifies whether the method should wait until * the selector has been performed before returning.
* NB. This method does not cause the runloop of * aThread to be run ... so if the runloop is not executed by some * code in aThread, the thread waiting for the perform to complete * will block forever. *

*

As a special case, if aFlag == YES and the current thread is aThread, * the modes array is ignored and the selector is performed immediately. * This behavior is necessary to avoid the current thread being blocked by * waiting for a perform which will never happen because the runloop is * not executing. *

*/ - (void) performSelector: (SEL)aSelector onThread: (NSThread*)aThread withObject: (id)anObject waitUntilDone: (BOOL)aFlag modes: (NSArray*)anArray; /** * Invokes -performSelector:onThread:withObject:waitUntilDone:modes: * using the supplied arguments and an array containing common modes.
* These modes consist of NSRunLoopMode, NSConnectionreplyMode, and if * in an application, the NSApplication modes. */ - (void) performSelector: (SEL)aSelector onThread: (NSThread*)aThread withObject: (id)anObject waitUntilDone: (BOOL)aFlag; /** * Creates and runs a new background thread sending aSelector to the receiver * and passing anObject (which may be nil) as the argument. */ - (void) performSelectorInBackground: (SEL)aSelector withObject: (id)anObject; #endif @end @interface NSThread (CallStackSymbols) #if GS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) /** Returns an array of NSString objects representing the current stack * in an implementation-defined format. May return an empty array if * this feature is not available. */ + (NSArray *) callStackSymbols; #endif @end #if GS_API_VERSION(GS_API_NONE, GS_API_NONE) /* * Don't use the following functions unless you really know what you are * doing ! * The following functions are low-levelish and special. * They are meant to make it possible to run GNUstep code in threads * created in completely different environment, eg inside a JVM. * * If you use them, make sure you initialize the NSThread class inside * (what you consider to be your) main thread, before registering any * other thread. To initialize NSThread, simply call GSCurrentThread * (). The main thread will not need to be registered. */ /* * Register an external thread (created using your OS thread interface * directly) to GNUstep. This means that it creates a NSThread object * corresponding to the current thread, and sets things up so that you * can run GNUstep code inside the thread. If the thread was not * known to GNUstep, this function registers it, and returns YES. If * the thread was already known to GNUstep, this function does nothing * and returns NO. */ GS_EXPORT BOOL GSRegisterCurrentThread (void); /* * Unregister the current thread from GNUstep. You must only * unregister threads which have been register using * registerCurrentThread (). This method is basically the same as * `+exit', but does not exit the thread - just destroys all objects * associated with the thread. Warning: using any GNUstep code after * this method call is not safe. Posts an NSThreadWillExit * notification. */ GS_EXPORT void GSUnregisterCurrentThread (void); /* Internal API used by traced locks. */ @interface NSThread (GSLockInfo) /* Removes the mutex (either as the one we are waiting for or as a held mutex. * For internal use only ... do not call this method.
*/ - (NSString *) mutexDrop: (id)mutex; /* Converts a waiting mutex to a held one (if mutex is nil), or increments * the recursion count of a mutex already held by this thread.
* For internal use only ... do not call this method. */ - (NSString *) mutexHold: (id)mutex; /* Register the mutex that the thread is waiting for.
* For internal use only ... do not call this method. */ - (NSString *) mutexWait: (id)mutex; @end #endif /* * Notification Strings. * NSBecomingMultiThreaded and NSThreadExiting are defined for strict * OpenStep compatibility, the actual notification names are the more * modern OPENSTEP/MacOS versions. */ /** * Notification posted the first time a new [NSThread] is created or a * separate thread from another library is registered in an application. * (The initial thread that a program starts with does not * post this notification.) Before such a notification has been posted you * can assume the application is in single-threaded mode and locks are not * necessary. Afterwards multiple threads may be running. */ GS_EXPORT NSString* const NSWillBecomeMultiThreadedNotification; #define NSBecomingMultiThreaded NSWillBecomeMultiThreadedNotification /** * Notification posted when an [NSThread] instance receives an exit message, * or an external thread has been deregistered. */ GS_EXPORT NSString* const NSThreadWillExitNotification; #define NSThreadExiting NSThreadWillExitNotification #if GS_API_VERSION(GS_API_NONE, GS_API_NONE) /** * Notification posted whenever a new thread is started up. This is a * GNUstep extension. */ GS_EXPORT NSString* const NSThreadDidStartNotification; #endif #if !NO_GNUSTEP # if defined(GNUSTEP_BASE_INTERNAL) # import "GNUstepBase/NSThread+GNUstepBase.h" # else # import # endif #endif #if defined(__cplusplus) } #endif #endif /* __NSThread_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSTimeZone.h000066400000000000000000000076721435650067400220530ustar00rootroot00000000000000/* Interface for NSTimeZone for GNUStep Copyright (C) 1994, 1996, 1999 Free Software Foundation, Inc. This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSTimeZone_h_GNUSTEP_BASE_INCLUDE #define __NSTimeZone_h_GNUSTEP_BASE_INCLUDE #import #import #if defined(__cplusplus) extern "C" { #endif @class NSArray; @class NSDate; @class NSDictionary; @class NSLocale; @class NSString; #if OS_API_VERSION(MAC_OS_X_VERSION_10_5,GS_API_LATEST) enum { NSTimeZoneNameStyleStandard, NSTimeZoneNameStyleShortStandard, NSTimeZoneNameStyleDaylightSaving, NSTimeZoneNameStyleShortDaylightSaving }; typedef NSInteger NSTimeZoneNameStyle; GS_EXPORT NSString * const NSSystemTimeZoneDidChangeNotification; #endif GS_EXPORT_CLASS @interface NSTimeZone : NSObject // Creating and Initializing an NSTimeZone + (NSTimeZone*) localTimeZone; + (NSTimeZone*) timeZoneForSecondsFromGMT: (NSInteger)seconds; + (NSTimeZone*) timeZoneWithName: (NSString*)aTimeZoneName; // Managing Time Zones + (void) setDefaultTimeZone: (NSTimeZone*)aTimeZone; // Getting Time Zone Information + (NSDictionary*) abbreviationDictionary; + (NSArray*) knownTimeZoneNames; // Getting Arrays of Time Zones + (NSArray*) timeZoneArray; - (NSArray*) timeZoneDetailArray; #if OS_API_VERSION(GS_API_NONE, GS_API_LATEST) /* Returns an dictionary that maps abbreviations to the array containing all the time zone names that use the abbreviation. */ + (NSDictionary*) abbreviationMap; #endif #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) + (void) resetSystemTimeZone; + (NSTimeZone*) systemTimeZone; + (NSTimeZone*) timeZoneWithName: (NSString*)name data: (NSData*)data; - (NSString*) abbreviation; - (NSString*) abbreviationForDate: (NSDate*)aDate; - (NSData*) data; - (id) initWithName: (NSString*)name; - (id) initWithName: (NSString*)name data: (NSData*)data; - (BOOL) isDaylightSavingTime; - (BOOL) isDaylightSavingTimeForDate: (NSDate*)aDate; - (BOOL) isEqualToTimeZone: (NSTimeZone*)aTimeZone; - (NSString*) name; - (NSInteger) secondsFromGMT; - (NSInteger) secondsFromGMTForDate: (NSDate*)aDate; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_5,GS_API_LATEST) - (NSTimeInterval) daylightSavingTimeOffsetForDate: (NSDate*)aDate; - (NSDate*) nextDaylightSavingTimeTransitionAfterDate: (NSDate*)aDate; - (NSTimeInterval) daylightSavingTimeOffset; - (NSDate*) nextDaylightSavingTimeTransition; - (NSString*) localizedName: (NSTimeZoneNameStyle)style locale: (NSLocale*)locale; #endif #if OS_API_VERSION(GS_API_OPENSTEP, GS_API_MACOSX) - (NSTimeZoneDetail*) timeZoneDetailForDate: (NSDate*)date; - (NSString*) timeZoneName; #endif /* * The next two methods are a problem ... they are present in both * OpenStep and MacOS-X, but return different types! * We resort to the MaxOS-X version. */ + (NSTimeZone*) defaultTimeZone; + (NSTimeZone*) timeZoneWithAbbreviation: (NSString*)abbreviation; @end #if OS_API_VERSION(GS_API_OPENSTEP, GS_API_MACOSX) GS_EXPORT_CLASS @interface NSTimeZoneDetail : NSTimeZone - (BOOL) isDaylightSavingTimeZone; - (NSString*) timeZoneAbbreviation; - (NSInteger) timeZoneSecondsFromGMT; @end #endif #if defined(__cplusplus) } #endif #endif /* __NSTimeZone_h_GNUSTEP_BASE_INCLUDE*/ gnustep-base-1.29.0/Headers/Foundation/NSTimer.h000066400000000000000000000076221435650067400213740ustar00rootroot00000000000000/* Declarations for NSTimer for GNUStep Copyright (C) 1995, 1996, 1999 Free Software Foundation, Inc. Written by: Andrew Kachites McCallum Date: 1995 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSTimer_h_GNUSTEP_BASE_INCLUDE #define __NSTimer_h_GNUSTEP_BASE_INCLUDE #import #import @class NSTimer; DEFINE_BLOCK_TYPE(GSTimerBlock, void, NSTimer*); #if defined(__cplusplus) extern "C" { #endif /* * NB. NSRunLoop is optimised using a hack that knows about the * class layout for the fire date and invialidation flag in NSTimer. * These MUST remain the first two items in the class. * Other classes must not attempt to use instance variables as * they are subject to change. */ GS_EXPORT_CLASS @interface NSTimer : NSObject { #if GS_EXPOSE(NSTimer) @public NSDate *_date; /* Must be 1st - for NSRunLoop optimisation */ BOOL _invalidated; /* Must be 2nd - for NSRunLoop optimisation */ BOOL _repeats; NSTimeInterval _interval; id _target; SEL _selector; id _info; GSTimerBlock _block; #endif #if GS_NONFRAGILE #else /* Pointer to private additional data used to avoid breaking ABI * when we don't have the non-fragile ABI available. * Use this mechanism rather than changing the instance variable * layout (see Source/GSInternal.h for details). */ @private id _internal GS_UNUSED_IVAR; #endif } /* Creating timer objects. */ + (NSTimer*) scheduledTimerWithTimeInterval: (NSTimeInterval)ti invocation: (NSInvocation*)invocation repeats: (BOOL)f; + (NSTimer*) scheduledTimerWithTimeInterval: (NSTimeInterval)ti target: (id)object selector: (SEL)selector userInfo: (id)info repeats: (BOOL)f; + (NSTimer *) scheduledTimerWithTimeInterval: (NSTimeInterval)ti repeats: (BOOL)f block: (GSTimerBlock)block; + (NSTimer*) timerWithTimeInterval: (NSTimeInterval)ti invocation: (NSInvocation*)invocation repeats: (BOOL)f; + (NSTimer*) timerWithTimeInterval: (NSTimeInterval)ti target: (id)object selector: (SEL)selector userInfo: (id)info repeats: (BOOL)f; + (NSTimer*) timerWithTimeInterval: (NSTimeInterval)ti repeats: (BOOL)f block: (GSTimerBlock)block; - (void) fire; - (NSDate*) fireDate; - (void) invalidate; - (id) userInfo; #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) - (BOOL) isValid; - (NSTimeInterval) timeInterval; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_2, GS_API_LATEST) - (id) initWithFireDate: (NSDate*)fd interval: (NSTimeInterval)ti target: (id)object selector: (SEL)selector userInfo: (id)info repeats: (BOOL)f; - (void) setFireDate: (NSDate*)fireDate; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_12, GS_API_LATEST) - (instancetype) initWithFireDate: (NSDate *)date interval: (NSTimeInterval)interval repeats: (BOOL)repeats block: (GSTimerBlock)block; #endif @end #if defined(__cplusplus) } #endif #endif /* __NSTimer_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSURL.h000066400000000000000000000655341435650067400207640ustar00rootroot00000000000000/* NSURL.h - Class NSURL Copyright (C) 1999 Free Software Foundation, Inc. Written by: Manuel Guesdon Date: Jan 1999 This file is part of the GNUstep Library. 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 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 USA. */ #ifndef __NSURL_h_GNUSTEP_BASE_INCLUDE #define __NSURL_h_GNUSTEP_BASE_INCLUDE #import #import #import #if defined(__cplusplus) extern "C" { #endif #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) @class NSError; @class NSNumber; @class NSString; @class NSDictionary; @class NSArray; /** * URL scheme constant for use with [NSURL-initWithScheme:host:path:]. */ GS_EXPORT NSString* const NSURLFileScheme; /** URL Bookmark Resolution Options **/ #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) typedef NSUInteger NSURLBookmarkResolutionOptions; enum { NSURLBookmarkResolutionWithoutUI = (1 << 8), NSURLBookmarkResolutionWithoutMounting = (1 << 9), #if OS_API_VERSION(MAC_OS_X_VERSION_10_7, GS_API_LATEST) NSURLBookmarkResolutionWithSecurityScope = (1 << 10) #endif }; #endif /** * This class permits manipulation of URLs and the resources to which they * refer. They can be used to represent absolute URLs or relative URLs * which are based upon an absolute URL. The relevant RFCs describing * how a URL is formatted, and what is legal in a URL are - * 1808, 1738, and 2396.
* Handling of the underlying resources is carried out by NSURLHandle * objects, but NSURL provides a simplified API wrapping these objects. */ GS_EXPORT_CLASS @interface NSURL: NSObject { #if GS_EXPOSE(NSURL) @private NSString *_urlString; NSURL *_baseURL; void *_clients; void *_data; #endif } /** * Create and return a file URL with the supplied path.
* The value of aPath must be a valid filesystem path.
* Calls -initFileURLWithPath: which escapes characters in the * path where necessary. */ + (instancetype) fileURLWithPath: (NSString*)aPath; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6,GS_API_LATEST) /** Creates a file URL using a path built from components. */ + (instancetype) fileURLWithPathComponents: (NSArray*)components; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_5, GS_API_LATEST) + (instancetype) fileURLWithPath: (NSString*)aPath isDirectory: (BOOL)isDir; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_11, GS_API_LATEST) + (instancetype) fileURLWithPath: (NSString *)aPath isDirectory: (BOOL)isDir relativeToURL: (NSURL *)baseURL; /** Create and return a file URL with the supplied path, relative to a base URL. */ + (instancetype) fileURLWithPath: (NSString *)aPath relativeToURL: (NSURL *)baseURL; #endif /** * Create and return a URL with the supplied string, which should * be a string (containing percent escape codes where necessary) * conforming to the description (in RFC2396) of an absolute URL.
* Calls -initWithString: */ + (instancetype) URLWithString: (NSString*)aUrlString; #if OS_API_VERSION(MAC_OS_X_VERSION_10_10, GS_API_LATEST) + (instancetype) URLByResolvingAliasFileAtURL: (NSURL*)url options: (NSURLBookmarkResolutionOptions)options error: (NSError**)error; #endif /** * Create and return a URL with the supplied string, which should * be a string (containing percent escape codes where necessary) * conforming to the description (in RFC2396) of a relative URL.
* Calls -initWithString:relativeToURL: */ + (instancetype) URLWithString: (NSString*)aUrlString relativeToURL: (NSURL*)aBaseUrl; /** * Initialise as a file URL with the specified path (which must * be a valid path on the local filesystem).
* Raises NSInvalidArgumentException if aPath is nil.
* Converts relative paths to absolute ones.
* Appends a trailing slash to the path when necessary if it * specifies a directory.
* Calls -initWithScheme:host:path: */ - (instancetype) initFileURLWithPath: (NSString*)aPath; #if OS_API_VERSION(MAC_OS_X_VERSION_10_5,GS_API_LATEST) /** * Initialise as a file URL with the specified path (which must * be a valid path on the local filesystem).
* Raises NSInvalidArgumentException if aPath is nil.
* Converts relative paths to absolute ones.
* Appends a trailing slash to the path when necessary if it * specifies a directory.
* Calls -initWithScheme:host:path: */ - (instancetype) initFileURLWithPath: (NSString*)aPath isDirectory: (BOOL)isDir; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_11, GS_API_LATEST) /** * Initialise as a file URL with the specified path (which must * be a valid path on the local filesystem) relative to the base URL.
* Raises NSInvalidArgumentException if aPath is nil.
* Converts relative paths to absolute ones.
* Appends a trailing slash to the path when necessary if it * specifies a directory.
* Calls -initWithScheme:host:path: */ - (instancetype) initFileURLWithPath: (NSString *)aPath relativeToURL: (NSURL *)baseURL; /** * Initialise as a file URL with the specified path (which must * be a valid path on the local filesystem) relative to the base URL.
* Raises NSInvalidArgumentException if aPath is nil.
* Converts relative paths to absolute ones.
* Appends a trailing slash to the path when necessary if it * specifies a directory.
* Calls -initWithScheme:host:path: */ - (instancetype) initFileURLWithPath: (NSString *)aPath isDirectory: (BOOL)isDir relativeToURL: (NSURL *)baseURL; #endif /** * Initialise by building a URL string from the supplied parameters * and calling -initWithString:relativeToURL:
* This method adds percent escapes to aPath if it contains characters * which need escaping.
* Accepts RFC2732 style IPv6 host addresses either with or without the * enclosing square brackets (MacOS-X at least up to version 10.5 does * not handle these correctly, but GNUstep does).
* Permits the 'aHost' part to contain 'username:password@host:port' or * 'host:port' in addition to a simple host name or address. */ - (instancetype) initWithScheme: (NSString*)aScheme host: (NSString*)aHost path: (NSString*)aPath; /** * Initialise as an absolute URL.
* Calls -initWithString:relativeToURL: */ - (instancetype) initWithString: (NSString*)aUrlString; /** * Initialised using aUrlString and aBaseUrl. The value of aBaseUrl * may be nil, but aUrlString must be non-nil.
* Accepts RFC2732 style IPv6 host addresses.
* Parses a string wihthout a scheme as a simple path.
* Parses an empty string as an empty path.
* If the string cannot be parsed the method returns nil. */ - (instancetype) initWithString: (NSString*)aUrlString relativeToURL: (NSURL*)aBaseUrl; #if GS_HAS_DECLARED_PROPERTIES @property (readonly, getter=isFileURL) BOOL fileURL; #else - (BOOL) isFileURL; #endif /** * Returns the full string describing the receiver resolved against its base. */ - (NSString*) absoluteString; /** * If the receiver is an absolute URL, returns self. Otherwise returns an * absolute URL referring to the same resource as the receiver. */ - (NSURL*) absoluteURL; /** * If the receiver is a relative URL, returns its base URL.
* Otherwise, returns nil. */ - (NSURL*) baseURL; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6,GS_API_LATEST) /** Attempts to load from the specified URL and provides an error * response if the data is unrachable.
* Returns YES on success, NO on failure. */ - (BOOL) checkResourceIsReachableAndReturnError: (NSError **)error; #endif /** * Returns the fragment portion of the receiver or nil if there is no * fragment supplied in the URL.
* The fragment is everything in the original URL string after a '#'
* File URLs do not have fragments. */ - (NSString*) fragment; /** * Returns the host portion of the receiver or nil if there is no * host supplied in the URL.
* Percent escape sequences in the user string are translated and the string * treated as UTF8.
* Returns IPv6 addresses without the enclosing square brackets * required (by RFC2732) in URL strings. */ - (NSString*) host; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6,GS_API_LATEST) /** Returns the last (rightmost) path component of the receiver. */ - (NSString*) lastPathComponent; #endif /** * Loads resource data for the specified client. *

* If shouldUseCache is YES then an attempt * will be made to locate a cached NSURLHandle to provide the * resource data, otherwise a new handle will be created and * cached. *

*

* If the handle does not have the data available, it will be * asked to load the data in the background by calling its * loadInBackground method. *

*

* The specified client (if non-nil) will be set up to receive * notifications of the progress of the background load process. *

*

* The processes current run loop must be run in order for the * background load operation to operate! *

*/ - (void) loadResourceDataNotifyingClient: (id)client usingCache: (BOOL)shouldUseCache; /** * Returns the parameter portion of the receiver or nil if there is no * parameter supplied in the URL.
* The parameters are everything in the original URL string after a ';' * but before the query.
* File URLs do not have parameters. */ - (NSString*) parameterString; /** * Returns the password portion of the receiver or nil if there is no * password supplied in the URL.
* Percent escape sequences in the user string are translated and the string * treated as UTF8 in GNUstep but this appears to be broken in MacOS-X.
* NB. because of its security implications it is recommended that you * do not use URLs with users and passwords unless necessary. */ - (NSString*) password; /** * Returns the path portion of the receiver.
* Replaces percent escapes with unescaped values, interpreting non-ascii * character sequences as UTF8.
* NB. This does not conform strictly to the RFCs, in that it includes a * leading slash ('/') character (whereas the path part of a URL strictly * should not) and the interpretation of non-ascii character is (strictly * speaking) undefined.
* Also, this breaks strict conformance in that a URL of file scheme is * treated as having a path (contrary to RFCs) */ - (NSString*) path; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6,GS_API_LATEST) /** Returns thepath components of the receiver.
* See [NSString-pathComponents]. */ - (NSArray*) pathComponents; /** Returns the file extension (text after the rightmost dot in the path) * of the receiver.
* see [NSString-pathExtension]. */ - (NSString*) pathExtension; #endif /** * Returns the port portion of the receiver or nil if there is no * port supplied in the URL.
* Percent escape sequences in the user string are translated in GNUstep * but this appears to be broken in MacOS-X. */ - (NSNumber*) port; /** * Asks a URL handle to return the property for the specified key and * returns the result. */ - (id) propertyForKey: (NSString*)propertyKey; /** * Returns the query portion of the receiver or nil if there is no * query supplied in the URL.
* The query is everything in the original URL string after a '?' * but before the fragment.
* File URLs do not have queries. */ - (NSString*) query; /** * Returns the path of the receiver, without taking any base URL into account. * If the receiver is an absolute URL, -relativePath is the same as -path.
* Returns nil if there is no path specified for the URL. */ - (NSString*) relativePath; /** * Returns the relative portion of the URL string. If the receiver is not * a relative URL, this returns the same as absoluteString. */ - (NSString*) relativeString; /** * Loads the resource data for the represented URL and returns the result. * The shouldUseCache flag determines whether data previously retrieved by * an existing NSURLHandle can be used to provide the data, or if it should * be refetched. */ - (NSData*) resourceDataUsingCache: (BOOL)shouldUseCache; /** * Returns the resource specifier of the URL ... the part which lies * after the scheme. */ - (NSString*) resourceSpecifier; /** * Returns the scheme of the receiver. */ - (NSString*) scheme; /** * Calls [NSURLHandle-writeProperty:forKey:] to set the named property. */ - (BOOL) setProperty: (id)property forKey: (NSString*)propertyKey; /** * Calls [NSURLHandle-writeData:] to write the specified data object * to the resource identified by the receiver URL.
* Returns the result. */ - (BOOL) setResourceData: (NSData*)data; /** * Returns a URL with '/./' and '/../' sequences resolved etc. */ - (NSURL*) standardizedURL; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6,GS_API_LATEST) /** Returns a URL formed by adding a path component to the path of the * receiver.
* See [NSString-stringByAppendingPathComponent:]. */ - (NSURL*) URLByAppendingPathComponent: (NSString*)pathComponent; /** Returns a URL formed by adding a path extension to the path of the * receiver.
* See [NSString-stringByAppendingPathExtension:]. */ - (NSURL*) URLByAppendingPathExtension: (NSString*)pathExtension; /** Returns a URL formed by removing a path component from the path of the * receiver.
* See [NSString-stringByDeletingLastPathComponent]. */ - (NSURL*) URLByDeletingLastPathComponent; /** Returns a URL formed by removing an extension from the path of the * receiver.
* See [NSString-stringByDeletingPathExtension]. */ - (NSURL*) URLByDeletingPathExtension; /** Returns self unless the receiver is a file URL, in which case it returns * a URL formed by calling [NSString-stringByResolvingSymlinksInPath]. */ - (NSURL*) URLByResolvingSymlinksInPath; /** Returns self unless the receiver is a file URL, in which case it returns * a URL formed by calling [NSString-stringByStandardizingPath]. */ - (NSURL*) URLByStandardizingPath; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_7, GS_API_LATEST) /** Returns a URL formed by adding a path component to the path of the * receiver, along with a trailing slash if the component is designated a * directory.
* See [NSString-stringByAppendingPathComponent:]. */ - (NSURL *) URLByAppendingPathComponent: (NSString *)pathComponent isDirectory: (BOOL)isDirectory; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) - (BOOL) isFileReferenceURL; - (NSURL *) fileReferenceURL; - (NSURL *) filePathURL; - (BOOL) getResourceValue: (id*)value forKey: (NSString *)key error: (NSError**)error; #endif /** * Returns an NSURLHandle instance which may be used to write data to the * resource represented by the receiver URL, or read data from it.
* The shouldUseCache flag indicates whether a cached handle may be returned * or a new one should be created. */ - (NSURLHandle*)URLHandleUsingCache: (BOOL)shouldUseCache; /** * Returns the user portion of the receiver or nil if there is no * user supplied in the URL.
* Percent escape sequences in the user string are translated and * the whole is treated as UTF8 data.
* NB. because of its security implications it is recommended that you * do not use URLs with users and passwords unless necessary. */ - (NSString*) user; @end @interface NSObject (NSURLClient) /** * Some data has become available. Note that this does not mean that all data * has become available, only that a chunk of data has arrived. */ - (void) URL: (NSURL*)sender resourceDataDidBecomeAvailable: (NSData*)newBytes; /** * Loading of resource data is complete. */ - (void) URLResourceDidFinishLoading: (NSURL*)sender; /** * Loading of resource data was cancelled by programmatic request * (not an error). */ - (void) URLResourceDidCancelLoading: (NSURL*)sender; /** * Loading of resource data has failed, for given human-readable reason. */ - (void) URL: (NSURL*)sender resourceDidFailLoadingWithReason: (NSString*)reason; @end /** URL Resource Value Constants **/ #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) GS_EXPORT NSString* const NSURLNameKey; GS_EXPORT NSString* const NSURLLocalizedNameKey; GS_EXPORT NSString* const NSURLIsRegularFileKey; GS_EXPORT NSString* const NSURLIsDirectoryKey; GS_EXPORT NSString* const NSURLIsSymbolicLinkKey; GS_EXPORT NSString* const NSURLIsVolumeKey; GS_EXPORT NSString* const NSURLIsPackageKey; GS_EXPORT NSString* const NSURLIsSystemImmutableKey; GS_EXPORT NSString* const NSURLIsUserImmutableKey; GS_EXPORT NSString* const NSURLIsHiddenKey; GS_EXPORT NSString* const NSURLHasHiddenExtensionKey; GS_EXPORT NSString* const NSURLCreationDateKey; GS_EXPORT NSString* const NSURLContentAccessDateKey; GS_EXPORT NSString* const NSURLContentModificationDateKey; GS_EXPORT NSString* const NSURLAttributeModificationDateKey; GS_EXPORT NSString* const NSURLLinkCountKey; GS_EXPORT NSString* const NSURLParentDirectoryURLKey; GS_EXPORT NSString* const NSURLVolumeURLKey; GS_EXPORT NSString* const NSURLTypeIdentifierKey; GS_EXPORT NSString* const NSURLLocalizedTypeDescriptionKey; GS_EXPORT NSString* const NSURLLabelNumberKey; GS_EXPORT NSString* const NSURLLabelColorKey; GS_EXPORT NSString* const NSURLLocalizedLabelKey; GS_EXPORT NSString* const NSURLEffectiveIconKey; GS_EXPORT NSString* const NSURLCustomIconKey; GS_EXPORT NSString* const NSURLFileSizeKey; GS_EXPORT NSString* const NSURLFileAllocatedSizeKey; GS_EXPORT NSString* const NSURLIsAliasFileKey; GS_EXPORT NSString* const NSURLVolumeLocalizedFormatDescriptionKey; GS_EXPORT NSString* const NSURLVolumeTotalCapacityKey; GS_EXPORT NSString* const NSURLVolumeAvailableCapacityKey; GS_EXPORT NSString* const NSURLVolumeResourceCountKey; GS_EXPORT NSString* const NSURLVolumeSupportsPersistentIDsKey; GS_EXPORT NSString* const NSURLVolumeSupportsSymbolicLinksKey; GS_EXPORT NSString* const NSURLVolumeSupportsHardLinksKey; GS_EXPORT NSString* const NSURLVolumeSupportsJournalingKey; GS_EXPORT NSString* const NSURLVolumeIsJournalingKey; GS_EXPORT NSString* const NSURLVolumeSupportsSparseFilesKey; GS_EXPORT NSString* const NSURLVolumeSupportsZeroRunsKey; GS_EXPORT NSString* const NSURLVolumeSupportsCaseSensitiveNamesKey; GS_EXPORT NSString* const NSURLVolumeSupportsCasePreservedNamesKey; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_7, GS_API_LATEST) GS_EXPORT NSString* const NSURLFileResourceIdentifierKey; GS_EXPORT NSString* const NSURLVolumeIdentifierKey; GS_EXPORT NSString* const NSURLPreferredIOBlockSizeKey; GS_EXPORT NSString* const NSURLIsReadableKey; GS_EXPORT NSString* const NSURLIsWritableKey; GS_EXPORT NSString* const NSURLIsExecutableKey; GS_EXPORT NSString* const NSURLFileSecurityKey; GS_EXPORT NSString* const NSURLIsMountTriggerKey; GS_EXPORT NSString* const NSURLFileResourceTypeKey; GS_EXPORT NSString* const NSURLTotalFileSizeKey; GS_EXPORT NSString* const NSURLTotalFileAllocatedSizeKey; GS_EXPORT NSString* const NSURLVolumeSupportsRootDirectoryDatesKey; GS_EXPORT NSString* const NSURLVolumeSupportsVolumeSizesKey; GS_EXPORT NSString* const NSURLVolumeSupportsRenamingKey; GS_EXPORT NSString* const NSURLVolumeSupportsAdvisoryFileLockingKey; GS_EXPORT NSString* const NSURLVolumeSupportsExtendedSecurityKey; GS_EXPORT NSString* const NSURLVolumeIsBrowsableKey; GS_EXPORT NSString* const NSURLVolumeMaximumFileSizeKey; GS_EXPORT NSString* const NSURLVolumeIsEjectableKey; GS_EXPORT NSString* const NSURLVolumeIsRemovableKey; GS_EXPORT NSString* const NSURLVolumeIsInternalKey; GS_EXPORT NSString* const NSURLVolumeIsAutomountedKey; GS_EXPORT NSString* const NSURLVolumeIsLocalKey; GS_EXPORT NSString* const NSURLVolumeIsReadOnlyKey; GS_EXPORT NSString* const NSURLVolumeCreationDateKey; GS_EXPORT NSString* const NSURLVolumeURLForRemountingKey; GS_EXPORT NSString* const NSURLVolumeUUIDStringKey; GS_EXPORT NSString* const NSURLVolumeNameKey; GS_EXPORT NSString* const NSURLVolumeLocalizedNameKey; GS_EXPORT NSString* const NSURLIsUbiquitousItemKey; GS_EXPORT NSString* const NSURLUbiquitousItemHasUnresolvedConflictsKey; GS_EXPORT NSString* const NSURLUbiquitousItemIsDownloadingKey; GS_EXPORT NSString* const NSURLUbiquitousItemIsUploadedKey; GS_EXPORT NSString* const NSURLUbiquitousItemIsUploadingKey; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_8, GS_API_LATEST) GS_EXPORT NSString* const NSURLIsExcludedFromBackupKey; GS_EXPORT NSString* const NSURLPathKey; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_9, GS_API_LATEST) GS_EXPORT NSString* const NSURLTagNamesKey; GS_EXPORT NSString* const NSURLUbiquitousItemDownloadingStatusKey; GS_EXPORT NSString* const NSURLUbiquitousItemDownloadingErrorKey; GS_EXPORT NSString* const NSURLUbiquitousItemUploadingErrorKey; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_10, GS_API_LATEST) GS_EXPORT NSString* const NSURLGenerationIdentifierKey; GS_EXPORT NSString* const NSURLDocumentIdentifierKey; GS_EXPORT NSString* const NSURLAddedToDirectoryDateKey; GS_EXPORT NSString* const NSURLQuarantinePropertiesKey; GS_EXPORT NSString* const NSThumbnail1024x1024SizeKey; GS_EXPORT NSString* const NSURLUbiquitousItemDownloadRequestedKey; GS_EXPORT NSString* const NSURLUbiquitousItemContainerDisplayNameKey; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_11, GS_API_LATEST) GS_EXPORT NSString* const NSURLIsApplicationKey; GS_EXPORT NSString* const NSURLApplicationIsScriptableKey; #endif /** Possible values for File Resource Type Key **/ #if OS_API_VERSION(MAC_OS_X_VERSION_10_7, GS_API_LATEST) GS_EXPORT NSString* const NSURLFileResourceTypeNamedPipe; GS_EXPORT NSString* const NSURLFileResourceTypeCharacterSpecial; GS_EXPORT NSString* const NSURLFileResourceTypeDirectory; GS_EXPORT NSString* const NSURLFileResourceTypeBlockSpecial; GS_EXPORT NSString* const NSURLFileResourceTypeRegular; GS_EXPORT NSString* const NSURLFileResourceTypeSymbolicLink; GS_EXPORT NSString* const NSURLFileResourceTypeSocket; GS_EXPORT NSString* const NSURLFileResourceTypeUnknown; #endif /** Possible values for Ubiquitous Item Downloading Key **/ #if OS_API_VERSION(MAC_OS_X_VERSION_10_9, GS_API_LATEST) GS_EXPORT NSString* const NSURLUbiquitousItemDownloadingStatusNotDownloaded; GS_EXPORT NSString* const NSURLUbiquitousItemDownloadingStatusDownloaded; GS_EXPORT NSString* const NSURLUbiquitousItemDownloadingStatusCurrent; #endif #endif /* GS_API_MACOSX */ #if !NO_GNUSTEP && !defined(GNUSTEP_BASE_INTERNAL) #import #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_10, GS_API_LATEST) GS_EXPORT_CLASS @interface NSURLQueryItem : NSObject { #if GS_EXPOSE(NSURLQueryItem) #endif #if GS_NONFRAGILE # if defined(GS_NSURLQueryItem_IVARS) @public GS_NSURLQueryItem_IVARS; # endif #else /* Pointer to private additional data used to avoid breaking ABI * when we don't have the non-fragile ABI available. * Use this mechanism rather than changing the instance variable * layout (see Source/GSInternal.h for details). */ @private id _internal GS_UNUSED_IVAR; #endif } // Creating query items. + (instancetype)queryItemWithName: (NSString *)name value: (NSString *)value; - (instancetype)initWithName: (NSString *)name value: (NSString *)value; // Reading a name and value from a query - (NSString *) name; - (NSString *) value; @end #endif // OS_API_VERSION #if OS_API_VERSION(MAC_OS_X_VERSION_10_9, GS_API_LATEST) GS_EXPORT_CLASS @interface NSURLComponents : NSObject { #if GS_EXPOSE(NSURLComponents) #endif #if GS_NONFRAGILE # if defined(GS_NSURLComponents_IVARS) @public GS_NSURLComponents_IVARS; # endif #else /* Pointer to private additional data used to avoid breaking ABI * when we don't have the non-fragile ABI available. * Use this mechanism rather than changing the instance variable * layout (see Source/GSInternal.h for details). */ @private id _internal GS_UNUSED_IVAR; #endif } // Creating URL components... + (instancetype) componentsWithString: (NSString *)URLString; + (instancetype) componentsWithURL: (NSURL *)url resolvingAgainstBaseURL: (BOOL)resolve; - (instancetype) init; - (instancetype) initWithString: (NSString *)URLString; - (instancetype) initWithURL: (NSURL *)url resolvingAgainstBaseURL: (BOOL)resolve; // Getting the URL - (NSString *) string; - (void) setString: (NSString *)urlString; - (NSURL *) URL; - (void) setURL: (NSURL *)url; - (NSURL *)URLRelativeToURL: (NSURL *)baseURL; // Accessing Components in Native Format - (NSString *) fragment; - (void) setFragment: (NSString *)fragment; - (NSString *) host; - (void) setHost: (NSString *)host; - (NSString *) password; - (void) setPassword: (NSString *)password; - (NSString *) path; - (void) setPath: (NSString *)path; - (NSNumber *) port; - (void) setPort: (NSNumber *)port; - (NSString *) query; - (void) setQuery: (NSString *)query; #if OS_API_VERSION(MAC_OS_X_VERSION_10_10, GS_API_LATEST) - (NSArray *) queryItems; - (void) setQueryItems: (NSArray *)queryItems; #endif - (NSString *) scheme; - (void) setScheme: (NSString *)scheme; - (NSString *) user; - (void) setUser: (NSString *)user; // Accessing Components in PercentEncoded Format - (NSString *) percentEncodedFragment; - (void) setPercentEncodedFragment: (NSString *)fragment; - (NSString *) percentEncodedHost; - (void) setPercentEncodedHost: (NSString *)host; - (NSString *) percentEncodedPassword; - (void) setPercentEncodedPassword: (NSString *)password; - (NSString *) percentEncodedPath; - (void) setPercentEncodedPath: (NSString *)path; - (NSString *) percentEncodedQuery; - (void) setPercentEncodedQuery: (NSString *)query; #if OS_API_VERSION(MAC_OS_X_VERSION_10_10, GS_API_LATEST) - (NSArray *) percentEncodedQueryItems; - (void) setPercentEncodedQueryItems: (NSArray *)queryItems; #endif - (NSString *) percentEncodedUser; - (void) setPercentEncodedUser: (NSString *)user; // Locating components of the URL string representation - (NSRange) rangeOfFragment; - (NSRange) rangeOfHost; - (NSRange) rangeOfPassword; - (NSRange) rangeOfPath; - (NSRange) rangeOfPort; - (NSRange) rangeOfQuery; - (NSRange) rangeOfScheme; - (NSRange) rangeOfUser; @end #if defined(__cplusplus) } #endif #endif /* GS_API_MACOSX */ #endif /* __NSURL_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSURLAuthenticationChallenge.h000066400000000000000000000115101435650067400254500ustar00rootroot00000000000000/* Interface for NSURLAuthenticationChallenge for GNUstep Copyright (C) 2006 Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 2006 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSURLAuthenticationChallenge_h_GNUSTEP_BASE_INCLUDE #define __NSURLAuthenticationChallenge_h_GNUSTEP_BASE_INCLUDE #import #if OS_API_VERSION(MAC_OS_X_VERSION_10_2,GS_API_LATEST) && GS_API_VERSION( 11300,GS_API_LATEST) #import #if defined(__cplusplus) extern "C" { #endif @class NSError; @class NSURLAuthenticationChallenge; @class NSURLCredential; @class NSURLProtectionSpace; @class NSURLResponse; /** * A challenge sender (usually an NSURLProtocol subclass handling a * connection/download) provides these methods to permit a client to * control authentication. */ @protocol NSURLAuthenticationChallengeSender /** * Cancels the authenticatiopn challenge, ensuring that the load operation * will fail to retrieve data, completing with only the response headers * containing the challenge having been read from the server. */ - (void) cancelAuthenticationChallenge: (NSURLAuthenticationChallenge *)challenge; /** * Tells the sender to continue the load without providing a new credential * for it to use ... if the challenge already had a proposed credential, * the sender may elect to use it. */ - (void) continueWithoutCredentialForAuthenticationChallenge: (NSURLAuthenticationChallenge *)challenge; /** * Tells the sender to continue the load using the new credential * provided by this method. */ - (void) useCredential: (NSURLCredential *)credential forAuthenticationChallenge: (NSURLAuthenticationChallenge *)challenge; @end /** * Class to represent an authentication challenge and indicate when the * challenge is complete. */ GS_EXPORT_CLASS @interface NSURLAuthenticationChallenge : NSObject { #if GS_EXPOSE(NSURLAuthenticationChallenge) void *_NSURLAuthenticationChallengeInternal; #endif } /** * Returns the error with which the reciver was initialised or nil * if it was not initialised with an error.
* The error may indicate the nature of the authentication failure. */ - (NSError *) error; /** * Returns the response with which the receiver was initialised.
* This response contains the authentication failure corresponding to * this challenge object.
* If there was no failure or response, returns nil. */ - (NSURLResponse *) failureResponse; /** * Initialises a new challenge by copying information from an old one. */ - (id) initWithAuthenticationChallenge: (NSURLAuthenticationChallenge *)challenge sender: (id)sender; /** * Returns the receiver initialised in the specified protection space and * with the specified credential. The previousFailureCount says how many * requests have failed the challenge and response provide information * about the last failure (which caused this challenge to be created).
* The error provides information about the authentication failure and * the sender is the object to receive callbacks. */ - (id) initWithProtectionSpace: (NSURLProtectionSpace *)space proposedCredential: (NSURLCredential *)credential previousFailureCount: (NSInteger)previousFailureCount failureResponse: (NSURLResponse *)response error: (NSError *)error sender: (id)sender; /** * Returns the count of failed authentication attempts. */ - (NSInteger) previousFailureCount; /** * Returns a proposed credential to answer the challenge.
* If there is no credential available, this returns nil.
* The credential may come from storage or from the URL itsself. */ - (NSURLCredential *) proposedCredential; /** * Returns the protection space needing authentication. */ - (NSURLProtectionSpace *) protectionSpace; /** * Returns the sender of the challenge ... the object to which callbacks * should be made while processing the challenge. */ - (id) sender; @end #if defined(__cplusplus) } #endif #endif #endif gnustep-base-1.29.0/Headers/Foundation/NSURLCache.h000066400000000000000000000132371435650067400217010ustar00rootroot00000000000000/* Interface for NSURLCache for GNUstep Copyright (C) 2006 Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 2006 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSURLCache_h_GNUSTEP_BASE_INCLUDE #define __NSURLCache_h_GNUSTEP_BASE_INCLUDE #import #if OS_API_VERSION(MAC_OS_X_VERSION_10_2,GS_API_LATEST) && GS_API_VERSION( 11300,GS_API_LATEST) #import #if defined(__cplusplus) extern "C" { #endif @class NSData; @class NSDictionary; @class NSURLRequest; @class NSURLRequest; @class NSURLResponse; /** * Specifies the cache storage policy. */ typedef enum { NSURLCacheStorageAllowed, /** Unrestricted caching */ NSURLCacheStorageAllowedInMemoryOnly, /** In memory caching only */ NSURLCacheStorageNotAllowed /** No caching allowed */ } NSURLCacheStoragePolicy; /** * Encapsulates a cached response to a URL load request. */ GS_EXPORT_CLASS @interface NSCachedURLResponse : NSObject { #if GS_EXPOSE(NSCachedURLResponse) void *_NSCachedURLResponseInternal; #endif } /** * Returns the data with which the receiver was initialised. */ - (NSData *) data; /** * Uses the NSURLCacheStorageAllowed policy to cache the specified * response and data.
* Returns the cached response. */ - (id) initWithResponse: (NSURLResponse *)response data: (NSData *)data; /** * Returns the receiver initialized with the provided parameters. */ - (id) initWithResponse: (NSURLResponse *)response data: (NSData *)data userInfo: (NSDictionary *)userInfo storagePolicy: (NSURLCacheStoragePolicy)storagePolicy; /** * Returns the response with which the receiver was initialised. */ - (NSURLResponse *) response; /** * Returns the storage policy with which the receiver was initialised. */ - (NSURLCacheStoragePolicy) storagePolicy; /** * Returns the user info dictionary with which the receiver was initialised * (if any). */ - (NSDictionary *) userInfo; @end GS_EXPORT_CLASS @interface NSURLCache : NSObject { #if GS_EXPOSE(NSURLCache) void *_NSURLCacheInternal; #endif } /** * Sets the shared [NSURLCache] used throughout the process.
* If you are going to call this method to specify an alternative to * the default cache, you should do so before the shared cache is used * in order to avoid loss of data that was in the old cache. */ + (void) setSharedURLCache: (NSURLCache *)cache; /** * Returns the shared cache instance set by +setSharedURLCache: or, * if none has been set, returns an instance initialised with
* * Memory capacity * 4 megabytes * Disk capacity * 20 megabytes * Disk path * user-library-path/Caches/current-app-name * */ + (NSURLCache *) sharedURLCache; /** * Returns the [NSCachedURLResponse] cached for the specified request * or nil if there is no matching response in tthe cache. */ - (NSCachedURLResponse *) cachedResponseForRequest: (NSURLRequest *)request; /** * Returns the current size (butes) of the data stored in the on-disk * cache. */ - (NSUInteger) currentDiskUsage; /** * Returns the current size (butes) of the data stored in the in-memory * cache. */ - (NSUInteger) currentMemoryUsage; /** * Returns the disk capacity (in bytes) of the cache. */ - (NSUInteger) diskCapacity; /** * Returns the receiver initialised with the specified capacities * (in bytes) and using the specified location on disk for persistent * storage. */ - (id) initWithMemoryCapacity: (NSUInteger)memoryCapacity diskCapacity: (NSUInteger)diskCapacity diskPath: (NSString *)path; /** * Returns the memory capacity (in bytes) of the cache. */ - (NSUInteger) memoryCapacity; /** * Empties the cache. */ - (void) removeAllCachedResponses; /** * Removes from the cache (if present) the [NSCachedURLResponse] * which was stored using the specified request. */ - (void) removeCachedResponseForRequest: (NSURLRequest *)request; /** * Sets the disk capacity (in bytes) truncating cache contents if necessary. */ - (void) setDiskCapacity: (NSUInteger)diskCapacity; /** * Sets the memory capacity (in bytes) truncating cache contents if necessary. */ - (void) setMemoryCapacity: (NSUInteger)memoryCapacity; /** * Stores cachedResponse in the cache, keyed on request.
* Replaces any existing response with the same key. */ - (void) storeCachedResponse: (NSCachedURLResponse *)cachedResponse forRequest: (NSURLRequest *)request; @end @class NSURLSessionDataTask; @interface NSURLCache (NSURLSessionTaskAdditions) - (void) storeCachedResponse: (NSCachedURLResponse*)cachedResponse forDataTask: (NSURLSessionDataTask*)dataTask; - (NSCachedURLResponse*) cachedResponseForDataTask: (NSURLSessionDataTask*)dataTask; - (void) removeCachedResponseForDataTask: (NSURLSessionDataTask*)dataTask; @end #if defined(__cplusplus) } #endif #endif #endif gnustep-base-1.29.0/Headers/Foundation/NSURLConnection.h000066400000000000000000000260671435650067400230020ustar00rootroot00000000000000/* Interface for NSURLConnection for GNUstep Copyright (C) 2006 Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 2006 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSURLConnection_h_GNUSTEP_BASE_INCLUDE #define __NSURLConnection_h_GNUSTEP_BASE_INCLUDE #import #if OS_API_VERSION(MAC_OS_X_VERSION_10_2,GS_API_LATEST) && GS_API_VERSION( 11300,GS_API_LATEST) #import #import #if defined(__cplusplus) extern "C" { #endif @class NSCachedURLResponse; @class NSData; @class NSError; @class NSInputStream; @class NSURLAuthenticationChallenge; @class NSURLRequest; @class NSURLResponse; /** */ GS_EXPORT_CLASS @interface NSURLConnection : NSObject { #if GS_EXPOSE(NSURLConnection) void *_NSURLConnectionInternal; #endif } /** * Performs a preliminary check to see if a load of the specified * request can be handled by an instance of this class.
* The results of this method may be invalidated by subsequent * changes to the request or changes to the registered protocols * etc. */ + (BOOL) canHandleRequest: (NSURLRequest *)request; /** * Allocates and returns the autoreleased instance which it initialises * using the -initWithRequest:delegate: method. */ + (NSURLConnection *) connectionWithRequest: (NSURLRequest *)request delegate: (id)delegate; #if OS_API_VERSION(MAC_OS_X_VERSION_10_5, GS_API_LATEST) /** * Start the asynchronous load. This method is only needed if NO is passed * into startImmediately when calling initWithRequest: delegate: startImmediately. */ - (void) start; #endif /** * Cancel the asynchronous load in progress (if any) for this connection. */ - (void) cancel; #if OS_API_VERSION(MAC_OS_X_VERSION_10_5, GS_API_LATEST) - (void) scheduleInRunLoop: (NSRunLoop *)aRunLoop forMode: (NSRunLoopMode)mode; - (void) unscheduleFromRunLoop: (NSRunLoop *)aRunLoop forMode: (NSRunLoopMode)mode; #endif /** * Initialises the receiver with the specified request (performing * a deep copy so that the request does not change during loading) * and delegate.
* This automatically initiates an asynchronous load for the request.
* Processing of the request is done in the thread which calls this * method, so the thread must run its current run loop * (in NSDefaultRunLoopMode) for processing to continue/complete.
* The delegate will receive callbacks informing it of the progress * of the load.
* This method breaks with convention and retains the delegate object, * releasing it when the connection finished loading, fails, or is cancelled. */ - (id) initWithRequest: (NSURLRequest *)request delegate: (id)delegate; #if OS_API_VERSION(MAC_OS_X_VERSION_10_5, GS_API_LATEST) /** * Initialises the receiver with the specified request (performing * a deep copy so that the request does not change during loading) * and delegate.
* This automatically initiates an asynchronous load for the request * if and only if startImmediately is set to YES.
* Processing of the request is done in the thread which calls this * method, so the thread must run its current run loop * (in NSDefaultRunLoopMode) for processing to continue/complete.
* The delegate will receive callbacks informing it of the progress * of the load.
* This method breaks with convention and retains the delegate object, * releasing it when the connection finished loading, fails, or is cancelled. */ - (id) initWithRequest: (NSURLRequest *)request delegate: (id)delegate startImmediately: (BOOL)startImmediately; #endif @end /** * This category is an informal protocol specifying how an NSURLConnection * instance will communicate with its delegate to inform it of (and allow * it to manage) the progress of a load request.
* A load operation is performed by asynchronous I/O using the * run loop of the thread in which it was initiated, so all callbacks * will occur in that thread.
* The process of loading a resource occurs as follows -
* * * Any number of -connection:willSendRequest:redirectResponse: * messages may be sent to the delegate before any other messages * in this list are sent. This permits a chain of redirects to * be followed before eventual loading of 'real' data. * * * A -connection:didReceiveAuthenticationChallenge: message may be * sent to the delegate (where authentication is required) before * response data can be downloaded. * * * Any number of -connection:didReceiveResponse: messages * may be be sent to the delegate before a * -connection:didReceiveData: message. Usually there is exactly one * of these, but for multipart/x-mixed-replace there may be multiple * responses for each part, and if an error occurs in the download * the delegate may not receive a response at all.
* Delegates should discard previously handled data when they * receive a new response. *
* * Any number of -connection:didReceiveData: messages may * be sent before the load completes as described below. * * * A single -connection:willCacheResponse: message may * be sent to the delegate after any -connection:didReceiveData: * messages are sent but before a -connectionDidFinishLoading: message * is sent. * * * Unless the NSURLConnection receives a -cancel message, * the delegate will receive one and only one of * -connectionDidFinishLoading:, or * -connection:didFailWithError: message, but never * both.
* Once either of these terminal messages is sent the * delegate will receive no further messages from the * NSURLConnection. *
*
*/ #if OS_API_VERSION(MAC_OS_X_VERSION_10_7,GS_API_LATEST) && GS_API_VERSION(11300,GS_API_LATEST) @protocol NSURLConnectionDelegate #if GS_PROTOCOLS_HAVE_OPTIONAL @optional #else @end @interface NSObject (NSURLConnectionDelegate) #endif #else @interface NSObject (NSURLConnectionDelegate) #endif /** * Instructs the delegate that authentication for challenge has * been cancelled for the request loading on connection. */ - (void) connection: (NSURLConnection *)connection didCancelAuthenticationChallenge: (NSURLAuthenticationChallenge *)challenge; /* * Called when an NSURLConnection has failed to load successfully. */ - (void) connection: (NSURLConnection *)connection didFailWithError: (NSError *)error; /** * Called when an NSURLConnection has finished loading successfully. */ - (void) connectionDidFinishLoading: (NSURLConnection *)connection; /** * Called when an authentication challenge is received ... the delegate * should send -useCredential:forAuthenticationChallenge: or * -continueWithoutCredentialForAuthenticationChallenge: or * -cancelAuthenticationChallenge: to the challenge sender when done. */ - (void) connection: (NSURLConnection *)connection didReceiveAuthenticationChallenge: (NSURLAuthenticationChallenge *)challenge; /** * Called when content data arrives during a load operations ... this * may be incremental or may be the compolete data for the load. */ - (void) connection: (NSURLConnection *)connection didReceiveData: (NSData *)data; /** * Called when enough information to build a NSURLResponse object has * been received. */ - (void) connection: (NSURLConnection *)connection didReceiveResponse: (NSURLResponse *)response; /** * Called with the cachedResponse to be stored in the cache. * The delegate can inspect the cachedResponse and return a modified * copy if if wants changed to what whill be stored.
* If it returns nil, nothing will be stored in the cache. */ - (NSCachedURLResponse *) connection: (NSURLConnection *)connection willCacheResponse: (NSCachedURLResponse *)cachedResponse; /** * Informs the delegate that the connection must change the URL of * the request in order to continue with the load operation.
* This allows the delegate to ionspect and/or modify a copy of the request * before the connection continues loading it. Normally the delegate * can return the request unmodifield.
* The redirection can be rejectected by the delegate calling -cancel * or returning nil.
* Cancelling the load will simply stop it, but returning nil will * cause it to complete with a redirection failure.
* As a special case, this method may be called with a nil response, * indicating a change of URL made internally by the system rather than * due to a response from the server. */ - (NSURLRequest *) connection: (NSURLConnection *)connection willSendRequest: (NSURLRequest *)request redirectResponse: (NSURLResponse *)response; @end #if OS_API_VERSION(MAC_OS_X_VERSION_10_2,GS_API_LATEST) @protocol NSURLConnectionDataDelegate #if GS_PROTOCOLS_HAVE_OPTIONAL @optional #endif - (NSURLRequest *) connection: (NSURLConnection *)connection willSendRequest: (NSURLRequest *)request redirectResponse: (NSURLResponse *)response; - (void) connection: (NSURLConnection *)connection didReceiveResponse: (NSURLResponse *)response; - (void) connection: (NSURLConnection *) connection didReceiveData: (NSData *)data; - (NSInputStream *) connection: (NSURLConnection *)connection needNewBodyStream: (NSURLRequest *)request; - (void) connection: (NSURLConnection *)connection didSendBodyData: (NSInteger)bytesWritten totalBytesWritten: (NSInteger)totalBytesWritten totalBytesExpectedToWrite: (NSInteger)totalBytesExpectedToWrite; - (NSCachedURLResponse *) connection: (NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse; - (void) connectionDidFinishLoading: (NSURLConnection *)connection; @end #endif /** * An interface to perform synchronous loading of URL requests. */ @interface NSURLConnection (NSURLConnectionSynchronousLoading) /** * Performs a synchronous load of request and returns the * [NSURLResponse] in response.
* Returns the result of the load or nil if the load failed. */ + (NSData *) sendSynchronousRequest: (NSURLRequest *)request returningResponse: (NSURLResponse **)response error: (NSError **)error; @end #if defined(__cplusplus) } #endif #endif #endif gnustep-base-1.29.0/Headers/Foundation/NSURLCredential.h000066400000000000000000000064321435650067400227470ustar00rootroot00000000000000/* Interface for NSURLCredential for GNUstep Copyright (C) 2006 Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 2006 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSURLCredential_h_GNUSTEP_BASE_INCLUDE #define __NSURLCredential_h_GNUSTEP_BASE_INCLUDE #import #if OS_API_VERSION(MAC_OS_X_VERSION_10_2,GS_API_LATEST) && GS_API_VERSION( 11300,GS_API_LATEST) #import #if defined(__cplusplus) extern "C" { #endif @class NSString; /** * Controls how long a credential is retained. */ typedef enum { NSURLCredentialPersistenceNone, /** Don't save at all */ NSURLCredentialPersistenceForSession, /** Save for current session */ NSURLCredentialPersistencePermanent, /** Save forever (on disk) */ NSURLCredentialPersistenceSynchronizable } NSURLCredentialPersistence; /** * Represents a user/password credential */ GS_EXPORT_CLASS @interface NSURLCredential : NSObject { #if GS_EXPOSE(NSURLCredential) void *_NSURLCredentialInternal; #endif } /** * Returns an autoreleased instance initialised using the * -initWithUser:password:persistence: method. */ + (NSURLCredential *) credentialWithUser: (NSString *)user password: (NSString *)password persistence: (NSURLCredentialPersistence)persistence; /** * Determine whether the credential has a password. */ - (BOOL) hasPassword; /** * Initialises and returns the receiver with a user name and password.
* The user identifies the credential and must be specified but the * password may be nil. */ - (id) initWithUser: (NSString *)user password: (NSString *)password persistence: (NSURLCredentialPersistence)persistence; /** * Tests two credentials for equality ... credentials are considered to * be equal if their -user methods return the same value, since you cannot * have more than one credential for a suser within an [NSURLProtectionSpace]. */ - (BOOL) isEqual: (id)other; /** * Returns the password for the receiver.
* May require prompting of the user to authorize retrieval.
* May return nil if retrieval of the password fails (eg authorization * failure) even if the credential actually has a password. Call the * -hasPassword method to determine whether the credential has a * password */ - (NSString *) password; /** * Return the presistence of this credential. */ - (NSURLCredentialPersistence) persistence; /** * Returns the user string for the receiver */ - (NSString *) user; @end #if defined(__cplusplus) } #endif #endif #endif gnustep-base-1.29.0/Headers/Foundation/NSURLCredentialStorage.h000066400000000000000000000065071435650067400242770ustar00rootroot00000000000000/* Interface for NSURLCredentialStorage for GNUstep Copyright (C) 2006 Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 2006 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSURLCredentialStorage_h_GNUSTEP_BASE_INCLUDE #define __NSURLCredentialStorage_h_GNUSTEP_BASE_INCLUDE #import #if OS_API_VERSION(MAC_OS_X_VERSION_10_2,GS_API_LATEST) && GS_API_VERSION( 11300,GS_API_LATEST) #import #if defined(__cplusplus) extern "C" { #endif @class NSDictionary; @class NSString; @class NSURLCredential; @class NSURLProtectionSpace; /** * Notification sent when the set of stored credentials changes. */ GS_EXPORT NSString *const NSURLCredentialStorageChangedNotification; /** * Provides shared storage of credentials. */ GS_EXPORT_CLASS @interface NSURLCredentialStorage : NSObject { #if GS_EXPOSE(NSURLCredentialStorage) void *_NSURLCredentialStorageInternal; #endif } /** * Return the shared credential storage object. */ + (NSURLCredentialStorage *) sharedCredentialStorage; /** * Returns a dictionary of dictionaries ... with [NSURLProtectionSpace] * objects as the keys in the outer dictionary, and values which are * dictionaries of the credentails within each protection space. */ - (NSDictionary *) allCredentials; /** * Returns a dictionary mapping usernames to credentials * for the specified protection space.
* Each username is a unique identifier for a credential * within a protection space. */ - (NSDictionary *) credentialsForProtectionSpace: (NSURLProtectionSpace *)space; /** * Returns the default credential for the specified protection space, or * nil if none is set. */ - (NSURLCredential *) defaultCredentialForProtectionSpace: (NSURLProtectionSpace *)space; /** * Removes the credential from both in-memory and persistent storage * for the specified protection space. */ - (void) removeCredential: (NSURLCredential *)credential forProtectionSpace: (NSURLProtectionSpace *)space; /** * Sets credential in the storage for the protection space specified.
* This replaces any old value with the same username. */ - (void) setCredential: (NSURLCredential *)credential forProtectionSpace: (NSURLProtectionSpace *)space; /** * Sets the default credential for the protection space. Also calls * -setCredential:forProtectionSpace: if the credential has not already * been set in space. */ - (void) setDefaultCredential: (NSURLCredential *)credential forProtectionSpace: (NSURLProtectionSpace *)space; @end #if defined(__cplusplus) } #endif #endif #endif gnustep-base-1.29.0/Headers/Foundation/NSURLDownload.h000066400000000000000000000153451435650067400224470ustar00rootroot00000000000000/* Interface for NSURLDownload for GNUstep Copyright (C) 2006 Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 2006 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSURLDownload_h_GNUSTEP_BASE_INCLUDE #define __NSURLDownload_h_GNUSTEP_BASE_INCLUDE #import #if OS_API_VERSION(MAC_OS_X_VERSION_10_2,GS_API_LATEST) && GS_API_VERSION( 11300,GS_API_LATEST) #import #if defined(__cplusplus) extern "C" { #endif @class NSData; @class NSError; @class NSString; @class NSURLAuthenticationChallenge; @class NSURLRequest; @class NSURLResponse; /** * Handles download to file. */ GS_EXPORT_CLASS @interface NSURLDownload : NSObject { #if GS_EXPOSE(NSURLDownload) void *_NSURLDownloadInternal; #endif } /** * Returns a flag saying whether the class can resume a download * which was decoded with MIMEType.
*/ + (BOOL) canResumeDownloadDecodedWithEncodingMIMEType: (NSString *)MIMEType; /** * Cancels the download and deletes any downloaded file. */ - (void) cancel; /** * Returns a flag saying whether a partially downloaded file should be * deleted on failure ... YES by default. */ - (BOOL) deletesFileUponFailure; /** * Initialises the receiver and start the download process. */ - (id) initWithRequest: (NSURLRequest *)request delegate: (id)delegate; /** * Initialises the receiver with data from a previous partial * download and resumes (or restarts) the downloading process. */ - (id) initWithResumeData: (NSData *)resumeData delegate: (id)delegate path: (NSString *)path; /** * Returns the receiver's request. */ - (NSURLRequest *) request; /** * Returns state data of an incomplete download ... this data should be * sufficient to resume/restart the download using the * -initWithResumeData:delegate:path: method.
* Returns nil if a resume is probably impossible.
* NB. You need to call -setDeletesFileUponFailure: to turn off deletion * if you wish to be able to resume an incomplete download. */ - (NSData *) resumeData; /** * Sets a flag to determine if downloaded file is be deleted upon failure. * This is YES by default and needs to be set to NO if you want to be able * to attempt to resume a failed download. */ - (void) setDeletesFileUponFailure: (BOOL)deletesFileUponFailure; /** * Sets the path to which the file is downloaded.
* May be called (once only) after initialisation of the receiver or when the * delegate receives a -download:decideDestinationWithSuggestedFilename: * message.
* Appends a number to the filename if allowOverwrite is NO and a file * already exists at path.
* See -download:didCreateDestination: also. */ - (void) setDestination: (NSString *)path allowOverwrite: (BOOL)allowOverwrite; @end /** * Protocol for delegate used to report the progress of the download. */ #if OS_API_VERSION(MAC_OS_X_VERSION_10_7, GS_API_LATEST) @protocol NSURLDownloadDelegate #if GS_PROTOCOLS_HAVE_OPTIONAL @optional #else @end @interface NSObject (NSURLDownloadDelegate) #endif #else @interface NSObject (NSURLDownloadDelegate) #endif /** * Called immediately once the download has started. */ - (void) downloadDidBegin: (NSURLDownload *)download; /** * Called when the download completes after having received all data. */ - (void) downloadDidFinish: (NSURLDownload *)download; /** * Called when it's time to establish a name for the downloaded file ... * the delegate may decide a name by inspecting the response.
* The delegate should call -setDestination:allowOverwrite: to set the * filename to be used. */ - (void) download: (NSURLDownload *)download decideDestinationWithSuggestedFilename: (NSString *)filename; /** * Called when authentication of a request is cancelled. */ - (void) download: (NSURLDownload *)download didCancelAuthenticationChallenge: (NSURLAuthenticationChallenge *)challenge; /** * Called when the download has created the downloaded file. */ - (void) download: (NSURLDownload *)download didCreateDestination: (NSString *)path; /** * Called when the download fails. */ - (void) download: (NSURLDownload *)download didFailWithError: (NSError *)error; /** * Called when an authentication challenge is received.
* The delegate should send -useCredential:forAuthenticationChallenge: or * -continueWithoutCredentialForAuthenticationChallenge: or -cancel to * the connection sender when done. */ - (void) download: (NSURLDownload *)download didReceiveAuthenticationChallenge: (NSURLAuthenticationChallenge *)challenge; /** * Called when some data has been received. */ - (void) download: (NSURLDownload *)download didReceiveDataOfLength: (NSUInteger)length; /** * Called when a response is received.
* Multiple responses may be received on the same download (eg with server push) * and the delegate should be prepared to treat each separately. */ - (void) download: (NSURLDownload *)download didReceiveResponse: (NSURLResponse *)response; /** * Called if the download file is encoded ... the delegate should return * YES if the downloaded data is to be decoded, NO otherwise. */ - (BOOL) download: (NSURLDownload *)download shouldDecodeSourceDataOfMIMEType: (NSString *)encodingType; /** * Called when a download is resuming from previously stored data and * a response has been received from the server.
* The startingBytes is the offset from which the downloaded data * will actually commence ... and may be zero if the entire download * must be redone. */ - (void) download: (NSURLDownload *)download willResumeWithResponse: (NSURLResponse *)response fromByte: (long long)startingByte; /** * Called if a new request has to be sent due to redirection.
* Must return the request argument (or a modified copy of it) * to have the process continue. */ - (NSURLRequest *) download: (NSURLDownload *)download willSendRequest: (NSURLRequest *)request redirectResponse: (NSURLResponse *)redirectResponse; @end #if defined(__cplusplus) } #endif #endif #endif gnustep-base-1.29.0/Headers/Foundation/NSURLError.h000066400000000000000000000061041435650067400217620ustar00rootroot00000000000000/* Interface for NSURLError for GNUstep Copyright (C) 2006 Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 2006 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSURLError_h_GNUSTEP_BASE_INCLUDE #define __NSURLError_h_GNUSTEP_BASE_INCLUDE #import #if OS_API_VERSION(MAC_OS_X_VERSION_10_2,GS_API_LATEST) && GS_API_VERSION( 11300,GS_API_LATEST) #import #if defined(__cplusplus) extern "C" { #endif @class NSString; /** * The domain for a URL error. */ GS_EXPORT NSString * const NSURLErrorDomain; /** * Obtain the URL which caused the failure */ GS_EXPORT NSString * const NSErrorFailingURLStringKey; /** * Error codes for URL errors */ enum { NSURLErrorUnknown = -1, NSURLErrorCancelled = -999, NSURLErrorBadURL = -1000, NSURLErrorTimedOut = -1001, NSURLErrorUnsupportedURL = -1002, NSURLErrorCannotFindHost = -1003, NSURLErrorCannotConnectToHost = -1004, NSURLErrorNetworkConnectionLost = -1005, NSURLErrorDNSLookupFailed = -1006, NSURLErrorHTTPTooManyRedirects = -1007, NSURLErrorResourceUnavailable = -1008, NSURLErrorNotConnectedToInternet = -1009, NSURLErrorRedirectToNonExistentLocation = -1010, NSURLErrorBadServerResponse = -1011, NSURLErrorUserCancelledAuthentication = -1012, NSURLErrorUserAuthenticationRequired = -1013, NSURLErrorZeroByteResource = -1014, NSURLErrorFileDoesNotExist = -1100, NSURLErrorFileIsDirectory = -1101, NSURLErrorNoPermissionsToReadFile = -1102, NSURLErrorDataLengthExceedsMaximum = -1103, NSURLErrorSecureConnectionFailed = -1200, NSURLErrorServerCertificateHasBadDate = -1201, NSURLErrorServerCertificateUntrusted = -1202, NSURLErrorServerCertificateHasUnknownRoot = -1203, NSURLErrorServerCertificateNotYetValid = -1204, NSURLErrorClientCertificateRejected = -1205, NSURLErrorCannotLoadFromNetwork = -2000, NSURLErrorCannotCreateFile = -3000, NSURLErrorCannotOpenFile = -3001, NSURLErrorCannotCloseFile = -3002, NSURLErrorCannotWriteToFile = -3003, NSURLErrorCannotRemoveFile = -3004, NSURLErrorCannotMoveFile = -3005, NSURLErrorDownloadDecodingFailedMidStream = -3006, NSURLErrorDownloadDecodingFailedToComplete = -3007 }; #if defined(__cplusplus) } #endif #endif #endif gnustep-base-1.29.0/Headers/Foundation/NSURLHandle.h000066400000000000000000000154021435650067400220650ustar00rootroot00000000000000/* NSURLHandle.h - Class NSURLHandle Copyright (C) 1999 Free Software Foundation, Inc. Written by: Manuel Guesdon Date: Jan 1999 This file is part of the GNUstep Library. 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 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 USA. */ #ifndef __NSURLHandle_h_GNUSTEP_BASE_INCLUDE #define __NSURLHandle_h_GNUSTEP_BASE_INCLUDE #import #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) #import #if defined(__cplusplus) extern "C" { #endif @class NSData; @class NSString; @class NSMutableArray; @class NSMutableData; @class NSURLHandle; @class NSURL; /** * Key for passing to [NSURLHandle]'s propertyForKey.. methods to * obtain status code. */ GS_EXPORT NSString * const NSHTTPPropertyStatusCodeKey; /** * Key for passing to [NSURLHandle]'s propertyForKey.. methods to * obtain status reason. */ GS_EXPORT NSString * const NSHTTPPropertyStatusReasonKey; /** * Key for passing to [NSURLHandle]'s propertyForKey.. methods to * obtain HTTP version supported by server. */ GS_EXPORT NSString * const NSHTTPPropertyServerHTTPVersionKey; /** * Key for passing to [NSURLHandle]'s propertyForKey.. methods to * obtain redirection headers. */ GS_EXPORT NSString * const NSHTTPPropertyRedirectionHeadersKey; /** * Key for passing to [NSURLHandle]'s propertyForKey.. methods to * obtain error page data. */ GS_EXPORT NSString * const NSHTTPPropertyErrorPageDataKey; #if OS_API_VERSION(GS_API_NONE, GS_API_NONE) /** * Key for passing to [NSURLHandle]'s propertyForKey.. methods to * obtain local host. */ GS_EXPORT NSString * const GSHTTPPropertyLocalHostKey; /** * Key for passing to [NSURLHandle]'s propertyForKey.. methods to * obtain method (GET, POST, etc.). */ GS_EXPORT NSString * const GSHTTPPropertyMethodKey; /** * Key for passing to [NSURLHandle]'s propertyForKey.. methods to * obtain proxy host. */ GS_EXPORT NSString * const GSHTTPPropertyProxyHostKey; /** * Key for passing to [NSURLHandle]'s propertyForKey.. methods to * obtain proxy port. */ GS_EXPORT NSString * const GSHTTPPropertyProxyPortKey; /** * Key for passing to [NSURLHandle]'s propertyForKey.. methods to * specify the location of an SSL certificate file. */ GS_EXPORT NSString * const GSHTTPPropertyCertificateFileKey; /** * Key for passing to [NSURLHandle]'s propertyForKey.. methods to * specify the location of an SSL key file. */ GS_EXPORT NSString * const GSHTTPPropertyKeyFileKey; /** * Key for passing to [NSURLHandle]'s propertyForKey.. methods to * specify the password for an SSL key file. */ GS_EXPORT NSString * const GSHTTPPropertyPasswordKey; #endif /** * Enumerated type returned by [NSURLHandle-status]: { NSURLHandleNotLoaded NSURLHandleLoadSucceeded, NSURLHandleLoadInProgress, NSURLHandleLoadFailed } */ enum { NSURLHandleNotLoaded = 0, NSURLHandleLoadSucceeded, NSURLHandleLoadInProgress, NSURLHandleLoadFailed }; typedef NSUInteger NSURLHandleStatus; /** * A protocol to which clients of a handle must conform in order to * receive notification of events on the handle. */ @protocol NSURLHandleClient /** * Sent by the NSURLHandle object when some data becomes available * from the handle. Note that this does not mean that all data has become * available, only that a chunk of data has arrived. */ - (void) URLHandle: (NSURLHandle*)sender resourceDataDidBecomeAvailable: (NSData*)newData; /** * Sent by the NSURLHandle object on resource load failure. * Supplies a human readable failure reason. */ - (void) URLHandle: (NSURLHandle*)sender resourceDidFailLoadingWithReason: (NSString*)reason; /** * Sent by the NSURLHandle object when it begins loading * resource data. */ - (void) URLHandleResourceDidBeginLoading: (NSURLHandle*)sender; /** * Sent by the NSURLHandle object when resource loading is cancelled * by programmatic request (rather than by failure). */ - (void) URLHandleResourceDidCancelLoading: (NSURLHandle*)sender; /** * Sent by the NSURLHandle object when it completes loading * resource data. */ - (void) URLHandleResourceDidFinishLoading: (NSURLHandle*)sender; @end GS_EXPORT_CLASS @interface NSURLHandle : NSObject { #if GS_EXPOSE(NSURLHandle) @protected id _data; NSMutableArray *_clients; NSString *_failure; NSURLHandleStatus _status; #endif } + (NSURLHandle*) cachedHandleForURL: (NSURL*)url; + (BOOL) canInitWithURL: (NSURL*)url; + (void) registerURLHandleClass: (Class)urlHandleSubclass; + (Class) URLHandleClassForURL: (NSURL*)url; - (void) addClient: (id )client; - (NSData*) availableResourceData; - (void) backgroundLoadDidFailWithReason: (NSString*)reason; - (void) beginLoadInBackground; - (void) cancelLoadInBackground; - (void) didLoadBytes: (NSData*)newData loadComplete: (BOOL)loadComplete; - (void) endLoadInBackground; - (NSString*) failureReason; - (void) flushCachedData; - (id) initWithURL: (NSURL*)url cached: (BOOL)cached; - (void) loadInBackground; - (NSData*) loadInForeground; - (id) propertyForKey: (NSString*)propertyKey; - (id) propertyForKeyIfAvailable: (NSString*)propertyKey; - (void) removeClient: (id )client; - (NSData*) resourceData; #if OS_API_VERSION(GS_API_NONE, GS_API_NONE) /** GNUstep extension to turn on debug logging for a handle. Returns the * previous debug setting for the handle. Implemented for http/https only. */ - (int) setDebug: (int)flag; /** GNUstep extension to turn on returning of complete http/https response * even when the status code is not in the 200 to 299 success range. */ - (void) setReturnAll: (BOOL)flag; /** GNUstep extension to change the URL that the handle sends requests to. * Implemented for http/https only. */ - (void) setURL: (NSURL*)newUrl; #endif - (NSURLHandleStatus) status; - (BOOL) writeData: (NSData*)data; - (BOOL) writeProperty: (id)propertyValue forKey: (NSString*)propertyKey; @end #if defined(__cplusplus) } #endif #endif #endif /* __NSURLHandle_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSURLProtectionSpace.h000066400000000000000000000111211435650067400237660ustar00rootroot00000000000000/* Interface for NSURLProtectionSpace for GNUstep Copyright (C) 2006 Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 2006 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSURLProtectionSpace_h_GNUSTEP_BASE_INCLUDE #define __NSURLProtectionSpace_h_GNUSTEP_BASE_INCLUDE #import #if OS_API_VERSION(MAC_OS_X_VERSION_10_2,GS_API_LATEST) && GS_API_VERSION( 11300,GS_API_LATEST) #import #if defined(__cplusplus) extern "C" { #endif @class NSString; GS_EXPORT NSString * const NSURLProtectionSpaceFTPProxy; /** An FTP proxy */ GS_EXPORT NSString * const NSURLProtectionSpaceHTTPProxy; /** An HTTP proxy */ GS_EXPORT NSString * const NSURLProtectionSpaceHTTPSProxy; /** An HTTPS proxy */ GS_EXPORT NSString * const NSURLProtectionSpaceSOCKSProxy; /** A SOCKS proxy */ /** Default authentication (Basic) */ GS_EXPORT NSString * const NSURLAuthenticationMethodDefault; /** HTML form authentication */ GS_EXPORT NSString * const NSURLAuthenticationMethodHTMLForm; /** HTTP Basic authentication */ GS_EXPORT NSString * const NSURLAuthenticationMethodHTTPBasic; /** HTTP Digest authentication */ GS_EXPORT NSString * const NSURLAuthenticationMethodHTTPDigest; #if OS_API_VERSION(MAC_OS_X_VERSION_10_5,GS_API_LATEST) && GS_API_VERSION( 11300,GS_API_LATEST) GS_EXPORT NSString * const NSURLAuthenticationMethodNTLM; GS_EXPORT NSString * const NSURLAuthenticationMethodNegotiate; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_6,GS_API_LATEST) && GS_API_VERSION( 11300,GS_API_LATEST) GS_EXPORT NSString * const NSURLAuthenticationMethodClientCertificate; GS_EXPORT NSString * const NSURLAuthenticationMethodServerTrust; #endif /** * Class to encapsulate a protection space ... where authentication is * required. */ GS_EXPORT_CLASS @interface NSURLProtectionSpace : NSObject { #if GS_EXPOSE(NSURLProtectionSpace) void *_NSURLProtectionSpaceInternal; #endif } /** * Returns the authentication method used for this protection space. */ - (NSString *) authenticationMethod; /** * Returns the host (or proxy host) set in the receiver. */ - (NSString *) host; /** * Initialises the receiver with host, port, and protocol identifying the * protection space. For some protocols the realm identifies a space * within the host, for others it may be nil. */ - (id) initWithHost: (NSString *)host port: (NSInteger)port protocol: (NSString *)protocol realm: (NSString *)realm authenticationMethod: (NSString *)authenticationMethod; /** * This is like -initWithHost:port:protocol:realm:authenticationMethod: * except that it uses a proxy host and proxy type rather than an actual * host and a protocol. */ - (id) initWithProxyHost: (NSString *)host port: (NSInteger)port type: (NSString *)type realm: (NSString *)realm authenticationMethod: (NSString *)authenticationMethod; /** * Returns a flag to indicate whether this protection space is on a proxy * server or not. */ - (BOOL) isProxy; /** * Returns the port set for this receiver or zero if none was set. */ - (NSInteger) port; /** * Returns the protocol of the receiver or nil if it is a proxy. */ - (NSString *) protocol; /** * Returns the proxy type set for the receiver or nil if it's not a proxy. */ - (NSString *) proxyType; /** * Returns the realm (or nil) which was set in the receiver upon initialisation. */ - (NSString *) realm; /** * Returns a flag to indicate whether the password for this protection space * will be sent over a secure mechanism. */ - (BOOL) receivesCredentialSecurely; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6,GS_API_LATEST) && GS_API_VERSION( 11300,GS_API_LATEST) #if GS_HAS_DECLARED_PROPERTIES @property (readonly, copy) NSArray *distinguishedNames; #else - (NSArray *) distinguishedNames; #endif #endif @end #if defined(__cplusplus) } #endif #endif #endif gnustep-base-1.29.0/Headers/Foundation/NSURLProtocol.h000066400000000000000000000161671435650067400225040ustar00rootroot00000000000000/* Interface for NSURLProtocol for GNUstep Copyright (C) 2006 Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 2006 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSURLProtocol_h_GNUSTEP_BASE_INCLUDE #define __NSURLProtocol_h_GNUSTEP_BASE_INCLUDE #import #if OS_API_VERSION(MAC_OS_X_VERSION_10_2,GS_API_LATEST) && GS_API_VERSION( 11300,GS_API_LATEST) #import #if defined(__cplusplus) extern "C" { #endif #import @class NSCachedURLResponse; @class NSError; @class NSMutableURLRequest; @class NSURLAuthenticationChallenge; @class NSURLConnection; @class NSURLProtocol; @class NSURLRequest; @class NSURLResponse; @class NSURLSessionTask; /** * Defines the API for NSURLProtocol loading */ @protocol NSURLProtocolClient /** * Informs a client that a cached response is valid. */ - (void) URLProtocol: (NSURLProtocol *)protocol cachedResponseIsValid: (NSCachedURLResponse *)cachedResponse; /** * Informs a client that loading of a request has failed. */ - (void) URLProtocol: (NSURLProtocol *)protocol didFailWithError: (NSError *)error; /** * Informs a client that data has been loaded. Only new data since the * last call to this method must be provided. */ - (void) URLProtocol: (NSURLProtocol *)protocol didLoadData: (NSData *)data; /** * Informs a client that an authentication challenge has been received. */ - (void) URLProtocol: (NSURLProtocol *)protocol didReceiveAuthenticationChallenge: (NSURLAuthenticationChallenge *)challenge; /** * Informs a client that a response for the current load has been created.
* Also supplies the policy to be used for caching the response. */ - (void) URLProtocol: (NSURLProtocol *)protocol didReceiveResponse: (NSURLResponse *)response cacheStoragePolicy: (NSURLCacheStoragePolicy)policy; /** * Informs a client that a redirect has occurred.
*/ - (void) URLProtocol: (NSURLProtocol *)protocol wasRedirectedToRequest: (NSURLRequest *)request redirectResponse: (NSURLResponse *)redirectResponse; /** * Informs a client that loading of a request has successfully finished. */ - (void) URLProtocolDidFinishLoading: (NSURLProtocol *)protocol; /** * Informs a client that an authentication challenge has been cancelled. */ - (void) URLProtocol: (NSURLProtocol *)protocol didCancelAuthenticationChallenge: (NSURLAuthenticationChallenge *)challenge; @end /** *

Subclasses of NSURLProtocol implement basic handling of URL * loading for specific protocols. The NSURLProtocol class * itsself is a semi-abstract class giving the essential * structure for the subclasses. *

*

You never instantiate NSURLProtocol yourself ... it should only * ever be done by other classes within the URL loading system. *

*/ GS_EXPORT_CLASS @interface NSURLProtocol : NSObject { #if GS_EXPOSE(NSURLProtocol) void *_NSURLProtocolInternal; #endif } /** * Allows subclasses to provide access to proptocol specific * properties, returning the property of request stored by the * name key or nil if no property had been stored using that * key in the request. */ + (id) propertyForKey: (NSString *)key inRequest: (NSURLRequest *)request; /** * Registers the specified class so that it can be used to load requests.
* When the system is determining which class to use to handle a * request it examines them in a most recently registered first order.
* The +canInitWithRequest: method is used to determine whether a class * may be used to handle a particular request or not. * Returns YES if registered (ie the class is an NSURLProtocol subclass), * NO otherwise. */ + (BOOL) registerClass: (Class)protocolClass; /** * Allows subclasses to provide a way to set protocol specific properties, * setting the property named key to value in the request. */ + (void) setProperty: (id)value forKey: (NSString *)key inRequest: (NSMutableURLRequest *)request; /** * Unregisters a class which was previously registered using the * +registerClass: method. */ + (void) unregisterClass: (Class)protocolClass; /** * Returns the cachedResponse of the receiver. */ - (NSCachedURLResponse *) cachedResponse; /** * Returns the client associated with the receiver. */ - (id ) client; /** * Initialises the receiver with request, cachedResponse and client.
* The cachedResponse may be the result of a previous load of the * request (in which case the protocol may validate and use it).
* The client is the object which receives messages about the progress * of the load. This is retained by the protocl instance and is released * once the last message has been sent to it. */ - (id) initWithRequest: (NSURLRequest *)request cachedResponse: (NSCachedURLResponse *)cachedResponse client: (id )client; - (instancetype) initWithTask: (NSURLSessionTask*)task cachedResponse: (NSCachedURLResponse*)cachedResponse client: (id)client; /** * Returns the request handled by the receiver. */ - (NSURLRequest *) request; /** * Returns the task handled by the receiver. */ - (NSURLSessionTask *) task; @end /** * This category lists the methods which a subclass must implement * in order to produce a working protocol. */ @interface NSURLProtocol (Subclassing) /** * This method is called to decide whether a class can deal with * the specified request. The abstract class implementation * raises an exception. */ + (BOOL) canInitWithRequest: (NSURLRequest *)request; /** * Returns the 'canonical' version of the request.
* The canonical form is used to look up requests in the cache by * checking for equality.
* The abnstract class implementation simply returns request. */ + (NSURLRequest *) canonicalRequestForRequest: (NSURLRequest *)request; /** * Compares two requests for equivalence for caching purposes.
* The abstract class implementaton just uses [NSObject-isEqual:] */ + (BOOL) requestIsCacheEquivalent: (NSURLRequest *)a toRequest: (NSURLRequest *)b; /** * Starts loading of a request. */ - (void) startLoading; /** * Stops loading of a request (eg when the load is cancelled). */ - (void) stopLoading; @end #if defined(__cplusplus) } #endif #endif #endif gnustep-base-1.29.0/Headers/Foundation/NSURLRequest.h000066400000000000000000000241401435650067400223210ustar00rootroot00000000000000/* Interface for NSURLRequest for GNUstep Copyright (C) 2006 Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 2006 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSURLRequest_h_GNUSTEP_BASE_INCLUDE #define __NSURLRequest_h_GNUSTEP_BASE_INCLUDE #import #if OS_API_VERSION(MAC_OS_X_VERSION_10_2,GS_API_LATEST) && GS_API_VERSION( 11300,GS_API_LATEST) #import #if defined(__cplusplus) extern "C" { #endif @class NSData; @class NSDate; @class NSDictionary; @class NSInputStream; @class NSString; @class NSURL; enum { NSURLRequestUseProtocolCachePolicy = 0, NSURLRequestReloadIgnoringLocalCacheData = 1, NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4, NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData, NSURLRequestReturnCacheDataElseLoad = 2, NSURLRequestReturnCacheDataDontLoad = 3, NSURLRequestReloadRevalidatingCacheData = 5 }; /** * * NSURLRequestUseProtocolCachePolicy * * Says that any protocol specific cache policy should be * used ... this is the default. * * NSURLRequestReloadIgnoringCacheData * * Says the data should be re-loaded from source rather * than any cached data being used, irrespective of any * protocol standard. * * NSURLRequestReturnCacheDataElseLoad * * Says to use cached data if any is available, but to * load from source if the cache is empty. Ignores any * protocol specific logic (like cache aging). * * NSURLRequestReturnCacheDataDontLoad * * Says to use cached data if any is available, but to * return nil without loading if the cache is empty. * * */ typedef NSUInteger NSURLRequestCachePolicy; #if OS_API_VERSION(MAC_OS_X_VERSION_10_7,GS_API_LATEST) enum { NSURLNetworkServiceTypeDefault = 0, // Standard internet traffic NSURLNetworkServiceTypeVoIP = 1, // Voice over IP control traffic NSURLNetworkServiceTypeVideo = 2, // Video traffic NSURLNetworkServiceTypeBackground = 3, // Background traffic NSURLNetworkServiceTypeVoice = 4, // Voice data #if OS_API_VERSION(MAC_OS_X_VERSION_10_12,GS_API_LATEST) NSURLNetworkServiceTypeCallSignaling = 11 // Call Signaling - enumeration cases #endif }; /** * * NSURLNetworkServiceTypeDefault * * Specifies standard network traffic. Most connections should be made using this service type * this is the default. * * NSURLNetworkServiceTypeVoIP * * Specifies that the request is for VoIP traffic. * * NSURLNetworkServiceTypeVideo * * Specifies that the request is for video traffic. * * NSURLNetworkServiceTypeBackground * * Specifies that the request is for background traffic. * * NSURLNetworkServiceTypeVoice * * Specifies that the request is for voice traffic. * * NSURLNetworkServiceTypeCallSignaling * * Call Signaling - enumeration cases. * * */ typedef NSUInteger NSURLRequestNetworkServiceType; #endif /** * This class encapsulates information about a request to load a * URL, how to cache the results, and when to deal with a slow/hung * load process by timing out. */ GS_EXPORT_CLASS @interface NSURLRequest : NSObject { #if GS_EXPOSE(NSURLRequest) void *_NSURLRequestInternal; #endif } /* * Returns an autoreleased instance initialised with the specified URL * and with the default cache policy (NSURLRequestUseProtocolCachePolicy) * and a sixty second timeout. */ + (instancetype) requestWithURL: (NSURL *)URL; /** * Returns an autoreleased instance initialised with the specified URL, * cachePolicy, and timeoutInterval. */ + (instancetype) requestWithURL: (NSURL *)URL cachePolicy: (NSURLRequestCachePolicy)cachePolicy timeoutInterval: (NSTimeInterval)timeoutInterval; /** * Returns the cache policy associated with the receiver. */ - (NSURLRequestCachePolicy) cachePolicy; /** * Initialises the reveiver with the specified URL * and with the default cache policy (NSURLRequestUseProtocolCachePolicy) * and a sixty second timeout. */ - (instancetype) initWithURL: (NSURL *)URL; /** * Initialises the receiver with the specified URL, * cachePolicy, and timeoutInterval. */ - (instancetype) initWithURL: (NSURL *)URL cachePolicy: (NSURLRequestCachePolicy)cachePolicy timeoutInterval: (NSTimeInterval)timeoutInterval; /** * Returns the main document URL for the receiver.
* Currently unused.
* This is intended for use with frames and similar situations where * a main document has a large number of subsidiary documents. */ - (NSURL *) mainDocumentURL; /** * Returns the timeout interval associated with the receiver.
* This is a value in seconds specifying how long the load process * may be inactive (waiting for data to arrive from the server) * before the load is mconsidered to have failed due to a timeout. */ - (NSTimeInterval) timeoutInterval; /** * Returns the URL associated with the receiver. */ - (NSURL *) URL; @end /** */ GS_EXPORT_CLASS @interface NSMutableURLRequest : NSURLRequest /** * Sets the receiver's cache policy. */ - (void) setCachePolicy: (NSURLRequestCachePolicy)cachePolicy; /** * Sets the receiver's main document. */ - (void) setMainDocumentURL: (NSURL *)URL; /** * Sets the receiver's timeout policy. */ - (void) setTimeoutInterval: (NSTimeInterval)seconds; /** * Sets the receiver's URL */ - (void) setURL: (NSURL *)URL; @end /** * HTTP specific additions to NSURLRequest */ @interface NSURLRequest (NSHTTPURLRequest) /** * Returns a dictionary of the HTTP header fields associated with the * receiver. */ - (NSDictionary *) allHTTPHeaderFields; /** * Returns the body of the reques ... this is the data sent in a POST * request. */ - (NSData *) HTTPBody; #if OS_API_VERSION(MAC_OS_X_VERSION_10_4,GS_API_LATEST) /** * Returns the currently set stream (if any) to be used to provide data * to send as the request body.
* Of course, any attempt to modify this stream may mess up the load * operation in progress. */ - (NSInputStream *) HTTPBodyStream; #endif /** * Returns the HTTP method assiciated with the receiver. */ - (NSString *) HTTPMethod; /** * Returns a flag indicating whether this request should use standard * cookie handling (sending of cookies with the request and storing * any cookies returned in the response. */ - (BOOL) HTTPShouldHandleCookies; /** * Returns the value for a particular HTTP header field (by case * insensitive comparison) or nil if no such header is set. */ - (NSString *) valueForHTTPHeaderField: (NSString *)field; @end /** */ @interface NSMutableURLRequest (NSMutableHTTPURLRequest) /** * Appends the value to the specified header field, automatically inserting * a comman field delimiter if necessary. */ - (void) addValue: (NSString *)value forHTTPHeaderField: (NSString *)field; /** * Sets all the string values in the supplied headerFields * dictionary as header values in the receiver.
* Non-string values are ignored. */ - (void) setAllHTTPHeaderFields: (NSDictionary *)headerFields; #if OS_API_VERSION(MAC_OS_X_VERSION_10_4,GS_API_LATEST) /** * Sets the request body to be the contents of the given stream.
* The stream should be unopened when it is set, and the load process * for the request will open the stream and read its entire content * forwarding it to the remote server.
* Clears any value previously set by -setHTTPBody: or -setHTTPBodyStream: */ - (void) setHTTPBodyStream: (NSInputStream *)inputStream; #endif /** * Sets the data to be sent as the body of the HTTP request.
* Clears any value previously set by -setHTTPBodyStream: or -setHTTPBody: */ - (void) setHTTPBody: (NSData *)data; /** * Sets the method of the receiver. */ - (void) setHTTPMethod: (NSString *)method; /** * Sets a flag to say whether cookies should automatically be added * to the request and whether cookies in the response should be used. */ - (void) setHTTPShouldHandleCookies: (BOOL)should; /** * Sets the value for the sapecified header field, replacing any * previously set value. */ - (void) setValue: (NSString *)value forHTTPHeaderField: (NSString *)field; @end @protocol GSLogDelegate; @interface NSMutableURLRequest (GNUstep) /** Sets a flag to turn on low level debug logging for this request and the * corresponding response. The previous vaue of the setting is returned. */ - (int) setDebug: (int)d; /** Sets a delegate object to override logging of low level I/O of the * request as it is sent and the corresponding response as it arrives.
* The delegate object is not retained, so it is the responsibility of the * caller to ensure that it persists until all I/O has completed.
* This has no effect unless debug is turned on, but if debug is turned on * it permits the delegate to override the default behavior of writing the * data to stderr. */ - (id) setDebugLogDelegate: (id)d; @end #if defined(__cplusplus) } #endif #endif #endif gnustep-base-1.29.0/Headers/Foundation/NSURLResponse.h000066400000000000000000000070001435650067400224630ustar00rootroot00000000000000/* Interface for NSURLResponse for GNUstep Copyright (C) 2006 Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 2006 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSURLResponse_h_GNUSTEP_BASE_INCLUDE #define __NSURLResponse_h_GNUSTEP_BASE_INCLUDE #import #if OS_API_VERSION(MAC_OS_X_VERSION_10_2,GS_API_LATEST) #import #if defined(__cplusplus) extern "C" { #endif @class NSDictionary; @class NSString; @class NSURL; #define NSURLResponseUnknownLength ((long long)-1) /** * The response to an NSURLRequest */ GS_EXPORT_CLASS @interface NSURLResponse : NSObject { #if GS_EXPOSE(NSURLResponse) void *_NSURLResponseInternal; #endif } /** * Returns the expected content length of the receiver or -1 if * there is no idea of what the content length might be.
* This value is advisory, not a definitive length. */ - (long long) expectedContentLength; /** * Initialises the receiver with the URL, MIMEType, expected length and * text encoding name provided. */ - (id) initWithURL: (NSURL *)URL MIMEType: (NSString *)MIMEType expectedContentLength: (NSInteger)length textEncodingName: (NSString *)name; #if OS_API_VERSION(MAC_OS_X_VERSION_10_7,GS_API_LATEST) /** * Initialises the receiver with the URL, statusCode, HTTPVersion, and * headerFields provided. */ - (id) initWithURL: (NSURL*)URL statusCode: (NSInteger)statusCode HTTPVersion: (NSString*)HTTPVersion headerFields: (NSDictionary*)headerFields; #endif /** * Returns the receiver's MIME type. */ - (NSString *) MIMEType; /** * Returns a suggested file name for storing the response data, with * suggested names being found in the following order:
* * content-disposition header * last path component of URL * host name from URL * 'unknown' * * If possible, an extension based on the MIME type of the response * is also appended.
* The result should always be a valid file name. */ - (NSString *) suggestedFilename; /** * Returns the name of the character set used where response data is text */ - (NSString *) textEncodingName; /** * Returns the receiver's URL. */ - (NSURL *) URL; @end /** * HTTP specific additions to an NSURLResponse */ GS_EXPORT_CLASS @interface NSHTTPURLResponse : NSURLResponse /** * Returns a string representation of a status code. */ + (NSString *) localizedStringForStatusCode: (NSInteger)statusCode; /** * Returns a dictionary containing all the HTTP header fields. */ - (NSDictionary *) allHeaderFields; /** * Returns the HTTP status code for the response. */ - (NSInteger) statusCode; @end #if defined(__cplusplus) } #endif #endif #endif gnustep-base-1.29.0/Headers/Foundation/NSURLSession.h000066400000000000000000000367161435650067400223300ustar00rootroot00000000000000#ifndef __NSURLSession_h_GNUSTEP_BASE_INCLUDE #define __NSURLSession_h_GNUSTEP_BASE_INCLUDE #import #import #import #if GS_HAVE_NSURLSESSION #if OS_API_VERSION(MAC_OS_X_VERSION_10_9,GS_API_LATEST) @protocol NSURLSessionDelegate; @protocol NSURLSessionTaskDelegate; @class GSMultiHandle; @class GSURLSessionTaskBody; @class NSError; @class NSHTTPURLResponse; @class NSOperationQueue; @class NSURL; @class NSURLAuthenticationChallenge; @class NSURLCache; @class NSURLCredential; @class NSURLCredentialStorage; @class NSURLRequest; @class NSURLResponse; @class NSURLSessionConfiguration; @class NSURLSessionDataTask; @class NSURLSessionDownloadTask; /** * NSURLSession is a replacement API for NSURLConnection. It provides * options that affect the policy of, and various aspects of the * mechanism by which NSURLRequest objects are retrieved from the * network.
* * An NSURLSession may be bound to a delegate object. The delegate is * invoked for certain events during the lifetime of a session. * * NSURLSession instances are threadsafe. * * An NSURLSession creates NSURLSessionTask objects which represent the * action of a resource being loaded. * * NSURLSessionTask objects are always created in a suspended state and * must be sent the -resume message before they will execute. * * Subclasses of NSURLSessionTask are used to syntactically * differentiate between data and file downloads. * * An NSURLSessionDataTask receives the resource as a series of calls to * the URLSession:dataTask:didReceiveData: delegate method. This is type of * task most commonly associated with retrieving objects for immediate parsing * by the consumer. */ GS_EXPORT_CLASS @interface NSURLSession : NSObject { NSOperationQueue *_delegateQueue; id _delegate; NSURLSessionConfiguration *_configuration; NSString *_sessionDescription; GSMultiHandle *_multiHandle; } /* * Customization of NSURLSession occurs during creation of a new session. * If you do specify a delegate, the delegate will be retained until after * the delegate has been sent the URLSession:didBecomeInvalidWithError: message. */ + (NSURLSession*) sessionWithConfiguration: (NSURLSessionConfiguration*)configuration delegate: (id )delegate delegateQueue: (NSOperationQueue*)queue; - (NSOperationQueue*) delegateQueue; - (id ) delegate; - (NSURLSessionConfiguration*) configuration; - (NSString*) sessionDescription; - (void) setSessionDescription: (NSString*)sessionDescription; /* -finishTasksAndInvalidate returns immediately and existing tasks will be * allowed to run to completion. New tasks may not be created. The session * will continue to make delegate callbacks until * URLSession:didBecomeInvalidWithError: has been issued. * * When invalidating a background session, it is not safe to create another * background session with the same identifier until * URLSession:didBecomeInvalidWithError: has been issued. */ - (void) finishTasksAndInvalidate; /* -invalidateAndCancel acts as -finishTasksAndInvalidate, but issues * -cancel to all outstanding tasks for this session. Note task * cancellation is subject to the state of the task, and some tasks may * have already have completed at the time they are sent -cancel. */ - (void) invalidateAndCancel; /* * NSURLSessionTask objects are always created in a suspended state and * must be sent the -resume message before they will execute. */ /* Creates a data task with the given request. * The request may have a body stream. */ - (NSURLSessionDataTask*) dataTaskWithRequest: (NSURLRequest*)request; /* Creates a data task to retrieve the contents of the given URL. */ - (NSURLSessionDataTask*) dataTaskWithURL: (NSURL*)url; /* Creates a download task with the given request. */ - (NSURLSessionDownloadTask *) downloadTaskWithRequest: (NSURLRequest *)request; /* Creates a download task to download the contents of the given URL. */ - (NSURLSessionDownloadTask *) downloadTaskWithURL: (NSURL *)url; @end typedef NS_ENUM(NSUInteger, NSURLSessionTaskState) { /* The task is currently being serviced by the session */ NSURLSessionTaskStateRunning = 0, NSURLSessionTaskStateSuspended = 1, /* The task has been told to cancel. * The session will receive URLSession:task:didCompleteWithError:. */ NSURLSessionTaskStateCanceling = 2, /* The task has completed and the session will receive no more * delegate notifications */ NSURLSessionTaskStateCompleted = 3, }; /* * NSURLSessionTask - a cancelable object that refers to the lifetime * of processing a given request. */ GS_EXPORT_CLASS @interface NSURLSessionTask : NSObject { /** An identifier for this task, assigned by and unique * to the owning session */ NSUInteger _taskIdentifier; /** The request this task was created to handle. */ NSURLRequest *_originalRequest; /** The request this task is currently handling. This may differ from * originalRequest due to http server redirection */ NSURLRequest *_currentRequest; /** The response to the current request, which may be nil if no response * has been received */ NSURLResponse *_response; /** number of body bytes already received */ int64_t _countOfBytesReceived; /** number of body bytes already sent */ int64_t _countOfBytesSent; /** number of body bytes we expect to send, derived from * the Content-Length of the HTTP request */ int64_t _countOfBytesExpectedToSend; /** number of byte bytes we expect to receive, usually derived from the * Content-Length header of an HTTP response. */ int64_t _countOfBytesExpectedToReceive; /** a description of the current task for diagnostic purposes */ NSString *_taskDescription; /** The current state of the task within the session. */ NSURLSessionTaskState _state; /** The error, if any, delivered via -URLSession:task:didCompleteWithError: * This is nil until an error has occured. */ NSError *_error; /** The dispatch queue used to handle this request/response. * This is actualy a libdispatch queue of type dispatch_queue_t, but on all * known implementations this is a pointer, so void* is the correct size. */ void *_workQueue; NSUInteger _suspendCount; GSURLSessionTaskBody *_knownBody; } - (NSUInteger) taskIdentifier; - (NSURLRequest*) originalRequest; - (NSURLRequest*) currentRequest; - (NSURLResponse*) response; - (void) setResponse: (NSURLResponse*)response; - (int64_t) countOfBytesReceived; - (int64_t) countOfBytesSent; - (int64_t) countOfBytesExpectedToSend; - (int64_t) countOfBytesExpectedToReceive; - (NSString*) taskDescription; - (void) setTaskDescription: (NSString*)taskDescription; - (NSURLSessionTaskState) state; - (NSError*) error; - (NSURLSession*) session; /* -cancel returns immediately, but marks a task as being canceled. * The task will signal -URLSession:task:didCompleteWithError: with an * error value of { NSURLErrorDomain, NSURLErrorCancelled }. In some * cases, the task may signal other work before it acknowledges the * cancelation. -cancel may be sent to a task that has been suspended. */ - (void) cancel; /* * Suspending a task will prevent the NSURLSession from continuing to * load data. There may still be delegate calls made on behalf of * this task (for instance, to report data received while suspending) * but no further transmissions will be made on behalf of the task * until -resume is sent. The timeout timer associated with the task * will be disabled while a task is suspended. */ - (void) suspend; - (void) resume; @end GS_EXPORT_CLASS @interface NSURLSessionDataTask : NSURLSessionTask @end GS_EXPORT_CLASS @interface NSURLSessionUploadTask : NSURLSessionDataTask @end GS_EXPORT_CLASS @interface NSURLSessionDownloadTask : NSURLSessionTask @end #if OS_API_VERSION(MAC_OS_X_VERSION_10_11,GS_API_LATEST) GS_EXPORT_CLASS @interface NSURLSessionStreamTask : NSURLSessionTask @end #endif /* * Configuration options for an NSURLSession. When a session is * created, a copy of the configuration object is made - you cannot * modify the configuration of a session after it has been created. */ GS_EXPORT_CLASS @interface NSURLSessionConfiguration : NSObject { NSURLCache *_URLCache; NSURLRequestCachePolicy _requestCachePolicy; NSArray *_protocolClasses; NSInteger _HTTPMaximumConnectionLifetime; NSInteger _HTTPMaximumConnectionsPerHost; BOOL _HTTPShouldUsePipelining; NSHTTPCookieAcceptPolicy _HTTPCookieAcceptPolicy; NSHTTPCookieStorage *_HTTPCookieStorage; NSURLCredentialStorage *_URLCredentialStorage; BOOL _HTTPShouldSetCookies; NSDictionary *_HTTPAdditionalHeaders; } - (NSURLRequest*) configureRequest: (NSURLRequest*)request; @property (class, readonly, strong) NSURLSessionConfiguration *defaultSessionConfiguration; - (NSDictionary*) HTTPAdditionalHeaders; - (NSHTTPCookieAcceptPolicy) HTTPCookieAcceptPolicy; - (NSHTTPCookieStorage*) HTTPCookieStorage; #if !NO_GNUSTEP - (NSInteger) HTTPMaximumConnectionLifetime; #endif - (NSInteger) HTTPMaximumConnectionsPerHost; - (BOOL) HTTPShouldSetCookies; - (BOOL) HTTPShouldUsePipelining; - (NSArray*) protocolClasses; - (NSURLRequestCachePolicy) requestCachePolicy; - (void) setHTTPAdditionalHeaders: (NSDictionary*)headers; - (void) setHTTPCookieAcceptPolicy: (NSHTTPCookieAcceptPolicy)policy; - (void) setHTTPCookieStorage: (NSHTTPCookieStorage*)storage; #if !NO_GNUSTEP /** Permits a session to be configured so that older connections are reused. * A value of zero or less uses the default behavior where connections are * reused as long as they are not older than 118 seconds, which is reasonable * for the vast majority if situations. */ - (void) setHTTPMaximumConnectionLifetime: (NSInteger)n; #endif - (void) setHTTPMaximumConnectionsPerHost: (NSInteger)n; - (void) setHTTPShouldSetCookies: (BOOL)flag; - (void) setHTTPShouldUsePipelining: (BOOL)flag; - (void) setRequestCachePolicy: (NSURLRequestCachePolicy)policy; - (void) setURLCache: (NSURLCache*)cache; - (void) setURLCredentialStorage: (NSURLCredentialStorage*)storage; - (NSURLCache*) URLCache; - (NSURLCredentialStorage*) URLCredentialStorage; @end typedef NS_ENUM(NSInteger, NSURLSessionAuthChallengeDisposition) { NSURLSessionAuthChallengeUseCredential = 0, NSURLSessionAuthChallengePerformDefaultHandling = 1, NSURLSessionAuthChallengeCancelAuthenticationChallenge = 2, NSURLSessionAuthChallengeRejectProtectionSpace = 3 }; typedef NS_ENUM(NSInteger, NSURLSessionResponseDisposition) { NSURLSessionResponseCancel = 0, NSURLSessionResponseAllow = 1, NSURLSessionResponseBecomeDownload = 2, NSURLSessionResponseBecomeStream = 3 }; @protocol NSURLSessionDelegate @optional /* The last message a session receives. A session will only become * invalid because of a systemic error or when it has been * explicitly invalidated, in which case the error parameter will be nil. */ - (void) URLSession: (NSURLSession*)session didBecomeInvalidWithError: (NSError*)error; /* Implementing this method permits a delegate to provide authentication * credentials in response to a challenge from the remote server. */ - (void) URLSession: (NSURLSession*)session didReceiveChallenge: (NSURLAuthenticationChallenge*)challenge completionHandler: (void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))handler; @end @protocol NSURLSessionTaskDelegate @optional /* Sent as the last message related to a specific task. Error may be * nil, which implies that no error occurred and this task is complete. */ - (void ) URLSession: (NSURLSession*)session task: (NSURLSessionTask*)task didCompleteWithError: (NSError*)error; /* Called to request authentication credentials from the delegate when * an authentication request is received from the server which is specific * to this task. */ - (void) URLSession: (NSURLSession*)session task: (NSURLSessionTask*)task didReceiveChallenge: (NSURLAuthenticationChallenge*)challenge completionHandler: (void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))handler; /* Periodically informs the delegate of the progress of sending body content * to the server. */ - (void) URLSession: (NSURLSession*)session task: (NSURLSessionTask*)task didSendBodyData: (int64_t)bytesSent totalBytesSent: (int64_t)totalBytesSent totalBytesExpectedToSend: (int64_t)totalBytesExpectedToSend; /* An HTTP request is attempting to perform a redirection to a different * URL. You must invoke the completion routine to allow the * redirection, allow the redirection with a modified request, or * pass nil to the completionHandler to cause the body of the redirection * response to be delivered as the payload of this request. The default * is to follow redirections. * */ - (void) URLSession: (NSURLSession*)session task: (NSURLSessionTask*)task willPerformHTTPRedirection: (NSHTTPURLResponse*)response newRequest: (NSURLRequest*)request completionHandler: (void (^)(NSURLRequest*))completionHandler; @end @protocol NSURLSessionDataDelegate @optional /* Sent when data is available for the delegate to consume. */ - (void) URLSession: (NSURLSession*)session dataTask: (NSURLSessionDataTask*)dataTask didReceiveData: (NSData*)data; /** Informs the delegate of a response. This message is sent when all the * response headers have arrived, before the body of the response arrives. */ - (void) URLSession: (NSURLSession*)session dataTask: (NSURLSessionDataTask*)dataTask didReceiveResponse: (NSURLResponse*)response completionHandler: (void (^)(NSURLSessionResponseDisposition disposition))completionHandler; @end @protocol NSURLSessionDownloadDelegate /* Sent when a download task that has completed a download. The delegate should * copy or move the file at the given location to a new location as it will be * removed when the delegate message returns. URLSession:task:didCompleteWithError: will * still be called. */ - (void) URLSession: (NSURLSession *)session downloadTask: (NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL: (NSURL *)location; @optional /* Sent periodically to notify the delegate of download progress. */ - (void) URLSession: (NSURLSession *)session downloadTask: (NSURLSessionDownloadTask *)downloadTask didWriteData: (int64_t)bytesWritten totalBytesWritten: (int64_t)totalBytesWritten totalBytesExpectedToWrite: (int64_t)totalBytesExpectedToWrite; /* Sent when a download has been resumed. If a download failed with an * error, the -userInfo dictionary of the error will contain an * NSURLSessionDownloadTaskResumeData key, whose value is the resume * data. */ - (void) URLSession: (NSURLSession *)session downloadTask: (NSURLSessionDownloadTask *)downloadTask didResumeAtOffset: (int64_t)fileOffset expectedTotalBytes: (int64_t)expectedTotalBytes; @end #endif #endif #endif gnustep-base-1.29.0/Headers/Foundation/NSUUID.h000066400000000000000000000033001435650067400210470ustar00rootroot00000000000000/* Interface for NSUUID for GNUStep Copyright (C) 2013 Free Software Foundation, Inc. Written by: Graham Lee Created: 2013 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSUUID_h_GNUSTEP_BASE_INCLUDE #define __NSUUID_h_GNUSTEP_BASE_INCLUDE #import #import #if OS_API_VERSION(MAC_OS_X_VERSION_10_8,GS_API_LATEST) #if defined(__cplusplus) extern "C" { #endif typedef uint8_t gsuuid_t[16]; #if defined(uuid_t) #undef uuid_t #endif #define uuid_t gsuuid_t @class NSString; GS_EXPORT_CLASS @interface NSUUID : NSObject { @private gsuuid_t uuid; } + (instancetype) UUID; - (instancetype) initWithUUIDString: (NSString *)string; - (instancetype) initWithUUIDBytes: (gsuuid_t)bytes; - (NSString *) UUIDString; - (void) getUUIDBytes: (gsuuid_t)bytes; @end #if defined(__cplusplus) } #endif #endif #endif /* __NSUUID_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSUbiquitousKeyValueStore.h000066400000000000000000000102771435650067400251500ustar00rootroot00000000000000/** Interface for NSUbiquitousKeyValueStore Copyright (C) 2019 Free Software Foundation, Inc. Written by: Gregory John Casamento Created: July 3 2019 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef _NSUbiquitousKeyValueStore_h_GNUSTEP_BASE_INCLUDE #define _NSUbiquitousKeyValueStore_h_GNUSTEP_BASE_INCLUDE #if OS_API_VERSION(MAC_OS_X_VERSION_10_7,GS_API_LATEST) #import #import @class GS_GENERIC_CLASS(NSArray, ElementT); @class GS_GENERIC_CLASS(NSDictionary, KeyT:id, ValT); @class NSData; @class NSString; #if defined(__cplusplus) extern "C" { #endif GS_EXPORT_CLASS @interface NSUbiquitousKeyValueStore : NSObject // Getting the Shared Instance + (NSUbiquitousKeyValueStore *) defaultStore; // Getting Values // Returns the array associated with the specified key. - (NSArray *) arrayForKey: (NSString *)key; // Returns the Boolean value associated with the specified key. - (BOOL) boolForKey: (NSString *)key; // Returns the data object associated with the specified key. - (NSData*) dataForKey: (NSString *)key; // Returns the dictionary object associated with the specified key. - (NSDictionary *) dictionaryForKey: (NSString *)key; // Returns the double value associated with the specified key. - (double) doubleForKey: (NSString *)key; // Returns the long long value associated with the specified key. - (long long) longLongForKey: (NSString *)key; // Returns the object associated with the specified key. - (id) objectForKey: (NSString *)key; // Returns the string associated with the specified key. - (NSString *) stringForKey: (NSString *)key; // Setting Values // Sets an array object for the specified key in the key-value store. - (void) setArray: (NSArray *)array forKey: (NSString *)key; // Sets a Boolean value for the specified key in the key-value store. - (void) setBool: (BOOL)flag forKey: (NSString *)key; // Sets a data object for the specified key in the key-value store. - (void) setData: (NSData *)data forKey: (NSString *)key; // Sets a dictionary object for the specified key in the key-value store. - (void) setDictionary: (NSDictionary *)dict forKey: (NSString *)key; // Sets a double value for the specified key in the key-value store. - (void) setDouble: (double)val forKey: (NSString *)key; // Sets a long long value for the specified key in the key-value store. - (void) setLongLong: (long long)val forKey: (NSString *)key; // Sets an object for the specified key in the key-value store. - (void) setObject: (id) obj forKey: (NSString *)key; // Sets a string object for the specified key in the key-value store. - (void) setString: (NSString *)string forKey: (NSString *)key; // Explicitly Synchronizing In-Memory Key-Value Data to Disk // Explicitly synchronizes in-memory keys and values with those stored on disk. - (void) synchronize; // Removing Keys // Removes the value associated with the specified key from the key-value store. - (void) removeObjectForKey: (NSString *)key; // Retrieving the Current Keys and Values // A dictionary containing all of the key-value pairs in the key-value store. - (NSDictionary *) dictionaryRepresentation; @end // Notifications & constants GS_EXPORT NSString* const NSUbiquitousKeyValueStoreDidChangeExternallyNotification; GS_EXPORT NSString* const NSUbiquitousKeyValueStoreChangeReasonKey; #if defined(__cplusplus) } #endif #endif /* OS_API_VERSION check */ #endif /* _NSUbiquitousKeyValueStore_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSUndoManager.h000066400000000000000000000106621435650067400225120ustar00rootroot00000000000000/* Interface for for GNUStep Copyright (C) 1998 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSUndoManager_h_OBJECTS_INCLUDE #define __NSUndoManager_h_OBJECTS_INCLUDE #import #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) #import #if defined(__cplusplus) extern "C" { #endif @class NSArray; @class NSString; @class NSMutableArray; @class NSInvocation; /** Defines run loop ordering for closing undo groupings. */ enum { NSUndoCloseGroupingRunLoopOrdering = 350000 }; /* Public notification */ /** * Notification posted whenever [NSUndoManager] opens or closes an undo * group. The undo manager itself is the notification object, with no * userInfo dictionary. */ GS_EXPORT NSString* const NSUndoManagerCheckpointNotification; /** * Notification posted after an [NSUndoManager] opens an undo group. */ GS_EXPORT NSString* const NSUndoManagerDidOpenUndoGroupNotification; /** * Notification posted after an [NSUndoManager] executes a redo operation. */ GS_EXPORT NSString* const NSUndoManagerDidRedoChangeNotification; /** * Notification posted after an [NSUndoManager] executes an undo operation. */ GS_EXPORT NSString* const NSUndoManagerDidUndoChangeNotification; /** * Notification posted before an [NSUndoManager] closes an undo group. */ GS_EXPORT NSString* const NSUndoManagerWillCloseUndoGroupNotification; /** * Notification posted before an [NSUndoManager] will execute a redo operation. */ GS_EXPORT NSString* const NSUndoManagerWillRedoChangeNotification; /** * Notification posted before an [NSUndoManager] will execute an undo operation. */ GS_EXPORT NSString* const NSUndoManagerWillUndoChangeNotification; GS_EXPORT_CLASS @interface NSUndoManager : NSObject { #if GS_EXPOSE(NSUndoManager) @private NSMutableArray *_redoStack; NSMutableArray *_undoStack; id _group; id _nextTarget; NSArray *_modes; BOOL _isRedoing; BOOL _isUndoing; BOOL _groupsByEvent; BOOL _runLoopGroupingPending; unsigned _disableCount; unsigned _levelsOfUndo; #endif #if GS_NONFRAGILE #else /* Pointer to private additional data used to avoid breaking ABI * when we don't have the non-fragile ABI available. * Use this mechanism rather than changing the instance variable * layout (see Source/GSInternal.h for details). */ @private id _internal GS_UNUSED_IVAR; #endif } - (void) beginUndoGrouping; - (BOOL) canRedo; - (BOOL) canUndo; - (void) disableUndoRegistration; - (void) enableUndoRegistration; - (void) endUndoGrouping; - (void) forwardInvocation: (NSInvocation*)anInvocation; - (NSInteger) groupingLevel; - (BOOL) groupsByEvent; - (BOOL) isRedoing; - (BOOL) isUndoing; - (BOOL) isUndoRegistrationEnabled; - (NSUInteger) levelsOfUndo; - (id) prepareWithInvocationTarget: (id)target; - (void) redo; - (NSString*) redoActionName; - (NSString*) redoMenuItemTitle; - (NSString*) redoMenuTitleForUndoActionName: (NSString*)actionName; - (void) registerUndoWithTarget: (id)target selector: (SEL)aSelector object: (id)anObject; - (void) removeAllActions; - (void) removeAllActionsWithTarget: (id)target; - (NSArray*) runLoopModes; - (void) setActionName: (NSString*)name; - (void) setGroupsByEvent: (BOOL)flag; - (void) setLevelsOfUndo: (NSUInteger)num; - (void) setRunLoopModes: (NSArray*)newModes; - (void) undo; - (NSString*) undoActionName; - (NSString*) undoMenuItemTitle; - (NSString*) undoMenuTitleForUndoActionName: (NSString*)actionName; - (void) undoNestedGroup; @end #if defined(__cplusplus) } #endif #endif /* GS_API_MACOSX */ #endif /* __NSUndoManager_h_OBJECTS_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSUnit.h000066400000000000000000000235171435650067400212340ustar00rootroot00000000000000/* Definition of class NSUnit Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory John Casamento Date: Mon Sep 30 15:58:21 EDT 2019 This file is part of the GNUstep Library. 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 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 USA. */ #ifndef _NSUnit_h_GNUSTEP_BASE_INCLUDE #define _NSUnit_h_GNUSTEP_BASE_INCLUDE #import #if OS_API_VERSION(MAC_OS_X_VERSION_10_12, GS_API_LATEST) #if defined(__cplusplus) extern "C" { #endif // Unit converter GS_EXPORT_CLASS @interface NSUnitConverter : NSObject - (double) baseUnitValueFromValue: (double)value; - (double) valueFromBaseUnitValue: (double)baseUnitValue; @end // Linea converter... for things like C <-> F conversion... GS_EXPORT_CLASS @interface NSUnitConverterLinear : NSUnitConverter { double _coefficient; double _constant; } - (instancetype) initWithCoefficient: (double)coefficient; - (instancetype) initWithCoefficient: (double)coefficient constant: (double)constant; - (double) coefficient; - (double) constant; @end // Units... abstract... GS_EXPORT_CLASS @interface NSUnit : NSObject { NSString *_symbol; } - (instancetype) init; - (instancetype) initWithSymbol: (NSString *)symbol; - (NSString *) symbol; @end // Dimension using units.... GS_EXPORT_CLASS @interface NSDimension : NSUnit { double _value; NSUnitConverter *_converter; } - (NSUnitConverter *) converter; - (instancetype) initWithSymbol: (NSString *)symbol converter: (NSUnitConverter *)converter; + (instancetype) baseUnit; @end // Predefined.... GS_EXPORT_CLASS @interface NSUnitAcceleration : NSDimension /* Base unit - metersPerSecondSquared */ + (NSUnitAcceleration *) metersPerSecondSquared; + (NSUnitAcceleration *) gravity; @end GS_EXPORT_CLASS @interface NSUnitAngle : NSDimension /* Base unit - degrees */ + (NSUnitAngle *) degrees; + (NSUnitAngle *) arcMinutes; + (NSUnitAngle *) arcSeconds; + (NSUnitAngle *) radians; + (NSUnitAngle *) gradians; + (NSUnitAngle *) revolutions; @end GS_EXPORT_CLASS @interface NSUnitArea : NSDimension /* Base unit - squareMeters */ + (NSUnitArea *) squareMegameters; + (NSUnitArea *) squareKilometers; + (NSUnitArea *) squareMeters; + (NSUnitArea *) squareCentimeters; + (NSUnitArea *) squareMillimeters; + (NSUnitArea *) squareMicrometers; + (NSUnitArea *) squareNanometers; + (NSUnitArea *) squareInches; + (NSUnitArea *) squareFeet; + (NSUnitArea *) squareYards; + (NSUnitArea *) squareMiles; + (NSUnitArea *) acres; + (NSUnitArea *) ares; + (NSUnitArea *) hectares; @end GS_EXPORT_CLASS @interface NSUnitConcentrationMass : NSDimension /* Base unit - gramsPerLiter */ + (NSUnitConcentrationMass *) gramsPerLiter; + (NSUnitConcentrationMass *) milligramsPerDeciliter; + (NSUnitConcentrationMass *) millimolesPerLiterWithGramsPerMole: (double)gramsPerMole; @end GS_EXPORT_CLASS @interface NSUnitDispersion : NSDimension /* Base unit - partsPerMillion */ + (NSUnitDispersion *) partsPerMillion; @end GS_EXPORT_CLASS @interface NSUnitDuration : NSDimension /* Base unit - seconds */ + (NSUnitDuration *) seconds; + (NSUnitDuration *) minutes; + (NSUnitDuration *) hours; @end GS_EXPORT_CLASS @interface NSUnitElectricCharge : NSDimension /* Base unit - coulombs */ + (NSUnitElectricCharge *) coulombs; + (NSUnitElectricCharge *) megaampereHours; + (NSUnitElectricCharge *) kiloampereHours; + (NSUnitElectricCharge *) ampereHours; + (NSUnitElectricCharge *) milliampereHours; + (NSUnitElectricCharge *) microampereHours; @end GS_EXPORT_CLASS @interface NSUnitElectricCurrent : NSDimension /* Base unit - amperes */ + (NSUnitElectricCurrent *) megaamperes; + (NSUnitElectricCurrent *) kiloamperes; + (NSUnitElectricCurrent *) amperes; + (NSUnitElectricCurrent *) milliamperes; + (NSUnitElectricCurrent *) microamperes; @end GS_EXPORT_CLASS @interface NSUnitElectricPotentialDifference : NSDimension /* Base unit - volts */ + (NSUnitElectricPotentialDifference *) megavolts; + (NSUnitElectricPotentialDifference *) kilovolts; + (NSUnitElectricPotentialDifference *) volts; + (NSUnitElectricPotentialDifference *) millivolts; + (NSUnitElectricPotentialDifference *) microvolts; @end GS_EXPORT_CLASS @interface NSUnitElectricResistance : NSDimension /* Base unit - ohms */ + (NSUnitElectricResistance *) megaohms; + (NSUnitElectricResistance *) kiloohms; + (NSUnitElectricResistance *) ohms; + (NSUnitElectricResistance *) milliohms; + (NSUnitElectricResistance *) microohms; @end GS_EXPORT_CLASS @interface NSUnitEnergy : NSDimension /* Base unit - joules */ + (NSUnitEnergy *) kilojoules; + (NSUnitEnergy *) joules; + (NSUnitEnergy *) kilocalories; + (NSUnitEnergy *) calories; + (NSUnitEnergy *) kilowattHours; @end GS_EXPORT_CLASS @interface NSUnitFrequency : NSDimension /* Base unit - hertz */ + (NSUnitFrequency *) terahertz; + (NSUnitFrequency *) gigahertz; + (NSUnitFrequency *) megahertz; + (NSUnitFrequency *) kilohertz; + (NSUnitFrequency *) hertz; + (NSUnitFrequency *) millihertz; + (NSUnitFrequency *) microhertz; + (NSUnitFrequency *) nanohertz; @end GS_EXPORT_CLASS @interface NSUnitFuelEfficiency : NSDimension /* Base unit - litersPer100Kilometers */ + (NSUnitFuelEfficiency *) litersPer100Kilometers; + (NSUnitFuelEfficiency *) milesPerImperialGallon; + (NSUnitFuelEfficiency *) milesPerGallon; @end GS_EXPORT_CLASS @interface NSUnitLength : NSDimension /* Base unit - meters */ + (NSUnitLength *) megameters; + (NSUnitLength *) kilometers; + (NSUnitLength *) hectometers; + (NSUnitLength *) decameters; + (NSUnitLength *) meters; + (NSUnitLength *) decimeters; + (NSUnitLength *) centimeters; + (NSUnitLength *) millimeters; + (NSUnitLength *) micrometers; + (NSUnitLength *) nanometers; + (NSUnitLength *) picometers; + (NSUnitLength *) inches; + (NSUnitLength *) feet; + (NSUnitLength *) yards; + (NSUnitLength *) miles; + (NSUnitLength *) scandinavianMiles; + (NSUnitLength *) lightyears; + (NSUnitLength *) nauticalMiles; + (NSUnitLength *) fathoms; + (NSUnitLength *) furlongs; + (NSUnitLength *) astronomicalUnits; + (NSUnitLength *) parsecs; @end GS_EXPORT_CLASS @interface NSUnitIlluminance : NSDimension /* Base unit - lux */ + (NSUnitIlluminance *) lux; @end GS_EXPORT_CLASS @interface NSUnitMass : NSDimension /* Base unit - kilograms */ + (NSUnitMass *) kilograms; + (NSUnitMass *) grams; + (NSUnitMass *) decigrams; + (NSUnitMass *) centigrams; + (NSUnitMass *) milligrams; + (NSUnitMass *) micrograms; + (NSUnitMass *) nanograms; + (NSUnitMass *) picograms; + (NSUnitMass *) ounces; + (NSUnitMass *) pounds; + (NSUnitMass *) stones; + (NSUnitMass *) metricTons; + (NSUnitMass *) shortTons; + (NSUnitMass *) carats; + (NSUnitMass *) ouncesTroy; + (NSUnitMass *) slugs; @end GS_EXPORT_CLASS @interface NSUnitPower : NSDimension /* Base unit - watts */ + (NSUnitPower *) terawatts; + (NSUnitPower *) gigawatts; + (NSUnitPower *) megawatts; + (NSUnitPower *) kilowatts; + (NSUnitPower *) watts; + (NSUnitPower *) milliwatts; + (NSUnitPower *) microwatts; + (NSUnitPower *) nanowatts; + (NSUnitPower *) picowatts; + (NSUnitPower *) femtowatts; + (NSUnitPower *) horsepower; @end GS_EXPORT_CLASS @interface NSUnitPressure : NSDimension /* Base unit - newtonsPerMetersSquared (equivalent to 1 pascal) */ + (NSUnitPressure *) newtonsPerMetersSquared; + (NSUnitPressure *) gigapascals; + (NSUnitPressure *) megapascals; + (NSUnitPressure *) kilopascals; + (NSUnitPressure *) hectopascals; + (NSUnitPressure *) inchesOfMercury; + (NSUnitPressure *) bars; + (NSUnitPressure *) millibars; + (NSUnitPressure *) millimetersOfMercury; + (NSUnitPressure *) poundsForcePerSquareInch; @end GS_EXPORT_CLASS @interface NSUnitSpeed : NSDimension /* Base unit - metersPerSecond */ + (NSUnitSpeed *) metersPerSecond; + (NSUnitSpeed *) kilometersPerHour; + (NSUnitSpeed *) milesPerHour; + (NSUnitSpeed *) knots; @end GS_EXPORT_CLASS @interface NSUnitTemperature : NSDimension /* Base unit - kelvin */ + (NSUnitTemperature *) kelvin; + (NSUnitTemperature *) celsius; + (NSUnitTemperature *) fahrenheit; @end GS_EXPORT_CLASS @interface NSUnitVolume : NSDimension /* Base unit - liters */ + (NSUnitVolume *) megaliters; + (NSUnitVolume *) kiloliters; + (NSUnitVolume *) liters; + (NSUnitVolume *) deciliters; + (NSUnitVolume *) centiliters; + (NSUnitVolume *) milliliters; + (NSUnitVolume *) cubicKilometers; + (NSUnitVolume *) cubicMeters; + (NSUnitVolume *) cubicDecimeters; + (NSUnitVolume *) cubicCentimeters; + (NSUnitVolume *) cubicMillimeters; + (NSUnitVolume *) cubicInches; + (NSUnitVolume *) cubicFeet; + (NSUnitVolume *) cubicYards; + (NSUnitVolume *) cubicMiles; + (NSUnitVolume *) acreFeet; + (NSUnitVolume *) bushels; + (NSUnitVolume *) teaspoons; + (NSUnitVolume *) tablespoons; + (NSUnitVolume *) fluidOunces; + (NSUnitVolume *) cups; + (NSUnitVolume *) pints; + (NSUnitVolume *) quarts; + (NSUnitVolume *) gallons; + (NSUnitVolume *) imperialTeaspoons; + (NSUnitVolume *) imperialTablespoons; + (NSUnitVolume *) imperialFluidOunces; + (NSUnitVolume *) imperialPints; + (NSUnitVolume *) imperialQuarts; + (NSUnitVolume *) imperialGallons; + (NSUnitVolume *) metricCups; @end #if defined(__cplusplus) } #endif #endif /* GS_API_MACOSX */ #endif /* _NSUnit_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSUserActivity.h000066400000000000000000000025031435650067400227400ustar00rootroot00000000000000/* Definition of class NSUserActivity Copyright (C) 2019 Free Software Foundation, Inc. By: heron Date: Fri Nov 1 00:25:47 EDT 2019 This file is part of the GNUstep Library. 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 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 USA. */ #ifndef _NSUserActivity_h_GNUSTEP_BASE_INCLUDE #define _NSUserActivity_h_GNUSTEP_BASE_INCLUDE #include #if OS_API_VERSION(MAC_OS_X_VERSION_10_0, GS_API_LATEST) #if defined(__cplusplus) extern "C" { #endif GS_EXPORT_CLASS @interface NSUserActivity : NSObject @end #if defined(__cplusplus) } #endif #endif /* GS_API_MACOSX */ #endif /* _NSUserActivity_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSUserDefaults.h000066400000000000000000000427361435650067400227270ustar00rootroot00000000000000/* Interface for for GNUStep Copyright (C) 1995, 1996 Free Software Foundation, Inc. Written by: Georg Tuparev, EMBL & Academia Naturalis, Heidelberg, Germany Tuparev@EMBL-Heidelberg.de This file is part of the GNUstep Base Library. 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 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 02111 USA. */ #ifndef __NSUserDefaults_h_OBJECTS_INCLUDE #define __NSUserDefaults_h_OBJECTS_INCLUDE #import #import #import #if defined(__cplusplus) extern "C" { #endif @class NSArray; @class NSMutableArray; @class NSDictionary; @class NSMutableDictionary; @class NSData; @class NSTimer; @class NSRecursiveLock; @class NSDistributedLock; /* Standard domains */ /** * User defaults domain for process arguments. Command-line arguments * (key-value pairs, as in "-NSFoo bar") are placed in this domain.
* Where there is a sequence of arguments beginning with '-', only the * last one is used (so "-a -b -c d" will produce a single user default * 'c' with value 'd').
* NB. On OSX the argument "-" means a key consisting of an empty string * (so you can't use a '-' as a default value), while in GNUstep a "-" is * a special case which does not mean a default key (so '-' may be used * as a value).
*/ GS_EXPORT NSString* const NSArgumentDomain; /** * User defaults domain for system defaults. */ GS_EXPORT NSString* const NSGlobalDomain; /** * User defaults domain for application-registered "default defaults". */ GS_EXPORT NSString* const NSRegistrationDomain; #if !NO_GNUSTEP /** * User defaults domain for GNUstep config file and for any defaults * stored in the GlobalDefaults.plist file alongside the config file. */ GS_EXPORT NSString* const GSConfigDomain; #endif /* Public notification */ /** * Notification posted when a defaults synchronize has been performed (see * [NSUserDefaults-synchronize]) and changes have been loaded in from disk. */ GS_EXPORT NSString* const NSUserDefaultsDidChangeNotification; /* Backwards compatibility */ #define NSUserDefaultsChanged NSUserDefaultsDidChangeNotification /* Keys for language-dependent information */ /** Key for locale dictionary: names of days of week. */ GS_EXPORT NSString* const NSWeekDayNameArray; /** Key for locale dictionary: abbreviations of days of week. */ GS_EXPORT NSString* const NSShortWeekDayNameArray; /** Key for locale dictionary: names of months of year. */ GS_EXPORT NSString* const NSMonthNameArray; /** Key for locale dictionary: abbreviations of months of year. */ GS_EXPORT NSString* const NSShortMonthNameArray; /** Key for locale dictionary: format string for feeding to [NSDateFormatter].*/ GS_EXPORT NSString* const NSTimeFormatString; /** Key for locale dictionary: format string for feeding to [NSDateFormatter].*/ GS_EXPORT NSString* const NSDateFormatString; /** Key for locale dictionary: format string for feeding to [NSDateFormatter].*/ GS_EXPORT NSString* const NSShortDateFormatString; /** Key for locale dictionary: format string for feeding to [NSDateFormatter].*/ GS_EXPORT NSString* const NSTimeDateFormatString; /** Key for locale dictionary: format string for feeding to [NSDateFormatter].*/ GS_EXPORT NSString* const NSShortTimeDateFormatString; /** Key for locale dictionary: currency symbol. */ GS_EXPORT NSString* const NSCurrencySymbol; /** Key for locale dictionary: decimal separator. */ GS_EXPORT NSString* const NSDecimalSeparator; /** Key for locale dictionary: thousands separator. */ GS_EXPORT NSString* const NSThousandsSeparator; /** Key for locale dictionary: three-letter ISO 4217 currency abbreviation. */ GS_EXPORT NSString* const NSInternationalCurrencyString; /** Key for locale dictionary: text formatter string for monetary amounts. */ GS_EXPORT NSString* const NSCurrencyString; /** Key for locale dictionary: array of strings for 0-9. */ GS_EXPORT NSString* const NSDecimalDigits; /** Key for locale dictionary: array of strings for AM and PM. */ GS_EXPORT NSString* const NSAMPMDesignation; #if OS_API_VERSION(GSAPI_MACOSX, GS_API_LATEST) /** * Array of arrays of NSStrings, first member of each specifying a time, * followed by one or more colloquial names for the time, as in "(0, * midnight), (12, noon, lunch)". */ GS_EXPORT NSString* const NSHourNameDesignations; /** Strings for "year", "month", "week". */ GS_EXPORT NSString* const NSYearMonthWeekDesignations; /** Key for locale dictionary: adjectives that modify values in NSYearMonthWeekDesignations, as in "last", "previous", etc.. */ GS_EXPORT NSString* const NSEarlierTimeDesignations; /** Key for locale dictionary: adjectives that modify values in NSYearMonthWeekDesignations, as in "next", "subsequent", etc.. */ GS_EXPORT NSString* const NSLaterTimeDesignations; /** Key for locale dictionary: one or more strings designating the current day, such as "today". */ GS_EXPORT NSString* const NSThisDayDesignations; /** Key for locale dictionary: one or more strings designating the next day, such as "tomorrow". */ GS_EXPORT NSString* const NSNextDayDesignations; /** Key for locale dictionary: one or more strings designating the next day, such as "day after tomorrow". */ GS_EXPORT NSString* const NSNextNextDayDesignations; /** Key for locale dictionary: one or more strings designating the previous day, such as "yesterday". */ GS_EXPORT NSString* const NSPriorDayDesignations; /** Key for locale dictionary: string with 'Y', 'M', 'D', and 'H' designating the default method of writing dates, as in "MDYH" for the U.S.. */ GS_EXPORT NSString* const NSDateTimeOrdering; /** Key for locale dictionary: name of language. */ GS_EXPORT NSString* const NSLanguageName; /** Key for locale dictionary: two-letter ISO code. */ GS_EXPORT NSString* const NSLanguageCode; /** Key for locale dictionary: formal name of language. */ GS_EXPORT NSString* const NSFormalName; #if !NO_GNUSTEP /** Key for locale dictionary: name of locale. */ GS_EXPORT NSString* const GSLocale; #endif #endif /* General implementation notes: OpenStep spec currently is neither complete nor consistent. Therefore we had to make several implementation decisions which may vary in other OpenStep implementations. - We add two new class methods for getting and setting a list of user languages (userLanguages and setUserLanguages: ). They are somehow equivalent to the NS3.x Application's systemLanguages method. - Definition of argument (command line parameters) (-GSxxxx || --GSxxx) [value] To Do: - polish & optimize; - when tested, fix NSBundle (the system languages stuff); - write docs : -( */ GS_EXPORT_CLASS @interface NSUserDefaults : NSObject { #if GS_EXPOSE(NSUserDefaults) @private NSMutableArray *_searchList; // Current search list; NSMutableDictionary *_persDomains; // Contains persistent defaults info; NSMutableDictionary *_tempDomains; // Contains volatile defaults info; NSMutableArray *_changedDomains; /* ..after first time that persistent user defaults are changed */ NSDictionary *_dictionaryRep; // Cached dictionary representation NSString *_defaultsDatabase; NSDate *_lastSync; NSRecursiveLock *_lock; NSDistributedLock *_fileLock; #endif #if GS_NONFRAGILE #else /* Pointer to private additional data used to avoid breaking ABI * when we don't have the non-fragile ABI available. * Use this mechanism rather than changing the instance variable * layout (see Source/GSInternal.h for details). */ @private id _internal GS_UNUSED_IVAR; #endif } /** * Returns the shared defaults object. If it doesn't exist yet, it's * created. The defaults are initialized for the current user. * The search list is guaranteed to be standard only the first time * this method is invoked. The shared instance is provided as a * convenience; other instances may also be created. */ + (NSUserDefaults*) standardUserDefaults; #if OS_API_VERSION(GSAPI_MACOSX, GS_API_LATEST) /** * Resets the shared user defaults object to reflect the current * user ID. Needed by setuid processes which change the user they * are running as.
* In GNUstep you should call GSSetUserName() when changing your * effective user ID, and that function will call this function for you. */ + (void) resetStandardUserDefaults; #endif #if OS_API_VERSION(GSAPI_NONE, GSAPI_NONE) /** * Returns the array of user languages preferences. Uses the * NSLanguages user default if available, otherwise * tries to infer setup from operating system information etc * (in particular, uses the LANGUAGES environment variable). */ + (NSArray*) userLanguages; /** * Sets the array of user languages preferences. Places the specified * array in the NSLanguages user default. */ + (void) setUserLanguages: (NSArray*)languages; #endif #if OS_API_VERSION(GSAPI_MACOSX, GS_API_LATEST) /** * Adds the domain names aName to the search list of the receiver.
* The domain is added after the application domain.
* Suites may be removed using the -removeSuiteNamed: method. */ - (void) addSuiteNamed: (NSString*)aName; #endif /** * Looks up a value for a specified default using -objectForKey: * and checks that it is an NSArray object. Returns nil if it is not. */ - (NSArray*) arrayForKey: (NSString*)defaultName; /** * Looks up a value for a specified default using -objectForKey: * and returns its boolean representation.
* Returns NO if it is not a boolean.
* The text 'yes' or 'true' or any non zero numeric value is considered * to be a boolean YES. Other string values are NO.
* NB. This differs slightly from the documented behavior for MacOS-X * (August 2002) in that the GNUstep version accepts the string 'TRUE' * as equivalent to 'YES'. */ - (BOOL) boolForKey: (NSString*)defaultName; /** * Looks up a value for a specified default using -objectForKey: * and checks that it is an NSData object. Returns nil if it is not. */ - (NSData*) dataForKey: (NSString*)defaultName; /** * Looks up a value for a specified default using -objectForKey: * and checks that it is an NSDictionary object. Returns nil if it is not. */ - (NSDictionary*) dictionaryForKey: (NSString*)defaultName; #if OS_API_VERSION(MAC_OS_X_VERSION_10_5, GS_API_LATEST) /** * Looks up a value for a specified default using -objectForKey: * and checks that it is a double. Returns 0.0 if it is not. */ - (double) doubleForKey: (NSString*)defaultName; #endif /** * Looks up a value for a specified default using -objectForKey: * and checks that it is a float. Returns 0.0 if it is not. */ - (float) floatForKey: (NSString*)defaultName; /** * Initializes defaults for current user calling initWithUser: */ - (id) init; /** * Initializes defaults for the specified user.
* Returns an object with an empty search list. */ - (id) initWithUser: (NSString*)userName; /** * Looks up a value for a specified default using -objectForKey: * and returns its integer value or 0 if it is not representable * as an integer. */ - (NSInteger) integerForKey: (NSString*)defaultName; /** * Looks up a value for a specified default using. * The lookup is performed by accessing the domains in the order * given in the search list. *
Returns nil if defaultName cannot be found. */ - (id) objectForKey: (NSString*)defaultName; /** * Removes the default with the specified name from the application * domain. */ - (void) removeObjectForKey: (NSString*)defaultName; #if OS_API_VERSION(GSAPI_MACOSX, GS_API_LATEST) /** * Removes the named domain from the search list of the receiver.
* Suites may be added using the -addSuiteNamed: method. */ - (void) removeSuiteNamed: (NSString*)aName; #endif /** * Returns an array listing the domains searched in order to look up * a value in the defaults system. The order of the names in the * array is the order in which the domains are searched. */ - (NSArray*) searchList; /** * Sets a boolean value for defaultName in the application domain.
* Calls -setObject:forKey: to make the change by storing a string * containing either the word YES or NO. */ - (void) setBool: (BOOL)value forKey: (NSString*)defaultName; #if OS_API_VERSION(MAC_OS_X_VERSION_10_5, GS_API_LATEST) /** * Sets a double value for defaultName in the application domain.
* Calls -setObject:forKey: to make the change by storing a double * [NSNumber] instance. */ - (void) setDouble: (double)value forKey: (NSString*)defaultName; #endif /** * Sets a float value for defaultName in the application domain.
* Calls -setObject:forKey: to make the change by storing a float * [NSNumber] instance. */ - (void) setFloat: (float)value forKey: (NSString*)defaultName; /** * Sets an integer value for defaultName in the application domain.
* Calls -setObject:forKey: to make the change by storing an intege * [NSNumber] instance. */ - (void) setInteger: (NSInteger)value forKey: (NSString*)defaultName; /** * Sets a copy of an object value for defaultName in the * application domain.
* The defaultName must be a non-empty string.
* The value to be copied into the domain must be an instance * of one of the [NSString-propertyList] classes.
*

Causes a NSUserDefaultsDidChangeNotification to be posted * if this is the first change to a persistent-domain since the * last -synchronize. *

* If value is nil, this is equivalent to the -removeObjectForKey: method. */ - (void) setObject: (id)value forKey: (NSString*)defaultName; /** * Sets the list of the domains searched in order to look up * a value in the defaults system. The order of the names in the * array is the order in which the domains are searched.
* On lookup, the first match is used. */ - (void) setSearchList: (NSArray*)newList; /** * Calls -arrayForKey: to get an array value for defaultName and checks * that the array contents are string objects ... if not, returns nil. */ - (NSArray*) stringArrayForKey: (NSString*)defaultName; /** * Looks up a value for a specified default using -objectForKey: * and checks that it is an NSString. Returns nil if it is not. */ - (NSString*) stringForKey: (NSString*)defaultName; /** * Returns the persistent domain specified by domainName. */ - (NSDictionary*) persistentDomainForName: (NSString*)domainName; /** * Returns an array listing the name of all the persistent domains. */ - (NSArray*) persistentDomainNames; /** * Removes the persistent domain specified by domainName from the * user defaults. *
Causes a NSUserDefaultsDidChangeNotification to be posted * if this is the first change to a persistent-domain since the * last -synchronize. */ - (void) removePersistentDomainForName: (NSString*)domainName; /** * Replaces the persistent-domain specified by domainName with * domain ... a dictionary containing keys and defaults values. *
Raises an NSInvalidArgumentException if domainName already * exists as a volatile-domain. *
Causes a NSUserDefaultsDidChangeNotification to be posted * if this is the first change to a persistent-domain since the * last -synchronize. */ - (void) setPersistentDomain: (NSDictionary*)domain forName: (NSString*)domainName; /** * Ensures that the in-memory and on-disk representations of the defaults * are in sync. You may call this yourself, but probably don't need to * since it is invoked at intervals whenever a runloop is running.
* If any persistent domain is changed by reading new values from disk, * an NSUserDefaultsDidChangeNotification is posted. */ - (BOOL) synchronize; /** * Removes the volatile domain specified by domainName from the * user defaults. */ - (void) removeVolatileDomainForName: (NSString*)domainName; /** * Sets the volatile-domain specified by domainName to * domain ... a dictionary containing keys and defaults values.
* Raises an NSInvalidArgumentException if domainName already * exists as either a volatile-domain or a persistent-domain. */ - (void) setVolatileDomain: (NSDictionary*)domain forName: (NSString*)domainName; /** * Returns the volatile domain specified by domainName. */ - (NSDictionary*) volatileDomainForName: (NSString*)domainName; /** * Returns an array listing the name of all the volatile domains. */ - (NSArray*) volatileDomainNames; /** * Returns a dictionary representing the current state of the defaults * system ... this is a merged version of all the domains in the * search list. */ - (NSDictionary*) dictionaryRepresentation; /** * Merges the contents of the dictionary newVals into the registration * domain. Registration defaults may be added to or replaced using this * method, but may never be removed. Thus, setting registration defaults * at any point in your program guarantees that the defaults will be * available thereafter. */ - (void) registerDefaults: (NSDictionary*)newVals; @end #if defined(__cplusplus) } #endif #endif /* __NSUserDefaults_h_OBJECTS_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSUserNotification.h000066400000000000000000000107711435650067400236000ustar00rootroot00000000000000/* Interface for NSUserNotification for GNUstep Copyright (C) 2014 Free Software Foundation, Inc. Written by: Marcus Mueller Date: 2014 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSUserNotification_h_INCLUDE #define __NSUserNotification_h_INCLUDE #import #if OS_API_VERSION(MAC_OS_X_VERSION_10_8,GS_API_LATEST) #if __has_feature(objc_default_synthesize_properties) #import #if defined(__cplusplus) extern "C" { #endif @class NSString, NSDictionary, NSArray, NSDateComponents, NSDate, NSTimeZone, NSImage, NSAttributedString; @class NSMutableArray; @protocol NSUserNotificationCenterDelegate; enum { NSUserNotificationActivationTypeNone = 0, NSUserNotificationActivationTypeContentsClicked = 1, NSUserNotificationActivationTypeActionButtonClicked = 2 #if OS_API_VERSION(MAC_OS_X_VERSION_10_9,GS_API_LATEST) ,NSUserNotificationActivationTypeReplied = 3 #endif }; typedef NSInteger NSUserNotificationActivationType; GS_EXPORT_CLASS @interface NSUserNotification : NSObject { #if GS_EXPOSE(NSUserNotification) @public id _uniqueId; #endif } @property (copy) NSString *title; @property (copy) NSString *subtitle; @property (copy) NSString *informativeText; @property (copy) NSString *actionButtonTitle; @property (copy) NSDictionary *userInfo; @property (copy) NSDate *deliveryDate; @property (copy) NSTimeZone *deliveryTimeZone; @property (copy) NSDateComponents *deliveryRepeatInterval; @property (readonly) NSDate *actualDeliveryDate; @property (readonly, getter=isPresented) BOOL presented; @property (readonly, getter=isRemote) BOOL remote; @property (copy) NSString *soundName; @property BOOL hasActionButton; @property (readonly) NSUserNotificationActivationType activationType; @property (copy) NSString *otherButtonTitle; #if OS_API_VERSION(MAC_OS_X_VERSION_10_9,GS_API_LATEST) @property (copy) NSString *identifier; @property (copy) NSImage *contentImage; @property BOOL hasReplyButton; @property (copy) NSString *responsePlaceholder; @property (readonly) NSAttributedString *response; #endif /* OS_API_VERSION(MAC_OS_X_VERSION_10_9,GS_API_LATEST) */ @end GS_EXPORT NSString * const NSUserNotificationDefaultSoundName; GS_EXPORT_CLASS @interface NSUserNotificationCenter : NSObject { #if GS_EXPOSE(NSUserNotificationCenter) NSMutableArray *_scheduledNotifications; NSMutableArray *_deliveredNotifications; #endif } + (NSUserNotificationCenter *)defaultUserNotificationCenter; @property (assign) id delegate; @property (copy) NSArray *scheduledNotifications; - (void) scheduleNotification: (NSUserNotification *)notification; - (void) removeScheduledNotification: (NSUserNotification *)notification; @property (readonly) NSArray *deliveredNotifications; - (void) deliverNotification: (NSUserNotification *)notification; - (void) removeDeliveredNotification: (NSUserNotification *)notification; - (void) removeAllDeliveredNotifications; @end @protocol NSUserNotificationCenterDelegate #if GS_PROTOCOLS_HAVE_OPTIONAL @optional #else @end @interface NSObject (NSUserNotificationCenterDelegateMethods) #endif - (void) userNotificationCenter: (NSUserNotificationCenter *)center didDeliverNotification: (NSUserNotification *)notification; - (void) userNotificationCenter: (NSUserNotificationCenter *)center didActivateNotification: (NSUserNotification *)notification; - (BOOL) userNotificationCenter: (NSUserNotificationCenter *)center shouldPresentNotification: (NSUserNotification *)notification; @end #if defined(__cplusplus) } #endif #endif /* OS_API_VERSION(MAC_OS_X_VERSION_10_8,GS_API_LATEST) */ #endif /* __has_feature(objc_default_synthesize_properties) */ #endif /* __NSUserNotification_h_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSUserScriptTask.h000066400000000000000000000025461435650067400232420ustar00rootroot00000000000000 /* Definition of class NSUserScriptTask Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory John Casamento Date: Sep 2019 This file is part of the GNUstep Library. 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 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 USA. */ #ifndef _NSUserScriptTask_h_GNUSTEP_BASE_INCLUDE #define _NSUserScriptTask_h_GNUSTEP_BASE_INCLUDE #include #if defined(__cplusplus) extern "C" { #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_0, GS_API_LATEST) GS_EXPORT_CLASS @interface NSUserScriptTask : NSObject @end #if defined(__cplusplus) } #endif #endif /* GS_API_MACOSX */ #endif /* _NSUserScriptTask_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSUtilities.h000066400000000000000000000024151435650067400222620ustar00rootroot00000000000000/* Utilities for GNUStep Copyright (C) 1995 Free Software Foundation, Inc. Written by: Andrew Kachites McCallum Date: March 1995 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSUtilties_h_GNUSTEP_BASE_INCLUDE #define __NSUtilties_h_GNUSTEP_BASE_INCLUDE #warning The use of NSUtilities.h is deprecated #import #import #import #import #endif /* __NSUtilties_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSValue.h000066400000000000000000000300051435650067400213570ustar00rootroot00000000000000/* Interface for NSValue for GNUStep Copyright (C) 1995, 1996 Free Software Foundation, Inc. Written by: Adam Fedor Created: 1995 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSValue_h_GNUSTEP_BASE_INCLUDE #define __NSValue_h_GNUSTEP_BASE_INCLUDE #import #import #import #import #if defined(__cplusplus) extern "C" { #endif @class NSString; /** * The NSValue class can wrap a single primitive value as an * object so it can be used in the containers and other places where an object * reference is needed. Once initialized, an NSValue is * immutable, and there is no NSMutableValue class. You * initialize it by giving it a pointer to the primitive value, and you should * be careful this does not get freed until after the NSValue is * no longer used. */ GS_EXPORT_CLASS @interface NSValue : NSObject // Allocating and Initializing /** * Create new instance with specified value (a pointer) of given type, which * is a string code obtainable through the compile-time operator * @encode(...). For example: NSValue *theValue = [NSValue value: &n withObjCType: @encode(int)]; */ + (NSValue*) value: (const void*)value withObjCType: (const char*)type; /** * Create new instance holding anObject. This is useful if you want to add * anObject to a collection such as [NSArray] but don't want it to be retained * (a weak reference). */ + (NSValue*) valueWithNonretainedObject: (id)anObject; /** * Convenience method to create instance holding an NSPoint * structure. */ + (NSValue*) valueWithPoint: (NSPoint)point; /** * Convenience method to create instance holding a pointer. Same as * using @encode(void *) in +value:withObjCType: . */ + (NSValue*) valueWithPointer: (const void*)pointer; /** * Convenience method to create instance holding an NSRange * structure. */ + (NSValue*) valueWithRange: (NSRange)range; /** * Convenience method to create instance holding an NSRect * structure. */ + (NSValue*) valueWithRect: (NSRect)rect; /** * Convenience method to create instance holding an NSSize * structure. */ + (NSValue*) valueWithSize: (NSSize)size; #if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST) /** * Synonym for value:withObjCType: . */ + (NSValue*) valueWithBytes: (const void*)value objCType: (const char*)type; /** * Initialize with value of type, parallel to value:withObjCType: . */ - (id) initWithBytes: (const void*)data objCType: (const char*)type; /** * Compares this instance to another NSValue. For equality, * both contents and declared type of the two values must match. */ - (BOOL) isEqualToValue: (NSValue*)other; #endif /* GS_API_MACOSX */ // Accessing Data /** * Copies bytes from the pointer receiver was initialized with into buffer * pointed to by value. Number of bytes copied is determined by the type. If * type was a void * pointer or object id, the memory address itself is * copied. */ - (void) getValue: (void*)value; /** * Returns the string @encode(...) compatible type the receiver * was initialized with. */ - (const char*) objCType; /** * If receiver was initialized with an object ID, return it, else raises * NSInternalInconsistencyException. */ - (id) nonretainedObjectValue; /** * If receiver was initialized with a void * pointer, return it, else raises * NSInternalInconsistencyException. */ - (void*) pointerValue; /** * If receiver was initialized with an NSRange value, return it, * else raises NSInternalInconsistencyException. */ - (NSRange) rangeValue; /** * If receiver was initialized with an NSRect value, return it, * else raises NSInternalInconsistencyException. */ - (NSRect) rectValue; /** * If receiver was initialized with an NSSize value, return it, * else raises NSInternalInconsistencyException. */ - (NSSize) sizeValue; /** * If receiver was initialized with an NSPoint value, return it, * else raises NSInternalInconsistencyException. */ - (NSPoint) pointValue; @end /** * Subclass of [NSValue] offering convenience methods for initializing from * and accessing as any C primitive numeric type. On access, the value will * be type-converted if necessary, using standard C conversion rules. */ GS_EXPORT_CLASS @interface NSNumber : NSValue // Allocating and Initializing /** New instance from boolean value. */ + (NSNumber*) numberWithBool: (BOOL)value; /** New instance from signed char value. */ + (NSNumber*) numberWithChar: (signed char)value; /** New instance from double value. */ + (NSNumber*) numberWithDouble: (double)value; /** New instance from float value. */ + (NSNumber*) numberWithFloat: (float)value; /** New instance from (signed) int value. */ + (NSNumber*) numberWithInt: (signed int)value; /** New instance from (signed) long value. */ + (NSNumber*) numberWithLong: (signed long)value; /** New instance from (signed) long long value. */ + (NSNumber*) numberWithLongLong: (signed long long)value; /** New instance from (signed) short value. */ + (NSNumber*) numberWithShort: (signed short)value; /** New instance from unsigned char value. */ + (NSNumber*) numberWithUnsignedChar: (unsigned char)value; /** New instance from unsigned int value. */ + (NSNumber*) numberWithUnsignedInt: (unsigned int)value; /** New instance from unsigned long value. */ + (NSNumber*) numberWithUnsignedLong: (unsigned long)value; /** New instance from unsigned long long value. */ + (NSNumber*) numberWithUnsignedLongLong: (unsigned long long)value; /** New instance from unsigned short value. */ + (NSNumber*) numberWithUnsignedShort: (unsigned short)value; /** Initialize from boolean value. */ - (id) initWithBool: (BOOL)value; /** Initialize from signed char value. */ - (id) initWithChar: (signed char)value; /** Initialize from double value. */ - (id) initWithDouble: (double)value; /** Initialize from float value. */ - (id) initWithFloat: (float)value; /** Initialize from (signed) int value. */ - (id) initWithInt: (signed int)value; /** Initialize from (signed) long value. */ - (id) initWithLong: (signed long)value; /** Initialize from (signed) long long value. */ - (id) initWithLongLong: (signed long long)value; /** Initialize from (signed) short value. */ - (id) initWithShort: (signed short)value; /** Initialize from unsigned char value. */ - (id) initWithUnsignedChar: (unsigned char)value; /** Initialize from unsigned int value. */ - (id) initWithUnsignedInt: (unsigned int)value; /** Initialize from unsigned long value. */ - (id) initWithUnsignedLong: (unsigned long)value; /** Initialize from unsigned long long value. */ - (id) initWithUnsignedLongLong: (unsigned long long)value; /** Initialize from unsigned short value. */ - (id) initWithUnsignedShort: (unsigned short)value; // Accessing Data /** * Return value as a BOOL; this will in fact be a char value converted * if necessary from type initialized with; if you wish to consider anything * nonzero TRUE do not compare directly to YES, but use '!= NO'. */ - (BOOL) boolValue; /** Returns value as a signed char, converting if necessary. */ - (signed char) charValue; /** Returns value as a double, converting if necessary. */ - (double) doubleValue; /** Returns value as a float, converting if necessary. */ - (float) floatValue; /** Returns value as a (signed) int, converting if necessary. */ - (signed int) intValue; /** Returns value as a (signed) long, converting if necessary. */ - (signed long) longValue; /** Returns value as a (signed) long long, converting if necessary. */ - (signed long long) longLongValue; /** Returns value as a (signed) short, converting if necessary. */ - (signed short) shortValue; /** Returns value as an unsigned char, converting if necessary. */ - (unsigned char) unsignedCharValue; /** Returns value as an unsigned int, converting if necessary. */ - (unsigned int) unsignedIntValue; /** Returns value as an unsigned long, converting if necessary. */ - (unsigned long) unsignedLongValue; /** Returns value as an unsigned long long, converting if necessary. */ - (unsigned long long) unsignedLongLongValue; /** Returns value as an unsigned short, converting if necessary. */ - (unsigned short) unsignedShortValue; /** Returns -description . */ - (NSString*) stringValue; /** * Returns the string representation of this number using a non-localised * conversion (decimal point is '.' irrespective of the locale). */ - (NSString*) description; /** *

* Produces a string representation of the number. For a boolean * this will be either 'true' or 'false'. For other numbers the * format is produced using the initWithFormat:locale:... method * of NSString, and the format depends on the type of number as * follows - *

* * char * %i * short * %hi * int * %i * long * %li * long long * %lli * unsigned char * %u * unsigned short * %hu * unsigned int * %u * unsigned long * %lu * unsigned long long * %llu * float * %0.7g * double * %0.16g * */ - (NSString*) descriptionWithLocale: (id)locale; /** * Compares receiver with otherNumber, using C type conversion if necessary, * and returns NSOrderedAscending, * NSOrderedDescending, or NSOrderedSame depending * on whether it is less than, greater than, or equal to otherNumber. */ - (NSComparisonResult) compare: (NSNumber*)otherNumber; /** * Returns whether receiver and otherNumber represent the same numerical value. */ - (BOOL) isEqualToNumber: (NSNumber*)otherNumber; #if OS_API_VERSION(MAC_OS_X_VERSION_10_5, GS_API_LATEST) /** Return a number intialised with NSInteger. */ + (NSNumber*) numberWithInteger: (NSInteger)value; /** Return a number intialised with NSUInteger. */ + (NSNumber*) numberWithUnsignedInteger: (NSUInteger)value; /** Initialise the receiver with NSInteger content. */ - (id) initWithInteger: (NSInteger)value; /** Initialise the receiver with NSUInteger content. */ - (id) initWithUnsignedInteger: (NSUInteger)value; /** Return the contents of the receiver as NSInteger. */ - (NSInteger) integerValue; /** Return the contents of the receiver as NSUInteger. */ - (NSUInteger) unsignedIntegerValue; #endif @end #if OS_API_VERSION(GS_API_NONE, GS_API_NONE) /** Note: Defines a method that is not in the OpenStep spec, but makes subclassing easier. */ @interface NSValue (Subclassing) /** Used by value: withObjCType: to determine the concrete subclass to alloc. */ + (Class) valueClassWithObjCType: (const char*)type; @end #endif #if defined(__cplusplus) } #endif #if !NO_GNUSTEP && !defined(GNUSTEP_BASE_INTERNAL) #import #endif #endif /* __NSValue_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSValueTransformer.h000066400000000000000000000074701435650067400236140ustar00rootroot00000000000000/* Interface for NSValueTransformer for GNUStep Copyright (C) 2006 Free Software Foundation, Inc. Written Dr. H. Nikolaus Schaller Created on Mon Mar 21 2005. Updatesd and documented by Richard Frith-Macdonald This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __NSValueTransformer_h_GNUSTEP_BASE_INCLUDE #define __NSValueTransformer_h_GNUSTEP_BASE_INCLUDE #import #if OS_API_VERSION(MAC_OS_X_VERSION_10_3,GS_API_LATEST) && GS_API_VERSION( 10200,GS_API_LATEST) #import #if defined(__cplusplus) extern "C" { #endif @class NSArray; @class NSString; /** This transformer converts a YES to a NO and a NO to a YES. */ GS_EXPORT NSString* const NSNegateBooleanTransformerName; /** This transformer converts a nil value to a YES.
* Not reversible. */ GS_EXPORT NSString* const NSIsNilTransformerName; /** This transformer converts a non-nil value to a YES.
* Not reversible. */ GS_EXPORT NSString* const NSIsNotNilTransformerName; /** This transformer converts an [NSData] instance to the object * archived in it, or archives an object inot an [NSData]. */ GS_EXPORT NSString* const NSUnarchiveFromDataTransformerName; /** Instances of the NSValueTransformer class are used to convert * values from one representation to another. The base class is * abstract and its methods must be overridden by subclasses to do * the actual work. */ GS_EXPORT_CLASS @interface NSValueTransformer : NSObject /** * Returns a flag indicating whether the transformer permits reverse * transformations. */ + (BOOL) allowsReverseTransformation; /** * Registers transformer to handle transformations with the specified * name. */ + (void) setValueTransformer: (NSValueTransformer *)transformer forName: (NSString *)name; /** * Returns the class of the value produced by this transformer. */ + (Class) transformedValueClass; /** * Returns the transformer registered for the specified name, or nil * if no transformer is registered for name. * * If no transformer is found, but the name corresponds to a valid * NSValueTransformer subclass name, the receiver instantiates this subclass * using -init and registers it automatically for name. */ + (NSValueTransformer *) valueTransformerForName: (NSString *)name; /** * Returns an array listing the names of all registered value transformers. */ + (NSArray *) valueTransformerNames; /** * Performs a reverse transformation on the specified value and returns the * resulting object.
* The default implementation raises an exception if * +allowsReverseTransformation returns NO, otherwise it calls * -transformedValue: and returns the result. */ - (id) reverseTransformedValue: (id)value; /** * Subclasses should override this method to perform the actual transformation * (and reverse transformation if applicable) and return the result. */ - (id) transformedValue: (id)value; @end #if defined(__cplusplus) } #endif #endif /* OS_API_VERSION */ #endif /* __NSValueTransformer_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSXMLDTD.h000066400000000000000000000076301435650067400213070ustar00rootroot00000000000000/* Interface for NSXMLDTD for GNUStep Copyright (C) 2008 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: September 2008 This file is part of the GNUstep Base Library. 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 3 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 USA. */ #ifndef __NSXMLDTD_h_GNUSTEP_BASE_INCLUDE #define __NSXMLDTD_h_GNUSTEP_BASE_INCLUDE #import #import #if defined(__cplusplus) extern "C" { #endif @class NSData, NSMutableDictionary; @class NSXMLDTDNode; /** * Encapsulates document type definition data. */ GS_EXPORT_CLASS @interface NSXMLDTD : NSXMLNode { #if GS_NONFRAGILE # if defined(GS_NSXMLDTD_IVARS) @public GS_NSXMLDTD_IVARS; # endif #endif /* The pointer to private additional data used to avoid breaking ABI * when we don't have the non-fragile ABI available is inherited from * NSXMLNode. See Source/GSInternal.h for details. */ } /** * Adds a child after the existing children. */ - (void) addChild: (NSXMLNode*)child; /** * Returns the attribute declaration named. */ - (NSXMLDTDNode*) attributeDeclarationForName: (NSString*)name elementName: (NSString*)elementName; /** * Returns the element declaration named. */ - (NSXMLDTDNode*) elementDeclarationForName: (NSString*)name; /** * Returns the entity declaration named. */ - (NSXMLDTDNode*) entityDeclarationForName: (NSString*)name; /** Load data from URL and initialise the receiver with the contents. */ - (id) initWithContentsOfURL: (NSURL*)url options: (NSUInteger)mask error: (NSError**)error; /** */ - (id) initWithData: (NSData*)data options: (NSUInteger)mask error: (NSError**)error; /** * Inserts a child node at the specified index in the document. */ - (void) insertChild: (NSXMLNode*)child atIndex: (NSUInteger)index; /** * Inserts a number of child nodes at the specified index. */ - (void) insertChildren: (NSArray*)children atIndex: (NSUInteger)index; /** * Returns the notation declaration named. */ - (NSXMLDTDNode*) notationDeclarationForName: (NSString*)name; /** * Returns the predefined entity declaration matching named. */ + (NSXMLDTDNode*) predefinedEntityDeclarationForName: (NSString*)name; /** * Returns the public ID set for the document. */ - (NSString*) publicID; /** * Remove the indexed child node. */ - (void) removeChildAtIndex: (NSUInteger)index; /** * Replaces the child at index with another child. */ - (void) replaceChildAtIndex: (NSUInteger)index withNode: (NSXMLNode*)theNode; /** * Replaces all existing children with the child nodes in the array. */ - (void) setChildren: (NSArray*)children; /** * Sets the public id of this document.
* This identifier should be in the default catalog or in a location * given by the XML_CATALOG_FILES environment variable.
* You should also set the systemID when you set this. */ - (void) setPublicID: (NSString*)publicID; /** * Sets the system ID ... a URL referring to the DTD document. */ - (void) setSystemID: (NSString*)systemID; /** * Returns the system ID */ - (NSString*) systemID; @end #if defined(__cplusplus) } #endif #endif /*__NSXMLDTD_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSXMLDTDNode.h000066400000000000000000000076261435650067400221220ustar00rootroot00000000000000/* Interface for NSXMLDTDNode for GNUStep Copyright (C) 2008 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: September 2008 This file is part of the GNUstep Base Library. 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 3 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 USA. */ #ifndef __NSXMLDTDNode_h_GNUSTEP_BASE_INCLUDE #define __NSXMLDTDNode_h_GNUSTEP_BASE_INCLUDE #import #import #if defined(__cplusplus) extern "C" { #endif /** * The kind of DTD node. */ enum { NSXMLEntityGeneralKind = 1, NSXMLEntityParsedKind, NSXMLEntityUnparsedKind, NSXMLEntityParameterKind, NSXMLEntityPredefined, NSXMLAttributeCDATAKind, NSXMLAttributeIDKind, NSXMLAttributeIDRefKind, NSXMLAttributeIDRefsKind, NSXMLAttributeEntityKind, NSXMLAttributeEntitiesKind, NSXMLAttributeNMTokenKind, NSXMLAttributeNMTokensKind, NSXMLAttributeEnumerationKind, NSXMLAttributeNotationKind, NSXMLElementDeclarationUndefinedKind, NSXMLElementDeclarationEmptyKind, NSXMLElementDeclarationAnyKind, NSXMLElementDeclarationMixedKind, NSXMLElementDeclarationElementKind }; typedef NSUInteger NSXMLDTDNodeKind; /** * Represents the nodes whose types are present only in DTDs.
* Object values for the different nodes are: * * Entity declaration * The string that that entity resolves to eg "<" * Attribute declaration * The default value, if any * Element declaration * The validation string * Notation declaration * nil * */ GS_EXPORT_CLASS @interface NSXMLDTDNode : NSXMLNode { #if GS_NONFRAGILE # if defined(GS_NSXMLDTDNode_IVARS) @public GS_NSXMLDTDNode_IVARS; # endif #endif /* The pointer to private additional data used to avoid breaking ABI * when we don't have the non-fragile ABI available is inherited from * NSXMLNode. See Source/GSInternal.h for details. */ } /** * Returns what kind of DTD node this is. */ - (NSXMLDTDNodeKind) DTDKind; /** * Initialises the receiver based on the contents of the supplied XML. */ - (id) initWithXMLString: (NSString*)string; /** * Returns YES if the system id is set, NO otherwise.
* Is valid only for entities and notations. */ - (BOOL) isExternal; /** * Returns the notation name. */ - (NSString*) notationName; /** * Returns the public id. */ - (NSString*) publicID; /** * Sets what kind of DTD node this is. */ - (void) setDTDKind: (NSXMLDTDNodeKind)nodeKind; /** * Sets the notation name if the receiver is an entity. */ - (void) setNotationName: (NSString*)notationName; /** * Sets the public id of this node.
* This identifier should be in the default catalog or in a location * given by the XML_CATALOG_FILES environment variable.
* When the public id is set the system id must also be set.
* This is valid only for entities and notations. */ - (void) setPublicID: (NSString*)publicID; /** * Sets the system ID ... a URL referring to the DTD document. */ - (void) setSystemID: (NSString*)systemID; /** * Returns the system ID. */ - (NSString*) systemID; @end #if defined(__cplusplus) } #endif #endif /*__NSXMLDTDNode_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSXMLDocument.h000066400000000000000000000155021435650067400224470ustar00rootroot00000000000000/* Interface for NSXMLDocument for GNUStep Copyright (C) 2008 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: September 2008 This file is part of the GNUstep Base Library. 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 3 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 USA. */ #ifndef __NSXMLDocument_h_GNUSTEP_BASE_INCLUDE #define __NSXMLDocument_h_GNUSTEP_BASE_INCLUDE #import #import #if defined(__cplusplus) extern "C" { #endif @class NSData; @class NSXMLDTD; @class NSMutableArray; /* * Input options * NSXMLNodeOptionsNone * NSXMLNodePreserveAll * NSXMLNodePreserveNamespaceOrder * NSXMLNodePreserveAttributeOrder * NSXMLNodePreserveEntities * NSXMLNodePreservePrefixes * NSXMLNodePreserveCDATA * NSXMLNodePreserveEmptyElements * NSXMLNodePreserveQuotes * NSXMLNodePreserveWhitespace * NSXMLDocumentTidyHTML * NSXMLDocumentTidyXML * NSXMLDocumentValidate * * Output options * NSXMLNodePrettyPrint * NSXMLDocumentIncludeContentTypeDeclaration */ enum { NSXMLDocumentXMLKind = 0, /** Default type */ NSXMLDocumentXHTMLKind, /** HTML found */ NSXMLDocumentHTMLKind, /** Output no close tag for empty elem*/ NSXMLDocumentTextKind /** Output string value of doc */ }; /** * Define what type of document this is. */ typedef NSUInteger NSXMLDocumentContentKind; /** * An XMLDocument encapsulates an entire document. * This must contain a single element node. */ GS_EXPORT_CLASS @interface NSXMLDocument : NSXMLNode { #if GS_NONFRAGILE # if defined(GS_NSXMLDocument_IVARS) @public GS_NSXMLDocument_IVARS; # endif #endif /* The pointer to private additional data used to avoid breaking ABI * when we don't have the non-fragile ABI available is inherited from * NSXMLNode. See Source/GSInternal.h for details. */ } + (Class) replacementClassForClass: (Class)cls; /** * Returns the IANA character encoding, or nil if none is set. */ - (NSString*) characterEncoding; /** * Returns the kind of document. */ - (NSXMLDocumentContentKind) documentContentKind; /** * Returns the DTD set for the receiver. */ - (NSXMLDTD*) DTD; /** * Initialise using the data downloaded from the spplied url. */ - (id) initWithContentsOfURL: (NSURL*)url options: (NSUInteger)mask error: (NSError**)error; /** * Returns a document created from data.
* Parse errors are returned in error. */ - (id) initWithData: (NSData*)data options: (NSUInteger)mask error: (NSError**)error; /** * Returns a document with a single child, the root element. */ - (id) initWithRootElement: (NSXMLElement*)element; /** * Initialises the receiver by creating a document from XML (or HTML * if the HTMLTidy option is set). * Parse errors are returned in the error argument. */ - (id) initWithXMLString: (NSString*)string options: (NSUInteger)mask error: (NSError**)error; /** * Returns NO if the receiver depends upon an external DTD, otherwise * returns YES. */ - (BOOL) isStandalone; /** * Returns the document MIME type.. */ - (NSString*) MIMEType; /** * Returns the root object of the receiver. */ - (NSXMLElement*) rootElement; /** * Sets the character encoding to an IANA characterset type. */ - (void) setCharacterEncoding: (NSString*)encoding; /** * Sets the kind of document. */ - (void) setDocumentContentKind: (NSXMLDocumentContentKind)theContentKind; /** * Sets the DTD of the receiver. If this is set then the DTD will be * output when the document is. */ - (void) setDTD: (NSXMLDTD*)documentTypeDeclaration; /** * Sets the document MIME type (usually text/xml). */ - (void) setMIMEType: (NSString*)theMIMEType; /** * Sets the root object of the receiver, removing any children which * were previously set. */ - (void) setRootElement: (NSXMLNode*)root; /** * Sets whether the receiver is a document which requires an external DTD.
* If this is set then the standalone declaration will appear if the document is * output. */ - (void) setStandalone: (BOOL)standalone; /** * Sets the XML version
* Permitted values ar '1.0' or '1,1' */ - (void) setVersion: (NSString*)version; /** * Returns the XML version or nil if none is set. */ - (NSString*) version; /** * Inserts child at index. */ - (void) insertChild: (NSXMLNode*)child atIndex: (NSUInteger)index; /** * Inserts a number of children at the index. */ - (void) insertChildren: (NSArray*)children atIndex: (NSUInteger)index; /** * Removes the child at the index. */ - (void) removeChildAtIndex: (NSUInteger)index; /** * Replaces all existing child nodes with the ones in the array. */ - (void) setChildren: (NSArray*)children; /** * Adds child after existing children. */ - (void) addChild: (NSXMLNode*)child; /** * Replacs the child at the specified index. */ - (void) replaceChildAtIndex: (NSUInteger)index withNode: (NSXMLNode*)theNode; /** * Outputs XML data using -XMLDataWithOptions: with NSXMLNodeOptionsNone. */ - (NSData*) XMLData; /** * Outputs the reciever encoded using the specified options. */ - (NSData*) XMLDataWithOptions: (NSUInteger)theOptions; /** * Returns a new document created by applying xslt (with a set of * key/value pairs) to the receiver. */ - (id) objectByApplyingXSLT: (NSData*)xslt arguments: (NSDictionary*)arguments error: (NSError**)error; /** * Returns a new document created by applying xslt (with a set of * key/value pairs) to the receiver. */ - (id) objectByApplyingXSLTString: (NSString*)xslt arguments: (NSDictionary*)arguments error: (NSError**)error; /** * Downloads XSLT from xsltURL, and then returns a new document created * by applying it (with a set of key/value pairs) to the receiver. */ - (id) objectByApplyingXSLTAtURL: (NSURL*)xsltURL arguments: (NSDictionary*)arguments error: (NSError**)error; /* Validate the receiver according to its DTD. */ - (BOOL) validateAndReturnError: (NSError**)error; @end #if defined(__cplusplus) } #endif #endif /*__NSXMLDocument_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSXMLElement.h000066400000000000000000000124251435650067400222630ustar00rootroot00000000000000/* Interface for NSXMLElement for GNUStep Copyright (C) 2008 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: September 2008 This file is part of the GNUstep Base Library. 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 3 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 USA. */ #ifndef __NSXMLElement_h_GNUSTEP_BASE_INCLUDE #define __NSXMLElement_h_GNUSTEP_BASE_INCLUDE #import #import #if defined(__cplusplus) extern "C" { #endif @class NSDictionary, NSEnumerator, NSMutableArray, NSMutableDictionary; /** * Represents an XML element.
*/ GS_EXPORT_CLASS @interface NSXMLElement : NSXMLNode { #if GS_NONFRAGILE # if defined(GS_NSXMLElement_IVARS) @public GS_NSXMLElement_IVARS; # endif #endif /* The pointer to private additional data used to avoid breaking ABI * when we don't have the non-fragile ABI available is inherited from * NSXMLNode. See Source/GSInternal.h for details. */ } /** * Initialises the receiver with the given name. */ - (id) initWithName: (NSString*)name; /** * Initialises the receiver with the given name and namespace URI. */ - (id) initWithName: (NSString*)name URI: (NSString*)URI; /** * Initialises the receiver as a text node with the given name and content. */ - (id) initWithName: (NSString*)name stringValue: (NSString*)string; /** * Initialises the receiver by parsing the XML string supplied. */ - (id) initWithXMLString: (NSString*)string error: (NSError**)error; /** * Searches for and returns all child elements which match name. */ - (NSArray*) elementsForName: (NSString*)name; /** * Searches for and returns all child elements which match localName * and the specified URI. */ - (NSArray*) elementsForLocalName: (NSString*)localName URI: (NSString*)URI; /** * Adds the supplied attribute to the receiver (ignoring if it has a duplicate * name). */ - (void) addAttribute: (NSXMLNode*)attribute; /** * Removes the named attribute. */ - (void) removeAttributeForName: (NSString*)name; /** * Sets the attributes of the receiver, ignoring all but the first of any * duplicates. */ - (void) setAttributes: (NSArray*)attributes; /** * Sets attributes from the supplied dictionary.
* DEPRECATED ... use -setAttributesWithDictionary: instead. */ - (void) setAttributesAsDictionary: (NSDictionary*)attributes; #if OS_API_VERSION(MAC_OS_X_VERSION_10_7, GS_API_LATEST) /** * Sets attributes from the supplied dictionary. */ - (void) setAttributesWithDictionary: (NSDictionary*)attributes; #endif /** * Returns the receiver's attributes. */ - (NSArray*) attributes; /** * Returns the named attribute. */ - (NSXMLNode*) attributeForName: (NSString*)name; /** * Returns the attribute matching localName and URI. */ - (NSXMLNode*) attributeForLocalName: (NSString*)localName URI: (NSString*)URI; /** * Adds a namespace unless the name is a duplicate. */ - (void) addNamespace: (NSXMLNode*)aNamespace; /** * Removes a named namespace. */ - (void) removeNamespaceForPrefix: (NSString*)name; /** * Sets the namespaces for the receiver, ignoring all but the first * of any duplicates. */ - (void) setNamespaces: (NSArray*)namespaces; /** * Returns the namespaces of the receiver. */ - (NSArray*) namespaces; /** * Returns the namespace for the specified prefix in the receiver. */ - (NSXMLNode*) namespaceForPrefix: (NSString*)name; /** * Returns the namespace found by searching the chain of namespaces. */ - (NSXMLNode*) resolveNamespaceForName: (NSString*)name; /** * Returns the URI by searching the chain of namespaces. */ - (NSString*) resolvePrefixForNamespaceURI: (NSString*)namespaceURI; /** * Inerts a child node. */ - (void) insertChild: (NSXMLNode*)child atIndex: (NSUInteger)index; /** * Inserts a number of children. */ - (void) insertChildren: (NSArray*)children atIndex: (NSUInteger)index; /** * Removes a child node. */ - (void) removeChildAtIndex: (NSUInteger)index; /** * Replaces all existing child nodes with those from the array. */ - (void) setChildren: (NSArray*)children; /** * Adds a child after existing children. */ - (void) addChild: (NSXMLNode*)child; /** * Replaces the child at the specified index. */ - (void) replaceChildAtIndex: (NSUInteger)index withNode: (NSXMLNode*)theNode; /** * Merges adjacent text nodes. If a node's value is the empty string, * and preserve is NO, it is removed.
* This should be called with a value of NO before using * XQuery or XPath. */ - (void) normalizeAdjacentTextNodesPreservingCDATA: (BOOL)preserve; @end #if defined(__cplusplus) } #endif #endif /*__NSXMLElement_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSXMLNode.h000066400000000000000000000264131435650067400215610ustar00rootroot00000000000000/* Interface for NSXMLNode for GNUStep Copyright (C) 2008 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: September 2008 This file is part of the GNUstep Base Library. 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 3 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 USA. */ #ifndef __NSXMLNode_h_GNUSTEP_BASE_INCLUDE #define __NSXMLNode_h_GNUSTEP_BASE_INCLUDE #import #import #import #if defined(__cplusplus) extern "C" { #endif @class NSArray; @class NSDictionary; @class NSError; @class NSString; @class NSURL; @class NSXMLDocument; @class NSXMLElement; enum { NSXMLInvalidKind = 0, NSXMLDocumentKind, NSXMLElementKind, NSXMLAttributeKind, NSXMLNamespaceKind, NSXMLProcessingInstructionKind, NSXMLCommentKind, NSXMLTextKind, NSXMLDTDKind, NSXMLEntityDeclarationKind, NSXMLAttributeDeclarationKind, NSXMLElementDeclarationKind, NSXMLNotationDeclarationKind }; typedef NSUInteger NSXMLNodeKind; // initWithKind options // NSXMLNodeOptionsNone // NSXMLNodePreserveAll // NSXMLNodePreserveNamespaceOrder // NSXMLNodePreserveAttributeOrder // NSXMLNodePreserveEntities // NSXMLNodePreservePrefixes // NSXMLNodeIsCDATA // NSXMLNodeExpandEmptyElement // NSXMLNodeCompactEmptyElement // NSXMLNodeUseSingleQuotes // NSXMLNodeUseDoubleQuotes // Output options // NSXMLNodePrettyPrint /* This next class declaration is private for internal use by the base * library developers ... it is present simply to make the compiler * produce symbol information to be used when debugging. */ #if defined(GSInternal) @class GSInternal; #endif /** * The most primitive unit in an XML document. */ GS_EXPORT_CLASS @interface NSXMLNode : NSObject { #if GS_NONFRAGILE # if defined(GS_NSXMLNode_IVARS) @public GS_NSXMLNode_IVARS; # endif #else /* Pointer to private additional data used to avoid breaking ABI * when we don't have the non-fragile ABI available. * Use this mechanism rather than changing the instance variable * layout (see Source/GSInternal.h for details). * In this case, when compiled the variable is a public class pointer * available so that the NSXMLNode subclasses within the base library * can share the same variables, but when viewed from outside the * base library itsself, it's an opaque pointer which must not be used. */ # if defined(GSInternal) @public GSInternal *_internal GS_UNUSED_IVAR; # else @private id _internal GS_UNUSED_IVAR; # endif #endif } /** * Creates and returns an attribute node with the specified name and value. */ + (id) attributeWithName: (NSString*)name stringValue: (NSString*)stringValue; /** * Creates and returns an attribute node with the specified * (fully qualified) name, namespace URI, and value. */ + (id) attributeWithName: (NSString*)name URI: (NSString*)URI stringValue: (NSString*)stringValue; /** * Creates and returns a comment node with the supplied text. */ + (id) commentWithStringValue: (NSString*)stringValue; /** Creates and returns an empty document ... convenience method. */ + (id) document; /** * Creates and returns a new document intialised with the supplied root * node. */ + (id) documentWithRootElement: (NSXMLElement*)element; /** * Creates and returns a DTD node from the supplied string. * The node might describe element, attribute, entity, or notation. */ + (id) DTDNodeWithXMLString: (NSString*)string; /** * Creates and returns a node node with the specified name. */ + (id) elementWithName: (NSString*)name; /** * Creates and returns a node containing the supplied child nodes and with * the attribute nodes from the supplied array. */ + (id) elementWithName: (NSString*)name children: (NSArray*)children attributes: (NSArray*)attributes; /** * Creates and returns a node with the supplied (fully qualified name) * an namespace URI. */ + (id) elementWithName: (NSString*)name URI: (NSString*)URI; /** * Creates and returns a node with the pecified name and with a single * text node (containing string) as its content. */ + (id) elementWithName: (NSString*)name stringValue: (NSString*)string; /** Strips any leading namespace prefix from name and returns the result. */ + (NSString*) localNameForName: (NSString*)name; /** * Creates and returns a node mapping the supplkied namespace name to * the string value (URI). */ + (id) namespaceWithName: (NSString*)name stringValue: (NSString*)stringValue; /** Returns the namespace node corresponding to a predefined namespace names * (one of xml, xs, or xsi) */ + (NSXMLNode*) predefinedNamespaceForPrefix: (NSString*)name; /** Returns the namespace prefix of name. */ + (NSString*) prefixForName: (NSString*)name; /** * Creates and return a processinc insruction node with th specified name * and textual value. */ + (id) processingInstructionWithName: (NSString*)name stringValue: (NSString*)stringValue; /** * Creates and returns a simple text node. */ + (id) textWithStringValue: (NSString*)stringValue; /** Returns the canonical form (see http://www.w3.org/TR/xml-c14n) of the * receiveri as long as the NSXMLNodePreserveWhitespace has been set. * If the option as not been set, return the same without white space * preserved. */ - (NSString*) canonicalXMLStringPreservingComments: (BOOL)comments; /** Returns the child node if the receiver at the specified index. */ - (NSXMLNode*) childAtIndex: (NSUInteger)index; /** Returns the number of immediate child nodes of the receiver.
* This method is more efficient than getting the array of children * and counting it. */ - (NSUInteger) childCount; /** Returns n array containing the immediate child nodes of the receiver. */ - (NSArray*) children; /** Detaches the receiver from its parent node. */ - (void) detach; /** Return the index of the receiver within its parent node. */ - (NSUInteger) index; /** Initialises the receiver as a specific kind of node.
* Calls -initWithKind:options: using NSXMLNodeOptionsNone and * returns the result. */ - (id) initWithKind: (NSXMLNodeKind)theKind; /** * Initialises the receiver as the specified kind of node and with the * specified options. */ - (id) initWithKind: (NSXMLNodeKind)theKind options: (NSUInteger)theOptions; /** Return the level of the receiver within the tree of nodes.
* A document or a node which is not inside another is at level 0. */ - (NSUInteger) level; /** Returns the name of the receiver without any namespace prefix. */ - (NSString*) localName; /** * Returns the kind of node represented by the receiver. */ - (NSXMLNodeKind) kind; /** Returns the name of the receiver. */ - (NSString*) name; /** Returns the next node in the tree. */ - (NSXMLNode*) nextNode; /** Returns the next sibling of the receiver */ - (NSXMLNode*) nextSibling; /** Returns the nodes resulting from applying xpath to the receiver.
* Before using xpath on a tree, you must call the * -normalizeAdjacentTextNodesPreservingCDATA: with NO as the argument, * in order to avoid problems where the xpath syntax cannot cope with * multiple text nodes. */ - (NSArray*) nodesForXPath: (NSString*)anxpath error: (NSError**)error; /** Returns the data resulting from calling the query on the receiver.
* The same as objectsForXQuery:constants:error: without the constants. */ - (NSArray*) objectsForXQuery: (NSString*)xquery error: (NSError**)error; /** Returns the data resulting from calling the query on the receiver.
* Before using xpath on a tree, you must call the * -normalizeAdjacentTextNodesPreservingCDATA: with NO as the argument, * in order to avoid problems where the xpath syntax cannot cope with * multiple text nodes.
* The value of constants is a dictionary of constants declared * to be "external" in the query.
* The resulting array amy contain array, data, date, number, string, * and URL objects as well as nodes. */ - (NSArray*) objectsForXQuery: (NSString*)xquery constants: (NSDictionary*)constants error: (NSError**)error; /** * Returns the object value of the receiver (as set using -setObjectValue:) * or nil if there is none. */ - (id) objectValue; /** * Returns the parent node of the receiver or nil if the receiver is not * within another node. */ - (NSXMLNode*) parent; /** Returns the namepsace prefix for the receiver or nil if there is no * namespace prefix. */ - (NSString*) prefix; /** Returns the previous node in the tree ... stepping through the tree * backwards. */ - (NSXMLNode*) previousNode; /* Returns the previous sibling of the receiver. */ - (NSXMLNode*) previousSibling; /** Returns the document containing the receiver, or nil if the receiver * does not lie within a document. */ - (NSXMLDocument*) rootDocument; /** Sets the name of the receiver. */ - (void) setName: (NSString*)name; /** Sets the content of the receiver, removing any existing children * (including comments and processing instructions).
* For an element node, this sets text contetn within the node. */ - (void) setObjectValue: (id)value; /** * Sets the content of the receiver to be the supplied string value ... * which involves removing existing content, comments, * and processing instructions.
* If the receiver is an element node, this creates a text node containing * the string value as the sole child of the receiver. */ - (void) setStringValue: (NSString*)string; /** * Sets the string content of the receiver.
* if the resolve flag is YES then any entities which can be resolved are * replaced by the resolved versions. */ - (void) setStringValue: (NSString*)string resolvingEntities: (BOOL)resolve; /** Sets the URI of the receiver. */ - (void) setURI: (NSString*)URI; /** Returns the string value of the receiver. For kinds of node which have * direct string content, this simply returns that content. For elements * this recursively traverses the children of the receiver appending the * text of each child to a single string result. */ - (NSString*) stringValue; /** Returns the URI of the receiver. */ - (NSString*) URI; /** Returns the XPath string to access the receiver with the document. */ - (NSString*) XPath; /** * Returns the text of the receiver as XML (ie in the form it would have * in an XML document). */ - (NSString*) XMLString; /** * Returns the text of the receiver as XML (ie in the form it would have * in an XML document), with the specified options controlling it. */ - (NSString*) XMLStringWithOptions: (NSUInteger)theOptions; @end #if defined(__cplusplus) } #endif #endif /*__NSXMLNode_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSXMLNodeOptions.h000066400000000000000000000124621435650067400231340ustar00rootroot00000000000000/* Interface for NSXMLNodeOptions for GNUStep Copyright (C) 2008 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: September 2008 This file is part of the GNUstep Base Library. 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 3 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 USA. */ #ifndef __NSXMLNodeOptions_h_GNUSTEP_BASE_INCLUDE #define __NSXMLNodeOptions_h_GNUSTEP_BASE_INCLUDE #import #import #if defined(__cplusplus) extern "C" { #endif /** This enumeration is a bitmask specifying input and output options * for nnode. * * NSXMLNodeIsCDATA * Indicates that a text node is CDATA * NSXMLNodeExpandEmptyElement * The element should be expanded when empty, * eg <elementname></elementname>. * For some reason MacOS-X specifies this as the default setting. * NSXMLNodeCompactEmptyElement * This element should be compact when empty, * eg <elementname/> * NSXMLNodeUseSingleQuotes * Use single quotes on this attribute or namespace * NSXMLNodeUseDoubleQuotes * Use double quotes on this attribute or namespace. * MacOS-X specifies this as the default setting. * NSXMLNodeOptionsNone * Use the default options for this node * NSXMLNodePreserveAll * Turn all preservation options on * NSXMLNodePreserveNamespaceOrder * Preserve the order of namespaces * NSXMLNodePreserveAttributeOrder * Preserve the order of attributes * NSXMLNodePreserveEntities * Entities should not be resolved on output * NSXMLNodePreservePrefixes * Prefixes should not be chosen based on closest URI definition * NSXMLNodePreserveCDATA * CDATA should be preserved * NSXMLNodePreserveEmptyElements * Remember whether an empty element was expanded or compact * NSXMLNodePreserveQuotes * Remember whether an attribute used single or double quotes * NSXMLNodePreserveWhitespace * Preserve non-content whitespace * NSXMLNodePreserveDTD * Preserve the DTD until it is modified * NSXMLDocumentTidyHTML * Try to change HTML into valid XHTML * NSXMLDocumentTidyXML * Try to change malformed XML into valid XML * NSXMLDocumentValidate * Validate this document against its DTD * NSXMLNodePrettyPrint * Output this node in a readable format * NSXMLDocumentIncludeContentTypeDeclaration * Include a content type declaration for HTML or XHTML */ enum { NSXMLNodeOptionsNone = 0, NSXMLNodeIsCDATA = 1 << 0, NSXMLNodeExpandEmptyElement = 1 << 1, NSXMLNodeCompactEmptyElement = 1 << 2, NSXMLNodeUseSingleQuotes = 1 << 3, NSXMLNodeUseDoubleQuotes = 1 << 4, NSXMLDocumentTidyHTML = 1 << 9, NSXMLDocumentTidyXML = 1 << 10, NSXMLDocumentValidate = 1 << 13, #if OS_API_VERSION(MAC_OS_X_VERSION_10_7,GS_API_LATEST) NSXMLNodeLoadExternalEntitiesAlways = 1 << 14, NSXMLNodeLoadExternalEntitiesSameOriginOnly = 1 << 15, #endif NSXMLDocumentXInclude = 1 << 16, NSXMLNodePrettyPrint = 1 << 17, NSXMLDocumentIncludeContentTypeDeclaration = 1 << 18, #if OS_API_VERSION(MAC_OS_X_VERSION_10_7,GS_API_LATEST) NSXMLNodeLoadExternalEntitiesNever = 1 << 19, #endif NSXMLNodePreserveNamespaceOrder = 1 << 20, NSXMLNodePreserveAttributeOrder = 1 << 21, NSXMLNodePreserveEntities = 1 << 22, NSXMLNodePreservePrefixes = 1 << 23, NSXMLNodePreserveCDATA = 1 << 24, NSXMLNodePreserveWhitespace = 1 << 25, NSXMLNodePreserveDTD = 1 << 26, NSXMLNodePreserveCharacterReferences = 1 << 27, NSXMLNodePreserveEmptyElements = (NSXMLNodeCompactEmptyElement | NSXMLNodeExpandEmptyElement), NSXMLNodePreserveQuotes = (NSXMLNodeUseDoubleQuotes | NSXMLNodeUseSingleQuotes), NSXMLNodePreserveAll = ( NSXMLNodePreserveAttributeOrder | NSXMLNodePreserveCDATA | NSXMLNodePreserveCharacterReferences | NSXMLNodePreserveDTD | NSXMLNodePreserveEmptyElements | NSXMLNodePreserveEntities | NSXMLNodePreserveNamespaceOrder | NSXMLNodePreservePrefixes | NSXMLNodePreserveQuotes | NSXMLNodePreserveWhitespace | 0xFFF00000) // high 12 bits }; #if defined(__cplusplus) } #endif #endif /*__NSXMLNodeOptions_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSXMLParser.h000066400000000000000000000324441435650067400221310ustar00rootroot00000000000000/** Interface for NSXMLParser for GNUStep Copyright (C) 2004 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: May 2004 This file is part of the GNUstep Base Library. 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 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 02111 USA. AutogsdocSource: NSXMLParser.m */ #ifndef __NSXMLParser_h_GNUSTEP_BASE_INCLUDE #define __NSXMLParser_h_GNUSTEP_BASE_INCLUDE #import #if OS_API_VERSION(MAC_OS_X_VERSION_10_3, GS_API_LATEST) #import #if defined(__cplusplus) extern "C" { #endif @class NSData, NSDictionary, NSError, NSInputStream, NSString, NSURL; /** * Domain for errors */ GS_EXPORT NSString* const NSXMLParserErrorDomain; /** * This class is a PRE-ALPHA implementation. You should be prepared to * track down and fix bugs and preferably contribute fixes back.
* If you don't want to do that, use the [GSXMLParser] class instead ... * This NSXMLParser class is implemented as a wrapper round some of the * functionality of the more powerful GSXML APIs, and is intended as a * MacOSX compatibility feature. *

* This class implements an event driven parser handling the parsing * process by sending messages to a delegate when certain parts of the * XML document being parsed are encountered. *

*

* To use the class, you create and initialise an instance with a particular * XML document, set the delegate of the instance, and send a -parse message * to it. The delegate must then make use of the information it receives * in the messages it gets from the parser. *

*

* The [NSObject(NSXMLParserDelegateEventAdditions)] informal protocol * documents the methods which the delegate object may implement in order * to handle the parsing process. *

*/ GS_EXPORT_CLASS @interface NSXMLParser : NSObject { #if GS_EXPOSE(NSXMLParser) @public void *_parser; // GSXMLParser void *_handler; // SAXHandler #endif #if GS_NONFRAGILE #else /* Pointer to private additional data used to avoid breaking ABI * when we don't have the non-fragile ABI available. * Use this mechanism rather than changing the instance variable * layout (see Source/GSInternal.h for details). */ @private id _internal GS_UNUSED_IVAR; #endif } /** * Terminates the current parse operation and sends an error to the * delegate of the parser. */ - (void) abortParsing; /** * Returns the delegate previously set using -setDelegate: or nil if * no delegate is set. */ - (id) delegate; /** * Convenience method fetching data from anURL.
*/ - (instancetype) initWithContentsOfURL: (NSURL*)anURL; /** * Initialises the parser with the specified xml data. */ - (instancetype) initWithData: (NSData*)data; /** * Initialises the parser with the specified input stream. */ - (instancetype) initWithStream: (NSInputStream*)stream; /** * Parses the supplied data and returns YES on success, NO otherwise. */ - (BOOL) parse; /** * Returns the last error produced by parsing (if any). */ - (NSError*) parserError; /** * Sets the parser delegate (which is not retained). */ - (void) setDelegate: (id)delegate; /** * Set flag to determine whether the namespaceURI and the qualified name * of an element is provided in the * [NSObject(NSXMLParserDelegateEventAdditions)-parser:didStartElement:namespaceURI:qualifiedName:attributes:] * and [NSObject(NSXMLParserDelegateEventAdditions)-parser:didEndElement:namespaceURI:qualifiedName:] methods. */ - (void) setShouldProcessNamespaces: (BOOL)aFlag; /** * Sets a flag to specify whether the parser should call the * [NSObject(NSXMLParserDelegateEventAdditions)-parser:didStartMappingPrefix:toURI:] and * [NSObject(NSXMLParserDelegateEventAdditions)-parser:didEndMappingPrefix:] delegate methods. */ - (void) setShouldReportNamespacePrefixes: (BOOL)aFlag; /** * Sets flag to determine if declarations of external entities are * reported using * [NSObject(NSXMLParserDelegateEventAdditions)-parser:foundExternalEntityDeclarationWithName:publicID:systemID:] */ - (void) setShouldResolveExternalEntities: (BOOL)aFlag; /** * Returns the value set by -setShouldProcessNamespaces: */ - (BOOL) shouldProcessNamespaces; /** * Returns the value set by -setShouldReportNamespacePrefixes: */ - (BOOL) shouldReportNamespacePrefixes; /** * Returns the value set by -setShouldResolveExternalEntities: */ - (BOOL) shouldResolveExternalEntities; @end @interface NSXMLParser (NSXMLParserLocatorAdditions) /** * Returns the current column number of the document being parsed. */ - (NSInteger) columnNumber; /** * Returns the current line number of the document being parsed. */ - (NSInteger) lineNumber; /** * Returns the public identifier of the external entity in the * document being parsed. */ - (NSString*) publicID; /** * Returns the system identifier of the external entity in the * document being parsed. */ - (NSString*) systemID; @end /** * Methods implemented by a delegate in order to make use of the parser.
* This is now a formal protocol. */ @protocol NSXMLParserDelegate #if OS_API_VERSION(MAC_OS_X_VERSION_10_6,GS_API_LATEST) && GS_PROTOCOLS_HAVE_OPTIONAL @optional #else @end @interface NSObject (NSXMLParserDelegateEventAdditions) #endif /** */ - (NSData*) parser: (NSXMLParser*)aParser resolveExternalEntityName: (NSString*)aName systemID: (NSString*)aSystemID; /** */ - (void) parser: (NSXMLParser*)aParser didEndElement: (NSString*)anElementName namespaceURI: (NSString*)aNamespaceURI qualifiedName: (NSString*)aQualifierName; /** */ - (void) parser: (NSXMLParser*)aParser didEndMappingPrefix: (NSString*)aPrefix; /** * Called when the start of an element is encountered in the document, * this provides the name of the element, a dictionary containing the * attributes (if any) and (where namespaces are used) the namespace * information for the element. */ - (void) parser: (NSXMLParser*)aParser didStartElement: (NSString*)anElementName namespaceURI: (NSString*)aNamespaceURI qualifiedName: (NSString*)aQualifierName attributes: (NSDictionary*)anAttributeDict; /** */ - (void) parser: (NSXMLParser*)aParser didStartMappingPrefix: (NSString*)aPrefix toURI: (NSString*)aNamespaceURI; /** */ - (void) parser: (NSXMLParser*)aParser foundAttributeDeclarationWithName: (NSString*)anAttributeName forElement: (NSString*)anElementName type: (NSString*)aType defaultValue: (NSString*)aDefaultValue; /** */ - (void) parser: (NSXMLParser*)aParser foundCDATA: (NSData*)aBlock; /** */ - (void) parser: (NSXMLParser*)aParser foundCharacters: (NSString*)aString; /** */ - (void) parser: (NSXMLParser*)aParser foundComment: (NSString*)aComment; /** */ - (void) parser: (NSXMLParser*)aParser foundElementDeclarationWithName: (NSString*)anElementName model: (NSString*)aModel; /** */ - (void) parser: (NSXMLParser*)aParser foundExternalEntityDeclarationWithName: (NSString*)aName publicID: (NSString*)aPublicID systemID: (NSString*)aSystemID; /** */ - (void) parser: (NSXMLParser*)aParser foundIgnorableWhitespace: (NSString*)aWhitespaceString; /** */ - (void) parser: (NSXMLParser*)aParser foundInternalEntityDeclarationWithName: (NSString*)aName value: (NSString*)aValue; /** */ - (void) parser: (NSXMLParser*)aParser foundNotationDeclarationWithName: (NSString*)aName publicID: (NSString*)aPublicID systemID: (NSString*)aSystemID; /** */ - (void) parser: (NSXMLParser*)aParser foundProcessingInstructionWithTarget: (NSString*)aTarget data: (NSString*)aData; /** */ - (void) parser: (NSXMLParser*)aParser foundUnparsedEntityDeclarationWithName: (NSString*)aName publicID: (NSString*)aPublicID systemID: (NSString*)aSystemID notationName: (NSString*)aNotationName; /** */ - (void) parser: (NSXMLParser*)aParser parseErrorOccurred: (NSError*)anError; /** */ - (void) parser: (NSXMLParser*)aParser validationErrorOccurred: (NSError*)anError; /** * Called when parsing ends. */ - (void) parserDidEndDocument: (NSXMLParser*)aParser; /** * Called when parsing begins. */ - (void) parserDidStartDocument: (NSXMLParser*)aParser; @end /* * Provide the same error codes as MacOS-X, even if we don't use them all. */ enum { NSXMLParserInternalError = 1, NSXMLParserOutOfMemoryError = 2, NSXMLParserDocumentStartError = 3, NSXMLParserEmptyDocumentError = 4, NSXMLParserPrematureDocumentEndError = 5, NSXMLParserInvalidHexCharacterRefError = 6, NSXMLParserInvalidDecimalCharacterRefError = 7, NSXMLParserInvalidCharacterRefError = 8, NSXMLParserInvalidCharacterError = 9, NSXMLParserCharacterRefAtEOFError = 10, NSXMLParserCharacterRefInPrologError = 11, NSXMLParserCharacterRefInEpilogError = 12, NSXMLParserCharacterRefInDTDError = 13, NSXMLParserEntityRefAtEOFError = 14, NSXMLParserEntityRefInPrologError = 15, NSXMLParserEntityRefInEpilogError = 16, NSXMLParserEntityRefInDTDError = 17, NSXMLParserParsedEntityRefAtEOFError = 18, NSXMLParserParsedEntityRefInPrologError = 19, NSXMLParserParsedEntityRefInEpilogError = 20, NSXMLParserParsedEntityRefInInternalSubsetError = 21, NSXMLParserEntityReferenceWithoutNameError = 22, NSXMLParserEntityReferenceMissingSemiError = 23, NSXMLParserParsedEntityRefNoNameError = 24, NSXMLParserParsedEntityRefMissingSemiError = 25, NSXMLParserUndeclaredEntityError = 26, NSXMLParserUnparsedEntityError = 28, NSXMLParserEntityIsExternalError = 29, NSXMLParserEntityIsParameterError = 30, NSXMLParserUnknownEncodingError = 31, NSXMLParserEncodingNotSupportedError = 32, NSXMLParserStringNotStartedError = 33, NSXMLParserStringNotClosedError = 34, NSXMLParserNamespaceDeclarationError = 35, NSXMLParserEntityNotStartedError = 36, NSXMLParserEntityNotFinishedError = 37, NSXMLParserLessThanSymbolInAttributeError = 38, NSXMLParserAttributeNotStartedError = 39, NSXMLParserAttributeNotFinishedError = 40, NSXMLParserAttributeHasNoValueError = 41, NSXMLParserAttributeRedefinedError = 42, NSXMLParserLiteralNotStartedError = 43, NSXMLParserLiteralNotFinishedError = 44, NSXMLParserCommentNotFinishedError = 45, NSXMLParserProcessingInstructionNotStartedError = 46, NSXMLParserProcessingInstructionNotFinishedError = 47, NSXMLParserNotationNotStartedError = 48, NSXMLParserNotationNotFinishedError = 49, NSXMLParserAttributeListNotStartedError = 50, NSXMLParserAttributeListNotFinishedError = 51, NSXMLParserMixedContentDeclNotStartedError = 52, NSXMLParserMixedContentDeclNotFinishedError = 53, NSXMLParserElementContentDeclNotStartedError = 54, NSXMLParserElementContentDeclNotFinishedError = 55, NSXMLParserXMLDeclNotStartedError = 56, NSXMLParserXMLDeclNotFinishedError = 57, NSXMLParserConditionalSectionNotStartedError = 58, NSXMLParserConditionalSectionNotFinishedError = 59, NSXMLParserExternalSubsetNotFinishedError = 60, NSXMLParserDOCTYPEDeclNotFinishedError = 61, NSXMLParserMisplacedCDATAEndStringError = 62, NSXMLParserCDATANotFinishedError = 63, NSXMLParserMisplacedXMLDeclarationError = 64, NSXMLParserSpaceRequiredError = 65, NSXMLParserSeparatorRequiredError = 66, NSXMLParserNMTOKENRequiredError = 67, NSXMLParserNAMERequiredError = 68, NSXMLParserPCDATARequiredError = 69, NSXMLParserURIRequiredError = 70, NSXMLParserPublicIdentifierRequiredError = 71, NSXMLParserLTRequiredError = 72, NSXMLParserGTRequiredError = 73, NSXMLParserLTSlashRequiredError = 74, NSXMLParserEqualExpectedError = 75, NSXMLParserTagNameMismatchError = 76, NSXMLParserUnfinishedTagError = 77, NSXMLParserStandaloneValueError = 78, NSXMLParserInvalidEncodingNameError = 79, NSXMLParserCommentContainsDoubleHyphenError = 80, NSXMLParserInvalidEncodingError = 81, NSXMLParserExternalStandaloneEntityError = 82, NSXMLParserInvalidConditionalSectionError = 83, NSXMLParserEntityValueRequiredError = 84, NSXMLParserNotWellBalancedError = 85, NSXMLParserExtraContentError = 86, NSXMLParserInvalidCharacterInEntityError = 87, NSXMLParserParsedEntityRefInInternalError = 88, NSXMLParserEntityRefLoopError = 89, NSXMLParserEntityBoundaryError = 90, NSXMLParserInvalidURIError = 91, NSXMLParserURIFragmentError = 92, NSXMLParserNoDTDError = 94, NSXMLParserDelegateAbortedParseError = 512 }; typedef NSUInteger NSXMLParserError; #if defined(__cplusplus) } #endif #endif #endif /* __NSXMLParser_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSXPCConnection.h000066400000000000000000000116511435650067400227630ustar00rootroot00000000000000/* Definition of class NSXPCConnection Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory Casamento Date: Tue Nov 12 23:50:29 EST 2019 This file is part of the GNUstep Library. 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 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 USA. */ #ifndef _NSXPCConnection_h_GNUSTEP_BASE_INCLUDE #define _NSXPCConnection_h_GNUSTEP_BASE_INCLUDE #include #include #include // for gid_t and uid_t #if OS_API_VERSION(MAC_OS_X_VERSION_10_8, GS_API_LATEST) #if defined(_WIN32) #if defined(_MSC_VER) typedef int pid_t; #endif typedef unsigned gid_t; typedef unsigned uid_t; #endif #if defined(__cplusplus) extern "C" { #endif @class NSMutableDictionary, NSString, NSOperationQueue, NSSet, NSLock, NSError; @class NSXPCConnection, NSXPCListener, NSXPCInterface, NSXPCListenerEndpoint; @protocol NSXPCListenerDelegate; DEFINE_BLOCK_TYPE(GSXPCProxyErrorHandler, void, NSError *); DEFINE_BLOCK_TYPE_NO_ARGS(GSXPCInterruptionHandler, void); DEFINE_BLOCK_TYPE_NO_ARGS(GSXPCInvalidationHandler, void); @protocol NSXPCProxyCreating - (id) remoteObjectProxy; - (id) remoteObjectProxyWithErrorHandler: (GSXPCProxyErrorHandler)handler; - (id) synchronousRemoteObjectProxyWithErrorHandler: (GSXPCProxyErrorHandler)handler; @end enum { NSXPCConnectionPrivileged = (1 << 12UL) }; typedef NSUInteger NSXPCConnectionOptions; GS_EXPORT_CLASS @interface NSXPCConnection : NSObject - (instancetype) initWithListenerEndpoint: (NSXPCListenerEndpoint *)endpoint; - (instancetype) initWithMachServiceName: (NSString *)name options: (NSXPCConnectionOptions)options; - (instancetype) initWithServiceName:(NSString *)serviceName; - (NSXPCListenerEndpoint *) endpoint; - (void) setEndpoint: (NSXPCListenerEndpoint *) endpoint; - (NSXPCInterface *) exportedInterface; - (void) setExportInterface: (NSXPCInterface *)exportedInterface; - (NSXPCInterface *) remoteObjectInterface; - (void) setRemoteObjectInterface: (NSXPCInterface *)remoteObjectInterface; - (id) remoteObjectProxy; - (void) setRemoteObjectProxy: (id)remoteObjectProxy; - (id) remoteObjectProxyWithErrorHandler:(GSXPCProxyErrorHandler)handler; - (NSString *) serviceName; - (void) setServiceName: (NSString *)serviceName; - (id) synchronousRemoteObjectProxyWithErrorHandler: (GSXPCProxyErrorHandler)handler; - (GSXPCInterruptionHandler) interruptionHandler; - (void) setInterruptionHandler: (GSXPCInterruptionHandler)handler; - (GSXPCInvalidationHandler) invalidationHandler; - (void) setInvalidationHandler: (GSXPCInvalidationHandler)handler; - (void) resume; - (void) suspend; - (void) invalidate; - (NSUInteger) auditSessionIdentifier; - (pid_t) processIdentifier; - (uid_t) effectiveUserIdentifier; - (gid_t) effectiveGroupIdentifier; @end @interface NSXPCListener : NSObject + (NSXPCListener *) serviceListener; + (NSXPCListener *) anonymousListener; - (instancetype) initWithMachServiceName:(NSString *)name; - (id ) delegate; - (void) setDelegate: (id ) delegate; - (NSXPCListenerEndpoint *) endpoint; - (void) setEndpoint: (NSXPCListenerEndpoint *)endpoint; - (void) resume; - (void) suspend; - (void) invalidate; @end @protocol NSXPCListenerDelegate - (BOOL) listener: (NSXPCListener *)listener shouldAcceptNewConnection: (NSXPCConnection *)newConnection; @end @interface NSXPCInterface : NSObject + (NSXPCInterface *) interfaceWithProtocol: (Protocol *)protocol; - (Protocol *) protocol; - (void) setProtocol: (Protocol *)protocol; - (void) setClasses: (NSSet *)classes forSelector: (SEL)sel argumentIndex: (NSUInteger)arg ofReply: (BOOL)ofReply; - (NSSet *) classesForSelector: (SEL)sel argumentIndex: (NSUInteger)arg ofReply: (BOOL)ofReply; - (void) setInterface: (NSXPCInterface *)ifc forSelector: (SEL)sel argumentIndex: (NSUInteger)arg ofReply: (BOOL)ofReply; - (NSXPCInterface *) interfaceForSelector: (SEL)sel argumentIndex: (NSUInteger)arg ofReply: (BOOL)ofReply; @end GS_EXPORT_CLASS @interface NSXPCListenerEndpoint : NSObject // NSSecureCoding @end #if defined(__cplusplus) } #endif #endif /* GS_API_MACOSX */ #endif /* _NSXPCConnection_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/Foundation/NSZone.h000066400000000000000000000273461435650067400212340ustar00rootroot00000000000000/** Zone memory management. -*- Mode: ObjC -*- Copyright (C) 1997,1998,1999 Free Software Foundation, Inc. Written by: Yoo C. Chung Date: January 1997 This file is part of the GNUstep Base Library. 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 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 USA. AutogsdocSource: NSZone.m AutogsdocSource: NSPage.m */ #ifndef __NSZone_h_GNUSTEP_BASE_INCLUDE #define __NSZone_h_GNUSTEP_BASE_INCLUDE #import "GNUstepBase/GSVersionMacros.h" /** * Primary structure representing an NSZone. Technically it * consists of a set of function pointers for zone upkeep functions plus some * other things- { // Functions for zone. void *(*malloc)(struct _NSZone *zone, size_t size); void *(*realloc)(struct _NSZone *zone, void *ptr, size_t size); void (*free)(struct _NSZone *zone, void *ptr); void (*recycle)(struct _NSZone *zone); BOOL (*check)(struct _NSZone *zone); BOOL (*lookup)(struct _NSZone *zone, void *ptr); // Zone statistics (not always maintained). struct NSZoneStats (*stats)(struct _NSZone *zone); size_t gran; // Zone granularity (passed in on initialization) NSString *name; // Name of zone (default is 'nil') NSZone *next; // Pointer used for internal management of multiple zones. } */ typedef struct _NSZone NSZone; #import @class NSString; #if defined(__cplusplus) extern "C" { #endif struct _NSZone { /* Functions for zone. */ void *(*malloc)(struct _NSZone *zone, size_t size); void *(*realloc)(struct _NSZone *zone, void *ptr, size_t size); void (*free)(struct _NSZone *zone, void *ptr); void (*recycle)(struct _NSZone *zone); BOOL (*check)(struct _NSZone *zone); BOOL (*lookup)(struct _NSZone *zone, void *ptr); struct NSZoneStats (*stats)(struct _NSZone *zone); size_t gran; // Zone granularity __unsafe_unretained NSString *name; // Name of zone (default is 'nil') NSZone *next; }; /** * Creates a new zone of start bytes, which will grow and shrink by * granularity bytes. If canFree is 0, memory in zone is allocated but * never freed, meaning allocation will be very fast. The whole zone can * still be freed with NSRecycleZone(), and you should still call NSZoneFree * on memory in the zone that is no longer needed, since a count of allocated * pointers is kept and must reach zero before freeing the zone.
* If Garbage Collection is enabled, this function does nothing other than * log a warning and return the same value as the NSDefaultMallocZone() * function. */ GS_EXPORT NSZone* NSCreateZone (NSUInteger start, NSUInteger gran, BOOL canFree); /** Returns the default zone for memory allocation. Memory created in this * zone is the same as memory allocates using the system malloc() function. */ GS_EXPORT NSZone* NSDefaultMallocZone (void); /** * Searches and finds the zone ptr was allocated from. The speed depends * upon the number of zones and their size.
* If Garbage Collection is enabled, this function always returns the * same as the NSDefaultMallocZone() function. */ GS_EXPORT NSZone* NSZoneFromPointer (void *ptr); /** * Allocates and returns memory for elems items of size bytes, in the * given zone. Returns NULL if allocation of size 0 requested. Raises * NSMallocException if not enough free memory in zone to * allocate and no more can be obtained from system, unless using the * default zone, in which case NULL is returned.
* If Garbage Collection is enabled, this function always allocates * non-scanned, non-collectable memory in the NSDefaultMallocZone() and * the zone argument is ignored. */ GS_EXPORT void* NSZoneMalloc (NSZone *zone, NSUInteger size); /** * Allocates and returns cleared memory for elems items of size bytes, in the * given zone. Returns NULL if allocation of size 0 requested. Raises * NSMallocException if not enough free memory in zone to * allocate and no more can be obtained from system, unless using the * default zone, in which case NULL is returned.
* If Garbage Collection is enabled, this function always allocates * non-scanned, non-collectable memory in the NSDefaultMallocZone() and * the zone argument is ignored. */ GS_EXPORT void* NSZoneCalloc (NSZone *zone, NSUInteger elems, NSUInteger bytes); /** * Reallocates the chunk of memory in zone pointed to by ptr to a new one of * size bytes. Existing contents in ptr are copied over. Raises an * NSMallocException if insufficient memory is available in the * zone and no more memory can be obtained from the system, unless using the * default zone, in which case NULL is returned.
* If Garbage Collection is enabled, the zone argument is ignored. */ GS_EXPORT void* NSZoneRealloc (NSZone *zone, void *ptr, NSUInteger size); /** * Return memory for an entire zone to system. In fact, this will not be done * unless all memory in the zone has been explicitly freed (by calls to * NSZoneFree()). For "non-freeable" zones, the number of NSZoneFree() calls * must simply equal the number of allocation calls. The default zone, on the * other hand, cannot be recycled.
* If Garbage Collection is enabled, this function has not effect. */ GS_EXPORT void NSRecycleZone (NSZone *zone); /** * Frees memory pointed to by ptr (which should have been allocated by a * previous call to NSZoneMalloc(), NSZoneCalloc(), or NSZoneRealloc()) and * returns it to zone. Note, if this is a nonfreeable zone, the memory is * not actually freed, but the count of number of free()s is updated.
* If Garbage Collection is enabled, the zone argument is ignored and this * function causes ptr to be deallocated immediately. */ GS_EXPORT void NSZoneFree (NSZone *zone, void *ptr); /** * Sets name of the given zone (useful for debugging and logging). */ GS_EXPORT void NSSetZoneName (NSZone *zone, NSString *name); /** * Returns the name of the given zone (useful for debugging and logging). */ GS_EXPORT NSString* NSZoneName (NSZone *zone); #if OS_API_VERSION(GS_API_NONE, GS_API_NONE) /** Deprecated ...
* Checks integrity of a zone. Not defined by OpenStep or OS X. */ BOOL NSZoneCheck (NSZone *zone); /** * NSZoneStats is the structure returned by the NSZoneStats() * function that summarizes the current usage of a zone. It is similar to * the structure mstats in the GNU C library. It has 5 fields of * type size_t- * * bytes_total * * This is the total size of memory managed by the zone, in bytes. * chunks_used * This is the number of memory chunks in use in the zone. * bytes_used * This is the number of bytes in use. * chunks_free * This is the number of memory chunks that are not in use. * bytes_free * * This is the number of bytes managed by the zone that are not in use. * * */ struct NSZoneStats { size_t bytes_total; size_t chunks_used; size_t bytes_used; size_t chunks_free; size_t bytes_free; }; /** Deprecated ...
* Obtain statistics about the zone. Implementation emphasis is on * correctness, not speed. Not defined by OpenStep or OS X. */ struct NSZoneStats NSZoneStats (NSZone *zone); /** * Try to get more memory - the normal process has failed. * If we can't do anything, just return a null pointer. * Try to do some logging if possible. */ void* GSOutOfMemory(NSUInteger size, BOOL retry); /** * Called during +initialize to tell the class that instances created * in future should have the specified instance variable as a weak * pointer for garbage collection.
* NB. making a pointer weak does not mean that it is automatically * zeroed when the object it points to is garbage collected. To get that * behavior you must asign values to the pointer using the * GSAssignZeroingWeakPointer() function.
* This function has no effect if the system is * not built for garbage collection. */ GS_EXPORT void GSMakeWeakPointer(Class theClass, const char *iVarName); /** * This function must be used to assign a value to a zeroing weak pointer.
* A zeroing weak pointer is one where, when the garbage collector collects * the object pointed to, it also clears the weak pointer.
* Assigning zero (nil) will always succeed and has the effect of telling the * garbage collector that it no longer needs to track the previously assigned * object. Apart from that case, a source needs to be garbage collectable for * this function to work, and using a non-garbage collectable value will * cause the function to return NO.
* If the destination object (the weak pointer watching the source object) * belongs to a chunk of memory which may be collected before the source * object is collected, it is important that it is finalised and the * finalisation code assigns zero to the pointer.
* If garbage collection is not in use, this function performs a simple * assignment returning YES, unless destination is null in which case it * returns NO. */ GS_EXPORT BOOL GSAssignZeroingWeakPointer(void **destination, void *source); #endif GS_EXPORT NSUInteger NSPageSize (void) __attribute__ ((const)); GS_EXPORT NSUInteger NSLogPageSize (void) __attribute__ ((const)); GS_EXPORT NSUInteger NSRoundDownToMultipleOfPageSize (NSUInteger bytes) __attribute__ ((const)); GS_EXPORT NSUInteger NSRoundUpToMultipleOfPageSize (NSUInteger bytes) __attribute__ ((const)); GS_EXPORT NSUInteger NSRealMemoryAvailable (void); GS_EXPORT void* NSAllocateMemoryPages (NSUInteger bytes); GS_EXPORT void NSDeallocateMemoryPages (void *ptr, NSUInteger bytes); GS_EXPORT void NSCopyMemoryPages (const void *src, void *dest, NSUInteger bytes); #if OS_API_VERSION(MAC_OS_X_VERSION_10_4, OS_API_LATEST) enum { NSScannedOption = (1<<0), NSCollectorDisabledOption = (1<<1) }; /** Allocate memory. If garbage collection is not enabled this uses the * default malloc zone and the options are ignored.
* If garbage collection is enabled, the allocate memory is normally not * scanned for pointers but is itsself garbage collectable. The options * argument is a bitmask in which NSScannedOption sets the memory to be * scanned for pointers by the garbage collector, and * NSCollectorDisabledOption causes the memory to be excempt from being * garbage collected itsself.
* In any case the memory returned is zero'ed. */ GS_EXPORT void * NSAllocateCollectable(NSUInteger size, NSUInteger options); /** Reallocate memory to be of a different size and/or to have different * options settings. The behavior of options is as for * the NSAllocateCollectable() function. */ GS_EXPORT void * NSReallocateCollectable(void *ptr, NSUInteger size, NSUInteger options); #endif static inline id NSMakeCollectable(const void *cf) { #if __has_feature(objc_arc) return nil; #else return (id)cf; // Unimplemented; garbage collection is deprecated. #endif } #if defined(__cplusplus) } #endif #endif /* not __NSZone_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/GNUstepBase/000077500000000000000000000000001435650067400177055ustar00rootroot00000000000000gnustep-base-1.29.0/Headers/GNUstepBase/.cvsignore000066400000000000000000000000361435650067400217040ustar00rootroot00000000000000config.h GSConfig.h preface.h gnustep-base-1.29.0/Headers/GNUstepBase/Additions.h000066400000000000000000000044321435650067400217770ustar00rootroot00000000000000/* Global include file for the GNUstep Base Additions Library. Copyright (C) 2010 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: Feb 2010 This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #ifndef __Additions_h_GNUSTEP_BASE_INCLUDE #define __Additions_h_GNUSTEP_BASE_INCLUDE #import #import #if !(defined(NeXT_RUNTIME) || defined(Apple_RUNTIME)) #import #endif #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import #endif /* __Additions_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/GNUstepBase/CXXException.h000066400000000000000000000024671435650067400224100ustar00rootroot00000000000000 struct _Unwind_Exception; /** * CXXException class implements a boxed C++ exception. This class should * never be created directly by the user. * * When using libobjc2, you can catch C++ exceptions by declaring this class as * a catch parameter, for example: * * @catch(CXXException *e) * * The caught instance will be autoreleased and does not need to be manually * freed. */ GS_EXPORT_CLASS @interface CXXException : NSObject { /** Exception object, as defined by the CodeSourcery exception ABI. */ struct _Unwind_Exception *ex; } /** * Constructor called by the runtime. */ + (id) exceptionWithForeignException: (struct _Unwind_Exception*)ex; /** * Returns a pointer to the thrown value. When a value is thrown in C++, it is * copied into the exception structure. The real type of the pointee is the * type of the object that was thrown. */ - (void*) thrownValue; /** * Returns a pointer to a std::type_info (C++) object defining the type of the * value pointed to by the return from -thrownValue. You may compare this with * the result of the typeinfo() operator in Objective-C++ to determine the type * of the object. */ - (void*) cxx_type_info; /** * Rethrows the exception. Sending messages to this object after is has been * rethrown has undefined behaviour. */ - (void) rethrow; @end gnustep-base-1.29.0/Headers/GNUstepBase/DistributedObjects.h000066400000000000000000000055331435650067400236600ustar00rootroot00000000000000/* Interface internal use by Distributed Objects components Copyright (C) 1997 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: August 1997 This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #ifndef __DistributedObjects_h #define __DistributedObjects_h /* * For INTERNAL use by the GNUstep base library. * This file should not be installed. The only reason why it is * located here, is to allow target specific headers (like mframe.h), * which are located according to dis/enabled-flattened, * may include this file via standard "GNUstepBase/DistributedObjects.h" * and won't require an extra -I flag. * * Classes should implement [-classForPortCoder] to return the class * that should be sent over the wire. * * Classes should implement [-replacementObjectForPortCoder:] to encode * objects. * The default action is to send a proxy. */ #import #import #import #import /* * Distributed Objects identifiers * These define the type of messages sent by the D.O. system. */ enum { METHOD_REQUEST = 0, METHOD_REPLY, ROOTPROXY_REQUEST, ROOTPROXY_REPLY, CONNECTION_SHUTDOWN, METHODTYPE_REQUEST, METHODTYPE_REPLY, PROXY_RELEASE, PROXY_RETAIN, RETAIN_REPLY }; /* * Category containing the methods by which the public interface to * NSConnection must be extended in order to allow it's use by * by NSDistantObject et al for implementation of Distributed objects. */ @interface NSConnection (Internal) - (NSDistantObject*) includesLocalTarget: (unsigned)target; - (NSDistantObject*) localForObject: (id)object; - (NSDistantObject*) locateLocalTarget: (unsigned)target; - (NSDistantObject*) proxyForTarget: (unsigned)target; - (void) retainTarget: (unsigned)target; - (void) forwardInvocation: (NSInvocation *)inv forProxy: (NSDistantObject*)object; - (const char *) typeForSelector: (SEL)sel remoteTarget: (unsigned)target; @end @interface NSPort (Internal) - (id) conversation: (NSPort*)receivePort; @end #endif /* __DistributedObjects_h */ gnustep-base-1.29.0/Headers/GNUstepBase/GCObject.h000066400000000000000000000055661435650067400215120ustar00rootroot00000000000000/** Interface for simple garbage collected classes Copyright (C) 2002 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Inspired by gc classes of Ovidiu Predescu and Mircea Oancea This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. AutogsdocSource: Additions/GCObject.m AutogsdocSource: Additions/GCArray.m AutogsdocSource: Additions/GCDictionary.m */ #ifndef __INCLUDED_GCOBJECT_H #define __INCLUDED_GCOBJECT_H #ifndef NeXT_Foundation_LIBRARY #import #import #import #import #else #import #endif #if defined(__cplusplus) extern "C" { #endif @class GCObject; typedef struct { GCObject *next; GCObject *previous; struct { unsigned visited:1; unsigned refCount:31; } flags; } gcInfo; GS_EXPORT_CLASS @interface GCObject : NSObject { gcInfo gc; } + (void) gcCollectGarbage; + (BOOL) gcIsCollecting; + (void) gcObjectWillBeDeallocated: (GCObject*)anObject; - (void) gcDecrementRefCount; - (void) gcDecrementRefCountOfContainedObjects; - (void) gcIncrementRefCount; - (BOOL) gcIncrementRefCountOfContainedObjects; @end @interface GCObject (Extra) - (GCObject*) gcNextObject; - (GCObject*) gcPreviousObject; - (GCObject*) gcSetNextObject: (GCObject*)anObject; - (GCObject*) gcSetPreviousObject: (GCObject*)anObject; - (BOOL) gcAlreadyVisited; - (void) gcSetVisited: (BOOL)flag; @end GS_EXPORT_CLASS @interface GCArray : NSArray { gcInfo gc; id *_contents; // C array of content objects BOOL *_isGCObject; // Is content object collectable? unsigned int _count; // Number of content objects. } @end GS_EXPORT_CLASS @interface GCMutableArray : NSMutableArray { gcInfo gc; id *_contents; BOOL *_isGCObject; unsigned _count; unsigned _maxCount; // Maximum number of content objects. } @end GS_EXPORT_CLASS @interface GCDictionary : NSDictionary { gcInfo gc; NSMapTable *_map; } @end GS_EXPORT_CLASS @interface GCMutableDictionary : NSMutableDictionary { gcInfo gc; NSMapTable *_map; } @end #if defined(__cplusplus) } #endif #endif /* __INCLUDED_GCOBJECT_H */ gnustep-base-1.29.0/Headers/GNUstepBase/GNUstep.h000066400000000000000000000321141435650067400214040ustar00rootroot00000000000000/* GNUstep.h - macros to make easier to port gnustep apps to macos-x Copyright (C) 2001 Free Software Foundation, Inc. Written by: Nicola Pero Date: March, October 2001 This file is part of GNUstep. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public 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 __GNUSTEP_GNUSTEP_H_INCLUDED_ #define __GNUSTEP_GNUSTEP_H_INCLUDED_ /* The contents of this file are designed to be usable with either * GNUstep-base or MacOS-X Foundation. */ #ifndef __has_feature # define __has_feature(x) 0 #endif /* * __has_extension has slightly different semantics from __has_feature. * It evaluates to true if the feature is supported by by clang for the * current compilation unit (language and -f switches), regardless of * whether it is part of the language standard or just a (non-standard) * extension. */ #ifndef __has_extension # define __has_extension(x) __has_feature(x) #endif /* * __has_attribute is the equivalent to __has_feature and __has_extension * for GNU-style attributes. */ #ifndef __has_attribute # define __has_attribute(x) 0 #endif /* This set of macros is provided to make it relatively simple to write * code which works both when compiled with an ObjC-2 compiler and ARC * or with an ObjC-1 compiler with manual retain counting. * In essence, it conditionally compiles all the operations where manual * retain count management is needed if ARC is not in use. */ #if __has_feature(objc_arc) #ifndef RETAIN #define RETAIN(object) (object) #endif #ifndef RELEASE #define RELEASE(object) #endif #ifndef AUTORELEASE #define AUTORELEASE(object) (object) #endif #ifndef TEST_RETAIN #define TEST_RETAIN(object) (object) #endif #ifndef TEST_RELEASE #define TEST_RELEASE(object) #endif #ifndef TEST_AUTORELEASE #define TEST_AUTORELEASE(object) (object) #endif #ifndef ASSIGN #define ASSIGN(object,value) object = (value) #endif #ifndef ASSIGNCOPY #define ASSIGNCOPY(object,value) object = [(value) copy] #endif #ifndef ASSIGNMUTABLECOPY #define ASSIGNMUTABLECOPY(object,value) object = [(value) mutableCopy] #endif #ifndef DESTROY #define DESTROY(object) object = nil #endif #ifndef DEALLOC #define DEALLOC #endif #ifndef ENTER_POOL #define ENTER_POOL @autoreleasepool{ #endif #ifndef LEAVE_POOL #define LEAVE_POOL } #endif #ifndef IF_NO_ARC #define IF_NO_ARC(X) #endif #ifndef IF_NO_GC #define IF_NO_GC(X) #endif #else #ifndef RETAIN /** * Basic retain operation ... calls [NSObject-retain]
* Does nothing when ARC is in use. */ #define RETAIN(object) [(id)(object) retain] #endif #ifndef RELEASE /** * Basic release operation ... calls [NSObject-release]
* Does nothing when ARC is in use. */ #define RELEASE(object) [(id)(object) release] #endif #ifndef AUTORELEASE /** * Basic autorelease operation ... calls [NSObject-autorelease]
* Does nothing when ARC is in use. */ #define AUTORELEASE(object) [(id)(object) autorelease] #endif #ifndef TEST_RETAIN /** * Tested retain - only invoke the * objective-c method if the receiver is not nil.
* Does nothing when ARC is in use. */ #define TEST_RETAIN(object) ({\ void *__object = (void*)(object);\ (__object != 0) ? [(id)__object retain] : nil; }) #endif #ifndef TEST_RELEASE /** * Tested release - only invoke the * objective-c method if the receiver is not nil.
* Does nothing when ARC is in use. */ #define TEST_RELEASE(object) ({\ void *__object = (void*)(object);\ if (__object != 0) [(id)__object release]; }) #endif #ifndef TEST_AUTORELEASE /** * Tested autorelease - only invoke the * objective-c method if the receiver is not nil.
* Does nothing when ARC is in use. */ #define TEST_AUTORELEASE(object) ({\ void *__object = (void*)(object);\ (__object != 0) ? [(id)__object autorelease] : nil; }) #endif #ifndef ASSIGN /** * ASSIGN(object,value) assigns the value to the object with * appropriate retain and release operations.
* Use this to avoid retain/release errors. */ #define ASSIGN(object,value) ({\ void *__object = (void*)object; \ object = (__typeof__(object))[(value) retain]; \ [(id)__object release]; \ }) #endif #ifndef ASSIGNCOPY /** * ASSIGNCOPY(object,value) assigns a copy of the value to the object * with release of the original.
* Use this to avoid retain/release errors. */ #define ASSIGNCOPY(object,value) ({\ void *__object = (void*)object; \ object = (__typeof__(object))[(value) copy];\ [(id)__object release]; \ }) #endif #ifndef ASSIGNMUTABLECOPY /** * ASSIGNMUTABLECOPY(object,value) assigns a mutable copy of the value * to the object with release of the original.
* Use this to avoid retain/release errors. */ #define ASSIGNMUTABLECOPY(object,value) ({\ void *__object = (void*)object; \ object = (__typeof__(object))[(value) mutableCopy];\ [(id)__object release]; \ }) #endif #ifndef DESTROY /** * DESTROY() is a release operation which also sets the variable to be * a nil pointer for tidiness - we can't accidentally use a DESTROYED * object later. It also makes sure to set the variable to nil before * releasing the object - to avoid side-effects of the release trying * to reference the object being released through the variable. */ #define DESTROY(object) ({ \ void *__o = (void*)object; \ object = nil; \ [(id)__o release]; \ }) #endif #ifndef DEALLOC /** * DEALLOC calls the superclass implementation of dealloc, unless * ARC is in use (in which case it does nothing). */ #define DEALLOC [super dealloc]; #endif #ifndef ENTER_POOL /** * ENTER_POOL creates an autorelease pool and places subsequent code * in a block.
* The block must be terminated with a corresponding LEAVE_POOL.
* You should not break, continue, or return from such a block of code * (to do so could leak an autorelease pool and give objects a longer * lifetime than they ought to have. If you wish to leave the block of * code early, you should ensure that doing so causes the autorelease * pool outside the block to be released promptly (since that will * implicitly release the pool created at the start of the block too). */ #define ENTER_POOL {NSAutoreleasePool *_lARP=[NSAutoreleasePool new]; #endif #ifndef LEAVE_POOL /** * LEAVE_POOL terminates a block of code started with ENTER_POOL. */ #define LEAVE_POOL [_lARP drain];} #endif #ifndef IF_NO_ARC /** * Compile-in X if (and only if) ARC is not in use. This is provided * to handle obscure cases not covered by the other macros. */ #define IF_NO_ARC(X) X #endif #ifndef IF_NO_GC /** * DEPRECATED ... use IF_NO_ARC() instead. */ #define IF_NO_GC(X) X #endif #endif #ifndef CREATE_AUTORELEASE_POOL /** DEPRECATED ... use ENTER_POOL and LEAVE_POOL and make sure your * code does not break/continue/return out of the section of code. */ #define CREATE_AUTORELEASE_POOL(X) \ NSAutoreleasePool *X = [NSAutoreleasePool new] #endif #ifndef RECREATE_AUTORELEASE_POOL /** DEPRECATED ... use ENTER_POOL and LEAVE_POOL and make sure your * code does not break/continue/return out of the section of code. */ #define RECREATE_AUTORELEASE_POOL(X) \ DESTROY(X);\ X = [NSAutoreleasePool new] #endif /** *

* This function (macro) is a GNUstep extension. *

*

* _(@"My string to translate") *

*

* is basically equivalent to *

*

* NSLocalizedString(@"My string to translate", @"") *

*

* It is useful when you need to translate an application * very quickly, as you just need to enclose all strings * inside _(). But please note that when you * use this macro, you are not taking advantage of comments * for the translator, so consider using * NSLocalizedString instead when you need a * comment. *

*

You may define GS_LOCALISATION_BUNDLE_ID to the bundle identifier * of the bundle which is to provide the localisation information.
* This can be used when compiling a single file by specifying something like * '-D GS_LOCALISATION_BUNDLE_ID=$(FRAMEWORK_NAME)' in your make file.
* If this is not defined, the localisation is provided by your application's * main bundle exactly like the NSLocalizedString function. *

*

Alternatively you may define GS_LOCALISATION_BUNDLE to be the bundle * to be used to prvide the localisation information. *

*/ # define _(X) \ [GS_LOCALISATION_BUNDLE localizedStringForKey: (X) value: @"" table: nil] #if !defined(GS_LOCALISATION_BUNDLE) # if defined(GS_LOCALISATION_BUNDLE_ID) # define GS_LOCALISATION_BUNDLE [NSBundle bundleWithIdentifier: \ GS_LOCALISATION_BUNDLE_ID] # else # define GS_LOCALISATION_BUNDLE [NSBundle mainBundle] # endif #endif /** *

* This function (macro) is a GNUstep extension. *

*

* __(@"My string to translate") *

*

* is exactly the same as *

*

* GSLocalizedStaticString(@"My string to translate", @"") *

*

* It is useful when you need to translate an application very * quickly. You would use it as follows for static strings: *

*

* * NSString *message = __(@"Hello there"); * ... more code ... * NSLog (_(messages)); * *

*

* But please note that when you use this macro, you are not * taking advantage of comments for the translator, so * consider using GSLocalizedStaticString * instead when you need a comment. *

*/ #define __(X) X /* The better way for a static string, with a comment - use as follows - * * static NSString *string = GSLocalizedStaticString (@"New Game", * @"Menu Option"); * * NSLog (_(string)); * * If you need anything more complicated than this, please initialize * the static strings manually. */ /** *

* This function (macro) is a GNUstep extensions, and it is used * to localize static strings. Here is an example of a static * string: *

*

* * NSString *message = @"Hi there"; * ... some code ... * NSLog (message); * *

*

* This string can not be localized using the standard * openstep functions/macros. By using this gnustep extension, * you can localize it as follows: *

*

* * NSString *message = GSLocalizedStaticString (@"Hi there", * @"Greeting"); * * ... some code ... * * NSLog (NSLocalizedString (message, @"")); * *

*

* When the tools generate the * Localizable.strings file from the source * code, they will ignore the NSLocalizedString * call while they will extract the string (and the comment) * to localize from the GSLocalizedStaticString * call. *

*

* When the code is compiled, instead, the * GSLocalizedStaticString call is ignored (discarded, * it is a macro which simply expands to key), while * the NSLocalizedString will actually look up the * string for translation in the Localizable.strings * file. *

*

* Please note that there is currently no macro/function to * localize static strings using different tables. If you * need that functionality, you have either to prepare the * localization tables by hand, or to rewrite your code in * such a way as not to use static strings. *

*/ #define GSLocalizedStaticString(key, comment) key /** * To be used inside a method for making sure that a range does not specify * anything outside the size of an array/string. Raises exception if range * extends beyond [0,size]. Size must be an unsigned integer (NSUInteger). */ #define GS_RANGE_CHECK(RANGE, SIZE) \ if (RANGE.location > (NSUInteger)SIZE \ || RANGE.length > ((NSUInteger)SIZE - RANGE.location)) \ [NSException raise: NSRangeException format: @"in %s, range { %"\ PRIuPTR ", %" PRIuPTR " } extends beyond size (%" PRIuPTR ")", \ GSNameFromSelector(_cmd), RANGE.location, RANGE.length, (NSUInteger)SIZE] /** Checks whether INDEX is strictly less than OVER (within C array space). * INDEX and OVER must be unsigned integers (NSUInteger). */ #define CHECK_INDEX_RANGE_ERROR(INDEX, OVER) \ if ((NSUInteger)INDEX >= (NSUInteger)OVER) \ [NSException raise: NSRangeException \ format: @"in %s, index %" PRIuPTR " is out of range", \ GSNameFromSelector(_cmd), (NSUInteger)INDEX] #endif /* __GNUSTEP_GNUSTEP_H_INCLUDED_ */ gnustep-base-1.29.0/Headers/GNUstepBase/GSBlocks.h000066400000000000000000000076511435650067400215360ustar00rootroot00000000000000/** Definitions for block support for GNUStep Copyright (C) 2011 Free Software Foundation, Inc. This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #ifndef __GSBlocks_h_GNUSTEP_BASE_INCLUDE #define __GSBlocks_h_GNUSTEP_BASE_INCLUDE /* Define the has_feature pseudo-macro for GCC. */ #ifndef __has_feature #define __has_feature(x) 0 #endif #ifndef GCC_VERSION #define GCC_VERSION (__GNUC__ * 1000 + __GNUC_MINOR__) #endif #if __has_feature(blocks) #define BLOCK_SCOPE __block /** * Defines a block type. Will work whether or not the compiler natively * supports blocks. */ #define DEFINE_BLOCK_TYPE(name, retTy, argTys, ...) \ typedef retTy(^name)(argTys, ## __VA_ARGS__) #define DEFINE_BLOCK_TYPE_NO_ARGS(name, retTy) \ typedef retTy(^name)() /** * Calls a block. Works irrespective of whether the compiler supports blocks. */ #define CALL_NON_NULL_BLOCK(block, args, ...) block(args, ## __VA_ARGS__) /** * Calls a block without arguments. */ #define CALL_NON_NULL_BLOCK_NO_ARGS(block) block() #else /* Fall-back versions for when the compiler doesn't have native blocks support. */ #if (GCC_VERSION >= 3000) #define DEFINE_BLOCK_TYPE(name, retTy, argTys, ...) \ typedef struct {\ void *isa;\ int flags;\ int reserved;\ retTy (*invoke)(void*, argTys, ## __VA_ARGS__);\ } *name #define DEFINE_BLOCK_TYPE_NO_ARGS(name, retTy) \ typedef struct {\ void *isa;\ int flags;\ int reserved;\ retTy (*invoke)(void*);\ } *name #define CALL_NON_NULL_BLOCK(block, args, ...) block->invoke(block, args, ## __VA_ARGS__) #define CALL_NON_NULL_BLOCK_NO_ARGS(block) block->invoke(block) #define BLOCK_SCOPE #else /* GCC_VERSION >= 3000 */ #define DEFINE_BLOCK_TYPE(name, retTy, argTys...) \ typedef struct {\ void *isa;\ int flags;\ int reserved;\ retTy (*invoke)(void*, argTys);\ } *name #define DEFINE_BLOCK_TYPE_NO_ARGS(name, retTy) \ typedef struct {\ void *isa;\ int flags;\ int reserved;\ retTy (*invoke)(void*);\ } *name #define CALL_NON_NULL_BLOCK(block, args...) block->invoke(block, args) #define CALL_NON_NULL_BLOCK_NO_ARGS(block) block->invoke(block) #define BLOCK_SCOPE #endif /* GCC_VERSION >= 3000 */ #endif /* __has_feature(blocks) */ #define CALL_BLOCK(block, args...) ((NULL != block) ? CALL_NON_NULL_BLOCK(block, args) : nil) #define CALL_BLOCK_NO_ARGS(block) ((NULL != block) ? CALL_NON_NULL_BLOCK_NO_ARGS(block) : nil) #if __has_include() # include #else #ifdef __cplusplus extern "C" { #endif /** * _Block_copy and _Block_release are weakly imported, but can be assumed * to be available whenever a feature using blocks is accessed * by an application. */ /* weak attributed supported only with ELF, MINGW is COFF */ #ifndef __MINGW32__ void *_Block_copy(const void *) __attribute__((weak)); void _Block_release(const void *) __attribute__((weak)); #endif /* __MINGW32__ */ #ifdef __cplusplus } #endif #ifndef Block_copy # define Block_copy(x) ((__typeof__(x))_Block_copy((const void *)(x))) #endif #ifndef Block_release # define Block_release(x) _Block_release((const void *)(x)) #endif #endif /* __has_include() */ #endif /* __GSBlocks_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/GNUstepBase/GSConfig.h.in000066400000000000000000000335331435650067400221310ustar00rootroot00000000000000/* Machine/OS specific configuration information for GNUstep Please NOTE - GSConfig.h is generated by the configure script from the file GSConfig.h.in - changes/fixes need to be made to the original file, not to the GSConfig.h generated from it. Copyright (C) 1998-2010 Free Software Foundation, Inc. Written by: Richard frith-Macdonald This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #ifndef included_GSConfig_h #define included_GSConfig_h /* Check the compiler to see if we are building on/for ms-windows. * Whatever the compiler uses, we want a standard setting of _WIN64 * to indicate 64bit AND _WIN32 to indicate ms-windows. * These are defined by gcc, clang, and microsoft compilers anyway. */ #if defined(__WIN32__) \ || defined(__MS_WIN32__) \ || defined(__MINGW32__) # if !defined(_WIN32) # define _WIN32 # endif #endif #if defined(__WIN64__) \ || defined(__MS_WIN64__) \ || defined(__MINGW64__) # if !defined(__WIN64__) # define __WIN64__ # endif # if !defined(_WIN32) # define _WIN32 # endif #endif /* Check to see if this is a MINGW build (all we currently support) */ #if defined(__MINGW32__) || defined(__MINGW64__) # if !defined(__MINGW__) # define __MINGW__ # endif #endif // Make sure we expose the constants that we use in ObjC++ mode #ifndef __STDC_CONSTANT_MACROS #define __STDC_CONSTANT_MACROS 1 #endif #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 #endif #if !defined(NeXT_Foundation_LIBRARY) /* An alternate to GS_FAKE_MAIN which forces the user to call the NSProcessInfo initialization in 'main', GS_FAKE_MAIN must also be undefined. */ #if @GS_PASS_ARGUMENTS@ #define GS_PASS_ARGUMENTS @GS_PASS_ARGUMENTS@ #endif #define GS_FAKE_MAIN @GS_FAKE_MAIN@ #if GS_FAKE_MAIN /* * NOTE - if GS_FAKE_MAIN (above) is set to 1, this hack applies - and you * must make sure that this file is included in any file that implements * the 'main()' function and links with the GNUstep base libarary. * You should NOT include this file in a program that does not link with * the base library. * This file is included automatically in NSObject.h and Foundation.h * * The Foundation classe NSProcessInfo need access to the argc, argv, * and env variables of the main() function. The purpose of this (ugly hack) * definition is to give the gstep-base library the opportunity to implement * its own main function with private access to the global vars. The private * main() implementation (in NSProcessInfo.m) will then call the user defined * gnustep_base_user_main() function. * * The original hack was - ** Written by: Georg Tuparev, EMBL & Academia Naturalis, ** Heidelberg, Germany ** Tuparev@EMBL-Heidelberg.de ** ** NOTE! This is very dirty and dangerous trick. I spend several hours ** on thinking and man pages browsing, but couldn't find better solution. ** I know that I will spend 666 years in the Computer Hell for writing ** this hack, and the master devil (Bully Boy) will send me to write ** Windowz software. ** BTW, for writing this hack I got personal congratulations from Dennis ** Ritchie and Bjarne Stroustrup sent me a bunch of flowers and asked me ** to participate in the standardization committee for C-- v.6.0 as ** responsible for the new Tab-Overriding-Operator and Scope-Sensitive- ** Comments ... but this makes my situation even worse ;-) ** - Georg * * On some systems, there are other relatively clean workarounds, if this * applies to the system you are running on, your configuration script * should have set GS_FAKE_MAIN to zero, so that this define hack will * not be used. */ #define main gnustep_base_user_main #endif /* GS_FAKE_MAIN */ #endif /* * Definition to specify if your processor stores words with the most * significant byte first (like Motorola and SPARC, unlike Intel and VAX). */ #define GS_WORDS_BIGENDIAN @GS_WORDS_BIGENDIAN@ /* * Size definitions for standard types */ #define GS_SIZEOF_SHORT @ac_cv_sizeof_short@ #define GS_SIZEOF_INT @ac_cv_sizeof_int@ #define GS_SIZEOF_LONG @ac_cv_sizeof_long@ #define GS_SIZEOF_LONG_LONG @ac_cv_sizeof_long_long@ #define GS_SIZEOF_FLOAT @ac_cv_sizeof_float@ #define GS_SIZEOF_DOUBLE @ac_cv_sizeof_double@ #define GS_SIZEOF_VOIDP @ac_cv_sizeof_voidp@ /* * Size information to be places in bits 5 and 6 of type encoding bytes * in archives (bits 0 to 4 are used for basic type info and bit 7 is * used to mark cross-references to previously encoded objects). */ #define _GSC_S_SHT @_GSC_S_SHT@ #define _GSC_S_INT @_GSC_S_INT@ #define _GSC_S_LNG @_GSC_S_LNG@ #define _GSC_S_LNG_LNG @_GSC_S_LNG_LNG@ /* * Type definitions for types with known sizes. */ typedef @GS_SINT8@ gss8; typedef @GS_UINT8@ gsu8; typedef @GS_SINT16@ gss16; typedef @GS_UINT16@ gsu16; typedef @GS_SINT32@ gss32; typedef @GS_UINT32@ gsu32; typedef @GS_SINT64@ gss64; typedef @GS_UINT64@ gsu64; typedef @GS_SINT128@ gss128; typedef @GS_UINT128@ gsu128; typedef @GS_FLT32@ gsf32; typedef @GS_FLT64@ gsf64; /* * Integer type with same size as a pointer */ typedef @GS_UADDR@ gsuaddr; typedef @GS_SADDR@ gssaddr; typedef gsuaddr gsaddr; /* * Do we have real 64-bit and 128-bit integers or are we just pretending. */ #define GS_HAVE_I64 @GS_HAVE_I64@ #define GS_HAVE_I128 @GS_HAVE_I128@ /* * Ensure some standard types are defined. */ @INCLUDE_INTTYPES@ @DEFINE_INT8_T@ @DEFINE_UINT8_T@ @DEFINE_INT16_T@ @DEFINE_UINT16_T@ @DEFINE_INT32_T@ @DEFINE_UINT32_T@ @DEFINE_INT64_T@ @DEFINE_UINT64_T@ @DEFINE_INTPTR_T@ @DEFINE_UINTPTR_T@ /* * PTR Limit information replacements for buggy headers */ #if @BUGGY_PTR_LIMITS@ #undef INTPTR_MAX #define INTPTR_MAX @GS_INTPTR_MAX@ #undef INTPTR_MIN #define INTPTR_MIN @GS_INTPTR_MIN@ #undef UINTPTR_MAX #define UINTPTR_MAX @GS_UINTPTR_MAX@ #endif /* * Do we have zlib for file handle compression? */ #define USE_ZLIB @USE_ZLIB@ /* * Do we have the GNU Multiple-precision library for NSDecimal? */ //#define USE_GMP @USE_GMP@ #define USE_GMP 0 #ifdef GS_WITH_GC #undef GS_WITH_GC #endif #define GS_WITH_GC 0 /* * Define to say if we use NXConstantString or NSConstantString */ #define NXConstantString @NX_CONST_STRING_CLASS@ /* * Wide unicode character type. */ #ifndef UTF32Char #define UTF32Char uint32_t #endif /* * Native character type for use in systemcalls etc. */ #if defined(_WIN32) # define GSNativeChar uint16_t #else # define GSNativeChar char #endif /* * Types used to avoid exposing pthread header in NSLock.h * NB. These types should *never* be used except to provide enough space * in a class layout for the type of data actually used by the pthread * implementation of the current platform. */ typedef struct { uint8_t dummy[@GS_SIZEOF_COND_T@]; } gs_cond_public_t __attribute__((aligned (@GS_ALIGNOF_COND_T@))); typedef struct { uint8_t dummy[@GS_SIZEOF_COND_MUTEX_T@]; } gs_cond_mutex_public_t __attribute__((aligned (@GS_ALIGNOF_COND_MUTEX_T@))); typedef struct { uint8_t dummy[@GS_SIZEOF_MUTEX_T@]; } gs_mutex_public_t __attribute__((aligned (@GS_ALIGNOF_MUTEX_T@))); #define OBJC2RUNTIME @OBJC2RUNTIME@ #define BASE_NATIVE_OBJC_EXCEPTIONS @BASE_NATIVE_OBJC_EXCEPTIONS@ #define GS_NONFRAGILE @GS_NONFRAGILE@ #define GS_USE_LIBXML @HAVE_LIBXML@ #define GS_USE_GNUTLS @HAVE_GNUTLS@ #define GS_USE_AVAHI @HAVE_AVAHI@ #define GS_USE_MDNS @HAVE_MDNS@ #define GS_USE_ICU @HAVE_ICU@ #define GS_USE_LIBCURL @HAVE_LIBCURL@ #define GS_USE_LIBDISPATCH @HAVE_LIBDISPATCH@ #define GS_USE_LIBDISPATCH_RUNLOOP @HAVE_LIBDISPATCH_RUNLOOP@ #define GS_HAVE_NSURLSESSION @GS_HAVE_NSURLSESSION@ #define GS_HAVE_OBJC_ROOT_CLASS_ATTR @GS_HAVE_OBJC_ROOT_CLASS_ATTR@ #define GS_USE_WIN32_THREADS_AND_LOCKS @HAVE_WIN32_THREADS_AND_LOCKS@ #ifndef __has_include # define __has_include(x) 0 #endif #ifndef __has_feature # define __has_feature(x) 0 #endif #ifndef __has_builtin # define __has_builtin(x) 0 #endif /* * __has_extension has slightly different semantics from __has_feature. * It evaluates to true if the feature is supported by by clang for the * current compilation unit (language and -f switches), regardless of * whether it is part of the language standard or just a (non-standard) * extension. */ #ifndef __has_extension # define __has_extension(x) __has_feature(x) #endif #if defined(_WIN32) # define BOOL WinBOOL # define __OBJC_BOOL 1 # if defined(__MINGW__) # include # define GS_WINVER Windows2000 # elif defined(_MSC_VER) # include # define GS_WINVER _WIN32_WINNT_WIN10 # endif # ifndef _WIN32_WINNT # define _WIN32_WINNT GS_WINVER # endif # if !defined(WINVER) # define WINVER GS_WINVER # elif (WINVER < GS_WINVER) # undef WINVER # define WINVER GS_WINVER # endif // Trick to distinguish between MSYS/MinGW and MSYS2/MinGW32, the latter defines // __MINGW32_MAJOR_VERSION and __MINGW32_MINOR_VERSION for compatibility // but to a lower version than older MSYS/MinGW, but not the compound version // # if defined(__MINGW32_VERSION) # define __USE_W32_SOCKETS # include # include # else # include # include # endif # undef __OBJC_BOOL # undef BOOL #endif /* Used to annotate callback functions with __stdcall on Windows. */ #if defined(_WIN32) #define GS_WINAPI WINAPI #else #define GS_WINAPI #endif /* Include the blocks runtime header if it's available (It shouldn't matter * that this doesn't work on compilers that don't support __has_include(), * because they also don't support blocks). */ #if __has_include() # include #endif #ifndef _WIN32 #include /* Hack to get rid of warning in GNU libc 2.0.3. */ #endif /* The following group of lines maintained by the gstep-base configure */ #define GNUSTEP_BASE_VERSION @VERSION@ #define GNUSTEP_BASE_MAJOR_VERSION @MAJOR_VERSION@ #define GNUSTEP_BASE_MINOR_VERSION @MINOR_VERSION@ #define GNUSTEP_BASE_SUBMINOR_VERSION @SUBMINOR_VERSION@ #define GNUSTEP_BASE_GCC_VERSION @GCC_VERSION@ /* Do not use the following macros! */ #define OBJC_DEP(M) \ ({ static BOOL beenHere = NO; if (beenHere == NO) {\ beenHere = YES; fprintf(stderr, "%s:%d %s", __FILE__, __LINE__, (M));}}) #define OBJC_MALLOC(VAR, TYPE, NUM) \ (OBJC_DEP("OBJC_MALLOC is deprecated ... use malloc\n"),(VAR) = (TYPE *) malloc ((unsigned)(NUM)*sizeof(TYPE))) #define OBJC_VALLOC(VAR, TYPE, NUM) \ (OBJC_DEP("OBJC_VALLOC is deprecated\n"),(VAR) = (TYPE *) valloc ((unsigned)(NUM)*sizeof(TYPE))) #define OBJC_ATOMIC_MALLOC(VAR, TYPE, NUM) \ (OBJC_DEP("OBJC_ATOMIC_MALLOC is deprecated\n"),(VAR) = (TYPE *) malloc ((unsigned)(NUM)*sizeof(TYPE))) #define OBJC_REALLOC(VAR, TYPE, NUM) \ (OBJC_DEP("OBJC_REALLOC is deprecated ... use realloc\n"),(VAR) = (TYPE *) realloc ((VAR), (unsigned)(NUM)*sizeof(TYPE))) #define OBJC_CALLOC(VAR, TYPE, NUM) \ (OBJC_DEP("OBJC_CALLOC is deprecated ... use calloc\n"),(VAR) = (TYPE *) calloc ((unsigned)(NUM), sizeof(TYPE))) #define OBJC_FREE(PTR) (OBJC_DEP("OBJC_FREE is deprecated ... use free\n"), free (PTR)) #ifndef MAX #define MAX(a,b) \ ({__typeof__(a) _MAX_a = (a); __typeof__(b) _MAX_b = (b); \ _MAX_a > _MAX_b ? _MAX_a : _MAX_b; }) #endif #ifndef MIN #define MIN(a,b) \ ({__typeof__(a) _MIN_a = (a); __typeof__(b) _MIN_b = (b); \ _MIN_a < _MIN_b ? _MIN_a : _MIN_b; }) #endif #ifndef ABS #define ABS(a) \ ({__typeof__(a) _ABS_a = (a); \ _ABS_a < 0 ? -_ABS_a : _ABS_a; }) #endif #ifndef STRINGIFY #define STRINGIFY(s) XSTRINGIFY(s) #define XSTRINGIFY(s) #s #endif #ifndef OBJC_STRINGIFY #define OBJC_STRINGIFY(s) OBJC_XSTRINGIFY(s) #define OBJC_XSTRINGIFY(s) @#s #endif #ifndef PTR2LONG #define PTR2LONG(P) (((char*)(P))-(char*)0) #endif #ifndef LONG2PTR #define LONG2PTR(L) (((char*)0)+(L)) #endif #if VSPRINTF_RETURNS_LENGTH #define VSPRINTF_LENGTH(VSPF_CALL) (VSPF_CALL) #else #define VSPRINTF_LENGTH(VSPF_CALL) strlen((VSPF_CALL)) #endif /* VSPRINTF_RETURNS_LENGTH */ #if VASPRINTF_RETURNS_LENGTH #define VASPRINTF_LENGTH(VASPF_CALL) (VASPF_CALL) #else #define VASPRINTF_LENGTH(VASPF_CALL) strlen((VASPF_CALL)) #endif /* VSPRINTF_RETURNS_LENGTH */ /* Evil hack to stop gcc-4.1 complaining about a dealloc method which * does not call the superclass implementation. */ #define GSNOSUPERDEALLOC if (0) [super dealloc] #ifndef CF_EXCLUDE_CSTD_HEADERS #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #endif #if !__has_feature(objc_arc) // NetBSD > 6 defines __weak in cdefs_elf.h #ifdef __NetBSD__ #undef __weak #endif # if !defined(__weak) # define __weak # endif # if !defined(__strong) # define __strong # endif #endif #ifndef __unsafe_unretained # if !__has_feature(objc_arc) # define __unsafe_unretained # endif #endif #ifndef __bridge # if !__has_feature(objc_arc) # define __bridge # endif #endif #if __has_builtin(__builtin_unreachable) # define GS_UNREACHABLE() __builtin_unreachable() #else # define GS_UNREACHABLE() abort() #endif #endif /* included_GSConfig_h */ gnustep-base-1.29.0/Headers/GNUstepBase/GSFunctions.h000066400000000000000000000041641435650067400222650ustar00rootroot00000000000000/** Additional functions and macros for GNUStep Copyright (C) 2005 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: 2005 This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. AutogsdocSource: Additions/GSFunctions.m */ #ifndef __GSFunctions_h_GNUSTEP_BASE_INCLUDE #define __GSFunctions_h_GNUSTEP_BASE_INCLUDE #import "GNUstepBase/GNUstep.h" #import "GNUstepBase/GSObjCRuntime.h" #if defined(__cplusplus) extern "C" { #endif #define GSLocalizedStringFromTableInFramework(key, tbl, fpth, comment) \ [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" \ table: [bundle pathForGNUstepResource:(tbl) ofType: nil inDirectory: (fpth)] /* Now Support for Quick Localization */ /* The quickest possible way to localize a string: NSLog (_(@"New Game")); Please make use of the longer functions taking a comment when you get the time to localize seriously your code. */ #if GS_API_VERSION(GS_API_NONE,011500) @class NSArray; @class NSString; /** * Try to locate file/directory (aName).(anExtension) in paths. * Will return the first found or nil if nothing is found.
* Deprecated ... may be removed in later release. */ GS_EXPORT NSString *GSFindNamedFile(NSArray *paths, NSString *aName, NSString *anExtension); #endif #if defined(__cplusplus) } #endif #endif /* __NSPathUtilities_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/GNUstepBase/GSIArray.h000066400000000000000000000355451435650067400215130ustar00rootroot00000000000000/* A fast (Inline) array implementation without objc method overhead. * Copyright (C) 1998,1999 Free Software Foundation, Inc. * * Author: Richard Frith-Macdonald * Created: Nov 1998 * * This file is part of the GNUstep Base Library. * * 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 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 * Library General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02111 USA. */ #import #if OS_API_VERSION(GS_API_NONE,GS_API_LATEST) #if defined(GNUSTEP_BASE_INTERNAL) #import "Foundation/NSObject.h" #import "Foundation/NSException.h" #import "Foundation/NSGarbageCollector.h" #import "Foundation/NSZone.h" #else #import #import #import #import #endif /* To turn assertions on, define GSI_ARRAY_CHECKS */ #define GSI_ARRAY_CHECKS 1 #if defined(__cplusplus) extern "C" { #endif /* To easily un-inline functions for debugging */ #ifndef GS_STATIC_INLINE #define GS_STATIC_INLINE static inline #endif #ifdef GSI_ARRAY_CHECKS #define GSI_ARRAY_CHECK NSCAssert(array->count <= array->cap && array->old <= array->cap, NSInternalInconsistencyException) #else #define GSI_ARRAY_CHECK #endif /* * NB. This file is intended for internal use by the GNUstep libraries * and may change siugnificantly between releases. * While it is unlikley to be removed from the distributiuon any time * soon, its use by other software is not officially supported. * * This file should be INCLUDED in files wanting to use the GSIArray * functions - these are all declared inline for maximum performance. * * The file including this one may predefine some macros to alter * the behaviour (default macros assume the items are NSObjects * that are to be retained in the array) ... * * GSI_ARRAY_RETAIN() * Macro to retain an array item * * GSI_ARRAY_RELEASE() * Macro to release the item. * * The next two values can be defined in order to let us optimise * even further when either retain or release operations are not needed. * * GSI_ARRAY_NO_RELEASE * Defined if no release operation is needed for an item * GSI_ARRAY_NO_RETAIN * Defined if no retain operation is needed for a an item * * The value GSI_ARRAY_EXTRA may be defined as the type of an extra * field produced in every array. The name of this field is 'extra'. * * The value GSI_ARRAY_TYPE may be defined as an additional type * which must be valid as an array element. Otherwise the types are * controlled by the mechanism in GSUnion.h */ #ifdef GSI_ARRAY_NO_RETAIN #ifdef GSI_ARRAY_RETAIN #undef GSI_ARRAY_RETAIN #endif #define GSI_ARRAY_RETAIN(A, X) #else #ifndef GSI_ARRAY_RETAIN #define GSI_ARRAY_RETAIN(A, X) [(X).obj retain] #endif #endif #ifdef GSI_ARRAY_NO_RELEASE #ifdef GSI_ARRAY_RELEASE #undef GSI_ARRAY_RELEASE #endif #define GSI_ARRAY_RELEASE(A, X) #else #ifndef GSI_ARRAY_RELEASE #define GSI_ARRAY_RELEASE(A, X) [(X).obj release] #endif #endif /* * If there is no bitmask defined to supply the types that * may be stored in the array, default to none. */ #ifndef GSI_ARRAY_TYPES #define GSI_ARRAY_TYPES 0 #endif #ifndef GSIArrayItem /* * Set up the name of the union to store array elements. */ #ifdef GSUNION #undef GSUNION #endif #define GSUNION GSIArrayItem /* * Set up the types that will be storable in the union. * See 'GSUnion.h' for details. */ #ifdef GSUNION_TYPES #undef GSUNION_TYPES #endif #define GSUNION_TYPES GSI_ARRAY_TYPES #ifdef GSUNION_EXTRA #undef GSUNION_EXTRA #endif /* * Override extra type used in array value */ #ifdef GSI_ARRAY_TYPE #define GSUNION_EXTRA GSI_ARRAY_TYPE #endif /* * Generate the union typedef */ #if defined(GNUSTEP_BASE_INTERNAL) #include "GNUstepBase/GSUnion.h" #else #include #endif #endif /* #ifndef GSIArrayItem */ struct _GSIArray { GSIArrayItem *ptr; unsigned count; unsigned cap; unsigned old; NSZone *zone; #ifdef GSI_ARRAY_EXTRA GSI_ARRAY_EXTRA extra; #endif }; typedef struct _GSIArray GSIArray_t; typedef struct _GSIArray *GSIArray; GS_STATIC_INLINE unsigned GSIArrayCapacity(GSIArray array) { return array->cap; } GS_STATIC_INLINE unsigned GSIArrayCount(GSIArray array) { return array->count; } GS_STATIC_INLINE NSUInteger GSIArraySize(GSIArray array) { NSUInteger size = sizeof(GSIArray); size += array->cap * sizeof(GSIArrayItem); return size; } GS_STATIC_INLINE void GSIArrayGrow(GSIArray array) { unsigned int next; unsigned int size; GSIArrayItem *tmp; if (array->old == 0) { /* * Statically initialised buffer ... copy into new heap buffer. */ array->old = array->cap / 2; if (array->old < 1) { array->old = 1; array->cap = 1; } next = array->cap + array->old; size = next*sizeof(GSIArrayItem); tmp = NSZoneMalloc(array->zone, size); memcpy(tmp, array->ptr, array->count * sizeof(GSIArrayItem)); } else { next = array->cap + array->old; size = next*sizeof(GSIArrayItem); tmp = NSZoneRealloc(array->zone, array->ptr, size); } if (tmp == 0) { [NSException raise: NSMallocException format: @"failed to grow GSIArray"]; } array->ptr = tmp; array->old = array->cap; array->cap = next; } GS_STATIC_INLINE void GSIArrayGrowTo(GSIArray array, unsigned next) { unsigned int size; GSIArrayItem *tmp; if (next < array->count) { [NSException raise: NSInvalidArgumentException format: @"attempt to shrink below count"]; } size = next*sizeof(GSIArrayItem); if (array->old == 0) { /* * Statically initialised buffer ... copy into new heap buffer. */ tmp = NSZoneMalloc(array->zone, size); memcpy(tmp, array->ptr, array->count * sizeof(GSIArrayItem)); } else { tmp = NSZoneRealloc(array->zone, array->ptr, size); } if (tmp == 0) { [NSException raise: NSMallocException format: @"failed to grow GSIArray"]; } array->ptr = tmp; array->old = (array->cap > 0 ? array->cap : 1); array->cap = next; } GS_STATIC_INLINE void GSIArrayInsertItem(GSIArray array, GSIArrayItem item, unsigned index) { unsigned int i; GSI_ARRAY_CHECK; GSI_ARRAY_RETAIN(array, item); if (array->count == array->cap) { GSIArrayGrow(array); } for (i = array->count++; i > index; i--) { array->ptr[i] = array->ptr[i-1]; } array->ptr[i] = item; GSI_ARRAY_CHECK; } GS_STATIC_INLINE void GSIArrayInsertItemNoRetain(GSIArray array, GSIArrayItem item, unsigned index) { unsigned int i; GSI_ARRAY_CHECK; if (array->count == array->cap) { GSIArrayGrow(array); } for (i = array->count++; i > index; i--) { array->ptr[i] = array->ptr[i-1]; } array->ptr[i] = item; GSI_ARRAY_CHECK; } GS_STATIC_INLINE void GSIArrayAddItem(GSIArray array, GSIArrayItem item) { GSI_ARRAY_CHECK; GSI_ARRAY_RETAIN(array, item); if (array->count == array->cap) { GSIArrayGrow(array); } array->ptr[array->count++] = item; GSI_ARRAY_CHECK; } GS_STATIC_INLINE void GSIArrayAddItemNoRetain(GSIArray array, GSIArrayItem item) { GSI_ARRAY_CHECK; if (array->count == array->cap) { GSIArrayGrow(array); } array->ptr[array->count++] = item; GSI_ARRAY_CHECK; } /* * The comparator function takes two items as arguments, the first is the * item to be added, the second is the item already in the array. * The function should return NSOrderedAscending if the item to be * added is 'less than' the item in the array, NSOrderedDescending * if it is greater, and NSOrderedSame if it is equal. */ GS_STATIC_INLINE unsigned GSIArraySearch(GSIArray array, GSIArrayItem item, NSComparisonResult (*sorter)(GSIArrayItem, GSIArrayItem)) { unsigned int upper = array->count; unsigned int lower = 0; unsigned int index; /* * Binary search for an item equal to the one to be inserted. * Only for sorted array ! */ for (index = upper/2; upper != lower; index = (upper+lower)/2) { NSComparisonResult comparison; comparison = (*sorter)(item, (array->ptr[index])); if (comparison == NSOrderedAscending) { upper = index; } else if (comparison == NSOrderedDescending) { lower = index + 1; } else { break; } } return index; } GS_STATIC_INLINE unsigned GSIArrayInsertionPosition(GSIArray array, GSIArrayItem item, NSComparisonResult (*sorter)(GSIArrayItem, GSIArrayItem)) { unsigned int index; index = GSIArraySearch(array,item,sorter); /* * Now skip past any equal items so the insertion point is AFTER any * items that are equal to the new one. */ while (index < array->count && (*sorter)(item, (array->ptr[index])) != NSOrderedAscending) { index++; } #ifdef GSI_ARRAY_CHECKS NSCAssert(index <= array->count, NSInternalInconsistencyException); #endif return index; } #ifdef GSI_ARRAY_CHECKS GS_STATIC_INLINE void GSIArrayCheckSort(GSIArray array, NSComparisonResult (*sorter)(GSIArrayItem, GSIArrayItem)) { unsigned int i; for (i = 1; i < array->count; i++) { #ifdef GSI_ARRAY_CHECKS NSCAssert(((*sorter)(array->ptr[i-1], array->ptr[i]) != NSOrderedDescending), NSInvalidArgumentException); #endif } } #endif GS_STATIC_INLINE void GSIArrayInsertSorted(GSIArray array, GSIArrayItem item, NSComparisonResult (*sorter)(GSIArrayItem, GSIArrayItem)) { unsigned int index; #ifdef GSI_ARRAY_CHECKS GSIArrayCheckSort(array, sorter); #endif index = GSIArrayInsertionPosition(array, item, sorter); GSIArrayInsertItem(array, item, index); #ifdef GSI_ARRAY_CHECKS GSIArrayCheckSort(array, sorter); #endif } GS_STATIC_INLINE void GSIArrayInsertSortedNoRetain(GSIArray array, GSIArrayItem item, NSComparisonResult (*sorter)(GSIArrayItem, GSIArrayItem)) { unsigned int index; #ifdef GSI_ARRAY_CHECKS GSIArrayCheckSort(array, sorter); #endif index = GSIArrayInsertionPosition(array, item, sorter); GSIArrayInsertItemNoRetain(array, item, index); #ifdef GSI_ARRAY_CHECKS GSIArrayCheckSort(array, sorter); #endif } GS_STATIC_INLINE void GSIArrayRemoveItemAtIndex(GSIArray array, unsigned index) { #if defined(GSI_ARRAY_NO_RELEASE) # ifdef GSI_ARRAY_CHECKS NSCAssert(index < array->count, NSInvalidArgumentException); # endif while (++index < array->count) array->ptr[index-1] = array->ptr[index]; array->count--; #else GSIArrayItem tmp; # ifdef GSI_ARRAY_CHECKS NSCAssert(index < array->count, NSInvalidArgumentException); # endif tmp = array->ptr[index]; while (++index < array->count) array->ptr[index-1] = array->ptr[index]; array->count--; GSI_ARRAY_RELEASE(array, tmp); #endif } GS_STATIC_INLINE void GSIArrayRemoveLastItem(GSIArray array) { #ifdef GSI_ARRAY_CHECKS NSCAssert(array->count, NSInvalidArgumentException); #endif array->count--; #if !defined(GSI_ARRAY_NO_RELEASE) GSI_ARRAY_RELEASE(array, array->ptr[array->count]); #endif } GS_STATIC_INLINE void GSIArrayRemoveItemAtIndexNoRelease(GSIArray array, unsigned index) { #ifdef GSI_ARRAY_CHECKS NSCAssert(index < array->count, NSInvalidArgumentException); #endif while (++index < array->count) array->ptr[index-1] = array->ptr[index]; array->count--; } GS_STATIC_INLINE void GSIArraySetItemAtIndex(GSIArray array, GSIArrayItem item, unsigned index) { #if defined(GSI_ARRAY_NO_RELEASE) # ifdef GSI_ARRAY_CHECKS NSCAssert(index < array->count, NSInvalidArgumentException); # endif GSI_ARRAY_RETAIN(array, item); array->ptr[index] = item; #else GSIArrayItem tmp; # ifdef GSI_ARRAY_CHECKS NSCAssert(index < array->count, NSInvalidArgumentException); # endif tmp = array->ptr[index]; GSI_ARRAY_RETAIN(array, item); array->ptr[index] = item; GSI_ARRAY_RELEASE(array, tmp); #endif } /* * For direct access ... unsafe if you change the array in any way while * examining the contents of this buffer. */ GS_STATIC_INLINE GSIArrayItem * GSIArrayItems(GSIArray array) { return array->ptr; } GS_STATIC_INLINE GSIArrayItem GSIArrayItemAtIndex(GSIArray array, unsigned index) { #ifdef GSI_ARRAY_CHECKS NSCAssert(index < array->count, NSInvalidArgumentException); #endif return array->ptr[index]; } GS_STATIC_INLINE GSIArrayItem GSIArrayLastItem(GSIArray array) { #ifdef GSI_ARRAY_CHECKS NSCAssert(array->count, NSInvalidArgumentException); #endif return array->ptr[array->count-1]; } GS_STATIC_INLINE void GSIArrayClear(GSIArray array) { if (array->ptr) { /* * Only free memory if it was dynamically initialised (old > 0) */ if (array->old > 0) { NSZoneFree(array->zone, (void*)array->ptr); } array->ptr = 0; array->cap = 0; } } GS_STATIC_INLINE void GSIArrayRemoveItemsFromIndex(GSIArray array, unsigned index) { if (index < array->count) { #ifndef GSI_ARRAY_NO_RELEASE while (array->count-- > index) { GSI_ARRAY_RELEASE(array, array->ptr[array->count]); } #endif array->count = index; } } GS_STATIC_INLINE void GSIArrayRemoveAllItems(GSIArray array) { #ifndef GSI_ARRAY_NO_RELEASE while (array->count--) { GSI_ARRAY_RELEASE(array, array->ptr[array->count]); } #endif array->count = 0; } GS_STATIC_INLINE void GSIArrayEmpty(GSIArray array) { GSIArrayRemoveAllItems(array); GSIArrayClear(array); } GS_STATIC_INLINE GSIArray GSIArrayInitWithZoneAndCapacity(GSIArray array, NSZone *zone, size_t capacity) { unsigned int size; array->zone = zone; array->count = 0; if (capacity < 2) capacity = 2; array->cap = capacity; array->old = capacity/2; size = capacity*sizeof(GSIArrayItem); array->ptr = (GSIArrayItem*)NSZoneMalloc(zone, size); return array; } GS_STATIC_INLINE GSIArray GSIArrayInitWithZoneAndStaticCapacity(GSIArray array, NSZone *zone, size_t capacity, GSIArrayItem *buffer) { array->zone = zone; array->count = 0; array->cap = capacity; array->old = 0; array->ptr = buffer; return array; } GS_STATIC_INLINE GSIArray GSIArrayCopyWithZone(GSIArray array, NSZone *zone) { unsigned int i; GSIArray new; new = NSZoneMalloc(zone, sizeof(GSIArray_t)); GSIArrayInitWithZoneAndCapacity(new, zone, array->count); for (i = 0; i < array->count; i++) { GSI_ARRAY_RETAIN(array, array->ptr[i]); new->ptr[new->count++] = array->ptr[i]; } return new; } #if defined(__cplusplus) } #endif #endif /* OS_API_VERSION(GS_API_NONE,GS_API_NONE) */ gnustep-base-1.29.0/Headers/GNUstepBase/GSIMap.h000066400000000000000000001011351435650067400211370ustar00rootroot00000000000000/* A fast (Inline) map/hash table implementation for NSObjects * Copyright (C) 1998,1999 Free Software Foundation, Inc. * * Author: Richard Frith-Macdonald * Created: Thu Oct 1 09:30:00 GMT 1998 * * Based on original o_map code by Albin L. Jones * * This file is part of the GNUstep Base Library. * * 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 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 * Library General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02111 USA. */ #import #if OS_API_VERSION(GS_API_NONE,GS_API_LATEST) #if defined(GNUSTEP_BASE_INTERNAL) #import "Foundation/NSObject.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSException.h" #import "Foundation/NSGarbageCollector.h" #import "Foundation/NSZone.h" #else #import #import #import #import #import #endif #if defined(__cplusplus) extern "C" { #endif /* To easily un-inline functions for debugging */ #ifndef GS_STATIC_INLINE #define GS_STATIC_INLINE static inline #endif /* * NB. This file is intended for internal use by the GNUstep libraries * and may change siugnificantly between releases. * While it is unlikley to be removed from the distributiuon any time * soon, its use by other software is not officially supported. * * This file should be INCLUDED in files wanting to use the GSIMap * functions - these are all declared inline for maximum performance. * * The file including this one may predefine some macros to alter * the behaviour * * GSI_MAP_HAS_VALUE * If defined as 0, then this becomes a hash table rather than * a map table. * * GSI_MAP_RETAIN_KEY() * Macro to retain the key item in a map or hash table. * * GSI_MAP_RETAIN_VAL() * Macro to retain the value item in a map table. * * GSI_MAP_RELEASE_KEY() * Macro to release the key item in a map or hash table. * * GSI_MAP_RELEASE_VAL() * Macro to release the value item in a map table. * * GSI_MAP_WRITE_KEY() * Macro defining the write barrier for a key. * * GSI_MAP_WRITE_VAL() * Macro defining the write barrier for a value. * * GSI_MAP_READ_KEY() * Macro defining the read barrier for a key. * * GSI_MAP_HASH() * Macro to get the hash of a key item. * * GSI_MAP_EQUAL() * Macro to compare two key items for equality - produces zero * if the items are not equal. * * GSI_MAP_EXTRA * If this value is defined, there is an 'extra' field in each * map table whose type is that specified by the value of the * preprocessor constant. This field can be used * to store additional information for the map. * * GSI_MAP_NOCLEAN * Define this to a non-zero integer value if the map keys and * values do not need to be released when the map is emptied. * This permits some optimisation. * * GSI_MAP_NODES() * Define this macro to allocate nodes for the map using typed * memory when working with garbage collection. * * GSI_MAP_ZEROED() * Define this macro to check whether a map uses keys which may * be zeroed weak pointers. */ #ifndef GSI_MAP_HAS_VALUE #define GSI_MAP_HAS_VALUE 1 #endif #ifndef GSI_MAP_RETAIN_KEY #define GSI_MAP_RETAIN_KEY(M, X) [(X).obj retain] #endif #ifndef GSI_MAP_RELEASE_KEY #define GSI_MAP_RELEASE_KEY(M, X) [(X).obj release] #endif #ifndef GSI_MAP_RETAIN_VAL #define GSI_MAP_RETAIN_VAL(M, X) [(X).obj retain] #endif #ifndef GSI_MAP_RELEASE_VAL #define GSI_MAP_RELEASE_VAL(M, X) [(X).obj release] #endif #ifndef GSI_MAP_HASH #define GSI_MAP_HASH(M, X) [(X).obj hash] #endif #ifndef GSI_MAP_EQUAL #define GSI_MAP_EQUAL(M, X, Y) [(X).obj isEqual: (Y).obj] #endif #ifndef GSI_MAP_NODES #define GSI_MAP_NODES(M, X) \ (GSIMapNode)NSAllocateCollectable(X*sizeof(GSIMapNode_t), NSScannedOption) #endif #ifndef GSI_MAP_ZEROED #define GSI_MAP_ZEROED(M) 0 #endif #ifndef GSI_MAP_READ_KEY # define GSI_MAP_READ_KEY(M, x) (*(x)) #endif #ifndef GSI_MAP_READ_VALUE # define GSI_MAP_READ_VALUE(M, x) (*(x)) #endif #ifndef GSI_MAP_WRITE_KEY # define GSI_MAP_WRITE_KEY(M, addr, obj) (*(addr) = obj) #endif #ifndef GSI_MAP_WRITE_VAL # define GSI_MAP_WRITE_VAL(M, addr, obj) (*(addr) = obj) #endif #if GSI_MAP_HAS_VALUE #define GSI_MAP_NODE_IS_EMPTY(M, node) \ (((GSI_MAP_READ_KEY(M, &node->key).addr) == 0) \ || ((GSI_MAP_READ_VALUE(M, &node->value).addr == 0))) #else #define GSI_MAP_NODE_IS_EMPTY(M, node) \ (((GSI_MAP_READ_KEY(M, &node->key).addr) == 0)) #endif /* * If there is no bitmask defined to supply the types that * may be used as keys in the map, default to none. */ #ifndef GSI_MAP_KTYPES #define GSI_MAP_KTYPES 0 #endif /* * Set up the name of the union to store keys. */ #ifdef GSUNION #undef GSUNION #endif #define GSUNION GSIMapKey /* * Set up the types that will be storable in the union. * See 'GSUnion.h' for further information. */ #ifdef GSUNION_TYPES #undef GSUNION_TYPES #endif #define GSUNION_TYPES GSI_MAP_KTYPES #ifdef GSUNION_EXTRA #undef GSUNION_EXTRA #endif #ifdef GSI_MAP_KEXTRA #define GSUNION_EXTRA GSI_MAP_KEXTRA #endif /* * Generate the union typedef */ #if defined(GNUSTEP_BASE_INTERNAL) #include "GNUstepBase/GSUnion.h" #else #include #endif #if (GSI_MAP_KTYPES) & GSUNION_OBJ #define GSI_MAP_CLEAR_KEY(node) GSI_MAP_WRITE_KEY(map, &node->key, (GSIMapKey)(id)nil) #elif (GSI_MAP_KTYPES) & GSUNION_PTR #define GSI_MAP_CLEAR_KEY(node) GSI_MAP_WRITE_KEY(map, &node->key, (GSIMapKey)(void *)NULL) #else #define GSI_MAP_CLEAR_KEY(node) #endif /* * If there is no bitmask defined to supply the types that * may be used as values in the map, default to none. */ #ifndef GSI_MAP_VTYPES #define GSI_MAP_VTYPES 0 #endif /* * Set up the name of the union to store map values. */ #ifdef GSUNION #undef GSUNION #endif #define GSUNION GSIMapVal /* * Set up the types that will be storable in the union. * See 'GSUnion.h' for further information. */ #ifdef GSUNION_TYPES #undef GSUNION_TYPES #endif #define GSUNION_TYPES GSI_MAP_VTYPES #ifdef GSUNION_EXTRA #undef GSUNION_EXTRA #endif #ifdef GSI_MAP_VEXTRA #define GSUNION_EXTRA GSI_MAP_VEXTRA #endif #ifndef GSI_MAP_SIMPLE #define GSI_MAP_SIMPLE 0 #endif /* * Generate the union typedef */ #if defined(GNUSTEP_BASE_INTERNAL) #include "GNUstepBase/GSUnion.h" #else #include #endif #if (GSI_MAP_VTYPES) & GSUNION_OBJ #define GSI_MAP_CLEAR_VAL(node) GSI_MAP_WRITE_VAL(map, &node->value, (GSIMapVal)(id)nil) #elif (GSI_MAP_VTYPES) & GSUNION_PTR #define GSI_MAP_CLEAR_VAL(node) GSI_MAP_WRITE_VAL(map, &node->value, (GSIMapVal)(void *)NULL) #else #define GSI_MAP_CLEAR_VAL(node) #endif /* * Description of the datastructure * -------------------------------- * The complete GSIMap implementation can be viewed in two different ways, * * (1) viewed as a structure to add and retrieve elements * (2) viewed as a memory management structure to facilitate (1) * * The first view is best described as follows: * * _GSIMapTable -----> C-array of buckets * * Where each bucket contains a count (nodeCount), describing the number * of nodes in the bucket and a pointer (firstNode) to a single linked * list of nodes. * * The second view is slightly more complicated. * The individual nodes are allocated and deallocated in chunks. * In order to keep track of this we have: * * _GSIMapTable -----> C-array of chunks * * Where each chunk points to a C-array of nodes. * Also the _GSIMapTable contains a pointer to the free nodes * * _GSIMapTable -----> single linked list of free nodes * * Consequence of this is that EVERY node is part of a single linked list. * Either it is in use and reachable from a bucket, or it is part of the * freeNodes linked list. * Also EVERY node is part of chunk, due to the way the nodes are allocated. * * A rough picture is include below: * * * This is the map C - array of the buckets * +---------------+ +---------------+ * | _GSIMapTable | /----->| nodeCount | * |---------------| / | firstNode ----+--\ * | buckets ---+----/ | .......... | | * | bucketCount =| size of --> | nodeCount | | * | nodeChunks ---+--\ | firstNode | | * | chunkCount =-+\ | | . | | * | .... || | | . | | * +---------------+| | | nodeCount | | * | | | fistNode | | * / | +---------------+ | * ---------- v v * / +----------+ +---------------------------+ * | | * ------+----->| Node1 | Node2 | Node3 ... | a chunk * chunkCount | * ------+--\ +---------------------------+ * is size of = | . | \ +-------------------------------+ * | . | ->| Node n | Node n + 1 | ... | another * +----------+ +-------------------------------+ * array pointing * to the chunks * * * NOTES on the way chunks are allocated * ------------------------------------- * Chunks are allocated when needed, that is a new chunk is allocated * whenever the freeNodes list is empty and a new node is required. * In gnustep-base-1.9.0 the size of the new chunk is calculated as * roughly 3/4 of the number of nodes in use. * The problem with this approach is that it can lead to unnecessary * address space fragmentation. So in this version the algorithm we * will use the 3/4 rule until the nodeCount reaches the "increment" * member variable. * If nodeCount is bigger than the "increment" it will allocate chunks * of size "increment". */ #if !defined(GSI_MAP_TABLE_T) typedef struct _GSIMapBucket GSIMapBucket_t; typedef struct _GSIMapNode GSIMapNode_t; typedef GSIMapBucket_t *GSIMapBucket; typedef GSIMapNode_t *GSIMapNode; #endif struct _GSIMapNode { GSIMapNode nextInBucket; /* Linked list of bucket. */ GSIMapKey key; #if GSI_MAP_HAS_VALUE GSIMapVal value; #endif }; struct _GSIMapBucket { uintptr_t nodeCount; /* Number of nodes in bucket. */ GSIMapNode firstNode; /* The linked list of nodes. */ }; #if defined(GSI_MAP_TABLE_T) typedef GSI_MAP_TABLE_T *GSIMapTable; #else typedef struct _GSIMapTable GSIMapTable_t; typedef GSIMapTable_t *GSIMapTable; struct _GSIMapTable { NSZone *zone; uintptr_t nodeCount; /* Number of used nodes in map. */ uintptr_t bucketCount; /* Number of buckets in map. */ GSIMapBucket buckets; /* Array of buckets. */ GSIMapNode freeNodes; /* List of unused nodes. */ uintptr_t chunkCount; /* Number of chunks in array. */ GSIMapNode *nodeChunks; /* Chunks of allocated memory. */ uintptr_t increment; #ifdef GSI_MAP_EXTRA GSI_MAP_EXTRA extra; #endif }; #define GSI_MAP_TABLE_T GSIMapTable_t #endif #ifndef GSI_MAP_TABLE_S #define GSI_MAP_TABLE_S sizeof(GSI_MAP_TABLE_T) #endif typedef struct _GSIMapEnumerator { GSIMapTable map; /* the map being enumerated. */ GSIMapNode node; /* The next node to use. */ uintptr_t bucket; /* The next bucket to use. */ } *_GSIE; #ifdef GSI_MAP_ENUMERATOR typedef GSI_MAP_ENUMERATOR GSIMapEnumerator_t; #else typedef struct _GSIMapEnumerator GSIMapEnumerator_t; #endif typedef GSIMapEnumerator_t *GSIMapEnumerator; GS_STATIC_INLINE GSIMapBucket GSIMapPickBucket(unsigned hash, GSIMapBucket buckets, uintptr_t bucketCount) { return buckets + hash % bucketCount; } GS_STATIC_INLINE GSIMapBucket GSIMapBucketForKey(GSIMapTable map, GSIMapKey key) { return GSIMapPickBucket(GSI_MAP_HASH(map, key), map->buckets, map->bucketCount); } GS_STATIC_INLINE void GSIMapLinkNodeIntoBucket(GSIMapBucket bucket, GSIMapNode node) { node->nextInBucket = bucket->firstNode; bucket->firstNode = node; } GS_STATIC_INLINE void GSIMapUnlinkNodeFromBucket(GSIMapBucket bucket, GSIMapNode node) { if (node == bucket->firstNode) { bucket->firstNode = node->nextInBucket; } else { GSIMapNode tmp = bucket->firstNode; while (tmp->nextInBucket != node) { tmp = tmp->nextInBucket; } tmp->nextInBucket = node->nextInBucket; } node->nextInBucket = 0; } GS_STATIC_INLINE void GSIMapAddNodeToBucket(GSIMapBucket bucket, GSIMapNode node) { GSIMapLinkNodeIntoBucket(bucket, node); bucket->nodeCount += 1; } GS_STATIC_INLINE void GSIMapAddNodeToMap(GSIMapTable map, GSIMapNode node) { GSIMapBucket bucket; bucket = GSIMapBucketForKey(map, GSI_MAP_READ_KEY(map, &node->key)); GSIMapAddNodeToBucket(bucket, node); map->nodeCount++; } GS_STATIC_INLINE void GSIMapRemoveNodeFromBucket(GSIMapBucket bucket, GSIMapNode node) { bucket->nodeCount--; GSIMapUnlinkNodeFromBucket(bucket, node); } GS_STATIC_INLINE void GSIMapRemoveNodeFromMap(GSIMapTable map, GSIMapBucket bkt, GSIMapNode node) { map->nodeCount--; GSIMapRemoveNodeFromBucket(bkt, node); } GS_STATIC_INLINE void GSIMapFreeNode(GSIMapTable map, GSIMapNode node) { GSI_MAP_RELEASE_KEY(map, node->key); GSI_MAP_CLEAR_KEY(node); #if GSI_MAP_HAS_VALUE GSI_MAP_RELEASE_VAL(map, node->value); GSI_MAP_CLEAR_VAL(node); #endif node->nextInBucket = map->freeNodes; map->freeNodes = node; } GS_STATIC_INLINE GSIMapNode GSIMapRemoveAndFreeNode(GSIMapTable map, uintptr_t bkt, GSIMapNode node) { GSIMapNode next = node->nextInBucket; GSIMapRemoveNodeFromMap(map, &(map->buckets[bkt]), node); GSIMapFreeNode(map, node); return next; } GS_STATIC_INLINE void GSIMapRemoveWeak(GSIMapTable map) { if (GSI_MAP_ZEROED(map)) { uintptr_t bucketCount = map->bucketCount; GSIMapBucket bucket = map->buckets; while (bucketCount-- > 0) { GSIMapNode node = bucket->firstNode; while (node != 0) { GSIMapNode next = node->nextInBucket; if (GSI_MAP_NODE_IS_EMPTY(map, node)) { GSIMapRemoveNodeFromMap(map, bucket, node); GSIMapFreeNode(map, node); } node = next; } bucket++; } return; } } GS_STATIC_INLINE void GSIMapRemangleBuckets(GSIMapTable map, GSIMapBucket old_buckets, uintptr_t old_bucketCount, GSIMapBucket new_buckets, uintptr_t new_bucketCount) { if (GSI_MAP_ZEROED(map)) { while (old_bucketCount-- > 0) { GSIMapNode node; while ((node = old_buckets->firstNode) != 0) { if (GSI_MAP_NODE_IS_EMPTY(map, node)) { GSIMapRemoveNodeFromMap(map, old_buckets, node); GSIMapFreeNode(map, node); } else { GSIMapBucket bkt; GSIMapRemoveNodeFromBucket(old_buckets, node); bkt = GSIMapPickBucket(GSI_MAP_HASH(map, GSI_MAP_READ_KEY(map, &node->key)), new_buckets, new_bucketCount); GSIMapAddNodeToBucket(bkt, node); } } old_buckets++; } return; } while (old_bucketCount-- > 0) { GSIMapNode node; while ((node = old_buckets->firstNode) != 0) { GSIMapBucket bkt; GSIMapRemoveNodeFromBucket(old_buckets, node); bkt = GSIMapPickBucket(GSI_MAP_HASH(map, GSI_MAP_READ_KEY(map, &node->key)), new_buckets, new_bucketCount); GSIMapAddNodeToBucket(bkt, node); } old_buckets++; } } GS_STATIC_INLINE void GSIMapMoreNodes(GSIMapTable map, unsigned required) { GSIMapNode *newArray; newArray = (GSIMapNode*)NSZoneCalloc(map->zone, (map->chunkCount+1), sizeof(GSIMapNode)); if (newArray) { GSIMapNode newNodes; uintptr_t chunkCount; if (map->nodeChunks != 0) { memcpy(newArray, map->nodeChunks, (map->chunkCount)*sizeof(GSIMapNode)); NSZoneFree(map->zone, map->nodeChunks); } map->nodeChunks = newArray; if (required == 0) { if (map->chunkCount == 0) { chunkCount = map->bucketCount > 1 ? map->bucketCount : 2; } else { chunkCount = ((map->nodeCount>>2)+1)<<1; } } else { chunkCount = required; } newNodes = (GSIMapNode)NSZoneCalloc(map->zone, chunkCount, sizeof(GSIMapNode_t)); if (newNodes) { map->nodeChunks[map->chunkCount++] = newNodes; newNodes[--chunkCount].nextInBucket = map->freeNodes; while (chunkCount--) { newNodes[chunkCount].nextInBucket = &newNodes[chunkCount+1]; } map->freeNodes = newNodes; } else { [NSException raise: NSMallocException format: @"No memory for nodes"]; } } else { [NSException raise: NSMallocException format: @"No memory for chunks"]; } } GS_STATIC_INLINE GSIMapNode GSIMapNodeForKeyInBucket(GSIMapTable map, GSIMapBucket bucket, GSIMapKey key) { GSIMapNode node = bucket->firstNode; if (GSI_MAP_ZEROED(map)) { while ((node != 0) && GSI_MAP_EQUAL(map, GSI_MAP_READ_KEY(map, &node->key), key) == NO) { GSIMapNode tmp = node->nextInBucket; if (GSI_MAP_NODE_IS_EMPTY(map, node)) { GSIMapRemoveNodeFromMap(map, bucket, node); GSIMapFreeNode(map, node); } node = tmp; } return node; } while ((node != 0) && GSI_MAP_EQUAL(map, GSI_MAP_READ_KEY(map, &node->key), key) == NO) { node = node->nextInBucket; } return node; } GS_STATIC_INLINE GSIMapNode GSIMapNodeForKey(GSIMapTable map, GSIMapKey key) { GSIMapBucket bucket; GSIMapNode node; if (map->nodeCount == 0) { return 0; } bucket = GSIMapBucketForKey(map, key); node = GSIMapNodeForKeyInBucket(map, bucket, key); return node; } GS_STATIC_INLINE GSIMapNode GSIMapFirstNode(GSIMapTable map) { if (map->nodeCount > 0) { uintptr_t count = map->bucketCount; uintptr_t bucket = 0; GSIMapNode node = 0; if (GSI_MAP_ZEROED(map)) { while (bucket < count) { node = map->buckets[bucket].firstNode; while (node != 0 && GSI_MAP_NODE_IS_EMPTY(map, node)) { node = GSIMapRemoveAndFreeNode(map, bucket, node); } if (node != 0) { break; } bucket++; } return node; } while (bucket < count) { node = map->buckets[bucket].firstNode; if (node != 0) { break; } bucket++; } return node; } else { return 0; } } #if (GSI_MAP_KTYPES & GSUNION_INT) /* * Specialized lookup for the case where keys are known to be simple integer * or pointer values that are their own hash values (when converted to unsigned * integers) and can be compared with a test for integer equality. */ GS_STATIC_INLINE GSIMapNode GSIMapNodeForSimpleKey(GSIMapTable map, GSIMapKey key) { GSIMapBucket bucket; GSIMapNode node; if (map->nodeCount == 0) { return 0; } bucket = map->buckets + ((unsigned)key.addr) % map->bucketCount; node = bucket->firstNode; if (GSI_MAP_ZEROED(map)) { while ((node != 0) && GSI_MAP_READ_KEY(map, &node->key).addr != key.addr) { GSIMapNode tmp = node->nextInBucket; if (GSI_MAP_NODE_IS_EMPTY(map, node)) { GSIMapRemoveNodeFromMap(map, bucket, node); GSIMapFreeNode(map, node); } node = tmp; } return node; } while ((node != 0) && GSI_MAP_READ_KEY(map, &node->key).addr != key.addr) { node = node->nextInBucket; } return node; } #endif GS_STATIC_INLINE void GSIMapResize(GSIMapTable map, uintptr_t new_capacity) { GSIMapBucket new_buckets; uintptr_t size = 1; uintptr_t old = 1; /* * Find next size up in the fibonacci series */ while (size < new_capacity) { uintptr_t tmp = old; old = size; size += tmp; } /* * Avoid even numbers - since hash functions frequently generate uneven * distributions around powers of two - * we don't want lots of keys falling into a single bucket. */ if (size % 2 == 0) { size++; } /* Use the zone specified for this map. */ new_buckets = (GSIMapBucket)NSZoneCalloc(map->zone, size, sizeof(GSIMapBucket_t)); if (new_buckets != 0) { GSIMapRemangleBuckets(map, map->buckets, map->bucketCount, new_buckets, size); if (map->buckets != 0) { NSZoneFree(map->zone, map->buckets); } map->buckets = new_buckets; map->bucketCount = size; } } GS_STATIC_INLINE void GSIMapRightSizeMap(GSIMapTable map, uintptr_t capacity) { /* FIXME: Now, this is a guess, based solely on my intuition. If anyone * knows of a better ratio (or other test, for that matter) and can * provide evidence of its goodness, please get in touch with me, Albin * L. Jones . */ if (3 * capacity >= 4 * map->bucketCount) { GSIMapResize(map, (3 * capacity)/4 + 1); } } /** Enumerating **/ /* IMPORTANT WARNING: Enumerators have a wonderous property. * Once a node has been returned by `GSIMapEnumeratorNextNode()', it may be * removed from the map without effecting the rest of the current * enumeration. */ /* EXTREMELY IMPORTANT WARNING: The purpose of this warning is point * out that, various (i.e., many) functions currently depend on * the behaviour outlined above. So be prepared for some serious * breakage when you go fudging around with these things. */ /** * Create an return an enumerator for the specified map.
* You must call GSIMapEndEnumerator() when you have finished * with the enumerator.
* WARNING You should not alter a map while an enumeration * is in progress. The results of doing so are reasonably unpredictable. *
Remember, DON'T MESS WITH A MAP WHILE YOU'RE ENUMERATING IT. */ GS_STATIC_INLINE GSIMapEnumerator_t GSIMapEnumeratorForMap(GSIMapTable map) { GSIMapEnumerator_t enumerator; enumerator.map = map; enumerator.node = 0; enumerator.bucket = 0; /* * Locate next bucket and node to be returned. */ if (GSI_MAP_ZEROED(map)) { while (enumerator.bucket < map->bucketCount) { GSIMapNode node = map->buckets[enumerator.bucket].firstNode; while (node != 0 && GSI_MAP_READ_KEY(map, &node->key).addr == 0) { node = GSIMapRemoveAndFreeNode(map, enumerator.bucket, node); } if ((enumerator.node = node) != 0) { return enumerator; } enumerator.bucket++; } } while (enumerator.bucket < map->bucketCount) { enumerator.node = map->buckets[enumerator.bucket].firstNode; if (enumerator.node != 0) { return enumerator; // Got first node, and recorded its bucket. } enumerator.bucket++; } return enumerator; } /** * Tidies up after map enumeration ... effectively destroys the enumerator. */ GS_STATIC_INLINE void GSIMapEndEnumerator(GSIMapEnumerator enumerator) { ((_GSIE)enumerator)->map = 0; ((_GSIE)enumerator)->node = 0; ((_GSIE)enumerator)->bucket = 0; } /** * Returns the bucket from which the next node in the enumeration will * come. Once the next node has been enumerated, you can use the * bucket and node to remove the node from the map using the * GSIMapRemoveNodeFromMap() function. */ GS_STATIC_INLINE GSIMapBucket GSIMapEnumeratorBucket(GSIMapEnumerator enumerator) { if (((_GSIE)enumerator)->node != 0) { GSIMapTable map = ((_GSIE)enumerator)->map; return &((map->buckets)[((_GSIE)enumerator)->bucket]); } return 0; } /** * Returns the next node in the map, or a nul pointer if at the end. */ GS_STATIC_INLINE GSIMapNode GSIMapEnumeratorNextNode(GSIMapEnumerator enumerator) { GSIMapNode node = ((_GSIE)enumerator)->node; GSIMapTable map = ((_GSIE)enumerator)->map; /* Find the frst available non-zeroed node. */ if (node != 0 && GSI_MAP_ZEROED(map) && GSI_MAP_READ_KEY(map, &node->key).addr == 0) { uintptr_t bucketCount = map->bucketCount; uintptr_t bucket = ((_GSIE)enumerator)->bucket; while (node != 0 && GSI_MAP_READ_KEY(map, &node->key).addr == 0) { node = GSIMapRemoveAndFreeNode(map, bucket, node); while (node == 0 && ++bucket < bucketCount) { node = (map->buckets[bucket]).firstNode; while (node != 0 && GSI_MAP_READ_KEY(map, &node->key).addr == 0) { node = GSIMapRemoveAndFreeNode(map, bucket, node); } } ((_GSIE)enumerator)->bucket = bucket; ((_GSIE)enumerator)->node = node; } } if (node != 0) { GSIMapNode next = node->nextInBucket; if (GSI_MAP_ZEROED(map)) { uintptr_t bucket = ((_GSIE)enumerator)->bucket; while (next != 0 && GSI_MAP_NODE_IS_EMPTY(map, next)) { next = GSIMapRemoveAndFreeNode(map, bucket, next); } } if (next == 0) { uintptr_t bucketCount = map->bucketCount; uintptr_t bucket = ((_GSIE)enumerator)->bucket; if (GSI_MAP_ZEROED(map)) { while (next == 0 && ++bucket < bucketCount) { next = (map->buckets[bucket]).firstNode; while (next != 0 && GSI_MAP_NODE_IS_EMPTY(map, next)) { next = GSIMapRemoveAndFreeNode(map, bucket, next); } } ((_GSIE)enumerator)->bucket = bucket; ((_GSIE)enumerator)->node = next; return node; } while (next == 0 && ++bucket < bucketCount) { next = (map->buckets[bucket]).firstNode; } ((_GSIE)enumerator)->bucket = bucket; } ((_GSIE)enumerator)->node = next; } return node; } /** * Used to implement fast enumeration methods in classes that use GSIMap for * their data storage. */ GS_STATIC_INLINE NSUInteger GSIMapCountByEnumeratingWithStateObjectsCount(GSIMapTable map, NSFastEnumerationState *state, id *stackbuf, NSUInteger len) { NSInteger count; NSInteger i; /* We can store a GSIMapEnumerator inside the extra buffer in state, but we * need to handle platforms like Win64 where long is 32 bits and pointers are * 64 bits, so we have to construct it here to avoid breaking on such * platforms. */ struct GSPartMapEnumerator { GSIMapNode node; uintptr_t bucket; }; #define GS_PART_MAP_ENUMERATOR(state) ((struct GSPartMapEnumerator*)(uintptr_t)((state)->extra)) GSIMapEnumerator_t enumerator; count = MIN(len, map->nodeCount - state->state); /* Construct the real enumerator */ if (0 == state->state) { enumerator = GSIMapEnumeratorForMap(map); } else { enumerator.map = map; enumerator.node = GS_PART_MAP_ENUMERATOR(state)->node; enumerator.bucket = GS_PART_MAP_ENUMERATOR(state)->bucket; } /* Get the next count objects and put them in the stack buffer. */ for (i = 0; i < count; i++) { GSIMapNode node = GSIMapEnumeratorNextNode(&enumerator); if (0 != node) { /* UGLY HACK: Lets this compile with any key type. Fast enumeration * will only work with things that are id-sized, however, so don't * try using it with non-object collections. */ stackbuf[i] = (id)GSI_MAP_READ_KEY(map, &node->key).addr; } } /* Store the important bits of the enumerator in the caller. */ GS_PART_MAP_ENUMERATOR(state)->node = enumerator.node; GS_PART_MAP_ENUMERATOR(state)->bucket = enumerator.bucket; /* Update the rest of the state. */ state->state += count; state->itemsPtr = stackbuf; return count; } #if GSI_MAP_HAS_VALUE GS_STATIC_INLINE GSIMapNode GSIMapAddPairNoRetain(GSIMapTable map, GSIMapKey key, GSIMapVal value) { GSIMapNode node = map->freeNodes; if (node == 0) { GSIMapMoreNodes(map, map->nodeCount < map->increment ? 0: map->increment); node = map->freeNodes; } map->freeNodes = node->nextInBucket; GSI_MAP_WRITE_KEY(map, &node->key, key); GSI_MAP_WRITE_VAL(map, &node->value, value); node->nextInBucket = 0; GSIMapRightSizeMap(map, map->nodeCount); GSIMapAddNodeToMap(map, node); return node; } GS_STATIC_INLINE GSIMapNode GSIMapAddPair(GSIMapTable map, GSIMapKey key, GSIMapVal value) { GSIMapNode node = map->freeNodes; if (node == 0) { GSIMapMoreNodes(map, map->nodeCount < map->increment ? 0: map->increment); node = map->freeNodes; } map->freeNodes = node->nextInBucket; GSI_MAP_WRITE_KEY(map, &node->key, key); GSI_MAP_RETAIN_KEY(map, node->key); GSI_MAP_WRITE_VAL(map, &node->value, value); GSI_MAP_RETAIN_VAL(map, node->value); node->nextInBucket = 0; GSIMapRightSizeMap(map, map->nodeCount); GSIMapAddNodeToMap(map, node); return node; } #else GS_STATIC_INLINE GSIMapNode GSIMapAddKeyNoRetain(GSIMapTable map, GSIMapKey key) { GSIMapNode node = map->freeNodes; if (node == 0) { GSIMapMoreNodes(map, map->nodeCount < map->increment ? 0: map->increment); node = map->freeNodes; } map->freeNodes = node->nextInBucket; GSI_MAP_WRITE_KEY(map, &node->key, key); node->nextInBucket = 0; GSIMapRightSizeMap(map, map->nodeCount); GSIMapAddNodeToMap(map, node); return node; } GS_STATIC_INLINE GSIMapNode GSIMapAddKey(GSIMapTable map, GSIMapKey key) { GSIMapNode node = map->freeNodes; if (node == 0) { GSIMapMoreNodes(map, map->nodeCount < map->increment ? 0: map->increment); node = map->freeNodes; } map->freeNodes = node->nextInBucket; GSI_MAP_WRITE_KEY(map, &node->key, key); GSI_MAP_RETAIN_KEY(map, node->key); node->nextInBucket = 0; GSIMapRightSizeMap(map, map->nodeCount); GSIMapAddNodeToMap(map, node); return node; } #endif /** * Removes the item for the specified key from the map. * If the key was present, returns YES, otherwise returns NO. */ GS_STATIC_INLINE BOOL GSIMapRemoveKey(GSIMapTable map, GSIMapKey key) { GSIMapBucket bucket = GSIMapBucketForKey(map, key); GSIMapNode node; node = GSIMapNodeForKeyInBucket(map, bucket, key); if (node != 0) { GSIMapRemoveNodeFromMap(map, bucket, node); GSIMapFreeNode(map, node); return YES; } return NO; } GS_STATIC_INLINE void GSIMapCleanMap(GSIMapTable map) { if (map->nodeCount > 0) { GSIMapBucket bucket = map->buckets; unsigned int i; GSIMapNode startNode = 0; GSIMapNode prevNode = 0; GSIMapNode node; map->nodeCount = 0; for (i = 0; i < map->bucketCount; i++) { node = bucket->firstNode; if (prevNode != 0) { prevNode->nextInBucket = node; } else { startNode = node; } while(node != 0) { GSI_MAP_RELEASE_KEY(map, node->key); GSI_MAP_CLEAR_KEY(node); #if GSI_MAP_HAS_VALUE GSI_MAP_RELEASE_VAL(map, node->value); GSI_MAP_CLEAR_VAL(node); #endif prevNode = node; node = node->nextInBucket; } bucket->nodeCount = 0; bucket->firstNode = 0; bucket++; } if (prevNode != 0) { prevNode->nextInBucket = map->freeNodes; } map->freeNodes = startNode; } } GS_STATIC_INLINE void GSIMapEmptyMap(GSIMapTable map) { #ifdef GSI_MAP_NOCLEAN if (GSI_MAP_NOCLEAN) { map->nodeCount = 0; } else { GSIMapCleanMap(map); } #else GSIMapCleanMap(map); #endif if (map->buckets != 0) { NSZoneFree(map->zone, map->buckets); map->buckets = 0; map->bucketCount = 0; } if (map->nodeChunks != 0) { unsigned int i; for (i = 0; i < map->chunkCount; i++) { NSZoneFree(map->zone, map->nodeChunks[i]); } NSZoneFree(map->zone, map->nodeChunks); map->chunkCount = 0; map->nodeChunks = 0; } map->freeNodes = 0; map->zone = 0; } GS_STATIC_INLINE void GSIMapInitWithZoneAndCapacity(GSIMapTable map, NSZone *zone, uintptr_t capacity) { map->zone = zone; map->nodeCount = 0; map->bucketCount = 0; map->buckets = 0; map->nodeChunks = 0; map->freeNodes = 0; map->chunkCount = 0; map->increment = 300000; // choosen so the chunksize will be less than 4Mb GSIMapRightSizeMap(map, capacity); GSIMapMoreNodes(map, capacity); } GS_STATIC_INLINE NSUInteger GSIMapSize(GSIMapTable map) { NSUInteger index; NSUInteger size; GSIMapNode node; /* Map table plus arrays of pointers to chunks */ size = GSI_MAP_TABLE_S + map->chunkCount * sizeof(void*); /* Add the array of buckets. */ size += map->bucketCount * sizeof(GSIMapBucket_t); /* Add the free nodes. */ for (node = map->freeNodes; 0 != node; node = node->nextInBucket) { size += sizeof(GSIMapNode_t); } /* Add the used nodes (in the buckets). */ for (index = 0; index < map->bucketCount; index++) { size += sizeof(GSIMapNode_t) * map->buckets[index].nodeCount; } return size; } #if defined(__cplusplus) } #endif #endif /* OS_API_VERSION(GS_API_NONE,GS_API_NONE) */ gnustep-base-1.29.0/Headers/GNUstepBase/GSLocale.h000066400000000000000000000044271435650067400215160ustar00rootroot00000000000000/* GSLocale - various functions for localization Copyright (C) 2000 Free Software Foundation, Inc. Written by: Adam Fedor Created: Oct 2000 This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #ifndef __GSLocale_H_ #define __GSLocale_H_ #ifndef NeXT_Foundation_LIBRARY #import #else #import #endif #import "GSObjCRuntime.h" #if defined(__cplusplus) extern "C" { #endif @class NSDictionary; GS_EXPORT const char *GSSetLocaleC(int category, const char *loc); GS_EXPORT NSString *GSSetLocale(int category, NSString *locale); GS_EXPORT NSDictionary *GSDomainFromDefaultLocale(void); /** * Returns the locale string for LC_MESSAGES */ GS_EXPORT NSString *GSDefaultLanguageLocale(void); /** * Returns a language name string for a given locale. * e.g. GSLanguageFromLocale(@"en_CA") returns @"CanadaEnglish" */ GS_EXPORT NSString *GSLanguageFromLocale(NSString *locale); /** * Return an array of variants of a locale, formed by stripping * off parts of the identifier, ordered from most similar to * least similar. * * e.g. GSLocaleVariants(@"en_CA") returns (@"en_CA", @"en"). */ GS_EXPORT NSArray *GSLocaleVariants(NSString *locale); /** * Convenience function which calls GSLocaleVariants to expand * the given locale to a list of variants, and then calls * GSLanguageFromLocale on each. * * e.g. GSLanguagesFromLocale(@"en_CA") returns * (@"CanadaEnglish", @"English") */ GS_EXPORT NSArray *GSLanguagesFromLocale(NSString *locale); #if defined(__cplusplus) } #endif #endif gnustep-base-1.29.0/Headers/GNUstepBase/GSLock.h000066400000000000000000000034021435650067400211770ustar00rootroot00000000000000/** Some extra locking classes Copyright (C) 2003 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. AutogsdocSource: Additions/GSLock.m */ #ifndef INCLUDED_GS_LOCK_H #define INCLUDED_GS_LOCK_H #ifndef NeXT_Foundation_LIBRARY #import #else #import #endif #import "GNUstepBase/GSObjCRuntime.h" #if defined(__cplusplus) extern "C" { #endif @class NSNotification; GS_EXPORT_CLASS @interface GSLazyLock : NSLock { int locked; } - (void) _becomeThreaded: (NSNotification*)n; @end GS_EXPORT_CLASS @interface GSLazyRecursiveLock : NSRecursiveLock { int counter; } - (void) _becomeThreaded: (NSNotification*)n; @end /** Global lock to be used by classes when operating on any global data that invoke other methods which also access global; thus, creating the potential for deadlock. */ GS_EXPORT NSRecursiveLock *gnustep_global_lock; #if defined(__cplusplus) } #endif #endif /* INCLUDED_GS_LOCK_H */ gnustep-base-1.29.0/Headers/GNUstepBase/GSMime.h000066400000000000000000000425571435650067400212140ustar00rootroot00000000000000/** Interface for MIME parsing classes Copyright (C) 2000-2016 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: October 2000 This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. AutogsdocSource: Additions/GSMime.m */ #ifndef __GSMime_h_GNUSTEP_BASE_INCLUDE #define __GSMime_h_GNUSTEP_BASE_INCLUDE #import #if OS_API_VERSION(GS_API_NONE,GS_API_LATEST) #ifdef NeXT_Foundation_LIBRARY #import #else #import #import #import #endif #if defined(__cplusplus) extern "C" { #endif @class NSArray; @class NSMutableArray; @class NSData; @class NSMutableData; @class NSDictionary; @class NSMutableDictionary; @class NSScanner; /* * A trivial class for mantaining state while decoding/encoding data. * Each encoding type requires its own subclass. */ GS_EXPORT_CLASS @interface GSMimeCodingContext : NSObject { BOOL atEnd; /* Flag to say that data has ended. */ } - (BOOL) atEnd; - (BOOL) decodeData: (const void*)sData length: (NSUInteger)length intoData: (NSMutableData*)dData; - (void) setAtEnd: (BOOL)flag; @end GS_EXPORT_CLASS @interface GSMimeHeader : NSObject { #if GS_EXPOSE(GSMimeHeader) NSString *name; NSString *lower; NSString *value; NSMutableDictionary *objects; NSMutableDictionary *params; #endif #if GS_NONFRAGILE #else /* Pointer to private additional data used to avoid breaking ABI * when we don't have the non-fragile ABI available. * Use this mechanism rather than changing the instance variable * layout (see Source/GSInternal.h for details). */ @private id _internal GS_UNUSED_IVAR; #endif } + (GSMimeHeader*) headerWithName: (NSString*)n value: (NSString*)v parameters: (NSDictionary*)p; + (NSString*) makeQuoted: (NSString*)v always: (BOOL)flag; + (NSString*) makeToken: (NSString*)t preservingCase: (BOOL)preserve; + (NSString*) makeToken: (NSString*)t; - (id) copyWithZone: (NSZone*)z; /** How big this header might be when represented as raw MIME data. */ - (NSUInteger) estimatedSize; - (NSString*) fullValue; - (id) initWithName: (NSString*)n value: (NSString*)v; - (id) initWithName: (NSString*)n value: (NSString*)v parameters: (NSDictionary*)p; - (NSString*) name; - (NSString*) namePreservingCase: (BOOL)preserve; - (id) objectForKey: (NSString*)k; - (NSDictionary*) objects; - (NSString*) parameterForKey: (NSString*)k; - (NSDictionary*) parameters; - (NSDictionary*) parametersPreservingCase: (BOOL)preserve; - (NSMutableData*) rawMimeData; - (NSMutableData*) rawMimeDataPreservingCase: (BOOL)preserve; - (NSMutableData*) rawMimeDataPreservingCase: (BOOL)preserve foldedAt: (NSUInteger)fold; - (void) rawMimeDataPreservingCase: (BOOL)preserve foldedAt: (NSUInteger)fold to: (NSMutableData*)md; - (void) setObject: (id)o forKey: (NSString*)k; - (void) setParameter: (NSString*)v forKey: (NSString*)k; - (void) setParameters: (NSDictionary*)d; - (void) setValue: (NSString*)s; - (NSString*) text; - (NSString*) value; @end GS_EXPORT_CLASS @interface GSMimeDocument : NSObject { #if GS_EXPOSE(GSMimeDocument) NSMutableArray *headers; id content; #endif #if !GS_NONFRAGILE void *_unused; #endif } /* Examine xml data/string to find out the characterset encoding specified */ + (NSString*) charsetForXml: (id)xml; + (NSString*) charsetFromEncoding: (NSStringEncoding)enc; /** * Decode the source data from base64 encoding and return the result.
* The source data is expected to be ASCII text and may be multiple * lines or a line of any length (decoding is very tolerant). */ + (NSData*) decodeBase64: (NSData*)source; + (NSString*) decodeBase64String: (NSString*)source; + (GSMimeDocument*) documentWithContent: (id)newContent type: (NSString*)type name: (NSString*)name; /** * Encode the source data to base64 encoding and return the result.
* The resulting data is ASCII text and contains only the base64 encoded * values with no line breaks or extraneous data. This is base64 encoded * data in it's general format as mandated in RFC 3548. If the data is * to be used as part of a MIME document body, line breaks must be * introduced at 76 byte intervals (GSMime does this when automatically * encoding data for you). If the data is to be used in a PEM document * line breaks must be introduced at 74 byte intervals. */ + (NSData*) encodeBase64: (NSData*)source; + (NSString*) encodeBase64String: (NSString*)source; + (NSStringEncoding) encodingFromCharset: (NSString*)charset; - (void) addContent: (id)newContent; - (void) addHeader: (GSMimeHeader*)info; - (GSMimeHeader*) addHeader: (NSString*)name value: (NSString*)value parameters: (NSDictionary*)parameters; - (NSArray*) allHeaders; - (id) content; - (id) contentByID: (NSString*)key; - (id) contentByLocation: (NSString*)key; - (id) contentByName: (NSString*)key; - (id) copyWithZone: (NSZone*)z; - (NSString*) contentFile; - (NSString*) contentID; - (NSString*) contentLocation; - (NSString*) contentName; - (NSString*) contentSubtype; - (NSString*) contentType; - (NSArray*) contentsByName: (NSString*)key; - (void) convertTo7BitSafe; - (void) convertToBase64; // DEPRECATED ... use convertTo7BitSafe - (void) convertToBinary; - (NSData*) convertToData; - (NSString*) convertToText; - (void) deleteContent: (GSMimeDocument*)aPart; - (void) deleteHeader: (GSMimeHeader*)aHeader; - (void) deleteHeaderNamed: (NSString*)name; /** How big this document might be when represented as raw MIME data. */ - (NSUInteger) estimatedSize; - (GSMimeHeader*) headerNamed: (NSString*)name; - (NSArray*) headersNamed: (NSString*)name; - (NSString*) makeBoundary; - (GSMimeHeader*) makeContentID; - (GSMimeHeader*) makeHeader: (NSString*)name value: (NSString*)value parameters: (NSDictionary*)parameters; - (GSMimeHeader*) makeMessageID; - (NSMutableData*) rawMimeData; - (NSMutableData*) rawMimeData: (BOOL)isOuter; - (NSMutableData*) rawMimeData: (BOOL)isOuter foldedAt: (NSUInteger)fold; - (void) setContent: (id)newContent; - (void) setContent: (id)newContent type: (NSString*)type; - (void) setContent: (id)newContent type: (NSString*)type name: (NSString*)name; - (void) setContentType: (NSString*)newType; - (void) setHeader: (GSMimeHeader*)info; - (GSMimeHeader*) setHeader: (NSString*)name value: (NSString*)value parameters: (NSDictionary*)parameters; @end GS_EXPORT_CLASS @interface GSMimeParser : NSObject { #if GS_EXPOSE(GSMimeParser) NSMutableData *data; unsigned char *bytes; unsigned dataEnd; unsigned sectionStart; unsigned lineStart; unsigned lineEnd; unsigned input; /* During header parsing, we use this field to count white space we are * expecting to have after an encoded word. * During bnody parsing, we use the field to count expected content bytes. */ unsigned expect; unsigned rawBodyLength; struct { unsigned int inBody:1; unsigned int isHttp:1; unsigned int complete:1; unsigned int hadErrors:1; unsigned int buggyQuotes:1; unsigned int wantEndOfLine:1; unsigned int excessData:1; unsigned int headersOnly:1; unsigned int encodedWord:1; } flags; NSData *boundary; // Also overloaded to hold excess GSMimeDocument *document; GSMimeParser *child; GSMimeCodingContext *context; NSStringEncoding _defaultEncoding; #endif #if !GS_NONFRAGILE void *_unused; #endif } + (GSMimeDocument*) documentFromData: (NSData*)mimeData; + (GSMimeParser*) mimeParser; - (GSMimeCodingContext*) contextFor: (GSMimeHeader*)info; - (NSMutableData*) data; - (BOOL) decodeData: (NSData*)sData fromRange: (NSRange)aRange intoData: (NSMutableData*)dData withContext: (GSMimeCodingContext*)con; - (NSData*) excess; - (void) expectNoHeaders; - (BOOL) isComplete; - (BOOL) isHttp; - (BOOL) isInBody; - (BOOL) isInHeaders; - (GSMimeDocument*) mimeDocument; - (BOOL) parse: (NSData*)d; /** Parses headers from the supplied data returning YES if more data is * needed before the end of thge headers are reached.
* If body is not NULL and the end of the headers were reached leaving * some unused data, that remaining data is returned.
* NB. The returned data is a reference to part of the original memory * buffer provided in d, so you must copy it if you intend to use it after * modifying or deallocating the original data. */ - (BOOL) parseHeaders: (NSData*)d remaining: (NSData**)body; - (BOOL) parseHeader: (NSString*)aHeader; - (BOOL) scanHeaderBody: (NSScanner*)scanner into: (GSMimeHeader*)info; - (NSString*) scanName: (NSScanner*)scanner; - (BOOL) scanPastSpace: (NSScanner*)scanner; - (NSString*) scanSpecial: (NSScanner*)scanner; - (NSString*) scanToken: (NSScanner*)scanner; - (void) setBuggyQuotes: (BOOL)flag; - (void) setDefaultCharset: (NSString*)aName; - (void) setHeadersOnly; - (void) setIsHttp; @end /** Instances of the GSMimeSerializer class are used to serialise * GSMimeDocument objects to NSMutableData objects, producing data * in a form suitable for sending as an Email over the SMTP protocol * or in other forms. */ GS_EXPORT_CLASS @interface GSMimeSerializer : NSObject { NSUInteger foldAt; /** Fold long lines at this position */ BOOL use8bit; /** Output does not need to be 7bit-safe */ NSString *dataEncoding; /** To make 8bit data 7bit-safe */ NSString *textEncoding; /** To make 8bit text 7bit-safe */ } /** Returns an autorelease GSMimeSerializer configured for transfer * over binary safe protocols with unliumited line lenth). */ + (GSMimeSerializer*) binarySerializer; /** Returns an autorelease GSMimeSerializer configured for Email * to be sent as 7bit data over SMTP. */ + (GSMimeSerializer*) smtp7bitSerializer; /** Returns a copy of the receiver. */ - (id) copyWithZone: (NSZone*)aZone; /** Returns the default content transfer encoding used when 8bit data needs * to be made 7bit safe. This is base64 by default. */ - (NSString*) dataEncoding; /** Encodes the document and returns the resulting raw mime data. */ - (NSMutableData*) encodeDocument: (GSMimeDocument*)document; /** Appends a document part to the supplied data object. */ - (void) encodePart: (GSMimeDocument*)document to: (NSMutableData*)md; /** Returns the maximum line length (excluding the trailing CRLF) to which * we will encode data. See also the -setFoldAt: method. */ - (NSUInteger) foldAt; /** This method allows you to control the position at which lines in * headers and the body data are wrapped.
* RFC 2822 says that the absolute maximum (except for 'binary' content * transfer encoding) is 998 (excluding CRLF), but the recommended * maximum is 78 so we use that by default.
* Setting any ridiculously short value (less than 20) or an excessively * long value (greater than the 998 character limit supported by SMTP) * actually sets a value of zero, meaning that there is no limit. */ - (void) setFoldAt: (NSUInteger)position; /** Sets the content transfer encoding used when 8bit data needs to be sent * in a 7bit safe form.
* Setting a nil/empty encoding reverts to the default (base64).
* Setting an unknown/inapplicable encoding raises an exception. */ - (void) setDataEncoding: (NSString*)encoding; /** Sets the content transfer encoding used when 8bit text needs to be sent * in a 7bit safe form.
* Setting a nil/empty encoding reverts to the default (quoted-printable).
* Setting an unknown/inapplicable encoding raises an exception. */ - (void) setTextEncoding: (NSString*)encoding; /** Sets whether we will allow 8bit data in the output.
* The default is NO (because 8bit data breaks some mail transfer agents). */ - (void) setUse8bit: (BOOL)aFlag; /** Returns the default content transfer encoding used when 8bit text needs * to be made 7bit safe. This is quoted-printable by default. */ - (NSString*) textEncoding; /** Returns YES is we will allow 8bit data in the output, NO if we encode * everything in a 7bit safe form. */ - (BOOL) use8bit; @end /** The error domain for the GSMime system. */ GS_EXPORT NSString* const GSMimeErrorDomain; /** The error codes used in the GSMimeErrorDomain */ typedef enum { GSMimeSMTPAbort, GSMimeSMTPTimeout, GSMimeSMTPCommsEnd, GSMimeSMTPCommsError, GSMimeSMTPServerResponse } GSMimeErrorCode; @class NSError; @class NSStream; @class NSTimer; /** The GSMimeSMTPClient class provides the ability to send EMails * ([GSMimeDocument] instances) via an SMTP server. */ GS_EXPORT_CLASS @interface GSMimeSMTPClient : NSObject { #if GS_NONFRAGILE # if defined(GS_GSMimeSMTPClient_IVARS) @public GS_GSMimeSMTPClient_IVARS; # endif #else @private id _internal; #endif } /** Shut down any message send in progress and abort any queued messages. */ - (void) abort; /** Returns the current delegate. */ - (id) delegate; /** Tries to flush any queued messages to the SMTP server, completing by the * specified limit date.
* If limit is nil then a date in the distant future is used.
* If the queue is emptied in time, this method returns YES, otherwise it * returns NO. */ - (BOOL) flush: (NSDate*)limit; /** Returns the last error encountered, or nil if there is none recorded. */ - (NSError*) lastError; /** Returns the number of messages currently in the queue. */ - (NSUInteger) queueSize; /** Add the message to the queue of emails to be sent by the receiver. */ - (void) send: (GSMimeDocument*)message; /** Add the message to the queue of emails to be sent by the receiver.
* Also adds an envelope ID string to be used to uniquely identify the * message for delivery receipting purposes.
* For this to work, the SMTP gateway being used must support the SMTP * service extension for delivery status notification (RFC 3460). */ - (void) send: (GSMimeDocument*)message envelopeID: (NSString*)envid; /** Set the delegate to receive callback methods indicating when a message * is sent, failed, or removed from the queue unsent. */ - (void) setDelegate: (id)d; /** Set the host for the SMTP server. If this is not set (or is set to nil) * then the GSMimeSMTPClientHost user default is used. If the host is nil * or an empty string then 'localhost' is used. */ - (void) setHostname: (NSString*)s; /** Set the host for the SMTP client to identify itsself to the server. * If this is not set (or is set to nil) then the GSMimeSMTPClientIdentity * user default is used. If the identity is nil or an empty string then * a name of the current host is use. */ - (void) setIdentity: (NSString*)s; /** Sets the maximum number of messages which may remain in the queue. * If this is exceeded then any unsuccessful send attempt results in * excess queued messages discarded as unsent.
* The method returns the previous setting. */ - (NSUInteger) setMaximum: (NSUInteger)m; /** Set the originator for any emails sent by the SMTP client.
* This overrides the value in the 'from' header of an email.
* If this is not set (or is set to nil) then the GSMimeSMTPClientOriginator * user default is used. If the originator is nil or an empty string then * the value in the 'from' header of the email is used. */ - (void) setOriginator: (NSString*)s; /** Set the port for the SMTP server. If this is not set (or is set to nil) * then the GSMimeSMTPClientPort user default is used. If the port is not an * integer in the 1-65535 range, then '25' (the default SMTP port) is used. */ - (void) setPort: (NSString*)s; /** Set the username for authentication to the SMTP server. * If this is not set (or is set to nil) then the GSMimeSMTPClientUsername * user default is used. If the username is nil or an empty string then * authentication is not attempted. */ - (void) setUsername: (NSString*)s; /** returns the receivers current state. */ - (int) state; /** Returns a string describing the receiver's current state */ - (NSString*) stateDesc; @end /** Informal protocol for delegates of the GSMimeSMTPClient class. * The default implementations of these methods do nothing. */ @interface NSObject (GSMimeSMTPClient) - (void) smtpClient: (GSMimeSMTPClient*)client mimeFailed: (GSMimeDocument*)doc; /* Failed to send */ - (void) smtpClient: (GSMimeSMTPClient*)client mimeSent: (GSMimeDocument*)doc; /* Sent successfully */ - (void) smtpClient: (GSMimeSMTPClient*)client mimeUnsent: (GSMimeDocument*)doc; /* Aborted (not sent) */ @end #if defined(__cplusplus) } #endif #endif /* OS_API_VERSION(GS_API_NONE,GS_API_NONE) */ #endif /* __GSMime_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/GNUstepBase/GSObjCRuntime.h000066400000000000000000000446261435650067400225050ustar00rootroot00000000000000/** Interface to ObjC runtime for GNUStep Copyright (C) 1995, 1997, 2000, 2002, 2003 Free Software Foundation, Inc. Written by: Andrew Kachites McCallum Date: 1995 Written by: Richard Frith-Macdonald Date: 2002 This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. AutogsdocSource: Additions/GSObjCRuntime.m */ #ifndef __GSObjCRuntime_h_GNUSTEP_BASE_INCLUDE #define __GSObjCRuntime_h_GNUSTEP_BASE_INCLUDE #import #import #include #if NeXT_RUNTIME #include #include #include #ifndef _C_ATOM #define _C_ATOM '%' #endif #define _F_CONST 0x01 #define _F_IN 0x01 #define _F_OUT 0x02 #define _F_INOUT 0x03 #define _F_BYCOPY 0x04 #define _F_ONEWAY 0x08 #define _C_CONST 'r' #define _C_IN 'n' #define _C_INOUT 'N' #define _C_OUT 'o' #define _C_BYCOPY 'O' #define _C_ONEWAY 'V' #else /* GNU Objective C Runtime */ #include #if defined (__GNU_LIBOBJC__) #include #else #include #include #endif #endif /* * Hack for older compiler versions that don't have all defines * needed in objc-api.h */ #ifndef _C_LNG_LNG #define _C_LNG_LNG 'q' #endif #ifndef _C_ULNG_LNG #define _C_ULNG_LNG 'Q' #endif #if OBJC2RUNTIME /* We have a real ObjC2 runtime. */ #include #else /* We emulate an ObjC2 runtime. */ #include #endif #ifdef __cplusplus extern "C" { #endif @class NSArray; @class NSDictionary; @class NSObject; @class NSString; @class NSValue; #ifndef YES #define YES 1 #endif #ifndef NO #define NO 0 #endif #ifndef nil #define nil 0 #endif #if !defined(_C_CONST) #define _C_CONST 'r' #endif #if !defined(_C_IN) #define _C_IN 'n' #endif #if !defined(_C_INOUT) #define _C_INOUT 'N' #endif #if !defined(_C_OUT) #define _C_OUT 'o' #endif #if !defined(_C_BYCOPY) #define _C_BYCOPY 'O' #endif #if !defined(_C_BYREF) #define _C_BYREF 'R' #endif #if !defined(_C_ONEWAY) #define _C_ONEWAY 'V' #endif #if !defined(_C_GCINVISIBLE) #define _C_GCINVISIBLE '!' #endif /* * Functions for accessing instance variables directly - * We can copy an ivar into arbitrary data, * Get the type encoding for a named ivar, * and copy a value into an ivar. */ GS_EXPORT BOOL GSObjCFindVariable(id obj, const char *name, const char **type, unsigned int *size, int *offset); GS_EXPORT void GSObjCGetVariable(id obj, int offset, unsigned int size, void *data); GS_EXPORT void GSObjCSetVariable(id obj, int offset, unsigned int size, const void *data); GS_EXPORT NSArray * GSObjCMethodNames(id obj, BOOL recurse); GS_EXPORT NSArray * GSObjCVariableNames(id obj, BOOL recurse); /** *

A Behavior can be seen as a "Protocol with an implementation" or a * "Class without any instance variables". A key feature of behaviors * is that they give a degree of multiple inheritance. *

*

Behavior methods, when added to a class, override the class's * superclass methods, but not the class's methods. *

*

Whan a behavior class is added to a receiver class, not only are the * methods defined in the behavior class added, but the methods from the * behavior's class hierarchy are also added (unless already present). *

*

It's not the case that a class adding behaviors from another class * must have "no instance vars". The receiver class just has to have the * same layout as the behavior class (optionally with some additional * ivars after those of the behavior class). *

*

This function provides Behaviors without adding any new syntax to * the Objective C language. Simply define a class with the methods you * want to add, then call this function with that class as the behavior * argument. *

*

This function should be called in the +initialize method of the receiver. *

*

If you add several behaviors to a class, be aware that the order of * the additions is significant. *

*/ GS_EXPORT void GSObjCAddClassBehavior(Class receiver, Class behavior); /** *

An Override can be seen as a "category implemented as a separate class * and manually added to the receiver class under program control, rather * than automatically added by the compiler/runtime. *

*

Override methods, when added to a receiver class, replace the class's * class's methods of the same name (or are added if the class did not define * methods with that name). *

*

It's not the case that a class adding overrides from another class * must have "no instance vars". The receiver class just has to have the * same layout as the override class (optionally with some additional * ivars after those of the override class). *

*

This function provides overrides without adding any new syntax to * the Objective C language. Simply define a class with the methods you * want to add, then call this function with that class as the override * argument. *

*

This function should usually be called in the +initialize method * of the receiver. *

*

If you add several overrides to a class, be aware that the order of * the additions is significant. *

*/ GS_EXPORT void GSObjCAddClassOverride(Class receiver, Class override); /** Turn on (YES), off (NO) or test (-1) behavior debugging. */ GS_EXPORT BOOL GSObjCBehaviorDebug(int setget); GS_EXPORT NSValue * GSObjCMakeClass(NSString *name, NSString *superName, NSDictionary *iVars); GS_EXPORT void GSObjCAddClasses(NSArray *classes); /** * Given a NULL terminated list of methods, add them to the class.
* If the method already exists in a superclass, the new version overrides * that one, but if the method already exists in the class itsself, the * new one is quietly ignored (replace==NO) or replaced with the new * version (if replace==YES).
* To add class methods, cls should be the metaclass of the class to * which the methods are being added. */ GS_EXPORT void GSObjCAddMethods(Class cls, Method *list, BOOL replace); /* * Functions for key-value encoding ... they access values in an object * either by selector or directly, but do so using NSNumber for the * scalar types of data. */ GS_EXPORT id GSObjCGetVal(NSObject *self, const char *key, SEL sel, const char *type, unsigned size, int offset); GS_EXPORT void GSObjCSetVal(NSObject *self, const char *key, id val, SEL sel, const char *type, unsigned size, int offset); /* * This section includes runtime functions * to query and manipulate the ObjC runtime structures. * These functions take care to not use ObjC code so * that they can safely be used in +(void)load implementations * where applicable. */ /** * Deprecated ... use objc_getClassList() */ GS_EXPORT unsigned int GSClassList(Class *buffer, unsigned int max, BOOL clearCache); /** * GSObjCClass() is deprecated ... use object_getClass() */ GS_EXPORT Class GSObjCClass(id obj); /** * GSObjCSuper() is deprecated ... use class_getSuperclass() */ GS_EXPORT Class GSObjCSuper(Class cls); /** * GSObjCIsInstance() is deprecated ... use object_getClass() * in conjunction with class_isMetaClass() */ GS_EXPORT BOOL GSObjCIsInstance(id obj); /** * GSObjCIsClass() is deprecated ... use object_getClass() * in conjunction with class_isMetaClass() */ GS_EXPORT BOOL GSObjCIsClass(Class cls); /** * Test to see if class inherits from another class * The argument to this function must NOT be nil. */ GS_EXPORT BOOL GSObjCIsKindOf(Class cls, Class other); /** * GSClassFromName() is deprecated ... use objc_lookUpClass() */ GS_EXPORT Class GSClassFromName(const char *name); /** * GSNameFromClass() is deprecated ... use class_getName() */ GS_EXPORT const char *GSNameFromClass(Class cls); /** * GSClassNameFromObject() is deprecated ... use object_getClass() * in conjunction with class_getName() */ GS_EXPORT const char *GSClassNameFromObject(id obj); /** * GSNameFromSelector() is deprecated ... use sel_getName() */ GS_EXPORT const char *GSNameFromSelector(SEL sel); /** * GSSelectorFromName() is deprecated ... use sel_getUid() */ GS_EXPORT SEL GSSelectorFromName(const char *name); /** * Return the selector for the specified name and types.
* Returns a nul pointer if the name is nul.
* Creates a new selector if necessary.
* Code must NOT rely on this providing a selector with type information. */ GS_EXPORT SEL GSSelectorFromNameAndTypes(const char *name, const char *types); /** * Return the type information from the specified selector.
* May return a nul pointer if the selector was a nul pointer or if it * was not typed (or if the runtime does not support typed selectors).
* Code must NOT rely on this providing any type information. */ GS_EXPORT const char * GSTypesFromSelector(SEL sel); /** * Compare only the type information ignoring qualifiers, the frame layout * and register markers. Unlike sel_types_match, this function also * handles comparisons of types with and without any layout information. */ GS_EXPORT BOOL GSSelectorTypesMatch(const char *types1, const char *types2); /** Takes full type information and skips forward to the actual type * as specified in the _C_... constants. */ GS_EXPORT const char * GSSkipTypeQualifierAndLayoutInfo(const char *types); /** * Returns a protocol object with the corresponding name. * This function searches the registered classes for any protocol * with the supplied name. If one is found, it is cached in * for future requests. If efficiency is a factor then use * GSRegisterProtocol() to insert a protocol explicitly into the cache * used by this function. If no protocol is found this function returns * nil. */ GS_EXPORT Protocol * GSProtocolFromName(const char *name); /** * Registers proto in the cache used by GSProtocolFromName(). */ GS_EXPORT void GSRegisterProtocol(Protocol *proto); /** * A variant of protocol_getMethodDescription which recursively searches * parent protocols if the requested selector isn't found in the given * protocol. * * Returns a {NULL, NULL} structure if the requested selector couldn't be * found. */ GS_EXPORT struct objc_method_description GSProtocolGetMethodDescriptionRecursive(Protocol *aProtocol, SEL aSel, BOOL isRequired, BOOL isInstance); /* * Unfortunately the definition of the symbols * 'Method(_t)', 'MethodList(_t)' and 'IVar(_t)' * are incompatible between the GNU and NeXT/Apple runtimes. * We introduce GSMethod, GSMethodList and GSIVar to allow portability. */ typedef Method GSMethod; typedef Ivar GSIVar; /** * Returns the pointer to the method structure * for the selector in the specified class. * Depending on searchInstanceMethods, this function searches * either instance or class methods. * Depending on searchSuperClassesm this function searches * either the specified class only or also its superclasses.
* To obtain the implementation pointer IMP use returnValue->method_imp * which should be safe across all runtimes.
* It should be safe to use this function in +load implementations.
* This function should currently (June 2004) be considered WIP. * Please follow potential changes (Name, parameters, ...) closely until * it stabilizes. */ GS_EXPORT GSMethod GSGetMethod(Class cls, SEL sel, BOOL searchInstanceMethods, BOOL searchSuperClasses); /** * Deprecated .. does nothing. */ GS_EXPORT void GSFlushMethodCacheForClass (Class cls); /** * Deprecated .. use class_getInstanceVariable() */ GS_EXPORT GSIVar GSCGetInstanceVariableDefinition(Class cls, const char *name); /** * Deprecated .. use class_getInstanceVariable() */ GS_EXPORT GSIVar GSObjCGetInstanceVariableDefinition(Class cls, NSString *name); /** * GSObjCVersion() is deprecated ... use class_getVersion() */ GS_EXPORT int GSObjCVersion(Class cls); /** * Quickly return autoreleased data storage area. */ GS_EXPORT void * GSAutoreleasedBuffer(unsigned size); /** *

Prints a message to fptr using the format string provided and any * additional arguments. The format string is interpreted as by * the NSString formatted initialisers, and understands the '%@' syntax * for printing an object. *

*

The data is written to the file pointer in the default CString * encoding if possible, as a UTF8 string otherwise. *

*

This function is recommended for printing general log messages. * For debug messages use NSDebugLog() and friends. For error logging * use NSLog(), and for warnings you might consider NSWarnLog(). *

*/ GS_EXPORT BOOL GSPrintf (FILE *fptr, NSString *format, ...); GS_EXPORT NSArray * GSObjCAllSubclassesOfClass(Class cls); GS_EXPORT NSArray * GSObjCDirectSubclassesOfClass(Class cls); /** Function to change the class of the specified instance to newClass. * This handles memory debugging issues in GNUstep-base and also * deals with class finalisation issues in a garbage collecting * environment, so you should use this function rather than attempting * to swizzle class pointers directly. */ GS_EXPORT void GSClassSwizzle(id instance, Class newClass); #if GS_API_VERSION(GS_API_ANY,011500) GS_EXPORT const char * GSLastErrorStr(long error_id) GS_DEPRECATED_FUNC; #endif #ifndef GS_MAX_OBJECTS_FROM_STACK /** * The number of objects to try to get from varargs into an array on * the stack ... if there are more than this, use the heap. * NB. This MUST be a multiple of 2 */ #define GS_MAX_OBJECTS_FROM_STACK 128 #endif /** *

This is a macro designed to minimise the use of memory allocation and * deallocation when you need to work with a vararg list of objects.
* The objects are unpacked from the vararg list into two 'C' arrays and * then a code fragment you specify is able to make use of them before * that 'C' array is destroyed. *

*

The firstObject argument is the name of the formal parameter in your * method or function which precedes the ', ...' denoting variable args. *

*

The code argument is a piece of objective-c code to be executed to * make use of the objects stored in the 'C' arrays.
* When this code is called the unsigned integer '__count' will contain the * number of objects unpacked, the pointer '__objects' will point to * the first object in each pair, and the pointer '__pairs' will point * to an array containing the second halves of the pairs of objects * whose first halves are in '__objects'.
* This lets you pack a list of the form 'key, value, key, value, ...' * into an array of keys and an array of values. *

*/ #define GS_USEIDPAIRLIST(firstObject, code...) ({\ va_list __ap; \ unsigned int __max = GS_MAX_OBJECTS_FROM_STACK; \ unsigned int __count = 0; \ id __buf[__max]; \ id *__objects = __buf; \ id *__pairs = &__objects[__max/2]; \ id __obj = firstObject; \ va_start(__ap, firstObject); \ while (__obj != nil && __count < __max) \ { \ if ((__count % 2) == 0) \ { \ __objects[__count/2] = __obj; \ } \ else \ { \ __pairs[__count/2] = __obj; \ } \ __obj = va_arg(__ap, id); \ if (++__count == __max) \ { \ while (__obj != nil) \ { \ __count++; \ __obj = va_arg(__ap, id); \ } \ } \ } \ if ((__count % 2) == 1) \ { \ __pairs[__count/2] = nil; \ __count++; \ } \ va_end(__ap); \ if (__count > __max) \ { \ unsigned int __tmp; \ __objects = (id*)malloc(__count*sizeof(id)); \ __pairs = &__objects[__count/2]; \ __objects[0] = firstObject; \ va_start(__ap, firstObject); \ for (__tmp = 1; __tmp < __count; __tmp++) \ { \ if ((__tmp % 2) == 0) \ { \ __objects[__tmp/2] = va_arg(__ap, id); \ } \ else \ { \ __pairs[__tmp/2] = va_arg(__ap, id); \ } \ } \ va_end(__ap); \ } \ code; \ if (__objects != __buf) free(__objects); \ }) /** *

This is a macro designed to minimise the use of memory allocation and * deallocation when you need to work with a vararg list of objects.
* The objects are unpacked from the vararg list into a 'C' array and * then a code fragment you specify is able to make use of them before * that 'C' array is destroyed. *

*

The firstObject argument is the name of the formal parameter in your * method or function which precedes the ', ...' denoting variable args. *

*

The code argument is a piece of objective-c code to be executed to * make use of the objects stored in the 'C' array.
* When this code is called the unsigned integer '__count' will contain the * number of objects unpacked, and the pointer '__objects' will point to * the unpacked objects, ie. firstObject followed by the vararg arguments * up to (but not including) the first nil. *

*/ #define GS_USEIDLIST(firstObject, code...) ({\ va_list __ap; \ unsigned int __max = GS_MAX_OBJECTS_FROM_STACK; \ unsigned int __count = 0; \ id __buf[__max]; \ id *__objects = __buf; \ id __obj = firstObject; \ va_start(__ap, firstObject); \ while (__obj != nil && __count < __max) \ { \ __objects[__count] = __obj; \ __obj = va_arg(__ap, id); \ if (++__count == __max) \ { \ while (__obj != nil) \ { \ __count++; \ __obj = va_arg(__ap, id); \ } \ } \ } \ va_end(__ap); \ if (__count > __max) \ { \ unsigned int __tmp; \ __objects = (id*)NSZoneMalloc(NSDefaultMallocZone(),__count*sizeof(id)); \ va_start(__ap, firstObject); \ __objects[0] = firstObject; \ for (__tmp = 1; __tmp < __count; __tmp++) \ { \ __objects[__tmp] = va_arg(__ap, id); \ } \ va_end(__ap); \ } \ code; \ if (__objects != __buf) NSZoneFree (NSDefaultMallocZone(),__objects); \ }) #ifdef __cplusplus } #endif #endif /* __GSObjCRuntime_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/GNUstepBase/GSTLS.h000066400000000000000000000226741435650067400207650ustar00rootroot00000000000000/** Interface for GSTLS classes for GNUStep Copyright (C) 2012 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 2101 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #import "Foundation/NSObject.h" @class NSDate; @class NSDictionary; @class NSHost; @class NSString; GS_EXPORT NSString * const GSTLSCAFile; GS_EXPORT NSString * const GSTLSCertificateFile; GS_EXPORT NSString * const GSTLSCertificateKeyFile; GS_EXPORT NSString * const GSTLSCertificateKeyPassword; GS_EXPORT NSString * const GSTLSDebug; GS_EXPORT NSString * const GSTLSIssuers; GS_EXPORT NSString * const GSTLSOwners; GS_EXPORT NSString * const GSTLSPriority; GS_EXPORT NSString * const GSTLSRemoteHosts; GS_EXPORT NSString * const GSTLSRevokeFile; GS_EXPORT NSString * const GSTLSServerName; GS_EXPORT NSString * const GSTLSVerify; #if GS_USE_GNUTLS /* Temporarily redefine 'id' in case the headers use the objc reserved word. */ #define id GNUTLSID /* gcrypt uses __attribute__((deprecated)) to mark structure members that are * private. This causes compiler warnings just from using the header. Turn * them off... */ #define _GCRYPT_IN_LIBGCRYPT #include #include #if GNUTLS_VERSION_NUMBER <= 0x020b00 #include #endif #undef id /* This class is used to ensure that the GNUTLS system is initialised * and thread-safe. It also provides a mechanism to save certificate * and key information in memory by associating a 'filename' with the * cached data. */ GS_EXPORT_CLASS @interface GSTLSObject : NSObject /** Returns either the cached data for this file name (if any), or the * result of calling [NSData+dataWithContentsOfFile:] if there is no * cached data.
* This method is used internally to load certificates and keys. */ + (NSData*) dataForTLSFile: (NSString*)fileName; /** Sets the known (cached) data content for the specified file name.
* Calling this with a nil data object will remove any existing value * from the cache.
* You may use this method to control what data is used for specified * file names. */ + (void) setData: (NSData*)data forTLSFile: (NSString*)fileName; @end /* This class provides the current autogenerated Diffie Hellman parameters * for server negotiation and/or parameters laoded from file. */ GS_EXPORT_CLASS @interface GSTLSDHParams : GSTLSObject { NSTimeInterval when; NSString *path; gnutls_dh_params_t params; } /* Returns the most recently generated key ... if there is none this calls * +generate to create one. Once a key has been generated, replacements * are periodically generated in a separate thread. */ + (GSTLSDHParams*) current; /* Generate key ... really slow. */ + (void) generate; /* Return params loaded from a file. */ + (GSTLSDHParams*) paramsFromFile: (NSString*)f; - (gnutls_dh_params_t) params; @end /* Manage certificate lists (for servers and clients) and also provide * DH params. */ GS_EXPORT_CLASS @interface GSTLSCertificateList : GSTLSObject { NSTimeInterval when; NSString *path; gnutls_x509_crt_t *crts; unsigned int count; } + (GSTLSCertificateList*) listFromFile: (NSString*)f; /* Return the list of x509 certificates. */ - (gnutls_x509_crt_t*) certificateList; /* Return number of certificates in list. */ - (unsigned int) count; /* Return the earliest expiry date of any certificate in the list. */ - (NSDate*) expiresAt; /* Return the date when a certificate in the list expires. */ - (NSDate*) expiresAt: (unsigned int)index; @end /* This encapsulates private keys used to unlock certificates */ GS_EXPORT_CLASS @interface GSTLSPrivateKey : GSTLSObject { NSTimeInterval when; NSString *path; NSString *password; gnutls_x509_privkey_t key; } + (GSTLSPrivateKey*) keyFromFile: (NSString*)f withPassword: (NSString*)p; - (gnutls_x509_privkey_t) key; @end /* This encapsulates a credentials setup for a sessions */ GS_EXPORT_CLASS @interface GSTLSCredentials : GSTLSObject { NSTimeInterval when; NSString *name; GSTLSPrivateKey *key; GSTLSCertificateList *list; GSTLSDHParams *dhParams; BOOL trust; BOOL freeCred; gnutls_certificate_credentials_t certcred; } + (GSTLSCredentials*) credentialsFromCAFile: (NSString*)ca defaultCAFile: (NSString*)dca revokeFile: (NSString*)rv defaultRevokeFile: (NSString*)drv certificateFile: (NSString*)cf certificateKeyFile: (NSString*)ck certificateKeyPassword: (NSString*)cp asClient: (BOOL)client debug: (BOOL)debug; + (GSTLSCredentials*) selfSigned: (BOOL)debug; - (gnutls_certificate_credentials_t) credentials; - (GSTLSPrivateKey*) key; - (GSTLSCertificateList*) list; - (BOOL) trust; @end /* Declare a pointer to a function to be used for I/O */ typedef ssize_t (*GSTLSIOR)(gnutls_transport_ptr_t, void *, size_t); typedef ssize_t (*GSTLSIOW)(gnutls_transport_ptr_t, const void *, size_t); /* This class encapsulates a session to a remote system. * Sessions are created with a direction and an options dictionary, * defining how they will operate. The handle, pushFunc and pullFunc * provide the I/O mechanism. */ GS_EXPORT_CLASS @interface GSTLSSession : GSTLSObject { NSDictionary *opts; GSTLSCredentials *credentials; NSString *problem; NSString *issuer; NSString *owner; BOOL outgoing; BOOL active; BOOL handshake; BOOL setup; BOOL debug; NSTimeInterval created; void *handle; @public gnutls_session_t session; } + (GSTLSSession*) sessionWithOptions: (NSDictionary*)options direction: (BOOL)isOutgoing transport: (void*)ioHandle push: (GSTLSIOW)pushFunc pull: (GSTLSIOR)pullFunc; - (id) initWithOptions: (NSDictionary*)options direction: (BOOL)isOutgoing transport: (void*)ioHandle push: (GSTLSIOW)pushFunc pull: (GSTLSIOR)pullFunc; /* Return YES if the session is active (handshake has succeeded and the * session has not been disconnected), NO otherwise. */ - (BOOL) active; /** Returns the age of this instance (how long since it was created). */ - (NSTimeInterval) age; /* Returns the credentials object ofr this session. */ - (GSTLSCredentials*) credentials; /* Return the current debug mode. */ - (BOOL) debug; /* Disconnects and closes down the session.
* The reusable flag specifies whether we intend to reuse the underlying * connection.
* Returns YES on success, NO if the shutdown did not complete cleanly * and the underlying connection cannot be reused. */ - (BOOL) disconnect: (BOOL)reusable; /* Try to complete a handshake ... return YES if complete, NO if we need * to try again (would have to wait for the remote end).
*/ - (BOOL) handshake; /** If the session verified a certificate from the remote end, returns the * name of the certificate issuer in the form "C=xxxx,O=yyyy,CN=zzzz" as * described in RFC4514. Otherwise returns nil. */ - (NSString*) issuer; /** If the session verified a certificate from the remote end, returns the * name of the certificate owner in the form "C=xxxx,O=yyyy,CN=zzzz" as * described in RFC4514. Otherwise returns nil. */ - (NSString*) owner; /** Returns the number of bytes of data available to be read from the TLS * buffers (using the -read:length: method). If this returns zero the TLS * software needs to perform a network read before any more data can be * returned. */ - (size_t) pending; /* After a failed handshake, this should contain a description of the * failure reason. */ - (NSString*) problem; /* Read data from the session. */ - (NSInteger) read: (void*)buf length: (NSUInteger)len; /** Get a report of the SSL/TLS status of the current session. */ - (NSString*) sessionInfo; /* Write data to the session. */ - (NSInteger) write: (const void*)buf length: (NSUInteger)len; /* For internal use to verify the remote system's certificate. * Returns 0 on success, negative on failure. */ - (int) verify; @end #endif gnustep-base-1.29.0/Headers/GNUstepBase/GSTypeEncoding.h000066400000000000000000000153731435650067400227110ustar00rootroot00000000000000/* * Objective-C type encoding support * * Copyright (C) 2012-2014 Free Software Foundation, Inc. * * Written by Marat Ibadinov * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ #ifndef GS_TYPE_ENCODING_H #define GS_TYPE_ENCODING_H #include #if defined(__MINGW__) /* On MINGW we need to get the boolean type from the runtime at this point. */ #define _NO_BOOL_TYPEDEF #endif #if defined (NeXT_RUNTIME) # include #else # include # if defined (__GNU_LIBOBJC__) # include # else # include # include # endif #endif #if !defined(GS_STATIC_INLINE) # if defined(__GNUC__) # define GS_STATIC_INLINE static __inline__ __attribute__((always_inline)) # else # define GS_STATIC_INLINE static inline # endif #endif /* type mangling is compiler independent so we can safely define this by hand */ typedef enum GSObjCTypeQualifier { GSObjCQualifierConst = 'r', GSObjCQualifierIn = 'n', GSObjCQualifierInOut = 'N', GSObjCQualifierOut = 'o', GSObjCQualifierByCopy = 'O', GSObjCQualifierByRef = 'R', GSObjCQualifierOneWay = 'V', GSObjCQualifierInvisible = '!' } GSObjCTypeQualifier; typedef enum GSObjCType { GSObjCTypeId = '@', GSObjCTypeClass = '#', GSObjCTypeSelector = ':', GSObjCTypeChar = 'c', GSObjCTypeUnsignedChar = 'C', GSObjCTypeShort = 's', GSObjCTypeUnsignedShort = 'S', GSObjCTypeInt = 'i', GSObjCTypeUnsignedInt = 'I', GSObjCTypeLong = 'l', GSObjCTypeUnsignedLong = 'L', GSObjCTypeLongLong = 'q', GSObjCTypeUnsignedLongLong = 'Q', GSObjCTypeFloat = 'f', GSObjCTypeDouble = 'd', GSObjCTypeComplex = 'j', GSObjCTypeBitField = 'b', GSObjCTypeBool = 'B', GSObjCTypeVoid = 'v', GSObjCTypePointer = '^', GSObjCTypeCharPointer = '*', GSObjCTypeAtom = '%', GSObjCTypeArrayBegin = '[', GSObjCTypeArrayEnd = ']', GSObjCTypeStructureBegin = '{', GSObjCTypeStructureEnd = '}', GSObjCTypeUnionBegin = '(', GSObjCTypeUnionEnd = ')', GSObjCTypeUnknown = '?' } GSObjCType; /* maximum and minimum char values in a type specification */ typedef enum GSObjCTypeBound { GSObjCTypeMin = ' ', GSObjCTypeMax = '~' } GSObjCTypeBound; #if defined (NeXT_RUNTIME) typedef enum GSObjCTypeQualifierMask { GSObjCQualifierConstMask = 0x01, GSObjCQualifierInMask = 0x01, GSObjCQualifierOutMask = 0x02, GSObjCQualifierInOutMask = 0x03, GSObjCQualifierByCopyMask = 0x04, GSObjCQualifierByRefMask = 0x08, GSObjCQualifierOneWayMask = 0x10, GSObjCQualifierInvisibleMask = 0x20 } GSObjCTypeQualifierMask; #else typedef enum GSObjCTypeQualifierMask { GSObjCQualifierConstMask = _F_CONST, GSObjCQualifierInMask = _F_IN, GSObjCQualifierOutMask = _F_OUT, GSObjCQualifierInOutMask = _F_INOUT, GSObjCQualifierByCopyMask = _F_BYCOPY, GSObjCQualifierByRefMask = _F_BYREF, GSObjCQualifierOneWayMask = _F_ONEWAY, GSObjCQualifierInvisibleMask = _F_GCINVISIBLE } GSObjCTypeQualifierMask; #endif /* * parser-related stuff */ typedef struct GSObjCTypeInfo { /* store pointer to allow recursive parsing of pointer types, e.g. ^{^[2*]} */ const char *type; size_t size; uint8_t alignment; uint8_t qualifiers; } GSObjCTypeInfo; typedef void (*GSObjCTypeParserDelegate)(void *context, GSObjCTypeInfo type); typedef enum GSObjCParserOptions { GSObjCReportArrayOnceMask = 1 } GSObjCParserOptions; const char * GSObjCParseTypeSpecification (const char *cursor, GSObjCTypeParserDelegate delegate, void *context, unsigned options); GS_STATIC_INLINE size_t GSObjCPadSize (size_t size, uint8_t alignment) { return alignment * ((size + alignment - 1) / alignment); } GS_STATIC_INLINE size_t GSObjCGetPadding (size_t size, uint8_t alignment) { return (alignment - (size & (alignment - 1))) & (alignment - 1); } const char * GSGetSizeAndAlignment (const char *type, size_t *sizep, uint8_t *alignp); #if defined (NeXT_RUNTIME) /* GNU API support for NeXT runtime */ int objc_sizeof_type (const char* type); int objc_alignof_type (const char* type); int objc_aligned_size (const char* type); int objc_promoted_size (const char* type); unsigned objc_get_type_qualifiers (const char* type); const char * objc_skip_typespec (const char* type); const char * objc_skip_offset (const char* type); const char * objc_skip_argspec (const char* type); const char * objc_skip_type_qualifiers (const char* type); struct objc_struct_layout { GSObjCTypeInfo *info; long position; unsigned count; unsigned allocated; unsigned depth; unsigned offset; unsigned alignment; }; void objc_layout_structure (const char *type, struct objc_struct_layout *layout); BOOL objc_layout_structure_next_member (struct objc_struct_layout *layout); void objc_layout_structure_get_info (struct objc_struct_layout *layout, unsigned int *offset, unsigned int *align, const char **type); void objc_layout_finish_structure (struct objc_struct_layout *layout, unsigned int *size, unsigned int *align); #endif /* NeXT_RUNTIME */ #endif /* GS_TYPE_ENCODING_H */ gnustep-base-1.29.0/Headers/GNUstepBase/GSUnion.h000066400000000000000000000054471435650067400214120ustar00rootroot00000000000000/* * GSUnion.h * File to set up a typedef for a union capable of containing various types. * Copyright (C) 1999 Free Software Foundation, Inc. * * Author: Richard Frith-Macdonald * Created: Apr 1999 * * This file is part of the GNUstep Base Library. * * 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 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 * Library General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02111 USA. */ /* Need Foundation/NSObjCRuntime.h for type declarations. */ #import /* These are not defined in older Mac OS X systems */ #ifndef NSINTEGER_DEFINED typedef intptr_t NSInteger; typedef uintptr_t NSUInteger; #define NSINTEGER_DEFINED 1 #endif /* * Definitions for bitmap mask of types of element in union. */ #ifndef GSUNION_OBJ #define GSUNION_OBJ 0x0001 #define GSUNION_CLS 0x0002 #define GSUNION_SEL 0x0004 #define GSUNION_PTR 0x0080 #define GSUNION_NSINT 0x1000 #define GSUNION_ALL 0x1fff #endif /* GSUNION_OBJ */ /* * Produce a typedef for a union with name 'GSUNION' containing elements * specified in the GSUNION_TYPES mask, and optionally with an extra * element 'ext' of the type specified in GSUNION_EXTRA * * You can include this file more than once in order to produce different * typedefs as long as you redefine 'GSUNION' before each inclusion. */ #if defined(GSUNION) && defined(GSUNION_TYPES) typedef union { NSUInteger addr; /* Always present */ #if ((GSUNION_TYPES) & GSUNION_OBJ) id obj; NSObject *nso; #endif #if ((GSUNION_TYPES) & GSUNION_CLS) Class cls; #endif #if ((GSUNION_TYPES) & GSUNION_SEL) SEL sel; #endif #if ((GSUNION_TYPES) & GSUNION_NSINT) NSInteger nsi; NSUInteger nsu; #endif #if ((GSUNION_TYPES) & GSUNION_PTR) void *ptr; const void *cptr; char *str; const char *cstr; #endif /* Warning ... if this value is declared in the union, and its type is not * the same size as a pointer, then care must be taken in case of confusion * caused when an assignment to a variable using one of the union's types * causes part of the variable to ebe left with undefined content from the * point of view of another of the union's types. */ #if defined(GSUNION_EXTRA) GSUNION_EXTRA ext; #endif } GSUNION; #endif gnustep-base-1.29.0/Headers/GNUstepBase/GSVersionMacros.h000066400000000000000000000362641435650067400231150ustar00rootroot00000000000000/* GSVersionMacros.h - macros for managing API versioning and visibility Copyright (C) 2006-2014 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: Oct, October 2006 This file is part of GNUstep. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public 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 __GNUSTEP_GSVERSIONMACROS_H_INCLUDED_ #define __GNUSTEP_GSVERSIONMACROS_H_INCLUDED_ /* By default we defined NO_GNUSTEP to 0 so that we will include extensions. */ #if !defined(NO_GNUSTEP) # define NO_GNUSTEP 0 #endif /* Check consistency of definitions for system compatibility. */ #if defined(STRICT_OPENSTEP) # define GS_OPENSTEP_V 10000 # undef NO_GNUSTEP # define NO_GNUSTEP 1 #elif defined(STRICT_MACOS_X) # define GS_OPENSTEP_V 100600 # undef NO_GNUSTEP # define NO_GNUSTEP 1 #endif /* Define the GS_OSX_ADJUST() macro to adjust OSX style version macros * to GNUstep style version macros. */ #define GS_OSX_ADJUST(V) ((V) >= 10000 ? (V) : ((V)/100*10000 + (V)%100*10)) /* Define OSX compatibility version macros if necessary. */ #if !defined(MAC_OS_X_VERSION_10_0) #define MAC_OS_X_VERSION_10_0 1000 #define MAC_OS_X_VERSION_10_1 1010 #define MAC_OS_X_VERSION_10_2 1020 #define MAC_OS_X_VERSION_10_3 1030 #define MAC_OS_X_VERSION_10_4 1040 #define MAC_OS_X_VERSION_10_5 1050 #define MAC_OS_X_VERSION_10_6 1060 #define MAC_OS_X_VERSION_10_7 1070 #define MAC_OS_X_VERSION_10_8 1080 #define MAC_OS_X_VERSION_10_9 1090 #define MAC_OS_X_VERSION_10_10 1100 #define MAC_OS_X_VERSION_10_11 1110 #define MAC_OS_X_VERSION_10_12 1120 #define MAC_OS_X_VERSION_10_13 1130 #define MAC_OS_X_VERSION_10_14 1140 #endif /* MAC_OS_X_VERSION_10_0 */ /* Allow MAC_OS_X_VERSION_MAX_ALLOWED to be used in place of GS_OPENSTEP_V * if GS_OPENSTEP_V is not defined. */ #ifndef GS_OPENSTEP_V #ifdef MAC_OS_X_VERSION_MAX_ALLOWED #define GS_OPENSTEP_V GS_OSX_ADJUST(MAC_OS_X_VERSION_MAX_ALLOWED) #endif /* MAC_OS_X_VERSION_MAX_ALLOWED */ #endif /* GS_OPENSTEP_V */ /* * NB. The version values below must be integers ... by convention these are * made up of two digits each for major, minor and subminor version numbers * (ie each is in the range 00 to 99 though a leading zero in the major * number is not permitted). * So for a MacOS-X 10.3.9 release the version number would be 100309 * * You may define GS_GNUSTEP_V or GS_OPENSTEP_V to ensure that your * program only 'sees' the specified varsion of the API. */ /** *

Macro to check a defined GNUstep version number (GS_GNUSTEP_V) against * the supplied arguments. Returns true if no GNUstep version is specified, * or if ADD <= version < REM, where ADD is the version * number at which a feature guarded by the macro was introduced and * REM is the version number at which it was removed. *

*

The version number arguments are six digit integers where the first * two digits are the major version number, the second two are the minor * version number and the last two are the subminor number (all left padded * with a zero where necessary). However, for convenience you can also * use the predefined constants ... * GS_API_NONE, * GS_API_LATEST, *

*

Also see OS_API_VERSION *

*

NB. If you are changing the API (eg adding a new feature) you need * to control the visibility io the new header file code using
* #if GS_API_VERSION(ADD,GS_API_LATEST)
* where ADD is the version number of the next minor * release after the most recent one.
* As a general principle you should not change the API with * changing subminor version numbers ... as that tends to confuse * people (though Apple has sometimes done it). *

*/ #define GS_API_VERSION(ADD,REM) \ (!defined(GS_GNUSTEP_V) || (GS_GNUSTEP_V >= ADD && GS_GNUSTEP_V < REM)) /** *

Macro to check a defined OpenStep/OPENSTEP/MacOS-X version against the * supplied arguments. Returns true if no version is specified, or if * ADD <= version < REM, where ADD is the version * number at which a feature guarded by the macro was introduced and * REM is the version number at which it was removed. *

*

The version number arguments are six digit integers where the first * two digits are the major version number, the second two are the minor * version number and the last two are the subminor number (all left padded * with a zero where necessary). However, for convenience you can also * use any of several predefined constants ... * GS_API_NONE, * GS_API_LATEST, * GS_API_OSSPEC, * GS_API_OPENSTEP, * GS_API_MACOSX *

*

Also see GS_API_VERSION *

*

For OSX compatibility, this macro also supports the use of Apple's * symbolic constants for version numbering. Their contants are currently * four digit values (two digits for the major version, one for the minor, * and one for the subminor). *

*

The Apple compatibility version macros are currently: * MAC_OS_X_VERSION_10_0, * MAC_OS_X_VERSION_10_1, * MAC_OS_X_VERSION_10_2, * MAC_OS_X_VERSION_10_3, * MAC_OS_X_VERSION_10_4, * MAC_OS_X_VERSION_10_5, * MAC_OS_X_VERSION_10_6, * MAC_OS_X_VERSION_10_7, * MAC_OS_X_VERSION_10_8 * MAC_OS_X_VERSION_10_9 *

*/ #define OS_API_VERSION(ADD,REM) \ (!defined(GS_OPENSTEP_V) \ || (GS_OPENSTEP_V>=GS_OSX_ADJUST(ADD) && GS_OPENSTEP_V * eg.
* #if OS_API_VERSION * (GS_API_NONE, GS_API_NONE)
* denotes code not present in OpenStep/OPENSTEP/MacOS-X */ #define GS_API_NONE 0 /** * A constant to represent a feature which is still present in the latest * version. This is the highest possible version number.
* eg.
* #if OS_API_VERSION * (GS_API_MACOSX, GS_API_LATEST)
* denotes code present from the initial MacOS-X version onwards. */ #define GS_API_LATEST 999999 /** * The version number of the initial OpenStep specification.
* eg.
* #if OS_API_VERSION * (GS_API_OSSPEC, GS_API_LATEST)
* denotes code present from the OpenStep specification onwards. */ #define GS_API_OSSPEC 10000 /** * The version number of the first OPENSTEP implementation.
* eg.
* #if OS_API_VERSION * (GS_API_OPENSTEP, GS_API_LATEST)
* denotes code present from the initial OPENSTEP version onwards. */ #define GS_API_OPENSTEP 40000 /** * The version number of the first MacOS-X implementation.
* eg.
* #if OS_API_VERSION * (GS_API_MACOSX, GS_API_LATEST)
* denotes code present from the initial MacOS-X version onwards. */ #define GS_API_MACOSX 100000 /* Allow OSX code comparing MAC_OS_X_VERSION_MAX_ALLOWED with a specific * version to see if that version is allowed, to always have it allowed * on GNUstep. */ #ifndef MAC_OS_X_VERSION_MAX_ALLOWED #define MAC_OS_X_VERSION_MAX_ALLOWED GS_API_LATEST #endif /* MAC_OS_X_VERSION_MAX_ALLOWED */ #if defined(GNUSTEP_BASE_INTERNAL) #include "GNUstepBase/GSConfig.h" #else #include #endif #if defined(__GNUC__) && defined(__GNUC_MINOR__) && !defined(__clang__) # define GS_GCC_MINREQ(maj, min) \ ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min)) #else # define GS_GCC_MINREQ(maj, min) 0 #endif #if defined(__clang__) # define GS_CLANG_MINREQ(maj, min) \ ((__clang_major__ << 16) + __clang_minor__ >= ((maj) << 16) + (min)) #else # define GS_CLANG_MINREQ(maj, min) 0 #endif /* Attribute definitions for attributes which may or may not be supported * depending on the compiler being used. * NB we currently expect gcc to be version 4 or later. * * The definition should be of the form GS_XXX_CONTEXT where XXX is the * name of the attribute and CONTEXT is one of FUNC, METH, or IVAR * depending on where the attribute can be applied. */ #if defined(__clang__) || GS_GCC_MINREQ(3,1) # define GS_DEPRECATED_FUNC __attribute__ ((deprecated)) #else # define GS_DEPRECATED_FUNC #endif #define GS_UNUSED_ARG __attribute__((unused)) #define GS_UNUSED_FUNC __attribute__((unused)) // FIXME ... what version of gcc? #if __clang__ # define GS_UNUSED_IVAR __attribute__((unused)) #else # define GS_UNUSED_IVAR #endif #ifndef __has_feature #define __has_feature(x) 0 #endif /* The following is for deciding whether private instance variables * should be visible ... if we are building with a compiler which * does not define __has_feature then we know we don't have non-fragile * ivar support. * In the header we bracket instance variable declarations in a * '#if GS_EXPOSE(classname) ... #endif' sequence, so that the variables * will not be visible to code which uses the library. * In the source file we define EXPOSE_classname_IVARS to be 1 * before including the header, so that the ivars are always available * in the class source itsself */ #if (__has_feature(objc_nonfragile_abi)) # if !GS_NONFRAGILE # if defined(GNUSTEP_BASE_INTERNAL) # error "You are building gnustep-base using the objc-nonfragile-abi but your gnustep-base was not configured to use it." # endif # endif #else # if GS_NONFRAGILE # error "Your gnustep-base was configured for the objc-nonfragile-abi but you are not using it now." # endif #endif #define GS_EXPOSE(X) (!GS_NONFRAGILE || defined(EXPOSE_##X##_IVARS)) /* Static analyser macros: Provide annotations to help the analyser */ #ifdef __clang__ # define GS_NORETURN_METHOD __attribute__((__noreturn__)) #else # define GS_NORETURN_METHOD #endif #ifndef NS_RETURNS_RETAINED # if __has_feature(attribute_ns_returns_retained) # define NS_RETURNS_RETAINED __attribute__((ns_returns_retained)) # else # define NS_RETURNS_RETAINED # endif #endif #ifndef NS_RETURNS_NOT_RETAINED # if __has_feature(attribute_ns_returns_not_retained) # define NS_RETURNS_NOT_RETAINED __attribute__((ns_returns_not_retained)) # else # define NS_RETURNS_NOT_RETAINED # endif #endif #ifndef NS_CONSUMED # if __has_feature(attribute_ns_consumed) # define NS_CONSUMED __attribute__((ns_consumed)) # else # define NS_CONSUMED # endif #endif #ifndef NS_CONSUMES_SELF # if __has_feature(attribute_ns_consumes_self) # define NS_CONSUMES_SELF __attribute__((ns_consumes_self)) # else # define NS_CONSUMES_SELF # endif #endif #if defined(__clang__) && defined(__OBJC__) static inline void gs_consumed(id NS_CONSUMED o) GS_UNUSED_FUNC; static inline void gs_consumed(id NS_CONSUMED GS_UNUSED_ARG o) { return; } #define GS_CONSUMED(O) gs_consumed(O); #else #define GS_CONSUMED(O) #endif /* Include the appropriate header for ObjC2 blocks support if it is in use. * * FIXME: "OBJC2RUNTIME" is set to "1" if the runtime supports the ObjC2 * runtime API, which is unrelated to whether the compiler has blocks * support or not. */ #if __has_feature(blocks) # if OBJC2RUNTIME # if defined(__APPLE__) # include # else # include # endif # else # include # endif #endif /* Attribute definition for root classes, annotates the interface declaration * of the class. */ #ifndef GS_ROOT_CLASS # if GS_HAVE_OBJC_ROOT_CLASS_ATTR || __has_feature(attribute_objc_root_class) # define GS_ROOT_CLASS __attribute__((objc_root_class)) # else # define GS_ROOT_CLASS # endif #endif #if defined(GNUSTEP_WITH_DLL) #if BUILD_libgnustep_base_DLL # # if defined(__MINGW__) /* On Mingw, the compiler will export all symbols automatically, so * __declspec(dllexport) is not needed. */ # define GS_EXPORT_CLASS # define GS_EXPORT extern # define GS_IMPORT __declspec(dllimport) # define GS_DECLARE # else # define GS_EXPORT_CLASS __declspec(dllexport) # define GS_EXPORT extern __declspec(dllexport) # define GS_IMPORT __declspec(dllimport) # define GS_DECLARE __declspec(dllexport) # endif #else # if defined(__MINGW__) /* MinGW does not need dllimport on ObjC classes and produces warnings. */ # define GS_EXPORT_CLASS # else # define GS_EXPORT_CLASS __declspec(dllimport) # endif # define GS_IMPORT __declspec(dllimport) # define GS_EXPORT extern __declspec(dllimport) # define GS_DECLARE __declspec(dllimport) #endif #else /* GNUSTEP_WITH[OUT]_DLL */ # define GS_EXPORT_CLASS # define GS_EXPORT extern # define GS_IMPORT # define GS_DECLARE #endif /* Attribute macros compatible with Apple. */ #ifndef NS_FORMAT_ARGUMENT #if defined(__clang__) # define NS_FORMAT_ARGUMENT(A) __attribute__((format_arg(A))) #else # define NS_FORMAT_ARGUMENT(A) #endif #endif // FIXME ... what version of gcc? #ifndef NS_FORMAT_FUNCTION #if __clang__ # define NS_FORMAT_FUNCTION(F,A) __attribute__((format(__NSString__, F, A))) #else # define NS_FORMAT_FUNCTION(F,A) #endif #endif #ifndef NS_REQUIRES_NIL_TERMINATION #define NS_REQUIRES_NIL_TERMINATION __attribute__((sentinel)) #endif // FIXME ... what exact version of clang and gcc? #ifndef UNAVAILABLE_ATTRIBUTE #if defined(__clang__) || GS_GCC_MINREQ(4,0) # define UNAVAILABLE_ATTRIBUTE __attribute__((unavailable)) #else # define UNAVAILABLE_ATTRIBUTE #endif #endif /* Check if compiler supports @optional in protocols */ #if defined(__clang__) || GS_GCC_MINREQ(4,6) # define GS_PROTOCOLS_HAVE_OPTIONAL 1 #else # define GS_PROTOCOLS_HAVE_OPTIONAL 0 #endif /* Check if compiler supports declared properties */ #if defined(__clang__) || GS_GCC_MINREQ(4,6) # define GS_HAS_DECLARED_PROPERTIES 1 #else # define GS_HAS_DECLARED_PROPERTIES 0 #endif #endif /* __GNUSTEP_GSVERSIONMACROS_H_INCLUDED_ */ gnustep-base-1.29.0/Headers/GNUstepBase/GSXML.h000066400000000000000000000637601435650067400207640ustar00rootroot00000000000000/** Interface for XML parsing classes Copyright (C) 2000-2005 Free Software Foundation, Inc. Written by: Michael Pakhantsov on behalf of Brainstorm computer solutions. Date: Jule 2000 Integrated by Richard Frith-Macdonald Date: September 2000 GSXPath by Nicola Pero This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. AutogsdocSource: Additions/GSXML.m */ #ifndef __GSXML_h_GNUSTEP_BASE_INCLUDE #define __GSXML_h_GNUSTEP_BASE_INCLUDE #import #if OS_API_VERSION(GS_API_NONE,GS_API_LATEST) #ifndef NeXT_Foundation_LIBRARY #import #import #import #import #else #import #endif #if defined(__cplusplus) extern "C" { #endif @class GSXMLAttribute; @class GSXMLDocument; @class GSXMLNamespace; @class GSXMLNode; @class GSSAXHandler; /** * Convenience methods for managing XML escape sequences in an NSString. */ @interface NSString (GSXML) /** * Deals with standard XML internal entities.
* Converts the five XML special characters in the receiver ('>', '<', * '&', ''' and '"') to their escaped equivalents, and return * the escaped string.
* Also converts non-ascii characters to the corresponding numeric * entity escape sequences.
* You should perform any non-standard entity substitution you require * after you have called this method. */ - (NSString*) stringByEscapingXML; /** * Deals with standard XML internal entities.
* Converts the five XML escape sequences ('&gt;', '&lt;', '&amp;', * '&apos;' and '&quot;') to the unicode characters they represent, * and returns the unescaped string.
* Also converts numeric entity escape sequences to the corresponding unicode * characters.
* You should perform any non-standard entity substitution you require * before you have called this method. */ - (NSString*) stringByUnescapingXML; @end GS_EXPORT_CLASS @interface GSXMLDocument : NSObject { void *lib; // pointer to xmllib pointer of xmlDoc struct BOOL _ownsLib; id _parent; } + (GSXMLDocument*) documentWithVersion: (NSString*)version; - (NSString*) description; - (NSString*) encoding; - (void*) lib; - (GSXMLNode*) makeNodeWithNamespace: (GSXMLNamespace*)ns name: (NSString*)name content: (NSString*)content; - (GSXMLNode*) root; - (GSXMLNode*) setRoot: (GSXMLNode*)node; - (NSString*) version; - (BOOL) writeToFile: (NSString*)filename atomically: (BOOL)useAuxilliaryFile; - (BOOL) writeToURL: (NSURL*)url atomically: (BOOL)useAuxilliaryFile; @end GS_EXPORT_CLASS @interface GSXMLNamespace : NSObject { void *lib; /* pointer to struct xmlNs in the gnome xmllib */ id _parent; } + (NSString*) descriptionFromType: (NSInteger)type; + (NSInteger) typeFromDescription: (NSString*)desc; - (NSString*) href; - (void*) lib; - (GSXMLNamespace*) next; - (NSString*) prefix; - (NSInteger) type; - (NSString*) typeDescription; @end /* XML Node */ GS_EXPORT_CLASS @interface GSXMLNode : NSObject { void *lib; /* pointer to struct xmlNode from libxml */ id _parent; } + (NSString*) descriptionFromType: (NSInteger)type; + (NSInteger) typeFromDescription: (NSString*)desc; - (NSDictionary*) attributes; - (NSString*) content; - (NSString*) description; - (GSXMLDocument*) document; - (NSString*) escapedContent; - (GSXMLAttribute*) firstAttribute; - (GSXMLNode*) firstChild; - (GSXMLNode*) firstChildElement; - (BOOL) isElement; - (BOOL) isText; - (void*) lib; - (GSXMLAttribute*) makeAttributeWithName: (NSString*)name value: (NSString*)value; - (GSXMLNode*) makeChildWithNamespace: (GSXMLNamespace*)ns name: (NSString*)name content: (NSString*)content; - (GSXMLNode*) makeComment: (NSString*)content; - (GSXMLNamespace*) makeNamespaceHref: (NSString*)href prefix: (NSString*)prefix; - (GSXMLNode*) makePI: (NSString*)name content: (NSString*)content; - (GSXMLNode*) makeText: (NSString*)content; - (NSString*) name; - (GSXMLNamespace*) namespace; - (GSXMLNamespace*) namespaceDefinitions; - (GSXMLNode*) next; - (GSXMLNode*) nextElement; - (NSString*) objectForKey: (NSString*)key; - (GSXMLNode*) parent; - (GSXMLNode*) previous; - (GSXMLNode*) previousElement; - (NSMutableDictionary*) propertiesAsDictionaryWithKeyTransformationSel: (SEL)keyTransformSel; - (void) setObject: (NSString*)value forKey:(NSString*)key; - (NSInteger) type; - (NSString*) typeDescription; - (void) setNamespace: (GSXMLNamespace *)space; @end GS_EXPORT_CLASS @interface GSXMLAttribute : GSXMLNode - (NSString*) value; @end GS_EXPORT_CLASS @interface GSXMLParser : NSObject { id src; /* source for parsing */ void *lib; /* parser context */ GSSAXHandler *saxHandler; /* handler for parsing */ NSMutableString *messages; /* append messages here */ } + (NSString*) loadEntity: (NSString*)publicId at: (NSString*)location; + (GSXMLParser*) parser; + (GSXMLParser*) parserWithContentsOfFile: (NSString*)path; + (GSXMLParser*) parserWithContentsOfURL: (NSURL*)url; + (GSXMLParser*) parserWithData: (NSData*)data; + (GSXMLParser*) parserWithSAXHandler: (GSSAXHandler*)handler; + (GSXMLParser*) parserWithSAXHandler: (GSSAXHandler*)handler withContentsOfFile: (NSString*)path; + (GSXMLParser*) parserWithSAXHandler: (GSSAXHandler*)handler withContentsOfURL: (NSURL*)url; + (GSXMLParser*) parserWithSAXHandler: (GSSAXHandler*)handler withData: (NSData*)data; + (void) setDTDs: (NSString*)aPath; + (NSString*) xmlEncodingStringForStringEncoding: (NSStringEncoding)encoding; - (void) abortParsing; - (NSInteger) columnNumber; - (GSXMLDocument*) document; - (BOOL) doValidityChecking: (BOOL)yesno; - (NSInteger) errNo; - (BOOL) getWarnings: (BOOL)yesno; - (id) initWithSAXHandler: (GSSAXHandler*)handler; - (id) initWithSAXHandler: (GSSAXHandler*)handler withContentsOfFile: (NSString*)path; - (id) initWithSAXHandler: (GSSAXHandler*)handler withContentsOfURL: (NSURL*)url; - (id) initWithSAXHandler: (GSSAXHandler*)handler withData: (NSData*)data; - (id) initWithSAXHandler: (GSSAXHandler*)handler withInputStream: (NSInputStream*)stream; - (BOOL) keepBlanks: (BOOL)yesno; - (NSInteger) lineNumber; - (NSString*) messages; - (BOOL) parse; - (BOOL) parse: (NSData*)data; - (NSString*) publicID; - (void) saveMessages: (BOOL)yesno; - (BOOL) resolveEntities: (BOOL)yesno; - (BOOL) substituteEntities: (BOOL)yesno; - (NSString*) systemID; @end GS_EXPORT_CLASS @interface GSHTMLParser : GSXMLParser { } @end GS_EXPORT_CLASS @interface GSSAXHandler : NSObject { void *lib; // xmlSAXHandlerPtr GSXMLParser *parser; @protected BOOL isHtmlHandler; } + (GSSAXHandler*) handler; - (void*) lib; - (GSXMLParser*) parser; /** */ - (void) attribute: (NSString*)name value: (NSString*)value; /** */ - (void) attributeDecl: (NSString*)nameElement name: (NSString*)name type: (NSInteger)type typeDefValue: (NSInteger)defType defaultValue: (NSString*)value; /** */ - (void) characters: (NSString*)name; /** */ - (void) cdataBlock: (NSData*)value; /** */ - (void) comment: (NSString*) value; /** */ - (void) elementDecl: (NSString*)name type: (NSInteger)type; /** */ - (void) endDocument; /** */ - (void) endElement: (NSString*)elementName; /** */ - (void) endElement: (NSString*)elementName prefix: (NSString*)prefix href: (NSString*)href; /** */ - (void) entityDecl: (NSString*)name type: (NSInteger)type public: (NSString*)publicId system: (NSString*)systemId content: (NSString*)content; - (void) error: (NSString*)e; - (void) error: (NSString*)e colNumber: (NSInteger)colNumber lineNumber: (NSInteger)lineNumber; - (BOOL) externalSubset: (NSString*)name externalID: (NSString*)externalID systemID: (NSString*)systemID; - (void) fatalError: (NSString*)e; - (void) fatalError: (NSString*)e colNumber: (NSInteger)colNumber lineNumber: (NSInteger)lineNumber; - (void*) getEntity: (NSString*)name; - (void*) getParameterEntity: (NSString*)name; /** */ - (void) globalNamespace: (NSString*)name href: (NSString*)href prefix: (NSString*)prefix; - (NSInteger) hasExternalSubset; - (NSInteger) hasInternalSubset; /** */ - (void) ignoreWhitespace: (NSString*)ch; - (BOOL) internalSubset: (NSString*)name externalID: (NSString*)externalID systemID: (NSString*)systemID; - (NSInteger) isStandalone; - (NSString*) loadEntity: (NSString*)publicId at: (NSString*)location; /** */ - (void) namespaceDecl: (NSString*)name href: (NSString*)href prefix: (NSString*)prefix; /** */ - (void) notationDecl: (NSString*)name public: (NSString*)publicId system: (NSString*)systemId; /** */ - (void) processInstruction: (NSString*)targetName data: (NSString*)PIdata; /** */ - (void) reference: (NSString*)name; /** */ - (void) startDocument; /** */ - (void) startElement: (NSString*)elementName attributes: (NSMutableDictionary*)elementAttributes; /** */ - (void) startElement: (NSString*)elementName prefix: (NSString*)prefix href: (NSString*)href attributes: (NSMutableDictionary*)elementAttributes namespaces: (NSMutableDictionary*)elementNamespaces; /** */ - (void) unparsedEntityDecl: (NSString*)name public: (NSString*)publicId system: (NSString*)systemId notationName: (NSString*)notation; - (void) warning: (NSString*)e; - (void) warning: (NSString*)e colNumber: (NSInteger)colNumber lineNumber: (NSInteger)lineNumber; @end GS_EXPORT_CLASS @interface GSTreeSAXHandler : GSSAXHandler @end GS_EXPORT_CLASS @interface GSHTMLSAXHandler : GSSAXHandler @end @class GSXPathObject; /* * Using this library class is trivial. Get your GSXMLDocument. Create * a GSXPathContext for it. * * GSXPathContext *p = [[GSXPathContext alloc] initWithDocument: document]; * * Then, you can use it to evaluate XPath expressions: * * GSXPathString *result = [p evaluateExpression: @"string(/body/text())"]; * NSLog (@"Got %@", [result stringValue]); * * If the XML document contains namespaces, you first need to register them * with the parser by using registerNamespaceWithPrefix:href:, as in: * * GSXPathContext *p = [[GSXPathContext alloc] initWithDocument: document]; * if ([p registerNamespaceWithPrefix: @"a" href="http://www.gnustep.org/demo"] == NO) * { * // Error registering namespace, do something about it. * } * * and then you can use the namespace prefix in your expressions, as in * * GSXPathString *result = [p evaluateExpression: @"string(/a:body/text())"]; * NSLog (@"Got %@", [result stringValue]); * */ GS_EXPORT_CLASS @interface GSXPathContext : NSObject { void *_lib; // xmlXPathContext GSXMLDocument *_document; } - (id) initWithDocument: (GSXMLDocument*)d; - (GSXPathObject*) evaluateExpression: (NSString*)XPathExpression; /* * Registers a new namespace. Return YES if succesful, NO if not. */ - (BOOL) registerNamespaceWithPrefix: (NSString *)prefix href: (NSString *)href; @end /** XPath queries return a GSXPathObject. GSXPathObject in itself is * an abstract class; there are four types of completely different * GSXPathObject types, listed below. I'm afraid you need to check * the returned type of each GSXPath query to make sure it's what you * meant it to be. */ GS_EXPORT_CLASS @interface GSXPathObject : NSObject { void *_lib; // xmlXPathObject GSXPathContext *_context; } @end /** * For XPath queries returning true/false. */ GS_EXPORT_CLASS @interface GSXPathBoolean : GSXPathObject - (BOOL) booleanValue; @end /** * For XPath queries returning a number. */ GS_EXPORT_CLASS @interface GSXPathNumber : GSXPathObject - (double) doubleValue; @end /** * For XPath queries returning a string. */ GS_EXPORT_CLASS @interface GSXPathString : GSXPathObject - (NSString *) stringValue; @end /** * For XPath queries returning a node set. */ GS_EXPORT_CLASS @interface GSXPathNodeSet : GSXPathObject - (NSUInteger) count; - (NSUInteger) length; /** Please note that index starts from 0. */ - (GSXMLNode *) nodeAtIndex: (NSUInteger)index; @end @interface GSXMLDocument (XSLT) + (GSXMLDocument*) xsltTransformFile: (NSString*)xmlFile stylesheet: (NSString*)xsltStylesheet params: (NSDictionary*)params; + (GSXMLDocument*) xsltTransformFile: (NSString*)xmlFile stylesheet: (NSString*)xsltStylesheet; + (GSXMLDocument*) xsltTransformXml: (NSData*)xmlData stylesheet: (NSData*)xsltStylesheet params: (NSDictionary*)params; + (GSXMLDocument*) xsltTransformXml: (NSData*)xmlData stylesheet: (NSData*)xsltStylesheet; - (GSXMLDocument*) xsltTransform: (GSXMLDocument*)xsltStylesheet params: (NSDictionary*)params; - (GSXMLDocument*) xsltTransform: (GSXMLDocument*)xsltStylesheet; @end #import #import @class NSArray; @class NSDictionary; @class NSTimer; @class GSXMLNode; @class GSXMLRPC; /** *

The GSXMLRPC class provides methods for constructing and parsing * XMLRPC method call and response documents ... so that calls may * be constructed of standard objects. *

*

The correspondence between XMLRPC values and Objective-C objects * is as follows - *

* * i4 (or int) is an [NSNumber] other * than a real/float or boolean. * boolean is an [NSNumber] created as a BOOL. * string is an [NSString] object. * double is an [NSNumber] created as a float or * double. * dateTime.iso8601 is an [NSDate] object. * base64 is an [NSData] object. * array is an [NSArray] object. * struct is an [NSDictionary] object. * *

If you attempt to use any other type of object in the construction * of an XMLRPC document, the [NSObject-description] method of that * object will be used to create a striong, and the resulting object * will be encoded as an XMLRPC string element. *

*

In particular, the names of members in a struct must be strings, * so if you provide an [NSDictionary] object to represent a struct * the keys of the dictionary will be converted to strings if necessary. *

*

The class also provides a method for making a synchronous XMLRPC * method call (with timeout), or an asynchronous call in which the * call completion is handled by a delegate. *

*

You may also use the class to implement an XMLRPC server, by calling * the -parseMethod:params: method to parse the data POSTed to your server, * and -buildResponseWithParams: (or -buildResponseWithFaultCode:andString:) * to produce the data to be sent back to the client. *

*

In order to simply make a synchronous XMLRPC call to a server, all * you need to do is write code like: *

* * GSXMLRPC *server = [[GSXMLRPC alloc] initWithURL: @"http://server/path"]; * id result = [server makeMethodCall: name params: p timeout: 30]; * *

Saying that you want to call the specified method ('name') on the server, * passing the parameters ('p') and with a 30 second timeout.
* If there is a network or http-level error or a timeout, the result will be * an error string, otherwise it will be an array (on success) or a dictionary * containing the fault details. *

*/ GS_EXPORT_CLASS @interface GSXMLRPC : NSObject { @private #if defined(GNUSTEP) NSURLHandle *handle; NSString *connectionURL GS_UNUSED_IVAR; NSURLConnection *connection GS_UNUSED_IVAR; NSMutableData *response GS_UNUSED_IVAR; #else id handle GS_UNUSED_IVAR; NSString *connectionURL; NSURLConnection *connection; NSMutableData *response; #endif NSTimer *timer; id result; id delegate; // Not retained. NSTimeZone *tz; BOOL compact; } /** * Given a method name and an array of parameters, this method constructs * the XML document for the corresponding XMLRPC call and returns the * document as an NSData object containing UTF-8 text.
* The params array may be empty or nil if there are no parameters to be * passed.
* The method returns nil if passed an invalid method name (a method name * may contain any of the ascii alphanumeric characters and underscore, * fullstop, colon, or slash).
* This method is used internally when sending an XMLRPC method call to * a remote system, but you can also call it yourself. */ - (NSData*) buildMethod: (NSString*)method params: (NSArray*)params; /** * Given a method name and an array of parameters, this method constructs * the XML document for the corresponding XMLRPC call and returns the * document as a string.
* The params array may be empty or nil if there are no parameters to be * passed.
* The method returns nil if passed an invalid method name (a method name * may contain any of the ascii alphanumeric characters and underscore, * fullstop, colon, or slash).
*/ - (NSString*) buildMethodCall: (NSString*)method params: (NSArray*)params; /** * Constructs an XML document for an XMLRPC fault response with the * specified code and string. The resulting document is returned * as a string.
* This method is intended for use by applications acting as XMLRPC servers. */ - (NSString*) buildResponseWithFaultCode: (NSInteger)code andString: (NSString*)s; /** * Builds an XMLRPC response with the specified array of parameters and * returns the document as a string.
* The params array may be empty or nil if there are no parameters to be * returned (an empty params element will be created).
* This method is intended for use by applications acting as XMLRPC servers. */ - (NSString*) buildResponseWithParams: (NSArray*)params; /** * Return the value set by a prior call to -setCompact: (or NO ... the default). */ - (BOOL) compact; /** * Returns the delegate previously set by the -setDelegate: method.
* The delegate handles completion of asynchronous method calls to the * URL specified when the receiver was initialised (if any). */ - (id) delegate; /** * Initialise the receiver to make XMLRPC calls to the specified URL.
* This method just calls -initWithURL:certificate:privateKey:password: * with nil arguments for the SSL credentials. */ - (id) initWithURL: (NSString*)url; /** * Initialise the receiver to make XMLRPC calls to the specified url * and (optionally) with the specified SSL parameters.
* The url argument may be nil, in which case the receiver will be * unable to make XMLRPC calls, but can be used to parse incoming * requests and build responses.
* If the SSL credentials are non-nil, connections to the remote server * will be authenticated using the supplied certificate so that the * remote system knows who is contacting it. */ - (id) initWithURL: (NSString*)url certificate: (NSString*)cert privateKey: (NSString*)pKey password: (NSString*)pwd; /** * Calls -sendMethodCall:params:timeout: and waits for the response.
* Returns the response parameters (an array), * the response fault (a dictionary), * or a failure reason (a string). */ - (id) makeMethodCall: (NSString*)method params: (NSArray*)params timeout: (NSInteger)seconds; /** * Parses XML data containing an XMLRPC method call.
* Returns the name of the method call.
* Empties, and then places the method parameters (if any) * in the params argument.
* NB. Any containers (arrays or dictionaries) in the parsed parameters * will be mutable, so you can modify this data structure as you like.
* Raises an exception if parsing fails.
* This method is intended for the use of XMLRPC server applications. */ - (NSString*) parseMethod: (NSData*)request params: (NSMutableArray*)params; /** * Parses XML data containing an XMLRPC method response.
* Returns nil for success, the fault dictionary on failure.
* Places the response parameters (if any) in the params argument.
* NB. Any containers (arrays or dictionaries) in the parsed parameters * will be mutable, so you can modify this data structure as you like.
* Raises an exception if parsing fails.
* Used internally when making a method call to a remote server. */ - (NSDictionary*) parseResponse: (NSData*)resp params: (NSMutableArray*)params; /** * Returns the result of the last method call, or nil if there has been * no method call or one is in progress.
* The result may be one of - * * A mutable array ... the parameters of a success response. * A dictionary ... containing a fault response. * A string ... describing a low-level failure (eg. timeout). * * NB. Any containers (arrays or dictionaries) in the parsed parameters * of a success response will be mutable, so you can modify this data * structure as you like. */ - (id) result; /** * Send an asynchronous XMLRPC method call with the specified timeout.
* A delegate should have been set to handle the result of this call, * but if one was not set the state of the asynchronous call may be polled * by calling the -result method, which will return nil as long as the * call has not completed.
* The call may be cancelled by calling the -timeout: method
* This method returns YES if the call was started, * NO if it could not be started * (eg because another call is in progress or because of bad arguments).
* NB. For the asynchronous operation to proceed, the current [NSRunLoop] * must be run. */ - (BOOL) sendMethodCall: (NSString*)method params: (NSArray*)params timeout: (NSInteger)seconds; /** * Specify whether to generate compact XML (omit indentation and other white * space and omit <string> element markup).
* Compact representation saves some space (can be important when sent over * slow/low bandwidth connections), but sacrifices readability. */ - (void) setCompact: (BOOL)flag; /** * Specify whether to perform debug trace on I/O
* Return the previous value */ - (int) setDebug: (int)flag; /** * Sets the delegate object which will receive callbacks when an XMLRPC * call completes.
* NB. this delegate is not retained, and should be removed * before it is deallocated (call -setDelegate: again with a nil argument * to remove the delegate). */ - (void) setDelegate: (id)aDelegate; /** * Sets the time zone for use when sending/receiving date/time values.
* The XMLRPC specification says that timezone is server dependent so you * will need to set it according to the server you are connecting to.
* If this is not set, UCT is assumed. */ - (void) setTimeZone: (NSTimeZone*)timeZone; /** * Handles timeouts, passing information to delegate ... you don't need to * call this method, but you may call it in order to cancel an * asynchronous request as if it had timed out. */ - (void) timeout: (NSTimer*)t; /** * Return the time zone currently set. */ - (NSTimeZone*) timeZone; #ifdef GNUSTEP /** * Allows GSXMLRPC to act as a client of NSURLHandle. Internal use only. */ - (void) URLHandle: (NSURLHandle*)sender resourceDataDidBecomeAvailable: (NSData*)newData; /** * Allows GSXMLRPC to act as a client of NSURLHandle. Internal use only. */ - (void) URLHandle: (NSURLHandle*)sender resourceDidFailLoadingWithReason: (NSString*)reason; /** * Allows GSXMLRPC to act as a client of NSURLHandle. Internal use only. */ - (void) URLHandleResourceDidBeginLoading: (NSURLHandle*)sender; /** * Allows GSXMLRPC to act as a client of NSURLHandle. Internal use only. */ - (void) URLHandleResourceDidCancelLoading: (NSURLHandle*)sender; /** * Allows GSXMLRPC to act as a client of NSURLHandle. Internal use only. */ - (void) URLHandleResourceDidFinishLoading: (NSURLHandle*)sender; #endif @end /** * Delegates should implement this method in order to be informed of * the success or failure of an XMLRPC method call which was initiated * by the -sendMethodCall:params:timeout: method.
*/ @interface GSXMLRPC (Delegate) /** * Called by the sender when an XMLRPC method call completes (either success * or failure). * The delegate may then call the -result method to retrieve the result of * the method call from the sender. */ - (void) completedXMLRPC: (GSXMLRPC*)sender; @end #if defined(__cplusplus) } #endif #endif /* OS_API_VERSION(GS_API_NONE,GS_API_NONE) */ #endif /* __GSXML_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Headers/GNUstepBase/NSArray+GNUstepBase.h000066400000000000000000000050771435650067400235220ustar00rootroot00000000000000/** Declaration of extension methods for base additions Copyright (C) 2003-2010 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald and: Adam Fedor This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #ifndef INCLUDED_NSArray_GNUstepBase_h #define INCLUDED_NSArray_GNUstepBase_h #import #import #if defined(__cplusplus) extern "C" { #endif #if OS_API_VERSION(GS_API_NONE,GS_API_LATEST) @interface NSArray (GNUstepBase) /**

Method for working with sorted arrays - use a binary chop * to determine the insertion location for an object. If equal objects * already exist in the array, they will be located immediately before * the insertion position. *

*

The comparator function takes two items as arguments, the first is the * item to be added, the second is the item already in the array. * The function should return NSOrderedAscending if the item to be * added is 'less than' the item in the array, NSOrderedDescending * if it is greater, and NSOrderedSame if it is equal. *

*/ - (NSUInteger) insertionPosition: (id)item usingFunction: (NSComparisonResult (*)(id, id, void *))sorter context: (void *)context; /*

Method for working with sorted arrays - use a binary chop * to determine the insertion location for an object. If equal objects * already exist in the array, they will be located immediately before * the insertion position. *

*

The selector identifies a method returning NSOrderedAscending if * the receiver is 'less than' the argument, and NSOrderedDescending if * it is greate. *

*/ - (NSUInteger) insertionPosition: (id)item usingSelector: (SEL)comp; @end #endif /* OS_API_VERSION */ #if defined(__cplusplus) } #endif #endif /* INCLUDED_NSArray_GNUstepBase_h */ gnustep-base-1.29.0/Headers/GNUstepBase/NSAttributedString+GNUstepBase.h000066400000000000000000000031321435650067400257300ustar00rootroot00000000000000/** Declaration of extension methods for base additions Copyright (C) 2003-2010 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald and: Adam Fedor This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #ifndef INCLUDED_NSAttributedString_GNUstepBase_h #define INCLUDED_NSAttributedString_GNUstepBase_h #import #import #if defined(__cplusplus) extern "C" { #endif #if OS_API_VERSION(GS_API_NONE,GS_API_LATEST) @interface NSAttributedString (GNUstepBase) /** * Deprecated synonym for attributedSubstringFromRange: * for consistency with NSString */ - (NSAttributedString*) attributedSubstringWithRange: (NSRange)aRange; @end #endif /* OS_API_VERSION */ #if defined(__cplusplus) } #endif #endif /* INCLUDED_NSAttributedString_GNUstepBase_h */ gnustep-base-1.29.0/Headers/GNUstepBase/NSBundle+GNUstepBase.h000066400000000000000000000030501435650067400236420ustar00rootroot00000000000000/** Declaration of extension methods for base additions Copyright (C) 2003-2010 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald and: Adam Fedor This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #ifndef INCLUDED_NSBundle_GNUstepBase_h #define INCLUDED_NSBundle_GNUstepBase_h #import #import #if defined(__cplusplus) extern "C" { #endif #if OS_API_VERSION(GS_API_NONE,GS_API_LATEST) @interface NSBundle(GNUstepBase) + (NSString *) pathForLibraryResource: (NSString *)name ofType: (NSString *)ext inDirectory: (NSString *)bundlePath; @end #endif /* OS_API_VERSION */ #if defined(__cplusplus) } #endif #endif /* INCLUDED_NSBundle_GNUstepBase_h */ gnustep-base-1.29.0/Headers/GNUstepBase/NSCalendarDate+GNUstepBase.h000066400000000000000000000045011435650067400247420ustar00rootroot00000000000000 /** Declaration of extension methods for base additions Copyright (C) 2003-2010 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald and: Adam Fedor This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #ifndef INCLUDED_NSCalendarDate_GNUstepBase_h #define INCLUDED_NSCalendarDate_GNUstepBase_h #import #import #if defined(__cplusplus) extern "C" { #endif #if OS_API_VERSION(GS_API_NONE,GS_API_LATEST) @interface NSCalendarDate (GNUstepBase) /** According to the ISO definition of a week, each year begins with the * Monday of the week containing the 4th of January. If we a have a date * early in January or late in December we therefore may need to adjust * the year to match the definition of a week.
* This method is used to return the ISO year rather than the normal * calendar year. */ - (NSUInteger) isoYear; /** * The ISO standard week of the year is based on the first week of the * year being that week (starting on monday) for which the thursday * is on or after the first of january.
* This has the effect that, if january first is a friday, saturday or * sunday, the days of that week (up to and including the sunday) are * considered to be in week 53 of the preceding year. Similarly if the * last day of the year is a monday tuesday or wednesday, these days are * part of week 1 of the next year. */ - (NSInteger) weekOfYear; @end #endif /* OS_API_VERSION */ #if defined(__cplusplus) } #endif #endif /* INCLUDED_NSCalendarDate_GNUstepBase_h */ gnustep-base-1.29.0/Headers/GNUstepBase/NSData+GNUstepBase.h000066400000000000000000000133131435650067400233050ustar00rootroot00000000000000/** Declaration of extension methods for base additions Copyright (C) 2003-2010 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald and: Adam Fedor This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #ifndef INCLUDED_NSData_GNUstepBase_h #define INCLUDED_NSData_GNUstepBase_h #import #import #if defined(__cplusplus) extern "C" { #endif #if OS_API_VERSION(GS_API_NONE,GS_API_LATEST) @interface NSData (GNUstepBase) /** Returns an autoreleased data instance initialised with pseudo-random * bytes of the specified length.
* On failure returns nil. This may be due to:
* A zero length or unreasonably large length argument or,
* Failure to allocate memory to hold the random data or,
* Failure of the underlying random data generation. */ + (id) dataWithRandomBytesOfLength: (NSUInteger)length; /** Returns an NSString object containing a backslash escaped representation * of the receiver. */ - (NSString*) escapedRepresentation; /** * Returns a buffer containing an ASCII backslash escaped representation * of the receiver, (and optionally the size of the buffer excluding * the trailing nul terminator). */ - (char*) escapedRepresentation: (NSUInteger*)length; /** Returns data formed by gunzipping the contents of the receiver.
* If the receiver did not contain data produced by gzip, this method * simply returns the receiver.
* If the gnuzipping failed, this method returns nil.
* Otherwise, the returned object is an autorelease mutable data object. */ - (NSData*) gunzipped; /** Returns data formed by gzipping the contents of the receiver using * the specified compression level (from 0 to 9 with 0 meaning no compression * and 9 meaning maximum compression). Use a value outside the 0 to 9 * range (eg -1) to employ the default compression.
* NB. It is permissable to gzip an empty data object, and it is also * permissable to gzip a data object which already contains gzipped data.
* Returns nil on failure. */ - (NSData*) gzipped: (int)level; /** Returns YES if the receiver is a non-empty data object with a gzip * header, NO otherwise. */ - (BOOL) isGzipped; /** Returns an NSString object containing an ASCII hexadecimal representation * of the receiver. This means that the returned object will contain * exactly twice as many characters as there are bytes as the receiver, * as each byte in the receiver is represented by two hexadecimal digits.
* The high order four bits of each byte is encoded before the low * order four bits. Capital letters 'A' to 'F' are used to represent * values from 10 to 15. */ - (NSString*) hexadecimalRepresentation; /** Returns a buffer containing an ASCII string with a nul terminated * hexadecimal representation of the receiver, (and optionally the size * of the buffer excluding the trailing nul terminator). */ - (char*) hexadecimalRepresentation: (NSUInteger*)length; /** * Initialises the receiver with the supplied string data which contains * a hexadecimal coding of the bytes. The parsing of the string is * fairly tolerant, ignoring whitespace and permitting both upper and * lower case hexadecimal digits (the -hexadecimalRepresentation method * produces a string using only uppercase digits with no white space).
* If the string does not contain one or more pairs of hexadecimal digits * then an exception is raised. */ - (id) initWithHexadecimalRepresentation: (NSString*)string NS_CONSUMES_SELF NS_RETURNS_RETAINED; /** * Creates an MD5 digest of the information stored in the receiver and * returns it as an autoreleased 16 byte NSData object.
* If you need to produce a digest of string information, you need to * decide what character encoding is to be used and convert your string * to a data object of that encoding type first using the * [NSString-dataUsingEncoding:] method - * * myDigest = [[myString dataUsingEncoding: NSUTF8StringEncoding] md5Digest]; * * If you need to use the digest in a human readable form, you will * probably want it to be seen as 32 hexadecimal digits, and can do that * using the -hexadecimalRepresentation method. */ - (NSData*) md5Digest; /** * Decodes the source data from uuencoded and return the result.
* Returns the encoded file name in namePtr if it is not null. * Returns the encoded file mode in modePtr if it is not null. */ - (BOOL) uudecodeInto: (NSMutableData*)decoded name: (NSString**)namePtr mode: (NSInteger*)modePtr; /** * Encode the source data to uuencoded.
* Uses the supplied name as the filename in the encoded data, * and says that the file mode is as specified.
* If no name is supplied, uses untitled as the name. */ - (BOOL) uuencodeInto: (NSMutableData*)encoded name: (NSString*)name mode: (NSInteger)mode; @end #endif /* OS_API_VERSION */ #if defined(__cplusplus) } #endif #endif /* INCLUDED_NSData_GNUstepBase_h */ gnustep-base-1.29.0/Headers/GNUstepBase/NSDebug+GNUstepBase.h000066400000000000000000000303201435650067400234570ustar00rootroot00000000000000/** Declaration of extension methods for base additions Copyright (C) 2003-2010 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald and: Adam Fedor This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #ifndef INCLUDED_NSDebug_GNUstepBase_h #define INCLUDED_NSDebug_GNUstepBase_h #import #if defined(GNUSTEP_BASE_INTERNAL) # import "Foundation/NSDebug.h" # import "Foundation/NSProcessInfo.h" #else # import # import #endif #if defined(__cplusplus) extern "C" { #endif #if OS_API_VERSION(GS_API_NONE,GS_API_LATEST) GS_EXPORT BOOL GSDebugSet(NSString *level); /** * Used to produce a format string for logging a message with function * location details. */ GS_EXPORT NSString* GSDebugFunctionMsg(const char *func, const char *file, int line, NSString *fmt); /** * Used to produce a format string for logging a message with method * location details. */ GS_EXPORT NSString* GSDebugMethodMsg(id obj, SEL sel, const char *file, int line, NSString *fmt); #ifdef GSDIAGNOSE /**

NSDebugLLog() is the basic debug logging macro used to display log messages using NSLog(), if debug logging was enabled at compile time and the appropriate logging key was set at runtime.

Debug logging which can be enabled/disabled by defining GSDIAGNOSE when compiling and also setting values in the mutable set which is set up by NSProcessInfo. GSDIAGNOSE is defined automatically unless diagnose=no is specified in the make arguments.

NSProcess initialises a set of strings that are the names of active debug keys using the '--GNU-Debug=...' command line argument. Each command-line argument of that form is removed from NSProcessInfo's list of arguments and the variable part (...) is added to the set. This means that as far as the program proper is concerned, it is running with the same arguments as if debugging had not been enabled.

For instance, to debug the NSBundle class, run your program with '--GNU-Debug=NSBundle' You can of course supply multiple '--GNU-Debug=...' arguments to output debug information on more than one thing.

NSUserDefaults also adds debug keys from the array given by the GNU-Debug default ... but these values will not take effect until the +standardUserDefaults method is called ... so they are useless for debugging NSUserDefaults itself or for debugging any code executed before the defaults system is used.

To embed debug logging in your code you use the NSDebugLLog() or NSDebugLog() macro. NSDebugLog() is just NSDebugLLog() with the debug key set to 'dflt'. So, to activate debug statements that use NSDebugLog(), you supply the '--GNU-Debug=dflt' argument to your program.

You can also change the active debug keys under your programs control - NSProcessInfo has a [-debugSet] method that returns the mutable set that contains the active debug keys - your program can modify this set.

Two debug keys have a special effect - 'dflt' is the key used for debug logs statements where no debug key is specified, and 'NoWarn' is used to *disable* warning messages.

As a convenience, there are four more logging macros you can use - NSDebugFLog(), NSDebugFLLog(), NSDebugMLog() and NSDebugMLLog(). These are the same as the other macros, but are specifically for use in either functions or methods and prepend information about the file, line and either function or class/method in which the message was generated.

*/ #define NSDebugLLog(key, format, args...) \ do { if (GSDebugSet(key) == YES) \ NSLog(format , ## args); } while (0) /** * This macro is a shorthand for NSDebugLLog() using the default debug * key ... 'dflt' */ #define NSDebugLog(format, args...) \ do { if (GSDebugSet(@"dflt") == YES) \ NSLog(format , ## args); } while (0) /** * This macro is like NSDebugLLog() but includes the name and location * of the function in which the macro is used as part of the log output. */ #define NSDebugFLLog(key, format, args...) \ do { if (GSDebugSet(key) == YES) { \ NSString *s = GSDebugFunctionMsg( \ __PRETTY_FUNCTION__, __FILE__, __LINE__, \ [NSString stringWithFormat: format, ##args]); \ NSLog(@"%@", s); }} while (0) /** * This macro is a shorthand for NSDebugFLLog() using the default debug * key ... 'dflt' */ #define NSDebugFLog(format, args...) \ do { if (GSDebugSet(@"dflt") == YES) { \ NSString *s = GSDebugFunctionMsg( \ __PRETTY_FUNCTION__, __FILE__, __LINE__, \ [NSString stringWithFormat: format, ##args]); \ NSLog(@"%@", s); }} while (0) /** * This macro is like NSDebugLLog() but includes the name and location * of the method in which the macro is used as part of the log output. */ #define NSDebugMLLog(key, format, args...) \ do { if (GSDebugSet(key) == YES) { \ NSString *s = GSDebugMethodMsg( \ self, _cmd, __FILE__, __LINE__, \ [NSString stringWithFormat: format, ##args]); \ NSLog(@"%@", s); }} while (0) /** * This macro is a shorthand for NSDebugMLLog() using then default debug * key ... 'dflt' */ #define NSDebugMLog(format, args...) \ do { if (GSDebugSet(@"dflt") == YES) { \ NSString *s = GSDebugMethodMsg( \ self, _cmd, __FILE__, __LINE__, \ [NSString stringWithFormat: format, ##args]); \ NSLog(@"%@", s); }} while (0) /** * This macro saves the name and location of the function in * which the macro is used, along with a short string msg as * the tag associated with a recorded object. */ #define NSDebugFRLog(object, msg) \ do { \ NSString *tag = GSDebugFunctionMsg( \ __PRETTY_FUNCTION__, __FILE__, __LINE__, msg); \ GSDebugAllocationTagRecordedObject(object, tag); } while (0) /** * This macro saves the name and location of the method in * which the macro is used, along with a short string msg as * the tag associated with a recorded object. */ #define NSDebugMRLog(object, msg) \ do { \ NSString *tag = GSDebugMethodMsg( \ self, _cmd, __FILE__, __LINE__, msg); \ GSDebugAllocationTagRecordedObject(object, tag); } while (0) #else #define NSDebugLLog(key, format, args...) #define NSDebugLog(format, args...) #define NSDebugFLLog(key, format, args...) #define NSDebugFLog(format, args...) #define NSDebugMLLog(key, format, args...) #define NSDebugMLog(format, args...) #define NSDebugFRLog(object, msg) #define NSDebugMRLog(object, msg) #endif /** * Macro to log a message only the first time it is encountered.
* Not entirely thread safe ... but that's not really important, * it just means that it's possible for the message to be logged * more than once if two threads call it simultaneously when it * has not already been called.
* Use this from inside a function. Pass an NSString as a format, * followed by zero or more arguments for the format string. * Example: GSOnceFLog(@"This function is deprecated, use another"); */ #define GSOnceFLog(format, args...) \ do { static BOOL beenHere = NO; if (beenHere == NO) {\ NSString *s = GSDebugFunctionMsg( \ __PRETTY_FUNCTION__, __FILE__, __LINE__, \ [NSString stringWithFormat: format, ##args]); \ beenHere = YES; \ NSLog(@"%@", s); }} while (0) /** * Macro to log a message only the first time it is encountered.
* Not entirely thread safe ... but that's not really important, * it just means that it's possible for the message to be logged * more than once if two threads call it simultaneously when it * has not already been called.
* Use this from inside a method. Pass an NSString as a format * followed by zero or more arguments for the format string.
* Example: GSOnceMLog(@"This method is deprecated, use another"); */ #define GSOnceMLog(format, args...) \ do { static BOOL beenHere = NO; if (beenHere == NO) {\ NSString *s = GSDebugFunctionMsg( \ __PRETTY_FUNCTION__, __FILE__, __LINE__, \ [NSString stringWithFormat: format, ##args]); \ beenHere = YES; \ NSLog(@"%@", s); }} while (0) #ifdef GSWARN /**

NSWarnLog() is the basic debug logging macro used to display warning messages using NSLog(), if warn logging was not disabled at compile time and the disabling logging level was not set at runtime.

Warning messages which can be enabled/disabled by defining GSWARN when compiling.

You can also disable these messages at runtime by supplying a '--GNU-Debug=NoWarn' argument to the program, or by adding 'NoWarn' to the user default array named 'GNU-Debug'.

These logging macros are intended to be used when the software detects something that it not necessarily fatal or illegal, but looks like it might be a programming error. eg. attempting to remove 'nil' from an NSArray, which the Spec/documentation does not prohibit, but which a well written program should not be attempting (since an NSArray object cannot contain a 'nil').

NB. The 'warn=yes' option is understood by the GNUstep make package to mean that GSWARN should be defined, and the 'warn=no' means that GSWARN should be undefined. Default is to define it.

To embed debug logging in your code you use the NSWarnLog() macro.

As a convenience, there are two more logging macros you can use - NSWarnFLog(), and NSWarnMLog(). These are specifically for use in either functions or methods and prepend information about the file, line and either function or class/method in which the message was generated.

*/ #define NSWarnLog(format, args...) \ do { if (GSDebugSet(@"NoWarn") == NO) { \ NSLog(format , ## args); }} while (0) /** * This macro is like NSWarnLog() but includes the name and location of the * function in which the macro is used as part of the log output. */ #define NSWarnFLog(format, args...) \ do { if (GSDebugSet(@"NoWarn") == NO) { \ NSString *s = GSDebugFunctionMsg( \ __PRETTY_FUNCTION__, __FILE__, __LINE__, \ [NSString stringWithFormat: format, ##args]); \ NSLog(@"%@", s); }} while (0) /** * This macro is like NSWarnLog() but includes the name and location of the * method in which the macro is used as part of the log output. */ #define NSWarnMLog(format, args...) \ do { if (GSDebugSet(@"NoWarn") == NO) { \ NSString *s = GSDebugFunctionMsg( \ __PRETTY_FUNCTION__, __FILE__, __LINE__, \ [NSString stringWithFormat: format, ##args]); \ NSLog(@"%@", s); }} while (0) #else #define NSWarnLog(format, args...) #define NSWarnFLog(format, args...) #define NSWarnMLog(format, args...) #endif /** The DLog macro is a less powerful but commonly used logging macro, * defined here for convenience when porting code. It will tell you * the function name and line number but not the file location. * It performs unconditional logging but is only compiled in when the * program is built with DEBUG defined. */ #if !defined(DLog) #ifdef DEBUG #define DLog(fmt, ...) \ NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__) #else #define DLog(...) #endif #endif /** The Alog macro is the same as the DLog macro, but is always compiled * in to the code whether DEBUG is defined or not. */ #if !defined(ALog) #define ALog(fmt, ...) \ NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__) #endif #endif /* OS_API_VERSION */ #if defined(__cplusplus) } #endif #endif /* INCLUDED_NSDebug_GNUstepBase_h */ gnustep-base-1.29.0/Headers/GNUstepBase/NSFileHandle+GNUstepBase.h000066400000000000000000000031221435650067400244240ustar00rootroot00000000000000/** Declaration of extension methods for base additions Copyright (C) 2003-2010 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald and: Adam Fedor This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #ifndef INCLUDED_NSFileHandle_GNUstepBase_h #define INCLUDED_NSFileHandle_GNUstepBase_h #import #import #if defined(__cplusplus) extern "C" { #endif #if OS_API_VERSION(GS_API_NONE,GS_API_LATEST) @interface NSFileHandle(GNUstepBase) + (id) fileHandleAsServerAtAddress: (NSString*)address service: (NSString*)service protocol: (NSString*)protocol; - (NSString*) socketAddress; @end #endif /* OS_API_VERSION */ #if defined(__cplusplus) } #endif #endif /* INCLUDED_NSFileHandle_GNUstepBase_h */ gnustep-base-1.29.0/Headers/GNUstepBase/NSHashTable+GNUstepBase.h000066400000000000000000000027661435650067400243010ustar00rootroot00000000000000/** Declaration of extension methods for base additions Copyright (C) 2015 Free Software Foundation, Inc. Written by: Niels Grewe This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #ifndef INCLUDED_NSHashTable_GNUstepBase_h #define INCLUDED_NSHashTable_GNUstepBase_h #import #import #if defined(__cplusplus) extern "C" { #endif #if OS_API_VERSION(GS_API_NONE,GS_API_LATEST) @interface NSHashTable (GNUstepBase) /** * Adds each object contained in the given array that is not already * in the hash table. */ - (void)addObjectsFromArray: (NSArray*)array; @end #endif /* OS_API_VERSION */ #if defined(__cplusplus) } #endif #endif /* INCLUDED_NSHashTable_GNUstepBase_h */ gnustep-base-1.29.0/Headers/GNUstepBase/NSLock+GNUstepBase.h000066400000000000000000000070431435650067400233270ustar00rootroot00000000000000/** Declaration of extension methods for base additions Copyright (C) 2003-2010 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald and: Adam Fedor This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #ifndef INCLUDED_NSLock_GNUstepBase_h #define INCLUDED_NSLock_GNUstepBase_h #import #import #if defined(__cplusplus) extern "C" { #endif #if OS_API_VERSION(GS_API_NONE,GS_API_LATEST) /** * Returns IDENT which will be initialized * to an instance of a CLASSNAME in a thread safe manner. * If IDENT has been previously initialized * this macro merely returns IDENT. * IDENT is considered uninitialized, if it contains nil. * CLASSNAME must be either NSLock, NSRecursiveLock or one * of their subclasses. * See [NSLock+newLockAt:] for details. * This macro is intended for code that cannot insure * that a lock can be initialized in thread safe manner otherwise. * * NSLock *my_lock = nil; * * void function (void) * { * [GS_INITIALIZED_LOCK(my_lock, NSLock) lock]; * do_work (); * [my_lock unlock]; * } * * */ #define GS_INITIALIZED_LOCK(IDENT,CLASSNAME) \ (IDENT != nil ? (id)IDENT : (id)[CLASSNAME newLockAt: &IDENT]) @interface NSLock (GNUstepBase) /** * Initializes the id pointed to by location * with a new instance of the receiver's class * in a thread safe manner, unless * it has been previously initialized. * Returns the contents pointed to by location. * The location is considered unintialized if it contains nil. *
* This method is used in the GS_INITIALIZED_LOCK macro * to initialize lock variables when it cannot be insured * that they can be initialized in a thread safe environment. * * NSLock *my_lock = nil; * * void function (void) * { * [GS_INITIALIZED_LOCK(my_lock, NSLock) lock]; * do_work (); * [my_lock unlock]; * } * * */ + (id) newLockAt: (id *)location; @end @interface NSRecursiveLock (GNUstepBase) /** * Initializes the id pointed to by location * with a new instance of the receiver's class * in a thread safe manner, unless * it has been previously initialized. * Returns the contents pointed to by location. * The location is considered unintialized if it contains nil. *
* This method is used in the GS_INITIALIZED_LOCK macro * to initialize lock variables when it cannot be insured * that they can be initialized in a thread safe environment. * * NSLock *my_lock = nil; * * void function (void) * { * [GS_INITIALIZED_LOCK(my_lock, NSLock) lock]; * do_work (); * [my_lock unlock]; * } * * */ + (id) newLockAt: (id *)location; @end #endif /* OS_API_VERSION */ #if defined(__cplusplus) } #endif #endif /* INCLUDED_NSLock_GNUstepBase_h */ gnustep-base-1.29.0/Headers/GNUstepBase/NSMutableString+GNUstepBase.h000066400000000000000000000032421435650067400252140ustar00rootroot00000000000000/** Declaration of extension methods for base additions Copyright (C) 2003-2010 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald and: Adam Fedor This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #ifndef INCLUDED_NSMutableString_GNUstepBase_h #define INCLUDED_NSMutableString_GNUstepBase_h #import #import #if defined(__cplusplus) extern "C" { #endif #if OS_API_VERSION(GS_API_NONE,GS_API_LATEST) @interface NSMutableString (GNUstepBase) - (void) deleteSuffix: (NSString*)suffix; - (void) deletePrefix: (NSString*)prefix; - (NSString*) immutableProxy; - (void) replaceString: (NSString*)replace withString: (NSString*)by; - (void) trimLeadSpaces; - (void) trimTailSpaces; - (void) trimSpaces; @end #endif /* OS_API_VERSION */ #if defined(__cplusplus) } #endif #endif /* INCLUDED_NSMutableString_GNUstepBase_h */ gnustep-base-1.29.0/Headers/GNUstepBase/NSNetServices+GNUstepBase.h000066400000000000000000000075431435650067400246760ustar00rootroot00000000000000/* Declarations of GNUstep extensions to NSNetService. Copyright (C) 2010 Free Software Foundation, Inc. Written by: Niels Grewe Date: March 2010 This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #import #import /* * Only enable extensions if the Avahi API is used. The mDNS based NSNetService * doesn't support them yet. */ #if GS_USE_AVAHI==1 @interface NSNetService (GNUstepBase) /** * Starts monitoring the service represented by the receiver for changes in a * resource record of recordType. The delegate must either * implement a -netService:didUpateFOORecordData: method, where "FOO" is the * record type monitored, or the generic * -netService:didUpdateRecordData:forRecordType: method. */ - (void) startMonitoringForRecordType: (NSString*)recordType; /** * Stops monitoring for the specified record type. */ - (void) stopMonitoringForRecordType: (NSString*)recordType; /** * Adds the service record for a service set up for publishing. The return value * of this method indicates whether the record was successfully added. The * record will only be published when -publish is called and it is thus * considered an error to call this method on a published service. */ - (BOOL) addServiceRecord; /** * Sets data as the value of a resource record of the specified * type. The return value of this method indicates whether the * record was successfully added. The record will only be published when * -publish is called and it is thus considered an error to call this method on * a published service. (But it is possible to add a new record to a published * NSNetService by creating a new NSNetService instance with the same name, * type, domain and port parameters and publish only the new record in that * service.) */ - (BOOL) addRecordData: (NSData*)data forRecordType: (NSString*)type; /** * Returns the record data for the specified record type. If there is only one * such record, the return value will be an NSData object, otherwise it will be * an NSArray. */ - (id) recordDataForRecordType: (NSString*)type; /** * Returns the full name (including, name, type, and domain) of the service. */ - (NSString*) fullServiceName; @end @protocol GSNetServiceDelegate #if GS_PROTOCOLS_HAVE_OPTIONAL @optional #else @end @interface NSObject (GSNetServiceDelegateMethods) #endif // GS_PROTOCOLS_HAVE_OPTIONAL /** * Notifies the delegate that the addresses for the service have * changed. */ - (void)netService: (NSNetService*)service didUpdateAddresses: (NSArray*)addresses; /** * Notifies the delegate that the record of the type given * has changed. */ - (void)netService: (NSNetService*)service didUpdateRecordData: (id)newData forRecordType: (NSString*)type; /** * Notifies the delegate that there was a problem when trying to monitor a * resource record of type for updates. */ - (void)netService: (NSNetService*)service didNotMonitor: (NSDictionary*)errorDict forRecordType: (NSString*)type; @end #endif // GS_USE_AVAHI gnustep-base-1.29.0/Headers/GNUstepBase/NSNumber+GNUstepBase.h000066400000000000000000000033051435650067400236640ustar00rootroot00000000000000/** Declaration of extension methods for base additions Copyright (C) 2003-2010 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald and: Adam Fedor This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #ifndef INCLUDED_NSNumber_GNUstepBase_h #define INCLUDED_NSNumber_GNUstepBase_h #import #import #if defined(__cplusplus) extern "C" { #endif #if OS_API_VERSION(GS_API_NONE,GS_API_LATEST) @interface NSNumber(GNUstepBase) /** * Parses string as a double, int, or unsigned * int depending on what characters are present. Uses * atof and atoi which don't report errors, so be * careful if the string might contain an invalid value. */ + (NSValue*) valueFromString: (NSString *)string; @end #endif /* OS_API_VERSION */ #if defined(__cplusplus) } #endif #endif /* INCLUDED_NSNumber_GNUstepBase_h */ gnustep-base-1.29.0/Headers/GNUstepBase/NSObject+GNUstepBase.h000066400000000000000000000302351435650067400236440ustar00rootroot00000000000000/** Declaration of extension methods for base additions Copyright (C) 2003-2010 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald and: Adam Fedor This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #ifndef INCLUDED_NSObject_GNUstepBase_h #define INCLUDED_NSObject_GNUstepBase_h #import #import #if defined(__cplusplus) extern "C" { #endif #if OS_API_VERSION(GS_API_NONE,GS_API_LATEST) @class NSHashTable; @interface NSObject (GNUstepBase) /** WARNING: The -compare: method for NSObject is deprecated due to subclasses declaring the same selector with conflicting signatures. Comparision of arbitrary objects is not just meaningless but also dangerous as most concrete implementations expect comparable objects as arguments often accessing instance variables directly. This method will be removed in a future release. */ - (NSComparisonResult) compare: (id)anObject; /** For backward compatibility only ... use class_isMetaClass() on the * class of the receiver instead. */ - (BOOL) isInstance; /** DEPRECATED ... do not use. * Transmutes the receiver into an immutable version of the same object * and returns the result.
* If the receiver is not a mutable object or cannot be simply transmuted, * then this method either returns the receiver unchanged or, * if the force flag is set to YES, returns an autoreleased copy of the * receiver.
* Mutable classes should override this default implementation.
* This method is used in methods which are declared to return immutable * objects (eg. an NSArray), but which create and build mutable ones * internally. */ - (id) makeImmutableCopyOnFail: (BOOL)force; /** Transmutes the receiver into an immutable version of the same object. * Returns YES if the receiver has become immutable, NO otherwise.
* The default implementation returns NO.
* Mutable classes which have an immutable counterpart they can efficiently * change into, should override to transmute themselves and return YES.
* Immutable classes should override this to simply return YES with no * further action.
* This method is used in methods which are declared to return immutable * objects (eg. an NSArray), but which create and build mutable ones * internally. */ - (BOOL) makeImmutable; /** * Message sent when an implementation wants to explicitly exclude a method * (but cannot due to compiler constraint), and wants to make sure it is not * called by mistake. Default implementation raises an exception at runtime. */ - (id) notImplemented: (SEL)aSel GS_NORETURN_METHOD; /** * Message sent when an implementation wants to explicitly require a subclass * to implement a method (but cannot at compile time since there is no * abstract keyword in Objective-C). Default implementation * raises an exception at runtime to alert developer that he/she forgot to * override a method. */ - (id) subclassResponsibility: (SEL)aSel GS_NORETURN_METHOD; /** * Message sent when an implementation wants to explicitly exclude a method * (but cannot due to compiler constraint) and forbid that subclasses * implement it. Default implementation raises an exception at runtime. If a * subclass does implement this method, however, the superclass's * implementation will not be called, so this is not a perfect mechanism. */ - (id) shouldNotImplement: (SEL)aSel GS_NORETURN_METHOD; @end /** This is an informal protocol; classes may implement the * +contentSizeOf:declaredIn:excluding: method to report how much memory * is used by any objects/pointers it acts as a container for.
* Code may call the -sizeInBytesExcluding: or -sizeinBytes method to * determine how much heap memory an object (and its content) occupies. */ @interface NSObject(MemoryFootprint) /** This method returns the size of the memory used by the object instance * variables of the target object (excluding any in the specified set).
* This is not the memory occupied by instance variable pointers. * It is the memory referenced by any objects inside the target.
* This method is not intended to be overridden, rather it is provided for * use as a helper for the -sizeOfContentExcluding: method.
* This method must not be called for a mutable object unless it is protected * by a locking mechanism to prevent mutation while it is examining the * instance variables of the object. * * @interface foo : bar * { * id a; // Some object * id b; // More storage * unsigned capacity; // Buffer size * char *p; // The buffer * } * @end * @implementation foo * - (NSUInteger) sizeOfContentExcluding: (NSHashTable*)exclude *{ * NSUInteger size; * * // get the size of the objects (a and b) * size = [NSObject contentSizeOf: self * excluding: exclude]; * // add the memory pointed to by p * size += capacity * sizeof(char); * return size; *} *@end * */ + (NSUInteger) contentSizeOf: (NSObject*)obj excluding: (NSHashTable*)exclude; /** This method returns the memory usage of the receiver, excluding any * objects already present in the exclude table.
* The argument is a hash table configured to hold non-retained pointer * objects and is used to inform the receiver that its size should not * be counted again if it's already in the table.
* The NSObject implementation returns zero if the receiver is in the * table, but otherwise adds itself to the table and returns its memory * footprint (the sum of all of its instance variables, plus the result * of calling -sizeOfContentExcluding: for the instance).
* Classes should not override this method, instead they should implement * -sizeOfContentExcluding: to return the extra memory usage * of the pointer/object instance variables (heap memory) they add to * their superclass.
* NB. mutable objects must either prevent mutation while calculating * their content size, or must override -sizeOfContentExcluding: to refrain * from dealing with content which might change. */ - (NSUInteger) sizeInBytesExcluding: (NSHashTable*)exclude; /** Convenience method calling -sizeInBytesExcluding: with a newly created * exclusion hash table, and destroying the table once the size is calculated. */ - (NSUInteger) sizeInBytes; /** This method is called by -sizeInBytesExcluding: to calculate the size of * any objects or heap memory contained by the receiver.
* The base class implementation simply returns zero (as it is not possible * to safely calculate content sizes of mutable objects), but subclasses should * override it to provide correct information where possible (eg if the object * is immutable or if locking is used to prevent mutation while calculating * content size).
* Subclasses may use the +contentSizeOf:excluding: method as a convenience * to provide the sizes of object instnce variables. */ - (NSUInteger) sizeOfContentExcluding: (NSHashTable*)exclude; /** Helper method called by -sizeInBytesExcluding: to return the size of * the instance excluding any contents (things referenced by pointers). */ - (NSUInteger) sizeOfInstance; @end /** This is an informal protocol ... classes may implement the method and * register themselves to have it called on process exit. */ @interface NSObject(GSAtExit) /** This method is called on exit for any class which implements it and which * has called +registerAtExit to register it to be called.
* The order in which methods for different classes is called is the reverse * of the order in which the classes were registered, but it's best to assume * the method can not depend on any other class being in a usable state * at the point when the method is called (rather like +load).
* Typical use would be to release memory occupied by class data structures * so that memory usage analysis software will not think the memory has * been leaked. */ + (void) atExit; @end /** Category for methods handling leaked memory cleanup on exit of process * (for use when debugging memory leaks).
* You enable this by calling the +setShouldCleanUp: method (done implicitly * by gnustep-base if the GNUSTEP_SHOULD_CLEAN_UP environment variable is * set to YES).
* Your class then has two options for performing cleanup when the process * ends: *

1. Use the +leak: method to register objects which are simply to be * retained until the process ends, and then either ignored or released * depending on the cleanup setting in force. This mechanism is simple * and should be sufficient for many classes. *

*

2. Implement a +atExit method to be run when the process ends and, * within your +initialize implementation, call +shouldCleanUp to determine * whether cleanup should be done, and if it returns YES then call * +registerAtExit to have your +atExit method called when the process * terminates. *

*

The order in which 'leaked' objects are released and +atExit methods * are called on process exist is the reverse of the order in which they * werse set up suing this API. *

*/ @interface NSObject(GSCleanup) /** This method simply retains its argument so that it will never be * deallocated during normal operation, but keeps track of it so that * it is released during process exit if cleanup is enabled.
* Returns its argument. */ + (id) NS_RETURNS_RETAINED leak: (id)anObject; /** This method retains the object at *anAddress so that it will never be * deallocated during normal operation, but keeps track of the address * so that the object is released and the address is zeroed during process * exit if cleanup is enabled.
* Returns the object at *anAddress. */ + (id) NS_RETURNS_RETAINED leakAt: (id*)anAddress; /** Sets the receiver to have its +atExit method called at the point when * the process terminates.
* Returns YES on success and NO on failure (if the class does not implement * the method or if it is already registered to call it).
* Implemented as a call to +registerAtExit: with the selector for the +atExit * method as its argument. */ + (BOOL) registerAtExit; /** Sets the receiver to have the specified method called at the point when * the process terminates.
* Returns YES on success and NO on failure (if the class does not implement * the method ir if it is already registered to call it). */ + (BOOL) registerAtExit: (SEL)aSelector; /** Specifies the default cleanup behavior on process exit ... the value * returned by the NSObject implementation of the +shouldClanUp method.
* Calling this method with a YES argument implicitly calls the +enableAtExit * method as well.
* The GNUstep Base library calls this method with the value obtained from * the GNUSTEP_SHOULD_CLEAN_UP environment variable when NSObject is * initialised. */ + (void) setShouldCleanUp: (BOOL)aFlag; /** Returns a flag indicating whether the receiver should clean up * its data structures etc at process exit.
* The NSObject implementation returns the value set by the +setShouldCleanUp: * method but subclasses may override this. */ + (BOOL) shouldCleanUp; @end /* Macro to take an autoreleased object and either make it immutable or * create an autoreleased copy of the original. */ #define GS_IMMUTABLE(O) ([O makeImmutable] == YES ? O : AUTORELEASE([O copy])) #endif /* OS_API_VERSION */ #if defined(__cplusplus) } #endif #endif /* INCLUDED_NSObject_GNUstepBase_h */ gnustep-base-1.29.0/Headers/GNUstepBase/NSProcessInfo+GNUstepBase.h000066400000000000000000000041021435650067400246620ustar00rootroot00000000000000/** Declaration of extension methods for base additions Copyright (C) 2003-2010 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald and: Adam Fedor This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #ifndef INCLUDED_NSProcessInfo_GNUstepBase_h #define INCLUDED_NSProcessInfo_GNUstepBase_h #import #import #if defined(__cplusplus) extern "C" { #endif #if OS_API_VERSION(GS_API_NONE,GS_API_LATEST) @interface NSProcessInfo(GNUstepBase) /** * Returns a indication of whether debug logging is enabled. * This returns YES unless a call to -setDebugLoggingEnabled: has * been used to turn logging off. */ - (BOOL) debugLoggingEnabled; /** * This method returns a set of debug levels set using the * --GNU-Debug=... command line option and/or the GNU-Debug * user default.
* You can modify this set to change the debug logging under * your programs control ... but such modifications are not * thread-safe. */ - (NSMutableSet*) debugSet; /** * This method permits you to turn all debug logging on or off * without modifying the set of debug levels in use. */ - (void) setDebugLoggingEnabled: (BOOL)flag; @end #endif /* OS_API_VERSION */ #if defined(__cplusplus) } #endif #endif /* INCLUDED_NSProcessInfo_GNUstepBase_h */ gnustep-base-1.29.0/Headers/GNUstepBase/NSStream+GNUstepBase.h000066400000000000000000000110201435650067400236600ustar00rootroot00000000000000/** Declaration of extension methods for base additions Copyright (C) 2010 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #ifndef INCLUDED_NSStream_GNUstepBase_h #define INCLUDED_NSStream_GNUstepBase_h #import #import #if defined(__cplusplus) extern "C" { #endif #if OS_API_VERSION(GS_API_NONE,GS_API_LATEST) /** * The additional interface defined for GNUstep.
* Currently NOT implemented when using the Apple Foundation!
* Please contribute an Apple implementation. */ @interface NSStream (GNUstepBase) /** * Creates and returns by reference an NSInputStream object and * NSOutputStream object for a local socket or named pipe connection * with the specified path. To use them you need to open them and wait * on the NSStreamEventOpenCompleted event on one of them. */ + (void) getLocalStreamsToPath: (NSString *)path inputStream: (NSInputStream **)inputStream outputStream: (NSOutputStream **)outputStream; /** * Creates and returns by reference an NSInputStream object and NSOutputStream * object for a anonymous local socket or pipe. Although you still need to * open them, the open will be instantaneous, and no NSStreamEventOpenCompleted * event will be delivered. */ + (void) pipeWithInputStream: (NSInputStream **)inputStream outputStream: (NSOutputStream **)outputStream; @end /** * GSServerStream is a subclass of NSStream that encapsulate a "server" * stream; that is a stream that binds to a socket and accepts incoming * connections.
* Currently NOT implemented when using the Apple Foundation!
* Please contribute an Apple implementation. */ GS_EXPORT_CLASS @interface GSServerStream : NSStream /** * Create an IP (ipv4 or ipv6) server stream.
* The addr argument must be a string object containing a standard text * representation of an internet address (either the dot separated ipv4 * syntax or the colon separated ipv6 syntax). */ + (id) serverStreamToAddr: (NSString*)addr port: (NSInteger)port; /** * Create a local (unix domain or named pipe) server stream. */ + (id) serverStreamToAddr: (NSString*)addr; /** * This is the method that accepts a connection and generates two streams * as the server side inputStream and OutputStream.
* You call this when you receive an event on the server stream signalling * that it is 'readable' (bytes available).
* Although you still need to open them, the open will be instantaneous, * and no NSStreamEventOpenCompleted event will be delivered. */ - (void) acceptWithInputStream: (NSInputStream **)inputStream outputStream: (NSOutputStream **)outputStream; /** * The designated initializer for an IP (ipv4 or ipv6) server stream.
* The addr argument must be a string object containing a standard text * representation of an internet address (either the dot separated ipv4 * syntax or the colon separated ipv6 syntax). */ - (id) initToAddr: (NSString*)addr port: (NSInteger)port; /** * The designated initializer for a local (unix domain or named pipe) * server stream. */ - (id) initToAddr: (NSString*)addr; @end /** May be used to read the local IP address of a tcp/ip network stream. */ GS_EXPORT NSString * const GSStreamLocalAddressKey; /** May be used to read the local port of a tcp/ip network stream. */ GS_EXPORT NSString * const GSStreamLocalPortKey; /** May be used to read the remote IP address of a tcp/ip network stream. */ GS_EXPORT NSString * const GSStreamRemoteAddressKey; /** May be used to read the remote port of a tcp/ip network stream. */ GS_EXPORT NSString * const GSStreamRemotePortKey; #endif /* OS_API_VERSION */ #if defined(__cplusplus) } #endif #endif /* INCLUDED_NSStream_GNUstepBase_h */ gnustep-base-1.29.0/Headers/GNUstepBase/NSString+GNUstepBase.h000066400000000000000000000060501435650067400237020ustar00rootroot00000000000000/** Declaration of extension methods for base additions Copyright (C) 2003-2010 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald and: Adam Fedor This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #ifndef INCLUDED_NSString_GNUstepBase_h #define INCLUDED_NSString_GNUstepBase_h #import #import #if defined(__cplusplus) extern "C" { #endif /** * See "Portable path handling" in NSString.h. */ GS_EXPORT const char* GSPathHandling(const char *mode); #if OS_API_VERSION(GS_API_NONE,GS_API_LATEST) /** * Provides some additional (non-standard) utility methods. */ @interface NSString (GNUstepBase) /** * Alternate way to invoke stringWithFormat if you have or wish * to build an explicit va_list structure. */ + (id) stringWithFormat: (NSString*)format arguments: (va_list)argList NS_FORMAT_FUNCTION(1,0); /** * Returns a string formed by removing the prefix string from the * receiver. Raises an exception if the prefix is not present. */ - (NSString*) stringByDeletingPrefix: (NSString*)prefix; /** * Returns a string formed by removing the suffix string from the * receiver. Raises an exception if the suffix is not present. */ - (NSString*) stringByDeletingSuffix: (NSString*)suffix; /** * Returns a string formed by removing leading white space from the * receiver. */ - (NSString*) stringByTrimmingLeadSpaces; /** * Returns a string formed by removing trailing white space from the * receiver. */ - (NSString*) stringByTrimmingTailSpaces; /** * Returns a string formed by removing both leading and trailing * white space from the receiver. */ - (NSString*) stringByTrimmingSpaces; /** * Returns a string in which any (and all) occurrences of * replace in the receiver have been replaced with by. * Returns the receiver if replace * does not occur within the receiver. NB. an empty string is * not considered to exist within the receiver. */ - (NSString*) stringByReplacingString: (NSString*)replace withString: (NSString*)by; /** * An obsolete name for -substringWithRange: ... deprecated. */ - (NSString*) substringFromRange: (NSRange)aRange; @end #endif /* OS_API_VERSION */ #if defined(__cplusplus) } #endif #endif /* INCLUDED_NSString_GNUstepBase_h */ gnustep-base-1.29.0/Headers/GNUstepBase/NSTask+GNUstepBase.h000066400000000000000000000043171435650067400233420ustar00rootroot00000000000000/** Declaration of additional methods for base additions Copyright (C) 2008 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #ifndef INCLUDED_NSTask_GNUstepBase_h #define INCLUDED_NSTask_GNUstepBase_h #import #import #if defined(__cplusplus) extern "C" { #endif #if OS_API_VERSION(GS_API_NONE,GS_API_LATEST) @interface NSTask (GNUstepBase) /** Returns the set of extensions known to indicate an executable file * type on systems which require that (currently mswindows). */ + (NSSet*) executableExtensions; /** Checks the specified file to see if it is executable or if by * appending one of the +executableExtensions it can be made executable. * The return value is the actual executable path or nil if the file * cannot be executed. */ + (NSString*) executablePath: (NSString*)aFile; /** Returns the launch path for a tool given the name of a tool.
* Locates the tool by looking in the standard directories and, * if not found there, looking in the PATH set in the environment.
* On ms-windows, this also tries appending common executable path * extensions to the tool name in order to find it.
* Returns the path found, or nil if the tool could not be located. */ + (NSString*) launchPathForTool: (NSString*)name; @end #endif /* OS_API_VERSION */ #if defined(__cplusplus) } #endif #endif /* INCLUDED_NSTask_GNUstepBase_h */ gnustep-base-1.29.0/Headers/GNUstepBase/NSThread+GNUstepBase.h000066400000000000000000000027501435650067400236460ustar00rootroot00000000000000/** Declaration of extension methods for base additions Copyright (C) 2003-2010 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald and: Adam Fedor This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #ifndef INCLUDED_NSThread_GNUstepBase_h #define INCLUDED_NSThread_GNUstepBase_h #import #import #if defined(__cplusplus) extern "C" { #endif #if OS_API_VERSION(GS_API_NONE,GS_API_LATEST) @interface NSThread (GNUstepBase) @end GS_EXPORT NSThread *GSCurrentThread(void); GS_EXPORT NSMutableDictionary *GSCurrentThreadDictionary(void); #endif /* OS_API_VERSION */ #if defined(__cplusplus) } #endif #endif /* INCLUDED_NSThread_GNUstepBase_h */ gnustep-base-1.29.0/Headers/GNUstepBase/NSURL+GNUstepBase.h000066400000000000000000000047551435650067400231100ustar00rootroot00000000000000/** Declaration of extension methods for base additions Copyright (C) 2003-2010 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald and: Adam Fedor This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #ifndef INCLUDED_NSURL_GNUstepBase_h #define INCLUDED_NSURL_GNUstepBase_h #import #import #if defined(__cplusplus) extern "C" { #endif #if OS_API_VERSION(GS_API_NONE,GS_API_LATEST) @interface NSURL (GNUstepBaseAdditions) /** Returns a string (encapsulating the scheme, host and port of the receiver) * suitable for use as a key to store the receiver in a cache of objects used * to access resources using the same network connection. */ - (NSString*) cacheKey; /** Builds a URL from components as returned by the methods of the same names. */ - (id) initWithScheme: (NSString*)scheme user: (NSString*)user password: (NSString*)password host: (NSString*)host port: (NSNumber*)port fullPath: (NSString*)fullPath parameterString: (NSString*)parameterString query: (NSString*)query fragment: (NSString*)fragment; @end @interface NSURL (GNUstepBase) /** Returns the full path for this URL including any trailing slash. */ - (NSString*) fullPath; /** Returns the full path for this URL, without decoding percent-escapes.
* This is useful if you need to distinguish between "/" and "%2F" in the path. * The normal -path method will convert all "%2F" value in the path into "/" * so that you have no way of knowing whether a "/" is part of a path component * ir is a path separator. */ - (NSString*) pathWithEscapes; @end #endif /* OS_API_VERSION */ #if defined(__cplusplus) } #endif #endif /* INCLUDED_NSURL_GNUstepBase_h */ gnustep-base-1.29.0/Headers/GNUstepBase/Unicode.h000066400000000000000000000366421435650067400214570ustar00rootroot00000000000000/** Interface for support functions for Unicode implementation. Interface for GetDefEncoding function to determine default c string encoding for GNUstep based on GNUSTEP_STRING_ENCODING environment variable. Copyright (C) 1997 Free Software Foundation, Inc. Written by: Stevo Crvenkovski Date: March 1997 Merged with GetDefEncoding.h: Fred Kiefer Date: September 2000 This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. AutogsdocSource: Additions/Unicode.m */ #ifndef __Unicode_h_OBJECTS_INCLUDE #define __Unicode_h_OBJECTS_INCLUDE #import #import /* For standard string encodings */ #if OS_API_VERSION(GS_API_NONE,GS_API_LATEST) #if defined(__cplusplus) extern "C" { #endif #if defined(NeXT_Foundation_LIBRARY) /* Taken from base/Headers/Foundation/NSString.h */ typedef enum _NSGNUstepStringEncoding { /* NB. Must not have an encoding with value zero - so we can use zero to tell that a variable that should contain an encoding has not yet been initialised */ GSUndefinedEncoding = 0, /* Exclusive to GNUstep */ NSGSM0338StringEncoding = 65, // GSM (mobile phone) default alphabet /* NSStringEncoding Appendix */ // NSMacOSRomanStringEncoding = 0x80000000, // defined as 30 NSMacOSJapaneseStringEncoding = 0x80000001, NSMacOSTraditionalChineseStringEncoding = 0x80000002, NSMacOSKoreanStringEncoding = 0x80000003, NSMacOSArabicStringEncoding = 0x80000004, NSMacOSHebrewStringEncoding = 0x80000005, NSMacOSGreekStringEncoding = 0x80000006, NSMacOSCyrillicStringEncoding = 0x80000007, // missing 08 NSMacOSDevanagariStringEncoding = 0x80000009, NSMacOSGurmukhiStringEncoding = 0x8000000a, NSMacOSGujaratiStringEncoding = 0x8000000b, NSMacOSOriyaStringEncoding = 0x8000000c, NSMacOSBengaliStringEncoding = 0x8000000d, NSMacOSTamilStringEncoding = 0x8000000e, NSMacOSTeluguStringEncoding = 0x8000000f, NSMacOSKannadaStringEncoding = 0x80000010, NSMacOSMalayalamStringEncoding = 0x80000011, NSMacOSSinhaleseStringEncoding = 0x80000012, NSMacOSBurmeseStringEncoding = 0x80000013, NSMacOSKhmerStringEncoding = 0x80000014, NSMacOSThaiStringEncoding = 0x80000015, NSMacOSLaotianStringEncoding = 0x80000016, NSMacOSGeorgianStringEncoding = 0x80000017, NSMacOSArmenianStringEncoding = 0x80000018, NSMacOSSimplifiedChineseStringEncoding = 0x80000019, NSMacOSTibetanStringEncoding = 0x8000001a, NSMacOSMongolianStringEncoding = 0x8000001b, NSMacOSEthiopicStringEncoding = 0x8000001c, NSMacOSCentralEuropeanRomanStringEncoding = 0x8000001d, NSMacOSVietnameseStringEncoding = 0x8000001e, NSMacOSExtendedArabicStringEncoding = 0x8000001f, // missing 20 /* The following use script code 0, smRoman */ NSMacOSSymbolStringEncoding = 0x80000021, NSMacOSDingbatsStringEncoding = 0x80000022, NSMacOSTurkishStringEncoding = 0x80000023, NSMacOSCroatianStringEncoding = 0x80000024, NSMacOSIcelandicStringEncoding = 0x80000025, NSMacOSRomanianStringEncoding = 0x80000026, NSMacOSCelticStringEncoding = 0x80000027, NSMacOSGaelicStringEncoding = 0x80000028, NSMacOSKeyboardSymbolsStringEncoding = 0x80000029, /* The following use script code 4, smArabic */ NSMacOSFarsiStringEncoding = 0x8000008c, /* The following use script code 7, smCyrillic */ NSMacOSUkrainianStringEncoding = 0x80000098, /* The following use script code 32, smUnimplemented */ NSMacOSInuitStringEncoding = 0x800000ec, NSMacVT100StringEncoding = 0x800000fc, /* VT100/102 font from Comm Toolbox: Latin-1 repertoire + box drawing etc */ /* ICecial Mac OS encodings*/ NSMacHFSStringEncoding = 0x800000ff, /* Unicode & ISO UCS encodings begin at 0x100 */ // NSUnicodeStringEncoding = 0x80000100, // NSUTF8StringEncoding = 0x88000100, // defined as 4 // NSUTF16StringEncoding = 0x90000100, // NSUTF16BigEndianStringEncoding = 0x90000100, // NSUTF16LittleEndianStringEncoding = 0x94000100, // NSUTF32StringEncoding = 0x8c000100, // NSUTF32BigEndianStringEncoding = 0x98000100, // NSUTF32LittleEndianStringEncoding = 0x9c000100, #if OS_API_VERSION(MAC_OS_X_VERSION_10_6,GS_API_LATEST) NSUTF7StringEncoding = 0x84000100, /* kTextEncodingUnicodeDefault + kUnicodeUTF7Format RFC2152 */ NSUTF7IMAPStringEncoding = 0x80000A10, /* UTF-7 (IMAP folder variant) RFC3501 */ #endif /* ISO 8-bit and 7-bit encodings begin at 0x200 */ // NSISOLatin1StringEncoding = 0x80000201, /* ISO 8859-1, defined as 5 */ // NSISOLatin2StringEncoding = 0x80000202, /* ISO 8859-2, defined as 9 */ NSISOLatin3StringEncoding = 0x80000203, /* ISO 8859-3 */ NSISOLatin4StringEncoding = 0x80000204, /* ISO 8859-4 */ NSISOCyrillicStringEncoding = 0x80000205, /* ISO 8859-5 */ NSISOArabicStringEncoding = 0x80000206, /* ISO 8859-6, StringEncoding=ASMO 708, StringEncoding=DOS CP 708 */ NSISOGreekStringEncoding = 0x80000207, /* ISO 8859-7 */ NSISOHebrewStringEncoding = 0x80000208, /* ISO 8859-8 */ NSISOLatin5StringEncoding = 0x80000209, /* ISO 8859-9 */ NSISOLatin6StringEncoding = 0x8000020a, /* ISO 8859-10 */ NSISOThaiStringEncoding = 0x8000020b, /* ISO 8859-11 */ // missing 0c NSISOLatin7StringEncoding = 0x8000020d, /* ISO 8859-13 */ NSISOLatin8StringEncoding = 0x8000020e, /* ISO 8859-14 */ NSISOLatin9StringEncoding = 0x8000020f, /* ISO 8859-15 */ #if OS_API_VERSION(MAC_OS_X_VERSION_10_4,GS_API_LATEST) NSISOLatin10StringEncoding = 0x80000210, /* ISO 8859-16 */ #endif NSISOLatinArabicStringEncoding = NSISOArabicStringEncoding, NSISOLatinBalticRimStringEncoding = NSISOLatin7StringEncoding, NSISOLatinCelticStringEncoding = NSISOLatin8StringEncoding, NSISOLatinCyrillicStringEncoding = NSISOCyrillicStringEncoding, NSISOLatinGreekStringEncoding = NSISOGreekStringEncoding, NSISOLatinHebrewStringEncoding = NSISOHebrewStringEncoding, NSISOLatinNordicStringEncoding = NSISOLatin6StringEncoding, NSISOLatinThaiStringEncoding = NSISOThaiStringEncoding, NSISOLatinTurkishStringEncoding = NSISOLatin5StringEncoding, /* MS-DOS & Windows encodings begin at 0x400 */ NSDOSLatinUSStringEncoding = 0x80000400, /* code page 437 */ NSDOSGreekStringEncoding = 0x80000405, /* code page 737 (formerly code page 437G) */ NSDOSBalticRimStringEncoding = 0x80000406, /* code page 775 */ NSDOSLatin1StringEncoding = 0x80000410, /* code page 850, "Multilingual" */ NSDOSGreek1StringEncoding = 0x80000411, /* code page 851 */ NSDOSLatin2StringEncoding = 0x80000412, /* code page 852, Slavic */ NSDOSCyrillicStringEncoding = 0x80000413, /* code page 855, IBM Cyrillic */ NSDOSTurkishStringEncoding = 0x80000414, /* code page 857, IBM Turkish */ NSDOICortugueseStringEncoding = 0x80000415, /* code page 860 */ NSDOSIcelandicStringEncoding = 0x80000416, /* code page 861 */ NSDOSHebrewStringEncoding = 0x80000417, /* code page 862 */ NSDOSCanadianFrenchStringEncoding = 0x80000418, /* code page 863 */ NSDOSArabicStringEncoding = 0x80000419, /* code page 864 */ NSDOSNordicStringEncoding = 0x8000041A, /* code page 865 */ NSDOSRussianStringEncoding = 0x8000041B, /* code page 866 */ NSDOSGreek2StringEncoding = 0x8000041C, /* code page 869, IBM Modern Greek */ NSDOSThaiStringEncoding = 0x8000041D, /* code page 874, also for Windows */ NSDOSJapaneseStringEncoding = 0x80000420, /* code page 932, also for Windows */ NSDOSChineseSimplifStringEncoding = 0x80000421, /* code page 936, also for Windows */ NSDOSKoreanStringEncoding = 0x80000422, /* code page 949, also for Windows; Unified Hangul Code */ NSDOSChineseTradStringEncoding = 0x80000423, /* code page 950, also for Windows */ NSWindowsLatin1StringEncoding = 0x80000500, /* code page 1252 */ NSWindowsLatin2StringEncoding = 0x80000501, /* code page 1250, Central Europe */ NSWindowsCyrillicStringEncoding = 0x80000502, /* code page 1251, Slavic Cyrillic */ NSWindowsGreekStringEncoding = 0x80000503, /* code page 1253 */ NSWindowsLatin5StringEncoding = 0x80000504, /* code page 1254, Turkish */ NSWindowsHebrewStringEncoding = 0x80000505, /* code page 1255 */ NSWindowsArabicStringEncoding = 0x80000506, /* code page 1256 */ NSWindowsBalticRimStringEncoding = 0x80000507, /* code page 1257 */ NSWindowsVietnameseStringEncoding = 0x80000508, /* code page 1258 */ NSWindowsKoreanJohabStringEncoding = 0x80000510, /* code page 1361, for Windows NT */ // NSASCIIStringEncoding = 0x80000600, /* 0..127 defined as 1 */ NSJIS_X0201_76StringEncoding = 0x80000620, NSJIS_X0208_83StringEncoding = 0x80000621, NSJIS_X0208_90StringEncoding = 0x80000622, NSJIS_X0212_90StringEncoding = 0x80000623, NSJIS_C6226_78StringEncoding = 0x80000624, #if OS_API_VERSION(MAC_OS_X_VERSION_10_5,GS_API_LATEST) NSShiftJIS_X0213StringEncoding = 0x80000628, /* Shift-JIS format encoding of JIS X0213 planes 1 and 2*/ #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_5,GS_API_LATEST) NSShiftJIS_X0213_MenKuTenStringEncoding = 0x80000629, /* JIS X0213 in plane-row-column notation */ NSShiftJIS_X0213_00StringEncoding = 0x80000629, /* Shift-JIS format encoding of JIS X0213 planes 1 and 2 (DEPRECATED) */ #endif NSGB_2312_80StringEncoding = 0x80000630, NSGBK_95StringEncoding = 0x80000631, /* annex to GB 13000-93; for Windows 95 */ NSGB_18030_2000StringEncoding = 0x80000632, NSKSC_5601_87StringEncoding = 0x80000640, /* same as KSC 5601-92 without Johab annex */ NSKSC_5601_92_JohabStringEncoding = 0x80000641, /* KSC 5601-92 Johab annex */ NSCNS_11643_92_P1StringEncoding = 0x80000651, /* CNS 11643-1992 plane 1 */ NSCNS_11643_92_P2StringEncoding = 0x80000652, /* CNS 11643-1992 plane 2 */ NSCNS_11643_92_P3StringEncoding = 0x80000653, /* CNS 11643-1992 plane 3 (was plane 14 in 1986 version) */ /* ISO 2022 collections begin at 0x800 */ NSISO2022JapaneseStringEncoding = 0x80000820, NSISO2022Japanese2StringEncoding = 0x80000821, NSISO2022Japanese1StringEncoding = 0x80000822, /* RFC 2237*/ NSISO2022Japanese3StringEncoding = 0x80000823, /* JIS X0213*/ NSISO2022ChineseStringEncoding = 0x80000830, NSISO2022ExtendedChineseStringEncoding = 0x80000831, NSISO2022KoreanStringEncoding = 0x80000840, /* EUC collections begin at 0x900 */ NSEUCJapaneseStringEncoding = 0x80000920, /* ISO 646, 1-byte katakana, JIS 208, JIS 212 */ NSEUCChineseStringEncoding = 0x80000930, /* ISO 646, GB 2312-80 */ NSEUCTaiwanChineseStringEncoding = 0x80000931, /* ISO 646, CNS 11643-1992 Planes 1-16 */ NSEUCKoreanStringEncoding = 0x80000940, /* ISO 646, KS C 5601-1987 */ NSKoreanEUCStringEncoding = NSEUCKoreanStringEncoding, NSChineseEUCStringEncoding = NSEUCChineseStringEncoding, NSTaiwanChineseEUCStringEncoding = NSEUCTaiwanChineseStringEncoding, /* Misc standards begin at 0xA00 */ // NSShiftJISStringEncoding = 0x80000A01, /* plain Shift-JIS */ NSKOI8RStringEncoding = 0x80000A02, /* Russian internet standard */ NSBig5StringEncoding = 0x80000A03, /* Big-5 (has variants) */ NSMacRomanLatin1StringEncoding = 0x80000A04, /* Mac OS Roman permuted to align with ISO Latin-1 */ NSHZ_GB_2312StringEncoding = 0x80000A05, /* HZ (RFC 1842, for Chinese mail & news) */ NSBig5_HKSCS_1999StringEncoding = 0x80000A06, /* Big-5 with Hong Kong ICecial char set supplement*/ #if OS_API_VERSION(MAC_OS_X_VERSION_10_4,GS_API_LATEST) NSVISCIIStringEncoding = 0x80000A07, /* RFC 1456, Vietnamese */ NSKOI8UStringEncoding = 0x80000A08, /* RFC 2319, Ukrainian */ NSBig5EStringEncoding = 0x80000A09, /* Taiwan Big-5E standard */ #endif /* Other platform encodings*/ NSNextStepLatinStringEncoding = 0x80000B01, /* NextStep Latin encoding */ #if OS_API_VERSION(MAC_OS_X_VERSION_10_4,GS_API_LATEST) NSNextStepJapaneseStringEncoding = 0x80000B02, /* NextStep Japanese encoding */ #endif // NSNonLossyASCIIStringEncoding = 0x80000bff, /* EBCDIC & IBM host encodings begin at 0xC00 */ NSEBCDICUSStringEncoding = 0x80000C01, /* basic EBCDIC-US */ NSEBCDICCP037StringEncoding = 0x80000C02, /* code page 037, extended EBCDIC (Latin-1 set) for US,Canada... */ GSEncodingUnusedLast } NSGNUstepStringEncoding; #endif #if GS_API_VERSION(GS_API_NONE,011500) /* Deprecated functions */ GS_EXPORT NSStringEncoding GSEncodingFromLocale(const char *clocale); GS_EXPORT NSStringEncoding GSEncodingForRegistry(NSString *registry, NSString *encoding); GS_EXPORT unichar uni_tolower(unichar ch); GS_EXPORT unichar uni_toupper(unichar ch); GS_EXPORT unsigned char uni_cop(unichar u); GS_EXPORT BOOL uni_isnonsp(unichar u); GS_EXPORT unichar *uni_is_decomp(unichar u); GS_EXPORT unsigned GSUnicode(const unichar *chars, unsigned length, BOOL *isASCII, BOOL *isLatin1); #endif /* * Options when converting strings. */ #define GSUniTerminate 0x01 #define GSUniTemporary 0x02 #define GSUniStrict 0x04 #define GSUniBOM 0x08 #define GSUniShortOk 0x10 GS_EXPORT BOOL GSFromUnicode(unsigned char **dst, unsigned int *size, const unichar *src, unsigned int slen, NSStringEncoding enc, NSZone *zone, unsigned int options); GS_EXPORT BOOL GSToUnicode(unichar **dst, unsigned int *size, const unsigned char *src, unsigned int slen, NSStringEncoding enc, NSZone *zone, unsigned int options); #if defined(__cplusplus) } #endif #endif /* OS_API_VERSION(GS_API_NONE,GS_API_NONE) */ #endif /* __Unicode_h_OBJECTS_INCLUDE */ gnustep-base-1.29.0/Headers/GNUstepBase/config.h.in000066400000000000000000000704251435650067400217400ustar00rootroot00000000000000/* Headers/GNUstepBase/config.h.in. Generated from configure.ac by autoheader. */ /* Define if building universal (internal helper macro) */ #undef AC_APPLE_UNIVERSAL_BUILD /* The normal alignment of `CONDITION_VARIABLE', in bytes. */ #undef ALIGNOF_CONDITION_VARIABLE /* The normal alignment of `gs_mutex_t', in bytes. */ #undef ALIGNOF_GS_MUTEX_T /* The normal alignment of `pthread_cond_t', in bytes. */ #undef ALIGNOF_PTHREAD_COND_T /* The normal alignment of `pthread_mutex_t', in bytes. */ #undef ALIGNOF_PTHREAD_MUTEX_T /* The normal alignment of `SRWLOCK', in bytes. */ #undef ALIGNOF_SRWLOCK /* Define if SO_REUSEADDR is broken on this system */ #undef BROKEN_SO_REUSEADDR /* Define if your system terminates the final argument in /proc/$$/cmdline */ #undef CMDLINE_TERMINATED /* Define if constructors are automatically loaded */ #undef CON_AUTOLOAD /* Built in default value for GNUstep config file */ #undef GNUSTEP_TARGET_CONFIG_FILE /* Built in default value for GNUstep local apps */ #undef GNUSTEP_TARGET_LOCAL_ADMIN_APPS /* Built in default value for GNUstep local tools */ #undef GNUSTEP_TARGET_LOCAL_ADMIN_TOOLS /* Built in default value for GNUstep local apps */ #undef GNUSTEP_TARGET_LOCAL_APPS /* Built in default value for GNUstep local documentation */ #undef GNUSTEP_TARGET_LOCAL_DOC /* Built in default value for GNUstep local info documentation */ #undef GNUSTEP_TARGET_LOCAL_DOC_INFO /* Built in default value for GNUstep local manpages documentation */ #undef GNUSTEP_TARGET_LOCAL_DOC_MAN /* Built in default value for GNUstep local headers */ #undef GNUSTEP_TARGET_LOCAL_HEADERS /* Built in default value for GNUstep local libraries */ #undef GNUSTEP_TARGET_LOCAL_LIBRARIES /* Built in default value for GNUstep local library */ #undef GNUSTEP_TARGET_LOCAL_LIBRARY /* Built in default value for GNUstep local tools */ #undef GNUSTEP_TARGET_LOCAL_TOOLS /* Built in default value for GNUstep Local Users directory */ #undef GNUSTEP_TARGET_LOCAL_USERS_DIR /* Built in default value for GNUstep local web apps */ #undef GNUSTEP_TARGET_LOCAL_WEB_APPS /* Built in default value for GNUstep Makefiles */ #undef GNUSTEP_TARGET_MAKEFILES /* Built in default value for GNUstep network apps */ #undef GNUSTEP_TARGET_NETWORK_ADMIN_APPS /* Built in default value for GNUstep system tools */ #undef GNUSTEP_TARGET_NETWORK_ADMIN_TOOLS /* Built in default value for GNUstep network apps */ #undef GNUSTEP_TARGET_NETWORK_APPS /* Built in default value for GNUstep network documentation */ #undef GNUSTEP_TARGET_NETWORK_DOC /* Built in default value for GNUstep network info documentation */ #undef GNUSTEP_TARGET_NETWORK_DOC_INFO /* Built in default value for GNUstep network manpages documentation */ #undef GNUSTEP_TARGET_NETWORK_DOC_MAN /* Built in default value for GNUstep network headers */ #undef GNUSTEP_TARGET_NETWORK_HEADERS /* Built in default value for GNUstep network libraries */ #undef GNUSTEP_TARGET_NETWORK_LIBRARIES /* Built in default value for GNUstep network library */ #undef GNUSTEP_TARGET_NETWORK_LIBRARY /* Built in default value for GNUstep network tools */ #undef GNUSTEP_TARGET_NETWORK_TOOLS /* Built in default value for GNUstep Network Users directory */ #undef GNUSTEP_TARGET_NETWORK_USERS_DIR /* Built in default value for GNUstep network web apps */ #undef GNUSTEP_TARGET_NETWORK_WEB_APPS /* Built in default value for GNUstep system apps */ #undef GNUSTEP_TARGET_SYSTEM_ADMIN_APPS /* Built in default value for GNUstep system tools */ #undef GNUSTEP_TARGET_SYSTEM_ADMIN_TOOLS /* Built in default value for GNUstep system apps */ #undef GNUSTEP_TARGET_SYSTEM_APPS /* Built in default value for GNUstep system documentation */ #undef GNUSTEP_TARGET_SYSTEM_DOC /* Built in default value for GNUstep system info documentation */ #undef GNUSTEP_TARGET_SYSTEM_DOC_INFO /* Built in default value for GNUstep system manpages documentation */ #undef GNUSTEP_TARGET_SYSTEM_DOC_MAN /* Built in default value for GNUstep system headers */ #undef GNUSTEP_TARGET_SYSTEM_HEADERS /* Built in default value for GNUstep system libraries */ #undef GNUSTEP_TARGET_SYSTEM_LIBRARIES /* Built in default value for GNUstep system library */ #undef GNUSTEP_TARGET_SYSTEM_LIBRARY /* Built in default value for GNUstep system tools */ #undef GNUSTEP_TARGET_SYSTEM_TOOLS /* Built in default value for GNUstep System Users directory */ #undef GNUSTEP_TARGET_SYSTEM_USERS_DIR /* Built in default value for GNUstep web apps */ #undef GNUSTEP_TARGET_SYSTEM_WEB_APPS /* Built in default value for GNUstep user config file */ #undef GNUSTEP_TARGET_USER_CONFIG_FILE /* Built in default value for GNUstep user defaults directory */ #undef GNUSTEP_TARGET_USER_DEFAULTS_DIR /* Built in default value for GNUstep user_dir admin apps */ #undef GNUSTEP_TARGET_USER_DIR_ADMIN_APPS /* Built in default value for GNUstep user_dir tools */ #undef GNUSTEP_TARGET_USER_DIR_ADMIN_TOOLS /* Built in default value for GNUstep user_dir apps */ #undef GNUSTEP_TARGET_USER_DIR_APPS /* Built in default value for GNUstep user_dir documentation */ #undef GNUSTEP_TARGET_USER_DIR_DOC /* Built in default value for GNUstep user_dir info documentation */ #undef GNUSTEP_TARGET_USER_DIR_DOC_INFO /* Built in default value for GNUstep user_dir manpages documentation */ #undef GNUSTEP_TARGET_USER_DIR_DOC_MAN /* Built in default value for GNUstep user_dir headers */ #undef GNUSTEP_TARGET_USER_DIR_HEADERS /* Built in default value for GNUstep user_dir libraries */ #undef GNUSTEP_TARGET_USER_DIR_LIBRARIES /* Built in default value for GNUstep user_dir library */ #undef GNUSTEP_TARGET_USER_DIR_LIBRARY /* Built in default value for GNUstep user_dir tools */ #undef GNUSTEP_TARGET_USER_DIR_TOOLS /* Built in default value for GNUstep user_dir web apps */ #undef GNUSTEP_TARGET_USER_DIR_WEB_APPS /* Define to 1 if you have the header file. */ #undef HAVE_ALLOCA_H /* Define to 1 if you have the header file. */ #undef HAVE_AVAHI_CLIENT_CLIENT_H /* Define to 1 if you have the `backtrace' function. */ #undef HAVE_BACKTRACE /* Define to 1 if you have the header file. */ #undef HAVE_BFD_H /* Have bfd_section_vma */ #undef HAVE_BFD_SECTION_VMA /* Define to 1 if you have the header file. */ #undef HAVE_CALLBACK_H /* Define to 1 if you have the `ctime' function. */ #undef HAVE_CTIME /* Define to 1 if you have the header file. */ #undef HAVE_CURL_CURL_H /* Define if you have currency_symbol field in struct lconv */ #undef HAVE_CURRENCY_SYMBOL_IN_LCONV /* Define to 1 if you have the header file. */ #undef HAVE_DBGHELP_H /* Define to 1 if you have the declaration of `strerror_r', and to 0 if you don't. */ #undef HAVE_DECL_STRERROR_R /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_DIRENT_H /* Define to 1 if you have the header file. */ #undef HAVE_DISPATCH_DISPATCH_H /* Define to 1 if you have the `dispatch_get_main_queue_handle_np' function. */ #undef HAVE_DISPATCH_GET_MAIN_QUEUE_HANDLE_NP /* Define to 1 if you have the header file. */ #undef HAVE_DISPATCH_H /* Define to 1 if you have the `dispatch_main_queue_drain_np' function. */ #undef HAVE_DISPATCH_MAIN_QUEUE_DRAIN_NP /* Define to 1 if you have the header file. */ #undef HAVE_DISPATCH_PRIVATE_H /* Define to 1 if you have the `dispatch_queue_create_with_target' function. */ #undef HAVE_DISPATCH_QUEUE_CREATE_WITH_TARGET /* Define to 1 if you have the `dladdr' function. */ #undef HAVE_DLADDR /* Define to 1 if you have the header file. */ #undef HAVE_DNS_SD_H /* Define to 1 if you have the header file. */ #undef HAVE_EXECINFO_H /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H /* Define to 1 if you have the `ffi_prep_closure_loc' function. */ #undef HAVE_FFI_PREP_CLOSURE_LOC /* Define to 1 if you have the header file. */ #undef HAVE_FLOAT_H /* Define if libobjc has the __objc_msg_forward2 function */ #undef HAVE_FORWARD2 /* Define to 1 if fseeko (and presumably ftello) exists and is declared. */ #undef HAVE_FSEEKO /* Define to 1 if you have the `getaddrinfo' function. */ #undef HAVE_GETADDRINFO /* Define to 1 if you have the `getcwd' function. */ #undef HAVE_GETCWD /* Define to 1 if you have the `geteuid' function. */ #undef HAVE_GETEUID /* Define to 1 if you have the `getgrgid' function. */ #undef HAVE_GETGRGID /* Define to 1 if you have the `getgrgid_r' function. */ #undef HAVE_GETGRGID_R /* Define to 1 if you have the `getgrnam' function. */ #undef HAVE_GETGRNAM /* Define to 1 if you have the `getgrnam_r' function. */ #undef HAVE_GETGRNAM_R /* Define to 1 if you have the `gethostbyaddr_r' function. */ #undef HAVE_GETHOSTBYADDR_R /* Define to 1 if you have the `gethostbyname' function. */ #undef HAVE_GETHOSTBYNAME /* Define to 1 if you have the `getlogin' function. */ #undef HAVE_GETLOGIN /* Define to 1 if you have the `getopt' function. */ #undef HAVE_GETOPT /* Define to 1 if you have the header file. */ #undef HAVE_GETOPT_H /* Define to 1 if you have the `getpwnam' function. */ #undef HAVE_GETPWNAM /* Define to 1 if you have the `getpwnam_r' function. */ #undef HAVE_GETPWNAM_R /* Define to 1 if you have the `getpwuid' function. */ #undef HAVE_GETPWUID /* Define to 1 if you have the `getpwuid_r' function. */ #undef HAVE_GETPWUID_R /* Define if you have gettid() */ #undef HAVE_GETTID /* Define if you have this function */ #undef HAVE_GICONV /* Define to 1 if you have the header file. */ #undef HAVE_GMP_H /* Define if libgnutls available */ #undef HAVE_GNUTLS /* Define to 1 if you have the `gnutls_transport_set_errno' function. */ #undef HAVE_GNUTLS_TRANSPORT_SET_ERRNO /* Define to 1 if you have the `gnutls_x509_privkey_import2' function. */ #undef HAVE_GNUTLS_X509_PRIVKEY_IMPORT2 /* Define to 1 if you have the `grantpt' function. */ #undef HAVE_GRANTPT /* Define to 1 if you have the header file. */ #undef HAVE_GRP_H /* Define if you have this function */ #undef HAVE_ICONV /* Define to 1 if you have the header file. */ #undef HAVE_ICU_H /* Define to 1 if you have the `inet_aton' function. */ #undef HAVE_INET_ATON /* Define to 1 if you have the `inet_ntop' function. */ #undef HAVE_INET_NTOP /* Define to 1 if you have the `inet_pton' function. */ #undef HAVE_INET_PTON /* Define if libobjc has thread-safe +initialize support */ #undef HAVE_INITIALIZE /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the `killpg' function. */ #undef HAVE_KILLPG /* Define if you can access the kernel via kvm_open */ #undef HAVE_KVM_ENV /* Define if you have and nl_langinfo(CODESET). */ #undef HAVE_LANGINFO_CODESET /* Define to 1 if you have the header file. */ #undef HAVE_LANGINFO_H /* Define to 1 if you have the `bfd' library (-lbfd). */ #undef HAVE_LIBBFD /* Define to 1 if you have the header file. */ #undef HAVE_LIBC_H /* Define to 1 if you have the `dl' library (-ldl). */ #undef HAVE_LIBDL /* Define to 1 if you have the `iberty' library (-liberty). */ #undef HAVE_LIBIBERTY /* Define to 1 if you have the `intl' library (-lintl). */ #undef HAVE_LIBINTL /* Define to 1 if you have the `kvm' library (-lkvm). */ #undef HAVE_LIBKVM /* Define to 1 if you have the `m' library (-lm). */ #undef HAVE_LIBM /* Define to 1 if you have the `rt' library (-lrt). */ #undef HAVE_LIBRT /* Define to 1 if you have the `socket' library (-lsocket). */ #undef HAVE_LIBSOCKET /* Define if libxml available */ #undef HAVE_LIBXML /* Define to 1 if you have the header file. */ #undef HAVE_LIBXML_SAX2_H /* Define if libxslt available */ #undef HAVE_LIBXSLT /* Define to 1 if you have the header file. */ #undef HAVE_LIBXSLT_XSLT_H /* Define to 1 if you have the `z' library (-lz). */ #undef HAVE_LIBZ /* Define to 1 if you have the header file. */ #undef HAVE_LIMITS_H /* Define to 1 if you have the `link' function. */ #undef HAVE_LINK /* Define if your Obj-C compiler calls +load methods before main */ #undef HAVE_LOAD_METHOD /* Define to 1 if you have the header file. */ #undef HAVE_LOCALE_H /* Define to 1 if you have the header file. */ #undef HAVE_MALLOC_H /* Define to 1 if you have the `malloc_usable_size' function. */ #undef HAVE_MALLOC_USABLE_SIZE /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `mkstemp' function. */ #undef HAVE_MKSTEMP /* Define to 1 if you have the `mmap' function. */ #undef HAVE_MMAP /* Define to 1 if you have the `mprotect' function. */ #undef HAVE_MPROTECT /* Define to 1 if you have the `nanosleep' function. */ #undef HAVE_NANOSLEEP /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_NDIR_H /* Define to 1 if you have the header file. */ #undef HAVE_NETINET_IN_H /* Define if objc-api.h defines this function */ #undef HAVE_OBJC_GET_UNINSTALLED_DTABLE /* Define to 1 if you have the header file. */ #undef HAVE_OBJC_OBJC_H /* Says whether the objc_root_class attribute works */ #undef HAVE_OBJC_ROOT_CLASS_ATTRIBUTE /* Define to 1 if you have the header file. */ #undef HAVE_OBJC_RUNTIME_H /* Define to 1 if you have the `objc_setProperty' function. */ #undef HAVE_OBJC_SETPROPERTY /* Define to 1 if you have the `objc_sync_enter' function. */ #undef HAVE_OBJC_SYNC_ENTER /* Define to 1 if you have the `poll' function. */ #undef HAVE_POLL /* Define if poll is NOT emulated via select */ #undef HAVE_POLL_F /* Define to 1 if you have the header file. */ #undef HAVE_POLL_H /* Define to 1 if you have the `posix_memalign' function. */ #undef HAVE_POSIX_MEMALIGN /* Define if system supports the /proc filesystem */ #undef HAVE_PROCFS /* Define to 1 if you have the header file. */ #undef HAVE_PROCFS_H /* Define if system supports reading psinfo from /proc */ #undef HAVE_PROCFS_PSINFO /* Define if your Lib C defines program_invocation_name */ #undef HAVE_PROGRAM_INVOCATION_NAME /* Define to 1 if you have the `pthread_getthreadid_np' function. */ #undef HAVE_PTHREAD_GETTHREADID_NP /* Define to 1 if you have the header file. */ #undef HAVE_PTHREAD_H /* Define to 1 if you have the `pthread_main_np' function. */ #undef HAVE_PTHREAD_MAIN_NP /* Define if you have pthread_mutex_t.__data.__owner */ #undef HAVE_PTHREAD_MUTEX_OWNER /* Define to 1 if you have the header file. */ #undef HAVE_PTHREAD_NP_H /* Define to 1 if you have the `pthread_spin_lock' function. */ #undef HAVE_PTHREAD_SPIN_LOCK /* Define this if you work on sysv */ #undef HAVE_PTS_STREAM_MODULES /* Define to 1 if you have the header file. */ #undef HAVE_PWD_H /* Define if you have pw_gecos field in struct passwd */ #undef HAVE_PW_GECOS_IN_PASSWD /* Define to 1 if you have the `readlink' function. */ #undef HAVE_READLINK /* Define to 1 if you have the `realpath' function. */ #undef HAVE_REALPATH /* Define if you have the register_printf_function function */ #undef HAVE_REGISTER_PRINTF_FUNCTION /* Define to 1 if you have the `register_printf_specifier' function. */ #undef HAVE_REGISTER_PRINTF_SPECIFIER /* Define to 1 if you have the `rint' function. */ #undef HAVE_RINT /* Define if your system has variable length network addresses */ #undef HAVE_SA_LEN /* Define to 1 if you have the `setpgid' function. */ #undef HAVE_SETPGID /* Define to 1 if you have the `setpgrp' function. */ #undef HAVE_SETPGRP /* Define to 1 if you have the `setrlimit' function. */ #undef HAVE_SETRLIMIT /* Define to 1 if you have the `setsid' function. */ #undef HAVE_SETSID /* Define if libobjc has the objc_setUncaughtExceptionHandler() function */ #undef HAVE_SET_UNCAUGHT_EXCEPTION_HANDLER /* Define if libobjc has the objc_set_unexpected() function */ #undef HAVE_SET_UNEXPECTED /* Define to 1 if you have the `shmctl' function. */ #undef HAVE_SHMCTL /* Define to 1 if you have the `sigaction' function. */ #undef HAVE_SIGACTION /* Define to 1 if you have the header file. */ #undef HAVE_SIGNAL_H /* Define to 1 if you have the `sigsetjmp' function. */ #undef HAVE_SIGSETJMP /* Define to 1 if you have the `Sleep' function. */ #undef HAVE_SLEEP /* Define to 1 if you have the `slogf' function. */ #undef HAVE_SLOGF /* Define to 1 if you have the `snprintf' function. */ #undef HAVE_SNPRINTF /* Define to 1 if the system has the type `socklen_t'. */ #undef HAVE_SOCKLEN_T /* Define to 1 if you have the `statvfs' function. */ #undef HAVE_STATVFS /* Define to 1 if you have the header file. */ #undef HAVE_STDBOOL_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the `strerror' function. */ #undef HAVE_STRERROR /* Define to 1 if you have the `strerror_r' function. */ #undef HAVE_STRERROR_R /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if `st_birthtimespec' is a member of `struct stat64'. */ #undef HAVE_STRUCT_STAT64_ST_BIRTHTIMESPEC /* Define to 1 if `st_birthtim' is a member of `struct stat'. */ #undef HAVE_STRUCT_STAT_ST_BIRTHTIM /* Define to 1 if `st_birthtime' is a member of `struct stat'. */ #undef HAVE_STRUCT_STAT_ST_BIRTHTIME /* Define to 1 if `st_birthtimespec' is a member of `struct stat'. */ #undef HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC /* Define to 1 if `st_mtim' is a member of `struct stat'. */ #undef HAVE_STRUCT_STAT_ST_MTIM /* Define to 1 if you have the `symlink' function. */ #undef HAVE_SYMLINK /* Define to 1 if you have the `sysctlbyname' function. */ #undef HAVE_SYSCTLBYNAME /* Define to 1 if you have the `syslog' function. */ #undef HAVE_SYSLOG /* Define to 1 if you have the header file. */ #undef HAVE_SYSLOG_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_CDEFS_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_DIR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_FCNTL_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_FILE_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_FILIO_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_IOCTL_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_MMAN_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_MOUNT_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_NDIR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PARAM_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_RESOURCE_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_RUSAGE_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SIGNAL_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SLOGCODES_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SLOG_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SOCKET_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STATFS_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STATVFS_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STROPTS_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SYSCTL_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SYSLIMITS_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_UTSNAME_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_VFS_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_WAIT_H /* Define to 1 if you have the `time' function. */ #undef HAVE_TIME /* Define to 1 if you have the `times' function. */ #undef HAVE_TIMES /* Define to 1 if you have the header file. */ #undef HAVE_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_TZFILE_H /* Define to 1 if you have the `tzset' function. */ #undef HAVE_TZSET /* Define to 1 if you have the header file. */ #undef HAVE_UCBINCLUDE_SYS_RESOURCE_H /* Define to 1 if the system has the type `uintmax_t'. */ #undef HAVE_UINTMAX_T /* Define if libobjc has the _objc_unexpected_exception callback */ #undef HAVE_UNEXPECTED /* Define to 1 if you have the header file. */ #undef HAVE_UNICODE_UCAL_H /* Define to 1 if you have the header file. */ #undef HAVE_UNICODE_UCNV_H /* Define to 1 if you have the header file. */ #undef HAVE_UNICODE_UCOL_H /* Define to 1 if you have the header file. */ #undef HAVE_UNICODE_UCURR_H /* Define to 1 if you have the header file. */ #undef HAVE_UNICODE_UDATPG_H /* Define to 1 if you have the header file. */ #undef HAVE_UNICODE_UDAT_H /* Define to 1 if you have the header file. */ #undef HAVE_UNICODE_ULOCDATA_H /* Define to 1 if you have the header file. */ #undef HAVE_UNICODE_ULOC_H /* Define to 1 if you have the header file. */ #undef HAVE_UNICODE_UNORM2_H /* Define to 1 if you have the header file. */ #undef HAVE_UNICODE_UNUM_H /* Define to 1 if you have the header file. */ #undef HAVE_UNICODE_UREGEX_H /* Define to 1 if you have the header file. */ #undef HAVE_UNICODE_USEARCH_H /* Define to 1 if you have the header file. */ #undef HAVE_UNICODE_USTRING_H /* Define to 1 if you have the header file. */ #undef HAVE_UNICODE_UTEXT_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the header file. */ #undef HAVE_UNWIND_H /* Define to 1 if you have the `usleep' function. */ #undef HAVE_USLEEP /* Define to 1 if you have the `utimensat' function. */ #undef HAVE_UTIMENSAT /* Define to 1 if you have the header file. */ #undef HAVE_UTIME_H /* Define to 1 if you have the `valloc' function. */ #undef HAVE_VALLOC /* Define to 1 if you have the `vasprintf' function. */ #undef HAVE_VASPRINTF /* Says whether the visibility attribute works */ #undef HAVE_VISIBILITY_ATTRIBUTE /* Define to 1 if you have the `vsnprintf' function. */ #undef HAVE_VSNPRINTF /* Define to 1 if you have the `vsprintf' function. */ #undef HAVE_VSPRINTF /* Define to 1 if you have the header file. */ #undef HAVE_WCHAR_H /* Define if register_printf_function supports wide characters */ #undef HAVE_WIDE_PRINTF_FUNCTION /* Define to 1 if you have the header file. */ #undef HAVE_WINDOWS_H /* Define to 1 if you have the header file. */ #undef HAVE_WS2TCPIP_H /* Define to 1 if you have the header file. */ #undef HAVE_ZLIB_H /* Define to 1 if you have the `_Block_copy' function. */ #undef HAVE__BLOCK_COPY /* Define to 1 if you have the `_dispatch_get_main_queue_handle_4CF' function. */ #undef HAVE__DISPATCH_GET_MAIN_QUEUE_HANDLE_4CF /* Define to 1 if you have the `_dispatch_main_queue_callback_4CF' function. */ #undef HAVE__DISPATCH_MAIN_QUEUE_CALLBACK_4CF /* Define to 1 if you have the `_Unwind_GetIP' function. */ #undef HAVE__UNWIND_GETIP /* Define to 1 if you have the `__builtin_extract_return_address' function. */ #undef HAVE___BUILTIN_EXTRACT_RETURN_ADDRESS /* Define if your system needs to have short/int word aligned */ #undef NEED_WORD_ALIGNMENT /* Disable GNUSTEP_CONFIG_FILE environment variable */ #undef OPTION_NO_ENVIRONMENT /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define as the link to exe of process in /proc filesystem. */ #undef PROCFS_EXE_LINK /* Description: Define setname function for pthread with three args */ #undef PTHREAD_SETNAME /* Define to 1 if the `setpgrp' function takes no argument. */ #undef SETPGRP_VOID /* The size of `CONDITION_VARIABLE', as computed by sizeof. */ #undef SIZEOF_CONDITION_VARIABLE /* The size of `double', as computed by sizeof. */ #undef SIZEOF_DOUBLE /* The size of `float', as computed by sizeof. */ #undef SIZEOF_FLOAT /* The size of `gs_mutex_t', as computed by sizeof. */ #undef SIZEOF_GS_MUTEX_T /* The size of `int', as computed by sizeof. */ #undef SIZEOF_INT /* The size of `long', as computed by sizeof. */ #undef SIZEOF_LONG /* The size of `long long', as computed by sizeof. */ #undef SIZEOF_LONG_LONG /* The size of `pthread_cond_t', as computed by sizeof. */ #undef SIZEOF_PTHREAD_COND_T /* The size of `pthread_mutex_t', as computed by sizeof. */ #undef SIZEOF_PTHREAD_MUTEX_T /* The size of `short', as computed by sizeof. */ #undef SIZEOF_SHORT /* The size of `SRWLOCK', as computed by sizeof. */ #undef SIZEOF_SRWLOCK /* The size of `void*', as computed by sizeof. */ #undef SIZEOF_VOIDP /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define to 1 if strerror_r returns char *. */ #undef STRERROR_R_CHAR_P /* Define if the compiler provides builtins for atomic operations */ #undef USE_ATOMIC_BUILTINS /* Define to use bfd library for stack traces */ #undef USE_BFD /* Define if using the ffcall library for invocations */ #undef USE_FFCALL /* Define if using the libffi library for invocations */ #undef USE_LIBFFI /* Enable extensions on AIX 3, Interix. */ #ifndef _ALL_SOURCE # undef _ALL_SOURCE #endif /* Enable GNU extensions on systems that have them. */ #ifndef _GNU_SOURCE # undef _GNU_SOURCE #endif /* Enable threading extensions on Solaris. */ #ifndef _POSIX_PTHREAD_SEMANTICS # undef _POSIX_PTHREAD_SEMANTICS #endif /* Enable extensions on HP NonStop. */ #ifndef _TANDEM_SOURCE # undef _TANDEM_SOURCE #endif /* Enable general extensions on Solaris. */ #ifndef __EXTENSIONS__ # undef __EXTENSIONS__ #endif /* Define if vasprintf returns the length printed */ #undef VASPRINTF_RETURNS_LENGTH /* Define if vsprintf returns the length printed */ #undef VSPRINTF_RETURNS_LENGTH /* Have and use Unwind library */ #undef WITH_UNWIND /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel). */ #if defined AC_APPLE_UNIVERSAL_BUILD # if defined __BIG_ENDIAN__ # define WORDS_BIGENDIAN 1 # endif #else # ifndef WORDS_BIGENDIAN # undef WORDS_BIGENDIAN # endif #endif /* Enable large inode numbers on Mac OS X 10.5. */ #ifndef _DARWIN_USE_64_BIT_INODE # define _DARWIN_USE_64_BIT_INODE 1 #endif /* Number of bits in a file offset, on hosts where this is settable. */ #undef _FILE_OFFSET_BITS /* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */ #undef _LARGEFILE_SOURCE /* Define for large files, on AIX-style hosts. */ #undef _LARGE_FILES /* Define to 1 if on MINIX. */ #undef _MINIX /* Define to 2 if the system does not provide POSIX.1 features except with this defined. */ #undef _POSIX_1_SOURCE /* Define to 1 if you need to in order for `stat' and other things to work. */ #undef _POSIX_SOURCE /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus #undef inline #endif /* Define to `long int' if does not define. */ #undef off_t /* Define to `unsigned int' if does not define. */ #undef size_t /* Define `fseeko' to `fseek' if the former is missing. Likewise for `ftello'. */ #if !HAVE_FSEEKO # define fseeko fseek # define ftello ftell #endif gnustep-base-1.29.0/Headers/ObjectiveC2/000077500000000000000000000000001435650067400176645ustar00rootroot00000000000000gnustep-base-1.29.0/Headers/ObjectiveC2/objc/000077500000000000000000000000001435650067400206015ustar00rootroot00000000000000gnustep-base-1.29.0/Headers/ObjectiveC2/objc/Availability.h000066400000000000000000000010271435650067400233640ustar00rootroot00000000000000 #ifdef STRICT_MACOS_X # define OBJC_NONPORTABLE __attribute__((error("Function not supported by the Apple runtime"))) #else # define OBJC_NONPORTABLE #endif #if !defined(OBJC_DEPRECATED) # if !defined(__DEPRECATE_DIRECT_ACCESS) || defined(__OBJC_LEGACY_GNU_MODE__) || defined(__OBJC_RUNTIME_INTERNAL__) # define OBJC_DEPRECATED # else # if ((__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR >= 1)) # define OBJC_DEPRECATED __attribute__((deprecated)) # else # define OBJC_DEPRECATED # endif # endif #endif gnustep-base-1.29.0/Headers/ObjectiveC2/objc/blocks_runtime.h000066400000000000000000000006251435650067400237750ustar00rootroot00000000000000/* * Blocks Runtime */ #ifdef __cplusplus #define BLOCKS_EXPORT extern "C" #else #define BLOCKS_EXPORT extern #endif BLOCKS_EXPORT void *_Block_copy(const void *); BLOCKS_EXPORT void _Block_release(const void *); BLOCKS_EXPORT const char *_Block_get_types(const void*); #define Block_copy(x) ((__typeof__(x))_Block_copy((const void *)(x))) #define Block_release(x) _Block_release((const void *)(x)) gnustep-base-1.29.0/Headers/ObjectiveC2/objc/capabilities.h000066400000000000000000000045541435650067400234130ustar00rootroot00000000000000/** * capabilities.h - This file defines the list of capabilities. Runtime * capabilities can be checked. You may use #ifdef to test at compile time * whether the runtime on the current platform understands the capability. * This does not mean that the runtime implements the capability, however. * * A copy of this file exists for compatibility in GNUstep's Objective-C * framework. When using this framework in conjunction with the GNU * Objective-C runtime, most of the features will not be supported at run time, * even if the corresponding macros are available at compile time. * Additionally, several are compile-time options in the GNUstep runtime, so * although they are present in the header and understood by the runtime, they * may not be supported by the installed runtime. */ /** * The runtime supports zero-cost exceptions. */ #define OBJC_CAP_EXCEPTIONS 0 /** * The runtime supports the @synchronize directive. */ #define OBJC_CAP_SYNCRONIZE 1 /** * The runtime supports property accessors. */ #define OBJC_CAP_PROPERTIES 2 /** * The runtime supports introspection on declared properties. */ #define OBJC_CAP_PROPERTY_INTROSPECTION 3 /** * The runtime supports optional methods and declared properties in protocols. */ #define OBJC_CAP_OPTIONAL_PROTOCOLS 4 /** * The runtime supports non-fragile instance variables. */ #define OBJC_CAP_NONFRAGILE_IVARS 5 /** * The runtime supports making method lookup dependent on the types, as well as * the name, of the selector. */ #define OBJC_CAP_TYPE_DEPENDENT_DISPATCH 6 /** * The runtime was compiled in the low-memory profile. This trades some speed * for reduced memory consumption. */ #define OBJC_CAP_LOW_MEMORY 7 /** * Macro used to require the existence of a specific capability. This creates * a function that is called by the loader and tests that the runtime supports * the required capability, aborting if it does not. */ #define OBJC_REQUIRE_CAPABILITY(x) \ __attribute__((constructor)) static void objc_test ## x(void)\ {\ if (!objc_test_capability(x))\ {\ fprintf(stderr, "Runtime does not support required property: " #x "\n");\ exit(1);\ }\ } /** * Run time feature test. This function returns 1 if the runtime supports the * specified feature or 0 if it does not. */ int objc_test_capability(int x); gnustep-base-1.29.0/Headers/ObjectiveC2/objc/runtime.h000066400000000000000000000176561435650067400224540ustar00rootroot00000000000000#ifndef __OBJECTIVEC2_RUNTIME_H_INCLUDED__ #define __OBJECTIVEC2_RUNTIME_H_INCLUDED__ #ifdef HAVE_STDINT_H #include #else #include #endif #include #include #include "ObjectiveC2/objc/Availability.h" #if defined(ERROR_UNSUPPORTED_RUNTIME_FUNCTIONS) # define OBJC_GNU_RUNTIME_UNSUPPORTED(x) \ __attribute__((error(x " not supported by the GNU runtime"))) #else # define OBJC_GNU_RUNTIME_UNSUPPORTED(x) #endif #if !defined(OBJC_DEPRECATED) # if !defined(__DEPRECATE_DIRECT_ACCESS) || defined(__OBJC_LEGACY_GNU_MODE__) || defined(__OBJC_RUNTIME_INTERNAL__) # define OBJC_DEPRECATED # else # if ((__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR >= 1)) # define OBJC_DEPRECATED __attribute__((deprecated)) # else # define OBJC_DEPRECATED # endif # endif #endif // Undo GNUstep substitutions #ifdef class_setVersion #undef class_setVersion #endif #ifdef class_getClassMethod #undef class_getClassMethod #endif #ifdef objc_getClass #undef objc_getClass #endif #ifdef objc_lookUpClass #undef objc_lookUpClass #endif typedef struct objc_ivar* Ivar; #ifndef __objc_INCLUDE_GNU typedef const struct objc_selector *SEL; typedef struct objc_class *Class; typedef struct objc_object { Class isa; } *id; struct objc_super { id receiver; # if !defined(__cplusplus) && !__OBJC2__ Class class; # else Class super_class; # endif }; typedef id (*IMP)(id, SEL, ...); typedef struct objc_method *Method; # ifdef STRICT_APPLE_COMPATIBILITY typedef signed char BOOL; # else # ifdef __vxwords typedef int BOOL # else typedef unsigned char BOOL; # endif # endif #else // Method in the GNU runtime is a struct, Method_t is the pointer # define Method Method_t #endif // __objc_INCLUDE_GNU typedef void *objc_property_t; #ifdef __OBJC__ @class Protocol; #else typedef struct objc_protocol Protocol; #endif #ifndef YES #define YES ((BOOL)1) #endif #ifndef NO #define NO ((BOOL)0) #endif #ifdef __GNUC #define _OBJC_NULL_PTR __null #elif defined(__cplusplus) #define _OBJC_NULL_PTR 0 #else #define _OBJC_NULL_PTR ((void*)0) #endif #ifndef nil #define nil ((id)_OBJC_NULL_PTR) #endif #ifndef Nil #define Nil ((Class)_OBJC_NULL_PTR) #endif BOOL class_addIvar(Class cls, const char *name, size_t size, uint8_t alignment, const char *types); BOOL class_addMethod(Class cls, SEL name, IMP imp, const char *types); BOOL class_addProtocol(Class cls, Protocol *protocol); BOOL class_conformsToProtocol(Class cls, Protocol *protocol); Ivar * class_copyIvarList(Class cls, unsigned int *outCount); Method * class_copyMethodList(Class cls, unsigned int *outCount); OBJC_GNU_RUNTIME_UNSUPPORTED("Property introspection") objc_property_t * class_copyPropertyList(Class cls, unsigned int *outCount); Protocol ** class_copyProtocolList(Class cls, unsigned int *outCount); id class_createInstance(Class cls, size_t extraBytes); Method class_getClassMethod(Class aClass, SEL aSelector); Ivar class_getClassVariable(Class cls, const char* name); Method class_getInstanceMethod(Class aClass, SEL aSelector); size_t class_getInstanceSize(Class cls); Ivar class_getInstanceVariable(Class cls, const char* name); const char *class_getIvarLayout(Class cls); IMP class_getMethodImplementation(Class cls, SEL name); IMP class_getMethodImplementation_stret(Class cls, SEL name); const char * class_getName(Class cls); OBJC_GNU_RUNTIME_UNSUPPORTED("Property introspection") objc_property_t class_getProperty(Class cls, const char *name); Class class_getSuperclass(Class cls); int class_getVersion(Class theClass); OBJC_GNU_RUNTIME_UNSUPPORTED("Weak instance variables") const char *class_getWeakIvarLayout(Class cls); BOOL class_isMetaClass(Class cls); IMP class_replaceMethod(Class cls, SEL name, IMP imp, const char *types); BOOL class_respondsToSelector(Class cls, SEL sel); void class_setIvarLayout(Class cls, const char *layout); OBJC_DEPRECATED Class class_setSuperclass(Class cls, Class newSuper); void class_setVersion(Class theClass, int version); OBJC_GNU_RUNTIME_UNSUPPORTED("Weak instance variables") void class_setWeakIvarLayout(Class cls, const char *layout); const char * ivar_getName(Ivar ivar); ptrdiff_t ivar_getOffset(Ivar ivar); const char * ivar_getTypeEncoding(Ivar ivar); char * method_copyArgumentType(Method method, unsigned int index); char * method_copyReturnType(Method method); void method_exchangeImplementations(Method m1, Method m2); void method_getArgumentType(Method method, unsigned int index, char *dst, size_t dst_len); IMP method_getImplementation(Method method); SEL method_getName(Method method); unsigned method_getNumberOfArguments(Method method); void method_getReturnType(Method method, char *dst, size_t dst_len); const char * method_getTypeEncoding(Method method); IMP method_setImplementation(Method method, IMP imp); Class objc_allocateClassPair(Class superclass, const char *name, size_t extraBytes); OBJC_NONPORTABLE Class objc_allocateMetaClass(Class superclass, size_t extraBytes); void objc_disposeClassPair(Class cls); id objc_getClass(const char *name); int objc_getClassList(Class *buffer, int bufferLen); id objc_getMetaClass(const char *name); id objc_getRequiredClass(const char *name); id objc_lookUpClass(const char *name); Class objc_allocateClassPair(Class superclass, const char *name, size_t extraBytes); Protocol *objc_getProtocol(const char *name); void objc_registerClassPair(Class cls); void *object_getIndexedIvars(id obj); // FIXME: The GNU runtime has a version of this which omits the size parameter //id object_copy(id obj, size_t size); id object_dispose(id obj); Class object_getClass(id obj); Class object_setClass(id obj, Class cls); const char *object_getClassName(id obj); IMP objc_msg_lookup(id, SEL); IMP objc_msg_lookup_super(struct objc_super*, SEL); OBJC_GNU_RUNTIME_UNSUPPORTED("Protocol introspection") Protocol **objc_copyProtocolList(unsigned int *count); BOOL protocol_conformsToProtocol(Protocol *p, Protocol *other); struct objc_method_description *protocol_copyMethodDescriptionList(Protocol *p, BOOL isRequiredMethod, BOOL isInstanceMethod, unsigned int *count); OBJC_GNU_RUNTIME_UNSUPPORTED("Protocol introspection") objc_property_t *protocol_copyPropertyList(Protocol *p, unsigned int *count); Protocol **protocol_copyProtocolList(Protocol *p, unsigned int *count); struct objc_method_description protocol_getMethodDescription(Protocol *p, SEL aSel, BOOL isRequiredMethod, BOOL isInstanceMethod); const char *protocol_getName(Protocol *p); OBJC_GNU_RUNTIME_UNSUPPORTED("Protocol introspection") objc_property_t protocol_getProperty(Protocol *p, const char *name, BOOL isRequiredProperty, BOOL isInstanceProperty); BOOL protocol_isEqual(Protocol *p, Protocol *other); // Only enable support for object planes when // -fobjc-sender-dependent-dispatch is specified #ifdef __OBJC_SENDER_AWARE_DISPATCH__ // Global self so that self is a valid symbol everywhere. Will be replaced by // a real self in an inner scope if there is one. static const id self = nil; #define objc_msgSend(theReceiver, theSelector, ...) objc_msg_lookup_sender(theReceiver, theSelector, self)(theReceiver, theSelector, ## __VA_ARGS__) #endif #if (GCC_VERSION >= 3000) #define objc_msgSend(theReceiver, theSelector, ...) objc_msg_lookup(theReceiver, theSelector)(theReceiver, theSelector, ## __VA_ARGS__) #define objc_msgSendSuper(super, op, ...) objc_msg_lookup_super(super, op)(super->receiver, op, ## __VA_ARGS__) #else /* GCC_VERSION >= 3000 */ #define objc_msgSend(theReceiver, theSelector, args...) objc_msg_lookup(theReceiver, theSelector)(theReceiver, theSelector, args) #define objc_msgSendSuper(super, op, args...) objc_msg_lookup_super(super, op)(super->receiver, op, args) #endif /* GCC_VERSION >= 3000 */ const char *sel_getName(SEL sel); SEL sel_getUid(const char *selName); BOOL sel_isEqual(SEL sel1, SEL sel2); SEL sel_registerName(const char *selName); #endif // __OBJECTIVEC2_RUNTIME_H_INCLUDED gnustep-base-1.29.0/INSTALL000066400000000000000000000121721435650067400152460ustar00rootroot000000000000001 Introduction ============== If you are installing this package as part of the GNUstep core packages, read the file GNUstep-HOWTO for more complete instructions on how to install the entire GNUstep package (including this library). GNUstep-HOWTO is located in the gnustep-make package or at This version of gnustep-base requires gnustep-make version 2.0.0 or higher. Other external libraries that you may need to install include: * ffi (HIGHLY RECOMMENDED) * icu (HIGHLY RECOMMENDED) * gnutls (HIGHLY RECOMMENDED) * libxml2 (RECOMMENDED) * libcurl (RECOMMENDED) * libdispatch (RECOMMENDED) * libxslt (OPTIONAL) * iconv (OPTIONAL, not needed if you have glibc) * openssl (OPTIONAL, not needed if you have gnutls) If you are installing the GNUstep libraries individually, make sure you have installed the GNUstep Makefile package (gnustep-make) already, and you have sourced the makefile script: . $GNUSTEP_SYSTEM_ROOT/Library/Makefiles/GNUstep.sh See the GNUstep-HOWTO for more information. After installing this library you should install gnustep-gui if you are going to use graphical applications. When you configure this library, make sure you use the same configuration options as with gstep-make. Some additional options to configure are described below. Quick installation instructions: ./configure make make install To make and install the documentation: cd Documentation make make install 2 Configuration =============== Configuration is performed by running the 'configure' program at a shell prompt. You may want to use some of the optional arguments to the 'configure' program. Type 'configure --help' for a list of these. It is not likely that you will need to use the '--prefix' option, since gstep-base will automatically install in the directory specified by the 'GNUSTEP_SYSTEM_ROOT' environment variable (specified when you installed gnustep-make). Some configuration options for the base library need to be specified when configuring the gnustep-make package. In most cases, it is a good idea to specify the same configuration options when configuring both packages, just to make sure. Also make sure you've read the machine-specific instructions for your particular operating system and CPU. These instructions come with the GNUstep-HOWTO and are also located at the GNUstep web site at . 2.1 Reading Command-Line Arguments ---------------------------------- There are two features that change how GNUstep gets access to command-line arguments and environment variables (normally passed to the program in the 'main()' function. These features are '--enable-pass-arguments' and the '--enable-fake-main' option(s). The fake-main option _secretly_ renames the 'main()' function and substitutes it's own function which stores the command line arguments before calling the real main. The pass-arguments option absolves GNUstep of any effort to get the command-line arguments and instead forces the developer to insert the line [NSProcessInfo initializeWithArguments:argv count:argc environment:env]; in the 'main()' function of their program. Normally, the configure script will determine if a program can read process information directly from the system (for use by the class NSProcessInfo) and enable or disable the fake-main hack automatically, but if you find that configure is not doing this correctly, you can force the fake-main hack to be used, which will always work. Note that if the fake-main hack is enabled, you need to include the header file GSConfig.h in you main program - this is done by default if you include NSObject.h or Foundation.h. If you want to avoid the whole idea of the fake-main hack, you can use the pass-arguments option. In this case you will be forced to call the NSProcessInfo initializeWithArguments method to pass the program arguments to NSProcessInfo (This would be done automatically if you use the NSApplicationMain function in a gui application). 2.2 FFI Library --------------- GNUstep's NSInvocations and Distributed Objects code involves detailed manipulation of the stack and function calls using a library that implements a Foreign-Function Interface (FFI), such as the libffi library. Use of libffi is automatically enabled if the libffi library is found (and the same with ffcall, although libffi takes precedence), unless specifically disabled with '--disable-do'. 3 Compilation ============= To compile this library, type make. After this is complete, type make install (make sure you are the root user). Some additional options you can use with make are 'debug=yes' to make a debugging version of the library and 'shared=no' to make a static version of the library. See the gstep-make package for more information on these options. If you can't install gstep-base as root, be sure to edit the 'Tools/gdomap.h' file and uncomment the last line. Copyright (C) 2005 Free Software Foundation Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. gnustep-base-1.29.0/MISSING000066400000000000000000000644611435650067400152610ustar00rootroot00000000000000Missing macros: NS_ENUM NS_OPTIONS NS_AVAILABLE NS_RETURNS_INNER_POINTER NS_ENUM_AVAILABLE NS_BLOCKS_AVAILABLE NS_CLASS_AVAILABLE NS_AVAILABLE_MAC NS_ENUM_AVAILABLE_IOS NS_DEPRECATED NS_UNAVAILABLE NS_AUTOMATED_REFCOUNT_WEAK_UNAVAILABLE NS_AVAILABLE_IOS Missing headers: == NONE ------------------------------------------------------------- FoundationErrors: NSFileWriteFileExistsError NSFileWriteVolumeReadOnlyError NSFeatureUnsupportedError NSPropertyListReadCorruptError NSPropertyListReadUnknownVersionError NSPropertyListReadStreamError NSPropertyListWriteStreamError NSPropertyListErrorMinimum NSPropertyListErrorMaximum NSXPCConnectionInterrupted NSXPCConnectionInvalid NSXPCConnectionReplyInvalid NSXPCConnectionErrorMinimum NSXPCConnectionErrorMaximum ------------------------------------------------------------- NSAttributedString: NSAttributedStringEnumerationReverse NSAttributedStringEnumerationLongestEffectiveRangeNotRequired - enumerateAttributesInRange:options:usingBlock: - enumerateAttribute:inRange:options:usingBlock: ------------------------------------------------------------- NSBundle: - sharedFrameworksURL - sharedSupportURL - appStoreReceiptURL - sharedFrameworksPath - sharedSupportPath + URLsForResourcesWithExtension:subdirectory:inBundleWithURL: - URLsForResourcesWithExtension:subdirectory: - URLsForResourcesWithExtension:subdirectory:localization: /** Not implemented */ (GNUstep comment) - executableArchitectures; ------------------------------------------------------------- NSByteOrder: NSSwappedFloat — incompatible declaration NSSwappedDouble — incompatible declaration ------------------------------------------------------------- NSCalendar: NSWeekOfMonthCalendarUnit NSWeekOfYearCalendarUnit NSYearForWeekOfYearCalendarUnit NSCalendarCalendarUnit NSTimeZoneCalendarUnit - weekOfMonth - weekOfYear - yearForWeekOfYear - isLeapMonth - setWeekOfMonth: - setWeekOfYear: - setYearForWeekOfYear: - setLeapMonth: - date ------------------------------------------------------------- NSCharacterSet: NSOpenStepUnicodeReservedBase ------------------------------------------------------------- NSCoder: - requiresSecureCoding - decodeObjectOfClass:forKey: - decodeObjectOfClasses:forKey: - decodePropertyListForKey: - allowedClasses - encodeNXObject: - decodeNXObject: ------------------------------------------------------------- NSComparisonPredicate: NSNormalizedPredicateOption ------------------------------------------------------------- NSConnection: - dispatchWithComponents: - connection:shouldMakeNewConnection: - createConversationForConnection: - connection:handleRequest: - invocation - connection - conversation - replyWithException ------------------------------------------------------------- NSData: NSDataReadingMappedIfSafe NSDataReadingUncached NSDataReadingMappedAlways NSDataWritingAtomic NSDataWritingWithoutOverwriting NSDataWritingFileProtectionNone NSDataWritingFileProtectionComplete NSDataWritingFileProtectionCompleteUnlessOpen NSDataWritingFileProtectionCompleteUntilFirstUserAuthentication NSDataWritingFileProtectionMask NSDataSearchBackwards NSDataSearchAnchored - rangeOfData:options:range: + dataWithContentsOfFile:options:error: + dataWithContentsOfURL:options:error: - initWithContentsOfFile:options:error: - initWithContentsOfURL:options:error: @inteface NSPurgeableData ------------------------------------------------------------- NSDate: NSSystemClockDidChangeNotification ------------------------------------------------------------- NSDebug: NSObjectAutoreleasedEvent NSObjectExtraRefIncrementedEvent NSObjectExtraRefDecrementedEvent NSObjectInternalRefIncrementedEvent NSObjectInternalRefDecrementedEvent NSKeepAllocationStatistics NSIsFreedObject() NSRecordAllocationEvent() @interface NSAutoreleasePool (NSAutoreleasePoolDebugging) ------------------------------------------------------------- NSDecimal: NSDecimal — incompatible declaration ------------------------------------------------------------- NSDecimalNumber: NSDecimalNumberExactnessException NSDecimalNumberOverflowException NSDecimalNumberUnderflowException NSDecimalNumberDivideByZeroException @interface NSScanner (NSDecimalNumberScanning) ------------------------------------------------------------- NSDictionary: @interface NSDictionary (NSSharedKeySetDictionary) @interface NSMutableDictionary (NSSharedKeySetDictionary) ------------------------------------------------------------- NSDistributedNotificationCenter: NSNotificationDeliverImmediately NSNotificationPostToAllSessions - postNotificationName:object:userInfo:options: ------------------------------------------------------------- NSError: NSHelpAnchorErrorKey - helpAnchor ------------------------------------------------------------- NSException: @class NSAssertionHandler ------------------------------------------------------------- NSExpression: @class NSPredicate NSUnionSetExpressionType NSIntersectSetExpressionType NSMinusSetExpressionType NSSubqueryExpressionType NSAggregateExpressionType + expressionWithFormat:argumentArray: + expressionWithFormat: + expressionWithFormat:arguments: + expressionForAggregate: + expressionForUnionSet:with: + expressionForIntersectSet:with + expressionForMinusSet:with: + expressionForSubquery:usingIteratorVariable:predicate: + expressionForFunction:selectorName:arguments: + expressionForBlock:arguments: - collection - predicate - leftExpression - rightExpression - expressionBlock ------------------------------------------------------------- NSFileHandle: @property (copy) void (^readabilityHandler)(NSFileHandle *) @property (copy) void (^writeabilityHandler)(NSFileHandle *) ------------------------------------------------------------- NSFileManager: NSUbiquityIdentityDidChangeNotification @protocol NSFileManagerDelegate typedef NSVolumeEnumerationOptions typedef NSDirectoryEnumerationOptions typedef NSFileManagerItemReplacementOptions - mountedVolumeURLsIncludingResourceValuesForKeys:options: - contentsOfDirectoryAtURL:includingPropertiesForKeys:options:error: - URLsForDirectory:inDomains: - createDirectoryAtURL:withIntermediateDirectories:attributes:error: - createSymbolicLinkAtURL:withDestinationURL:error: - setDelegate: - delegate - setAttributes:ofItemAtPath:error: - subpathsOfDirectoryAtPath:error: - attributesOfFileSystemForPath:error: - createSymbolicLinkAtPath:withDestinationPath:error: - destinationOfSymbolicLinkAtPath:error: - linkItemAtPath:toPath:error: - copyItemAtURL:toURL:error: - moveItemAtURL:toURL:error: - linkItemAtURL:toURL:error: - removeItemAtURL:error: - trashItemAtURL:resultingItemURL:error: - (__strong const char *)fileSystemRepresentationWithPath: - replaceItemAtURL:withItemAtURL:backupItemName:options:resultingItemURL:error: - setUbiquitous:itemAtURL:destinationURL:error: - isUbiquitousItemAtURL: - startDownloadingUbiquitousItemAtURL:error: - evictUbiquitousItemAtURL:error: - URLForUbiquityContainerIdentifier: - URLForPublishingUbiquitousItemAtURL:expirationDate:error: - ubiquityIdentityToken - level - skipDescendants //not skipDescendents (sic!) @protocol NSFileManagerDelegate NSFileBusy NSFileProtectionKey NSFileProtectionNone NSFileProtectionComplete NSFileProtectionCompleteUnlessOpen NSFileProtectionCompleteUntilFirstUserAuthentication ------------------------------------------------------------- NSGeometry: incompatible NSRectEdge NSAlignmentOptions @class NSString NSRectFromCGRect() NSRectToCGRect() NSPointFromCGPoint() NSPointToCGPoint() NSSizeFromCGSize() NSSizeToCGSize() NSIntegralRectWithOptions() @interface NSValue (NSValueGeometryExtensions) @interface NSCoder (NSGeometryCoding) @interface NSCoder (NSGeometryKeyedCoding) ------------------------------------------------------------- NSHashTable: incompatible NSHashEnumerator NSOwnedObjectIdentityHashCallBacks ------------------------------------------------------------- NSHost: @class NSMutableArray - localizedName ------------------------------------------------------------- NSHTTPCookie: @class NSHTTPCookieInternal; - isHTTPOnly ------------------------------------------------------------- NSHTTPCookieStorage: @class NSHTTPCookieStorageInternal - sortedCookiesUsingDescriptors: ------------------------------------------------------------- NSIndexSet: - indexPassingTest: - indexWithOptions:passingTest: - indexInRange:options:passingTest - indexesPassingTest: - indexesWithOptions:passingTest: - indexesInRange:options:passingTest: - enumerateRangesUsingBlock: - enumerateRangesWithOptions:usingBlock: - enumerateRangesInRange:options:usingBlock: ------------------------------------------------------------- NSInvocation: enum _NSObjCValueType typedef struct NSObjCValue ------------------------------------------------------------- NSKeyedArchiver: + classFallbacksForKeyedArchiver ------------------------------------------------------------- NSKeyValueCoding: NSAverageKeyValueOperator NSCountKeyValueOperator NSDistinctUnionOfArraysKeyValueOperator NSDistinctUnionOfObjectsKeyValueOperator NSDistinctUnionOfSetsKeyValueOperator NSMaximumKeyValueOperator NSMinimumKeyValueOperator NSSumKeyValueOperator NSUnionOfArraysKeyValueOperator NSUnionOfObjectsKeyValueOperator NSUnionOfSetsKeyValueOperator - mutableOrderedSetValueForKey: - mutableOrderedSetValueForKeyPath: @interface NSArray(NSKeyValueCoding) @interface NSDictionary(NSKeyValueCoding) @interface NSMutableDictionary(NSKeyValueCoding) @interface NSOrderedSet(NSKeyValueCoding) @interface NSSet(NSKeyValueCoding) @interface NSObject(NSDeprecatedKeyValueCoding) ------------------------------------------------------------- NSKeyValueObserving: - removeObserver:forKeyPath:context: - removeObserver:fromObjectsAtIndexes:forKeyPath:context: + keyPathsForValuesAffectingValueForKey: ------------------------------------------------------------- NSLocale: @class NSDictionary ------------------------------------------------------------- NSMapTable: @class NSArray, NSDictionary, NSMapTable incompatible NSMapEnumerator NSFreeMapTable() NSResetMapTable() NSCompareMapTables() *NSCopyMapTableWithZone() NSMapMember() *NSMapGet() NSMapInsert() NSMapInsertKnownAbsent() *NSMapInsertIfAbsent() NSMapRemove() NSEnumerateMapTable() NSNextMapEnumeratorPair() NSEndMapTableEnumeration() NSCountMapTable() *NSStringFromMapTable() *NSAllMapTableKeys() *NSAllMapTableValues() ------------------------------------------------------------- NSMetadata: @class NSArray, NSMetadataItem, NSMetadataQueryAttributeValueTuple, NSMetadataQueryResultGroup NSMetadataQueryResultContentRelevanceAttribute NSMetadataItemIsUbiquitousKey NSMetadataUbiquitousItemHasUnresolvedConflictsKey NSMetadataUbiquitousItemIsDownloadedKey NSMetadataUbiquitousItemIsDownloadingKey NSMetadataUbiquitousItemIsUploadedKey NSMetadataUbiquitousItemIsUploadingKey NSMetadataUbiquitousItemPercentDownloadedKey NSMetadataUbiquitousItemPercentUploadedKey ------------------------------------------------------------- NSNetServices: @class NSArray, NSData, NSDictionary, NSString ------------------------------------------------------------- NSNotification: @class NSOperationQueue - addObserverForName:queue:usingBlock: ------------------------------------------------------------- NSNumberFormatter: @class NSMutableDictionary ------------------------------------------------------------- NSObjCRuntime: #include #include #include ------------------------------------------------------------- NSObject: @class NSEnumerator - debugDescription @protocol NSSecureCoding - allowsWeakReference - retainWeakReference ------------------------------------------------------------- NSOperation: @class NSArray, NSSet @interface NSBlockOperation : NSOperation @interface NSInvocationOperation : NSOperation NSInvocationOperationVoidResultException NSInvocationOperationCancelledException - addOperationWithBlock: ------------------------------------------------------------- NSPathUtilities: (interfaces reside in NSString.h and NSArray.h) typedef NS_ENUM(NSUInteger, NSSearchPathDirectory) ------------------------------------------------------------- NSPointerFunctions: #include ------------------------------------------------------------- NSPort: @class NSData @protocol NSPortDelegate, NSMachPortDelegate - scheduleInRunLoop:forMode: - removeFromRunLoop:forMode: NSMachPortDeallocateNone NSMachPortDeallocateSendRight NSMachPortDeallocateReceiveRight + portWithMachPort:options: - initWithMachPort:options: @interface NSSocketPort : NSPort ------------------------------------------------------------- NSPortNameServer: - portForName:host: - registerPort:name: - servicePortWithName: - portForName:host:nameServerPortNumber: - registerPort:name:nameServerPortNumber: - setDefaultNameServerPortNumber: - defaultNameServerPortNumber ------------------------------------------------------------- NSPredicate: + predicateWithBlock: - evaluateWithObject:substitutionVariables: ------------------------------------------------------------- NSProcessInfo: @class NSString - disableSuddenTermination - enableSuddenTermination - disableAutomaticTermination: - enableAutomaticTermination: - setAutomaticTerminationSupportEnabled: - automaticTerminationSupportEnabled ------------------------------------------------------------- NSPropertyList: @class NSError ------------------------------------------------------------- NSProxy: @class NSMethodSignature, NSInvocation - finalize - debugDescription - allowsWeakReference - retainWeakReference ------------------------------------------------------------- NSRange: @class NSString @inteface NSValue (NSValueRangeException) ------------------------------------------------------------- NSRegularExpression: @class NSArray + escapedPatternForString: + escapedTemplateForString: @interface NSDataDetector : NSRegularExpression ------------------------------------------------------------- NSRunLoop: NSRunLoopCommonModes + mainRunLoop - getCFRunLoop @interface NSObject (NSDelayedPerforming) ------------------------------------------------------------- NSScanner: @class NSString ------------------------------------------------------------- NSScriptWhoseTests: @class NSArray, NSScriptObjectSpecifier, NSString typedef NSTestComparisonOperation @interface NSScriptWhoseTest : NSObject @interface NSLogicalTest : NSScriptWhoseTest @interface NSSpecifierTest : NSScriptWhoseTest @interface NSObject (NSScriptingComparisonMethods) ------------------------------------------------------------- NSSortDescriptor: + sortDescriptorWithKey:ascending:comparator: - initWithKey:ascending:comparator: - comparator ------------------------------------------------------------- NSSpellServer: @class NSArray, NSOrthography - spellServer:checkString:offset:types:options:orthography:wordCount: - spellServer:recordResponse:toCorrection:forWord:language: ------------------------------------------------------------- NSStream: - initWithURL: + inputStreamWithURL: - initWithURL:append: + outputStreamWithURL:append: NSStreamNetworkServiceType NSStreamNetworkServiceTypeVoIP NSStreamNetworkServiceTypeVideo NSStreamNetworkServiceTypeBackground NSStreamNetworkServiceTypeVoice ------------------------------------------------------------- NSString: NSParseErrorException NSCharacterConversionException NSStringEnumerationOptions - localizedStandardCompare: - uppercaseStringWithLocale: - lowercaseStringWithLocale: - capitalizedStringWithLocale: - enumerateSubstringsInRange:options:usingBlock: - enumerateLinesUsingBlock: - getBytes:maxLength:usedLength:encoding:options:range:remainingRange: - decomposedStringWithCanonicalMapping - precomposedStringWithCanonicalMapping - decomposedStringWithCompatibilityMapping - precomposedStringWithCompatibilityMapping - stringByFoldingWithOptions:locale: - (__strong const char *)cStringUsingEncoding:(NSStringEncoding)encoding NS_RETURNS_INNER_POINTER; - (__strong const char *)UTF8String NS_RETURNS_INNER_POINTER; ------------------------------------------------------------- NSTask: - init - terminationReason @property (copy) void (^terminationHandler)(NSTask *) ------------------------------------------------------------- NSTextCheckingResult: typedef NSTextCheckingType typedef NSTextCheckingTypes NSTextCheckingNameKey NSTextCheckingJobTitleKey NSTextCheckingOrganizationKey NSTextCheckingStreetKey NSTextCheckingCityKey NSTextCheckingStateKey NSTextCheckingZIPKey NSTextCheckingCountryKey NSTextCheckingPhoneKey NSTextCheckingAirlineKey NSTextCheckingFlightKey @interface NSTextCheckingResult (NSTextCheckingResultCreation) ------------------------------------------------------------- NSThread: + (BOOL)setThreadPriority: - threadPriority NS_AVAILABLE(10_6, 4_0); - setThreadPriority: + callStackSymbols NSDidBecomeSingleThreadedNotification ------------------------------------------------------------- NSTimeZone: @class NSData + setAbbreviationDictionary: + timeZoneDataVersion - description NSTimeZoneNameStyleGeneric NSTimeZoneNameStyleShortGeneric ------------------------------------------------------------- NSUndoManager: #include @class NSString - setActionIsDiscardable: NSUndoManagerGroupIsDiscardableKey - undoActionIsDiscardable - redoActionIsDiscardable NSUndoManagerDidCloseUndoGroupNotification ------------------------------------------------------------- NSURL: @class NSData, NSDictionary + fileURLWithPath:isDirectory: - isFileReferenceURL - fileReferenceURL - filePathURL - getResourceValue:forKey:error: - resourceValuesForKeys:error: - setResourceValue:forKey:error: - setResourceValues:error: NSURLKeysOfUnsetValuesKey NSURLNameKey NSURLLocalizedNameKey NSURLIsRegularFileKey NSURLIsDirectoryKey NSURLIsSymbolicLinkKey NSURLIsVolumeKey NSURLIsPackageKey NSURLIsSystemImmutableKey NSURLIsUserImmutableKey NSURLIsHiddenKey NSURLHasHiddenExtensionKey NSURLCreationDateKey NSURLContentAccessDateKey NSURLContentModificationDateKey NSURLAttributeModificationDateKey NSURLLinkCountKey NSURLParentDirectoryURLKey NSURLVolumeURLKey NSURLTypeIdentifierKey NSURLLocalizedTypeDescriptionKey NSURLLabelNumberKey NSURLLabelColorKey NSURLLocalizedLabelKey NSURLEffectiveIconKey NSURLCustomIconKey NSURLFileResourceIdentifierKey NSURLVolumeIdentifierKey NSURLPreferredIOBlockSizeKey NSURLIsReadableKey NSURLIsWritableKey NSURLIsExecutableKey NSURLFileSecurityKey NSURLIsExcludedFromBackupKey NSURLPathKey NSURLIsMountTriggerKey NSURLFileResourceTypeKey NSURLFileResourceTypeNamedPipe NSURLFileResourceTypeCharacterSpecial NSURLFileResourceTypeDirectory NSURLFileResourceTypeBlockSpecial NSURLFileResourceTypeRegular NSURLFileResourceTypeSymbolicLink NSURLFileResourceTypeSocket NSURLFileResourceTypeUnknown NSURLFileSizeKey NSURLFileAllocatedSizeKey NSURLTotalFileSizeKey NSURLTotalFileAllocatedSizeKey NSURLIsAliasFileKey NSURLVolumeLocalizedFormatDescriptionKey NSURLVolumeTotalCapacityKey NSURLVolumeAvailableCapacityKey NSURLVolumeResourceCountKey NSURLVolumeSupportsPersistentIDsKey NSURLVolumeSupportsSymbolicLinksKey NSURLVolumeSupportsHardLinksKey NSURLVolumeSupportsJournalingKey NSURLVolumeIsJournalingKey NSURLVolumeSupportsSparseFilesKey NSURLVolumeSupportsZeroRunsKey NSURLVolumeSupportsCaseSensitiveNamesKey NSURLVolumeSupportsCasePreservedNamesKey NSURLVolumeSupportsRootDirectoryDatesKey NSURLVolumeSupportsVolumeSizesKey NSURLVolumeSupportsRenamingKey NSURLVolumeSupportsAdvisoryFileLockingKey NSURLVolumeSupportsExtendedSecurityKey NSURLVolumeIsBrowsableKey NSURLVolumeMaximumFileSizeKey NSURLVolumeIsEjectableKey NSURLVolumeIsRemovableKey NSURLVolumeIsInternalKey NSURLVolumeIsAutomountedKey NSURLVolumeIsLocalKey NSURLVolumeIsReadOnlyKey NSURLVolumeCreationDateKey NSURLVolumeURLForRemountingKey NSURLVolumeUUIDStringKey NSURLVolumeNameKey NSURLVolumeLocalizedNameKey NSURLIsUbiquitousItemKey NSURLUbiquitousItemHasUnresolvedConflictsKey NSURLUbiquitousItemIsDownloadedKey NSURLUbiquitousItemIsDownloadingKey NSURLUbiquitousItemIsUploadedKey NSURLUbiquitousItemIsUploadingKey NSURLUbiquitousItemPercentDownloadedKey NSURLUbiquitousItemPercentUploadedKey typedef NSURLBookmarkCreationOptions typedef NSURLBookmarkResolutionOptions typedef NSURLBookmarkFileCreationOptions - bookmarkDataWithOptions:includingResourceValuesForKeys:relativeToURL:error: - initByResolvingBookmarkData:options:relativeToURL:bookmarkDataIsStale:error: + URLByResolvingBookmarkData:options:relativeToURL:bookmarkDataIsStale:error: + resourceValuesForKeys:fromBookmarkData: + writeBookmarkData:toURL:options:error: + bookmarkDataWithContentsOfURL:error: - startAccessingSecurityScopedResource - stopAccessingSecurityScopedResource - stringByAddingPercentEscapesUsingEncoding: - stringByReplacingPercentEscapesUsingEncoding: ------------------------------------------------------------- NSURLAuthenticationChallenge: - performDefaultHandlingForAuthenticationChallenge: - rejectProtectionSpaceAndContinueWithChallenge: @class NSURLAuthenticationChallengeInternal ------------------------------------------------------------- NSURLCache: @class NSCachedURLResponseInternal @class NSURLCacheInternal ------------------------------------------------------------- NSURLConnection: @class NSArray, NSURL, NSURLConnectionInternal, NSRunLoop, NSInputStream, NSURLProtectionSpace, NSOperationQueue @protocol NSURLConnectionDelegate @protocol NSURLConnectionDownloadDelegate - originalRequest - currentRequest - scheduleInRunLoop:forMode: - unscheduleFromRunLoop:forMode: - setDelegateQueue: + sendAsynchronousRequest:queue:completionHandler: ------------------------------------------------------------- NSURLCredential: @class NSArray, NSURLCredentialInternal @interface NSURLCredential(NSClientCertificate) @interface NSURLCredential(NSServerTrust) ------------------------------------------------------------- NSURLCredentialStorage: @class NSURLCredentialStorageInternal ------------------------------------------------------------- NSURLDownload: @class NSURLDownloadInternal, NSURLProtectionSpace @protocol NSURLDownloadDelegate @protocol NSURLDownloadDelegate (incomplete) ------------------------------------------------------------- NSURLError: NSURLErrorFailingURLErrorKey NSURLErrorFailingURLStringErrorKey NSURLErrorFailingURLPeerTrustErrorKey NSURLErrorCannotDecodeRawData NSURLErrorCannotDecodeContentData NSURLErrorCannotParseResponse NSURLErrorDataLengthExceedsMaximum NSURLErrorClientCertificateRequired NSURLErrorDownloadDecodingFailedToComplete NSURLErrorInternationalRoamingOff NSURLErrorCallIsActive NSURLErrorDataNotAllowed NSURLErrorRequestBodyStreamExhausted ------------------------------------------------------------- NSURLHandle: NSHTTPPropertyHTTPProxy NSFTPPropertyUserLoginKey NSFTPPropertyUserPasswordKey NSFTPPropertyActiveTransferModeKey NSFTPPropertyFileOffsetKey NSFTPPropertyFTPProxy - expectedResourceDataSize ------------------------------------------------------------- NSURLProtectionSpace: @class NSArray, NSURLProtectionSpaceInternal NSURLProtectionSpaceHTTP NSURLProtectionSpaceHTTPS NSURLProtectionSpaceFTP NSURLAuthenticationMethodNTLM NSURLAuthenticationMethodNegotiate NSURLAuthenticationMethodClientCertificate NSURLAuthenticationMethodServerTrust - distinguishedNames - serverTrust ------------------------------------------------------------- NSURLProtocol: @class NSURLProtocolInternal + removePropertyForKey:inRequest: ------------------------------------------------------------- NSURLRequest: @class NSURLRequestInternal typedef NSUInteger NSURLRequestCachePolicy typedef NSUInteger NSURLRequestNetworkServiceType - networkServiceType - allowsCellularAccess - setNetworkServiceType: - setAllowsCellularAccess: - HTTPShouldUsePipelining - setHTTPShouldUsePipelining: ------------------------------------------------------------- NSURLResponse: @class NSURLRequest, NSURLResponseInternal, NSHTTPURLResponseInternal ------------------------------------------------------------- NSUserDefaults: @class NSURL - URLForKey: - setURL:forKey: - objectIsForcedForKey: - objectIsForcedForKey:inDomain: NSPositiveCurrencyFormatString NSNegativeCurrencyFormatString ------------------------------------------------------------- NSValue: @class NSDictionary ------------------------------------------------------------- NSValueTransformer: NSKeyedUnarchiveFromDataTransformerName ------------------------------------------------------------- NSXMLDocument: @class NSXMLDocument, NSDictionary, NSArray ------------------------------------------------------------- NSXMLNode: - description ------------------------------------------------------------- NSXMLNodeOptions: NSXMLNodeLoadExternalEntitiesAlways NSXMLNodeLoadExternalEntitiesSameOriginOnly NSXMLNodeLoadExternalEntitiesNever ------------------------------------------------------------- NSXMLParser: @class NSInputStream - parseError ------------------------------------------------------------- NSZone: typedef struct _NSZone NSZone ------------------------------------------------------------- Good headers: gnustep-base-1.29.0/Makefile000066400000000000000000000017641435650067400156620ustar00rootroot00000000000000# # Depreciated Makefile for GNUstep Base Library. # # Copyright (C) 1997 Free Software Foundation, Inc. # # Written by: Scott Christley # # This file is part of the GNUstep Base Library. # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public # License as published by the Free Software Foundation; either # version 2 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 # General Public License for more details. # # You should have received a copy of the GNU General Public # License along with this library; if not, write to the Free # Software Foundation, Inc., 51 Franklin Street, Fifth Floor, # Boston, MA 02111 USA # all: @echo You need to use GNU make to compile the GNUstep Base Library gnustep-base-1.29.0/Makefile.postamble000066400000000000000000000072251435650067400176450ustar00rootroot00000000000000# -*-makefile-gmake-*- # Makefile.postamble # # Copyright (C) 1997 Free Software Foundation, Inc. # # Author: Scott Christley # # This file is part of the GNUstep Base Library. # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public # License as published by the Free Software Foundation; either # version 2 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 # General Public License for more details. # # You should have received a copy of the GNU General Public # License along with this library; see the file COPYING.LIB. # If not, write to the Free Software Foundation, # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # Makefile.postamble # # Project specific makefile rules # # Uncomment the targets you want. # The double colons (::) are important, do not make them single colons # otherwise the normal makefile rules will not be performed. # # Things to do before compiling # Automatically run ./configure if needed to generate the makefiles # which we need in order to do our job. If you need any special # argument to ./configure, you can't rely on this rule, and you must # always run ./configure manually. before-all:: config.mak base.make ifeq ($(_have_makefiles),) ./configure # The prerequisites have been generated but there are no SUBPROJECTS # defined because _have_makefiles has been defined to the empty string # when make was invoked initially. Force make to reread the makefiles # in order to continue with the compilation. $(MAKE) endif # Things to do after compiling # after-all:: $(DESTDIR)$(GNUSTEP_MAKEFILES)/Additional: $(ECHO_CREATING)$(MKDIRS) $(DESTDIR)$(GNUSTEP_MAKEFILES)/Additional$(END_ECHO) # Things to do before installing before-install:: $(DESTDIR)$(GNUSTEP_MAKEFILES)/Additional $(ECHO_NOTHING)$(INSTALL_DATA) base.make \ $(DESTDIR)$(GNUSTEP_MAKEFILES)/Additional/base.make$(END_ECHO) # Things to do after installing # after-install:: # Things to do before uninstalling # before-uninstall:: # Things to do after uninstalling after-uninstall:: $(ECHO_NOTHING)rm -f $(DESTDIR)$(GNUSTEP_MAKEFILES)/Additional/base.make$(END_ECHO) # Things to do before cleaning # before-clean:: # Things to do after cleaning # after-clean:: # Things to do before distcleaning # before-distclean:: # Things to do after distcleaning after-distclean:: $(ECHO_NOTHING)\ rm -f config.status config.log config.cache TAGS config.mak base.make \ Headers/GNUstepBase/config.h \ Headers/GNUstepBase/GSConfig.h \ $(END_ECHO) # Things to do before checking # before-check:: # Things to do after checking # after-check:: # If the generated makefiles are present but their prerequisites have # changed, let config.status regenerate them. This is much faster and # equally safe than running configure again, provided that configure # has not been modified. Make sure to handle that case too. ifeq ($(_have_makefiles),yes) config.mak: config.status config.mak.in @./$< $@ # If Version is newer than the target, configure must be rerun so that # its variables get AC_SUBST'ed and actually updated in base.make. base.make:: Version @./configure # Normally (Version unchanged) config.status can regenerate base.make. base.make:: config.status base.make.in @./$< $@ config.status: configure @if [ -f $@ ]; then ./$@ --recheck; else ./$<; fi else # The makefiles are missing and will be generated by config.status. config.mak base.make: ; endif gnustep-base-1.29.0/NEWS000066400000000000000000001567651435650067400147350ustar00rootroot000000000000001 News ****** The currently released version of the library is '1.28.0'. See the document for more information. 1.1 Noteworthy changes in version '1.28.0' ========================================== Aside from an assortment of bugfixes, this release includes a lot of improvements for Windows support as well as numerous new classes and methods. Not every bugfix, improvement or a new feature will be listed here. * Reading and setting File Creation Date attribute on Windows. * Added new 'ASSIGNMUTABLECOPY()' macro for consistency with 'ASSIGNCOPY()'. * Replaced character set data headers for URLs with loading these from a standard data source, and updated bitmap representation to use much less space for character sets residing wholly in the base plane, such as the URL charsets (given they are purely ASCII). * Updated character set data with newer Unicode data set. * '[NSURLProtocol -initWithRequest:cachedResponse:client:]' will now retain the client up until the last message is sent to it, which improves compatibility with OS X. * Percent-escaping code in 'NSURL' simplified. * Removed mixed ABI support. * Use of Apple runtime now assumes non-fragile ABI (which is true on modern systems). * Improve typing on method implementation pointers in some classes. * In 'NSHTTPCookie', rewritten code for extracting individual cookies from the HTTP header. * In 'NSKeyedArchiver', implement secure coding methods. * New methods in 'NSDateComponents'. * Improvements in 'NSCalendar' and 'NSLocale' for calendar locale and 'NSDateComponents'. * In 'NSFileManager', use 'utimensat()' to set file modification date, if available. * Correctly stop parsing number being decoded in 'NSJSONSerialization' when encountering a number with an invalid exponent. * Improve OS X compatibility for 'NSURLQueryItem' initializers. * For 'NSFileManager', in 'changeFileAttributes', implement setting creation date for Unix-like systems. Implement reading the creation date if a supported method was detected. * Support reading Android assets from the main bundle in 'NSInputStream'. * Support Android assets directories in 'NSBundle' and 'NSFileManager'. * Implement '-[NSXMLParser initWithStream:]'. * Allow clearer choice between 'sloppy' 'GSSloppyXMLParser' used in 'NSXMLParser' and the libxml2-based 'GSStrictXMLParser'. * Fix building Win32 implementations for 'GSFileHandle' and 'NSMessagePort' with nonfragile ABI. * Use 'NSNumber' and not 'NSString' in '-[NSUserDefaults setBool:forKey:]'. * Posting notification before 'NSThread' exit. * Actually declare optional 'NSFilePresenter' methods as optional. * In 'NSConcreteMapTable', fix replacing existing values in a weak objects map table. * Fix leaks in 'NSOperation'. * Various compat fixes for various MSYS systems, particularly around sockets code. * In 'NSData', 'NSFileManager' and more, various improvements when overwriting and creating files with respect to file attributes (owners, creation timestamp, etc). * Improve 'NSLog' output on Android. * Use 'instancetype' in 'NSURLRequest' header. * Define 'NSAttributedStringKey' and 'NSNotificationName'. * Add new 'NSURL' methods. * In 'GSMime', have '-contentFile' check the 'Content-Type' header before checking 'Content-Disposition'. * Fix a bug linking with WEAK symbols where binutils 2.3.5 would fail to link due to not all expected symbols being exported. * New 'plutil' utility. * Implementation of '[NSData rangeOfData:options:range:]' which finds the 'NSRange' in which the passed data occurs. * Change 'ENTER_POOL'/'LEAVE_POOL' so they no longer wrap the enclosed code in a loop, enabling use in some loops. * New 10.5 methods in 'NSRunLoop'/'NSURLConnection'. * Improve compatibility when building with ICU 68. * Fix compiling libdispatch integration of 'NSRunLoop' on Windows. * Add support for building on Windows with MSVC's Clang by passing the 'configure' flag '--host=x86_64-pc-windows'. Use of an MSYS2 shell without '-devel' packages is recommended. * Implementation of 'NSURLSession' and related classes. This adds some dependencies on more recent versions of 'libcurl', 'libdispatch' etc. * Fix initializing 'NSUUID' from a string. * Disable use of 'libcurl' if its headers are not found. * In 'NSURLProtocol', continue writing data if not all of it was written. * Fix use of GnuTLS under MinGW by using 'send/recv' rather than 'read/write'. * Add support for libobjc2 runtime on Windows. * Fix BOM insertion when generating data from a string using one of the Unicode encodings. 1.2 Noteworthy changes in version '1.27.0' ========================================== Aside from an assortment of bugfixes, this release includes a lot of improvements for Android support as well as numerous new classes and methods. * Expose GNU TLS wrappers and add methods to get certificate expiry. * Improve thread safety when using zombies, particularly on statup/shutdown. * Improvements for Ukrainian localization. * Decreased ICU requirements to 49 to support Windows 2000. * Simplifications and fixes in GSPrivateSymbolPath(). * GSMime improvements (word encoding specifier, utf-8 improvements encoding quoted words with multibyte characters) * NSJSONSerialization fixes for codepoints over 0x7f. * NSCharacterSet support for URL*AllowedCharacterSet and declarations for new character sets. * NSString implementations for new methods stringByRemovingPercentEncoding/ stringByAddingPercentEncodingWithAllowedCharacterSet:. * Fixed a crash in gdomap when an invalid hostname is given for the -M option. * In NSString.m, removed functions urldecode() and ishex() which were mistakenly neither namespaced nor declared static and thus could have conflicted with non-library code. * Fixed libdispatch configuration switch so -enable-libdispatch works correctly; correctly checking for HAVE_LIBDISPATCH_RUNLOOP. * Updated libdispatch runloop integration so it is compatible with Swift's corelibs libdispatch release (from github.com/apple/swift-corelibs-libdispatch). The libdispatch must be compiled with INSTALL_PRIVATE_HEADERS=YES. * In NSThread, spinlocks implemented using builtins to be able to target platforms without pthread_spin_lock(), such as Android targeting API level < 24. * In NSLog on Android, send logs to syslog. * Implementation of NSOrderedSet. * When ./configuring, link against libandroid on Android. * In NSBundle, allow integrating with Android asset manager using +[NSBundle setJavaAssetManager:withJNIEnv:], enabling use of mainBundle's pathForResource:ofType:, -URLForResource:ofType: and similar; referencing Info.plist if it exists in Android assets; use of NSFileManager's fileExistsAtPath: et al and isReadableFileAtPath:; reading files using NSFileHandle APIs; use of NSDirectoryEnumerator to enumerate Android assets from the main bundle. * In NSBundle, localization support on Android. * In NSProcessInfo, automatic initialization on Android using a fake executable path (/data/data//Resources). * In NSData, improvements in reading Android assets. * Various improvements in the mechanism to report memory usage of individual objects. * Skeletal implementation of NSUbiquitousKeyValueStore. * Implementation of NSByteCountFormatter. * Fixes to writing large HTTPS requests (GSSocketStream, NSURLProtocol). * In gdomap.c, fix detection of local networks. * In NSArray's -removeObjectsInArray:, prevent some crashes. * In GSTLS, avoid setting session priority twice. * In NSFileHandle, fix so that setting certificate information does not discard any other options already set. * In GSXML's -fatalErrorFunction, use the correct function to get the line number. * In NSOperation's _execute, ensure lock gets released on an error by surrounding with NS_DURING. * Generics support in NSHashTable. * Implementation of NSProgress. * Skeleton implementation of NSURLComponents. * In NSSortDescriptor, added -sortDescriptorWithKey:ascending:descending:. * In NSOperationQueue, added -addOperationWithBlock. * In NSFileManager, added -URLForDirectory:inDomain:appropriateForURL:create:error: and -enumeratorAtURL:includingPropertiesForKeys:options:errorHandler:. Also added NSItemReplacementDirectory constant, and updated stub implementation for -URLForDirectory:shouldCreate:error:. Added -initWithDirectoryPath:... with additional parameters skipHidden and errorHandler. * In NSDictionary, fixed keysSortedByValueUsingComparator:. * Moved NSFileWrapper from -gui to -base. * Added NSFilePresenter, NSFileVersion and NSFileCoordinator. * Added NSPersonComponents and NSPersonNameComponentsFormatter. * Added units of measurement classes such as NSUnit, NSMeasurement, NSMeasurementFormatter, NSEnergyFormatter, NSLengthFormatter, NSMassFormatter. * In NSUnit, support for NSUnitArea, NSUnitConcentrationMass, NSUnitDispersion, NSUnitElectricCharge, NSUnitIlluminance, NSUnitElectricCurrent, NSUnitElectricPotentionDifference, NSElectricResistance, NSUnitMass, NSUnitEnergy, NSUnitFrequency, NSUnitPower, NSUnitSpeed, NSUnitFuelEfficiency, NSUnitPressure, NSUnitVolume, NSUnitLength. * Support for data directory on Android introduces GSInitializeProcessAndroid and makes use of the path returned by Context.getFilesDir() as the basis for storing data (e.g. NSUserDefaults) and when querying for directory paths (NSLibraryDirectory, NSApplicationSupportDirectory, etc.). * Placeholder NSScript* classes. Added NSUserActivity, NSObjectScripting, NSHFSFileTypes, NSAppleEventManager and NSAppleEventDescriptor. * Added NSDateInterval intersectionWithDateInterval:. * Added NSBackgroundActivityScheduler. * Added NSISO8601DateFormatter and NSMetadataAttributes. * Added NSOrtogrpahy and NSLinguisticTagger. * Added NSExtensionItem, NSExtensionContext, NSExtensionRequestHandling, and NSItemProvider and NSItemProviderReadingWriting. * Updated timezone info for NSTimeZones. * On Android, support for NSTemporaryDirectory to use Context.getCacheDir(), and cleaning it up in GSInitializeProcessAndroid() given there is no support for temp directory before Android API 26. Also used with NSCachesDirectory + NSUserDomainMask. * NSXPCConnection fixes. * NSException symbolication support using libunwind (used when backtrace() is unavailable). * Travis build improvements to use new runloop integration and gnustep-2.0 runtime. * In NSKeyValueObserving, implement two missing methods for NSArray: -addObserver:options:context: and -removeObserver:fromObjectsAtIndexes:forKeyPath:. * Updated NSUUID to use instancetype. * Added support for NSDate constants in NSPredicate. * Fixed a NSTimer bug with blocks. * In GSTLS, do not put password in the hash key of the credentials, and to avoid logging it when debugging is on. * Improvements in NSConcreteHashTable and NSConcreteMapTable. * In various places, switch away from deprecated CREATE_AUTORELEASE_POOL() to use the ARC-compatible ENTER_POOL and LEAVE_POOL macros. * When building the list of hosts to be probed to see if they have gdomap servers, fix code to include those explicitly defined in the config file. Add -S option to list the addresses of the known gdomap servers. * Backward compatibility fix for ICU 65. * Update GSPrivateSymbolPath() so that, on the path where LINKER_GETSYMBOL is not available, we attempt to lookup classes using the prefix ._OBJC_CLASS_ for the 2.0 ABI (earlier ABIs use a prefix of __objc_class_name_ for the class definition. * Fix parsing of NSURLResponse content type header. * Fix for class lookup when using the 2.0 ABI. * Fixed NSURLComponents setURL: throwing exceptions when URL didn't have all expected parts caused by rangeOfString: throwing for nil values. * Added NSURLQueryItem implementation. 1.3 Noteworthy changes in version '1.26.0' ========================================== * Improve utf8 validity checks. * Make point and size subclasses for NSValue interchangable. * Add support for TLS SNI. Always request certificate from client and update certificates after 5 minutes. * Don't write deprecated fields to desktop link file. * Use NSLock instead of GSLazyLock and other improvements for multithreaded processes. * Clean up of NSString cluster. * Update NSAssert() and NSCAssert() to handle variable arguments (as OSX has done) and mark the numbered macros as obsolete. * Various improvements in tests. * Require ICU >= 50. * ICU is now detected using pkg-config. * Improve XML parsing. * Make NSXMLNode ivar a union representing different types, instead of assuming it will contain different underlying class types in different contexts. This is important for the new libobjc2 ABI. * OSX compatibility changes to NSURL. * NSFileManager call error handle on missing file. * Dummy spinlock implementation for platforms that don't support it. * Internationalization improvements: Japanese translation, Turkish translation, Polish translation. * Various improvements for new libobjc2 "v2 ABI", including things like a new NSConstantString implementation, making GS_REPLACE_CONSTANT_STRING a noop with the new ABI, etc. * Improvements for stack traces, exception handling and dead lock detection. * Other more minor bugfixes and cleanups. Many found by Coverity scan results. * As usual, this release also contains an update to include the most recent international timezone data. 1.4 Noteworthy changes in version '1.25.1' ========================================== * Unicode fixes for characters outside the base plane * Stubs for some new OSX methods * Various new OSX compatibility macro and type definitions * NSFileManager fixes and tweaks to match OSX implementation * NSDistributedLock bugfix for pre-existing lock directories * Alternative sort algorithms selectable at runtime * Compatibility-related changes for environments not supporting weak symbols * Other more minor bugfixes and cleanups. * As usual, this release also contains an update to include the most recent international timezone data. 1.5 Noteworthy changes in version '1.25.0' ========================================== * Garbage collection support removed (NSGarbageCollector stub remains) * Support for Debian style multi-architecture installations added * OpenSSL bundle removed since it didn't match GNUTLS support * Ported to Debian/Hurd * ICU string (regexp in particular) fixes * OSX compatibity changes in NSRunLoop and NSTask behavior * Alternative sort algorithms selectable at runtime * Many bugfixes and cleanups. * As usual, this release also contains an update to include the most recent international timezone data. 1.6 Noteworthy changes in version '1.24.9' ========================================== * Niels added support for generics * Support for 'ng' runtime library (latest language features enabled) * Performance optimisations and improved diagnostic messages * Garbage Collection deprecated (support to be removed) * As usual, this release also contains an update to include the most recent international timezone data. 1.7 Noteworthy changes in version '1.24.8' ========================================== * Performance optimisations (particularly in the use of tiny string objects by the new objc runtime on 64bit systems). * Thread naming and logging of threads by NSLog() has been made consistent with the latest OSX releases, making debugging of multithreaded code a little easier. * Sergei Golovin has added NSURLConnection regression tests (while fixing a few bugs there). * As usual, this release also contains an update to include the most recent international timezone data. * Various other bugfixes. 1.8 Noteworthy changes in version '1.24.7' ========================================== * TLS and other security improvements (note, SSLv3.0 is disabled by default in order to prevent the 'POODLE' attack). * Latest timezone data included. * Various other bugfixes. 1.9 Noteworthy changes in version '1.24.6' ========================================== * NSUUID implemented * New OSX version macros * TLS support improvements * Various new methods for OSX compatibility * Various other bugfixes 1.10 Noteworthy changes in version '1.24.5' =========================================== * NSInvocationOperation * OSX version compatibility macro improvements * Static analyzer fixes (mostly printf format string issues) * Various other bugfixes 1.11 Noteworthy changes in version '1.24.4' =========================================== * Updated time zone data * OSX 10.7 NSCalendar methods * Portability improvments and minor bugfixes * More testcases in the testsuite 1.12 Noteworthy changes in version '1.24.3' =========================================== * Implementation of the NSXML DOM classes * Implementation of consistent TLS/SSL support * Implementation of new/selectable sorting algorithms * More explicit dependencies on external libraries. 1.13 Noteworthy changes in version '1.24.0' =========================================== * There is binary incompatibility on 64bit systems in that the value of the NSNotFound constant there is now 64bits rather than 32bits. * gcc-4.0 is the minimum official supported compiler for GNUstep * Support for the GNU LANGUAGES environment variable and other locale improvements * IPV6 support for NSHost and networking operations * Support for UTF-8 string literals in source (compiler permitting) 1.14 Noteworthy changes in version '1.23.0' =========================================== * Support for automatic reference counting (ARC) when using clasng and the GNUstep Objective-C 2.0 runtime 1.5 or later. * Full support for weak references in NSHashTable, NSMapTable and NSPointerArray when using clang and the GNUstep Objective-C 2.0 runtime 1.5 or later. 1.15 Noteworthy changes in version '1.22.0' =========================================== * Many updates and new classes * There is now a regression test framework included with the package * New support for Objective-C 2.0 1.16 Noteworthy changes in version '1.21.1' =========================================== This is an (unstable) copy of the 1.20.1 release 1.17 Noteworthy changes in version '1.20.1' =========================================== This is a stable bugfix release. There are no major changes or binary incompatibilities, but this release does include an update of timezone handling to include the latest zone information. 1.18 Noteworthy changes in version '1.21.0' =========================================== This is an (unstable) copy of the 1.20.0 release 1.19 Noteworthy changes in version '1.20.0' =========================================== This is a stable release. There have been major changes and reorganizations to support, among other things, the new non-fragile ABI from clang. These changes, although they break binary compatibility with previous releases, should allow all future releases to maintain compatibility. 1.20 Noteworthy changes in version '1.19.3' =========================================== * Bugfix to work around OSX behavior of [NSURL-path] 1.21 Noteworthy changes in version '1.19.2' =========================================== * Various OSX compatibility improvements. * String handling performance improvements. * Several minor bugfixes. 1.22 Noteworthy changes in version '1.19.1' =========================================== * New Mac OS X methods for writing data in NSData * New classes NSHashTable and NSMapTable * Garbage collection now works again and is much improved. * Method return types and arguments have been changed for Mac OS X 10.5 1.23 Noteworthy changes in version '1.19.0' =========================================== * Support for native objective-c exceptions * Connection keepalive for ms-windows * Path utitlites fix for ms-windows * Changes to build on 64bit ms-windows * Support for @synchronize 1.24 Noteworthy changes in version '1.15.3' =========================================== * Extended NSUserDefaults so it recognizes ../ as a relative path. * Added TLS/SSL support for NSStream based on GNU TLS * Added support for https to NSURLConnection using new stream code and added basic support for digest authentication. * Fixed various problems with and added new options to KVO. 1.25 Noteworthy changes in version '1.15.2' =========================================== Bug fixes include improved thread safety (and a change to the NSThread class structure) and Key-Value observing. 1.26 Noteworthy changes in version '1.15.1' =========================================== This is an unstable release. There may be API and ABI changes from previous releases. The licesne hase changed to GPLv3 and LGPLv3. Mostly bug fixes, but a few improvements in NSPredicates and Key-Value coding have been added. 1.27 Noteworthy changes in version '1.15.0' =========================================== This is an unstable release from 1.14.0. It is otherwise identical to the 1.14.0 release. Releases in the 1.15 series may not be forward compatible with previous 1.15 releases. 1.28 Noteworthy changes in version '1.14.0' =========================================== Many portability (particularly for ms-windows) and MacOS-X compatibility fixes. New MacOS-X classes and incorporation of NSAffineTransform and NSSpellServer which were formerly in the gui library. Improved performance of amssively multithreaded programs. 1.29 Noteworthy changes in version '1.13.1' =========================================== Various minor bugs and MacOS-X incompatibilities fixed. One important fix for a possible buffer overrun attack when initialising NSDate objects from strings. One fix for a serious (crash) bug when initialising the bundles system in an application which has a lot of frameworks linked to it. See the release notes for more details. 1.30 Noteworthy changes in version '1.13.0' =========================================== Several sets of classes have been added for dealing with urls and predicates. A few minor api changes have occured as well. 1.31 Noteworthy changes in version '1.12.0' =========================================== There have been a number of API changes and several methods have been depreciated in this release. Although current GNUstep programs that use these methods will still work in this version, there are enough changes that a new library version was considered useful. See the release notes for more details. New NSStream classes where added to the library. User defaults were restructured to create the defaults lazily and can be set to not write to an external file at all, for developers who wish to use the library as a stand-alone library or in other situations where using external resources is not desired. 1.32 Noteworthy changes in version '1.11.2' =========================================== * Support for GNUstep.conf and relocation of the filesystem is much improved in this release. * The WM_QUIT message is now intercepted to allow an application to terminate cleanly. * NSMessagePort was implemented on Windows platforms. * Deprecated support for system-wide GNUsteprc files has been removed. * Some support for keeping user defaults in the Windows registry implemented. 1.33 Noteworthy changes in version '1.11.1' =========================================== * New Cocoa class NSSortDescriptor * NSStringFrom... functions now output strings that can be read by old OpenStep implementations (but can also still be read by GNUstep and MacOSX). * More support for debugging on mingw, including writing logs to debugger and event viewer. 1.34 Noteworthy changes in version '1.11.0' =========================================== This release is binary incompatible with previous releases. The interface version of the library has changed so that apps, tools and libraries that use the base library need to be recompiled to use this new version. * Window's path handling has changed to use native paths throughout. * Startup/configuration of the libraries no longer requires environement variables. * Character sets are included in the library rather than being read from data files. * NSRunLoop and related classes use natvie win32 event handling on Windows machines. 1.35 Noteworthy changes in version '1.10.3' =========================================== This version includes a few minor bug fixes. 1.36 Noteworthy changes in version '1.10.2' =========================================== This version mostly includes minor fixes and updates. * The definition of NSContainsRect has changed to correspond with the current Mac OS X/Cocoa def - the sides of the bRect can touch aRect. * Add support for systems that support unichar file paths (e.g. Windows). * Use a proper one-to-one abbreviation dictionary for NSTimeZone. 1.37 Noteworthy changes in version '1.10.1' =========================================== This version mostly includes minor fixes and updates. * Runtime discovery of the library version is possible. * NSXMLParser class added. Not completely implemented. * NSArrays makeObjectsPerformSelector iterates in same order as MacOS X. * Designated initializers for NSArray, NSDictionary, NSSet, and NSString have been changed for MacOS X compatibility. 1.38 Noteworthy changes in version '1.10.0' =========================================== Note the interface version of the library has changed so that apps, tools and libraries the use the base library need to be recompiled to use it. * A large majority of the library classes have been documented thanks to the efforts of Adrian Robert * URL classes support persistant connections * Mac OSX XML compatibility fixes. 1.39 Noteworthy changes in version '1.9.2' ========================================== * GSMime parsing ignores extraneous data * New log functions GSOnceFlag and GSOnceMLog * New class NSError * Multiple new function in GSObjCRuntime * NSProtocolChecker rewritten * autogsdoc support added for building frames * Binary incompatibility: NSUnarchiver, GSIMapTable have new ivars added 1.40 Noteworthy changes in version '1.9.1' ========================================== * Default string encoding taken from system nl_langinfo if not set with GNUSTEP_STRING_ENCODING. * NSKeyedArchiver/NSKeyedUnarchiver classes added. * NSPropertyLists class added, also decodes Mac OS X binary propery lists. 1.41 Noteworthy changes in version '1.9.0' ========================================== * Lazy locking implemented (see GSLock documentation) * MacOSX PB files updated to 10.3 * DO retain/release implementation simplified and also handles some complex DO retain/release problems. * GNUSTEP_STRING_ENCODING now supports any valid iconv name. * gdomap uid/gid fixes * NSString subclass heirarchy reorganized to fix problems with copying and ownership of data. 1.42 Noteworthy changes in version '1.8.0' ========================================== Read the NEWS file for a complete list of changes since the last stable version. The major change is that the header files (both in the package and when installed) are in different locations. Also, due to filesystem changes in gnustep-make, several components of gnustep-base are located in different locations. Generally this should not affect the compilation or running of applications and tools. 1.43 Noteworthy changes in version '1.7.4' ========================================== * Added Korean encoding * Updated use of ObjCRuntime functions. 1.44 Noteworthy changes in version '1.7.3' ========================================== Note in this version there have been large changes to the location of header files (both in the package and when installed). It's possible (though unlikely) that certain applications that rely on GNUstep specific headers may not compile because of this. * A number of Protocol and DO fixes. * New TraditionalChinese language. 1.45 Noteworthy changes in version '1.7.2' ========================================== * NSUndoManager improvements * New NSMessagePort implementation. * Private GSTcpPort becomre NSSocketPort. * Improvements to handle selectors better over remote connections. 1.46 Noteworthy changes in version '1.7.1' ========================================== Bug fixes. 1.47 Noteworthy changes in version '1.7.0' ========================================== See gnustep-make for comments on the filesystem change. Some components of gnustep-base are now stored in different directories and in some cases you should use different methods to look for them. Use +pathForLibraryResource:ofType:inDirectory: instead of +pathForGNUstepResource:. Also try using +bundleForLibrary:. gnustep-base is now documentated as OpenStep complient. Other changes: * Add GSApplicationSupportDirectory for NSSearchPathForDirectoriesInDomains. * Added man page for gdomap 1.48 Noteworthy changes in version '1.6.0' ========================================== * More MinGW support * New MacOSX compatible methods. * The Base Additions library compiles on native OSX. * autogsdoc produces better, cleaner docs. * Built-in garbage collecting classes. * Any many many bug fixes and minor improvements. 1.49 Noteworthy changes in version '1.5.1' ========================================== * Port NSThread to MingW * Better framework support in NSBundle * Added Thai string encodings. * New makeImmutableCopyOnFail: method. * Lots of autogsdoc improvements, Updated gsdoc DTD to 1.0 version. * Added GSPrintf for logging to stdout. * Warning logs selectable at runtime. * NSTimeZone code rewritten for speed. 1.50 Noteworthy changes in version '1.5.0' ========================================== * New MacOSX methods implemented (NSString, NSArray, NSObject) * Fixed bug that occationally deleted user defaults. * Tcp connections use runloop in NSConnectionReplyMode. 1.51 Noteworthy changes in version '1.4.0' ========================================== * gdomap - security bug fixes. 1.52 Noteworthy changes in version '1.3.4' ========================================== This is a first pre-release version for 1.4. This version also fixes a potentially destructive bug in gdomap. All users are urged to upgrade to this version as soon as possible. * gdomap - don't write pidfile until after setuid away from root * New combined Unix/Windows version of NSFileHandle 1.53 Noteworthy changes in version '1.3.3' ========================================== Note there are interface and binary changes in this release that require you to recompile all applications and tools that use gnustep-base. * Rewrite of NSURL (NOTE: Requires recompilation of all apps!) * NSMapTable fix (also requires recompilation). * Hack to avoid bug in gcc 3.1 * MacOSX compatibility changes: -dealloc, NSLog * Add NSZombie class. * GC improvements * Support for system-wide .GNUsteprc 1.54 Noteworthy changes in version '1.3.2' ========================================== * Corrections for handling Windows file paths, etc * Other fixes for Windows - DO now works on Windows * New localization/internationalization tool make_strings * Experimental libffi support. * Handle running tools/apps on other hosts * Updated files and new tool for handling different encodings (cvtenc). * Unicode and UTF8 handling improvements. 1.55 Noteworthy changes in version '1.3.0' ========================================== * Moved additional classes into subprojects and/or bundles to make it easier to port these to other Foundation libraries.. * Traditional Chinese extensions added. * Better support for resources (bundles) * Ports and DO work on MingW. * Better KeyValueCoding support (for EOF). * New, partially finished Objective-C/Foundation programming manual. 1.56 Noteworthy changes in version '1.1.0' ========================================== * Removed use of distributed lock to sync defaults file. * Compiles on Darwin (but does not work yet). * New tool autogsdoc for inline Objective-C documentation. * Some NSBundle convienience methods for associating resources with libraries and tools (like a lightweight framework). * URL classes improved and more robust. * SSL classes compiled as a separate bundle due to license problems. * Better operation in MinGW environment. * New localization files. * XML property lists 1.57 Noteworthy changes in version '1.0.2' ========================================== Mostly a bug fix release to work with the new gcc 3.0. * Added support for special gcc 3.0 options (constant string support). 1.58 Noteworthy changes in version '1.0.1' ========================================== * Many fixes to work better with Darwin (still not there). * Fixes to work with BSD Unix * Added some missing methods, better conformance to MacOSX Docs. * Added support for invoking super implementation (mostly for writting bridges from other languages). * Works better with gcc 3.x, newer kernels. * More memory debugging support. 1.59 Noteworthy changes in version '1.0.0' ========================================== * Fix parsing of arguments for new linux kernels. * File manager and other fixes for mingw * Fix alignment issues on CPUs that require it. * Update unicode support and fixes 1.60 Noteworthy changes in version '0.9.1' ========================================== * New MacOSX compatible files for NSCalendarDate, NSTimeZone * NSUserDefaults now uses NSLanguages not Languages * Various improvements for Windows platforms * NSCharacterSets updated to v3.0.1 of Unicode data. * Added some gettext compatible localization macros. 1.61 Noteworthy changes in version '0.9.1' ========================================== * Fixes for building on FreeBSD * Unicode support for -initWithFormat: * NSDate pass dates over DO bycopy unless explicit byref. * Updated for Makefile package changes. 1.62 Noteworthy changes in version '0.9.0' ========================================== * Workaround when no host IP set. * Standardized non-NS filenames * Lots of code simplifications and standardization. * Added key/value methods to NSObject. * Updated DO and NSInvocation to use ffcall libraries. * New GSHTTPURLHandle class for http and https support. * New GSMime class for MIME parsing * Made DO threadsafe. * Added extension to NSThread to allow JIGS to map java threads to gnustep threads. * Modifications to make it easier to port to Apple runtime. * Added framework support to NSBundle * Added localization support * Better unicode conversion. * New NSNull class. * Major rewrite of NSString * Port to MinGW/Windows * Removed obsolete classes. 1.63 Noteworthy changes in version '0.6.6' ========================================== * Lots of new documentation. * Completely rewritten Distributed Object to be much more compatible with the MacOS-X API (and incidentally, closer to the original OpenStep standard). * Support to compile library as a DLL on Windows (still cygwin only). * Removed lots of obsolete classes. * New tools for handling property lists. * More optimization of classes. 1.64 Noteworthy changes in version '0.6.5' ========================================== * Better debugging information. * Timezone information rewritten to work more like GNUstep wants it rather than strict Posix. * Added support for FreeBSD native POSIX threads * Better garbage collection support. * Lots of optimizations and bug fixes. 1.65 Noteworthy changes in version '0.6.0' ========================================== Most of the changes to the Base Library are bug fixes and updates to include MacOS-X specifications. Although the base library hasn't been extensively tested, it is currently used in several commercial products and installations, and is considered to be fairly stable. * Some changes to eventually allow the use of automatic garbage collection. * Better localization support in NSBundle. * Performance boosts in many classes. 1.66 Noteworthy changes in version '0.5.5' ========================================== Too many changes to mention in detail, but here is a list of a few: * Many base classes have been rewritten with tonnes of performance improvements that in many cases make it as fast as or faster than the NeXT implementation. * DO and archiving has received many improvements that help it work on a variety of different platforms. * Configuration and compilation has been greatly improved and fool proofed. * There are several new tools for handling services, defaults, and pasteboards. 1.67 Noteworthy changes in version '0.5.1' ========================================== * Additional runtime functions for interaction with Guile and ObjC-Guile library. 1.68 Noteworthy changes in version '0.5.0' ========================================== * Improvements to the NSInvocation class, from Masatake Yamato . * Implemented several new OpenStep methods and classes (e.g. NSTask) and speed improvements for others (NSArray, NSData, NSString), from Richard Frith-Macdonald . * gdomap now handles subnet addressing and machines with multiple IP addresses from Richard Frith-Macdonald . 1.69 Noteworthy changes in version '0.4.0' ========================================== * New tools for maintaining the defaults database. * Use the new GNUstep Makefile Package to compile the library, tools checks, and everything else. * An implementation of NSDistributedLock * NSData implemented as a class cluster including a class to allocate shared VM memory. * Big NSTimeZone improvements, as well as inclusion of time zone files, from Yoo C. Chung . * Major improvements to distributed objects and many related clases from Richard Frith-Macdonald . Also added a nameserver. * Major rewrite of NSString, include Unicode strings from Stevo Crvenkovski * A rewrite of the NSBundle class from Adam Fedor * Addition of a C-language style stream package. * Better support for threads and locking. * Support for running on Windows from Scott Christley * Many, many, many, many bug fixes and new classes. 1.70 Noteworthy changes since version '0.1.19' ============================================== * The library has changed its name from 'libobjects' to 'libgnustep-base'. The Apr 17 ChangeLog entry contains a list of the way various other names were changed. * The library now requires a patch to gcc-2.7.2. The patch adds thread-safe features to the GNU Objective C runtime. Each thread has its own exception handler and assertion handler, thanks to Yoo C. Chung . * Distributed Objects is much improved. Exceptions in the server are sent back to the client. Ungracefully closed connections are gracefully handled. * NSUserDefaults has been implemented, thanks to Georg Tuparev . * NSScanner has been implemented, thanks to Eric Norum . * NSCharacterSet has a new caching scheme, and is now faster than NeXT's implementation, thanks to Adam Fedor. * Preliminary thread-safety work has been done. NSObject and NSAutoreleasePool should be thread-safe. * The "%@" printf directive now works on systems without GNU libc. * The NS*Page* functions have been implemented. * The mframe and behavior functions have been overhauled and better commented. * The NSHashTable and NSMapTable functions have been implemented, thanks to Albin Jones . Albin has also implemented underlying GNU functions that provide functions for arrays and linked lists of C-type variables. * The NSThread class has been implemented. Thanks to Scott Christley , the NSLock class has been implemented. * A RunLoop class has been implemented, and is used for listening to Port objects. It is used for Distributed Objects. There is also an NSRunLoop class based on RunLoop. * The NSTimer class has been implemented, although its use with RunLoops is currently disabled. * The Notification mechanism has been implemented. It makes good use of hash tables and linked lists in order to be fast. * The Invocation class heirarchy has been fleshed out and now works. * The collection classes have been overhauled to better handle distributed objects, and for better compatibility with NeXT's method names. A new separation has been made in the abstract collection classes: IndexedCollections contain objects accessible by an integer key, but the user cannot insert at an arbitrary key; these are useful for sorted collections, such as SplayTree's. OrderedCollection can have their order determined by the user; i.e. users can send '-insertObject:atIndex:', etc. There is a new set of rich enumeration methods based on Invocations. * Port class heirarchy has been overhauled. There are now classes for TCP ports, UDP ports, and Mach ports. Only the TCP ports are currently functional. * GNU-style archiving has had an overhaul, and the GNUstep NSArchiver class is functional, but not strongly tested. It does not yet call -awakeUsingCoder:. I have separated the high-level archiving of groups of objects from the low-level format of how C-types are written. There are several new classes. CStream is a subclass of Stream that knows how to encode C-type variables in a machine independent way; this class has two concrete subclasses: BinaryCStream, and TextCStream. Plug these backends into Coder to get different style low-level formats for archiving. Floats and doubles are now encoded more efficiently. NSArchiver is built on top of Coder. You can actually send all the Coder methods to NSArchiver and vice-versa. GNU classes BinaryCoder and TextCoder are gone. * Several new OpenStep functions have been implemented: NSHomeDirectory, NSUserName, NSHomeDirectoryForUser, NSPageSize, NSLogPageSize, NSroundUpToMultipleOfPageSize, NSRoundDownToMultipleOfPageSize, NSRealMemoryAvailable, NSAllocateMemoryPages, NSDeallocateMemoryPages, NSCopyMemoryPages. * ...and many bug fixes. 1.71 Noteworthy changes since version '0.1.14' ============================================== * Can be made as a shared library by passing '--enabled-shared' to 'configure'. Thanks to Jan Kybic and Bryan Headley for suggestions. * New classes NSSet, NSMutableSet, NSCountedSet. New concrete classes NSGSet, NSGMutableSet, NSGCountedSet. New test program nsset.m. New class NSMethodSignature. * Running './configure' and building the library in a different directory than the source works as it should, according to the GNU standards. * Dynamic loading fixes for Solaris, thanks to Adam Fedor. * Fixes to Coder correct bugs with encoding/decoding wildly interconnected objects. (My application uses a "Suffix Tree" structure: a Tree, and a LinkedList that winds its way through the leaves of the tree; the LinkedList nodes also have pointers back to the tree nodes.) * NSTimeZone implemented, thanks to Peter Burka * NSData fixes, thanks to Adam Fedor. * NSObjCRuntime functions implemented. NSObject description methods implemented. * Bug fixes in NSString, NSDictionary, NSArray, NSGeometry and other places. 1.72 Noteworthy changes since version '0.1.13' ============================================== * NSProcessInfo class, thanks to Georg Tuparev. * NSDate now more operational, thanks to Jeremy Bettis. * Autorelease checking improved, thanks to Adam Fedor. * NSString concrete classes now more configurable. Several new methods implemented. * Many bug fixes. 1.73 Noteworthy changes since version '0.1.12' ============================================== * Bug fixes: installation; NSArray and NSDictionary copying; NSArray, NSDictionary, NSData, NSArchiver, NSUnarchiver concrete class configurability; NSString -getCharacter:range:. See the ChangeLog for more details. 1.74 Noteworthy changes since version '0.1.10' ============================================== * Now using 'src', 'config' and 'doc' directories to un-clutter the top-level directory. * New GNUStep classes implemented: NSDictionary, NSMutableDictionary; concrete classes NSGDictionary, NSGMutableDictionary; enumeration classes NSGDictionaryKeyEnumerator, NSGDictionaryObjectEnumerator. * More methods in NSData are implemented, thanks to Albin Jones. * More methods in NSString are implemented; we have new classes NSCharacterSet and NSBitmapCharSet; all thanks to Adam Fedor. * And several bug fixes. See the ChangeLog for details. 1.75 Noteworthy changes since version '0.1.9' ============================================= * Renamed "foundation" include file directory to "Foundation", in accordance with OpenStep. * Several bug fixes, including a problem with a missing file in 0.1.9. 1.76 Noteworthy changes since version '0.1.8' ============================================= * Many new GNUStep classes: NSEnumerator, NSArrayEnumerator, NSCoder, NSArchiver, NSUnarchiver, NSData, NSMutableData, NSGCoder, NSGArchiver, NSGUnarchiver, NSGData, NSGMutableData. Much coding and prep work has been done to make archiving work (see the ChangeLog), but it's not quite ready for action yet. * New GNUStep classes implemented by others: Thanks to Adam Fedor, NSAssertionHandler. Thanks to Jeremy Bettis, NSDate. * Overhauled encoding and decoding. The Coder now sends -initWithCoder by default, but will still send the more flexible +newWithCoder if the class implements it. See objects/Coding.h. The Stream class interface has been changed slightly. There are two new protocols for Streams. * Several new debug-aiding methods implemented in NSAutoreleasePool. * Separated Constant Collection protocols from changeable ones. Eventually I'll separate the classes too. * Included an outline for the GNU Objective C Language Manual. The GNU project is looking for volunteers to help flesh it out. Send email to Martin Michlmayr or Andrew McCallum . * Include the AUTHORS file, needed for legal reasons. Include the 'GNUStep-volunteers' file. * Several bug fixes: Typo in Array.m; Linux header file frobbing in NSZone.h; typo causing crash in checks/nsarray.m; bad deallocation in Collection.m; typo in BinaryTree.m; put -write: and -read: implementations back in Collection.m. 1.77 Noteworthy changes since version '0.1.7' ============================================= * Thanks to Adam Fedor , classes NSBundle, NSNumber and NSValue are now operational. He also provided stubs for NSArray, NSCoder and NSDictionary. * NSArray has been fleshed out. There are new classes NSConcreteArray and NSConcreteMutableArray. Basic operations with the NSArray class cluster now work, and it is set up to coexist nicely with the GNU collection heirarchy. Next I'll do NSDictionary in a similar style. * From Adam Fedor, there is a new patch to the gcc Objective C runtime that aids dynamic linking. You'll have to apply this patch and reinstall the runtime before you can compile this version of libgnustep-base. * Several bug fixes, including two serious ones in Collection deallocation and behavior adding. See the ChangeLog for details. 1.78 Noteworthy changes since version '0.1.5' ============================================= * Better string handling. NSString is now fleshed out, and I've implemented a scheme by which the GNU String object and OpenStep's NSString can coexist nicely. The OpenStep classes declare their string arguments with (NSString*) just like the standard says, but the preferred (more flexible) way to declare string arguments is (id ); and these two types are set up so that they coexist. There is still more to be done. NSString has several unimplemented methods; GNU String needs some more work. * Newly implemented classes: MallocAddress, NSString, NSMutableString, NSCString, NSMutableCString. * Thanks to Pieter Schoenmakers we have a new version of the gcc-string.patch that should apply more smoothly. * Thanks to Adam Fedor for a bug fix to NXStringTable's. * Thanks to Mark Lakata for a bug fix to NSZone.c. * Several bug fixes. Thanks to those who reported them. Credits are in the ChangeLog. 1.79 Noteworthy changes since version '0.1.3' ============================================= This release not well tested at all. We desperately need someone to write a test suite using dejagnu. Any volunteers? I made this release now in order to share the progress that is being made on GNUSTEP. * New GNUSTEP implementations: NSObject, NSAutoreleasePool, NSZone. Thanks to Mark Lakata for NSZone. * New GNUSTEP implementations included, but not compiled: NSBundle, NSException, NSGeometry, NSNumber, NSValue. Many thanks Adam Fedor. * Many new GNU classes: String classes! String, MutableString, ConstantString. One interesting feature of the GNU string classes is that that, just like in Smalltalk, they are part of the Collection heirarchy--all the methods you are used to using on other collections can be used on these "collections of characters". You can create ConstantStrings using the @"" syntax. * Entire library converted to use 'retain', 'release', 'autorelease', 'dealloc' instead of 'free'. 1.80 Noteworthy changes since version '0.1.0' ============================================= * New category: ObjectRetaining. New classes: AutoreleasePool, AutoreleaseStack. * Bug fixes: Install next-includes properly. New instructions in README.ULTRIX. Time.m patched for Solaris 2.4. test12.m free fix. 1.81 Noteworthy changes in version '0.1.0' ========================================== * Renamed the library from 'libcoll' to 'libgnustep-base'. (See the end of the file 'DISCUSSION' for the background on this name choice.) Several file names changed to reflect this. GNU class interfaces are now included with 'objects' prefix, e.g. '#include '. * Many new classes. Pseudo-random number classes Random, RNGBerkeley and RNGAdditiveCongruential. New stream classes Stream, StdioStream and MemoryStream. New coder classes Coder, TextCoder and BinaryCoder. New network packet transmission classes Port and SocketPort. New remote object messaging classes Connection, Proxy and ConnectedCoder. New protocols Coding and Retaining. New, but unimplemented: Lock and Locking. New but soon-to-disapppear: RetainingNotifier, InvalidationListening. * Some bug fixes: Fixed the assert typo in Storage.m. The Time class now compiles under Solaris. Fixed insertion bug in CircularArray. NXStringTable_scan.l can now be compiled with lex, not just flex, (thanks to Adam Fedor ). Properly detect the difference between gcc running under NEXTSTEP and NeXT's cc. Using autoconf version 2.0. Renamed DelegateList to DelegatePool. Renamed some collection hierarchy methods for better consistency. * Some directory reorganization so that NeXT-compatible files can be included in the standard way, e.g. #include . Some other NeXT-compatibility improvements: Changed 'GNU' prefix to 'NX' in List and HashTable. New files zone.[hc] containing dummy stubs for NeXT-compatible zone functions. 1.82 Noteworthy changes in version '940524' =========================================== * A NeXT-compatible NXStringTable object, thanks to Adam Fedor . * SplayTree and RBTree classes now operational. More methods in Time class implemented. * Some API cleanup: -delegateListList changed to -delegateListCollection. -includesSameContents: changed to -contentsEqual:. -insertObject:atKey: changed to -putObject:atKey:. See the ChangeLog for more detail. * Configuration by autoconf in the self-tests directory. Configuration script tests GCC nested functions. Configuration script detects NEXTSTEP and makes the appropriate adjustments, including skipping the NeXT-compatibility classes. * Bug fixes: BinaryTree rotate methods fixed. Fixed the way 'ifNone:' and 'ifAbsent:' functions were called. Fixed the way long elements are printed. Added methods for preventing memory leaks by unfinished enumerations: '-newEnumState' and '-freeEnumState:'. Several bug fixes in List and Storage; changes for better NeXT-compability. And more. 1.83 Noteworthy changes in version '931026' =========================================== * Installation using './configure' and 'autoconf' * New BinaryTree and RBTree(unfinished) classes. Rewritten LinkedList class. * A new scheme for holding non-object elements in classes that require object contents; EltNodeCollector class. * Archiving with -write: and -read: methods. This involved removing the ability to set the comparison function independent of content type. * Removed COLL_NO_ELEMENT and friends. Now there are no arbitrary restrictions on which long int's can be stored. Like in Smalltalk, ...ifAbsentCall: methods have been added to replace this functionalty. * Added a LABMDA() macro for defining small functions in the arg position. * Removed many ...perform: methods. Use instead the more flexible ...call: methods with LABMDA(). * Renamed ...Description: methods to ...Encoding: for better use of already-defined objc keyword: @encode(). * New in the Collecting protocol: Filtered enumerating instead of filtered shallowCopy'ing. Enumerations still safe when modifying the contents. * The beginnings of documentation in libcoll.texi. * Many bug fixes. * ...and more. Also see the 'ChangeLog' file for more detail. Copyright (C) 2005 Free Software Foundation Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. gnustep-base-1.29.0/NSCharacterSets/000077500000000000000000000000001435650067400172065ustar00rootroot00000000000000gnustep-base-1.29.0/NSCharacterSets/.cvsignore000066400000000000000000000000111435650067400211760ustar00rootroot00000000000000Makefile gnustep-base-1.29.0/NSCharacterSets/README.CharSet000066400000000000000000000005421435650067400214170ustar00rootroot00000000000000############################################################################# THIS DIRECTORY IS OBSOLETE AND IS NO LONGER USED The NSCharacterSetData.h file (in SVN in libs/base/Source) is generated using the tools in tools/charsets and the library in libs/ucsdata ############################################################################# gnustep-base-1.29.0/NSTimeZones/000077500000000000000000000000001435650067400163705ustar00rootroot00000000000000gnustep-base-1.29.0/NSTimeZones/GNUmakefile000066400000000000000000000040301435650067400204370ustar00rootroot00000000000000# # NSTimeZones makefile for GNUstep Base Library # Copyright (C) 1995, 1996 Free Software Foundation, Inc. # # Written by: Adam Fedor # # This file is part of the GNUstep Base Library. # # 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 3 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 # Library General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free # Software Foundation, Inc., 51 Franklin Street, Fifth Floor, # Boston, MA 02111 USA. ifeq ($(GNUSTEP_MAKEFILES),) GNUSTEP_MAKEFILES := $(shell gnustep-config --variable=GNUSTEP_MAKEFILES 2>/dev/null) ifeq ($(GNUSTEP_MAKEFILES),) $(warning ) $(warning Unable to obtain GNUSTEP_MAKEFILES setting from gnustep-config!) $(warning Perhaps gnustep-make is not properly installed,) $(warning so gnustep-config is not in your PATH.) $(warning ) $(warning Your PATH is currently $(PATH)) $(warning ) endif endif ifeq ($(GNUSTEP_MAKEFILES),) $(error You need to set GNUSTEP_MAKEFILES before compiling!) endif PACKAGE_NAME = gnustep-base GNUSTEP_LOCAL_ADDITIONAL_MAKEFILES=../base.make include $(GNUSTEP_MAKEFILES)/common.make -include ../Version -include ../config.mak libgnustep-base_INTERFACE_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION) resourcedir = $(GNUSTEP_LIBRARY)/Libraries/gnustep-base/Versions/$(libgnustep-base_INTERFACE_VERSION)/Resources TIMEZONE_ARCHIVE = \ NSTimeZones.tar -include Makefile.preamble # We don't actually build anything in this directory so # just include the common makefile rules include $(GNUSTEP_MAKEFILES)/rules.make -include Makefile.postamble gnustep-base-1.29.0/NSTimeZones/Makefile.postamble000066400000000000000000000052021435650067400220140ustar00rootroot00000000000000# # Makefile.postamble # # Copyright (C) 1997 Free Software Foundation, Inc. # # Author: Adam Fedor # # This file is part of the GNUstep Base Library. # # 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 3 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 # Library General Public License for more details. # # If you are interested in a warranty or support for this source code, # contact Scott Christley at scottc@net-community.com # # You should have received a copy of the GNU Lesser General Public # License along with this library; see the file COPYING.LIB. # If not, write to the Free Software Foundation, # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # Makefile.postamble # # Project specific makefile rules # # Uncomment the targets you want. # The double colons (::) are important, do not make them single colons # otherwise the normal makefile rules will not be performed. # # Things to do before compiling # before-all:: # Things to do after compiling # after-all:: # Things to do before installing # before-install:: # Things to do after installing # This directory is created by NSCharacterSets/GNUmakefile, but in # case the order is somewhat messed up and that GNUmakefile has not # been executed, we include here rules to create the directory if it's # not there yet. $(resourcedir): $(MKINSTALLDIRS) $(resourcedir) after-install:: $(resourcedir) cp $(TIMEZONE_ARCHIVE) $(resourcedir); \ cd $(resourcedir); \ if [ -f NSTimeZones/localtime ]; then \ cp NSTimeZones/localtime /tmp/localtime.tmp; \ else \ rm -f /tmp/localtime.tmp; \ fi; \ rm -rf NSTimeZones; \ tar -xf $(TIMEZONE_ARCHIVE); \ rm -f $(TIMEZONE_ARCHIVE); \ if [ -f /tmp/localtime.tmp ]; then \ cp /tmp/localtime.tmp NSTimeZones/localtime; \ rm -f /tmp/localtime.tmp; \ fi # Things to do before uninstalling # before-uninstall:: # Things to do after uninstalling after-uninstall:: cd $(resourcedir); rm -rf NSTimeZones # Things to do before cleaning # before-clean:: # Things to do after cleaning # after-clean:: # Things to do before distcleaning # before-distclean:: # Things to do after distcleaning after-distclean:: rm -rf NSTimeZones # Things to do before checking # before-check:: # Things to do after checking # after-check:: gnustep-base-1.29.0/NSTimeZones/NSTimeZones.tar000066400000000000000000034600001435650067400212610ustar00rootroot00000000000000NSTimeZones/0000755000175000017500000000000014353032572013052 5ustar richardrichardNSTimeZones/preferred_abbreviations.plist0000644000175000017500000000277713324137172021031 0ustar richardrichard{ ADT = "America/Halifax"; AFT = "Asia/Kabul"; AKDT = "America/Juneau"; AKST = "America/Juneau"; ART = "America/Argentina/Buenos_Aires"; AST = "America/Halifax"; BDT = "Asia/Dhaka"; BRST = "America/Sao_Paulo"; BRT = "America/Sao_Paulo"; BST = "Europe/London"; CAT = "Africa/Harare"; CDT = "America/Chicago"; CEST = "Europe/Paris"; CET = "Europe/Paris"; CLST = "America/Santiago"; CLT = "America/Santiago"; COT = "America/Bogota"; CST = "America/Chicago"; EAT = "Africa/Addis_Ababa"; EDT = "America/New_York"; EEST = "Europe/Athens"; EET = "Europe/Athens"; EST = "America/New_York"; GMT = GMT; GST = "Asia/Dubai"; HKST = Asia/Hong_Kong; HKT = "Asia/Hong_Kong"; HST = "Pacific/Honolulu"; ICT = "Asia/Bangkok"; IRST = "Asia/Tehran"; IST = "Asia/Kolkata"; JST = "Asia/Tokyo"; KST = "Asia/Seoul"; MDT = "America/Denver"; MSD = "Europe/Moscow"; MSK = "Europe/Moscow"; MST = "America/Phoenix"; NDT = "America/St_Johns"; NST = "America/St_Johns"; NZDT = "Pacific/Auckland"; NZST = "Pacific/Auckland"; PDT = "America/Los_Angeles"; PET = "America/Lima"; PHT = "Asia/Manila"; PKT = "Asia/Karachi"; PST = "America/Los_Angeles"; SGT = "Asia/Singapore"; TRT = "Europe/Istanbul"; UTC = UTC; WAT = "Africa/Lagos"; WEST = "Europe/Lisbon"; WET = "Europe/Lisbon"; WIT = "Asia/Jakarta"; YDT = America/Yakutat; YST = America/Yakutat; } NSTimeZones/zones/0000755000175000017500000000000014353032552014206 5ustar richardrichardNSTimeZones/zones/Antarctica/0000755000175000017500000000000014353032552016257 5ustar richardrichardNSTimeZones/zones/Antarctica/Mawson0000644000175000017500000000023014353032552017441 0ustar richardrichardTZif2TZif2 ÿÿÿÿâ 2€JÚ"@T`FP-00+06+05 <+05>-5 NSTimeZones/zones/Antarctica/Macquarie0000644000175000017500000000172014353032552020111 0ustar richardrichardTZif2TZif2[ÿÿÿÿ|ÿÿÿÿ›Õx€ÿÿÿÿœ¼/ÿÿÿÿ ‡´`ÿÿÿÿ× hÿÿÿÿûÂÿÿÿÿü²~ÿÿÿÿýÇYÿÿÿÿþv°€ÿÿÿÿÿ§;V’€‡?¯p9€ P€ö8€/ý€Ö€ ߀ µü€ ïÁ€ Ÿ ØÞ ~û¸À^ݘ¢>¿x„¡Xfþƒ8HO!d€ã1F€§c€á(€‡E€Á €g'€—² Y~€!€Î€"B›#ië$"}%IÍ&_')¯'ô¶(íá€)Ô˜*ÍÀ+´z,­¥€-”\.‡€/t>0mi€1]Z€2V†3=<€46h5€6J6ý€7ö,8Üâ€9§é€:¼Ä€;¿*€<¥á=Ÿ €>…Ã?~î€@e¥A^ЀBE‡C>²€D.£€E”€FKG±G÷¢Hç“IׄJÇuM—HŒ š° -00AESTAEDT AEST-10AEDT,M10.1.0,M4.1.0/3 NSTimeZones/zones/Antarctica/DumontDUrville0000644000175000017500000000023214353032552021114 0ustar richardrichardTZif2TZif2 ÿÿÿÿV¶Zÿÿÿÿrí¤‰ø‰ðŒ  LMTPMMT+10 <+10>-10 NSTimeZones/zones/Antarctica/South_Pole0000644000175000017500000000202314353032552020260 0ustar richardrichardTZif2TZif2`ÿÿÿÿA·L¨ÿÿÿÿ°´²èÿÿÿÿ±Q‡Xÿÿÿÿ²xåhÿÿÿÿ³Cå`ÿÿÿÿ´XÇhÿÿÿÿµ#Ç`ÿÿÿÿ¶8©hÿÿÿÿ·©`ÿÿÿÿ¸‹hÿÿÿÿ¸ìÅàÿÿÿÿ¹ømhÿÿÿÿºÌ§àÿÿÿÿ»ØOhÿÿÿÿ¼ãèàÿÿÿÿ½®öèÿÿÿÿ¾ÃÊàÿÿÿÿ¿ŽØèÿÿÿÿÀ£¬àÿÿÿÿÁnºèÿÿÿÿƒŽàÿÿÿÿÃNœèÿÿÿÿÄcpàÿÿÿÿÅ.~èÿÿÿÿÆL`ÿÿÿÿÇ`èÿÿÿÿÈ,o`ÿÿÿÿÈ÷}hÿÿÿÿÒÚš@ ýà ¬¥à ï¥` žüà ØÁà ~Þรà^Àà˜…à>¢àxgà„àXIàþfà8+àçƒ`!H`Çe`*`§G`á `‡)`Àî`g ` Ð` Fí`!€²`"0 à#iÎà$ëà%.`&Bà' ã`'â$à(íÅ`)Âà*ͧ`+«#`,­‰`-‹`.k`/jç`0mM`1JÉ`2Vià3*«`46Kà5 `6-à6ó©à7öà8Ó‹à9Õñà:³mà;¿`<“Oà=žð`>s1à?~Ò`@\N`A^´`B<0`C>–`D`Ex`Eûô`FþZ`£Ø¯È¡¸ ¨À¶Ð¨ÀLMTNZSTNZMTNZDT NZST-12NZDT,M9.5.0,M4.1.0/3 NSTimeZones/zones/Antarctica/Davis0000644000175000017500000000030514353032552017246 0ustar richardrichardTZif2TZif2 ÿÿÿÿçœ@ÿÿÿÿöGßÿÿÿÿþG«JÚ0K—ú@N©ª0OC÷ÀbpFP-00+07+05 <+07>-7 NSTimeZones/zones/Antarctica/Palmer0000644000175000017500000000156714353032552017433 0ustar richardrichardTZif2TZif2Rÿÿÿÿö˜­ÿÿÿÿö柰ÿÿÿÿøCÀÿÿÿÿøÇÓ0ÿÿÿÿùôw@ÿÿÿÿúÓ6°ÿÿÿÿûÃ5Àÿÿÿÿü¼S0ÿÿÿÿý¬R@ÿÿÿÿþœ50ÿÿÿÿÿŒ4@£J°$o 0¼°]ÀÑV°æ?À±8°Ï\@‘°¯>@pü° @ 0!o@"9û0#Nä@$Ý0%8À%ù¿0&òøÀ'Ù¡0(÷ÄÀ)½°*צÀ+¢Ÿ°,·ˆÀ-‚°.—jÀ/bc°0€‡@1BE°2`i@3=×04@K@5 D06 ¸@7Õ°8@8Ë09é+À:ªê0;É À<ŠÌ0=¨ïÀ>j®0?ˆÑÀ@SʰAh³ÀB3¬°CH•ÀDްE1²@Eóp°G”@Gï0Hñv@I¼o0JÑX@K¸°L±:@MÆ0NP‚ÀOœ®°PBÙÀQ|°R+ö@S\r°T Ø@W7æ0W¯ìÀXC†°ÿÿÇÀÿÿÕÐÿÿãà ÿÿÕÐ-00-04-03-02 <-03>3 NSTimeZones/zones/Antarctica/Rothera0000644000175000017500000000020414353032552017602 0ustar richardrichardTZif2TZif2 -ÿÿÕÐ-00-03 <-03>3 NSTimeZones/zones/Antarctica/Syowa0000644000175000017500000000020514353032552017301 0ustar richardrichardTZif2TZif2ÿÿÿÿÕ6´+Ì*0LMT+03 <+03>-3 NSTimeZones/zones/Antarctica/Vostok0000644000175000017500000000020514353032552017464 0ustar richardrichardTZif2TZif2ÿÿÿÿ°þºdRT`LMT+06 <+06>-6 NSTimeZones/zones/Antarctica/Troll0000644000175000017500000000026114353032552017275 0ustar richardrichardTZif2TZif2 B GBF -00+02+00 <+00>0<+02>-2,M3.5.0/1,M10.5.0/3 NSTimeZones/zones/Antarctica/McMurdo0000644000175000017500000000202314353032552017545 0ustar richardrichardTZif2TZif2`ÿÿÿÿA·L¨ÿÿÿÿ°´²èÿÿÿÿ±Q‡Xÿÿÿÿ²xåhÿÿÿÿ³Cå`ÿÿÿÿ´XÇhÿÿÿÿµ#Ç`ÿÿÿÿ¶8©hÿÿÿÿ·©`ÿÿÿÿ¸‹hÿÿÿÿ¸ìÅàÿÿÿÿ¹ømhÿÿÿÿºÌ§àÿÿÿÿ»ØOhÿÿÿÿ¼ãèàÿÿÿÿ½®öèÿÿÿÿ¾ÃÊàÿÿÿÿ¿ŽØèÿÿÿÿÀ£¬àÿÿÿÿÁnºèÿÿÿÿƒŽàÿÿÿÿÃNœèÿÿÿÿÄcpàÿÿÿÿÅ.~èÿÿÿÿÆL`ÿÿÿÿÇ`èÿÿÿÿÈ,o`ÿÿÿÿÈ÷}hÿÿÿÿÒÚš@ ýà ¬¥à ï¥` žüà ØÁà ~Þรà^Àà˜…à>¢àxgà„àXIàþfà8+àçƒ`!H`Çe`*`§G`á `‡)`Àî`g ` Ð` Fí`!€²`"0 à#iÎà$ëà%.`&Bà' ã`'â$à(íÅ`)Âà*ͧ`+«#`,­‰`-‹`.k`/jç`0mM`1JÉ`2Vià3*«`46Kà5 `6-à6ó©à7öà8Ó‹à9Õñà:³mà;¿`<“Oà=žð`>s1à?~Ò`@\N`A^´`B<0`C>–`D`Ex`Eûô`FþZ`£Ø¯È¡¸ ¨À¶Ð¨ÀLMTNZSTNZMTNZDT NZST-12NZDT,M9.5.0,M4.1.0/3 NSTimeZones/zones/Antarctica/Casey0000644000175000017500000000036314353032552017250 0ustar richardrichardTZif2TZif2  ÿÿÿÿþÌ€JÚ KÊðN©œ OCÍX ;€Z¤[¹@\€]–E0^cÅ_x <p€š°-00+08+11 <+11>-11 NSTimeZones/zones/US/0000755000175000017500000000000014353032552014535 5ustar richardrichardNSTimeZones/zones/US/Mountain0000644000175000017500000000202214353032552016246 0ustar richardrichardTZif2TZif2aÿÿÿÿ^ °ÿÿÿÿž¦:ÿÿÿÿŸ»€ÿÿÿÿ †ÿÿÿÿ¡šé€ÿÿÿÿ¢eþÿÿÿÿ£„ÿÿÿÿ¤Eàÿÿÿÿ¤¦€ÿÿÿÿˉ ÿÿÿÿÒ#ôpÿÿÿÿÒaÿÿÿÿ÷/vÿÿÿÿø(”ÿÿÿÿùXÿÿÿÿúvÿÿÿÿúøuÿÿÿÿûèXÿÿÿÿüØWÿÿÿÿýÈ:ÿÿÿÿþ¸9ÿÿÿÿÿ¨˜‡þwýq€aPü€@û0Þ€5 À€ ­± 𢀠ࡠٿ Àƒ¹¡© ™ƒ‰‚yeidYGIF9))("E€ '€ò&â €ÒÁ뀱ê¡Í€ v!¯€"Uÿ#jÌ$5á%J®&Ã'*'þß) r)ÞÁ*êT+¾£,Óp€-ž….³R€/~g0“4€1g„2s€3Gf4Rø€5'H62Ú€7*8÷8ç 9ûÙ:Æî;Û»<° =»>ì?›@oÎA„›€BO°Cd}€D/’ED_€EóÅÿÿ”ÿÿ« ÿÿÿÿ«  ÿÿ« LMTMDTMSTMWTMPT MST7MDT,M3.2.0,M11.1.0 NSTimeZones/zones/US/Samoa0000644000175000017500000000022214353032552015514 0ustar richardrichardTZif2TZif2ÿÿÿÿn=Èÿÿÿÿ‘û±xÿÿ_øÿÿePLMTSST SST11 NSTimeZones/zones/US/Indiana-Starke0000644000175000017500000000177014353032552017257 0ustar richardrichardTZif2TZif2]ÿÿÿÿ^þ ÿÿÿÿž¦,€ÿÿÿÿŸºùpÿÿÿÿ †€ÿÿÿÿ¡šÛpÿÿÿÿˈþ€ÿÿÿÿÒ#ôpÿÿÿÿÒa ðÿÿÿÿÕUÕÿÿÿÿÖ Íðÿÿÿÿ×5·ÿÿÿÿدðÿÿÿÿÙ™ÿÿÿÿÙà‘ðÿÿÿÿÚþµ€ÿÿÿÿÛÀsðÿÿÿÿÜÞ—€ÿÿÿÿÝ©pÿÿÿÿÞ¾y€ÿÿÿÿ߉rpÿÿÿÿàž[€ÿÿÿÿáiTpÿÿÿÿâ~=€ÿÿÿÿãI6pÿÿÿÿä^€ÿÿÿÿåW<ðÿÿÿÿæG<ÿÿÿÿç7ðÿÿÿÿè'ÿÿÿÿèòðÿÿÿÿêÿÿÿÿêÑøðÿÿÿÿëæâÿÿÿÿìÖÄðÿÿÿÿíÆÄÿÿÿÿî¿ápÿÿÿÿï¯à€ÿÿÿÿðŸÃpÿÿÿÿñ€ÿÿÿÿô_‡pÿÿÿÿúøgÿÿÿÿûèIðÿÿÿÿüØIÿÿÿÿýÈ+ðÿÿÿÿþ¸+ÿÿÿÿÿ¨ 𘠇ïðwïq pa €Pîp@í€0Ðp'€ ²p ­£ ð”p à“€ Ù°ð Àu€¹’ð©’™tð‰tyVðiVY8ðI89ð)"7püpò€áûpÑú€ÁÝp±Ü€¡¿p v!¡p"Uñ#j½ð$5Ó%JŸð&µ'*ð'þÑ€) cðD/vpEDQpEó·ÿÿ®Êÿÿ¹°ÿÿ« ÿÿ¹° ÿÿ¹°ÿÿ¹°LMTCDTCSTCWTCPTEST CST6CDT,M3.2.0,M11.1.0 NSTimeZones/zones/US/Hawaii0000644000175000017500000000033514353032552015663 0ustar richardrichardTZif2TZif2ÿÿÿÿtàp¾ÿÿÿÿ»CHÿÿÿÿ»!qXÿÿÿÿˉ=ÈÿÿÿÿÒ#ôpÿÿÿÿÒaI8ÿÿÿÿÕsHÿÿlÿÿlXÿÿzhÿÿzh ÿÿzhÿÿs`LMTHSTHDTHWTHPT HST10 NSTimeZones/zones/US/Eastern0000644000175000017500000000332014353032552016057 0ustar richardrichardTZif2TZif2¯ÿÿÿÿ^ðÿÿÿÿž¦pÿÿÿÿŸºë`ÿÿÿÿ †pÿÿÿÿ¡šÍ`ÿÿÿÿ¢eâpÿÿÿÿ£ƒéàÿÿÿÿ¤j®pÿÿÿÿ¥5§`ÿÿÿÿ¦SÊðÿÿÿÿ§‰`ÿÿÿÿ¨3¬ðÿÿÿÿ¨þ¥àÿÿÿÿªŽðÿÿÿÿªÞ‡àÿÿÿÿ«ópðÿÿÿÿ¬¾iàÿÿÿÿ­ÓRðÿÿÿÿ®žKàÿÿÿÿ¯³4ðÿÿÿÿ°~-àÿÿÿÿ±œQpÿÿÿÿ²gJ`ÿÿÿÿ³|3pÿÿÿÿ´G,`ÿÿÿÿµ\pÿÿÿÿ¶'`ÿÿÿÿ·;÷pÿÿÿÿ¸ð`ÿÿÿÿ¹Ùpÿÿÿÿ¹æÒ`ÿÿÿÿ»õðÿÿÿÿ»Æ´`ÿÿÿÿ¼ä×ðÿÿÿÿ½¯Ðàÿÿÿÿ¾Ä¹ðÿÿÿÿ¿²àÿÿÿÿÀ¤›ðÿÿÿÿÁo”àÿÿÿÿ„}ðÿÿÿÿÃOvàÿÿÿÿÄd_ðÿÿÿÿÅ/XàÿÿÿÿÆM|pÿÿÿÿÇ:àÿÿÿÿÈ-^pÿÿÿÿÈøW`ÿÿÿÿÊ @pÿÿÿÿÊØ9`ÿÿÿÿˈðpÿÿÿÿÒ#ôpÿÿÿÿÒ`ûàÿÿÿÿÓuäðÿÿÿÿÔ@ÝàÿÿÿÿÕUÆðÿÿÿÿÖ ¿àÿÿÿÿ×5¨ðÿÿÿÿØ¡àÿÿÿÿÙŠðÿÿÿÿÙàƒàÿÿÿÿÚþ§pÿÿÿÿÛÀeàÿÿÿÿÜÞ‰pÿÿÿÿÝ©‚`ÿÿÿÿÞ¾kpÿÿÿÿ߉d`ÿÿÿÿàžMpÿÿÿÿáiF`ÿÿÿÿâ~/pÿÿÿÿãI(`ÿÿÿÿä^pÿÿÿÿåW.àÿÿÿÿæG-ðÿÿÿÿç7àÿÿÿÿè'ðÿÿÿÿéòàÿÿÿÿêñðÿÿÿÿêöÔàÿÿÿÿëæÓðÿÿÿÿìÖ¶àÿÿÿÿíÆµðÿÿÿÿî¿Ó`ÿÿÿÿï¯ÒpÿÿÿÿðŸµ`ÿÿÿÿñ´pÿÿÿÿò—`ÿÿÿÿóo–pÿÿÿÿô_y`ÿÿÿÿõOxpÿÿÿÿö?[`ÿÿÿÿ÷/Zpÿÿÿÿø(wàÿÿÿÿùÐp?›bà@o²pA„`BO”pCda`D/vpEDC`Eó¨ðÿÿºžÿÿÇÀÿÿ¹°ÿÿÇÀ ÿÿÇÀLMTEDTESTEWTEPT EST5EDT,M3.2.0,M11.1.0 NSTimeZones/zones/US/Pacific0000644000175000017500000000241614353032552016021 0ustar richardrichardTZif2TZif2}ÿÿÿÿ^Àÿÿÿÿž¦H ÿÿÿÿŸ»ÿÿÿÿ †* ÿÿÿÿ¡š÷ÿÿÿÿˉ ÿÿÿÿÒ#ôpÿÿÿÿÒa&ÿÿÿÿÖþt\ÿÿÿÿØ€­ÿÿÿÿÚþÃÿÿÿÿÛÀÿÿÿÿÜÞ¥ÿÿÿÿÝ©¬ÿÿÿÿÞ¾‡ÿÿÿÿ߉Žÿÿÿÿàžiÿÿÿÿáipÿÿÿÿâ~KÿÿÿÿãIRÿÿÿÿä^-ÿÿÿÿå)4ÿÿÿÿæGJÿÿÿÿçQÿÿÿÿè',ÿÿÿÿèò3ÿÿÿÿêÿÿÿÿêÒÿÿÿÿëæðÿÿÿÿì±÷ÿÿÿÿíÆÒÿÿÿÿî‘Ùÿÿÿÿï¯îÿÿÿÿðq»ÿÿÿÿñÐÿÿÿÿòÁÿÿÿÿóo²ÿÿÿÿô_£ÿÿÿÿõO”ÿÿÿÿö?…ÿÿÿÿ÷/vÿÿÿÿø(¢ÿÿÿÿùXÿÿÿÿú„ÿÿÿÿúøƒ ÿÿÿÿûèfÿÿÿÿüØe ÿÿÿÿýÈHÿÿÿÿþ¸G ÿÿÿÿÿ¨*˜) ˆ x q(a' Q A  0ìC  Î ­¿ ð° ௠ ÙÍ À‘ ¹¯©® ™‘‰ ysir YUIT 97)6 "S  5ò4 âÒ Áù±ø ¡Û v+ !½"V #jÚ$5ï %J¼&Ñ '*ž'þí ) €)ÞÏ *êb+¾± ,Ó~-ž“ .³`/~u 0“B1g’ 2s$3Gt 4S5'V 62è78 88ç 9ûç:Æü ;ÛÉ<° =»«>ú ?›@oÜ A„©BO¾ Cd‹D/  EDmEóÓ ÿÿ‘&ÿÿÿÿ€ÿÿ ÿÿLMTPDTPSTPWTPPT PST8PDT,M3.2.0,M11.1.0 NSTimeZones/zones/US/Michigan0000644000175000017500000000160314353032552016177 0ustar richardrichardTZif2TZif2Pÿÿÿÿ…½"[ÿÿÿÿ™<”ÿÿÿÿˈðpÿÿÿÿÒ#ôpÿÿÿÿÒ`ûàÿÿÿÿ×5¨ðÿÿÿÿØ¡àÿÿÿÿû3Œÿÿÿÿûè;àÿÿÿÿüØ:ðÿÿÿÿýÈà@ßp0Â`p ¤` £p ð†` à…p Ù¢à Àgp¹„੃ð™fà‰eðyHàiGðY*àI)ð9 à) ð")`íð `ò páí`ÑìpÁÏ`±Îp¡±` vð!“`"Uâð#j¯à$5Äð%J‘à&¦ð'*sà'þÃp) Uà)Þ¥p*ê7à+¾‡p,ÓT`-žip.³6`/~Kp0“`1ggð2rú`3GIð4RÜ`5'+ð62¾`7 ð8Úà8æïð9û¼à:ÆÑð;Ûžà<¯îp=»€à>Ðp?›bà@o²pA„`BO”pCda`D/vpEDC`Eó¨ðÿÿ²%ÿÿ« ÿÿ¹°ÿÿÇÀ ÿÿÇÀÿÿÇÀLMTCSTESTEWTEPTEDT EST5EDT,M3.2.0,M11.1.0 NSTimeZones/zones/US/Central0000644000175000017500000000333214353032552016051 0ustar richardrichardTZif2TZif2¯ÿÿÿÿ^þ ÿÿÿÿž¦,€ÿÿÿÿŸºùpÿÿÿÿ †€ÿÿÿÿ¡šÛpÿÿÿÿ¢Ëtÿÿÿÿ£ƒ÷ðÿÿÿÿ¤EÒ€ÿÿÿÿ¥cÙðÿÿÿÿ¦SÙÿÿÿÿ§—pÿÿÿÿ¨3»ÿÿÿÿ¨þ³ðÿÿÿÿªÿÿÿÿªÞ•ðÿÿÿÿ«óÿÿÿÿ¬¾wðÿÿÿÿ­Óaÿÿÿÿ®žYðÿÿÿÿ¯³Cÿÿÿÿ°~;ðÿÿÿÿ±œ_€ÿÿÿÿ²gXpÿÿÿÿ³|A€ÿÿÿÿ´G:pÿÿÿÿµ\#€ÿÿÿÿ¶'pÿÿÿÿ·<€ÿÿÿÿ¸þpÿÿÿÿ¹ç€ÿÿÿÿ¹æàpÿÿÿÿ»ÿÿÿÿ»ÆÂpÿÿÿÿ¼äæÿÿÿÿ½¯Þðÿÿÿÿ¾ÄÈÿÿÿÿ¿ÀðÿÿÿÿÀZÖÿÿÿÿÁ°Þ€?›pð@oÀ€A„pBO¢€CdopD/„€EDQpEó·ÿÿ­Ôÿÿ¹°ÿÿ« ÿÿ¹° ÿÿ¹°ÿÿ¹°LMTCDTCSTESTCWTCPT CST6CDT,M3.2.0,M11.1.0 NSTimeZones/zones/US/Alaska0000644000175000017500000000172114353032552015655 0ustar richardrichardTZif2TZif2T (ÿÿÿÿ?ÂýÑÿÿÿÿ}‡AHÿÿÿÿˉ6ÀÿÿÿÿÒ#ôpÿÿÿÿÒaB0ÿÿÿÿúÒG ÿÿÿÿþ¸c@ÿÿÿÿÿ¨F0˜E@ˆ(0x'@qD°aCÀQ&°A%À1°_À ê° ­Û@ ð̰ àËÀ Ùé0 À­À¹Ë0©Ê@™­0‰¬@y0iŽ@Yq0Ip@9S0)R@"o° 4@Q°+òB°â% Ò$°Â ²°¡é  v90!Ë "V0#jè $5ý0%JÊ &ß0'*¬ 'þû°) Ž )Þݰ*êp +¾¿°,ÓŒ -ž¡°.³n /~ƒ°0“P 1g 02s2 3G‚04S 5'd062ö 7F08 8ç(09ûõ :Ç 0;Û× <°&°=»¹ >°?›› @oê°A„· BO̰Cd™ D/®°ED{ Eóá0                        Äøÿÿsxÿÿs`ÿÿpÿÿp ÿÿs`ÿÿpÿÿpÿÿ€ÿÿp#LMTASTAWTAPTAHSTAHDTYSTAKDTAKST AKST9AKDT,M3.2.0,M11.1.0 NSTimeZones/zones/US/Aleutian0000644000175000017500000000171114353032552016222 0ustar richardrichardTZif2TZif2T !ÿÿÿÿ?ÂýÑÿÿÿÿ}‡Z^ÿÿÿÿˉDÐÿÿÿÿÒ#ôpÿÿÿÿÒaP@ÿÿÿÿúÒU°ÿÿÿÿþ¸qPÿÿÿÿÿ¨T@˜SPˆ6@x5PqRÀaQÐQ4ÀA3Ð1ÀmÐ øÀ ­éP ðÚÀ àÙÐ Ù÷@ À»Ð¹Ù@©ØP™»@‰ºPy@iœPY@I~P9a@)`P"}À BP_À+" òPÀâ3°Ò2À°²À¡÷° vG@!Ù°"V)@#jö0$6 @%JØ0&í@'*º0'ÿ À) œ0)ÞëÀ*ê~0+¾ÍÀ,Óš°-ž¯À.³|°/~‘À0“^°1g®@2s@°3G@4S"°5'r@63°7T@8!08ç6@9ü0:Ç@;Ûå0<°4À=»Ç0>À?›©0@oøÀA„ŰBOÚÀCd§°D/¼ÀED‰°Eóï@                        «âÿÿZbÿÿePÿÿs`ÿÿs` ÿÿePÿÿs`ÿÿs`ÿÿpÿÿs`LMTNSTNWTNPTBSTBDTAHSTHDT HST10HDT,M3.2.0,M11.1.0 NSTimeZones/zones/US/Arizona0000644000175000017500000000036014353032552016062 0ustar richardrichardTZif2TZif2 ÿÿÿÿ^ °ÿÿÿÿž¦:ÿÿÿÿŸ»€ÿÿÿÿ †ÿÿÿÿ¡šé€ÿÿÿÿˉ ÿÿÿÿÏßÿÿÿÿÏå¬ÿÿÿÿÐÿÿÿÿúøuÿÿÿÿûèXÿÿ–îÿÿ« ÿÿÿÿ«  LMTMDTMSTMWT MST7 NSTimeZones/zones/US/East-Indiana0000644000175000017500000000102314353032552016711 0ustar richardrichardTZif2TZif2&ÿÿÿÿ^þ ÿÿÿÿž¦,€ÿÿÿÿŸºùpÿÿÿÿ †€ÿÿÿÿ¡šÛpÿÿÿÿÊW"€ÿÿÿÿÊØGpÿÿÿÿˈþ€ÿÿÿÿÒ#ôpÿÿÿÿÒa ðÿÿÿÿÓuóÿÿÿÿÔ@ëðÿÿÿÿÕUÕÿÿÿÿÖ Íðÿÿÿÿ×5·ÿÿÿÿدðÿÿÿÿÙ™ÿÿÿÿÙà‘ðÿÿÿÿÚþµ€ÿÿÿÿÛÀsðÿÿÿÿÜÞ—€ÿÿÿÿÝ©pÿÿÿÿÞ¾y€ÿÿÿÿ߉rpÿÿÿÿàž[€ÿÿÿÿáiTpÿÿÿÿâ~=€ÿÿÿÿãI6pÿÿÿÿä^€ÿÿÿÿèòðÿÿÿÿêÿÿÿÿþ¸ðÿÿÿÿÿ§ÿà—þð‡áàD/vpEDC`Eó¨ðÿÿ¯:ÿÿ¹°ÿÿ« ÿÿ¹° ÿÿ¹°ÿÿ¹°ÿÿÇÀLMTCDTCSTCWTCPTESTEDT EST5EDT,M3.2.0,M11.1.0 NSTimeZones/zones/Greenwich0000644000175000017500000000015714353032552016047 0ustar richardrichardTZif2TZif2GMT GMT0 NSTimeZones/zones/Eire0000644000175000017500000000273014353032552015017 0ustar richardrichardTZif2TZif2‘ÿÿÿÿWÑ ñÿÿÿÿ›&³‘ÿÿÿÿ›Ö ÿÿÿÿœÏ0 ÿÿÿÿ¤Ã ÿÿÿÿžœ ÿÿÿÿŸ— ÿÿÿÿ …º ÿÿÿÿ¡vü ÿÿÿÿ¢eœ ÿÿÿÿ£{È ÿÿÿÿ¤N¸ ÿÿÿÿ¥?û ÿÿÿÿ¦%` ÿÿÿÿ§'Æ ÿÿÿÿ¨*, ÿÿÿÿ¨ëø ÿÿÿÿªÓ ÿÿÿÿªÕ ÿÿÿÿ«éð ÿÿÿÿ¬Çl ÿÿÿÿ­ÉÒ ÿÿÿÿ®§N ÿÿÿÿ¯ y ÿÿÿÿ°‡0 ÿÿÿÿ±’Рÿÿÿÿ²pL ÿÿÿÿ³r² ÿÿÿÿ´P. ÿÿÿÿµIZ ÿÿÿÿ¶0 ÿÿÿÿ·2v ÿÿÿÿ¸ò ÿÿÿÿ¹X ÿÿÿÿ¹ïÔ ÿÿÿÿºé ÿÿÿÿ»Øñ ÿÿÿÿ¼ÛW ÿÿÿÿ½¸Ó ÿÿÿÿ¾±þ ÿÿÿÿ¿˜µ ÿÿÿÿÀ› ÿÿÿÿÁx— ÿÿÿÿÂzý ÿÿÿÿÃXy ÿÿÿÿÄQ¤ ÿÿÿÿÅ8[ ÿÿÿÿÆ:Á ÿÿÿÿÇXÖ ÿÿÿÿÇÚ  ÿÿÿÿÔIà ÿÿÿÿÕ! ÿÿÿÿÖN¬ ÿÿÿÿ×,( ÿÿÿÿØ.Ž ÿÿÿÿØù• ÿÿÿÿÚp ÿÿÿÿÚëì ÿÿÿÿÛå ÿÿÿÿÜËÎ ÿÿÿÿÝÄù ÿÿÿÿÞ´ê ÿÿÿÿß® ÿÿÿÿà”Ì ÿÿÿÿárH ÿÿÿÿâkt ÿÿÿÿãR* ÿÿÿÿäT ÿÿÿÿå2  ÿÿÿÿæ=­ ÿÿÿÿç) ÿÿÿÿèT ÿÿÿÿèû ÿÿÿÿéýq ÿÿÿÿêÚí ÿÿÿÿëÝS ÿÿÿÿìºÏ ÿÿÿÿí³ú ÿÿÿÿîš± ÿÿÿÿïg ÿÿÿÿðŸ} ÿÿÿÿñaI ÿÿÿÿò_ ÿÿÿÿóJf ÿÿÿÿô_A ÿÿÿÿõ!  ÿÿÿÿö?# ÿÿÿÿ÷ï ÿÿÿÿø ÿÿÿÿøàÑ ÿÿÿÿùþç ÿÿÿÿúÀ³ ÿÿÿÿûè ÿÿÿÿü{« ÿÿÿÿýÇ»ppÆ )X P¨  : 0Š é l Èþ ðN ²  Ð0 ‘ü ° qÞ ™. QÀ y 1¢ Xò #ë8ÆÍ¨ã¯øŠÑ᧬®Á‰Œ¡k lr!M"LT#a/$,6%JK& '*-'õ4) )Õ*éñ+´ø,ÉÓ-”Ú.©µ/t¼0‰—1]Ùÿÿúÿÿú LMTDMTISTBSTGMT IST-1GMT0,M10.5.0,M3.5.0/1 NSTimeZones/zones/Africa/0000755000175000017500000000000014353032552015373 5ustar richardrichardNSTimeZones/zones/Africa/El_Aaiun0000644000175000017500000000344614353032552017002 0ustar richardrichardTZif2TZif2ºÿÿÿÿ¼Hðà Ѱ è aGð É?€ŽòpÓQ€'£pHAæ€H»"pJ#JÕpKÜÀ€L]åpM—¸€N4ŒðOœ  P» P1š Pg§ Q|‚ QØË Rž Rls S7z S®! SÜF TLU U\ U|à U« V,7 V÷> WS‡ W¬ XT X×  Y ô YXS Yõ6 Z· Z÷œ [%À [Õ \ÎC \üh ^›° ^Ó `rX ` | b?Å bw$ dl dMË eí f8 gº gñà i‘( i¿M kgÐ k•ô m5= mlœ o ä o: pÙQ q° r¯ù rçX t†  t´Å vT  v‹l x*µ xXÙ yø" z/ {ÎÉ |( }¥q }Ó• rÞ ª= I… €ä ƒ - ƒNQ „íš …$ù †ÄA †òf ˆ‘® ˆÉ  ŠhV ŠŸµ Œ>ý Œm" Ž j ŽCÉ ã q ‘¹¹ ‘çÞ “‡& “¾… •]Î •‹ò —+; —bš ™â ™9A šØŠ ›® œ¥÷ œÝV ž|ž ž³ý  SF  j ¢ ³ ¢X £÷Z ¤% ¥ÄÇ ¥ü& §›o §ÒÎ ©r © ; «?ƒ «vâ ­+ ­MŠ ®ìÒ ¯÷ °º? °ñž ²ç ²¿  ´^T ´•³ ¶4û ¶lZ ¸ £ ¸9Ç ¹Ù ºo »¯· »ç ½†_ ½´ƒ ¿SÌ ¿‹+ Á*s ÁX˜ Â÷à Ã/? ÄΈ Åç Æ¥/ ÆÓT Èrœ È©û ÊID Ê€£ Ìë ÌN ÍíX Î$· ÏÄ Ïò$ Ñ‘m ÑÈÌ Óh ÓŸs Õ>¼ Õlà × ) ×Cˆ ØâРÙ/ Ú¹x Ú眠܆å ܾD ÿÿó ÿÿñð  LMT-01+01+00 <+01>-1 NSTimeZones/zones/Africa/Lusaka0000644000175000017500000000020314353032552016531 0ustar richardrichardTZif2TZif2ÿÿÿÿ‚FÅôŒ LMTCAT CAT-2 NSTimeZones/zones/Africa/Ndjamena0000644000175000017500000000024014353032552017027 0ustar richardrichardTZif2TZif2 ÿÿÿÿ’æ€dfqp&Þ` LMTWATWAST WAT-1 NSTimeZones/zones/Africa/Harare0000644000175000017500000000020314353032552016513 0ustar richardrichardTZif2TZif2ÿÿÿÿ‚FÅôŒ LMTCAT CAT-2 NSTimeZones/zones/Africa/Mbabane0000644000175000017500000000027614353032552016650 0ustar richardrichardTZif2TZif2 ÿÿÿÿm{A@ÿÿÿÿ‚FÏhÿÿÿÿÌ®Œ€ÿÿÿÿÍžopÿÿÿÿÎŽn€ÿÿÿÿÏ~Qp@*0 LMTSAST SAST-2 NSTimeZones/zones/Africa/Niamey0000644000175000017500000000026414353032552016542 0ustar richardrichardTZif2TZif2ÿÿÿÿ†«pÑÿÿÿÿŒP`ÿÿÿÿ–ªCÑÿÿÿÿ¡Qïx/LMTGMT+0030WAT WAT-1 NSTimeZones/zones/Africa/Kampala0000644000175000017500000000027714353032552016672 0ustar richardrichardTZif2TZif2ÿÿÿÿ‹ÿÑüÿÿÿÿ±îÚXÿÿÿÿ´ÇàÐÿÿÿÿÁí­XÿÿÿÿÌlzÔ"„#(*0 &¬LMT+0230EAT+0245 EAT-3 NSTimeZones/zones/Africa/Mogadishu0000644000175000017500000000027714353032552017244 0ustar richardrichardTZif2TZif2ÿÿÿÿ‹ÿÑüÿÿÿÿ±îÚXÿÿÿÿ´ÇàÐÿÿÿÿÁí­XÿÿÿÿÌlzÔ"„#(*0 &¬LMT+0230EAT+0245 EAT-3 NSTimeZones/zones/Africa/Luanda0000644000175000017500000000026414353032552016524 0ustar richardrichardTZif2TZif2ÿÿÿÿ†«pÑÿÿÿÿŒP`ÿÿÿÿ–ªCÑÿÿÿÿ¡Qïx/LMTGMT+0030WAT WAT-1 NSTimeZones/zones/Africa/Asmera0000644000175000017500000000027714353032552016534 0ustar richardrichardTZif2TZif2ÿÿÿÿ‹ÿÑüÿÿÿÿ±îÚXÿÿÿÿ´ÇàÐÿÿÿÿÁí­XÿÿÿÿÌlzÔ"„#(*0 &¬LMT+0230EAT+0245 EAT-3 NSTimeZones/zones/Africa/Lome0000644000175000017500000000020214353032552016204 0ustar richardrichardTZif2TZif2ÿÿÿÿ’æ’Hÿÿü8LMTGMT GMT0 NSTimeZones/zones/Africa/Conakry0000644000175000017500000000020214353032552016716 0ustar richardrichardTZif2TZif2ÿÿÿÿ’æ’Hÿÿü8LMTGMT GMT0 NSTimeZones/zones/Africa/Maputo0000644000175000017500000000020314353032552016556 0ustar richardrichardTZif2TZif2ÿÿÿÿ‚FÅôŒ LMTCAT CAT-2 NSTimeZones/zones/Africa/Banjul0000644000175000017500000000020214353032552016523 0ustar richardrichardTZif2TZif2ÿÿÿÿ’æ’Hÿÿü8LMTGMT GMT0 NSTimeZones/zones/Africa/Casablanca0000644000175000017500000000357714353032552017342 0ustar richardrichardTZif2TZif2Å ÿÿÿÿ–QùœÿÿÿÿÆÿ€ÿÿÿÿÇX¬pÿÿÿÿÇÙí€ÿÿÿÿÒ¡2ðÿÿÿÿÛ5¤ÿÿÿÿÛî'ðÿÿÿÿû%r@ÿÿÿÿûÂïpk„€Æmð è aGð É?€ŽòpÓQ€'£p·¦oðHAæ€H»"pJ#JÕpKÜÀ€L]åpM—¸€N4ŒðOœ  P» P1š Pg§ Q|‚ QØË Rž Rls S7z S®! SÜF TLU U\ U|à U« V,7 V÷> WS‡ W¬ XT X×  Y ô YXS Yõ6 Z· Z÷œ [%À [Õ \ÎC \üh ^›° ^Ó `rX ` | b?Å bw$ dl dMË eí f8 gº gñà i‘( i¿M kgÐ k•ô m5= mlœ o ä o: pÙQ q° r¯ù rçX t†  t´Å vT  v‹l x*µ xXÙ yø" z/ {ÎÉ |( }¥q }Ó• rÞ ª= I… €ä ƒ - ƒNQ „íš …$ù †ÄA †òf ˆ‘® ˆÉ  ŠhV ŠŸµ Œ>ý Œm" Ž j ŽCÉ ã q ‘¹¹ ‘çÞ “‡& “¾… •]Î •‹ò —+; —bš ™â ™9A šØŠ ›® œ¥÷ œÝV ž|ž ž³ý  SF  j ¢ ³ ¢X £÷Z ¤% ¥ÄÇ ¥ü& §›o §ÒÎ ©r © ; «?ƒ «vâ ­+ ­MŠ ®ìÒ ¯÷ °º? °ñž ²ç ²¿  ´^T ´•³ ¶4û ¶lZ ¸ £ ¸9Ç ¹Ù ºo »¯· »ç ½†_ ½´ƒ ¿SÌ ¿‹+ Á*s ÁX˜ Â÷à Ã/? ÄΈ Åç Æ¥/ ÆÓT Èrœ È©û ÊID Ê€£ Ìë ÌN ÍíX Î$· ÏÄ Ïò$ Ñ‘m ÑÈÌ Óh ÓŸs Õ>¼ Õlà × ) ×Cˆ ØâРÙ/ Ú¹x Ú眠܆å ܾD ÿÿøäLMT+01+00 <+01>-1 NSTimeZones/zones/Africa/Cairo0000644000175000017500000000237414353032552016361 0ustar richardrichardTZif2TZif2 ÿÿÿÿ}½M«ÿÿÿÿÈ“´àÿÿÿÿÈú{ÐÿÿÿÿÉüïàÿÿÿÿÊÇèÐÿÿÿÿËË®`ÿÿÿÿÌß)ÐÿÿÿÿͬáàÿÿÿÿÎÆôÐÿÿÿÿÏfàÿÿÿÿЩyÐÿÿÿÿÑ„`àÿÿÿÿÒŠ­Pÿÿÿÿè6c`ÿÿÿÿèô-Pÿÿÿÿê ¹`ÿÿÿÿêÕ`ÐÿÿÿÿëìúðÿÿÿÿìµmÿÿÿÿíÏðÿÿÿÿî—òÿÿÿÿï°³pÿÿÿÿðy%€ÿÿÿÿñ‘æðÿÿÿÿòZYÿÿÿÿóspÿÿÿÿô;Œ€ÿÿÿÿõUŸpÿÿÿÿö€ÿÿÿÿ÷6Òðÿÿÿÿ÷ÿEÿÿÿÿùpÿÿÿÿùáÊÿÿÿÿúù9ðÿÿÿÿûÂý€ÿÿÿÿüÛ¾ðÿÿÿÿý¥‚€ÿÿÿÿþ¼òpÿÿÿÿÿ†¶ž%ðgé€YpIaÞp+¢Cð Õ€$Epî xð Ï<€ çýð ±Á€ É1p’õªdðt(€‹˜pU\np7áOPð€ “ðúHp£ðÛ{€ô<ð¾€ÕppŸ4¶£ð€g€ —×p!a›"z\p#D $b'p%%S€&<Ãp'‡(öð(纀*{ð*Ê?€+á¯p,«s-Ââð.Œ¦€/ à0k Ð1õà2JîÐ3_×à4*ÐÐ5?¹à6 ²Ð7(Ö`7óÏP9¸`9Ó±P:èš`;³“P<È|`=“uP>¨^`?sWP@‘zàA\sÐBq\àCàEýPF1 àFàjPHàH·ÐIðäàJ¹PKÚ`La½ÐL‰XàL¤úPSu8àS¬‰ÐSÚ¼`T$‚PU*0 LMTEESTEET EET-2 NSTimeZones/zones/Africa/Lubumbashi0000644000175000017500000000020314353032552017404 0ustar richardrichardTZif2TZif2ÿÿÿÿ‚FÅôŒ LMTCAT CAT-2 NSTimeZones/zones/Africa/Abidjan0000644000175000017500000000020214353032552016640 0ustar richardrichardTZif2TZif2ÿÿÿÿ’æ’Hÿÿü8LMTGMT GMT0 NSTimeZones/zones/Africa/Bangui0000644000175000017500000000026414353032552016525 0ustar richardrichardTZif2TZif2ÿÿÿÿ†«pÑÿÿÿÿŒP`ÿÿÿÿ–ªCÑÿÿÿÿ¡Qïx/LMTGMT+0030WAT WAT-1 NSTimeZones/zones/Africa/Monrovia0000644000175000017500000000024414353032552017110 0ustar richardrichardTZif2TZif2 ÿÿÿÿZz¦œÿÿÿÿ _lœÊZnÿÿõäÿÿõäÿÿõ’LMTMMTGMT GMT0 NSTimeZones/zones/Africa/Nairobi0000644000175000017500000000027714353032552016707 0ustar richardrichardTZif2TZif2ÿÿÿÿ‹ÿÑüÿÿÿÿ±îÚXÿÿÿÿ´ÇàÐÿÿÿÿÁí­XÿÿÿÿÌlzÔ"„#(*0 &¬LMT+0230EAT+0245 EAT-3 NSTimeZones/zones/Africa/Ceuta0000644000175000017500000000106214353032552016356 0ustar richardrichardTZif2TZif2+ÿÿÿÿ~6µÿÿÿÿžÖupÿÿÿÿŸ¡n`ÿÿÿÿªïpÿÿÿÿªçnÿÿÿÿ­É§ðÿÿÿÿ®§2ÿÿÿÿ¯ Opÿÿÿÿ°‡ÿÿÿÿ±‰zÿÿÿÿ²p0€ÿÿÿÿû%r@ÿÿÿÿûÂïpk„€Æmð è aGð É?€ŽòpÓQ€'£p·¦Œ| lr!\c"LT#n?Zƒ@oPA:eBO2CGD/Dú)FöFÚ Gø€HÃ'I×ô€J£ K·Ö€L‚ëM—¸€NbÍOwš€PB¯Q`·R"‘S@™T ®U {UëW]WËrXà?Y«T *0  LMT+0130SASTWATCAT CAT-2 NSTimeZones/zones/Africa/Djibouti0000644000175000017500000000027714353032552017075 0ustar richardrichardTZif2TZif2ÿÿÿÿ‹ÿÑüÿÿÿÿ±îÚXÿÿÿÿ´ÇàÐÿÿÿÿÁí­XÿÿÿÿÌlzÔ"„#(*0 &¬LMT+0230EAT+0245 EAT-3 NSTimeZones/zones/Africa/Khartoum0000644000175000017500000000071214353032552017110 0ustar richardrichardTZif2TZif2#ÿÿÿÿ¶£Úžàz4P}ùà[gÐ`~à=ìÐ@`à P Bà SÐ $à á‡P àà Ä P ¿èà¥?Щ`†sPˆç`g¦ÐhÉ`J+ÐH«`+_P(` ’Ðo`íÆPñ‹àÐKPÑmà±~Ð8€E YøäP€*0 *0 LMTCASTCATEAT CAT-2 NSTimeZones/zones/Africa/Johannesburg0000644000175000017500000000027614353032552017750 0ustar richardrichardTZif2TZif2 ÿÿÿÿm{A@ÿÿÿÿ‚FÏhÿÿÿÿÌ®Œ€ÿÿÿÿÍžopÿÿÿÿÎŽn€ÿÿÿÿÏ~Qp@*0 LMTSAST SAST-2 NSTimeZones/zones/Africa/Gaborone0000644000175000017500000000020314353032552017045 0ustar richardrichardTZif2TZif2ÿÿÿÿ‚FÅôŒ LMTCAT CAT-2 NSTimeZones/zones/Africa/Nouakchott0000644000175000017500000000020214353032552017427 0ustar richardrichardTZif2TZif2ÿÿÿÿ’æ’Hÿÿü8LMTGMT GMT0 NSTimeZones/zones/Africa/Bujumbura0000644000175000017500000000020314353032552017245 0ustar richardrichardTZif2TZif2ÿÿÿÿ‚FÅôŒ LMTCAT CAT-2 NSTimeZones/zones/Africa/Tripoli0000644000175000017500000000065714353032552016750 0ustar richardrichardTZif2TZif2 ÿÿÿÿ¡òÁ$ÿÿÿÿÝ»±ÿÿÿÿÞ#­`ÿÿÿÿáxÒÿÿÿÿáçeàÿÿÿÿå/?pÿÿÿÿå©ÌàÿÿÿÿëNÆð’B`÷pú+àê*ðÛ_`̯ð½ä`´zðŸà“ p‚î` pJp!a~à"RÏp#Dà$4ð%%7`&@·ð2Nñ`3D6p45jàP™QTÙ€Ri´€ \   LMTCESTCETEET EET-2 NSTimeZones/zones/Africa/Timbuktu0000644000175000017500000000020214353032552017114 0ustar richardrichardTZif2TZif2ÿÿÿÿ’æ’Hÿÿü8LMTGMT GMT0 NSTimeZones/zones/Africa/Lagos0000644000175000017500000000026414353032552016365 0ustar richardrichardTZif2TZif2ÿÿÿÿ†«pÑÿÿÿÿŒP`ÿÿÿÿ–ªCÑÿÿÿÿ¡Qïx/LMTGMT+0030WAT WAT-1 NSTimeZones/zones/Africa/Porto-Novo0000644000175000017500000000026414353032552017342 0ustar richardrichardTZif2TZif2ÿÿÿÿ†«pÑÿÿÿÿŒP`ÿÿÿÿ–ªCÑÿÿÿÿ¡Qïx/LMTGMT+0030WAT WAT-1 NSTimeZones/zones/Africa/Algiers0000644000175000017500000000072614353032552016711 0ustar richardrichardTZif2TZif2"ÿÿÿÿkÉ›$ÿÿÿÿ‘`POÿÿÿÿ›Gxðÿÿÿÿ›×,pÿÿÿÿœ¼‘pÿÿÿÿÀHðÿÿÿÿž‰þpÿÿÿÿŸ *ðÿÿÿÿ `¥ðÿÿÿÿ¡€ ðÿÿÿÿ¢.ðÿÿÿÿ£zLðÿÿÿÿ¤5ðÿÿÿÿ¤¸pÿÿÿÿÆÿpÿÿÿÿÇXº€ÿÿÿÿÇÚ  ÿÿÿÿÏ’4ÿÿÿÿЊÿÿÿÿÑrÿÿÿÿÒN$pÿÿÿÿÔKpÿÿÿÿåÎÓÿÿÿÿó\°ðxÁðCÈð Ï×­DðxZhYvCpfB€_|O_Ü1  LMTPMTWESTWETCESTCET CET-1 NSTimeZones/zones/Africa/Blantyre0000644000175000017500000000020314353032552017071 0ustar richardrichardTZif2TZif2ÿÿÿÿ‚FÅôŒ LMTCAT CAT-2 NSTimeZones/zones/Africa/Kigali0000644000175000017500000000020314353032552016511 0ustar richardrichardTZif2TZif2ÿÿÿÿ‚FÅôŒ LMTCAT CAT-2 NSTimeZones/zones/Africa/Brazzaville0000644000175000017500000000026414353032552017605 0ustar richardrichardTZif2TZif2ÿÿÿÿ†«pÑÿÿÿÿŒP`ÿÿÿÿ–ªCÑÿÿÿÿ¡Qïx/LMTGMT+0030WAT WAT-1 NSTimeZones/zones/Africa/Dar_es_Salaam0000644000175000017500000000027714353032552017777 0ustar richardrichardTZif2TZif2ÿÿÿÿ‹ÿÑüÿÿÿÿ±îÚXÿÿÿÿ´ÇàÐÿÿÿÿÁí­XÿÿÿÿÌlzÔ"„#(*0 &¬LMT+0230EAT+0245 EAT-3 NSTimeZones/zones/Africa/Douala0000644000175000017500000000026414353032552016525 0ustar richardrichardTZif2TZif2ÿÿÿÿ†«pÑÿÿÿÿŒP`ÿÿÿÿ–ªCÑÿÿÿÿ¡Qïx/LMTGMT+0030WAT WAT-1 NSTimeZones/zones/Africa/Accra0000644000175000017500000000020214353032552016321 0ustar richardrichardTZif2TZif2ÿÿÿÿ’æ’Hÿÿü8LMTGMT GMT0 NSTimeZones/zones/Africa/Kinshasa0000644000175000017500000000026414353032552017061 0ustar richardrichardTZif2TZif2ÿÿÿÿ†«pÑÿÿÿÿŒP`ÿÿÿÿ–ªCÑÿÿÿÿ¡Qïx/LMTGMT+0030WAT WAT-1 NSTimeZones/zones/Africa/Maseru0000644000175000017500000000027614353032552016557 0ustar richardrichardTZif2TZif2 ÿÿÿÿm{A@ÿÿÿÿ‚FÏhÿÿÿÿÌ®Œ€ÿÿÿÿÍžopÿÿÿÿÎŽn€ÿÿÿÿÏ~Qp@*0 LMTSAST SAST-2 NSTimeZones/zones/Africa/Libreville0000644000175000017500000000026414353032552017411 0ustar richardrichardTZif2TZif2ÿÿÿÿ†«pÑÿÿÿÿŒP`ÿÿÿÿ–ªCÑÿÿÿÿ¡Qïx/LMTGMT+0030WAT WAT-1 NSTimeZones/zones/Africa/Malabo0000644000175000017500000000026414353032552016513 0ustar richardrichardTZif2TZif2ÿÿÿÿ†«pÑÿÿÿÿŒP`ÿÿÿÿ–ªCÑÿÿÿÿ¡Qïx/LMTGMT+0030WAT WAT-1 NSTimeZones/zones/Africa/Asmara0000644000175000017500000000027714353032552016530 0ustar richardrichardTZif2TZif2ÿÿÿÿ‹ÿÑüÿÿÿÿ±îÚXÿÿÿÿ´ÇàÐÿÿÿÿÁí­XÿÿÿÿÌlzÔ"„#(*0 &¬LMT+0230EAT+0245 EAT-3 NSTimeZones/zones/Africa/Bissau0000644000175000017500000000022514353032552016543 0ustar richardrichardTZif2TZif2 ÿÿÿÿ’æœ gaÿÿñdÿÿñðLMT-01GMT GMT0 NSTimeZones/zones/Africa/Ouagadougou0000644000175000017500000000020214353032552017567 0ustar richardrichardTZif2TZif2ÿÿÿÿ’æ’Hÿÿü8LMTGMT GMT0 NSTimeZones/zones/Africa/Addis_Ababa0000644000175000017500000000027714353032552017416 0ustar richardrichardTZif2TZif2ÿÿÿÿ‹ÿÑüÿÿÿÿ±îÚXÿÿÿÿ´ÇàÐÿÿÿÿÁí­XÿÿÿÿÌlzÔ"„#(*0 &¬LMT+0230EAT+0245 EAT-3 NSTimeZones/zones/Africa/Bamako0000644000175000017500000000020214353032552016502 0ustar richardrichardTZif2TZif2ÿÿÿÿ’æ’Hÿÿü8LMTGMT GMT0 NSTimeZones/zones/Africa/Juba0000644000175000017500000000071214353032552016177 0ustar richardrichardTZif2TZif2#ÿÿÿÿ¶£ÚÜžàz4P}ùà[gÐ`~à=ìÐ@`à P Bà SÐ $à á‡P àà Ä P ¿èà¥?Щ`†sPˆç`g¦ÐhÉ`J+ÐH«`+_P(` ’Ðo`íÆPñ‹àÐKPÑmà±~Ð8€E `P¤*0 *0 LMTCASTCATEAT CAT-2 NSTimeZones/zones/Africa/Dakar0000644000175000017500000000020214353032552016332 0ustar richardrichardTZif2TZif2ÿÿÿÿ’æ’Hÿÿü8LMTGMT GMT0 NSTimeZones/zones/Africa/Freetown0000644000175000017500000000020214353032552017101 0ustar richardrichardTZif2TZif2ÿÿÿÿ’æ’Hÿÿü8LMTGMT GMT0 NSTimeZones/zones/Africa/Tunis0000644000175000017500000000070114353032552016416 0ustar richardrichardTZif2TZif2"ÿÿÿÿYFôÿÿÿÿ‘`POÿÿÿÿÆ:ˆàÿÿÿÿÇXž`ÿÿÿÿÇÛ"àÿÿÿÿÊâTàÿÿÿÿË­iðÿÿÿÿÌçKÿÿÿÿÍ©ÿÿÿÿÍÂÿÿÿÿḬ́ÿÿÿÿ΢5ÿÿÿÿÏ’4ÿÿÿÿЉãàÿÿÿÿÑrÿÿÿÿÒN` Çßð‰¬pªdðtp"£:ð#<(ð$,ð% ð&<Ãp''pBt ðC<€D%çECýFÉG#ßGîæIÁ Œ1  LMTPMTCESTCET CET-1 NSTimeZones/zones/Africa/Sao_Tome0000644000175000017500000000025514353032552017026 0ustar richardrichardTZif2TZif2 ÿÿÿÿ^<ý0ÿÿÿÿ’掀ZIˆ\*»Pÿÿ÷cLMTGMTWAT GMT0 NSTimeZones/zones/GMT-20000644000175000017500000000016514353032552014721 0ustar richardrichardTZif2TZif2ÿÿãàGMT-2 2 NSTimeZones/zones/GMT+80000644000175000017500000000016614353032552014726 0ustar richardrichardTZif2TZif2p€GMT+8 -8 NSTimeZones/zones/GMT+10000644000175000017500000000016614353032552014717 0ustar richardrichardTZif2TZif2GMT+1 -1 NSTimeZones/zones/GMT+30000644000175000017500000000016614353032552014721 0ustar richardrichardTZif2TZif2*0GMT+3 -3 NSTimeZones/zones/GMT+50000644000175000017500000000016614353032552014723 0ustar richardrichardTZif2TZif2FPGMT+5 -5 NSTimeZones/zones/GMT+60000644000175000017500000000016614353032552014724 0ustar richardrichardTZif2TZif2T`GMT+6 -6 NSTimeZones/zones/EST0000644000175000017500000000015714353032552014567 0ustar richardrichardTZif2TZif2ÿÿ¹°EST EST5 NSTimeZones/zones/Israel0000644000175000017500000000206214353032552015350 0ustar richardrichardTZif3TZif3dÿÿÿÿV¶Âúÿÿÿÿž0EˆÿÿÿÿÈYÏÿÿÿÿÈú¦ÿÿÿÿÉ8œ€ÿÿÿÿÌåë€ÿÿÿÿͬþÿÿÿÿÎÇÿÿÿÿσÿÿÿÿЩ¤ÿÿÿÿÑ„}ÿÿÿÿҊ׀ÿÿÿÿÓe°€ÿÿÿÿÔl ÿÿÿÿ×Z0€ÿÿÿÿ×ßXÿÿÿÿØ/ÀÿÿÿÿÙcÿÿÿÿÚ÷ÿÿÿÿÚëÐÿÿÿÿÛ´4ÿÿÿÿܹ=ÿÿÿÿÝàÿÿÿÿ޴΀ÿÿÿÿߤ¿€ÿÿÿÿà‹vÿÿÿÿáV}ÿÿÿÿâ¾f€ÿÿÿÿã6_ÿÿÿÿäžH€ÿÿÿÿåAÿÿÿÿætðÿÿÿÿçÒ€ÿÿÿÿè&­€ÿÿÿÿèèz|‹àý°Ð öê` ¦3Ðéü`![`úÆ`Žn`¾øàw|ÐÌÿ``™P ‚±`!IµÐ"^žà# ]P$Z0`%?P& íà&ÖæÐ'ëÏà(ÀP)Ôì`*©Ð+»eà,‰Ð-›Gà._©P/{)à0HÅÐ1H–à2ƒ‚p?|Ÿà@s6pAP¤`BLCHOpD,qEöðF SFìcðGì5HçõpIÌJ¾œðK«ùLŒ ðM•€N‡›pOt÷€P^BðQTÙ€! ø*0 8@LMTJMTIDTISTIDDT IST-2IDT,M3.4.4/26,M10.5.0 NSTimeZones/zones/Iceland0000644000175000017500000000020214353032552015462 0ustar richardrichardTZif2TZif2ÿÿÿÿ’æ’Hÿÿü8LMTGMT GMT0 NSTimeZones/zones/Chile/0000755000175000017500000000000014353032552015232 5ustar richardrichardNSTimeZones/zones/Chile/Continental0000644000175000017500000000251214353032552017433 0ustar richardrichardTZif3TZif3‚ÿÿÿÿi‡Åÿÿÿÿ0GEÿÿÿÿ›\åPÿÿÿÿŸ|âÅÿÿÿÿ¡qÀÿÿÿÿ°^wÅÿÿÿÿ±w=@ÿÿÿÿ²AÐÿÿÿÿ³XpÀÿÿÿÿ´"4Pÿÿÿÿµ9¤@ÿÿÿÿ¶gÐÿÿÿÿ·×Àÿÿÿÿ·ä›Pÿÿÿÿ¸ý\Àÿÿÿÿ¹Ç PÿÿÿÿÌn@ÿÿÿÿÌlçÐÿÿÿÿÓÜÀÿÿÿÿÔÕ0ÿÿÿÿÕ3UÀÿÿÿÿÕv’@ÿÿÿÿýÑ<@ÿÿÿÿþ’ú°ÿÿÿÿÿÌÍÀrܰuPÀ@I°U2À +°>O@ ° ¼@ßï°þ@ ¿Ñ° Ýõ@ ¨î0 ½×@ ˆÐ0¹@h²0†ÕÀH”0f·À(v0F™À’°&{Àñt°]ÀÑV°æ?À±8°Ï\@‘°¯>@pü° @ 0!o@"9û0#Nä@$Ý0%8À%ù¿0&òøÀ'Ù¡0(÷ÄÀ)½°*צÀ+¢Ÿ°,·ˆÀ-‚°.—jÀ/bc°0€‡@1BE°2`i@3=×04@K@5 D06 ¸@7Õ°8@8Ë09é+À:ªê0;É À<ŠÌ0=¨ïÀ>j®0?ˆÑÀ@SʰAh³ÀB3¬°CH•ÀDްE1²@Eóp°G”@Gï0Hñv@I¼o0JÑX@K¸°L±:@MÆ0NP‚ÀOœ®°PBÙÀQ|°R+ö@S\r°T Ø@W7æ0W¯ìÀYÈ0YÎÀZ÷ª0[o°À\©g°]t|À^‰I°_T^À`i+°a4@ÀbI °c]@d(ï°ÿÿ½»ÿÿ½»ÿÿ¹°ÿÿÇÀ ÿÿÇÀ ÿÿÕÐLMTSMT-05-04-03 <-04>4<-03>,M9.1.6/24,M4.1.6/24 NSTimeZones/zones/Chile/EasterIsland0000644000175000017500000000222614353032552017535 0ustar richardrichardTZif3TZif3nÿÿÿÿi‡Bÿÿÿÿ¹Ç@ˆÿÿÿÿýÑ<@ÿÿÿÿþ’ú°ÿÿÿÿÿÌÍÀrܰuPÀ@I°U2À +°>O@ ° ¼@ßï°þ@ ¿Ñ° Ýõ@ ¨î0 ½×@ ˆÐ0¹@h²0†ÕÀH”0f·À(v0F™À’°&{Àñt°]ÀÑV°æ?À±8°Ï\@‘°¯>@pü° @ 0!o@"9û0#Nä@$Ý0%8À%ù¿0&òøÀ'Ù¡0(÷ÄÀ)½°*צÀ+¢Ÿ°,·ˆÀ-‚°.—jÀ/bc°0€‡@1BE°2`i@3=×04@K@5 D06 ¸@7Õ°8@8Ë09é+À:ªê0;É À<ŠÌ0=¨ïÀ>j®0?ˆÑÀ@SʰAh³ÀB3¬°CH•ÀDްE1²@Eóp°G”@Gï0Hñv@I¼o0JÑX@K¸°L±:@MÆ0NP‚ÀOœ®°PBÙÀQ|°R+ö@S\r°T Ø@W7æ0W¯ìÀYÈ0YÎÀZ÷ª0[o°À\©g°]t|À^‰I°_T^À`i+°a4@ÀbI °c]@d(ï°ÿÿ™xÿÿ™xÿÿ« ÿÿ ÿÿ« ÿÿ¹°LMTEMT-06-07-05 <-06>6<-05>,M9.1.6/22,M4.1.6/22 NSTimeZones/zones/Mexico/0000755000175000017500000000000014353032552015432 5ustar richardrichardNSTimeZones/zones/Mexico/BajaSur0000644000175000017500000000131614353032552016705 0ustar richardrichardTZif2TZif2?ÿÿÿÿ¥¶èpÿÿÿÿ¯ònàÿÿÿÿ¶fV`ÿÿÿÿ·CÒ`ÿÿÿÿ¸ 6`ÿÿÿÿ¸ý†ðÿÿÿÿËêq`ÿÿÿÿØ‘´ðp€1g„2s€3Gf4Rø€5'H62Ú€7*8÷8ç 9ûÙ:õ;¶Ñ<° =»>ì?›@oÎA„›€BO°Cd}€D/’ED_€FtG$A€Gø‘I#€IØsJä€K¸ULÍ"M˜7N­OxPŒæQa5RlÈSATLªU ùV,ŒWÛX¨€Xà½YõŠ€ZÀŸ[Õl€\©¼]µN€^‰ž_•0€`i€a~MbIbc^/ÿÿœ<ÿÿÿÿ« ÿÿ«  ÿÿ€LMTMSTCSTMDTPST MST7 NSTimeZones/zones/Mexico/General0000644000175000017500000000140514353032552016732 0ustar richardrichardTZif2TZif2Dÿÿÿÿ¥¶èpÿÿÿÿ¯ònàÿÿÿÿ¶fV`ÿÿÿÿ·CÒ`ÿÿÿÿ¸ 6`ÿÿÿÿ¸ý†ðÿÿÿÿÅÞ°`ÿÿÿÿÆ—4PÿÿÿÿÉUñàÿÿÿÿÉêÝPÿÿÿÿÏÆàÿÿÿÿÏ·VPÿÿÿÿÚ™àÿÿÿÿÛvƒÐ1gv2sp3GX4Rêp5':62Ìp78èð8æþ9ûÊð:õ€;¶Âð<¯ü€=»Žð>Þ€?›pð@oÀ€A„pBO¢€CdopD/„€EDQpFf€G$3pGøƒIpIØeJã÷pK¸GLÍðM˜)N¬õðOx PŒ×ðQa'€Rl¹ðSA €TL›ðU ë€V,}ðWÍ€XšpXீYõ|pZÀ‘€[Õ^p\©®]µ@p^‰_•"p`ira~>ðbITc^ ðÿÿ£ ÿÿÿÿ« ÿÿ«  ÿÿ¹°ÿÿ¹°LMTMSTCSTMDTCDTCWT CST6 NSTimeZones/zones/Mexico/BajaNorte0000644000175000017500000000200114353032552017213 0ustar richardrichardTZif2TZif2^ÿÿÿÿ¥¶èpÿÿÿÿ©yOpÿÿÿÿ¯ò|ðÿÿÿÿ¶fdpÿÿÿÿ·ÿÿÿÿ¸ òðÿÿÿÿËê€ÿÿÿÿÒ#ôpÿÿÿÿÒ™ºpÿÿÿÿ×YÿÿÿÿØ‘´ðÿÿÿÿâ~KÿÿÿÿãIRÿÿÿÿä^-ÿÿÿÿå)4ÿÿÿÿæGJÿÿÿÿçQÿÿÿÿè',ÿÿÿÿèò3ÿÿÿÿêÿÿÿÿêÒÿÿÿÿëæðÿÿÿÿì±÷ÿÿÿÿíÆÒÿÿÿÿî‘Ù ௠ ÙÍ À‘ ¹¯©® ™‘‰ ysir YUIT 97)6 "S  5ò4 âÒ Áù±ø ¡Û v+ !½"V #jÚ$5ï %J¼&Ñ '*ž'þí ) €)ÞÏ *êb+¾± ,Ó~-ž“ .³`/~u 0“B1g’ 2s$3Gt 4S5'V 62è78 88ç 9ûç:Æü ;ÛÉ<° =»«>ú ?›@oÜ A„©BO¾ Cd‹D/  EDmF‚ G$OGøŸ I1IØ JäKœ³ ÿÿ’Lÿÿÿÿ€ÿÿ ÿÿÿÿLMTMSTPSTPDTPWTPPT PST8PDT,M3.2.0,M11.1.0 NSTimeZones/zones/Atlantic/0000755000175000017500000000000014353032552015745 5ustar richardrichardNSTimeZones/zones/Atlantic/Reykjavik0000644000175000017500000000020214353032552017621 0ustar richardrichardTZif2TZif2ÿÿÿÿ’æ’Hÿÿü8LMTGMT GMT0 NSTimeZones/zones/Atlantic/Jan_Mayen0000644000175000017500000000130114353032552017524 0ustar richardrichardTZif2TZif2<ÿÿÿÿo¢aøÿÿÿÿ› `ÿÿÿÿ›ÕÚðÿÿÿÿœÙ®ÿÿÿÿ¤µÿÿÿÿž¹ÿÿÿÿŸ„—ÿÿÿÿÈ qÿÿÿÿÌçKÿÿÿÿÍ©ÿÿÿÿ΢CÿÿÿÿÏ’4ÿÿÿÿЂ%ÿÿÿÿÑrÿÿÿÿѶ–ÿÿÿÿÒX¾€ÿÿÿÿÒ¡OÿÿÿÿÓcÿÿÿÿÔK#ÿÿÿÿÕ9Ñ ÿÿÿÿÕgçÿÿÿÿÕ¨sÿÿÿÿÖ)´ÿÿÿÿ×,ÿÿÿÿØ –ÿÿÿÿÙÁÿÿÿÿÙéxMD3ú#ëÜÍó¾ã¯Ó Ñ¼½¬®œŸŒ| lr!\c"LT#ÿÿÿÿ³r¤ÿÿÿÿ´P ÿÿÿÿ·2hÿÿÿÿ¸äÿÿÿÿ¸ÿÕÿÿÿÿ¹ïÆÿÿÿÿ¼ÈÔÿÿÿÿ½¸Åÿÿÿÿ¾Ÿ{ÿÿÿÿ¿˜§ÿÿÿÿÀ› ÿÿÿÿÁx‰ÿÿÿÿÂhzÿÿÿÿÃXkÿÿÿÿÄ?!ÿÿÿÿÅ8MÿÿÿÿÆ:³ÿÿÿÿÇXÈÿÿÿÿÇÙûÿÿÿÿÉKÿÿÿÿÉñ<ÿÿÿÿÊâÿÿÿÿ˵oÿÿÿÿËìÀÿÿÿÿÌ€hÿÿÿÿÌÜ¿ÿÿÿÿÍ•QÿÿÿÿÍÃg€ÿÿÿÿÎr¿ÿÿÿÿÎÅÛÿÿÿÿÏu3ÿÿÿÿϬ„ÿÿÿÿÐR¡ÿÿÿÿÐ¥½ÿÿÿÿÑUÿÿÿÿÑŒfÿÿÿÿÒ2ƒÿÿÿÿÒ…ŸÿÿÿÿÓYáÿÿÿÿÔIÒÿÿÿÿÕ9í@ÿÿÿÿÖ)Þ@ÿÿÿÿ×Ï@ÿÿÿÿØ À@ÿÿÿÿØù±@ÿÿÿÿÙé¢@ÿÿÿÿÚÙ“@ÿÿÿÿÛÉ„@ÿÿÿÿܹu@ÿÿÿÿݲ ÀÿÿÿÿÞ¢‘Àÿÿÿÿß’‚Àÿÿÿÿà‚sÀÿÿÿÿárdÀÿÿÿÿâbUÀÿÿÿÿãRFÀÿÿÿÿäB7Àÿÿÿÿå2(Àÿÿÿÿæ"ÀÿÿÿÿçE@ÿÿÿÿè 6@ÿÿÿÿèû'@ÿÿÿÿéë@ÿÿÿÿêÛ @ÿÿÿÿëÊú@ÿÿÿÿìºë@ÿÿÿÿíªÜ@ÿÿÿÿîšÍ@ÿÿÿÿ@ÿÿÿÿðz¯@ÿÿÿÿñj @ÿÿÿÿòcËÀÿÿÿÿóS¼ÀÿÿÿÿôC­Àÿÿÿÿõ3žÀÿÿÿÿö#Àÿÿÿÿ÷€ÀÿÿÿÿøqÀÿÿÿÿøóbÀ ›)‹„Et6d'T& D 4 #ù ê Û óÌ ã˰Ó® ß ¼Ë ¬¼ œ­ Œž | l€ !\q "Lb #1<+00>,M3.5.0/0,M10.5.0/1 NSTimeZones/zones/Atlantic/Bermuda0000644000175000017500000000200014353032552017237 0ustar richardrichardTZif2TZif2_ÿÿÿÿi‡FÿÿÿÿœÌ®Fÿÿÿÿ·K6ÿÿÿÿž¸mÆÿÿÿÿŸ„¸6ÿÿÿÿ´ÃæÿÿÿÿËb¦àÿÿÿÿÌÓ¼ÐÿÿÿÿÍžÑàÿÿÿÿÎÆÐÿÿÿÿÏuy`ÿÿÿÿЯ0PÿÿÿÿÑU[`ÿÿÿÿÒPÿÿÿÿÕqh`ÿÿÿÿÖ<Ðÿÿÿÿ×Z„àÿÿÿÿ×ääPÿÿÿÿÙ:fàÿÿÿÿÙÄÆPÿÿÿÿÛ#ƒ`ÿÿÿÿÛ¤¨PÿÿÿÿÝe`ÿÿÿÿÝ„ŠPÿÿÿÿÞãG`ÿÿÿÿßm¦Ðÿÿÿÿæl àÿÿÿÿç7Ð ³` –P •` ðxP àw` ٔРÀY`¹vЩuà™XЉWày:Ði9àYÐIà8þÐ(ýà"PßàýPñü`áßPÑÞ`ÁÁP±À`¡£P uòà!…P"UÔà#j¡Ð$5¶à%JƒÐ&˜à'*eÐ'þµ`) GÐ)Þ—`*ê)Ð+¾y`,ÓFP-ž[`.³(P/~=`0“ P1gYà2rìP3G;à4RÎP5'à62°P7ÿà8ÌÐ8æáà9û®Ð:ÆÃà;ÛÐ<¯à`=»rÐ>Â`?›TÐ@o¤`A„qPBO†`CdSPD/h`ED5PEóšàÿÿÃ:ÿÿÑJÿÿÃ:ÿÿÕÐ ÿÿÇÀLMTBSTBMTADTAST AST4ADT,M3.2.0,M11.1.0 NSTimeZones/zones/Atlantic/Faeroe0000644000175000017500000000067114353032552017075 0ustar richardrichardTZif2TZif2  ÿÿÿÿ‹m¤X#ëÜÍó¾ã¯Ó Ñ¼½¬®œŸŒ| lr!\c"LT#2 NSTimeZones/zones/Atlantic/Cape_Verde0000644000175000017500000000025714353032552017671 0ustar richardrichardTZif2TZif2 ÿÿÿÿ’檠ÿÿÿÿÌ•œ ÿÿÿÿÒt| ÷@ÿÿéôÿÿãàÿÿñðÿÿñðLMT-02-01 <-01>1 NSTimeZones/zones/Atlantic/Madeira0000644000175000017500000000265514353032552017242 0ustar richardrichardTZif2TZif2Œÿÿÿÿ^=Xÿÿÿÿ’æœÿÿÿÿ›K{€ÿÿÿÿ›þÕÿÿÿÿœœû€ÿÿÿÿÉ‘€ÿÿÿÿž€€ÿÿÿÿŸªÅÿÿÿÿ _b€ÿÿÿÿ¡‹ø€ÿÿÿÿ¢Aç€ÿÿÿÿ£n}€ÿÿÿÿ¤#ÿÿÿÿ¥O±ÿÿÿÿªý€ÿÿÿÿªôÿÿÿÿ­É¶ÿÿÿÿ®§2ÿÿÿÿ¯ ]€ÿÿÿÿ°‡ÿÿÿÿ±‰zÿÿÿÿ²p0€ÿÿÿÿ³r–€ÿÿÿÿ´P€ÿÿÿÿ·2Z€ÿÿÿÿ¸Ö€ÿÿÿÿ¸ÿÇ€ÿÿÿÿ¹ï¸€ÿÿÿÿ¼ÈÆÿÿÿÿ½¸·ÿÿÿÿ¾Ÿm€ÿÿÿÿ¿˜™ÿÿÿÿÀšÿÿÿÿÿÁx{ÿÿÿÿÂhlÿÿÿÿÃX]ÿÿÿÿÄ?€ÿÿÿÿÅ8?ÿÿÿÿÆ:¥ÿÿÿÿÇXº€ÿÿÿÿÇÙí€ÿÿÿÿÉ=€ÿÿÿÿÉñ.€ÿÿÿÿÊâqÿÿÿÿ˵aÿÿÿÿËì±ðÿÿÿÿÌ€YðÿÿÿÿÌܱÿÿÿÿÍ•CÿÿÿÿÍÃYpÿÿÿÿÎr°ðÿÿÿÿÎÅÍ€ÿÿÿÿÏu%ÿÿÿÿϬuðÿÿÿÿÐR’ðÿÿÿÿÐ¥¯€ÿÿÿÿÑUÿÿÿÿÑŒWðÿÿÿÿÒ2tðÿÿÿÿÒ…‘€ÿÿÿÿÓYÓÿÿÿÿÔIÄÿÿÿÿÕ9ß0ÿÿÿÿÖ)Ð0ÿÿÿÿ×Á0ÿÿÿÿØ ²0ÿÿÿÿØù£0ÿÿÿÿÙé”0ÿÿÿÿÚÙ…0ÿÿÿÿÛÉv0ÿÿÿÿܹg0ÿÿÿÿݲ’°ÿÿÿÿÞ¢ƒ°ÿÿÿÿß’t°ÿÿÿÿà‚e°ÿÿÿÿárV°ÿÿÿÿâbG°ÿÿÿÿãR8°ÿÿÿÿäB)°ÿÿÿÿå2°ÿÿÿÿæ" °ÿÿÿÿç70ÿÿÿÿè (0ÿÿÿÿèû0ÿÿÿÿéë 0ÿÿÿÿêÚû0ÿÿÿÿëÊì0ÿÿÿÿìºÝ0ÿÿÿÿíªÎ0ÿÿÿÿîš¿0ÿÿÿÿ0ÿÿÿÿðz¡0ÿÿÿÿñj’0ÿÿÿÿòc½°ÿÿÿÿóS®°ÿÿÿÿôCŸ°ÿÿÿÿõ3°ÿÿÿÿö#°ÿÿÿÿ÷r°ÿÿÿÿøc°ÿÿÿÿøóT° ›‹ „7€t(€d€TCû€3ú#ëÜÍó¾ã½ Ó Ñ¼½¬®œŸŒ| lr!\c"LT#¢)P?ZÉ`@‚ PA:«`BaíPC`DAÏPDúo`F!±PFÚQ`H ÍÐHÃmàIê¯ÐJ£OàKÊ‘ÐLƒ1àÿÿÉÄÿÿÉÄÿÿÕÐÿÿÇÀ ÿÿãàÿÿÕÐLMTSMT-03-04-02 <-03>3 NSTimeZones/zones/Atlantic/Canary0000644000175000017500000000073614353032552017113 0ustar richardrichardTZif2TZif2#ÿÿÿÿ¦\ðÿÿÿÿÔA÷ M63ú#ëÜÍó¾ã¯Ó Ñ¼½¬®œŸŒ| lr!\c"LT#ðÿÿÿÿÓ‹{€ÿÿÿÿÔB­ðÿÿÿÿÕE"ÿÿÿÿÖL¿ðÿÿÿÿ×<¿ÿÿÿÿØfpÿÿÿÿÙò€ÿÿÿÿÙA|ðºR i› ~„ !I}"g¡ #)_$Gƒ %|&'e &ò^(G (Ò@q×~p€LMTCDTCST CST-8 NSTimeZones/zones/NZ-CHAT0000644000175000017500000000145014353032552015175 0ustar richardrichardTZif2TZif2EÿÿÿÿA·D„ÿÿÿÿÒÚ–¼ ýà ¬¥à ï¥` žüà ØÁà ~Þรà^Àà˜…à>¢àxgà„àXIàþfà8+àçƒ`!H`Çe`*`§G`á `‡)`Àî`g ` Ð` Fí`!€²`"0 à#iÎà$ëà%.`&Bà' ã`'â$à(íÅ`)Âà*ͧ`+«#`,­‰`-‹`.k`/jç`0mM`1JÉ`2Vià3*«`46Kà5 `6-à6ó©à7öà8Ó‹à9Õñà:³mà;¿`<“Oà=žð`>s1à?~Ò`@\N`A^´`B<0`C>–`D`Ex`Eûô`FþZ`«ü¬DÁ\ ³LLMT+1215+1345+1245 <+1245>-12:45<+1345>,M9.5.0/2:45,M4.1.0/3:45 NSTimeZones/zones/NZ0000644000175000017500000000202314353032552014455 0ustar richardrichardTZif2TZif2`ÿÿÿÿA·L¨ÿÿÿÿ°´²èÿÿÿÿ±Q‡Xÿÿÿÿ²xåhÿÿÿÿ³Cå`ÿÿÿÿ´XÇhÿÿÿÿµ#Ç`ÿÿÿÿ¶8©hÿÿÿÿ·©`ÿÿÿÿ¸‹hÿÿÿÿ¸ìÅàÿÿÿÿ¹ømhÿÿÿÿºÌ§àÿÿÿÿ»ØOhÿÿÿÿ¼ãèàÿÿÿÿ½®öèÿÿÿÿ¾ÃÊàÿÿÿÿ¿ŽØèÿÿÿÿÀ£¬àÿÿÿÿÁnºèÿÿÿÿƒŽàÿÿÿÿÃNœèÿÿÿÿÄcpàÿÿÿÿÅ.~èÿÿÿÿÆL`ÿÿÿÿÇ`èÿÿÿÿÈ,o`ÿÿÿÿÈ÷}hÿÿÿÿÒÚš@ ýà ¬¥à ï¥` žüà ØÁà ~Þรà^Àà˜…à>¢àxgà„àXIàþfà8+àçƒ`!H`Çe`*`§G`á `‡)`Àî`g ` Ð` Fí`!€²`"0 à#iÎà$ëà%.`&Bà' ã`'â$à(íÅ`)Âà*ͧ`+«#`,­‰`-‹`.k`/jç`0mM`1JÉ`2Vià3*«`46Kà5 `6-à6ó©à7öà8Ó‹à9Õñà:³mà;¿`<“Oà=žð`>s1à?~Ò`@\N`A^´`B<0`C>–`D`Ex`Eûô`FþZ`£Ø¯È¡¸ ¨À¶Ð¨ÀLMTNZSTNZMTNZDT NZST-12NZDT,M9.5.0,M4.1.0/3 NSTimeZones/zones/GMT-50000644000175000017500000000016514353032552014724 0ustar richardrichardTZif2TZif2ÿÿ¹°GMT-5 5 NSTimeZones/zones/GMT-70000644000175000017500000000016514353032552014726 0ustar richardrichardTZif2TZif2ÿÿGMT-7 7 NSTimeZones/zones/Zulu0000644000175000017500000000015714353032552015073 0ustar richardrichardTZif2TZif2UTC UTC0 NSTimeZones/zones/GMT00000644000175000017500000000015714353032552014643 0ustar richardrichardTZif2TZif2GMT GMT0 NSTimeZones/zones/CST6CDT0000644000175000017500000000166714353032552015215 0ustar richardrichardTZif2TZif2Xÿÿÿÿž¦,€ÿÿÿÿŸºùpÿÿÿÿ †€ÿÿÿÿ¡šÛpÿÿÿÿˈþ€ÿÿÿÿÒ#ôpÿÿÿÿÒa ðÿÿÿÿúøgÿÿÿÿûèIðÿÿÿÿüØIÿÿÿÿýÈ+ðÿÿÿÿþ¸+ÿÿÿÿÿ¨ 𘠇ïðwïq pa €Pîp@í€0Ðp'€ ²p ­£ ð”p à“€ Ù°ð Àu€¹’ð©’™tð‰tyVðiVY8ðI89ð)"7püpò€áûpÑú€ÁÝp±Ü€¡¿p v!¡p"Uñ#j½ð$5Ó%JŸð&µ'*ð'þÑ€) cð)Þ³€*êEð+¾•€,Óbp-žw€.³Dp/~Y€0“&p1gv2sp3GX4Rêp5':62Ìp78èð8æþ9ûÊð:Æà;Û¬ð<¯ü€=»Žð>Þ€?›pð@oÀ€A„pBO¢€CdopD/„€EDQpEó·ÿÿ« ÿÿ¹°ÿÿ¹°ÿÿ¹° CDTCSTCWTCPT CST6CDT,M3.2.0,M11.1.0 NSTimeZones/zones/GB0000644000175000017500000000307714353032552014430 0ustar richardrichardTZif2TZif2Ÿÿÿÿÿ] Ëÿÿÿÿ›&­ ÿÿÿÿ›Ö ÿÿÿÿœÏ0 ÿÿÿÿ¤Ã ÿÿÿÿžœ ÿÿÿÿŸ— ÿÿÿÿ …º ÿÿÿÿ¡vü ÿÿÿÿ¢eœ ÿÿÿÿ£{È ÿÿÿÿ¤N¸ ÿÿÿÿ¥?û ÿÿÿÿ¦%` ÿÿÿÿ§'Æ ÿÿÿÿ¨*, ÿÿÿÿ¨ëø ÿÿÿÿªÓ ÿÿÿÿªÕ ÿÿÿÿ«éð ÿÿÿÿ¬Çl ÿÿÿÿ­ÉÒ ÿÿÿÿ®§N ÿÿÿÿ¯ y ÿÿÿÿ°‡0 ÿÿÿÿ±’Рÿÿÿÿ²pL ÿÿÿÿ³r² ÿÿÿÿ´P. ÿÿÿÿµIZ ÿÿÿÿ¶0 ÿÿÿÿ·2v ÿÿÿÿ¸ò ÿÿÿÿ¹X ÿÿÿÿ¹ïÔ ÿÿÿÿºé ÿÿÿÿ»Øñ ÿÿÿÿ¼ÛW ÿÿÿÿ½¸Ó ÿÿÿÿ¾±þ ÿÿÿÿ¿˜µ ÿÿÿÿÀ› ÿÿÿÿÁx— ÿÿÿÿÂzý ÿÿÿÿÃXy ÿÿÿÿÄQ¤ ÿÿÿÿÅ8[ ÿÿÿÿÆ:Á ÿÿÿÿÇXÖ ÿÿÿÿÇÚ  ÿÿÿÿÊ&ÿÿÿÿÊ—YÿÿÿÿËÑÿÿÿÿÌw;ÿÿÿÿͱÿÿÿÿÎ`XÿÿÿÿÏâÿÿÿÿÐn^ÿÿÿÿÑrÿÿÿÿÑû2ÿÿÿÿÒiþ ÿÿÿÿÓc) ÿÿÿÿÔIà ÿÿÿÿÕ! ÿÿÿÿÕBýÿÿÿÿÕßàÿÿÿÿÖN¬ ÿÿÿÿÖþ ÿÿÿÿØ.Ž ÿÿÿÿØù• ÿÿÿÿÚp ÿÿÿÿÚëì ÿÿÿÿÛå ÿÿÿÿÜËÎ ÿÿÿÿÝÄù ÿÿÿÿÞ´ê ÿÿÿÿß® ÿÿÿÿà”Ì ÿÿÿÿárH ÿÿÿÿâkt ÿÿÿÿãR* ÿÿÿÿäT ÿÿÿÿå2  ÿÿÿÿæ=­ ÿÿÿÿç) ÿÿÿÿèT ÿÿÿÿèû ÿÿÿÿéýq ÿÿÿÿêÚí ÿÿÿÿëÝS ÿÿÿÿìºÏ ÿÿÿÿí³ú ÿÿÿÿîš± ÿÿÿÿïg ÿÿÿÿðŸ} ÿÿÿÿñaI ÿÿÿÿò_ ÿÿÿÿóJf ÿÿÿÿô_A ÿÿÿÿõ!  ÿÿÿÿö?# ÿÿÿÿ÷ï ÿÿÿÿø ÿÿÿÿøàÑ ÿÿÿÿùþç ÿÿÿÿúÀ³ ÿÿÿÿûè ÿÿÿÿü{« ÿÿÿÿýÇ»ppÆ )X P¨  : 0Š é l Èþ ðN ²  Ð0 ‘ü ° qÞ ™. QÀ y 1¢ Xò #ë8ÆÍ¨ã¯øŠÑ᧬®Á‰Œ¡k lr!M"LT#a/$,6%JK& '*-'õ4) )Õ*éñ+´ø,ÉÓ-”Ú.©µ/t¼0‰—1]Ùÿÿÿµ  LMTBSTGMTBDST GMT0BST,M3.5.0/1,M10.5.0 NSTimeZones/zones/root/0000755000175000017500000000000014353032552015171 5ustar richardrichardNSTimeZones/zones/root/etc/0000755000175000017500000000000014353032552015744 5ustar richardrichardNSTimeZones/zones/root/etc/localtime0000644000175000017500000000016114353032552017636 0ustar richardrichardTZif2TZif2-00 <-00>0 NSTimeZones/zones/Etc/0000755000175000017500000000000014353032552014721 5ustar richardrichardNSTimeZones/zones/Etc/Greenwich0000644000175000017500000000015714353032552016562 0ustar richardrichardTZif2TZif2GMT GMT0 NSTimeZones/zones/Etc/GMT-20000644000175000017500000000016214353032552015431 0ustar richardrichardTZif2TZif2 +02 <+02>-2 NSTimeZones/zones/Etc/GMT+80000644000175000017500000000016114353032552015434 0ustar richardrichardTZif2TZif2ÿÿ€-08 <-08>8 NSTimeZones/zones/Etc/GMT+10000644000175000017500000000016114353032552015425 0ustar richardrichardTZif2TZif2ÿÿñð-01 <-01>1 NSTimeZones/zones/Etc/GMT+30000644000175000017500000000016114353032552015427 0ustar richardrichardTZif2TZif2ÿÿÕÐ-03 <-03>3 NSTimeZones/zones/Etc/GMT+50000644000175000017500000000016114353032552015431 0ustar richardrichardTZif2TZif2ÿÿ¹°-05 <-05>5 NSTimeZones/zones/Etc/GMT+60000644000175000017500000000016114353032552015432 0ustar richardrichardTZif2TZif2ÿÿ« -06 <-06>6 NSTimeZones/zones/Etc/GMT-50000644000175000017500000000016214353032552015434 0ustar richardrichardTZif2TZif2FP+05 <+05>-5 NSTimeZones/zones/Etc/GMT-70000644000175000017500000000016214353032552015436 0ustar richardrichardTZif2TZif2bp+07 <+07>-7 NSTimeZones/zones/Etc/Zulu0000644000175000017500000000015714353032552015606 0ustar richardrichardTZif2TZif2UTC UTC0 NSTimeZones/zones/Etc/GMT00000644000175000017500000000015714353032552015356 0ustar richardrichardTZif2TZif2GMT GMT0 NSTimeZones/zones/Etc/GMT-00000644000175000017500000000015714353032552015433 0ustar richardrichardTZif2TZif2GMT GMT0 NSTimeZones/zones/Etc/UCT0000644000175000017500000000015714353032552015302 0ustar richardrichardTZif2TZif2UTC UTC0 NSTimeZones/zones/Etc/GMT-140000644000175000017500000000016314353032552015515 0ustar richardrichardTZif2TZif2Äà+14 <+14>-14 NSTimeZones/zones/Etc/GMT-120000644000175000017500000000016314353032552015513 0ustar richardrichardTZif2TZif2¨À+12 <+12>-12 NSTimeZones/zones/Etc/GMT+120000644000175000017500000000016214353032552015510 0ustar richardrichardTZif2TZif2ÿÿW@-12 <-12>12 NSTimeZones/zones/Etc/GMT+100000644000175000017500000000016214353032552015506 0ustar richardrichardTZif2TZif2ÿÿs`-10 <-10>10 NSTimeZones/zones/Etc/UTC0000644000175000017500000000015714353032552015302 0ustar richardrichardTZif2TZif2UTC UTC0 NSTimeZones/zones/Etc/GMT-130000644000175000017500000000016314353032552015514 0ustar richardrichardTZif2TZif2¶Ð+13 <+13>-13 NSTimeZones/zones/Etc/GMT0000644000175000017500000000015714353032552015276 0ustar richardrichardTZif2TZif2GMT GMT0 NSTimeZones/zones/Etc/GMT-90000644000175000017500000000016214353032552015440 0ustar richardrichardTZif2TZif2~+09 <+09>-9 NSTimeZones/zones/Etc/GMT-40000644000175000017500000000016214353032552015433 0ustar richardrichardTZif2TZif28@+04 <+04>-4 NSTimeZones/zones/Etc/GMT-10000644000175000017500000000016214353032552015430 0ustar richardrichardTZif2TZif2+01 <+01>-1 NSTimeZones/zones/Etc/GMT+40000644000175000017500000000016114353032552015430 0ustar richardrichardTZif2TZif2ÿÿÇÀ-04 <-04>4 NSTimeZones/zones/Etc/GMT+70000644000175000017500000000016114353032552015433 0ustar richardrichardTZif2TZif2ÿÿ-07 <-07>7 NSTimeZones/zones/Etc/Universal0000644000175000017500000000015714353032552016617 0ustar richardrichardTZif2TZif2UTC UTC0 NSTimeZones/zones/Etc/GMT-110000644000175000017500000000016314353032552015512 0ustar richardrichardTZif2TZif2š°+11 <+11>-11 NSTimeZones/zones/Etc/GMT-80000644000175000017500000000016214353032552015437 0ustar richardrichardTZif2TZif2p€+08 <+08>-8 NSTimeZones/zones/Etc/GMT+00000644000175000017500000000015714353032552015431 0ustar richardrichardTZif2TZif2GMT GMT0 NSTimeZones/zones/Etc/GMT+110000644000175000017500000000016214353032552015507 0ustar richardrichardTZif2TZif2ÿÿeP-11 <-11>11 NSTimeZones/zones/Etc/GMT-60000644000175000017500000000016214353032552015435 0ustar richardrichardTZif2TZif2T`+06 <+06>-6 NSTimeZones/zones/Etc/GMT-30000644000175000017500000000016214353032552015432 0ustar richardrichardTZif2TZif2*0+03 <+03>-3 NSTimeZones/zones/Etc/GMT-100000644000175000017500000000016314353032552015511 0ustar richardrichardTZif2TZif2Œ +10 <+10>-10 NSTimeZones/zones/Etc/GMT+20000644000175000017500000000016114353032552015426 0ustar richardrichardTZif2TZif2ÿÿãà-02 <-02>2 NSTimeZones/zones/Etc/GMT+90000644000175000017500000000016114353032552015435 0ustar richardrichardTZif2TZif2ÿÿp-09 <-09>9 NSTimeZones/zones/WET0000644000175000017500000000075614353032552014600 0ustar richardrichardTZif2TZif2' ¤c‹„Et6d'TMD3ú#ëÜÍó¾ã¯Ó Ñ¼½¬®œŸŒ| lr!\c"LT#pÿÿÿÿ×íYðÿÿÿÿØøúpÿÿÿÿÙÍ;ðÿÿÿÿÛðÿÿÿÿÛ­ðÿÿÿÿÜæâðÿÿÿÿÝŒÿðƒŒ ~LMTJDTJST JST-9 NSTimeZones/zones/Egypt0000644000175000017500000000237414353032552015227 0ustar richardrichardTZif2TZif2 ÿÿÿÿ}½M«ÿÿÿÿÈ“´àÿÿÿÿÈú{ÐÿÿÿÿÉüïàÿÿÿÿÊÇèÐÿÿÿÿËË®`ÿÿÿÿÌß)ÐÿÿÿÿͬáàÿÿÿÿÎÆôÐÿÿÿÿÏfàÿÿÿÿЩyÐÿÿÿÿÑ„`àÿÿÿÿÒŠ­Pÿÿÿÿè6c`ÿÿÿÿèô-Pÿÿÿÿê ¹`ÿÿÿÿêÕ`ÐÿÿÿÿëìúðÿÿÿÿìµmÿÿÿÿíÏðÿÿÿÿî—òÿÿÿÿï°³pÿÿÿÿðy%€ÿÿÿÿñ‘æðÿÿÿÿòZYÿÿÿÿóspÿÿÿÿô;Œ€ÿÿÿÿõUŸpÿÿÿÿö€ÿÿÿÿ÷6Òðÿÿÿÿ÷ÿEÿÿÿÿùpÿÿÿÿùáÊÿÿÿÿúù9ðÿÿÿÿûÂý€ÿÿÿÿüÛ¾ðÿÿÿÿý¥‚€ÿÿÿÿþ¼òpÿÿÿÿÿ†¶ž%ðgé€YpIaÞp+¢Cð Õ€$Epî xð Ï<€ çýð ±Á€ É1p’õªdðt(€‹˜pU\np7áOPð€ “ðúHp£ðÛ{€ô<ð¾€ÕppŸ4¶£ð€g€ —×p!a›"z\p#D $b'p%%S€&<Ãp'‡(öð(纀*{ð*Ê?€+á¯p,«s-Ââð.Œ¦€/ à0k Ð1õà2JîÐ3_×à4*ÐÐ5?¹à6 ²Ð7(Ö`7óÏP9¸`9Ó±P:èš`;³“P<È|`=“uP>¨^`?sWP@‘zàA\sÐBq\àCàEýPF1 àFàjPHàH·ÐIðäàJ¹PKÚ`La½ÐL‰XàL¤úPSu8àS¬‰ÐSÚ¼`T$‚PU*0 LMTEESTEET EET-2 NSTimeZones/zones/ROK0000644000175000017500000000063714353032552014572 0ustar richardrichardTZif2TZif2ÿÿÿÿ‹×ðxÿÿÿÿ’æøÿÿÿÿÒC'ðÿÿÿÿ×epÿÿÿÿ×î`ÿÿÿÿØøúpÿÿÿÿÙÍ-àÿÿÿÿÚ׊ðÿÿÿÿÛ­àÿÿÿÿÜæâðÿÿÿÿÝŒñàÿÿÿÿâO)ðÿÿÿÿäk·øÿÿÿÿåhÿÿÿÿæbxÿÿÿÿçLèÿÿÿÿè/pxÿÿÿÿèçôhÿÿÿÿêRxÿÿÿÿêÇÖhÿÿÿÿëï4xÿÿÿÿ째hÿÿÿÿíÏxÿÿÿÿhÿÿÿÿð5qx £`!ng"ƒB#NIwwˆ~Œ  ~…˜ LMTKSTJSTKDT KST-9 NSTimeZones/zones/Pacific/0000755000175000017500000000000014353032552015544 5ustar richardrichardNSTimeZones/zones/Pacific/Palau0000644000175000017500000000022414353032552016527 0ustar richardrichardTZif2TZif2ÿÿÿÿáÏlÿÿÿÿ~66ìÿÿ,”~~LMT+09 <+09>-9 NSTimeZones/zones/Pacific/Tongatapu0000644000175000017500000000035514353032552017434 0ustar richardrichardTZif2TZif2 ÿÿÿÿÒEœ@ÿÿÿÿïà7ûGÐ8Ó}Ð:P:r¸@;ãêP-13 NSTimeZones/zones/Pacific/Norfolk0000644000175000017500000000036714353032552017107 0ustar richardrichardTZif2TZif2ÿÿÿÿ~6ˆÿÿÿÿÜAø€ Êh µçhVæh]˜¯ðx€¡¸ ¯Èš°¨ÀLMT+1112+1130+1230+11+12 <+11>-11<+12>,M10.1.0,M4.1.0/3 NSTimeZones/zones/Pacific/Port_Moresby0000644000175000017500000000023214353032552020110 0ustar richardrichardTZif2TZif2 ÿÿÿÿV¶Zÿÿÿÿrí¤‰ø‰ðŒ  LMTPMMT+10 <+10>-10 NSTimeZones/zones/Pacific/Fiji0000644000175000017500000000061414353032552016351 0ustar richardrichardTZif2TZif2 ÿÿÿÿš±À6;à6×ú`8$4`8·Ü`K,àK®`LÂê`MrAàN¢Ì`OÄàP‚®`Pú¦àRkÊàRÚzÐTTç`TºjàV4É`VšLàXåàXz.àYýÇàZZà[Ý©à\9òà]ÆÆ`^Ôà_Þ``ñ`§À¶Ð¨ÀLMT+13+12 <+12>-12 NSTimeZones/zones/Pacific/Gambier0000644000175000017500000000020414353032552017031 0ustar richardrichardTZif2TZif2ÿÿÿÿ”PHÿÿ|ÿÿpLMT-09 <-09>9 NSTimeZones/zones/Pacific/Galapagos0000644000175000017500000000025714353032552017371 0ustar richardrichardTZif2TZif2 ÿÿÿÿ¶¤L€ÄP+ à+qôPÿÿ¬ÿÿ¹°ÿÿ¹°ÿÿ« LMT-05-06 <-06>6 NSTimeZones/zones/Pacific/Chatham0000644000175000017500000000145014353032552017034 0ustar richardrichardTZif2TZif2EÿÿÿÿA·D„ÿÿÿÿÒÚ–¼ ýà ¬¥à ï¥` žüà ØÁà ~Þรà^Àà˜…à>¢àxgà„àXIàþfà8+àçƒ`!H`Çe`*`§G`á `‡)`Àî`g ` Ð` Fí`!€²`"0 à#iÎà$ëà%.`&Bà' ã`'â$à(íÅ`)Âà*ͧ`+«#`,­‰`-‹`.k`/jç`0mM`1JÉ`2Vià3*«`46Kà5 `6-à6ó©à7öà8Ó‹à9Õñà:³mà;¿`<“Oà=žð`>s1à?~Ò`@\N`A^´`B<0`C>–`D`Ex`Eûô`FþZ`«ü¬DÁ\ ³LLMT+1215+1345+1245 <+1245>-12:45<+1345>,M9.5.0/2:45,M4.1.0/3:45 NSTimeZones/zones/Pacific/Chuuk0000644000175000017500000000023214353032552016543 0ustar richardrichardTZif2TZif2 ÿÿÿÿV¶Zÿÿÿÿrí¤‰ø‰ðŒ  LMTPMMT+10 <+10>-10 NSTimeZones/zones/Pacific/Samoa0000644000175000017500000000022214353032552016523 0ustar richardrichardTZif2TZif2ÿÿÿÿn=Èÿÿÿÿ‘û±xÿÿ_øÿÿePLMTSST SST11 NSTimeZones/zones/Pacific/Guam0000644000175000017500000000053614353032552016364 0ustar richardrichardTZif2TZif2ÿÿÿÿáÅÌÿÿÿÿ~6-LÿÿÿÿË7•àÿÿÿÿÐ.‰ðÿÿÿÿì7¾ÿÿÿÿï6øðÿÿÿÿû›ÿÿÿÿþ?'Œÿÿÿÿÿÿÿÿÿÿ]Xð—,Fupw&Wpp—ÌÑð ‘ |‡, ¿”€e£p:C^`ÿÿ64‡´Œ ~š° Œ LMTGST+09GDTChST ChST-10 NSTimeZones/zones/Pacific/Pohnpei0000644000175000017500000000020614353032552017067 0ustar richardrichardTZif2TZif2ÿÿÿÿ”O3Œ•ôš°LMT+11 <+11>-11 NSTimeZones/zones/Pacific/Nauru0000644000175000017500000000026714353032552016566 0ustar richardrichardTZif2TZif2ÿÿÿÿ£ç+ÿÿÿÿÌéÈÿÿÿÿÒC'ð!¨èœ|¡¸~ ¨ÀLMT+1130+09+12 <+12>-12 NSTimeZones/zones/Pacific/Rarotonga0000644000175000017500000000062614353032552017427 0ustar richardrichardTZif2TZif2ÿÿÿÿ|LÜÈÿÿÿÿß¡`Ȭ(?µy —Yc ÿy9E 蕘"a Èw˜C ¨Y˜â% ˆ;˜Â h˜¡é  Gÿ˜!Ë "1#jè $þ%JÊ %ðà'*¬ 'л¸ÿÿj8ÿÿlXÿÿs` ÿÿzhLMT-1030-10-0930 <-10>10 NSTimeZones/zones/Pacific/Wallis0000644000175000017500000000020614353032552016720 0ustar richardrichardTZif2TZif2ÿÿÿÿ~6Ì¢4¨ÀLMT+12 <+12>-12 NSTimeZones/zones/Pacific/Auckland0000644000175000017500000000202314353032552017206 0ustar richardrichardTZif2TZif2`ÿÿÿÿA·L¨ÿÿÿÿ°´²èÿÿÿÿ±Q‡Xÿÿÿÿ²xåhÿÿÿÿ³Cå`ÿÿÿÿ´XÇhÿÿÿÿµ#Ç`ÿÿÿÿ¶8©hÿÿÿÿ·©`ÿÿÿÿ¸‹hÿÿÿÿ¸ìÅàÿÿÿÿ¹ømhÿÿÿÿºÌ§àÿÿÿÿ»ØOhÿÿÿÿ¼ãèàÿÿÿÿ½®öèÿÿÿÿ¾ÃÊàÿÿÿÿ¿ŽØèÿÿÿÿÀ£¬àÿÿÿÿÁnºèÿÿÿÿƒŽàÿÿÿÿÃNœèÿÿÿÿÄcpàÿÿÿÿÅ.~èÿÿÿÿÆL`ÿÿÿÿÇ`èÿÿÿÿÈ,o`ÿÿÿÿÈ÷}hÿÿÿÿÒÚš@ ýà ¬¥à ï¥` žüà ØÁà ~Þรà^Àà˜…à>¢àxgà„àXIàþfà8+àçƒ`!H`Çe`*`§G`á `‡)`Àî`g ` Ð` Fí`!€²`"0 à#iÎà$ëà%.`&Bà' ã`'â$à(íÅ`)Âà*ͧ`+«#`,­‰`-‹`.k`/jç`0mM`1JÉ`2Vià3*«`46Kà5 `6-à6ó©à7öà8Ó‹à9Õñà:³mà;¿`<“Oà=žð`>s1à?~Ò`@\N`A^´`B<0`C>–`D`Ex`Eûô`FþZ`£Ø¯È¡¸ ¨À¶Ð¨ÀLMTNZSTNZMTNZDT NZST-12NZDT,M9.5.0,M4.1.0/3 NSTimeZones/zones/Pacific/Pitcairn0000644000175000017500000000023114353032552017234 0ustar richardrichardTZif2TZif2ÿÿÿÿ~7.ô5DBÿÿ† ÿÿˆxÿÿ€ LMT-0830-08 <-08>8 NSTimeZones/zones/Pacific/Honolulu0000644000175000017500000000033514353032552017275 0ustar richardrichardTZif2TZif2ÿÿÿÿtàp¾ÿÿÿÿ»CHÿÿÿÿ»!qXÿÿÿÿˉ=ÈÿÿÿÿÒ#ôpÿÿÿÿÒaI8ÿÿÿÿÕsHÿÿlÿÿlXÿÿzhÿÿzh ÿÿzhÿÿs`LMTHSTHDTHWTHPT HST10 NSTimeZones/zones/Pacific/Kosrae0000644000175000017500000000036214353032552016714 0ustar richardrichardTZif2TZif2 ÿÿÿÿá´´ÿÿÿÿ~64ÿÿÿÿ˜•Ðÿÿÿÿ 9ùðÿÿÿÿÁí5ÐÿÿÿÿÉê `ÿÿÿÿÒðÿÿÿÿÿ†P6‹g@ÿÿGL˜Ìš°~Œ  ¨ÀLMT+11+09+10+12 <+11>-11 NSTimeZones/zones/Pacific/Fakaofo0000644000175000017500000000023114353032552017031 0ustar richardrichardTZif2TZif2 ÿÿÿÿ~7UˆNý™°ÿÿ_xÿÿeP¶ÐLMT-11+13 <+13>-13 NSTimeZones/zones/Pacific/Niue0000644000175000017500000000023214353032552016364 0ustar richardrichardTZif2TZif2ÿÿÿÿß¡jLÿÿÿÿõ¦¸`ÿÿ`´ÿÿ` ÿÿeP LMT-1120-11 <-11>11 NSTimeZones/zones/Pacific/Efate0000644000175000017500000000052614353032552016516 0ustar richardrichardTZif2TZif2 ÿÿÿÿ’õ´y™@úÌ@Ò÷ÐÂÚÀ²ÙТ¼À›öP‚žÀ{ØP k»@![ºP"K@#;œP$+@%~P& a@&û`P'ëC@(ä|Ð)Q@*éHÐ+a3@̨Àš°LMT+12+11 <+11>-11 NSTimeZones/zones/Pacific/Apia0000644000175000017500000000062714353032552016346 0ustar richardrichardTZif2TZif2ÿÿÿÿn=Éÿÿÿÿ‘üÿÿÿÿÚb8LŸ'°M—+àN}â`Ný‹ Ow àPfþàQ`*`RFààS@ `T&ÂàUî`V¤àVÿÐ`Wæ†àXß²`YÆhàZ¿”`[¯…`\¨°à]g`^ˆ’à_oI``htà°€ÿÿ_ÿÿ^Hÿÿs` ÿÿeP¶ÐÄàLMT-1130-10-11+13+14 <+13>-13 NSTimeZones/zones/Pacific/Noumea0000644000175000017500000000030614353032552016712 0ustar richardrichardTZif2TZif2 ÿÿÿÿ’õÄtæºPV»ÀÆœP7ï@2 Kð3Dpœ ¨Àš°LMT+12+11 <+11>-11 NSTimeZones/zones/Pacific/Enderbury0000644000175000017500000000025414353032552017427 0ustar richardrichardTZif2TZif2ÿÿÿÿÃ,Û€VÀ/9°ÿÿW@ÿÿeP¶Ð -00-12-11+13 <+13>-13 NSTimeZones/zones/Pacific/Majuro0000644000175000017500000000020614353032552016722 0ustar richardrichardTZif2TZif2ÿÿÿÿ~6Ì¢4¨ÀLMT+12 <+12>-12 NSTimeZones/zones/Pacific/Midway0000644000175000017500000000022214353032552016715 0ustar richardrichardTZif2TZif2ÿÿÿÿn=Èÿÿÿÿ‘û±xÿÿ_øÿÿePLMTSST SST11 NSTimeZones/zones/Pacific/Yap0000644000175000017500000000023214353032552016215 0ustar richardrichardTZif2TZif2 ÿÿÿÿV¶Zÿÿÿÿrí¤‰ø‰ðŒ  LMTPMMT+10 <+10>-10 NSTimeZones/zones/Pacific/Easter0000644000175000017500000000222614353032552016714 0ustar richardrichardTZif3TZif3nÿÿÿÿi‡Bÿÿÿÿ¹Ç@ˆÿÿÿÿýÑ<@ÿÿÿÿþ’ú°ÿÿÿÿÿÌÍÀrܰuPÀ@I°U2À +°>O@ ° ¼@ßï°þ@ ¿Ñ° Ýõ@ ¨î0 ½×@ ˆÐ0¹@h²0†ÕÀH”0f·À(v0F™À’°&{Àñt°]ÀÑV°æ?À±8°Ï\@‘°¯>@pü° @ 0!o@"9û0#Nä@$Ý0%8À%ù¿0&òøÀ'Ù¡0(÷ÄÀ)½°*צÀ+¢Ÿ°,·ˆÀ-‚°.—jÀ/bc°0€‡@1BE°2`i@3=×04@K@5 D06 ¸@7Õ°8@8Ë09é+À:ªê0;É À<ŠÌ0=¨ïÀ>j®0?ˆÑÀ@SʰAh³ÀB3¬°CH•ÀDްE1²@Eóp°G”@Gï0Hñv@I¼o0JÑX@K¸°L±:@MÆ0NP‚ÀOœ®°PBÙÀQ|°R+ö@S\r°T Ø@W7æ0W¯ìÀYÈ0YÎÀZ÷ª0[o°À\©g°]t|À^‰I°_T^À`i+°a4@ÀbI °c]@d(ï°ÿÿ™xÿÿ™xÿÿ« ÿÿ ÿÿ« ÿÿ¹°LMTEMT-06-07-05 <-06>6<-05>,M9.1.6/22,M4.1.6/22 NSTimeZones/zones/Pacific/Guadalcanal0000644000175000017500000000020614353032552017661 0ustar richardrichardTZif2TZif2ÿÿÿÿ”O3Œ•ôš°LMT+11 <+11>-11 NSTimeZones/zones/Pacific/Ponape0000644000175000017500000000020614353032552016707 0ustar richardrichardTZif2TZif2ÿÿÿÿ”O3Œ•ôš°LMT+11 <+11>-11 NSTimeZones/zones/Pacific/Wake0000644000175000017500000000020614353032552016354 0ustar richardrichardTZif2TZif2ÿÿÿÿ~6Ì¢4¨ÀLMT+12 <+12>-12 NSTimeZones/zones/Pacific/Tahiti0000644000175000017500000000020514353032552016706 0ustar richardrichardTZif2TZif2ÿÿÿÿ”PU¸ÿÿsÈÿÿs`LMT-10 <-10>10 NSTimeZones/zones/Pacific/Bougainville0000644000175000017500000000031114353032552020102 0ustar richardrichardTZif2TZif2ÿÿÿÿV¶R(ÿÿÿÿrí¤ÿÿÿÿÌC6`ÿÿÿÿÒ+lðTž×€‘؉ðŒ  ~ š°LMTPMMT+10+09+11 <+11>-11 NSTimeZones/zones/Pacific/Kiritimati0000644000175000017500000000025614353032552017600 0ustar richardrichardTZif2TZif2ÿÿÿÿ~7H€Uò/+ ÿÿl€ÿÿjÿÿs` ÄàLMT-1040-10+14 <+14>-14 NSTimeZones/zones/Pacific/Kwajalein0000644000175000017500000000033314353032552017373 0ustar richardrichardTZif2TZif2ÿÿÿÿ~6 ÿÿÿÿÁí5ÐÿÿÿÿÉê `ÿÿÿÿÏFðÿÿÿÿÿ†P,v@œàš°Œ ~ ÿÿW@¨ÀLMT+11+10+09-12+12 <+12>-12 NSTimeZones/zones/Pacific/Tarawa0000644000175000017500000000020614353032552016704 0ustar richardrichardTZif2TZif2ÿÿÿÿ~6Ì¢4¨ÀLMT+12 <+12>-12 NSTimeZones/zones/Pacific/Marquesas0000644000175000017500000000021314353032552017424 0ustar richardrichardTZif2TZif2 ÿÿÿÿ”PLHÿÿ}8ÿÿzhLMT-0930 <-0930>9:30 NSTimeZones/zones/Pacific/Pago_Pago0000644000175000017500000000022214353032552017317 0ustar richardrichardTZif2TZif2ÿÿÿÿn=Èÿÿÿÿ‘û±xÿÿ_øÿÿePLMTSST SST11 NSTimeZones/zones/Pacific/Truk0000644000175000017500000000023214353032552016411 0ustar richardrichardTZif2TZif2 ÿÿÿÿV¶Zÿÿÿÿrí¤‰ø‰ðŒ  LMTPMMT+10 <+10>-10 NSTimeZones/zones/Pacific/Kanton0000644000175000017500000000025414353032552016722 0ustar richardrichardTZif2TZif2ÿÿÿÿÃ,Û€VÀ/9°ÿÿW@ÿÿeP¶Ð -00-12-11+13 <+13>-13 NSTimeZones/zones/Pacific/Funafuti0000644000175000017500000000020614353032552017246 0ustar richardrichardTZif2TZif2ÿÿÿÿ~6Ì¢4¨ÀLMT+12 <+12>-12 NSTimeZones/zones/Pacific/Johnston0000644000175000017500000000033514353032552017272 0ustar richardrichardTZif2TZif2ÿÿÿÿtàp¾ÿÿÿÿ»CHÿÿÿÿ»!qXÿÿÿÿˉ=ÈÿÿÿÿÒ#ôpÿÿÿÿÒaI8ÿÿÿÿÕsHÿÿlÿÿlXÿÿzhÿÿzh ÿÿzhÿÿs`LMTHSTHDTHWTHPT HST10 NSTimeZones/zones/Pacific/Saipan0000644000175000017500000000053614353032552016706 0ustar richardrichardTZif2TZif2ÿÿÿÿáÅÌÿÿÿÿ~6-LÿÿÿÿË7•àÿÿÿÿÐ.‰ðÿÿÿÿì7¾ÿÿÿÿï6øðÿÿÿÿû›ÿÿÿÿþ?'Œÿÿÿÿÿÿÿÿÿÿ]Xð—,Fupw&Wpp—ÌÑð ‘ |‡, ¿”€e£p:C^`ÿÿ64‡´Œ ~š° Œ LMTGST+09GDTChST ChST-10 NSTimeZones/zones/GMT+130000644000175000017500000000017114353032552014776 0ustar richardrichardTZif2TZif2¶ÐGMT+13 -13 NSTimeZones/zones/Singapore0000644000175000017500000000040014353032552016052 0ustar richardrichardTZif2TZif2 ÿÿÿÿ~6S£ÿÿÿÿ†ƒ…£ÿÿÿÿºgNÿÿÿÿÀ ä`ÿÿÿÿʳå`ÿÿÿÿË‘_ÿÿÿÿÒHmð‘îa]a]bpg  g ix~p€LMTSMT+07+0720+0730+09+08 <+08>-8 NSTimeZones/zones/UCT0000644000175000017500000000015714353032552014567 0ustar richardrichardTZif2TZif2UTC UTC0 NSTimeZones/zones/GMT-140000644000175000017500000000017014353032552015000 0ustar richardrichardTZif2TZif2ÿÿ; GMT-14 14 NSTimeZones/zones/GMT-120000644000175000017500000000017014353032552014776 0ustar richardrichardTZif2TZif2ÿÿW@GMT-12 12 NSTimeZones/zones/HST0000644000175000017500000000016014353032552014564 0ustar richardrichardTZif2TZif2ÿÿs`HST HST10 NSTimeZones/zones/Asia/0000755000175000017500000000000014353032552015063 5ustar richardrichardNSTimeZones/zones/Asia/Dushanbe0000644000175000017500000000055614353032552016545 0ustar richardrichardTZif2TZif2ÿÿÿÿªƒ€ÿÿÿÿµ£ï0'} ²± ùåéä ÛÌi ¼vÀ¬gÀœXÀŒIÀ|:À l+À!\À"L À#;þÀ$+ïÀ%àÀ& ÑÀ'ý@'ôî@(ÊP@€FPbpT` T` LMT+05+07+06 <+05>-5 NSTimeZones/zones/Asia/Vladivostok0000644000175000017500000000134614353032552017317 0ustar richardrichardTZif2TZif2Aÿÿÿÿ§YG]ÿÿÿÿµ£¶ð'E`yÐxàù­Pé¬`ÚàÐÌ1`¼>€¬/€œ €Œ€|€ kó€![ä€"KÕ€#;Æ€$+·€%¨€& ™€'Å'ô¶(äµ)x])Ô˜*ĉ+´z,¤k-”\.„M/t>0d/1]Z€2r5€3=<€4R€5€61ù€6ý€88Üâ€9úø:¼Ä€;ÚÚ<¥á=º¼>…Ã?šž@e¥Aƒº€BE‡Ccœ€D%iEC~€FKG#`€Gîg€IB€IÎI€Jã$€K®+€LÌAMŽ €TKºð{£~š°Œ  Œ  š°LMT+09+11+10 <+10>-10 NSTimeZones/zones/Asia/Pyongyang0000644000175000017500000000026714353032552016766 0ustar richardrichardTZif2TZif2 ÿÿÿÿ‹×ñœÿÿÿÿ’æøÿÿÿÿÒ/apUÎpZìupuäwˆ~~LMTKSTJST KST-9 NSTimeZones/zones/Asia/Istanbul0000644000175000017500000000226014353032552016567 0ustar richardrichardTZif2TZif2sÿÿÿÿV¶ÈØÿÿÿÿ‹õ˜ÿÿÿÿ› `ÿÿÿÿ›Õ¾Ðÿÿÿÿ¢ecàÿÿÿÿ£{‚Pÿÿÿÿ¤N€`ÿÿÿÿ¥?´Ðÿÿÿÿ¦%'àÿÿÿÿ§'Ðÿÿÿÿª((`ÿÿÿÿªáýÐÿÿÿÿ«ù‰àÿÿÿÿ¬Ã1PÿÿÿÿÈ?àÿÿÿÿÉPÿÿÿÿÉJõ`ÿÿÿÿÊ΀PÿÿÿÿËË®`ÿÿÿÿÒk PÿÿÿÿÓ¢9`ÿÿÿÿÔCPÿÿÿÿÕL àÿÿÿÿÖ){Ðÿÿÿÿ×+ïàÿÿÿÿØ ]ÐÿÿÿÿÙ—`ÿÿÿÿÙé?ÐÿÿÿÿÚë³àÿÿÿÿÛÒ\PÿÿÿÿÜÔÐ`ÿÿÿÿݲ>Pÿÿÿÿñô¹`ÿÿÿÿôbïPÿÿÿÿõh`ÿÿÿÿö8Ðn“p9špûu |p ÐË ù^p ±þ€ Ù@p ¤U€¦­p„7€øP‰°pܰàæÐðÆïð›1pŒsð|dð lUð!\Fð"L7ð#<(ð$,ð% ð& ûð''p'õp(å p)Ôúp*Äëp+´Üp,¤Íp-‹ƒð.„¯p/t p0d‘p1]¼ð2r—ð3=žð4Ryð5€ð62[ð6ýbð8xp8ÝDð9ûZp:½&ð;Û†%p?›p@fpA„ðBEépCcþðD%ËpECàðFÉG#ßGîæIÁIÎÈJã£K®ªLÌ¿MÝN¬¡OnnPŒƒQWŠRleS8¾TLGUNV>žV÷0WÏ.P(h*0 *08@LMTIMTEESTEET+03+04 <+03>-3 NSTimeZones/zones/Asia/Ust-Nera0000644000175000017500000000140314353032552016442 0ustar richardrichardTZif2TZif2Bÿÿÿÿ¡Ûݺÿÿÿÿµ£Å'SpkÀjÐùŸ@éžPÚÒÀÌ#P¼0p¬!pœpŒp{ôp kåp![Öp"KÇp#;¸p$+©p%šp& ‹p'¶ð'ô§ð(ä§)xO)Ô‰ð*Äzð+´kð,¤\ð-”Mð.„>ð/t/ð0d ð1]Lp2r'p3=.p4R p5p61ëp6üòp8ð8ÜÔp9úéð:¼¶p;ÚËð<¥Òð=º­ð>…´ð?šð@e–ðAƒ¬pBExðCcŽpD%ZðECppF<ðG#RpGîYpI4pIÎ;pJãpK®pLÌ2ðMÿpNmô@TKºð†Fp€~š° ¨Àš° Œ ¨ÀLMT+08+09+11+12+10 <+10>-10 NSTimeZones/zones/Asia/Beirut0000644000175000017500000000133414353032552016241 0ustar richardrichardTZif2TZif2@ ÿÿÿÿV¶Â¸ÿÿÿÿ¢ecàÿÿÿÿ£{‚Pÿÿÿÿ¤N€`ÿÿÿÿ¥?´Ðÿÿÿÿ¦%'àÿÿÿÿ§'Ðÿÿÿÿ¨)óàÿÿÿÿ¨ë²Pÿÿÿÿè*…àÿÿÿÿèô-Pÿÿÿÿê ¹`ÿÿÿÿêÕ`Ðÿÿÿÿëììàÿÿÿÿì¶”PÿÿÿÿíÏqàÿÿÿÿî™Pÿÿÿÿï°¥`ÿÿÿÿðzLЦ^`+wÐCà «P$7`íÞÐ jà ÏP çïà ±—P É#`’ÊЩ`r¬Ðô.àÑœÐÕb`²ÐP¶•à”Ð —É`!u7P"£,à#W¼P$g_`%8ïÐ&<µ`'#P(èà(ûVÐ*mà*Î Ð+´Î`,¤±P-”°`.„“P/t’`0duP1]®à2M‘Ð3=à4-sÐ5rà6 UÐ6ýTà!H*0 LMTEESTEET EET-2EEST,M3.5.0/0,M10.5.0/0 NSTimeZones/zones/Asia/Urumqi0000644000175000017500000000020514353032552016265 0ustar richardrichardTZif2TZif2ÿÿÿÿ°þºdRT`LMT+06 <+06>-6 NSTimeZones/zones/Asia/Famagusta0000644000175000017500000000165414353032552016724 0ustar richardrichardTZif2TZif2Vÿÿÿÿ¥w, í¯à Ý’Ð údà ¾ÆP ¤9`ŠáЄ`uOÐcý`SàPMà3ÂP#Á`¤P£`ó†Pã…`ÓhPÃg`¼„ЬƒàœfÐŒeà|HÐ lGà!\*Ð"L)à#< Ð$, à%îÐ& íà' P'õ `(äíP)Ôì`*ÄÏP+´Î`,¤±P-”°`.„“P/t’`0duP1]®à2M‘Ð3=à4-sÐ5rà62x6ý8”8Ýa9ûv:½C;ÛX<¦_=»:>†A?›@f#A„9BFCdD%çECýFÉG#ßGîæIÁIÎÈJã£K®ªLÌ¿MŽŒN¬¡OnnPŒƒQWŠRleS7lTLGUNV,)V÷0WÐÐYõ(Ô*0 *0 LMTEESTEET+03 EET-2EEST,M3.5.0/3,M10.5.0/4 NSTimeZones/zones/Asia/Yekaterinburg0000644000175000017500000000137014353032552017622 0ustar richardrichardTZif2TZif2Bÿÿÿÿ›_ 'ÿÿÿÿ¡±ÿÿÿÿÿµ£ý@'‹°À ¿0ùó éò°Û' Ìw°¼„ЬuМfÐŒWÐ|HÐ l9Ð!\*Ð"LÐ#< Ð$+ýÐ%îÐ& ßÐ' P'ôüP(äû`)x£`)ÔÞP*ÄÏP+´ÀP,¤±P-”¢P.„“P/t„P0duP1] Ð2r{Ð3=‚Ð4R]Ð5dÐ62?Ð6ýFÐ8\P8Ý(Ð9û>P:½ Ð;Û P<¦'P=»P>† P?šäP@eëPA„ÐBEÍPCcâÐD%¯PECÄÐF‘PG#¦ÐGî­ÐIˆÐIÎÐJãjÐK®qÐL̇PMŽSÐTL@8Ù4Á8@T` FPFPT` LMTPMT+04+06+05 <+05>-5 NSTimeZones/zones/Asia/Tbilisi0000644000175000017500000000116514353032552016410 0ustar richardrichardTZif2TZif24ÿÿÿÿV¶ºÿÿÿÿªšÿÿÿÿçÚ P'™ÀÎ0Í@ú°êÀÛ50Ì…À¼’ଃàœtàŒeà|Và lGà!\8à"L)à#<à$, à%üà& íà'`'õ `(å p)ÔÞP*ÄÁ@+´ÀP,¤£@-”¢P.„…@/tv@0dY01]’À3=f°4RA°5VÀ62#°6ý8À8@08ÝÀ9û"0:¼üÀ;Û0<¦@=ºæ0>…û@?šÈ0@eÝ@@ÝǰA„ðBEép)ÿ)ÿ*0 FP 8@8@LMTTBMT+03+05+04 <+04>-4 NSTimeZones/zones/Asia/Kolkata0000644000175000017500000000033414353032552016374 0ustar richardrichardTZif2TZif2ÿÿÿÿ&º(ÿÿÿÿCçë0ÿÿÿÿ‡¼ºÿÿÿÿÊÛŒ(ÿÿÿÿÌqÿÿÿÿÌ•2¨ÿÿÿÿÒt˜RØRÐKFMX [hLMTHMTMMTIST+0630 IST-5:30 NSTimeZones/zones/Asia/Omsk0000644000175000017500000000134514353032552015722 0ustar richardrichardTZif2TZif2Aÿÿÿÿ¡³@¶ÿÿÿÿµ£ï0'} ²± ùåéä ÛÌi ¼vÀ¬gÀœXÀŒIÀ|:À l+À!\À"L À#;þÀ$+ïÀ%àÀ& ÑÀ'ý@'ôî@(äíP)x•P)ÔÐ@*ÄÁ@+´²@,¤£@-””@.„…@/tv@0dg@1]’À2rmÀ3=tÀ4ROÀ5VÀ621À6ý8À8N@8ÝÀ9û0@:¼üÀ;Û@<¦@=ºô@>…û@?šÖ@@eÝ@AƒòÀBE¿@CcÔÀD%¡@EC¶ÀFƒ@G#˜ÀGîŸÀIzÀIÎÀJã\ÀK®cÀLÌy@MŽEÀTKó0DÊFPbpT` T` bpLMT+05+07+06 <+06>-6 NSTimeZones/zones/Asia/Jerusalem0000644000175000017500000000206214353032552016735 0ustar richardrichardTZif3TZif3dÿÿÿÿV¶Âúÿÿÿÿž0EˆÿÿÿÿÈYÏÿÿÿÿÈú¦ÿÿÿÿÉ8œ€ÿÿÿÿÌåë€ÿÿÿÿͬþÿÿÿÿÎÇÿÿÿÿσÿÿÿÿЩ¤ÿÿÿÿÑ„}ÿÿÿÿҊ׀ÿÿÿÿÓe°€ÿÿÿÿÔl ÿÿÿÿ×Z0€ÿÿÿÿ×ßXÿÿÿÿØ/ÀÿÿÿÿÙcÿÿÿÿÚ÷ÿÿÿÿÚëÐÿÿÿÿÛ´4ÿÿÿÿܹ=ÿÿÿÿÝàÿÿÿÿ޴΀ÿÿÿÿߤ¿€ÿÿÿÿà‹vÿÿÿÿáV}ÿÿÿÿâ¾f€ÿÿÿÿã6_ÿÿÿÿäžH€ÿÿÿÿåAÿÿÿÿætðÿÿÿÿçÒ€ÿÿÿÿè&­€ÿÿÿÿèèz|‹àý°Ð öê` ¦3Ðéü`![`úÆ`Žn`¾øàw|ÐÌÿ``™P ‚±`!IµÐ"^žà# ]P$Z0`%?P& íà&ÖæÐ'ëÏà(ÀP)Ôì`*©Ð+»eà,‰Ð-›Gà._©P/{)à0HÅÐ1H–à2ƒ‚p?|Ÿà@s6pAP¤`BLCHOpD,qEöðF SFìcðGì5HçõpIÌJ¾œðK«ùLŒ ðM•€N‡›pOt÷€P^BðQTÙ€! ø*0 8@LMTJMTIDTISTIDDT IST-2IDT,M3.4.4/26,M10.5.0 NSTimeZones/zones/Asia/Jayapura0000644000175000017500000000025314353032552016562 0ustar richardrichardTZif2TZif2ÿÿÿÿºÁ˜ÿÿÿÿÐX¹ðÿÿÿÿôµ¢hƒè~…˜~LMT+09+0930WIT WIT-9 NSTimeZones/zones/Asia/Brunei0000644000175000017500000000050014353032552016225 0ustar richardrichardTZif2TZif2ÿÿÿÿ­ŠÿÿÿÿºgGˆÿÿÿÿ¿{'€ÿÿÿÿ¿óPÿÿÿÿÁ]¬€ÿÿÿÿÁÕ PÿÿÿÿÃ>àÿÿÿÿöÓÐÿÿÿÿÅ €ÿÿÿÿŘPÿÿÿÿÇGÿÿÿÿÇy:ÐÿÿÿÿÈãÌÿÿÿÿÉ[¿ÐÿÿÿÿÊÄÿ€ÿÿÿÿË<óPÿÿÿÿË‘XÿÿÿÿÒHmðgpixu0 p€~LMT+0730+0820+08+09 <+08>-8 NSTimeZones/zones/Asia/Bahrain0000644000175000017500000000023014353032552016345 0ustar richardrichardTZif2TZif2 ÿÿÿÿ¡ò0Š’À0P8@*0LMT+04+03 <+03>-3 NSTimeZones/zones/Asia/Makassar0000644000175000017500000000027614353032552016555 0ustar richardrichardTZif2TZif2ÿÿÿÿ¡ò]ÿÿÿÿºÕÿÿÿÿˈ€ÿÿÿÿÒVîpoðoðp€~ p€LMTMMT+08+09WITA WITA-8 NSTimeZones/zones/Asia/Kathmandu0000644000175000017500000000024114353032552016717 0ustar richardrichardTZif2TZif2ÿÿÿÿ¡ò}„0¨OüMXPÜ LMT+0530+0545 <+0545>-5:45 NSTimeZones/zones/Asia/Chungking0000644000175000017500000000061114353032552016721 0ustar richardrichardTZif2TZif2 ÿÿÿÿ~6C)ÿÿÿÿ —¢€ÿÿÿÿ¡yðÿÿÿÿÈY^€ÿÿÿÿÉ ùpÿÿÿÿÉÓ½ÿÿÿÿËŠðÿÿÿÿË|@ÿÿÿÿÒ;>ðÿÿÿÿÓ‹{€ÿÿÿÿÔB­ðÿÿÿÿÕE"ÿÿÿÿÖL¿ðÿÿÿÿ×<¿ÿÿÿÿØfpÿÿÿÿÙò€ÿÿÿÿÙA|ðºR i› ~„ !I}"g¡ #)_$Gƒ %|&'e &ò^(G (Ò@q×~p€LMTCDTCST CST-8 NSTimeZones/zones/Asia/Taipei0000644000175000017500000000077714353032552016234 0ustar richardrichardTZif2TZif2)ÿÿÿÿtÎðÿÿÿÿÃUI€ÿÿÿÿÒTY€ÿÿÿÿÓ‹{€ÿÿÿÿÔB­ðÿÿÿÿÕE"ÿÿÿÿÖL¿ðÿÿÿÿ×<¿ÿÿÿÿØfpÿÿÿÿÙò€ÿÿÿÿÙç™ðÿÿÿÿÚÿ&ÿÿÿÿÛÈÍpÿÿÿÿÜàY€ÿÿÿÿݪðÿÿÿÿÞrsÿÿÿÿßµdpÿÿÿÿà|…ÿÿÿÿá–—ðÿÿÿÿâ]¸€ÿÿÿÿãwËpÿÿÿÿä>ìÿÿÿÿå0 pÿÿÿÿæ!qÿÿÿÿç¥pÿÿÿÿ褀ÿÿÿÿèóØðÿÿÿÿéãØÿÿÿÿêÕ pÿÿÿÿëÅ €ÿÿÿÿì¶?ðÿÿÿÿí÷üÿÿÿÿî˜ÄðÿÿÿÿïÙ/€ÿÿÿÿðyøpüVíŠp ݉€ νðÛ¡€TÝpqèp€~~ LMTCSTJSTCDT CST-8 NSTimeZones/zones/Asia/Dacca0000644000175000017500000000034714353032552016005 0ustar richardrichardTZif2TZif2ÿÿÿÿi††¼ÿÿÿÿÊÛ†°ÿÿÿÿÌqÿÿÿÿÌ•2¨ÿÿÿÿݨҘJ;ÄK<ØTÄRÐ[hMXT`bpLMTHMT+0630+0530+06+07 <+06>-6 NSTimeZones/zones/Asia/Irkutsk0000644000175000017500000000137014353032552016443 0ustar richardrichardTZif2TZif2BÿÿÿÿV¶‚?ÿÿÿÿ¢¿ÿÿÿÿµ£Ó'a€•ð•ùÉpéÈ€ÚüðÌM€¼Z ¬K œ< Œ- |  l !\ "Kñ #;â $+Ó %Ä & µ 'á 'ôÒ (äÑ0)xy0)Ô´ *Ä¥ +´– ,¤‡ -”x .„i /tZ 0dK 1]v 2rQ 3=X 4R3 5: 62 6ý 82 8Üþ 9û :¼à ;Úö <¥ý =ºØ >…ß ?šº @eÁ AƒÖ BE£ Cc¸ D%… ECš Fg G#| GI^ IÎe Jã@ K®G LÌ] MŽ) TK×aÁaÁbp~ p€p€~ LMTIMT+07+09+08 <+08>-8 NSTimeZones/zones/Asia/Tomsk0000644000175000017500000000136114353032552016104 0ustar richardrichardTZif2TZif2Cÿÿÿÿ¡åNÙÿÿÿÿµ£á 'o¤£ù×€éÖÛ Ì[¼h°¬Y°œJ°Œ;°|,° l°!\°"Kÿ°#;ð°$+á°%Ò°& ð'ï0'ôà0(äß@)x‡@)ÔÂ0*ij0+´¤0,¤•0-”†0.„w0/th00dY01]„°2r_°3=f°4RA°5H°62#°6ý*°8@08Ý °9û"0:¼î°;Û0<¦ 0<Îé°=ºô@>…û@?šÖ@@eÝ@AƒòÀBE¿@CcÔÀD%¡@EC¶ÀFƒ@G#˜ÀGîŸÀIzÀIÎÀJã\ÀK®cÀLÌy@MŽEÀTKó0WIøÀO§T`p€bp bp LMT+06+08+07 <+07>-7 NSTimeZones/zones/Asia/Dili0000644000175000017500000000025214353032552015666 0ustar richardrichardTZif2TZif2 ÿÿÿÿ’æÄÿÿÿÿË™2ð ê0p9Ùu¼p€~LMT+08+09 <+09>-9 NSTimeZones/zones/Asia/Calcutta0000644000175000017500000000033414353032552016546 0ustar richardrichardTZif2TZif2ÿÿÿÿ&º(ÿÿÿÿCçë0ÿÿÿÿ‡¼ºÿÿÿÿÊÛŒ(ÿÿÿÿÌqÿÿÿÿÌ•2¨ÿÿÿÿÒt˜RØRÐKFMX [hLMTHMTMMTIST+0630 IST-5:30 NSTimeZones/zones/Asia/Kamchatka0000644000175000017500000000132714353032552016675 0ustar richardrichardTZif2TZif2@ÿÿÿÿ§R–Äÿÿÿÿµ£šÐ')@]°\Àù‘0é@ÚİÌ@¼"`¬`œ`‹õ`{æ` k×`![È`"K¹`#;ª`$+›`%Œ`& }`'¨à'ô™à(ä˜ð)x@ð)Ô{à*Älà+´]à,¤Nà-”?à.„0à/t!à0dà1]>`2r`3= `4Qû`5`61Ý`6üä`8ùà8ÜÆ`9úÛà:¼¨`;Ú½à<¥Äà=ºŸà>…¦à?šà@eˆàAƒž`BEjàCc€`D%LàECb`F.àG#D`GîK`I&`IÎ-`Jã`K®`LÌ2ðMÿp”¼š°¶Ð¨À ¨À LMT+11+13+12 <+12>-12 NSTimeZones/zones/Asia/Thimbu0000644000175000017500000000023214353032552016233 0ustar richardrichardTZif2TZif2ÿÿÿÿÕæt!aM¨T MXT` LMT+0530+06 <+06>-6 NSTimeZones/zones/Asia/Tel_Aviv0000644000175000017500000000206214353032552016517 0ustar richardrichardTZif3TZif3dÿÿÿÿV¶Âúÿÿÿÿž0EˆÿÿÿÿÈYÏÿÿÿÿÈú¦ÿÿÿÿÉ8œ€ÿÿÿÿÌåë€ÿÿÿÿͬþÿÿÿÿÎÇÿÿÿÿσÿÿÿÿЩ¤ÿÿÿÿÑ„}ÿÿÿÿҊ׀ÿÿÿÿÓe°€ÿÿÿÿÔl ÿÿÿÿ×Z0€ÿÿÿÿ×ßXÿÿÿÿØ/ÀÿÿÿÿÙcÿÿÿÿÚ÷ÿÿÿÿÚëÐÿÿÿÿÛ´4ÿÿÿÿܹ=ÿÿÿÿÝàÿÿÿÿ޴΀ÿÿÿÿߤ¿€ÿÿÿÿà‹vÿÿÿÿáV}ÿÿÿÿâ¾f€ÿÿÿÿã6_ÿÿÿÿäžH€ÿÿÿÿåAÿÿÿÿætðÿÿÿÿçÒ€ÿÿÿÿè&­€ÿÿÿÿèèz|‹àý°Ð öê` ¦3Ðéü`![`úÆ`Žn`¾øàw|ÐÌÿ``™P ‚±`!IµÐ"^žà# ]P$Z0`%?P& íà&ÖæÐ'ëÏà(ÀP)Ôì`*©Ð+»eà,‰Ð-›Gà._©P/{)à0HÅÐ1H–à2ƒ‚p?|Ÿà@s6pAP¤`BLCHOpD,qEöðF SFìcðGì5HçõpIÌJ¾œðK«ùLŒ ðM•€N‡›pOt÷€P^BðQTÙ€! ø*0 8@LMTJMTIDTISTIDDT IST-2IDT,M3.4.4/26,M10.5.0 NSTimeZones/zones/Asia/Ashgabat0000644000175000017500000000056714353032552016530 0ustar richardrichardTZif2TZif2ÿÿÿÿªDÿÿÿÿµ£ý@'‹°À ¿0ùó éò°Û' Ìw°¼„ЬuМfÐŒWÐ|HÐ l9Ð!\*Ð"LÐ#< Ð$+ýÐ%îÐ& ßÐ' P'ôüP(äû`)x£`6¼8@T`FP FP LMT+04+06+05 <+05>-5 NSTimeZones/zones/Asia/Kabul0000644000175000017500000000023714353032552016046 0ustar richardrichardTZif2TZif2ÿÿÿÿi†š ÿÿÿÿÐù×@@à8@?HLMT+04+0430 <+0430>-4:30 NSTimeZones/zones/Asia/Kuwait0000644000175000017500000000020514353032552016247 0ustar richardrichardTZif2TZif2ÿÿÿÿÕ6´+Ì*0LMT+03 <+03>-3 NSTimeZones/zones/Asia/Aqtobe0000644000175000017500000000114714353032552016224 0ustar richardrichardTZif2TZif23ÿÿÿÿªŽhÿÿÿÿµ£ý@'‹°À ± ùó éò°Û' Ìw°¼„ЬuМfÐŒWÐ|HÐ l9Ð!\*Ð"LÐ#< Ð$+ýÐ%îÐ& ßÐ' P'ôüP(äû`)x£`)ÔÞP*ÄÏP+´ÀP,¤±P-”¢P.„“P/t„P0duP1] Ð2r{Ð3=‚Ð4R]Ð5dÐ62?Ð6ýFÐ8\P8Ý(Ð9û>P:½ Ð;Û P<¦'P=»P>† P?šäP@eëPA„Ð5˜8@FPT` T` FPLMT+04+05+06 <+05>-5 NSTimeZones/zones/Asia/Rangoon0000644000175000017500000000027314353032552016413 0ustar richardrichardTZif2TZif2ÿÿÿÿV¶‰Ñÿÿÿÿ¡òsQÿÿÿÿËòüÿÿÿÿÑšgðZ/Z/[h~LMTRMT+0630+09 <+0630>-6:30 NSTimeZones/zones/Asia/Qatar0000644000175000017500000000023014353032552016051 0ustar richardrichardTZif2TZif2 ÿÿÿÿ¡ò0Š’À0P8@*0LMT+04+03 <+03>-3 NSTimeZones/zones/Asia/Ashkhabad0000644000175000017500000000056714353032552016664 0ustar richardrichardTZif2TZif2ÿÿÿÿªDÿÿÿÿµ£ý@'‹°À ¿0ùó éò°Û' Ìw°¼„ЬuМfÐŒWÐ|HÐ l9Ð!\*Ð"LÐ#< Ð$+ýÐ%îÐ& ßÐ' P'ôüP(äû`)x£`6¼8@T`FP FP LMT+04+06+05 <+05>-5 NSTimeZones/zones/Asia/Saigon0000644000175000017500000000035414353032552016230 0ustar richardrichardTZif2TZif2 ÿÿÿÿˆŒCŠÿÿÿÿ‘£+ ÿÿÿÿÍ5æ€ÿÿÿÿÑYÎpÿÿÿÿÒ;>ðÿÿÿÿÕ2»ÿÿÿÿä¶ä€ÿÿÿÿí/˜ =Çcöcöbp p€ ~LMTPLMT+07+08+09 <+07>-7 NSTimeZones/zones/Asia/Qyzylorda0000644000175000017500000000116014353032552017002 0ustar richardrichardTZif2TZif24ÿÿÿÿª† ÿÿÿÿµ£ý@'‹°À ± ùó éò°Û' Ìw°¼„ЬuМfÐŒWÐ|HÐ l9Ð!\*Ð"LÐ#< Ð$+ýÐ%îÐ& ßÐ' P'ôüP(äû`)x•P)ÔÐ@*ÄÏP+´ÀP,¤±P-”¢P.„“P/t„P0duP1] Ð2r{Ð3=‚Ð4R]Ð5dÐ62?Ð6ýFÐ8\P8Ý(Ð9û>P:½ Ð;Û P<¦'P=»P>† P?šäP@eëPA„Ð\Ø =`8@FPT` T` FPLMT+04+05+06 <+05>-5 NSTimeZones/zones/Asia/Dubai0000644000175000017500000000020514353032552016027 0ustar richardrichardTZif2TZif2ÿÿÿÿ¡ò™¨3Ø8@LMT+04 <+04>-4 NSTimeZones/zones/Asia/Tehran0000644000175000017500000000145414353032552016233 0ustar richardrichardTZif2TZif2Gÿÿÿÿšl}Èÿÿÿÿ¿ÌH ”D8­¸ys@(ÊÀí:@­¼HEJ¸7ìÈ-¸( vÈ(Û¸)ËœÈ*¾"¸+¬ÐH,ŸV8-ŽÈ.€‰¸/o7H0a½81PjÈ2Bð¸32ïÈ4%u¸5#H6©86õVÈ7çܸ8ÖŠH9É8:¹H;«•8<šBÈ=ŒÈ¸>{vH?mü8@\©ÈAO/¸B?.ÈC1´¸GâÉHHÕO8IÅNHJ·Ô8K¦ÈL™¸M‡µHNz;8OhèÈP[n¸QKmÈR=ó¸S,¡HT'8U ÔÈVZ¸VïHWáŽ8XÑHYÄ8Z²ÀÈ[¥F¸\“ôH]†z8^u'È_g­¸`W¬ÈaJ2¸b8àHc+f80808?H18FP8@LMTTMT+0430+0330+05+04 <+0330>-3:30 NSTimeZones/zones/Asia/Hovd0000644000175000017500000000112214353032552015702 0ustar richardrichardTZif2TZif22ÿÿÿÿ†Óü” ê éÖÛ Ì[¼>€¬=œ €Œ|€ l![ä€"Kã#;Æ€$+Å%¨€& §'Å'ôÄ(ä§)Ô¦*ĉ+´ˆ,¤k-”j.„M/tL0d/1]h2MK€3=J4--€5,6 €:éÁ°;´º <¤¹°=”œ >„›°?t~ @d}°AT` BD_°C4B D$A°E_ U¨°Vo€VõаWåQ€UìT`p€bp LMT+06+08+07 <+07>-7 NSTimeZones/zones/Asia/Seoul0000644000175000017500000000063714353032552016103 0ustar richardrichardTZif2TZif2ÿÿÿÿ‹×ðxÿÿÿÿ’æøÿÿÿÿÒC'ðÿÿÿÿ×epÿÿÿÿ×î`ÿÿÿÿØøúpÿÿÿÿÙÍ-àÿÿÿÿÚ׊ðÿÿÿÿÛ­àÿÿÿÿÜæâðÿÿÿÿÝŒñàÿÿÿÿâO)ðÿÿÿÿäk·øÿÿÿÿåhÿÿÿÿæbxÿÿÿÿçLèÿÿÿÿè/pxÿÿÿÿèçôhÿÿÿÿêRxÿÿÿÿêÇÖhÿÿÿÿëï4xÿÿÿÿ째hÿÿÿÿíÏxÿÿÿÿhÿÿÿÿð5qx £`!ng"ƒB#NIwwˆ~Œ  ~…˜ LMTKSTJSTKDT KST-9 NSTimeZones/zones/Asia/Chita0000644000175000017500000000135614353032552016043 0ustar richardrichardTZif2TZif2Bÿÿÿÿ¡Ûù ÿÿÿÿµ£Å'Sp‡à†ðù»`éºpÚîàÌ?p¼L¬=œ.Œ| l![ò"Kã#;Ô$+Å%¶& §'Ó'ôÄ(äà )xk )Ô¦*Ä—+´ˆ,¤y-”j.„[/tL0d=1]h2rC3=J4R%5,626ý8$8Üð9û:¼Ò;Úè<¥ï=ºÊ>…Ñ?š¬@e³AƒÈBE•CcªD%wECŒFYG#nGîuIPIÎWJã2K®9LÌOMŽTKÉVöÎ j`p€Œ ~ ~ Œ LMT+08+10+09 <+09>-9 NSTimeZones/zones/Asia/Jakarta0000644000175000017500000000037014353032552016363 0ustar richardrichardTZif2TZif2 ÿÿÿÿ?fI`ÿÿÿÿ©x…àÿÿÿÿºÞ`ÿÿÿÿË¿ƒˆÿÿÿÿÒVîpÿÿÿÿ×<ÆÿÿÿÿÚÿ&ÿÿÿÿôµ¾ˆd d g ix~p€bpLMTBMT+0720+0730+09+08WIB WIB-7 NSTimeZones/zones/Asia/Yangon0000644000175000017500000000027314353032552016243 0ustar richardrichardTZif2TZif2ÿÿÿÿV¶‰Ñÿÿÿÿ¡òsQÿÿÿÿËòüÿÿÿÿÑšgðZ/Z/[h~LMTRMT+0630+09 <+0630>-6:30 NSTimeZones/zones/Asia/Muscat0000644000175000017500000000020514353032552016237 0ustar richardrichardTZif2TZif2ÿÿÿÿ¡ò™¨3Ø8@LMT+04 <+04>-4 NSTimeZones/zones/Asia/Ho_Chi_Minh0000644000175000017500000000035414353032552017114 0ustar richardrichardTZif2TZif2 ÿÿÿÿˆŒCŠÿÿÿÿ‘£+ ÿÿÿÿÍ5æ€ÿÿÿÿÑYÎpÿÿÿÿÒ;>ðÿÿÿÿÕ2»ÿÿÿÿä¶ä€ÿÿÿÿí/˜ =Çcöcöbp p€ ~LMTPLMT+07+08+09 <+07>-7 NSTimeZones/zones/Asia/Tokyo0000644000175000017500000000032514353032552016113 0ustar richardrichardTZif2TZif2  ÿÿÿÿe¤pÿÿÿÿ×>pÿÿÿÿ×íYðÿÿÿÿØøúpÿÿÿÿÙÍ;ðÿÿÿÿÛðÿÿÿÿÛ­ðÿÿÿÿÜæâðÿÿÿÿÝŒÿðƒŒ ~LMTJDTJST JST-9 NSTimeZones/zones/Asia/Chongqing0000644000175000017500000000061114353032552016721 0ustar richardrichardTZif2TZif2 ÿÿÿÿ~6C)ÿÿÿÿ —¢€ÿÿÿÿ¡yðÿÿÿÿÈY^€ÿÿÿÿÉ ùpÿÿÿÿÉÓ½ÿÿÿÿËŠðÿÿÿÿË|@ÿÿÿÿÒ;>ðÿÿÿÿÓ‹{€ÿÿÿÿÔB­ðÿÿÿÿÕE"ÿÿÿÿÖL¿ðÿÿÿÿ×<¿ÿÿÿÿØfpÿÿÿÿÙò€ÿÿÿÿÙA|ðºR i› ~„ !I}"g¡ #)_$Gƒ %|&'e &ò^(G (Ò@q×~p€LMTCDTCST CST-8 NSTimeZones/zones/Asia/Riyadh0000644000175000017500000000020514353032552016223 0ustar richardrichardTZif2TZif2ÿÿÿÿÕ6´+Ì*0LMT+03 <+03>-3 NSTimeZones/zones/Asia/Nicosia0000644000175000017500000000112514353032552016372 0ustar richardrichardTZif2TZif21 ÿÿÿÿ¥w¸ í¯à Ý’Ð údà ¾ÆP ¤9`ŠáЄ`uOÐcý`SàPMà3ÂP#Á`¤P£`ó†Pã…`ÓhPÃg`¼„ЬƒàœfÐŒeà|HÐ lGà!\*Ð"L)à#< Ð$, à%îÐ& íà' P'õ `(äíP)Ôì`*ÄÏP+´Î`,¤±P-”°`.„“P/t’`0duP1]®à2M‘Ð3=à4-sÐ5rà62xH*0 LMTEESTEET EET-2EEST,M3.5.0/3,M10.5.0/4 NSTimeZones/zones/Asia/Singapore0000644000175000017500000000040014353032552016727 0ustar richardrichardTZif2TZif2 ÿÿÿÿ~6S£ÿÿÿÿ†ƒ…£ÿÿÿÿºgNÿÿÿÿÀ ä`ÿÿÿÿʳå`ÿÿÿÿË‘_ÿÿÿÿÒHmð‘îa]a]bpg  g ix~p€LMTSMT+07+0720+0730+09+08 <+08>-8 NSTimeZones/zones/Asia/Krasnoyarsk0000644000175000017500000000134514353032552017320 0ustar richardrichardTZif2TZif2Aÿÿÿÿ¡ù òÿÿÿÿµ£á 'o¤£ù×€éÖÛ Ì[¼h°¬Y°œJ°Œ;°|,° l°!\°"Kÿ°#;ð°$+á°%Ò°& ð'ï0'ôà0(äß@)x‡@)ÔÂ0*ij0+´¤0,¤•0-”†0.„w0/th00dY01]„°2r_°3=f°4RA°5H°62#°6ý*°8@08Ý °9û"0:¼î°;Û0<¦ 0=ºæ0>…í0?šÈ0@eÏ0Aƒä°BE±0CcưD%“0EC¨°Fu0G#аGî‘°Il°IÎs°JãN°K®U°LÌk0MŽ7°TKå WT`p€bp bp p€LMT+06+08+07 <+07>-7 NSTimeZones/zones/Asia/Hong_Kong0000644000175000017500000000140714353032552016661 0ustar richardrichardTZif2TZif2Eÿÿÿÿ…icÿÿÿÿÊM10ÿÿÿÿÊÛ“0ÿÿÿÿËKqxÿÿÿÿÒ ÞÿÿÿÿÓk×€ÿÿÿÿÔ“X¸ÿÿÿÿÕB°8ÿÿÿÿÖs:¸ÿÿÿÿ×>A¸ÿÿÿÿØ.2¸ÿÿÿÿØù9¸ÿÿÿÿÚ¸ÿÿÿÿÚÙ¸ÿÿÿÿÛíö¸ÿÿÿÿܸý¸ÿÿÿÿÝÍØ¸ÿÿÿÿÞ¢8ÿÿÿÿß¶õ8ÿÿÿÿàü8ÿÿÿÿá–É(ÿÿÿÿâOi8ÿÿÿÿãv«(ÿÿÿÿä/K8ÿÿÿÿå_Ǩÿÿÿÿæ-8ÿÿÿÿç?©¨ÿÿÿÿçøI¸ÿÿÿÿ鋨ÿÿÿÿéØ+¸ÿÿÿÿêÿm¨ÿÿÿÿë¸ ¸ÿÿÿÿìßO¨ÿÿÿÿí—ï¸ÿÿÿÿîÈl(ÿÿÿÿïwѸÿÿÿÿð¨N(ÿÿÿÿñW³¸ÿÿÿÿòˆ0(ÿÿÿÿó@Ð8ÿÿÿÿôh(ÿÿÿÿõ ²8ÿÿÿÿöGô(ÿÿÿÿ÷%~8ÿÿÿÿøa(ÿÿÿÿù`8ÿÿÿÿùõC(ÿÿÿÿúåB8ÿÿÿÿûÞ_¨ÿÿÿÿüÎ^¸ÿÿÿÿý¾A¨ÿÿÿÿþ®@¸ÿÿÿÿÿž#¨Ž"¸~¨n¸]ç¨Mæ¸G(78&æ(ƒ=8 È( öÇ8 æª( Ö©8 ÆŒ(›98ol¨k p€~wˆ ~LMTHKTHKSTHKWTJST HKT-8 NSTimeZones/zones/Asia/Karachi0000644000175000017500000000041214353032552016345 0ustar richardrichardTZif2TZif2 ÿÿÿÿ‰~ü¤ÿÿÿÿÌ•2¨ÿÿÿÿÒt˜ÿÿÿÿݨà¨O«0<¯E°=Ÿ( HA 0I G IäÝ0Jì{ >ÜMX[h FPT`FPLMT+0530+0630+05PKSTPKT PKT-5 NSTimeZones/zones/Asia/Manila0000644000175000017500000000035614353032552016213 0ustar richardrichardTZif2TZif2 ÿÿÿÿáÜÿÿÿÿ{?ÿÿÿÿÁœô€ÿÿÿÿÂ0pÿÿÿÿËòçÿÿÿÿЩ%pÿÿÿÿâl9ÿÿÿÿâÕ¢ðuF€fzðÿÿðqp~p€~ LMTPDTPSTJST PST-8 NSTimeZones/zones/Asia/Bangkok0000644000175000017500000000023014353032552016355 0ustar richardrichardTZif2TZif2 ÿÿÿÿV¶…Äÿÿÿÿ¢jgÄ^<^<bpLMTBMT+07 <+07>-7 NSTimeZones/zones/Asia/Atyrau0000644000175000017500000000115014353032552016250 0ustar richardrichardTZif2TZif22ÿÿÿÿª“Pÿÿÿÿµ¤ PÎ0± ùó éò°Û' Ìw°¼„ЬuМfÐŒWÐ|HÐ l9Ð!\*Ð"LÐ#< Ð$+ýÐ%îÐ& ßÐ' P'ôüP(äû`)x£`)ÔÞP*ÄÏP+´ÀP,¤±P-”¢P.„“P/t„P0duP1] Ð2r{Ð3=‚Ð4R]Ð5dÐ62?Ð6ýFÐ8j`8Ý6à9ûL`:½à;Û.`<¦5`=»`>†`?šò`@eù`A„à0°*0FPT` T` FP8@LMT+03+05+06+04 <+05>-5 NSTimeZones/zones/Asia/Yerevan0000644000175000017500000000130414353032552016415 0ustar richardrichardTZif2TZif2>ÿÿÿÿªšHÿÿÿÿçÚ P'™ÀÎ0Í@ú°êÀÛ50Ì…À¼’ଃàœtàŒeà|Và lGà!\8à"L)à#<à$, à%üà& íà'`'õ `(å p)Ôúp*Äëp+´Üp,¤Íp-”¾p.„¯p/t p0d‘p3=à4Rkà5rà62Mà6ýTà8j`8Ý6à9ûL`:½à;Û.`<¦5`=»`>†`?šò`@eù`A„àBEÛ`CcðàD%½`ECÒàFŸ`G#´àGî»àI–àIÎàJãxàK®àLÌ•`MŽaàN¬w`)¸*0FP8@ 8@ LMT+03+05+04 <+04>-4 NSTimeZones/zones/Asia/Vientiane0000644000175000017500000000023014353032552016723 0ustar richardrichardTZif2TZif2 ÿÿÿÿV¶…Äÿÿÿÿ¢jgÄ^<^<bpLMTBMT+07 <+07>-7 NSTimeZones/zones/Asia/Macau0000644000175000017500000000142714353032552016040 0ustar richardrichardTZif2TZif2Gÿÿÿÿ…i[ŽÿÿÿÿËGuðÿÿÿÿËòÊàÿÿÿÿÌûºPÿÿÿÿÍÓþ`ÿÿÿÿÎ¥ÐÿÿÿÿÒazpÿÿÿÿÓxøpÿÿÿÿÔB­ðÿÿÿÿÕK«pÿÿÿÿÖtLðÿÿÿÿ×?SðÿÿÿÿØ/DðÿÿÿÿØøúpÿÿÿÿÚ ÕpÿÿÿÿÚØÜpÿÿÿÿÛí·pÿÿÿÿܸ¾pÿÿÿÿÝÎêðÿÿÿÿÞ¡Úðÿÿÿÿß¶µðÿÿÿÿà¼ðÿÿÿÿá–—ðÿÿÿÿâO)ðÿÿÿÿãvyðÿÿÿÿä/ ðÿÿÿÿå_–pÿÿÿÿæíðÿÿÿÿç?©¨ÿÿÿÿçøI¸ÿÿÿÿ鋨ÿÿÿÿéØ+¸ÿÿÿÿêÿm¨ÿÿÿÿë¸ ¸ÿÿÿÿìßO¨ÿÿÿÿí—ï¸ÿÿÿÿîÈl(ÿÿÿÿïwѸÿÿÿÿð¨N(ÿÿÿÿñW³¸ÿÿÿÿòˆ0(ÿÿÿÿó@Ð8ÿÿÿÿôh(ÿÿÿÿõ ²8ÿÿÿÿöGô(ÿÿÿÿ÷%~8ÿÿÿÿøSÿÿÿÿù`8ÿÿÿÿùõ5ÿÿÿÿúåB8ÿÿÿÿûÞ_¨ÿÿÿÿüÎ^¸ÿÿÿÿý¾A¨ÿÿÿÿþ®@¸ÿÿÿÿÿž#¨Ž"¸~¨n¸]ç¨Mæ¸G(78&æ(ƒ=8 È( öÇ8 æª( Ö©8 ÆŒ(›98ol¨jrp€Œ ~ ~LMTCST+10+09CDT CST-8 NSTimeZones/zones/Asia/Thimphu0000644000175000017500000000023214353032552016421 0ustar richardrichardTZif2TZif2ÿÿÿÿÕæt!aM¨T MXT` LMT+0530+06 <+06>-6 NSTimeZones/zones/Asia/Shanghai0000644000175000017500000000061114353032552016526 0ustar richardrichardTZif2TZif2 ÿÿÿÿ~6C)ÿÿÿÿ —¢€ÿÿÿÿ¡yðÿÿÿÿÈY^€ÿÿÿÿÉ ùpÿÿÿÿÉÓ½ÿÿÿÿËŠðÿÿÿÿË|@ÿÿÿÿÒ;>ðÿÿÿÿÓ‹{€ÿÿÿÿÔB­ðÿÿÿÿÕE"ÿÿÿÿÖL¿ðÿÿÿÿ×<¿ÿÿÿÿØfpÿÿÿÿÙò€ÿÿÿÿÙA|ðºR i› ~„ !I}"g¡ #)_$Gƒ %|&'e &ò^(G (Ò@q×~p€LMTCDTCST CST-8 NSTimeZones/zones/Asia/Damascus0000644000175000017500000000232214353032552016545 0ustar richardrichardTZif2TZif2yÿÿÿÿ¡ò«xÿÿÿÿ¢/€ÿÿÿÿ£^pÿÿÿÿ¤a€ÿÿÿÿ¥>pÿÿÿÿ¦@ó€ÿÿÿÿ§apÿÿÿÿ¨ Õ€ÿÿÿÿ©}ðÿÿÿÿñRÿÿÿÿò[œpÿÿÿÿós(€ÿÿÿÿô;~pÿÿÿÿõU­€ÿÿÿÿöTðÿÿÿÿ÷6áÿÿÿÿ÷ÿ6ðÿÿÿÿùÚÿÿÿÿùá»ðÿÿÿÿúùHÿÿÿÿûÂïpÿÿÿÿüÛÍÿÿÿÿý¥tpÿÿÿÿþ½€ÿÿÿÿÿ†§ðž4gÛpg€Iðaì€+“ðC  Çp$S€íúð ‡ Ï.p è ±³p É?€kYðªsLpôÅÛmp×J½òpU#Šåp Gz!‰ð"â`41hP5Ä`6›Ð7šà7óÏP8åà9ÖTP:ÆS`;·‡Ð<§†à=˜»P>ˆº`?yîÐ@k?`A\sÐBLràC=§PD-¦`EýPF 6àG*>PGõS`I qÐIËúàJêPKµ`LÉäPM”ù`N©ÆPOtÛ`P‰¨PQT½`RiŠPS4Ÿ`TR¦ÐU`V2ˆÐVôc`XjÐXÝàYòLÐZ½aà[Ò.Ð\Cà]²Ð^}%à_›-P`]àa{Pb<éàcZñP"*0 *0 LMTEESTEET+03 <+03>-3 NSTimeZones/zones/Asia/Sakhalin0000644000175000017500000000136314353032552016543 0ustar richardrichardTZif2TZif2Bÿÿÿÿ†ð͸ÿÿÿÿÒ0²ð'7PkÀjÐùŸ@éžPÚÒÀÌ#P¼0p¬!pœpŒp{ôp kåp![Öp"KÇp#;¸p$+©p%šp& ‹p'¶ð'ô§ð(ä§)xO)Ô‰ð*Äzð+´kð,¤\ð-”Mð.„>ð/t/ð0d ð1]Lp2r'p3=.p4R€5€61ù€6ý€88Üâ€9úø:¼Ä€;ÚÚ<¥á=º¼>…Ã?šž@e¥Aƒº€BE‡Ccœ€D%iEC~€FKG#`€Gîg€IB€IÎI€Jã$€K®+€LÌAMŽ €TKºðVö²…È~¨Àš° š° Œ LMT+09+12+11+10 <+11>-11 NSTimeZones/zones/Asia/Ujung_Pandang0000644000175000017500000000027614353032552017533 0ustar richardrichardTZif2TZif2ÿÿÿÿ¡ò]ÿÿÿÿºÕÿÿÿÿˈ€ÿÿÿÿÒVîpoðoðp€~ p€LMTMMT+08+09WITA WITA-8 NSTimeZones/zones/Asia/Almaty0000644000175000017500000000114114353032552016232 0ustar richardrichardTZif2TZif23ÿÿÿÿª{Üÿÿÿÿµ£ï0'} ²± ùåéä ÛÌi ¼vÀ¬gÀœXÀŒIÀ|:À l+À!\À"L À#;þÀ$+ïÀ%àÀ& ÑÀ'ý@'ôî@(äíP)x•P)ÔÐ@*ÄÁ@+´²@,¤£@-””@.„…@/tv@0dg@1]’À2rmÀ3=tÀ4ROÀ5VÀ621À6ý8À8N@8ÝÀ9û0@:¼üÀ;Û@<¦@=ºô@>…û@?šÖ@@eÝ@AƒòÀH$FPbpT` T` LMT+05+07+06 <+06>-6 NSTimeZones/zones/Asia/Baghdad0000644000175000017500000000116614353032552016324 0ustar richardrichardTZif2TZif26ÿÿÿÿi†±Üÿÿÿÿž0<à0hPúÀè½PÛC@̓нÈ@­ÇPœtàŒeà|Và lGà!\8à"L)à#<à$, à%üà& íà'`'öx(纀)Øý*Ê?€+º0€,«s-›d.Œ¦€/|—€0mÚ1_€2P_3@P41’€5!ƒ€6Æ7·7óù€8å<9Ö~€:Æo€;·²<§£=˜å€>ˆÖ€?z@k[€A\žBLC=Ñ€D-€EFöG8€)¤) *08@ LMTBMT+03+04 <+03>-3 NSTimeZones/zones/Asia/Samarkand0000644000175000017500000000055614353032552016715 0ustar richardrichardTZif2TZif2ÿÿÿÿª…7ÿÿÿÿµ£ý@'‹°À ± ùó éò°Û' Ìw°¼„ЬuМfÐŒWÐ|HÐ l9Ð!\*Ð"LÐ#< Ð$+ýÐ%îÐ& ßÐ' P'ôüP(äíP>É8@FPT` T` LMT+04+05+06 <+05>-5 NSTimeZones/zones/Asia/Kashgar0000644000175000017500000000020514353032552016363 0ustar richardrichardTZif2TZif2ÿÿÿÿ°þºdRT`LMT+06 <+06>-6 NSTimeZones/zones/Asia/Gaza0000644000175000017500000000235214353032552015672 0ustar richardrichardTZif3TZif3xÿÿÿÿ}½J°ÿÿÿÿÈYÏÿÿÿÿÈú¦ÿÿÿÿÉ8œ€ÿÿÿÿÌåë€ÿÿÿÿͬþÿÿÿÿÎÇÿÿÿÿσÿÿÿÿЩ¤ÿÿÿÿÑ„}ÿÿÿÿҊ׀ÿÿÿÿÓe°€ÿÿÿÿÔl ÿÿÿÿè6c`ÿÿÿÿèô-Pÿÿÿÿê ¹`ÿÿÿÿêÕ`ÐÿÿÿÿëìúðÿÿÿÿìµmÿÿÿÿíÏðÿÿÿÿî—òÿÿÿÿï°³pÿÿÿÿðy%€ÿÿÿÿñ‘æðÿÿÿÿòZYÿÿÿÿóspÿÿÿÿô;Œ€ÿÿÿÿõUŸpÿÿÿÿö€ÿÿÿÿ÷6Òðÿÿÿÿ÷ÿEÿÿÿÿùpÿÿÿÿùáÊÿÿÿÿúù9ðÿÿÿÿû'BP|‹àý°Ð öê` ¦3Ðéü`![`úÆ`Žn`¾øàw|ÐÌÿ``™P ‚±`!IµÐ"^žà# ]P$Z0`%?P& íà&ÖæÐ'ëÏà(ÀP)Ôì`*©Ð+»eà,‰Ð-›Gà._©P/{)à0HÅÐ0çà1dF`2AÂ`3D(`4!¤`5$ `6†`7a`8DP8ÿ}à9ï`Ð:ß_à;ÏBÐ<¿Aà=¯$Ð>Ÿ#à?Ð@àA\àB^çàCA·ðD-¦`EýPFÙàFèopGìàH·ÐIËúàJ <`K­.œLa½ÐM”ùœN5ÂPOtÛ`P[‘àQT½`RD PS4Ÿ`TIlPUÒàV)\`VõÂðXÊ`XÕ¤ðYó¬`Zµ†ð[ÓŽ`\Cà]³bP^~w`_“R``^Y`a{`b?Œàc\^ð P*0 *0  LMTEESTEETIDTIST EET-2EEST,M3.4.4/50,M10.4.4/50 NSTimeZones/zones/Asia/Yakutsk0000644000175000017500000000134514353032552016444 0ustar richardrichardTZif2TZif2Aÿÿÿÿ¡Ûê^ÿÿÿÿµ£Å'Sp‡à†ðù»`éºpÚîàÌ?p¼L¬=œ.Œ| l![ò"Kã#;Ô$+Å%¶& §'Ó'ôÄ(äà )xk )Ô¦*Ä—+´ˆ,¤y-”j.„[/tL0d=1]h2rC3=J4R%5,626ý8$8Üð9û:¼Ò;Úè<¥ï=ºÊ>…Ñ?š¬@e³AƒÈBE•CcªD%wECŒFYG#nGîuIPIÎWJã2K®9LÌOMŽTKÉy¢p€Œ ~ ~ Œ LMT+08+10+09 <+09>-9 NSTimeZones/zones/Asia/Phnom_Penh0000644000175000017500000000023014353032552017034 0ustar richardrichardTZif2TZif2 ÿÿÿÿV¶…Äÿÿÿÿ¢jgÄ^<^<bpLMTBMT+07 <+07>-7 NSTimeZones/zones/Asia/Colombo0000644000175000017500000000036714353032552016406 0ustar richardrichardTZif2TZif2ÿÿÿÿV¶™$ÿÿÿÿ‡½ÿÿÿÿËZ(ÿÿÿÿÌ•+ ÿÿÿÿÒu€81¦(2q D?ê(JÜJäMXT`[h[hT`LMTMMT+0530+06+0630 <+0530>-5:30 NSTimeZones/zones/Asia/Aqtau0000644000175000017500000000113614353032552016062 0ustar richardrichardTZif2TZif22ÿÿÿÿª”àÿÿÿÿµ£ý@Î0± ùó éò°Û' Ìw°¼„ЬuМfÐŒWÐ|HÐ l9Ð!\*Ð"LÐ#< Ð$+ýÐ%îÐ& ßÐ' P'ôüP(äû`)x£`)ÔÞP*ÄÏP+´ÀP,¤±P-”¢P.„“P/t’`0dƒ`1]®à2r‰à3=à4Rkà5rà62Mà6ýTà8j`8Ý6à9ûL`:½à;Û.`<¦5`=»`>†`?šò`@eù`A„à/ 8@FPT` T` FPLMT+04+05+06 <+05>-5 NSTimeZones/zones/Asia/Hebron0000644000175000017500000000237414353032552016231 0ustar richardrichardTZif3TZif3zÿÿÿÿ}½JÿÿÿÿÈYÏÿÿÿÿÈú¦ÿÿÿÿÉ8œ€ÿÿÿÿÌåë€ÿÿÿÿͬþÿÿÿÿÎÇÿÿÿÿσÿÿÿÿЩ¤ÿÿÿÿÑ„}ÿÿÿÿҊ׀ÿÿÿÿÓe°€ÿÿÿÿÔl ÿÿÿÿè6c`ÿÿÿÿèô-Pÿÿÿÿê ¹`ÿÿÿÿêÕ`ÐÿÿÿÿëìúðÿÿÿÿìµmÿÿÿÿíÏðÿÿÿÿî—òÿÿÿÿï°³pÿÿÿÿðy%€ÿÿÿÿñ‘æðÿÿÿÿòZYÿÿÿÿóspÿÿÿÿô;Œ€ÿÿÿÿõUŸpÿÿÿÿö€ÿÿÿÿ÷6Òðÿÿÿÿ÷ÿEÿÿÿÿùpÿÿÿÿùáÊÿÿÿÿúù9ðÿÿÿÿû'BP|‹àý°Ð öê` ¦3Ðéü`![`úÆ`Žn`¾øàw|ÐÌÿ``™P ‚±`!IµÐ"^žà# ]P$Z0`%?P& íà&ÖæÐ'ëÏà(ÀP)Ôì`*©Ð+»eà,‰Ð-›Gà._©P/{)à0HÅÐ0çà1dF`2AÂ`3D(`4!¤`5$ `6†`7a`8DP8ÿ}à9ï`Ð:ß_à;ÏBÐ<¿Aà=¯$Ð>Ÿ#à?Ð@àA\àB^çàCA·ðD-¦`EýPFÙàFèopGìàH»PIËúàJ <`K«ÜàLa½ÐM”ùœN5ÂPN\ àN„ÜPOtÛ`P[‘àQT½`RD PS4Ÿ`TIlPUÒàV)\`VõÂðXÊ`XÕ¤ðYó¬`Zµ†ð[ÓŽ`\Cà]³bP^~w`_“R``^Y`a{`b?Œàc\^ð ç*0 *0  LMTEESTEETIDTIST EET-2EEST,M3.4.4/50,M10.4.4/50 NSTimeZones/zones/Asia/Dhaka0000644000175000017500000000034714353032552016022 0ustar richardrichardTZif2TZif2ÿÿÿÿi††¼ÿÿÿÿÊÛ†°ÿÿÿÿÌqÿÿÿÿÌ•2¨ÿÿÿÿݨҘJ;ÄK<ØTÄRÐ[hMXT`bpLMTHMT+0630+0530+06+07 <+06>-6 NSTimeZones/zones/Asia/Pontianak0000644000175000017500000000036714353032552016740 0ustar richardrichardTZif2TZif2ÿÿÿÿ‹ÿŽÿÿÿÿºßÿÿÿÿËy¤ÿÿÿÿÒVîpÿÿÿÿ×<ÆÿÿÿÿÚÿ&ÿÿÿÿôµ¾ˆ!Út€f€f€ix~p€p€bpLMTPMT+0730+09+08WITAWIB WIB-7 NSTimeZones/zones/Asia/Novosibirsk0000644000175000017500000000136114353032552017317 0ustar richardrichardTZif2TZif2Cÿÿÿÿ¡Û$ÿÿÿÿµ£á 'o¤£ù×€éÖÛ Ì[¼h°¬Y°œJ°Œ;°|,° l°!\°"Kÿ°#;ð°$+á°%Ò°& ð'ï0'ôà0(äß@)x‡@)ÔÂ0*ij0+´¤0+þN,¤£@-””@.„…@/tv@0dg@1]’À2rmÀ3=tÀ4ROÀ5VÀ621À6ý8À8N@8ÝÀ9û0@:¼üÀ;Û@<¦@=ºô@>…û@?šÖ@@eÝ@AƒòÀBE¿@CcÔÀD%¡@EC¶ÀFƒ@G#˜ÀGîŸÀIzÀIÎÀJã\ÀK®cÀLÌy@MŽEÀTKó0W“ÌÀM¼T`p€bp bp LMT+06+08+07 <+07>-7 NSTimeZones/zones/Asia/Harbin0000644000175000017500000000061114353032552016207 0ustar richardrichardTZif2TZif2 ÿÿÿÿ~6C)ÿÿÿÿ —¢€ÿÿÿÿ¡yðÿÿÿÿÈY^€ÿÿÿÿÉ ùpÿÿÿÿÉÓ½ÿÿÿÿËŠðÿÿÿÿË|@ÿÿÿÿÒ;>ðÿÿÿÿÓ‹{€ÿÿÿÿÔB­ðÿÿÿÿÕE"ÿÿÿÿÖL¿ðÿÿÿÿ×<¿ÿÿÿÿØfpÿÿÿÿÙò€ÿÿÿÿÙA|ðºR i› ~„ !I}"g¡ #)_$Gƒ %|&'e &ò^(G (Ò@q×~p€LMTCDTCST CST-8 NSTimeZones/zones/Asia/Anadyr0000644000175000017500000000134714353032552016231 0ustar richardrichardTZif2TZif2@ÿÿÿÿªœÿÿÿÿµ£ŒÀ'0O N°ù‘0é@ÚİÌ@¼"`¬`œ`‹õ`{æ` k×`![È`"K¹`#;ª`$+›`%Œ`& }`'¨à'ô™à(ä˜ð)x@ð)Ô{à*Älà+´]à,¤Nà-”?à.„0à/t!à0dà1]>`2r`3= `4Qû`5`61Ý`6üä`8ùà8ÜÆ`9úÛà:¼¨`;Ú½à<¥Äà=ºŸà>…¦à?šà@eˆàAƒž`BEjàCc€`D%LàECb`F.àG#D`GîK`I&`IÎ-`Jã`K®`LÌ2ðMÿp¦d¨ÀÄà¶Ð ¶Ð ¨Àš°LMT+12+14+13+11 <+12>-12 NSTimeZones/zones/Asia/Oral0000644000175000017500000000116114353032552015702 0ustar richardrichardTZif2TZif23ÿÿÿÿª“Üÿÿÿÿµ¤ P'‹°À ± ùó éò°Û' Ìw°¼„ЬuМfÐŒWÐ|HÐ l9Ð!\*Ð"LÐ#< Ð$+ýÐ%üà& íà'`'õ `(äû`)x£`)ÔÞP*ÄÝ`+´Î`,¤¿`-”°`.„¡`/t’`0dƒ`1]®à2r‰à3=à4Rkà5rà62Mà6ýTà8j`8Ý6à9ûL`:½à;Û.`<¦5`=»`>†`?šò`@eù`A„à0$*0FPT` T` FP8@LMT+03+05+06+04 <+05>-5 NSTimeZones/zones/Asia/Srednekolymsk0000644000175000017500000000134614353032552017644 0ustar richardrichardTZif2TZif2Aÿÿÿÿª3äÿÿÿÿµ£¨à'7PkÀjÐùŸ@éžPÚÒÀÌ#P¼0p¬!pœpŒp{ôp kåp![Öp"KÇp#;¸p$+©p%šp& ‹p'¶ð'ô§ð(ä§)xO)Ô‰ð*Äzð+´kð,¤\ð-”Mð.„>ð/t/ð0d ð1]Lp2r'p3=.p4R p5p61ëp6üòp8ð8ÜÔp9úéð:¼¶p;ÚËð<¥Òð=º­ð>…´ð?šð@e–ðAƒ¬pBExðCcŽpD%ZðECppF<ðG#RpGîYpI4pIÎ;pJãpK®pLÌ2ðMÿpTK¬àŒ ¨Àš° š° ¨ÀLMT+10+12+11 <+11>-11 NSTimeZones/zones/Asia/Khandyga0000644000175000017500000000140714353032552016536 0ustar richardrichardTZif2TZif2Cÿÿÿÿ¡Ûäëÿÿÿÿµ£Å'Sp‡à†ðù»`éºpÚîàÌ?p¼L¬=œ.Œ| l![ò"Kã#;Ô$+Å%¶& §'Ó'ôÄ(äà )xk )Ô¦*Ä—+´ˆ,¤y-”j.„[/tL0d=1]h2rC3=J4R%5,626ý8$8Üð9û:¼Ò;Úè<¥ï=ºÊ>…Ñ?š¬?òäp@e¥Aƒº€BE‡Ccœ€D%iEC~€FKG#`€Gîg€IB€IÎI€Jã$€K®+€LÌAMŽ €NnPTKÉp€Œ ~ ~ š°Œ š°LMT+08+10+09+11 <+09>-9 NSTimeZones/zones/Asia/Kuching0000644000175000017500000000050014353032552016371 0ustar richardrichardTZif2TZif2ÿÿÿÿ­ŠÿÿÿÿºgGˆÿÿÿÿ¿{'€ÿÿÿÿ¿óPÿÿÿÿÁ]¬€ÿÿÿÿÁÕ PÿÿÿÿÃ>àÿÿÿÿöÓÐÿÿÿÿÅ €ÿÿÿÿŘPÿÿÿÿÇGÿÿÿÿÇy:ÐÿÿÿÿÈãÌÿÿÿÿÉ[¿ÐÿÿÿÿÊÄÿ€ÿÿÿÿË<óPÿÿÿÿË‘XÿÿÿÿÒHmðgpixu0 p€~LMT+0730+0820+08+09 <+08>-8 NSTimeZones/zones/Asia/Choibalsan0000644000175000017500000000115314353032552017051 0ustar richardrichardTZif2TZif23ÿÿÿÿ†Óç( ÜéÈ€ÚîàÌ?p¼"`¬!pœ`Œp{æ` kåp![È`"KÇp#;ª`$+©p%Œ`& ‹p'¨à'ô§ð(äŠà)Ô‰ð*Älà+´kð,¤Nà-”Mð.„0à/t/ð0dà1]Lp2M/`3=.p4-`5p6 ó`:é¥;´ž€<¤=”€€>„?tb€@daATD€BDCC4&€D$%ECGïªðUš VapVõ| WåCpkXbpp€~ Œ ~ LMT+07+08+09+10 <+08>-8 NSTimeZones/zones/Asia/Tashkent0000644000175000017500000000055614353032552016575 0ustar richardrichardTZif2TZif2ÿÿÿÿªƒ ÿÿÿÿµ£ï0'} ²± ùåéä ÛÌi ¼vÀ¬gÀœXÀŒIÀ|:À l+À!\À"L À#;þÀ$+ïÀ%àÀ& ÑÀ'ý@'ôî@(äíP@÷FPbpT` T` LMT+05+07+06 <+05>-5 NSTimeZones/zones/Asia/Ulan_Bator0000644000175000017500000000112214353032552017030 0ustar richardrichardTZif2TZif22ÿÿÿÿ†ÓîL ÜéÈ€ÚüðÌM€¼0p¬/€œpŒ€{ôp kó€![Öp"KÕ€#;¸p$+·€%šp& ™€'¶ð'ô¶(ä˜ð)Ô˜*Äzð+´z,¤\ð-”\.„>ð/t>0d ð1]Z€2M=p3=<€4-p5€6 p:é³ ;´¬<¤« =”Ž>„ ?tp@do ATRBDQ C44D$3 EQUš VapVõ| WåCpd4bp~p€ LMT+07+09+08 <+08>-8 NSTimeZones/zones/Asia/Bishkek0000644000175000017500000000115214353032552016365 0ustar richardrichardTZif2TZif24ÿÿÿÿª~ÿÿÿÿµ£ï0'} ²± ùåéä ÛÌi ¼vÀ¬gÀœXÀŒIÀ|:À l+À!\À"L À#;þÀ$+ïÀ%àÀ& ÑÀ'ý@'ôî@(¾£À)ç70*Ä¥ +Ç0,¤‡ -¦û0.„i /†Ý00dK 1f¿02Mg 3=‰Ø4RVÈ5kØ628È6ýMØ8UH8Ý/Ø9û7H:½Ø;ÛH<¦.X=ºûH>†X?šÝH@eòXAƒùÈBEÔXBû’ EðFPbpT` T` LMT+05+07+06 <+06>-6 NSTimeZones/zones/Asia/Macao0000644000175000017500000000142714353032552016032 0ustar richardrichardTZif2TZif2Gÿÿÿÿ…i[ŽÿÿÿÿËGuðÿÿÿÿËòÊàÿÿÿÿÌûºPÿÿÿÿÍÓþ`ÿÿÿÿÎ¥ÐÿÿÿÿÒazpÿÿÿÿÓxøpÿÿÿÿÔB­ðÿÿÿÿÕK«pÿÿÿÿÖtLðÿÿÿÿ×?SðÿÿÿÿØ/DðÿÿÿÿØøúpÿÿÿÿÚ ÕpÿÿÿÿÚØÜpÿÿÿÿÛí·pÿÿÿÿܸ¾pÿÿÿÿÝÎêðÿÿÿÿÞ¡Úðÿÿÿÿß¶µðÿÿÿÿà¼ðÿÿÿÿá–—ðÿÿÿÿâO)ðÿÿÿÿãvyðÿÿÿÿä/ ðÿÿÿÿå_–pÿÿÿÿæíðÿÿÿÿç?©¨ÿÿÿÿçøI¸ÿÿÿÿ鋨ÿÿÿÿéØ+¸ÿÿÿÿêÿm¨ÿÿÿÿë¸ ¸ÿÿÿÿìßO¨ÿÿÿÿí—ï¸ÿÿÿÿîÈl(ÿÿÿÿïwѸÿÿÿÿð¨N(ÿÿÿÿñW³¸ÿÿÿÿòˆ0(ÿÿÿÿó@Ð8ÿÿÿÿôh(ÿÿÿÿõ ²8ÿÿÿÿöGô(ÿÿÿÿ÷%~8ÿÿÿÿøSÿÿÿÿù`8ÿÿÿÿùõ5ÿÿÿÿúåB8ÿÿÿÿûÞ_¨ÿÿÿÿüÎ^¸ÿÿÿÿý¾A¨ÿÿÿÿþ®@¸ÿÿÿÿÿž#¨Ž"¸~¨n¸]ç¨Mæ¸G(78&æ(ƒ=8 È( öÇ8 æª( Ö©8 ÆŒ(›98ol¨jrp€Œ ~ ~LMTCST+10+09CDT CST-8 NSTimeZones/zones/Asia/Aden0000644000175000017500000000020514353032552015652 0ustar richardrichardTZif2TZif2ÿÿÿÿÕ6´+Ì*0LMT+03 <+03>-3 NSTimeZones/zones/Asia/Qostanay0000644000175000017500000000114714353032552016610 0ustar richardrichardTZif2TZif23ÿÿÿÿªˆ\ÿÿÿÿµ£ý@'‹°À ± ùó éò°Û' Ìw°¼„ЬuМfÐŒWÐ|HÐ l9Ð!\*Ð"LÐ#< Ð$+ýÐ%îÐ& ßÐ' P'ôüP(äû`)x£`)ÔÞP*ÄÏP+´ÀP,¤±P-”¢P.„“P/t„P0duP1] Ð2r{Ð3=‚Ð4R]Ð5dÐ62?Ð6ýFÐ8\P8Ý(Ð9û>P:½ Ð;Û P<¦'P=»P>† P?šäP@eëPA„Ð;¤8@FPT` T` FPLMT+04+05+06 <+06>-6 NSTimeZones/zones/Asia/Barnaul0000644000175000017500000000136114353032552016373 0ustar richardrichardTZif2TZif2Cÿÿÿÿ¡Õ}üÿÿÿÿµ£á 'o¤£ù×€éÖÛ Ì[¼h°¬Y°œJ°Œ;°|,° l°!\°"Kÿ°#;ð°$+á°%Ò°& ð'ï0'ôà0(äß@)x‡@)ÔÂ0*ij0+´¤0,¤•0-”†0.„w0/th0/ÇL€0dg@1]’À2rmÀ3=tÀ4ROÀ5VÀ621À6ý8À8N@8ÝÀ9û0@:¼üÀ;Û@<¦@=ºô@>…û@?šÖ@@eÝ@AƒòÀBE¿@CcÔÀD%¡@EC¶ÀFƒ@G#˜ÀGîŸÀIzÀIÎÀJã\ÀK®cÀLÌy@MŽEÀTKó0Vöê@N„T`p€bp bp LMT+06+08+07 <+07>-7 NSTimeZones/zones/Asia/Baku0000644000175000017500000000135014353032552015667 0ustar richardrichardTZif2TZif2Bÿÿÿÿª•DÿÿÿÿçÚ P'™ÀÎ0Í@ú°êÀÛ50Ì…À¼’ଃàœtàŒeà|Và lGà!\8à"L)à#<à$, à%üà& íà'`'õ `(å p)Ôúp*Äëp1]Ù2r´3=­4Rˆ562j6ýq8†€8ÝS9ûh€:½5;ÛJ€<¦Q€=»,€>†3€?›€@f€A„+BE÷€Cd D%Ù€ECïF»€G#ÑGîØI³IκJã•K®œḺ€MŽ~N¬“€On`PŒu€QW|€RlW€S7^€TL9€U@€V,€.¼*0FP8@ 8@ LMT+03+05+04 <+04>-4 NSTimeZones/zones/Asia/Katmandu0000644000175000017500000000024114353032552016547 0ustar richardrichardTZif2TZif2ÿÿÿÿ¡ò}„0¨OüMXPÜ LMT+0530+0545 <+0545>-5:45 NSTimeZones/zones/Asia/Amman0000644000175000017500000000164014353032552016040 0ustar richardrichardTZif2TZif2Wÿÿÿÿ¶£ÖÐryà «P$7`íÞÐ jà ÏP çïà ÚuÐ É#`’ÊЩ`r¬Ð­Õ`Ÿ Ð’ý`‚àP rß`!bÂP"RÁ`#KÞÐ$d¼`%+ÀÐ&7o`' ¢Ð( sà(âJP)ä¾`*ËfÐ+»eà,«HÐ-›Gà.xµÐ/„d`0X¥à1dF`2AÂ`3D(`4!¤`5$ `6†`7z“`7ê¢à8â|à9Ó¿`:Â^à;³¡`<£’`=“ƒ`>ƒt`?˜O`@cV`AnöàBLràC-3 NSTimeZones/zones/Asia/Magadan0000644000175000017500000000135714353032552016344 0ustar richardrichardTZif2TZif2Bÿÿÿÿª6 ÿÿÿÿµ£¨à'7PkÀjÐùŸ@éžPÚÒÀÌ#P¼0p¬!pœpŒp{ôp kåp![Öp"KÇp#;¸p$+©p%šp& ‹p'¶ð'ô§ð(ä§)xO)Ô‰ð*Äzð+´kð,¤\ð-”Mð.„>ð/t/ð0d ð1]Lp2r'p3=.p4R p5p61ëp6üòp8ð8ÜÔp9úéð:¼¶p;ÚËð<¥Òð=º­ð>…´ð?šð@e–ðAƒ¬pBExðCcŽpD%ZðECppF<ðG#RpGîYpI4pIÎ;pJãpK®pLÌ2ðMÿpTK¬àWœ`Œ ¨Àš° š° ¨ÀLMT+10+12+11 <+11>-11 NSTimeZones/zones/Asia/Kuala_Lumpur0000644000175000017500000000040014353032552017401 0ustar richardrichardTZif2TZif2 ÿÿÿÿ~6S£ÿÿÿÿ†ƒ…£ÿÿÿÿºgNÿÿÿÿÀ ä`ÿÿÿÿʳå`ÿÿÿÿË‘_ÿÿÿÿÒHmð‘îa]a]bpg  g ix~p€LMTSMT+07+0720+0730+09+08 <+08>-8 NSTimeZones/zones/Asia/Ulaanbaatar0000644000175000017500000000112214353032552017215 0ustar richardrichardTZif2TZif22ÿÿÿÿ†ÓîL ÜéÈ€ÚüðÌM€¼0p¬/€œpŒ€{ôp kó€![Öp"KÕ€#;¸p$+·€%šp& ™€'¶ð'ô¶(ä˜ð)Ô˜*Äzð+´z,¤\ð-”\.„>ð/t>0d ð1]Z€2M=p3=<€4-p5€6 p:é³ ;´¬<¤« =”Ž>„ ?tp@do ATRBDQ C44D$3 EQUš VapVõ| WåCpd4bp~p€ LMT+07+09+08 <+08>-8 NSTimeZones/zones/Asia/Novokuznetsk0000644000175000017500000000132614353032552017530 0ustar richardrichardTZif2TZif2@ÿÿÿÿª Àÿÿÿÿµ£á 'o¤£ù×€éÖÛ Ì[¼h°¬Y°œJ°Œ;°|,° l°!\°"Kÿ°#;ð°$+á°%Ò°& ð'ï0'ôà0(äß@)x‡@)ÔÂ0*ij0+´¤0,¤•0-”†0.„w0/th00dY01]„°2r_°3=f°4RA°5H°62#°6ý*°8@08Ý °9û"0:¼î°;Û0<¦ 0=ºæ0>…í0?šÈ0@eÏ0Aƒä°BE±0CcưD%“0EC¨°Fu0G#аGî‘°Il°IÎs°JãN°K®U°LÌy@MŽEÀQÀT`p€bp bp LMT+06+08+07 <+07>-7 NSTimeZones/zones/GMT+120000644000175000017500000000017114353032552014775 0ustar richardrichardTZif2TZif2¨ÀGMT+12 -12 NSTimeZones/zones/MST0000644000175000017500000000015714353032552014577 0ustar richardrichardTZif2TZif2ÿÿMST MST7 NSTimeZones/zones/GMT+100000644000175000017500000000017114353032552014773 0ustar richardrichardTZif2TZif2Œ GMT+10 -10 NSTimeZones/zones/Libya0000644000175000017500000000065714353032552015201 0ustar richardrichardTZif2TZif2 ÿÿÿÿ¡òÁ$ÿÿÿÿÝ»±ÿÿÿÿÞ#­`ÿÿÿÿáxÒÿÿÿÿáçeàÿÿÿÿå/?pÿÿÿÿå©ÌàÿÿÿÿëNÆð’B`÷pú+àê*ðÛ_`̯ð½ä`´zðŸà“ p‚î` pJp!a~à"RÏp#Dà$4ð%%7`&@·ð2Nñ`3D6p45jàP™QTÙ€Ri´€ \   LMTCESTCETEET EET-2 NSTimeZones/zones/UTC0000644000175000017500000000015714353032552014567 0ustar richardrichardTZif2TZif2UTC UTC0 NSTimeZones/zones/GMT-130000644000175000017500000000017014353032552014777 0ustar richardrichardTZif2TZif2ÿÿI0GMT-13 13 NSTimeZones/zones/Hongkong0000644000175000017500000000140714353032552015705 0ustar richardrichardTZif2TZif2Eÿÿÿÿ…icÿÿÿÿÊM10ÿÿÿÿÊÛ“0ÿÿÿÿËKqxÿÿÿÿÒ ÞÿÿÿÿÓk×€ÿÿÿÿÔ“X¸ÿÿÿÿÕB°8ÿÿÿÿÖs:¸ÿÿÿÿ×>A¸ÿÿÿÿØ.2¸ÿÿÿÿØù9¸ÿÿÿÿÚ¸ÿÿÿÿÚÙ¸ÿÿÿÿÛíö¸ÿÿÿÿܸý¸ÿÿÿÿÝÍØ¸ÿÿÿÿÞ¢8ÿÿÿÿß¶õ8ÿÿÿÿàü8ÿÿÿÿá–É(ÿÿÿÿâOi8ÿÿÿÿãv«(ÿÿÿÿä/K8ÿÿÿÿå_Ǩÿÿÿÿæ-8ÿÿÿÿç?©¨ÿÿÿÿçøI¸ÿÿÿÿ鋨ÿÿÿÿéØ+¸ÿÿÿÿêÿm¨ÿÿÿÿë¸ ¸ÿÿÿÿìßO¨ÿÿÿÿí—ï¸ÿÿÿÿîÈl(ÿÿÿÿïwѸÿÿÿÿð¨N(ÿÿÿÿñW³¸ÿÿÿÿòˆ0(ÿÿÿÿó@Ð8ÿÿÿÿôh(ÿÿÿÿõ ²8ÿÿÿÿöGô(ÿÿÿÿ÷%~8ÿÿÿÿøa(ÿÿÿÿù`8ÿÿÿÿùõC(ÿÿÿÿúåB8ÿÿÿÿûÞ_¨ÿÿÿÿüÎ^¸ÿÿÿÿý¾A¨ÿÿÿÿþ®@¸ÿÿÿÿÿž#¨Ž"¸~¨n¸]ç¨Mæ¸G(78&æ(ƒ=8 È( öÇ8 æª( Ö©8 ÆŒ(›98ol¨k p€~wˆ ~LMTHKTHKSTHKWTJST HKT-8 NSTimeZones/zones/Indian/0000755000175000017500000000000014353032552015410 5ustar richardrichardNSTimeZones/zones/Indian/Chagos0000644000175000017500000000023014353032552016532 0ustar richardrichardTZif2TZif2 ÿÿÿÿ‰~÷œ0æÝ°CäFPT`LMT+05+06 <+06>-6 NSTimeZones/zones/Indian/Christmas0000644000175000017500000000023014353032552017263 0ustar richardrichardTZif2TZif2 ÿÿÿÿV¶…Äÿÿÿÿ¢jgÄ^<^<bpLMTBMT+07 <+07>-7 NSTimeZones/zones/Indian/Maldives0000644000175000017500000000023014353032552017072 0ustar richardrichardTZif2TZif2 ÿÿÿÿV¶Ÿÿÿÿÿí/ØDèDèFPLMTMMT+05 <+05>-5 NSTimeZones/zones/Indian/Kerguelen0000644000175000017500000000023014353032552017247 0ustar richardrichardTZif2TZif2 ÿÿÿÿV¶Ÿÿÿÿÿí/ØDèDèFPLMTMMT+05 <+05>-5 NSTimeZones/zones/Indian/Mahe0000644000175000017500000000020514353032552016202 0ustar richardrichardTZif2TZif2ÿÿÿÿ¡ò™¨3Ø8@LMT+04 <+04>-4 NSTimeZones/zones/Indian/Mauritius0000644000175000017500000000026314353032552017316 0ustar richardrichardTZif2TZif2 ÿÿÿÿ‰˜í@Ûr0I–àIÎÐ5èFP8@LMT+05+04 <+04>-4 NSTimeZones/zones/Indian/Reunion0000644000175000017500000000020514353032552016747 0ustar richardrichardTZif2TZif2ÿÿÿÿ¡ò™¨3Ø8@LMT+04 <+04>-4 NSTimeZones/zones/Indian/Mayotte0000644000175000017500000000027714353032552016763 0ustar richardrichardTZif2TZif2ÿÿÿÿ‹ÿÑüÿÿÿÿ±îÚXÿÿÿÿ´ÇàÐÿÿÿÿÁí­XÿÿÿÿÌlzÔ"„#(*0 &¬LMT+0230EAT+0245 EAT-3 NSTimeZones/zones/Indian/Comoro0000644000175000017500000000027714353032552016577 0ustar richardrichardTZif2TZif2ÿÿÿÿ‹ÿÑüÿÿÿÿ±îÚXÿÿÿÿ´ÇàÐÿÿÿÿÁí­XÿÿÿÿÌlzÔ"„#(*0 &¬LMT+0230EAT+0245 EAT-3 NSTimeZones/zones/Indian/Antananarivo0000644000175000017500000000027714353032552017762 0ustar richardrichardTZif2TZif2ÿÿÿÿ‹ÿÑüÿÿÿÿ±îÚXÿÿÿÿ´ÇàÐÿÿÿÿÁí­XÿÿÿÿÌlzÔ"„#(*0 &¬LMT+0230EAT+0245 EAT-3 NSTimeZones/zones/Indian/Cocos0000644000175000017500000000027314353032552016403 0ustar richardrichardTZif2TZif2ÿÿÿÿV¶‰Ñÿÿÿÿ¡òsQÿÿÿÿËòüÿÿÿÿÑšgðZ/Z/[h~LMTRMT+0630+09 <+0630>-6:30 NSTimeZones/zones/Canada/0000755000175000017500000000000014353032552015355 5ustar richardrichardNSTimeZones/zones/Canada/Mountain0000644000175000017500000000171214353032552017073 0ustar richardrichardTZif2TZif2YÿÿÿÿˆÞÎàÿÿÿÿž¸¯ÿÿÿÿŸ»€ÿÿÿÿ ˜‘ÿÿÿÿ Ò…€ÿÿÿÿ¢Šèÿÿÿÿ£„ÿÿÿÿ¤jÊÿÿÿÿ¥5Àÿÿÿÿ¦Sçÿÿÿÿ§¥€ÿÿÿÿ¨3Éÿÿÿÿ¨þÂÿÿÿÿˉ ÿÿÿÿÒ#ôpÿÿÿÿÒaÿÿÿÿÕUãÿÿÿÿÖ ÜaPü€@û0Þ€ Ý À€ ¿ 𢀠ࡠٿ Àƒ¹¡© ™ƒ‰‚yeidYGIF9))("E€ '€ò&â €ÒÁ뀱ê¡Í€ v!¯€"Uÿ#jÌ$5á%J®&Ã'*'þß) r)ÞÁ*êT+¾£,Óp€-ž….³R€/~g0“4€1g„2s€3Gf4Rø€5'H62Ú€7*8÷8ç 9ûÙ:Æî;Û»<° =»>ì?›@oÎA„›€BO°Cd}€D/’ED_€EóÅÿÿ• ÿÿ« ÿÿÿÿ«  ÿÿ« LMTMDTMSTMWTMPT MST7MDT,M3.2.0,M11.1.0 NSTimeZones/zones/Canada/Atlantic0000644000175000017500000000321014353032552017033 0ustar richardrichardTZif2TZif2§ÿÿÿÿ€ñ« ÿÿÿÿšäÞÀÿÿÿÿ›Ö0ÿÿÿÿž¸…`ÿÿÿÿŸºÝPÿÿÿÿ¢@ÿÿÿÿ£0±0ÿÿÿÿ¤zV@ÿÿÿÿ¥0ÿÿÿÿ¦S Àÿÿÿÿ¦üR°ÿÿÿÿ¨<½@ÿÿÿÿ¨Ü4°ÿÿÿÿªŸ@ÿÿÿÿªÍ:0ÿÿÿÿ«ü@ÿÿÿÿ¬¿‘0ÿÿÿÿ­îØ@ÿÿÿÿ®Œþ0ÿÿÿÿ¯¼E@ÿÿÿÿ°U0ÿÿÿÿ±®œ@ÿÿÿÿ²Kp°ÿÿÿÿ³Ž~@ÿÿÿÿ´$»0ÿÿÿÿµn`@ÿÿÿÿ¶À°ÿÿÿÿ·NB@ÿÿÿÿ¸°ÿÿÿÿ¹$éÀÿÿÿÿ¹çù°ÿÿÿÿ»ËÀÿÿÿÿ»Ñ0ÿÿÿÿ½]@ÿÿÿÿ½1°ÿÿÿÿ¾ò´@ÿÿÿÿ¿Ú0ÿÿÿÿÀÓçÀÿÿÿÿÁ^G0ÿÿÿÿÂŽ@ÿÿÿÿÃPž0ÿÿÿÿÄmp@ÿÿÿÿÅ0€0ÿÿÿÿÆr<@ÿÿÿÿÇb0ÿÿÿÿÈ6nÀÿÿÿÿÈù~°ÿÿÿÿÊPÀÿÿÿÿÊÙ`°ÿÿÿÿˈâ`ÿÿÿÿÒ#ôpÿÿÿÿÒ`íÐÿÿÿÿÓuÖàÿÿÿÿÔ@ÏÐÿÿÿÿÕU¸àÿÿÿÿÖ ±Ðÿÿÿÿ×5šàÿÿÿÿØ“ÐÿÿÿÿÙ|àÿÿÿÿÙàuÐÿÿÿÿÜÞ{`ÿÿÿÿÝ©tPÿÿÿÿÞ¾]`ÿÿÿÿ߉VPÿÿÿÿàž?`ÿÿÿÿái8Pÿÿÿÿâ~!`ÿÿÿÿãIPÿÿÿÿæGàÿÿÿÿçÐÿÿÿÿè'àÿÿÿÿèñúÐÿÿÿÿêãàÿÿÿÿêÑÜÐÿÿÿÿëæÅàÿÿÿÿì±¾Ðÿÿÿÿñ¦`ÿÿÿÿò‰Pÿÿÿÿóoˆ`ÿÿÿÿô_kPÿÿÿÿõOj`ÿÿÿÿö?MPÿÿÿÿ÷/L`ÿÿÿÿø(iÐÿÿÿÿù.`ÿÿÿÿúKÐÿÿÿÿúøJàÿÿÿÿûè-ÐÿÿÿÿüØ,àÿÿÿÿýÈÐÿÿÿÿþ¸àÿÿÿÿÿ§ñЗðà‡ÓÐwÒàpðP`ï`PÒP@Ñ`0´P ³` –P •` ðxP àw` ٔРÀY`¹vЩuà™XЉWày:Ði9àYÐIà8þÐ(ýà"PßàýPñü`áßPÑÞ`ÁÁP±À`¡£P uòà!…P"UÔà#j¡Ð$5¶à%JƒÐ&˜à'*eÐ'þµ`) GÐ)Þ—`*ê)Ð+¾y`,ÓFP-ž[`.³(P/~=`0“ P1gYà2rìP3G;à4RÎP5'à62°P7ÿà8ÌÐ8æáà9û®Ð:ÆÃà;ÛÐ<¯à`=»rÐ>Â`?›TÐ@o¤`A„qPBO†`CdSPD/h`ED5PEóšàÿÿÄ`ÿÿÕÐÿÿÇÀÿÿÕÐ ÿÿÕÐLMTADTASTAWTAPT AST4ADT,M3.2.0,M11.1.0 NSTimeZones/zones/Canada/Yukon0000644000175000017500000000200514353032552016402 0ustar richardrichardTZif2TZif2] %ÿÿÿÿ}†Šœÿÿÿÿž¸Ë°ÿÿÿÿŸ»# ÿÿÿÿ Ð °ÿÿÿÿ¡¢Ò€ÿÿÿÿˉ(°ÿÿÿÿÒ#ôpÿÿÿÿÒa4 ÿÿÿÿ÷/vÿÿÿÿø(¢ÿÿÿÿøÅ„ir YUIT 97)6 "S  5ò4 âÒ Áù±ø ¡Û v+ !½"V #jÚ$5ï %J¼&Ñ '*ž'þí ) €)ÞÏ *êb+¾± ,Ó~-ž“ .³`/~u 0“B1g’ 2s$3Gt 4S5'V 62è78 88ç 9ûç:Æü ;ÛÉ<° =»«>ú ?›@oÜ A„©BO¾ Cd‹D/  EDmEóÓ G-ŠGÓµ I lI³— JíNKœ³ LÖjM|• N¶LO\w P–.QÐp?›bà@o²pA„`BO”pCda`D/vpEDC`Eó¨ðÿÿµ”ÿÿÇÀÿÿ¹°ÿÿÇÀ ÿÿÇÀLMTEDTESTEWTEPT EST5EDT,M3.2.0,M11.1.0 NSTimeZones/zones/Canada/Pacific0000644000175000017500000000246214353032552016642 0ustar richardrichardTZif2TZif2ÿÿÿÿ^=vìÿÿÿÿž¸½ ÿÿÿÿŸ»ÿÿÿÿˉ ÿÿÿÿÒ#ôpÿÿÿÿÒa&ÿÿÿÿÓv ÿÿÿÿÔAÿÿÿÿÕUñ ÿÿÿÿÖ êÿÿÿÿ×5Ó ÿÿÿÿØÌÿÿÿÿÙµ ÿÿÿÿÙà®ÿÿÿÿÚþÑ ÿÿÿÿÛÀÿÿÿÿÜÞ³ ÿÿÿÿÝ©¬ÿÿÿÿÞ¾• ÿÿÿÿ߉Žÿÿÿÿàžw ÿÿÿÿáipÿÿÿÿâ~Y ÿÿÿÿãIRÿÿÿÿä^; ÿÿÿÿå)4ÿÿÿÿæGX ÿÿÿÿçQÿÿÿÿè': ÿÿÿÿèò3ÿÿÿÿê ÿÿÿÿêÒÿÿÿÿëæþ ÿÿÿÿì±÷ÿÿÿÿíÆà ÿÿÿÿî‘Ùÿÿÿÿï¯ü ÿÿÿÿðq»ÿÿÿÿñÞ ÿÿÿÿòÁÿÿÿÿóoÀ ÿÿÿÿô_£ÿÿÿÿõO¢ ÿÿÿÿö?…ÿÿÿÿ÷/„ ÿÿÿÿø(¢ÿÿÿÿùf ÿÿÿÿú„ÿÿÿÿúøƒ ÿÿÿÿûèfÿÿÿÿüØe ÿÿÿÿýÈHÿÿÿÿþ¸G ÿÿÿÿÿ¨*˜) ˆ x q(a' Q A  0ì ë  Î Í  ð° ௠ ÙÍ À‘ ¹¯©® ™‘‰ ysir YUIT 97)6 "S  5ò4 âÒ Áù±ø ¡Û v+ !½"V #jÚ$5ï %J¼&Ñ '*ž'þí ) €)ÞÏ *êb+¾± ,Ó~-ž“ .³`/~u 0“B1g’ 2s$3Gt 4S5'V 62è78 88ç 9ûç:Æü ;ÛÉ<° =»«>ú ?›@oÜ A„©BO¾ Cd‹D/  EDmEóÓ ÿÿŒ”ÿÿÿÿ€ÿÿ ÿÿLMTPDTPSTPWTPPT PST8PDT,M3.2.0,M11.1.0 NSTimeZones/zones/Canada/Newfoundland0000644000175000017500000000352614353032552017732 0ustar richardrichardTZif2TZif2»ÿÿÿÿ^=4ìÿÿÿÿœÏb ÿÿÿÿ¤æüÿÿÿÿž¸~ŒÿÿÿÿŸºÖ|ÿÿÿÿ ¶ˆÜÿÿÿÿ¡8ÿLÿÿÿÿ¢•\ÿÿÿÿ£„üLÿÿÿÿ¤tû\ÿÿÿÿ¥dÞLÿÿÿÿ¦^Üÿÿÿÿ§DÀLÿÿÿÿ¨=ùÜÿÿÿÿ©$¢LÿÿÿÿªÛÜÿÿÿÿ«„Lÿÿÿÿ«ý½Üÿÿÿÿ¬äfLÿÿÿÿ­ÝŸÜÿÿÿÿ®Í‚Ìÿÿÿÿ¯½Üÿÿÿÿ°­dÌÿÿÿÿ±¦ž\ÿÿÿÿ²FÌÿÿÿÿ³†€\ÿÿÿÿ´m(Ìÿÿÿÿµfb\ÿÿÿÿ¶M Ìÿÿÿÿ·FD\ÿÿÿÿ¸,ìÌÿÿÿÿ¹&&\ÿÿÿÿº Lÿÿÿÿ»BÜÿÿÿÿ»õëLÿÿÿÿ¼ï$Üÿÿÿÿ½ÕÍLÿÿÿÿ¾žMlÿÿÿÿ¾Ï¨ÿÿÿÿ¿µ¯ÿÿÿÿÀ¸18ÿÿÿÿÁyï¨ÿÿÿÿ˜8ÿÿÿÿÃYѨÿÿÿÿÄwõ8ÿÿÿÿÅ9³¨ÿÿÿÿÆa¸ÿÿÿÿÇ•¨ÿÿÿÿÈ@ó¸ÿÿÿÿɲ(ÿÿÿÿÊ Õ¸ÿÿÿÿÊâ”(ÿÿÿÿÌ·¸ÿÿÿÿÒ#ôpÿÿÿÿÒ`æÈÿÿÿÿÓˆDØÿÿÿÿÔJHÿÿÿÿÕh&ØÿÿÿÿÖ)åHÿÿÿÿ×HØÿÿÿÿØ ÇHÿÿÿÿÙ'êØÿÿÿÿÙé©HÿÿÿÿÛXÿÿÿÿÛÒÅÈÿÿÿÿÜÞtXÿÿÿÿÝ©mHÿÿÿÿÞ¾VXÿÿÿÿ߉OHÿÿÿÿàž8Xÿÿÿÿái1Hÿÿÿÿâ~XÿÿÿÿãIHÿÿÿÿä]üXÿÿÿÿå(õHÿÿÿÿæGØÿÿÿÿçÈÿÿÿÿè&úØÿÿÿÿèñóÈÿÿÿÿêÜØÿÿÿÿêÑÕÈÿÿÿÿëæ¾Øÿÿÿÿì±·ÈÿÿÿÿíÆ ØÿÿÿÿHÿÿÿÿﯽXÿÿÿÿðŸ HÿÿÿÿñŸXÿÿÿÿò‚HÿÿÿÿóoXÿÿÿÿô_dHÿÿÿÿõOcXÿÿÿÿö?FHÿÿÿÿ÷/EXÿÿÿÿø(bÈÿÿÿÿù'XÿÿÿÿúDÈÿÿÿÿúøCØÿÿÿÿûè&ÈÿÿÿÿüØ%ØÿÿÿÿýÈÈÿÿÿÿþ¸Øÿÿÿÿÿ§êÈ—éØ‡ÌÈwËØpéH`èXPËH@ÊX0­H ¬X H ŽX ðqH àpX ÙÈ ÀRX¹oÈ©nØ™QȉPØy3Èi2ØYÈIØ8÷È(öØ"HØØöHñõXáØHÑ×XÁºH±¹X¡œH uÏô!bd"U±ô#jpÔ$5“ô%J`ä&uô'*Bä'þ’t) $ä)Þtt*êä+¾Vt,Ó#d-ž8t.³d/~t0’çd1g6ô2rÉd3Gô4R«d5&úô62d7Üô8©ä8æ¾ô9û‹ä:Æ ô;Ûmä<¯½t=»Oä>Ÿt?›1ä@otA„NdBOctCd0dD/EtEDdEówôG-.äGÓYôI äI³;ôJìòäKœXtLÖdM|:tN¶ HÿÿΔÿÿܤÿÿΔÿÿÜØÿÿÎÈÿÿÜØ ÿÿÜØÿÿêèLMTNDTNSTNPTNWTNDDT NST3:30NDT,M3.2.0,M11.1.0 NSTimeZones/zones/Canada/Central0000644000175000017500000000241614353032552016673 0ustar richardrichardTZif2TZif2}ÿÿÿÿdä°”ÿÿÿÿ›ûàÿÿÿÿ›ÃºPÿÿÿÿž¸¡€ÿÿÿÿŸºùpÿÿÿÿ ;€ÿÿÿÿÃO„ðÿÿÿÿˈþ€ÿÿÿÿÒ#ôpÿÿÿÿÒa ðÿÿÿÿÓˆhÿÿÿÿÔS`ðÿÿÿÿÕUÕÿÿÿÿÖ Íðÿÿÿÿ×5·ÿÿÿÿدðÿÿÿÿÙ™ÿÿÿÿÙà‘ðÿÿÿÿÛÿÿÿÿÛÈ\ðÿÿÿÿÜÞ—€ÿÿÿÿÝ©pÿÿÿÿÞ¾y€ÿÿÿÿ߉rpÿÿÿÿàž[€ÿÿÿÿáiTpÿÿÿÿâ~=€ÿÿÿÿãI6pÿÿÿÿä^€ÿÿÿÿå)pÿÿÿÿæG<ÿÿÿÿç4ðÿÿÿÿè'ÿÿÿÿèòðÿÿÿÿêÿÿÿÿêÑøðÿÿÿÿëæâÿÿÿÿìÖÄðÿÿÿÿíÆÄÿÿÿÿðÿÿÿÿóo¤€ÿÿÿÿô1bðÿÿÿÿùJ€ÿÿÿÿúvÿÿÿÿúøgÿÿÿÿûèXÿÿÿÿüØIÿÿÿÿýÈ:ÿÿÿÿþ¸+ÿÿÿÿÿ¨˜ ‡þwïq€a €Pü€@í€0Þ€ Ï€ À€ ±€ ð¢€ à“€ Ù¿ Àu€¹¡©’™ƒ‰tyeiVYGI89))"E€ü'€ò€â €Ñú€Á뀱܀¡Í€ v!¯€"Uñ#jÌ$5Ó%J®&µ'*'þÑ€) r)Þ³€*êT+¾•€,Óp€-žw€.³R€/~Y€0“4€1gv2s€3GX4Rø€5':62Ú€78÷8æþ9ûÙ:Æà;Û»<¯ü€=»>Þ€?›@oÀ€A„›€BO¢€Cd}€D/„€EDQpEó·ÿÿ¤ìÿÿ¹°ÿÿ« ÿÿ¹° ÿÿ¹°LMTCDTCSTCWTCPT CST6CDT,M3.2.0,M11.1.0 NSTimeZones/zones/Canada/Saskatchewan0000644000175000017500000000117614353032552017721 0ustar richardrichardTZif2TZif25ÿÿÿÿ†ý“ÿÿÿÿž¸¯ÿÿÿÿŸ»€ÿÿÿÿµeOðÿÿÿÿ¶0Hàÿÿÿÿ·E1ðÿÿÿÿ¸*àÿÿÿÿ¹%ðÿÿÿÿ¹ð àÿÿÿÿ»0pÿÿÿÿ»Ïîàÿÿÿÿ¼îpÿÿÿÿ½¹ `ÿÿÿÿÂrðÿÿÿÿÃaëàÿÿÿÿÄQêðÿÿÿÿÅ8“`ÿÿÿÿÆ1ÌðÿÿÿÿÇ!¯àÿÿÿÿÈépÿÿÿÿÉ Ì`ÿÿÿÿÉúËpÿÿÿÿÊê®`ÿÿÿÿˉ ÿÿÿÿÒ#ôpÿÿÿÿÒaÿÿÿÿÓcŒÿÿÿÿÔSoÿÿÿÿÕUãÿÿÿÿÖ Üÿÿÿÿ×5ÅÿÿÿÿؾÿÿÿÿÙ§ÿÿÿÿÙà ÿÿÿÿÚþÃÿÿÿÿÛÀ‚ÿÿÿÿÜÞ¥ÿÿÿÿÝ©ž€ÿÿÿÿÞ¾‡ÿÿÿÿ߉€€ÿÿÿÿàžiÿÿÿÿáib€ÿÿÿÿâ~KÿÿÿÿãID€ÿÿÿÿä^-ÿÿÿÿå)&€ÿÿÿÿæGJÿÿÿÿçCÿÿÿÿè',ÿÿÿÿèò%ÿÿÿÿëæðÿÿÿÿìÖÓÿÿÿÿíÆÒÿÿäÿÿ« ÿÿÿÿ«  ÿÿ« ÿÿ« LMTMDTMSTMWTMPTCST CST6 NSTimeZones/zones/W-SU0000644000175000017500000000161414353032552014666 0ustar richardrichardTZif2TZif2N &ÿÿÿÿV¶ÀÇÿÿÿÿ›_Çÿÿÿÿ>òyÿÿÿÿž*îùÿÿÿÿž÷9iÿÿÿÿŸ„Wùÿÿÿÿ Øléÿÿÿÿ¡9€ÿÿÿÿ¡<¦@ÿÿÿÿ¤mÀÿÿÿÿ¤=2°ÿÿÿÿ¥h°ÿÿÿÿ¥=Àÿÿÿÿ§EPÿÿÿÿµ¤`'§ÐÜ@ÛPúÀêÐÛC@̓м ð¬‘ðœ‚ðŒsð|dð lUð!\Fð"L7ð#<(ð$,ð% ð& ûð''p'õp(å€)x¿€)Ôúp*Äëp+´Üp,¤Íp-”¾p.„¯p/t p0d‘p1]¼ð2r—ð3=žð4Ryð5€ð62[ð6ýbð8xp8ÝDð9ûZp:½&ð;Û†%p?›p@fpA„ðBEépCcþðD%ËpECàðF­pG#ÂðGîÉðI¤ðIΫðJã†ðK®ðLÌ£pMŽoðTL`  #9#91‡#w?— 8@*0FP *0!8@LMTMMTMSTMDSTMSDMSK+05EETEEST MSK-3 NSTimeZones/zones/ROC0000644000175000017500000000077714353032552014567 0ustar richardrichardTZif2TZif2)ÿÿÿÿtÎðÿÿÿÿÃUI€ÿÿÿÿÒTY€ÿÿÿÿÓ‹{€ÿÿÿÿÔB­ðÿÿÿÿÕE"ÿÿÿÿÖL¿ðÿÿÿÿ×<¿ÿÿÿÿØfpÿÿÿÿÙò€ÿÿÿÿÙç™ðÿÿÿÿÚÿ&ÿÿÿÿÛÈÍpÿÿÿÿÜàY€ÿÿÿÿݪðÿÿÿÿÞrsÿÿÿÿßµdpÿÿÿÿà|…ÿÿÿÿá–—ðÿÿÿÿâ]¸€ÿÿÿÿãwËpÿÿÿÿä>ìÿÿÿÿå0 pÿÿÿÿæ!qÿÿÿÿç¥pÿÿÿÿ褀ÿÿÿÿèóØðÿÿÿÿéãØÿÿÿÿêÕ pÿÿÿÿëÅ €ÿÿÿÿì¶?ðÿÿÿÿí÷üÿÿÿÿî˜ÄðÿÿÿÿïÙ/€ÿÿÿÿðyøpüVíŠp ݉€ νðÛ¡€TÝpqèp€~~ LMTCSTJSTCDT CST-8 NSTimeZones/zones/Turkey0000644000175000017500000000226014353032552015414 0ustar richardrichardTZif2TZif2sÿÿÿÿV¶ÈØÿÿÿÿ‹õ˜ÿÿÿÿ› `ÿÿÿÿ›Õ¾Ðÿÿÿÿ¢ecàÿÿÿÿ£{‚Pÿÿÿÿ¤N€`ÿÿÿÿ¥?´Ðÿÿÿÿ¦%'àÿÿÿÿ§'Ðÿÿÿÿª((`ÿÿÿÿªáýÐÿÿÿÿ«ù‰àÿÿÿÿ¬Ã1PÿÿÿÿÈ?àÿÿÿÿÉPÿÿÿÿÉJõ`ÿÿÿÿÊ΀PÿÿÿÿËË®`ÿÿÿÿÒk PÿÿÿÿÓ¢9`ÿÿÿÿÔCPÿÿÿÿÕL àÿÿÿÿÖ){Ðÿÿÿÿ×+ïàÿÿÿÿØ ]ÐÿÿÿÿÙ—`ÿÿÿÿÙé?ÐÿÿÿÿÚë³àÿÿÿÿÛÒ\PÿÿÿÿÜÔÐ`ÿÿÿÿݲ>Pÿÿÿÿñô¹`ÿÿÿÿôbïPÿÿÿÿõh`ÿÿÿÿö8Ðn“p9špûu |p ÐË ù^p ±þ€ Ù@p ¤U€¦­p„7€øP‰°pܰàæÐðÆïð›1pŒsð|dð lUð!\Fð"L7ð#<(ð$,ð% ð& ûð''p'õp(å p)Ôúp*Äëp+´Üp,¤Íp-‹ƒð.„¯p/t p0d‘p1]¼ð2r—ð3=žð4Ryð5€ð62[ð6ýbð8xp8ÝDð9ûZp:½&ð;Û†%p?›p@fpA„ðBEépCcþðD%ËpECàðFÉG#ßGîæIÁIÎÈJã£K®ªLÌ¿MÝN¬¡OnnPŒƒQWŠRleS8¾TLGUNV>žV÷0WÏ.P(h*0 *08@LMTIMTEESTEET+03+04 <+03>-3 NSTimeZones/zones/GMT0000644000175000017500000000015714353032552014563 0ustar richardrichardTZif2TZif2GMT GMT0 NSTimeZones/zones/EET0000644000175000017500000000076114353032552014552 0ustar richardrichardTZif2TZif2' ¤c‹„Et6d'TMD3ú#ëÜÍó¾ã¯Ó Ñ¼½¬®œŸŒ| lr!\c"LT#ì?›@oÎA„›€BO°Cd}€D/’ED_€EóÅÿÿÿÿ« ÿÿ« ÿÿ«  MDTMSTMWTMPT MST7MDT,M3.2.0,M11.1.0 NSTimeZones/zones/GMT-90000644000175000017500000000016514353032552014730 0ustar richardrichardTZif2TZif2ÿÿpGMT-9 9 NSTimeZones/zones/GMT-40000644000175000017500000000016514353032552014723 0ustar richardrichardTZif2TZif2ÿÿÇÀGMT-4 4 NSTimeZones/zones/Iran0000644000175000017500000000145414353032552015026 0ustar richardrichardTZif2TZif2Gÿÿÿÿšl}Èÿÿÿÿ¿ÌH ”D8­¸ys@(ÊÀí:@­¼HEJ¸7ìÈ-¸( vÈ(Û¸)ËœÈ*¾"¸+¬ÐH,ŸV8-ŽÈ.€‰¸/o7H0a½81PjÈ2Bð¸32ïÈ4%u¸5#H6©86õVÈ7çܸ8ÖŠH9É8:¹H;«•8<šBÈ=ŒÈ¸>{vH?mü8@\©ÈAO/¸B?.ÈC1´¸GâÉHHÕO8IÅNHJ·Ô8K¦ÈL™¸M‡µHNz;8OhèÈP[n¸QKmÈR=ó¸S,¡HT'8U ÔÈVZ¸VïHWáŽ8XÑHYÄ8Z²ÀÈ[¥F¸\“ôH]†z8^u'È_g­¸`W¬ÈaJ2¸b8àHc+f80808?H18FP8@LMTTMT+0430+0330+05+04 <+0330>-3:30 NSTimeZones/zones/GMT-10000644000175000017500000000016514353032552014720 0ustar richardrichardTZif2TZif2ÿÿñðGMT-1 1 NSTimeZones/zones/Arctic/0000755000175000017500000000000014353032552015413 5ustar richardrichardNSTimeZones/zones/Arctic/Longyearbyen0000644000175000017500000000130114353032552017767 0ustar richardrichardTZif2TZif2<ÿÿÿÿo¢aøÿÿÿÿ› `ÿÿÿÿ›ÕÚðÿÿÿÿœÙ®ÿÿÿÿ¤µÿÿÿÿž¹ÿÿÿÿŸ„—ÿÿÿÿÈ qÿÿÿÿÌçKÿÿÿÿÍ©ÿÿÿÿ΢CÿÿÿÿÏ’4ÿÿÿÿЂ%ÿÿÿÿÑrÿÿÿÿѶ–ÿÿÿÿÒX¾€ÿÿÿÿÒ¡OÿÿÿÿÓcÿÿÿÿÔK#ÿÿÿÿÕ9Ñ ÿÿÿÿÕgçÿÿÿÿÕ¨sÿÿÿÿÖ)´ÿÿÿÿ×,ÿÿÿÿØ –ÿÿÿÿÙÁÿÿÿÿÙéxMD3ú#ëÜÍó¾ã¯Ó Ñ¼½¬®œŸŒ| lr!\c"LT#-4 NSTimeZones/zones/Kwajalein0000644000175000017500000000033314353032552016035 0ustar richardrichardTZif2TZif2ÿÿÿÿ~6 ÿÿÿÿÁí5ÐÿÿÿÿÉê `ÿÿÿÿÏFðÿÿÿÿÿ†P,v@œàš°Œ ~ ÿÿW@¨ÀLMT+11+10+09-12+12 <+12>-12 NSTimeZones/zones/GMT+70000644000175000017500000000016614353032552014725 0ustar richardrichardTZif2TZif2bpGMT+7 -7 NSTimeZones/zones/Australia/0000755000175000017500000000000014353032552016133 5ustar richardrichardNSTimeZones/zones/Australia/Hobart0000644000175000017500000000175314353032552017303 0ustar richardrichardTZif2TZif2^ÿÿÿÿt.äÿÿÿÿ›Õx€ÿÿÿÿœ¼/ÿÿÿÿÚD€ÿÿÿÿž€a€ÿÿÿÿŸº&€ÿÿÿÿ `C€ÿÿÿÿËT³ÿÿÿÿËÇe€ÿÿÿÿÌ·V€ÿÿÿÿͧG€ÿÿÿÿΠsÿÿÿÿχ)€ÿÿÿÿûÂÿÿÿÿü²~ÿÿÿÿýÇYÿÿÿÿþv°€ÿÿÿÿÿ§;V’€‡?¯p9€ P€ö8€/ý€Ö€ ߀ µü€ ïÁ€ Ÿ ØÞ ~û¸À^ݘ¢>¿x„¡Xfþƒ8HO!d€ã1F€§c€á(€‡E€Á €g'€—² Y~€!€Î€"B›#ië$"}%IÍ&_')¯'ô¶(íá€)Ô˜*ÍÀ+´z,­¥€-”\.‡€/t>0mi€1]Z€2V†3=<€46h5€6J6ý€7ö,8Üâ€9§é€:¼Ä€;¿*€<¥á=Ÿ €>…Ã?~î€@e¥A^ЀBE‡C>²€D.£€E”€FKG±Šš°Œ  LMTAEDTAEST AEST-10AEDT,M10.1.0,M4.1.0/3 NSTimeZones/zones/Australia/Melbourne0000644000175000017500000000161014353032552020004 0ustar richardrichardTZif2TZif2Sÿÿÿÿs…ÿÿÿÿœN€ÿÿÿÿœ¼/ÿÿÿÿËT³ÿÿÿÿËÇe€ÿÿÿÿÌ·V€ÿÿÿÿͧG€ÿÿÿÿΠsÿÿÿÿχ)€p9€ P€ö8€/ý€Ö€ ߀ µü€ ïÁ€ Ÿ ØÞ ~û¸À^ݘ¢>¿x„¡Xfþƒ8H矀!d€Ç€F€§c€á(€‡E€Á €yœ€—² Y~€!w”"B›#ië$"}%IÍ&_')¯'ÏÌ) ‘)¯®*és+˜Ê€,Ò€-x¬€.²q€/t>0’S€1]Z€2r5€3=<€4R€5€61ù€6ý€88Üâ€9§é€:¼Ä€;ÚÚ<¥á=º¼>…Ã?šž@e¥Aƒº€BE‡Ccœ€D.£€EC~€FKG#`€G÷¢‡èš°Œ  LMTAEDTAEST AEST-10AEDT,M10.1.0,M4.1.0/3 NSTimeZones/zones/Australia/NSW0000644000175000017500000000161014353032552016523 0ustar richardrichardTZif2TZif2Sÿÿÿÿs<ÿÿÿÿœN€ÿÿÿÿœ¼/ÿÿÿÿËT³ÿÿÿÿËÇe€ÿÿÿÿÌ·V€ÿÿÿÿͧG€ÿÿÿÿΠsÿÿÿÿχ)€p9€ P€ö8€/ý€Ö€ ߀ µü€ ïÁ€ Ÿ ØÞ ~û¸À^ݘ¢>¿x„¡Xfþƒ8H ‰€!d€Ç€F€§c€á(€‡E€Á €yœ€—² Y~€!€Î€"B›#ië$"}%IÍ%ïê')¯'ÏÌ) ‘)¯®*és+˜Ê€,Ò€-x¬€.²q€/XŽ€0’S€1]Z€2r5€3=<€4R€5€61ù€6ý€88Üâ€9§é€:¼Ä€;ÚÚ<¥á=º¼>…Ã?šž@e¥Aƒº€BE‡Ccœ€D.£€EC~€FKG#`€G÷¢Äš°Œ  LMTAEDTAEST AEST-10AEDT,M10.1.0,M4.1.0/3 NSTimeZones/zones/Australia/Lord_Howe0000644000175000017500000000126414353032552017743 0ustar richardrichardTZif2TZif28ÿÿÿÿswÜþfà8@øçŠh!]xÇlh?x§Nhá!x‡0hÁxyŽp—ªø Ypp!€Çx"BŒð#iãø$"nð%IÅø%ïÛð')§ø'Ͻð) ‰ø)¯Ÿð*ékø+˜¼p,Òˆx-xžp.²jx/X€p0’Lx1]Lp2r.x3=.p4Rx5p61òx6üòp8ø8ÜÔp9§âx:¼¶p;ÚÒø<¥Òð=º´ø>…´ð?š–ø@e–ðAƒ³xBExðCc•xD.•pECwxF<ðG#YxG÷“ð•$Œ ¡¸ “¨š°LMTAEST+1130+1030+11 <+1030>-10:30<+11>-11,M10.1.0,M4.1.0 NSTimeZones/zones/Australia/Currie0000644000175000017500000000175314353032552017315 0ustar richardrichardTZif2TZif2^ÿÿÿÿt.äÿÿÿÿ›Õx€ÿÿÿÿœ¼/ÿÿÿÿÚD€ÿÿÿÿž€a€ÿÿÿÿŸº&€ÿÿÿÿ `C€ÿÿÿÿËT³ÿÿÿÿËÇe€ÿÿÿÿÌ·V€ÿÿÿÿͧG€ÿÿÿÿΠsÿÿÿÿχ)€ÿÿÿÿûÂÿÿÿÿü²~ÿÿÿÿýÇYÿÿÿÿþv°€ÿÿÿÿÿ§;V’€‡?¯p9€ P€ö8€/ý€Ö€ ߀ µü€ ïÁ€ Ÿ ØÞ ~û¸À^ݘ¢>¿x„¡Xfþƒ8HO!d€ã1F€§c€á(€‡E€Á €g'€—² Y~€!€Î€"B›#ië$"}%IÍ&_')¯'ô¶(íá€)Ô˜*ÍÀ+´z,­¥€-”\.‡€/t>0mi€1]Z€2V†3=<€46h5€6J6ý€7ö,8Üâ€9§é€:¼Ä€;¿*€<¥á=Ÿ €>…Ã?~î€@e¥A^ЀBE‡C>²€D.£€E”€FKG±Šš°Œ  LMTAEDTAEST AEST-10AEDT,M10.1.0,M4.1.0/3 NSTimeZones/zones/Australia/Adelaide0000644000175000017500000000163114353032552017547 0ustar richardrichardTZif2TZif2Tÿÿÿÿs‹ÿÿÿÿ{pÿÿÿÿœNɈÿÿÿÿœ¼6ÿÿÿÿËTºÿÿÿÿËÇlˆÿÿÿÿÌ·]ˆÿÿÿÿͧNˆÿÿÿÿΠzÿÿÿÿχ0ˆp@ˆ #P"ˆö?ˆ0ˆÖ!ˆ æˆ ¶ˆ ïȈ Ÿ  Øå ¸Ç^䘩>Æx‹¨XmþŠ8O禈!kˆLjˆMˆ§jˆá/ˆ‡LˆÁˆy£ˆ—¹ Y…ˆ!€Õˆ"B¢#iò$"„%IÔ&f')¶'ÏÓ) ˜)Ëdˆ*éz+˜Ñˆ,Ò–ˆ-‹(ˆ.²xˆ/tE0’Zˆ1]aˆ2r<ˆ3=Cˆ4Rˆ5%ˆ62ˆ6ýˆ88Üéˆ9úÿ:¼Ëˆ;Úá<¥è=ºÃ>…Ê?š¥@e¬AƒÁˆBEŽCc£ˆD.ªˆEC…ˆFRG#gˆG÷©ì~“¨ …˜LMTACSTACDT ACST-9:30ACDT,M10.1.0,M4.1.0/3 NSTimeZones/zones/Australia/Eucla0000644000175000017500000000047214353032552017112 0ustar richardrichardTZif2TZif2ÿÿÿÿt¦ °ÿÿÿÿœNÔÿÿÿÿœ¼@”ÿÿÿÿËTÄ”ÿÿÿÿËÇwÿÿÿÿÌ·hÿÿÿÿͧY ñ ¶X§u)%R)¯¿”Eq´”F\”G#rGîyITIÎ[xЉ{ LMT+0945+0845 <+0845>-8:45 NSTimeZones/zones/Australia/Queensland0000644000175000017500000000044114353032552020154 0ustar richardrichardTZif2TZif2ÿÿÿÿríŸÿÿÿÿœN€ÿÿÿÿœ¼/ÿÿÿÿËT³ÿÿÿÿËÇe€ÿÿÿÿÌ·V€ÿÿÿÿͧG€ÿÿÿÿΠsÿÿÿÿχ)€p9€ %IÍ%ïê')¯'ÏÌ) ‘)¯®xš°Œ  LMTAEDTAEST AEST-10 NSTimeZones/zones/Australia/Sydney0000644000175000017500000000161014353032552017327 0ustar richardrichardTZif2TZif2Sÿÿÿÿs<ÿÿÿÿœN€ÿÿÿÿœ¼/ÿÿÿÿËT³ÿÿÿÿËÇe€ÿÿÿÿÌ·V€ÿÿÿÿͧG€ÿÿÿÿΠsÿÿÿÿχ)€p9€ P€ö8€/ý€Ö€ ߀ µü€ ïÁ€ Ÿ ØÞ ~û¸À^ݘ¢>¿x„¡Xfþƒ8H ‰€!d€Ç€F€§c€á(€‡E€Á €yœ€—² Y~€!€Î€"B›#ië$"}%IÍ%ïê')¯'ÏÌ) ‘)¯®*és+˜Ê€,Ò€-x¬€.²q€/XŽ€0’S€1]Z€2r5€3=<€4R€5€61ù€6ý€88Üâ€9§é€:¼Ä€;ÚÚ<¥á=º¼>…Ã?šž@e¥Aƒº€BE‡Ccœ€D.£€EC~€FKG#`€G÷¢Äš°Œ  LMTAEDTAEST AEST-10AEDT,M10.1.0,M4.1.0/3 NSTimeZones/zones/Australia/Yancowinna0000644000175000017500000000165514353032552020173 0ustar richardrichardTZif2TZif2Uÿÿÿÿsˆdÿÿÿÿv¥àÿÿÿÿ{pÿÿÿÿœNɈÿÿÿÿœ¼6ÿÿÿÿËTºÿÿÿÿËÇlˆÿÿÿÿÌ·]ˆÿÿÿÿͧNˆÿÿÿÿΠzÿÿÿÿχ0ˆp@ˆ #P"ˆö?ˆ0ˆÖ!ˆ æˆ ¶ˆ ïȈ Ÿ  Øå ¸Ç^䘩>Æx‹¨XmþŠ8O ˆ!kˆLjˆMˆ§jˆá/ˆ‡LˆÁˆy£ˆ—¹ Y…ˆ!€Õˆ"B¢#iò$"„%IÔ%ïñ')¶'ÏÓ) ˜)¯µ*éz+˜Ñˆ,Ò–ˆ-x³ˆ.²xˆ/X•ˆ0’Zˆ1]aˆ2r<ˆ3=Cˆ4Rˆ5%ˆ62ˆ6ýˆ88Üéˆ9úÿ:¼Ëˆ;Úá<¥è=ºÃ>…Ê?š¥@e¬AƒÁˆBEŽCc£ˆD.ªˆEC…ˆFRG#gˆG÷©„œŒ ~ “¨…˜ LMTAESTACSTACDT ACST-9:30ACDT,M10.1.0,M4.1.0/3 NSTimeZones/zones/Australia/ACT0000644000175000017500000000161014353032552016463 0ustar richardrichardTZif2TZif2Sÿÿÿÿs<ÿÿÿÿœN€ÿÿÿÿœ¼/ÿÿÿÿËT³ÿÿÿÿËÇe€ÿÿÿÿÌ·V€ÿÿÿÿͧG€ÿÿÿÿΠsÿÿÿÿχ)€p9€ P€ö8€/ý€Ö€ ߀ µü€ ïÁ€ Ÿ ØÞ ~û¸À^ݘ¢>¿x„¡Xfþƒ8H ‰€!d€Ç€F€§c€á(€‡E€Á €yœ€—² Y~€!€Î€"B›#ië$"}%IÍ%ïê')¯'ÏÌ) ‘)¯®*és+˜Ê€,Ò€-x¬€.²q€/XŽ€0’S€1]Z€2r5€3=<€4R€5€61ù€6ý€88Üâ€9§é€:¼Ä€;ÚÚ<¥á=º¼>…Ã?šž@e¥Aƒº€BE‡Ccœ€D.£€EC~€FKG#`€G÷¢Äš°Œ  LMTAEDTAEST AEST-10AEDT,M10.1.0,M4.1.0/3 NSTimeZones/zones/Australia/North0000644000175000017500000000035214353032552017150 0ustar richardrichardTZif2TZif2 ÿÿÿÿs’Xÿÿÿÿ{pÿÿÿÿœNɈÿÿÿÿœ¼6ÿÿÿÿËTºÿÿÿÿËÇlˆÿÿÿÿÌ·]ˆÿÿÿÿͧNˆÿÿÿÿΠzÿÿÿÿχ0ˆz¨~“¨ …˜LMTACSTACDT ACST-9:30 NSTimeZones/zones/Australia/Lindeman0000644000175000017500000000050514353032552017605 0ustar richardrichardTZif2TZif2ÿÿÿÿrí¢ÔÿÿÿÿœN€ÿÿÿÿœ¼/ÿÿÿÿËT³ÿÿÿÿËÇe€ÿÿÿÿÌ·V€ÿÿÿÿͧG€ÿÿÿÿΠsÿÿÿÿχ)€p9€ %IÍ%ïê')¯'ÏÌ) ‘)¯®*és+˜Ê€,Ò€-x¬€‹¬š°Œ  LMTAEDTAEST AEST-10 NSTimeZones/zones/Australia/West0000644000175000017500000000046214353032552017002 0ustar richardrichardTZif2TZif2ÿÿÿÿt¦äÿÿÿÿœNÞ ÿÿÿÿœ¼K ÿÿÿÿËTÏ ÿÿÿÿËÇ ÿÿÿÿÌ·r ÿÿÿÿͧc  û  ¶ b § )%\ )¯Ê Eq¿ Fg G#| GI^ IÎe lœ~p€ LMTAWDTAWST AWST-8 NSTimeZones/zones/Australia/Broken_Hill0000644000175000017500000000165514353032552020255 0ustar richardrichardTZif2TZif2Uÿÿÿÿsˆdÿÿÿÿv¥àÿÿÿÿ{pÿÿÿÿœNɈÿÿÿÿœ¼6ÿÿÿÿËTºÿÿÿÿËÇlˆÿÿÿÿÌ·]ˆÿÿÿÿͧNˆÿÿÿÿΠzÿÿÿÿχ0ˆp@ˆ #P"ˆö?ˆ0ˆÖ!ˆ æˆ ¶ˆ ïȈ Ÿ  Øå ¸Ç^䘩>Æx‹¨XmþŠ8O ˆ!kˆLjˆMˆ§jˆá/ˆ‡LˆÁˆy£ˆ—¹ Y…ˆ!€Õˆ"B¢#iò$"„%IÔ%ïñ')¶'ÏÓ) ˜)¯µ*éz+˜Ñˆ,Ò–ˆ-x³ˆ.²xˆ/X•ˆ0’Zˆ1]aˆ2r<ˆ3=Cˆ4Rˆ5%ˆ62ˆ6ýˆ88Üéˆ9úÿ:¼Ëˆ;Úá<¥è=ºÃ>…Ê?š¥@e¬AƒÁˆBEŽCc£ˆD.ªˆEC…ˆFRG#gˆG÷©„œŒ ~ “¨…˜ LMTAESTACSTACDT ACST-9:30ACDT,M10.1.0,M4.1.0/3 NSTimeZones/zones/Australia/South0000644000175000017500000000163114353032552017161 0ustar richardrichardTZif2TZif2Tÿÿÿÿs‹ÿÿÿÿ{pÿÿÿÿœNɈÿÿÿÿœ¼6ÿÿÿÿËTºÿÿÿÿËÇlˆÿÿÿÿÌ·]ˆÿÿÿÿͧNˆÿÿÿÿΠzÿÿÿÿχ0ˆp@ˆ #P"ˆö?ˆ0ˆÖ!ˆ æˆ ¶ˆ ïȈ Ÿ  Øå ¸Ç^䘩>Æx‹¨XmþŠ8O禈!kˆLjˆMˆ§jˆá/ˆ‡LˆÁˆy£ˆ—¹ Y…ˆ!€Õˆ"B¢#iò$"„%IÔ&f')¶'ÏÓ) ˜)Ëdˆ*éz+˜Ñˆ,Ò–ˆ-‹(ˆ.²xˆ/tE0’Zˆ1]aˆ2r<ˆ3=Cˆ4Rˆ5%ˆ62ˆ6ýˆ88Üéˆ9úÿ:¼Ëˆ;Úá<¥è=ºÃ>…Ê?š¥@e¬AƒÁˆBEŽCc£ˆD.ªˆEC…ˆFRG#gˆG÷©ì~“¨ …˜LMTACSTACDT ACST-9:30ACDT,M10.1.0,M4.1.0/3 NSTimeZones/zones/Australia/Brisbane0000644000175000017500000000044114353032552017602 0ustar richardrichardTZif2TZif2ÿÿÿÿríŸÿÿÿÿœN€ÿÿÿÿœ¼/ÿÿÿÿËT³ÿÿÿÿËÇe€ÿÿÿÿÌ·V€ÿÿÿÿͧG€ÿÿÿÿΠsÿÿÿÿχ)€p9€ %IÍ%ïê')¯'ÏÌ) ‘)¯®xš°Œ  LMTAEDTAEST AEST-10 NSTimeZones/zones/Australia/Perth0000644000175000017500000000046214353032552017142 0ustar richardrichardTZif2TZif2ÿÿÿÿt¦äÿÿÿÿœNÞ ÿÿÿÿœ¼K ÿÿÿÿËTÏ ÿÿÿÿËÇ ÿÿÿÿÌ·r ÿÿÿÿͧc  û  ¶ b § )%\ )¯Ê Eq¿ Fg G#| GI^ IÎe lœ~p€ LMTAWDTAWST AWST-8 NSTimeZones/zones/Australia/Victoria0000644000175000017500000000161014353032552017634 0ustar richardrichardTZif2TZif2Sÿÿÿÿs…ÿÿÿÿœN€ÿÿÿÿœ¼/ÿÿÿÿËT³ÿÿÿÿËÇe€ÿÿÿÿÌ·V€ÿÿÿÿͧG€ÿÿÿÿΠsÿÿÿÿχ)€p9€ P€ö8€/ý€Ö€ ߀ µü€ ïÁ€ Ÿ ØÞ ~û¸À^ݘ¢>¿x„¡Xfþƒ8H矀!d€Ç€F€§c€á(€‡E€Á €yœ€—² Y~€!w”"B›#ië$"}%IÍ&_')¯'ÏÌ) ‘)¯®*és+˜Ê€,Ò€-x¬€.²q€/t>0’S€1]Z€2r5€3=<€4R€5€61ù€6ý€88Üâ€9§é€:¼Ä€;ÚÚ<¥á=º¼>…Ã?šž@e¥Aƒº€BE‡Ccœ€D.£€EC~€FKG#`€G÷¢‡èš°Œ  LMTAEDTAEST AEST-10AEDT,M10.1.0,M4.1.0/3 NSTimeZones/zones/Australia/Darwin0000644000175000017500000000035214353032552017302 0ustar richardrichardTZif2TZif2 ÿÿÿÿs’Xÿÿÿÿ{pÿÿÿÿœNɈÿÿÿÿœ¼6ÿÿÿÿËTºÿÿÿÿËÇlˆÿÿÿÿÌ·]ˆÿÿÿÿͧNˆÿÿÿÿΠzÿÿÿÿχ0ˆz¨~“¨ …˜LMTACSTACDT ACST-9:30 NSTimeZones/zones/Australia/Canberra0000644000175000017500000000161014353032552017571 0ustar richardrichardTZif2TZif2Sÿÿÿÿs<ÿÿÿÿœN€ÿÿÿÿœ¼/ÿÿÿÿËT³ÿÿÿÿËÇe€ÿÿÿÿÌ·V€ÿÿÿÿͧG€ÿÿÿÿΠsÿÿÿÿχ)€p9€ P€ö8€/ý€Ö€ ߀ µü€ ïÁ€ Ÿ ØÞ ~û¸À^ݘ¢>¿x„¡Xfþƒ8H ‰€!d€Ç€F€§c€á(€‡E€Á €yœ€—² Y~€!€Î€"B›#ië$"}%IÍ%ïê')¯'ÏÌ) ‘)¯®*és+˜Ê€,Ò€-x¬€.²q€/XŽ€0’S€1]Z€2r5€3=<€4R€5€61ù€6ý€88Üâ€9§é€:¼Ä€;ÚÚ<¥á=º¼>…Ã?šž@e¥Aƒº€BE‡Ccœ€D.£€EC~€FKG#`€G÷¢Äš°Œ  LMTAEDTAEST AEST-10AEDT,M10.1.0,M4.1.0/3 NSTimeZones/zones/Australia/LHI0000644000175000017500000000126414353032552016475 0ustar richardrichardTZif2TZif28ÿÿÿÿswÜþfà8@øçŠh!]xÇlh?x§Nhá!x‡0hÁxyŽp—ªø Ypp!€Çx"BŒð#iãø$"nð%IÅø%ïÛð')§ø'Ͻð) ‰ø)¯Ÿð*ékø+˜¼p,Òˆx-xžp.²jx/X€p0’Lx1]Lp2r.x3=.p4Rx5p61òx6üòp8ø8ÜÔp9§âx:¼¶p;ÚÒø<¥Òð=º´ø>…´ð?š–ø@e–ðAƒ³xBExðCc•xD.•pECwxF<ðG#YxG÷“ð•$Œ ¡¸ “¨š°LMTAEST+1130+1030+11 <+1030>-10:30<+11>-11,M10.1.0,M4.1.0 NSTimeZones/zones/Australia/Tasmania0000644000175000017500000000175314353032552017621 0ustar richardrichardTZif2TZif2^ÿÿÿÿt.äÿÿÿÿ›Õx€ÿÿÿÿœ¼/ÿÿÿÿÚD€ÿÿÿÿž€a€ÿÿÿÿŸº&€ÿÿÿÿ `C€ÿÿÿÿËT³ÿÿÿÿËÇe€ÿÿÿÿÌ·V€ÿÿÿÿͧG€ÿÿÿÿΠsÿÿÿÿχ)€ÿÿÿÿûÂÿÿÿÿü²~ÿÿÿÿýÇYÿÿÿÿþv°€ÿÿÿÿÿ§;V’€‡?¯p9€ P€ö8€/ý€Ö€ ߀ µü€ ïÁ€ Ÿ ØÞ ~û¸À^ݘ¢>¿x„¡Xfþƒ8HO!d€ã1F€§c€á(€‡E€Á €g'€—² Y~€!€Î€"B›#ië$"}%IÍ&_')¯'ô¶(íá€)Ô˜*ÍÀ+´z,­¥€-”\.‡€/t>0mi€1]Z€2V†3=<€46h5€6J6ý€7ö,8Üâ€9§é€:¼Ä€;¿*€<¥á=Ÿ €>…Ã?~î€@e¥A^ЀBE‡C>²€D.£€E”€FKG±Šš°Œ  LMTAEDTAEST AEST-10AEDT,M10.1.0,M4.1.0/3 NSTimeZones/zones/Universal0000644000175000017500000000015714353032552016104 0ustar richardrichardTZif2TZif2UTC UTC0 NSTimeZones/zones/GMT-110000644000175000017500000000017014353032552014775 0ustar richardrichardTZif2TZif2ÿÿePGMT-11 11 NSTimeZones/zones/GMT-80000644000175000017500000000016514353032552014727 0ustar richardrichardTZif2TZif2ÿÿ€GMT-8 8 NSTimeZones/zones/GMT+00000644000175000017500000000015714353032552014716 0ustar richardrichardTZif2TZif2GMT GMT0 NSTimeZones/zones/GMT+110000644000175000017500000000017114353032552014774 0ustar richardrichardTZif2TZif2š°GMT+11 -11 NSTimeZones/zones/GMT-60000644000175000017500000000016514353032552014725 0ustar richardrichardTZif2TZif2ÿÿ« GMT-6 6 NSTimeZones/zones/GMT+140000644000175000017500000000017114353032552014777 0ustar richardrichardTZif2TZif2ÄàGMT+14 -14 NSTimeZones/zones/EST5EDT0000644000175000017500000000166714353032552015220 0ustar richardrichardTZif2TZif2Xÿÿÿÿž¦pÿÿÿÿŸºë`ÿÿÿÿ †pÿÿÿÿ¡šÍ`ÿÿÿÿˈðpÿÿÿÿÒ#ôpÿÿÿÿÒ`ûàÿÿÿÿúøXðÿÿÿÿûè;àÿÿÿÿüØ:ðÿÿÿÿýÈàÿÿÿÿþ¸ðÿÿÿÿÿ§ÿà—þð‡áàwàðpþ``ýpPà`@ßp0Â`p ¤` ­”ð ð†` à…p Ù¢à Àgp¹„੃ð™fà‰eðyHàiGðY*àI)ð9 à) ð")`íð `ò páí`ÑìpÁÏ`±Îp¡±` vð!“`"Uâð#j¯à$5Äð%J‘à&¦ð'*sà'þÃp) Uà)Þ¥p*ê7à+¾‡p,ÓT`-žip.³6`/~Kp0“`1ggð2rú`3GIð4RÜ`5'+ð62¾`7 ð8Úà8æïð9û¼à:ÆÑð;Ûžà<¯îp=»€à>Ðp?›bà@o²pA„`BO”pCda`D/vpEDC`Eó¨ðÿÿ¹°ÿÿÇÀÿÿÇÀÿÿÇÀ EDTESTEWTEPT EST5EDT,M3.2.0,M11.1.0 NSTimeZones/zones/GMT-30000644000175000017500000000016514353032552014722 0ustar richardrichardTZif2TZif2ÿÿÕÐGMT-3 3 NSTimeZones/zones/Brazil/0000755000175000017500000000000014353032552015431 5ustar richardrichardNSTimeZones/zones/Brazil/Acre0000644000175000017500000000064214353032552016230 0ustar richardrichardTZif2TZif2 ÿÿÿÿ–ª†ÿÿÿÿ¸fÿÿÿÿ¸ý\Àÿÿÿÿ¹ñPPÿÿÿÿºÞ@ÿÿÿÿÚ8ÊPÿÿÿÿÚìPÿÿÿÿÜýÐÿÿÿÿܹu@ÿÿÿÿÝû1PÿÿÿÿÞ›ú@ÿÿÿÿßݶPÿÿÿÿàTO@ÿÿÿÿô˜Ðÿÿÿÿõz@ÿÿÿÿöÀ€Pÿÿÿÿ÷:ÀÿÿÿÿøQHPÿÿÿÿøÇá@ÿÿÿÿú îÐÿÿÿÿú©Àÿÿÿÿûì"Pÿÿÿÿü‹™ÀɪPxóÀ QÐ 3ëÀ!…P" äÀH`PRÀÿÿÀpÿÿÇÀÿÿ¹°ÿÿÇÀLMT-04-05 <-05>5 NSTimeZones/zones/Brazil/DeNoronha0000644000175000017500000000074414353032552017236 0ustar richardrichardTZif2TZif2' ÿÿÿÿ–ªedÿÿÿÿ¸;Ðÿÿÿÿ¸ý2ÿÿÿÿ¹ñ& ÿÿÿÿºÞfÿÿÿÿÚ8  ÿÿÿÿÚëì ÿÿÿÿÜÓ ÿÿÿÿܹKÿÿÿÿÝû ÿÿÿÿÞ›ÐÿÿÿÿßÝŒ ÿÿÿÿàT%ÿÿÿÿô—ñ ÿÿÿÿõPÿÿÿÿöÀV ÿÿÿÿ÷ÿÿÿÿøQ ÿÿÿÿøÇ·ÿÿÿÿú Ä ÿÿÿÿú¨êÿÿÿÿûëø ÿÿÿÿü‹oÉ€ xÉ '  3Á![ " º#X #âb%7ä %Ô¹7ö¸ 8¸w9ßÕ 9é;Èñ 2 NSTimeZones/zones/Brazil/East0000644000175000017500000000167014353032552016254 0ustar richardrichardTZif2TZif2[ ÿÿÿÿ–ªr´ÿÿÿÿ¸Iàÿÿÿÿ¸ý@ ÿÿÿÿ¹ñ40ÿÿÿÿºÞt ÿÿÿÿÚ8®0ÿÿÿÿÚëú0ÿÿÿÿÜá°ÿÿÿÿܹY ÿÿÿÿÝû0ÿÿÿÿÞ›Þ ÿÿÿÿßÝš0ÿÿÿÿàT3 ÿÿÿÿôZ 0ÿÿÿÿõ^ ÿÿÿÿöÀd0ÿÿÿÿ÷ ÿÿÿÿøQ,0ÿÿÿÿøÇÅ ÿÿÿÿú Ò°ÿÿÿÿú¨ø ÿÿÿÿûì0ÿÿÿÿü‹} ÉŽ0x×  5° 3Ï !i0" È #X°#âp %7ò°%ÔÇ '!0'½ã )ñ0)”‹ *ê °+k2 ,Àµ0-fÄ . —0/F¦ 0€y01M 2W °3j 48T04øÁ 6 06Ïh 7öư8¸… 9ßã0:, ;Èÿ°Nð ?‘þ0@.Ò A†ø0Bï CQÂ0C÷Ñ EMS°Eàí G†0G·• Hú¢°I—w JÚ„°K€“ Lºf°M`u NšH°OI’ Pƒe0Q 9 RcG0S TC)0Té8 V# 0VÉ Xí0X¨ü YâÏ0ZˆÞ [Þ`°\hÀ ÿÿÔLÿÿãàÿÿÕÐLMT-02-03 <-03>3 NSTimeZones/zones/Brazil/West0000644000175000017500000000063414353032552016301 0ustar richardrichardTZif2TZif2 ÿÿÿÿ–ªDÿÿÿÿ¸Wðÿÿÿÿ¸ýN°ÿÿÿÿ¹ñB@ÿÿÿÿºÞ‚0ÿÿÿÿÚ8¼@ÿÿÿÿÚì@ÿÿÿÿÜïÀÿÿÿÿܹg0ÿÿÿÿÝû#@ÿÿÿÿÞ›ì0ÿÿÿÿßݨ@ÿÿÿÿàTA0ÿÿÿÿô˜ Àÿÿÿÿõl0ÿÿÿÿöÀr@ÿÿÿÿ÷,°ÿÿÿÿøQ:@ÿÿÿÿøÇÓ0ÿÿÿÿú àÀÿÿÿÿú©°ÿÿÿÿûì@ÿÿÿÿü‹‹°Éœ@xå° CÀ 3ݰ!w@" Ö°,ÀÃ@-fÒ0ÿÿǼÿÿÕÐÿÿÇÀLMT-03-04 <-04>4 NSTimeZones/zones/GMT-100000644000175000017500000000017014353032552014774 0ustar richardrichardTZif2TZif2ÿÿs`GMT-10 10 NSTimeZones/zones/GB-Eire0000644000175000017500000000307714353032552015312 0ustar richardrichardTZif2TZif2Ÿÿÿÿÿ] Ëÿÿÿÿ›&­ ÿÿÿÿ›Ö ÿÿÿÿœÏ0 ÿÿÿÿ¤Ã ÿÿÿÿžœ ÿÿÿÿŸ— ÿÿÿÿ …º ÿÿÿÿ¡vü ÿÿÿÿ¢eœ ÿÿÿÿ£{È ÿÿÿÿ¤N¸ ÿÿÿÿ¥?û ÿÿÿÿ¦%` ÿÿÿÿ§'Æ ÿÿÿÿ¨*, ÿÿÿÿ¨ëø ÿÿÿÿªÓ ÿÿÿÿªÕ ÿÿÿÿ«éð ÿÿÿÿ¬Çl ÿÿÿÿ­ÉÒ ÿÿÿÿ®§N ÿÿÿÿ¯ y ÿÿÿÿ°‡0 ÿÿÿÿ±’Рÿÿÿÿ²pL ÿÿÿÿ³r² ÿÿÿÿ´P. ÿÿÿÿµIZ ÿÿÿÿ¶0 ÿÿÿÿ·2v ÿÿÿÿ¸ò ÿÿÿÿ¹X ÿÿÿÿ¹ïÔ ÿÿÿÿºé ÿÿÿÿ»Øñ ÿÿÿÿ¼ÛW ÿÿÿÿ½¸Ó ÿÿÿÿ¾±þ ÿÿÿÿ¿˜µ ÿÿÿÿÀ› ÿÿÿÿÁx— ÿÿÿÿÂzý ÿÿÿÿÃXy ÿÿÿÿÄQ¤ ÿÿÿÿÅ8[ ÿÿÿÿÆ:Á ÿÿÿÿÇXÖ ÿÿÿÿÇÚ  ÿÿÿÿÊ&ÿÿÿÿÊ—YÿÿÿÿËÑÿÿÿÿÌw;ÿÿÿÿͱÿÿÿÿÎ`XÿÿÿÿÏâÿÿÿÿÐn^ÿÿÿÿÑrÿÿÿÿÑû2ÿÿÿÿÒiþ ÿÿÿÿÓc) ÿÿÿÿÔIà ÿÿÿÿÕ! ÿÿÿÿÕBýÿÿÿÿÕßàÿÿÿÿÖN¬ ÿÿÿÿÖþ ÿÿÿÿØ.Ž ÿÿÿÿØù• ÿÿÿÿÚp ÿÿÿÿÚëì ÿÿÿÿÛå ÿÿÿÿÜËÎ ÿÿÿÿÝÄù ÿÿÿÿÞ´ê ÿÿÿÿß® ÿÿÿÿà”Ì ÿÿÿÿárH ÿÿÿÿâkt ÿÿÿÿãR* ÿÿÿÿäT ÿÿÿÿå2  ÿÿÿÿæ=­ ÿÿÿÿç) ÿÿÿÿèT ÿÿÿÿèû ÿÿÿÿéýq ÿÿÿÿêÚí ÿÿÿÿëÝS ÿÿÿÿìºÏ ÿÿÿÿí³ú ÿÿÿÿîš± ÿÿÿÿïg ÿÿÿÿðŸ} ÿÿÿÿñaI ÿÿÿÿò_ ÿÿÿÿóJf ÿÿÿÿô_A ÿÿÿÿõ!  ÿÿÿÿö?# ÿÿÿÿ÷ï ÿÿÿÿø ÿÿÿÿøàÑ ÿÿÿÿùþç ÿÿÿÿúÀ³ ÿÿÿÿûè ÿÿÿÿü{« ÿÿÿÿýÇ»ppÆ )X P¨  : 0Š é l Èþ ðN ²  Ð0 ‘ü ° qÞ ™. QÀ y 1¢ Xò #ë8ÆÍ¨ã¯øŠÑ᧬®Á‰Œ¡k lr!M"LT#a/$,6%JK& '*-'õ4) )Õ*éñ+´ø,ÉÓ-”Ú.©µ/t¼0‰—1]Ùÿÿÿµ  LMTBSTGMTBDST GMT0BST,M3.5.0/1,M10.5.0 NSTimeZones/zones/GMT+20000644000175000017500000000016614353032552014720 0ustar richardrichardTZif2TZif2 GMT+2 -2 NSTimeZones/zones/Navajo0000644000175000017500000000202214353032552015343 0ustar richardrichardTZif2TZif2aÿÿÿÿ^ °ÿÿÿÿž¦:ÿÿÿÿŸ»€ÿÿÿÿ †ÿÿÿÿ¡šé€ÿÿÿÿ¢eþÿÿÿÿ£„ÿÿÿÿ¤Eàÿÿÿÿ¤¦€ÿÿÿÿˉ ÿÿÿÿÒ#ôpÿÿÿÿÒaÿÿÿÿ÷/vÿÿÿÿø(”ÿÿÿÿùXÿÿÿÿúvÿÿÿÿúøuÿÿÿÿûèXÿÿÿÿüØWÿÿÿÿýÈ:ÿÿÿÿþ¸9ÿÿÿÿÿ¨˜‡þwýq€aPü€@û0Þ€5 À€ ­± 𢀠ࡠٿ Àƒ¹¡© ™ƒ‰‚yeidYGIF9))("E€ '€ò&â €ÒÁ뀱ê¡Í€ v!¯€"Uÿ#jÌ$5á%J®&Ã'*'þß) r)ÞÁ*êT+¾£,Óp€-ž….³R€/~g0“4€1g„2s€3Gf4Rø€5'H62Ú€7*8÷8ç 9ûÙ:Æî;Û»<° =»>ì?›@oÎA„›€BO°Cd}€D/’ED_€EóÅÿÿ”ÿÿ« ÿÿÿÿ«  ÿÿ« LMTMDTMSTMWTMPT MST7MDT,M3.2.0,M11.1.0 NSTimeZones/zones/Portugal0000644000175000017500000000265614353032552015737 0ustar richardrichardTZif2TZif2ÿÿÿÿ^= ÿÿÿÿ’掀ÿÿÿÿ›Kmpÿÿÿÿ›þÇ€ÿÿÿÿœœípÿÿÿÿɃpÿÿÿÿžrpÿÿÿÿŸª¶ðÿÿÿÿ _Tpÿÿÿÿ¡‹êpÿÿÿÿ¢AÙpÿÿÿÿ£nopÿÿÿÿ¤# ðÿÿÿÿ¥O¢ðÿÿÿÿªïpÿÿÿÿªôŽðÿÿÿÿ­É§ðÿÿÿÿ®§#ðÿÿÿÿ¯ Opÿÿÿÿ°‡ðÿÿÿÿ±‰kðÿÿÿÿ²p"pÿÿÿÿ³rˆpÿÿÿÿ´Ppÿÿÿÿ·2Lpÿÿÿÿ¸Èpÿÿÿÿ¸ÿ¹pÿÿÿÿ¹ïªpÿÿÿÿ¼È·ðÿÿÿÿ½¸¨ðÿÿÿÿ¾Ÿ_pÿÿÿÿ¿˜ŠðÿÿÿÿÀšððÿÿÿÿÁxlðÿÿÿÿÂh]ðÿÿÿÿÃXNðÿÿÿÿÄ?pÿÿÿÿÅ80ðÿÿÿÿÆ:–ðÿÿÿÿÇX¬pÿÿÿÿÇÙßpÿÿÿÿÉ/pÿÿÿÿÉñ pÿÿÿÿÊâbðÿÿÿÿ˵RðÿÿÿÿËì£àÿÿÿÿÌ€KàÿÿÿÿÌÜ¢ðÿÿÿÿÍ•4ðÿÿÿÿÍÃK`ÿÿÿÿÎr¢àÿÿÿÿÎÅ¿pÿÿÿÿÏuðÿÿÿÿϬgàÿÿÿÿÐR„àÿÿÿÿÐ¥¡pÿÿÿÿÑTøðÿÿÿÿÑŒIàÿÿÿÿÒ2fàÿÿÿÿÒ…ƒpÿÿÿÿÓYÄðÿÿÿÿÔIµðÿÿÿÿÕ9Ñ ÿÿÿÿÖ) ÿÿÿÿ׳ ÿÿÿÿØ ¤ ÿÿÿÿØù• ÿÿÿÿÙé† ÿÿÿÿÚÙw ÿÿÿÿÛÉh ÿÿÿÿܹY ÿÿÿÿݲ„ ÿÿÿÿÞ¢u ÿÿÿÿß’f ÿÿÿÿà‚W ÿÿÿÿárH ÿÿÿÿâb9 ÿÿÿÿãR* ÿÿÿÿäB ÿÿÿÿå2  ÿÿÿÿæ!ý ÿÿÿÿç) ÿÿÿÿè  ÿÿÿÿèû ÿÿÿÿéêü ÿÿÿÿêÚí ÿÿÿÿëÊÞ ÿÿÿÿìºÏ ÿÿÿÿíªÀ ÿÿÿÿîš± ÿÿÿÿ ÿÿÿÿðz“ ÿÿÿÿñj„ ÿÿÿÿòc¯ ÿÿÿÿóS  ÿÿÿÿôC‘ ÿÿÿÿõ3‚ ÿÿÿÿö#s ÿÿÿÿ÷d ÿÿÿÿøU ÿÿÿÿøóF  «* ›‹ „7€t(€d€TCû€3ú#ëÜÍó¾ã½ Ó Ñ¼½¬®œŸŒ| lr!\c"LT#Þ€?›pð@oÀ€A„pBO¢€CdopD/„€EDQpEó·ÿÿ­Ýÿÿ¹°ÿÿ« ÿÿ¹° ÿÿ¹°ÿÿ¹°LMTCDTCSTCWTCPTEST CST6CDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Phoenix0000644000175000017500000000036014353032552017103 0ustar richardrichardTZif2TZif2 ÿÿÿÿ^ °ÿÿÿÿž¦:ÿÿÿÿŸ»€ÿÿÿÿ †ÿÿÿÿ¡šé€ÿÿÿÿˉ ÿÿÿÿÏßÿÿÿÿÏå¬ÿÿÿÿÐÿÿÿÿúøuÿÿÿÿûèXÿÿ–îÿÿ« ÿÿÿÿ«  LMTMDTMSTMWT MST7 NSTimeZones/zones/America/Manaus0000644000175000017500000000063414353032552016721 0ustar richardrichardTZif2TZif2 ÿÿÿÿ–ªDÿÿÿÿ¸Wðÿÿÿÿ¸ýN°ÿÿÿÿ¹ñB@ÿÿÿÿºÞ‚0ÿÿÿÿÚ8¼@ÿÿÿÿÚì@ÿÿÿÿÜïÀÿÿÿÿܹg0ÿÿÿÿÝû#@ÿÿÿÿÞ›ì0ÿÿÿÿßݨ@ÿÿÿÿàTA0ÿÿÿÿô˜ Àÿÿÿÿõl0ÿÿÿÿöÀr@ÿÿÿÿ÷,°ÿÿÿÿøQ:@ÿÿÿÿøÇÓ0ÿÿÿÿú àÀÿÿÿÿú©°ÿÿÿÿûì@ÿÿÿÿü‹‹°Éœ@xå° CÀ 3ݰ!w@" Ö°,ÀÃ@-fÒ0ÿÿǼÿÿÕÐÿÿÇÀLMT-03-04 <-04>4 NSTimeZones/zones/America/Anchorage0000644000175000017500000000172114353032552017362 0ustar richardrichardTZif2TZif2T (ÿÿÿÿ?ÂýÑÿÿÿÿ}‡AHÿÿÿÿˉ6ÀÿÿÿÿÒ#ôpÿÿÿÿÒaB0ÿÿÿÿúÒG ÿÿÿÿþ¸c@ÿÿÿÿÿ¨F0˜E@ˆ(0x'@qD°aCÀQ&°A%À1°_À ê° ­Û@ ð̰ àËÀ Ùé0 À­À¹Ë0©Ê@™­0‰¬@y0iŽ@Yq0Ip@9S0)R@"o° 4@Q°+òB°â% Ò$°Â ²°¡é  v90!Ë "V0#jè $5ý0%JÊ &ß0'*¬ 'þû°) Ž )Þݰ*êp +¾¿°,ÓŒ -ž¡°.³n /~ƒ°0“P 1g 02s2 3G‚04S 5'd062ö 7F08 8ç(09ûõ :Ç 0;Û× <°&°=»¹ >°?›› @oê°A„· BO̰Cd™ D/®°ED{ Eóá0                        Äøÿÿsxÿÿs`ÿÿpÿÿp ÿÿs`ÿÿpÿÿpÿÿ€ÿÿp#LMTASTAWTAPTAHSTAHDTYSTAKDTAKST AKST9AKDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/St_Barthelemy0000644000175000017500000000026114353032552020233 0ustar richardrichardTZif2TZif2ÿÿÿÿz敹ÿÿÿÿËö2ÀÿÿÿÿÒ#ôpÿÿÿÿÒ`íÐÿÿÂÿÿÇÀÿÿÕÐÿÿÕÐ LMTASTAPTAWT AST4 NSTimeZones/zones/America/St_Johns0000644000175000017500000000352614353032552017227 0ustar richardrichardTZif2TZif2»ÿÿÿÿ^=4ìÿÿÿÿœÏb ÿÿÿÿ¤æüÿÿÿÿž¸~ŒÿÿÿÿŸºÖ|ÿÿÿÿ ¶ˆÜÿÿÿÿ¡8ÿLÿÿÿÿ¢•\ÿÿÿÿ£„üLÿÿÿÿ¤tû\ÿÿÿÿ¥dÞLÿÿÿÿ¦^Üÿÿÿÿ§DÀLÿÿÿÿ¨=ùÜÿÿÿÿ©$¢LÿÿÿÿªÛÜÿÿÿÿ«„Lÿÿÿÿ«ý½Üÿÿÿÿ¬äfLÿÿÿÿ­ÝŸÜÿÿÿÿ®Í‚Ìÿÿÿÿ¯½Üÿÿÿÿ°­dÌÿÿÿÿ±¦ž\ÿÿÿÿ²FÌÿÿÿÿ³†€\ÿÿÿÿ´m(Ìÿÿÿÿµfb\ÿÿÿÿ¶M Ìÿÿÿÿ·FD\ÿÿÿÿ¸,ìÌÿÿÿÿ¹&&\ÿÿÿÿº Lÿÿÿÿ»BÜÿÿÿÿ»õëLÿÿÿÿ¼ï$Üÿÿÿÿ½ÕÍLÿÿÿÿ¾žMlÿÿÿÿ¾Ï¨ÿÿÿÿ¿µ¯ÿÿÿÿÀ¸18ÿÿÿÿÁyï¨ÿÿÿÿ˜8ÿÿÿÿÃYѨÿÿÿÿÄwõ8ÿÿÿÿÅ9³¨ÿÿÿÿÆa¸ÿÿÿÿÇ•¨ÿÿÿÿÈ@ó¸ÿÿÿÿɲ(ÿÿÿÿÊ Õ¸ÿÿÿÿÊâ”(ÿÿÿÿÌ·¸ÿÿÿÿÒ#ôpÿÿÿÿÒ`æÈÿÿÿÿÓˆDØÿÿÿÿÔJHÿÿÿÿÕh&ØÿÿÿÿÖ)åHÿÿÿÿ×HØÿÿÿÿØ ÇHÿÿÿÿÙ'êØÿÿÿÿÙé©HÿÿÿÿÛXÿÿÿÿÛÒÅÈÿÿÿÿÜÞtXÿÿÿÿÝ©mHÿÿÿÿÞ¾VXÿÿÿÿ߉OHÿÿÿÿàž8Xÿÿÿÿái1Hÿÿÿÿâ~XÿÿÿÿãIHÿÿÿÿä]üXÿÿÿÿå(õHÿÿÿÿæGØÿÿÿÿçÈÿÿÿÿè&úØÿÿÿÿèñóÈÿÿÿÿêÜØÿÿÿÿêÑÕÈÿÿÿÿëæ¾Øÿÿÿÿì±·ÈÿÿÿÿíÆ ØÿÿÿÿHÿÿÿÿﯽXÿÿÿÿðŸ HÿÿÿÿñŸXÿÿÿÿò‚HÿÿÿÿóoXÿÿÿÿô_dHÿÿÿÿõOcXÿÿÿÿö?FHÿÿÿÿ÷/EXÿÿÿÿø(bÈÿÿÿÿù'XÿÿÿÿúDÈÿÿÿÿúøCØÿÿÿÿûè&ÈÿÿÿÿüØ%ØÿÿÿÿýÈÈÿÿÿÿþ¸Øÿÿÿÿÿ§êÈ—éØ‡ÌÈwËØpéH`èXPËH@ÊX0­H ¬X H ŽX ðqH àpX ÙÈ ÀRX¹oÈ©nØ™QȉPØy3Èi2ØYÈIØ8÷È(öØ"HØØöHñõXáØHÑ×XÁºH±¹X¡œH uÏô!bd"U±ô#jpÔ$5“ô%J`ä&uô'*Bä'þ’t) $ä)Þtt*êä+¾Vt,Ó#d-ž8t.³d/~t0’çd1g6ô2rÉd3Gô4R«d5&úô62d7Üô8©ä8æ¾ô9û‹ä:Æ ô;Ûmä<¯½t=»Oä>Ÿt?›1ä@otA„NdBOctCd0dD/EtEDdEówôG-.äGÓYôI äI³;ôJìòäKœXtLÖdM|:tN¶ HÿÿΔÿÿܤÿÿΔÿÿÜØÿÿÎÈÿÿÜØ ÿÿÜØÿÿêèLMTNDTNSTNPTNWTNDDT NST3:30NDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/El_Salvador0000644000175000017500000000026014353032552017663 0ustar richardrichardTZif2TZif2 ÿÿÿÿ£Õ¦ šÜà!\›P"z¾à#<}Pÿÿ¬`ÿÿ¹°ÿÿ« LMTCDTCST CST6 NSTimeZones/zones/America/Guayaquil0000644000175000017500000000026314353032552017434 0ustar richardrichardTZif2TZif2ÿÿÿÿi‡&Xÿÿÿÿ¶¤B+üÐ+qæ@ÿÿµ(ÿÿ¶hÿÿÇÀÿÿ¹° LMTQMT-04-05 <-05>5 NSTimeZones/zones/America/Argentina/0000755000175000017500000000000014353032552017457 5ustar richardrichardNSTimeZones/zones/America/Argentina/ComodRivadavia0000644000175000017500000000130414353032552022270 0ustar richardrichardTZif2TZif2=ÿÿÿÿrœ¯,ÿÿÿÿ¢’0ÿÿÿÿ¶{R@ÿÿÿÿ·ɰÿÿÿÿ¸@ÿÿÿÿ¸Ôp0ÿÿÿÿº}Àÿÿÿÿºµ£°ÿÿÿÿ»ø±@ÿÿÿÿ¼–×0ÿÿÿÿ½ÙäÀÿÿÿÿ¾x °ÿÿÿÿ¿»@ÿÿÿÿÀZ°ÿÿÿÿÁ@ÿÿÿÿÂ;Ã0ÿÿÿÿÃ~ÐÀÿÿÿÿÄö°ÿÿÿÿÅ`@ÿÿÿÿÅþ*0ÿÿÿÿÇA7ÀÿÿÿÿÇà¯0ÿÿÿÿÈ”@ÿÿÿÿÊM¡°ÿÿÿÿÊî†ÀÿÿÿÿÎMÿ0ÿÿÿÿΰíÀÿÿÿÿÓ)5°ÿÿÿÿÔCdÀÿÿÿÿô=0ÿÿÿÿôŸöÀÿÿÿÿõl0ÿÿÿÿö2@ÿÿÿÿö柰ÿÿÿÿøCÀÿÿÿÿøÇÓ0ÿÿÿÿùôw@ÿÿÿÿúÓ6°ÿÿÿÿûÃ5Àÿÿÿÿü¼S0ÿÿÿÿý¬R@ÿÿÿÿþœ50ÿÿÿÿÿŒ4@£J°$o #”µ°$” %7ò°%ðv '!0'ÐX )ÿ@)°: *àÓ0+™W 7öư8¿*°@»ñ0@Õ ÀGw °GÜ ÿÿÂTÿÿÃÐÿÿÇÀÿÿÕÐ ÿÿãàÿÿÕÐ LMTCMT-04-03-02 <-03>3 NSTimeZones/zones/America/Argentina/Ushuaia0000644000175000017500000000130414353032552020777 0ustar richardrichardTZif2TZif2=ÿÿÿÿrœ±ˆÿÿÿÿ¢’0ÿÿÿÿ¶{R@ÿÿÿÿ·ɰÿÿÿÿ¸@ÿÿÿÿ¸Ôp0ÿÿÿÿº}Àÿÿÿÿºµ£°ÿÿÿÿ»ø±@ÿÿÿÿ¼–×0ÿÿÿÿ½ÙäÀÿÿÿÿ¾x °ÿÿÿÿ¿»@ÿÿÿÿÀZ°ÿÿÿÿÁ@ÿÿÿÿÂ;Ã0ÿÿÿÿÃ~ÐÀÿÿÿÿÄö°ÿÿÿÿÅ`@ÿÿÿÿÅþ*0ÿÿÿÿÇA7ÀÿÿÿÿÇà¯0ÿÿÿÿÈ”@ÿÿÿÿÊM¡°ÿÿÿÿÊî†ÀÿÿÿÿÎMÿ0ÿÿÿÿΰíÀÿÿÿÿÓ)5°ÿÿÿÿÔCdÀÿÿÿÿô=0ÿÿÿÿôŸöÀÿÿÿÿõl0ÿÿÿÿö2@ÿÿÿÿö柰ÿÿÿÿøCÀÿÿÿÿøÇÓ0ÿÿÿÿùôw@ÿÿÿÿúÓ6°ÿÿÿÿûÃ5Àÿÿÿÿü¼S0ÿÿÿÿý¬R@ÿÿÿÿþœ50ÿÿÿÿÿŒ4@£J°$o #”µ°$” %7ò°%ðv '!0'ÐX )ñ0)°: *àÓ0+™W 7öư8¿*°@¹N0@Õ ÀGw °GÜ ÿÿ¿øÿÿÃÐÿÿÇÀÿÿÕÐ ÿÿãàÿÿÕÐ LMTCMT-04-03-02 <-03>3 NSTimeZones/zones/America/Argentina/La_Rioja0000644000175000017500000000131514353032552021062 0ustar richardrichardTZif2TZif2>ÿÿÿÿrœ°,ÿÿÿÿ¢’0ÿÿÿÿ¶{R@ÿÿÿÿ·ɰÿÿÿÿ¸@ÿÿÿÿ¸Ôp0ÿÿÿÿº}Àÿÿÿÿºµ£°ÿÿÿÿ»ø±@ÿÿÿÿ¼–×0ÿÿÿÿ½ÙäÀÿÿÿÿ¾x °ÿÿÿÿ¿»@ÿÿÿÿÀZ°ÿÿÿÿÁ@ÿÿÿÿÂ;Ã0ÿÿÿÿÃ~ÐÀÿÿÿÿÄö°ÿÿÿÿÅ`@ÿÿÿÿÅþ*0ÿÿÿÿÇA7ÀÿÿÿÿÇà¯0ÿÿÿÿÈ”@ÿÿÿÿÊM¡°ÿÿÿÿÊî†ÀÿÿÿÿÎMÿ0ÿÿÿÿΰíÀÿÿÿÿÓ)5°ÿÿÿÿÔCdÀÿÿÿÿô=0ÿÿÿÿôŸöÀÿÿÿÿõl0ÿÿÿÿö2@ÿÿÿÿö柰ÿÿÿÿøCÀÿÿÿÿøÇÓ0ÿÿÿÿùôw@ÿÿÿÿúÓ6°ÿÿÿÿûÃ5Àÿÿÿÿü¼S0ÿÿÿÿý¬R@ÿÿÿÿþœ50ÿÿÿÿÿŒ4@£J°$o #”µ°$” %7ò°%ðv '!0'͵ (&&@)ñ0)°: *àÓ0+™W 7öư8¿*°@»ñ0@Õ ÀGw °GÜ ÿÿÁTÿÿÃÐÿÿÇÀÿÿÕÐ ÿÿãàÿÿÕÐ LMTCMT-04-03-02 <-03>3 NSTimeZones/zones/America/Argentina/Catamarca0000644000175000017500000000130414353032552021254 0ustar richardrichardTZif2TZif2=ÿÿÿÿrœ¯,ÿÿÿÿ¢’0ÿÿÿÿ¶{R@ÿÿÿÿ·ɰÿÿÿÿ¸@ÿÿÿÿ¸Ôp0ÿÿÿÿº}Àÿÿÿÿºµ£°ÿÿÿÿ»ø±@ÿÿÿÿ¼–×0ÿÿÿÿ½ÙäÀÿÿÿÿ¾x °ÿÿÿÿ¿»@ÿÿÿÿÀZ°ÿÿÿÿÁ@ÿÿÿÿÂ;Ã0ÿÿÿÿÃ~ÐÀÿÿÿÿÄö°ÿÿÿÿÅ`@ÿÿÿÿÅþ*0ÿÿÿÿÇA7ÀÿÿÿÿÇà¯0ÿÿÿÿÈ”@ÿÿÿÿÊM¡°ÿÿÿÿÊî†ÀÿÿÿÿÎMÿ0ÿÿÿÿΰíÀÿÿÿÿÓ)5°ÿÿÿÿÔCdÀÿÿÿÿô=0ÿÿÿÿôŸöÀÿÿÿÿõl0ÿÿÿÿö2@ÿÿÿÿö柰ÿÿÿÿøCÀÿÿÿÿøÇÓ0ÿÿÿÿùôw@ÿÿÿÿúÓ6°ÿÿÿÿûÃ5Àÿÿÿÿü¼S0ÿÿÿÿý¬R@ÿÿÿÿþœ50ÿÿÿÿÿŒ4@£J°$o #”µ°$” %7ò°%ðv '!0'ÐX )ÿ@)°: *àÓ0+™W 7öư8¿*°@»ñ0@Õ ÀGw °GÜ ÿÿÂTÿÿÃÐÿÿÇÀÿÿÕÐ ÿÿãàÿÿÕÐ LMTCMT-04-03-02 <-03>3 NSTimeZones/zones/America/Argentina/Cordoba0000644000175000017500000000130414353032552020751 0ustar richardrichardTZif2TZif2=ÿÿÿÿrœ­°ÿÿÿÿ¢’0ÿÿÿÿ¶{R@ÿÿÿÿ·ɰÿÿÿÿ¸@ÿÿÿÿ¸Ôp0ÿÿÿÿº}Àÿÿÿÿºµ£°ÿÿÿÿ»ø±@ÿÿÿÿ¼–×0ÿÿÿÿ½ÙäÀÿÿÿÿ¾x °ÿÿÿÿ¿»@ÿÿÿÿÀZ°ÿÿÿÿÁ@ÿÿÿÿÂ;Ã0ÿÿÿÿÃ~ÐÀÿÿÿÿÄö°ÿÿÿÿÅ`@ÿÿÿÿÅþ*0ÿÿÿÿÇA7ÀÿÿÿÿÇà¯0ÿÿÿÿÈ”@ÿÿÿÿÊM¡°ÿÿÿÿÊî†ÀÿÿÿÿÎMÿ0ÿÿÿÿΰíÀÿÿÿÿÓ)5°ÿÿÿÿÔCdÀÿÿÿÿô=0ÿÿÿÿôŸöÀÿÿÿÿõl0ÿÿÿÿö2@ÿÿÿÿö柰ÿÿÿÿøCÀÿÿÿÿøÇÓ0ÿÿÿÿùôw@ÿÿÿÿúÓ6°ÿÿÿÿûÃ5Àÿÿÿÿü¼S0ÿÿÿÿý¬R@ÿÿÿÿþœ50ÿÿÿÿÿŒ4@£J°$o #”µ°$” %7ò°%ðv '!0'ÐX )ÿ@)°: *àÓ0+™W 7öư8¿*°Gw °GÜ Hú¢°I¼a ÿÿÃÐÿÿÃÐÿÿÇÀÿÿÕÐ ÿÿãàÿÿÕÐ LMTCMT-04-03-02 <-03>3 NSTimeZones/zones/America/Argentina/Buenos_Aires0000644000175000017500000000130414353032552021756 0ustar richardrichardTZif2TZif2=ÿÿÿÿrœ¨Lÿÿÿÿ¢’0ÿÿÿÿ¶{R@ÿÿÿÿ·ɰÿÿÿÿ¸@ÿÿÿÿ¸Ôp0ÿÿÿÿº}Àÿÿÿÿºµ£°ÿÿÿÿ»ø±@ÿÿÿÿ¼–×0ÿÿÿÿ½ÙäÀÿÿÿÿ¾x °ÿÿÿÿ¿»@ÿÿÿÿÀZ°ÿÿÿÿÁ@ÿÿÿÿÂ;Ã0ÿÿÿÿÃ~ÐÀÿÿÿÿÄö°ÿÿÿÿÅ`@ÿÿÿÿÅþ*0ÿÿÿÿÇA7ÀÿÿÿÿÇà¯0ÿÿÿÿÈ”@ÿÿÿÿÊM¡°ÿÿÿÿÊî†ÀÿÿÿÿÎMÿ0ÿÿÿÿΰíÀÿÿÿÿÓ)5°ÿÿÿÿÔCdÀÿÿÿÿô=0ÿÿÿÿôŸöÀÿÿÿÿõl0ÿÿÿÿö2@ÿÿÿÿö柰ÿÿÿÿøCÀÿÿÿÿøÇÓ0ÿÿÿÿùôw@ÿÿÿÿúÓ6°ÿÿÿÿûÃ5Àÿÿÿÿü¼S0ÿÿÿÿý¬R@ÿÿÿÿþœ50ÿÿÿÿÿŒ4@£J°$o #”µ°$” %7ò°%ðv '!0'ÐX )ñ0)°: *àÓ0+™W 7öư8¿*°Gw °GÜ Hú¢°I¼a ÿÿÉ4ÿÿÃÐÿÿÇÀÿÿÕÐ ÿÿãàÿÿÕÐ LMTCMT-04-03-02 <-03>3 NSTimeZones/zones/America/Argentina/San_Luis0000644000175000017500000000131514353032552021117 0ustar richardrichardTZif2TZif2>ÿÿÿÿrœ¯´ÿÿÿÿ¢’0ÿÿÿÿ¶{R@ÿÿÿÿ·ɰÿÿÿÿ¸@ÿÿÿÿ¸Ôp0ÿÿÿÿº}Àÿÿÿÿºµ£°ÿÿÿÿ»ø±@ÿÿÿÿ¼–×0ÿÿÿÿ½ÙäÀÿÿÿÿ¾x °ÿÿÿÿ¿»@ÿÿÿÿÀZ°ÿÿÿÿÁ@ÿÿÿÿÂ;Ã0ÿÿÿÿÃ~ÐÀÿÿÿÿÄö°ÿÿÿÿÅ`@ÿÿÿÿÅþ*0ÿÿÿÿÇA7ÀÿÿÿÿÇà¯0ÿÿÿÿÈ”@ÿÿÿÿÊM¡°ÿÿÿÿÊî†ÀÿÿÿÿÎMÿ0ÿÿÿÿΰíÀÿÿÿÿÓ)5°ÿÿÿÿÔCdÀÿÿÿÿô=0ÿÿÿÿôŸöÀÿÿÿÿõl0ÿÿÿÿö2@ÿÿÿÿö柰ÿÿÿÿøCÀÿÿÿÿøÇÓ0ÿÿÿÿùôw@ÿÿÿÿúÓ6°ÿÿÿÿûÃ5Àÿÿÿÿü¼S0ÿÿÿÿý¬R@ÿÿÿÿþœ50ÿÿÿÿÿŒ4@£J°$o #”µ°$” %7ò°%ý¥ '4@'Íð(GÀ7öư8¿*°@ºŸ°A0@Gw °G“ü GÓR°Hñv@I³4°JÑX@ÿÿÁÌÿÿÃÐÿÿÇÀÿÿÕÐ ÿÿãàÿÿÕÐ LMTCMT-04-03-02 <-03>3 NSTimeZones/zones/America/Argentina/Salta0000644000175000017500000000126214353032552020447 0ustar richardrichardTZif2TZif2;ÿÿÿÿrœ®Ôÿÿÿÿ¢’0ÿÿÿÿ¶{R@ÿÿÿÿ·ɰÿÿÿÿ¸@ÿÿÿÿ¸Ôp0ÿÿÿÿº}Àÿÿÿÿºµ£°ÿÿÿÿ»ø±@ÿÿÿÿ¼–×0ÿÿÿÿ½ÙäÀÿÿÿÿ¾x °ÿÿÿÿ¿»@ÿÿÿÿÀZ°ÿÿÿÿÁ@ÿÿÿÿÂ;Ã0ÿÿÿÿÃ~ÐÀÿÿÿÿÄö°ÿÿÿÿÅ`@ÿÿÿÿÅþ*0ÿÿÿÿÇA7ÀÿÿÿÿÇà¯0ÿÿÿÿÈ”@ÿÿÿÿÊM¡°ÿÿÿÿÊî†ÀÿÿÿÿÎMÿ0ÿÿÿÿΰíÀÿÿÿÿÓ)5°ÿÿÿÿÔCdÀÿÿÿÿô=0ÿÿÿÿôŸöÀÿÿÿÿõl0ÿÿÿÿö2@ÿÿÿÿö柰ÿÿÿÿøCÀÿÿÿÿøÇÓ0ÿÿÿÿùôw@ÿÿÿÿúÓ6°ÿÿÿÿûÃ5Àÿÿÿÿü¼S0ÿÿÿÿý¬R@ÿÿÿÿþœ50ÿÿÿÿÿŒ4@£J°$o #”µ°$” %7ò°%ðv '!0'ÐX )ÿ@)°: *àÓ0+™W 7öư8¿*°Gw °GÜ ÿÿ¬ÿÿÃÐÿÿÇÀÿÿÕÐ ÿÿãàÿÿÕÐ LMTCMT-04-03-02 <-03>3 NSTimeZones/zones/America/Argentina/San_Juan0000644000175000017500000000131514353032552021100 0ustar richardrichardTZif2TZif2>ÿÿÿÿrœ±¼ÿÿÿÿ¢’0ÿÿÿÿ¶{R@ÿÿÿÿ·ɰÿÿÿÿ¸@ÿÿÿÿ¸Ôp0ÿÿÿÿº}Àÿÿÿÿºµ£°ÿÿÿÿ»ø±@ÿÿÿÿ¼–×0ÿÿÿÿ½ÙäÀÿÿÿÿ¾x °ÿÿÿÿ¿»@ÿÿÿÿÀZ°ÿÿÿÿÁ@ÿÿÿÿÂ;Ã0ÿÿÿÿÃ~ÐÀÿÿÿÿÄö°ÿÿÿÿÅ`@ÿÿÿÿÅþ*0ÿÿÿÿÇA7ÀÿÿÿÿÇà¯0ÿÿÿÿÈ”@ÿÿÿÿÊM¡°ÿÿÿÿÊî†ÀÿÿÿÿÎMÿ0ÿÿÿÿΰíÀÿÿÿÿÓ)5°ÿÿÿÿÔCdÀÿÿÿÿô=0ÿÿÿÿôŸöÀÿÿÿÿõl0ÿÿÿÿö2@ÿÿÿÿö柰ÿÿÿÿøCÀÿÿÿÿøÇÓ0ÿÿÿÿùôw@ÿÿÿÿúÓ6°ÿÿÿÿûÃ5Àÿÿÿÿü¼S0ÿÿÿÿý¬R@ÿÿÿÿþœ50ÿÿÿÿÿŒ4@£J°$o #”µ°$” %7ò°%ðv '!0'͵ (&&@)ñ0)°: *àÓ0+™W 7öư8¿*°@ºŸ°A0@Gw °GÜ ÿÿ¿ÄÿÿÃÐÿÿÇÀÿÿÕÐ ÿÿãàÿÿÕÐ LMTCMT-04-03-02 <-03>3 NSTimeZones/zones/America/Argentina/Tucuman0000644000175000017500000000132614353032552021020 0ustar richardrichardTZif2TZif2?ÿÿÿÿrœ®¤ÿÿÿÿ¢’0ÿÿÿÿ¶{R@ÿÿÿÿ·ɰÿÿÿÿ¸@ÿÿÿÿ¸Ôp0ÿÿÿÿº}Àÿÿÿÿºµ£°ÿÿÿÿ»ø±@ÿÿÿÿ¼–×0ÿÿÿÿ½ÙäÀÿÿÿÿ¾x °ÿÿÿÿ¿»@ÿÿÿÿÀZ°ÿÿÿÿÁ@ÿÿÿÿÂ;Ã0ÿÿÿÿÃ~ÐÀÿÿÿÿÄö°ÿÿÿÿÅ`@ÿÿÿÿÅþ*0ÿÿÿÿÇA7ÀÿÿÿÿÇà¯0ÿÿÿÿÈ”@ÿÿÿÿÊM¡°ÿÿÿÿÊî†ÀÿÿÿÿÎMÿ0ÿÿÿÿΰíÀÿÿÿÿÓ)5°ÿÿÿÿÔCdÀÿÿÿÿô=0ÿÿÿÿôŸöÀÿÿÿÿõl0ÿÿÿÿö2@ÿÿÿÿö柰ÿÿÿÿøCÀÿÿÿÿøÇÓ0ÿÿÿÿùôw@ÿÿÿÿúÓ6°ÿÿÿÿûÃ5Àÿÿÿÿü¼S0ÿÿÿÿý¬R@ÿÿÿÿþœ50ÿÿÿÿÿŒ4@£J°$o #”µ°$” %7ò°%ðv '!0'ÐX )ÿ@)°: *àÓ0+™W 7öư8¿*°@»ñ0@ËÑ@Gw °GÜ Hú¢°I¼a ÿÿÂÜÿÿÃÐÿÿÇÀÿÿÕÐ ÿÿãàÿÿÕÐ LMTCMT-04-03-02 <-03>3 NSTimeZones/zones/America/Argentina/Mendoza0000644000175000017500000000130414353032552020775 0ustar richardrichardTZif2TZif2=ÿÿÿÿrœ²ÿÿÿÿ¢’0ÿÿÿÿ¶{R@ÿÿÿÿ·ɰÿÿÿÿ¸@ÿÿÿÿ¸Ôp0ÿÿÿÿº}Àÿÿÿÿºµ£°ÿÿÿÿ»ø±@ÿÿÿÿ¼–×0ÿÿÿÿ½ÙäÀÿÿÿÿ¾x °ÿÿÿÿ¿»@ÿÿÿÿÀZ°ÿÿÿÿÁ@ÿÿÿÿÂ;Ã0ÿÿÿÿÃ~ÐÀÿÿÿÿÄö°ÿÿÿÿÅ`@ÿÿÿÿÅþ*0ÿÿÿÿÇA7ÀÿÿÿÿÇà¯0ÿÿÿÿÈ”@ÿÿÿÿÊM¡°ÿÿÿÿÊî†ÀÿÿÿÿÎMÿ0ÿÿÿÿΰíÀÿÿÿÿÓ)5°ÿÿÿÿÔCdÀÿÿÿÿô=0ÿÿÿÿôŸöÀÿÿÿÿõl0ÿÿÿÿö2@ÿÿÿÿö柰ÿÿÿÿøCÀÿÿÿÿøÇÓ0ÿÿÿÿùôw@ÿÿÿÿúÓ6°ÿÿÿÿûÃ5Àÿÿÿÿü¼S0ÿÿÿÿý¬R@ÿÿÿÿþœ50ÿÿÿÿÿŒ4@£J°$o #”µ°$” %7ò°%ðv '4@'Íð(úgÀ)°H°*àá@+™W 7öư8¿*°@°°AV>ÀGw °GÜ ÿÿ¿|ÿÿÃÐÿÿÇÀÿÿÕÐ ÿÿãàÿÿÕÐ LMTCMT-04-03-02 <-03>3 NSTimeZones/zones/America/Argentina/Jujuy0000644000175000017500000000126214353032552020511 0ustar richardrichardTZif2TZif2;ÿÿÿÿrœ®¸ÿÿÿÿ¢’0ÿÿÿÿ¶{R@ÿÿÿÿ·ɰÿÿÿÿ¸@ÿÿÿÿ¸Ôp0ÿÿÿÿº}Àÿÿÿÿºµ£°ÿÿÿÿ»ø±@ÿÿÿÿ¼–×0ÿÿÿÿ½ÙäÀÿÿÿÿ¾x °ÿÿÿÿ¿»@ÿÿÿÿÀZ°ÿÿÿÿÁ@ÿÿÿÿÂ;Ã0ÿÿÿÿÃ~ÐÀÿÿÿÿÄö°ÿÿÿÿÅ`@ÿÿÿÿÅþ*0ÿÿÿÿÇA7ÀÿÿÿÿÇà¯0ÿÿÿÿÈ”@ÿÿÿÿÊM¡°ÿÿÿÿÊî†ÀÿÿÿÿÎMÿ0ÿÿÿÿΰíÀÿÿÿÿÓ)5°ÿÿÿÿÔCdÀÿÿÿÿô=0ÿÿÿÿôŸöÀÿÿÿÿõl0ÿÿÿÿö2@ÿÿÿÿö柰ÿÿÿÿøCÀÿÿÿÿøÇÓ0ÿÿÿÿùôw@ÿÿÿÿúÓ6°ÿÿÿÿûÃ5Àÿÿÿÿü¼S0ÿÿÿÿý¬R@ÿÿÿÿþœ50ÿÿÿÿÿŒ4@£J°$o #”µ°$” %7ò°%ðv '*WÀ'âÛ°(îŠ@)°: *àÓ0+™W 7öư8¿*°Gw °GÜ ÿÿÂÈÿÿÃÐÿÿÇÀÿÿÕÐ ÿÿãàÿÿÕÐ LMTCMT-04-03-02 <-03>3 NSTimeZones/zones/America/Argentina/Rio_Gallegos0000644000175000017500000000130414353032552021746 0ustar richardrichardTZif2TZif2=ÿÿÿÿrœ²dÿÿÿÿ¢’0ÿÿÿÿ¶{R@ÿÿÿÿ·ɰÿÿÿÿ¸@ÿÿÿÿ¸Ôp0ÿÿÿÿº}Àÿÿÿÿºµ£°ÿÿÿÿ»ø±@ÿÿÿÿ¼–×0ÿÿÿÿ½ÙäÀÿÿÿÿ¾x °ÿÿÿÿ¿»@ÿÿÿÿÀZ°ÿÿÿÿÁ@ÿÿÿÿÂ;Ã0ÿÿÿÿÃ~ÐÀÿÿÿÿÄö°ÿÿÿÿÅ`@ÿÿÿÿÅþ*0ÿÿÿÿÇA7ÀÿÿÿÿÇà¯0ÿÿÿÿÈ”@ÿÿÿÿÊM¡°ÿÿÿÿÊî†ÀÿÿÿÿÎMÿ0ÿÿÿÿΰíÀÿÿÿÿÓ)5°ÿÿÿÿÔCdÀÿÿÿÿô=0ÿÿÿÿôŸöÀÿÿÿÿõl0ÿÿÿÿö2@ÿÿÿÿö柰ÿÿÿÿøCÀÿÿÿÿøÇÓ0ÿÿÿÿùôw@ÿÿÿÿúÓ6°ÿÿÿÿûÃ5Àÿÿÿÿü¼S0ÿÿÿÿý¬R@ÿÿÿÿþœ50ÿÿÿÿÿŒ4@£J°$o #”µ°$” %7ò°%ðv '!0'ÐX )ñ0)°: *àÓ0+™W 7öư8¿*°@»ñ0@Õ ÀGw °GÜ ÿÿ¿ÿÿÃÐÿÿÇÀÿÿÕÐ ÿÿãàÿÿÕÐ LMTCMT-04-03-02 <-03>3 NSTimeZones/zones/America/Rankin_Inlet0000644000175000017500000000144714353032552020055 0ustar richardrichardTZif2TZif2HÿÿÿÿçŒna €Pîp@í€0Ðp Ï€ ²p ±€ ð”p à“€ Ù°ð Àu€¹’ð©’™tð‰tyVðiVY8ðI89ð)"7püpò€áûpÑú€ÁÝp±Ü€¡¿p v!¡p"Uñ#j½ð$5Ó%JŸð&µ'*ð'þÑ€) cð)Þ³€*êEð+¾•€,Óbp-žw€.³Dp/~Y€0“&p1gv2sp3GX4Rêp5':62Ìp78èð8æþ9ûÊð:Æà;Û¬ð<¯ü€=»Žð>Þ€?›pð@oÀ€A„pBO¢€CdopD/„€EDQpEó·ÿÿ¹°ÿÿ« ÿÿ¹° -00CDTCSTEST CST6CDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Shiprock0000644000175000017500000000202214353032552017250 0ustar richardrichardTZif2TZif2aÿÿÿÿ^ °ÿÿÿÿž¦:ÿÿÿÿŸ»€ÿÿÿÿ †ÿÿÿÿ¡šé€ÿÿÿÿ¢eþÿÿÿÿ£„ÿÿÿÿ¤Eàÿÿÿÿ¤¦€ÿÿÿÿˉ ÿÿÿÿÒ#ôpÿÿÿÿÒaÿÿÿÿ÷/vÿÿÿÿø(”ÿÿÿÿùXÿÿÿÿúvÿÿÿÿúøuÿÿÿÿûèXÿÿÿÿüØWÿÿÿÿýÈ:ÿÿÿÿþ¸9ÿÿÿÿÿ¨˜‡þwýq€aPü€@û0Þ€5 À€ ­± 𢀠ࡠٿ Àƒ¹¡© ™ƒ‰‚yeidYGIF9))("E€ '€ò&â €ÒÁ뀱ê¡Í€ v!¯€"Uÿ#jÌ$5á%J®&Ã'*'þß) r)ÞÁ*êT+¾£,Óp€-ž….³R€/~g0“4€1g„2s€3Gf4Rø€5'H62Ú€7*8÷8ç 9ûÙ:Æî;Û»<° =»>ì?›@oÎA„›€BO°Cd}€D/’ED_€EóÅÿÿ”ÿÿ« ÿÿÿÿ«  ÿÿ« LMTMDTMSTMWTMPT MST7MDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Knox_IN0000644000175000017500000000177014353032552017004 0ustar richardrichardTZif2TZif2]ÿÿÿÿ^þ ÿÿÿÿž¦,€ÿÿÿÿŸºùpÿÿÿÿ †€ÿÿÿÿ¡šÛpÿÿÿÿˈþ€ÿÿÿÿÒ#ôpÿÿÿÿÒa ðÿÿÿÿÕUÕÿÿÿÿÖ Íðÿÿÿÿ×5·ÿÿÿÿدðÿÿÿÿÙ™ÿÿÿÿÙà‘ðÿÿÿÿÚþµ€ÿÿÿÿÛÀsðÿÿÿÿÜÞ—€ÿÿÿÿÝ©pÿÿÿÿÞ¾y€ÿÿÿÿ߉rpÿÿÿÿàž[€ÿÿÿÿáiTpÿÿÿÿâ~=€ÿÿÿÿãI6pÿÿÿÿä^€ÿÿÿÿåW<ðÿÿÿÿæG<ÿÿÿÿç7ðÿÿÿÿè'ÿÿÿÿèòðÿÿÿÿêÿÿÿÿêÑøðÿÿÿÿëæâÿÿÿÿìÖÄðÿÿÿÿíÆÄÿÿÿÿî¿ápÿÿÿÿï¯à€ÿÿÿÿðŸÃpÿÿÿÿñ€ÿÿÿÿô_‡pÿÿÿÿúøgÿÿÿÿûèIðÿÿÿÿüØIÿÿÿÿýÈ+ðÿÿÿÿþ¸+ÿÿÿÿÿ¨ 𘠇ïðwïq pa €Pîp@í€0Ðp'€ ²p ­£ ð”p à“€ Ù°ð Àu€¹’ð©’™tð‰tyVðiVY8ðI89ð)"7püpò€áûpÑú€ÁÝp±Ü€¡¿p v!¡p"Uñ#j½ð$5Ó%JŸð&µ'*ð'þÑ€) cðD/vpEDQpEó·ÿÿ®Êÿÿ¹°ÿÿ« ÿÿ¹° ÿÿ¹°ÿÿ¹°LMTCDTCSTCWTCPTEST CST6CDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Thule0000644000175000017500000000070714353032552016557 0ustar richardrichardTZif2TZif2" ÿÿÿÿ›€wü'õzà(å]Ð)Õ\à*Å?Ð+¾y`,ÓFP-ž[`.³(P/~=`0“ P1gYà2rìP3G;à4RÎP5'à62°P7ÿà8ÌÐ8æáà9û®Ð:ÆÃà;ÛÐ<¯à`=»rÐ>Â`?›TÐ@o¤`A„qPBO†`CdSPD/h`ED5PEóšàÿÿ¿„ÿÿÕÐÿÿÇÀLMTADTAST AST4ADT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Metlakatla0000644000175000017500000000112314353032552017546 0ustar richardrichardTZif2TZif2,ÿÿÿÿ?ÂýÑÿÿÿÿ}‡0ÿÿÿÿˉ ÿÿÿÿÒ#ôpÿÿÿÿÒa&ÿÿÿÿþ¸G ÿÿÿÿÿ¨*˜) ˆ x q(a' Q A  0ìC  Î ­¿ ð° ௠ ÙÍ À‘ ¹¯©® ™‘‰ ysir YUIT 97)6 "S  5V5â VåH0Xÿ XÅ*0Yþá Z¥ 0[Þà \DF \„î0Ö&ÿÿ„¦ÿÿ€ÿÿÿÿ ÿÿÿÿpÿÿ€LMTPSTPWTPPTPDTAKSTAKDT AKST9AKDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Nipigon0000644000175000017500000000326514353032552017103 0ustar richardrichardTZif2TZif2¬ÿÿÿÿrîxìÿÿÿÿž¸“pÿÿÿÿŸºë`ÿÿÿÿ ‡.Èÿÿÿÿ¡š±@ÿÿÿÿ¢”ðÿÿÿÿ£U©@ÿÿÿÿ¤†]ðÿÿÿÿ¥(x`ÿÿÿÿ¦f?ðÿÿÿÿ§ Nàÿÿÿÿ¨F!ðÿÿÿÿ¨ì0àÿÿÿÿªÉpÿÿÿÿªÕM`ÿÿÿÿ«ü«pÿÿÿÿ¬µ/`ÿÿÿÿ­Üpÿÿÿÿ®•`ÿÿÿÿ¯¼opÿÿÿÿ°~-àÿÿÿÿ±œQpÿÿÿÿ²gJ`ÿÿÿÿ³|3pÿÿÿÿ´G,`ÿÿÿÿµ\pÿÿÿÿ¶'`ÿÿÿÿ·;÷pÿÿÿÿ¸ð`ÿÿÿÿ¹%ðÿÿÿÿ¹æÒ`ÿÿÿÿ»õðÿÿÿÿ»Ïîàÿÿÿÿ¼ä×ðÿÿÿÿ½¯Ðàÿÿÿÿ¾Ä¹ðÿÿÿÿ¿²àÿÿÿÿÀ¤›ðÿÿÿÿÁo”àÿÿÿÿ„}ðÿÿÿÿÃOvàÿÿÿÿÄd_ðÿÿÿÿÅ/XàÿÿÿÿÆM|pÿÿÿÿÇ:àÿÿÿÿÈ-^pÿÿÿÿˈðpÿÿÿÿÒ#ôpÿÿÿÿÒ`ûàÿÿÿÿÓuäðÿÿÿÿÔ@ÝàÿÿÿÿÕUªÐÿÿÿÿÖ £Àÿÿÿÿ×5ŒÐÿÿÿÿØ…ÀÿÿÿÿÙnÐÿÿÿÿÚ3v@ÿÿÿÿÚþ§pÿÿÿÿÜt`ÿÿÿÿÜÞ‰pÿÿÿÿÝ©‚`ÿÿÿÿÞ¾kpÿÿÿÿ߉d`ÿÿÿÿàžMpÿÿÿÿáiF`ÿÿÿÿâ~/pÿÿÿÿãI(`ÿÿÿÿä^pÿÿÿÿå) `ÿÿÿÿæG-ðÿÿÿÿç&àÿÿÿÿè'ðÿÿÿÿéòàÿÿÿÿêñðÿÿÿÿêöÔàÿÿÿÿëæÓðÿÿÿÿìÖ¶àÿÿÿÿíÆµðÿÿÿÿî¿Ó`ÿÿÿÿï¯ÒpÿÿÿÿðŸµ`ÿÿÿÿñ´pÿÿÿÿò—`ÿÿÿÿóo–pÿÿÿÿô_y`ÿÿÿÿõOxpÿÿÿÿö?[`ÿÿÿÿ÷/Zpÿÿÿÿø(wàÿÿÿÿùÐp?›bà@o²pA„`BO”pCda`D/vpEDC`Eó¨ðÿÿµ”ÿÿÇÀÿÿ¹°ÿÿÇÀ ÿÿÇÀLMTEDTESTEWTEPT EST5EDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Juneau0000644000175000017500000000170614353032552016725 0ustar richardrichardTZif2TZif2S &ÿÿÿÿ?ÂýÑÿÿÿÿ}‡2Åÿÿÿÿˉ ÿÿÿÿÒ#ôpÿÿÿÿÒa&ÿÿÿÿþ¸G ÿÿÿÿÿ¨*˜) ˆ x q(a' Q A  0ìC  Î ­¿ ð° ௠ ÙÍ À‘ ¹¯©® ™‘‰ ysir Yc IT 97)6 "S  5+òB°â% Ò$°Â ²°¡é  v90!Ë "V0#jè $5ý0%JÊ &ß0'*¬ 'þû°) Ž )Þݰ*êp +¾¿°,ÓŒ -ž¡°.³n /~ƒ°0“P 1g 02s2 3G‚04S 5'd062ö 7F08 8ç(09ûõ :Ç 0;Û× <°&°=»¹ >°?›› @oê°A„· BO̰Cd™ D/®°ED{ Eóá0                        Ó{ÿÿûÿÿ€ÿÿÿÿ ÿÿÿÿ€ÿÿpÿÿ€ÿÿp!LMTPSTPWTPPTPDTYDTYSTAKDTAKST AKST9AKDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Cancun0000644000175000017500000000102114353032552016673 0ustar richardrichardTZif2TZif2*ÿÿÿÿ¥¶Ú`†Õ`1ggð2rú`3GIð4RÜ`5'+ð5Ä`62Ìp78èð8æþ9ûÊð:õ€;¶Âð<¯ü€=»Žð>Þ€?›pð@oÀ€A„pBO¢€CdopD/„€EDQpFf€G$3pGøƒIpIØeJã÷pK¸GLÍðM˜)N¬õðOx PŒ×ðQa'€Rl¹ðSA €TL›ðTÍÝÿÿ®¨ÿÿ« ÿÿÇÀÿÿ¹° ÿÿ¹°LMTCSTEDTESTCDT EST5 NSTimeZones/zones/America/Lima0000644000175000017500000000043314353032552016354 0ustar richardrichardTZif2TZif2 ÿÿÿÿi‡#¼ÿÿÿÿŒt@ÔÿÿÿÿÃÏJPÿÿÿÿÄEã@ÿÿÿÿÅ/JÐÿÿÿÿÆ-ÀÿÿÿÿÇ,ÐÿÿÿÿÇÿÀÄP]@ù÷Ð pÀ%žãÐ&|À-%P-›œ@ÿÿ·Äÿÿ·¬ÿÿÇÀÿÿ¹°LMT-04-05 <-05>5 NSTimeZones/zones/America/Punta_Arenas0000644000175000017500000000230214353032552020047 0ustar richardrichardTZif2TZif2uÿÿÿÿi‡üÿÿÿÿ0GEÿÿÿÿ›\åPÿÿÿÿŸ|âÅÿÿÿÿ¡qÀÿÿÿÿ°^wÅÿÿÿÿ±w=@ÿÿÿÿ²AÐÿÿÿÿ³XpÀÿÿÿÿ´"4Pÿÿÿÿµ9¤@ÿÿÿÿ¶gÐÿÿÿÿ·×Àÿÿÿÿ·ä›Pÿÿÿÿ¸ý\Àÿÿÿÿ¹Ç PÿÿÿÿÌn@ÿÿÿÿÌlçÐÿÿÿÿÔã@ÿÿÿÿÕ3UÀÿÿÿÿÕv’@ÿÿÿÿýÑ<@ÿÿÿÿþ’ú°ÿÿÿÿÿÌÍÀrܰuPÀ@I°U2À +°>O@ ° ¼@ßï°þ@ ¿Ñ° Ýõ@ ¨î0 ½×@ ˆÐ0¹@h²0†ÕÀH”0f·À(v0F™À’°&{Àñt°]ÀÑV°æ?À±8°Ï\@‘°¯>@pü° @ 0!o@"9û0#Nä@$Ý0%8À%ù¿0&òøÀ'Ù¡0(÷ÄÀ)½°*צÀ+¢Ÿ°,·ˆÀ-‚°.—jÀ/bc°0€‡@1BE°2`i@3=×04@K@5 D06 ¸@7Õ°8@8Ë09é+À:ªê0;É À<ŠÌ0=¨ïÀ>j®0?ˆÑÀ@SʰAh³ÀB3¬°CH•ÀDްE1²@Eóp°G”@Gï0Hñv@I¼o0JÑX@K¸°L±:@MÆ0NP‚ÀOœ®°PBÙÀQ|°R+ö@S\r°T Ø@W7æ0W¯ìÀXC†°ÿÿ½„ÿÿ½»ÿÿ¹°ÿÿÇÀ ÿÿÇÀ ÿÿÕÐÿÿÕÐLMTSMT-05-04-03 <-03>3 NSTimeZones/zones/America/Danmarkshavn0000644000175000017500000000067714353032552020121 0ustar richardrichardTZif2TZif2"ÿÿÿÿ›€IM|P3ú#ëÜÍó¾ã¯Ó Ñ¼½¬®œŸŒ| lr!\c"LT#2 NSTimeZones/zones/America/Martinique0000644000175000017500000000026214353032552017610 0ustar richardrichardTZif2TZif2ÿÿÿÿi‡Äÿÿÿÿ‘£ÈDMn@4°ÿÿƼÿÿƼÿÿÇÀ ÿÿÕÐ LMTFFMTASTADT AST4 NSTimeZones/zones/America/Asuncion0000644000175000017500000000156414353032552017257 0ustar richardrichardTZif2TZif2Oÿÿÿÿi‡ÿÿÿÿ¸õ+Ú@üð° ÏtÀ —ʰ ±ùÀ xþ0“-@Z1°t`ÀdC°U”@FȰ8@'ü0LÀ /°ú€@êc0Û³ÀÌè0¾8À®°Ÿl@O0€ŸÀ p‚°!aÓ@"S°#DX@$4;0%A;@&n°'¿@'ö¢0(îŠ@)°H°*ϽÀ+¹ 0,««@-p °.ŒÞÀ/Oî°0n@16h02W.À3²°47À4øÏ06òÀ6áë°7öÔÀ8ÁͰ9Ö¶À:¡¯°;¿Ó@<¯¶0=qÀ>˜0?Z­@@oz0Aqî@B3¬°CQÐ@DްE1²@Eóp°GÎÀGÓR°Hú°ÀI³4°JÚ’ÀKÁ;0L§ÿÀM¡0N‡áÀO€ÿ0Ppþ@ÿÿÉðÿÿÉðÿÿÇÀÿÿÕÐ ÿÿÕÐ LMTAMT-04-03 <-04>4<-03>,M10.1.0/0,M3.4.0/0 NSTimeZones/zones/America/Indiana/0000755000175000017500000000000014353032552017112 5ustar richardrichardNSTimeZones/zones/America/Indiana/Petersburg0000644000175000017500000000125314353032552021160 0ustar richardrichardTZif2TZif28ÿÿÿÿ^þ ÿÿÿÿž¦,€ÿÿÿÿŸºùpÿÿÿÿ †€ÿÿÿÿ¡šÛpÿÿÿÿˈþ€ÿÿÿÿÒ#ôpÿÿÿÿÒa ðÿÿÿÿäg=àÿÿÿÿå)pÿÿÿÿæG<ÿÿÿÿç4ðÿÿÿÿè'ÿÿÿÿèòðÿÿÿÿêÿÿÿÿêÑøðÿÿÿÿëæâÿÿÿÿì±ÚðÿÿÿÿíÆÄÿÿÿÿðÿÿÿÿï¯à€ÿÿÿÿðŸÃpÿÿÿÿñ€ÿÿÿÿò¥pÿÿÿÿóo¤€ÿÿÿÿô_‡pÿÿÿÿõO†€ÿÿÿÿö?ipÿÿÿÿ÷/h€ÿÿÿÿúgðÿÿÿÿúøgÿÿÿÿûèIðÿÿÿÿüØIÿÿÿÿýÈ+ðÿÿÿÿþ¸+ÿÿÿÿÿ¨ 𘠇ïðwïq pa €Pîp@í€0Ðp'€ ²p ­£ ð”p à“€ Ù°ð Àu€¹’ðD/vpEDQpEó·G-mðÿÿ®-ÿÿ¹°ÿÿ« ÿÿ¹° ÿÿ¹°ÿÿ¹°LMTCDTCSTCWTCPTEST EST5EDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Indiana/Knox0000644000175000017500000000177014353032552017761 0ustar richardrichardTZif2TZif2]ÿÿÿÿ^þ ÿÿÿÿž¦,€ÿÿÿÿŸºùpÿÿÿÿ †€ÿÿÿÿ¡šÛpÿÿÿÿˈþ€ÿÿÿÿÒ#ôpÿÿÿÿÒa ðÿÿÿÿÕUÕÿÿÿÿÖ Íðÿÿÿÿ×5·ÿÿÿÿدðÿÿÿÿÙ™ÿÿÿÿÙà‘ðÿÿÿÿÚþµ€ÿÿÿÿÛÀsðÿÿÿÿÜÞ—€ÿÿÿÿÝ©pÿÿÿÿÞ¾y€ÿÿÿÿ߉rpÿÿÿÿàž[€ÿÿÿÿáiTpÿÿÿÿâ~=€ÿÿÿÿãI6pÿÿÿÿä^€ÿÿÿÿåW<ðÿÿÿÿæG<ÿÿÿÿç7ðÿÿÿÿè'ÿÿÿÿèòðÿÿÿÿêÿÿÿÿêÑøðÿÿÿÿëæâÿÿÿÿìÖÄðÿÿÿÿíÆÄÿÿÿÿî¿ápÿÿÿÿï¯à€ÿÿÿÿðŸÃpÿÿÿÿñ€ÿÿÿÿô_‡pÿÿÿÿúøgÿÿÿÿûèIðÿÿÿÿüØIÿÿÿÿýÈ+ðÿÿÿÿþ¸+ÿÿÿÿÿ¨ 𘠇ïðwïq pa €Pîp@í€0Ðp'€ ²p ­£ ð”p à“€ Ù°ð Àu€¹’ð©’™tð‰tyVðiVY8ðI89ð)"7püpò€áûpÑú€ÁÝp±Ü€¡¿p v!¡p"Uñ#j½ð$5Ó%JŸð&µ'*ð'þÑ€) cðD/vpEDQpEó·ÿÿ®Êÿÿ¹°ÿÿ« ÿÿ¹° ÿÿ¹°ÿÿ¹°LMTCDTCSTCWTCPTEST CST6CDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Indiana/Tell_City0000644000175000017500000000101214353032552020717 0ustar richardrichardTZif2TZif2%ÿÿÿÿ^þ ÿÿÿÿž¦,€ÿÿÿÿŸºùpÿÿÿÿ †€ÿÿÿÿ¡šÛpÿÿÿÿˈþ€ÿÿÿÿÒ#ôpÿÿÿÿÒa ðÿÿÿÿäg=àÿÿÿÿå)pÿÿÿÿæG<ÿÿÿÿç4ðÿÿÿÿè'ÿÿÿÿèòðÿÿÿÿêÿÿÿÿêÑøðÿÿÿÿëæâÿÿÿÿì±ÚðÿÿÿÿíÆÄÿÿÿÿðÿÿÿÿï¯à€ÿÿÿÿðŸÃpÿÿÿÿñ€ÿÿÿÿò¥pÿÿÿÿóo¤€ÿÿÿÿô_‡pÿÿÿÿõO†€ÿÿÿÿûèIðÿÿÿÿüØIÿÿÿÿýÈ+ðÿÿÿÿþ¸+ÿÿÿÿÿ§ÿà—þð‡áàD/vpEDQpEó·ÿÿ®©ÿÿ¹°ÿÿ« ÿÿ¹° ÿÿ¹°ÿÿ¹°ÿÿÇÀLMTCDTCSTCWTCPTESTEDT CST6CDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Indiana/Marengo0000644000175000017500000000106714353032552020431 0ustar richardrichardTZif2TZif2*ÿÿÿÿ^þ ÿÿÿÿž¦,€ÿÿÿÿŸºùpÿÿÿÿ †€ÿÿÿÿ¡šÛpÿÿÿÿˈþ€ÿÿÿÿÒ#ôpÿÿÿÿÒa ðÿÿÿÿÜÞ—€ÿÿÿÿÝ©pÿÿÿÿâ~=€ÿÿÿÿãI6pÿÿÿÿä^€ÿÿÿÿå)pÿÿÿÿæG<ÿÿÿÿç4ðÿÿÿÿè'ÿÿÿÿèòðÿÿÿÿêÿÿÿÿêÑøðÿÿÿÿëæâÿÿÿÿì±ÚðÿÿÿÿíÆÄÿÿÿÿðÿÿÿÿï¯à€ÿÿÿÿþ¸ðÿÿÿÿÿ§ÿà—þð‡áàwàðpþ``ýpPà`@ßp0Â`p ²p ­”ð ð†`D/vpEDC`Eó¨ðÿÿ¯ ÿÿ¹°ÿÿ« ÿÿ¹° ÿÿ¹°ÿÿ¹°ÿÿÇÀLMTCDTCSTCWTCPTESTEDT EST5EDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Indiana/Vincennes0000644000175000017500000000105614353032552020767 0ustar richardrichardTZif2TZif2)ÿÿÿÿ^þ ÿÿÿÿž¦,€ÿÿÿÿŸºùpÿÿÿÿ †€ÿÿÿÿ¡šÛpÿÿÿÿˈþ€ÿÿÿÿÒ#ôpÿÿÿÿÒa ðÿÿÿÿÓuóÿÿÿÿÔ@ëðÿÿÿÿàž[€ÿÿÿÿáiTpÿÿÿÿâ~=€ÿÿÿÿãI6pÿÿÿÿäg=àÿÿÿÿå)pÿÿÿÿæG<ÿÿÿÿç4ðÿÿÿÿè'ÿÿÿÿèòðÿÿÿÿêÿÿÿÿêÑøðÿÿÿÿëæâÿÿÿÿì±ÚðÿÿÿÿíÆÄÿÿÿÿî¿ápÿÿÿÿï¯à€ÿÿÿÿðqžðÿÿÿÿñ€ÿÿÿÿò¥pÿÿÿÿóo¤€ÿÿÿÿô_‡pÿÿÿÿõO†€ÿÿÿÿþ¸ðÿÿÿÿÿ§ÿà—þð‡áàD/vpEDQpEó·G-mðÿÿ­ñÿÿ¹°ÿÿ« ÿÿ¹° ÿÿ¹°ÿÿ¹°ÿÿÇÀLMTCDTCSTCWTCPTESTEDT EST5EDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Indiana/Indianapolis0000644000175000017500000000102314353032552021443 0ustar richardrichardTZif2TZif2&ÿÿÿÿ^þ ÿÿÿÿž¦,€ÿÿÿÿŸºùpÿÿÿÿ †€ÿÿÿÿ¡šÛpÿÿÿÿÊW"€ÿÿÿÿÊØGpÿÿÿÿˈþ€ÿÿÿÿÒ#ôpÿÿÿÿÒa ðÿÿÿÿÓuóÿÿÿÿÔ@ëðÿÿÿÿÕUÕÿÿÿÿÖ Íðÿÿÿÿ×5·ÿÿÿÿدðÿÿÿÿÙ™ÿÿÿÿÙà‘ðÿÿÿÿÚþµ€ÿÿÿÿÛÀsðÿÿÿÿÜÞ—€ÿÿÿÿÝ©pÿÿÿÿÞ¾y€ÿÿÿÿ߉rpÿÿÿÿàž[€ÿÿÿÿáiTpÿÿÿÿâ~=€ÿÿÿÿãI6pÿÿÿÿä^€ÿÿÿÿèòðÿÿÿÿêÿÿÿÿþ¸ðÿÿÿÿÿ§ÿà—þð‡áàD/vpEDC`Eó¨ðÿÿ¯:ÿÿ¹°ÿÿ« ÿÿ¹° ÿÿ¹°ÿÿ¹°ÿÿÇÀLMTCDTCSTCWTCPTESTEDT EST5EDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Indiana/Winamac0000644000175000017500000000114414353032552020414 0ustar richardrichardTZif2TZif2/ÿÿÿÿ^þ ÿÿÿÿž¦,€ÿÿÿÿŸºùpÿÿÿÿ †€ÿÿÿÿ¡šÛpÿÿÿÿˈþ€ÿÿÿÿÒ#ôpÿÿÿÿÒa ðÿÿÿÿÓuóÿÿÿÿÔ@ëðÿÿÿÿÕUÕÿÿÿÿÖ Íðÿÿÿÿ×5·ÿÿÿÿدðÿÿÿÿÙ™ÿÿÿÿÙà‘ðÿÿÿÿÚþµ€ÿÿÿÿÛÀsðÿÿÿÿÜÞ—€ÿÿÿÿÝ©pÿÿÿÿÞ¾y€ÿÿÿÿ߉rpÿÿÿÿàž[€ÿÿÿÿáiTpÿÿÿÿâ~=€ÿÿÿÿãI6pÿÿÿÿä^€ÿÿÿÿåW<ðÿÿÿÿæG<ÿÿÿÿç7ðÿÿÿÿè'ÿÿÿÿèòðÿÿÿÿêÿÿÿÿêÑøðÿÿÿÿëæâÿÿÿÿì±ÚðÿÿÿÿíÆÄÿÿÿÿðÿÿÿÿï¯à€ÿÿÿÿþ¸ðÿÿÿÿÿ§ÿà—þð‡áàD/vpEDQpEó·G-_àÿÿ®Ïÿÿ¹°ÿÿ« ÿÿ¹° ÿÿ¹°ÿÿ¹°ÿÿÇÀLMTCDTCSTCWTCPTESTEDT EST5EDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Indiana/Vevay0000644000175000017500000000056114353032552020131 0ustar richardrichardTZif2TZif2ÿÿÿÿ^þ ÿÿÿÿž¦,€ÿÿÿÿŸºùpÿÿÿÿ †€ÿÿÿÿ¡šÛpÿÿÿÿˈþ€ÿÿÿÿÒ#ôpÿÿÿÿÒa ðÿÿÿÿâ~=€ÿÿÿÿþ¸ðÿÿÿÿÿ§ÿà—þð‡áàwàðpþ``ýpPà`D/vpEDC`Eó¨ðÿÿ°@ÿÿ¹°ÿÿ« ÿÿ¹° ÿÿ¹°ÿÿ¹°ÿÿÇÀLMTCDTCSTCWTCPTESTEDT EST5EDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Santiago0000644000175000017500000000251214353032552017237 0ustar richardrichardTZif3TZif3‚ÿÿÿÿi‡Åÿÿÿÿ0GEÿÿÿÿ›\åPÿÿÿÿŸ|âÅÿÿÿÿ¡qÀÿÿÿÿ°^wÅÿÿÿÿ±w=@ÿÿÿÿ²AÐÿÿÿÿ³XpÀÿÿÿÿ´"4Pÿÿÿÿµ9¤@ÿÿÿÿ¶gÐÿÿÿÿ·×Àÿÿÿÿ·ä›Pÿÿÿÿ¸ý\Àÿÿÿÿ¹Ç PÿÿÿÿÌn@ÿÿÿÿÌlçÐÿÿÿÿÓÜÀÿÿÿÿÔÕ0ÿÿÿÿÕ3UÀÿÿÿÿÕv’@ÿÿÿÿýÑ<@ÿÿÿÿþ’ú°ÿÿÿÿÿÌÍÀrܰuPÀ@I°U2À +°>O@ ° ¼@ßï°þ@ ¿Ñ° Ýõ@ ¨î0 ½×@ ˆÐ0¹@h²0†ÕÀH”0f·À(v0F™À’°&{Àñt°]ÀÑV°æ?À±8°Ï\@‘°¯>@pü° @ 0!o@"9û0#Nä@$Ý0%8À%ù¿0&òøÀ'Ù¡0(÷ÄÀ)½°*צÀ+¢Ÿ°,·ˆÀ-‚°.—jÀ/bc°0€‡@1BE°2`i@3=×04@K@5 D06 ¸@7Õ°8@8Ë09é+À:ªê0;É À<ŠÌ0=¨ïÀ>j®0?ˆÑÀ@SʰAh³ÀB3¬°CH•ÀDްE1²@Eóp°G”@Gï0Hñv@I¼o0JÑX@K¸°L±:@MÆ0NP‚ÀOœ®°PBÙÀQ|°R+ö@S\r°T Ø@W7æ0W¯ìÀYÈ0YÎÀZ÷ª0[o°À\©g°]t|À^‰I°_T^À`i+°a4@ÀbI °c]@d(ï°ÿÿ½»ÿÿ½»ÿÿ¹°ÿÿÇÀ ÿÿÇÀ ÿÿÕÐLMTSMT-05-04-03 <-04>4<-03>,M9.1.6/24,M4.1.6/24 NSTimeZones/zones/America/Kralendijk0000644000175000017500000000026114353032552017547 0ustar richardrichardTZif2TZif2ÿÿÿÿz敹ÿÿÿÿËö2ÀÿÿÿÿÒ#ôpÿÿÿÿÒ`íÐÿÿÂÿÿÇÀÿÿÕÐÿÿÕÐ LMTASTAPTAWT AST4 NSTimeZones/zones/America/Sitka0000644000175000017500000000167414353032552016555 0ustar richardrichardTZif2TZif2S "ÿÿÿÿ?ÂýÑÿÿÿÿ}‡3™ÿÿÿÿˉ ÿÿÿÿÒ#ôpÿÿÿÿÒa&ÿÿÿÿþ¸G ÿÿÿÿÿ¨*˜) ˆ x q(a' Q A  0ìC  Î ­¿ ð° ௠ ÙÍ À‘ ¹¯©® ™‘‰ ysir YUIT 97)6 "S  5+òB°â% Ò$°Â ²°¡é  v90!Ë "V0#jè $5ý0%JÊ &ß0'*¬ 'þû°) Ž )Þݰ*êp +¾¿°,ÓŒ -ž¡°.³n /~ƒ°0“P 1g 02s2 3G‚04S 5'd062ö 7F08 8ç(09ûõ :Ç 0;Û× <°&°=»¹ >°?›› @oê°A„· BO̰Cd™ D/®°ED{ Eóá0Ò§ÿÿ'ÿÿ€ÿÿÿÿ ÿÿÿÿpÿÿ€ÿÿpLMTPSTPWTPPTPDTYSTAKDTAKST AKST9AKDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Chihuahua0000644000175000017500000000126314353032552017373 0ustar richardrichardTZif2TZif2<ÿÿÿÿ¥¶èpÿÿÿÿ¯ònàÿÿÿÿ¶fV`ÿÿÿÿ·CÒ`ÿÿÿÿ¸ 6`ÿÿÿÿ¸ý†ð1gv2sp3GX4Rêp5'H62Ú€7*8÷8ç 9ûÙ:õ;¶Ñ<° =»>ì?›@oÎA„›€BO°Cd}€D/’ED_€FtG$A€Gø‘I#€IØsJä€K¸ULÍ"M˜7N­OxPŒæQa5RlÈSATLªU ùV,ŒWÛX¨€Xà½YõŠ€ZÀŸ[Õl€\©¼]µN€^‰ž_•0€`i€a~MbIbc^/ÿÿœŒÿÿÿÿ« ÿÿ«  ÿÿ¹°LMTMSTCSTMDTCDT CST6 NSTimeZones/zones/America/Iqaluit0000644000175000017500000000152714353032552017107 0ustar richardrichardTZif2TZif2JÿÿÿÿÌl¡€ÿÿÿÿÒ#ôpÿÿÿÿÒ`ûà`ýpPà`@ßp0Â` Áp ¤` £p ð†` à…p Ù¢à Àgp¹„੃ð™fà‰eðyHàiGðY*àI)ð9 à) ð")`íð `ò páí`ÑìpÁÏ`±Îp¡±` vð!“`"Uâð#j¯à$5Äð%J‘à&¦ð'*sà'þÃp) Uà)Þ¥p*ê7à+¾‡p,ÓT`-žip.³6`/~Kp0“`1ggð2rú`3GIð4RÜ`5'+ð62¾`7 ð8Úà8æþ9ûÊð:ÆÑð;Ûžà<¯îp=»€à>Ðp?›bà@o²pA„`BO”pCda`D/vpEDC`Eó¨ðÿÿÇÀÿÿ¹°ÿÿÇÀ ÿÿÇÀÿÿ« ÿÿ¹°-00EPTESTEDTEWTCSTCDT EST5EDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/North_Dakota/0000755000175000017500000000000014353032552020124 5ustar richardrichardNSTimeZones/zones/America/North_Dakota/New_Salem0000644000175000017500000000173614353032552021730 0ustar richardrichardTZif2TZif2Yÿÿÿÿ^ °ÿÿÿÿž¦:ÿÿÿÿŸ»€ÿÿÿÿ †ÿÿÿÿ¡šé€ÿÿÿÿˉ ÿÿÿÿÒ#ôpÿÿÿÿÒaÿÿÿÿúøuÿÿÿÿûèXÿÿÿÿüØWÿÿÿÿýÈ:ÿÿÿÿþ¸9ÿÿÿÿÿ¨˜‡þwýq€aPü€@û0Þ€5 À€ ­± 𢀠ࡠٿ Àƒ¹¡© ™ƒ‰‚yeidYGIF9))("E€ '€ò&â €ÒÁ뀱ê¡Í€ v!¯€"Uÿ#jÌ$5á%J®&Ã'*'þß) r)ÞÁ*êT+¾£,Óp€-ž….³R€/~g0“4€1g„2s€3Gf4Rø€5'H62Ú€7*8÷8ç 9ûÙ:Æî;Û»<° =»>ì?›@oÀ€A„pBO¢€CdopD/„€EDQpEó·ÿÿ íÿÿ« ÿÿÿÿ«  ÿÿ« ÿÿ¹°ÿÿ« LMTMDTMSTMWTMPTCDTCST CST6CDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/North_Dakota/Center0000644000175000017500000000173614353032552021276 0ustar richardrichardTZif2TZif2Yÿÿÿÿ^ °ÿÿÿÿž¦:ÿÿÿÿŸ»€ÿÿÿÿ †ÿÿÿÿ¡šé€ÿÿÿÿˉ ÿÿÿÿÒ#ôpÿÿÿÿÒaÿÿÿÿúøuÿÿÿÿûèXÿÿÿÿüØWÿÿÿÿýÈ:ÿÿÿÿþ¸9ÿÿÿÿÿ¨˜‡þwýq€aPü€@û0Þ€5 À€ ­± 𢀠ࡠٿ Àƒ¹¡© ™ƒ‰‚yeidYGIF9))("E€ '€ò&â €ÒÁ뀱ê¡Í€ v!¯€"Uÿ#jÌ$5á%J®&Ã'*'þß) r)ÞÁ*êT+¾•€,Óbp-žw€.³Dp/~Y€0“&p1gv2sp3GX4Rêp5':62Ìp78èð8æþ9ûÊð:Æà;Û¬ð<¯ü€=»Žð>Þ€?›pð@oÀ€A„pBO¢€CdopD/„€EDQpEó·ÿÿ¡ÿÿ« ÿÿÿÿ«  ÿÿ« ÿÿ¹°ÿÿ« LMTMDTMSTMWTMPTCDTCST CST6CDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/North_Dakota/Beulah0000644000175000017500000000202314353032552021244 0ustar richardrichardTZif2TZif2`ÿÿÿÿ^ °ÿÿÿÿž¦:ÿÿÿÿŸ»€ÿÿÿÿ †ÿÿÿÿ¡šé€ÿÿÿÿˉ ÿÿÿÿÒ#ôpÿÿÿÿÒaÿÿÿÿúøuÿÿÿÿûèXÿÿÿÿüØWÿÿÿÿýÈ:ÿÿÿÿþ¸9ÿÿÿÿÿ¨˜‡þwýq€aPü€@û0Þ€5 À€ ­± 𢀠ࡠٿ Àƒ¹¡© ™ƒ‰‚yeidYGIF9))("E€ '€ò&â €ÒÁ뀱ê¡Í€ v!¯€"Uÿ#jÌ$5á%J®&Ã'*'þß) r)ÞÁ*êT+¾£,Óp€-ž….³R€/~g0“4€1g„2s€3Gf4Rø€5'H62Ú€7*8÷8ç 9ûÙ:Æî;Û»<° =»>ì?›@oÎA„›€BO°Cd}€D/’ED_€EóÅG-|GÓ§I ^I³‰Jí@Kœ¥LÖ\€ÿÿ •ÿÿ« ÿÿÿÿ«  ÿÿ« ÿÿ« LMTMDTMSTMWTMPTCST CST6CDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Eirunepe0000644000175000017500000000066414353032552017254 0ustar richardrichardTZif2TZif2! ÿÿÿÿ–ªˆ€ÿÿÿÿ¸fÿÿÿÿ¸ý\Àÿÿÿÿ¹ñPPÿÿÿÿºÞ@ÿÿÿÿÚ8ÊPÿÿÿÿÚìPÿÿÿÿÜýÐÿÿÿÿܹu@ÿÿÿÿÝû1PÿÿÿÿÞ›ú@ÿÿÿÿßݶPÿÿÿÿàTO@ÿÿÿÿô˜Ðÿÿÿÿõz@ÿÿÿÿöÀ€Pÿÿÿÿ÷:ÀÿÿÿÿøQHPÿÿÿÿøÇá@ÿÿÿÿú îÐÿÿÿÿú©Àÿÿÿÿûì"Pÿÿÿÿü‹™ÀɪPxóÀ QÐ 3ëÀ!…P" äÀ,ÀÑP-fà@H`PRÀÿÿ¾€ÿÿÇÀÿÿ¹°ÿÿÇÀLMT-04-05 <-05>5 NSTimeZones/zones/America/Vancouver0000644000175000017500000000246214353032552017446 0ustar richardrichardTZif2TZif2ÿÿÿÿ^=vìÿÿÿÿž¸½ ÿÿÿÿŸ»ÿÿÿÿˉ ÿÿÿÿÒ#ôpÿÿÿÿÒa&ÿÿÿÿÓv ÿÿÿÿÔAÿÿÿÿÕUñ ÿÿÿÿÖ êÿÿÿÿ×5Ó ÿÿÿÿØÌÿÿÿÿÙµ ÿÿÿÿÙà®ÿÿÿÿÚþÑ ÿÿÿÿÛÀÿÿÿÿÜÞ³ ÿÿÿÿÝ©¬ÿÿÿÿÞ¾• ÿÿÿÿ߉Žÿÿÿÿàžw ÿÿÿÿáipÿÿÿÿâ~Y ÿÿÿÿãIRÿÿÿÿä^; ÿÿÿÿå)4ÿÿÿÿæGX ÿÿÿÿçQÿÿÿÿè': ÿÿÿÿèò3ÿÿÿÿê ÿÿÿÿêÒÿÿÿÿëæþ ÿÿÿÿì±÷ÿÿÿÿíÆà ÿÿÿÿî‘Ùÿÿÿÿï¯ü ÿÿÿÿðq»ÿÿÿÿñÞ ÿÿÿÿòÁÿÿÿÿóoÀ ÿÿÿÿô_£ÿÿÿÿõO¢ ÿÿÿÿö?…ÿÿÿÿ÷/„ ÿÿÿÿø(¢ÿÿÿÿùf ÿÿÿÿú„ÿÿÿÿúøƒ ÿÿÿÿûèfÿÿÿÿüØe ÿÿÿÿýÈHÿÿÿÿþ¸G ÿÿÿÿÿ¨*˜) ˆ x q(a' Q A  0ì ë  Î Í  ð° ௠ ÙÍ À‘ ¹¯©® ™‘‰ ysir YUIT 97)6 "S  5ò4 âÒ Áù±ø ¡Û v+ !½"V #jÚ$5ï %J¼&Ñ '*ž'þí ) €)ÞÏ *êb+¾± ,Ó~-ž“ .³`/~u 0“B1g’ 2s$3Gt 4S5'V 62è78 88ç 9ûç:Æü ;ÛÉ<° =»«>ú ?›@oÜ A„©BO¾ Cd‹D/  EDmEóÓ ÿÿŒ”ÿÿÿÿ€ÿÿ ÿÿLMTPDTPSTPWTPPT PST8PDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Rainy_River0000644000175000017500000000241614353032552017726 0ustar richardrichardTZif2TZif2}ÿÿÿÿdä°”ÿÿÿÿ›ûàÿÿÿÿ›ÃºPÿÿÿÿž¸¡€ÿÿÿÿŸºùpÿÿÿÿ ;€ÿÿÿÿÃO„ðÿÿÿÿˈþ€ÿÿÿÿÒ#ôpÿÿÿÿÒa ðÿÿÿÿÓˆhÿÿÿÿÔS`ðÿÿÿÿÕUÕÿÿÿÿÖ Íðÿÿÿÿ×5·ÿÿÿÿدðÿÿÿÿÙ™ÿÿÿÿÙà‘ðÿÿÿÿÛÿÿÿÿÛÈ\ðÿÿÿÿÜÞ—€ÿÿÿÿÝ©pÿÿÿÿÞ¾y€ÿÿÿÿ߉rpÿÿÿÿàž[€ÿÿÿÿáiTpÿÿÿÿâ~=€ÿÿÿÿãI6pÿÿÿÿä^€ÿÿÿÿå)pÿÿÿÿæG<ÿÿÿÿç4ðÿÿÿÿè'ÿÿÿÿèòðÿÿÿÿêÿÿÿÿêÑøðÿÿÿÿëæâÿÿÿÿìÖÄðÿÿÿÿíÆÄÿÿÿÿðÿÿÿÿóo¤€ÿÿÿÿô1bðÿÿÿÿùJ€ÿÿÿÿúvÿÿÿÿúøgÿÿÿÿûèXÿÿÿÿüØIÿÿÿÿýÈ:ÿÿÿÿþ¸+ÿÿÿÿÿ¨˜ ‡þwïq€a €Pü€@í€0Þ€ Ï€ À€ ±€ ð¢€ à“€ Ù¿ Àu€¹¡©’™ƒ‰tyeiVYGI89))"E€ü'€ò€â €Ñú€Á뀱܀¡Í€ v!¯€"Uñ#jÌ$5Ó%J®&µ'*'þÑ€) r)Þ³€*êT+¾•€,Óp€-žw€.³R€/~Y€0“4€1gv2s€3GX4Rø€5':62Ú€78÷8æþ9ûÙ:Æà;Û»<¯ü€=»>Þ€?›@oÀ€A„›€BO¢€Cd}€D/„€EDQpEó·ÿÿ¤ìÿÿ¹°ÿÿ« ÿÿ¹° ÿÿ¹°LMTCDTCSTCWTCPT CST6CDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Fort_Nelson0000644000175000017500000000265014353032552017725 0ustar richardrichardTZif2TZif2ÿÿÿÿ^=v‡ÿÿÿÿž¸½ ÿÿÿÿŸ»ÿÿÿÿˉ ÿÿÿÿÒ#ôpÿÿÿÿÒa&ÿÿÿÿÕUñ ÿÿÿÿÖ êÿÿÿÿ×5Ó ÿÿÿÿØÌÿÿÿÿÙµ ÿÿÿÿÙà®ÿÿÿÿÚþÑ ÿÿÿÿÛÀÿÿÿÿÜÞ³ ÿÿÿÿÝ©¬ÿÿÿÿÞ¾• ÿÿÿÿ߉Žÿÿÿÿàžw ÿÿÿÿáipÿÿÿÿâ~Y ÿÿÿÿãIRÿÿÿÿä^; ÿÿÿÿå)4ÿÿÿÿæGX ÿÿÿÿçQÿÿÿÿè': ÿÿÿÿèò3ÿÿÿÿê ÿÿÿÿêÒÿÿÿÿëæþ ÿÿÿÿì±÷ÿÿÿÿíÆà ÿÿÿÿî‘Ùÿÿÿÿï¯ü ÿÿÿÿðq»ÿÿÿÿñÞ ÿÿÿÿòÁÿÿÿÿóoÀ ÿÿÿÿô_£ÿÿÿÿõO¢ ÿÿÿÿö?…ÿÿÿÿ÷/„ ÿÿÿÿø(¢ÿÿÿÿùf ÿÿÿÿú„ÿÿÿÿúøƒ ÿÿÿÿûèfÿÿÿÿüØe ÿÿÿÿýÈHÿÿÿÿþ¸G ÿÿÿÿÿ¨*˜) ˆ x q(a' Q A  0ì ë  Î Í  ð° ௠ ÙÍ À‘ ¹¯©® ™‘‰ ysir YUIT 97)6 "S  5ò4 âÒ Áù±ø ¡Û v+ !½"V #jÚ$5ï %J¼&Ñ '*ž'þí ) €)ÞÏ *êb+¾± ,Ó~-ž“ .³`/~u 0“B1g’ 2s$3Gt 4S5'V 62è78 88ç 9ûç:Æü ;ÛÉ<° =»«>ú ?›@oÜ A„©BO¾ Cd‹D/  EDmEóÓ G-ŠGÓµ I lI³— JíNKœ³ LÖjM|• N¶LO\w P–.Q3 NSTimeZones/zones/America/Los_Angeles0000644000175000017500000000241614353032552017670 0ustar richardrichardTZif2TZif2}ÿÿÿÿ^Àÿÿÿÿž¦H ÿÿÿÿŸ»ÿÿÿÿ †* ÿÿÿÿ¡š÷ÿÿÿÿˉ ÿÿÿÿÒ#ôpÿÿÿÿÒa&ÿÿÿÿÖþt\ÿÿÿÿØ€­ÿÿÿÿÚþÃÿÿÿÿÛÀÿÿÿÿÜÞ¥ÿÿÿÿÝ©¬ÿÿÿÿÞ¾‡ÿÿÿÿ߉Žÿÿÿÿàžiÿÿÿÿáipÿÿÿÿâ~KÿÿÿÿãIRÿÿÿÿä^-ÿÿÿÿå)4ÿÿÿÿæGJÿÿÿÿçQÿÿÿÿè',ÿÿÿÿèò3ÿÿÿÿêÿÿÿÿêÒÿÿÿÿëæðÿÿÿÿì±÷ÿÿÿÿíÆÒÿÿÿÿî‘Ùÿÿÿÿï¯îÿÿÿÿðq»ÿÿÿÿñÐÿÿÿÿòÁÿÿÿÿóo²ÿÿÿÿô_£ÿÿÿÿõO”ÿÿÿÿö?…ÿÿÿÿ÷/vÿÿÿÿø(¢ÿÿÿÿùXÿÿÿÿú„ÿÿÿÿúøƒ ÿÿÿÿûèfÿÿÿÿüØe ÿÿÿÿýÈHÿÿÿÿþ¸G ÿÿÿÿÿ¨*˜) ˆ x q(a' Q A  0ìC  Î ­¿ ð° ௠ ÙÍ À‘ ¹¯©® ™‘‰ ysir YUIT 97)6 "S  5ò4 âÒ Áù±ø ¡Û v+ !½"V #jÚ$5ï %J¼&Ñ '*ž'þí ) €)ÞÏ *êb+¾± ,Ó~-ž“ .³`/~u 0“B1g’ 2s$3Gt 4S5'V 62è78 88ç 9ûç:Æü ;ÛÉ<° =»«>ú ?›@oÜ A„©BO¾ Cd‹D/  EDmEóÓ ÿÿ‘&ÿÿÿÿ€ÿÿ ÿÿLMTPDTPSTPWTPPT PST8PDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Halifax0000644000175000017500000000321014353032552017042 0ustar richardrichardTZif2TZif2§ÿÿÿÿ€ñ« ÿÿÿÿšäÞÀÿÿÿÿ›Ö0ÿÿÿÿž¸…`ÿÿÿÿŸºÝPÿÿÿÿ¢@ÿÿÿÿ£0±0ÿÿÿÿ¤zV@ÿÿÿÿ¥0ÿÿÿÿ¦S Àÿÿÿÿ¦üR°ÿÿÿÿ¨<½@ÿÿÿÿ¨Ü4°ÿÿÿÿªŸ@ÿÿÿÿªÍ:0ÿÿÿÿ«ü@ÿÿÿÿ¬¿‘0ÿÿÿÿ­îØ@ÿÿÿÿ®Œþ0ÿÿÿÿ¯¼E@ÿÿÿÿ°U0ÿÿÿÿ±®œ@ÿÿÿÿ²Kp°ÿÿÿÿ³Ž~@ÿÿÿÿ´$»0ÿÿÿÿµn`@ÿÿÿÿ¶À°ÿÿÿÿ·NB@ÿÿÿÿ¸°ÿÿÿÿ¹$éÀÿÿÿÿ¹çù°ÿÿÿÿ»ËÀÿÿÿÿ»Ñ0ÿÿÿÿ½]@ÿÿÿÿ½1°ÿÿÿÿ¾ò´@ÿÿÿÿ¿Ú0ÿÿÿÿÀÓçÀÿÿÿÿÁ^G0ÿÿÿÿÂŽ@ÿÿÿÿÃPž0ÿÿÿÿÄmp@ÿÿÿÿÅ0€0ÿÿÿÿÆr<@ÿÿÿÿÇb0ÿÿÿÿÈ6nÀÿÿÿÿÈù~°ÿÿÿÿÊPÀÿÿÿÿÊÙ`°ÿÿÿÿˈâ`ÿÿÿÿÒ#ôpÿÿÿÿÒ`íÐÿÿÿÿÓuÖàÿÿÿÿÔ@ÏÐÿÿÿÿÕU¸àÿÿÿÿÖ ±Ðÿÿÿÿ×5šàÿÿÿÿØ“ÐÿÿÿÿÙ|àÿÿÿÿÙàuÐÿÿÿÿÜÞ{`ÿÿÿÿÝ©tPÿÿÿÿÞ¾]`ÿÿÿÿ߉VPÿÿÿÿàž?`ÿÿÿÿái8Pÿÿÿÿâ~!`ÿÿÿÿãIPÿÿÿÿæGàÿÿÿÿçÐÿÿÿÿè'àÿÿÿÿèñúÐÿÿÿÿêãàÿÿÿÿêÑÜÐÿÿÿÿëæÅàÿÿÿÿì±¾Ðÿÿÿÿñ¦`ÿÿÿÿò‰Pÿÿÿÿóoˆ`ÿÿÿÿô_kPÿÿÿÿõOj`ÿÿÿÿö?MPÿÿÿÿ÷/L`ÿÿÿÿø(iÐÿÿÿÿù.`ÿÿÿÿúKÐÿÿÿÿúøJàÿÿÿÿûè-ÐÿÿÿÿüØ,àÿÿÿÿýÈÐÿÿÿÿþ¸àÿÿÿÿÿ§ñЗðà‡ÓÐwÒàpðP`ï`PÒP@Ñ`0´P ³` –P •` ðxP àw` ٔРÀY`¹vЩuà™XЉWày:Ði9àYÐIà8þÐ(ýà"PßàýPñü`áßPÑÞ`ÁÁP±À`¡£P uòà!…P"UÔà#j¡Ð$5¶à%JƒÐ&˜à'*eÐ'þµ`) GÐ)Þ—`*ê)Ð+¾y`,ÓFP-ž[`.³(P/~=`0“ P1gYà2rìP3G;à4RÎP5'à62°P7ÿà8ÌÐ8æáà9û®Ð:ÆÃà;ÛÐ<¯à`=»rÐ>Â`?›TÐ@o¤`A„qPBO†`CdSPD/h`ED5PEóšàÿÿÄ`ÿÿÕÐÿÿÇÀÿÿÕÐ ÿÿÕÐLMTADTASTAWTAPT AST4ADT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Port-au-Prince0000644000175000017500000000106514353032552020241 0ustar richardrichardTZif2TZif2-ÿÿÿÿi‡PÿÿÿÿœnqüFÐï@ñîPáÑ@ÑÐPÁ³@±²P¡•@ ‘”P!w@"UÔà#j¯à$5¶à%J‘à&˜à'*sà'þµ`) Uà)Þ—`*ê7à+¾y`,ÓT`-ž[`.³6`/~=`0“`1gYà2rú`3G;à4RÜ`BOxPCdE@D/ZPED'@O\MpP–`Q¦|?›8ì@oˆ|A„UlBOj|Cd7lD/L|EDlEó~üG-5ìGÓ`üI ìI³BüJìùìKœ_|LÖlM|A|N¶P ÿÿÇ\ÿÿΔÿÿܤÿÿÎÈÿÿÜØÿÿÜØ ÿÿÜØÿÿÕÐÿÿÇÀÿÿãàLMTNSTNDTNPTNWTADTASTADDT AST4ADT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Guyana0000644000175000017500000000026514353032552016721 0ustar richardrichardTZif2TZif2ÿÿÿÿ’‡ÿÿÿÿ˜Ù{@ ¼)Õ@ÀÿÿÉyÿÿÇÀÿÿËDÿÿÕÐLMT-04-0345-03 <-04>4 NSTimeZones/zones/America/Havana0000644000175000017500000000213514353032552016671 0ustar richardrichardTZif2TZif2jÿÿÿÿi‡(¸ÿÿÿÿ¬b€ÿÿÿÿ±Ó”Pÿÿÿÿ²t]@ÿÿÿÿÈ[fÐÿÿÿÿÈÓQ@ÿÿÿÿÊ;HÐÿÿÿÿʼmÀÿÿÿÿÌ$ePÿÿÿÿÌœOÀÿÿÿÿÑÄ PÿÿÿÿÒ;õÀÿÿÿÿÓ£íPÿÿÿÿÔ×Àÿÿÿÿ÷`Ðÿÿÿÿ÷ÿ}@ÿÿÿÿù=DÐÿÿÿÿùãSÀÿÿÿÿúÛ;Ðÿÿÿÿû§†@ÿÿÿÿüÅ©Ðÿÿÿÿý‡h@ÿÿÿÿþ¸Ðÿÿÿÿÿ§ãÀ—âЇÅÀwÄÐpâ@`áP5À@ÃPH@ ¥P÷{À ‡P ðj@ àiP Ù†À ÀKP¹hÀ²¢P}›@QêÐf·À1ÌÐF™À[‚Ð&{À;dÐ]ÀFÐæ?Àû(ÐÏ\@Û Ð¯>@zSP @ Z5P!o@"CQÐ#Nä@$#3Ð%.Æ@&ŠÐ'âÀ'þ§P(÷ÒÐ)Þ‰P*×´Ð+¾kP,·–Ð-žMP.—xÐ/~/P0wZÐ1gKÐ2W<Ð3G-Ð4@YP5ÕP62°P6ý·P8ÌÐ8æÓÐ9û®Ð:ƵÐ;ÛÐ<¯ÒP=»rÐ>´P?›TÐ@f[ÐED5PEóŒÐG$PGÜ©PIùPI³PÐJãÛPKœmPLÌ÷ÐM…‰ÐN¿NÐOwàÐP•öPÿÿ²Èÿÿ²ÀÿÿÇÀÿÿ¹° LMTHMTCDTCST CST5CDT,M3.2.0/0,M11.1.0/1 NSTimeZones/zones/America/Jamaica0000644000175000017500000000052314353032552017017 0ustar richardrichardTZif2TZif2ÿÿÿÿi‡#~ÿÿÿÿ“´þp ¤` ­”ð ð†` à…p Ù¢à Àgp¹„੃ð™fà‰eðyHàiGðY*àI)ð9 à) ð")`íð `ÿÿ¸ÿÿ¸ÿÿ¹°ÿÿÇÀ LMTKMTESTEDT EST5 NSTimeZones/zones/America/Port_of_Spain0000644000175000017500000000026114353032552020233 0ustar richardrichardTZif2TZif2ÿÿÿÿz敹ÿÿÿÿËö2ÀÿÿÿÿÒ#ôpÿÿÿÿÒ`íÐÿÿÂÿÿÇÀÿÿÕÐÿÿÕÐ LMTASTAPTAWT AST4 NSTimeZones/zones/America/Moncton0000644000175000017500000000272514353032552017115 0ustar richardrichardTZif2TZif2’ÿÿÿÿ^í¼ÿÿÿÿ€ñ¶Pÿÿÿÿž¸…`ÿÿÿÿŸºÝPÿÿÿÿ»<8Ðÿÿÿÿ»´#@ÿÿÿÿ½Ðÿÿÿÿ½”@ÿÿÿÿ¾ûüÐÿÿÿÿ¿sç@ÿÿÿÿÀÛÞÐÿÿÿÿÁSÉ@ÿÿÿÿ»ÀÐÿÿÿÿÃ3«@ÿÿÿÿÄ›¢ÐÿÿÿÿÅ@ÿÿÿÿÆpøÐÿÿÿÿÇ Í@ÿÿÿÿÈHñÐÿÿÿÿÈí¯@ÿÿÿÿÊ^ÐÿÿÿÿÊÖËÀÿÿÿÿˈâ`ÿÿÿÿÒ#ôpÿÿÿÿÒ`íÐÿÿÿÿÓuÖàÿÿÿÿÔ@ÏÐÿÿÿÿÕU¸àÿÿÿÿÖ ±Ðÿÿÿÿ×5šàÿÿÿÿØ“ÐÿÿÿÿÙ|àÿÿÿÿÙàuÐÿÿÿÿÚþ™`ÿÿÿÿÛÀWÐÿÿÿÿÜÞ{`ÿÿÿÿÝ©tPÿÿÿÿÞ¾]`ÿÿÿÿ߉VPÿÿÿÿàž?`ÿÿÿÿái8Pÿÿÿÿâ~!`ÿÿÿÿãIPÿÿÿÿä^`ÿÿÿÿå(üPÿÿÿÿæGàÿÿÿÿçÐÿÿÿÿè'àÿÿÿÿéäÐÿÿÿÿêãàÿÿÿÿêöÆÐÿÿÿÿëæÅàÿÿÿÿìÖ¨ÐÿÿÿÿíÆ§àÿÿÿÿî¿ÅPÿÿÿÿï¯Ä`ÿÿÿÿðŸ§Pÿÿÿÿñ¦`ÿÿÿÿò‰Pÿÿÿÿóoˆ`ÿÿÿÿô_kPÿÿÿÿõOj`ÿÿÿÿö?MPÿÿÿÿ÷/L`ÿÿÿÿø(iÐÿÿÿÿù.`ÿÿÿÿúKÐÿÿÿÿúøJàÿÿÿÿûè-ÐÿÿÿÿüØ,àÿÿÿÿýÈÐÿÿÿÿþ¸àÿÿÿÿÿ§ñЗðà‡ÓÐwÒàpðP`ï`PÒP ³` –P •` ðxP àw` ٔРÀY`¹vЩuà™XЉWày:Ði9àYÐIà8þÐ(ýà"PßàýPñü`áßPÑÞ`ÁÁP±À`¡£P uòà!…P"UÔà#j¡Ð$5¶à%JƒÐ&˜à'*eÐ'þµ`) GÐ)Þ—`*ê)Ð+¾]|,Ó*l-ž?|.³ l/~!|0’îl1g=ü2rÐl3Gü4R²l5'ü62”l7ãü8°ì8æÅü9û’ì:Ƨü;Ûtì<¯Ä|=»Vì>¦|?›8ì@oˆ|A„UlBOj|Cd7lD/L|EDlEóšàÿÿÃDÿÿ¹°ÿÿÕÐÿÿÇÀ ÿÿÕÐÿÿÕÐLMTESTADTASTAWTAPT AST4ADT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Puerto_Rico0000644000175000017500000000026114353032552017723 0ustar richardrichardTZif2TZif2ÿÿÿÿz敹ÿÿÿÿËö2ÀÿÿÿÿÒ#ôpÿÿÿÿÒ`íÐÿÿÂÿÿÇÀÿÿÕÐÿÿÕÐ LMTASTAPTAWT AST4 NSTimeZones/zones/America/St_Lucia0000644000175000017500000000026114353032552017174 0ustar richardrichardTZif2TZif2ÿÿÿÿz敹ÿÿÿÿËö2ÀÿÿÿÿÒ#ôpÿÿÿÿÒ`íÐÿÿÂÿÿÇÀÿÿÕÐÿÿÕÐ LMTASTAPTAWT AST4 NSTimeZones/zones/America/Denver0000644000175000017500000000202214353032552016711 0ustar richardrichardTZif2TZif2aÿÿÿÿ^ °ÿÿÿÿž¦:ÿÿÿÿŸ»€ÿÿÿÿ †ÿÿÿÿ¡šé€ÿÿÿÿ¢eþÿÿÿÿ£„ÿÿÿÿ¤Eàÿÿÿÿ¤¦€ÿÿÿÿˉ ÿÿÿÿÒ#ôpÿÿÿÿÒaÿÿÿÿ÷/vÿÿÿÿø(”ÿÿÿÿùXÿÿÿÿúvÿÿÿÿúøuÿÿÿÿûèXÿÿÿÿüØWÿÿÿÿýÈ:ÿÿÿÿþ¸9ÿÿÿÿÿ¨˜‡þwýq€aPü€@û0Þ€5 À€ ­± 𢀠ࡠٿ Àƒ¹¡© ™ƒ‰‚yeidYGIF9))("E€ '€ò&â €ÒÁ뀱ê¡Í€ v!¯€"Uÿ#jÌ$5á%J®&Ã'*'þß) r)ÞÁ*êT+¾£,Óp€-ž….³R€/~g0“4€1g„2s€3Gf4Rø€5'H62Ú€7*8÷8ç 9ûÙ:Æî;Û»<° =»>ì?›@oÎA„›€BO°Cd}€D/’ED_€EóÅÿÿ”ÿÿ« ÿÿÿÿ«  ÿÿ« LMTMDTMSTMWTMPT MST7MDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Cordoba0000644000175000017500000000130414353032552017041 0ustar richardrichardTZif2TZif2=ÿÿÿÿrœ­°ÿÿÿÿ¢’0ÿÿÿÿ¶{R@ÿÿÿÿ·ɰÿÿÿÿ¸@ÿÿÿÿ¸Ôp0ÿÿÿÿº}Àÿÿÿÿºµ£°ÿÿÿÿ»ø±@ÿÿÿÿ¼–×0ÿÿÿÿ½ÙäÀÿÿÿÿ¾x °ÿÿÿÿ¿»@ÿÿÿÿÀZ°ÿÿÿÿÁ@ÿÿÿÿÂ;Ã0ÿÿÿÿÃ~ÐÀÿÿÿÿÄö°ÿÿÿÿÅ`@ÿÿÿÿÅþ*0ÿÿÿÿÇA7ÀÿÿÿÿÇà¯0ÿÿÿÿÈ”@ÿÿÿÿÊM¡°ÿÿÿÿÊî†ÀÿÿÿÿÎMÿ0ÿÿÿÿΰíÀÿÿÿÿÓ)5°ÿÿÿÿÔCdÀÿÿÿÿô=0ÿÿÿÿôŸöÀÿÿÿÿõl0ÿÿÿÿö2@ÿÿÿÿö柰ÿÿÿÿøCÀÿÿÿÿøÇÓ0ÿÿÿÿùôw@ÿÿÿÿúÓ6°ÿÿÿÿûÃ5Àÿÿÿÿü¼S0ÿÿÿÿý¬R@ÿÿÿÿþœ50ÿÿÿÿÿŒ4@£J°$o #”µ°$” %7ò°%ðv '!0'ÐX )ÿ@)°: *àÓ0+™W 7öư8¿*°Gw °GÜ Hú¢°I¼a ÿÿÃÐÿÿÃÐÿÿÇÀÿÿÕÐ ÿÿãàÿÿÕÐ LMTCMT-04-03-02 <-03>3 NSTimeZones/zones/America/Cuiaba0000644000175000017500000000164614353032552016665 0ustar richardrichardTZif2TZif2Y ÿÿÿÿ–ª{”ÿÿÿÿ¸Wðÿÿÿÿ¸ýN°ÿÿÿÿ¹ñB@ÿÿÿÿºÞ‚0ÿÿÿÿÚ8¼@ÿÿÿÿÚì@ÿÿÿÿÜïÀÿÿÿÿܹg0ÿÿÿÿÝû#@ÿÿÿÿÞ›ì0ÿÿÿÿßݨ@ÿÿÿÿàTA0ÿÿÿÿô˜ Àÿÿÿÿõl0ÿÿÿÿöÀr@ÿÿÿÿ÷,°ÿÿÿÿøQ:@ÿÿÿÿøÇÓ0ÿÿÿÿú àÀÿÿÿÿú©°ÿÿÿÿûì@ÿÿÿÿü‹‹°Éœ@xå° CÀ 3ݰ!w@" Ö°#XÀ#â~0%8À%ÔÕ0'!@'½ñ°)ÿ@)”™0*êÀ+k@°,ÀÃ@-fÒ0. ¥@/F´00€‡@1[°2W.À3x048b@4øÏ06 -@6Ïv°7öÔÀ8¸“09ßñ@::°;É ÀNþ°A‡@Bý0CQÐ@C÷ß0EMaÀEàû°G”@G·£0Hú°ÀI—…0JÚ’ÀK€¡°LºtÀM`ƒ°NšVÀOI 0Pƒs@Q G°RcU@S)°TC7@TéF0V#@VÉ(0Xû@X© 0YâÝ@Zˆì0[ÞnÀ\hÎ0ÿÿËlÿÿÕÐÿÿÇÀLMT-03-04 <-04>4 NSTimeZones/zones/America/Buenos_Aires0000644000175000017500000000130414353032552020046 0ustar richardrichardTZif2TZif2=ÿÿÿÿrœ¨Lÿÿÿÿ¢’0ÿÿÿÿ¶{R@ÿÿÿÿ·ɰÿÿÿÿ¸@ÿÿÿÿ¸Ôp0ÿÿÿÿº}Àÿÿÿÿºµ£°ÿÿÿÿ»ø±@ÿÿÿÿ¼–×0ÿÿÿÿ½ÙäÀÿÿÿÿ¾x °ÿÿÿÿ¿»@ÿÿÿÿÀZ°ÿÿÿÿÁ@ÿÿÿÿÂ;Ã0ÿÿÿÿÃ~ÐÀÿÿÿÿÄö°ÿÿÿÿÅ`@ÿÿÿÿÅþ*0ÿÿÿÿÇA7ÀÿÿÿÿÇà¯0ÿÿÿÿÈ”@ÿÿÿÿÊM¡°ÿÿÿÿÊî†ÀÿÿÿÿÎMÿ0ÿÿÿÿΰíÀÿÿÿÿÓ)5°ÿÿÿÿÔCdÀÿÿÿÿô=0ÿÿÿÿôŸöÀÿÿÿÿõl0ÿÿÿÿö2@ÿÿÿÿö柰ÿÿÿÿøCÀÿÿÿÿøÇÓ0ÿÿÿÿùôw@ÿÿÿÿúÓ6°ÿÿÿÿûÃ5Àÿÿÿÿü¼S0ÿÿÿÿý¬R@ÿÿÿÿþœ50ÿÿÿÿÿŒ4@£J°$o #”µ°$” %7ò°%ðv '!0'ÐX )ñ0)°: *àÓ0+™W 7öư8¿*°Gw °GÜ Hú¢°I¼a ÿÿÉ4ÿÿÃÐÿÿÇÀÿÿÕÐ ÿÿãàÿÿÕÐ LMTCMT-04-03-02 <-03>3 NSTimeZones/zones/America/Marigot0000644000175000017500000000026114353032552017073 0ustar richardrichardTZif2TZif2ÿÿÿÿz敹ÿÿÿÿËö2ÀÿÿÿÿÒ#ôpÿÿÿÿÒ`íÐÿÿÂÿÿÇÀÿÿÕÐÿÿÕÐ LMTASTAPTAWT AST4 NSTimeZones/zones/America/Ciudad_Juarez0000644000175000017500000000131614353032552020204 0ustar richardrichardTZif2TZif2=ÿÿÿÿ¥¶èpÿÿÿÿ¯ònàÿÿÿÿ¶fV`ÿÿÿÿ·CÒ`ÿÿÿÿ¸ 6`ÿÿÿÿ¸ý†ð1gv2sp3GX4Rêp5'H62Ú€7*8÷8ç 9ûÙ:õ;¶Ñ<° =»>ì?›@oÎA„›€BO°Cd}€D/’ED_€FtG$A€Gø‘I#€IØsJä€Kœ¥LÖ\€M|‡N¶>€O\iP– €Q4 NSTimeZones/zones/America/Boa_Vista0000644000175000017500000000065614353032552017350 0ustar richardrichardTZif2TZif2! ÿÿÿÿ–ªàÿÿÿÿ¸Wðÿÿÿÿ¸ýN°ÿÿÿÿ¹ñB@ÿÿÿÿºÞ‚0ÿÿÿÿÚ8¼@ÿÿÿÿÚì@ÿÿÿÿÜïÀÿÿÿÿܹg0ÿÿÿÿÝû#@ÿÿÿÿÞ›ì0ÿÿÿÿßݨ@ÿÿÿÿàTA0ÿÿÿÿô˜ Àÿÿÿÿõl0ÿÿÿÿöÀr@ÿÿÿÿ÷,°ÿÿÿÿøQ:@ÿÿÿÿøÇÓ0ÿÿÿÿú àÀÿÿÿÿú©°ÿÿÿÿûì@ÿÿÿÿü‹‹°Éœ@xå° CÀ 3ݰ!w@" Ö°7öÔÀ8¸“09ßñ@9é°ÿÿÇ ÿÿÕÐÿÿÇÀLMT-03-04 <-04>4 NSTimeZones/zones/America/Porto_Acre0000644000175000017500000000064214353032552017531 0ustar richardrichardTZif2TZif2 ÿÿÿÿ–ª†ÿÿÿÿ¸fÿÿÿÿ¸ý\Àÿÿÿÿ¹ñPPÿÿÿÿºÞ@ÿÿÿÿÚ8ÊPÿÿÿÿÚìPÿÿÿÿÜýÐÿÿÿÿܹu@ÿÿÿÿÝû1PÿÿÿÿÞ›ú@ÿÿÿÿßݶPÿÿÿÿàTO@ÿÿÿÿô˜Ðÿÿÿÿõz@ÿÿÿÿöÀ€Pÿÿÿÿ÷:ÀÿÿÿÿøQHPÿÿÿÿøÇá@ÿÿÿÿú îÐÿÿÿÿú©Àÿÿÿÿûì"Pÿÿÿÿü‹™ÀɪPxóÀ QÐ 3ëÀ!…P" äÀH`PRÀÿÿÀpÿÿÇÀÿÿ¹°ÿÿÇÀLMT-04-05 <-05>5 NSTimeZones/zones/America/Virgin0000644000175000017500000000026114353032552016727 0ustar richardrichardTZif2TZif2ÿÿÿÿz敹ÿÿÿÿËö2ÀÿÿÿÿÒ#ôpÿÿÿÿÒ`íÐÿÿÂÿÿÇÀÿÿÕÐÿÿÕÐ LMTASTAPTAWT AST4 NSTimeZones/zones/America/St_Thomas0000644000175000017500000000026114353032552017372 0ustar richardrichardTZif2TZif2ÿÿÿÿz敹ÿÿÿÿËö2ÀÿÿÿÿÒ#ôpÿÿÿÿÒ`íÐÿÿÂÿÿÇÀÿÿÕÐÿÿÕÐ LMTASTAPTAWT AST4 NSTimeZones/zones/America/Winnipeg0000644000175000017500000000241614353032552017255 0ustar richardrichardTZif2TZif2}ÿÿÿÿdä°”ÿÿÿÿ›ûàÿÿÿÿ›ÃºPÿÿÿÿž¸¡€ÿÿÿÿŸºùpÿÿÿÿ ;€ÿÿÿÿÃO„ðÿÿÿÿˈþ€ÿÿÿÿÒ#ôpÿÿÿÿÒa ðÿÿÿÿÓˆhÿÿÿÿÔS`ðÿÿÿÿÕUÕÿÿÿÿÖ Íðÿÿÿÿ×5·ÿÿÿÿدðÿÿÿÿÙ™ÿÿÿÿÙà‘ðÿÿÿÿÛÿÿÿÿÛÈ\ðÿÿÿÿÜÞ—€ÿÿÿÿÝ©pÿÿÿÿÞ¾y€ÿÿÿÿ߉rpÿÿÿÿàž[€ÿÿÿÿáiTpÿÿÿÿâ~=€ÿÿÿÿãI6pÿÿÿÿä^€ÿÿÿÿå)pÿÿÿÿæG<ÿÿÿÿç4ðÿÿÿÿè'ÿÿÿÿèòðÿÿÿÿêÿÿÿÿêÑøðÿÿÿÿëæâÿÿÿÿìÖÄðÿÿÿÿíÆÄÿÿÿÿðÿÿÿÿóo¤€ÿÿÿÿô1bðÿÿÿÿùJ€ÿÿÿÿúvÿÿÿÿúøgÿÿÿÿûèXÿÿÿÿüØIÿÿÿÿýÈ:ÿÿÿÿþ¸+ÿÿÿÿÿ¨˜ ‡þwïq€a €Pü€@í€0Þ€ Ï€ À€ ±€ ð¢€ à“€ Ù¿ Àu€¹¡©’™ƒ‰tyeiVYGI89))"E€ü'€ò€â €Ñú€Á뀱܀¡Í€ v!¯€"Uñ#jÌ$5Ó%J®&µ'*'þÑ€) r)Þ³€*êT+¾•€,Óp€-žw€.³R€/~Y€0“4€1gv2s€3GX4Rø€5':62Ú€78÷8æþ9ûÙ:Æà;Û»<¯ü€=»>Þ€?›@oÀ€A„›€BO¢€Cd}€D/„€EDQpEó·ÿÿ¤ìÿÿ¹°ÿÿ« ÿÿ¹° ÿÿ¹°LMTCDTCSTCWTCPT CST6CDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Mexico_City0000644000175000017500000000140514353032552017706 0ustar richardrichardTZif2TZif2Dÿÿÿÿ¥¶èpÿÿÿÿ¯ònàÿÿÿÿ¶fV`ÿÿÿÿ·CÒ`ÿÿÿÿ¸ 6`ÿÿÿÿ¸ý†ðÿÿÿÿÅÞ°`ÿÿÿÿÆ—4PÿÿÿÿÉUñàÿÿÿÿÉêÝPÿÿÿÿÏÆàÿÿÿÿÏ·VPÿÿÿÿÚ™àÿÿÿÿÛvƒÐ1gv2sp3GX4Rêp5':62Ìp78èð8æþ9ûÊð:õ€;¶Âð<¯ü€=»Žð>Þ€?›pð@oÀ€A„pBO¢€CdopD/„€EDQpFf€G$3pGøƒIpIØeJã÷pK¸GLÍðM˜)N¬õðOx PŒ×ðQa'€Rl¹ðSA €TL›ðU ë€V,}ðWÍ€XšpXீYõ|pZÀ‘€[Õ^p\©®]µ@p^‰_•"p`ira~>ðbITc^ ðÿÿ£ ÿÿÿÿ« ÿÿ«  ÿÿ¹°ÿÿ¹°LMTMSTCSTMDTCDTCWT CST6 NSTimeZones/zones/America/Adak0000644000175000017500000000171114353032552016332 0ustar richardrichardTZif2TZif2T !ÿÿÿÿ?ÂýÑÿÿÿÿ}‡Z^ÿÿÿÿˉDÐÿÿÿÿÒ#ôpÿÿÿÿÒaP@ÿÿÿÿúÒU°ÿÿÿÿþ¸qPÿÿÿÿÿ¨T@˜SPˆ6@x5PqRÀaQÐQ4ÀA3Ð1ÀmÐ øÀ ­éP ðÚÀ àÙÐ Ù÷@ À»Ð¹Ù@©ØP™»@‰ºPy@iœPY@I~P9a@)`P"}À BP_À+" òPÀâ3°Ò2À°²À¡÷° vG@!Ù°"V)@#jö0$6 @%JØ0&í@'*º0'ÿ À) œ0)ÞëÀ*ê~0+¾ÍÀ,Óš°-ž¯À.³|°/~‘À0“^°1g®@2s@°3G@4S"°5'r@63°7T@8!08ç6@9ü0:Ç@;Ûå0<°4À=»Ç0>À?›©0@oøÀA„ŰBOÚÀCd§°D/¼ÀED‰°Eóï@                        «âÿÿZbÿÿePÿÿs`ÿÿs` ÿÿePÿÿs`ÿÿs`ÿÿpÿÿs`LMTNSTNWTNPTBSTBDTAHSTHDT HST10HDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Dawson_Creek0000644000175000017500000000125314353032552020037 0ustar richardrichardTZif2TZif2:ÿÿÿÿ^=t8ÿÿÿÿž¸½ ÿÿÿÿŸ»ÿÿÿÿˉ ÿÿÿÿÒ#ôpÿÿÿÿÒa&ÿÿÿÿÕUñ ÿÿÿÿÖ êÿÿÿÿ×5Ó ÿÿÿÿØÌÿÿÿÿÙµ ÿÿÿÿÙà®ÿÿÿÿÚþÑ ÿÿÿÿÛÀÿÿÿÿÜÞ³ ÿÿÿÿÝ©¬ÿÿÿÿÞ¾• ÿÿÿÿ߉Žÿÿÿÿàžw ÿÿÿÿáipÿÿÿÿâ~Y ÿÿÿÿãIRÿÿÿÿä^; ÿÿÿÿå)4ÿÿÿÿæGX ÿÿÿÿçQÿÿÿÿè': ÿÿÿÿèò3ÿÿÿÿê ÿÿÿÿêÒÿÿÿÿëæþ ÿÿÿÿì±÷ÿÿÿÿíÆà ÿÿÿÿî‘Ùÿÿÿÿï¯ü ÿÿÿÿðq»ÿÿÿÿñÞ ÿÿÿÿòÁÿÿÿÿóoÀ ÿÿÿÿô_£ÿÿÿÿõO¢ ÿÿÿÿö?…ÿÿÿÿ÷/„ ÿÿÿÿø(¢ÿÿÿÿùf ÿÿÿÿú„ÿÿÿÿúøƒ ÿÿÿÿûèfÿÿÿÿüØe ÿÿÿÿýÈHÿÿÿÿþ¸G ÿÿÿÿÿ¨*˜) ˆ x q(a' ðÿÿHÿÿÿÿ€ÿÿ ÿÿÿÿLMTPDTPSTPWTPPTMST MST7 NSTimeZones/zones/America/Guatemala0000644000175000017500000000032414353032552017371 0ustar richardrichardTZif2TZif2  ÿÿÿÿŸêÜU¬`Í–Ð,x`ÏäP'êîà(È\ÐDTR`EKPÿÿ«$ÿÿ¹°ÿÿ« LMTCDTCST CST6 NSTimeZones/zones/America/Glace_Bay0000644000175000017500000000156014353032552017302 0ustar richardrichardTZif2TZif2Oÿÿÿÿ€ñ¨4ÿÿÿÿž¸…`ÿÿÿÿŸºÝPÿÿÿÿˈâ`ÿÿÿÿÒ#ôpÿÿÿÿÒ`íÐÿÿÿÿàž?`ÿÿÿÿái8P`ï`PÒP@Ñ`0´P ³` –P •` ðxP àw` ٔРÀY`¹vЩuà™XЉWày:Ði9àYÐIà8þÐ(ýà"PßàýPñü`áßPÑÞ`ÁÁP±À`¡£P uòà!…P"UÔà#j¡Ð$5¶à%JƒÐ&˜à'*eÐ'þµ`) GÐ)Þ—`*ê)Ð+¾y`,ÓFP-ž[`.³(P/~=`0“ P1gYà2rìP3G;à4RÎP5'à62°P7ÿà8ÌÐ8æáà9û®Ð:ÆÃà;ÛÐ<¯à`=»rÐ>Â`?›TÐ@o¤`A„qPBO†`CdSPD/h`ED5PEóšàÿÿÇÌÿÿÕÐÿÿÇÀÿÿÕÐ ÿÿÕÐLMTADTASTAWTAPT AST4ADT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Merida0000644000175000017500000000121614353032552016673 0ustar richardrichardTZif2TZif29ÿÿÿÿ¥¶Ú`†Õ`LKP1gv2sp3GX4Rêp5':62Ìp78èð8æþ9ûÊð:õ€;¶Âð<¯ü€=»Žð>Þ€?›pð@oÀ€A„pBO¢€CdopD/„€EDQpFf€G$3pGøƒIpIØeJã÷pK¸GLÍðM˜)N¬õðOx PŒ×ðQa'€Rl¹ðSA €TL›ðU ë€V,}ðWÍ€XšpXீYõ|pZÀ‘€[Õ^p\©®]µ@p^‰_•"p`ira~>ðbITc^ ðÿÿ«üÿÿ« ÿÿ¹°ÿÿ¹° LMTCSTESTCDT CST6 NSTimeZones/zones/America/Fort_Wayne0000644000175000017500000000102314353032552017543 0ustar richardrichardTZif2TZif2&ÿÿÿÿ^þ ÿÿÿÿž¦,€ÿÿÿÿŸºùpÿÿÿÿ †€ÿÿÿÿ¡šÛpÿÿÿÿÊW"€ÿÿÿÿÊØGpÿÿÿÿˈþ€ÿÿÿÿÒ#ôpÿÿÿÿÒa ðÿÿÿÿÓuóÿÿÿÿÔ@ëðÿÿÿÿÕUÕÿÿÿÿÖ Íðÿÿÿÿ×5·ÿÿÿÿدðÿÿÿÿÙ™ÿÿÿÿÙà‘ðÿÿÿÿÚþµ€ÿÿÿÿÛÀsðÿÿÿÿÜÞ—€ÿÿÿÿÝ©pÿÿÿÿÞ¾y€ÿÿÿÿ߉rpÿÿÿÿàž[€ÿÿÿÿáiTpÿÿÿÿâ~=€ÿÿÿÿãI6pÿÿÿÿä^€ÿÿÿÿèòðÿÿÿÿêÿÿÿÿþ¸ðÿÿÿÿÿ§ÿà—þð‡áàD/vpEDC`Eó¨ðÿÿ¯:ÿÿ¹°ÿÿ« ÿÿ¹° ÿÿ¹°ÿÿ¹°ÿÿÇÀLMTCDTCSTCWTCPTESTEDT EST5EDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Guadeloupe0000644000175000017500000000026114353032552017563 0ustar richardrichardTZif2TZif2ÿÿÿÿz敹ÿÿÿÿËö2ÀÿÿÿÿÒ#ôpÿÿÿÿÒ`íÐÿÿÂÿÿÇÀÿÿÕÐÿÿÕÐ LMTASTAPTAWT AST4 NSTimeZones/zones/America/Dawson0000644000175000017500000000200514353032552016722 0ustar richardrichardTZif2TZif2] %ÿÿÿÿ}†Ž´ÿÿÿÿž¸Ë°ÿÿÿÿŸ»# ÿÿÿÿ Ð °ÿÿÿÿ¡¢Ò€ÿÿÿÿˉ(°ÿÿÿÿÒ#ôpÿÿÿÿÒa4 ÿÿÿÿ÷/vÿÿÿÿø(¢0ìir YUIT 97)6 "S  5ò4 âÒ Áù±ø ¡Û v+ !½"V #jÚ$5ï %J¼&Ñ '*ž'þí ) €)ÞÏ *êb+¾± ,Ó~-ž“ .³`/~u 0“B1g’ 2s$3Gt 4S5'V 62è78 88ç 9ûç:Æü ;ÛÉ<° =»«>ú ?›@oÜ A„©BO¾ Cd‹D/  EDmEóÓ G-ŠGÓµ I lI³— JíNKœ³ LÖjM|• N¶LO\w P–.Q0ÿÿÿÿýö(–u0ØR WаÆ: –°ßژƟ( ZN0 Ûs 0 ‡ ç0_i ÙÖ0?K ‰-°1¢ !ÃT0"'x #¡ä°$” %Jg°%ç< '!0'ÐX ) +°)°: *àÓ0+ ALö0BF/ÀCH£ÐDœÀEKPEó~ÀGgÐGÓ`ÀHèIÐI³BÀJÈ+ÐKœ_@L¨ ÐM|A@N‡ïÐO\#@Pq PQ<@RPîPSç@T0ÐPTûÉ@ÿÿËMÿÿËMÿÿÇÀÿÿÎÈ ÿÿÕÐÿÿÕÐÿÿÜØÿÿãàÿÿêè LMTMMT-04-0330-03-0230-02-0130 <-03>3 NSTimeZones/zones/America/Sao_Paulo0000644000175000017500000000167014353032552017360 0ustar richardrichardTZif2TZif2[ ÿÿÿÿ–ªr´ÿÿÿÿ¸Iàÿÿÿÿ¸ý@ ÿÿÿÿ¹ñ40ÿÿÿÿºÞt ÿÿÿÿÚ8®0ÿÿÿÿÚëú0ÿÿÿÿÜá°ÿÿÿÿܹY ÿÿÿÿÝû0ÿÿÿÿÞ›Þ ÿÿÿÿßÝš0ÿÿÿÿàT3 ÿÿÿÿôZ 0ÿÿÿÿõ^ ÿÿÿÿöÀd0ÿÿÿÿ÷ ÿÿÿÿøQ,0ÿÿÿÿøÇÅ ÿÿÿÿú Ò°ÿÿÿÿú¨ø ÿÿÿÿûì0ÿÿÿÿü‹} ÉŽ0x×  5° 3Ï !i0" È #X°#âp %7ò°%ÔÇ '!0'½ã )ñ0)”‹ *ê °+k2 ,Àµ0-fÄ . —0/F¦ 0€y01M 2W °3j 48T04øÁ 6 06Ïh 7öư8¸… 9ßã0:, ;Èÿ°Nð ?‘þ0@.Ò A†ø0Bï CQÂ0C÷Ñ EMS°Eàí G†0G·• Hú¢°I—w JÚ„°K€“ Lºf°M`u NšH°OI’ Pƒe0Q 9 RcG0S TC)0Té8 V# 0VÉ Xí0X¨ü YâÏ0ZˆÞ [Þ`°\hÀ ÿÿÔLÿÿãàÿÿÕÐLMT-02-03 <-03>3 NSTimeZones/zones/America/Grenada0000644000175000017500000000026114353032552017032 0ustar richardrichardTZif2TZif2ÿÿÿÿz敹ÿÿÿÿËö2ÀÿÿÿÿÒ#ôpÿÿÿÿÒ`íÐÿÿÂÿÿÇÀÿÿÕÐÿÿÕÐ LMTASTAPTAWT AST4 NSTimeZones/zones/America/Ensenada0000644000175000017500000000200114353032552017201 0ustar richardrichardTZif2TZif2^ÿÿÿÿ¥¶èpÿÿÿÿ©yOpÿÿÿÿ¯ò|ðÿÿÿÿ¶fdpÿÿÿÿ·ÿÿÿÿ¸ òðÿÿÿÿËê€ÿÿÿÿÒ#ôpÿÿÿÿÒ™ºpÿÿÿÿ×YÿÿÿÿØ‘´ðÿÿÿÿâ~KÿÿÿÿãIRÿÿÿÿä^-ÿÿÿÿå)4ÿÿÿÿæGJÿÿÿÿçQÿÿÿÿè',ÿÿÿÿèò3ÿÿÿÿêÿÿÿÿêÒÿÿÿÿëæðÿÿÿÿì±÷ÿÿÿÿíÆÒÿÿÿÿî‘Ù ௠ ÙÍ À‘ ¹¯©® ™‘‰ ysir YUIT 97)6 "S  5ò4 âÒ Áù±ø ¡Û v+ !½"V #jÚ$5ï %J¼&Ñ '*ž'þí ) €)ÞÏ *êb+¾± ,Ó~-ž“ .³`/~u 0“B1g’ 2s$3Gt 4S5'V 62è78 88ç 9ûç:Æü ;ÛÉ<° =»«>ú ?›@oÜ A„©BO¾ Cd‹D/  EDmF‚ G$OGøŸ I1IØ JäKœ³ ÿÿ’Lÿÿÿÿ€ÿÿ ÿÿÿÿLMTMSTPSTPDTPWTPPT PST8PDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Santo_Domingo0000644000175000017500000000047514353032552020240 0ustar richardrichardTZif2TZif2ÿÿÿÿi‡ÿÿÿÿºßB`ÿÿÿÿúKÐÿÿÿÿú§Ã@ÿÿÿÿÿ§ñÐC{ȇÓÐúHpðPÝHPÒP¿‰H0´P ¼È –P9û¼à:)á`ÿÿ¾xÿÿ¾`ÿÿÇÀ ÿÿ¹° ÿÿÀ¸ÿÿÇÀLMTSDMTEDTEST-0430AST AST4 NSTimeZones/zones/America/Miquelon0000644000175000017500000000104614353032552017264 0ustar richardrichardTZif2TZif2+ÿÿÿÿ‘¶8¨ncÀ uäÐ!w@"UÆÐ#j“À$5¨Ð%JuÀ&ŠÐ'*WÀ'þ§P) 9À)Þ‰P*êÀ+¾kP,Ó8@-žMP.³@/~/P0’ü@1gKÐ2rÞ@3G-Ð4RÀ@5'Ð62¢@7ñÐ8¾À8æÓÐ9û À:ƵÐ;Û‚À<¯ÒP=»dÀ>´P?›FÀ@o–PA„c@BOxPCdE@D/ZPED'@EóŒÐÿÿËXÿÿÇÀÿÿÕÐÿÿãà LMTAST-03-02 <-03>3<-02>,M3.2.0,M11.1.0 NSTimeZones/zones/America/Bahia0000644000175000017500000000125214353032552016476 0ustar richardrichardTZif2TZif2= ÿÿÿÿ–ªkÿÿÿÿ¸Iàÿÿÿÿ¸ý@ ÿÿÿÿ¹ñ40ÿÿÿÿºÞt ÿÿÿÿÚ8®0ÿÿÿÿÚëú0ÿÿÿÿÜá°ÿÿÿÿܹY ÿÿÿÿÝû0ÿÿÿÿÞ›Þ ÿÿÿÿßÝš0ÿÿÿÿàT3 ÿÿÿÿô—ÿ°ÿÿÿÿõ^ ÿÿÿÿöÀd0ÿÿÿÿ÷ ÿÿÿÿøQ,0ÿÿÿÿøÇÅ ÿÿÿÿú Ò°ÿÿÿÿú¨ø ÿÿÿÿûì0ÿÿÿÿü‹} ÉŽ0x×  5° 3Ï !i0" È #X°#âp %7ò°%ÔÇ '!0'½ã )ñ0)”‹ *ê °+k2 ,Àµ0-fÄ . —0/F¦ 0€y01M 2W °3j 48T04øÁ 6 06Ïh 7öư8¸… 9ßã0:, ;Èÿ°Nð NšH°OI’ ÿÿÛäÿÿãàÿÿÕÐLMT-02-03 <-03>3 NSTimeZones/zones/America/Nuuk0000644000175000017500000000164314353032552016420 0ustar richardrichardTZif2TZif2X ÿÿÿÿ›€hM|P3ú#ëÜÍó¾ã¯Ó Ñ¼½¬®œŸŒ| lr!\c"LT#†A?›@f#A„9BFCdD%çECýFÉG#ßGîæIÁIÎÈJã£K®ªLÌ¿MŽŒN¬¡OnnPŒƒQWŠRleS7lTLGUNV,)V÷0XFX×Yõ(Z¶ô[Õ \ ]´ì^ó_”Î`_Õa}êb?·c]Ìd™ÿÿÏ€ÿÿÕÐÿÿãàÿÿãàLMT-03-02 <-02>2 NSTimeZones/zones/America/Mendoza0000644000175000017500000000130414353032552017065 0ustar richardrichardTZif2TZif2=ÿÿÿÿrœ²ÿÿÿÿ¢’0ÿÿÿÿ¶{R@ÿÿÿÿ·ɰÿÿÿÿ¸@ÿÿÿÿ¸Ôp0ÿÿÿÿº}Àÿÿÿÿºµ£°ÿÿÿÿ»ø±@ÿÿÿÿ¼–×0ÿÿÿÿ½ÙäÀÿÿÿÿ¾x °ÿÿÿÿ¿»@ÿÿÿÿÀZ°ÿÿÿÿÁ@ÿÿÿÿÂ;Ã0ÿÿÿÿÃ~ÐÀÿÿÿÿÄö°ÿÿÿÿÅ`@ÿÿÿÿÅþ*0ÿÿÿÿÇA7ÀÿÿÿÿÇà¯0ÿÿÿÿÈ”@ÿÿÿÿÊM¡°ÿÿÿÿÊî†ÀÿÿÿÿÎMÿ0ÿÿÿÿΰíÀÿÿÿÿÓ)5°ÿÿÿÿÔCdÀÿÿÿÿô=0ÿÿÿÿôŸöÀÿÿÿÿõl0ÿÿÿÿö2@ÿÿÿÿö柰ÿÿÿÿøCÀÿÿÿÿøÇÓ0ÿÿÿÿùôw@ÿÿÿÿúÓ6°ÿÿÿÿûÃ5Àÿÿÿÿü¼S0ÿÿÿÿý¬R@ÿÿÿÿþœ50ÿÿÿÿÿŒ4@£J°$o #”µ°$” %7ò°%ðv '4@'Íð(úgÀ)°H°*àá@+™W 7öư8¿*°@°°AV>ÀGw °GÜ ÿÿ¿|ÿÿÃÐÿÿÇÀÿÿÕÐ ÿÿãàÿÿÕÐ LMTCMT-04-03-02 <-03>3 NSTimeZones/zones/America/Jujuy0000644000175000017500000000126214353032552016601 0ustar richardrichardTZif2TZif2;ÿÿÿÿrœ®¸ÿÿÿÿ¢’0ÿÿÿÿ¶{R@ÿÿÿÿ·ɰÿÿÿÿ¸@ÿÿÿÿ¸Ôp0ÿÿÿÿº}Àÿÿÿÿºµ£°ÿÿÿÿ»ø±@ÿÿÿÿ¼–×0ÿÿÿÿ½ÙäÀÿÿÿÿ¾x °ÿÿÿÿ¿»@ÿÿÿÿÀZ°ÿÿÿÿÁ@ÿÿÿÿÂ;Ã0ÿÿÿÿÃ~ÐÀÿÿÿÿÄö°ÿÿÿÿÅ`@ÿÿÿÿÅþ*0ÿÿÿÿÇA7ÀÿÿÿÿÇà¯0ÿÿÿÿÈ”@ÿÿÿÿÊM¡°ÿÿÿÿÊî†ÀÿÿÿÿÎMÿ0ÿÿÿÿΰíÀÿÿÿÿÓ)5°ÿÿÿÿÔCdÀÿÿÿÿô=0ÿÿÿÿôŸöÀÿÿÿÿõl0ÿÿÿÿö2@ÿÿÿÿö柰ÿÿÿÿøCÀÿÿÿÿøÇÓ0ÿÿÿÿùôw@ÿÿÿÿúÓ6°ÿÿÿÿûÃ5Àÿÿÿÿü¼S0ÿÿÿÿý¬R@ÿÿÿÿþœ50ÿÿÿÿÿŒ4@£J°$o #”µ°$” %7ò°%ðv '*WÀ'âÛ°(îŠ@)°: *àÓ0+™W 7öư8¿*°Gw °GÜ ÿÿÂÈÿÿÃÐÿÿÇÀÿÿÕÐ ÿÿãàÿÿÕÐ LMTCMT-04-03-02 <-03>3 NSTimeZones/zones/America/Yellowknife0000644000175000017500000000151414353032552017763 0ustar richardrichardTZif2TZif2Kÿÿÿÿ¾*ÿÿÿÿˉ ÿÿÿÿÒ#ôpÿÿÿÿÒaaPü€@û0Þ€ Ý À€ ¿ 𢀠ࡠٿ Àƒ¹¡© ™ƒ‰‚yeidYGIF9))("E€ '€ò&â €ÒÁ뀱ê¡Í€ v!¯€"Uÿ#jÌ$5á%J®&Ã'*'þß) r)ÞÁ*êT+¾£,Óp€-ž….³R€/~g0“4€1g„2s€3Gf4Rø€5'H62Ú€7*8÷8ç 9ûÙ:Æî;Û»<° =»>ì?›@oÎA„›€BO°Cd}€D/’ED_€EóÅÿÿ« ÿÿ« ÿÿ ÿÿ« -00MWTMPTMSTMDT MST7MDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Santa_Isabel0000644000175000017500000000200114353032552020010 0ustar richardrichardTZif2TZif2^ÿÿÿÿ¥¶èpÿÿÿÿ©yOpÿÿÿÿ¯ò|ðÿÿÿÿ¶fdpÿÿÿÿ·ÿÿÿÿ¸ òðÿÿÿÿËê€ÿÿÿÿÒ#ôpÿÿÿÿÒ™ºpÿÿÿÿ×YÿÿÿÿØ‘´ðÿÿÿÿâ~KÿÿÿÿãIRÿÿÿÿä^-ÿÿÿÿå)4ÿÿÿÿæGJÿÿÿÿçQÿÿÿÿè',ÿÿÿÿèò3ÿÿÿÿêÿÿÿÿêÒÿÿÿÿëæðÿÿÿÿì±÷ÿÿÿÿíÆÒÿÿÿÿî‘Ù ௠ ÙÍ À‘ ¹¯©® ™‘‰ ysir YUIT 97)6 "S  5ò4 âÒ Áù±ø ¡Û v+ !½"V #jÚ$5ï %J¼&Ñ '*ž'þí ) €)ÞÏ *êb+¾± ,Ó~-ž“ .³`/~u 0“B1g’ 2s$3Gt 4S5'V 62è78 88ç 9ûç:Æü ;ÛÉ<° =»«>ú ?›@oÜ A„©BO¾ Cd‹D/  EDmF‚ G$OGøŸ I1IØ JäKœ³ ÿÿ’Lÿÿÿÿ€ÿÿ ÿÿÿÿLMTMSTPSTPDTPWTPPT PST8PDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Nome0000644000175000017500000000171714353032552016376 0ustar richardrichardTZif2TZif2T &ÿÿÿÿ?ÂýÑÿÿÿÿ}‡OÒÿÿÿÿˉDÐÿÿÿÿÒ#ôpÿÿÿÿÒaP@ÿÿÿÿúÒU°ÿÿÿÿþ¸qPÿÿÿÿÿ¨T@˜SPˆ6@x5PqRÀaQÐQ4ÀA3Ð1ÀmÐ øÀ ­éP ðÚÀ àÙÐ Ù÷@ À»Ð¹Ù@©ØP™»@‰ºPy@iœPY@I~P9a@)`P"}À BP_À+òB°â% Ò$°Â ²°¡é  v90!Ë "V0#jè $5ý0%JÊ &ß0'*¬ 'þû°) Ž )Þݰ*êp +¾¿°,ÓŒ -ž¡°.³n /~ƒ°0“P 1g 02s2 3G‚04S 5'd062ö 7F08 8ç(09ûõ :Ç 0;Û× <°&°=»¹ >°?›› @oê°A„· BO̰Cd™ D/®°ED{ Eóá0                        ¶nÿÿdîÿÿePÿÿs`ÿÿs` ÿÿePÿÿs`ÿÿpÿÿ€ÿÿp!LMTNSTNWTNPTBSTBDTYSTAKDTAKST AKST9AKDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Anguilla0000644000175000017500000000026114353032552017225 0ustar richardrichardTZif2TZif2ÿÿÿÿz敹ÿÿÿÿËö2ÀÿÿÿÿÒ#ôpÿÿÿÿÒ`íÐÿÿÂÿÿÇÀÿÿÕÐÿÿÕÐ LMTASTAPTAWT AST4 NSTimeZones/zones/America/Rosario0000644000175000017500000000130414353032552017106 0ustar richardrichardTZif2TZif2=ÿÿÿÿrœ­°ÿÿÿÿ¢’0ÿÿÿÿ¶{R@ÿÿÿÿ·ɰÿÿÿÿ¸@ÿÿÿÿ¸Ôp0ÿÿÿÿº}Àÿÿÿÿºµ£°ÿÿÿÿ»ø±@ÿÿÿÿ¼–×0ÿÿÿÿ½ÙäÀÿÿÿÿ¾x °ÿÿÿÿ¿»@ÿÿÿÿÀZ°ÿÿÿÿÁ@ÿÿÿÿÂ;Ã0ÿÿÿÿÃ~ÐÀÿÿÿÿÄö°ÿÿÿÿÅ`@ÿÿÿÿÅþ*0ÿÿÿÿÇA7ÀÿÿÿÿÇà¯0ÿÿÿÿÈ”@ÿÿÿÿÊM¡°ÿÿÿÿÊî†ÀÿÿÿÿÎMÿ0ÿÿÿÿΰíÀÿÿÿÿÓ)5°ÿÿÿÿÔCdÀÿÿÿÿô=0ÿÿÿÿôŸöÀÿÿÿÿõl0ÿÿÿÿö2@ÿÿÿÿö柰ÿÿÿÿøCÀÿÿÿÿøÇÓ0ÿÿÿÿùôw@ÿÿÿÿúÓ6°ÿÿÿÿûÃ5Àÿÿÿÿü¼S0ÿÿÿÿý¬R@ÿÿÿÿþœ50ÿÿÿÿÿŒ4@£J°$o #”µ°$” %7ò°%ðv '!0'ÐX )ÿ@)°: *àÓ0+™W 7öư8¿*°Gw °GÜ Hú¢°I¼a ÿÿÃÐÿÿÃÐÿÿÇÀÿÿÕÐ ÿÿãàÿÿÕÐ LMTCMT-04-03-02 <-03>3 NSTimeZones/zones/America/Thunder_Bay0000644000175000017500000000326514353032552017704 0ustar richardrichardTZif2TZif2¬ÿÿÿÿrîxìÿÿÿÿž¸“pÿÿÿÿŸºë`ÿÿÿÿ ‡.Èÿÿÿÿ¡š±@ÿÿÿÿ¢”ðÿÿÿÿ£U©@ÿÿÿÿ¤†]ðÿÿÿÿ¥(x`ÿÿÿÿ¦f?ðÿÿÿÿ§ Nàÿÿÿÿ¨F!ðÿÿÿÿ¨ì0àÿÿÿÿªÉpÿÿÿÿªÕM`ÿÿÿÿ«ü«pÿÿÿÿ¬µ/`ÿÿÿÿ­Üpÿÿÿÿ®•`ÿÿÿÿ¯¼opÿÿÿÿ°~-àÿÿÿÿ±œQpÿÿÿÿ²gJ`ÿÿÿÿ³|3pÿÿÿÿ´G,`ÿÿÿÿµ\pÿÿÿÿ¶'`ÿÿÿÿ·;÷pÿÿÿÿ¸ð`ÿÿÿÿ¹%ðÿÿÿÿ¹æÒ`ÿÿÿÿ»õðÿÿÿÿ»Ïîàÿÿÿÿ¼ä×ðÿÿÿÿ½¯Ðàÿÿÿÿ¾Ä¹ðÿÿÿÿ¿²àÿÿÿÿÀ¤›ðÿÿÿÿÁo”àÿÿÿÿ„}ðÿÿÿÿÃOvàÿÿÿÿÄd_ðÿÿÿÿÅ/XàÿÿÿÿÆM|pÿÿÿÿÇ:àÿÿÿÿÈ-^pÿÿÿÿˈðpÿÿÿÿÒ#ôpÿÿÿÿÒ`ûàÿÿÿÿÓuäðÿÿÿÿÔ@ÝàÿÿÿÿÕUªÐÿÿÿÿÖ £Àÿÿÿÿ×5ŒÐÿÿÿÿØ…ÀÿÿÿÿÙnÐÿÿÿÿÚ3v@ÿÿÿÿÚþ§pÿÿÿÿÜt`ÿÿÿÿÜÞ‰pÿÿÿÿÝ©‚`ÿÿÿÿÞ¾kpÿÿÿÿ߉d`ÿÿÿÿàžMpÿÿÿÿáiF`ÿÿÿÿâ~/pÿÿÿÿãI(`ÿÿÿÿä^pÿÿÿÿå) `ÿÿÿÿæG-ðÿÿÿÿç&àÿÿÿÿè'ðÿÿÿÿéòàÿÿÿÿêñðÿÿÿÿêöÔàÿÿÿÿëæÓðÿÿÿÿìÖ¶àÿÿÿÿíÆµðÿÿÿÿî¿Ó`ÿÿÿÿï¯ÒpÿÿÿÿðŸµ`ÿÿÿÿñ´pÿÿÿÿò—`ÿÿÿÿóo–pÿÿÿÿô_y`ÿÿÿÿõOxpÿÿÿÿö?[`ÿÿÿÿ÷/Zpÿÿÿÿø(wàÿÿÿÿùÐp?›bà@o²pA„`BO”pCda`D/vpEDC`Eó¨ðÿÿµ”ÿÿÇÀÿÿ¹°ÿÿÇÀ ÿÿÇÀLMTEDTESTEWTEPT EST5EDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Atikokan0000644000175000017500000000022514353032552017232 0ustar richardrichardTZif2TZif2 ÿÿÿÿi‡&ÿÿÿÿ‹ôaèÿÿµpÿÿµÿÿ¹°LMTCMTEST EST5 NSTimeZones/zones/America/Bahia_Banderas0000644000175000017500000000133014353032552020272 0ustar richardrichardTZif2TZif2?ÿÿÿÿ¥¶èpÿÿÿÿ¯ònàÿÿÿÿ¶fV`ÿÿÿÿ·CÒ`ÿÿÿÿ¸ 6`ÿÿÿÿ¸ý†ðÿÿÿÿËêq`ÿÿÿÿØ‘´ðp€1g„2s€3Gf4Rø€5'H62Ú€7*8÷8ç 9ûÙ:õ;¶Ñ<° =»>ì?›@oÎA„›€BO°Cd}€D/’ED_€FtG$A€Gø‘I#€IØsJä€K¸ULÍðM˜)N¬õðOx PŒ×ðQa'€Rl¹ðSA €TL›ðU ë€V,}ðWÍ€XšpXீYõ|pZÀ‘€[Õ^p\©®]µ@p^‰_•"p`ira~>ðbITc^ ðÿÿTÿÿÿÿ« ÿÿ«  ÿÿ€ÿÿ¹°LMTMSTCSTMDTPSTCDT CST6 NSTimeZones/zones/America/Montreal0000644000175000017500000000326514353032552017261 0ustar richardrichardTZif2TZif2¬ÿÿÿÿrîxìÿÿÿÿž¸“pÿÿÿÿŸºë`ÿÿÿÿ ‡.Èÿÿÿÿ¡š±@ÿÿÿÿ¢”ðÿÿÿÿ£U©@ÿÿÿÿ¤†]ðÿÿÿÿ¥(x`ÿÿÿÿ¦f?ðÿÿÿÿ§ Nàÿÿÿÿ¨F!ðÿÿÿÿ¨ì0àÿÿÿÿªÉpÿÿÿÿªÕM`ÿÿÿÿ«ü«pÿÿÿÿ¬µ/`ÿÿÿÿ­Üpÿÿÿÿ®•`ÿÿÿÿ¯¼opÿÿÿÿ°~-àÿÿÿÿ±œQpÿÿÿÿ²gJ`ÿÿÿÿ³|3pÿÿÿÿ´G,`ÿÿÿÿµ\pÿÿÿÿ¶'`ÿÿÿÿ·;÷pÿÿÿÿ¸ð`ÿÿÿÿ¹%ðÿÿÿÿ¹æÒ`ÿÿÿÿ»õðÿÿÿÿ»Ïîàÿÿÿÿ¼ä×ðÿÿÿÿ½¯Ðàÿÿÿÿ¾Ä¹ðÿÿÿÿ¿²àÿÿÿÿÀ¤›ðÿÿÿÿÁo”àÿÿÿÿ„}ðÿÿÿÿÃOvàÿÿÿÿÄd_ðÿÿÿÿÅ/XàÿÿÿÿÆM|pÿÿÿÿÇ:àÿÿÿÿÈ-^pÿÿÿÿˈðpÿÿÿÿÒ#ôpÿÿÿÿÒ`ûàÿÿÿÿÓuäðÿÿÿÿÔ@ÝàÿÿÿÿÕUªÐÿÿÿÿÖ £Àÿÿÿÿ×5ŒÐÿÿÿÿØ…ÀÿÿÿÿÙnÐÿÿÿÿÚ3v@ÿÿÿÿÚþ§pÿÿÿÿÜt`ÿÿÿÿÜÞ‰pÿÿÿÿÝ©‚`ÿÿÿÿÞ¾kpÿÿÿÿ߉d`ÿÿÿÿàžMpÿÿÿÿáiF`ÿÿÿÿâ~/pÿÿÿÿãI(`ÿÿÿÿä^pÿÿÿÿå) `ÿÿÿÿæG-ðÿÿÿÿç&àÿÿÿÿè'ðÿÿÿÿéòàÿÿÿÿêñðÿÿÿÿêöÔàÿÿÿÿëæÓðÿÿÿÿìÖ¶àÿÿÿÿíÆµðÿÿÿÿî¿Ó`ÿÿÿÿï¯ÒpÿÿÿÿðŸµ`ÿÿÿÿñ´pÿÿÿÿò—`ÿÿÿÿóo–pÿÿÿÿô_y`ÿÿÿÿõOxpÿÿÿÿö?[`ÿÿÿÿ÷/Zpÿÿÿÿø(wàÿÿÿÿùÐp?›bà@o²pA„`BO”pCda`D/vpEDC`Eó¨ðÿÿµ”ÿÿÇÀÿÿ¹°ÿÿÇÀ ÿÿÇÀLMTEDTESTEWTEPT EST5EDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Scoresbysund0000644000175000017500000000073714353032552020164 0ustar richardrichardTZif2TZif2"ÿÿÿÿ›€LMn@4$À#ù ÜÍó¾ã¯Ó Ñ¼½¬®œŸŒ| lr!\c"LT#1<+00>,M3.5.0/0,M10.5.0/1 NSTimeZones/zones/America/Cayenne0000644000175000017500000000022714353032552017055 0ustar richardrichardTZif2TZif2 ÿÿÿÿ‘ô+ÿÿÿÿûÃ5ÀÿÿÎðÿÿÇÀÿÿÕÐLMT-04-03 <-03>3 NSTimeZones/zones/America/Toronto0000644000175000017500000000326514353032552017144 0ustar richardrichardTZif2TZif2¬ÿÿÿÿrîxìÿÿÿÿž¸“pÿÿÿÿŸºë`ÿÿÿÿ ‡.Èÿÿÿÿ¡š±@ÿÿÿÿ¢”ðÿÿÿÿ£U©@ÿÿÿÿ¤†]ðÿÿÿÿ¥(x`ÿÿÿÿ¦f?ðÿÿÿÿ§ Nàÿÿÿÿ¨F!ðÿÿÿÿ¨ì0àÿÿÿÿªÉpÿÿÿÿªÕM`ÿÿÿÿ«ü«pÿÿÿÿ¬µ/`ÿÿÿÿ­Üpÿÿÿÿ®•`ÿÿÿÿ¯¼opÿÿÿÿ°~-àÿÿÿÿ±œQpÿÿÿÿ²gJ`ÿÿÿÿ³|3pÿÿÿÿ´G,`ÿÿÿÿµ\pÿÿÿÿ¶'`ÿÿÿÿ·;÷pÿÿÿÿ¸ð`ÿÿÿÿ¹%ðÿÿÿÿ¹æÒ`ÿÿÿÿ»õðÿÿÿÿ»Ïîàÿÿÿÿ¼ä×ðÿÿÿÿ½¯Ðàÿÿÿÿ¾Ä¹ðÿÿÿÿ¿²àÿÿÿÿÀ¤›ðÿÿÿÿÁo”àÿÿÿÿ„}ðÿÿÿÿÃOvàÿÿÿÿÄd_ðÿÿÿÿÅ/XàÿÿÿÿÆM|pÿÿÿÿÇ:àÿÿÿÿÈ-^pÿÿÿÿˈðpÿÿÿÿÒ#ôpÿÿÿÿÒ`ûàÿÿÿÿÓuäðÿÿÿÿÔ@ÝàÿÿÿÿÕUªÐÿÿÿÿÖ £Àÿÿÿÿ×5ŒÐÿÿÿÿØ…ÀÿÿÿÿÙnÐÿÿÿÿÚ3v@ÿÿÿÿÚþ§pÿÿÿÿÜt`ÿÿÿÿÜÞ‰pÿÿÿÿÝ©‚`ÿÿÿÿÞ¾kpÿÿÿÿ߉d`ÿÿÿÿàžMpÿÿÿÿáiF`ÿÿÿÿâ~/pÿÿÿÿãI(`ÿÿÿÿä^pÿÿÿÿå) `ÿÿÿÿæG-ðÿÿÿÿç&àÿÿÿÿè'ðÿÿÿÿéòàÿÿÿÿêñðÿÿÿÿêöÔàÿÿÿÿëæÓðÿÿÿÿìÖ¶àÿÿÿÿíÆµðÿÿÿÿî¿Ó`ÿÿÿÿï¯ÒpÿÿÿÿðŸµ`ÿÿÿÿñ´pÿÿÿÿò—`ÿÿÿÿóo–pÿÿÿÿô_y`ÿÿÿÿõOxpÿÿÿÿö?[`ÿÿÿÿ÷/Zpÿÿÿÿø(wàÿÿÿÿùÐp?›bà@o²pA„`BO”pCda`D/vpEDC`Eó¨ðÿÿµ”ÿÿÇÀÿÿ¹°ÿÿÇÀ ÿÿÇÀLMTEDTESTEWTEPT EST5EDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Curacao0000644000175000017500000000026114353032552017046 0ustar richardrichardTZif2TZif2ÿÿÿÿz敹ÿÿÿÿËö2ÀÿÿÿÿÒ#ôpÿÿÿÿÒ`íÐÿÿÂÿÿÇÀÿÿÕÐÿÿÕÐ LMTASTAPTAWT AST4 NSTimeZones/zones/America/Panama0000644000175000017500000000022514353032552016666 0ustar richardrichardTZif2TZif2 ÿÿÿÿi‡&ÿÿÿÿ‹ôaèÿÿµpÿÿµÿÿ¹°LMTCMTEST EST5 NSTimeZones/zones/America/Matamoros0000644000175000017500000000066514353032552017443 0ustar richardrichardTZif2TZif2  ÿÿÿÿ¥¶Ú`"Uñ#j½ð1gv2sp3GX4Rêp5':62Ìp78èð8æþ9ûÊð:õ€;¶Âð<¯ü€=»Žð>Þ€?›pð@oÀ€A„pBO¢€CdopD/„€EDQpFf€G$3pGøƒIpIØeJã÷pKœ—€ÿÿ¤˜ÿÿ« ÿÿ¹°LMTCSTCDT CST6CDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Campo_Grande0000644000175000017500000000167014353032552020015 0ustar richardrichardTZif2TZif2[ ÿÿÿÿ–ªz4ÿÿÿÿ¸Wðÿÿÿÿ¸ýN°ÿÿÿÿ¹ñB@ÿÿÿÿºÞ‚0ÿÿÿÿÚ8¼@ÿÿÿÿÚì@ÿÿÿÿÜïÀÿÿÿÿܹg0ÿÿÿÿÝû#@ÿÿÿÿÞ›ì0ÿÿÿÿßݨ@ÿÿÿÿàTA0ÿÿÿÿô˜ Àÿÿÿÿõl0ÿÿÿÿöÀr@ÿÿÿÿ÷,°ÿÿÿÿøQ:@ÿÿÿÿøÇÓ0ÿÿÿÿú àÀÿÿÿÿú©°ÿÿÿÿûì@ÿÿÿÿü‹‹°Éœ@xå° CÀ 3ݰ!w@" Ö°#XÀ#â~0%8À%ÔÕ0'!@'½ñ°)ÿ@)”™0*êÀ+k@°,ÀÃ@-fÒ0. ¥@/F´00€‡@1[°2W.À3x048b@4øÏ06 -@6Ïv°7öÔÀ8¸“09ßñ@::°;É ÀNþ°?’ @@.à°A‡@Bý0CQÐ@C÷ß0EMaÀEàû°G”@G·£0Hú°ÀI—…0JÚ’ÀK€¡°LºtÀM`ƒ°NšVÀOI 0Pƒs@Q G°RcU@S)°TC7@TéF0V#@VÉ(0Xû@X© 0YâÝ@Zˆì0[ÞnÀ\hÎ0ÿÿÌÌÿÿÕÐÿÿÇÀLMT-03-04 <-04>4 NSTimeZones/zones/America/Belize0000644000175000017500000000202514353032552016703 0ustar richardrichardTZif2TZif2bÿÿÿÿ“^Ù°ÿÿÿÿŸŸ;àÿÿÿÿ EQØÿÿÿÿ¡àÿÿÿÿ¢.nXÿÿÿÿ£^ÿàÿÿÿÿ¤PXÿÿÿÿ¥>áàÿÿÿÿ¥î2Xÿÿÿÿ§'þ`ÿÿÿÿ§ÎXÿÿÿÿ©à`ÿÿÿÿ©­öXÿÿÿÿªçÂ`ÿÿÿÿ«—Øÿÿÿÿ¬Ç¤`ÿÿÿÿ­vôØÿÿÿÿ®§†`ÿÿÿÿ¯VÖØÿÿÿÿ°‡h`ÿÿÿÿ±6¸Øÿÿÿÿ²p„àÿÿÿÿ³šØÿÿÿÿ´Pfàÿÿÿÿ´ö|Øÿÿÿÿ¶0Hàÿÿÿÿ¶ß™Xÿÿÿÿ¸*àÿÿÿÿ¸¿{Xÿÿÿÿ¹ð àÿÿÿÿºŸ]Xÿÿÿÿ»Ù)`ÿÿÿÿ¼?Xÿÿÿÿ½¹ `ÿÿÿÿ¾_!Xÿÿÿÿ¿˜í`ÿÿÿÿÀ?XÿÿÿÿÁxÏ`ÿÿÿÿÂ(ØÿÿÿÿÃX±`ÿÿÿÿÄØÿÿÿÿÅ8“`ÿÿÿÿÅçãØÿÿÿÿÇ!¯àÿÿÿÿÇÇÅØÿÿÿÿÉ‘àÿÿÿÿɧ§ØÿÿÿÿÊásàÿÿÿÿËÄXÿÿÿÿÌ@"àÿÿÿÿÒ#ôpÿÿÿÿÒÆqPÿÿÿÿÖ)ú`ÿÿÿÿÖÙJØÿÿÿÿØ Ü`ÿÿÿÿع,ØÿÿÿÿÙé¾`ÿÿÿÿÚ™ØÿÿÿÿÛÒÚàÿÿÿÿÜxðØÿÿÿÿݲ¼àÿÿÿÿÞXÒØÿÿÿÿß’žàÿÿÿÿàAïXÿÿÿÿár€àÿÿÿÿâ!ÑXÿÿÿÿãRbàÿÿÿÿä³Xÿÿÿÿå2Dàÿÿÿÿåá•Xÿÿÿÿça`ÿÿÿÿçÁwXÿÿÿÿèûC`ÿÿÿÿé¡YXÿÿÿÿêÛ%`ÿÿÿÿëŠuØÿÿÿÿì»`ÿÿÿÿíjWØÿÿÿÿîšé`ÿÿÿÿïJ9Øÿÿÿÿð„àÿÿÿÿñ*Øÿÿÿÿòcçàÿÿÿÿó ýØÿÿÿÿôCÉàÿÿÿÿôéߨÿÿÿÿö#«àÿÿÿÿöÒüXÿÿÿÿøàÿÿÿÿø²ÞXÿÿÿÿùãoàÿÿÿÿú’ÀXÿÿÿÿûÌŒ`ÿÿÿÿür¢XbÛ`¹ÐPaq`«7Pÿÿ­Pÿÿ²¨ÿÿ«  ÿÿ¹°ÿÿ¹°ÿÿ¹°LMT-0530CSTCWTCPTCDT CST6 NSTimeZones/zones/America/Costa_Rica0000644000175000017500000000035014353032552017477 0ustar richardrichardTZif2TZif2 ÿÿÿÿi‡*Mÿÿÿÿ£èM6I`·nP+`—PP'—à`(n¶Ð)wÂ`)ÂÙÐÿÿ±3ÿÿ±3ÿÿ¹° ÿÿ«  LMTSJMTCDTCST CST6 NSTimeZones/zones/America/Rio_Branco0000644000175000017500000000064214353032552017511 0ustar richardrichardTZif2TZif2 ÿÿÿÿ–ª†ÿÿÿÿ¸fÿÿÿÿ¸ý\Àÿÿÿÿ¹ñPPÿÿÿÿºÞ@ÿÿÿÿÚ8ÊPÿÿÿÿÚìPÿÿÿÿÜýÐÿÿÿÿܹu@ÿÿÿÿÝû1PÿÿÿÿÞ›ú@ÿÿÿÿßݶPÿÿÿÿàTO@ÿÿÿÿô˜Ðÿÿÿÿõz@ÿÿÿÿöÀ€Pÿÿÿÿ÷:ÀÿÿÿÿøQHPÿÿÿÿøÇá@ÿÿÿÿú îÐÿÿÿÿú©Àÿÿÿÿûì"Pÿÿÿÿü‹™ÀɪPxóÀ QÐ 3ëÀ!…P" äÀH`PRÀÿÿÀpÿÿÇÀÿÿ¹°ÿÿÇÀLMT-04-05 <-05>5 NSTimeZones/zones/America/Lower_Princes0000644000175000017500000000026114353032552020244 0ustar richardrichardTZif2TZif2ÿÿÿÿz敹ÿÿÿÿËö2ÀÿÿÿÿÒ#ôpÿÿÿÿÒ`íÐÿÿÂÿÿÇÀÿÿÕÐÿÿÕÐ LMTASTAPTAWT AST4 NSTimeZones/zones/America/Grand_Turk0000644000175000017500000000152514353032552017535 0ustar richardrichardTZif2TZif2Lÿÿÿÿi‡0ÿÿÿÿ“´þ‰eðyHàiGðY*àI)ð9 à) ð")`íð `ò páí`ÑìpÁÏ`±Îp¡±` vð!“`"Uâð#j¯à$5Äð%J‘à&¦ð'*sà'þÃp) Uà)Þ¥p*ê7à+¾‡p,ÓT`-žip.³6`/~Kp0“`1ggð2rú`3GIð4RÜ`5'+ð62¾`7 ð8Úà8æïð9û¼à:ÆÑð;Ûžà<¯îp=»€à>Ðp?›bà@o²pA„`BO”pCda`D/vpEDC`Eó¨ðG-_àGÓŠðI AàI³lðJí#àKœ‰pLÖ@`M|kpN¶"`O\MpP–`QPQøàÔoP1Úà´QP)a‘ *ÁKP+CÝà2ÉïPBXÀàC?iPDTn€EY`ÿÿ¯ÿÿ¯ÿÿ« ÿÿ¹° ÿÿ¹°LMTMMTCSTESTCDT CST6 NSTimeZones/zones/America/Santarem0000644000175000017500000000063114353032552017244 0ustar richardrichardTZif2TZif2 ÿÿÿÿ–ªzHÿÿÿÿ¸Wðÿÿÿÿ¸ýN°ÿÿÿÿ¹ñB@ÿÿÿÿºÞ‚0ÿÿÿÿÚ8¼@ÿÿÿÿÚì@ÿÿÿÿÜïÀÿÿÿÿܹg0ÿÿÿÿÝû#@ÿÿÿÿÞ›ì0ÿÿÿÿßݨ@ÿÿÿÿàTA0ÿÿÿÿô˜ Àÿÿÿÿõl0ÿÿÿÿöÀr@ÿÿÿÿ÷,°ÿÿÿÿøQ:@ÿÿÿÿøÇÓ0ÿÿÿÿú àÀÿÿÿÿú©°ÿÿÿÿûì@ÿÿÿÿü‹‹°Éœ@xå° CÀ 3ݰ!w@" Ö°H`q@ÿÿ̸ÿÿÕÐÿÿÇÀÿÿÕÐLMT-03-04 <-03>3 NSTimeZones/zones/America/Pangnirtung0000644000175000017500000000152714353032552017773 0ustar richardrichardTZif2TZif2JÿÿÿÿÌl¡€ÿÿÿÿÒ#ôpÿÿÿÿÒ`ûà`ýpPà`@ßp0Â` Áp ¤` £p ð†` à…p Ù¢à Àgp¹„੃ð™fà‰eðyHàiGðY*àI)ð9 à) ð")`íð `ò páí`ÑìpÁÏ`±Îp¡±` vð!“`"Uâð#j¯à$5Äð%J‘à&¦ð'*sà'þÃp) Uà)Þ¥p*ê7à+¾‡p,ÓT`-žip.³6`/~Kp0“`1ggð2rú`3GIð4RÜ`5'+ð62¾`7 ð8Úà8æþ9ûÊð:ÆÑð;Ûžà<¯îp=»€à>Ðp?›bà@o²pA„`BO”pCda`D/vpEDC`Eó¨ðÿÿÇÀÿÿ¹°ÿÿÇÀ ÿÿÇÀÿÿ« ÿÿ¹°-00EPTESTEDTEWTCSTCDT EST5EDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Recife0000644000175000017500000000074414353032552016674 0ustar richardrichardTZif2TZif2' ÿÿÿÿ–ªg¸ÿÿÿÿ¸Iàÿÿÿÿ¸ý@ ÿÿÿÿ¹ñ40ÿÿÿÿºÞt ÿÿÿÿÚ8®0ÿÿÿÿÚëú0ÿÿÿÿÜá°ÿÿÿÿܹY ÿÿÿÿÝû0ÿÿÿÿÞ›Þ ÿÿÿÿßÝš0ÿÿÿÿàT3 ÿÿÿÿô—ÿ°ÿÿÿÿõ^ ÿÿÿÿöÀd0ÿÿÿÿ÷ ÿÿÿÿøQ,0ÿÿÿÿøÇÅ ÿÿÿÿú Ò°ÿÿÿÿú¨ø ÿÿÿÿûì0ÿÿÿÿü‹} ÉŽ0x×  5° 3Ï !i0" È #X°#âp %7ò°%ÔÇ 7öư8¸… 9ßã09é ;Èÿ°3 NSTimeZones/zones/America/Indianapolis0000644000175000017500000000102314353032552020100 0ustar richardrichardTZif2TZif2&ÿÿÿÿ^þ ÿÿÿÿž¦,€ÿÿÿÿŸºùpÿÿÿÿ †€ÿÿÿÿ¡šÛpÿÿÿÿÊW"€ÿÿÿÿÊØGpÿÿÿÿˈþ€ÿÿÿÿÒ#ôpÿÿÿÿÒa ðÿÿÿÿÓuóÿÿÿÿÔ@ëðÿÿÿÿÕUÕÿÿÿÿÖ Íðÿÿÿÿ×5·ÿÿÿÿدðÿÿÿÿÙ™ÿÿÿÿÙà‘ðÿÿÿÿÚþµ€ÿÿÿÿÛÀsðÿÿÿÿÜÞ—€ÿÿÿÿÝ©pÿÿÿÿÞ¾y€ÿÿÿÿ߉rpÿÿÿÿàž[€ÿÿÿÿáiTpÿÿÿÿâ~=€ÿÿÿÿãI6pÿÿÿÿä^€ÿÿÿÿèòðÿÿÿÿêÿÿÿÿþ¸ðÿÿÿÿÿ§ÿà—þð‡áàD/vpEDC`Eó¨ðÿÿ¯:ÿÿ¹°ÿÿ« ÿÿ¹° ÿÿ¹°ÿÿ¹°ÿÿÇÀLMTCDTCSTCWTCPTESTEDT EST5EDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Chicago0000644000175000017500000000333214353032552017030 0ustar richardrichardTZif2TZif2¯ÿÿÿÿ^þ ÿÿÿÿž¦,€ÿÿÿÿŸºùpÿÿÿÿ †€ÿÿÿÿ¡šÛpÿÿÿÿ¢Ëtÿÿÿÿ£ƒ÷ðÿÿÿÿ¤EÒ€ÿÿÿÿ¥cÙðÿÿÿÿ¦SÙÿÿÿÿ§—pÿÿÿÿ¨3»ÿÿÿÿ¨þ³ðÿÿÿÿªÿÿÿÿªÞ•ðÿÿÿÿ«óÿÿÿÿ¬¾wðÿÿÿÿ­Óaÿÿÿÿ®žYðÿÿÿÿ¯³Cÿÿÿÿ°~;ðÿÿÿÿ±œ_€ÿÿÿÿ²gXpÿÿÿÿ³|A€ÿÿÿÿ´G:pÿÿÿÿµ\#€ÿÿÿÿ¶'pÿÿÿÿ·<€ÿÿÿÿ¸þpÿÿÿÿ¹ç€ÿÿÿÿ¹æàpÿÿÿÿ»ÿÿÿÿ»ÆÂpÿÿÿÿ¼äæÿÿÿÿ½¯Þðÿÿÿÿ¾ÄÈÿÿÿÿ¿ÀðÿÿÿÿÀZÖÿÿÿÿÁ°Þ€?›pð@oÀ€A„pBO¢€CdopD/„€EDQpEó·ÿÿ­Ôÿÿ¹°ÿÿ« ÿÿ¹° ÿÿ¹°ÿÿ¹°LMTCDTCSTESTCWTCPT CST6CDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Belem0000644000175000017500000000061214353032552016515 0ustar richardrichardTZif2TZif2 ÿÿÿÿ–ªttÿÿÿÿ¸Iàÿÿÿÿ¸ý@ ÿÿÿÿ¹ñ40ÿÿÿÿºÞt ÿÿÿÿÚ8®0ÿÿÿÿÚëú0ÿÿÿÿÜá°ÿÿÿÿܹY ÿÿÿÿÝû0ÿÿÿÿÞ›Þ ÿÿÿÿßÝš0ÿÿÿÿàT3 ÿÿÿÿô—ÿ°ÿÿÿÿõ^ ÿÿÿÿöÀd0ÿÿÿÿ÷ ÿÿÿÿøQ,0ÿÿÿÿøÇÅ ÿÿÿÿú Ò°ÿÿÿÿú¨ø ÿÿÿÿûì0ÿÿÿÿü‹} ÉŽ0x×  5° 3Ï !i0" È ÿÿÒŒÿÿãàÿÿÕÐLMT-02-03 <-03>3 NSTimeZones/zones/America/Regina0000644000175000017500000000117614353032552016704 0ustar richardrichardTZif2TZif25ÿÿÿÿ†ý“ÿÿÿÿž¸¯ÿÿÿÿŸ»€ÿÿÿÿµeOðÿÿÿÿ¶0Hàÿÿÿÿ·E1ðÿÿÿÿ¸*àÿÿÿÿ¹%ðÿÿÿÿ¹ð àÿÿÿÿ»0pÿÿÿÿ»Ïîàÿÿÿÿ¼îpÿÿÿÿ½¹ `ÿÿÿÿÂrðÿÿÿÿÃaëàÿÿÿÿÄQêðÿÿÿÿÅ8“`ÿÿÿÿÆ1ÌðÿÿÿÿÇ!¯àÿÿÿÿÈépÿÿÿÿÉ Ì`ÿÿÿÿÉúËpÿÿÿÿÊê®`ÿÿÿÿˉ ÿÿÿÿÒ#ôpÿÿÿÿÒaÿÿÿÿÓcŒÿÿÿÿÔSoÿÿÿÿÕUãÿÿÿÿÖ Üÿÿÿÿ×5ÅÿÿÿÿؾÿÿÿÿÙ§ÿÿÿÿÙà ÿÿÿÿÚþÃÿÿÿÿÛÀ‚ÿÿÿÿÜÞ¥ÿÿÿÿÝ©ž€ÿÿÿÿÞ¾‡ÿÿÿÿ߉€€ÿÿÿÿàžiÿÿÿÿáib€ÿÿÿÿâ~KÿÿÿÿãID€ÿÿÿÿä^-ÿÿÿÿå)&€ÿÿÿÿæGJÿÿÿÿçCÿÿÿÿè',ÿÿÿÿèò%ÿÿÿÿëæðÿÿÿÿìÖÓÿÿÿÿíÆÒÿÿäÿÿ« ÿÿÿÿ«  ÿÿ« ÿÿ« LMTMDTMSTMWTMPTCST CST6 NSTimeZones/zones/America/Bogota0000644000175000017500000000026314353032552016706 0ustar richardrichardTZif2TZif2ÿÿÿÿ^œ4ðÿÿÿÿ˜XUp*sP+t‰@ÿÿºÿÿºÿÿÇÀÿÿ¹° LMTBMT-04-05 <-05>5 NSTimeZones/zones/America/Monterrey0000644000175000017500000000120414353032552017453 0ustar richardrichardTZif2TZif29 ÿÿÿÿ¥¶Ú`"Uñ#j½ð1gv2sp3GX4Rêp5':62Ìp78èð8æþ9ûÊð:õ€;¶Âð<¯ü€=»Žð>Þ€?›pð@oÀ€A„pBO¢€CdopD/„€EDQpFf€G$3pGøƒIpIØeJã÷pK¸GLÍðM˜)N¬õðOx PŒ×ðQa'€Rl¹ðSA €TL›ðU ë€V,}ðWÍ€XšpXீYõ|pZÀ‘€[Õ^p\©®]µ@p^‰_•"p`ira~>ðbITc^ ðÿÿ¡ôÿÿ« ÿÿ¹°LMTCSTCDT CST6 NSTimeZones/zones/America/Godthab0000644000175000017500000000164314353032552017046 0ustar richardrichardTZif2TZif2X ÿÿÿÿ›€hM|P3ú#ëÜÍó¾ã¯Ó Ñ¼½¬®œŸŒ| lr!\c"LT#†A?›@f#A„9BFCdD%çECýFÉG#ßGîæIÁIÎÈJã£K®ªLÌ¿MŽŒN¬¡OnnPŒƒQWŠRleS7lTLGUNV,)V÷0XFX×Yõ(Z¶ô[Õ \ ]´ì^ó_”Î`_Õa}êb?·c]Ìd™ÿÿÏ€ÿÿÕÐÿÿãàÿÿãàLMT-03-02 <-02>2 NSTimeZones/zones/America/Tijuana0000644000175000017500000000200114353032552017056 0ustar richardrichardTZif2TZif2^ÿÿÿÿ¥¶èpÿÿÿÿ©yOpÿÿÿÿ¯ò|ðÿÿÿÿ¶fdpÿÿÿÿ·ÿÿÿÿ¸ òðÿÿÿÿËê€ÿÿÿÿÒ#ôpÿÿÿÿÒ™ºpÿÿÿÿ×YÿÿÿÿØ‘´ðÿÿÿÿâ~KÿÿÿÿãIRÿÿÿÿä^-ÿÿÿÿå)4ÿÿÿÿæGJÿÿÿÿçQÿÿÿÿè',ÿÿÿÿèò3ÿÿÿÿêÿÿÿÿêÒÿÿÿÿëæðÿÿÿÿì±÷ÿÿÿÿíÆÒÿÿÿÿî‘Ù ௠ ÙÍ À‘ ¹¯©® ™‘‰ ysir YUIT 97)6 "S  5ò4 âÒ Áù±ø ¡Û v+ !½"V #jÚ$5ï %J¼&Ñ '*ž'þí ) €)ÞÏ *êb+¾± ,Ó~-ž“ .³`/~u 0“B1g’ 2s$3Gt 4S5'V 62è78 88ç 9ûç:Æü ;ÛÉ<° =»«>ú ?›@oÜ A„©BO¾ Cd‹D/  EDmF‚ G$OGøŸ I1IØ JäKœ³ ÿÿ’Lÿÿÿÿ€ÿÿ ÿÿÿÿLMTMSTPSTPDTPWTPPT PST8PDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Fortaleza0000644000175000017500000000074414353032552017426 0ustar richardrichardTZif2TZif2' ÿÿÿÿ–ªkÿÿÿÿ¸Iàÿÿÿÿ¸ý@ ÿÿÿÿ¹ñ40ÿÿÿÿºÞt ÿÿÿÿÚ8®0ÿÿÿÿÚëú0ÿÿÿÿÜá°ÿÿÿÿܹY ÿÿÿÿÝû0ÿÿÿÿÞ›Þ ÿÿÿÿßÝš0ÿÿÿÿàT3 ÿÿÿÿô—ÿ°ÿÿÿÿõ^ ÿÿÿÿöÀd0ÿÿÿÿ÷ ÿÿÿÿøQ,0ÿÿÿÿøÇÅ ÿÿÿÿú Ò°ÿÿÿÿú¨ø ÿÿÿÿûì0ÿÿÿÿü‹} ÉŽ0x×  5° 3Ï !i0" È #X°#âp %7ò°%ÔÇ 7öư8¸… 9ßã09òJ ;Èÿ°3 NSTimeZones/zones/America/Paramaribo0000644000175000017500000000027314353032552017551 0ustar richardrichardTZif2TZif2ÿÿÿÿ‘ޏÿÿÿÿ¾*KÄÿÿÿÿÒb,´¾1¸ÿÿÌHÿÿÌ<ÿÿÌLÿÿÎÈÿÿÕÐLMTPMT-0330-03 <-03>3 NSTimeZones/zones/America/Mazatlan0000644000175000017500000000131614353032552017242 0ustar richardrichardTZif2TZif2?ÿÿÿÿ¥¶èpÿÿÿÿ¯ònàÿÿÿÿ¶fV`ÿÿÿÿ·CÒ`ÿÿÿÿ¸ 6`ÿÿÿÿ¸ý†ðÿÿÿÿËêq`ÿÿÿÿØ‘´ðp€1g„2s€3Gf4Rø€5'H62Ú€7*8÷8ç 9ûÙ:õ;¶Ñ<° =»>ì?›@oÎA„›€BO°Cd}€D/’ED_€FtG$A€Gø‘I#€IØsJä€K¸ULÍ"M˜7N­OxPŒæQa5RlÈSATLªU ùV,ŒWÛX¨€Xà½YõŠ€ZÀŸ[Õl€\©¼]µN€^‰ž_•0€`i€a~MbIbc^/ÿÿœ<ÿÿÿÿ« ÿÿ«  ÿÿ€LMTMSTCSTMDTPST MST7 NSTimeZones/zones/America/Atka0000644000175000017500000000171114353032552016352 0ustar richardrichardTZif2TZif2T !ÿÿÿÿ?ÂýÑÿÿÿÿ}‡Z^ÿÿÿÿˉDÐÿÿÿÿÒ#ôpÿÿÿÿÒaP@ÿÿÿÿúÒU°ÿÿÿÿþ¸qPÿÿÿÿÿ¨T@˜SPˆ6@x5PqRÀaQÐQ4ÀA3Ð1ÀmÐ øÀ ­éP ðÚÀ àÙÐ Ù÷@ À»Ð¹Ù@©ØP™»@‰ºPy@iœPY@I~P9a@)`P"}À BP_À+" òPÀâ3°Ò2À°²À¡÷° vG@!Ù°"V)@#jö0$6 @%JØ0&í@'*º0'ÿ À) œ0)ÞëÀ*ê~0+¾ÍÀ,Óš°-ž¯À.³|°/~‘À0“^°1g®@2s@°3G@4S"°5'r@63°7T@8!08ç6@9ü0:Ç@;Ûå0<°4À=»Ç0>À?›©0@oøÀA„ŰBOÚÀCd§°D/¼ÀED‰°Eóï@                        «âÿÿZbÿÿePÿÿs`ÿÿs` ÿÿePÿÿs`ÿÿs`ÿÿpÿÿs`LMTNSTNWTNPTBSTBDTAHSTHDT HST10HDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Louisville0000644000175000017500000000233214353032552017621 0ustar richardrichardTZif2TZif2uÿÿÿÿ^þ ÿÿÿÿž¦,€ÿÿÿÿŸºùpÿÿÿÿ †€ÿÿÿÿ¡šÛpÿÿÿÿ¤s÷ÿÿÿÿ¥pÿÿÿÿÊ N€ÿÿÿÿÊØGpÿÿÿÿˈþ€ÿÿÿÿÒ#ôpÿÿÿÿÒa ðÿÿÿÿÓu×ÿÿÿÿÓ¤ pÿÿÿÿÚþµ€ÿÿÿÿÛÀsðÿÿÿÿÜÞ—€ÿÿÿÿÝ©pÿÿÿÿÞ¾y€ÿÿÿÿ߉rpÿÿÿÿàž[€ÿÿÿÿáiTpÿÿÿÿâ~=€ÿÿÿÿãI6pÿÿÿÿä^€ÿÿÿÿå)pÿÿÿÿæG<ÿÿÿÿç7ðÿÿÿÿè'ÿÿÿÿéðÿÿÿÿêÿÿÿÿêöâðÿÿÿÿëæâÿÿÿÿìÖÄðÿÿÿÿíÆÄÿÿÿÿî¿ápÿÿÿÿï¯à€ÿÿÿÿðpÿÿÿÿüØ:ðÿÿÿÿýÈàÿÿÿÿþ¸ðÿÿÿÿÿ§ÿà—þð‡áàwàðpþ``ýpPà`@ßp0Â`p ²p ­”ð ð†` à…p Ù¢à Àgp¹„੃ð™fà‰eðyHàiGðY*àI)ð9 à) ð")`íð `ò páí`ÑìpÁÏ`±Îp¡±` vð!“`"Uâð#j¯à$5Äð%J‘à&¦ð'*sà'þÃp) Uà)Þ¥p*ê7à+¾‡p,ÓT`-žip.³6`/~Kp0“`1ggð2rú`3GIð4RÜ`5'+ð62¾`7 ð8Úà8æïð9û¼à:ÆÑð;Ûžà<¯îp=»€à>Ðp?›bà@o²pA„`BO”pCda`D/vpEDC`Eó¨ðÿÿ¯šÿÿ¹°ÿÿ« ÿÿ¹° ÿÿ¹°ÿÿ¹°ÿÿÇÀLMTCDTCSTCWTCPTESTEDT EST5EDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Whitehorse0000644000175000017500000000200514353032552017610 0ustar richardrichardTZif2TZif2] %ÿÿÿÿ}†Šœÿÿÿÿž¸Ë°ÿÿÿÿŸ»# ÿÿÿÿ Ð °ÿÿÿÿ¡¢Ò€ÿÿÿÿˉ(°ÿÿÿÿÒ#ôpÿÿÿÿÒa4 ÿÿÿÿ÷/vÿÿÿÿø(¢ÿÿÿÿøÅ„ir YUIT 97)6 "S  5ò4 âÒ Áù±ø ¡Û v+ !½"V #jÚ$5ï %J¼&Ñ '*ž'þí ) €)ÞÏ *êb+¾± ,Ó~-ž“ .³`/~u 0“B1g’ 2s$3Gt 4S5'V 62è78 88ç 9ûç:Æü ;ÛÉ<° =»«>ú ?›@oÜ A„©BO¾ Cd‹D/  EDmEóÓ G-ŠGÓµ I lI³— JíNKœ³ LÖjM|• N¶LO\w P–.Q3 NSTimeZones/zones/America/Antigua0000644000175000017500000000026114353032552017061 0ustar richardrichardTZif2TZif2ÿÿÿÿz敹ÿÿÿÿËö2ÀÿÿÿÿÒ#ôpÿÿÿÿÒ`íÐÿÿÂÿÿÇÀÿÿÕÐÿÿÕÐ LMTASTAPTAWT AST4 NSTimeZones/zones/America/Creston0000644000175000017500000000036014353032552017106 0ustar richardrichardTZif2TZif2 ÿÿÿÿ^ °ÿÿÿÿž¦:ÿÿÿÿŸ»€ÿÿÿÿ †ÿÿÿÿ¡šé€ÿÿÿÿˉ ÿÿÿÿÏßÿÿÿÿÏå¬ÿÿÿÿÐÿÿÿÿúøuÿÿÿÿûèXÿÿ–îÿÿ« ÿÿÿÿ«  LMTMDTMSTMWT MST7 NSTimeZones/zones/America/Kentucky/0000755000175000017500000000000014353032552017344 5ustar richardrichardNSTimeZones/zones/America/Kentucky/Louisville0000644000175000017500000000233214353032552021416 0ustar richardrichardTZif2TZif2uÿÿÿÿ^þ ÿÿÿÿž¦,€ÿÿÿÿŸºùpÿÿÿÿ †€ÿÿÿÿ¡šÛpÿÿÿÿ¤s÷ÿÿÿÿ¥pÿÿÿÿÊ N€ÿÿÿÿÊØGpÿÿÿÿˈþ€ÿÿÿÿÒ#ôpÿÿÿÿÒa ðÿÿÿÿÓu×ÿÿÿÿÓ¤ pÿÿÿÿÚþµ€ÿÿÿÿÛÀsðÿÿÿÿÜÞ—€ÿÿÿÿÝ©pÿÿÿÿÞ¾y€ÿÿÿÿ߉rpÿÿÿÿàž[€ÿÿÿÿáiTpÿÿÿÿâ~=€ÿÿÿÿãI6pÿÿÿÿä^€ÿÿÿÿå)pÿÿÿÿæG<ÿÿÿÿç7ðÿÿÿÿè'ÿÿÿÿéðÿÿÿÿêÿÿÿÿêöâðÿÿÿÿëæâÿÿÿÿìÖÄðÿÿÿÿíÆÄÿÿÿÿî¿ápÿÿÿÿï¯à€ÿÿÿÿðpÿÿÿÿüØ:ðÿÿÿÿýÈàÿÿÿÿþ¸ðÿÿÿÿÿ§ÿà—þð‡áàwàðpþ``ýpPà`@ßp0Â`p ²p ­”ð ð†` à…p Ù¢à Àgp¹„੃ð™fà‰eðyHàiGðY*àI)ð9 à) ð")`íð `ò páí`ÑìpÁÏ`±Îp¡±` vð!“`"Uâð#j¯à$5Äð%J‘à&¦ð'*sà'þÃp) Uà)Þ¥p*ê7à+¾‡p,ÓT`-žip.³6`/~Kp0“`1ggð2rú`3GIð4RÜ`5'+ð62¾`7 ð8Úà8æïð9û¼à:ÆÑð;Ûžà<¯îp=»€à>Ðp?›bà@o²pA„`BO”pCda`D/vpEDC`Eó¨ðÿÿ¯šÿÿ¹°ÿÿ« ÿÿ¹° ÿÿ¹°ÿÿ¹°ÿÿÇÀLMTCDTCSTCWTCPTESTEDT EST5EDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Kentucky/Monticello0000644000175000017500000000171414353032552021377 0ustar richardrichardTZif2TZif2Wÿÿÿÿ^þ ÿÿÿÿž¦,€ÿÿÿÿŸºùpÿÿÿÿ †€ÿÿÿÿ¡šÛpÿÿÿÿˈþ€ÿÿÿÿÒ#ôpÿÿÿÿÒa ðÿÿÿÿüØIÿÿÿÿýÈ+ðÿÿÿÿþ¸+ÿÿÿÿÿ¨ 𘠇ïðwïq pa €Pîp@í€0Ðp'€ ²p ­£ ð”p à“€ Ù°ð Àu€¹’ð©’™tð‰tyVðiVY8ðI89ð)"7püpò€áûpÑú€ÁÝp±Ü€¡¿p v!¡p"Uñ#j½ð$5Ó%JŸð&µ'*ð'þÑ€) cð)Þ³€*êEð+¾•€,Óbp-žw€.³Dp/~Y€0“&p1gv2sp3GX4Rêp5':62Ìp78èð8æþ9ûÊð:ÆÑð;Ûžà<¯îp=»€à>Ðp?›bà@o²pA„`BO”pCda`D/vpEDC`Eó¨ðÿÿ°tÿÿ¹°ÿÿ« ÿÿ¹° ÿÿ¹°ÿÿÇÀÿÿ¹°LMTCDTCSTCWTCPTEDTEST EST5EDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Cambridge_Bay0000644000175000017500000000156314353032552020147 0ustar richardrichardTZif2TZif2L ÿÿÿÿ¡òÍ€ÿÿÿÿˉ ÿÿÿÿÒ#ôpÿÿÿÿÒaaPü€@û0Þ€ Ý À€ ¿ 𢀠ࡠٿ Àƒ¹¡© ™ƒ‰‚yeidYGIF9))("E€ '€ò&â €ÒÁ뀱ê¡Í€ v!¯€"Uÿ#jÌ$5á%J®&Ã'*'þß) r)ÞÁ*êT+¾£,Óp€-ž….³R€/~g0“4€1g„2s€3Gf4Rø€5'H62Ú€7*8÷8æþ9ûÊð:éP:Æî;Û»<° =»>ì?›@oÎA„›€BO°Cd}€D/’ED_€EóÅÿÿ« ÿÿ« ÿÿ ÿÿ« ÿÿ¹°ÿÿ« ÿÿ¹°-00MWTMPTMSTMDTCDTCSTEST MST7MDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Tortola0000644000175000017500000000026114353032552017115 0ustar richardrichardTZif2TZif2ÿÿÿÿz敹ÿÿÿÿËö2ÀÿÿÿÿÒ#ôpÿÿÿÿÒ`íÐÿÿÂÿÿÇÀÿÿÕÐÿÿÕÐ LMTASTAPTAWT AST4 NSTimeZones/zones/America/Ojinaga0000644000175000017500000000130514353032552017041 0ustar richardrichardTZif2TZif2<ÿÿÿÿ¥¶èpÿÿÿÿ¯ònàÿÿÿÿ¶fV`ÿÿÿÿ·CÒ`ÿÿÿÿ¸ 6`ÿÿÿÿ¸ý†ð1gv2sp3GX4Rêp5'H62Ú€7*8÷8ç 9ûÙ:õ;¶Ñ<° =»>ì?›@oÎA„›€BO°Cd}€D/’ED_€FtG$A€Gø‘I#€IØsJä€Kœ¥LÖ\€M|‡N¶>€O\iP– €QÞ€?›pð@oÀ€A„pBO¢€CdopD/„€EDQpEó·ÿÿ¹°ÿÿ« ÿÿ¹° -00CDTCSTEST CST6CDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/St_Vincent0000644000175000017500000000026114353032552017545 0ustar richardrichardTZif2TZif2ÿÿÿÿz敹ÿÿÿÿËö2ÀÿÿÿÿÒ#ôpÿÿÿÿÒ`íÐÿÿÂÿÿÇÀÿÿÕÐÿÿÕÐ LMTASTAPTAWT AST4 NSTimeZones/zones/America/Nassau0000644000175000017500000000326514353032552016732 0ustar richardrichardTZif2TZif2¬ÿÿÿÿrîxìÿÿÿÿž¸“pÿÿÿÿŸºë`ÿÿÿÿ ‡.Èÿÿÿÿ¡š±@ÿÿÿÿ¢”ðÿÿÿÿ£U©@ÿÿÿÿ¤†]ðÿÿÿÿ¥(x`ÿÿÿÿ¦f?ðÿÿÿÿ§ Nàÿÿÿÿ¨F!ðÿÿÿÿ¨ì0àÿÿÿÿªÉpÿÿÿÿªÕM`ÿÿÿÿ«ü«pÿÿÿÿ¬µ/`ÿÿÿÿ­Üpÿÿÿÿ®•`ÿÿÿÿ¯¼opÿÿÿÿ°~-àÿÿÿÿ±œQpÿÿÿÿ²gJ`ÿÿÿÿ³|3pÿÿÿÿ´G,`ÿÿÿÿµ\pÿÿÿÿ¶'`ÿÿÿÿ·;÷pÿÿÿÿ¸ð`ÿÿÿÿ¹%ðÿÿÿÿ¹æÒ`ÿÿÿÿ»õðÿÿÿÿ»Ïîàÿÿÿÿ¼ä×ðÿÿÿÿ½¯Ðàÿÿÿÿ¾Ä¹ðÿÿÿÿ¿²àÿÿÿÿÀ¤›ðÿÿÿÿÁo”àÿÿÿÿ„}ðÿÿÿÿÃOvàÿÿÿÿÄd_ðÿÿÿÿÅ/XàÿÿÿÿÆM|pÿÿÿÿÇ:àÿÿÿÿÈ-^pÿÿÿÿˈðpÿÿÿÿÒ#ôpÿÿÿÿÒ`ûàÿÿÿÿÓuäðÿÿÿÿÔ@ÝàÿÿÿÿÕUªÐÿÿÿÿÖ £Àÿÿÿÿ×5ŒÐÿÿÿÿØ…ÀÿÿÿÿÙnÐÿÿÿÿÚ3v@ÿÿÿÿÚþ§pÿÿÿÿÜt`ÿÿÿÿÜÞ‰pÿÿÿÿÝ©‚`ÿÿÿÿÞ¾kpÿÿÿÿ߉d`ÿÿÿÿàžMpÿÿÿÿáiF`ÿÿÿÿâ~/pÿÿÿÿãI(`ÿÿÿÿä^pÿÿÿÿå) `ÿÿÿÿæG-ðÿÿÿÿç&àÿÿÿÿè'ðÿÿÿÿéòàÿÿÿÿêñðÿÿÿÿêöÔàÿÿÿÿëæÓðÿÿÿÿìÖ¶àÿÿÿÿíÆµðÿÿÿÿî¿Ó`ÿÿÿÿï¯ÒpÿÿÿÿðŸµ`ÿÿÿÿñ´pÿÿÿÿò—`ÿÿÿÿóo–pÿÿÿÿô_y`ÿÿÿÿõOxpÿÿÿÿö?[`ÿÿÿÿ÷/Zpÿÿÿÿø(wàÿÿÿÿùÐp?›bà@o²pA„`BO”pCda`D/vpEDC`Eó¨ðÿÿµ”ÿÿÇÀÿÿ¹°ÿÿÇÀ ÿÿÇÀLMTEDTESTEWTEPT EST5EDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/New_York0000644000175000017500000000332014353032552017225 0ustar richardrichardTZif2TZif2¯ÿÿÿÿ^ðÿÿÿÿž¦pÿÿÿÿŸºë`ÿÿÿÿ †pÿÿÿÿ¡šÍ`ÿÿÿÿ¢eâpÿÿÿÿ£ƒéàÿÿÿÿ¤j®pÿÿÿÿ¥5§`ÿÿÿÿ¦SÊðÿÿÿÿ§‰`ÿÿÿÿ¨3¬ðÿÿÿÿ¨þ¥àÿÿÿÿªŽðÿÿÿÿªÞ‡àÿÿÿÿ«ópðÿÿÿÿ¬¾iàÿÿÿÿ­ÓRðÿÿÿÿ®žKàÿÿÿÿ¯³4ðÿÿÿÿ°~-àÿÿÿÿ±œQpÿÿÿÿ²gJ`ÿÿÿÿ³|3pÿÿÿÿ´G,`ÿÿÿÿµ\pÿÿÿÿ¶'`ÿÿÿÿ·;÷pÿÿÿÿ¸ð`ÿÿÿÿ¹Ùpÿÿÿÿ¹æÒ`ÿÿÿÿ»õðÿÿÿÿ»Æ´`ÿÿÿÿ¼ä×ðÿÿÿÿ½¯Ðàÿÿÿÿ¾Ä¹ðÿÿÿÿ¿²àÿÿÿÿÀ¤›ðÿÿÿÿÁo”àÿÿÿÿ„}ðÿÿÿÿÃOvàÿÿÿÿÄd_ðÿÿÿÿÅ/XàÿÿÿÿÆM|pÿÿÿÿÇ:àÿÿÿÿÈ-^pÿÿÿÿÈøW`ÿÿÿÿÊ @pÿÿÿÿÊØ9`ÿÿÿÿˈðpÿÿÿÿÒ#ôpÿÿÿÿÒ`ûàÿÿÿÿÓuäðÿÿÿÿÔ@ÝàÿÿÿÿÕUÆðÿÿÿÿÖ ¿àÿÿÿÿ×5¨ðÿÿÿÿØ¡àÿÿÿÿÙŠðÿÿÿÿÙàƒàÿÿÿÿÚþ§pÿÿÿÿÛÀeàÿÿÿÿÜÞ‰pÿÿÿÿÝ©‚`ÿÿÿÿÞ¾kpÿÿÿÿ߉d`ÿÿÿÿàžMpÿÿÿÿáiF`ÿÿÿÿâ~/pÿÿÿÿãI(`ÿÿÿÿä^pÿÿÿÿåW.àÿÿÿÿæG-ðÿÿÿÿç7àÿÿÿÿè'ðÿÿÿÿéòàÿÿÿÿêñðÿÿÿÿêöÔàÿÿÿÿëæÓðÿÿÿÿìÖ¶àÿÿÿÿíÆµðÿÿÿÿî¿Ó`ÿÿÿÿï¯ÒpÿÿÿÿðŸµ`ÿÿÿÿñ´pÿÿÿÿò—`ÿÿÿÿóo–pÿÿÿÿô_y`ÿÿÿÿõOxpÿÿÿÿö?[`ÿÿÿÿ÷/Zpÿÿÿÿø(wàÿÿÿÿùÐp?›bà@o²pA„`BO”pCda`D/vpEDC`Eó¨ðÿÿºžÿÿÇÀÿÿ¹°ÿÿÇÀ ÿÿÇÀLMTEDTESTEWTEPT EST5EDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Porto_Velho0000644000175000017500000000061214353032552017731 0ustar richardrichardTZif2TZif2 ÿÿÿÿ–ª‚èÿÿÿÿ¸Wðÿÿÿÿ¸ýN°ÿÿÿÿ¹ñB@ÿÿÿÿºÞ‚0ÿÿÿÿÚ8¼@ÿÿÿÿÚì@ÿÿÿÿÜïÀÿÿÿÿܹg0ÿÿÿÿÝû#@ÿÿÿÿÞ›ì0ÿÿÿÿßݨ@ÿÿÿÿàTA0ÿÿÿÿô˜ Àÿÿÿÿõl0ÿÿÿÿöÀr@ÿÿÿÿ÷,°ÿÿÿÿøQ:@ÿÿÿÿøÇÓ0ÿÿÿÿú àÀÿÿÿÿú©°ÿÿÿÿûì@ÿÿÿÿü‹‹°Éœ@xå° CÀ 3ݰ!w@" Ö°ÿÿÄÿÿÕÐÿÿÇÀLMT-03-04 <-04>4 NSTimeZones/zones/America/Boise0000644000175000017500000000174714353032552016544 0ustar richardrichardTZif2TZif2Zÿÿÿÿ^Àÿÿÿÿž¦H ÿÿÿÿŸ»ÿÿÿÿ †* ÿÿÿÿ¡š÷ÿÿÿÿ¨FL ÿÿÿÿˉ ÿÿÿÿÒ#ôpÿÿÿÿÒaÿÿÿÿúøuÿÿÿÿûèXÿÿÿÿüØWÿÿÿÿýÈ:ÿÿÿÿþ¸9ÿÿÿÿÿ¨˜‡þwýq€aPü€@û0Þ€² À€ ­± 𢀠ࡠٿ Àƒ¹¡© ™ƒ‰‚yeidYGIF9))("E€ '€ò&â €ÒÁ뀱ê¡Í€ v!¯€"Uÿ#jÌ$5á%J®&Ã'*'þß) r)ÞÁ*êT+¾£,Óp€-ž….³R€/~g0“4€1g„2s€3Gf4Rø€5'H62Ú€7*8÷8ç 9ûÙ:Æî;Û»<° =»>ì?›@oÎA„›€BO°Cd}€D/’ED_€EóÅÿÿ“ÿÿÿÿ€ÿÿ«  ÿÿ« ÿÿÿÿ« LMTPDTPSTMWTMPTMSTMDT MST7MDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Araguaina0000644000175000017500000000112014353032552017354 0ustar richardrichardTZif2TZif23 ÿÿÿÿ–ªt0ÿÿÿÿ¸Iàÿÿÿÿ¸ý@ ÿÿÿÿ¹ñ40ÿÿÿÿºÞt ÿÿÿÿÚ8®0ÿÿÿÿÚëú0ÿÿÿÿÜá°ÿÿÿÿܹY ÿÿÿÿÝû0ÿÿÿÿÞ›Þ ÿÿÿÿßÝš0ÿÿÿÿàT3 ÿÿÿÿô—ÿ°ÿÿÿÿõ^ ÿÿÿÿöÀd0ÿÿÿÿ÷ ÿÿÿÿøQ,0ÿÿÿÿøÇÅ ÿÿÿÿú Ò°ÿÿÿÿú¨ø ÿÿÿÿûì0ÿÿÿÿü‹} ÉŽ0x×  5° 3Ï !i0" È #X°#âp %7ò°%ÔÇ 0€y01M 2W °3j 48T04øÁ 6 06Ïh 7öư8¸… 9ßã0:, ;Èÿ°Nð Pƒe0Q 9 ÿÿÒÐÿÿãàÿÿÕÐLMT-02-03 <-03>3 NSTimeZones/zones/America/Inuvik0000644000175000017500000000146114353032552016741 0ustar richardrichardTZif2TZif2HÿÿÿÿàN€a' Q A  0ì ë  Î Í  ð° ௠ ÙÍ À‘ ¹¯©® ™‘‰ yeidYGIF9))("E€ '€ò&â €ÒÁ뀱ê¡Í€ v!¯€"Uÿ#jÌ$5á%J®&Ã'*'þß) r)ÞÁ*êT+¾£,Óp€-ž….³R€/~g0“4€1g„2s€3Gf4Rø€5'H62Ú€7*8÷8ç 9ûÙ:Æî;Û»<° =»>ì?›@oÎA„›€BO°Cd}€D/’ED_€EóÅÿÿÿÿ€ÿÿ ÿÿ« -00PDTPSTMSTMDT MST7MDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/St_Kitts0000644000175000017500000000026114353032552017235 0ustar richardrichardTZif2TZif2ÿÿÿÿz敹ÿÿÿÿËö2ÀÿÿÿÿÒ#ôpÿÿÿÿÒ`íÐÿÿÂÿÿÇÀÿÿÕÐÿÿÕÐ LMTASTAPTAWT AST4 NSTimeZones/zones/America/Edmonton0000644000175000017500000000171214353032552017256 0ustar richardrichardTZif2TZif2YÿÿÿÿˆÞÎàÿÿÿÿž¸¯ÿÿÿÿŸ»€ÿÿÿÿ ˜‘ÿÿÿÿ Ò…€ÿÿÿÿ¢Šèÿÿÿÿ£„ÿÿÿÿ¤jÊÿÿÿÿ¥5Àÿÿÿÿ¦Sçÿÿÿÿ§¥€ÿÿÿÿ¨3Éÿÿÿÿ¨þÂÿÿÿÿˉ ÿÿÿÿÒ#ôpÿÿÿÿÒaÿÿÿÿÕUãÿÿÿÿÖ ÜaPü€@û0Þ€ Ý À€ ¿ 𢀠ࡠٿ Àƒ¹¡© ™ƒ‰‚yeidYGIF9))("E€ '€ò&â €ÒÁ뀱ê¡Í€ v!¯€"Uÿ#jÌ$5á%J®&Ã'*'þß) r)ÞÁ*êT+¾£,Óp€-ž….³R€/~g0“4€1g„2s€3Gf4Rø€5'H62Ú€7*8÷8ç 9ûÙ:Æî;Û»<° =»>ì?›@oÎA„›€BO°Cd}€D/’ED_€EóÅÿÿ• ÿÿ« ÿÿÿÿ«  ÿÿ« LMTMDTMSTMWTMPT MST7MDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Barbados0000644000175000017500000000042614353032552017211 0ustar richardrichardTZif2TZif2ÿÿÿÿ’@©eÿÿÿÿËãËÐÿÿÿÿÌ”‚àÿÿÿÿÍÖ"ÐÿÿÿÿÎ|MàÿÿÿÿÏ›¦ÐÿÿÿÿÐej`òà”ŒÐ—àtnÐvâàTPÐ_ÿ`0>PÿÿÈÿÿÕÐÿÿÇÀÿÿÎÈ LMTADTAST-0330 AST4 NSTimeZones/zones/America/Hermosillo0000644000175000017500000000043614353032552017612 0ustar richardrichardTZif2TZif2ÿÿÿÿ¥¶èpÿÿÿÿ¯ònàÿÿÿÿ¶fV`ÿÿÿÿ·CÒ`ÿÿÿÿ¸ 6`ÿÿÿÿ¸ý†ðÿÿÿÿËêq`ÿÿÿÿØ‘´ðp€1g„2s€3Gf4Rø€5'H62Ú€ÿÿ—øÿÿÿÿ« ÿÿ«  ÿÿ€LMTMSTCSTMDTPST MST7 NSTimeZones/zones/America/Montserrat0000644000175000017500000000026114353032552017627 0ustar richardrichardTZif2TZif2ÿÿÿÿz敹ÿÿÿÿËö2ÀÿÿÿÿÒ#ôpÿÿÿÿÒ`íÐÿÿÂÿÿÇÀÿÿÕÐÿÿÕÐ LMTASTAPTAWT AST4 NSTimeZones/zones/America/Coral_Harbour0000644000175000017500000000022514353032552020213 0ustar richardrichardTZif2TZif2 ÿÿÿÿi‡&ÿÿÿÿ‹ôaèÿÿµpÿÿµÿÿ¹°LMTCMTEST EST5 NSTimeZones/zones/America/La_Paz0000644000175000017500000000025214353032552016637 0ustar richardrichardTZif2TZif2ÿÿÿÿi‡dÿÿÿÿ¸–äÿÿÿÿ¸îÕÔÿÿÀÿÿÀÿÿÎ,ÿÿÇÀ LMTCMTBST-04 <-04>4 NSTimeZones/zones/America/Yakutat0000644000175000017500000000166214353032552017121 0ustar richardrichardTZif2TZif2Sÿÿÿÿ?ÂýÑÿÿÿÿ}‡7¿ÿÿÿÿˉ(°ÿÿÿÿÒ#ôpÿÿÿÿÒa4 ÿÿÿÿþ¸U0ÿÿÿÿÿ¨8 ˜70ˆ x0q6 a5°Q A°0ú Q° Ü  ­Í0 𾠠཰ ÙÛ ÀŸ°¹½ ©¼0™Ÿ ‰ž0y i€0Yc Ib09E )D0"a  &0C +òB°â% Ò$°Â ²°¡é  v90!Ë "V0#jè $5ý0%JÊ &ß0'*¬ 'þû°) Ž )Þݰ*êp +¾¿°,ÓŒ -ž¡°.³n /~ƒ°0“P 1g 02s2 3G‚04S 5'd062ö 7F08 8ç(09ûõ :Ç 0;Û× <°&°=»¹ >°?›› @oê°A„· BO̰Cd™ D/®°ED{ Eóá0Îÿÿ}ÿÿpÿÿ€ÿÿ€ ÿÿ€ÿÿ€ÿÿpLMTYSTYWTYPTYDTAKDTAKST AKST9AKDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Cayman0000644000175000017500000000022514353032552016701 0ustar richardrichardTZif2TZif2 ÿÿÿÿi‡&ÿÿÿÿ‹ôaèÿÿµpÿÿµÿÿ¹°LMTCMTEST EST5 NSTimeZones/zones/America/Tegucigalpa0000644000175000017500000000030214353032552017712 0ustar richardrichardTZif2TZif2 ÿÿÿÿ¤LKD šÜà!\›P"z¾à#<}PD]ŒàDÖÈÐÿÿ®<ÿÿ¹°ÿÿ« LMTCDTCST CST6 NSTimeZones/zones/America/Detroit0000644000175000017500000000160314353032552017104 0ustar richardrichardTZif2TZif2Pÿÿÿÿ…½"[ÿÿÿÿ™<”ÿÿÿÿˈðpÿÿÿÿÒ#ôpÿÿÿÿÒ`ûàÿÿÿÿ×5¨ðÿÿÿÿØ¡àÿÿÿÿû3Œÿÿÿÿûè;àÿÿÿÿüØ:ðÿÿÿÿýÈà@ßp0Â`p ¤` £p ð†` à…p Ù¢à Àgp¹„੃ð™fà‰eðyHàiGðY*àI)ð9 à) ð")`íð `ò páí`ÑìpÁÏ`±Îp¡±` vð!“`"Uâð#j¯à$5Äð%J‘à&¦ð'*sà'þÃp) Uà)Þ¥p*ê7à+¾‡p,ÓT`-žip.³6`/~Kp0“`1ggð2rú`3GIð4RÜ`5'+ð62¾`7 ð8Úà8æïð9û¼à:ÆÑð;Ûžà<¯îp=»€à>Ðp?›bà@o²pA„`BO”pCda`D/vpEDC`Eó¨ðÿÿ²%ÿÿ« ÿÿ¹°ÿÿÇÀ ÿÿÇÀÿÿÇÀLMTCSTESTEWTEPTEDT EST5EDT,M3.2.0,M11.1.0 NSTimeZones/zones/America/Dominica0000644000175000017500000000026114353032552017214 0ustar richardrichardTZif2TZif2ÿÿÿÿz敹ÿÿÿÿËö2ÀÿÿÿÿÒ#ôpÿÿÿÿÒ`íÐÿÿÂÿÿÇÀÿÿÕÐÿÿÕÐ LMTASTAPTAWT AST4 NSTimeZones/zones/America/Blanc-Sablon0000644000175000017500000000026114353032552017724 0ustar richardrichardTZif2TZif2ÿÿÿÿz敹ÿÿÿÿËö2ÀÿÿÿÿÒ#ôpÿÿÿÿÒ`íÐÿÿÂÿÿÇÀÿÿÕÐÿÿÕÐ LMTASTAPTAWT AST4 NSTimeZones/zones/Europe/0000755000175000017500000000000014353032552015445 5ustar richardrichardNSTimeZones/zones/Europe/Podgorica0000644000175000017500000000073614353032552017305 0ustar richardrichardTZif2TZif2$ ÿÿÿÿ^<ðHÿÿÿÿÊ5àÿÿÿÿÌçKÿÿÿÿÍ©ÿÿÿÿ΢CÿÿÿÿÏ’4ÿÿÿÿЂ%ÿÿÿÿÑ¡ŒÿÿÿÿÒN@ã¯Ó Ñ¼½¬®œŸŒ| lr!\c"LT#Pÿÿÿÿñô¹`ÿÿÿÿôbïPÿÿÿÿõh`ÿÿÿÿö8Ðn“p9špûu |p ÐË ù^p ±þ€ Ù@p ¤U€¦­p„7€øP‰°pܰàæÐðÆïð›1pŒsð|dð lUð!\Fð"L7ð#<(ð$,ð% ð& ûð''p'õp(å p)Ôúp*Äëp+´Üp,¤Íp-‹ƒð.„¯p/t p0d‘p1]¼ð2r—ð3=žð4Ryð5€ð62[ð6ýbð8xp8ÝDð9ûZp:½&ð;Û†%p?›p@fpA„ðBEépCcþðD%ËpECàðFÉG#ßGîæIÁIÎÈJã£K®ªLÌ¿MÝN¬¡OnnPŒƒQWŠRleS8¾TLGUNV>žV÷0WÏ.P(h*0 *08@LMTIMTEESTEET+03+04 <+03>-3 NSTimeZones/zones/Europe/Volgograd0000644000175000017500000000133714353032552017320 0ustar richardrichardTZif2TZif2Aÿÿÿÿ¡õFÜÿÿÿÿµ¤ P'™ÀÎ0Í@ú°êÀÛ50Ì…À¼’ଃàœtàŒeà|Và lGà!\8à"L)à#<(ð$,ð% ð& ûð''p'õp)Ôì`*Äëp+´Üp,¤Íp-”¾p.„¯p/t p0d‘p1]¼ð2r—ð3=žð4Ryð5€ð62[ð6ýbð8xp8ÝDð9ûZp:½&ð;Û†%p?›p@fpA„ðBEépCcþðD%ËpECàðF­pG#ÂðGîÉðI¤ðIΫðJã†ðK®ðLÌ£pMŽoðTL`[Ôíð_ç²`)¤*08@FP 8@LMT+03+04+05 <+03>-3 NSTimeZones/zones/Europe/Gibraltar0000644000175000017500000000230414353032552017276 0ustar richardrichardTZif2TZif2sÿÿÿÿWÑ ÿÿÿÿ›&­ ÿÿÿÿ›Ö ÿÿÿÿœÏ0 ÿÿÿÿ¤Ã ÿÿÿÿžœ ÿÿÿÿŸ— ÿÿÿÿ …º ÿÿÿÿ¡vü ÿÿÿÿ¢eœ ÿÿÿÿ£{È ÿÿÿÿ¤N¸ ÿÿÿÿ¥?û ÿÿÿÿ¦%` ÿÿÿÿ§'Æ ÿÿÿÿ¨*, ÿÿÿÿ¨ëø ÿÿÿÿªÓ ÿÿÿÿªÕ ÿÿÿÿ«éð ÿÿÿÿ¬Çl ÿÿÿÿ­ÉÒ ÿÿÿÿ®§N ÿÿÿÿ¯ y ÿÿÿÿ°‡0 ÿÿÿÿ±’Рÿÿÿÿ²pL ÿÿÿÿ³r² ÿÿÿÿ´P. ÿÿÿÿµIZ ÿÿÿÿ¶0 ÿÿÿÿ·2v ÿÿÿÿ¸ò ÿÿÿÿ¹X ÿÿÿÿ¹ïÔ ÿÿÿÿºé ÿÿÿÿ»Øñ ÿÿÿÿ¼ÛW ÿÿÿÿ½¸Ó ÿÿÿÿ¾±þ ÿÿÿÿ¿˜µ ÿÿÿÿÀ› ÿÿÿÿÁx— ÿÿÿÿÂzý ÿÿÿÿÃXy ÿÿÿÿÄQ¤ ÿÿÿÿÅ8[ ÿÿÿÿÆ:Á ÿÿÿÿÇXÖ ÿÿÿÿÇÚ  ÿÿÿÿÊ&ÿÿÿÿÊ—YÿÿÿÿËÑÿÿÿÿÌw;ÿÿÿÿͱÿÿÿÿÎ`XÿÿÿÿÏâÿÿÿÿÐn^ÿÿÿÿÑrÿÿÿÿÑû2ÿÿÿÿÒiþ ÿÿÿÿÓc) ÿÿÿÿÔIà ÿÿÿÿÕ! ÿÿÿÿÕBýÿÿÿÿÕßàÿÿÿÿÖN¬ ÿÿÿÿÖþ ÿÿÿÿØ.Ž ÿÿÿÿØù• ÿÿÿÿÚp ÿÿÿÿÚëì ÿÿÿÿÛå ÿÿÿÿÜËÎ ÿÿÿÿÝÄù ÿÿÿÿÞ´ê ÿÿÿÿß® ÿÿÿÿà”Ì ÿÿÿÿárH ÿÿÿÿâkt ÿÿÿÿãR* ÿÿÿÿäT ÿÿÿÿå2  ÿÿÿÿæ=­ ÿÿÿÿç) ÿÿÿÿèT Íó¾ã¯Ó Ñ¼½¬®œŸŒ| lr!\c"LT#†%p?›p@fpA„ðBEépCcþðD%ËpECàðF­pG#ÂðGîÉðI¤ðIΫðJã†ðK®ðLÌ£pMŽoðTL`V÷p-`*0FP8@ 8@ *0 LMT+03+05+04+02 <+04>-4 NSTimeZones/zones/Europe/Lisbon0000644000175000017500000000265614353032552016627 0ustar richardrichardTZif2TZif2ÿÿÿÿ^= ÿÿÿÿ’掀ÿÿÿÿ›Kmpÿÿÿÿ›þÇ€ÿÿÿÿœœípÿÿÿÿɃpÿÿÿÿžrpÿÿÿÿŸª¶ðÿÿÿÿ _Tpÿÿÿÿ¡‹êpÿÿÿÿ¢AÙpÿÿÿÿ£nopÿÿÿÿ¤# ðÿÿÿÿ¥O¢ðÿÿÿÿªïpÿÿÿÿªôŽðÿÿÿÿ­É§ðÿÿÿÿ®§#ðÿÿÿÿ¯ Opÿÿÿÿ°‡ðÿÿÿÿ±‰kðÿÿÿÿ²p"pÿÿÿÿ³rˆpÿÿÿÿ´Ppÿÿÿÿ·2Lpÿÿÿÿ¸Èpÿÿÿÿ¸ÿ¹pÿÿÿÿ¹ïªpÿÿÿÿ¼È·ðÿÿÿÿ½¸¨ðÿÿÿÿ¾Ÿ_pÿÿÿÿ¿˜ŠðÿÿÿÿÀšððÿÿÿÿÁxlðÿÿÿÿÂh]ðÿÿÿÿÃXNðÿÿÿÿÄ?pÿÿÿÿÅ80ðÿÿÿÿÆ:–ðÿÿÿÿÇX¬pÿÿÿÿÇÙßpÿÿÿÿÉ/pÿÿÿÿÉñ pÿÿÿÿÊâbðÿÿÿÿ˵RðÿÿÿÿËì£àÿÿÿÿÌ€KàÿÿÿÿÌÜ¢ðÿÿÿÿÍ•4ðÿÿÿÿÍÃK`ÿÿÿÿÎr¢àÿÿÿÿÎÅ¿pÿÿÿÿÏuðÿÿÿÿϬgàÿÿÿÿÐR„àÿÿÿÿÐ¥¡pÿÿÿÿÑTøðÿÿÿÿÑŒIàÿÿÿÿÒ2fàÿÿÿÿÒ…ƒpÿÿÿÿÓYÄðÿÿÿÿÔIµðÿÿÿÿÕ9Ñ ÿÿÿÿÖ) ÿÿÿÿ׳ ÿÿÿÿØ ¤ ÿÿÿÿØù• ÿÿÿÿÙé† ÿÿÿÿÚÙw ÿÿÿÿÛÉh ÿÿÿÿܹY ÿÿÿÿݲ„ ÿÿÿÿÞ¢u ÿÿÿÿß’f ÿÿÿÿà‚W ÿÿÿÿárH ÿÿÿÿâb9 ÿÿÿÿãR* ÿÿÿÿäB ÿÿÿÿå2  ÿÿÿÿæ!ý ÿÿÿÿç) ÿÿÿÿè  ÿÿÿÿèû ÿÿÿÿéêü ÿÿÿÿêÚí ÿÿÿÿëÊÞ ÿÿÿÿìºÏ ÿÿÿÿíªÀ ÿÿÿÿîš± ÿÿÿÿ ÿÿÿÿðz“ ÿÿÿÿñj„ ÿÿÿÿòc¯ ÿÿÿÿóS  ÿÿÿÿôC‘ ÿÿÿÿõ3‚ ÿÿÿÿö#s ÿÿÿÿ÷d ÿÿÿÿøU ÿÿÿÿøóF  «* ›‹ „7€t(€d€TCû€3ú#ëÜÍó¾ã½ Ó Ñ¼½¬®œŸŒ| lr!\c"LT#` xð Ðqà éOp ´H` Òkð”*`°üpt `ÞpSî`pÀp;¹`H¹p²`1ÕðüÎà”pÛ_`̯𼽬®œŸŒ| lr!\c"LT#†A?›@f#A„9BFCdD%çECýFÉG#ßGîæIÁIÎÈJã£K®ªLÌ¿MŽŒN¬¡OnnPŒƒQWŠRleS7^€TL`øà *0  8@*08@ LMTSMTEETMSKCETCESTMSDEEST MSK-3 NSTimeZones/zones/Europe/Astrakhan0000644000175000017500000000132614353032552017306 0ustar richardrichardTZif2TZif2@ÿÿÿÿªEtÿÿÿÿµ¤ P'™ÀÎ0Í@ú°êÀÛ50Ì…À¼’ଃàœtàŒeà|Và lGà!\8à"L)à#<à$, à% ð& ûð''p'õp)Ôì`*Äëp+´Üp,¤Íp-”¾p.„¯p/t p0d‘p1]¼ð2r—ð3=žð4Ryð5€ð62[ð6ýbð8xp8ÝDð9ûZp:½&ð;Û†%p?›p@fpA„ðBEépCcþðD%ËpECàðF­pG#ÂðGîÉðI¤ðIΫðJã†ðK®ðLÌ£pMŽoðTL`V÷p- *0FP8@ 8@ LMT+03+05+04 <+04>-4 NSTimeZones/zones/Europe/Zagreb0000644000175000017500000000073614353032552016610 0ustar richardrichardTZif2TZif2$ ÿÿÿÿ^<ðHÿÿÿÿÊ5àÿÿÿÿÌçKÿÿÿÿÍ©ÿÿÿÿ΢CÿÿÿÿÏ’4ÿÿÿÿЂ%ÿÿÿÿÑ¡ŒÿÿÿÿÒN@ã¯Ó Ñ¼½¬®œŸŒ| lr!\c"LT#ó`ÿÿÿÿ¹ïœ`ÿÿÿÿºß`ÿÿÿÿ»Ï~`ÿÿÿÿ¼È©àÿÿÿÿ½¸šàÿÿÿÿ¾¨‹àÿÿÿÿ¿˜|àÿÿÿÿÀˆmàÿÿÿÿÁx^àÿÿÿÿÂhOàÿÿÿÿÃX@àÿÿÿÿÄH1àÿÿÿÿÅ8"àÿÿÿÿÆ(àÿÿÿÿÇàÿÿÿÿȼ“`ÿÿÿÿÊw}PÿÿÿÿÌçKÿÿÿÿÍ©ÿÿÿÿ΢CÿÿÿÿÏ’4ÿÿÿÿÐN`'§ÐÜ@ÛPúÀêÐÛC@̓м ð¬‘ðœ‚ðŒsð|dð lUð!\Fð"L7ð#<(ð$,ð% ð& ûð&CLà'5€'õ&€(å€)Ôì`*ÄÏP+´Î`,¤±P-”°`.„“P/t’`0duP1]®à2r{Ð3=­ôx*0   8@*0"LMTCMTBMTEESTEETCETCESTMSDMSK EET-2EEST,M3.5.0,M10.5.0/3 NSTimeZones/zones/Europe/Kirov0000644000175000017500000000131514353032552016462 0ustar richardrichardTZif2TZif2?ÿÿÿÿ¡9€ÿÿÿÿµ¤ P'™ÀÎ0Í@ú°êÀÛ50Ì…À¼’ଃàœtàŒeà|Và lGà!\8à"L)à#<à$, à% ð& ûð''p'õp)Ôì`*Äëp+´Üp,¤Íp-”¾p.„¯p/t p0d‘p1]¼ð2r—ð3=žð4Ryð5€ð62[ð6ýbð8xp8ÝDð9ûZp:½&ð;Û†%p?›p@fpA„ðBEépCcþðD%ËpECàðF­pG#ÂðGîÉðI¤ðIΫðJã†ðK®ðLÌ£pMŽoðTL`.˜*0FP8@ 8@ LMT+03+05+04 <+03>-3 NSTimeZones/zones/Europe/Andorra0000644000175000017500000000060514353032552016757 0ustar richardrichardTZif2TZif2ÿÿÿÿ~6³”ÿÿÿÿÔAÛ¬®œŸŒ| lr!\c"LT#(èLÿÿÿÿp¼pÿÿÿÿ›8øpÿÿÿÿ›ÕÌàÿÿÿÿœÅËðÿÿÿÿ·`ÿÿÿÿž‰þpÿÿÿÿŸ àÿÿÿÿ `¥ðÿÿÿÿ¡~­`ÿÿÿÿ¢\7pÿÿÿÿ£L`ÿÿÿÿÈl5ðÿÿÿÿÌçKÿÿÿÿÍ©ÿÿÿÿ΢CÿÿÿÿÏ’4ÿÿÿÿÐn^ÿÿÿÿÑrÿÿÿÿÒLÒðÿÿÿÿÓ>1ÿÿÿÿÔIÒÿÿÿÿÕ÷pÿÿÿÿÖ)—ðÿÿÿÿÖë€ÿÿÿÿØ –ÿÿÿÿù3µðÿÿÿÿùÙÄàÿÿÿÿûÒpÿÿÿÿû¹´ðÿÿÿÿüü´pÿÿÿÿý™–ðÿÿÿÿþåÐðÿÿÿÿÿ‚³pŲðb•pœZpBwp…vð+“ðn“p uðE:ðëWð .Wp Ë9ð 9p «ð äàðŠýðÍýptp­ßpSüpMD3ú#ëÜÍó¾ã¯Ó Ñ¼½¬®œŸŒ| lr!\c"LT#(èLÿÿÿÿp¼pÿÿÿÿ›8øpÿÿÿÿ›ÕÌàÿÿÿÿœÅËðÿÿÿÿ·`ÿÿÿÿž‰þpÿÿÿÿŸ àÿÿÿÿ `¥ðÿÿÿÿ¡~­`ÿÿÿÿ¢\7pÿÿÿÿ£L`ÿÿÿÿÈl5ðÿÿÿÿÌçKÿÿÿÿÍ©ÿÿÿÿ΢CÿÿÿÿÏ’4ÿÿÿÿÐn^ÿÿÿÿÑrÿÿÿÿÒLÒðÿÿÿÿÓ>1ÿÿÿÿÔIÒÿÿÿÿÕ÷pÿÿÿÿÖ)—ðÿÿÿÿÖë€ÿÿÿÿØ –ÿÿÿÿù3µðÿÿÿÿùÙÄàÿÿÿÿûÒpÿÿÿÿû¹´ðÿÿÿÿüü´pÿÿÿÿý™–ðÿÿÿÿþåÐðÿÿÿÿÿ‚³pŲðb•pœZpBwp…vð+“ðn“p uðE:ðëWð .Wp Ë9ð 9p «ð äàðŠýðÍýptp­ßpSüpMD3ú#ëÜÍó¾ã¯Ó Ñ¼½¬®œŸŒ| lr!\c"LT#†3€?›€@f€A„+BE÷€Cd D%Ù€ECïF»€G#ÑGîØI³IκJã•K®œḺ€MŽ~TL+p8  *0  8@*0*0LMTCESTCETEESTEETMSDMSK+03 EET-2 NSTimeZones/zones/Europe/Moscow0000644000175000017500000000161414353032552016641 0ustar richardrichardTZif2TZif2N &ÿÿÿÿV¶ÀÇÿÿÿÿ›_Çÿÿÿÿ>òyÿÿÿÿž*îùÿÿÿÿž÷9iÿÿÿÿŸ„Wùÿÿÿÿ Øléÿÿÿÿ¡9€ÿÿÿÿ¡<¦@ÿÿÿÿ¤mÀÿÿÿÿ¤=2°ÿÿÿÿ¥h°ÿÿÿÿ¥=Àÿÿÿÿ§EPÿÿÿÿµ¤`'§ÐÜ@ÛPúÀêÐÛC@̓м ð¬‘ðœ‚ðŒsð|dð lUð!\Fð"L7ð#<(ð$,ð% ð& ûð''p'õp(å€)x¿€)Ôúp*Äëp+´Üp,¤Íp-”¾p.„¯p/t p0d‘p1]¼ð2r—ð3=žð4Ryð5€ð62[ð6ýbð8xp8ÝDð9ûZp:½&ð;Û†%p?›p@fpA„ðBEépCcþðD%ËpECàðF­pG#ÂðGîÉðI¤ðIΫðJã†ðK®ðLÌ£pMŽoðTL`  #9#91‡#w?— 8@*0FP *0!8@LMTMMTMSTMDSTMSDMSK+05EETEEST MSK-3 NSTimeZones/zones/Europe/Jersey0000644000175000017500000000307714353032552016640 0ustar richardrichardTZif2TZif2Ÿÿÿÿÿ] Ëÿÿÿÿ›&­ ÿÿÿÿ›Ö ÿÿÿÿœÏ0 ÿÿÿÿ¤Ã ÿÿÿÿžœ ÿÿÿÿŸ— ÿÿÿÿ …º ÿÿÿÿ¡vü ÿÿÿÿ¢eœ ÿÿÿÿ£{È ÿÿÿÿ¤N¸ ÿÿÿÿ¥?û ÿÿÿÿ¦%` ÿÿÿÿ§'Æ ÿÿÿÿ¨*, ÿÿÿÿ¨ëø ÿÿÿÿªÓ ÿÿÿÿªÕ ÿÿÿÿ«éð ÿÿÿÿ¬Çl ÿÿÿÿ­ÉÒ ÿÿÿÿ®§N ÿÿÿÿ¯ y ÿÿÿÿ°‡0 ÿÿÿÿ±’Рÿÿÿÿ²pL ÿÿÿÿ³r² ÿÿÿÿ´P. ÿÿÿÿµIZ ÿÿÿÿ¶0 ÿÿÿÿ·2v ÿÿÿÿ¸ò ÿÿÿÿ¹X ÿÿÿÿ¹ïÔ ÿÿÿÿºé ÿÿÿÿ»Øñ ÿÿÿÿ¼ÛW ÿÿÿÿ½¸Ó ÿÿÿÿ¾±þ ÿÿÿÿ¿˜µ ÿÿÿÿÀ› ÿÿÿÿÁx— ÿÿÿÿÂzý ÿÿÿÿÃXy ÿÿÿÿÄQ¤ ÿÿÿÿÅ8[ ÿÿÿÿÆ:Á ÿÿÿÿÇXÖ ÿÿÿÿÇÚ  ÿÿÿÿÊ&ÿÿÿÿÊ—YÿÿÿÿËÑÿÿÿÿÌw;ÿÿÿÿͱÿÿÿÿÎ`XÿÿÿÿÏâÿÿÿÿÐn^ÿÿÿÿÑrÿÿÿÿÑû2ÿÿÿÿÒiþ ÿÿÿÿÓc) ÿÿÿÿÔIà ÿÿÿÿÕ! ÿÿÿÿÕBýÿÿÿÿÕßàÿÿÿÿÖN¬ ÿÿÿÿÖþ ÿÿÿÿØ.Ž ÿÿÿÿØù• ÿÿÿÿÚp ÿÿÿÿÚëì ÿÿÿÿÛå ÿÿÿÿÜËÎ ÿÿÿÿÝÄù ÿÿÿÿÞ´ê ÿÿÿÿß® ÿÿÿÿà”Ì ÿÿÿÿárH ÿÿÿÿâkt ÿÿÿÿãR* ÿÿÿÿäT ÿÿÿÿå2  ÿÿÿÿæ=­ ÿÿÿÿç) ÿÿÿÿèT ÿÿÿÿèû ÿÿÿÿéýq ÿÿÿÿêÚí ÿÿÿÿëÝS ÿÿÿÿìºÏ ÿÿÿÿí³ú ÿÿÿÿîš± ÿÿÿÿïg ÿÿÿÿðŸ} ÿÿÿÿñaI ÿÿÿÿò_ ÿÿÿÿóJf ÿÿÿÿô_A ÿÿÿÿõ!  ÿÿÿÿö?# ÿÿÿÿ÷ï ÿÿÿÿø ÿÿÿÿøàÑ ÿÿÿÿùþç ÿÿÿÿúÀ³ ÿÿÿÿûè ÿÿÿÿü{« ÿÿÿÿýÇ»ppÆ )X P¨  : 0Š é l Èþ ðN ²  Ð0 ‘ü ° qÞ ™. QÀ y 1¢ Xò #ë8ÆÍ¨ã¯øŠÑ᧬®Á‰Œ¡k lr!M"LT#a/$,6%JK& '*-'õ4) )Õ*éñ+´ø,ÉÓ-”Ú.©µ/t¼0‰—1]Ùÿÿÿµ  LMTBSTGMTBDST GMT0BST,M3.5.0/1,M10.5.0 NSTimeZones/zones/Europe/Stockholm0000644000175000017500000000130114353032552017326 0ustar richardrichardTZif2TZif2<ÿÿÿÿo¢aøÿÿÿÿ› `ÿÿÿÿ›ÕÚðÿÿÿÿœÙ®ÿÿÿÿ¤µÿÿÿÿž¹ÿÿÿÿŸ„—ÿÿÿÿÈ qÿÿÿÿÌçKÿÿÿÿÍ©ÿÿÿÿ΢CÿÿÿÿÏ’4ÿÿÿÿЂ%ÿÿÿÿÑrÿÿÿÿѶ–ÿÿÿÿÒX¾€ÿÿÿÿÒ¡OÿÿÿÿÓcÿÿÿÿÔK#ÿÿÿÿÕ9Ñ ÿÿÿÿÕgçÿÿÿÿÕ¨sÿÿÿÿÖ)´ÿÿÿÿ×,ÿÿÿÿØ –ÿÿÿÿÙÁÿÿÿÿÙéxMD3ú#ëÜÍó¾ã¯Ó Ñ¼½¬®œŸŒ| lr!\c"LT#ó`ÿÿÿÿ¹ïœ`ÿÿÿÿºß`ÿÿÿÿ»Ï~`ÿÿÿÿ¼È©àÿÿÿÿ½¸šàÿÿÿÿ¾¨‹àÿÿÿÿ¿˜|àÿÿÿÿÀˆmàÿÿÿÿÁx^àÿÿÿÿÂhOàÿÿÿÿÃX@àÿÿÿÿÄH1àÿÿÿÿÅ8"àÿÿÿÿÆ(àÿÿÿÿÇàÿÿÿÿȼ“`ÿÿÿÿÊw}PÿÿÿÿÌçKÿÿÿÿÍ©ÿÿÿÿ΢CÿÿÿÿÏ’4ÿÿÿÿÐN`'§ÐÜ@ÛPúÀêÐÛC@̓м ð¬‘ðœ‚ðŒsð|dð lUð!\Fð"L7ð#<(ð$,ð% ð& ûð&CLà'5€'õ&€(å€)Ôì`*ÄÏP+´Î`,¤±P-”°`.„“P/t’`0duP1]®à2r{Ð3=­ôx*0   8@*0"LMTCMTBMTEESTEETCETCESTMSDMSK EET-2EEST,M3.5.0,M10.5.0/3 NSTimeZones/zones/Europe/San_Marino0000644000175000017500000000166314353032552017424 0ustar richardrichardTZif2TZif2Wÿÿÿÿ>(èLÿÿÿÿp¼pÿÿÿÿ›8øpÿÿÿÿ›ÕÌàÿÿÿÿœÅËðÿÿÿÿ·`ÿÿÿÿž‰þpÿÿÿÿŸ àÿÿÿÿ `¥ðÿÿÿÿ¡~­`ÿÿÿÿ¢\7pÿÿÿÿ£L`ÿÿÿÿÈl5ðÿÿÿÿÌçKÿÿÿÿÍ©ÿÿÿÿ΢CÿÿÿÿÏ’4ÿÿÿÿÐn^ÿÿÿÿÑrÿÿÿÿÒLÒðÿÿÿÿÓ>1ÿÿÿÿÔIÒÿÿÿÿÕ÷pÿÿÿÿÖ)—ðÿÿÿÿÖë€ÿÿÿÿØ –ÿÿÿÿù3µðÿÿÿÿùÙÄàÿÿÿÿûÒpÿÿÿÿû¹´ðÿÿÿÿüü´pÿÿÿÿý™–ðÿÿÿÿþåÐðÿÿÿÿÿ‚³pŲðb•pœZpBwp…vð+“ðn“p uðE:ðëWð .Wp Ë9ð 9p «ð äàðŠýðÍýptp­ßpSüpMD3ú#ëÜÍó¾ã¯Ó Ñ¼½¬®œŸŒ| lr!\c"LT#ó`ÿÿÿÿ¹ïœ`ÿÿÿÿºß`ÿÿÿÿ»Ï~`ÿÿÿÿ¼È©àÿÿÿÿ½¸šàÿÿÿÿ¾¨‹àÿÿÿÿ¿˜|àÿÿÿÿÀˆmàÿÿÿÿÁx^àÿÿÿÿÂhOàÿÿÿÿÃX@àÿÿÿÿÄH1àÿÿÿÿÅ8"àÿÿÿÿÆ(àÿÿÿÿÇà­Ñ`SàPM Ð3Ð`#Ý€΀¿€ó°€ã¡€Ó’€À¼¯¬ œ‘Œ‚|s ld!\U"LF#<7$,(%& '5€'õ `(äû`)Ôì`*ÄÝ`+´Î`,¤¿`-”°`.„“P/t’`0duP1]®à2r{Ð3=»xx*0 LMTBMTEESTEET EET-2EEST,M3.5.0/3,M10.5.0/4 NSTimeZones/zones/Europe/Zurich0000644000175000017500000000076114353032552016640 0ustar richardrichardTZif2TZif2%ÿÿÿÿ$ðê€ÿÿÿÿqÔ†ÿÿÿÿÊjÿÿÿÿÊâqÿÿÿÿË÷LÿÿÿÿÌÂS#ëÜÍó¾ã¯Ó Ñ¼½¬®œŸŒ| lr!\c"LT#†%p?›p@fpA„ðBEépCcþðD%ËpECàðF­pG#ÂðGîÉðI¤ðIΫðJã†ðK®ðLÌ£pMŽoðTL`XCNp+2*0FP8@ 8@ LMT+03+05+04 <+04>-4 NSTimeZones/zones/Europe/Skopje0000644000175000017500000000073614353032552016631 0ustar richardrichardTZif2TZif2$ ÿÿÿÿ^<ðHÿÿÿÿÊ5àÿÿÿÿÌçKÿÿÿÿÍ©ÿÿÿÿ΢CÿÿÿÿÏ’4ÿÿÿÿЂ%ÿÿÿÿÑ¡ŒÿÿÿÿÒN@ã¯Ó Ñ¼½¬®œŸŒ| lr!\c"LT#†3€?›€@f€A„+BE÷€Cd D%Ù€ECïF»€G#ÑGîØI³IκJã•K®œḺ€MŽ~ØÈ *0  8@*0*0"LMTMMTEETMSKCETCESTMSDEEST+03 <+03>-3 NSTimeZones/zones/Europe/Vilnius0000644000175000017500000000124414353032552017022 0ustar richardrichardTZif2TZif23 &ÿÿÿÿV¶ÌDÿÿÿÿœOPÿÿÿÿ¡…J˜ÿÿÿÿ¢ñ0ðÿÿÿÿ£fx`ÿÿÿÿȬÏpÿÿÿÿÊY*ÐÿÿÿÿÌçKÿÿÿÿÍ©ÿÿÿÿ΢CÿÿÿÿÏ’4ÿÿÿÿÐ0=à'§ÐÜ@ÛPúÀêÐÛC@̓м ð¬‘ðœ‚ðŒsð|dð lUð!\Fð"L7ð#<(ð$,ð%& '5€'õ&€(å€)Õ€*Äù€+´ê€,¤Û€-”Ì€.„½€/t®€0dŸ€1]Ë2r¦3=­4Rˆ562x6ý8”>†A¼°h  *0 8@*0!LMTWMTKMTCETEETMSKCESTMSDEEST EET-2EEST,M3.5.0/3,M10.5.0/4 NSTimeZones/zones/Europe/Oslo0000644000175000017500000000130114353032552016277 0ustar richardrichardTZif2TZif2<ÿÿÿÿo¢aøÿÿÿÿ› `ÿÿÿÿ›ÕÚðÿÿÿÿœÙ®ÿÿÿÿ¤µÿÿÿÿž¹ÿÿÿÿŸ„—ÿÿÿÿÈ qÿÿÿÿÌçKÿÿÿÿÍ©ÿÿÿÿ΢CÿÿÿÿÏ’4ÿÿÿÿЂ%ÿÿÿÿÑrÿÿÿÿѶ–ÿÿÿÿÒX¾€ÿÿÿÿÒ¡OÿÿÿÿÓcÿÿÿÿÔK#ÿÿÿÿÕ9Ñ ÿÿÿÿÕgçÿÿÿÿÕ¨sÿÿÿÿÖ)´ÿÿÿÿ×,ÿÿÿÿØ –ÿÿÿÿÙÁÿÿÿÿÙéxMD3ú#ëÜÍó¾ã¯Ó Ñ¼½¬®œŸŒ| lr!\c"LT#†`?šò`@eù`A„àBEÛ`CcðàD%½`ECÒàFŸ`G#´àGî»àI–àIÎàJãxàK®àLÌ£pMŽoð.ô*08@FP 8@*0LMT+03+04+05 <+04>-4 NSTimeZones/zones/Europe/Malta0000644000175000017500000000164014353032552016427 0ustar richardrichardTZif2TZif2V ÿÿÿÿp½Ódÿÿÿÿ›8øpÿÿÿÿ›ÕÌàÿÿÿÿœÅËðÿÿÿÿ·`ÿÿÿÿž‰þpÿÿÿÿŸ àÿÿÿÿ `¥ðÿÿÿÿ¡~­`ÿÿÿÿ¢\7pÿÿÿÿ£L`ÿÿÿÿÈl5ðÿÿÿÿÌçKÿÿÿÿÍ©ÿÿÿÿ΢CÿÿÿÿÏâÿÿÿÿÐn^ÿÿÿÿÑrÿÿÿÿÒLÒðÿÿÿÿÓ>1ÿÿÿÿÔIÒÿÿÿÿÕ÷pÿÿÿÿÖ)—ðÿÿÿÿÖë€ÿÿÿÿØ –ÿÿÿÿù3µðÿÿÿÿùÙÄàÿÿÿÿûÒpÿÿÿÿû¹´ðÿÿÿÿüü´pÿÿÿÿý™–ðÿÿÿÿþåÐðÿÿÿÿÿ‚³pŲðb•pœZpBwp…vð+“ð3p $ppÚ4p ÷  € Öö ¡ï€ ¶ØÑ€–ºa³€vœA•€E[*²#ëÜÍó¾ã¯Ó Ñ¼½¬®œŸŒ| lr!\c"LT#-9 NSTimeZones/zones/Cuba0000644000175000017500000000213514353032552015004 0ustar richardrichardTZif2TZif2jÿÿÿÿi‡(¸ÿÿÿÿ¬b€ÿÿÿÿ±Ó”Pÿÿÿÿ²t]@ÿÿÿÿÈ[fÐÿÿÿÿÈÓQ@ÿÿÿÿÊ;HÐÿÿÿÿʼmÀÿÿÿÿÌ$ePÿÿÿÿÌœOÀÿÿÿÿÑÄ PÿÿÿÿÒ;õÀÿÿÿÿÓ£íPÿÿÿÿÔ×Àÿÿÿÿ÷`Ðÿÿÿÿ÷ÿ}@ÿÿÿÿù=DÐÿÿÿÿùãSÀÿÿÿÿúÛ;Ðÿÿÿÿû§†@ÿÿÿÿüÅ©Ðÿÿÿÿý‡h@ÿÿÿÿþ¸Ðÿÿÿÿÿ§ãÀ—âЇÅÀwÄÐpâ@`áP5À@ÃPH@ ¥P÷{À ‡P ðj@ àiP Ù†À ÀKP¹hÀ²¢P}›@QêÐf·À1ÌÐF™À[‚Ð&{À;dÐ]ÀFÐæ?Àû(ÐÏ\@Û Ð¯>@zSP @ Z5P!o@"CQÐ#Nä@$#3Ð%.Æ@&ŠÐ'âÀ'þ§P(÷ÒÐ)Þ‰P*×´Ð+¾kP,·–Ð-žMP.—xÐ/~/P0wZÐ1gKÐ2W<Ð3G-Ð4@YP5ÕP62°P6ý·P8ÌÐ8æÓÐ9û®Ð:ƵÐ;ÛÐ<¯ÒP=»rÐ>´P?›TÐ@f[ÐED5PEóŒÐG$PGÜ©PIùPI³PÐJãÛPKœmPLÌ÷ÐM…‰ÐN¿NÐOwàÐP•öPÿÿ²Èÿÿ²ÀÿÿÇÀÿÿ¹° LMTHMTCDTCST CST5CDT,M3.2.0/0,M11.1.0/1 NSTimeZones/zones/PST8PDT0000644000175000017500000000166714353032552015251 0ustar richardrichardTZif2TZif2Xÿÿÿÿž¦H ÿÿÿÿŸ»ÿÿÿÿ †* ÿÿÿÿ¡š÷ÿÿÿÿˉ ÿÿÿÿÒ#ôpÿÿÿÿÒa&ÿÿÿÿúøƒ ÿÿÿÿûèfÿÿÿÿüØe ÿÿÿÿýÈHÿÿÿÿþ¸G ÿÿÿÿÿ¨*˜) ˆ x q(a' Q A  0ìC  Î ­¿ ð° ௠ ÙÍ À‘ ¹¯©® ™‘‰ ysir YUIT 97)6 "S  5ò4 âÒ Áù±ø ¡Û v+ !½"V #jÚ$5ï %J¼&Ñ '*ž'þí ) €)ÞÏ *êb+¾± ,Ó~-ž“ .³`/~u 0“B1g’ 2s$3Gt 4S5'V 62è78 88ç 9ûç:Æü ;ÛÉ<° =»«>ú ?›@oÜ A„©BO¾ Cd‹D/  EDmEóÓ ÿÿ€ÿÿÿÿÿÿ PDTPSTPWTPPT PST8PDT,M3.2.0,M11.1.0 NSTimeZones/GNUmakefile0000644000175000017500000000341312503304674015125 0ustar richardrichard# # Copyright (C) 2000 Free Software Foundation, Inc. # # Written by: Richard Frith-Macdonald # # This file is part of the GNUstep Base Library. # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 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 # Library General Public License for more details. # # You should have received a copy of the GNU Library General Public # License along with this library; if not, write to the Free # Software Foundation, Inc., 51 Franklin Street, Fifth Floor, # Boston, MA 02111 USA. # ifeq ($(GNUSTEP_MAKEFILES),) GNUSTEP_MAKEFILES := $(shell gnustep-config --variable=GNUSTEP_MAKEFILES 2>/dev/null) ifeq ($(GNUSTEP_MAKEFILES),) $(warning ) $(warning Unable to obtain GNUSTEP_MAKEFILES setting from gnustep-config!) $(warning Perhaps gnustep-make is not properly installed,) $(warning so gnustep-config is not in your PATH.) $(warning ) $(warning Your PATH is currently $(PATH)) $(warning ) endif endif ifeq ($(GNUSTEP_MAKEFILES),) $(error You need to set GNUSTEP_MAKEFILES before compiling!) endif include $(GNUSTEP_MAKEFILES)/common.make # The tools to be compiled TOOL_NAME = \ create-abbrevs \ create-regions # The tool Objective-C source files to be compiled create-abbrevs_OBJC_FILES = create-abbrevs.m create-regions_OBJC_FILES = create-regions.m include $(GNUSTEP_MAKEFILES)/tool.make after-distclean:: rm -rf localtime NSTimeZones/GNUstep_zones0000644000175000017500000000144707231606426015550 0ustar richardrichard# # GNUstep zones # Link Etc/UTC Universal Link Etc/UTC Zulu Link Etc/GMT Greenwich Link Etc/GMT GMT-0 Link Etc/GMT GMT+0 Link Etc/GMT GMT0 Zone GMT-14 -14 - GMT-14 # 14 hours behind GMT Zone GMT-13 -13 - GMT-13 Zone GMT-12 -12 - GMT-12 Zone GMT-11 -11 - GMT-11 Zone GMT-10 -10 - GMT-10 Zone GMT-9 -9 - GMT-9 Zone GMT-8 -8 - GMT-8 Zone GMT-7 -7 - GMT-7 Zone GMT-6 -6 - GMT-6 Zone GMT-5 -5 - GMT-5 Zone GMT-4 -4 - GMT-4 Zone GMT-3 -3 - GMT-3 Zone GMT-2 -2 - GMT-2 Zone GMT-1 -1 - GMT-1 Zone GMT+1 1 - GMT+1 Zone GMT+2 2 - GMT+2 Zone GMT+3 3 - GMT+3 Zone GMT+4 4 - GMT+4 Zone GMT+5 5 - GMT+5 Zone GMT+6 6 - GMT+6 Zone GMT+7 7 - GMT+7 Zone GMT+8 8 - GMT+8 Zone GMT+9 9 - GMT+9 Zone GMT+10 10 - GMT+10 Zone GMT+11 11 - GMT+11 Zone GMT+12 12 - GMT+12 Zone GMT+13 13 - GMT+13 Zone GMT+14 14 - GMT+14 NSTimeZones/abbreviations0000664000175000017500000014020314353032400015615 0ustar richardrichard+05 Antarctica/Mawson -00 Antarctica/Mawson +06 Antarctica/Mawson AEDT Antarctica/Macquarie -00 Antarctica/Macquarie AEST Antarctica/Macquarie +10 Antarctica/DumontDUrville LMT Antarctica/DumontDUrville PMMT Antarctica/DumontDUrville NZDT Antarctica/South_Pole NZMT Antarctica/South_Pole NZST Antarctica/South_Pole LMT Antarctica/South_Pole +05 Antarctica/Davis -00 Antarctica/Davis +07 Antarctica/Davis -02 Antarctica/Palmer -03 Antarctica/Palmer -00 Antarctica/Palmer -04 Antarctica/Palmer -03 Antarctica/Rothera -00 Antarctica/Rothera +03 Antarctica/Syowa LMT Antarctica/Syowa +06 Antarctica/Vostok -00 Antarctica/Vostok +00 Antarctica/Troll -00 Antarctica/Troll +02 Antarctica/Troll NZDT Antarctica/McMurdo NZMT Antarctica/McMurdo NZST Antarctica/McMurdo LMT Antarctica/McMurdo +11 Antarctica/Casey -00 Antarctica/Casey +08 Antarctica/Casey MWT US/Mountain MPT US/Mountain MDT US/Mountain LMT US/Mountain MST US/Mountain SST US/Samoa LMT US/Samoa EST US/Indiana-Starke CDT US/Indiana-Starke CST US/Indiana-Starke LMT US/Indiana-Starke CWT US/Indiana-Starke CPT US/Indiana-Starke HWT US/Hawaii HPT US/Hawaii LMT US/Hawaii HST US/Hawaii HDT US/Hawaii EDT US/Eastern EST US/Eastern EWT US/Eastern LMT US/Eastern EPT US/Eastern PWT US/Pacific PPT US/Pacific PDT US/Pacific PST US/Pacific LMT US/Pacific EDT US/Michigan EST US/Michigan CST US/Michigan EWT US/Michigan LMT US/Michigan EPT US/Michigan EST US/Central CDT US/Central CST US/Central CWT US/Central LMT US/Central CPT US/Central AST US/Alaska APT US/Alaska AWT US/Alaska LMT US/Alaska AKST US/Alaska AKDT US/Alaska AHST US/Alaska AHDT US/Alaska YST US/Alaska BST US/Aleutian BDT US/Aleutian HST US/Aleutian HDT US/Aleutian NWT US/Aleutian LMT US/Aleutian NST US/Aleutian NPT US/Aleutian AHST US/Aleutian MWT US/Arizona MST US/Arizona LMT US/Arizona MDT US/Arizona EDT US/East-Indiana EST US/East-Indiana CDT US/East-Indiana CST US/East-Indiana LMT US/East-Indiana CWT US/East-Indiana CPT US/East-Indiana GMT Greenwich DMT Eire IST Eire BST Eire LMT Eire GMT Eire +00 Africa/El_Aaiun +01 Africa/El_Aaiun -01 Africa/El_Aaiun LMT Africa/El_Aaiun CAT Africa/Lusaka LMT Africa/Lusaka WAT Africa/Ndjamena LMT Africa/Ndjamena WAST Africa/Ndjamena CAT Africa/Harare LMT Africa/Harare SAST Africa/Mbabane LMT Africa/Mbabane WAT Africa/Niamey +0030 Africa/Niamey LMT Africa/Niamey GMT Africa/Niamey +0245 Africa/Kampala +0230 Africa/Kampala LMT Africa/Kampala EAT Africa/Kampala +0245 Africa/Mogadishu +0230 Africa/Mogadishu LMT Africa/Mogadishu EAT Africa/Mogadishu WAT Africa/Luanda +0030 Africa/Luanda LMT Africa/Luanda GMT Africa/Luanda +0245 Africa/Asmera +0230 Africa/Asmera LMT Africa/Asmera EAT Africa/Asmera GMT Africa/Lome LMT Africa/Lome GMT Africa/Conakry LMT Africa/Conakry CAT Africa/Maputo LMT Africa/Maputo GMT Africa/Banjul LMT Africa/Banjul +00 Africa/Casablanca +01 Africa/Casablanca LMT Africa/Casablanca LMT Africa/Cairo EEST Africa/Cairo EET Africa/Cairo CAT Africa/Lubumbashi LMT Africa/Lubumbashi GMT Africa/Abidjan LMT Africa/Abidjan WAT Africa/Bangui +0030 Africa/Bangui LMT Africa/Bangui GMT Africa/Bangui LMT Africa/Monrovia MMT Africa/Monrovia GMT Africa/Monrovia +0245 Africa/Nairobi +0230 Africa/Nairobi LMT Africa/Nairobi EAT Africa/Nairobi CEST Africa/Ceuta WEST Africa/Ceuta CET Africa/Ceuta LMT Africa/Ceuta WET Africa/Ceuta WAT Africa/Windhoek SAST Africa/Windhoek +0130 Africa/Windhoek LMT Africa/Windhoek CAT Africa/Windhoek +0245 Africa/Djibouti +0230 Africa/Djibouti LMT Africa/Djibouti EAT Africa/Djibouti CAT Africa/Khartoum LMT Africa/Khartoum CAST Africa/Khartoum EAT Africa/Khartoum SAST Africa/Johannesburg LMT Africa/Johannesburg CAT Africa/Gaborone LMT Africa/Gaborone GMT Africa/Nouakchott LMT Africa/Nouakchott CAT Africa/Bujumbura LMT Africa/Bujumbura CET Africa/Tripoli CEST Africa/Tripoli LMT Africa/Tripoli EET Africa/Tripoli GMT Africa/Timbuktu LMT Africa/Timbuktu WAT Africa/Lagos +0030 Africa/Lagos LMT Africa/Lagos GMT Africa/Lagos WAT Africa/Porto-Novo +0030 Africa/Porto-Novo LMT Africa/Porto-Novo GMT Africa/Porto-Novo PMT Africa/Algiers CET Africa/Algiers CEST Africa/Algiers WEST Africa/Algiers LMT Africa/Algiers WET Africa/Algiers CAT Africa/Blantyre LMT Africa/Blantyre CAT Africa/Kigali LMT Africa/Kigali WAT Africa/Brazzaville +0030 Africa/Brazzaville LMT Africa/Brazzaville GMT Africa/Brazzaville +0245 Africa/Dar_es_Salaam +0230 Africa/Dar_es_Salaam LMT Africa/Dar_es_Salaam EAT Africa/Dar_es_Salaam WAT Africa/Douala +0030 Africa/Douala LMT Africa/Douala GMT Africa/Douala GMT Africa/Accra LMT Africa/Accra WAT Africa/Kinshasa +0030 Africa/Kinshasa LMT Africa/Kinshasa GMT Africa/Kinshasa SAST Africa/Maseru LMT Africa/Maseru WAT Africa/Libreville +0030 Africa/Libreville LMT Africa/Libreville GMT Africa/Libreville WAT Africa/Malabo +0030 Africa/Malabo LMT Africa/Malabo GMT Africa/Malabo +0245 Africa/Asmara +0230 Africa/Asmara LMT Africa/Asmara EAT Africa/Asmara -01 Africa/Bissau LMT Africa/Bissau GMT Africa/Bissau GMT Africa/Ouagadougou LMT Africa/Ouagadougou +0245 Africa/Addis_Ababa +0230 Africa/Addis_Ababa LMT Africa/Addis_Ababa EAT Africa/Addis_Ababa GMT Africa/Bamako LMT Africa/Bamako CAT Africa/Juba LMT Africa/Juba CAST Africa/Juba EAT Africa/Juba GMT Africa/Dakar LMT Africa/Dakar GMT Africa/Freetown LMT Africa/Freetown CET Africa/Tunis CEST Africa/Tunis LMT Africa/Tunis PMT Africa/Tunis WAT Africa/Sao_Tome LMT Africa/Sao_Tome GMT Africa/Sao_Tome GMT-2 GMT-2 GMT+8 GMT+8 GMT+1 GMT+1 GMT+3 GMT+3 GMT+5 GMT+5 GMT+6 GMT+6 EST EST IDT Israel IST Israel JMT Israel LMT Israel IDDT Israel -01 Iceland +00 Iceland LMT Iceland GMT Iceland -04 Chile/Continental -03 Chile/Continental LMT Chile/Continental SMT Chile/Continental -05 Chile/Continental -07 Chile/EasterIsland -06 Chile/EasterIsland EMT Chile/EasterIsland LMT Chile/EasterIsland -05 Chile/EasterIsland CST Mexico/BajaSur PST Mexico/BajaSur MDT Mexico/BajaSur MST Mexico/BajaSur LMT Mexico/BajaSur CST Mexico/General CDT Mexico/General CWT Mexico/General MST Mexico/General LMT Mexico/General PWT Mexico/BajaNorte PPT Mexico/BajaNorte PST Mexico/BajaNorte PDT Mexico/BajaNorte MST Mexico/BajaNorte LMT Mexico/BajaNorte -01 Atlantic/Reykjavik +00 Atlantic/Reykjavik LMT Atlantic/Reykjavik GMT Atlantic/Reykjavik CET Atlantic/Jan_Mayen CEST Atlantic/Jan_Mayen LMT Atlantic/Jan_Mayen -02 Atlantic/Azores HMT Atlantic/Azores -01 Atlantic/Azores +00 Atlantic/Azores LMT Atlantic/Azores WET Atlantic/Azores BMT Atlantic/Bermuda BST Atlantic/Bermuda LMT Atlantic/Bermuda AST Atlantic/Bermuda ADT Atlantic/Bermuda WET Atlantic/Faeroe LMT Atlantic/Faeroe WEST Atlantic/Faeroe GMT Atlantic/St_Helena LMT Atlantic/St_Helena -02 Atlantic/South_Georgia LMT Atlantic/South_Georgia -01 Atlantic/Cape_Verde -02 Atlantic/Cape_Verde LMT Atlantic/Cape_Verde +01 Atlantic/Madeira FMT Atlantic/Madeira WEST Atlantic/Madeira -01 Atlantic/Madeira LMT Atlantic/Madeira +00 Atlantic/Madeira WET Atlantic/Madeira -02 Atlantic/Stanley -04 Atlantic/Stanley LMT Atlantic/Stanley SMT Atlantic/Stanley -03 Atlantic/Stanley WET Atlantic/Canary -01 Atlantic/Canary LMT Atlantic/Canary WEST Atlantic/Canary WET Atlantic/Faroe LMT Atlantic/Faroe WEST Atlantic/Faroe CST PRC CDT PRC LMT PRC +1245 NZ-CHAT +1345 NZ-CHAT +1215 NZ-CHAT LMT NZ-CHAT NZDT NZ NZMT NZ NZST NZ LMT NZ GMT-5 GMT-5 GMT-7 GMT-7 Zulu Zulu GMT0 GMT0 CPT CST6CDT CWT CST6CDT CDT CST6CDT CST CST6CDT BDST GB BST GB LMT GB GMT GB -00 root/etc/localtime GMT Etc/Greenwich +02 Etc/GMT-2 -08 Etc/GMT+8 -01 Etc/GMT+1 -03 Etc/GMT+3 -05 Etc/GMT+5 -06 Etc/GMT+6 +05 Etc/GMT-5 +07 Etc/GMT-7 UTC Etc/Zulu GMT Etc/GMT0 GMT Etc/GMT-0 UTC Etc/UCT +14 Etc/GMT-14 +12 Etc/GMT-12 -12 Etc/GMT+12 -10 Etc/GMT+10 UTC Etc/UTC +13 Etc/GMT-13 GMT Etc/GMT +09 Etc/GMT-9 +04 Etc/GMT-4 +01 Etc/GMT-1 -04 Etc/GMT+4 -07 Etc/GMT+7 UTC Etc/Universal +11 Etc/GMT-11 +08 Etc/GMT-8 GMT Etc/GMT+0 -11 Etc/GMT+11 +06 Etc/GMT-6 +03 Etc/GMT-3 +10 Etc/GMT-10 -02 Etc/GMT+2 -09 Etc/GMT+9 WET WET WEST WET CET CET CEST CET WMT Poland EET Poland CEST Poland CET Poland LMT Poland EEST Poland LMT Jamaica EDT Jamaica EST Jamaica KMT Jamaica GMT-0 GMT-0 LMT Japan JST Japan JDT Japan LMT Egypt EEST Egypt EET Egypt LMT ROK KDT ROK JST ROK KST ROK +09 Pacific/Palau LMT Pacific/Palau +14 Pacific/Tongatapu +13 Pacific/Tongatapu +1220 Pacific/Tongatapu LMT Pacific/Tongatapu +1130 Pacific/Norfolk +12 Pacific/Norfolk +1112 Pacific/Norfolk +11 Pacific/Norfolk LMT Pacific/Norfolk +1230 Pacific/Norfolk +10 Pacific/Port_Moresby LMT Pacific/Port_Moresby PMMT Pacific/Port_Moresby +12 Pacific/Fiji +13 Pacific/Fiji LMT Pacific/Fiji -09 Pacific/Gambier LMT Pacific/Gambier -06 Pacific/Galapagos -05 Pacific/Galapagos LMT Pacific/Galapagos +1245 Pacific/Chatham +1345 Pacific/Chatham +1215 Pacific/Chatham LMT Pacific/Chatham +09 Pacific/Chuuk +10 Pacific/Chuuk LMT Pacific/Chuuk SST Pacific/Samoa LMT Pacific/Samoa +09 Pacific/Guam GST Pacific/Guam GDT Pacific/Guam ChST Pacific/Guam LMT Pacific/Guam +10 Pacific/Pohnpei +09 Pacific/Pohnpei +11 Pacific/Pohnpei LMT Pacific/Pohnpei +12 Pacific/Nauru +09 Pacific/Nauru +1130 Pacific/Nauru LMT Pacific/Nauru -10 Pacific/Rarotonga -1030 Pacific/Rarotonga -0930 Pacific/Rarotonga LMT Pacific/Rarotonga +12 Pacific/Wallis LMT Pacific/Wallis NZDT Pacific/Auckland NZMT Pacific/Auckland NZST Pacific/Auckland LMT Pacific/Auckland -08 Pacific/Pitcairn LMT Pacific/Pitcairn -0830 Pacific/Pitcairn HWT Pacific/Honolulu HPT Pacific/Honolulu LMT Pacific/Honolulu HST Pacific/Honolulu HDT Pacific/Honolulu +09 Pacific/Kosrae +10 Pacific/Kosrae +12 Pacific/Kosrae LMT Pacific/Kosrae +11 Pacific/Kosrae +13 Pacific/Fakaofo -11 Pacific/Fakaofo LMT Pacific/Fakaofo -11 Pacific/Niue LMT Pacific/Niue -1120 Pacific/Niue +11 Pacific/Efate +12 Pacific/Efate LMT Pacific/Efate -10 Pacific/Apia +14 Pacific/Apia -1130 Pacific/Apia LMT Pacific/Apia +13 Pacific/Apia -11 Pacific/Apia +11 Pacific/Noumea +12 Pacific/Noumea LMT Pacific/Noumea +13 Pacific/Enderbury -11 Pacific/Enderbury -00 Pacific/Enderbury -12 Pacific/Enderbury +09 Pacific/Majuro +10 Pacific/Majuro +12 Pacific/Majuro LMT Pacific/Majuro +11 Pacific/Majuro SST Pacific/Midway LMT Pacific/Midway +09 Pacific/Yap +10 Pacific/Yap LMT Pacific/Yap -07 Pacific/Easter -06 Pacific/Easter EMT Pacific/Easter LMT Pacific/Easter -05 Pacific/Easter +11 Pacific/Guadalcanal LMT Pacific/Guadalcanal +10 Pacific/Ponape +09 Pacific/Ponape +11 Pacific/Ponape LMT Pacific/Ponape +12 Pacific/Wake LMT Pacific/Wake -10 Pacific/Tahiti LMT Pacific/Tahiti PMMT Pacific/Bougainville +10 Pacific/Bougainville +09 Pacific/Bougainville +11 Pacific/Bougainville LMT Pacific/Bougainville +14 Pacific/Kiritimati -10 Pacific/Kiritimati -1040 Pacific/Kiritimati LMT Pacific/Kiritimati +10 Pacific/Kwajalein +09 Pacific/Kwajalein +12 Pacific/Kwajalein -12 Pacific/Kwajalein LMT Pacific/Kwajalein +11 Pacific/Kwajalein +12 Pacific/Tarawa LMT Pacific/Tarawa -0930 Pacific/Marquesas LMT Pacific/Marquesas SST Pacific/Pago_Pago LMT Pacific/Pago_Pago +09 Pacific/Truk +10 Pacific/Truk LMT Pacific/Truk +13 Pacific/Kanton -11 Pacific/Kanton -00 Pacific/Kanton -12 Pacific/Kanton +12 Pacific/Funafuti LMT Pacific/Funafuti HWT Pacific/Johnston HPT Pacific/Johnston LMT Pacific/Johnston HST Pacific/Johnston HDT Pacific/Johnston +09 Pacific/Saipan GST Pacific/Saipan GDT Pacific/Saipan ChST Pacific/Saipan LMT Pacific/Saipan GMT+13 GMT+13 +09 Singapore +08 Singapore +0720 Singapore LMT Singapore SMT Singapore +0730 Singapore +07 Singapore UCT UCT GMT-14 GMT-14 GMT-12 GMT-12 HST HST +06 Asia/Dushanbe +07 Asia/Dushanbe +05 Asia/Dushanbe LMT Asia/Dushanbe +10 Asia/Vladivostok +11 Asia/Vladivostok +09 Asia/Vladivostok LMT Asia/Vladivostok LMT Asia/Pyongyang JST Asia/Pyongyang KST Asia/Pyongyang +04 Asia/Istanbul IMT Asia/Istanbul +03 Asia/Istanbul EET Asia/Istanbul LMT Asia/Istanbul EEST Asia/Istanbul +10 Asia/Ust-Nera +09 Asia/Ust-Nera +12 Asia/Ust-Nera +08 Asia/Ust-Nera LMT Asia/Ust-Nera +11 Asia/Ust-Nera LMT Asia/Beirut EEST Asia/Beirut EET Asia/Beirut +06 Asia/Urumqi LMT Asia/Urumqi +03 Asia/Famagusta LMT Asia/Famagusta EEST Asia/Famagusta EET Asia/Famagusta PMT Asia/Yekaterinburg +04 Asia/Yekaterinburg +06 Asia/Yekaterinburg +05 Asia/Yekaterinburg LMT Asia/Yekaterinburg +04 Asia/Tbilisi TBMT Asia/Tbilisi +03 Asia/Tbilisi LMT Asia/Tbilisi +05 Asia/Tbilisi +0630 Asia/Kolkata MMT Asia/Kolkata HMT Asia/Kolkata IST Asia/Kolkata LMT Asia/Kolkata +06 Asia/Omsk +07 Asia/Omsk +05 Asia/Omsk LMT Asia/Omsk IDT Asia/Jerusalem IST Asia/Jerusalem JMT Asia/Jerusalem LMT Asia/Jerusalem IDDT Asia/Jerusalem WIT Asia/Jayapura +09 Asia/Jayapura LMT Asia/Jayapura +0930 Asia/Jayapura +08 Asia/Brunei LMT Asia/Brunei +0730 Asia/Brunei +03 Asia/Bahrain +04 Asia/Bahrain LMT Asia/Bahrain +09 Asia/Makassar MMT Asia/Makassar +08 Asia/Makassar WITA Asia/Makassar LMT Asia/Makassar LMT Asia/Kathmandu +0545 Asia/Kathmandu +0530 Asia/Kathmandu CST Asia/Chungking CDT Asia/Chungking LMT Asia/Chungking CDT Asia/Taipei CST Asia/Taipei LMT Asia/Taipei JST Asia/Taipei +06 Asia/Dacca +0630 Asia/Dacca HMT Asia/Dacca +0530 Asia/Dacca LMT Asia/Dacca +07 Asia/Dacca IMT Asia/Irkutsk +09 Asia/Irkutsk +08 Asia/Irkutsk LMT Asia/Irkutsk +07 Asia/Irkutsk +07 Asia/Tomsk +08 Asia/Tomsk +06 Asia/Tomsk LMT Asia/Tomsk +09 Asia/Dili +08 Asia/Dili LMT Asia/Dili +0630 Asia/Calcutta MMT Asia/Calcutta HMT Asia/Calcutta IST Asia/Calcutta LMT Asia/Calcutta +12 Asia/Kamchatka +13 Asia/Kamchatka +11 Asia/Kamchatka LMT Asia/Kamchatka +06 Asia/Thimbu LMT Asia/Thimbu +0530 Asia/Thimbu IDT Asia/Tel_Aviv IST Asia/Tel_Aviv JMT Asia/Tel_Aviv LMT Asia/Tel_Aviv IDDT Asia/Tel_Aviv +05 Asia/Ashgabat +06 Asia/Ashgabat +04 Asia/Ashgabat LMT Asia/Ashgabat +04 Asia/Kabul LMT Asia/Kabul +0430 Asia/Kabul +03 Asia/Kuwait LMT Asia/Kuwait +06 Asia/Aqtobe +05 Asia/Aqtobe +04 Asia/Aqtobe LMT Asia/Aqtobe +09 Asia/Rangoon LMT Asia/Rangoon RMT Asia/Rangoon +0630 Asia/Rangoon +03 Asia/Qatar +04 Asia/Qatar LMT Asia/Qatar +05 Asia/Ashkhabad +06 Asia/Ashkhabad +04 Asia/Ashkhabad LMT Asia/Ashkhabad +09 Asia/Saigon PLMT Asia/Saigon +08 Asia/Saigon LMT Asia/Saigon +07 Asia/Saigon +06 Asia/Qyzylorda +05 Asia/Qyzylorda +04 Asia/Qyzylorda LMT Asia/Qyzylorda +04 Asia/Dubai LMT Asia/Dubai +0430 Asia/Tehran +04 Asia/Tehran TMT Asia/Tehran +0330 Asia/Tehran LMT Asia/Tehran +05 Asia/Tehran +07 Asia/Hovd +08 Asia/Hovd +06 Asia/Hovd LMT Asia/Hovd LMT Asia/Seoul KDT Asia/Seoul JST Asia/Seoul KST Asia/Seoul +09 Asia/Chita +10 Asia/Chita +08 Asia/Chita LMT Asia/Chita +09 Asia/Jakarta BMT Asia/Jakarta +08 Asia/Jakarta +0720 Asia/Jakarta WIB Asia/Jakarta LMT Asia/Jakarta +0730 Asia/Jakarta +09 Asia/Yangon LMT Asia/Yangon RMT Asia/Yangon +0630 Asia/Yangon +04 Asia/Muscat LMT Asia/Muscat +09 Asia/Ho_Chi_Minh PLMT Asia/Ho_Chi_Minh +08 Asia/Ho_Chi_Minh LMT Asia/Ho_Chi_Minh +07 Asia/Ho_Chi_Minh LMT Asia/Tokyo JST Asia/Tokyo JDT Asia/Tokyo CST Asia/Chongqing CDT Asia/Chongqing LMT Asia/Chongqing +03 Asia/Riyadh LMT Asia/Riyadh LMT Asia/Nicosia EEST Asia/Nicosia EET Asia/Nicosia +09 Asia/Singapore +08 Asia/Singapore +0720 Asia/Singapore LMT Asia/Singapore SMT Asia/Singapore +0730 Asia/Singapore +07 Asia/Singapore +07 Asia/Krasnoyarsk +08 Asia/Krasnoyarsk +06 Asia/Krasnoyarsk LMT Asia/Krasnoyarsk JST Asia/Hong_Kong HKST Asia/Hong_Kong HKT Asia/Hong_Kong LMT Asia/Hong_Kong HKWT Asia/Hong_Kong PKT Asia/Karachi PKST Asia/Karachi +0630 Asia/Karachi +0530 Asia/Karachi LMT Asia/Karachi +05 Asia/Karachi PST Asia/Manila LMT Asia/Manila PDT Asia/Manila JST Asia/Manila +07 Asia/Bangkok BMT Asia/Bangkok LMT Asia/Bangkok +04 Asia/Atyrau +06 Asia/Atyrau +03 Asia/Atyrau LMT Asia/Atyrau +05 Asia/Atyrau +04 Asia/Yerevan +05 Asia/Yerevan +03 Asia/Yerevan LMT Asia/Yerevan +07 Asia/Vientiane BMT Asia/Vientiane LMT Asia/Vientiane CDT Asia/Macau CST Asia/Macau +10 Asia/Macau +09 Asia/Macau LMT Asia/Macau +06 Asia/Thimphu LMT Asia/Thimphu +0530 Asia/Thimphu CST Asia/Shanghai CDT Asia/Shanghai LMT Asia/Shanghai LMT Asia/Damascus EEST Asia/Damascus EET Asia/Damascus +10 Asia/Sakhalin +09 Asia/Sakhalin +12 Asia/Sakhalin LMT Asia/Sakhalin +11 Asia/Sakhalin +09 Asia/Ujung_Pandang MMT Asia/Ujung_Pandang +08 Asia/Ujung_Pandang WITA Asia/Ujung_Pandang LMT Asia/Ujung_Pandang +06 Asia/Almaty +07 Asia/Almaty +05 Asia/Almaty LMT Asia/Almaty +04 Asia/Baghdad +03 Asia/Baghdad BMT Asia/Baghdad LMT Asia/Baghdad +06 Asia/Samarkand +05 Asia/Samarkand +04 Asia/Samarkand LMT Asia/Samarkand +06 Asia/Kashgar LMT Asia/Kashgar IST Asia/Gaza EET Asia/Gaza IDT Asia/Gaza LMT Asia/Gaza EEST Asia/Gaza +09 Asia/Yakutsk +10 Asia/Yakutsk +08 Asia/Yakutsk LMT Asia/Yakutsk +07 Asia/Phnom_Penh BMT Asia/Phnom_Penh LMT Asia/Phnom_Penh +0630 Asia/Colombo MMT Asia/Colombo +06 Asia/Colombo +0530 Asia/Colombo LMT Asia/Colombo +06 Asia/Aqtau +05 Asia/Aqtau +04 Asia/Aqtau LMT Asia/Aqtau IST Asia/Hebron EET Asia/Hebron IDT Asia/Hebron LMT Asia/Hebron EEST Asia/Hebron +06 Asia/Dhaka +0630 Asia/Dhaka HMT Asia/Dhaka +0530 Asia/Dhaka LMT Asia/Dhaka +07 Asia/Dhaka PMT Asia/Pontianak +09 Asia/Pontianak +08 Asia/Pontianak WIB Asia/Pontianak WITA Asia/Pontianak LMT Asia/Pontianak +0730 Asia/Pontianak +07 Asia/Novosibirsk +08 Asia/Novosibirsk +06 Asia/Novosibirsk LMT Asia/Novosibirsk CST Asia/Harbin CDT Asia/Harbin LMT Asia/Harbin +12 Asia/Anadyr +14 Asia/Anadyr +11 Asia/Anadyr LMT Asia/Anadyr +13 Asia/Anadyr +04 Asia/Oral +06 Asia/Oral +03 Asia/Oral LMT Asia/Oral +05 Asia/Oral +11 Asia/Srednekolymsk +12 Asia/Srednekolymsk +10 Asia/Srednekolymsk LMT Asia/Srednekolymsk +10 Asia/Khandyga +09 Asia/Khandyga +08 Asia/Khandyga +11 Asia/Khandyga LMT Asia/Khandyga +09 Asia/Kuching +0820 Asia/Kuching +08 Asia/Kuching LMT Asia/Kuching +0730 Asia/Kuching +10 Asia/Choibalsan +09 Asia/Choibalsan +08 Asia/Choibalsan LMT Asia/Choibalsan +07 Asia/Choibalsan +06 Asia/Tashkent +07 Asia/Tashkent +05 Asia/Tashkent LMT Asia/Tashkent +08 Asia/Ulan_Bator +09 Asia/Ulan_Bator +07 Asia/Ulan_Bator LMT Asia/Ulan_Bator +06 Asia/Bishkek +07 Asia/Bishkek +05 Asia/Bishkek LMT Asia/Bishkek CDT Asia/Macao CST Asia/Macao +10 Asia/Macao +09 Asia/Macao LMT Asia/Macao +03 Asia/Aden LMT Asia/Aden +06 Asia/Qostanay +05 Asia/Qostanay +04 Asia/Qostanay LMT Asia/Qostanay +07 Asia/Barnaul +08 Asia/Barnaul +06 Asia/Barnaul LMT Asia/Barnaul +04 Asia/Baku +05 Asia/Baku +03 Asia/Baku LMT Asia/Baku LMT Asia/Katmandu +0545 Asia/Katmandu +0530 Asia/Katmandu LMT Asia/Amman EEST Asia/Amman EET Asia/Amman +11 Asia/Magadan +12 Asia/Magadan +10 Asia/Magadan LMT Asia/Magadan +09 Asia/Kuala_Lumpur +08 Asia/Kuala_Lumpur +0720 Asia/Kuala_Lumpur LMT Asia/Kuala_Lumpur SMT Asia/Kuala_Lumpur +0730 Asia/Kuala_Lumpur +07 Asia/Kuala_Lumpur +08 Asia/Ulaanbaatar +09 Asia/Ulaanbaatar +07 Asia/Ulaanbaatar LMT Asia/Ulaanbaatar +07 Asia/Novokuznetsk +08 Asia/Novokuznetsk +06 Asia/Novokuznetsk LMT Asia/Novokuznetsk GMT+12 GMT+12 MST MST GMT+10 GMT+10 CET Libya CEST Libya LMT Libya EET Libya UTC UTC GMT-13 GMT-13 JST Hongkong HKST Hongkong HKT Hongkong LMT Hongkong HKWT Hongkong +06 Indian/Chagos +05 Indian/Chagos LMT Indian/Chagos +07 Indian/Christmas LMT Indian/Christmas +05 Indian/Maldives LMT Indian/Maldives MMT Indian/Maldives +05 Indian/Kerguelen -00 Indian/Kerguelen +04 Indian/Mahe LMT Indian/Mahe +04 Indian/Mauritius +05 Indian/Mauritius LMT Indian/Mauritius +04 Indian/Reunion LMT Indian/Reunion +0245 Indian/Mayotte +0230 Indian/Mayotte LMT Indian/Mayotte EAT Indian/Mayotte +0245 Indian/Comoro +0230 Indian/Comoro LMT Indian/Comoro EAT Indian/Comoro +0245 Indian/Antananarivo +0230 Indian/Antananarivo LMT Indian/Antananarivo EAT Indian/Antananarivo +0630 Indian/Cocos LMT Indian/Cocos MWT Canada/Mountain MPT Canada/Mountain MDT Canada/Mountain LMT Canada/Mountain MST Canada/Mountain AWT Canada/Atlantic APT Canada/Atlantic LMT Canada/Atlantic ADT Canada/Atlantic AST Canada/Atlantic YDDT Canada/Yukon MST Canada/Yukon PDT Canada/Yukon LMT Canada/Yukon PST Canada/Yukon YST Canada/Yukon YDT Canada/Yukon YPT Canada/Yukon YWT Canada/Yukon EDT Canada/Eastern EST Canada/Eastern EWT Canada/Eastern LMT Canada/Eastern EPT Canada/Eastern PWT Canada/Pacific PPT Canada/Pacific PDT Canada/Pacific PST Canada/Pacific LMT Canada/Pacific NDDT Canada/Newfoundland NPT Canada/Newfoundland NDT Canada/Newfoundland NST Canada/Newfoundland LMT Canada/Newfoundland NWT Canada/Newfoundland CDT Canada/Central CST Canada/Central LMT Canada/Central CWT Canada/Central CPT Canada/Central CST Canada/Saskatchewan MWT Canada/Saskatchewan MPT Canada/Saskatchewan MDT Canada/Saskatchewan LMT Canada/Saskatchewan MST Canada/Saskatchewan EET W-SU EEST W-SU MST W-SU LMT W-SU MMT W-SU MSK W-SU +05 W-SU MDST W-SU MSD W-SU CDT ROC CST ROC LMT ROC JST ROC +04 Turkey IMT Turkey +03 Turkey EET Turkey LMT Turkey EEST Turkey GMT GMT EET EET EEST EET MET MET MEST MET MPT MST7MDT MWT MST7MDT MDT MST7MDT MST MST7MDT GMT-9 GMT-9 GMT-4 GMT-4 +0430 Iran +04 Iran TMT Iran +0330 Iran LMT Iran +05 Iran GMT-1 GMT-1 CET Arctic/Longyearbyen CEST Arctic/Longyearbyen LMT Arctic/Longyearbyen GMT+4 GMT+4 +10 Kwajalein +09 Kwajalein +12 Kwajalein -12 Kwajalein LMT Kwajalein +11 Kwajalein GMT+7 GMT+7 AEST Australia/Hobart AEDT Australia/Hobart LMT Australia/Hobart AEST Australia/Melbourne AEDT Australia/Melbourne LMT Australia/Melbourne AEST Australia/NSW AEDT Australia/NSW LMT Australia/NSW +1130 Australia/Lord_Howe AEST Australia/Lord_Howe +1030 Australia/Lord_Howe +11 Australia/Lord_Howe LMT Australia/Lord_Howe AEST Australia/Currie AEDT Australia/Currie LMT Australia/Currie ACDT Australia/Adelaide ACST Australia/Adelaide LMT Australia/Adelaide LMT Australia/Eucla +0845 Australia/Eucla +0945 Australia/Eucla AEST Australia/Queensland AEDT Australia/Queensland LMT Australia/Queensland AEST Australia/Sydney AEDT Australia/Sydney LMT Australia/Sydney ACDT Australia/Yancowinna ACST Australia/Yancowinna AEST Australia/Yancowinna LMT Australia/Yancowinna AEST Australia/ACT AEDT Australia/ACT LMT Australia/ACT ACDT Australia/North ACST Australia/North LMT Australia/North AEST Australia/Lindeman AEDT Australia/Lindeman LMT Australia/Lindeman AWST Australia/West AWDT Australia/West LMT Australia/West ACDT Australia/Broken_Hill ACST Australia/Broken_Hill AEST Australia/Broken_Hill LMT Australia/Broken_Hill ACDT Australia/South ACST Australia/South LMT Australia/South AEST Australia/Brisbane AEDT Australia/Brisbane LMT Australia/Brisbane AWST Australia/Perth AWDT Australia/Perth LMT Australia/Perth AEST Australia/Victoria AEDT Australia/Victoria LMT Australia/Victoria ACDT Australia/Darwin ACST Australia/Darwin LMT Australia/Darwin AEST Australia/Canberra AEDT Australia/Canberra LMT Australia/Canberra +1130 Australia/LHI AEST Australia/LHI +1030 Australia/LHI +11 Australia/LHI LMT Australia/LHI AEST Australia/Tasmania AEDT Australia/Tasmania LMT Australia/Tasmania Universal Universal GMT-11 GMT-11 GMT-8 GMT-8 GMT+0 GMT+0 GMT+11 GMT+11 GMT-6 GMT-6 GMT+14 GMT+14 EPT EST5EDT EWT EST5EDT EDT EST5EDT EST EST5EDT GMT-3 GMT-3 -05 Brazil/Acre -04 Brazil/Acre LMT Brazil/Acre -02 Brazil/DeNoronha -01 Brazil/DeNoronha LMT Brazil/DeNoronha -03 Brazil/East -02 Brazil/East LMT Brazil/East -04 Brazil/West -03 Brazil/West LMT Brazil/West GMT-10 GMT-10 BDST GB-Eire BST GB-Eire LMT GB-Eire GMT GB-Eire GMT+2 GMT+2 MWT Navajo MPT Navajo MDT Navajo LMT Navajo MST Navajo WEMT Portugal CEST Portugal CET Portugal WEST Portugal LMT Portugal WET Portugal EST America/Menominee CDT America/Menominee CST America/Menominee LMT America/Menominee CWT America/Menominee CPT America/Menominee MWT America/Phoenix MST America/Phoenix LMT America/Phoenix MDT America/Phoenix -04 America/Manaus -03 America/Manaus LMT America/Manaus AST America/Anchorage APT America/Anchorage AWT America/Anchorage LMT America/Anchorage AKST America/Anchorage AKDT America/Anchorage AHST America/Anchorage AHDT America/Anchorage YST America/Anchorage AWT America/St_Barthelemy APT America/St_Barthelemy AST America/St_Barthelemy LMT America/St_Barthelemy NDDT America/St_Johns NPT America/St_Johns NDT America/St_Johns NST America/St_Johns LMT America/St_Johns NWT America/St_Johns CST America/El_Salvador CDT America/El_Salvador LMT America/El_Salvador -05 America/Guayaquil -04 America/Guayaquil LMT America/Guayaquil QMT America/Guayaquil -02 America/Argentina/ComodRivadavia -04 America/Argentina/ComodRivadavia LMT America/Argentina/ComodRivadavia CMT America/Argentina/ComodRivadavia -03 America/Argentina/ComodRivadavia -02 America/Argentina/Ushuaia -04 America/Argentina/Ushuaia LMT America/Argentina/Ushuaia CMT America/Argentina/Ushuaia -03 America/Argentina/Ushuaia -02 America/Argentina/La_Rioja -04 America/Argentina/La_Rioja LMT America/Argentina/La_Rioja CMT America/Argentina/La_Rioja -03 America/Argentina/La_Rioja -02 America/Argentina/Catamarca -04 America/Argentina/Catamarca LMT America/Argentina/Catamarca CMT America/Argentina/Catamarca -03 America/Argentina/Catamarca -02 America/Argentina/Cordoba -04 America/Argentina/Cordoba LMT America/Argentina/Cordoba CMT America/Argentina/Cordoba -03 America/Argentina/Cordoba -02 America/Argentina/Buenos_Aires -04 America/Argentina/Buenos_Aires LMT America/Argentina/Buenos_Aires CMT America/Argentina/Buenos_Aires -03 America/Argentina/Buenos_Aires -02 America/Argentina/San_Luis -04 America/Argentina/San_Luis LMT America/Argentina/San_Luis CMT America/Argentina/San_Luis -03 America/Argentina/San_Luis -02 America/Argentina/Salta -04 America/Argentina/Salta LMT America/Argentina/Salta CMT America/Argentina/Salta -03 America/Argentina/Salta -02 America/Argentina/San_Juan -04 America/Argentina/San_Juan LMT America/Argentina/San_Juan CMT America/Argentina/San_Juan -03 America/Argentina/San_Juan -02 America/Argentina/Tucuman -04 America/Argentina/Tucuman LMT America/Argentina/Tucuman CMT America/Argentina/Tucuman -03 America/Argentina/Tucuman -02 America/Argentina/Mendoza -04 America/Argentina/Mendoza LMT America/Argentina/Mendoza CMT America/Argentina/Mendoza -03 America/Argentina/Mendoza -02 America/Argentina/Jujuy -04 America/Argentina/Jujuy LMT America/Argentina/Jujuy CMT America/Argentina/Jujuy -03 America/Argentina/Jujuy -02 America/Argentina/Rio_Gallegos -04 America/Argentina/Rio_Gallegos LMT America/Argentina/Rio_Gallegos CMT America/Argentina/Rio_Gallegos -03 America/Argentina/Rio_Gallegos EST America/Rankin_Inlet CST America/Rankin_Inlet CDT America/Rankin_Inlet CDDT America/Rankin_Inlet -00 America/Rankin_Inlet MWT America/Shiprock MPT America/Shiprock MDT America/Shiprock LMT America/Shiprock MST America/Shiprock EST America/Knox_IN CDT America/Knox_IN CST America/Knox_IN LMT America/Knox_IN CWT America/Knox_IN CPT America/Knox_IN AST America/Thule ADT America/Thule LMT America/Thule PWT America/Metlakatla PPT America/Metlakatla PDT America/Metlakatla PST America/Metlakatla AKDT America/Metlakatla AKST America/Metlakatla LMT America/Metlakatla EDT America/Nipigon EST America/Nipigon EWT America/Nipigon LMT America/Nipigon EPT America/Nipigon LMT America/Juneau PST America/Juneau PDT America/Juneau PPT America/Juneau PWT America/Juneau AKST America/Juneau AKDT America/Juneau YDT America/Juneau YST America/Juneau CDT America/Cancun EDT America/Cancun EST America/Cancun CST America/Cancun LMT America/Cancun -05 America/Lima -04 America/Lima LMT America/Lima -04 America/Punta_Arenas -03 America/Punta_Arenas LMT America/Punta_Arenas SMT America/Punta_Arenas -05 America/Punta_Arenas -02 America/Danmarkshavn -03 America/Danmarkshavn LMT America/Danmarkshavn GMT America/Danmarkshavn -02 America/Noronha -01 America/Noronha LMT America/Noronha ADT America/Martinique AST America/Martinique LMT America/Martinique FFMT America/Martinique -03 America/Asuncion -04 America/Asuncion AMT America/Asuncion LMT America/Asuncion EDT America/Indiana/Petersburg EST America/Indiana/Petersburg CDT America/Indiana/Petersburg CST America/Indiana/Petersburg LMT America/Indiana/Petersburg CWT America/Indiana/Petersburg CPT America/Indiana/Petersburg EST America/Indiana/Knox CDT America/Indiana/Knox CST America/Indiana/Knox LMT America/Indiana/Knox CWT America/Indiana/Knox CPT America/Indiana/Knox EDT America/Indiana/Tell_City EST America/Indiana/Tell_City CDT America/Indiana/Tell_City CST America/Indiana/Tell_City LMT America/Indiana/Tell_City CWT America/Indiana/Tell_City CPT America/Indiana/Tell_City EDT America/Indiana/Marengo EST America/Indiana/Marengo CDT America/Indiana/Marengo CST America/Indiana/Marengo LMT America/Indiana/Marengo CWT America/Indiana/Marengo CPT America/Indiana/Marengo EDT America/Indiana/Vincennes EST America/Indiana/Vincennes CDT America/Indiana/Vincennes CST America/Indiana/Vincennes LMT America/Indiana/Vincennes CWT America/Indiana/Vincennes CPT America/Indiana/Vincennes EDT America/Indiana/Indianapolis EST America/Indiana/Indianapolis CDT America/Indiana/Indianapolis CST America/Indiana/Indianapolis LMT America/Indiana/Indianapolis CWT America/Indiana/Indianapolis CPT America/Indiana/Indianapolis EDT America/Indiana/Winamac EST America/Indiana/Winamac CDT America/Indiana/Winamac CST America/Indiana/Winamac LMT America/Indiana/Winamac CWT America/Indiana/Winamac CPT America/Indiana/Winamac EDT America/Indiana/Vevay EST America/Indiana/Vevay CDT America/Indiana/Vevay CST America/Indiana/Vevay LMT America/Indiana/Vevay CWT America/Indiana/Vevay CPT America/Indiana/Vevay -04 America/Santiago -03 America/Santiago LMT America/Santiago SMT America/Santiago -05 America/Santiago AWT America/Kralendijk APT America/Kralendijk AST America/Kralendijk LMT America/Kralendijk LMT America/Sitka PST America/Sitka PDT America/Sitka PPT America/Sitka PWT America/Sitka AKST America/Sitka AKDT America/Sitka YST America/Sitka YDT America/Sitka CST America/Chihuahua CDT America/Chihuahua MDT America/Chihuahua MST America/Chihuahua LMT America/Chihuahua CDT America/Iqaluit CST America/Iqaluit EPT America/Iqaluit EWT America/Iqaluit EST America/Iqaluit EDT America/Iqaluit -00 America/Iqaluit EDDT America/Iqaluit CST America/North_Dakota/New_Salem CDT America/North_Dakota/New_Salem MWT America/North_Dakota/New_Salem MPT America/North_Dakota/New_Salem MDT America/North_Dakota/New_Salem LMT America/North_Dakota/New_Salem MST America/North_Dakota/New_Salem CST America/North_Dakota/Center CDT America/North_Dakota/Center MWT America/North_Dakota/Center MPT America/North_Dakota/Center MDT America/North_Dakota/Center LMT America/North_Dakota/Center MST America/North_Dakota/Center CST America/North_Dakota/Beulah CDT America/North_Dakota/Beulah MWT America/North_Dakota/Beulah MPT America/North_Dakota/Beulah MDT America/North_Dakota/Beulah LMT America/North_Dakota/Beulah MST America/North_Dakota/Beulah -05 America/Eirunepe -04 America/Eirunepe LMT America/Eirunepe PWT America/Vancouver PPT America/Vancouver PDT America/Vancouver PST America/Vancouver LMT America/Vancouver CDT America/Rainy_River CST America/Rainy_River LMT America/Rainy_River CWT America/Rainy_River CPT America/Rainy_River PWT America/Fort_Nelson PPT America/Fort_Nelson PDT America/Fort_Nelson PST America/Fort_Nelson MST America/Fort_Nelson LMT America/Fort_Nelson -02 America/Catamarca -04 America/Catamarca LMT America/Catamarca CMT America/Catamarca -03 America/Catamarca PWT America/Los_Angeles PPT America/Los_Angeles PDT America/Los_Angeles PST America/Los_Angeles LMT America/Los_Angeles AWT America/Halifax APT America/Halifax LMT America/Halifax ADT America/Halifax AST America/Halifax LMT America/Port-au-Prince EST America/Port-au-Prince EDT America/Port-au-Prince PPMT America/Port-au-Prince ADT America/Goose_Bay AST America/Goose_Bay ADDT America/Goose_Bay NWT America/Goose_Bay LMT America/Goose_Bay NDT America/Goose_Bay NST America/Goose_Bay NPT America/Goose_Bay -03 America/Guyana -04 America/Guyana LMT America/Guyana -0345 America/Guyana CST America/Havana CDT America/Havana LMT America/Havana HMT America/Havana LMT America/Jamaica EDT America/Jamaica EST America/Jamaica KMT America/Jamaica AWT America/Port_of_Spain APT America/Port_of_Spain AST America/Port_of_Spain LMT America/Port_of_Spain EST America/Moncton AWT America/Moncton APT America/Moncton LMT America/Moncton ADT America/Moncton AST America/Moncton AWT America/Puerto_Rico APT America/Puerto_Rico AST America/Puerto_Rico LMT America/Puerto_Rico AWT America/St_Lucia APT America/St_Lucia AST America/St_Lucia LMT America/St_Lucia MWT America/Denver MPT America/Denver MDT America/Denver LMT America/Denver MST America/Denver -02 America/Cordoba -04 America/Cordoba LMT America/Cordoba CMT America/Cordoba -03 America/Cordoba -04 America/Cuiaba -03 America/Cuiaba LMT America/Cuiaba -02 America/Buenos_Aires -04 America/Buenos_Aires LMT America/Buenos_Aires CMT America/Buenos_Aires -03 America/Buenos_Aires AWT America/Marigot APT America/Marigot AST America/Marigot LMT America/Marigot CDT America/Ciudad_Juarez CST America/Ciudad_Juarez MST America/Ciudad_Juarez LMT America/Ciudad_Juarez MDT America/Ciudad_Juarez CST America/Swift_Current MWT America/Swift_Current MPT America/Swift_Current MDT America/Swift_Current LMT America/Swift_Current MST America/Swift_Current AWT America/Aruba APT America/Aruba AST America/Aruba LMT America/Aruba -04 America/Caracas CMT America/Caracas LMT America/Caracas -0430 America/Caracas -04 America/Boa_Vista -03 America/Boa_Vista LMT America/Boa_Vista -05 America/Porto_Acre -04 America/Porto_Acre LMT America/Porto_Acre AWT America/Virgin APT America/Virgin AST America/Virgin LMT America/Virgin AWT America/St_Thomas APT America/St_Thomas AST America/St_Thomas LMT America/St_Thomas CDT America/Winnipeg CST America/Winnipeg LMT America/Winnipeg CWT America/Winnipeg CPT America/Winnipeg CST America/Mexico_City CDT America/Mexico_City CWT America/Mexico_City MST America/Mexico_City LMT America/Mexico_City BST America/Adak BDT America/Adak HST America/Adak HDT America/Adak NWT America/Adak LMT America/Adak NST America/Adak NPT America/Adak AHST America/Adak PWT America/Dawson_Creek PPT America/Dawson_Creek PDT America/Dawson_Creek PST America/Dawson_Creek MST America/Dawson_Creek LMT America/Dawson_Creek CST America/Guatemala CDT America/Guatemala LMT America/Guatemala AWT America/Glace_Bay APT America/Glace_Bay LMT America/Glace_Bay ADT America/Glace_Bay AST America/Glace_Bay CDT America/Merida CST America/Merida LMT America/Merida EST America/Merida EDT America/Fort_Wayne EST America/Fort_Wayne CDT America/Fort_Wayne CST America/Fort_Wayne LMT America/Fort_Wayne CWT America/Fort_Wayne CPT America/Fort_Wayne AWT America/Guadeloupe APT America/Guadeloupe AST America/Guadeloupe LMT America/Guadeloupe YDDT America/Dawson MST America/Dawson PDT America/Dawson LMT America/Dawson PST America/Dawson YST America/Dawson YDT America/Dawson YPT America/Dawson YWT America/Dawson -04 America/Montevideo -03 America/Montevideo LMT America/Montevideo MMT America/Montevideo -0130 America/Montevideo -0230 America/Montevideo -0330 America/Montevideo -02 America/Montevideo -03 America/Sao_Paulo -02 America/Sao_Paulo LMT America/Sao_Paulo AWT America/Grenada APT America/Grenada AST America/Grenada LMT America/Grenada PWT America/Ensenada PPT America/Ensenada PST America/Ensenada PDT America/Ensenada MST America/Ensenada LMT America/Ensenada EDT America/Santo_Domingo EST America/Santo_Domingo LMT America/Santo_Domingo AST America/Santo_Domingo -0430 America/Santo_Domingo SDMT America/Santo_Domingo -02 America/Miquelon -03 America/Miquelon AST America/Miquelon LMT America/Miquelon -03 America/Bahia -02 America/Bahia LMT America/Bahia -02 America/Nuuk -03 America/Nuuk LMT America/Nuuk -02 America/Mendoza -04 America/Mendoza LMT America/Mendoza CMT America/Mendoza -03 America/Mendoza -02 America/Jujuy -04 America/Jujuy LMT America/Jujuy CMT America/Jujuy -03 America/Jujuy MWT America/Yellowknife MDDT America/Yellowknife MPT America/Yellowknife MDT America/Yellowknife MST America/Yellowknife -00 America/Yellowknife PWT America/Santa_Isabel PPT America/Santa_Isabel PST America/Santa_Isabel PDT America/Santa_Isabel MST America/Santa_Isabel LMT America/Santa_Isabel BST America/Nome BDT America/Nome NWT America/Nome LMT America/Nome NST America/Nome NPT America/Nome AKST America/Nome AKDT America/Nome YST America/Nome AWT America/Anguilla APT America/Anguilla AST America/Anguilla LMT America/Anguilla -02 America/Rosario -04 America/Rosario LMT America/Rosario CMT America/Rosario -03 America/Rosario EDT America/Thunder_Bay EST America/Thunder_Bay CST America/Thunder_Bay EWT America/Thunder_Bay LMT America/Thunder_Bay EPT America/Thunder_Bay CMT America/Atikokan LMT America/Atikokan EST America/Atikokan CDT America/Bahia_Banderas CST America/Bahia_Banderas PST America/Bahia_Banderas MDT America/Bahia_Banderas MST America/Bahia_Banderas LMT America/Bahia_Banderas EDT America/Montreal EST America/Montreal EWT America/Montreal LMT America/Montreal EPT America/Montreal +00 America/Scoresbysund -01 America/Scoresbysund -02 America/Scoresbysund LMT America/Scoresbysund -03 America/Cayenne -04 America/Cayenne LMT America/Cayenne EDT America/Toronto EST America/Toronto EWT America/Toronto LMT America/Toronto EPT America/Toronto AWT America/Curacao APT America/Curacao AST America/Curacao LMT America/Curacao CMT America/Panama LMT America/Panama EST America/Panama CDT America/Matamoros CST America/Matamoros LMT America/Matamoros -04 America/Campo_Grande -03 America/Campo_Grande LMT America/Campo_Grande CDT America/Belize CST America/Belize -0530 America/Belize LMT America/Belize CWT America/Belize CPT America/Belize CST America/Costa_Rica CDT America/Costa_Rica SJMT America/Costa_Rica LMT America/Costa_Rica -05 America/Rio_Branco -04 America/Rio_Branco LMT America/Rio_Branco AWT America/Lower_Princes APT America/Lower_Princes AST America/Lower_Princes LMT America/Lower_Princes EST America/Grand_Turk EDT America/Grand_Turk KMT America/Grand_Turk LMT America/Grand_Turk AST America/Grand_Turk CDT America/Managua EST America/Managua CST America/Managua MMT America/Managua LMT America/Managua -04 America/Santarem -03 America/Santarem LMT America/Santarem CDT America/Pangnirtung CST America/Pangnirtung AST America/Pangnirtung ADT America/Pangnirtung APT America/Pangnirtung AWT America/Pangnirtung EST America/Pangnirtung EDT America/Pangnirtung -00 America/Pangnirtung ADDT America/Pangnirtung -03 America/Recife -02 America/Recife LMT America/Recife EDT America/Indianapolis EST America/Indianapolis CDT America/Indianapolis CST America/Indianapolis LMT America/Indianapolis CWT America/Indianapolis CPT America/Indianapolis EST America/Chicago CDT America/Chicago CST America/Chicago CWT America/Chicago LMT America/Chicago CPT America/Chicago -03 America/Belem -02 America/Belem LMT America/Belem CST America/Regina MWT America/Regina MPT America/Regina MDT America/Regina LMT America/Regina MST America/Regina -05 America/Bogota -04 America/Bogota BMT America/Bogota LMT America/Bogota CDT America/Monterrey CST America/Monterrey LMT America/Monterrey -02 America/Godthab -03 America/Godthab LMT America/Godthab PWT America/Tijuana PPT America/Tijuana PST America/Tijuana PDT America/Tijuana MST America/Tijuana LMT America/Tijuana -03 America/Fortaleza -02 America/Fortaleza LMT America/Fortaleza -03 America/Paramaribo LMT America/Paramaribo PMT America/Paramaribo -0330 America/Paramaribo CST America/Mazatlan PST America/Mazatlan MDT America/Mazatlan MST America/Mazatlan LMT America/Mazatlan BST America/Atka BDT America/Atka HST America/Atka HDT America/Atka NWT America/Atka LMT America/Atka NST America/Atka NPT America/Atka AHST America/Atka EDT America/Louisville EST America/Louisville CDT America/Louisville CST America/Louisville LMT America/Louisville CWT America/Louisville CPT America/Louisville YDDT America/Whitehorse MST America/Whitehorse PDT America/Whitehorse LMT America/Whitehorse PST America/Whitehorse YST America/Whitehorse YDT America/Whitehorse YPT America/Whitehorse YWT America/Whitehorse -03 America/Maceio -02 America/Maceio LMT America/Maceio AWT America/Antigua APT America/Antigua AST America/Antigua LMT America/Antigua MWT America/Creston MST America/Creston LMT America/Creston MDT America/Creston EDT America/Kentucky/Louisville EST America/Kentucky/Louisville CDT America/Kentucky/Louisville CST America/Kentucky/Louisville LMT America/Kentucky/Louisville CWT America/Kentucky/Louisville CPT America/Kentucky/Louisville EST America/Kentucky/Monticello EDT America/Kentucky/Monticello CDT America/Kentucky/Monticello CST America/Kentucky/Monticello LMT America/Kentucky/Monticello CWT America/Kentucky/Monticello CPT America/Kentucky/Monticello CST America/Cambridge_Bay CDT America/Cambridge_Bay EST America/Cambridge_Bay -00 America/Cambridge_Bay MST America/Cambridge_Bay MDT America/Cambridge_Bay MPT America/Cambridge_Bay MWT America/Cambridge_Bay MDDT America/Cambridge_Bay AWT America/Tortola APT America/Tortola AST America/Tortola LMT America/Tortola CST America/Ojinaga CDT America/Ojinaga MDT America/Ojinaga MST America/Ojinaga LMT America/Ojinaga EST America/Resolute CST America/Resolute CDT America/Resolute CDDT America/Resolute -00 America/Resolute AWT America/St_Vincent APT America/St_Vincent AST America/St_Vincent LMT America/St_Vincent EDT America/Nassau EST America/Nassau EWT America/Nassau LMT America/Nassau EPT America/Nassau EDT America/New_York EST America/New_York EWT America/New_York LMT America/New_York EPT America/New_York -04 America/Porto_Velho -03 America/Porto_Velho LMT America/Porto_Velho MWT America/Boise MPT America/Boise PDT America/Boise PST America/Boise MDT America/Boise MST America/Boise LMT America/Boise -03 America/Araguaina -02 America/Araguaina LMT America/Araguaina PDDT America/Inuvik PST America/Inuvik MDT America/Inuvik MST America/Inuvik -00 America/Inuvik AWT America/St_Kitts APT America/St_Kitts AST America/St_Kitts LMT America/St_Kitts MWT America/Edmonton MPT America/Edmonton MDT America/Edmonton LMT America/Edmonton MST America/Edmonton AST America/Barbados ADT America/Barbados LMT America/Barbados -0330 America/Barbados CST America/Hermosillo PST America/Hermosillo MDT America/Hermosillo MST America/Hermosillo LMT America/Hermosillo AWT America/Montserrat APT America/Montserrat AST America/Montserrat LMT America/Montserrat CMT America/Coral_Harbour LMT America/Coral_Harbour EST America/Coral_Harbour -04 America/La_Paz BST America/La_Paz CMT America/La_Paz LMT America/La_Paz YWT America/Yakutat YPT America/Yakutat AKST America/Yakutat AKDT America/Yakutat YDT America/Yakutat LMT America/Yakutat YST America/Yakutat CMT America/Cayman LMT America/Cayman EST America/Cayman CST America/Tegucigalpa CDT America/Tegucigalpa LMT America/Tegucigalpa EDT America/Detroit EST America/Detroit CST America/Detroit EWT America/Detroit LMT America/Detroit EPT America/Detroit AWT America/Dominica APT America/Dominica AST America/Dominica LMT America/Dominica AWT America/Blanc-Sablon APT America/Blanc-Sablon AST America/Blanc-Sablon LMT America/Blanc-Sablon CEST Europe/Podgorica CET Europe/Podgorica LMT Europe/Podgorica CEST Europe/Ljubljana CET Europe/Ljubljana LMT Europe/Ljubljana BDST Europe/Isle_of_Man BST Europe/Isle_of_Man LMT Europe/Isle_of_Man GMT Europe/Isle_of_Man +04 Europe/Istanbul IMT Europe/Istanbul +03 Europe/Istanbul EET Europe/Istanbul LMT Europe/Istanbul EEST Europe/Istanbul +05 Europe/Volgograd +04 Europe/Volgograd +03 Europe/Volgograd LMT Europe/Volgograd BDST Europe/Gibraltar CEST Europe/Gibraltar CET Europe/Gibraltar BST Europe/Gibraltar LMT Europe/Gibraltar GMT Europe/Gibraltar WEST Europe/Luxembourg CEST Europe/Luxembourg CET Europe/Luxembourg LMT Europe/Luxembourg WET Europe/Luxembourg WEMT Europe/Madrid CET Europe/Madrid CEST Europe/Madrid WEST Europe/Madrid LMT Europe/Madrid WET Europe/Madrid EEST Europe/Mariehamn LMT Europe/Mariehamn EET Europe/Mariehamn HMT Europe/Mariehamn CET Europe/Copenhagen CEST Europe/Copenhagen CMT Europe/Copenhagen LMT Europe/Copenhagen +04 Europe/Ulyanovsk +03 Europe/Ulyanovsk LMT Europe/Ulyanovsk +05 Europe/Ulyanovsk +02 Europe/Ulyanovsk WEMT Europe/Lisbon CEST Europe/Lisbon CET Europe/Lisbon WEST Europe/Lisbon LMT Europe/Lisbon WET Europe/Lisbon BDST Europe/London BST Europe/London LMT Europe/London GMT Europe/London +0120 Europe/Amsterdam NST Europe/Amsterdam CEST Europe/Amsterdam CET Europe/Amsterdam AMT Europe/Amsterdam +0020 Europe/Amsterdam LMT Europe/Amsterdam WEMT Europe/Monaco PMT Europe/Monaco CET Europe/Monaco CEST Europe/Monaco WEST Europe/Monaco LMT Europe/Monaco WET Europe/Monaco BDST Europe/Belfast BST Europe/Belfast LMT Europe/Belfast GMT Europe/Belfast CEST Europe/Tirane CET Europe/Tirane LMT Europe/Tirane EEST Europe/Helsinki LMT Europe/Helsinki EET Europe/Helsinki HMT Europe/Helsinki CET Europe/Simferopol CEST Europe/Simferopol EET Europe/Simferopol EEST Europe/Simferopol LMT Europe/Simferopol MSK Europe/Simferopol SMT Europe/Simferopol MSD Europe/Simferopol +04 Europe/Astrakhan +05 Europe/Astrakhan +03 Europe/Astrakhan LMT Europe/Astrakhan CEST Europe/Zagreb CET Europe/Zagreb LMT Europe/Zagreb CMT Europe/Chisinau CET Europe/Chisinau CEST Europe/Chisinau BMT Europe/Chisinau EET Europe/Chisinau MSK Europe/Chisinau EEST Europe/Chisinau LMT Europe/Chisinau MSD Europe/Chisinau +04 Europe/Kirov +05 Europe/Kirov +03 Europe/Kirov LMT Europe/Kirov CEST Europe/Andorra CET Europe/Andorra WET Europe/Andorra LMT Europe/Andorra CET Europe/Riga CEST Europe/Riga EET Europe/Riga EEST Europe/Riga LMT Europe/Riga RMT Europe/Riga MSK Europe/Riga LST Europe/Riga MSD Europe/Riga BDST Europe/Guernsey BST Europe/Guernsey LMT Europe/Guernsey GMT Europe/Guernsey CET Europe/Vatican CEST Europe/Vatican LMT Europe/Vatican RMT Europe/Vatican PMT Europe/Bratislava CEST Europe/Bratislava CET Europe/Bratislava LMT Europe/Bratislava GMT Europe/Bratislava CEST Europe/Sarajevo CET Europe/Sarajevo LMT Europe/Sarajevo LMT Europe/Nicosia EEST Europe/Nicosia EET Europe/Nicosia CET Europe/Vienna CEST Europe/Vienna LMT Europe/Vienna CET Europe/Rome CEST Europe/Rome LMT Europe/Rome RMT Europe/Rome PMT Europe/Prague CEST Europe/Prague CET Europe/Prague LMT Europe/Prague GMT Europe/Prague CET Europe/Kaliningrad CEST Europe/Kaliningrad EET Europe/Kaliningrad +03 Europe/Kaliningrad EEST Europe/Kaliningrad LMT Europe/Kaliningrad MSK Europe/Kaliningrad MSD Europe/Kaliningrad EET Europe/Moscow EEST Europe/Moscow MST Europe/Moscow LMT Europe/Moscow MMT Europe/Moscow MSK Europe/Moscow +05 Europe/Moscow MDST Europe/Moscow MSD Europe/Moscow BDST Europe/Jersey BST Europe/Jersey LMT Europe/Jersey GMT Europe/Jersey CEST Europe/Stockholm CET Europe/Stockholm SET Europe/Stockholm LMT Europe/Stockholm CMT Europe/Tiraspol CET Europe/Tiraspol CEST Europe/Tiraspol BMT Europe/Tiraspol EET Europe/Tiraspol MSK Europe/Tiraspol EEST Europe/Tiraspol LMT Europe/Tiraspol MSD Europe/Tiraspol CET Europe/San_Marino CEST Europe/San_Marino LMT Europe/San_Marino RMT Europe/San_Marino CET Europe/Busingen CEST Europe/Busingen BMT Europe/Busingen LMT Europe/Busingen CET Europe/Budapest CEST Europe/Budapest LMT Europe/Budapest CEMT Europe/Berlin CET Europe/Berlin CEST Europe/Berlin LMT Europe/Berlin BMT Europe/Brussels WEST Europe/Brussels CEST Europe/Brussels CET Europe/Brussels LMT Europe/Brussels WET Europe/Brussels CET Europe/Zaporozhye CEST Europe/Zaporozhye EET Europe/Zaporozhye EEST Europe/Zaporozhye LMT Europe/Zaporozhye MSK Europe/Zaporozhye +0220 Europe/Zaporozhye MSD Europe/Zaporozhye MSD Europe/Uzhgorod MSK Europe/Uzhgorod EET Europe/Uzhgorod CET Europe/Uzhgorod CEST Europe/Uzhgorod LMT Europe/Uzhgorod EEST Europe/Uzhgorod CET Europe/Tallinn CEST Europe/Tallinn EET Europe/Tallinn EEST Europe/Tallinn LMT Europe/Tallinn MSK Europe/Tallinn TMT Europe/Tallinn MSD Europe/Tallinn CET Europe/Vaduz CEST Europe/Vaduz BMT Europe/Vaduz LMT Europe/Vaduz CEST Europe/Belgrade CET Europe/Belgrade LMT Europe/Belgrade CET Europe/Kiev CEST Europe/Kiev EET Europe/Kiev KMT Europe/Kiev EEST Europe/Kiev LMT Europe/Kiev MSK Europe/Kiev MSD Europe/Kiev WMT Europe/Warsaw EET Europe/Warsaw CEST Europe/Warsaw CET Europe/Warsaw LMT Europe/Warsaw EEST Europe/Warsaw WEMT Europe/Paris PMT Europe/Paris CEST Europe/Paris CET Europe/Paris WEST Europe/Paris LMT Europe/Paris WET Europe/Paris BMT Europe/Bucharest EEST Europe/Bucharest LMT Europe/Bucharest EET Europe/Bucharest CET Europe/Zurich CEST Europe/Zurich BMT Europe/Zurich LMT Europe/Zurich DMT Europe/Dublin IST Europe/Dublin BST Europe/Dublin LMT Europe/Dublin GMT Europe/Dublin +04 Europe/Saratov +05 Europe/Saratov +03 Europe/Saratov LMT Europe/Saratov CEST Europe/Skopje CET Europe/Skopje LMT Europe/Skopje CET Europe/Minsk CEST Europe/Minsk EET Europe/Minsk +03 Europe/Minsk EEST Europe/Minsk LMT Europe/Minsk MSK Europe/Minsk MMT Europe/Minsk MSD Europe/Minsk CET Europe/Vilnius CEST Europe/Vilnius EET Europe/Vilnius KMT Europe/Vilnius EEST Europe/Vilnius LMT Europe/Vilnius MSK Europe/Vilnius WMT Europe/Vilnius MSD Europe/Vilnius CET Europe/Oslo CEST Europe/Oslo LMT Europe/Oslo CEST Europe/Athens CET Europe/Athens EET Europe/Athens AMT Europe/Athens LMT Europe/Athens EEST Europe/Athens IMT Europe/Sofia CEST Europe/Sofia EET Europe/Sofia CET Europe/Sofia LMT Europe/Sofia EEST Europe/Sofia CET Europe/Kyiv CEST Europe/Kyiv EET Europe/Kyiv KMT Europe/Kyiv EEST Europe/Kyiv LMT Europe/Kyiv MSK Europe/Kyiv MSD Europe/Kyiv +04 Europe/Samara +03 Europe/Samara LMT Europe/Samara +05 Europe/Samara +02 Europe/Samara CET Europe/Malta CEST Europe/Malta LMT Europe/Malta GMT+9 GMT+9 CST Cuba CDT Cuba LMT Cuba HMT Cuba PPT PST8PDT PWT PST8PDT PDT PST8PDT PST PST8PDT NSTimeZones/create-abbrevs.m0000644000175000017500000000500613324137131016110 0ustar richardrichard/* create-abbrevs.m - Utility to create a list of time zones and their associated abbreviations. Copyright (C) 1997 Free Software Foundation, Inc. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #include #include #include #include #include #include #include int main (int argc, char *argv[]) { int i; id pool, zone, dict, e, details, name, a; pool = [NSAutoreleasePool new]; /* Load preferred abbreviation mappings. */ a = [NSMutableDictionary dictionaryWithContentsOfFile: @"preferred_abbreviations.plist"]; if (nil == a) { NSLog(@"Unable to load 'preferred_abbreviations.plist'"); return 1; } for (i = 1; i < argc; i++) { name = [NSString stringWithUTF8String: argv[i]]; zone = [NSTimeZone timeZoneWithName: name]; if (zone != nil) { id detail, abbrev; dict = [NSMutableDictionary dictionary]; details = [zone timeZoneDetailArray]; e = [details objectEnumerator]; while ((detail = [e nextObject]) != nil) { [dict setObject: name forKey: [detail timeZoneAbbreviation]]; } e = [dict keyEnumerator]; while ((abbrev = [e nextObject]) != nil) { printf("%s\t%s\n", [abbrev UTF8String], [name UTF8String]); /* As an abbreviation can map to multiple names, and we only * want a single 'default' mapping, we only add a new one if * there is no existing one. */ if (nil == [a objectForKey: abbrev]) { [a setObject: name forKey: abbrev]; } } } } if (NO == [a writeToFile: @"abbreviations.plist" atomically: NO]) { NSLog(@"Failed to update 'abbreviations.plist'"); return 1; } [pool release]; return 0; } NSTimeZones/abbreviations.plist0000644000175000017500000000305214353032400016745 0ustar richardrichard{ ADT = "America/Halifax"; AFT = "Asia/Kabul"; AKDT = "America/Juneau"; AKST = "America/Juneau"; ART = "America/Argentina/Buenos_Aires"; AST = "America/Halifax"; BDT = "Asia/Dhaka"; BRST = "America/Sao_Paulo"; BRT = "America/Sao_Paulo"; BST = "Europe/London"; CAT = "Africa/Harare"; CDT = "America/Chicago"; CEST = "Europe/Paris"; CET = "Europe/Paris"; CLST = "America/Santiago"; CLT = "America/Santiago"; COT = "America/Bogota"; CST = "America/Chicago"; EAT = "Africa/Addis_Ababa"; EDT = "America/New_York"; EEST = "Europe/Athens"; EET = "Europe/Athens"; EST = "America/New_York"; GMT = GMT; GST = "Asia/Dubai"; HKST = "Asia/Hong_Kong"; HKT = "Asia/Hong_Kong"; HST = "Pacific/Honolulu"; ICT = "Asia/Bangkok"; IRST = "Asia/Tehran"; IST = "Asia/Kolkata"; JST = "Asia/Tokyo"; KST = "Asia/Seoul"; MDT = "America/Denver"; MSD = "Europe/Moscow"; MSK = "Europe/Moscow"; MST = "America/Phoenix"; NDT = "America/St_Johns"; NST = "America/St_Johns"; NZDT = "Pacific/Auckland"; NZST = "Pacific/Auckland"; PDT = "America/Los_Angeles"; PET = "America/Lima"; PHT = "Asia/Manila"; PKT = "Asia/Karachi"; PPT = PST8PDT; PST = "America/Los_Angeles"; PWT = PST8PDT; SGT = "Asia/Singapore"; TRT = "Europe/Istanbul"; UTC = UTC; WAT = "Africa/Lagos"; WEST = "Europe/Lisbon"; WET = "Europe/Lisbon"; WIT = "Asia/Jakarta"; YDT = "America/Yakutat"; YST = "America/Yakutat"; }NSTimeZones/create-regions.m0000644000175000017500000000503112121123135016121 0ustar richardrichard/* create-regions.m - Utility to create a list of time zones and their associated latitudinal region. Copyright (C) 1997 Free Software Foundation, Inc. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #include #include #include #include #include #include #define HOURSECS (60*60) /* Seconds in 1 hour. */ #define DAYSECS (HOURSECS*24) /* Seconds in 24 hours. */ #define N (360/15) /* Each latitudinal region is separated by 15 degrees */ int main (int argc, char *argv[]) { int i; id pool, name, zone; id zones[N]; pool = [NSAutoreleasePool new]; for (i = 0; i < N; i++) zones[i] = nil; /* Obtain the regions for each latitudinal region. */ for (i = 1; i < argc; i++) { name = [NSString stringWithUTF8String: argv[i]]; zone = [NSTimeZone timeZoneWithName: name]; if (zone != nil) { int offset, index; id details, detail, e; details = [zone timeZoneDetailArray]; /* Get a standard time. */ e = [details objectEnumerator]; while ((detail = [e nextObject]) != nil) { if (![detail isDaylightSavingTimeZone]) break; } if (detail == nil) /* If no standard time. */ detail = [details objectAtIndex: 0]; offset = [detail timeZoneSecondsFromGMT]; /* Get index from normalized offset */ index = ((offset+DAYSECS)%DAYSECS)/HOURSECS; if (zones[index] == nil) zones[index] = [NSMutableArray array]; [zones[index] addObject: [zone timeZoneName]]; } } /* Write regions to file. */ for (i = 0; i < N; i++) { id e, name; if (zones[i] != nil) { e = [zones[i] objectEnumerator]; while ((name = [e nextObject]) != nil) printf("%d %s\n", i, [name UTF8String]); } } [pool release]; return 0; } NSTimeZones/README0000644000175000017500000001356114353032201013725 0ustar richardrichard# This implementation of NSTimeZone uses the time zone data at # http://www.iana.org/time-zones (formerly ftp://elsie.nci.nih.gov/pub/). # # Structure of time zone directory: # # NSTimeZones/ # abbreviations - Abbreviation map file # regions - Regions grouped by latitude # zones/ - Saves the files with the time zones # # Install the 'NSTimeZones/' directory in GNUSTEP_INSTALL_LIBDIR # (e.g. if you configured the library with "./configure # --prefix=/usr/local", then install it in '/usr/local/lib/gnustep/'). # # The file in 'zones/' was created from 'tzcode2022g.tar.gz' and # 'tzdata2022g.tar.gz' by building and (after minor modification) # installing the software in those tarballs. # The install process places the timezone files in # /usr/local/etc/zoneinfo by default, so they were copied from there to 'zones'. # The files 'localtime', 'posixrules', 'Factory', 'zone.tab' and 'iso3166.tab' # were removed. # Hard links were removed by doing a `cp -R' of the final archive to a # different directory, and then using that directory. We removed hard # links just because RPM (red hat package manager) seems to have # problems with hard links. # 1. The tarballs were fetched and unpacked. mkdir /tmp/tz cd /tmp/tz # Fetch tarballs via http and unpack tar -xzf tzcode2022g.tar.gz tar -xzf tzdata2022g.tar.gz # 2. The software was built (on GNU/Linux) make # 3. GNUstep timezone information was appended to the file 'etcetera' in order # to provide GMT+/- timezones in OPENSTEP (common usage) format rather than # Posix format (the Posix style timezones are created in the 'Etc' # subdirectory). chmod u+w etcetera cat `gnustep-config --variable=GNUSTEP_LOCAL_LIBRARY`/Libraries/gnustep-base/Versions/1.28/Resources/NSTimeZones/GNUstep_zones >> etcetera # 4. The timezone files were generated and installed in in a temporary location: mkdir root make DESTDIR=./root install # 5. The timezone information was copied into the GNUstep zones directory, and # everything we don't want was removed. cd `gnustep-config --variable=GNUSTEP_LOCAL_LIBRARY`/Libraries/gnustep-base/Versions/1.28/Resources/NSTimeZones (cd /tmp/tz/root/usr/share; tar -cf - zoneinfo) | tar -xvf - rm -rf zones mv zoneinfo zones (cd zones; rm -rf leapseconds localtime posixrules Factory tzdata.zi zone.tab zone1970.tab iso3166.tab) # 6. A temporary list of all the zone names was created find zones -type f -print | sed -e 's/zones\///' > /tmp/tz/zone_names # 7. The create_abbrevs and create_regions files were built # 'create-regions' and 'create-abbrevs' only work on systems with the # GNU C library (e.g. Linux). This isn't a problem since the # distributed files work on any system. make # 8. The 'abbreviations' file was created by running 'create-abbrevs' with # the arguments set to all the possible time zone names. This may take a few # minutes to complete. rm -f abbreviations for i in `cat /tmp/tz/zone_names` do obj/create-abbrevs $i >> abbreviations done # 9. The 'regions' file was created by running 'create-regions' with the # arguments set to all the possible time zone names. This may take a few # minutes to complete. rm -f regions for i in `cat /tmp/tz/zone_names` do obj/create-regions $i >> regions done # 10. Finally, I tidied up. rm -rf /tmp/tz make distclean # 11. hard links in the `zone' directory were purged cp -R zones zones.new rm -Rf zones mv zones.new zones # 12. This README file in the # `gnustep-config --variable=GNUSTEP_LOCAL_LIBRARY`/Libraries/gnustep-base/Versions/1.28/Resources/NSTimeZones # directory was updated. # 13. The .tar file to be included in the gnustep base distribution # was simply obtained at this point by running tar on the # `gnustep-config --variable=GNUSTEP_LOCAL_LIBRARY`/Libraries/gnustep-base/Versions/1.28/Resources/NSTimeZones directory: cd `gnustep-config --variable=GNUSTEP_LOCAL_LIBRARY`/Libraries/gnustep-base/Versions/1.28/Resources tar cfv NSTimeZones.tar NSTimeZones # Possible questions # ======================= # Why do I use the time zone data at http://www.iana.org/time-zones # instead of using system functions for working with time zones? # # First, time zone names sometimes differ from system to system (Linux # has "Asia/Seoul", which the Solaris installation I use doesn't). # # Second, at least for strict POSIX the system functions are woefully # inadequate. There is no reliable way to obtain the offset from UTC, # there is absolutely no way to find out what time zone details there # may be (short of sorting through all time), no way to find a time zone # name from an abbreviation, etc. # # ======================= # Yoo C. Chung # # Updated August 2000 by R Frith-Macdonald # Updated (minor) January 2001 by Nicola Pero # Updated (minor) September 2001 by R Frith-Macdonald # Updated (minor) March 2002 by R Frith-Macdonald # Updated (minor) September 2002 by R Frith-Macdonald # Updated (minor) July 2004 by R Frith-Macdonald # Updated (minor) October 2004 by R Frith-Macdonald # Updated (minor) Dec 2004 by A Fedor (Add abbreviations.plist) # Updated (minor) February 2006 by R Frith-Macdonald # Updated (minor) August 2006 by R Frith-Macdonald # Updated (minor) March 2007 by R Frith-Macdonald # Updated (minor) June 2008 by R Frith-Macdonald # Updated (minor) October 2008 by R Frith-Macdonald # Updated (minor) May 2010 by R Frith-Macdonald # Updated (minor) March 2011 by R Frith-Macdonald # Updated (minor) June 2011 by R Frith-Macdonald # Updated (minor) June 2012 by R Frith-Macdonald # Updated (minor) March 2013 by R Frith-Macdonald # Updated (minor) July 2013 by R Frith-Macdonald # Updated (minor) October 2014 by R Frith-Macdonald # Updated (minor) May 2015 by R Frith-Macdonald # Updated (minor) March 2017 by R Frith-Macdonald # Updated (minor) December 2017 by R Frith-Macdonald # Updated (minor) July 2018 by R Frith-Macdonald # Updated (minor) November 2019 by R Frith-Macdonald # Updated (minor) December 2022 by R Frith-Macdonald NSTimeZones/regions0000664000175000017500000002514714353032527014456 0ustar richardrichard0 Antarctica/Mawson 0 Antarctica/Macquarie 9 Antarctica/DumontDUrville 11 Antarctica/South_Pole 0 Antarctica/Davis 0 Antarctica/Palmer 0 Antarctica/Rothera 3 Antarctica/Syowa 0 Antarctica/Vostok 0 Antarctica/Troll 11 Antarctica/McMurdo 0 Antarctica/Casey 17 US/Mountain 12 US/Samoa 18 US/Indiana-Starke 13 US/Hawaii 19 US/Eastern 16 US/Pacific 18 US/Michigan 18 US/Central 14 US/Alaska 12 US/Aleutian 16 US/Arizona 18 US/East-Indiana 0 Greenwich 23 Eire 23 Africa/El_Aaiun 2 Africa/Lusaka 1 Africa/Ndjamena 2 Africa/Harare 1 Africa/Mbabane 0 Africa/Niamey 2 Africa/Kampala 2 Africa/Mogadishu 0 Africa/Luanda 2 Africa/Asmera 23 Africa/Lome 23 Africa/Conakry 2 Africa/Maputo 23 Africa/Banjul 23 Africa/Casablanca 2 Africa/Cairo 2 Africa/Lubumbashi 23 Africa/Abidjan 0 Africa/Bangui 23 Africa/Monrovia 2 Africa/Nairobi 23 Africa/Ceuta 1 Africa/Windhoek 2 Africa/Djibouti 2 Africa/Khartoum 1 Africa/Johannesburg 2 Africa/Gaborone 23 Africa/Nouakchott 2 Africa/Bujumbura 0 Africa/Tripoli 23 Africa/Timbuktu 0 Africa/Lagos 0 Africa/Porto-Novo 0 Africa/Algiers 2 Africa/Blantyre 2 Africa/Kigali 0 Africa/Brazzaville 2 Africa/Dar_es_Salaam 0 Africa/Douala 23 Africa/Accra 0 Africa/Kinshasa 1 Africa/Maseru 0 Africa/Libreville 0 Africa/Malabo 2 Africa/Asmara 22 Africa/Bissau 23 Africa/Ouagadougou 2 Africa/Addis_Ababa 23 Africa/Bamako 2 Africa/Juba 23 Africa/Dakar 23 Africa/Freetown 0 Africa/Tunis 0 Africa/Sao_Tome 22 GMT-2 8 GMT+8 1 GMT+1 3 GMT+3 5 GMT+5 6 GMT+6 19 EST 2 Israel 22 Iceland 19 Chile/Continental 16 Chile/EasterIsland 16 Mexico/BajaSur 17 Mexico/General 16 Mexico/BajaNorte 22 Atlantic/Reykjavik 0 Atlantic/Jan_Mayen 22 Atlantic/Azores 19 Atlantic/Bermuda 23 Atlantic/Faeroe 23 Atlantic/St_Helena 21 Atlantic/South_Georgia 22 Atlantic/Cape_Verde 22 Atlantic/Madeira 20 Atlantic/Stanley 22 Atlantic/Canary 23 Atlantic/Faroe 8 PRC 12 NZ-CHAT 11 NZ 19 GMT-5 17 GMT-7 0 Zulu 0 GMT0 18 CST6CDT 23 GB 0 root/etc/localtime 0 Etc/Greenwich 2 Etc/GMT-2 16 Etc/GMT+8 23 Etc/GMT+1 21 Etc/GMT+3 19 Etc/GMT+5 18 Etc/GMT+6 5 Etc/GMT-5 7 Etc/GMT-7 0 Etc/Zulu 0 Etc/GMT0 0 Etc/GMT-0 0 Etc/UCT 14 Etc/GMT-14 12 Etc/GMT-12 12 Etc/GMT+12 14 Etc/GMT+10 0 Etc/UTC 13 Etc/GMT-13 0 Etc/GMT 9 Etc/GMT-9 4 Etc/GMT-4 1 Etc/GMT-1 20 Etc/GMT+4 17 Etc/GMT+7 0 Etc/Universal 11 Etc/GMT-11 8 Etc/GMT-8 0 Etc/GMT+0 13 Etc/GMT+11 6 Etc/GMT-6 3 Etc/GMT-3 10 Etc/GMT-10 22 Etc/GMT+2 15 Etc/GMT+9 0 WET 1 CET 1 Poland 18 Jamaica 0 GMT-0 9 Japan 2 Egypt 8 ROK 8 Pacific/Palau 12 Pacific/Tongatapu 11 Pacific/Norfolk 9 Pacific/Port_Moresby 11 Pacific/Fiji 15 Pacific/Gambier 18 Pacific/Galapagos 12 Pacific/Chatham 10 Pacific/Chuuk 12 Pacific/Samoa 9 Pacific/Guam 10 Pacific/Pohnpei 11 Pacific/Nauru 13 Pacific/Rarotonga 12 Pacific/Wallis 11 Pacific/Auckland 15 Pacific/Pitcairn 13 Pacific/Honolulu 10 Pacific/Kosrae 12 Pacific/Fakaofo 12 Pacific/Niue 11 Pacific/Efate 12 Pacific/Apia 11 Pacific/Noumea 0 Pacific/Enderbury 11 Pacific/Majuro 12 Pacific/Midway 10 Pacific/Yap 16 Pacific/Easter 10 Pacific/Guadalcanal 10 Pacific/Ponape 11 Pacific/Wake 14 Pacific/Tahiti 10 Pacific/Bougainville 13 Pacific/Kiritimati 11 Pacific/Kwajalein 11 Pacific/Tarawa 14 Pacific/Marquesas 12 Pacific/Pago_Pago 10 Pacific/Truk 0 Pacific/Kanton 11 Pacific/Funafuti 13 Pacific/Johnston 9 Pacific/Saipan 13 GMT+13 6 Singapore 0 UCT 10 GMT-14 12 GMT-12 14 HST 4 Asia/Dushanbe 8 Asia/Vladivostok 8 Asia/Pyongyang 1 Asia/Istanbul 9 Asia/Ust-Nera 2 Asia/Beirut 5 Asia/Urumqi 2 Asia/Famagusta 4 Asia/Yekaterinburg 2 Asia/Tbilisi 5 Asia/Kolkata 4 Asia/Omsk 2 Asia/Jerusalem 9 Asia/Jayapura 7 Asia/Brunei 3 Asia/Bahrain 7 Asia/Makassar 5 Asia/Kathmandu 8 Asia/Chungking 8 Asia/Taipei 6 Asia/Dacca 6 Asia/Irkutsk 5 Asia/Tomsk 8 Asia/Dili 5 Asia/Calcutta 10 Asia/Kamchatka 5 Asia/Thimbu 2 Asia/Tel_Aviv 3 Asia/Ashgabat 4 Asia/Kabul 3 Asia/Kuwait 3 Asia/Aqtobe 6 Asia/Rangoon 3 Asia/Qatar 3 Asia/Ashkhabad 7 Asia/Saigon 4 Asia/Qyzylorda 3 Asia/Dubai 3 Asia/Tehran 6 Asia/Hovd 8 Asia/Seoul 7 Asia/Chita 7 Asia/Jakarta 6 Asia/Yangon 3 Asia/Muscat 7 Asia/Ho_Chi_Minh 9 Asia/Tokyo 8 Asia/Chongqing 3 Asia/Riyadh 2 Asia/Nicosia 6 Asia/Singapore 6 Asia/Krasnoyarsk 7 Asia/Hong_Kong 4 Asia/Karachi 8 Asia/Manila 6 Asia/Bangkok 3 Asia/Atyrau 2 Asia/Yerevan 6 Asia/Vientiane 7 Asia/Macau 5 Asia/Thimphu 8 Asia/Shanghai 2 Asia/Damascus 9 Asia/Sakhalin 7 Asia/Ujung_Pandang 5 Asia/Almaty 2 Asia/Baghdad 4 Asia/Samarkand 5 Asia/Kashgar 2 Asia/Gaza 8 Asia/Yakutsk 6 Asia/Phnom_Penh 5 Asia/Colombo 3 Asia/Aqtau 2 Asia/Hebron 6 Asia/Dhaka 7 Asia/Pontianak 5 Asia/Novosibirsk 8 Asia/Harbin 11 Asia/Anadyr 3 Asia/Oral 10 Asia/Srednekolymsk 9 Asia/Khandyga 7 Asia/Kuching 7 Asia/Choibalsan 4 Asia/Tashkent 7 Asia/Ulan_Bator 4 Asia/Bishkek 7 Asia/Macao 3 Asia/Aden 4 Asia/Qostanay 5 Asia/Barnaul 3 Asia/Baku 5 Asia/Katmandu 2 Asia/Amman 10 Asia/Magadan 6 Asia/Kuala_Lumpur 7 Asia/Ulaanbaatar 5 Asia/Novokuznetsk 12 GMT+12 17 MST 10 GMT+10 0 Libya 0 UTC 11 GMT-13 7 Hongkong 4 Indian/Chagos 7 Indian/Christmas 4 Indian/Maldives 0 Indian/Kerguelen 3 Indian/Mahe 3 Indian/Mauritius 3 Indian/Reunion 2 Indian/Mayotte 2 Indian/Comoro 2 Indian/Antananarivo 6 Indian/Cocos 16 Canada/Mountain 19 Canada/Atlantic 14 Canada/Yukon 18 Canada/Eastern 15 Canada/Pacific 20 Canada/Newfoundland 17 Canada/Central 17 Canada/Saskatchewan 2 W-SU 8 ROC 1 Turkey 0 GMT 2 EET 1 MET 17 MST7MDT 15 GMT-9 20 GMT-4 3 Iran 23 GMT-1 0 Arctic/Longyearbyen 4 GMT+4 11 Kwajalein 7 GMT+7 9 Australia/Hobart 9 Australia/Melbourne 10 Australia/NSW 10 Australia/Lord_Howe 9 Australia/Currie 9 Australia/Adelaide 8 Australia/Eucla 10 Australia/Queensland 10 Australia/Sydney 9 Australia/Yancowinna 10 Australia/ACT 8 Australia/North 9 Australia/Lindeman 7 Australia/West 9 Australia/Broken_Hill 9 Australia/South 10 Australia/Brisbane 7 Australia/Perth 9 Australia/Victoria 8 Australia/Darwin 10 Australia/Canberra 10 Australia/LHI 9 Australia/Tasmania 0 Universal 13 GMT-11 16 GMT-8 0 GMT+0 11 GMT+11 18 GMT-6 14 GMT+14 19 EST5EDT 21 GMT-3 19 Brazil/Acre 21 Brazil/DeNoronha 20 Brazil/East 19 Brazil/West 14 GMT-10 23 GB-Eire 2 GMT+2 17 Navajo 23 Portugal 18 America/Menominee 16 America/Phoenix 19 America/Manaus 14 America/Anchorage 19 America/St_Barthelemy 20 America/St_Johns 18 America/El_Salvador 18 America/Guayaquil 19 America/Argentina/ComodRivadavia 19 America/Argentina/Ushuaia 19 America/Argentina/La_Rioja 19 America/Argentina/Catamarca 19 America/Argentina/Cordoba 20 America/Argentina/Buenos_Aires 19 America/Argentina/San_Luis 19 America/Argentina/Salta 19 America/Argentina/San_Juan 19 America/Argentina/Tucuman 19 America/Argentina/Mendoza 19 America/Argentina/Jujuy 19 America/Argentina/Rio_Gallegos 0 America/Rankin_Inlet 17 America/Shiprock 18 America/Knox_IN 19 America/Thule 15 America/Metlakatla 18 America/Nipigon 15 America/Juneau 18 America/Cancun 18 America/Lima 19 America/Punta_Arenas 22 America/Danmarkshavn 21 America/Noronha 19 America/Martinique 20 America/Asuncion 18 America/Indiana/Petersburg 18 America/Indiana/Knox 18 America/Indiana/Tell_City 18 America/Indiana/Marengo 18 America/Indiana/Vincennes 18 America/Indiana/Indianapolis 18 America/Indiana/Winamac 18 America/Indiana/Vevay 19 America/Santiago 19 America/Kralendijk 14 America/Sitka 16 America/Chihuahua 0 America/Iqaluit 17 America/North_Dakota/New_Salem 17 America/North_Dakota/Center 17 America/North_Dakota/Beulah 19 America/Eirunepe 15 America/Vancouver 17 America/Rainy_River 15 America/Fort_Nelson 19 America/Catamarca 16 America/Los_Angeles 19 America/Halifax 19 America/Port-au-Prince 19 America/Goose_Bay 20 America/Guyana 18 America/Havana 18 America/Jamaica 19 America/Port_of_Spain 19 America/Moncton 19 America/Puerto_Rico 19 America/St_Lucia 17 America/Denver 19 America/Cordoba 20 America/Cuiaba 20 America/Buenos_Aires 19 America/Marigot 16 America/Ciudad_Juarez 16 America/Swift_Current 19 America/Aruba 19 America/Caracas 19 America/Boa_Vista 19 America/Porto_Acre 19 America/Virgin 19 America/St_Thomas 17 America/Winnipeg 17 America/Mexico_City 12 America/Adak 15 America/Dawson_Creek 17 America/Guatemala 20 America/Glace_Bay 18 America/Merida 18 America/Fort_Wayne 19 America/Guadeloupe 14 America/Dawson 20 America/Montevideo 20 America/Sao_Paulo 19 America/Grenada 16 America/Ensenada 19 America/Santo_Domingo 20 America/Miquelon 21 America/Bahia 20 America/Nuuk 19 America/Mendoza 19 America/Jujuy 0 America/Yellowknife 16 America/Santa_Isabel 12 America/Nome 19 America/Anguilla 19 America/Rosario 18 America/Thunder_Bay 18 America/Atikokan 16 America/Bahia_Banderas 18 America/Montreal 22 America/Scoresbysund 20 America/Cayenne 18 America/Toronto 19 America/Curacao 18 America/Panama 17 America/Matamoros 20 America/Campo_Grande 18 America/Belize 18 America/Costa_Rica 19 America/Rio_Branco 19 America/Lower_Princes 19 America/Grand_Turk 18 America/Managua 20 America/Santarem 0 America/Pangnirtung 21 America/Recife 18 America/Indianapolis 18 America/Chicago 20 America/Belem 17 America/Regina 19 America/Bogota 17 America/Monterrey 20 America/Godthab 16 America/Tijuana 21 America/Fortaleza 20 America/Paramaribo 16 America/Mazatlan 12 America/Atka 18 America/Louisville 14 America/Whitehorse 21 America/Maceio 19 America/Antigua 16 America/Creston 18 America/Kentucky/Louisville 18 America/Kentucky/Monticello 0 America/Cambridge_Bay 19 America/Tortola 17 America/Ojinaga 0 America/Resolute 19 America/St_Vincent 18 America/Nassau 19 America/New_York 19 America/Porto_Velho 16 America/Boise 20 America/Araguaina 0 America/Inuvik 19 America/St_Kitts 16 America/Edmonton 20 America/Barbados 16 America/Hermosillo 19 America/Montserrat 18 America/Coral_Harbour 19 America/La_Paz 14 America/Yakutat 18 America/Cayman 18 America/Tegucigalpa 18 America/Detroit 19 America/Dominica 19 America/Blanc-Sablon 1 Europe/Podgorica 1 Europe/Ljubljana 23 Europe/Isle_of_Man 1 Europe/Istanbul 2 Europe/Volgograd 23 Europe/Gibraltar 0 Europe/Luxembourg 23 Europe/Madrid 1 Europe/Mariehamn 0 Europe/Copenhagen 3 Europe/Ulyanovsk 23 Europe/Lisbon 23 Europe/London 0 Europe/Amsterdam 0 Europe/Monaco 23 Europe/Belfast 1 Europe/Tirane 1 Europe/Helsinki 2 Europe/Simferopol 3 Europe/Astrakhan 1 Europe/Zagreb 1 Europe/Chisinau 3 Europe/Kirov 0 Europe/Andorra 1 Europe/Riga 23 Europe/Guernsey 0 Europe/Vatican 0 Europe/Bratislava 1 Europe/Sarajevo 2 Europe/Nicosia 1 Europe/Vienna 0 Europe/Rome 0 Europe/Prague 1 Europe/Kaliningrad 2 Europe/Moscow 23 Europe/Jersey 1 Europe/Stockholm 1 Europe/Tiraspol 0 Europe/San_Marino 0 Europe/Busingen 1 Europe/Budapest 0 Europe/Berlin 0 Europe/Brussels 2 Europe/Zaporozhye 1 Europe/Uzhgorod 1 Europe/Tallinn 0 Europe/Vaduz 1 Europe/Belgrade 2 Europe/Kiev 1 Europe/Warsaw 0 Europe/Paris 1 Europe/Bucharest 0 Europe/Zurich 23 Europe/Dublin 3 Europe/Saratov 1 Europe/Skopje 1 Europe/Minsk 1 Europe/Vilnius 0 Europe/Oslo 1 Europe/Athens 1 Europe/Sofia 2 Europe/Kyiv 3 Europe/Samara 0 Europe/Malta 9 GMT+9 18 Cuba 16 PST8PDT NSTimeZones/nstimezone.m0000644000175000017500000000101107546012605015415 0ustar richardrichard/* Test time zone code. */ #include #include #include #include #include int main () { id detail; printf("time zones for PST:\n%s\n", [[[[NSTimeZone abbreviationMap] objectForKey: @"PST"] description] UTF8String]); printf("time zones:\n%s\n", [[[NSTimeZone timeZoneArray] description] UTF8String]); printf("local time zone:\n%s\n", [[[NSTimeZone localTimeZone] description] UTF8String]); return 0; } gnustep-base-1.29.0/README.initialize000066400000000000000000000016411435650067400172340ustar00rootroot00000000000000The libobjc included with older versions of gcc does not have a thread-safe implementation of the initialize method. This means that any classes not already used may be incorrectly initialised, potentially causing strange behaviors and crashes. To put this into context, the runtime bug has been known for several years and only rarely causes problems ... the easy workaround being to ensure that any classes used by a new thread have already been used in the main thread before the new thread starts. If you are worried, please build/run GNUstep with a runtime which supports the +initialize method. The GNUstep stable runtime (libobjc) and clang runtime (libobjc2), available from the GNUstep website and subversion repository, should both work. To disable this warning (eg. for an application which does not suffer any problems caused by this runtime bug), please set the GSSilenceInitializeWarning user default to YES."); gnustep-base-1.29.0/README.md000066400000000000000000000053401435650067400154730ustar00rootroot00000000000000GNUstep Base Library ==================== [![CI](https://github.com/gnustep/libs-base/actions/workflows/main.yml/badge.svg)](https://github.com/gnustep/libs-base/actions/workflows/main.yml?query=branch%3Amaster) The GNUstep Base Library is a library of general-purpose, non-graphical Objective C objects. For example, it includes classes for strings, object collections, byte streams, typed coders, invocations, notifications, notification dispatchers, moments in time, network ports, remote object messaging support (distributed objects), and event loops. It provides functionality that aims to implement the non-graphical portion of the Apple's Cocoa frameworks (the Foundation library) which came from the OpenStep standard. Initial reading --------------- The file [NEWS](NEWS) has the library's feature history. The files [INSTALL](INSTALL) or [GNUstep-HOWTO][1] (from the web site) gives instructions for installing the library. [1]: http://www.gnustep.org/resources/documentation/User/GNUstep/gnustep-howto.pdf License ------- The GNUstep libraries and library resources are covered under the GNU Lesser Public License. This means you can use these libraries in any program (even non-free programs). If you distribute the libraries along with your program, you must make the improvements you have made to the libraries freely available. You should read the COPYING.LIB file for more information. All files in the 'Source', 'Headers', 'NSCharacterSets', 'NSTimeZones', and 'Resources' directories and subdirectories under this are covered under the LGPL. GNUstep tools, test programs, and other files are covered under the GNU Public License. This means if you make changes to these programs, you cannot charge a fee, other than distribution fees, for others to use the program. You should read the COPYING file for more information. All files in the 'Documentation', 'Examples', 'Tools', 'config', and 'macosx' directories are covered under the GPL. With GNUstep-Base, we strongly recommend the use of the ffcall libraries, which provides stack frame handling for NSInvocation and NSConnection. "Ffcall is under GNU GPL. As a special exception, if used in GNUstep or in derivate works of GNUstep, the included parts of ffcall are under GNU LGPL" (Text in quotes provided by the author of ffcall). How can you help? ----------------- Give us feedback! Tell us what you like; tell us what you think could be better. Please log bug reports on the [GitHub issues page][2]. [2]: https://github.com/gnustep/libs-base/issues Happy hacking! Copyright (C) 2005 Free Software Foundation Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. gnustep-base-1.29.0/Resources/000077500000000000000000000000001435650067400161645ustar00rootroot00000000000000gnustep-base-1.29.0/Resources/English.lproj/000077500000000000000000000000001435650067400207025ustar00rootroot00000000000000gnustep-base-1.29.0/Resources/English.lproj/Localizable.strings000066400000000000000000000202001435650067400245300ustar00rootroot00000000000000/* English string encodings */ GSUndefinedEncoding = "Unknown"; NSProprietaryStringEncoding = "Installation-specific"; NSASCIIStringEncoding = "Western (ASCII)"; NSNEXTSTEPStringEncoding = "Western (NextStep)"; NSJapaneseEUCStringEncoding = "Japanese (EUC)"; NSUTF8StringEncoding = "Unicode (UTF-8)"; NSISOLatin1StringEncoding = "Western (ISO Latin 1)"; NSSymbolStringEncoding = "Symbol (Mac OS)"; NSNonLossyASCIIStringEncoding = "Non-lossy ASCII"; NSShiftJISStringEncoding = "Japanese (Windows, DOS)"; NSISOLatin2StringEncoding = "Central European (ISO Latin 2)"; NSUnicodeStringEncoding = "Unicode (UTF-16)"; NSWindowsCP1251StringEncoding = "Cyrillic (Windows)"; NSWindowsCP1252StringEncoding = "Western (Windows Latin 1)"; NSWindowsCP1253StringEncoding = "Greek (Windows)"; NSWindowsCP1254StringEncoding = "Turkish (Windows Latin 5)"; NSWindowsCP1250StringEncoding = "Central European (Windows Latin 2)"; NSISO2022JPStringEncoding = "Japanese (ISO 2022-JP)"; NSMacOSRomanStringEncoding = "Western (Mac OS Roman)"; NSUTF16BigEndianStringEncoding = "Unicode (UTF-16BE)"; NSUTF16LittleEndianStringEncoding = "Unicode (UTF-16LE)"; NSUTF32StringEncoding = "Unicode (UTF-32)"; NSUTF32BigEndianStringEncoding = "Unicode (UTF-32BE)"; NSUTF32LittleEndianStringEncoding = "Unicode (UTF-32LE)"; NSMacOSJapaneseStringEncoding = "Japanese (Mac OS)"; NSMacOSTraditionalChineseStringEncoding = "Traditional Chinese (Mac OS)"; NSMacOSKoreanStringEncoding = "Korean (Mac OS)"; NSMacOSArabicStringEncoding = "Arabic (Mac OS)"; NSMacOSHebrewStringEncoding = "Hebrew (Mac OS)"; NSMacOSGreekStringEncoding = "Greek (Mac OS)"; NSMacOSCyrillicStringEncoding = "Cyrillic (Mac OS)"; NSMacOSDevanagariStringEncoding = "Devanagari (Mac OS)"; NSMacOSGurmukhiStringEncoding = "Gurmukhi (Mac OS)"; NSMacOSGujaratiStringEncoding = "Gujarati (Mac OS)"; NSMacOSOriyaStringEncoding = "Oriya (Mac OS)"; NSMacOSBengaliStringEncoding = "Bengali (Mac OS)"; NSMacOSTamilStringEncoding = "Tamil (Mac OS)"; NSMacOSTeluguStringEncoding = "Telugu (Mac OS)"; NSMacOSKannadaStringEncoding = "Kannada (Mac OS)"; NSMacOSMalayalamStringEncoding = "Malayalam (Mac OS)"; NSMacOSSinhaleseStringEncoding = "Sinhalese (Mac OS)"; NSMacOSBurmeseStringEncoding = "Burmese (Mac OS)"; NSMacOSKhmerStringEncoding = "Khmer (Mac OS)"; NSMacOSThaiStringEncoding = "Thai (Mac OS)"; NSMacOSLaotianStringEncoding = "Laotian (Mac OS)"; NSMacOSGeorgianStringEncoding = "Georgian (Mac OS)"; NSMacOSArmenianStringEncoding = "Armenian (Mac OS)"; NSMacOSSimplifiedChineseStringEncoding = "Simplified Chinese (Mac OS)"; NSMacOSTibetanStringEncoding = "Tibetan (Mac OS)"; NSMacOSMongolianStringEncoding = "Mongolian (Mac OS)"; NSMacOSEthiopicStringEncoding = "Ethiopic (Mac OS)"; NSMacOSCentralEuropeanRomanStringEncoding = "Central European (Mac OS)"; NSMacOSVietnameseStringEncoding = "Vietnamese (Mac OS)"; NSMacOSSymbolStringEncoding = "Symbol (Mac OS)"; NSMacOSDingbatsStringEncoding = "Dingbats (Mac OS)"; NSMacOSTurkishStringEncoding = "Turkish (Mac OS)"; NSMacOSCroatianStringEncoding = "Croatian (Mac OS)"; NSMacOSIcelandicStringEncoding = "Icelandic (Mac OS)"; NSMacOSRomanianStringEncoding = "Romanian (Mac OS)"; NSMacOSCelticStringEncoding = "Celtic (Mac OS)"; NSMacOSGaelicStringEncoding = "Gaelic (Mac OS)"; NSMacOSKeyboardSymbolsStringEncoding = "Keyboard Symbols (Mac OS)"; NSMacOSFarsiStringEncoding = "Farsi (Mac OS)"; NSMacOSUkrainianStringEncoding = "Cyrillic (Mac OS Ukrainian)"; NSMacOSInuitStringEncoding = "Inuit (Mac OS)"; NSMacVT100StringEncoding = "Western (Mac VT100)"; NSMacHFSStringEncoding = "Western (Mac OS Roman)"; NSUTF7StringEncoding = "Unicode (UTF-7)"; NSISOLatin3StringEncoding = "Western (ISO Latin 3)"; NSISOLatin4StringEncoding = "Central European (ISO Latin 4)"; NSISOCyrillicStringEncoding = "Cyrillic (ISO 8859-5)"; NSISOArabicStringEncoding = "Arabic (ISO 8859-6)"; NSISOGreekStringEncoding = "Greek (ISO 8859-7)"; NSISOHebrewStringEncoding = "Hebrew (ISO 8859-8)"; NSISOLatin5StringEncoding = "Turkish (ISO Latin 5)"; NSISOLatin6StringEncoding = "Nordic (ISO Latin 6)"; NSISOThaiStringEncoding = "Thai (ISO 8859-11)"; NSISOLatin7StringEncoding = "Baltic (ISO Latin 7)"; NSISOLatin8StringEncoding = "Celtic (ISO Latin 8)"; NSISOLatin9StringEncoding = "Western (ISO Latin 9)"; NSISOLatin10StringEncoding = "Romanian (ISO Latin 10)"; NSDOSLatinUSStringEncoding = "Latin-US (DOS)"; NSDOSGreekStringEncoding = "Greek (DOS)"; NSDOSBalticRimStringEncoding = "Baltic (DOS)"; NSDOSLatin1StringEncoding = "Western (DOS Latin 1)"; NSDOSGreek1StringEncoding = "Greek (DOS Greek 1)"; NSDOSLatin2StringEncoding = "Central European (DOS Latin 2)"; NSDOSCyrillicStringEncoding = "Cyrillic (DOS)"; NSDOSTurkishStringEncoding = "Turkish (DOS)"; NSDOICortugueseStringEncoding = "Portuguese (DOS)"; NSDOSIcelandicStringEncoding = "Icelandic (DOS)"; NSDOSHebrewStringEncoding = "Hebrew (DOS)"; NSDOSCanadianFrenchStringEncoding = "Canadian French (DOS)"; NSDOSArabicStringEncoding = "Arabic (DOS)"; NSDOSNordicStringEncoding = "Nordic (DOS)"; NSDOSRussianStringEncoding = "Russian (DOS)"; NSDOSGreek2StringEncoding = "Greek (DOS Greek 2)"; NSDOSThaiStringEncoding = "Thai (Windows, DOS)"; NSDOSJapaneseStringEncoding = "Japanese (Windows, DOS)"; NSDOSChineseSimplifStringEncoding = "Simplified Chinese (Windows, DOS)"; NSDOSKoreanStringEncoding = "Korean (Windows, DOS)"; NSDOSChineseTradStringEncoding = "Traditional Chinese (Windows, DOS)"; NSWindowsLatin1StringEncoding = "Western (Windows Latin 1)"; NSWindowsLatin2StringEncoding = "Central European (Windows Latin 2)"; NSWindowsCyrillicStringEncoding = "Cyrillic (Windows)"; NSWindowsGreekStringEncoding = "Greek (Windows)"; NSWindowsLatin5StringEncoding = "Turkish (Windows Latin 5)"; NSWindowsHebrewStringEncoding = "Hebrew (Windows)"; NSWindowsArabicStringEncoding = "Arabic (Windows)"; NSWindowsBalticRimStringEncoding = "Baltic (Windows)"; NSWindowsVietnameseStringEncoding = "Vietnamese (Windows)"; NSWindowsKoreanJohabStringEncoding = "Korean (Windows Johab)"; NSJIS_X0208_90StringEncoding = "Japanese (JIS X0208)"; NSShiftJIS_X0213StringEncoding = "Japanese (Shift JIS X0213)"; NSGB_2312_80StringEncoding = "Simplified Chinese (GB 2312)"; NSGBK_95StringEncoding = "Chinese (GBK)"; NSGB_18030_2000StringEncoding = "Chinese (GB 18030)"; NSKSC_5601_87StringEncoding = "Korean (KSC 5601-1987)"; NSISO2022JapaneseStringEncoding = "Japanese (ISO 2022-JP)"; NSISO2022Japanese2StringEncoding = "Japanese (ISO 2022-JP-2)"; NSISO2022Japanese1StringEncoding = "Japanese (ISO 2022-JP-1)"; NSISO2022Japanese3StringEncoding = "Japanese (ISO 2022-JP-3)"; NSISO2022ChineseStringEncoding = "Chinese (ISO 2022-CN)"; NSISO2022ExtendedChineseStringEncoding = "Chinese (ISO 2022-CN-EXT)"; NSISO2022KoreanStringEncoding = "Korean (ISO 2022-KR)"; NSEUCJapaneseStringEncoding = "Japanese (EUC)"; NSEUCChineseStringEncoding = "Simplified Chinese (GB 2312)"; NSEUCTaiwanChineseStringEncoding = "Traditional Chinese (EUC)"; NSEUCKoreanStringEncoding = "Korean (EUC)"; NSChineseEUCStringEncoding = "Simplified Chinese (GB 2312)"; NSTaiwanChineseEUCStringEncoding = "Traditional Chinese (EUC)"; NSKoreanEUCStringEncoding = "Korean (EUC)"; NSKOI8RStringEncoding = "Cyrillic (KOI8-R)"; NSBig5StringEncoding = "Traditional Chinese (Big 5)"; NSMacRomanLatin1StringEncoding = "Western (Mac Mail)"; NSHZ_GB_2312StringEncoding = "Simplified Chinese (HZ GB 2312)"; NSBig5_HKSCS_1999StringEncoding = "Traditional Chinese (Big 5 HKSCS)"; NSKOI8UStringEncoding = "Ukrainian (KOI8-U)"; NSBig5EStringEncoding = "Traditional Chinese (Big 5-E)"; NSNextStepLatinStringEncoding = "Western (NextStep)"; NSNextStepJapaneseStringEncoding = "Japanese (NextStep)"; NSEBCDICUSStringEncoding = "Western (EBCDIC Latin Core)"; NSEBCDICCP037StringEncoding = "Western (EBCDIC Latin 1)"; gnustep-base-1.29.0/Resources/Esperanto.lproj/000077500000000000000000000000001435650067400212515ustar00rootroot00000000000000gnustep-base-1.29.0/Resources/Esperanto.lproj/Localizable.strings000066400000000000000000000035611435650067400251120ustar00rootroot00000000000000/* Esperanto string encodings */ GSUndefinedEncoding = "nekonata"; NSProprietaryStringEncoding = "Installaĵo-dependa"; NSASCIIStringEncoding = "7 bita ASCII"; NSNonLossyASCIIStringEncoding = "senperda ASCII (7bita)"; NSMacOSRomanStringEncoding = "MacOS Roman"; NSNEXTSTEPStringEncoding = "NEXTSTEP"; NSSymbolStringEncoding = "Adobe Symbol"; NSWindowsCP1251StringEncoding = "Windows kirila (CP1251)"; NSWindowsCP1252StringEncoding = "Windows latin-1 (CP1252)"; NSWindowsCP1253StringEncoding = "Windows greka (CP1253)"; NSWindowsCP1254StringEncoding = "Windows turka (CP1254)"; NSWindowsCP1250StringEncoding = "Windows latin-2 (CP1250)"; NSISOLatin1StringEncoding = "ISO Latin-1 OkcidenteÅ­ropa (ISO-8859-1)"; NSISOLatin2StringEncoding = "ISO Latin-2 OrieneÅ­ropa (ISO-8859-2)"; NSISOLatin3StringEncoding = "ISO Latin-3 SudeÅ­ropa (ISO-8859-3)"; NSISOLatin4StringEncoding = "ISO Latin-4 NordeÅ­ropa (ISO-8859-4)"; NSISOLatin5StringEncoding = "ISO Latin-5 Turka (ISO-8859-9)"; NSISOLatin6StringEncoding = "ISO Latin-6 Norda (ISO-8859-10)"; NSISOLatin7StringEncoding = "ISO Latin-7 Balta (ISO-8859-13)"; NSISOLatin8StringEncoding = "ISO Latin-8 Kelta (ISO-8859-14)"; NSISOLatin9StringEncoding = "ISO Latin-9 OkcidenteÅ­ropa (nova) (ISO-8859-15)"; NSISOCyrillicStringEncoding = "Kirila (ISO-8859-5)"; NSISOArabicStringEncoding = "Araba (ISO-8859-6)"; NSISOGreekStringEncoding = "Greka (ISO-8859-7)"; NSISOHebrewStringEncoding = "Hebrea (ISO-8859-8)"; NSUTF7StringEncoding = "Unikodo UTF-7 (RFC 2152)"; NSUTF8StringEncoding = "Unikodo UTF-8"; NSUnicodeStringEncoding = "Unikodo UTF-16"; NSKOI8RStringEncoding = "Kirila KOI8-R (Rusa)"; NSJapaneseEUCStringEncoding = "Japana EUC"; NSShiftJISStringEncoding = "Japana Shift-JIS"; NSISO2022JPStringEncoding = "Japana JIS (7 bits) (ISO 2022)"; NSChineseEUCStringEncoding = "Simpligita ĉina GB2312"; gnustep-base-1.29.0/Resources/French.lproj/000077500000000000000000000000001435650067400205165ustar00rootroot00000000000000gnustep-base-1.29.0/Resources/French.lproj/Localizable.strings000066400000000000000000000202771435650067400243620ustar00rootroot00000000000000/* French string encodings */ GSUndefinedEncoding = "Inconnu"; NSProprietaryStringEncoding = "Propriétaire"; NSASCIIStringEncoding = "Occidental (ASCII)"; NSNEXTSTEPStringEncoding = "Occidental (NextStep)"; NSJapaneseEUCStringEncoding = "Japonais (EUC)"; NSUTF8StringEncoding = "Unicode (UTF-8)"; NSISOLatin1StringEncoding = "Occidental (ISO Latin 1)"; NSSymbolStringEncoding = "Symbol (Mac OS)"; NSNonLossyASCIIStringEncoding = "ASCII sans pertes"; NSShiftJISStringEncoding = "Japonais (Windows, DOS)"; NSISOLatin2StringEncoding = "Europe centrale (ISO Latin 2)"; NSUnicodeStringEncoding = "Unicode (UTF-16)"; NSWindowsCP1251StringEncoding = "Cyrillique (Windows)"; NSWindowsCP1252StringEncoding = "Occidental (Windows Latin 1)"; NSWindowsCP1253StringEncoding = "Grec (Windows)"; NSWindowsCP1254StringEncoding = "Turc (Windows Latin 5)"; NSWindowsCP1250StringEncoding = "Europe centrale (Windows Latin 2)"; NSISO2022JPStringEncoding = "Japonais (ISO 2022-JP)"; NSMacOSRomanStringEncoding = "Occidental (Mac OS Roman)"; NSUTF16BigEndianStringEncoding = "Unicode (UTF-16BE)"; NSUTF16LittleEndianStringEncoding = "Unicode (UTF-16LE)"; NSUTF32StringEncoding = "Unicode (UTF-32)"; NSUTF32BigEndianStringEncoding = "Unicode (UTF-32BE)"; NSUTF32LittleEndianStringEncoding = "Unicode (UTF-32LE)"; NSMacOSJapaneseStringEncoding = "Japonais (Mac OS)"; NSMacOSTraditionalChineseStringEncoding = "Chinois traditionnel (Mac OS)"; NSMacOSKoreanStringEncoding = "Coréen (Mac OS)"; NSMacOSArabicStringEncoding = "Arabe (Mac OS)"; NSMacOSHebrewStringEncoding = "Hébreu (Mac OS)"; NSMacOSGreekStringEncoding = "Grec (Mac OS)"; NSMacOSCyrillicStringEncoding = "Cyrillique (Mac OS)"; NSMacOSDevanagariStringEncoding = "Devanagari (Mac OS)"; NSMacOSGurmukhiStringEncoding = "Gurmukhi (Mac OS)"; NSMacOSGujaratiStringEncoding = "Gujarati (Mac OS)"; NSMacOSOriyaStringEncoding = "Oriya (Mac OS)"; NSMacOSBengaliStringEncoding = "Bengali (Mac OS)"; NSMacOSTamilStringEncoding = "Tamil (Mac OS)"; NSMacOSTeluguStringEncoding = "Telugu (Mac OS)"; NSMacOSKannadaStringEncoding = "Kannada (Mac OS)"; NSMacOSMalayalamStringEncoding = "Malayalam (Mac OS)"; NSMacOSSinhaleseStringEncoding = "Sinhalese (Mac OS)"; NSMacOSBurmeseStringEncoding = "Burmese (Mac OS)"; NSMacOSKhmerStringEncoding = "Khmer (Mac OS)"; NSMacOSThaiStringEncoding = "Thaïlandais (Mac OS)"; NSMacOSLaotianStringEncoding = "Laotian (Mac OS)"; NSMacOSGeorgianStringEncoding = "Georgian (Mac OS)"; NSMacOSArmenianStringEncoding = "Armenian (Mac OS)"; NSMacOSSimplifiedChineseStringEncoding = "Chinois simplifié (Mac OS)"; NSMacOSTibetanStringEncoding = "Tibétain (Mac OS)"; NSMacOSMongolianStringEncoding = "Mongolian (Mac OS)"; NSMacOSEthiopicStringEncoding = "Ethiopic (Mac OS)"; NSMacOSCentralEuropeanRomanStringEncoding = "Europe centrale (Mac OS)"; NSMacOSVietnameseStringEncoding = "Vietnamese (Mac OS)"; NSMacOSSymbolStringEncoding = "Symbol (Mac OS)"; NSMacOSDingbatsStringEncoding = "Dingbats (Mac OS)"; NSMacOSTurkishStringEncoding = "Turc (Mac OS)"; NSMacOSCroatianStringEncoding = "Croate (Mac OS)"; NSMacOSIcelandicStringEncoding = "Islandais (Mac OS)"; NSMacOSRomanianStringEncoding = "Roumain (Mac OS)"; NSMacOSCelticStringEncoding = "Celte (Mac OS)"; NSMacOSGaelicStringEncoding = "Gaélique (Mac OS)"; NSMacOSKeyboardSymbolsStringEncoding = "Symboles du clavier (Mac OS)"; NSMacOSFarsiStringEncoding = "Persan (Mac OS)"; NSMacOSUkrainianStringEncoding = "Cyrillique (Mac OS Ukrainien)"; NSMacOSInuitStringEncoding = "Inuit (Mac OS)"; NSMacVT100StringEncoding = "Western (Mac VT100)"; NSMacHFSStringEncoding = "Occidental (Mac OS Roman)"; NSUTF7StringEncoding = "Unicode (UTF-7)"; NSISOLatin3StringEncoding = "Occidental (ISO Latin 3)"; NSISOLatin4StringEncoding = "Europe centrale (ISO Latin 4)"; NSISOCyrillicStringEncoding = "Cyrillique (ISO 8859-5)"; NSISOArabicStringEncoding = "Arabe (ISO 8859-6)"; NSISOGreekStringEncoding = "Grec (ISO 8859-7)"; NSISOHebrewStringEncoding = "Hébreu (ISO 8859-8)"; NSISOLatin5StringEncoding = "Turc (ISO Latin 5)"; NSISOLatin6StringEncoding = "Nordique (ISO Latin 6)"; NSISOThaiStringEncoding = "Thaïlandais (ISO 8859-11)"; NSISOLatin7StringEncoding = "Balte (ISO Latin 7)"; NSISOLatin8StringEncoding = "Celtique (ISO Latin 8)"; NSISOLatin9StringEncoding = "Occidental (ISO Latin 9)"; NSISOLatin10StringEncoding = "Roumain (ISO Latin 10)"; NSDOSLatinUSStringEncoding = "Latin EU (DOS)"; NSDOSGreekStringEncoding = "Grec (DOS)"; NSDOSBalticRimStringEncoding = "Balte (DOS)"; NSDOSLatin1StringEncoding = "Occidental (DOS Latin 1)"; NSDOSGreek1StringEncoding = "Grec (DOS Greek 1)"; NSDOSLatin2StringEncoding = "Europe centrale (DOS Latin 2)"; NSDOSCyrillicStringEncoding = "Cyrillique (DOS)"; NSDOSTurkishStringEncoding = "Turc (DOS)"; NSDOICortugueseStringEncoding = "Portugais (DOS)"; NSDOSIcelandicStringEncoding = "Islandais (DOS)"; NSDOSHebrewStringEncoding = "Hébreu (DOS)"; NSDOSCanadianFrenchStringEncoding = "Français canadien (DOS)"; NSDOSArabicStringEncoding = "Arabe (DOS)"; NSDOSNordicStringEncoding = "Nordique (DOS)"; NSDOSRussianStringEncoding = "Russe (DOS)"; NSDOSGreek2StringEncoding = "Grec (DOS Greek 2)"; NSDOSThaiStringEncoding = "Thaïlandais (Windows, DOS)"; NSDOSJapaneseStringEncoding = "Japonais (Windows, DOS)"; NSDOSChineseSimplifStringEncoding = "Chinois simplifié (Windows, DOS)"; NSDOSKoreanStringEncoding = "Coréen (Windows, DOS)"; NSDOSChineseTradStringEncoding = "Chinois traditionnel (Windows, DOS)"; NSWindowsLatin1StringEncoding = "Occidental (Windows Latin 1)"; NSWindowsLatin2StringEncoding = "Europe centrale (Windows Latin 2)"; NSWindowsCyrillicStringEncoding = "Cyrillique (Windows)"; NSWindowsGreekStringEncoding = "Grec (Windows)"; NSWindowsLatin5StringEncoding = "Turc (Windows Latin 5)"; NSWindowsHebrewStringEncoding = "Hébreu (Windows)"; NSWindowsArabicStringEncoding = "Arabe (Windows)"; NSWindowsBalticRimStringEncoding = "Balte (Windows)"; NSWindowsVietnameseStringEncoding = "Vietnamien (Windows)"; NSWindowsKoreanJohabStringEncoding = "Korean (Windows Johab)"; NSJIS_X0208_90StringEncoding = "Japanese (JIS X0208)"; NSShiftJIS_X0213StringEncoding = "Japonais (Shift JIS X0213)"; NSGB_2312_80StringEncoding = "Chinois simplifié (GB 2312)"; NSGBK_95StringEncoding = "Chinois (GBK)"; NSGB_18030_2000StringEncoding = "Chinois (GB 18030)"; NSKSC_5601_87StringEncoding = "Korean (KSC 5601-1987)"; NSISO2022JapaneseStringEncoding = "Japonais (ISO 2022-JP)"; NSISO2022Japanese2StringEncoding = "Japonais (ISO 2022-JP-2)"; NSISO2022Japanese1StringEncoding = "Japonais (ISO 2022-JP-1)"; NSISO2022Japanese3StringEncoding = "Japanese (ISO 2022-JP-3)"; NSISO2022ChineseStringEncoding = "Chinois (ISO 2022-CN)"; NSISO2022ExtendedChineseStringEncoding = "Chinese (ISO 2022-CN-EXT)"; NSISO2022KoreanStringEncoding = "Coréen (ISO 2022-KR)"; NSEUCJapaneseStringEncoding = "Japonais (EUC)"; NSEUCChineseStringEncoding = "Chinois simplifié (GB 2312)"; NSEUCTaiwanChineseStringEncoding = "Chinois traditionnel (EUC)"; NSEUCKoreanStringEncoding = "Coréen (EUC)"; NSChineseEUCStringEncoding = "Chinois simplifié (GB 2312)"; NSTaiwanChineseEUCStringEncoding = "Chinois traditionnel (EUC)"; NSKoreanEUCStringEncoding = "Coréen (EUC)"; NSKOI8RStringEncoding = "Cyrillique (KOI8-R)"; NSBig5StringEncoding = "Chinois traditionnel (Big 5)"; NSMacRomanLatin1StringEncoding = "Occidental (Mac Mail)"; NSHZ_GB_2312StringEncoding = "Chinois simplifié (HZ GB 2312)"; NSBig5_HKSCS_1999StringEncoding = "Chinois traditionnel (Big 5 HKSCS)"; NSKOI8UStringEncoding = "Ukrainien (KOI8-U)"; NSBig5EStringEncoding = "Chinois traditionnel (Big 5-E)"; NSNextStepLatinStringEncoding = "Occidental (NextStep)"; NSNextStepJapaneseStringEncoding = "Japanese (NextStep)"; NSEBCDICUSStringEncoding = "Occidental (EBCDIC Latin Core)"; NSEBCDICCP037StringEncoding = "Occidental (EBCDIC Latin 1)"; gnustep-base-1.29.0/Resources/GNUmakefile000066400000000000000000000055361435650067400202470ustar00rootroot00000000000000# # Resources makefile for GNUstep Base Library # Copyright (C) 2000 Free Software Foundation, Inc. # # Written by: Adam Fedor # Date: Oct 2000 # # This file is part of the GNUstep Base Library. # # 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 3 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 # Library General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free # Software Foundation, Inc., 51 Franklin Street, Fifth Floor, # Boston, MA 02111 USA. ifeq ($(GNUSTEP_MAKEFILES),) GNUSTEP_MAKEFILES := $(shell gnustep-config --variable=GNUSTEP_MAKEFILES 2>/dev/null) ifeq ($(GNUSTEP_MAKEFILES),) $(warning ) $(warning Unable to obtain GNUSTEP_MAKEFILES setting from gnustep-config!) $(warning Perhaps gnustep-make is not properly installed,) $(warning so gnustep-config is not in your PATH.) $(warning ) $(warning Your PATH is currently $(PATH)) $(warning ) endif endif ifeq ($(GNUSTEP_MAKEFILES),) $(error You need to set GNUSTEP_MAKEFILES before compiling!) endif PACKAGE_NAME = gnustep-base GNUSTEP_LOCAL_ADDITIONAL_MAKEFILES=../base.make include $(GNUSTEP_MAKEFILES)/common.make -include ../config.mak include ../Version libgnustep-base_INTERFACE_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION) RESOURCE_SET_NAME = base-resources ifeq ($(base-resources_INSTALL_DIR),) base-resources_INSTALL_DIR = $(GNUSTEP_LIBRARY)/Libraries/gnustep-base/Versions/$(libgnustep-base_INTERFACE_VERSION)/Resources endif base-resources_LANGUAGES = English German French Italian TraditionalChinese SimplifiedChinese \ Spanish Esperanto Korean Japanese base-resources_LOCALIZED_RESOURCE_FILES = Localizable.strings base-resources_RESOURCE_DIRS = Languages GSTLS base-resources_RESOURCE_FILES = \ $(LANGUAGE_INSTALL_FILES) \ $(GSTLS_INSTALL_FILES) LANGUAGE_FILES = \ Languages/Dutch \ Languages/English \ Languages/French \ Languages/German \ Languages/Hungarian \ Languages/Italian \ Languages/Polish \ Languages/Russian \ Languages/Spanish \ Languages/TraditionalChinese \ Languages/SimplifiedChinese \ Languages/Slovak \ Languages/Ukrainian \ Languages/Esperanto \ Languages/Korean \ Languages/Japanese LANGUAGE_INSTALL_FILES = $(LANGUAGE_FILES) Languages/Locale.aliases \ Languages/Locale.encodings Languages/Locale.canonical GSTLS_INSTALL_FILES = \ GSTLS/ca-certificates.crt include $(GNUSTEP_MAKEFILES)/resource-set.make -include GNUmakefile.postamble gnustep-base-1.29.0/Resources/GNUmakefile.postamble000066400000000000000000000030421435650067400222220ustar00rootroot00000000000000# # GNUmakefile.postamble # # Copyright (C) 2000 Free Software Foundation, Inc. # # Written: Adam Fedor # Date: Oct 2000 # # This file is part of the GNUstep Base Library. # # 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 3 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 # Library General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; see the file COPYING.LIB. # If not, write to the Free Software Foundation, # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Things to do before compiling # before-all:: # Things to do after compiling # after-all:: # Things to do before installing # before-install:: # Things to do after installing # after-install:: # Things to do before uninstalling # before-uninstall:: # Things to do after uninstalling # after-uninstall:: # Things to do before cleaning # before-clean:: # Things to do after cleaning # after-clean:: # Things to do before distcleaning # before-distclean:: # Things to do after distcleaning # after-distclean:: # Things to do before checking # before-check:: # Things to do after checking # after-check:: gnustep-base-1.29.0/Resources/GSTLS/000077500000000000000000000000001435650067400170605ustar00rootroot00000000000000gnustep-base-1.29.0/Resources/GSTLS/README000066400000000000000000000027561435650067400177520ustar00rootroot00000000000000 Files here are the fallbacks for TLS/SSL certificate verification. To find the certificate authority certificates the system looks in: The path specified by GSTLSCAFile (if that user default is defined), otherwise the path specified in the GS_TLS_CA_FILE environment variable if it is defined, otherwise the path specified in the SSL_CERT_FILE environment variable if it is defined, otherwise the file GSTLS/ca-certificates.crt in the base library resource bundle. Similarly to find the revoke file, the order of precedence of configuration is GSTLSRevokeFile, GS_TLS_REVOKE_FILE, GSTLS/revoke.crl ca-certificates.crt a list of PEM encoded certificates of trusted authorities NB. This is just the list of trusted authorities from my personal machine, it may not be suitable for you ... please replace/remove to meet your own needs. revoke.crl may be set to a revocation list for certificates which have been revoked by the trusted authorities. At present, no revocation list is provided. You may want to put keys here too ...if you have an openssl 'traditional' style key you may (depending on your version of gnutls: newer versions can read openssl specific keys) need to convert it to the standard PKCS8 format. You can use openssl to do that as follows: openssl pkcs8 -topk8 -v2 des3 -in old_key.pem -out new_key.pem You will be asked (3 times) for the password for the key, as the tool needs to decrypt it and encrypt it again in standard format. gnustep-base-1.29.0/Resources/GSTLS/ca-certificates.crt000066400000000000000000010201331435650067400226200ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDXTCCAkWgAwIBAgIDAOJCMA0GCSqGSIb3DQEBBQUAMFUxCzAJBgNVBAYTAkFU MRAwDgYDVQQKEwdBLVRydXN0MRkwFwYDVQQLExBBLVRydXN0LW5RdWFsLTAxMRkw FwYDVQQDExBBLVRydXN0LW5RdWFsLTAxMB4XDTA0MTEzMDIzMDAwMFoXDTE0MTEz MDIzMDAwMFowVTELMAkGA1UEBhMCQVQxEDAOBgNVBAoTB0EtVHJ1c3QxGTAXBgNV BAsTEEEtVHJ1c3QtblF1YWwtMDExGTAXBgNVBAMTEEEtVHJ1c3QtblF1YWwtMDEw ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQD/9RyAEZ6eHmhYzNJ328f0 jmdSUFi6EqRqOxb3jHNPTIpK82CR6z5lmSnZQNUuCPD+htbNZffd2DKVB06NOyZ1 2zcOMCgj4GtkZoqE0zPpPT3bpoE55nkZZe/qWEX/64wz/L/4EdkvKDSKG/UsP75M tmCVY5m2Eg73RVFRz4ccBIMpHel4lzEqSkdDtZOY5fnkrE333hx67nxq21vY8Eyf 8O4fPQ5RtN8eohQCcPQ1z6ypU1R7N9jPRpnI+yzMOiwd3+QcKhHi1miCzo0pkOaB 1CwmfsTyNl8qU0NJUL9Ta6cea7WThwTiWol2yD88cd2cy388xpbNkfrCPmZNGLoV AgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECE5ZzscCMocwMA4G A1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEA69I9R1hU9Gbl9vV7W7AH QpUJAlFAvv2It/eY8p2ouQUPVaSZikaKtAYrCD/arzfXB43Qet+dM6CpHsn8ikYR vQKePjXv3Evf+C1bxwJAimcnZV6W+bNOTpdo8lXljxkmfN+Z5S+XzvK2ttUtP4Et YOVaxHw2mPMNbvDeY+foJkiBn3KYjGabMaR8moZqof5ofj4iS/WyamTZti6v/fKx n1vII+/uWkcxV5DT5+r9HLon0NYF0Vg317Wh+gWDV59VZo+dcwJDb+keYqMFYoqp 77SGkZGu41S8NGYkQY3X9rNHRkDbLfpKYDmy6NanpOE1EHW1/sNSFAs43qZZKJEQ xg== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJB VDFIMEYGA1UECgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBp bSBlbGVrdHIuIERhdGVudmVya2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5R dWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5RdWFsLTAzMB4XDTA1MDgxNzIyMDAw MFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgwRgYDVQQKDD9BLVRy dXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0ZW52 ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMM EEEtVHJ1c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB AQCtPWFuA/OQO8BBC4SAzewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUj lUC5B3ilJfYKvUWG6Nm9wASOhURh73+nyfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZ znF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPESU7l0+m0iKsMrmKS1GWH 2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4iHQF63n1 k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs 2e3Vcuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYD VR0OBAoECERqlWdVeRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC AQEAVdRU0VlIXLOThaq/Yy/kgM40ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fG KOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmrsQd7TZjTXLDR8KdCoLXEjq/+ 8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZdJXDRZslo+S4R FGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmE DNuxUCAKGkq6ahq97BvIxYSazQ== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEUzCCAzugAwIBAgIDAOJDMA0GCSqGSIb3DQEBBQUAMIHPMQswCQYDVQQGEwJB VDGBizCBiAYDVQQKHoGAAEEALQBUAHIAdQBzAHQAIABHAGUAcwAuACAAZgD8AHIA IABTAGkAYwBoAGUAcgBoAGUAaQB0AHMAcwB5AHMAdABlAG0AZQAgAGkAbQAgAGUA bABlAGsAdAByAC4AIABEAGEAdABlAG4AdgBlAHIAawBlAGgAcgAgAEcAbQBiAEgx GDAWBgNVBAsTD0EtVHJ1c3QtUXVhbC0wMTEYMBYGA1UEAxMPQS1UcnVzdC1RdWFs LTAxMB4XDTA0MTEzMDIzMDAwMFoXDTE0MTEzMDIzMDAwMFowgc8xCzAJBgNVBAYT AkFUMYGLMIGIBgNVBAoegYAAQQAtAFQAcgB1AHMAdAAgAEcAZQBzAC4AIABmAPwA cgAgAFMAaQBjAGgAZQByAGgAZQBpAHQAcwBzAHkAcwB0AGUAbQBlACAAaQBtACAA ZQBsAGUAawB0AHIALgAgAEQAYQB0AGUAbgB2AGUAcgBrAGUAaAByACAARwBtAGIA SDEYMBYGA1UECxMPQS1UcnVzdC1RdWFsLTAxMRgwFgYDVQQDEw9BLVRydXN0LVF1 YWwtMDEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCmhgdxIbxTGEOH fXGiewI3NFldAWKFWfLofO+5I1UbvA5avt7IgsGXz/tI/f5HGUbascI0i7xG0tqV lA5ctQgLRqxgxHtgTkMcqsAEYdsz3LZsCdXO1QrvEBGLTSABdxiL/gSWJ6z77CSw x7Xg02HwxPV82cjGkSF3ENGJntuIAAnRDWn/ORHjFatNRymoMbHaOEZXSGhf7Y5F rrHEqGyi9E6sv784De/T1aTvskn8cWeUmDzv//omiG/a/V9KQex/61XN8OthUQVn X+u/liL2NKx74I2C/GgHX5B0WkPNqsSOgmlvJ/cKuT0PveUgVFDAA0oYBgcE1KDM lBbN0kmPAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECEs8jB2F 6W+tMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAIUusmJzMJRiQ 8TAHrJAOelfuWoTGcqdIv7Tys/fNl2yF2fjvHT8J01aKialFVpbVeQ2XKb1O2bHO QYAKgsdZ2jZ/sdL2UVFRTHmidLu6PdgWCBRhJYQELQophO9QVvfhAA0TwbESYqTz +nlI5Gr7CZe8f6HEmhJmCtUQsdQCufGglRh4T+tIGiNGcnyVEHZ93mSVepFr1VA2 9CTRPteuGjA81jeAz9peYiFE1CXvxK9cJiv0BcALFLWmADCoRLzIRZhA+sAwYUmw M1rqVCPA3kBQvIC95tyQvNy2dG0Vs+O6PwLaNX/suSlElQ06X2l1VwMaYb4vZKFq N0bOhBXEVg== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDyzCCArOgAwIBAgIDAOJIMA0GCSqGSIb3DQEBBQUAMIGLMQswCQYDVQQGEwJB VDFIMEYGA1UECgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBp bSBlbGVrdHIuIERhdGVudmVya2VociBHbWJIMRgwFgYDVQQLDA9BLVRydXN0LVF1 YWwtMDIxGDAWBgNVBAMMD0EtVHJ1c3QtUXVhbC0wMjAeFw0wNDEyMDIyMzAwMDBa Fw0xNDEyMDIyMzAwMDBaMIGLMQswCQYDVQQGEwJBVDFIMEYGA1UECgw/QS1UcnVz dCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy a2VociBHbWJIMRgwFgYDVQQLDA9BLVRydXN0LVF1YWwtMDIxGDAWBgNVBAMMD0Et VHJ1c3QtUXVhbC0wMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJaR q9eOsFm4Ab20Hq2Z/aH86gyWa48uSUjY6eQkguHYuszr3gdcSMYZggFHQgnhfLmf ro/27l5rqKhWiDhWs+b+yZ1PNDhRPJy+86ycHMg9XJqErveULBSyZDdgjhSwOyrN ibUir/fkf+4sKzP5jjytTKJXD/uCxY4fAd9TjMEVpN3umpIS0ijpYhclYDHvzzGU 833z5Dwhq5D8bc9jp8YSAHFJ1xzIoO1jmn3jjyjdYPnY5harJtHQL73nDQnfbtTs 5ThT9GQLulrMgLU4WeyAWWWEMWpfVZFMJOUkmoOEer6A8e5fIAeqdxdsC+JVqpZ4 CAKel/Arrlj1gFA//jsCAwEAAaM2MDQwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4E CgQIQj0rJKbBRc4wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBG yxFjUA2bPkXUSC2SfJ29tmrbiLKal+g6a9M8Xwd+Ejo+oYkNP6F4GfeDtAXpm7xb 9Ly8lhdbHcpRhzCUQHJ1tBCiGdLgmhSx7TXjhhanKOdDgkdsC1T+++piuuYL72TD gUy2Sb1GHlJ1Nc6rvB4fpxSDAOHqGpUq9LWsc3tFkXqRqmQVtqtR77npKIFBioc6 2jTBwDMPX3hDJDR1DSPc6BnZliaNw2IHdiMQ0mBoYeRnFdq+TyDKsjmJOOQPLzzL /saaw6F891+gBjLFEFquDyR73lAPJS279R3csi8WWk4ZYUC/1V8H3Ktip/J6ac8e qhLCbmJ81Lo92JGHz/ot -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe 3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsx CzAJBgNVBAYTAkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRp ZmljYWNpw7NuIERpZ2l0YWwgLSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwa QUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4wHhcNMDYxMTI3MjA0NjI5WhcNMzAw NDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+U29jaWVkYWQgQ2Ft ZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJhIFMu QS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkq hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeG qentLhM0R7LQcNzJPNCNyu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzL fDe3fezTf3MZsGqy2IiKLUV0qPezuMDU2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQ Y5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU34ojC2I+GdV75LaeHM/J4 Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP2yYe68yQ 54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+b MMCm8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48j ilSH5L887uvDdUhfHjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++Ej YfDIJss2yKHzMI+ko6Kh3VOz3vCaMh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/zt A/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK5lw1omdMEWux+IBkAC1vImHF rEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1bczwmPS9KvqfJ pxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCB lTCBkgYEVR0gADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFy YS5jb20vZHBjLzBaBggrBgEFBQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW50 7WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2UgcHVlZGVuIGVuY29udHJhciBlbiBs YSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEfAygPU3zmpFmps4p6 xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuXEpBc unvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/ Jre7Ir5v/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dp ezy4ydV/NgIlqmjCMRW3MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42 gzmRkBDI8ck1fj+404HGIGQatlDCIaR43NAvO2STdPCWkPHv+wlaNECW8DYSwaN0 jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wkeZBWN7PGKX6jD/EpOe9+ XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f/RWmnkJD W2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/ RL5hRqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35r MDOhYil/SrnhLecUIw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxk BYn8eNZcLCZDqQ== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEU MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMw MTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYD VQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA A4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ul CDtbKRY654eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6n tGO0/7Gcrjyvd7ZWxbWroulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyl dI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJch PXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC +Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0O BBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8E BTADAQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBl MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENB IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0MkhHma6X 7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0PhiVYrqW9yTkkz 43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJl pz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOA WiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEU MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAx MDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtB ZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIDAeBgNV BAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV 6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nX GCwwfQ56HmIexkvA/X1id9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnP dzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH 1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF 62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQW BBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw AwEB/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDEL MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJv b3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmuG7jD8WS6 IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL+YPoRNWyQSW/ iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh 4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQm XiLsks3/QppEIW1cxeMiHV9HEufOX1362KqxMy3ZdvJOOjMMK7MtkAY= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEU MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1 MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYTAlNFMRQwEgYDVQQK EwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIzAh BgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG9w0B AQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwq xBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G 87B4pfYOQnrjfxvM0PC3KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i 2O+tCBGaKZnhqkRFmhJePp1tUvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8U WfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c1 0cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0G A1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0T AQH/BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6Fr pGkwZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlm aWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2VhlRO6aQTv hsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxGGuoYQ992zPlm hpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3 P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9Y iQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5no xqE= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIFVTCCBD2gAwIBAgIEO/OB0DANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQGEwJj aDEOMAwGA1UEChMFYWRtaW4xETAPBgNVBAsTCFNlcnZpY2VzMSIwIAYDVQQLExlD ZXJ0aWZpY2F0aW9uIEF1dGhvcml0aWVzMRYwFAYDVQQDEw1BZG1pbi1Sb290LUNB MB4XDTAxMTExNTA4NTEwN1oXDTIxMTExMDA3NTEwN1owbDELMAkGA1UEBhMCY2gx DjAMBgNVBAoTBWFkbWluMREwDwYDVQQLEwhTZXJ2aWNlczEiMCAGA1UECxMZQ2Vy dGlmaWNhdGlvbiBBdXRob3JpdGllczEWMBQGA1UEAxMNQWRtaW4tUm9vdC1DQTCC ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMvgr0QUIv5qF0nyXZ3PXAJi C4C5Wr+oVTN7oxIkXkxvO0GJToM9n7OVJjSmzBL0zJ2HXj0MDRcvhSY+KiZZc6Go vDvr5Ua481l7ILFeQAFtumeza+vvxeL5Nd0Maga2miiacLNAKXbAcUYRa0Ov5VZB ++YcOYNNt/aisWbJqA2y8He+NsEgJzK5zNdayvYXQTZN+7tVgWOck16Da3+4FXdy fH1NCWtZlebtMKtERtkVAaVbiWW24CjZKAiVfggjsiLo3yVMPGj3budLx5D9hEEm vlyDOtcjebca+AcZglppWMX/iHIrx7740y0zd6cWEqiLIcZCrnpkr/KzwO135GkC AwEAAaOCAf0wggH5MA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIASBkTCBjjCBiwYI YIV0AREDAQAwfzArBggrBgEFBQcCAjAfGh1UaGlzIGlzIHRoZSBBZG1pbi1Sb290 LUNBIENQUzBQBggrBgEFBQcCARZEaHR0cDovL3d3dy5pbmZvcm1hdGlrLmFkbWlu LmNoL1BLSS9saW5rcy9DUFNfMl8xNl83NTZfMV8xN18zXzFfMC5wZGYwfwYDVR0f BHgwdjB0oHKgcKRuMGwxFjAUBgNVBAMTDUFkbWluLVJvb3QtQ0ExIjAgBgNVBAsT GUNlcnRpZmljYXRpb24gQXV0aG9yaXRpZXMxETAPBgNVBAsTCFNlcnZpY2VzMQ4w DAYDVQQKEwVhZG1pbjELMAkGA1UEBhMCY2gwHQYDVR0OBBYEFIKf+iNzIPGXi7JM Tb5CxX9mzWToMIGZBgNVHSMEgZEwgY6AFIKf+iNzIPGXi7JMTb5CxX9mzWTooXCk bjBsMQswCQYDVQQGEwJjaDEOMAwGA1UEChMFYWRtaW4xETAPBgNVBAsTCFNlcnZp Y2VzMSIwIAYDVQQLExlDZXJ0aWZpY2F0aW9uIEF1dGhvcml0aWVzMRYwFAYDVQQD Ew1BZG1pbi1Sb290LUNBggQ784HQMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0B AQUFAAOCAQEAeE96XCYRpy6umkPKXDWCRn7INo96ZrWpMggcDORuofHIwdTkgOeM vWOxDN/yuT7CC3FAaUajbPRbDw0hRMcqKz0aC8CgwcyIyhw/rFK29mfNTG3EviP9 QSsEbnelFnjpm1wjz4EaBiFjatwpUbI6+Zv3XbEt9QQXBn+c6DeFLe4xvC4B+MTr a440xTk59pSYux8OHhEvqIwHCkiijGqZhTS3KmGFeBopaR+dJVBRBMoXwzk4B3Hn 0Zib1dEYFZa84vPJZyvxCbLOnPRDJgH6V2uQqbG+6DXVaf/wORVOvF/wzzv0viM/ RWbEtJZdvo8N3sdtCULzifnxP/V0T9+4ZQ== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIETTCCAzWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBtMQswCQYDVQQGEwJDSDEO MAwGA1UEChMFYWRtaW4xETAPBgNVBAsTCFNlcnZpY2VzMSIwIAYDVQQLExlDZXJ0 aWZpY2F0aW9uIEF1dGhvcml0aWVzMRcwFQYDVQQDEw5BZG1pbkNBLUNELVQwMTAe Fw0wNjAxMjUxMzM2MTlaFw0xNjAxMjUxMjM2MTlaMG0xCzAJBgNVBAYTAkNIMQ4w DAYDVQQKEwVhZG1pbjERMA8GA1UECxMIU2VydmljZXMxIjAgBgNVBAsTGUNlcnRp ZmljYXRpb24gQXV0aG9yaXRpZXMxFzAVBgNVBAMTDkFkbWluQ0EtQ0QtVDAxMIIB IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0jQlMZmpLDhV+GNR9TAoSNle JgQB4xAXJELQf5/ySMfoFA4MmjKqYXQkB6MGPuQKwR9XRRSPf61vqb8YPsdjRmgp byHBcUd5t0N8RX6wRZUnPMW+bCCo2VqAU4XFbnlc2gHKaam0wdTtbBTXEkv0ieIH fxCfFxXqSsSr60IkF/2/xbrAgV/QD5yHk6Ie8feAVWwi5UtaFqtu4LiFEh2QMyxs Oyz1OcvKzkM2g873tyiE7jzMgZP+Ww3tibk2F9+e6ZeiB37TLOmVtvgpmrws4fiI rFNXEYSWBVrUTbn81U47yWzOgf5fEHP07bRV5QOCzCm99qNimsbL6CG7nT78CQID AQABo4H3MIH0MBIGA1UdEwEB/wQIMAYBAf8CAQAwga4GA1UdIASBpjCBozCBoAYI YIV0AREDFQEwgZMwSAYIKwYBBQUHAgIwPBo6VGhpcyBpcyB0aGUgQWRtaW5DQS1D RC1UMDEgQ2VydGlmaWNhdGUgUHJhY3RpY2UgU3RhdGVtZW50LjBHBggrBgEFBQcC ARY7aHR0cDovL3d3dy5wa2kuYWRtaW4uY2gvcG9saWN5L0NQU18yXzE2Xzc1Nl8x XzE3XzNfMjFfMS5wZGYwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBQqxGkKocZV xgNucM6GgbOkD6oZ2zANBgkqhkiG9w0BAQUFAAOCAQEAn356bbusjI5glGXRQ1DR v21qQf0S4s3GHyZm7cqdOkFleM70ArBT+kOP5Nm7rlSAFyVgEkmBdOg7s9tlXClU yeZFnp6UEYRUcijPN8D1VaNRK6PIUObpDBQT0C+kAfxG9z4v29T0SxT4sgAdC/xQ Fyv58Fp9bPn7owuKwKcyCH1XSyi/Bp4XFELlLOaigBZO/w+dPBz4FcJSdZjU+BaJ 0E3nKAjHlShO5ouBSZnaJz3p+nkw2Wyo36s6GxCK0XbkSP45iniIG4FmwwZkonYF ypQntHbx2oL7tUQQY0PDo8bGBMcPy/G2j+dciqZRlsnfgMy10SCzQ9MUx92xUG2V eg== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp 6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ +jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S 5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B 8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc 0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e KeC2uAloGRwYQw== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D 0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2 MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP ADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lk hsmj76CGv2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym 1BW32J/X3HGrfpq/m44zDyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsW OqMFf6Dch9Wc/HKpoH145LcxVR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb 2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQko O3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUw AwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAU AK3Zo/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB BQUAA4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF Zu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAb LjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTIdGcL+oir oQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43gKd8hdIaC2y+C MMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2 MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP ADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC 206B89enfHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFci KtZHgVdEglZTvYYUAQv8f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2 JxhP7JsowtS013wMPgwr38oE18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9 BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7e Xz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8B PeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67 Xnfn6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEq Z8A9W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ o2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3 +L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124HhnAgMBAAGj YzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3OpaaEg5+31IqEj FNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmn xPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2 LHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzccc obGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXgJXUjhx5c3LqdsKyzadsXg8n33gy8 CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMe IjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMA DjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2F AjgQ5ANh1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUX Om/9riW99XJZZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPb AZO1XB4Y3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQl Zvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw RY8mkaKO/qk= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIID5jCCAs6gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMCVVMx HTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNBbWVyaWNh IE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIgUm9vdCBDZXJ0 aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyOTA2MDAwMFoXDTM3MTEyMDE1 MDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBT0wgVGltZSBXYXJuZXIg SW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUgSW5jLjE3MDUGA1UEAxMuQU9M IFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnej8Mlo2k06AX3dLm/WpcZuS+U 0pPlLYnKhHw/EEMbjIt8hFj4JHxIzyr9wBXZGH6EGhfT257XyuTZ16pYUYfw8ItI TuLCxFlpMGK2MKKMCxGZYTVtfu/FsRkGIBKOQuHfD5YQUqjPnF+VFNivO3ULMSAf RC+iYkGzuxgh28pxPIzstrkNn+9R7017EvILDOGsQI93f7DKeHEMXRZxcKLXwjqF zQ6axOAAsNUl6twr5JQtOJyJQVdkKGUZHLZEtMgxa44Be3ZZJX8VHIQIfHNlIAqh BC4aMqiaILGcLCFZ5/vP7nAtCMpjPiybkxlqpMKX/7eGV4iFbJ4VFitNLLMCAwEA AaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUoTYwFsuGkABFgFOxj8jY PXy+XxIwHwYDVR0jBBgwFoAUoTYwFsuGkABFgFOxj8jYPXy+XxIwDgYDVR0PAQH/ BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQCKIBilvrMvtKaEAEAwKfq0FHNMeUWn 9nDg6H5kHgqVfGphwu9OH77/yZkfB2FK4V1Mza3u0FIy2VkyvNp5ctZ7CegCgTXT Ct8RHcl5oIBN/lrXVtbtDyqvpxh1MwzqwWEFT2qaifKNuZ8u77BfWgDrvq2g+EQF Z7zLBO+eZMXpyD8Fv8YvBxzDNnGGyjhmSs3WuEvGbKeXO/oTLW4jYYehY0KswsuX n2Fozy1MBJ3XJU8KDk2QixhWqJNIV9xvrr2eZ1d3iVCzvhGbRWeDhhmH05i9CBoW H1iCC+GWaQVLjuyDUTEH1dSf/1l7qG6Fz9NLqUmwX7A5KGgOc90lmt4S -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIF5jCCA86gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMCVVMx HTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNBbWVyaWNh IE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIgUm9vdCBDZXJ0 aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyOTA2MDAwMFoXDTM3MDkyODIz NDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBT0wgVGltZSBXYXJuZXIg SW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUgSW5jLjE3MDUGA1UEAxMuQU9M IFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIw DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALQ3WggWmRToVbEbJGv8x4vmh6mJ 7ouZzU9AhqS2TcnZsdw8TQ2FTBVsRotSeJ/4I/1n9SQ6aF3Q92RhQVSji6UI0ilb m2BPJoPRYxJWSXakFsKlnUWsi4SVqBax7J/qJBrvuVdcmiQhLE0OcR+mrF1FdAOY xFSMFkpBd4aVdQxHAWZg/BXxD+r1FHjHDtdugRxev17nOirYlxcwfACtCJ0zr7iZ YYCLqJV+FNwSbKTQ2O9ASQI2+W6p1h2WVgSysy0WVoaP2SBXgM1nEG2wTPDaRrbq JS5Gr42whTg0ixQmgiusrpkLjhTXUr2eacOGAgvqdnUxCc4zGSGFQ+aJLZ8lN2fx I2rSAG2X+Z/nKcrdH9cG6rjJuQkhn8g/BsXS6RJGAE57COtCPStIbp1n3UsC5ETz kxmlJ85per5n0/xQpCyrw2u544BMzwVhSyvcG7mm0tCq9Stz+86QNZ8MUhy/XCFh EVsVS6kkUfykXPcXnbDS+gfpj1bkGoxoigTTfFrjnqKhynFbotSg5ymFXQNoKk/S Btc9+cMDLz9l+WceR0DTYw/j1Y75hauXTLPXJuuWCpTehTacyH+BCQJJKg71ZDIM gtG6aoIbs0t0EfOMd9afv9w3pKdVBC/UMejTRrkDfNoSTllkt1ExMVCgyhwn2RAu rda9EGYrw7AiShJbAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE FE9pbQN+nZ8HGEO8txBO1b+pxCAoMB8GA1UdIwQYMBaAFE9pbQN+nZ8HGEO8txBO 1b+pxCAoMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAO/Ouyugu h4X7ZVnnrREUpVe8WJ8kEle7+z802u6teio0cnAxa8cZmIDJgt43d15Ui47y6mdP yXSEkVYJ1eV6moG2gcKtNuTxVBFT8zRFASbI5Rq8NEQh3q0l/HYWdyGQgJhXnU7q 7C+qPBR7V8F+GBRn7iTGvboVsNIYvbdVgaxTwOjdaRITQrcCtQVBynlQboIOcXKT RuidDV29rs4prWPVVRaAMCf/drr3uNZK49m1+VLQTkCpx+XCMseqdiThawVQ68W/ ClTluUI8JPu3B5wwn3la5uBAUhX0/Kr0VvlEl4ftDmVyXr4m+02kLQgH3thcoNyB M5kYJRF3p+v9WAksmWsbivNSPxpNSGDxoPYzAlOL7SUJuA0t7Zdz7NeWH45gDtoQ my8YJPamTQr5O8t1wswvziRpyQoijlmn94IM19drNZxDAGrElWe6nEXLuA4399xO AU++CrYD062KRffaJ00psUjf5BHklka9bAI+1lHIlRcBFanyqqryvy9lG2/QuRqT 9Y41xICHPpQvZuTpqP9BnHAqTyo5GJUefvthATxRCC4oGKQWDzH9OmwjkyB24f0H hdFbP9IcczLd+rn4jM8Ch3qaluTtT4mNU0OrDhPAARW0eTjb/G49nlG2uBOLZ8/5 fNkiHfZdxRwBL5joeiQYvITX+txyW/fBOmg= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEuzCCA6OgAwIBAgIBAjANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQGEwJVUzET MBEGA1UEChMKQXBwbGUgSW5jLjEmMCQGA1UECxMdQXBwbGUgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkxFjAUBgNVBAMTDUFwcGxlIFJvb3QgQ0EwHhcNMDYwNDI1MjE0 MDM2WhcNMzUwMjA5MjE0MDM2WjBiMQswCQYDVQQGEwJVUzETMBEGA1UEChMKQXBw bGUgSW5jLjEmMCQGA1UECxMdQXBwbGUgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx FjAUBgNVBAMTDUFwcGxlIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw ggEKAoIBAQDkkakJH5HbHkdQ6wXtXnmELes2oldMVeyLGYne+Uts9QerIjAC6Bg+ +FAJ039BqJj50cpmnCRrEdCju+QbKsMflZ56DKRHi1vUFjczy8QPTc4UadHJGXL1 XQ7Vf1+b8iUDulWPTV0N8WQ1IxVLFVkds5T39pyez1C6wVhQZ48ItCD3y6wsIG9w tj8BMIy3Q88PnT3zK0koGsj+zrW5DtleHNbLPbU6rfQPDgCSC7EhFi501TwN22IW q6NxkkdTVcGvL0Gz+PvjcM3mo0xFfh9Ma1CWQYnEdGILEINBhzOKgbEwWOxaBDKM aLOPHd5lc/9nXmW8Sdh2nzMUZaF3lMktAgMBAAGjggF6MIIBdjAOBgNVHQ8BAf8E BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUK9BpR5R2Cf70a40uQKb3 R01/CF4wHwYDVR0jBBgwFoAUK9BpR5R2Cf70a40uQKb3R01/CF4wggERBgNVHSAE ggEIMIIBBDCCAQAGCSqGSIb3Y2QFATCB8jAqBggrBgEFBQcCARYeaHR0cHM6Ly93 d3cuYXBwbGUuY29tL2FwcGxlY2EvMIHDBggrBgEFBQcCAjCBthqBs1JlbGlhbmNl IG9uIHRoaXMgY2VydGlmaWNhdGUgYnkgYW55IHBhcnR5IGFzc3VtZXMgYWNjZXB0 YW5jZSBvZiB0aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5kYXJkIHRlcm1zIGFuZCBj b25kaXRpb25zIG9mIHVzZSwgY2VydGlmaWNhdGUgcG9saWN5IGFuZCBjZXJ0aWZp Y2F0aW9uIHByYWN0aWNlIHN0YXRlbWVudHMuMA0GCSqGSIb3DQEBBQUAA4IBAQBc NplMLXi37Yyb3PN3m/J20ncwT8EfhYOFG5k9RzfyqZtAjizUsZAS2L70c5vu0mQP y3lPNNiiPvl4/2vIB+x9OYOLUyDTOMSxv5pPCmv/K/xZpwUJfBdAVhEedNO3iyM7 R6PVbyTi69G3cN8PReEnyvFteO3ntRcXqNx+IjXKJdXZD9Zr1KIkIxH3oayPc4Fg xhtbCS+SsvhESPBgOJ4V9T0mZyCKM2r3DYLP3uujL/lTaltkwGMzd/c6ByxW69oP IQ7aunMZT7XZNn/Bh1XZp5m5MkL72NVxnn6hUrcbvZNCJBIqxw8dtk2cXmPIS4AX UKqK1drk/NAJBzewdXUh -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIFujCCBKKgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhjELMAkGA1UEBhMCVVMx HTAbBgNVBAoTFEFwcGxlIENvbXB1dGVyLCBJbmMuMS0wKwYDVQQLEyRBcHBsZSBD b21wdXRlciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxKTAnBgNVBAMTIEFwcGxlIFJv b3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MB4XDTA1MDIxMDAwMTgxNFoXDTI1MDIx MDAwMTgxNFowgYYxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBcHBsZSBDb21wdXRl ciwgSW5jLjEtMCsGA1UECxMkQXBwbGUgQ29tcHV0ZXIgQ2VydGlmaWNhdGUgQXV0 aG9yaXR5MSkwJwYDVQQDEyBBcHBsZSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOSRqQkfkdseR1DrBe1e eYQt6zaiV0xV7IsZid75S2z1B6siMALoGD74UAnTf0GomPnRymacJGsR0KO75Bsq wx+VnnoMpEeLW9QWNzPLxA9NzhRp0ckZcvVdDtV/X5vyJQO6VY9NXQ3xZDUjFUsV WR2zlPf2nJ7PULrBWFBnjwi0IPfLrCwgb3C2PwEwjLdDzw+dPfMrSSgayP7OtbkO 2V4c1ss9tTqt9A8OAJILsSEWLnTVPA3bYharo3GSR1NVwa8vQbP4++NwzeajTEV+ H0xrUJZBicR0YgsQg0GHM4qBsTBY7FoEMoxos48d3mVz/2deZbxJ2HafMxRloXeU yS0CAwEAAaOCAi8wggIrMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ MB0GA1UdDgQWBBQr0GlHlHYJ/vRrjS5ApvdHTX8IXjAfBgNVHSMEGDAWgBQr0GlH lHYJ/vRrjS5ApvdHTX8IXjCCASkGA1UdIASCASAwggEcMIIBGAYJKoZIhvdjZAUB MIIBCTBBBggrBgEFBQcCARY1aHR0cHM6Ly93d3cuYXBwbGUuY29tL2NlcnRpZmlj YXRlYXV0aG9yaXR5L3Rlcm1zLmh0bWwwgcMGCCsGAQUFBwICMIG2GoGzUmVsaWFu Y2Ugb24gdGhpcyBjZXJ0aWZpY2F0ZSBieSBhbnkgcGFydHkgYXNzdW1lcyBhY2Nl cHRhbmNlIG9mIHRoZSB0aGVuIGFwcGxpY2FibGUgc3RhbmRhcmQgdGVybXMgYW5k IGNvbmRpdGlvbnMgb2YgdXNlLCBjZXJ0aWZpY2F0ZSBwb2xpY3kgYW5kIGNlcnRp ZmljYXRpb24gcHJhY3RpY2Ugc3RhdGVtZW50cy4wRAYDVR0fBD0wOzA5oDegNYYz aHR0cHM6Ly93d3cuYXBwbGUuY29tL2NlcnRpZmljYXRlYXV0aG9yaXR5L3Jvb3Qu Y3JsMFUGCCsGAQUFBwEBBEkwRzBFBggrBgEFBQcwAoY5aHR0cHM6Ly93d3cuYXBw bGUuY29tL2NlcnRpZmljYXRlYXV0aG9yaXR5L2Nhc2lnbmVycy5odG1sMA0GCSqG SIb3DQEBBQUAA4IBAQCd2i0oWC99dgS5BNM+zrdmY06PL9T+S61yvaM5xlJNBZhS 9YlRASR5vhoy9+VEi0tEBzmC1lrKtCBe2a4VXR2MHTK/ODFiSF3H4ZCx+CRA+F9Y m1FdV53B5f88zHIhbsTp6aF31ywXJsM/65roCwO66bNKcuszCVut5mIxauivL9Wv Hld2j383LS4CXN1jyfJxuCZA3xWNdUQ/eb3mHZnhQyw+rW++uaT+DjUZUWOxw961 kj5ReAFziqQjyqSI8R5cH0EWLX6VCqrpiUGYGxrdyyC/R14MJsVVNU3GMIuZZxTH CR+6R8faAQmHJEKVvRNgGQrv6n8Obs3BREM6StXj -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJKUDEO MAwGA1UEChMFTEdQS0kxGjAYBgNVBAsTEUFwcGxpY2F0aW9uIENBIEcyMB4XDTA2 MDMzMTE1MDAwMFoXDTE2MDMzMTE0NTk1OVowOTELMAkGA1UEBhMCSlAxDjAMBgNV BAoTBUxHUEtJMRowGAYDVQQLExFBcHBsaWNhdGlvbiBDQSBHMjCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBALk1xhD422jbB8RATLAdHjbcw0H2z1UVbQh/ XMZoVeXnV/GWUebhTXgPbkAVcDtl/hHf59PWWDU74Z8C/JRSRi6znmCbAp7JgtL2 464JT4REtmKbAFFouDqt7GTRMkvplESDtA7OIYlrsDbAmMZLnMI+W2AqCTErLatM 3rGg/VhWwoMdILzEhAmHe6iVl8YljoPgPpMN0cd9c6mo/BkAQC4iuHozQfV4/Vpx 54LZSIhc7KiFhy1tgIlnGmm+EMBaju2IfT5vLDhrN85H2KIxMN5+U2Vsi4ZTQSBs vUilfq8AWlYSWIHR3IlZ+bXu+E2a2EQpi3mn9yKq6nxctBaIIA0CAwEAAaOBsjCB rzAdBgNVHQ4EFgQUf7hdjsQYa8Z9zC7prs405xdd4KEwDgYDVR0PAQH/BAQDAgEG MEwGA1UdHwRFMEMwQaA/oD2kOzA5MQswCQYDVQQGEwJKUDEOMAwGA1UEChMFTEdQ S0kxGjAYBgNVBAsTEUFwcGxpY2F0aW9uIENBIEcyMA8GA1UdEwEB/wQFMAMBAf8w HwYDVR0jBBgwFoAUf7hdjsQYa8Z9zC7prs405xdd4KEwDQYJKoZIhvcNAQEFBQAD ggEBADzYczZABkhKVBn1J0g5JaVuQue2zRvLOTS3m+xPKr535MqE/B3rmyJA1fT7 aIdy/Eddag5SSuO1XUjGIpbmM21tq/bN18skWoyoRZ4+YYJ9lNUF8Bo1X3EvLlS1 QQXvhg1S75yYG/EsTDrR84bTjD56L4ZFjoMyJlu/U8oOUVbcmsJaMBkNp57Vqpsg OWl4IfSXbdEOEUwu0xtasPmXeFwqj1Jl7kxCJcI3MA5tKzWUgwbor0U7BGanMLv5 4CE7Y259RF06alPvERck/VSyWmxzViHJbC2XpEKzJ2EFIWNt6ii8TxpvQtyYq1XT HhvAkj+bweY7F1bixJhDJe62ywA= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEc MBoGA1UEChMTSmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRp b25DQTAeFw0wNzEyMTIxNTAwMDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYT AkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zlcm5tZW50MRYwFAYDVQQLEw1BcHBs aWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp23gdE6H j6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4fl+K f5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55 IrmTwcrNwVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cw FO5cjFW6WY2H/CPek9AEjP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDiht QWEjdnjDuGWk81quzMKq2edY3rZ+nYVunyoKb58DKTCXKB28t89UKU5RMfkntigm /qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRUWssmP3HMlEYNllPqa0jQ k/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNVBAYTAkpQ MRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOC seODvOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD ggEBADlqRHZ3ODrso2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJ hyzjVOGjprIIC8CFqMjSnHH2HZ9g/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+ eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYDio+nEhEMy/0/ecGc/WLuo89U DNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmWdupwX3kSa+Sj B1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL rosot4LKGAfmt1t06SAZf7IbiVQ= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF 6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF 661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9 am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1 ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481 PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS 3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF 3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDlDCCAnygAwIBAgIQWAsFbFMk27JQVxhf+eWmUDANBgkqhkiG9w0BAQUFADAn MQswCQYDVQQGEwJCRTEYMBYGA1UEAxMPQmVsZ2l1bSBSb290IENBMB4XDTAzMDEy NjIzMDAwMFoXDTE0MDEyNjIzMDAwMFowJzELMAkGA1UEBhMCQkUxGDAWBgNVBAMT D0JlbGdpdW0gUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB AMihcekcRkJ5eHFvna6pqKsot03HIOswkVp19eLSz8hMFJhCWK3HEcVAQGpa+XQS J4fpnOVxTiIs0RIYqjBeoiG52bv/9nTrMQHnO35YD5EWTXaJqAFPrSJmcPpLHZXB MFjqvNll2Jq0iOtJRlLf0lMVdssUXRlJsW9q09P9vMIt7EU/CT9YvvzU7wCMgTVy v/cY6pZifSsofxVsY9LKyn0FrMhtB20yvmi4BUCuVJhWPmbxMOjvxKuTXgfeMo8S dKpbNCNUwOpszv42kqgJF+qhLc9s44Qd3ocuMws8dOIhUDiVLlzg5cYx+dtA+mqh pIqTm6chBocdJ9PEoclMsG8CAwEAAaOBuzCBuDAOBgNVHQ8BAf8EBAMCAQYwDwYD VR0TAQH/BAUwAwEB/zBCBgNVHSAEOzA5MDcGBWA4AQEBMC4wLAYIKwYBBQUHAgEW IGh0dHA6Ly9yZXBvc2l0b3J5LmVpZC5iZWxnaXVtLmJlMB0GA1UdDgQWBBQQ8AxW m2HqVzq2NZdtn925FI7b5jARBglghkgBhvhCAQEEBAMCAAcwHwYDVR0jBBgwFoAU EPAMVpth6lc6tjWXbZ/duRSO2+YwDQYJKoZIhvcNAQEFBQADggEBAMhtIlGKYfgP lm7VILKB+MbcoxYA2s1q52sq+llIp0xJN9dzoWoBZV4yveeX09AuPHPTjHuD79ZC wT+oqV0PN7p20kC9zC0/00RBSZz9Wyn0AiMiW3Ebv1jZKE4tRfTa57VjRUQRDSp/ M382SbTObqkCMa5c/ciJv0J71/Fg8teH9lcuen5qE4Ad3OPQYx49cTGxYNSeCMqr 8JTHSHVUgfMbrXec6LKP24OsjzRr6L/D2fVDw2RV6xq9NoY2uiGMlxoh1OotO6y6 7Kcdq765Sps1LxxcHVGnH1TtEpf/8m6HfUbJdNbv6z195lluBpQE5KJVhzgoaiJe 4r50ErAEQyo= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDjjCCAnagAwIBAgIIKv++n6Lw6YcwDQYJKoZIhvcNAQEFBQAwKDELMAkGA1UE BhMCQkUxGTAXBgNVBAMTEEJlbGdpdW0gUm9vdCBDQTIwHhcNMDcxMDA0MTAwMDAw WhcNMjExMjE1MDgwMDAwWjAoMQswCQYDVQQGEwJCRTEZMBcGA1UEAxMQQmVsZ2l1 bSBSb290IENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMZzQh6S /3UPi790hqc/7bIYLS2X+an7mEoj39WN4IzGMhwWLQdC1i22bi+n9fzGhYJdld61 IgDMqFNAn68KNaJ6x+HK92AQZw6nUHMXU5WfIp8MXW+2QbyM69odRr2nlL/zGsvU +40OHjPIltfsjFPekx40HopQcSZYtF3CiInaYNKJIT/e1wEYNm7hLHADBGXvmAYr XR5i3FVr/mZkIV/4L+HXmymvb82fqgxG0YjFnaKVn6w/Fa7yYd/vw2uaItgscf1Y HewApDgglVrH1Tdjuk+bqv5WRi5j2Qsj1Yr6tSPwiRuhFA0m2kHwOI8w7QUmecFL TqG4flVSOmlGhHUCAwEAAaOBuzCBuDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ BAUwAwEB/zBCBgNVHSAEOzA5MDcGBWA4CQEBMC4wLAYIKwYBBQUHAgEWIGh0dHA6 Ly9yZXBvc2l0b3J5LmVpZC5iZWxnaXVtLmJlMB0GA1UdDgQWBBSFiuv0xbu+DlkD lN7WgAEV4xCcOTARBglghkgBhvhCAQEEBAMCAAcwHwYDVR0jBBgwFoAUhYrr9MW7 vg5ZA5Te1oABFeMQnDkwDQYJKoZIhvcNAQEFBQADggEBAFHYhd27V2/MoGy1oyCc UwnzSgEMdL8rs5qauhjyC4isHLMzr87lEwEnkoRYmhC598wUkmt0FoqW6FHvv/pK JaeJtmMrXZRY0c8RcrYeuTlBFk0pvDVTC9rejg7NqZV3JcqUWumyaa7YwBO+mPyW nIR/VRPmPIfjvCCkpDZoa01gZhz5v6yAlGYuuUGK02XThIAC71AdXkbc98m6tTR8 KvPG2F9fVJ3bTc0R5/0UAoNmXsimABKgX77OFP67H6dh96tK8QYUn8pJQsKpvO2F sauBQeYNxUJpU4c5nUwfAA4+Bw11V0SoU7Q2dmSZ3G7rPUZuFF1eR1ONeE3gJ7uO hXY= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEd MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3Mg Q2xhc3MgMiBDQSAxMB4XDTA2MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzEL MAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MR0wGwYD VQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP ADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7McXA0 ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLX l18xoS830r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVB HfCuuCkslFJgNJQ72uA40Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B 5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/RuFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3 WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNCMEAwDwYDVR0TAQH/BAUw AwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0PAQH/BAQD AgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLP gcIV1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+ DKhQ7SLHrQVMdvvt7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKu BctN518fV4bVIJwo+28TOPX2EZL2fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHs h7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5wwDX3OaJdZtB7WZ+oRxKaJyOk LY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEd MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3Mg Q2xhc3MgMyBDQSAxMB4XDTA1MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzEL MAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MR0wGwYD VQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP ADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKxifZg isRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//z NIqeKNc0n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI +MkcVyzwPX6UvCWThOiaAJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2R hzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+ mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNCMEAwDwYDVR0TAQH/BAUw AwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0PAQH/BAQD AgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFP Bdy7pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27s EzNxZy5p+qksP2bAEllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2 mSlf56oBzKwzqBwKu5HEA6BvtjT5htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yC e/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQjel/wroQk5PMr+4okoyeYZdow dXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzET MBEGA1UEBxMKQnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UE AxMIQ0EgRGlzaWcwHhcNMDYwMzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQsw CQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcg YS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw ggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgmGErE Nx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnX mjxUizkDPw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYD XcDtab86wYqg6I7ZuUUohwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhW S8+2rT+MitcE5eN4TPWGqvWP+j1scaMtymfraHtuM6kMgiioTGohQBUgDCZbg8Kp FhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8wgfwwDwYDVR0TAQH/BAUw AwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0PAQH/BAQD AgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cu ZGlzaWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5z ay9jYS9jcmwvY2FfZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2sv Y2EvY3JsL2NhX2Rpc2lnLmNybDAaBgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEw DQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59tWDYcPQuBDRIrRhCA/ec8J9B6 yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3mkkp7M5+cTxq EEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/ CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeB EicTXxChds6KezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFN PGO+I++MzVpQuGhU+QqZMxEA4Z7CRneC9VkGjCFMhwnN5ag= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q 130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG 9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDczCCAlugAwIBAgIQMDAwMDk3Mzc1NzM4NjAwMDANBgkqhkiG9w0BAQUFADBV MQswCQYDVQQGEwJGUjETMBEGA1UEChMKQ2VydGlOb21pczEcMBoGA1UECxMTQUMg UmFjaW5lIC0gUm9vdCBDQTETMBEGA1UEAxMKQ2VydGlOb21pczAeFw0wMDExMDkw MDAwMDBaFw0xMjExMDkwMDAwMDBaMFUxCzAJBgNVBAYTAkZSMRMwEQYDVQQKEwpD ZXJ0aU5vbWlzMRwwGgYDVQQLExNBQyBSYWNpbmUgLSBSb290IENBMRMwEQYDVQQD EwpDZXJ0aU5vbWlzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8SWb 4mS5RXB3ENSIcfrEzCj/TRUQuT1tMCU0YUfXFSgcPdWglIzCv3kvh07QoB+8xMl+ fQHvSSduAxnNewz0GBY9rApCPKlP6CcnJr74OSVZIiWt9wLfl4wwhNhZOiikIpZp EdOXWqRc84P5cUlN3Lwmr1sjCWmHfTSS4cAKxfDbFLfE61etosyoFZUTQbIhb1Bf JL5xRXAUZudQiU42n/yAoSUrN4FLUfPQNlOe1AB81pIgX8g2ojwxDjfgqSs1JmBF uLKJ45uVLEenQBPmQCGjL3maV86IRmR3a9UGlgvKAk0NBdh8mrQyQvcUlLBIQBCm l7wppt6maQHUNEPQSwIDAQABoz8wPTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw AwEB/zAdBgNVHQ4EFgQU+F4ho6ijFeb4tRG7/kIEXU2OgnowDQYJKoZIhvcNAQEF BQADggEBACe9FJayK6bXkJQrilBFMh75QPdFOks9PJuo86OMUlBDZGYFTCh9Arex N3KYCnAEzazYIALwr7eASJJDIQMu1Q+pkx/7ACde4kP47F27M2rm+v5HnGooCLz2 s7Fe/WUycTQqgwF5lNp03m1ce/TvovgkEZeVN5wM/7+SsZLJGDigXGeq48j2g2hn 8OckX9Ciyo0U3/1IVeigNBisiaOlsHSZOEPBZQRiZULob+NVbXVPo8nM1OyP3aHI LQex1yYcCr9m93nOiZyKkur3Uedf1yMTBe+fflnPFKGYnVqvTGXCKVdHzQBfpILA AuaC+5ykZhSiSMf8nmL2oPMcLO7YQw4= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBM MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD QTAeFw0wMjA2MTExMDQ2MzlaFw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBM MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6xwS7TT3zNJc4YPk/E jG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdLkKWo ePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GI ULdtlkIJ89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapu Ob7kky/ZR6By6/qmW6/KUz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUg AKpoC6EahQGcxEZjgoi2IrHu/qpGWX7PNSzVttpd90gzFFS269lvzs2I1qsb2pY7 HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEA uI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+GXYkHAQa TOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTg xSvgGrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1q CjqTE5s7FCMTY5w/0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5x O/fIR/RpbxXyEV6DHpx8Uq79AtoSqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs 6GAqm4VKQPNriiTsBhYscw== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI 03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEn MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMg b2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAxNjEzNDNaFw0zNzA5MzAxNjEzNDRa MH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZpcm1hIFNBIENJRiBB ODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3JnMSIw IAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0B AQEFAAOCAQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtb unXF/KGIJPov7coISjlUxFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0d BmpAPrMMhe5cG3nCYsS4No41XQEMIwRHNaqbYE6gZj3LJgqcQKH0XZi/caulAGgq 7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jWDA+wWFjbw2Y3npuRVDM3 0pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFVd9oKDMyX roDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIG A1UdEwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5j aGFtYmVyc2lnbi5vcmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p 26EpW1eLTXYGduHRooowDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIA BzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hhbWJlcnNpZ24ub3JnMCcGA1Ud EgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYDVR0gBFEwTzBN BgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEB AAxBl8IahsAifJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZd p0AJPaxJRUXcLo0waLIJuvvDL8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi 1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wNUPf6s+xCX6ndbcj0dc97wXImsQEc XCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/nADydb47kMgkdTXg0 eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1erfu tGWaIZDgqtCYvDi1czyL+Nw= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMC Q04xMjAwBgNVBAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24g Q2VudGVyMUcwRQYDVQQDDD5DaGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0 aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMgUm9vdDAeFw0xMDA4MzEwNzExMjVa Fw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAGA1UECgwpQ2hpbmEg SW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMMPkNo aW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRp ZmljYXRlcyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z 7r07eKpkQ0H1UN+U8i6yjUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA// DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV98YPjUesWgbdYavi7NifFy2cyjw1l1Vx zUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2HklY0bBoQCxfVWhyXWIQ8 hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23KzhmBsUs 4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54u gQEC7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oY NJKiyoOCWTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4E FgQUfHJLOcfA22KlT5uqGDSSosqDglkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3 j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd50XPFtQO3WKwMVC/GVhMPMdoG 52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM7+czV0I664zB echNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws ZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrI zo9uoV1/A3U05K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATy wy39FCqQmbkHzJ8= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDQzCCAiugAwIBAgIQX/h7KCtU3I1CoxW1aMmt/zANBgkqhkiG9w0BAQUFADA1 MRYwFAYDVQQKEw1DaXNjbyBTeXN0ZW1zMRswGQYDVQQDExJDaXNjbyBSb290IENB IDIwNDgwHhcNMDQwNTE0MjAxNzEyWhcNMjkwNTE0MjAyNTQyWjA1MRYwFAYDVQQK Ew1DaXNjbyBTeXN0ZW1zMRswGQYDVQQDExJDaXNjbyBSb290IENBIDIwNDgwggEg MA0GCSqGSIb3DQEBAQUAA4IBDQAwggEIAoIBAQCwmrmrp68Kd6ficba0ZmKUeIhH xmJVhEAyv8CrLqUccda8bnuoqrpu0hWISEWdovyD0My5jOAmaHBKeN8hF570YQXJ FcjPFto1YYmUQ6iEqDGYeJu5Tm8sUxJszR2tKyS7McQr/4NEb7Y9JHcJ6r8qqB9q VvYgDxFUl4F1pyXOWWqCZe+36ufijXWLbvLdT6ZeYpzPEApk0E5tzivMW/VgpSdH jWn0f84bcN5wGyDWbs2mAag8EtKpP6BrXruOIIt6keO1aO6g58QBdKhTCytKmg9l Eg6CTY5j/e/rmxrbU6YTYK/CfdfHbBcl1HP7R2RQgYCUTOG/rksc35LtLgXfAgED o1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUJ/PI FR5umgIJFq0roIlgX9p7L6owEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEF BQADggEBAJ2dhISjQal8dwy3U8pORFBi71R803UXHOjgxkhLtv5MOhmBVrBW7hmW Yqpao2TB9k5UM8Z3/sUcuuVdJcr18JOagxEu5sv4dEX+5wW4q+ffy0vhN4TauYuX cB7w4ovXsNgOnbFp1iqRe6lJT37mjpXYgyc81WhJDtSd9i7rp77rMKSsH0T8lasz Bvt9YAretIpjsJyp8qS5UwGH0GikJ3+r/+n6yUA4iGe0OcaEb1fJU9u6ju7AQ7L4 CYNu/2bPPu8Xs1gYJQk0XuPL1hS27PKSb3TkL4Eq1ZKR4OCXPDJoBYVL0fdX4lId kxpUnwVwwEpxYB5DC2Ae/qPOgRnhCzU= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIICPTCCAaYCEQDNun9W8N/kvFT+IqyzcqpVMA0GCSqGSIb3DQEBAgUAMF8xCzAJ BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xh c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05 NjAxMjkwMDAwMDBaFw0yODA4MDEyMzU5NTlaMF8xCzAJBgNVBAYTAlVTMRcwFQYD VQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgMSBQdWJsaWMgUHJp bWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCBnzANBgkqhkiG9w0BAQEFAAOB jQAwgYkCgYEA5Rm/baNWYS2ZSHH2Z965jeu3noaACpEO+jglr0aIguVzqKCbJF0N H8xlbgyw0FaEGIeaBpsQoXPftFg5a27B9hXVqKg/qhIGjTGsf7A01480Z4gJzRQR 4k5FVmkfeAKA2txHkSm7NsljXMXg1y2He6G3MrB7MLoqLzGq7qNn2tsCAwEAATAN BgkqhkiG9w0BAQIFAAOBgQBMP7iLxmjf7kMzDl3ppssHhE16M/+SG/Q2rdiVIjZo EWx8QszznC7EBz8UsA9P/5CSdvnivErpj82ggAr3xSnxgiJduLHdgSOjeyUVRjB5 FvjqBUuUfx3CHMjjt/QQQDwTw18fU+hI5Ia0e6E1sHslurjTjqs/OJ0ANACY89Fx lA== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIICPDCCAaUCED9pHoGc8JpK83P/uUii5N0wDQYJKoZIhvcNAQEFBQAwXzELMAkG A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz cyAxIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAxIFB1YmxpYyBQcmlt YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN ADCBiQKBgQDlGb9to1ZhLZlIcfZn3rmN67eehoAKkQ76OCWvRoiC5XOooJskXQ0f zGVuDLDQVoQYh5oGmxChc9+0WDlrbsH2FdWoqD+qEgaNMax/sDTXjzRniAnNFBHi TkVWaR94AoDa3EeRKbs2yWNcxeDXLYd7obcysHswuiovMaruo2fa2wIDAQABMA0G CSqGSIb3DQEBBQUAA4GBAFgVKTk8d6PaXCUDfGD67gmZPCcQcMgMCeazh88K4hiW NWLMv5sneYlfycQJ9M61Hd8qveXbhpxoJeUwfLaJFf5n0a3hUKw8fGJLj7qE1xIV Gx/KXQ/BUpQqEZnae88MNhPVNdwQGVnqlMEAv3WP2fr9dgTbYruQagPZRjXZ+Hxb -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJ BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMg UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB AQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgdk4xWArzZbxpvUjZudVYK VdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIqWpDBucSm Fc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQID AQABMA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0J h9ZrbWB85a7FkCMMXErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2ul uIncrKTdcu1OofdPvAbT6shkdHvClUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68 DzFc6PLZ -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9 MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0 HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4 QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/ AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 l7+ijrRU -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIICPDCCAaUCEC0b/EoXjaOR6+f/9YtFvgswDQYJKoZIhvcNAQECBQAwXzELMAkG A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz cyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAyIFB1YmxpYyBQcmlt YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN ADCBiQKBgQC2WoujDWojg4BrzzmH9CETMwZMJaLtVRKXxaeAufqDwSCg+i8VDXyh YGt+eSz6Bg86rvYbb7HS/y8oUl+DfUvEerf4Zh+AVPy3wo5ZShRXRtGak75BkQO7 FYCTXOvnzAhsPz6zSvz/S2wj1VCCJkQZjiPDceoZJEcEnnW/yKYAHwIDAQABMA0G CSqGSIb3DQEBAgUAA4GBAIobK/o5wXTXXtgZZKJYSi034DNHD6zt96rbHuSLBlxg J8pFUs4W7z8GZOeUaHxgMxURaa+dYo2jA1Rrpr7l7gUYYAS/QoD90KioHgE796Nc r6Pc5iaAIzy4RHT3Cq5Ji2F4zCS/iIqnDupzGUH9TQPwiNHleI2lKk/2lw0Xd8rY -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIICPDCCAaUCEAq6HgBiMui0NiZdH3zNiWYwDQYJKoZIhvcNAQEFBQAwXzELMAkG A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz cyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAyIFB1YmxpYyBQcmlt YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN ADCBiQKBgQC2WoujDWojg4BrzzmH9CETMwZMJaLtVRKXxaeAufqDwSCg+i8VDXyh YGt+eSz6Bg86rvYbb7HS/y8oUl+DfUvEerf4Zh+AVPy3wo5ZShRXRtGak75BkQO7 FYCTXOvnzAhsPz6zSvz/S2wj1VCCJkQZjiPDceoZJEcEnnW/yKYAHwIDAQABMA0G CSqGSIb3DQEBBQUAA4GBAIDToA+IyeVoW4R7gB+nt+MjWBEc9RTwWBKMi99x2ZAk EXyge8N6GRm9cr0gvwA63/rVeszC42JFi8tJg5jBcGnQnl6CjDVHjk8btB9jAa3k ltax7nosZm4XNq8afjgGhixrTcsnkm54vwDVAcCxB8MJqmSFKPKdc57PYDoKHUpI -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQsw CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0Ns YXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH MjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y aXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazAe Fw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJVUzEX MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGlj IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMx KGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s eTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazCBnzANBgkqhkiG9w0B AQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjxnNuX6Zr8wgQGE75fUsjM HiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRCwiNPStjw DqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cC AwEAATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9ji nb3/7aHmZuovCfTK1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAX rXfMSTWqz9iP0b63GJZHc2pUIjRkLbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnIn jBJ7xUS0rg== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkG A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G CSqGSIb3DQEBBQUAA4GBABByUqkFFBkyCEHwxWsKzH4PIRnN5GfcX6kb5sroc50i 2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWXbj9T/UWZYB2oK0z5XqcJ 2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/D/xwzoiQ -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4 pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0 13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY oJ2daZH9 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcExCzAJ BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh c3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMg UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB AQUAA4GNADCBiQKBgQC68OTP+cSuhVS5B1f5j8V/aBH4xBewRNzjMHPVKmIquNDM HO0oW369atyzkSTKQWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDHqGKB3FtK qsGgtG7rL+VXxbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwID AQABMA0GCSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwj cSGIL4LcY/oCRaxFWdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0y cyfYaT5DdPauxYma51N86Xv2S/PBZYPejYqcPIiNOVn8qj8ijaHBZlCBckztImRP T8qAkbYp -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJD TjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2 MDcwOTE0WhcNMjcwNDE2MDcwOTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMF Q05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwggEiMA0GCSqGSIb3DQEBAQUAA4IB DwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzDo+/hn7E7SIX1mlwh IhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tizVHa6 dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZO V/kbZKKTVrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrC GHn2emU1z5DrvTOTn1OrczvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gN v7Sg2Ca+I19zN38m5pIEo3/PIKe38zrKy5nLAgMBAAGjczBxMBEGCWCGSAGG+EIB AQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscCwQ7vptU7ETAPBgNVHRMB Af8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991SlgrHAsEO 76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnK OOK5Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvH ugDnuL8BV8F3RTIMO/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7Hgvi yJA/qIYM/PmLXoXLT1tLYhFHxUV8BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fL buXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2G8kS1sHNzYDzAgE8yGnLRUhj 2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5mmxE= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDoTCCAomgAwIBAgIQKTZHquOKrIZKI1byyrdhrzANBgkqhkiG9w0BAQUFADBO MQswCQYDVQQGEwJ1czEYMBYGA1UEChMPVS5TLiBHb3Zlcm5tZW50MQ0wCwYDVQQL EwRGQkNBMRYwFAYDVQQDEw1Db21tb24gUG9saWN5MB4XDTA3MTAxNTE1NTgwMFoX DTI3MTAxNTE2MDgwMFowTjELMAkGA1UEBhMCdXMxGDAWBgNVBAoTD1UuUy4gR292 ZXJubWVudDENMAsGA1UECxMERkJDQTEWMBQGA1UEAxMNQ29tbW9uIFBvbGljeTCC ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJeNvTMn5K1b+3i9L0dHbsd4 6ZOcpN7JHP0vGzk4rEcXwH53KQA7Ax9oD81Npe53uCxiazH2+nIJfTApBnznfKM9 hBiKHa4skqgf6F5PjY7rPxr4nApnnbBnTfAu0DDew5SwoM8uCjR/VAnTNr2kSVdS c+md/uRIeUYbW40y5KVIZPMiDZKdCBW/YDyD90ciJSKtKXG3d+8XyaK2lF7IMJCk FEhcVlcLQUwF1CpMP64Sm1kRdXAHImktLNMxzJJ+zM2kfpRHqpwJCPZLr1LoakCR xVW9QLHIbVeGlRfmH3O+Ry4+i0wXubklHKVSFzYIWcBCvgortFZRPBtVyYyQd+sC AwEAAaN7MHkwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O BBYEFC9Yl9ipBZilVh/72at17wI8NjTHMBIGCSsGAQQBgjcVAQQFAgMBAAEwIwYJ KwYBBAGCNxUCBBYEFHa3YJbdFFYprHWF03BjwbxHhhyLMA0GCSqGSIb3DQEBBQUA A4IBAQBgrvNIFkBypgiIybxHLCRLXaCRc+1leJDwZ5B6pb8KrbYq+Zln34PFdx80 CTj5fp5B4Ehg/uKqXYeI6oj9XEWyyWrafaStsU+/HA2fHprA1RRzOCuKeEBuMPdi 4c2Z/FFpZ2wR3bgQo2jeJqVW/TZsN5hs++58PGxrcD/3SDcJjwtCga1GRrgLgwb0 Gzigf0/NC++DiYeXHIowZ9z9VKEDfgHLhUyxCynDvux84T8PCVI8L6eaSP436REG WOE2QYrEtr+O3c5Ks7wawM36GpnScZv6z7zyxFSjiDV2zBssRm8MtNHDYXaSdBHq S4CNHIkRi+xb/xfJSPzn4AYR4oRe -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI 2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp +2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW /zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB ZQ== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl 6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU Cm26OWMohpLzGITY+9HPBVZkVw== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe +o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG 9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt 43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg 06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm +9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep +OkuE6N36B9K -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIICZzCCAdCgAwIBAgIBBDANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQGEwJVUzEY MBYGA1UEChMPVS5TLiBHb3Zlcm5tZW50MQwwCgYDVQQLEwNEb0QxDDAKBgNVBAsT A1BLSTEcMBoGA1UEAxMTRG9EIENMQVNTIDMgUm9vdCBDQTAeFw0wMDA1MTkxMzEz MDBaFw0yMDA1MTQxMzEzMDBaMGExCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9VLlMu IEdvdmVybm1lbnQxDDAKBgNVBAsTA0RvRDEMMAoGA1UECxMDUEtJMRwwGgYDVQQD ExNEb0QgQ0xBU1MgMyBSb290IENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB gQC1MP5kvurMbe2BLPd/6Rm6DmlqKOGpqcuVWB/x5pppU+CIP5HFUbljl6jmIYwT XjY8qFf6+HAsTGrLvzCnTBbkMlz4ErBR+BZXjS+0TfouqJToKmHUVw1Hzm4sL36Y Z8wACKu2lhY1woWR5VugCsdmUmLzYXWVF668KlYppeArUwIDAQABoy8wLTAdBgNV HQ4EFgQUbJyl8FyPbUGNxBc7kFfCD6PNbf4wDAYDVR0TBAUwAwEB/zANBgkqhkiG 9w0BAQUFAAOBgQCvcUT5lyPMaGmMQwdBuoggsyIAQciYoFUczT9usZNcrfoYmrsc c2/9JEKPh59Rz76Gn+nXikhPCNlplKw/5g8tlw8ok3ZPYt//oM1h+KaGDDE0INx/ L6j7Ob6V7jhZAmLB3mwVT+DfnbvkeXMk/WNklfdKqJkfSGWVx3u/eDLneg== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDcDCCAligAwIBAgIBBTANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQGEwJVUzEY MBYGA1UEChMPVS5TLiBHb3Zlcm5tZW50MQwwCgYDVQQLEwNEb0QxDDAKBgNVBAsT A1BLSTEWMBQGA1UEAxMNRG9EIFJvb3QgQ0EgMjAeFw0wNDEyMTMxNTAwMTBaFw0y OTEyMDUxNTAwMTBaMFsxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9VLlMuIEdvdmVy bm1lbnQxDDAKBgNVBAsTA0RvRDEMMAoGA1UECxMDUEtJMRYwFAYDVQQDEw1Eb0Qg Um9vdCBDQSAyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwCzB9o07 rP8/PNZxvrh0IgfscEEV/KtA4weqwcPYn/7aTDq/P8jYKHtLNgHArEUlw9IOCo+F GGQQPRoTcCpvjtfcjZOzQQ84Ic2tq8I9KgXTVxE3Dc2MUfmT48xGSSGOFLTNyxQ+ OM1yMe6rEvJl6jQuVl3/7mN1y226kTT8nvP0LRy+UMRC31mI/2qz+qhsPctWcXEF lrufgOWARVlnQbDrw61gpIB1BhecDvRD4JkOG/t/9bPMsoGCsf0ywbi+QaRktWA6 WlEwjM7eQSwZR1xJEGS5dKmHQa99brrBuKG/ZTE6BGf5tbuOkooAY7ix5ow4X4P/ UNU7ol1rshDMYwIDAQABoz8wPTAdBgNVHQ4EFgQUSXS7DF66ev4CVO97oMaVxgmA cJYwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD ggEBAJiRjT+JyLv1wGlzKTs1rLqzCHY9cAmS6YREIQF9FHYb7lFsHY0VNy17MWn0 mkS4r0bMNPojywMnGdKDIXUr5+AbmSbchECV6KjSzPZYXGbvP0qXEIIdugqi3VsG K52nZE7rLgE1pLQ/E61V5NVzqGmbEfGY8jEeb0DU+HifjpGgb3AEkGaqBivO4XqS tX3h4NGW56E6LcyxnR8FRO2HmdNNGnA5wQQM5X7Z8a/XIA7xInolpHOZzD+kByeW qKKV7YK5FtOeC4fCwfKI9WLfaN/HvGlR7bFc3FRUKQ8JOZqsA8HbDE2ubwp6Fknx v5HSOJTT9pUst2zJQraNypCNhdk= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBb MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3Qx ETAPBgNVBAsTCERTVCBBQ0VTMRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0w MzExMjAyMTE5NThaFw0xNzExMjAyMTE5NThaMFsxCzAJBgNVBAYTAlVTMSAwHgYD VQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UECxMIRFNUIEFDRVMx FzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPu ktKe1jzIDZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7 gLFViYsx+tC3dr5BPTCapCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZH fAjIgrrep4c9oW24MFbCswKBXy314powGCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4a ahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPyMjwmR/onJALJfh1biEIT ajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1UdEwEB/wQF MAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rk c3QuY29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjto dHRwOi8vd3d3LnRydXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMt aW5kZXguaHRtbDAdBgNVHQ4EFgQUCXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZI hvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V25FYrnJmQ6AgwbN99Pe7lv7Uk QIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6tFr8hlxCBPeP/ h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpR rscL9yuwNwXsvFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf2 9w4LTJxoeHtxMcfrHuBnQfO3oKfN5XozNmr6mis= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw 7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDOzCCAiOgAwIBAgIRANAeRlAAACmMAAAAAgAAAAIwDQYJKoZIhvcNAQEFBQAw PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD Ew5EU1QgUm9vdCBDQSBYNDAeFw0wMDA5MTMwNjIyNTBaFw0yMDA5MTMwNjIyNTBa MD8xJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjEXMBUGA1UE AxMORFNUIFJvb3QgQ0EgWDQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB AQCthX3OFEYY8gSeIYur0O4ypOT68HnDrjLfIutL5PZHRwQGjzCPb9PFo/ihboJ8 RvfGhBAqpQCo47zwYEhpWm1jB+L/OE/dBBiyn98krfU2NiBKSom2J58RBeAwHGEy cO+lewyjVvbDDLUy4CheY059vfMjPAftCRXjqSZIolQb9FdPcAoa90mFwB7rKniE J7vppdrUScSS0+eBrHSUPLdvwyn4RGp+lSwbWYcbg5EpSpE0GRJdchic0YDjvIoC YHpe7Rkj93PYRTQyU4bhC88ck8tMqbvRYqMRqR+vobbkrj5LLCOQCHV5WEoxWh+0 E2SpIFe7RkV++MmpIAc0h1tZAgMBAAGjMjAwMA8GA1UdEwEB/wQFMAMBAf8wHQYD VR0OBBYEFPCD6nPIP1ubWzdf9UyPWvf0hki9MA0GCSqGSIb3DQEBBQUAA4IBAQCE G85wl5eEWd7adH6XW/ikGN5salvpq/Fix6yVTzE6CrhlP5LBdkf6kx1bSPL18M45 g0rw2zA/MWOhJ3+S6U+BE0zPGCuu8YQaZibR7snm3HiHUaZNMu5c8D0x0bcMxDjY AVVcHCoNiL53Q4PLW27nbY6wwG0ffFKmgV3blxrYWfuUDgGpyPwHwkfVFvz9qjaV mf12VJffL6W8omBPtgteb6UaT/k1oJ7YI0ldGf+ngpVbRhD+LC3cUtT6GO/BEPZu 8YTV/hbiDH5v3khVqMIeKT6o8IuXGG7F6a6vKwP1F1FwTXf4UC/ivhme7vdUH7B/ Vv4AEbT8dNfEeFxrkDbh -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNV BAMML0VCRyBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx c8SxMTcwNQYDVQQKDC5FQkcgQmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXpt ZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAeFw0wNjA4MTcwMDIxMDlaFw0xNjA4 MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25payBTZXJ0aWZpa2Eg SGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2ltIFRl a25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIi MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h 4fuXd7hxlugTlkaDT7byX3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAk tiHq6yOU/im/+4mRDGSaBUorzAzu8T2bgmmkTPiab+ci2hC6X5L8GCcKqKpE+i4s tPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfreYteIAbTdgtsApWjluTL dlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZTqNGFav4 c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8Um TDGyY5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z +kI2sSXFCjEmN1ZnuqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0O Lna9XvNRiYuoP1Vzv9s6xiQFlpJIqkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMW OeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vmExH8nYQKE3vwO9D8owrXieqW fo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0Nokb+Clsi7n2 l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB /wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgw FoAU587GT/wWZ5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+ 8ygjdsZs93/mQJ7ANtyVDR2tFcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI 6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgmzJNSroIBk5DKd8pNSe/iWtkqvTDO TLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64kXPBfrAowzIpAoHME wfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqTbCmY Iai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJn xk1Gj7sURT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4Q DgZxGhBM/nV+/x5XOULK1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9q Kd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11t hie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQY9iJSrSq3RZj9W6+YKH4 7ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9AahH3eU7 QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIICmDCCAgGgAwIBAgIBDjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJVUzEY MBYGA1UEChMPVS5TLiBHb3Zlcm5tZW50MQwwCgYDVQQLEwNFQ0ExFDASBgNVBAMT C0VDQSBSb290IENBMB4XDTA0MDYxNDEwMjAwOVoXDTQwMDYxNDEwMjAwOVowSzEL MAkGA1UEBhMCVVMxGDAWBgNVBAoTD1UuUy4gR292ZXJubWVudDEMMAoGA1UECxMD RUNBMRQwEgYDVQQDEwtFQ0EgUm9vdCBDQTCBnzANBgkqhkiG9w0BAQEFAAOBjQAw gYkCgYEArkr2eXIS6oAKIpDkOlcQZdMGdncoygCEIU+ktqY3of5SVVXU7/it7kJ1 EUzR4ii2vthQtbww9aAnpQxcEmXZk8eEyiGEPy+cCQMllBY+efOtKgjbQNDZ3lB9 19qzUJwBl2BMxslU1XsJQw9SK10lPbQm4asa8E8e5zTUknZBWnECAwEAAaOBizCB iDAfBgNVHSMEGDAWgBT2uAQnDlYW2blj2f2hVGVBoAhILzAdBgNVHQ4EFgQU9rgE Jw5WFtm5Y9n9oVRlQaAISC8wDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB Af8wJQYDVR0gBB4wHDAMBgpghkgBZQMCAQwBMAwGCmCGSAFlAwIBDAIwDQYJKoZI hvcNAQEFBQADgYEAHh0EQY2cZ209aBb5q0wW1ER0dc4OGzsLyqjHfaQ4TEaMmUwL AJRta/c4KVWLiwbODsvgJk+CaWmSL03gRW/ciVb/qDV7qh9Pyd1cOlanZTAnPog2 i82yL3i2fK9DCC84uoxEQbgqK2jx9bIjFTwlAqITk9fGAm5mdT84IEwq1Gw= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIE5zCCA8+gAwIBAgIBADANBgkqhkiG9w0BAQUFADCBjTELMAkGA1UEBhMCQ0Ex EDAOBgNVBAgTB09udGFyaW8xEDAOBgNVBAcTB1Rvcm9udG8xHTAbBgNVBAoTFEVj aG93b3J4IENvcnBvcmF0aW9uMR8wHQYDVQQLExZDZXJ0aWZpY2F0aW9uIFNlcnZp Y2VzMRowGAYDVQQDExFFY2hvd29yeCBSb290IENBMjAeFw0wNTEwMDYxMDQ5MTNa Fw0zMDEwMDcxMDQ5MTNaMIGNMQswCQYDVQQGEwJDQTEQMA4GA1UECBMHT250YXJp bzEQMA4GA1UEBxMHVG9yb250bzEdMBsGA1UEChMURWNob3dvcnggQ29ycG9yYXRp b24xHzAdBgNVBAsTFkNlcnRpZmljYXRpb24gU2VydmljZXMxGjAYBgNVBAMTEUVj aG93b3J4IFJvb3QgQ0EyMIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKCAQEA utU/5BkV15UBf+s+JQruKQxr77s3rjp/RpOtmhHILIiO5gsEWP8MMrfrVEiidjI6 Qh6ans0KAWc2Dw0/j4qKAQzOSyAZgjcdypNTBZ7muv212DA2Pu41rXqwMrlBrVi/ KTghfdLlNRu6JrC5y8HarrnRFSKF1Thbzz921kLDRoCi+FVs5eVuK5LvIfkhNAqA byrTgO3T9zfZgk8upmEkANPDL1+8y7dGPB/d6lk0I5mv8PESKX02TlvwgRSIiTHR k8++iOPLBWlGp7ZfqTEXkPUZhgrQQvxcrwCUo6mk8TqgxCDP5FgPoHFiPLef5szP ZLBJDWp7GLyE1PmkQI6WiwIBA6OCAVAwggFMMA8GA1UdEwEB/wQFMAMBAf8wCwYD VR0PBAQDAgEGMB0GA1UdDgQWBBQ74YEboKs/OyGC1eISrq5QqxSlEzCBugYDVR0j BIGyMIGvgBQ74YEboKs/OyGC1eISrq5QqxSlE6GBk6SBkDCBjTELMAkGA1UEBhMC Q0ExEDAOBgNVBAgTB09udGFyaW8xEDAOBgNVBAcTB1Rvcm9udG8xHTAbBgNVBAoT FEVjaG93b3J4IENvcnBvcmF0aW9uMR8wHQYDVQQLExZDZXJ0aWZpY2F0aW9uIFNl cnZpY2VzMRowGAYDVQQDExFFY2hvd29yeCBSb290IENBMoIBADBQBgNVHSAESTBH MEUGCysGAQQB+REKAQMBMDYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cuZWNob3dv cnguY29tL2NhL3Jvb3QyL2Nwcy5wZGYwDQYJKoZIhvcNAQEFBQADggEBAG+nrPi/ 0RpfEzrj02C6JGPUar4nbjIhcY6N7DWNeqBoUulBSIH/PYGNHYx7/lnJefiixPGE 7TQ5xPgElxb9bK8zoAApO7U33OubqZ7M7DlHnFeCoOoIAZnG1kuwKwD5CXKB2a74 HzcqNnFW0IsBFCYqrVh/rQgJOzDA8POGbH0DeD0xjwBBooAolkKT+7ZItJF1Pb56 QpDL9G+16F7GkmnKlAIYT3QTS3yFGYChnJcd+6txUPhKi9sSOOmAIaKHnkH9Scz+ A2cSi4A3wUYXVatuVNHpRb2lygfH3SuCX9MU8Ure3zBlSU1LALtMqI4JmcQmQpIq zIzvO2jHyu9PQqo= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi 94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP 9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m 0vdXcDazv/wor3ElhVsT/h5/WrQ8 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH 4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er fF6adulZkMV8gzURZVE= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN 95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd 2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS /jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D hNQ+IIX3Sj0rnP0qCglN6oH4EZw= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1 MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y 7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh 1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+ WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN /Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV UzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2Vj dXJlIGVCdXNpbmVzcyBDQS0yMB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0 NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkVxdWlmYXggU2VjdXJlMSYwJAYD VQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCBnzANBgkqhkiG9w0B AQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn2Z0G vxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/ BPO3QSQ5BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0C AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEX MBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJl IGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTkw NjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9euSBIplBq y/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQF MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA A4GBAAyGgq3oThr1jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy 0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1 E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUmV+GRMOrN -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc 58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/ o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv 8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEYDCCA0igAwIBAgICATAwDQYJKoZIhvcNAQELBQAwWTELMAkGA1UEBhMCVVMx GDAWBgNVBAoTD1UuUy4gR292ZXJubWVudDENMAsGA1UECxMERlBLSTEhMB8GA1UE AxMYRmVkZXJhbCBDb21tb24gUG9saWN5IENBMB4XDTEwMTIwMTE2NDUyN1oXDTMw MTIwMTE2NDUyN1owWTELMAkGA1UEBhMCVVMxGDAWBgNVBAoTD1UuUy4gR292ZXJu bWVudDENMAsGA1UECxMERlBLSTEhMB8GA1UEAxMYRmVkZXJhbCBDb21tb24gUG9s aWN5IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2HX7NRY0WkG/ Wq9cMAQUHK14RLXqJup1YcfNNnn4fNi9KVFmWSHjeavUeL6wLbCh1bI1FiPQzB6+ Duir3MPJ1hLXp3JoGDG4FyKyPn66CG3G/dFYLGmgA/Aqo/Y/ISU937cyxY4nsyOl 4FKzXZbpsLjFxZ+7xaBugkC7xScFNknWJidpDDSPzyd6KgqjQV+NHQOGgxXgVcHF mCye7Bpy3EjBPvmE0oSCwRvDdDa3ucc2Mnr4MrbQNq4iGDGMUHMhnv6DOzCIJOPp wX7e7ZjHH5IQip9bYi+dpLzVhW86/clTpyBLqtsgqyFOHQ1O5piF5asRR12dP8Qj wOMUBm7+nQIDAQABo4IBMDCCASwwDwYDVR0TAQH/BAUwAwEB/zCB6QYIKwYBBQUH AQsEgdwwgdkwPwYIKwYBBQUHMAWGM2h0dHA6Ly9odHRwLmZwa2kuZ292L2ZjcGNh L2NhQ2VydHNJc3N1ZWRCeWZjcGNhLnA3YzCBlQYIKwYBBQUHMAWGgYhsZGFwOi8v bGRhcC5mcGtpLmdvdi9jbj1GZWRlcmFsJTIwQ29tbW9uJTIwUG9saWN5JTIwQ0Es b3U9RlBLSSxvPVUuUy4lMjBHb3Zlcm5tZW50LGM9VVM/Y0FDZXJ0aWZpY2F0ZTti aW5hcnksY3Jvc3NDZXJ0aWZpY2F0ZVBhaXI7YmluYXJ5MA4GA1UdDwEB/wQEAwIB BjAdBgNVHQ4EFgQUrQx6dVzl85jEeZgOrCj9l/TnAvwwDQYJKoZIhvcNAQELBQAD ggEBAI9z2uF/gLGH9uwsz9GEYx728Yi3mvIRte9UrYpuGDco71wb5O9Qt2wmGCMi TR0mRyDpCZzicGJxqxHPkYnos/UqoEfAFMtOQsHdDA4b8Idb7OV316rgVNdF9IU+ 7LQd3nyKf1tNnJaK0KIyn9psMQz4pO9+c+iR3Ah6cFqgr2KBWfgAdKLI3VTKQVZH venAT+0g3eOlCd+uKML80cgX2BLHb94u6b2akfI8WpQukSKAiaGMWMyDeiYZdQKl Dn0KJnNR6obLB6jI/WNaNZvSr79PMUjBhHDbNXuaGQ/lj/RqDG8z2esccKIN47lQ A2EC/0rskqTcLe4qNJMHtyznGI8= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIC+TCCAmKgAwIBAgIENvEbGTANBgkqhkiG9w0BAQUFADA2MQswCQYDVQQGEwJF UzENMAsGA1UEChMERk5NVDEYMBYGA1UECxMPRk5NVCBDbGFzZSAyIENBMB4XDTk5 MDMxODE0NTYxOVoXDTE5MDMxODE1MjYxOVowNjELMAkGA1UEBhMCRVMxDTALBgNV BAoTBEZOTVQxGDAWBgNVBAsTD0ZOTVQgQ2xhc2UgMiBDQTCBnTANBgkqhkiG9w0B AQEFAAOBiwAwgYcCgYEAmD+tGTaTPT7+dkIU/TVv8fqtInpY40bQXcZa+WItjzFe /rQw/lB0rNadHeBixkndFBJ9cQusBsE/1waH4JCJ1uXjA7LyJ7GfM8iqazZKo8Q/ eUGdiUYvKz5j1DhWkaodsQ1CdU3zh07jD03MtGy/YhOH6tCbjrbi/xn0lAnVlmEC AQOjggEUMIIBEDARBglghkgBhvhCAQEEBAMCAAcwWAYDVR0fBFEwTzBNoEugSaRH MEUxCzAJBgNVBAYTAkVTMQ0wCwYDVQQKEwRGTk1UMRgwFgYDVQQLEw9GTk1UIENs YXNlIDIgQ0ExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5OTAzMTgxNDU2 MTlagQ8yMDE5MDMxODE0NTYxOVowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFECa dkSXdAfErBTLHo1POkV8MNdhMB0GA1UdDgQWBBRAmnZEl3QHxKwUyx6NTzpFfDDX YTAMBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqG SIb3DQEBBQUAA4GBAGFMoHxZY1tm+O5lE85DgEe5sjXJyITHa3NgReSdN531jiW5 +aqqyuP4Q5wvoIkFsUUylCoeA41dpt7PV5Xa3yZgX8vflR64zgjY+IrJT6lodZPj LwVMZGACokIeb4ZoZVUO2ENv8pExPqNHPCgFr0W2nSJMJntLfVsV+RlG3whd -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU 1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV 5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl 4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEn MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENo YW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYxNDE4WhcNMzcwOTMwMTYxNDE4WjB9 MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgy NzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4G A1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUA A4IBDQAwggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0 Mi+ITaFgCPS3CU6gSS9J1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/s QJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8Oby4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpV eAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl6DJWk0aJqCWKZQbua795 B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c8lCrEqWh z0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0T AQH/BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1i ZXJzaWduLm9yZy9jaGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4w TcbOX60Qq+UDpfqpFDAOBgNVHQ8BAf8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAH MCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBjaGFtYmVyc2lnbi5vcmcwKgYD VR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9yZzBbBgNVHSAE VDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0B AQUFAAOCAQEAPDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUM bKGKfKX0j//U2K0X1S0E0T9YgOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXi ryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJPJ7oKXqJ1/6v/2j1pReQvayZzKWG VwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4IBHNfTIzSJRUTN3c ecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREest2d/ AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK 6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH WD9f -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG 3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO 291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp 1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE 38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDdTCCAl2gAwIBAgILAgAAAAAA1ni3lAUwDQYJKoZIhvcNAQEEBQAwVzELMAkG A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw MDBaFw0xNDAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp 1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIABjAdBgNVHQ4EFgQU YHtmGkUNl8qJUC99BM00qP/8/UswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0B AQQFAAOCAQEArqqf/LfSyx9fOSkoGJ40yWxPbxrwZKJwSk8ThptgKJ7ogUmYfQq7 5bCdPTbbjwVR/wkxKh/diXeeDy5slQTthsu0AD+EAk2AaioteAuubyuig0SDH81Q gkwkr733pbTIWg/050deSY43lv6aiAU62cDbKYfmGZZHpzqmjIs8d/5GY6dT2iHR rH5Jokvmw2dZL7OKDrssvamqQnw1wdh/1acxOk5jQzmvCLBhNIzTmKlDNPYPhyk7 ncJWWJh3w/cbrPad+D6qp1RF8PX51TFl/mtYnHGzHtdS6jIX/EBgHcl5JLL2bP2o Zg6C3ZjL2sJETy6ge/L3ayx2EYRGinij4w== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h /t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf ReYNnyicsbkqWletNw+vHX/bvZ8= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH /PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu 9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo 2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI 4uJEvlz36hz1 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4 04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9 3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9 nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3 7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi AmvZWg== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG 9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+ TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0 LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG 9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9 WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG 9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs 2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIH/zCCB2igAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARwxCzAJBgNVBAYTAkVT MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEzMDEGA1UECxMq SVBTIENBIENoYWluZWQgQ0FzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MTMwMQYD VQQDEypJUFMgQ0EgQ2hhaW5lZCBDQXMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx HjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczAeFw0wMTEyMzExMTE0NTRa Fw0yNTEyMjkxMTE0NTRaMIIBHDELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNl bG9uYTESMBAGA1UEBxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQg cHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMu ZXMgQy5JLkYuICBCLTYwOTI5NDUyMTMwMQYDVQQLEypJUFMgQ0EgQ2hhaW5lZCBD QXMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxMzAxBgNVBAMTKklQUyBDQSBDaGFp bmVkIENBcyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3DQEJARYP aXBzQG1haWwuaXBzLmVzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCpOZZJ iHAzKHzoV9xIki3eLXp56UjxFehnY+c+Dh1nUiVO0t//vmGMP6B2LTFfx9FBKRBi kYcW7raIcSDi62Or0sAG5UUgG4ruGLE7XtCnnx4xjgbFZ4tTjdgi5Wh9GVhfP7Oo 9ahi8Eqao+alFbhvB6LD3xZZqM2j9cmD8GzYAQIDAQABo4IESzCCBEcwHQYDVR0O BBYEFAeUqHBsCqTumbhV3S5MRXf2Nq+5MIIBTgYDVR0jBIIBRTCCAUGAFAeUqHBs CqTumbhV3S5MRXf2Nq+5oYIBJKSCASAwggEcMQswCQYDVQQGEwJFUzESMBAGA1UE CBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJ bnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0Bt YWlsLmlwcy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxMzAxBgNVBAsTKklQUyBDQSBD aGFpbmVkIENBcyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEzMDEGA1UEAxMqSVBT IENBIENoYWluZWQgQ0FzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZI hvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8E BQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMG CCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYB BAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMw EYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlwcy5lczBD BglghkgBhvhCAQ0ENhY0Q2hhaW5lZCBDQSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkg aHR0cHM6Ly93d3cuaXBzLmVzLzAqBglghkgBhvhCAQIEHRYbaHR0cHM6Ly93d3cu aXBzLmVzL2lwczIwMDIvMDgGCWCGSAGG+EIBBAQrFilodHRwczovL3d3dy5pcHMu ZXMvaXBzMjAwMi9pcHMyMDAyQ0FDLmNybDA9BglghkgBhvhCAQMEMBYuaHR0cHM6 Ly93d3cuaXBzLmVzL2lwczIwMDIvcmV2b2NhdGlvbkNBQy5odG1sPzA6BglghkgB hvhCAQcELRYraHR0cHM6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbENBQy5o dG1sPzA4BglghkgBhvhCAQgEKxYpaHR0cHM6Ly93d3cuaXBzLmVzL2lwczIwMDIv cG9saWN5Q0FDLmh0bWwwbwYDVR0fBGgwZjAvoC2gK4YpaHR0cHM6Ly93d3cuaXBz LmVzL2lwczIwMDIvaXBzMjAwMkNBQy5jcmwwM6AxoC+GLWh0dHBzOi8vd3d3YmFj ay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0FDLmNybDAvBggrBgEFBQcBAQQjMCEw HwYIKwYBBQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5lcy8wDQYJKoZIhvcNAQEFBQAD gYEATiRvY2nro9B6QNgTOgojWSrXMKpXHa6hLRxL2GZPEFg059x2ERs3pw7RlJJZ ctupZam06zvBnGfQL4ZhevXl6ST6RAAmOikuj8kbiFSgujjCJY1wv5/7zzgBWzdL NzqKC18p1T2KZa8B2qKfQCqzV/J3fgI/725+9ekqKNLiE5Q= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIH8jCCB1ugAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYTAkVT MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEuMCwGA1UECxMl SVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMl SVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3 DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIzMTExMTEwM1oXDTI1MTIyOTEx MTEwM1owggESMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYD VQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5n IFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4g IEItNjA5Mjk0NTIxLjAsBgNVBAsTJUlQUyBDQSBDTEFTRTEgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkxLjAsBgNVBAMTJUlQUyBDQSBDTEFTRTEgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzAN BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA55+R7+voFuF0vIkTodduR8ZfPxKU5u/h M+GrgqufAwHmdG+KF5fPVy8Mdi7mbqfK2veLFBVADbNq2e2+s2q8Ai0chS3vl//P l9rrR10eU79dVN4ndGMZfpXUMZblz0/Kq3Uvk5AsWUwfv1YokIhi4RMeBtOCVv3j LSV1rDsiap8CAwEAAaOCBFIwggROMB0GA1UdDgQWBBRtW6MBjmE3nQR4tq+blh0C QeXbeTCCAUQGA1UdIwSCATswggE3gBRtW6MBjmE3nQR4tq+blh0CQeXbeaGCARqk ggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UE BxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBT ZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBC LTYwOTI5NDUyMS4wLAYDVQQLEyVJUFMgQ0EgQ0xBU0UxIENlcnRpZmljYXRpb24g QXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMgQ0EgQ0xBU0UxIENlcnRpZmljYXRpb24g QXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYD VR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggr BgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIB FQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhC AQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGB D2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ0xBU0UxIENBIENlcnRp ZmljYXRlIGlzc3VlZCBieSBodHRwczovL3d3dy5pcHMuZXMvMCoGCWCGSAGG+EIB AgQdFhtodHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi8wOwYJYIZIAYb4QgEEBC4W LGh0dHBzOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTEuY3JsMEAG CWCGSAGG+EIBAwQzFjFodHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi9yZXZvY2F0 aW9uQ0xBU0UxLmh0bWw/MD0GCWCGSAGG+EIBBwQwFi5odHRwczovL3d3dy5pcHMu ZXMvaXBzMjAwMi9yZW5ld2FsQ0xBU0UxLmh0bWw/MDsGCWCGSAGG+EIBCAQuFixo dHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFTRTEuaHRtbDB1BgNV HR8EbjBsMDKgMKAuhixodHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAy Q0xBU0UxLmNybDA2oDSgMoYwaHR0cHM6Ly93d3diYWNrLmlwcy5lcy9pcHMyMDAy L2lwczIwMDJDTEFTRTEuY3JsMC8GCCsGAQUFBwEBBCMwITAfBggrBgEFBQcwAYYT aHR0cDovL29jc3AuaXBzLmVzLzANBgkqhkiG9w0BAQUFAAOBgQBacEdMbCU0z2bO X+iyJafrUbjPE+5KzJz2jB1YXC2d7kMy2Hhbp8gVyfUFQpd+F2IgBBj9z3IRNkDN foHhdse5j2cUUH+fno9jj8EPE2GPhXVmCjIP6KuPp8yzz89gC+ry+bkfSFzjHUQt K15I/jRAHfyJywwUrwtmklZIX0E5Og== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIH8jCCB1ugAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYTAkVT MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEuMCwGA1UECxMl SVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMl SVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3 DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIzMTExMTkzMVoXDTI1MTIyOTEx MTkzMVowggESMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYD VQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5n IFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4g IEItNjA5Mjk0NTIxLjAsBgNVBAsTJUlQUyBDQSBDTEFTRTMgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkxLjAsBgNVBAMTJUlQUyBDQSBDTEFTRTMgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzAN BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAve2QhYLxoN2P3DVo4Xw+6Gyb2vDjfzvB JRvH+WFIXO3KItC1dJk2W7iFnsZJnb65Q6NDKxhwfQ4XnLuBSPqMVJ6EHB++I1p2 pg0j7YOtec++o3ysS6zf1r01HSh8i85+AcGcgLO4Z79w9jtEGlSdrFhCLUjJJSEs XdzSbkEFrkMCAwEAAaOCBFIwggROMB0GA1UdDgQWBBT7o4z3Z4tAqk02rzCA6po7 4C9o6DCCAUQGA1UdIwSCATswggE3gBT7o4z3Z4tAqk02rzCA6po74C9o6KGCARqk ggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UE BxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBT ZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBC LTYwOTI5NDUyMS4wLAYDVQQLEyVJUFMgQ0EgQ0xBU0UzIENlcnRpZmljYXRpb24g QXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMgQ0EgQ0xBU0UzIENlcnRpZmljYXRpb24g QXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYD VR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggr BgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIB FQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhC AQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGB D2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ0xBU0UzIENBIENlcnRp ZmljYXRlIGlzc3VlZCBieSBodHRwczovL3d3dy5pcHMuZXMvMCoGCWCGSAGG+EIB AgQdFhtodHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi8wOwYJYIZIAYb4QgEEBC4W LGh0dHBzOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTMuY3JsMEAG CWCGSAGG+EIBAwQzFjFodHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi9yZXZvY2F0 aW9uQ0xBU0UzLmh0bWw/MD0GCWCGSAGG+EIBBwQwFi5odHRwczovL3d3dy5pcHMu ZXMvaXBzMjAwMi9yZW5ld2FsQ0xBU0UzLmh0bWw/MDsGCWCGSAGG+EIBCAQuFixo dHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFTRTMuaHRtbDB1BgNV HR8EbjBsMDKgMKAuhixodHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAy Q0xBU0UzLmNybDA2oDSgMoYwaHR0cHM6Ly93d3diYWNrLmlwcy5lcy9pcHMyMDAy L2lwczIwMDJDTEFTRTMuY3JsMC8GCCsGAQUFBwEBBCMwITAfBggrBgEFBQcwAYYT aHR0cDovL29jc3AuaXBzLmVzLzANBgkqhkiG9w0BAQUFAAOBgQAiu2FuR8MoQlYw 3QtFc/BI7DgkUUeSIM49JoMU0H3a4Y+JbQxQ4q/n6yAbEuMETUyqob/HmS/NkLJq ur3RvGBseDXgxNyePGjFc97ITNWf5X1+4CXtBf+TTKNEMg1UpPbCz+9EkjzTcYj1 5tjLbAp/mmLLZmCOV7cCGuXGSTBNzA== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIH/zCCB2igAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYTAkVT MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMm SVBTIENBIENMQVNFQTEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMT JklQUyBDQSBDTEFTRUExIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZI hvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcNMDExMjMxMTEyMTQxWhcNMjUxMjI5 MTEyMTQxWjCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmlj YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMw gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM8g89BgSKoCxBXZ5C+NnlURLSnM UWZoAGXaFFWf6q7f69uN1nXaUfTEzPstvTUfE7fpZmF8lEDz+2AvjBg086hVnra0 b0APA0VnanJyW2ZIlkKFGMCB4WJqh7JB7i45jITVXthPV2vsjlKM97Pnnhimz8Fb r+RZcsz69vRptMqxAgMBAAGjggRbMIIEVzAdBgNVHQ4EFgQUL8zsbGe+T/iqPIiN EvvHnUxb9F4wggFGBgNVHSMEggE9MIIBOYAUL8zsbGe+T/iqPIiNEvvHnUxb9F6h ggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmlj YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOC AQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUF BwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYB BAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglg hkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1Ud EgQTMBGBD2lwc0BtYWlsLmlwcy5lczBDBglghkgBhvhCAQ0ENhY0Q0xBU0VBMSBD QSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cHM6Ly93d3cuaXBzLmVzLzAqBglg hkgBhvhCAQIEHRYbaHR0cHM6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDwGCWCGSAGG +EIBBAQvFi1odHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VB MS5jcmwwQQYJYIZIAYb4QgEDBDQWMmh0dHBzOi8vd3d3Lmlwcy5lcy9pcHMyMDAy L3Jldm9jYXRpb25DTEFTRUExLmh0bWw/MD4GCWCGSAGG+EIBBwQxFi9odHRwczov L3d3dy5pcHMuZXMvaXBzMjAwMi9yZW5ld2FsQ0xBU0VBMS5odG1sPzA8BglghkgB hvhCAQgELxYtaHR0cHM6Ly93d3cuaXBzLmVzL2lwczIwMDIvcG9saWN5Q0xBU0VB MS5odG1sMHcGA1UdHwRwMG4wM6AxoC+GLWh0dHBzOi8vd3d3Lmlwcy5lcy9pcHMy MDAyL2lwczIwMDJDTEFTRUExLmNybDA3oDWgM4YxaHR0cHM6Ly93d3diYWNrLmlw cy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRUExLmNybDAvBggrBgEFBQcBAQQjMCEw HwYIKwYBBQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5lcy8wDQYJKoZIhvcNAQEFBQAD gYEAGY2khC4v4mlenqRcy8Mn8mcWca88t4CY9LCJMqlIt7i559BNkMMB66tXsNp9 N2QhnTordKOjkdgZJmCb7DUdMJEQQT0Y5W7JA6WvHatAFu8feRJ4ImaTjI0Xz3Dd Jbz6O++igCw0l4EY5gayn2BFpAm+7ZpEcdpR/OCOH80lNDo= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIH/zCCB2igAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYTAkVT MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMm SVBTIENBIENMQVNFQTMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMT JklQUyBDQSBDTEFTRUEzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZI hvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcNMDExMjMxMTEyMzU5WhcNMjUxMjI5 MTEyMzU5WjCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENlcnRpZmlj YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMw gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMFh+lWUEmnBK5F6da6IALvvPO6f MWYw9LFAmwJsjcdKTVElPugUKLwgPLHxjO19kdmXIqPVzGOxq9krIwvdppffBYRU Fro6y8xja40gpdaeBXFGdVj19mR7C2adPoeVPTy1OTdSVLsWF8W/rdiLMy/p+PrV gTP/t56Fpu9MOeDjAgMBAAGjggRbMIIEVzAdBgNVHQ4EFgQU/J6FGtwGJXEh8C+L ElXQxYDuBq4wggFGBgNVHSMEggE9MIIBOYAU/J6FGtwGJXEh8C+LElXQxYDuBq6h ggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENlcnRpZmlj YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOC AQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUF BwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYB BAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglg hkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1Ud EgQTMBGBD2lwc0BtYWlsLmlwcy5lczBDBglghkgBhvhCAQ0ENhY0Q0xBU0VBMyBD QSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cHM6Ly93d3cuaXBzLmVzLzAqBglg hkgBhvhCAQIEHRYbaHR0cHM6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDwGCWCGSAGG +EIBBAQvFi1odHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VB My5jcmwwQQYJYIZIAYb4QgEDBDQWMmh0dHBzOi8vd3d3Lmlwcy5lcy9pcHMyMDAy L3Jldm9jYXRpb25DTEFTRUEzLmh0bWw/MD4GCWCGSAGG+EIBBwQxFi9odHRwczov L3d3dy5pcHMuZXMvaXBzMjAwMi9yZW5ld2FsQ0xBU0VBMy5odG1sPzA8BglghkgB hvhCAQgELxYtaHR0cHM6Ly93d3cuaXBzLmVzL2lwczIwMDIvcG9saWN5Q0xBU0VB My5odG1sMHcGA1UdHwRwMG4wM6AxoC+GLWh0dHBzOi8vd3d3Lmlwcy5lcy9pcHMy MDAyL2lwczIwMDJDTEFTRUEzLmNybDA3oDWgM4YxaHR0cHM6Ly93d3diYWNrLmlw cy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRUEzLmNybDAvBggrBgEFBQcBAQQjMCEw HwYIKwYBBQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5lcy8wDQYJKoZIhvcNAQEFBQAD gYEAGG8JN0Ca0pQR0X/Lg33qtKfi2JPe2iRqdRswDoL3CTn+bRN20V/wbKDAwyxc 7eJOroysytPkEF4wZhipaKCjaWJROZGCeU1jM7mZe9pQPzeofT//VLi8zKaUA4lZ BvYI44gntZQoaFxJna5NHHde+mbbPYlHb8c6g0mf9S3tODs= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIIQTCCB6qgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCAR4xCzAJBgNVBAYTAkVT MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjE0MDIGA1UECxMr SVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTE0MDIG A1UEAxMrSVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 eTEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIzMTExMjY0 M1oXDTI1MTIyOTExMjY0M1owggEeMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFy Y2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5l dCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlw cy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxNDAyBgNVBAsTK0lQUyBDQSBUaW1lc3Rh bXBpbmcgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxNDAyBgNVBAMTK0lQUyBDQSBU aW1lc3RhbXBpbmcgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHjAcBgkqhkiG9w0B CQEWD2lwc0BtYWlsLmlwcy5lczCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA 0umTdn+FPP2gAb0RL0ZCDyt/BZvGa/VRcayaUh8flSfMkO+WP45RNv0WAM43pSGU Rmvt5P+hfuqf0aKbOPMTxLmYumVFQ/nXvRWdlC4AYN6YGrk8yfXh/NbEJN/n48iE GRK0HFyz9eIWYSdg8vAt5PDzrPigeYSdReL2AfBE5ZECAwEAAaOCBIkwggSFMB0G A1UdDgQWBBSR2UK8nKnK0Bw3E1JXFqANHikdPjCCAVAGA1UdIwSCAUcwggFDgBSR 2UK8nKnK0Bw3E1JXFqANHikdPqGCASakggEiMIIBHjELMAkGA1UEBhMCRVMxEjAQ BgNVBAgTCUJhcmNlbG9uYTESMBAGA1UEBxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJ UFMgSW50ZXJuZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJp cHNAbWFpbC5pcHMuZXMgQy5JLkYuICBCLTYwOTI5NDUyMTQwMgYDVQQLEytJUFMg Q0EgVGltZXN0YW1waW5nIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MTQwMgYDVQQD EytJUFMgQ0EgVGltZXN0YW1waW5nIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4w HAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAM BgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYB BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIB FgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYD VR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlw cy5lczBIBglghkgBhvhCAQ0EOxY5VGltZXN0YW1waW5nIENBIENlcnRpZmljYXRl IGlzc3VlZCBieSBodHRwczovL3d3dy5pcHMuZXMvMCoGCWCGSAGG+EIBAgQdFhto dHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi8wQQYJYIZIAYb4QgEEBDQWMmh0dHBz Oi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJUaW1lc3RhbXBpbmcuY3JsMEYG CWCGSAGG+EIBAwQ5FjdodHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi9yZXZvY2F0 aW9uVGltZXN0YW1waW5nLmh0bWw/MEMGCWCGSAGG+EIBBwQ2FjRodHRwczovL3d3 dy5pcHMuZXMvaXBzMjAwMi9yZW5ld2FsVGltZXN0YW1waW5nLmh0bWw/MEEGCWCG SAGG+EIBCAQ0FjJodHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lUaW1l c3RhbXBpbmcuaHRtbDCBgQYDVR0fBHoweDA4oDagNIYyaHR0cHM6Ly93d3cuaXBz LmVzL2lwczIwMDIvaXBzMjAwMlRpbWVzdGFtcGluZy5jcmwwPKA6oDiGNmh0dHBz Oi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyVGltZXN0YW1waW5nLmNy bDAvBggrBgEFBQcBAQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5l cy8wDQYJKoZIhvcNAQEFBQADgYEAxKMCdGABCUwYXU900W1zDCfTSDC1TxFVGRnH I4soqfp4D34sJ/adkgD2GMgkAMVf+C1MY/yQFV4nmOal9K7SNrG1JR8OeDoRjpM4 rtO9qYbuHD3TW47/y/aZSZxP4ccocGpPOkvqfrnndKRKY0WUk/7Qg5aqpIXni2Gg olkTZbQ= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIF8DCCA9igAwIBAgIPBuhGJy8fCo/RhFzjafbVMA0GCSqGSIb3DQEBBQUAMDgx CzAJBgNVBAYTAkVTMRQwEgYDVQQKDAtJWkVOUEUgUy5BLjETMBEGA1UEAwwKSXpl bnBlLmNvbTAeFw0wNzEyMTMxMzA4MjdaFw0zNzEyMTMwODI3MjVaMDgxCzAJBgNV BAYTAkVTMRQwEgYDVQQKDAtJWkVOUEUgUy5BLjETMBEGA1UEAwwKSXplbnBlLmNv bTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMnTesoPHqynhugWZWqx whtFMnGV2f4QW8yv56V5AY+Jw8ryVXH3d753lPNypCxE2J6SmxQ6oeckkAoKVo7F 2CaU4dlI4S0+2gpy3aOZFdqBoof0e24md4lYrdbrDLJBenNubdt6eEHpCIgSfocu ZhFjbFT7PJ1ywLwu/8K33Q124zrX97RovqL144FuwUZvXY3gTcZUVYkaMzEKsVe5 o4qYw+w7NMWVQWl+dcI8IMVhulFHoCCQk6GQS/NOfIVFVJrRBSZBsLVNHTO+xAPI JXzBcNs79AktVCdIrC/hxKw+yMuSTFM5NyPs0wH54AlETU1kwOENWocivK0bo/4m tRXzp/yEGensoYi0RGmEg/OJ0XQGqcwL1sLeJ4VQJsoXuMl6h1YsGgEebL4TrRCs tST1OJGh1kva8bvS3ke18byB9llrzxlT6Y0Vy0rLqW9E5RtBz+GGp8rQap+8TI0G M1qiheWQNaBiXBZO8OOi+gMatCxxs1gs3nsL2xoP694hHwZ3BgOwye+Z/MC5TwuG KP7Suerj2qXDR2kS4Nvw9hmL7Xtw1wLW7YcYKCwEJEx35EiKGsY7mtQPyvp10gFA Wo15v4vPS8+qFsGV5K1Mij4XkdSxYuWC5YAEpAN+jb/af6IPl08M0w3719Hlcn4c yHf/W5oPt64FRuXxqBbsR6QXAgMBAAGjgfYwgfMwgbAGA1UdEQSBqDCBpYEPaW5m b0BpemVucGUuY29tpIGRMIGOMUcwRQYDVQQKDD5JWkVOUEUgUy5BLiAtIENJRiBB MDEzMzcyNjAtUk1lcmMuVml0b3JpYS1HYXN0ZWl6IFQxMDU1IEY2MiBTODFDMEEG A1UECQw6QXZkYSBkZWwgTWVkaXRlcnJhbmVvIEV0b3JiaWRlYSAxNCAtIDAxMDEw IFZpdG9yaWEtR2FzdGVpejAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB BjAdBgNVHQ4EFgQUHRxlDqjyJXu0kc/ksbHmvVV0bAUwDQYJKoZIhvcNAQEFBQAD ggIBAMeBRm8hGE+gBe/n1bqXUKJg7aWSFBpSm/nxiEqg3Hh10dUflU7F57dp5iL0 +CmoKom+z892j+Mxc50m0xwbRxYpB2iEitL7sRskPtKYGCwkjq/2e+pEFhsqxPqg l+nqbFik73WrAGLRne0TNtsiC7bw0fRue0aHwp28vb5CO7dz0JoqPLRbEhYArxk5 ja2DUBzIgU+9Ag89njWW7u/kwgN8KRwCfr00J16vU9adF79XbOnQgxCvv11N75B7 XSus7Op9ACYXzAJcY9cZGKfsK8eKPlgOiofmg59OsjQerFQJTx0CCzl+gQgVuaBp E8gyK+OtbBPWg50jLbJtooiGfqgNASYJQNntKE6MkyQP2/EeTXp6WuKlWPHcj1+Z ggwuz7LdmMySlD/5CbOlliVbN/UShUHiGUzGigjB3Bh6Dx4/glmimj4/+eAJn/3B kUtdyXvWton83x18hqrNA/ILUpLxYm9/h+qrdslsUMIZgq+qHfUgKGgu1fxkN0/P pUTEvnK0jHS0bKf68r10OEMr3q/53NjgnZ/cPcqlY0S/kqJPTIAcuxrDmkoEVU3K 7iYLHL8CxWTTnn7S05EcS6L1HOUXHA0MUqORH5zwIe0ClG+poEnK6EOMxPQ02nwi o8ZmPrgbBYhdurz3vOXcFD2nhqi2WVIhA16L4wTtSyoeo09Q -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEXzCCA0egAwIBAgIBATANBgkqhkiG9w0BAQUFADCB0DELMAkGA1UEBhMCRVMx SDBGBgNVBAoTP0laRU5QRSBTLkEuIC0gQ0lGIEEtMDEzMzcyNjAtUk1lcmMuVml0 b3JpYS1HYXN0ZWl6IFQxMDU1IEY2MiBTODFCMEAGA1UEBxM5QXZkYSBkZWwgTWVk aXRlcnJhbmVvIEV0b3JiaWRlYSAzIC0gMDEwMTAgVml0b3JpYS1HYXN0ZWl6MRMw EQYDVQQDEwpJemVucGUuY29tMR4wHAYJKoZIhvcNAQkBFg9JbmZvQGl6ZW5wZS5j b20wHhcNMDMwMTMwMjMwMDAwWhcNMTgwMTMwMjMwMDAwWjCB0DELMAkGA1UEBhMC RVMxSDBGBgNVBAoTP0laRU5QRSBTLkEuIC0gQ0lGIEEtMDEzMzcyNjAtUk1lcmMu Vml0b3JpYS1HYXN0ZWl6IFQxMDU1IEY2MiBTODFCMEAGA1UEBxM5QXZkYSBkZWwg TWVkaXRlcnJhbmVvIEV0b3JiaWRlYSAzIC0gMDEwMTAgVml0b3JpYS1HYXN0ZWl6 MRMwEQYDVQQDEwpJemVucGUuY29tMR4wHAYJKoZIhvcNAQkBFg9JbmZvQGl6ZW5w ZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC1btoCXXhp3xIW D+Bxl8nUCxkyiazWfpt0e68t+Qt9+lZjKZSdEw2Omj4qvr+ovRmDXO3iWpWVOWDl 3JHJjAzFCe8ZEBNDH+QNYwZHmPBaMYFOYFdbAFVHWvys152C308hcFJ6xWWGmjvl 2eMiEl9P2nR2LWue368DCu+ak7j3gjAXaCOdP1a7Bfr+RW3X2SC5R4Xyp8iHlL5J PHJD/WBkLrezwzQPdACw8m9EG7q9kUwlNpL32mROujS3ZkT6mQTzJieLiE3X04s0 uIUqVkk5MhjcHFf7al0N5CzjtTcnXYJKN2Z9EDVskk4olAdGi46eSoZXbjUOP5gk Ej6wVZAXAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG MB0GA1UdDgQWBBTqVk/sPIOhFIh4gbIrBSLAB0FbQjANBgkqhkiG9w0BAQUFAAOC AQEAYp7mEzzhw6o5Hf5+T5kcI+t4BJyiIWy7vHlLs/G8dLYXO81aN/Mzg928eMTR TxxYZL8dd9uwsJ50TVfX6L0R4Dyw6wikh3fHRrat9ufXi63j5K91Ysr7aXqnF38d iAgHYkrwC3kuxHBb9C0KBz6h8Q45/KCyN7d37wWAq38yyhPDlaOvyoE6bdUuK5hT m5EYA5JmPyrhQ1moDOyueWBAjxzMEMj+OAY1H90cLv6wszsqerxRrdTOHBdv7MjB EIpvEEQkXUxVXAzFuuT6m2t91Lfnwfl/IvljHaVC7DlyyhRYHD6D4Rx+4QKp4tWL vpw6LkI+gKNJ/YdMCsRZQzEEFA== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcN AQkBFglwa2lAc2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZp dHNlZXJpbWlza2Vza3VzMRAwDgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMw MVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMQsw CQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEQ MA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB AIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOB SvZiF3tfTQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkz ABpTpyHhOEvWgxutr2TC+Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvH LCu3GFH+4Hv2qEivbDtPL+/40UceJlfwUR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMP PbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDaTpxt4brNj3pssAki14sL 2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQFMAMBAf8w ggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwIC MIHDHoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDk AGwAagBhAHMAdABhAHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0 AHMAZQBlAHIAaQBtAGkAcwBrAGUAcwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABz AGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABrAGkAbgBuAGkAdABhAG0AaQBz AGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nwcy8wKwYDVR0f BCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcY P2/v6X2+MA4GA1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOi CfP+JmeaUOTDBS8rNXiRTHyoERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+g kcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyLabVAyJRld/JXIWY7zoVAtjNjGr95 HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678IIbsSt4beDI3poHS na9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkhMp6q qIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0Z TbvGRNs2yyqcjg== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDczCCAlugAwIBAgIBBDANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJLUjEN MAsGA1UECgwES0lTQTEuMCwGA1UECwwlS29yZWEgQ2VydGlmaWNhdGlvbiBBdXRo b3JpdHkgQ2VudHJhbDEWMBQGA1UEAwwNS0lTQSBSb290Q0EgMTAeFw0wNTA4MjQw ODA1NDZaFw0yNTA4MjQwODA1NDZaMGQxCzAJBgNVBAYTAktSMQ0wCwYDVQQKDARL SVNBMS4wLAYDVQQLDCVLb3JlYSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBDZW50 cmFsMRYwFAYDVQQDDA1LSVNBIFJvb3RDQSAxMIIBIDANBgkqhkiG9w0BAQEFAAOC AQ0AMIIBCAKCAQEAvATk+hM58DSWIGtsaLv623f/J/es7C/n/fB/bW+MKs0lCVsk 9KFo/CjsySXirO3eyDOE9bClCTqnsUdIxcxPjHmc+QZXfd3uOPbPFLKc6tPAXXdi 8EcNuRpAU1xkcK8IWsD3z3X5bI1kKB4g/rcbGdNaZoNy4rCbvdMlFQ0yb2Q3lIVG yHK+d9VuHygvx2nt54OJM1jT3qC/QOhDUO7cTWu8peqmyGGO9cNkrwYV3CmLP3WM vHFE2/yttRcdbYmDz8Yzvb9Fov4Kn6MRXw+5H5wawkbMnChmn3AmPC7fqoD+jMUE CSVPzZNHPDfqAmeS/vwiJFys0izgXAEzisEZ2wIBA6MyMDAwHQYDVR0OBBYEFL+2 J9gDWnZlTGEBQVYx5Yt7OtnMMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEF BQADggEBABOvUQveimpb5poKyLGQSk6hAp3MiNKrZr097LuxQpVqslxa/6FjZJap aBV/JV6K+KRzwYCKhQoOUugy50X4TmWAkZl0Q+VFnUkq8JSV3enhMNITbslOsXfl BM+tWh6UCVrXPAgcrnrpFDLBRa3SJkhyrKhB2vAhhzle3/xk/2F0KpzZm4tfwjeT 2KM3LzuTa7IbB6d/CVDv0zq+IWuKkDsnSlFOa56ch534eJAx7REnxqhZvvwYC/uO fi5C4e3nCSG9uRPFVmf0JqZCQ5BEVLRxm3bkGhKsGigA35vB1fjbXKP4krG9tNT5 UNkAAk/bg9ART6RCVmE6fhMy04Qfybo= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIFUjCCBDqgAwIBAgIBAjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJLUjEN MAsGA1UEChMES0lTQTEuMCwGA1UECxMlS29yZWEgQ2VydGlmaWNhdGlvbiBBdXRo b3JpdHkgQ2VudHJhbDEWMBQGA1UEAxMNS0lTQSBSb290Q0EgMzAeFw0wNDExMTkw NjM5NTFaFw0xNDExMTkwNjM5NTFaMGQxCzAJBgNVBAYTAktSMQ0wCwYDVQQKEwRL SVNBMS4wLAYDVQQLEyVLb3JlYSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBDZW50 cmFsMRYwFAYDVQQDEw1LSVNBIFJvb3RDQSAzMIIBIDANBgkqhkiG9w0BAQEFAAOC AQ0AMIIBCAKCAQEA3rrtF2Wu0b1KPazbgHLMWOHn4ZPazDB6z+8Lri2nQ6u/p0LP CFYIpEcdffqG79gwlyY0YTyADvjU65/8IjAboW0+40zSVU4WQDfC9gdu2we1pYyW geKbXH6UYcjOhDyx+gDmctMJhXfp3F4hT7TkTvTiF6tQrxz/oTlYdVsSspa5jfBw YkhbVigqpYeRNrkeJPW5unu2UlFbF1pgBWycwubGjD756t08jP+J3kNwrB248XXN OMpTDUdoasY8GMq94bS+DvTQ49IT+rBRERHUQavo9DmO4TSETwuTqmo4/OXGeEeu dhf6oYA3BgAVCP1rI476cg2V1ktisWjC3TSbXQIBA6OCAg8wggILMB8GA1UdIwQY MBaAFI+B8NqmzXQ8vmb0FWtGpP4GKMyqMB0GA1UdDgQWBBSPgfDaps10PL5m9BVr RqT+BijMqjAOBgNVHQ8BAf8EBAMCAQYwggEuBgNVHSAEggElMIIBITCCAR0GBFUd IAAwggETMDAGCCsGAQUFBwIBFiRodHRwOi8vd3d3LnJvb3RjYS5vci5rci9yY2Ev Y3BzLmh0bWwwgd4GCCsGAQUFBwICMIHRHoHOx3QAIMd4yZ3BHLKUACCs9cd4x3jJ ncEcx4WyyLLkACgAVABoAGkAcwAgAGMAZQByAHQAaQBmAGkAYwBhAHQAZQAgAGkA cwAgAGEAYwBjAHIAZQBkAGkAdABlAGQAIAB1AG4AZABlAHIAIABFAGwAZQBjAHQA cgBvAG4AaQBjACAAUwBpAGcAbgBhAHQAdQByAGUAIABBAGMAdAAgAG8AZgAgAHQA aABlACAAUgBlAHAAdQBiAGwAaQBjACAAbwBmACAASwBvAHIAZQBhACkwMwYDVR0R BCwwKqQoMCYxJDAiBgNVBAMMG+2VnOq1reygleuztOuztO2YuOynhO2dpeybkDAz BgNVHRIELDAqpCgwJjEkMCIGA1UEAwwb7ZWc6rWt7KCV67O067O07Zi47KeE7Z2l 7JuQMA8GA1UdEwEB/wQFMAMBAf8wDAYDVR0kBAUwA4ABADANBgkqhkiG9w0BAQUF AAOCAQEAz9b3Dv2wjG4FFY6oXCuyWtEeV6ZeGKqCEQj8mbdbp+PI0qLT+SQ09+Pk rolUR9NpScmAwRHr4inH9gaLX7riXs+rw87P7pIl3J85Hg4D9N6QW6FwmVzHc07J pHVJeyWhn4KSjU3sYcUMMqfHODiAVToqgx2cZHm5Dac1Smjvj/8F2LpOVmHY+Epw mAiWk9hgxzrsX58dKzVPSBShmrtv7tIDhlPxEMcHVGJeNo7iHCsdF03m9VrvirqC 6HfZKBF+N4dKlArJQOk1pTr7ZD7yXxZ683bXzu4/RB1Fql8RqlMcOh9SUWJUD6OQ Nc9Nb7rHviwJ8TX4Absk3TC8SA/u2Q== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDdjCCAl6gAwIBAgIEOhsEBTANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJE SzEMMAoGA1UEChMDS01EMQ8wDQYDVQQLEwZLTUQtQ0ExIzAhBgNVBAMTGktNRC1D QSBLdmFsaWZpY2VyZXQgUGVyc29uMB4XDTAwMTEyMTIzMjQ1OVoXDTE1MTEyMjIz MjQ1OVowUTELMAkGA1UEBhMCREsxDDAKBgNVBAoTA0tNRDEPMA0GA1UECxMGS01E LUNBMSMwIQYDVQQDExpLTUQtQ0EgS3ZhbGlmaWNlcmV0IFBlcnNvbjCCASIwDQYJ KoZIhvcNAQEBBQADggEPADCCAQoCggEBANriF4Xd6yD7ZlBE317UBDObn+vRMVc6 p3wNQODdEDJe2z1ncCz9NJvhoLGdOJhyg7VVPh0P2c+KZ9WI9mWOKZI2bp2WkLju jCcxbhTrurY3Wfc6gwLBqqFV8wWgaZKmvVWizjw9Kyi25f3yX4fOho6Qq2lvVbub tvVFXAd51GJ+/2Yed+a4Or2bz2RcqHS81B3pywsD4mgJR5xREv5jqPfwNP+V7bkc X+pfO4kVhZ/V+8MSPdQHgcV/iB3wP2mwgWyIBNc1reBidGTiz8unnWu55hcNfsvt LJbTs9OHhsR7naRuy+S402nDnD5vnONOFEsiHn46w+T0rtu7h6j4OvkCAwEAAaNW MFQwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUeWLqmhI42Jxj7DifDsW+ DlQhKD0wHwYDVR0jBBgwFoAUeWLqmhI42Jxj7DifDsW+DlQhKD0wDQYJKoZIhvcN AQEFBQADggEBANML/P42OuJ9aUV/0fItuIyc1JhqWvSqn5bXj+9eyEegcp8bHLHY 42D1O+z0lNipdjYPSdMJ0wZOEUhr+150SdDQ1P/zQL8AUaLEBkRt7ZdzXPVH3PER qnf9IrpYBknZKfCAoVchA6Rr9WU3Sd8bMoRfMLKg8c0M8G6EPwCTcOFriSkbtvNG zd8r8I+WfUYIN/p8DI9JT9qfjVODnYPRMUm6KPvq27TsrGruKrqyaV94kWc8co8A v3zFLeCtghvUiRBdx+8Q7m5t4CkuSr0WINrqjIPFW2QrM1r82y09Fd16RkqL4LOg Lh6vB5KnTApv62rWdw7zWwYnjY6/vXYY1Aw= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDWjCCAkKgAwIBAgIEO8rJUjANBgkqhkiG9w0BAQUFADBmMQswCQYDVQQGEwJE SzEMMAoGA1UEChMDS01EMQ8wDQYDVQQLEwZLTUQtQ0ExFjAUBgNVBAMTDUtNRC1D QSBTZXJ2ZXIxIDAeBgoJkiaJk/IsZAEDFBBpbmZvY2FAa21kLWNhLmRrMB4XDTk4 MTAxNjE5MTkyMVoXDTE4MTAxMjE5MTkyMVowZjELMAkGA1UEBhMCREsxDDAKBgNV BAoTA0tNRDEPMA0GA1UECxMGS01ELUNBMRYwFAYDVQQDEw1LTUQtQ0EgU2VydmVy MSAwHgYKCZImiZPyLGQBAxQQaW5mb2NhQGttZC1jYS5kazCCASIwDQYJKoZIhvcN AQEBBQADggEPADCCAQoCggEBAJsLpbSgFxQ7IhFgf5f+RfBxnbCkx5C7yTjfCZvp /BP2LBD3OKjgLRwvASoCU3I5NMhccho6uhZVf1HC+Ac5HmXUUd+v92a7gDnohPPy Rgv8c6f/+R2fFen37SBemYFDtZveamVXZ2To7xAxNiMKgPTPs/Rl7F6LDsYgv1bD 36FrjahNoSTmTbYRoK21eIOVwrZeNSzo9w3W8fj0n+V2IB1jsOh+AvjXkjbvAVky 0/57GMlyBNKP7JIGP7LXqwWfrBXuAph1DUMz467KlHZOMkPwCjTZOab7CcLQXCCY 12s5c5QAkwpf35hQRuOaNo6d/XFM6J9mofiWlGTT3Px1EX0CAwEAAaMQMA4wDAYD VR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAPlA6VZ2C2cJbsI0SBIe9v+M9 GxI45QI7P0D7QGyrqM7oNqGq7hJdN6NFb0LyPcF3/pVzmtYVJzaGKF6spaxOEveB 9ki1xRoXUKpaCxSweBpTzEktWa43OytRy0sbryEmHJCQkz8MPufWssf2yXHzgFFo XMQpcMyT7JwxPlfYVvab9Kp+nW7fIyDOG0wdmBerZ+GEQJxJEkri1HskjigxhGze ziocJatBuOWgqw5KRylgGIQjUGRTCbODVta+Kmqb9d+cB7FStbYtt2HebOXzBIY3 XUM5KtGC++We7DqgU5Firek7brw8i2XsHPLKJTceb6Xo6DsSxLfBAWV6+8DCkQ== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C +C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUx ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQD EytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBDKSBUYW51c2l0dmFueWtpYWRvMB4X DTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJBgNVBAYTAkhVMREw DwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9u c2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMr TmV0TG9jayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzAN BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNA OoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3ZW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC 2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63euyucYT2BDMIJTLrdKwW RMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQwDgYDVR0P AQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEW ggJNRklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0 YWxhbm9zIFN6b2xnYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFz b2sgYWxhcGphbiBrZXN6dWx0LiBBIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBO ZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1iaXp0b3NpdGFzYSB2ZWRpLiBB IGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0ZWxlIGF6IGVs b2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25s YXBqYW4gYSBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kg a2VyaGV0byBheiBlbGxlbm9yemVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4g SU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5kIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0 aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQUyBhdmFpbGFibGUg YXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwgYXQg Y3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmY ta3UzbM2xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2g pO0u9f38vf5NNwgMvOOWgyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4 Fp1hBWeAyNDYpQcCNJgEjTME1A== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhV MRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMe TmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0 dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFzcyBB KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oXDTE5MDIxOTIzMTQ0 N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhC dWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQu MRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBL b3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG 9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSMD7tM9DceqQWC2ObhbHDqeLVu0ThEDaiD zl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZz+qMkjvN9wfcZnSX9EUi 3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC/tmwqcm8 WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LY Oph7tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2Esi NCubMvJIH5+hCoR64sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCC ApswDgYDVR0PAQH/BAQDAgAGMBIGA1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4 QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZRUxFTSEgRXplbiB0 YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRhdGFz aSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtm ZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMg ZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVs amFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJhc2EgbWVndGFsYWxoYXRv IGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBzOi8vd3d3 Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6 ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1 YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3Qg dG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRs b2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNAbmV0bG9jay5uZXQuMA0G CSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5ayZrU3/b39/zcT0mwBQO xmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjPytoUMaFP 0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQ QeJBCWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxk f1qbFFgBJ34TUMdrKuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK 8CtmdWOMovsEPoMOmzbwGOQmIMOM8CgHrTwXZoi1/baI -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIG0TCCBbmgAwIBAgIBezANBgkqhkiG9w0BAQUFADCByTELMAkGA1UEBhMCSFUx ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMUIwQAYDVQQD EzlOZXRMb2NrIE1pbm9zaXRldHQgS296amVneXpvaSAoQ2xhc3MgUUEpIFRhbnVz aXR2YW55a2lhZG8xHjAcBgkqhkiG9w0BCQEWD2luZm9AbmV0bG9jay5odTAeFw0w MzAzMzAwMTQ3MTFaFw0yMjEyMTUwMTQ3MTFaMIHJMQswCQYDVQQGEwJIVTERMA8G A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxQjBABgNVBAMTOU5l dExvY2sgTWlub3NpdGV0dCBLb3pqZWd5em9pIChDbGFzcyBRQSkgVGFudXNpdHZh bnlraWFkbzEeMBwGCSqGSIb3DQEJARYPaW5mb0BuZXRsb2NrLmh1MIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx1Ilstg91IRVCacbvWy5FPSKAtt2/Goq eKvld/Bu4IwjZ9ulZJm53QE+b+8tmjwi8F3JV6BVQX/yQ15YglMxZc4e8ia6AFQe r7C8HORSjKAyr7c3sVNnaHRnUPYtLmTeriZ539+Zhqurf4XsoPuAzPS4DB6TRWO5 3Lhbm+1bOdRfYrCnjnxmOCyqsQhjF2d9zL2z8cM/z1A57dEZgxXbhxInlrfa6uWd vLrqOU+L73Sa58XQ0uqGURzk/mQIKAR5BevKxXEOC++r6uwSEaEYBTJp0QwsGj0l mT+1fMptsK6ZmfoIYOcZwvK9UdPM0wKswREMgM6r3JSda6M5UzrWhQIDAMV9o4IC wDCCArwwEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8EBAMCAQYwggJ1Bglg hkgBhvhCAQ0EggJmFoICYkZJR1lFTEVNISBFemVuIHRhbnVzaXR2YW55IGEgTmV0 TG9jayBLZnQuIE1pbm9zaXRldHQgU3pvbGdhbHRhdGFzaSBTemFiYWx5emF0YWJh biBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBBIG1pbm9zaXRldHQg ZWxla3Ryb25pa3VzIGFsYWlyYXMgam9naGF0YXMgZXJ2ZW55ZXN1bGVzZW5laywg dmFsYW1pbnQgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYSBNaW5vc2l0ZXR0IFN6 b2xnYWx0YXRhc2kgU3phYmFseXphdGJhbiwgYXogQWx0YWxhbm9zIFN6ZXJ6b2Rl c2kgRmVsdGV0ZWxla2JlbiBlbG9pcnQgZWxsZW5vcnplc2kgZWxqYXJhcyBtZWd0 ZXRlbGUuIEEgZG9rdW1lbnR1bW9rIG1lZ3RhbGFsaGF0b2sgYSBodHRwczovL3d3 dy5uZXRsb2NrLmh1L2RvY3MvIGNpbWVuIHZhZ3kga2VyaGV0b2sgYXogaW5mb0Bu ZXRsb2NrLm5ldCBlLW1haWwgY2ltZW4uIFdBUk5JTkchIFRoZSBpc3N1YW5jZSBh bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGFyZSBzdWJqZWN0IHRvIHRo ZSBOZXRMb2NrIFF1YWxpZmllZCBDUFMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3 Lm5ldGxvY2suaHUvZG9jcy8gb3IgYnkgZS1tYWlsIGF0IGluZm9AbmV0bG9jay5u ZXQwHQYDVR0OBBYEFAlqYhaSsFq7VQ7LdTI6MuWyIckoMA0GCSqGSIb3DQEBBQUA A4IBAQCRalCc23iBmz+LQuM7/KbD7kPgz/PigDVJRXYC4uMvBcXxKufAQTPGtpvQ MznNwNuhrWw3AkxYQTvyl5LGSKjN5Yo5iWH5Upfpvfb5lHTocQ68d4bDBsxafEp+ NFAwLvt/MpqNPfMgW/hqyobzMUwsWYACff44yTB1HLdV47yfuqhthCgFdbOLDcCR VCHnpgu0mfVRQdzNo0ci2ccBgcTcR08m6h/t280NmPSjnLRzMkqWmf68f8glWPhY 83ZmiVSkpj7EUFy6iRiCdUgh0k8T6GB+B3bbELVR5qq5aKrN9p2QdRLqOBrKROi3 macqaJVmlaut74nLYKkGEsaUR+ko -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUx ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQD EylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikgVGFudXNpdHZhbnlraWFkbzAeFw05 OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYDVQQGEwJIVTERMA8G A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5l dExvY2sgVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqG SIb3DQEBAQUAA4GNADCBiQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xK gZjupNTKihe5In+DCnVMm8Bp2GQ5o+2So/1bXHQawEfKOml2mrriRBf8TKPV/riX iK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr1nGTLbO/CVRY7QbrqHvc Q7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8E BAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1G SUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFu b3MgU3pvbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBh bGFwamFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExv Y2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGln aXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0 IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGph biBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJo ZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBP UlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmlj YXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBo dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNA bmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06 sPgzTEdM43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXa n3BukxowOR0w2y7jfLKRstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKS NitjrFgBazMpUIaD8QFI -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH /nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2 w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg 4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9 4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2 ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8 vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ /L7fCg0= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEajCCA1KgAwIBAgIBATANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJKUDEN MAsGA1UECgwESlBLSTEpMCcGA1UECwwgUHJlZmVjdHVyYWwgQXNzb2NpYXRpb24g Rm9yIEpQS0kxETAPBgNVBAsMCEJyaWRnZUNBMB4XDTAzMTIyNzA1MDgxNVoXDTEz MTIyNjE0NTk1OVowWjELMAkGA1UEBhMCSlAxDTALBgNVBAoMBEpQS0kxKTAnBgNV BAsMIFByZWZlY3R1cmFsIEFzc29jaWF0aW9uIEZvciBKUEtJMREwDwYDVQQLDAhC cmlkZ2VDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANTnUmg7K3m8 52vd77kwkq156euwoWm5no8E8kmaTSc7x2RABPpqNTlMKdZ6ttsyYrqREeDkcvPL yF7yf/I8+innasNtsytcTAy8xY8Avsbd4JkCGW9dyPjk9pzzc3yLQ64Rx2fujRn2 agcEVdPCr/XpJygX8FD5bbhkZ0CVoiASBmlHOcC3YpFlfbT1QcpOSOb7o+VdKVEi MMfbBuU2IlYIaSr/R1nO7RPNtkqkFWJ1/nKjKHyzZje7j70qSxb+BTGcNgTHa1YA UrogKB+UpBftmb4ds+XlkEJ1dvwokiSbCDaWFKD+YD4B2s0bvjCbw8xuZFYGhNyR /2D5XfN1s2MCAwEAAaOCATkwggE1MA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E BTADAQH/MG0GA1UdHwRmMGQwYqBgoF6kXDBaMQswCQYDVQQGEwJKUDENMAsGA1UE CgwESlBLSTEpMCcGA1UECwwgUHJlZmVjdHVyYWwgQXNzb2NpYXRpb24gRm9yIEpQ S0kxETAPBgNVBAsMCEJyaWRnZUNBMIGDBgNVHREEfDB6pHgwdjELMAkGA1UEBhMC SlAxJzAlBgNVBAoMHuWFrOeahOWAi+S6uuiqjeiovOOCteODvOODk+OCuTEeMBwG A1UECwwV6YO96YGT5bqc55yM5Y2U6K2w5LyaMR4wHAYDVQQLDBXjg5bjg6rjg4Pj grjoqo3oqLzlsYAwHQYDVR0OBBYEFNQXMiCqQNkR2OaZmQgLtf8mR8p8MA0GCSqG SIb3DQEBBQUAA4IBAQATjJo4reTNPC5CsvAKu1RYT8PyXFVYHbKsEpGt4GR8pDCg HEGAiAhHSNrGh9CagZMXADvlG0gmMOnXowriQQixrtpkmx0TB8tNAlZptZWkZC+R 8TnjOkHrk2nFAEC3ezbdK0R7MR4tJLDQCnhEWbg50rf0wZ/aF8uAaVeEtHXa6W0M Xq3dSe0XAcrLbX4zZHQTaWvdpLAIjl6DZ3SCieRMyoWUL+LXaLFdTP5WBCd+No58 IounD9X4xxze2aeRVaiV/WnQ0OSPNS7n7YXy6xQdnaOU4KRW/Lne1EDf5IfWC/ih bVAmhZMbcrkWWcsR6aCPG+2mV3zTD6AUzuKPal8Y -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp +ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og /zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y 4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza 8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB 4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd 8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A 4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd +LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B 4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK 4SVhM7JZG+Ju1zdXtg2pEto= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG 9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK SnQ2+Q== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6 MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp dHkgMjA0OCBWMzAeFw0wMTAyMjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAX BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAy MDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt49VcdKA3Xtp eafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7Jylg /9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGl wSMiuLgbWhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnh AMFRD0xS+ARaqn1y07iHKrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2 PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpu AWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB BjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4EFgQUB8NR MKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYc HnmYv/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/ Zb5gEydxiKRz44Rj0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+ f00/FGj1EVDVwfSQpQgdMWD/YIwjVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVO rSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395nzIlQnQFgCi/vcEkllgVsRch 6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kApKnXwiJPZ9d3 7CAFYd4= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEb MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRp ZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVow fjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAiBgNV BAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEB BQADggEPADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPM cm3ye5drswfxdySRXyWP9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3S HpR7LZQdqnXXs5jLrLxkU0C8j6ysNstcrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996 CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rCoznl2yY4rYsK7hljxxwk 3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3Vp6ea5EQz 6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNV HQ4EFgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1Ud EwEB/wQFMAMBAf8wgYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2Rv Y2EuY29tL1NlY3VyZUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRw Oi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmww DQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm4J4oqF7Tt/Q0 5qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtI gKvcnDe4IRRLDXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJ aD61JlfutuC23bkpgHl9j6PwpCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDl izeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1HRR3B7Hzs/Sk= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa /FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni 8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN QSdJQO7e5iNEOdyhIta6A/I= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO 0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj 7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS 8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB /zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ 3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR 3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDEl MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMh U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIz MloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09N IFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNlY3VyaXR5IENvbW11 bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSE RMqm4miO/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gO zXppFodEtZDkBp2uoQSXWHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5 bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4zZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDF MxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4bepJz11sS6/vmsJWXMY1 VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK9U2vP9eC OKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G CSqGSIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HW tWS3irO4G8za+6xmiEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZ q51ihPZRwSzJIxXYKLerJRO1RuGGAv8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDb EJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnWmHyojf6GPgcWkuF75x3sM3Z+ Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEWT1MKZPlO9L9O VL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy 1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENBMB4XDTAx MDQwNjEwNDkxM1oXDTIxMDQwNjEwNDkxM1owOTELMAkGA1UEBhMCRkkxDzANBgNV BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMSBDQTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue+H887dF+2rDNbS82rDTG 29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mXy47vPxVnqIJyY1MPQYx9EJUk oVqlBvqSV536pQHydekfvFYmUk54GWVYVQNYwBSujHxVX3BbdyMGNpfzJLWaRpXk 3w0LBUXl0fIdgrvGE+D+qnr9aTCU89JFhfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBL qdReLjVQCfOAl/QMF6452F/NM8EcyonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIIN nvmLVz5MxxftLItyM19yejhW1ebZrgUaHXVFsculJRwSVzb9IjcCAwEAAaMzMDEw DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQIR+IMi/ZTiFIwCwYDVR0PBAQDAgEG MA0GCSqGSIb3DQEBBQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE928Jj2VuX ZfsSZ9gqXLar5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0H DjxVyhbMp6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VO TzF2nBBhjrZTOqMRvq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2Uv kVrCqIexVmiUefkl98HVrhq4uz2PqYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2yIx4w zMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9ZIRlXvVWa -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt 5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s 3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu 8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ 3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJO TDEeMBwGA1UEChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFh dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEy MTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4wHAYDVQQKExVTdGFhdCBkZXIgTmVk ZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENB MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFtvszn ExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw71 9tV2U02PjLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MO hXeiD+EwR+4A5zN9RGcaC1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+U tFE5A3+y3qcym7RHjm+0Sq7lr7HcsBthvJly3uSJt3omXdozSVtSnA71iq3DuD3o BmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn622r+I/q85Ej0ZytqERAh SQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRVHSAAMDww OgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMv cm9vdC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA 7Jbg0zTBLL9s+DANBgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k /rvuFbQvBgwp8qiSpGEN/KtcCFtREytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzm eafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbwMVcoEoJz6TMvplW0C5GUR5z6 u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3ynGQI0DvDKcWy 7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291 qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp 5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy 5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv 6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6 B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/ BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen 5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897 IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL +63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf 8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN +lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA 1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg 8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk 6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn 0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN sSi6 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9 MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w +2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B 26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0 Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ 9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8 jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1 ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEW MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM3WhcNMzYwOTE3MTk0NjM2WjB9 MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w +2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B 26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID AQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFul F2mHMMo0aEPQQa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCC ATgwLgYIKwYBBQUHAgEWImh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5w ZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL2ludGVybWVk aWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENvbW1lcmNpYWwgKFN0 YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0aGUg c2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0 aWZpY2F0aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93 d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgG CWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1 dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5fPGFf59Jb2vKXfuM/gTF wWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWmN3PH/UvS Ta0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst 0OcNOrg+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNc pRJvkrKTlMeIFw6Ttn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKl CcWw0bdT82AUuoVpaiF8H3VhFyAXe2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVF P0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA2MFrLH9ZXF2RsXAiV+uKa0hK 1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBsHvUwyKMQ5bLm KhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ 8dCAWZvLMdibD4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnm fyWl8kgAwKQB2j8= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBk MQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0 YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3Qg Q0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4MTgyMjA2MjBaMGQxCzAJBgNVBAYT AmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGlnaXRhbCBDZXJ0aWZp Y2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIICIjAN BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9 m2BtRsiMMW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdih FvkcxC7mlSpnzNApbjyFNDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/ TilftKaNXXsLmREDA/7n29uj/x2lzZAeAR81sH8A25Bvxn570e56eqeqDFdvpG3F EzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkCb6dJtDZd0KTeByy2dbco kdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn7uHbHaBu HYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNF vJbNcA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo 19AOeCMgkckkKmUpWyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjC L3UcPX7ape8eYIVpQtPM+GP+HkM5haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJW bjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNYMUJDLXT5xp6mig/p/r+D5kNX JLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0hBBYw FDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzc K6FptWfUjNP9MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzf ky9NfEBWMXrrpA9gzXrzvsMnjgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7Ik Vh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQMbFamIp1TpBcahQq4FJHgmDmHtqB sfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4HVtA4oJVwIHaM190e 3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtlvrsR ls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ip mXeascClOS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HH b6D0jqTsNFFbjCYDcKF31QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksf rK/7DZBaZmBwXarNeNQk7shBoJMBkpxqnvy5JMWzFYJ+vq6VK+uxwNrjAWALXmms hFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCyx/yP2FS1k2Kdzs9Z+z0Y zirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMWNY6E0F/6 MBr1mmz0DlP5OlvRHA== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDtTCCAp2gAwIBAgIIBhDCeat3PfIwDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UE BhMCQ0gxEjAQBgNVBAoTCVN3aXNzU2lnbjEyMDAGA1UEAxMpU3dpc3NTaWduIENB IChSU0EgSUsgTWF5IDYgMTk5OSAxODowMDo1OCkxHzAdBgkqhkiG9w0BCQEWEGNh QFN3aXNzU2lnbi5jb20wHhcNMDAxMTI2MjMyNzQxWhcNMzExMTI2MjMyNzQxWjB2 MQswCQYDVQQGEwJDSDESMBAGA1UEChMJU3dpc3NTaWduMTIwMAYDVQQDEylTd2lz c1NpZ24gQ0EgKFJTQSBJSyBNYXkgNiAxOTk5IDE4OjAwOjU4KTEfMB0GCSqGSIb3 DQEJARYQY2FAU3dpc3NTaWduLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC AQoCggEBAKw5fjnmNneLQlUCQG8jQLwwfbrOZoUwNX8cbNqhxK03/xUloFVgAt+S Te2RxNXaCAXLBPn5ZST35TLV57aLmbHCtifv3YZqaaQGvjedltIBMJihJhZ+h3LY SKsUb+xEJ3x5ZUf8jP+Q1g57y1s8SnBFWN/ni5NkF1Y1y31VwOi9wiOf/VISL+uu SC4i1CP1Kbz3BDs6Hht1GpRYCbJ/K0bc9oJSpWpT5PGONsGIawqMbJuyoDghsXQ1 pbn2e8K64BSscGZVZTNooSGgNiHmACNJBYXiWVWrwXPF4l6SddmC3Rj0aKXjgECc FkHLDQcsM5JsK2ZLryTDUsQFbxVP2ikCAwEAAaNHMEUwCwYDVR0PBAQDAgEGMAwG A1UdEwQFMAMBAf8wHQYDVR0OBBYEFJbXcc05KtT8iLGKq1N4ae+PR34WMAkGA1Ud IwQCMAAwDQYJKoZIhvcNAQEFBQADggEBAKMy6W8HvZdS1fBpEUzl6Lvw50bgE1Xc HU1JypSBG9mhdcXZo5AlPB4sCvx9Dmfwhyrdsshc0TP2V3Vh6eQqnEF5qB4lVziT Bko9mW6Ot+pPnwsy4SHpx3rw6jCYnOqfUcZjWqqqRrq/3P1waz+Mn4cLMVEg3Xaz qYov/khvSqS0JniwjRlo2H6f/1oVUKZvP+dUhpQepfZrOqMAWZW4otp6FolyQyeU NN6UCRNiUKl5vTijbKwUUwfER/1Vci3M1/O1QCfttQ4vRN4Buc0xqYtGL3cd5WiO vWzyhlTzAI6VUdNkQhhHJSAyTpj6dmXDRzrryoFGa2PjgESxz7XBaSI= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8 76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+ bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c 6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7 lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn 8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6 45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5 O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a 77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3 92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIFwTCCA6mgAwIBAgIITrIAZwwDXU8wDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UE BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEjMCEGA1UEAxMaU3dpc3NTaWdu IFBsYXRpbnVtIENBIC0gRzIwHhcNMDYxMDI1MDgzNjAwWhcNMzYxMDI1MDgzNjAw WjBJMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMSMwIQYDVQQD ExpTd2lzc1NpZ24gUGxhdGludW0gQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQAD ggIPADCCAgoCggIBAMrfogLi2vj8Bxax3mCq3pZcZB/HL37PZ/pEQtZ2Y5Wu669y IIpFR4ZieIbWIDkm9K6j/SPnpZy1IiEZtzeTIsBQnIJ71NUERFzLtMKfkr4k2Htn IuJpX+UFeNSH2XFwMyVTtIc7KZAoNppVRDBopIOXfw0enHb/FZ1glwCNioUD7IC+ 6ixuEFGSzH7VozPY1kneWCqv9hbrS3uQMpe5up1Y8fhXSQQeol0GcN1x2/ndi5ob jM89o03Oy3z2u5yg+gnOI2Ky6Q0f4nIoj5+saCB9bzuohTEJfwvH6GXp43gOCWcw izSC+13gzJ2BbWLuCB4ELE6b7P6pT1/9aXjvCR+htL/68++QHkwFix7qepF6w9fl +zC8bBsQWJj3Gl/QKTIDE0ZNYWqFTFJ0LwYfexHihJfGmfNtf9dng34TaNhxKFrY zt3oEBSa/m0jh26OWnA81Y0JAKeqvLAxN23IhBQeW71FYyBrS3SMvds6DsHPWhaP pZjydomyExI7C3d3rLvlPClKknLKYRorXkzig3R3+jVIeoVNjZpTxN94ypeRSCtF KwH3HBqi7Ri6Cr2D+m+8jVeTO9TUps4e8aCxzqv9KyiaTxvXw3LbpMS/XUz13XuW ae5ogObnmLo2t/5u7Su9IPhlGdpVCX4l3P5hYnL5fhgC72O00Puv5TtjjGePAgMB AAGjgawwgakwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O BBYEFFCvzAeHFUdvOMW0ZdHelarp35zMMB8GA1UdIwQYMBaAFFCvzAeHFUdvOMW0 ZdHelarp35zMMEYGA1UdIAQ/MD0wOwYJYIV0AVkBAQEBMC4wLAYIKwYBBQUHAgEW IGh0dHA6Ly9yZXBvc2l0b3J5LnN3aXNzc2lnbi5jb20vMA0GCSqGSIb3DQEBBQUA A4ICAQAIhab1Fgz8RBrBY+D5VUYI/HAcQiiWjrfFwUF1TglxeeVtlspLpYhg0DB0 uMoI3LQwnkAHFmtllXcBrqS3NQuB2nEVqXQXOHtYyvkv+8Bldo1bAbl93oI9ZLi+ FHSjClTTLJUYFzX1UWs/j6KWYTl4a0vlpqD4U99REJNi54Av4tHgvI42Rncz7Lj7 jposiU0xEQ8mngS7twSNC/K5/FqdOxa3L8iYq/6KUFkuozv8KV2LwUvJ4ooTHbG/ u0IdUt1O2BReEMYxB+9xJ/cbOQncguqLs5WGXv312l0xpuAxtpTmREl0xRbl9x8D YSjFyMsSoEJL+WuICI20MhjzdZ/EfwBPBZWcoxcCw7NTm6ogOSkrZvqdr16zktK1 puEa+S1BaYEUtLS17Yk9zvupnTVCRLEcFHOBzyoBNZox1S2PbYTfgE1X4z/FhHXa icYwu+uPyyIIoK6q8QNsOktNCaUOcsZWayFCTiMlFGiudgp8DAdwZPmaL/YFOSbG DI8Zf0NebvRbFS/bYV3mZy8/CJT5YLSYMdp08YSTcU1f+2BY0fvEwW2JorsgH51x kcsymxM9Pn2SUjWskpSi0xjCfMfqr3YFFt1nJ8J+HAciIfNAChs0B0QTwoRqjt8Z Wr9/6x3iGjjRXK9HkmuAtTClyY3YqzGBH9/CZjfTk6mFhnll0g== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu IFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow RzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A MIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv Fz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br YT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF nbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH 6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt eJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/ c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ MoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH HTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf jNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6 5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU F6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c wpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB AHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp WJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9 xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ 2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ IseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8 aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X em1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR dAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/ OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+ hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjEL MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0 Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYwMTEyMTQzODQzWhcNMjUxMjMxMjI1 OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UEAxMc VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD ggEPADCCAQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jf tMjWQ+nEdVl//OEd+DFwIxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKg uNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2J XjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQXa7pIXSSTYtZgo+U4+lK 8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7uSNQZu+99 5OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1Ud EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3 kUrL84J6E1wIqzCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6 Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz JTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290 Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iS GNn3Bzn1LL4GdXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprt ZjluS5TmVfwLG4t3wVMTZonZKNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8 au0WOB9/WIFaGusyiC2y8zl3gK9etmF1KdsjTYjKUCjLhdLTEKJZbtOTVAB6okaV hgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kPJOzHdiEoZa5X6AeI dUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfkvQ== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjEL MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0 Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYwMTEyMTQ0MTU3WhcNMjUxMjMxMjI1 OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UEAxMc VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD ggEPADCCAQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJW Ht4bNwcwIi9v8Qbxq63WyKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+Q Vl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo6SI7dYnWRBpl8huXJh0obazovVkdKyT2 1oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZuV3bOx4a+9P/FRQI2Alq ukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk2ZyqBwi1 Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1Ud EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NX XAek0CSnwPIA1DCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6 Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz JTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290 Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlN irTzwppVMXzEO2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8 TtXqluJucsG7Kv5sbviRmEb8yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6 g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9IJqDnxrcOfHFcqMRA/07QlIp2+gB 95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal092Y+tTmBvTwtiBj S+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc5A== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDtjCCAp6gAwIBAgIOBcAAAQACQdAGCk3OdRAwDQYJKoZIhvcNAQEFBQAwdjEL MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDQgQ0ExJTAjBgNVBAMTHFRDIFRydXN0 Q2VudGVyIENsYXNzIDQgQ0EgSUkwHhcNMDYwMzIzMTQxMDIzWhcNMjUxMjMxMjI1 OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgNCBDQTElMCMGA1UEAxMc VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgNCBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD ggEPADCCAQoCggEBALXNTJytrlG7fEjFDSmGehSt2VA9CXIgDRS2Y8b+WJ7gIV7z jyIZ3E6RIM1viCmis8GsKnK6i1S4QF/yqvhDhsIwXMynXX/GCEnkDjkvjhjWkd0j FnmA22xIHbzB3ygQY9GB493fL3l1oht48pQB5hBiecugfQLANIJ7x8CtHUzXapZ2 W78mhEj9h/aECqqSB5lIPGG8ToVYx5ct/YFKocabEvVCUNFkPologiJw3fX64yhC L04y87OjNopq1mJcrPoBbbTgci6VaLTxkwzGioLSHVPqfOA/QrcSWrjN2qUGZ8uh d32llvCSHmcOHUJG5vnt+0dTf1cERh9GX8eu4I8CAwEAAaNCMEAwDwYDVR0TAQH/ BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFB/quz4lGwa9pd1iBX7G TFq/6A9DMA0GCSqGSIb3DQEBBQUAA4IBAQBYpCubTPfkpJKknGWYGWIi/HIy6QRd xMRwLVpG3kxHiiW5ot3u6hKvSI3vK2fbO8w0mCr3CEf/Iq978fTr4jgCMxh1KBue dmWsiANy8jhHHYz1nwqIUxAUu4DlDLNdjRfuHhkcho0UZ3iMksseIUn3f9MYv5x5 +F0IebWqak2SNmy8eesOPXmK2PajVnBd3ttPedJ60pVchidlvqDTB4FAVd0Qy+BL iILAkH0457+W4Ze6mqtCD9Of2J4VMxHL94J59bXAQVaS4d9VA61Iz9PyLrHHLVZM ZHQqMc7cdalUR6SnQnIJ5+ECpkeyBM1CE+FhDOB4OiIgohxgQoaH96Xm -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTEL MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNV BAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1 c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcNMDYwMzIyMTU1NDI4WhcNMjUxMjMx MjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIg R21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYwJAYD VQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcN AQEBBQADggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSR JJZ4Hgmgm5qVSkr1YnwCqMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3T fCZdzHd55yx4Oagmcw6iXSVphU9VDprvxrlE4Vc93x9UIuVvZaozhDrzznq+VZeu jRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtwag+1m7Z3W0hZneTvWq3z wZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9OgdwZu5GQ fezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYD VR0jBBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAO BgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0G CSqGSIb3DQEBBQUAA4IBAQAo0uCG1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X1 7caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/CyvwbZ71q+s2IhtNerNXxTPqYn 8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3ghUJGooWMNjs ydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/ 2TYcuiUaUj0a7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIF3zCCA8egAwIBAgIOGTMAAQACKBqaBLzyVUUwDQYJKoZIhvcNAQEFBQAwejEL MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNV BAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEnMCUGA1UEAxMeVEMgVHJ1 c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJMB4XDTA2MDMyMjE1NTgzNFoXDTMwMTIz MTIyNTk1OVowejELMAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVy IEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEnMCUG A1UEAxMeVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJMIICIjANBgkqhkiG 9w0BAQEFAAOCAg8AMIICCgKCAgEAi9R3azRs5TbYalxeOO781R15Azt7g2JEgk6I 7d6D/+7MUGIFBZWZdpj2ufJf2AaRksL2LWYXH/1TA+iojWOpbuHWG4y8mLOLO9Tk Lsp9hUkmW3m4GotAnn+7yT9jLM/RWny6KCJBElpN+Rd3/IX9wkngKhh/6aAsnPlE /AxoOUL1JwW+jhV6YJ3wO8c85j4WvK923mq3ouGrRkXrjGV90ZfzlxElq1nroCLZ gt2Y7X7i+qBhCkoy3iwX921E6oFHWZdXNwM53V6CItQzuPomCba8OYgvURVOm8M7 3xOCiN1LNPIz1pDp81PcNXzAw9l8eLPNcD+NauCjgUjkKa1juPD8KGQ7mbN9/pqd iPaZIgiRRxaJNXhdd6HPv0nh/SSUK2k2e+gc5iqQilvVOzRZQtxtz7sPQRxVzfUN Wy4WIibvYR6X/OJTyM9bo8ep8boOhhLLE8oVx+zkNo3aXBM9ZdIOXXB03L+PemrB Lg/Txl4PK1lszGFs/sBhTtnmT0ayWuIZFHCE+CAA7QGnl37DvRJckiMXoKUdRRcV I5qSCLUiiI3cKyTr4LEXaNOvYb3ZhXj2jbp4yjeNY77nrB/fpUcJucglMVRGURFV DYlcjdrSGC1z8rjVJ/VIIjfRYvd7Dcg4i6FKsPzQ8eu3hmPn4A5zf/1yUbXpfeJV BWR4Z38CAwEAAaNjMGEwHwYDVR0jBBgwFoAUzdeQoW6jv9sw1toyJZAM5jkegGUw DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFM3XkKFu o7/bMNbaMiWQDOY5HoBlMA0GCSqGSIb3DQEBBQUAA4ICAQB+FojoEw42zG4qhQc4 xlaJeuNHIWZMUAgxWlHQ/KZeFHXeTDvs8e3MfhEHSmHu6rOOOqQzxu2KQmZP8Tx7 yaUFQZmx7Cxb7tyW0ohTS3g0uW7muw/FeqZ8Dhjfbw90TNGp8aHp2FRkzF6WeKJW GsFzshXGVwXf2vdIJIqOf2qp+U3pPmrOYCx9LZAI9mOPFdAtnIz/8f38DBZQVhT7 upeG7rRJA1TuG1l/MDoCgoYhrv7wFfLfToPmmcW6NfcgkIw47XXP4S73BDD7Ua2O giRAyn0pXdXZ92Vk/KqfdLh9kl3ShCngE+qK99CrxK7vFcXCifJ7tjtJmGHzTnKR N4xJkunI7Cqg90lufA0kxmts8jgvynAF5X/fxisrgIDV2m/LQLvYG/AkyRDIRAJ+ LtOYqqIN8SvQ2vqOHP9U6OFKbt2o1ni1N6WsZNUUI8cOpevhCTjXwHxgpV2Yj4wC 1dxWqPNNWKkL1HxkdAEy8t8PSoqpAqKiHYR3wvHMl700GXRd4nQ+dSf3r7/ufA5t VIimVuImrTESPB5BeW0X6hNeH/Vcn0lZo7Ivo0LD+qh+v6WfSMlgYmIK371F3uNC tVGW/cT1Gpm4UqJEzS1hjBWPgdVdotSQPYxuQGHDWV3Y2eH2dEcieXR92sqjbzcV NvAsGnE8EXbfXRo+VGN4a2V+Hw== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezEL MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNV BAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1 c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAeFw0wOTA5MDkwODE1MjdaFw0yOTEy MzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNUQyBUcnVzdENlbnRl ciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0ExKDAm BgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF 5+cvAqBNLaT6hdqbJYUtQCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYv DIRlzg9uwliT6CwLOunBjvvya8o84pxOjuT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8v zArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+EutCHnNaYlAJ/Uqwa1D7KRT yGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1M4BDj5yj dipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBh MB8GA1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMB Af8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI 4jANBgkqhkiG9w0BAQUFAAOCAQEAg8ev6n9NCjw5sWi+e22JLumzCecYV42Fmhfz dkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+KGwWaODIl0YgoGhnYIg5IFHY aAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhKBgePxLcHsU0G DeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV CIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPH LQNjO9Po5KIqwoIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJE SzEVMBMGA1UEChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQg Um9vdCBDQTAeFw0wMTA0MDUxNjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNV BAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJuZXQxHTAbBgNVBAsTFFREQyBJbnRl cm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxLhA vJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20jxsNu Zp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a 0vnRrEvLznWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc1 4izbSysseLlJ28TQx5yc5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGN eGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcD R0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZIAYb4QgEBBAQDAgAHMGUG A1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMMVERDIElu dGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxME Q1JMMTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3 WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAw HQYDVR0OBBYEFGxkAcf9hW2syNqeUAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJ KoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4IBAQBO Q8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540mgwV5dOy0uaOX wTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+ 2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm89 9qNLPg7kbWzbO0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0 jUNAE4z9mQNUecYu6oah9jrUCbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38 aQNiuJkFBT1reBK9sG9l -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJE SzEMMAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEw ODM5MzBaFw0zNzAyMTEwOTA5MzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNU REMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuHnEz9pPPEXyG9VhDr 2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0zY0s 2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItU GBxIYXvViGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKj dGqPqcNiKXEx5TukYBdedObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+r TpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/ BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB5DCB4TCB3gYIKoFQgSkB AQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5kay9yZXBv c2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRl ciBmcmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEu MS4xLiBDZXJ0aWZpY2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIg T0lEIDEuMi4yMDguMTY5LjEuMS4xLjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1Ud HwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEMMAoGA1UEChMDVERDMRQwEgYD VQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYmaHR0cDovL2Ny bC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy MTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZ J2cdUBVLc647+RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqG SIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACrom JkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4A9G28kNBKWKnctj7fAXmMXAnVBhO inxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYscA+UYyAFMP8uXBV2Y caaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9AOoB mbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQ YqbsFbS1AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9 BKNDLdr8C2LqL19iUw== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDMDCCApmgAwIBAgIQDY4VEuGsu3eNOOMk34ww8jANBgkqhkiG9w0BAQUFADCB yzELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJ Q2FwZSBUb3duMRowGAYDVQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMf Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3Rl IFBlcnNvbmFsIEJhc2ljIENBMSgwJgYJKoZIhvcNAQkBFhlwZXJzb25hbC1iYXNp Y0B0aGF3dGUuY29tMB4XDTk2MDEwMTAwMDAwMFoXDTIxMDEwMTIzNTk1OVowgcsx CzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNh cGUgVG93bjEaMBgGA1UEChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0Nl cnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQ ZXJzb25hbCBCYXNpYyBDQTEoMCYGCSqGSIb3DQEJARYZcGVyc29uYWwtYmFzaWNA dGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvLyTU23AUE+C FeZIlDWmWr5vQvoPR+53dXLdjUmbllegeNTKP1GzaQuRdhciB5dqxFGTS+CN7zeV oQxN2jSQHReJl+A1OFdKwPQIcOk8RHtQfmGakOMj04gRRif1CwcOu93RfyAKiLlW Cy4cgNrx454p7xS9CkT7G1sY0b8jkyECAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB /zANBgkqhkiG9w0BAQUFAAOBgQCIO/64+XpCRhGgpKJkhc1IHJzVilHNL8F9sQfP 1wHeMj+W5IT+0V6tDH4OY0lqDhDkl9A/xacp2aZTHkseP1T6wIQ1c+qRqdxdk1cF BgwHua8LRDmIIaDugnOpRi9pbCV0qc3fp9f9hTAElDVKpxszJCxEFu0KxN+AqmUa v3Em8A== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDITCCAoqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCByzELMAkGA1UEBhMCWkEx FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT ZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFBlcnNvbmFsIEJhc2lj IENBMSgwJgYJKoZIhvcNAQkBFhlwZXJzb25hbC1iYXNpY0B0aGF3dGUuY29tMB4X DTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgcsxCzAJBgNVBAYTAlpBMRUw EwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEaMBgGA1UE ChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2Vy dmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQZXJzb25hbCBCYXNpYyBD QTEoMCYGCSqGSIb3DQEJARYZcGVyc29uYWwtYmFzaWNAdGhhd3RlLmNvbTCBnzAN BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvLyTU23AUE+CFeZIlDWmWr5vQvoPR+53 dXLdjUmbllegeNTKP1GzaQuRdhciB5dqxFGTS+CN7zeVoQxN2jSQHReJl+A1OFdK wPQIcOk8RHtQfmGakOMj04gRRif1CwcOu93RfyAKiLlWCy4cgNrx454p7xS9CkT7 G1sY0b8jkyECAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQF AAOBgQAt4plrsD16iddZopQBHyvdEktTwq1/qqcAXJFAVyVKOKqEcLnZgA+le1z7 c8a914phXAPjLSeoF+CEhULcXpvGt7Jtu3Sv5D/Lp7ew4F2+eIMllNLbgQ95B21P 9DkVWlIBe94y1k049hJcBlDfBVu9FEuh3ym6O0GN92NWod8isQ== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDPDCCAqWgAwIBAgIQEj3w59oqIkekOIngiu7JZzANBgkqhkiG9w0BAQUFADCB 0TELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJ Q2FwZSBUb3duMRowGAYDVQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMf Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMbVGhhd3Rl IFBlcnNvbmFsIEZyZWVtYWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1m cmVlbWFpbEB0aGF3dGUuY29tMB4XDTk2MDEwMTAwMDAwMFoXDTIxMDEwMTIzNTk1 OVowgdExCzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNV BAcTCUNhcGUgVG93bjEaMBgGA1UEChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNV BAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24xJDAiBgNVBAMTG1Ro YXd0ZSBQZXJzb25hbCBGcmVlbWFpbCBDQTErMCkGCSqGSIb3DQEJARYccGVyc29u YWwtZnJlZW1haWxAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkC gYEA1GnX1LCUZFtx6UfYDFG26nKRsIRefS0Nj3sS34UldSh0OkIsYyeflXtL734Z hx2G6qPduc6WZBrCFG5ErHzmj+hND3EfQDimAKOHePb5lIZererAXnbr2RSjXW56 fAylS1V/Bhkpf56aJtVquzgkCGqYx7Hao5iR/Xnb5VrEHLkCAwEAAaMTMBEwDwYD VR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQAemGDU5fJUYLA9GoFkR/db o9lvwykLp9KpgUn2w22FFChFRAH0cVyVLhQPGivRqWvBX2c9FvFyIK++FsoOMF/J y6WTLMNnVB5yIoojdmyUHVFSbJ3E4EcC18y/8IB7GG4l3GJh1qb+wR1/2bP9jVxF EFrGZWSa6yz1A0/WSGL7Lg== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDLTCCApagAwIBAgIBADANBgkqhkiG9w0BAQQFADCB0TELMAkGA1UEBhMCWkEx FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT ZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMbVGhhd3RlIFBlcnNvbmFsIEZyZWVt YWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1mcmVlbWFpbEB0aGF3dGUu Y29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgdExCzAJBgNVBAYT AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEa MBgGA1UEChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRp b24gU2VydmljZXMgRGl2aXNpb24xJDAiBgNVBAMTG1RoYXd0ZSBQZXJzb25hbCBG cmVlbWFpbCBDQTErMCkGCSqGSIb3DQEJARYccGVyc29uYWwtZnJlZW1haWxAdGhh d3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA1GnX1LCUZFtx6UfY DFG26nKRsIRefS0Nj3sS34UldSh0OkIsYyeflXtL734Zhx2G6qPduc6WZBrCFG5E rHzmj+hND3EfQDimAKOHePb5lIZererAXnbr2RSjXW56fAylS1V/Bhkpf56aJtVq uzgkCGqYx7Hao5iR/Xnb5VrEHLkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zAN BgkqhkiG9w0BAQQFAAOBgQDH7JJ+Tvj1lqVnYiqk8E0RYNBvjWBYYawmu1I1XAjP MPuoSpaKH2JCI4wXD/S6ZJwXrEcp352YXtJsYHFcoqzceePnbgBHH7UNKOgCneSa /RP0ptl8sfjcXyMmCZGAc9AUG95DqYMl8uacLxXK/qarigd1iwzdUYRr5PjRznei gQ== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDODCCAqGgAwIBAgIQQAWyU6AaRkNQCYGPEhB27DANBgkqhkiG9w0BAQUFADCB zzELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJ Q2FwZSBUb3duMRowGAYDVQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMf Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEjMCEGA1UEAxMaVGhhd3Rl IFBlcnNvbmFsIFByZW1pdW0gQ0ExKjAoBgkqhkiG9w0BCQEWG3BlcnNvbmFsLXBy ZW1pdW1AdGhhd3RlLmNvbTAeFw05NjAxMDEwMDAwMDBaFw0yMTAxMDEyMzU5NTla MIHPMQswCQYDVQQGEwJaQTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIwEAYDVQQH EwlDYXBlIFRvd24xGjAYBgNVBAoTEVRoYXd0ZSBDb25zdWx0aW5nMSgwJgYDVQQL Ex9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMSMwIQYDVQQDExpUaGF3 dGUgUGVyc29uYWwgUHJlbWl1bSBDQTEqMCgGCSqGSIb3DQEJARYbcGVyc29uYWwt cHJlbWl1bUB0aGF3dGUuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJ Ztn4B0TPuYwu8KHvE0VsBd/eJxZRNkERbGw77f4QfRKe5ZtCmv5gMcNmt3M6SK5O 0DI3lIi1DbbZ8/JE2dWIEt12TfIa/G8jHnrx2JhFTgcQ7xZC0EN1bUre4qrJMf8f AHB8Zs8QJQi6+u4A6UYDZicRFTuqW/KY3TZCstqIdQIDAQABoxMwETAPBgNVHRMB Af8EBTADAQH/MA0GCSqGSIb3DQEBBQUAA4GBALpkCujztDHJJ2+idqAtNnHHhsAI wk7t2pokGYf8WiOcck0I361cwzskgR1Xj7YSpSID7xK90S1elo8mJk9LG3w7oFIa pag3hsRHKsrdQfho9cITQSma8AyozaH8FSMC23or1GJRQkfEox/00sVNVBDr2vDM p083DL08yxDjGugV -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDKTCCApKgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBzzELMAkGA1UEBhMCWkEx FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT ZXJ2aWNlcyBEaXZpc2lvbjEjMCEGA1UEAxMaVGhhd3RlIFBlcnNvbmFsIFByZW1p dW0gQ0ExKjAoBgkqhkiG9w0BCQEWG3BlcnNvbmFsLXByZW1pdW1AdGhhd3RlLmNv bTAeFw05NjAxMDEwMDAwMDBaFw0yMDEyMzEyMzU5NTlaMIHPMQswCQYDVQQGEwJa QTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIwEAYDVQQHEwlDYXBlIFRvd24xGjAY BgNVBAoTEVRoYXd0ZSBDb25zdWx0aW5nMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9u IFNlcnZpY2VzIERpdmlzaW9uMSMwIQYDVQQDExpUaGF3dGUgUGVyc29uYWwgUHJl bWl1bSBDQTEqMCgGCSqGSIb3DQEJARYbcGVyc29uYWwtcHJlbWl1bUB0aGF3dGUu Y29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJZtn4B0TPuYwu8KHvE0Vs Bd/eJxZRNkERbGw77f4QfRKe5ZtCmv5gMcNmt3M6SK5O0DI3lIi1DbbZ8/JE2dWI Et12TfIa/G8jHnrx2JhFTgcQ7xZC0EN1bUre4qrJMf8fAHB8Zs8QJQi6+u4A6UYD ZicRFTuqW/KY3TZCstqIdQIDAQABoxMwETAPBgNVHRMBAf8EBTADAQH/MA0GCSqG SIb3DQEBBAUAA4GBAGk2ifc0KjNyL2071CKyuG+axTZmDhs8obF1Wub9NdP4qPIH b4Vnjt4rueIXsDqg8A6iAJrf8xQVbrvIhVqYgPn/vnQdPfP+MCXRNzRn+qVxeTBh KXLA4CxM+1bkOqhv5TJZUtt1KFBZDPgLGeSs2a+WjS9Q2wfD6h+rM+D1KzGJ -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDNjCCAp+gAwIBAgIQNhIilsXjOKUgodJfTNcJVDANBgkqhkiG9w0BAQUFADCB zjELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJ Q2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UE CxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhh d3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNl cnZlckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIxMDEwMTIzNTk1OVow gc4xCzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcT CUNhcGUgVG93bjEdMBsGA1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNV BAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRo YXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1z ZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2 aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560 ZXUCTe/LCaIhUdib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j +ao6hnO2RlNYyIkFvYMRuHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/ BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQBlkKyID1bZ5jA01CbH0FDxkt5r1DmI CSLGpmODA/eZd9iy5Ri4XWPz1HP7bJyZePFLeH0ZJMMrAoT4vCLZiiLXoPxx7JGH IPG47LHlVYCsPVLIOQ7C8MAFT9aCdYy9X9LcdpoFEsmvcsPcJX6kTY4XpeCHf+Ga WuFg3GQjPEIuTQ== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG 9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta 3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk 6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 /qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 jVaMaA== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/ BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6 papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3 KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDIjCCAougAwIBAgIQNKT/9jCvTKU8MxdCoZRmdTANBgkqhkiG9w0BAQUFADCB xDELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJ Q2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UE CxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhh d3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0 ZS5jb20wHhcNOTYwODAxMDAwMDAwWhcNMjEwMTAxMjM1OTU5WjCBxDELMAkGA1UE BhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du MR0wGwYDVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlm aWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZl ciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8w DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl /Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF /rFrKbYvScg71CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982 OsK1ZiIS1ocNAgMBAAGjEzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEF BQADgYEAvkBpQW/G28GnvwfAReTQtUMeTJUzNelewj4o9qgNUNX/4gwP/FACjq6R ua00io2fJ3GqGcxL6ATK1BdrEhrWxl/WzV7/iXa/2EjYWb0IiokdV81FHlK6EpqE +hiJX+j5MDVqAWC5mYCDhQpu2vTJj15zLTFKY6B08h+LItIpPus= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3 dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3 DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91 yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG 7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ qdq5snUb9kLy78fyGPmJvKP/iiMucEc= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIICsDCCAhmgAwIBAgIQZ8jh6OO+HL38kTuOpiOHSTANBgkqhkiG9w0BAQUFADCB izELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxML RHVyYmFudmlsbGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENl cnRpZmljYXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwHhcN OTcwMTAxMDAwMDAwWhcNMjEwMTAxMjM1OTU5WjCBizELMAkGA1UEBhMCWkExFTAT BgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzANBgNV BAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAdBgNV BAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwgZ8wDQYJKoZIhvcNAQEBBQADgY0A MIGJAoGBANYrWHhhRYZT6jR7UZztsOYuGA7+4F+oJ9O0yeB8WU4WDnNUYMF/9p8u 6TqFJBU820cEY8OexJQaWt9MevPZQx08EHp5JduQ/vBR5zDWQQD9nyjfeb6Uu522 FOMjhdepQeBMpHmwKxqL8vg7ij5FrHGSALSQQZj7X+36ty6K+Ig3AgMBAAGjEzAR MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEAS+mqF4EF+3kKMZ/F QfRWVKvpwuWXjhj+kckMPiZkyaFMJ2SnvQGTVXFuF0853BvcSTUQOSP/ypvIz2Y/ 3Ewa1IEGQlIf4SaxFhe65nByMUToTo1b5NP50OOPJWQx5yr4GIg2GlLFDUE1G2m3 JvUXzMEZXkt8XOKDgJH6L/uatxY= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEb MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0 aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0yODEyMzEyMzU5NTla MH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO BgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUwIwYD VQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0B AQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWW fnJSoBVC21ndZHoa0Lh73TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMt TGo87IvDktJTdyR0nAducPy9C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7IL fhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW 1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7 kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0G A1UdDgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYD VR0TAQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v ZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRo dHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMu Y3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8NtwuleGFTQQuS9/ HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxIS jBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+ xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/Atyjcn dBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O9y5Xt5hwXsjEeLBi -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+ AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA 0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/ BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01 GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4 1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN ZetX2fNXlrtIzYE= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRS MRgwFgYDVQQHDA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJp bGltc2VsIHZlIFRla25vbG9qaWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSw VEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ryb25payB2ZSBLcmlwdG9sb2ppIEFy YcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNVBAsMGkthbXUgU2Vy dGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUgS8O2 ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAe Fw0wNzA4MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIx GDAWBgNVBAcMD0dlYnplIC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmls aW1zZWwgdmUgVGVrbm9sb2ppayBBcmHFn3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBU QUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZlIEtyaXB0b2xvamkgQXJh xZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2FtdSBTZXJ0 aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7Zr IFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIB IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4h gb46ezzb8R1Sf1n68yJMlaCQvEhOEav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yK O7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1xnnRFDDtG1hba+818qEhTsXO fJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR6Oqeyjh1jmKw lZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQID AQABo0IwQDAdBgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/ BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmP NOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4N5EY3ATIZJkrGG2AA1nJrvhY0D7t wyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLTy9LQQfMmNkqblWwM 7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYhLBOh gLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5n oN+J1q2MdqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUs yZyQ2uypQjyttgI= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOc UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx c8SxMQswCQYDVQQGDAJUUjEPMA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykg MjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8 dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMxMDI3MTdaFw0xNTAz MjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsgU2Vy dGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYD VQQHDAZBTktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kg xLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEu xZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7 XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GXyGl8hMW0kWxsE2qkVa2k heiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8iSi9BB35J YbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5C urKZ8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1 JuTm5Rh8i27fbMx4W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51 b0dewQIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV 9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46sWrv7/hg0Uw2ZkUd82YCdAR7 kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxEq8Sn5RTOPEFh fEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdA aLX/7KfS0zgYnNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKS RGQDJereW26fyfJOrN3H -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOc UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xS S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg SGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcNMDUxMTA3MTAwNzU3 WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVrdHJv bmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJU UjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSw bGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWe LiAoYykgS2FzxLFtIDIwMDUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB AQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqeLCDe2JAOCtFp0if7qnef J1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKIx+XlZEdh R3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJ Qv2gQrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGX JHpsmxcPbe9TmJEr5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1p zpwACPI2/z7woQ8arBT9pmAPAgMBAAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58S Fq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8GA1UdEwEB/wQFMAMBAf8wDQYJ KoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/nttRbj2hWyfIvwq ECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4 Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFz gw2lGh1uEpJ+hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotH uFEJjOp9zYhys2AzsfAKRO8P9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LS y3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5UrbnBEI= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOc UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xS S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg SGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4XDTA3MTIyNTE4Mzcx OVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxla3Ry b25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMC VFIxDzANBgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDE sGxldGnFn2ltIHZlIEJpbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7F ni4gKGMpIEFyYWzEsWsgMjAwNzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9NYvDdE3ePYakqtdTyuTFY KTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQvKUmi8wUG +7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveG HtyaKhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6P IzdezKKqdfcYbwnTrqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M 733WB2+Y8a+xwXrXgTW4qhe04MsCAwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHk Yb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G CSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/sPx+EnWVUXKgW AkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5 mxRZNTZPz/OOXl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsa XRik7r4EW5nVcV9VZWRi1aKbBFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZ qxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAKpoRq0Tl9 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx 3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIFkjCCA3qgAwIBAgIBCDANBgkqhkiG9w0BAQUFADA6MQswCQYDVQQGEwJDTjER MA8GA1UEChMIVW5pVHJ1c3QxGDAWBgNVBAMTD1VDQSBHbG9iYWwgUm9vdDAeFw0w ODAxMDEwMDAwMDBaFw0zNzEyMzEwMDAwMDBaMDoxCzAJBgNVBAYTAkNOMREwDwYD VQQKEwhVbmlUcnVzdDEYMBYGA1UEAxMPVUNBIEdsb2JhbCBSb290MIICIjANBgkq hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA2rPlBlA/9nP3xDK/RqUlYjOHsGj+p9+I A2N9Apb964fJ7uIIu527u+RBj8cwiQ9tJMAEbBSUgU2gDXRm8/CFr/hkGd656YGT 0CiFmUdCSiw8OCdKzP/5bBnXtfPvm65bNAbXj6ITBpyKhELVs6OQaG2BkO5NhOxM cE4t3iQ5zhkAQ5N4+QiGHUPR9HK8BcBn+sBR0smFBySuOR56zUHSNqth6iur8CBV mTxtLRwuLnWW2HKX4AzKaXPudSsVCeCObbvaE/9GqOgADKwHLx25urnRoPeZnnRc GQVmMc8+KlL+b5/zub35wYH1N9ouTIElXfbZlJrTNYsgKDdfUet9Ysepk9H50DTL qScmLCiQkjtVY7cXDlRzq6987DqrcDOsIfsiJrOGrCOp139tywgg8q9A9f9ER3Hd J90TKKHqdjn5EKCgTUCkJ7JZFStsLSS3JGN490MYeg9NEePorIdCjedYcaSrbqLA l3y74xNLytu7awj5abQEctXDRrl36v+6++nwOgw19o8PrgaEFt2UVdTvyie3AzzF HCYq9TyopZWbhvGKiWf4xwxmse1Bv4KmAGg6IjTuHuvlb4l0T2qqaqhXZ1LUIGHB zlPL/SR/XybfoQhplqCe/klD4tPq2sTxiDEhbhzhzfN1DiBEFsx9c3Q1RSw7gdQg 7LYJjD5IskkCAwEAAaOBojCBnzALBgNVHQ8EBAMCAQYwDAYDVR0TBAUwAwEB/zBj BgNVHSUEXDBaBggrBgEFBQcDAQYIKwYBBQUHAwIGCCsGAQUFBwMDBggrBgEFBQcD BAYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEFBQcDBwYIKwYBBQUHAwgGCCsGAQUF BwMJMB0GA1UdDgQWBBTZw9P4gJJnzF3SOqLXcaK0xDiALTANBgkqhkiG9w0BAQUF AAOCAgEA0Ih5ygiq9ws0oE4Jwul+NUiJcIQjL1HDKy9e21NrW3UIKlS6Mg7VxnGF sZdJgPaE0PC6t3GUyHlrpsVE6EKirSUtVy/m1jEp+hmJVCl+t35HNmktbjK81HXa QnO4TuWDQHOyXd/URHOmYgvbqm4FjMh/Rk85hZCdvBtUKayl1/7lWFZXbSyZoUkh 1WHGjGHhdSTBAd0tGzbDLxLMC9Z4i3WA6UG5iLHKPKkWxk4V43I29tSgQYWvimVw TbVEEFDs7d9t5tnGwBLxSzovc+k8qe4bqi81pZufTcU0hF8mFGmzI7GJchT46U1R IgP/SobEHOh7eQrbRyWBfvw0hKxZuFhD5D1DCVR0wtD92e9uWfdyYJl2b/Unp7uD pEqB7CmB9HdL4UISVdSGKhK28FWbAS7d9qjjGcPORy/AeGEYWsdl/J1GW1fcfA67 loMQfFUYCQSu0feLKj6g5lDWMDbX54s4U+xJRODPpN/xU3uLWrb2EZBL1nXz/gLz Ka/wI3J9FO2pXd96gZ6bkiL8HvgBRUGXx2sBYb4zaPKgZYRmvOAqpGjTcezHCN6j w8k2SjTxF+KAryAhk5Qe5hXTVGLxtTgv48y5ZwSpuuXu+RBuyy5+E6+SFP7zJ3N7 OPxzbbm5iPZujAv1/P8JDrMtXnt145Ik4ubhWD5LKAN1axibRww= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDhDCCAmygAwIBAgIBCTANBgkqhkiG9w0BAQUFADAzMQswCQYDVQQGEwJDTjER MA8GA1UEChMIVW5pVHJ1c3QxETAPBgNVBAMTCFVDQSBSb290MB4XDTA0MDEwMTAw MDAwMFoXDTI5MTIzMTAwMDAwMFowMzELMAkGA1UEBhMCQ04xETAPBgNVBAoTCFVu aVRydXN0MREwDwYDVQQDEwhVQ0EgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEP ADCCAQoCggEBALNdB8qGJn1r4vs4CQ7MgsJqGgCiFV/W6dQBt1YDAVmP9ThpJHbC XivF9iu/r/tB/Q9a/KvXg3BNMJjRnrJ2u5LWu+kQKGkoNkTo8SzXWHwk1n8COvCB a2FgP/Qz3m3l6ihST/ypHWN8C7rqrsRoRuTej8GnsrZYWm0dLNmMOreIy4XU9+gD Xv2yTVDo1h//rgI/i0+WITyb1yXJHT/7mLFZ5PCpO6+zzYUs4mBGzG+OoOvwNMXx QhhgrhLtRnUc5dipllq+3lrWeGeWW5N3UPJuG96WUUqm1ktDdSFmjXfsAoR2XEQQ th1hbOSjIH23jboPkXXHjd+8AmCoKai9PUMCAwEAAaOBojCBnzALBgNVHQ8EBAMC AQYwDAYDVR0TBAUwAwEB/zBjBgNVHSUEXDBaBggrBgEFBQcDAQYIKwYBBQUHAwIG CCsGAQUFBwMDBggrBgEFBQcDBAYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEFBQcD BwYIKwYBBQUHAwgGCCsGAQUFBwMJMB0GA1UdDgQWBBTbHzXza0z/QjFkm827Wh4d SBC37jANBgkqhkiG9w0BAQUFAAOCAQEAOGy3iPGt+lg3dNHocN6cJ1nL5BXXoMNg 14iABMUwTD3UGusGXllH5rxmy+AI/Og17GJ9ysDawXiv5UZv+4mCI4/211NmVaDe JRI7cTYWVRJ2+z34VFsxugAG+H1V5ad2g6pcSpemKijfvcZsCyOVjjN/Hl5AHxNU LJzltQ7dFyiuawHTUin1Ih+QOfTcYmjwPIZH7LgFRbu3DJaUxmfLI3HQjnQi1kHr A6i26r7EARK1s11AdgYg1GS4KUYGis4fk5oQ7vuqWrTcL9Ury/bXBYSYBZELhPc9 +tb5evosFeo2gkO3t7jj83EB7UNDogVFwygFBzXjAaU4HoDU18PZ3g== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCB kzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVUTiAtIERBVEFDb3Jw IFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBaMIGTMQswCQYDVQQG EwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYD VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cu dXNlcnRydXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjAN BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6 E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ysraP6LnD43m77VkIVni5c7yPeIbkFdicZ D0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlowHDyUwDAXlCCpVZvNvlK 4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA9P4yPykq lXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulW bfXv33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQAB o4GrMIGoMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT MtGzz3/64PGgXYVOktKeRR20TzA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3Js LnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dDLmNybDAqBgNVHSUEIzAhBggr BgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3DQEBBQUAA4IB AQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyj j98C5OBxOvG0I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVH KWss5nbZqSl9Mt3JNjy9rjXxEZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv 2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwPDPafepE39peC4N1xaf92P2BNPM/3 mfnGV/TJVTl4uix5yaaIK/QI -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUFADCB rjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0BgNVBAMTLVVUTi1VU0VSRmlyc3Qt Q2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAeFw05OTA3MDkxNzI4NTBa Fw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAV BgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5l dHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTE2MDQGA1UE AxMtVVROLVVTRVJGaXJzdC1DbGllbnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWls MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3B YHW8OWX5ShpHornMSMxqmNVNNRm5pELlzkniii8efNIxB8dOtINknS4p1aJkxIW9 hVE1eaROaJB7HHqkkqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8om+rWV6l L8/K2m2qL+usobNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLm SGHGTPNpsaguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM 1tZUOt4KpLoDd7NlyP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws 6wIDAQABo4G5MIG2MAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud DgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNVHR8EUTBPME2gS6BJhkdodHRw Oi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGllbnRBdXRoZW50 aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUH AwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rkMPxTbyUkxsrt4jFcKw7u 7mFVbwQ+zznexRtJlOTrIEy05p5QLnLZjfWqo7NK2lYcYJeA3IKirUq9iiv/Cwm0 xtcgBEXkzYABurorbs6q15L+5K/r9CYdFip/bDCVNy8zEqx/3cfREYxRmLLQo5HQ rfafnoOTHh1CuEava2bwm3/q4wMC5QJRwarVNZ1yQAOJujEdxRBoUp7fooXFXAim eOZTT7Hot9MUnpOmw2TjrH5xzbyf6QMbzPvprDHBr3wVdAKZw7JHpsIyYdfHb0gk USeh1YdV8nuPmD0Wnu51tvjQjvLzxq4oW6fw8zYX/MMF08oDSlQ= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt SGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG A1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v d3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn 0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ M6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a MXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd oI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI DsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy oUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0 dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy bDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF BQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM //bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli CE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t 3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUFADCB ozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3Qt TmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0ODM5WhcNMTkwNzA5MTg1 NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0 IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYD VQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VS Rmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IB DwAwggEKAoIBAQCz+5Gh5DZVhawGNFugmliy+LUPBXeDrjKxdpJo7CNKyXY/45y2 N3kDuatpjQclthln5LAbGHNhSuh+zdMvZOOmfAz6F4CjDUeJT1FxL+78P/m4FoCH iZMlIJpDgmkkdihZNaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXuOzr0hARe YFmnjDRy7rh4xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1 axwiP8vv/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6g yN7igEL66S/ozjIEj3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQD AgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFPqGydvguul49Uuo1hXf8NPh ahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9V VE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0GCSqGSIb3DQEB BQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXhi6r/fWRRzwr/vH3Y IWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUqf9FuVSTiuwL7MT++6Lzs QCv4AdRWOOTKRIK1YSAhZ2X28AvnNPilwpyjXEAfhZOVBt5P1CeptqX8Fs1zMT+4 ZSfP1FMa8Kxun08FDAOBp4QpxFq9ZFdyrTvPNximmMatBrTcCKME1SmklpoSZ0qM YEWd8SOasACcaLWYUNPvji6SZbFIPiG+FTAqDbUMo2s/rn9X9R+WfN9v3YIwLGUb QErNaLly7HF27FSOH4UMAWr6pjisH8SE -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEZjCCA06gAwIBAgIQRL4Mi1AAJLQR0zYt4LNfGzANBgkqhkiG9w0BAQUFADCB lTELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHTAbBgNVBAMTFFVUTi1VU0VSRmlyc3Qt T2JqZWN0MB4XDTk5MDcwOTE4MzEyMFoXDTE5MDcwOTE4NDAzNlowgZUxCzAJBgNV BAYTAlVTMQswCQYDVQQIEwJVVDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxHjAc BgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29yazEhMB8GA1UECxMYaHR0cDovL3d3 dy51c2VydHJ1c3QuY29tMR0wGwYDVQQDExRVVE4tVVNFUkZpcnN0LU9iamVjdDCC ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6qgT+jo2F4qjEAVZURnicP HxzfOpuCaDDASmEd8S8O+r5596Uj71VRloTN2+O5bj4x2AogZ8f02b+U60cEPgLO KqJdhwQJ9jCdGIqXsqoc/EHSoTbL+z2RuufZcDX65OeQw5ujm9M89RKZd7G3CeBo 5hy485RjiGpq/gt2yb70IuRnuasaXnfBhQfdDWy/7gbHd2pBnqcP1/vulBe3/IW+ pKvEHDHd17bR5PDv3xaPslKT16HUiaEHLr/hARJCHhrh2JU022R5KP+6LhHC5ehb kkj7RwvCbNqtMoNB86XlQXD9ZZBt+vpRxPm9lisZBCzTbafc8H9vg2XiaquHhnUC AwEAAaOBrzCBrDALBgNVHQ8EBAMCAcYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E FgQU2u1kdBScFDyr3ZmpvVsoTYs8ydgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDov L2NybC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmlyc3QtT2JqZWN0LmNybDApBgNV HSUEIjAgBggrBgEFBQcDAwYIKwYBBQUHAwgGCisGAQQBgjcKAwQwDQYJKoZIhvcN AQEFBQADggEBAAgfUrE3RHjb/c652pWWmKpVZIC1WkDdIaXFwfNfLEzIR1pp6ujw NTX00CXzyKakh0q9G7FzCL3Uw8q2NbtZhncxzaeAFK4T7/yxSPlrJSUtUbYsbUXB mMiKVl0+7kNOPmsnjtA6S4ULX9Ptaqd1y9Fahy85dRNacrACgZ++8A+EVCBibGnU 4U3GDZlDAQ0Slox4nb9QorFEqmrPF3rPbw/U+CRVX/A0FklmPlBGyWNxODFiuGK5 81OtbLUrohKqGU8J2l7nk8aOFAj+8DCAGKCGhU3IfdeLA/5u1fedFqySLKAj5ZyR Uh+U3xeUc8OzwcFxBSAAeL0TUh2oPs0AH8g= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIHqTCCBZGgAwIBAgIQYwaGp8U3ZaVDkKhqWMzUMjANBgkqhkiG9w0BAQUFADCB jzELMAkGA1UEBhMCTFYxNTAzBgNVBAoTLFZBUyBMYXR2aWphcyBQYXN0cyAtIFZp ZW4ucmVnLk5yLjQwMDAzMDUyNzkwMSMwIQYDVQQLExpTZXJ0aWZpa2FjaWphcyBw YWthbHBvanVtaTEkMCIGA1UEAxMbVkFTIExhdHZpamFzIFBhc3RzIFNTSShSQ0Ep MB4XDTA2MDkxMzA5MjIxMFoXDTI0MDkxMzA5Mjc1N1owgY8xCzAJBgNVBAYTAkxW MTUwMwYDVQQKEyxWQVMgTGF0dmlqYXMgUGFzdHMgLSBWaWVuLnJlZy5Oci40MDAw MzA1Mjc5MDEjMCEGA1UECxMaU2VydGlmaWthY2lqYXMgcGFrYWxwb2p1bWkxJDAi BgNVBAMTG1ZBUyBMYXR2aWphcyBQYXN0cyBTU0koUkNBKTCCAiIwDQYJKoZIhvcN AQEBBQADggIPADCCAgoCggIBAJu4+f1hVS9PpKUUtS6OuSSPrPuxVD9A/0/F5YZo e1OT+zWCNahQLpRSoNuDPnXaFXCsCc/ugkmtNkm5tHGLtAChQgbKCApjl7YI/O60 3Jh4GYLJ+H9kPqrJ/rGN67Bk9bzzxD46kOpOjj8bGbxqg8ORPGxV+wpSwOjhXXeF M8VJ3+xqv79sN/6OSaIVGM6LjmseOKMwb4iBfnJWRBrEejkP9sSPltSy6wBOXN67 5zu35iQFk2tN5pFEv+6YG8eFGxFBeyI2p74+6Ho33BjekJ2PzbLXmj/iF39bDOHv P2Y9biTksM7DDIhslNo4JXxSOeNzFLMARWOaDEJAXgTG93JkzsluM7Pk020klTeT fvIAXRmLH/NDc6ifRdIGqey0Qrv67gzHTz9RH9Gv0KwYf4eBIv6p3QeWbXz4TtlN OlBp1UF+xdp02I5z5X6D4cMZgbe9v0COvi6aogyqTgIuuyrhCF0xA8msJ7Cv3NXI FH1AnVWJIfmQzNTJYEFzq+jN2DpVOQqCmf6b9fU8HJHLwPpGVK4h/CqsXHveepdx /WxrzUiapNuBfBg3L5B9YZS9F8lctlQWd8oJSqrpvE+UdQFaVryS0o+515feVnQB 9xZxSbH1GEaZQe5i4bMsZXVpKXJDA/ibH/o49J7sQBCOrJfVsDO+nxjcLfdBeFRK YkTnAgMBAAGjggH9MIIB+TAOBgNVHQ8BAf8EBAMCAQYwGAYIKwYBBQUHAQMEDDAK MAgGBgQAjkYBATAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTMw/Vm/3OsOFqW GyGJuIFMH8teJTAQBgkrBgEEAYI3FQEEAwIBADCCAYkGA1UdIASCAYAwggF8MIIB eAYLKwYBBAGBxFkBAQIwggFnMIIBOAYIKwYBBQUHAgIwggEqHoIBJgBTAGkAcwAg AGkAcgAgAHMAZQByAHQAaQBmAGkAawBhAHQAcwAsACAAawBvACAAaQB6AGQAZQB2 AGkAcwAgAFYAQQBTACAATABhAHQAdgBpAGoAYQBzACAAUABhAHMAdABzACwAIABu AG8AZAByAG8AcwBpAG4AbwB0ACAAYQB0AGIAaQBsAHMAdABpAGIAdQAgAEUAbABl AGsAdAByAG8AbgBpAHMAawBvACAAZABvAGsAdQBtAGUAbgB0AHUAIABsAGkAawB1 AG0AYQBtACAAdQBuACAARQBpAHIAbwBwAGEAcwAgAFAAYQByAGwAYQBtAGUAbgB0 AGEAIABkAGkAcgBlAGsAdABpAHYAYQBpACAAMQA5ADkAOQAvADkAMwAvAEUASzAp BggrBgEFBQcCARYdaHR0cDovL3d3dy5lLW1lLmx2L3JlcG9zaXRvcnkwDQYJKoZI hvcNAQEFBQADggIBAB8oSjWQIWNoCi94r6MegiaXoz8nGdJLo0J6BhNlW8EEy+t9 fO+U8vGJ9bffUgIhadLqljTloM+XuJxVDhCFoxReLAX4tTp28/l6uN62DCdp8suU kQsdudWOb5kvzfIZVjk6SFbwAf+Cdbay/dHU9fJjV0xNoX7MELoEae/0FPyzlx9F 7m9KKH/Rxie8x6Opa3vtghNvq94P+3HrXBEaqSzQMJ/8NjdW75XpurcTtq6fAmGt nuxrBG82nw+Z98LJyEwouSjUIdeeVNXAzvSO5FWUe48kxjj8q3qkVnc9qEXvZJKk 0Ep+u3OL9A1Sc7g6SF5DgNOpcHdi/8coHHMeQ+YnJFtJueY2pI79xS0veqV5EnrX IbIlbcgPosNhS+VI4le6n/KKId3bZPDaGd/OwJuAOcJ3d2MVU3KE+qSPBzeGIX1Q +j1qN9uRDjez/c4Lynth0Jx0nH04aG3pex3W8Sq07ztgUncF5gLCX4xbvPB9t3PH kWuyKrNjozTVq60lcUf/Gj56to2VdsPups0DCWzuRWeYz5lIdsHOinSaaFIBNCLI 7eIUC4S9bhCMsXKbvugI11fVf+q0AT1O5OLoZ+eMfunnQhHvlUbIkda+JxeAGTSY 58bfHvwhX56GPbx+8Jy9cp70R4JbcWfz+txUTKhc2FnH0AcOEzMnvPRp8Gsh -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQsw CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT aWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu IENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN2E1Lm0+afY8wR4 nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/EbRrsC+MO 8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjV ojYJrKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjb PG7PoBMAGrgnoeS+Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP2 6KbqxzcSXKMpHgLZ2x87tNcPVkeBFQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vr n5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAq2aN17O6x5q25lXQBfGfMY1a qtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/Ny9Sn2WCVhDr4 wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3 ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrs pSCAaWihT37ha88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4 E1Z5T21Q6huwtVexN2ZYI/PcD98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJ BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVy aVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24s IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNp Z24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJBgNV BAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNp Z24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIElu Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24g Q2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt IEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArwoNwtUs22e5LeWU J92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6tW8UvxDO JxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUY wZF7C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9o koqQHgiBVrKtaaNS0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjN qWm6o+sdDZykIKbBoMXRRkwXbdKsZj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/E Srg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0JhU8wI1NQ0kdvekhktdmnLfe xbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf0xwLRtxyID+u 7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RI sH/7NiXaldDxJBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTP cjnhsUPgKM+351psE2tJs//jGHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te 2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC /Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y 5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ 4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT aWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu IENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1 GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ +mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0Gbd U6LM8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLm NxdLMEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1WrIhVZPMq1 CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXttmhwwjIDLk5Mq g6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c 2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/ bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h 2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq 299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3 LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd 7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw ++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt 398znM/jra6O1I7mT1GvFpLgXPYHDw== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEGjCCAwKgAwIBAgIDAYagMA0GCSqGSIb3DQEBBQUAMIGjMQswCQYDVQQGEwJG STEQMA4GA1UECBMHRmlubGFuZDEhMB8GA1UEChMYVmFlc3RvcmVraXN0ZXJpa2Vz a3VzIENBMSkwJwYDVQQLEyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBTZXJ2aWNl czEZMBcGA1UECxMQVmFybWVubmVwYWx2ZWx1dDEZMBcGA1UEAxMQVlJLIEdvdi4g Um9vdCBDQTAeFw0wMjEyMTgxMzUzMDBaFw0yMzEyMTgxMzUxMDhaMIGjMQswCQYD VQQGEwJGSTEQMA4GA1UECBMHRmlubGFuZDEhMB8GA1UEChMYVmFlc3RvcmVraXN0 ZXJpa2Vza3VzIENBMSkwJwYDVQQLEyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBT ZXJ2aWNlczEZMBcGA1UECxMQVmFybWVubmVwYWx2ZWx1dDEZMBcGA1UEAxMQVlJL IEdvdi4gUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALCF FdrIAzfQo0Y3bBseljDCWoUSZyPyu5/nioFgJ/gTqTy894aqqvTzJSm0/nWuHoGG igWyHWWyOOi0zCia+xc28ZPVec7Bg4shT8MNrUHfeJ1I4x9CRPw8bSEga60ihCRC jxdNwlAfZM0tOSJWiP2yY51U2kJpwMhP1xjiPshphJQ9LIDGfM6911Mf64i5psu7 hVfvV3ZdDIvTXhJBnyHAOfQmbQj6OLOhd7HuFtjQaNq0mKWgZUZKa41+qk1guPjI DfxxPu45h4G02fhukO4/DmHXHSto5i7hQkQmeCxY8n0Wf2HASSQqiYe2XS8pGfim 545SnkFLWg6quMJmQlMCAwEAAaNVMFMwDwYDVR0TAQH/BAUwAwEB/zARBglghkgB hvhCAQEEBAMCAAcwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBTb6eGb0tEkC/yr 46Bn6q6cS3f0sDANBgkqhkiG9w0BAQUFAAOCAQEArX1ID1QRnljurw2bEi8hpM2b uoRH5sklVSPj3xhYKizbXvfNVPVRJHtiZ+GxH0mvNNDrsczZog1Sf0JLiGCXzyVy t08pLWKfT6HAVVdWDsRol5EfnGTCKTIB6dTI2riBmCguGMcs/OubUpbf9MiQGS0j 8/G7cdqehSO9Gu8u5Hp5t8OdhkktY7ktdM9lDzJmid87Ie4pbzlj2RXBbvbfgD5Q eBmK3QOjFKU3p7UsfLYRh+cF8ry23tT/l4EohP7+bEaFEEGfTXWMB9SZZ291im/k UJL2mdUQuMSpe/cXjUu/15WfCdxEDx4yw8DP03kN5Mc7h/CQNIghYkmSBAQfvA== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMC VVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBD ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9v dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDAxMDExMTY0MTI4WhcNMjEwMTE0 MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSww KgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0G A1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEi MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n13 5zHCLielTWi5MbqNQ1mXx3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHE SxP9cMIlrCL1dQu3U+SlK93OvRw6esP3E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4O JgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5OEL8pahbSCOz6+MlsoCu ltQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4jsNtlAHCE AQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMB AAGjYTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcB CzAyMDAGCCsGAQUFBwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRw b2xpY3kwDQYJKoZIhvcNAQEFBQADggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo 7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrvm+0fazbuSCUlFLZWohDo7qd/ 0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0ROhPs7fpvcmR7 nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ 33ZwmVxwQ023tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMx IDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxs cyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9v dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDcxMjEzMTcwNzU0WhcNMjIxMjE0 MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdl bGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQD DC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkw ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+r WxxTkqxtnt3CxC5FlAM1iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjU Dk/41itMpBb570OYj7OeUt9tkTmPOL13i0Nj67eT/DBMHAGTthP796EfvyXhdDcs HqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8bJVhHlfXBIEyg1J55oNj z7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiBK0HmOFaf SZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/Slwxl AgMBAAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqG KGh0dHA6Ly9jcmwucGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0P AQH/BAQDAgHGMB0GA1UdDgQWBBQmlRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0j BIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGBi6SBiDCBhTELMAkGA1UEBhMC VVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNX ZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEB ALkVsUSRzCPIK0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd /ZDJPHV3V3p9+N701NX3leZ0bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pB A4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSljqHyita04pO2t/caaH/+Xc/77szWn k4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+esE2fDbbFwRnzVlhE9 iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJtylv 2G0xffX8oRAHh84vWdw+WNs= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ O+7ETPTsJ3xCwnR8gooJybQDJbw= -----END CERTIFICATE----- gnustep-base-1.29.0/Resources/German.lproj/000077500000000000000000000000001435650067400205225ustar00rootroot00000000000000gnustep-base-1.29.0/Resources/German.lproj/Localizable.strings000066400000000000000000000215151435650067400243620ustar00rootroot00000000000000/* German string encodings */ GSUndefinedEncoding = "unbekannt"; NSProprietaryStringEncoding = "installationsabhängig"; NSASCIIStringEncoding = "Westeuropäisch (ASCII)"; NSNEXTSTEPStringEncoding = "Westeuropäisch (NextStep)"; NSJapaneseEUCStringEncoding = "Japanisch (EUC)"; NSUTF8StringEncoding = "Unicode (UTF-8)"; NSISOLatin1StringEncoding = "Westeuropäisch (ISO Latin 1)"; NSSymbolStringEncoding = "Symbol (Mac OS)"; NSNonLossyASCIIStringEncoding = "ASCII (ohne Verluste)"; NSShiftJISStringEncoding = "Japanisch (Windows, DOS)"; NSISOLatin2StringEncoding = "Mitteleuropäisch (ISO Latin 2)"; NSUnicodeStringEncoding = "Unicode (UTF-16)"; NSWindowsCP1251StringEncoding = "Kyrillisch (Windows)"; NSWindowsCP1252StringEncoding = "Westeuropäisch (Windows Latin 1)"; NSWindowsCP1253StringEncoding = "Griechisch (Windows)"; NSWindowsCP1254StringEncoding = "Türkisch (Windows Latin 5)"; NSWindowsCP1250StringEncoding = "Mitteleuropäisch (Windows Latin 2)"; NSISO2022JPStringEncoding = "Japanisch (ISO 2022-JP)"; NSMacOSRomanStringEncoding = "Westeuropäisch (Mac OS Roman)"; NSUTF16BigEndianStringEncoding = "Unicode (UTF-16BE)"; NSUTF16LittleEndianStringEncoding = "Unicode (UTF-16LE)"; NSUTF32StringEncoding = "Unicode (UTF-32)"; NSUTF32BigEndianStringEncoding = "Unicode (UTF-32BE)"; NSUTF32LittleEndianStringEncoding = "Unicode (UTF-32LE)"; NSMacOSJapaneseStringEncoding = "Japanisch (Mac OS)"; NSMacOSTraditionalChineseStringEncoding = "Traditionelles Chinesisch (Mac OS)"; NSMacOSKoreanStringEncoding = "Koreanisch (Mac OS)"; NSMacOSArabicStringEncoding = "Arabisch (Mac OS)"; NSMacOSHebrewStringEncoding = "Hebräisch (Mac OS)"; NSMacOSGreekStringEncoding = "Griechisch (Mac OS)"; NSMacOSCyrillicStringEncoding = "Kyrillisch (Mac OS)"; NSMacOSDevanagariStringEncoding = "Devanagari (Mac OS)"; NSMacOSGurmukhiStringEncoding = "Gurmukhi (Mac OS)"; NSMacOSGujaratiStringEncoding = "Gujarati (Mac OS)"; NSMacOSOriyaStringEncoding = "Oriya (Mac OS)"; NSMacOSBengaliStringEncoding = "Bengali (Mac OS)"; NSMacOSTamilStringEncoding = "Tamil (Mac OS)"; NSMacOSTeluguStringEncoding = "Telugu (Mac OS)"; NSMacOSKannadaStringEncoding = "Kannada (Mac OS)"; NSMacOSMalayalamStringEncoding = "Malayalam (Mac OS)"; NSMacOSSinhaleseStringEncoding = "Sinhalese (Mac OS)"; NSMacOSBurmeseStringEncoding = "Burmese (Mac OS)"; NSMacOSKhmerStringEncoding = "Khmer (Mac OS)"; NSMacOSThaiStringEncoding = "Thailändisch (Mac OS)"; NSMacOSLaotianStringEncoding = "Laotian (Mac OS)"; NSMacOSGeorgianStringEncoding = "Georgian (Mac OS)"; NSMacOSArmenianStringEncoding = "Armenian (Mac OS)"; NSMacOSSimplifiedChineseStringEncoding = "Vereinfachtes Chinesisch (Mac OS)"; NSMacOSTibetanStringEncoding = "Tibetanisch (Mac OS)"; NSMacOSMongolianStringEncoding = "Mongolian (Mac OS)"; NSMacOSEthiopicStringEncoding = "Ethiopic (Mac OS)"; NSMacOSCentralEuropeanRomanStringEncoding = "Mitteleuropäisch (Mac OS)"; NSMacOSVietnameseStringEncoding = "Vietnamese (Mac OS)"; NSMacOSSymbolStringEncoding = "Symbol (Mac OS)"; NSMacOSDingbatsStringEncoding = "Dingbats (Mac OS)"; NSMacOSTurkishStringEncoding = "Türkisch (Mac OS)"; NSMacOSCroatianStringEncoding = "Kroatisch (Mac OS)"; NSMacOSIcelandicStringEncoding = "Isländisch (Mac OS)"; NSMacOSRomanianStringEncoding = "Rumänisch (Mac OS)"; NSMacOSCelticStringEncoding = "Keltisch (Mac OS)"; NSMacOSGaelicStringEncoding = "Gälisch (Mac OS)"; NSMacOSKeyboardSymbolsStringEncoding = "Tastatur-Symbole (Mac OS)"; NSMacOSFarsiStringEncoding = "Farsi (Mac OS)"; NSMacOSUkrainianStringEncoding = "Kyrillisch (Mac OS Ukrainisch)"; NSMacOSInuitStringEncoding = "Inuit (Mac OS)"; NSMacVT100StringEncoding = "Western (Mac VT100)"; NSMacHFSStringEncoding = "Westeuropäisch (Mac OS Roman)"; NSUTF7StringEncoding = "Unicode (UTF-7)"; NSISOLatin3StringEncoding = "Westeuropäisch (ISO Latin 3)"; NSISOLatin4StringEncoding = "Mitteleuropäisch (ISO Latin 4)"; NSISOCyrillicStringEncoding = "Kyrillisch (ISO 8859-5)"; NSISOArabicStringEncoding = "Arabisch (ISO 8859-6)"; NSISOGreekStringEncoding = "Griechisch (ISO 8859-7)"; NSISOHebrewStringEncoding = "Hebräisch (ISO 8859-8)"; NSISOLatin5StringEncoding = "Türkisch (ISO Latin 5)"; NSISOLatin6StringEncoding = "Nordisch (ISO Latin 6)"; NSISOThaiStringEncoding = "Thailändisch (ISO 8859-11)"; NSISOLatin7StringEncoding = "Baltisch (ISO Latin 7)"; NSISOLatin8StringEncoding = "Keltisch (ISO Latin 8)"; NSISOLatin9StringEncoding = "Westeuropäisch (ISO Latin 9)"; NSISOLatin10StringEncoding = "Rumänisch (ISO Latin 10)"; NSDOSLatinUSStringEncoding = "Lateinamerika (DOS)"; NSDOSGreekStringEncoding = "Griechisch (DOS)"; NSDOSBalticRimStringEncoding = "Baltisch (DOS)"; NSDOSLatin1StringEncoding = "Westeuropäisch (DOS Latin 1)"; NSDOSGreek1StringEncoding = "Griechisch (DOS Greek 1)"; NSDOSLatin2StringEncoding = "Mitteleuropäisch (DOS Latin 2)"; NSDOSCyrillicStringEncoding = "Kyrillisch (DOS)"; NSDOSTurkishStringEncoding = "Türkisch (DOS)"; NSDOICortugueseStringEncoding = "Portugiesisch (DOS)"; NSDOSIcelandicStringEncoding = "Isländisch (DOS)"; NSDOSHebrewStringEncoding = "Hebräisch (DOS)"; NSDOSCanadianFrenchStringEncoding = "Kanadisches Französisch (DOS)"; NSDOSArabicStringEncoding = "Arabisch (DOS)"; NSDOSNordicStringEncoding = "Nordisch (DOS)"; NSDOSRussianStringEncoding = "Russisch (DOS)"; NSDOSGreek2StringEncoding = "Griechisch (DOS Greek 2)"; NSDOSThaiStringEncoding = "Thailändisch (Windows, DOS)"; NSDOSJapaneseStringEncoding = "Japanisch (Windows, DOS)"; NSDOSChineseSimplifStringEncoding = "Vereinfachtes Chinesisch (Windows, DOS)"; NSDOSKoreanStringEncoding = "Koreanisch (Windows, DOS)"; NSDOSChineseTradStringEncoding = "Traditionelles Chinesisch (Windows, DOS)"; NSWindowsLatin1StringEncoding = "Westeuropäisch (Windows Latin 1)"; NSWindowsLatin2StringEncoding = "Mitteleuropäisch (Windows Latin 2)"; NSWindowsCyrillicStringEncoding = "Kyrillisch (Windows)"; NSWindowsGreekStringEncoding = "Griechisch (Windows)"; NSWindowsLatin5StringEncoding = "Türkisch (Windows Latin 5)"; NSWindowsHebrewStringEncoding = "Hebräisch (Windows)"; NSWindowsArabicStringEncoding = "Arabisch (Windows)"; NSWindowsBalticRimStringEncoding = "Baltisch (Windows)"; NSWindowsVietnameseStringEncoding = "Vietnamesisch (Windows)"; NSWindowsKoreanJohabStringEncoding = "Korean (Windows Johab)"; NSJIS_X0208_90StringEncoding = "Japanese (JIS X0208)"; NSShiftJIS_X0213StringEncoding = "Japanisch (Shift JIS X0213)"; NSGB_2312_80StringEncoding = "Vereinfachtes Chinesisch (GB 2312)"; NSGBK_95StringEncoding = "Chinesisch (GBK)"; NSGB_18030_2000StringEncoding = "Chinesisch (GB 18030)"; NSKSC_5601_87StringEncoding = "Korean (KSC 5601-1987)"; NSISO2022JapaneseStringEncoding = "Japanisch (ISO 2022-JP)"; NSISO2022Japanese2StringEncoding = "Japanisch (ISO 2022-JP-2)"; NSISO2022Japanese1StringEncoding = "Japanisch (ISO 2022-JP-1)"; NSISO2022Japanese3StringEncoding = "Japanese (ISO 2022-JP-3)"; NSISO2022ChineseStringEncoding = "Chinesisch (ISO 2022-CN)"; NSISO2022ExtendedChineseStringEncoding = "Chinese (ISO 2022-CN-EXT)"; NSISO2022KoreanStringEncoding = "Koreanisch (ISO 2022-KR)"; NSEUCJapaneseStringEncoding = "Japanisch (EUC)"; NSEUCChineseStringEncoding = "Vereinfachtes Chinesisch (GB 2312)"; NSEUCTaiwanChineseStringEncoding = "Traditionelles Chinesisch (EUC)"; NSEUCKoreanStringEncoding = "Koreanisch (EUC)"; NSChineseEUCStringEncoding = "Vereinfachtes Chinesisch (GB 2312)"; NSTaiwanChineseEUCStringEncoding = "Traditionelles Chinesisch (EUC)"; NSKoreanEUCStringEncoding = "Koreanisch (EUC)"; NSKOI8RStringEncoding = "Kyrillisch (KOI8-R)"; NSBig5StringEncoding = "Traditionelles Chinesisch (Big 5)"; NSMacRomanLatin1StringEncoding = "Westeuropäisch (Mac Mail)"; NSHZ_GB_2312StringEncoding = "Vereinfachtes Chinesisch (HZ GB 2312)"; NSBig5_HKSCS_1999StringEncoding = "Traditionelles Chinesisch (Big 5 HKSCS)"; NSKOI8UStringEncoding = "Ukrainisch (KOI8-U)"; NSBig5EStringEncoding = "Traditionelles Chinesisch (Big 5-E)"; NSNextStepLatinStringEncoding = "Westeuropäisch (NextStep)"; NSNextStepJapaneseStringEncoding = "Japanese (NextStep)"; NSEBCDICUSStringEncoding = "Westeuropäisch (EBCDIC Latin Core)"; NSEBCDICCP037StringEncoding = "Westeuropäisch (EBCDIC Latin 1)"; /* Menu items for NSUndoManager */ /* File: ../Source/NSUndoManager.m:718 */ "Redo" = "Wiederholen"; /* File: ../Source/NSUndoManager.m:723 */ "Redo %@" = "%@ wiederholen"; /* File: ../Source/NSUndoManager.m:999 */ "Undo" = "Widerrufen"; /* File: ../Source/NSUndoManager.m:1004 */ "Undo %@" = "%@ widerrufen"; gnustep-base-1.29.0/Resources/Italian.lproj/000077500000000000000000000000001435650067400206725ustar00rootroot00000000000000gnustep-base-1.29.0/Resources/Italian.lproj/Localizable.strings000066400000000000000000000203541435650067400245320ustar00rootroot00000000000000/* Italian string encodings */ GSUndefinedEncoding = "sconosciuto"; NSProprietaryStringEncoding = "proprietario"; NSASCIIStringEncoding = "Occidentale (ASCII)"; NSNEXTSTEPStringEncoding = "Occidentale (NextStep)"; NSJapaneseEUCStringEncoding = "Giapponese (EUC)"; NSUTF8StringEncoding = "Unicode (UTF-8)"; NSISOLatin1StringEncoding = "Occidentale (ISO latino 1)"; NSSymbolStringEncoding = "Simbolo (Mac OS)"; NSNonLossyASCIIStringEncoding = "ASCII senza perdite"; NSShiftJISStringEncoding = "Giapponese (Windows, DOS)"; NSISOLatin2StringEncoding = "Centroeuropeo (ISO latino 2)"; NSUnicodeStringEncoding = "Unicode (UTF-16)"; NSWindowsCP1251StringEncoding = "Cirillico (Windows)"; NSWindowsCP1252StringEncoding = "Occidentale (Windows latino 1)"; NSWindowsCP1253StringEncoding = "Greco (Windows)"; NSWindowsCP1254StringEncoding = "Turco (Windows latino 5)"; NSWindowsCP1250StringEncoding = "Centroeuropeo (Windows latino 2)"; NSISO2022JPStringEncoding = "Giapponese (ISO 2022-JP)"; NSMacOSRomanStringEncoding = "Occidentale (Mac OS Roman)"; NSUTF16BigEndianStringEncoding = "Unicode (UTF-16BE)"; NSUTF16LittleEndianStringEncoding = "Unicode (UTF-16LE)"; NSUTF32StringEncoding = "Unicode (UTF-32)"; NSUTF32BigEndianStringEncoding = "Unicode (UTF-32BE)"; NSUTF32LittleEndianStringEncoding = "Unicode (UTF-32LE)"; NSMacOSJapaneseStringEncoding = "Giapponese (Mac OS)"; NSMacOSTraditionalChineseStringEncoding = "Cinese tradizionale (Mac OS)"; NSMacOSKoreanStringEncoding = "Coreano (Mac OS)"; NSMacOSArabicStringEncoding = "Arabo (Mac OS)"; NSMacOSHebrewStringEncoding = "Ebraico (Mac OS)"; NSMacOSGreekStringEncoding = "Greco (Mac OS)"; NSMacOSCyrillicStringEncoding = "Cirillico (Mac OS)"; NSMacOSDevanagariStringEncoding = "Devanagari (Mac OS)"; NSMacOSGurmukhiStringEncoding = "Gurmukhi (Mac OS)"; NSMacOSGujaratiStringEncoding = "Gujarati (Mac OS)"; NSMacOSOriyaStringEncoding = "Oriya (Mac OS)"; NSMacOSBengaliStringEncoding = "Bengali (Mac OS)"; NSMacOSTamilStringEncoding = "Tamil (Mac OS)"; NSMacOSTeluguStringEncoding = "Telugu (Mac OS)"; NSMacOSKannadaStringEncoding = "Kannada (Mac OS)"; NSMacOSMalayalamStringEncoding = "Malayalam (Mac OS)"; NSMacOSSinhaleseStringEncoding = "Sinhalese (Mac OS)"; NSMacOSBurmeseStringEncoding = "Burmese (Mac OS)"; NSMacOSKhmerStringEncoding = "Khmer (Mac OS)"; NSMacOSThaiStringEncoding = "Tailandese (Mac OS)"; NSMacOSLaotianStringEncoding = "Laotian (Mac OS)"; NSMacOSGeorgianStringEncoding = "Georgian (Mac OS)"; NSMacOSArmenianStringEncoding = "Armenian (Mac OS)"; NSMacOSSimplifiedChineseStringEncoding = "Cinese semplificato (Mac OS)"; NSMacOSTibetanStringEncoding = "Tibetano (Mac OS)"; NSMacOSMongolianStringEncoding = "Mongolian (Mac OS)"; NSMacOSEthiopicStringEncoding = "Ethiopic (Mac OS)"; NSMacOSCentralEuropeanRomanStringEncoding = "Centroeuropeo (Mac OS)"; NSMacOSVietnameseStringEncoding = "Vietnamese (Mac OS)"; NSMacOSSymbolStringEncoding = "Simbolo (Mac OS)"; NSMacOSDingbatsStringEncoding = "Dingbats (Mac OS)"; NSMacOSTurkishStringEncoding = "Turco (Mac OS)"; NSMacOSCroatianStringEncoding = "Croato (Mac OS)"; NSMacOSIcelandicStringEncoding = "Islandese (Mac OS)"; NSMacOSRomanianStringEncoding = "Rumeno (Mac OS)"; NSMacOSCelticStringEncoding = "Celtico (Mac OS)"; NSMacOSGaelicStringEncoding = "Gaelico (Mac OS)"; NSMacOSKeyboardSymbolsStringEncoding = "Simboli tastiera (Mac OS)"; NSMacOSFarsiStringEncoding = "Farsi (Mac OS)"; NSMacOSUkrainianStringEncoding = "Cirillico (Mac OS ucraino)"; NSMacOSInuitStringEncoding = "Inuit (Mac OS)"; NSMacVT100StringEncoding = "Western (Mac VT100)"; NSMacHFSStringEncoding = "Occidentale (Mac OS Roman)"; NSUTF7StringEncoding = "Unicode (UTF-7)"; NSISOLatin3StringEncoding = "Occidentale (ISO latino 3)"; NSISOLatin4StringEncoding = "Centroeuropeo (ISO latino 4)"; NSISOCyrillicStringEncoding = "Cirillico (ISO 8859-5)"; NSISOArabicStringEncoding = "Arabo (ISO 8859-6)"; NSISOGreekStringEncoding = "Greco (ISO 8859-7)"; NSISOHebrewStringEncoding = "Ebraico (ISO 8859-8)"; NSISOLatin5StringEncoding = "Turco (ISO latino 5)"; NSISOLatin6StringEncoding = "Nordico (ISO latino 6)"; NSISOThaiStringEncoding = "Tailandese (ISO 8859-11)"; NSISOLatin7StringEncoding = "Baltico (ISO latino 7)"; NSISOLatin8StringEncoding = "Celtico (ISO latino 8)"; NSISOLatin9StringEncoding = "Occidentale (ISO latino 9)"; NSISOLatin10StringEncoding = "Rumeno (ISO Latin 10)"; NSDOSLatinUSStringEncoding = "Latino USA (DOS)"; NSDOSGreekStringEncoding = "Greco (DOS)"; NSDOSBalticRimStringEncoding = "Baltico (DOS)"; NSDOSLatin1StringEncoding = "Occidentale (DOS latino 1)"; NSDOSGreek1StringEncoding = "Greco (Greco 1 DOS)"; NSDOSLatin2StringEncoding = "Centroeuropeo (DOS Latin 2)"; NSDOSCyrillicStringEncoding = "Cirillico (DOS)"; NSDOSTurkishStringEncoding = "Turco (DOS)"; NSDOICortugueseStringEncoding = "Portoghese (DOS)"; NSDOSIcelandicStringEncoding = "Islandese (DOS)"; NSDOSHebrewStringEncoding = "Ebraico (DOS)"; NSDOSCanadianFrenchStringEncoding = "Francese canadese (DOS)"; NSDOSArabicStringEncoding = "Arabo (DOS)"; NSDOSNordicStringEncoding = "Nordiche (DOS)"; NSDOSRussianStringEncoding = "Russo (DOS)"; NSDOSGreek2StringEncoding = "Greco (Greco 2 DOS)"; NSDOSThaiStringEncoding = "Tailandese (Windows, DOS)"; NSDOSJapaneseStringEncoding = "Giapponese (Windows, DOS)"; NSDOSChineseSimplifStringEncoding = "Cinese semplificato (Windows, DOS)"; NSDOSKoreanStringEncoding = "Coreano (Windows, DOS)"; NSDOSChineseTradStringEncoding = "Cinese tradizionale (Windows, DOS)"; NSWindowsLatin1StringEncoding = "Occidentale (Windows latino 1)"; NSWindowsLatin2StringEncoding = "Centroeuropeo (Windows latino 2)"; NSWindowsCyrillicStringEncoding = "Cirillico (Windows)"; NSWindowsGreekStringEncoding = "Greco (Windows)"; NSWindowsLatin5StringEncoding = "Turco (Windows latino 5)"; NSWindowsHebrewStringEncoding = "Ebraico (Windows)"; NSWindowsArabicStringEncoding = "Arabo (Windows)"; NSWindowsBalticRimStringEncoding = "Baltico (Windows)"; NSWindowsVietnameseStringEncoding = "Vietnamita (Windows)"; NSWindowsKoreanJohabStringEncoding = "Korean (Windows Johab)"; NSJIS_X0208_90StringEncoding = "Japanese (JIS X0208)"; NSShiftJIS_X0213StringEncoding = "Giapponese (Shift JIS X0213)"; NSGB_2312_80StringEncoding = "Cinese semplificato (GB 2312)"; NSGBK_95StringEncoding = "Cinese (GBK)"; NSGB_18030_2000StringEncoding = "Cinese (GB 18030)"; NSKSC_5601_87StringEncoding = "Korean (KSC 5601-1987)"; NSISO2022JapaneseStringEncoding = "Giapponese (ISO 2022-JP)"; NSISO2022Japanese2StringEncoding = "Giapponese (ISO 2022-JP-2)"; NSISO2022Japanese1StringEncoding = "Giapponese (ISO 2022-JP-1)"; NSISO2022Japanese3StringEncoding = "Japanese (ISO 2022-JP-3)"; NSISO2022ChineseStringEncoding = "Cinese (ISO 2022-CN)"; NSISO2022ExtendedChineseStringEncoding = "Chinese (ISO 2022-CN-EXT)"; NSISO2022KoreanStringEncoding = "Coreano (ISO 2022-KR)"; NSEUCJapaneseStringEncoding = "Giapponese (EUC)"; NSEUCChineseStringEncoding = "Cinese semplificato (GB 2312)"; NSEUCTaiwanChineseStringEncoding = "Cinese tradizionale (EUC)"; NSEUCKoreanStringEncoding = "Coreano (EUC)"; NSChineseEUCStringEncoding = "Cinese semplificato (GB 2312)"; NSTaiwanChineseEUCStringEncoding = "Cinese tradizionale (EUC)"; NSKoreanEUCStringEncoding = "Coreano (EUC)"; NSKOI8RStringEncoding = "Cirillico (KOI8-R)"; NSBig5StringEncoding = "Cinese tradizionale (Big 5)"; NSMacRomanLatin1StringEncoding = "Occidentale (Mac Mail)"; NSHZ_GB_2312StringEncoding = "Cinese semplificato (HZ GB 2312)"; NSBig5_HKSCS_1999StringEncoding = "Cinese tradizionale (Big 5 HKSCS)"; NSKOI8UStringEncoding = "Ucraino (KOI8-U)"; NSBig5EStringEncoding = "Cinese tradizionale (Big 5-E)"; NSNextStepLatinStringEncoding = "Occidentale (NextStep)"; NSNextStepJapaneseStringEncoding = "Japanese (NextStep)"; NSEBCDICUSStringEncoding = "Occidentale (EBCDIC Latin Core)"; NSEBCDICCP037StringEncoding = "Occidentale (EBCDIC Latin 1)"; gnustep-base-1.29.0/Resources/Japanese.lproj/000077500000000000000000000000001435650067400210375ustar00rootroot00000000000000gnustep-base-1.29.0/Resources/Japanese.lproj/Localizable.strings000066400000000000000000000216551435650067400247040ustar00rootroot00000000000000/* Japanese string encodings */ GSUndefinedEncoding = "Unknown"; NSProprietaryStringEncoding = "Installation-specific"; NSASCIIStringEncoding = "欧米(ASCII)"; NSNEXTSTEPStringEncoding = "欧米(NextStep)"; NSJapaneseEUCStringEncoding = "日本語(EUC)"; NSUTF8StringEncoding = "Unicode(UTF-8)"; NSISOLatin1StringEncoding = "欧米(ISO Latin 1)"; NSSymbolStringEncoding = "è¨˜å·æ–‡å­—(Mac OS)"; NSNonLossyASCIIStringEncoding = "ç„¡æå¤±ASCII(Non-lossy ASCII)"; NSShiftJISStringEncoding = "日本語(Windows, DOS)"; NSISOLatin2StringEncoding = "中欧(ISO Latin 2)"; NSUnicodeStringEncoding = "Unicode(UTF-16)"; NSWindowsCP1251StringEncoding = "キリル文字(Windows)"; NSWindowsCP1252StringEncoding = "欧米(Windows Latin 1)"; NSWindowsCP1253StringEncoding = "ギリシャ語(Windows)"; NSWindowsCP1254StringEncoding = "トルコ語(Windows Latin 5)"; NSWindowsCP1250StringEncoding = "中欧(Windows Latin 2)"; NSISO2022JPStringEncoding = "日本語(ISO 2022-JP)"; NSMacOSRomanStringEncoding = "欧米(Mac OS Roman)"; NSUTF16BigEndianStringEncoding = "Unicode(UTF-16BE)"; NSUTF16LittleEndianStringEncoding = "Unicode(UTF-16LE)"; NSUTF32StringEncoding = "Unicode(UTF-32)"; NSUTF32BigEndianStringEncoding = "Unicode(UTF-32BE)"; NSUTF32LittleEndianStringEncoding = "Unicode(UTF-32LE)"; NSMacOSJapaneseStringEncoding = "日本語(Mac OS)"; NSMacOSTraditionalChineseStringEncoding = "ç¹ä½“字中国語(Mac OS)"; NSMacOSKoreanStringEncoding = "韓国語(Mac OS)"; NSMacOSArabicStringEncoding = "アラビア語(Mac OS)"; NSMacOSHebrewStringEncoding = "ヘブライ語(Mac OS)"; NSMacOSGreekStringEncoding = "ギリシャ語(Mac OS)"; NSMacOSCyrillicStringEncoding = "キリル文字(Mac OS)"; NSMacOSDevanagariStringEncoding = "デーãƒãƒŠãƒ¼ã‚¬ãƒªãƒ¼æ–‡å­—(Mac OS)"; NSMacOSGurmukhiStringEncoding = "グルムキー文字(Mac OS)"; NSMacOSGujaratiStringEncoding = "グジャラート語(Mac OS)"; NSMacOSOriyaStringEncoding = "Oriya (Mac OS)"; NSMacOSBengaliStringEncoding = "Bengali (Mac OS)"; NSMacOSTamilStringEncoding = "Tamil (Mac OS)"; NSMacOSTeluguStringEncoding = "Telugu (Mac OS)"; NSMacOSKannadaStringEncoding = "Kannada (Mac OS)"; NSMacOSMalayalamStringEncoding = "Malayalam (Mac OS)"; NSMacOSSinhaleseStringEncoding = "Sinhalese (Mac OS)"; NSMacOSBurmeseStringEncoding = "Burmese (Mac OS)"; NSMacOSKhmerStringEncoding = "Khmer (Mac OS)"; NSMacOSThaiStringEncoding = "タイ語(Mac OS)"; NSMacOSLaotianStringEncoding = "Laotian (Mac OS)"; NSMacOSGeorgianStringEncoding = "Georgian (Mac OS)"; NSMacOSArmenianStringEncoding = "Armenian (Mac OS)"; NSMacOSSimplifiedChineseStringEncoding = "簡体字中国語(Mac OS)"; NSMacOSTibetanStringEncoding = "ãƒãƒ™ãƒƒãƒˆèªžï¼ˆMac OS)"; NSMacOSMongolianStringEncoding = "Mongolian (Mac OS)"; NSMacOSEthiopicStringEncoding = "Ethiopic (Mac OS)"; NSMacOSCentralEuropeanRomanStringEncoding = "中欧(Mac OS)"; NSMacOSVietnameseStringEncoding = "Vietnamese (Mac OS)"; NSMacOSSymbolStringEncoding = "è¨˜å·æ–‡å­—(Mac OS)"; NSMacOSDingbatsStringEncoding = "飾り文字(Mac OS)"; NSMacOSTurkishStringEncoding = "トルコ語(Mac OS)"; NSMacOSCroatianStringEncoding = "クロアãƒã‚¢èªžï¼ˆMac OS)"; NSMacOSIcelandicStringEncoding = "アイスランド語(Mac OS)"; NSMacOSRomanianStringEncoding = "ルーマニア語(Mac OS)"; NSMacOSCelticStringEncoding = "ケルト語(Mac OS)"; NSMacOSGaelicStringEncoding = "ゲール語(Mac OS)"; NSMacOSKeyboardSymbolsStringEncoding = "キーボード記å·ï¼ˆMac OS)"; NSMacOSFarsiStringEncoding = "ç¾ä»£ãƒšãƒ«ã‚·ãƒ£èªžï¼ˆMac OS)"; NSMacOSUkrainianStringEncoding = "キリル文字(Mac OSウクライナ語)"; NSMacOSInuitStringEncoding = "イヌイット語(Mac OS)"; NSMacVT100StringEncoding = "Western (Mac VT100)"; NSMacHFSStringEncoding = "欧米(Mac OS Roman)"; NSUTF7StringEncoding = "Unicode(UTF-7)"; NSISOLatin3StringEncoding = "欧米(ISO Latin 3)"; NSISOLatin4StringEncoding = "中欧(ISO Latin 4)"; NSISOCyrillicStringEncoding = "キリル文字(ISO 8859-5)"; NSISOArabicStringEncoding = "アラビア語(ISO 8859-6)"; NSISOGreekStringEncoding = "ギリシャ語(ISO 8859-7)"; NSISOHebrewStringEncoding = "ヘブライ語(ISO 8859-8)"; NSISOLatin5StringEncoding = "トルコ語(ISO Latin 5)"; NSISOLatin6StringEncoding = "北欧(ISO Latin 6)"; NSISOThaiStringEncoding = "タイ語(ISO 8859-11)"; NSISOLatin7StringEncoding = "ãƒãƒ«ãƒˆè«¸èªžï¼ˆISO Latin 7)"; NSISOLatin8StringEncoding = "ケルト語(ISO Latin 8)"; NSISOLatin9StringEncoding = "欧米(ISO Latin 9)"; NSISOLatin10StringEncoding = "ルーマニア語(ISO Latin 10)"; NSDOSLatinUSStringEncoding = "Latin-US(DOS)"; NSDOSGreekStringEncoding = "ギリシャ語(DOS)"; NSDOSBalticRimStringEncoding = "ãƒãƒ«ãƒˆè«¸èªžï¼ˆDOS)"; NSDOSLatin1StringEncoding = "欧米(DOS Latin 1)"; NSDOSGreek1StringEncoding = "ギリシャ語(DOS Greek 1)"; NSDOSLatin2StringEncoding = "中欧(DOS Latin 2)"; NSDOSCyrillicStringEncoding = "キリル文字(DOS)"; NSDOSTurkishStringEncoding = "トルコ語(DOS)"; NSDOICortugueseStringEncoding = "ãƒãƒ«ãƒˆã‚¬ãƒ«èªžï¼ˆDOS)"; NSDOSIcelandicStringEncoding = "アイスランド語(DOS)"; NSDOSHebrewStringEncoding = "ヘブライ語(DOS)"; NSDOSCanadianFrenchStringEncoding = "カナダ・フランス語(DOS)"; NSDOSArabicStringEncoding = "アラビア語(DOS)"; NSDOSNordicStringEncoding = "北欧諸語(DOS)"; NSDOSRussianStringEncoding = "ロシア語(DOS)"; NSDOSGreek2StringEncoding = "ギリシャ語(DOS Greek 2)"; NSDOSThaiStringEncoding = "タイ語(Windows, DOS)"; NSDOSJapaneseStringEncoding = "日本語(Windows, DOS)"; NSDOSChineseSimplifStringEncoding = "簡体字中国語(Windows, DOS)"; NSDOSKoreanStringEncoding = "韓国語(Windows, DOS)"; NSDOSChineseTradStringEncoding = "ç¹ä½“字中国語(Windows, DOS)"; NSWindowsLatin1StringEncoding = "欧米(Windows Latin 1)"; NSWindowsLatin2StringEncoding = "中欧(Windows Latin 2)"; NSWindowsCyrillicStringEncoding = "キリル文字(Windows)"; NSWindowsGreekStringEncoding = "ギリシャ語(Windows)"; NSWindowsLatin5StringEncoding = "トルコ語(Windows Latin 5)"; NSWindowsHebrewStringEncoding = "ヘブライ語(Windows)"; NSWindowsArabicStringEncoding = "アラビア語(Windows)"; NSWindowsBalticRimStringEncoding = "ãƒãƒ«ãƒˆè«¸èªžï¼ˆWindows)"; NSWindowsVietnameseStringEncoding = "ベトナム語(Windows)"; NSWindowsKoreanJohabStringEncoding = "Korean (Windows Johab)"; NSJIS_X0208_90StringEncoding = "Japanese (JIS X0208)"; NSShiftJIS_X0213StringEncoding = "日本語(Shift JIS X0213)"; NSGB_2312_80StringEncoding = "簡体字中国語(GB 2312)"; NSGBK_95StringEncoding = "中国語(GBK)"; NSGB_18030_2000StringEncoding = "中国語(GB 18030)"; NSKSC_5601_87StringEncoding = "Korean (KSC 5601-1987)"; NSISO2022JapaneseStringEncoding = "日本語(ISO 2022-JP)"; NSISO2022Japanese2StringEncoding = "日本語(ISO 2022-JP-2)"; NSISO2022Japanese1StringEncoding = "日本語(ISO 2022-JP-1)"; NSISO2022Japanese3StringEncoding = "Japanese (ISO 2022-JP-3)"; NSISO2022ChineseStringEncoding = "中国語(ISO 2022-CN)"; NSISO2022ExtendedChineseStringEncoding = "Chinese (ISO 2022-CN-EXT)"; NSISO2022KoreanStringEncoding = "韓国語(ISO 2022-KR)"; NSEUCJapaneseStringEncoding = "日本語(EUC)"; NSEUCChineseStringEncoding = "簡体字中国語(GB 2312)"; NSEUCTaiwanChineseStringEncoding = "ç¹ä½“字中国語(EUC)"; NSEUCKoreanStringEncoding = "韓国語(EUC)"; NSChineseEUCStringEncoding = "簡体字中国語(GB 2312)"; NSTaiwanChineseEUCStringEncoding = "ç¹ä½“字中国語(EUC)"; NSKoreanEUCStringEncoding = "韓国語(EUC)"; NSKOI8RStringEncoding = "キリル文字(KOI8-R)"; NSBig5StringEncoding = "ç¹ä½“字中国語(Big 5)"; NSMacRomanLatin1StringEncoding = "欧米(Mac Mail)"; NSHZ_GB_2312StringEncoding = "簡体字中国語(HZ GB 2312)"; NSBig5_HKSCS_1999StringEncoding = "ç¹ä½“字中国語(Big 5 HKSCS)"; NSKOI8UStringEncoding = "ウクライナ語(KOI8-U)"; NSBig5EStringEncoding = "ç¹ä½“字中国語(Big 5-E)"; NSNextStepLatinStringEncoding = "欧米(NextStep)"; NSNextStepJapaneseStringEncoding = "Japanese (NextStep)"; NSEBCDICUSStringEncoding = "欧米(EBCDIC Latin Core)"; NSEBCDICCP037StringEncoding = "欧米(EBCDIC Latin 1)"; gnustep-base-1.29.0/Resources/Korean.lproj/000077500000000000000000000000001435650067400205305ustar00rootroot00000000000000gnustep-base-1.29.0/Resources/Korean.lproj/Localizable.strings000066400000000000000000000206461435650067400243740ustar00rootroot00000000000000/* Korean string encodings */ GSUndefinedEncoding = "알 수 ì—†ìŒ"; NSProprietaryStringEncoding = "설치 기본"; NSASCIIStringEncoding = "서유럽어(ASCII)"; NSNEXTSTEPStringEncoding = "서유럽어(NextStep)"; NSJapaneseEUCStringEncoding = "ì¼ë³¸ì–´(EUC)"; NSUTF8StringEncoding = "유니코드(UTF-8)"; NSISOLatin1StringEncoding = "서유럽어(ISO Latin 1)"; NSSymbolStringEncoding = "심볼(Mac OS)"; NSNonLossyASCIIStringEncoding = "Non-lossy ASCII"; NSShiftJISStringEncoding = "ì¼ë³¸ì–´(Windows, DOS)"; NSISOLatin2StringEncoding = "중앙 유럽어(ISO Latin 2)"; NSUnicodeStringEncoding = "유니코드(UTF-16)"; NSWindowsCP1251StringEncoding = "키릴 ìžëª¨(Windows)"; NSWindowsCP1252StringEncoding = "서유럽어(Windows Latin 1)"; NSWindowsCP1253StringEncoding = "그리스어(Windows)"; NSWindowsCP1254StringEncoding = "터키어(Windows Latin 5)"; NSWindowsCP1250StringEncoding = "중앙 유럽어(Windows Latin 2)"; NSISO2022JPStringEncoding = "ì¼ë³¸ì–´(ISO 2022-JP)"; NSMacOSRomanStringEncoding = "서유럽어(Mac OS Roman)"; NSUTF16BigEndianStringEncoding = "유니코드(UTF-16BE)"; NSUTF16LittleEndianStringEncoding = "유니코드(UTF-16LE)"; NSUTF32StringEncoding = "유니코드(UTF-32)"; NSUTF32BigEndianStringEncoding = "유니코드(UTF-32BE)"; NSUTF32LittleEndianStringEncoding = "유니코드(UTF-32LE)"; NSMacOSJapaneseStringEncoding = "ì¼ë³¸ì–´(Mac OS)"; NSMacOSTraditionalChineseStringEncoding = "중국어 번체(Mac OS)"; NSMacOSKoreanStringEncoding = "한국어(Mac OS)"; NSMacOSArabicStringEncoding = "ì•„ëžì–´(Mac OS)"; NSMacOSHebrewStringEncoding = "히브리어(Mac OS)"; NSMacOSGreekStringEncoding = "그리스어(Mac OS)"; NSMacOSCyrillicStringEncoding = "키릴 ìžëª¨(Mac OS)"; NSMacOSDevanagariStringEncoding = "ë°ë°”나가리(Mac OS)"; NSMacOSGurmukhiStringEncoding = "구루묵히(Mac OS)"; NSMacOSGujaratiStringEncoding = "구ìžë¼í‹°(Mac OS)"; NSMacOSOriyaStringEncoding = "Oriya (Mac OS)"; NSMacOSBengaliStringEncoding = "Bengali (Mac OS)"; NSMacOSTamilStringEncoding = "Tamil (Mac OS)"; NSMacOSTeluguStringEncoding = "Telugu (Mac OS)"; NSMacOSKannadaStringEncoding = "Kannada (Mac OS)"; NSMacOSMalayalamStringEncoding = "Malayalam (Mac OS)"; NSMacOSSinhaleseStringEncoding = "Sinhalese (Mac OS)"; NSMacOSBurmeseStringEncoding = "Burmese (Mac OS)"; NSMacOSKhmerStringEncoding = "Khmer (Mac OS)"; NSMacOSThaiStringEncoding = "태국어(Mac OS)"; NSMacOSLaotianStringEncoding = "Laotian (Mac OS)"; NSMacOSGeorgianStringEncoding = "Georgian (Mac OS)"; NSMacOSArmenianStringEncoding = "Armenian (Mac OS)"; NSMacOSSimplifiedChineseStringEncoding = "중국어 ê°„ì²´(Mac OS)"; NSMacOSTibetanStringEncoding = "티베트어(Mac OS)"; NSMacOSMongolianStringEncoding = "Mongolian (Mac OS)"; NSMacOSEthiopicStringEncoding = "Ethiopic (Mac OS)"; NSMacOSCentralEuropeanRomanStringEncoding = "중앙 유럽어(Mac OS)"; NSMacOSVietnameseStringEncoding = "Vietnamese (Mac OS)"; NSMacOSSymbolStringEncoding = "심볼(Mac OS)"; NSMacOSDingbatsStringEncoding = "딩벳(Mac OS)"; NSMacOSTurkishStringEncoding = "터키어(Mac OS)"; NSMacOSCroatianStringEncoding = "í¬ë¡œì•„í‹°ì•„ì–´(Mac OS)"; NSMacOSIcelandicStringEncoding = "ì•„ì´ìŠ¬ëž€ë“œì–´(Mac OS)"; NSMacOSRomanianStringEncoding = "루마니아어(Mac OS)"; NSMacOSCelticStringEncoding = "켈트어(Mac OS)"; NSMacOSGaelicStringEncoding = "게ì¼ì–´(Mac OS)"; NSMacOSKeyboardSymbolsStringEncoding = "키보드 심볼(Mac OS)"; NSMacOSFarsiStringEncoding = "페르시아어(Mac OS)"; NSMacOSUkrainianStringEncoding = "키릴 ìžëª¨(Mac OS Ukrainian)"; NSMacOSInuitStringEncoding = "ì´ë‰´ìž‡ì–´(Mac OS)"; NSMacVT100StringEncoding = "Western (Mac VT100)"; NSMacHFSStringEncoding = "서유럽어(Mac OS Roman)"; NSUTF7StringEncoding = "유니코드(UTF-7)"; NSISOLatin3StringEncoding = "서유럽어(ISO Latin 3)"; NSISOLatin4StringEncoding = "중앙 유럽어(ISO Latin 4)"; NSISOCyrillicStringEncoding = "키릴 ìžëª¨(ISO 8859-5)"; NSISOArabicStringEncoding = "ì•„ëžì–´(ISO 8859-6)"; NSISOGreekStringEncoding = "그리스어(ISO 8859-7)"; NSISOHebrewStringEncoding = "히브리어(ISO 8859-8)"; NSISOLatin5StringEncoding = "터키어(ISO Latin 5)"; NSISOLatin6StringEncoding = "ë¶ìœ ëŸ½ì–´(ISO Latin 6)"; NSISOThaiStringEncoding = "태국어(ISO 8859-11)"; NSISOLatin7StringEncoding = "발트어(ISO Latin 7)"; NSISOLatin8StringEncoding = "켈트어(ISO Latin 8)"; NSISOLatin9StringEncoding = "서유럽어(ISO Latin 9)"; NSISOLatin10StringEncoding = "루마니아어(ISO Latin 10)"; NSDOSLatinUSStringEncoding = "ë¼í‹´-US(DOS)"; NSDOSGreekStringEncoding = "그리스어(DOS)"; NSDOSBalticRimStringEncoding = "발트어(DOS)"; NSDOSLatin1StringEncoding = "서유럽어(DOS Latin 1)"; NSDOSGreek1StringEncoding = "그리스어(DOS Greek 1)"; NSDOSLatin2StringEncoding = "중앙 유럽어(DOS Latin 2)"; NSDOSCyrillicStringEncoding = "키릴 ìžëª¨(DOS)"; NSDOSTurkishStringEncoding = "터키어(DOS)"; NSDOICortugueseStringEncoding = "í¬ë¥´íˆ¬ê°ˆì–´(DOS)"; NSDOSIcelandicStringEncoding = "ì•„ì´ìŠ¬ëž€ë“œì–´(DOS)"; NSDOSHebrewStringEncoding = "히브리어(DOS)"; NSDOSCanadianFrenchStringEncoding = "ìºë‚˜ë‹¤ 프랑스어(DOS)"; NSDOSArabicStringEncoding = "ì•„ëžì–´(DOS)"; NSDOSNordicStringEncoding = "ë¶ìœ ëŸ½ì–´(DOS)"; NSDOSRussianStringEncoding = "러시아어(DOS)"; NSDOSGreek2StringEncoding = "그리스어(DOS Greek 2)"; NSDOSThaiStringEncoding = "태국어(Windows, DOS)"; NSDOSJapaneseStringEncoding = "ì¼ë³¸ì–´(Windows, DOS)"; NSDOSChineseSimplifStringEncoding = "중국어 ê°„ì²´(Windows, DOS)"; NSDOSKoreanStringEncoding = "한국어(Windows, DOS)"; NSDOSChineseTradStringEncoding = "중국어 번체(Windows, DOS)"; NSWindowsLatin1StringEncoding = "서유럽어(Windows Latin 1)"; NSWindowsLatin2StringEncoding = "중앙 유럽어(Windows Latin 2)"; NSWindowsCyrillicStringEncoding = "키릴 ìžëª¨(Windows)"; NSWindowsGreekStringEncoding = "그리스어(Windows)"; NSWindowsLatin5StringEncoding = "터키어(Windows Latin 5)"; NSWindowsHebrewStringEncoding = "히브리어(Windows)"; NSWindowsArabicStringEncoding = "ì•„ëžì–´(Windows)"; NSWindowsBalticRimStringEncoding = "발트어(Windows)"; NSWindowsVietnameseStringEncoding = "베트남어(Windows)"; NSWindowsKoreanJohabStringEncoding = "Korean (Windows Johab)"; NSJIS_X0208_90StringEncoding = "Japanese (JIS X0208)"; NSShiftJIS_X0213StringEncoding = "ì¼ë³¸ì–´(Shift JIS X0213)"; NSGB_2312_80StringEncoding = "중국어 ê°„ì²´(GB 2312)"; NSGBK_95StringEncoding = "중국어(GBK)"; NSGB_18030_2000StringEncoding = "중국어(GB 18030)"; NSKSC_5601_87StringEncoding = "Korean (KSC 5601-1987)"; NSISO2022JapaneseStringEncoding = "ì¼ë³¸ì–´(ISO 2022-JP)"; NSISO2022Japanese2StringEncoding = "ì¼ë³¸ì–´(ISO 2022-JP-2)"; NSISO2022Japanese1StringEncoding = "ì¼ë³¸ì–´(ISO 2022-JP-1)"; NSISO2022Japanese3StringEncoding = "Japanese (ISO 2022-JP-3)"; NSISO2022ChineseStringEncoding = "중국어(ISO 2022-CN)"; NSISO2022ExtendedChineseStringEncoding = "Chinese (ISO 2022-CN-EXT)"; NSISO2022KoreanStringEncoding = "한국어(ISO 2022-KR)"; NSEUCJapaneseStringEncoding = "ì¼ë³¸ì–´(EUC)"; NSEUCChineseStringEncoding = "중국어 ê°„ì²´(GB 2312)"; NSEUCTaiwanChineseStringEncoding = "중국어 번체(EUC)"; NSEUCKoreanStringEncoding = "한국어(EUC)"; NSChineseEUCStringEncoding = "중국어 ê°„ì²´(GB 2312)"; NSTaiwanChineseEUCStringEncoding = "중국어 번체(EUC)"; NSKoreanEUCStringEncoding = "한국어(EUC)"; NSKOI8RStringEncoding = "키릴 ìžëª¨(KOI8-R)"; NSBig5StringEncoding = "중국어 번체(Big 5)"; NSMacRomanLatin1StringEncoding = "서유럽어(Mac Mail)"; NSHZ_GB_2312StringEncoding = "중국어 ê°„ì²´(HZ GB 2312)"; NSBig5_HKSCS_1999StringEncoding = "중국어 번체(Big 5 HKSCS)"; NSKOI8UStringEncoding = "ìš°í¬ë¼ì´ë‚˜(KOI8-U)"; NSBig5EStringEncoding = "중국어 번체(Big 5-E)"; NSNextStepLatinStringEncoding = "서유럽어(NextStep)"; NSNextStepJapaneseStringEncoding = "Japanese (NextStep)"; NSEBCDICUSStringEncoding = "서유럽어(EBCDIC Latin Core)"; NSEBCDICCP037StringEncoding = "서유럽어(EBCDIC Latin 1)"; gnustep-base-1.29.0/Resources/Languages/000077500000000000000000000000001435650067400200725ustar00rootroot00000000000000gnustep-base-1.29.0/Resources/Languages/Dutch000066400000000000000000000026601435650067400210700ustar00rootroot00000000000000/* Dutch */ { NSLanguageName = "Dutch"; NSLanguageCode = NL; NSFormalName = "Dutch"; NSCurrencySymbol = "EUR"; NSPositiveCurrencyFormatString = "EUR9.999,00"; NSNegativeCurrencyFormatString = "EUR-9.999,00"; NSInternationalCurrencyString = "EUR"; NSDecimalDigits = ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); NSDecimalSeparator = ","; NSThousandsSeparator = "."; NSAMPMDesignation = (AM, PM); NSDateFormatString = "%A, %B %d, %Y"; NSDateTimeOrdering = DMYH; NSEarlierTimeDesignations = (voor, vorig, over, geleden); NSHourNameDesignations = ((0, middernacht), (12, middag), (10, ochtend), (14, middag), (19, avond)); NSLaterTimeDesignations = (later); NSMonthNameArray = (januari, februari, maart, april, mei, juni, juli, augustus, september, oktober, november, december); NSNextDayDesignations = (morgen); NSNextNextDayDesignations = ("volgende dag"); NSPriorDayDesignations = (gisteren); NSShortDateFormatString = "%d-%m-%Y"; NSShortMonthNameArray = (jan, feb, mar, apr, mei, jun, jul, aug, sept, oct, nov, dec); NSShortTimeDateFormatString = "%d %b %Y %H:%M"; NSShortWeekDayNameArray = (zo, ma, di, wo, do, vrij, zat); NSThisDayDesignations = (vandaag); NSTimeDateFormatString = "%a %d %b %Y %H:%M:%S %Z"; NSTimeFormatString = "%H:%M:%S"; NSWeekDayNameArray = (zondag, maandag, dinsdag, woensdag, donderdag, vrijdag, zaterdag); NSYearMonthWeekDesignations = (jaar, maand, week); } gnustep-base-1.29.0/Resources/Languages/English000066400000000000000000000026561435650067400214170ustar00rootroot00000000000000/* English */ { NSLanguageName = "English"; NSLanguageCode = ENG; NSFormalName = "English"; NSCurrencySymbol = "$"; NSPositiveCurrencyFormatString = "$9,999.00"; NSNegativeCurrencyFormatString = "$-9,999.00"; NSInternationalCurrencyString = "USD"; NSDecimalDigits = ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); NSDecimalSeparator = "."; NSThousandsSeparator = ","; NSAMPMDesignation = (AM, PM); NSDateFormatString = "%A, %B %d, %Y"; NSDateTimeOrdering = DMYH; NSEarlierTimeDesignations = (prior, last, past, ago); NSHourNameDesignations = ((0, midnight), (12, noon, lunch), (10, morning), (14, afternoon), (19, dinner)); NSLaterTimeDesignations = (next); NSMonthNameArray = (January, February, March, April, May, June, July, August, September, October, November, December); NSNextDayDesignations = (tomorrow); NSNextNextDayDesignations = (nextday); NSPriorDayDesignations = (yesterday); NSShortDateFormatString = "%m/%d/%Y"; NSShortMonthNameArray = (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec); NSShortTimeDateFormatString = "%d %b, %Y %H:%M"; NSShortWeekDayNameArray = (Sun, Mon, Tue, Wed, Thu, Fri, Sat); NSThisDayDesignations = (today); NSTimeDateFormatString = "%a %b %d %H:%M:%S %z %Y"; NSTimeFormatString = "%H:%M:%S"; NSWeekDayNameArray = (Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday); NSYearMonthWeekDesignations = (year, month, week); } gnustep-base-1.29.0/Resources/Languages/Esperanto000066400000000000000000000030121435650067400217510ustar00rootroot00000000000000/* Esperanto */ { NSLanguageName = "Esperanto"; NSLanguageCode = ESP; NSFormalName = "Esperanto"; NSCurrencySymbol = "$"; NSPositiveCurrencyFormatString = "$9,999.00"; NSNegativeCurrencyFormatString = "$-9,999.00"; NSInternationalCurrencyString = "USD"; NSDecimalDigits = ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); NSDecimalSeparator = "."; NSThousandsSeparator = ","; NSAMPMDesignation = (AM, PM); NSDateFormatString = "%A, %B %d, %Y"; NSDateTimeOrdering = DMYH; NSEarlierTimeDesignations = ("anta\U016d", lasta, pasinta, "anta\U016da"); NSHourNameDesignations = ((0, noktomeze), (12, tagmeze), (10, matene), (14, posttagmeze), (19, vespere)); NSLaterTimeDesignations = (nekste); NSMonthNameArray = (Januaro, Februaro, Marto, Aprilo, Majo, Junio, Julio, "A\U016dgusto", Septembro, Oktobro, Novembro, Decembro); NSNextDayDesignations = ("morga\U016d"); NSNextNextDayDesignations = ("venontan tagon"); NSPriorDayDesignations = ("hiera\U016d"); NSShortDateFormatString = "%d/%m/%Y"; NSShortMonthNameArray = (Jan, Feb, Mar, Apr, May, Jun, Jul, "A\U016dg", Sep, Okt, Nov, Dec); NSShortTimeDateFormatString = "%da %b %Y %H:%M"; NSShortWeekDayNameArray = (Dim, Lun, Mar, Mer, "\U0134au", Ven, Sab); NSThisDayDesignations = ("hodia\U016d"); NSTimeDateFormatString = "%a %da %b %Y %H:%M:%S %z"; NSTimeFormatString = "%H:%M:%S"; NSWeekDayNameArray = ("Diman\U0109o", Lundo, Marto, Merkredo, "\U0134audo", Vendredo, Sabato); NSYearMonthWeekDesignations = (jaro, monato, semajno); } gnustep-base-1.29.0/Resources/Languages/French000066400000000000000000000031301435650067400212170ustar00rootroot00000000000000/* French -*-c-*- */ { NSLanguageName = "French"; NSLanguageCode = FRE; NSFormalName = "Fran\u00e7ais"; NSParentContext = "Default"; NSCurrencySymbol = "EUR"; NSPositiveCurrencyFormatString = "EUR9,999.00"; NSNegativeCurrencyFormatString = "EUR-9,999.00"; NSInternationalCurrencyString = "EUR"; NSDecimalDigits = ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); NSDecimalSeparator = ","; NSThousandsSeparator = " "; NSAMPMDesignation = (AM, PM); NSDateFormatString = "%A %d %B %Y"; NSDateTimeOrdering = DMYH; NSEarlierTimeDesignations = (avant); NSHourNameDesignations = ((0, minuit), (12, midi), (10, matin), (14, "apr\u00e8s-midi" ), (19, soir)); NSLaterTimeDesignations = ("apr\u00e8s"); NSMonthNameArray = (Janvier, "F\u00e9vrier", Mars, Avril, Mai, Juin, Juillet, "Ao\u00fbt", Septembre, Octobre, Novembre, "D\u00e9cembre"); NSNextDayDesignations = (demain); NSNextNextDayDesignations = ("apr\u00e8s demain"); NSPriorDayDesignations = (hier); NSShortDateFormatString = "%d/%m/%Y"; /* 20/11/1974 */ NSShortMonthNameArray = (Jan, Fev, Mar, Avr, Mai, Jun, Jui, Aou, Sep, Oct, Nov, Dec); NSShortTimeDateFormatString = "%d %b %Y %H:%M"; /* 20 Nov 1974 17:33 */ NSShortWeekDayNameArray = (Dim, Lun, Mar, Mer, Jeu, Ven, Sam); NSThisDayDesignations = ("Aujourd'hui"); NSTimeDateFormatString = "%a %d %b %H:%M:%S %z %Y"; /* Gio 22 Feb 15:33:42 +0100 2001 */ NSTimeFormatString = "%H:%M:%S"; /* 21:21:08 */ NSWeekDayNameArray = (Dimanche, Lundi, Mardi, Mercredi, Jeudi, Vendredi, Samedi); NSYearMonthWeekDesignations = ("ann\u00e9e", mois, semaine); } gnustep-base-1.29.0/Resources/Languages/German000066400000000000000000000031321435650067400212250ustar00rootroot00000000000000/* German */ { NSLanguageName = "German"; NSFormalName = "Deutsch"; NSLanguageCode = "DEU"; NSParentContext = "Default"; NSCurrencySymbol = "EUR"; NSDateFormatString = "%A, %B %d, %Y"; NSDateTimeOrdering = DMYH; /* resolve numbers in Day,Month,Year,Hour order */ NSDecimalDigits = ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); NSDecimalSeparator = ","; NSEarlierTimeDesignations = (vor, letzten, letzte, vorige, vorherige, davor); NSHourNameDesignations = ((0, Mitternacht), (12, Mittag, mittags), (10, morgens), (14, nachmittags), (19, abends)); NSInternationalCurrencyString = EUR; NSLaterTimeDesignations = ("sp\u00e4ter"); NSMonthNameArray = (Januar, Februar, "M\u00e4rz", April, Mai, Juni, Juli, August, September, Oktober, November, Dezember); NSNextDayDesignations = (morgen); NSNextNextDayDesignations = ("n\u00e4chsten Tag"); /* (as in: am n\u00e4chsten Tag) */ NSPriorDayDesignations = (gestern); NSShortDateFormatString = "%d.%m.%Y"; /* "07.12.95" for example */ NSShortMonthNameArray = (Jan, Feb, Mrz, Apr, Mai, Jun, Jul, Aug, Sep, Okt, Nov, Dez); NSShortTimeDateFormatString = "%d.%b.%Y %H:%M"; /* "07. Dez. 95 16:50 " for example */ NSShortWeekDayNameArray = (So, Mo, Di, Mi, Do, Fr, Sa); NSThisDayDesignations = (heute); NSThousandsSeparator = "."; NSTimeDateFormatString = "%a %b %d %Y %H:%M:%S %Z"; NSTimeFormatString = "%H:%M:%S"; NSWeekDayNameArray = (Sonntag, Montag, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag); NSYearMonthWeekDesignations = (Jahr, Monat, Woche); NSPositiveCurrencyFormatString = "EUR9,999.00"; NSNegativeCurrencyFormatString = "EUR-9,999.00"; } gnustep-base-1.29.0/Resources/Languages/Hungarian000066400000000000000000000034221435650067400217320ustar00rootroot00000000000000/* Hungarian -*-c-*- */ { NSLanguageName = "Hungarian"; NSLanguageCode = HUN; NSFormalName = "Magyar"; NSParentContext = "Default"; NSCurrencySymbol = "Ft"; NSPositiveCurrencyFormatString = "9 999,00 Ft"; NSNegativeCurrencyFormatString = "-9 999.00 Ft"; NSInternationalCurrencyString = "HUF"; NSDecimalDigits = ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); NSDecimalSeparator = ","; NSThousandsSeparator = " "; NSAMPMDesignation = (DE, DU); NSDateFormatString = "%Y. %B %d., %A"; /* 2004. augusztus 20., kedd */ NSDateTimeOrdering = YMDH; NSEarlierTimeDesignations = ("el\u0151tt"); NSHourNameDesignations = ((0, "\u00e9jf\u00e9l"), (12, "d\u00e9l"), (10, reggel), (14, "d\u00e9lut\u00e1n" ), (19, este)); NSLaterTimeDesignations = ("ut\u00e1"); NSMonthNameArray = ("janu\u00e1r", "febru\u00e1r", "m\u00e1rcius", "\u00e1prilis", "m\u00e1jus", "j\u00fanius", "j\u00falius", augusztus, szeptember, "okt\u00f3ber", november, december); NSNextDayDesignations = (holnap); NSNextNextDayDesignations = ("holnaput\u00e1n"); NSPriorDayDesignations = (tegnap); NSShortDateFormatString = "%Y/%m/%d/"; /* 1974/11/25 */ NSShortMonthNameArray = (jan, feb, "m\u00e1rc", "\u00e1pr", "m\u00e1j", "j\u00fan", "j\u00fal", aug, szept, okt, nov, dec); NSShortTimeDateFormatString = "%Y %b. %d. %H:%M"; /* 1974. nov. 20. 17:33 */ NSShortWeekDayNameArray = (V, H, K, Sze, Cs, P, Szo); NSThisDayDesignations = ("Ma"); NSTimeDateFormatString = "%b. %d. %a %H:%M:%S %z %Y"; /* feb. 22. Cs 15:33:42 +0100 2001 */ NSTimeFormatString = "%H:%M:%S"; /* 21:21:08 */ NSWeekDayNameArray = ("Vas\u00e1rnap", "H\u00e9tf\u0151", Kedd, Szerda, "Cs\u00fct\u00f6rt\u00f6k", "P\u00e9ntek", Szombat); NSYearMonthWeekDesignations = ("\u00e9v","h\u00f3nap" , "h\u00e9t"); } gnustep-base-1.29.0/Resources/Languages/Italian000066400000000000000000000032751435650067400214050ustar00rootroot00000000000000/* Italian -*-c-*- */ { NSLanguageName = "Italian"; NSLanguageCode = ITA; NSFormalName = "Italiano"; NSParentContext = "Default"; NSCurrencySymbol = "EUR"; NSPositiveCurrencyFormatString = "EUR9,999.00"; NSNegativeCurrencyFormatString = "EUR-9,999.00"; NSInternationalCurrencyString = "EUR"; NSDecimalDigits = ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); NSDecimalSeparator = ","; NSThousandsSeparator = "'"; /* not sure but better than `.' */ NSAMPMDesignation = (AM, PM); NSDateFormatString = "%A %d %B %Y"; /* Gioved\u00ec 22 Febbraio 2001 */ NSDateTimeOrdering = DMYH; NSEarlierTimeDesignations = (prima, passato, fa); NSHourNameDesignations = ((0, mezzanotte), (12, mezzogiorno), (10, mattina), (14, pomeriggio), (19, sera)); NSLaterTimeDesignations = (dopo, prossimo); NSMonthNameArray = (Gennaio, Febbraio, Marzo, Aprile, Maggio, Giugno, Luglio, Agosto, Settembre, Ottobre, Novembre, Dicembre); NSNextDayDesignations = (domani); NSNextNextDayDesignations = ("il giorno seguente"); NSPriorDayDesignations = (ieri); NSShortDateFormatString = "%d/%m/%Y"; /* 20/11/1974 */ NSShortMonthNameArray = (Gen, Feb, Mar, Apr, Mag, Giu, Lug, Ago, Set, Ott, Nov, Dic); NSShortTimeDateFormatString = "%d %b %Y %H:%M"; /* 20 Nov 1974 17:33 */ NSShortWeekDayNameArray = (Dom, Lun, Mar, Mer, Gio, Ven, Sab); NSThisDayDesignations = (oggi); NSTimeDateFormatString = "%a %d %b %H:%M:%S %z %Y"; /* Gio 22 Feb 15:33:42 +0100 2001 */ NSTimeFormatString = "%H:%M:%S"; /* 21:21:08 */ NSWeekDayNameArray = (Domenica, "Luned\u00ec", "Marted\u00ec", "Mercoled\u00ec", "Gioved\u00ec", "Venerd\u00ec", Sabato); NSYearMonthWeekDesignations = (anno, mese, settimana); } gnustep-base-1.29.0/Resources/Languages/Japanese000066400000000000000000000034741435650067400215530ustar00rootroot00000000000000/* Japanese */ { NSLanguageName = "Japanese"; NSLanguageCode = JPN; NSFormalName = "\u65e5\u672c\u8a9e"; NSCurrencySymbol = "\u5186"; NSPositiveCurrencyFormatString = "9,999.00\u5186"; NSNegativeCurrencyFormatString = "-9,999.00\u5186"; NSInternationalCurrencyString = "JPY"; NSDecimalDigits = ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); NSDecimalSeparator = "."; NSThousandsSeparator = ","; NSAMPMDesignation = ("\u5348\u524d", "\u5348\u5f8c"); NSDateFormatString = "%Y\u5e74%B%d\u65e5 %A"; NSDateTimeOrdering = YMDH; NSEarlierTimeDesignations = (prior, last, past, ago); NSHourNameDesignations = ((0, "\u771f\u591c\u4e2d"), (12, "\u6b63\u5348", "\u663c\u98df"), (10, "\u671d"), (14, "\u5348\u5f8c"), (19, "\u5915\u98df")); NSLaterTimeDesignations = ("\u5148"); NSMonthNameArray = ("1\u6708", "2\u6708", "3\u6708", "4\u6708", "5\u6708", "6\u6708", "7\u6708", "8\u6708", "9\u6708", "10\u6708", "11\u6708", "12\u6708"); NSNextDayDesignations = ("\u660e\u65e5"); NSNextNextDayDesignations = ("\u660e\u5f8c\u65e5"); NSPriorDayDesignations = ("\u6628\u65e5"); NSShortDateFormatString = "%Y/%m/%d"; NSShortMonthNameArray = ("1\u6708", "2\u6708", "3\u6708", "4\u6708", "5\u6708", "6\u6708", "7\u6708", "8\u6708", "9\u6708", "10\u6708", "11\u6708", "12\u6708"); NSShortTimeDateFormatString = "%Y %b %d %H:%M"; NSShortWeekDayNameArray = ("\u65e5", "\u6708", "\u706b", "\u6c34", "\u6728", "\u91d1", "\u571f"); NSThisDayDesignations = ("\u4eca\u65e5"); NSTimeDateFormatString = "%Y\u5e74%b%d\u65e5(%a) %H:%M:%S %z"; NSTimeFormatString = "%H:%M:%S"; NSWeekDayNameArray = ("\u65e5\u66dc\u65e5", "\u6708\u66dc\u65e5", "\u706b\u66dc\u65e5", "\u6c34\u66dc\u65e5", "\u6728\u66dc\u65e5", "\u91d1\u66dc\u65e5", "\u571f\u66dc\u65e5"); NSYearMonthWeekDesignations = ("\u5e74", "\u6708", "\u9031"); } gnustep-base-1.29.0/Resources/Languages/Korean000066400000000000000000000034311435650067400212350ustar00rootroot00000000000000/* Korean */ { NSLanguageName = "\Ud55c\Uad6d\Uc5b4"; NSLanguageCode = KOR; NSFormalName = "\Ud55c\Uad6d\Uc5b4"; NSCurrencySymbol = "\Uffe6"; NSPositiveCurrencyFormatString = "\Uffe69,999.00"; NSNegativeCurrencyFormatString = "\Uffe6-9,999.00"; NSInternationalCurrencyString = "\Uc6d0"; NSDecimalDigits = ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); NSDecimalSeparator = "."; NSThousandsSeparator = ","; NSAMPMDesignation = ("\Uc624\Uc804", "\Uc624\Ud6c4"); NSDateFormatString = " %Y, %B %d, %A"; NSDateTimeOrdering = DMYH; NSEarlierTimeDesignations = ("\Uc774\Uc804", "\Ub9c8\Uc9c0\Ub9c9", "\Uc9c0\Ub098\Uac04", "\Uc774\Uc804"); NSHourNameDesignations = ((0, "\Ud55c \Ubc24\Uc911"), (12, "\Ud55c \Ub0ae", "\Uc810\Uc2ec"), (10, "\Uc544\Uce68"), (14, "\Uc624\Ud6c4"), (19, "\Uc800\Ub141")); NSLaterTimeDesignations = ("\Ub2e4\Uc74c"); NSMonthNameArray = ("1\Uc6d4", "2\Uc6d4", "3\Uc6d4", "4\Uc6d4", "5\Uc6d4", "6\Uc6d4", "7\Uc6d4", "8\Uc6d4", "9\Uc6d4", "10\Uc6d4", "11\Uc6d4", "12\Uc6d4"); NSNextDayDesignations = ("\Ub0b4\Uc77c"); NSNextNextDayDesignations = ("\Ub2e4\Uc74c \Ub0a0"); NSPriorDayDesignations = ("\Uc5b4\Uc81c"); NSShortDateFormatString = "%Y/%m/%d/"; NSShortMonthNameArray = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12); NSShortTimeDateFormatString = "%d %b, %Y %H:%M"; NSShortWeekDayNameArray = ("\Uc77c", "\Uc6d4", "\Ud654", "\Uc218", "\Ubaa9", "\Uae08", "\Ud1a0"); NSThisDayDesignations = ("\Uc624\Ub298"); NSTimeDateFormatString = "%a %b %d %H:%M:%S %z %Y"; NSTimeFormatString = "%H:%M:%S"; NSWeekDayNameArray = ("\Uc77c\Uc694\Uc77c", "\Uc6d4\Uc694\Uc77c", "\Ud654\Uc694\Uc77c", "\Uc218\Uc694\Uc77c", "\Ubaa9\Uc694\Uc77c", "\Uae08\Uc694\Uc77c", "\Ud1a0\Uc694\Uc77c"); NSYearMonthWeekDesignations = ("\Ub144", "\Uc6d4", "\Uc77c"); } gnustep-base-1.29.0/Resources/Languages/Locale.aliases000066400000000000000000000174351435650067400226460ustar00rootroot00000000000000{ aa = Afar; aa_DJ = DjiboutiAfar; aa_ER = EritreaAfar; aa_ET = EthiopiaAfar; ab = Abkhazian; ace = Achinese; ach = Acoli; ada = Adangme; ady = Adyghe; af = Afrikaans; ak = Akan; am = Amharic; an = Aragonese; anp = Angika; ar = Arabic; ar_AE = UnitedArabEmiratesArabic; ar_BH = BahrainArabic; ar_DZ = AlgeriaArabic; ar_EG = EgyptArabic; ar_IN = IndiaArabic; ar_IQ = IraqArabic; ar_JO = JordanArabic; ar_KW = KuwaitArabic; ar_LB = LebanonArabic; ar_LY = LibyaArabic; ar_MA = MoroccoArabic; ar_OM = OmanArabic; ar_QA = QatarArabic; ar_SA = SaudiArabiaArabic; ar_SD = SudanArabic; ar_SY = SyriaArabic; ar_TN = TunisiaArabic; ar_YE = YemenArabic; arn = Mapudungun; as = Assamese; ast = Asturian; av = Avaric; awa = Awadhi; ay = Aymara; az = Azerbaijani; ba = Bashkir; bal = Baluchi; ban = Balinese; bas = Basa; be = Belarusian; bej = Beja; bem = Bemba; bg = Bulgarian; bh = Bihari; bho = Bhojpuri; bi = Bislama; bik = Bikol; bin = Bini; bm = Bambara; bn = Bengali; bn_BD = BangladeshBengali; bn_IN = IndiaBengali; bo = Tibetan; br = Breton; bs = Bosnian; bua = Buriat; bug = Buginese; byn = Blin; ca = Catalan; ce = Chechen; ceb = Cebuano; ch = Chamorro; chm = Mari; co = Corsican; cr = Cree; crh = CrimeanTatar; cs = Czech; cu = ChurchSlavic; cv = Chuvash; cy = Welsh; da = Danish; dar = Dargwa; de = German; de_AT = AustriaGerman; de_BE = BelgiumGerman; de_CH = SwitzerlandGerman; de_LU = LuxemburgGerman; din = Dinka; doi = Dogri; dv = Maldivian; dyu = Dyula; dz = Bhutani; efi = Efik; el = Greek; el_GR = GreeceGreek; en = English; en_AU = AustraliaEnglish; en_BW = BotswanaEnglish; en_CA = CanadaEnglish; en_DK = DenmarkEnglish; en_GB = BritainEnglish; en_HK = HongKongEnglish; en_IE = IrelandEnglish; en_IN = IndiaEnglish; en_NZ = NewZealandEnglish; en_PH = PhilippinesEnglish; en_SG = SingaporeEnglish; en_US = AmericanEnglish; en_ZA = SouthAfricaEnglish; en_ZW = ZimbabweEnglish; eo = Esperanto; es = Spanish; es_AR = ArgentinaSpanish; es_BO = BoliviaSpanish; es_CL = ChileSpanish; es_CO = ColombiaSpanish; es_CR = CostaRicaSpanish; es_DO = DominicanRepublicSpanish; es_EC = EcuadorSpanish; es_ES = SpainSpanish; es_GT = GuatemalaSpanish; es_HN = HondurasSpanish; es_MX = MexicoSpanish; es_NI = NicaraguaSpanish; es_PA = PanamaSpanish; es_PE = PeruSpanish; es_PR = PuertoRicoSpanish; es_PY = ParaguaySpanish; es_SV = ElSalvadorSpanish; es_US = USASpanish; es_UY = UruguaySpanish; es_VE = VenezuelaSpanish; et = Estonian; et_EE = EstoniaEstonian; eu = Basque; eu_ES = SpainBasque; ewo = Ewondo; fa = Persian; fan = Fang; ff = Fulah; fi = Finnish; fil = Filipino; fj = Fijian; fo = Faroese; fon = Fon; fr = French; fr_BE = BelgiumFrench; fr_CA = CanadaFrench; fr_CH = SwitzerlandFrench; fr_LU = LuxemburgFrench; fur = Friulian; fy = WesternFrisian; ga = Irish; gaa = Ga; gay = Gayo; gba = Gbaya; gd = Gaelic; gd_GB = ScotsGaelic; gez = Geez; gez_ER = EritreaGeez; gez_ET = EthiopiaGeez; gl = Gallegan; gn = Guarani; gon = Gondi; gor = Gorontalo; grb = Grebo; gu = Gujarati; gv = Manx; ha = Hausa; he = Hebrew; hi = Hindi; hil = Hiligaynon; hmn = Hmong; ho = HiriMotu; hr = Croatian; ht = Haitian; hu = Hungarian; hy = Armenian; hz = Herero; ia = Interlingua; iba = Iban; id = Indonesian; ie = Interlingue; ig = Igbo; ii = SichuanYi; ik = Inupiak; ilo = Iloko; inh = Ingush; io = Ido; is = Icelandic; it = Italian; it_CH = SwitzerlandItalian; iu = Inuktitut; iw = Hebrew; ja = Japanese; jv = Javanese; ka = Georgian; kaa = KaraKalpak; kab = Kabyle; kac = Kachin; kam = Kamba; kbd = Kabardian; kg = Kongo; kha = Khasi; ki = Kikuyu; kj = Kwanyama; kk = Kazakh; kl = Greenlandic; km = Cambodian; kmb = Kimbundu; kn = Kannada; ko = Korean; kr = Kanuri; krc = KarachayBalkar; krl = Karelian; kru = Kurukh; ks = Kashmiri; ku = Kurdish; kum = Kumyk; kv = Komi; kw = Cornish; ky = Kirghiz; la = Latin; lad = Ladino; lam = Lamba; lb = Luxembourgish; lez = Lezghian; lg = Ganda; li = Limburgish; ln = Lingala; lo = Lao; lol = Mongo; loz = Lozi; lt = Lithuanian; lu = LubaKatanga; lua = LubaLulua; lug = Luganda; lun = Lunda; luo = Luo; lus = Lushai; lv = Latvian; mad = Madurese; mag = Magahi; mai = Maithili; mak = Makasar; man = Mandingo; mas = Masai; mdf = Moksha; mdr = Mandar; men = Mende; mg = Malagasy; mh = Marshallese; mi = Maori; min = Minangkabau; mk = Macedonian; ml = Malayalam; mn = Mongolian; mni = Manipuri; mo = Moldavian; mos = Mossi; mr = Marathi; ms = Malay; mt = Maltese; my = Burmese; myv = Erzya; na = Nauru; nap = Neapolitan; nb = NorwegianBokmal; nd = NdebeleNorth; ne = Nepali; new = NepalBhasa; ng = Ndonga; nia = Nias; nl = Dutch; nl_BE = BelgiumDutch; nl_NL = NetherlandsDutch; nn = NorwegianNynorsk; no = Norwegian; nr = NdebeleSouth; nso = Pedi; nv = Navajo; ny = Chichewa; nym = Nyamwezi; nyn = Nyankole; nyo = Nyoro; nzi = Nzima; oc = Occitan; oj = Ojibwa; om = Oromo; om_ET = EthiopiaOromo; om_KE = KenyaOromo; or = Oriya; os = Ossetian; pa = Punjabi; pag = Pangasinan; pam = Pampanga; pap = Papiamento; pi = Pali; pl = Polish; ps = Pashto; pt = Portuguese; pt_BR = BrasilPortuguese; qu = Quechua; raj = Rajasthani; rm = Romansh; rn = Rundi; ro = Romanian; ru = Russian; ru_UA = UkraineRussian; rup = Aromanian; rw = Kinyarwanda; sa = Sanskrit; sah = Yakut; sas = Sasak; sat = Santali; scn = Sicilian; sco = Scots; sc = Sardinian; sd = Sindhi; se = NorthernSaami; sg = Sango; shn = Shan; si = Sinhala; sid = Sidamo; sk = Slovak; sl = Slovenian; sm = Samoan; sn = Shona; snk = Soninke; so = Somali; so_DJ = DjiboutiSomali; so_ET = EthiopiaSomali; so_KE = KenyaSomali; so_SO = SomaliaSomali; sq = Albanian; sr = Serbian; srr = Serer; ss = Swati; st = Sotho; su = Sundanese; suk = Sukuma; sus = Susu; sv = Swedish; sv_FI = FinlandSwedish; sw = Swahili; ta = Tamil; te = Telugu; tem = Timne; tet = Tetum; tg = Tajik; th = Thai; ti = Tigrinya; ti_ER = EritreaTigrinya; ti_ET = EthiopiaTigrinya; tig = Tigre; tiv = Tiv; tk = Turkmen; tl = Tagalog; tn = Tswana; to = Tonga; tog = TongaNyasa; tpi = TokPisin; tr = Turkish; ts = Tsonga; tt = Tatar; tum = Tumbuka; tw = Twi; ty = Tahitian; tyv = Tuvinian; udm = Udmurt; ug = Uighur; uk = Ukrainian; umb = Umbundu; ur = Urdu; uz = Uzbek; vai = Vai; ve = Venda; vi = Vietnamese; wa = Walloon; wal = Walamo; war = Waray; wo = Wolof; xal = Kalmyk; xh = Xhosa; yao = Yao; yi = Yiddish; yo = Yoruba; za = Zhuang; zh = Chinese; zh_CN = SimplifiedChinese; zh_HK = HongKongChinese; zh_SG = SingaporeChinese; zh_TW = TraditionalChinese; zu = Zulu; } gnustep-base-1.29.0/Resources/Languages/Locale.canonical000066400000000000000000000243411435650067400231460ustar00rootroot00000000000000{ Abkhazian = ab; Achinese = ace; Acoli = ach; Adangme = ada; Adyghe = ady; Afar = aa; Afrikaans = af; Akan = ak; Albanian = sq; AlgeriaArabic = ar_DZ; AmericanEnglish = en_US; Amharic = am; Angika = anp; Arabic = ar; Aragonese = an; ArgentinaSpanish = es_AR; Armenian = hy; Aromanian = rup; Assamese = as; Asturian = ast; AustraliaEnglish = en_AU; AustriaGerman = de_AT; Avaric = av; Awadhi = awa; Aymara = ay; Azerbaijani = az; /* -Cyrl, or -Latn ?*/ BahrainArabic = ar_BH; Balinese = ban; Baluchi = bal; Bambara = bm; BangladeshBengali = bn_BD; Basa = bas; Bashkir = ba; Basque = eu; Beja = bej; Belarusian = be; BelgiumDutch = nl_BE; BelgiumFrench = fr_BE; BelgiumGerman = de_BE; Bemba = bem; Bengali = bn; Bhojpuri = bho; Bhutani = dz; Bihari = bh; Bikol = bik; Bini = bin; Bislama = bi; Blin = byn; BoliviaSpanish = es_BO; Bosnian = bs; BotswanaEnglish = en_BW; BrasilPortuguese = pt_BR; Breton = br; BritainEnglish = en_GB; Buginese = bug; Bulgarian = bg; Buriat = bua; Burmese = my; Cambodian = km; CanadaEnglish = en_CA; CanadaFrench = fr_CA; Catalan = ca; Cebuano = ceb; Chamorro = ch; Chechen = ce; Chichewa = ny; ChileSpanish = es_CL; Chinese = zh; ChurchSlavic = cu; Chuvash = cv; ColombiaSpanish = es_CO; Cornish = kw; Corsican = co; CostaRicaSpanish = es_CR; Cree = cr; CrimeanTatar = crh; Croatian = hr; Czech = cs; Danish = da; Dargwa = dar; DenmarkEnglish = en_DK; Dinka = din; DjiboutiAfar = aa_DJ; DjiboutiSomali = so_DJ; Dogri = doi; DominicanRepublicSpanish = es_DO; Dutch = nl; Dyula = dyu; EcuadorSpanish = es_EC; Efik = efi; EgyptArabic = ar_EG; ElSalvadorSpanish = es_SV; English = en; EritreaAfar = aa_ER; EritreaGeez = gez_ER; EritreaTigrinya = ti_ER; Erzya = myv; Esperanto = eo; EstoniaEstonian = et_EE; Estonian = et; EthiopiaAfar = aa_ET; EthiopiaGeez = gez_ET; EthiopiaOromo = om_ET; EthiopiaSomali = so_ET; EthiopiaTigrinya = ti_ET; Ewondo = ewo; Fang = fan; Faroese = fo; Fijian = fj; Filipino = fil; FinlandSwedish = sv_FI; Finnish = fi; Fon = fon; French = fr; Friulian = fur; Fulah = ff; Ga = gaa; Gaelic = gd; Gallegan = gl; Ganda = lg; Gayo = gay; Gbaya = gba; Geez = gez; Georgian = ka; German = de; Gondi = gon; Gorontalo = gor; Grebo = grb; GreeceGreek = el_GR; Greek = el; Greenlandic = kl; Guarani = gn; GuatemalaSpanish = es_GT; Gujarati = gu; Haitian = ht; Hausa = ha-Latn; Hebrew = he; Hebrew = iw; Herero = hz; Hiligaynon = hil; Hindi = hi; HiriMotu = ho; Hmong = hmn; HondurasSpanish = es_HN; HongKongChinese = zh-Hant_HK; HongKongEnglish = en_HK; Hungarian = hu; Iban = iba; Icelandic = is; Ido = io; Igbo = ig; Iloko = ilo; IndiaArabic = ar_IN; IndiaBengali = bn_IN; IndiaEnglish = en_IN; Indonesian = id; Ingush = inh; Interlingua = ia; Interlingue = ie; Inuktitut = iu; Inupiak = ik; IraqArabic = ar_IQ; IrelandEnglish = en_IE; Irish = ga; Italian = it; Japanese = ja; Javanese = jv; JordanArabic = ar_JO; Kabardian = kbd; Kabyle = kab; Kachin = kac; Kalmyk = xal; Kamba = kam; Kannada = kn; Kanuri = kr; KarachayBalkar = krc; KaraKalpak = kaa; Karelian = krl; Kashmiri = ks; Kazakh = kk-Cyrl; KenyaOromo = om_KE; KenyaSomali = so_KE; Khasi = kha; Kikuyu = ki; Kimbundu = kmb; Kinyarwanda = rw; Kirghiz = ky; Komi = kv; Kongo = kg; Korean = ko; Kumyk = kum; Kurdish = ku; Kurukh = kru; KuwaitArabic = ar_KW; Kwanyama = kj; Ladino = lad; Lamba = lam; Lao = lo; Latin = la; Latvian = lv; LebanonArabic = ar_LB; Lezghian = lez; LibyaArabic = ar_LY; Limburgish = li; Lingala = ln; Lithuanian = lt; Lozi = loz; LubaKatanga = lu; LubaLulua = lua; Luganda = lug; Lunda = lun; Luo = luo; Lushai = lus; Luxembourgish = lb; LuxemburgFrench = fr_LU; LuxemburgGerman = de_LU; Macedonian = mk; Madurese = mad; Magahi = mag; Maithili = mai; Makasar = mak; Malagasy = mg; Malay = ms; Malayalam = ml; Maldivian = dv; Maltese = mt; Mandar = mdr; Mandingo = man; Manipuri = mni; Manx = gv; Maori = mi; Mapudungun = arn; Marathi = mr; Mari = chm; Marshallese = mh; Masai = mas; Mende = men; MexicoSpanish = es_MX; Minangkabau = min; Moksha = mdf; Moldavian = mo; Mongo = lol; Mongolian = mn; MoroccoArabic = ar_MA; Mossi = mos; Nauru = na; Navajo = nv; NdebeleNorth = nd; NdebeleSouth = nr; Ndonga = ng; Neapolitan = nap; NepalBhasa = new; Nepali = ne; NetherlandsDutch = nl_NL; NewZealandEnglish = en_NZ; Nias = nia; NicaraguaSpanish = es_NI; NorthernSaami = se; Norwegian = no; NorwegianBokmal = nb; NorwegianNynorsk = nn; Nyamwezi = nym; Nyankole = nyn; Nyoro = nyo; Nzima = nzi; Occitan = oc; Ojibwa = oj; OmanArabic = ar_OM; Oriya = or; Oromo = om; Ossetian = os; Pali = pi; Pampanga = pam; PanamaSpanish = es_PA; Pangasinan = pag; Papiamento = pap; ParaguaySpanish = es_PY; Pashto = ps; Pedi = nso; Persian = fa; PeruSpanish = es_PE; PhilippinesEnglish = en_PH; Polish = pl; Portuguese = pt; PuertoRicoSpanish = es_PR; Punjabi = pa; /* -Arab, or -Guru ?*/ QatarArabic = ar_QA; Quechua = qu; Rajasthani = raj; Romanian = ro; Romansh = rm; Rundi = rn; Russian = ru; Samoan = sm; Sango = sg; Sanskrit = sa; Santali = sat; Sardinian = sc; Sasak = sas; SaudiArabiaArabic = ar_SA; Scots = sco; ScotsGaelic = gd_GB; Serbian = sr; /* -Cyrl, or -Latn ?*/ Serer = srr; Shan = shn; Shona = sn; SichuanYi = ii; Sicilian = scn; Sidamo = sid; SimplifiedChinese = zh-Hans; Sindhi = sd; SingaporeChinese = zh-Hans_SG; SingaporeEnglish = en_SG; Sinhala = si; Slovak = sk; Slovenian = sl; Somali = so; SomaliaSomali = so_SO; Soninke = snk; Sotho = st; SouthAfricaEnglish = en_ZA; SpainBasque = eu_ES; SpainSpanish = es_ES; Spanish = es; SudanArabic = ar_SD; Sukuma = suk; Sundanese = su; Susu = sus; Swahili = sw; Swati = ss; Swedish = sv; SwitzerlandFrench = fr_CH; SwitzerlandGerman = de_CH; SwitzerlandItalian = it_CH; SyriaArabic = ar_SY; Tagalog = tl; Tahitian = ty; Tajik = tg; Tamil = ta; Tatar = tt; Telugu = te; Tetum = tet; Thai = th; Tibetan = bo; Tigre = tig; Tigrinya = ti; Timne = tem; Tiv = tiv; TokPisin = tpi; Tonga = to; TongaNyasa = tog; TraditionalChinese = zh-Hant; Tsonga = ts; Tswana = tn; Tumbuka = tum; TunisiaArabic = ar_TN; Turkish = tr; Turkmen = tk; Tuvinian = tyv; Twi = tw; Udmurt = udm; Uighur = ug; UkraineRussian = ru_UA; Ukrainian = uk; Umbundu = umb; UnitedArabEmiratesArabic = ar_AE; Urdu = ur; UruguaySpanish = es_UY; USASpanish = es_US; Uzbek = uz; /* -Arab, -Cyrl, or -Latn ?*/ Vai = vai; Venda = ve; VenezuelaSpanish = es_VE; Vietnamese = vi; Walamo = wal; Walloon = wa; Waray = war; Welsh = cy; WesternFrisian = fy; Wolof = wo; Xhosa = xh; Yakut = sah; Yao = yao; YemenArabic = ar_YE; Yiddish = yi; Yoruba = yo; Zhuang = za; ZimbabweEnglish = en_ZW; Zulu = zu; aar = aa; abk = ab; afr = af; alb = sq; amh = am; ara = ar; arm = hy; asm = as; ave = ae; aym = ay; aze = az; bak = ba; baq = eu; bel = be; ben = bn; bih = bh; bis = bi; bod = bo; bos = bs; bre = br; bul = bg; bur = my; cat = ca; ces = cs; cha = ch; che = ce; chi = zh; chu = cu; chv = cv; cor = kw; cos = co; cym = cy; cze = cs; dan = da; deu = de; dut = nl; dzo = dz; ell = el; eng = en; epo = eo; est = et; eus = eu; fao = fo; fas = fa; fij = fj; fin = fi; fra = fr; fre = fr; fry = fy; geo = ka; ger = de; gla = gd; gle = ga; glg = gl; glv = gv; gre = el; grn = gn; guj = gu; hau = ha; heb = he; her = hz; hin = hi; hmo = ho; hrv = hr; hun = hu; hye = hy; ice = is; iku = iu; ile = ie; ina = ia; ind = id; ipk = ik; isl = is; ita = it; jav = jw; jaw = jw; jpn = ja; kal = kl; kan = kn; kas = ks; kat = ka; kaz = kk; khm = km; kik = ki; kin = rw; kir = ky; kom = kv; kor = ko; kua = kj; kur = ku; lao = lo; lat = la; lav = lv; lin = ln; lit = lt; ltz = lb; mac = mk; mah = mh; mal = ml; mao = mi; mar = mr; may = ms; mkd = mk; mlg = mg; mlt = mt; mol = mo; mon = mn; mri = mi; msa = ms; mya = my; nau = na; nav = nv; nbl = nr; nde = nd; ndo = ng; nep = ne; nld = nl; nno = nn; nob = nb; nor = no; nya = ny; oci = oc; ori = or; orm = om; oss = os; pan = pa; per = fa; pli = pi; pol = pl; por = pt; pus = ps; que = qu; roh = rm; ron = ro; rum = ro; run = rn; rus = ru; sag = sg; san = sa; scc = sr; scr = hr; sin = si; slk = sk; slo = sk; slv = sl; sme = se; smo = sm; sna = sn; snd = sd; som = so; sot = st; spa = es; sqi = sq; srd = sc; srp = sr; ssw = ss; sun = su; swa = sw; swe = sv; tah = ty; tam = ta; tat = tt; tel = te; tgk = tg; tgl = tl; tha = th; tib = bo; tsn = tn; tso = ts; tuk = tk; tur = tr; twi = tw; uig = ug; ukr = uk; urd = ur; uzb = uz; vie = vi; vol = vo; wel = cy; wol = wo; xho = xh; yid = yi; zha = za; zho = zh; zul = zu; ca_ES_PREEURO = "ca_ES@currency=ESP"; de_AT_PREEURO = "de_AT@currency=ATS"; de_DE_PREEURO = "de_DE@currency=DEM"; de_LU_PREEURO = "de_LU@currency=LUF"; el_GR_PREEURO = "el_GR@currency=GRD"; en_BE_PREEURO = "en_BE@currency=BEF"; en_IE_PREEURO = "en_IE@currency=IEP"; es_ES_PREEURO = "es_ES@currency=ESP"; eu_ES_PREEURO = "eu_ES@currency=ESP"; fi_FI_PREEURO = "fi_FI@currency=FIM"; fr_BE_PREEURO = "fr_BE@currency=BEF"; fr_FR_PREEURO = "fr_FR@currency=FRF"; fr_LU_PREEURO = "fr_LU@currency=LUF"; ga_IE_PREEURO = "ga_IE@currency=IEP"; gl_ES_PREEURO = "gl_ES@currency=ESP"; it_IT_PREEURO = "it_IT@currency=ITL"; nl_BE_PREEURO = "nl_BE@currency=BEF"; nl_NL_PREEURO = "nl_NL@currency=NLG"; pt_PT_PREEURO = "pt_PT@currency=PTE"; de__PHONEBOOK = "de@collation=phonebook"; es__TRADITIONAL = "es@collation=traditional"; hi__DIRECT = "hi@collation=direct"; ja_JP_TRADITIONAL = "ja_JP@calendar=japanese"; } gnustep-base-1.29.0/Resources/Languages/Locale.encodings000066400000000000000000000000511435650067400231600ustar00rootroot00000000000000{ th_TH = NSISOThaiStringEncoding; } gnustep-base-1.29.0/Resources/Languages/Polish000066400000000000000000000030321435650067400212510ustar00rootroot00000000000000/* Polish */ { NSLanguageName = "Polish"; NSLanguageCode = POL; NSFormalName = "Polski"; NSCurrencySymbol = "ZÅ‚oty"; NSPositiveCurrencyFormatString = "$9,999.00"; NSNegativeCurrencyFormatString = "$-9,999.00"; NSInternationalCurrencyString = "PLN"; NSDecimalDigits = ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); NSDecimalSeparator = "."; NSThousandsSeparator = ","; NSAMPMDesignation = (AM, PM); NSDateFormatString = "%A, %B %d, %Y"; NSDateTimeOrdering = DMYH; NSEarlierTimeDesignations = (poprzednia, ostatnia, przeszÅ‚ość, przeszÅ‚ość); NSHourNameDesignations = ((0, północ), (12, poÅ‚udnie, obiad), (10, rano), (14, popoÅ‚udnie), (19, wieczór, kolacja)); NSLaterTimeDesignations = (później); NSMonthNameArray = (StyczeÅ„, Luty, Marzec, KwiecieÅ„, Maj, Czerwiec, Lipiec, SierpieÅ„, WrzesieÅ„, Październik, Listopad, GrudzieÅ„); NSNextDayDesignations = (jutro); NSNextNextDayDesignations = (pojutrze); NSPriorDayDesignations = (wczoraj); NSShortDateFormatString = "%m/%d/%Y"; NSShortMonthNameArray = (stycz., luty, mar., kwiec., maj, czerw., lip., sierp., wrzes., pazdz., listop., grudz.); NSShortTimeDateFormatString = "%d %b, %Y %H:%M"; NSShortWeekDayNameArray = (Niedz., Pon., Wt., Åšr., Czw., Pt., Sob.); NSThisDayDesignations = (dzisiaj); NSTimeDateFormatString = "%a %b %d %H:%M:%S %z %Y"; NSTimeFormatString = "%H:%M:%S"; NSWeekDayNameArray = (Niedziela, PoniedziaÅ‚ek, Wtorek, Å›roda, Czwartek, PiÄ…tek, Sobota); NSYearMonthWeekDesignations = (rok, miesiÄ…c, tydzieÅ„); } gnustep-base-1.29.0/Resources/Languages/README000066400000000000000000000024261435650067400207560ustar00rootroot00000000000000The file Locale.aliases is used to map common language specifications to old-style long names. The file Locale.canonical is used to map old style names and three letter ISO-639-2 names to the preferred two letter ISO-639-1 names. Language files which contain non-ascii characters should either be properly marked unicode files (UTF-8 with a leading Byte Order Mark or UTF-16 with a leading Byte Order Mark) or should encode those characters as \u escape sequences so that they are usable on systems where the default C-String encoding is not the same as the one on which the language files were created! Since it is generally not easy to edit unicode directly, or enter the correct unicode escape sequences, it is recommended that you use the cvtenc tool to perform conversions of the files before and after editing in the default encoding used by your system. For example, to edit the French language file so that it contains an ascii propertly list with \u escape sequeneces, you could do - cvtenc -EscapeIn yes fr > tmpfile vi tmpfile cvtenc -EscapeOut yes tmpfile > fr rm tmpfile A common case is where you have a file in UTF-8, but the Byte Order Mark is missing, so you need to fix it up ... cvtenc -Encoding 'UNICODE UTF-8' FileWithMissingBOM >tmpFile cvtenc -EscapeOut yes tmpFile > fr gnustep-base-1.29.0/Resources/Languages/Russian000066400000000000000000000060141435650067400214420ustar00rootroot00000000000000/* Russian */ { NSLanguageName = "Russian"; NSLanguageCode = RU; NSFormalName = "Russian"; NSCurrencySymbol = "\U0440\U0443\U0431"; NSPositiveCurrencyFormatString = "9 999,00 \U0440\U0443\U0431"; NSNegativeCurrencyFormatString = "-9 999,00 \U0440\U0443\U0431"; NSInternationalCurrencyString = "RUR"; NSDecimalDigits = ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); NSDecimalSeparator = ","; NSThousandsSeparator = " "; NSAMPMDesignation = (AM, PM); NSDateFormatString = "%A, %d %B, %Y"; NSDateTimeOrdering = DMYH; NSEarlierTimeDesignations = ("\U043f\U0440\U0435\U0434\U044b\U0434\U0443\U0449\U0438\U0439", "\U043f\U0440\U043e\U0448\U043b\U044b\U0439", "\U043c\U0438\U043d\U0443\U0432\U0448\U0438\U0439", "\U0442\U043e\U043c\U0443 \U043d\U0430\U0437\U0430\U0434"); NSHourNameDesignations = ((0, "\U043f\U043e\U043b\U043d\U043e\U0447\U044c"), (12, "\U043f\U043e\U043b\U0434\U0435\U043d\U044c"), (10, "\U0443\U0442\U0440\U043e"), (14, "\U043e\U0431\U0435\U0434"), (19, "\U0432\U0435\U0447\U0435\U0440")); NSLaterTimeDesignations = ("\U0441\U043b\U0435\U0434\U0443\U044e\U0449\U0438\U0439"); NSMonthNameArray = ("\U042f\U043d\U0432\U0430\U0440\U044c", "\U0424\U0435\U0432\U0440\U0430\U043b\U044c", "\U041c\U0430\U0440\U0442", "\U0410\U043f\U0440\U0435\U043b\U044c", "\U041c\U0430\U0439", "\U0418\U044e\U043d\U044c", "\U0418\U044e\U043b\U044c", "\U0410\U0432\U0433\U0443\U0441\U0442", "\U0421\U0435\U043d\U0442\U044f\U0431\U0440\U044c", "\U041e\U043a\U0442\U044f\U0431\U0440\U044c", "\U041d\U043e\U044f\U0431\U0440\U044c", "\U0414\U0435\U043a\U0430\U0431\U0440\U044c"); NSNextDayDesignations = ("\U0437\U0430\U0432\U0442\U0440\U0430"); NSNextNextDayDesignations = ("\U043f\U043e\U0441\U043b\U0435\U0437\U0430\U0432\U0442\U0440\U0430"); NSPriorDayDesignations = ("\U0432\U0447\U0435\U0440\U0430"); NSShortDateFormatString = "%d/%m/%Y"; NSShortMonthNameArray = ("\U042f\U043d\U0432", "\U0424\U0435\U0432", "\U041c\U0430\U0440", "\U0410\U043f\U0440", "\U041c\U0430\U0439", "\U0418\U044e\U043d", "\U0418\U044e\U043b", "\U0410\U0432\U0433", "\U0421\U0435\U043d", "\U041e\U043a\U0442", "\U041d\U043e\U044f", "\U0414\U0435\U043a"); NSShortTimeDateFormatString = "%d %b, %Y %H:%M"; NSShortWeekDayNameArray = ("\U0412\U043e\U0441", "\U041f\U043e\U043d", "\U0412\U0442", "\U0421\U0440\U0434", "\U0427\U0442\U0432", "\U041f\U044f\U0442", "\U0421\U0443\U0431"); NSThisDayDesignations = ("\U0441\U0435\U0433\U043e\U0434\U043d\U044f"); NSTimeDateFormatString = "%a %d %b %H:%M:%S %z %Y"; NSTimeFormatString = "%H:%M:%S"; NSWeekDayNameArray = ("\U0412\U043e\U0441\U043a\U0440\U0435\U0441\U0435\U043d\U044c\U0435", "\U041f\U043e\U043d\U0435\U0434\U0435\U043b\U044c\U043d\U0438\U043a", "\U0412\U0442\U043e\U0440\U043d\U0438\U043a", "\U0421\U0440\U0435\U0434\U0430", "\U0427\U0435\U0442\U0432\U0435\U0440\U0433", "\U041f\U044f\U0442\U043d\U0438\U0446\U0430", "\U0421\U0443\U0431\U0431\U043e\U0442\U0430"); NSYearMonthWeekDesignations = ("\U0433\U043e\U0434", "\U043c\U0435\U0441\U044f\U0446", "\U043d\U0435\U0434\U0435\U043b\U044f"); } gnustep-base-1.29.0/Resources/Languages/SimplifiedChinese000066400000000000000000000040271435650067400234040ustar00rootroot00000000000000/* Simplified Chinese */ { NSLanguageName = "\u7b80\u4f53\u4e2d\u6587"; NSLanguageCode = CHS; NSFormalName = "\u7b80\u4f53\u4e2d\u6587"; NSCurrencySymbol = "\u00a5"; NSPositiveCurrencyFormatString = "\u00a59,999.00"; NSNegativeCurrencyFormatString = "\u00a5-9,999.00"; NSInternationalCurrencyString = "CNY"; NSDecimalDigits = ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); NSDecimalSeparator = "."; NSThousandsSeparator = ","; NSAMPMDesignation = ("\u4e0a\u5348", "\u4e0b\u5348"); NSDateFormatString = "%Y\u5e74%B%d\u65e5 %A"; NSDateTimeOrdering = YMDH; NSEarlierTimeDesignations = ("\u4e4b\u524d", "\u8fc7\u53bb"); NSHourNameDesignations = ((0, "\u5348\u591c"), (12, "\u4e2d\u5348"), (10, "\u4e0a\u5348"), (14, "\u4e0b\u5348"), (19, "\u665a\u4e0a")); NSLaterTimeDesignations = ("\u4e4b\u5f8c", "\u4ee5\u5f8c"); NSMonthNameArray = ("\u4e00\u6708", "\u4e8c\u6708", "\u4e09\u6708", "\u56db\u6708", "\u4e94\u6708", "\u516d\u6708", "\u4e03\u6708", "\u516b\u6708", "\u4e5d\u6708", "\u5341\u6708", "\u5341\u4e00\u6708", "\u5341\u4e8c\u6708"); NSNextDayDesignations = ("\u660e\u5929"); NSNextNextDayDesignations = ("\u540e\u5929"); NSPriorDayDesignations = ("\u6628\u5929"); NSShortDateFormatString = "%Y/%m/%d"; NSShortMonthNameArray = ("\u4e00\u6708", "\u4e8c\u6708", "\u4e09\u6708", "\u56db\u6708", "\u4e94\u6708", "\u516d\u6708", "\u4e03\u6708", "\u516b\u6708", "\u4e5d\u6708", "\u5341\u6708", "\u5341\u4e00\u6708", "\u5341\u4e8c\u6708"); NSShortTimeDateFormatString = "%Y %b %d %H:%M"; NSShortWeekDayNameArray = ("\u9031\u4e00", "\u9031\u4e8c", "\u9031\u4e09", "\u9031\u56db", "\u9031\u4e94", "\u9031\u516d", "\u9031\u65e5"); NSThisDayDesignations = ("\u4eca\u5929"); NSTimeDateFormatString = "%Y\u5e74%b%d\u65e5 %a %Z %H:%M:%S"; NSTimeFormatString = "%H:%M:%S"; NSWeekDayNameArray = ("\u661f\u671f\u4e00", "\u661f\u671f\u4e8c", "\u661f\u671f\u4e09", "\u661f\u671f\u56db", "\u661f\u671f\u4e94", "\u661f\u671f\u516d", "\u661f\u671f\u65e5"); NSYearMonthWeekDesignations = ("\u5e74", "\u6708", "\u9031"); } gnustep-base-1.29.0/Resources/Languages/Slovak000066400000000000000000000032451435650067400212600ustar00rootroot00000000000000/* Slovak */ { NSLanguageName = "Slovak"; NSFormalName = "Slovensky"; NSLanguageCode = "SK"; NSParentContext = "Default"; NSCurrencySymbol = "Sk"; NSInternationalCurrencyString = SKK; NSPositiveCurrencyFormatString = "9.999,00 $"; NSNegativeCurrencyFormatString = "-9.999,00 $"; NSDecimalDigits = ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); NSDecimalSeparator = ","; NSDateFormatString = "%A, %B %d, %Y"; NSDateTimeOrdering = DMYH; /* resolve numbers in Day,Month,Year,Hour order */ NSEarlierTimeDesignations = ("predch\u00e1dzaj\u00faci", "posledn\u00fd", "minul\u00fd", "sp\u00e4\u0165"); NSHourNameDesignations = ((0, polnoc), (12, poludnie), (10, "r\u00e1no"), (14, poobede), (19, "ve\u010der")); NSLaterTimeDesignations = ("bud\u00faci"); NSMonthNameArray = ("Janu\u00e1r", "Febru\u00e1r", Marec, "Apr\u00edl", "M\u00e1j", "J\u00fan", "J\u00fal", August, September, "Okt\u00f3ber", November, December); NSNextDayDesignations = (zajtra); NSNextNextDayDesignations = (pozajtra); NSPriorDayDesignations = ("v\u010dera"); NSShortDateFormatString = "%d.%m.%Y"; /* "07.12.95" for example */ NSShortMonthNameArray = (Jan, Feb, Mar, Apr, "M\u00e1j", "J\u00fan", "J\u00fal", Aug, Sep, Okt, Nov, Dec); NSShortTimeDateFormatString = "%d.%b.%Y %H:%M"; /* "07. Dec. 95 16:50 " for example */ NSShortWeekDayNameArray = (Ne, Po, Ut, St, "\u0160t", Pi, So); NSThisDayDesignations = (dnes); NSThousandsSeparator = "."; NSTimeDateFormatString = "%a %b %d %Y %H:%M:%S %Z"; NSTimeFormatString = "%H:%M:%S"; NSWeekDayNameArray = ("Nede\u013ea", Pondelok, Utorok, Streda, "\u0160tvrtok", Piatok, Sobota); NSYearMonthWeekDesignations = (rok, mesiac, "t\u00fd\u017ede\u0148"); } gnustep-base-1.29.0/Resources/Languages/Spanish000066400000000000000000000030511435650067400214210ustar00rootroot00000000000000/* Spanish */ { NSLanguageName = "Spanish"; NSLanguageCode = ESP; NSFormalName = "Espa\U00f1ol"; NSParentContext = "Default"; NSCurrencySymbol = "EUR"; NSPositiveCurrencyFormatString = "9,999.00 EUR"; NSNegativeCurrencyFormatString = "-9,999.00 EUR"; NSInternationalCurrencyString = "EUR"; NSDecimalDigits = ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); NSDecimalSeparator = ","; NSThousandsSeparator = "."; NSAMPMDesignation = (AM, PM); NSDateFormatString = "%A, %d %B, %Y"; NSDateTimeOrdering = DMYH; NSEarlierTimeDesignations = (antes, menos, hace); /* Not sure */ NSHourNameDesignations = ((0, medianoche), (12, "mediod\U00eda"), (10, "ma\U00f1ana"), (14, tarde), (19, noche)); NSLaterTimeDesignations = (pasado); /* Not sure */ NSMonthNameArray = (enero, febrero, marzo, abril, mayo, junio, julio, agosto, septiembre, octubre, noviembre, diciembre); NSNextDayDesignations = ("ma\U00f1ana"); NSNextNextDayDesignations = ("pasado ma\U00f1ana"); NSPriorDayDesignations = (ayer); NSShortDateFormatString = "%d/%m/%Y"; NSShortMonthNameArray = (ene, feb, mar, apr, may, jun, jul, ago, sep, oct, nov, dic); NSShortTimeDateFormatString = "%d %b, %Y %H:%M"; NSShortWeekDayNameArray = (dom, lun, mar, "mi\U00e9", jue, vie, "s\U00e1b"); NSThisDayDesignations = (hoy); NSTimeDateFormatString = "%a %d %b %H:%M:%S %z %Y"; NSTimeFormatString = "%H:%M:%S"; NSWeekDayNameArray = (domingo, lunes, martes, "mi\U00e9rcoles", jueves, viernes, "s\U00e1bado"); NSYearMonthWeekDesignations = ("a\U00f1o", mes, semana); } gnustep-base-1.29.0/Resources/Languages/TraditionalChinese000066400000000000000000000040001435650067400235600ustar00rootroot00000000000000/* Traditional Chinese */ { NSLanguageName = "\u7e41\u9ad4\u4e2d\u6587"; NSLanguageCode = CHT; NSFormalName = "\u7e41\u9ad4\u4e2d\u6587"; NSCurrencySymbol = "NT$"; NSPositiveCurrencyFormatString = "NT$9,999.00"; NSNegativeCurrencyFormatString = "NT$-9,999.00"; NSInternationalCurrencyString = "NTD"; NSDecimalDigits = ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); NSDecimalSeparator = "."; NSThousandsSeparator = ","; NSAMPMDesignation = ("\u4e0a\u5348", "\u4e0b\u5348"); NSDateFormatString = "%A, %B %d, %Y"; NSDateTimeOrdering = DMYH; NSEarlierTimeDesignations = ("\u4e4b\u524d", "\u904e\u53bb"); NSHourNameDesignations = ((0, "\u5348\u591c"), (12, "\u4e2d\u5348"), (10, "\u4e0a\u5348"), (14, "\u4e0b\u5348"), (19, "\u665a\u4e0a")); NSLaterTimeDesignations = ("\u4e4b\u5f8c", "\u4ee5\u5f8c"); NSMonthNameArray = ("\u4e00\u6708", "\u4e8c\u6708", "\u4e09\u6708", "\u56db\u6708", "\u4e94\u6708", "\u516d\u6708", "\u4e03\u6708", "\u516b\u6708", "\u4e5d\u6708", "\u5341\u6708", "\u5341\u4e00\u6708", "\u5341\u4e8c\u6708"); NSNextDayDesignations = ("\u660e\u5929"); NSNextNextDayDesignations = ("\u5f8c\u5929"); NSPriorDayDesignations = ("\u6628\u5929"); NSShortDateFormatString = "%m/%d/%Y"; NSShortMonthNameArray = ("\u4e00\u6708", "\u4e8c\u6708", "\u4e09\u6708", "\u56db\u6708", "\u4e94\u6708", "\u516d\u6708", "\u4e03\u6708", "\u516b\u6708", "\u4e5d\u6708", "\u5341\u6708", "\u5341\u4e00\u6708", "\u5341\u4e8c\u6708"); NSShortTimeDateFormatString = "%d %b, %Y %H:%M"; NSShortWeekDayNameArray = ("\u9031\u4e00", "\u9031\u4e8c", "\u9031\u4e09", "\u9031\u56db", "\u9031\u4e94", "\u9031\u516d", "\u9031\u65e5"); NSThisDayDesignations = ("\u4eca\u5929"); NSTimeDateFormatString = "%a %b %d %Y %H:%M:%S %Z"; NSTimeFormatString = "%H:%M:%S"; NSWeekDayNameArray = ("\u661f\u671f\u4e00", "\u661f\u671f\u4e8c", "\u661f\u671f\u4e09", "\u661f\u671f\u56db", "\u661f\u671f\u4e94", "\u661f\u671f\u516d", "\u661f\u671f\u65e5"); NSYearMonthWeekDesignations = ("\u5e74", "\u6708", "\u9031"); } gnustep-base-1.29.0/Resources/Languages/Turkish000066400000000000000000000031471435650067400214530ustar00rootroot00000000000000/* Turkisch */ { NSLanguageName = "Turkish"; NSFormalName = "Türkçe"; NSLanguageCode = "TUR"; NSParentContext = "Default"; NSCurrencySymbol = "TRY"; NSDateFormatString = "%A, %B %d, %Y"; NSDateTimeOrdering = DMYH; /* resolve numbers in Day,Month,Year,Hour order */ NSDecimalDigits = ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); NSDecimalSeparator = ","; NSEarlierTimeDesignations = (önce, son, son, önceki, önceki, önce); NSHourNameDesignations = ((0, Gece yarısı), (12, öğlen), (10, am), (14, öğleden sonraları), (19, akÅŸam))); NSInternationalCurrencyString = TRY; NSLaterTimeDesignations = ("sonra"); NSMonthNameArray = (Ocak, Åžubat, Mart, Nisan, Mayıs, Haziran, Temmuz, AÄŸustos, Eylül, Ekim, Kasım, Aralık); NSNextDayDesignations = (Yarın); NSNextNextDayDesignations = ("ertesi gün"); /* (as in: am n\u00e4chsten Tag) */ NSPriorDayDesignations = (Dün); NSShortDateFormatString = "%d.%m.%Y"; /* "07.12.95" for example */ NSShortMonthNameArray = (Ocak, Åžubat, Mart, Nisan, Mayıs, Haziran, Temmuz, AÄŸustos, Eylül, Ekim, Kasım, Aralık); NSShortTimeDateFormatString = "%d.%b.%Y %H:%M"; /* "07. Dez. 95 16:50 " for example */ NSShortWeekDayNameArray = (Paz, Pzt, Sal, Çar, PerÅŸ, Cum, Cts.); NSThisDayDesignations = (Bugün); NSThousandsSeparator = "."; NSTimeDateFormatString = "%a %b %d %Y %H:%M:%S %Z"; NSTimeFormatString = "%H:%M:%S"; NSWeekDayNameArray = (Pazar, Pazartesi, Salı, ÇarÅŸamba, PerÅŸembe, Cuma, Cumartesi); NSYearMonthWeekDesignations = (Yıl, Ay, Hafta); NSPositiveCurrencyFormatString = "TRY9,999.00"; NSNegativeCurrencyFormatString = "TRY-9,999.00"; } gnustep-base-1.29.0/Resources/Languages/Ukrainian000066400000000000000000000060321435650067400217370ustar00rootroot00000000000000/* Ukrainian */ { NSLanguageName = "Ukrainian"; NSLanguageCode = UA; NSFormalName = "Ukrainian"; NSCurrencySymbol = "\U0433\U0440\U043d."; NSPositiveCurrencyFormatString = "9 999,00 \U0433\U0440\U043d."; NSNegativeCurrencyFormatString = "-9 999,00 \U0433\U0440\U043d."; NSInternationalCurrencyString = "UAH"; NSDecimalDigits = ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); NSDecimalSeparator = ","; NSThousandsSeparator = " "; NSAMPMDesignation = (AM, PM); NSDateFormatString = "%A, %d %B, %Y"; NSDateTimeOrdering = DMYH; NSEarlierTimeDesignations = ("\U043f\U043e\U043f\U0435\U0440\U0435\U0434\U043d\U0456\U0439", "\U043c\U0438\U043d\U0443\U043b\U0438\U0439", "\U043c\U0438\U043d\U0443\U043b\U0438\U0439", "\U0442\U043e\U043c\U0443"); NSHourNameDesignations = ((0, "\U043f\U043e\U043b\U0443\U043d\U0456\U0447"), (12, "\U043f\U043e\U043b\U0443\U0434\U0435\U043d\U044c"), (10, "\U0440\U0430\U043d\U043e\U043a"), (14, "\U043e\U0431\U0456\U0434"), (19, "\U0432\U0435\U0447\U0456\U0440")); NSLaterTimeDesignations = ("\U043d\U0430\U0441\U0442\U0443\U043f\U043d\U0438\U0439"); NSMonthNameArray = ("\U0421\U0456\U0447\U0435\U043d\U044c", "\U041b\U044e\U0442\U0438\U0439", "\U0411\U0435\U0440\U0435\U0437\U0435\U043d\U044c", "\U041a\U0432\U0456\U0442\U0435\U043d\U044c", "\U0422\U0440\U0430\U0432\U0435\U043d\U044c", "\U0427\U0435\U0440\U0432\U0435\U043d\U044c", "\U041b\U0438\U043f\U0435\U043d\U044c", "\U0421\U0435\U0440\U043f\U0435\U043d\U044c", "\U0412\U0435\U0440\U0435\U0441\U0435\U043d\U044c", "\U0416\U043e\U0432\U0442\U0435\U043d\U044c", "\U041b\U0438\U0441\U0442\U043e\U043f\U0430\U0434", "\U0413\U0440\U0443\U0434\U0435\U043d\U044c"); NSNextDayDesignations = ("\U0437\U0430\U0432\U0442\U0440\U0430"); NSNextNextDayDesignations = ("\U043f\U0456\U0441\U043b\U044f\U0437\U0430\U0432\U0442\U0440\U0430"); NSPriorDayDesignations = ("\U0432\U0447\U043e\U0440\U0430"); NSShortDateFormatString = "%d/%m/%Y"; NSShortMonthNameArray = ("\U0421\U0456\U0447", "\U041b\U044e\U0442", "\U0411\U0435\U0440", "\U041a\U0432\U0456", "\U0422\U0440\U0430", "\U0427\U0435\U0440", "\U041b\U0438\U043f", "\U0421\U0435\U0440", "\U0412\U0435\U0440", "\U0416\U043e\U0432", "\U041b\U0438\U0441", "\U0413\U0440\U0443"); NSShortTimeDateFormatString = "%d %b, %Y %H:%M"; NSShortWeekDayNameArray = ("\U041d\U0434", "\U041f\U043d", "\U0412\U0442", "\U0421\U0440", "\U0427\U0442", "\U041f\U0442", "\U0421\U0431"); NSThisDayDesignations = ("\U0441\U044c\U043e\U0433\U043e\U0434\U043d\U0456"); NSTimeDateFormatString = "%a %d %b %H:%M:%S %z %Y"; NSTimeFormatString = "%H:%M:%S"; NSWeekDayNameArray = ("\U041d\U0435\U0434\U0456\U043b\U044f", "\U041f\U043e\U043d\U0435\U0434\U0456\U043b\U043e\U043a", "\U0412\U0456\U0432\U0442\U043e\U0440\U043e\U043a", "\U0421\U0435\U0440\U0435\U0434\U0430", "\U0427\U0435\U0442\U0432\U0435\U0440", "\U041f'\U044f\U0442\U043d\U0438\U0446\U044f", "\U0421\U0443\U0431\U043e\U0442\U0430"); NSYearMonthWeekDesignations = ("\U0440\U0456\U043a", "\U043c\U0456\U0441\U044f\U0446\U044c", "\U0442\U0438\U0436\U0434\U0435\U043d\U044c"); } gnustep-base-1.29.0/Resources/Polish.lproj/000077500000000000000000000000001435650067400205475ustar00rootroot00000000000000gnustep-base-1.29.0/Resources/Polish.lproj/Localizable.strings000066400000000000000000000204371435650067400244110ustar00rootroot00000000000000/* Polish string encodings */ GSUndefinedEncoding = "Nieznany"; NSProprietaryStringEncoding = "Specyficzne instalacji"; NSASCIIStringEncoding = "Zachodni (ASCII)"; NSNEXTSTEPStringEncoding = "Zachodni (NextStep)"; NSJapaneseEUCStringEncoding = "JapoÅ„ski (EUC)"; NSUTF8StringEncoding = "Unicode (UTF-8)"; NSISOLatin1StringEncoding = "Zachodni (ISO Latin 1)"; NSSymbolStringEncoding = "Symbol (Mac OS)"; NSNonLossyASCIIStringEncoding = "Non-lossy ASCII"; NSShiftJISStringEncoding = "JapoÅ„ski (Windows, DOS)"; NSISOLatin2StringEncoding = "Åšrodkowoeuropejski (ISO Latin 2)"; NSUnicodeStringEncoding = "Unicode (UTF-16)"; NSWindowsCP1251StringEncoding = "Cyrylicki (Windows)"; NSWindowsCP1252StringEncoding = "Zachodni (Windows Latin 1)"; NSWindowsCP1253StringEncoding = "Grecki (Windows)"; NSWindowsCP1254StringEncoding = "Turecki (Windows Latin 5)"; NSWindowsCP1250StringEncoding = "Åšrodkowoeuropejski (Windows Latin 2)"; NSISO2022JPStringEncoding = "JapoÅ„ski (ISO 2022-JP)"; NSMacOSRomanStringEncoding = "Zachodni (Mac OS Roman)"; NSUTF16BigEndianStringEncoding = "Unicode (UTF-16BE)"; NSUTF16LittleEndianStringEncoding = "Unicode (UTF-16LE)"; NSUTF32StringEncoding = "Unicode (UTF-32)"; NSUTF32BigEndianStringEncoding = "Unicode (UTF-32BE)"; NSUTF32LittleEndianStringEncoding = "Unicode (UTF-32LE)"; NSMacOSJapaneseStringEncoding = "JapoÅ„ski (Mac OS)"; NSMacOSTraditionalChineseStringEncoding = "ChiÅ„ski tradycyjny (Mac OS)"; NSMacOSKoreanStringEncoding = "KoreaÅ„ski (Mac OS)"; NSMacOSArabicStringEncoding = "Arabski (Mac OS)"; NSMacOSHebrewStringEncoding = "Hebrajski (Mac OS)"; NSMacOSGreekStringEncoding = "Grecki (Mac OS)"; NSMacOSCyrillicStringEncoding = "Cyrylicki (Mac OS)"; NSMacOSDevanagariStringEncoding = "Devanagari (Mac OS)"; NSMacOSGurmukhiStringEncoding = "Gurmukhi (Mac OS)"; NSMacOSGujaratiStringEncoding = "Gudźaracki (Mac OS)"; NSMacOSOriyaStringEncoding = "Oriya (Mac OS)"; NSMacOSBengaliStringEncoding = "Bengali (Mac OS)"; NSMacOSTamilStringEncoding = "Tamil (Mac OS)"; NSMacOSTeluguStringEncoding = "Telugu (Mac OS)"; NSMacOSKannadaStringEncoding = "Kannada (Mac OS)"; NSMacOSMalayalamStringEncoding = "Malayalam (Mac OS)"; NSMacOSSinhaleseStringEncoding = "Sinhalese (Mac OS)"; NSMacOSBurmeseStringEncoding = "Burmese (Mac OS)"; NSMacOSKhmerStringEncoding = "Khmer (Mac OS)"; NSMacOSThaiStringEncoding = "Tajski (Mac OS)"; NSMacOSLaotianStringEncoding = "Laotian (Mac OS)"; NSMacOSGeorgianStringEncoding = "Georgian (Mac OS)"; NSMacOSArmenianStringEncoding = "Armenian (Mac OS)"; NSMacOSSimplifiedChineseStringEncoding = "ChiÅ„ski uproszczony (Mac OS)"; NSMacOSTibetanStringEncoding = "TybetaÅ„ski (Mac OS)"; NSMacOSMongolianStringEncoding = "Mongolian (Mac OS)"; NSMacOSEthiopicStringEncoding = "Ethiopic (Mac OS)"; NSMacOSCentralEuropeanRomanStringEncoding = "Åšrodkowoeuropejski (Mac OS)"; NSMacOSVietnameseStringEncoding = "Vietnamese (Mac OS)"; NSMacOSSymbolStringEncoding = "Symbol (Mac OS)"; NSMacOSDingbatsStringEncoding = "Dingbaty (Mac OS)"; NSMacOSTurkishStringEncoding = "Turecki (Mac OS)"; NSMacOSCroatianStringEncoding = "Chorwacki (Mac OS)"; NSMacOSIcelandicStringEncoding = "Islandzki (Mac OS)"; NSMacOSRomanianStringEncoding = "RumuÅ„ski (Mac OS)"; NSMacOSCelticStringEncoding = "Celtycki (Mac OS)"; NSMacOSGaelicStringEncoding = "Gaelicki (Mac OS)"; NSMacOSKeyboardSymbolsStringEncoding = "Symbole klawiaturowe (Mac OS)"; NSMacOSFarsiStringEncoding = "Perski (Mac OS)"; NSMacOSUkrainianStringEncoding = "Cyrylicki (Mac OS ukraiÅ„ski)"; NSMacOSInuitStringEncoding = "Inuit (Mac OS)"; NSMacVT100StringEncoding = "Western (Mac VT100)"; NSMacHFSStringEncoding = "Zachodni (Mac OS Roman)"; NSUTF7StringEncoding = "Unicode (UTF-7)"; NSISOLatin3StringEncoding = "Zachodni (ISO Latin 3)"; NSISOLatin4StringEncoding = "Åšrodkowoeuropejski (ISO Latin 4)"; NSISOCyrillicStringEncoding = "Cyrylicki (ISO 8859-5)"; NSISOArabicStringEncoding = "Arabski (ISO 8859-6)"; NSISOGreekStringEncoding = "Grecki (ISO 8859-7)"; NSISOHebrewStringEncoding = "Hebrajski (ISO 8859-8)"; NSISOLatin5StringEncoding = "Turecki (ISO Latin 5)"; NSISOLatin6StringEncoding = "Nordycki (ISO Latin 6)"; NSISOThaiStringEncoding = "Tajski (ISO 8859-11)"; NSISOLatin7StringEncoding = "BaÅ‚tycki (ISO Latin 7)"; NSISOLatin8StringEncoding = "Celtycki (ISO Latin 8)"; NSISOLatin9StringEncoding = "Zachodni (ISO Latin 9)"; NSISOLatin10StringEncoding = "RumuÅ„ski (ISO Latin 10)"; NSDOSLatinUSStringEncoding = "Latin-US (DOS)"; NSDOSGreekStringEncoding = "Grecki (DOS)"; NSDOSBalticRimStringEncoding = "BaÅ‚tycki (DOS)"; NSDOSLatin1StringEncoding = "Zachodni (DOS Latin 1)"; NSDOSGreek1StringEncoding = "Grecki (DOS Grecki 1)"; NSDOSLatin2StringEncoding = "Åšrodkowoeuropejski (DOS Latin 2)"; NSDOSCyrillicStringEncoding = "Cyrylicki (DOS)"; NSDOSTurkishStringEncoding = "Turecki (DOS)"; NSDOICortugueseStringEncoding = "Portugalski (DOS)"; NSDOSIcelandicStringEncoding = "Islandzki (DOS)"; NSDOSHebrewStringEncoding = "Hebrajski (DOS)"; NSDOSCanadianFrenchStringEncoding = "Kanadyjski francuski (DOS)"; NSDOSArabicStringEncoding = "Arabski (DOS)"; NSDOSNordicStringEncoding = "Nordycki (DOS)"; NSDOSRussianStringEncoding = "Rosyjski (DOS)"; NSDOSGreek2StringEncoding = "Grecki (DOS Grecki 2)"; NSDOSThaiStringEncoding = "Tajski (Windows, DOS)"; NSDOSJapaneseStringEncoding = "JapoÅ„ski (Windows, DOS)"; NSDOSChineseSimplifStringEncoding = "ChiÅ„ski uproszczony (Windows, DOS)"; NSDOSKoreanStringEncoding = "KoreaÅ„ski (Windows, DOS)"; NSDOSChineseTradStringEncoding = "ChiÅ„ski tradycyjny (Windows, DOS)"; NSWindowsLatin1StringEncoding = "Zachodni (Windows Latin 1)"; NSWindowsLatin2StringEncoding = "Åšrodkowoeuropejski (Windows Latin 2)"; NSWindowsCyrillicStringEncoding = "Cyrylicki (Windows)"; NSWindowsGreekStringEncoding = "Grecki (Windows)"; NSWindowsLatin5StringEncoding = "Turecki (Windows Latin 5)"; NSWindowsHebrewStringEncoding = "Hebrajski (Windows)"; NSWindowsArabicStringEncoding = "Arabski (Windows)"; NSWindowsBalticRimStringEncoding = "BaÅ‚tycki (Windows)"; NSWindowsVietnameseStringEncoding = "Wietnamski (Windows)"; NSWindowsKoreanJohabStringEncoding = "Korean (Windows Johab)"; NSJIS_X0208_90StringEncoding = "Japanese (JIS X0208)"; NSShiftJIS_X0213StringEncoding = "JapoÅ„ski (Shift JIS X0213)"; NSGB_2312_80StringEncoding = "ChiÅ„ski uproszczony (GB 2312)"; NSGBK_95StringEncoding = "ChiÅ„ski (GBK)"; NSGB_18030_2000StringEncoding = "ChiÅ„ski (GB 18030)"; NSKSC_5601_87StringEncoding = "Korean (KSC 5601-1987)"; NSISO2022JapaneseStringEncoding = "JapoÅ„ski (ISO 2022-JP)"; NSISO2022Japanese2StringEncoding = "JapoÅ„ski (ISO 2022-JP-2)"; NSISO2022Japanese1StringEncoding = "JapoÅ„ski (ISO 2022-JP-1)"; NSISO2022Japanese3StringEncoding = "Japanese (ISO 2022-JP-3)"; NSISO2022ChineseStringEncoding = "ChiÅ„ski (ISO 2022-CN)"; NSISO2022ExtendedChineseStringEncoding = "Chinese (ISO 2022-CN-EXT)"; NSISO2022KoreanStringEncoding = "KoreaÅ„ski (ISO 2022-KR)"; NSEUCJapaneseStringEncoding = "JapoÅ„ski (EUC)"; NSEUCChineseStringEncoding = "ChiÅ„ski uproszczony (GB 2312)"; NSEUCTaiwanChineseStringEncoding = "ChiÅ„ski tradycyjny (EUC)"; NSEUCKoreanStringEncoding = "KoreaÅ„ski (EUC)"; NSChineseEUCStringEncoding = "ChiÅ„ski uproszczony (GB 2312)"; NSTaiwanChineseEUCStringEncoding = "ChiÅ„ski tradycyjny (EUC)"; NSKoreanEUCStringEncoding = "KoreaÅ„ski (EUC)"; NSKOI8RStringEncoding = "Cyrylicki (KOI8-R)"; NSBig5StringEncoding = "ChiÅ„ski tradycyjny (Big 5)"; NSMacRomanLatin1StringEncoding = "Zachodni (Mac Mail)"; NSHZ_GB_2312StringEncoding = "ChiÅ„ski uproszczony (HZ GB 2312)"; NSBig5_HKSCS_1999StringEncoding = "ChiÅ„ski tradycyjny (Big 5 HKSCS)"; NSKOI8UStringEncoding = "UkraiÅ„ski (KOI8-U)"; NSBig5EStringEncoding = "ChiÅ„ski tradycyjny (Big 5-E)"; NSNextStepLatinStringEncoding = "Zachodni (NextStep)"; NSNextStepJapaneseStringEncoding = "Japanese (NextStep)"; NSEBCDICUSStringEncoding = "Zachodni (EBCDIC Latin Core)"; NSEBCDICCP037StringEncoding = "Zachodni (EBCDIC Latin 1)"; gnustep-base-1.29.0/Resources/SimplifiedChinese.lproj/000077500000000000000000000000001435650067400226755ustar00rootroot00000000000000gnustep-base-1.29.0/Resources/SimplifiedChinese.lproj/Localizable.strings000066400000000000000000000201621435650067400265320ustar00rootroot00000000000000/* Simplified Chinese string encodings */ GSUndefinedEncoding = "未知"; NSProprietaryStringEncoding = "内置"; NSASCIIStringEncoding = "西文(ASCII)"; NSNEXTSTEPStringEncoding = "西文(NextStep)"; NSJapaneseEUCStringEncoding = "日文(EUC)"; NSUTF8StringEncoding = "Unicode (UTF-8)"; NSISOLatin1StringEncoding = "西文(ISO Latin 1)"; NSSymbolStringEncoding = "符å·(Mac OS)"; NSNonLossyASCIIStringEncoding = "æ— æŸASCII"; NSShiftJISStringEncoding = "日文(Windows, DOS)"; NSISOLatin2StringEncoding = "中欧语系(ISO Latin 2)"; NSUnicodeStringEncoding = "Unicode (UTF-16)"; NSWindowsCP1251StringEncoding = "西里尔文(Windows)"; NSWindowsCP1252StringEncoding = "西文(Windows Latin 1)"; NSWindowsCP1253StringEncoding = "希腊文(Windows)"; NSWindowsCP1254StringEncoding = "土耳其文(Windows Latin 5)"; NSWindowsCP1250StringEncoding = "中欧语系(Windows Latin 2)"; NSISO2022JPStringEncoding = "日文(ISO 2022-JP)"; NSMacOSRomanStringEncoding = "西文(Mac OS Roman)"; NSUTF16BigEndianStringEncoding = "Unicode (UTF-16BE)"; NSUTF16LittleEndianStringEncoding = "Unicode (UTF-16LE)"; NSUTF32StringEncoding = "Unicode (UTF-32)"; NSUTF32BigEndianStringEncoding = "Unicode (UTF-32BE)"; NSUTF32LittleEndianStringEncoding = "Unicode (UTF-32LE)"; NSMacOSJapaneseStringEncoding = "日文(Mac OS)"; NSMacOSTraditionalChineseStringEncoding = "ç¹ä½“中文(Mac OS)"; NSMacOSKoreanStringEncoding = "韩文(Mac OS)"; NSMacOSArabicStringEncoding = "阿拉伯文(Mac OS)"; NSMacOSHebrewStringEncoding = "å¸Œä¼¯æ¥æ–‡(Mac OS)"; NSMacOSGreekStringEncoding = "希腊文(Mac OS)"; NSMacOSCyrillicStringEncoding = "西里尔文(Mac OS)"; NSMacOSDevanagariStringEncoding = "天城文(Mac OS)"; NSMacOSGurmukhiStringEncoding = "夿œ¨åŸºæ–‡(Mac OS)"; NSMacOSGujaratiStringEncoding = "å¤å‰æ‹‰ç‰¹æ–‡(Mac OS)"; NSMacOSOriyaStringEncoding = "Oriya (Mac OS)"; NSMacOSBengaliStringEncoding = "Bengali (Mac OS)"; NSMacOSTamilStringEncoding = "Tamil (Mac OS)"; NSMacOSTeluguStringEncoding = "Telugu (Mac OS)"; NSMacOSKannadaStringEncoding = "Kannada (Mac OS)"; NSMacOSMalayalamStringEncoding = "Malayalam (Mac OS)"; NSMacOSSinhaleseStringEncoding = "Sinhalese (Mac OS)"; NSMacOSBurmeseStringEncoding = "Burmese (Mac OS)"; NSMacOSKhmerStringEncoding = "Khmer (Mac OS)"; NSMacOSThaiStringEncoding = "æ³°æ–‡(Mac OS)"; NSMacOSLaotianStringEncoding = "Laotian (Mac OS)"; NSMacOSGeorgianStringEncoding = "Georgian (Mac OS)"; NSMacOSArmenianStringEncoding = "Armenian (Mac OS)"; NSMacOSSimplifiedChineseStringEncoding = "简体中文(Mac OS)"; NSMacOSTibetanStringEncoding = "è—æ–‡(Mac OS)"; NSMacOSMongolianStringEncoding = "Mongolian (Mac OS)"; NSMacOSEthiopicStringEncoding = "Ethiopic (Mac OS)"; NSMacOSCentralEuropeanRomanStringEncoding = "中欧语系(Mac OS)"; NSMacOSVietnameseStringEncoding = "Vietnamese (Mac OS)"; NSMacOSSymbolStringEncoding = "符å·(Mac OS)"; NSMacOSDingbatsStringEncoding = "花饰(Mac OS)"; NSMacOSTurkishStringEncoding = "土耳其文(Mac OS)"; NSMacOSCroatianStringEncoding = "克罗地亚文(Mac OS)"; NSMacOSIcelandicStringEncoding = "冰岛文(Mac OS)"; NSMacOSRomanianStringEncoding = "罗马尼亚文(Mac OS)"; NSMacOSCelticStringEncoding = "凯尔特文(Mac OS)"; NSMacOSGaelicStringEncoding = "盖尔文(Mac OS)"; NSMacOSKeyboardSymbolsStringEncoding = "键盘符å·(Mac OS)"; NSMacOSFarsiStringEncoding = "波斯文(Mac OS)"; NSMacOSUkrainianStringEncoding = "西里尔文(Mac OS Ukrainian)"; NSMacOSInuitStringEncoding = "因纽特文(Mac OS)"; NSMacVT100StringEncoding = "Western (Mac VT100)"; NSMacHFSStringEncoding = "西文(Mac OS Roman)"; NSUTF7StringEncoding = "Unicode (UTF-7)"; NSISOLatin3StringEncoding = "西文(ISO Latin 3)"; NSISOLatin4StringEncoding = "中欧语系(ISO Latin 4)"; NSISOCyrillicStringEncoding = "西里尔文(ISO 8859-5)"; NSISOArabicStringEncoding = "阿拉伯文(ISO 8859-6)"; NSISOGreekStringEncoding = "希腊文(ISO 8859-7)"; NSISOHebrewStringEncoding = "å¸Œä¼¯æ¥æ–‡(ISO 8859-8)"; NSISOLatin5StringEncoding = "土耳其文(ISO Latin 5)"; NSISOLatin6StringEncoding = "北日耳曼语支(ISO Latin 6)"; NSISOThaiStringEncoding = "æ³°æ–‡(ISO 8859-11)"; NSISOLatin7StringEncoding = "波罗的海文(ISO Latin 7)"; NSISOLatin8StringEncoding = "凯尔特文(ISO Latin 8)"; NSISOLatin9StringEncoding = "西文(ISO Latin 9)"; NSISOLatin10StringEncoding = "罗马尼亚文(ISO Latin 10)"; NSDOSLatinUSStringEncoding = "ç¾Žå›½æ‹‰ä¸æ–‡(DOS)"; NSDOSGreekStringEncoding = "希腊文(DOS)"; NSDOSBalticRimStringEncoding = "波罗的海文(DOS)"; NSDOSLatin1StringEncoding = "西文(DOS Latin 1)"; NSDOSGreek1StringEncoding = "希腊文(DOS Greek 1)"; NSDOSLatin2StringEncoding = "中欧语系(DOS Latin 2)"; NSDOSCyrillicStringEncoding = "西里尔文(DOS)"; NSDOSTurkishStringEncoding = "土耳其文(DOS)"; NSDOICortugueseStringEncoding = "è‘¡è„牙文(DOS)"; NSDOSIcelandicStringEncoding = "冰岛文(DOS)"; NSDOSHebrewStringEncoding = "å¸Œä¼¯æ¥æ–‡(DOS)"; NSDOSCanadianFrenchStringEncoding = "加拿大法文(DOS)"; NSDOSArabicStringEncoding = "阿拉伯文(DOS)"; NSDOSNordicStringEncoding = "北日耳曼语支(DOS)"; NSDOSRussianStringEncoding = "ä¿„æ–‡(DOS)"; NSDOSGreek2StringEncoding = "希腊文(DOS Greek 2)"; NSDOSThaiStringEncoding = "æ³°æ–‡(Windows, DOS)"; NSDOSJapaneseStringEncoding = "日文(Windows, DOS)"; NSDOSChineseSimplifStringEncoding = "简体中文(Windows, DOS)"; NSDOSKoreanStringEncoding = "韩文(Windows, DOS)"; NSDOSChineseTradStringEncoding = "ç¹ä½“中文(Windows, DOS)"; NSWindowsLatin1StringEncoding = "西文(Windows Latin 1)"; NSWindowsLatin2StringEncoding = "中欧语系(Windows Latin 2)"; NSWindowsCyrillicStringEncoding = "西里尔文(Windows)"; NSWindowsGreekStringEncoding = "希腊文(Windows)"; NSWindowsLatin5StringEncoding = "土耳其文(Windows Latin 5)"; NSWindowsHebrewStringEncoding = "å¸Œä¼¯æ¥æ–‡(Windows)"; NSWindowsArabicStringEncoding = "阿拉伯文(Windows)"; NSWindowsBalticRimStringEncoding = "波罗的海文(Windows)"; NSWindowsVietnameseStringEncoding = "è¶Šå—æ–‡(Windows)"; NSWindowsKoreanJohabStringEncoding = "Korean (Windows Johab)"; NSJIS_X0208_90StringEncoding = "Japanese (JIS X0208)"; NSShiftJIS_X0213StringEncoding = "日文(Shift JIS X0213)"; NSGB_2312_80StringEncoding = "简体中文(GB 2312)"; NSGBK_95StringEncoding = "中文(GBK)"; NSGB_18030_2000StringEncoding = "中文(GB 18030)"; NSKSC_5601_87StringEncoding = "Korean (KSC 5601-1987)"; NSISO2022JapaneseStringEncoding = "日文(ISO 2022-JP)"; NSISO2022Japanese2StringEncoding = "日文(ISO 2022-JP-2)"; NSISO2022Japanese1StringEncoding = "日文(ISO 2022-JP-1)"; NSISO2022Japanese3StringEncoding = "Japanese (ISO 2022-JP-3)"; NSISO2022ChineseStringEncoding = "中文(ISO 2022-CN)"; NSISO2022ExtendedChineseStringEncoding = "Chinese (ISO 2022-CN-EXT)"; NSISO2022KoreanStringEncoding = "韩文(ISO 2022-KR)"; NSEUCJapaneseStringEncoding = "日文(EUC)"; NSEUCChineseStringEncoding = "简体中文(GB 2312)"; NSEUCTaiwanChineseStringEncoding = "ç¹ä½“中文(EUC)"; NSEUCKoreanStringEncoding = "韩文(EUC)"; NSChineseEUCStringEncoding = "简体中文(GB 2312)"; NSTaiwanChineseEUCStringEncoding = "ç¹ä½“中文(EUC)"; NSKoreanEUCStringEncoding = "韩文(EUC)"; NSKOI8RStringEncoding = "西里尔文(KOI8-R)"; NSBig5StringEncoding = "ç¹ä½“中文(Big 5)"; NSMacRomanLatin1StringEncoding = "西文(Mac邮件)"; NSHZ_GB_2312StringEncoding = "简体中文(HZ GB 2312)"; NSBig5_HKSCS_1999StringEncoding = "ç¹ä½“中文(Big 5 HKSCS)"; NSKOI8UStringEncoding = "乌克兰文(KOI8-U)"; NSBig5EStringEncoding = "ç¹ä½“中文(Big 5-E)"; NSNextStepLatinStringEncoding = "西文(NextStep)"; NSNextStepJapaneseStringEncoding = "Japanese (NextStep)"; NSEBCDICUSStringEncoding = "西文(EBCDIC Latin Core)"; NSEBCDICCP037StringEncoding = "西文(EBCDIC Latin 1)"; gnustep-base-1.29.0/Resources/Spanish.lproj/000077500000000000000000000000001435650067400207165ustar00rootroot00000000000000gnustep-base-1.29.0/Resources/Spanish.lproj/Localizable.strings000066400000000000000000000207631435650067400245620ustar00rootroot00000000000000/* Spanish string encodings */ GSUndefinedEncoding = "Desconocido"; NSProprietaryStringEncoding = "Propietario"; NSASCIIStringEncoding = "Occidental (ASCII)"; NSNEXTSTEPStringEncoding = "Occidental (NextStep)"; NSJapaneseEUCStringEncoding = "Japonés (EUC)"; NSUTF8StringEncoding = "Unicode (UTF-8)"; NSISOLatin1StringEncoding = "Occidental (ISO latino 1)"; NSSymbolStringEncoding = "Symbol (Mac OS)"; NSNonLossyASCIIStringEncoding = "ASCII sin reducción"; NSShiftJISStringEncoding = "Japonés (Windows, DOS)"; NSISOLatin2StringEncoding = "Centroeuropeo (ISO latino 2)"; NSUnicodeStringEncoding = "Unicode (UTF-16)"; NSWindowsCP1251StringEncoding = "Cirílico (Windows)"; NSWindowsCP1252StringEncoding = "Occidental (Windows latino 1)"; NSWindowsCP1253StringEncoding = "Griego (Windows)"; NSWindowsCP1254StringEncoding = "Turco (Windows latino 5)"; NSWindowsCP1250StringEncoding = "Centroeuropeo (Windows latino 2)"; NSISO2022JPStringEncoding = "Japonés (ISO 2022-JP)"; NSMacOSRomanStringEncoding = "Occidental (Mac OS Roman)"; NSUTF16BigEndianStringEncoding = "Unicode (UTF-16BE)"; NSUTF16LittleEndianStringEncoding = "Unicode (UTF-16LE)"; NSUTF32StringEncoding = "Unicode (UTF-32)"; NSUTF32BigEndianStringEncoding = "Unicode (UTF-32BE)"; NSUTF32LittleEndianStringEncoding = "Unicode (UTF-32LE)"; NSMacOSJapaneseStringEncoding = "Japonés (Mac OS)"; NSMacOSTraditionalChineseStringEncoding = "Chino tradicional (Mac OS)"; NSMacOSKoreanStringEncoding = "Coreano (Mac OS)"; NSMacOSArabicStringEncoding = "Ãrabe (Mac OS)"; NSMacOSHebrewStringEncoding = "Hebreo (Mac OS)"; NSMacOSGreekStringEncoding = "Griego (Mac OS)"; NSMacOSCyrillicStringEncoding = "Cirílico (Mac OS)"; NSMacOSDevanagariStringEncoding = "Devanagari (Mac OS)"; NSMacOSGurmukhiStringEncoding = "Gurmuji (Mac OS)"; NSMacOSGujaratiStringEncoding = "Guyaratí (Mac OS)"; NSMacOSOriyaStringEncoding = "Oriya (Mac OS)"; NSMacOSBengaliStringEncoding = "Bengali (Mac OS)"; NSMacOSTamilStringEncoding = "Tamil (Mac OS)"; NSMacOSTeluguStringEncoding = "Telugu (Mac OS)"; NSMacOSKannadaStringEncoding = "Kannada (Mac OS)"; NSMacOSMalayalamStringEncoding = "Malayalam (Mac OS)"; NSMacOSSinhaleseStringEncoding = "Sinhalese (Mac OS)"; NSMacOSBurmeseStringEncoding = "Burmese (Mac OS)"; NSMacOSKhmerStringEncoding = "Khmer (Mac OS)"; NSMacOSThaiStringEncoding = "Tailandés (Mac OS)"; NSMacOSLaotianStringEncoding = "Laotian (Mac OS)"; NSMacOSGeorgianStringEncoding = "Georgian (Mac OS)"; NSMacOSArmenianStringEncoding = "Armenian (Mac OS)"; NSMacOSSimplifiedChineseStringEncoding = "Chino simplificado (Mac OS)"; NSMacOSTibetanStringEncoding = "Tibetano (Mac OS)"; NSMacOSMongolianStringEncoding = "Mongolian (Mac OS)"; NSMacOSEthiopicStringEncoding = "Ethiopic (Mac OS)"; NSMacOSCentralEuropeanRomanStringEncoding = "Centroeuropeo (Mac OS)"; NSMacOSVietnameseStringEncoding = "Vietnamese (Mac OS)"; NSMacOSSymbolStringEncoding = "Symbol (Mac OS)"; NSMacOSDingbatsStringEncoding = "Dingbats (Mac OS)"; NSMacOSTurkishStringEncoding = "Turco (Mac OS)"; NSMacOSCroatianStringEncoding = "Croata (Mac OS)"; NSMacOSIcelandicStringEncoding = "Islandés (Mac OS)"; NSMacOSRomanianStringEncoding = "Rumano (Mac OS)"; NSMacOSCelticStringEncoding = "Céltico (Mac OS)"; NSMacOSGaelicStringEncoding = "Gaélico (Mac OS)"; NSMacOSKeyboardSymbolsStringEncoding = "Símbolos del teclado (Mac OS)"; NSMacOSFarsiStringEncoding = "Farsi (Mac OS)"; NSMacOSUkrainianStringEncoding = "Cirílico (Mac OS ucraniano)"; NSMacOSInuitStringEncoding = "Esquimal (Mac OS)"; NSMacVT100StringEncoding = "Western (Mac VT100)"; NSMacHFSStringEncoding = "Occidental (Mac OS Roman)"; NSUTF7StringEncoding = "Unicode (UTF-7)"; NSISOLatin3StringEncoding = "Occidental (ISO latino 3)"; NSISOLatin4StringEncoding = "Centroeuropeo (ISO latino 4)"; NSISOCyrillicStringEncoding = "Cirílico (ISO 8859-5)"; NSISOArabicStringEncoding = "Ãrabe (ISO 8859-6)"; NSISOGreekStringEncoding = "Griego (ISO 8859-7)"; NSISOHebrewStringEncoding = "Hebreo (ISO 8859-8)"; NSISOLatin5StringEncoding = "Turco (ISO latino 5)"; NSISOLatin6StringEncoding = "Nórdico (ISO latino 6)"; NSISOThaiStringEncoding = "Tailandés (ISO 8859-11)"; NSISOLatin7StringEncoding = "Báltico (ISO latino 7)"; NSISOLatin8StringEncoding = "Celta (ISO latino 8)"; NSISOLatin9StringEncoding = "Occidental (ISO latino 9)"; NSISOLatin10StringEncoding = "Rumano (ISO latino 10)"; NSDOSLatinUSStringEncoding = "Latino-EE.UU. (DOS)"; NSDOSGreekStringEncoding = "Griego (DOS)"; NSDOSBalticRimStringEncoding = "Báltico (DOS)"; NSDOSLatin1StringEncoding = "Occidental (DOS latino 1)"; NSDOSGreek1StringEncoding = "Griego (Griego 1 DOS)"; NSDOSLatin2StringEncoding = "Centroeuropeo (DOS latino 2)"; NSDOSCyrillicStringEncoding = "Cirílico (DOS)"; NSDOSTurkishStringEncoding = "Turco (DOS)"; NSDOICortugueseStringEncoding = "Portugués (DOS)"; NSDOSIcelandicStringEncoding = "Islandés (DOS)"; NSDOSHebrewStringEncoding = "Hebreo (DOS)"; NSDOSCanadianFrenchStringEncoding = "Francés canadiense (DOS)"; NSDOSArabicStringEncoding = "Ãrabe (DOS)"; NSDOSNordicStringEncoding = "Nórdico (DOS)"; NSDOSRussianStringEncoding = "Ruso (DOS)"; NSDOSGreek2StringEncoding = "Griego (Griego 2 DOS)"; NSDOSThaiStringEncoding = "Tailandés (Windows, DOS)"; NSDOSJapaneseStringEncoding = "Japonés (Windows, DOS)"; NSDOSChineseSimplifStringEncoding = "Chino simplificado (Windows, DOS)"; NSDOSKoreanStringEncoding = "Coreano (Windows, DOS)"; NSDOSChineseTradStringEncoding = "Chino tradicional (Windows, DOS)"; NSWindowsLatin1StringEncoding = "Occidental (Windows latino 1)"; NSWindowsLatin2StringEncoding = "Centroeuropeo (Windows latino 2)"; NSWindowsCyrillicStringEncoding = "Cirílico (Windows)"; NSWindowsGreekStringEncoding = "Griego (Windows)"; NSWindowsLatin5StringEncoding = "Turco (Windows latino 5)"; NSWindowsHebrewStringEncoding = "Hebreo (Windows)"; NSWindowsArabicStringEncoding = "Ãrabe (Windows)"; NSWindowsBalticRimStringEncoding = "Báltico (Windows)"; NSWindowsVietnameseStringEncoding = "Vietnamita (Windows)"; NSWindowsKoreanJohabStringEncoding = "Korean (Windows Johab)"; NSJIS_X0208_90StringEncoding = "Japanese (JIS X0208)"; NSShiftJIS_X0213StringEncoding = "Japonés (Shift JIS X0213)"; NSGB_2312_80StringEncoding = "Chino simplificado (GB 2312)"; NSGBK_95StringEncoding = "Chino (GBK)"; NSGB_18030_2000StringEncoding = "Chino (GB 18030)"; NSKSC_5601_87StringEncoding = "Korean (KSC 5601-1987)"; NSISO2022JapaneseStringEncoding = "Japonés (ISO 2022-JP)"; NSISO2022Japanese2StringEncoding = "Japonés (ISO 2022-JP-2)"; NSISO2022Japanese1StringEncoding = "Japonés (ISO 2022-JP-1)"; NSISO2022Japanese3StringEncoding = "Japanese (ISO 2022-JP-3)"; NSISO2022ChineseStringEncoding = "Chino (ISO 2022-CN)"; NSISO2022ExtendedChineseStringEncoding = "Chinese (ISO 2022-CN-EXT)"; NSISO2022KoreanStringEncoding = "Coreano (ISO 2022-KR)"; NSEUCJapaneseStringEncoding = "Japonés (EUC)"; NSEUCChineseStringEncoding = "Chino simplificado (GB 2312)"; NSEUCTaiwanChineseStringEncoding = "Chino tradicional (EUC)"; NSEUCKoreanStringEncoding = "Coreano (EUC)"; NSChineseEUCStringEncoding = "Chino simplificado (GB 2312)"; NSTaiwanChineseEUCStringEncoding = "Chino tradicional (EUC)"; NSKoreanEUCStringEncoding = "Coreano (EUC)"; NSKOI8RStringEncoding = "Cirílico (KOI8-R)"; NSBig5StringEncoding = "Chino tradicional (Big 5)"; NSMacRomanLatin1StringEncoding = "Occidental (Mac Mail)"; NSHZ_GB_2312StringEncoding = "Chino simplificado (HZ GB 2312)"; NSBig5_HKSCS_1999StringEncoding = "Chino tradicional (Big 5 HKSCS)"; NSKOI8UStringEncoding = "Ucraniano (KOI8-U)"; NSBig5EStringEncoding = "Chino tradicional (Big 5-E)"; NSNextStepLatinStringEncoding = "Occidental (NextStep)"; NSNextStepJapaneseStringEncoding = "Japanese (NextStep)"; NSEBCDICUSStringEncoding = "Occidental (EBCDIC latino básico)"; NSEBCDICCP037StringEncoding = "Occidental (EBCDIC latino 1)"; /* Menu items for NSUndoManager */ /* File: ../Source/NSUndoManager.m:718 */ Redo = Rehacer; /* File: ../Source/NSUndoManager.m:723 */ "Redo %@" = "Rehacer %@"; /* File: ../Source/NSUndoManager.m:999 */ Undo = Deshacer; /* File: ../Source/NSUndoManager.m:1004 */ "Undo %@" = "Deshacer %@"; gnustep-base-1.29.0/Resources/TraditionalChinese.lproj/000077500000000000000000000000001435650067400230625ustar00rootroot00000000000000gnustep-base-1.29.0/Resources/TraditionalChinese.lproj/Localizable.strings000066400000000000000000000212731435650067400267230ustar00rootroot00000000000000/* Traditional Chinese string encodings */ GSUndefinedEncoding = "未知"; NSProprietaryStringEncoding = "內建"; NSASCIIStringEncoding = "西方語系(ASCII)"; NSNEXTSTEPStringEncoding = "西方語系(NextStep)"; NSJapaneseEUCStringEncoding = "日文(EUC)"; NSUTF8StringEncoding = "Unicode(UTF-8)"; NSISOLatin1StringEncoding = "西方語系(ISO Latin 1)"; NSSymbolStringEncoding = "符號(Mac OS)"; NSNonLossyASCIIStringEncoding = "無耗æASCII"; NSShiftJISStringEncoding = "日文(Windows, DOS)"; NSISOLatin2StringEncoding = "中æ­èªžç³»ï¼ˆISO Latin 2)"; NSUnicodeStringEncoding = "Unicode(UTF-16)"; NSWindowsCP1251StringEncoding = "斯拉夫語系(Windows)"; NSWindowsCP1252StringEncoding = "西方語系(Windows Latin 1)"; NSWindowsCP1253StringEncoding = "希臘文(Windows)"; NSWindowsCP1254StringEncoding = "土耳其文(Windows Latin 5)"; NSWindowsCP1250StringEncoding = "中æ­èªžç³»ï¼ˆWindows Latin 2)"; NSISO2022JPStringEncoding = "日文(ISO 2022-JP)"; NSMacOSRomanStringEncoding = "西方語系(Mac OS Roman)"; NSUTF16BigEndianStringEncoding = "Unicode(UTF-16BE)"; NSUTF16LittleEndianStringEncoding = "Unicode(UTF-16LE)"; NSUTF32StringEncoding = "Unicode(UTF-32)"; NSUTF32BigEndianStringEncoding = "Unicode(UTF-32BE)"; NSUTF32LittleEndianStringEncoding = "Unicode(UTF-32LE)"; NSMacOSJapaneseStringEncoding = "日文(Mac OS)"; NSMacOSTraditionalChineseStringEncoding = "ç¹é«”中文(Mac OS)"; NSMacOSKoreanStringEncoding = "韓文(Mac OS)"; NSMacOSArabicStringEncoding = "阿拉伯文(Mac OS)"; NSMacOSHebrewStringEncoding = "希伯來文(Mac OS)"; NSMacOSGreekStringEncoding = "希臘文(Mac OS)"; NSMacOSCyrillicStringEncoding = "斯拉夫語系(Mac OS)"; NSMacOSDevanagariStringEncoding = "天城文(Mac OS)"; NSMacOSGurmukhiStringEncoding = "å¤çˆ¾ç©†å¥‡æ–‡ï¼ˆMac OS)"; NSMacOSGujaratiStringEncoding = "å¤å‰æ‹‰ç‰¹æ–‡ï¼ˆMac OS)"; NSMacOSOriyaStringEncoding = "Oriya (Mac OS)"; NSMacOSBengaliStringEncoding = "Bengali (Mac OS)"; NSMacOSTamilStringEncoding = "Tamil (Mac OS)"; NSMacOSTeluguStringEncoding = "Telugu (Mac OS)"; NSMacOSKannadaStringEncoding = "Kannada (Mac OS)"; NSMacOSMalayalamStringEncoding = "Malayalam (Mac OS)"; NSMacOSSinhaleseStringEncoding = "Sinhalese (Mac OS)"; NSMacOSBurmeseStringEncoding = "Burmese (Mac OS)"; NSMacOSKhmerStringEncoding = "Khmer (Mac OS)"; NSMacOSThaiStringEncoding = "泰文(Mac OS)"; NSMacOSLaotianStringEncoding = "Laotian (Mac OS)"; NSMacOSGeorgianStringEncoding = "Georgian (Mac OS)"; NSMacOSArmenianStringEncoding = "Armenian (Mac OS)"; NSMacOSSimplifiedChineseStringEncoding = "簡體中文(Mac OS)"; NSMacOSTibetanStringEncoding = "è—æ–‡ï¼ˆMac OS)"; NSMacOSMongolianStringEncoding = "Mongolian (Mac OS)"; NSMacOSEthiopicStringEncoding = "Ethiopic (Mac OS)"; NSMacOSCentralEuropeanRomanStringEncoding = "中æ­èªžç³»ï¼ˆMac OS)"; NSMacOSVietnameseStringEncoding = "Vietnamese (Mac OS)"; NSMacOSSymbolStringEncoding = "符號(Mac OS)"; NSMacOSDingbatsStringEncoding = "Dingbats(Mac OS)"; NSMacOSTurkishStringEncoding = "土耳其文(Mac OS)"; NSMacOSCroatianStringEncoding = "克羅埃西亞文(Mac OS)"; NSMacOSIcelandicStringEncoding = "冰島文(Mac OS)"; NSMacOSRomanianStringEncoding = "羅馬尼亞文(Mac OS)"; NSMacOSCelticStringEncoding = "克爾特文(Mac OS)"; NSMacOSGaelicStringEncoding = "愛爾蘭蓋爾文(Mac OS)"; NSMacOSKeyboardSymbolsStringEncoding = "éµç›¤ç¬¦è™Ÿï¼ˆMac OS)"; NSMacOSFarsiStringEncoding = "波斯文(Mac OS)"; NSMacOSUkrainianStringEncoding = "斯拉夫語系(Mac OS Ukrainian)"; NSMacOSInuitStringEncoding = "ä¼Šç´æ–‡ï¼ˆMac OS)"; NSMacVT100StringEncoding = "Western (Mac VT100)"; NSMacHFSStringEncoding = "西方語系(Mac OS Roman)"; NSUTF7StringEncoding = "Unicode(UTF-7)"; NSISOLatin3StringEncoding = "西方語系(ISO Latin 3)"; NSISOLatin4StringEncoding = "中æ­èªžç³»ï¼ˆISO Latin 4)"; NSISOCyrillicStringEncoding = "斯拉夫語系(ISO 8859-5)"; NSISOArabicStringEncoding = "阿拉伯文(ISO 8859-6)"; NSISOGreekStringEncoding = "希臘文(ISO 8859-7)"; NSISOHebrewStringEncoding = "希伯來文(ISO 8859-8)"; NSISOLatin5StringEncoding = "土耳其文(ISO Latin 5)"; NSISOLatin6StringEncoding = "北日耳曼語系(ISO Latin 6)"; NSISOThaiStringEncoding = "泰文(ISO 8859-11)"; NSISOLatin7StringEncoding = "波羅的海語系(ISO Latin 7)"; NSISOLatin8StringEncoding = "克爾特文(ISO Latin 8)"; NSISOLatin9StringEncoding = "西方語系(ISO Latin 9)"; NSISOLatin10StringEncoding = "羅馬尼亞文(ISO Latin 10)"; NSDOSLatinUSStringEncoding = "Latin-US(DOS)"; NSDOSGreekStringEncoding = "希臘文(DOS)"; NSDOSBalticRimStringEncoding = "波羅的海語系(DOS)"; NSDOSLatin1StringEncoding = "西方語系(DOS Latin 1)"; NSDOSGreek1StringEncoding = "希臘文(DOS Greek 1)"; NSDOSLatin2StringEncoding = "中æ­èªžç³»ï¼ˆDOS Latin 2)"; NSDOSCyrillicStringEncoding = "斯拉夫語系(DOS)"; NSDOSTurkishStringEncoding = "土耳其文(DOS)"; NSDOICortugueseStringEncoding = "è‘¡è„牙文(DOS)"; NSDOSIcelandicStringEncoding = "冰島文(DOS)"; NSDOSHebrewStringEncoding = "希伯來文(DOS)"; NSDOSCanadianFrenchStringEncoding = "加拿大法文(DOS)"; NSDOSArabicStringEncoding = "阿拉伯文(DOS)"; NSDOSNordicStringEncoding = "北日耳曼語系(DOS)"; NSDOSRussianStringEncoding = "俄文(DOS)"; NSDOSGreek2StringEncoding = "希臘文(DOS Greek 2)"; NSDOSThaiStringEncoding = "泰文(Windows, DOS)"; NSDOSJapaneseStringEncoding = "日文(Windows, DOS)"; NSDOSChineseSimplifStringEncoding = "簡體中文(Windows, DOS)"; NSDOSKoreanStringEncoding = "韓文(Windows, DOS)"; NSDOSChineseTradStringEncoding = "ç¹é«”中文(Windows, DOS)"; NSWindowsLatin1StringEncoding = "西方語系(Windows Latin 1)"; NSWindowsLatin2StringEncoding = "中æ­èªžç³»ï¼ˆWindows Latin 2)"; NSWindowsCyrillicStringEncoding = "斯拉夫語系(Windows)"; NSWindowsGreekStringEncoding = "希臘文(Windows)"; NSWindowsLatin5StringEncoding = "土耳其文(Windows Latin 5)"; NSWindowsHebrewStringEncoding = "希伯來文(Windows)"; NSWindowsArabicStringEncoding = "阿拉伯文(Windows)"; NSWindowsBalticRimStringEncoding = "波羅的海語系(Windows)"; NSWindowsVietnameseStringEncoding = "è¶Šå—æ–‡ï¼ˆWindows)"; NSWindowsKoreanJohabStringEncoding = "Korean (Windows Johab)"; NSJIS_X0208_90StringEncoding = "Japanese (JIS X0208)"; NSShiftJIS_X0213StringEncoding = "日文(Shift JIS X0213)"; NSGB_2312_80StringEncoding = "簡體中文(GB 2312)"; NSGBK_95StringEncoding = "中文(GBK)"; NSGB_18030_2000StringEncoding = "中文(GB 18030)"; NSKSC_5601_87StringEncoding = "Korean (KSC 5601-1987)"; NSISO2022JapaneseStringEncoding = "日文(ISO 2022-JP)"; NSISO2022Japanese2StringEncoding = "日文(ISO 2022-JP-2)"; NSISO2022Japanese1StringEncoding = "日文(ISO 2022-JP-1)"; NSISO2022Japanese3StringEncoding = "Japanese (ISO 2022-JP-3)"; NSISO2022ChineseStringEncoding = "中文(ISO 2022-CN)"; NSISO2022ExtendedChineseStringEncoding = "Chinese (ISO 2022-CN-EXT)"; NSISO2022KoreanStringEncoding = "韓文(ISO 2022-KR)"; NSEUCJapaneseStringEncoding = "日文(EUC)"; NSEUCChineseStringEncoding = "簡體中文(GB 2312)"; NSEUCTaiwanChineseStringEncoding = "ç¹é«”中文(EUC)"; NSEUCKoreanStringEncoding = "韓文(EUC)"; NSChineseEUCStringEncoding = "簡體中文(GB 2312)"; NSTaiwanChineseEUCStringEncoding = "ç¹é«”中文(EUC)"; NSKoreanEUCStringEncoding = "韓文(EUC)"; NSKOI8RStringEncoding = "斯拉夫語系(KOI8-R)"; NSBig5StringEncoding = "ç¹é«”中文(Big 5)"; NSMacRomanLatin1StringEncoding = "西方語系(Mac郵件)"; NSHZ_GB_2312StringEncoding = "簡體中文(HZ GB 2312)"; NSBig5_HKSCS_1999StringEncoding = "ç¹é«”中文(Big 5 HKSCS)"; NSKOI8UStringEncoding = "çƒå…‹è˜­æ–‡ï¼ˆKOI8-U)"; NSBig5EStringEncoding = "ç¹é«”中文(Big 5-E)"; NSNextStepLatinStringEncoding = "西方語系(NextStep)"; NSNextStepJapaneseStringEncoding = "Japanese (NextStep)"; NSEBCDICUSStringEncoding = "西方語系(EBCDIC Latin Core)"; NSEBCDICCP037StringEncoding = "西方語系(EBCDIC Latin 1)"; gnustep-base-1.29.0/Source/000077500000000000000000000000001435650067400154525ustar00rootroot00000000000000gnustep-base-1.29.0/Source/.cvsignore000066400000000000000000000004361435650067400174550ustar00rootroot00000000000000config.h *_bas.m *_cbs.m AUTHORS Foundation Makefile GSValue?.m NSValue?.m NSNumber?.m NSNumber??.m NXStringTable_scan.c dynamic-load.h errs* gdomap gnustep ix86 proplist.tab.m proplist.tab.h lex.pl.m shared_debug_obj stringsfile.tab.m stringsfile.tab.h lex.sf.m shared_obj SSL.bundle gnustep-base-1.29.0/Source/Additions/000077500000000000000000000000001435650067400173705ustar00rootroot00000000000000gnustep-base-1.29.0/Source/Additions/GCArray.m000066400000000000000000000223461435650067400210450ustar00rootroot00000000000000/* Implementation of garbage collecting array classes. Copyright (C) 2002 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Inspired by gc classes of Ovidiu Predescu and Mircea Oancea This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #import "common.h" #ifndef NeXT_Foundation_LIBRARY #import "Foundation/NSException.h" #import "Foundation/NSRange.h" #endif #import "GNUstepBase/GSObjCRuntime.h" #import "GNUstepBase/GCObject.h" @implementation GCArray static Class gcClass = 0; + (void) initialize { if (gcClass == 0) { gcClass = [GCObject class]; GSObjCAddClassBehavior(self, gcClass); } } - (Class) classForCoder { return [GCArray class]; } - (id) copyWithZone: (NSZone*)zone { GCArray *result; id *objects; NSUInteger i, c = [self count]; if (NSShouldRetainWithZone(self, zone)) { return [self retain]; } objects = NSZoneMalloc(zone, c * sizeof(id)); /* FIXME: Check if malloc return 0 */ [self getObjects: objects]; for (i = 0; i < c; i++) { objects[i] = [objects[i] copy]; } result = [[GCArray allocWithZone: zone] initWithObjects: objects count: c]; NSZoneFree(zone, objects); return result; } - (NSUInteger) count { return _count; } - (void) dealloc { NSUInteger c = _count; [GCObject gcObjectWillBeDeallocated: (GCObject*)self]; if ([GCObject gcIsCollecting]) { while (c-- > 0) { if (_isGCObject[c] == NO) { DESTROY(_contents[c]); } } } else { while (c-- > 0) { DESTROY(_contents[c]); } } NSZoneFree([self zone], _contents); [super dealloc]; } - (void) gcDecrementRefCountOfContainedObjects { NSUInteger c = _count; gc.flags.visited = 0; while (c-- > 0) { if (_isGCObject[c]) { [_contents[c] gcDecrementRefCount]; } } } - (BOOL) gcIncrementRefCountOfContainedObjects { if (gc.flags.visited == 1) { return NO; } else { NSUInteger c = _count; gc.flags.visited = 1; while (c-- > 0) { if (_isGCObject[c]) { [_contents[c] gcIncrementRefCount]; [_contents[c] gcIncrementRefCountOfContainedObjects]; } } return YES; } } - (id) initWithObjects: (const id[])objects count: (NSUInteger)count { _contents = NSZoneMalloc([self zone], count * (sizeof(id) + sizeof(BOOL))); _isGCObject = (BOOL*)&_contents[count]; _count = 0; while (_count < count) { _contents[_count] = RETAIN(objects[_count]); if (_contents[_count] == nil) { DESTROY(self); [NSException raise: NSInvalidArgumentException format: @"Nil object to be added in array"]; } else { _isGCObject[_count] = [objects[_count] isKindOfClass: gcClass]; } _count++; } return self; } - (id) initWithArray: (NSArray*)anotherArray { NSUInteger count = [anotherArray count]; _contents = NSZoneMalloc([self zone], count * (sizeof(id) + sizeof(BOOL))); _isGCObject = (BOOL*)&_contents[count]; _count = 0; while (_count < count) { _contents[_count] = RETAIN([anotherArray objectAtIndex: _count]); _isGCObject[_count] = [_contents[_count] isKindOfClass: gcClass]; _count++; } return self; } /** * We use the same initial instance variable layout as a GCObject and * ue the behavior mechanism to inherit methods from that class * to implement a form of multiple inheritance. We need to implement * this method to make this apparent at runtime. */ - (BOOL) isKindOfClass: (Class)c { if (c == gcClass) { return YES; } return [super isKindOfClass: c]; } - (id) mutableCopyWithZone: (NSZone*)zone { return [[GCMutableArray allocWithZone: zone] initWithArray: self]; } - (id) objectAtIndex: (NSUInteger)index { if (index >= _count) { [NSException raise: NSRangeException format: @"[%@-%@]: index: %"PRIuPTR, NSStringFromClass([self class]), NSStringFromSelector(_cmd), index]; } return _contents[index]; } @end @implementation GCMutableArray + (void)initialize { static BOOL beenHere = NO; if (beenHere == NO) { beenHere = YES; GSObjCAddClassBehavior(self, [GCArray class]); } } - (void) addObject: (id)anObject { [self insertObject: anObject atIndex: _count]; } - (Class) classForCoder { return [GCMutableArray class]; } - (id) copyWithZone: (NSZone*)zone { GCArray *result; id *objects; NSUInteger i, c = [self count]; objects = NSZoneMalloc(zone, c * sizeof(id)); /* FIXME: Check if malloc return 0 */ [self getObjects: objects]; for (i = 0; i < c; i++) { objects[i] = [objects[i] copy]; } result = [[GCArray allocWithZone: zone] initWithObjects: objects count: c]; NSZoneFree(zone, objects); return result; } - (id) init { return [self initWithCapacity: 1]; } - (id) initWithArray: (NSArray*)anotherArray { NSUInteger count = [anotherArray count]; self = [self initWithCapacity: count]; if (self != nil) { while (_count < count) { _contents[_count] = RETAIN([anotherArray objectAtIndex: _count]); _isGCObject[_count] = [_contents[_count] isKindOfClass: gcClass]; _count++; } } return self; } - (id) initWithCapacity: (NSUInteger)aNumItems { if (aNumItems < 1) { aNumItems = 1; } _contents = NSZoneMalloc([self zone], aNumItems * (sizeof(id) + sizeof(BOOL))); _isGCObject = (BOOL*)&_contents[aNumItems]; _maxCount = aNumItems; _count = 0; return self; } - (id) initWithObjects: (const id [])objects count: (NSUInteger)count { self = [self initWithCapacity: count]; if (self != nil) { while (_count < count) { _contents[_count] = RETAIN(objects[_count]); if (_contents[_count] == nil) { DESTROY(self); [NSException raise: NSInvalidArgumentException format: @"Nil object to be added in array"]; } else { _isGCObject[_count] = [objects[_count] isKindOfClass: gcClass]; } _count++; } } return self; } - (void) insertObject: (id)anObject atIndex: (NSUInteger)index { NSUInteger i; if (anObject == nil) { [NSException raise: NSInvalidArgumentException format: @"[%@-%@]: nil argument", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; } if (index > _count) { [NSException raise: NSRangeException format: @"[%@-%@]: bad index %"PRIuPTR, NSStringFromClass([self class]), NSStringFromSelector(_cmd), index]; } if (_count == _maxCount) { NSUInteger old = _maxCount; BOOL *optr; if (_maxCount > 0) { _maxCount += (_maxCount >> 1) ? (_maxCount >> 1) : 1; } else { _maxCount = 1; } _contents = (id*)NSZoneRealloc([self zone], _contents, _maxCount * (sizeof(id) + sizeof(BOOL))); optr = (BOOL*)&_contents[old]; _isGCObject = (BOOL*)&_contents[_maxCount]; memmove(_isGCObject, optr, sizeof(BOOL)*old); } for (i = _count; i > index; i--) { _contents[i] = _contents[i - 1]; _isGCObject[i] = _isGCObject[i - 1]; } _contents[index] = RETAIN(anObject); _isGCObject[index] = [anObject isKindOfClass: gcClass]; _count++; } - (id) mutableCopyWithZone: (NSZone*)zone { return [[GCMutableArray allocWithZone: zone] initWithArray: self]; } - (void) removeAllObjects { [self removeObjectsInRange: NSMakeRange(0, _count)]; } - (void) removeObjectAtIndex: (NSUInteger)index { [self removeObjectsInRange: NSMakeRange(index, 1)]; } - (void) removeObjectsInRange: (NSRange)range { NSUInteger i; if (NSMaxRange(range) > _count) { [NSException raise: NSRangeException format: @"[%@-%@]: bad range %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd), NSStringFromRange(range)]; } if (range.length == 0) { return; } for (i = range.location; i < NSMaxRange(range); i++) { RELEASE(_contents[i]); } for (i = NSMaxRange(range); i < _count; i++, range.location++) { _contents[range.location] = _contents[i]; _isGCObject[range.location] = _isGCObject[i]; } _count -= range.length; } - (void) replaceObjectAtIndex: (NSUInteger)index withObject: (id)anObject { if (anObject == nil) { [NSException raise: NSInvalidArgumentException format: @"[%@-%@]: nil argument", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; } if (index >= _count) { [NSException raise: NSRangeException format: @"[%@-%@]: bad index %"PRIuPTR, NSStringFromClass([self class]), NSStringFromSelector(_cmd), index]; } ASSIGN(_contents[index], anObject); _isGCObject[index] = [anObject isKindOfClass: gcClass]; } @end gnustep-base-1.29.0/Source/Additions/GCDictionary.m000066400000000000000000000225241435650067400220720ustar00rootroot00000000000000/* Implementation of garbage collecting dictionary classes Copyright (C) 2002 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Inspired by gc classes of Ovidiu Predescu and Mircea Oancea This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #import "common.h" #ifndef NeXT_Foundation_LIBRARY #import "Foundation/NSException.h" #endif #import "GNUstepBase/GSObjCRuntime.h" #import "GNUstepBase/GCObject.h" typedef struct { id object; BOOL isGCObject; } GCInfo; @interface _GCDictionaryKeyEnumerator : NSEnumerator { @public GCDictionary *dict; NSMapEnumerator enumerator; } - (id) nextObject; @end @interface _GCDictionaryObjectEnumerator : _GCDictionaryKeyEnumerator - (id) nextObject; @end @implementation _GCDictionaryKeyEnumerator - (id) copyWithZone: (NSZone*)z { return [self retain]; } - (void) dealloc { NSEndMapTableEnumeration(&enumerator); DESTROY(dict); [super dealloc]; } - (id) nextObject { GCInfo *keyStruct; GCInfo *valueStruct; return NSNextMapEnumeratorPair(&enumerator, (void**)&keyStruct, (void**)&valueStruct) ? keyStruct->object : nil; } @end @implementation _GCDictionaryObjectEnumerator - (id) nextObject { GCInfo *keyStruct; GCInfo *valueStruct; return NSNextMapEnumeratorPair(&enumerator, (void**)&keyStruct, (void**)&valueStruct) ? valueStruct->object : nil; } @end @implementation GCDictionary static unsigned _GCHashObject(NSMapTable *table, const GCInfo *objectStruct) { return [objectStruct->object hash]; } static BOOL _GCCompareObjects(NSMapTable *table, const GCInfo *o1, const GCInfo *o2) { return [o1->object isEqual: o2->object]; } static void _GCRetainObjects(NSMapTable *table, const void *ptr) { GCInfo *objectStruct = (GCInfo*)ptr; [objectStruct->object retain]; } static void _GCReleaseObjects(NSMapTable *table, const void *ptr) { GCInfo *objectStruct = (GCInfo*)ptr; if ([GCObject gcIsCollecting]) { if (objectStruct->isGCObject == NO) { DESTROY(objectStruct->object); } } else { DESTROY(objectStruct->object); } NSZoneFree(NSDefaultMallocZone(), objectStruct); } static NSString* _GCDescribeObjects(NSMapTable *table, const GCInfo *objectStruct) { return [objectStruct->object description]; } static const NSMapTableKeyCallBacks GCInfoMapKeyCallBacks = { (NSUInteger(*)(NSMapTable *, const void *))_GCHashObject, (BOOL(*)(NSMapTable *, const void *, const void *))_GCCompareObjects, (void (*)(NSMapTable *, const void *))_GCRetainObjects, (void (*)(NSMapTable *, void *))_GCReleaseObjects, (NSString *(*)(NSMapTable *, const void *))_GCDescribeObjects, (const void *)NULL }; static const NSMapTableValueCallBacks GCInfoValueCallBacks = { (void (*)(NSMapTable *, const void *))_GCRetainObjects, (void (*)(NSMapTable *, void *))_GCReleaseObjects, (NSString *(*)(NSMapTable *, const void *))_GCDescribeObjects }; static Class gcClass = 0; + (void) initialize { if (gcClass == 0) { gcClass = [GCObject class]; GSObjCAddClassBehavior(self, gcClass); } } - (id) copyWithZone: (NSZone*)zone { if (NSShouldRetainWithZone(self, zone)) { return [self retain]; } return [[GCDictionary allocWithZone: zone] initWithDictionary: self]; } - (NSUInteger) count { return NSCountMapTable(_map); } - (void) dealloc { [GCObject gcObjectWillBeDeallocated: (GCObject*)self]; NSFreeMapTable(_map); [super dealloc]; } - (void) gcDecrementRefCountOfContainedObjects { NSMapEnumerator enumerator = NSEnumerateMapTable(_map); GCInfo *keyStruct; GCInfo *valueStruct; gc.flags.visited = 0; while (NSNextMapEnumeratorPair(&enumerator, (void**)&keyStruct, (void**)&valueStruct)) { if (keyStruct->isGCObject) { [keyStruct->object gcDecrementRefCount]; } if (valueStruct->isGCObject) { [valueStruct->object gcDecrementRefCount]; } } NSEndMapTableEnumeration(&enumerator); } - (BOOL) gcIncrementRefCountOfContainedObjects { NSMapEnumerator enumerator; GCInfo *keyStruct; GCInfo *valueStruct; if (gc.flags.visited == 1) { return NO; } gc.flags.visited = 1; enumerator = NSEnumerateMapTable(_map); while (NSNextMapEnumeratorPair(&enumerator, (void**)&keyStruct, (void**)&valueStruct)) { if (keyStruct->isGCObject) { [keyStruct->object gcIncrementRefCount]; [keyStruct->object gcIncrementRefCountOfContainedObjects]; } if (valueStruct->isGCObject) { [valueStruct->object gcIncrementRefCount]; [valueStruct->object gcIncrementRefCountOfContainedObjects]; } } NSEndMapTableEnumeration(&enumerator); return YES; } - (id) initWithDictionary: (NSDictionary*)dictionary { id keys = [dictionary keyEnumerator]; id key; NSUInteger size = ([dictionary count] * 4) / 3; NSZone *z = NSDefaultMallocZone(); _map = NSCreateMapTableWithZone(GCInfoMapKeyCallBacks, GCInfoValueCallBacks, size, z); while ((key = [keys nextObject]) != nil) { GCInfo *keyStruct; GCInfo *valueStruct; id value; keyStruct = NSZoneMalloc(z, sizeof(GCInfo)); valueStruct = NSZoneMalloc(z, sizeof(GCInfo)); value = [dictionary objectForKey: key]; keyStruct->object = key; keyStruct->isGCObject = [key isKindOfClass: gcClass]; valueStruct->object = value; valueStruct->isGCObject = [value isKindOfClass: gcClass]; NSMapInsert(_map, keyStruct, valueStruct); } return self; } - (id) initWithObjects: (const id[])objects forKeys: (const id [])keys count: (NSUInteger)count { NSUInteger size = (count * 4) / 3; NSZone *z = NSDefaultMallocZone(); _map = NSCreateMapTableWithZone(GCInfoMapKeyCallBacks, GCInfoValueCallBacks, size, z); while (count-- > 0) { GCInfo *keyStruct; GCInfo *valueStruct; if (!keys[count] || !objects[count]) { DESTROY(self); [NSException raise: NSInvalidArgumentException format: @"Nil object added in dictionary"]; } keyStruct = NSZoneMalloc(z, sizeof(GCInfo)); valueStruct = NSZoneMalloc(z, sizeof(GCInfo)); keyStruct->object = keys[count]; keyStruct->isGCObject = [(id )keys[count] isKindOfClass: gcClass]; valueStruct->object = objects[count]; valueStruct->isGCObject = [objects[count] isKindOfClass: gcClass]; NSMapInsert(_map, keyStruct, valueStruct); } return self; } /** * We use the same initial instance variable layout as a GCObject and * ue the behavior mechanism to inherit methods from that class * to implement a form of multiple inheritance. We need to implement * this method to make this apparent at runtime. */ - (BOOL) isKindOfClass: (Class)c { if (c == gcClass) { return YES; } return [super isKindOfClass: c]; } - (NSEnumerator*) keyEnumerator { _GCDictionaryKeyEnumerator *e; e = [_GCDictionaryKeyEnumerator alloc]; e->dict = [self retain]; e->enumerator = NSEnumerateMapTable(_map); return AUTORELEASE(e); } - (NSEnumerator*) objectEnumerator { _GCDictionaryObjectEnumerator *e; e = [_GCDictionaryObjectEnumerator alloc]; e->dict = [self retain]; e->enumerator = NSEnumerateMapTable(_map); return AUTORELEASE(e); } - (id) mutableCopyWithZone: (NSZone*)zone { return [[GCMutableDictionary allocWithZone: zone] initWithDictionary: self]; } - (id) objectForKey: (id)key { GCInfo keyStruct = { key, 0 }; GCInfo *valueStruct; valueStruct = NSMapGet(_map, (void**)&keyStruct); return valueStruct ? valueStruct->object : nil; } @end @implementation GCMutableDictionary + (void) initialize { static BOOL beenHere = NO; if (beenHere == NO) { beenHere = YES; GSObjCAddClassBehavior(self, [GCDictionary class]); } } - (id) init { return [self initWithCapacity: 0]; } - (id) initWithCapacity: (NSUInteger)aNumItems { NSUInteger size = (aNumItems * 4) / 3; _map = NSCreateMapTableWithZone(GCInfoMapKeyCallBacks, GCInfoValueCallBacks, size, [self zone]); return self; } - (id) copyWithZone: (NSZone*)zone { return [[GCDictionary allocWithZone: zone] initWithDictionary: self]; } - (void) setObject: (id)anObject forKey: (id)aKey { GCInfo *keyStruct; GCInfo *valueStruct; NSZone *z = NSDefaultMallocZone(); keyStruct = NSZoneMalloc(z, sizeof(GCInfo)); valueStruct = NSZoneMalloc(z, sizeof(GCInfo)); keyStruct->object = aKey; keyStruct->isGCObject = [aKey isKindOfClass: gcClass]; valueStruct->object = anObject; valueStruct->isGCObject = [anObject isKindOfClass: gcClass]; NSMapInsert(_map, keyStruct, valueStruct); } - (void) removeObjectForKey: (id)key { GCInfo keyStruct = { key, 0 }; NSMapRemove(_map, (void**)&keyStruct); } - (void) removeAllObjects { NSResetMapTable(_map); } @end gnustep-base-1.29.0/Source/Additions/GCObject.m000066400000000000000000000303201435650067400211640ustar00rootroot00000000000000/* Implementation of garbage collecting classe framework Copyright (C) 2002 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Inspired by gc classes of Ovidiu Predescu and Mircea Oancea This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. AutogsdocSource: Additions/GCObject.m AutogsdocSource: Additions/GCArray.m AutogsdocSource: Additions/GCDictionary.m */ #import "common.h" #ifndef NeXT_Foundation_LIBRARY #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSNotification.h" #import "Foundation/NSThread.h" #endif #import "GNUstepBase/GCObject.h" #import "../GSPThread.h" /* * The head of a linked list of all garbage collecting objects is a * special object which is never deallocated. */ @interface _GCObjectList : GCObject @end @implementation _GCObjectList - (void) dealloc { GSNOSUPERDEALLOC; } @end /** *

The GCObject class is both the base class for all garbage collected * objects, and an infrastructure for handling garbage collection. *

*

It maintains a list of all garbage collectable objects and provides * a method to run a garbage collection pass on those objects. *

*/ @implementation GCObject static GCObject *allObjects = nil; static BOOL isCollecting = NO; static gs_mutex_t *allocationLock = NULL; + (void) _becomeMultiThreaded: (NSNotification *)aNotification { if (allocationLock == NULL) { # ifndef NeXT_RUNTIME allocationLock = malloc(sizeof(gs_mutex_t)); if (allocationLock == NULL) { abort(); } GS_MUTEX_INIT(*allocationLock); # endif } } /** * Allocates an instance of the class and links it into the list of * all garbage collectable objects. Returns the new instance.
*/ + (id) allocWithZone: (NSZone*)zone { GCObject *o = [super allocWithZone: zone]; if (allocationLock != 0) { GS_MUTEX_LOCK(*allocationLock); } o->gc.next = allObjects; o->gc.previous = allObjects->gc.previous; allObjects->gc.previous->gc.next = o; allObjects->gc.previous = o; o->gc.flags.refCount = 1; if (allocationLock != 0) { GS_MUTEX_UNLOCK(*allocationLock); } return o; } /** *

This method runs a garbage collection, causing unreferenced objects to * be deallocated. This is done using a simple three pass algorithm - *

* * Pass 1 * * All the garbage collectable objects are sent a * -gcDecrementRefCountOfContainedObjects message. * * Pass 2 * * All objects having a refCount greater than 0 are sent an * -gcIncrementRefCountOfContainedObjects message. * * Pass 3 * * All the objects that still have the refCount of 0 * are part of cyclic graphs and none of the objects from this graph * are held by some object outside graph. These objects receive the * -dealloc message. In this method they should send the -dealloc message * to any garbage collectable (GCObject and subclass) instances they * contain. * * *

During garbage collection, the +gcIsCollecting method returns YES. *

*/ + (void) gcCollectGarbage { GCObject *object; GCObject *last; if (allocationLock != 0) { GS_MUTEX_LOCK(*allocationLock); } if (isCollecting == YES) { if (allocationLock != 0) { GS_MUTEX_UNLOCK(*allocationLock); } return; // Don't allow recursion. } isCollecting = YES; // Pass 1 object = allObjects->gc.next; while (object != allObjects) { [object gcDecrementRefCountOfContainedObjects]; // object->gc.flags.visited = 0; // object = object->gc.next; [object gcSetVisited: NO]; object = [object gcNextObject]; } // Pass 2 object = allObjects->gc.next; while (object != allObjects) { if ([object retainCount] > 0) { [object gcIncrementRefCountOfContainedObjects]; } // object = object->gc.next; object = [object gcNextObject]; } last = allObjects; object = last->gc.next; while (object != allObjects) { if ([object retainCount] == 0) { GCObject *next; // next = object->gc.next; // next->gc.previous = last; // last->gc.next = next; // object->gc.next = object; // object->gc.previous = object; next = [object gcNextObject]; [next gcSetPreviousObject: last]; [last gcSetNextObject: next]; [object gcSetNextObject: object]; [object gcSetPreviousObject: object]; [object dealloc]; object = next; } else { last = object; // object = object->gc.next; object = [object gcNextObject]; } } isCollecting = NO; if (allocationLock != 0) { GS_MUTEX_UNLOCK(*allocationLock); } } + (void) initialize { if (self == [GCObject class]) { allObjects = (_GCObjectList*) NSAllocateObject([_GCObjectList class], 0, NSDefaultMallocZone()); [[NSObject leakAt: &allObjects] release]; allObjects->gc.next = allObjects; allObjects->gc.previous = allObjects; if ([NSThread isMultiThreaded] == YES) { [self _becomeMultiThreaded: nil]; } else { [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(_becomeMultiThreaded:) name: NSWillBecomeMultiThreadedNotification object: nil]; } } } /** * Returns a flag to indicate whether a garbage collection is in progress. */ + (BOOL) gcIsCollecting { return isCollecting; } /** * Called to remove anObject from the list of garbage collectable objects.
* This method is provided so that classes which are not subclasses of * GCObject (but which have the same initial instance variable layout) can * use multiple inheritance (behaviors) to act as GCObject instances, but * can have their own -dealloc methods.
* These classes should call this in their own -dealloc methods. */ + (void) gcObjectWillBeDeallocated: (GCObject*)anObject { GCObject *p; GCObject *n; if (allocationLock != 0) { GS_MUTEX_LOCK(*allocationLock); } // p = anObject->gc.previous; // n = anObject->gc.next; // p->gc.next = n; // n->gc.previous = p; p = [anObject gcPreviousObject]; n = [anObject gcNextObject]; [p gcSetNextObject: n]; [n gcSetPreviousObject: p]; if (allocationLock != 0) { GS_MUTEX_UNLOCK(*allocationLock); } } /** * Copies the receiver (using the NSCopyObject() function) and links * the resulting object into the list of all garbage collactable * objects. Returns the newly created object. */ - (id) copyWithZone: (NSZone*)zone { GCObject *o = (GCObject*)NSCopyObject(self, 0, zone); if (allocationLock != 0) { GS_MUTEX_LOCK(*allocationLock); } o->gc.next = allObjects; o->gc.previous = allObjects->gc.previous; allObjects->gc.previous->gc.next = o; allObjects->gc.previous = o; o->gc.flags.refCount = 1; if (allocationLock != 0) { GS_MUTEX_UNLOCK(*allocationLock); } return o; } /** * Removes the receiver from the list of garbage collectable objects and * then calls the superclass implementation to complete deallocation of * th receiver and freeing of the memory it uses.
* Subclasses should call this at the end of their -dealloc methods as usual. */ - (void) dealloc { GCObject *p; GCObject *n; if (allocationLock != 0) { GS_MUTEX_LOCK(*allocationLock); } // p = anObject->gc.previous; // n = anObject->gc.next; // p->gc.next = n; // n->gc.previous = p; p = [self gcPreviousObject]; n = [self gcNextObject]; [p gcSetNextObject: n]; [n gcSetPreviousObject: p]; if (allocationLock != 0) { GS_MUTEX_UNLOCK(*allocationLock); } [super dealloc]; } /** * Decrements the garbage collection reference count for the receiver.
*/ - (void) gcDecrementRefCount { /* * No locking needed since this is only called when garbage collecting * and the collection method handles locking. */ gc.flags.refCount--; } /** *

Marks the receiver as not having been visited in the current garbage * collection process (first pass of collection). *

*

All container subclasses should override this method to call the super * implementation then decrement the ref counts of their contents as well as * sending the -gcDecrementRefCountOfContainedObjects * message to each of them. *

*/ - (void) gcDecrementRefCountOfContainedObjects { /* * No locking needed since this is only called when garbage collecting * and the collection method handles locking. */ gc.flags.visited = 0; } /** * Increments the garbage collection reference count for the receiver.
*/ - (void) gcIncrementRefCount { /* * No locking needed since this is only called when garbage collecting * and the collection method handles locking. */ gc.flags.refCount++; } /** *

Checks to see if the receiver has already been visited in the * current garbage collection process, and either marks the receiver as * visited (and returns YES) or returns NO to indicate that it had already * been visited. *

*

All container subclasses should override this method to call the super * implementation then, if the method returns YES, increment the reference * count of any contained objects and send the * -gcIncrementRefCountOfContainedObjects * to each of the contained objects too. *

*/ - (BOOL) gcIncrementRefCountOfContainedObjects { /* * No locking needed since this is only called when garbage collecting * and the collection method handles locking. */ if (gc.flags.visited == 1) { return NO; } gc.flags.visited = 1; return YES; } /** * Decrements the receivers reference count, and if zero, rmoveis it * from the list of garbage collectable objects and deallocates it. */ - (oneway void) release { if (allocationLock != 0) { GS_MUTEX_LOCK(*allocationLock); } if (gc.flags.refCount > 0 && gc.flags.refCount-- == 1) { [GCObject gcObjectWillBeDeallocated: self]; [self dealloc]; } if (allocationLock != 0) { GS_MUTEX_UNLOCK(*allocationLock); } } /** * Increments the receivers reference count and returns the receiver. */ - (id) retain { if (allocationLock != 0) { GS_MUTEX_LOCK(*allocationLock); } gc.flags.refCount++; if (allocationLock != 0) { GS_MUTEX_UNLOCK(*allocationLock); } return self; } /** * Returns the receivers reference count. */ - (NSUInteger) retainCount { return gc.flags.refCount; } @end /** * This category implements accessor methods for the instance variables * used for garbage collecting. If/when we can ensure that all garbage * collecting classes use the same initial ivar layout, we can remove * these methods and the garbage collector can access the ivars directly, * making a pretty big performance improvement during collecting.
* NB. These methods must *only* be used by the garbage collecting process * or in methods called from the garbage collector. Anything else is not * thread-safe. */ @implementation GCObject (Extra) - (BOOL) gcAlreadyVisited { if (gc.flags.visited == 1) { return YES; } else { return NO; } } - (GCObject*) gcNextObject { return gc.next; } - (GCObject*) gcPreviousObject { return gc.previous; } - (GCObject*) gcSetNextObject: (GCObject*)anObject { gc.next = anObject; return self; } - (GCObject*) gcSetPreviousObject: (GCObject*)anObject { gc.previous = anObject; return self; } - (void) gcSetVisited: (BOOL)flag { if (flag == YES) { gc.flags.visited = 1; } else { gc.flags.visited = 0; } } @end gnustep-base-1.29.0/Source/Additions/GNUmakefile000066400000000000000000000037611435650067400214510ustar00rootroot00000000000000# # src makefile for the GNUstep Base Library # # Copyright (C) 199a-2010 Free Software Foundation, Inc. # # Written by: Scott Christley # # This file is part of the GNUstep Base Library. # # 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 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 # Library General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free # Software Foundation, Inc., 51 Franklin Street, Fifth Floor, # Boston, MA 02111 USA. # PACKAGE_NAME = gnustep-base GNUSTEP_LOCAL_ADDITIONAL_MAKEFILES=../../base.make include $(GNUSTEP_MAKEFILES)/common.make include ../../config.mak SUBPROJECT_NAME = Additions Additions_C_FILES =\ GSTypeEncoding.c \ Additions_OBJC_FILES =\ GSObjCRuntime.m \ GCObject.m \ GCArray.m \ GCDictionary.m \ GSLock.m \ GSMime.m \ GSXML.m \ GSFunctions.m \ GSInsensitiveDictionary.m \ NSArray+GNUstepBase.m \ NSAttributedString+GNUstepBase.m \ NSBundle+GNUstepBase.m \ NSCalendarDate+GNUstepBase.m \ NSData+GNUstepBase.m \ NSDebug+GNUstepBase.m \ NSError+GNUstepBase.m \ NSHashTable+GNUstepBase.m \ NSFileHandle+GNUstepBase.m \ NSLock+GNUstepBase.m \ NSMutableString+GNUstepBase.m \ NSNumber+GNUstepBase.m \ NSObject+GNUstepBase.m \ NSPropertyList+GNUstepBase.m \ NSProcessInfo+GNUstepBase.m \ NSStream+GNUstepBase.m \ NSString+GNUstepBase.m \ NSTask+GNUstepBase.m \ NSThread+GNUstepBase.m \ NSURL+GNUstepBase.m \ Additions_OBJC_FILES += Unicode.m -include Makefile.preamble include $(GNUSTEP_MAKEFILES)/subproject.make -include Makefile.postamble gnustep-base-1.29.0/Source/Additions/GSFunctions.m000066400000000000000000000042071435650067400217530ustar00rootroot00000000000000/* Extension functions for GNUstep Copyright (C) 2005 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Written by: Sheldon Gill Date: 2005 This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. NSPathUtilities function reference $Date$ $Revision$ */ #import "common.h" #import "GNUstepBase/GSFunctions.h" #import "GNUstepBase/NSDebug+GNUstepBase.h" #ifndef NeXT_Foundation_LIBRARY #import "Foundation/NSArray.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSException.h" #import "Foundation/NSFileManager.h" #endif NSString * GSFindNamedFile(NSArray *paths, NSString *aName, NSString *anExtension) { NSFileManager *file_mgr = [NSFileManager defaultManager]; NSString *file_name, *file_path, *path; NSEnumerator *enumerator; NSCParameterAssert(aName != nil); NSCParameterAssert(paths != nil); GSOnceFLog(@"deprecated ... trivial to code directly"); /* make up the name with extension if given */ if (anExtension != nil) { file_name = [aName stringByAppendingPathExtension: anExtension]; } else { file_name = aName; } enumerator = [paths objectEnumerator]; while ((path = [enumerator nextObject])) { file_path = [path stringByAppendingPathComponent: file_name]; if ([file_mgr fileExistsAtPath: file_path] == YES) { return file_path; // Found it! } } return nil; } gnustep-base-1.29.0/Source/Additions/GSInsensitiveDictionary.m000066400000000000000000000263501435650067400243340ustar00rootroot00000000000000/** Interface to concrete implementation of NSDictionary Copyright (C) 2007 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: May 2007 This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #import "common.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSException.h" #import "Foundation/NSPortCoder.h" // For private method _decodeArrayOfObjectsForKey: #import "Foundation/NSKeyedArchiver.h" #import "GNUstepBase/GSObjCRuntime.h" #import "GNUstepBase/NSDebug+GNUstepBase.h" /* * The 'Fastmap' stuff provides an inline implementation of a mapping * table - for maximum performance. */ #define GSI_MAP_KTYPES GSUNION_OBJ #define GSI_MAP_VTYPES GSUNION_OBJ #define GSI_MAP_HASH(M, X) [[X.obj lowercaseString] hash] #define GSI_MAP_EQUAL(M, X,Y) (([X.obj caseInsensitiveCompare: Y.obj]\ == NSOrderedSame) ? YES : NO) #define GSI_MAP_RETAIN_KEY(M, X) ((X).obj) = \ [((id)(X).obj) copyWithZone: map->zone] #include "GNUstepBase/GSIMap.h" @interface _GSInsensitiveDictionary : NSDictionary { @public GSIMapTable_t map; } @end @interface _GSMutableInsensitiveDictionary : NSMutableDictionary { @public GSIMapTable_t map; unsigned long _version; } @end @interface _GSInsensitiveDictionaryKeyEnumerator : NSEnumerator { _GSInsensitiveDictionary *dictionary; GSIMapEnumerator_t enumerator; } - (id) initWithDictionary: (NSDictionary*)d; @end @interface _GSInsensitiveDictionaryObjectEnumerator : _GSInsensitiveDictionaryKeyEnumerator @end @implementation _GSInsensitiveDictionary static SEL nxtSel; static SEL objSel; + (void) initialize { if (self == [_GSInsensitiveDictionary class]) { nxtSel = @selector(nextObject); objSel = @selector(objectForKey:); } } - (id) copyWithZone: (NSZone*)zone { return RETAIN(self); } - (NSUInteger) count { return map.nodeCount; } - (void) dealloc { GSIMapEmptyMap(&map); [super dealloc]; } - (void) encodeWithCoder: (NSCoder*)aCoder { if ([aCoder allowsKeyedCoding]) { [super encodeWithCoder: aCoder]; } else { NSUInteger count = map.nodeCount; SEL sel = @selector(encodeObject:); id (*imp)(id,SEL,id) = (id (*)(id,SEL,id))[aCoder methodForSelector: sel]; GSIMapEnumerator_t enumerator = GSIMapEnumeratorForMap(&map); GSIMapNode node = GSIMapEnumeratorNextNode(&enumerator); [aCoder encodeValueOfObjCType: @encode(NSUInteger) at: &count]; while (node != 0) { (*imp)(aCoder, sel, node->key.obj); (*imp)(aCoder, sel, node->value.obj); node = GSIMapEnumeratorNextNode(&enumerator); } GSIMapEndEnumerator(&enumerator); } } - (NSUInteger) hash { return map.nodeCount; } - (id) init { return [self initWithObjects: 0 forKeys: 0 count: 0]; } - (id) initWithCoder: (NSCoder*)aCoder { if ([aCoder allowsKeyedCoding]) { self = [super initWithCoder: aCoder]; } else { NSUInteger count; id key; id value; SEL sel = @selector(decodeValueOfObjCType:at:); void (*imp)(id,SEL,const char*,void*) = (void (*)(id,SEL,const char*,void*))[aCoder methodForSelector: sel]; const char *type = @encode(id); [aCoder decodeValueOfObjCType: @encode(NSUInteger) at: &count]; GSIMapInitWithZoneAndCapacity(&map, [self zone], count); while (count-- > 0) { (*imp)(aCoder, sel, type, &key); (*imp)(aCoder, sel, type, &value); GSIMapAddPairNoRetain(&map, (GSIMapKey)key, (GSIMapVal)value); } } return self; } /* Designated initialiser */ - (id) initWithObjects: (const id[])objs forKeys: (const id [])keys count: (NSUInteger)c { NSUInteger i; GSIMapInitWithZoneAndCapacity(&map, [self zone], c); for (i = 0; i < c; i++) { GSIMapNode node; if (keys[i] == nil) { DESTROY(self); [NSException raise: NSInvalidArgumentException format: @"Tried to init dictionary with nil key"]; } if (objs[i] == nil) { DESTROY(self); [NSException raise: NSInvalidArgumentException format: @"Tried to init dictionary with nil value"]; } node = GSIMapNodeForKey(&map, (GSIMapKey)(id)keys[i]); if (node) { IF_NO_ARC(RETAIN(objs[i]);) RELEASE(node->value.obj); node->value.obj = objs[i]; } else { GSIMapAddPair(&map, (GSIMapKey)(id)keys[i], (GSIMapVal)objs[i]); } } return self; } /* * This avoids using the designated initialiser for performance reasons. */ - (id) initWithDictionary: (NSDictionary*)other copyItems: (BOOL)shouldCopy { NSZone *z = [self zone]; NSUInteger c = [other count]; GSIMapInitWithZoneAndCapacity(&map, z, c); if (c > 0) { NSEnumerator *e = [other keyEnumerator]; id (*nxtObj)(id, SEL) = (id (*)(id,SEL))[e methodForSelector: nxtSel]; id (*otherObj)(id, SEL, id) = (id (*)(id,SEL,id))[other methodForSelector: objSel]; BOOL isProxy = [other isProxy]; NSUInteger i; for (i = 0; i < c; i++) { GSIMapNode node; id k; id o; if (isProxy == YES) { k = [e nextObject]; o = [other objectForKey: k]; } else { k = (*nxtObj)(e, nxtSel); o = (*otherObj)(other, objSel, k); } k = [k copyWithZone: z]; if (k == nil) { DESTROY(self); [NSException raise: NSInvalidArgumentException format: @"Tried to init dictionary with nil key"]; } if (shouldCopy) { o = [o copyWithZone: z]; } else { o = RETAIN(o); } if (o == nil) { DESTROY(self); [NSException raise: NSInvalidArgumentException format: @"Tried to init dictionary with nil value"]; } node = GSIMapNodeForKey(&map, (GSIMapKey)k); if (node) { RELEASE(node->value.obj); node->value.obj = o; } else { GSIMapAddPairNoRetain(&map, (GSIMapKey)k, (GSIMapVal)o); } } } return self; } - (BOOL) isEqualToDictionary: (NSDictionary*)other { NSUInteger count; if (other == self) { return YES; } count = map.nodeCount; if (count == [other count]) { if (count > 0) { GSIMapEnumerator_t enumerator; GSIMapNode node; id (*otherObj)(id, SEL, id) = (id (*)(id,SEL,id))[other methodForSelector: objSel]; enumerator = GSIMapEnumeratorForMap(&map); while ((node = GSIMapEnumeratorNextNode(&enumerator)) != 0) { id o1 = node->value.obj; id o2 = (*otherObj)(other, objSel, node->key.obj); if (o1 != o2 && [o1 isEqual: o2] == NO) { GSIMapEndEnumerator(&enumerator); return NO; } } GSIMapEndEnumerator(&enumerator); } return YES; } return NO; } - (NSEnumerator*) keyEnumerator { return AUTORELEASE([[_GSInsensitiveDictionaryKeyEnumerator allocWithZone: NSDefaultMallocZone()] initWithDictionary: self]); } - (BOOL) makeImmutable { return YES; } - (NSEnumerator*) objectEnumerator { return AUTORELEASE([[_GSInsensitiveDictionaryObjectEnumerator allocWithZone: NSDefaultMallocZone()] initWithDictionary: self]); } - (id) objectForKey: aKey { if (aKey != nil) { GSIMapNode node = GSIMapNodeForKey(&map, (GSIMapKey)aKey); if (node) { return node->value.obj; } } return nil; } - (NSUInteger) countByEnumeratingWithState: (NSFastEnumerationState*)state objects: (__unsafe_unretained id[])stackbuf count: (NSUInteger)len { state->mutationsPtr = (unsigned long *)self; return GSIMapCountByEnumeratingWithStateObjectsCount (&map, state, stackbuf, len); } @end @implementation _GSMutableInsensitiveDictionary + (void) initialize { if (self == [_GSMutableInsensitiveDictionary class]) { GSObjCAddClassBehavior(self, [_GSInsensitiveDictionary class]); } } - (id) copyWithZone: (NSZone*)zone { NSDictionary *copy = [_GSInsensitiveDictionary allocWithZone: zone]; return [copy initWithDictionary: self copyItems: NO]; } - (id) init { return [self initWithCapacity: 0]; } /* Designated initialiser */ - (id) initWithCapacity: (NSUInteger)cap { GSIMapInitWithZoneAndCapacity(&map, [self zone], cap); return self; } - (BOOL) makeImmutable { GSClassSwizzle(self, [_GSInsensitiveDictionary class]); return YES; } - (id) makeImmutableCopyOnFail: (BOOL)force { GSClassSwizzle(self, [_GSInsensitiveDictionary class]); return self; } - (void) setObject: (id)anObject forKey: (id)aKey { GSIMapNode node; _version++; if (aKey == nil) { NSException *e; e = [NSException exceptionWithName: NSInvalidArgumentException reason: @"Tried to add nil key to dictionary" userInfo: self]; [e raise]; } if ([aKey isKindOfClass: [NSString class]] == NO) { NSException *e; e = [NSException exceptionWithName: NSInvalidArgumentException reason: @"Tried to add non-string key" userInfo: self]; [e raise]; } node = GSIMapNodeForKey(&map, (GSIMapKey)aKey); if (node) { IF_NO_ARC(RETAIN(anObject);) RELEASE(node->value.obj); node->value.obj = anObject; } else { GSIMapAddPair(&map, (GSIMapKey)aKey, (GSIMapVal)anObject); } _version++; } - (void) removeAllObjects { _version++; GSIMapCleanMap(&map); _version++; } - (void) removeObjectForKey: (id)aKey { if (aKey == nil) { NSWarnMLog(@"attempt to remove nil key from dictionary %@", self); return; } _version++; GSIMapRemoveKey(&map, (GSIMapKey)aKey); _version++; } - (NSUInteger) countByEnumeratingWithState: (NSFastEnumerationState*)state objects: (__unsafe_unretained id[])stackbuf count: (NSUInteger)len { state->mutationsPtr = &_version; return GSIMapCountByEnumeratingWithStateObjectsCount (&map, state, stackbuf, len); } @end @implementation _GSInsensitiveDictionaryKeyEnumerator - (id) initWithDictionary: (NSDictionary*)d { [super init]; dictionary = (_GSInsensitiveDictionary*)RETAIN(d); enumerator = GSIMapEnumeratorForMap(&dictionary->map); return self; } - (id) nextObject { GSIMapNode node = GSIMapEnumeratorNextNode(&enumerator); if (node == 0) { return nil; } return node->key.obj; } - (void) dealloc { GSIMapEndEnumerator(&enumerator); RELEASE(dictionary); [super dealloc]; } @end @implementation _GSInsensitiveDictionaryObjectEnumerator - (id) nextObject { GSIMapNode node = GSIMapEnumeratorNextNode(&enumerator); if (node == 0) { return nil; } return node->value.obj; } @end gnustep-base-1.29.0/Source/Additions/GSLock.m000066400000000000000000000155421435650067400206770ustar00rootroot00000000000000/** Implementation for GSLock Copyright (C) 2003 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: October 2003 This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. $Date$ $Revision$ */ #import "common.h" #define EXPOSE_GSLock_IVARS 1 #import "Foundation/NSException.h" #import "Foundation/NSLock.h" #import "Foundation/NSNotification.h" #import "Foundation/NSThread.h" #import "GNUstepBase/GSLock.h" /** * This implements a class which, when used in single-threaded mode, * acts like a lock while avoiding the overheads of actually using * a real lock. However, when the programm in which the class is * used becomes multi-threaded, all instances of this class transform * themselves into real locks in the correct state (locked/unlocked) * corresponding to whether the lazy lock was locked or not at the * point where the program became multi threadeed.
* Use of this class allows you to write thread-safe code which avoids * locking inefficiencies when used in a single threaded application, * without having to worry about dealing with the issue yourself. */ @implementation GSLazyLock /** * Do not use this method ... it is used internally to handle the transition * from a single threaded system to a multi threaded one. */ - (void) _becomeThreaded: (NSNotification*)n { [[NSNotificationCenter defaultCenter] removeObserver: self]; object_setClass(self, [NSLock class]); if (locked == YES) { if ([self tryLock] == NO) { [NSException raise: NSInternalInconsistencyException format: @"Failed to lock mutex"]; } } /* * While we have changed 'isa', it's possible someone might have * cached our old method implementations, so we set the 'locked' * ivar to a value to tell the old method implementations to use * the superclass implementatins. */ locked = -1; } - (void) dealloc { [[NSNotificationCenter defaultCenter] removeObserver: self]; [super dealloc]; } - (id) init { self = [super init]; if ([NSThread isMultiThreaded] == YES) { DESTROY(self); return (GSLazyLock*)[NSLock new]; } else if (self != nil) { locked = NO; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(_becomeThreaded:) name: NSWillBecomeMultiThreadedNotification object: nil]; } return self; } - (void) lock { if (locked == NO) { locked = YES; } else if (locked == YES) { [NSException raise: NSGenericException format: @"lock: when already locked"]; } else { [super lock]; } } - (BOOL) lockBeforeDate: (NSDate*)limit { BOOL result; if (locked == NO) { result = YES; } else if (locked == YES) { result = NO; [NSException raise: NSGenericException format: @"lock: when already locked"]; } else { result = [super lockBeforeDate: limit]; } return result; } - (BOOL) tryLock { if (locked == NO) { locked = YES; return YES; } else if (locked == YES) { return NO; } else { return [super tryLock]; } } - (void) unlock { if (locked == YES) { locked = NO; } else if (locked == NO) { [NSException raise: NSGenericException format: @"unlock: when already unlocked"]; } else { [super unlock]; } } @end /** * This implements a class which, when used in single-threaded mode, * acts like a recursive lock while avoiding the overheads of using * a real lock. However, when the programm in which the class is * used becomes multi-threaded, all instances of this class transform * themselves into real locks in the correct state (locked/unlocked) * corresponding to whether the lazy recursive lock was locked or not * at the point where the program became multi threadeed.
* Use of this class allows you to write thread-safe code which avoids * locking inefficiencies when used in a single threaded application, * without having to worry about dealing with the issue yourself. */ @implementation GSLazyRecursiveLock /** * Do not use this method ... it is used internally to handle the transition * from a single threaded system to a multi threaded one. */ - (void) _becomeThreaded: (NSNotification*)n { [[NSNotificationCenter defaultCenter] removeObserver: self]; object_setClass(self, [NSRecursiveLock class]); while (counter-- > 0) { if ([self tryLock] == NO) { [NSException raise: NSInternalInconsistencyException format: @"Failed to lock mutex"]; } } /* * While we have changed 'isa', it's possible someone might have * cached our old method implementations, so we set the 'locked' * ivar to a value to tell the old method implementations to use * the superclass implementatins. */ counter = -1; } - (void) dealloc { [[NSNotificationCenter defaultCenter] removeObserver: self]; [super dealloc]; } - (id) init { self = [super init]; if ([NSThread isMultiThreaded] == YES) { DESTROY(self); return (GSLazyRecursiveLock*)[NSRecursiveLock new]; } else { if (self != nil) { [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(_becomeThreaded:) name: NSWillBecomeMultiThreadedNotification object: nil]; } } return self; } - (void) lock { if (counter >= 0) { counter++; } else { [super lock]; } } - (BOOL) lockBeforeDate: (NSDate*)limit { if (counter >= 0) { counter++; return YES; } else { return [super lockBeforeDate: limit]; } } - (BOOL) tryLock { if (counter >= 0) { counter++; return YES; } else { return [super tryLock]; } } - (void) unlock { if (counter > 0) { counter--; } else if (counter == 0) { [NSException raise: NSGenericException format: @"unlock: failed to unlock mutex"]; } else { [super unlock]; } } @end /* Global lock to be used by classes when operating on any global data that invoke other methods which also access global; thus, creating the potential for deadlock. */ NSRecursiveLock *gnustep_global_lock = nil; gnustep-base-1.29.0/Source/Additions/GSMime.m000066400000000000000000007530001435650067400206740ustar00rootroot00000000000000/** Implementation for GSMIME Copyright (C) 2000,2001 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: October 2000 This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. The MIME parsing system Mime Parser

The GNUstep Mime parser. This is collection Objective-C classes for representing MIME (and HTTP) documents and managing conversions to and from convenient internal formats.

The idea is to center round two classes -

document A container for the actual data (and headers) of a mime/http document, this is also used to create raw MIME data for sending. parser An object that can be fed data and will parse it into a document. This object also provides various utility methods and an API that permits overriding in order to extend the functionality to cope with new document types.
$Date$ $Revision$ */ #import "common.h" #define EXPOSE_GSMimeDocument_IVARS 1 #define EXPOSE_GSMimeHeader_IVARS 1 #define EXPOSE_GSMimeParser_IVARS 1 #define EXPOSE_GSMimeSMTPClient_IVARS 1 #define GS_GSMimeSMTPClient_IVARS \ id delegate;\ NSString *hostname;\ NSString *identity;\ NSString *originator;\ NSString *port;\ NSString *username;\ NSTimer *timer;\ GSMimeDocument *current;\ GSMimeHeader *version;\ NSMutableArray *queue;\ NSUInteger maximum;\ NSMutableArray *pending;\ NSInputStream *istream;\ NSOutputStream *ostream;\ NSMutableData *wdata;\ NSMutableData *rdata;\ NSMutableString *reply;\ NSError *lastError;\ unsigned woffset;\ BOOL readable;\ BOOL writable;\ int cState #include #import "Foundation/NSArray.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSCharacterSet.h" #import "Foundation/NSData.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSException.h" #import "Foundation/NSHashTable.h" #import "Foundation/NSHost.h" #import "Foundation/NSNotification.h" #import "Foundation/NSRunLoop.h" #import "Foundation/NSScanner.h" #import "Foundation/NSStream.h" #import "Foundation/NSTimer.h" #import "Foundation/NSUserDefaults.h" #import "Foundation/NSValue.h" #import "GNUstepBase/GSObjCRuntime.h" #import "GNUstepBase/GSMime.h" #import "GNUstepBase/GSXML.h" #import "GNUstepBase/NSObject+GNUstepBase.h" #import "GNUstepBase/NSData+GNUstepBase.h" #import "GNUstepBase/NSDebug+GNUstepBase.h" #import "GNUstepBase/NSString+GNUstepBase.h" #import "GNUstepBase/NSMutableString+GNUstepBase.h" #import "GNUstepBase/Unicode.h" #import "../GSPrivate.h" static NSCharacterSet *whitespace = nil; static NSCharacterSet *rfc822Specials = nil; static NSCharacterSet *rfc2045Specials = nil; static NSMapTable *charsets = 0; static NSMapTable *encodings = 0; static Class NSArrayClass = 0; static Class NSStringClass = 0; static Class NSDataClass = 0; static Class documentClass = 0; static Class headerClass = 0; static BOOL oldStyleFolding = NO; static NSString *Cte7bit = @"7bit"; static NSString *Cte8bit = @"8bit"; static NSString *CteBase64 = @"base64"; static NSString *CteBinary = @"binary"; static NSString *CteContentType = @"content-type"; static NSString *CteQuotedPrintable = @"quoted-printable"; static NSString *CteXuuencode = @"x-uuencode"; typedef id (*oaiIMP)(id, SEL, NSUInteger); typedef BOOL (*boolIMP)(id, SEL, id); static char *hex = "0123456789ABCDEF"; /* This is a test for SMTP standard white space characters. * In RCC2822 these are limited to just space and tab */ static inline BOOL isWSP(int c) { return (c == ' ' || c == '\t') ? YES : NO; } @interface GSMimeDocument (Private) - (GSMimeHeader*) _lastHeaderNamed: (NSString*)name; - (NSUInteger) _indexOfHeaderNamed: (NSString*)name; @end /* * Name - decodebase64() * Purpose - Convert 4 bytes in base64 encoding to 3 bytes raw data. */ static void decodebase64(unsigned char *dst, const unsigned char *src) { dst[0] = (src[0] << 2) | ((src[1] & 0x30) >> 4); dst[1] = ((src[1] & 0x0F) << 4) | ((src[2] & 0x3C) >> 2); dst[2] = ((src[2] & 0x03) << 6) | (src[3] & 0x3F); } void GSPrivateEncodeBase64(const uint8_t *src, NSUInteger length, uint8_t *dst) { int dIndex = 0; int sIndex; for (sIndex = 0; sIndex < length; sIndex += 3) { static char b64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; int c0 = src[sIndex]; int c1 = (sIndex+1 < length) ? src[sIndex+1] : 0; int c2 = (sIndex+2 < length) ? src[sIndex+2] : 0; dst[dIndex++] = b64[(c0 >> 2) & 077]; dst[dIndex++] = b64[((c0 << 4) & 060) | ((c1 >> 4) & 017)]; dst[dIndex++] = b64[((c1 << 2) & 074) | ((c2 >> 6) & 03)]; dst[dIndex++] = b64[c2 & 077]; } /* If len was not a multiple of 3, then we have encoded too * many characters. Adjust appropriately. */ if (sIndex == length + 1) { /* There were only 2 bytes in that last group */ dst[dIndex - 1] = '='; } else if (sIndex == length + 2) { /* There was only 1 byte in that last group */ dst[dIndex - 1] = '='; dst[dIndex - 2] = '='; } } static void encodeQuotedPrintable(NSMutableData *result, const unsigned char *src, unsigned length) { unsigned offset; unsigned column = 0; unsigned size = 0; unsigned i; unsigned char *dst; for (i = 0; i < length; i++) { unsigned char c = src[i]; int add; if ('\r' == c && i < length && '\n' == src[i + 1]) { /* A cr-lf sequence is an end of line, we send that literally * as a hard line break. */ i++; size += 2; column = 0; continue; } if (isWSP(c) && i < length && ('\r' == src[i + 1] || '\n' == src[i + 1])) { /* RFC 2045 says we have to encode space and tab characters when * they occur just before end of line. */ add = 3; } else if ('\t' == c || (c >= 32 && c <= 60) || (c >= 62 && c <= 126)) { /* Most characters can be sent literally. */ add = 1; } else { /* Everything else must be escaped. */ add = 3; } if (column + add > 75) { size += 3; // '=\r\n' column = 0; } size += add; column += add; } offset = [result length]; [result setLength: offset + size]; dst = (unsigned char*)[result mutableBytes]; column = 0; for (i = 0; i < length; i++) { unsigned char c = src[i]; int add; if ('\r' == c && i < length && '\n' == src[i + 1]) { /* A cr-lf sequence is an end of line, we send that literally * as a hard line break. */ i++; dst[offset++] = '\r'; dst[offset++] = '\n'; column = 0; continue; } if (isWSP(c) && i < length && ('\r' == src[i + 1] || '\n' == src[i + 1])) { /* RFC 2045 says we have to encode space and tab characters when * they occur just before end of line. */ add = 3; } else if ('\t' == c || (c >= 32 && c <= 60) || (c >= 62 && c <= 126)) { /* Most characters can be sent literally. */ add = 1; } else { /* Everything else must be escaped. */ add = 3; } if (column + add > 75) { dst[offset++] = '='; dst[offset++] = '\r'; dst[offset++] = '\n'; column = 0; } if (3 == add) { dst[offset++] = '='; dst[offset++] = hex[c >> 4]; dst[offset++] = hex[c & 15]; } else { dst[offset++] = c; } column += add; } } typedef enum { WE_QUOTED, WE_BASE64 } WE; /* * Name - decodeWord() * Params - dst destination * src where to start decoding from * end where to stop decoding (or NULL if end of buffer). * enc content-transfer-encoding * Purpose - Decode text with BASE64 or QUOTED-PRINTABLE codes. */ static unsigned char* decodeWord(unsigned char *dst, const unsigned char *src, const unsigned char *end, WE enc) { int c; if (enc == WE_QUOTED) { while (*src && (src != end)) { if (*src == '=') { src++; if (*src == '\0') { break; } if (('\n' == *src) || ('\r' == *src)) { break; } if (!isxdigit(src[0]) || !isxdigit(src[1])) { /* Strictly speaking the '=' must be followed by * two hexadecimal characters, but RFC2045 says that * 'A reasonable approach by a robust implementation might be * to include the "=" character and the following character * in the decoded data without any transformation' */ *dst++ = '='; *dst = *src; } else { int h; int l; /* Strictly speaking only uppercase characters are legal * here, but we tolerate lowercase too. */ h = isdigit(*src) ? (*src - '0') : (*src - 55); if (h > 15) h -= 32; // lowercase a-f src++; l = isdigit(*src) ? (*src - '0') : (*src - 55); if (l > 15) l -= 32; // lowercase a-f *dst = (h << 4) + l; } } else if (*src == '_') { *dst = '\040'; } else { *dst = *src; } dst++; src++; } *dst = '\0'; return dst; } else if (enc == WE_BASE64) { unsigned char buf[4]; NSUInteger pos = 0; while (*src && (src != end)) { c = *src++; if (isupper(c)) { c -= 'A'; } else if (islower(c)) { c = c - 'a' + 26; } else if (isdigit(c)) { c = c - '0' + 52; } else if (c == '/') { c = 63; } else if (c == '+') { c = 62; } else if (c == '=') { c = -1; } else if (c == '-') { break; /* end */ } else { c = -1; /* ignore */ } if (c >= 0) { buf[pos++] = c; if (pos == 4) { pos = 0; decodebase64(dst, buf); dst += 3; } } } if (pos > 0) { NSUInteger i; for (i = pos; i < 4; i++) { buf[i] = '\0'; } pos--; decodebase64(dst, buf); } dst += pos; *dst = '\0'; return dst; } else { NSLog(@"Unsupported encoding type"); return dst; } } static NSString * selectCharacterSet(NSString *str, NSData **d) { if ([str length] == 0) { *d = [NSData data]; return @"us-ascii"; // Default character set. } if ((*d = [str dataUsingEncoding: NSASCIIStringEncoding]) != nil) return @"us-ascii"; // Default character set. if ((*d = [str dataUsingEncoding: NSISOLatin1StringEncoding]) != nil) return @"iso-8859-1"; *d = [str dataUsingEncoding: NSUTF8StringEncoding]; return @"utf-8"; // Catch-all character set. } /** * Encode a word in a header according to RFC2047 if necessary. * For an ascii word, we just return the data. */ static NSData* wordData(NSString *word, BOOL *encoded) { NSData *d = nil; NSString *charset; charset = selectCharacterSet(word, &d); if ([charset isEqualToString: @"us-ascii"] == YES) { *encoded = NO; return d; } else { int len = [charset length]; char buf[len + 1]; NSMutableData *md; *encoded = YES; [charset getCString: buf maxLength: len + 1 encoding: NSISOLatin1StringEncoding]; md = [NSMutableData dataWithCapacity: [d length]*4/3 + len + 8]; d = [documentClass encodeBase64: d]; [md appendBytes: "=?" length: 2]; [md appendBytes: buf length: len]; [md appendBytes: "?B?" length: 3]; [md appendData: d]; [md appendBytes: "?=" length: 2]; return md; } } /** * Coding contexts are objects used by the parser to store the state of * decoding incoming data while it is being incrementally parsed.
* The most rudimentary context ... this is used for decoding plain * text and binary data (ie data which is not really decoded at all) * and all other decoding work is done by a subclass. */ @implementation GSMimeCodingContext /** * Returns the current value of the 'atEnd' flag. */ - (BOOL) atEnd { return atEnd; } /** * Copying is implemented as a simple retain. */ - (id) copyWithZone: (NSZone*)z { return RETAIN(self); } /** * Decode length bytes of data from sData and append the results to dData.
* Return YES on success, NO if there is an error. */ - (BOOL) decodeData: (const void*)sData length: (NSUInteger)length intoData: (NSMutableData*)dData { NSUInteger size = [dData length]; [dData setLength: size + length]; memcpy([dData mutableBytes] + size, sData, length); return YES; } /** * Sets the current value of the 'atEnd' flag. */ - (void) setAtEnd: (BOOL)flag { atEnd = flag; } @end @interface GSMimeBase64DecoderContext : GSMimeCodingContext { @public unsigned char buf[4]; NSUInteger pos; } @end @implementation GSMimeBase64DecoderContext - (BOOL) decodeData: (const void*)sData length: (NSUInteger)length intoData: (NSMutableData*)dData { NSUInteger size = [dData length]; unsigned char *src = (unsigned char*)sData; unsigned char *end = src + length; unsigned char *beg; unsigned char *dst; /* * Expand destination data buffer to have capacity to handle info. */ [dData setLength: size + (3 * (end + 8 - src))/4]; dst = (unsigned char*)[dData mutableBytes]; beg = dst; /* * Now decode data into buffer, keeping count and temporary * data in context. */ while (src < end) { int cc = *src++; if (isupper(cc)) { cc -= 'A'; } else if (islower(cc)) { cc = cc - 'a' + 26; } else if (isdigit(cc)) { cc = cc - '0' + 52; } else if (cc == '+') { cc = 62; } else if (cc == '/') { cc = 63; } else if (cc == '=') { [self setAtEnd: YES]; cc = -1; } else if (cc == '-') { [self setAtEnd: YES]; break; } else { cc = -1; /* ignore */ } if (cc >= 0) { buf[pos++] = cc; if (pos == 4) { pos = 0; decodebase64(dst, buf); dst += 3; } } } /* * Odd characters at end of decoded data need to be added separately. */ if ([self atEnd] == YES && pos > 0) { NSUInteger len = pos - 1; while (pos < 4) { buf[pos++] = '\0'; } pos = 0; decodebase64(dst, buf); size += len; } [dData setLength: size + dst - beg]; return YES; } @end @interface GSMimeQuotedDecoderContext : GSMimeCodingContext { @public unsigned char buf[4]; NSUInteger pos; } @end @implementation GSMimeQuotedDecoderContext - (BOOL) decodeData: (const void*)sData length: (NSUInteger)length intoData: (NSMutableData*)dData { NSUInteger size = [dData length]; unsigned char *src = (unsigned char*)sData; unsigned char *end = src + length; unsigned char *beg; unsigned char *dst; /* * Expand destination data buffer to have capacity to handle info. */ [dData setLength: size + (end - src)]; dst = (unsigned char*)[dData mutableBytes]; beg = dst; while (src < end) { if (pos > 0) { if (1 == pos && '\r' == *src) { pos++; } else if (*src == '\n') { pos = 0; } else { buf[pos++] = *src; if (pos == 3) { BOOL ok = YES; int c; int val; pos = 0; c = buf[1]; if (isxdigit(c)) { if (islower(c)) c = toupper(c); val = isdigit(c) ? (c - '0') : (c - 55); val *= 0x10; c = buf[2]; if (isxdigit(c)) { if (islower(c)) c = toupper(c); val += isdigit(c) ? (c - '0') : (c - 55); } else { ok = NO; } } else { ok = NO; } if (YES == ok) { *dst++ = val; } else { /* A bad escape sequence is copied literally. */ *dst++ = '='; *dst++ = buf[0]; *dst++ = buf[1]; } } } } else if (*src == '=') { buf[pos++] = '='; } else { *dst++ = *src; } src++; } [dData setLength: size + dst - beg]; return YES; } @end @interface GSMimeChunkedDecoderContext : GSMimeCodingContext { @public unsigned char buf[8]; NSUInteger pos; enum { ChunkSize, // Reading chunk size ChunkExt, // Reading chunk extensions ChunkEol1, // Reading end of line after size;ext ChunkData, // Reading chunk data ChunkEol2, // Reading end of line after data ChunkFoot, // Reading chunk footer after newline ChunkFootA // Reading chunk footer } state; NSUInteger size; // Size of buffer required. NSMutableData *data; } @end @implementation GSMimeChunkedDecoderContext - (void) dealloc { RELEASE(data); [super dealloc]; } - (id) init { self = [super init]; if (self != nil) { data = [NSMutableData new]; } return self; } @end /** * Inefficient ... copies data into output object and only performs * the actual decoding at the end. */ @interface GSMimeUUCodingContext : GSMimeCodingContext @end @implementation GSMimeUUCodingContext - (BOOL) decodeData: (const void*)sData length: (NSUInteger)length intoData: (NSMutableData*)dData { [super decodeData: sData length: length intoData: dData]; if ([self atEnd] == YES) { NSMutableData *dec; dec = [[NSMutableData alloc] initWithCapacity: [dData length]]; [dData uudecodeInto: dec name: 0 mode: 0]; [dData setData: dec]; RELEASE(dec); } return YES; } @end @interface GSMimeParser (Private) - (void) _child; - (BOOL) _decodeBody: (NSData*)d; - (NSString*) _decodeHeader; - (NSRange) _endOfHeaders: (NSData*)newData; - (BOOL) _scanHeaderParameters: (NSScanner*)scanner into: (GSMimeHeader*)info; @end /** *

* This class provides support for parsing MIME messages * into GSMimeDocument objects. Each parser object maintains * an associated document into which data is stored. *

*

* You supply the document to be parsed as one or more data * items passed to the -parse: method, and (if * the method always returns YES, you give it * a final nil argument to mark the end of the * document. *

*

* On completion of parsing a valid document, the * [GSMimeParser-mimeDocument] method returns the * resulting parsed document. *

*

If you need to parse faulty documents (eg where a faulty mail client * has produced an email which does not conform to the MIME standards), you * should look at the -setBuggyQuotes: and -setDefaultCharset: methods, which * are designed to cope with the most common faults. *

*/ @implementation GSMimeParser /** * Convenience method to parse a single data item as a MIME message * and return the resulting document. */ + (GSMimeDocument*) documentFromData: (NSData*)mimeData { GSMimeDocument *newDocument = nil; GSMimeParser *parser = [GSMimeParser new]; if ([parser parse: mimeData] == YES) { [parser parse: nil]; } if ([parser isComplete] == YES) { newDocument = [parser mimeDocument]; IF_NO_ARC(RETAIN(newDocument);) } RELEASE(parser); return AUTORELEASE(newDocument); } + (void) initialize { if (NSArrayClass == 0) { NSArrayClass = [NSArray class]; } if (NSDataClass == 0) { NSDataClass = [NSData class]; } if (NSStringClass == 0) { NSStringClass = [NSString class]; } if (documentClass == 0) { documentClass = [GSMimeDocument class]; } if (headerClass == 0) { headerClass = [GSMimeHeader class]; } } /** * Create and return a parser. */ + (GSMimeParser*) mimeParser { return AUTORELEASE([[self alloc] init]); } /** * Return a coding context object to be used for decoding data * according to the scheme specified in the header. *

* The default implementation supports the following transfer * encodings specified in either a transfer-encoding * of content-transfer-encoding header - *

* * base64 * quoted-printable * binary (no coding actually performed) * 7bit (no coding actually performed) * 8bit (no coding actually performed) * chunked (for HTTP/1.1) * x-uuencode * * To add new coding schemes to the parser, you need to override * this method to return a new coding context for your scheme * when the info argument indicates that this is appropriate. */ - (GSMimeCodingContext*) contextFor: (GSMimeHeader*)info { NSString *name; NSString *value; if (info == nil) { return AUTORELEASE([GSMimeCodingContext new]); } name = [info name]; if ([name isEqualToString: @"content-transfer-encoding"] == YES || [name isEqualToString: @"transfer-encoding"] == YES) { value = [[info value] lowercaseString]; if ([value length] == 0) { NSLog(@"Bad value for %@ header - assume binary encoding", name); return AUTORELEASE([GSMimeCodingContext new]); } if ([value isEqualToString: CteBase64] == YES) { return AUTORELEASE([GSMimeBase64DecoderContext new]); } else if ([value isEqualToString: CteQuotedPrintable] == YES) { return AUTORELEASE([GSMimeQuotedDecoderContext new]); } else if ([value isEqualToString: CteBinary] == YES) { return AUTORELEASE([GSMimeCodingContext new]); } else if ([value isEqualToString: Cte7bit] == YES) { return AUTORELEASE([GSMimeCodingContext new]); } else if ([value isEqualToString: Cte8bit] == YES) { return AUTORELEASE([GSMimeCodingContext new]); } else if ([value isEqualToString: @"chunked"] == YES) { return AUTORELEASE([GSMimeChunkedDecoderContext new]); } else if ([value isEqualToString: CteXuuencode] == YES) { return AUTORELEASE([GSMimeUUCodingContext new]); } } NSLog(@"contextFor: - unknown header (%@) ... assumed binary encoding", name); return AUTORELEASE([GSMimeCodingContext new]); } /** * Return the data accumulated in the parser. If the parser is * still parsing headers, this will be the header data read so far. * If the parse has parsed the body of the message, this will be * the data of the body, with any transfer encoding removed. */ - (NSMutableData*) data { return data; } - (void) dealloc { RELEASE(data); RELEASE(child); RELEASE(context); RELEASE(boundary); RELEASE(document); [super dealloc]; } /** *

* Decodes the raw data from the specified range in the source * data object and appends it to the destination data object. * The context object provides information about the content * encoding type in use, and the state of the decoding operation. *

*

* This method may be called repeatedly to incrementally decode * information as it arrives on some communications channel. * It should be called with a nil source data item (or with * the atEnd flag of the context set to YES) in order to flush * any information held in the context to the output data * object. *

*

* You may override this method in order to implement additional * coding schemes, but usually it should be enough for you to * implement a custom GSMimeCodingContext subclass fotr this method * to use. *

*/ - (BOOL) decodeData: (NSData*)sData fromRange: (NSRange)aRange intoData: (NSMutableData*)dData withContext: (GSMimeCodingContext*)con { NSUInteger len = [sData length]; BOOL result = YES; if (dData == nil || [con isKindOfClass: [GSMimeCodingContext class]] == NO) { [NSException raise: NSInvalidArgumentException format: @"[%@ -%@] bad destination data for decode", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; } GS_RANGE_CHECK(aRange, len); /* * Chunked decoding is relatively complex ... it makes sense to do it * here, in order to make use of parser facilities, rather than having * the decoding context do the work. In this case the context is used * solely to store state information. */ if ([con class] == [GSMimeChunkedDecoderContext class]) { GSMimeChunkedDecoderContext *ctxt; NSUInteger size = [dData length]; unsigned char *buf; unsigned char *beg; unsigned char *dst; const char *src; const char *end; const char *footers; BOOL atEnd; ctxt = (GSMimeChunkedDecoderContext*)con; /* Get pointers into source data buffer. */ src = (const char *)[sData bytes]; footers = src; src += aRange.location; end = src + aRange.length; beg = 0; /* Make sure buffer is big enough, and set up output pointers. * ctxt->size is the amount of data laready decoded, so if we * add the size of the chunked source data we are guaranteed * to have enough space for the unchunked data. */ [dData setLength: ctxt->size + [sData length]]; buf = (unsigned char*)[dData mutableBytes]; dst = buf + size; beg = dst; atEnd = [ctxt atEnd]; while (NO == atEnd && src < end) { switch (ctxt->state) { case ChunkSize: if (isxdigit(*src) && ctxt->pos < sizeof(ctxt->buf)) { ctxt->buf[ctxt->pos++] = *src; } else if (*src == ';') { ctxt->state = ChunkExt; } else if (*src == '\r') { ctxt->state = ChunkEol1; } else if (*src == '\n') { ctxt->state = ChunkData; } src++; if (ctxt->state != ChunkSize) { NSUInteger val = 0; NSUInteger index; for (index = 0; index < ctxt->pos; index++) { val *= 16; if (isdigit(ctxt->buf[index])) { val += ctxt->buf[index] - '0'; } else if (isupper(ctxt->buf[index])) { val += ctxt->buf[index] - 'A' + 10; } else { val += ctxt->buf[index] - 'a' + 10; } } ctxt->pos = val; /* If we have read a chunk already, make sure that our * destination size stored in context is updated before * resetting the destination pointer for a new chunk. */ size += (dst - beg); ctxt->size = size + val; beg = dst; } break; case ChunkExt: if (*src == '\r') { ctxt->state = ChunkEol1; } else if (*src == '\n') { ctxt->state = ChunkData; } src++; break; case ChunkEol1: if (*src == '\n') { ctxt->state = ChunkData; } src++; break; case ChunkData: /* * If the pos is non-zero, we have a data chunk to read. * otherwise, what we actually want is to read footers. */ if (ctxt->pos > 0) { *dst++ = *src++; if (--ctxt->pos == 0) { ctxt->state = ChunkEol2; } } else { footers = src; // Record start position. ctxt->state = ChunkFoot; } break; case ChunkEol2: if (*src == '\n') { ctxt->state = ChunkSize; } src++; break; case ChunkFoot: if (*src == '\r') { src++; } else if (*src == '\n') { atEnd = YES; [ctxt setAtEnd: atEnd]; } else { ctxt->state = ChunkFootA; } break; case ChunkFootA: if (*src == '\n') { ctxt->state = ChunkFootA; } src++; break; } } if (ctxt->state == ChunkFoot || ctxt->state == ChunkFootA) { [ctxt->data appendBytes: footers length: src - footers]; if (YES == atEnd) { NSMutableData *old; /* * Pretend we are back parsing the original headers ... */ old = data; data = ctxt->data; bytes = (unsigned char*)[data mutableBytes]; dataEnd = [data length]; flags.inBody = 0; /* * Duplicate the normal header parsing process for our footers. */ while (flags.inBody == 0) { NSString *header; header = [self _decodeHeader]; if (header == nil) { break; } if ([self parseHeader: header] == NO) { flags.hadErrors = 1; break; } } /* * restore original data. */ ctxt->data = data; data = old; bytes = (unsigned char*)[data mutableBytes]; dataEnd = [data length]; flags.inBody = 1; } } /** Correct the size of the output buffer (shrink back from the * original allocation to the actual unchunked size). */ [dData setLength: size + dst - beg]; } else { result = [con decodeData: [sData bytes] + aRange.location length: aRange.length intoData: dData]; } /* * A nil data item as input represents end of data. */ if (sData == nil) { [con setAtEnd: YES]; } return result; } - (NSString*) description { NSString *desc; desc = [NSMutableString stringWithFormat: @"%@ - %@", [super description], document]; return desc; } /** * * Returns the object into which raw mime data is being parsed. */ - (id) document { return document; } /** If there was more data passed to the parser than actually needed to * form the document, this method returns that excess data, othrwise it * returns nil. */ - (NSData*) excess { if (flags.excessData == 1) { return boundary; } return nil; } /** * This method may be called to tell the parser that it should not expect * to parse any headers, and that the data it will receive is body data.
* If the parse is already in the body, or is complete, this method has * no effect.
* This is for use when some other utility has been used to parse headers, * and you have set the headers of the document owned by the parser * accordingly. You can then use the GSMimeParser to read the body data * into the document. */ - (void) expectNoHeaders { if (flags.complete == 0) { flags.inBody = 1; } } /** * Returns YES if the document parsing is known to be completed successfully. * Returns NO if either more data is needed, or if the parser encountered an * error. */ - (BOOL) isComplete { if (flags.hadErrors == 1) { return NO; } return (flags.complete == 1) ? YES : NO; } /** * Returns YES if the parser is parsing an HTTP document rather than * a true MIME document. */ - (BOOL) isHttp { return (flags.isHttp == 1) ? YES : NO; } /** * Returns YES if all the document headers have been parsed but * the document body parsing may not yet be complete. */ - (BOOL) isInBody { return (flags.inBody == 1) ? YES : NO; } /** * Returns YES if parsing of the document headers has not yet * been completed. */ - (BOOL) isInHeaders { if (flags.inBody == 1) return NO; if (flags.complete == 1) return NO; return YES; } - (id) init { self = [super init]; if (self != nil) { document = [[documentClass alloc] init]; data = [NSMutableData new]; _defaultEncoding = NSASCIIStringEncoding; } return self; } /** * Returns the GSMimeDocument instance into which data is being parsed * or has been parsed. */ - (GSMimeDocument*) mimeDocument { return document; } /** *

* This method is called repeatedly to pass raw mime data into * the parser. It returns YES as long as it wants * more data to complete parsing of a document, and NO * if parsing is complete, either due to having reached the end of * a document or due to an error. *

*

* Since it is not always possible to determine if the end of a * MIME document has been reached from its content, the method * may need to be called with a nil or empty argument after you have * passed all the data to it ... this tells it that the data * is complete. *

*

* The parser attempts to be as flexible as possible and to continue * parsing wherever it can. If an error occurs in parsing, the * -isComplete method will always return NO, even after the -parse: * method has been called with a nil argument. *

*

* A multipart document will be parsed to content consisting of an * NSArray of GSMimeDocument instances representing each part.
* Otherwise, a document will become content of type NSData, unless * it is of content type text, in which case it will be an * NSString.
* If a document has no content type specified, it will be treated as * text, unless it is identifiable as a file * (eg. t has a content-disposition header containing a filename parameter). *

*/ - (BOOL) parse: (NSData*)d { if (1 == flags.complete || 1 == flags.hadErrors) { return NO; /* Already completely parsed or failed! */ } if ([d length] > 0) { if (0 == flags.inBody) { if ([self parseHeaders: d remaining: &d] == YES) { return YES; } } if ([d length] > 0) { if (1 == flags.inBody) { /* * We can't just re-call -parse: ... * that would lead to recursion. */ return [self _decodeBody: d]; } else { return [self parse: d]; } } if (1 == flags.complete) { return NO; } return YES; /* Want more data for body */ } else { if (1 == flags.wantEndOfLine) { [self parse: [NSData dataWithBytes: "\r\n" length: 2]]; } else if (1 == flags.inBody) { [self _decodeBody: d]; } else { /* * If still parsing headers, add CR-LF sequences to terminate * the headers. */ [self parse: [NSData dataWithBytes: "\r\n\r\n" length: 4]]; } flags.wantEndOfLine = 0; flags.inBody = 0; flags.complete = 1; /* Finished parsing */ return NO; /* Want no more data */ } } - (BOOL) parseHeaders: (NSData*)d remaining: (NSData**)body { GSMimeHeader *info; GSMimeHeader *hdr; NSRange r; NSUInteger l = [d length]; if (flags.complete == 1 || flags.inBody == 1) { return NO; /* Headers already parsed! */ } if (body != 0) { *body = nil; } if (l == 0) { /* Add an empty line to the end of the current headers to force * completion of header parsing. */ [self parseHeaders: [NSData dataWithBytes: "\r\n\r\n" length: 4] remaining: 0]; flags.wantEndOfLine = 0; flags.excessData = 0; flags.inBody = 0; flags.complete = 1; /* Finished parsing */ return NO; /* Want no more data */ } NSDebugMLLog(@"GSMime", @"Parse %u bytes - '%*.*s'", (unsigned)l, (unsigned)l, (unsigned)l, (char*)[d bytes]); r = [self _endOfHeaders: d]; if (r.location == NSNotFound) { [data appendBytes: [d bytes] length: [d length]]; bytes = (unsigned char*)[data bytes]; dataEnd = [data length]; /* Fall through to parse the headers so far. */ } else { NSUInteger i = NSMaxRange(r); i -= [data length]; // Bytes to append to headers [data appendBytes: [d bytes] length: i]; bytes = (unsigned char*)[data bytes]; dataEnd = [data length]; if (l > i) { /* NB. Take care ... the data object we create does not own or * free its storage. */ d = [[[NSData alloc] initWithBytesNoCopy: (void*)([d bytes] + i) length: l - i freeWhenDone: NO] autorelease]; } else { d = nil; } if (body != 0) { *body = d; } } while (flags.inBody == 0) { NSString *header; header = [self _decodeHeader]; if (header == nil) { if (1 == flags.hadErrors) { return NO; /* Couldn't handle words. */ } else if (0 == flags.inBody) { return YES; /* need more data */ } } else if ([self parseHeader: header] == NO) { flags.hadErrors = 1; return NO; /* Header not parsed properly. */ } } /* * All headers have been parsed, so we empty our internal buffer * (which we will now use to store decoded data) */ [data setLength: 0]; bytes = 0; input = 0; /* * We have finished parsing the headers, but we may have http * continuation header(s), in which case, we must start parsing * headers again. */ info = [document _lastHeaderNamed: @"http"]; if (info != nil && flags.isHttp == 1) { NSNumber *num; num = [info objectForKey: NSHTTPPropertyStatusCodeKey]; if (num != nil) { int v = [num intValue]; if (v >= 100 && v < 200) { /* * This is an intermediary response ... so we have * to restart the parsing operation! */ NSDebugMLLog(@"GSMime", @"%@", @"Parsed http continuation"); flags.inBody = 0; if ([d length] == 0) { /* We need more data, so we have to return YES * to ask our caller to provide it. */ return YES; } return [self parseHeaders: d remaining: body]; } } } /* * If there is a zero content length, all parsing is complete, * not just header parsing. */ if (flags.headersOnly == 1 || ((hdr = [document headerNamed: @"content-length"]) != nil && [[hdr value] intValue] == 0)) { [document setContent: @""]; flags.inBody = 0; flags.complete = 1; /* If we have more data after the headers ... it's excess and * should become available as excess data. */ if ([d length] > 0) { /* NB. We must copy the bytes from 'd' as that object doesn't * own its storage. */ RELEASE(boundary); boundary = [[NSData alloc] initWithBytes: [d bytes] length: [d length]]; flags.excessData = 1; } } return NO; // No more data needed } /** *

* This method is called to parse a header line for the * current document, split its contents into a GSMimeHeader * object, and add that information to the document.
* The method is normally used internally by the -parse: method, * but you may also call it to parse an entire header line and * add it to the document (this may be useful in conjunction * with the -expectNoHeaders method, to parse a document body data * into a document where the headers are available from a * separate source). *

* * GSMimeParser *parser = [GSMimeParser mimeParser]; * * [parser parseHeader: @"content-type: text/plain"]; * [parser expectNoHeaders]; * [parser parse: bodyData]; * [parser parse: nil]; * *

* The standard implementation of this method scans the header * name and then calls -scanHeaderBody:into: to complete the * parsing of the header. *

*

* This method also performs consistency checks on headers scanned * so it is recommended that it is not overridden, but that * subclasses override -scanHeaderBody:into: to * implement custom scanning. *

*

* As a special case, for HTTP support, this method also parses * lines in the format of HTTP responses as if they were headers * named http. The resulting header object contains * additional object values - *

* * HttpMajorVersion * The first part of the version number * HttpMinorVersion * The second part of the version number * NSHTTPPropertyServerHTTPVersionKey * The full HTTP protocol version number * NSHTTPPropertyStatusCodeKey * The HTTP status code (numeric) * NSHTTPPropertyStatusReasonKey * The text message (if any) after the status code * */ - (BOOL) parseHeader: (NSString*)aHeader { NSScanner *scanner = [NSScanner scannerWithString: aHeader]; NSString *name; NSString *value; GSMimeHeader *info; NSDebugMLLog(@"GSMime", @"Parse header - '%@'", aHeader); /* * Special case - permit web response status line to act like a header. */ if ([scanner scanString: @"HTTP/" intoString: &name] == YES) { name = @"HTTP"; } else { if ([scanner scanUpToString: @":" intoString: &name] == NO) { NSLog(@"Not a valid header (%@)", [scanner string]); return NO; } /* * Position scanner after colon and any white space. */ if ([scanner scanString: @":" intoString: 0] == NO) { NSLog(@"No colon terminating name in header (%@)", [scanner string]); return NO; } } /* * Set the header name. */ info = [headerClass headerWithName: name value: nil parameters: nil]; name = [info name]; /* * Break header fields out into info dictionary. */ if ([self scanHeaderBody: scanner into: info] == NO) { return NO; } /* * Check validity of broken-out header fields. */ if ([name isEqualToString: @"mime-version"] == YES) { int majv = 0; int minv = 0; value = [info value]; if ([value length] == 0) { NSLog(@"Missing value for mime-version header"); return NO; } if (sscanf([value UTF8String], "%d.%d", &majv, &minv) != 2) { NSLog(@"Bad value for mime-version header (%@)", value); return NO; } [document deleteHeaderNamed: name]; // Should be unique } else if ([name isEqualToString: CteContentType] == YES) { NSString *tmp = [info parameterForKey: @"boundary"]; NSString *type; NSString *subtype; DESTROY(boundary); if (tmp != nil) { NSUInteger l = [tmp length]; unsigned char *b; b = NSZoneMalloc(NSDefaultMallocZone(), l + 3); b[0] = '-'; b[1] = '-'; [tmp getCString: (char*)&b[2] maxLength: l + 1 encoding: NSISOLatin1StringEncoding]; boundary = [[NSData alloc] initWithBytesNoCopy: b length: l + 2]; } type = [info objectForKey: @"Type"]; if ([type length] == 0) { NSLog(@"Missing Mime content-type"); return NO; } subtype = [info objectForKey: @"Subtype"]; if ([type isEqualToString: @"text"] == YES) { if (subtype == nil) { subtype = @"plain"; [info setObject: subtype forKey: @"Subtype"]; } } else if ([type isEqualToString: @"multipart"] == YES) { if (subtype == nil) { subtype = @"mixed"; [info setObject: subtype forKey: @"Subtype"]; } if (boundary == nil) { NSLog(@"multipart message without boundary"); return NO; } } else { if (subtype == nil) { subtype = @"octet-stream"; [info setObject: subtype forKey: @"Subtype"]; } } [document deleteHeaderNamed: name]; // Should be unique } NS_DURING [document addHeader: info]; NS_HANDLER return NO; NS_ENDHANDLER NSDebugMLLog(@"GSMime", @"Header parsed - %@", info); return YES; } /** *

* This method is called to parse a header line and split its * contents into the supplied [GSMimeHeader] instance. *

*

* On entry, the header (info) is already partially filled, * the name is a lowercase representation of the * header name. The the scanner must be set to a scan location * immediately after the colon in the original header string * (ie to the header value string). *

*

* If the header is parsed successfully, the method should * return YES, otherwise NO. *

*

* You would not normally call this method directly yourself, * but may override it to support parsing of new headers.
* If you do call this yourself, you need to be aware that it * may change the state of the document in the parser. *

*

* You should be aware of the parsing that the standard * implementation performs, and that needs to be * done for certain headers in order to permit the parser to * work generally - *

* * content-disposition * * * Value * * The content disposition (excluding parameters) as a * lowercase string. * * * * content-type * * * Subtype * The MIME subtype lowercase * Type * The MIME type lowercase * value * The full MIME type (xxx/yyy) in lowercase * * * content-transfer-encoding * * * Value * The transfer encoding type in lowercase * * * http * * * HttpVersion * The HTTP protocol version number * HttpMajorVersion * The first component of the version number * HttpMinorVersion * The second component of the version number * HttpStatus * The response status value (numeric code) * Value * The text message (if any) * * * transfer-encoding * * * Value * The transfer encoding type in lowercase * * * */ - (BOOL) scanHeaderBody: (NSScanner*)scanner into: (GSMimeHeader*)info { NSString *name = [info name]; NSString *value = nil; [self scanPastSpace: scanner]; /* * Now see if we are interested in any of it. */ if ([name isEqualToString: @"http"] == YES) { int loc = [scanner scanLocation]; int major; int minor; int status; NSUInteger count; NSArray *hdrs; if ([scanner scanInt: &major] == NO || major < 0) { NSLog(@"Bad value for http major version in %@", [scanner string]); return NO; } if ([scanner scanString: @"." intoString: 0] == NO) { NSLog(@"Bad format for http version in %@", [scanner string]); return NO; } if ([scanner scanInt: &minor] == NO || minor < 0) { NSLog(@"Bad value for http minor version in %@", [scanner string]); return NO; } if ([scanner scanInt: &status] == NO || status < 0) { NSLog(@"Bad value for http status in %@", [scanner string]); return NO; } [info setObject: [NSStringClass stringWithFormat: @"%d", minor] forKey: @"HttpMinorVersion"]; [info setObject: [NSStringClass stringWithFormat: @"%d.%d", major, minor] forKey: @"HttpVersion"]; [info setObject: [NSStringClass stringWithFormat: @"%d", major] forKey: NSHTTPPropertyServerHTTPVersionKey]; [info setObject: [NSNumber numberWithInt: status] forKey: NSHTTPPropertyStatusCodeKey]; [self scanPastSpace: scanner]; value = [[scanner string] substringFromIndex: [scanner scanLocation]]; [info setObject: value forKey: NSHTTPPropertyStatusReasonKey]; value = [[scanner string] substringFromIndex: loc]; /* * Get rid of preceding headers in case this is a continuation. */ hdrs = [document allHeaders]; for (count = 0; count < [hdrs count]; count++) { GSMimeHeader *h = [hdrs objectAtIndex: count]; [document deleteHeader: h]; } /* * Mark to say we are parsing HTTP content */ [self setIsHttp]; } else if ([name isEqualToString: @"content-transfer-encoding"] == YES || [name isEqualToString: @"transfer-encoding"] == YES) { value = [self scanToken: scanner]; if ([value length] == 0) { NSLog(@"Bad value for content-transfer-encoding header in %@", [scanner string]); return NO; } value = [value lowercaseString]; } else if ([name isEqualToString: CteContentType] == YES) { NSString *type; NSString *subtype = nil; type = [self scanName: scanner]; if ([type length] == 0) { NSLog(@"Invalid Mime content-type in %@", [scanner string]); return NO; } type = [type lowercaseString]; [info setObject: type forKey: @"Type"]; if ([scanner scanString: @"/" intoString: 0] == YES) { subtype = [self scanName: scanner]; if ([subtype length] == 0) { NSLog(@"Invalid Mime content-type (subtype) in %@", [scanner string]); return NO; } subtype = [subtype lowercaseString]; [info setObject: subtype forKey: @"Subtype"]; value = [NSStringClass stringWithFormat: @"%@/%@", type, subtype]; } else { value = type; } [self _scanHeaderParameters: scanner into: info]; } else if ([name isEqualToString: @"content-disposition"] == YES) { value = [self scanName: scanner]; value = [value lowercaseString]; /* * Concatenate slash separated parts of field. */ while ([scanner scanString: @"/" intoString: 0] == YES) { NSString *sub = [self scanName: scanner]; if ([sub length] > 0) { sub = [sub lowercaseString]; value = [NSStringClass stringWithFormat: @"%@/%@", value, sub]; } } /* * Expect anything else to be 'name=value' parameters. */ [self _scanHeaderParameters: scanner into: info]; } else { int loc; [self scanPastSpace: scanner]; loc = [scanner scanLocation]; value = [[scanner string] substringFromIndex: loc]; } if (value != nil) { [info setValue: value]; } return YES; } /** * A convenience method to use a scanner (that is set up to scan a * header line) to scan a name - a simple word. * * Leading whitespace is ignored. * */ - (NSString*) scanName: (NSScanner*)scanner { NSString *value; [self scanPastSpace: scanner]; /* * Scan value terminated by any MIME special character. */ if ([scanner scanUpToCharactersFromSet: rfc2045Specials intoString: &value] == NO) { return nil; } return value; } /** * A convenience method to scan past any whitespace in the scanner * in preparation for scanning something more interesting that * comes after it. Returns YES if any space was read, NO otherwise. */ - (BOOL) scanPastSpace: (NSScanner*)scanner { NSCharacterSet *skip; BOOL scanned; skip = RETAIN([scanner charactersToBeSkipped]); [scanner setCharactersToBeSkipped: nil]; scanned = [scanner scanCharactersFromSet: whitespace intoString: 0]; [scanner setCharactersToBeSkipped: skip]; RELEASE(skip); return scanned; } /** * A convenience method to use a scanner (that is set up to scan a * header line) to scan in a special character that terminated a * token previously scanned. If the token was terminated by * whitespace and no other special character, the string returned * will contain a single space character. */ - (NSString*) scanSpecial: (NSScanner*)scanner { NSCharacterSet *specials; NSUInteger location; unichar c; [self scanPastSpace: scanner]; if (flags.isHttp == 1) { specials = rfc822Specials; } else { specials = rfc2045Specials; } /* * Now return token delimiter (may be whitespace) */ location = [scanner scanLocation]; c = [[scanner string] characterAtIndex: location]; if ([specials characterIsMember: c] == YES) { [scanner setScanLocation: location + 1]; return [NSStringClass stringWithCharacters: &c length: 1]; } else { return @" "; } } /** * A convenience method to use a scanner (that is set up to scan a * header line) to scan a header token - either a quoted string or * a simple word. * * Leading whitespace is ignored. * Backslash escapes in quoted text are converted * */ - (NSString*) scanToken: (NSScanner*)scanner { [self scanPastSpace: scanner]; if ([scanner scanString: @"\"" intoString: 0] == YES) // Quoted { NSString *string = [scanner string]; NSUInteger length = [string length]; NSUInteger start = [scanner scanLocation]; NSRange r = NSMakeRange(start, length - start); BOOL done = NO; while (done == NO) { r = [string rangeOfString: @"\"" options: NSLiteralSearch range: r]; if (r.length == 0) { NSLog(@"Parsing header value - found unterminated quoted string"); return nil; } if ([string characterAtIndex: r.location - 1] == '\\') { int p; /* * Count number of escape ('\') characters ... if it's odd * then the quote has been escaped and is not a closing * quote. */ p = r.location; while (p > 0 && [string characterAtIndex: p - 1] == '\\') { p--; } p = r.location - p; if (p % 2 == 1) { r.location++; r.length = length - r.location; } else { done = YES; } } else { done = YES; } } [scanner setScanLocation: r.location + 1]; length = r.location - start; if (length == 0) { return @""; } else { unichar buf[length]; unichar *src = buf; unichar *dst = buf; [string getCharacters: buf range: NSMakeRange(start, length)]; while (src < &buf[length]) { if (*src == '\\') { src++; if (flags.buggyQuotes == 1 && *src != '\\' && *src != '"') { *dst++ = '\\'; // Buggy use of escape in quotes. } } *dst++ = *src++; } return [NSStringClass stringWithCharacters: buf length: dst - buf]; } } else // Token { NSCharacterSet *specials; NSString *value; if (flags.isHttp == 1) { specials = rfc822Specials; } else { specials = rfc2045Specials; } /* * Move past white space. */ [self scanPastSpace: scanner]; /* * Scan value terminated by any special character. */ if ([scanner scanUpToCharactersFromSet: specials intoString: &value] == NO) { return nil; } return value; } } /** * Method to inform the parser that the data it is parsing is likely to * contain fields with buggy use of backslash quotes ... and it should * try to be tolerant of them and treat them as is they were escaped * backslashes. This is for use with things like microsoft internet * explorer, which puts the backslashes used as file path separators * in parameters without quoting them. */ - (void) setBuggyQuotes: (BOOL)flag { if (flag) { flags.buggyQuotes = 1; } else { flags.buggyQuotes = 0; } } /** This is a method to inform the parser that body parts with no content-type * header (which are treated as text/plain) should use the specified * characterset rather than the default (us-ascii).
* This also controls the parsing of headers ... in a legal MIME document * these must consist solely of us-ascii characters, but setting a different * default characterset (such as latin1) will permit many illegal header * lines (produced by faulty mail clients) to be parsed.
* HTTP requests use headers in the latin1 characterset, so this is the * header line characterset used most commonly by faulty clients. */ - (void) setDefaultCharset: (NSString*)aName { _defaultEncoding = [documentClass encodingFromCharset: aName]; if (_defaultEncoding == 0) { _defaultEncoding = NSASCIIStringEncoding; } } /** * Method to inform the parser that only the headers should be parsed * and any remaining data be treated as excess */ - (void) setHeadersOnly { flags.headersOnly = 1; } /** * Method to inform the parser that the data it is parsing is an HTTP * document rather than true MIME. This method is called internally * if the parser detects an HTTP response line at the start of the * headers it is parsing. */ - (void) setIsHttp { flags.isHttp = 1; } @end @implementation GSMimeParser (Private) /* * Make a new child to parse a subsidiary document */ - (void) _child { DESTROY(child); child = [GSMimeParser new]; if (1 == flags.buggyQuotes) { [child setBuggyQuotes: YES]; } if (1 == flags.isHttp) { [child setIsHttp]; } /* * Tell child parser the default encoding to use. */ child->_defaultEncoding = _defaultEncoding; } /* * Return YES if more data is needed, NO if the body has been completely * parsed. */ - (BOOL) _decodeBody: (NSData*)d { NSUInteger l = [d length]; BOOL needsMore = YES; rawBodyLength += l; if (context == nil) { GSMimeHeader *hdr; expect = 0; /* * Check for expected content length. */ hdr = [document headerNamed: @"content-length"]; if (hdr != nil) { expect = [[hdr value] intValue]; } /* * Set up context for decoding data. */ hdr = [document headerNamed: @"transfer-encoding"]; if (hdr == nil) { hdr = [document headerNamed: @"content-transfer-encoding"]; } else if ([[[hdr value] lowercaseString] isEqualToString: @"chunked"]) { /* * Chunked transfer encoding overrides any content length spec. */ expect = 0; } context = [self contextFor: hdr]; IF_NO_ARC([context retain];) NSDebugMLLog(@"GSMime", @"Parse body expects %u bytes", expect); } NSDebugMLLog(@"GSMime", @"Parse %u bytes - '%*.*s'", (unsigned)l, (unsigned)l, (unsigned)l, (char*)[d bytes]); // NSDebugMLLog(@"GSMime", @"Boundary - '%*.*s'", [boundary length], [boundary length], [boundary bytes]); if ([context atEnd] == YES) { flags.inBody = 0; flags.complete = 1; if ([d length] > 0) { NSLog(@"Additional data (%*.*s) ignored after parse complete", (unsigned)[d length], (unsigned)[d length], (char*)[d bytes]); } needsMore = NO; /* Nothing more to do */ } else if (boundary == nil) { GSMimeHeader *typeInfo; NSString *type; typeInfo = [document headerNamed: CteContentType]; type = [typeInfo objectForKey: @"Type"]; if ([type isEqualToString: @"multipart"] == YES) { NSLog(@"multipart decode attempt without boundary"); flags.inBody = 0; flags.complete = 1; needsMore = NO; } else { NSUInteger dLength = [d length]; if (expect > 0 && rawBodyLength > expect) { NSData *excess; dLength -= (rawBodyLength - expect); rawBodyLength = expect; excess = [d subdataWithRange: NSMakeRange(dLength, [d length] - dLength)]; ASSIGN(boundary, excess); flags.excessData = 1; } [self decodeData: d fromRange: NSMakeRange(0, dLength) intoData: data withContext: context]; if ([context atEnd] == YES || (expect > 0 && rawBodyLength >= expect)) { NSString *subtype = [typeInfo objectForKey: @"Subtype"]; flags.inBody = 0; flags.complete = 1; NSDebugMLLog(@"GSMime", @"%@", @"Parse body complete"); /* * If no content type is supplied, we assume text ... unless * we have something that's known to be a file. */ if (type == nil) { if ([document contentFile] != nil) { type = @"application"; subtype= @"octet-stream"; } else { type = @"text"; subtype= @"plain"; } } /* We assume any text data is best treated as a string * unless it's some format we will probably be parsing. */ if ([type isEqualToString: @"text"] == YES && [subtype isEqualToString: @"xml"] == NO && [subtype isEqualToString: @"json"] == NO) { NSStringEncoding stringEncoding = _defaultEncoding; NSString *string; if (typeInfo == nil) { typeInfo = [document setHeader: @"Content-Type" value: @"text/plain" parameters: nil]; [typeInfo setObject: type forKey: @"Type"]; [typeInfo setObject: subtype forKey: @"Subtype"]; } else { NSString *charset; charset = [typeInfo parameterForKey: @"charset"]; if (charset != nil) { stringEncoding = [documentClass encodingFromCharset: charset]; } } /* * Ensure that the charset reflects the encoding used. */ if (stringEncoding != NSASCIIStringEncoding) { NSString *charset; charset = [documentClass charsetFromEncoding: stringEncoding]; [typeInfo setParameter: charset forKey: @"charset"]; } /* * Assume that content type is best represented as NSString. */ string = [NSStringClass allocWithZone: NSDefaultMallocZone()]; string = [string initWithData: data encoding: stringEncoding]; if (string == nil) { [document setContent: data]; // Can't make string } else { [document setContent: string]; RELEASE(string); } } else { /* * Assume that any non-text content type is best * represented as NSData. */ [document setContent: data]; } needsMore = NO; } } } else { NSUInteger bLength; const unsigned char *bBytes; unsigned char bInit; const unsigned char *buf; NSUInteger len; BOOL done = NO; BOOL endedFinalPart = NO; bLength = [boundary length]; bBytes = (const unsigned char*)[boundary bytes]; bInit = bBytes[0]; /* If we already have buffered data, append the new information * so we have a single buffer to scan. */ if ([data length] > 0) { [data appendData: d]; bytes = (unsigned char*)[data mutableBytes]; dataEnd = [data length]; d = data; } buf = (const unsigned char*)[d bytes]; len = [d length]; while (done == NO) { BOOL found = NO; NSUInteger eol = len; /* * Search data for the next boundary. */ while (len - lineStart >= bLength) { if (buf[lineStart] == bInit && memcmp(&buf[lineStart], bBytes, bLength) == 0) { if (lineStart == 0 || buf[lineStart-1] == '\r' || buf[lineStart-1] == '\n') { lineEnd = lineStart + bLength; eol = lineEnd; if (lineEnd + 2 <= len && buf[lineEnd] == '-' && buf[lineEnd+1] == '-') { /* The final boundary (shown by the trailng '--'). * Any data after this should be ignored. * NB. careful reading of section 7.2.1 of RFC1341 * reveals that the final boundary does NOT include * a trailing CRLF (but that excess data after the * final boundary is to be ignored). */ eol += 2; flags.wantEndOfLine = 0; endedFinalPart = YES; found = YES; } else { /* * Ignore space/tab characters after boundary marker * and before crlf. Strictly this is wrong ... but * at least one mailer generates bogus whitespace. */ while (eol < len && isWSP(buf[eol])) { eol++; } if (eol < len && buf[eol] == '\r') { eol++; } if (eol < len && buf[eol] == '\n') { eol++; flags.wantEndOfLine = 0; found = YES; } else { flags.wantEndOfLine = 1; } } break; } } lineStart++; } if (found == NO) { /* Need more data ... so, if we have none buffered we must * buffer any unused data, otherwise we can copy data within * the buffer. */ if ([data length] == 0) { [data appendBytes: buf + sectionStart length: len - sectionStart]; sectionStart = lineStart = 0; bytes = (unsigned char*)[data mutableBytes]; dataEnd = [data length]; } else if (sectionStart > 0) { len -= sectionStart; memcpy(bytes, buf + sectionStart, len); sectionStart = lineStart = 0; [data setLength: len]; dataEnd = len; } done = YES; /* Needs more data. */ } else if (child == nil) { NSString *cset; /* * Found boundary at the start of the first section. * Set sectionStart to point immediately after boundary. */ lineStart += bLength; sectionStart = lineStart; /* * If we have an explicit character set for the multipart * document, we set it as the default characterset inherited * by any child documents. */ cset = [[document headerNamed: CteContentType] parameterForKey: @"charset"]; if (cset != nil) { [self setDefaultCharset: cset]; } [self _child]; } else { NSData *childBody; NSUInteger pos; /* * Found boundary at the end of a section. * Skip past line terminator for boundary at start of section * or past marker for end of multipart document. */ if (buf[sectionStart] == '-' && sectionStart < len && buf[sectionStart+1] == '-') { sectionStart += 2; } if (buf[sectionStart] == '\r') { sectionStart++; } if (buf[sectionStart] == '\n') { sectionStart++; } /* * Create data object for this section and pass it to the * child parser to deal with. NB. As lineStart points to * the start of the end boundary, we need to step back to * before the end of line introducing it in order to have * the correct length of body data for the child document. */ pos = lineStart; if (pos > 0 && buf[pos-1] == '\n') { pos--; } if (pos > 0 && buf[pos-1] == '\r') { pos--; } /* Since we know the child can't modify it, and we know * that we aren't going to change the buffer while the * child is using it, we can safely pass a data object * which simply references the memory in our own buffer. */ childBody = [[NSData alloc] initWithBytesNoCopy: (void*)(buf + sectionStart) length: pos - sectionStart freeWhenDone: NO]; if ([child parse: childBody] == YES) { /* * The parser wants more data, so pass a nil data item * to tell it that it has had all there is. */ [child parse: nil]; } [childBody release]; if ([child isComplete] == YES) { GSMimeDocument *doc; /* * Store the document produced by the child, and * create a new parser for the next section. */ doc = [child mimeDocument]; if (doc != nil) { [document addContent: doc]; } [self _child]; } else { /* * Section failed to decode properly! */ NSLog(@"Failed to decode section of multipart"); [self _child]; } /* * Update parser data. */ lineStart += bLength; sectionStart = lineStart; if (endedFinalPart == YES) { if (eol < len) { NSData *excess; excess = [[NSData alloc] initWithBytes: buf + eol length: len - eol]; ASSIGN(boundary, excess); flags.excessData = 1; [excess release]; } lineStart = sectionStart = 0; [data setLength: 0]; done = YES; } } } /* * Check to see if we have reached content length or ended multipart * document. */ if (endedFinalPart == YES || (expect > 0 && rawBodyLength >= expect)) { flags.complete = 1; flags.inBody = 0; needsMore = NO; } } return needsMore; } static const unsigned char * unfold(const unsigned char *src, const unsigned char *end, BOOL *folded) { BOOL startOfLine = YES; *folded = NO; if (src >= end) { /* Not enough data to tell whether this is a header end or * just a folded header ... need to get more input. */ return 0; } while (src < end && isspace(*src)) { if (*src == '\r' || *src == '\n') { if (YES == startOfLine) { return src; // Pointer to line after headers } if (*src == '\r') { if (src + 1 >= end) { return 0; // Need more data (linefeed expected) } if (src[1] == '\n') { src++; // Step past carriage return } } /* Step after end of line and look for fold (leading whitespace) * or blank line (end of headers), or new data. */ src++; startOfLine = YES; continue; } src++; startOfLine = NO; } if (src >= end) { return 0; // Need more data } if (NO == startOfLine) { *folded = YES; } return src; // Pointer to first non-space data } /* * This method takes the raw data of an unfolded header line, and handles * RFC2047 word encoding in the header by creating a * string containing the decoded words. * Strictly speaking, the header should be plain ASCII data with escapes * for non-ascii characters, but for the sake of fault tolerance, we also * attempt to use the default encoding currently set for the document, * and if that fails we try UTF8. Only if none of these works do we * assume that the header is corrupt/unparsable. */ - (NSString*) _decodeHeader { NSStringEncoding enc; WE encoding; unsigned char c; NSMutableString *hdr = nil; NSString *s; const unsigned char *beg = &bytes[input]; const unsigned char *end = &bytes[dataEnd]; const unsigned char *src = beg; while (src < end) { if (src[0] == '\n' || (src[0] == '\r' && src+1 < end && src[1] == '\n') || (src[0] == '=' && src+1 < end && src[1] == '?')) { /* Append any accumulated text to the header. */ if (src > beg) { s = nil; if (1 == flags.isHttp) { /* Old web code tends to use latin1 (and RFCs say we * should use latin1 for headers). However newer systems * tend to use utf-8. We try any explicitly set encoding, * then the modern utf-8, and finally fall back to latin1. */ if (NSUTF8StringEncoding != _defaultEncoding) { s = [NSStringClass allocWithZone: NSDefaultMallocZone()]; s = [s initWithBytes: beg length: src - beg encoding: _defaultEncoding]; } if (nil == s) { s = [NSStringClass allocWithZone: NSDefaultMallocZone()]; s = [s initWithBytes: beg length: src - beg encoding: NSUTF8StringEncoding]; } if (nil == s) { s = [NSStringClass allocWithZone: NSDefaultMallocZone()]; s = [s initWithBytes: beg length: src - beg encoding: NSISOLatin1StringEncoding]; } } else { s = [NSStringClass allocWithZone: NSDefaultMallocZone()]; s = [s initWithBytes: beg length: src - beg encoding: NSASCIIStringEncoding]; if (nil == s && _defaultEncoding != NSASCIIStringEncoding) { /* The parser has been explicitly set to accept an * alternative coding ... Try the encoding we were * given. */ s = [NSStringClass allocWithZone: NSDefaultMallocZone()]; s = [s initWithBytes: beg length: src - beg encoding: _defaultEncoding]; } } if (nil == s) { NSLog(@"Bad header ... illegal characters in %@", [NSData dataWithBytes: beg length: src - beg]); flags.hadErrors = 1; return nil; } if (nil == hdr) { hdr = AUTORELEASE([s mutableCopy]); } else { [hdr appendString: s]; } RELEASE(s); } if ('=' == src[0]) { const unsigned char *tmp; src += 2; tmp = src; while (tmp < end && *tmp != '?' && !isspace(*tmp)) { tmp++; } if (tmp >= end) return nil; if (*tmp != '?') { NSLog(@"Bad encoded word - character set terminator missing"); break; } s = [NSStringClass allocWithZone: NSDefaultMallocZone()]; s = [s initWithBytes: src length: tmp - src encoding: NSUTF8StringEncoding]; enc = [documentClass encodingFromCharset: s]; RELEASE(s); src = tmp + 1; if (src >= end) return nil; c = toupper(*src); if (c == 'B') { encoding = WE_BASE64; } else if (c == 'Q') { encoding = WE_QUOTED; } else { NSLog(@"Bad encoded word - content type unknown"); break; } src++; if (src >= end) return nil; if (*src != '?') { NSLog(@"Bad encoded word - content type terminator missing"); break; } src++; if (src >= end) return nil; tmp = src; while (tmp < end && *tmp != '?' && !isspace(*tmp)) { tmp++; } if (tmp+1 >= end) return nil; if (tmp[0] != '?' || tmp[1] != '=') { NSLog(@"Bad encoded word - data terminator missing"); break; } /* If we are expecting to have white space after an encoded * word, we must get rid of it between words. */ if (1 == flags.encodedWord && expect > 0) { [hdr deleteCharactersInRange: NSMakeRange([hdr length] - expect, expect)]; } /* If the data part is not empty, decode it and append to header. */ if (tmp > src) { unsigned char buf[tmp - src]; unsigned char *ptr; ptr = decodeWord(buf, src, tmp, encoding); s = [NSStringClass allocWithZone: NSDefaultMallocZone()]; s = [s initWithBytes: buf length: ptr - buf encoding: enc]; if (nil == hdr) { hdr = AUTORELEASE([s mutableCopy]); } else { [hdr appendString: s]; } RELEASE(s); } /* Point past end to continue parsing. */ src = tmp + 2; beg = src; flags.encodedWord = 1; // We just parsed an encoded word expect = 0; // No space expected after word yet continue; } else { BOOL folded; if (src[0] == '\r') src++; src++; if ([hdr length] == 0) { /* Nothing in this header ... it's the empty line * between headers and body. */ flags.inBody = 1; flags.encodedWord = 0; expect = 0; input = src - bytes; return nil; } src = unfold(src, end, &folded); if (src == 0) { return nil; // need more data } if (nil == hdr) { hdr = [NSMutableString stringWithCapacity: 1]; } if (NO == folded) { /* End of line ... return this header. */ input = src - bytes; flags.encodedWord = 0; expect = 0; return hdr; } /* Folded line ... add space at fold and continue parsing. */ if (YES == oldStyleFolding) { /* Old style ... any fold is at a space. */ [hdr appendString: @" "]; } else { /* Modern style ... exact whitespace character is * preserved. */ if (' ' == src[-1]) { [hdr appendString: @" "]; } else { [hdr appendString: @"\t"]; } } if (1 == flags.encodedWord) { /* NB Space is ignored between encoded words; * count expected space but don't reset flag. */ expect++; } beg = src; continue; } } else if (1 == flags.encodedWord) { if (isspace(src[0])) { expect++; // Count expected space after word } else { flags.encodedWord = 0; // No longer in encoded word expect = 0; } } src++; } /* Need more data. */ return nil; } /* Scan the provided data for an empty line (a CRLF immediately followed * by another CRLF). Return the range of the empty line or a zero length * range at index NSNotFound.
* Permits a bare LF as a line terminator for maximum compatibility.
* Also checks for an empty line overlapping the existing data and the * new data.
* Also, handles the special case of an empty line and no further headers. */ - (NSRange) _endOfHeaders: (NSData*)newData { unsigned int ol = [data length]; unsigned int nl = [newData length]; unsigned int len = ol + nl; unsigned int pos = ol; const unsigned char *op = (const unsigned char*)[data bytes]; const unsigned char *np = (const unsigned char*)[newData bytes]; char c; #define C(X) ((X) < ol ? op[(X)] : np[(X)-ol]) if (ol > 0) { /* Find the start of any trailing CRLF or LF sequence we have already * checked. */ while (pos > 0) { c = C(pos - 1); if (c != '\r' && c != '\n') { break; } pos--; } } /* Check for a document with no headers */ if (0 == pos) { if (len < 1) { return NSMakeRange(NSNotFound, 0); } c = C(0); if ('\n' == c) { return NSMakeRange(0, 1); // no headers ... just an LF. } if (len < 2) { return NSMakeRange(NSNotFound, 0); } if ('\r' == c && '\n' == C(1)) { return NSMakeRange(0, 2); // no headers ... just a CRLF. } } /* Now check for pairs of line ends overlapping the old and new data */ if (pos < ol) { if (pos + 2 >= len) { return NSMakeRange(NSNotFound, 0); } c = C(pos); if ('\n' == c) { char c1 = C(pos + 1); if ('\n' == c1) { return NSMakeRange(pos, 2); // LFLF } if ('\r' == c1 && pos + 3 <= len && '\n' == C(pos + 2)) { return NSMakeRange(pos, 3); // LFCRLF } } else if ('\r' == c) { char c1 = C(pos + 1); if ('\n' == c1 && pos + 3 <= len) { char c2 = C(pos + 2); if ('\n' == c2) { return NSMakeRange(pos, 3); // CRLFLF } if ('\r' == c2 && pos + 4 <= len && '\n' == C(pos + 3)) { return NSMakeRange(pos, 4); // CRLFCRLF } } } } /* Now check for end of headers in new data. */ pos = 0; while (pos + 2 <= nl) { c = np[pos]; if ('\n' == c) { char c1 = np[pos + 1]; if ('\n' == c1) { return NSMakeRange(pos + ol, 2); // LFLF } if ('\r' == c1 && pos + 3 <= nl && '\n' == np[pos + 2]) { return NSMakeRange(pos + ol, 3); // LFCRLF } } else if ('\r' == c) { char c1 = np[pos + 1]; if ('\n' == c1 && pos + 3 <= nl) { char c2 = np[pos + 2]; if ('\n' == c2) { return NSMakeRange(pos + ol, 3); // CRLFLF } if ('\r' == c2 && pos + 4 <= nl && '\n' == np[pos + 3]) { return NSMakeRange(pos + ol, 4); // CRLFCRLF } pos++; } } pos++; } return NSMakeRange(NSNotFound, 0); } - (BOOL) _scanHeaderParameters: (NSScanner*)scanner into: (GSMimeHeader*)info { [self scanPastSpace: scanner]; while ([scanner scanString: @";" intoString: 0] == YES) { NSString *paramName; paramName = [self scanName: scanner]; if ([paramName length] == 0) { NSLog(@"Invalid Mime %@ field (parameter name) at %@", [info name], [scanner string]); return NO; } [self scanPastSpace: scanner]; if ([scanner scanString: @"=" intoString: 0] == YES) { NSString *paramValue; paramValue = [self scanToken: scanner]; [self scanPastSpace: scanner]; if (paramValue == nil) { paramValue = @""; } [info setParameter: paramValue forKey: paramName]; } else { NSLog(@"Ignoring Mime %@ field parameter (%@)", [info name], paramName); } } return YES; } @end @interface _GSMutableInsensitiveDictionary : NSMutableDictionary @end @implementation GSMimeHeader static NSCharacterSet *nonToken = nil; static NSCharacterSet *tokenSet = nil; + (void) _defaultsChanged: (NSNotification*)n { oldStyleFolding = [[NSUserDefaults standardUserDefaults] boolForKey: @"GSMimeOldStyleFolding"]; } + (GSMimeHeader*) headerWithName: (NSString*)n value: (NSString*)v parameters: (NSDictionary*)p { GSMimeHeader *h; h = [[self alloc] initWithName: n value: v parameters: p]; return AUTORELEASE(h); } + (void) initialize { if (nonToken == nil) { NSMutableCharacterSet *ms; ms = [NSMutableCharacterSet new]; [ms addCharactersInRange: NSMakeRange(33, 126-32)]; [ms removeCharactersInString: @"()<>@,;:\\\"/[]?="]; tokenSet = [ms copy]; [[NSObject leakAt: &tokenSet] release]; RELEASE(ms); nonToken = RETAIN([tokenSet invertedSet]); [[NSObject leakAt: &nonToken] release]; if (NSArrayClass == 0) { NSArrayClass = [NSArray class]; } if (NSStringClass == 0) { NSStringClass = [NSString class]; } if (documentClass == 0) { documentClass = [GSMimeDocument class]; } if (headerClass == 0) { headerClass = [GSMimeHeader class]; } [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(_defaultsChanged:) name: NSUserDefaultsDidChangeNotification object: nil]; [self _defaultsChanged: nil]; } } /** * Makes the value into a quoted string if necessary (ie if it contains * any special / non-token characters). If flag is YES then the value * is made into a quoted string even if it does not contain special characters. */ + (NSString*) makeQuoted: (NSString*)v always: (BOOL)flag { NSRange r; NSUInteger pos = 0; NSUInteger l = [v length]; r = [v rangeOfCharacterFromSet: nonToken options: NSLiteralSearch range: NSMakeRange(0, l)]; if (flag == YES || r.length > 0) { NSMutableString *m = [NSMutableString new]; [m appendString: @"\""]; while (r.length > 0) { unichar c; if (r.location > pos) { [m appendString: [v substringWithRange: NSMakeRange(pos, r.location - pos)]]; } pos = r.location + 1; c = [v characterAtIndex: r.location]; if (c < 128) { if (c == '\\' || c == '"') { [m appendFormat: @"\\%c", c]; } else { [m appendFormat: @"%c", c]; } } else { NSLog(@"NON ASCII characters not yet implemented"); } r = [v rangeOfCharacterFromSet: nonToken options: NSLiteralSearch range: NSMakeRange(pos, l - pos)]; } if (l > pos) { [m appendString: [v substringWithRange: NSMakeRange(pos, l - pos)]]; } [m appendString: @"\""]; v = AUTORELEASE(m); } return v; } /** * Convert the supplied string to a standardized token by removing * all illegal characters. If preserve is NO then the result is * converted to lowercase.
* Returns an autoreleased (and possibly modified) copy of the original. */ + (NSString*) makeToken: (NSString*)t preservingCase: (BOOL)preserve { NSMutableString *m = nil; NSRange r; r = [t rangeOfCharacterFromSet: nonToken]; if (r.length > 0) { m = [t mutableCopy]; while (r.length > 0) { [m deleteCharactersInRange: r]; r = [m rangeOfCharacterFromSet: nonToken]; } t = m; } if (preserve == NO) { t = [t lowercaseString]; } else { t = AUTORELEASE([t copy]); } TEST_RELEASE(m); return t; } /** * Convert the supplied string to a standardized token by making it * lowercase and removing all illegal characters. */ + (NSString*) makeToken: (NSString*)t { return [self makeToken: t preservingCase: NO]; } /* Used to put headers in the HTTP requests we generate. * If masked is non-NULL then the data object it points to is modified to * make it a version of the request with authenticiation hidden (for debug * logging). If the receiver is an authentication header and masked is not * NULL but points to a nil object, an autoreleased mutable data object is * created to hold the debug information. */ - (void) addToBuffer: (NSMutableData*)buf masking: (NSMutableData**)masked { NSUInteger pos = [buf length]; BOOL maskThis = NO; if (masked) { NSString *n = [self name]; if ([n isEqualToString: @"authorization"]) { NSUInteger len = [*masked length]; maskThis = YES; if (0 == len) { *masked = AUTORELEASE([buf mutableCopy]); } else if (len < pos) { [*masked appendBytes: [buf bytes] + len length: pos - len]; } } } [buf appendData: [self rawMimeDataPreservingCase: YES foldedAt: 0]]; if (masked && *masked) { NSUInteger len = [buf length]; const uint8_t *from = [buf bytes]; if (maskThis) { uint8_t *to; uint8_t c; [*masked setLength: len]; to = [*masked mutableBytes]; memcpy(to + pos, from + pos, 14); // Authorization: pos += 14; /* Show spaces before scheme */ while (pos < len && isspace((c = from[pos]))) { to[pos++] = c; } /* Show authorisation scheme */ while (pos < len && ((c = from[pos]) == '-' || isalnum(c))) { to[pos++] = c; } /* Show spaces after scheme */ while (pos < len && isspace((c = from[pos]))) { to[pos++] = c; } /* Mask out everything apart from line wrapping/termination. */ while (pos < len) { uint8_t c = from[pos]; if (c != '\n' && c != '\r' && c != '\t') { c = '*'; } to[pos++] = c; } } else { [*masked appendBytes: from + pos length: len - pos]; } } } - (id) copyWithZone: (NSZone*)z { GSMimeHeader *c; NSEnumerator *e; NSString *k; c = [headerClass allocWithZone: z]; c = [c initWithName: [self namePreservingCase: YES] value: [self value] parameters: [self parametersPreservingCase: YES]]; e = [objects keyEnumerator]; while ((k = [e nextObject]) != nil) { [c setObject: [self objectForKey: k] forKey: k]; } return c; } - (void) dealloc { RELEASE(name); RELEASE(lower); RELEASE(value); TEST_RELEASE(objects); TEST_RELEASE(params); [super dealloc]; } - (NSString*) description { NSString *desc = [super description]; NSString *n = [self name]; NSString *v = [self value]; NSDictionary *p = [self parameters]; if ([n isEqualToString: @"authorization"]) { NSRange r = [v rangeOfCharacterFromSet: whitespace]; NSString *scheme; if (r.length > 0) { scheme = [v substringToIndex: r.location]; v = [v substringFromIndex: NSMaxRange(r)]; } else { scheme = v; v = @""; } if ([p count] > 0) { if ([scheme caseInsensitiveCompare: @"digest"] == NSOrderedSame) { NSMutableDictionary *m = AUTORELEASE([p mutableCopy]); /* For a digest, it's good for debug to be able to see the * digest parameters. Only the 'response' is sensitive. */ [m setObject: @"masked" forKey: @"response"]; v = [v stringByTrimmingSpaces]; if ([v length] > 0) { v = @"value-masked"; } desc = [NSString stringWithFormat: @"%@ %@: %@ params: %@", desc, n, v, m]; } else { desc = [NSString stringWithFormat: @"%@ %@: value-masked", desc, n]; } } else { desc = [NSString stringWithFormat: @"%@ %@: value-masked", desc, n]; } } else { if ([p count] > 0) { desc = [NSString stringWithFormat: @"%@ %@: %@ params: %@", desc, n, v, p]; } else { desc = [NSString stringWithFormat: @"%@ %@: %@", desc, n, v]; } } return desc; } - (NSUInteger) estimatedSize { return ([name length] + [value length] + [params count] * 20) + 6; } /** Returns the full value of the header including any parameters and * preserving case. This is an unfolded (long) line with no escape * sequences (ie contains a unicode string not necessarily plain ASCII).
* If you just want the plain value excluding any parameters, use the * -value method instead. */ - (NSString*) fullValue { if ([params count] > 0) { NSMutableString *m; NSEnumerator *e; NSString *k; m = AUTORELEASE([value mutableCopy]); e = [params keyEnumerator]; while ((k = [e nextObject]) != nil) { NSString *v; v = [headerClass makeQuoted: [params objectForKey: k] always: NO]; [m appendString: @"; "]; [m appendString: k]; [m appendString: @"="]; [m appendString: v]; } if (YES == [m makeImmutable]) { return m; } return AUTORELEASE([m copy]); } else { return value; } } - (NSUInteger) hash { return [lower hash]; } - (id) init { return [self initWithName: @"unknown" value: @"none" parameters: nil]; } /** * Convenience method calling -initWithName:value:parameters: with the * supplied argument and nil parameters. */ - (id) initWithName: (NSString*)n value: (NSString*)v { return [self initWithName: n value: v parameters: nil]; } /** * * Initialise a GSMimeHeader supplying a name, a value and a dictionary * of any parameters occurring after the value. */ - (id) initWithName: (NSString*)n value: (NSString*)v parameters: (NSDictionary*)p { n = [headerClass makeToken: n preservingCase: YES]; if ([n length] == 0) { n = @"unknown"; } ASSIGN(name, n); if ([CteContentType caseInsensitiveCompare: name] == NSOrderedSame) { n = CteContentType; } else if ([@"content-transfer-encoding" caseInsensitiveCompare: name] == NSOrderedSame) { n = @"content-transfer-encoding"; } else { n = [name lowercaseString]; } ASSIGN(lower, n); if (nil != v) { [self setValue: v]; } if (nil != p) { [self setParameters: p]; } return self; } - (BOOL) isEqual: (id)other { if (other == self) { return YES; } if (NO == [other isKindOfClass: headerClass]) { return NO; } if (NO == [[self name] isEqual: [other name]]) { return NO; } if (NO == [[self value] isEqual: [other value]]) { return NO; } if (NO == [[self parameters] isEqual: [other parameters]]) { return NO; } return YES; } /** * Returns the name of this header ... a lowercase string. */ - (NSString*) name { return lower; } /** * Returns the name of this header as originally set (without conversion * to lowercase) if preserve is YES, but as a lowercase string if preserve * is NO. */ - (NSString*) namePreservingCase: (BOOL)preserve { if (preserve == YES) { return name; } else { return lower; } } /** * Return extra information specific to a particular header type. */ - (id) objectForKey: (NSString*)k { return [objects objectForKey: k]; } /** * Returns a dictionary of all the additional objects for the header. */ - (NSDictionary*) objects { return AUTORELEASE([objects copy]); } /** * Return the named parameter value. */ - (NSString*) parameterForKey: (NSString*)k { NSString *p = [params objectForKey: k]; if (p == nil) { k = [headerClass makeToken: k]; p = [params objectForKey: k]; } return p; } /** * Returns the parameters of this header ... a dictionary whose keys * are all lowercase strings, and whose values are strings which may * contain mixed case. */ - (NSDictionary*) parameters { return [self parametersPreservingCase: NO]; } /** * Returns the parameters of this header ... a dictionary whose keys * are strings preserving the case originally used to set the values * or all lowercase depending on the preserve argument. */ - (NSDictionary*) parametersPreservingCase: (BOOL)preserve { NSMutableDictionary *m; NSEnumerator *e; NSString *k; m = [NSMutableDictionary dictionaryWithCapacity: [params count]]; e = [params keyEnumerator]; if (preserve == YES) { while ((k = [e nextObject]) != nil) { [m setObject: [params objectForKey: k] forKey: k]; } } else { while ((k = [e nextObject]) != nil) { [m setObject: [params objectForKey: k] forKey: [k lowercaseString]]; } } if (YES == [m makeImmutable]) { return m; } return AUTORELEASE([m copy]); } /* Given a byte buffer and a minimum position in the buffer, * return the first white space found before the starting position. * If no white space is found, return NSNotFound. */ static NSUInteger lastWhiteSpace(const uint8_t *ptr, NSUInteger minimum, NSUInteger from) { while (from-- > minimum) { uint8_t c = ptr[from]; if (' ' == c || '\t' == c) { return from; } } return NSNotFound; } static char* _charsToEncode = "()<>@,;:_\"/[]?.="; static NSUInteger quotableLength(const uint8_t *ptr, NSUInteger size, NSUInteger max, NSUInteger *quotedLength, BOOL utf8) { NSUInteger encoded; NSUInteger index; for (encoded = index = 0; index < size; index++) { uint8_t c = ptr[index]; if (c < 32 || c >= 127 || strchr(_charsToEncode, c)) { if (encoded + 3 > max) { break; } encoded += 3; } else { if (encoded >= max) { break; } encoded++; } } if (YES == utf8 && index < size) { uint8_t c = ptr[index]; /* We are breaking up a utf-8 string, so we must make sure * we don't break inside a character. */ if ((c & 0xc0) == 0x80) { /* The next byte is a continuation byte, so we must be * inside a utf-8 codepoint and need to step back out * of it. */ do { encoded -= 3; c = ptr[--index]; } while ((c & 0xc0) == 0x80); } } *quotedLength = encoded; return index; } static void quotedWord(const uint8_t *ptr, NSUInteger size, uint8_t *buffer) { NSUInteger encoded = 0; NSUInteger index; for (index = 0; index < size; index++) { uint8_t c = ptr[index]; if (' ' == c) { buffer[encoded++] = '_'; } else if (c < 32 || c >= 127 || strchr(_charsToEncode, c)) { buffer[encoded++] = '='; buffer[encoded++] = hex[c>>4]; buffer[encoded++] = hex[c&15]; } else { buffer[encoded++] = c; } } } static NSUInteger appendBytes(NSMutableData *m, NSUInteger offset, NSUInteger fold, const char *bytes, NSUInteger size) { if (fold > 0 && offset + size > fold && size + 8 <= fold) { /* This would take the line beyond the folding limit, * so we fold at this point. */ if (YES == oldStyleFolding) { NSUInteger len = [m length]; /* If we already have space at the end of the line, * we remove it because the wrapping counts as a space. */ if (len > 0 && isspace(((const uint8_t *)[m bytes])[len - 1])) { [m setLength: --len]; } /* Folding results in a follow-on line starting with white space */ [m appendBytes: "\r\n\t" length: 3]; offset = 8; if (size > 0 && isspace(bytes[0])) { /* The folding counts as a space character, * so we refrain from writing the next character * if it is also a space. */ size--; bytes++; } } else { uint8_t wsp; uint8_t buf[3]; /* Modern folding preserves exact whitespace characters. */ if (size > 0 && isWSP(bytes[0])) { /* Next char is whitespace, so we fold before it. */ wsp = bytes[0]; bytes++; size--; } else { NSUInteger len = [m length]; /* We are expecting white space to be present after the * last word (because we didn't find it before the next * one). If it's there, we need to step back so we have * it after the CRLF. */ wsp = ' '; if (len > 0) { const uint8_t *ptr = [m bytes]; len--; if (isWSP(ptr[len])) { wsp = ptr[len]; [m setLength: len]; } } } /* Now we append the CRLF and first whitespace character on * the new line, and record the current character position. */ buf[0] = '\r'; buf[1] = '\n'; buf[2] = wsp; [m appendBytes: buf length: 3]; if ('\t' == wsp) { offset = 8; } else { offset = 1; } } } if (size > 0) { /* Append the supplied byte data and update the offset * on the current line. */ [m appendBytes: bytes length: size]; offset += size; } return offset; } static NSUInteger appendString(NSMutableData *m, NSUInteger offset, NSUInteger fold, NSString *str, BOOL *ok) { NSUInteger pos = 0; BOOL hadEncodedWord = NO; *ok = YES; if (YES == oldStyleFolding) { NSUInteger size = [str length]; BOOL needSpace = NO; while (pos < size) { NSRange r = NSMakeRange(pos, size - pos); NSString *s = nil; NSData *d = nil; BOOL e = NO; r = [str rangeOfCharacterFromSet: whitespace options: NSLiteralSearch range: r]; if (r.length > 0 && r.location == pos) { /* Found space at the start of the string, so we reduce * it to a single space in the output, or omit it entirely * if the string contains nothing more but space. */ pos++; while (pos < size && [whitespace characterIsMember: [str characterAtIndex: pos]]) { pos++; } if (pos < size) { needSpace = YES; // We need a space before the next word. } } else if (r.length == 0) { /* No more space found ... we must output the remaining string * without folding it. */ s = [str substringWithRange: NSMakeRange(pos, size - pos)]; pos = size; d = wordData(s, &e); } else { /* Output the substring up to the next space. */ s = [str substringWithRange: NSMakeRange(pos, r.location - pos)]; pos = r.location; d = wordData(s, &e); } if (nil != d) { /* We have a 'word' to output ... do that after dealing with any * space needed between the last word and the new one. */ if (YES == needSpace) { if (YES == e && YES == hadEncodedWord) { /* We can't have space between two encoded words, so * we incorporate the space at the start of the next * encoded word. */ s = [@" " stringByAppendingString: s]; d = wordData(s, &e); } else { /* Add the needed space before the next word. */ offset = appendBytes(m, offset, fold, " ", 1); if (fold > 0 && offset > fold) { *ok = NO; } } needSpace = NO; } hadEncodedWord = e; offset = appendBytes(m, offset, fold, [d bytes], [d length]); if (fold > 0 && offset > fold) { *ok = NO; } } } return offset; } else { NSData *d; NSString *cset = selectCharacterSet(str, &d); const uint8_t *ptr = (const uint8_t*)[d bytes]; NSUInteger len = [d length]; BOOL utf8 = NO; if ([cset isEqualToString: @"utf-8"]) { utf8 = YES; } else if ([cset isEqualToString: @"us-ascii"]) { if (0 == fold) { /* Simple ... no folding to do so we can just add the ascii. */ [m appendBytes: ptr + pos length: len - pos]; offset += (len - pos); pos = len; } else { while (pos < len) { NSUInteger next; /* Find the longest string we can fit on the current line, * either the whole string or by breaking at whitespace. */ if (offset + len - pos <= fold) { next = len; } else { next = lastWhiteSpace(ptr, pos, pos + fold - offset); if (NSNotFound == next) { /* The header text has no whitespace usable as * a folding point before the end of the line. * break out and use encoded words. */ break; } } /* Add the string to the output and adjust position. */ [m appendBytes: ptr + pos length: next - pos]; offset += next - pos; pos = next; if (pos < len) { /* We have more text to output, so fold the line. */ [m appendBytes: "\r\n" length: 2]; if (isspace(ptr[pos])) { [m appendBytes: ptr + pos length: 1]; pos++; } else { [m appendBytes: " " length: 1]; } offset = 1; } } } } /* We get here to use encoded words, either because the text to be * added contains non-ascii characters, or because it contains some * non-foldable sequence too long to fit in the given line limit. */ if (pos < len) { NSUInteger csetLength; NSUInteger overhead; /* The overhead is the number of bytes needed to wrap an * encoded word in the format =?csetname?B?encodedtext?= */ csetLength = [cset length]; overhead = csetLength + 7; /* RFC2047 says that any header line containing an encoded word * is limited to 76 characters, so we temporarily adjust the * fold if necessary. */ if (0 == fold || fold > 76) { fold = 76; } while (pos < len) { uint8_t *buffer; NSUInteger existingLength; NSUInteger quotedLength; NSUInteger byteLength; uint8_t style = 'Q'; /* Calculate the number of encoded characters we can * fit on the current line. If there's no room, we * fold the line and recalculate. * With base64 encoding, the minimum space used for an * encoded character (because it works in triplets) is * 4 bytes, while for quoted characters it's 3 bytes * (the '=' followed by two hexadecimal digits). * We therefore check that we have at least space for * four characters left on the line. */ if (offset + overhead + 4 > fold) { [m appendBytes: "\r\n " length: 3]; offset = 1; } byteLength = quotableLength(ptr + pos, len - pos, fold - offset - overhead, "edLength, utf8); if (quotedLength > (byteLength * 4) / 3) { /* Using base64 is more compact than using quoted * text, so lets do that. */ style = 'B'; byteLength = ((fold - offset - overhead) / 4) * 3; if (byteLength >= len - pos) { /* If we have less text than we can fit, * just encode all of it. */ byteLength = len - pos; } else if (YES == utf8 && (ptr[pos + byteLength] % 0xc0) == 0x80) { /* The byte after the end of the data we propose * to encode is a utf8 continuation byte * so step back to the character boundary. */ do { byteLength--; } while ((ptr[pos + byteLength] % 0xc0) == 0x80); } quotedLength = 4 * ((byteLength + 2) / 3); } /* make sure we have enough space in the output buffer. */ existingLength = [m length]; [m setLength: existingLength + quotedLength + overhead]; buffer = (uint8_t*)[m mutableBytes] + existingLength; memcpy(buffer, "=?", 2); buffer += 2; [cset getCString: (char*)buffer maxLength: csetLength + 1 encoding: NSASCIIStringEncoding]; buffer += csetLength; *buffer++ = '?'; *buffer++ = style; *buffer++ = '?'; if ('Q' == style) { quotedWord(ptr + pos, byteLength, buffer); } else { GSPrivateEncodeBase64(ptr + pos, byteLength, buffer); } buffer[quotedLength] = '?'; buffer[quotedLength + 1] = '='; offset += quotedLength + overhead; pos += byteLength; } } return offset; } } /* For testing + (NSUInteger) appendString: (NSString*)str to: (NSMutableData*)m at: (NSUInteger)offset fold: (NSUInteger)fold ok: (BOOL*)ok { return appendString(m, offset, fold, str, ok); } */ /** * Returns the full text of the header, built from its component parts, * and including a terminating CR-LF */ - (NSMutableData*) rawMimeData { return [self rawMimeDataPreservingCase: NO]; } - (NSMutableData*) rawMimeDataPreservingCase: (BOOL)preserve { // 78 is what the RFCs say we should limit length to. return [self rawMimeDataPreservingCase: NO foldedAt: 78]; } /** * Returns the full text of the header, built from its component parts, * and including a terminating CR-LF.
* If preserve is YES then we attempt to build the text using the same * case as it was originally parsed/set from, otherwise we use common * conventions of capitalising the header names and using lowercase * parameter names.
* If fold is greater than zero, lines with more than the specified * number of characters are considered 'long' and are folded into * multiple lines. */ - (NSMutableData*) rawMimeDataPreservingCase: (BOOL)preserve foldedAt: (NSUInteger)fold { NSMutableData *md = [NSMutableData dataWithCapacity: 128]; [self rawMimeDataPreservingCase: preserve foldedAt: fold to: md]; return md; } - (void) rawMimeDataPreservingCase: (BOOL)preserve foldedAt: (NSUInteger)fold to: (NSMutableData*)md { NSEnumerator *e = [params keyEnumerator]; NSString *k; NSString *n; NSData *d; NSUInteger offset = 0; BOOL conv = YES; BOOL ok = YES; n = [self namePreservingCase: preserve]; d = [n dataUsingEncoding: NSASCIIStringEncoding]; if (preserve == YES) { /* Protect the user ... MIME-Version *must* have the correct case. */ if ([n caseInsensitiveCompare: @"MIME-Version"] == NSOrderedSame) { offset = appendBytes(md, offset, fold, "MIME-Version", 12); } else { offset = appendBytes(md, offset, fold, [d bytes], [d length]); } } else { NSUInteger l = [d length]; char buf[l]; NSUInteger i = 0; /* * Capitalise the header name. However, the version header is a special * case - it is defined as being literally 'MIME-Version' */ memcpy(buf, [d bytes], l); if (l == 12 && strncasecmp(buf, "mime-version", 12) == 0) { memcpy(buf, "MIME-Version", 12); } else { while (i < l) { if (conv == YES) { if (islower(buf[i])) { buf[i] = toupper(buf[i]); } } if (buf[i++] == '-') { conv = YES; } else { conv = NO; } } } offset = appendBytes(md, offset, fold, buf, l); } if (fold > 0 && offset > fold) { NSLog(@"Name '%@' too long for folding at %"PRIuPTR" in header", n, fold); } offset = appendBytes(md, offset, fold, ":", 1); offset = appendBytes(md, offset, fold, " ", 1); offset = appendString(md, offset, fold, value, &ok); if (ok == NO) { NSDebugMLLog(@"GSMime", @"Value for '%@' too long for folding at %"PRIuPTR" in header", n, fold); } while ((k = [e nextObject]) != nil) { NSString *v; NSUInteger kLength; NSUInteger vLength; v = [headerClass makeQuoted: [params objectForKey: k] always: NO]; if (preserve == NO) { k = [k lowercaseString]; } offset = appendBytes(md, offset, fold, ";", 1); kLength = [k length]; vLength = [v length]; /* Crude heuristic ... * if the length of the key=value will definitely be * too long to fit on a line, fold right now. * Since we are producing a key=value pair in a structured * field, we use a tab to fold to maximise the chances of a * parser understanding it. */ if (fold > 0 && offset + kLength + vLength + 1 >= fold) { [md appendBytes: "\r\n\t" length: 3]; offset = 1; } else { offset = appendBytes(md, offset, fold, " ", 1); } offset = appendString(md, offset, fold, k, &ok); if (ok == NO) { NSDebugMLLog(@"GSMime", @"Parameter name '%@' in '%@' too long for folding at %"PRIuPTR, k, n, fold); } offset = appendBytes(md, offset, fold, "=", 1); /* Crude heuristic ... if the length of the value will definitely be * too long to fit on a line, fold right now. * Since we are producing a key=value pair in a structured * field, we use a tab to fold to maximise the chances of a * parser understanding it. */ if (fold > 0 && offset + vLength > fold) { [md appendBytes: "\r\n\t" length: 3]; offset = 1; } offset = appendString(md, offset, fold, v, &ok); if (ok == NO) { NSDebugMLLog(@"GSMime", @"Parameter value for '%@' in '%@' " @"too long for folding at %"PRIuPTR, k, n, fold); } } [md appendBytes: "\r\n" length: 2]; } /** * Method to store specific information for particular types of * header. This is used for non-standard parts of headers.
* Setting a nil value for o will remove any existing value set * using the k as its key. */ - (void) setObject: (id)o forKey: (NSString*)k { if (o == nil) { [objects removeObjectForKey: k]; } else { if (objects == nil) { objects = [NSMutableDictionary new]; } [objects setObject: o forKey: k]; } } /** * Sets a parameter of this header ... converts name to lowercase and * removes illegal characters.
* If a nil parameter name is supplied, removes any parameter with the * specified key. */ - (void) setParameter: (NSString*)v forKey: (NSString*)k { k = [headerClass makeToken: k preservingCase: YES]; if (v == nil) { [params removeObjectForKey: k]; } else { if (params == nil) { params = [_GSMutableInsensitiveDictionary new]; } [params setObject: v forKey: k]; } } /** * Sets all parameters of this header ... converts names to lowercase * and removes illegal characters from them. */ - (void) setParameters: (NSDictionary*)d { NSMutableDictionary *m = nil; NSUInteger c = [d count]; if (c > 0) { NSEnumerator *e = [d keyEnumerator]; NSString *k; m = [[_GSMutableInsensitiveDictionary alloc] initWithCapacity: c]; while ((k = [e nextObject]) != nil) { NSString *v = [d objectForKey: k]; k = [headerClass makeToken: k preservingCase: YES]; [m setObject: v forKey: k]; } } DESTROY(params); params = m; } /** * Sets the value of this header (without changing parameters).
* If given a nil argument, set an empty string value. */ - (void) setValue: (NSString*)s { if (s == nil) { s = @""; } ASSIGNCOPY(value, s); if (CteContentType == lower) { NSArray *a; a = [[value lowercaseString] componentsSeparatedByString: @"/"]; [self setObject: [a objectAtIndex: 0] forKey: @"Type"]; [self setObject: [a objectAtIndex: 1] forKey: @"Subtype"]; } } /** * Returns the full text of the header, built from its component parts, * and including a terminating CR-LF */ - (NSString*) text { NSString *s = [NSStringClass allocWithZone: NSDefaultMallocZone()]; s = [s initWithData: [self rawMimeData] encoding: NSASCIIStringEncoding]; return AUTORELEASE(s); } /** * Returns the value of this header (excluding any parameters).
* Use the -fullValue method if you want parameter included. */ - (NSString*) value { return value; } - (NSUInteger) sizeInBytesExcluding: (NSHashTable*)exclude { NSUInteger size = [super sizeInBytesExcluding: exclude]; if (size > 0) { size += 2 * [name sizeInBytesExcluding: exclude]; size += [value sizeInBytesExcluding: exclude]; size += [objects sizeInBytesExcluding: exclude]; size += [params sizeInBytesExcluding: exclude]; } return size; } @end /** *

* This class is intended to provide a wrapper for MIME messages * permitting easy access to the contents of a message and * providing a basis for parsing an unparsing messages that * have arrived via email or as a web document. *

*

* The class keeps track of all the document headers, and provides * methods for modifying and examining the headers that apply to a * document. *

*/ @implementation GSMimeDocument /* Examine xml data/string to find out the characterset encoding specified */ + (NSString*) charsetForXml: (id)xml { NSUInteger length = [xml length]; if (length < 4) { return nil; // Not long enough to determine an encoding } if ([xml isKindOfClass: [NSData class]]) { const unsigned char *ptr = (const unsigned char*)[xml bytes]; const unsigned char *end = ptr + length; NSUInteger offset = 0; NSUInteger size = 1; unsigned char quote = 0; unsigned char buffer[30]; NSUInteger buflen = 0; BOOL found = NO; /* * Determine encoding using byte-order-mark if present */ if ((ptr[0] == 0xFE && ptr[1] == 0xFF) || (ptr[0] == 0xFF && ptr[1] == 0xFE)) { return @"utf-16"; } if (ptr[0] == 0xEF && ptr[1] == 0xBB && ptr[2] == 0xBF) { return @"utf-8"; } if ((ptr[0] == 0x00 && ptr[1] == 0x00) && ((ptr[2] == 0xFE && ptr[3] == 0xFF) || (ptr[2] == 0xFF && ptr[3] == 0xFE))) { return @"ucs-4"; } /* * Look for nul bytes to determine whether this is a four byte * encoding or a two byte encoding (or the default). */ if (ptr[0] == 0 && ptr[1] == 0 && ptr[2] == 0) { offset = 3; size = 4; } else if (ptr[0] == 0 && ptr[1] == 0 && ptr[3] == 0) { offset = 2; size = 4; } else if (ptr[0] == 0 && ptr[2] == 0 && ptr[3] == 0) { offset = 1; size = 4; } else if (ptr[1] == 0 && ptr[2] == 0 && ptr[3] == 0) { offset = 0; size = 4; } else if (ptr[0] == 0) { offset = 1; size = 2; } else if (ptr[1] == 0) { offset = 0; size = 2; } /* * Now look for the xml encoding declaration ... */ // Tolerate leading whitespace while (ptr + size <= end && isspace(ptr[offset])) ptr += size; if (ptr + (size * 20) >= end || ptr[offset] != '<' || ptr[offset+size] != '?') { if (size == 1) { return @"utf-8"; } else if (size == 2) { return @"utf-16"; } else { return @"ucs-4"; } } ptr += size * 5; // Step past ' 5 && [xml compare: @""]; if (r.length > 0) { /* Shorten the search range to the xml declaration end, * then look for the 'encoding' keyword. */ search = NSMakeRange(index, NSMaxRange(r) - index); r = [xml rangeOfString: @"encoding" options: NSLiteralSearch range: search]; if (r.length > 0) { /* Shorten the search range to after 'encoding' and * find the quote before the charset. */ index = NSMaxRange(r); search = NSMakeRange(index, NSMaxRange(search) - index); r = [xml rangeOfString: @"\"" options: NSLiteralSearch range: search]; if (r.length > 0) { /* Narrow the search range to begin at the start of * the charset and find the quote after the charset. */ index = NSMaxRange(r); search = NSMakeRange(index, NSMaxRange(search) - index); r = [xml rangeOfString: @"\"" options: NSLiteralSearch range: search]; if (r.length > 0) { /* Extract the charset and return it. */ r = NSMakeRange(index, r.location - index); return [xml substringWithRange: r]; } } } } } } return @"utf-8"; } /** * Return the MIME characterset name corresponding to the * specified string encoding.
* As a special case, returns "us-ascii" if enc is zero.
* Returns nil if enc cannot be mapped to a charset.
* NB. The correspondence between charsets and encodings is not * a direct one to one mapping, so successive calls to +encodingFromCharset: * and +charsetFromEncoding: may not produce the original input. */ + (NSString*) charsetFromEncoding: (NSStringEncoding)enc { NSString *charset = @"us-ascii"; if (enc != 0) { charset = (NSString*)NSMapGet(encodings, (void*)enc); } return charset; } + (NSData*) decodeBase64: (NSData*)source { int length; int declen; const unsigned char *src; const unsigned char *end; unsigned char *result; unsigned char *dst; unsigned char buf[4]; NSUInteger pos = 0; int pad = 0; if (source == nil) { return nil; } length = [source length]; if (length == 0) { return [NSData data]; } declen = ((length + 3) * 3)/4; src = (const unsigned char*)[source bytes]; end = &src[length]; result = (unsigned char*)NSZoneMalloc(NSDefaultMallocZone(), declen); dst = result; while ((src != end) && *src != '\0') { int c = *src++; if (isupper(c)) { c -= 'A'; } else if (islower(c)) { c = c - 'a' + 26; } else if (isdigit(c)) { c = c - '0' + 52; } else if (c == '/') { c = 63; } else if (c == '_') { c = 63; /* RFC 4648 permits '_' in URLs and filenames */ } else if (c == '+') { c = 62; } else if (c == '-') { c = 62; /* RFC 4648 permits '-' in URLs and filenames */ } else if (c == '=') { c = -1; pad++; } else { c = -1; /* Ignore ... non-standard but more tolerant. */ length--; /* Don't count this as part of the length. */ } if (c >= 0) { buf[pos++] = c; if (pos == 4) { pos = 0; decodebase64(dst, buf); dst += 3; } } } /* If number of bytes is not a multiple of four, treat it as if the missing * bytes were the '=' characters normally used for padding. * This is not allowed by the basic standards, but permitted in some * variants of 6ase64 encoding, so we should tolerate it. */ if (length % 4 > 0) { pad += (4 - length % 4); } if (pos > 0) { NSUInteger i; unsigned char tail[3]; for (i = pos; i < 4; i++) { buf[i] = '\0'; } decodebase64(tail, buf); if (pad > 3) pad = 3; memcpy(dst, tail, 3 - pad); dst += 3 - pad; } return AUTORELEASE([[NSData allocWithZone: NSDefaultMallocZone()] initWithBytesNoCopy: result length: dst - result]); } /** * Converts the base64 encoded data in source to a decoded ASCII or UTF8 * string using the +decodeBase64: method. If the encoded data does not * represent an ASCII or UTF8 string, you should use the +decodeBase64: * method directly. */ + (NSString*) decodeBase64String: (NSString*)source { NSData *d = [source dataUsingEncoding: NSASCIIStringEncoding]; NSString *r = nil; d = [self decodeBase64: d]; if (d != nil) { r = [NSStringClass allocWithZone: NSDefaultMallocZone()]; r = [r initWithData: d encoding: NSUTF8StringEncoding]; IF_NO_ARC([r autorelease];) } return r; } /** * Convenience method to return an autoreleased document using the * specified content, type, and name value. This calls the * -setContent:type:name: method to set up the document. */ + (GSMimeDocument*) documentWithContent: (id)newContent type: (NSString*)type name: (NSString*)name { GSMimeDocument *doc = AUTORELEASE([self new]); [doc setContent: newContent type: type name: name]; return doc; } + (NSData*) encodeBase64: (NSData*)source { int length; int destlen; unsigned char *sBuf; unsigned char *dBuf; if (source == nil) { return nil; } length = [source length]; if (length == 0) { return [NSData data]; } destlen = 4 * ((length + 2) / 3); sBuf = (unsigned char*)[source bytes]; dBuf = NSZoneMalloc(NSDefaultMallocZone(), destlen); GSPrivateEncodeBase64(sBuf, length, dBuf); return AUTORELEASE([[NSData allocWithZone: NSDefaultMallocZone()] initWithBytesNoCopy: dBuf length: destlen]); } /** * Converts the ASCII or UTF8 string source into base64 encoded data using * the +encodeBase64: method. If the original data is not an ASCII or UTF8 * string, you should use the +encodeBase64: method directly. */ + (NSString*) encodeBase64String: (NSString*)source { NSData *d = [source dataUsingEncoding: NSUTF8StringEncoding]; NSString *r = nil; d = [self encodeBase64: d]; if (d != nil) { r = [NSStringClass allocWithZone: NSDefaultMallocZone()]; r = [r initWithData: d encoding: NSASCIIStringEncoding]; IF_NO_ARC([r autorelease];) } return r; } /** * Return the string encoding corresponding to the specified MIME * characterset name.
* As a special case, returns NSASCIIStringEncoding if charset is nil.
* Returns 0 if charset cannot be found.
* NB. We treat iso-10646-ucs-2 as utf-16, which should * work for most text, but is not strictly correct.
* The correspondence between charsets and encodings is not * a direct one to one mapping, so successive calls to +encodingFromCharset: * and +charsetFromEncoding: may not produce the original input. */ + (NSStringEncoding) encodingFromCharset: (NSString*)charset { NSStringEncoding enc = NSASCIIStringEncoding; if (charset != nil) { enc = (NSStringEncoding)(intptr_t)NSMapGet(charsets, charset); if (enc == 0) { charset = [charset lowercaseString]; enc = (NSStringEncoding)(intptr_t)NSMapGet(charsets, charset); } } return enc; } + (void) initialize { if (self == [GSMimeDocument class]) { NSMutableCharacterSet *m = [[NSMutableCharacterSet alloc] init]; if (documentClass == 0) { documentClass = [GSMimeDocument class]; } [m formUnionWithCharacterSet: [NSCharacterSet characterSetWithCharactersInString: @".()<>@,;:[]\"\\"]]; [m formUnionWithCharacterSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]]; [m formUnionWithCharacterSet: [NSCharacterSet controlCharacterSet]]; [m formUnionWithCharacterSet: [NSCharacterSet illegalCharacterSet]]; rfc822Specials = [m copy]; [[NSObject leakAt: &rfc822Specials] release]; [m formUnionWithCharacterSet: [NSCharacterSet characterSetWithCharactersInString: @"/?="]]; [m removeCharactersInString: @"."]; rfc2045Specials = [m copy]; [[NSObject leakAt: &rfc2045Specials] release]; [m release]; whitespace = RETAIN([NSCharacterSet whitespaceAndNewlineCharacterSet]); [[NSObject leakAt: &whitespace] release]; if (NSArrayClass == 0) { NSArrayClass = [NSArray class]; } if (NSStringClass == 0) { NSStringClass = [NSString class]; } if (0 == charsets) { charsets = NSCreateMapTable (NSObjectMapKeyCallBacks, NSIntegerMapValueCallBacks, 0); [[NSObject leakAt: &charsets] release]; /* * These mappings were obtained primarily from * http://www.iana.org/assignments/character-sets * with additions determined empirically. * * We should ideally have all the aliases for each * encoding we support, but I just did the aliases * for ascii and latin1 as these (and utf-8 which * has no aliases) account for most mime documents. * Feel free to add more. */ // All the ascii mappings from IANA NSMapInsert(charsets, (void*)@"ansi_x3.4-1968", (void*)NSASCIIStringEncoding); NSMapInsert(charsets, (void*)@"iso-ir-6", (void*)NSASCIIStringEncoding); NSMapInsert(charsets, (void*)@"ansi_x3.4-1986", (void*)NSASCIIStringEncoding); NSMapInsert(charsets, (void*)@"iso_646.irv:1991", (void*)NSASCIIStringEncoding); NSMapInsert(charsets, (void*)@"iso_646.991-irv", (void*)NSASCIIStringEncoding); NSMapInsert(charsets, (void*)@"ascii", (void*)NSASCIIStringEncoding); NSMapInsert(charsets, (void*)@"iso646-us", (void*)NSASCIIStringEncoding); NSMapInsert(charsets, (void*)@"us-ascii", (void*)NSASCIIStringEncoding); NSMapInsert(charsets, (void*)@"us", (void*)NSASCIIStringEncoding); NSMapInsert(charsets, (void*)@"ibm367", (void*)NSASCIIStringEncoding); NSMapInsert(charsets, (void*)@"cp367", (void*)NSASCIIStringEncoding); NSMapInsert(charsets, (void*)@"csascii", (void*)NSASCIIStringEncoding); // All the latin1 mappings from IANA NSMapInsert(charsets, (void*)@"iso-8859-1:1987", (void*)NSISOLatin1StringEncoding); NSMapInsert(charsets, (void*)@"iso8859-1:1987", (void*)NSISOLatin1StringEncoding); NSMapInsert(charsets, (void*)@"iso-ir-100", (void*)NSISOLatin1StringEncoding); NSMapInsert(charsets, (void*)@"iso_8859-1", (void*)NSISOLatin1StringEncoding); NSMapInsert(charsets, (void*)@"iso-8859-1", (void*)NSISOLatin1StringEncoding); NSMapInsert(charsets, (void*)@"iso8859-1", (void*)NSISOLatin1StringEncoding); NSMapInsert(charsets, (void*)@"latin1", (void*)NSISOLatin1StringEncoding); NSMapInsert(charsets, (void*)@"l1", (void*)NSISOLatin1StringEncoding); NSMapInsert(charsets, (void*)@"ibm819", (void*)NSISOLatin1StringEncoding); NSMapInsert(charsets, (void*)@"cp819", (void*)NSISOLatin1StringEncoding); NSMapInsert(charsets, (void*)@"csisolatin1", (void*)NSISOLatin1StringEncoding); NSMapInsert(charsets, (void*)@"ia5", (void*)NSASCIIStringEncoding); NSMapInsert(charsets, (void*)@"iso-8859-2", (void*)NSISOLatin2StringEncoding); NSMapInsert(charsets, (void*)@"iso8859-2", (void*)NSISOLatin2StringEncoding); NSMapInsert(charsets, (void*)@"microsoft-symbol", (void*)NSSymbolStringEncoding); NSMapInsert(charsets, (void*)@"windows-symbol", (void*)NSSymbolStringEncoding); NSMapInsert(charsets, (void*)@"microsoft-cp1250", (void*)NSWindowsCP1250StringEncoding); NSMapInsert(charsets, (void*)@"windows-1250", (void*)NSWindowsCP1250StringEncoding); NSMapInsert(charsets, (void*)@"microsoft-cp1251", (void*)NSWindowsCP1251StringEncoding); NSMapInsert(charsets, (void*)@"windows-1251", (void*)NSWindowsCP1251StringEncoding); NSMapInsert(charsets, (void*)@"microsoft-cp1252", (void*)NSWindowsCP1252StringEncoding); NSMapInsert(charsets, (void*)@"windows-1252", (void*)NSWindowsCP1252StringEncoding); NSMapInsert(charsets, (void*)@"microsoft-cp1253", (void*)NSWindowsCP1253StringEncoding); NSMapInsert(charsets, (void*)@"windows-1253", (void*)NSWindowsCP1253StringEncoding); NSMapInsert(charsets, (void*)@"microsoft-cp1254", (void*)NSWindowsCP1254StringEncoding); NSMapInsert(charsets, (void*)@"windows-1254", (void*)NSWindowsCP1254StringEncoding); NSMapInsert(charsets, (void*)@"iso-10646-ucs-2", (void*)NSUnicodeStringEncoding); NSMapInsert(charsets, (void*)@"iso10646-ucs-2", (void*)NSUnicodeStringEncoding); NSMapInsert(charsets, (void*)@"utf-16", (void*)NSUnicodeStringEncoding); NSMapInsert(charsets, (void*)@"utf16", (void*)NSUnicodeStringEncoding); NSMapInsert(charsets, (void*)@"iso-10646-1", (void*)NSUnicodeStringEncoding); NSMapInsert(charsets, (void*)@"iso10646-1", (void*)NSUnicodeStringEncoding); NSMapInsert(charsets, (void*)@"jisx0201.1976", (void*)NSShiftJISStringEncoding); NSMapInsert(charsets, (void*)@"jisx0201", (void*)NSShiftJISStringEncoding); NSMapInsert(charsets, (void*)@"shift_JIS", (void*)NSShiftJISStringEncoding); NSMapInsert(charsets, (void*)@"utf-8", (void*)NSUTF8StringEncoding); NSMapInsert(charsets, (void*)@"utf8", (void*)NSUTF8StringEncoding); NSMapInsert(charsets, (void*)@"apple-roman", (void*)NSMacOSRomanStringEncoding); /* Also map from Apple encoding names. */ NSMapInsert(charsets, (void*)@"NSASCIIStringEncoding", (void*)NSASCIIStringEncoding); NSMapInsert(charsets, (void*)@"NSNEXTSTEPStringEncoding", (void*)NSNEXTSTEPStringEncoding); NSMapInsert(charsets, (void*)@"NSJapaneseEUCStringEncoding", (void*)NSJapaneseEUCStringEncoding); NSMapInsert(charsets, (void*)@"NSUTF8StringEncoding", (void*)NSUTF8StringEncoding); NSMapInsert(charsets, (void*)@"NSISOLatin1StringEncoding", (void*)NSISOLatin1StringEncoding); NSMapInsert(charsets, (void*)@"NSSymbolStringEncoding", (void*)NSSymbolStringEncoding); NSMapInsert(charsets, (void*)@"NSNonLossyASCIIStringEncoding", (void*)NSNonLossyASCIIStringEncoding); NSMapInsert(charsets, (void*)@"NSShiftJISStringEncoding", (void*)NSShiftJISStringEncoding); NSMapInsert(charsets, (void*)@"NSISOLatin2StringEncoding", (void*)NSISOLatin2StringEncoding); NSMapInsert(charsets, (void*)@"NSUnicodeStringEncoding", (void*)NSUnicodeStringEncoding); NSMapInsert(charsets, (void*)@"NSWindowsCP1251StringEncoding", (void*)NSWindowsCP1251StringEncoding); NSMapInsert(charsets, (void*)@"NSWindowsCP1252StringEncoding", (void*)NSWindowsCP1252StringEncoding); NSMapInsert(charsets, (void*)@"NSWindowsCP1253StringEncoding", (void*)NSWindowsCP1253StringEncoding); NSMapInsert(charsets, (void*)@"NSWindowsCP1254StringEncoding", (void*)NSWindowsCP1254StringEncoding); NSMapInsert(charsets, (void*)@"NSWindowsCP1250StringEncoding", (void*)NSWindowsCP1250StringEncoding); NSMapInsert(charsets, (void*)@"NSISO2022JPStringEncoding", (void*)NSISO2022JPStringEncoding); NSMapInsert(charsets, (void*)@"NSMacOSRomanStringEncoding", (void*)NSMacOSRomanStringEncoding); NSMapInsert(charsets, (void*)@"NSUTF16BigEndianStringEncoding", (void*)NSUTF16BigEndianStringEncoding); NSMapInsert(charsets, (void*)@"NSUTF16LittleEndianStringEncoding", (void*)NSUTF16LittleEndianStringEncoding); NSMapInsert(charsets, (void*)@"NSUTF32StringEncoding", (void*)NSUTF32StringEncoding); NSMapInsert(charsets, (void*)@"NSUTF32BigEndianStringEncoding", (void*)NSUTF32BigEndianStringEncoding); NSMapInsert(charsets, (void*)@"NSUTF32LittleEndianStringEncoding", (void*)NSUTF32LittleEndianStringEncoding); #if !defined(NeXT_Foundation_LIBRARY) NSMapInsert(charsets, (void*)@"gsm0338", (void*)NSGSM0338StringEncoding); NSMapInsert(charsets, (void*)@"iso-8859-3", (void*)NSISOLatin3StringEncoding); NSMapInsert(charsets, (void*)@"iso8859-3", (void*)NSISOLatin3StringEncoding); NSMapInsert(charsets, (void*)@"iso-8859-4", (void*)NSISOLatin4StringEncoding); NSMapInsert(charsets, (void*)@"iso8859-4", (void*)NSISOLatin4StringEncoding); NSMapInsert(charsets, (void*)@"iso-8859-5", (void*)NSISOCyrillicStringEncoding); NSMapInsert(charsets, (void*)@"iso8859-5", (void*)NSISOCyrillicStringEncoding); NSMapInsert(charsets, (void*)@"iso-8859-6", (void*)NSISOArabicStringEncoding); NSMapInsert(charsets, (void*)@"iso8859-6", (void*)NSISOArabicStringEncoding); NSMapInsert(charsets, (void*)@"iso-8859-7", (void*)NSISOGreekStringEncoding); NSMapInsert(charsets, (void*)@"iso8859-7", (void*)NSISOGreekStringEncoding); NSMapInsert(charsets, (void*)@"iso-8859-8", (void*)NSISOHebrewStringEncoding); NSMapInsert(charsets, (void*)@"iso8859-8", (void*)NSISOHebrewStringEncoding); NSMapInsert(charsets, (void*)@"iso-8859-9", (void*)NSISOLatin5StringEncoding); NSMapInsert(charsets, (void*)@"iso8859-9", (void*)NSISOLatin5StringEncoding); NSMapInsert(charsets, (void*)@"iso-8859-10", (void*)NSISOLatin6StringEncoding); NSMapInsert(charsets, (void*)@"iso8859-10", (void*)NSISOLatin6StringEncoding); NSMapInsert(charsets, (void*)@"iso-8859-11", (void*)NSISOThaiStringEncoding); NSMapInsert(charsets, (void*)@"iso8859-11", (void*)NSISOThaiStringEncoding); NSMapInsert(charsets, (void*)@"iso-8859-13", (void*)NSISOLatin7StringEncoding); NSMapInsert(charsets, (void*)@"iso8859-13", (void*)NSISOLatin7StringEncoding); NSMapInsert(charsets, (void*)@"iso-8859-14", (void*)NSISOLatin8StringEncoding); NSMapInsert(charsets, (void*)@"iso8859-14", (void*)NSISOLatin8StringEncoding); NSMapInsert(charsets, (void*)@"iso-8859-15", (void*)NSISOLatin9StringEncoding); NSMapInsert(charsets, (void*)@"iso8859-15", (void*)NSISOLatin9StringEncoding); NSMapInsert(charsets, (void*)@"big5", (void*)NSBig5StringEncoding); NSMapInsert(charsets, (void*)@"utf-7", (void*)NSUTF7StringEncoding); NSMapInsert(charsets, (void*)@"utf7", (void*)NSUTF7StringEncoding); NSMapInsert(charsets, (void*)@"koi8-r", (void*)NSKOI8RStringEncoding); NSMapInsert(charsets, (void*)@"ksc5601.1987", (void*)NSKoreanEUCStringEncoding); NSMapInsert(charsets, (void*)@"ksc5601", (void*)NSKoreanEUCStringEncoding); NSMapInsert(charsets, (void*)@"ksc5601.1997", (void*)NSKoreanEUCStringEncoding); NSMapInsert(charsets, (void*)@"ksc5601", (void*)NSKoreanEUCStringEncoding); NSMapInsert(charsets, (void*)@"gb2312.1980", (void*)NSChineseEUCStringEncoding); NSMapInsert(charsets, (void*)@"gb2312", (void*)NSChineseEUCStringEncoding); NSMapInsert(charsets, (void*)@"ibm437", (void*)NSDOSLatinUSStringEncoding); NSMapInsert(charsets, (void*)@"cp437", (void*)NSDOSLatinUSStringEncoding); NSMapInsert(charsets, (void*)@"ibm737", (void*)NSDOSGreekStringEncoding); NSMapInsert(charsets, (void*)@"cp737", (void*)NSDOSGreekStringEncoding); NSMapInsert(charsets, (void*)@"ibm775", (void*)NSDOSBalticRimStringEncoding); NSMapInsert(charsets, (void*)@"cp775", (void*)NSDOSBalticRimStringEncoding); NSMapInsert(charsets, (void*)@"ibm850", (void*)NSDOSLatin1StringEncoding); NSMapInsert(charsets, (void*)@"cp850", (void*)NSDOSLatin1StringEncoding); NSMapInsert(charsets, (void*)@"ibm851", (void*)NSDOSGreek1StringEncoding); NSMapInsert(charsets, (void*)@"cp851", (void*)NSDOSGreek1StringEncoding); NSMapInsert(charsets, (void*)@"ibm852", (void*)NSDOSLatin2StringEncoding); NSMapInsert(charsets, (void*)@"cp852", (void*)NSDOSLatin2StringEncoding); NSMapInsert(charsets, (void*)@"ibm855", (void*)NSDOSCyrillicStringEncoding); NSMapInsert(charsets, (void*)@"cp855", (void*)NSDOSCyrillicStringEncoding); NSMapInsert(charsets, (void*)@"ibm857", (void*)NSDOSTurkishStringEncoding); NSMapInsert(charsets, (void*)@"cp857", (void*)NSDOSTurkishStringEncoding); NSMapInsert(charsets, (void*)@"ibm861", (void*)NSDOSIcelandicStringEncoding); NSMapInsert(charsets, (void*)@"cp861", (void*)NSDOSIcelandicStringEncoding); NSMapInsert(charsets, (void*)@"ibm862", (void*)NSDOSHebrewStringEncoding); NSMapInsert(charsets, (void*)@"cp862", (void*)NSDOSHebrewStringEncoding); NSMapInsert(charsets, (void*)@"ibm863", (void*)NSDOSCanadianFrenchStringEncoding); NSMapInsert(charsets, (void*)@"cp863", (void*)NSDOSCanadianFrenchStringEncoding); NSMapInsert(charsets, (void*)@"ibm864", (void*)NSDOSArabicStringEncoding); NSMapInsert(charsets, (void*)@"cp864", (void*)NSDOSArabicStringEncoding); NSMapInsert(charsets, (void*)@"ibm865", (void*)NSDOSNordicStringEncoding); NSMapInsert(charsets, (void*)@"cp865", (void*)NSDOSNordicStringEncoding); NSMapInsert(charsets, (void*)@"ibm866", (void*)NSDOSRussianStringEncoding); NSMapInsert(charsets, (void*)@"cp866", (void*)NSDOSRussianStringEncoding); NSMapInsert(charsets, (void*)@"ibm869", (void*)NSDOSGreek2StringEncoding); NSMapInsert(charsets, (void*)@"cp869", (void*)NSDOSGreek2StringEncoding); NSMapInsert(charsets, (void*)@"ibm874", (void*)NSDOSThaiStringEncoding); NSMapInsert(charsets, (void*)@"cp874", (void*)NSDOSThaiStringEncoding); NSMapInsert(charsets, (void*)@"ibm932", (void*)NSDOSJapaneseStringEncoding); NSMapInsert(charsets, (void*)@"cp932", (void*)NSDOSJapaneseStringEncoding); NSMapInsert(charsets, (void*)@"ibm936", (void*)NSDOSChineseSimplifStringEncoding); NSMapInsert(charsets, (void*)@"cp936", (void*)NSDOSChineseSimplifStringEncoding); NSMapInsert(charsets, (void*)@"gbk", (void*)NSDOSChineseSimplifStringEncoding); NSMapInsert(charsets, (void*)@"ibm949", (void*)NSDOSKoreanStringEncoding); NSMapInsert(charsets, (void*)@"cp949", (void*)NSDOSKoreanStringEncoding); NSMapInsert(charsets, (void*)@"ibm950", (void*)NSDOSChineseTradStringEncoding); NSMapInsert(charsets, (void*)@"cp950", (void*)NSDOSChineseTradStringEncoding); NSMapInsert(charsets, (void*)@"windows-1255", (void*)NSWindowsHebrewStringEncoding); NSMapInsert(charsets, (void*)@"windows-1256", (void*)NSWindowsArabicStringEncoding); NSMapInsert(charsets, (void*)@"windows-1257", (void*)NSWindowsBalticRimStringEncoding); NSMapInsert(charsets, (void*)@"windows-1258", (void*)NSWindowsVietnameseStringEncoding); NSMapInsert(charsets, (void*)@"windows-1361", (void*)NSWindowsKoreanJohabStringEncoding); /* Also map from GNUstep encoding names. */ NSMapInsert(charsets, (void*)@"NSISOCyrillicStringEncoding", (void*)NSISOCyrillicStringEncoding); NSMapInsert(charsets, (void*)@"NSKOI8RStringEncoding", (void*)NSKOI8RStringEncoding); NSMapInsert(charsets, (void*)@"NSISOLatin3StringEncoding", (void*)NSISOLatin3StringEncoding); NSMapInsert(charsets, (void*)@"NSISOLatin4StringEncoding", (void*)NSISOLatin4StringEncoding); NSMapInsert(charsets, (void*)@"NSISOArabicStringEncoding", (void*)NSISOArabicStringEncoding); NSMapInsert(charsets, (void*)@"NSISOGreekStringEncoding", (void*)NSISOGreekStringEncoding); NSMapInsert(charsets, (void*)@"NSISOHebrewStringEncoding", (void*)NSISOHebrewStringEncoding); NSMapInsert(charsets, (void*)@"NSISOLatin5StringEncoding", (void*)NSISOLatin5StringEncoding); NSMapInsert(charsets, (void*)@"NSISOLatin6StringEncoding", (void*)NSISOLatin6StringEncoding); NSMapInsert(charsets, (void*)@"NSISOThaiStringEncoding", (void*)NSISOThaiStringEncoding); NSMapInsert(charsets, (void*)@"NSISOLatin7StringEncoding", (void*)NSISOLatin7StringEncoding); NSMapInsert(charsets, (void*)@"NSISOLatin8StringEncoding", (void*)NSISOLatin8StringEncoding); NSMapInsert(charsets, (void*)@"NSISOLatin9StringEncoding", (void*)NSISOLatin9StringEncoding); NSMapInsert(charsets, (void*)@"NSUTF7StringEncoding", (void*)NSUTF7StringEncoding); NSMapInsert(charsets, (void*)@"NSChineseEUCStringEncoding", (void*)NSChineseEUCStringEncoding); NSMapInsert(charsets, (void*)@"NSGSM0338StringEncoding", (void*)NSGSM0338StringEncoding); NSMapInsert(charsets, (void*)@"NSBig5StringEncoding", (void*)NSBig5StringEncoding); NSMapInsert(charsets, (void*)@"NSKoreanEUCStringEncoding", (void*)NSKoreanEUCStringEncoding); NSMapInsert(charsets, (void*)@"NSDOSLatinUSStringEncoding", (void*)NSDOSLatinUSStringEncoding); NSMapInsert(charsets, (void*)@"NSDOSGreekStringEncoding", (void*)NSDOSGreekStringEncoding); NSMapInsert(charsets, (void*)@"NSDOSBalticRimStringEncoding", (void*)NSDOSBalticRimStringEncoding); NSMapInsert(charsets, (void*)@"NSDOSLatin1StringEncoding", (void*)NSDOSLatin1StringEncoding); NSMapInsert(charsets, (void*)@"NSDOSGreek1StringEncoding", (void*)NSDOSGreek1StringEncoding); NSMapInsert(charsets, (void*)@"NSDOSLatin2StringEncoding", (void*)NSDOSLatin2StringEncoding); NSMapInsert(charsets, (void*)@"NSDOSCyrillicStringEncoding", (void*)NSDOSCyrillicStringEncoding); NSMapInsert(charsets, (void*)@"NSDOSTurkishStringEncoding", (void*)NSDOSTurkishStringEncoding); NSMapInsert(charsets, (void*)@"NSDOICortugueseStringEncoding", (void*)NSDOICortugueseStringEncoding); NSMapInsert(charsets, (void*)@"NSDOSIcelandicStringEncoding", (void*)NSDOSIcelandicStringEncoding); NSMapInsert(charsets, (void*)@"NSDOSHebrewStringEncoding", (void*)NSDOSHebrewStringEncoding); NSMapInsert(charsets, (void*)@"NSDOSCanadianFrenchStringEncoding", (void*)NSDOSCanadianFrenchStringEncoding); NSMapInsert(charsets, (void*)@"NSDOSArabicStringEncoding", (void*)NSDOSArabicStringEncoding); NSMapInsert(charsets, (void*)@"NSDOSNordicStringEncoding", (void*)NSDOSNordicStringEncoding); NSMapInsert(charsets, (void*)@"NSDOSRussianStringEncoding", (void*)NSDOSRussianStringEncoding); NSMapInsert(charsets, (void*)@"NSDOSGreek2StringEncoding", (void*)NSDOSGreek2StringEncoding); NSMapInsert(charsets, (void*)@"NSDOSThaiStringEncoding", (void*)NSDOSThaiStringEncoding); NSMapInsert(charsets, (void*)@"NSDOSJapaneseStringEncoding", (void*)NSDOSJapaneseStringEncoding); NSMapInsert(charsets, (void*)@"NSDOSChineseSimplifStringEncoding", (void*)NSDOSChineseSimplifStringEncoding); NSMapInsert(charsets, (void*)@"NSDOSKoreanStringEncoding", (void*)NSDOSKoreanStringEncoding); NSMapInsert(charsets, (void*)@"NSDOSChineseTradStringEncoding", (void*)NSDOSChineseTradStringEncoding); NSMapInsert(charsets, (void*)@"NSWindowsHebrewStringEncoding", (void*)NSWindowsHebrewStringEncoding); NSMapInsert(charsets, (void*)@"NSWindowsArabicStringEncoding", (void*)NSWindowsArabicStringEncoding); NSMapInsert(charsets, (void*)@"NSWindowsBalticRimStringEncoding", (void*)NSWindowsBalticRimStringEncoding); NSMapInsert(charsets, (void*)@"NSWindowsVietnameseStringEncoding", (void*)NSWindowsVietnameseStringEncoding); NSMapInsert(charsets, (void*)@"NSWindowsKoreanJohabStringEncoding", (void*)NSWindowsKoreanJohabStringEncoding); NSMapInsert(charsets, (void*)@"NSGB_2312_80StringEncoding", (void*)NSGB_2312_80StringEncoding); NSMapInsert(charsets, (void*)@"NSGBK_95StringEncoding", (void*)NSGBK_95StringEncoding); NSMapInsert(charsets, (void*)@"NSGB_18030_2000StringEncoding", (void*)NSGB_18030_2000StringEncoding); #endif } if (encodings == 0) { encodings = NSCreateMapTable (NSIntegerMapKeyCallBacks, NSObjectMapValueCallBacks, 0); [[NSObject leakAt: &encodings] release]; /* While the charset mappings above are many to one, * mapping a variety of names to one encoding, * the encodings map is a one to one mapping. * * The charset names used here should be the PREFERRED * charset names from the IANA registration if one is * specified. * We adopt the convention that all names are in lowercase. */ NSMapInsert(encodings, (void*)NSASCIIStringEncoding, (void*)@"us-ascii"); NSMapInsert(encodings, (void*)NSISOLatin1StringEncoding, (void*)@"iso-8859-1"); NSMapInsert(encodings, (void*)NSISOLatin2StringEncoding, (void*)@"iso-8859-2"); NSMapInsert(encodings, (void*)NSWindowsCP1250StringEncoding, (void*)@"windows-1250"); NSMapInsert(encodings, (void*)NSWindowsCP1251StringEncoding, (void*)@"windows-1251"); NSMapInsert(encodings, (void*)NSWindowsCP1252StringEncoding, (void*)@"windows-1252"); NSMapInsert(encodings, (void*)NSWindowsCP1253StringEncoding, (void*)@"windows-1253"); NSMapInsert(encodings, (void*)NSWindowsCP1254StringEncoding, (void*)@"windows-1254"); NSMapInsert(encodings, (void*)NSUnicodeStringEncoding, (void*)@"utf-16"); NSMapInsert(encodings, (void*)NSShiftJISStringEncoding, (void*)@"shift_JIS"); NSMapInsert(encodings, (void*)NSUTF8StringEncoding, (void*)@"utf-8"); NSMapInsert(encodings, (void*)NSMacOSRomanStringEncoding, (void*)@"apple-roman"); #if !defined(NeXT_Foundation_LIBRARY) NSMapInsert(encodings, (void*)NSISOLatin3StringEncoding, (void*)@"iso-8859-3"); NSMapInsert(encodings, (void*)NSISOLatin4StringEncoding, (void*)@"iso-8859-4"); NSMapInsert(encodings, (void*)NSISOCyrillicStringEncoding, (void*)@"iso-8859-5"); NSMapInsert(encodings, (void*)NSISOArabicStringEncoding, (void*)@"iso-8859-6"); NSMapInsert(encodings, (void*)NSISOGreekStringEncoding, (void*)@"iso-8859-7"); NSMapInsert(encodings, (void*)NSISOHebrewStringEncoding, (void*)@"iso-8859-8"); NSMapInsert(encodings, (void*)NSISOLatin5StringEncoding, (void*)@"iso-8859-9"); NSMapInsert(encodings, (void*)NSISOLatin6StringEncoding, (void*)@"iso-8859-10"); NSMapInsert(encodings, (void*)NSISOThaiStringEncoding, (void*)@"iso-8859-11"); NSMapInsert(encodings, (void*)NSISOLatin7StringEncoding, (void*)@"iso-8859-13"); NSMapInsert(encodings, (void*)NSISOLatin8StringEncoding, (void*)@"iso-8859-14"); NSMapInsert(encodings, (void*)NSISOLatin9StringEncoding, (void*)@"iso-8859-15"); NSMapInsert(encodings, (void*)NSBig5StringEncoding, (void*)@"big5"); NSMapInsert(encodings, (void*)NSUTF7StringEncoding, (void*)@"utf-7"); NSMapInsert(encodings, (void*)NSGSM0338StringEncoding, (void*)@"gsm0338"); NSMapInsert(encodings, (void*)NSKOI8RStringEncoding, (void*)@"koi8-r"); NSMapInsert(encodings, (void*)NSChineseEUCStringEncoding, (void*)@"gb2312.1980"); NSMapInsert(encodings, (void*)NSKoreanEUCStringEncoding, (void*)@"ksc5601.1987"); NSMapInsert(encodings, (void*)NSDOSLatinUSStringEncoding, (void*)@"cp437"); NSMapInsert(encodings, (void*)NSDOSGreekStringEncoding, (void*)@"cp737"); NSMapInsert(encodings, (void*)NSDOSBalticRimStringEncoding, (void*)@"cp775"); NSMapInsert(encodings, (void*)NSDOSLatin1StringEncoding, (void*)@"cp850"); NSMapInsert(encodings, (void*)NSDOSGreek1StringEncoding, (void*)@"cp851"); NSMapInsert(encodings, (void*)NSDOSLatin2StringEncoding, (void*)@"cp852"); NSMapInsert(encodings, (void*)NSDOSCyrillicStringEncoding, (void*)@"cp855"); NSMapInsert(encodings, (void*)NSDOSTurkishStringEncoding, (void*)@"cp857"); NSMapInsert(encodings, (void*)NSDOSIcelandicStringEncoding, (void*)@"cp861"); NSMapInsert(encodings, (void*)NSDOSHebrewStringEncoding, (void*)@"cp862"); NSMapInsert(encodings, (void*)NSDOSCanadianFrenchStringEncoding, (void*)@"cp863"); NSMapInsert(encodings, (void*)NSDOSArabicStringEncoding, (void*)@"cp864"); NSMapInsert(encodings, (void*)NSDOSNordicStringEncoding, (void*)@"cp865"); NSMapInsert(encodings, (void*)NSDOSRussianStringEncoding, (void*)@"cp866"); NSMapInsert(encodings, (void*)NSDOSGreek2StringEncoding, (void*)@"cp869"); NSMapInsert(encodings, (void*)NSDOSThaiStringEncoding, (void*)@"cp874"); NSMapInsert(encodings, (void*)NSDOSJapaneseStringEncoding, (void*)@"cp932"); NSMapInsert(encodings, (void*)NSDOSChineseSimplifStringEncoding, (void*)@"cp936"); NSMapInsert(encodings, (void*)NSDOSKoreanStringEncoding, (void*)@"cp949"); NSMapInsert(encodings, (void*)NSDOSChineseTradStringEncoding, (void*)@"cp950"); NSMapInsert(encodings, (void*)NSWindowsHebrewStringEncoding, (void*)@"windows-1255"); NSMapInsert(encodings, (void*)NSWindowsArabicStringEncoding, (void*)@"windows-1256"); NSMapInsert(encodings, (void*)NSWindowsBalticRimStringEncoding, (void*)@"windows-1257"); NSMapInsert(encodings, (void*)NSWindowsVietnameseStringEncoding, (void*)@"windows-1258"); NSMapInsert(encodings, (void*)NSWindowsKoreanJohabStringEncoding, (void*)@"windows-1361"); NSMapInsert(encodings, (void*)NSGB_18030_2000StringEncoding, (void*)@"gb18030"); #endif } if (headerClass == 0) { headerClass = [GSMimeHeader class]; } } } /** * Adds a part to a multipart document */ - (void) addContent: (id)newContent { if ([newContent isKindOfClass: documentClass] == NO) { [NSException raise: NSInvalidArgumentException format: @"Content to add is not a GSMimeDocument"]; } if (content == nil) { content = [NSMutableArray new]; } if ([content isKindOfClass: [NSMutableArray class]] == YES) { [content addObject: newContent]; } else { [NSException raise: NSInvalidArgumentException format: @"[%@ -%@] passed bad content", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; } } /** *

* This method may be called to add a header to the document. * The header must be a mutable dictionary object that contains * at least the fields that are standard for all headers. *

*

* Certain well-known headers are restricted to one occurrence in * an email, and when extra copies are added they replace originals. *

*

* The mime-version header is special ... it is inserted before any * other mime headers rather than being added at the end. *

*/ - (void) addHeader: (GSMimeHeader*)info { NSString *name = [info name]; if (name == nil || [name isEqualToString: @"unknown"] == YES) { [NSException raise: NSInvalidArgumentException format: @"[%@ -%@] header with invalid name", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; } if ([name isEqualToString: @"mime-version"] == YES || [name isEqualToString: @"content-disposition"] == YES || [name isEqualToString: @"content-transfer-encoding"] == YES || [name isEqualToString: CteContentType] == YES || [name isEqualToString: @"subject"] == YES) { NSUInteger index = [self _indexOfHeaderNamed: name]; if (index != NSNotFound) { [headers replaceObjectAtIndex: index withObject: info]; } else if ([name isEqualToString: @"mime-version"] == YES) { NSUInteger tmp; index = [headers count]; tmp = [self _indexOfHeaderNamed: @"content-disposition"]; if (tmp != NSNotFound && tmp < index) { index = tmp; } tmp = [self _indexOfHeaderNamed: @"content-transfer-encoding"]; if (tmp != NSNotFound && tmp < index) { index = tmp; } tmp = [self _indexOfHeaderNamed: CteContentType]; if (tmp != NSNotFound && tmp < index) { index = tmp; } [headers insertObject: info atIndex: index]; } else { [headers addObject: info]; } } else { [headers addObject: info]; } } /** * Convenience method to create a new header and add it to the receiver.
* Returns the newly created header.
* See [GSMimeHeader-initWithName:value:parameters:] and -addHeader: methods. */ - (GSMimeHeader*) addHeader: (NSString*)name value: (NSString*)value parameters: (NSDictionary*)parameters { GSMimeHeader *hdr; hdr = [headerClass alloc]; hdr = [hdr initWithName: name value: value parameters: parameters]; [self addHeader: hdr]; RELEASE(hdr); return hdr; } /** *

* This method returns an array containing GSMimeHeader objects * representing the headers associated with the document. *

*

* The order of the headers in the array is the order of the * headers in the document. *

*/ - (NSArray*) allHeaders { return [NSArray arrayWithArray: headers]; } /** * This returns the content data of the document in the same format in * which the data was placed in the document. This may be one of - * * text * an NSString object * binary * an NSData object * multipart * an NSArray object containing GSMimeDocument objects * * If you want to be sure that you get a particular type of data, use the * -convertToData or -convertToText method. */ - (id) content { return content; } /** * Search the content of this document to locate a part whose content ID * matches the specified key. Recursively descend into other documents.
* Wraps the supplied key in angle brackets if they are not present.
* Return nil if no match is found, the matching GSMimeDocument otherwise. */ - (id) contentByID: (NSString*)key { if ([key hasPrefix: @"<"] == NO) { key = [NSStringClass stringWithFormat: @"<%@>", key]; } if ([content isKindOfClass: NSArrayClass] == YES) { NSEnumerator *e = [content objectEnumerator]; GSMimeDocument *d; while ((d = [e nextObject]) != nil) { if ([[d contentID] isEqualToString: key] == YES) { return d; } d = [d contentByID: key]; if (d != nil) { return d; } } } return nil; } /** * Search the content of this document to locate a part whose content ID * matches the specified key. Recursively descend into other documents.
* Wraps the supplied key in angle brackets if they are not present.
* Return nil if no match is found, the matching GSMimeDocument otherwise. */ - (id) contentByLocation: (NSString*)key { if ([content isKindOfClass: NSArrayClass] == YES) { NSEnumerator *e = [content objectEnumerator]; GSMimeDocument *d; while ((d = [e nextObject]) != nil) { if ([[d contentLocation] isEqualToString: key] == YES) { return d; } d = [d contentByLocation: key]; if (d != nil) { return d; } } } return nil; } /** * Search the content of this document to locate a part whose content-type * name or content-disposition name matches the specified key. * Recursively descend into other documents.
* Return nil if no match is found, the matching GSMimeDocument otherwise. */ - (id) contentByName: (NSString*)key { if ([content isKindOfClass: NSArrayClass] == YES) { NSEnumerator *e = [content objectEnumerator]; GSMimeDocument *d; while ((d = [e nextObject]) != nil) { GSMimeHeader *hdr; hdr = [d headerNamed: CteContentType]; if ([[hdr parameterForKey: @"name"] isEqualToString: key] == YES) { return d; } hdr = [d headerNamed: @"content-disposition"]; if ([[hdr parameterForKey: @"name"] isEqualToString: key] == YES) { return d; } d = [d contentByName: key]; if (d != nil) { return d; } } } return nil; } /** Convenience method to fetch the content file name from the content-type * or content-disposition header. */ - (NSString*) contentFile { GSMimeHeader *hdr = [self headerNamed: CteContentType]; NSString *str = [hdr parameterForKey: @"name"]; if (nil == str) { hdr = [self headerNamed: @"content-disposition"]; str = [hdr parameterForKey: @"filename"]; } return str; } /** * Convenience method to fetch the content ID from the header. */ - (NSString*) contentID { GSMimeHeader *hdr = [self headerNamed: @"content-id"]; return [hdr value]; } /** * Convenience method to fetch the content location from the header. */ - (NSString*) contentLocation { GSMimeHeader *hdr = [self headerNamed: @"content-location"]; return [hdr value]; } /** * Convenience method to fetch the content name from the header. */ - (NSString*) contentName { GSMimeHeader *hdr = [self headerNamed: CteContentType]; return [hdr parameterForKey: @"name"]; } /** * Convenience method to fetch the content sub-type from the header. */ - (NSString*) contentSubtype { GSMimeHeader *hdr = [self headerNamed: CteContentType]; NSString *val = nil; if (hdr != nil) { val = [hdr objectForKey: @"Subtype"]; if (val == nil) { val = [hdr value]; if (val != nil) { NSRange r; r = [val rangeOfString: @"/"]; if (r.length > 0) { val = [val substringFromIndex: r.location + 1]; r = [val rangeOfString: @"/"]; if (r.length > 0) { val = [val substringToIndex: r.location]; } val = [val stringByTrimmingSpaces]; [hdr setObject: val forKey: @"Subtype"]; } else { val = nil; } } } } return val; } /** * Convenience method to fetch the content type from the header. */ - (NSString*) contentType { GSMimeHeader *hdr = [self headerNamed: CteContentType]; NSString *val = nil; if (hdr != nil) { val = [hdr objectForKey: @"Type"]; if (val == nil) { val = [hdr value]; if (val != nil) { NSRange r; r = [val rangeOfString: @"/"]; if (r.length > 0) { val = [val substringToIndex: r.location]; val = [val stringByTrimmingSpaces]; } [hdr setObject: val forKey: @"Type"]; } } } return val; } /** * Search the content of this document to locate all parts whose content-type * name or content-disposition name matches the specified key. * Do NOT recurse into other documents.
* Return nil if no match is found, an array of matching GSMimeDocument * instances otherwise. */ - (NSArray*) contentsByName: (NSString*)key { NSMutableArray *a = nil; if ([content isKindOfClass: NSArrayClass] == YES) { NSEnumerator *e = [content objectEnumerator]; GSMimeDocument *d; while ((d = [e nextObject]) != nil) { GSMimeHeader *hdr; BOOL match = YES; hdr = [d headerNamed: CteContentType]; if ([[hdr parameterForKey: @"name"] isEqualToString: key] == NO) { hdr = [d headerNamed: @"content-disposition"]; if ([[hdr parameterForKey: @"name"] isEqualToString: key] == NO) { match = NO; } } if (match == YES) { if (a == nil) { a = [NSMutableArray arrayWithCapacity: 4]; } [a addObject: d]; } } } return a; } /** * Converts any binary parts of the receiver's content to be base64 * (or quoted-printable for text parts) encoded rather than 8bit or * binary encoded ... a convenience method to make the results of * the -rawMimeData method safe for sending via routes which only * support 7bit data. */ - (void) convertTo7BitSafe { if ([content isKindOfClass: NSArrayClass] == YES) { NSEnumerator *e = [content objectEnumerator]; GSMimeDocument *d; while ((d = [e nextObject]) != nil) { [d convertTo7BitSafe]; } } else { GSMimeHeader *h = [self headerNamed: @"content-transfer-encoding"]; NSString *v = [h value]; /* If there's no header then the implied encoding is 7bit. * When there is a header, there are trwo possible 8bit encodings * that we need to deal with... */ if (v != nil && ([CteBinary caseInsensitiveCompare: v] == NSOrderedSame || [Cte8bit caseInsensitiveCompare: v] == NSOrderedSame)) { GSMimeHeader *t = [self headerNamed: CteContentType]; NSString *charset = [t parameterForKey: @"charset"]; BOOL isText = (nil == charset) ? NO : YES; /* The presence of a charset parameter implies that the content * is text, but if it's missing we may still have text content */ if (NO == isText) { NSString *type = [t objectForKey: @"Type"]; if ([type isEqualToString: @"text"] == YES) { isText = YES; } else if ([type isEqualToString: @"application"] == YES) { NSString *subtype = [t objectForKey: @"Subtype"]; if ([subtype isEqualToString: @"json"] == YES) { isText = YES; } } } if (YES == isText) { NSStringEncoding e; e = [documentClass encodingFromCharset: charset]; #if defined(NeXT_Foundation_LIBRARY) if (e != NSASCIIStringEncoding) #else if (e != NSASCIIStringEncoding && e != NSUTF7StringEncoding) #endif { v = CteQuotedPrintable; } else { v = Cte7bit; } } else { v = CteBase64; } if (nil == h) { [self setHeader: @"Content-Transfer-Encoding" value: v parameters: nil]; } else { [h setValue: v]; } } } } - (void) convertToBase64 { [self convertTo7BitSafe]; } /** * Converts any base64 (or quoted-printable) encoded parts of the receiver's * content to be binary encoded instead ... a convenience method to * shrink down the size of the message when converted to data using * the -rawMimeData method. */ - (void) convertToBinary { if ([content isKindOfClass: NSArrayClass] == YES) { NSEnumerator *e = [content objectEnumerator]; GSMimeDocument *d; while ((d = [e nextObject]) != nil) { [d convertToBinary]; } } else { GSMimeHeader *h = [self headerNamed: @"content-transfer-encoding"]; NSString *v = [h value]; if (v != nil && ([CteBase64 caseInsensitiveCompare: v] == NSOrderedSame || [CteQuotedPrintable caseInsensitiveCompare: v] == NSOrderedSame)) { [h setValue: CteBinary]; } } } /** * Return the content as an NSData object (unless it is multipart)
* Perform conversion from text to data using the charset specified in * the content-type header, or infer the charset, and update the header * accordingly.
* If the content can not be represented as a plain NSData object, this * method returns nil. */ - (NSData*) convertToData { NSData *d = nil; if ([content isKindOfClass: NSStringClass] == YES) { GSMimeHeader *hdr = [self headerNamed: CteContentType]; NSString *charset = [hdr parameterForKey: @"charset"]; NSString *subtype; NSStringEncoding enc; if (nil == charset && nil != (subtype = [self contentSubtype]) && [@"xml" caseInsensitiveCompare: subtype] == NSOrderedSame) { /* For an XML document (subtype is xml) we can try to get the * characterset by examining the document header. */ if (nil == (charset = [documentClass charsetForXml: content])) { charset = @"utf-8"; } } enc = [documentClass encodingFromCharset: charset]; d = [content dataUsingEncoding: enc]; if (nil == d) { charset = selectCharacterSet(content, &d); if (nil == hdr) { hdr = [self setHeader: @"Content-Type" value: @"text/plain" parameters: nil]; [hdr setObject: @"text" forKey: @"Type"]; [hdr setObject: @"plain" forKey: @"Subtype"]; } [hdr setParameter: charset forKey: @"charset"]; } } else if ([content isKindOfClass: NSDataClass] == YES) { d = content; } return d; } /** * Return the content as an NSString object (unless it is multipart) * If the content cannot be represented as text, this returns nil. */ - (NSString*) convertToText { NSString *s = nil; if ([content isKindOfClass: NSStringClass] == YES) { s = content; } else if ([content isKindOfClass: NSDataClass] == YES) { GSMimeHeader *hdr = [self headerNamed: CteContentType]; NSString *charset = [hdr parameterForKey: @"charset"]; NSString *subtype = [self contentSubtype]; NSStringEncoding enc; if (nil == charset) { /* Treat xml as a special case ... if we have no charset * specified then we can get the charset from the xml header */ if ([subtype isEqualToString: @"xml"] == YES) { charset = [documentClass charsetForXml: content]; } if (nil == charset) { charset = @"utf-8"; } } enc = [documentClass encodingFromCharset: charset]; if (NSASCIIStringEncoding == enc) { enc = NSUTF8StringEncoding; } s = [NSStringClass allocWithZone: NSDefaultMallocZone()]; s = [s initWithData: content encoding: enc]; IF_NO_ARC([s autorelease];) } return s; } /** * Returns a copy of the receiver. */ - (id) copyWithZone: (NSZone*)z { GSMimeDocument *c = [documentClass allocWithZone: z]; c->headers = [[NSMutableArray allocWithZone: z] initWithArray: headers copyItems: YES]; if ([content isKindOfClass: NSArrayClass] == YES) { c->content = [[NSMutableArray allocWithZone: z] initWithArray: content copyItems: YES]; } else { c->content = [content copyWithZone: z]; } return c; } - (void) dealloc { RELEASE(headers); RELEASE(content); [super dealloc]; } /** * Deletes all ocurrances of parts identical to aPart from the receiver.
* Recursively deletes from enclosed documents as necessary. */ - (void) deleteContent: (GSMimeDocument*)aPart { if (aPart != nil) { if ([content isKindOfClass: [NSMutableArray class]] == YES) { NSUInteger count = [content count]; while (count-- > 0) { GSMimeDocument *part = [content objectAtIndex: count]; if (part == aPart) { [content removeObjectAtIndex: count]; } else { [part deleteContent: part]; // Recursive. } } } } } /** * This method removes all occurrences of header objects identical to * the one supplied as an argument. */ - (void) deleteHeader: (GSMimeHeader*)aHeader { [headers removeObjectIdenticalTo: aHeader]; } /** * This method removes all occurrences of headers whose name * matches the supplied string. */ - (void) deleteHeaderNamed: (NSString*)name { NSUInteger count = [headers count]; if (count > 0) { oaiIMP imp1; boolIMP imp2; name = [name lowercaseString]; imp1 = (oaiIMP)[headers methodForSelector: @selector(objectAtIndex:)]; imp2 = (boolIMP)[name methodForSelector: @selector(isEqualToString:)]; while (count-- > 0) { GSMimeHeader *info; info = (*imp1)(headers, @selector(objectAtIndex:), count); if ((*imp2)(name, @selector(isEqualToString:), [info name])) { [headers removeObjectAtIndex: count]; } } } } - (void) _descriptionTo: (NSMutableString*)m level: (NSUInteger)level { NSUInteger count; NSUInteger index; NSUInteger pad; for (pad = 0; pad < level; pad++) { [m appendString: @" "]; } [m appendString: [super description]]; [m appendString: @"\n"]; level++; if ((count = [headers count]) > 0) { for (pad = 0; pad < level; pad++) { [m appendString: @" "]; } [m appendString: @"Headers:\n"]; for (index = 0; index < count; index++) { for (pad = 0; pad <= level; pad++) { [m appendString: @" "]; } [m appendString: [[headers objectAtIndex: index] description]]; [m appendString: @"\n"]; } } for (pad = 0; pad < level; pad++) { [m appendString: @" "]; } [m appendString: @"Content:\n"]; if ([content isKindOfClass: NSDataClass]) { NSString *t = [self convertToText]; NSUInteger l = [content length]; int hl = (int)(((l + 2) / 3) * 4); uint8_t *hex; hex = (uint8_t*)malloc(hl + 1); hex[hl] = '\0'; GSPrivateEncodeBase64([content bytes], l, hex); if (nil != t) { for (pad = 0; pad <= level; pad++) { [m appendString: @" "]; } [m appendFormat: @"%lu chars: ", (unsigned long)[t length]]; [m appendString: t]; [m appendString: @"\n"]; } for (pad = 0; pad <= level; pad++) { [m appendString: @" "]; } [m appendFormat: @"%lu bytes: <[%s]>\n", (unsigned long)l, (char*)hex]; free(hex); } else if ([content isKindOfClass: NSStringClass]) { for (pad = 0; pad <= level; pad++) { [m appendString: @" "]; } [m appendFormat: @"%lu chars: ", (unsigned long)[content length]]; [m appendString: content]; [m appendString: @"\n"]; } else { count = [content count]; for (index = 0; index < count; index++) { [[content objectAtIndex: index] _descriptionTo: m level: level+1]; } } } - (NSString*) description { NSString *s; ENTER_POOL NSMutableString *m = [NSMutableString stringWithCapacity: 1000]; [self _descriptionTo: m level: 0]; s = RETAIN(m); LEAVE_POOL return AUTORELEASE(s); } - (NSUInteger) estimatedSize { NSUInteger total = 0; NSEnumerator *enumerator = [headers objectEnumerator]; GSMimeHeader *hdr; /* Accumulate approximate size of all the headers. */ while (nil != (hdr = [enumerator nextObject])) { total += [hdr estimatedSize]; } if ([content isKindOfClass: [NSArray class]]) { GSMimeDocument *doc; /* For each part, add the size of the part plus the typical size * of an inter-part boundary. */ enumerator = [content objectEnumerator]; while (nil != (doc = [enumerator nextObject])) { total += [doc estimatedSize] + 40; } } else { /* If we base64 encode the data it will be 4/3 the size of the * raw byte counts ... assume that as an estimate. */ total += [content length] * 4 / 3; } return total; } - (NSUInteger) hash { return [[self content] hash]; } /** * This method returns the first header whose name equals the supplied argument. */ - (GSMimeHeader*) headerNamed: (NSString*)name { NSUInteger count = [headers count]; if (count > 0) { NSUInteger index; oaiIMP imp1; boolIMP imp2; name = [headerClass makeToken: name preservingCase: NO]; imp1 = (oaiIMP)[headers methodForSelector: @selector(objectAtIndex:)]; imp2 = (boolIMP)[name methodForSelector: @selector(isEqualToString:)]; for (index = 0; index < count; index++) { GSMimeHeader *info; info = (*imp1)(headers, @selector(objectAtIndex:), index); if ((*imp2)(name, @selector(isEqualToString:), [info name])) { return info; } } } return nil; } /** * This method returns an array of GSMimeHeader objects for all headers * whose names equal the supplied argument. */ - (NSArray*) headersNamed: (NSString*)name { NSUInteger count; name = [headerClass makeToken: name preservingCase: NO]; count = [headers count]; if (count > 0) { NSUInteger index; NSMutableArray *array; oaiIMP imp1; boolIMP imp2; imp1 = (oaiIMP)[headers methodForSelector: @selector(objectAtIndex:)]; imp2 = (boolIMP)[name methodForSelector: @selector(isEqualToString:)]; array = [NSMutableArray array]; for (index = 0; index < count; index++) { GSMimeHeader *info; info = (*imp1)(headers, @selector(objectAtIndex:), index); if ((*imp2)(name, @selector(isEqualToString:), [info name])) { [array addObject: info]; } } return array; } return [NSArray array]; } - (id) init { if ((self = [super init]) != nil) { headers = [NSMutableArray new]; } return self; } - (BOOL) isEqual: (id)other { if (other == self) { return YES; } if (NO == [other isKindOfClass: [GSMimeDocument class]]) { return NO; } if (NO == [headers isEqual: ((GSMimeDocument*)other)->headers]) { return NO; } if (NO == [content isEqual: ((GSMimeDocument*)other)->content]) { return NO; } return YES; } /** *

Make a probably unique string suitable for use as the * boundary parameter in the content of a multipart document. *

*

This implementation provides base64 encoded data * consisting of an MD5 digest of some pseudo random stuff, * plus an incrementing counter. The inclusion of the counter * guarantees that we won't produce two identical strings in * the same run of the program. *

*

The boundary has a suffix of '=_' to ensure it's not mistaken * for quoted-printable data. *

*/ - (NSString*) makeBoundary { static int count = 0; uint8_t output[20]; uint8_t *ptr; NSString *result; NSData *source; NSData *digest; int sequence = ++count; source = [[[NSProcessInfo processInfo] globallyUniqueString] dataUsingEncoding: NSUTF8StringEncoding]; digest = [source md5Digest]; memcpy(output, [digest bytes], 16); output[16] = (sequence >> 24) & 0xff; output[17] = (sequence >> 16) & 0xff; output[18] = (sequence >> 8) & 0xff; output[19] = sequence & 0xff; ptr = (uint8_t*)NSZoneMalloc(NSDefaultMallocZone(), 30); GSPrivateEncodeBase64(output, 20, ptr); ptr[28] = '='; ptr[29] = '_'; result = [NSStringClass allocWithZone: NSDefaultMallocZone()]; result = [result initWithBytesNoCopy: ptr length: 30 encoding: NSASCIIStringEncoding freeWhenDone: YES]; return AUTORELEASE(result); } /** * Create new content ID header, set it as the content ID of the document * and return it.
* This is a convenience method which simply places angle brackets around * an [NSProcessInfo-globallyUniqueString] to form the header value. */ - (GSMimeHeader*) makeContentID { GSMimeHeader *hdr; NSString *str = [[NSProcessInfo processInfo] globallyUniqueString]; str = [NSStringClass stringWithFormat: @"<%@>", str]; hdr = [self setHeader: @"Content-ID" value: str parameters: nil]; return hdr; } /** * Deprecated ... use -setHeader:value:parameters: */ - (GSMimeHeader*) makeHeader: (NSString*)name value: (NSString*)value parameters: (NSDictionary*)parameters { GSMimeHeader *hdr; hdr = [[headerClass alloc] initWithName: name value: value parameters: parameters]; [self setHeader: hdr]; RELEASE(hdr); return hdr; } /** * Create new message ID header, set it as the message ID of the document * and return it.
* This is a convenience method which simply places angle brackets around * an [NSProcessInfo-globallyUniqueString] to form the header value. */ - (GSMimeHeader*) makeMessageID { GSMimeHeader *hdr; NSString *str = [[NSProcessInfo processInfo] globallyUniqueString]; str = [NSStringClass stringWithFormat: @"<%@>", str]; hdr = [self setHeader: @"Message-ID" value: str parameters: nil]; return hdr; } /** * Return an NSData object representing the MIME document as raw data * ready to be sent via an email system.
* Calls -rawMimeData: with the isOuter flag set to YES. */ - (NSMutableData*) rawMimeData { return [self rawMimeData: YES]; } /** *

Return an NSData object representing the MIME document as raw data * ready to be sent via an email system. *

*

The isOuter flag denotes whether this document is the outermost * part of a MIME message, or is a part of a multipart message. *

*

Long lines are folded at the default column. *

*/ - (NSMutableData*) rawMimeData: (BOOL)isOuter { // 78 is the maximum line length specified by MIME RFCs return [self rawMimeData: isOuter foldedAt: 78]; } /** *

Return an NSData object representing the MIME document as raw data * ready to be sent via an email system. *

*

The isOuter flag denotes whether this document is the outermost * part of a MIME message, or is a part of a multipart message. *

*

The fold number specifes the column at which lines are considered * to be 'long', and get broken/folded. *

*

During generation of the document this method will perform some * consistency checks and try to automatically generate missing header * information needed to build the mime data (eg. filling in the boundary * parameter in the content-type header for multipart documents).
* However, you should not depend on automatic behaviors but should * fill in as much detail as possible before generating data. *

*/ - (NSMutableData*) rawMimeData: (BOOL)isOuter foldedAt: (NSUInteger)fold { NSMutableArray *partData = nil; NSMutableData *md = [NSMutableData dataWithCapacity: 1024]; NSData *d = nil; NSEnumerator *enumerator; GSMimeHeader *type; GSMimeHeader *enc; GSMimeHeader *hdr; NSData *boundary = 0; BOOL contentIsBinary = NO; BOOL contentIs7bit = YES; NSUInteger count; NSUInteger i; NSAutoreleasePool *arp = [NSAutoreleasePool new]; if (isOuter == YES) { /* * Ensure there is a mime version header. */ if (nil == [self headerNamed: @"mime-version"]) { [self setHeader: @"MIME-Version" value: @"1.0" parameters: nil]; } } else { /* * Inner documents should not contain the mime version header. */ if (nil != (hdr = [self headerNamed: @"mime-version"])) { [self deleteHeader: hdr]; } } if ([content isKindOfClass: NSArrayClass] == YES) { count = [content count]; partData = [NSMutableArray arrayWithCapacity: count]; for (i = 0; i < count; i++) { GSMimeDocument *part = [content objectAtIndex: i]; [partData addObject: [part rawMimeData: NO foldedAt: fold]]; /* * If any part of a multipart document is not 7bit then * the document as a whole must not be 7bit either. * It is important to check this *after* the part has been * processed by -rawMimeData:foldedAt:, so we know that the * encoding set for the part is valid. */ if (contentIs7bit == YES) { NSString *v; enc = [part headerNamed: @"content-transfer-encoding"]; v = [enc value]; if (nil != v && ([Cte8bit caseInsensitiveCompare: v] == NSOrderedSame || [CteBinary caseInsensitiveCompare: v] == NSOrderedSame)) { contentIs7bit = NO; if ([CteBinary caseInsensitiveCompare: v] == NSOrderedSame) { contentIsBinary = YES; } } } } } type = [self headerNamed: CteContentType]; if (type == nil) { /* * Attempt to infer the content type from the content. */ if (partData != nil) { [self setContent: content type: @"multipart/mixed" name: nil]; } else if ([content isKindOfClass: NSStringClass] == YES) { [self setContent: content type: @"text/plain" name: nil]; } else if ([content isKindOfClass: NSDataClass] == YES) { [self setContent: content type: @"application/octet-stream" name: nil]; } else if (content == nil) { [self setContent: @"" type: @"text/plain" name: nil]; } else { [NSException raise: NSInternalInconsistencyException format: @"[%@ -%@] with bad content", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; } type = [self headerNamed: CteContentType]; } if (partData != nil) { NSString *v; BOOL shouldSet; enc = [self headerNamed: @"content-transfer-encoding"]; v = [enc value]; if (nil == v) { /* * For 7bit encoding, we can accept the setting if the content * is all 7bit data, otherwise we must change it to 8bit so * that the content can be handled properly. */ if (contentIs7bit == YES) { shouldSet = NO; } else { shouldSet = YES; } } else if ([CteBinary caseInsensitiveCompare: v] == NSOrderedSame) { /* * For binary encoding, we can just accept the setting. */ shouldSet = NO; } else if ([Cte8bit caseInsensitiveCompare: v] == NSOrderedSame) { if (contentIsBinary == YES) { shouldSet = YES; // Need to promote from 8bit to binary } else { shouldSet = NO; } } else if ([v isEqualToString: Cte7bit] == YES || [v isEqualToString: CteQuotedPrintable] == YES || [v isEqualToString: CteXuuencode] == YES) { /* * For 7bit encoding, we can accept the setting if the content * is all 7bit data, otherwise we must change it to 8bit so * that the content can be handled properly. */ if (contentIs7bit == YES) { shouldSet = NO; } else { shouldSet = YES; } } else { /* * A multipart document can't have any other encoding, so we need * to fix it. */ shouldSet = YES; } if (shouldSet == YES) { NSString *encoding; /* * Force a change to the current transfer encoding setting. */ if (contentIs7bit == YES) { encoding = Cte7bit; } else if (contentIsBinary == YES) { encoding = CteBinary; } else { encoding = Cte8bit; } if (enc == nil) { enc = [self setHeader: @"Content-Transfer-Encoding" value: encoding parameters: nil]; } else { [enc setValue: encoding]; } } v = [type parameterForKey: @"boundary"]; if (v == nil) { v = [self makeBoundary]; [type setParameter: v forKey: @"boundary"]; } boundary = [v dataUsingEncoding: NSASCIIStringEncoding]; v = [type objectForKey: @"Subtype"]; if ([v isEqualToString: @"related"] == YES) { GSMimeDocument *start; v = [type parameterForKey: @"start"]; if (v == nil) { start = [content objectAtIndex: 0]; #if 0 /* * The 'start' parameter is not compulsory ... should we * force it to be set anyway in case some dumb software * doesn't default to the first part of the message? */ v = [start contentID]; if (v == nil) { hdr = [start makeContentID]; v = [hdr value]; } [type setParameter: v forKey: @"start"]; #endif } else { start = [self contentByID: v]; } hdr = [start headerNamed: CteContentType]; v = [hdr value]; /* * If there is no 'type' parameter, we can fill it in automatically. */ if ([type parameterForKey: @"type"] == nil) { [type setParameter: v forKey: @"type"]; } if ([v isEqual: [type parameterForKey: @"type"]] == NO) { [NSException raise: NSInvalidArgumentException format: @"multipart/related 'type' (%@) does not match " @"that of the 'start' part (%@) in %@", [type parameterForKey: @"type"], v, self]; } } } else { NSString *encoding; d = [self convertToData]; enc = [self headerNamed: @"content-transfer-encoding"]; encoding = [enc value]; if (encoding == nil) { if ([[type objectForKey: @"Type"] isEqualToString: @"text"] == YES) { NSString *charset; NSStringEncoding e; charset = [type parameterForKey: @"charset"]; e = [documentClass encodingFromCharset: charset]; #if defined(NeXT_Foundation_LIBRARY) if (e != NSASCIIStringEncoding) #else if (e != NSASCIIStringEncoding && e != NSUTF7StringEncoding) #endif { enc = [self setHeader: @"Content-Transfer-Encoding" value: Cte8bit parameters: nil]; } } else { enc = [self setHeader: @"Content-Transfer-Encoding" value: CteBase64 parameters: nil]; } } if (encoding == nil || [Cte7bit caseInsensitiveCompare: encoding] == NSOrderedSame || [Cte8bit caseInsensitiveCompare: encoding] == NSOrderedSame) { unsigned char *bytes = (unsigned char*)[d bytes]; NSUInteger length = [d length]; BOOL hadCarriageReturn = NO; BOOL want7Bit = YES; NSUInteger lineLength = 0; NSUInteger i; if (nil != encoding && [Cte8bit caseInsensitiveCompare: encoding] == NSOrderedSame) { want7Bit = NO; } /* Check to see if the data is actually compatible (unaltered) * with the specified content transfer encoding. */ for (i = 0; i < length; i++) { unsigned char c = bytes[i]; if (hadCarriageReturn == YES) { if (c != '\n') { encoding = CteBinary; // CR not part of CRLF break; } hadCarriageReturn = NO; lineLength = 0; } else if (c == '\n') { encoding = CteBinary; // LF not part of CRLF break; } else if (c == '\r') { hadCarriageReturn = YES; } else if (++lineLength > 998) { encoding = CteBinary; // Line of more than 998 break; } if (c == 0) { encoding = CteBinary; break; } else if (c > 127) { encoding = Cte8bit; // Not 7bit data } } if (encoding != nil) { /* Not OK ... need to change content transfer encoding. */ if (YES == want7Bit) { encoding = CteQuotedPrintable; } enc = [self setHeader: @"Content-Transfer-Encoding" value: encoding parameters: nil]; } } } /* * Add all the headers. */ enumerator = [headers objectEnumerator]; while ((hdr = [enumerator nextObject]) != nil) { [md appendData: [hdr rawMimeDataPreservingCase: NO foldedAt: fold]]; } if (partData != nil) { count = [content count]; for (i = 0; i < count; i++) { GSMimeDocument *part = [content objectAtIndex: i]; NSMutableData *rawPart = [partData objectAtIndex: i]; if (contentIs7bit == YES) { NSString *v; enc = [part headerNamed: @"content-transport-encoding"]; v = [enc value]; if (v != nil && ([Cte8bit caseInsensitiveCompare: v] == NSOrderedSame || [CteBinary caseInsensitiveCompare: v] == NSOrderedSame)) { [NSException raise: NSInternalInconsistencyException format: @"[%@ -%@] bad part encoding for 7bit container", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; } } /* * For a multipart document, insert the boundary before each part. */ [md appendBytes: "\r\n--" length: 4]; [md appendData: boundary]; [md appendBytes: "\r\n" length: 2]; [md appendData: rawPart]; } [md appendBytes: "\r\n--" length: 4]; [md appendData: boundary]; [md appendBytes: "--\r\n" length: 4]; } else { NSString *v = [enc value]; /* * Separate headers from body. */ [md appendBytes: "\r\n" length: 2]; if (nil == v) { [md appendData: d]; } else if ([CteBase64 caseInsensitiveCompare: v] == NSOrderedSame) { const char *ptr; NSUInteger len; NSUInteger pos = 0; d = [documentClass encodeBase64: d]; ptr = [d bytes]; len = [d length]; while (len - pos > 76) { [md appendBytes: &ptr[pos] length: 76]; [md appendBytes: "\r\n" length: 2]; pos += 76; } if (pos < len) { [md appendBytes: &ptr[pos] length: len-pos]; [md appendBytes: "\r\n" length: 2]; } } else if ([CteQuotedPrintable caseInsensitiveCompare: v] == NSOrderedSame) { encodeQuotedPrintable(md, [d bytes], [d length]); } else if ([CteXuuencode caseInsensitiveCompare: v] == NSOrderedSame) { NSString *name; name = [[self headerNamed: CteContentType] parameterForKey: @"name"]; if (name == nil) { name = @"untitled"; } [d uuencodeInto: md name: name mode: 0644]; } else { [md appendData: d]; } } [arp drain]; return md; } /** * Sets a new value for the content of the document. */ - (void) setContent: (id)newContent { if ([newContent isKindOfClass: NSStringClass] == YES) { if (newContent != content) { ASSIGNCOPY(content, newContent); } } else if ([newContent isKindOfClass: NSDataClass] == YES) { if (newContent != content) { ASSIGNCOPY(content, newContent); } } else if ([newContent isKindOfClass: NSArrayClass] == YES) { if (newContent != content) { NSUInteger c = [newContent count]; while (c-- > 0) { id o = [newContent objectAtIndex: c]; if ([o isKindOfClass: documentClass] == NO) { [NSException raise: NSInvalidArgumentException format: @"Content contains non-GSMimeDocument"]; } } newContent = [newContent mutableCopy]; ASSIGN(content, newContent); RELEASE(newContent); } } else { [NSException raise: NSInvalidArgumentException format: @"[%@ -%@] passed bad content: %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd), newContent]; } } /** * Convenience method calling -setContent:type:name: to set document * content and type with a nil value for name ... useful for top-level * documents rather than parts within a document (parts should really * be named). */ - (void) setContent: (id)newContent type: (NSString*)type { [self setContent: newContent type: type name: nil]; } /** *

Convenience method to set the content of the document along with * creating a content-type header for it. *

*

The type parameter may be a simple common content type (text, * multipart, or application), in which case the default subtype for * that type is used. Alternatively it may be full detail of a * content type header value, which will be parsed into 'type', 'subtype' * and 'parameters'.
* NB. In this case, if the parsed data contains a 'name' parameter * and the name argument is non-nil, the argument value will * override the parsed value. *

*

You can get the same effect by calling -setContent: to set the document * content, then creating a [GSMimeHeader] instance, initialising it with * the content type information you want using * [GSMimeHeader-initWithName:value:parameters:], and calling the * -setHeader: method to attach it to the document. *

*

Using this method imposes a few extra checks and restrictions on the * combination of content and type/subtype you may use ... so you may want * to use the more primitive methods in order to bypass these checks if * you are using unusual type/subtype information or if you need to provide * additional parameters in the header. *

*/ - (void) setContent: (id)newContent type: (NSString*)type name: (NSString*)name { NSString *subtype = nil; GSMimeHeader *hdr = nil; NSAutoreleasePool *arp = [NSAutoreleasePool new]; if (type == nil) { type = @"text"; } if ([type isEqualToString: @"text"] == YES) { subtype = @"plain"; } else if ([type isEqualToString: @"multipart"] == YES) { subtype = @"mixed"; } else if ([type isEqualToString: @"application"] == YES) { subtype = @"octet-stream"; } else { GSMimeParser *p = AUTORELEASE([GSMimeParser new]); NSScanner *scanner = [NSScanner scannerWithString: type]; hdr = [headerClass headerWithName: @"Content-Type" value: nil parameters: nil]; if ([p scanHeaderBody: scanner into: hdr] == NO) { [NSException raise: NSInvalidArgumentException format: @"Unable to parse type information"]; } } if (hdr == nil) { NSString *val; val = [NSStringClass stringWithFormat: @"%@/%@", type, subtype]; hdr = [headerClass alloc]; hdr = [hdr initWithName: @"Content-Type" value: val parameters: nil]; [hdr setObject: type forKey: @"Type"]; [hdr setObject: subtype forKey: @"Subtype"]; IF_NO_ARC([hdr autorelease];) } else { type = [hdr objectForKey: @"Type"]; } if (name != nil) { [hdr setParameter: name forKey: @"name"]; } if ([type isEqualToString: @"multipart"] == NO && [type isEqualToString: @"application"] == NO && [content isKindOfClass: NSArrayClass] == YES) { [NSException raise: NSInvalidArgumentException format: @"[%@ -%@] content doesn't match content-type", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; } [self setContent: newContent]; [self setHeader: hdr]; [arp drain]; } /** *

Convenience method to set the content type of the document without * altering any content. * The supplied newType may be full type information including subtype * and parameters as found after the colon in a mime Content-Type header. *

*/ - (void) setContentType: (NSString *)newType { GSMimeHeader *hdr = nil; GSMimeParser *p; NSScanner *scanner; NSAutoreleasePool *arp = [NSAutoreleasePool new]; p = AUTORELEASE([GSMimeParser new]); scanner = [NSScanner scannerWithString: newType]; hdr = [headerClass headerWithName: @"Content-Type" value: nil parameters: nil]; if ([p scanHeaderBody: scanner into: hdr] == NO) { [NSException raise: NSInvalidArgumentException format: @"Unable to parse type information"]; } [self setHeader: hdr]; [arp drain]; } /** * This method may be called to set a header in the document. * Any other headers with the same name will be removed from * the document. */ - (void) setHeader: (GSMimeHeader*)info { [self deleteHeaderNamed: [info name]]; [self addHeader: info]; } /** * Convenience method to create a new header and add it to the receiver * replacing any existing header of the same name.
* Returns the newly created header.
* See [GSMimeHeader-initWithName:value:parameters:] and -setHeader: methods. */ - (GSMimeHeader*) setHeader: (NSString*)name value: (NSString*)value parameters: (NSDictionary*)parameters { GSMimeHeader *hdr; hdr = [headerClass alloc]; hdr = [hdr initWithName: name value: value parameters: parameters]; [self setHeader: hdr]; RELEASE(hdr); return hdr; } - (NSUInteger) sizeInBytesExcluding: (NSHashTable*)exclude { NSUInteger size = [super sizeInBytesExcluding: exclude]; if (size > 0) { size += [headers sizeInBytesExcluding: exclude]; size += [content sizeInBytesExcluding: exclude]; } return size; } @end @implementation GSMimeDocument (Private) /** * Returns the index of the first header matching the specified name * or NSNotFound if no match is found.
* NB. The supplied name must be lowercase.
* This method is for internal use */ - (NSUInteger) _indexOfHeaderNamed: (NSString*)name { NSUInteger count = [headers count]; if (count > 0) { NSUInteger index; oaiIMP imp1; boolIMP imp2; imp1 = (oaiIMP)[headers methodForSelector: @selector(objectAtIndex:)]; imp2 = (boolIMP)[name methodForSelector: @selector(isEqualToString:)]; for (index = 0; index < count; index++) { GSMimeHeader *info; info = (*imp1)(headers, @selector(objectAtIndex:), index); if ((*imp2)(name, @selector(isEqualToString:), [info name])) { return index; } } } return NSNotFound; } - (GSMimeHeader*) _lastHeaderNamed: (NSString*)name { NSUInteger count = [headers count]; if (count > 0) { oaiIMP imp1; boolIMP imp2; imp1 = (oaiIMP)[headers methodForSelector: @selector(objectAtIndex:)]; imp2 = (boolIMP)[name methodForSelector: @selector(isEqualToString:)]; while (count-- > 0) { GSMimeHeader *info; info = (*imp1)(headers, @selector(objectAtIndex:), count); if ((*imp2)(name, @selector(isEqualToString:), [info name])) { return info; } } } return nil; } @end @implementation GSMimeSerializer + (GSMimeSerializer*) binarySerializer { GSMimeSerializer *binarySerializer; binarySerializer = AUTORELEASE([GSMimeSerializer alloc]); binarySerializer->foldAt = 0; binarySerializer->use8bit = YES; binarySerializer->dataEncoding = CteBinary; binarySerializer->dataEncoding = CteBinary; return binarySerializer; } + (GSMimeSerializer*) smtp7bitSerializer { return AUTORELEASE([GSMimeSerializer new]); } - (instancetype) copyWithZone: (NSZone*)z { GSMimeSerializer *c = [[self class] new]; c->foldAt = foldAt; c->use8bit = use8bit; ASSIGNCOPY(c->dataEncoding, dataEncoding); ASSIGNCOPY(c->textEncoding, textEncoding); return c; } - (NSString*) dataEncoding { return dataEncoding; } - (void) dealloc { RELEASE(dataEncoding); RELEASE(textEncoding); [super dealloc]; } - (NSMutableData*) encodeDocument: (GSMimeDocument*)document { NSUInteger size = [document estimatedSize]; NSMutableData *md = [NSMutableData dataWithCapacity: size]; if (nil == [document headerNamed: @"mime-version"]) { [document setHeader: @"MIME-Version" value: @"1.0" parameters: nil]; } [self encodePart: document to: md]; return md; } - (void) encodePart: (GSMimeDocument*)document to: (NSMutableData*)md { ENTER_POOL NSData *d = nil; NSEnumerator *enumerator; NSString *subtype; NSString *charset; NSString *enc; GSMimeHeader *ct; GSMimeHeader *cte; GSMimeHeader *hdr; NSData *boundary = 0; BOOL contentIsArray = NO; id content = [document content]; /* Do we have multipart data? */ contentIsArray = [content isKindOfClass: NSArrayClass]; ct = [document headerNamed: CteContentType]; if (nil == ct) { NSString *type; /* * Attempt to infer the content type from the content. */ if (YES == contentIsArray) { ct = [document setHeader: @"Content-Type" value: @"multipart/mixed" parameters: nil]; type = @"multipart"; subtype = @"mixed"; } else if ([content isKindOfClass: NSDataClass] == YES) { ct = [document setHeader: @"Content-Type" value: @"application/octet-stream" parameters: nil]; type = @"application"; subtype = @"octet-stream"; } else { if (nil == content) { /* An empty body is treated as an empty string part. */ content = @""; [document setContent: content]; } else if ([content isKindOfClass: NSStringClass] == NO) { [NSException raise: NSInternalInconsistencyException format: @"[%@ -%@] with bad content", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; } ct = [document setHeader: @"Content-Type" value: @"text/plain" parameters: nil]; type = @"text"; subtype = @"plain"; } [ct setObject: type forKey: @"Type"]; [ct setObject: subtype forKey: @"Subtype"]; charset = nil; } else { subtype = [ct objectForKey: @"Subtype"]; charset = [ct parameterForKey: @"charset"]; if (nil == content) { [document setContent: [NSData data]]; content = [document content]; } } /* Get the content transfer encoding. */ cte = [document headerNamed: @"content-transfer-encoding"]; enc = [cte value]; if (nil == enc) { if (YES == use8bit) { if (0 == foldAt) { enc = CteBinary; } else { enc = Cte8bit; } cte = [document setHeader: @"Content-Transfer-Encoding" value: enc parameters: nil]; } else { enc = Cte7bit; } } else if ([Cte7bit caseInsensitiveCompare: enc] == NSOrderedSame) { enc = Cte7bit; } else if ([Cte8bit caseInsensitiveCompare: enc] == NSOrderedSame) { enc = Cte8bit; } else if ([CteBinary caseInsensitiveCompare: enc] == NSOrderedSame) { enc = CteBinary; } else if ([CteBase64 caseInsensitiveCompare: enc] == NSOrderedSame) { enc = CteBase64; } else if ([CteQuotedPrintable caseInsensitiveCompare: enc] == NSOrderedSame) { enc = CteQuotedPrintable; } else if ([CteXuuencode caseInsensitiveCompare: enc] == NSOrderedSame) { enc = CteXuuencode; } if (NO == use8bit && (Cte8bit == enc || CteBinary == enc)) { enc = Cte7bit; if (nil != cte) { cte = nil; [document deleteHeaderNamed: @"Content-Transfer-Encoding"]; } } /* Check the sanity of the parts of a multipart document. */ if (YES == contentIsArray) { NSUInteger count = [content count]; NSUInteger index; if (enc != Cte7bit && enc != Cte8bit && enc != CteBinary) { [NSException raise: NSInternalInconsistencyException format: @"[%@ -%@] bad content transfer encoding '%@' for %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd), enc, document]; } for (index = 0; index < count; index++) { GSMimeDocument *d = [content objectAtIndex: index]; /* Parts of a multipart document must be MIME documents * in their own right. */ if (NO == [d isKindOfClass: documentClass]) { [NSException raise: NSInternalInconsistencyException format: @"[%@ -%@] with bad body part %lu in %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd), (unsigned long)index, document]; } /* The MIME-Version header is not permitted in parts of * a multipart document. */ [d deleteHeaderNamed: @"MIME-Version"]; } } else if (nil == charset) { if (nil != subtype && [@"xml" caseInsensitiveCompare: subtype] == NSOrderedSame) { /* For an XML document (subtype is xml) we can try to get the * characterset by examining the document header. */ if (nil == (charset = [documentClass charsetForXml: content])) { charset = @"utf-8"; } } if (YES == [content isKindOfClass: [NSString class]]) { if (nil == charset) { /* Any string can be converted to utf-8 */ charset = @"utf-8"; } } } if (YES == [content isKindOfClass: [NSString class]]) { NSStringEncoding e; NSData *d; /* Get content as a data object, adjusting charset if necessary. */ e = [documentClass encodingFromCharset: charset]; if (0 == e) { e = NSUTF8StringEncoding; charset = @"utf-8"; } d = [content dataUsingEncoding: e]; if (nil == d) { charset = selectCharacterSet(content, &d); [ct setParameter: charset forKey: @"charset"]; } content = d; } if (YES == contentIsArray) { NSString *v; v = [ct parameterForKey: @"boundary"]; if (nil == v) { v = [document makeBoundary]; [ct setParameter: v forKey: @"boundary"]; } boundary = [v dataUsingEncoding: NSASCIIStringEncoding]; if ([subtype isEqualToString: @"related"] == YES) { GSMimeDocument *start; v = [ct parameterForKey: @"start"]; if (nil == v) { start = [content objectAtIndex: 0]; } else { start = [document contentByID: v]; } hdr = [start headerNamed: CteContentType]; v = [hdr value]; /* * If there is no 'type' parameter, we can fill it in automatically. */ if ([ct parameterForKey: @"type"] == nil) { [ct setParameter: v forKey: @"type"]; } if ([v isEqual: [ct parameterForKey: @"type"]] == NO) { [NSException raise: NSInvalidArgumentException format: @"multipart/related 'type' (%@) does not match " @"that of the 'start' part (%@) in %@", [ct parameterForKey: @"type"], v, document]; } } } else if (Cte7bit == enc || Cte8bit == enc) { unsigned char *bytes = (unsigned char*)[content bytes]; NSUInteger length = [content length]; BOOL hadCarriageReturn = NO; NSUInteger lineLength = 0; NSUInteger i; /* Check to see if the data is actually compatible (unaltered) * with the specified content transfer encoding. */ for (i = 0; i < length; i++) { unsigned char c = bytes[i]; if (hadCarriageReturn == YES) { if (c != '\n') { /* CR not part of CRLF */ enc = (nil == charset) ? dataEncoding : textEncoding; break; } hadCarriageReturn = NO; lineLength = 0; } else if ('\n' == c) { /* LF not part of CRLF */ enc = (nil == charset) ? dataEncoding : textEncoding; break; } else if ('\r' == c) { hadCarriageReturn = YES; } else if (++lineLength > 998) { /* Line of more than 998 chars cannot be 7bit or 8bit */ enc = (nil == charset) ? dataEncoding : textEncoding; break; } else if (0 == c) { /* Can't have nul byte in 7bit or 8bit */ enc = (nil == charset) ? dataEncoding : textEncoding; break; } else if (c > 127) { if (YES == use8bit) { enc = Cte8bit; // Not 7bit data } else { /* any 8bit value must be encoded */ enc = (nil == charset) ? dataEncoding : textEncoding; break; } } } if (NO == [enc isEqual: [cte value]]) { /* We need to change content transfer encoding. */ if (Cte7bit == enc) { [document deleteHeaderNamed: @"Content-Transfer-Encoding"]; } else { [document setHeader: @"Content-Transfer-Encoding" value: enc parameters: nil]; } } } /* Add all the headers. */ enumerator = [[document allHeaders] objectEnumerator]; while ((hdr = [enumerator nextObject]) != nil) { [hdr rawMimeDataPreservingCase: NO foldedAt: foldAt to: md]; } if (YES == contentIsArray) { NSUInteger count = [content count]; NSUInteger index; for (index = 0; index < count; index++) { GSMimeDocument *part = [content objectAtIndex: index]; /* * For a multipart document, insert the boundary before each part. */ [md appendBytes: "\r\n--" length: 4]; [md appendData: boundary]; [md appendBytes: "\r\n" length: 2]; [self encodePart: part to: md]; } [md appendBytes: "\r\n--" length: 4]; [md appendData: boundary]; [md appendBytes: "--\r\n" length: 4]; } else { /* * Separate headers from body. */ [md appendBytes: "\r\n" length: 2]; if (CteBase64 == enc) { const char *ptr; NSUInteger len; NSUInteger pos = 0; d = [documentClass encodeBase64: d]; ptr = [d bytes]; len = [d length]; while (len - pos > 76) { [md appendBytes: &ptr[pos] length: 76]; [md appendBytes: "\r\n" length: 2]; pos += 76; } if (pos < len) { [md appendBytes: &ptr[pos] length: len-pos]; [md appendBytes: "\r\n" length: 2]; } } else if (CteQuotedPrintable == enc) { encodeQuotedPrintable(md, [d bytes], [d length]); } else if (CteXuuencode == enc) { NSString *name = [ct parameterForKey: @"name"]; if (nil == name) { name = @"untitled"; } [d uuencodeInto: md name: name mode: 0644]; } else { [md appendData: d]; } } LEAVE_POOL } - (NSUInteger) foldAt { return foldAt; } - (instancetype) init { if (nil != (self = [super init])) { foldAt = 78; use8bit = NO; #if 0 // Which is best? /* The default content transfer encoding to make 8bit data into * 7bit-safe data is 'base64' */ dataEncoding = CteBase64; #else /* The default content transfer encoding to make 8bit text into * 7bit-safe data is 'quoted-printable' */ dataEncoding = CteQuotedPrintable; #endif } return self; } - (void) setDataEncoding: (NSString*)encoding { if ([encoding length] == 0) { encoding = CteBase64; } if ([CteQuotedPrintable caseInsensitiveCompare: encoding] == NSOrderedSame) { encoding = CteQuotedPrintable; } else if ([CteBase64 caseInsensitiveCompare: encoding] == NSOrderedSame) { encoding = CteBase64; } else if ([CteXuuencode caseInsensitiveCompare: encoding] == NSOrderedSame) { encoding = CteXuuencode; } else { [NSException raise: NSInvalidArgumentException format: @"[%@ -%@: %@] bad encoding", NSStringFromClass([self class]), NSStringFromSelector(_cmd), encoding]; } ASSIGN(dataEncoding, encoding); } - (void) setFoldAt: (NSUInteger)position { if (position < 20 || position > 998) { position = 0; } foldAt = position; } - (void) setTextEncoding: (NSString*)encoding { if ([encoding length] == 0) { encoding = CteQuotedPrintable; } if ([CteQuotedPrintable caseInsensitiveCompare: encoding] == NSOrderedSame) { encoding = CteQuotedPrintable; } else if ([CteBase64 caseInsensitiveCompare: encoding] == NSOrderedSame) { encoding = CteBase64; } else if ([CteXuuencode caseInsensitiveCompare: encoding] == NSOrderedSame) { encoding = CteXuuencode; } else { [NSException raise: NSInvalidArgumentException format: @"[%@ -%@: %@] bad encoding", NSStringFromClass([self class]), NSStringFromSelector(_cmd), encoding]; } ASSIGN(textEncoding, encoding); } - (void) setUse8bit: (BOOL)aFlag { use8bit = (NO == aFlag) ? NO : YES; } - (NSString*) textEncoding { return textEncoding; } - (BOOL) use8bit { return use8bit; } @end GS_DECLARE NSString* const GSMimeErrorDomain = @"GSMimeErrorDomain"; typedef enum { TP_IDLE, TP_OPEN, TP_INTRO, TP_EHLO, TP_HELO, TP_AUTH, TP_MESG, TP_FROM, TP_TO, TP_DATA, TP_BODY } CState; typedef enum { SMTPE_DSN, // delivery status notification extension } SMTPE; NSString * eventText(NSStreamEvent e) { if (e == NSStreamEventNone) return @"NSStreamEventNone"; if (e == NSStreamEventOpenCompleted) return @"NSStreamEventOpenCompleted"; if (e == NSStreamEventHasBytesAvailable) return @"NSStreamEventHasBytesAvailable"; if (e == NSStreamEventHasSpaceAvailable) return @"NSStreamEventHasSpaceAvailable"; if (e == NSStreamEventErrorOccurred) return @"NSStreamEventErrorOccurred"; if (e == NSStreamEventEndEncountered) return @"NSStreamEventEndEncountered"; return @"unknown event"; } NSString * statusText(NSStreamStatus s) { if (s == NSStreamStatusNotOpen) return @"NSStreamStatusNotOpen"; if (s == NSStreamStatusOpening) return @"NSStreamStatusOpening"; if (s == NSStreamStatusOpen) return @"NSStreamStatusOpen"; if (s == NSStreamStatusReading) return @"NSStreamStatusReading"; if (s == NSStreamStatusWriting) return @"NSStreamStatusWriting"; if (s == NSStreamStatusAtEnd) return @"NSStreamStatusAtEnd"; if (s == NSStreamStatusClosed) return @"NSStreamStatusClosed"; if (s == NSStreamStatusError) return @"NSStreamStatusError"; return @"unknown status"; } /* * Convert 8bit/binary data parts to base64 encoding for old mail * software which can't handle 8bit data. */ static void makeBase64(GSMimeDocument *doc) { id o = [doc content]; if ([o isKindOfClass: [NSArray class]] == YES) { NSEnumerator *e = [o objectEnumerator]; while ((doc = [e nextObject]) != nil) { makeBase64(doc); } } else { GSMimeHeader *h = [doc headerNamed: @"content-transfer-encoding"]; NSString *v = [h value]; if (nil != v && ([CteBinary caseInsensitiveCompare: v] == NSOrderedSame || [Cte8bit caseInsensitiveCompare: v] == NSOrderedSame)) { [h setValue: CteBase64]; } } } @interface GSMimeSMTPClient (Private) - (NSError*) _commsEnd; - (NSError*) _commsError; - (void) _doMessage; - (NSString*) _identity; - (void) _performIO; - (void) _recvData: (NSData*)m; - (NSError*) _response: (NSString*)r; - (void) _sendData: (NSData*)m; - (void) _shutdown: (NSError*)e; - (void) _startup; - (void) _timer: (NSTimeInterval)s; @end #define GSInternal GSMimeSMTPClientInternal #include "GSInternal.h" GS_PRIVATE_INTERNAL(GSMimeSMTPClient) @implementation NSObject (GSMimeSMTPClient) - (void) smtpClient: (GSMimeSMTPClient*)client mimeFailed: (GSMimeDocument*)doc { return; } - (void) smtpClient: (GSMimeSMTPClient*)client mimeSent: (GSMimeDocument*)doc { return; } - (void) smtpClient: (GSMimeSMTPClient*)client mimeUnsent: (GSMimeDocument*)doc { return; } @end @implementation GSMimeSMTPClient /* Shuts the connection down, fails any message in progress, and discards all * queued messages as 'unsent' */ - (void) abort { NSUInteger c; NSError *e; NSDictionary *d; d = [NSDictionary dictionaryWithObjectsAndKeys: [NSString stringWithFormat: @"Abort while %@", [self stateDesc]], NSLocalizedDescriptionKey, nil]; e = [NSError errorWithDomain: GSMimeErrorDomain code: GSMimeSMTPAbort userInfo: d]; [self _shutdown: e]; [internal->timer invalidate]; internal->timer = nil; /* For any message not yet sent, we inform the delegate of the failure */ c = [internal->queue count]; while (c-- > 0) { GSMimeDocument *d = [internal->queue objectAtIndex: c]; if (nil == internal->delegate) { NSDebugMLLog(@"GSMime", @"-smtpClient:mimeUnsent: %@ %@", self, d); } else { [internal->delegate smtpClient: self mimeUnsent: d]; } } [internal->queue removeAllObjects]; } - (void) dealloc { [self abort]; if (internal != nil) { DESTROY(internal->reply); DESTROY(internal->wdata); DESTROY(internal->rdata); DESTROY(internal->pending); DESTROY(internal->queue); DESTROY(internal->username); DESTROY(internal->port); DESTROY(internal->hostname); DESTROY(internal->identity); DESTROY(internal->originator); DESTROY(internal->lastError); GS_DESTROY_INTERNAL(GSMimeSMTPClient); } [super dealloc]; } - (id) delegate { return internal->delegate; } - (BOOL) flush: (NSDate*)limit { if (limit == nil) { limit = [NSDate distantFuture]; } while ([internal->queue count] > 0) { [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate: limit]; } return [internal->queue count] == 0 ? YES : NO; } - (id) init { if ((self = [super init]) != 0) { GS_CREATE_INTERNAL(GSMimeSMTPClient); internal->queue = [NSMutableArray new]; } return self; } - (NSError*) lastError { return internal->lastError; } - (NSUInteger) queueSize { return [internal->queue count]; } - (void) send: (GSMimeDocument*)message { [self send: message envelopeID: nil]; } - (void) send: (GSMimeDocument*)message envelopeID: (NSString*)envid { if (nil == [message headerNamed: @"mime-version"]) { [message setHeader: @"MIME-Version" value: @"1.0" parameters: nil]; } if (nil != envid) { [[message headerNamed: @"mime-version"] setObject: envid forKey: @"ENVID"]; } [internal->queue addObject: message]; if (internal->cState == TP_IDLE) { if (internal->timer != nil) { [internal->timer invalidate]; internal->timer = nil; } [self _startup]; } else if (internal->cState == TP_MESG) { [self _doMessage]; } } - (void) setDelegate: (id)d { internal->delegate = d; } - (void) setHostname: (NSString*)s { ASSIGNCOPY(internal->hostname, s); } - (void) setIdentity: (NSString*)s { ASSIGNCOPY(internal->identity, s); } - (NSUInteger) setMaximum: (NSUInteger)m { NSUInteger old = internal->maximum; internal->maximum = m; return old; } - (void) setOriginator: (NSString*)s { ASSIGNCOPY(internal->originator, s); } - (void) setPort: (NSString*)s { ASSIGNCOPY(internal->port, s); } - (void) setUsername: (NSString*)s { ASSIGNCOPY(internal->username, s); } - (int) state { return internal->cState; } - (NSString*) stateDesc { switch (internal->cState) { case TP_OPEN: return @"waiting for connection to SMTP server"; case TP_INTRO: return @"waiting for initial prompt from SMTP server"; case TP_EHLO: return @"waiting for SMTP server EHLO completion"; case TP_HELO: return @"waiting for SMTP server HELO completion"; case TP_AUTH: return @"waiting for SMTP server AUTH response"; case TP_FROM: return @"waiting for ack of FROM command"; case TP_TO: return @"waiting for ack of TO command"; case TP_DATA: return @"waiting for ack of DATA command"; case TP_BODY: return @"waiting for ack of message body"; case TP_MESG: return @"waiting for message to send"; case TP_IDLE: return @"idle ... not connected to SMTP server"; } return @"idle ... not connected to SMTP server"; } /** Handler for stream events ... */ - (void) stream: (NSStream*)aStream handleEvent: (NSStreamEvent)anEvent { NSStreamStatus sStatus = [aStream streamStatus]; if (aStream == internal->istream) { NSDebugMLLog(@"GSMime", @"%@ istream event %@ in %@", self, eventText(anEvent), statusText(sStatus)); if (anEvent == NSStreamEventHasBytesAvailable) { internal->readable = YES; } } else { NSDebugMLLog(@"GSMime", @"%@ ostream event %@ in %@", self, eventText(anEvent), statusText(sStatus)); if (anEvent == NSStreamEventHasSpaceAvailable) { internal->writable = YES; } } if (anEvent == NSStreamEventEndEncountered) { [self _shutdown: [self _commsEnd]]; return; } if (anEvent == NSStreamEventErrorOccurred) { [self _shutdown: [self _commsError]]; return; } if (anEvent == NSStreamEventOpenCompleted) { internal->cState = TP_INTRO; } [self _performIO]; } @end @implementation GSMimeSMTPClient (Private) - (NSError*) _commsEnd { NSError *e; NSDictionary *d; d = [NSDictionary dictionaryWithObjectsAndKeys: [NSString stringWithFormat: @"End of input while %@", [self stateDesc]], NSLocalizedDescriptionKey, nil]; e = [NSError errorWithDomain: GSMimeErrorDomain code: GSMimeSMTPCommsEnd userInfo: d]; return e; } - (NSError*) _commsError { NSError *e; NSDictionary *d; d = [NSDictionary dictionaryWithObjectsAndKeys: [NSString stringWithFormat: @"Error on I/O while %@", [self stateDesc]], NSLocalizedDescriptionKey, nil]; e = [NSError errorWithDomain: GSMimeErrorDomain code: GSMimeSMTPCommsError userInfo: d]; return e; } /** Initiates sending of the next message (or the next stage of the * current message). */ - (void) _doMessage { if ([internal->queue count] > 0) { NSString *tmp; internal->current = [internal->queue objectAtIndex: 0]; internal->version = [internal->current headerNamed: @"mime-version"]; if (internal->cState == TP_IDLE) { [self _startup]; } else if (internal->cState == TP_MESG) { NSString *from = internal->originator; DESTROY(internal->lastError); if (from == nil) { from = [[NSUserDefaults standardUserDefaults] stringForKey: @"GSMimeSMTPClientOriginator"]; } if ([from length] == 0) { from = [[internal->current headerNamed: @"from"] value]; } if ([from length] == 0) { /* If we have no sender address ... use postmaster. */ from = [NSString stringWithFormat: @"postmaster@%@", [self _identity]]; } tmp = [internal->version objectForKey: @"ENVID"]; if (nil == tmp) { tmp = [NSString stringWithFormat: @"MAIL FROM: <%@>\r\n", from]; } else { /* Tell the mail server we want headers, not the full body * when an email is bounced or acknowledged. * Set the envelope ID to be the ID of the current message. */ tmp = [NSString stringWithFormat: @"MAIL FROM: <%@> RET=HDRS ENVID=%@\r\n", from, tmp]; } NSDebugMLLog(@"GSMime", @"Initiating new mail message - %@", tmp); internal->cState = TP_FROM; [self _timer: 20.0]; [self _sendData: [tmp dataUsingEncoding: NSUTF8StringEncoding]]; } else if (internal->cState == TP_FROM) { tmp = [[internal->current headerNamed: @"to"] value]; if (nil == [internal->version objectForKey: @"ENVID"]) { tmp = [NSString stringWithFormat: @"RCPT TO: <%@>\r\n", tmp]; } else { /* We have an envelope ID, so we need success/failure reports. */ tmp = [NSString stringWithFormat: @"RCPT TO: <%@> NOTIFY=SUCCESS,FAILURE\r\n", tmp]; } NSDebugMLLog(@"GSMime", @"Destination - %@", tmp); internal->cState = TP_TO; [self _timer: 20.0]; [self _sendData: [tmp dataUsingEncoding: NSUTF8StringEncoding]]; } else if (internal->cState == TP_TO) { internal->cState = TP_DATA; tmp = @"DATA\r\n"; [self _timer: 20.0]; [self _sendData: [tmp dataUsingEncoding: NSUTF8StringEncoding]]; } else if (internal->cState == TP_DATA) { NSMutableData *md; NSData *data; const char *ibuf; char *obuf; BOOL sol = YES; unsigned ilen; unsigned olen; unsigned osiz; unsigned ipos = 0; unsigned opos = 0; internal->cState = TP_BODY; makeBase64(internal->current); data = [internal->current rawMimeData]; /* * Any line in the message which begins with a dot must have * that dot escaped by another dot. */ ilen = [data length]; olen = ilen + 5; // Allow for CR-LF-.-CR-LF termination osiz = olen + 10; // Allow some expansion to escape dots md = [[NSMutableData alloc] initWithLength: osiz]; ibuf = [data bytes]; obuf = [md mutableBytes]; while (ipos < ilen) { char c = ibuf[ipos++]; if (c == '\n') { sol = YES; } else { if (c == '.' && sol == YES) { obuf[opos++] = '.'; // Extra dot acts as an escape if (olen++ == osiz) // Lengthen to allow for dot { osiz += 16; [md setLength: osiz]; obuf = [md mutableBytes]; } } sol = NO; } obuf[opos++] = c; } obuf[opos++] = '\r'; obuf[opos++] = '\n'; /* * Now terminate the message with a line consisting of a dot. */ obuf[opos++] = '.'; obuf[opos++] = '\r'; obuf[opos++] = '\n'; [md setLength: opos]; [self _timer: 60.0]; [self _sendData: md]; RELEASE(md); } else { NSLog(@"_doMessage called in unexpected state."); [self _shutdown: nil]; } } else { [self _shutdown: nil]; } } - (NSString*) _identity { NSString *tmp = internal->identity; if (tmp == nil) { tmp = [[NSUserDefaults standardUserDefaults] stringForKey: @"GSMimeSMTPClientIdentity"]; } if ([tmp length] == 0) { tmp = [[NSHost currentHost] name]; } return tmp; } /** Does low level writing and reading of data. */ - (void) _performIO { NS_DURING { [self retain]; // Make sure we don't get released until done. /* First perform all reads ... so we process incoming data, */ while (internal->readable == YES && internal->cState != TP_OPEN) { uint8_t buf[BUFSIZ]; int length; /* Try to fill the buffer, then process any data we have. */ length = [internal->istream read: buf maxLength: sizeof(buf)]; if (length > 0) { uint8_t *ptr; int i; if (internal->rdata == nil) { internal->rdata = [[NSMutableData alloc] initWithBytes: buf length: length]; } else { [internal->rdata appendBytes: buf length: length]; length = [internal->rdata length]; } ptr = [internal->rdata mutableBytes]; for (i = 0; i < length; i++) { if (ptr[i] == '\n') { NSData *d; i++; if (i == length) { d = [internal->rdata autorelease]; internal->rdata = nil; } else { d = [NSData dataWithBytes: ptr length: i]; memcpy(ptr, ptr + i, length - i); length -= i; [internal->rdata setLength: length]; ptr = [internal->rdata mutableBytes]; i = -1; } [self _recvData: d]; } } } else { internal->readable = NO; // Can't read more right now. if (length == 0) { NSLog(@"EOF on input stream ... terminating"); [self _shutdown: [self _commsEnd]]; } else if ([internal->istream streamStatus] == NSStreamStatusError) { NSLog(@"Error on input stream ... terminating"); [self _shutdown: [self _commsError]]; } } } /* Perform write operations after read operations, so that we are able * to write any packets resulting from the incoming data as a single * block of outgoing data if possible. */ while (internal->writable == YES && [internal->pending count] > 0) { uint8_t *wbytes = [internal->wdata mutableBytes]; unsigned wlength = [internal->wdata length]; int result; result = [internal->ostream write: wbytes + internal->woffset maxLength: wlength - internal->woffset]; if (result > 0) { NSData *d = [internal->pending objectAtIndex: 0]; unsigned dlength = [d length]; internal->woffset += result; if (internal->woffset >= dlength) { unsigned total = 0; while (internal->woffset >= total + dlength) { NSDebugMLLog(@"GSMime", @"%@ Write: %@", self, d); [internal->pending removeObjectAtIndex: 0]; total += dlength; if ([internal->pending count] > 0) { d = [internal->pending objectAtIndex: 0]; dlength = [d length]; } } if (total < wlength) { memcpy(wbytes, wbytes + total, wlength - total); } [internal->wdata setLength: wlength - total]; internal->woffset -= total; } } else { internal->writable = NO; // Can't write more right now. if (result == 0) { NSLog(@"EOF on output stream ... terminating"); [self _shutdown: [self _commsEnd]]; } else if ([internal->ostream streamStatus] == NSStreamStatusError) { NSLog(@"Error on output stream ... terminating"); [self _shutdown: [self _commsError]]; } } } [self release]; } NS_HANDLER { NSLog(@"Exception handling stream event: %@", localException); RELEASE(self); } NS_ENDHANDLER } /** Receives a chunk of data from the input stream and performs state * transitions based on the current state and the information received * from the SMTP server. */ - (void) _recvData: (NSData*)m { unsigned int c = 0; NSMutableString *s = nil; if ([internal->queue count] > 0) { internal->current = [internal->queue objectAtIndex: 0]; } NSDebugMLLog(@"GSMime", @"%@ _recvData: %@", self, m); if (m != nil) { unichar sep; /* * Get this reply line and check it is of the correct format. */ s = [[NSMutableString alloc] initWithData: m encoding: NSASCIIStringEncoding]; [s trimSpaces]; if ([s length] <= 4) { NSLog(@"Server made short response ... %@", s); RELEASE(s); [self _shutdown: [self _response: @"short data"]]; return; } sep = [s characterAtIndex: 3]; if (sep != ' ' && sep != '-') { NSLog(@"Server made illegal response ... %@", s); RELEASE(s); [self _shutdown: [self _response: @"bad format"]]; return; } /* * Accumulate multiline replies in the 'reply' ivar. */ if ([internal->reply length] == 0) { ASSIGN(internal->reply, s); } else { [s replaceCharactersInRange: NSMakeRange(0, 4) withString: @" "]; [internal->reply appendString: s]; } RELEASE(s); if (sep == '-') { return; // Continuation line ... wait for more. } /* * Got end of reply ... move from ivar to local variable ready for * accumulating the next reply. */ c = [internal->reply intValue]; s = AUTORELEASE(internal->reply); internal->reply = nil; } switch (internal->cState) { case TP_INTRO: if (c == 220) { NSString *tmp; tmp = [NSString stringWithFormat: @"HELO %@\r\n", [self _identity]]; NSDebugMLLog(@"GSMime", @"Intro OK - sending helo"); internal->cState = TP_HELO; [self _timer: 30.0]; [self _sendData: [tmp dataUsingEncoding: NSUTF8StringEncoding]]; } else { NSLog(@"Server went away ... %@", s); [self _shutdown: [self _response: s]]; } break; case TP_EHLO: if (c == 220) { NSDebugMLLog(@"GSMime", @"System acknowledged EHLO"); if ([internal->username length] == 0) { internal->cState = TP_MESG; [self _doMessage]; } else { NSString *tmp; tmp = [NSString stringWithFormat: @"AUTH PLAIN %@\r\n", [GSMimeDocument encodeBase64String: internal->username]]; NSDebugMLLog(@"GSMime", @"Ehlo OK - sending auth"); internal->cState = TP_AUTH; [self _timer: 30.0]; [self _sendData: [tmp dataUsingEncoding: NSUTF8StringEncoding]]; } } else { NSString *tmp; tmp = [NSString stringWithFormat: @"HELO %@\r\n", [self _identity]]; NSDebugMLLog(@"GSMime", @"Ehlo failed - sending helo"); internal->cState = TP_HELO; [self _timer: 30.0]; [self _sendData: [tmp dataUsingEncoding: NSUTF8StringEncoding]]; } break; case TP_HELO: if (c == 250) { NSDebugMLLog(@"GSMime", @"System acknowledged HELO"); if ([internal->username length] == 0) { internal->cState = TP_MESG; [self _doMessage]; } else { NSString *tmp; tmp = [NSString stringWithFormat: @"AUTH PLAIN %@\r\n", [GSMimeDocument encodeBase64String: internal->username]]; NSDebugMLLog(@"GSMime", @"Helo OK - sending auth"); internal->cState = TP_AUTH; [self _timer: 30.0]; [self _sendData: [tmp dataUsingEncoding: NSUTF8StringEncoding]]; } } else { NSLog(@"Server nacked helo ... %@", s); [self _shutdown: [self _response: s]]; } break; case TP_AUTH: if (c == 250) { NSDebugMLLog(@"GSMime", @"System acknowledged AUTH"); internal->cState = TP_MESG; [self _doMessage]; } else { NSLog(@"Server nacked auth ... %@", s); [self _shutdown: [self _response: s]]; } break; case TP_FROM: if (c != 250) { NSLog(@"Server nacked FROM... %@", s); [self _shutdown: [self _response: s]]; } else { NSDebugMLLog(@"GSMime", @"System acknowledged FROM"); [self _doMessage]; } break; case TP_TO: if (c != 250) { NSLog(@"Server nacked TO... %@", s); [self _shutdown: [self _response: s]]; } else { NSDebugMLLog(@"GSMime", @"System acknowledged TO"); [self _doMessage]; } break; case TP_DATA: if (c != 354) { NSLog(@"Server nacked DATA... %@", s); [self _shutdown: [self _response: s]]; } else { [self _doMessage]; } break; case TP_BODY: if (c != 250) { NSLog(@"Server nacked body ... %@", s); [self _shutdown: [self _response: s]]; } else { internal->cState = TP_MESG; if (internal->current != nil) { GSMimeDocument *d = [internal->current retain]; internal->current = nil; [internal->queue removeObjectAtIndex: 0]; if (nil == internal->delegate) { NSDebugMLLog(@"GSMime", @"-smtpClient:mimeSent: %@ %@", self, d); } else { [internal->delegate smtpClient: self mimeSent: d]; } [d release]; } [self _doMessage]; } break; case TP_MESG: NSLog(@"Unknown response from SMTP system. - %@", s); [self _shutdown: [self _response: s]]; break; default: NSLog(@"system in unexpected state."); [self _shutdown: [self _response: s]]; break; } } - (NSError*) _response: (NSString*)r { NSError *e; NSDictionary *d; NSString *s; s = [NSString stringWithFormat: @"Unexpected response form server while %@: %@", [self stateDesc], r]; d = [NSDictionary dictionaryWithObjectsAndKeys: s, NSLocalizedDescriptionKey, nil]; e = [NSError errorWithDomain: GSMimeErrorDomain code: GSMimeSMTPServerResponse userInfo: d]; return e; } /** Add a chunk of data to the output stream. */ - (void) _sendData: (NSData*)m { NSDebugMLLog(@"GSMime", @"%@ _sendData: %@", self, m); if (internal->pending == nil) { internal->pending = [NSMutableArray new]; } [internal->pending addObject: m]; if (internal->wdata == nil) { internal->wdata = [m mutableCopy]; } else { [internal->wdata appendData: m]; } if ([internal->pending count] > 0 && internal->writable == YES) { [self _performIO]; } } /** Shuts down the connection to the SMTP server and fails any message * currently in progress. If there are queued messages, this sets a * timer to reconnect. */ - (void) _shutdown: (NSError*)e { [internal->istream removeFromRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode]; [internal->ostream removeFromRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode]; [internal->istream setDelegate: nil]; [internal->ostream setDelegate: nil]; [internal->istream close]; [internal->ostream close]; DESTROY(internal->istream); DESTROY(internal->ostream); [internal->wdata setLength: 0]; internal->woffset = 0; internal->readable = NO; internal->writable = NO; internal->cState = TP_IDLE; [internal->pending removeAllObjects]; ASSIGN(internal->lastError, e); if (nil == internal->current) { while ([self queueSize] > internal->maximum) { GSMimeDocument *d = RETAIN([internal->queue objectAtIndex: 0]); [internal->queue removeObjectAtIndex: 0]; if (nil == internal->delegate) { NSDebugMLLog(@"GSMime", @"-smtpClient:mimeUnsent: %@ %@", self, d); } else { [internal->delegate smtpClient: self mimeUnsent: d]; } RELEASE(d); } } else { GSMimeDocument *d = RETAIN(internal->current); [internal->queue removeObjectAtIndex: 0]; internal->current = nil; if (nil == internal->delegate) { NSDebugMLLog(@"GSMime", @"-smtpClient:mimeFailed: %@ %@", self, d); } else { [internal->delegate smtpClient: self mimeFailed: d]; } RELEASE(d); } if ([internal->queue count] > 0) { [self _timer: 10.0]; // Try connecting again in 10 seconds } } /** If the receiver is in an idle state, this method initiates a connection * to the SMTP server. */ - (void) _startup { if (internal->cState == TP_IDLE) { NSUserDefaults *defs = [NSUserDefaults standardUserDefaults]; NSHost *h; NSString *n = internal->hostname; NSString *p = internal->port; int pnum; DESTROY(internal->lastError); /* Need to start up ... */ if (n == nil) { n = [defs stringForKey: @"GSMimeSMTPClientHost"]; if ([n length] == 0) { n = @"localhost"; } } h = [NSHost hostWithName: n]; if (h == nil) { internal->istream = nil; internal->ostream = nil; NSLog(@"Unable to find host %@", n); [self _shutdown: nil]; return; } if (p == nil) { p = [defs stringForKey: @"GSMimeSMTPClientPort"]; if ([p length] == 0) { p = @"25"; } } if ((pnum = [p intValue]) <= 0 || pnum > 65535) { NSLog(@"Bad port '%@' ... using 25", p); pnum = 25; } [NSStream getStreamsToHost: h port: pnum inputStream: &internal->istream outputStream: &internal->ostream]; [internal->istream retain]; [internal->ostream retain]; if (internal->istream == nil || internal->ostream == nil) { NSLog(@"Unable to connect to %@:%@", n, p); [self _shutdown: nil]; return; } [internal->istream setDelegate: self]; [internal->ostream setDelegate: self]; [internal->istream scheduleInRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode]; [internal->ostream scheduleInRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode]; internal->cState = TP_OPEN; [self _timer: 30.0]; // Allow 30 seconds for login [internal->istream open]; [internal->ostream open]; } } /** Handles a timeout. * Behavior depends on the state of the connection. */ - (void) _timeout: (NSTimer*)t { if (internal->timer == t) { internal->timer = nil; } if (internal->cState == TP_IDLE) { /* Not connected. */ if ([internal->queue count] > 0) { [self _startup]; // Try connecting } } else if (internal->cState == TP_MESG) { /* Already connected to server. */ if ([internal->queue count] == 0) { [self _shutdown: nil]; // Nothing to send ... disconnect } else { [self _doMessage]; // Send the next message } } else { NSError *e; NSDictionary *d; d = [NSDictionary dictionaryWithObjectsAndKeys: [NSString stringWithFormat: @"Timeout while %@", [self stateDesc]], NSLocalizedDescriptionKey, nil]; e = [NSError errorWithDomain: GSMimeErrorDomain code: GSMimeSMTPTimeout userInfo: d]; NSDebugMLLog(@"GSMime", @"%@ timeout at %@", self, [self stateDesc]); [self _shutdown: e]; } } /* A convenience method to set the receivers timer to go off after the * specified interval. Cancels previous timer (if any). */ - (void) _timer: (NSTimeInterval)s { if (internal->timer != nil) { [internal->timer invalidate]; } internal->timer = [NSTimer scheduledTimerWithTimeInterval: s target: self selector: @selector(_timeout:) userInfo: nil repeats: NO]; } @end gnustep-base-1.29.0/Source/Additions/GSObjCRuntime.m000066400000000000000000001435041435650067400221700ustar00rootroot00000000000000/** Implementation of ObjC runtime additions for GNUStep Copyright (C) 1995-2010 Free Software Foundation, Inc. Written by: Andrew Kachites McCallum Date: Aug 1995 Written by: Richard Frith-Macdonald Date: Nov 2002 Written by: Manuel Guesdon Date: Nov 2002 This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. GSObjCRuntime function and macro reference $Date$ $Revision$ */ #import "common.h" #ifndef NeXT_Foundation_LIBRARY #import "Foundation/NSArray.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSData.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSException.h" #import "Foundation/NSInvocation.h" #import "Foundation/NSLock.h" #import "Foundation/NSMethodSignature.h" #import "Foundation/NSNull.h" #import "Foundation/NSSet.h" #import "Foundation/NSValue.h" #endif #import "GNUstepBase/GSObjCRuntime.h" #import "GNUstepBase/NSObject+GNUstepBase.h" #import "../GSPrivate.h" #import "../GSPThread.h" #include #include #include #ifdef __GNUSTEP_RUNTIME__ GS_IMPORT extern struct objc_slot *objc_get_slot(Class, SEL); #endif #ifdef NeXT_Foundation_LIBRARY @interface NSObject (MissingFromMacOSX) + (IMP) methodForSelector: (SEL)aSelector; @end #endif #define BDBGPrintf(format, args...) \ do { if (behavior_debug) { fprintf(stderr, (format) , ## args); } } while (0) Class GSObjCClass(id obj) { return object_getClass(obj); } Class GSObjCSuper(Class cls) { return class_getSuperclass(cls); } BOOL GSObjCIsInstance(id obj) { Class c = object_getClass(obj); if (c != Nil && class_isMetaClass(c) == NO) return YES; else return NO; } BOOL GSObjCIsClass(Class cls) { if (class_isMetaClass(object_getClass(cls))) return YES; else return NO; } BOOL GSObjCIsKindOf(Class cls, Class other) { while (cls != Nil) { if (cls == other) { return YES; } cls = class_getSuperclass(cls); } return NO; } Class GSClassFromName(const char *name) { return objc_lookUpClass(name); } const char * GSNameFromClass(Class cls) { return class_getName(cls); } const char * GSClassNameFromObject(id obj) { return class_getName(object_getClass(obj)); } const char * GSNameFromSelector(SEL sel) { return sel_getName(sel); } SEL GSSelectorFromName(const char *name) { return sel_getUid(name); } #if defined (__GNU_LIBOBJC__) && (__GNU_LIBOBJC__ < 20110608) /* Don't use sel_registerTypedName() ... it's broken when first introduced * into gcc (fails to correctly check for multiple registrations with same * types but different layout info). * Later versions of the runtime should be OK though. * Hack - need to provide these function declarations * for gcc 4.6 libobjc. They're called below, and they're declared * in objc-api.h, but we're using runtime.h, so objc-api.h can't be imported. */ SEL sel_get_any_typed_uid(const char *name); SEL sel_get_typed_uid(const char *name, const char*); SEL sel_register_name(const char *name); SEL sel_register_typed_name(const char *name, const char*type); #endif SEL GSSelectorFromNameAndTypes(const char *name, const char *types) { #if NeXT_RUNTIME return sel_getUid(name); #elif defined (__GNU_LIBOBJC__) && (__GNU_LIBOBJC__ >= 20110608) return sel_registerTypedName(name, types); #elif defined (__GNUSTEP_RUNTIME__) return sel_registerTypedName_np(name, types); #else extern SEL sel_get_any_typed_uid(const char*); extern SEL sel_get_typed_uid(const char*, const char*); extern SEL sel_register_name(const char*); extern SEL sel_register_typed_name(const char*, const char*); if (name == 0) { return 0; } else { SEL s; if (types == 0) { s = sel_get_any_typed_uid(name); } else { s = sel_get_typed_uid(name, types); } if (s == 0) { if (types == 0) { s = sel_register_name(name); } else { s = sel_register_typed_name(name, types); } } return s; } #endif } const char * GSTypesFromSelector(SEL sel) { #if NeXT_RUNTIME return 0; #elif defined (__GNU_LIBOBJC__) return sel_getTypeEncoding(sel); #elif defined (__GNUSTEP_RUNTIME__) return sel_getType_np(sel); #else if (sel == 0) { return 0; } else { return sel_get_type(sel); } #endif } void GSFlushMethodCacheForClass (Class cls) { return; } int GSObjCVersion(Class cls) { return class_getVersion(cls); } /** * This function is used to locate information about the instance * variable of obj called name. It returns YES if the variable * was found, NO otherwise. If it returns YES, then the values * pointed to by type, size, and offset will be set (except where * they are null pointers). */ BOOL GSObjCFindVariable(id obj, const char *name, const char **type, unsigned int *size, int *offset) { Class class = object_getClass(obj); Ivar ivar = class_getInstanceVariable(class, name); if (ivar == 0) { return NO; } else { const char *enc = ivar_getTypeEncoding(ivar); if (type != 0) { *type = enc; } if (size != 0) { NSUInteger s; NSUInteger a; NSGetSizeAndAlignment(enc, &s, &a); *size = s; } if (offset != 0) { *offset = ivar_getOffset(ivar); } return YES; } } /** * This method returns an array listing the names of all the * instance methods available to obj, whether they * belong to the class of obj or one of its superclasses.
* If obj is a class, this returns the class methods.
* Returns nil if obj is nil. */ NSArray * GSObjCMethodNames(id obj, BOOL recurse) { NSMutableSet *set; NSArray *array; Class class; if (obj == nil) { return nil; } /* * Add names to a set so methods declared in superclasses * and then overridden do not appear more than once. */ set = [[NSMutableSet alloc] initWithCapacity: 32]; class = object_getClass(obj); while (class != Nil) { unsigned count; Method *meth = class_copyMethodList(class, &count); while (count-- > 0) { NSString *name; name = [[NSString alloc] initWithFormat: @"%s", sel_getName(method_getName(meth[count]))]; [set addObject: name]; [name release]; } if (meth != NULL) { free(meth); } if (NO == recurse) { break; } class = class_getSuperclass(class); } array = [set allObjects]; RELEASE(set); return array; } /** * This method returns an array listing the names of all the * instance variables present in the instance obj, whether they * belong to the class of obj or one of its superclasses.
* Returns nil if obj is nil. */ NSArray * GSObjCVariableNames(id obj, BOOL recurse) { NSMutableSet *set; NSArray *array; Class class; if (obj == nil) { return nil; } /* * Add names to a set so methods declared in superclasses * and then overridden do not appear more than once. */ set = [[NSMutableSet alloc] initWithCapacity: 32]; class = object_getClass(obj); while (class != Nil) { unsigned count; Ivar *ivar = class_copyIvarList(class, &count); while (count-- > 0) { NSString *name; name = [[NSString alloc] initWithFormat: @"%s", ivar_getName(ivar[count])]; [set addObject: name]; [name release]; } if (ivar != NULL) { free(ivar); } if (NO == recurse) { break; } class = class_getSuperclass(class); } array = [set allObjects]; RELEASE(set); return array; } /** * Gets the value from an instance variable in obj
* This function performs no checking ... you should use it only where * you are providing information from a call to GSObjCFindVariable() * and you know that the data area provided is the correct size. */ void GSObjCGetVariable(id obj, int offset, unsigned int size, void *data) { memcpy(data, ((void*)obj) + offset, size); } /** * Sets the value in an instance variable in obj
* This function performs no checking ... you should use it only where * you are providing information from a call to GSObjCFindVariable() * and you know that the data area provided is the correct size. */ void GSObjCSetVariable(id obj, int offset, unsigned int size, const void *data) { memcpy(((void*)obj) + offset, data, size); } GS_EXPORT unsigned int GSClassList(Class *buffer, unsigned int max, BOOL clearCache) { int num; if (buffer != NULL) { memset(buffer, 0, sizeof(Class) * (max + 1)); } num = objc_getClassList(buffer, max); num = (num < 0) ? 0 : num; return num; } /** references: http://www.macdevcenter.com/pub/a/mac/2002/05/31/runtime_parttwo.html?page=1 http://developer.apple.com/documentation/Cocoa/Conceptual/ObjectiveC/9objc_runtime_reference/chapter_5_section_1.html http://developer.apple.com/documentation/Cocoa/Conceptual/ObjectiveC/9objc_runtime_reference/chapter_5_section_21.html ObjcRuntimeUtilities.m by Nicola Pero **/ /** *

Create a Class structure for use by the ObjectiveC runtime and return * an NSValue object pointing to it. The class will not be added to the * runtime (you must do that later using the GSObjCAddClasses() function). *

*

The iVars dictionary lists the instance variable names and their types. *

*/ NSValue * GSObjCMakeClass(NSString *name, NSString *superName, NSDictionary *iVars) { Class newClass; Class classSuperClass; const char *classNameCString; NSCAssert(name, @"no name"); NSCAssert(superName, @"no superName"); classSuperClass = NSClassFromString(superName); NSCAssert1(classSuperClass, @"No class named %@",superName); NSCAssert1(!NSClassFromString(name), @"A class %@ already exists", name); classNameCString = [name UTF8String]; newClass = objc_allocateClassPair(classSuperClass, classNameCString, 0); if ([iVars count] > 0) { NSEnumerator *enumerator = [iVars keyEnumerator]; NSString *key; while ((key = [enumerator nextObject]) != nil) { const char *iVarName = [key UTF8String]; const char *iVarType = [[iVars objectForKey: key] UTF8String]; uint8_t iVarAlign = 0; size_t iVarSize; NSUInteger s; NSUInteger a; NSGetSizeAndAlignment(iVarType, &s, &a); // Convert size to number of bitshifts needed for alignment. iVarSize = 1; while (iVarSize < s) { iVarSize <<= 1; iVarAlign++; } // Record actual size iVarSize = s; if (NO == class_addIvar(newClass, iVarName, iVarSize, iVarAlign, iVarType)) { NSLog(@"Error adding ivar '%s' of type '%s'", iVarName, iVarType); } } } return [NSValue valueWithPointer: newClass]; } /** * The classes argument is an array of NSValue objects containing pointers * to classes previously created by the GSObjCMakeClass() function. */ void GSObjCAddClasses(NSArray *classes) { NSUInteger numClasses = [classes count]; NSUInteger i; for (i = 0; i < numClasses; i++) { objc_registerClassPair((Class)[[classes objectAtIndex: i] pointerValue]); } } static BOOL behavior_debug = NO; BOOL GSObjCBehaviorDebug(int setget) { BOOL old = behavior_debug; if (setget == 1) { behavior_debug = YES; } else if (setget == 0) { behavior_debug = NO; } return old; } void GSObjCAddMethods(Class cls, Method *list, BOOL replace) { unsigned int index = 0; char c; Method m; if (cls == 0 || list == 0) { return; } c = class_isMetaClass(cls) ? '+' : '-'; while ((m = list[index++]) != NULL) { SEL n = method_getName(m); IMP i = method_getImplementation(m); const char *t = method_getTypeEncoding(m); /* This will override a superclass method but will not replace a * method which already exists in the class itsself. */ if (YES == class_addMethod(cls, n, i, t)) { BDBGPrintf(" added %c%s\n", c, sel_getName(n)); } else if (YES == replace) { /* If we want to replace an existing implemetation ... */ method_setImplementation(class_getInstanceMethod(cls, n), i); BDBGPrintf(" replaced %c%s\n", c, sel_getName(n)); } else { BDBGPrintf(" skipped %c%s\n", c, sel_getName(n)); } } } GSMethod GSGetMethod(Class cls, SEL sel, BOOL searchInstanceMethods, BOOL searchSuperClasses) { if (cls == 0 || sel == 0) { return 0; } if (searchSuperClasses == NO) { unsigned int count; Method method = NULL; Method *methods; if (searchInstanceMethods == NO) { methods = class_copyMethodList(object_getClass(cls), &count); } else { methods = class_copyMethodList(cls, &count); } if (methods != NULL) { unsigned int index = 0; while ((method = methods[index++]) != NULL) { if (sel_isEqual(sel, method_getName(method))) { break; } } free(methods); } return method; } else { if (searchInstanceMethods == NO) { return class_getClassMethod(cls, sel); } else { return class_getInstanceMethod(cls, sel); } } } GS_EXPORT const char * GSSkipTypeQualifierAndLayoutInfo(const char *types) { while (*types == '+' || *types == '-' || *types == _C_CONST || *types == _C_IN || *types == _C_INOUT || *types == _C_OUT || *types == _C_BYCOPY || *types == _C_BYREF || *types == _C_ONEWAY || *types == _C_GCINVISIBLE || isdigit ((unsigned char) *types)) { types++; } return types; } /* See header for documentation. */ GS_EXPORT BOOL GSSelectorTypesMatch(const char *types1, const char *types2) { if (! types1 || ! types2) { return NO; // Nul pointers never match } if (types1 == types2) { return YES; } while (*types1 && *types2) { types1 = GSSkipTypeQualifierAndLayoutInfo (types1); types2 = GSSkipTypeQualifierAndLayoutInfo (types2); /* Reached the end of the selector. */ if (! *types1 && ! *types2) { return YES; } /* Ignore structure name yet compare layout. */ if (*types1 == '{' && *types2 == '{') { while (*types1 != '=' && *types1 != '}') { types1++; } while (*types2 != '=' && *types2 != '}') { types2++; } } if (*types1 != *types2) { return NO; } types1++; types2++; } types1 = GSSkipTypeQualifierAndLayoutInfo (types1); types2 = GSSkipTypeQualifierAndLayoutInfo (types2); return (! *types1 && ! *types2) ? YES : NO; } /* See header for documentation. */ GSIVar GSCGetInstanceVariableDefinition(Class cls, const char *name) { return class_getInstanceVariable(cls, name); } GSIVar GSObjCGetInstanceVariableDefinition(Class cls, NSString *name) { return class_getInstanceVariable(cls, [name UTF8String]); } static inline unsigned int gs_string_hash(const char *s) { unsigned int val = 0; while (*s != 0) { val = (val << 5) + val + *s++; } return val; } #define GSI_MAP_HAS_VALUE 1 #define GSI_MAP_RETAIN_KEY(M, X) #define GSI_MAP_RETAIN_VAL(M, X) #define GSI_MAP_RELEASE_KEY(M, X) #define GSI_MAP_RELEASE_VAL(M, X) #define GSI_MAP_HASH(M, X) (gs_string_hash(X.ptr)) #define GSI_MAP_EQUAL(M, X,Y) (strcmp(X.ptr, Y.ptr) == 0) #define GSI_MAP_NOCLEAN 1 #define GSI_MAP_KTYPES GSUNION_PTR #define GSI_MAP_VTYPES GSUNION_PTR #include "GNUstepBase/GSIMap.h" static GSIMapTable_t protocol_by_name; static BOOL protocol_by_name_init = NO; static gs_mutex_t protocol_by_name_lock = GS_MUTEX_INIT_STATIC; /* Not sure about the semantics of inlining functions with static variables. */ static void gs_init_protocol_lock(void) { GS_MUTEX_LOCK(protocol_by_name_lock); if (protocol_by_name_init == NO) { GSIMapInitWithZoneAndCapacity (&protocol_by_name, NSDefaultMallocZone(), 128); protocol_by_name_init = YES; } GS_MUTEX_UNLOCK(protocol_by_name_lock); } void GSRegisterProtocol(Protocol *proto) { if (protocol_by_name_init == NO) { gs_init_protocol_lock(); } if (proto != nil) { GSIMapNode node; GS_MUTEX_LOCK(protocol_by_name_lock); node = GSIMapNodeForKey(&protocol_by_name, (GSIMapKey)protocol_getName(proto)); if (node == 0) { GSIMapAddPairNoRetain(&protocol_by_name, (GSIMapKey)(void*)protocol_getName(proto), (GSIMapVal)(void*)proto); } GS_MUTEX_UNLOCK(protocol_by_name_lock); } } Protocol * GSProtocolFromName(const char *name) { GSIMapNode node; Protocol *p; if (protocol_by_name_init == NO) { gs_init_protocol_lock(); } node = GSIMapNodeForKey(&protocol_by_name, (GSIMapKey) name); if (node) { p = node->value.ptr; } else { GS_MUTEX_LOCK(protocol_by_name_lock); node = GSIMapNodeForKey(&protocol_by_name, (GSIMapKey) name); if (node) { p = node->value.ptr; } else { p = objc_getProtocol(name); if (p) { /* Use the protocol's name to save us from allocating a copy of the parameter 'name'. */ GSIMapAddPairNoRetain(&protocol_by_name, (GSIMapKey)(void*)protocol_getName(p), (GSIMapVal)(void*)p); } } GS_MUTEX_UNLOCK(protocol_by_name_lock); } return p; } struct objc_method_description GSProtocolGetMethodDescriptionRecursive(Protocol *aProtocol, SEL aSel, BOOL isRequired, BOOL isInstance) { struct objc_method_description desc; desc = protocol_getMethodDescription(aProtocol, aSel, isRequired, isInstance); if (desc.name == NULL && desc.types == NULL) { Protocol **list; unsigned int count; list = protocol_copyProtocolList(aProtocol, &count); if (list != NULL) { unsigned int i; for (i = 0; i < count; i++) { desc = GSProtocolGetMethodDescriptionRecursive(list[i], aSel, isRequired, isInstance); if (desc.name != NULL || desc.types != NULL) { break; } } free(list); } } return desc; } void GSObjCAddClassBehavior(Class receiver, Class behavior) { unsigned int count; Method *methods; Class behavior_super_class = class_getSuperclass(behavior); if (YES == class_isMetaClass(receiver)) { fprintf(stderr, "Trying to add behavior (%s) to meta class (%s)\n", class_getName(behavior), class_getName(receiver)); abort(); } if (YES == class_isMetaClass(behavior)) { fprintf(stderr, "Trying to add meta class as behavior (%s) to (%s)\n", class_getName(behavior), class_getName(receiver)); abort(); } if (class_getInstanceSize(receiver) < class_getInstanceSize(behavior)) { const char *b = class_getName(behavior); const char *r = class_getName(receiver); #ifdef NeXT_Foundation_LIBRARY fprintf(stderr, "Trying to add behavior (%s) with instance " "size larger than class (%s)\n", b, r); abort(); #else /* As a special case we allow adding GSString/GSCString to the * constant string class ... since we know the base library * takes care not to access non-existent instance variables. */ if ((strcmp(b, "GSCString") && strcmp(b, "GSString")) || (strcmp(r, "NSConstantString") && strcmp(r, "NXConstantString"))) { fprintf(stderr, "Trying to add behavior (%s) with instance " "size larger than class (%s)\n", b, r); abort(); } #endif } BDBGPrintf("Adding behavior to class %s\n", class_getName(receiver)); /* Add instance methods */ methods = class_copyMethodList(behavior, &count); BDBGPrintf(" instance methods from %s %u\n", class_getName(behavior), count); if (methods == NULL) { BDBGPrintf(" none.\n"); } else { GSObjCAddMethods (receiver, methods, NO); free(methods); } /* Add class methods */ methods = class_copyMethodList(object_getClass(behavior), &count); BDBGPrintf(" class methods from %s %u\n", class_getName(behavior), count); if (methods == NULL) { BDBGPrintf(" none.\n"); } else { GSObjCAddMethods (object_getClass(receiver), methods, NO); free(methods); } /* Add behavior's superclass, if not already there. */ if (!GSObjCIsKindOf(receiver, behavior_super_class)) { GSObjCAddClassBehavior (receiver, behavior_super_class); } GSFlushMethodCacheForClass (receiver); } void GSObjCAddClassOverride(Class receiver, Class override) { unsigned int count; Method *methods; if (YES == class_isMetaClass(receiver)) { fprintf(stderr, "Trying to add override (%s) to meta class (%s)\n", class_getName(override), class_getName(receiver)); abort(); } if (YES == class_isMetaClass(override)) { fprintf(stderr, "Trying to add meta class as override (%s) to (%s)\n", class_getName(override), class_getName(receiver)); abort(); } if (class_getInstanceSize(receiver) < class_getInstanceSize(override)) { fprintf(stderr, "Trying to add override (%s) with instance " "size larger than class (%s)\n", class_getName(override), class_getName(receiver)); abort(); } BDBGPrintf("Adding override to class %s\n", class_getName(receiver)); /* Add instance methods */ methods = class_copyMethodList(override, &count); BDBGPrintf(" instance methods from %s %u\n", class_getName(override), count); if (methods == NULL) { BDBGPrintf(" none.\n"); } else { GSObjCAddMethods (receiver, methods, YES); free(methods); } /* Add class methods */ methods = class_copyMethodList(object_getClass(override), &count); BDBGPrintf(" class methods from %s %u\n", class_getName(override), count); if (methods == NULL) { BDBGPrintf(" none.\n"); } else { GSObjCAddMethods (object_getClass(receiver), methods, YES); free(methods); } GSFlushMethodCacheForClass (receiver); } #ifndef NeXT_Foundation_LIBRARY #import "Foundation/NSValue.h" #import "Foundation/NSKeyValueCoding.h" #endif /** * This is used internally by the key-value coding methods, to get a * value from an object either via an accessor method (if sel is * supplied), or via direct access (if type, size, and offset are * supplied).
* Automatic conversion between NSNumber and C scalar types is performed.
* If type is null and can't be determined from the selector, the * [NSObject-handleQueryWithUnboundKey:] method is called to try * to get a value. */ id GSObjCGetVal(NSObject *self, const char *key, SEL sel, const char *type, unsigned size, int offset) { NSMethodSignature *sig = nil; if (sel != 0) { sig = [self methodSignatureForSelector: sel]; if ([sig numberOfArguments] != 2) { [NSException raise: NSInvalidArgumentException format: @"key-value get method has wrong number of args"]; } type = [sig methodReturnType]; } if (type == NULL) { return [self valueForUndefinedKey: [NSString stringWithUTF8String: key]]; } else { id val = nil; switch (*type) { case _C_ID: case _C_CLASS: { id v; if (sel == 0) { v = *(id *)((char *)self + offset); } else { id (*imp)(id, SEL) = (id (*)(id, SEL))[self methodForSelector: sel]; v = (*imp)(self, sel); } val = v; } break; case _C_CHR: { signed char v; if (sel == 0) { v = *(char *)((char *)self + offset); } else { signed char (*imp)(id, SEL) = (signed char (*)(id, SEL))[self methodForSelector: sel]; v = (*imp)(self, sel); } val = [NSNumber numberWithChar: v]; } break; case _C_UCHR: { unsigned char v; if (sel == 0) { v = *(unsigned char *)((char *)self + offset); } else { unsigned char (*imp)(id, SEL) = (unsigned char (*)(id, SEL))[self methodForSelector: sel]; v = (*imp)(self, sel); } val = [NSNumber numberWithUnsignedChar: v]; } break; #if defined(_C_BOOL) && (!defined(__GNUC__) || __GNUC__ > 2) case _C_BOOL: { _Bool v; if (sel == 0) { v = *(_Bool *)((char *)self + offset); } else { _Bool (*imp)(id, SEL) = (_Bool (*)(id, SEL))[self methodForSelector: sel]; v = (*imp)(self, sel); } val = [NSNumber numberWithBool: (BOOL)v]; } break; #endif case _C_SHT: { short v; if (sel == 0) { v = *(short *)((char *)self + offset); } else { short (*imp)(id, SEL) = (short (*)(id, SEL))[self methodForSelector: sel]; v = (*imp)(self, sel); } val = [NSNumber numberWithShort: v]; } break; case _C_USHT: { unsigned short v; if (sel == 0) { v = *(unsigned short *)((char *)self + offset); } else { unsigned short (*imp)(id, SEL) = (unsigned short (*)(id, SEL))[self methodForSelector: sel]; v = (*imp)(self, sel); } val = [NSNumber numberWithUnsignedShort: v]; } break; case _C_INT: { int v; if (sel == 0) { v = *(int *)((char *)self + offset); } else { int (*imp)(id, SEL) = (int (*)(id, SEL))[self methodForSelector: sel]; v = (*imp)(self, sel); } val = [NSNumber numberWithInt: v]; } break; case _C_UINT: { unsigned int v; if (sel == 0) { v = *(unsigned int *)((char *)self + offset); } else { unsigned int (*imp)(id, SEL) = (unsigned int (*)(id, SEL))[self methodForSelector: sel]; v = (*imp)(self, sel); } val = [NSNumber numberWithUnsignedInt: v]; } break; case _C_LNG: { long v; if (sel == 0) { v = *(long *)((char *)self + offset); } else { long (*imp)(id, SEL) = (long (*)(id, SEL))[self methodForSelector: sel]; v = (*imp)(self, sel); } val = [NSNumber numberWithLong: v]; } break; case _C_ULNG: { unsigned long v; if (sel == 0) { v = *(unsigned long *)((char *)self + offset); } else { unsigned long (*imp)(id, SEL) = (unsigned long (*)(id, SEL))[self methodForSelector: sel]; v = (*imp)(self, sel); } val = [NSNumber numberWithUnsignedLong: v]; } break; #ifdef _C_LNG_LNG case _C_LNG_LNG: { long long v; if (sel == 0) { v = *(long long *)((char *)self + offset); } else { long long (*imp)(id, SEL) = (long long (*)(id, SEL))[self methodForSelector: sel]; v = (*imp)(self, sel); } val = [NSNumber numberWithLongLong: v]; } break; #endif #ifdef _C_ULNG_LNG case _C_ULNG_LNG: { unsigned long long v; if (sel == 0) { v = *(unsigned long long *)((char *)self + offset); } else { unsigned long long (*imp)(id, SEL) = (unsigned long long (*)(id, SEL))[self methodForSelector: sel]; v = (*imp)(self, sel); } val = [NSNumber numberWithUnsignedLongLong: v]; } break; #endif case _C_FLT: { float v; if (sel == 0) { v = *(float *)((char *)self + offset); } else { float (*imp)(id, SEL) = (float (*)(id, SEL))[self methodForSelector: sel]; v = (*imp)(self, sel); } val = [NSNumber numberWithFloat: v]; } break; case _C_DBL: { double v; if (sel == 0) { v = *(double *)((char *)self + offset); } else { double (*imp)(id, SEL) = (double (*)(id, SEL))[self methodForSelector: sel]; v = (*imp)(self, sel); } val = [NSNumber numberWithDouble: v]; } break; case _C_VOID: { void (*imp)(id, SEL) = (void (*)(id, SEL))[self methodForSelector: sel]; (*imp)(self, sel); } val = nil; break; case _C_STRUCT_B: if (GSSelectorTypesMatch(@encode(NSPoint), type)) { NSPoint v; if (sel == 0) { memcpy((char*)&v, ((char *)self + offset), sizeof(v)); } else { NSPoint (*imp)(id, SEL) = (NSPoint (*)(id, SEL))[self methodForSelector: sel]; v = (*imp)(self, sel); } val = [NSValue valueWithPoint: v]; } else if (GSSelectorTypesMatch(@encode(NSRange), type)) { NSRange v; if (sel == 0) { memcpy((char*)&v, ((char *)self + offset), sizeof(v)); } else { NSRange (*imp)(id, SEL) = (NSRange (*)(id, SEL))[self methodForSelector: sel]; v = (*imp)(self, sel); } val = [NSValue valueWithRange: v]; } else if (GSSelectorTypesMatch(@encode(NSRect), type)) { NSRect v; if (sel == 0) { memcpy((char*)&v, ((char *)self + offset), sizeof(v)); } else { NSRect (*imp)(id, SEL) = (NSRect (*)(id, SEL))[self methodForSelector: sel]; v = (*imp)(self, sel); } val = [NSValue valueWithRect: v]; } else if (GSSelectorTypesMatch(@encode(NSSize), type)) { NSSize v; if (sel == 0) { memcpy((char*)&v, ((char *)self + offset), sizeof(v)); } else { NSSize (*imp)(id, SEL) = (NSSize (*)(id, SEL))[self methodForSelector: sel]; v = (*imp)(self, sel); } val = [NSValue valueWithSize: v]; } else { if (sel == 0) { return [NSValue valueWithBytes: ((char *)self + offset) objCType: type]; } else { NSInvocation *inv; size_t retSize; inv = [NSInvocation invocationWithMethodSignature: sig]; [inv setSelector: sel]; [inv invokeWithTarget: self]; retSize = [sig methodReturnLength]; { char ret[retSize]; [inv getReturnValue: ret]; return [NSValue valueWithBytes: ret objCType: type]; } } } break; default: #ifdef __GNUSTEP_RUNTIME__ { Class cls; struct objc_slot *type_slot; SEL typed; struct objc_slot *slot; cls = [self class]; type_slot = objc_get_slot(cls, @selector(retain)); typed = GSSelectorFromNameAndTypes(sel_getName(sel), NULL); slot = objc_get_slot(cls, typed); if (strcmp(slot->types, type_slot->types) == 0) { return slot->method(self, typed); } } #endif val = [self valueForUndefinedKey: [NSString stringWithUTF8String: key]]; } return val; } } /** * Calls GSObjCGetVal() */ id GSObjCGetValue(NSObject *self, NSString *key, SEL sel, const char *type, unsigned size, int offset) { return GSObjCGetVal(self, [key UTF8String], sel, type, size, offset); } /** * This is used internally by the key-value coding methods, to set a * value in an object either via an accessor method (if sel is * supplied), or via direct access (if type, size, and offset are * supplied).
* Automatic conversion between NSNumber and C scalar types is performed.
* If type is null and can't be determined from the selector, the * [NSObject-handleTakeValue:forUnboundKey:] method is called to try * to set a value. */ void GSObjCSetVal(NSObject *self, const char *key, id val, SEL sel, const char *type, unsigned size, int offset) { static NSNull *null = nil; NSMethodSignature *sig = nil; if (null == nil) { null = [NSNull new]; } if (sel != 0) { sig = [self methodSignatureForSelector: sel]; if ([sig numberOfArguments] != 3) { [NSException raise: NSInvalidArgumentException format: @"key-value set method has wrong number of args"]; } type = [sig getArgumentTypeAtIndex: 2]; } if (type == NULL) { [self setValue: val forUndefinedKey: [NSString stringWithUTF8String: key]]; } else if ((val == nil || val == null) && *type != _C_ID && *type != _C_CLASS) { [self setNilValueForKey: [NSString stringWithUTF8String: key]]; } else { switch (*type) { case _C_ID: case _C_CLASS: { id v = val; if (sel == 0) { id *ptr = (id *)((char *)self + offset); ASSIGN(*ptr, v); } else { void (*imp)(id, SEL, id) = (void (*)(id, SEL, id))[self methodForSelector: sel]; (*imp)(self, sel, val); } } break; case _C_CHR: { char v = [val charValue]; if (sel == 0) { char *ptr = (char *)((char *)self + offset); *ptr = v; } else { void (*imp)(id, SEL, char) = (void (*)(id, SEL, char))[self methodForSelector: sel]; (*imp)(self, sel, v); } } break; case _C_UCHR: { unsigned char v = [val unsignedCharValue]; if (sel == 0) { unsigned char *ptr = (unsigned char*)((char *)self + offset); *ptr = v; } else { void (*imp)(id, SEL, unsigned char) = (void (*)(id, SEL, unsigned char))[self methodForSelector: sel]; (*imp)(self, sel, v); } } break; #if defined(_C_BOOL) && (!defined(__GNUC__) || __GNUC__ > 2) case _C_BOOL: { _Bool v = (_Bool)[val boolValue]; if (sel == 0) { _Bool *ptr = (_Bool*)((char *)self + offset); *ptr = v; } else { void (*imp)(id, SEL, _Bool) = (void (*)(id, SEL, _Bool))[self methodForSelector: sel]; (*imp)(self, sel, v); } } break; #endif case _C_SHT: { short v = [val shortValue]; if (sel == 0) { short *ptr = (short*)((char *)self + offset); *ptr = v; } else { void (*imp)(id, SEL, short) = (void (*)(id, SEL, short))[self methodForSelector: sel]; (*imp)(self, sel, v); } } break; case _C_USHT: { unsigned short v = [val unsignedShortValue]; if (sel == 0) { unsigned short *ptr; ptr = (unsigned short*)((char *)self + offset); *ptr = v; } else { void (*imp)(id, SEL, unsigned short) = (void (*)(id, SEL, unsigned short))[self methodForSelector: sel]; (*imp)(self, sel, v); } } break; case _C_INT: { int v = [val intValue]; if (sel == 0) { int *ptr = (int*)((char *)self + offset); *ptr = v; } else { void (*imp)(id, SEL, int) = (void (*)(id, SEL, int))[self methodForSelector: sel]; (*imp)(self, sel, v); } } break; case _C_UINT: { unsigned int v = [val unsignedIntValue]; if (sel == 0) { unsigned int *ptr = (unsigned int*)((char *)self + offset); *ptr = v; } else { void (*imp)(id, SEL, unsigned int) = (void (*)(id, SEL, unsigned int))[self methodForSelector: sel]; (*imp)(self, sel, v); } } break; case _C_LNG: { long v = [val longValue]; if (sel == 0) { long *ptr = (long*)((char *)self + offset); *ptr = v; } else { void (*imp)(id, SEL, long) = (void (*)(id, SEL, long))[self methodForSelector: sel]; (*imp)(self, sel, v); } } break; case _C_ULNG: { unsigned long v = [val unsignedLongValue]; if (sel == 0) { unsigned long *ptr = (unsigned long*)((char *)self + offset); *ptr = v; } else { void (*imp)(id, SEL, unsigned long) = (void (*)(id, SEL, unsigned long))[self methodForSelector: sel]; (*imp)(self, sel, v); } } break; #ifdef _C_LNG_LNG case _C_LNG_LNG: { long long v = [val longLongValue]; if (sel == 0) { long long *ptr = (long long*)((char *)self + offset); *ptr = v; } else { void (*imp)(id, SEL, long long) = (void (*)(id, SEL, long long))[self methodForSelector: sel]; (*imp)(self, sel, v); } } break; #endif #ifdef _C_ULNG_LNG case _C_ULNG_LNG: { unsigned long long v = [val unsignedLongLongValue]; if (sel == 0) { unsigned long long *ptr = (unsigned long long*)((char*)self + offset); *ptr = v; } else { void (*imp)(id, SEL, unsigned long long) = (void (*)(id, SEL, unsigned long long))[self methodForSelector: sel]; (*imp)(self, sel, v); } } break; #endif case _C_FLT: { float v = [val floatValue]; if (sel == 0) { float *ptr = (float*)((char *)self + offset); *ptr = v; } else { void (*imp)(id, SEL, float) = (void (*)(id, SEL, float))[self methodForSelector: sel]; (*imp)(self, sel, v); } } break; case _C_DBL: { double v = [val doubleValue]; if (sel == 0) { double *ptr = (double*)((char *)self + offset); *ptr = v; } else { void (*imp)(id, SEL, double) = (void (*)(id, SEL, double))[self methodForSelector: sel]; (*imp)(self, sel, v); } } break; case _C_STRUCT_B: if (GSSelectorTypesMatch(@encode(NSPoint), type)) { NSPoint v = [val pointValue]; if (sel == 0) { NSPoint *ptr = (NSPoint*)((char *)self + offset); *ptr = v; } else { void (*imp)(id, SEL, NSPoint) = (void (*)(id, SEL, NSPoint))[self methodForSelector: sel]; (*imp)(self, sel, v); } } else if (GSSelectorTypesMatch(@encode(NSRange), type)) { NSRange v = [val rangeValue]; if (sel == 0) { NSRange *ptr = (NSRange*)((char *)self + offset); *ptr = v; } else { void (*imp)(id, SEL, NSRange) = (void (*)(id, SEL, NSRange))[self methodForSelector: sel]; (*imp)(self, sel, v); } } else if (GSSelectorTypesMatch(@encode(NSRect), type)) { NSRect v = [val rectValue]; if (sel == 0) { NSRect *ptr = (NSRect*)((char *)self + offset); *ptr = v; } else { void (*imp)(id, SEL, NSRect) = (void (*)(id, SEL, NSRect))[self methodForSelector: sel]; (*imp)(self, sel, v); } } else if (GSSelectorTypesMatch(@encode(NSSize), type)) { NSSize v = [val sizeValue]; if (sel == 0) { NSSize *ptr = (NSSize*)((char *)self + offset); *ptr = v; } else { void (*imp)(id, SEL, NSSize) = (void (*)(id, SEL, NSSize))[self methodForSelector: sel]; (*imp)(self, sel, v); } } else { NSUInteger size; NSGetSizeAndAlignment(type, &size, NULL); if (sel == 0) { [val getValue: ((char *)self + offset)]; } else { NSInvocation *inv; char buf[size]; [val getValue: buf]; inv = [NSInvocation invocationWithMethodSignature: sig]; [inv setSelector: sel]; [inv setArgument: buf atIndex: 2]; [inv invokeWithTarget: self]; } } break; default: [self setValue: val forUndefinedKey: [NSString stringWithUTF8String: key]]; } } } /** * Calls GSObjCSetVal() */ void GSObjCSetValue(NSObject *self, NSString *key, id val, SEL sel, const char *type, unsigned size, int offset) { GSObjCSetVal(self, [key UTF8String], val, sel, type, size, offset); } /** Returns an autoreleased array of subclasses of Class cls, including * subclasses of subclasses. */ NSArray *GSObjCAllSubclassesOfClass(Class cls) { if (!cls) { return nil; } else { NSMutableArray *result; Class *classes; int numClasses; int i; numClasses = objc_getClassList(NULL, 0); classes = NSZoneMalloc(NSDefaultMallocZone(), numClasses*sizeof(Class)); objc_getClassList(classes, numClasses); result = [NSMutableArray array]; for (i = 0; i < numClasses; i++) { Class c = classes[i]; if (YES == GSObjCIsKindOf(c, cls) && cls != c) { [result addObject: c]; } } NSZoneFree(NSDefaultMallocZone(), classes); return result; } } /** Returns an autoreleased array containing subclasses directly descendent of * Class cls. */ NSArray *GSObjCDirectSubclassesOfClass(Class cls) { if (!cls) { return nil; } else { NSMutableArray *result; Class *classes; int numClasses; int i; numClasses = objc_getClassList(NULL, 0); classes = NSZoneMalloc(NSDefaultMallocZone(), numClasses*sizeof(Class)); objc_getClassList(classes, numClasses); result = [NSMutableArray array]; for (i = 0; i < numClasses; i++) { Class c = classes[i]; if (class_getSuperclass(c) == cls) { [result addObject: c]; } } NSZoneFree(NSDefaultMallocZone(), classes); return result; } } @interface GSAutoreleasedMemory : NSObject @end @implementation GSAutoreleasedMemory @end void * GSAutoreleasedBuffer(unsigned size) { #ifdef ALIGN #undef ALIGN #endif #define ALIGN __alignof__(double) static Class buffer_class = 0; static Class autorelease_class; static SEL autorelease_sel; static id (*autorelease_imp)(Class, SEL, id); static int instance_size; static int offset; NSObject *o; if (buffer_class == 0) { buffer_class = [GSAutoreleasedMemory class]; instance_size = class_getInstanceSize(buffer_class); offset = instance_size % ALIGN; autorelease_class = [NSAutoreleasePool class]; autorelease_sel = @selector(addObject:); autorelease_imp = (id (*)(Class, SEL, id)) [autorelease_class methodForSelector: autorelease_sel]; } o = (NSObject*)NSAllocateObject(buffer_class, size + offset, NSDefaultMallocZone()); (*autorelease_imp)(autorelease_class, autorelease_sel, o); return ((void*)o) + instance_size + offset; } /* * Deprecated function. */ const char * GSLastErrorStr(long error_id) { return [[[NSError _last] localizedDescription] cString]; } BOOL GSPrintf (FILE *fptr, NSString* format, ...) { static Class stringClass = 0; static NSStringEncoding enc; va_list ap; NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSString *message; NSData *data; BOOL ok = NO; if (stringClass == 0) { stringClass = [NSString class]; enc = [stringClass defaultCStringEncoding]; } message = [stringClass allocWithZone: NSDefaultMallocZone()]; va_start (ap, format); message = [message initWithFormat: format locale: nil arguments: ap]; va_end (ap); data = [message dataUsingEncoding: enc]; if (data == nil) { data = [message dataUsingEncoding: NSUTF8StringEncoding]; } [message release]; if (data != nil) { unsigned int length = [data length]; if (length == 0 || fwrite([data bytes], 1, length, fptr) == length) { ok = YES; } } [arp drain]; return ok; } #if defined(GNUSTEP_BASE_LIBRARY) # ifndef NDEBUG # define AADD(c, o) GSDebugAllocationAdd(c, o) # define AREM(c, o) GSDebugAllocationRemove(c, o) # else # define AADD(c, o) # define AREM(c, o) # endif #else # define AADD(c, o) # define AREM(c, o) #endif /* defined(GNUSTEP_BASE_LIBRARY) */ void GSClassSwizzle(id instance, Class newClass) { Class oldClass = object_getClass(instance); /* Only set if the old and new class differ */ if (oldClass != newClass) { /* NB. The call to object_setClass() may not work (eg for a libobjc2 * 'small object', in which case the class is unchanged and we need * to allow for that. */ AREM(oldClass, instance); object_setClass(instance, newClass); newClass = object_getClass(instance); AADD(newClass, instance); } } void GSObjCPrint(void *base, void *item) { FILE *fptr = stdout; Class c; id o; if (NULL == base) { fprintf(fptr, "null\n"); return; } if (GSObjCIsClass((Class)base)) { o = nil; c = (Class)base; if (NULL == item) { fprintf(fptr, "%p is class %s {\n", base, GSNameFromClass(c)); } } else if (GSObjCIsInstance((id)base)) { o = (id)base; c = GSObjCClass(o); if (NULL == item) { fprintf(fptr, "%p is instance of class %s (%p) {\n", base, GSNameFromClass(c), c); } } else { fprintf(fptr, "%p is not a class or instance\n", base); return; } while (c != Nil) { unsigned count; Ivar *ivars = class_copyIvarList(c, &count); while (count-- > 0) { Ivar ivar = ivars[count]; const char *name = ivar_getName(ivar); const char *type = ivar_getTypeEncoding(ivar); ptrdiff_t offset = ivar_getOffset(ivar); const char *t; if (NULL == item) { fprintf(fptr, " (%ld) %s", (long)offset, name); } else if (strcmp(item, name) == 0) { continue; // not a match } else { fprintf(fptr, "(%ld) %s", (long)offset, name); } if (nil == o) { /* We have no instance ... display offset to ivar */ fprintf(fptr, "\n"); continue; } fprintf(fptr, " = "); t = GSSkipTypeQualifierAndLayoutInfo(type); switch (*t) { case _C_ID: { id v = *(id *)((char *)o + offset); if (nil == v) { fprintf(fptr, "nil\n"); } else { fprintf(fptr, "%s instance %p\n", GSNameFromClass(GSObjCClass(v)), v); } } break; case _C_CLASS: { Class v = *(Class *)((char *)o + offset); if (Nil == v) { fprintf(fptr, "Nil\n"); } else { fprintf(fptr, "%s class %p\n", GSNameFromClass(v), v); } } break; case _C_CHR: { signed char v = *(char *)((char *)o + offset); fprintf(fptr, "%c %d\n", v, (int)v); } break; case _C_UCHR: { unsigned char v = *(unsigned char *)((char *)o + offset); fprintf(fptr, "%c %u\n", v, (unsigned)v); } break; #if defined(_C_BOOL) && (!defined(__GNUC__) || __GNUC__ > 2) case _C_BOOL: { _Bool v = *(_Bool *)((char *)o + offset); fprintf(fptr, "%s %u\n", (v ? "YES" : "NO"), (unsigned)v); } break; #endif case _C_SHT: { short v = *(short *)((char *)o + offset); fprintf(fptr, "%hd\n", v); } break; case _C_USHT: { unsigned short v; v = *(unsigned short *)((char *)o + offset); fprintf(fptr, "%hu\n", v); } break; case _C_INT: { int v = *(int *)((char *)o + offset); fprintf(fptr, "%d\n", v); } break; case _C_UINT: { unsigned int v = *(unsigned int *)((char *)o + offset); fprintf(fptr, "%u\n", v); } break; case _C_LNG: { long v = *(long *)((char *)o + offset); fprintf(fptr, "%ld\n", v); } break; case _C_ULNG: { unsigned long v = *(unsigned long *)((char *)o + offset); fprintf(fptr, "%lu\n", v); } break; #ifdef _C_LNG_LNG case _C_LNG_LNG: { long long v = *(long long *)((char *)o + offset); fprintf(fptr, "%lld\n", v); } break; #endif #ifdef _C_ULNG_LNG case _C_ULNG_LNG: { unsigned long long v; v = *(unsigned long long *)((char *)o + offset); fprintf(fptr, "%llu\n", v); } break; #endif case _C_FLT: { float v = *(float *)((char *)o + offset); fprintf(fptr, "%g\n", v); } break; case _C_DBL: { double v = *(double *)((char *)o + offset); fprintf(fptr, "%g\n", v); } break; case _C_VOID: { fprintf(fptr, "void ???\n"); } break; case _C_STRUCT_B: { fprintf(fptr, "struct not supported\n"); } break; default: { fprintf(fptr, "type %s not supported\n", type); } break; } } if (ivars != NULL) { free(ivars); } c = class_getSuperclass(c); } if (NULL == item) { fprintf(fptr, "}\n"); } } gnustep-base-1.29.0/Source/Additions/GSTypeEncoding.c000066400000000000000000000501221435650067400223560ustar00rootroot00000000000000/* * Objective-C type encoding support * * Copyright (C) 2012-2013 Free Software Foundation, Inc. * * Written by Marat Ibadinov * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ #include "GNUstepBase/GSTypeEncoding.h" #include #include #undef MAX #define MAX(X, Y) \ ({ \ typeof (X) __x = (X), __y = (Y); \ (__x > __y ? __x : __y); \ }) /* * We store here aligned sizes of primitive types * and bit-masks of type qualifiers */ static const int8_t typeInfoTable[] = { /* types */ [GSObjCTypeId] = sizeof(id), [GSObjCTypeClass] = sizeof(Class), [GSObjCTypeSelector] = sizeof(SEL), [GSObjCTypeChar] = sizeof(char), [GSObjCTypeUnsignedChar] = sizeof(unsigned char), [GSObjCTypeShort] = sizeof(short), [GSObjCTypeUnsignedShort] = sizeof(unsigned short), [GSObjCTypeInt] = sizeof(int), [GSObjCTypeUnsignedInt] = sizeof(unsigned int), [GSObjCTypeLong] = sizeof(long), [GSObjCTypeUnsignedLong] = sizeof(unsigned long), [GSObjCTypeLongLong] = sizeof(long long), [GSObjCTypeUnsignedLongLong] = sizeof(unsigned long long), [GSObjCTypeFloat] = sizeof(float), [GSObjCTypeDouble] = sizeof(double), [GSObjCTypeBool] = sizeof(_Bool), [GSObjCTypeVoid] = sizeof(void), /* here would go Pointer, but in most cases it needs special treatment */ [GSObjCTypeCharPointer] = sizeof(char *), [GSObjCTypeAtom] = sizeof(void *), /* type qualifiers (negated for distinctiveness) */ [GSObjCQualifierConst] = -GSObjCQualifierConstMask, [GSObjCQualifierIn] = -GSObjCQualifierInMask, [GSObjCQualifierInOut] = -GSObjCQualifierInOutMask, [GSObjCQualifierOut] = -GSObjCQualifierOutMask, [GSObjCQualifierByCopy] = -GSObjCQualifierByCopyMask, [GSObjCQualifierByRef] = -GSObjCQualifierByRefMask, [GSObjCQualifierOneWay] = -GSObjCQualifierOneWayMask, [GSObjCQualifierInvisible] = -GSObjCQualifierInvisible, /* ensure an appropriate table size */ [GSObjCTypeMax] = 0 }; /* all substripts of typeInfoTable are of char type */ #ifdef __clang__ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wchar-subscripts" #endif GS_STATIC_INLINE uint8_t RoundToThePowerOfTwo (uint8_t value) { --value; value |= value >> 1; value |= value >> 2; value |= value >> 4; return ++value; } GS_STATIC_INLINE const char * GetNumericValue (const char *cursor, int *value) { *value = 0; while (*cursor >= '0' && *cursor <= '9') { *value = 10 * (*value) + (*cursor++ - '0'); } return cursor; } GS_STATIC_INLINE const char * SkipName (const char *cursor) { if (*cursor == '"') { for (++cursor; *cursor++ != '"';); } return cursor; } GS_STATIC_INLINE const char * SkipType (const char *cursor) { unsigned depth = 0; do { while (typeInfoTable[(int)*cursor] < 0) { ++cursor; } if (!typeInfoTable[(int)*cursor]) { switch (*cursor) { case GSObjCTypeArrayBegin: case GSObjCTypeStructureBegin: case GSObjCTypeUnionBegin: ++depth; break; case GSObjCTypeArrayEnd: case GSObjCTypeStructureEnd: case GSObjCTypeUnionEnd: --depth; break; case GSObjCTypePointer: ++cursor; default: break; } } cursor = SkipName(++cursor); } while (depth); return cursor; } GS_STATIC_INLINE const char * GetQualifiers (const char *cursor, uint8_t *qualifiers) { *qualifiers = 0; while (typeInfoTable[(int)*cursor] < 0) { *qualifiers |= (uint8_t) -typeInfoTable[(int)*cursor]; ++cursor; } return cursor; } typedef struct ParserStackElement { const char *cursor; size_t size; size_t count; /* for arrays */ char alignment; char qualifiers; } ParserStackElement; typedef struct ParserOutput { GSObjCTypeInfo info; unsigned parentDepth; BOOL suppressed; } ParserOutput; typedef struct ParserState { ParserStackElement *stack; ParserOutput *buffer; unsigned stackSize; unsigned bufferSize; unsigned allocated; unsigned stackSpace; unsigned bufferSpace; } ParserState; /** * Complex type nesting level of 4 or greater is a rare case. * With initial size of 3 total memory footprint of stack and * buffer is 224 bytes (on machines with 64-bit word). * * Nesting depth of 16 will require circa 1K of memory, 64 - approximately 4K. * Maybe it would be better to place an upper bound on nesting depth and simply * allocate space on stack once. This will certainly be a performance again. */ static const unsigned ParserInitialStackSize = 3; GS_STATIC_INLINE ParserStackElement * ParserStackTop (ParserState *state) { return state->stackSize ? &state->stack[state->stackSize - 1] : NULL; } const char * GSObjCParseTypeSpecification (const char *cursor, GSObjCTypeParserDelegate delegate, void *context, unsigned options) { ParserState state; unsigned suppressionDepth = 0; unsigned bitFieldSpaceAvailable = 0; ParserStackElement el; unsigned index; state.stackSize = state.bufferSize = 0; state.stackSpace = sizeof(ParserStackElement) * ParserInitialStackSize; state.bufferSpace = sizeof(ParserOutput) * (ParserInitialStackSize + 1); state.stack = malloc(state.stackSpace + state.bufferSpace); state.buffer = (void *)state.stack + state.stackSpace; state.allocated = ParserInitialStackSize; do { GSObjCTypeInfo info = {cursor, 0, 1, 0}; BOOL pushStack = NO; BOOL popStack = NO; BOOL pushBuffer = YES; BOOL suppress = suppressionDepth != 0; unsigned parentDepth; cursor = GetQualifiers(cursor, &info.qualifiers); cursor = SkipName(cursor); parentDepth = state.stackSize; /* is it a primitive type? */ if (typeInfoTable[(int)*cursor]) { info.size = info.alignment = typeInfoTable[(int)*cursor]; cursor = SkipName(++cursor); } else { switch (*cursor) { case GSObjCTypeBitField: { int totalBitCount = -bitFieldSpaceAvailable; int bitCount = 0; info.alignment = 1; while (totalBitCount < 8 && *cursor == GSObjCTypeBitField) /* can we emit token */ { cursor = GetNumericValue(++cursor, &bitCount); totalBitCount += bitCount; /* round bitCount to the nearest power of 2 */ info.alignment = MAX(info.alignment, RoundToThePowerOfTwo(bitCount) / 8); } info.size = totalBitCount / 8 + ((totalBitCount & 7 /* mod 8 */) != 0); if (*cursor == GSObjCTypeBitField) { bitFieldSpaceAvailable = (unsigned)info.alignment * 8 - totalBitCount; } else bitFieldSpaceAvailable = 0; break; } case GSObjCTypePointer: { info.size = info.alignment = sizeof(void *); cursor = SkipType(++cursor); break; } case GSObjCTypeComplex: { info.size = 2 * (info.alignment = typeInfoTable[(int)*++cursor]); ++cursor; break; } case GSObjCTypeArrayBegin: { int length; cursor = GetNumericValue(++cursor, &length); el = (ParserStackElement){ cursor, 0, length - 1, 1, info.qualifiers }; pushStack = YES; suppressionDepth += (options & GSObjCReportArrayOnceMask) != 0; break; } case GSObjCTypeStructureBegin: { el = (ParserStackElement){cursor, 0, 0, 1, info.qualifiers}; /* skip typename annotation */ while (*cursor != GSObjCTypeStructureEnd && *cursor++ != '='); pushStack = YES; break; } case GSObjCTypeUnionBegin: { el = (ParserStackElement){cursor, 0, 0, 1, info.qualifiers}; /* skip typename annotation */ while (*cursor != GSObjCTypeUnionEnd && *cursor++ != '='); ++suppressionDepth; pushStack = YES; break; } case GSObjCTypeUnionEnd: case GSObjCTypeArrayEnd: case GSObjCTypeStructureEnd: { popStack = YES; break; } default: abort(); } } if (pushStack) { if (state.stackSize == state.allocated) { unsigned stackSpace; unsigned bufferSpace; void *data; state.allocated *= 2; stackSpace = sizeof(ParserStackElement) * state.allocated; bufferSpace = sizeof(ParserOutput) * (state.allocated + 1); data = malloc(stackSpace + bufferSpace); memcpy(data, state.stack, state.stackSpace); memcpy(data + stackSpace, state.buffer, state.bufferSpace); free(state.stack); state.stack = data; state.buffer = (void *)data + stackSpace; state.stackSpace = stackSpace; state.bufferSpace = bufferSpace; } state.stack[state.stackSize] = el; ++state.stackSize; } else { /* we can safely flush the buffer */ for (index = 0; index < state.bufferSize; ++index) { GSObjCTypeInfo output = state.buffer[index].info; unsigned depth = state.buffer[index].parentDepth; if (depth) { ParserStackElement *parent = &state.stack[depth - 1]; if (*parent->cursor != GSObjCTypeUnionBegin) { size_t alignedSize; /* in array and structure we should align data according * to the element that triggered flushing (it may be the * next real member of the data-structure or a closing * tag) */ output.alignment = MAX(output.alignment, info.alignment); alignedSize = GSObjCPadSize(output.size, output.alignment); parent->size += alignedSize; } else { parent->size = MAX(parent->size, output.size); } parent->alignment = MAX(parent->alignment, output.alignment); } if (!state.buffer[index].suppressed) { delegate(context, output); } } state.bufferSize = 0; } if (popStack) { ParserStackElement *element = ParserStackTop(&state); switch (*cursor) { case GSObjCTypeUnionEnd: --suppressionDepth; /* FALLTHROUGH */ case GSObjCTypeArrayEnd: { if (element->count) { if (options & GSObjCReportArrayOnceMask) { /* we need to compensate "length - 1" */ element->size *= (element->count + 1); --suppressionDepth; } else { /* decrease length and rewind */ --element->count; cursor = element->cursor; pushBuffer = NO; break; } } } /* FALLTHROUGH */ case GSObjCTypeStructureEnd: { info.qualifiers = element->qualifiers; info.size = element->size; info.alignment = element->alignment; parentDepth = --state.stackSize; ++cursor; break; } } } if (pushBuffer) { /* outermost GSObjCTypeUnionBegin and GSObjCTypeUnionEnd * should be reported */ state.buffer[state.bufferSize].suppressed = suppress && suppressionDepth != 0; state.buffer[state.bufferSize].parentDepth = parentDepth; state.buffer[state.bufferSize].info = info; ++state.bufferSize; } } while (state.stackSize); for (index = 0; index < state.bufferSize; ++index) { if (!state.buffer[index].suppressed) { delegate(context, state.buffer[index].info); } } free(state.stack); return cursor; } #ifdef __clang__ #pragma GCC diagnostic pop #endif typedef struct InfoAccumulator { size_t size; char alignment; } InfoAccumulator; static void InfoAccumulatorAddInfo (InfoAccumulator *this, GSObjCTypeInfo info) { /* if it's the end of structure, accumulate only padding */ if (*info.type == GSObjCTypeStructureEnd) this->size += GSObjCGetPadding (info.size, info.alignment); else this->size += GSObjCPadSize (info.size, info.alignment); this->alignment = MAX(this->alignment, info.alignment); } const char * GSGetSizeAndAlignment (const char *type, size_t *sizep, uint8_t *alignp) { InfoAccumulator accumulator = {0, 0}; type = GSObjCParseTypeSpecification (type, (GSObjCTypeParserDelegate)&InfoAccumulatorAddInfo, &accumulator, GSObjCReportArrayOnceMask); if (sizep) { *sizep = accumulator.size; } if (alignp) { *alignp = accumulator.alignment; } return type; } #if defined (NeXT_RUNTIME) /* emulate GNU API */ typedef struct SizeInfoAccumulator { size_t size; unsigned depth; } SizeInfoAccumulator; static void SizeInfoAccumulatorAddInfo (SizeInfoAccumulator *this, GSObjCTypeInfo info) { /* we wait until typespec's last element and save it's unaligned size */ switch (*info.type) { case GSObjCTypeArrayBegin: case GSObjCTypeStructureBegin: case GSObjCTypeUnionBegin: ++this->depth; break; case GSObjCTypeArrayEnd: case GSObjCTypeStructureEnd: case GSObjCTypeUnionEnd: --this->depth; break; default: break; } if (!this->depth) { this->size += info.size; } } int objc_sizeof_type (const char* type) { SizeInfoAccumulator accumulator = {0, 0}; GSObjCParseTypeSpecification (type, (GSObjCTypeParserDelegate)&SizeInfoAccumulatorAddInfo, &accumulator, GSObjCReportArrayOnceMask); return (int)accumulator.size; } int objc_alignof_type (const char* type) { uint8_t alignment; GSGetSizeAndAlignment (type, NULL, &alignment); return (int)alignment; } int objc_aligned_size (const char* type) { size_t size; GSGetSizeAndAlignment (type, &size, NULL); return (int)size; } int objc_promoted_size (const char* type) { size_t size; GSGetSizeAndAlignment (type, &size, NULL); return (int)GSObjCPadSize (size, sizeof(void *)); } /* we should not instantiate this function more than once */ static const char * GetQualifiersInst (const char *cursor, uint8_t *qualifiers) { return GetQualifiers (cursor, qualifiers); } /* we should not instantiate this function more than once */ static const char * SkipTypeInst (const char *cursor) { return SkipType(cursor); } unsigned objc_get_type_qualifiers (const char* type) { uint8_t qualifiers; GetQualifiersInst (type, &qualifiers); return qualifiers; } const char * objc_skip_type_qualifiers (const char* type) { uint8_t qualifiers; return GetQualifiersInst (type, &qualifiers); } const char * objc_skip_typespec (const char* type) { uint8_t qualifiers; type = GetQualifiersInst (type, &qualifiers); return SkipTypeInst (type); } const char * objc_skip_offset (const char* type) { if (*type == '+' || *type == '-') { type++; } while (*type >= '0' && *type <= '9') { type++; } return type; } const char * objc_skip_argspec (const char* type) { type = SkipTypeInst (type); return objc_skip_offset (type); } static void objc_layout_structure_append_info(struct objc_struct_layout *this, GSObjCTypeInfo info) { if (this->count == this->allocated) { this->info = realloc(this->info, sizeof(GSObjCTypeInfo) * (this->allocated *= 2)); } this->info[this->count] = info; ++this->count; } static void objc_layout_structure_parser_delegate(struct objc_struct_layout *this, GSObjCTypeInfo info) { unsigned initialDepth = this->depth; switch (*info.type) { case GSObjCTypeArrayEnd: case GSObjCTypeStructureEnd: case GSObjCTypeUnionEnd: { if (--this->depth == 1) { this->info[this->count - 1].size = info.size; this->info[this->count - 1].alignment = info.alignment; } break; } case GSObjCTypeArrayBegin: case GSObjCTypeStructureBegin: case GSObjCTypeUnionBegin: ++this->depth; default: if (initialDepth == 1) { objc_layout_structure_append_info(this, info); } break; } } void objc_layout_structure (const char *type, struct objc_struct_layout *layout) { *layout = (struct objc_struct_layout) { malloc(8 * sizeof(GSObjCTypeInfo)), -1, 0, 8, 0, 0, 0 }; GSObjCParseTypeSpecification(type, (GSObjCTypeParserDelegate)&objc_layout_structure_parser_delegate, layout, GSObjCReportArrayOnceMask); } BOOL objc_layout_structure_next_member (struct objc_struct_layout *layout) { return ++layout->position < layout->count; } void objc_layout_structure_get_info (struct objc_struct_layout *layout, unsigned int *offset, unsigned int *align, const char **type) { GSObjCTypeInfo info = layout->info[layout->position]; if (offset) { *offset = layout->offset; } if (align) { *align = info.alignment; } if (type) { *type = info.type; } layout->offset += GSObjCPadSize(info.size, info.alignment); layout->alignment = MAX(layout->alignment, info.alignment); } void objc_layout_finish_structure (struct objc_struct_layout *layout, unsigned int *size, unsigned int *align) { if (size) { *size = (unsigned int) GSObjCPadSize(layout->offset, layout->alignment); } if (align) { *align = layout->alignment; } free(layout->info); } #endif /* NeXT_RUNTIME */ gnustep-base-1.29.0/Source/Additions/GSXML.m000066400000000000000000004236701435650067400204540ustar00rootroot00000000000000/** Implementation for GSXML classes Copyright (C) 2000,2001,2002 Free Software Foundation, Inc. Written by: Michael Pakhantsov on behalf of Brainstorm computer solutions. Date: Jule 2000 Integration/updates/rewrites by: Richard Frith-Macdonald Date: Sep2000,Dec2001/Jan2002 This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. The XML and HTML parsing system The XML and HTML parsing system

The GNUstep XML parser is a collection Objective-C classes wrapping the C XML parsing library (libxml).

The underlying C library handles high performance parsing, while the ObjectiveC classes provide ease of use/integration.

*/ #import "common.h" #import "GNUstepBase/Unicode.h" #ifndef _XOPEN_SOURCE #define _XOPEN_SOURCE 600 #endif #include #ifdef HAVE_LIBXML #import "GNUstepBase/GSObjCRuntime.h" #import "GNUstepBase/NSDebug+GNUstepBase.h" #import "GNUstepBase/NSObject+GNUstepBase.h" #import "GNUstepBase/GSMime.h" #import "GNUstepBase/GSXML.h" #import "Foundation/NSArray.h" #import "Foundation/NSCalendarDate.h" #import "Foundation/NSCharacterSet.h" #import "Foundation/NSData.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSException.h" #import "Foundation/NSFileHandle.h" #import "Foundation/NSFileManager.h" #import "Foundation/NSRunLoop.h" #import "Foundation/NSString.h" #import "Foundation/NSThread.h" #import "Foundation/NSTimer.h" #import "Foundation/NSTimeZone.h" #import "Foundation/NSURL.h" #import "Foundation/NSURLHandle.h" #import "Foundation/NSValue.h" /* Avoid problems on systems where the xml headers use 'id' */ #define id GSXMLID /* libxml headers */ #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_LIBXSLT #include #include #include #include #endif /* HAVE_LIBXSLT */ #undef id /* * optimization * */ static Class NSString_class; static id (*usImp)(id, SEL, const unsigned char*); static SEL usSel; static xmlExternalEntityLoader originalLoader = NULL; /* * Macro to cast results to correct type for libxml2 */ #define UTF8STRING(X) ((const unsigned char*)[X UTF8String]) inline static NSString* UTF8Str(const unsigned char *bytes) { // stringWithUTF8String: raises on OSX if you feed it with a NULL string. if (NULL == bytes) { return nil; } return (*usImp)(NSString_class, usSel, bytes); } inline static NSString* UTF8StrLen(const unsigned char *bytes, unsigned length) { NSString *str; str = [[NSString_class alloc] initWithBytes: bytes length: length encoding: NSUTF8StringEncoding]; return AUTORELEASE(str); } static BOOL cacheDone = NO; #ifdef NeXT_Foundation_LIBRARY @interface NSObject (MissingFromMacOSX) + (IMP) methodForSelector: (SEL)aSelector; @end #endif static char * xml_strdup(const char *from) { unsigned len; char *to; if (0 == from) from = ""; len = strlen(from) + 1; to = malloc(len); memcpy(to, from, len); return to; } @implementation NSObject (SetupForGSXML) + (void) _setupForGSXML { if (NO == cacheDone) { xmlInitParser(); xmlMemSetup(free, malloc, realloc, xml_strdup); xmlInitializeCatalog(); #if LIBXML_VERSION < 21000 xmlDefaultSAXHandlerInit(); #endif NSString_class = [NSString class]; usSel = @selector(stringWithUTF8String:); usImp = (id (*)(id, SEL, const unsigned char*)) [NSString_class methodForSelector: usSel]; cacheDone = YES; } } @end static void setupCache() { if (cacheDone == NO) { /* Setup of libxml2 must be done on main thread. */ [NSObject performSelectorOnMainThread: @selector(_setupForGSXML) withObject: nil waitUntilDone: YES]; } } static int xmlNSInputStreamReadCallback(void *context, char *buffer, int len) { NSInputStream *stream = (NSInputStream *)context; return [stream read: (uint8_t *)buffer maxLength: len]; } static int xmlNSInputStreamCloseCallback (void *context) { NSInputStream *stream = (NSInputStream *)context; [stream close]; return 0; } static xmlParserInputPtr loadEntityFunction(const unsigned char *url, const unsigned char *eid, void *ctx); static xmlParserInputPtr resolveEntityFunction(void *ctx, const unsigned char *eid, const unsigned char *url); static xmlEntityPtr getEntityIgnoreExternal(void *ctx, const xmlChar *name); static xmlEntityPtr getEntityResolveExternal(void *ctx, const xmlChar *name); @interface GSXPathObject(Private) + (id) _newWithNativePointer: (xmlXPathObject *)lib context: (GSXPathContext *)context; @end @interface GSXMLDocument (GSPrivate) - (id) _initFrom: (void*)data parent: (id)p ownsLib: (BOOL)f; @end @interface GSXMLNamespace (GSPrivate) - (id) _initFrom: (void*)data parent: (id)p; @end @interface GSXMLNode (GSPrivate) - (id) _initFrom: (void*)data parent: (id)p; @end @interface GSXMLParser (Private) - (BOOL) _initLibXML; - (NSMutableString*) _messages; - (void) _parseChunk: (NSData*)data; @end @interface GSSAXHandler (Private) - (BOOL) _initLibXML; - (void) _setParser: (GSXMLParser*)value; @end /** * A class wrapping attributes of an XML element node. Generally when * examining a GSXMLDocument, you need not concern yourself with * GSXMLAttribute objects as you will probably use the * [GSXMLNode-objectForKey:] method to return the string value of any * attribute you are interested in. */ @implementation GSXMLAttribute static NSMapTable *attrNames = 0; + (void) initialize { if (self == [GSXMLAttribute class]) { if (cacheDone == NO) setupCache(); attrNames = NSCreateMapTable(NSIntegerMapKeyCallBacks, NSNonRetainedObjectMapValueCallBacks, 0); [[NSObject leakAt: &attrNames] release]; NSMapInsert(attrNames, (void*)XML_ATTRIBUTE_CDATA, (void*)@"XML_ATTRIBUTE_CDATA"); NSMapInsert(attrNames, (void*)XML_ATTRIBUTE_ID, (void*)@"XML_ATTRIBUTE_ID"); NSMapInsert(attrNames, (void*)XML_ATTRIBUTE_IDREF, (void*)@"XML_ATTRIBUTE_IDREF"); NSMapInsert(attrNames, (void*)XML_ATTRIBUTE_IDREFS, (void*)@"XML_ATTRIBUTE_IDREFS"); NSMapInsert(attrNames, (void*)XML_ATTRIBUTE_ENTITY, (void*)@"XML_ATTRIBUTE_ENTITY"); NSMapInsert(attrNames, (void*)XML_ATTRIBUTE_ENTITIES, (void*)@"XML_ATTRIBUTE_ENTITIES"); NSMapInsert(attrNames, (void*)XML_ATTRIBUTE_NMTOKEN, (void*)@"XML_ATTRIBUTE_NMTOKEN"); NSMapInsert(attrNames, (void*)XML_ATTRIBUTE_NMTOKENS, (void*)@"XML_ATTRIBUTE_NMTOKENS"); NSMapInsert(attrNames, (void*)XML_ATTRIBUTE_ENUMERATION, (void*)@"XML_ATTRIBUTE_ENUMERATION"); NSMapInsert(attrNames, (void*)XML_ATTRIBUTE_NOTATION, (void*)@"XML_ATTRIBUTE_NOTATION"); } } + (NSInteger) typeFromDescription: (NSString*)desc { NSMapEnumerator enumerator; NSString *val; void *key; enumerator = NSEnumerateMapTable(attrNames); while (NSNextMapEnumeratorPair(&enumerator, &key, (void**)&val)) { if ([desc isEqual: val] == YES) { return (NSInteger)(intptr_t)key; } } return -1; } + (NSString*) descriptionFromType: (NSInteger)type { NSString *desc = (NSString*)NSMapGet(attrNames, (void*)(intptr_t)type); return desc; } - (NSInteger) type { return (NSInteger)((xmlAttrPtr)(lib))->atype; } - (NSString*) typeDescription { NSString *desc; desc = (NSString*)NSMapGet(attrNames, (void*)(intptr_t)[self type]); if (desc == nil) { desc = @"Unknown attribute type"; } return desc; } /** * Return the next sibling node ... another GSXMLAttribute instance. */ - (GSXMLNode*) next { if (((xmlAttrPtr)(lib))->next != NULL) { return AUTORELEASE([[GSXMLAttribute alloc] _initFrom: ((xmlAttrPtr)(lib))->next parent: self]); } else { return nil; } } /** * Return the previous sibling node ... another GSXMLAttribute instance. */ - (GSXMLNode*) previous { if (((xmlAttrPtr)(lib))->prev != NULL) { return AUTORELEASE([[GSXMLAttribute alloc] _initFrom: ((xmlAttrPtr)(lib))->prev parent: self]); } else { return nil; } } /** * Returns the string value of the attribute. */ - (NSString*) value { if (((xmlNodePtr)lib)->children != NULL && ((xmlNodePtr)lib)->children->content != NULL) { return UTF8Str(((xmlNodePtr)(lib))->children->content); } return nil; } @end /** * A GSXML document wraps the document structure of the underlying * libxml library. */ @implementation GSXMLDocument /** * Create a new document with the specified version. * * id d = [GSXMLDocument documentWithVersion: @"1.0"]; * * [d setRoot: [d makeNodeWithNamespace: nil name: @"plist" content: nil]]; * [[d root] setObject: @"0.9" forKey: @"version"]; * n1 = [[d root] makeChildWithNamespace: nil name: @"dict" content: nil]; * [n1 makeComment: @" this is a comment "]; * [n1 makePI: @"pi1" content: @"this is a process instruction"]; * [n1 makeChildWithNamespace: nil name: @"key" content: @"Year Of Birth"]; * [n1 makeChildWithNamespace: nil name: @"integer" content: @"65"]; * [n1 makeChildWithNamespace: nil name: @"key" content: @"Pets Names"]; * */ + (GSXMLDocument*) documentWithVersion: (NSString*)version { void *data = xmlNewDoc(UTF8STRING(version)); GSXMLDocument *document = nil; if (data == 0) { NSLog(@"Can't create GSXMLDocument object"); } else { document = [GSXMLDocument alloc]; document = [document _initFrom: data parent: nil ownsLib: YES]; } return AUTORELEASE(document); } + (void) initialize { if (cacheDone == NO) setupCache(); } - (id) copyWithZone: (NSZone*)z { return RETAIN(self); } - (void) dealloc { if (_ownsLib == YES && lib != NULL) { xmlFreeDoc(lib); } RELEASE(_parent); [super dealloc]; } /** * Returns a string representation of the document (ie the XML) * or nil if the document does not have reasonable contents. */ - (NSString*) description { NSString *string = nil; xmlChar *buf = NULL; int length; xmlDocDumpFormatMemoryEnc(lib, &buf, &length, "utf-8", 1); if (buf != 0 && length > 0) { string = UTF8StrLen(buf, length); free(buf); } return string; } /** * Returns the name of the encoding for this document. */ - (NSString*) encoding { return UTF8Str(((xmlDocPtr)(lib))->encoding); } - (NSUInteger) hash { return (((NSUInteger)(intptr_t)lib) >> 3); } - (id) init { NSLog(@"GSXMLDocument: calling -init is not legal"); DESTROY(self); return nil; } /** * Returns a pointer to the raw libxml data used by this document.
* Only for use by libxml experts! */ - (void*) lib { return lib; } /** * Creates a new node within the document. * * GSXMLNode *n1, *n2; * GSXMLDocument *d; * * d = [GSXMLDocument documentWithVersion: @"1.0"]; * [d setRoot: [d makeNodeWithNamespace: nil name: @"plist" content: nil]]; * [[d root] setObject: @"0.9" forKey: @"version"]; * n1 = [[d root] makeChildWithNamespace: nil name: @"dict" content: nil]; * */ - (GSXMLNode*) makeNodeWithNamespace: (GSXMLNamespace*)ns name: (NSString*)name content: (NSString*)content { GSXMLNode *n = [GSXMLNode alloc]; n = [n _initFrom: xmlNewDocNode(lib, [ns lib], UTF8STRING(name), UTF8STRING(content)) parent: self]; return AUTORELEASE(n); } /** * Returns the root node of the document. */ - (GSXMLNode*) root { GSXMLNode *n = [GSXMLNode alloc]; n = [n _initFrom: xmlDocGetRootElement(lib) parent: self]; return AUTORELEASE(n); } /** * Sets the root of the document.
* NB. The node must have been created as part of the receiving document * (eg. using the -makeNodeWithNamespace:name:content: method). */ - (GSXMLNode*) setRoot: (GSXMLNode*)node { xmlNodePtr nodeLib = (xmlNodePtr)[node lib]; xmlNodePtr selfLib = (xmlNodePtr)[self lib]; if (node == nil) { [NSException raise: NSInvalidArgumentException format: @"Attempt to set root of document to nil"]; } if (nodeLib->doc != selfLib->doc) { [NSException raise: NSInvalidArgumentException format: @"Attempt to set root to node from other document"]; } xmlDocSetRootElement(lib, nodeLib); return node; } /** * Returns the version string for this document. */ - (NSString*) version { return UTF8Str(((xmlDocPtr)(lib))->version); } /** * Uses the -description method to produce a string representation of * the document and writes that to filename. */ - (BOOL) writeToFile: (NSString*)filename atomically: (BOOL)useAuxilliaryFile { NSString *s = [self description]; if (s == nil) { return NO; } return [s writeToFile: filename atomically: useAuxilliaryFile]; } /** * Uses the -description method to produce a string representation of * the document and writes that to url. */ - (BOOL) writeToURL: (NSURL*)url atomically: (BOOL)useAuxilliaryFile { NSString *s = [self description]; if (s == nil) { return NO; } return [s writeToURL: url atomically: useAuxilliaryFile]; } @end @implementation GSXMLDocument (GSPrivate) /** * * Initialise a new document object using raw libxml data. * The resulting document does not 'own' the data, and will not free it. */ - (id) _initFrom: (void*)data parent: (id)p ownsLib: (BOOL)f { if (data == NULL) { NSLog(@"%@ - no data for initialization", NSStringFromClass([self class])); DESTROY(self); return nil; } lib = data; _ownsLib = f; ASSIGN(_parent, p); return self; } @end /** * A GSXMLNamespace object wraps part of the document structure of * the underlying libxml library. */ @implementation GSXMLNamespace static NSMapTable *nsNames = 0; /** * Return the string representation of the specified numeric type. */ + (NSString*) descriptionFromType: (NSInteger)type { NSString *desc = (NSString*)NSMapGet(nsNames, (void*)(intptr_t)type); return desc; } + (void) initialize { if (self == [GSXMLNamespace class]) { if (cacheDone == NO) setupCache(); nsNames = NSCreateMapTable(NSIntegerMapKeyCallBacks, NSNonRetainedObjectMapValueCallBacks, 0); [[NSObject leakAt: &nsNames] release]; NSMapInsert(nsNames, (void*)XML_LOCAL_NAMESPACE, (void*)@"XML_LOCAL_NAMESPACE"); } } /** * Return the numeric constant value for the namespace * type named. This method is inefficient, so the returned * value should be saved for re-use later. The possible * values are - * * XML_LOCAL_NAMESPACE * */ + (NSInteger) typeFromDescription: (NSString*)desc { NSMapEnumerator enumerator; NSString *val; void *key; enumerator = NSEnumerateMapTable(nsNames); while (NSNextMapEnumeratorPair(&enumerator, &key, (void**)&val)) { if ([desc isEqual: val] == YES) { return (NSInteger)(intptr_t)key; } } return -1; } - (id) copyWithZone: (NSZone*)z { return RETAIN(self); } - (void) dealloc { RELEASE(_parent); [super dealloc]; } - (NSUInteger) hash { return (((NSUInteger)(intptr_t)lib) >> 3); } /** * Returns the namespace reference */ - (NSString*) href { return UTF8Str(((xmlNsPtr)(lib))->href); } - (id) init { NSLog(@"GSXMLNamespace: calling -init is not legal"); DESTROY(self); return nil; } - (BOOL) isEqual: (id)other { if ([other isKindOfClass: [self class]] == YES && [other lib] == lib) return YES; else return NO; } /** * Returns a pointer to the raw libxml data used by this document.
* Only for use by libxml experts! */ - (void*) lib { return lib; } /** * return the next namespace. */ - (GSXMLNamespace*) next { if (((xmlNsPtr)(lib))->next != NULL) { GSXMLNamespace *ns = [GSXMLNamespace alloc]; ns = [ns _initFrom: ((xmlNsPtr)(lib))->next parent: self]; return AUTORELEASE(ns); } else { return nil; } } /** * Return the namespace prefix. */ - (NSString*) prefix { return UTF8Str(((xmlNsPtr)(lib))->prefix); } /** * Return type of namespace */ - (NSInteger) type { return (NSInteger)((xmlNsPtr)(lib))->type; } /** * Return string representation of the type of the namespace. */ - (NSString*) typeDescription { NSString *desc; desc = (NSString*)NSMapGet(nsNames, (void*)(intptr_t)[self type]); if (desc == nil) { desc = @"Unknown namespace type"; } return desc; } @end @implementation GSXMLNamespace (GSPrivate) /** * Initialise a new namespace object using raw libxml data. * The resulting namespace does not 'own' the data, and will not free it. */ - (id) _initFrom: (void*)data parent: (id)p { if (data == NULL) { NSLog(@"%@ - no data for initialization", NSStringFromClass([self class])); DESTROY(self); return nil; } lib = data; ASSIGN(_parent, p); return self; } @end /** * A GSXMLNode object wraps part of the document structure of the * underlying libxml library. It may have a parent, siblings, and children. */ @implementation GSXMLNode static NSMapTable *nodeNames = 0; /** * Return the string constant value for the node type given. */ + (NSString*) descriptionFromType: (NSInteger)type { NSString *desc = (NSString*)NSMapGet(nodeNames, (void*)(intptr_t)type); return desc; } + (void) initialize { if (self == [GSXMLNode class]) { if (cacheDone == NO) setupCache(); nodeNames = NSCreateMapTable(NSIntegerMapKeyCallBacks, NSNonRetainedObjectMapValueCallBacks, 0); [[NSObject leakAt: &nodeNames] release]; NSMapInsert(nodeNames, (void*)XML_ELEMENT_NODE, (void*)@"XML_ELEMENT_NODE"); NSMapInsert(nodeNames, (void*)XML_ATTRIBUTE_NODE, (void*)@"XML_ATTRIBUTE_NODE"); NSMapInsert(nodeNames, (void*)XML_TEXT_NODE, (void*)@"XML_TEXT_NODE"); NSMapInsert(nodeNames, (void*)XML_CDATA_SECTION_NODE, (void*)@"XML_CDATA_SECTION_NODE"); NSMapInsert(nodeNames, (void*)XML_ENTITY_REF_NODE, (void*)@"XML_ENTITY_REF_NODE"); NSMapInsert(nodeNames, (void*)XML_ENTITY_NODE, (void*)@"XML_ENTITY_NODE"); NSMapInsert(nodeNames, (void*)XML_PI_NODE, (void*)@"XML_PI_NODE"); NSMapInsert(nodeNames, (void*)XML_COMMENT_NODE, (void*)@"XML_COMMENT_NODE"); NSMapInsert(nodeNames, (void*)XML_DOCUMENT_NODE, (void*)@"XML_DOCUMENT_NODE"); NSMapInsert(nodeNames, (void*)XML_DOCUMENT_TYPE_NODE, (void*)@"XML_DOCUMENT_TYPE_NODE"); NSMapInsert(nodeNames, (void*)XML_DOCUMENT_FRAG_NODE, (void*)@"XML_DOCUMENT_FRAG_NODE"); NSMapInsert(nodeNames, (void*)XML_NOTATION_NODE, (void*)@"XML_NOTATION_NODE"); NSMapInsert(nodeNames, (void*)XML_HTML_DOCUMENT_NODE, (void*)@"XML_HTML_DOCUMENT_NODE"); NSMapInsert(nodeNames, (void*)XML_DTD_NODE, (void*)@"XML_DTD_NODE"); NSMapInsert(nodeNames, (void*)XML_ELEMENT_DECL, (void*)@"XML_ELEMENT_DECL"); NSMapInsert(nodeNames, (void*)XML_ATTRIBUTE_DECL, (void*)@"XML_ATTRIBUTE_DECL"); NSMapInsert(nodeNames, (void*)XML_ENTITY_DECL, (void*)@"XML_ENTITY_DECL"); } } /** *

Converts a node type string to a numeric constant which can be compared * with the result of the -type method to determine what sort of node an * instance is. Because this method is quite inefficient, you should cache * the numeric type returned and re-use the cached value. *

* The node type names are - * * XML_ELEMENT_NODE * XML_ATTRIBUTE_NODE * XML_TEXT_NODE * XML_CDATA_SECTION_NODE * XML_ENTITY_REF_NODE * XML_ENTITY_NODE * XML_PI_NODE * XML_COMMENT_NODE * XML_DOCUMENT_NODE * XML_DOCUMENT_TYPE_NODE * XML_DOCUMENT_FRAG_NODE * XML_NOTATION_NODE * XML_HTML_DOCUMENT_NODE * XML_DTD_NODE * XML_ELEMENT_DECL * XML_ATTRIBUTE_DECL * XML_ENTITY_DECL * */ + (NSInteger) typeFromDescription: (NSString*)desc { NSMapEnumerator enumerator; NSString *val; void *key; enumerator = NSEnumerateMapTable(nodeNames); while (NSNextMapEnumeratorPair(&enumerator, &key, (void**)&val)) { if ([desc isEqual: val] == YES) { return (NSInteger)(intptr_t)key; } } return -1; } /** *

* Return attributes and values as a dictionary *

*/ - (NSDictionary*) attributes { xmlAttrPtr prop; NSMutableDictionary *d = [NSMutableDictionary dictionary]; prop = ((xmlNodePtr)(lib))->properties; while (prop != NULL) { const void *name = prop->name; NSString *key = UTF8Str(name); NSString *value = @""; xmlNodePtr child = prop->children; while (child != NULL) { const void *content = child->content; value = [value stringByAppendingString: UTF8Str(content)]; child = child->next; } [d setObject: value forKey: key]; prop = prop->next; } return d; } - (id) copyWithZone: (NSZone*)z { return RETAIN(self); } /** * Return node content as a string. This should return meaningful * information for text nodes and for entity nodes containing only * text nodes.
* If entity substitution was not enabled during parsing, an * element containing text may actually contain both text nodes and * entity reference nodes, in this case you should not use this * method to get the content of the element, but should examine * the child nodes of the element individually and perform any * entity reference you need to do explicitly.
* NB. There are five standard entities which are automatically * substituted into the content text rather than appearing as * entity nodes in their own right. These are '<', '>', ''', * '"' and '&'. If you with to receive content in which these * characters are represented by the original entity escapes, you need * to use the -escapedContent method. */ - (NSString*) content { xmlNodePtr ptr = (xmlNodePtr)lib; if (ptr == NULL) { return nil; } if (ptr->content != NULL) { return UTF8Str(ptr->content); } if ((NSInteger)ptr->type == XML_TEXT_NODE) { return @""; } else if ((NSInteger)ptr->type == XML_ELEMENT_NODE) { ptr = ptr->children; if (ptr != NULL) { if (ptr->next == NULL) { if (ptr->content != NULL) { return UTF8Str(ptr->content); } } else { NSMutableString *m = [NSMutableString new]; while (ptr != NULL) { if (ptr->content != NULL) { [m appendString: UTF8Str(ptr->content)]; } ptr = ptr->next; } return AUTORELEASE(m); } } } return nil; } - (void) dealloc { RELEASE(_parent); [super dealloc]; } /** * Returns a string representation of the node and all its children * (ie the XML text) or nil if the node does not have reasonable contents. */ - (NSString*) description { NSString *string = nil; xmlOutputBufferPtr buf; buf = xmlAllocOutputBuffer(0); if (buf != 0) { xmlNodeDumpOutput(buf, ((xmlNodePtr)(lib))->doc, (xmlNodePtr)(lib), 1, 1, "utf-8"); if (xmlOutputBufferFlush(buf) < 0) { NSDebugMLog(@"Failed to flush XML description"); } #if LIBXML_VERSION < 20900 string = UTF8StrLen(buf->buffer->content, buf->buffer->use); #else string = UTF8StrLen(xmlBufContent(buf->buffer), xmlBufUse(buf->buffer)); #endif xmlOutputBufferClose(buf); } return string; } /** * Return the document in which this node exists. */ - (GSXMLDocument*) document { if (((xmlNodePtr)(lib))->doc != NULL) { GSXMLDocument *d = [GSXMLDocument alloc]; d = [d _initFrom: ((xmlNodePtr)(lib))->doc parent: self ownsLib: NO]; return AUTORELEASE(d); } else { return nil; } } /** * This performs the same function as the -content method, but retains * escaped character information (the standard five entities &lt;, * &gt;, &apos;, &quot;, and &amp;) which are normally * replaced with their standard equivalents * (<, >, ', ", and &). */ - (NSString*) escapedContent { NSString *str = [self content]; return [str stringByEscapingXML]; } /** * Return the first attribute in this node. */ - (GSXMLAttribute*) firstAttribute { if (((xmlNodePtr)(lib))->properties != NULL) { return AUTORELEASE([[GSXMLAttribute alloc] _initFrom: ((xmlNodePtr)(lib))->properties parent: self]); } else { return nil; } } /** * Return the first child element of this node. If you wish to step * through all children of the node (including non-element nodes) * you should use the -firstChild method instead. */ - (GSXMLNode*) firstChildElement { xmlNodePtr ptr = ((xmlNodePtr)lib)->children; while (ptr != NULL) { if (ptr->type == XML_ELEMENT_NODE) { GSXMLNode *n = [GSXMLNode alloc]; n = [n _initFrom: ptr parent: self]; return AUTORELEASE(n); } ptr = ptr->next; } return nil; } /** * Return the first child node of this node. * * - (GSXMLNode*) elementRecursive: (GSXMLNode*)node * { * while (node != nil) * { * if ([node type] == XML_ELEMENT_NODE) * { * return node; * } * if ([node firstChild] != nil) * { * node = [self elementRecursive: [node firstChild]]; * } * else * { * node = [node next]; * } * } * return node; * } * */ - (GSXMLNode*) firstChild { if (((xmlNodePtr)(lib))->children != NULL) { GSXMLNode *n = [GSXMLNode alloc]; n = [n _initFrom: ((xmlNodePtr)(lib))->children parent: self]; return AUTORELEASE(n); } else { return nil; } } - (NSUInteger) hash { return (((NSUInteger)(intptr_t)lib) >> 3); } - (id) init { NSLog(@"GSXMLNode: calling -init is not legal"); DESTROY(self); return nil; } /** * Convenience method, equivalent to calling -type and comparing it * with the result of passing "XML_ELEMENT_NODE" to * +typeFromDescription: (but faster). */ - (BOOL) isElement { if ((NSInteger)((xmlNodePtr)(lib))->type == XML_ELEMENT_NODE) { return YES; } return NO; } - (BOOL) isEqual: (id)other { if ([other isKindOfClass: [self class]] == YES && [other lib] == lib) { return YES; } else { return NO; } } /** * Convenience method, equivalent to calling -type and comparing it * with the result of passing "XML_TEXT_NODE" to * +typeFromDescription: (but faster). */ - (BOOL) isText { if ((NSInteger)((xmlNodePtr)(lib))->type == XML_TEXT_NODE) { return YES; } return NO; } /** * Returns a pointer to the raw libxml data used by this document.
* Only for use by libxml experts! */ - (void*) lib { return lib; } /** * Create and return an attribute (unless the named attribute already exists, * in which case we update them value of the existing attribute and return it. */ - (GSXMLAttribute*) makeAttributeWithName: (NSString*)name value: (NSString*)value { void *l; l = xmlNewProp((xmlNodePtr)[self lib], UTF8STRING(name), UTF8STRING(value)); return AUTORELEASE([[GSXMLAttribute alloc] _initFrom: l parent: self]); } /** *

* Creation of a new child element, added at the end of * parent children list. * ns and content parameters are optional (may be nil). * If content is non nil, a child list containing the * TEXTs and ENTITY_REFs node will be created. * Return previous node. *

* * * GSXMLNode *n1, *n2; * GSXMLDocument *d, *d1; * * d = [GSXMLDocument documentWithVersion: @"1.0"]; * [d setRoot: [d makeNodeWithNamespace: nil * name: @"plist" * content: nil]]; * [[d root] setObject: @"0.9" forKey: @"version"]; * n1 = [[d root] makeChildWithNamespace: nil * name: @"dict" * content: nil]; * [n1 makeChildWithNamespace: nil name: @"key" content: @"Year Of Birth"]; * [n1 makeChildWithNamespace: nil name: @"integer" content: @"65"]; * * [n1 makeChildWithNamespace: nil name: @"key" content: @"Pets Names"]; * [n1 makeChildWithNamespace: nil name: @"array" content: nil]; * * */ - (GSXMLNode*) makeChildWithNamespace: (GSXMLNamespace*)ns name: (NSString*)name content: (NSString*)content { GSXMLNode *n = [GSXMLNode alloc]; n = [n _initFrom: xmlNewTextChild(lib, [ns lib], UTF8STRING(name), UTF8STRING(content)) parent: self]; return AUTORELEASE(n); } /** * Creation of a new text element, added at the end of * parent children list. * * d = [GSXMLDocument documentWithVersion: @"1.0"]; * * [d setRoot: [d makeNodeWithNamespace: nil name: @"plist" content: nil]]; * [[d root] setObject: @"0.9" forKey: @"version"]; * n1 = [[d root] makeChildWithNamespace: nil name: @"dict" content: nil]; * [n1 makeText: @" this is a text "]; * */ - (GSXMLNode*) makeText: (NSString*)content { GSXMLNode *n = [GSXMLNode alloc]; n = [n _initFrom: xmlAddChild((xmlNodePtr)lib, xmlNewText(UTF8STRING(content))) parent: self]; return AUTORELEASE(n); } /** * Creation of a new comment element, added at the end of * parent children list. * * d = [GSXMLDocument documentWithVersion: @"1.0"]; * * [d setRoot: [d makeNodeWithNamespace: nil name: @"plist" content: nil]]; * [[d root] setObject: @"0.9" forKey: @"version"]; * n1 = [[d root] makeChildWithNamespace: nil name: @"dict" content: nil]; * [n1 makeComment: @" this is a comment "]; * */ - (GSXMLNode*) makeComment: (NSString*)content { GSXMLNode *n = [GSXMLNode alloc]; n = [n _initFrom: xmlAddChild((xmlNodePtr)lib, xmlNewComment(UTF8STRING(content))) parent: self]; return AUTORELEASE(n); } /** * Create a namespace attached to this node. */ - (GSXMLNamespace*) makeNamespaceHref: (NSString*)href prefix: (NSString*)prefix { void *data; data = xmlNewNs((xmlNodePtr)lib, UTF8STRING(href), UTF8STRING(prefix)); if (data == NULL) { NSLog(@"Can't create GSXMLNamespace object"); return nil; } return AUTORELEASE([[GSXMLNamespace alloc] _initFrom: data parent: self]); } /** * Creation of a new process instruction element, * added at the end of parent children list. * * d = [GSXMLDocument documentWithVersion: @"1.0"]; * * [d setRoot: [d makeNodeWithNamespace: nil name: @"plist" content: nil]]; * [[d root] setObject: @"0.9" forKey: @"version"]; * n1 = [[d root] makeChildWithNamespace: nil name: @"dict" content: nil]; * [n1 makeComment: @" this is a comment "]; * [n1 makePI: @"pi1" content: @"this is a process instruction"]; * */ - (GSXMLNode*) makePI: (NSString*)name content: (NSString*)content { GSXMLNode *n = [GSXMLNode alloc]; n = [n _initFrom: xmlAddChild((xmlNodePtr)lib, xmlNewPI(UTF8STRING(name), UTF8STRING(content))) parent: self]; return AUTORELEASE(n); } /** * Return the node-name */ - (NSString*) name { if (lib != NULL && ((xmlNodePtr)lib)->name!=NULL) { return UTF8Str(((xmlNodePtr)lib)->name); } else { return nil; } } /** * Return the next node at this level. This method can return any type * of node, and it may be more convenient to use the -nextElement node * if you are parsing a document where you wish to ignore non-element * nodes such as whitespace text separating elements. */ - (GSXMLNode*) next { if (((xmlNodePtr)(lib))->next != NULL) { GSXMLNode *n = [GSXMLNode alloc]; n = [n _initFrom: ((xmlNodePtr)(lib))->next parent: _parent]; return AUTORELEASE(n); } else { return nil; } } /** * Returns the next element node, skipping past any other node types * (such as text nodes). If there is no element node to be returned, * this method returns nil.
* NB. This method is not available in java, as the method name conflicts * with that of java's Enumerator class. */ - (GSXMLNode*) nextElement { xmlNodePtr ptr = (xmlNodePtr)lib; while (ptr->next != NULL) { ptr = ptr->next; if (ptr->type == XML_ELEMENT_NODE) { GSXMLNode *n = [GSXMLNode alloc]; n = [n _initFrom: ptr parent: _parent]; return AUTORELEASE(n); } } return nil; } /** * Return the namespace of the node. */ - (GSXMLNamespace*) namespace { if (lib != NULL && ((xmlNodePtr)(lib))->ns != NULL) { GSXMLNamespace *ns = [GSXMLNamespace alloc]; ns = [ns _initFrom: ((xmlNodePtr)(lib))->ns parent: self]; return AUTORELEASE(ns); } else { return nil; } } /** * Return namespace definitions for the node */ - (GSXMLNamespace*) namespaceDefinitions { if (lib != NULL && ((xmlNodePtr)lib)->nsDef != NULL) { GSXMLNamespace *ns = [GSXMLNamespace alloc]; ns = [ns _initFrom: ((xmlNodePtr)(lib))->nsDef parent: self]; return AUTORELEASE(ns); } else { return nil; } } /** * Return the attribute value for the specified key. */ - (NSString*) objectForKey: (NSString*)key { NSString *value = nil; const char *str = 0; xmlAttrPtr prop; prop = ((xmlNodePtr)(lib))->properties; while (prop != NULL) { const void *name = prop->name; if (0 == str) { str = [key UTF8String]; } if (strcmp(str, name) == 0) { xmlNodePtr child = prop->children; while (child != NULL) { const void *content = child->content; if (value == nil) { value = UTF8Str(content); } else { value = [value stringByAppendingString: UTF8Str(content)]; } child = child->next; } break; } prop = prop->next; } return value; } /** * Return the parent of this node. */ - (GSXMLNode*) parent { if (((xmlNodePtr)(lib))->parent != NULL) { GSXMLNode *n = [GSXMLNode alloc]; n = [n _initFrom: ((xmlNodePtr)(lib))->parent parent: self]; return AUTORELEASE(n); } else { return nil; } } /** * Return the previous node at this level. */ - (GSXMLNode*) previous { if (((xmlNodePtr)(lib))->prev != NULL) { GSXMLNode *n = [GSXMLNode alloc]; n = [n _initFrom: ((xmlNodePtr)(lib))->prev parent: _parent]; return AUTORELEASE(n); } else { return nil; } } /** * Return the previous element node at this level.
* NB. This method is not available in java, as the method name conflicts * with that of java's Enumerator class. */ - (GSXMLNode*) previousElement { xmlNodePtr ptr = (xmlNodePtr)lib; while (ptr->prev != NULL) { ptr = ptr->prev; if (ptr->type == XML_ELEMENT_NODE) { GSXMLNode *n = [GSXMLNode alloc]; n = [n _initFrom: ptr parent: _parent]; return AUTORELEASE(n); } } return nil; } /** *

* Return attributes and values as a dictionary, but applies * the specified selector to each key before adding the * key and value to the dictionary. The selector must be a * method of NSString taking no arguments and returning an * object suitable for use as a dictionary key. *

*

* This method exists for the use of GSWeb ... it is probably * not of much use elsewhere. *

*/ - (NSMutableDictionary*) propertiesAsDictionaryWithKeyTransformationSel: (SEL)keyTransformSel { xmlAttrPtr prop; NSMutableDictionary *d = [NSMutableDictionary dictionary]; prop = ((xmlNodePtr)(lib))->properties; while (prop != NULL) { xmlNodePtr child = prop->children; const void *name = prop->name; NSString *key = UTF8Str(name); NSString *value = @""; if (keyTransformSel != 0) { key = [key performSelector: keyTransformSel]; } while (child != NULL) { const void *content = child->content; value = [value stringByAppendingString: UTF8Str(content)]; child = child->next; } [d setObject: value forKey: key]; prop = prop->next; } return d; } /** * Set (or reset) an attribute carried by a node. * * [n1 setObject: @"prop1" forKey: @"name1"]; * [n1 setObject: @"prop2" forKey: @"name2"]; * [n1 setObject: @"prop3" forKey: @"name3"]; * */ - (void) setObject: (NSString*)value forKey: (NSString*)key { xmlSetProp(lib, UTF8STRING(key), UTF8STRING(value)); } /** * Return node-type. The most efficient way of testing node types is to * use this method and compare the return value with a value you previously * obtained using the +typeFromDescription: method. */ - (NSInteger) type { return (NSInteger)((xmlNodePtr)(lib))->type; } /** * Return node type as a string. */ - (NSString*) typeDescription { NSString *desc; desc = (NSString*)NSMapGet(nodeNames, (void*)(intptr_t)[self type]); if (desc == nil) { desc = @"Unknown node type"; } return desc; } /** * Sets the namespace of the receiver to the value specified.
* Supplying a nil namespace removes any namespace previously set * or any namespace that the node inherited from a parent when it * was created. */ - (void) setNamespace: (GSXMLNamespace *)space { xmlSetNs (lib, [space lib]); } @end @implementation GSXMLNode (GSPrivate) /** * Initialise from raw libxml data */ - (id) _initFrom: (void*)data parent: (id)p { if (data == NULL) { NSLog(@"%@ - no data for initialization", NSStringFromClass([self class])); DESTROY(self); return nil; } lib = data; ASSIGN(_parent, p); return self; } @end /** *

* The XML parser object is the pivotal part of parsing an XML * document - it will either build a tree representing the * document (if initialized without a GSSAXHandler), or will * cooperate with a GSSAXHandler object to provide parsing * without the overhead of building a tree. *

*

* The parser may be initialized with an input source (in which * case it will expect to be asked to parse the entire input in * a single operation), or without. If it is initialised without * an input source, incremental parsing can be done by feeding * successive parts of the XML document into the parser as * NSData objects. *

*/ @implementation GSXMLParser /* To override location for DTDs */ static NSString *dtdPath = nil; static NSString *endMarker = @"At end of incremental parse"; + (void) initialize { static BOOL beenHere = NO; if (beenHere == NO) { beenHere = YES; if (cacheDone == NO) setupCache(); /* Replace the default external entity loader with our own one which * looks for GNUstep DTDs in the correct location. */ if (NULL == originalLoader) { originalLoader = xmlGetExternalEntityLoader(); xmlSetExternalEntityLoader( (xmlExternalEntityLoader)loadEntityFunction); } } } /** *

* This method controls the loading of external entities into * the system. If it returns an empty string, the entity is not * loaded. If it returns a filename, the entity is loaded from * that file. If it returns nil, the default entity loading * mechanism is used. *

*

* The default entity loading mechanism is to construct a file * name from the locationURL, by replacing all path separators * with underscores, then attempt to locate that file in the DTDs * resource directory of the main bundle, and all the standard * system locations. *

*

* As a special case, the default loader examines the publicID * and if it is a GNUstep DTD, the loader constructs a special * name from the ID (by replacing dots with underscores and * spaces with hyphens) and looks for a file with that name * and a '.dtd' extension in the GNUstep bundles. *

*

* NB. This method will only be called if there is no SAX * handler in use, or if the corresponding method in the * SAX handler returns nil. *

*/ + (NSString*) loadEntity: (NSString*)publicId at: (NSString*)location { return nil; } /** * Creation of a new Parser (for incremental parsing) * by calling -initWithSAXHandler: */ + (GSXMLParser*) parser { return AUTORELEASE([[self alloc] initWithSAXHandler: nil]); } /** * Creation of a new Parser by calling * -initWithSAXHandler:withContentsOfFile: * * GSXMLParser *p = [GSXMLParser parserWithContentsOfFile: @"macos.xml"]; * * if ([p parse]) * { * [[p document] dump]; * } * else * { * printf("error parse file\n"); * } * */ + (GSXMLParser*) parserWithContentsOfFile: (NSString*)path { return AUTORELEASE([[self alloc] initWithSAXHandler: nil withContentsOfFile: path]); } /** * Creation of a new Parser by calling * -initWithSAXHandler:withContentsOfURL: */ + (GSXMLParser*) parserWithContentsOfURL: (NSURL*)url { return AUTORELEASE([[self alloc] initWithSAXHandler: nil withContentsOfURL: url]); } /** * Creation of a new Parser by calling * -initWithSAXHandler:withData: */ + (GSXMLParser*) parserWithData: (NSData*)data { return AUTORELEASE([[self alloc] initWithSAXHandler: nil withData: data]); } /** *

* Creation of a new Parser by calling -initWithSAXHandler: *

*

* If the handler object supplied is nil, the parser will build * a tree representing the parsed file rather than attempting * to get the handler to deal with the parsed elements and entities. *

*/ + (GSXMLParser*) parserWithSAXHandler: (GSSAXHandler*)handler { return AUTORELEASE([[self alloc] initWithSAXHandler: handler]); } /** * Creation of a new Parser by calling * -initWithSAXHandler:withContentsOfFile: * * NSAutoreleasePool *arp = [NSAutoreleasePool new]; * GSSAXHandler *h = [GSDebugSAXHandler handler]; * GSXMLParser *p = [GSXMLParser parserWithSAXHandler: h * withContentsOfFile: @"macos.xml"]; * if ([p parse]) * { * printf("ok\n"); * } * RELEASE(arp); * */ + (GSXMLParser*) parserWithSAXHandler: (GSSAXHandler*)handler withContentsOfFile: (NSString*)path { return AUTORELEASE([[self alloc] initWithSAXHandler: handler withContentsOfFile: path]); } /** * Creation of a new Parser by calling * -initWithSAXHandler:withContentsOfURL: */ + (GSXMLParser*) parserWithSAXHandler: (GSSAXHandler*)handler withContentsOfURL: (NSURL*)url { return AUTORELEASE([[self alloc] initWithSAXHandler: handler withContentsOfURL: url]); } /** * Creation of a new Parser by calling * -initWithSAXHandler:withData: */ + (GSXMLParser*) parserWithSAXHandler: (GSSAXHandler*)handler withData: (NSData*)data { return AUTORELEASE([[self alloc] initWithSAXHandler: handler withData: data]); } /** Sets a directory in which to look for DTDs when resolving external * references. Can be used whjen DTDs have not been installed in the * normal locatioons. */ + (void) setDTDs: (NSString*)aPath { ASSIGNCOPY(dtdPath, aPath); } /** * Return the name of the string encoding (for XML) to use for the * specified OpenStep encoding. */ + (NSString*) xmlEncodingStringForStringEncoding: (NSStringEncoding)encoding { NSString *xmlEncodingString = nil; switch (encoding) { case NSUnicodeStringEncoding: NSLog(@"NSUnicodeStringEncoding not supported for XML");//?? break; case NSNEXTSTEPStringEncoding: NSLog(@"NSNEXTSTEPStringEncoding not supported for XML");//?? break; case NSJapaneseEUCStringEncoding: xmlEncodingString = @"EUC-JP"; break; case NSShiftJISStringEncoding: xmlEncodingString = @"Shift-JIS"; break; case NSISO2022JPStringEncoding: xmlEncodingString = @"ISO-2022-JP"; break; case NSUTF8StringEncoding: xmlEncodingString = @"UTF-8"; break; case NSWindowsCP1251StringEncoding: NSLog(@"NSWindowsCP1251StringEncoding not supported for XML");//?? break; case NSWindowsCP1252StringEncoding: NSLog(@"NSWindowsCP1252StringEncoding not supported for XML");//?? break; case NSWindowsCP1253StringEncoding: NSLog(@"NSWindowsCP1253StringEncoding not supported for XML");//?? break; case NSWindowsCP1254StringEncoding: NSLog(@"NSWindowsCP1254StringEncoding not supported for XML");//?? break; case NSWindowsCP1250StringEncoding: NSLog(@"NSWindowsCP1250StringEncoding not supported for XML");//?? break; case NSISOLatin1StringEncoding: xmlEncodingString = @"ISO-8859-1"; break; case NSISOLatin2StringEncoding: xmlEncodingString = @"ISO-8859-2"; break; case NSSymbolStringEncoding: NSLog(@"NSSymbolStringEncoding not supported for XML");//?? break; default: NSLog(@"Encoding not supported for XML");//?? xmlEncodingString = nil; break; } return xmlEncodingString; } /** * If called by a SAX callback routine, this method will terminate * the parsiong process. */ - (void) abortParsing { if (lib != NULL) { xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr)lib; // Stop SAX callbacks ctxt->disableSAX = 1; // Stop incoming data being parsed. ctxt->instate = XML_PARSER_EOF; // Pretend we are at end of file (nul byte). if (ctxt->input != NULL) ctxt->input->cur = (const unsigned char*)""; } } /** * If executed during a parse operation, returns the current column number. */ - (NSInteger) columnNumber { return xmlSAX2GetColumnNumber(lib); } - (void) dealloc { RELEASE(messages); RELEASE(src); RELEASE(saxHandler); if (lib != NULL) { xmlFreeDoc(((xmlParserCtxtPtr)lib)->myDoc); xmlFreeParserCtxt(lib); } [super dealloc]; } /** * Sets whether the document needs to be validated. */ - (BOOL) doValidityChecking: (BOOL)yesno { BOOL old; old = (((xmlParserCtxtPtr)lib)->validate) ? YES : NO; ((xmlParserCtxtPtr)lib)->validate = (yesno ? 1 : 0); return old; } /** * Return the document produced as a result of parsing data. */ - (GSXMLDocument*) document { GSXMLDocument *d = [GSXMLDocument alloc]; d = [d _initFrom: ((xmlParserCtxtPtr)lib)->myDoc parent: self ownsLib: NO]; return AUTORELEASE(d); } /** * Return error code for last parse operation. */ - (NSInteger) errNo { return ((xmlParserCtxtPtr)lib)->errNo; } /** * Sets whether warnings are generated. */ - (BOOL) getWarnings: (BOOL)yesno { BOOL old = (((xmlParserCtxtPtr)lib)->vctxt.warning) ? YES : NO; if (yesno == YES) { ((xmlParserCtxtPtr)lib)->vctxt.warning = xmlParserValidityWarning; } else { ((xmlParserCtxtPtr)lib)->vctxt.warning = 0; } return old; } /** * Initialises by calling -initWithSAXHandler: with a nil argument. */ - (id) init { return [self initWithSAXHandler: nil]; } /** *

* Initialisation of a new Parser with SAX handler. *

*

* If the handler object supplied is nil, the parser will use * an instance of [GSTreeSAXHandler] to build a tree representing * the parsed file. This tree will then be available (via the -document * method) as a [GSXMLDocument] on completion of parsing. *

*

* The source for the parsing process is not specified - so * parsing must be done incrementally by feeding data to the * parser. *

*/ - (id) initWithSAXHandler: (GSSAXHandler*)handler { if (handler == nil) { saxHandler = [GSTreeSAXHandler new]; } else if ([handler isKindOfClass: [GSSAXHandler class]] == YES) { saxHandler = RETAIN(handler); } else { NSLog(@"Bad GSSAXHandler object passed to GSXMLParser initialiser"); DESTROY(self); return nil; } [saxHandler _setParser: self]; if ([self _initLibXML] == NO) { DESTROY(self); return nil; } return self; } /** *

* Initialisation of a new Parser with SAX handler (if not nil) * by calling -initWithSAXHandler: *

*

* Sets the input source for the parser to be the specified file - * so parsing of the entire file will be performed rather than * incremental parsing. *

*/ - (id) initWithSAXHandler: (GSSAXHandler*)handler withContentsOfFile: (NSString*)path { if (path == nil || [path isKindOfClass: NSString_class] == NO) { NSLog(@"Bad file path passed to initialize GSXMLParser"); DESTROY(self); return nil; } src = [path copy]; self = [self initWithSAXHandler: handler]; return self; } /** *

* Initialisation of a new Parser with SAX handler (if not nil) * by calling -initWithSAXHandler: *

*

* Sets the input source for the parser to be the specified URL - * so parsing of the entire document will be performed rather than * incremental parsing. *

*/ - (id) initWithSAXHandler: (GSSAXHandler*)handler withContentsOfURL: (NSURL*)url { if (url == nil || [url isKindOfClass: [NSURL class]] == NO) { NSLog(@"Bad NSURL passed to initialize GSXMLParser"); DESTROY(self); return nil; } src = [url copy]; self = [self initWithSAXHandler: handler]; return self; } /** *

* Initialisation of a new Parser with SAX handler (if not nil) * by calling -initWithSAXHandler: *

*

* Sets the input source for the parser to be the specified data * object (which must contain an XML document), so parsing of the * entire document will be performed rather than incremental parsing. *

*/ - (id) initWithSAXHandler: (GSSAXHandler*)handler withData: (NSData*)data { if (nil == data) { NSLog(@"Nil NSData passed to initialize GSXMLParser"); DESTROY(self); return nil; } if ([data isKindOfClass: [NSData class]] == NO) { NSLog(@"Non NSData passed to initialize GSXMLParser; %@", data); DESTROY(self); return nil; } src = [data copy]; self = [self initWithSAXHandler: handler]; return self; } /** *

* Initialisation of a new Parser with SAX handler (if not nil) * by calling -initWithSAXHandler: *

*

* Sets the input source for the parser to be the specified input stream, * so parsing of the entire document will be performed rather than * incremental parsing. *

*/ - (id) initWithSAXHandler: (GSSAXHandler*)handler withInputStream: (NSInputStream*)stream { if (stream == nil || [stream isKindOfClass: [NSInputStream class]] == NO) { NSLog(@"Bad NSInputStream passed to initialize GSXMLParser"); DESTROY(self); return nil; } src = RETAIN(stream); self = [self initWithSAXHandler: handler]; return self; } /** * Set and return the previous value for blank text nodes support. * ignorableWhitespace nodes are only generated when running * the parser in validating mode and when the current element * doesn't allow CDATA or mixed content. */ - (BOOL) keepBlanks: (BOOL)yesno { BOOL old; old = (((xmlParserCtxtPtr)lib)->keepBlanks) ? YES : NO; ((xmlParserCtxtPtr)lib)->keepBlanks = (yesno ? 1 : 0); return old; } /** * If executed during a parse operation, returns the current line number. */ - (NSInteger) lineNumber { return xmlSAX2GetLineNumber(lib); } /** * Returns the string into which warning and error messages are saved, * or nil if they are being written to stderr. */ - (NSString*) messages { return messages; } /** * Parse source. Return YES if parsed as valid, otherwise NO. * If validation against a DTD is not enabled, the return value simply * indicates whether the xml was well formed.
* This method should be called once to parse the entire document. * * GSXMLParser *p = [GSXMLParser parserWithContentsOfFile:@"macos.xml"]; * * if ([p parse]) * { * [[p doc] dump]; * } * else * { * printf("error parse file\n"); * } * */ - (BOOL) parse { id tmp; if (src == endMarker) { NSLog(@"GSXMLParser -parse called on object that is already parsed"); return NO; } if (src == nil) { NSLog(@"GSXMLParser -parse called on object with no source"); return NO; } if ([src isKindOfClass: [NSData class]] || [src isKindOfClass: [NSInputStream class]]) { } else if ([src isKindOfClass: NSString_class]) { NSData *data = [NSData dataWithContentsOfFile: src]; if (data == nil) { NSLog(@"File to parse (%@) is not readable", src); return NO; } ASSIGN(src, data); } else if ([src isKindOfClass: [NSURL class]]) { NSData *data = [src resourceDataUsingCache: YES]; if (data == nil) { NSLog(@"URL to parse (%@) is not readable", src); return NO; } ASSIGN(src, data); } else { NSLog(@"Source for [-parse] must be NSString, NSData, NSInputStream, or" @" NSURL type"); return NO; } tmp = RETAIN(src); ASSIGN(src, endMarker); if ([tmp isKindOfClass: [NSInputStream class]]) { xmlParseDocument(lib); } else { [self _parseChunk: tmp]; [self _parseChunk: nil]; } RELEASE(tmp); if (((xmlParserCtxtPtr)lib)->wellFormed != 0 && (0 == ((xmlParserCtxtPtr)lib)->validate || ((xmlParserCtxtPtr)lib)->valid != 0)) { return YES; } return NO; } /** *

* Pass data to the parser for incremental parsing. This method * should be called many times, with each call passing another * block of data from the same document. After the whole of the * document has been parsed, the method should be called with * an empty or nil data object to indicate end of parsing. * On this final call, the return value indicates whether the * document was valid or not. If validation to a DTD is not enabled, * the return value simply indicates whether the xml was well formed. *

* * GSXMLParser *p = [GSXMLParser parserWithSAXHandler: nil source: nil]; * * while ((data = getMoreData()) != nil) * { * if ([p parse: data] == NO) * { * NSLog(@"parse error"); * } * } * // Do something with document parsed * [p parse: nil]; // Completed parsing of document. * */ - (BOOL) parse: (NSData*)data { if (src == endMarker) { NSLog(@"GSXMLParser -parse: called on object that is fully parsed"); return NO; } if (src != nil) { NSLog(@"XMLParser -parse: called for parser not initialised with nil"); return NO; } if (data == nil || [data length] == 0) { /* * At end of incremental parse. */ if (lib != NULL) { [self _parseChunk: nil]; src = endMarker; if (((xmlParserCtxtPtr)lib)->wellFormed != 0 && (0 == ((xmlParserCtxtPtr)lib)->validate || ((xmlParserCtxtPtr)lib)->valid != 0)) { return YES; } return NO; } else { NSLog(@"GSXMLParser -parse: terminated with no data"); return NO; } } else { [self _parseChunk: data]; return YES; } } /** * Return the public ID of the document being parsed. */ - (NSString*) publicID { return UTF8Str(xmlSAX2GetPublicId(lib)); } /** * Sets up (or removes) a mutable string to which error and warning * messages are saved. Using an argument of NO will cause these messages * to be written to stderr (the default).
* NB. A SAX handler which overrides the error and warning logging * messages may stop this mechanism operating. */ - (void) saveMessages: (BOOL)yesno { if (yesno == YES) { ASSIGN(messages, [NSMutableString stringWithCapacity: 256]); } else { DESTROY(messages); } } - (BOOL) resolveEntities: (BOOL)yesno { BOOL old; if (yesno) yesno = YES; if ((((xmlParserCtxtPtr)lib)->sax)->getEntity == (void*)getEntityIgnoreExternal) { old = NO; } else { old = YES; } if (YES == yesno) { (((xmlParserCtxtPtr)lib)->sax)->getEntity = (void*)getEntityResolveExternal; } else { (((xmlParserCtxtPtr)lib)->sax)->getEntity = (void*)getEntityIgnoreExternal; } return old; } /** * Set and return the previous value for entity support. * Initially the parser always keeps entity references instead * of substituting entity values in the output. */ - (BOOL) substituteEntities: (BOOL)yesno { BOOL old; if (yesno) yesno = YES; old = (((xmlParserCtxtPtr)lib)->replaceEntities) ? YES : NO; if (old != yesno) { ((xmlParserCtxtPtr)lib)->replaceEntities = (yesno ? 1 : 0); } return old; } /** * Return the system ID of the document being parsed. */ - (NSString*) systemID { return UTF8Str(xmlSAX2GetSystemId(lib)); } /* * Private methods - internal use only. */ - (BOOL) _initLibXML { const char *file; if ([src isKindOfClass: NSString_class]) { file = [src lossyCString]; } else if ([src isKindOfClass: [NSURL class]]) { file = [[src absoluteString] lossyCString]; } else { file = "."; } if ([src isKindOfClass: [NSInputStream class]]) { [(NSInputStream*)src open]; lib = (void*)xmlCreateIOParserCtxt([saxHandler lib], NULL, xmlNSInputStreamReadCallback, xmlNSInputStreamCloseCallback, (void*)src, XML_CHAR_ENCODING_NONE); } else { lib = (void*)xmlCreatePushParserCtxt([saxHandler lib], NULL, 0, 0, file); } if (lib == NULL) { NSLog(@"Failed to create libxml parser context"); return NO; } else { /* * Put saxHandler address in _private member, so we can retrieve * the GSSAXHandler to use in our SAX C Functions. */ ((xmlParserCtxtPtr)lib)->_private = saxHandler; /* * Set the entity loading function for this parser to be our one. */ ((xmlParserCtxtPtr)lib)->sax->resolveEntity = resolveEntityFunction; } return YES; } - (NSMutableString*) _messages { return messages; } // nil data allowed - (void) _parseChunk: (NSData*)data { if (lib == NULL || ((xmlParserCtxtPtr)lib)->disableSAX != 0) { return; // Parsing impossible or disabled. } xmlParseChunk(lib, [data bytes], [data length], data == nil); } @end /** * The GSHTMLParser class is a simple subclass of GSXMLParser which should * parse reasonably well formed HTML documents. If you wish to parse XHTML * documents, you should use GSXMLParser ... the GSHTMLParser class is for * older 'legacy' documents. */ @implementation GSHTMLParser - (BOOL) _initLibXML { lib = (void*)htmlCreatePushParserCtxt([saxHandler lib], NULL, 0, 0, ".", XML_CHAR_ENCODING_NONE); if (lib == NULL) { NSLog(@"Failed to create libxml parser context"); return NO; } else { /* * Put saxHandler address in _private member, so we can retrieve * the GSSAXHandler to use in our SAX C Functions. */ ((htmlParserCtxtPtr)lib)->_private = saxHandler; } return YES; } - (void) _parseChunk: (NSData*)data { htmlParseChunk(lib, [data bytes], [data length], data == nil); } @end /** *

XML SAX Handler.

*

* GSSAXHandler is a callback-based interface to the [GSXMLParser] * which operates in a similar (though not identical) manner to * SAX. *

*

* Each GSSAXHandler object is associated with a GSXMLParser * object. As parsing progresses, the methods of the GSSAXHandler * are invoked by the parser, so the handler is able to deal * with the elements and entities being parsed. *

*

* The callback methods in the GSSAXHandler class do nothing - it * is intended that you subclass GSSAXHandler and override them. *

*

* If you create a GSXMLParser passing nil as the GSSAXHandler, * the parser will parse data to create a [GSXMLDocument] instance * which you can then examine as a whole ... this is generally the * preferred mechanism for parsing as it permits the parser to * validate the parsed document againts a DTD, and your software * can then examine the document secure in the knowledge that it * contains the expected structure. Use of a GSSAXHandler is * preferred for very large documents with simple structure ... * in which case incremental parsing is more efficient. *

*/ @implementation GSSAXHandler + (void) initialize { static BOOL beenHere = NO; if (beenHere == NO) { beenHere = YES; if (cacheDone == NO) { setupCache(); } /* Replace the default external entity loader with our own one which * looks for GNUstep DTDs in the correct location. */ if (NULL == originalLoader) { originalLoader = xmlGetExternalEntityLoader(); xmlSetExternalEntityLoader( (xmlExternalEntityLoader)loadEntityFunction); } } } /* * The context is a xmlParserCtxtPtr or htmlParserCtxtPtr. * Its _private member contains the address of our Sax Handler Object. * We can use a (xmlParserCtxtPtr) cast because xmlParserCtxt and * htmlParserCtxt are the same structure (and will remain, cf libxml author). */ #define HANDLER ((GSSAXHandler*)(((xmlParserCtxtPtr)ctx)->_private)) static xmlEntityPtr getEntityDefault(void *ctx, const xmlChar *name, BOOL resolve) { xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; xmlEntityPtr ret = NULL; if (ctx != 0) { if (0 == ctxt->inSubset) { if ((ret = xmlGetPredefinedEntity(name)) != NULL) { return ret; } } if ((ctxt->myDoc != NULL) && (1 == ctxt->myDoc->standalone)) { if (2 == ctxt->inSubset) { ctxt->myDoc->standalone = 0; ret = xmlGetDocEntity(ctxt->myDoc, name); ctxt->myDoc->standalone = 1; } else { ret = xmlGetDocEntity(ctxt->myDoc, name); if (NULL == ret) { ctxt->myDoc->standalone = 0; ret = xmlGetDocEntity(ctxt->myDoc, name); if (ret != NULL) { ((((xmlParserCtxtPtr)ctxt)->sax)->fatalError)(ctxt, "Entity(%s) document marked standalone" " but requires external subset", name); xmlStopParser(ctxt); } ctxt->myDoc->standalone = 1; } } } else { ret = xmlGetDocEntity(ctxt->myDoc, name); } if ((ret != NULL) && ((ctxt->validate) || (ctxt->replaceEntities)) && (ret->children == NULL) && (ret->etype == XML_EXTERNAL_GENERAL_PARSED_ENTITY)) { if (YES == resolve) { xmlNodePtr children; int val; /* * for validation purposes we really need to fetch and * parse the external entity */ val = xmlParseCtxtExternalEntity(ctxt, ret->URI, ret->ExternalID, &children); if (val == 0) { xmlAddChildList((xmlNodePtr) ret, children); } else { ((((xmlParserCtxtPtr)ctxt)->sax)->fatalError)(ctxt, "Failure to process entity %s\n", name); xmlStopParser(ctxt); ctxt->validate = 0; return NULL; } ret->owner = 1; if (ret->checked == 0) { ret->checked = 1; } } } } return ret; } static xmlEntityPtr getEntityIgnoreExternal(void *ctx, const xmlChar *name) { return getEntityDefault(ctx, name, NO); } static xmlEntityPtr getEntityResolveExternal(void *ctx, const xmlChar *name) { return getEntityDefault(ctx, name, YES); } /* WARNING ... as far as I can tell libxml2 never uses the resolveEntity * callback, so this function is never called via that route. * We therefore also set this as the global default entity loading * function (in [GSXMLParser+initialize] and [GSSAXHandler+initialize]). * * To implement the -resolveEntities method we must permit/deny any attempt * to load an entity (before the function to resolve is even called), * We therefore intercept the getEntity callback (using getEntityDefault()), * re-implementing some of the code inside libxml2 to avoid attempts to * load/parse external entities unless we have specifically enabled it. */ static xmlParserInputPtr loadEntityFunction(const unsigned char *url, const unsigned char *eid, void *ctx) { NSString *file = nil; NSString *entityId; NSString *location; NSArray *components; NSMutableString *local; unsigned count; unsigned index; NSCAssert(ctx, @"No Context"); if (url == NULL) return NULL; entityId = (eid != NULL) ? (id)UTF8Str(eid) : nil; location = UTF8Str(url); components = [location pathComponents]; local = (NSMutableString *) [NSMutableString string]; /* * Build a local filename by replacing path separator characters with * something else. */ count = [components count]; if (count > 0) { count--; for (index = 0; index < count; index++) { [local appendString: [components objectAtIndex: index]]; [local appendString: @"_"]; } [local appendString: [components objectAtIndex: index]]; } /* Also replace ':' which isn't legal on some file systems */ [local replaceOccurrencesOfString: @":" withString: @"+" options: NSLiteralSearch range: NSMakeRange(0, [local length])]; if ([location rangeOfString: @"/DTDs/PropertyList"].length > 0) { file = [location substringFromIndex: 6]; if ([[NSFileManager defaultManager] fileExistsAtPath: file] == NO) { location = [NSBundle pathForLibraryResource: @"plist-0_9" ofType: @"dtd" inDirectory: @"DTDs"]; entityId = @"-//GNUstep//DTD plist 0.9//EN"; file = nil; } } if (file == nil && ((xmlParserCtxtPtr)ctx)->_private != NULL) { /* * Now ask the SAXHandler callback for the name of a local file */ file = [HANDLER loadEntity: entityId at: location]; if (file == nil) { file = [GSXMLParser loadEntity: entityId at: location]; } } if (file == nil) { /* * Special case - GNUstep DTDs - should be installed in the GNUstep * system bundle - so we look for them there. */ if ([entityId hasPrefix: @"-//GNUstep//DTD "] == YES) { NSCharacterSet *ws = [NSCharacterSet whitespaceCharacterSet]; NSString *found = nil; NSMutableString *name; unsigned len; NSRange r; /* * Extract the relevent DTD name */ name = AUTORELEASE([entityId mutableCopy]); r = NSMakeRange(0, 16); [name deleteCharactersInRange: r]; len = [name length]; r = [name rangeOfString: @"/" options: NSLiteralSearch]; if (r.length > 0) { r.length = len - r.location; [name deleteCharactersInRange: r]; len = [name length]; } /* * Convert dots to underscores. */ r = [name rangeOfString: @"." options: NSLiteralSearch]; while (r.length > 0) { [name replaceCharactersInRange: r withString: @"_"]; r.location++; r.length = len - r.location; r = [name rangeOfString: @"." options: NSLiteralSearch range: r]; } /* * Convert whitespace to hyphens. */ r = [name rangeOfCharacterFromSet: ws options: NSLiteralSearch]; while (r.length > 0) { [name replaceCharactersInRange: r withString: @"-"]; r.location++; r.length = len - r.location; r = [name rangeOfCharacterFromSet: ws options: NSLiteralSearch range: r]; } if (dtdPath != nil) { found = [dtdPath stringByAppendingPathComponent: name]; found = [found stringByAppendingPathExtension: @"dtd"]; if (![[NSFileManager defaultManager] fileExistsAtPath: found]) { found = nil; } } if (found == nil) { #ifndef NeXT_Foundation_LIBRARY found = [NSBundle pathForLibraryResource: name ofType: @"dtd" inDirectory: @"DTDs"]; #else found = [[NSBundle bundleForClass: [GSXMLNode class]] pathForResource: name ofType: @"dtd" inDirectory: @"DTDs"]; #endif } if (found == nil) { NSLog(@"unable to find GNUstep DTD - '%@' for '%s'", name, eid); } else { file = found; } } /* * DTD not found - so we look for it in standard locations. */ if (file == nil) { if (dtdPath != nil) { file = [dtdPath stringByAppendingPathComponent: local]; if (![[NSFileManager defaultManager] fileExistsAtPath: local]) { file = nil; } } if (file == nil) { file = [[NSBundle mainBundle] pathForResource: local ofType: @"" inDirectory: @"DTDs"]; } if (file == nil) { #ifndef NeXT_Foundation_LIBRARY file = [NSBundle pathForLibraryResource: local ofType: @"" inDirectory: @"DTDs"]; #else file = [[NSBundle bundleForClass: [GSXMLNode class]] pathForResource: local ofType: @"" inDirectory: @"DTDs"]; #endif } } } /* * If we found the DTD somewhere, add it to the catalog. */ if ([file length] > 0) { NSURL *theURL = [NSURL fileURLWithPath: file]; xmlCatalogAdd((const unsigned char*)"public", eid, UTF8STRING([theURL absoluteString])); } /* A local DTD will now be in the catalog: The builtin entity resolver can * take over. */ return (*originalLoader)((const char*)url, (const char*)eid, ctx); } static xmlParserInputPtr resolveEntityFunction(void *ctx, const unsigned char *eid, const unsigned char *url) { return loadEntityFunction(url, eid, ctx); } #define TREEFUN(NAME,ARGS) ((HANDLER->isHtmlHandler == YES) ? (*(htmlDefaultSAXHandler.NAME))ARGS : (*(xmlDefaultSAXHandler.NAME))ARGS) #define START(SELNAME, RET, ARGS) \ static SEL sel; \ static RET (*treeImp)ARGS = 0; \ RET (*imp)ARGS; \ \ NSCAssert(ctx,@"No Context"); \ \ if (treeImp == 0) \ { \ sel = @selector(SELNAME); \ treeImp = (RET (*)ARGS)[GSTreeSAXHandler instanceMethodForSelector: sel];\ } \ imp = (RET (*)ARGS)[HANDLER methodForSelector: sel] static void startDocumentFunction(void *ctx) { NSCAssert(ctx,@"No Context"); [HANDLER startDocument]; } static void endDocumentFunction(void *ctx) { NSCAssert(ctx,@"No Context"); [HANDLER endDocument]; } static int isStandaloneFunction(void *ctx) { NSCAssert(ctx,@"No Context"); return [HANDLER isStandalone]; } static int hasInternalSubsetFunction(void *ctx) { int has; NSCAssert(ctx,@"No Context"); has = [HANDLER hasInternalSubset]; if (has < 0) { has = TREEFUN(hasInternalSubset, (ctx)); } return has; } static int hasExternalSubsetFunction(void *ctx) { int has; NSCAssert(ctx,@"No Context"); has = [HANDLER hasExternalSubset]; if (has < 0) { has = TREEFUN(hasExternalSubset, (ctx)); } return has; } static void internalSubsetFunction(void *ctx, const unsigned char *name, const xmlChar *ExternalID, const xmlChar *SystemID) { NSCAssert(ctx,@"No Context"); [HANDLER internalSubset: UTF8Str(name) externalID: UTF8Str(ExternalID) systemID: UTF8Str(SystemID)]; } static void externalSubsetFunction(void *ctx, const unsigned char *name, const xmlChar *ExternalID, const xmlChar *SystemID) { NSCAssert(ctx,@"No Context"); [HANDLER externalSubset: UTF8Str(name) externalID: UTF8Str(ExternalID) systemID: UTF8Str(SystemID)]; } static xmlEntityPtr getEntityFunction(void *ctx, const unsigned char *name) { NSCAssert(ctx,@"No Context"); return [HANDLER getEntity: UTF8Str(name)]; } static xmlEntityPtr getParameterEntityFunction(void *ctx, const unsigned char *name) { NSCAssert(ctx,@"No Context"); return [HANDLER getParameterEntity: UTF8Str(name)]; } static void entityDeclFunction(void *ctx, const unsigned char *name, int type, const unsigned char *publicId, const unsigned char *systemId, unsigned char *content) { NSCAssert(ctx,@"No Context"); [HANDLER entityDecl: UTF8Str(name) type: type public: UTF8Str(publicId) system: UTF8Str(systemId) content: UTF8Str(content)]; } static void attributeDeclFunction(void *ctx, const unsigned char *elem, const unsigned char *name, int type, int def, const unsigned char *defaultValue, xmlEnumerationPtr tree) { NSCAssert(ctx,@"No Context"); [HANDLER attributeDecl: UTF8Str(elem) name: UTF8Str(name) type: type typeDefValue: def defaultValue: UTF8Str(defaultValue)]; } static void elementDeclFunction(void *ctx, const unsigned char *name, int type, xmlElementContentPtr content) { NSCAssert(ctx,@"No Context"); [HANDLER elementDecl: UTF8Str(name) type: type]; } static void notationDeclFunction(void *ctx, const unsigned char *name, const unsigned char *publicId, const unsigned char *systemId) { NSCAssert(ctx,@"No Context"); [HANDLER notationDecl: UTF8Str(name) public: UTF8Str(publicId) system: UTF8Str(systemId)]; } static void unparsedEntityDeclFunction(void *ctx, const unsigned char *name, const unsigned char *publicId, const unsigned char *systemId, const unsigned char *notationName) { NSCAssert(ctx,@"No Context"); [HANDLER unparsedEntityDecl: UTF8Str(name) public: UTF8Str(publicId) system: UTF8Str(systemId) notationName: UTF8Str(notationName)]; } static void startElementFunction(void *ctx, const unsigned char *name, const unsigned char **atts) { NSMutableDictionary *dict; NSCAssert(ctx,@"No Context"); dict = [NSMutableDictionary dictionary]; if (atts != NULL) { int i = 0; while (atts[i] != NULL) { NSString *key = UTF8Str(atts[i++]); NSString *obj; const unsigned char *val = atts[i++]; if (0 == val) { /* No value ... assume tis is a minimised attribute in html. */ obj = key; } else { obj = UTF8Str(val); } [dict setObject: obj forKey: key]; } } [HANDLER startElement: UTF8Str(name) attributes: dict]; } static void endElementFunction(void *ctx, const unsigned char *name) { [HANDLER endElement: UTF8Str(name)]; } static void startElementNsFunction(void *ctx, const unsigned char *name, const unsigned char *prefix, const unsigned char *href, int nb_namespaces, const unsigned char **namespaces, int nb_attributes, int nb_defaulted, const unsigned char **atts) { NSMutableDictionary *adict = nil; NSMutableDictionary *ndict = nil; NSString *elem; NSCAssert(ctx,@"No Context"); elem = UTF8Str(name); if (atts != NULL) { int i; int j; adict = [NSMutableDictionary dictionaryWithCapacity: nb_attributes]; for (i = j = 0; i < nb_attributes; i++, j += 5) { NSString *key = UTF8Str(atts[j]); NSString *obj = nil; // We need to append the namespace prefix if (atts[j+1] != NULL) { key = [[UTF8Str(atts[j+1]) stringByAppendingString: @":"] stringByAppendingString: key]; } obj = UTF8StrLen(atts[j+3], atts[j+4]-atts[j+3]); [adict setObject: obj forKey: key]; } } if (nb_namespaces > 0) { int i; int pos = 0; ndict = [NSMutableDictionary dictionaryWithCapacity: nb_namespaces]; for (i = 0; i < nb_namespaces; i++) { NSString *key; NSString *obj; if (namespaces[pos] == 0) { key = @""; } else { key = UTF8Str(namespaces[pos]); } pos++; if (namespaces[pos] == 0) { obj = @""; } else { obj = UTF8Str(namespaces[pos]); } pos++; [ndict setObject: obj forKey: key]; } } [HANDLER startElement: elem prefix: UTF8Str(prefix) href: UTF8Str(href) attributes: adict namespaces: ndict]; } static void endElementNsFunction(void *ctx, const unsigned char *name, const unsigned char *prefix, const unsigned char *href) { NSCAssert(ctx,@"No Context"); [HANDLER endElement: UTF8Str(name) prefix: UTF8Str(prefix) href: UTF8Str(href)]; } static void charactersFunction(void *ctx, const unsigned char *ch, int len) { NSCAssert(ctx,@"No Context"); [HANDLER characters: UTF8StrLen(ch, len)]; } static void referenceFunction(void *ctx, const unsigned char *name) { NSCAssert(ctx,@"No Context"); [HANDLER reference: UTF8Str(name)]; } static void ignorableWhitespaceFunction(void *ctx, const unsigned char *ch, int len) { NSCAssert(ctx,@"No Context"); [HANDLER ignoreWhitespace: UTF8StrLen(ch, len)]; } static void processingInstructionFunction(void *ctx, const unsigned char *target, const char *data) { NSCAssert(ctx,@"No Context"); [HANDLER processInstruction: UTF8Str(target) data: UTF8Str((const unsigned char*)data)]; } static void cdataBlockFunction(void *ctx, const unsigned char *value, int len) { NSCAssert(ctx,@"No Context"); [HANDLER cdataBlock: [NSData dataWithBytes: value length: len]]; } static void commentFunction(void *ctx, const unsigned char *value) { NSCAssert(ctx,@"No Context"); [HANDLER comment: UTF8Str(value)]; } static void warningFunction(void *ctx, const unsigned char *msg, ...) { NSString *estr; va_list args; int lineNumber = -1; int colNumber = -1; va_start(args, msg); estr = [[[NSString alloc] initWithFormat: UTF8Str(msg) arguments: args] autorelease]; va_end(args); NSCAssert(ctx,@"No Context"); lineNumber = xmlSAX2GetLineNumber(ctx); colNumber = xmlSAX2GetColumnNumber(ctx); [HANDLER warning: estr colNumber: colNumber lineNumber: lineNumber]; } static void errorFunction(void *ctx, const unsigned char *msg, ...) { NSString *estr; va_list args; int lineNumber = -1; int colNumber = -1; va_start(args, msg); estr = [[[NSString alloc] initWithFormat: UTF8Str(msg) arguments: args] autorelease]; va_end(args); NSCAssert(ctx,@"No Context"); lineNumber = xmlSAX2GetLineNumber(ctx); colNumber = xmlSAX2GetColumnNumber(ctx); [HANDLER error: estr colNumber: colNumber lineNumber: lineNumber]; } static void fatalErrorFunction(void *ctx, const unsigned char *msg, ...) { NSString *estr; va_list args; int lineNumber = -1; int colNumber = -1; va_start(args, msg); estr = [[[NSString alloc] initWithFormat: UTF8Str(msg) arguments: args] autorelease]; va_end(args); NSCAssert(ctx, @"No Context"); lineNumber = xmlSAX2GetLineNumber(ctx); colNumber = xmlSAX2GetColumnNumber(ctx); [HANDLER fatalError: estr colNumber: colNumber lineNumber: lineNumber]; } #undef HANDLER /** * Create a new SAX handler. */ + (GSSAXHandler*) handler { return AUTORELEASE([[self alloc] init]); } - (id) init { NSAssert(lib == 0, @"Already created lib"); self = [super init]; if (self != nil) { if ([self _initLibXML] == NO) { NSLog(@"GSSAXHandler: out of memory\n"); DESTROY(self); return nil; } } return self; } /** * Returns a pointer to the raw libxml data used by this document.
* Only for use by libxml experts! */ - (void*) lib { return lib; } /** * Return the parser object with which this handler is * associated. This may occasionally be useful. */ - (GSXMLParser*) parser { return parser; } - (void) dealloc { if (lib != NULL) { free(lib); } [super dealloc]; } /** * Called when the document starts being processed. */ - (void) startDocument { } /** * Called when the document end has been detected. */ - (void) endDocument { } /** * Called to detemrine if the document is standalone. */ - (NSInteger) isStandalone { return 1; } /** * Called when an opening tag has been processed. */ - (void) startElement: (NSString*)elementName attributes: (NSMutableDictionary*)elementAttributes { } - (void) startElement: (NSString*)elementName prefix: (NSString*)prefix href: (NSString*)href attributes: (NSMutableDictionary*)elementAttributes { [self startElement: elementName attributes: elementAttributes]; } - (void) startElement: (NSString*)elementName prefix: (NSString*)prefix href: (NSString*)href attributes: (NSMutableDictionary*)elementAttributes namespaces: (NSMutableDictionary*)elementNamespaces { [self startElement: elementName prefix: prefix href: href attributes: elementAttributes]; } /** * Called when a closing tag has been processed. */ - (void) endElement: (NSString*)elementName { } /** * Called when a closing tag has been processed. */ - (void) endElement: (NSString*)elementName prefix: (NSString*)prefix href: (NSString*)href { [self endElement: elementName]; } /** * Handle an attribute that has been read by the parser. */ - (void) attribute: (NSString*) name value: (NSString*)value { } /** * Receiving some chars from the parser. */ - (void) characters: (NSString*) name { } /** * Receiving some ignorable whitespaces from the parser. */ - (void) ignoreWhitespace: (NSString*) ch { } /** * A processing instruction has been parsed. */ - (void) processInstruction: (NSString*)targetName data: (NSString*)PIdata { } /** * A comment has been parsed. */ - (void) comment: (NSString*) value { } /** * Called when a cdata block has been parsed. */ - (void) cdataBlock: (NSData*)value { } /** * Called to return the filename from which an entity should be loaded. */ - (NSString*) loadEntity: (NSString*)publicId at: (NSString*)location { return nil; } /** * An old global namespace has been parsed. */ - (void) namespaceDecl: (NSString*)name href: (NSString*)href prefix: (NSString*)prefix { } /** * What to do when a notation declaration has been parsed. */ - (void) notationDecl: (NSString*)name public: (NSString*)publicId system: (NSString*)systemId { } /** * An entity definition has been parsed. */ - (void) entityDecl: (NSString*)name type: (NSInteger)type public: (NSString*)publicId system: (NSString*)systemId content: (NSString*)content { } /** * An attribute definition has been parsed. */ - (void) attributeDecl: (NSString*)nameElement name: (NSString*)name type: (NSInteger)type typeDefValue: (NSInteger)defType defaultValue: (NSString*)value { } /** * An element definition has been parsed. */ - (void) elementDecl: (NSString*)name type: (NSInteger)type { } /** * What to do when an unparsed entity declaration is parsed. */ - (void) unparsedEntityDecl: (NSString*)name public: (NSString*)publicId system: (NSString*)systemId notationName: (NSString*)notation { } /** * Called when an entity reference is detected. */ - (void) reference: (NSString*) name { } /** * An old global namespace has been parsed. */ - (void) globalNamespace: (NSString*)name href: (NSString*)href prefix: (NSString*)prefix { } /** * Called when a warning message needs to be output. */ - (void) warning: (NSString*)e { GSPrintf(stderr, @"%@", e); } /** * Called when an error message needs to be output. */ - (void) error: (NSString*)e { GSPrintf(stderr, @"%@", e); } /** * Called when a fatal error message needs to be output. */ - (void) fatalError: (NSString*)e { GSPrintf(stderr, @"%@", e); } /** * Called when a warning message needs to be output. */ - (void) warning: (NSString*)e colNumber: (NSInteger)colNumber lineNumber: (NSInteger)lineNumber { e = [NSString stringWithFormat: @"at line: %"PRIdPTR" column: %"PRIdPTR" ... %@", lineNumber, colNumber, e]; [self warning: e]; } /** * Called when an error message needs to be output. */ - (void) error: (NSString*)e colNumber: (NSInteger)colNumber lineNumber: (NSInteger)lineNumber { e = [NSString stringWithFormat: @"at line: %"PRIdPTR" column: %"PRIdPTR" ... %@", lineNumber, colNumber, e]; [self error: e]; } /** * Called when a fatal error message needs to be output. */ - (void) fatalError: (NSString*)e colNumber: (NSInteger)colNumber lineNumber: (NSInteger)lineNumber { e = [NSString stringWithFormat: @"at line: %"PRIdPTR" column: %"PRIdPTR" ... %@", lineNumber, colNumber, e]; [self fatalError: e]; } /** * Called to find out whether there is an internal subset. */ - (NSInteger) hasInternalSubset { return 0; } /** * Called to find out whether there is an internal subset. */ - (BOOL) internalSubset: (NSString*)name externalID: (NSString*)externalID systemID: (NSString*)systemID { return NO; } /** * Called to find out whether there is an external subset. */ - (NSInteger) hasExternalSubset { return 0; } /** * Called to find out whether there is an external subset. */ - (BOOL) externalSubset: (NSString*)name externalID: (NSString*)externalID systemID: (NSString*)systemID { return NO; } /** * get an entity by name */ - (void*) getEntity: (NSString*)name { return 0; } /** * get a parameter entity by name */ - (void*) getParameterEntity: (NSString*)name { return 0; } /* * Private methods - internal use only. */ - (BOOL) _initLibXML { lib = (xmlSAXHandler*)malloc(sizeof(xmlSAXHandler)); if (lib == NULL) { return NO; } else { xmlSAX2InitDefaultSAXHandler(lib, 0); #define LIB ((xmlSAXHandlerPtr)lib) /* * We must call xmlSAXVersion() BEFORE setting any functions as it * sets up default values and would trash our settings. */ xmlSAXVersion(LIB, 2); // Set SAX2 LIB->startElementNs = (void*) startElementNsFunction; LIB->endElementNs = (void*) endElementNsFunction; LIB->startElement = (void*) startElementFunction; LIB->endElement = (void*) endElementFunction; LIB->internalSubset = (void*) internalSubsetFunction; LIB->externalSubset = (void*) externalSubsetFunction; LIB->isStandalone = (void*) isStandaloneFunction; LIB->hasInternalSubset = (void*) hasInternalSubsetFunction; LIB->hasExternalSubset = (void*) hasExternalSubsetFunction; LIB->getEntity = (void*) getEntityIgnoreExternal; LIB->entityDecl = (void*) entityDeclFunction; LIB->notationDecl = (void*) notationDeclFunction; LIB->attributeDecl = (void*) attributeDeclFunction; LIB->elementDecl = (void*) elementDeclFunction; LIB->unparsedEntityDecl = (void*) unparsedEntityDeclFunction; LIB->startDocument = (void*) startDocumentFunction; LIB->endDocument = (void*) endDocumentFunction; LIB->reference = (void*) referenceFunction; LIB->characters = (void*) charactersFunction; LIB->ignorableWhitespace = (void*) ignorableWhitespaceFunction; LIB->processingInstruction = (void*) processingInstructionFunction; LIB->comment = (void*) commentFunction; LIB->warning = (void*) warningFunction; LIB->error = (void*) errorFunction; LIB->fatalError = (void*) fatalErrorFunction; LIB->getParameterEntity = (void*) getParameterEntityFunction; LIB->cdataBlock = (void*) cdataBlockFunction; LIB->resolveEntity = (void*) resolveEntityFunction; #undef LIB return YES; } } - (void) _setParser: (GSXMLParser*)value { parser = value; } @end /** * The default handler for parsing documents ... this will build a * GSXMLDocument for you. This handler may not currently be subclassed, * though that capability may be added at a later date. */ @implementation GSTreeSAXHandler /** * Called when a warning message needs to be output.
* See [GSXMLParser-setErrors:] for the mechanism implemented by this. */ - (void) warning: (NSString*)e { NSMutableString *m = [parser _messages]; if (m == nil) { GSPrintf(stderr, @"%@", e); } else { [m appendString: e]; } } /** * Called when an error message needs to be output.
* See [GSXMLParser-setErrors:] for the mechanism implemented by this. */ - (void) error: (NSString*)e { NSMutableString *m = [parser _messages]; if (m == nil) { GSPrintf(stderr, @"%@", e); } else { [m appendString: e]; } } /** * Called when a fatal error message needs to be output.
* See [GSXMLParser-setErrors:] for the mechanism implemented by this. */ - (void) fatalError: (NSString*)e { NSMutableString *m = [parser _messages]; if (m == nil) { GSPrintf(stderr, @"%@", e); } else { [m appendString: e]; } } - (BOOL) _initLibXML { lib = (xmlSAXHandler*)malloc(sizeof(xmlSAXHandler)); if (lib == NULL) { return NO; } else { xmlSAX2InitDefaultSAXHandler(lib, 0); #define LIB ((xmlSAXHandlerPtr)lib) #define SETCB(NAME,SEL) if ([self methodForSelector: @selector(SEL)] != [GSTreeSAXHandler instanceMethodForSelector: @selector(SEL)]) LIB->NAME = (void*)NAME ## Function /* * We must call xmlSAXVersion() BEFORE setting any functions as it * sets up default values and would trash our settings. */ xmlSAXVersion(LIB, 2); // Set SAX2 SETCB(startElementNs, startElement:prefix:href:attributes:); SETCB(endElementNs, endElement:prefix:href:); SETCB(startElement, startElement:attributes:); SETCB(endElement, endElement:); SETCB(internalSubset, internalSubset:externalID:systemID:); SETCB(externalSubset, externalSubset:externalID:systemID:); SETCB(isStandalone, isStandalone); SETCB(hasInternalSubset, hasInternalSubset); SETCB(hasExternalSubset, hasExternalSubset); SETCB(getEntity, getEntity:); if (LIB->getEntity != getEntityFunction) { LIB->getEntity = getEntityIgnoreExternal; } SETCB(entityDecl, entityDecl:type:public:system:content:); SETCB(notationDecl, notationDecl:public:system:); SETCB(attributeDecl, attributeDecl:name:type:typeDefValue:defaultValue:); SETCB(elementDecl, elementDecl:type:); SETCB(unparsedEntityDecl, unparsedEntityDecl:public:system:notationName:); SETCB(startDocument, startDocument); SETCB(endDocument, endDocument); SETCB(reference, reference:); SETCB(characters, characters:); SETCB(ignorableWhitespace, ignoreWhitespace:); SETCB(processingInstruction, processInstruction:data:); SETCB(comment, comment:); SETCB(getParameterEntity, getParameterEntity:); SETCB(cdataBlock, cdataBlock:); LIB->warning = (void*)warningFunction; LIB->error = (void*)errorFunction; LIB->fatalError = (void*)fatalErrorFunction; #undef LIB return YES; } } @end /** * You may create a subclass of this class to handle incremental parsing * of html documents ... this is provided for handling legacy documents, * as modern html documents should use xhtml, and for those you should * simply subclass [GSSAXHandler] */ @implementation GSHTMLSAXHandler - (BOOL) _initLibXML { isHtmlHandler = YES; lib = (xmlSAXHandler*)malloc(sizeof(htmlSAXHandler)); if (lib == NULL) { return NO; } else { memcpy(lib, &htmlDefaultSAXHandler, sizeof(htmlSAXHandler)); #define LIB ((htmlSAXHandlerPtr)lib) LIB->internalSubset = (void*)internalSubsetFunction; LIB->externalSubset = (void*)externalSubsetFunction; LIB->isStandalone = (void*)isStandaloneFunction; LIB->hasInternalSubset = (void*)hasInternalSubsetFunction; LIB->hasExternalSubset = (void*)hasExternalSubsetFunction; LIB->getEntity = (void*)getEntityFunction; LIB->entityDecl = (void*)entityDeclFunction; LIB->notationDecl = (void*)notationDeclFunction; LIB->attributeDecl = (void*)attributeDeclFunction; LIB->elementDecl = (void*)elementDeclFunction; LIB->unparsedEntityDecl = (void*)unparsedEntityDeclFunction; LIB->startDocument = (void*)startDocumentFunction; LIB->endDocument = (void*)endDocumentFunction; LIB->startElement = (void*)startElementFunction; LIB->endElement = (void*)endElementFunction; LIB->reference = (void*)referenceFunction; LIB->characters = (void*)charactersFunction; LIB->ignorableWhitespace = (void*)ignorableWhitespaceFunction; LIB->processingInstruction = (void*)processingInstructionFunction; LIB->comment = (void*)commentFunction; LIB->warning = (void*)warningFunction; LIB->error = (void*)errorFunction; LIB->fatalError = (void*)fatalErrorFunction; LIB->getParameterEntity = (void*)getParameterEntityFunction; LIB->cdataBlock = (void*)cdataBlockFunction; #undef LIB return YES; } } @end /** *

You don't create GSXPathObject instances, instead the XPATH system * creates them and returns them as the result of the * [GSXPathContext-evaluateExpression:] method. *

*/ @implementation GSXPathObject - (id) init { DESTROY(self); return nil; } /* Internal method. */ - (id) _initWithNativePointer: (xmlXPathObject *)lib context: (GSXPathContext *)context { _lib = lib; /* We RETAIN our context because we might be holding references to nodes * which belong to the document, and we must make sure the document is * not freed before we are. */ ASSIGN (_context, context); return self; } /* This method is called by GSXPathContext when creating a * GSXPathObject to wrap the results of a query. It assumes that lib * is a pointer created by xmlXPathEval (), and that we are now taking * on responsibility for freeing it. It then examines lib, and * replaces itself with an object of the appropriate subclass. */ + (id) _newWithNativePointer: (xmlXPathObject *)lib context: (GSXPathContext *)context { switch (lib->type) { case XPATH_NODESET: return [[GSXPathNodeSet alloc] _initWithNativePointer: lib context: context]; break; case XPATH_BOOLEAN: return [[GSXPathBoolean alloc] _initWithNativePointer: lib context: context]; break; case XPATH_NUMBER: return [[GSXPathNumber alloc] _initWithNativePointer: lib context: context]; break; case XPATH_STRING: return [[GSXPathString alloc] _initWithNativePointer: lib context: context]; break; default: /* This includes: case XPATH_UNDEFINED: case XPATH_POINT: case XPATH_RANGE: case XPATH_LOCATIONSET: case XPATH_USERS: case XPATH_XSLT_TREE: */ return [[self alloc] _initWithNativePointer: lib context: context]; } } - (void) dealloc { xmlXPathFreeObject (_lib); RELEASE (_context); [super dealloc]; } @end @implementation GSXPathBoolean /** * Returns the the value of the receiver ... YES/NO, true/false. */ - (BOOL) booleanValue { return ((xmlXPathObject*)_lib)->boolval; } - (NSString *) description { return ([self booleanValue] ? @"true" : @"false"); } @end @implementation GSXPathNumber /** * Returns the floating point (double) value of the receiver. */ - (double) doubleValue { return ((xmlXPathObject*)_lib)->floatval; } - (NSString *) description { return [NSString_class stringWithFormat: @"%f", [self doubleValue]]; } @end @implementation GSXPathString /** * Returns the string value of the receiver. */ - (NSString *) stringValue { xmlChar *string = ((xmlXPathObject*)_lib)->stringval; return [NSString_class stringWithUTF8String: (const char*)string]; } - (NSString *) description { return [NSString_class stringWithFormat: @"%@", [self stringValue]]; } @end /** * An XPATH node set is an ordered set of nodes returned as a result of * an expression. The order of the nodes in the set is the same as the * order in the xml document from which they were extracted. */ @implementation GSXPathNodeSet /** * Returns the number of nodes in the receiver. */ - (NSUInteger) count { if (xmlXPathNodeSetIsEmpty (((xmlXPathObject*)_lib)->nodesetval)) { return 0; } return xmlXPathNodeSetGetLength (((xmlXPathObject*)_lib)->nodesetval); } /** * Deprecated */ - (NSUInteger) length { if (xmlXPathNodeSetIsEmpty (((xmlXPathObject*)_lib)->nodesetval)) { return 0; } return xmlXPathNodeSetGetLength (((xmlXPathObject*)_lib)->nodesetval); } /** * Returns the node from the receiver at the specified index, or nil * if no such node exists. */ - (GSXMLNode *) nodeAtIndex: (NSUInteger)index { if (xmlXPathNodeSetIsEmpty (((xmlXPathObject*)_lib)->nodesetval)) { return nil; } else { xmlNode *node; GSXMLNode *n; node = xmlXPathNodeSetItem (((xmlXPathObject*)_lib)->nodesetval, (NSInteger)index); n = [GSXMLNode alloc]; n = [n _initFrom: node parent: self]; return AUTORELEASE(n); } } - (NSString *) description { return [NSString_class stringWithFormat: @"NodeSet (count %"PRIuPTR")", [self count]]; } @end /** *

Use of the GSXPathContext class is simple ... you just need to * look up xpath to learn the syntax of xpath expressions, then you * can apply those expressions to a context to retrieve data from a * document. *

* * GSXMLParser *p = [GSXMLParser parserWithContentsOfFile: @"xp.xml"]; * * if ([p parse]) * { * GSXMLDocument *d = [p document]; * GSXPathContext *c = [[GSXPathContext alloc] initWithDocument: document]; * GSXPathString *result = [c evaluateExpression: @"string(/body/text())"]; * * GSPrintf(stdout, @"Got %@", [result stringValue]); * } * else * { * GSPrintf(stderr, "error parsing file\n"); * } * */ @implementation GSXPathContext /** * Initialises the receiver as an xpath parser for the supplied document. */ - (id) initWithDocument: (GSXMLDocument *)d { ASSIGN (_document, d); _lib = xmlXPathNewContext ([_document lib]); ((xmlXPathContext*)_lib)->node = xmlDocGetRootElement ([_document lib]); return self; } /** * Evaluates the supplied expression and returns the resulting node or * node set. If the expression is invalid, returns nil. */ - (GSXPathObject *) evaluateExpression: (NSString *)XPathExpression { xmlXPathCompExpr *comp; xmlXPathObject *res; GSXPathObject *result; comp = xmlXPathCompile (UTF8STRING(XPathExpression)); if (comp == NULL) { /* Maybe an exception would be better ? */ return nil; } res = xmlXPathCompiledEval (comp, ((xmlXPathContext*)_lib)); if (res == NULL) { result = nil; } else { result = [GSXPathObject _newWithNativePointer: res context: self]; IF_NO_ARC ([result autorelease];) } xmlXPathFreeCompExpr (comp); return result; } - (BOOL) registerNamespaceWithPrefix: (NSString *)prefix href: (NSString *)href { if (xmlXPathRegisterNs (_lib, UTF8STRING(prefix), UTF8STRING(href)) != 0) { return NO; } else { return YES; } } - (void) dealloc { xmlXPathFreeContext (_lib); RELEASE (_document); [super dealloc]; } @end /* * need this to make the linker happy on Windows */ @interface GSXMLDummy : NSObject @end @implementation GSXMLDummy @end @implementation GSXMLNode (Deprecated) - (GSXMLNode*) childElement { static BOOL warned = NO; if (warned == NO) { warned = YES; NSLog(@"WARNING, use of deprecated method ... [%@ -%@]", NSStringFromClass([self class]), NSStringFromSelector(_cmd)); } return [self firstChildElement]; } - (GSXMLNode*) children { static BOOL warned = NO; if (warned == NO) { warned = YES; NSLog(@"WARNING, use of deprecated method ... [%@ -%@]", NSStringFromClass([self class]), NSStringFromSelector(_cmd)); } return [self firstChild]; } - (GSXMLDocument*) doc { static BOOL warned = NO; if (warned == NO) { warned = YES; NSLog(@"WARNING, use of deprecated method ... [%@ -%@]", NSStringFromClass([self class]), NSStringFromSelector(_cmd)); } return [self document]; } - (GSXMLNamespace*) ns { static BOOL warned = NO; if (warned == NO) { warned = YES; NSLog(@"WARNING, use of deprecated method ... [%@ -%@]", NSStringFromClass([self class]), NSStringFromSelector(_cmd)); } return [self namespace]; } - (GSXMLNamespace*) nsDefs { static BOOL warned = NO; if (warned == NO) { warned = YES; NSLog(@"WARNING, use of deprecated method ... [%@ -%@]", NSStringFromClass([self class]), NSStringFromSelector(_cmd)); } return [self namespaceDefinitions]; } - (GSXMLNode*) prev { static BOOL warned = NO; if (warned == NO) { warned = YES; NSLog(@"WARNING, use of deprecated method ... [%@ -%@]", NSStringFromClass([self class]), NSStringFromSelector(_cmd)); } return [self previous]; } - (NSMutableDictionary*) propertiesAsDictionary { static BOOL warned = NO; if (warned == NO) { warned = YES; NSLog(@"WARNING, use of deprecated method ... [%@ -%@]", NSStringFromClass([self class]), NSStringFromSelector(_cmd)); } return [self propertiesAsDictionaryWithKeyTransformationSel: NULL]; } @end @implementation GSXMLParser (Deprecated) - (GSXMLDocument*) doc { static BOOL warned = NO; if (warned == NO) { warned = YES; NSLog(@"WARNING, use of deprecated method ... [%@ -%@]", NSStringFromClass([self class]), NSStringFromSelector(_cmd)); } return [self document]; } @end @implementation GSXMLDocument (XSLT) #ifdef HAVE_LIBXSLT /** * Performs an XSLT transformation on the specified file using the * stylesheet provided.
* * Returns an autoreleased GSXMLDocument containing the transformed * XML, or nil on failure. */ + (GSXMLDocument*) xsltTransformFile: (NSString*)xmlFile stylesheet: (NSString*)xsltStylesheet { return [GSXMLDocument xsltTransformFile: xmlFile stylesheet: xsltStylesheet params: nil]; } /** * Performs an XSLT transformation on the specified file using the * stylesheet and parameters provided. See the libxslt documentation * for details of the supported parameters.
* * Returns an autoreleased GSXMLDocument containing the transformed * XML, or nil on failure. */ + (GSXMLDocument*) xsltTransformFile: (NSString*)xmlFile stylesheet: (NSString*)xsltStylesheet params: (NSDictionary*)params { GSXMLDocument *newdoc; NS_DURING { NSData *xml; NSData *ss; xml = [NSData dataWithContentsOfFile: xmlFile]; ss = [NSData dataWithContentsOfFile: xsltStylesheet]; if (xml == nil || ss == nil) { newdoc = nil; } else { newdoc = [GSXMLDocument xsltTransformXml: xml stylesheet: ss params: params]; } } NS_HANDLER { newdoc = nil; } NS_ENDHANDLER return newdoc; } /** * Performs an XSLT transformation on the specified file using the * stylesheet provided.
* * Returns an autoreleased GSXMLDocument containing the transformed * XML, or nil on failure. */ + (GSXMLDocument*) xsltTransformXml: (NSData*)xmlData stylesheet: (NSData*)xsltStylesheet { return [GSXMLDocument xsltTransformXml: xmlData stylesheet: xsltStylesheet params: nil]; } /** * Performs an XSLT transformation on the specified file using the * stylesheet and parameters provided.See the libxslt documentation * for details of the supported parameters.
* * Returns an autoreleased GSXMLDocument containing the transformed * XML, or nil on failure. */ + (GSXMLDocument*) xsltTransformXml: (NSData*)xmlData stylesheet: (NSData*)xsltStylesheet params: (NSDictionary*)params { GSXMLDocument *newdoc; NS_DURING { GSXMLParser *xmlParser; GSXMLDocument *xml; GSXMLParser *ssParser; GSXMLDocument *ss; newdoc = nil; xmlParser = [GSXMLParser parserWithData: xmlData]; if ([xmlParser parse] == YES) { xml = [xmlParser document]; ssParser = [GSXMLParser parserWithData: xsltStylesheet]; if ([ssParser parse] == YES) { ss = [ssParser document]; newdoc = [xml xsltTransform: ss params: params]; } } } NS_HANDLER { newdoc = nil; } NS_ENDHANDLER return newdoc; } /** * Performs an XSLT transformation on the current document using the * supplied stylesheet.
* * Returns an autoreleased GSXMLDocument containing the transformed * XML, or nil on failure. */ - (GSXMLDocument*) xsltTransform: (GSXMLDocument*)xsltStylesheet { return [self xsltTransform: xsltStylesheet params: nil]; } /** * Performs an XSLT transformation on the current document using the * supplied stylesheet and paramaters (params may be nil). * See the libxslt documentation for details of the supported parameters.
* * Returns an autoreleased GSXMLDocument containing the transformed * XML, or nil on failure. */ - (GSXMLDocument*) xsltTransform: (GSXMLDocument*)xsltStylesheet params: (NSDictionary*)params { GSXMLDocument *newdoc = nil; NS_DURING { xsltStylesheetPtr ss = NULL; xmlDocPtr ssXml = (xmlDocPtr)[xsltStylesheet lib]; int pSize = params == nil ? 1 : ([params count] * 2) + 1; int pNum = 0; const char *parameters[pSize]; if (params != nil) { NSEnumerator *keys = [params keyEnumerator]; if (keys != nil) { NSString *key = [keys nextObject]; while (key != nil) { NSString *value = [params objectForKey: key]; parameters[pNum++] = [key cString]; parameters[pNum++] = [value cString]; key = [keys nextObject]; } } } parameters[pNum] = NULL; ss = xsltParseStylesheetDoc(ssXml); if (xsltStylesheet != NULL) { xmlDocPtr res = NULL; res = xsltApplyStylesheet(ss, lib, parameters); if (res != NULL) { newdoc = [GSXMLDocument alloc]; newdoc = [newdoc _initFrom: res parent: self ownsLib: YES]; IF_NO_ARC([newdoc autorelease];) } } /* * N.B. We don't want to call xsltFreeStylesheet() to free the * stylesheet xmlDocPtr because that will destroy the lib which * is owned by the xsltStylesheet object. */ xsltCleanupGlobals(); } NS_HANDLER { newdoc= nil; } NS_ENDHANDLER return newdoc; } #else /* HAVE_LIBXSLT */ + (GSXMLDocument*) xsltTransformFile: (NSString*)xmlFile stylesheet: (NSString*)xsltStylesheet params: (NSDictionary*)params { NSLog(@"libxslt is not available"); return nil; } + (GSXMLDocument*) xsltTransformFile: (NSString*)xmlFile stylesheet: (NSString*)xsltStylesheet { NSLog(@"libxslt is not available"); return nil; } + (GSXMLDocument*) xsltTransformXml: (NSData*)xmlData stylesheet: (NSData*)xsltStylesheet params: (NSDictionary*)params { NSLog(@"libxslt is not available"); return nil; } + (GSXMLDocument*) xsltTransformXml: (NSData*)xmlData stylesheet: (NSData*)xsltStylesheet { NSLog(@"libxslt is not available"); return nil; } - (GSXMLDocument*) xsltTransform: (GSXMLDocument*)xsltStylesheet params: (NSDictionary*)params { NSLog(@"libxslt is not available"); return nil; } - (GSXMLDocument*) xsltTransform: (GSXMLDocument*)xsltStylesheet { NSLog(@"libxslt is not available"); return nil; } #endif /* HAVE_LIBXSLT */ @end #else #ifndef NeXT_Foundation_LIBRARY #import "Foundation/NSCoder.h" #import "Foundation/NSInvocation.h" #endif /* * Build dummy implementations of the classes if libxml is not available */ GS_EXPORT_CLASS @interface GSXMLDummy : NSObject @end GS_EXPORT_CLASS @interface GSXMLDocument : GSXMLDummy @end GS_EXPORT_CLASS @interface GSXMLNamespace : GSXMLDummy @end GS_EXPORT_CLASS @interface GSXMLNode : GSXMLDummy @end GS_EXPORT_CLASS @interface GSSAXHandler : GSXMLDummy @end GS_EXPORT_CLASS @interface GSXMLParser : GSXMLDummy @end GS_EXPORT_CLASS @interface GSXMLAttribute : GSXMLNode @end @implementation GSXMLDummy + (id) allocWithZone: (NSZone*)z { NSLog(@"Not built with libxml ... %@ unusable in %@", NSStringFromClass(self), NSStringFromSelector(_cmd)); return nil; } + (void) forwardInvocation: (NSInvocation*)anInvocation { NSLog(@"Not built with libxml ... %@ unusable in %@", NSStringFromClass([self class]), NSStringFromSelector([anInvocation selector])); return; } - (id) init { NSLog(@"Not built with libxml ... %@ unusable in %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd)); DESTROY(self); return nil; } - (id) initWithCoder: (NSCoder*)aCoder { NSLog(@"Not built with libxml ... %@ unusable in %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd)); DESTROY(self); return nil; } @end GS_EXPORT_CLASS @implementation GSXMLDocument @end GS_EXPORT_CLASS @implementation GSXMLNamespace @end GS_EXPORT_CLASS @implementation GSXMLNode @end GS_EXPORT_CLASS @implementation GSSAXHandler @end GS_EXPORT_CLASS @implementation GSXMLParser @end GS_EXPORT_CLASS @implementation GSXMLAttribute @end #endif @implementation NSString (GSXML) - (NSString*) stringByEscapingXML { unsigned length = [self length]; unsigned output = 0; unichar *from; unsigned i = 0; BOOL escape = NO; from = NSZoneMalloc (NSDefaultMallocZone(), sizeof(unichar) * length); [self getCharacters: from]; for (i = 0; i < length; i++) { unichar c = from[i]; if ((c >= 0x20 && c <= 0xd7ff) || c == 0x9 || c == 0xd || c == 0xa || (c >= 0xe000 && c <= 0xfffd)) { switch (c) { case '"': case '\'': output += 6; escape = YES; break; case '&': output += 5; escape = YES; break; case '<': case '>': output += 4; escape = YES; break; default: /* * For non-ascii characters, we can use &#nnnn; escapes */ if (c > 127) { output += 5; while (c >= 1000) { output++; c /= 10; } escape = YES; } output++; break; } } else { escape = YES; // Need to remove bad characters } } if (escape == YES) { unichar *to; unsigned j = 0; to = NSZoneMalloc (NSDefaultMallocZone(), sizeof(unichar) * output); for (i = 0; i < length; i++) { unichar c = from[i]; if ((c >= 0x20 && c <= 0xd7ff) || c == 0x9 || c == 0xd || c == 0xa || (c >= 0xe000 && c <= 0xfffd)) { switch (c) { case '"': to[j++] = '&'; to[j++] = 'q'; to[j++] = 'u'; to[j++] = 'o'; to[j++] = 't'; to[j++] = ';'; break; case '\'': to[j++] = '&'; to[j++] = 'a'; to[j++] = 'p'; to[j++] = 'o'; to[j++] = 's'; to[j++] = ';'; break; case '&': to[j++] = '&'; to[j++] = 'a'; to[j++] = 'm'; to[j++] = 'p'; to[j++] = ';'; break; case '<': to[j++] = '&'; to[j++] = 'l'; to[j++] = 't'; to[j++] = ';'; break; case '>': to[j++] = '&'; to[j++] = 'g'; to[j++] = 't'; to[j++] = ';'; break; default: if (c > 127) { char buf[12]; char *ptr = buf; to[j++] = '&'; to[j++] = '#'; snprintf(buf, sizeof(buf), "%u", c); while (*ptr != '\0') { to[j++] = *ptr++; } to[j++] = ';'; } else { to[j++] = c; } break; } } } self = [[NSString alloc] initWithCharacters: to length: output]; NSZoneFree (NSDefaultMallocZone (), to); IF_NO_ARC([self autorelease];) } else { self = AUTORELEASE([self copyWithZone: NSDefaultMallocZone()]); } NSZoneFree (NSDefaultMallocZone (), from); return self; } - (NSString*) stringByUnescapingXML { unsigned length = [self length]; NSRange r = NSMakeRange(0, length); r = [self rangeOfString: @"&" options: NSLiteralSearch range: r]; if (r.length > 0) { NSMutableString *m = [self mutableCopy]; while (r.length > 0) { NSRange e; unsigned s0 = NSMaxRange(r); e = [m rangeOfString: @";" options: NSLiteralSearch range: NSMakeRange(s0, length - s0)]; if (e.length > 0) { unsigned s1 = NSMaxRange(e); NSString *s = [m substringWithRange: NSMakeRange(s0, s1 - s0)]; if ([s hasPrefix: @"&#"] == YES) { unichar u; if ([s hasPrefix: @"&#x"] || [s hasPrefix: @"&#X"]) { unsigned val = 0; s = [s substringFromIndex: 3]; sscanf([s UTF8String], "%x", &val); u = val; } else if ([s hasPrefix: @"�x"] || [s hasPrefix: @"�X"]) { unsigned val = 0; s = [s substringFromIndex: 4]; sscanf([s UTF8String], "%x", &val); u = val; } else { s = [s substringFromIndex: 2]; u = [s intValue]; } if (u == 0) { u = ' '; } s = [[NSString alloc] initWithCharacters: &u length: 1]; s = AUTORELEASE(s); } else if ([s isEqualToString: @"amp"]) { s = @"&"; } else if ([s isEqualToString: @"apos"]) { s = @"'"; } else if ([s isEqualToString: @"quot"]) { s = @"\""; } else if ([s isEqualToString: @"lt"]) { s = @"<"; } else if ([s isEqualToString: @"gt"]) { s = @">"; } else { // Unknown escape ... don't change. s = [NSString stringWithFormat: @"&%@;", s]; } [m replaceCharactersInRange: NSMakeRange(s0, s1 - s0) withString: s]; r.length = [s length]; length += r.length - (s1 - s0); r.location = NSMaxRange(r); r.length = length - r.location; r = [m rangeOfString: @"&" options: NSLiteralSearch range: r]; } else { r.length = 0; } } self = AUTORELEASE(m); } else { self = AUTORELEASE([self copyWithZone: NSDefaultMallocZone()]); } return self; } @end #ifdef HAVE_LIBXML /* * Categories on other classes which are required for XMLRPC */ @interface NSArray (GSXMLRPC) - (void) appendToXMLRPC: (NSMutableString*)str indent: (NSUInteger)indent for: (GSXMLRPC*)rpc; @end @interface NSData (GSXMLRPC) - (void) appendToXMLRPC: (NSMutableString*)str indent: (NSUInteger)indent for: (GSXMLRPC*)rpc; @end @interface NSDate (GSXMLRPC) - (void) appendToXMLRPC: (NSMutableString*)str indent: (NSUInteger)indent for: (GSXMLRPC*)rpc; @end @interface NSDictionary (GSXMLRPC) - (void) appendToXMLRPC: (NSMutableString*)str indent: (NSUInteger)indent for: (GSXMLRPC*)rpc; @end @interface NSObject (GSXMLRPC) - (void) appendToXMLRPC: (NSMutableString*)str indent: (NSUInteger)indent for: (GSXMLRPC*)rpc; @end @interface NSNumber (GSXMLRPC) - (void) appendToXMLRPC: (NSMutableString*)str indent: (NSUInteger)indent for: (GSXMLRPC*)rpc; @end @interface NSString (GSXMLRPC) - (void) appendToXMLRPC: (NSMutableString*)str indent: (NSUInteger)indent for: (GSXMLRPC*)rpc; @end /* * A little code to handle indentation. */ static NSString *indentations[] = { @" ", @" ", @" ", @"\t", @"\t ", @"\t ", @"\t ", @"\t\t", @"\t\t ", @"\t\t ", @"\t\t ", @"\t\t\t", @"\t\t\t ", @"\t\t\t ", @"\t\t\t ", @"\t\t\t\t" }; static void indentation(unsigned level, NSMutableString *str) { if (level > 0) { if (level >= sizeof(indentations)/sizeof(*indentations)) { level = sizeof(indentations)/sizeof(*indentations) - 1; } [str appendString: indentations[level]]; } } #define INDENT(I) if (compact == NO) indentation(I, str) #define NL if (compact == NO) [str appendString: @"\n"] /* * Implementation of categories to output objects for XMLRPC */ @implementation NSArray (GSXMLRPC) - (void) appendToXMLRPC: (NSMutableString*)str indent: (NSUInteger)indent for: (GSXMLRPC*)rpc { unsigned i; unsigned c = [self count]; BOOL compact = [rpc compact]; INDENT(indent++); [str appendString: @""]; NL; INDENT(indent++); [str appendString: @""]; NL; for (i = 0; i < c; i++) { id value = [self objectAtIndex: i]; INDENT(indent++); [str appendString: @""]; NL; [value appendToXMLRPC: str indent: indent for: rpc]; NL; INDENT(--indent); [str appendString: @""]; NL; } INDENT(--indent); [str appendString: @""]; NL; INDENT(--indent); [str appendString: @""]; } @end @implementation NSData (GSXMLRPC) - (void) appendToXMLRPC: (NSMutableString*)str indent: (NSUInteger)indent for: (GSXMLRPC*)rpc { NSData *d; NSString *s; d = [GSMimeDocument encodeBase64: self]; s = [[NSString alloc] initWithData: d encoding: NSASCIIStringEncoding]; [str appendString: @""]; [str appendString: s]; [str appendString: @""]; RELEASE(s); } @end @implementation NSDate (GSXMLRPC) - (void) appendToXMLRPC: (NSMutableString*)str indent: (NSUInteger)indent for: (GSXMLRPC*)rpc { NSString *s; s = [self descriptionWithCalendarFormat: @"%Y%m%dT%H:%M:%S" timeZone: [rpc timeZone] locale: nil]; [str appendString: @""]; [str appendString: s]; [str appendString: @""]; } @end @implementation NSDictionary (GSXMLRPC) - (void) appendToXMLRPC: (NSMutableString*)str indent: (NSUInteger)indent for: (GSXMLRPC*)rpc { NSEnumerator *kEnum = [self keyEnumerator]; NSString *key; BOOL compact = [rpc compact]; INDENT(indent++); [str appendString: @""]; NL; while ((key = [kEnum nextObject])) { id value = [self objectForKey: key]; INDENT(indent++); [str appendString: @""]; NL; INDENT(indent); [str appendString: @""]; [str appendString: [[key description] stringByEscapingXML]]; [str appendString: @""]; NL; INDENT(indent++); [str appendString: @""]; NL; [value appendToXMLRPC: str indent: indent-- for: rpc]; NL; INDENT(indent--); [str appendString: @""]; NL; INDENT(indent); [str appendString: @""]; NL; } INDENT(--indent); [str appendString: @""]; } @end @implementation NSNumber (GSXMLRPC) - (void) appendToXMLRPC: (NSMutableString*)str indent: (NSUInteger)indent for: (GSXMLRPC*)rpc { const char *t = [self objCType]; BOOL compact = [rpc compact]; INDENT(indent); if (strchr("cCsSiIlLqQ", *t) != 0) { int64_t i = [self longLongValue]; if ((i & 0xffffffff) != i) { [NSException raise: NSInternalInconsistencyException format: @"Can't encode %"PRId64" as i4", i]; } if ((i == 0 || i == 1) && (*t == 'c' || *t == 'C')) { if (i == 0) { [str appendString: @"0"]; } else { [str appendString: @"1"]; } } else { [str appendFormat: @"%"PRId32"", (int32_t)i]; } } else { [str appendFormat: @"%f", [self doubleValue]]; } } @end @implementation NSObject (GSXMLRPC) - (void) appendToXMLRPC: (NSMutableString*)str indent: (NSUInteger)indent for: (GSXMLRPC*)rpc { [[self description] appendToXMLRPC: str indent: indent for: rpc]; } @end @implementation NSString (GSXMLRPC) - (void) appendToXMLRPC: (NSMutableString*)str indent: (NSUInteger)indent for: (GSXMLRPC*)rpc { BOOL compact = [rpc compact]; if (compact == YES) { [str appendString: [self stringByEscapingXML]]; } else { INDENT(indent); [str appendFormat: @"%@", [self stringByEscapingXML]]; } } @end /* * Convert incoming XMLRPC value to a normal Objective-C object. */ @interface GSXMLRPC (Private) - (id) _parseValue: (GSXMLNode*)node; @end @implementation GSXMLRPC (Private) - (id) _parseValue: (GSXMLNode*)node { NSString *name = [node name]; NSString *str; if ([name isEqualToString: @"value"]) { GSXMLNode *type = [node firstChildElement]; /* * A value with no type element is just a string. */ if (type == nil) { name = @"string"; } else { node = type; name = [node name]; } } if ([name length] == 0) { return nil; } if ([name isEqualToString: @"i4"] || [name isEqualToString: @"int"]) { str = [node content]; if (str == nil) { [NSException raise: NSInvalidArgumentException format: @"missing %@ value", name]; } return [NSNumber numberWithInt: [str intValue]]; } if ([name isEqualToString: @"string"]) { str = [node content]; if (str == nil) { str = @""; } return str; } if ([name isEqualToString: @"boolean"]) { char c; str = [node content]; if (str == nil) { [NSException raise: NSInvalidArgumentException format: @"missing %@ value", name]; } c = [str intValue]; return [NSNumber numberWithBool: c == 0 ? NO : YES]; } if ([name isEqualToString: @"double"]) { str = [node content]; if (str == nil) { [NSException raise: NSInvalidArgumentException format: @"missing %@ value", name]; } return [NSNumber numberWithDouble: [str doubleValue]]; } if ([name isEqualToString: @"base64"]) { NSData *d; str = [node content]; if (str == nil) { [NSException raise: NSInvalidArgumentException format: @"missing %@ value", name]; } d = [str dataUsingEncoding: NSASCIIStringEncoding]; return [GSMimeDocument decodeBase64: d]; } if ([name isEqualToString: @"dateTime.iso8601"]) { NSCalendarDate *d; const char *s; int year; int month; int day; int hour; int minute; int second; str = [node content]; if (str == nil) { [NSException raise: NSInvalidArgumentException format: @"missing %@ value", name]; } s = [str UTF8String]; if (sscanf(s, "%04d%02d%02dT%02d:%02d:%02d", &year, &month, &day, &hour, &minute, &second) != 6) { [NSException raise: NSInvalidArgumentException format: @"bad date/time format '%@'", str]; } d = [[NSCalendarDate alloc] initWithYear: year month: month day: day hour: hour minute: minute second: second timeZone: tz]; return AUTORELEASE(d); } if ([name isEqualToString: @"array"]) { NSMutableArray *arr = [NSMutableArray array]; node = [node firstChildElement]; while (node != nil && [[node name] isEqualToString: @"data"] == NO) { node = [node nextElement]; } if ([[node name] isEqualToString: @"data"] == YES) { node = [node firstChildElement]; while (node != nil) { if ([[node name] isEqualToString: @"value"] == YES) { id v; v = [self _parseValue: node]; if (v != nil) { [arr addObject: v]; } } node = [node nextElement]; } } return arr; } if ([name isEqualToString: @"struct"]) { NSMutableDictionary *dict = [NSMutableDictionary dictionary]; node = [node firstChildElement]; while (node != nil) { if ([[node name] isEqualToString: @"member"] == YES) { GSXMLNode *member = [node firstChildElement]; NSString *key = nil; id val = nil; while (member != nil) { if ([[member name] isEqualToString: @"name"] == YES) { key = [member content]; } else if ([[member name] isEqualToString: @"value"] == YES) { val = [self _parseValue: member]; } if (key != nil && val != nil) { [dict setObject: val forKey: key]; break; } member = [member nextElement]; } } node = [node nextElement]; } return dict; } [NSException raise: NSInvalidArgumentException format: @"Unknown value type: %@", name]; return nil; } @end /* * And now, the actual GSXMLRPC class. */ @implementation GSXMLRPC - (NSData*) buildMethod: (NSString*)method params: (NSArray*)params { return [[self buildMethodCall: method params: params] dataUsingEncoding: NSUTF8StringEncoding]; } - (NSString*) buildMethodCall: (NSString*)method params: (NSArray*)params { NSMutableString *str = [NSMutableString stringWithCapacity: 1024]; unsigned c = [params count]; unsigned i; if ([method length] == 0) { return nil; } else { static NSCharacterSet *illegal = nil; NSRange r; if (illegal == nil) { NSMutableCharacterSet *tmp = [NSMutableCharacterSet new]; [tmp addCharactersInRange: NSMakeRange('0', 10)]; [tmp addCharactersInRange: NSMakeRange('a', 26)]; [tmp addCharactersInRange: NSMakeRange('A', 26)]; [tmp addCharactersInString: @"_.:/"]; [tmp invert]; illegal = [tmp copy]; RELEASE(tmp); } r = [method rangeOfCharacterFromSet: illegal]; if (r.length > 0) { return nil; // Bad method name. } } [str appendString: @"\n"]; [str appendString: @""]; NL; INDENT(1); [str appendFormat: @"%@", [method stringByEscapingXML]]; NL; if (c > 0) { INDENT(1); [str appendString: @""]; NL; for (i = 0; i < c; i++) { INDENT(2); [str appendString: @""]; NL; INDENT(3); [str appendString: @""]; NL; [[params objectAtIndex: i] appendToXMLRPC: str indent: 3 for: self]; NL; INDENT(3); [str appendString: @""]; NL; INDENT(2); [str appendString: @""]; NL; } INDENT(1); [str appendString: @""]; NL; } [str appendString: @""]; NL; return str; } - (NSString*) buildResponseWithFaultCode: (NSInteger)code andString: (NSString*)s { NSMutableString *str = [NSMutableString stringWithCapacity: 1024]; NSDictionary *fault; fault = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt: code], @"faultCode", s, @"faultString", nil]; [str appendString: @"\n"]; [str appendString: @""]; NL; INDENT(1); [str appendString: @""]; NL; INDENT(2); [str appendString: @""]; NL; [fault appendToXMLRPC: str indent: 3 for: self]; NL; INDENT(2); [str appendString: @""]; NL; INDENT(1); [str appendString: @""]; NL; [str appendString: @""]; NL; return str; } - (NSString*) buildResponseWithParams: (NSArray*)params { NSMutableString *str = [NSMutableString stringWithCapacity: 1024]; unsigned c = [params count]; unsigned i; [str appendString: @"\n"]; [str appendString: @""]; NL; INDENT(1); [str appendString: @""]; NL; for (i = 0; i < c; i++) { INDENT(2); [str appendString: @""]; NL; INDENT(3); [str appendString: @""]; NL; [[params objectAtIndex: i] appendToXMLRPC: str indent: 3 for: self]; NL; INDENT(3); [str appendString: @""]; NL; INDENT(2); [str appendString: @""]; NL; } INDENT(1); [str appendString: @""]; NL; [str appendString: @""]; NL; return str; } - (BOOL) compact { return compact; } - (void) dealloc { RELEASE(tz); if (timer != nil) { [self timeout: nil]; // Treat as immediate timeout. } #ifdef GNUSTEP [handle removeClient: self]; #endif DESTROY(result); #ifdef GNUSTEP DESTROY(handle); #else if (connection) { [connection release]; } [response release]; [connectionURL release]; #endif [super dealloc]; } - (id) delegate { return delegate; } - (id) initWithURL: (NSString*)url { return [self initWithURL: url certificate: nil privateKey: nil password: nil]; } - (id) initWithURL: (NSString*)url certificate: (NSString*)cert privateKey: (NSString*)pKey password: (NSString*)pwd { if (url != nil) { NS_DURING { #ifdef GNUSTEP NSURL *u = [NSURL URLWithString: url]; handle = RETAIN([u URLHandleUsingCache: NO]); if (cert != nil && pKey != nil && pwd != nil) { [handle writeProperty: cert forKey: GSTLSCertificateFile]; [handle writeProperty: pKey forKey: GSTLSCertificateKeyFile]; [handle writeProperty: pwd forKey: GSTLSCertificateKeyPassword]; } #else connectionURL = [url copy]; connection = nil; response = [[NSMutableData alloc] init]; #endif } NS_HANDLER { DESTROY(self); } NS_ENDHANDLER } return self; } - (id) init { return [self initWithURL: nil certificate: nil privateKey: nil password: nil]; } - (id) makeMethodCall: (NSString*)method params: (NSArray*)params timeout: (NSInteger)seconds { NS_DURING { if ([self sendMethodCall: method params: params timeout: seconds] == YES) { NSDate *when = AUTORELEASE(RETAIN([timer fireDate])); while (timer != nil) { [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate: when]; } } } NS_HANDLER { ASSIGN(result, [localException description]); } NS_ENDHANDLER return result; } - (NSString*) parseMethod: (NSData*)request params: (NSMutableArray*)params { GSXPathContext *ctx = nil; GSXPathNodeSet *ns = nil; GSXMLParser *parser = nil; NSString *method; [params removeAllObjects]; NS_DURING { GSXMLDocument *doc = nil; parser = [GSXMLParser parserWithData: request]; [parser substituteEntities: YES]; [parser saveMessages: YES]; if ([parser parse] == YES) { doc = [parser document]; ctx = AUTORELEASE([[GSXPathContext alloc] initWithDocument: doc]); } } NS_HANDLER { ctx = nil; } NS_ENDHANDLER if (ctx == nil) { [NSException raise: NSInvalidArgumentException format: @"Bad Request: parse failed (%@)", [parser messages]]; } ns = (GSXPathNodeSet*)[ctx evaluateExpression: @"//methodCall/methodName"]; if ([ns count] != 1) { [NSException raise: NSInvalidArgumentException format: @"Badly formatted methodCall"]; } method = [[ns nodeAtIndex: 0] content]; ns = (GSXPathNodeSet*)[ctx evaluateExpression: @"//methodCall/params/param/value"]; NS_DURING { int i; for (i = 0; i < [ns count]; i++) { GSXMLNode *node = [ns nodeAtIndex: i]; id value = [self _parseValue: node]; if (value != nil) { [params addObject: value]; } } } NS_HANDLER { [params removeAllObjects]; [localException raise]; } NS_ENDHANDLER return method; } - (NSDictionary*) parseResponse: (NSData*)resp params: (NSMutableArray*)params { GSXPathContext *ctx = nil; GSXPathNodeSet *ns = nil; GSXMLParser *parser = nil; id fault = nil; [params removeAllObjects]; NS_DURING { GSXMLDocument *doc = nil; parser = [GSXMLParser parserWithData: resp]; [parser substituteEntities: YES]; [parser saveMessages: YES]; if ([parser parse] == YES) { doc = [parser document]; ctx = AUTORELEASE([[GSXPathContext alloc] initWithDocument: doc]); } } NS_HANDLER { ctx = nil; } NS_ENDHANDLER if (ctx == nil) { [NSException raise: NSInvalidArgumentException format: @"Bad Request: parse failed (%@)", [parser messages]]; } ns = (GSXPathNodeSet*)[ctx evaluateExpression: @"//methodResponse/params/param/value"]; NS_DURING { int i; if ([ns count] > 0) { for (i = 0; i < [ns count]; i++) { GSXMLNode *node = [ns nodeAtIndex: i]; id value = [self _parseValue: node]; if (value != nil) { [params addObject: value]; } } } else { ns = (GSXPathNodeSet*)[ctx evaluateExpression: @"//methodResponse/fault/value/struct"]; if ([ns count] > 0) { fault = [self _parseValue: [ns nodeAtIndex: 0]]; } } } NS_HANDLER { [params removeAllObjects]; [localException raise]; } NS_ENDHANDLER return fault; } - (id) result { if (timer == nil) { return result; } else { return nil; } } - (BOOL) sendMethodCall: (NSString*)method params: (NSArray*)params timeout: (NSInteger)seconds { NSData *data; ASSIGN(result, @"unable to send"); #ifdef GNUSTEP if (handle == nil) { return NO; // Not initialised to send. } #endif if (timer != nil) { return NO; // Send already in progress. } data = [self buildMethod: method params: params]; if (data == nil) { return NO; } timer = [NSTimer scheduledTimerWithTimeInterval: seconds target: self selector: @selector(timeout:) userInfo: nil repeats: NO]; #ifdef GNUSTEP [handle addClient: self]; [handle writeProperty: @"POST" forKey: GSHTTPPropertyMethodKey]; [handle writeProperty: @"GSXMLRPC/1.0.0" forKey: @"User-Agent"]; [handle writeProperty: @"text/xml" forKey: @"Content-Type"]; [handle writeData: data]; [handle loadInBackground]; #else { NSMutableURLRequest *request; request = [NSMutableURLRequest alloc]; request = [request initWithURL: [NSURL URLWithString: connectionURL]]; [request setCachePolicy: NSURLRequestReloadIgnoringCacheData]; [request setHTTPMethod: @"POST"]; [request setValue: @"GSXMLRPC/1.0.0" forHTTPHeaderField: @"User-Agent"]; [request setValue: @"text/xml" forHTTPHeaderField: @"Content-Type"]; [request setHTTPBody: data]; connection = [NSURLConnection alloc]; connection = [connection initWithRequest: request delegate: self]; [request release]; } #endif return YES; } - (int) setDebug: (int)flag { #ifdef GNUSTEP if ([handle respondsToSelector: _cmd] == YES) { return [(id)handle setDebug: flag]; } #endif return NO; } - (void) setCompact: (BOOL)flag { compact = flag; } - (void) setDelegate: (id)aDelegate { delegate = aDelegate; } - (void) setTimeZone: (NSTimeZone*)timeZone { ASSIGN(tz, timeZone); } - (void) timeout: (NSTimer*)t { [timer invalidate]; timer = nil; #ifdef GNUSTEP [handle cancelLoadInBackground]; #else [connection cancel]; #endif } - (NSTimeZone*) timeZone { if (tz == nil) { tz = RETAIN([NSTimeZone timeZoneForSecondsFromGMT: 0]); } return tz; } #ifdef GNUSTEP - (void) URLHandle: (NSURLHandle*)sender resourceDataDidBecomeAvailable: (NSData*)newData { // Not interesting } - (void) URLHandle: (NSURLHandle*)sender resourceDidFailLoadingWithReason: (NSString*)reason { ASSIGN(result, reason); [timer invalidate]; timer = nil; #ifdef GNUSTEP [handle removeClient: self]; #endif if ([delegate respondsToSelector: @selector(completedXMLRPC:)]) { [delegate completedXMLRPC: self]; } } - (void) URLHandleResourceDidBeginLoading: (NSURLHandle*)sender { // Not interesting } - (void) URLHandleResourceDidCancelLoading: (NSURLHandle*)sender { NSString *str; [timer invalidate]; timer = nil; #ifdef GNUSTEP [handle removeClient: self]; #endif str = [handle propertyForKeyIfAvailable: NSHTTPPropertyStatusCodeKey]; if (str == nil) { str = @"timeout"; } else { str = [NSString stringWithFormat: @"HTTP status %@", str]; } ASSIGN(result, str); if ([delegate respondsToSelector: @selector(completedXMLRPC:)]) { [delegate completedXMLRPC: self]; } } - (void) URLHandleResourceDidFinishLoading: (NSURLHandle*)sender { NSMutableArray *params = [NSMutableArray array]; id fault = nil; int code; code = [[handle propertyForKey: NSHTTPPropertyStatusCodeKey] intValue]; if (code == 200) { NSData *resp = [handle availableResourceData]; NS_DURING { fault = [self parseResponse: resp params: params]; } NS_HANDLER { fault = [localException reason]; } NS_ENDHANDLER } else { fault = [NSString stringWithFormat: @"HTTP status %03d", code]; } if (fault == nil) { ASSIGN(result, params); } else { ASSIGN(result, fault); } [timer invalidate]; timer = nil; #ifdef GNUSTEP [handle removeClient: self]; #endif if ([delegate respondsToSelector: @selector(completedXMLRPC:)]) { [delegate completedXMLRPC: self]; } } #else /* !GNUSTEP */ - (void) connection: (NSURLConnection*)connection didCancelAuthenticationChallenge: (NSURLAuthenticationChallenge*)challenge { /* DO NOTHING */ } - (void) connection: (NSURLConnection*)connection didFailWithError: (NSError*)error { ASSIGN(result, [error localizedDescription]); [timer invalidate]; timer = nil; if ([delegate respondsToSelector: @selector(completedXMLRPC:)]) { [delegate completedXMLRPC: self]; } } - (void) connection: (NSURLConnection*)connection didReceiveAuthenticationChallenge: (NSURLAuthenticationChallenge*)challenge { } - (void) connection: (NSURLConnection*)connection didReceiveData: (NSData*)data { [response appendData: data]; } - (void) connection: (NSURLConnection*)connection didReceiveResponse: (NSURLResponse*)response { /* DO NOTHING */ } - (NSCachedURLResponse*) connection: (NSURLConnection*)connection willCacheResponse: (NSCachedURLResponse*)cachedResponse { return nil; } - (NSURLRequest*) connection: (NSURLConnection*)connection willSendRequest: (NSURLRequest*)request redirectResponse: (NSURLResponse*)redirectResponse { return nil; } -(void) connectionDidFinishLoading: (NSURLConnection*)connection { NSMutableArray *params = [NSMutableArray array]; id fault = nil; NS_DURING { fault = [self parseResponse: response params: params]; } NS_HANDLER { fault = [localException reason]; } NS_ENDHANDLER if (fault == nil) { ASSIGNCOPY(result, params); } else { ASSIGNCOPY(result, fault); } [timer invalidate]; timer = nil; if ([delegate respondsToSelector: @selector(completedXMLRPC:)]) { [delegate completedXMLRPC: self]; } } #endif @end @implementation GSXMLRPC (Delegate) - (void) completedXMLRPC: (GSXMLRPC*)sender { } @end #endif /* HAVE_LIBXML */ gnustep-base-1.29.0/Source/Additions/Makefile.postamble000066400000000000000000000005361435650067400230210ustar00rootroot00000000000000# # If building with the Apple Foundation, we don't include the base 'Headers' # directory in the includes path, but we need the additions headers so we # link to them from the current directory. # ifeq ($(FOUNDATION_LIB),apple) before-all:: rm -f GNUstepBase ln -s ../../Headers/GNUstepBase GNUstepBase after-clean:: rm -f GNUstepBase endif gnustep-base-1.29.0/Source/Additions/Makefile.preamble000066400000000000000000000044461435650067400226260ustar00rootroot00000000000000# # Makefile.preamble # # Copyright (C) 1997 Free Software Foundation, Inc. # # Author: Scott Christley # # This file is part of the GNUstep Base Library. # # 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 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 # Library General Public License for more details. # # If you are interested in a warranty or support for this source code, # contact Scott Christley at scottc@net-community.com # # You should have received a copy of the GNU Lesser General Public # License along with this library; see the file COPYING.LIB. # If not, write to the Free Software Foundation, # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # Makefile.preamble # # Project specific makefile variables # # Do not put any Makefile rules in this file, instead they should # be put into Makefile.postamble. # # # Flags dealing with compiling and linking # # Additional flags to pass to the preprocessor ADDITIONAL_CPPFLAGS = $(DEFS) \ $(WARN_FLAGS) \ -DNO_GNUSTEP=1 # Additional flags to pass to the Objective-C compiler #ADDITIONAL_OBJCFLAGS = ifeq ($(GNUSTEP_TARGET_OS),mingw32) ADDITIONAL_OBJCFLAGS += -DBUILD_libgnustep_base_DLL=1 else ifeq ($(GNUSTEP_TARGET_OS),mingw64) ADDITIONAL_OBJCFLAGS += -DBUILD_libgnustep_base_DLL=1 else ifeq ($(GNUSTEP_TARGET_OS),cygwin) ADDITIONAL_OBJCFLAGS += -DBUILD_libgnustep_base_DLL=1 else ifeq ($(GNUSTEP_TARGET_OS),windows) ADDITIONAL_OBJCFLAGS += -DBUILD_libgnustep_base_DLL=1 endif # Additional flags to pass to the C compiler ADDITIONAL_CFLAGS = # Additional include directories the compiler should search ADDITIONAL_INCLUDE_DIRS = -I../$(GNUSTEP_TARGET_DIR) -I../ # We include the main base Headers if we are building using the base library # (but not if we are using the Apple foundation). ifeq ($(FOUNDATION_LIB),gnu) ADDITIONAL_INCLUDE_DIRS += -I../../Headers endif # Additional LDFLAGS to pass to the linker ADDITIONAL_LDFLAGS = gnustep-base-1.29.0/Source/Additions/NSArray+GNUstepBase.m000066400000000000000000000102151435650067400232000ustar00rootroot00000000000000/* Implementation of extension methods to base additions Copyright (C) 2010 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #import "common.h" #import "Foundation/NSException.h" #import "GNUstepBase/NSArray+GNUstepBase.h" #import "GSPrivate.h" @implementation NSArray (GNUstepBase) - (NSUInteger) insertionPosition: (id)item usingFunction: (NSComparisonResult (*)(id, id, void *))sorter context: (void *)context { NSUInteger count = [self count]; NSUInteger upper = count; NSUInteger lower = 0; NSUInteger index; SEL oaiSel; id (*oai)(id,SEL,NSUInteger); if (item == nil) { [NSException raise: NSGenericException format: @"Attempt to find position for nil object in array"]; } if (sorter == 0) { [NSException raise: NSGenericException format: @"Attempt to find position with null comparator"]; } oaiSel = @selector(objectAtIndex:); oai = (id(*)(id,SEL,NSUInteger))[self methodForSelector: oaiSel]; /* * Binary search for an item equal to the one to be inserted. */ for (index = upper/2; upper != lower; index = lower+(upper-lower)/2) { NSComparisonResult comparison; comparison = (*sorter)(item, (*oai)(self, oaiSel, index), context); if (comparison == NSOrderedAscending) { upper = index; } else if (comparison == NSOrderedDescending) { lower = index + 1; } else { break; } } /* * Now skip past any equal items so the insertion point is AFTER any * items that are equal to the new one. */ while (index < count && (*sorter)(item, (*oai)(self, oaiSel, index), context) != NSOrderedAscending) { index++; } return index; } - (NSUInteger) insertionPosition: (id)item usingSelector: (SEL)comp { NSUInteger count = [self count]; NSUInteger upper = count; NSUInteger lower = 0; NSUInteger index; NSComparisonResult (*imp)(id, SEL, id); SEL oaiSel; id (*oai)(id,SEL,NSUInteger); if (item == nil) { [NSException raise: NSGenericException format: @"Attempt to find position for nil object in array"]; } if (comp == 0) { [NSException raise: NSGenericException format: @"Attempt to find position with null comparator"]; } imp = (NSComparisonResult (*)(id, SEL, id))[item methodForSelector: comp]; if (imp == 0) { [NSException raise: NSGenericException format: @"Attempt to find position with unknown method"]; } oaiSel = @selector(objectAtIndex:); oai = (id(*)(id,SEL,NSUInteger))[self methodForSelector: oaiSel]; /* * Binary search for an item equal to the one to be inserted. */ for (index = upper/2; upper != lower; index = lower+(upper-lower)/2) { NSComparisonResult comparison; comparison = (*imp)(item, comp, (*oai)(self, oaiSel, index)); if (comparison == NSOrderedAscending) { upper = index; } else if (comparison == NSOrderedDescending) { lower = index + 1; } else { break; } } /* * Now skip past any equal items so the insertion point is AFTER any * items that are equal to the new one. */ while (index < count && (*imp)(item, comp, (*oai)(self, oaiSel, index)) != NSOrderedAscending) { index++; } return index; } @end gnustep-base-1.29.0/Source/Additions/NSAttributedString+GNUstepBase.m000066400000000000000000000025721435650067400254270ustar00rootroot00000000000000/* Implementation of extension methods to base additions Copyright (C) 2010 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #import "common.h" #import "Foundation/NSDebug.h" #import "Foundation/NSException.h" #import "GNUstepBase/NSAttributedString+GNUstepBase.h" #import "GNUstepBase/NSDebug+GNUstepBase.h" @implementation NSAttributedString (GNUstepBase) - (NSAttributedString*) attributedSubstringWithRange: (NSRange)aRange { GSOnceMLog(@"This method is deprecated, use -attributedSubstringFromRange:"); return [self attributedSubstringFromRange: aRange]; } @end gnustep-base-1.29.0/Source/Additions/NSBundle+GNUstepBase.m000066400000000000000000000037201435650067400233360ustar00rootroot00000000000000 /* Implementation of extension methods to base additions Copyright (C) 2010 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #import "common.h" #import "Foundation/NSArray.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSException.h" #import "Foundation/NSPathUtilities.h" #import "Foundation/NSSet.h" #import "GNUstepBase/NSBundle+GNUstepBase.h" @implementation NSBundle(GNUstepBase) // In NSBundle.m + (NSString *) pathForLibraryResource: (NSString *)name ofType: (NSString *)ext inDirectory: (NSString *)bundlePath { NSString *path = nil; NSString *bundle_path = nil; NSArray *paths; NSBundle *bundle; NSEnumerator *enumerator; /* Gather up the paths */ paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSAllDomainsMask, YES); enumerator = [paths objectEnumerator]; while ((path == nil) && (bundle_path = [enumerator nextObject])) { bundle = [self bundleWithPath: bundle_path]; path = [bundle pathForResource: name ofType: ext inDirectory: bundlePath]; } return path; } @end gnustep-base-1.29.0/Source/Additions/NSCalendarDate+GNUstepBase.m000066400000000000000000000052071435650067400244360ustar00rootroot00000000000000/* Implementation of extension methods to base additions Copyright (C) 2010 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #import "common.h" #import "Foundation/NSAutoreleasePool.h" #import "GNUstepBase/NSCalendarDate+GNUstepBase.h" /** * Extension methods for the NSCalendarDate class */ @implementation NSCalendarDate (GNUstepBase) - (NSUInteger) isoYear { NSUInteger year = [self yearOfCommonEra]; NSUInteger week = [self weekOfYear]; NSUInteger month = [self monthOfYear]; if (week == 1 && month == 12) { year++; } else if (week >= 52 && month == 1) { year--; } return year; } - (NSInteger) weekOfYear { NSInteger dayOfWeek = [self dayOfWeek]; NSInteger dayOfYear; /* * Whether a week is considered to be in a year or not depends on its * thursday ... so find thursday for the receivers week. * NB. this may result in a date which is not in the same year as the * receiver. */ if (dayOfWeek != 4) { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSCalendarDate *thursday; /* * A week starts on monday ... so adjust from 0 to 7 so that a * sunday is counted as the last day of the week. */ if (dayOfWeek == 0) { dayOfWeek = 7; } thursday = [self dateByAddingYears: 0 months: 0 days: 4 - dayOfWeek hours: 0 minutes: 0 seconds: 0]; dayOfYear = [thursday dayOfYear]; [arp drain]; } else { dayOfYear = [self dayOfYear]; } /* * Round up to a week boundary, so that when we divide by seven we * get a result in the range 1 to 53 as mandated by the ISO standard. * Note that dayOfYear starts at 1, too, and hence we must be careful * to not round up an exact multiple of 7. */ dayOfYear += (7 - (dayOfYear - 1) % 7); return dayOfYear / 7; } @end gnustep-base-1.29.0/Source/Additions/NSData+GNUstepBase.m000066400000000000000000000615421435650067400230040ustar00rootroot00000000000000/* Implementation of extension methods to base additions Copyright (C) 2010 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #import "common.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSByteOrder.h" #import "Foundation/NSException.h" #import "GNUstepBase/NSData+GNUstepBase.h" #import "GNUstepBase/NSString+GNUstepBase.h" #include #if USE_ZLIB #include #endif #if defined(_WIN32) #include #else #include #endif static int randombytes(uint8_t *buf, unsigned len) { #if defined(_WIN32) HCRYPTPROV hProvider = 0; if (!CryptAcquireContextW(&hProvider, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_SILENT)) { return -1; } if (!CryptGenRandom(hProvider, len, buf)) { CryptReleaseContext(hProvider, 0); return -1; } CryptReleaseContext(hProvider, 0); #else int devUrandom; ssize_t bytesRead; devUrandom = open("/dev/urandom", O_RDONLY); if (devUrandom == -1) { return -1; } bytesRead = read(devUrandom, buf, len); close(devUrandom); if (bytesRead != len) { return -1; } #endif return 0; } /** * Extension methods for the NSData class. */ @implementation NSData (GNUstepBase) + (id) dataWithRandomBytesOfLength: (NSUInteger)length { uint8_t *buf = 0; NSData *d; if (0 == length || length > 0xffffffff) { return nil; // Unreasonable length for random data } buf = malloc(length); if (0 == buf) { return nil; // Not enough memory for random data } if (randombytes(buf, (unsigned)length) < 0) { free(buf); return nil; // Unable to generate the random data } d = [[self alloc] initWithBytesNoCopy: buf length: length freeWhenDone: YES]; if (nil == d) { free(buf); return nil; // Unable to create NSData instance } return AUTORELEASE(d); } - (NSString*) escapedRepresentation { char *buf; NSUInteger len; NSString *string; buf = [self escapedRepresentation: &len]; string = [[NSString alloc] initWithBytesNoCopy: buf length: len encoding: NSASCIIStringEncoding freeWhenDone: YES]; return AUTORELEASE(string); } - (char*) escapedRepresentation: (NSUInteger*)length { const uint8_t *bytes = (const uint8_t*)[self bytes]; uint8_t *buf; NSUInteger count = [self length]; NSUInteger size = count + 1; NSUInteger index; NSUInteger pos; for (index = 0; index < count; index++) { uint8_t b = bytes[index]; if ('\n' == b) size++; else if ('\r' == b) size++; else if ('\t' == b) size++; else if ('\\' == b) size++; else if (b < 32 || b > 126) size += 3; } buf = (uint8_t*)malloc(size); for (pos = index = 0; index < count; index++) { uint8_t b = bytes[index]; if ('\n' == b) { buf[pos++] = '\\'; buf[pos++] = 'n'; } else if ('\r' == b) { buf[pos++] = '\\'; buf[pos++] = 'r'; } else if ('\t' == b) { buf[pos++] = '\\'; buf[pos++] = 't'; } else if ('\\' == b) { buf[pos++] = '\\'; buf[pos++] = '\\'; } else if (b < 32 || b > 126) { sprintf((char*)&buf[pos], "\\x%02x", b); pos += 4; } else { buf[pos++] = b; } } buf[pos] = '\0'; if (0 != length) { *length = pos; } return (char*)buf; } - (NSString*) hexadecimalRepresentation { char *buf; NSUInteger len; NSString *string; buf = [self hexadecimalRepresentation: &len]; string = [[NSString alloc] initWithBytesNoCopy: buf length: len encoding: NSASCIIStringEncoding freeWhenDone: YES]; return AUTORELEASE(string); } - (char*) hexadecimalRepresentation: (NSUInteger*)length { static const char *hexChars = "0123456789ABCDEF"; unsigned slen = [self length]; unsigned dlen = slen * 2; const unsigned char *src = (const unsigned char *)[self bytes]; char *dst; unsigned spos = 0; unsigned dpos = 0; dst = (char*)malloc(dlen + 1); while (spos < slen) { unsigned char c = src[spos++]; dst[dpos++] = hexChars[(c >> 4) & 0x0f]; dst[dpos++] = hexChars[c & 0x0f]; } dst[dpos] = '\0'; if (0 != length) { *length = dpos; } return dst; } - (NSData*) gunzipped { #if USE_ZLIB NSUInteger length = [self length]; z_stream stream; if (NO == [self isGzipped]) { return self; } stream.zalloc = Z_NULL; stream.zfree = Z_NULL; stream.avail_in = (unsigned)length; stream.next_in = (uint8_t *)[self bytes]; stream.total_out = 0; stream.avail_out = 0; if (inflateInit2(&stream, 15 + 32) == Z_OK) // inflate or gzip { NSZone *zone = NSDefaultMallocZone(); uint8_t *dst; unsigned capacity; int status = Z_OK; capacity = 2 * length; dst = NSZoneMalloc(zone, capacity); while (Z_OK == status) { if (stream.total_out >= capacity) { capacity += length / 2; dst = NSZoneRealloc(zone, dst, capacity); } stream.next_out = dst + stream.total_out; stream.avail_out = (unsigned)(capacity - stream.total_out); status = inflate(&stream, Z_SYNC_FLUSH); } if (inflateEnd(&stream) == Z_OK) { if (Z_STREAM_END == status) { NSMutableData *result; result = [NSMutableData alloc]; result = [result initWithBytesNoCopy: dst length: stream.total_out freeWhenDone: YES]; return AUTORELEASE(result); } } NSZoneFree(zone, dst); } #else [NSException raise: NSGenericException format: @"library was configured without zlib support"]; #endif return nil; } - (NSData*) gzipped: (int)compressionLevel { #if USE_ZLIB NSUInteger length = [self length]; z_stream stream; stream.zalloc = Z_NULL; stream.zfree = Z_NULL; stream.opaque = Z_NULL; stream.avail_in = (unsigned)length; stream.next_in = (uint8_t*)[self bytes]; stream.total_out = 0; stream.avail_out = 0; if (compressionLevel < 0 || compressionLevel > 9) { compressionLevel = Z_DEFAULT_COMPRESSION; } if (deflateInit2(&stream, compressionLevel, Z_DEFLATED, 31, 8, Z_DEFAULT_STRATEGY) == Z_OK) { NSMutableData *result; NSZone *zone = NSDefaultMallocZone(); unsigned capacity = 1024 * 16; uint8_t *dst; dst = NSZoneMalloc(zone, capacity); while (stream.avail_out == 0) { if (stream.total_out >= capacity) { capacity += 1024 * 16; dst = NSZoneRealloc(zone, dst, capacity); } stream.next_out = dst + stream.total_out; stream.avail_out = (unsigned)(capacity - stream.total_out); (void)deflate(&stream, Z_FINISH); } deflateEnd(&stream); result = [NSMutableData alloc]; result = [result initWithBytesNoCopy: dst length: stream.total_out freeWhenDone: YES]; return AUTORELEASE(result); } #else [NSException raise: NSGenericException format: @"library was configured without zlib support"]; #endif return nil; } /** * Initialises the receiver with the supplied string data which contains * a hexadecimal coding of the bytes. The parsing of the string is * fairly tolerant, ignoring whitespace and permitting both upper and * lower case hexadecimal digits (the -hexadecimalRepresentation method * produces a string using only uppercase digits with no white space).
* If the string does not contain one or more pairs of hexadecimal digits * then an exception is raised. */ - (id) initWithHexadecimalRepresentation: (NSString*)string { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSData *d; const char *src; const char *end; unsigned char *dst; unsigned int pos = 0; unsigned char byte = 0; BOOL high = NO; d = [string dataUsingEncoding: NSASCIIStringEncoding allowLossyConversion: YES]; src = (const char*)[d bytes]; end = src + [d length]; dst = NSZoneMalloc(NSDefaultMallocZone(), [d length]/2 + 1); while (src < end) { char c = *src++; unsigned char v; if (isspace(c)) { continue; } if (c >= '0' && c <= '9') { v = c - '0'; } else if (c >= 'A' && c <= 'F') { v = c - 'A' + 10; } else if (c >= 'a' && c <= 'f') { v = c - 'a' + 10; } else { pos = 0; break; } if (high == NO) { byte = v << 4; high = YES; } else { byte |= v; high = NO; dst[pos++] = byte; } } if (pos > 0 && high == NO) { self = [self initWithBytes: dst length: pos]; } else { DESTROY(self); } NSZoneFree(NSDefaultMallocZone(), dst); [arp drain]; if (self == nil) { [NSException raise: NSInvalidArgumentException format: @"%@: invalid hexadecimal string data", NSStringFromSelector(_cmd)]; } return self; } - (BOOL) isGzipped { NSUInteger length = [self length]; const uint8_t *bytes = (const uint8_t *)[self bytes]; return (length >= 2 && bytes[0] == 0x1f && bytes[1] == 0x8b) ? YES : NO; } struct MD5Context { uint32_t buf[4]; uint32_t bits[2]; uint8_t in[64]; }; static void MD5Init (struct MD5Context *context); static void MD5Update (struct MD5Context *context, unsigned char const *buf, unsigned len); static void MD5Final (unsigned char digest[16], struct MD5Context *context); static void MD5Transform (uint32_t buf[4], uint32_t const in[16]); /* * This code implements the MD5 message-digest algorithm. * The algorithm is due to Ron Rivest. This code was * written by Colin Plumb in 1993, no copyright is claimed. * This code is in the public domain; do with it what you wish. * * Equivalent code is available from RSA Data Security, Inc. * This code has been tested against that, and is equivalent, * except that you don't need to include two pages of legalese * with every copy. * * To compute the message digest of a chunk of bytes, declare an * MD5Context structure, pass it to MD5Init, call MD5Update as * needed on buffers full of bytes, and then call MD5Final, which * will fill a supplied 16-byte array with the digest. */ /* * Ensure data is little-endian */ static void littleEndian (void *buf, unsigned words) { if (NSHostByteOrder() == NS_BigEndian) { while (words-- > 0) { union swap { uint32_t num; uint8_t byt[4]; } tmp; uint8_t b0; uint8_t b1; tmp.num = ((uint32_t*)buf)[words]; b0 = tmp.byt[0]; b1 = tmp.byt[1]; tmp.byt[0] = tmp.byt[3]; tmp.byt[1] = tmp.byt[2]; tmp.byt[2] = b1; tmp.byt[3] = b0; ((uint32_t*)buf)[words] = tmp.num; } } } /* * Start MD5 accumulation. Set bit count to 0 and buffer to mysterious * initialization constants. */ static void MD5Init (struct MD5Context *ctx) { ctx->buf[0] = 0x67452301; ctx->buf[1] = 0xefcdab89; ctx->buf[2] = 0x98badcfe; ctx->buf[3] = 0x10325476; ctx->bits[0] = 0; ctx->bits[1] = 0; } /* * Update context to reflect the concatenation of another buffer full * of bytes. */ static void MD5Update (struct MD5Context *ctx, unsigned char const *buf, unsigned len) { uint32_t t; /* Update bitcount */ t = ctx->bits[0]; if ((ctx->bits[0] = t + ((uint32_t) len << 3)) < t) ctx->bits[1]++; /* Carry from low to high */ ctx->bits[1] += len >> 29; t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */ /* Handle any leading odd-sized chunks */ if (t) { unsigned char *p = (unsigned char *) ctx->in + t; t = 64 - t; if (len < t) { memcpy (p, buf, len); return; } memcpy (p, buf, t); littleEndian (ctx->in, 16); MD5Transform (ctx->buf, (uint32_t *) ctx->in); buf += t; len -= t; } /* Process data in 64-byte chunks */ while (len >= 64) { memcpy (ctx->in, buf, 64); littleEndian (ctx->in, 16); MD5Transform (ctx->buf, (uint32_t *) ctx->in); buf += 64; len -= 64; } /* Handle any remaining bytes of data. */ memcpy (ctx->in, buf, len); } /* * Final wrapup - pad to 64-byte boundary with the bit pattern * 1 0* (64-bit count of bits processed, MSB-first) */ static void MD5Final (unsigned char digest[16], struct MD5Context *ctx) { unsigned count; unsigned char *p; /* Compute number of bytes mod 64 */ count = (ctx->bits[0] >> 3) & 0x3F; /* Set the first char of padding to 0x80. This is safe since there is always at least one byte free */ p = ctx->in + count; *p++ = 0x80; /* Bytes of padding needed to make 64 bytes */ count = 64 - 1 - count; /* Pad out to 56 mod 64 */ if (count < 8) { /* Two lots of padding: Pad the first block to 64 bytes */ memset (p, 0, count); littleEndian (ctx->in, 16); MD5Transform (ctx->buf, (uint32_t *) ctx->in); /* Now fill the next block with 56 bytes */ memset (ctx->in, 0, 56); } else { /* Pad block to 56 bytes */ memset (p, 0, count - 8); } littleEndian (ctx->in, 14); /* Append length in bits and transform */ ((uint32_t *) ctx->in)[14] = ctx->bits[0]; ((uint32_t *) ctx->in)[15] = ctx->bits[1]; MD5Transform (ctx->buf, (uint32_t *) ctx->in); littleEndian ((unsigned char *) ctx->buf, 4); memcpy (digest, ctx->buf, 16); memset (ctx, 0, sizeof (*ctx)); /* In case it's sensitive */ } /* The four core functions - F1 is optimized somewhat */ /* #define F1(x, y, z) (x & y | ~x & z) */ #define F1(x, y, z) (z ^ (x & (y ^ z))) #define F2(x, y, z) F1(z, x, y) #define F3(x, y, z) (x ^ y ^ z) #define F4(x, y, z) (y ^ (x | ~z)) /* This is the central step in the MD5 algorithm. */ #define MD5STEP(f, w, x, y, z, data, s) \ (w += f(x, y, z) + data, w = w<>(32-s), w += x) /* * The core of the MD5 algorithm, this alters an existing MD5 hash to * reflect the addition of 16 43bit words of new data. MD5Update blocks * the data and converts bytes into 43bit words for this routine. */ static void MD5Transform (uint32_t buf[4], uint32_t const in[16]) { register uint32_t a, b, c, d; a = buf[0]; b = buf[1]; c = buf[2]; d = buf[3]; MD5STEP (F1, a, b, c, d, in[0] + 0xd76aa478, 7); MD5STEP (F1, d, a, b, c, in[1] + 0xe8c7b756, 12); MD5STEP (F1, c, d, a, b, in[2] + 0x242070db, 17); MD5STEP (F1, b, c, d, a, in[3] + 0xc1bdceee, 22); MD5STEP (F1, a, b, c, d, in[4] + 0xf57c0faf, 7); MD5STEP (F1, d, a, b, c, in[5] + 0x4787c62a, 12); MD5STEP (F1, c, d, a, b, in[6] + 0xa8304613, 17); MD5STEP (F1, b, c, d, a, in[7] + 0xfd469501, 22); MD5STEP (F1, a, b, c, d, in[8] + 0x698098d8, 7); MD5STEP (F1, d, a, b, c, in[9] + 0x8b44f7af, 12); MD5STEP (F1, c, d, a, b, in[10] + 0xffff5bb1, 17); MD5STEP (F1, b, c, d, a, in[11] + 0x895cd7be, 22); MD5STEP (F1, a, b, c, d, in[12] + 0x6b901122, 7); MD5STEP (F1, d, a, b, c, in[13] + 0xfd987193, 12); MD5STEP (F1, c, d, a, b, in[14] + 0xa679438e, 17); MD5STEP (F1, b, c, d, a, in[15] + 0x49b40821, 22); MD5STEP (F2, a, b, c, d, in[1] + 0xf61e2562, 5); MD5STEP (F2, d, a, b, c, in[6] + 0xc040b340, 9); MD5STEP (F2, c, d, a, b, in[11] + 0x265e5a51, 14); MD5STEP (F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20); MD5STEP (F2, a, b, c, d, in[5] + 0xd62f105d, 5); MD5STEP (F2, d, a, b, c, in[10] + 0x02441453, 9); MD5STEP (F2, c, d, a, b, in[15] + 0xd8a1e681, 14); MD5STEP (F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20); MD5STEP (F2, a, b, c, d, in[9] + 0x21e1cde6, 5); MD5STEP (F2, d, a, b, c, in[14] + 0xc33707d6, 9); MD5STEP (F2, c, d, a, b, in[3] + 0xf4d50d87, 14); MD5STEP (F2, b, c, d, a, in[8] + 0x455a14ed, 20); MD5STEP (F2, a, b, c, d, in[13] + 0xa9e3e905, 5); MD5STEP (F2, d, a, b, c, in[2] + 0xfcefa3f8, 9); MD5STEP (F2, c, d, a, b, in[7] + 0x676f02d9, 14); MD5STEP (F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); MD5STEP (F3, a, b, c, d, in[5] + 0xfffa3942, 4); MD5STEP (F3, d, a, b, c, in[8] + 0x8771f681, 11); MD5STEP (F3, c, d, a, b, in[11] + 0x6d9d6122, 16); MD5STEP (F3, b, c, d, a, in[14] + 0xfde5380c, 23); MD5STEP (F3, a, b, c, d, in[1] + 0xa4beea44, 4); MD5STEP (F3, d, a, b, c, in[4] + 0x4bdecfa9, 11); MD5STEP (F3, c, d, a, b, in[7] + 0xf6bb4b60, 16); MD5STEP (F3, b, c, d, a, in[10] + 0xbebfbc70, 23); MD5STEP (F3, a, b, c, d, in[13] + 0x289b7ec6, 4); MD5STEP (F3, d, a, b, c, in[0] + 0xeaa127fa, 11); MD5STEP (F3, c, d, a, b, in[3] + 0xd4ef3085, 16); MD5STEP (F3, b, c, d, a, in[6] + 0x04881d05, 23); MD5STEP (F3, a, b, c, d, in[9] + 0xd9d4d039, 4); MD5STEP (F3, d, a, b, c, in[12] + 0xe6db99e5, 11); MD5STEP (F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); MD5STEP (F3, b, c, d, a, in[2] + 0xc4ac5665, 23); MD5STEP (F4, a, b, c, d, in[0] + 0xf4292244, 6); MD5STEP (F4, d, a, b, c, in[7] + 0x432aff97, 10); MD5STEP (F4, c, d, a, b, in[14] + 0xab9423a7, 15); MD5STEP (F4, b, c, d, a, in[5] + 0xfc93a039, 21); MD5STEP (F4, a, b, c, d, in[12] + 0x655b59c3, 6); MD5STEP (F4, d, a, b, c, in[3] + 0x8f0ccc92, 10); MD5STEP (F4, c, d, a, b, in[10] + 0xffeff47d, 15); MD5STEP (F4, b, c, d, a, in[1] + 0x85845dd1, 21); MD5STEP (F4, a, b, c, d, in[8] + 0x6fa87e4f, 6); MD5STEP (F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); MD5STEP (F4, c, d, a, b, in[6] + 0xa3014314, 15); MD5STEP (F4, b, c, d, a, in[13] + 0x4e0811a1, 21); MD5STEP (F4, a, b, c, d, in[4] + 0xf7537e82, 6); MD5STEP (F4, d, a, b, c, in[11] + 0xbd3af235, 10); MD5STEP (F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15); MD5STEP (F4, b, c, d, a, in[9] + 0xeb86d391, 21); buf[0] += a; buf[1] += b; buf[2] += c; buf[3] += d; } /** * Creates an MD5 digest of the information stored in the receiver and * returns it as an autoreleased 16 byte NSData object.
* If you need to produce a digest of string information, you need to * decide what character encoding is to be used and convert your string * to a data object of that encoding type first using the * [NSString-dataUsingEncoding:] method - * * myDigest = [[myString dataUsingEncoding: NSUTF8StringEncoding] md5Digest]; * * If you need to use the digest in a human readable form, you will * probably want it to be seen as 32 hexadecimal digits, and can do that * using the -hexadecimalRepresentation method. */ - (NSData*) md5Digest { struct MD5Context ctx; unsigned char digest[16]; MD5Init(&ctx); MD5Update(&ctx, [self bytes], [self length]); MD5Final(digest, &ctx); return [NSData dataWithBytes: digest length: 16]; } /** * Decodes the source data from uuencoded and return the result.
* Returns the encoded file name in namePtr if it is not null. * Returns the encoded file mode in modePtr if it is not null. */ - (BOOL) uudecodeInto: (NSMutableData*)decoded name: (NSString**)namePtr mode: (NSInteger*)modePtr { const unsigned char *bytes = (const unsigned char*)[self bytes]; unsigned length = [self length]; unsigned decLength = [decoded length]; unsigned pos = 0; NSString *name = nil; if (namePtr != 0) { *namePtr = nil; } if (modePtr != 0) { *modePtr = 0; } #define DEC(c) (((c) - ' ') & 077) for (pos = 0; pos < length; pos++) { if (bytes[pos] == '\n') { if (name != nil) { unsigned i = 0; int lineLength; unsigned char *decPtr; lineLength = DEC(bytes[i++]); if (lineLength <= 0) { break; // Got line length zero or less. } [decoded setLength: decLength + lineLength]; decPtr = [decoded mutableBytes]; while (lineLength > 0) { unsigned char tmp[4]; int c; /* * In case the data is corrupt, we need to copy into * a temporary buffer avoiding buffer overrun in the * main buffer. */ tmp[0] = bytes[i++]; if (i < pos) { tmp[1] = bytes[i++]; if (i < pos) { tmp[2] = bytes[i++]; if (i < pos) { tmp[3] = bytes[i++]; } else { tmp[3] = 0; } } else { tmp[2] = 0; tmp[3] = 0; } } else { tmp[1] = 0; tmp[2] = 0; tmp[3] = 0; } if (lineLength >= 1) { c = DEC(tmp[0]) << 2 | DEC(tmp[1]) >> 4; decPtr[decLength++] = (unsigned char)c; } if (lineLength >= 2) { c = DEC(tmp[1]) << 4 | DEC(tmp[2]) >> 2; decPtr[decLength++] = (unsigned char)c; } if (lineLength >= 3) { c = DEC(tmp[2]) << 6 | DEC(tmp[3]); decPtr[decLength++] = (unsigned char)c; } lineLength -= 3; } } else if (pos > 6 && strncmp((const char*)bytes, "begin ", 6) == 0) { unsigned off = 6; unsigned end = pos; int mode = 0; NSData *d; if (end > off && bytes[end-1] == '\r') { end--; } while (off < end && bytes[off] >= '0' && bytes[off] <= '7') { mode *= 8; mode += bytes[off] - '0'; off++; } if (modePtr != 0) { *modePtr = mode; } while (off < end && bytes[off] == ' ') { off++; } d = [NSData dataWithBytes: &bytes[off] length: end - off]; name = [[NSString alloc] initWithData: d encoding: NSASCIIStringEncoding]; IF_NO_ARC(AUTORELEASE(name);) if (namePtr != 0) { *namePtr = name; } } pos++; bytes += pos; length -= pos; } } if (name == nil) { return NO; } return YES; } /** * Encode the source data to uuencoded.
* Uses the supplied name as the filename in the encoded data, * and says that the file mode is as specified.
* If no name is supplied, uses untitled as the name. */ - (BOOL) uuencodeInto: (NSMutableData*)encoded name: (NSString*)name mode: (NSInteger)mode { const unsigned char *bytes = (const unsigned char*)[self bytes]; int length = [self length]; unsigned char buf[64]; unsigned i; name = [name stringByTrimmingSpaces]; if ([name length] == 0) { name = @"untitled"; } /* * The header is a line of the form 'begin mode filename' */ snprintf((char*)buf, sizeof(buf), "begin %03o ", (int)mode); [encoded appendBytes: buf length: strlen((const char*)buf)]; [encoded appendData: [name dataUsingEncoding: NSASCIIStringEncoding]]; [encoded appendBytes: "\n" length: 1]; #define ENC(c) ((c) > 0 ? ((c) & 077) + ' ': '`') while (length > 0) { int count; unsigned pos; /* * We want up to 45 bytes in a line ... and we record the * number of bytes as the initial output character. */ count = length; if (count > 45) { count = 45; } i = 0; buf[i++] = ENC(count); /* * Now we encode the actual data for the line. */ for (pos = 0; count > 0; count -= 3) { unsigned char tmp[3]; int c; /* * Copy data into a temporary buffer ensuring we don't * overrun the end of the original buffer risking access * violation. */ tmp[0] = bytes[pos++]; if (pos < length) { tmp[1] = bytes[pos++]; if (pos < length) { tmp[2] = bytes[pos++]; } else { tmp[2] = 0; } } else { tmp[1] = 0; tmp[2] = 0; } c = tmp[0] >> 2; buf[i++] = ENC(c); c = ((tmp[0] << 4) & 060) | ((tmp[1] >> 4) & 017); buf[i++] = ENC(c); c = ((tmp[1] << 2) & 074) | ((tmp[2] >> 6) & 03); buf[i++] = ENC(c); c = tmp[2] & 077; buf[i++] = ENC(c); } bytes += pos; length -= pos; buf[i++] = '\n'; [encoded appendBytes: buf length: i]; } /* * Encode a line of length zero followed by 'end' as the terminator. */ [encoded appendBytes: "`\nend\n" length: 6]; return YES; } @end gnustep-base-1.29.0/Source/Additions/NSDebug+GNUstepBase.m000066400000000000000000000035741435650067400231620ustar00rootroot00000000000000/** Debugging utilities for GNUStep and OpenStep Copyright (C) 1997,1999,2000,2001 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: August 1997 Extended by: Nicola Pero Date: December 2000, April 2001 This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. $Date: 2010-02-17 11:47:06 +0000 (Wed, 17 Feb 2010) $ $Revision: 29657 $ */ #import "common.h" #import "GNUstepBase/GSObjCRuntime.h" #import "GNUstepBase/NSDebug+GNUstepBase.h" GS_DECLARE NSString* GSDebugFunctionMsg(const char *func, const char *file, int line, NSString *fmt) { NSString *message; message = [NSString stringWithFormat: @"File %s: %d. In %s %@", file, line, func, fmt]; return message; } GS_DECLARE NSString* GSDebugMethodMsg(id obj, SEL sel, const char *file, int line, NSString *fmt) { NSString *message; Class cls = [obj class]; char c = '-'; if (class_isMetaClass(cls)) { cls = (Class)obj; c = '+'; } message = [NSString stringWithFormat: @"File %s: %d. In [%@ %c%@] %@", file, line, NSStringFromClass(cls), c, NSStringFromSelector(sel), fmt]; return message; } gnustep-base-1.29.0/Source/Additions/NSError+GNUstepBase.m000066400000000000000000000103341435650067400232150ustar00rootroot00000000000000/* Implementation of extension methods to base additions Copyright (C) 2010 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #import "common.h" #include #import "Foundation/NSDictionary.h" #import "Foundation/NSError.h" #import "Foundation/NSLock.h" #import "GSPrivate.h" /** * GNUstep specific (non-standard) additions to the NSError class. * Possibly to be made public */ @implementation NSError(GNUstepBase) #if !defined(_WIN32) #if !defined(HAVE_STRERROR_R) #if defined(HAVE_STRERROR) static int strerror_r(int eno, char *buf, int len) { const char *ptr; int result; [gnustep_global_lock lock]; ptr = strerror(eno); if (ptr == 0) { strncpy(buf, "unknown error number", len - 1); result = -1; } else { strncpy(buf, strerror(eno), len - 1); result = 0; } buf[len - 1] = '\0'; [gnustep_global_lock unlock]; return result; } #else static int strerror_r(int eno, char *buf, int len) { extern char *sys_errlist[]; extern int sys_nerr; if (eno < 0 || eno >= sys_nerr) { strncpy(buf, "unknown error number", len - 1); return -1; } strncpy(buf, sys_errlist[eno], len - 1); buf[len - 1] = '\0'; return 0; } #endif #endif #endif /* Returns an NSError instance encapsulating the last system error, * or nil if the last system call did not result in an error. * The user info dictionary of this object will be mutable, so that * additional information can be placed in it by higher level code. */ + (NSError*) _last { int eno; #if defined(_WIN32) eno = GetLastError(); if (eno == 0) eno = errno; #else eno = errno; #endif if (0 == eno) { return nil; } return [self _systemError: eno]; } + (NSError*) _systemError: (long)code { NSError *error; NSString *domain; NSDictionary *info; #if defined(_WIN32) LPVOID lpMsgBuf; NSString *message=nil; domain = NSOSStatusErrorDomain; FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, code, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPWSTR) &lpMsgBuf, 0, NULL ); if (lpMsgBuf != NULL) { message = [NSString stringWithCharacters: lpMsgBuf length: wcslen(lpMsgBuf)]; LocalFree(lpMsgBuf); } info = [NSMutableDictionary dictionaryWithObjectsAndKeys: message, NSLocalizedDescriptionKey, nil]; #else NSString *message; char buf[BUFSIZ]; # if STRERROR_R_CHAR_P char *result; # else int result; #endif /* FIXME ... not all are POSIX, should we use NSMachErrorDomain for some? */ domain = NSPOSIXErrorDomain; result = strerror_r(code, buf, BUFSIZ); # if STRERROR_R_CHAR_P if (result == 0) { snprintf(buf, sizeof(buf), "%ld", code); result = buf; } message = [NSString stringWithCString: result encoding: [NSString defaultCStringEncoding]]; # else if (result < 0) { snprintf(buf, sizeof(buf), "%ld", code); } message = [NSString stringWithCString: buf encoding: [NSString defaultCStringEncoding]]; # endif /* FIXME ... can we do better localisation? */ info = [NSMutableDictionary dictionaryWithObjectsAndKeys: message, NSLocalizedDescriptionKey, nil]; #endif /* NB we use a mutable dictionary so that calling code can add extra * information to the dictionary before passing it up to higher level * code. */ error = [self errorWithDomain: domain code: code userInfo: info]; return error; } @end gnustep-base-1.29.0/Source/Additions/NSFileHandle+GNUstepBase.m000066400000000000000000000141011435650067400241130ustar00rootroot00000000000000/* Implementation of extension methods to base additions Copyright (C) 2010 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #import "common.h" #if defined(NeXT_Foundation_LIBRARY) #import "Foundation/NSByteOrder.h" #import "Foundation/NSHost.h" #import "GSNetwork.h" #import "GSPrivate.h" #import "GNUstepBase/NSFileHandle+GNUstepBase.h" /* Not defined on Solaris 2.7 */ #ifndef INADDR_NONE #define INADDR_NONE -1 #endif @implementation NSFileHandle(GNUstepBase) // From GSFileHandle.m static BOOL getAddr(NSString* name, NSString* svc, NSString* pcl, struct addrinfo **ai, struct addrinfo *hints) { const char *cHostn = NULL; const char *cPortn = NULL; int e = 0; if (!svc) { NSLog(@"service is nil."); return NO; } hints->ai_flags = AI_PASSIVE | AI_ADDRCONFIG; hints->ai_protocol = IPPROTO_IP; // accept any if (pcl) { if ([pcl isEqualToString:@"tcp"]) { hints->ai_protocol = IPPROTO_TCP; hints->ai_socktype = SOCK_STREAM; } else if ([pcl isEqualToString:@"udp"]) { hints->ai_protocol = IPPROTO_UDP; } } /* * If we were given a hostname, we use any address for that host. * Otherwise we expect the given name to be an address unless it is * a null (any address). */ if (name) { NSHost* host = [NSHost hostWithName: name]; if (host != nil) { name = [host address]; NSLog(@"host address '%@'", name); cHostn = [name cStringUsingEncoding:NSASCIIStringEncoding]; } } cPortn = [svc cStringUsingEncoding:NSASCIIStringEncoding]; // getaddrinfo() returns zero on success or one of the error codes listed in // gai_strerror(3) if an error occurs. NSLog(@"cPortn '%s'", cPortn); //&ai e = getaddrinfo (cHostn, cPortn, hints, ai); if (e != 0) { NSLog(@"getaddrinfo: %s", gai_strerror (e)); return NO; } return YES; } - (id) initAsServerAtAddress: (NSString*)a service: (NSString*)s protocol: (NSString*)p { #ifndef BROKEN_SO_REUSEADDR int status = 1; #endif int net; struct addrinfo *ai; struct addrinfo hints; memset (&hints, '\0', sizeof (hints)); if (getAddr(a, s, p, &ai, &hints) == NO) { DESTROY(self); NSLog(@"bad address-service-protocol combination"); return nil; } if ((net = socket (ai->ai_family, ai->ai_socktype, ai->ai_protocol)) < 0) { NSLog(@"unable to create socket ai_family: %@ socktype:%@ protocol:%d - %@", (ai->ai_family == PF_INET6 ? @"PF_INET6":@"PF_INET"), (ai->ai_socktype == SOCK_STREAM ? @"SOCK_STREAM":@"whatever"), ai->ai_protocol, [NSError _last]); DESTROY(self); return nil; } #ifndef BROKEN_SO_REUSEADDR /* * Under decent systems, SO_REUSEADDR means that the port can be reused * immediately that this process exits. Under some it means * that multiple processes can serve the same port simultaneously. * We don't want that broken behavior! */ setsockopt(net, SOL_SOCKET, SO_REUSEADDR, (char *)&status, sizeof(status)); #endif if (bind(net, ai->ai_addr, ai->ai_addrlen) != 0) { NSLog(@"unable to bind to port %@", [NSError _last]); goto cleanup; } if (listen(net, 5) < 0) { NSLog(@"unable to listen on port - %@", [NSError _last]); goto cleanup; } // struct sockaddr_storeage sstore; // int slen = sizeof(ss); // if (getsockname(net,(struct sockaddr *)&sstore, &slen) < 0) // { // NSLog(@"unable to get socket name - %@", [NSError _last]); // goto cleanup; // } freeaddrinfo (ai); self = [self initWithFileDescriptor: net closeOnDealloc: YES]; return self; cleanup: (void) close(net); freeaddrinfo (ai); DESTROY(self); return nil; } + (id) fileHandleAsServerAtAddress: (NSString*)address service: (NSString*)service protocol: (NSString*)protocol { id o = [self allocWithZone: NSDefaultMallocZone()]; return AUTORELEASE([o initAsServerAtAddress: address service: service protocol: protocol]); } - (NSString*) socketAddress { struct sockaddr_storage sstore; struct sockaddr *sadr; socklen_t size = sizeof(sstore); if (getsockname([self fileDescriptor], (struct sockaddr*)&sstore, &size) < 0) { NSLog(@"unable to get socket name - %@", [NSError _last]); return nil; } sadr = (struct sockaddr *) &sstore; switch (sadr->sa_family) { case AF_INET6: { char straddr[INET6_ADDRSTRLEN]; struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&sstore; inet_ntop(AF_INET6, &(addr6->sin6_addr), straddr, sizeof(straddr)); return [NSString stringWithCString: straddr encoding: NSASCIIStringEncoding]; break; } case AF_INET: { struct sockaddr_in * addr4 = (struct sockaddr_in*) &sstore; char *address = inet_ntoa(addr4->sin_addr); return [NSString stringWithCString: address encoding: NSASCIIStringEncoding]; break; } default: break; } return nil; } @end #endif /* defined(NeXT_Foundation_LIBRARY) */ gnustep-base-1.29.0/Source/Additions/NSHashTable+GNUstepBase.m000066400000000000000000000023771435650067400237670ustar00rootroot00000000000000/* Implementation of extension methods to base additions Copyright (C) 2015 Free Software Foundation, Inc. Written by: Niels Grewe This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #import "common.h" #import "Foundation/NSArray.h" #import "GNUstepBase/NSHashTable+GNUstepBase.h" #import "GSPrivate.h" #import "GSFastEnumeration.h" @implementation NSHashTable (GNUstepBase) - (void)addObjectsFromArray: (NSArray*)array { FOR_IN(id, obj, array) NSHashInsert(self,obj); END_FOR_IN(array) } @end gnustep-base-1.29.0/Source/Additions/NSLock+GNUstepBase.m000066400000000000000000000047351435650067400230240ustar00rootroot00000000000000/* Implementation of extension methods to base additions Copyright (C) 2010 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #import "common.h" #import "Foundation/NSException.h" #import "GNUstepBase/NSLock+GNUstepBase.h" #import "GNUstepBase/GSLock.h" /** * GNUstep specific (non-standard) additions to the NSLock class. */ static GSLazyRecursiveLock *local_lock = nil; /* This class only exists to provide a thread safe mechanism to initialize local_lock as +initialize is called under a lock in ObjC runtimes. User code should resort to GS_INITIALIZED_LOCK(), which uses the +newLockAt: extension. */ @interface _GSLockInitializer : NSObject @end @implementation _GSLockInitializer + (void) initialize { if (local_lock == nil) { /* As we do not know whether creating custom locks may implicitly create other locks, we use a recursive lock. */ local_lock = [GSLazyRecursiveLock new]; } } @end static inline id newLockAt(Class self, SEL _cmd, id *location) { if (location == 0) { [NSException raise: NSInvalidArgumentException format: @"'%@' called with nil location", NSStringFromSelector(_cmd)]; } if (*location == nil) { if (local_lock == nil) { [_GSLockInitializer class]; } [local_lock lock]; if (*location == nil) { *location = [[(id)self alloc] init]; } [local_lock unlock]; } return *location; } @implementation NSLock (GNUstepBase) + (id) newLockAt: (id *)location { return newLockAt(self, _cmd, location); } @end @implementation NSRecursiveLock (GNUstepBase) + (id) newLockAt: (id *)location { return newLockAt(self, _cmd, location); } @end gnustep-base-1.29.0/Source/Additions/NSMutableString+GNUstepBase.m000066400000000000000000000220411435650067400247020ustar00rootroot00000000000000/* Implementation of extension methods to base additions Copyright (C) 2010 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #import "common.h" #include #import "Foundation/NSException.h" #import "GNUstepBase/NSMutableString+GNUstepBase.h" /* Test for ASCII whitespace which is safe for unicode characters */ #define space(C) ((C) > 127 ? NO : isspace(C)) /* This private class is used for the -immutableProxy method in the category * on NSMutableString. * It is needed for [NSAttributedString-string] and [NSTextStorage-string] * * NB. The _parent instance variable is private but must *not* be changed * because it is actually used by GSMutableString code to permit some * optimisation (see GSString.m). */ @interface GSImmutableString : NSString { NSString *_parent; // Do not change this ivar declaration } - (id) initWithString: (NSString*)parent; @end @implementation GSImmutableString - (BOOL) canBeConvertedToEncoding: (NSStringEncoding)enc { return [_parent canBeConvertedToEncoding: enc]; } - (unichar) characterAtIndex: (NSUInteger)index { return [_parent characterAtIndex: index]; } - (NSComparisonResult) compare: (NSString*)aString options: (NSUInteger)mask range: (NSRange)aRange { return [_parent compare: aString options: mask range: aRange]; } - (const char *) cString { return [_parent cString]; } - (const char *) cStringUsingEncoding: (NSStringEncoding)encoding { return [_parent cStringUsingEncoding: encoding]; } - (NSUInteger) cStringLength { return [_parent cStringLength]; } - (NSData*) dataUsingEncoding: (NSStringEncoding)encoding allowLossyConversion: (BOOL)flag { return [_parent dataUsingEncoding: encoding allowLossyConversion: flag]; } - (void) dealloc { RELEASE(_parent); [super dealloc]; } - (id) copyWithZone: (NSZone*)z { return [_parent copyWithZone: z]; } - (id) mutableCopyWithZone: (NSZone*)z { return [_parent mutableCopyWithZone: z]; } - (void) encodeWithCoder: (NSCoder*)aCoder { [_parent encodeWithCoder: aCoder]; } - (NSStringEncoding) fastestEncoding { return [_parent fastestEncoding]; } - (void) getCharacters: (unichar*)buffer { [_parent getCharacters: buffer]; } - (void) getCharacters: (unichar*)buffer range: (NSRange)aRange { [_parent getCharacters: buffer range: aRange]; } - (void) getCString: (char*)buffer { [_parent getCString: buffer]; } - (void) getCString: (char*)buffer maxLength: (NSUInteger)maxLength { [_parent getCString: buffer maxLength: maxLength]; } - (BOOL) getCString: (char*)buffer maxLength: (NSUInteger)maxLength encoding: (NSStringEncoding)encoding { return [_parent getCString: buffer maxLength: maxLength encoding: encoding]; } - (void) getCString: (char*)buffer maxLength: (NSUInteger)maxLength range: (NSRange)aRange remainingRange: (NSRange*)leftoverRange { [_parent getCString: buffer maxLength: maxLength range: aRange remainingRange: leftoverRange]; } - (NSUInteger) hash { return [_parent hash]; } - (id) initWithString: (NSString*)parent { _parent = RETAIN(parent); return self; } - (BOOL) isEqual: (id)anObject { return [_parent isEqual: anObject]; } - (BOOL) isEqualToString: (NSString*)anObject { return [_parent isEqualToString: anObject]; } - (BOOL) isProxy { return YES; } - (NSUInteger) length { return [_parent length]; } - (NSUInteger) lengthOfBytesUsingEncoding: (NSStringEncoding)encoding { return [_parent lengthOfBytesUsingEncoding: encoding]; } - (const char*) lossyCString { return [_parent lossyCString]; } - (NSUInteger) maximumLengthOfBytesUsingEncoding: (NSStringEncoding)encoding { return [_parent maximumLengthOfBytesUsingEncoding: encoding]; } - (NSRange) rangeOfComposedCharacterSequenceAtIndex: (NSUInteger)anIndex { return [_parent rangeOfComposedCharacterSequenceAtIndex: anIndex]; } - (NSRange) rangeOfCharacterFromSet: (NSCharacterSet*)aSet options: (NSUInteger)mask range: (NSRange)aRange { return [_parent rangeOfCharacterFromSet: aSet options: mask range: aRange]; } - (NSRange) rangeOfString: (NSString*)aString options: (NSUInteger)mask range: (NSRange)aRange { return [_parent rangeOfString: aString options: mask range: aRange]; } - (NSStringEncoding) smallestEncoding { return [_parent smallestEncoding]; } @end /** * GNUstep specific (non-standard) additions to the NSMutableString class. */ @implementation NSMutableString (GNUstepBase) /** * Removes the specified suffix from the string. Raises an exception * if the suffix is not present. */ - (void) deleteSuffix: (NSString*)suffix { NSCAssert2([self hasSuffix: suffix], @"'%@' does not have the suffix '%@'", self, suffix); [self deleteCharactersInRange: NSMakeRange([self length] - [suffix length], [suffix length])]; } /** * Removes the specified prefix from the string. Raises an exception * if the prefix is not present. */ - (void) deletePrefix: (NSString*)prefix { NSCAssert2([self hasPrefix: prefix], @"'%@' does not have the prefix '%@'", self, prefix); [self deleteCharactersInRange: NSMakeRange(0, [prefix length])]; } /** * Returns a proxy to the receiver which will allow access to the * receiver as an NSString, but which will not allow any of the * extra NSMutableString methods to be used. You can use this method * to provide other code with read-only access to a mutable string * you own. */ - (NSString*) immutableProxy { return AUTORELEASE([[GSImmutableString alloc] initWithString: self]); } /** * Replaces all occurrences of the string replace with the string by * in the receiver.
* Has no effect if replace does not occur within the * receiver. NB. an empty string is not considered to exist within * the receiver.
* Calls - replaceOccurrencesOfString:withString:options:range: passing * zero for the options and a range from 0 with the length of the receiver. * * Note that is has to work for * [tmp replaceString: @"&" withString: @"&amp;"]; */ - (void) replaceString: (NSString*)replace withString: (NSString*)by { NSRange range; unsigned int count = 0; unsigned int newEnd; NSRange searchRange; if (replace == nil) { [NSException raise: NSInvalidArgumentException format: @"%@ nil search string", NSStringFromSelector(_cmd)]; } if (by == nil) { [NSException raise: NSInvalidArgumentException format: @"%@ nil replace string", NSStringFromSelector(_cmd)]; } searchRange = NSMakeRange(0, [self length]); range = [self rangeOfString: replace options: 0 range: searchRange]; if (range.length > 0) { unsigned byLen = [by length]; do { count++; [self replaceCharactersInRange: range withString: by]; newEnd = NSMaxRange(searchRange) + byLen - range.length; searchRange.location = range.location + byLen; searchRange.length = newEnd - searchRange.location; range = [self rangeOfString: replace options: 0 range: searchRange]; } while (range.length > 0); } } /** * Removes all leading white space from the receiver. */ - (void) trimLeadSpaces { unsigned length = [self length]; if (length > 0) { unsigned start = 0; unichar (*caiImp)(NSString*, SEL, NSUInteger); SEL caiSel = @selector(characterAtIndex:); caiImp = (unichar (*)())[self methodForSelector: caiSel]; while (start < length && space((*caiImp)(self, caiSel, start))) { start++; } if (start > 0) { [self deleteCharactersInRange: NSMakeRange(0, start)]; } } } /** * Removes all trailing white space from the receiver. */ - (void) trimTailSpaces { unsigned length = [self length]; if (length > 0) { unsigned end = length; unichar (*caiImp)(NSString*, SEL, NSUInteger); SEL caiSel = @selector(characterAtIndex:); caiImp = (unichar (*)())[self methodForSelector: caiSel]; while (end > 0 && space((*caiImp)(self, caiSel, end - 1))) { end--; } if (end < length) { [self deleteCharactersInRange: NSMakeRange(end, length - end)]; } } } /** * Removes all leading or trailing white space from the receiver. */ - (void) trimSpaces { [self trimTailSpaces]; [self trimLeadSpaces]; } @end gnustep-base-1.29.0/Source/Additions/NSNumber+GNUstepBase.m000066400000000000000000000030641435650067400233560ustar00rootroot00000000000000/* Implementation of extension methods to base additions Copyright (C) 2010 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #import "common.h" #include #import "GNUstepBase/NSNumber+GNUstepBase.h" /** * GNUstep specific (non-standard) additions to the NSNumber class. */ @implementation NSNumber(GNUstepBase) + (NSValue*) valueFromString: (NSString*)string { /* FIXME: implement this better */ const char *str; str = [string UTF8String]; if (strchr(str, '.') != NULL || strchr(str, 'e') != NULL || strchr(str, 'E') != NULL) return [NSNumber numberWithDouble: atof(str)]; else if (strchr(str, '-') >= 0) return [NSNumber numberWithInt: atoi(str)]; else return [NSNumber numberWithUnsignedInt: atoi(str)]; } @end gnustep-base-1.29.0/Source/Additions/NSObject+GNUstepBase.m000066400000000000000000000225761435650067400233450ustar00rootroot00000000000000/* Implementation of extension methods to base additions Copyright (C) 2010 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #import "common.h" #import "Foundation/NSArray.h" #import "Foundation/NSException.h" #import "Foundation/NSHashTable.h" #import "Foundation/NSLock.h" #import "GNUstepBase/GSObjCRuntime.h" #import "GNUstepBase/NSObject+GNUstepBase.h" #import "GNUstepBase/NSDebug+GNUstepBase.h" #import "GNUstepBase/NSThread+GNUstepBase.h" #ifdef HAVE_MALLOC_H #include #endif /* This file contains methods which nominally return an id but in fact * always rainse an exception and never return. * We need to suppress the compiler warning about that. */ #pragma GCC diagnostic ignored "-Wreturn-type" /** * Extension methods for the NSObject class */ @implementation NSObject (GNUstepBase) + (id) notImplemented: (SEL)selector { [NSException raise: NSGenericException format: @"method %@ not implemented in %@(class)", selector ? (id)NSStringFromSelector(selector) : (id)@"(null)", NSStringFromClass(self)]; while (1) ; // Does not return } - (NSComparisonResult) compare: (id)anObject { NSLog(@"WARNING: The -compare: method for NSObject is deprecated."); if (anObject == self) { return NSOrderedSame; } if (anObject == nil) { [NSException raise: NSInvalidArgumentException format: @"nil argument for compare:"]; } if ([self isEqual: anObject]) { return NSOrderedSame; } /* * Ordering objects by their address is pretty useless, * so subclasses should override this is some useful way. */ if ((id)self > anObject) { return NSOrderedDescending; } else { return NSOrderedAscending; } } - (BOOL) isInstance { GSOnceMLog(@"Warning, the -isInstance method is deprecated. " @"Use 'class_isMetaClass([self class]) ? NO : YES' instead"); return class_isMetaClass([self class]) ? NO : YES; } - (BOOL) makeImmutable { return NO; } - (id) makeImmutableCopyOnFail: (BOOL)force { if (force == YES) { return AUTORELEASE([self copy]); } return self; } - (id) notImplemented: (SEL)aSel { char c = (class_isMetaClass(object_getClass(self)) ? '+' : '-'); [NSException raise: NSInvalidArgumentException format: @"[%@%c%@] not implemented", NSStringFromClass([self class]), c, aSel ? (id)NSStringFromSelector(aSel) : (id)@"(null)"]; while (1) ; // Does not return } - (id) shouldNotImplement: (SEL)aSel { char c = (class_isMetaClass(object_getClass(self)) ? '+' : '-'); [NSException raise: NSInvalidArgumentException format: @"[%@%c%@] should not be implemented", NSStringFromClass([self class]), c, aSel ? (id)NSStringFromSelector(aSel) : (id)@"(null)"]; while (1) ; // Does not return } - (id) subclassResponsibility: (SEL)aSel { char c = (class_isMetaClass(object_getClass(self)) ? '+' : '-'); [NSException raise: NSInvalidArgumentException format: @"[%@%c%@] should be overridden by subclass", NSStringFromClass([self class]), c, aSel ? (id)NSStringFromSelector(aSel) : (id)@"(null)"]; while (1) ; // Does not return } @end #if defined(GNUSTEP) struct exitLink { struct exitLink *next; id obj; // Object to release or class for atExit SEL sel; // Selector for atExit or 0 if releasing id *at; // Address of static variable or NULL }; static struct exitLink *exited = 0; static BOOL enabled = NO; static BOOL shouldCleanUp = NO; static NSLock *exitLock = nil; static inline void setup() { if (nil == exitLock) { [gnustep_global_lock lock]; if (nil == exitLock) { exitLock = [NSLock new]; } [gnustep_global_lock unlock]; } } static void handleExit() { BOOL unknownThread = GSRegisterCurrentThread(); CREATE_AUTORELEASE_POOL(arp); while (exited != 0) { struct exitLink *tmp = exited; exited = tmp->next; if (0 != tmp->sel) { Method method; IMP msg; method = class_getClassMethod(tmp->obj, tmp->sel); msg = method_getImplementation(method); if (0 != msg) { (*msg)(tmp->obj, tmp->sel); } } else if (YES == shouldCleanUp) { if (0 != tmp->at) { tmp->obj = *(tmp->at); *(tmp->at) = nil; } [tmp->obj release]; } free(tmp); } DESTROY(arp); if (unknownThread == YES) { GSUnregisterCurrentThread(); } } @implementation NSObject(GSCleanup) + (id) leakAt: (id*)anAddress { struct exitLink *l; l = (struct exitLink*)malloc(sizeof(struct exitLink)); l->at = anAddress; l->obj = [*anAddress retain]; l->sel = 0; setup(); [exitLock lock]; l->next = exited; exited = l; [exitLock unlock]; return l->obj; } + (id) leak: (id)anObject { struct exitLink *l; l = (struct exitLink*)malloc(sizeof(struct exitLink)); l->at = 0; l->obj = [anObject retain]; l->sel = 0; setup(); [exitLock lock]; l->next = exited; exited = l; [exitLock unlock]; return l->obj; } + (BOOL) registerAtExit { return [self registerAtExit: @selector(atExit)]; } + (BOOL) registerAtExit: (SEL)sel { Method m; Class s; struct exitLink *l; if (0 == sel) { sel = @selector(atExit); } m = class_getClassMethod(self, sel); if (0 == m) { return NO; // method not implemented. } s = class_getSuperclass(self); if (0 != s && class_getClassMethod(s, sel) == m) { return NO; // method not implemented in this class } setup(); [exitLock lock]; for (l = exited; l != 0; l = l->next) { if (l->obj == self && sel_isEqual(l->sel, sel)) { [exitLock unlock]; return NO; // Already registered } } l = (struct exitLink*)malloc(sizeof(struct exitLink)); l->obj = self; l->sel = sel; l->at = 0; l->next = exited; exited = l; if (NO == enabled) { atexit(handleExit); enabled = YES; } [exitLock unlock]; return YES; } + (void) setShouldCleanUp: (BOOL)aFlag { if (YES == aFlag) { setup(); [exitLock lock]; if (NO == enabled) { atexit(handleExit); enabled = YES; } [exitLock unlock]; shouldCleanUp = YES; } else { shouldCleanUp = NO; } } + (BOOL) shouldCleanUp { return shouldCleanUp; } @end #else @implementation NSObject (MemoryFootprint) + (NSUInteger) contentSizeOf: (NSObject*)obj excluding: (NSHashTable*)exclude { Class cls = object_getClass(obj); NSUInteger size = 0; while (cls != Nil) { unsigned count; Ivar *vars; if (0 != (vars = class_copyIvarList(cls, &count))) { while (count-- > 0) { const char *type = ivar_getTypeEncoding(vars[count]); type = GSSkipTypeQualifierAndLayoutInfo(type); if ('@' == *type) { NSObject *content = object_getIvar(obj, vars[count]); if (content != nil) { size += [content sizeInBytesExcluding: exclude]; } } } free(vars); } cls = class_getSuperclass(cls); } return size; } + (NSUInteger) sizeInBytes { return 0; } + (NSUInteger) sizeInBytesExcluding: (NSHashTable*)exclude { return 0; } + (NSUInteger) sizeOfContentExcluding: (NSHashTable*)exclude { return 0; } + (NSUInteger) sizeOfInstance { return 0; } - (NSUInteger) sizeInBytes { NSUInteger bytes; NSHashTable *exclude; exclude = NSCreateHashTable(NSNonOwnedPointerHashCallBacks, 0); bytes = [self sizeInBytesExcluding: exclude]; NSFreeHashTable(exclude); return bytes; } - (NSUInteger) sizeInBytesExcluding: (NSHashTable*)exclude { if (0 == NSHashGet(exclude, self)) { NSUInteger size = [self sizeOfInstance]; NSHashInsert(exclude, self); if (size > 0) { size += [self sizeOfContentExcluding: exclude]; } return size; } return 0; } - (NSUInteger) sizeOfContentExcluding: (NSHashTable*)exclude { return 0; } - (NSUInteger) sizeOfInstance { NSUInteger size; #if GS_SIZEOF_VOIDP > 4 NSUInteger xxx = (NSUInteger)(void*)self; if (xxx & 0x07) { return 0; // Small object has no size } #endif #if HAVE_MALLOC_USABLE_SIZE size = malloc_usable_size((void*)self - sizeof(intptr_t)); #else size = class_getInstanceSize(object_getClass(self)); #endif return size; } @end /* Dummy implementation */ @implementation NSObject(GSCleanup) + (id) leakAt: (id*)anAddress { [*anAddress retain]; } + (id) leak: (id)anObject { return [anObject retain]; } + (BOOL) registerAtExit { return [self registerAtExit: @selector(atExit)]; } + (BOOL) registerAtExit: (SEL)sel { return NO; } + (void) setShouldCleanUp: (BOOL)aFlag { return; } + (BOOL) shouldCleanUp { return NO; } @end #endif gnustep-base-1.29.0/Source/Additions/NSProcessInfo+GNUstepBase.m000066400000000000000000000050641435650067400243620ustar00rootroot00000000000000/* Implementation of extension methods to base additions Copyright (C) 2010 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #import "common.h" #import "Foundation/NSArray.h" #import "Foundation/NSSet.h" #import "GNUstepBase/NSProcessInfo+GNUstepBase.h" #include @implementation NSProcessInfo(GNUstepBase) static NSMutableSet *_debug_set = nil; static BOOL debugTemporarilyDisabled = NO; BOOL GSDebugSet(NSString *level) { static id (*debugImp)(id,SEL,id) = 0; static SEL debugSel; if (debugTemporarilyDisabled == YES) { return NO; } if (debugImp == 0) { debugSel = @selector(member:); if (_debug_set == nil) { [[NSProcessInfo processInfo] debugSet]; } debugImp = (id (*)(id,SEL,id))[_debug_set methodForSelector: debugSel]; if (debugImp == 0) { fprintf(stderr, "Unable to set up with [NSProcessInfo-debugSet]\n"); return NO; } } if ((*debugImp)(_debug_set, debugSel, level) == nil) { return NO; } return YES; } - (BOOL) debugLoggingEnabled { if (debugTemporarilyDisabled == YES) { return NO; } else { return YES; } } - (NSMutableSet *) debugSet { if (_debug_set == nil) { int argc = [[self arguments] count]; NSMutableSet *mySet; int i; mySet = [NSMutableSet new]; for (i = 0; i < argc; i++) { NSString *str = [[self arguments] objectAtIndex: i]; if ([str hasPrefix: @"--GNU-Debug="]) { [mySet addObject: [str substringFromIndex: 12]]; } } _debug_set = mySet; } return _debug_set; } - (void) setDebugLoggingEnabled: (BOOL)flag { if (flag == NO) { debugTemporarilyDisabled = YES; } else { debugTemporarilyDisabled = NO; } } @end gnustep-base-1.29.0/Source/Additions/NSPropertyList+GNUstepBase.m000066400000000000000000000345661435650067400246210ustar00rootroot00000000000000/** Permit writing of OpenStep property lists. Copyright (C) 2010 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald This file is part of the GNUstep Objective-C Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. $Date: 2010-02-17 11:47:06 +0000 (Wed, 17 Feb 2010) $ $Revision: 29657 $ */ #import "common.h" #import "Foundation/NSArray.h" #import "Foundation/NSCharacterSet.h" #import "Foundation/NSData.h" #import "Foundation/NSDate.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSPropertyList.h" #import "Foundation/NSString.h" #import "Foundation/NSTimeZone.h" #import "Foundation/NSUserDefaults.h" #import "Foundation/NSValue.h" #import "GNUstepBase/GSObjCRuntime.h" #if defined(NeXT_Foundation_LIBRARY) static IMP originalImp = 0; static NSCharacterSet *quotables = nil; static Class NSArrayClass; static Class NSDataClass; static Class NSDateClass; static Class NSDictionaryClass; static Class NSNumberClass; static Class NSStringClass; static void setup() { if (quotables == nil) { NSMutableCharacterSet *s; s = [[NSCharacterSet characterSetWithCharactersInString: @"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" @"abcdefghijklmnopqrstuvwxyz$./_"] mutableCopy]; [s invert]; quotables = [s copy]; [s release]; NSArrayClass = [NSArray class]; NSDataClass = [NSData class]; NSDateClass = [NSDate class]; NSDictionaryClass = [NSDictionary class]; NSNumberClass = [NSNumber class]; NSStringClass = [NSString class]; } } /* * Output a string escaped for OpenStep style property lists. * The result is ascii data. */ static void PString(NSString *obj, NSMutableData *output) { unsigned length; if ((length = [obj length]) == 0) { [output appendBytes: "\"\"" length: 2]; } else if ([obj rangeOfCharacterFromSet: quotables].length > 0 || [obj characterAtIndex: 0] == '/') { unichar tmp[length <= 1024 ? length : 0]; unichar *ustring; unichar *from; unichar *end; unsigned char *ptr; int base = [output length]; int len = 0; if (length <= 1024) { ustring = tmp; } else { ustring = NSAllocateCollectable(sizeof(unichar) * length, 0); } end = &ustring[length]; [obj getCharacters: ustring]; for (from = ustring; from < end; from++) { switch (*from) { case '\t': case '\r': case '\n': len++; break; case '\a': case '\b': case '\v': case '\f': case '\\': case '"' : len += 2; break; default: if (*from < 128) { if (isprint(*from) || *from == ' ') { len++; } else { len += 4; } } else { len += 6; } break; } } [output setLength: base + len + 2]; ptr = [output mutableBytes] + base; *ptr++ = '"'; for (from = ustring; from < end; from++) { switch (*from) { case '\t': case '\r': case '\n': *ptr++ = *from; break; case '\a': *ptr++ = '\\'; *ptr++ = 'a'; break; case '\b': *ptr++ = '\\'; *ptr++ = 'b'; break; case '\v': *ptr++ = '\\'; *ptr++ = 'v'; break; case '\f': *ptr++ = '\\'; *ptr++ = 'f'; break; case '\\': *ptr++ = '\\'; *ptr++ = '\\'; break; case '"' : *ptr++ = '\\'; *ptr++ = '"'; break; default: if (*from < 128) { if (isprint(*from) || *from == ' ') { *ptr++ = *from; } else { unichar c = *from; *ptr++ = '\\'; ptr[2] = (c & 7) + '0'; c >>= 3; ptr[1] = (c & 7) + '0'; c >>= 3; ptr[0] = (c & 7) + '0'; ptr += 3; } } else { unichar c = *from; *ptr++ = '\\'; *ptr++ = 'U'; ptr[3] = (c & 15) > 9 ? (c & 15) + 55 : (c & 15) + 48; c >>= 4; ptr[2] = (c & 15) > 9 ? (c & 15) + 55 : (c & 15) + 48; c >>= 4; ptr[1] = (c & 15) > 9 ? (c & 15) + 55 : (c & 15) + 48; c >>= 4; ptr[0] = (c & 15) > 9 ? (c & 15) + 55 : (c & 15) + 48; ptr += 4; } break; } } *ptr++ = '"'; if (ustring != tmp) { NSZoneFree(NSDefaultMallocZone(), ustring); } } else { NSData *d = [obj dataUsingEncoding: NSASCIIStringEncoding]; [output appendData: d]; } } static const char *indentStrings[] = { "", " ", " ", " ", "\t", "\t ", "\t ", "\t ", "\t\t", "\t\t ", "\t\t ", "\t\t ", "\t\t\t", "\t\t\t ", "\t\t\t ", "\t\t\t ", "\t\t\t\t", "\t\t\t\t ", "\t\t\t\t ", "\t\t\t\t ", "\t\t\t\t\t", "\t\t\t\t\t ", "\t\t\t\t\t ", "\t\t\t\t\t ", "\t\t\t\t\t\t" }; /** * obj is the object to be written out
* loc is the locale for formatting (or nil to indicate no formatting)
* lev is the level of indentation to use
* step is the indentation step (0 == 0, 1 = 2, 2 = 4, 3 = 8)
* dest is the output buffer. */ static void OAppend(id obj, NSDictionary *loc, unsigned lev, unsigned step, NSMutableData *dest) { if ([obj isKindOfClass: NSStringClass]) { PString(obj, dest); } else if ([obj isKindOfClass: NSNumberClass]) { const char *t = [obj objCType]; if (*t == 'c' || *t == 'C') { BOOL val = [obj boolValue]; if (val == YES) { PString([obj description], dest); } else { PString([obj description], dest); } } else if (strchr("sSiIlLqQ", *t) != 0) { PString([obj description], dest); } else { PString([obj description], dest); } } else if ([obj isKindOfClass: NSDataClass]) { const unsigned char *src; unsigned char *dst; int length; int i; int j; src = [obj bytes]; length = [obj length]; #define num2char(num) ((num) < 0xa ? ((num)+'0') : ((num)+0x57)) j = [dest length]; [dest setLength: j + 2*length+(length > 4 ? (length-1)/4+2 : 2)]; dst = [dest mutableBytes]; dst[j++] = '<'; for (i = 0; i < length; i++, j++) { dst[j++] = num2char((src[i]>>4) & 0x0f); dst[j] = num2char(src[i] & 0x0f); if ((i & 3) == 3 && i < length-1) { /* if we've just finished a 32-bit int, print a space */ dst[++j] = ' '; } } dst[j++] = '>'; } else if ([obj isKindOfClass: NSDateClass]) { static NSTimeZone *z = nil; if (z == nil) { z = RETAIN([NSTimeZone timeZoneForSecondsFromGMT: 0]); } obj = [obj descriptionWithCalendarFormat: @"%Y-%m-%d %H:%M:%S %z" timeZone: z locale: nil]; PString(obj, dest); } else if ([obj isKindOfClass: NSArrayClass]) { const char *iBaseString; const char *iSizeString; unsigned level = lev; if (level*step < sizeof(indentStrings)/sizeof(id)) { iBaseString = indentStrings[level*step]; } else { iBaseString = indentStrings[sizeof(indentStrings)/sizeof(id)-1]; } level++; if (level*step < sizeof(indentStrings)/sizeof(id)) { iSizeString = indentStrings[level*step]; } else { iSizeString = indentStrings[sizeof(indentStrings)/sizeof(id)-1]; } { unsigned count = [obj count]; unsigned last = count - 1; NSString *plists[count]; unsigned i; if ([obj isProxy] == YES) { for (i = 0; i < count; i++) { plists[i] = [obj objectAtIndex: i]; } } else { [obj getObjects: plists]; } if (loc == nil) { [dest appendBytes: "(" length: 1]; for (i = 0; i < count; i++) { id item = plists[i]; OAppend(item, nil, 0, step, dest); if (i != last) { [dest appendBytes: ", " length: 2]; } } [dest appendBytes: ")" length: 1]; } else { [dest appendBytes: "(\n" length: 2]; for (i = 0; i < count; i++) { id item = plists[i]; [dest appendBytes: iSizeString length: strlen(iSizeString)]; OAppend(item, loc, level, step, dest); if (i == last) { [dest appendBytes: "\n" length: 1]; } else { [dest appendBytes: ",\n" length: 2]; } } [dest appendBytes: iBaseString length: strlen(iBaseString)]; [dest appendBytes: ")" length: 1]; } } } else if ([obj isKindOfClass: NSDictionaryClass]) { const char *iBaseString; const char *iSizeString; SEL objSel = @selector(objectForKey:); id (*myObj)(id,SEL,id) = (id(*)(id,SEL,id))[obj methodForSelector: objSel]; unsigned i; NSArray *keyArray = [obj allKeys]; unsigned numKeys = [keyArray count]; NSString *plists[numKeys]; NSString *keys[numKeys]; BOOL canCompare = YES; Class lastClass = 0; unsigned level = lev; BOOL isProxy = [obj isProxy]; if (level*step < sizeof(indentStrings)/sizeof(id)) { iBaseString = indentStrings[level*step]; } else { iBaseString = indentStrings[sizeof(indentStrings)/sizeof(id)-1]; } level++; if (level*step < sizeof(indentStrings)/sizeof(id)) { iSizeString = indentStrings[level*step]; } else { iSizeString = indentStrings[sizeof(indentStrings)/sizeof(id)-1]; } if (isProxy == YES) { for (i = 0; i < numKeys; i++) { keys[i] = [keyArray objectAtIndex: i]; plists[i] = [(NSDictionary*)obj objectForKey: keys[i]]; } } else { [keyArray getObjects: keys]; for (i = 0; i < numKeys; i++) { plists[i] = (*myObj)(obj, objSel, keys[i]); } } if (numKeys == 0) { canCompare = NO; } else { /* All keys must respond to -compare: for sorting. */ lastClass = NSStringClass; for (i = 0; i < numKeys; i++) { if (object_getClass(keys[i]) == lastClass) continue; if ([keys[i] isKindOfClass: NSStringClass] == NO) { canCompare = NO; break; } lastClass = object_getClass(keys[i]); } } if (canCompare == YES) { #define STRIDE_FACTOR 3 unsigned c,d, stride; BOOL found; NSComparisonResult (*comp)(id, SEL, id) = 0; unsigned int count = numKeys; #ifdef GSWARN BOOL badComparison = NO; #endif stride = 1; while (stride <= count) { stride = stride * STRIDE_FACTOR + 1; } lastClass = 0; while (stride > (STRIDE_FACTOR - 1)) { // loop to sort for each value of stride stride = stride / STRIDE_FACTOR; for (c = stride; c < count; c++) { found = NO; if (stride > c) { break; } d = c - stride; while (!found) { id a = keys[d + stride]; id b = keys[d]; Class x; NSComparisonResult r; x = object_getClass(a); if (x != lastClass) { lastClass = x; comp = (NSComparisonResult (*)(id, SEL, id)) [a methodForSelector: @selector(compare:)]; } r = (*comp)(a, @selector(compare:), b); if (r < 0) { #ifdef GSWARN if (r != NSOrderedAscending) { badComparison = YES; } #endif /* Swap keys and values. */ keys[d + stride] = b; keys[d] = a; a = plists[d + stride]; b = plists[d]; plists[d + stride] = b; plists[d] = a; if (stride > d) { break; } d -= stride; } else { #ifdef GSWARN if (r != NSOrderedDescending && r != NSOrderedSame) { badComparison = YES; } #endif found = YES; } } } } } if (loc == nil) { [dest appendBytes: "{" length: 1]; for (i = 0; i < numKeys; i++) { OAppend(keys[i], nil, 0, step, dest); [dest appendBytes: " = " length: 3]; OAppend(plists[i], nil, 0, step, dest); [dest appendBytes: "; " length: 2]; } [dest appendBytes: "}" length: 1]; } else { [dest appendBytes: "{\n" length: 2]; for (i = 0; i < numKeys; i++) { [dest appendBytes: iSizeString length: strlen(iSizeString)]; OAppend(keys[i], loc, level, step, dest); [dest appendBytes: " = " length: 3]; OAppend(plists[i], loc, level, step, dest); [dest appendBytes: ";\n" length: 2]; } [dest appendBytes: iBaseString length: strlen(iBaseString)]; [dest appendBytes: "}" length: 1]; } } else { NSString *cls; if (obj == nil) { obj = @"(nil)"; cls = @"(nil)"; } else { cls = NSStringFromClass([obj class]); } PString([obj description], dest); } } @interface NSPropertyListSerialization (GNUstepAdditions) + (NSData*) _dataFromPropertyList: (id)aPropertyList format: (NSPropertyListFormat)aFormat errorDescription: (NSString**)anErrorString; + (void) load; @end @implementation NSPropertyListSerialization (GNUstepAdditions) + (NSData*) _dataFromPropertyList: (id)aPropertyList format: (NSPropertyListFormat)aFormat errorDescription: (NSString**)anErrorString { if (aFormat == NSPropertyListOpenStepFormat) { NSMutableData *dest; NSDictionary *loc; int step = 2; loc = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]; dest = [NSMutableData dataWithCapacity: 1024]; if (nil == quotables) { setup(); } OAppend(aPropertyList, loc, 0, step > 3 ? 3 : step, dest); return dest; } return (*(id(*)(id,SEL,id,id,id))originalImp) (self, _cmd, aPropertyList, aFormat, anErrorString); } + (void) load { Method replacementMethod; replacementMethod = class_getClassMethod(self, @selector(_dataFromPropertyList:format:errorDescription:)); originalImp = class_replaceMethod(object_getClass(self), @selector(dataFromPropertyList:format:errorDescription:), method_getImplementation(replacementMethod), method_getTypeEncoding(replacementMethod)); } @end #endif gnustep-base-1.29.0/Source/Additions/NSStream+GNUstepBase.m000066400000000000000000000042251435650067400233610ustar00rootroot00000000000000/* Implementation of extension methods to base additions Copyright (C) 2010 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #import "common.h" #import "GNUstepBase/NSObject+GNUstepBase.h" #import "GNUstepBase/NSStream+GNUstepBase.h" /* The remaining code is specific to the Apple Foundation */ #if !defined(GNUSTEP) @implementation NSStream (GNUstepBase) + (void) getLocalStreamsToPath: (NSString *)path inputStream: (NSInputStream **)inputStream outputStream: (NSOutputStream **)outputStream { [self notImplemented: _cmd]; } + (void) pipeWithInputStream: (NSInputStream **)inputStream outputStream: (NSOutputStream **)outputStream { [self notImplemented: _cmd]; } @end @implementation GSServerStream + (id) allocWithZone: (NSZone*)z { return [self notImplemented: _cmd]; } + (id) serverStreamToAddr: (NSString*)addr port: (NSInteger)port { return [self notImplemented: _cmd]; } + (id) serverStreamToAddr: (NSString*)addr { return [self notImplemented: _cmd]; } - (void) acceptWithInputStream: (NSInputStream **)inputStream outputStream: (NSOutputStream **)outputStream { [self notImplemented: _cmd]; } - (id) initToAddr: (NSString*)addr port: (NSInteger)port { return [self notImplemented: _cmd]; } - (id) initToAddr: (NSString*)addr { return [self notImplemented: _cmd]; } @end #endif gnustep-base-1.29.0/Source/Additions/NSString+GNUstepBase.m000066400000000000000000000133001435650067400233660ustar00rootroot00000000000000/* Implementation of extension methods for base additions Copyright (C) 2010 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #import "common.h" #include #import "Foundation/NSException.h" #import "GNUstepBase/NSString+GNUstepBase.h" #import "GNUstepBase/NSMutableString+GNUstepBase.h" /* Test for ASCII whitespace which is safe for unicode characters */ #define space(C) ((C) > 127 ? NO : isspace(C)) /** * GNUstep specific (non-standard) additions to the NSString class. */ @implementation NSString (GNUstepBase) /** * Returns an autoreleased string initialized with -initWithFormat:arguments:. */ + (id) stringWithFormat: (NSString*)format arguments: (va_list)argList { return AUTORELEASE([[self allocWithZone: NSDefaultMallocZone()] initWithFormat: format arguments: argList]); } #ifndef MAC_OS_X_VERSION_10_5 /** * Returns YES when scanning the receiver's text from left to right finds a * digit in the range 1-9 or a letter in the set ('Y', 'y', 'T', 't').
* Any trailing characters are ignored.
* Any leading whitespace or zeros or signs are also ignored.
* Returns NO if the above conditions are not met. */ - (BOOL) boolValue { static NSCharacterSet *yes = nil; if (yes == nil) { yes = RETAIN([NSCharacterSet characterSetWithCharactersInString: @"123456789yYtT"]); } if ([self rangeOfCharacterFromSet: yes].length > 0) { return YES; } return NO; } #endif /** * Returns a string formed by removing the prefix string from the * receiver. Raises an exception if the prefix is not present. */ - (NSString*) stringByDeletingPrefix: (NSString*)prefix { NSCAssert2([self hasPrefix: prefix], @"'%@' does not have the prefix '%@'", self, prefix); return [self substringFromIndex: [prefix length]]; } /** * Returns a string formed by removing the suffix string from the * receiver. Raises an exception if the suffix is not present. */ - (NSString*) stringByDeletingSuffix: (NSString*)suffix { NSCAssert2([self hasSuffix: suffix], @"'%@' does not have the suffix '%@'", self, suffix); return [self substringToIndex: ([self length] - [suffix length])]; } /** * Returns a string formed by removing leading white space from the * receiver. */ - (NSString*) stringByTrimmingLeadSpaces { unsigned length = [self length]; if (length > 0) { unsigned start = 0; unichar (*caiImp)(NSString*, SEL, NSUInteger); SEL caiSel = @selector(characterAtIndex:); caiImp = (unichar (*)())[self methodForSelector: caiSel]; while (start < length && space((*caiImp)(self, caiSel, start))) { start++; } if (start > 0) { return [self substringFromIndex: start]; } } return self; } /** * Returns a string formed by removing trailing white space from the * receiver. */ - (NSString*) stringByTrimmingTailSpaces { unsigned length = [self length]; if (length > 0) { unsigned end = length; unichar (*caiImp)(NSString*, SEL, NSUInteger); SEL caiSel = @selector(characterAtIndex:); caiImp = (unichar (*)())[self methodForSelector: caiSel]; while (end > 0) { if (!space((*caiImp)(self, caiSel, end - 1))) { break; } end--; } if (end < length) { return [self substringToIndex: end]; } } return self; } /** * Returns a string formed by removing both leading and trailing * white space from the receiver. */ - (NSString*) stringByTrimmingSpaces { unsigned length = [self length]; if (length > 0) { unsigned start = 0; unsigned end = length; unichar (*caiImp)(NSString*, SEL, NSUInteger); SEL caiSel = @selector(characterAtIndex:); caiImp = (unichar (*)())[self methodForSelector: caiSel]; while (start < length && space((*caiImp)(self, caiSel, start))) { start++; } while (end > start) { if (!space((*caiImp)(self, caiSel, end - 1))) { break; } end--; } if (start > 0 || end < length) { if (start < end) { return [self substringFromRange: NSMakeRange(start, end - start)]; } else { return [NSString string]; } } } return self; } /** * Returns a string in which any (and all) occurrences of * replace in the receiver have been replaced with by. * Returns the receiver if replace * does not occur within the receiver. NB. an empty string is * not considered to exist within the receiver. */ - (NSString*) stringByReplacingString: (NSString*)replace withString: (NSString*)by { NSRange range = [self rangeOfString: replace]; if (range.length > 0) { NSMutableString *tmp = [self mutableCopy]; NSString *str; [tmp replaceString: replace withString: by]; str = AUTORELEASE([tmp copy]); RELEASE(tmp); return str; } else return self; } - (NSString*) substringFromRange:(NSRange)range { return [self substringWithRange:range]; } @end gnustep-base-1.29.0/Source/Additions/NSTask+GNUstepBase.m000066400000000000000000000113541435650067400230310ustar00rootroot00000000000000/* Implementation of extension methods for base additions Copyright (C) 2010 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #import "common.h" #import "Foundation/NSFileManager.h" #import "Foundation/NSPathUtilities.h" #import "Foundation/NSProcessInfo.h" #import "Foundation/NSSet.h" #import "GNUstepBase/NSString+GNUstepBase.h" #import "GNUstepBase/NSTask+GNUstepBase.h" @implementation NSTask (GNUstepBase) + (NSSet*) executableExtensions { static NSSet *executable = nil; #if defined(_WIN32) if (nil == executable) { NSMutableSet *m; NSEnumerator *e; NSString *s; /* Get PATHEXT environment variable and split apart on ';' */ e = [[[[[NSProcessInfo processInfo] environment] objectForKey: @"PATHEXT"] componentsSeparatedByString: @";"] objectEnumerator]; m = [NSMutableSet set]; while (nil != (s = [e nextObject])) { /* We don't have a '.' in a file extension, but the * environment variable probably does ... fix it. */ s = [s stringByTrimmingSpaces]; if ([s hasPrefix: @"."]) { s = [s substringFromIndex: 1]; } if ([s length] > 0) { [m addObject: s]; } } /* Make sure we at least have the EXE extension. */ [m addObject: @"EXE"]; ASSIGNCOPY(executable, m); } #endif return executable; } static NSString* executablePath(NSFileManager *mgr, NSString *path) { #if defined(_WIN32) NSString *tmp = [path pathExtension]; if ([tmp length] == 0) { NSSet *exts; NSString *ext; NSEnumerator *e; exts = [NSTask executableExtensions]; e = [exts objectEnumerator]; ext = @"EXE"; /* Try 'EXE' first, but otherwise iterate through all available * extensions to find an executable path. */ do { tmp = [path stringByAppendingPathExtension: ext]; if ([mgr isExecutableFileAtPath: tmp]) { return tmp; } } while (nil != (ext = [e nextObject])); } else { if ([mgr isExecutableFileAtPath: path]) { return path; } } #else if ([mgr isExecutableFileAtPath: path]) { return path; } #endif return nil; } + (NSString*) executablePath: (NSString*)aPath { return executablePath([NSFileManager defaultManager], aPath); } + (NSString*) launchPathForTool: (NSString*)name { NSEnumerator *enumerator; NSDictionary *env; NSString *pathlist; NSString *path; NSFileManager *mgr; mgr = [NSFileManager defaultManager]; #if defined(GNUSTEP) enumerator = [NSSearchPathForDirectoriesInDomains( GSToolsDirectory, NSAllDomainsMask, YES) objectEnumerator]; while ((path = [enumerator nextObject]) != nil) { path = [path stringByAppendingPathComponent: name]; if ((path = executablePath(mgr, path)) != nil) { return path; } } enumerator = [NSSearchPathForDirectoriesInDomains( GSAdminToolsDirectory, NSAllDomainsMask, YES) objectEnumerator]; while ((path = [enumerator nextObject]) != nil) { path = [path stringByAppendingPathComponent: name]; if ((path = executablePath(mgr, path)) != nil) { return path; } } #endif env = [[NSProcessInfo processInfo] environment]; pathlist = [env objectForKey:@"PATH"]; #if defined(_WIN32) /* Windows 2000 and perhaps others have "Path" not "PATH" */ if (pathlist == nil) { pathlist = [env objectForKey: @"Path"]; } enumerator = [[pathlist componentsSeparatedByString: @";"] objectEnumerator]; #else enumerator = [[pathlist componentsSeparatedByString: @":"] objectEnumerator]; #endif while ((path = [enumerator nextObject]) != nil) { path = [path stringByAppendingPathComponent: name]; if ((path = executablePath(mgr, path)) != nil) { return path; } } return nil; } @end gnustep-base-1.29.0/Source/Additions/NSThread+GNUstepBase.m000066400000000000000000000025671435650067400233440ustar00rootroot00000000000000/** Control of executable units within a shared virtual memory space Copyright (C) 2010 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald This file is part of the GNUstep Objective-C Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. $Date: 2010-02-17 11:47:06 +0000 (Wed, 17 Feb 2010) $ $Revision: 29657 $ */ #import "common.h" #import "Foundation/NSThread.h" #if defined(NeXT_Foundation_LIBRARY) /* These functions are in NSThread.m in the base library. */ NSThread* GSCurrentThread(void) { return [NSThread currentThread]; } NSMutableDictionary* GSCurrentThreadDictionary(void) { return [GSCurrentThread() threadDictionary]; } #endif gnustep-base-1.29.0/Source/Additions/NSURL+GNUstepBase.m000066400000000000000000000102451435650067400225670ustar00rootroot00000000000000/* Implementation of extension methods to base additions Copyright (C) 2010 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #import "common.h" #import "Foundation/NSValue.h" #import "GNUstepBase/NSURL+GNUstepBase.h" @implementation NSURL (GNUstepBaseAdditions) - (NSString*) cacheKey { NSString *k; NSString *s = [[self scheme] lowercaseString]; NSString *h = [[self host] lowercaseString]; NSNumber *p = [self port]; if (nil == p) { if ([s isEqualToString: @"http"]) { p = [NSNumber numberWithInt: 80]; } else if ([s isEqualToString: @"https"]) { p = [NSNumber numberWithInt: 443]; } } k = [NSString stringWithFormat: @"%@://%@:%@", s, h, p]; return k; } - (id) initWithScheme: (NSString*)scheme user: (NSString*)user password: (NSString*)password host: (NSString*)host port: (NSNumber*)port fullPath: (NSString*)fullPath parameterString: (NSString*)parameterString query: (NSString*)query fragment: (NSString*)fragment { NSMutableString *urlString; NSString *s; if (scheme != nil) { urlString = [scheme mutableCopy]; [urlString appendString: @"://"]; } else { urlString = [[NSMutableString alloc] init]; } if ([user length] > 0 || [password length] > 0) { if (nil == (s = user)) s = @""; [urlString appendString: [s stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]]; [urlString appendString: @":"]; if (nil == (s = password)) s = @""; [urlString appendString: [s stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]]; [urlString appendString: @"@"]; } if ([host length] > 0) { [urlString appendString: [host stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]]; } if ([port intValue] > 0) { [urlString appendString: @":"]; [urlString appendFormat: @"%u", [port intValue]]; } if (nil == (s = fullPath)) s = @""; if ([s hasPrefix: @"/"] == NO) { [urlString appendString: @"/"]; } [urlString appendString: [s stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]]; if ([parameterString length] > 0) { [urlString appendString: @";"]; [urlString appendString: parameterString]; } if ([query length] > 0) { [urlString appendString: @"?"]; [urlString appendString: query]; } if ([fragment length] > 0) { [urlString appendString: @"#"]; [urlString appendString: fragment]; } self = [self initWithString: urlString]; [urlString release]; return self; } @end #ifndef GNUSTEP #import @implementation NSURL (GNUstepBase) /* For efficiency this is built in to the main library. */ - (NSString*) fullPath { NSRange r; NSString *s; s = [self absoluteString]; if ((r = [s rangeOfString: @";"]).length > 0) { s = [s substringToIndex: r.location]; } else if ((r = [s rangeOfString: @"?"]).length > 0) { s = [s substringToIndex: r.location]; } r = [s rangeOfString: @"//"]; s = [s substringFromIndex: NSMaxRange(r)]; r = [s rangeOfString: @"/"]; s = [s substringFromIndex: r.location]; return s; } /* For efficiency this is built in to the main library. */ - (NSString*) pathWithEscapes { return CFURLCopyPath(self); } @end #endif gnustep-base-1.29.0/Source/Additions/Unicode.m000066400000000000000000002473051435650067400211470ustar00rootroot00000000000000/** Support functions for Unicode implementation Function to determine default c string encoding for GNUstep based on GNUSTEP_STRING_ENCODING environment variable. Copyright (C) 1997 Free Software Foundation, Inc. Written by: Stevo Crvenkovski < stevo@btinternet.com > Date: March 1997 Merged with GetDefEncoding.m and iconv by: Fred Kiefer Date: September 2000 Rewrite by: Richard Frith-Macdonald This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #import "common.h" #if !defined(NeXT_Foundation_LIBRARY) #import "Foundation/NSArray.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSError.h" #import "Foundation/NSException.h" #import "Foundation/NSMapTable.h" #import "Foundation/NSPathUtilities.h" #endif #import "GNUstepBase/GSLock.h" #import "GNUstepBase/GSMime.h" #import "GNUstepBase/Unicode.h" #import "../GSPrivate.h" #import "../GSPThread.h" #include #if HAVE_LOCALE_H #include #endif #if HAVE_LANGINFO_CODESET #include #endif #if defined(HAVE_UNICODE_UCNV_H) #include #elif defined(HAVE_ICU_H) #include #endif typedef struct {unichar from; unsigned char to;} _ucc_; #include "unicode/cyrillic.h" #include "unicode/latin2.h" #include "unicode/latin9.h" #include "unicode/nextstep.h" #include "unicode/caseconv.h" #include "unicode/cop.h" #include "unicode/decomp.h" #include "unicode/gsm0338.h" #include "unicode/thai.h" #ifdef HAVE_ICONV #ifdef HAVE_GICONV_H #include #else #include #endif /* * The whole of the GNUstep code stores UNICODE in internal byte order, * so we do the same. We have switched to using UTF16 so the defines here * recognise this. We use the endian specific versions of UTF16 so that * iconv does not introduce a BOM where we do not want it. * If UTF16 does not work, we revert to UCS-2-INTERNAL. */ #ifdef WORDS_BIGENDIAN #define UNICODE_UTF16 "UTF-16BE" #define UNICODE_UTF32 "UTF-32BE" #define UNICODE_INT "UNICODEBIG" #else #define UNICODE_UTF16 "UTF-16LE" #define UNICODE_UTF32 "UTF-32LE" #define UNICODE_INT "UNICODELITTLE" #endif #define UNICODE_ENC ((unicode_enc) ? unicode_enc : internal_unicode_enc()) static const char *unicode_enc = NULL; /* Check to see what type of internal unicode format the library supports */ static const char * internal_unicode_enc(void) { iconv_t conv; unicode_enc = UNICODE_UTF16; conv = iconv_open(unicode_enc, "ASCII"); if (conv != (iconv_t)-1) { iconv_close(conv); return unicode_enc; } fprintf(stderr, "Could not initialise iconv() for UTF16, using UCS-2\n"); fprintf(stderr, "Using characters outside 16 bits may give bad results.\n"); unicode_enc = UNICODE_INT; conv = iconv_open(unicode_enc, "ASCII"); if (conv != (iconv_t)-1) { iconv_close(conv); return unicode_enc; } unicode_enc = "UCS-2-INTERNAL"; conv = iconv_open(unicode_enc, "ASCII"); if (conv != (iconv_t)-1) { iconv_close(conv); return unicode_enc; } unicode_enc = "UCS-2"; /* This had better work */ return unicode_enc; } #else #define UNICODE_UTF32 "" #endif static gs_mutex_t local_lock = GS_MUTEX_INIT_STATIC; typedef unsigned char unc; static NSStringEncoding defEnc = GSUndefinedEncoding; static NSStringEncoding natEnc = GSUndefinedEncoding; static NSStringEncoding icuEnc = GSUndefinedEncoding; static NSStringEncoding *_availableEncodings = 0; struct _strenc_ { NSStringEncoding enc; // Constant representing the encoding. const char *ename; // ASCII string representation of name. const char *iconv; /* Iconv name of encoding. If this * is the empty string, we cannot use * iconv perform conversions to/from * this encoding. * NB. do not put a null pointer in this * field in the table, use "" instead. */ BOOL eightBit; /* Flag to say whether this encoding * can be stored in a byte array ... * ie whether the encoding consists * entirely of single byte characters * and the first 128 are identical to * the ASCII character set. */ char supported; /* Is this supported? Some encodings * have builtin conversion to/from * unicode, but for others we must * check with iconv to see if it * supports them on this platform. * A one means supported. * A negative means unsupported. * A zero means not yet checked. */ const char *lossy; /* Iconv name for lossy encoding */ }; /* * The str_encoding_table is a compact representation of all the string * encoding information we might need. It gets modified at runtime. */ static struct _strenc_ str_encoding_table[] = { {NSASCIIStringEncoding, "NSASCIIStringEncoding","ASCII",1,1,0}, {NSNEXTSTEPStringEncoding, "NSNEXTSTEPStringEncoding","NEXTSTEP",1,1,0}, {NSJapaneseEUCStringEncoding, "NSJapaneseEUCStringEncoding","EUC-JP",0,0,0}, {NSUTF8StringEncoding, "NSUTF8StringEncoding","UTF-8",0,1,0}, {NSISOLatin1StringEncoding, "NSISOLatin1StringEncoding","ISO-8859-1",1,1,0}, {NSSymbolStringEncoding, "NSSymbolStringEncoding","",0,0,0}, {NSNonLossyASCIIStringEncoding, "NSNonLossyASCIIStringEncoding","",0,1,0}, {NSShiftJISStringEncoding, "NSShiftJISStringEncoding","SHIFT-JIS",0,0,0}, {NSISOLatin2StringEncoding, "NSISOLatin2StringEncoding","ISO-8859-2",1,1,0}, {NSUnicodeStringEncoding, "NSUnicodeStringEncoding","",0,1,0}, {NSWindowsCP1251StringEncoding, "NSWindowsCP1251StringEncoding","CP1251",0,0,0}, {NSWindowsCP1252StringEncoding, "NSWindowsCP1252StringEncoding","CP1252",0,0,0}, {NSWindowsCP1253StringEncoding, "NSWindowsCP1253StringEncoding","CP1253",0,0,0}, {NSWindowsCP1254StringEncoding, "NSWindowsCP1254StringEncoding","CP1254",0,0,0}, {NSWindowsCP1250StringEncoding, "NSWindowsCP1250StringEncoding","CP1250",0,0,0}, {NSISO2022JPStringEncoding, "NSISO2022JPStringEncoding","ISO-2022-JP",0,0,0}, {NSMacOSRomanStringEncoding, "NSMacOSRomanStringEncoding","MACINTOSH",0,0,0}, #if defined(GNUSTEP) {NSProprietaryStringEncoding, "NSProprietaryStringEncoding","",0,0,0}, #endif /* GNUstep additions */ {NSISOCyrillicStringEncoding, "NSISOCyrillicStringEncoding","ISO-8859-5",0,1,0}, {NSKOI8RStringEncoding, "NSKOI8RStringEncoding","KOI8-R",0,0,0}, {NSISOLatin3StringEncoding, "NSISOLatin3StringEncoding","ISO-8859-3",0,0,0}, {NSISOLatin4StringEncoding, "NSISOLatin4StringEncoding","ISO-8859-4",0,0,0}, {NSISOArabicStringEncoding, "NSISOArabicStringEncoding","ISO-8859-6",0,0,0}, {NSISOGreekStringEncoding, "NSISOGreekStringEncoding","ISO-8859-7",0,0,0}, {NSISOHebrewStringEncoding, "NSISOHebrewStringEncoding","ISO-8859-8",0,0,0}, {NSISOLatin5StringEncoding, "NSISOLatin5StringEncoding","ISO-8859-9",0,0,0}, {NSISOLatin6StringEncoding, "NSISOLatin6StringEncoding","ISO-8859-10",0,0,0}, {NSISOThaiStringEncoding, "NSISOThaiStringEncoding","ISO-8859-11",1,1,0}, {NSISOLatin7StringEncoding, "NSISOLatin7StringEncoding","ISO-8859-13",0,0,0}, {NSISOLatin8StringEncoding, "NSISOLatin8StringEncoding","ISO-8859-14",0,0,0}, {NSISOLatin9StringEncoding, "NSISOLatin9StringEncoding","ISO-8859-15",1,1,0}, {NSUTF7StringEncoding, "NSUTF7StringEncoding","UTF-7",0,0,0}, {NSChineseEUCStringEncoding, "NSChineseEUCStringEncoding","EUC-CN",0,0,0}, {NSGSM0338StringEncoding, "NSGSM0338StringEncoding","",0,1,0}, {NSBig5StringEncoding, "NSBig5StringEncoding","BIG5",0,0,0}, {NSKoreanEUCStringEncoding, "NSKoreanEUCStringEncoding","EUC-KR",0,0,0}, /* DOS and Windows encodings */ {NSDOSLatinUSStringEncoding, "NSDOSLatinUSStringEncoding","CP437",0,0,0}, {NSDOSGreekStringEncoding, "NSDOSGreekStringEncoding","CP737",0,0,0}, {NSDOSBalticRimStringEncoding, "NSDOSBalticRimStringEncoding","CP775",0,0,0}, {NSDOSLatin1StringEncoding, "NSDOSLatin1StringEncoding","CP850",0,0,0}, {NSDOSGreek1StringEncoding, "NSDOSGreek1StringEncoding","CP851",0,0,0}, {NSDOSLatin2StringEncoding, "NSDOSLatin2StringEncoding","CP852",0,0,0}, {NSDOSCyrillicStringEncoding, "NSDOSCyrillicStringEncoding","CP855",0,0,0}, {NSDOSTurkishStringEncoding, "NSDOSTurkishStringEncoding","CP857",0,0,0}, {NSDOICortugueseStringEncoding, "NSDOICortugueseStringEncoding","CP860",0,0,0}, {NSDOSIcelandicStringEncoding, "NSDOSIcelandicStringEncoding","CP861",0,0,0}, {NSDOSHebrewStringEncoding, "NSDOSHebrewStringEncoding","CP862",0,0,0}, {NSDOSCanadianFrenchStringEncoding, "NSDOSCanadianFrenchStringEncoding","CP863",0,0,0}, {NSDOSArabicStringEncoding, "NSDOSArabicStringEncoding","CP864",0,0,0}, {NSDOSNordicStringEncoding, "NSDOSNordicStringEncoding","CP865",0,0,0}, {NSDOSRussianStringEncoding, "NSDOSRussianStringEncoding","CP866",0,0,0}, {NSDOSGreek2StringEncoding, "NSDOSGreek2StringEncoding","CP869",0,0,0}, {NSDOSThaiStringEncoding, "NSDOSThaiStringEncoding","CP874",0,0,0}, {NSDOSJapaneseStringEncoding, "NSDOSJapaneseStringEncoding","CP932",0,0,0}, {NSDOSChineseSimplifStringEncoding, "NSDOSChineseSimplifStringEncoding","CP936",0,0,0}, {NSDOSKoreanStringEncoding, "NSDOSKoreanStringEncoding","CP949",0,0,0}, {NSDOSChineseTradStringEncoding, "NSDOSChineseTradStringEncoding","CP950",0,0,0}, {NSWindowsHebrewStringEncoding, "NSWindowsHebrewStringEncoding","CP1255",0,0,0}, {NSWindowsArabicStringEncoding, "NSWindowsArabicStringEncoding","CP1256",0,0,0}, {NSWindowsBalticRimStringEncoding, "NSWindowsBalticRimStringEncoding","CP1257",0,0,0}, {NSWindowsVietnameseStringEncoding, "NSWindowsVietnameseStringEncoding","CP1258",0,0,0}, {NSWindowsKoreanJohabStringEncoding, "NSWindowsKoreanJohabStringEncoding","CP1361",0,0,0}, {NSGB_2312_80StringEncoding, // Same as NSChineseEUCStringEncoding "NSGB_2312_80StringEncoding","EUC-CN",0,0,0}, {NSGBK_95StringEncoding, // Same as NSDOSChineseSimplifStringEncoding "NSGBK_95StringEncoding","CP936",0,0,0}, {NSGB_18030_2000StringEncoding, "NSGB_18030_2000StringEncoding","GB18030",0,0,0}, /* Now Apple encodings which have high numeric values. */ {NSUTF16BigEndianStringEncoding, "NSUTF16BigEndianStringEncoding","UTF-16BE",0,0,0}, {NSUTF16LittleEndianStringEncoding, "NSUTF16LittleEndianStringEncoding","UTF-16LE",0,0,0}, {NSUTF32StringEncoding, "NSUTF32StringEncoding",UNICODE_UTF32,0,0,0}, {NSUTF32BigEndianStringEncoding, "NSUTF32BigEndianStringEncoding","UTF-32BE",0,0,0}, {NSUTF32LittleEndianStringEncoding, "NSUTF32LittleEndianStringEncoding","UTF-32LE",0,0,0}, {0,"Unknown encoding","",0,0,0} }; static unsigned encTableSize = 0; static NSMapTable *encodingPointerTable = nil; static void GSSetupEncodingTable(void) { if (nil == encodingPointerTable) { GS_MUTEX_LOCK(local_lock); if (nil == encodingPointerTable) { unsigned i; /* * We want to store pointers to our string encoding info in a * large table so we can do efficient lookup by encoding value. */ encTableSize = sizeof(str_encoding_table) / sizeof(struct _strenc_); encodingPointerTable = NSCreateMapTable(NSIntegerMapKeyCallBacks, NSNonOwnedPointerMapValueCallBacks, encTableSize); RELEASE([NSObject leakAt:&encodingPointerTable]); /* * Now set up the pointers at the correct location in the table. */ for (i = 0; i < encTableSize; i++) { struct _strenc_ *entry = &str_encoding_table[i]; NSMapInsert(encodingPointerTable, (const void *)entry->enc, (const void *)entry); #ifdef HAVE_ICONV if (entry->iconv != 0 && *(entry->iconv) != 0) { iconv_t c; int l; char *lossy; /* * See if we can do a lossy conversion. */ l = strlen(entry->iconv); lossy = malloc(l + 11); memcpy(lossy, entry->iconv, l); memcpy(lossy + l, "//TRANSLIT", 11); c = iconv_open(lossy, UNICODE_ENC); if (c == (iconv_t)-1) { free(lossy); } else { entry->lossy = lossy; iconv_close(c); } } #endif } } GS_MUTEX_UNLOCK(local_lock); } } static struct _strenc_ * EntryForEncoding(NSStringEncoding enc) { struct _strenc_ *entry = 0; if (enc != 0) { GSSetupEncodingTable(); entry = NSMapGet(encodingPointerTable, (const void *)enc); } return entry; } static struct _strenc_ * EntrySupported(NSStringEncoding enc) { struct _strenc_ *entry = EntryForEncoding(enc); if (entry == 0) { return NULL; } #ifdef HAVE_ICONV if (entry->iconv != 0 && entry->supported == 0) { if (enc == NSUnicodeStringEncoding) { entry->iconv = UNICODE_ENC; entry->supported = 1; } else if (entry->iconv[0] == 0) { /* explicitly check for empty encoding name since some systems * have buggy iconv_open() code which succeeds on an empty name. */ entry->supported = -1; } else { iconv_t c; c = iconv_open(UNICODE_ENC, entry->iconv); if (c == (iconv_t)-1) { entry->supported = -1; } else { iconv_close(c); c = iconv_open(entry->iconv, UNICODE_ENC); if (c == (iconv_t)-1) { entry->supported = -1; } else { iconv_close(c); entry->supported = 1; } } } } #endif if (entry->supported == 1) { return entry; } return 0; } BOOL GSPrivateIsEncodingSupported(NSStringEncoding enc) { if (EntrySupported(enc) == 0) { return NO; } return YES; } /** Returns the NSStringEncoding that matches the specified * character set registry and encoding information. For instance, * for the iso8859-5 character set, the registry is iso8859 and * the encoding is 5, and the returned NSStringEncoding is * NSISOLatinCyrillicStringEncoding. If there is no specific encoding, * use @"0". Returns GSUndefinedEncoding if there is no match. */ NSStringEncoding GSEncodingForRegistry (NSString *registry, NSString *encoding) { NSString *charset = registry; if ([encoding length] > 0 && [encoding isEqualToString: @"0"] == NO) { charset = [NSString stringWithFormat: @"%@-%@", registry, encoding]; } return [GSMimeDocument encodingFromCharset: charset]; } /** Try to deduce the string encoding from the locale string * clocale. This function looks in the Locale.encodings file * installed as part of GNUstep Base if the encoding cannot be * deduced from the clocale string itself. If clocale isn't set or * no match can be found, returns GSUndefinedEncoding. */ /* It would be really nice if this could be used in +defaultCStringEncoding, * but there are too many dependancies on other parts of the library to * make this practical (even if everything possible was written in C, * we'd still need some way to find the Locale.encodings file). */ NSStringEncoding GSEncodingFromLocale(const char *clocale) { NSStringEncoding encoding = GSUndefinedEncoding; NSString *encodstr; if (clocale == NULL || strcmp(clocale, "C") == 0 || strcmp(clocale, "POSIX") == 0) { /* Don't make any assumptions. Let caller handle that */ return encoding; } if (strchr (clocale, '.') != NULL) { /* Locale contains the 'codeset' section. Parse it and see if we know what encoding this cooresponds to */ NSString *registry; NSString *charset; NSArray *array; char *s; s = strchr (clocale, '.'); registry = [[NSString stringWithUTF8String: s+1] lowercaseString]; array = [registry componentsSeparatedByString: @"-"]; registry = [array objectAtIndex: 0]; if ([array count] > 1) { charset = [NSString stringWithFormat: @"%@-%@", registry, [array lastObject]]; } else { charset = registry; } encoding = [GSMimeDocument encodingFromCharset: charset]; } else { /* Look up the locale in our table of encodings */ NSBundle *gbundle; NSString *table; #ifdef GNUSTEP gbundle = [NSBundle bundleForLibrary: @"gnustep-base"]; #else gbundle = [NSBundle bundleForClass: NSClassFromString(@"GSXMLNode")]; #endif table = [gbundle pathForResource: @"Locale" ofType: @"encodings" inDirectory: @"Languages"]; if (table != nil) { unsigned count; NSDictionary *dict; dict = [NSDictionary dictionaryWithContentsOfFile: table]; encodstr = [dict objectForKey: [NSString stringWithUTF8String: clocale]]; if (encodstr == nil) return GSUndefinedEncoding; /* Find the matching encoding */ count = 0; while (str_encoding_table[count].enc && strcmp(str_encoding_table[count].ename, [encodstr lossyCString])) { count++; } if (str_encoding_table[count].enc) { encoding = str_encoding_table[count].enc; } if (encoding == GSUndefinedEncoding) { NSLog(@"No known GNUstep encoding for %s = %@", clocale, encodstr); } } } return encoding; } /** * Uses direct access into a two-level table to map cases.
* The two-level table method is less space efficient (but still not bad) than * a single table and a linear search, but it reduces the number of * conditional statements to just one. */ unichar uni_tolower(unichar ch) { unichar result = gs_tolower_map[ch / 256][ch % 256]; return result ? result : ch; } /** * Uses direct access into a two-level table to map cases.
* The two-level table method is less space efficient (but still not bad) than * a single table and a linear search, but it reduces the number of * conditional statements to just one. */ unichar uni_toupper(unichar ch) { unichar result = gs_toupper_map[ch / 256][ch % 256]; return result ? result : ch; } unsigned char GSPrivateUniCop(unichar u) { if (u < uni_cop_table[0].code) { return 0; // Special case for latin1 } else { unichar code; unichar count = 0; unichar first = 0; unichar last = uni_cop_table_size - 1; while (first <= last) { if (first != last) { count = (first + last) / 2; code = uni_cop_table[count].code; if (code < u) { first = count+1; } else if (code > u) { last = count-1; } else { return uni_cop_table[count].cop; } } else /* first == last */ { if (u == uni_cop_table[first].code) { return uni_cop_table[first].cop; } return 0; } } return 0; } } unsigned char uni_cop(unichar u) { return GSPrivateUniCop(u); } // uni_isnonsp(unichar u) now implemented in NSString.m unichar* uni_is_decomp(unichar u) { if (u < uni_dec_table[0].code) { return 0; // Special case for latin1 } else { unichar code; unichar count = 0; unichar first = 0; unichar last = uni_dec_table_size - 1; while (first <= last) { if (first != last) { count = (first + last) / 2; code = uni_dec_table[count].code; if (code < u) { first = count+1; } else if (code > u) { last = count-1; } else { return uni_dec_table[count].decomp; } } else /* first == last */ { if (u == uni_dec_table[first].code) { return uni_dec_table[first].decomp; } return 0; } } return 0; } } static inline int octdigit(int c) { return (c >= '0' && c < '8'); } /** * Function to check a block of data for validity as a unicode string and * say whether it contains solely ASCII or solely Latin1 data.
* Any leading BOM must already have been removed and the data must already * be in native byte order.
* Returns the number of characters which were found valid. */ unsigned GSUnicode(const unichar *chars, unsigned length, BOOL *isASCII, BOOL *isLatin1) { unsigned i = 0; unichar c; if (isASCII) *isASCII = YES; if (isLatin1) *isLatin1 = YES; while (i < length) { if ((c = chars[i++]) > 127) { if (isASCII) *isASCII = NO; i--; while (i < length) { if ((c = chars[i++]) > 255) { if (isLatin1) *isLatin1 = NO; i--; while (i < length) { c = chars[i++]; if (c >= 0xdc00 && c <= 0xdfff) { return i - 1; // Second half of a surrogate pair. } if (c >= 0xd800 && c <= 0xdbff) { // First half of a surrogate pair. if (i >= length) { return i - 1; // Second half missing } c = chars[i]; if (c < 0xdc00 || c > 0xdfff) { return i - 1; // Second half missing } i++; // Step past second half } } } } } } return i; } #define GROW() \ if (dst == 0) \ { \ /* \ * Data is just being discarded anyway, so we can \ * reset the offset into the local buffer on the \ * stack and pretend the buffer has grown. \ */ \ ptr = buf - dpos; \ bsize = dpos + BUFSIZ; \ if (extra != 0) \ { \ bsize--; \ } \ } \ else if (zone == 0) \ { \ result = NO; /* No buffer growth possible ... fail. */ \ goto done; \ } \ else \ { \ unsigned grow = slen; \ \ if (grow < bsize + BUFSIZ) \ { \ grow = bsize + BUFSIZ; \ } \ grow *= sizeof(unichar); \ \ if (ptr == buf || ptr == *dst) \ { \ unichar *tmp; \ \ tmp = NSZoneMalloc(zone, grow + extra); \ if (tmp != 0) \ { \ memcpy(tmp, ptr, bsize * sizeof(unichar)); \ } \ ptr = tmp; \ } \ else \ { \ ptr = NSZoneRealloc(zone, ptr, grow + extra); \ } \ if (ptr == 0) \ { \ result = NO; /* No buffer growth possible ... fail. */ \ goto done; \ } \ bsize = grow / sizeof(unichar); \ } #define UTF8DECODE 1 #if defined(UTF8DECODE) /* This next data (utf8d) and function (decode()) copyright ... Copyright (c) 2008-2009 Bjoern Hoehrmann Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #define UTF8_ACCEPT 0 #define UTF8_REJECT 12 static const uint8_t utf8d[] = { // The first part of the table maps bytes to character classes that // to reduce the size of the transition table and create bitmasks. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 8,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 10,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3, 11,6,6,6,5,8,8,8,8,8,8,8,8,8,8,8, // The second part is a transition table that maps a combination // of a state of the automaton and a character class to a state. 0,12,24,36,60,96,84,12,12,12,48,72, 12,12,12,12,12,12,12,12,12,12,12,12, 12, 0,12,12,12,12,12, 0,12, 0,12,12, 12,24,12,12,12,12,12,24,12,24,12,12, 12,12,12,12,12,12,12,24,12,12,12,12, 12,24,12,12,12,12,12,12,12,24,12,12, 12,12,12,12,12,12,12,36,12,36,12,12, 12,36,12,12,12,12,12,36,12,36,12,12, 12,36,12,12,12,12,12,12,12,12,12,12, }; static uint32_t inline decode(uint32_t* state, uint32_t* codep, uint32_t byte) { uint32_t type = utf8d[byte]; *codep = (*state != UTF8_ACCEPT) ? (byte & 0x3fu) | (*codep << 6) : (0xff >> type) & (byte); *state = utf8d[256 + *state + type]; return *state; } /* End of separately copyrighted section. */ #endif /** * Function to convert from 8-bit data to 16-bit unicode characters. *

The dst argument is a pointer to a pointer to a buffer in which the * converted string is to be stored. If it is a null pointer, this function * discards converted data, and is used only to determine the length of the * converted string. If the zone argument is non-nul, the function is free * to allocate a larger buffer if necessary, and store this new buffer in * the dst argument. It will *NOT* deallocate the original buffer! *

*

The size argument is a pointer to the initial size of the destination * buffer. If the function changes the buffer size, this value will be * altered to the new size. This is measured in 16-bit unicode characters, * not bytes. *

*

The src argument is a pointer to the byte sequence which is * to be converted to 16-bit unicode. *

*

The slen argument is the length of the byte sequence * which is to be converted to 16-bit unicode. * This is measured in bytes. *

*

The enc argument specifies the encoding type of the 8-bit byte sequence * which is to be converted to 16-bit unicode. *

*

The zone argument specifies a memory zone in which the function may * allocate a buffer to return data in. * If this is nul, the function will fail if the originally supplied buffer * is not big enough (unless dst is a null pointer ... indicating that * converted data is to be discarded).
* If the library is built for garbage collecting, the zone argument is used * only as a marker to say whether the function may allocate memory (zone * is non-null) or not (zone is null). *

* The options argument controls some special behavior. * * If GSUniTerminate is set, the function is expected to null terminate * the output string, and will assume that it is safe to place the nul * just beyond the end of the stated buffer size. * Also, if the function grows the buffer, it will allow for an extra * termination character. * If GSUniTemporary is set, the function will return the results in * an autoreleased buffer rather than in a buffer that the caller must * release. * If GSUniBOM is set, the function will write the first unicode * character as a byte order marker. * If GSUniShortOk is set, the function will return a buffer containing * any decoded characters even if the whole conversion fails. * *

On return, the function result is a flag indicating success (YES) * or failure (NO), and on success, the value stored in size is the number * of characters in the converted string. The converted string itself is * stored in the location given by dst.
* NB. If the value stored in dst has been changed, it is a pointer to * allocated memory which the caller is responsible for freeing, and the * caller is still responsible for freeing the original buffer. *

*/ BOOL GSToUnicode(unichar **dst, unsigned int *size, const unsigned char *src, unsigned int slen, NSStringEncoding enc, NSZone *zone, unsigned int options) { unichar buf[BUFSIZ]; unichar *ptr; unsigned bsize; unsigned dpos = 0; // Offset into destination buffer. unsigned spos = 0; // Offset into source buffer. unsigned extra = (options & GSUniTerminate) ? sizeof(unichar) : 0; unichar base = 0; unichar *table = 0; BOOL result = YES; #ifdef HAVE_ICONV iconv_t cd = (iconv_t)-1; #endif /* * Ensure we have an initial buffer set up to decode data into. */ if (dst == 0 || *size == 0) { ptr = buf; bsize = (extra != 0) ? BUFSIZ - 1 : BUFSIZ; } else { ptr = *dst; bsize = *size; } if (options & GSUniBOM) { while (dpos >= bsize) { GROW(); } ptr[dpos++] = (unichar)0xFEFF; // Insert byte order marker. } switch (enc) { case NSUTF8StringEncoding: { uint32_t u = 0; #if defined(UTF8DECODE) uint32_t state = 0; #endif while (spos < slen) { #if defined(UTF8DECODE) if (decode(&state, &u, src[spos++])) { continue; } #else uint8_t c = src[spos]; u = c; if (c > 0x7f) { int i, sle = 0; /* legal first byte of a multibyte character? */ if (c <= 0xc1 || c >= 0xf5) { /* (0x7f <= c < 0xc0) means this is a continuation * of a multibyte character without the first byte. * * (0xc0 == c || 0xc1 == c) are always illegal because * * (c >= 0xf5) would be for a multibyte character * outside the unicode range. */ result = NO; goto done; } /* calculated the expected sequence length */ while (c & 0x80) { c = c << 1; sle++; } /* do we have enough bytes ? */ if ((spos + sle) > slen) { result = NO; goto done; } /* get the codepoint */ for (i = 1; i < sle; i++) { if (src[spos + i] < 0x80 || src[spos + i] >= 0xc0) break; u = (u << 6) | (src[spos + i] & 0x3f); } if (i < sle) { result = NO; goto done; } u = u & ~(0xffffffff << ((5 * sle) + 1)); spos += sle; /* How many bytes needed to encode this character? */ if (u < 0x80) { i = 1; } else if (u < 0x800) { i = 2; } else if (u < 0x10000) { i = 3; } else { i = 4; } if (0 && i < sle) { result = NO; // Character was not minimally encoded. goto done; } if ((u >= 0xd800) && (u <= 0xdfff)) { result = NO; // Unmatched half of surrogate pair. goto done; } if (u > 0x10ffff) { result = NO; // Outside the unicode range. goto done; } } else { spos++; } #endif /* * Add codepoint as either a single unichar for BMP * or as a pair of surrogates for codepoints over 16 bits. */ if (dpos >= bsize) { GROW(); } if (u < 0x10000) { ptr[dpos++] = u; } else { unichar ul, uh; u -= 0x10000; ul = u & 0x3ff; uh = (u >> 10) & 0x3ff; ptr[dpos++] = uh + 0xd800; if (dpos >= bsize) { GROW(); } ptr[dpos++] = ul + 0xdc00; // NSLog(@"Adding uh %d ul %d", uh + 0xd800, ul + 0xdc00); } } #if defined(UTF8DECODE) if (state != UTF8_ACCEPT) { result = NO; // Parse failure goto done; } #endif } break; case NSNonLossyASCIIStringEncoding: { unsigned int index = 0; unsigned int count = 0; while (index < slen) { uint8_t c = (uint8_t)((unc)src[index++]); if ('\\' == c) { if (index < slen) { c = (uint8_t)((unc)src[index++]); if ('\\' == c) { count++; // Escaped backslash } else if (octdigit(c) && (index < slen && octdigit(src[index++])) && (index < slen && octdigit(src[index++]))) { count++; // Octal escape } else if (('u' == c) && (index < slen && isxdigit(src[index++])) && (index < slen && isxdigit(src[index++])) && (index < slen && isxdigit(src[index++])) && (index < slen && isxdigit(src[index++]))) { count++; // Hex escape for unicode } else { result = NO; // illegal backslash escape goto done; } } else { result = NO; // unbalanced backslash goto done; } } else { count++; } } if (dst == 0) { /* Just counting bytes. */ dpos += count; } else { if (dpos + count + (extra ? 1 : 0) > bsize) { if (zone == 0) { result = NO; /* No buffer growth possible ... fail. */ goto done; } else { unsigned grow = (dpos + count) * sizeof(unichar); unichar *tmp; tmp = NSZoneMalloc(zone, grow + extra * sizeof(unichar)); if ((ptr == buf || ptr == *dst) && (tmp != 0)) { memcpy(tmp, ptr, bsize * sizeof(unichar)); } if (ptr != buf && ptr != *dst) { NSZoneFree(zone, ptr); } ptr = tmp; if (ptr == 0) { return NO; /* Not enough memory */ } bsize = grow / sizeof(unichar); } } while (spos < slen) { uint8_t c = (uint8_t)((unc)src[spos++]); if ('\\' == c) { c = (uint8_t)((unc)src[spos++]); if ('\\' == c) { ptr[dpos++] = c; } else if ('u' == c) { int i = 0; for (count = 0; count < 4; count++) { c = (uint8_t)((unc)src[spos++]); i *= 16; if (isdigit(c)) { i += c - '0'; } else if (isupper(c)) { i += 10 + c - 'A'; } else { i += 10 + c - 'a'; } } ptr[dpos++] = i; } else { int i = c - '0'; c = (uint8_t)((unc)src[spos++]); i = i * 8 + c - '0'; c = (uint8_t)((unc)src[spos++]); i = i * 8 + c - '0'; ptr[dpos++] = i; } } else { ptr[dpos++] = c; } } } } break; case NSASCIIStringEncoding: if (dst == 0) { /* Just counting bytes, and we know there is exactly one * unicode codepoint needed for each ascii character. */ dpos += slen; } else { /* Because we know that each ascii character is exactly * one unicode character, we can check the destination * buffer size and allocate more space in one go, before * entering the loop where we deal with each character. */ if (dpos + slen + (extra ? 1 : 0) > bsize) { if (zone == 0) { result = NO; /* No buffer growth possible ... fail. */ goto done; } else { unsigned grow = (dpos + slen) * sizeof(unichar); unichar *tmp; tmp = NSZoneMalloc(zone, grow + extra * sizeof(unichar)); if ((ptr == buf || ptr == *dst) && (tmp != 0)) { memcpy(tmp, ptr, bsize * sizeof(unichar)); } if (ptr != buf && ptr != *dst) { NSZoneFree(zone, ptr); } ptr = tmp; if (ptr == 0) { return NO; /* Not enough memory */ } bsize = grow / sizeof(unichar); } } while (spos < slen) { unichar c = (unichar)((unc)src[spos++]); if (c > 127) { result = NO; // Non-ascii data found in input. goto done; } ptr[dpos++] = c; } } break; case NSISOLatin1StringEncoding: if (dst == 0) { /* Just counting bytes, and we know there is exactly one * unicode codepoint needed for each latin1 character. */ dpos += slen; } else { /* Because we know that each latin1 chartacter is exactly * one unicode character, we can check the destination * buffer size and allocate more space in one go, before * entering the loop where we deal with each character. */ if (dpos + slen + (extra ? 1 : 0) > bsize) { if (zone == 0) { result = NO; /* No buffer growth possible ... fail. */ goto done; } else { unsigned grow = (dpos + slen) * sizeof(unichar); unichar *tmp; tmp = NSZoneMalloc(zone, grow + extra * sizeof(unichar)); if ((ptr == buf || ptr == *dst) && (tmp != 0)) { memcpy(tmp, ptr, bsize * sizeof(unichar)); } if (ptr != buf && ptr != *dst) { NSZoneFree(zone, ptr); } ptr = tmp; if (ptr == 0) { return NO; /* Not enough memory */ } bsize = grow / sizeof(unichar); } } while (spos < slen) { ptr[dpos++] = (unichar)((unc)src[spos++]); } } break; case NSNEXTSTEPStringEncoding: base = Next_conv_base; table = Next_char_to_uni_table; goto tables; case NSISOCyrillicStringEncoding: base = Cyrillic_conv_base; table = Cyrillic_char_to_uni_table; goto tables; case NSISOLatin2StringEncoding: base = Latin2_conv_base; table = Latin2_char_to_uni_table; goto tables; case NSISOLatin9StringEncoding: base = Latin9_conv_base; table = Latin9_char_to_uni_table; goto tables; case NSISOThaiStringEncoding: base = Thai_conv_base; table = Thai_char_to_uni_table; goto tables; #if 0 case NSSymbolStringEncoding: base = Symbol_conv_base; table = Symbol_char_to_uni_table; goto tables; #endif tables: if (dst == 0) { /* Just counting bytes, and we know there is exactly one * unicode codepoint needed for each character. */ dpos += slen; } else { /* Because we know that each character in the table is exactly * one unicode character, we can check the destination * buffer size and allocate more space in one go, before * entering the loop where we deal with each character. */ if (dpos + slen + (extra ? 1 : 0) > bsize) { if (zone == 0) { result = NO; /* No buffer growth possible ... fail. */ goto done; } else { unsigned grow = (dpos + slen) * sizeof(unichar); unichar *tmp; tmp = NSZoneMalloc(zone, grow + extra * sizeof(unichar)); if ((ptr == buf || ptr == *dst) && (tmp != 0)) { memcpy(tmp, ptr, bsize * sizeof(unichar)); } if (ptr != buf && ptr != *dst) { NSZoneFree(zone, ptr); } ptr = tmp; if (ptr == 0) { return NO; /* Not enough memory */ } bsize = grow / sizeof(unichar); } } while (spos < slen) { unc c = (unc)src[spos]; if (c < base) { ptr[dpos++] = c; } else { ptr[dpos++] = table[c - base]; } spos++; } } break; case NSGSM0338StringEncoding: while (spos < slen) { unc c = (unc)src[spos]; if (dpos >= bsize) { GROW(); } ptr[dpos] = GSM0338_char_to_uni_table[c]; if (c == 0x1b && spos < slen + 1) { unsigned i = 0; c = (unc)src[spos + 1]; while (i < sizeof(GSM0338_escapes)/sizeof(GSM0338_escapes[0])) { if (GSM0338_escapes[i].to == c) { ptr[dpos] = GSM0338_escapes[i].from; spos++; break; } i++; } } dpos++; spos++; } break; default: #ifdef HAVE_ICONV { struct _strenc_ *encInfo; unsigned char *inbuf; unsigned char *outbuf; size_t inbytesleft; size_t outbytesleft; size_t rval; const char *estr = 0; BOOL done = NO; if ((encInfo = EntrySupported(enc)) != 0) { estr = encInfo->iconv; } /* explicitly check for empty encoding name since some systems * have buggy iconv_open() code which succeeds on an empty name. */ if (estr == 0) { NSLog(@"GSToUnicode() No iconv for encoding x%02x", enc); result = NO; goto done; } if (slen == 0) { break; // Nothing to do } cd = iconv_open(UNICODE_ENC, estr); if (cd == (iconv_t)-1) { NSLog(@"GSToUnicode() No iconv for encoding %@ tried to use %s", GSPrivateEncodingName(enc), estr); result = NO; goto done; } inbuf = (unsigned char*)src; inbytesleft = slen; outbuf = (unsigned char*)ptr; outbytesleft = bsize * sizeof(unichar); do { if (inbytesleft == 0) { done = YES; // Flush iconv rval = iconv(cd, 0, 0, (void*)&outbuf, &outbytesleft); } else { rval = iconv(cd, (void*)&inbuf, &inbytesleft, (void*)&outbuf, &outbytesleft); } dpos = (bsize * sizeof(unichar) - outbytesleft) / sizeof(unichar); if (rval == (size_t)-1) { if (errno == E2BIG) { unsigned old = bsize; GROW(); outbuf = (unsigned char*)&ptr[dpos]; outbytesleft += (bsize - old) * sizeof(unichar); } else { result = NO; goto done; } } } while (!done || rval != 0); } #else result = NO; #endif } done: #ifdef HAVE_ICONV if (cd != (iconv_t)-1) { iconv_close(cd); } #endif if (NULL == ptr) { *size = 0; } else { /* * Post conversion ... terminate if needed, and set output values. */ if (extra != 0 && dst != 0) { ptr[dpos] = (unichar)0; } *size = dpos; if (dst != 0 && (result == YES || (options & GSUniShortOk))) { if (options & GSUniTemporary) { unsigned bytes = dpos * sizeof(unichar) + extra; void *r; /* * Temporary string was requested ... make one. */ r = GSAutoreleasedBuffer(bytes); memcpy(r, ptr, bytes); if (ptr != buf && ptr != *dst) { NSZoneFree(zone, ptr); } ptr = r; *dst = ptr; } else if (zone != 0 && (ptr == buf || bsize > dpos)) { unsigned bytes = dpos * sizeof(unichar) + extra; /* * Resizing is permitted, try ensure we return a buffer which * is just big enough to hold the converted string. */ if (ptr == buf || ptr == *dst) { unichar *tmp; tmp = NSZoneMalloc(zone, bytes); if (tmp != 0) { memcpy(tmp, ptr, bytes); } ptr = tmp; } else { ptr = NSZoneRealloc(zone, ptr, bytes); } *dst = ptr; } else if (ptr == buf) { ptr = NULL; result = NO; } else { *dst = ptr; } } else if (ptr != buf && dst != 0 && ptr != *dst) { NSZoneFree(zone, ptr); } } if (dst) NSCAssert(*dst != buf, @"attempted to pass out pointer to internal buffer"); return result; } #undef GROW #define GROW() \ if (dst == 0) \ { \ /* \ * Data is just being discarded anyway, so we can \ * reset the offset into the local buffer on the \ * stack and pretend the buffer has grown. \ */ \ ptr = buf - dpos; \ bsize = dpos + BUFSIZ; \ if (extra != 0) \ { \ bsize--; \ } \ } \ else if (zone == 0) \ { \ result = NO; /* No buffer growth possible ... fail. */ \ goto done; \ } \ else \ { \ unsigned grow = slen; \ \ if (grow < bsize + BUFSIZ) \ { \ grow = bsize + BUFSIZ; \ } \ \ if (ptr == buf || ptr == *dst) \ { \ unsigned char *tmp; \ \ tmp = NSZoneMalloc(zone, grow + extra); \ if (tmp != 0) \ { \ memcpy(tmp, ptr, bsize); \ } \ ptr = tmp; \ } \ else \ { \ ptr = NSZoneRealloc(zone, ptr, grow + extra); \ } \ if (ptr == 0) \ { \ result = NO; /* No buffer growth possible ... fail. */ \ goto done; \ } \ bsize = grow; \ } static inline int chop(unichar c, _ucc_ *table, int hi) { int lo = 0; while (hi > lo) { int i = (hi + lo) / 2; unichar from = table[i].from; if (from < c) { lo = i + 1; } else if (from > c) { hi = i; } else { return i; // Found } } return -1; // Not found } /** * Function to convert from 16-bit unicode to 8-bit data. *

The dst argument is a pointer to a pointer to a buffer in which the * converted data is to be stored. If it is a null pointer, this function * discards converted data, and is used only to determine the length of the * converted data. If the zone argument is non-nul, the function is free * to allocate a larger buffer if necessary, and store this new buffer in * the dst argument. It will *NOT* deallocate the original buffer! *

*

The size argument is a pointer to the initial size of the destination * buffer. If the function changes the buffer size, this value will be * altered to the new size. This is measured in bytes. *

*

The src argument is a pointer to the 16-bit unicode string which is * to be converted to 8-bit data. *

*

The slen argument is the length of the 16-bit unicode string * which is to be converted to 8-bit data. * This is measured in 16-bit characters, not bytes. *

*

The enc argument specifies the encoding type of the 8-bit byte sequence * which is to be produced from the 16-bit unicode. *

*

The zone argument specifies a memory zone in which the function may * allocate a buffer to return data in. * If this is nul, the function will fail if the originally supplied buffer * is not big enough (unless dst is a null pointer ... indicating that * converted data is to be discarded).
* If the library is built for garbage collecting, the zone argument is used * only as a marker to say whether the function may allocate memory (zone * is non-null) or not (zone is null). *

* The options argument controls some special behavior. * * If GSUniStrict is set, the function will fail if a character is * encountered in the source which can't be converted. Otherwise, some * approximation or marker will be placed in the destination. * If GSUniTerminate is set, the function is expected to nul terminate * the output data, and will assume that it is safe to place the nul * just beyond the end of the stated buffer size. * Also, if the function grows the buffer, it will allow for an extra * termination byte. * If GSUniTemporary is set, the function will return the results in * an autoreleased buffer rather than in a buffer that the caller must * release. * If GSUniBOM is set, the function will read the first unicode * character as a byte order marker. * If GSUniShortOk is set, the function will return a buffer containing * any decoded characters even if the whole conversion fails. * *

On return, the function result is a flag indicating success (YES) * or failure (NO), and on success, the value stored in size is the number * of bytes in the converted data. The converted data itself is * stored in the location given by dst.
* NB. If the value stored in dst has been changed, it is a pointer to * allocated memory which the caller is responsible for freeing, and the * caller is still responsible for freeing the original buffer. *

*/ BOOL GSFromUnicode(unsigned char **dst, unsigned int *size, const unichar *src, unsigned int slen, NSStringEncoding enc, NSZone *zone, unsigned int options) { unsigned char buf[BUFSIZ]; unsigned char *ptr; unsigned bsize; unsigned dpos = 0; // Offset into destination buffer. unsigned spos = 0; // Offset into source buffer. unsigned extra = (options & GSUniTerminate) ? 1 : 0; BOOL strict = (options & GSUniStrict) ? YES : NO; unichar base = 0; _ucc_ *table = 0; unsigned tsize = 0; unsigned char escape = 0; _ucc_ *etable = 0; unsigned etsize = 0; _ucc_ *ltable = 0; unsigned ltsize = 0; BOOL swapped = NO; BOOL result = YES; #ifdef HAVE_ICONV iconv_t cd = (iconv_t)-1; #endif if (options & GSUniBOM) { if (slen == 0) { *size = 0; result = NO; // Missing byte order marker. } else { unichar c; c = *src++; slen--; if (c != 0xFEFF) { if (c == 0xFFFE) { swapped = YES; } else { *size = 0; result = NO; // Illegal byte order marker. } } } } /* * Ensure we have an initial buffer set up to decode data into. */ if (dst == 0 || *size == 0) { ptr = buf; bsize = (extra != 0) ? BUFSIZ - 1 : BUFSIZ; } else { ptr = *dst; bsize = *size; } if (result == NO) { goto done; } #ifdef HAVE_ICONV if (strict == NO && enc != NSUTF8StringEncoding && enc != NSGSM0338StringEncoding) { goto iconv_start; // For lossy conversion } #endif switch (enc) { case NSUTF8StringEncoding: { if (swapped == YES) { while (spos < slen) { unichar u1, u2; unsigned char reversed[8]; unsigned long u; int sl; int i; /* get first unichar */ u1 = src[spos++]; u1 = (((u1 & 0xff00) >> 8) + ((u1 & 0x00ff) << 8)); /* Fast track ... if this is actually an ascii character * it just converts straight to utf-8 */ if (u1 <= 0x7f) { if (dpos >= bsize) { GROW(); } ptr[dpos++] = (unsigned char)u1; continue; } // 0xfeff is a zero-width-no-break-space inside text if (u1 >= 0xdc00 && u1 <= 0xdfff) // bad pairing { if (strict) { result = NO; goto done; } continue; // Skip invalid character. } /* possibly get second character and calculate 'u' */ if ((u1 >= 0xd800) && (u1 < 0xdc00)) { if (spos >= slen) { if (strict) { result = NO; goto done; } continue; // At end. } /* get second unichar */ u2 = src[spos++]; u2 = (((u2 & 0xff00) >> 8) + ((u2 & 0x00ff) << 8)); if ((u2 < 0xdc00) || (u2 > 0xdfff)) { spos--; if (strict) { result = NO; goto done; } continue; // Skip bad half of surrogate pair. } /* make the full value */ u = ((unsigned long)(u1 - 0xd800) * 0x400) + (u2 - 0xdc00) + 0x10000; } else { u = u1; } /* calculate the sequence length * a length of 1 was dealt with earlier */ if (u <= 0x7ff) { sl = 2; } else if (u <= 0xffff) { sl = 3; } else if (u <= 0x1fffff) { sl = 4; } else if (u <= 0x3ffffff) { sl = 5; } else { sl = 6; } /* make sure we have enough space for it */ while (dpos + sl >= bsize) { GROW(); } /* split value into reversed array */ for (i = 0; i < sl; i++) { reversed[i] = (u & 0x3f); u = u >> 6; } ptr[dpos++] = reversed[sl-1] | ((0xff << (8-sl)) & 0xff); /* add bytes into the output sequence */ for (i = sl - 2; i >= 0; i--) { ptr[dpos++] = reversed[i] | 0x80; } } } else { while (spos < slen) { unichar u1, u2; unsigned char reversed[8]; unsigned long u; int sl; int i; /* get first unichar */ u1 = src[spos++]; /* Fast track ... if this is actually an ascii character * it just converts straight to utf-8 */ if (u1 <= 0x7f) { if (dpos >= bsize) { GROW(); } ptr[dpos++] = (unsigned char)u1; continue; } // 0xfeff is a zero-width-no-break-space inside text if (u1 >= 0xdc00 && u1 <= 0xdfff) // bad pairing { if (strict) { result = NO; goto done; } continue; // Skip invalid character. } /* possibly get second character and calculate 'u' */ if ((u1 >= 0xd800) && (u1 < 0xdc00)) { if (spos >= slen) { if (strict) { result = NO; goto done; } continue; // At end. } /* get second unichar */ u2 = src[spos++]; if ((u2 < 0xdc00) || (u2 > 0xdfff)) { spos--; if (strict) { result = NO; goto done; } continue; // Skip bad half of surrogate pair. } /* make the full value */ u = ((unsigned long)(u1 - 0xd800) * 0x400) + (u2 - 0xdc00) + 0x10000; } else { u = u1; } /* calculate the sequence length * a length of 1 was dealt with earlier */ if (u <= 0x7ff) { sl = 2; } else if (u <= 0xffff) { sl = 3; } else if (u <= 0x1fffff) { sl = 4; } else if (u <= 0x3ffffff) { sl = 5; } else { sl = 6; } /* make sure we have enough space for it */ while (dpos + sl >= bsize) { GROW(); } /* split value into reversed array */ for (i = 0; i < sl; i++) { reversed[i] = (u & 0x3f); u = u >> 6; } ptr[dpos++] = reversed[sl-1] | ((0xff << (8-sl)) & 0xff); /* add bytes into the output sequence */ for (i = sl - 2; i >= 0; i--) { ptr[dpos++] = reversed[i] | 0x80; } } } } break; case NSNonLossyASCIIStringEncoding: { unsigned int index = 0; unsigned int count = 0; if (YES == swapped) { while (index < slen) { unichar u = src[index++]; u = (((u & 0xff00) >> 8) + ((u & 0x00ff) << 8)); if (u < 256) { if ((u >= ' ' && u < 127) || '\r' == u || '\n' == u || '\t' == u) { count++; if ('\\' == u) { count++; } } else { count += 4; } } else { count += 12; } } } else { while (index < slen) { unichar u = src[index++]; if (u < 256) { if ((u >= ' ' && u < 127) || '\r' == u || '\n' == u || '\t' == u) { count++; if ('\\' == u) { count++; } } else { count += 4; } } else { count += 6; } } } if (dst == 0) { /* Just counting bytes ... */ dpos = count; } else { /* We can now check the destination buffer size and allocate * more space in one go, before entering the loop where we * deal with each character. */ if (count > bsize) { if (zone == 0) { result = NO; /* No buffer growth possible ... fail. */ goto done; } else { uint8_t *tmp; tmp = NSZoneMalloc(zone, count + extra); if (ptr != buf && ptr != *dst) { NSZoneFree(zone, ptr); } ptr = tmp; if (ptr == 0) { return NO; /* Not enough memory */ } bsize = count; } } index = 0; while (index < slen) { unichar u = src[index++]; if (YES == swapped) { u = (((u & 0xff00) >> 8) + ((u & 0x00ff) << 8)); } if (u < 256) { if ((u >= ' ' && u < 127) || '\r' == u || '\n' == u || '\t' == u) { ptr[dpos++] = (unsigned char)u; if ('\\' == u) { ptr[dpos++] = (unsigned char)u; } } else { char octchars[] = "01234567"; ptr[dpos++] = '\\'; ptr[dpos++] = octchars[(u >> 6) & 7]; ptr[dpos++] = octchars[(u >> 3) & 7]; ptr[dpos++] = octchars[u & 7]; } } else { char hexchars[] = "0123456789abcdef"; ptr[dpos++] = '\\'; ptr[dpos++] = 'u'; ptr[dpos++] = hexchars[(u >> 12) & 0xF]; ptr[dpos++] = hexchars[(u >> 8) & 0xF]; ptr[dpos++] = hexchars[(u >> 4) & 0xF]; ptr[dpos++] = hexchars[u & 0xF]; } } } } goto done; case NSASCIIStringEncoding: base = 128; goto bases; case NSISOLatin1StringEncoding: case NSUnicodeStringEncoding: base = 256; goto bases; bases: if (dst == 0) { /* Just counting bytes, and we know there is exactly one * unicode codepoint needed for each character. */ dpos = slen; } else { /* Because we know that each ascii character is exactly * one unicode character, we can check the destination * buffer size and allocate more space in one go, before * entering the loop where we deal with each character. */ if (slen > bsize) { if (zone == 0) { result = NO; /* No buffer growth possible ... fail. */ goto done; } else { uint8_t *tmp; tmp = NSZoneMalloc(zone, slen + extra); if (ptr != buf && ptr != *dst) { NSZoneFree(zone, ptr); } ptr = tmp; if (ptr == 0) { return NO; /* Not enough memory */ } bsize = slen; } } } if (strict == NO) { if (swapped == YES) { while (spos < slen) { unichar u = src[spos++]; u = (((u & 0xff00) >> 8) + ((u & 0x00ff) << 8)); if (u < base) { ptr[dpos++] = (unsigned char)u; } else { ptr[dpos++] = '?'; } } } else { while (spos < slen) { unichar u = src[spos++]; if (u < base) { ptr[dpos++] = (unsigned char)u; } else { ptr[dpos++] = '?'; } } } } else { if (swapped == YES) { while (spos < slen) { unichar u = src[spos++]; u = (((u & 0xff00) >> 8) + ((u & 0x00ff) << 8)); if (u < base) { ptr[dpos++] = (unsigned char)u; } else { result = NO; goto done; } } } else { while (spos < slen) { unichar u = src[spos++]; if (u < base) { ptr[dpos++] = (unsigned char)u; } else { result = NO; goto done; } } } } break; case NSNEXTSTEPStringEncoding: base = Next_conv_base; table = Next_uni_to_char_table; tsize = Next_uni_to_char_table_size; goto tables; case NSISOCyrillicStringEncoding: base = Cyrillic_conv_base; table = Cyrillic_uni_to_char_table; tsize = Cyrillic_uni_to_char_table_size; goto tables; case NSISOLatin2StringEncoding: base = Latin2_conv_base; table = Latin2_uni_to_char_table; tsize = Latin2_uni_to_char_table_size; goto tables; case NSISOLatin9StringEncoding: base = Latin9_conv_base; table = Latin9_uni_to_char_table; tsize = Latin9_uni_to_char_table_size; goto tables; case NSISOThaiStringEncoding: base = Thai_conv_base; table = Thai_uni_to_char_table; tsize = Thai_uni_to_char_table_size; goto tables; #if 0 case NSSymbolStringEncoding: base = Symbol_conv_base; table = Symbol_uni_to_char_table; tsize = Symbol_uni_to_char_table_size; goto tables; #endif case NSGSM0338StringEncoding: base = 0; table = GSM0338_uni_to_char_table; tsize = GSM0338_tsize; escape = 0x1b; etable = GSM0338_escapes; etsize = GSM0338_esize; if (strict == NO) { ltable = GSM0338_lossy; ltsize = GSM0338_lsize; } goto tables; tables: while (spos < slen) { unichar u = src[spos++]; int i; /* Swap byte order if necessary */ if (swapped == YES) { u = (((u & 0xff00) >> 8) + ((u & 0x00ff) << 8)); } /* Grow output buffer to make room if necessary */ if (dpos >= bsize) { GROW(); } if (u < base) { /* * The character set has a lower section whose contents * are identical to unicode, so no mapping is needed. */ ptr[dpos++] = (unsigned char)u; } else if (table != 0 && (i = chop(u, table, tsize)) >= 0) { /* * The character mapping is found in a basic table. */ ptr[dpos++] = table[i].to; } else if (etable != 0 && (i = chop(u, etable, etsize)) >= 0) { /* * The character mapping is found in a table of simple * escape sequences consisting of an escape byte followed * by another single byte. */ ptr[dpos++] = escape; if (dpos >= bsize) { GROW(); } ptr[dpos++] = etable[i].to; } else if (ltable != 0 && (i = chop(u, ltable, ltsize)) >= 0) { /* * The character is found in a lossy mapping table. */ ptr[dpos++] = ltable[i].to; } else if (strict == NO) { /* * The default lossy mapping generates a question mark. */ ptr[dpos++] = '?'; } else { /* * No mapping has been found. */ result = NO; goto done; } } break; default: #ifdef HAVE_ICONV iconv_start: { struct _strenc_ *encInfo; unsigned char *inbuf; unsigned char *outbuf; size_t inbytesleft; size_t outbytesleft; size_t rval; const char *estr = 0; BOOL done = NO; if ((encInfo = EntrySupported(enc)) != 0) { if (strict == NO) { /* * Try to transliterate where no direct conversion * is available. */ estr = encInfo->lossy; } if (estr == 0) { estr = encInfo->iconv; } } /* explicitly check for empty encoding name since some systems * have buggy iconv_open() code which succeeds on an empty name. */ if (estr == 0) { NSLog(@"GSFromUnicode() No iconv for encoding x%02x", enc); result = NO; goto done; } if (slen == 0) { break; // Nothing to convert. } cd = iconv_open(estr, UNICODE_ENC); if (cd == (iconv_t)-1) { NSLog(@"GSFromUnicode() No iconv for encoding %@ tried to use %s", GSPrivateEncodingName(enc), estr); result = NO; goto done; } inbuf = (unsigned char*)src; inbytesleft = slen * sizeof(unichar); outbuf = (unsigned char*)ptr; outbytesleft = bsize; do { if (inbytesleft == 0) { done = YES; // Flush buffer rval = iconv(cd, 0, 0, (void*)&outbuf, &outbytesleft); } else { rval = iconv(cd, (void*)&inbuf, &inbytesleft, (void*)&outbuf, &outbytesleft); } dpos = bsize - outbytesleft; if (rval != 0) { if (rval == (size_t)-1) { if (errno == E2BIG) { unsigned old = bsize; GROW(); outbuf = (unsigned char*)&ptr[dpos]; outbytesleft += (bsize - old); } else if (errno == EILSEQ) { if (strict == YES) { result = NO; goto done; } /* * If we are allowing lossy conversion, we replace any * unconvertable character with a question mark. */ if (outbytesleft > 0) { *outbuf++ = '?'; outbytesleft--; inbuf += sizeof(unichar); inbytesleft -= sizeof(unichar); } } else { result = NO; goto done; } } else if (strict == YES) { /* * A positive return from iconv indicates some * irreversible (ie lossy) conversions took place, * so if we are doing strict conversions we must fail. */ result = NO; goto done; } } } while (!done || rval != 0); } #else result = NO; goto done; #endif } done: #ifdef HAVE_ICONV if (cd != (iconv_t)-1) { iconv_close(cd); } #endif if (NULL == ptr) { *size = 0; } else { /* * Post conversion ... set output values. */ if (extra != 0) { ptr[dpos] = (unsigned char)0; } *size = dpos; if (dst != 0 && (result == YES || (options & GSUniShortOk))) { if (options & GSUniTemporary) { unsigned bytes = dpos + extra; void *r; /* * Temporary string was requested ... make one. */ r = GSAutoreleasedBuffer(bytes); memcpy(r, ptr, bytes); if (ptr != buf && ptr != *dst) { NSZoneFree(zone, ptr); } ptr = r; *dst = ptr; } else if (zone != 0 && (ptr == buf || bsize > dpos)) { unsigned bytes = dpos + extra; /* * Resizing is permitted - try ensure we return a buffer * which is just big enough to hold the converted string. */ if (ptr == buf || ptr == *dst) { unsigned char *tmp; tmp = NSZoneMalloc(zone, bytes); if (tmp != 0) { memcpy(tmp, ptr, bytes); } ptr = tmp; } else { ptr = NSZoneRealloc(zone, ptr, bytes); } *dst = ptr; } else if (ptr == buf) { ptr = NULL; result = NO; } else { *dst = ptr; } } else if (ptr != buf && dst != 0 && ptr != *dst) { NSZoneFree(zone, ptr); } } if (dst) NSCAssert(*dst != buf, @"attempted to pass out pointer to internal buffer"); return result; } #undef GROW NSStringEncoding* GSPrivateAvailableEncodings() { if (_availableEncodings == 0) { GSSetupEncodingTable(); GS_MUTEX_LOCK(local_lock); if (_availableEncodings == 0) { NSStringEncoding *encodings; unsigned pos; unsigned i; /* * Now build up a list of supported encodings ... in the * format needed to support [NSString+availableStringEncodings] * Check to see what iconv support we have as we go along. * This is also the place where we determine the name we use * for iconv to support unicode. */ encodings = malloc(sizeof(NSStringEncoding) * (encTableSize+1)); pos = 0; for (i = 0; i < encTableSize; i++) { NSStringEncoding encoding = str_encoding_table[i].enc; if (GSPrivateIsEncodingSupported(encoding) == YES) { encodings[pos++] = encoding; } } encodings[pos] = 0; _availableEncodings = encodings; } GS_MUTEX_UNLOCK(local_lock); } return _availableEncodings; } NSStringEncoding GSPrivateCStringEncoding(const char *encoding) { NSStringEncoding enc = GSUndefinedEncoding; if (0 != encoding) { GSSetupEncodingTable(); if (strcmp(encoding, "ANSI_X3.4-1968") == 0 /* glibc */ || strcmp(encoding, "ISO_646.IRV:1983") == 0 /* glibc */ || strcmp(encoding, "646") == 0 /* Solaris NetBSD */) enc = NSISOLatin1StringEncoding; else if (strcmp(encoding, "EUC-JP") == 0 /* glibc */ /* HP-UX IRIX OSF/1 Solaris NetBSD */ || strcmp(encoding, "eucJP") == 0 || strcmp(encoding, "IBM-eucJP") == 0 /* AIX */) enc = NSJapaneseEUCStringEncoding; else if (strcmp(encoding, "UTF-8") == 0 /* glibc AIX OSF/1 Solaris */ || strcmp(encoding, "utf8") == 0 /* HP-UX */) enc = NSUTF8StringEncoding; else if (strcmp(encoding, "ISO-8859-1") == 0 /* glibc */ /* AIX IRIX OSF/1 Solaris NetBSD */ || strcmp(encoding, "ISO8859-1") == 0 || strcmp(encoding, "iso88591") == 0 /* HP-UX */) enc = NSISOLatin1StringEncoding; else if (strcmp(encoding, "IBM-932") == 0 /* AIX */ || strcmp(encoding, "SJIS") == 0 /* HP-UX OSF/1 NetBSD */ || strcmp(encoding, "PCK") == 0 /* Solaris */) enc = NSShiftJISStringEncoding; else if (strcmp(encoding, "ISO-8859-2") == 0 /* glibc */ /* AIX IRIX OSF/1 Solaris NetBSD */ || strcmp(encoding, "ISO8859-2") == 0 || strcmp(encoding, "iso88592") == 0 /* HP-UX */) enc = NSISOLatin2StringEncoding; else if (strcmp(encoding, "CP1251") == 0 /* glibc */ || strcmp(encoding, "ansi-1251") == 0 /* Solaris */) enc = NSWindowsCP1251StringEncoding; else if (strcmp(encoding, "CP1252") == 0 /* */ || strcmp(encoding, "IBM-1252") == 0 /* AIX */) enc = NSWindowsCP1252StringEncoding; else if (strcmp(encoding, "ISO-8859-5") == 0 /* glibc */ /* AIX IRIX OSF/1 Solaris NetBSD */ || strcmp(encoding, "ISO8859-5") == 0 || strcmp(encoding, "iso88595") == 0 /* HP-UX */) enc = NSISOCyrillicStringEncoding; else if (strcmp(encoding, "KOI8-R") == 0 /* glibc */ || strcmp(encoding, "koi8-r") == 0 /* Solaris */) enc = NSKOI8RStringEncoding; else if (strcmp(encoding, "ISO-8859-3") == 0 /* glibc */ || strcmp(encoding, "ISO8859-3") == 0 /* Solaris */) enc = NSISOLatin3StringEncoding; else if (strcmp(encoding, "ISO-8859-4") == 0 /* */ || strcmp(encoding, "ISO8859-4") == 0 /* OSF/1 Solaris NetBSD */) enc = NSISOLatin4StringEncoding; else if (strcmp(encoding, "ISO-8859-6") == 0 /* glibc */ || strcmp(encoding, "ISO8859-6") == 0 /* AIX Solaris */ || strcmp(encoding, "iso88596") == 0 /* HP-UX */) enc = NSISOArabicStringEncoding; else if (strcmp(encoding, "ISO-8859-7") == 0 /* glibc */ || strcmp(encoding, "ISO8859-7") == 0 /* AIX IRIX OSF/1 Solaris */ || strcmp(encoding, "iso88597") == 0 /* HP-UX */) enc = NSISOGreekStringEncoding; else if (strcmp(encoding, "ISO-8859-8") == 0 /* glibc */ || strcmp(encoding, "ISO8859-8") == 0 /* AIX OSF/1 Solaris */ || strcmp(encoding, "iso88598") == 0 /* HP-UX */) enc = NSISOHebrewStringEncoding; else if (strcmp(encoding, "ISO-8859-9") == 0 /* glibc */ || strcmp(encoding, "ISO8859-9") == 0 /* AIX IRIX OSF/1 Solaris */ || strcmp(encoding, "iso88599") == 0 /* HP-UX */) enc = NSISOLatin5StringEncoding; else if (strcmp(encoding, "ISO-8859-10") == 0 /* */ || strcmp(encoding, "ISO8859-10") == 0 /* */) enc = NSISOLatin6StringEncoding; else if (strcmp(encoding, "TIS-620") == 0 /* glibc AIX */ || strcmp(encoding, "tis620") == 0 /* HP-UX */ || strcmp(encoding, "TIS620.2533") == 0 /* Solaris */ || strcmp(encoding, "TACTIS") == 0 /* OSF/1 */) enc = NSISOThaiStringEncoding; else if (strcmp(encoding, "ISO-8859-13") == 0 /* glibc */ || strcmp(encoding, "ISO8859-13") == 0 /* */ || strcmp(encoding, "IBM-921") == 0 /* AIX */) enc = NSISOLatin7StringEncoding; else if (strcmp(encoding, "ISO-8859-14") == 0 /* glibc */ || strcmp(encoding, "ISO8859-14") == 0 /* */) enc = NSISOLatin8StringEncoding; else if (strcmp(encoding, "ISO-8859-15") == 0 /* glibc */ /* AIX OSF/1 Solaris NetBSD */ || strcmp(encoding, "ISO8859-15") == 0 || strcmp(encoding, "iso885915") == 0 /* HP-UX */) enc = NSISOLatin9StringEncoding; else if (strcmp(encoding, "GB2312") == 0 /* glibc */ || strcmp(encoding, "gb2312") == 0 /* Solaris */ || strcmp(encoding, "eucCN") == 0 /* IRIX NetBSD */ || strcmp(encoding, "IBM-eucCN") == 0 /* AIX */ || strcmp(encoding, "hp15CN") == 0 /* HP-UX */) enc = NSChineseEUCStringEncoding; else if (strcmp(encoding, "BIG5") == 0 /* glibc Solaris NetBSD */ || strcmp(encoding, "big5") == 0 /* AIX HP-UX OSF/1 */) enc = NSBig5StringEncoding; else if (strcmp(encoding, "EUC-KR") == 0 /* glibc */ || strcmp(encoding, "eucKR") == 0 /* HP-UX IRIX OSF/1 NetBSD */ || strcmp(encoding, "IBM-eucKR") == 0 /* AIX */ || strcmp(encoding, "5601") == 0 /* Solaris */) enc = NSKoreanEUCStringEncoding; else if (strcmp(encoding, "CP437") == 0 || strcmp(encoding, "IBM-437") == 0) enc = NSDOSLatinUSStringEncoding; else if (strcmp(encoding, "CP737") == 0 || strcmp(encoding, "IBM-737") == 0) enc = NSDOSGreekStringEncoding; else if (strcmp(encoding, "CP775") == 0 || strcmp(encoding, "IBM-775") == 0) enc = NSDOSBalticRimStringEncoding; else if (strcmp(encoding, "CP850") == 0 || strcmp(encoding, "IBM-850") == 0) enc = NSDOSLatin1StringEncoding; else if (strcmp(encoding, "CP851") == 0 || strcmp(encoding, "IBM-851") == 0) enc = NSDOSGreek1StringEncoding; else if (strcmp(encoding, "CP852") == 0 || strcmp(encoding, "IBM-852") == 0) enc = NSDOSLatin2StringEncoding; else if (strcmp(encoding, "CP855") == 0 || strcmp(encoding, "IBM-855") == 0) enc = NSDOSCyrillicStringEncoding; else if (strcmp(encoding, "CP857") == 0 || strcmp(encoding, "IBM-857") == 0) enc = NSDOSTurkishStringEncoding; else if (strcmp(encoding, "CP860") == 0 || strcmp(encoding, "IBM-860") == 0) enc = NSDOICortugueseStringEncoding; else if (strcmp(encoding, "CP861") == 0 || strcmp(encoding, "IBM-861") == 0) enc = NSDOSIcelandicStringEncoding; else if (strcmp(encoding, "CP862") == 0 || strcmp(encoding, "IBM-862") == 0) enc = NSDOSHebrewStringEncoding; else if (strcmp(encoding, "CP863") == 0 || strcmp(encoding, "IBM-863") == 0) enc = NSDOSCanadianFrenchStringEncoding; else if (strcmp(encoding, "CP864") == 0 || strcmp(encoding, "IBM-864") == 0) enc = NSDOSArabicStringEncoding; else if (strcmp(encoding, "CP865") == 0 || strcmp(encoding, "IBM-865") == 0) enc = NSDOSNordicStringEncoding; else if (strcmp(encoding, "CP866") == 0 || strcmp(encoding, "IBM-866") == 0) enc = NSDOSRussianStringEncoding; else if (strcmp(encoding, "CP869") == 0 || strcmp(encoding, "IBM-869") == 0) enc = NSDOSGreek2StringEncoding; else if (strcmp(encoding, "CP874") == 0 || strcmp(encoding, "IBM-874") == 0) enc = NSDOSThaiStringEncoding; else if (strcmp(encoding, "CP932") == 0 || strcmp(encoding, "IBM-932") == 0) enc = NSDOSJapaneseStringEncoding; else if (strcmp(encoding, "CP936") == 0 || strcmp(encoding, "IBM-936") == 0 || strcmp(encoding, "GBK") == 0) enc = NSDOSChineseSimplifStringEncoding; else if (strcmp(encoding, "CP949") == 0 || strcmp(encoding, "IBM-949") == 0) enc = NSDOSKoreanStringEncoding; else if (strcmp(encoding, "CP950") == 0 || strcmp(encoding, "IBM-950") == 0) enc = NSDOSChineseTradStringEncoding; else if (strcmp(encoding, "CP1255") == 0 || strcmp(encoding, "WINDOWS-1255") == 0) enc = NSWindowsHebrewStringEncoding; else if (strcmp(encoding, "CP1256") == 0 || strcmp(encoding, "WINDOWS-1256") == 0) enc = NSWindowsArabicStringEncoding; else if (strcmp(encoding, "CP1257") == 0 || strcmp(encoding, "WINDOWS-1257") == 0) enc = NSWindowsBalticRimStringEncoding; else if (strcmp(encoding, "CP1258") == 0 || strcmp(encoding, "WINDOWS-1258") == 0) enc = NSWindowsVietnameseStringEncoding; else if (strcmp(encoding, "CP1361") == 0 || strcmp(encoding, "WINDOWS-1361") == 0) enc = NSWindowsKoreanJohabStringEncoding; else if (strcmp(encoding, "GB18030") == 0) enc = NSGB_18030_2000StringEncoding; } if (enc == GSUndefinedEncoding) { #ifdef __ANDROID__ // Android uses UTF-8 as default encoding (e.g. for file paths) enc = NSUTF8StringEncoding; #else enc = NSISOLatin1StringEncoding; #endif } else if (GSPrivateIsEncodingSupported(enc) == NO) { fprintf(stderr, "WARNING: %s - encoding not implemented as " "c string encoding.\n", encoding); fprintf(stderr, " NSISOLatin1StringEncoding used instead.\n"); enc = NSISOLatin1StringEncoding; } return enc; } NSStringEncoding GSPrivateDefaultCStringEncoding() { if (defEnc == GSUndefinedEncoding) { const char *encoding = 0; unsigned int count; GSSetupEncodingTable(); GS_MUTEX_LOCK(local_lock); if (defEnc != GSUndefinedEncoding) { GS_MUTEX_UNLOCK(local_lock); return defEnc; } encoding = getenv("GNUSTEP_STRING_ENCODING"); if (encoding != 0) { count = 0; while (str_encoding_table[count].enc && strcasecmp(str_encoding_table[count].ename, encoding) && strcasecmp(str_encoding_table[count].iconv, encoding)) { count++; } if (str_encoding_table[count].enc) { defEnc = str_encoding_table[count].enc; } else { fprintf(stderr, "WARNING: %s - encoding not supported.\n", encoding); fprintf(stderr, " NSISOLatin1StringEncoding set as default.\n"); defEnc = NSISOLatin1StringEncoding; } } if (defEnc == GSUndefinedEncoding) { defEnc = GSPrivateICUCStringEncoding(); } if (defEnc == GSUndefinedEncoding) { defEnc = NSISOLatin1StringEncoding; } else if (GSPrivateIsEncodingSupported(defEnc) == NO) { fprintf(stderr, "WARNING: %s - encoding not implemented as " "default c string encoding.\n", encoding); fprintf(stderr, " NSISOLatin1StringEncoding set as default.\n"); defEnc = NSISOLatin1StringEncoding; } GS_MUTEX_UNLOCK(local_lock); } return defEnc; } NSString* GSPrivateEncodingName(NSStringEncoding encoding) { struct _strenc_ *encInfo; if ((encInfo = EntrySupported(encoding)) == NULL) { return @"Unknown encoding"; } return [NSString stringWithUTF8String: encInfo->ename]; } BOOL GSPrivateIsByteEncoding(NSStringEncoding encoding) { struct _strenc_ *encInfo; if ((encInfo = EntrySupported(encoding)) == NULL) { return NO; } return encInfo->eightBit; } /* Returns the C-String encoding as used by native locale functions. * We can use this to convert strings produced by those functions to * NSString objects. */ NSStringEncoding GSPrivateNativeCStringEncoding() { if (natEnc == GSUndefinedEncoding) { char encbuf[BUFSIZ]; #if HAVE_LANGINFO_CODESET char *old; /* Take it from the system locale information. */ [gnustep_global_lock lock]; /* Initialise locale system by setting current locale from * environment and then resetting it. Must be done before * any call to nl_langinfo() */ if (0 != (old = setlocale(LC_CTYPE, ""))) { setlocale(LC_CTYPE, old); } strncpy(encbuf, nl_langinfo(CODESET), sizeof(encbuf)-1); encbuf[sizeof(encbuf)-1] = '\0'; [gnustep_global_lock unlock]; #else encbuf[0] = '\0'; #endif natEnc = GSPrivateCStringEncoding(encbuf); } return natEnc; } /* Returns the C-String encoding as used by ICU library functions. * We can use this to convert strings produced by those functions * to NSString objects. */ NSStringEncoding GSPrivateICUCStringEncoding() { if (icuEnc == GSUndefinedEncoding) { const char *encoding = 0; #if defined(HAVE_UNICODE_UCNV_H) || defined(HAVE_ICU_H) const char *defaultName; UErrorCode err = U_ZERO_ERROR; defaultName = ucnv_getDefaultName (); encoding = ucnv_getStandardName (defaultName, "MIME", &err); if (0 == encoding) { encoding = ucnv_getStandardName (defaultName, "IANA", &err); } #endif icuEnc = GSPrivateCStringEncoding(encoding); } return icuEnc; } gnustep-base-1.29.0/Source/Additions/unicode/000077500000000000000000000000001435650067400210165ustar00rootroot00000000000000gnustep-base-1.29.0/Source/Additions/unicode/caseconv.h000066400000000000000000002025151435650067400227750ustar00rootroot00000000000000#ifndef __caseconv_h_GNUSTEP_BASE_INCLUDE #define __caseconv_h_GNUSTEP_BASE_INCLUDE /* Copyright (C) 2005 Free Software Foundation Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. */ static unichar gs_casemap_empty_table[] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }; static unichar gs_tolower_map_table_0[] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x61, /* 41 */ 0x62, /* 42 */ 0x63, /* 43 */ 0x64, /* 44 */ 0x65, /* 45 */ 0x66, /* 46 */ 0x67, /* 47 */ 0x68, /* 48 */ 0x69, /* 49 */ 0x6a, /* 4a */ 0x6b, /* 4b */ 0x6c, /* 4c */ 0x6d, /* 4d */ 0x6e, /* 4e */ 0x6f, /* 4f */ 0x70, /* 50 */ 0x71, /* 51 */ 0x72, /* 52 */ 0x73, /* 53 */ 0x74, /* 54 */ 0x75, /* 55 */ 0x76, /* 56 */ 0x77, /* 57 */ 0x78, /* 58 */ 0x79, /* 59 */ 0x7a, /* 5a */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, /* c0 */ 0xe1, /* c1 */ 0xe2, /* c2 */ 0xe3, /* c3 */ 0xe4, /* c4 */ 0xe5, /* c5 */ 0xe6, /* c6 */ 0xe7, /* c7 */ 0xe8, /* c8 */ 0xe9, /* c9 */ 0xea, /* ca */ 0xeb, /* cb */ 0xec, /* cc */ 0xed, /* cd */ 0xee, /* ce */ 0xef, /* cf */ 0xf0, /* d0 */ 0xf1, /* d1 */ 0xf2, /* d2 */ 0xf3, /* d3 */ 0xf4, /* d4 */ 0xf5, /* d5 */ 0xf6, /* d6 */ 0x0, 0xf8, /* d8 */ 0xf9, /* d9 */ 0xfa, /* da */ 0xfb, /* db */ 0xfc, /* dc */ 0xfd, /* dd */ 0xfe, /* de */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }; static unichar gs_tolower_map_table_1[] = { 0x101, /* 0 */ 0x0, 0x103, /* 2 */ 0x0, 0x105, /* 4 */ 0x0, 0x107, /* 6 */ 0x0, 0x109, /* 8 */ 0x0, 0x10b, /* a */ 0x0, 0x10d, /* c */ 0x0, 0x10f, /* e */ 0x0, 0x111, /* 10 */ 0x0, 0x113, /* 12 */ 0x0, 0x115, /* 14 */ 0x0, 0x117, /* 16 */ 0x0, 0x119, /* 18 */ 0x0, 0x11b, /* 1a */ 0x0, 0x11d, /* 1c */ 0x0, 0x11f, /* 1e */ 0x0, 0x121, /* 20 */ 0x0, 0x123, /* 22 */ 0x0, 0x125, /* 24 */ 0x0, 0x127, /* 26 */ 0x0, 0x129, /* 28 */ 0x0, 0x12b, /* 2a */ 0x0, 0x12d, /* 2c */ 0x0, 0x12f, /* 2e */ 0x0, 0x69, /* 30 */ 0x0, 0x133, /* 32 */ 0x0, 0x135, /* 34 */ 0x0, 0x137, /* 36 */ 0x0, 0x0, 0x13a, /* 39 */ 0x0, 0x13c, /* 3b */ 0x0, 0x13e, /* 3d */ 0x0, 0x140, /* 3f */ 0x0, 0x142, /* 41 */ 0x0, 0x144, /* 43 */ 0x0, 0x146, /* 45 */ 0x0, 0x148, /* 47 */ 0x0, 0x0, 0x14b, /* 4a */ 0x0, 0x14d, /* 4c */ 0x0, 0x14f, /* 4e */ 0x0, 0x151, /* 50 */ 0x0, 0x153, /* 52 */ 0x0, 0x155, /* 54 */ 0x0, 0x157, /* 56 */ 0x0, 0x159, /* 58 */ 0x0, 0x15b, /* 5a */ 0x0, 0x15d, /* 5c */ 0x0, 0x15f, /* 5e */ 0x0, 0x161, /* 60 */ 0x0, 0x163, /* 62 */ 0x0, 0x165, /* 64 */ 0x0, 0x167, /* 66 */ 0x0, 0x169, /* 68 */ 0x0, 0x16b, /* 6a */ 0x0, 0x16d, /* 6c */ 0x0, 0x16f, /* 6e */ 0x0, 0x171, /* 70 */ 0x0, 0x173, /* 72 */ 0x0, 0x175, /* 74 */ 0x0, 0x177, /* 76 */ 0x0, 0xff, /* 78 */ 0x17a, /* 79 */ 0x0, 0x17c, /* 7b */ 0x0, 0x17e, /* 7d */ 0x0, 0x0, 0x0, 0x253, /* 81 */ 0x183, /* 82 */ 0x0, 0x185, /* 84 */ 0x0, 0x254, /* 86 */ 0x188, /* 87 */ 0x0, 0x256, /* 89 */ 0x257, /* 8a */ 0x18c, /* 8b */ 0x0, 0x0, 0x1dd, /* 8e */ 0x259, /* 8f */ 0x25b, /* 90 */ 0x192, /* 91 */ 0x0, 0x260, /* 93 */ 0x263, /* 94 */ 0x0, 0x269, /* 96 */ 0x268, /* 97 */ 0x199, /* 98 */ 0x0, 0x0, 0x0, 0x26f, /* 9c */ 0x272, /* 9d */ 0x0, 0x275, /* 9f */ 0x1a1, /* a0 */ 0x0, 0x1a3, /* a2 */ 0x0, 0x1a5, /* a4 */ 0x0, 0x280, /* a6 */ 0x1a8, /* a7 */ 0x0, 0x283, /* a9 */ 0x0, 0x0, 0x1ad, /* ac */ 0x0, 0x288, /* ae */ 0x1b0, /* af */ 0x0, 0x28a, /* b1 */ 0x28b, /* b2 */ 0x1b4, /* b3 */ 0x0, 0x1b6, /* b5 */ 0x0, 0x292, /* b7 */ 0x1b9, /* b8 */ 0x0, 0x0, 0x0, 0x1bd, /* bc */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c6, /* c4 */ 0x1c6, /* c5 */ 0x0, 0x1c9, /* c7 */ 0x1c9, /* c8 */ 0x0, 0x1cc, /* ca */ 0x1cc, /* cb */ 0x0, 0x1ce, /* cd */ 0x0, 0x1d0, /* cf */ 0x0, 0x1d2, /* d1 */ 0x0, 0x1d4, /* d3 */ 0x0, 0x1d6, /* d5 */ 0x0, 0x1d8, /* d7 */ 0x0, 0x1da, /* d9 */ 0x0, 0x1dc, /* db */ 0x0, 0x0, 0x1df, /* de */ 0x0, 0x1e1, /* e0 */ 0x0, 0x1e3, /* e2 */ 0x0, 0x1e5, /* e4 */ 0x0, 0x1e7, /* e6 */ 0x0, 0x1e9, /* e8 */ 0x0, 0x1eb, /* ea */ 0x0, 0x1ed, /* ec */ 0x0, 0x1ef, /* ee */ 0x0, 0x0, 0x1f3, /* f1 */ 0x1f3, /* f2 */ 0x0, 0x1f5, /* f4 */ 0x0, 0x195, /* f6 */ 0x1bf, /* f7 */ 0x1f9, /* f8 */ 0x0, 0x1fb, /* fa */ 0x0, 0x1fd, /* fc */ 0x0, 0x1ff, /* fe */ 0x0, }; static unichar gs_tolower_map_table_2[] = { 0x201, /* 0 */ 0x0, 0x203, /* 2 */ 0x0, 0x205, /* 4 */ 0x0, 0x207, /* 6 */ 0x0, 0x209, /* 8 */ 0x0, 0x20b, /* a */ 0x0, 0x20d, /* c */ 0x0, 0x20f, /* e */ 0x0, 0x211, /* 10 */ 0x0, 0x213, /* 12 */ 0x0, 0x215, /* 14 */ 0x0, 0x217, /* 16 */ 0x0, 0x219, /* 18 */ 0x0, 0x21b, /* 1a */ 0x0, 0x21d, /* 1c */ 0x0, 0x21f, /* 1e */ 0x0, 0x0, 0x0, 0x223, /* 22 */ 0x0, 0x225, /* 24 */ 0x0, 0x227, /* 26 */ 0x0, 0x229, /* 28 */ 0x0, 0x22b, /* 2a */ 0x0, 0x22d, /* 2c */ 0x0, 0x22f, /* 2e */ 0x0, 0x231, /* 30 */ 0x0, 0x233, /* 32 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }; static unichar gs_tolower_map_table_3[] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3ac, /* 86 */ 0x0, 0x3ad, /* 88 */ 0x3ae, /* 89 */ 0x3af, /* 8a */ 0x0, 0x3cc, /* 8c */ 0x0, 0x3cd, /* 8e */ 0x3ce, /* 8f */ 0x0, 0x3b1, /* 91 */ 0x3b2, /* 92 */ 0x3b3, /* 93 */ 0x3b4, /* 94 */ 0x3b5, /* 95 */ 0x3b6, /* 96 */ 0x3b7, /* 97 */ 0x3b8, /* 98 */ 0x3b9, /* 99 */ 0x3ba, /* 9a */ 0x3bb, /* 9b */ 0x3bc, /* 9c */ 0x3bd, /* 9d */ 0x3be, /* 9e */ 0x3bf, /* 9f */ 0x3c0, /* a0 */ 0x3c1, /* a1 */ 0x0, 0x3c3, /* a3 */ 0x3c4, /* a4 */ 0x3c5, /* a5 */ 0x3c6, /* a6 */ 0x3c7, /* a7 */ 0x3c8, /* a8 */ 0x3c9, /* a9 */ 0x3ca, /* aa */ 0x3cb, /* ab */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3db, /* da */ 0x0, 0x3dd, /* dc */ 0x0, 0x3df, /* de */ 0x0, 0x3e1, /* e0 */ 0x0, 0x3e3, /* e2 */ 0x0, 0x3e5, /* e4 */ 0x0, 0x3e7, /* e6 */ 0x0, 0x3e9, /* e8 */ 0x0, 0x3eb, /* ea */ 0x0, 0x3ed, /* ec */ 0x0, 0x3ef, /* ee */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }; static unichar gs_tolower_map_table_4[] = { 0x450, /* 0 */ 0x451, /* 1 */ 0x452, /* 2 */ 0x453, /* 3 */ 0x454, /* 4 */ 0x455, /* 5 */ 0x456, /* 6 */ 0x457, /* 7 */ 0x458, /* 8 */ 0x459, /* 9 */ 0x45a, /* a */ 0x45b, /* b */ 0x45c, /* c */ 0x45d, /* d */ 0x45e, /* e */ 0x45f, /* f */ 0x430, /* 10 */ 0x431, /* 11 */ 0x432, /* 12 */ 0x433, /* 13 */ 0x434, /* 14 */ 0x435, /* 15 */ 0x436, /* 16 */ 0x437, /* 17 */ 0x438, /* 18 */ 0x439, /* 19 */ 0x43a, /* 1a */ 0x43b, /* 1b */ 0x43c, /* 1c */ 0x43d, /* 1d */ 0x43e, /* 1e */ 0x43f, /* 1f */ 0x440, /* 20 */ 0x441, /* 21 */ 0x442, /* 22 */ 0x443, /* 23 */ 0x444, /* 24 */ 0x445, /* 25 */ 0x446, /* 26 */ 0x447, /* 27 */ 0x448, /* 28 */ 0x449, /* 29 */ 0x44a, /* 2a */ 0x44b, /* 2b */ 0x44c, /* 2c */ 0x44d, /* 2d */ 0x44e, /* 2e */ 0x44f, /* 2f */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x461, /* 60 */ 0x0, 0x463, /* 62 */ 0x0, 0x465, /* 64 */ 0x0, 0x467, /* 66 */ 0x0, 0x469, /* 68 */ 0x0, 0x46b, /* 6a */ 0x0, 0x46d, /* 6c */ 0x0, 0x46f, /* 6e */ 0x0, 0x471, /* 70 */ 0x0, 0x473, /* 72 */ 0x0, 0x475, /* 74 */ 0x0, 0x477, /* 76 */ 0x0, 0x479, /* 78 */ 0x0, 0x47b, /* 7a */ 0x0, 0x47d, /* 7c */ 0x0, 0x47f, /* 7e */ 0x0, 0x481, /* 80 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x48d, /* 8c */ 0x0, 0x48f, /* 8e */ 0x0, 0x491, /* 90 */ 0x0, 0x493, /* 92 */ 0x0, 0x495, /* 94 */ 0x0, 0x497, /* 96 */ 0x0, 0x499, /* 98 */ 0x0, 0x49b, /* 9a */ 0x0, 0x49d, /* 9c */ 0x0, 0x49f, /* 9e */ 0x0, 0x4a1, /* a0 */ 0x0, 0x4a3, /* a2 */ 0x0, 0x4a5, /* a4 */ 0x0, 0x4a7, /* a6 */ 0x0, 0x4a9, /* a8 */ 0x0, 0x4ab, /* aa */ 0x0, 0x4ad, /* ac */ 0x0, 0x4af, /* ae */ 0x0, 0x4b1, /* b0 */ 0x0, 0x4b3, /* b2 */ 0x0, 0x4b5, /* b4 */ 0x0, 0x4b7, /* b6 */ 0x0, 0x4b9, /* b8 */ 0x0, 0x4bb, /* ba */ 0x0, 0x4bd, /* bc */ 0x0, 0x4bf, /* be */ 0x0, 0x0, 0x4c2, /* c1 */ 0x0, 0x4c4, /* c3 */ 0x0, 0x0, 0x0, 0x4c8, /* c7 */ 0x0, 0x0, 0x0, 0x4cc, /* cb */ 0x0, 0x0, 0x0, 0x0, 0x4d1, /* d0 */ 0x0, 0x4d3, /* d2 */ 0x0, 0x4d5, /* d4 */ 0x0, 0x4d7, /* d6 */ 0x0, 0x4d9, /* d8 */ 0x0, 0x4db, /* da */ 0x0, 0x4dd, /* dc */ 0x0, 0x4df, /* de */ 0x0, 0x4e1, /* e0 */ 0x0, 0x4e3, /* e2 */ 0x0, 0x4e5, /* e4 */ 0x0, 0x4e7, /* e6 */ 0x0, 0x4e9, /* e8 */ 0x0, 0x4eb, /* ea */ 0x0, 0x4ed, /* ec */ 0x0, 0x4ef, /* ee */ 0x0, 0x4f1, /* f0 */ 0x0, 0x4f3, /* f2 */ 0x0, 0x4f5, /* f4 */ 0x0, 0x0, 0x0, 0x4f9, /* f8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }; static unichar gs_tolower_map_table_5[] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x561, /* 31 */ 0x562, /* 32 */ 0x563, /* 33 */ 0x564, /* 34 */ 0x565, /* 35 */ 0x566, /* 36 */ 0x567, /* 37 */ 0x568, /* 38 */ 0x569, /* 39 */ 0x56a, /* 3a */ 0x56b, /* 3b */ 0x56c, /* 3c */ 0x56d, /* 3d */ 0x56e, /* 3e */ 0x56f, /* 3f */ 0x570, /* 40 */ 0x571, /* 41 */ 0x572, /* 42 */ 0x573, /* 43 */ 0x574, /* 44 */ 0x575, /* 45 */ 0x576, /* 46 */ 0x577, /* 47 */ 0x578, /* 48 */ 0x579, /* 49 */ 0x57a, /* 4a */ 0x57b, /* 4b */ 0x57c, /* 4c */ 0x57d, /* 4d */ 0x57e, /* 4e */ 0x57f, /* 4f */ 0x580, /* 50 */ 0x581, /* 51 */ 0x582, /* 52 */ 0x583, /* 53 */ 0x584, /* 54 */ 0x585, /* 55 */ 0x586, /* 56 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }; static unichar gs_tolower_map_table_1e[] = { 0x1e01, /* 0 */ 0x0, 0x1e03, /* 2 */ 0x0, 0x1e05, /* 4 */ 0x0, 0x1e07, /* 6 */ 0x0, 0x1e09, /* 8 */ 0x0, 0x1e0b, /* a */ 0x0, 0x1e0d, /* c */ 0x0, 0x1e0f, /* e */ 0x0, 0x1e11, /* 10 */ 0x0, 0x1e13, /* 12 */ 0x0, 0x1e15, /* 14 */ 0x0, 0x1e17, /* 16 */ 0x0, 0x1e19, /* 18 */ 0x0, 0x1e1b, /* 1a */ 0x0, 0x1e1d, /* 1c */ 0x0, 0x1e1f, /* 1e */ 0x0, 0x1e21, /* 20 */ 0x0, 0x1e23, /* 22 */ 0x0, 0x1e25, /* 24 */ 0x0, 0x1e27, /* 26 */ 0x0, 0x1e29, /* 28 */ 0x0, 0x1e2b, /* 2a */ 0x0, 0x1e2d, /* 2c */ 0x0, 0x1e2f, /* 2e */ 0x0, 0x1e31, /* 30 */ 0x0, 0x1e33, /* 32 */ 0x0, 0x1e35, /* 34 */ 0x0, 0x1e37, /* 36 */ 0x0, 0x1e39, /* 38 */ 0x0, 0x1e3b, /* 3a */ 0x0, 0x1e3d, /* 3c */ 0x0, 0x1e3f, /* 3e */ 0x0, 0x1e41, /* 40 */ 0x0, 0x1e43, /* 42 */ 0x0, 0x1e45, /* 44 */ 0x0, 0x1e47, /* 46 */ 0x0, 0x1e49, /* 48 */ 0x0, 0x1e4b, /* 4a */ 0x0, 0x1e4d, /* 4c */ 0x0, 0x1e4f, /* 4e */ 0x0, 0x1e51, /* 50 */ 0x0, 0x1e53, /* 52 */ 0x0, 0x1e55, /* 54 */ 0x0, 0x1e57, /* 56 */ 0x0, 0x1e59, /* 58 */ 0x0, 0x1e5b, /* 5a */ 0x0, 0x1e5d, /* 5c */ 0x0, 0x1e5f, /* 5e */ 0x0, 0x1e61, /* 60 */ 0x0, 0x1e63, /* 62 */ 0x0, 0x1e65, /* 64 */ 0x0, 0x1e67, /* 66 */ 0x0, 0x1e69, /* 68 */ 0x0, 0x1e6b, /* 6a */ 0x0, 0x1e6d, /* 6c */ 0x0, 0x1e6f, /* 6e */ 0x0, 0x1e71, /* 70 */ 0x0, 0x1e73, /* 72 */ 0x0, 0x1e75, /* 74 */ 0x0, 0x1e77, /* 76 */ 0x0, 0x1e79, /* 78 */ 0x0, 0x1e7b, /* 7a */ 0x0, 0x1e7d, /* 7c */ 0x0, 0x1e7f, /* 7e */ 0x0, 0x1e81, /* 80 */ 0x0, 0x1e83, /* 82 */ 0x0, 0x1e85, /* 84 */ 0x0, 0x1e87, /* 86 */ 0x0, 0x1e89, /* 88 */ 0x0, 0x1e8b, /* 8a */ 0x0, 0x1e8d, /* 8c */ 0x0, 0x1e8f, /* 8e */ 0x0, 0x1e91, /* 90 */ 0x0, 0x1e93, /* 92 */ 0x0, 0x1e95, /* 94 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1ea1, /* a0 */ 0x0, 0x1ea3, /* a2 */ 0x0, 0x1ea5, /* a4 */ 0x0, 0x1ea7, /* a6 */ 0x0, 0x1ea9, /* a8 */ 0x0, 0x1eab, /* aa */ 0x0, 0x1ead, /* ac */ 0x0, 0x1eaf, /* ae */ 0x0, 0x1eb1, /* b0 */ 0x0, 0x1eb3, /* b2 */ 0x0, 0x1eb5, /* b4 */ 0x0, 0x1eb7, /* b6 */ 0x0, 0x1eb9, /* b8 */ 0x0, 0x1ebb, /* ba */ 0x0, 0x1ebd, /* bc */ 0x0, 0x1ebf, /* be */ 0x0, 0x1ec1, /* c0 */ 0x0, 0x1ec3, /* c2 */ 0x0, 0x1ec5, /* c4 */ 0x0, 0x1ec7, /* c6 */ 0x0, 0x1ec9, /* c8 */ 0x0, 0x1ecb, /* ca */ 0x0, 0x1ecd, /* cc */ 0x0, 0x1ecf, /* ce */ 0x0, 0x1ed1, /* d0 */ 0x0, 0x1ed3, /* d2 */ 0x0, 0x1ed5, /* d4 */ 0x0, 0x1ed7, /* d6 */ 0x0, 0x1ed9, /* d8 */ 0x0, 0x1edb, /* da */ 0x0, 0x1edd, /* dc */ 0x0, 0x1edf, /* de */ 0x0, 0x1ee1, /* e0 */ 0x0, 0x1ee3, /* e2 */ 0x0, 0x1ee5, /* e4 */ 0x0, 0x1ee7, /* e6 */ 0x0, 0x1ee9, /* e8 */ 0x0, 0x1eeb, /* ea */ 0x0, 0x1eed, /* ec */ 0x0, 0x1eef, /* ee */ 0x0, 0x1ef1, /* f0 */ 0x0, 0x1ef3, /* f2 */ 0x0, 0x1ef5, /* f4 */ 0x0, 0x1ef7, /* f6 */ 0x0, 0x1ef9, /* f8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }; static unichar gs_tolower_map_table_1f[] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f00, /* 8 */ 0x1f01, /* 9 */ 0x1f02, /* a */ 0x1f03, /* b */ 0x1f04, /* c */ 0x1f05, /* d */ 0x1f06, /* e */ 0x1f07, /* f */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f10, /* 18 */ 0x1f11, /* 19 */ 0x1f12, /* 1a */ 0x1f13, /* 1b */ 0x1f14, /* 1c */ 0x1f15, /* 1d */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f20, /* 28 */ 0x1f21, /* 29 */ 0x1f22, /* 2a */ 0x1f23, /* 2b */ 0x1f24, /* 2c */ 0x1f25, /* 2d */ 0x1f26, /* 2e */ 0x1f27, /* 2f */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f30, /* 38 */ 0x1f31, /* 39 */ 0x1f32, /* 3a */ 0x1f33, /* 3b */ 0x1f34, /* 3c */ 0x1f35, /* 3d */ 0x1f36, /* 3e */ 0x1f37, /* 3f */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f40, /* 48 */ 0x1f41, /* 49 */ 0x1f42, /* 4a */ 0x1f43, /* 4b */ 0x1f44, /* 4c */ 0x1f45, /* 4d */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f51, /* 59 */ 0x0, 0x1f53, /* 5b */ 0x0, 0x1f55, /* 5d */ 0x0, 0x1f57, /* 5f */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f60, /* 68 */ 0x1f61, /* 69 */ 0x1f62, /* 6a */ 0x1f63, /* 6b */ 0x1f64, /* 6c */ 0x1f65, /* 6d */ 0x1f66, /* 6e */ 0x1f67, /* 6f */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f80, /* 88 */ 0x1f81, /* 89 */ 0x1f82, /* 8a */ 0x1f83, /* 8b */ 0x1f84, /* 8c */ 0x1f85, /* 8d */ 0x1f86, /* 8e */ 0x1f87, /* 8f */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f90, /* 98 */ 0x1f91, /* 99 */ 0x1f92, /* 9a */ 0x1f93, /* 9b */ 0x1f94, /* 9c */ 0x1f95, /* 9d */ 0x1f96, /* 9e */ 0x1f97, /* 9f */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1fa0, /* a8 */ 0x1fa1, /* a9 */ 0x1fa2, /* aa */ 0x1fa3, /* ab */ 0x1fa4, /* ac */ 0x1fa5, /* ad */ 0x1fa6, /* ae */ 0x1fa7, /* af */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1fb0, /* b8 */ 0x1fb1, /* b9 */ 0x1f70, /* ba */ 0x1f71, /* bb */ 0x1fb3, /* bc */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f72, /* c8 */ 0x1f73, /* c9 */ 0x1f74, /* ca */ 0x1f75, /* cb */ 0x1fc3, /* cc */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1fd0, /* d8 */ 0x1fd1, /* d9 */ 0x1f76, /* da */ 0x1f77, /* db */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1fe0, /* e8 */ 0x1fe1, /* e9 */ 0x1f7a, /* ea */ 0x1f7b, /* eb */ 0x1fe5, /* ec */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f78, /* f8 */ 0x1f79, /* f9 */ 0x1f7c, /* fa */ 0x1f7d, /* fb */ 0x1ff3, /* fc */ 0x0, 0x0, 0x0, }; static unichar gs_tolower_map_table_21[] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c9, /* 26 */ 0x0, 0x0, 0x0, 0x6b, /* 2a */ 0xe5, /* 2b */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2170, /* 60 */ 0x2171, /* 61 */ 0x2172, /* 62 */ 0x2173, /* 63 */ 0x2174, /* 64 */ 0x2175, /* 65 */ 0x2176, /* 66 */ 0x2177, /* 67 */ 0x2178, /* 68 */ 0x2179, /* 69 */ 0x217a, /* 6a */ 0x217b, /* 6b */ 0x217c, /* 6c */ 0x217d, /* 6d */ 0x217e, /* 6e */ 0x217f, /* 6f */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }; static unichar gs_tolower_map_table_24[] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x24d0, /* b6 */ 0x24d1, /* b7 */ 0x24d2, /* b8 */ 0x24d3, /* b9 */ 0x24d4, /* ba */ 0x24d5, /* bb */ 0x24d6, /* bc */ 0x24d7, /* bd */ 0x24d8, /* be */ 0x24d9, /* bf */ 0x24da, /* c0 */ 0x24db, /* c1 */ 0x24dc, /* c2 */ 0x24dd, /* c3 */ 0x24de, /* c4 */ 0x24df, /* c5 */ 0x24e0, /* c6 */ 0x24e1, /* c7 */ 0x24e2, /* c8 */ 0x24e3, /* c9 */ 0x24e4, /* ca */ 0x24e5, /* cb */ 0x24e6, /* cc */ 0x24e7, /* cd */ 0x24e8, /* ce */ 0x24e9, /* cf */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }; static unichar gs_tolower_map_table_ff[] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff41, /* 21 */ 0xff42, /* 22 */ 0xff43, /* 23 */ 0xff44, /* 24 */ 0xff45, /* 25 */ 0xff46, /* 26 */ 0xff47, /* 27 */ 0xff48, /* 28 */ 0xff49, /* 29 */ 0xff4a, /* 2a */ 0xff4b, /* 2b */ 0xff4c, /* 2c */ 0xff4d, /* 2d */ 0xff4e, /* 2e */ 0xff4f, /* 2f */ 0xff50, /* 30 */ 0xff51, /* 31 */ 0xff52, /* 32 */ 0xff53, /* 33 */ 0xff54, /* 34 */ 0xff55, /* 35 */ 0xff56, /* 36 */ 0xff57, /* 37 */ 0xff58, /* 38 */ 0xff59, /* 39 */ 0xff5a, /* 3a */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }; static unichar *gs_tolower_map[] = { gs_tolower_map_table_0, gs_tolower_map_table_1, gs_tolower_map_table_2, gs_tolower_map_table_3, gs_tolower_map_table_4, gs_tolower_map_table_5, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_tolower_map_table_1e, gs_tolower_map_table_1f, gs_casemap_empty_table, gs_tolower_map_table_21, gs_casemap_empty_table, gs_casemap_empty_table, gs_tolower_map_table_24, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_tolower_map_table_ff, }; static unichar gs_toupper_map_table_0[] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x41, /* 61 */ 0x42, /* 62 */ 0x43, /* 63 */ 0x44, /* 64 */ 0x45, /* 65 */ 0x46, /* 66 */ 0x47, /* 67 */ 0x48, /* 68 */ 0x49, /* 69 */ 0x4a, /* 6a */ 0x4b, /* 6b */ 0x4c, /* 6c */ 0x4d, /* 6d */ 0x4e, /* 6e */ 0x4f, /* 6f */ 0x50, /* 70 */ 0x51, /* 71 */ 0x52, /* 72 */ 0x53, /* 73 */ 0x54, /* 74 */ 0x55, /* 75 */ 0x56, /* 76 */ 0x57, /* 77 */ 0x58, /* 78 */ 0x59, /* 79 */ 0x5a, /* 7a */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x39c, /* b5 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, /* e0 */ 0xc1, /* e1 */ 0xc2, /* e2 */ 0xc3, /* e3 */ 0xc4, /* e4 */ 0xc5, /* e5 */ 0xc6, /* e6 */ 0xc7, /* e7 */ 0xc8, /* e8 */ 0xc9, /* e9 */ 0xca, /* ea */ 0xcb, /* eb */ 0xcc, /* ec */ 0xcd, /* ed */ 0xce, /* ee */ 0xcf, /* ef */ 0xd0, /* f0 */ 0xd1, /* f1 */ 0xd2, /* f2 */ 0xd3, /* f3 */ 0xd4, /* f4 */ 0xd5, /* f5 */ 0xd6, /* f6 */ 0x0, 0xd8, /* f8 */ 0xd9, /* f9 */ 0xda, /* fa */ 0xdb, /* fb */ 0xdc, /* fc */ 0xdd, /* fd */ 0xde, /* fe */ 0x178, /* ff */ }; static unichar gs_toupper_map_table_1[] = { 0x0, 0x100, /* 1 */ 0x0, 0x102, /* 3 */ 0x0, 0x104, /* 5 */ 0x0, 0x106, /* 7 */ 0x0, 0x108, /* 9 */ 0x0, 0x10a, /* b */ 0x0, 0x10c, /* d */ 0x0, 0x10e, /* f */ 0x0, 0x110, /* 11 */ 0x0, 0x112, /* 13 */ 0x0, 0x114, /* 15 */ 0x0, 0x116, /* 17 */ 0x0, 0x118, /* 19 */ 0x0, 0x11a, /* 1b */ 0x0, 0x11c, /* 1d */ 0x0, 0x11e, /* 1f */ 0x0, 0x120, /* 21 */ 0x0, 0x122, /* 23 */ 0x0, 0x124, /* 25 */ 0x0, 0x126, /* 27 */ 0x0, 0x128, /* 29 */ 0x0, 0x12a, /* 2b */ 0x0, 0x12c, /* 2d */ 0x0, 0x12e, /* 2f */ 0x0, 0x49, /* 31 */ 0x0, 0x132, /* 33 */ 0x0, 0x134, /* 35 */ 0x0, 0x136, /* 37 */ 0x0, 0x0, 0x139, /* 3a */ 0x0, 0x13b, /* 3c */ 0x0, 0x13d, /* 3e */ 0x0, 0x13f, /* 40 */ 0x0, 0x141, /* 42 */ 0x0, 0x143, /* 44 */ 0x0, 0x145, /* 46 */ 0x0, 0x147, /* 48 */ 0x0, 0x0, 0x14a, /* 4b */ 0x0, 0x14c, /* 4d */ 0x0, 0x14e, /* 4f */ 0x0, 0x150, /* 51 */ 0x0, 0x152, /* 53 */ 0x0, 0x154, /* 55 */ 0x0, 0x156, /* 57 */ 0x0, 0x158, /* 59 */ 0x0, 0x15a, /* 5b */ 0x0, 0x15c, /* 5d */ 0x0, 0x15e, /* 5f */ 0x0, 0x160, /* 61 */ 0x0, 0x162, /* 63 */ 0x0, 0x164, /* 65 */ 0x0, 0x166, /* 67 */ 0x0, 0x168, /* 69 */ 0x0, 0x16a, /* 6b */ 0x0, 0x16c, /* 6d */ 0x0, 0x16e, /* 6f */ 0x0, 0x170, /* 71 */ 0x0, 0x172, /* 73 */ 0x0, 0x174, /* 75 */ 0x0, 0x176, /* 77 */ 0x0, 0x0, 0x179, /* 7a */ 0x0, 0x17b, /* 7c */ 0x0, 0x17d, /* 7e */ 0x53, /* 7f */ 0x0, 0x0, 0x0, 0x182, /* 83 */ 0x0, 0x184, /* 85 */ 0x0, 0x0, 0x187, /* 88 */ 0x0, 0x0, 0x0, 0x18b, /* 8c */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x191, /* 92 */ 0x0, 0x0, 0x1f6, /* 95 */ 0x0, 0x0, 0x0, 0x198, /* 99 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a0, /* a1 */ 0x0, 0x1a2, /* a3 */ 0x0, 0x1a4, /* a5 */ 0x0, 0x0, 0x1a7, /* a8 */ 0x0, 0x0, 0x0, 0x0, 0x1ac, /* ad */ 0x0, 0x0, 0x1af, /* b0 */ 0x0, 0x0, 0x0, 0x1b3, /* b4 */ 0x0, 0x1b5, /* b6 */ 0x0, 0x0, 0x1b8, /* b9 */ 0x0, 0x0, 0x0, 0x1bc, /* bd */ 0x0, 0x1f7, /* bf */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c4, /* c5 */ 0x1c4, /* c6 */ 0x0, 0x1c7, /* c8 */ 0x1c7, /* c9 */ 0x0, 0x1ca, /* cb */ 0x1ca, /* cc */ 0x0, 0x1cd, /* ce */ 0x0, 0x1cf, /* d0 */ 0x0, 0x1d1, /* d2 */ 0x0, 0x1d3, /* d4 */ 0x0, 0x1d5, /* d6 */ 0x0, 0x1d7, /* d8 */ 0x0, 0x1d9, /* da */ 0x0, 0x1db, /* dc */ 0x18e, /* dd */ 0x0, 0x1de, /* df */ 0x0, 0x1e0, /* e1 */ 0x0, 0x1e2, /* e3 */ 0x0, 0x1e4, /* e5 */ 0x0, 0x1e6, /* e7 */ 0x0, 0x1e8, /* e9 */ 0x0, 0x1ea, /* eb */ 0x0, 0x1ec, /* ed */ 0x0, 0x1ee, /* ef */ 0x0, 0x0, 0x1f1, /* f2 */ 0x1f1, /* f3 */ 0x0, 0x1f4, /* f5 */ 0x0, 0x0, 0x0, 0x1f8, /* f9 */ 0x0, 0x1fa, /* fb */ 0x0, 0x1fc, /* fd */ 0x0, 0x1fe, /* ff */ }; static unichar gs_toupper_map_table_2[] = { 0x0, 0x200, /* 1 */ 0x0, 0x202, /* 3 */ 0x0, 0x204, /* 5 */ 0x0, 0x206, /* 7 */ 0x0, 0x208, /* 9 */ 0x0, 0x20a, /* b */ 0x0, 0x20c, /* d */ 0x0, 0x20e, /* f */ 0x0, 0x210, /* 11 */ 0x0, 0x212, /* 13 */ 0x0, 0x214, /* 15 */ 0x0, 0x216, /* 17 */ 0x0, 0x218, /* 19 */ 0x0, 0x21a, /* 1b */ 0x0, 0x21c, /* 1d */ 0x0, 0x21e, /* 1f */ 0x0, 0x0, 0x0, 0x222, /* 23 */ 0x0, 0x224, /* 25 */ 0x0, 0x226, /* 27 */ 0x0, 0x228, /* 29 */ 0x0, 0x22a, /* 2b */ 0x0, 0x22c, /* 2d */ 0x0, 0x22e, /* 2f */ 0x0, 0x230, /* 31 */ 0x0, 0x232, /* 33 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x181, /* 53 */ 0x186, /* 54 */ 0x0, 0x189, /* 56 */ 0x18a, /* 57 */ 0x0, 0x18f, /* 59 */ 0x0, 0x190, /* 5b */ 0x0, 0x0, 0x0, 0x0, 0x193, /* 60 */ 0x0, 0x0, 0x194, /* 63 */ 0x0, 0x0, 0x0, 0x0, 0x197, /* 68 */ 0x196, /* 69 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x19c, /* 6f */ 0x0, 0x0, 0x19d, /* 72 */ 0x0, 0x0, 0x19f, /* 75 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a6, /* 80 */ 0x0, 0x0, 0x1a9, /* 83 */ 0x0, 0x0, 0x0, 0x0, 0x1ae, /* 88 */ 0x0, 0x1b1, /* 8a */ 0x1b2, /* 8b */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b7, /* 92 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }; static unichar gs_toupper_map_table_3[] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x399, /* 45 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x386, /* ac */ 0x388, /* ad */ 0x389, /* ae */ 0x38a, /* af */ 0x0, 0x391, /* b1 */ 0x392, /* b2 */ 0x393, /* b3 */ 0x394, /* b4 */ 0x395, /* b5 */ 0x396, /* b6 */ 0x397, /* b7 */ 0x398, /* b8 */ 0x399, /* b9 */ 0x39a, /* ba */ 0x39b, /* bb */ 0x39c, /* bc */ 0x39d, /* bd */ 0x39e, /* be */ 0x39f, /* bf */ 0x3a0, /* c0 */ 0x3a1, /* c1 */ 0x3a3, /* c2 */ 0x3a3, /* c3 */ 0x3a4, /* c4 */ 0x3a5, /* c5 */ 0x3a6, /* c6 */ 0x3a7, /* c7 */ 0x3a8, /* c8 */ 0x3a9, /* c9 */ 0x3aa, /* ca */ 0x3ab, /* cb */ 0x38c, /* cc */ 0x38e, /* cd */ 0x38f, /* ce */ 0x0, 0x392, /* d0 */ 0x398, /* d1 */ 0x0, 0x0, 0x0, 0x3a6, /* d5 */ 0x3a0, /* d6 */ 0x0, 0x0, 0x0, 0x0, 0x3da, /* db */ 0x0, 0x3dc, /* dd */ 0x0, 0x3de, /* df */ 0x0, 0x3e0, /* e1 */ 0x0, 0x3e2, /* e3 */ 0x0, 0x3e4, /* e5 */ 0x0, 0x3e6, /* e7 */ 0x0, 0x3e8, /* e9 */ 0x0, 0x3ea, /* eb */ 0x0, 0x3ec, /* ed */ 0x0, 0x3ee, /* ef */ 0x39a, /* f0 */ 0x3a1, /* f1 */ 0x3a3, /* f2 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }; static unichar gs_toupper_map_table_4[] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x410, /* 30 */ 0x411, /* 31 */ 0x412, /* 32 */ 0x413, /* 33 */ 0x414, /* 34 */ 0x415, /* 35 */ 0x416, /* 36 */ 0x417, /* 37 */ 0x418, /* 38 */ 0x419, /* 39 */ 0x41a, /* 3a */ 0x41b, /* 3b */ 0x41c, /* 3c */ 0x41d, /* 3d */ 0x41e, /* 3e */ 0x41f, /* 3f */ 0x420, /* 40 */ 0x421, /* 41 */ 0x422, /* 42 */ 0x423, /* 43 */ 0x424, /* 44 */ 0x425, /* 45 */ 0x426, /* 46 */ 0x427, /* 47 */ 0x428, /* 48 */ 0x429, /* 49 */ 0x42a, /* 4a */ 0x42b, /* 4b */ 0x42c, /* 4c */ 0x42d, /* 4d */ 0x42e, /* 4e */ 0x42f, /* 4f */ 0x400, /* 50 */ 0x401, /* 51 */ 0x402, /* 52 */ 0x403, /* 53 */ 0x404, /* 54 */ 0x405, /* 55 */ 0x406, /* 56 */ 0x407, /* 57 */ 0x408, /* 58 */ 0x409, /* 59 */ 0x40a, /* 5a */ 0x40b, /* 5b */ 0x40c, /* 5c */ 0x40d, /* 5d */ 0x40e, /* 5e */ 0x40f, /* 5f */ 0x0, 0x460, /* 61 */ 0x0, 0x462, /* 63 */ 0x0, 0x464, /* 65 */ 0x0, 0x466, /* 67 */ 0x0, 0x468, /* 69 */ 0x0, 0x46a, /* 6b */ 0x0, 0x46c, /* 6d */ 0x0, 0x46e, /* 6f */ 0x0, 0x470, /* 71 */ 0x0, 0x472, /* 73 */ 0x0, 0x474, /* 75 */ 0x0, 0x476, /* 77 */ 0x0, 0x478, /* 79 */ 0x0, 0x47a, /* 7b */ 0x0, 0x47c, /* 7d */ 0x0, 0x47e, /* 7f */ 0x0, 0x480, /* 81 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x48c, /* 8d */ 0x0, 0x48e, /* 8f */ 0x0, 0x490, /* 91 */ 0x0, 0x492, /* 93 */ 0x0, 0x494, /* 95 */ 0x0, 0x496, /* 97 */ 0x0, 0x498, /* 99 */ 0x0, 0x49a, /* 9b */ 0x0, 0x49c, /* 9d */ 0x0, 0x49e, /* 9f */ 0x0, 0x4a0, /* a1 */ 0x0, 0x4a2, /* a3 */ 0x0, 0x4a4, /* a5 */ 0x0, 0x4a6, /* a7 */ 0x0, 0x4a8, /* a9 */ 0x0, 0x4aa, /* ab */ 0x0, 0x4ac, /* ad */ 0x0, 0x4ae, /* af */ 0x0, 0x4b0, /* b1 */ 0x0, 0x4b2, /* b3 */ 0x0, 0x4b4, /* b5 */ 0x0, 0x4b6, /* b7 */ 0x0, 0x4b8, /* b9 */ 0x0, 0x4ba, /* bb */ 0x0, 0x4bc, /* bd */ 0x0, 0x4be, /* bf */ 0x0, 0x0, 0x4c1, /* c2 */ 0x0, 0x4c3, /* c4 */ 0x0, 0x0, 0x0, 0x4c7, /* c8 */ 0x0, 0x0, 0x0, 0x4cb, /* cc */ 0x0, 0x0, 0x0, 0x0, 0x4d0, /* d1 */ 0x0, 0x4d2, /* d3 */ 0x0, 0x4d4, /* d5 */ 0x0, 0x4d6, /* d7 */ 0x0, 0x4d8, /* d9 */ 0x0, 0x4da, /* db */ 0x0, 0x4dc, /* dd */ 0x0, 0x4de, /* df */ 0x0, 0x4e0, /* e1 */ 0x0, 0x4e2, /* e3 */ 0x0, 0x4e4, /* e5 */ 0x0, 0x4e6, /* e7 */ 0x0, 0x4e8, /* e9 */ 0x0, 0x4ea, /* eb */ 0x0, 0x4ec, /* ed */ 0x0, 0x4ee, /* ef */ 0x0, 0x4f0, /* f1 */ 0x0, 0x4f2, /* f3 */ 0x0, 0x4f4, /* f5 */ 0x0, 0x0, 0x0, 0x4f8, /* f9 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }; static unichar gs_toupper_map_table_5[] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x531, /* 61 */ 0x532, /* 62 */ 0x533, /* 63 */ 0x534, /* 64 */ 0x535, /* 65 */ 0x536, /* 66 */ 0x537, /* 67 */ 0x538, /* 68 */ 0x539, /* 69 */ 0x53a, /* 6a */ 0x53b, /* 6b */ 0x53c, /* 6c */ 0x53d, /* 6d */ 0x53e, /* 6e */ 0x53f, /* 6f */ 0x540, /* 70 */ 0x541, /* 71 */ 0x542, /* 72 */ 0x543, /* 73 */ 0x544, /* 74 */ 0x545, /* 75 */ 0x546, /* 76 */ 0x547, /* 77 */ 0x548, /* 78 */ 0x549, /* 79 */ 0x54a, /* 7a */ 0x54b, /* 7b */ 0x54c, /* 7c */ 0x54d, /* 7d */ 0x54e, /* 7e */ 0x54f, /* 7f */ 0x550, /* 80 */ 0x551, /* 81 */ 0x552, /* 82 */ 0x553, /* 83 */ 0x554, /* 84 */ 0x555, /* 85 */ 0x556, /* 86 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }; static unichar gs_toupper_map_table_1e[] = { 0x0, 0x1e00, /* 1 */ 0x0, 0x1e02, /* 3 */ 0x0, 0x1e04, /* 5 */ 0x0, 0x1e06, /* 7 */ 0x0, 0x1e08, /* 9 */ 0x0, 0x1e0a, /* b */ 0x0, 0x1e0c, /* d */ 0x0, 0x1e0e, /* f */ 0x0, 0x1e10, /* 11 */ 0x0, 0x1e12, /* 13 */ 0x0, 0x1e14, /* 15 */ 0x0, 0x1e16, /* 17 */ 0x0, 0x1e18, /* 19 */ 0x0, 0x1e1a, /* 1b */ 0x0, 0x1e1c, /* 1d */ 0x0, 0x1e1e, /* 1f */ 0x0, 0x1e20, /* 21 */ 0x0, 0x1e22, /* 23 */ 0x0, 0x1e24, /* 25 */ 0x0, 0x1e26, /* 27 */ 0x0, 0x1e28, /* 29 */ 0x0, 0x1e2a, /* 2b */ 0x0, 0x1e2c, /* 2d */ 0x0, 0x1e2e, /* 2f */ 0x0, 0x1e30, /* 31 */ 0x0, 0x1e32, /* 33 */ 0x0, 0x1e34, /* 35 */ 0x0, 0x1e36, /* 37 */ 0x0, 0x1e38, /* 39 */ 0x0, 0x1e3a, /* 3b */ 0x0, 0x1e3c, /* 3d */ 0x0, 0x1e3e, /* 3f */ 0x0, 0x1e40, /* 41 */ 0x0, 0x1e42, /* 43 */ 0x0, 0x1e44, /* 45 */ 0x0, 0x1e46, /* 47 */ 0x0, 0x1e48, /* 49 */ 0x0, 0x1e4a, /* 4b */ 0x0, 0x1e4c, /* 4d */ 0x0, 0x1e4e, /* 4f */ 0x0, 0x1e50, /* 51 */ 0x0, 0x1e52, /* 53 */ 0x0, 0x1e54, /* 55 */ 0x0, 0x1e56, /* 57 */ 0x0, 0x1e58, /* 59 */ 0x0, 0x1e5a, /* 5b */ 0x0, 0x1e5c, /* 5d */ 0x0, 0x1e5e, /* 5f */ 0x0, 0x1e60, /* 61 */ 0x0, 0x1e62, /* 63 */ 0x0, 0x1e64, /* 65 */ 0x0, 0x1e66, /* 67 */ 0x0, 0x1e68, /* 69 */ 0x0, 0x1e6a, /* 6b */ 0x0, 0x1e6c, /* 6d */ 0x0, 0x1e6e, /* 6f */ 0x0, 0x1e70, /* 71 */ 0x0, 0x1e72, /* 73 */ 0x0, 0x1e74, /* 75 */ 0x0, 0x1e76, /* 77 */ 0x0, 0x1e78, /* 79 */ 0x0, 0x1e7a, /* 7b */ 0x0, 0x1e7c, /* 7d */ 0x0, 0x1e7e, /* 7f */ 0x0, 0x1e80, /* 81 */ 0x0, 0x1e82, /* 83 */ 0x0, 0x1e84, /* 85 */ 0x0, 0x1e86, /* 87 */ 0x0, 0x1e88, /* 89 */ 0x0, 0x1e8a, /* 8b */ 0x0, 0x1e8c, /* 8d */ 0x0, 0x1e8e, /* 8f */ 0x0, 0x1e90, /* 91 */ 0x0, 0x1e92, /* 93 */ 0x0, 0x1e94, /* 95 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e60, /* 9b */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x1ea0, /* a1 */ 0x0, 0x1ea2, /* a3 */ 0x0, 0x1ea4, /* a5 */ 0x0, 0x1ea6, /* a7 */ 0x0, 0x1ea8, /* a9 */ 0x0, 0x1eaa, /* ab */ 0x0, 0x1eac, /* ad */ 0x0, 0x1eae, /* af */ 0x0, 0x1eb0, /* b1 */ 0x0, 0x1eb2, /* b3 */ 0x0, 0x1eb4, /* b5 */ 0x0, 0x1eb6, /* b7 */ 0x0, 0x1eb8, /* b9 */ 0x0, 0x1eba, /* bb */ 0x0, 0x1ebc, /* bd */ 0x0, 0x1ebe, /* bf */ 0x0, 0x1ec0, /* c1 */ 0x0, 0x1ec2, /* c3 */ 0x0, 0x1ec4, /* c5 */ 0x0, 0x1ec6, /* c7 */ 0x0, 0x1ec8, /* c9 */ 0x0, 0x1eca, /* cb */ 0x0, 0x1ecc, /* cd */ 0x0, 0x1ece, /* cf */ 0x0, 0x1ed0, /* d1 */ 0x0, 0x1ed2, /* d3 */ 0x0, 0x1ed4, /* d5 */ 0x0, 0x1ed6, /* d7 */ 0x0, 0x1ed8, /* d9 */ 0x0, 0x1eda, /* db */ 0x0, 0x1edc, /* dd */ 0x0, 0x1ede, /* df */ 0x0, 0x1ee0, /* e1 */ 0x0, 0x1ee2, /* e3 */ 0x0, 0x1ee4, /* e5 */ 0x0, 0x1ee6, /* e7 */ 0x0, 0x1ee8, /* e9 */ 0x0, 0x1eea, /* eb */ 0x0, 0x1eec, /* ed */ 0x0, 0x1eee, /* ef */ 0x0, 0x1ef0, /* f1 */ 0x0, 0x1ef2, /* f3 */ 0x0, 0x1ef4, /* f5 */ 0x0, 0x1ef6, /* f7 */ 0x0, 0x1ef8, /* f9 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }; static unichar gs_toupper_map_table_1f[] = { 0x1f08, /* 0 */ 0x1f09, /* 1 */ 0x1f0a, /* 2 */ 0x1f0b, /* 3 */ 0x1f0c, /* 4 */ 0x1f0d, /* 5 */ 0x1f0e, /* 6 */ 0x1f0f, /* 7 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f18, /* 10 */ 0x1f19, /* 11 */ 0x1f1a, /* 12 */ 0x1f1b, /* 13 */ 0x1f1c, /* 14 */ 0x1f1d, /* 15 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f28, /* 20 */ 0x1f29, /* 21 */ 0x1f2a, /* 22 */ 0x1f2b, /* 23 */ 0x1f2c, /* 24 */ 0x1f2d, /* 25 */ 0x1f2e, /* 26 */ 0x1f2f, /* 27 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f38, /* 30 */ 0x1f39, /* 31 */ 0x1f3a, /* 32 */ 0x1f3b, /* 33 */ 0x1f3c, /* 34 */ 0x1f3d, /* 35 */ 0x1f3e, /* 36 */ 0x1f3f, /* 37 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f48, /* 40 */ 0x1f49, /* 41 */ 0x1f4a, /* 42 */ 0x1f4b, /* 43 */ 0x1f4c, /* 44 */ 0x1f4d, /* 45 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f59, /* 51 */ 0x0, 0x1f5b, /* 53 */ 0x0, 0x1f5d, /* 55 */ 0x0, 0x1f5f, /* 57 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f68, /* 60 */ 0x1f69, /* 61 */ 0x1f6a, /* 62 */ 0x1f6b, /* 63 */ 0x1f6c, /* 64 */ 0x1f6d, /* 65 */ 0x1f6e, /* 66 */ 0x1f6f, /* 67 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1fba, /* 70 */ 0x1fbb, /* 71 */ 0x1fc8, /* 72 */ 0x1fc9, /* 73 */ 0x1fca, /* 74 */ 0x1fcb, /* 75 */ 0x1fda, /* 76 */ 0x1fdb, /* 77 */ 0x1ff8, /* 78 */ 0x1ff9, /* 79 */ 0x1fea, /* 7a */ 0x1feb, /* 7b */ 0x1ffa, /* 7c */ 0x1ffb, /* 7d */ 0x0, 0x0, 0x1f88, /* 80 */ 0x1f89, /* 81 */ 0x1f8a, /* 82 */ 0x1f8b, /* 83 */ 0x1f8c, /* 84 */ 0x1f8d, /* 85 */ 0x1f8e, /* 86 */ 0x1f8f, /* 87 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f98, /* 90 */ 0x1f99, /* 91 */ 0x1f9a, /* 92 */ 0x1f9b, /* 93 */ 0x1f9c, /* 94 */ 0x1f9d, /* 95 */ 0x1f9e, /* 96 */ 0x1f9f, /* 97 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1fa8, /* a0 */ 0x1fa9, /* a1 */ 0x1faa, /* a2 */ 0x1fab, /* a3 */ 0x1fac, /* a4 */ 0x1fad, /* a5 */ 0x1fae, /* a6 */ 0x1faf, /* a7 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1fb8, /* b0 */ 0x1fb9, /* b1 */ 0x0, 0x1fbc, /* b3 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x399, /* be */ 0x0, 0x0, 0x0, 0x0, 0x1fcc, /* c3 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1fd8, /* d0 */ 0x1fd9, /* d1 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1fe8, /* e0 */ 0x1fe9, /* e1 */ 0x0, 0x0, 0x0, 0x1fec, /* e5 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1ffc, /* f3 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }; static unichar gs_toupper_map_table_21[] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2160, /* 70 */ 0x2161, /* 71 */ 0x2162, /* 72 */ 0x2163, /* 73 */ 0x2164, /* 74 */ 0x2165, /* 75 */ 0x2166, /* 76 */ 0x2167, /* 77 */ 0x2168, /* 78 */ 0x2169, /* 79 */ 0x216a, /* 7a */ 0x216b, /* 7b */ 0x216c, /* 7c */ 0x216d, /* 7d */ 0x216e, /* 7e */ 0x216f, /* 7f */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }; static unichar gs_toupper_map_table_24[] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x24b6, /* d0 */ 0x24b7, /* d1 */ 0x24b8, /* d2 */ 0x24b9, /* d3 */ 0x24ba, /* d4 */ 0x24bb, /* d5 */ 0x24bc, /* d6 */ 0x24bd, /* d7 */ 0x24be, /* d8 */ 0x24bf, /* d9 */ 0x24c0, /* da */ 0x24c1, /* db */ 0x24c2, /* dc */ 0x24c3, /* dd */ 0x24c4, /* de */ 0x24c5, /* df */ 0x24c6, /* e0 */ 0x24c7, /* e1 */ 0x24c8, /* e2 */ 0x24c9, /* e3 */ 0x24ca, /* e4 */ 0x24cb, /* e5 */ 0x24cc, /* e6 */ 0x24cd, /* e7 */ 0x24ce, /* e8 */ 0x24cf, /* e9 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }; static unichar gs_toupper_map_table_ff[] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff21, /* 41 */ 0xff22, /* 42 */ 0xff23, /* 43 */ 0xff24, /* 44 */ 0xff25, /* 45 */ 0xff26, /* 46 */ 0xff27, /* 47 */ 0xff28, /* 48 */ 0xff29, /* 49 */ 0xff2a, /* 4a */ 0xff2b, /* 4b */ 0xff2c, /* 4c */ 0xff2d, /* 4d */ 0xff2e, /* 4e */ 0xff2f, /* 4f */ 0xff30, /* 50 */ 0xff31, /* 51 */ 0xff32, /* 52 */ 0xff33, /* 53 */ 0xff34, /* 54 */ 0xff35, /* 55 */ 0xff36, /* 56 */ 0xff37, /* 57 */ 0xff38, /* 58 */ 0xff39, /* 59 */ 0xff3a, /* 5a */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }; static unichar *gs_toupper_map[] = { gs_toupper_map_table_0, gs_toupper_map_table_1, gs_toupper_map_table_2, gs_toupper_map_table_3, gs_toupper_map_table_4, gs_toupper_map_table_5, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_toupper_map_table_1e, gs_toupper_map_table_1f, gs_casemap_empty_table, gs_toupper_map_table_21, gs_casemap_empty_table, gs_casemap_empty_table, gs_toupper_map_table_24, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_casemap_empty_table, gs_toupper_map_table_ff, }; #endif /* __caseconv_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Source/Additions/unicode/cop.h000066400000000000000000000136011435650067400217510ustar00rootroot00000000000000/* COP table * This records diacriticals and their copmbining class * FIXME ... needs updating to latest unicode */ /* Copyright (C) 2005 Free Software Foundation Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. */ struct _cop_ {unichar code; unsigned char cop;}; static struct _cop_ uni_cop_table[]= { {0x0300,230}, {0x0301,230}, {0x0302,230}, {0x0303,230}, {0x0304,230}, {0x0305,230}, {0x0306,230}, {0x0307,230}, {0x0308,230}, {0x0309,230}, {0x030A,230}, {0x030B,230}, {0x030C,230}, {0x030D,230}, {0x030E,230}, {0x030F,230}, {0x0310,230}, {0x0311,230}, {0x0312,230}, {0x0313,230}, {0x0314,230}, {0x0315,232}, {0x0316,220}, {0x0317,220}, {0x0318,220}, {0x0319,220}, {0x031A,232}, {0x031B,216}, {0x031C,220}, {0x031D,220}, {0x031E,220}, {0x031F,220}, {0x0320,220}, {0x0321,202}, {0x0322,202}, {0x0323,220}, {0x0324,220}, {0x0325,220}, {0x0326,220}, {0x0327,202}, {0x0328,202}, {0x0329,220}, {0x032A,220}, {0x032B,220}, {0x032C,220}, {0x032D,220}, {0x032E,220}, {0x032F,220}, {0x0330,220}, {0x0331,220}, {0x0332,220}, {0x0333,220}, {0x0334,1}, {0x0335,1}, {0x0336,1}, {0x0337,1}, {0x0338,1}, {0x0339,220}, {0x033A,220}, {0x033B,220}, {0x033C,220}, {0x033D,230}, {0x033E,230}, {0x033F,230}, {0x0340,230}, {0x0341,230}, {0x0342,230}, {0x0343,230}, {0x0344,230}, {0x0345,220}, {0x0360,234}, {0x0361,234}, {0x0483,230}, {0x0484,230}, {0x0485,230}, {0x0486,230}, {0x0591,220}, {0x0592,230}, {0x0593,230}, {0x0594,230}, {0x0595,230}, {0x0596,220}, {0x0597,230}, {0x0598,230}, {0x0599,230}, {0x059A,222}, {0x059B,220}, {0x059C,230}, {0x059D,230}, {0x059E,230}, {0x059F,230}, {0x05A0,230}, {0x05A1,230}, {0x05A3,220}, {0x05A4,220}, {0x05A5,220}, {0x05A6,220}, {0x05A7,220}, {0x05A8,230}, {0x05A9,230}, {0x05AA,220}, {0x05AB,230}, {0x05AC,230}, {0x05AD,222}, {0x05AE,230}, {0x05AF,230}, {0x05B0,10}, {0x05B1,11}, {0x05B2,12}, {0x05B3,13}, {0x05B4,14}, {0x05B5,15}, {0x05B6,16}, {0x05B7,17}, {0x05B8,18}, {0x05B9,19}, {0x05BB,20}, {0x05BC,21}, {0x05BD,22}, {0x05BF,23}, {0x05C1,24}, {0x05C2,25}, {0x05C4,230}, {0x064B,27}, {0x064C,28}, {0x064D,29}, {0x064E,30}, {0x064F,31}, {0x0650,32}, {0x0651,33}, {0x0652,34}, {0x0670,35}, {0x06D6,230}, {0x06D7,230}, {0x06D8,230}, {0x06D9,230}, {0x06DA,230}, {0x06DB,230}, {0x06DC,230}, {0x06DF,230}, {0x06E0,230}, {0x06E1,230}, {0x06E2,230}, {0x06E3,220}, {0x06E4,230}, {0x06E7,230}, {0x06E8,230}, {0x06EA,220}, {0x06EB,230}, {0x06EC,230}, {0x06ED,220}, {0x0901,37}, {0x0902,36}, {0x093C,7}, {0x0941,38}, {0x0942,39}, {0x0943,40}, {0x0944,41}, {0x0945,42}, {0x0946,43}, {0x0947,44}, {0x0948,45}, {0x094D,9}, {0x0951,46}, {0x0952,47}, {0x0953,230}, {0x0954,230}, {0x0962,48}, {0x0963,49}, {0x0981,50}, {0x09BC,7}, {0x09C1,51}, {0x09C2,52}, {0x09C3,53}, {0x09C4,54}, {0x09CD,9}, {0x09E2,55}, {0x09E3,56}, {0x0A02,57}, {0x0A3C,7}, {0x0A41,58}, {0x0A42,59}, {0x0A47,60}, {0x0A48,61}, {0x0A4B,62}, {0x0A4C,63}, {0x0A4D,9}, {0x0A70,64}, {0x0A71,65}, {0x0A81,67}, {0x0A82,66}, {0x0ABC,7}, {0x0AC1,68}, {0x0AC2,69}, {0x0AC3,70}, {0x0AC4,71}, {0x0AC5,72}, {0x0AC7,73}, {0x0AC8,74}, {0x0ACD,9}, {0x0B01,75}, {0x0B3C,7}, {0x0B3F,76}, {0x0B41,77}, {0x0B42,78}, {0x0B43,79}, {0x0B4D,9}, {0x0B56,230}, {0x0BC0,80}, {0x0BCD,9}, {0x0C3E,81}, {0x0C3F,82}, {0x0C40,83}, {0x0C46,84}, {0x0C47,85}, {0x0C48,86}, {0x0C4A,87}, {0x0C4B,88}, {0x0C4C,89}, {0x0C4D,9}, {0x0C55,90}, {0x0C56,91}, {0x0CBF,92}, {0x0CC6,93}, {0x0CCC,94}, {0x0CCD,9}, {0x0D41,95}, {0x0D42,96}, {0x0D43,97}, {0x0D4D,9}, {0x0E31,98}, {0x0E34,99}, {0x0E35,100}, {0x0E36,101}, {0x0E37,102}, {0x0E38,103}, {0x0E39,104}, {0x0E3A,105}, {0x0E47,106}, {0x0E48,107}, {0x0E49,108}, {0x0E4A,109}, {0x0E4B,110}, {0x0E4C,111}, {0x0E4D,112}, {0x0E4E,128}, {0x0EB1,113}, {0x0EB4,114}, {0x0EB5,115}, {0x0EB6,116}, {0x0EB7,117}, {0x0EB8,118}, {0x0EB9,119}, {0x0EBB,120}, {0x0EBC,121}, {0x0EC8,122}, {0x0EC9,123}, {0x0ECA,124}, {0x0ECB,125}, {0x0ECC,126}, {0x0ECD,127}, {0x0F18,220}, {0x0F19,220}, {0x0F35,230}, {0x0F37,230}, {0x0F39,216}, {0x0F3E,220}, {0x0F3F,220}, {0x0F71,129}, {0x0F72,130}, {0x0F73,131}, {0x0F74,132}, {0x0F75,133}, {0x0F76,134}, {0x0F77,135}, {0x0F78,136}, {0x0F79,137}, {0x0F7A,138}, {0x0F7B,139}, {0x0F7C,140}, {0x0F7D,141}, {0x0F7E,142}, {0x0F80,143}, {0x0F81,144}, {0x0F82,230}, {0x0F83,230}, {0x0F84,9}, {0x0F86,230}, {0x0F87,230}, {0x0F88,230}, {0x0F89,230}, {0x0F8A,230}, {0x0F8B,230}, {0x0F90,6}, {0x0F91,6}, {0x0F92,6}, {0x0F93,6}, {0x0F94,6}, {0x0F95,6}, {0x0F97,6}, {0x0F99,6}, {0x0F9A,6}, {0x0F9B,6}, {0x0F9C,6}, {0x0F9D,6}, {0x0F9E,6}, {0x0F9F,6}, {0x0FA0,6}, {0x0FA1,6}, {0x0FA2,6}, {0x0FA3,6}, {0x0FA4,6}, {0x0FA5,6}, {0x0FA6,6}, {0x0FA7,6}, {0x0FA8,6}, {0x0FA9,6}, {0x0FAA,6}, {0x0FAB,6}, {0x0FAC,6}, {0x0FAD,6}, {0x0FB1,6}, {0x0FB2,6}, {0x0FB3,6}, {0x0FB4,6}, {0x0FB5,6}, {0x0FB6,6}, {0x0FB7,6}, {0x0FB9,6}, {0x20D0,230}, {0x20D1,230}, {0x20D2,1}, {0x20D3,1}, {0x20D4,230}, {0x20D5,230}, {0x20D6,230}, {0x20D7,230}, {0x20D8,1}, {0x20D9,1}, {0x20DA,1}, {0x20DB,230}, {0x20DC,230}, {0x20E1,1}, {0x302A,218}, {0x302B,228}, {0x302C,232}, {0x302D,222}, {0x302E,224}, {0x302F,224}, {0x3099,8}, {0x309A,8}, {0xFB1E,26}, {0xFE20,230}, {0xFE21,230}, {0xFE22,230}, {0xFE23,230}, }; static const unsigned int uni_cop_table_size = sizeof(uni_cop_table) / sizeof(struct _cop_); gnustep-base-1.29.0/Source/Additions/unicode/cyrillic.h000066400000000000000000000076201435650067400230060ustar00rootroot00000000000000// ISO_8859-5,1988 to Unicode maping /* Copyright (C) 2005 Free Software Foundation Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. */ static const unsigned int Cyrillic_conv_base = 0x80; static unichar Cyrillic_char_to_uni_table[] = { 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, 0x0408, 0x0409, 0x040A, 0x040B, 0x040C, 0x00AD, 0x040E, 0x040F, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, 0x2116, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, 0x0458, 0x0459, 0x045A, 0x045B, 0x045C, 0x00A7, 0x045E, 0x045F, }; // Unicode to ISO_8859-5,1988 maping static const unsigned int Cyrillic_uni_to_char_table_size = 128; static _ucc_ Cyrillic_uni_to_char_table[]= { {0x0080,0x80}, {0x0081,0x81}, {0x0082,0x82}, {0x0083,0x83}, {0x0084,0x84}, {0x0085,0x85}, {0x0086,0x86}, {0x0087,0x87}, {0x0088,0x88}, {0x0089,0x89}, {0x008A,0x8A}, {0x008B,0x8B}, {0x008C,0x8C}, {0x008D,0x8D}, {0x008E,0x8E}, {0x008F,0x8F}, {0x0090,0x90}, {0x0091,0x91}, {0x0092,0x92}, {0x0093,0x93}, {0x0094,0x94}, {0x0095,0x95}, {0x0096,0x96}, {0x0097,0x97}, {0x0098,0x98}, {0x0099,0x99}, {0x009A,0x9A}, {0x009B,0x9B}, {0x009C,0x9C}, {0x009D,0x9D}, {0x009E,0x9E}, {0x009F,0x9F}, {0x00A0,0xA0}, {0x00A7,0xFD}, {0x00AD,0xAD}, {0x0401,0xA1}, {0x0402,0xA2}, {0x0403,0xA3}, {0x0404,0xA4}, {0x0405,0xA5}, {0x0406,0xA6}, {0x0407,0xA7}, {0x0408,0xA8}, {0x0409,0xA9}, {0x040A,0xAA}, {0x040B,0xAB}, {0x040C,0xAC}, {0x040E,0xAE}, {0x040F,0xAF}, {0x0410,0xB0}, {0x0411,0xB1}, {0x0412,0xB2}, {0x0413,0xB3}, {0x0414,0xB4}, {0x0415,0xB5}, {0x0416,0xB6}, {0x0417,0xB7}, {0x0418,0xB8}, {0x0419,0xB9}, {0x041A,0xBA}, {0x041B,0xBB}, {0x041C,0xBC}, {0x041D,0xBD}, {0x041E,0xBE}, {0x041F,0xBF}, {0x0420,0xC0}, {0x0421,0xC1}, {0x0422,0xC2}, {0x0423,0xC3}, {0x0424,0xC4}, {0x0425,0xC5}, {0x0426,0xC6}, {0x0427,0xC7}, {0x0428,0xC8}, {0x0429,0xC9}, {0x042A,0xCA}, {0x042B,0xCB}, {0x042C,0xCC}, {0x042D,0xCD}, {0x042E,0xCE}, {0x042F,0xCF}, {0x0430,0xD0}, {0x0431,0xD1}, {0x0432,0xD2}, {0x0433,0xD3}, {0x0434,0xD4}, {0x0435,0xD5}, {0x0436,0xD6}, {0x0437,0xD7}, {0x0438,0xD8}, {0x0439,0xD9}, {0x043A,0xDA}, {0x043B,0xDB}, {0x043C,0xDC}, {0x043D,0xDD}, {0x043E,0xDE}, {0x043F,0xDF}, {0x0440,0xE0}, {0x0441,0xE1}, {0x0442,0xE2}, {0x0443,0xE3}, {0x0444,0xE4}, {0x0445,0xE5}, {0x0446,0xE6}, {0x0447,0xE7}, {0x0448,0xE8}, {0x0449,0xE9}, {0x044A,0xEA}, {0x044B,0xEB}, {0x044C,0xEC}, {0x044D,0xED}, {0x044E,0xEE}, {0x044F,0xEF}, {0x0451,0xF1}, {0x0452,0xF2}, {0x0453,0xF3}, {0x0454,0xF4}, {0x0455,0xF5}, {0x0456,0xF6}, {0x0457,0xF7}, {0x0458,0xF8}, {0x0459,0xF9}, {0x045A,0xFA}, {0x045B,0xFB}, {0x045C,0xFC}, {0x045E,0xFE}, {0x045F,0xFF}, {0x2116,0xF0}, }; gnustep-base-1.29.0/Source/Additions/unicode/decomp.h000066400000000000000000001012511435650067400224360ustar00rootroot00000000000000/* decomposition table */ /* Copyright (C) 2005 Free Software Foundation Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. */ struct _dec_ {unichar code; unichar decomp[5];}; static struct _dec_ uni_dec_table[]= { {0x00C0, {0x0041, 0x0300, 0}}, {0x00C1, {0x0041, 0x0301, 0}}, {0x00C2, {0x0041, 0x0302, 0}}, {0x00C3, {0x0041, 0x0303, 0}}, {0x00C4, {0x0041, 0x0308, 0}}, {0x00C5, {0x0041, 0x030A, 0}}, {0x00C7, {0x0043, 0x0327, 0}}, {0x00C8, {0x0045, 0x0300, 0}}, {0x00C9, {0x0045, 0x0301, 0}}, {0x00CA, {0x0045, 0x0302, 0}}, {0x00CB, {0x0045, 0x0308, 0}}, {0x00CC, {0x0049, 0x0300, 0}}, {0x00CD, {0x0049, 0x0301, 0}}, {0x00CE, {0x0049, 0x0302, 0}}, {0x00CF, {0x0049, 0x0308, 0}}, {0x00D1, {0x004E, 0x0303, 0}}, {0x00D2, {0x004F, 0x0300, 0}}, {0x00D3, {0x004F, 0x0301, 0}}, {0x00D4, {0x004F, 0x0302, 0}}, {0x00D5, {0x004F, 0x0303, 0}}, {0x00D6, {0x004F, 0x0308, 0}}, {0x00D9, {0x0055, 0x0300, 0}}, {0x00DA, {0x0055, 0x0301, 0}}, {0x00DB, {0x0055, 0x0302, 0}}, {0x00DC, {0x0055, 0x0308, 0}}, {0x00DD, {0x0059, 0x0301, 0}}, {0x00E0, {0x0061, 0x0300, 0}}, {0x00E1, {0x0061, 0x0301, 0}}, {0x00E2, {0x0061, 0x0302, 0}}, {0x00E3, {0x0061, 0x0303, 0}}, {0x00E4, {0x0061, 0x0308, 0}}, {0x00E5, {0x0061, 0x030A, 0}}, {0x00E7, {0x0063, 0x0327, 0}}, {0x00E8, {0x0065, 0x0300, 0}}, {0x00E9, {0x0065, 0x0301, 0}}, {0x00EA, {0x0065, 0x0302, 0}}, {0x00EB, {0x0065, 0x0308, 0}}, {0x00EC, {0x0069, 0x0300, 0}}, {0x00ED, {0x0069, 0x0301, 0}}, {0x00EE, {0x0069, 0x0302, 0}}, {0x00EF, {0x0069, 0x0308, 0}}, {0x00F1, {0x006E, 0x0303, 0}}, {0x00F2, {0x006F, 0x0300, 0}}, {0x00F3, {0x006F, 0x0301, 0}}, {0x00F4, {0x006F, 0x0302, 0}}, {0x00F5, {0x006F, 0x0303, 0}}, {0x00F6, {0x006F, 0x0308, 0}}, {0x00F9, {0x0075, 0x0300, 0}}, {0x00FA, {0x0075, 0x0301, 0}}, {0x00FB, {0x0075, 0x0302, 0}}, {0x00FC, {0x0075, 0x0308, 0}}, {0x00FD, {0x0079, 0x0301, 0}}, {0x00FF, {0x0079, 0x0308, 0}}, {0x0100, {0x0041, 0x0304, 0}}, {0x0101, {0x0061, 0x0304, 0}}, {0x0102, {0x0041, 0x0306, 0}}, {0x0103, {0x0061, 0x0306, 0}}, {0x0104, {0x0041, 0x0328, 0}}, {0x0105, {0x0061, 0x0328, 0}}, {0x0106, {0x0043, 0x0301, 0}}, {0x0107, {0x0063, 0x0301, 0}}, {0x0108, {0x0043, 0x0302, 0}}, {0x0109, {0x0063, 0x0302, 0}}, {0x010A, {0x0043, 0x0307, 0}}, {0x010B, {0x0063, 0x0307, 0}}, {0x010C, {0x0043, 0x030C, 0}}, {0x010D, {0x0063, 0x030C, 0}}, {0x010E, {0x0044, 0x030C, 0}}, {0x010F, {0x0064, 0x030C, 0}}, {0x0112, {0x0045, 0x0304, 0}}, {0x0113, {0x0065, 0x0304, 0}}, {0x0114, {0x0045, 0x0306, 0}}, {0x0115, {0x0065, 0x0306, 0}}, {0x0116, {0x0045, 0x0307, 0}}, {0x0117, {0x0065, 0x0307, 0}}, {0x0118, {0x0045, 0x0328, 0}}, {0x0119, {0x0065, 0x0328, 0}}, {0x011A, {0x0045, 0x030C, 0}}, {0x011B, {0x0065, 0x030C, 0}}, {0x011C, {0x0047, 0x0302, 0}}, {0x011D, {0x0067, 0x0302, 0}}, {0x011E, {0x0047, 0x0306, 0}}, {0x011F, {0x0067, 0x0306, 0}}, {0x0120, {0x0047, 0x0307, 0}}, {0x0121, {0x0067, 0x0307, 0}}, {0x0122, {0x0047, 0x0327, 0}}, {0x0123, {0x0067, 0x0327, 0}}, {0x0124, {0x0048, 0x0302, 0}}, {0x0125, {0x0068, 0x0302, 0}}, {0x0128, {0x0049, 0x0303, 0}}, {0x0129, {0x0069, 0x0303, 0}}, {0x012A, {0x0049, 0x0304, 0}}, {0x012B, {0x0069, 0x0304, 0}}, {0x012C, {0x0049, 0x0306, 0}}, {0x012D, {0x0069, 0x0306, 0}}, {0x012E, {0x0049, 0x0328, 0}}, {0x012F, {0x0069, 0x0328, 0}}, {0x0130, {0x0049, 0x0307, 0}}, {0x0134, {0x004A, 0x0302, 0}}, {0x0135, {0x006A, 0x0302, 0}}, {0x0136, {0x004B, 0x0327, 0}}, {0x0137, {0x006B, 0x0327, 0}}, {0x0139, {0x004C, 0x0301, 0}}, {0x013A, {0x006C, 0x0301, 0}}, {0x013B, {0x004C, 0x0327, 0}}, {0x013C, {0x006C, 0x0327, 0}}, {0x013D, {0x004C, 0x030C, 0}}, {0x013E, {0x006C, 0x030C, 0}}, {0x0143, {0x004E, 0x0301, 0}}, {0x0144, {0x006E, 0x0301, 0}}, {0x0145, {0x004E, 0x0327, 0}}, {0x0146, {0x006E, 0x0327, 0}}, {0x0147, {0x004E, 0x030C, 0}}, {0x0148, {0x006E, 0x030C, 0}}, {0x014C, {0x004F, 0x0304, 0}}, {0x014D, {0x006F, 0x0304, 0}}, {0x014E, {0x004F, 0x0306, 0}}, {0x014F, {0x006F, 0x0306, 0}}, {0x0150, {0x004F, 0x030B, 0}}, {0x0151, {0x006F, 0x030B, 0}}, {0x0154, {0x0052, 0x0301, 0}}, {0x0155, {0x0072, 0x0301, 0}}, {0x0156, {0x0052, 0x0327, 0}}, {0x0157, {0x0072, 0x0327, 0}}, {0x0158, {0x0052, 0x030C, 0}}, {0x0159, {0x0072, 0x030C, 0}}, {0x015A, {0x0053, 0x0301, 0}}, {0x015B, {0x0073, 0x0301, 0}}, {0x015C, {0x0053, 0x0302, 0}}, {0x015D, {0x0073, 0x0302, 0}}, {0x015E, {0x0053, 0x0327, 0}}, {0x015F, {0x0073, 0x0327, 0}}, {0x0160, {0x0053, 0x030C, 0}}, {0x0161, {0x0073, 0x030C, 0}}, {0x0162, {0x0054, 0x0327, 0}}, {0x0163, {0x0074, 0x0327, 0}}, {0x0164, {0x0054, 0x030C, 0}}, {0x0165, {0x0074, 0x030C, 0}}, {0x0168, {0x0055, 0x0303, 0}}, {0x0169, {0x0075, 0x0303, 0}}, {0x016A, {0x0055, 0x0304, 0}}, {0x016B, {0x0075, 0x0304, 0}}, {0x016C, {0x0055, 0x0306, 0}}, {0x016D, {0x0075, 0x0306, 0}}, {0x016E, {0x0055, 0x030A, 0}}, {0x016F, {0x0075, 0x030A, 0}}, {0x0170, {0x0055, 0x030B, 0}}, {0x0171, {0x0075, 0x030B, 0}}, {0x0172, {0x0055, 0x0328, 0}}, {0x0173, {0x0075, 0x0328, 0}}, {0x0174, {0x0057, 0x0302, 0}}, {0x0175, {0x0077, 0x0302, 0}}, {0x0176, {0x0059, 0x0302, 0}}, {0x0177, {0x0079, 0x0302, 0}}, {0x0178, {0x0059, 0x0308, 0}}, {0x0179, {0x005A, 0x0301, 0}}, {0x017A, {0x007A, 0x0301, 0}}, {0x017B, {0x005A, 0x0307, 0}}, {0x017C, {0x007A, 0x0307, 0}}, {0x017D, {0x005A, 0x030C, 0}}, {0x017E, {0x007A, 0x030C, 0}}, {0x01A0, {0x004F, 0x031B, 0}}, {0x01A1, {0x006F, 0x031B, 0}}, {0x01AF, {0x0055, 0x031B, 0}}, {0x01B0, {0x0075, 0x031B, 0}}, {0x01CD, {0x0041, 0x030C, 0}}, {0x01CE, {0x0061, 0x030C, 0}}, {0x01CF, {0x0049, 0x030C, 0}}, {0x01D0, {0x0069, 0x030C, 0}}, {0x01D1, {0x004F, 0x030C, 0}}, {0x01D2, {0x006F, 0x030C, 0}}, {0x01D3, {0x0055, 0x030C, 0}}, {0x01D4, {0x0075, 0x030C, 0}}, {0x01D5, {0x00DC, 0x0304, 0}}, {0x01D6, {0x00FC, 0x0304, 0}}, {0x01D7, {0x00DC, 0x0301, 0}}, {0x01D8, {0x00FC, 0x0301, 0}}, {0x01D9, {0x00DC, 0x030C, 0}}, {0x01DA, {0x00FC, 0x030C, 0}}, {0x01DB, {0x00DC, 0x0300, 0}}, {0x01DC, {0x00FC, 0x0300, 0}}, {0x01DE, {0x00C4, 0x0304, 0}}, {0x01DF, {0x00E4, 0x0304, 0}}, {0x01E0, {0x0041, 0x0307, 0x0304, 0}}, {0x01E1, {0x0061, 0x0307, 0x0304, 0}}, {0x01E2, {0x00C6, 0x0304, 0}}, {0x01E3, {0x00E6, 0x0304, 0}}, {0x01E6, {0x0047, 0x030C, 0}}, {0x01E7, {0x0067, 0x030C, 0}}, {0x01E8, {0x004B, 0x030C, 0}}, {0x01E9, {0x006B, 0x030C, 0}}, {0x01EA, {0x004F, 0x0328, 0}}, {0x01EB, {0x006F, 0x0328, 0}}, {0x01EC, {0x01EA, 0x0304, 0}}, {0x01ED, {0x01EB, 0x0304, 0}}, {0x01EE, {0x01B7, 0x030C, 0}}, {0x01EF, {0x0292, 0x030C, 0}}, {0x01F0, {0x006A, 0x030C, 0}}, {0x01F4, {0x0047, 0x0301, 0}}, {0x01F5, {0x0067, 0x0301, 0}}, {0x01FA, {0x00C5, 0x0301, 0}}, {0x01FB, {0x00E5, 0x0301, 0}}, {0x01FC, {0x00C6, 0x0301, 0}}, {0x01FD, {0x00E6, 0x0301, 0}}, {0x01FE, {0x00D8, 0x0301, 0}}, {0x01FF, {0x00F8, 0x0301, 0}}, {0x0200, {0x0041, 0x030F, 0}}, {0x0201, {0x0061, 0x030F, 0}}, {0x0202, {0x0041, 0x0311, 0}}, {0x0203, {0x0061, 0x0311, 0}}, {0x0204, {0x0045, 0x030F, 0}}, {0x0205, {0x0065, 0x030F, 0}}, {0x0206, {0x0045, 0x0311, 0}}, {0x0207, {0x0065, 0x0311, 0}}, {0x0208, {0x0049, 0x030F, 0}}, {0x0209, {0x0069, 0x030F, 0}}, {0x020A, {0x0049, 0x0311, 0}}, {0x020B, {0x0069, 0x0311, 0}}, {0x020C, {0x004F, 0x030F, 0}}, {0x020D, {0x006F, 0x030F, 0}}, {0x020E, {0x004F, 0x0311, 0}}, {0x020F, {0x006F, 0x0311, 0}}, {0x0210, {0x0052, 0x030F, 0}}, {0x0211, {0x0072, 0x030F, 0}}, {0x0212, {0x0052, 0x0311, 0}}, {0x0213, {0x0072, 0x0311, 0}}, {0x0214, {0x0055, 0x030F, 0}}, {0x0215, {0x0075, 0x030F, 0}}, {0x0216, {0x0055, 0x0311, 0}}, {0x0217, {0x0075, 0x0311, 0}}, {0x0310, {0x0306, 0x0307, 0}}, {0x0340, {0x0300, 0}}, {0x0341, {0x0301, 0}}, {0x0343, {0x0313, 0}}, {0x0344, {0x0308, 0x030D, 0}}, {0x0374, {0x02B9, 0}}, {0x037E, {0x003B, 0}}, {0x0385, {0x00A8, 0x030D, 0}}, {0x0386, {0x0391, 0x030D, 0}}, {0x0387, {0x00B7, 0}}, {0x0388, {0x0395, 0x030D, 0}}, {0x0389, {0x0397, 0x030D, 0}}, {0x038A, {0x0399, 0x030D, 0}}, {0x038C, {0x039F, 0x030D, 0}}, {0x038E, {0x03A5, 0x030D, 0}}, {0x038F, {0x03A9, 0x030D, 0}}, {0x0390, {0x03B9, 0x0344, 0}}, {0x03AA, {0x0399, 0x0308, 0}}, {0x03AB, {0x03A5, 0x0308, 0}}, {0x03AC, {0x03B1, 0x030D, 0}}, {0x03AD, {0x03B5, 0x030D, 0}}, {0x03AE, {0x03B7, 0x030D, 0}}, {0x03AF, {0x03B9, 0x030D, 0}}, {0x03B0, {0x03C5, 0x0344, 0}}, {0x03CA, {0x03B9, 0x0308, 0}}, {0x03CB, {0x03C5, 0x0308, 0}}, {0x03CC, {0x03BF, 0x030D, 0}}, {0x03CD, {0x03C5, 0x030D, 0}}, {0x03CE, {0x03C9, 0x030D, 0}}, {0x03D3, {0x03D2, 0x030D, 0}}, {0x03D4, {0x03D2, 0x0308, 0}}, {0x0401, {0x0415, 0x0308, 0}}, {0x0403, {0x0413, 0x0301, 0}}, {0x0407, {0x0406, 0x0308, 0}}, {0x040C, {0x041A, 0x0301, 0}}, {0x040E, {0x0423, 0x0306, 0}}, {0x0419, {0x0418, 0x0306, 0}}, {0x0439, {0x0438, 0x0306, 0}}, {0x0451, {0x0435, 0x0308, 0}}, {0x0453, {0x0433, 0x0301, 0}}, {0x0457, {0x0456, 0x0308, 0}}, {0x045C, {0x043A, 0x0301, 0}}, {0x045E, {0x0443, 0x0306, 0}}, {0x0476, {0x0474, 0x030F, 0}}, {0x0477, {0x0475, 0x030F, 0}}, {0x04C1, {0x0416, 0x0306, 0}}, {0x04C2, {0x0436, 0x0306, 0}}, {0x04D0, {0x0410, 0x0306, 0}}, {0x04D1, {0x0430, 0x0306, 0}}, {0x04D2, {0x0410, 0x0308, 0}}, {0x04D3, {0x0430, 0x0308, 0}}, {0x04D4, {0x00C6, 0}}, {0x04D5, {0x00E6, 0}}, {0x04D6, {0x0415, 0x0306, 0}}, {0x04D7, {0x0435, 0x0306, 0}}, {0x04D8, {0x018F, 0}}, {0x04D9, {0x0259, 0}}, {0x04DA, {0x018F, 0x0308, 0}}, {0x04DB, {0x0259, 0x0308, 0}}, {0x04DC, {0x0416, 0x0308, 0}}, {0x04DD, {0x0436, 0x0308, 0}}, {0x04DE, {0x0417, 0x0308, 0}}, {0x04DF, {0x0437, 0x0308, 0}}, {0x04E0, {0x01B7, 0}}, {0x04E1, {0x0292, 0}}, {0x04E2, {0x0418, 0x0304, 0}}, {0x04E3, {0x0438, 0x0304, 0}}, {0x04E4, {0x0418, 0x0308, 0}}, {0x04E5, {0x0438, 0x0308, 0}}, {0x04E6, {0x041E, 0x0308, 0}}, {0x04E7, {0x043E, 0x0308, 0}}, {0x04E8, {0x019F, 0}}, {0x04E9, {0x0275, 0}}, {0x04EA, {0x019F, 0x0308, 0}}, {0x04EB, {0x0275, 0x0308, 0}}, {0x04EE, {0x0423, 0x0304, 0}}, {0x04EF, {0x0443, 0x0304, 0}}, {0x04F0, {0x0423, 0x0308, 0}}, {0x04F1, {0x0443, 0x0308, 0}}, {0x04F2, {0x0423, 0x030B, 0}}, {0x04F3, {0x0443, 0x030B, 0}}, {0x04F4, {0x0427, 0x0308, 0}}, {0x04F5, {0x0447, 0x0308, 0}}, {0x04F8, {0x042B, 0x0308, 0}}, {0x04F9, {0x044B, 0x0308, 0}}, {0x0929, {0x0928, 0x093C, 0}}, {0x0931, {0x0930, 0x093C, 0}}, {0x0934, {0x0933, 0x093C, 0}}, {0x0958, {0x0915, 0x093C, 0}}, {0x0959, {0x0916, 0x093C, 0}}, {0x095A, {0x0917, 0x093C, 0}}, {0x095B, {0x091C, 0x093C, 0}}, {0x095C, {0x0921, 0x093C, 0}}, {0x095D, {0x0922, 0x093C, 0}}, {0x095E, {0x092B, 0x093C, 0}}, {0x095F, {0x092F, 0x093C, 0}}, {0x09B0, {0x09AC, 0x09BC, 0}}, {0x09CB, {0x09C7, 0x09BE, 0}}, {0x09CC, {0x09C7, 0x09D7, 0}}, {0x09DC, {0x09A1, 0x09BC, 0}}, {0x09DD, {0x09A2, 0x09BC, 0}}, {0x09DF, {0x09AF, 0x09BC, 0}}, {0x0A59, {0x0A16, 0x0A3C, 0}}, {0x0A5A, {0x0A17, 0x0A3C, 0}}, {0x0A5B, {0x0A1C, 0x0A3C, 0}}, {0x0A5C, {0x0A21, 0x0A3C, 0}}, {0x0A5E, {0x0A2B, 0x0A3C, 0}}, {0x0B48, {0x0B47, 0x0B56, 0}}, {0x0B4B, {0x0B47, 0x0B3E, 0}}, {0x0B4C, {0x0B47, 0x0B57, 0}}, {0x0B5C, {0x0B21, 0x0B3C, 0}}, {0x0B5D, {0x0B22, 0x0B3C, 0}}, {0x0B5F, {0x0B2F, 0x0B3C, 0}}, {0x0B94, {0x0B92, 0x0BD7, 0}}, {0x0BCA, {0x0BC6, 0x0BBE, 0}}, {0x0BCB, {0x0BC7, 0x0BBE, 0}}, {0x0BCC, {0x0BC6, 0x0BD7, 0}}, {0x0C48, {0x0C46, 0x0C56, 0}}, {0x0CC0, {0x0CBF, 0x0CD5, 0}}, {0x0CC7, {0x0CC6, 0x0CD5, 0}}, {0x0CC8, {0x0CC6, 0x0CD6, 0}}, {0x0CCA, {0x0CC6, 0x0CC2, 0}}, {0x0CCB, {0x0CC6, 0x0CC2, 0x0CD5, 0}}, {0x0D4A, {0x0D46, 0x0D3E, 0}}, {0x0D4B, {0x0D47, 0x0D3E, 0}}, {0x0D4C, {0x0D46, 0x0D57, 0}}, {0x0E33, {0x0E4D, 0x0E32, 0}}, {0x0EB3, {0x0ECD, 0x0EB2, 0}}, {0x0F43, {0x0F42, 0x0FB7, 0}}, {0x0F4D, {0x0F4C, 0x0FB7, 0}}, {0x0F52, {0x0F51, 0x0FB7, 0}}, {0x0F57, {0x0F56, 0x0FB7, 0}}, {0x0F5C, {0x0F5B, 0x0FB7, 0}}, {0x0F69, {0x0F40, 0x0FB5, 0}}, {0x0F73, {0x0F71, 0x0F72, 0}}, {0x0F75, {0x0F74, 0x0F71, 0}}, {0x0F76, {0x0FB2, 0x0F80, 0}}, {0x0F77, {0x0F76, 0x0F71, 0}}, {0x0F78, {0x0FB3, 0x0F80, 0}}, {0x0F79, {0x0F78, 0x0F71, 0}}, {0x0F81, {0x0F80, 0x0F71, 0}}, {0x0F93, {0x0F92, 0x0FB7, 0}}, {0x0F9D, {0x0F9C, 0x0FB7, 0}}, {0x0FA2, {0x0FA1, 0x0FB7, 0}}, {0x0FA7, {0x0FA6, 0x0FB7, 0}}, {0x0FAC, {0x0FAB, 0x0FB7, 0}}, {0x0FB9, {0x0F90, 0x0FB5, 0}}, {0x1E00, {0x0041, 0x0325, 0}}, {0x1E01, {0x0061, 0x0325, 0}}, {0x1E02, {0x0042, 0x0307, 0}}, {0x1E03, {0x0062, 0x0307, 0}}, {0x1E04, {0x0042, 0x0323, 0}}, {0x1E05, {0x0062, 0x0323, 0}}, {0x1E06, {0x0042, 0x0331, 0}}, {0x1E07, {0x0062, 0x0331, 0}}, {0x1E08, {0x00C7, 0x0301, 0}}, {0x1E09, {0x00E7, 0x0301, 0}}, {0x1E0A, {0x0044, 0x0307, 0}}, {0x1E0B, {0x0064, 0x0307, 0}}, {0x1E0C, {0x0044, 0x0323, 0}}, {0x1E0D, {0x0064, 0x0323, 0}}, {0x1E0E, {0x0044, 0x0331, 0}}, {0x1E0F, {0x0064, 0x0331, 0}}, {0x1E10, {0x0044, 0x0327, 0}}, {0x1E11, {0x0064, 0x0327, 0}}, {0x1E12, {0x0044, 0x032D, 0}}, {0x1E13, {0x0064, 0x032D, 0}}, {0x1E14, {0x0112, 0x0300, 0}}, {0x1E15, {0x0113, 0x0300, 0}}, {0x1E16, {0x0112, 0x0301, 0}}, {0x1E17, {0x0113, 0x0301, 0}}, {0x1E18, {0x0045, 0x032D, 0}}, {0x1E19, {0x0065, 0x032D, 0}}, {0x1E1A, {0x0045, 0x0330, 0}}, {0x1E1B, {0x0065, 0x0330, 0}}, {0x1E1C, {0x0114, 0x0327, 0}}, {0x1E1D, {0x0115, 0x0327, 0}}, {0x1E1E, {0x0046, 0x0307, 0}}, {0x1E1F, {0x0066, 0x0307, 0}}, {0x1E20, {0x0047, 0x0304, 0}}, {0x1E21, {0x0067, 0x0304, 0}}, {0x1E22, {0x0048, 0x0307, 0}}, {0x1E23, {0x0068, 0x0307, 0}}, {0x1E24, {0x0048, 0x0323, 0}}, {0x1E25, {0x0068, 0x0323, 0}}, {0x1E26, {0x0048, 0x0308, 0}}, {0x1E27, {0x0068, 0x0308, 0}}, {0x1E28, {0x0048, 0x0327, 0}}, {0x1E29, {0x0068, 0x0327, 0}}, {0x1E2A, {0x0048, 0x032E, 0}}, {0x1E2B, {0x0068, 0x032E, 0}}, {0x1E2C, {0x0049, 0x0330, 0}}, {0x1E2D, {0x0069, 0x0330, 0}}, {0x1E2E, {0x00CF, 0x0301, 0}}, {0x1E2F, {0x00EF, 0x0301, 0}}, {0x1E30, {0x004B, 0x0301, 0}}, {0x1E31, {0x006B, 0x0301, 0}}, {0x1E32, {0x004B, 0x0323, 0}}, {0x1E33, {0x006B, 0x0323, 0}}, {0x1E34, {0x004B, 0x0331, 0}}, {0x1E35, {0x006B, 0x0331, 0}}, {0x1E36, {0x004C, 0x0323, 0}}, {0x1E37, {0x006C, 0x0323, 0}}, {0x1E38, {0x1E36, 0x0304, 0}}, {0x1E39, {0x1E37, 0x0304, 0}}, {0x1E3A, {0x004C, 0x0331, 0}}, {0x1E3B, {0x006C, 0x0331, 0}}, {0x1E3C, {0x004C, 0x032D, 0}}, {0x1E3D, {0x006C, 0x032D, 0}}, {0x1E3E, {0x004D, 0x0301, 0}}, {0x1E3F, {0x006D, 0x0301, 0}}, {0x1E40, {0x004D, 0x0307, 0}}, {0x1E41, {0x006D, 0x0307, 0}}, {0x1E42, {0x004D, 0x0323, 0}}, {0x1E43, {0x006D, 0x0323, 0}}, {0x1E44, {0x004E, 0x0307, 0}}, {0x1E45, {0x006E, 0x0307, 0}}, {0x1E46, {0x004E, 0x0323, 0}}, {0x1E47, {0x006E, 0x0323, 0}}, {0x1E48, {0x004E, 0x0331, 0}}, {0x1E49, {0x006E, 0x0331, 0}}, {0x1E4A, {0x004E, 0x032D, 0}}, {0x1E4B, {0x006E, 0x032D, 0}}, {0x1E4C, {0x00D5, 0x0301, 0}}, {0x1E4D, {0x00F5, 0x0301, 0}}, {0x1E4E, {0x00D5, 0x0308, 0}}, {0x1E4F, {0x00F5, 0x0308, 0}}, {0x1E50, {0x014C, 0x0300, 0}}, {0x1E51, {0x014D, 0x0300, 0}}, {0x1E52, {0x014C, 0x0301, 0}}, {0x1E53, {0x014D, 0x0301, 0}}, {0x1E54, {0x0050, 0x0301, 0}}, {0x1E55, {0x0070, 0x0301, 0}}, {0x1E56, {0x0050, 0x0307, 0}}, {0x1E57, {0x0070, 0x0307, 0}}, {0x1E58, {0x0052, 0x0307, 0}}, {0x1E59, {0x0072, 0x0307, 0}}, {0x1E5A, {0x0052, 0x0323, 0}}, {0x1E5B, {0x0072, 0x0323, 0}}, {0x1E5C, {0x1E5A, 0x0304, 0}}, {0x1E5D, {0x1E5B, 0x0304, 0}}, {0x1E5E, {0x0052, 0x0331, 0}}, {0x1E5F, {0x0072, 0x0331, 0}}, {0x1E60, {0x0053, 0x0307, 0}}, {0x1E61, {0x0073, 0x0307, 0}}, {0x1E62, {0x0053, 0x0323, 0}}, {0x1E63, {0x0073, 0x0323, 0}}, {0x1E64, {0x015A, 0x0307, 0}}, {0x1E65, {0x015B, 0x0307, 0}}, {0x1E66, {0x0160, 0x0307, 0}}, {0x1E67, {0x0161, 0x0307, 0}}, {0x1E68, {0x1E62, 0x0307, 0}}, {0x1E69, {0x1E63, 0x0307, 0}}, {0x1E6A, {0x0054, 0x0307, 0}}, {0x1E6B, {0x0074, 0x0307, 0}}, {0x1E6C, {0x0054, 0x0323, 0}}, {0x1E6D, {0x0074, 0x0323, 0}}, {0x1E6E, {0x0054, 0x0331, 0}}, {0x1E6F, {0x0074, 0x0331, 0}}, {0x1E70, {0x0054, 0x032D, 0}}, {0x1E71, {0x0074, 0x032D, 0}}, {0x1E72, {0x0055, 0x0324, 0}}, {0x1E73, {0x0075, 0x0324, 0}}, {0x1E74, {0x0055, 0x0330, 0}}, {0x1E75, {0x0075, 0x0330, 0}}, {0x1E76, {0x0055, 0x032D, 0}}, {0x1E77, {0x0075, 0x032D, 0}}, {0x1E78, {0x0168, 0x0301, 0}}, {0x1E79, {0x0169, 0x0301, 0}}, {0x1E7A, {0x016A, 0x0308, 0}}, {0x1E7B, {0x016B, 0x0308, 0}}, {0x1E7C, {0x0056, 0x0303, 0}}, {0x1E7D, {0x0076, 0x0303, 0}}, {0x1E7E, {0x0056, 0x0323, 0}}, {0x1E7F, {0x0076, 0x0323, 0}}, {0x1E80, {0x0057, 0x0300, 0}}, {0x1E81, {0x0077, 0x0300, 0}}, {0x1E82, {0x0057, 0x0301, 0}}, {0x1E83, {0x0077, 0x0301, 0}}, {0x1E84, {0x0057, 0x0308, 0}}, {0x1E85, {0x0077, 0x0308, 0}}, {0x1E86, {0x0057, 0x0307, 0}}, {0x1E87, {0x0077, 0x0307, 0}}, {0x1E88, {0x0057, 0x0323, 0}}, {0x1E89, {0x0077, 0x0323, 0}}, {0x1E8A, {0x0058, 0x0307, 0}}, {0x1E8B, {0x0078, 0x0307, 0}}, {0x1E8C, {0x0058, 0x0308, 0}}, {0x1E8D, {0x0078, 0x0308, 0}}, {0x1E8E, {0x0059, 0x0307, 0}}, {0x1E8F, {0x0079, 0x0307, 0}}, {0x1E90, {0x005A, 0x0302, 0}}, {0x1E91, {0x007A, 0x0302, 0}}, {0x1E92, {0x005A, 0x0323, 0}}, {0x1E93, {0x007A, 0x0323, 0}}, {0x1E94, {0x005A, 0x0331, 0}}, {0x1E95, {0x007A, 0x0331, 0}}, {0x1E96, {0x0068, 0x0331, 0}}, {0x1E97, {0x0074, 0x0308, 0}}, {0x1E98, {0x0077, 0x030A, 0}}, {0x1E99, {0x0079, 0x030A, 0}}, {0x1E9B, {0x017F, 0x0307, 0}}, {0x1EA0, {0x0041, 0x0323, 0}}, {0x1EA1, {0x0061, 0x0323, 0}}, {0x1EA2, {0x0041, 0x0309, 0}}, {0x1EA3, {0x0061, 0x0309, 0}}, {0x1EA4, {0x00C2, 0x0301, 0}}, {0x1EA5, {0x00E2, 0x0301, 0}}, {0x1EA6, {0x00C2, 0x0300, 0}}, {0x1EA7, {0x00E2, 0x0300, 0}}, {0x1EA8, {0x00C2, 0x0309, 0}}, {0x1EA9, {0x00E2, 0x0309, 0}}, {0x1EAA, {0x00C2, 0x0303, 0}}, {0x1EAB, {0x00E2, 0x0303, 0}}, {0x1EAC, {0x00C2, 0x0323, 0}}, {0x1EAD, {0x00E2, 0x0323, 0}}, {0x1EAE, {0x0102, 0x0301, 0}}, {0x1EAF, {0x0103, 0x0301, 0}}, {0x1EB0, {0x0102, 0x0300, 0}}, {0x1EB1, {0x0103, 0x0300, 0}}, {0x1EB2, {0x0102, 0x0309, 0}}, {0x1EB3, {0x0103, 0x0309, 0}}, {0x1EB4, {0x0102, 0x0303, 0}}, {0x1EB5, {0x0103, 0x0303, 0}}, {0x1EB6, {0x0102, 0x0323, 0}}, {0x1EB7, {0x0103, 0x0323, 0}}, {0x1EB8, {0x0045, 0x0323, 0}}, {0x1EB9, {0x0065, 0x0323, 0}}, {0x1EBA, {0x0045, 0x0309, 0}}, {0x1EBB, {0x0065, 0x0309, 0}}, {0x1EBC, {0x0045, 0x0303, 0}}, {0x1EBD, {0x0065, 0x0303, 0}}, {0x1EBE, {0x00CA, 0x0301, 0}}, {0x1EBF, {0x00EA, 0x0301, 0}}, {0x1EC0, {0x00CA, 0x0300, 0}}, {0x1EC1, {0x00EA, 0x0300, 0}}, {0x1EC2, {0x00CA, 0x0309, 0}}, {0x1EC3, {0x00EA, 0x0309, 0}}, {0x1EC4, {0x00CA, 0x0303, 0}}, {0x1EC5, {0x00EA, 0x0303, 0}}, {0x1EC6, {0x00CA, 0x0323, 0}}, {0x1EC7, {0x00EA, 0x0323, 0}}, {0x1EC8, {0x0049, 0x0309, 0}}, {0x1EC9, {0x0069, 0x0309, 0}}, {0x1ECA, {0x0049, 0x0323, 0}}, {0x1ECB, {0x0069, 0x0323, 0}}, {0x1ECC, {0x004F, 0x0323, 0}}, {0x1ECD, {0x006F, 0x0323, 0}}, {0x1ECE, {0x004F, 0x0309, 0}}, {0x1ECF, {0x006F, 0x0309, 0}}, {0x1ED0, {0x00D4, 0x0301, 0}}, {0x1ED1, {0x00F4, 0x0301, 0}}, {0x1ED2, {0x00D4, 0x0300, 0}}, {0x1ED3, {0x00F4, 0x0300, 0}}, {0x1ED4, {0x00D4, 0x0309, 0}}, {0x1ED5, {0x00F4, 0x0309, 0}}, {0x1ED6, {0x00D4, 0x0303, 0}}, {0x1ED7, {0x00F4, 0x0303, 0}}, {0x1ED8, {0x00D4, 0x0323, 0}}, {0x1ED9, {0x00F4, 0x0323, 0}}, {0x1EDA, {0x01A0, 0x0301, 0}}, {0x1EDB, {0x01A1, 0x0301, 0}}, {0x1EDC, {0x01A0, 0x0300, 0}}, {0x1EDD, {0x01A1, 0x0300, 0}}, {0x1EDE, {0x01A0, 0x0309, 0}}, {0x1EDF, {0x01A1, 0x0309, 0}}, {0x1EE0, {0x01A0, 0x0303, 0}}, {0x1EE1, {0x01A1, 0x0303, 0}}, {0x1EE2, {0x01A0, 0x0323, 0}}, {0x1EE3, {0x01A1, 0x0323, 0}}, {0x1EE4, {0x0055, 0x0323, 0}}, {0x1EE5, {0x0075, 0x0323, 0}}, {0x1EE6, {0x0055, 0x0309, 0}}, {0x1EE7, {0x0075, 0x0309, 0}}, {0x1EE8, {0x01AF, 0x0301, 0}}, {0x1EE9, {0x01B0, 0x0301, 0}}, {0x1EEA, {0x01AF, 0x0300, 0}}, {0x1EEB, {0x01B0, 0x0300, 0}}, {0x1EEC, {0x01AF, 0x0309, 0}}, {0x1EED, {0x01B0, 0x0309, 0}}, {0x1EEE, {0x01AF, 0x0303, 0}}, {0x1EEF, {0x01B0, 0x0303, 0}}, {0x1EF0, {0x01AF, 0x0323, 0}}, {0x1EF1, {0x01B0, 0x0323, 0}}, {0x1EF2, {0x0059, 0x0300, 0}}, {0x1EF3, {0x0079, 0x0300, 0}}, {0x1EF4, {0x0059, 0x0323, 0}}, {0x1EF5, {0x0079, 0x0323, 0}}, {0x1EF6, {0x0059, 0x0309, 0}}, {0x1EF7, {0x0079, 0x0309, 0}}, {0x1EF8, {0x0059, 0x0303, 0}}, {0x1EF9, {0x0079, 0x0303, 0}}, {0x1F00, {0x03B1, 0x0313, 0}}, {0x1F01, {0x03B1, 0x0314, 0}}, {0x1F02, {0x1F00, 0x0300, 0}}, {0x1F03, {0x1F01, 0x0300, 0}}, {0x1F04, {0x1F00, 0x0301, 0}}, {0x1F05, {0x1F01, 0x0301, 0}}, {0x1F06, {0x1F00, 0x0342, 0}}, {0x1F07, {0x1F01, 0x0342, 0}}, {0x1F08, {0x0391, 0x0313, 0}}, {0x1F09, {0x0391, 0x0314, 0}}, {0x1F0A, {0x1F08, 0x0300, 0}}, {0x1F0B, {0x1F09, 0x0300, 0}}, {0x1F0C, {0x1F08, 0x0301, 0}}, {0x1F0D, {0x1F09, 0x0301, 0}}, {0x1F0E, {0x1F08, 0x0342, 0}}, {0x1F0F, {0x1F09, 0x0342, 0}}, {0x1F10, {0x03B5, 0x0313, 0}}, {0x1F11, {0x03B5, 0x0314, 0}}, {0x1F12, {0x1F10, 0x0300, 0}}, {0x1F13, {0x1F11, 0x0300, 0}}, {0x1F14, {0x1F10, 0x0301, 0}}, {0x1F15, {0x1F11, 0x0301, 0}}, {0x1F18, {0x0395, 0x0313, 0}}, {0x1F19, {0x0395, 0x0314, 0}}, {0x1F1A, {0x1F18, 0x0300, 0}}, {0x1F1B, {0x1F19, 0x0300, 0}}, {0x1F1C, {0x1F18, 0x0301, 0}}, {0x1F1D, {0x1F19, 0x0301, 0}}, {0x1F20, {0x03B7, 0x0313, 0}}, {0x1F21, {0x03B7, 0x0314, 0}}, {0x1F22, {0x1F20, 0x0300, 0}}, {0x1F23, {0x1F21, 0x0300, 0}}, {0x1F24, {0x1F20, 0x0301, 0}}, {0x1F25, {0x1F21, 0x0301, 0}}, {0x1F26, {0x1F20, 0x0342, 0}}, {0x1F27, {0x1F21, 0x0342, 0}}, {0x1F28, {0x0397, 0x0313, 0}}, {0x1F29, {0x0397, 0x0314, 0}}, {0x1F2A, {0x1F28, 0x0300, 0}}, {0x1F2B, {0x1F29, 0x0300, 0}}, {0x1F2C, {0x1F28, 0x0301, 0}}, {0x1F2D, {0x1F29, 0x0301, 0}}, {0x1F2E, {0x1F28, 0x0342, 0}}, {0x1F2F, {0x1F29, 0x0342, 0}}, {0x1F30, {0x03B9, 0x0313, 0}}, {0x1F31, {0x03B9, 0x0314, 0}}, {0x1F32, {0x1F30, 0x0300, 0}}, {0x1F33, {0x1F31, 0x0300, 0}}, {0x1F34, {0x1F30, 0x0301, 0}}, {0x1F35, {0x1F31, 0x0301, 0}}, {0x1F36, {0x1F30, 0x0342, 0}}, {0x1F37, {0x1F31, 0x0342, 0}}, {0x1F38, {0x0399, 0x0313, 0}}, {0x1F39, {0x0399, 0x0314, 0}}, {0x1F3A, {0x1F38, 0x0300, 0}}, {0x1F3B, {0x1F39, 0x0300, 0}}, {0x1F3C, {0x1F38, 0x0301, 0}}, {0x1F3D, {0x1F39, 0x0301, 0}}, {0x1F3E, {0x1F38, 0x0342, 0}}, {0x1F3F, {0x1F39, 0x0342, 0}}, {0x1F40, {0x03BF, 0x0313, 0}}, {0x1F41, {0x03BF, 0x0314, 0}}, {0x1F42, {0x1F40, 0x0300, 0}}, {0x1F43, {0x1F41, 0x0300, 0}}, {0x1F44, {0x1F40, 0x0301, 0}}, {0x1F45, {0x1F41, 0x0301, 0}}, {0x1F48, {0x039F, 0x0313, 0}}, {0x1F49, {0x039F, 0x0314, 0}}, {0x1F4A, {0x1F48, 0x0300, 0}}, {0x1F4B, {0x1F49, 0x0300, 0}}, {0x1F4C, {0x1F48, 0x0301, 0}}, {0x1F4D, {0x1F49, 0x0301, 0}}, {0x1F50, {0x03C5, 0x0313, 0}}, {0x1F51, {0x03C5, 0x0314, 0}}, {0x1F52, {0x1F50, 0x0300, 0}}, {0x1F53, {0x1F51, 0x0300, 0}}, {0x1F54, {0x1F50, 0x0301, 0}}, {0x1F55, {0x1F51, 0x0301, 0}}, {0x1F56, {0x1F50, 0x0342, 0}}, {0x1F57, {0x1F51, 0x0342, 0}}, {0x1F59, {0x03A5, 0x0314, 0}}, {0x1F5B, {0x1F59, 0x0300, 0}}, {0x1F5D, {0x1F59, 0x0301, 0}}, {0x1F5F, {0x1F59, 0x0342, 0}}, {0x1F60, {0x03C9, 0x0313, 0}}, {0x1F61, {0x03C9, 0x0314, 0}}, {0x1F62, {0x1F60, 0x0300, 0}}, {0x1F63, {0x1F61, 0x0300, 0}}, {0x1F64, {0x1F60, 0x0301, 0}}, {0x1F65, {0x1F61, 0x0301, 0}}, {0x1F66, {0x1F60, 0x0342, 0}}, {0x1F67, {0x1F61, 0x0342, 0}}, {0x1F68, {0x03A9, 0x0313, 0}}, {0x1F69, {0x03A9, 0x0314, 0}}, {0x1F6A, {0x1F68, 0x0300, 0}}, {0x1F6B, {0x1F69, 0x0300, 0}}, {0x1F6C, {0x1F68, 0x0301, 0}}, {0x1F6D, {0x1F69, 0x0301, 0}}, {0x1F6E, {0x1F68, 0x0342, 0}}, {0x1F6F, {0x1F69, 0x0342, 0}}, {0x1F70, {0x03B1, 0x0300, 0}}, {0x1F71, {0x03B1, 0x0301, 0}}, {0x1F72, {0x03B5, 0x0300, 0}}, {0x1F73, {0x03B5, 0x0301, 0}}, {0x1F74, {0x03B7, 0x0300, 0}}, {0x1F75, {0x03B7, 0x0301, 0}}, {0x1F76, {0x03B9, 0x0300, 0}}, {0x1F77, {0x03B9, 0x0301, 0}}, {0x1F78, {0x03BF, 0x0300, 0}}, {0x1F79, {0x03BF, 0x0301, 0}}, {0x1F7A, {0x03C5, 0x0300, 0}}, {0x1F7B, {0x03C5, 0x0301, 0}}, {0x1F7C, {0x03C9, 0x0300, 0}}, {0x1F7D, {0x03C9, 0x0301, 0}}, {0x1F80, {0x1F00, 0x0345, 0}}, {0x1F81, {0x1F01, 0x0345, 0}}, {0x1F82, {0x1F02, 0x0345, 0}}, {0x1F83, {0x1F03, 0x0345, 0}}, {0x1F84, {0x1F04, 0x0345, 0}}, {0x1F85, {0x1F05, 0x0345, 0}}, {0x1F86, {0x1F06, 0x0345, 0}}, {0x1F87, {0x1F07, 0x0345, 0}}, {0x1F88, {0x1F08, 0x0345, 0}}, {0x1F89, {0x1F09, 0x0345, 0}}, {0x1F8A, {0x1F0A, 0x0345, 0}}, {0x1F8B, {0x1F0B, 0x0345, 0}}, {0x1F8C, {0x1F0C, 0x0345, 0}}, {0x1F8D, {0x1F0D, 0x0345, 0}}, {0x1F8E, {0x1F0E, 0x0345, 0}}, {0x1F8F, {0x1F0F, 0x0345, 0}}, {0x1F90, {0x1F20, 0x0345, 0}}, {0x1F91, {0x1F21, 0x0345, 0}}, {0x1F92, {0x1F22, 0x0345, 0}}, {0x1F93, {0x1F23, 0x0345, 0}}, {0x1F94, {0x1F24, 0x0345, 0}}, {0x1F95, {0x1F25, 0x0345, 0}}, {0x1F96, {0x1F26, 0x0345, 0}}, {0x1F97, {0x1F27, 0x0345, 0}}, {0x1F98, {0x1F28, 0x0345, 0}}, {0x1F99, {0x1F29, 0x0345, 0}}, {0x1F9A, {0x1F2A, 0x0345, 0}}, {0x1F9B, {0x1F2B, 0x0345, 0}}, {0x1F9C, {0x1F2C, 0x0345, 0}}, {0x1F9D, {0x1F2D, 0x0345, 0}}, {0x1F9E, {0x1F2E, 0x0345, 0}}, {0x1F9F, {0x1F2F, 0x0345, 0}}, {0x1FA0, {0x1F60, 0x0345, 0}}, {0x1FA1, {0x1F61, 0x0345, 0}}, {0x1FA2, {0x1F62, 0x0345, 0}}, {0x1FA3, {0x1F63, 0x0345, 0}}, {0x1FA4, {0x1F64, 0x0345, 0}}, {0x1FA5, {0x1F65, 0x0345, 0}}, {0x1FA6, {0x1F66, 0x0345, 0}}, {0x1FA7, {0x1F67, 0x0345, 0}}, {0x1FA8, {0x1F68, 0x0345, 0}}, {0x1FA9, {0x1F69, 0x0345, 0}}, {0x1FAA, {0x1F6A, 0x0345, 0}}, {0x1FAB, {0x1F6B, 0x0345, 0}}, {0x1FAC, {0x1F6C, 0x0345, 0}}, {0x1FAD, {0x1F6D, 0x0345, 0}}, {0x1FAE, {0x1F6E, 0x0345, 0}}, {0x1FAF, {0x1F6F, 0x0345, 0}}, {0x1FB0, {0x03B1, 0x0306, 0}}, {0x1FB1, {0x03B1, 0x0304, 0}}, {0x1FB2, {0x1F70, 0x0345, 0}}, {0x1FB3, {0x03B1, 0x0345, 0}}, {0x1FB4, {0x1F71, 0x0345, 0}}, {0x1FB6, {0x03B1, 0x0342, 0}}, {0x1FB7, {0x1FB6, 0x0345, 0}}, {0x1FB8, {0x0391, 0x0306, 0}}, {0x1FB9, {0x0391, 0x0304, 0}}, {0x1FBA, {0x0391, 0x0300, 0}}, {0x1FBB, {0x0391, 0x0301, 0}}, {0x1FBC, {0x0391, 0x0345, 0}}, {0x1FBE, {0x0399, 0}}, {0x1FC1, {0x00A8, 0x0342, 0}}, {0x1FC2, {0x1F74, 0x0345, 0}}, {0x1FC3, {0x03B7, 0x0345, 0}}, {0x1FC4, {0x1F75, 0x0345, 0}}, {0x1FC6, {0x03B7, 0x0342, 0}}, {0x1FC7, {0x1FC6, 0x0345, 0}}, {0x1FC8, {0x0395, 0x0300, 0}}, {0x1FC9, {0x0395, 0x0301, 0}}, {0x1FCA, {0x0397, 0x0300, 0}}, {0x1FCB, {0x0397, 0x0301, 0}}, {0x1FCC, {0x0397, 0x0345, 0}}, {0x1FCD, {0x1FBF, 0x0300, 0}}, {0x1FCE, {0x1FBF, 0x0301, 0}}, {0x1FCF, {0x1FBF, 0x0342, 0}}, {0x1FD0, {0x03B9, 0x0306, 0}}, {0x1FD1, {0x03B9, 0x0304, 0}}, {0x1FD2, {0x03CA, 0x0300, 0}}, {0x1FD3, {0x03CA, 0x0301, 0}}, {0x1FD6, {0x03B9, 0x0342, 0}}, {0x1FD7, {0x03CA, 0x0342, 0}}, {0x1FD8, {0x0399, 0x0306, 0}}, {0x1FD9, {0x0399, 0x0304, 0}}, {0x1FDA, {0x0399, 0x0300, 0}}, {0x1FDB, {0x0399, 0x0301, 0}}, {0x1FDD, {0x1FFE, 0x0300, 0}}, {0x1FDE, {0x1FFE, 0x0301, 0}}, {0x1FDF, {0x1FFE, 0x0342, 0}}, {0x1FE0, {0x03C5, 0x0306, 0}}, {0x1FE1, {0x03C5, 0x0304, 0}}, {0x1FE2, {0x03CB, 0x0300, 0}}, {0x1FE3, {0x03CB, 0x0301, 0}}, {0x1FE4, {0x03C1, 0x0313, 0}}, {0x1FE5, {0x03C1, 0x0314, 0}}, {0x1FE6, {0x03C5, 0x0342, 0}}, {0x1FE7, {0x03CB, 0x0342, 0}}, {0x1FE8, {0x03A5, 0x0306, 0}}, {0x1FE9, {0x03A5, 0x0304, 0}}, {0x1FEA, {0x03A5, 0x0300, 0}}, {0x1FEB, {0x03A5, 0x0301, 0}}, {0x1FEC, {0x03A1, 0x0314, 0}}, {0x1FED, {0x00A8, 0x0300, 0}}, {0x1FEE, {0x00A8, 0x0301, 0}}, {0x1FEF, {0x0060, 0}}, {0x1FF2, {0x1F7C, 0x0345, 0}}, {0x1FF3, {0x03C9, 0x0345, 0}}, {0x1FF4, {0x1F79, 0x0345, 0}}, {0x1FF6, {0x03C9, 0x0342, 0}}, {0x1FF7, {0x1FF6, 0x0345, 0}}, {0x1FF8, {0x039F, 0x0300, 0}}, {0x1FF9, {0x039F, 0x0301, 0}}, {0x1FFA, {0x03A9, 0x0300, 0}}, {0x1FFB, {0x03A9, 0x0301, 0}}, {0x1FFC, {0x03A9, 0x0345, 0}}, {0x1FFD, {0x00B4, 0}}, {0x2000, {0x2002, 0}}, {0x2001, {0x2003, 0}}, {0x2126, {0x03A9, 0}}, {0x212A, {0x004B, 0}}, {0x212B, {0x00C5, 0}}, {0x2204, {0x2203, 0x0338, 0}}, {0x2209, {0x2208, 0x0338, 0}}, {0x220C, {0x220B, 0x0338, 0}}, {0x2224, {0x2223, 0x0338, 0}}, {0x2226, {0x2225, 0x0338, 0}}, {0x2241, {0x007E, 0x0338, 0}}, {0x2244, {0x2243, 0x0338, 0}}, {0x2247, {0x2245, 0x0338, 0}}, {0x2249, {0x2248, 0x0338, 0}}, {0x2260, {0x003D, 0x0338, 0}}, {0x2262, {0x2261, 0x0338, 0}}, {0x226D, {0x224D, 0x0338, 0}}, {0x226E, {0x003C, 0x0338, 0}}, {0x226F, {0x003E, 0x0338, 0}}, {0x2270, {0x2264, 0x0338, 0}}, {0x2271, {0x2265, 0x0338, 0}}, {0x2274, {0x2272, 0x0338, 0}}, {0x2275, {0x2273, 0x0338, 0}}, {0x2278, {0x2276, 0x0338, 0}}, {0x2279, {0x2277, 0x0338, 0}}, {0x2280, {0x227A, 0x0338, 0}}, {0x2281, {0x227B, 0x0338, 0}}, {0x2284, {0x2282, 0x0338, 0}}, {0x2285, {0x2283, 0x0338, 0}}, {0x2288, {0x2286, 0x0338, 0}}, {0x2289, {0x2287, 0x0338, 0}}, {0x22AC, {0x22A2, 0x0338, 0}}, {0x22AD, {0x22A8, 0x0338, 0}}, {0x22AE, {0x22A9, 0x0338, 0}}, {0x22AF, {0x22AB, 0x0338, 0}}, {0x22E0, {0x227C, 0x0338, 0}}, {0x22E1, {0x227D, 0x0338, 0}}, {0x22E2, {0x2291, 0x0338, 0}}, {0x22E3, {0x2292, 0x0338, 0}}, {0x22EA, {0x22B2, 0x0338, 0}}, {0x22EB, {0x22B3, 0x0338, 0}}, {0x22EC, {0x22B4, 0x0338, 0}}, {0x22ED, {0x22B5, 0x0338, 0}}, {0x2329, {0x3008, 0}}, {0x232A, {0x3009, 0}}, {0x2474, {0x0028, 0x0031, 0x0029, 0}}, {0x2475, {0x0028, 0x0032, 0x0029, 0}}, {0x2476, {0x0028, 0x0033, 0x0029, 0}}, {0x2477, {0x0028, 0x0034, 0x0029, 0}}, {0x2478, {0x0028, 0x0035, 0x0029, 0}}, {0x2479, {0x0028, 0x0036, 0x0029, 0}}, {0x247A, {0x0028, 0x0037, 0x0029, 0}}, {0x247B, {0x0028, 0x0038, 0x0029, 0}}, {0x247C, {0x0028, 0x0039, 0x0029, 0}}, {0x247D, {0x0028, 0x0031, 0x0030, 0x0029, 0}}, {0x247E, {0x0028, 0x0031, 0x0031, 0x0029, 0}}, {0x247F, {0x0028, 0x0031, 0x0032, 0x0029, 0}}, {0x2480, {0x0028, 0x0031, 0x0033, 0x0029, 0}}, {0x2481, {0x0028, 0x0031, 0x0034, 0x0029, 0}}, {0x2482, {0x0028, 0x0031, 0x0035, 0x0029, 0}}, {0x2483, {0x0028, 0x0031, 0x0036, 0x0029, 0}}, {0x2484, {0x0028, 0x0031, 0x0037, 0x0029, 0}}, {0x2485, {0x0028, 0x0031, 0x0038, 0x0029, 0}}, {0x2486, {0x0028, 0x0031, 0x0039, 0x0029, 0}}, {0x2487, {0x0028, 0x0032, 0x0030, 0x0029, 0}}, {0x2488, {0x0031, 0x002E, 0}}, {0x2489, {0x0032, 0x002E, 0}}, {0x248A, {0x0033, 0x002E, 0}}, {0x248B, {0x0034, 0x002E, 0}}, {0x248C, {0x0035, 0x002E, 0}}, {0x248D, {0x0036, 0x002E, 0}}, {0x248E, {0x0037, 0x002E, 0}}, {0x248F, {0x0038, 0x002E, 0}}, {0x2490, {0x0039, 0x002E, 0}}, {0x2491, {0x0031, 0x0030, 0x002E, 0}}, {0x2492, {0x0031, 0x0031, 0x002E, 0}}, {0x2493, {0x0031, 0x0032, 0x002E, 0}}, {0x2494, {0x0031, 0x0033, 0x002E, 0}}, {0x2495, {0x0031, 0x0034, 0x002E, 0}}, {0x2496, {0x0031, 0x0035, 0x002E, 0}}, {0x2497, {0x0031, 0x0036, 0x002E, 0}}, {0x2498, {0x0031, 0x0037, 0x002E, 0}}, {0x2499, {0x0031, 0x0038, 0x002E, 0}}, {0x249A, {0x0031, 0x0039, 0x002E, 0}}, {0x249B, {0x0032, 0x0030, 0x002E, 0}}, {0x249C, {0x0028, 0x0061, 0x0029, 0}}, {0x249D, {0x0028, 0x0062, 0x0029, 0}}, {0x249E, {0x0028, 0x0063, 0x0029, 0}}, {0x249F, {0x0028, 0x0064, 0x0029, 0}}, {0x24A0, {0x0028, 0x0065, 0x0029, 0}}, {0x24A1, {0x0028, 0x0066, 0x0029, 0}}, {0x24A2, {0x0028, 0x0067, 0x0029, 0}}, {0x24A3, {0x0028, 0x0068, 0x0029, 0}}, {0x24A4, {0x0028, 0x0069, 0x0029, 0}}, {0x24A5, {0x0028, 0x006A, 0x0029, 0}}, {0x24A6, {0x0028, 0x006B, 0x0029, 0}}, {0x24A7, {0x0028, 0x006C, 0x0029, 0}}, {0x24A8, {0x0028, 0x006D, 0x0029, 0}}, {0x24A9, {0x0028, 0x006E, 0x0029, 0}}, {0x24AA, {0x0028, 0x006F, 0x0029, 0}}, {0x24AB, {0x0028, 0x0070, 0x0029, 0}}, {0x24AC, {0x0028, 0x0071, 0x0029, 0}}, {0x24AD, {0x0028, 0x0072, 0x0029, 0}}, {0x24AE, {0x0028, 0x0073, 0x0029, 0}}, {0x24AF, {0x0028, 0x0074, 0x0029, 0}}, {0x24B0, {0x0028, 0x0075, 0x0029, 0}}, {0x24B1, {0x0028, 0x0076, 0x0029, 0}}, {0x24B2, {0x0028, 0x0077, 0x0029, 0}}, {0x24B3, {0x0028, 0x0078, 0x0029, 0}}, {0x24B4, {0x0028, 0x0079, 0x0029, 0}}, {0x24B5, {0x0028, 0x007A, 0x0029, 0}}, {0x304C, {0x304B, 0x3099, 0}}, {0x304E, {0x304D, 0x3099, 0}}, {0x3050, {0x304F, 0x3099, 0}}, {0x3052, {0x3051, 0x3099, 0}}, {0x3054, {0x3053, 0x3099, 0}}, {0x3056, {0x3055, 0x3099, 0}}, {0x3058, {0x3057, 0x3099, 0}}, {0x305A, {0x3059, 0x3099, 0}}, {0x305C, {0x305B, 0x3099, 0}}, {0x305E, {0x305D, 0x3099, 0}}, {0x3060, {0x305F, 0x3099, 0}}, {0x3062, {0x3061, 0x3099, 0}}, {0x3065, {0x3064, 0x3099, 0}}, {0x3067, {0x3066, 0x3099, 0}}, {0x3069, {0x3068, 0x3099, 0}}, {0x3070, {0x306F, 0x3099, 0}}, {0x3071, {0x306F, 0x309A, 0}}, {0x3073, {0x3072, 0x3099, 0}}, {0x3074, {0x3072, 0x309A, 0}}, {0x3076, {0x3075, 0x3099, 0}}, {0x3077, {0x3075, 0x309A, 0}}, {0x3079, {0x3078, 0x3099, 0}}, {0x307A, {0x3078, 0x309A, 0}}, {0x307C, {0x307B, 0x3099, 0}}, {0x307D, {0x307B, 0x309A, 0}}, {0x3094, {0x3046, 0x3099, 0}}, {0x309E, {0x309D, 0x3099, 0}}, {0x30AC, {0x30AB, 0x3099, 0}}, {0x30AE, {0x30AD, 0x3099, 0}}, {0x30B0, {0x30AF, 0x3099, 0}}, {0x30B2, {0x30B1, 0x3099, 0}}, {0x30B4, {0x30B3, 0x3099, 0}}, {0x30B6, {0x30B5, 0x3099, 0}}, {0x30B8, {0x30B7, 0x3099, 0}}, {0x30BA, {0x30B9, 0x3099, 0}}, {0x30BC, {0x30BB, 0x3099, 0}}, {0x30BE, {0x30BD, 0x3099, 0}}, {0x30C0, {0x30BF, 0x3099, 0}}, {0x30C2, {0x30C1, 0x3099, 0}}, {0x30C5, {0x30C4, 0x3099, 0}}, {0x30C7, {0x30C6, 0x3099, 0}}, {0x30C9, {0x30C8, 0x3099, 0}}, {0x30D0, {0x30CF, 0x3099, 0}}, {0x30D1, {0x30CF, 0x309A, 0}}, {0x30D3, {0x30D2, 0x3099, 0}}, {0x30D4, {0x30D2, 0x309A, 0}}, {0x30D6, {0x30D5, 0x3099, 0}}, {0x30D7, {0x30D5, 0x309A, 0}}, {0x30D9, {0x30D8, 0x3099, 0}}, {0x30DA, {0x30D8, 0x309A, 0}}, {0x30DC, {0x30DB, 0x3099, 0}}, {0x30DD, {0x30DB, 0x309A, 0}}, {0x30F4, {0x30A6, 0x3099, 0}}, {0x30F7, {0x30EF, 0x3099, 0}}, {0x30F8, {0x30F0, 0x3099, 0}}, {0x30F9, {0x30F1, 0x3099, 0}}, {0x30FA, {0x30F2, 0x3099, 0}}, {0x30FE, {0x30FD, 0x3099, 0}}, {0xFB2A, {0x05E9, 0x05C1, 0}}, {0xFB2B, {0x05E9, 0x05C2, 0}}, {0xFB2C, {0x05E9, 0x05BC, 0x05C1, 0}}, {0xFB2D, {0x05E9, 0x05BC, 0x05C2, 0}}, {0xFB2E, {0x05D0, 0x05B7, 0}}, {0xFB2F, {0x05D0, 0x05B8, 0}}, {0xFB30, {0x05D0, 0x05BC, 0}}, {0xFB31, {0x05D1, 0x05BC, 0}}, {0xFB32, {0x05D2, 0x05BC, 0}}, {0xFB33, {0x05D3, 0x05BC, 0}}, {0xFB34, {0x05D4, 0x05BC, 0}}, {0xFB35, {0x05D5, 0x05BC, 0}}, {0xFB36, {0x05D6, 0x05BC, 0}}, {0xFB38, {0x05D8, 0x05BC, 0}}, {0xFB39, {0x05D9, 0x05BC, 0}}, {0xFB3A, {0x05DA, 0x05BC, 0}}, {0xFB3B, {0x05DB, 0x05BC, 0}}, {0xFB3C, {0x05DC, 0x05BC, 0}}, {0xFB3E, {0x05DE, 0x05BC, 0}}, {0xFB40, {0x05E0, 0x05BC, 0}}, {0xFB41, {0x05E1, 0x05BC, 0}}, {0xFB43, {0x05E3, 0x05BC, 0}}, {0xFB44, {0x05E4, 0x05BC, 0}}, {0xFB46, {0x05E6, 0x05BC, 0}}, {0xFB47, {0x05E7, 0x05BC, 0}}, {0xFB48, {0x05E8, 0x05BC, 0}}, {0xFB49, {0x05E9, 0x05BC, 0}}, {0xFB4A, {0x05EA, 0x05BC, 0}}, {0xFB4B, {0x05D5, 0x05B9, 0}}, {0xFB4C, {0x05D1, 0x05BF, 0}}, {0xFB4D, {0x05DB, 0x05BF, 0}}, {0xFB4E, {0x05E4, 0x05BF, 0}} }; static const unsigned int uni_dec_table_size = sizeof(uni_dec_table) / sizeof(struct _dec_); gnustep-base-1.29.0/Source/Additions/unicode/gsm0338.h000066400000000000000000001463231435650067400223040ustar00rootroot00000000000000/* Created by Richard Frith-Macdonald on 2002 Jan 24 */ /* Copyright (C) 2005 Free Software Foundation Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. */ // GSM0338 to Unicode maping static const unsigned int GSM0338_conv_base = 0x00; static unichar GSM0338_char_to_uni_table[] = { 0x0040, 0x00A3, 0x0024, 0x00A5, 0x00E8, 0x00E9, 0x00F9, 0x00EC, 0x00F2, 0x00C7, 0x000A, 0x00D8, 0x00F8, 0x000D, 0x00C5, 0x00E5, 0x0394, 0x005F, 0x03A6, 0x0393, 0x039B, 0x03A9, 0x03A0, 0x03A8, 0x03A3, 0x0398, 0x039E, 0x00A0, 0x00C6, 0x00E6, 0x00DF, 0x00C9, 0x0020, 0x0021, 0x0022, 0x0023, 0x00A4, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x00A1, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x00C4, 0x00D6, 0x00D1, 0x00DC, 0x00A7, 0x00BF, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x00E4, 0x00F6, 0x00F1, 0x00FC, 0x00E0 }; static _ucc_ GSM0338_uni_to_char_table[] = { {0x000A,0x0A,}, {0x000D,0x0D,}, {0x0020,0x20,}, {0x0021,0x21,}, {0x0022,0x22,}, {0x0023,0x23,}, {0x0024,0x02,}, {0x0025,0x25,}, {0x0026,0x26,}, {0x0027,0x27,}, {0x0028,0x28,}, {0x0029,0x29,}, {0x002A,0x2A,}, {0x002B,0x2B,}, {0x002C,0x2C,}, {0x002D,0x2D,}, {0x002E,0x2E,}, {0x002F,0x2F,}, {0x0030,0x30,}, {0x0031,0x31,}, {0x0032,0x32,}, {0x0033,0x33,}, {0x0034,0x34,}, {0x0035,0x35,}, {0x0036,0x36,}, {0x0037,0x37,}, {0x0038,0x38,}, {0x0039,0x39,}, {0x003A,0x3A,}, {0x003B,0x3B,}, {0x003C,0x3C,}, {0x003D,0x3D,}, {0x003E,0x3E,}, {0x003F,0x3F,}, {0x0040,0x00,}, {0x0041,0x41,}, {0x0042,0x42,}, {0x0043,0x43,}, {0x0044,0x44,}, {0x0045,0x45,}, {0x0046,0x46,}, {0x0047,0x47,}, {0x0048,0x48,}, {0x0049,0x49,}, {0x004A,0x4A,}, {0x004B,0x4B,}, {0x004C,0x4C,}, {0x004D,0x4D,}, {0x004E,0x4E,}, {0x004F,0x4F,}, {0x0050,0x50,}, {0x0051,0x51,}, {0x0052,0x52,}, {0x0053,0x53,}, {0x0054,0x54,}, {0x0055,0x55,}, {0x0056,0x56,}, {0x0057,0x57,}, {0x0058,0x58,}, {0x0059,0x59,}, {0x005A,0x5A,}, {0x005F,0x11,}, {0x0061,0x61,}, {0x0062,0x62,}, {0x0063,0x63,}, {0x0064,0x64,}, {0x0065,0x65,}, {0x0066,0x66,}, {0x0067,0x67,}, {0x0068,0x68,}, {0x0069,0x69,}, {0x006A,0x6A,}, {0x006B,0x6B,}, {0x006C,0x6C,}, {0x006D,0x6D,}, {0x006E,0x6E,}, {0x006F,0x6F,}, {0x0070,0x70,}, {0x0071,0x71,}, {0x0072,0x72,}, {0x0073,0x73,}, {0x0074,0x74,}, {0x0075,0x75,}, {0x0076,0x76,}, {0x0077,0x77,}, {0x0078,0x78,}, {0x0079,0x79,}, {0x007A,0x7A,}, {0x00A0,0x20,}, /* Map unicode no-break-space to gsm space */ {0x00A1,0x40,}, {0x00A3,0x01,}, {0x00A4,0x24,}, {0x00A5,0x03,}, {0x00A7,0x5F,}, {0x00BF,0x60,}, {0x00C4,0x5B,}, {0x00C5,0x0E,}, {0x00C6,0x1C,}, {0x00C7,0x09,}, {0x00C9,0x1F,}, {0x00D1,0x5D,}, {0x00D6,0x5C,}, {0x00D8,0x0B,}, {0x00DC,0x5E,}, {0x00DF,0x1E,}, {0x00E0,0x7F,}, {0x00E4,0x7B,}, {0x00E5,0x0F,}, {0x00E6,0x1D,}, {0x00E8,0x04,}, {0x00E9,0x05,}, {0x00EC,0x07,}, {0x00F1,0x7D,}, {0x00F2,0x08,}, {0x00F6,0x7C,}, {0x00F8,0x0C,}, {0x00F9,0x06,}, {0x00FC,0x7E,}, {0x0393,0x13,}, {0x0394,0x10,}, {0x0398,0x19,}, {0x039B,0x14,}, {0x039E,0x1A,}, {0x03A0,0x16,}, {0x03A3,0x18,}, {0x03A6,0x12,}, {0x03A8,0x17,}, {0x03A9,0x15,} }; #define GSM0338_tsize (sizeof(GSM0338_uni_to_char_table)/sizeof(_ucc_)) static _ucc_ GSM0338_escapes[] = { {0x000C,0x0A}, /* Form feed */ {0x005B,0x3C}, /* '[' */ {0x005C,0x2F}, /* '\\' */ {0x005D,0x3E}, /* ']' */ {0x005E,0x14}, /* '^' */ {0x007B,0x28}, /* '{' */ {0x007C,0x40}, /* '|' */ {0x007D,0x29}, /* '}' */ {0x007E,0x3D}, /* '~' */ {0x20AC,0x65} /* Euro symbol */ }; #define GSM0338_esize (sizeof(GSM0338_escapes)/sizeof(_ucc_)) /* * Some of these conversions should not be needed because they are * already handled by escape sequences ... I put them here so we can * support two varieties of the GSM alphabet. The official one, and * a cut down version suitable for use when delivering data to phones * which don't support escape sequences. */ static _ucc_ GSM0338_lossy[] = { {0x005B,0x3C}, /* '[' => '<' */ {0x005C,0x2F}, /* '\\' => '/' */ {0x005D,0x3E}, /* ']' => '>' */ {0x005E,0x14}, /* '^' => lambda */ {0x0060,0x27}, /* '`' => '\'' */ {0x007B,0x28}, /* '{' => '(' */ {0x007C,0x40}, /* '|' => 'i' */ {0x007D,0x29}, /* '}' => ')' */ {0x007E,0x3D}, /* '~' => '=' */ {0x00AA,'a'}, /* FEMININE ORDINAL INDICATOR */ {0x00BA,'o'}, /* MASCULINE ORDINAL INDICATOR */ {0x00C0,'A'}, /* LATIN CAPITAL LETTER A WITH GRAVE */ {0x00C1,'A'}, /* LATIN CAPITAL LETTER A WITH ACUTE */ {0x00C2,'A'}, /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX */ {0x00C3,'A'}, /* LATIN CAPITAL LETTER A WITH TILDE */ {0x00C7,0x09}, /* C cedilla */ {0x00C8,'E'}, /* LATIN CAPITAL LETTER E WITH GRAVE */ {0x00CA,'E'}, /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX */ {0x00CB,'E'}, /* LATIN CAPITAL LETTER E WITH DIAERESIS */ {0x00CC,'I'}, /* LATIN CAPITAL LETTER I WITH GRAVE */ {0x00CD,'I'}, /* LATIN CAPITAL LETTER I WITH ACUTE */ {0x00CE,'I'}, /* LATIN CAPITAL LETTER I WITH CIRCUMFLEX */ {0x00CF,'I'}, /* LATIN CAPITAL LETTER I WITH DIAERESIS */ {0x00D0,'D'}, /* LATIN CAPITAL LETTER ETH */ {0x00D2,'O'}, /* LATIN CAPITAL LETTER O WITH GRAVE */ {0x00D3,'O'}, /* LATIN CAPITAL LETTER O WITH ACUTE */ {0x00D4,'O'}, /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX */ {0x00D5,'O'}, /* LATIN CAPITAL LETTER O WITH TILDE */ {0x00D9,'U'}, /* LATIN CAPITAL LETTER U WITH GRAVE */ {0x00DA,'U'}, /* LATIN CAPITAL LETTER U WITH ACUTE */ {0x00DB,'U'}, /* LATIN CAPITAL LETTER U WITH CIRCUMFLEX */ {0x00DD,'Y'}, /* LATIN CAPITAL LETTER Y WITH ACUTE */ {0x00DF,'s'}, /* LATIN SMALL LETTER SHARP S */ {0x00E0,'a'}, /* LATIN SMALL LETTER A WITH GRAVE */ {0x00E1,'a'}, /* LATIN SMALL LETTER A WITH ACUTE */ {0x00E2,'a'}, /* LATIN SMALL LETTER A WITH CIRCUMFLEX */ {0x00E3,'a'}, /* LATIN SMALL LETTER A WITH TILDE */ {0x00E7,'c'}, /* LATIN SMALL LETTER C WITH CEDILLA */ {0x00EA,'e'}, /* LATIN SMALL LETTER E WITH CIRCUMFLEX */ {0x00EB,'e'}, /* LATIN SMALL LETTER E WITH DIAERESIS */ {0x00ED,'i'}, /* LATIN SMALL LETTER I WITH ACUTE */ {0x00EE,'i'}, /* LATIN SMALL LETTER I WITH CIRCUMFLEX */ {0x00EF,'i'}, /* LATIN SMALL LETTER I WITH DIAERESIS */ {0x00F0,'d'}, /* LATIN SMALL LETTER ETH */ {0x00F3,'o'}, /* LATIN SMALL LETTER O WITH ACUTE */ {0x00F4,'o'}, /* LATIN SMALL LETTER O WITH CIRCUMFLEX */ {0x00F5,'o'}, /* LATIN SMALL LETTER O WITH TILDE */ {0x00FA,'u'}, /* LATIN SMALL LETTER U WITH ACUTE */ {0x00FB,'u'}, /* LATIN SMALL LETTER U WITH CIRCUMFLEX */ {0x00FD,'y'}, /* LATIN SMALL LETTER Y WITH ACUTE */ {0x00FF,'y'}, /* LATIN SMALL LETTER Y WITH DIAERESIS */ {0x0100,'A'}, /* LATIN CAPITAL LETTER A WITH MACRON */ {0x0101,'a'}, /* LATIN SMALL LETTER A WITH MACRON */ {0x0102,'A'}, /* LATIN CAPITAL LETTER A WITH BREVE */ {0x0103,'a'}, /* LATIN SMALL LETTER A WITH BREVE */ {0x0104,'A'}, /* LATIN CAPITAL LETTER A WITH OGONEK */ {0x0105,'a'}, /* LATIN SMALL LETTER A WITH OGONEK */ {0x0106,'C'}, /* LATIN CAPITAL LETTER C WITH ACUTE */ {0x0107,'c'}, /* LATIN SMALL LETTER C WITH ACUTE */ {0x0108,'C'}, /* LATIN CAPITAL LETTER C WITH CIRCUMFLEX */ {0x0109,'c'}, /* LATIN SMALL LETTER C WITH CIRCUMFLEX */ {0x010A,'C'}, /* LATIN CAPITAL LETTER C WITH DOT ABOVE */ {0x010B,'c'}, /* LATIN SMALL LETTER C WITH DOT ABOVE */ {0x010C,'C'}, /* LATIN CAPITAL LETTER C WITH CARON */ {0x010D,'c'}, /* LATIN SMALL LETTER C WITH CARON */ {0x010E,'D'}, /* LATIN CAPITAL LETTER D WITH CARON */ {0x010F,'d'}, /* LATIN SMALL LETTER D WITH CARON */ {0x0110,'D'}, /* LATIN CAPITAL LETTER D WITH STROKE */ {0x0111,'d'}, /* LATIN SMALL LETTER D WITH STROKE */ {0x0112,'E'}, /* LATIN CAPITAL LETTER E WITH MACRON */ {0x0113,'e'}, /* LATIN SMALL LETTER E WITH MACRON */ {0x0114,'E'}, /* LATIN CAPITAL LETTER E WITH BREVE */ {0x0115,'e'}, /* LATIN SMALL LETTER E WITH BREVE */ {0x0116,'E'}, /* LATIN CAPITAL LETTER E WITH DOT ABOVE */ {0x0117,'e'}, /* LATIN SMALL LETTER E WITH DOT ABOVE */ {0x0118,'E'}, /* LATIN CAPITAL LETTER E WITH OGONEK */ {0x0119,'e'}, /* LATIN SMALL LETTER E WITH OGONEK */ {0x011A,'E'}, /* LATIN CAPITAL LETTER E WITH CARON */ {0x011B,'e'}, /* LATIN SMALL LETTER E WITH CARON */ {0x011C,'G'}, /* LATIN CAPITAL LETTER G WITH CIRCUMFLEX */ {0x011D,'g'}, /* LATIN SMALL LETTER G WITH CIRCUMFLEX */ {0x011E,'G'}, /* LATIN CAPITAL LETTER G WITH BREVE */ {0x011F,'g'}, /* LATIN SMALL LETTER G WITH BREVE */ {0x0120,'G'}, /* LATIN CAPITAL LETTER G WITH DOT ABOVE */ {0x0121,'g'}, /* LATIN SMALL LETTER G WITH DOT ABOVE */ {0x0122,'G'}, /* LATIN CAPITAL LETTER G WITH CEDILLA */ {0x0123,'g'}, /* LATIN SMALL LETTER G WITH CEDILLA */ {0x0124,'H'}, /* LATIN CAPITAL LETTER H WITH CIRCUMFLEX */ {0x0125,'h'}, /* LATIN SMALL LETTER H WITH CIRCUMFLEX */ {0x0126,'H'}, /* LATIN CAPITAL LETTER H WITH STROKE */ {0x0127,'h'}, /* LATIN SMALL LETTER H WITH STROKE */ {0x0128,'I'}, /* LATIN CAPITAL LETTER I WITH TILDE */ {0x0129,'i'}, /* LATIN SMALL LETTER I WITH TILDE */ {0x012A,'I'}, /* LATIN CAPITAL LETTER I WITH MACRON */ {0x012B,'i'}, /* LATIN SMALL LETTER I WITH MACRON */ {0x012C,'I'}, /* LATIN CAPITAL LETTER I WITH BREVE */ {0x012D,'i'}, /* LATIN SMALL LETTER I WITH BREVE */ {0x012E,'I'}, /* LATIN CAPITAL LETTER I WITH OGONEK */ {0x012F,'i'}, /* LATIN SMALL LETTER I WITH OGONEK */ {0x0130,'I'}, /* LATIN CAPITAL LETTER I WITH DOT ABOVE */ {0x0131,'i'}, /* LATIN SMALL LETTER DOTLESS I */ {0x0132,'I'}, /* LATIN CAPITAL LIGATURE IJ */ {0x0133,'i'}, /* LATIN SMALL LIGATURE IJ */ {0x0134,'J'}, /* LATIN CAPITAL LETTER J WITH CIRCUMFLEX */ {0x0135,'j'}, /* LATIN SMALL LETTER J WITH CIRCUMFLEX */ {0x0136,'K'}, /* LATIN CAPITAL LETTER K WITH CEDILLA */ {0x0137,'k'}, /* LATIN SMALL LETTER K WITH CEDILLA */ {0x0138,'k'}, /* LATIN SMALL LETTER KRA */ {0x0139,'L'}, /* LATIN CAPITAL LETTER L WITH ACUTE */ {0x013A,'l'}, /* LATIN SMALL LETTER L WITH ACUTE */ {0x013B,'L'}, /* LATIN CAPITAL LETTER L WITH CEDILLA */ {0x013C,'l'}, /* LATIN SMALL LETTER L WITH CEDILLA */ {0x013D,'L'}, /* LATIN CAPITAL LETTER L WITH CARON */ {0x013E,'l'}, /* LATIN SMALL LETTER L WITH CARON */ {0x013F,'L'}, /* LATIN CAPITAL LETTER L WITH MIDDLE DOT */ {0x0140,'l'}, /* LATIN SMALL LETTER L WITH MIDDLE DOT */ {0x0141,'L'}, /* LATIN CAPITAL LETTER L WITH STROKE */ {0x0142,'l'}, /* LATIN SMALL LETTER L WITH STROKE */ {0x0143,'N'}, /* LATIN CAPITAL LETTER N WITH ACUTE */ {0x0144,'n'}, /* LATIN SMALL LETTER N WITH ACUTE */ {0x0145,'N'}, /* LATIN CAPITAL LETTER N WITH CEDILLA */ {0x0146,'n'}, /* LATIN SMALL LETTER N WITH CEDILLA */ {0x0147,'N'}, /* LATIN CAPITAL LETTER N WITH CARON */ {0x0148,'n'}, /* LATIN SMALL LETTER N WITH CARON */ {0x014C,'O'}, /* LATIN CAPITAL LETTER O WITH MACRON */ {0x014D,'o'}, /* LATIN SMALL LETTER O WITH MACRON */ {0x014E,'O'}, /* LATIN CAPITAL LETTER O WITH BREVE */ {0x014F,'o'}, /* LATIN SMALL LETTER O WITH BREVE */ {0x0150,'O'}, /* LATIN CAPITAL LETTER O WITH DOUBLE ACUTE */ {0x0151,'o'}, /* LATIN SMALL LETTER O WITH DOUBLE ACUTE */ {0x0154,'R'}, /* LATIN CAPITAL LETTER R WITH ACUTE */ {0x0155,'r'}, /* LATIN SMALL LETTER R WITH ACUTE */ {0x0156,'R'}, /* LATIN CAPITAL LETTER R WITH CEDILLA */ {0x0157,'r'}, /* LATIN SMALL LETTER R WITH CEDILLA */ {0x0158,'R'}, /* LATIN CAPITAL LETTER R WITH CARON */ {0x0159,'r'}, /* LATIN SMALL LETTER R WITH CARON */ {0x015A,'S'}, /* LATIN CAPITAL LETTER S WITH ACUTE */ {0x015B,'s'}, /* LATIN SMALL LETTER S WITH ACUTE */ {0x015C,'S'}, /* LATIN CAPITAL LETTER S WITH CIRCUMFLEX */ {0x015D,'s'}, /* LATIN SMALL LETTER S WITH CIRCUMFLEX */ {0x015E,'S'}, /* LATIN CAPITAL LETTER S WITH CEDILLA */ {0x015F,'s'}, /* LATIN SMALL LETTER S WITH CEDILLA */ {0x0160,'S'}, /* LATIN CAPITAL LETTER S WITH CARON */ {0x0161,'s'}, /* LATIN SMALL LETTER S WITH CARON */ {0x0162,'T'}, /* LATIN CAPITAL LETTER T WITH CEDILLA */ {0x0163,'t'}, /* LATIN SMALL LETTER T WITH CEDILLA */ {0x0164,'T'}, /* LATIN CAPITAL LETTER T WITH CARON */ {0x0165,'t'}, /* LATIN SMALL LETTER T WITH CARON */ {0x0166,'T'}, /* LATIN CAPITAL LETTER T WITH STROKE */ {0x0167,'t'}, /* LATIN SMALL LETTER T WITH STROKE */ {0x0168,'U'}, /* LATIN CAPITAL LETTER U WITH TILDE */ {0x0169,'u'}, /* LATIN SMALL LETTER U WITH TILDE */ {0x016A,'U'}, /* LATIN CAPITAL LETTER U WITH MACRON */ {0x016B,'u'}, /* LATIN SMALL LETTER U WITH MACRON */ {0x016C,'U'}, /* LATIN CAPITAL LETTER U WITH BREVE */ {0x016D,'u'}, /* LATIN SMALL LETTER U WITH BREVE */ {0x016E,'U'}, /* LATIN CAPITAL LETTER U WITH RING ABOVE */ {0x016F,'u'}, /* LATIN SMALL LETTER U WITH RING ABOVE */ {0x0170,'U'}, /* LATIN CAPITAL LETTER U WITH DOUBLE ACUTE */ {0x0171,'u'}, /* LATIN SMALL LETTER U WITH DOUBLE ACUTE */ {0x0172,'U'}, /* LATIN CAPITAL LETTER U WITH OGONEK */ {0x0173,'u'}, /* LATIN SMALL LETTER U WITH OGONEK */ {0x0174,'W'}, /* LATIN CAPITAL LETTER W WITH CIRCUMFLEX */ {0x0175,'w'}, /* LATIN SMALL LETTER W WITH CIRCUMFLEX */ {0x0176,'Y'}, /* LATIN CAPITAL LETTER Y WITH CIRCUMFLEX */ {0x0177,'y'}, /* LATIN SMALL LETTER Y WITH CIRCUMFLEX */ {0x0178,'Y'}, /* LATIN CAPITAL LETTER Y WITH DIAERESIS */ {0x0179,'Z'}, /* LATIN CAPITAL LETTER Z WITH ACUTE */ {0x017A,'z'}, /* LATIN SMALL LETTER Z WITH ACUTE */ {0x017B,'Z'}, /* LATIN CAPITAL LETTER Z WITH DOT ABOVE */ {0x017C,'z'}, /* LATIN SMALL LETTER Z WITH DOT ABOVE */ {0x017D,'Z'}, /* LATIN CAPITAL LETTER Z WITH CARON */ {0x017E,'z'}, /* LATIN SMALL LETTER Z WITH CARON */ {0x017F,'s'}, /* LATIN SMALL LETTER LONG S */ {0x0180,'b'}, /* LATIN SMALL LETTER B WITH STROKE */ {0x0181,'B'}, /* LATIN CAPITAL LETTER B WITH HOOK */ {0x0182,'B'}, /* LATIN CAPITAL LETTER B WITH TOPBAR */ {0x0183,'b'}, /* LATIN SMALL LETTER B WITH TOPBAR */ {0x0184,'6'}, /* LATIN CAPITAL LETTER TONE SIX */ {0x0185,'6'}, /* LATIN SMALL LETTER TONE SIX */ {0x0186,'O'}, /* LATIN CAPITAL LETTER OPEN O */ {0x0187,'C'}, /* LATIN CAPITAL LETTER C WITH HOOK */ {0x0188,'c'}, /* LATIN SMALL LETTER C WITH HOOK */ {0x0189,'D'}, /* LATIN CAPITAL LETTER AFRICAN D */ {0x018A,'D'}, /* LATIN CAPITAL LETTER D WITH HOOK */ {0x018B,'D'}, /* LATIN CAPITAL LETTER D WITH TOPBAR */ {0x018C,'d'}, /* LATIN SMALL LETTER D WITH TOPBAR */ {0x018D,'d'}, /* LATIN SMALL LETTER TURNED DELTA */ {0x018E,'E'}, /* LATIN CAPITAL LETTER REVERSED E */ {0x018F,'E'}, /* LATIN CAPITAL LETTER SCHWA */ {0x0190,'E'}, /* LATIN CAPITAL LETTER OPEN E */ {0x0191,'F'}, /* LATIN CAPITAL LETTER F WITH HOOK */ {0x0192,'f'}, /* LATIN SMALL LETTER F WITH HOOK */ {0x0193,'G'}, /* LATIN CAPITAL LETTER G WITH HOOK */ {0x0194,'G'}, /* LATIN CAPITAL LETTER GAMMA */ {0x0196,'I'}, /* LATIN CAPITAL LETTER IOTA */ {0x0197,'I'}, /* LATIN CAPITAL LETTER I WITH STROKE */ {0x0198,'K'}, /* LATIN CAPITAL LETTER K WITH HOOK */ {0x0199,'k'}, /* LATIN SMALL LETTER K WITH HOOK */ {0x019A,'l'}, /* LATIN SMALL LETTER L WITH BAR */ {0x019B,'l'}, /* LATIN SMALL LETTER LAMBDA WITH STROKE */ {0x019C,'M'}, /* LATIN CAPITAL LETTER TURNED M */ {0x019D,'N'}, /* LATIN CAPITAL LETTER N WITH LEFT HOOK */ {0x019E,'n'}, /* LATIN SMALL LETTER N WITH LONG RIGHT LEG */ {0x019F,'O'}, /* LATIN CAPITAL LETTER O WITH MIDDLE TILDE */ {0x01A0,'O'}, /* LATIN CAPITAL LETTER O WITH HORN */ {0x01A1,'o'}, /* LATIN SMALL LETTER O WITH HORN */ {0x01A4,'P'}, /* LATIN CAPITAL LETTER P WITH HOOK */ {0x01A5,'p'}, /* LATIN SMALL LETTER P WITH HOOK */ {0x01A7,'2'}, /* LATIN CAPITAL LETTER TONE TWO */ {0x01A8,'2'}, /* LATIN SMALL LETTER TONE TWO */ {0x01A9,'S'}, /* LATIN CAPITAL LETTER ESH */ {0x01AA,'s'}, /* LATIN LETTER REVERSED ESH LOOP */ {0x01AB,'t'}, /* LATIN SMALL LETTER T WITH PALATAL HOOK */ {0x01AC,'T'}, /* LATIN CAPITAL LETTER T WITH HOOK */ {0x01AD,'t'}, /* LATIN SMALL LETTER T WITH HOOK */ {0x01AE,'T'}, /* LATIN CAPITAL LETTER T WITH RETROFLEX HOOK */ {0x01AF,'U'}, /* LATIN CAPITAL LETTER U WITH HORN */ {0x01B0,'u'}, /* LATIN SMALL LETTER U WITH HORN */ {0x01B1,'u'}, /* LATIN CAPITAL LETTER UPSILON */ {0x01B2,'V'}, /* LATIN CAPITAL LETTER V WITH HOOK */ {0x01B3,'Y'}, /* LATIN CAPITAL LETTER Y WITH HOOK */ {0x01B4,'y'}, /* LATIN SMALL LETTER Y WITH HOOK */ {0x01B5,'Z'}, /* LATIN CAPITAL LETTER Z WITH STROKE */ {0x01B6,'z'}, /* LATIN SMALL LETTER Z WITH STROKE */ {0x01B7,'Z'}, /* LATIN CAPITAL LETTER EZH */ {0x01B8,'Z'}, /* LATIN CAPITAL LETTER EZH REVERSED */ {0x01B9,'Z'}, /* LATIN SMALL LETTER EZH REVERSED */ {0x01BA,'z'}, /* LATIN SMALL LETTER EZH WITH TAIL */ {0x01BB,'2'}, /* LATIN LETTER TWO WITH STROKE */ {0x01BC,'5'}, /* LATIN CAPITAL LETTER TONE FIVE */ {0x01BD,'5'}, /* LATIN SMALL LETTER TONE FIVE */ {0x01BF,'w'}, /* LATIN LETTER WYNN */ {0x01C6,'d'}, /* LATIN SMALL LETTER DZ WITH CARON */ {0x01CD,'A'}, /* LATIN CAPITAL LETTER A WITH CARON */ {0x01CE,'a'}, /* LATIN SMALL LETTER A WITH CARON */ {0x01CF,'I'}, /* LATIN CAPITAL LETTER I WITH CARON */ {0x01D0,'i'}, /* LATIN SMALL LETTER I WITH CARON */ {0x01D1,'O'}, /* LATIN CAPITAL LETTER O WITH CARON */ {0x01D2,'o'}, /* LATIN SMALL LETTER O WITH CARON */ {0x01D3,'U'}, /* LATIN CAPITAL LETTER U WITH CARON */ {0x01D4,'u'}, /* LATIN SMALL LETTER U WITH CARON */ {0x01D5,'U'}, /* LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON */ {0x01D6,'u'}, /* LATIN SMALL LETTER U WITH DIAERESIS AND MACRON */ {0x01D7,'U'}, /* LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE */ {0x01D8,'u'}, /* LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE */ {0x01D9,'U'}, /* LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON */ {0x01DA,'u'}, /* LATIN SMALL LETTER U WITH DIAERESIS AND CARON */ {0x01DB,'U'}, /* LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE */ {0x01DC,'u'}, /* LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE */ {0x01DD,'e'}, /* LATIN SMALL LETTER TURNED E */ {0x01DE,'A'}, /* LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON */ {0x01DF,'a'}, /* LATIN SMALL LETTER A WITH DIAERESIS AND MACRON */ {0x01E0,'A'}, /* LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON */ {0x01E1,'a'}, /* LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON */ {0x01E4,'G'}, /* LATIN CAPITAL LETTER G WITH STROKE */ {0x01E5,'g'}, /* LATIN SMALL LETTER G WITH STROKE */ {0x01E6,'G'}, /* LATIN CAPITAL LETTER G WITH CARON */ {0x01E7,'g'}, /* LATIN SMALL LETTER G WITH CARON */ {0x01E8,'K'}, /* LATIN CAPITAL LETTER K WITH CARON */ {0x01E9,'k'}, /* LATIN SMALL LETTER K WITH CARON */ {0x01EA,'O'}, /* LATIN CAPITAL LETTER O WITH OGONEK */ {0x01EB,'o'}, /* LATIN SMALL LETTER O WITH OGONEK */ {0x01EC,'O'}, /* LATIN CAPITAL LETTER O WITH OGONEK AND MACRON */ {0x01ED,'o'}, /* LATIN SMALL LETTER O WITH OGONEK AND MACRON */ {0x01EE,'Z'}, /* LATIN CAPITAL LETTER EZH WITH CARON */ {0x01EF,'Z'}, /* LATIN SMALL LETTER EZH WITH CARON */ {0x01F0,'j'}, /* LATIN SMALL LETTER J WITH CARON */ {0x01F4,'G'}, /* LATIN CAPITAL LETTER G WITH ACUTE */ {0x01F5,'g'}, /* LATIN SMALL LETTER G WITH ACUTE */ {0x01F7,'w'}, /* LATIN CAPITAL LETTER WYNN */ {0x01F8,'N'}, /* LATIN CAPITAL LETTER N WITH GRAVE */ {0x01F9,'n'}, /* LATIN SMALL LETTER N WITH GRAVE */ {0x01FA,'A'}, /* LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE */ {0x01FB,'a'}, /* LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE */ {0x01FE,'O'}, /* LATIN CAPITAL LETTER O WITH STROKE AND ACUTE */ {0x01FF,'o'}, /* LATIN SMALL LETTER O WITH STROKE AND ACUTE */ {0x0200,'A'}, /* LATIN CAPITAL LETTER A WITH DOUBLE GRAVE */ {0x0201,'a'}, /* LATIN SMALL LETTER A WITH DOUBLE GRAVE */ {0x0202,'A'}, /* LATIN CAPITAL LETTER A WITH INVERTED BREVE */ {0x0203,'a'}, /* LATIN SMALL LETTER A WITH INVERTED BREVE */ {0x0204,'E'}, /* LATIN CAPITAL LETTER E WITH DOUBLE GRAVE */ {0x0205,'e'}, /* LATIN SMALL LETTER E WITH DOUBLE GRAVE */ {0x0206,'E'}, /* LATIN CAPITAL LETTER E WITH INVERTED BREVE */ {0x0207,'e'}, /* LATIN SMALL LETTER E WITH INVERTED BREVE */ {0x0208,'I'}, /* LATIN CAPITAL LETTER I WITH DOUBLE GRAVE */ {0x0209,'i'}, /* LATIN SMALL LETTER I WITH DOUBLE GRAVE */ {0x020A,'I'}, /* LATIN CAPITAL LETTER I WITH INVERTED BREVE */ {0x020B,'i'}, /* LATIN SMALL LETTER I WITH INVERTED BREVE */ {0x020C,'O'}, /* LATIN CAPITAL LETTER O WITH DOUBLE GRAVE */ {0x020D,'o'}, /* LATIN SMALL LETTER O WITH DOUBLE GRAVE */ {0x020E,'O'}, /* LATIN CAPITAL LETTER O WITH INVERTED BREVE */ {0x020F,'o'}, /* LATIN SMALL LETTER O WITH INVERTED BREVE */ {0x0210,'R'}, /* LATIN CAPITAL LETTER R WITH DOUBLE GRAVE */ {0x0211,'r'}, /* LATIN SMALL LETTER R WITH DOUBLE GRAVE */ {0x0212,'R'}, /* LATIN CAPITAL LETTER R WITH INVERTED BREVE */ {0x0213,'r'}, /* LATIN SMALL LETTER R WITH INVERTED BREVE */ {0x0214,'U'}, /* LATIN CAPITAL LETTER U WITH DOUBLE GRAVE */ {0x0215,'u'}, /* LATIN SMALL LETTER U WITH DOUBLE GRAVE */ {0x0216,'U'}, /* LATIN CAPITAL LETTER U WITH INVERTED BREVE */ {0x0217,'u'}, /* LATIN SMALL LETTER U WITH INVERTED BREVE */ {0x0218,'S'}, /* LATIN CAPITAL LETTER S WITH COMMA BELOW */ {0x0219,'s'}, /* LATIN SMALL LETTER S WITH COMMA BELOW */ {0x021A,'T'}, /* LATIN CAPITAL LETTER T WITH COMMA BELOW */ {0x021B,'t'}, /* LATIN SMALL LETTER T WITH COMMA BELOW */ {0x021C,'Z'}, /* LATIN CAPITAL LETTER YOGH */ {0x021D,'z'}, /* LATIN SMALL LETTER YOGH */ {0x021E,'H'}, /* LATIN CAPITAL LETTER H WITH CARON */ {0x021F,'h'}, /* LATIN SMALL LETTER H WITH CARON */ {0x0220,'N'}, /* LATIN CAPITAL LETTER N WITH LONG RIGHT LEG */ {0x0221,'d'}, /* LATIN SMALL LETTER D WITH CURL */ {0x0224,'Z'}, /* LATIN CAPITAL LETTER Z WITH HOOK */ {0x0225,'z'}, /* LATIN SMALL LETTER Z WITH HOOK */ {0x0226,'A'}, /* LATIN CAPITAL LETTER A WITH DOT ABOVE */ {0x0227,'a'}, /* LATIN SMALL LETTER A WITH DOT ABOVE */ {0x0228,'E'}, /* LATIN CAPITAL LETTER E WITH CEDILLA */ {0x0229,'e'}, /* LATIN SMALL LETTER E WITH CEDILLA */ {0x022A,'O'}, /* LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON */ {0x022B,'o'}, /* LATIN SMALL LETTER O WITH DIAERESIS AND MACRON */ {0x022C,'O'}, /* LATIN CAPITAL LETTER O WITH TILDE AND MACRON */ {0x022D,'o'}, /* LATIN SMALL LETTER O WITH TILDE AND MACRON */ {0x022E,'O'}, /* LATIN CAPITAL LETTER O WITH DOT ABOVE */ {0x022F,'o'}, /* LATIN SMALL LETTER O WITH DOT ABOVE */ {0x0230,'O'}, /* LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON */ {0x0231,'o'}, /* LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON */ {0x0232,'Y'}, /* LATIN CAPITAL LETTER Y WITH MACRON */ {0x0233,'y'}, /* LATIN SMALL LETTER Y WITH MACRON */ {0x0234,'l'}, /* LATIN SMALL LETTER L WITH CURL */ {0x0235,'n'}, /* LATIN SMALL LETTER N WITH CURL */ {0x0236,'t'}, /* LATIN SMALL LETTER T WITH CURL */ {0x0250,'a'}, /* LATIN SMALL LETTER TURNED A */ {0x0251,'a'}, /* LATIN SMALL LETTER ALPHA */ {0x0252,'a'}, /* LATIN SMALL LETTER TURNED ALPHA */ {0x0253,'b'}, /* LATIN SMALL LETTER B WITH HOOK */ {0x0254,'o'}, /* LATIN SMALL LETTER OPEN O */ {0x0255,'c'}, /* LATIN SMALL LETTER C WITH CURL */ {0x0256,'d'}, /* LATIN SMALL LETTER D WITH TAIL */ {0x0257,'d'}, /* LATIN SMALL LETTER D WITH HOOK */ {0x0258,'e'}, /* LATIN SMALL LETTER REVERSED E */ {0x0259,'e'}, /* LATIN SMALL LETTER SCHWA */ {0x025A,'e'}, /* LATIN SMALL LETTER SCHWA WITH HOOK */ {0x025B,'e'}, /* LATIN SMALL LETTER OPEN E */ {0x025C,'e'}, /* LATIN SMALL LETTER REVERSED OPEN E */ {0x025D,'e'}, /* LATIN SMALL LETTER REVERSED OPEN E WITH HOOK */ {0x025E,'e'}, /* LATIN SMALL LETTER CLOSED REVERSED OPEN E */ {0x025F,'j'}, /* LATIN SMALL LETTER DOTLESS J WITH STROKE */ {0x0260,'g'}, /* LATIN SMALL LETTER G WITH HOOK */ {0x0261,'g'}, /* LATIN SMALL LETTER SCRIPT G */ {0x0262,'G'}, /* LATIN LETTER SMALL CAPITAL G */ {0x0263,'g'}, /* LATIN SMALL LETTER GAMMA */ {0x0264,'y'}, /* LATIN SMALL LETTER RAMS HORN */ {0x0265,'h'}, /* LATIN SMALL LETTER TURNED H */ {0x0266,'h'}, /* LATIN SMALL LETTER H WITH HOOK */ {0x0267,'h'}, /* LATIN SMALL LETTER HENG WITH HOOK */ {0x0268,'i'}, /* LATIN SMALL LETTER I WITH STROKE */ {0x0269,'i'}, /* LATIN SMALL LETTER IOTA */ {0x026A,'I'}, /* LATIN LETTER SMALL CAPITAL I */ {0x026B,'l'}, /* LATIN SMALL LETTER L WITH MIDDLE TILDE */ {0x026C,'l'}, /* LATIN SMALL LETTER L WITH BELT */ {0x026D,'l'}, /* LATIN SMALL LETTER L WITH RETROFLEX HOOK */ {0x026F,'m'}, /* LATIN SMALL LETTER TURNED M */ {0x0270,'m'}, /* LATIN SMALL LETTER TURNED M WITH LONG LEG */ {0x0271,'m'}, /* LATIN SMALL LETTER M WITH HOOK */ {0x0272,'n'}, /* LATIN SMALL LETTER N WITH LEFT HOOK */ {0x0273,'n'}, /* LATIN SMALL LETTER N WITH RETROFLEX HOOK */ {0x0274,'N'}, /* LATIN LETTER SMALL CAPITAL N */ {0x0275,'o'}, /* LATIN SMALL LETTER BARRED O */ {0x0277,'o'}, /* LATIN SMALL LETTER CLOSED OMEGA */ {0x0279,'r'}, /* LATIN SMALL LETTER TURNED R */ {0x027A,'r'}, /* LATIN SMALL LETTER TURNED R WITH LONG LEG */ {0x027B,'r'}, /* LATIN SMALL LETTER TURNED R WITH HOOK */ {0x027C,'r'}, /* LATIN SMALL LETTER R WITH LONG LEG */ {0x027D,'r'}, /* LATIN SMALL LETTER R WITH TAIL */ {0x027E,'r'}, /* LATIN SMALL LETTER R WITH FISHHOOK */ {0x027F,'r'}, /* LATIN SMALL LETTER REVERSED R WITH FISHHOOK */ {0x0280,'R'}, /* LATIN LETTER SMALL CAPITAL R */ {0x0281,'r'}, /* LATIN LETTER SMALL CAPITAL INVERTED R */ {0x0282,'s'}, /* LATIN SMALL LETTER S WITH HOOK */ {0x0283,'s'}, /* LATIN SMALL LETTER ESH */ {0x0284,'j'}, /* LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK */ {0x0285,'s'}, /* LATIN SMALL LETTER SQUAT REVERSED ESH */ {0x0286,'s'}, /* LATIN SMALL LETTER ESH WITH CURL */ {0x0287,'y'}, /* LATIN SMALL LETTER TURNED T */ {0x0288,'t'}, /* LATIN SMALL LETTER T WITH RETROFLEX HOOK */ {0x0289,'u'}, /* LATIN SMALL LETTER U BAR */ {0x028A,'u'}, /* LATIN SMALL LETTER UPSILON */ {0x028B,'u'}, /* LATIN SMALL LETTER V WITH HOOK */ {0x028C,'v'}, /* LATIN SMALL LETTER TURNED V */ {0x028D,'w'}, /* LATIN SMALL LETTER TURNED W */ {0x028E,'y'}, /* LATIN SMALL LETTER TURNED Y */ {0x028F,'Y'}, /* LATIN LETTER SMALL CAPITAL Y */ {0x0290,'z'}, /* LATIN SMALL LETTER Z WITH RETROFLEX HOOK */ {0x0291,'z'}, /* LATIN SMALL LETTER Z WITH CURL */ {0x0292,'z'}, /* LATIN SMALL LETTER EZH */ {0x0293,'z'}, /* LATIN SMALL LETTER EZH WITH CURL */ {0x0297,'C'}, /* LATIN LETTER STRETCHED C */ {0x0299,'B'}, /* LATIN LETTER SMALL CAPITAL B */ {0x029A,'e'}, /* LATIN SMALL LETTER CLOSED OPEN E */ {0x029B,'G'}, /* LATIN LETTER SMALL CAPITAL G WITH HOOK */ {0x029C,'H'}, /* LATIN LETTER SMALL CAPITAL H */ {0x029D,'j'}, /* LATIN SMALL LETTER J WITH CROSSED-TAIL */ {0x029E,'k'}, /* LATIN SMALL LETTER TURNED K */ {0x029F,'L'}, /* LATIN LETTER SMALL CAPITAL L */ {0x02A0,'q'}, /* LATIN SMALL LETTER Q WITH HOOK */ {0x02AC,'w'}, /* LATIN LETTER BILABIAL PERCUSSIVE */ {0x02AD,'t'}, /* LATIN LETTER BIDENTAL PERCUSSIVE */ {0x02AE,'h'}, /* LATIN SMALL LETTER TURNED H WITH FISHHOOK */ {0x02AF,'h'}, /* LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL */ {0x02B0,'h'}, /* MODIFIER LETTER SMALL H */ {0x02B1,'h'}, /* MODIFIER LETTER SMALL H WITH HOOK */ {0x02B2,'j'}, /* MODIFIER LETTER SMALL J */ {0x02B3,'r'}, /* MODIFIER LETTER SMALL R */ {0x02B4,'r'}, /* MODIFIER LETTER SMALL TURNED R */ {0x02B5,'r'}, /* MODIFIER LETTER SMALL TURNED R WITH HOOK */ {0x02B6,'R'}, /* MODIFIER LETTER SMALL CAPITAL INVERTED R */ {0x02B7,'w'}, /* MODIFIER LETTER SMALL W */ {0x02B8,'y'}, /* MODIFIER LETTER SMALL Y */ {0x02E1,'l'}, /* MODIFIER LETTER SMALL L */ {0x02E2,'s'}, /* MODIFIER LETTER SMALL S */ {0x02E3,'x'}, /* MODIFIER LETTER SMALL X */ {0x0391,0x41}, /* Alpha */ {0x0392,0x42}, /* Beta */ {0x0395,0x45}, /* Epsilon */ {0x0396,0x5A}, /* Zeta */ {0x0397,0x48}, /* Eta */ {0x0399,0x49}, /* Iota */ {0x039A,0x4B}, /* Kappa */ {0x039C,0x4D}, /* Mu */ {0x039D,0x4E}, /* Nu */ {0x039F,0x4F}, /* Omicron */ {0x03A1,0x50}, /* Rho */ {0x03A4,0x54}, /* Tau */ {0x03A5,0x55}, /* Upsilon */ {0x03A7,0x58}, /* Chi */ {0x1D00,'A'}, /* LATIN LETTER SMALL CAPITAL A */ {0x1D03,'B'}, /* LATIN LETTER SMALL CAPITAL BARRED B */ {0x1D04,'C'}, /* LATIN LETTER SMALL CAPITAL C */ {0x1D05,'D'}, /* LATIN LETTER SMALL CAPITAL D */ {0x1D07,'E'}, /* LATIN LETTER SMALL CAPITAL E */ {0x1D08,'e'}, /* LATIN SMALL LETTER TURNED OPEN E */ {0x1D09,'i'}, /* LATIN SMALL LETTER TURNED I */ {0x1D0A,'J'}, /* LATIN LETTER SMALL CAPITAL J */ {0x1D0B,'K'}, /* LATIN LETTER SMALL CAPITAL K */ {0x1D0C,'L'}, /* LATIN LETTER SMALL CAPITAL L WITH STROKE */ {0x1D0D,'M'}, /* LATIN LETTER SMALL CAPITAL M */ {0x1D0E,'N'}, /* LATIN LETTER SMALL CAPITAL REVERSED N */ {0x1D0F,'O'}, /* LATIN LETTER SMALL CAPITAL O */ {0x1D10,'O'}, /* LATIN LETTER SMALL CAPITAL OPEN O */ {0x1D11,'o'}, /* LATIN SMALL LETTER SIDEWAYS O */ {0x1D12,'o'}, /* LATIN SMALL LETTER SIDEWAYS OPEN O */ {0x1D13,'o'}, /* LATIN SMALL LETTER SIDEWAYS O WITH STROKE */ {0x1D16,'o'}, /* LATIN SMALL LETTER TOP HALF O */ {0x1D17,'o'}, /* LATIN SMALL LETTER BOTTOM HALF O */ {0x1D18,'P'}, /* LATIN LETTER SMALL CAPITAL P */ {0x1D19,'R'}, /* LATIN LETTER SMALL CAPITAL REVERSED R */ {0x1D1A,'R'}, /* LATIN LETTER SMALL CAPITAL TURNED R */ {0x1D1B,'T'}, /* LATIN LETTER SMALL CAPITAL T */ {0x1D1C,'U'}, /* LATIN LETTER SMALL CAPITAL U */ {0x1D1D,'u'}, /* LATIN SMALL LETTER SIDEWAYS U */ {0x1D1E,'u'}, /* LATIN SMALL LETTER SIDEWAYS DIAERESIZED U */ {0x1D1F,'m'}, /* LATIN SMALL LETTER SIDEWAYS TURNED M */ {0x1D20,'V'}, /* LATIN LETTER SMALL CAPITAL V */ {0x1D21,'W'}, /* LATIN LETTER SMALL CAPITAL W */ {0x1D22,'Z'}, /* LATIN LETTER SMALL CAPITAL Z */ {0x1D25,'L'}, /* LATIN LETTER AIN */ {0x1D2C,'A'}, /* MODIFIER LETTER CAPITAL A */ {0x1D2E,'B'}, /* MODIFIER LETTER CAPITAL B */ {0x1D2F,'B'}, /* MODIFIER LETTER CAPITAL BARRED B */ {0x1D30,'D'}, /* MODIFIER LETTER CAPITAL D */ {0x1D31,'E'}, /* MODIFIER LETTER CAPITAL E */ {0x1D32,'E'}, /* MODIFIER LETTER CAPITAL REVERSED E */ {0x1D33,'G'}, /* MODIFIER LETTER CAPITAL G */ {0x1D34,'H'}, /* MODIFIER LETTER CAPITAL H */ {0x1D35,'I'}, /* MODIFIER LETTER CAPITAL I */ {0x1D36,'J'}, /* MODIFIER LETTER CAPITAL J */ {0x1D37,'K'}, /* MODIFIER LETTER CAPITAL K */ {0x1D38,'L'}, /* MODIFIER LETTER CAPITAL L */ {0x1D39,'M'}, /* MODIFIER LETTER CAPITAL M */ {0x1D3A,'N'}, /* MODIFIER LETTER CAPITAL N */ {0x1D3B,'N'}, /* MODIFIER LETTER CAPITAL REVERSED N */ {0x1D3C,'O'}, /* MODIFIER LETTER CAPITAL O */ {0x1D3E,'P'}, /* MODIFIER LETTER CAPITAL P */ {0x1D3F,'R'}, /* MODIFIER LETTER CAPITAL R */ {0x1D40,'T'}, /* MODIFIER LETTER CAPITAL T */ {0x1D41,'U'}, /* MODIFIER LETTER CAPITAL U */ {0x1D42,'W'}, /* MODIFIER LETTER CAPITAL W */ {0x1D43,'a'}, /* MODIFIER LETTER SMALL A */ {0x1D44,'a'}, /* MODIFIER LETTER SMALL TURNED A */ {0x1D47,'b'}, /* MODIFIER LETTER SMALL B */ {0x1D48,'d'}, /* MODIFIER LETTER SMALL D */ {0x1D49,'e'}, /* MODIFIER LETTER SMALL E */ {0x1D4A,'e'}, /* MODIFIER LETTER SMALL SCHWA */ {0x1D4B,'e'}, /* MODIFIER LETTER SMALL OPEN E */ {0x1D4C,'e'}, /* MODIFIER LETTER SMALL TURNED OPEN E */ {0x1D4D,'g'}, /* MODIFIER LETTER SMALL G */ {0x1D4E,'i'}, /* MODIFIER LETTER SMALL TURNED I */ {0x1D4F,'k'}, /* MODIFIER LETTER SMALL K */ {0x1D50,'m'}, /* MODIFIER LETTER SMALL M */ {0x1D51,'g'}, /* MODIFIER LETTER SMALL ENG */ {0x1D52,'o'}, /* MODIFIER LETTER SMALL O */ {0x1D53,'o'}, /* MODIFIER LETTER SMALL OPEN O */ {0x1D54,'o'}, /* MODIFIER LETTER SMALL TOP HALF O */ {0x1D55,'o'}, /* MODIFIER LETTER SMALL BOTTOM HALF O */ {0x1D56,'p'}, /* MODIFIER LETTER SMALL P */ {0x1D57,'t'}, /* MODIFIER LETTER SMALL T */ {0x1D58,'u'}, /* MODIFIER LETTER SMALL U */ {0x1D59,'u'}, /* MODIFIER LETTER SMALL SIDEWAYS U */ {0x1D5A,'m'}, /* MODIFIER LETTER SMALL TURNED M */ {0x1D5B,'v'}, /* MODIFIER LETTER SMALL V */ {0x1D62,'i'}, /* LATIN SUBSCRIPT SMALL LETTER I */ {0x1D63,'r'}, /* LATIN SUBSCRIPT SMALL LETTER R */ {0x1D64,'u'}, /* LATIN SUBSCRIPT SMALL LETTER U */ {0x1D65,'v'}, /* LATIN SUBSCRIPT SMALL LETTER V */ {0x1E00,'A'}, /* LATIN CAPITAL LETTER A WITH RING BELOW */ {0x1E01,'a'}, /* LATIN SMALL LETTER A WITH RING BELOW */ {0x1E02,'B'}, /* LATIN CAPITAL LETTER B WITH DOT ABOVE */ {0x1E03,'b'}, /* LATIN SMALL LETTER B WITH DOT ABOVE */ {0x1E04,'B'}, /* LATIN CAPITAL LETTER B WITH DOT BELOW */ {0x1E05,'b'}, /* LATIN SMALL LETTER B WITH DOT BELOW */ {0x1E06,'B'}, /* LATIN CAPITAL LETTER B WITH LINE BELOW */ {0x1E07,'b'}, /* LATIN SMALL LETTER B WITH LINE BELOW */ {0x1E08,'C'}, /* LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE */ {0x1E09,'c'}, /* LATIN SMALL LETTER C WITH CEDILLA AND ACUTE */ {0x1E0A,'D'}, /* LATIN CAPITAL LETTER D WITH DOT ABOVE */ {0x1E0B,'d'}, /* LATIN SMALL LETTER D WITH DOT ABOVE */ {0x1E0C,'D'}, /* LATIN CAPITAL LETTER D WITH DOT BELOW */ {0x1E0D,'d'}, /* LATIN SMALL LETTER D WITH DOT BELOW */ {0x1E0E,'D'}, /* LATIN CAPITAL LETTER D WITH LINE BELOW */ {0x1E0F,'d'}, /* LATIN SMALL LETTER D WITH LINE BELOW */ {0x1E10,'D'}, /* LATIN CAPITAL LETTER D WITH CEDILLA */ {0x1E11,'d'}, /* LATIN SMALL LETTER D WITH CEDILLA */ {0x1E12,'D'}, /* LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW */ {0x1E13,'d'}, /* LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW */ {0x1E14,'E'}, /* LATIN CAPITAL LETTER E WITH MACRON AND GRAVE */ {0x1E15,'e'}, /* LATIN SMALL LETTER E WITH MACRON AND GRAVE */ {0x1E16,'E'}, /* LATIN CAPITAL LETTER E WITH MACRON AND ACUTE */ {0x1E17,'e'}, /* LATIN SMALL LETTER E WITH MACRON AND ACUTE */ {0x1E18,'E'}, /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW */ {0x1E19,'e'}, /* LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW */ {0x1E1A,'E'}, /* LATIN CAPITAL LETTER E WITH TILDE BELOW */ {0x1E1B,'e'}, /* LATIN SMALL LETTER E WITH TILDE BELOW */ {0x1E1C,'E'}, /* LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE */ {0x1E1D,'e'}, /* LATIN SMALL LETTER E WITH CEDILLA AND BREVE */ {0x1E1E,'F'}, /* LATIN CAPITAL LETTER F WITH DOT ABOVE */ {0x1E1F,'f'}, /* LATIN SMALL LETTER F WITH DOT ABOVE */ {0x1E20,'G'}, /* LATIN CAPITAL LETTER G WITH MACRON */ {0x1E21,'g'}, /* LATIN SMALL LETTER G WITH MACRON */ {0x1E22,'H'}, /* LATIN CAPITAL LETTER H WITH DOT ABOVE */ {0x1E23,'h'}, /* LATIN SMALL LETTER H WITH DOT ABOVE */ {0x1E24,'H'}, /* LATIN CAPITAL LETTER H WITH DOT BELOW */ {0x1E25,'h'}, /* LATIN SMALL LETTER H WITH DOT BELOW */ {0x1E26,'H'}, /* LATIN CAPITAL LETTER H WITH DIAERESIS */ {0x1E27,'h'}, /* LATIN SMALL LETTER H WITH DIAERESIS */ {0x1E28,'H'}, /* LATIN CAPITAL LETTER H WITH CEDILLA */ {0x1E29,'h'}, /* LATIN SMALL LETTER H WITH CEDILLA */ {0x1E2A,'H'}, /* LATIN CAPITAL LETTER H WITH BREVE BELOW */ {0x1E2B,'h'}, /* LATIN SMALL LETTER H WITH BREVE BELOW */ {0x1E2C,'I'}, /* LATIN CAPITAL LETTER I WITH TILDE BELOW */ {0x1E2D,'i'}, /* LATIN SMALL LETTER I WITH TILDE BELOW */ {0x1E2E,'I'}, /* LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE */ {0x1E2F,'i'}, /* LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE */ {0x1E30,'K'}, /* LATIN CAPITAL LETTER K WITH ACUTE */ {0x1E31,'k'}, /* LATIN SMALL LETTER K WITH ACUTE */ {0x1E32,'K'}, /* LATIN CAPITAL LETTER K WITH DOT BELOW */ {0x1E33,'k'}, /* LATIN SMALL LETTER K WITH DOT BELOW */ {0x1E34,'K'}, /* LATIN CAPITAL LETTER K WITH LINE BELOW */ {0x1E35,'k'}, /* LATIN SMALL LETTER K WITH LINE BELOW */ {0x1E36,'L'}, /* LATIN CAPITAL LETTER L WITH DOT BELOW */ {0x1E37,'l'}, /* LATIN SMALL LETTER L WITH DOT BELOW */ {0x1E38,'L'}, /* LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON */ {0x1E39,'l'}, /* LATIN SMALL LETTER L WITH DOT BELOW AND MACRON */ {0x1E3A,'L'}, /* LATIN CAPITAL LETTER L WITH LINE BELOW */ {0x1E3B,'l'}, /* LATIN SMALL LETTER L WITH LINE BELOW */ {0x1E3C,'L'}, /* LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW */ {0x1E3D,'l'}, /* LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW */ {0x1E3E,'M'}, /* LATIN CAPITAL LETTER M WITH ACUTE */ {0x1E3F,'m'}, /* LATIN SMALL LETTER M WITH ACUTE */ {0x1E40,'M'}, /* LATIN CAPITAL LETTER M WITH DOT ABOVE */ {0x1E41,'m'}, /* LATIN SMALL LETTER M WITH DOT ABOVE */ {0x1E42,'M'}, /* LATIN CAPITAL LETTER M WITH DOT BELOW */ {0x1E43,'m'}, /* LATIN SMALL LETTER M WITH DOT BELOW */ {0x1E44,'N'}, /* LATIN CAPITAL LETTER N WITH DOT ABOVE */ {0x1E45,'n'}, /* LATIN SMALL LETTER N WITH DOT ABOVE */ {0x1E46,'N'}, /* LATIN CAPITAL LETTER N WITH DOT BELOW */ {0x1E47,'n'}, /* LATIN SMALL LETTER N WITH DOT BELOW */ {0x1E48,'N'}, /* LATIN CAPITAL LETTER N WITH LINE BELOW */ {0x1E49,'n'}, /* LATIN SMALL LETTER N WITH LINE BELOW */ {0x1E4A,'N'}, /* LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW */ {0x1E4B,'n'}, /* LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW */ {0x1E4C,'O'}, /* LATIN CAPITAL LETTER O WITH TILDE AND ACUTE */ {0x1E4D,'o'}, /* LATIN SMALL LETTER O WITH TILDE AND ACUTE */ {0x1E4E,'O'}, /* LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS */ {0x1E4F,'o'}, /* LATIN SMALL LETTER O WITH TILDE AND DIAERESIS */ {0x1E50,'O'}, /* LATIN CAPITAL LETTER O WITH MACRON AND GRAVE */ {0x1E51,'o'}, /* LATIN SMALL LETTER O WITH MACRON AND GRAVE */ {0x1E52,'O'}, /* LATIN CAPITAL LETTER O WITH MACRON AND ACUTE */ {0x1E53,'o'}, /* LATIN SMALL LETTER O WITH MACRON AND ACUTE */ {0x1E54,'P'}, /* LATIN CAPITAL LETTER P WITH ACUTE */ {0x1E55,'p'}, /* LATIN SMALL LETTER P WITH ACUTE */ {0x1E56,'P'}, /* LATIN CAPITAL LETTER P WITH DOT ABOVE */ {0x1E57,'p'}, /* LATIN SMALL LETTER P WITH DOT ABOVE */ {0x1E58,'R'}, /* LATIN CAPITAL LETTER R WITH DOT ABOVE */ {0x1E59,'r'}, /* LATIN SMALL LETTER R WITH DOT ABOVE */ {0x1E5A,'R'}, /* LATIN CAPITAL LETTER R WITH DOT BELOW */ {0x1E5B,'r'}, /* LATIN SMALL LETTER R WITH DOT BELOW */ {0x1E5C,'R'}, /* LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON */ {0x1E5D,'r'}, /* LATIN SMALL LETTER R WITH DOT BELOW AND MACRON */ {0x1E5E,'R'}, /* LATIN CAPITAL LETTER R WITH LINE BELOW */ {0x1E5F,'r'}, /* LATIN SMALL LETTER R WITH LINE BELOW */ {0x1E60,'S'}, /* LATIN CAPITAL LETTER S WITH DOT ABOVE */ {0x1E61,'s'}, /* LATIN SMALL LETTER S WITH DOT ABOVE */ {0x1E62,'S'}, /* LATIN CAPITAL LETTER S WITH DOT BELOW */ {0x1E63,'s'}, /* LATIN SMALL LETTER S WITH DOT BELOW */ {0x1E64,'S'}, /* LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE */ {0x1E65,'s'}, /* LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE */ {0x1E66,'S'}, /* LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE */ {0x1E67,'s'}, /* LATIN SMALL LETTER S WITH CARON AND DOT ABOVE */ {0x1E68,'S'}, /* LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE */ {0x1E69,'s'}, /* LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE */ {0x1E6A,'T'}, /* LATIN CAPITAL LETTER T WITH DOT ABOVE */ {0x1E6B,'t'}, /* LATIN SMALL LETTER T WITH DOT ABOVE */ {0x1E6C,'T'}, /* LATIN CAPITAL LETTER T WITH DOT BELOW */ {0x1E6D,'t'}, /* LATIN SMALL LETTER T WITH DOT BELOW */ {0x1E6E,'T'}, /* LATIN CAPITAL LETTER T WITH LINE BELOW */ {0x1E6F,'t'}, /* LATIN SMALL LETTER T WITH LINE BELOW */ {0x1E70,'T'}, /* LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW */ {0x1E71,'t'}, /* LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW */ {0x1E72,'U'}, /* LATIN CAPITAL LETTER U WITH DIAERESIS BELOW */ {0x1E73,'u'}, /* LATIN SMALL LETTER U WITH DIAERESIS BELOW */ {0x1E74,'U'}, /* LATIN CAPITAL LETTER U WITH TILDE BELOW */ {0x1E75,'u'}, /* LATIN SMALL LETTER U WITH TILDE BELOW */ {0x1E76,'U'}, /* LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW */ {0x1E77,'u'}, /* LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW */ {0x1E78,'U'}, /* LATIN CAPITAL LETTER U WITH TILDE AND ACUTE */ {0x1E79,'u'}, /* LATIN SMALL LETTER U WITH TILDE AND ACUTE */ {0x1E7A,'U'}, /* LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS */ {0x1E7B,'u'}, /* LATIN SMALL LETTER U WITH MACRON AND DIAERESIS */ {0x1E7C,'V'}, /* LATIN CAPITAL LETTER V WITH TILDE */ {0x1E7D,'v'}, /* LATIN SMALL LETTER V WITH TILDE */ {0x1E7E,'V'}, /* LATIN CAPITAL LETTER V WITH DOT BELOW */ {0x1E7F,'v'}, /* LATIN SMALL LETTER V WITH DOT BELOW */ {0x1E80,'W'}, /* LATIN CAPITAL LETTER W WITH GRAVE */ {0x1E81,'w'}, /* LATIN SMALL LETTER W WITH GRAVE */ {0x1E82,'W'}, /* LATIN CAPITAL LETTER W WITH ACUTE */ {0x1E83,'w'}, /* LATIN SMALL LETTER W WITH ACUTE */ {0x1E84,'W'}, /* LATIN CAPITAL LETTER W WITH DIAERESIS */ {0x1E85,'w'}, /* LATIN SMALL LETTER W WITH DIAERESIS */ {0x1E86,'W'}, /* LATIN CAPITAL LETTER W WITH DOT ABOVE */ {0x1E87,'w'}, /* LATIN SMALL LETTER W WITH DOT ABOVE */ {0x1E88,'W'}, /* LATIN CAPITAL LETTER W WITH DOT BELOW */ {0x1E89,'w'}, /* LATIN SMALL LETTER W WITH DOT BELOW */ {0x1E8A,'X'}, /* LATIN CAPITAL LETTER X WITH DOT ABOVE */ {0x1E8B,'x'}, /* LATIN SMALL LETTER X WITH DOT ABOVE */ {0x1E8C,'X'}, /* LATIN CAPITAL LETTER X WITH DIAERESIS */ {0x1E8D,'x'}, /* LATIN SMALL LETTER X WITH DIAERESIS */ {0x1E8E,'Y'}, /* LATIN CAPITAL LETTER Y WITH DOT ABOVE */ {0x1E8F,'y'}, /* LATIN SMALL LETTER Y WITH DOT ABOVE */ {0x1E90,'Z'}, /* LATIN CAPITAL LETTER Z WITH CIRCUMFLEX */ {0x1E91,'z'}, /* LATIN SMALL LETTER Z WITH CIRCUMFLEX */ {0x1E92,'Z'}, /* LATIN CAPITAL LETTER Z WITH DOT BELOW */ {0x1E93,'z'}, /* LATIN SMALL LETTER Z WITH DOT BELOW */ {0x1E94,'Z'}, /* LATIN CAPITAL LETTER Z WITH LINE BELOW */ {0x1E95,'z'}, /* LATIN SMALL LETTER Z WITH LINE BELOW */ {0x1E96,'h'}, /* LATIN SMALL LETTER H WITH LINE BELOW */ {0x1E97,'t'}, /* LATIN SMALL LETTER T WITH DIAERESIS */ {0x1E98,'w'}, /* LATIN SMALL LETTER W WITH RING ABOVE */ {0x1E99,'y'}, /* LATIN SMALL LETTER Y WITH RING ABOVE */ {0x1E9A,'a'}, /* LATIN SMALL LETTER A WITH RIGHT HALF RING */ {0x1E9B,'s'}, /* LATIN SMALL LETTER LONG S WITH DOT ABOVE */ {0x1EA0,'A'}, /* LATIN CAPITAL LETTER A WITH DOT BELOW */ {0x1EA1,'a'}, /* LATIN SMALL LETTER A WITH DOT BELOW */ {0x1EA2,'A'}, /* LATIN CAPITAL LETTER A WITH HOOK ABOVE */ {0x1EA3,'a'}, /* LATIN SMALL LETTER A WITH HOOK ABOVE */ {0x1EA4,'A'}, /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE */ {0x1EA5,'a'}, /* LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE */ {0x1EA6,'A'}, /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE */ {0x1EA7,'a'}, /* LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE */ {0x1EA8,'A'}, /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE */ {0x1EA9,'a'}, /* LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE */ {0x1EAA,'A'}, /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE */ {0x1EAB,'a'}, /* LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE */ {0x1EAC,'A'}, /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW */ {0x1EAD,'a'}, /* LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW */ {0x1EAE,'A'}, /* LATIN CAPITAL LETTER A WITH BREVE AND ACUTE */ {0x1EAF,'a'}, /* LATIN SMALL LETTER A WITH BREVE AND ACUTE */ {0x1EB0,'A'}, /* LATIN CAPITAL LETTER A WITH BREVE AND GRAVE */ {0x1EB1,'a'}, /* LATIN SMALL LETTER A WITH BREVE AND GRAVE */ {0x1EB2,'A'}, /* LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE */ {0x1EB3,'a'}, /* LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE */ {0x1EB4,'A'}, /* LATIN CAPITAL LETTER A WITH BREVE AND TILDE */ {0x1EB5,'a'}, /* LATIN SMALL LETTER A WITH BREVE AND TILDE */ {0x1EB6,'A'}, /* LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW */ {0x1EB7,'a'}, /* LATIN SMALL LETTER A WITH BREVE AND DOT BELOW */ {0x1EB8,'E'}, /* LATIN CAPITAL LETTER E WITH DOT BELOW */ {0x1EB9,'e'}, /* LATIN SMALL LETTER E WITH DOT BELOW */ {0x1EBA,'E'}, /* LATIN CAPITAL LETTER E WITH HOOK ABOVE */ {0x1EBB,'e'}, /* LATIN SMALL LETTER E WITH HOOK ABOVE */ {0x1EBC,'E'}, /* LATIN CAPITAL LETTER E WITH TILDE */ {0x1EBD,'e'}, /* LATIN SMALL LETTER E WITH TILDE */ {0x1EBE,'E'}, /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE */ {0x1EBF,'e'}, /* LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE */ {0x1EC0,'E'}, /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE */ {0x1EC1,'e'}, /* LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE */ {0x1EC2,'E'}, /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE */ {0x1EC3,'e'}, /* LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE */ {0x1EC4,'E'}, /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE */ {0x1EC5,'e'}, /* LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE */ {0x1EC6,'E'}, /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW */ {0x1EC7,'e'}, /* LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW */ {0x1EC8,'I'}, /* LATIN CAPITAL LETTER I WITH HOOK ABOVE */ {0x1EC9,'i'}, /* LATIN SMALL LETTER I WITH HOOK ABOVE */ {0x1ECA,'I'}, /* LATIN CAPITAL LETTER I WITH DOT BELOW */ {0x1ECB,'i'}, /* LATIN SMALL LETTER I WITH DOT BELOW */ {0x1ECC,'O'}, /* LATIN CAPITAL LETTER O WITH DOT BELOW */ {0x1ECD,'o'}, /* LATIN SMALL LETTER O WITH DOT BELOW */ {0x1ECE,'O'}, /* LATIN CAPITAL LETTER O WITH HOOK ABOVE */ {0x1ECF,'o'}, /* LATIN SMALL LETTER O WITH HOOK ABOVE */ {0x1ED0,'O'}, /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE */ {0x1ED1,'o'}, /* LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE */ {0x1ED2,'O'}, /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE */ {0x1ED3,'o'}, /* LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE */ {0x1ED4,'O'}, /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE */ {0x1ED5,'o'}, /* LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE */ {0x1ED6,'O'}, /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE */ {0x1ED7,'o'}, /* LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE */ {0x1ED8,'O'}, /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW */ {0x1ED9,'o'}, /* LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW */ {0x1EDA,'O'}, /* LATIN CAPITAL LETTER O WITH HORN AND ACUTE */ {0x1EDB,'o'}, /* LATIN SMALL LETTER O WITH HORN AND ACUTE */ {0x1EDC,'O'}, /* LATIN CAPITAL LETTER O WITH HORN AND GRAVE */ {0x1EDD,'o'}, /* LATIN SMALL LETTER O WITH HORN AND GRAVE */ {0x1EDE,'O'}, /* LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE */ {0x1EDF,'o'}, /* LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE */ {0x1EE0,'O'}, /* LATIN CAPITAL LETTER O WITH HORN AND TILDE */ {0x1EE1,'o'}, /* LATIN SMALL LETTER O WITH HORN AND TILDE */ {0x1EE2,'O'}, /* LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW */ {0x1EE3,'o'}, /* LATIN SMALL LETTER O WITH HORN AND DOT BELOW */ {0x1EE4,'U'}, /* LATIN CAPITAL LETTER U WITH DOT BELOW */ {0x1EE5,'u'}, /* LATIN SMALL LETTER U WITH DOT BELOW */ {0x1EE6,'U'}, /* LATIN CAPITAL LETTER U WITH HOOK ABOVE */ {0x1EE7,'u'}, /* LATIN SMALL LETTER U WITH HOOK ABOVE */ {0x1EE8,'U'}, /* LATIN CAPITAL LETTER U WITH HORN AND ACUTE */ {0x1EE9,'u'}, /* LATIN SMALL LETTER U WITH HORN AND ACUTE */ {0x1EEA,'U'}, /* LATIN CAPITAL LETTER U WITH HORN AND GRAVE */ {0x1EEB,'u'}, /* LATIN SMALL LETTER U WITH HORN AND GRAVE */ {0x1EEC,'U'}, /* LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE */ {0x1EED,'u'}, /* LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE */ {0x1EEE,'U'}, /* LATIN CAPITAL LETTER U WITH HORN AND TILDE */ {0x1EEF,'u'}, /* LATIN SMALL LETTER U WITH HORN AND TILDE */ {0x1EF0,'U'}, /* LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW */ {0x1EF1,'u'}, /* LATIN SMALL LETTER U WITH HORN AND DOT BELOW */ {0x1EF2,'Y'}, /* LATIN CAPITAL LETTER Y WITH GRAVE */ {0x1EF3,'y'}, /* LATIN SMALL LETTER Y WITH GRAVE */ {0x1EF4,'Y'}, /* LATIN CAPITAL LETTER Y WITH DOT BELOW */ {0x1EF5,'y'}, /* LATIN SMALL LETTER Y WITH DOT BELOW */ {0x1EF6,'Y'}, /* LATIN CAPITAL LETTER Y WITH HOOK ABOVE */ {0x1EF7,'y'}, /* LATIN SMALL LETTER Y WITH HOOK ABOVE */ {0x1EF8,'Y'}, /* LATIN CAPITAL LETTER Y WITH TILDE */ {0x1EF9,'y'}, /* LATIN SMALL LETTER Y WITH TILDE */ {0x2014,0x2D}, /* Em-dash */ {0x2018,0x27}, /* left single quote */ {0x2019,0x27}, /* right single quote */ {0x201C,0x22}, /* left double quote */ {0x201D,0x22}, /* right double quote */ {0x2071,'i'}, /* SUPERSCRIPT LATIN SMALL LETTER I */ {0x207F,'n'}, /* SUPERSCRIPT LATIN SMALL LETTER N */ {0x212A,'K'}, /* KELVIN SIGN */ {0x212B,'A'}, /* ANGSTROM SIGN */ {0x212C,'B'}, /* SCRIPT CAPITAL B */ {0x212D,'C'}, /* BLACK-LETTER CAPITAL C */ {0x212F,'e'}, /* SCRIPT SMALL E */ {0x2130,'E'}, /* SCRIPT CAPITAL E */ {0x2131,'F'}, /* SCRIPT CAPITAL F */ {0x2132,'F'}, /* TURNED CAPITAL F */ {0x2133,'M'}, /* SCRIPT CAPITAL M */ {0x2134,'0'}, /* SCRIPT SMALL O */ {0x213A,'0'}, /* ROTATED CAPITAL Q */ {0x2141,'G'}, /* TURNED SANS-SERIF CAPITAL G */ {0x2142,'L'}, /* TURNED SANS-SERIF CAPITAL L */ {0x2143,'L'}, /* REVERSED SANS-SERIF CAPITAL L */ {0x2144,'Y'}, /* TURNED SANS-SERIF CAPITAL Y */ {0x2145,'D'}, /* DOUBLE-STRUCK ITALIC CAPITAL D */ {0x2146,'d'}, /* DOUBLE-STRUCK ITALIC SMALL D */ {0x2147,'e'}, /* DOUBLE-STRUCK ITALIC SMALL E */ {0x2148,'i'}, /* DOUBLE-STRUCK ITALIC SMALL I */ {0x2149,'j'}, /* DOUBLE-STRUCK ITALIC SMALL J */ {0xFF21,'A'}, /* FULLWIDTH LATIN CAPITAL LETTER B */ {0xFF22,'B'}, /* FULLWIDTH LATIN CAPITAL LETTER B */ {0xFF23,'C'}, /* FULLWIDTH LATIN CAPITAL LETTER C */ {0xFF24,'D'}, /* FULLWIDTH LATIN CAPITAL LETTER D */ {0xFF25,'E'}, /* FULLWIDTH LATIN CAPITAL LETTER E */ {0xFF26,'F'}, /* FULLWIDTH LATIN CAPITAL LETTER F */ {0xFF27,'G'}, /* FULLWIDTH LATIN CAPITAL LETTER G */ {0xFF28,'H'}, /* FULLWIDTH LATIN CAPITAL LETTER H */ {0xFF29,'I'}, /* FULLWIDTH LATIN CAPITAL LETTER I */ {0xFF2A,'J'}, /* FULLWIDTH LATIN CAPITAL LETTER J */ {0xFF2B,'K'}, /* FULLWIDTH LATIN CAPITAL LETTER K */ {0xFF2C,'L'}, /* FULLWIDTH LATIN CAPITAL LETTER L */ {0xFF2D,'M'}, /* FULLWIDTH LATIN CAPITAL LETTER M */ {0xFF2E,'N'}, /* FULLWIDTH LATIN CAPITAL LETTER N */ {0xFF2F,'O'}, /* FULLWIDTH LATIN CAPITAL LETTER O */ {0xFF30,'P'}, /* FULLWIDTH LATIN CAPITAL LETTER P */ {0xFF31,'Q'}, /* FULLWIDTH LATIN CAPITAL LETTER Q */ {0xFF32,'R'}, /* FULLWIDTH LATIN CAPITAL LETTER R */ {0xFF33,'S'}, /* FULLWIDTH LATIN CAPITAL LETTER S */ {0xFF34,'T'}, /* FULLWIDTH LATIN CAPITAL LETTER T */ {0xFF35,'U'}, /* FULLWIDTH LATIN CAPITAL LETTER U */ {0xFF36,'V'}, /* FULLWIDTH LATIN CAPITAL LETTER V */ {0xFF37,'W'}, /* FULLWIDTH LATIN CAPITAL LETTER W */ {0xFF38,'X'}, /* FULLWIDTH LATIN CAPITAL LETTER X */ {0xFF39,'Y'}, /* FULLWIDTH LATIN CAPITAL LETTER Y */ {0xFF3A,'Z'}, /* FULLWIDTH LATIN CAPITAL LETTER Z */ {0xFF41,'a'}, /* FULLWIDTH LATIN SMALL LETTER A */ {0xFF42,'b'}, /* FULLWIDTH LATIN SMALL LETTER B */ {0xFF43,'c'}, /* FULLWIDTH LATIN SMALL LETTER C */ {0xFF44,'d'}, /* FULLWIDTH LATIN SMALL LETTER D */ {0xFF45,'e'}, /* FULLWIDTH LATIN SMALL LETTER E */ {0xFF46,'f'}, /* FULLWIDTH LATIN SMALL LETTER F */ {0xFF47,'g'}, /* FULLWIDTH LATIN SMALL LETTER G */ {0xFF48,'h'}, /* FULLWIDTH LATIN SMALL LETTER H */ {0xFF49,'i'}, /* FULLWIDTH LATIN SMALL LETTER I */ {0xFF4A,'j'}, /* FULLWIDTH LATIN SMALL LETTER J */ {0xFF4B,'k'}, /* FULLWIDTH LATIN SMALL LETTER K */ {0xFF4C,'l'}, /* FULLWIDTH LATIN SMALL LETTER L */ {0xFF4D,'m'}, /* FULLWIDTH LATIN SMALL LETTER M */ {0xFF4E,'n'}, /* FULLWIDTH LATIN SMALL LETTER N */ {0xFF4F,'o'}, /* FULLWIDTH LATIN SMALL LETTER O */ {0xFF50,'p'}, /* FULLWIDTH LATIN SMALL LETTER P */ {0xFF51,'q'}, /* FULLWIDTH LATIN SMALL LETTER Q */ {0xFF52,'r'}, /* FULLWIDTH LATIN SMALL LETTER R */ {0xFF53,'s'}, /* FULLWIDTH LATIN SMALL LETTER S */ {0xFF54,'t'}, /* FULLWIDTH LATIN SMALL LETTER T */ {0xFF55,'u'}, /* FULLWIDTH LATIN SMALL LETTER U */ {0xFF56,'v'}, /* FULLWIDTH LATIN SMALL LETTER V */ {0xFF57,'w'}, /* FULLWIDTH LATIN SMALL LETTER W */ {0xFF58,'x'}, /* FULLWIDTH LATIN SMALL LETTER X */ {0xFF59,'y'}, /* FULLWIDTH LATIN SMALL LETTER Y */ {0xFF5A,'z'} /* FULLWIDTH LATIN SMALL LETTER Z */ }; #define GSM0338_lsize (sizeof(GSM0338_lossy)/sizeof(_ucc_)) gnustep-base-1.29.0/Source/Additions/unicode/latin2.h000066400000000000000000000077121435650067400223670ustar00rootroot00000000000000/* Created by Stefan Urbanek on 2000 Apr 6 */ /* Copyright (C) 2005 Free Software Foundation Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. */ // ISO_8859-2 to Unicode maping static const unsigned int Latin2_conv_base = 0x80; static unichar Latin2_char_to_uni_table[] = { 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0, 0x0104, 0x02D8, 0x0141, 0x00A4, 0x013D, 0x015A, 0x00A7, 0x00A8, 0x0160, 0x015E, 0x0164, 0x0179, 0x00AD, 0x017D, 0x017B, 0x00B0, 0x0105, 0x02DB, 0x0142, 0x00B4, 0x013E, 0x015B, 0x02C7, 0x00B8, 0x0161, 0x015F, 0x0165, 0x017A, 0x02DD, 0x017E, 0x017C, 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7, 0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E, 0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7, 0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF, 0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7, 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F, 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7, 0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9, }; // Unicode to ISO_8859-2 maping static const unsigned int Latin2_uni_to_char_table_size = 128; static _ucc_ Latin2_uni_to_char_table[]= { {0x0080,0x80}, {0x0081,0x81}, {0x0082,0x82}, {0x0083,0x83}, {0x0084,0x84}, {0x0085,0x85}, {0x0086,0x86}, {0x0087,0x87}, {0x0088,0x88}, {0x0089,0x89}, {0x008A,0x8A}, {0x008B,0x8B}, {0x008C,0x8C}, {0x008D,0x8D}, {0x008E,0x8E}, {0x008F,0x8F}, {0x0090,0x90}, {0x0091,0x91}, {0x0092,0x92}, {0x0093,0x93}, {0x0094,0x94}, {0x0095,0x95}, {0x0096,0x96}, {0x0097,0x97}, {0x0098,0x98}, {0x0099,0x99}, {0x009A,0x9A}, {0x009B,0x9B}, {0x009C,0x9C}, {0x009D,0x9D}, {0x009E,0x9E}, {0x009F,0x9F}, {0x00A0,0xA0}, {0x00A4,0xA4}, {0x00A7,0xA7}, {0x00A8,0xA8}, {0x00AD,0xAD}, {0x00B0,0xB0}, {0x00B4,0xB4}, {0x00B8,0xB8}, {0x00C1,0xC1}, {0x00C2,0xC2}, {0x00C4,0xC4}, {0x00C7,0xC7}, {0x00C9,0xC9}, {0x00CB,0xCB}, {0x00CD,0xCD}, {0x00CE,0xCE}, {0x00D3,0xD3}, {0x00D4,0xD4}, {0x00D6,0xD6}, {0x00D7,0xD7}, {0x00DA,0xDA}, {0x00DC,0xDC}, {0x00DD,0xDD}, {0x00DF,0xDF}, {0x00E1,0xE1}, {0x00E2,0xE2}, {0x00E4,0xE4}, {0x00E7,0xE7}, {0x00E9,0xE9}, {0x00EB,0xEB}, {0x00ED,0xED}, {0x00EE,0xEE}, {0x00F3,0xF3}, {0x00F4,0xF4}, {0x00F6,0xF6}, {0x00F7,0xF7}, {0x00FA,0xFA}, {0x00FC,0xFC}, {0x00FD,0xFD}, {0x0102,0xC3}, {0x0103,0xE3}, {0x0104,0xA1}, {0x0105,0xB1}, {0x0106,0xC6}, {0x0107,0xE6}, {0x010C,0xC8}, {0x010D,0xE8}, {0x010E,0xCF}, {0x010F,0xEF}, {0x0110,0xD0}, {0x0111,0xF0}, {0x0118,0xCA}, {0x0119,0xEA}, {0x011A,0xCC}, {0x011B,0xEC}, {0x0139,0xC5}, {0x013A,0xE5}, {0x013D,0xA5}, {0x013E,0xB5}, {0x0141,0xA3}, {0x0142,0xB3}, {0x0143,0xD1}, {0x0144,0xF1}, {0x0147,0xD2}, {0x0148,0xF2}, {0x0150,0xD5}, {0x0151,0xF5}, {0x0154,0xC0}, {0x0155,0xE0}, {0x0158,0xD8}, {0x0159,0xF8}, {0x015A,0xA6}, {0x015B,0xB6}, {0x015E,0xAA}, {0x015F,0xBA}, {0x0160,0xA9}, {0x0161,0xB9}, {0x0162,0xDE}, {0x0163,0xFE}, {0x0164,0xAB}, {0x0165,0xBB}, {0x016E,0xD9}, {0x016F,0xF9}, {0x0170,0xDB}, {0x0171,0xFB}, {0x0179,0xAC}, {0x017A,0xBC}, {0x017B,0xAF}, {0x017C,0xBF}, {0x017D,0xAE}, {0x017E,0xBE}, {0x02C7,0xB7}, {0x02D8,0xA2}, {0x02D9,0xFF}, {0x02DB,0xB2}, {0x02DD,0xBD}, }; gnustep-base-1.29.0/Source/Additions/unicode/latin9.h000066400000000000000000000101121435650067400223620ustar00rootroot00000000000000/* Created by Stefan Urbanek on 2000 Apr 6 */ /* Copyright (C) 2005 Free Software Foundation Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. */ // ISO_8859-15 to Unicode maping static const unsigned int Latin9_conv_base = 0x80; static unichar Latin9_char_to_uni_table[] = { 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x20AC, 0x00A5, 0x0160, 0x00A7, 0x0161, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x017D, 0x00B5, 0x00B6, 0x00B7, 0x017E, 0x00B9, 0x00BA, 0x00BB, 0x0152, 0x0153, 0x0178, 0x00BF, 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF }; // Unicode to ISO_8859-15 maping static const unsigned int Latin9_uni_to_char_table_size = 128; static _ucc_ Latin9_uni_to_char_table[]= { {0x0080, 0x80}, {0x0081, 0x81}, {0x0082, 0x82}, {0x0083, 0x83}, {0x0084, 0x84}, {0x0085, 0x85}, {0x0086, 0x86}, {0x0087, 0x87}, {0x0088, 0x88}, {0x0089, 0x89}, {0x008A, 0x8A}, {0x008B, 0x8B}, {0x008C, 0x8C}, {0x008D, 0x8D}, {0x008E, 0x8E}, {0x008F, 0x8F}, {0x0090, 0x90}, {0x0091, 0x91}, {0x0092, 0x92}, {0x0093, 0x93}, {0x0094, 0x94}, {0x0095, 0x95}, {0x0096, 0x96}, {0x0097, 0x97}, {0x0098, 0x98}, {0x0099, 0x99}, {0x009A, 0x9A}, {0x009B, 0x9B}, {0x009C, 0x9C}, {0x009D, 0x9D}, {0x009E, 0x9E}, {0x009F, 0x9F}, {0x00A0, 0xA0}, {0x00A1, 0xA1}, {0x00A2, 0xA2}, {0x00A3, 0xA3}, {0x00A5, 0xA5}, {0x00A7, 0xA7}, {0x00A9, 0xA9}, {0x00AA, 0xAA}, {0x00AB, 0xAB}, {0x00AC, 0xAC}, {0x00AD, 0xAD}, {0x00AE, 0xAE}, {0x00AF, 0xAF}, {0x00B0, 0xB0}, {0x00B1, 0xB1}, {0x00B2, 0xB2}, {0x00B3, 0xB3}, {0x00B5, 0xB5}, {0x00B6, 0xB6}, {0x00B7, 0xB7}, {0x00B9, 0xB9}, {0x00BA, 0xBA}, {0x00BB, 0xBB}, {0x00BF, 0xBF}, {0x00C0, 0xC0}, {0x00C1, 0xC1}, {0x00C2, 0xC2}, {0x00C3, 0xC3}, {0x00C4, 0xC4}, {0x00C5, 0xC5}, {0x00C6, 0xC6}, {0x00C7, 0xC7}, {0x00C8, 0xC8}, {0x00C9, 0xC9}, {0x00CA, 0xCA}, {0x00CB, 0xCB}, {0x00CC, 0xCC}, {0x00CD, 0xCD}, {0x00CE, 0xCE}, {0x00CF, 0xCF}, {0x00D0, 0xD0}, {0x00D1, 0xD1}, {0x00D2, 0xD2}, {0x00D3, 0xD3}, {0x00D4, 0xD4}, {0x00D5, 0xD5}, {0x00D6, 0xD6}, {0x00D7, 0xD7}, {0x00D8, 0xD8}, {0x00D9, 0xD9}, {0x00DA, 0xDA}, {0x00DB, 0xDB}, {0x00DC, 0xDC}, {0x00DD, 0xDD}, {0x00DE, 0xDE}, {0x00DF, 0xDF}, {0x00E0, 0xE0}, {0x00E1, 0xE1}, {0x00E2, 0xE2}, {0x00E3, 0xE3}, {0x00E4, 0xE4}, {0x00E5, 0xE5}, {0x00E6, 0xE6}, {0x00E7, 0xE7}, {0x00E8, 0xE8}, {0x00E9, 0xE9}, {0x00EA, 0xEA}, {0x00EB, 0xEB}, {0x00EC, 0xEC}, {0x00ED, 0xED}, {0x00EE, 0xEE}, {0x00EF, 0xEF}, {0x00F0, 0xF0}, {0x00F1, 0xF1}, {0x00F2, 0xF2}, {0x00F3, 0xF3}, {0x00F4, 0xF4}, {0x00F5, 0xF5}, {0x00F6, 0xF6}, {0x00F7, 0xF7}, {0x00F8, 0xF8}, {0x00F9, 0xF9}, {0x00FA, 0xFA}, {0x00FB, 0xFB}, {0x00FC, 0xFC}, {0x00FD, 0xFD}, {0x00FE, 0xFE}, {0x00FF, 0xFF}, {0x0152, 0xBC}, {0x0153, 0xBD}, {0x0160, 0xA6}, {0x0161, 0xA8}, {0x0178, 0xBE}, {0x017D, 0xB4}, {0x017E, 0xB8}, {0x20AC, 0xA4} }; gnustep-base-1.29.0/Source/Additions/unicode/nextstep.h000066400000000000000000000073421435650067400230470ustar00rootroot00000000000000// Next to Unicode maping /* Copyright (C) 2005 Free Software Foundation Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. */ static const unsigned int Next_conv_base = 0x80; static unichar Next_char_to_uni_table[] = { 0x00A0, 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00B5, 0x00D7, 0x00F7, 0x00A9, 0x00A1, 0x00A2, 0x00A3, 0x2044, 0x00A5, 0x0192, 0x00A7, 0x00A4, 0xFBA9, 0x201C, 0x00AB, 0xFBAC, 0xFBAD, 0xFB01, 0xFB02, 0x00AE, 0x2013, 0x2020, 0x2021, 0x00B7, 0x00A6, 0x00B6, 0x2022, 0xFBB8, 0xFBB9, 0x201D, 0x00BB, 0x2026, 0x2030, 0x00AC, 0x00BF, 0x00B9, 0x02CB, 0x00B4, 0x02C6, 0x02DC, 0x00AF, 0x02D8, 0x02D9, 0x00A8, 0x00B2, 0x02DA, 0x00B8, 0x00B3, 0x02DD, 0x02DB, 0x02C7, 0x2014, 0x00B1, 0x00BC, 0x00BD, 0x00BE, 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00C6, 0x00ED, 0x00AA, 0x00EE, 0x00EF, 0x00F0, 0x00F1, 0x0141, 0x00D8, 0x0152, 0x00BA, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00E6, 0x00F9, 0x00FA, 0x00FB, 0x0131, 0x00FC, 0x00FD, 0x0142, 0x00F8, 0x0153, 0x00DF, 0x00FE, 0x00FF, }; // Unicode to NextStep maping static const unsigned int Next_uni_to_char_table_size = 128; static _ucc_ Next_uni_to_char_table[]= { {0x00A0,0x80}, {0x00A1,0xA1}, {0x00A2,0xA2}, {0x00A3,0xA3}, {0x00A4,0xA8}, {0x00A5,0xA5}, {0x00A6,0xB5}, {0x00A7,0xA7}, {0x00A8,0xC8}, {0x00A9,0xA0}, {0x00AA,0xE3}, {0x00AB,0xAB}, {0x00AC,0xBE}, {0x00AE,0xB0}, {0x00AF,0xC5}, {0x00B1,0xD1}, {0x00B2,0xC9}, {0x00B3,0xCC}, {0x00B4,0xC2}, {0x00B5,0x9D}, {0x00B6,0xB6}, {0x00B7,0xB4}, {0x00B8,0xCB}, {0x00B9,0xC0}, {0x00BA,0xEB}, {0x00BB,0xBB}, {0x00BC,0xD2}, {0x00BD,0xD3}, {0x00BE,0xD4}, {0x00BF,0xBF}, {0x00C0,0x81}, {0x00C1,0x82}, {0x00C2,0x83}, {0x00C3,0x84}, {0x00C4,0x85}, {0x00C5,0x86}, {0x00C6,0xE1}, {0x00C7,0x87}, {0x00C8,0x88}, {0x00C9,0x89}, {0x00CA,0x8A}, {0x00CB,0x8B}, {0x00CC,0x8C}, {0x00CD,0x8D}, {0x00CE,0x8E}, {0x00CF,0x8F}, {0x00D0,0x90}, {0x00D1,0x91}, {0x00D2,0x92}, {0x00D3,0x93}, {0x00D4,0x94}, {0x00D5,0x95}, {0x00D6,0x96}, {0x00D7,0x9E}, {0x00D8,0xE9}, {0x00D9,0x97}, {0x00DA,0x98}, {0x00DB,0x99}, {0x00DC,0x9A}, {0x00DD,0x9B}, {0x00DE,0x9C}, {0x00DF,0xFB}, {0x00E0,0xD5}, {0x00E1,0xD6}, {0x00E2,0xD7}, {0x00E3,0xD8}, {0x00E4,0xD9}, {0x00E5,0xDA}, {0x00E6,0xF1}, {0x00E7,0xDB}, {0x00E8,0xDC}, {0x00E9,0xDD}, {0x00EA,0xDE}, {0x00EB,0xDF}, {0x00EC,0xE0}, {0x00ED,0xE2}, {0x00EE,0xE4}, {0x00EF,0xE5}, {0x00F0,0xE6}, {0x00F1,0xE7}, {0x00F2,0xEC}, {0x00F3,0xED}, {0x00F4,0xEE}, {0x00F5,0xEF}, {0x00F6,0xF0}, {0x00F7,0x9F}, {0x00F8,0xF9}, {0x00F9,0xF2}, {0x00FA,0xF3}, {0x00FB,0xF4}, {0x00FC,0xF6}, {0x00FD,0xF7}, {0x00FE,0xFC}, {0x00FF,0xFD}, {0x0131,0xF5}, {0x0141,0xE8}, {0x0142,0xF8}, {0x0152,0xEA}, {0x0153,0xFA}, {0x0192,0xA6}, {0x02C6,0xC3}, {0x02C7,0xCF}, {0x02CB,0xC1}, {0x02D8,0xC6}, {0x02D9,0xC7}, {0x02DA,0xCA}, {0x02DB,0xCE}, {0x02DC,0xC4}, {0x02DD,0xCD}, {0x2013,0xB1}, {0x2014,0xD0}, {0x201C,0xAA}, {0x201D,0xBA}, {0x2020,0xB2}, {0x2021,0xB3}, {0x2022,0xB7}, {0x2026,0xBC}, {0x2030,0xBD}, {0x2044,0xA4}, {0xFB01,0xAE}, {0xFB02,0xAF}, }; gnustep-base-1.29.0/Source/Additions/unicode/thai.h000066400000000000000000000054751435650067400221270ustar00rootroot00000000000000/* ISO_8859-11 to Unicode maping */ /* Copyright (C) 2005 Free Software Foundation Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. */ static const unsigned int Thai_conv_base = 0xA0; static unichar Thai_char_to_uni_table[] = { 0x00A0, 0x0E01, 0x0E02, 0x0E03, 0x0E04, 0x0E05, 0x0E06, 0x0E07, 0x0E08, 0x0E09, 0x0E0A, 0x0E0B, 0x0E0C, 0x0E0D, 0x0E0E, 0x0E0F, 0x0E10, 0x0E11, 0x0E12, 0x0E13, 0x0E14, 0x0E15, 0x0E16, 0x0E17, 0x0E18, 0x0E19, 0x0E1A, 0x0E1B, 0x0E1C, 0x0E1D, 0x0E1E, 0x0E1F, 0x0E20, 0x0E21, 0x0E22, 0x0E23, 0x0E24, 0x0E25, 0x0E26, 0x0E27, 0x0E28, 0x0E29, 0x0E2A, 0x0E2B, 0x0E2C, 0x0E2D, 0x0E2E, 0x0E2F, 0x0E30, 0x0E31, 0x0E32, 0x0E33, 0x0E34, 0x0E35, 0x0E36, 0x0E37, 0x0E38, 0x0E39, 0x0E3A, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0x0E3F, 0x0E40, 0x0E41, 0x0E42, 0x0E43, 0x0E44, 0x0E45, 0x0E46, 0x0E47, 0x0E48, 0x0E49, 0x0E4A, 0x0E4B, 0x0E4C, 0x0E4D, 0x0E4E, 0x0E4F, 0x2116, 0x0E51, 0x0E52, 0x0E53, 0x0E54, 0x0E55, 0x0E56, 0x0E57, 0x0E58, 0x0E59, 0x0E5A, 0x0E5B, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, }; /* Unicode to ISO_8859-11 maping */ static const unsigned int Thai_uni_to_char_table_size = 88; static _ucc_ Thai_uni_to_char_table[]= { {0x00A0,0xA0}, {0x0E01,0xA1}, {0x0E02,0xA2}, {0x0E03,0xA3}, {0x0E04,0xA4}, {0x0E05,0xA5}, {0x0E06,0xA6}, {0x0E07,0xA7}, {0x0E08,0xA8}, {0x0E09,0xA9}, {0x0E0A,0xAA}, {0x0E0B,0xAB}, {0x0E0C,0xAC}, {0x0E0D,0xAD}, {0x0E0E,0xAE}, {0x0E0F,0xAF}, {0x0E10,0xB0}, {0x0E11,0xB1}, {0x0E12,0xB2}, {0x0E13,0xB3}, {0x0E14,0xB4}, {0x0E15,0xB5}, {0x0E16,0xB6}, {0x0E17,0xB7}, {0x0E18,0xB8}, {0x0E19,0xB9}, {0x0E1A,0xBA}, {0x0E1B,0xBB}, {0x0E1C,0xBC}, {0x0E1D,0xBD}, {0x0E1E,0xBE}, {0x0E1F,0xBF}, {0x0E20,0xC0}, {0x0E21,0xC1}, {0x0E22,0xC2}, {0x0E23,0xC3}, {0x0E24,0xC4}, {0x0E25,0xC5}, {0x0E26,0xC6}, {0x0E27,0xC7}, {0x0E28,0xC8}, {0x0E29,0xC9}, {0x0E2A,0xCA}, {0x0E2B,0xCB}, {0x0E2C,0xCC}, {0x0E2D,0xCD}, {0x0E2E,0xCE}, {0x0E2F,0xCF}, {0x0E30,0xD0}, {0x0E31,0xD1}, {0x0E32,0xD2}, {0x0E33,0xD3}, {0x0E34,0xD4}, {0x0E35,0xD5}, {0x0E36,0xD6}, {0x0E37,0xD7}, {0x0E38,0xD8}, {0x0E39,0xD9}, {0x0E3A,0xDA}, {0x0E3F,0xDF}, {0x0E40,0xE0}, {0x0E41,0xE1}, {0x0E42,0xE2}, {0x0E43,0xE3}, {0x0E44,0xE4}, {0x0E45,0xE5}, {0x0E46,0xE6}, {0x0E47,0xE7}, {0x0E48,0xE8}, {0x0E49,0xE9}, {0x0E4A,0xEA}, {0x0E4B,0xEB}, {0x0E4C,0xEC}, {0x0E4D,0xED}, {0x0E4E,0xEE}, {0x0E4F,0xEF}, {0x0E50,0xF0}, {0x0E51,0xF1}, {0x0E52,0xF2}, {0x0E53,0xF3}, {0x0E54,0xF4}, {0x0E55,0xF5}, {0x0E56,0xF6}, {0x0E57,0xF7}, {0x0E58,0xF8}, {0x0E59,0xF9}, {0x0E5A,0xFA}, {0x0E5B,0xFB}, }; gnustep-base-1.29.0/Source/CXXException.m000066400000000000000000000046621435650067400201610ustar00rootroot00000000000000#if defined(__has_include) #if __has_include() #import "Foundation/NSObject.h" #import "GNUstepBase/CXXException.h" #include #include /** From the CodeSourcery ABI Spec, with C++ pointers turned to void*, and * other parts abridged. */ typedef enum { _URC_FOREIGN_EXCEPTION_CAUGHT = 1 } _Unwind_Reason_Code; struct _Unwind_Exception; typedef void (*_Unwind_Exception_Cleanup_Fn) (_Unwind_Reason_Code, struct _Unwind_Exception *); struct _Unwind_Exception { uint64_t exception_class; _Unwind_Exception_Cleanup_Fn exception_cleanup; unsigned long private_1; unsigned long private_2; } __attribute__((__aligned__)); _Unwind_Reason_Code _Unwind_Resume_or_Rethrow(struct _Unwind_Exception *); struct __cxa_exception { void *exceptionType; void (*exceptionDestructor) (void *); void (*unexpectedHandler) (void *); void (*terminateHandler) (void *); void *nextException; int handlerCount; int handlerSwitchValue; const char * actionRecord; const char * languageSpecificData; void * catchTemp; void * adjustedPtr; struct _Unwind_Exception unwindHeader; }; @implementation CXXException static Class CXXExceptionClass; // TODO: Add an API for registering other classes for other exception types static Class boxClass(int64_t foo) { // Big endian platforms if (foo == *(int64_t*)(void*)"GNUCC++\0") { return CXXExceptionClass; } // Little endian platforms if (foo == *(int64_t*)(void*)"\0++CCUNG") { return CXXExceptionClass; } return Nil; } + (void) load { CXXExceptionClass = self; _objc_class_for_boxing_foreign_exception = boxClass; } + (id) exceptionWithForeignException: (struct _Unwind_Exception*)ex { CXXException *box = [self new]; box->ex = ex; return [box autorelease]; } - (void*) thrownValue { return ex + 1; } - (void*) cxx_type_info { char *ptr = (char*)ex; ptr -= __builtin_offsetof(struct __cxa_exception, unwindHeader); return ((struct __cxa_exception*)(void*)ptr)->exceptionType; } - (void) rethrow { #if defined(WITH_UNWIND) struct _Unwind_Exception *re = ex; // We aren't allowed to hold onto the exception if it's been rethrown. ex = 0; _Unwind_Resume_or_Rethrow(re); #endif } - (void) dealloc { if (0 != ex && 0 != ex->exception_cleanup) { ex->exception_cleanup(_URC_FOREIGN_EXCEPTION_CAUGHT, ex); } [super dealloc]; } @end #endif #endif gnustep-base-1.29.0/Source/DocMakefile000066400000000000000000000202661435650067400175460ustar00rootroot00000000000000# # Makefile for GNUstep Base Library documentation. # # Copyright (C) 2002 Free Software Foundation, Inc. # # Written by: Richard Frith-Macdonald # # This file is part of the GNUstep Base Library. # # 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 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 # Library General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free # Software Foundation, Inc., 51 Franklin Street, Fifth Floor, # Boston, MA 02111 USA # MAKEFILE_NAME = DocMakefile include $(GNUSTEP_MAKEFILES)/common.make include ../config.mak DOCUMENT_NAME = Base BaseAdditions Base_DOC_INSTALL_DIR = Developer BaseAdditions_DOC_INSTALL_DIR = Developer Base_AGSDOC_FILES = \ ../Documentation/Base.gsdoc \ FoundationErrors.h \ Foundation.h \ FoundationLegacySwiftCompatibility.h \ NSAffineTransform.h \ NSAppleEventDescriptor.h \ NSAppleEventManager.h \ NSAppleScript.h \ NSArchiver.h \ NSArray.h \ NSAttributedString.h \ NSAutoreleasePool.h \ NSBackgroundActivityScheduler.h \ NSBundle.h \ NSByteCountFormatter.h \ NSByteOrder.h \ NSCache.h \ NSCalendarDate.h \ NSCalendar.h \ NSCharacterSet.h \ NSClassDescription.h \ NSCoder.h \ NSComparisonPredicate.h \ NSCompoundPredicate.h \ NSConnection.h \ NSData.h \ NSDateComponentsFormatter.h \ NSDateFormatter.h \ NSDate.h \ NSDateIntervalFormatter.h \ NSDateInterval.h \ NSDebug.h \ NSDecimal.h \ NSDecimalNumber.h \ NSDictionary.h \ NSDistantObject.h \ NSDistributedLock.h \ NSDistributedNotificationCenter.h \ NSEnergyFormatter.h \ NSEnumerator.h \ NSError.h \ NSErrorRecoveryAttempting.h \ NSException.h \ NSExpression.h \ NSExtensionContext.h \ NSExtensionItem.h \ NSExtensionRequestHandling.h \ NSFileCoordinator.h \ NSFileHandle.h \ NSFileManager.h \ NSFilePresenter.h \ NSFileVersion.h \ NSFileWrapper.h \ NSFormatter.h \ NSGarbageCollector.h \ NSGeometry.h \ NSHashTable.h \ NSHFSFileTypes.h \ NSHost.h \ NSHTTPCookie.h \ NSHTTPCookieStorage.h \ NSIndexPath.h \ NSIndexSet.h \ NSInvocation.h \ NSInvocationOperation.h \ NSISO8601DateFormatter.h \ NSItemProvider.h \ NSItemProviderReadingWriting.h \ NSJSONSerialization.h \ NSKeyedArchiver.h \ NSKeyValueCoding.h \ NSKeyValueObserving.h \ NSLengthFormatter.h \ NSLinguisticTagger.h \ NSLocale.h \ NSLock.h \ NSMapTable.h \ NSMassFormatter.h \ NSMeasurementFormatter.h \ NSMeasurement.h \ NSMetadataAttributes.h \ NSMetadata.h \ NSMethodSignature.h \ NSNetServices.h \ NSNotification.h \ NSNotificationQueue.h \ NSNull.h \ NSNumberFormatter.h \ NSObjCRuntime.h \ NSObject.h \ NSObjectScripting.h \ NSOperation.h \ NSOrderedSet.h \ NSOrthography.h \ NSPathUtilities.h \ NSPersonNameComponentsFormatter.h \ NSPersonNameComponents.h \ NSPointerArray.h \ NSPointerFunctions.h \ NSPortCoder.h \ NSPort.h \ NSPortMessage.h \ NSPortNameServer.h \ NSPredicate.h \ NSProcessInfo.h \ NSProgress.h \ NSPropertyList.h \ NSProtocolChecker.h \ NSProxy.h \ NSRange.h \ NSRegularExpression.h \ NSRunLoop.h \ NSScanner.h \ NSScriptClassDescription.h \ NSScriptCoercionHandler.h \ NSScriptCommandDescription.h \ NSScriptCommand.h \ NSScriptExecutionContext.h \ NSScriptKeyValueCoding.h \ NSScriptObjectSpecifiers.h \ NSScriptStandardSuiteCommands.h \ NSScriptSuiteRegistry.h \ NSScriptWhoseTests.h \ NSSerialization.h \ NSSet.h \ NSSortDescriptor.h \ NSSpellServer.h \ NSStream.h \ NSString.h \ NSTask.h \ NSTextCheckingResult.h \ NSThread.h \ NSTimer.h \ NSTimeZone.h \ NSUbiquitousKeyValueStore.h \ NSUndoManager.h \ NSUnit.h \ NSURLAuthenticationChallenge.h \ NSURLCache.h \ NSURLConnection.h \ NSURLCredential.h \ NSURLCredentialStorage.h \ NSURLDownload.h \ NSURLError.h \ NSURL.h \ NSURLHandle.h \ NSURLProtectionSpace.h \ NSURLProtocol.h \ NSURLRequest.h \ NSURLResponse.h \ NSURLSession.h \ NSUserActivity.h \ NSUserDefaults.h \ NSUserNotification.h \ NSUserScriptTask.h \ NSUtilities.h \ NSUUID.h \ NSValue.h \ NSValueTransformer.h \ NSXMLDocument.h \ NSXMLDTD.h \ NSXMLDTDNode.h \ NSXMLElement.h \ NSXMLNode.h \ NSXMLNodeOptions.h \ NSXMLParser.h \ NSXPCConnection.h \ NSZone.h BaseAdditions_AGSDOC_FILES = \ ../Documentation/BaseAdditions.gsdoc \ GNUstep.h \ GCObject.h \ GSBlocks.h \ GSVersionMacros.h \ GSObjCRuntime.h \ GSUnion.h \ GSIArray.h \ GSIMap.h \ GSLocale.h \ GSLock.h \ GSFunctions.h \ GSMime.h \ GSTLS.h \ GSXML.h \ NSArray+GNUstepBase.h \ NSAttributedString+GNUstepBase.h \ NSBundle+GNUstepBase.h \ NSCalendarDate+GNUstepBase.h \ NSData+GNUstepBase.h \ NSDebug+GNUstepBase.h \ NSFileHandle+GNUstepBase.h \ NSLock+GNUstepBase.h \ NSMutableString+GNUstepBase.h \ NSNumber+GNUstepBase.h \ NSObject+GNUstepBase.h \ NSProcessInfo+GNUstepBase.h \ NSString+GNUstepBase.h \ NSTask+GNUstepBase.h \ NSThread+GNUstepBase.h \ NSURL+GNUstepBase.h \ Unicode.h \ GCObject.h \ # # Hack ... using the -DocumentationDirectory flag overrides the value # used by the make package, and puts our output in the documentation # directory. # Base_AGSDOC_FLAGS = \ -MakeFrames YES \ -DocumentationDirectory ../Documentation/Base \ -HeaderDirectory ../Headers/Foundation \ -Declared Foundation \ -Standards YES \ -DTDs ../Tools \ -ConstantsTemplate TypesAndConstants \ -FunctionsTemplate Functions \ -MacrosTemplate Functions \ -TypedefsTemplate TypesAndConstants \ -VariablesTemplate TypesAndConstants \ -WordMap '{\ GS_EXPORT_CLASS="";\ GS_PRIVATE_INTERNAL="//";\ DEFINE_BLOCK_TYPE="//";\ WEAK_ATTRIBUTE="";\ WINAPI="";\ }' -Up Base BaseAdditions_AGSDOC_FLAGS = \ -MakeFrames YES \ -DocumentationDirectory ../Documentation/BaseAdditions \ -HeaderDirectory ../Headers/GNUstepBase \ -Declared GNUstepBase \ -Standards YES \ -DTDs ../Tools \ -ConstantsTemplate TypesAndConstants \ -FunctionsTemplate Functions \ -MacrosTemplate Functions \ -TypedefsTemplate TypesAndConstants \ -VariablesTemplate TypesAndConstants \ -WordMap '{\ GS_EXPORT_CLASS="";\ GS_PRIVATE_INTERNAL="//";\ WINAPI="";\ }' -Up BaseAdditions # Use local version of autogsdoc in case it is not installed AUTOGSDOC=../Tools/$(GNUSTEP_OBJ_DIR_NAME)/autogsdoc # Fool make into thinking we are installed even if we are not BASE_MAKE_LOADED=yes include $(GNUSTEP_MAKEFILES)/documentation.make # # Ensure that our destination subdirectory exists in the Documentation # directory, and temporarily copy the base source file here for autogsdoc # to use. # before-all:: ../Documentation/Base \ ../Documentation/Base/Functions.gsdoc \ ../Documentation/Base/TypesAndConstants.gsdoc \ ../Documentation/BaseAdditions \ ../Documentation/BaseAdditions/Functions.gsdoc \ ../Documentation/BaseAdditions/TypesAndConstants.gsdoc cp ../Documentation/Base.gsdoc . cp ../Documentation/BaseAdditions.gsdoc . ../Documentation/Base: $(MKDIRS) ../Documentation/Base ../Documentation/Base/Functions.gsdoc: ../Documentation/Functions.gsdoc cp ../Documentation/Functions.gsdoc ../Documentation/Base ../Documentation/Base/TypesAndConstants.gsdoc: \ ../Documentation/TypesAndConstants.gsdoc cp ../Documentation/TypesAndConstants.gsdoc ../Documentation/Base ../Documentation/BaseAdditions: $(MKDIRS) ../Documentation/BaseAdditions ../Documentation/BaseAdditions/Functions.gsdoc: \ ../Documentation/Functions.gsdoc cp ../Documentation/Functions.gsdoc ../Documentation/BaseAdditions ../Documentation/BaseAdditions/TypesAndConstants.gsdoc: \ ../Documentation/TypesAndConstants.gsdoc cp ../Documentation/TypesAndConstants.gsdoc \ ../Documentation/BaseAdditions # # Work around our screwy doc generation implementation, sigh... # before-clean:: if [ -e obj ]; then \ mv obj obj-save-link; \ fi # # Clean up temporary files used while generating documentation. # after-clean:: $(RM) Base.gsdoc $(RM) BaseAdditions.gsdoc if [ -d Base ]; then \ $(RM) Base/stamp; \ $(RM) Base/dependencies; \ rmdir Base; \ $(RM) BaseAdditions/stamp; \ $(RM) BaseAdditions/dependencies; \ rmdir BaseAdditions; \ fi if [ -e obj-save-link ]; then \ mv obj-save-link obj; \ fi gnustep-base-1.29.0/Source/GNUmakefile000066400000000000000000000343431435650067400175330ustar00rootroot00000000000000# # src makefile for the GNUstep Base Library # # Copyright (C) 1997 Free Software Foundation, Inc. # # Written by: Scott Christley # # This file is part of the GNUstep Base Library. # # 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 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 # Library General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free # Software Foundation, Inc., 51 Franklin Street, Fifth Floor, # Boston, MA 02111 USA. # ifeq ($(GNUSTEP_MAKEFILES),) GNUSTEP_MAKEFILES := $(shell gnustep-config --variable=GNUSTEP_MAKEFILES 2>/dev/null) ifeq ($(GNUSTEP_MAKEFILES),) $(warning ) $(warning Unable to obtain GNUSTEP_MAKEFILES setting from gnustep-config!) $(warning Perhaps gnustep-make is not properly installed,) $(warning so gnustep-config is not in your PATH.) $(warning ) $(warning Your PATH is currently $(PATH)) $(warning ) endif endif ifeq ($(GNUSTEP_MAKEFILES),) $(error You need to set GNUSTEP_MAKEFILES before compiling!) endif PACKAGE_NAME = gnustep-base GNUSTEP_LOCAL_ADDITIONAL_MAKEFILES=../base.make include $(GNUSTEP_MAKEFILES)/common.make include ../Version include ../config.mak # Interface version changes with each minor release libgnustep-base_INTERFACE_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION) libgnustep-baseadd_INTERFACE_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION) PACKAGE_NAME = gnustep-base # The library to be compiled LIBRARY_NAME= ifeq ($(add),yes) LIBRARY_NAME += libgnustep-baseadd endif ifneq ($(base),no) LIBRARY_NAME += libgnustep-base endif OBJECTIVEC2_HEADERS = ifeq ($(OBJC2RUNTIME),0) libgnustep-base_SUBPROJECTS = ObjectiveC2 OBJECTIVEC2_HEADERS += \ Availability.h blocks_runtime.h capabilities.h runtime.h else ifeq ($(HAVE_BLOCKS),0) libgnustep-base_SUBPROJECTS = ObjectiveC2 OBJECTIVEC2_HEADERS += blocks_runtime.h endif endif libgnustep-base_SUBPROJECTS += Additions libgnustep-baseadd_SUBPROJECTS += Additions ifeq ($(GNUSTEP_TARGET_OS), mingw32) libgnustep-base_SUBPROJECTS += win32 else ifeq ($(GNUSTEP_TARGET_OS), mingw64) libgnustep-base_SUBPROJECTS += win32 else ifeq ($(GNUSTEP_TARGET_OS), windows) libgnustep-base_SUBPROJECTS += win32 else libgnustep-base_SUBPROJECTS += unix endif DEFS+= -DGNUSTEP_TARGET_DIR=\"$(GNUSTEP_TARGET_DIR)\" \ -DGNUSTEP_TARGET_CPU=\"$(GNUSTEP_TARGET_CPU)\" \ -DGNUSTEP_TARGET_OS=\"$(GNUSTEP_TARGET_OS)\" \ -DGNUSTEP_IS_FLATTENED=\"$(GNUSTEP_IS_FLATTENED)\" \ -DLIBRARY_COMBO=\"$(LIBRARY_COMBO)\" \ -DGNUSTEP_BASE_INTERNAL=1 # The GNU source files GNU_MFILES = \ GSLocale.m \ preface.m ifeq ($(findstring openbsd, $(GNUSTEP_TARGET_OS)), openbsd) OBJC_LIBS += -pthread endif ifeq ($(GNUSTEP_TARGET_OS), mingw32) GNU_MFILES += libgnustep-base-entry.m else ifeq ($(GNUSTEP_TARGET_OS), mingw64) GNU_MFILES += libgnustep-base-entry.m else ifeq ($(GNUSTEP_TARGET_OS), windows) GNU_MFILES += libgnustep-base-entry.m endif GNU_OTHER_SRCFILES = \ win32-entry.m \ win32-def.top \ libgnustep-base.def GNUSTEPBASE_HEADERS = \ GCObject.h \ GSBlocks.h \ GSVersionMacros.h \ GSObjCRuntime.h \ GSUnion.h \ GSIArray.h \ GSIMap.h \ GSFunctions.h \ GSLocale.h \ GSLock.h \ GSMime.h \ GSTLS.h \ GSXML.h \ NSArray+GNUstepBase.h \ NSAttributedString+GNUstepBase.h \ NSBundle+GNUstepBase.h \ NSCalendarDate+GNUstepBase.h \ NSData+GNUstepBase.h \ NSDebug+GNUstepBase.h \ NSFileHandle+GNUstepBase.h \ NSHashTable+GNUstepBase.h \ NSLock+GNUstepBase.h \ NSMutableString+GNUstepBase.h \ NSNetServices+GNUstepBase.h \ NSNumber+GNUstepBase.h \ NSObject+GNUstepBase.h \ NSProcessInfo+GNUstepBase.h \ NSStream+GNUstepBase.h \ NSString+GNUstepBase.h \ NSTask+GNUstepBase.h \ NSThread+GNUstepBase.h \ NSURL+GNUstepBase.h \ Unicode.h \ GNUstep.h \ Additions.h # GNUStep source files BASE_MFILES = \ CXXException.m\ GSArray.m \ GSAttributedString.m \ GSBlocks.m \ GSConcreteValue.m \ GSCountedSet.m \ GSDictionary.m \ GSFTPURLHandle.m \ GSFormat.m \ GSHTTPAuthentication.m \ GSHTTPURLHandle.m \ GSICUString.m \ GSOrderedSet.m \ GSPrivateHash.m \ GSQuickSort.m \ GSRunLoopWatcher.m \ GSSet.m \ GSShellSort.m \ GSSocketStream.m \ GSStream.m \ GSString.m \ GSTimSort.m \ GSTLS.m \ GSValue.m \ GSSocksParser/GSSocksParser.m \ GSSocksParser/GSSocksParserPrivate.m \ GSSocksParser/GSSocks4Parser.m \ GSSocksParser/GSSocks5Parser.m \ NSAffineTransform.m \ NSAppleEventDescriptor.m \ NSAppleEventManager.m \ NSAppleScript.m \ NSArchiver.m \ NSArray.m \ NSAssertionHandler.m \ NSAttributedString.m \ NSAutoreleasePool.m \ NSBackgroundActivityScheduler.m \ NSBundle.m \ NSByteCountFormatter.m \ NSCache.m \ NSCachedURLResponse.m \ NSCalendar.m \ NSCalendarDate.m \ NSCallBacks.m \ NSCharacterSet.m \ NSClassDescription.m \ NSCoder.m \ NSCopyObject.m \ NSCountedSet.m \ NSConcreteHashTable.m \ NSConcreteMapTable.m \ NSConnection.m \ NSData.m \ NSDate.m \ NSDateComponentsFormatter.m \ NSDateFormatter.m \ NSDateInterval.m \ NSDateIntervalFormatter.m \ NSDebug.m \ NSDecimal.m \ NSDecimalNumber.m \ NSDictionary.m \ NSDistantObject.m \ NSDistributedLock.m \ NSDistributedNotificationCenter.m \ NSEnergyFormatter.m \ NSEnumerator.m \ NSError.m \ NSException.m \ NSExtensionContext.m \ NSExtensionItem.m \ NSFileCoordinator.m \ NSFileHandle.m \ NSFileManager.m \ NSFileVersion.m \ NSFileWrapper.m \ NSFormatter.m \ NSGarbageCollector.m \ NSGeometry.m \ NSHashTable.m \ NSHFSFileTypes.m \ NSHost.m \ NSHTTPCookie.m \ NSHTTPCookieStorage.m \ NSIndexPath.m \ NSIndexSet.m \ NSInvocation.m \ NSInvocationOperation.m \ NSISO8601DateFormatter.m \ NSItemProvider.m \ NSItemProviderReadingWriting.m \ NSJSONSerialization.m \ NSKeyedArchiver.m \ NSKeyedUnarchiver.m \ NSKeyValueCoding.m \ NSKeyValueObserving.m \ NSLengthFormatter.m \ NSLinguisticTagger.m \ NSLocale.m \ NSLock.m \ NSLog.m \ NSMapTable.m \ NSMassFormatter.m \ NSMeasurementFormatter.m \ NSMeasurement.m \ NSMetadata.m \ NSMetadataAttributes.m \ NSMethodSignature.m \ NSNotification.m \ NSNotificationCenter.m \ NSNotificationQueue.m \ NSNull.m \ NSNumber.m \ NSNumberFormatter.m \ NSObjCRuntime.m \ NSObject.m \ NSObjectScripting.m \ NSObject+NSComparisonMethods.m \ NSOperation.m \ NSOrderedSet.m \ NSOrthography.m \ NSPage.m \ NSPathUtilities.m \ NSPersonNameComponents.m \ NSPersonNameComponentsFormatter.m \ NSPipe.m \ NSPointerArray.m \ NSPointerFunctions.m \ NSConcretePointerFunctions.m \ NSPort.m \ NSPortCoder.m \ NSPortMessage.m \ NSPortNameServer.m \ NSPredicate.m \ NSProcessInfo.m \ NSProgress.m \ NSPropertyList.m \ NSProtocolChecker.m \ NSProxy.m \ NSRange.m \ NSRegularExpression.m\ NSRunLoop.m \ NSScanner.m \ NSScriptClassDescription.m \ NSScriptCoercionHandler.m \ NSScriptCommand.m \ NSScriptCommandDescription.m \ NSScriptExecutionContext.m \ NSScriptKeyValueCoding.m \ NSScriptObjectSpecifiers.m \ NSScriptStandardSuiteCommands.m \ NSScriptSuiteRegistry.m \ NSUnit.m \ NSUserActivity.m \ NSUserScriptTask.m \ NSSerializer.m \ NSSet.m \ NSSocketPort.m \ NSSocketPortNameServer.m \ NSSortDescriptor.m \ NSSpellServer.m \ NSString.m \ NSTask.m \ NSThread.m \ NSTimer.m \ NSTimeZone.m \ NSUbiquitousKeyValueStore.m \ NSUnarchiver.m \ NSUndoManager.m \ NSURL.m \ NSURLAuthenticationChallenge.m \ NSURLCache.m \ NSURLCredential.m \ NSURLConnection.m \ NSURLCredentialStorage.m \ NSURLDownload.m \ NSURLProtectionSpace.m \ NSURLProtocol.m \ NSURLRequest.m \ NSURLResponse.m \ NSTextCheckingResult.m\ NSURLHandle.m \ NSUserDefaults.m \ NSUserNotification.m \ NSUUID.m \ NSValue.m \ NSValueTransformer.m \ NSXMLDocument.m \ NSXMLDTD.m \ NSXMLDTDNode.m \ NSXMLElement.m \ NSXMLNode.m \ NSXMLParser.m \ NSXPCConnection.m \ NSZone.m \ externs.m \ objc-load.m ifneq ($(GNUSTEP_TARGET_OS), mingw32) ifneq ($(GNUSTEP_TARGET_OS), mingw64) ifneq ($(GNUSTEP_TARGET_OS), windows) BASE_MFILES += \ GSFileHandle.m \ NSMessagePort.m \ NSMessagePortNameServer.m endif endif endif ifeq ($(HAVE_BLOCKS), 1) ifeq ($(GNUSTEP_BASE_HAVE_LIBDISPATCH), 1) ifeq ($(GNUSTEP_BASE_HAVE_LIBCURL), 1) BASE_MFILES += \ GSEasyHandle.m \ GSHTTPURLProtocol.m \ GSMultiHandle.m \ GSNativeProtocol.m \ GSTaskRegistry.m \ GSTimeoutSource.m \ GSTransferState.m \ GSURLSessionTaskBody.m \ GSURLSessionTaskBodySource.m \ NSURLSession.m endif endif endif ifeq ($(GNUSTEP_BASE_HAVE_MDNS), 1) BASE_MFILES += \ GSMDNSNetServices.m \ NSNetServices.m endif ifeq ($(GNUSTEP_BASE_HAVE_AVAHI), 1) BASE_MFILES += \ GSAvahiNetService.m \ GSAvahiNetServiceBrowser.m \ GSAvahiClient.m \ GSAvahiRunLoopIntegration.m \ NSNetServices.m endif ifeq ($(WITH_FFI),libffi) GNU_MFILES += cifframe.m BASE_MFILES += GSFFIInvocation.m endif ifeq ($(WITH_FFI),ffcall) GNU_MFILES += callframe.m BASE_MFILES += GSFFCallInvocation.m endif BASE_OTHER_SRCFILES = \ GSConcreteValueTemplate.m \ GSTemplateValue.m \ dld-load.h \ hpux-load.h \ null-load.h \ simple-load.h \ win32-load.h \ NSCallBacks.h \ tzfile.h FOUNDATION_HEADERS = \ Foundation.h \ FoundationErrors.h \ FoundationLegacySwiftCompatibility.h \ NSAffineTransform.h \ NSAppleEventDescriptor.h \ NSAppleEventManager.h \ NSAppleScript.h \ NSArchiver.h \ NSArray.h \ NSAttributedString.h \ NSAutoreleasePool.h \ NSBackgroundActivityScheduler.h \ NSBundle.h \ NSByteCountFormatter.h \ NSByteOrder.h \ NSCache.h\ NSCalendar.h \ NSCalendarDate.h \ NSCharacterSet.h \ NSClassDescription.h \ NSCoder.h \ NSComparisonPredicate.h \ NSCompoundPredicate.h \ NSConnection.h \ NSData.h \ NSDateComponentsFormatter.h \ NSDateFormatter.h \ NSDateInterval.h \ NSDateIntervalFormatter.h \ NSDate.h \ NSDebug.h \ NSDecimal.h \ NSDecimalNumber.h \ NSDictionary.h \ NSDistantObject.h \ NSDistributedLock.h \ NSDistributedNotificationCenter.h \ NSEnergyFormatter.h \ NSEnumerator.h \ NSError.h \ NSErrorRecoveryAttempting.h \ NSException.h \ NSExtensionContext.h \ NSExtensionItem.h \ NSExtensionRequestHandling.h \ NSExpression.h \ NSFileCoordinator.h \ NSFileHandle.h \ NSFileManager.h \ NSFilePresenter.h \ NSFileVersion.h \ NSFileWrapper.h \ NSFormatter.h \ NSGarbageCollector.h \ NSGeometry.h \ NSHashTable.h \ NSHFSFileTypes.h \ NSHost.h \ NSHTTPCookie.h \ NSHTTPCookieStorage.h \ NSIndexPath.h \ NSIndexSet.h \ NSInvocation.h \ NSInvocationOperation.h \ NSISO8601DateFormatter.h \ NSItemProvider.h \ NSItemProviderReadingWriting.h \ NSJSONSerialization.h \ NSKeyedArchiver.h \ NSKeyValueCoding.h \ NSKeyValueObserving.h \ NSLengthFormatter.h \ NSLinguisticTagger.h \ NSLocale.h \ NSLock.h \ NSMapTable.h \ NSMassFormatter.h \ NSMeasurementFormatter.h \ NSMeasurement.h \ NSMetadata.h \ NSMetadataAttributes.h \ NSMethodSignature.h \ NSNetServices.h \ NSNotification.h \ NSNotificationQueue.h \ NSNull.h \ NSNumberFormatter.h \ NSObjCRuntime.h \ NSObject.h \ NSObjectScripting.h \ NSOperation.h \ NSOrderedSet.h \ NSOrthography.h \ NSPathUtilities.h \ NSPersonNameComponents.h \ NSPersonNameComponentsFormatter.h \ NSPointerArray.h \ NSPointerFunctions.h \ NSPortCoder.h \ NSPort.h \ NSPortMessage.h \ NSPortNameServer.h \ NSPredicate.h \ NSProcessInfo.h \ NSProgress.h \ NSPropertyList.h \ NSProtocolChecker.h \ NSProxy.h \ NSRange.h \ NSRegularExpression.h\ NSRunLoop.h \ NSScanner.h \ NSScriptClassDescription.h \ NSScriptCoercionHandler.h \ NSScriptCommand.h \ NSScriptCommandDescription.h \ NSScriptExecutionContext.h \ NSScriptKeyValueCoding.h \ NSScriptObjectSpecifiers.h \ NSScriptStandardSuiteCommands.h \ NSScriptSuiteRegistry.h \ NSUnit.h \ NSUserActivity.h \ NSUserScriptTask.h \ NSScriptWhoseTests.h \ NSSerialization.h \ NSSet.h \ NSSortDescriptor.h \ NSSpellServer.h \ NSStream.h \ NSString.h \ NSTask.h \ NSTextCheckingResult.h\ NSThread.h \ NSTimer.h \ NSTimeZone.h \ NSUbiquitousKeyValueStore.h \ NSUndoManager.h \ NSURLAuthenticationChallenge.h \ NSURLCache.h \ NSURLConnection.h \ NSURLCredential.h \ NSURLCredentialStorage.h \ NSURLDownload.h \ NSURLError.h \ NSURL.h \ NSURLHandle.h \ NSURLProtectionSpace.h \ NSURLProtocol.h \ NSURLRequest.h \ NSURLResponse.h \ NSURLSession.h \ NSUserDefaults.h \ NSUserNotification.h \ NSUtilities.h \ NSUUID.h \ NSValue.h \ NSValueTransformer.h \ NSXMLDocument.h \ NSXMLDTD.h \ NSXMLDTDNode.h \ NSXMLElement.h \ NSXMLNode.h \ NSXMLNodeOptions.h \ NSXMLParser.h \ NSXPCConnection.h \ NSZone.h HEADERS_INSTALL = \ $(OBJECTIVEC2_HEADERS) \ $(GNUSTEPBASE_HEADERS) \ $(FOUNDATION_HEADERS) GENERATED_HFILES = \ dynamic-load.h \ $(GNUSTEP_TARGET_DIR)/config.h \ $(GNUSTEP_TARGET_DIR)/GNUstepBase/GSConfig.h ifeq ($(HAVE_INET_PTON), no) GNU_MFILES += inet_pton.m endif ifeq ($(HAVE_INET_NTOP), no) GNU_MFILES += inet_ntop.m endif # The Objective-C source files to be compiled libgnustep-base_OBJC_FILES = $(GNU_MFILES) \ $(BASE_MFILES) libgnustep-base_C_FILES = $(GNU_CFILES) # Extra DLL exports file libgnustep-base_DLL_DEF = libgnustep-base.def libgnustep-base_HEADER_FILES_DIR = $(HEADER_DIR_FND) libgnustep-base_HEADER_FILES_INSTALL_DIR = /Foundation libgnustep-base_HEADER_FILES = $(FOUNDATION_HEADERS) # Resources RESOURCE_SET_NAME = libbase-resources # This is for gnustep-make >= 14-02-2007 libbase-resources_INSTALL_DIR = $(GNUSTEP_LIBRARY)/Libraries/gnustep-base/Versions/$(libgnustep-base_INTERFACE_VERSION)/Resources # This is kept temporarily for gnustep-make < 14-02-2007 libbase-resources_RESOURCE_FILES_INSTALL_DIR = /Library/Libraries/Resources/gnustep-base libbase-resources_LANGUAGES = libbase-resources_LOCALIZED_RESOURCE_FILES = libbase-resources_RESOURCE_DIRS = libbase-resources_RESOURCE_FILES = Info-gnustep.plist libgnustep-base_NEEDS_GUI = NO libgnustep-baseadd_NEEDS_GUI = NO # Build the Additions subproject first. It can then be used in by # both gnustep-base and gnustep-baseadd (otherwise, if we ever build # gnustep-base and gnustep-baseadd in parallel, they'd both try to # build Additions as a subproject, causing concurrency issues). If it # can be guaranteed that they'll never be built together, this could # be removed. ifeq ($(OBJC2RUNTIME),0) SUBPROJECTS = ObjectiveC2 endif SUBPROJECTS += Additions -include Makefile.preamble include $(GNUSTEP_MAKEFILES)/aggregate.make include $(GNUSTEP_MAKEFILES)/library.make include $(GNUSTEP_MAKEFILES)/resource-set.make -include Makefile.postamble gnustep-base-1.29.0/Source/GSArray.m000066400000000000000000000661621435650067400171530ustar00rootroot00000000000000/** Concrete implementation of NSArray Copyright (C) 1995, 1996, 1998, 1999 Free Software Foundation, Inc. Written by: Andrew Kachites McCallum Date: March 1995 Rewrite by: Richard Frith-Macdonald This file is part of the GNUstep Base Library. 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 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 USA. $Date$ $Revision$ */ #import "common.h" #import "Foundation/NSArray.h" #import "GNUstepBase/GSObjCRuntime.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSException.h" #import "Foundation/NSPortCoder.h" #import "Foundation/NSValue.h" // For private method _decodeArrayOfObjectsForKey: #import "Foundation/NSKeyedArchiver.h" #import "GSPrivate.h" #import "GSSorting.h" static SEL eqSel; static SEL oaiSel; static Class GSInlineArrayClass; /* This class stores objects inline in data beyond the end of the instance. */ @interface GSInlineArray : GSArray { } @end @class GSArray; @interface GSArrayEnumerator : NSEnumerator { GSArray *array; NSUInteger pos; } - (id) initWithArray: (GSArray*)anArray; @end @interface GSArrayEnumeratorReverse : GSArrayEnumerator @end @interface GSMutableArray (GSArrayBehavior) - (void) _raiseRangeExceptionWithIndex: (NSUInteger)index from: (SEL)sel; @end @implementation GSArray - (NSUInteger) sizeOfContentExcluding: (NSHashTable*)exclude { NSUInteger size = _count * sizeof(id); NSUInteger index = _count; while (index-- > 0) { size += [_contents_array[index] sizeInBytesExcluding: exclude]; } return size + [super sizeOfContentExcluding: exclude]; } - (void) _raiseRangeExceptionWithIndex: (NSUInteger)index from: (SEL)sel { NSDictionary *info; NSException *exception; NSString *reason; info = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithUnsignedInteger: index], @"Index", [NSNumber numberWithUnsignedInteger: _count], @"Count", self, @"Array", nil, nil]; reason = [NSString stringWithFormat: @"Index %"PRIuPTR" is out of range %d (in '%@')", index, _count, NSStringFromSelector(sel)]; exception = [NSException exceptionWithName: NSRangeException reason: reason userInfo: info]; [exception raise]; } + (void) initialize { if (self == [GSArray class]) { [self setVersion: 1]; eqSel = @selector(isEqual:); oaiSel = @selector(objectAtIndex:); GSInlineArrayClass = [GSInlineArray class]; } } + (id) allocWithZone: (NSZone*)zone { GSArray *array = (GSArray*)NSAllocateObject(self, 0, zone); return (id)array; } - (id) copyWithZone: (NSZone*)zone { return RETAIN(self); // Optimised version } - (void) dealloc { if (_contents_array) { NSUInteger i; for (i = 0; i < _count; i++) { [_contents_array[i] release]; } NSZoneFree([self zone], _contents_array); _contents_array = 0; } [super dealloc]; } - (id) init { return [self initWithObjects: 0 count: 0]; } /* This is the designated initializer for NSArray. */ - (id) initWithObjects: (const id[])objects count: (NSUInteger)count { if (count > 0) { NSUInteger i; _contents_array = NSZoneMalloc([self zone], sizeof(id)*count); if (_contents_array == 0) { DESTROY(self); return nil; } for (i = 0; i < count; i++) { if ((_contents_array[i] = RETAIN(objects[i])) == nil) { _count = i; DESTROY(self); [NSException raise: NSInvalidArgumentException format: @"Tried to init array with nil to object"]; } } _count = count; } return self; } - (void) encodeWithCoder: (NSCoder*)aCoder { if ([aCoder allowsKeyedCoding]) { [super encodeWithCoder: aCoder]; } else { /* For performace we encode directly ... must exactly match the * superclass implemenation. */ [aCoder encodeValueOfObjCType: @encode(unsigned) at: &_count]; if (_count > 0) { [aCoder encodeArrayOfObjCType: @encode(id) count: _count at: _contents_array]; } } } - (id) initWithCoder: (NSCoder*)aCoder { if ([aCoder allowsKeyedCoding]) { self = [super initWithCoder: aCoder]; } else { /* for performance, we decode directly into memory rather than * using the superclass method. Must exactly match superclass. */ [aCoder decodeValueOfObjCType: @encode(unsigned) at: &_count]; if (_count > 0) { _contents_array = NSZoneCalloc([self zone], _count, sizeof(id)); if (_contents_array == 0) { [NSException raise: NSMallocException format: @"Unable to make array"]; } [aCoder decodeArrayOfObjCType: @encode(id) count: _count at: _contents_array]; } } return self; } - (NSUInteger) count { return _count; } - (NSUInteger) hash { return _count; } - (NSUInteger) indexOfObject: anObject { if (anObject == nil) return NSNotFound; /* * For large arrays, speed things up a little by caching the method. */ if (_count > 1) { BOOL (*imp)(id,SEL,id); NSUInteger i; imp = (BOOL (*)(id,SEL,id))[anObject methodForSelector: eqSel]; for (i = 0; i < _count; i++) { if ((*imp)(anObject, eqSel, _contents_array[i])) { return i; } } } else if (_count == 1 && [anObject isEqual: _contents_array[0]]) { return 0; } return NSNotFound; } - (NSUInteger) indexOfObjectIdenticalTo: anObject { NSUInteger i; for (i = 0; i < _count; i++) { if (anObject == _contents_array[i]) { return i; } } return NSNotFound; } - (BOOL) isEqualToArray: (NSArray*)otherArray { NSUInteger i; if (self == (id)otherArray) { return YES; } if (_count != [otherArray count]) { return NO; } if (_count > 0) { IMP get1 = [otherArray methodForSelector: oaiSel]; for (i = 0; i < _count; i++) { if (![_contents_array[i] isEqual: (*get1)(otherArray, oaiSel, i)]) { return NO; } } } return YES; } - (id) lastObject { if (_count) { return _contents_array[_count-1]; } return nil; } - (BOOL) makeImmutable { return YES; } - (id) objectAtIndex: (NSUInteger)index { if (index >= _count) { [self _raiseRangeExceptionWithIndex: index from: _cmd]; } return _contents_array[index]; } - (void) makeObjectsPerformSelector: (SEL)aSelector { NSUInteger i; for (i = 0; i < _count; i++) { [_contents_array[i] performSelector: aSelector]; } } - (void) makeObjectsPerformSelector: (SEL)aSelector withObject: (id)argument { NSUInteger i; for (i = 0; i < _count; i++) { [_contents_array[i] performSelector: aSelector withObject: argument]; } } - (void) getObjects: (__unsafe_unretained id[])aBuffer { NSUInteger i; for (i = 0; i < _count; i++) { aBuffer[i] = _contents_array[i]; } } - (void) getObjects: (__unsafe_unretained id[])aBuffer range: (NSRange)aRange { NSUInteger i, j = 0, e = aRange.location + aRange.length; GS_RANGE_CHECK(aRange, _count); for (i = aRange.location; i < e; i++) { aBuffer[j++] = _contents_array[i]; } } - (NSUInteger) countByEnumeratingWithState: (NSFastEnumerationState*)state objects: (__unsafe_unretained id[])stackbuf count: (NSUInteger)len { /* For immutable arrays we can return the contents pointer directly. */ NSUInteger count = _count - state->state; state->mutationsPtr = (unsigned long *)self; state->itemsPtr = _contents_array + state->state; state->state += count; return count; } @end @implementation GSInlineArray - (void) dealloc { if (_contents_array) { NSUInteger i; for (i = 0; i < _count; i++) { [_contents_array[i] release]; } _contents_array = 0; } [super dealloc]; } - (id) init { return [self initWithObjects: 0 count: 0]; } - (id) initWithObjects: (const id[])objects count: (NSUInteger)count { _contents_array = (id*)(((void*)self) + class_getInstanceSize([self class])); if (count > 0) { NSUInteger i; for (i = 0; i < count; i++) { if ((_contents_array[i] = RETAIN(objects[i])) == nil) { _count = i; DESTROY(self); [NSException raise: NSInvalidArgumentException format: @"Tried to init array with nil object"]; } } _count = count; } return self; } @end @implementation GSMutableArray - (NSUInteger) sizeOfContentExcluding: (NSHashTable*)exclude { /* Can't safely calculate for mutable object; just buffer size */ return _capacity * sizeof(void*); } + (void) initialize { if (self == [GSMutableArray class]) { [self setVersion: 1]; GSObjCAddClassBehavior(self, [GSArray class]); } } - (void) addObject: (id)anObject { _version++; if (anObject == nil) { [NSException raise: NSInvalidArgumentException format: @"Tried to add nil to array"]; } if (_count >= _capacity) { id *ptr; size_t size = (_capacity + _grow_factor)*sizeof(id); ptr = NSZoneRealloc([self zone], _contents_array, size); if (ptr == 0) { [NSException raise: NSMallocException format: @"Unable to grow array"]; } _contents_array = ptr; _capacity += _grow_factor; _grow_factor = _capacity/2; } _contents_array[_count] = RETAIN(anObject); _count++; /* Do this AFTER we have retained the object. */ _version++; } /** * Optimised code for copying */ - (id) copyWithZone: (NSZone*)zone { NSArray *copy; copy = (id)NSAllocateObject(GSInlineArrayClass, sizeof(id)*_count, zone); return [copy initWithObjects: _contents_array count: _count]; } - (void) exchangeObjectAtIndex: (NSUInteger)i1 withObjectAtIndex: (NSUInteger)i2 { _version++; if (i1 >= _count) { [self _raiseRangeExceptionWithIndex: i1 from: _cmd]; } if (i2 >= _count) { [self _raiseRangeExceptionWithIndex: i2 from: _cmd]; } if (i1 != i2) { id tmp = _contents_array[i1]; _contents_array[i1] = _contents_array[i2]; _contents_array[i2] = tmp; } _version++; } - (id) init { return [self initWithCapacity: 0]; } - (id) initWithCapacity: (NSUInteger)cap { if (cap == 0) { cap = 1; } _contents_array = NSZoneMalloc([self zone], sizeof(id)*cap); _capacity = cap; _grow_factor = cap > 1 ? cap/2 : 1; return self; } - (id) initWithCoder: (NSCoder*)aCoder { if ([aCoder allowsKeyedCoding]) { self = [super initWithCoder: aCoder]; } else { unsigned count; [aCoder decodeValueOfObjCType: @encode(unsigned) at: &count]; if ((self = [self initWithCapacity: count]) == nil) { [NSException raise: NSMallocException format: @"Unable to make array while initializing from coder"]; } if (count > 0) { [aCoder decodeArrayOfObjCType: @encode(id) count: count at: _contents_array]; _count = count; } } return self; } - (id) initWithObjects: (const id[])objects count: (NSUInteger)count { self = [self initWithCapacity: count]; if (self != nil && count > 0) { NSUInteger i; for (i = 0; i < count; i++) { if ((_contents_array[i] = RETAIN(objects[i])) == nil) { _count = i; DESTROY(self); [NSException raise: NSInvalidArgumentException format: @"Tried to init array with nil object"]; } } _count = count; } return self; } - (void) insertObject: (id)anObject atIndex: (NSUInteger)index { _version++; if (!anObject) { NSException *exception; NSDictionary *info; info = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithUnsignedInteger: index], @"Index", self, @"Array", nil, nil]; exception = [NSException exceptionWithName: NSInvalidArgumentException reason: @"Tried to insert nil to array" userInfo: info]; [exception raise]; } if (index > _count) { [self _raiseRangeExceptionWithIndex: index from: _cmd]; } if (_count == _capacity) { id *ptr; size_t size = (_capacity + _grow_factor)*sizeof(id); ptr = NSZoneRealloc([self zone], _contents_array, size); if (ptr == 0) { [NSException raise: NSMallocException format: @"Unable to grow"]; } _contents_array = ptr; _capacity += _grow_factor; _grow_factor = _capacity/2; } memmove(&_contents_array[index+1], &_contents_array[index], (_count - index) * sizeof(id)); /* * Make sure the array is 'sane' so that it can be deallocated * safely by an autorelease pool if the '[anObject retain]' causes * an exception. */ _contents_array[index] = nil; _count++; _contents_array[index] = RETAIN(anObject); _version++; } - (BOOL) makeImmutable { GSClassSwizzle(self, [GSArray class]); return YES; } - (id) makeImmutableCopyOnFail: (BOOL)force { GSClassSwizzle(self, [GSArray class]); return self; } - (void) removeAllObjects { NSUInteger pos; if ((pos = _count) > 0) { IMP rel = 0; Class last = Nil; _version++; _count = 0; while (pos-- > 0) { id o = _contents_array[pos]; Class c = object_getClass(o); if (c != last) { last = c; rel = [o methodForSelector: @selector(release)]; } (*rel)(o, @selector(release)); _contents_array[pos] = nil; } _version++; } } - (void) removeLastObject { _version++; if (_count == 0) { [NSException raise: NSRangeException format: @"Trying to remove from an empty array."]; } _count--; RELEASE(_contents_array[_count]); _contents_array[_count] = 0; _version++; } - (void) removeObject: (id)anObject { NSUInteger index; _version++; if (anObject == nil) { NSWarnMLog(@"attempt to remove nil object"); return; } index = _count; if (index > 0) { BOOL (*imp)(id,SEL,id); BOOL retained = NO; imp = (BOOL (*)(id,SEL,id))[anObject methodForSelector: eqSel]; while (index-- > 0) { if ((*imp)(anObject, eqSel, _contents_array[index]) == YES) { NSUInteger pos = index; id obj = _contents_array[index]; if (retained == NO) { RETAIN(anObject); retained = YES; } while (++pos < _count) { _contents_array[pos-1] = _contents_array[pos]; } _count--; _contents_array[_count] = 0; RELEASE(obj); } } if (retained == YES) { RELEASE(anObject); } } _version++; } - (void) removeObjectAtIndex: (NSUInteger)index { id obj; _version++; if (index >= _count) { [self _raiseRangeExceptionWithIndex: index from: _cmd]; } obj = _contents_array[index]; _count--; while (index < _count) { _contents_array[index] = _contents_array[index+1]; index++; } _contents_array[_count] = 0; [obj release]; /* Adjust array BEFORE releasing object. */ _version++; } - (void) removeObjectIdenticalTo: (id)anObject { NSUInteger index; _version++; if (anObject == nil) { NSWarnMLog(@"attempt to remove nil object"); return; } index = _count; while (index-- > 0) { if (_contents_array[index] == anObject) { id obj = _contents_array[index]; NSUInteger pos = index; while (++pos < _count) { _contents_array[pos-1] = _contents_array[pos]; } _count--; _contents_array[_count] = 0; RELEASE(obj); } } _version++; } - (void) removeObjectsInRange: (NSRange)aRange { GS_RANGE_CHECK(aRange, _count); if (aRange.length > 0) { NSUInteger index; NSUInteger tail; NSUInteger end; IMP rel = 0; Class last = Nil; _version++; index = aRange.location; /* Release all the objects we are removing. */ end = NSMaxRange(aRange); while (end-- > index) { id o = _contents_array[end]; Class c = object_getClass(o); if (c != last) { last = c; rel = [o methodForSelector: @selector(release)]; } (*rel)(o, @selector(release)); _contents_array[end] = nil; } /* Move any trailing objects to fill the hole we made. */ end = NSMaxRange(aRange); tail = _count - end; if (tail > 0) { memmove(_contents_array + index, _contents_array + end, tail * sizeof(id)); index += tail; } _count = index; /* Clear emptied part of buffer. */ memset(_contents_array + _count, 0, aRange.length * sizeof(id)); _version++; } } - (void) replaceObjectAtIndex: (NSUInteger)index withObject: (id)anObject { id obj; _version++; if (index >= _count) { [self _raiseRangeExceptionWithIndex: index from: _cmd]; } if (!anObject) { NSException *exception; NSDictionary *info; info = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithUnsignedInteger: index], @"Index", _contents_array[index], @"OldObject", self, @"Array", nil, nil]; exception = [NSException exceptionWithName: NSInvalidArgumentException reason: @"Tried to replace object in array with nil" userInfo: info]; [exception raise]; } /* * Swap objects in order so that there is always a valid object in the * array in case a retain or release causes an exception. */ obj = _contents_array[index]; [anObject retain]; _contents_array[index] = anObject; [obj release]; _version++; } - (void) sortUsingFunction: (NSComparisonResult (*)(id,id,void*))compare context: (void*)context { _version++; if ((1 < _count) && (NULL != compare)) { GSSortUnstable(_contents_array, NSMakeRange(0,_count), (id)compare, GSComparisonTypeFunction, context); } _version++; } - (void) sortWithOptions: (NSSortOptions)options usingComparator: (NSComparator)comparator { _version++; if ((1 < _count) && (NULL != comparator)) { if (options & NSSortStable) { if (options & NSSortConcurrent) { GSSortStableConcurrent(_contents_array, NSMakeRange(0,_count), (id)comparator, GSComparisonTypeComparatorBlock, NULL); } else { GSSortStable(_contents_array, NSMakeRange(0,_count), (id)comparator, GSComparisonTypeComparatorBlock, NULL); } } else { if (options & NSSortConcurrent) { GSSortUnstableConcurrent(_contents_array, NSMakeRange(0,_count), (id)comparator, GSComparisonTypeComparatorBlock, NULL); } else { GSSortUnstable(_contents_array, NSMakeRange(0,_count), (id)comparator, GSComparisonTypeComparatorBlock, NULL); } } } _version++; } - (NSEnumerator*) objectEnumerator { GSArrayEnumerator *enumerator; enumerator = [GSArrayEnumerator allocWithZone: NSDefaultMallocZone()]; return AUTORELEASE([enumerator initWithArray: (GSArray*)self]); } - (NSEnumerator*) reverseObjectEnumerator { GSArrayEnumeratorReverse *enumerator; enumerator = [GSArrayEnumeratorReverse allocWithZone: NSDefaultMallocZone()]; return AUTORELEASE([enumerator initWithArray: (GSArray*)self]); } - (NSUInteger) countByEnumeratingWithState: (NSFastEnumerationState*)state objects: (__unsafe_unretained id[])stackbuf count: (NSUInteger)len { NSInteger count; /* This is cached in the caller at the start and compared at each * iteration. If it changes during the iteration then * objc_enumerationMutation() will be called, throwing an exception. */ state->mutationsPtr = &_version; count = MIN(len, _count - state->state); /* If a mutation has occurred then it's possible that we are being asked to * get objects from after the end of the array. Don't pass negative values * to memcpy. */ if (count > 0) { memcpy(stackbuf, _contents_array + state->state, count * sizeof(id)); state->state += count; } else { count = 0; } state->itemsPtr = stackbuf; return count; } @end @implementation GSArrayEnumerator - (id) initWithArray: (GSArray*)anArray { if ((self = [super init]) != nil) { array = anArray; IF_NO_ARC(RETAIN(array);) pos = 0; } return self; } - (id) nextObject { if (pos >= array->_count) return nil; return array->_contents_array[pos++]; } - (void) dealloc { RELEASE(array); [super dealloc]; } @end @implementation GSArrayEnumeratorReverse - (id) initWithArray: (GSArray*)anArray { [super initWithArray: anArray]; pos = array->_count; return self; } - (id) nextObject { if (pos == 0) return nil; return array->_contents_array[--pos]; } @end @implementation GSArray (GNUstep) /* * The comparator function takes two items as arguments, the first is the * item to be added, the second is the item already in the array. * The function should return NSOrderedAscending if the item to be * added is 'less than' the item in the array, NSOrderedDescending * if it is greater, and NSOrderedSame if it is equal. */ - (NSUInteger) insertionPosition: (id)item usingFunction: (NSComparisonResult (*)(id, id, void *))sorter context: (void *)context { NSUInteger upper = _count; NSUInteger lower = 0; NSUInteger index; if (item == nil) { [NSException raise: NSGenericException format: @"Attempt to find position for nil object in array"]; } if (sorter == 0) { [NSException raise: NSGenericException format: @"Attempt to find position with null comparator"]; } /* * Binary search for an item equal to the one to be inserted. */ for (index = upper/2; upper != lower; index = lower+(upper-lower)/2) { NSComparisonResult comparison; comparison = (*sorter)(item, _contents_array[index], context); if (comparison == NSOrderedAscending) { upper = index; } else if (comparison == NSOrderedDescending) { lower = index + 1; } else { break; } } /* * Now skip past any equal items so the insertion point is AFTER any * items that are equal to the new one. */ while (index < _count && (*sorter)(item, _contents_array[index], context) != NSOrderedAscending) { index++; } return index; } - (NSUInteger) insertionPosition: (id)item usingSelector: (SEL)comp { NSUInteger upper = _count; NSUInteger lower = 0; NSUInteger index; NSComparisonResult (*imp)(id, SEL, id); if (item == nil) { [NSException raise: NSGenericException format: @"Attempt to find position for nil object in array"]; } if (comp == 0) { [NSException raise: NSGenericException format: @"Attempt to find position with null comparator"]; } imp = (NSComparisonResult (*)(id, SEL, id))[item methodForSelector: comp]; if (imp == 0) { [NSException raise: NSGenericException format: @"Attempt to find position with unknown method"]; } /* * Binary search for an item equal to the one to be inserted. */ for (index = upper/2; upper != lower; index = lower+(upper-lower)/2) { NSComparisonResult comparison; comparison = (*imp)(item, comp, _contents_array[index]); if (comparison == NSOrderedAscending) { upper = index; } else if (comparison == NSOrderedDescending) { lower = index + 1; } else { break; } } /* * Now skip past any equal items so the insertion point is AFTER any * items that are equal to the new one. */ while (index < _count && (*imp)(item, comp, _contents_array[index]) != NSOrderedAscending) { index++; } return index; } @end @implementation GSPlaceholderArray + (void) initialize { GSInlineArrayClass = [GSInlineArray class]; } - (id) autorelease { NSWarnLog(@"-autorelease sent to uninitialised array"); return self; // placeholders never get released. } - (id) objectAtIndex: (NSUInteger)index { [NSException raise: NSInternalInconsistencyException format: @"Attempt to use uninitialised array"]; return 0; } - (void) dealloc { GSNOSUPERDEALLOC; // placeholders never get deallocated. } - (id) init { return [self initWithObjects: 0 count: 0]; } - (id) initWithCoder: (NSCoder*)aCoder { if ([aCoder allowsKeyedCoding]) { NSArray *array = [(NSKeyedUnarchiver*)aCoder _decodeArrayOfObjectsForKey: @"NS.objects"]; if (array != nil) { return (GSPlaceholderArray*)RETAIN(array); } else { return [super initWithCoder: aCoder]; } } else { unsigned c; GSInlineArray *a; [aCoder decodeValueOfObjCType: @encode(unsigned) at: &c]; a = (id)NSAllocateObject(GSInlineArrayClass, sizeof(id)*c, [self zone]); a->_contents_array = (id*)(((void*)a) + class_getInstanceSize([a class])); if (c > 0) { [aCoder decodeArrayOfObjCType: @encode(id) count: c at: a->_contents_array]; } a->_count = c; return (GSPlaceholderArray*)a; } } - (id) initWithObjects: (const id[])objects count: (NSUInteger)count { self = (id)NSAllocateObject(GSInlineArrayClass, sizeof(id)*count, [self zone]); return [self initWithObjects: objects count: count]; } - (NSUInteger) count { [NSException raise: NSInternalInconsistencyException format: @"Attempt to use uninitialised array"]; return 0; } - (oneway void) release { return; // placeholders never get released. } - (id) retain { return self; // placeholders never get retained. } @end @interface NSGArray : NSArray @end @implementation NSGArray - (id) initWithCoder: (NSCoder*)aCoder { NSLog(@"Warning - decoding archive containing obsolete %@ object - please delete/replace this archive", NSStringFromClass([self class])); DESTROY(self); self = (id)NSAllocateObject([GSArray class], 0, NSDefaultMallocZone()); self = [self initWithCoder: aCoder]; return self; } @end @interface NSGMutableArray : NSMutableArray @end @implementation NSGMutableArray - (id) initWithCoder: (NSCoder*)aCoder { NSLog(@"Warning - decoding archive containing obsolete %@ object - please delete/replace this archive", NSStringFromClass([self class])); DESTROY(self); self = (id)NSAllocateObject([GSMutableArray class], 0, NSDefaultMallocZone()); self = [self initWithCoder: aCoder]; return self; } @end gnustep-base-1.29.0/Source/GSAtomic.h000066400000000000000000000040521435650067400172720ustar00rootroot00000000000000/* * Provides atomic load and store functions using either native C11 atomic * types and operations if available, or otherwise using fallback * implementations (e.g. with GCC where stdatomic.h is not useable from * Objective-C). * * Adopted from FreeBSD's stdatomic.h. */ #ifndef _GSAtomic_h_ #define _GSAtomic_h_ #ifndef __has_extension #define __has_extension(x) 0 #endif #if __has_extension(c_atomic) || __has_extension(cxx_atomic) /* * Use native C11 atomic operations. _Atomic() should be defined by the * compiler. */ #define atomic_load_explicit(object, order) \ __c11_atomic_load(object, order) #define atomic_store_explicit(object, desired, order) \ __c11_atomic_store(object, desired, order) #else /* * No native support for _Atomic(). Place object in structure to prevent * most forms of direct non-atomic access. */ #define _Atomic(T) struct { T volatile __val; } #if __has_builtin(__sync_swap) /* Clang provides a full-barrier atomic exchange - use it if available. */ #define atomic_exchange_explicit(object, desired, order) \ ((void)(order), __sync_swap(&(object)->__val, desired)) #else /* * __sync_lock_test_and_set() is only an acquire barrier in theory (although in * practice it is usually a full barrier) so we need an explicit barrier before * it. */ #define atomic_exchange_explicit(object, desired, order) \ __extension__ ({ \ __typeof__(object) __o = (object); \ __typeof__(desired) __d = (desired); \ (void)(order); \ __sync_synchronize(); \ __sync_lock_test_and_set(&(__o)->__val, __d); \ }) #endif #define atomic_load_explicit(object, order) \ ((void)(order), __sync_fetch_and_add(&(object)->__val, 0)) #define atomic_store_explicit(object, desired, order) \ ((void)atomic_exchange_explicit(object, desired, order)) #endif #ifndef __ATOMIC_SEQ_CST #define __ATOMIC_SEQ_CST 5 #endif /* * Convenience functions. */ #define atomic_load(object) \ atomic_load_explicit(object, __ATOMIC_SEQ_CST) #define atomic_store(object, desired) \ atomic_store_explicit(object, desired, __ATOMIC_SEQ_CST) #endif // _GSAtomic_h_ gnustep-base-1.29.0/Source/GSAttributedString.m000066400000000000000000000607741435650067400213760ustar00rootroot00000000000000/** GSAttributedString.m Implementation of concrete subclass of a string class with attributes Copyright (C) 1997,1999 Free Software Foundation, Inc. Written by: ANOQ of the sun Date: November 1997 Rewrite by: Richard Frith-Macdonald Date: April 1999 This file is part of GNUStep-base 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 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. If you are interested in a warranty or support for this source code, contact Scott Christley for more information. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110 USA. */ /* Warning - [-initWithString:attributes:] is the designated initialiser, * but it doesn't provide any way to perform the function of the * [-initWithAttributedString:] initialiser. * In order to work round this, the string argument of the * designated initialiser has been overloaded such that it * is expected to accept an NSAttributedString here instead of * a string. If you create an NSAttributedString subclass, you * must make sure that your implementation of the initialiser * copes with either an NSString or an NSAttributedString. * If it receives an NSAttributedString, it should ignore the * attributes argument and use the values from the string. */ #import "common.h" #import "GNUstepBase/GSLock.h" #import "GNUstepBase/NSMutableString+GNUstepBase.h" #import "Foundation/NSAttributedString.h" #import "Foundation/NSException.h" #import "Foundation/NSRange.h" #import "Foundation/NSArray.h" #import "Foundation/NSInvocation.h" #import "Foundation/NSLock.h" #import "Foundation/NSProxy.h" #import "Foundation/NSThread.h" #import "Foundation/NSNotification.h" #define SANITY_CHECKS 0 @interface GSAttributedString : NSAttributedString { NSString *_textChars; NSMutableArray *_infoArray; } - (id) initWithString: (NSString*)aString attributes: (NSDictionary*)attributes; - (NSString*) string; - (NSDictionary*) attributesAtIndex: (NSUInteger)index effectiveRange: (NSRange*)aRange; @end @interface GSMutableAttributedString : NSMutableAttributedString { NSMutableString *_textChars; NSMutableArray *_infoArray; NSString *_textProxy; } - (id) initWithString: (NSString*)aString attributes: (NSDictionary*)attributes; - (NSString*) string; - (NSDictionary*) attributesAtIndex: (NSUInteger)index effectiveRange: (NSRange*)aRange; - (void) setAttributes: (NSDictionary*) attributes range: (NSRange)range; - (void) replaceCharactersInRange: (NSRange)range withString: (NSString*)aString; @end static BOOL adding; /* When caching attributes we make a shallow copy of the dictionary cached, * so that it is immutable and safe to cache. * However, we have a potential problem if the objects within the attributes * dictionary are themselves mutable, and something mutates them while they * are in the cache. In this case we could items added while different and * then mutated to have the same contents, so we would not know which of * the equal dictionaries to remove. * The solution is to require dictionaries to be identical for removal. */ static inline BOOL cacheEqual(id A, id B) { if (YES == adding) return [A isEqualToDictionary: B]; else return A == B; } #define GSI_MAP_RETAIN_KEY(M, X) #define GSI_MAP_RELEASE_KEY(M, X) #define GSI_MAP_RETAIN_VAL(M, X) #define GSI_MAP_RELEASE_VAL(M, X) #define GSI_MAP_EQUAL(M, X,Y) cacheEqual((X).obj, (Y).obj) #define GSI_MAP_KTYPES GSUNION_OBJ #define GSI_MAP_VTYPES GSUNION_NSINT #define GSI_MAP_NOCLEAN 1 #include "GNUstepBase/GSIMap.h" static NSLock *attrLock = nil; static GSIMapTable_t attrMap; static SEL lockSel; static SEL unlockSel; static IMP lockImp; static IMP unlockImp; #define ALOCK() if (attrLock != nil) (*lockImp)(attrLock, lockSel) #define AUNLOCK() if (attrLock != nil) (*unlockImp)(attrLock, unlockSel) @class GSCachedDictionary; @interface GSCachedDictionary : NSDictionary // Help the compiler @end @protocol GSCachedDictionary - (void) _uncache; @end /* Add a dictionary to the cache - if it was not already there, return * the copy added to the cache, if it was, count it and return retained * object that was there. */ static NSDictionary* cacheAttributes(NSDictionary *attrs) { if (nil != attrs) { GSIMapNode node; ALOCK(); adding = YES; node = GSIMapNodeForKey(&attrMap, (GSIMapKey)((id)attrs)); if (node == 0) { /* Shallow copy of dictionary, without copying objects .... * result in an immutable dictionary that can safely be cached. */ attrs = [(NSDictionary*)[GSCachedDictionary alloc] initWithDictionary: attrs copyItems: NO]; GSIMapAddPair(&attrMap, (GSIMapKey)((id)attrs), (GSIMapVal)(NSUInteger)1); } else { node->value.nsu++; attrs = node->key.obj; } AUNLOCK(); } return attrs; } /* Decrement the count of a dictionary in the cache and release it. * If the count goes to zero, remove it from the cache. */ static void unCacheAttributes(NSDictionary *attrs) { if (nil != attrs) { GSIMapBucket bucket; id removed = nil; ALOCK(); adding = NO; bucket = GSIMapBucketForKey(&attrMap, (GSIMapKey)((id)attrs)); if (bucket != 0) { GSIMapNode node; node = GSIMapNodeForKeyInBucket(&attrMap, bucket, (GSIMapKey)((id)attrs)); if (node != 0) { if (--node->value.nsu == 0) { removed = node->key.obj; GSIMapRemoveNodeFromMap(&attrMap, bucket, node); GSIMapFreeNode(&attrMap, node); } } } AUNLOCK(); if (nil != removed) { [removed _uncache]; } } } @interface GSAttrInfo : NSObject { @public unsigned loc; NSDictionary *attrs; } + (GSAttrInfo*) newWithZone: (NSZone*)z value: (NSDictionary*)a at: (unsigned)l; @end @implementation GSAttrInfo + (void) initialize { if (nil == attrLock) { attrLock = [NSLock new]; lockSel = @selector(lock); unlockSel = @selector(unlock); lockImp = [attrLock methodForSelector: lockSel]; unlockImp = [attrLock methodForSelector: unlockSel]; GSIMapInitWithZoneAndCapacity(&attrMap, NSDefaultMallocZone(), 32); } } /* * Called to record attributes at a particular location - the given attributes * dictionary must have been produced by 'cacheAttributes()' so that it is * already copied/retained and this method doesn't need to do it. */ + (GSAttrInfo*) newWithZone: (NSZone*)z value: (NSDictionary*)a at: (unsigned)l; { GSAttrInfo *info = (GSAttrInfo*)NSAllocateObject(self, 0, z); info->loc = l; info->attrs = cacheAttributes(a); return info; } - (void) dealloc { [self finalize]; [super dealloc]; } - (NSString*) description { return [NSString stringWithFormat: @"Attributes at %u are - %@", loc, attrs]; } - (void) encodeWithCoder: (NSCoder*)aCoder { [aCoder encodeValueOfObjCType: @encode(unsigned) at: &loc]; [aCoder encodeValueOfObjCType: @encode(id) at: &attrs]; } - (void) finalize { unCacheAttributes(attrs); attrs = nil; } - (id) initWithCoder: (NSCoder*)aCoder { NSDictionary *a; [aCoder decodeValueOfObjCType: @encode(unsigned) at: &loc]; a = [aCoder decodeObject]; attrs = cacheAttributes(a); return self; } - (id) replacementObjectForPortCoder: (NSPortCoder*)aCoder { return self; } @end @implementation GSAttributedString static GSAttrInfo *blank; static Class infCls = 0; static SEL infSel; static SEL addSel; static SEL cntSel; static SEL insSel; static SEL oatSel; static SEL remSel; static IMP infImp; static void (*addImp)(NSMutableArray*,SEL,id); static unsigned (*cntImp)(NSArray*,SEL); static void (*insImp)(NSMutableArray*,SEL,id,unsigned); static IMP oatImp; static void (*remImp)(NSMutableArray*,SEL,unsigned); #define NEWINFO(Z,O,L) ((*infImp)(infCls, infSel, (Z), (O), (L))) #define ADDOBJECT(O) ((*addImp)(_infoArray, addSel, (O))) #define INSOBJECT(O,I) ((*insImp)(_infoArray, insSel, (O), (I))) #define OBJECTAT(I) ((*oatImp)(_infoArray, oatSel, (I))) #define REMOVEAT(I) ((*remImp)(_infoArray, remSel, (I))) static void _setAttributesFrom( NSAttributedString *attributedString, NSRange aRange, NSMutableArray *_infoArray) { NSZone *z = [_infoArray zone]; NSRange range; NSDictionary *attr; GSAttrInfo *info; unsigned loc; /* * remove any old attributes of the string. */ [_infoArray removeAllObjects]; if (aRange.length == 0) { attr = blank->attrs; range = aRange; /* Set to satisfy the loop condition below. */ } else { attr = [attributedString attributesAtIndex: aRange.location effectiveRange: &range]; } info = NEWINFO(z, attr, 0); ADDOBJECT(info); RELEASE(info); while ((loc = NSMaxRange(range)) < NSMaxRange(aRange)) { attr = [attributedString attributesAtIndex: loc effectiveRange: &range]; info = NEWINFO(z, attr, loc - aRange.location); ADDOBJECT(info); RELEASE(info); } } inline static NSDictionary* _attributesAtIndexEffectiveRange( unsigned int index, NSRange *aRange, unsigned int tmpLength, NSMutableArray *_infoArray, unsigned int *foundIndex) { unsigned low, high, used, cnt, nextLoc; GSAttrInfo *found = nil; used = (*cntImp)(_infoArray, cntSel); NSCAssert(used > 0, NSInternalInconsistencyException); high = used - 1; if (index >= tmpLength) { if (index == tmpLength) { found = OBJECTAT(high); if (foundIndex != 0) { *foundIndex = high; } if (aRange != 0) { aRange->location = found->loc; aRange->length = tmpLength - found->loc; } return found->attrs; } [NSException raise: NSRangeException format: @"index is out of range in function " @"_attributesAtIndexEffectiveRange()"]; } /* * Binary search for efficiency in huge attributed strings */ low = 0; while (low <= high) { cnt = (low + high) / 2; found = OBJECTAT(cnt); if (found->loc > index) { high = cnt - 1; } else { if (cnt >= used - 1) { nextLoc = tmpLength; } else { GSAttrInfo *inf = OBJECTAT(cnt + 1); nextLoc = inf->loc; } if (found->loc == index || index < nextLoc) { //Found if (aRange != 0) { aRange->location = found->loc; aRange->length = nextLoc - found->loc; } if (foundIndex != 0) { *foundIndex = cnt; } return found->attrs; } else { low = cnt + 1; } } } NSCAssert(NO,@"Error in binary search algorithm"); return nil; } + (void) initialize { if (infCls == 0) { NSMutableArray *a; NSDictionary *d; infSel = @selector(newWithZone:value:at:); addSel = @selector(addObject:); cntSel = @selector(count); insSel = @selector(insertObject:atIndex:); oatSel = @selector(objectAtIndex:); remSel = @selector(removeObjectAtIndex:); infCls = [GSAttrInfo class]; infImp = [infCls methodForSelector: infSel]; d = [NSDictionary new]; blank = NEWINFO(NSDefaultMallocZone(), d, 0); [[NSObject leakAt: &blank] release]; RELEASE(d); a = [NSMutableArray allocWithZone: NSDefaultMallocZone()]; a = [a initWithCapacity: 1]; addImp = (void (*)(NSMutableArray*,SEL,id))[a methodForSelector: addSel]; cntImp = (unsigned (*)(NSArray*,SEL))[a methodForSelector: cntSel]; insImp = (void (*)(NSMutableArray*,SEL,id,unsigned)) [a methodForSelector: insSel]; oatImp = [a methodForSelector: oatSel]; remImp = (void (*)(NSMutableArray*,SEL,unsigned)) [a methodForSelector: remSel]; RELEASE(a); } [[NSObject leakAt: &attrLock] release]; } - (id) initWithString: (NSString*)aString attributes: (NSDictionary*)attributes { NSZone *z = [self zone]; if (nil == aString) { [NSException raise: NSInvalidArgumentException format: @"aString object passed to -[GSAttributedString initWithString:attributes:] is nil"]; } if (![aString respondsToSelector: @selector(length)]) { [NSException raise: NSInvalidArgumentException format: @"aString object passed to -[GSAttributedString initWithString:attributes:] does not respond to -length"]; } _infoArray = [[NSMutableArray allocWithZone: z] initWithCapacity: 1]; if (aString != nil && [aString isKindOfClass: [NSAttributedString class]]) { NSAttributedString *as = (NSAttributedString*)aString; unsigned len; aString = [as string]; len = [aString length]; _setAttributesFrom(as, NSMakeRange(0, len), _infoArray); } else { GSAttrInfo *info; if (attributes == nil) { attributes = blank->attrs; } info = NEWINFO(z, attributes, 0); ADDOBJECT(info); RELEASE(info); } if (aString == nil) _textChars = @""; else _textChars = [aString copyWithZone: z]; return self; } - (NSString*) string { return AUTORELEASE([_textChars copyWithZone: NSDefaultMallocZone()]); } - (NSDictionary*) attributesAtIndex: (NSUInteger)index effectiveRange: (NSRange*)aRange { return _attributesAtIndexEffectiveRange( index, aRange, [_textChars length], _infoArray, NULL); } - (void) dealloc { RELEASE(_textChars); RELEASE(_infoArray); [super dealloc]; } // The superclass implementation is correct but too slow - (NSUInteger) length { return [_textChars length]; } @end @implementation GSMutableAttributedString #if SANITY_CHECKS #define SANITY() [self _sanity] #else #define SANITY() #endif /* We always compile in this method so that it is available from * regression test cases. */ - (void) _sanity { GSAttrInfo *info; unsigned i; unsigned l = 0; unsigned len = [_textChars length]; unsigned c = (*cntImp)(_infoArray, cntSel); NSAssert(c > 0, NSInternalInconsistencyException); info = OBJECTAT(0); NSAssert(info->loc == 0, NSInternalInconsistencyException); for (i = 1; i < c; i++) { info = OBJECTAT(i); NSAssert(info->loc > l, NSInternalInconsistencyException); NSAssert(info->loc < len, NSInternalInconsistencyException); l = info->loc; } } + (void) initialize { [GSAttributedString class]; // Ensure immutable class is initialised } - (id) initWithString: (NSString*)aString attributes: (NSDictionary*)attributes { NSZone *z = [self zone]; if (nil == aString) { [NSException raise: NSInvalidArgumentException format: @"aString object passed to -[GSAttributedString initWithString:attributes:] is nil"]; } if (![aString respondsToSelector: @selector(length)]) { [NSException raise: NSInvalidArgumentException format: @"aString object passed to -[GSAttributedString initWithString:attributes:] does not respond to -length"]; } _infoArray = [[NSMutableArray allocWithZone: z] initWithCapacity: 1]; if (aString != nil && [aString isKindOfClass: [NSAttributedString class]]) { NSAttributedString *as = (NSAttributedString*)aString; aString = [as string]; _setAttributesFrom(as, NSMakeRange(0, [aString length]), _infoArray); } else { GSAttrInfo *info; if (attributes == nil) { attributes = blank->attrs; } info = NEWINFO(z, attributes, 0); ADDOBJECT(info); RELEASE(info); } /* WARNING ... NSLayoutManager depends on the fact that we create the * _textChars instance variable by copying the aString argument to get * its own string subclass into the attributed string. */ if (aString == nil) _textChars = [[NSMutableString allocWithZone: z] init]; else _textChars = [aString mutableCopyWithZone: z]; SANITY(); return self; } - (NSString*) string { /* NB. This method is SUPPOSED to return a proxy to the mutable string! * This is a performance feature documented ifor OSX. */ if (_textProxy == nil) { _textProxy = [[_textChars immutableProxy] retain]; } return _textProxy; } - (NSDictionary*) attributesAtIndex: (NSUInteger)index effectiveRange: (NSRange*)aRange { unsigned dummy; return _attributesAtIndexEffectiveRange( index, aRange, [_textChars length], _infoArray, &dummy); } /* * Primitive method! Sets attributes and values for a given range of * characters, replacing any previous attributes and values for that * range. * * Sets the attributes for the characters in aRange to attributes. * These new attributes replace any attributes previously associated * with the characters in aRange. Raises an NSRangeException if any * part of aRange lies beyond the end of the receiver's characters. * See also: - addAtributes: range: , - removeAttributes: range: */ - (void) setAttributes: (NSDictionary*)attributes range: (NSRange)range { unsigned tmpLength; unsigned arrayIndex = 0; unsigned arraySize; // Initial value unused; set by _attributesAtIndexEffectiveRange NSRange effectiveRange = NSMakeRange(NSNotFound, 0); unsigned afterRangeLoc, beginRangeLoc; NSDictionary *attrs; NSZone *z = [self zone]; GSAttrInfo *info; if (range.length == 0) { NSWarnMLog(@"Attempt to set attribute for zero-length range"); return; } if (attributes == nil) { attributes = blank->attrs; } SANITY(); tmpLength = [_textChars length]; GS_RANGE_CHECK(range, tmpLength); arraySize = (*cntImp)(_infoArray, cntSel); beginRangeLoc = range.location; afterRangeLoc = NSMaxRange(range); if (afterRangeLoc < tmpLength) { /* * Locate the first range that extends beyond our range. */ attrs = _attributesAtIndexEffectiveRange( afterRangeLoc, &effectiveRange, tmpLength, _infoArray, &arrayIndex); if (attrs == attributes) { /* The located range has the same attributes as us - so we can * extend our range to include it. */ if (effectiveRange.location < beginRangeLoc) { beginRangeLoc = effectiveRange.location; } if (NSMaxRange(effectiveRange) > afterRangeLoc) { afterRangeLoc = NSMaxRange(effectiveRange); } } else if (effectiveRange.location > beginRangeLoc) { /* * The located range also starts at or after our range. */ info = OBJECTAT(arrayIndex); info->loc = afterRangeLoc; arrayIndex--; } else if (NSMaxRange(effectiveRange) > afterRangeLoc) { /* * The located range ends after our range. * Create a subrange to go from our end to the end of the old range. */ info = NEWINFO(z, attrs, afterRangeLoc); arrayIndex++; INSOBJECT(info, arrayIndex); RELEASE(info); arrayIndex--; } } else { arrayIndex = arraySize - 1; } /* * Remove any ranges completely within ours */ while (arrayIndex > 0) { info = OBJECTAT(arrayIndex-1); if (info->loc < beginRangeLoc) break; REMOVEAT(arrayIndex); arrayIndex--; } /* * Use the location/attribute info in the current slot if possible, * otherwise, add a new slot and use that. */ info = OBJECTAT(arrayIndex); if (info->loc >= beginRangeLoc) { info->loc = beginRangeLoc; if (info->attrs != attributes) { unCacheAttributes(info->attrs); info->attrs = cacheAttributes(attributes); } } else if (info->attrs != attributes) { arrayIndex++; info = NEWINFO(z, attributes, beginRangeLoc); INSOBJECT(info, arrayIndex); RELEASE(info); } SANITY(); } - (void) replaceCharactersInRange: (NSRange)range withString: (NSString*)aString { unsigned tmpLength; unsigned arrayIndex = 0; unsigned arraySize; // Initial value unused; set by _attributesAtIndexEffectiveRange NSRange effectiveRange = NSMakeRange(NSNotFound, 0); GSAttrInfo *info; int moveLocations; unsigned start; SANITY(); if (aString == nil) { aString = @""; } tmpLength = [_textChars length]; GS_RANGE_CHECK(range, tmpLength); if (range.location == tmpLength) { /* * Special case - replacing a zero length string at the end * simply appends the new string and attributes are inherited. */ [_textChars appendString: aString]; goto finish; } arraySize = (*cntImp)(_infoArray, cntSel); if (arraySize == 1) { /* * Special case - if the string has only one set of attributes * then the replacement characters will get them too. */ [_textChars replaceCharactersInRange: range withString: aString]; goto finish; } /* * Get the attributes to associate with our replacement string. * Should be those of the first character replaced. * If the range replaced is empty, we use the attributes of the * previous character (if possible). */ if (range.length == 0 && range.location > 0) start = range.location - 1; else start = range.location; _attributesAtIndexEffectiveRange(start, &effectiveRange, tmpLength, _infoArray, &arrayIndex); moveLocations = [aString length] - range.length; arrayIndex++; if (NSMaxRange(effectiveRange) < NSMaxRange(range)) { /* * Remove all range info for ranges enclosed within the one * we are replacing. Adjust the start point of a range that * extends beyond ours. */ info = OBJECTAT(arrayIndex); if (info->loc < NSMaxRange(range)) { unsigned int next = arrayIndex + 1; while (next < arraySize) { GSAttrInfo *n = OBJECTAT(next); if (n->loc <= NSMaxRange(range)) { REMOVEAT(arrayIndex); arraySize--; info = n; } else { break; } } } if (NSMaxRange(range) < [_textChars length]) { info->loc = NSMaxRange(range); } else { REMOVEAT(arrayIndex); arraySize--; } } /* * If we are replacing a range with a zero length string and the * range we are using matches the range replaced, then we must * remove it from the array to avoid getting a zero length range. */ if ((moveLocations + range.length) == 0) { _attributesAtIndexEffectiveRange(start, &effectiveRange, tmpLength, _infoArray, &arrayIndex); arrayIndex++; if (effectiveRange.location == range.location && effectiveRange.length == range.length) { arrayIndex--; if (arrayIndex != 0 || arraySize > 1) { REMOVEAT(arrayIndex); arraySize--; } else { info = OBJECTAT(0); unCacheAttributes(info->attrs); info->attrs = cacheAttributes(blank->attrs); info->loc = NSMaxRange(range); } } } /* * Now adjust the positions of the ranges following the one we are using. */ while (arrayIndex < arraySize) { info = OBJECTAT(arrayIndex); info->loc += moveLocations; arrayIndex++; } [_textChars replaceCharactersInRange: range withString: aString]; finish: SANITY(); } - (void) dealloc { [_textProxy release]; RELEASE(_textChars); RELEASE(_infoArray); [super dealloc]; } // The superclass implementation is correct but too slow - (NSUInteger) length { return [_textChars length]; } @end @interface NSGAttributedString : NSAttributedString @end @implementation NSGAttributedString - (id) initWithCoder: (NSCoder*)aCoder { NSLog(@"Warning - decoding archive containing obsolete %@ object - please delete/replace this archive", NSStringFromClass([self class])); DESTROY(self); self = (id)NSAllocateObject([GSAttributedString class], 0, NSDefaultMallocZone()); self = [self initWithCoder: aCoder]; return self; } @end @interface NSGMutableAttributedString : NSMutableAttributedString @end @implementation NSGMutableAttributedString - (id) initWithCoder: (NSCoder*)aCoder { NSLog(@"Warning - decoding archive containing obsolete %@ object - please delete/replace this archive", NSStringFromClass([self class])); DESTROY(self); self = (id)NSAllocateObject([GSMutableAttributedString class], 0, NSDefaultMallocZone()); self = [self initWithCoder: aCoder]; return self; } @end gnustep-base-1.29.0/Source/GSAvahiClient.h000066400000000000000000000034501435650067400202460ustar00rootroot00000000000000/* Interface for avahi-client behaviour used by NSNetServices. Copyright (C) 2010 Free Software Foundation, Inc. Written by: Niels Grewe Date: March 2010 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "GSAvahiRunLoopIntegration.h" @interface GSAvahiClient: NSObject { id _delegate; void *_unused; void *_reserved; GSAvahiRunLoopContext *ctx; void *_client; NSRecursiveLock *_lock; } + (int) netServicesErrorForAvahiError: (int)errNo; - (void*) client; - (id) initWithRunLoop: (NSRunLoop*)rl forMode: (NSString*)mode; - (void) setupClientWithFlags: (int)flags andReportError: (int*)error; - (void) setState: (int)theState forClient: (void*)cl; - (void) scheduleInRunLoop: (NSRunLoop*)rl forMode: (NSString*)mode; - (void) removeFromRunLoop: (NSRunLoop*)rl forMode: (NSString*)mode; - (void) handleError: (int)errNo; - (void) setDelegate: (id)delegate; - (id) delegate; - (NSDictionary*) errorDictWithErrorCode: (int) error; @end gnustep-base-1.29.0/Source/GSAvahiClient.m000066400000000000000000000157761435650067400202710ustar00rootroot00000000000000/* Classes for avahi-client behaviour used by NSNetServices. Copyright (C) 2010 Free Software Foundation, Inc. Written by: Niels Grewe Date: March 2010 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "GSAvahiClient.h" #import "Foundation/NSNetServices.h" #import "Foundation/NSDebug.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSValue.h" #include #include static void GSAvahiClientState(AvahiClient *client, AvahiClientState state, void *userInfo) { [(GSAvahiClient*)userInfo setState: state forClient: client]; } @implementation GSAvahiClient /** * * */ + (int)netServicesErrorForAvahiError: (int)errorCode { switch(errorCode) { case AVAHI_ERR_INVALID_HOST_NAME: case AVAHI_ERR_INVALID_DOMAIN_NAME: case AVAHI_ERR_INVALID_TTL: case AVAHI_ERR_IS_PATTERN: case AVAHI_ERR_INVALID_RECORD: case AVAHI_ERR_INVALID_SERVICE_NAME: case AVAHI_ERR_INVALID_SERVICE_TYPE: case AVAHI_ERR_INVALID_PORT: case AVAHI_ERR_INVALID_KEY: case AVAHI_ERR_INVALID_ADDRESS: case AVAHI_ERR_INVALID_SERVICE_SUBTYPE: case AVAHI_ERR_BAD_STATE: case AVAHI_ERR_INVALID_FLAGS: return NSNetServicesBadArgumentError; case AVAHI_ERR_TIMEOUT: return NSNetServicesTimeoutError; case AVAHI_ERR_NO_NETWORK: case AVAHI_ERR_OS: case AVAHI_ERR_INVALID_CONFIG: case AVAHI_ERR_DBUS_ERROR: case AVAHI_ERR_DISCONNECTED: case AVAHI_ERR_NO_DAEMON: case AVAHI_ERR_NO_MEMORY: case AVAHI_ERR_INVALID_INTERFACE: case AVAHI_ERR_INVALID_PROTOCOL: case AVAHI_ERR_TOO_MANY_CLIENTS: case AVAHI_ERR_TOO_MANY_OBJECTS: case AVAHI_ERR_TOO_MANY_ENTRIES: case AVAHI_ERR_ACCESS_DENIED: return NSNetServicesUnknownError; case AVAHI_ERR_NOT_FOUND: return NSNetServicesNotFoundError; case AVAHI_ERR_INVALID_OPERATION: case AVAHI_ERR_INVALID_OBJECT: case AVAHI_ERR_VERSION_MISMATCH: return NSNetServicesInvalidError; case AVAHI_ERR_COLLISION: return NSNetServicesCollisionError; } return NSNetServicesUnknownError; } - (id) avahiClientInitWithRunLoop: (NSRunLoop*)rl forMode: (NSString*)mode { int avahiError = 0; if ( nil == (self = [super init])) { return nil; } _lock = [[NSRecursiveLock alloc] init]; ctx = [[GSAvahiRunLoopContext alloc] initWithRunLoop: rl forMode: mode]; // NOTE: Not setting the AVAHI_CLIENT_NO_FAIL flag mimicks the behaviour of // the DNS-SD compatability code. We will set it subsequently if the avahi // server goes away while we are running. [self setupClientWithFlags: 0 andReportError: &avahiError]; if (avahiError) { [self handleError: avahiError]; } return self; } - (id) initWithRunLoop: (NSRunLoop*)rl forMode: (NSString*)mode { self = [self avahiClientInitWithRunLoop: rl forMode: mode]; return self; } - (id) avahiClientInit { return [self avahiClientInitWithRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode]; } - (id) init { self = [self avahiClientInit]; return self; } - (void*) client { return _client; } - (void) freeClient { if (_client != NULL) { [_lock lock]; if (_client != NULL) { avahi_client_free((AvahiClient*)_client); _client = NULL; } [_lock unlock]; } } - (void) setupClientWithFlags: (int)flags andReportError: (int*)errNo { if (errNo != NULL) { *errNo = 0; } if (_client == NULL) { [_lock lock]; if (_client == NULL) { _client = (void*)avahi_client_new([ctx avahiPoll], (AvahiClientFlags)flags, GSAvahiClientState, (void*)self, errNo); } [_lock unlock]; } } - (id) delegate { return _delegate; } - (void) setState: (int)theState forClient: (void*)cl { if (cl == _client) { NSLog(@"Client entered state: %d",theState); if (theState == AVAHI_CLIENT_FAILURE) { [self handleError: avahi_client_errno((AvahiClient*)cl)]; } } } - (void) scheduleInRunLoop: (NSRunLoop*)rl forMode: (NSString*)mode { [ctx scheduleInRunLoop: rl forMode: mode]; } - (void) removeFromRunLoop: (NSRunLoop*)rl forMode: (NSString*)mode { [ctx removeFromRunLoop: rl forMode: mode]; } - (void) setDelegate: (id)aDelegate { _delegate = aDelegate; } - (void) avahiClientHandleError: (int)errNo { AvahiClientState state = 0; NSDebugLog(@"Error: %s", avahi_strerror(errNo)); // Try to reconnect (in case the server did simply restart.) if (_client != NULL) { state = avahi_client_get_state((AvahiClient*)_client); } else { return; } if (state == AVAHI_CLIENT_FAILURE) { [_lock lock]; if (_client != NULL) { state = avahi_client_get_state((AvahiClient*)_client); } else { [_lock unlock]; return; } if (state == AVAHI_CLIENT_FAILURE) { /* If the daemon failed, we need to remove timers and watchers * from the runloop, because the dbus internals underlying the * avahi-client api will have changed for the new connection to * the avahi-daemon: */ NSRunLoop *rl = [ctx runLoop]; NSString *mode = [[ctx mode] retain]; [ctx removeFromRunLoop: rl forMode: mode]; [self freeClient]; [ctx scheduleInRunLoop: rl forMode: mode]; [mode release]; [self setupClientWithFlags: AVAHI_CLIENT_NO_FAIL andReportError: NULL]; } [_lock unlock]; } } - (void) handleError: (int)errNo { [self avahiClientHandleError: errNo]; } - (NSDictionary*) errorDictWithErrorCode: (int)errorCode { NSMutableDictionary *dictionary = nil; int error = 0; dictionary = [NSMutableDictionary dictionary]; error = [[self class] netServicesErrorForAvahiError: errorCode]; [dictionary setObject: [NSNumber numberWithInt: error] forKey: NSNetServicesErrorCode]; [dictionary setObject: self forKey: NSNetServicesErrorDomain]; return dictionary; // autorelease'd } - (void) avahiClientDealloc { [ctx removeFromRunLoop: [ctx runLoop] forMode: [ctx mode]]; [self freeClient]; [ctx release]; [_lock release]; } - (void) dealloc { [self avahiClientDealloc]; [super dealloc]; } @end gnustep-base-1.29.0/Source/GSAvahiNetService.m000066400000000000000000001546751435650067400211240ustar00rootroot00000000000000/* Concrete NSNetService subclass using the avahi API. Copyright (C) 2010 Free Software Foundation, Inc. Written by: Niels Grewe Date: March 2010 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "GSNetServices.h" #import "GSAvahiClient.h" #import "GNUstepBase/NSNetServices+GNUstepBase.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSData.h" #import "Foundation/NSValue.h" #import "Foundation/NSMapTable.h" #import "Foundation/NSDebug.h" #import "Foundation/NSLock.h" #import "Foundation/NSException.h" #import "GNUstepBase/GSObjCRuntime.h" #import #include #include #include #include #include #include #include #include /* Specifies the time we allow for consecutive updates on a specific record type * to accumulate before the delegate is notified. Avahi seems to run some * internal timers set to one second, so we choose a slightly greater interval * to be sure that they did already fire in a simple remove/insert sequence. */ #define BROWSER_UPDATE_INTERVAL 1.1 /* Suggested by the mDNS RFC, but we only use the latter since this is * NSNet_Service_ and not NSNet_Host_! */ #define DEFAULT_HOST_RECORD_TTL 120 #define DEFAULT_OTHER_RECORD_TTL 4500 @interface GSAvahiNetService (GSAvahiNetServicePrivate) - (void) newData: (NSData*)data forRRCode: (NSUInteger)rrCode; - (void) removedData: (NSData*)data forRRCode: (NSUInteger)rrCode; - (void) allForNowForRRCode: (NSUInteger)rrCode; - (void) entryGroup: (AvahiEntryGroup*)group enteredState: (AvahiEntryGroupState)state; - (void) avahiResolver: (AvahiServiceResolver*)resolver foundServiceWithName: (NSString*)name type: (NSString*)type domain: (NSString*)domain hostName: (NSString*)hostName address: (NSData*)address port: (NSInteger)port txtRecord: (NSData*)txtData ifIndex: (AvahiIfIndex)ifIndex protocol: (AvahiProtocol)protocol; - (void) handleError: (int)error forRRCode: (int)rrcode; - (void) handleError: (int)error; // Methods from the GSAvahiClient behaviour: - (id) avahiClientInit; - (void) avahiClientHandleError: (int)error; - (void) avahiClientDealloc; - (NSDictionary*) errorDictWithErrorCode: (int)error; @end /** * Return the NSString corresponding to the specified resource record code. */ static NSString* NSStringFromRRCode(NSUInteger code) { /* NOTE: I still have a comprehensive plist for this in UnboundKit. I'll * import it eventually, but for now, we need just a few rrCodes; */ switch (code) { case 0x01: return @"A"; case 0x02: return @"NS"; case 0x1C: return @"AAAA"; case 0x05: return @"CNAME"; case 0x06: return @"SOA"; case 0x0C: return @"PTR"; case 0x0D: return @"HINFO"; case 0x0F: return @"MX"; case 0x10: return @"TXT"; case 0x21: return @"SRV"; case 0x0A: return @"NULL"; default: return nil; } return nil; } /** * Return the resource record code for the specified resource record name. * FIXME: This is stupid and lame, I'll make it into a static NSDictionary soon: */ static NSUInteger RRCodeFromNSString(NSString* name) { if ([name isEqualToString: @"A"]) { return 0x01; } else if ([name isEqualToString: @"AAAA"]) { return 0x1C; } else if ([name isEqualToString: @"TXT"]) { return 0x10; } else if ([name isEqualToString: @"NULL"]) { return 0x0A; } else if ([name isEqualToString: @"NS"]) { return 0x02; } else if ([name isEqualToString: @"CNAME"]) { return 0x05; } else if ([name isEqualToString: @"SOA"]) { return 0x06; } else if ([name isEqualToString: @"PTR"]) { return 0x0C; } else if ([name isEqualToString: @"HINFO"]) { return 0x0D; } else if ([name isEqualToString: @"MX"]) { return 0x0F; } else if ([name isEqualToString: @"SRV"]) { return 0x21; } return 0x00; } /** * Returns the UTF8 string or NULL, if the string is empty. */ static inline const char* StringOrNullIfEmpty(NSString *domain) { if ((domain != nil) && ![domain isEqualToString: @""]) { return [domain UTF8String]; } return NULL; } /** * Serialize an AvahiStringList into an NSData object. */ static NSData* NSDataFromAvahiStringList(AvahiStringList* list) { /* NOTE: The record is at most 255 bytes, but should we really allocate * 255 bytes on the stack? */ char *buffer = NULL; size_t len = 0; NSData *data = nil; if (list == NULL) { return nil; } /* The avahi documentation on avahi_string_list_serialize() doesn't tell us * this, but called with the arguments below, it just returns the size: */ len = avahi_string_list_serialize(list, NULL, 0); if (len == 0) { return nil; } buffer = malloc(len); // It's better to zero the buffer: memset(buffer, '\0', len); if (buffer == NULL) { // Should we raise an exception? NSDebugLog(@"Couldn't allocate %"PRIuPTR" bytes for txt record", (uintptr_t)len); return nil; } /* Proper serialization of the string list, we ignore the returned length * since we already know it. */ avahi_string_list_serialize(list, buffer, len); data = [NSData dataWithBytes: buffer length: len]; free(buffer); return data; } /** * Try to parse the txtData into an AvahiStringList. Returns 0 on * success. */ static int GSAvahiStringListFromNSData(NSData *txtData, AvahiStringList **list) { if (nil != txtData) { const void *bytes = [txtData bytes]; size_t len = [txtData length]; return avahi_string_list_parse(bytes, len, list); } return -1; } /** * Creates an NSData object (wrapping a struct * sockaddr_storage) from the necessary Avahi data structures. */ static NSData* NSDataFromAvahiAddressPortAndInterface(const AvahiAddress *addr, uint16_t port, AvahiIfIndex iface) { struct sockaddr_storage s; size_t s_len = sizeof(struct sockaddr_storage); if ((addr->proto != AVAHI_PROTO_INET) && (addr->proto != AVAHI_PROTO_INET6)) { //We can't fill the struct if AVAHI_PROTO_UNSPEC return nil; } // POSIX says we shall zero the structure: memset(&s, '\0', s_len); if (addr->proto == AVAHI_PROTO_INET) { struct sockaddr_in *s4 = (struct sockaddr_in*)&s; // The address is already in network byte-order. struct in_addr a; a.s_addr = addr->data.ipv4.address; s4->sin_family = AF_INET; s4->sin_port = htons(port); s4->sin_addr = a; } else if (addr->proto == AVAHI_PROTO_INET6) { struct sockaddr_in6 *s6 = (struct sockaddr_in6*)&s; struct in6_addr a; // Copy the address from the avahi structure to in6_addr: memcpy(&(a.s6_addr), &(addr->data.ipv6.address), 16); s6->sin6_family = AF_INET6; s6->sin6_port = htons(port); s6->sin6_addr = a; if (IN6_IS_ADDR_LINKLOCAL(&a)) { // For a link-local address set the interface index // NOTE: These are implementation-defined but Avahi doesn't seem to // mangle them. s6->sin6_scope_id = iface; } else { // FIXME: Do nothing. The structure was zeroed out. Please pray // that every sensible implementation has 0 for the global // scope. (Most of the time, people will be announcing link-local // addresses, though) } } else { // Shouldn't happen: return nil; } return [NSData dataWithBytes: &s length: s_len]; } /** * Creates an NSData object wrapping a struct * sockaddr_storage from an NSData object that contains a * plain IPv4 or IPv6 address in network byte-order along with the necessary * port, address family and interface * index information. */ static NSData* NSDataWithAddrDataPortFamilyAndIface(NSData *old, NSUInteger port, AvahiProtocol family, AvahiIfIndex index) { AvahiAddress addr; const void *addrBytes; if (old == nil) { return nil; } addr.proto = family; addrBytes = [old bytes]; //Copy the value into the data field: if (family == AVAHI_PROTO_INET) { memcpy(addr.data.data, addrBytes, 4); } else if (family == AVAHI_PROTO_INET6) { memcpy(addr.data.data, addrBytes, 16); } else { return nil; } return NSDataFromAvahiAddressPortAndInterface(&addr, port, index); } /** * This callback function will be called by the Avahi layer for resolver events. */ static void GSAvahiServiceResolverEvent( AvahiServiceResolver *resolver, AvahiIfIndex interface, AvahiProtocol protocol, AvahiResolverEvent event, const char *name, const char *type, const char *domain, const char *hostName, const AvahiAddress *addr, uint16_t port, AvahiStringList *txtRecord, AvahiLookupResultFlags flags, void *userInfo ) { GSAvahiNetService *service = nil; if (NULL == resolver) { NSDebugLog(@"NULL pointer to AvahiServiceResolver."); return; } if (NULL == userInfo) { NSDebugLog(@"NULL pointer to NSNetService."); return; } service = (GSAvahiNetService*)userInfo; switch (event) { case AVAHI_RESOLVER_FAILURE: [service handleError: avahi_client_errno(avahi_service_resolver_get_client(resolver))]; break; case AVAHI_RESOLVER_FOUND: [service avahiResolver: resolver foundServiceWithName: NSStringIfNotNull(name) type: NSStringIfNotNull(type) domain: GSNetServiceDotTerminatedNSStringFromString(domain) hostName: NSStringIfNotNull(hostName) address: NSDataFromAvahiAddressPortAndInterface(addr, port, interface) port: (NSInteger)port txtRecord: NSDataFromAvahiStringList(txtRecord) ifIndex: interface protocol: protocol]; break; } } /** * This callback function will be called by the Avahi layer on events for a * record browser. */ static void GSAvahiRecordBrowserEvent( AvahiRecordBrowser *browser, AvahiIfIndex interface, AvahiProtocol protocol, AvahiBrowserEvent event, const char *name, uint16_t dnsClass, uint16_t type, const void *rdata, size_t size, AvahiLookupResultFlags flags, void *userInfo) { GSAvahiNetService *service = nil; NSData *recordData = nil; if (NULL == browser) { NSDebugLog(@"NULL pointer to AvahiServiceResolver."); return; } if (NULL == userInfo) { NSDebugLog(@"NULL pointer to NSNetService."); return; } service = (GSAvahiNetService*)userInfo; if (type == 0 && (event != AVAHI_BROWSER_FAILURE)) { [service handleError: NSNetServicesInvalidError]; return; } if (rdata != NULL) { recordData = [NSData dataWithBytes: rdata length: size]; } switch (event) { case AVAHI_BROWSER_NEW: [service newData: recordData forRRCode: type]; break; case AVAHI_BROWSER_REMOVE: [service removedData: recordData forRRCode: type]; break; case AVAHI_BROWSER_FAILURE: [service handleError: avahi_client_errno(avahi_record_browser_get_client(browser)) forRRCode: type]; break; case AVAHI_BROWSER_CACHE_EXHAUSTED: // Not interesting break; case AVAHI_BROWSER_ALL_FOR_NOW: [service allForNowForRRCode: type]; break; } } /** * This callback function will be called by the Avahi layer to notify about * state changes in an entry group. */ static void GSAvahiEntryGroupStateChanged(AvahiEntryGroup *group, AvahiEntryGroupState state, void *userInfo) { if (NULL == group) { NSDebugLog(@"NULL pointer to AvahiEntryGroup."); return; } if (NULL == userInfo) { NSDebugLog(@"NULL pointer to NSNetService."); return; } [(GSAvahiNetService*)userInfo entryGroup: group enteredState: state]; } @implementation GSAvahiNetService + (void) initialize { if (self == [GSAvahiNetService class]) { GSObjCAddClassBehavior(self, [GSAvahiClient class]); } } + (NSData *) dataFromTXTRecordDictionary: (NSDictionary *) txtDictionary { // This NULL avahi-string list is the terminating element of the linked // list. AvahiStringList *list = NULL; NSArray *keys = [txtDictionary allKeys]; NSData *data = nil; FOR_IN(NSString*, key, keys) { id value = [txtDictionary objectForKey: key]; if ([value isKindOfClass: [NSString class]]) { list = avahi_string_list_add_pair(list, [key UTF8String], [value UTF8String]); } else if ([value isKindOfClass: [NSNumber class]]) { list = avahi_string_list_add_pair(list, [key UTF8String], [[(NSNumber*)value stringValue] UTF8String]); } else if ([value isKindOfClass: [NSData class]]) { NSUInteger len = [value length]; /* TXT record can only contain 256bytes, so there is no point in * handling NSData values with len > 255. */ if (len <= 255) { list = avahi_string_list_add_pair_arbitrary(list, [key UTF8String], [value bytes], len); } } else { /* We cannot handle any other type of value. We thus free the list * and make sure we fail the subsequent assertion (because this is * what the Apple documentation will do. */ if (list) { avahi_string_list_free(list); list = NULL; } } NSAssert(list,@"Error creating string list for TXT record"); } END_FOR_IN(keys) // Convert string list into a data object: data = NSDataFromAvahiStringList(list); avahi_string_list_free(list); list = NULL; return data; } + (NSDictionary *) dictionaryFromTXTRecordData: (NSData *) txtData { AvahiStringList *list = NULL; int ret = 0; NSMutableDictionary *dict = nil; AvahiStringList *item = NULL; NSAssert(([txtData length] > 0), @"No data to convert to TXT record dictionary"); ret = GSAvahiStringListFromNSData(txtData, &list); // ret == 0 on success. NSAssert(!ret, @"Could not parse TXT data"); if (list == NULL) { // This means the txtData was empty (e.g. only zeros) return nil; } // Autoreleased: dict = [NSMutableDictionary dictionary]; // Use the beginning of the list as the first element to handle: item = list; do { char *key = NULL; char *value = NULL; size_t len = 0; NSString *k = nil; NSData *v = nil; int ret = avahi_string_list_get_pair(item, &key, &value, &len); // ret == 0 indicates success. NSAssert(!ret, @"Could not create TXT record dictionary."); if (key) { k = [NSString stringWithUTF8String: key]; avahi_free(key); } if (value) { v = [NSData dataWithBytes: (void*)value length: len]; avahi_free(value); } else { // If the value is empty, place an empty NSData object in the // dictionary. v = [NSData data]; } NSAssert((k && v),@"Could not create TXT record dictionary"); [dict setObject: v forKey: k]; } while (NULL != (item = avahi_string_list_get_next(item))); avahi_string_list_free(list); return dict; } - (void) netService: (NSNetService*)service didUpdateAddresses: (NSArray*)addresses { if ([[self delegate] respondsToSelector: @selector(netService:didUpdateAddresses:)]) { [(id)[self delegate] netService: service didUpdateAddresses: addresses]; } } - (void) netService: (NSNetService*)service didUpdateRecordData: (id)data forRecordType: (NSString*)rrType { SEL theSelector = NULL; if ([rrType isEqualToString: @"A"] || [rrType isEqualToString: @"AAAA"]) { [self netService: service didUpdateAddresses: [self addresses]]; } theSelector = NSSelectorFromString([NSString stringWithFormat: @"netService:didUpdate%@RecordData:", rrType]); if ([[self delegate] respondsToSelector: theSelector]) { if (([rrType isEqualToString: @"TXT"]) && [data isKindOfClass: [NSArray class]]) { /* * Legacy case for TXT records (user code will always expect NSData, * not NSArray). */ data = [(NSArray*)data lastObject]; } [[self delegate] performSelector: theSelector withObject: service withObject: data]; } else if ([[self delegate] respondsToSelector: @selector(netService:didUpdateRecordData:forRecordType:)]) { [(id)[self delegate] netService: service didUpdateRecordData: data forRecordType: rrType]; } } - (void) netService: (NSNetService*)service didNotMonitor: (NSDictionary*)errorDict forRecordType: (NSString*)rrType { SEL theSelector = NSSelectorFromString([NSString stringWithFormat: @"netService:didNotMonitor%@RecordData:", rrType]); if ([[self delegate] respondsToSelector: theSelector]) { [[self delegate] performSelector: theSelector withObject: service withObject: errorDict]; } } /** * Designated intializer that passes interface index and protocol information * alongside the usual information for a mDNS service. This is used by * GSAvahiNetServiceBrowser which already knows about these. */ - (id) initWithDomain: (NSString*)domain type: (NSString*)type name: (NSString*)name port: (NSInteger)port avahiIfIndex: (AvahiIfIndex)anIfIndex avahiProtocol: (AvahiProtocol)aProtocol { const NSMapTableValueCallBacks valueCallbacks = {NULL, NULL, NULL}; if (nil == (self = [self avahiClientInit])) { return nil; } _infoLock = [[NSRecursiveLock alloc] init]; _info = [[NSMutableDictionary alloc] init]; [_info setObject: domain forKey: @"domain"]; [_info setObject: type forKey: @"type"]; [_info setObject: name forKey: @"name"]; [_info setObject: [NSNumber numberWithInteger: port] forKey: @"port"]; _browsers = NSCreateMapTable(NSIntegerMapKeyCallBacks, valueCallbacks, 10); _browserTimeouts = NSCreateMapTable(NSIntegerMapKeyCallBacks, NSObjectMapValueCallBacks, 10); if (port > 0) { // If port is set to a sensible value in this initializer, we are // initialized to publish and will create the entry group. } _ifIndex = anIfIndex; _protocol = aProtocol; return self; } - (id) initWithDomain: (NSString *) domain type: (NSString *) type name: (NSString *) name avahiIfIndex: (AvahiIfIndex)index avahiProtocol: (AvahiProtocol)proto { return [self initWithDomain: domain type: type name: name port: -1 avahiIfIndex: index avahiProtocol: proto]; } - (id) initWithDomain: (NSString *) domain type: (NSString *) type name: (NSString *) name { return [self initWithDomain: domain type: type name: name port: -1]; } - (id) initWithDomain: (NSString *) domain type: (NSString *) type name: (NSString *) name port: (NSInteger) port { return [self initWithDomain: domain type: type name: name port: port avahiIfIndex: AVAHI_IF_UNSPEC avahiProtocol: AVAHI_PROTO_UNSPEC]; } /** * Stores an object at a key in the info dictionary in a synchronized fashion. * This uses a SeqLock pattern: It obtains the lock associated with the * dictionary, increments a sequence number, performs the operation, increases * the sequence number again, and releases the lock. This way it is garantueed * that the sequence number is odd while an operation is in progress, and even * if it is safe for a reader to obtain the value. */ - (void)setInfoObject: (id)object forKey: (NSString*)key { if ((object == nil) || (key == nil)) { return; } [_infoLock lock]; _infoSeq++; // Now the sequence number is odd: Write in progess. [_info setObject: object forKey: key]; _infoSeq++; // Now the sequence number is even: Can be read [_infoLock unlock]; } /** * Removes an object from the dictionary in a synchronized fashion. Cf. note * about -setInfoObject:forKey:. */ - (void) removeInfoObjectForKey: (NSString*)key { if (key == nil) { return; } [_infoLock lock]; _infoSeq++; // Now the sequence number is odd: Write in progess. [_info removeObjectForKey: key]; _infoSeq++; // Now the sequence number is even: Can be read [_infoLock unlock]; } /** * Thread-safe (and fast) reading of an info key by comparing the sequence * numbers set by the writers. Cf. note about -setInfoObject:forKey:. */ - (id) infoObjectForKey: (NSString*)key { NSUInteger oldSeq = 0; NSUInteger newSeq = 0; BOOL isOdd = NO; id object = nil; if (key == nil) { return nil; } // Try to read the value until the sequence numbers match and are even: do { // Store the sequence number before the read: oldSeq = _infoSeq; // Read the value: object = [_info objectForKey: key]; // Store the sequence number after the read: newSeq = _infoSeq; while ((newSeq == 0) || (oldSeq == 0)) { //Add 2 to prevent (0 % 2) because it's undefined. newSeq = newSeq + 2; oldSeq = oldSeq +2; } isOdd = (BOOL)newSeq % 2; } while ((oldSeq != newSeq) || (isOdd)); return object; } - (NSInteger) port { NSInteger port = [(NSNumber*)[self infoObjectForKey: @"port"] integerValue]; return port ? MAX(port, -1) : -1; } /** * Private method that creates an empty entry group that needs to be filled * before publication. There is no locking here because it will only be called * from methods that already obtained the lock. Returns 0 on success. */ - (int) createEntryGroup { // We only care to publish if the service is still idle: if (_serviceState != GSNetServiceIdle) { [self netService: self didNotPublish: [self errorDictWithErrorCode: NSNetServicesActivityInProgress]]; return NSNetServicesActivityInProgress; } //Create the entry group: if (NULL != _client) { _entryGroup = avahi_entry_group_new((AvahiClient*)_client, GSAvahiEntryGroupStateChanged, (void*)self); } else { // having no _client usually means that avahi-daemon (or dbus) // isn't running, unfortunately there's no precise errNo at this point // so we're providing just our best guess return AVAHI_ERR_NO_DAEMON; } // Handle error: if (NULL == _entryGroup) { int error = avahi_client_errno((AvahiClient*)_client); [self handleError: error]; return error; } return 0; } /** * Private method to commit an entry group to the network. The entry group * cannot be modified afterwards. There is no locking here because it will only * be called from methods that already obtained the lock. Notifies the delegate * on error or success. */ - (void)commitEntryGroup { _serviceState = GSNetServicePublishing; // Make sure there is an entry group to commit: if (_entryGroup != NULL) { // Make sure it is not empty: if (!avahi_entry_group_is_empty((AvahiEntryGroup*)_entryGroup)) { // Make sure it is not already committed: if (avahi_entry_group_get_state((AvahiEntryGroup*)_entryGroup) == AVAHI_ENTRY_GROUP_UNCOMMITED) { avahi_entry_group_commit((AvahiEntryGroup*)_entryGroup); [self netServiceWillPublish: self]; return; } else { // The entryGroup is active: [self handleError: NSNetServicesActivityInProgress]; return; } } } // The entryGroup is not properly set up for publication: [self handleError: NSNetServicesBadArgumentError]; return; } /** * Private method to add a service entry to the entry group. Will only be called * from methods that already ensure that the entry can be added safely. */ - (int) addServiceEntry { int ret = 0; const char* d = StringOrNullIfEmpty([self infoObjectForKey: @"domain"]); // It is possible that the TXT record has already been set, so we can // publish it right away: AvahiStringList *list = NULL; NSData *txtData = [self infoObjectForKey: @"TXT"]; int res = 0; res = GSAvahiStringListFromNSData(txtData, &list); if (0 != res) { if (NULL != list) { avahi_string_list_free(list); list = NULL; } } ret = avahi_entry_group_add_service_strlst((AvahiEntryGroup*)_entryGroup, _ifIndex, _protocol, 0, // Flags, we don't need them [(NSString*)[self infoObjectForKey: @"name"] UTF8String], [(NSString*)[self infoObjectForKey: @"type"] UTF8String], d, // Domain (might be NULL for default) NULL, // The hostname is filled automatically [[self infoObjectForKey: @"port"] integerValue], list // Possibly empty TXT record ); if (NULL != list) { // If we are not using the emptyList from the stack, we need to free the // list that avahi created for us. avahi_string_list_free(list); } return ret; } - (BOOL) addServiceRecordWithOptions: (NSNetServiceOptions)options { int ret = 0; [_lock lock]; if (_serviceState != GSNetServiceIdle) { [_lock unlock]; return NO; } if (_entryGroup == NULL) { if (0 != [self createEntryGroup]) { [_lock unlock]; return NO; } } if (options & NSNetServiceListenForConnections) { GSServerStream *serverStream; NSInteger port; /* setup server socket first, as port is required in * -[self addServiceEntry] (see below) */ port = [self port]; if (port < 0) { port = 0; } serverStream = [GSServerStream serverStreamToAddr: @"" port: port]; if (serverStream != nil) { [serverStream setDelegate:self]; [serverStream open]; if ([serverStream streamStatus] != NSStreamStatusOpen) { ret = 1; } else { NSNumber *portNumber; [serverStream scheduleInRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode]; [self setInfoObject: serverStream forKey: @"serverStream"]; portNumber = [serverStream propertyForKey: GSStreamLocalPortKey]; [self setInfoObject: portNumber forKey: @"port"]; } } else { ret = 1; } if (ret != 0) { [self handleError: NSNetServicesBadArgumentError]; [_lock unlock]; return NO; } } /* Try adding the service to the entry group until we find an unused name * for it (but only if NSNetServiceNoAutoRename is not set). */ while (AVAHI_ERR_COLLISION == (ret = [self addServiceEntry]) && !(options & NSNetServiceNoAutoRename)) { char *newName = avahi_alternative_service_name([[self infoObjectForKey: @"name"] UTF8String]); if (newName) { [self setInfoObject: [NSString stringWithUTF8String: newName] forKey: @"name"]; avahi_free(newName); } else { ret = AVAHI_ERR_FAILURE; break; } } [_lock unlock]; return ret == 0 ? YES : NO; } - (BOOL) addServiceRecord { return [self addServiceRecordWithOptions: 0]; } - (void) publishWithOptions: (NSNetServiceOptions)options { [_lock lock]; if (_entryGroup == NULL) { if (NO == [self addServiceRecordWithOptions: options]) { [self handleError: _client ? avahi_client_errno((AvahiClient*)_client) : AVAHI_ERR_NO_DAEMON]; } } [self commitEntryGroup]; [_lock unlock]; } /** * Convenience method to return the full name of the service. */ - (NSString *) fullServiceName { NSString *full = nil; NSString *domain = [self infoObjectForKey: @"domain"]; if (([domain isEqualToString: @""]) || domain == nil) { // Pick the default domain: domain = [NSString stringWithUTF8String: avahi_client_get_domain_name((AvahiClient*)_client)]; } full = [NSString stringWithFormat: @"%@.%@.%@", [self name], [self type], domain]; if ((unichar)'.' != [full characterAtIndex: ([full length] - 1)]) { return [full stringByAppendingString: @"."]; } return full; } - (void) publish { // Publish and allow renaming: [self publishWithOptions: 0]; } - (void) resolve { [self resolveWithTimeout: 5]; } /** * Called by the resolver timeout to cease service resolution. */ - (void) didTimeout: (NSTimer*)theTimer { [self stop]; _timer = nil; } - (void) resolveWithTimeout: (NSTimeInterval) timeout { if (_serviceState < GSNetServiceResolving) { _resolver = (void*)avahi_service_resolver_new((AvahiClient*)_client, _ifIndex, _protocol, [[self infoObjectForKey: @"name"] UTF8String], [[self infoObjectForKey: @"type"] UTF8String], [[self infoObjectForKey: @"domain"] UTF8String], AVAHI_PROTO_UNSPEC, 0, GSAvahiServiceResolverEvent, (void*)self); if (NULL == _resolver) { [self handleError: avahi_client_errno((AvahiClient*)_client)]; return; } _serviceState = GSNetServiceResolving; if (_timer != nil) { [_timer invalidate]; _timer = nil; } _timer = [[NSTimer timerWithTimeInterval: timeout target: self selector: @selector(didTimeout:) userInfo: nil repeats: NO] retain]; [[ctx runLoop] addTimer: _timer forMode: [ctx mode]]; } // BOOM } /** * Main cleanup method. Will clean up all avahi-related resources in use by * the GSAvahiNetService. An resource record code of -1 indicates that that * the whole service needs to be reset. Otherwise, it will only clean up the * browser for the specified record type. */ - (void) stopWithError: (BOOL)hadError forRRCode: (NSInteger)rrCode { /* * If an RRCode was set (a value of zero possibly indicating an unknown * RRCode, fo which we won't do anything), we only clean up the * corresponding browser. */ if (rrCode == 0) { return; } [_lock lock]; if (rrCode != -1) { AvahiRecordBrowser *browser = NSMapGet(_browsers, (void*)(uintptr_t)rrCode); if (browser != NULL) { avahi_record_browser_free(browser); NSMapRemove(_browsers, (void*)(uintptr_t)rrCode); [(NSTimer*)NSMapGet(_browserTimeouts, (void*)(uintptr_t)rrCode) invalidate]; NSMapRemove(_browserTimeouts, (void*)(uintptr_t)rrCode); if ((NSCountMapTable(_browsers) == 0) && (_serviceState == GSNetServiceRecordBrowsing)) { _serviceState = GSNetServiceResolved; } } return; } if (_timer != nil) { [_timer invalidate]; _timer = nil; } if (_resolver != NULL) { avahi_service_resolver_free((AvahiServiceResolver*)_resolver); _resolver = NULL; } if (_entryGroup != NULL) { //Make sure to unpublish it. avahi_entry_group_reset((AvahiEntryGroup*)_entryGroup); avahi_entry_group_free((AvahiEntryGroup*)_entryGroup); _entryGroup = NULL; } if ((_browsers != NULL) && (0 != NSCountMapTable(_browsers))) { NSMapTable *enumerationTable; NSMapEnumerator bEnum; NSUInteger code; AvahiRecordBrowser *browser; enumerationTable = NSCopyMapTableWithZone(_browsers, NSDefaultMallocZone()); bEnum = NSEnumerateMapTable(enumerationTable); while (NSNextMapEnumeratorPair(&bEnum,(void*)&code,(void*)&browser)) { avahi_record_browser_free(browser); NSMapRemove(_browsers, (void*)code); [(NSTimer*)NSMapGet(_browserTimeouts, (void*)(uintptr_t)code) invalidate]; NSMapRemove(_browserTimeouts, (void*)(uintptr_t)code); } NSEndMapTableEnumeration(&bEnum); NSFreeMapTable(enumerationTable); } if (!hadError) { [self removeInfoObjectForKey: @"serverStream"]; [self netServiceDidStop: self]; } _serviceState = GSNetServiceIdle; [_lock unlock]; } - (void) stop { [self stopWithError: NO forRRCode: -1]; } - (void) startMonitoringForRecordType: (NSString*)rrType { NSUInteger code = RRCodeFromNSString(rrType); AvahiRecordBrowser *browser = NULL; // Raise error for bad record type: if (code == 0) { [self handleError: NSNetServicesBadArgumentError forRRCode: code]; return; } [_lock lock]; if ((_serviceState < GSNetServiceResolved) || (_serviceState > GSNetServiceRecordBrowsing)) { [self handleError: NSNetServicesBadArgumentError forRRCode: code]; [_lock unlock]; return; } browser = NSMapGet(_browsers, (void*)(uintptr_t)code); if (browser) { NSDebugLog(@"Browser for RR code %@ already monitoring", rrType); [self handleError: NSNetServicesActivityInProgress]; [_lock unlock]; return; } browser = avahi_record_browser_new((AvahiClient*)_client, _ifIndex, _protocol, [[self fullServiceName] UTF8String], AVAHI_DNS_CLASS_IN, (uint16_t)code, 0, GSAvahiRecordBrowserEvent, self); if (browser == NULL) { // Something went wrong: [self handleError: avahi_client_errno((AvahiClient*)_client)]; } else { // The browser was successfully created, we add it to the mapTable. NSMapInsert(_browsers, (void*)(uintptr_t)code, browser); // Set the proper state if the new browser is responsible for a state // change. if (_serviceState == GSNetServiceResolved) { _serviceState = GSNetServiceRecordBrowsing; } } [_lock unlock]; } - (void) stopMonitoringForRecordType: (NSString*)rrType { NSUInteger rrCode = RRCodeFromNSString(rrType); AvahiRecordBrowser *browser = NULL; [_lock lock]; if (_serviceState > GSNetServiceRecordBrowsing) { //Don't do anything for a publishing service. [_lock unlock]; return; } browser = NSMapGet(_browsers, (void*)(uintptr_t)rrCode); if (browser != NULL) { avahi_record_browser_free(browser); } if (0 == NSCountMapTable(_browsers)) { _serviceState = GSNetServiceResolved; } [_lock unlock]; } - (void) startMonitoring { if ((_serviceState == GSNetServiceResolved) || (_serviceState == GSNetServiceRecordBrowsing)) { [self startMonitoringForRecordType: @"TXT"]; } } - (void) stopMonitoring { [self stopMonitoringForRecordType: @"TXT"]; } - (NSArray *) addresses { NSArray *addresses = [self infoObjectForKey: @"addresses"]; if (nil == addresses) { // As per Apple documentation "If no addresses were resolved for the // service, the returned array contains zero elements." return [[[NSArray alloc] init] autorelease]; } return addresses; } /** * Private method to add new address data to the service. */ - (void) addAddressData: (NSData*)data { NSMutableArray *addresses = nil; if (data == nil) { return; } addresses = [self infoObjectForKey: @"addresses"]; if (addresses == nil) { // Autoreleased: addresses = [NSMutableArray array]; [self setInfoObject: addresses forKey: @"addresses"]; } if (![addresses containsObject: data]) { [addresses addObject: data]; } } /** * Private method to remove stale address data from the service. */ - (void) removeAddressData: (NSData*)data { NSMutableArray *addresses = nil; // Index of the address in the array: NSUInteger index = NSNotFound; if (data == nil) { return; } addresses = [self infoObjectForKey: @"addresses"]; if (addresses == nil) { // Autoreleased: addresses = [NSMutableArray array]; [self setInfoObject: addresses forKey: @"addresses"]; } index = [addresses indexOfObjectIdenticalTo: data]; if (index != NSNotFound) { [addresses removeObjectAtIndex: index]; } } - (NSString *) domain { return [self infoObjectForKey: @"domain"]; } - (NSString *) hostName { return [self infoObjectForKey: @"hostName"]; } - (NSString *) name { return [self infoObjectForKey: @"name"]; } - (NSString *) type { return [self infoObjectForKey: @"type"]; } /** * This method is called from the Avahi callback when a service has successfully * resolved. */ - (void) avahiResolver: (AvahiServiceResolver*)aResolver foundServiceWithName: (NSString*)name type: (NSString*)type domain: (NSString*)domain hostName: (NSString*)hostName address: (NSData*)address port: (NSInteger)port txtRecord: (NSData*)txtRecord ifIndex: (AvahiIfIndex)anIfIndex protocol: (AvahiProtocol)aProtocol { [_lock lock]; if ((void*)aResolver != _resolver) { // This callback comes from the wrong resolver: [self handleError: NSNetServicesInvalidError]; // Free the erratic resolver, the real one will have been freed by the // error handler. if (NULL != aResolver) { avahi_service_resolver_free(aResolver); } [_lock unlock]; return; } if (![name isEqualToString: [self name]] || ![type isEqualToString: [self type]] || ![domain isEqualToString: [self domain]]) { // This resolver callback is for the wrong service! [self handleError: NSNetServicesInvalidError]; [_lock unlock]; return; } if (hostName) { [self setInfoObject: hostName forKey: @"hostName"]; } if (port) { [self setInfoObject: [NSNumber numberWithInteger: port] forKey: @"port"]; } if (txtRecord) { [self setInfoObject: txtRecord forKey: @"TXT"]; } if (address) { [self addAddressData: address]; } // This makes sure all further actions happen on the same if/protocol // combination (they might have been AVAHI_(IF|PROTO)_UNSPEC before). _ifIndex = anIfIndex; _protocol = aProtocol; // Clean up the resolver, we don't need it anymore: avahi_service_resolver_free((AvahiServiceResolver*)_resolver); _resolver = NULL; _serviceState = GSNetServiceResolved; [self netServiceDidResolveAddress: self]; if (_timer != nil) { [_timer invalidate]; _timer = nil; } [_lock unlock]; } /** * Callback for timers on record browsing, to mimic AllForNow. */ - (void) didTimeoutRRBrowsing: (NSTimer*)aTimer { // Invoke our AllForNow callback, which will take care to invalidate the // timer. [self allForNowForRRCode: [(NSNumber*)[aTimer userInfo] unsignedIntegerValue]]; } /** * Called whenever a new event appears for the resource record * code. Postpones the timeout. */ - (void) rescheduleBrowserTimeoutForRRCode: (NSUInteger)code { NSTimer *aTimer = nil; [_lock lock]; /* Do AllForNow handling to supplement what Avahi is doing. (The AllForNow * event seems to be sent exactly once over the lifetime of the record * browser, which makes it quite useless. */ aTimer = (NSTimer*)NSMapGet(_browserTimeouts, (void*)(uintptr_t)code); if (aTimer != nil) { [aTimer invalidate]; NSMapRemove(_browserTimeouts, (void*)(uintptr_t)code); } aTimer = [NSTimer timerWithTimeInterval: BROWSER_UPDATE_INTERVAL target: self selector: @selector(didTimeoutRRBrowsing:) userInfo: [NSNumber numberWithUnsignedInteger: code] repeats: NO]; [[ctx runLoop] addTimer: aTimer forMode: [ctx mode]]; NSMapInsert(_browserTimeouts, (void*)(uintptr_t)code, aTimer); [_lock unlock]; } /** * Private method to add new data for a record type. */ - (void) newData: (NSData*)data forRRCode: (NSUInteger)code { NSString *rrType = NSStringFromRRCode(code); id oldValue = nil; [self rescheduleBrowserTimeoutForRRCode: code]; if (data == nil) { return; } // We dynamically transform between an NSData object and an array as the // value for the rrType: [_infoLock lock]; oldValue = [self infoObjectForKey: rrType]; if (oldValue == nil) { [self setInfoObject: data forKey: rrType]; } else if ([oldValue isKindOfClass: [NSData class]]) { NSMutableArray *container = [NSMutableArray array]; [container addObject: oldValue]; [container addObject: data]; [self setInfoObject: container forKey: rrType]; } else if ([oldValue isKindOfClass: [NSMutableArray class]]) { [oldValue addObject: data]; } else { [_infoLock unlock]; [NSException raise: @"NSInternalInconsistencyException" format: @"Invalid value of NSNetService info key %@", rrType]; return; } // Special case for addresses, they need to update the addresses key // properly: if ((code == AVAHI_DNS_TYPE_A) || code == AVAHI_DNS_TYPE_AAAA) { AvahiProtocol proto = AVAHI_PROTO_UNSPEC; if (code == AVAHI_DNS_TYPE_A) { proto = AVAHI_PROTO_INET; } else if (code == AVAHI_DNS_TYPE_AAAA) { proto = AVAHI_PROTO_INET6; } [self addAddressData: NSDataWithAddrDataPortFamilyAndIface(data, [self port], proto, _ifIndex)]; } [_infoLock unlock]; } /** * Private method to remove stale data for a resource record. */ - (void) removedData: (NSData*)data forRRCode: (NSUInteger)code { NSString *rrType = NSStringFromRRCode(code); id oldValue = nil; [self rescheduleBrowserTimeoutForRRCode: code]; if (data == nil) { return; } [_infoLock lock]; oldValue = [self infoObjectForKey: rrType]; if (oldValue == nil) { //Nothing to be done. [_infoLock unlock]; return; } else if ([oldValue isKindOfClass: [NSData class]]) { if ([oldValue isEqual: data]) { [self removeInfoObjectForKey: rrType]; } } else if ([oldValue isKindOfClass: [NSMutableArray class]]) { NSUInteger index = [oldValue indexOfObjectIdenticalTo: data]; if (index != NSNotFound) { NSUInteger count; [oldValue removeObjectAtIndex: index]; count = [oldValue count]; if (count == 1) { //Go back to a plain data record: [self setInfoObject: [oldValue objectAtIndex: 0] forKey: rrType]; } else if (count == 0) { // Remove empty array: [self removeInfoObjectForKey: rrType]; } } } else { [_infoLock unlock]; [NSException raise: @"NSInternalInconsistencyException" format: @"Invalid value of NSNetService info key %@", rrType]; return; } // Special case for address records: if ((code == AVAHI_DNS_TYPE_A) || code == AVAHI_DNS_TYPE_AAAA) { AvahiProtocol proto = AVAHI_PROTO_UNSPEC; if (code == AVAHI_DNS_TYPE_A) { proto = AVAHI_PROTO_INET; } else if (code == AVAHI_DNS_TYPE_AAAA) { proto = AVAHI_PROTO_INET6; } [self removeAddressData: NSDataWithAddrDataPortFamilyAndIface(data, [self port], proto, _ifIndex)]; } [_infoLock unlock]; } /** * Called both by the native timeout mechanism and the Avahi callback to notify * the delegate about record data changes. */ - (void) allForNowForRRCode: (NSUInteger)code { NSString *rrType = nil; NSData *data = nil; [_lock lock]; { // Remove a dangling timer if any: NSTimer *aTimer = (NSTimer*)NSMapGet(_browserTimeouts, (void*)(uintptr_t)code); if (aTimer != nil) { [aTimer invalidate]; NSMapRemove(_browserTimeouts, (void*)(uintptr_t)code); } } [_lock unlock]; rrType = NSStringFromRRCode(code); data = [self infoObjectForKey: rrType]; [self netService: self didUpdateRecordData: data forRecordType: rrType]; } #if GS_USE_AVAHI==1 - (id)delegate #else - (id)delegate #endif { return _delegate; } /** * Dispatcher method for error notifications to the delegate. */ - (void) handleError: (int)errorCode forRRCode: (int)RRCode { [_lock lock]; if (_serviceState < GSNetServiceResolved) { [self netService: self didNotResolve: [self errorDictWithErrorCode: errorCode]]; } else if (_serviceState <= GSNetServiceRecordBrowsing) { /* Strangely enough, the Apple documentation does not specify that an * error should be raised when monitoring a record fails. Since we are * not Apple, we can actually be nice and notify the delegate, if it is * interested. */ [self netService: self didNotMonitor: [self errorDictWithErrorCode: errorCode] forRecordType: NSStringFromRRCode(RRCode)]; } else if (_serviceState > GSNetServiceRecordBrowsing) { [self netService: self didNotPublish: [self errorDictWithErrorCode: errorCode]]; } [self stopWithError: YES forRRCode: RRCode]; [self avahiClientHandleError: errorCode]; [_lock unlock]; } /** * Dispatcher method for error notifications to the delegate. */ - (void) handleError: (int)errorCode { [self handleError: errorCode forRRCode: -1]; } - (id) recordDataForRecordType: (NSString*)key { return [self infoObjectForKey: key]; } - (NSData*) TXTRecordData { id retVal = nil; id value = [self infoObjectForKey: @"TXT"]; //Retain because somebody might remove it while we do this: [value retain]; if ([value isKindOfClass: [NSData class]]) { return [value autorelease]; } else if ([value isKindOfClass: [NSArray class]]) { // Only return the last (= newest) object: retVal = [[(NSArray*)value lastObject] retain]; } [value release]; return [retVal autorelease]; } - (BOOL) setTXTRecordData: (NSData*)data { AvahiStringList *list = NULL; int ret = GSAvahiStringListFromNSData(data, &list); if (0 == ret) { // We could successfully parse it, so we set it as the value of the // dictionary. [self setInfoObject: data forKey: @"TXT"]; } [_lock lock]; switch (_serviceState) { case (GSNetServiceIdle): // We don't need to do anything more, the TXT will be published along // with the service: if (list != NULL) { avahi_string_list_free(list); } [_lock unlock]; return YES; case (GSNetServiceResolving): case (GSNetServiceResolved): case (GSNetServiceRecordBrowsing): case GSNetServiceStateMax: // TODO: Raise error? if (list != NULL) { avahi_string_list_free(list); } [_lock unlock]; return NO; case (GSNetServicePublishing): case (GSNetServicePublished): break; } // Ret will still be 0 at this point, so we can reuse the variable: ret = avahi_entry_group_update_service_txt_strlst( (AvahiEntryGroup*)_entryGroup, _ifIndex, _protocol, 0, //no flags [[self infoObjectForKey: @"name"] UTF8String], [[self infoObjectForKey: @"type"] UTF8String], StringOrNullIfEmpty([self infoObjectForKey: @"domain"]), list); if (list != NULL) { avahi_string_list_free(list); } if (ret != 0) { // TODO: Raise error: [_lock unlock]; return NO; } /* * FIXME: Apple's NSNetService API is a bit crappy, meaning that almost * everything is asynchronous, but not -setTXTRecordData:. One * solution would be to actually be asynchronous and run the runloop for * ourselves a bit. Unfortunately Avahi does not call any of its * callbacks to inform us about the fact that the record has * successfully been changed. So we are a bit out of luck. Right now, * this means that we might be returning 'YES' wrongly and also break * code that _expects_ the record to be published before the method * returns. Life sucks sometimes. */ [_lock unlock]; return YES; } - (BOOL) addRecordData: (NSData*)data forRecordType: (NSString*)type withTTL: (NSUInteger)ttl { int rrCode = RRCodeFromNSString(type); int ret = 0; [_lock lock]; if (_serviceState == GSNetServiceIdle) { if (NULL == _entryGroup) { int ret = [self createEntryGroup]; if (ret != 0) { [_lock unlock]; return NO; } } } else { [_lock unlock]; return NO; } if (!rrCode) { //FIXME: Raise error. [self handleError: NSNetServicesBadArgumentError]; [_lock unlock]; return NO; } // NOTE: This function is crazly a bit different than the others: The name // parameter is the full service name! ret = avahi_entry_group_add_record((AvahiEntryGroup*)_entryGroup, _ifIndex, _protocol, 0, [[self fullServiceName] UTF8String], AVAHI_DNS_CLASS_IN, // DNS class rrCode, ttl, [data bytes], [data length]); if (ret != 0) { [self handleError: ret]; [_lock unlock]; return NO; } [_lock unlock]; return YES; } - (BOOL) addRecordData: (NSData*)data forRecordType: (NSString*)type { return [self addRecordData: data forRecordType: type withTTL: DEFAULT_OTHER_RECORD_TTL]; } /** * Private method called upon state changes in the entry group. */ - (void) entryGroup: (AvahiEntryGroup*)group enteredState: (AvahiEntryGroupState)groupState { [_lock lock]; if (_serviceState == GSNetServicePublishing) { switch (groupState) { case (AVAHI_ENTRY_GROUP_UNCOMMITED): case (AVAHI_ENTRY_GROUP_REGISTERING): break; case (AVAHI_ENTRY_GROUP_COLLISION): [self handleError: NSNetServicesCollisionError]; break; case (AVAHI_ENTRY_GROUP_FAILURE): [self handleError: avahi_client_errno((AvahiClient*)_client)]; break; case (AVAHI_ENTRY_GROUP_ESTABLISHED): _serviceState = GSNetServicePublished; [self netServiceDidPublish: self]; break; } } else if (_serviceState == GSNetServicePublished) { switch (groupState) { case AVAHI_ENTRY_GROUP_COLLISION: case AVAHI_ENTRY_GROUP_FAILURE: [self handleError: avahi_client_errno((AvahiClient*)_client)]; case AVAHI_ENTRY_GROUP_ESTABLISHED: case AVAHI_ENTRY_GROUP_UNCOMMITED: case AVAHI_ENTRY_GROUP_REGISTERING: break; } } [_lock unlock]; } /** * GSServerStream delegate method, called only when this service has been * published with the NSNetServiceListenForConnections option. */ - (void) stream:(NSStream*) stream handleEvent: (NSStreamEvent)anEvent { switch (anEvent) { case NSStreamEventHasBytesAvailable: { if ([[self delegate] respondsToSelector: @selector(netService:didAcceptConnectionWithInputStream:outputStream:)]) { NSInputStream *is; NSOutputStream *os; GSServerStream *serverStream = [self infoObjectForKey: @"serverStream"]; [serverStream acceptWithInputStream: &is outputStream: &os]; [[self delegate] netService: self didAcceptConnectionWithInputStream: is outputStream: os]; } break; } default: break; } } - (void) dealloc { /* * Obtain the super-class lock so that nothing fishy can happen while * we clean up: */ [_lock lock]; /* * Unset the delegate. We might have been gone away because the delegate * didn't need us anymore, so there's a reasonable chance that it has also * been deallocated. */ [self setDelegate: nil]; /* * Call -stop to cleanup all avahi-related resources. */ [self stop]; /* Clean up evrything else. */ NSFreeMapTable(_browsers); _browsers = NULL; NSFreeMapTable(_browserTimeouts); _browserTimeouts = NULL; [_info release]; _info = nil; [_infoLock release]; _infoLock = nil; [_lock unlock]; [self avahiClientDealloc]; [super dealloc]; } @end gnustep-base-1.29.0/Source/GSAvahiNetServiceBrowser.m000066400000000000000000000312451435650067400224530ustar00rootroot00000000000000/* Concrete NSNetServiceBrowser subclass using the avahi API. Copyright (C) 2010 Free Software Foundation, Inc. Written by: Niels Grewe Date: March 2010 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "GSNetServices.h" #import "GSAvahiClient.h" #import "Foundation/NSNetServices.h" #import "GNUstepBase/NSNetServices+GNUstepBase.h" #import "Foundation/NSArray.h" #import "Foundation/NSDebug.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSLock.h" #import "Foundation/NSRunLoop.h" #import "Foundation/NSString.h" #import "GNUstepBase/GSObjCRuntime.h" #include #define SERVICE_KEY(name, type, domain, iface, proto) [NSString stringWithFormat: @"%@.%@.%@%d:%d", name, type, domain, iface, proto] // Private Methods: @interface GSAvahiNetServiceBrowser (GSAvahiNetServiceBrowserPrivate) - (void) stopWithError: (BOOL)yesno; - (BOOL) hasFirstEvent; - (void) setHasFirstEvent: (BOOL)yesno; - (void) setService: (GSAvahiNetService*)service forKey: (NSString*)key; - (void) removeServiceForKey: (NSString*)key; - (GSAvahiNetService*) serviceForKey: (NSString*)key; // GSAvahiClient behaviour methods: - (id) avahiClientInitWithRunLoop: (NSRunLoop*)loop forMode: (NSString*)mode; - (void) avahiClientHandleError: (int)error; - (void) avahiClientDealloc; - (NSDictionary*) errorDictWithErrorCode: (int)error; - (void) handleError: (int)error; @end NSString* GSNetServiceDotTerminatedNSStringFromString(const char *domain) { if (domain != NULL) { NSString *theDomain = [NSString stringWithUTF8String: domain]; //Add a trailing dot if necessary: if ((unichar)'.' != [theDomain characterAtIndex: ([theDomain length] - 1)]) { theDomain = [theDomain stringByAppendingString: @"."]; } return theDomain; } return nil; } static void GSAvahiDomainBrowserEvent(AvahiDomainBrowser *db, AvahiIfIndex ifIndex, AvahiProtocol protocol, AvahiBrowserEvent event, const char *domain, AvahiLookupResultFlags flags, void *userInfo) { GSAvahiNetServiceBrowser *browser = nil; NSString *theDomain = nil; if (NULL == db) { NSDebugLog(@"NULL pointer to AvahiDomainBrowser."); return; } if (NULL == userInfo) { NSDebugLog(@"NULL pointer to NSNetServiceBrowser."); return; } browser = (GSAvahiNetServiceBrowser*)userInfo; theDomain = GSNetServiceDotTerminatedNSStringFromString(domain); switch (event) { case AVAHI_BROWSER_NEW: if (![browser hasFirstEvent]) { [browser netServiceBrowserWillSearch: (NSNetServiceBrowser*)browser]; [browser setHasFirstEvent: YES]; } [browser netServiceBrowser: (NSNetServiceBrowser*)browser didFindDomain: theDomain moreComing: NO]; break; case AVAHI_BROWSER_REMOVE: [browser netServiceBrowser: (NSNetServiceBrowser*)browser didRemoveDomain: theDomain moreComing: NO]; break; case AVAHI_BROWSER_FAILURE: [browser handleError: avahi_client_errno(avahi_domain_browser_get_client(db))]; break; case AVAHI_BROWSER_CACHE_EXHAUSTED: // Not interesting case AVAHI_BROWSER_ALL_FOR_NOW: // This is useless, it always happens one second after firing the query. break; } } static void GSAvahiServiceBrowserEvent( AvahiServiceBrowser *sb, AvahiIfIndex ifIndex, AvahiProtocol proto, AvahiBrowserEvent event, const char *name, const char *type, const char *domain, AvahiLookupResultFlags flags, void *userInfo) { GSAvahiNetServiceBrowser* browser = (GSAvahiNetServiceBrowser*)userInfo; NSString *theName = NSStringIfNotNull(name); NSString *theType = NSStringIfNotNull(type); NSString *theDomain = GSNetServiceDotTerminatedNSStringFromString(domain); NSString *serviceKey; /* Some services might appear on different interface/protocol combinations * and we will get back one event for each of them, so we need a more * specific key to store the service: */ serviceKey = SERVICE_KEY(theName, theType,theDomain, ifIndex, proto); if (NULL == sb) { NSDebugLog(@"NULL pointer to AvahiServiceBrowser."); return; } if (NULL == userInfo) { NSDebugLog(@"NULL pointer to NSNetServiceBrowser."); return; } if (event != AVAHI_BROWSER_FAILURE) { if (![browser hasFirstEvent]) { [browser netServiceBrowserWillSearch: (NSNetServiceBrowser*)browser]; [browser setHasFirstEvent: YES]; } } switch (event) { case AVAHI_BROWSER_NEW: if ((theName && theDomain) && theType) { NSNetService *service = [[[GSAvahiNetService alloc] initWithDomain: theDomain type: theType name: theName avahiIfIndex: ifIndex avahiProtocol: proto] autorelease]; [browser setService: (GSAvahiNetService*)service forKey: serviceKey]; [browser netServiceBrowser: (NSNetServiceBrowser*)browser didFindService: service moreComing: NO]; } break; case AVAHI_BROWSER_REMOVE: if ((theName && theDomain) && theType) { NSNetService *service; service = (NSNetService*)[browser serviceForKey: serviceKey]; [browser netServiceBrowser: (NSNetServiceBrowser*)browser didRemoveService: service moreComing: NO]; [browser removeServiceForKey: serviceKey]; } break; case AVAHI_BROWSER_FAILURE: [browser handleError: avahi_client_errno(avahi_service_browser_get_client(sb))]; break; case AVAHI_BROWSER_CACHE_EXHAUSTED: // Not interesting case AVAHI_BROWSER_ALL_FOR_NOW: // This is useless, it always happens one second after firing the query. break; } } @implementation GSAvahiNetServiceBrowser + (void) initialize { if (self == [GSAvahiNetServiceBrowser class]) { GSObjCAddClassBehavior(self, [GSAvahiClient class]); } } - (id) initWithRunLoop: (NSRunLoop*)rl forMode: (NSString*)mode { if (nil == (self = [self avahiClientInitWithRunLoop: rl forMode: mode])) { return nil; } _services = [[NSMutableDictionary alloc] init]; return self; } - (id) init { return [self initWithRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode]; } - (void) setService: (GSAvahiNetService*)service forKey: (NSString*)key { [_services setObject: service forKey: key]; } - (void) removeServiceForKey: (NSString*)key { [_services removeObjectForKey: key]; } - (GSAvahiNetService*) serviceForKey: (NSString*)key { return [_services objectForKey: key]; } - (void) handleError: (int)err { [self netServiceBrowser: self didNotSearch: [self errorDictWithErrorCode: err]]; [self stopWithError: YES]; [self avahiClientHandleError: err]; } - (BOOL) canSearch { int err = 0; if ([self delegate] == nil) { err = NSNetServicesInvalidError; } else if (_browser != NULL) { err = NSNetServicesActivityInProgress; } if (!err) { /* Check whether the avahi-client is in a working state (the caller * might be trying to search again after a failure event). */ switch (avahi_client_get_state((AvahiClient*)_client)) { case AVAHI_CLIENT_FAILURE: err = avahi_client_errno((AvahiClient*)_client); break; case AVAHI_CLIENT_CONNECTING: case AVAHI_CLIENT_S_REGISTERING: err = NSNetServicesActivityInProgress; break; case AVAHI_CLIENT_S_COLLISION: err = NSNetServicesCollisionError; break; default: break; } } if (err) { [self netServiceBrowser: (NSNetServiceBrowser*)self didNotSearch: [self errorDictWithErrorCode: err]]; return NO; } { NSRunLoop *rl = [ctx runLoop]; NSString *mode = [ctx mode]; BOOL schedule = ((rl == nil) || (mode == nil)); if (schedule) { if (rl == nil) { rl = [NSRunLoop currentRunLoop]; } if (mode == nil) { mode = NSDefaultRunLoopMode; } [self scheduleInRunLoop: rl forMode: mode]; } } return YES; } - (void) searchForDomains: (AvahiDomainBrowserType)domainType { [_lock lock]; if ([self canSearch]) { _browser = (void*)avahi_domain_browser_new((AvahiClient*)_client, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, "local", domainType, 0, GSAvahiDomainBrowserEvent, (void*)self); if (NULL == _browser) { [self handleError: avahi_client_errno((AvahiClient*)_client)]; } else { _type = GSAvahiDomainBrowser; } /* NOTE: -netServiceBrowserWillSearch: will be called from * GSAvahiDomainBrowserEvent(). */ } [_lock unlock]; } - (void) searchForDefaultRegistrationDomain { [self searchForDomains: AVAHI_DOMAIN_BROWSER_REGISTER_DEFAULT]; } - (void) searchForDefaultBrowseDomain { [self searchForDomains: AVAHI_DOMAIN_BROWSER_BROWSE_DEFAULT]; } - (void) searchForAllDomains { /* The dns-sd compatibility layer of avahi assumes the browsable domains * to be a superset of the registration domains, so we take an easy * shortcut here (also, Apple has deprecated it in Mac OS 10.4 */ [self searchForBrowsableDomains]; } - (void) searchForBrowsableDomains { [self searchForDomains: AVAHI_DOMAIN_BROWSER_BROWSE]; } - (void) searchForRegistrationDomains { [self searchForDomains: AVAHI_DOMAIN_BROWSER_REGISTER]; } - (void) searchForServicesOfType: (NSString *)serviceType inDomain: (NSString *)domainName { const char* domain; if (![domainName isEqualToString: @""]) { domain = [domainName UTF8String]; } else { domain = NULL; } [_lock lock]; if ([self canSearch]) { _browser = (void*)avahi_service_browser_new((AvahiClient*)_client, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, [serviceType UTF8String], domain, 0, GSAvahiServiceBrowserEvent, (void*)self); if (NULL == _browser) { [self handleError: avahi_client_errno((AvahiClient*)_client)]; } else { _type = GSAvahiServiceBrowser; } /* NOTE: -netServiceBrowserWillSearch: will be called from * GSAvahiServiceBrowserEvent(). */ } [_lock unlock]; } - (BOOL) hasFirstEvent { return _hasFirstEvent; } - (void) setHasFirstEvent: (BOOL)yesno { _hasFirstEvent = yesno; } - (void) stopWithError: (BOOL)hadError { [_lock lock]; if (_browser != NULL) { /* We can't recover if the type is wrong and we don't want to * leak random memory. */ NSAssert((_type < GSAvahiBrowserMax) && (_type != GSAvahiUnknownBrowser), NSInternalInconsistencyException); [self setHasFirstEvent: NO]; switch (_type) { case GSAvahiDomainBrowser: avahi_domain_browser_free((AvahiDomainBrowser*)_browser); break; case GSAvahiServiceBrowser: avahi_service_browser_free((AvahiServiceBrowser*)_browser); break; case GSAvahiUnknownBrowser: case GSAvahiBrowserMax: break; } _browser = NULL; } _type = GSAvahiUnknownBrowser; [_services removeAllObjects]; if (!hadError) { [self netServiceBrowserDidStopSearch: self]; } [_lock unlock]; } - (void) stop { [self stopWithError: NO]; } - (void)dealloc { if (_browser != NULL) { [self stop]; } [self setDelegate: nil]; [_services release]; [self avahiClientDealloc]; [super dealloc]; } @end gnustep-base-1.29.0/Source/GSAvahiRunLoopIntegration.h000066400000000000000000000047471435650067400226440ustar00rootroot00000000000000/* Interface for integration of avahi-client into NSRunLoop. Copyright (C) 2010 Free Software Foundation, Inc. Written by: Niels Grewe Date: March 2010 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "Foundation/NSObject.h" #import "Foundation/NSRunLoop.h" #import "Foundation/NSTimer.h" #import "Foundation/NSString.h" #import "Foundation/NSArray.h" #import "Foundation/NSException.h" #import "Foundation/NSLock.h" #import "GSFastEnumeration.h" #include @class GSAvahiWatcher,GSAvahiTimer; /** * The GSAvahiRunLoopContext provides hooks for Avahi to hook into NSRunLoop. * This provides relatively hassle-free event handling of all GSAvahiClient * subclasses. */ @interface GSAvahiRunLoopContext: NSObject { NSRunLoop *runLoop; NSString *mode; AvahiPoll *poll; NSMutableArray *children; NSLock *lock; } - (id)initWithRunLoop: (NSRunLoop*)runLoop forMode: (NSString*)runLoopMode; - (NSRunLoop*)runLoop; - (NSString*)mode; - (GSAvahiWatcher*)avahiWatcherWithCallback: (AvahiWatchCallback)callback onEvent: (AvahiWatchEvent)someEvents forFileDescriptor: (NSInteger)fd userData: (void*)userData; - (GSAvahiTimer*)avahiTimerWithCallback: (AvahiTimeoutCallback)callback withTimeval: (const struct timeval*)tv userData: (void*)userData; - (void)removeWatcher: (GSAvahiWatcher*)aw; - (void)removeTimeout: (GSAvahiTimer*)at; - (void)removeFromRunLoop: (NSRunLoop*)rl forMode: (NSString*)mode; - (void)scheduleInRunLoop: (NSRunLoop*)rl forMode: (NSString*)mode; - (const AvahiPoll*)avahiPoll; @end gnustep-base-1.29.0/Source/GSAvahiRunLoopIntegration.m000066400000000000000000000342671435650067400226510ustar00rootroot00000000000000/* Classes for integration of avahi-client into NSRunLoop. Copyright (C) 2010 Free Software Foundation, Inc. Written by: Niels Grewe Date: March 2010 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "GSAvahiRunLoopIntegration.h" #define CTX(x) GSAvahiRunLoopContext *ctx = (GSAvahiRunLoopContext*)x @interface GSAvahiWatcher: NSObject { //The callback to call for avahi. AvahiWatchCallback callback; BOOL callbackInProgress; AvahiWatchEvent oldEvents; AvahiWatchEvent lastEvent; int fileDesc; GSAvahiRunLoopContext *ctx; void *userData; } - (void)listenForEvents: (AvahiWatchEvent)events; - (AvahiWatchEvent)getEvents; - (void)removeFromContext; - (void)setContext: (GSAvahiRunLoopContext*)aCtxt; - (void)unschedule; - (void)reschedule; @end @implementation GSAvahiWatcher - (void) listenForEvents: (AvahiWatchEvent)events saveState: (BOOL)saveState { /* FIXME: NSRunLoop doesn't expose equivalents for POLLERR and POLLHUP but * Avahi doesn't seem to strictly require them (their Qt API doesn't handle * them either). Still, it would be nice to handle AVAHI_WATCH_(ERR|HUP) * here. */ // Remove old events: if (!(events & AVAHI_WATCH_IN) && (oldEvents & AVAHI_WATCH_IN)) { [[ctx runLoop] removeEvent: (void*)(intptr_t)fileDesc type: ET_RDESC forMode: [ctx mode] all: NO]; } if (!(events & AVAHI_WATCH_OUT) && (oldEvents & AVAHI_WATCH_OUT)) { [[ctx runLoop] removeEvent: (void*)(intptr_t)fileDesc type: ET_WDESC forMode: [ctx mode] all: NO]; } // Remember event state: if (saveState) { oldEvents = events; } // Dispatch new events to the runLoop: if (events & AVAHI_WATCH_IN) { [[ctx runLoop] addEvent: (void*)(intptr_t)fileDesc type: ET_RDESC watcher: self forMode: [ctx mode]]; } if (events & AVAHI_WATCH_OUT) { [[ctx runLoop] addEvent: (void*)(intptr_t)fileDesc type: ET_WDESC watcher: self forMode: [ctx mode]]; } } - (void) listenForEvents: (AvahiWatchEvent)events { [self listenForEvents: events saveState: YES]; } - (void) unschedule { /* Don't save the new event state (i.e. no events) if we are unscheduling * the watcher. We might want to reschedule it with the prior state. */ [self listenForEvents: (AvahiWatchEvent)0 saveState: NO]; } - (void) reschedule { [self listenForEvents: oldEvents saveState: NO]; } - (id) initWithCallback: (AvahiWatchCallback)cback andContext: (GSAvahiRunLoopContext*)aCtx onEvent: (AvahiWatchEvent)someEvents forFd: (int)fd userData: (void*)ud { if (nil == (self = [super init])) { return nil; } fileDesc = fd; // The context retains its watchers and timers: ctx = aCtx; callback = cback; userData = ud; [self listenForEvents: someEvents]; return self; } - (AvahiWatchEvent) getEvents { if (callbackInProgress) { return (AvahiWatchEvent)0; } return lastEvent; } - (void) removeFromContext { [self unschedule]; [ctx removeWatcher: self]; // Don't reference the context anymore, since it won't have any chance of // notifying us if it goes away. ctx = nil; } - (void) receivedEvent: (void*)data type: (RunLoopEventType)type extra: (void*)extra forMode: (NSString*)mode { int fd = (int)(intptr_t)data; if (fileDesc != fd) { //Not good return; } /* FIXME ... in the following switch, as well as setting lastEvent the * code was clearing the corresponding bit in the oldEvents bitmask. * This was causng a crash becasue it meant that we didn't unregister * the event watcher from the run loop before deallocating it and a * new incoming event was sent to the deallocated instance. * I therefore removed that code, but can't see what it was intended * to do. */ switch (type) { case ET_RDESC: lastEvent = AVAHI_WATCH_IN; break; case ET_WDESC: lastEvent = AVAHI_WATCH_OUT; break; default: return; } /* FIXME: NSRunLoop doesn't expose equivalents for POLLERR and POLLHUP but * Avahi doesn't seem to strictly require them (their Qt API doesn't handle * them either). */ callbackInProgress = YES; callback((AvahiWatch*)self, fd, lastEvent, userData); callbackInProgress = NO; } - (void) setContext: (GSAvahiRunLoopContext*)aCtxt { ctx = aCtxt; } - (void) dealloc { // Remove all leftover event-handlers from the runLoop: [self listenForEvents: (AvahiWatchEvent)0]; [super dealloc]; } @end @interface GSAvahiTimer: NSObject { GSAvahiRunLoopContext *ctx; AvahiTimeoutCallback callback; NSTimer *timer; NSDate *fireDate; void *userData; } @end @implementation GSAvahiTimer - (void) didTimeout: (NSTimer*)timer { callback((AvahiTimeout*)self, userData); } - (void) setTimerToInterval: (NSTimeInterval)interval { // Invalidate the old timer; if (timer != nil) { [timer invalidate]; timer = nil; } // NOTE: the timer ivar is a weak reference; runloops retain their // timers. timer = [NSTimer timerWithTimeInterval: interval target: self selector: @selector(didTimeout:) userInfo: nil repeats: NO]; [[ctx runLoop] addTimer: timer forMode: [ctx mode]]; } - (void) setTimerToTimeval: (const struct timeval*)tv { // Invalidate the old timer if (timer != nil) { [timer invalidate]; timer = nil; } if (NULL != tv) { // Construct a NSTimeInterval for the timer: NSTimeInterval interval = (NSTimeInterval)tv->tv_sec; interval += (NSTimeInterval)(tv->tv_usec / 1000000.0); [self setTimerToInterval: interval]; } } - (id) initWithCallback: (AvahiTimeoutCallback)aCallback andContext: (GSAvahiRunLoopContext*)aCtx forTimeval: (const struct timeval*)tv userData: (void*)ud { if (nil == (self = [super init])) { return nil; } // The context retains its watchers and timeouts: ctx = aCtx; callback = aCallback; userData = ud; [self setTimerToTimeval: tv]; return self; } - (void) unschedule { if ([timer isValid]) { fireDate = [[timer fireDate] retain]; [timer invalidate]; timer = nil; } } - (void) removeFromContext { [self unschedule]; [ctx removeTimeout: self]; ctx = nil; } - (void) setContext: (GSAvahiRunLoopContext*)aCtxt { ctx = aCtxt; } - (void) reschedule { // Only reschedule if fireDate has been set, otherwise the Avahi layer will // schedule a new timer. if (nil != fireDate) { NSTimeInterval interval = [fireDate timeIntervalSinceNow]; [self setTimerToInterval: MAX(0.1,interval)]; [fireDate release]; fireDate = nil; } } - (void) dealloc { if (nil != timer) { [timer invalidate]; } [super dealloc]; } @end static AvahiWatch* GSAvahiWatchNew(const AvahiPoll *api, int fd, AvahiWatchEvent event, AvahiWatchCallback callback, void *userData) { // NOTE: strangly enough, the userData parameter is not the userdata we // passed to the poll structure (it is somehow related to the dbus // internals). CTX(api->userdata); GSAvahiWatcher *w = [ctx avahiWatcherWithCallback: callback onEvent: event forFileDescriptor: fd userData: userData]; // NOTE: avahi defines AvahiWatch as a struct, since we only pass around // pointers to those, we can just cast the pointer to our watcher object to // AvahiWatch*. return (AvahiWatch*)w; } static void GSAvahiWatchUpdate(AvahiWatch *watch, AvahiWatchEvent event) { [(GSAvahiWatcher*)watch listenForEvents: event]; } static AvahiWatchEvent GSAvahiWatchGetEvents(AvahiWatch *watch) { return [(GSAvahiWatcher*)watch getEvents]; } static void GSAvahiWatchFree(AvahiWatch *watch) { [(GSAvahiWatcher*)watch removeFromContext]; } static AvahiTimeout* GSAvahiTimeoutNew(const AvahiPoll *api, const struct timeval *tv, AvahiTimeoutCallback callback, void *userData) { // NOTE: strangly enough, the userData parameter is not the userdata we // passed to the poll structure (it is somehow related to the dbus // internals.) CTX(api->userdata); GSAvahiTimer *t = [ctx avahiTimerWithCallback: callback withTimeval: tv userData: userData]; // NOTE: Cf. GSAvahiWatchNew(). return (AvahiTimeout*)t; } static void GSAvahiTimeoutUpdate(AvahiTimeout* timeout, const struct timeval *tv) { [(GSAvahiTimer*)timeout setTimerToTimeval: tv]; } static void GSAvahiTimeoutFree(AvahiTimeout* timeout) { [(GSAvahiTimer*)timeout removeFromContext]; } @implementation GSAvahiRunLoopContext - (id) initWithRunLoop: (NSRunLoop*)rl forMode: (NSString*)aMode { if (nil == (self = [super init])) { return nil; } lock = [[NSLock alloc] init]; [lock setName: @"GSAvahiRunLoopContextLock"]; poll = malloc(sizeof(AvahiPoll)); NSAssert(poll, @"Could not allocate avahi polling structure."); poll->userdata = (void*)self; //userInfo poll->watch_new = GSAvahiWatchNew; //create a new GSAvahiWatcher poll->watch_update = GSAvahiWatchUpdate; //update the watcher poll->watch_get_events = GSAvahiWatchGetEvents; //retrieve events poll->watch_free = GSAvahiWatchFree; //remove watcher from context poll->timeout_new = GSAvahiTimeoutNew; //create a new GSAvahiTimer poll->timeout_update = GSAvahiTimeoutUpdate; //update the timer poll->timeout_free = GSAvahiTimeoutFree; //remove the timer from context //Runloops don't need to be retained; runLoop = rl; ASSIGNCOPY(mode,aMode); children = [[NSMutableArray alloc] init]; return self; } - (NSRunLoop*) runLoop { // NOTE: We don't protect this with the lock because it will only ever be // changed by -removeFromRunLoop:forMode: or -scheduleInRunLoop:forMode:, // which is where we do the locking. return runLoop; } - (NSString*) mode { /* NOTE: We don't protect this with the lock because it will only ever be * changed by -removeFromRunLoop:forMode: or -scheduleInRunLoop:forMode:, * which is where we do the locking. */ return mode; } - (const AvahiPoll*) avahiPoll { return (const AvahiPoll*)poll; } - (GSAvahiTimer*) avahiTimerWithCallback: (AvahiTimeoutCallback)callback withTimeval: (const struct timeval*)tv userData: (void*)ud { GSAvahiTimer *timer = nil; [lock lock]; timer = [[[GSAvahiTimer alloc] initWithCallback: callback andContext: self forTimeval: tv userData: ud] autorelease]; if (nil != timer) { [children addObject: timer]; } [lock unlock]; return timer; } - (GSAvahiWatcher*) avahiWatcherWithCallback: (AvahiWatchCallback)callback onEvent: (AvahiWatchEvent)someEvents forFileDescriptor: (NSInteger)fd userData: (void*)ud { GSAvahiWatcher *w = nil; [lock lock]; w = [[[GSAvahiWatcher alloc] initWithCallback: callback andContext: self onEvent: someEvents forFd: fd userData: ud] autorelease]; if (nil != w) { [children addObject: w]; } [lock unlock]; return w; } - (void) removeChild: (id)c { if (nil != c) { [lock lock]; [children removeObject: c]; [lock unlock]; } } - (void) removeWatcher: (GSAvahiWatcher*)w { [self removeChild: w]; } - (void) removeTimeout: (GSAvahiTimer*)at { [self removeChild: at]; } - (void) removeFromRunLoop: (NSRunLoop*)rl forMode: (NSString*)m { [lock lock]; if ((rl == runLoop) && [mode isEqualToString: m]) { FOR_IN(GSAvahiWatcher*, child, children) { [child unschedule]; } END_FOR_IN(children) runLoop = nil; [mode release]; mode = nil; } [lock unlock]; } - (void) scheduleInRunLoop: (NSRunLoop*)rl forMode: (NSString*)m { [lock lock]; if ((runLoop == nil) && (mode == nil) && ((rl != nil) && (m != nil))) { runLoop = rl; ASSIGNCOPY(mode,m); FOR_IN(GSAvahiWatcher*, child, children) { [child reschedule]; } END_FOR_IN(children) } [lock unlock]; } - (void) dealloc { /* Some avahi internals might still reference the poll structure and could * try to create additional watchers and timers on the runloop, so we should * clean it up properly: */ poll->userdata = (void*)NULL; [self removeFromRunLoop: runLoop forMode: mode]; FOR_IN(GSAvahiWatcher*, child, children) { [child setContext: nil]; } END_FOR_IN(children) free(poll); poll = NULL; [children release]; [mode release]; [lock release]; [super dealloc]; } @end gnustep-base-1.29.0/Source/GSBlocks.m000066400000000000000000000036251435650067400173050ustar00rootroot00000000000000/** Implementation of GSBlocks for GNUStep Copyright (C) 2011 Free Software Foundation, Inc. This file is part of the GNUstep Base Library. 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 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 USA. */ #import "Foundation/NSObject.h" @interface GSBlock : NSObject @end @implementation GSBlock + (void) load { unsigned int methodCount; Method *m = NULL; Method *methods = class_copyMethodList(self, &methodCount); id blockClass = objc_lookUpClass("_NSBlock"); Protocol *nscopying = NULL; /* If we don't have an _NSBlock class, we don't have blocks support in the * runtime, so give up. */ if (nil == blockClass) { return; } /* Copy all of the methods in this class onto the block-runtime-provided * _NSBlock */ for (m = methods; NULL != *m; m++) { class_addMethod(blockClass, method_getName(*m), method_getImplementation(*m), method_getTypeEncoding(*m)); } nscopying = objc_getProtocol("NSCopying"); class_addProtocol(blockClass, nscopying); free(methods); } - (id) copyWithZone: (NSZone*)aZone { return _Block_copy(self); } - (id) copy { return _Block_copy(self); } - (id) retain { return _Block_copy(self); } - (oneway void) release { _Block_release(self); } @end gnustep-base-1.29.0/Source/GSConcreteValue.m000066400000000000000000000030371435650067400206240ustar00rootroot00000000000000/* GSConcreteValue - Handle preprocessor magic for GSConcreteValueTemplate Copyright (C) 1993,1994 Free Software Foundation, Inc. Written by: Andrew Ruder Date: May 2006 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #import "Foundation/NSValue.h" #import "Foundation/NSException.h" #import "Foundation/NSCoder.h" #define TYPE_ORDER 0 #include "GSConcreteValueTemplate.m" #undef TYPE_ORDER #define TYPE_ORDER 1 #include "GSConcreteValueTemplate.m" #undef TYPE_ORDER #define TYPE_ORDER 2 #include "GSConcreteValueTemplate.m" #undef TYPE_ORDER #define TYPE_ORDER 3 #include "GSConcreteValueTemplate.m" #undef TYPE_ORDER #define TYPE_ORDER 4 #include "GSConcreteValueTemplate.m" #undef TYPE_ORDER #define TYPE_ORDER 5 #include "GSConcreteValueTemplate.m" #undef TYPE_ORDER gnustep-base-1.29.0/Source/GSConcreteValueTemplate.m000066400000000000000000000143451435650067400223240ustar00rootroot00000000000000# line 1 "GSConcreteValueTemplate.m" /* So gdb knows which file we are in */ /* GSConcreteValueTemplate - Object encapsulation for C types. Copyright (C) 1993,1994 Free Software Foundation, Inc. Written by: Adam Fedor Date: Mar 1995 This file is part of the GNUstep Base Library. 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 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 USA. */ /* This file should be run through a preprocessor with the macro TYPE_ORDER defined to a number from 0 to 4 corresponding to each value type */ #if TYPE_ORDER == 0 @interface GSNonretainedObjectValue : NSValue { id data; } @end # define GSTemplateValue GSNonretainedObjectValue # define TYPE_METHOD nonretainedObjectValue # define TYPE_NAME id #elif TYPE_ORDER == 1 @interface GSPointValue : NSValue { NSPoint data; } @end # define GSTemplateValue GSPointValue # define TYPE_METHOD pointValue # define TYPE_NAME NSPoint #elif TYPE_ORDER == 2 @interface GSPointerValue : NSValue { void *data; } @end # define GSTemplateValue GSPointerValue # define TYPE_METHOD pointerValue # define TYPE_NAME void * #elif TYPE_ORDER == 3 # define GSTemplateValue GSRangeValue @interface GSRangeValue : NSValue { NSRange data; } @end # define TYPE_METHOD rangeValue # define TYPE_NAME NSRange #elif TYPE_ORDER == 4 @interface GSRectValue : NSValue { NSRect data; } @end # define GSTemplateValue GSRectValue # define TYPE_METHOD rectValue # define TYPE_NAME NSRect #elif TYPE_ORDER == 5 @interface GSSizeValue : NSValue { NSSize data; } @end # define GSTemplateValue GSSizeValue # define TYPE_METHOD sizeValue # define TYPE_NAME NSSize #endif @implementation GSTemplateValue + (void) initialize { /* * Ensure that the version encoded is that used by the abstract class. */ [self setVersion: [super version]]; } // Allocating and Initializing - (id) initWithBytes: (const void *)value objCType: (const char *)type { typedef __typeof__(data) _dt; self = [super init]; data = *(_dt *)value; return self; } // Accessing Data - (void) getValue: (void *)value { NSUInteger size; if (!value) { [NSException raise: NSInvalidArgumentException format: @"Cannot copy value into NULL buffer"]; /* NOT REACHED */ } NSGetSizeAndAlignment([self objCType], &size, NULL); memcpy(value, &data, size); } - (BOOL) isEqual: (id)other { if (other != nil && GSObjCIsInstance(other) == YES && GSObjCIsKindOf(object_getClass(other), object_getClass(self))) { return [self isEqualToValue: other]; } return NO; } - (BOOL) isEqualToValue: (NSValue*)aValue { typedef __typeof__(data) _dt; if (aValue != nil && GSObjCIsInstance(aValue) == YES && GSObjCIsKindOf(object_getClass(aValue), object_getClass(self))) { _dt val = [aValue TYPE_METHOD]; #if TYPE_ORDER == 0 return [data isEqual: val]; #elif TYPE_ORDER == 1 if (data.x == val.x && data.y == val.y) return YES; else return NO; #elif TYPE_ORDER == 2 if (data == val) return YES; else return NO; #elif TYPE_ORDER == 3 if (data.location == val.location && data.length == val.length) return YES; else return NO; #elif TYPE_ORDER == 4 if (data.origin.x == val.origin.x && data.origin.y == val.origin.y && data.size.width == val.size.width && data.size.height == val.size.height) return YES; else return NO; #elif TYPE_ORDER == 5 if (data.width == val.width && data.height == val.height) return YES; else return NO; #endif } return NO; } - (NSUInteger) hash { #if TYPE_ORDER == 0 return [data hash]; #elif TYPE_ORDER == 1 union { double d; unsigned char c[sizeof(double)]; } val; NSUInteger hash = 0; unsigned int i; val.d = data.x + data.y; for (i = 0; i < sizeof(double); i++) hash += val.c[i]; return hash; #elif TYPE_ORDER == 2 return (NSUInteger)(uintptr_t)data; #elif TYPE_ORDER == 3 return (data.length ^ data.location); #elif TYPE_ORDER == 4 union { double d; unsigned char c[sizeof(double)]; } val; NSUInteger hash = 0; unsigned int i; val.d = data.origin.x + data.origin.y + data.size.width + data.size.height; for (i = 0; i < sizeof(double); i++) hash += val.c[i]; return hash; #elif TYPE_ORDER == 5 union { double d; unsigned char c[sizeof(double)]; } val; NSUInteger hash = 0; unsigned int i; val.d = data.width + data.height; for (i = 0; i < sizeof(double); i++) hash += val.c[i]; return hash; #endif } - (const char *)objCType { typedef __typeof__(data) _dt; return @encode(_dt); } - (TYPE_NAME)TYPE_METHOD { return data; } - (NSString *) description { #if TYPE_ORDER == 0 return [NSString stringWithFormat: @"{object = %p;}", data]; #elif TYPE_ORDER == 1 return NSStringFromPoint(data); #elif TYPE_ORDER == 2 return [NSString stringWithFormat: @"{pointer = %p;}", data]; #elif TYPE_ORDER == 3 return NSStringFromRange(data); #elif TYPE_ORDER == 4 return NSStringFromRect(data); #elif TYPE_ORDER == 5 return NSStringFromSize(data); #endif } #if TYPE_ORDER == 1 - (NSSize)sizeValue { return NSMakeSize(data.x, data.y); } #elif TYPE_ORDER == 5 - (NSPoint)pointValue { return NSMakePoint(data.width, data.height); } #endif // NSCoding - (void) encodeWithCoder: (NSCoder*)coder { #if TYPE_ORDER == 0 [NSException raise: NSInternalInconsistencyException format: @"Attempt to encode a non-retained object"]; #elif TYPE_ORDER == 2 [NSException raise: NSInternalInconsistencyException format: @"Attempt to encode a pointer to void object"]; #else [super encodeWithCoder: coder]; #endif } @end #undef GSTemplateValue #undef TYPE_METHOD #undef TYPE_NAME gnustep-base-1.29.0/Source/GSCountedSet.m000066400000000000000000000207021435650067400201400ustar00rootroot00000000000000/** Concrete implementation of NSCountedSet based on GNU Set class Copyright (C) 1998,2000 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: October 1998 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #import "Foundation/NSSet.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSException.h" #import "Foundation/NSPortCoder.h" #import "GSPrivate.h" #define GSI_MAP_RETAIN_VAL(M, X) #define GSI_MAP_RELEASE_VAL(M, X) #define GSI_MAP_KTYPES GSUNION_OBJ #define GSI_MAP_VTYPES GSUNION_NSINT #include "GNUstepBase/GSIMap.h" @interface GSCountedSet : NSCountedSet { @public GSIMapTable_t map; @private unsigned long _version; } @end @interface GSCountedSetEnumerator : NSEnumerator { GSCountedSet *set; GSIMapEnumerator_t enumerator; } @end @implementation GSCountedSetEnumerator - (void) dealloc { GSIMapEndEnumerator(&enumerator); RELEASE(set); [super dealloc]; } - (id) initWithSet: (NSSet*)d { self = [super init]; if (self != nil) { set = RETAIN((GSCountedSet*)d); enumerator = GSIMapEnumeratorForMap(&set->map); } return self; } - (id) nextObject { GSIMapNode node = GSIMapEnumeratorNextNode(&enumerator); if (node == 0) { return nil; } return node->key.obj; } @end @implementation GSCountedSet - (NSUInteger) sizeOfContentExcluding: (NSHashTable*)exclude { /* Can't safely calculate for mutable object; just buffer size */ return map.nodeCount * sizeof(GSIMapNode); } + (void) initialize { if (self == [GSCountedSet class]) { } } /** * Adds an object to the set. If the set already contains an object * equal to the specified object (as determined by the [-isEqual:] * method) then the count for that object is incremented rather * than the new object being added. */ - (void) addObject: (id)anObject { GSIMapNode node; if (anObject == nil) { [NSException raise: NSInvalidArgumentException format: @"Tried to nil value to counted set"]; } _version++; node = GSIMapNodeForKey(&map, (GSIMapKey)anObject); if (node == 0) { GSIMapAddPair(&map,(GSIMapKey)anObject,(GSIMapVal)(NSUInteger)1); } else { node->value.nsu++; } _version++; } - (NSUInteger) count { return map.nodeCount; } - (NSUInteger) countForObject: (id)anObject { if (anObject) { GSIMapNode node = GSIMapNodeForKey(&map, (GSIMapKey)anObject); if (node) { return node->value.nsu; } } return 0; } - (void) dealloc { GSIMapEmptyMap(&map); [super dealloc]; } - (void) encodeWithCoder: (NSCoder*)aCoder { unsigned count = map.nodeCount; SEL sel1 = @selector(encodeObject:); IMP imp1 = [aCoder methodForSelector: sel1]; SEL sel2 = @selector(encodeValueOfObjCType:at:); IMP imp2 = [aCoder methodForSelector: sel2]; const char *type = @encode(unsigned); GSIMapEnumerator_t enumerator = GSIMapEnumeratorForMap(&map); GSIMapNode node = GSIMapEnumeratorNextNode(&enumerator); (*imp2)(aCoder, sel2, type, &count); while (node != 0) { (*imp1)(aCoder, sel1, node->key.obj); (*imp2)(aCoder, sel2, type, &node->value.nsu); node = GSIMapEnumeratorNextNode(&enumerator); } GSIMapEndEnumerator(&enumerator); } - (NSUInteger) hash { return map.nodeCount; } - (id) init { return [self initWithCapacity: 0]; } /* Designated initialiser */ - (id) initWithCapacity: (NSUInteger)cap { GSIMapInitWithZoneAndCapacity(&map, [self zone], cap); return self; } - (id) initWithCoder: (NSCoder*)aCoder { unsigned count; id value; NSUInteger valcnt; SEL sel = @selector(decodeValueOfObjCType:at:); IMP imp = [aCoder methodForSelector: sel]; const char *utype = @encode(unsigned); const char *otype = @encode(id); (*imp)(aCoder, sel, utype, &count); GSIMapInitWithZoneAndCapacity(&map, [self zone], count); while (count-- > 0) { (*imp)(aCoder, sel, otype, &value); (*imp)(aCoder, sel, utype, &valcnt); GSIMapAddPairNoRetain(&map, (GSIMapKey)value, (GSIMapVal)valcnt); } return self; } - (id) initWithObjects: (const id[])objs count: (NSUInteger)c { NSUInteger i; self = [self initWithCapacity: c]; if (self == nil) { return nil; } for (i = 0; i < c; i++) { GSIMapNode node; if (objs[i] == nil) { DESTROY(self); [NSException raise: NSInvalidArgumentException format: @"Tried to init counted set with nil value"]; } node = GSIMapNodeForKey(&map, (GSIMapKey)objs[i]); if (node == 0) { GSIMapAddPair(&map,(GSIMapKey)objs[i],(GSIMapVal)(NSUInteger)1); } else { node->value.nsu++; } } return self; } - (id) member: (id)anObject { if (anObject != nil) { GSIMapNode node = GSIMapNodeForKey(&map, (GSIMapKey)anObject); if (node != 0) { return node->key.obj; } } return nil; } - (NSEnumerator*) objectEnumerator { return AUTORELEASE([[GSCountedSetEnumerator allocWithZone: NSDefaultMallocZone()] initWithSet: self]); } /** * Removes all objcts which have not been added more than level times * from the counted set.
* Note to GNUstep maintainers ... this method depends on the characteristic * of the GSIMap enumeration that, once enumerated, an object can be removed * from the map. If GSIMap ever loses that characterstic, this will break. */ - (void) purge: (NSInteger)level { if (level > 0) { GSIMapEnumerator_t enumerator = GSIMapEnumeratorForMap(&map); GSIMapBucket bucket = GSIMapEnumeratorBucket(&enumerator); GSIMapNode node = GSIMapEnumeratorNextNode(&enumerator); while (node != 0) { if (node->value.nsu <= (NSUInteger)level) { _version++; GSIMapRemoveNodeFromMap(&map, bucket, node); GSIMapFreeNode(&map, node); _version++; } bucket = GSIMapEnumeratorBucket(&enumerator); node = GSIMapEnumeratorNextNode(&enumerator); } GSIMapEndEnumerator(&enumerator); } } - (void) removeAllObjects { _version++; GSIMapCleanMap(&map); _version++; } /** * Decrements the count of the number of times that the specified * object (or an object equal to it as determined by the * [-isEqual:] method) has been added to the set. If the count * becomes zero, the object is removed from the set. */ - (void) removeObject: (id)anObject { GSIMapBucket bucket; if (anObject == nil) { NSWarnMLog(@"attempt to remove nil object"); return; } _version++; bucket = GSIMapBucketForKey(&map, (GSIMapKey)anObject); if (bucket != 0) { GSIMapNode node; node = GSIMapNodeForKeyInBucket(&map, bucket, (GSIMapKey)anObject); if (node != 0) { if (--node->value.nsu == 0) { GSIMapRemoveNodeFromMap(&map, bucket, node); GSIMapFreeNode(&map, node); } } } _version++; } - (id) unique: (id)anObject { GSIMapNode node; id result; _version++; if (anObject == nil) { [NSException raise: NSInvalidArgumentException format: @"Tried to unique nil value in counted set"]; } node = GSIMapNodeForKey(&map, (GSIMapKey)anObject); if (node == 0) { result = anObject; GSIMapAddPair(&map,(GSIMapKey)anObject,(GSIMapVal)(NSUInteger)1); } else { result = node->key.obj; node->value.nsu++; if (result != anObject) { [anObject release]; [result retain]; } } _version++; return result; } - (NSUInteger) countByEnumeratingWithState: (NSFastEnumerationState*)state objects: (id*)stackbuf count: (NSUInteger)len { state->mutationsPtr = &_version; return GSIMapCountByEnumeratingWithStateObjectsCount (&map, state, stackbuf, len); } @end gnustep-base-1.29.0/Source/GSDictionary.m000066400000000000000000000312171435650067400201730ustar00rootroot00000000000000/** Interface to concrete implementation of NSDictionary Copyright (C) 1998 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: September 1998 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSException.h" #import "Foundation/NSPortCoder.h" // For private method _decodeArrayOfObjectsForKey: #import "Foundation/NSKeyedArchiver.h" #import "GNUstepBase/GSObjCRuntime.h" #import "GSPrivate.h" /* * The 'Fastmap' stuff provides an inline implementation of a mapping * table - for maximum performance. */ #define GSI_MAP_KTYPES GSUNION_OBJ #define GSI_MAP_VTYPES GSUNION_OBJ #define GSI_MAP_HASH(M, X) [X.obj hash] #define GSI_MAP_EQUAL(M, X,Y) [X.obj isEqual: Y.obj] #define GSI_MAP_RETAIN_KEY(M, X) ((X).obj) = \ [((id)(X).obj) copyWithZone: map->zone] #include "GNUstepBase/GSIMap.h" @interface GSDictionary : NSDictionary { @public GSIMapTable_t map; } @end @interface GSMutableDictionary : NSMutableDictionary { @public GSIMapTable_t map; unsigned long _version; } @end @interface GSDictionaryKeyEnumerator : NSEnumerator { GSDictionary *dictionary; GSIMapEnumerator_t enumerator; } - (id) initWithDictionary: (NSDictionary*)d; @end @interface GSDictionaryObjectEnumerator : GSDictionaryKeyEnumerator @end @implementation GSDictionary static SEL nxtSel; static SEL objSel; - (NSUInteger) sizeOfContentExcluding: (NSHashTable*)exclude { NSUInteger size = GSIMapSize(&map) - sizeof(GSIMapTable); GSIMapEnumerator_t enumerator = GSIMapEnumeratorForMap(&map); GSIMapNode node = GSIMapEnumeratorNextNode(&enumerator); while (node != 0) { size += [node->key.obj sizeInBytesExcluding: exclude]; size += [node->value.obj sizeInBytesExcluding: exclude]; node = GSIMapEnumeratorNextNode(&enumerator); } GSIMapEndEnumerator(&enumerator); return size + [super sizeOfContentExcluding: exclude]; } + (void) initialize { if (self == [GSDictionary class]) { nxtSel = @selector(nextObject); objSel = @selector(objectForKey:); } } - (id) copyWithZone: (NSZone*)zone { return RETAIN(self); } - (NSUInteger) count { return map.nodeCount; } - (void) dealloc { GSIMapEmptyMap(&map); [super dealloc]; } - (void) encodeWithCoder: (NSCoder*)aCoder { if ([aCoder allowsKeyedCoding]) { [super encodeWithCoder: aCoder]; } else { unsigned count = map.nodeCount; SEL sel = @selector(encodeObject:); IMP imp = [aCoder methodForSelector: sel]; GSIMapEnumerator_t enumerator = GSIMapEnumeratorForMap(&map); GSIMapNode node = GSIMapEnumeratorNextNode(&enumerator); [aCoder encodeValueOfObjCType: @encode(unsigned) at: &count]; while (node != 0) { (*imp)(aCoder, sel, node->key.obj); (*imp)(aCoder, sel, node->value.obj); node = GSIMapEnumeratorNextNode(&enumerator); } GSIMapEndEnumerator(&enumerator); } } - (NSUInteger) hash { return map.nodeCount; } - (id) init { return [self initWithObjects: 0 forKeys: 0 count: 0]; } - (id) initWithCoder: (NSCoder*)aCoder { if ([aCoder allowsKeyedCoding]) { self = [super initWithCoder: aCoder]; } else { unsigned count; id key; id value; SEL sel = @selector(decodeValueOfObjCType:at:); IMP imp = [aCoder methodForSelector: sel]; const char *type = @encode(id); [aCoder decodeValueOfObjCType: @encode(unsigned) at: &count]; GSIMapInitWithZoneAndCapacity(&map, [self zone], count); while (count-- > 0) { (*imp)(aCoder, sel, type, &key); (*imp)(aCoder, sel, type, &value); GSIMapAddPairNoRetain(&map, (GSIMapKey)key, (GSIMapVal)value); } } return self; } /* Designated initialiser */ - (id) initWithObjects: (const id[])objs forKeys: (const id [])keys count: (NSUInteger)c { NSUInteger i; GSIMapInitWithZoneAndCapacity(&map, [self zone], c); for (i = 0; i < c; i++) { GSIMapNode node; if (keys[i] == nil) { DESTROY(self); [NSException raise: NSInvalidArgumentException format: @"Tried to init dictionary with nil key"]; } if (objs[i] == nil) { DESTROY(self); [NSException raise: NSInvalidArgumentException format: @"Tried to init dictionary with nil value"]; } node = GSIMapNodeForKey(&map, (GSIMapKey)(id)keys[i]); if (node) { IF_NO_ARC(RETAIN(objs[i]);) RELEASE(node->value.obj); node->value.obj = objs[i]; } else { GSIMapAddPair(&map, (GSIMapKey)(id)keys[i], (GSIMapVal)objs[i]); } } return self; } /* * This avoids using the designated initialiser for performance reasons. */ - (id) initWithDictionary: (NSDictionary*)other copyItems: (BOOL)shouldCopy { NSZone *z = [self zone]; NSUInteger c = [other count]; GSIMapInitWithZoneAndCapacity(&map, z, c); if (c > 0) { NSEnumerator *e = [other keyEnumerator]; IMP nxtObj = [e methodForSelector: nxtSel]; IMP otherObj = [other methodForSelector: objSel]; BOOL isProxy = [other isProxy]; NSUInteger i; for (i = 0; i < c; i++) { GSIMapNode node; id k; id o; if (isProxy == YES) { k = [e nextObject]; o = [other objectForKey: k]; } else { k = (*nxtObj)(e, nxtSel); o = (*otherObj)(other, objSel, k); } k = [k copyWithZone: z]; if (k == nil) { DESTROY(self); [NSException raise: NSInvalidArgumentException format: @"Tried to init dictionary with nil key"]; } if (shouldCopy) { o = [o copyWithZone: z]; } else { o = RETAIN(o); } if (o == nil) { DESTROY(self); [NSException raise: NSInvalidArgumentException format: @"Tried to init dictionary with nil value"]; } node = GSIMapNodeForKey(&map, (GSIMapKey)k); if (node) { RELEASE(node->value.obj); node->value.obj = o; } else { GSIMapAddPairNoRetain(&map, (GSIMapKey)k, (GSIMapVal)o); } } } return self; } - (BOOL) isEqualToDictionary: (NSDictionary*)other { NSUInteger count; if (other == self) { return YES; } count = map.nodeCount; if (count == [other count]) { if (count > 0) { GSIMapEnumerator_t enumerator; GSIMapNode node; IMP otherObj = [other methodForSelector: objSel]; enumerator = GSIMapEnumeratorForMap(&map); while ((node = GSIMapEnumeratorNextNode(&enumerator)) != 0) { id o1 = node->value.obj; id o2 = (*otherObj)(other, objSel, node->key.obj); if (o1 != o2 && [o1 isEqual: o2] == NO) { GSIMapEndEnumerator(&enumerator); return NO; } } GSIMapEndEnumerator(&enumerator); } return YES; } return NO; } - (NSEnumerator*) keyEnumerator { return AUTORELEASE([[GSDictionaryKeyEnumerator allocWithZone: NSDefaultMallocZone()] initWithDictionary: self]); } - (BOOL) makeImmutable { return YES; } - (NSEnumerator*) objectEnumerator { return AUTORELEASE([[GSDictionaryObjectEnumerator allocWithZone: NSDefaultMallocZone()] initWithDictionary: self]); } - (id) objectForKey: aKey { if (aKey != nil) { GSIMapNode node = GSIMapNodeForKey(&map, (GSIMapKey)aKey); if (node) { return node->value.obj; } } return nil; } - (NSUInteger) countByEnumeratingWithState: (NSFastEnumerationState*)state objects: (__unsafe_unretained id[])stackbuf count: (NSUInteger)len { state->mutationsPtr = (unsigned long *)self; return GSIMapCountByEnumeratingWithStateObjectsCount (&map, state, stackbuf, len); } @end @implementation GSMutableDictionary - (NSUInteger) sizeOfContentExcluding: (NSHashTable*)exclude { /* Can't safely calculate for mutable object; just buffer size */ return map.nodeCount * sizeof(GSIMapNode); } + (void) initialize { if (self == [GSMutableDictionary class]) { GSObjCAddClassBehavior(self, [GSDictionary class]); } } - (id) copyWithZone: (NSZone*)zone { NSDictionary *copy = [GSDictionary allocWithZone: zone]; return [copy initWithDictionary: self copyItems: NO]; } - (id) init { return [self initWithCapacity: 0]; } /* Designated initialiser */ - (id) initWithCapacity: (NSUInteger)cap { GSIMapInitWithZoneAndCapacity(&map, [self zone], cap); return self; } - (BOOL) makeImmutable { GSClassSwizzle(self, [GSDictionary class]); return YES; } - (id) makeImmutableCopyOnFail: (BOOL)force { GSClassSwizzle(self, [GSDictionary class]); return self; } - (void) setObject: (id)anObject forKey: (id)aKey { GSIMapNode node; if (aKey == nil) { NSException *e; e = [NSException exceptionWithName: NSInvalidArgumentException reason: @"Tried to add nil key to dictionary" userInfo: self]; [e raise]; } if (anObject == nil) { NSException *e; NSString *s; s = [NSString stringWithFormat: @"Tried to add nil value for key '%@' to dictionary", aKey]; e = [NSException exceptionWithName: NSInvalidArgumentException reason: s userInfo: self]; [e raise]; } _version++; node = GSIMapNodeForKey(&map, (GSIMapKey)aKey); if (node) { IF_NO_ARC(RETAIN(anObject);) RELEASE(node->value.obj); node->value.obj = anObject; } else { GSIMapAddPair(&map, (GSIMapKey)aKey, (GSIMapVal)anObject); } _version++; } - (void) removeAllObjects { _version++; GSIMapCleanMap(&map); _version++; } - (void) removeObjectForKey: (id)aKey { if (aKey == nil) { NSWarnMLog(@"attempt to remove nil key from dictionary %@", self); return; } _version++; GSIMapRemoveKey(&map, (GSIMapKey)aKey); _version++; } - (NSUInteger) countByEnumeratingWithState: (NSFastEnumerationState*)state objects: (__unsafe_unretained id[])stackbuf count: (NSUInteger)len { state->mutationsPtr = &_version; return GSIMapCountByEnumeratingWithStateObjectsCount (&map, state, stackbuf, len); } @end @implementation GSDictionaryKeyEnumerator - (id) initWithDictionary: (NSDictionary*)d { [super init]; dictionary = (GSDictionary*)RETAIN(d); enumerator = GSIMapEnumeratorForMap(&dictionary->map); return self; } - (id) nextObject { GSIMapNode node = GSIMapEnumeratorNextNode(&enumerator); if (node == 0) { return nil; } return node->key.obj; } - (void) dealloc { GSIMapEndEnumerator(&enumerator); RELEASE(dictionary); [super dealloc]; } @end @implementation GSDictionaryObjectEnumerator - (id) nextObject { GSIMapNode node = GSIMapEnumeratorNextNode(&enumerator); if (node == 0) { return nil; } return node->value.obj; } @end @interface NSGDictionary : NSDictionary @end @implementation NSGDictionary - (id) initWithCoder: (NSCoder*)aCoder { NSLog(@"Warning - decoding archive containing obsolete %@ object - please delete/replace this archive", NSStringFromClass([self class])); DESTROY(self); self = (id)NSAllocateObject([GSDictionary class], 0, NSDefaultMallocZone()); self = [self initWithCoder: aCoder]; return self; } @end @interface NSGMutableDictionary : NSMutableDictionary @end @implementation NSGMutableDictionary - (id) initWithCoder: (NSCoder*)aCoder { NSLog(@"Warning - decoding archive containing obsolete %@ object - please delete/replace this archive", NSStringFromClass([self class])); DESTROY(self); self = (id)NSAllocateObject([GSMutableDictionary class], 0, NSDefaultMallocZone()); self = [self initWithCoder: aCoder]; return self; } @end @interface GSCachedDictionary : GSDictionary { BOOL _uncached; } @end @implementation GSCachedDictionary - (void) dealloc { if (NO == _uncached) { [NSException raise: NSInternalInconsistencyException format: @"Deallocating attributes which are still cached"]; } [super dealloc]; } - (void) _uncache { _uncached = YES; RELEASE(self); } @end gnustep-base-1.29.0/Source/GSDispatch.h000066400000000000000000000111451435650067400176160ustar00rootroot00000000000000/* Support header for conditionally enabling use of libdispatch. Copyright (C) 2012 Free Software Foundation, Inc. Written by: Niels Grewe Date: March 2012 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "GNUstepBase/GSBlocks.h" #if HAVE_DISPATCH_H #include #elif HAVE_DISPATCH_DISPATCH_H #include #endif /* * If gnustep-base is built with libdispatch support, these macros will expand * to code for creating and cleaning up after libdispach queues to which blocks * can be submitted. If libdispatch is not available, setup and teardown will * be no-ops, and the block will simply be executed on the calling thread. */ #if __has_feature(blocks) && (GS_USE_LIBDISPATCH == 1) /* * Older versions of libdispatch do not support concurrent queues. * We define away the attributes in this case. */ #ifndef DISPATCH_QUEUE_SERIAL #define DISPATCH_QUEUE_SERIAL NULL #endif #ifndef DISPATCH_QUEUE_CONCURRENT #define DISPATCH_QUEUE_CONCURRENT NULL #endif #define GS_DISPATCH_GET_DEFAULT_CONCURRENT_QUEUE() dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) /** * This macro creates a dispatch queue using the attributes */ #define GS_DISPATCH_QUEUE_CREATE(attr) dispatch_queue_create(NULL, attr) /** * Create a dispatch group */ #define GS_DISPATCH_GROUP_CREATE() dispatch_group_create() /** * Wait for the dispatch group to finish */ #define GS_DISPATCH_GROUP_FINISH(group) dispatch_group_wait(group, DISPATCH_TIME_FOREVER) /** * Release an dispatch object. */ #define GS_DISPATCH_RELEASE(x) dispatch_release(x) /** * Allows an arbitrary block to be submitted to the queue (if available) or run * in place. Since dispatch blocks return nothing and take no arguments, the * caller can use the before and after arguments to guard calling the block as * required. */ #define GS_DISPATCH_SUBMIT_BLOCK(group, queue, before, after, block, args, ...) \ if (queue != NULL) {\ dispatch_group_async(group, queue, ^(void){before block(args, ## __VA_ARGS__); after});\ } else {\ before\ block(args, ## __VA_ARGS__);\ after\ } /** * Submits a block without special provisions. */ #define GS_DISPATCH_SUBMIT_BLOCK_NO_ARGS(group, queue, block) dispatch_group_async(group, queue, block) /** * Convenience macro to create concurrent dispatch queues for the various * -enumerateUsingBlock: methods. Non-concurrent will be run in place. */ #define GS_DISPATCH_CREATE_QUEUE_AND_GROUP_FOR_ENUMERATION(queue, opts)\ dispatch_queue_t queue = NULL;\ dispatch_group_t queue ## Group = NULL;\ if (opts & NSEnumerationConcurrent)\ {\ queue = GS_DISPATCH_GET_DEFAULT_CONCURRENT_QUEUE();\ queue ## Group = GS_DISPATCH_GROUP_CREATE();\ } /** * Convenience macro to destroy concurrent dispatch queues for the various * -enumerateUsingBlock: methods. */ #define GS_DISPATCH_TEARDOWN_QUEUE_AND_GROUP_FOR_ENUMERATION(queue, opts)\ if (queue != NULL) { \ GS_DISPATCH_GROUP_FINISH(queue ## Group);\ GS_DISPATCH_RELEASE(queue ## Group);\ if (NO == (opts & NSEnumerationConcurrent))\ {\ GS_DISPATCH_RELEASE(queue);\ }\ } #else /* * No-Op defintions if libdispatch is not supposed to be used. */ #define DISPATCH_QUEUE_SERIAL 0 #define DISPATCH_QUEUE_CONCURRENT 0 #define dispatch_queue_attr_t int #define dispatch_queue_t int #define dispatch_group_t int #define GS_DISPATCH_GET_DEFAULT_CONCURRENT_QUEUE() 0 #define GS_DISPATCH_QUEUE_CREATE(attr) 0 #define GS_DISPATCH_GROUP_CREATE() 0 #define GS_DISPATCH_GROUP_FINISH(group) #define GS_DISPATCH_RELEASE(x) #define GS_DISPATCH_SUBMIT_BLOCK(group, queue, before, after, block, args...) CALL_BLOCK(block, args) #define GS_DISPATCH_SUBMIT_BLOCK_NO_ARGS(group, queue, block) CALL_BLOCK_NO_ARGS(block) #define GS_DISPATCH_CREATE_QUEUE_AND_GROUP_FOR_ENUMERATION(queue, opts) #define GS_DISPATCH_TEARDOWN_QUEUE_AND_GROUP_FOR_ENUMERATION(queue, opts) #endif gnustep-base-1.29.0/Source/GSEasyHandle.h000066400000000000000000000147601435650067400201020ustar00rootroot00000000000000#ifndef INCLUDED_GSEASYHANDLE_H #define INCLUDED_GSEASYHANDLE_H #import "common.h" #import @class NSData; @class NSError; @class NSURL; @class NSURLSessionConfiguration; @class NSURLSessionTask; @class GSTimeoutSource; typedef NS_ENUM(NSUInteger, GSEasyHandleAction) { GSEasyHandleActionAbort, GSEasyHandleActionProceed, GSEasyHandleActionPause, }; typedef NS_ENUM(NSUInteger, GSEasyHandleWriteBufferResult) { GSEasyHandleWriteBufferResultAbort, GSEasyHandleWriteBufferResultPause, GSEasyHandleWriteBufferResultBytes, }; @protocol GSEasyHandleDelegate /* * Handle data read from the network. * - returns: the action to be taken: abort, proceed, or pause. */ - (GSEasyHandleAction) didReceiveData: (NSData*)data; /* * Handle header data read from the network. * - returns: the action to be taken: abort, proceed, or pause. */ - (GSEasyHandleAction) didReceiveHeaderData: (NSData*)data contentLength: (int64_t)contentLength; /* * Fill a buffer with data to be sent. * - parameter data: The buffer to fill * - returns: the number of bytes written to the `data` buffer, or `nil` * to stop the current transfer immediately. */ - (void) fillWriteBufferLength: (NSInteger)length result: (void (^)(GSEasyHandleWriteBufferResult result, NSInteger length, NSData *data))result; /* * The transfer for this handle completed. * - parameter errorCode: An NSURLError code, or `nil` if no error occurred. */ - (void) transferCompletedWithError: (NSError*)error; /* * Seek the input stream to the given position */ - (BOOL) seekInputStreamToPosition: (uint64_t)position; /* * Gets called during the transfer to update progress. */ - (void) updateProgressMeterWithTotalBytesSent: (int64_t)totalBytesSent totalBytesExpectedToSend: (int64_t)totalBytesExpectedToSend totalBytesReceived: (int64_t)totalBytesReceived totalBytesExpectedToReceive: (int64_t)totalBytesExpectedToReceive; @end /* * Minimal wrapper around the curl easy interface * (https://curl.haxx.se/libcurl/c/) * * An *easy handle* manages the state of a transfer inside libcurl. * * As such the easy handle's responsibility is implementing the HTTP * protocol while the *multi handle* is in charge of managing sockets and * reading from / writing to these sockets. * * An easy handle is added to a multi handle in order to associate it with * an actual socket. The multi handle will then feed bytes into the easy * handle and read bytes from the easy handle. But this process is opaque * to use. It is further worth noting, that with HTTP/1.1 persistent * connections and with HTTP/2 there's a 1-to-many relationship between * TCP streams and HTTP transfers / easy handles. A single TCP stream and * its socket may be shared by multiple easy handles. * * A single HTTP request-response exchange (refered to here as a * *transfer*) corresponds directly to an easy handle. Hence anything that * needs to be configured for a specific transfer (e.g. the URL) will be * configured on an easy handle. * * A single `NSURLSessionTask` may do multiple, consecutive transfers, and * as a result it will have to reconfigure its easy handle between * transfers. An easy handle can be re-used once its transfer has * completed. * * Note: All code assumes that it is being called on a single thread, * it is intentionally **not** thread safe. */ @interface GSEasyHandle : NSObject { CURL *_rawHandle; char *_errorBuffer; id _delegate; GSTimeoutSource *_timeoutTimer; NSURL *_URL; } - (CURL*) rawHandle; - (char*) errorBuffer; /* * Set error buffer for error messages * - SeeAlso: https://curl.haxx.se/libcurl/c/CURLOPT_ERRORBUFFER.html */ - (void) setErrorBuffer: (char*)buffer; - (GSTimeoutSource*) timeoutTimer; - (void) setTimeoutTimer: (GSTimeoutSource*)timer; - (NSURL*) URL; /* * URL to use in the request * - SeeAlso: https://curl.haxx.se/libcurl/c/CURLOPT_URL.html */ - (void) setURL: (NSURL*)URL; - (void) setPipeWait: (BOOL)flag; - (instancetype) initWithDelegate: (id)delegate; - (void) transferCompletedWithError: (NSError*)error; - (int) urlErrorCodeWithEasyCode: (int)easyCode; - (void) setVerboseMode: (BOOL)flag; - (void) setDebugOutput: (BOOL)flag task: (NSURLSessionTask*)task; - (void) setPassHeadersToDataStream: (BOOL)flag; /* * Follow any Location: header that the server sends as part of a HTTP header * in a 3xx response */ - (void) setFollowLocation: (BOOL)flag; /* * Switch off the progress meter. */ - (void) setProgressMeterOff: (BOOL)flag; /* * Skip all signal handling * - SeeAlso: https://curl.haxx.se/libcurl/c/CURLOPT_NOSIGNAL.html */ - (void) setSkipAllSignalHandling: (BOOL)flag; /* * Request failure on HTTP response >= 400 */ - (void) setFailOnHTTPErrorCode: (BOOL)flag; - (void) setConnectToHost: (NSString*)host port: (NSInteger)port; - (void) setSessionConfig: (NSURLSessionConfiguration*)config; - (void) setAllowedProtocolsToHTTPAndHTTPS; /* * set preferred receive buffer size * - SeeAlso: https://curl.haxx.se/libcurl/c/CURLOPT_BUFFERSIZE.html */ - (void) setPreferredReceiveBufferSize: (NSInteger)size; /* * Set custom HTTP headers * - SeeAlso: https://curl.haxx.se/libcurl/c/CURLOPT_HTTPHEADER.html */ - (void) setCustomHeaders: (NSArray*)headers; /* * Enable automatic decompression of HTTP downloads * - SeeAlso: https://curl.haxx.se/libcurl/c/CURLOPT_ACCEPT_ENCODING.html * - SeeAlso: https://curl.haxx.se/libcurl/c/CURLOPT_HTTP_CONTENT_DECODING.html */ - (void) setAutomaticBodyDecompression: (BOOL)flag; /* * Set request method * - SeeAlso: https://curl.haxx.se/libcurl/c/CURLOPT_CUSTOMREQUEST.html */ - (void) setRequestMethod:(NSString*)method; /* * Download request without body * - SeeAlso: https://curl.haxx.se/libcurl/c/CURLOPT_NOBODY.html */ - (void) setNoBody: (BOOL)flag; /* * Enable data upload * - SeeAlso: https://curl.haxx.se/libcurl/c/CURLOPT_UPLOAD.html */ - (void) setUpload: (BOOL)flag; /* * Set size of the request body to send * - SeeAlso: https://curl.haxx.se/libcurl/c/CURLOPT_INFILESIZE_LARGE.html */ - (void) setRequestBodyLength: (int64_t)length; - (void) setTimeout: (NSInteger)timeout; - (void) setProxy; - (double) getTimeoutIntervalSpent; - (void) pauseReceive; - (void) unpauseReceive; - (void) pauseSend; - (void) unpauseSend; @end #endif gnustep-base-1.29.0/Source/GSEasyHandle.m000066400000000000000000000456021435650067400201060ustar00rootroot00000000000000#import "GSURLPrivate.h" #import "GSEasyHandle.h" #import "GSTimeoutSource.h" #import "Foundation/NSCharacterSet.h" #import "Foundation/NSURLSession.h" typedef NS_OPTIONS(NSUInteger, GSEasyHandlePauseState) { GSEasyHandlePauseStateReceive = 1 << 0, GSEasyHandlePauseStateSend = 1 << 1 }; @interface GSEasyHandle () - (void) resetTimer; - (NSInteger) didReceiveData: (char*)data size: (NSInteger)size nmemb:(NSInteger)nmemb; - (NSInteger) fillWriteBuffer: (char *)buffer size: (NSInteger)size nmemb: (NSInteger)nmemb; - (NSInteger) didReceiveHeaderData: (char*)headerData size: (NSInteger)size nmemb: (NSInteger)nmemb contentLength: (double)contentLength; - (int) seekInputStreamWithOffset: (int64_t)offset origin: (NSInteger)origin; @end static void handleEasyCode(int code) { if (CURLE_OK != code) { NSString *reason; NSException *e; reason = [NSString stringWithFormat: @"An error occurred, CURLcode is %d", code]; e = [NSException exceptionWithName: @"libcurl.easy" reason: reason userInfo: nil]; [e raise]; } } static size_t curl_write_function(char *data, size_t size, size_t nmemb, void *userdata) { if (!userdata) { return 0; } GSEasyHandle *handle = (GSEasyHandle*)userdata; [handle resetTimer]; //FIXME should be deffered after the function returns? return [handle didReceiveData:data size:size nmemb:nmemb]; } static size_t curl_read_function(char *data, size_t size, size_t nmemb, void *userdata) { if (!userdata) { return 0; } GSEasyHandle *handle = (GSEasyHandle*)userdata; [handle resetTimer]; //FIXME should be deffered after the function returns? return [handle fillWriteBuffer: data size: size nmemb: nmemb]; } size_t curl_header_function(char *data, size_t size, size_t nmemb, void *userdata) { if (!userdata) { return 0; } GSEasyHandle *handle = (GSEasyHandle*)userdata; double length; [handle resetTimer]; //FIXME should be deffered after the function returns? handleEasyCode(curl_easy_getinfo(handle.rawHandle, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &length)); return [handle didReceiveHeaderData: data size: size nmemb: nmemb contentLength: length]; } static int curl_seek_function(void *userdata, curl_off_t offset, int origin) { if (!userdata) { return CURL_SEEKFUNC_FAIL; } GSEasyHandle *handle = (GSEasyHandle*)userdata; return [handle seekInputStreamWithOffset: offset origin: origin]; } static int curl_debug_function(CURL *handle, curl_infotype type, char *data, size_t size, void *userptr) { if (!userptr) { return 0; } if (CURLINFO_SSL_DATA_OUT == type || CURLINFO_SSL_DATA_IN == type) { return 0; // Don't log encrypted data here } NSURLSessionTask *task = (NSURLSessionTask*)userptr; NSString *text = @""; NSURLRequest *o = [task originalRequest]; NSURLRequest *r = [task currentRequest]; id d = [(nil == r ? o : r) _debugLogDelegate]; if (d != nil) { if (CURLINFO_DATA_IN == type || CURLINFO_HEADER_IN == type) { if ([d getBytes: (const uint8_t *)data ofLength: size byHandle: o]) { return 0; // Handled } } if (CURLINFO_DATA_OUT == type || CURLINFO_HEADER_OUT == type) { if ([d putBytes: (const uint8_t *)data ofLength: size byHandle: o]) { return 0; // Handled } } } if (data) { text = [NSString stringWithUTF8String: data]; } NSLog(@"%p %lu %d %@", o, [task taskIdentifier], type, text); return 0; } static int curl_socket_function(void *userdata, curl_socket_t fd, curlsocktype type) { return 0; } @implementation GSEasyHandle { NSURLSessionConfiguration *_config; GSEasyHandlePauseState _pauseState; struct curl_slist *_headerList; } - (instancetype) initWithDelegate: (id)delegate { if (nil != (self = [super init])) { _rawHandle = curl_easy_init(); _delegate = delegate; char *eb = (char *)malloc(sizeof(char) * (CURL_ERROR_SIZE + 1)); _errorBuffer = memset(eb, 0, sizeof(char) * (CURL_ERROR_SIZE + 1)); [self setupCallbacks]; } return self; } - (void) dealloc { curl_easy_cleanup(_rawHandle); curl_slist_free_all(_headerList); free(_errorBuffer); DESTROY(_config); DESTROY(_timeoutTimer); DESTROY(_URL); [super dealloc]; } - (CURL*) rawHandle { return _rawHandle; } - (char*) errorBuffer { return _errorBuffer; } - (GSTimeoutSource*) timeoutTimer { return _timeoutTimer; } - (void) setTimeoutTimer: (GSTimeoutSource*)timer { ASSIGN(_timeoutTimer, timer); } - (NSURL*) URL { return _URL; } - (void) transferCompletedWithError: (NSError*)error { [_delegate transferCompletedWithError: error]; } - (void) resetTimer { // simply create a new timer with the same queue, timeout and handler // this must cancel the old handler and reset the timer DESTROY(_timeoutTimer); _timeoutTimer = [[GSTimeoutSource alloc] initWithQueue: [_timeoutTimer queue] milliseconds: [_timeoutTimer milliseconds] handler: [_timeoutTimer handler]]; } - (void) setupCallbacks { // write handleEasyCode(curl_easy_setopt(_rawHandle, CURLOPT_WRITEDATA, self)); handleEasyCode(curl_easy_setopt(_rawHandle, CURLOPT_WRITEFUNCTION, curl_write_function)); // read handleEasyCode(curl_easy_setopt(_rawHandle, CURLOPT_READDATA, self)); handleEasyCode(curl_easy_setopt(_rawHandle, CURLOPT_READFUNCTION, curl_read_function)); // header handleEasyCode(curl_easy_setopt(_rawHandle, CURLOPT_HEADERDATA, self)); handleEasyCode(curl_easy_setopt(_rawHandle, CURLOPT_HEADERFUNCTION, curl_header_function)); // socket options handleEasyCode(curl_easy_setopt(_rawHandle, CURLOPT_SOCKOPTDATA, self)); handleEasyCode(curl_easy_setopt(_rawHandle, CURLOPT_SOCKOPTFUNCTION, curl_socket_function)); // seeking in input stream handleEasyCode(curl_easy_setopt(_rawHandle, CURLOPT_SEEKDATA, self)); handleEasyCode(curl_easy_setopt(_rawHandle, CURLOPT_SEEKFUNCTION, curl_seek_function)); } - (int) urlErrorCodeWithEasyCode: (int)easyCode { int failureErrno = (int)[self connectFailureErrno]; if (easyCode == CURLE_OK) { return 0; } else if (failureErrno == ECONNREFUSED) { return NSURLErrorCannotConnectToHost; } else if (easyCode == CURLE_UNSUPPORTED_PROTOCOL) { return NSURLErrorUnsupportedURL; } else if (easyCode == CURLE_URL_MALFORMAT) { return NSURLErrorBadURL; } else if (easyCode == CURLE_COULDNT_RESOLVE_HOST) { return NSURLErrorCannotFindHost; } else if (easyCode == CURLE_RECV_ERROR && failureErrno == ECONNRESET) { return NSURLErrorNetworkConnectionLost; } else if (easyCode == CURLE_SEND_ERROR && failureErrno == ECONNRESET) { return NSURLErrorNetworkConnectionLost; } else if (easyCode == CURLE_GOT_NOTHING) { return NSURLErrorBadServerResponse; } else if (easyCode == CURLE_ABORTED_BY_CALLBACK) { return NSURLErrorUnknown; } else if (easyCode == CURLE_COULDNT_CONNECT && failureErrno == ETIMEDOUT) { return NSURLErrorTimedOut; } else if (easyCode == CURLE_OPERATION_TIMEDOUT) { return NSURLErrorTimedOut; } else { return NSURLErrorUnknown; } } - (void) setVerboseMode: (BOOL)flag { handleEasyCode(curl_easy_setopt(_rawHandle, CURLOPT_VERBOSE, flag ? 1 : 0)); } - (void) setDebugOutput: (BOOL)flag task: (NSURLSessionTask*)task { if (flag) { handleEasyCode(curl_easy_setopt(_rawHandle, CURLOPT_DEBUGDATA, self)); handleEasyCode(curl_easy_setopt(_rawHandle, CURLOPT_DEBUGFUNCTION, curl_debug_function)); } else { handleEasyCode(curl_easy_setopt(_rawHandle, CURLOPT_DEBUGDATA, NULL)); handleEasyCode(curl_easy_setopt(_rawHandle, CURLOPT_DEBUGFUNCTION, NULL)); } } - (void) setPassHeadersToDataStream: (BOOL)flag { handleEasyCode(curl_easy_setopt(_rawHandle, CURLOPT_HEADER, flag ? 1 : 0)); } - (void) setFollowLocation: (BOOL)flag { handleEasyCode(curl_easy_setopt(_rawHandle, CURLOPT_FOLLOWLOCATION, flag ? 1 : 0)); } - (void) setProgressMeterOff: (BOOL)flag { handleEasyCode(curl_easy_setopt(_rawHandle, CURLOPT_NOPROGRESS, flag ? 1 : 0)); } - (void) setSkipAllSignalHandling: (BOOL)flag { handleEasyCode(curl_easy_setopt(_rawHandle, CURLOPT_NOSIGNAL, flag ? 1 : 0)); } - (void) setErrorBuffer: (char*)buffer { char *b = buffer ? buffer : _errorBuffer; handleEasyCode(curl_easy_setopt(_rawHandle, CURLOPT_ERRORBUFFER, b)); } - (void) setFailOnHTTPErrorCode: (BOOL)flag { handleEasyCode(curl_easy_setopt(_rawHandle, CURLOPT_FAILONERROR, flag ? 1 : 0)); } - (void) setURL: (NSURL *)URL { ASSIGN(_URL, URL); if (nil != [URL absoluteString]) { handleEasyCode(curl_easy_setopt(_rawHandle, CURLOPT_URL, [[URL absoluteString] UTF8String])); } } - (void) setPipeWait: (BOOL)flag { handleEasyCode(curl_easy_setopt(_rawHandle, CURLOPT_PIPEWAIT, flag ? 1 : 0)); } - (void) setConnectToHost: (NSString*)host port: (NSInteger)port { if (nil != host) { NSString *originHost = [_URL host]; NSString *value = nil; if (0 == port) { value = [NSString stringWithFormat: @"%@::%@", originHost, host]; } else { value = [NSString stringWithFormat: @"%@:%lu:%@", originHost, port, host]; } struct curl_slist *connect_to = NULL; connect_to = curl_slist_append(NULL, [value UTF8String]); handleEasyCode( curl_easy_setopt(_rawHandle, CURLOPT_CONNECT_TO, connect_to)); } } - (void) setSessionConfig: (NSURLSessionConfiguration*)config { ASSIGN(_config, config); #if defined(CURLOPT_MAXAGE_CONN) /* This specifies the maximum age of a connection if it is to be considered * a candidate for re-use. By default curl currently uses 118 seconds, so * this is what we will get if the configuration does not contain a positive * number of seconds. */ if ([config HTTPMaximumConnectionLifetime] > 0) { handleEasyCode(curl_easy_setopt(_rawHandle, CURLOPT_MAXAGE_CONN, (long)[config HTTPMaximumConnectionLifetime])); } #endif } - (void) setAllowedProtocolsToHTTPAndHTTPS { handleEasyCode(curl_easy_setopt(_rawHandle, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS)); handleEasyCode(curl_easy_setopt(_rawHandle, CURLOPT_REDIR_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS)); } - (void) setPreferredReceiveBufferSize: (NSInteger)size { handleEasyCode(curl_easy_setopt(_rawHandle, CURLOPT_BUFFERSIZE, MIN(size, CURL_MAX_WRITE_SIZE))); } - (void) setCustomHeaders: (NSArray*)headers { NSEnumerator *e; NSString *h; e = [headers objectEnumerator]; while (nil != (h = [e nextObject])) { _headerList = curl_slist_append(_headerList, [h UTF8String]); } handleEasyCode(curl_easy_setopt(_rawHandle, CURLOPT_HTTPHEADER, _headerList)); } - (void) setAutomaticBodyDecompression: (BOOL)flag { if (flag) { handleEasyCode(curl_easy_setopt(_rawHandle, CURLOPT_ACCEPT_ENCODING, "")); handleEasyCode(curl_easy_setopt(_rawHandle, CURLOPT_HTTP_CONTENT_DECODING, 1)); } else { handleEasyCode(curl_easy_setopt(_rawHandle, CURLOPT_ACCEPT_ENCODING, NULL)); handleEasyCode(curl_easy_setopt(_rawHandle, CURLOPT_HTTP_CONTENT_DECODING, 0)); } } - (void) setRequestMethod: (NSString*)method { if (nil == method) { return; } handleEasyCode(curl_easy_setopt(_rawHandle, CURLOPT_CUSTOMREQUEST, [method UTF8String])); } - (void) setNoBody: (BOOL)flag { handleEasyCode(curl_easy_setopt(_rawHandle, CURLOPT_NOBODY, flag ? 1 : 0)); } - (void) setUpload: (BOOL)flag { handleEasyCode(curl_easy_setopt(_rawHandle, CURLOPT_UPLOAD, flag ? 1 : 0)); } - (void) setRequestBodyLength: (int64_t)length { handleEasyCode(curl_easy_setopt(_rawHandle, CURLOPT_INFILESIZE_LARGE, length)); } - (void) setTimeout: (NSInteger)timeout { handleEasyCode(curl_easy_setopt(_rawHandle, CURLOPT_TIMEOUT, (long)timeout)); } - (void) setProxy { //TODO setup proxy } - (void) updatePauseState: (GSEasyHandlePauseState)pauseState { NSUInteger send = pauseState & GSEasyHandlePauseStateSend; NSUInteger receive = pauseState & GSEasyHandlePauseStateReceive; int bitmask; bitmask = 0 | (send ? CURLPAUSE_SEND : CURLPAUSE_SEND_CONT) | (receive ? CURLPAUSE_RECV : CURLPAUSE_RECV_CONT); handleEasyCode(curl_easy_pause(_rawHandle, bitmask)); } - (double) getTimeoutIntervalSpent { double timeSpent; curl_easy_getinfo(_rawHandle, CURLINFO_TOTAL_TIME, &timeSpent); return timeSpent / 1000; } - (long) connectFailureErrno { long _errno; handleEasyCode(curl_easy_getinfo(_rawHandle, CURLINFO_OS_ERRNO, &_errno)); return _errno; } - (void) pauseSend { if (_pauseState & GSEasyHandlePauseStateSend) { return; } _pauseState = _pauseState | GSEasyHandlePauseStateSend; [self updatePauseState: _pauseState]; } - (void) unpauseSend { if (!(_pauseState & GSEasyHandlePauseStateSend)) { return; } _pauseState = _pauseState ^ GSEasyHandlePauseStateSend; [self updatePauseState: _pauseState]; } - (void) pauseReceive { if (_pauseState & GSEasyHandlePauseStateReceive) { return; } _pauseState = _pauseState | GSEasyHandlePauseStateReceive; [self updatePauseState: _pauseState]; } - (void) unpauseReceive { if (!(_pauseState & GSEasyHandlePauseStateReceive)) { return; } _pauseState = _pauseState ^ GSEasyHandlePauseStateReceive; [self updatePauseState: _pauseState]; } - (NSInteger) didReceiveData: (char*)data size: (NSInteger)size nmemb: (NSInteger)nmemb { NSData *buffer; GSEasyHandleAction action; NSUInteger bytes; if (![_delegate respondsToSelector: @selector(didReceiveData:)]) { return 0; } bytes = size * nmemb; buffer = AUTORELEASE([[NSData alloc] initWithBytes: data length: bytes]); action = [_delegate didReceiveData: buffer]; switch (action) { case GSEasyHandleActionProceed: return bytes; case GSEasyHandleActionAbort: return 0; case GSEasyHandleActionPause: _pauseState = _pauseState | GSEasyHandlePauseStateReceive; return CURL_WRITEFUNC_PAUSE; } } - (NSInteger) didReceiveHeaderData: (char*)headerData size: (NSInteger)size nmemb: (NSInteger)nmemb contentLength: (double)contentLength { NSData *buffer; GSEasyHandleAction action; NSInteger bytes = size * nmemb; buffer = [NSData dataWithBytes: headerData length: bytes]; [self setCookiesWithHeaderData: buffer]; if (![_delegate respondsToSelector: @selector(didReceiveHeaderData:contentLength:)]) { return 0; } action = [_delegate didReceiveHeaderData: buffer contentLength: (int64_t)contentLength]; switch (action) { case GSEasyHandleActionProceed: return bytes; case GSEasyHandleActionAbort: return 0; case GSEasyHandleActionPause: _pauseState = _pauseState | GSEasyHandlePauseStateReceive; return CURL_WRITEFUNC_PAUSE; } } - (NSInteger) fillWriteBuffer: (char*)buffer size: (NSInteger)size nmemb: (NSInteger)nmemb { __block NSInteger d; if (![_delegate respondsToSelector: @selector(fillWriteBufferLength:result:)]) { return CURL_READFUNC_ABORT; } [_delegate fillWriteBufferLength: size * nmemb result: ^(GSEasyHandleWriteBufferResult result, NSInteger length, NSData *data) { switch (result) { case GSEasyHandleWriteBufferResultPause: _pauseState = _pauseState | GSEasyHandlePauseStateSend; d = CURL_READFUNC_PAUSE; break; case GSEasyHandleWriteBufferResultAbort: d = CURL_READFUNC_ABORT; break; case GSEasyHandleWriteBufferResultBytes: memcpy(buffer, [data bytes], length); d = length; break; } }]; return d; } - (int) seekInputStreamWithOffset: (int64_t)offset origin: (NSInteger)origin { NSAssert(SEEK_SET == origin, @"Unexpected 'origin' in seek."); if (![_delegate respondsToSelector: @selector(seekInputStreamToPosition:)]) { return CURL_SEEKFUNC_CANTSEEK; } if ([_delegate seekInputStreamToPosition: offset]) { return CURL_SEEKFUNC_OK; } else { return CURL_SEEKFUNC_CANTSEEK; } } - (void) setCookiesWithHeaderData: (NSData*)data { NSString *headerLine; NSRange r; NSString *head; NSString *tail; NSCharacterSet *set; NSString *key; NSString *value; NSArray *cookies; NSDictionary *d; if (nil != _config && NSHTTPCookieAcceptPolicyNever != [_config HTTPCookieAcceptPolicy] && nil != [_config HTTPCookieStorage]) { headerLine = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding]; if (0 == [headerLine length]) { RELEASE(headerLine); return; } r = [headerLine rangeOfString: @":"]; if (NSNotFound != r.location) { head = [headerLine substringToIndex:r.location]; tail = [headerLine substringFromIndex:r.location + 1]; set = [NSCharacterSet whitespaceAndNewlineCharacterSet]; key = [head stringByTrimmingCharactersInSet:set]; value = [tail stringByTrimmingCharactersInSet:set]; if (nil != key && nil != value) { d = [NSDictionary dictionaryWithObject: value forKey: key]; cookies = [NSHTTPCookie cookiesWithResponseHeaderFields: d forURL: _URL]; if ([cookies count] > 0) { [[_config HTTPCookieStorage] setCookies: cookies forURL: _URL mainDocumentURL: nil]; } } } RELEASE(headerLine); } } @end gnustep-base-1.29.0/Source/GSFFCallInvocation.m000066400000000000000000000774311435650067400212170ustar00rootroot00000000000000/** Implementation of GSFFCallInvocation for GNUStep Copyright (C) 2000 Free Software Foundation, Inc. Written: Adam Fedor Date: Nov 2000 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #import "Foundation/NSException.h" #import "Foundation/NSCoder.h" #import "Foundation/NSDistantObject.h" #import "GSInvocation.h" #import "GSPThread.h" #import #import #import "callframe.h" #if !defined (__GNU_LIBOBJC__) # include #endif #ifndef GS_STATIC_INLINE #define GS_STATIC_INLINE static inline #endif typedef struct _NSInvocation_t { @defs(NSInvocation) } NSInvocation_t; /* Wim Oudshoorn (3 aug 2001) This information is used by GSInvocationCallback actually the last three arguments are only used when type == __VAstruct, but the code becomes more difficult when you try to optimize for it. And what are 15 * 4 * 3 = 180 bytes anyway. */ typedef struct _vacallReturnTypeInfo_t { enum __VAtype type; unsigned structSize; unsigned structAlign; unsigned structSplit; } vacallReturnTypeInfo; /* Create the map table for the forwarding functions */ #define GSI_MAP_KTYPES GSUNION_PTR #define GSI_MAP_VTYPES GSUNION_PTR /* Wim Oudshoorn (6 aug 2001) Hash function for the mapping return_type --> callback functions Rationale for the magic constants. ---------------------------------- We want to avoid hash colissions. So we encode the hash value as follows: +------+--------+----------+-------+ | Size |alignmnt|splittable| vaType| | 24bit| 3bit | 1bit | 4bit | +------+--------+----------+-------+ */ GS_STATIC_INLINE unsigned int ReturnTypeHash (vacallReturnTypeInfo *ret_type) { return ret_type->type ^ ret_type->structSplit << 4 ^ ret_type->structAlign << 5 ^ ret_type->structSize << 8; } /* Wim Oudshoorn (6 aug 2001) Comparison function, used by the hash table. I tried to order the comparison so that the earlier comparisons fail more often than later comparisons. */ GS_STATIC_INLINE BOOL ReturnTypeEqualsReturnType (vacallReturnTypeInfo *a, vacallReturnTypeInfo *b) { return (a->structSize == b->structSize) && (a->structAlign == b->structAlign) && (a->structSplit == b->structSplit) && (a->type == b->type); } #define GSI_MAP_HASH(M, X) ReturnTypeHash (X.ptr) #define GSI_MAP_EQUAL(M, X,Y) ReturnTypeEqualsReturnType (X.ptr, Y.ptr) #define GSI_MAP_RETAIN_KEY(M, X) #define GSI_MAP_RETAIN_VAL(M, X) #define GSI_MAP_RELEASE_KEY(M, X) #define GSI_MAP_RELEASE_VAL(M, X) #define GSI_MAP_NOCLEAN 1 #include "GNUstepBase/GSIMap.h" /* This determines the number of precomputed callback data entries. The list is indexed by __VAtype and only usefull for non-struct types. Therefore it is of no use increasing the size of this table. Except if the callback module of ffcall changes */ #define STATIC_CALLBACK_LIST_SIZE 15 /* Callback functions for forwarding methods */ static void *ff_callback [STATIC_CALLBACK_LIST_SIZE]; static GSIMapTable_t ff_callback_map; /* Lock that protects the ff_callback_map */ static gs_mutex_t ff_callback_map_lock = GS_MUTEX_INIT_STATIC; /* Static pre-computed return type info */ static vacallReturnTypeInfo returnTypeInfo [STATIC_CALLBACK_LIST_SIZE]; /* Function that implements the actual forwarding */ static void GSInvocationCallback(void *callback_data, va_alist args); /* Count the number of subtypes in a structure */ static const char *gs_subtypes(const char *type, int *result) { int count = 0; if (*type == _C_STRUCT_B) { type++; while (*type != _C_STRUCT_E && *type++ != '='); /* skip "=" */ while (*type != '\0' && *type != _C_STRUCT_E) { count++; if (*type == _C_STRUCT_B) { /* count a nested structure as a single type. */ type = gs_subtypes (type, 0); } else { type = objc_skip_typespec (type); } } if (*type == _C_STRUCT_E) { type++; /* step past end of struct */ } } if (result != 0) { *result = count; } return type; } /* return the index'th subtype */ static __attribute__((unused)) const char *gs_subtype(const char *type, int index) { int count = 0; if (*type != _C_STRUCT_B) { return ""; } type++; while (*type != _C_STRUCT_E && *type++ != '='); /* skip "=" */ while (*type != '\0' && *type != _C_STRUCT_E) { if (count++ == index) { return type; } if (*type == _C_STRUCT_B) { /* count and skip a nested structure as a single type. */ type = gs_subtypes (type, 0); } else { type = objc_skip_typespec (type); } } if (*type == _C_STRUCT_E) { type++; /* step past end of struct */ } return type; } /* * Recursively calculate the offset using the offset of the previous * sub-type */ static int gs_offset(const char *type, int index) { int offset; const char *subtype; if (index == 0) return 0; subtype = type; while (*subtype != _C_STRUCT_E && *subtype++ != '='); /* skip "=" */ offset = (gs_offset(type, index-1) + objc_sizeof_type(&subtype[index-1]) + objc_alignof_type(&subtype[index]) - 1) & -(long)objc_alignof_type(&subtype[index]); return offset; } /* Determines if the structure type can be returned entirely in registers. See the avcall or vacall man pages for more info. FIXME: I'm betting this won't work if a structure contains another structure */ static int gs_splittable (const char *type) { int i, numtypes; const char *subtype; int result; subtype = type; while (*subtype != _C_STRUCT_E && *subtype++ != '='); /* skip "=" */ numtypes = 0; while (*subtype != _C_STRUCT_E) { numtypes++; subtype = objc_skip_typespec (subtype); } subtype = type; while (*subtype != _C_STRUCT_E && *subtype++ != '='); /* skip "=" */ result = 1; for (i = 0; i < numtypes; i++) { result = result && (gs_offset(type, i)/sizeof(__avword) == (gs_offset(type, i)+objc_sizeof_type(&subtype[i])-1) / sizeof(__avword)); } //printf("Splittable for %s is %d\n", type, result); return result; } /* * If we are using the GNU ObjC runtime we could * simplify this function quite a lot because this * function is already present in the ObjC runtime. * However, it is not part of the public API, so * we work around it. */ GS_STATIC_INLINE GSMethod gs_method_for_receiver_and_selector (id receiver, SEL sel) { if (receiver) { return GSGetMethod((GSObjCIsInstance(receiver) ? object_getClass(receiver) : (Class)receiver), sel, GSObjCIsInstance(receiver), YES); } return METHOD_NULL; } /* * Selectors are not unique, and not all selectors have * type information. This method tries to find the * best equivalent selector with type information. * * the conversion sel -> name -> sel * is not what we want. However * I can not see a way to dispose of the * name, except if we can access the * internal data structures of the runtime. * * If we can access the private data structures * we can also check for incompatible * return types between all equivalent selectors. */ GS_STATIC_INLINE SEL gs_find_best_typed_sel (SEL sel) { if (!sel_get_type (sel)) { const char *name = sel_getName(sel); if (name) { SEL tmp_sel = sel_get_any_typed_uid (name); if (sel_get_type (tmp_sel)) return tmp_sel; } } return sel; } /* * Take the receiver into account for finding the best * selector. That is, we look if the receiver * implements the selector and the implementation * selector has type info. If both conditions * are satisfied, return this selector. * * In all other cases fallback * to gs_find_best_typed_sel (). */ GS_STATIC_INLINE SEL gs_find_by_receiver_best_typed_sel (id receiver, SEL sel) { if (sel_get_type (sel)) return sel; if (receiver) { GSMethod method; method = gs_method_for_receiver_and_selector (receiver, sel); /* CHECKME: Can we assume that: (a) method_name is a selector (compare libobjc header files) (b) this selector IS really typed? At the moment I assume (a) but not (b) not assuming (b) is the reason for calling gs_find_best_typed_sel () even if we have an implementation. */ if (method) sel = method->method_name; } return gs_find_best_typed_sel (sel); } /* Convert objc selector type to a vacallReturnTypeInfo. Only passes the first part. Is used for determining the return type for the vacall macros. */ static void gs_sel_type_to_callback_type (const char *sel_type, vacallReturnTypeInfo *vatype) { switch (*sel_type) { case _C_ID: case _C_CLASS: case _C_SEL: case _C_PTR: case _C_CHARPTR: vatype->type = __VAvoidp; break; case _C_CHR: vatype->type = __VAchar; break; case _C_UCHR: vatype->type = __VAuchar; break; case _C_SHT: vatype->type = __VAshort; break; case _C_USHT: vatype->type = __VAushort; break; case _C_INT: vatype->type = __VAint; break; case _C_UINT: vatype->type = __VAuint; break; case _C_LNG: vatype->type = __VAlong; break; case _C_ULNG: vatype->type = __VAulong; break; case _C_LNG_LNG: vatype->type = __VAlonglong; break; case _C_ULNG_LNG: vatype->type = __VAulonglong; break; case _C_FLT: vatype->type = __VAfloat; break; case _C_DBL: vatype->type = __VAdouble; break; #if defined(_C_BOOL) && (!defined(__GNUC__) || __GNUC__ > 2) case _C_BOOL: vatype->type = __VAuchar; break; #endif case _C_STRUCT_B: vatype->structSize = objc_sizeof_type (sel_type); if (vatype->structSize > sizeof (long) && vatype->structSize <= 2 * sizeof (long)) vatype->structSplit = gs_splittable (sel_type); vatype->structAlign = objc_alignof_type (sel_type); vatype->type = __VAstruct; break; case _C_VOID: vatype->type = __VAvoid; break; default: NSCAssert1 (0, @"GSFFCallInvocation: Return Type '%s' not implemented", sel_type); break; } } @implementation GSFFCallInvocation static IMP gs_objc_msg_forward (SEL sel) { const char *sel_type; vacallReturnTypeInfo returnInfo; void *forwarding_callback; /* * 1. determine return type. The compiler should have provided us with * a typed selector if possible, if not we have to assume an id return. */ sel_type = sel_get_type (sel); if (!sel_type) { sel_type = "@"; // Default to id return type } sel_type = objc_skip_type_qualifiers (sel_type); gs_sel_type_to_callback_type (sel_type, &returnInfo); /* * 2. Check if we have already a callback */ if ((returnInfo.type < STATIC_CALLBACK_LIST_SIZE) && (returnInfo.type != __VAstruct)) { // 2.a Do we have a statically precomputed callback forwarding_callback = ff_callback [returnInfo.type]; } else { // 2.b Or do we have it already in our hash table GSIMapNode node; // Lock GS_MUTEX_LOCK(ff_callback_map_lock); node = GSIMapNodeForKey (&ff_callback_map, (GSIMapKey) ((void *) &returnInfo)); if (node) { // 2.b.1 YES, we have it in our cache forwarding_callback = node->value.ptr; } else { // 2.b.2 NO, we do not have it. vacallReturnTypeInfo *ret_info; ret_info = malloc(sizeof (vacallReturnTypeInfo)); *ret_info = returnInfo; forwarding_callback = alloc_callback (&GSInvocationCallback, ret_info); GSIMapAddPairNoRetain (&ff_callback_map, (GSIMapKey) (void *) ret_info, (GSIMapVal) forwarding_callback); } // Unlock GS_MUTEX_UNLOCK(ff_callback_map_lock); } return forwarding_callback; } + (void) load { int index; for (index = 0; index < STATIC_CALLBACK_LIST_SIZE; ++index) { returnTypeInfo[index].type = index; ff_callback[index] = alloc_callback (&GSInvocationCallback, &returnTypeInfo [index]); } GSIMapInitWithZoneAndCapacity (&ff_callback_map, NSDefaultMallocZone(), 9); __objc_msg_forward = gs_objc_msg_forward; } - (id) initWithArgframe: (arglist_t)frame selector: (SEL)aSelector { /* We should never get here */ [self dealloc]; self = nil; [NSException raise: NSInternalInconsistencyException format: @"Runtime incorrectly configured to pass argframes"]; return nil; } /* * This is the designated initialiser. */ - (id) initWithMethodSignature: (NSMethodSignature*)aSignature { if (aSignature == nil) { DESTROY(self); return nil; } _sig = RETAIN(aSignature); _numArgs = [aSignature numberOfArguments]; _info = (void*)[aSignature methodInfo]; _cframe = callframe_from_signature(_sig, &_retval); return self; } /* * This is implemented as a function so it can be used by other * routines (like the DO forwarding) */ void GSFFCallInvokeWithTargetAndImp(NSInvocation *_inv, id anObject, IMP imp) { unsigned int i; av_alist alist; NSInvocation_t *inv = (NSInvocation_t*)_inv; NSArgumentInfo *info = (NSArgumentInfo*)inv->_info; void *retval = inv->_retval; /* Do an av call starting with the return type */ #undef CASE_TYPE #define CASE_TYPE(_T, _V, _F) \ case _T: \ _F(alist, imp, retval); \ break; switch (*info[0].type) { case _C_ID: av_start_ptr(alist, imp, id, retval); break; case _C_CLASS: av_start_ptr(alist, imp, Class, retval); break; case _C_SEL: av_start_ptr(alist, imp, SEL, retval); break; case _C_PTR: av_start_ptr(alist, imp, void *, retval); break; case _C_CHARPTR: av_start_ptr(alist, imp, char *, retval); break; CASE_TYPE(_C_CHR, char, av_start_char) CASE_TYPE(_C_UCHR, unsigned char, av_start_uchar) CASE_TYPE(_C_SHT, short, av_start_short) CASE_TYPE(_C_USHT, unsigned short, av_start_ushort) CASE_TYPE(_C_INT, int, av_start_int) CASE_TYPE(_C_UINT, unsigned int, av_start_uint) CASE_TYPE(_C_LNG, long, av_start_long) CASE_TYPE(_C_ULNG, unsigned long, av_start_ulong) CASE_TYPE(_C_LNG_LNG, long long, av_start_longlong) CASE_TYPE(_C_ULNG_LNG, unsigned long long, av_start_ulonglong) CASE_TYPE(_C_FLT, float, av_start_float) CASE_TYPE(_C_DBL, double, av_start_double) #if defined(_C_BOOL) && (!defined(__GNUC__) || __GNUC__ > 2) CASE_TYPE(_C_BOOL, _Bool, av_start_uchar) #endif case _C_STRUCT_B: { int split = 0; if (info[0].size > sizeof(long) && info[0].size <= 2*sizeof(long)) { split = gs_splittable(info[0].type); } _av_start_struct(alist, imp, info[0].size, split, retval); break; } case _C_VOID: av_start_void(alist, imp); break; default: NSCAssert1(0, @"GSFFCallInvocation: Return Type '%s' not implemented", info[0].type); break; } /* Set target and selector */ av_ptr(alist, id, anObject); av_ptr(alist, SEL, inv->_selector); /* Set the rest of the arguments */ for (i = 2; i < inv->_numArgs; i++) { const char *type = info[i+1].type; unsigned size = info[i+1].size; void *datum; datum = callframe_arg_addr((callframe_t *)inv->_cframe, i); #undef CASE_TYPE #define CASE_TYPE(_T, _V, _F) \ case _T: \ { \ _V c; \ memcpy(&c, datum, size); \ _F(alist, c); \ break; \ } switch (*type) { case _C_ID: { id obj; memcpy(&obj, datum, size); av_ptr(alist, id, obj); break; } case _C_CLASS: { Class obj; memcpy(&obj, datum, size); av_ptr(alist, Class, obj); break; } case _C_SEL: { SEL sel; memcpy(&sel, datum, size); av_ptr(alist, SEL, sel); break; } case _C_PTR: { void *ptr; memcpy(&ptr, datum, size); av_ptr(alist, void *, ptr); break; } case _C_CHARPTR: { char *ptr; memcpy(&ptr, datum, size); av_ptr(alist, char *, ptr); break; } CASE_TYPE(_C_CHR, char, av_char) CASE_TYPE(_C_UCHR, unsigned char, av_uchar) CASE_TYPE(_C_SHT, short, av_short) CASE_TYPE(_C_USHT, unsigned short, av_ushort) CASE_TYPE(_C_INT, int, av_int) CASE_TYPE(_C_UINT, unsigned int, av_uint) CASE_TYPE(_C_LNG, long, av_long) CASE_TYPE(_C_ULNG, unsigned long, av_ulong) CASE_TYPE(_C_LNG_LNG, long long, av_longlong) CASE_TYPE(_C_ULNG_LNG, unsigned long long, av_ulonglong) CASE_TYPE(_C_FLT, float, av_float) CASE_TYPE(_C_DBL, double, av_double) #if defined(_C_BOOL) && (!defined(__GNUC__) || __GNUC__ > 2) CASE_TYPE(_C_BOOL, _Bool, av_uchar) #endif case _C_STRUCT_B: _av_struct(alist, size, info[i+1].align, datum); break; default: NSCAssert1(0, @"GSFFCallInvocation: Type '%s' not implemented", type); break; } } /* Do it */ av_call(alist); } - (void) invokeWithTarget: (id)anObject { id old_target; IMP imp; CLEAR_RETURN_VALUE_IF_OBJECT; _validReturn = NO; /* * A message to a nil object returns nil. */ if (anObject == nil) { memset(_retval, '\0', _inf[0].size); /* Clear return value */ if (*_inf[0].type != _C_VOID) { _validReturn = YES; } return; } NSAssert(_selector != 0, @"you must set the selector before invoking"); /* * Temporarily set new target and copy it (and the selector) into the * _cframe. */ old_target = RETAIN(_target); [self setTarget: anObject]; callframe_set_arg((callframe_t *)_cframe, 0, &_target, _inf[1].size); callframe_set_arg((callframe_t *)_cframe, 1, &_selector, _inf[2].size); if (_sendToSuper == YES) { Super s; s.self = _target; if (GSObjCIsInstance(_target)) s.class = class_getSuperclass(object_getClass(_target)); else s.class = class_getSuperclass((Class)_target); imp = objc_msg_lookup_super(&s, _selector); } else { GSMethod method; method = GSGetMethod((GSObjCIsInstance(_target) ? (id)object_getClass(_target) : (id)_target), _selector, GSObjCIsInstance(_target), YES); imp = method_get_imp(method); /* * If fast lookup failed, we may be forwarding or something ... */ if (imp == 0) { imp = objc_msg_lookup(_target, _selector); } } [self setTarget: old_target]; RELEASE(old_target); GSFFCallInvokeWithTargetAndImp(self, anObject, imp); RETAIN_RETURN_VALUE; _validReturn = YES; } - (void*) returnFrame: (arglist_t)argFrame { return _retval; } @end /* * Return YES if the selector contains protocol qualifiers. */ static BOOL gs_protocol_selector(const char *types) { if (types == 0) { return NO; } while (*types != '\0') { if (*types == '+' || *types == '-') { types++; } while (isdigit(*types)) { types++; } while (*types == _C_CONST || *types == _C_GCINVISIBLE) { types++; } if (*types == _C_IN || *types == _C_INOUT || *types == _C_OUT || *types == _C_BYCOPY || *types == _C_BYREF || *types == _C_ONEWAY) { return YES; } if (*types == '\0') { return NO; } types = objc_skip_typespec(types); } return NO; } /* * Wim Oudshoorn (6 aug 2001) * * The function that performs the actual forwarding * `callback_data' contains the information needed * in order pop off the receiver and selector from * the va_list `args' * * TODO: * Add a check that the return type the selector * expects matches the the `callback_data' * information. */ static void GSInvocationCallback (void *callback_data, va_alist args) { id obj; SEL selector; int i; int num_args; void *retval; vacallReturnTypeInfo *typeinfo; NSArgumentInfo *info; GSFFCallInvocation *invocation; NSMethodSignature *sig; GSMethod fwdInvMethod; typeinfo = (vacallReturnTypeInfo *) callback_data; if (typeinfo->type != __VAstruct) { __va_start (args, typeinfo->type); } else { _va_start_struct (args, typeinfo->structSize, typeinfo->structAlign, typeinfo->structSplit); } obj = va_arg_ptr(args, id); selector = va_arg_ptr(args, SEL); fwdInvMethod = gs_method_for_receiver_and_selector (obj, @selector (forwardInvocation:)); if (!fwdInvMethod) { [NSException raise: NSInvalidArgumentException format: @"GSFFCallInvocation: Class '%s(%s)'" @" does not respond" @" to forwardInvocation: for '%s'", GSClassNameFromObject(obj), GSObjCIsInstance(obj) ? "instance" : "class", selector ? sel_getName(selector) : "(null)"]; } sig = nil; if (gs_protocol_selector(sel_get_type(selector)) == YES) { /* * We already have protocol information locally, so we don't need * to get it from the remote system. */ sig = [NSMethodSignature signatureWithObjCTypes: sel_get_type(selector)]; } if (sig == nil) { sig = [obj methodSignatureForSelector: selector]; } /* * If we got a method signature from the receiving object, * ensure that the selector we are using matches the types. */ if (sig != nil) { const char *receiverTypes = [sig methodType]; const char *runtimeTypes = sel_get_type (selector); if (runtimeTypes == 0 || NO == GSSelectorTypesMatch(receiverTypes, runtimeTypes)) { const char *runtimeName = sel_getName(selector); runtimeTypes = GSTypesFromSelector(selector); if (selector == 0) { selector = GSSelectorFromNameAndTypes(runtimeName, receiverTypes); } if (runtimeTypes != 0) { /* * FIXME ... if we have a typed selector, it probably came * from the compiler, and the types of the proxied method * MUST match those that the compiler supplied on the stack * and the type it expects to retrieve from the stack. * We should therefore discriminate between signatures where * type qalifiers and sizes differ, and those where the * actual types differ. */ NSDebugFLog(@"Changed type signature '%s' to '%s' for '%s'", runtimeTypes, receiverTypes, runtimeName); } } } if (sig == nil) { selector = gs_find_best_typed_sel (selector); if (sel_get_type (selector) != 0) { sig = [NSMethodSignature signatureWithObjCTypes: sel_get_type(selector)]; } } if (sig == nil) { [NSException raise: NSInvalidArgumentException format: @"Can not determine type information for %s[%s %s]", GSObjCIsInstance(obj) ? "-" : "+", GSClassNameFromObject(obj), selector ? sel_getName(selector) : "(null)"]; } invocation = [[GSFFCallInvocation alloc] initWithMethodSignature: sig]; AUTORELEASE(invocation); [invocation setTarget: obj]; [invocation setSelector: selector]; /* Set the rest of the arguments */ num_args = [sig numberOfArguments]; info = [sig methodInfo]; for (i = 2; i < num_args; i++) { const char *type = info[i+1].type; unsigned size = info[i+1].size; #undef CASE_TYPE #define CASE_TYPE(_T, _V, _F) \ case _T: \ { \ _V c = _F(args); \ [invocation setArgument: &c atIndex: i]; \ break; \ } switch (*type) { case _C_ID: { id obj = va_arg_ptr (args, id); [invocation setArgument: &obj atIndex: i]; break; } case _C_CLASS: { Class obj = va_arg_ptr (args, Class); [invocation setArgument: &obj atIndex: i]; break; } case _C_SEL: { SEL sel = va_arg_ptr (args, SEL); [invocation setArgument: &sel atIndex: i]; break; } case _C_PTR: { void *ptr = va_arg_ptr (args, void *); [invocation setArgument: &ptr atIndex: i]; break; } case _C_CHARPTR: { char *ptr = va_arg_ptr (args, char *); [invocation setArgument: &ptr atIndex: i]; break; } CASE_TYPE(_C_CHR, char, va_arg_char) CASE_TYPE(_C_UCHR, unsigned char, va_arg_uchar) CASE_TYPE(_C_SHT, short, va_arg_short) CASE_TYPE(_C_USHT, unsigned short, va_arg_ushort) CASE_TYPE(_C_INT, int, va_arg_int) CASE_TYPE(_C_UINT, unsigned int, va_arg_uint) CASE_TYPE(_C_LNG, long, va_arg_long) CASE_TYPE(_C_ULNG, unsigned long, va_arg_ulong) CASE_TYPE(_C_LNG_LNG, long long, va_arg_longlong) CASE_TYPE(_C_ULNG_LNG, unsigned long long, va_arg_ulonglong) CASE_TYPE(_C_FLT, float, va_arg_float) CASE_TYPE(_C_DBL, double, va_arg_double) #if defined(_C_BOOL) && (!defined(__GNUC__) || __GNUC__ > 2) CASE_TYPE(_C_BOOL, _Bool, va_arg_uchar) #endif case _C_STRUCT_B: { /* Here we actually get a ptr to the struct */ void *ptr = _va_arg_struct(args, size, info[i+1].align); [invocation setArgument: ptr atIndex: i]; break; } default: NSCAssert1(0, @"GSFFCallInvocation: Type '%s' not implemented", type); break; } } /* * Now do it. * The next line is equivalent to * * [obj forwardInvocation: invocation]; * * but we have already the GSMethod for forwardInvocation * so the line below is somewhat faster. */ fwdInvMethod->method_imp (obj, fwdInvMethod->method_name, invocation); /* Return the proper type */ retval = [invocation returnFrame: NULL]; #undef CASE_TYPE #define CASE_TYPE(_T, _V, _F) \ case _T: \ if (typeinfo->type == __VAvoidp) \ va_return_ptr(args, void *, *(void **)retval); \ else \ _F(args, *(_V *)retval); \ break; switch (*info[0].type) { case _C_ID: case _C_CLASS: case _C_SEL: case _C_PTR: case _C_CHARPTR: va_return_ptr(args, void *, *(void **)retval); break; CASE_TYPE(_C_CHR, char, va_return_char) CASE_TYPE(_C_UCHR, unsigned char, va_return_uchar) CASE_TYPE(_C_SHT, short, va_return_short) CASE_TYPE(_C_USHT, unsigned short, va_return_ushort) CASE_TYPE(_C_INT, int, va_return_int) CASE_TYPE(_C_UINT, unsigned int, va_return_uint) CASE_TYPE(_C_LNG, long, va_return_long) CASE_TYPE(_C_ULNG, unsigned long, va_return_ulong) CASE_TYPE(_C_LNG_LNG, long long, va_return_longlong) CASE_TYPE(_C_ULNG_LNG, unsigned long long, va_return_ulonglong) CASE_TYPE(_C_FLT, float, va_return_float) CASE_TYPE(_C_DBL, double, va_return_double) #if defined(_C_BOOL) && (!defined(__GNUC__) || __GNUC__ > 2) CASE_TYPE(_C_BOOL, _Bool, va_return_uchar) #endif case _C_STRUCT_B: _va_return_struct(args, info[0].size, info[0].align, retval); break; case _C_VOID: /* FIXME ... evil hack ... where the compiler did not know * selector types, if may have had to assume a method returning * an id, but the actual method may have returned void ... * we check for that case here, and use the fact that in the case * of a void return value, passing retval back as a voipd will * look like the method actually returned nil. */ if (typeinfo->type == __VAvoidp) { va_return_ptr(args, void *, *(void **)retval); } else { va_return_void(args); } break; default: NSCAssert1(0, @"GSFFCallInvocation: Return Type '%s' not implemented", info[0].type); break; } } @implementation NSInvocation (DistantCoding) /* An internal method used to help NSConnections code invocations to send over the wire */ - (BOOL) encodeWithDistantCoder: (NSCoder*)coder passPointers: (BOOL)passp { unsigned int i; BOOL out_parameters = NO; const char *type = [_sig methodType]; [coder encodeValueOfObjCType: @encode(char*) at: &type]; for (i = 0; i < _numArgs; i++) { int flags = _inf[i+1].qual; const char *type = _inf[i+1].type; void *datum; if (i == 0) { datum = &_target; } else if (i == 1) { datum = &_selector; } else { datum = callframe_arg_addr((callframe_t *)_cframe, i); } /* * Decide how, (or whether or not), to encode the argument * depending on its FLAGS and TYPE. Only the first two cases * involve parameters that may potentially be passed by * reference, and thus only the first two may change the value * of OUT_PARAMETERS. */ switch (*type) { case _C_ID: if (flags & _F_BYCOPY) { [coder encodeBycopyObject: *(id*)datum]; } #ifdef _F_BYREF else if (flags & _F_BYREF) { [coder encodeByrefObject: *(id*)datum]; } #endif else { [coder encodeObject: *(id*)datum]; } break; case _C_CHARPTR: /* * Handle a (char*) argument. * If the char* is qualified as an OUT parameter, or if it * not explicitly qualified as an IN parameter, then we will * have to get this char* again after the method is run, * because the method may have changed it. Set * OUT_PARAMETERS accordingly. */ if ((flags & _F_OUT) || !(flags & _F_IN)) { out_parameters = YES; } /* * If the char* is qualified as an IN parameter, or not * explicity qualified as an OUT parameter, then encode * it. */ if ((flags & _F_IN) || !(flags & _F_OUT)) { [coder encodeValueOfObjCType: type at: datum]; } break; case _C_PTR: /* * If the pointer's value is qualified as an OUT parameter, * or if it not explicitly qualified as an IN parameter, * then we will have to get the value pointed to again after * the method is run, because the method may have changed * it. Set OUT_PARAMETERS accordingly. */ if ((flags & _F_OUT) || !(flags & _F_IN)) { out_parameters = YES; } if (passp) { if ((flags & _F_IN) || !(flags & _F_OUT)) { [coder encodeValueOfObjCType: type at: datum]; } } else { /* * Handle an argument that is a pointer to a non-char. But * (void*) and (anything**) is not allowed. * The argument is a pointer to something; increment TYPE * so we can see what it is a pointer to. */ type++; /* * If the pointer's value is qualified as an IN parameter, * or not explicity qualified as an OUT parameter, then * encode it. */ if ((flags & _F_IN) || !(flags & _F_OUT)) { [coder encodeValueOfObjCType: type at: *(void**)datum]; } } break; case _C_STRUCT_B: case _C_UNION_B: case _C_ARY_B: /* * Handle struct and array arguments. * Whether DATUM points to the data, or points to a pointer * that points to the data, depends on the value of * CALLFRAME_STRUCT_BYREF. Do the right thing * so that ENCODER gets a pointer to directly to the data. */ [coder encodeValueOfObjCType: type at: datum]; break; default: /* Handle arguments of all other types. */ [coder encodeValueOfObjCType: type at: datum]; } } /* * Return a BOOL indicating whether or not there are parameters that * were passed by reference; we will need to get those values again * after the method has finished executing because the execution of * the method may have changed them. */ return out_parameters; } @end gnustep-base-1.29.0/Source/GSFFIInvocation.m000066400000000000000000000506551435650067400205330ustar00rootroot00000000000000/** Implementation of GSFFIInvocation for GNUStep Copyright (C) 2000 Free Software Foundation, Inc. Written: Adam Fedor Date: Apr 2002 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #if !defined (__GNU_LIBOBJC__) # include #endif #define EXPOSE_NSInvocation_IVARS 1 #import "Foundation/NSException.h" #import "Foundation/NSCoder.h" #import "Foundation/NSDistantObject.h" #import "Foundation/NSData.h" #import "GSInvocation.h" #import "GSPThread.h" #import "GNUstepBase/GSObjCRuntime.h" #import "cifframe.h" #import "GSPrivate.h" #ifdef __GNUSTEP_RUNTIME__ #include #endif #ifdef __GNU_LIBOBJC__ #include #endif #ifndef GS_STATIC_INLINE #define GS_STATIC_INLINE static inline #endif /* Function that implements the actual forwarding */ typedef void (*ffi_closure_fun) (ffi_cif*,void*,void**,void*); typedef void (*f_fun) (); static void GSFFIInvocationCallback(ffi_cif*, void*, void **, void*); /* This routine should return a typed selector corresponding to the name of the specified selector. If there is only one type, then we can safely return that typed selector. If not, then we can not be certain which one is expected, and to prevent a crash if we return the wrong type, we return NULL. Older runtimes do not have facilities in the API to check for conflicting types, hence would return a random selector in that case. */ GS_STATIC_INLINE SEL gs_find_best_typed_sel (SEL sel) #ifdef __GNUSTEP_RUNTIME__ { const char *selName = sel_getName(sel); const char *types; /* If there is not exactly one typed selector with this name * registered with the runtime, then give up - we can't safely use * this function. */ if (1 != sel_copyTypes_np (selName, NULL, 0)) return (SEL)0; sel_copyTypes_np (selName, &types, 1); return GSSelectorFromNameAndTypes(selName, types); } #elif defined (__GNU_LIBOBJC__) { /* The sel_getTypedSelector() function returns a typed selector if there * is only one, nul if there are zero or more tha one. */ return sel_getTypedSelector(sel_getName(sel)); } #elif defined(NeXTRUNTIME) { /* The NeXT runtime does not support typed selectors, so we simply * return 0 here. */ return (SEL)0; } #else { /* We can't iterate over the selectors with the same name, but we * can ask the runtime for a typed selector with a certain name. * Usually this works, but it may produce unexpected results * (including a crash) if more than one selector are registered with * the same name but different types. */ if (!GSTypesFromSelector(sel)) { const char *name = sel_getName(sel); if (name) { SEL tmp_sel = sel_get_any_typed_uid(name); if (GSTypesFromSelector(tmp_sel)) return tmp_sel; } } return sel; } #endif @implementation GSFFIInvocation static IMP gs_objc_msg_forward2 (id receiver, SEL sel) { NSMethodSignature *sig = nil; GSCodeBuffer *memory; const char *types; /* * If we're called with a typed selector, then use this when deconstructing * the stack frame. This deviates from OS X behaviour (where there are no * typed selectors), but it always more reliable because the compiler will * set the selector types to represent the layout of the call frame. This * means that the invocation will always deconstruct the call frame * correctly. */ if (NULL != (types = GSTypesFromSelector(sel))) { sig = [NSMethodSignature signatureWithObjCTypes: types]; } /* Take care here ... the receiver may be nil (old runtimes) or may be * a proxy which implements a method by forwarding it (so calling the * method might cause recursion). However, any sane proxy ought to at * least implement -methodSignatureForSelector: in such a way that it * won't cause infinite recursion, so we check for that method being * implemented and call it. * NB. object_getClass() and class_respondsToSelector() should both * return NULL when given NULL arguments, so they are safe to use. */ if (nil == sig) { Class c = object_getClass(receiver); if (class_respondsToSelector(c, @selector(methodSignatureForSelector:))) { sig = [receiver methodSignatureForSelector: sel]; } if (nil == sig && (NULL != (types = GSTypesFromSelector(gs_find_best_typed_sel(sel))))) { sig = [NSMethodSignature signatureWithObjCTypes: types]; } if (nil == sig) { if (nil == receiver) { /* If we have a nil receiver, so the runtime is probably trying * to check for forwarding ... return NULL to let it fall back * on the standard forwarding mechanism. */ return NULL; } [NSException raise: NSInvalidArgumentException format: @"%c[%s %s]: unrecognized selector sent to instance %p", (class_isMetaClass(c) ? '+' : '-'), class_getName(c), sel_getName(sel), receiver]; } } memory = cifframe_closure(sig, GSFFIInvocationCallback); return (IMP)[memory executable]; } static __attribute__ ((__unused__)) IMP gs_objc_msg_forward (SEL sel) { return gs_objc_msg_forward2 (nil, sel); } #ifdef __GNUSTEP_RUNTIME__ gs_thread_key_t thread_slot_key; static struct objc_slot * gs_objc_msg_forward3(id receiver, SEL op) { /* The slot has its version set to 0, so it can not be cached. This makes it * safe to free it when the thread exits. */ struct objc_slot *slot = GS_THREAD_KEY_GET(thread_slot_key); if (NULL == slot) { slot = calloc(sizeof(struct objc_slot), 1); GS_THREAD_KEY_SET(thread_slot_key, slot); } slot->method = gs_objc_msg_forward2(receiver, op); return slot; } /** Hidden by legacy API define. Declare it locally */ GS_IMPORT BOOL class_isMetaClass(Class cls); GS_IMPORT BOOL class_respondsToSelector(Class cls, SEL sel); /** * Runtime hook used to provide message redirections with libobjc2. * If lookup fails but this function returns non-nil then the lookup * will be retried with the returned value. * * Note: Every message sent by this function MUST be understood by the * receiver. If this is not the case then there is a potential for infinite * recursion. */ static id gs_objc_proxy_lookup(id receiver, SEL op) { id cls = object_getClass(receiver); BOOL resolved = NO; /* Note that __GNU_LIBOBJC__ implements +resolveClassMethod: and +resolveInstanceMethod: directly in the runtime instead. */ /* Let the class try to add a method for this thing. */ if (class_isMetaClass(cls)) { if (class_respondsToSelector(cls, @selector(resolveClassMethod:))) { resolved = [receiver resolveClassMethod: op]; } } else { if (class_respondsToSelector(object_getClass(cls), @selector(resolveInstanceMethod:))) { resolved = [cls resolveInstanceMethod: op]; } } if (resolved) { return receiver; } if (class_respondsToSelector(cls, @selector(forwardingTargetForSelector:))) { return [receiver forwardingTargetForSelector: op]; } return nil; } #endif #ifdef __GNUSTEP_RUNTIME__ static void GS_WINAPI exitedThread(void *slot) { free(slot); } #endif + (void) load { #ifdef __GNUSTEP_RUNTIME__ GS_THREAD_KEY_INIT(thread_slot_key, exitedThread); __objc_msg_forward3 = gs_objc_msg_forward3; __objc_msg_forward2 = gs_objc_msg_forward2; objc_proxy_lookup = gs_objc_proxy_lookup; #else #if HAVE_FORWARD2 __objc_msg_forward2 = gs_objc_msg_forward2; #else __objc_msg_forward = gs_objc_msg_forward; #endif #endif } /* * This is the designated initialiser. */ - (id) initWithMethodSignature: (NSMethodSignature*)aSignature { int i; if (aSignature == nil) { DESTROY(self); return nil; } _sig = RETAIN(aSignature); _numArgs = [aSignature numberOfArguments]; _info = [aSignature methodInfo]; _frame = cifframe_from_signature(_sig); [_frame retain]; _cframe = [_frame mutableBytes]; /* Make sure we have somewhere to store the return value if needed. */ _retval = _retptr = 0; i = objc_sizeof_type (objc_skip_type_qualifiers ([_sig methodReturnType])); if (i > 0) { if (i <= sizeof(_retbuf)) { _retval = _retbuf; } else { _retptr = NSAllocateCollectable(i, NSScannedOption); _retval = _retptr; } } return self; } /* Initializer used when we get a callback. uses the data provided by the callback. The cifframe was allocated by the forwarding function, but we own it now so we can free it */ - (id) initWithCallback: (ffi_cif *)cif values: (void **)vals frame: (void *)frame signature: (NSMethodSignature*)aSignature { cifframe_t *f; int i; _sig = RETAIN(aSignature); _numArgs = [aSignature numberOfArguments]; _info = [aSignature methodInfo]; _frame = (NSMutableData*)frame; [_frame retain]; _cframe = [_frame mutableBytes]; f = (cifframe_t *)_cframe; f->cif = *cif; /* Copy the arguments into our frame so that they are preserved * in the NSInvocation if the stack is changed before the * invocation is used. */ for (i = 0; i < f->nargs; i++) { memcpy(f->values[i], vals[i], f->arg_types[i]->size); } /* Make sure we have somewhere to store the return value if needed. */ _retval = _retptr = 0; i = objc_sizeof_type (objc_skip_type_qualifiers ([_sig methodReturnType])); if (i > 0) { if (i <= sizeof(_retbuf)) { _retval = _retbuf; } else { _retptr = NSAllocateCollectable(i, NSScannedOption); _retval = _retptr; } } return self; } /* * This is implemented as a function so it can be used by other * routines (like the DO forwarding) */ void GSFFIInvokeWithTargetAndImp(NSInvocation *inv, id anObject, IMP imp) { /* Do it */ ffi_call(inv->_cframe, (f_fun)imp, (inv->_retval), ((cifframe_t *)inv->_cframe)->values); /* Don't decode the return value here (?) */ } - (void) invokeWithTarget: (id)anObject { id old_target; const char *type; IMP imp; CLEAR_RETURN_VALUE_IF_OBJECT; _validReturn = NO; type = objc_skip_type_qualifiers([_sig methodReturnType]); /* * A message to a nil object returns nil. */ if (anObject == nil) { if (_retval) { memset(_retval, '\0', objc_sizeof_type (type)); } _validReturn = YES; return; } /* Make sure we have a typed selector for forwarding. */ NSAssert(_selector != 0, @"you must set the selector before invoking"); if (0 == GSTypesFromSelector(_selector)) { _selector = GSSelectorFromNameAndTypes(sel_getName(_selector), [_sig methodType]); } /* * Temporarily set new target and copy it (and the selector) into the * _cframe. */ old_target = RETAIN(_target); [self setTarget: anObject]; cifframe_set_arg((cifframe_t *)_cframe, 0, &_target, sizeof(id)); cifframe_set_arg((cifframe_t *)_cframe, 1, &_selector, sizeof(SEL)); if (_sendToSuper == YES) { Class cls; if (GSObjCIsInstance(_target)) cls = class_getSuperclass(object_getClass(_target)); else cls = class_getSuperclass((Class)_target); { struct objc_super s = {_target, cls}; imp = objc_msg_lookup_super(&s, _selector); } } else { GSMethod method; method = GSGetMethod((GSObjCIsInstance(_target) ? (Class)object_getClass(_target) : (Class)_target), _selector, GSObjCIsInstance(_target), YES); imp = method_getImplementation(method); /* * If fast lookup failed, we may be forwarding or something ... */ if (imp == 0) { imp = objc_msg_lookup(_target, _selector); } } [self setTarget: old_target]; RELEASE(old_target); GSFFIInvokeWithTargetAndImp(self, anObject, imp); /* Decode the return value */ if (*type != _C_VOID) { cifframe_decode_arg(type, _retval); } RETAIN_RETURN_VALUE; _validReturn = YES; } @end /* * Return YES if the selector contains protocol qualifiers. */ static BOOL gs_protocol_selector(const char *types) { if (types == 0) { return NO; } while (*types != '\0') { if (*types == '+' || *types == '-') { types++; } while (isdigit(*types)) { types++; } while (*types == _C_CONST || *types == _C_GCINVISIBLE) { types++; } if (*types == _C_IN || *types == _C_INOUT || *types == _C_OUT || *types == _C_BYCOPY || *types == _C_BYREF || *types == _C_ONEWAY) { return YES; } if (*types == '\0') { return NO; } types = objc_skip_typespec(types); } return NO; } static void GSFFIInvocationCallback(ffi_cif *cif, void *retp, void **args, void *user) { id obj; SEL selector; GSFFIInvocation *invocation; NSMethodSignature *sig; obj = *(id *)args[0]; selector = *(SEL *)args[1]; if (!class_respondsToSelector(object_getClass(obj), @selector(forwardInvocation:))) { [NSException raise: NSInvalidArgumentException format: @"GSFFIInvocation: Class '%s'(%s) does not respond" @" to forwardInvocation: for '%s'", GSClassNameFromObject(obj), GSObjCIsInstance(obj) ? "instance" : "class", selector ? sel_getName(selector) : "(null)"]; } sig = nil; if (gs_protocol_selector(GSTypesFromSelector(selector)) == YES) { sig = [NSMethodSignature signatureWithObjCTypes: GSTypesFromSelector(selector)]; } if (sig == nil) { sig = [obj methodSignatureForSelector: selector]; } /* * If we got a method signature from the receiving object, * ensure that the selector we are using matches the types. */ if (sig != nil) { const char *receiverTypes = [sig methodType]; const char *runtimeTypes = GSTypesFromSelector(selector); if (NO == GSSelectorTypesMatch(receiverTypes, runtimeTypes)) { const char *runtimeName = sel_getName(selector); selector = GSSelectorFromNameAndTypes(runtimeName, receiverTypes); if (runtimeTypes != 0) { /* * FIXME ... if we have a typed selector, it probably came * from the compiler, and the types of the proxied method * MUST match those that the compiler supplied on the stack * and the type it expects to retrieve from the stack. * We should therefore discriminate between signatures where * type qalifiers and sizes differ, and those where the * actual types differ. */ NSDebugFLog(@"Changed type signature '%s' to '%s' for '%s'", runtimeTypes, receiverTypes, runtimeName); } } } if (sig == nil) { /* NB Don't overwrite selector prematurely, so we can show the untyped * selector in the error message below if there is no best selector. */ SEL typed_sel = gs_find_best_typed_sel (selector); if (typed_sel != 0) { selector = typed_sel; if (GSTypesFromSelector(selector) != 0) { sig = [NSMethodSignature signatureWithObjCTypes: GSTypesFromSelector(selector)]; } } } if (sig == nil) { [NSException raise: NSInvalidArgumentException format: @"Can not determine type information for %s[%s %s]", GSObjCIsInstance(obj) ? "-" : "+", GSClassNameFromObject(obj), selector ? sel_getName(selector) : "(null)"]; } invocation = [[GSFFIInvocation alloc] initWithCallback: cif values: args frame: user signature: sig]; IF_NO_ARC([invocation autorelease];) [invocation setTarget: obj]; [invocation setSelector: selector]; [obj forwardInvocation: invocation]; /* If we are returning a value, we must copy it from the invocation * to the memory indicated by 'retp'. */ if (retp != 0 && invocation->_validReturn == YES) { [invocation getReturnValue: retp]; } /* We need to (re)encode the return type for it's trip back. */ if (retp) cifframe_encode_arg([sig methodReturnType], retp); } @implementation NSInvocation (DistantCoding) /* An internal method used to help NSConnections code invocations to send over the wire */ - (BOOL) encodeWithDistantCoder: (NSCoder*)coder passPointers: (BOOL)passp { int i; BOOL out_parameters = NO; const char *type = [_sig methodType]; [coder encodeValueOfObjCType: @encode(char*) at: &type]; for (i = 0; i < _numArgs; i++) { int flags = _inf[i+1].qual; const char *type = _inf[i+1].type; void *datum; if (i == 0) { datum = &_target; } else if (i == 1) { datum = &_selector; } else { datum = cifframe_arg_addr((cifframe_t *)_cframe, i); } /* * Decide how, (or whether or not), to encode the argument * depending on its FLAGS and TYPE. Only the first two cases * involve parameters that may potentially be passed by * reference, and thus only the first two may change the value * of OUT_PARAMETERS. */ switch (*type) { case _C_ID: if (flags & _F_BYCOPY) { [coder encodeBycopyObject: *(id*)datum]; } #ifdef _F_BYREF else if (flags & _F_BYREF) { [coder encodeByrefObject: *(id*)datum]; } #endif else { [coder encodeObject: *(id*)datum]; } break; case _C_CHARPTR: /* * Handle a (char*) argument. * If the char* is qualified as an OUT parameter, or if it * not explicitly qualified as an IN parameter, then we will * have to get this char* again after the method is run, * because the method may have changed it. Set * OUT_PARAMETERS accordingly. */ if ((flags & _F_OUT) || !(flags & _F_IN)) { out_parameters = YES; } /* * If the char* is qualified as an IN parameter, or not * explicity qualified as an OUT parameter, then encode * it. */ if ((flags & _F_IN) || !(flags & _F_OUT)) { [coder encodeValueOfObjCType: type at: datum]; } break; case _C_PTR: /* * If the pointer's value is qualified as an OUT parameter, * or if it not explicitly qualified as an IN parameter, * then we will have to get the value pointed to again after * the method is run, because the method may have changed * it. Set OUT_PARAMETERS accordingly. */ if ((flags & _F_OUT) || !(flags & _F_IN)) { out_parameters = YES; } if (passp) { if ((flags & _F_IN) || !(flags & _F_OUT)) { [coder encodeValueOfObjCType: type at: datum]; } } else { /* * Handle an argument that is a pointer to a non-char. But * (void*) and (anything**) is not allowed. * The argument is a pointer to something; increment TYPE * so we can see what it is a pointer to. */ type++; /* * If the pointer's value is qualified as an IN parameter, * or not explicity qualified as an OUT parameter, then * encode it. */ if ((flags & _F_IN) || !(flags & _F_OUT)) { [coder encodeValueOfObjCType: type at: *(void**)datum]; } } break; case _C_STRUCT_B: case _C_UNION_B: case _C_ARY_B: /* * Handle struct and array arguments. * Whether DATUM points to the data, or points to a pointer * that points to the data, depends on the value of * CALLFRAME_STRUCT_BYREF. Do the right thing * so that ENCODER gets a pointer to directly to the data. */ [coder encodeValueOfObjCType: type at: datum]; break; default: /* Handle arguments of all other types. */ [coder encodeValueOfObjCType: type at: datum]; } } /* * Return a BOOL indicating whether or not there are parameters that * were passed by reference; we will need to get those values again * after the method has finished executing because the execution of * the method may have changed them. */ return out_parameters; } @end gnustep-base-1.29.0/Source/GSFTPURLHandle.m000066400000000000000000000576631435650067400202330ustar00rootroot00000000000000/** GSFTPURLHandle.m - Class GSFTPURLHandle Copyright (C) 2002 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: June 2002 This file is part of the GNUstep Library. 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 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 USA. */ #import "common.h" #import "Foundation/NSArray.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSException.h" #import "Foundation/NSValue.h" #import "Foundation/NSData.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSURL.h" #import "Foundation/NSURLHandle.h" #import "Foundation/NSNotification.h" #import "Foundation/NSRunLoop.h" #import "Foundation/NSByteOrder.h" #import "Foundation/NSLock.h" #import "Foundation/NSFileHandle.h" #import "GNUstepBase/GSMime.h" #import "GSPrivate.h" GS_EXPORT NSString * const GSTelnetNotification; GS_EXPORT NSString * const GSTelnetErrorKey; GS_EXPORT NSString * const GSTelnetTextKey; @interface GSTelnetHandle : NSObject { NSStringEncoding enc; NSFileHandle *remote; NSMutableData *ibuf; unsigned pos; BOOL lineMode; BOOL connected; } - (id) initWithHandle: (NSFileHandle*)handle isConnected: (BOOL)flag; - (void) putTelnetLine: (NSString*)s; - (void) putTelnetText: (NSString*)s; - (void) setEncoding: (NSStringEncoding)e; - (void) setLineMode: (BOOL)flag; @end @interface GSTelnetHandle (Private) - (void) _didConnect: (NSNotification*)notification; - (void) _didRead: (NSNotification*)notification; - (void) _didWrite: (NSNotification*)notification; @end NSString * const GSTelnetNotification = @"GSTelnetNotification"; NSString * const GSTelnetErrorKey = @"GSTelnetErrorKey"; NSString * const GSTelnetTextKey = @"GSTelnetTextKey"; @implementation GSTelnetHandle #define WILL 251 #define WONT 252 #define DO 253 #define DONT 254 #define IAC 255 - (void) dealloc { NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; [nc removeObserver: self]; RELEASE(remote); RELEASE(ibuf); [super dealloc]; } - (id) init { return [self initWithHandle: nil isConnected: NO]; } - (id) initWithHandle: (NSFileHandle*)handle isConnected: (BOOL)flag { if (handle == nil) { DESTROY(self); } else { NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; connected = flag; enc = NSUTF8StringEncoding; ibuf = [NSMutableData new]; remote = RETAIN(handle); if (connected == YES) { [nc addObserver: self selector: @selector(_didRead:) name: NSFileHandleReadCompletionNotification object: remote]; [nc addObserver: self selector: @selector(_didWrite:) name: GSFileHandleWriteCompletionNotification object: remote]; [remote readInBackgroundAndNotify]; } else { [nc addObserver: self selector: @selector(_didConnect:) name: GSFileHandleConnectCompletionNotification object: remote]; } } return self; } - (void) putTelnetLine: (NSString*)s { if ([s hasSuffix: @"\n"] == NO) { s = [s stringByAppendingString: @"\r\n"]; } [self putTelnetText: s]; } - (void) putTelnetText: (NSString*)s { NSMutableData *md; unsigned char *to; NSData *d = [s dataUsingEncoding: enc]; unsigned char *from = (unsigned char *)[d bytes]; unsigned int len = [d length]; unsigned int i = 0; unsigned int count = 0; for (i = 0; i < len; i++) { if (from[i] == IAC) { count++; } } md = [[NSMutableData alloc] initWithLength: len + count]; to = [md mutableBytes]; for (i = 0; i < len; i++) { if (*from == IAC) { *to++ = IAC; } *to++ = *from++; } //NSLog(@"Write - '%*.*s'", [md length], [md length], [md bytes]); [remote writeInBackgroundAndNotify: md]; DESTROY(md); } /** * Set the string encoding used to convert strings to be sent to the * remote system into raw data, and to convert incoming data from that * system inot input text. */ - (void) setEncoding: (NSStringEncoding)e { enc = e; } /** * Sets a flag to say whether observers are to be notified of incoming * data after every chunk read, or only when one or more entire lines * are read.
* When switching out of line mode, this will cause a notification to be * generated if there is any buffered data available for use. */ - (void) setLineMode: (BOOL)flag { if (lineMode != flag) { lineMode = flag; if (lineMode == NO) { [self _didRead: nil]; } } } @end @implementation GSTelnetHandle (Private) - (void) _didConnect: (NSNotification*)notification { NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; NSDictionary *info = [notification userInfo]; NSString *e; e = [info objectForKey: GSFileHandleNotificationError]; if (e == nil) { [nc removeObserver: self name: GSFileHandleConnectCompletionNotification object: [notification object]]; [nc addObserver: self selector: @selector(_didRead:) name: NSFileHandleReadCompletionNotification object: remote]; [nc addObserver: self selector: @selector(_didWrite:) name: GSFileHandleWriteCompletionNotification object: remote]; [remote readInBackgroundAndNotify]; } else { info = [NSDictionary dictionaryWithObject: e forKey: GSTelnetErrorKey]; [nc postNotificationName: GSTelnetNotification object: self userInfo: info]; } } - (void) _didRead: (NSNotification*)notification { NSDictionary *userInfo = [notification userInfo]; NSMutableArray *text = nil; NSData *d; d = [userInfo objectForKey: NSFileHandleNotificationDataItem]; /* * If the notification is nil, this method has been called to flush * any buffered data out. */ if (notification != nil && (d == nil || [d length] == 0)) { NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; NSDictionary *info; info = [NSDictionary dictionaryWithObject: @"EOF" forKey: GSTelnetErrorKey]; [nc postNotificationName: GSTelnetNotification object: self userInfo: info]; } else { NSMutableData *toWrite = nil; unsigned char *ptr; unsigned char c; unsigned int s = 0; int old; int len; int i; // May be negative. if (d != nil) { // NSLog(@"Read - '%@'", d); [ibuf appendData: d]; } old = len = (int)[ibuf length]; ptr = [ibuf mutableBytes]; for (i = pos; i < len; i++) { NSData *line = nil; c = ptr[i]; if (c == IAC) { if (i < len - 1) { c = ptr[i+1]; if (c == WILL || c == WONT || c == DO || c == DONT) { /* * refuse any negotiation attempts. */ if (c == WILL || c == DO) { unsigned char opt[3]; if (toWrite == nil) { toWrite = [NSMutableData alloc]; toWrite = [toWrite initWithCapacity: 12]; } opt[0] = IAC; if (c == DO) { opt[1] = WONT; } else { opt[1] = DONT; } opt[2] = ptr[i+2]; [toWrite appendBytes: opt length: 3]; } if (i < len - 2) { // NSLog(@"Command: %d %d", ptr[1], ptr[2]); len -= 3; if (len - i > 0) { memmove(ptr, &ptr[3], len - i); } i--; // Try again. } else { i--; break; // Need more data } } else if (c == IAC) // Escaped IAC { len--; if (len - i > 0) { memmove(ptr, &ptr[1], len - i); } } else { // NSLog(@"Command: %d", ptr[1]); /* * Strip unimplemented escape sequence. */ len -= 2; if (len - i > 0) { memmove(ptr, &ptr[2], len - i); } i--; // Try again from here. } } else { i--; break; // Need more data } } else if (c == '\r' && (int)i < len - 1 && ptr[i+1] == '\n') { line = [[NSData alloc] initWithBytes: &ptr[s] length: i-s+2]; i++; s = i + 1; } else if (c == '\n') { line = [[NSData alloc] initWithBytes: &ptr[s] length: i-s+1]; s = i + 1; } if (line != nil) { NSString *lineString; lineString = [[NSString alloc] initWithData: line encoding: enc]; DESTROY(line); if (text == nil) { text = [[NSMutableArray alloc] initWithCapacity: 4]; } [text addObject: lineString]; DESTROY(lineString); } } pos = i; /* * If not in line mode, we can add the remainder of the data to * the array of strings for notification. */ if (lineMode == NO && s != pos) { NSString *lineString; NSData *line; line = [[NSData alloc] initWithBytes: &ptr[s] length: pos - s]; s = pos; lineString = [[NSString alloc] initWithData: line encoding: enc]; DESTROY(line); if (text == nil) { text = [[NSMutableArray alloc] initWithCapacity: 4]; } [text addObject: lineString]; DESTROY(lineString); } /* * Adjust size of data remaining in buffer if necessary. */ if (old != len || s > 0) { if (s > 0) { len -= s; pos -= s; if (len > 0) { memmove(ptr, &ptr[s], len); } } [ibuf setLength: len]; } /* * Send telnet protocol negotion info if necessary. */ if (toWrite != nil) { // NSLog(@"Write - '%@'", toWrite); [remote writeInBackgroundAndNotify: toWrite]; DESTROY(toWrite); } /* * Send notification for text read as necessary. */ if (text != nil) { NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; NSNotification *n; NSDictionary *info; info = [NSDictionary dictionaryWithObject: text forKey: GSTelnetTextKey]; DESTROY(text); n = [NSNotification notificationWithName: GSTelnetNotification object: self userInfo: info]; [nc postNotification: n]; } [remote readInBackgroundAndNotify]; } } - (void) _didWrite: (NSNotification*)notification { NSDictionary *userInfo = [notification userInfo]; NSString *e; e = [userInfo objectForKey: GSFileHandleNotificationError]; if (e) { NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; NSDictionary *info; info = [NSDictionary dictionaryWithObject: e forKey: GSTelnetErrorKey]; [nc postNotificationName: GSTelnetNotification object: self userInfo: info]; } } @end @interface GSFTPURLHandle : NSURLHandle { GSTelnetHandle *cHandle; NSFileHandle *dHandle; NSURL *url; NSData *wData; NSString *term; enum { idle, cConnect, // Establishing control connection sentUser, // Sent username sentPass, // Sent password sentType, // Sent data type sentPasv, // Requesting host/port information for data link data, // Establishing or using data connection list, // listing directory } state; } - (void) _control: (NSNotification*)n; - (void) _data: (NSNotification*)n; @end /** *

* This is a PRIVATE subclass of NSURLHandle. * It is documented here in order to give you information about the * default behavior of an NSURLHandle created to deal with a URL * that has the ftp scheme. * The name and/or other implementation details of this class * may be changed at any time. *

*

* A GSFTPURLHandle instance is used to manage connections to * ftp URLs. *

*/ @implementation GSFTPURLHandle static NSMutableDictionary *urlCache = nil; static NSLock *urlLock = nil; + (NSURLHandle*) cachedHandleForURL: (NSURL*)newUrl { NSURLHandle *obj = nil; if ([[newUrl scheme] caseInsensitiveCompare: @"ftp"] == NSOrderedSame) { NSString *page = [newUrl absoluteString]; // NSLog(@"Lookup for handle for '%@'", page); [urlLock lock]; obj = [urlCache objectForKey: page]; IF_NO_ARC([[obj retain] autorelease];) [urlLock unlock]; // NSLog(@"Found handle %@", obj); } return obj; } + (void) initialize { if (self == [GSFTPURLHandle class]) { urlCache = [NSMutableDictionary new]; [[NSObject leakAt: &urlCache] release]; urlLock = [NSLock new]; [[NSObject leakAt: &urlLock] release]; } } - (void) dealloc { if (state != idle) { [self endLoadInBackground]; } RELEASE(url); RELEASE(wData); RELEASE(term); [super dealloc]; } - (id) initWithURL: (NSURL*)newUrl cached: (BOOL)cached { if ((self = [super initWithURL: newUrl cached: cached]) != nil) { ASSIGN(url, newUrl); state = idle; if (cached == YES) { NSString *page = [newUrl absoluteString]; [urlLock lock]; [urlCache setObject: self forKey: page]; [urlLock unlock]; // NSLog(@"Cache handle %@ for '%@'", self, page); } } return self; } + (BOOL) canInitWithURL: (NSURL*)newUrl { if ([[newUrl scheme] isEqualToString: @"ftp"] == YES) { return YES; } return NO; } - (void) _control: (NSNotification*)n { NSDictionary *info = [n userInfo]; NSString *e = [info objectForKey: GSTelnetErrorKey]; NSArray *text; NSString *line; if (e == nil) { NSEnumerator *enumerator; text = [info objectForKey: GSTelnetTextKey]; // NSLog(@"Ctl: %@", text); /* Find first reply line which is not a continuation of another. */ enumerator = [text objectEnumerator]; while ((line = [enumerator nextObject]) != nil) { if (term == nil) { if ([line length] > 4) { char buf[4]; buf[0] = (char)[line characterAtIndex: 0]; buf[1] = (char)[line characterAtIndex: 1]; buf[2] = (char)[line characterAtIndex: 2]; buf[3] = (char)[line characterAtIndex: 3]; if (isdigit(buf[0]) && isdigit(buf[1]) && isdigit(buf[2])) { if (buf[3] == '-') { /* Got start of a multiline block ... * set the terminator we need to look for. */ buf[3] = ' '; term = [[NSString alloc] initWithCString: buf length: 4]; } else if (buf[3] == ' ') { /* Found single line response. */ break; } } } } else if ([line hasPrefix: term] == YES) { /* Found end of a multiline response. */ DESTROY(term); break; } } if (line == nil) { return; } if (state == cConnect) { if ([line hasPrefix: @"2"] == YES) { NSString *user = [url user]; if (user == nil) { user = @"anonymous"; } [cHandle putTelnetLine: [@"USER " stringByAppendingString: user]]; state = sentUser; } else { e = line; } } else if (state == sentUser) { if ([line hasPrefix: @"230"] == YES) // No password required { [cHandle putTelnetLine: @"TYPE I"]; state = sentType; } else if ([line hasPrefix: @"331"] == YES) { NSString *pass = [url password]; if (pass == nil) { pass = [url user]; if (pass == nil) { pass = @"GNUstep@here"; } else { pass = @""; } } [cHandle putTelnetLine: [@"PASS " stringByAppendingString: pass]]; state = sentPass; } else { e = line; } } else if (state == sentPass) { if ([line hasPrefix: @"2"] == YES) { [cHandle putTelnetLine: @"TYPE I"]; state = sentType; } else { e = line; } } else if (state == sentType) { if ([line hasPrefix: @"2"] == YES) { [cHandle putTelnetLine: @"PASV"]; state = sentPasv; } else { e = line; } } else if (state == sentPasv) { if ([line hasPrefix: @"227"] == YES) { NSRange r = [line rangeOfString: @"("]; NSString *h = nil; NSString *p = nil; if (r.length > 0) { unsigned pos = NSMaxRange(r); r = [line rangeOfString: @")"]; if (r.length > 0 && r.location > pos) { NSArray *a; r = NSMakeRange(pos, r.location - pos); line = [line substringWithRange: r]; a = [line componentsSeparatedByString: @","]; if ([a count] == 6) { h = [NSString stringWithFormat: @"%@.%@.%@.%@", [a objectAtIndex: 0], [a objectAtIndex: 1], [a objectAtIndex: 2], [a objectAtIndex: 3]]; p = [NSString stringWithFormat: @"%d", [[a objectAtIndex: 4] intValue] * 256 + [[a objectAtIndex: 5] intValue]]; } } } if (h == nil) { e = @"Invalid host/port information for pasv command"; } else { NSNotificationCenter *nc; dHandle = [NSFileHandle fileHandleAsClientInBackgroundAtAddress: h service: p protocol: @"tcp"]; IF_NO_ARC([dHandle retain];) nc = [NSNotificationCenter defaultCenter]; [nc addObserver: self selector: @selector(_data:) name: GSFileHandleConnectCompletionNotification object: dHandle]; state = data; } } else { e = line; } } else if (state == data) { if ([line hasPrefix: @"550"] == YES && wData == nil) { state = list; [cHandle putTelnetLine: [NSString stringWithFormat: @"NLST %@", [url path]]]; } else if ([line hasPrefix: @"1"] == NO && [line hasPrefix: @"2"] == NO) { e = line; } } else if (state == list) { if ([line hasPrefix: @"550"] == YES) { NSRange r = [line rangeOfString: @"not a plain file"]; /* * Some servers may return an error on listing even though * the path was a valid directory. We try to catch some of * those cases and produce an empty listing instead. */ if (r.location > 0) { NSNotificationCenter *nc; nc = [NSNotificationCenter defaultCenter]; if (dHandle != nil) { [nc removeObserver: self name: nil object: dHandle]; [dHandle closeFile]; DESTROY(dHandle); } [nc removeObserver: self name: GSTelnetNotification object: cHandle]; DESTROY(cHandle); state = idle; [self didLoadBytes: [NSData data] loadComplete: YES]; } else { e = line; } } else if ([line hasPrefix: @"1"] == NO && [line hasPrefix: @"2"] == NO) { e = line; } } else { e = @"Message in unknown state"; } } if (e != nil) { /* * Tell superclass that the load failed - let it do housekeeping. */ [self endLoadInBackground]; [self backgroundLoadDidFailWithReason: e]; } } - (void) _data: (NSNotification*)n { NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; NSString *name = [n name]; NSDictionary *info = [n userInfo]; NSString *e = [info objectForKey: GSFileHandleNotificationError]; // NSLog(@"_data: %@", n); [nc removeObserver: self name: name object: dHandle]; /* * See if the connection attempt caused an error. */ if (e != nil) { if ([name isEqualToString: GSFileHandleConnectCompletionNotification]) { NSLog(@"Unable to connect to %@:%@ via socket ... %@", [dHandle socketAddress], [dHandle socketService], e); } // NSLog(@"Fail - %@", e); /* * Tell superclass that the load failed - let it do housekeeping. */ [self endLoadInBackground]; [self backgroundLoadDidFailWithReason: e]; return; } if ([name isEqualToString: GSFileHandleConnectCompletionNotification]) { if (wData == nil) { [cHandle putTelnetLine: [NSString stringWithFormat: @"RETR %@", [url path]]]; [nc addObserver: self selector: @selector(_data:) name: NSFileHandleReadCompletionNotification object: dHandle]; [dHandle readInBackgroundAndNotify]; } else { [cHandle putTelnetLine: [NSString stringWithFormat: @"STOR %@", [url path]]]; [nc addObserver: self selector: @selector(_data:) name: GSFileHandleWriteCompletionNotification object: dHandle]; [dHandle writeInBackgroundAndNotify: wData]; } } else { if (wData == nil) { NSData *d; d = [info objectForKey: NSFileHandleNotificationDataItem]; if ([d length] > 0) { [self didLoadBytes: d loadComplete: NO]; [nc addObserver: self selector: @selector(_data:) name: NSFileHandleReadCompletionNotification object: dHandle]; [dHandle readInBackgroundAndNotify]; } else { NSNotificationCenter *nc; nc = [NSNotificationCenter defaultCenter]; if (dHandle != nil) { [nc removeObserver: self name: nil object: dHandle]; [dHandle closeFile]; DESTROY(dHandle); } [nc removeObserver: self name: GSTelnetNotification object: cHandle]; DESTROY(cHandle); state = idle; [self didLoadBytes: d loadComplete: YES]; } } else { NSNotificationCenter *nc; NSData *tmp; nc = [NSNotificationCenter defaultCenter]; if (dHandle != nil) { [nc removeObserver: self name: nil object: dHandle]; [dHandle closeFile]; DESTROY(dHandle); } [nc removeObserver: self name: GSTelnetNotification object: cHandle]; DESTROY(cHandle); state = idle; /* * Tell superclass that we have successfully loaded the data. */ tmp = wData; wData = nil; [self didLoadBytes: tmp loadComplete: YES]; DESTROY(tmp); } } } - (void) endLoadInBackground { if (state != idle) { NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; if (dHandle != nil) { [nc removeObserver: self name: nil object: dHandle]; [dHandle closeFile]; DESTROY(dHandle); } [nc removeObserver: self name: GSTelnetNotification object: cHandle]; DESTROY(cHandle); state = idle; } [super endLoadInBackground]; } - (void) loadInBackground { NSNotificationCenter *nc; NSString *host = nil; NSString *port = nil; NSNumber *p; NSFileHandle *sock; /* * Don't start a load if one is in progress. */ if (state != idle) { NSLog(@"Attempt to load an ftp handle which is not idle ... ignored"); return; } [self beginLoadInBackground]; host = [url host]; p = [url port]; if (p != nil) { port = [NSString stringWithFormat: @"%u", [p unsignedIntValue]]; } else { port = [url scheme]; } sock = [NSFileHandle fileHandleAsClientInBackgroundAtAddress: host service: port protocol: @"tcp"]; if (sock == nil) { /* * Tell superclass that the load failed - let it do housekeeping. */ [self backgroundLoadDidFailWithReason: [NSString stringWithFormat: @"Unable to connect to %@:%@ ... %@", host, port, [NSError _last]]]; return; } cHandle = [[GSTelnetHandle alloc] initWithHandle: sock isConnected: NO]; nc = [NSNotificationCenter defaultCenter]; [nc addObserver: self selector: @selector(_control:) name: GSTelnetNotification object: cHandle]; state = cConnect; } /** * We cannot get/set any properties for FTP */ - (id) propertyForKey: (NSString*)propertyKey { return nil; } /** * We cannot get/set any properties for FTP */ - (id) propertyForKeyIfAvailable: (NSString*)propertyKey { return nil; } /** * Sets the specified data to be written to the URL on the next load. */ - (BOOL) writeData: (NSData*)data { ASSIGN(wData, data); return YES; } /** * We cannot get/set any properties for FTP */ - (BOOL) writeProperty: (id)propertyValue forKey: (NSString*)propertyKey { return NO; } @end gnustep-base-1.29.0/Source/GSFastEnumeration.h000066400000000000000000000022511435650067400211610ustar00rootroot00000000000000 #ifdef __clang__ #define FOR_IN(type, var, collection) \ for (type var in collection)\ { #define END_FOR_IN(collection) } #else #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wattributes" void objc_enumerationMutation(id); #pragma GCC diagnostic pop #define FOR_IN(type, var, c) \ do\ {\ type var;\ NSFastEnumerationState gs_##c##_enumState = { 0 };\ id gs_##c##_items[16];\ unsigned long gs_##c##_limit = \ [c countByEnumeratingWithState: &gs_##c##_enumState \ objects: gs_##c##_items \ count: 16];\ if (gs_##c##_limit)\ {\ unsigned long gs_startMutations = *gs_##c##_enumState.mutationsPtr;\ do {\ unsigned long gs_##c##counter = 0;\ do {\ if (gs_startMutations != *gs_##c##_enumState.mutationsPtr)\ {\ objc_enumerationMutation(c);\ }\ var = gs_##c##_enumState.itemsPtr[gs_##c##counter++];\ #define END_FOR_IN(c) \ } while (gs_##c##counter < gs_##c##_limit);\ } while ((gs_##c##_limit \ = [c countByEnumeratingWithState: &gs_##c##_enumState\ objects: gs_##c##_items\ count: 16]));\ }\ } while(0); #endif gnustep-base-1.29.0/Source/GSFileHandle.h000066400000000000000000000070311435650067400200510ustar00rootroot00000000000000/* Interface for GSFileHandle for GNUStep Copyright (C) 1997-2002 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 1997 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __GSFileHandle_h_GNUSTEP_BASE_INCLUDE #define __GSFileHandle_h_GNUSTEP_BASE_INCLUDE #import "Foundation/NSFileHandle.h" #import "Foundation/NSArray.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSRunLoop.h" #if USE_ZLIB #include #endif #ifdef __ANDROID__ #include #endif struct sockaddr_in; /** * DO NOT USE ... this header is here only for the SSL file handle support * and is not intended to be used by anyone else ... it is subject to * change or removal without warning. */ @interface GSFileHandle : NSFileHandle { #if GS_EXPOSE(GSFileHandle) int descriptor; BOOL closeOnDealloc; BOOL isStandardFile; // stdin, stdout, and stderr BOOL isStandardStream; BOOL isStandardInput; BOOL isNullDevice; BOOL isSocket; BOOL isNonBlocking; BOOL wasNonBlocking; BOOL acceptOK; BOOL connectOK; BOOL readOK; BOOL writeOK; NSMutableDictionary *readInfo; int readMax; NSMutableArray *writeInfo; int writePos; NSString *address; NSString *service; NSString *protocol; #if USE_ZLIB gzFile gzDescriptor; #endif #if defined(_WIN32) WSAEVENT event; #endif #ifdef __ANDROID__ AAsset *asset; #endif #endif } - (id) initAsClientAtAddress: (NSString*)address service: (NSString*)service protocol: (NSString*)protocol; - (id) initAsClientInBackgroundAtAddress: (NSString*)address service: (NSString*)service protocol: (NSString*)protocol forModes: (NSArray*)modes; - (id) initAsServerAtAddress: (NSString*)address service: (NSString*)service protocol: (NSString*)protocol; - (id) initForReadingAtPath: (NSString*)path; - (id) initForWritingAtPath: (NSString*)path; - (id) initForUpdatingAtPath: (NSString*)path; - (id) initWithStandardError; - (id) initWithStandardInput; - (id) initWithStandardOutput; - (id) initWithNullDevice; - (void) checkAccept; - (void) checkConnect; - (void) checkRead; - (void) checkWrite; - (void) ignoreReadDescriptor; - (void) ignoreWriteDescriptor; - (void) setNonBlocking: (BOOL)flag; - (void) postReadNotification; - (void) postWriteNotification; - (NSInteger) read: (void*)buf length: (NSUInteger)len; - (void) receivedEvent: (void*)data type: (RunLoopEventType)type extra: (void*)extra forMode: (NSString*)mode; - (void) setAddr: (struct sockaddr *)sin; - (BOOL) useCompression; - (void) watchReadDescriptorForModes: (NSArray*)modes; - (void) watchWriteDescriptor; - (NSInteger) write: (const void*)buf length: (NSUInteger)len; @end #endif /* __GSFileHandle_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Source/GSFileHandle.m000066400000000000000000001544031435650067400200640ustar00rootroot00000000000000/** Implementation for GSFileHandle for GNUStep Copyright (C) 1997-2002 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 1997, 2002 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #define EXPOSE_NSFileHandle_IVARS 1 #define EXPOSE_GSFileHandle_IVARS 1 #import "Foundation/NSData.h" #import "Foundation/NSArray.h" #import "Foundation/NSFileHandle.h" #import "Foundation/NSException.h" #import "Foundation/NSRunLoop.h" #import "Foundation/NSNotification.h" #import "Foundation/NSNotificationQueue.h" #import "Foundation/NSHost.h" #import "Foundation/NSByteOrder.h" #import "Foundation/NSProcessInfo.h" #import "Foundation/NSUserDefaults.h" #import "GSPrivate.h" #import "GSNetwork.h" #import "GSFileHandle.h" #import "../Tools/gdomap.h" #include #include #include #include #include #include #if defined(HAVE_SYS_FILE_H) # include #endif #include #if defined(HAVE_SYS_FCNTL_H) # include #elif defined(HAVE_FCNTL_H) # include #endif #include #ifdef __svr4__ # ifdef HAVE_SYS_FILIO_H # include # endif #endif #include /* * Stuff for setting the sockets into non-blocking mode. */ #if defined(__POSIX_SOURCE)\ || defined(__EXT_POSIX1_198808)\ || defined(O_NONBLOCK) #define NBLK_OPT O_NONBLOCK #else #define NBLK_OPT FNDELAY #endif #ifndef O_BINARY #ifdef _O_BINARY #define O_BINARY _O_BINARY #else #define O_BINARY 0 #endif #endif #ifndef INADDR_NONE #define INADDR_NONE -1 #endif // Maximum data in single I/O operation #define NETBUF_SIZE (1024 * 16) #define READ_SIZE NETBUF_SIZE*10 static GSFileHandle *fh_stdin = nil; static GSFileHandle *fh_stdout = nil; static GSFileHandle *fh_stderr = nil; @interface GSTcpTune : NSObject - (int) delay; - (int) recvSize; - (int) sendSize: (int)bytesToSend; - (void) tune: (void*)handle; @end @implementation GSTcpTune static int tuneDelay = 0; static int tuneLinger = -1; static int tuneReceive = 0; static BOOL tuneSendAll = NO; static int tuneRBuf = 0; static int tuneSBuf = 0; + (void) defaultsChanged: (NSNotification*)n { NSUserDefaults *defs = (NSUserDefaults*)[n object]; NSString *str; if (nil == defs) { defs = [NSUserDefaults standardUserDefaults]; } str = [defs stringForKey: @"GSTcpLinger"]; if (nil == str) { tuneLinger = -1; } else { tuneLinger = [str intValue]; } tuneRBuf = (int)[defs integerForKey: @"GSTcpRcvBuf"]; tuneSBuf = (int)[defs integerForKey: @"GSTcpSndBuf"]; tuneReceive = (int)[defs integerForKey: @"GSTcpReceive"]; tuneSendAll = [defs boolForKey: @"GSTcpSendAll"]; tuneDelay = [defs boolForKey: @"GSTcpDelay"]; } + (void) initialize { static BOOL beenHere = NO; if (NO == beenHere) { NSNotificationCenter *nc; NSUserDefaults *defs; beenHere = YES; nc = [NSNotificationCenter defaultCenter]; defs = [NSUserDefaults standardUserDefaults]; [nc addObserver: self selector: @selector(defaultsChanged:) name: NSUserDefaultsDidChangeNotification object: defs]; [self defaultsChanged: nil]; } } - (int) delay { return tuneDelay; // Milliseconds to delay close } - (int) recvSize { if (tuneReceive > 0) { return tuneReceive; // Return receive buffer size } if (tuneRBuf > 0) { return tuneRBuf; // Return socket receive buffer size } return READ_SIZE; // Return hard-coded default } - (int) sendSize: (int)bytesToSend { if (YES == tuneSendAll) { return bytesToSend; // Try to send all in one go } if (tuneSBuf > 0 && tuneSBuf <= bytesToSend) { return tuneSBuf; // Limit to socket send buffer } if (NETBUF_SIZE <= bytesToSend) { return NETBUF_SIZE; // Limit to hard coded default } return bytesToSend; } - (void) tune: (void*)handle { int desc = (int)(intptr_t)handle; int value; /* * Enable tcp-level tracking of whether connection is alive. */ value = 1; if (setsockopt(desc, SOL_SOCKET, SO_KEEPALIVE, (char *)&value, sizeof(value)) < 0) { NSDebugMLLog(@"GSTcpTune", @"setsockopt keepalive failed"); } if (tuneLinger >= 0) { struct linger l; l.l_onoff = 1; l.l_linger = tuneLinger; if (setsockopt(desc, SOL_SOCKET, SO_LINGER, (char *)&l, sizeof(l)) < 0) { NSLog(@"Failed to set GSTcpLinger %d: %@", tuneLinger, [NSError _last]); } } if (tuneRBuf > 0) { /* Set the receive buffer for the socket. */ if (setsockopt(desc, SOL_SOCKET, SO_RCVBUF, (char *)&tuneRBuf, sizeof(tuneRBuf)) < 0) { NSLog(@"Failed to set GSTcpRcvBuf %d: %@", tuneRBuf, [NSError _last]); } else { NSDebugMLLog(@"GSTcpTune", @"Set GSTcpRcvBuf %d", tuneRBuf); } } if (tuneSBuf > 0) { /* Set the send buffer for the socket. */ if (setsockopt(desc, SOL_SOCKET, SO_SNDBUF, (char *)&tuneSBuf, sizeof(tuneSBuf)) < 0) { NSLog(@"Failed to set GSTcpSndBuf %d: %@", tuneSBuf, [NSError _last]); } else { NSDebugMLLog(@"GSTcpTune", @"Set GSTcpSndBuf %d", tuneSBuf); } } } @end // Key to info dictionary for operation mode. static NSString* NotificationKey = @"NSFileHandleNotificationKey"; @interface GSFileHandle(private) - (void) receivedEventRead; - (void) receivedEventWrite; @end @implementation GSFileHandle static GSTcpTune *tune = nil; + (void) initialize { if (nil == tune) { tune = [GSTcpTune new]; } } /** * Encapsulates low level read operation to get data from the operating * system. */ - (NSInteger) read: (void*)buf length: (NSUInteger)len { int result; do { #ifdef __ANDROID__ if (asset) { result = AAsset_read(asset, buf, len); } else #endif #if USE_ZLIB if (gzDescriptor != 0) { result = gzread(gzDescriptor, buf, len); } else #endif if (isSocket) { result = recv(descriptor, buf, len, 0); } else { result = read(descriptor, buf, len); } } while (result < 0 && EINTR == errno); return result; } /** * Encapsulates low level write operation to send data to the operating * system. */ - (NSInteger) write: (const void*)buf length: (NSUInteger)len { int result; do { #if USE_ZLIB if (gzDescriptor != 0) { result = gzwrite(gzDescriptor, (char*)buf, len); } else #endif if (isSocket) { result = send(descriptor, buf, len, 0); } else { result = write(descriptor, buf, len); } } while (result < 0 && EINTR == errno); return result; } + (id) allocWithZone: (NSZone*)z { return NSAllocateObject ([self class], 0, z); } - (void) dealloc { if (self == fh_stdin) { fh_stdin = nil; [NSException raise: NSGenericException format: @"Attempt to deallocate standard input handle"]; } if (self == fh_stdout) { fh_stdout = nil; [NSException raise: NSGenericException format: @"Attempt to deallocate standard output handle"]; } if (self == fh_stderr) { fh_stderr = nil; [NSException raise: NSGenericException format: @"Attempt to deallocate standard error handle"]; } DESTROY(address); DESTROY(service); DESTROY(protocol); DESTROY(readInfo); DESTROY(writeInfo); /* Finalize *after* destroying readInfo and writeInfo so that, if the * file handle needs to be closed, we don't generate any notifications * containing the deallocated object. Tnanks to david for this fix. */ [self finalize]; [super dealloc]; } - (void) finalize { [self ignoreReadDescriptor]; [self ignoreWriteDescriptor]; #ifdef __ANDROID__ if (asset) { AAsset_close(asset); asset = NULL; } else #endif if (closeOnDealloc == YES && descriptor != -1) { [self closeFile]; } else { #if USE_ZLIB /* * The gzDescriptor should always be closed when we have done with it. */ if (gzDescriptor != 0) { gzclose(gzDescriptor); gzDescriptor = 0; } #endif if (descriptor != -1) { [self setNonBlocking: wasNonBlocking]; } } } // Initializing a GSFileHandle Object - (id) init { return [self initWithNullDevice]; } /** * Initialise as a client socket connection ... do this by using * [-initAsClientInBackgroundAtAddress:service:protocol:forModes:] * and running the current run loop in NSDefaultRunLoopMode until * the connection attempt succeeds, fails, or times out. */ - (id) initAsClientAtAddress: (NSString*)a service: (NSString*)s protocol: (NSString*)p { self = [self initAsClientInBackgroundAtAddress: a service: s protocol: p forModes: nil]; if (self != nil) { NSRunLoop *loop; NSDate *limit; loop = [NSRunLoop currentRunLoop]; limit = [NSDate dateWithTimeIntervalSinceNow: 300]; while ([limit timeIntervalSinceNow] > 0 && (readInfo != nil || [writeInfo count] > 0)) { [loop runMode: NSDefaultRunLoopMode beforeDate: limit]; } if (readInfo != nil || [writeInfo count] > 0 || readOK == NO) { /* Must have timed out or failed */ DESTROY(self); } else { [self setNonBlocking: NO]; } } return self; } /* * States for socks connection negotiation */ NSString * const GSSOCKSConnect = @"GSSOCKSConnect"; NSString * const GSSOCKSSendAuth = @"GSSOCKSSendAuth"; NSString * const GSSOCKSRecvAuth = @"GSSOCKSRecvAuth"; NSString * const GSSOCKSSendConn = @"GSSOCKSSendConn"; NSString * const GSSOCKSRecvConn = @"GSSOCKSRecvConn"; NSString * const GSSOCKSRecvAddr = @"GSSOCKSRecvAddr"; - (void) _socksHandler: (NSNotification*)aNotification { NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; NSString *name = [aNotification name]; NSDictionary *info = (NSMutableDictionary*)[aNotification userInfo]; NSArray *modes; NSString *error; NSMutableDictionary *i = nil; NSNotification *n = nil; NSDebugMLLog(@"NSFileHandle", @"%@ SOCKS connection: %@", self, aNotification); [nc removeObserver: self name: name object: self]; modes = (NSArray*)[info objectForKey: NSFileHandleNotificationMonitorModes]; error = [info objectForKey: GSFileHandleNotificationError]; if (error == nil) { if (name == GSSOCKSConnect) { NSData *item; /* * Send an authorisation record to the SOCKS server. */ i = [info mutableCopy]; /* * Authorisation record is at least three bytes - * socks version (5) * authorisation method bytes to follow (1) * say we do no authorisation (0) */ item = [[NSData alloc] initWithBytes: "\5\1\0" length: 3]; [i setObject: item forKey: NSFileHandleNotificationDataItem]; RELEASE(item); [i setObject: GSSOCKSSendAuth forKey: NotificationKey]; [writeInfo addObject: i]; RELEASE(i); [nc addObserver: self selector: @selector(_socksHandler:) name: GSSOCKSSendAuth object: self]; [self watchWriteDescriptor]; } else if (name == GSSOCKSSendAuth) { NSMutableData *item; /* * We have written the authorisation record, so we * request a response from the SOCKS server. */ readMax = 2; readInfo = [info mutableCopy]; [readInfo setObject: GSSOCKSRecvAuth forKey: NotificationKey]; item = [[NSMutableData alloc] initWithCapacity: 0]; [readInfo setObject: item forKey: NSFileHandleNotificationDataItem]; RELEASE(item); [nc addObserver: self selector: @selector(_socksHandler:) name: GSSOCKSRecvAuth object: self]; [self watchReadDescriptorForModes: modes]; } else if (name == GSSOCKSRecvAuth) { NSData *response; const unsigned char *bytes; response = [info objectForKey: NSFileHandleNotificationDataItem]; bytes = (const unsigned char*)[response bytes]; if ([response length] != 2) { error = @"authorisation response from SOCKS was not two bytes"; } else if (bytes[0] != 5) { error = @"authorisation response from SOCKS had wrong version"; } else if (bytes[1] != 0) { error = @"authorisation response from SOCKS had wrong method"; } else { NSData *item; char buf[10]; const char *ptr; int p; /* * Send the address information to the SOCKS server. */ i = [info mutableCopy]; /* * Connect command is ten bytes - * socks version * connect command * reserved byte * address type * address 4 bytes (big endian) * port 2 bytes (big endian) */ buf[0] = 5; // Socks version number buf[1] = 1; // Connect command buf[2] = 0; // Reserved buf[3] = 1; // Address type (IPV4) ptr = [address lossyCString]; buf[4] = atoi(ptr); while (isdigit(*ptr)) ptr++; ptr++; buf[5] = atoi(ptr); while (isdigit(*ptr)) ptr++; ptr++; buf[6] = atoi(ptr); while (isdigit(*ptr)) ptr++; ptr++; buf[7] = atoi(ptr); p = [service intValue]; buf[8] = ((p & 0xff00) >> 8); buf[9] = (p & 0xff); item = [[NSData alloc] initWithBytes: buf length: 10]; [i setObject: item forKey: NSFileHandleNotificationDataItem]; RELEASE(item); [i setObject: GSSOCKSSendConn forKey: NotificationKey]; [writeInfo addObject: i]; RELEASE(i); [nc addObserver: self selector: @selector(_socksHandler:) name: GSSOCKSSendConn object: self]; [self watchWriteDescriptor]; } } else if (name == GSSOCKSSendConn) { NSMutableData *item; /* * We have written the connect command, so we * request a response from the SOCKS server. */ readMax = 4; readInfo = [info mutableCopy]; [readInfo setObject: GSSOCKSRecvConn forKey: NotificationKey]; item = [[NSMutableData alloc] initWithCapacity: 0]; [readInfo setObject: item forKey: NSFileHandleNotificationDataItem]; RELEASE(item); [nc addObserver: self selector: @selector(_socksHandler:) name: GSSOCKSRecvConn object: self]; [self watchReadDescriptorForModes: modes]; } else if (name == GSSOCKSRecvConn) { NSData *response; const unsigned char *bytes; unsigned len = 0; response = [info objectForKey: NSFileHandleNotificationDataItem]; bytes = (const unsigned char*)[response bytes]; if ([response length] != 4) { error = @"connect response from SOCKS had bad length"; } else if (bytes[0] != 5) { error = @"connect response from SOCKS had wrong version"; } else if (bytes[1] != 0) { switch (bytes[1]) { case 1: error = @"SOCKS server general failure"; break; case 2: error = @"SOCKS server says permission denied"; break; case 3: error = @"SOCKS server says network unreachable"; break; case 4: error = @"SOCKS server says host unreachable"; break; case 5: error = @"SOCKS server says connection refused"; break; case 6: error = @"SOCKS server says connection timed out"; break; case 7: error = @"SOCKS server says command not supported"; break; case 8: error = @"SOCKS server says address type not supported"; break; default: error = @"connect response from SOCKS was failure"; break; } } else if (bytes[3] == 1) { len = 4; // Fixed size (IPV4) address } else if (bytes[3] == 3) { len = 1 + bytes[4]; // Domain name with leading length } else if (bytes[3] == 4) { len = 16; // Fixed size (IPV6) address } else { error = @"SOCKS server returned unknown address type"; } if (error == nil) { NSMutableData *item; /* * We have received a success, so we must now consume the * address and port information the SOCKS server sends. */ readMax = len + 2; readInfo = [info mutableCopy]; [readInfo setObject: GSSOCKSRecvAddr forKey: NotificationKey]; item = [[NSMutableData alloc] initWithCapacity: 0]; [readInfo setObject: item forKey: NSFileHandleNotificationDataItem]; RELEASE(item); [nc addObserver: self selector: @selector(_socksHandler:) name: GSSOCKSRecvAddr object: self]; [self watchReadDescriptorForModes: modes]; } } else if (name == GSSOCKSRecvAddr) { /* * Success ... We read the address from the socks server so * the connection is now ready to go. */ name = GSFileHandleConnectCompletionNotification; i = [info mutableCopy]; [i setObject: name forKey: NotificationKey]; n = [NSNotification notificationWithName: name object: self userInfo: i]; RELEASE(i); } else { /* * Argh ... unexpected notification. */ error = @"unexpected notification during SOCKS connection"; } } /* * If 'error' is non-null, we set up a notification to tell people * the connection failed. */ if (error != nil) { NSDebugMLLog(@"NSFileHandle", @"%@ SOCKS error: %@", self, error); /* * An error in the initial connection ... notify observers * by re-posting the notification with a new name. */ name = GSFileHandleConnectCompletionNotification; i = [info mutableCopy]; [i setObject: name forKey: NotificationKey]; [i setObject: error forKey: GSFileHandleNotificationError]; n = [NSNotification notificationWithName: name object: self userInfo: i]; RELEASE(i); } /* * If a notification has been set up, we post it as the last thing we do. */ if (n != nil) { NSNotificationQueue *q; q = [NSNotificationQueue defaultQueue]; [q enqueueNotification: n postingStyle: NSPostASAP coalesceMask: NSNotificationNoCoalescing forModes: modes]; } } - (id) initAsClientInBackgroundAtAddress: (NSString*)a service: (NSString*)s protocol: (NSString*)p forModes: (NSArray*)modes { static NSString *esocks = nil; static NSString *dsocks = nil; static BOOL beenHere = NO; int net; struct sockaddr sin; struct sockaddr lsin; NSString *lhost = nil; NSString *shost = nil; NSString *sport = nil; if (beenHere == NO) { NSUserDefaults *defs; beenHere = YES; defs = [NSUserDefaults standardUserDefaults]; dsocks = [[defs stringForKey: @"GSSOCKS"] copy]; if (dsocks == nil) { NSDictionary *env; env = [[NSProcessInfo processInfo] environment]; esocks = [env objectForKey: @"SOCKS5_SERVER"]; if (esocks == nil) { esocks = [env objectForKey: @"SOCKS_SERVER"]; } esocks = [esocks copy]; } } if (a == nil || [a isEqualToString: @""]) { a = @"localhost"; } if (s == nil) { NSLog(@"bad argument - service is nil"); DESTROY(self); return nil; } if ([p hasPrefix: @"bind-"] == YES) { NSRange r; lhost = [p substringFromIndex: 5]; r = [lhost rangeOfString: @":"]; if (r.length > 0) { p = [lhost substringFromIndex: NSMaxRange(r)]; lhost = [lhost substringToIndex: r.location]; } else { p = nil; } if (GSPrivateSockaddrSetup(lhost, 0, p, @"tcp", &lsin) == NO) { NSLog(@"bad bind address specification"); DESTROY(self); return nil; } p = @"tcp"; } /** * A protocol fo the form 'socks-...' controls socks operation, * overriding defaults and environment variables.
* If it is just 'socks-' it turns off socks for this fiel handle.
* Otherwise, the following text must be the name of the socks server * (optionally followed by :port). */ if ([p hasPrefix: @"socks-"] == YES) { shost = [p substringFromIndex: 6]; p = @"tcp"; } else if (dsocks != nil) { shost = dsocks; // GSSOCKS user default } else { shost = esocks; // SOCKS_SERVER environment variable. } if (shost != nil && [shost length] > 0) { NSRange r; r = [shost rangeOfString: @":"]; if (r.length > 0) { sport = [shost substringFromIndex: NSMaxRange(r)]; shost = [shost substringToIndex: r.location]; } else { sport = @"1080"; } p = @"tcp"; } if (GSPrivateSockaddrSetup(a, 0, s, p, &sin) == NO) { DESTROY(self); NSLog(@"bad address-service-protocol combination"); return nil; } [self setAddr: &sin]; // Store the address of the remote end. /* * Don't use SOCKS if we are contacting the local host. */ if (shost != nil) { NSHost *remote = [NSHost hostWithAddress: [self socketAddress]]; NSHost *local = [NSHost currentHost]; if ([remote isEqual: local] || [remote isEqual: [NSHost localHost]]) { shost = nil; } } if (shost != nil) { if (GSPrivateSockaddrSetup(shost, 0, sport, p, &sin) == NO) { NSLog(@"bad SOCKS host-port combination"); DESTROY(self); return nil; } } if ((net = socket(sin.sa_family, SOCK_STREAM, PF_UNSPEC)) == -1) { NSLog(@"unable to create socket - %@", [NSError _last]); DESTROY(self); return nil; } [tune tune: (void*)(intptr_t)net]; if (lhost != nil) { if (bind(net, &lsin, GSPrivateSockaddrLength(&lsin)) == -1) { NSLog(@"unable to bind to port %@ - %@", GSPrivateSockaddrName(&lsin), [NSError _last]); (void) close(net); DESTROY(self); return nil; } } self = [self initWithFileDescriptor: net closeOnDealloc: YES]; if (self) { NSMutableDictionary* info; isSocket = YES; [self setNonBlocking: YES]; if (connect(net, &sin, GSPrivateSockaddrLength(&sin)) == -1) { if (!GSWOULDBLOCK) { NSError *e = [NSError _last]; NSLog(@"unable to make socket connection to %@ - %@ (%d)", GSPrivateSockaddrName(&sin), e, (int)[e code]); DESTROY(self); return nil; } } info = [[NSMutableDictionary alloc] initWithCapacity: 4]; [info setObject: address forKey: NSFileHandleNotificationDataItem]; if (shost == nil) { [info setObject: GSFileHandleConnectCompletionNotification forKey: NotificationKey]; } else { NSNotificationCenter *nc; /* * If we are making a socks connection, register self as an * observer of notifications and ensure we will manage this. */ nc = [NSNotificationCenter defaultCenter]; [nc addObserver: self selector: @selector(_socksHandler:) name: GSSOCKSConnect object: self]; [info setObject: GSSOCKSConnect forKey: NotificationKey]; } if (modes) { [info setObject: modes forKey: NSFileHandleNotificationMonitorModes]; } [writeInfo addObject: info]; RELEASE(info); [self watchWriteDescriptor]; connectOK = YES; acceptOK = NO; readOK = NO; writeOK = NO; } return self; } - (id) initAsServerAtAddress: (NSString*)a service: (NSString*)s protocol: (NSString*)p { #ifndef BROKEN_SO_REUSEADDR int status = 1; #endif int net; struct sockaddr sin; unsigned int size = sizeof(sin); if (GSPrivateSockaddrSetup(a, 0, s, p, &sin) == NO) { DESTROY(self); NSLog(@"bad address-service-protocol combination"); return nil; } if ((net = socket(sin.sa_family, SOCK_STREAM, PF_UNSPEC)) == -1) { NSLog(@"unable to create socket - %@", [NSError _last]); DESTROY(self); return nil; } #ifndef BROKEN_SO_REUSEADDR /* * Under decent systems, SO_REUSEADDR means that the port can be reused * immediately that this process exits. Under some it means * that multiple processes can serve the same port simultaneously. * We don't want that broken behavior! */ if (setsockopt(net, SOL_SOCKET, SO_REUSEADDR, (char*)&status, sizeof(status)) < 0) { NSDebugMLLog(@"GSTcpTune", @"setsockopt reuseaddr failed"); } #endif if (bind(net, &sin, GSPrivateSockaddrLength(&sin)) == -1) { NSError *e = [NSError _last]; NSLog(@"unable to bind to port %@ - %@", GSPrivateSockaddrName(&sin), e); (void) close(net); DESTROY(self); return nil; } /* We try to allow a large number of connections. */ if (listen(net, GSBACKLOG) == -1) { NSLog(@"unable to listen on port - %@", [NSError _last]); (void) close(net); DESTROY(self); return nil; } if (getsockname(net, &sin, &size) == -1) { NSLog(@"unable to get socket name - %@", [NSError _last]); (void) close(net); DESTROY(self); return nil; } self = [self initWithFileDescriptor: net closeOnDealloc: YES]; if (self) { isSocket = YES; connectOK = NO; acceptOK = YES; readOK = NO; writeOK = NO; [self setAddr: &sin]; } return self; } - (id) initForReadingAtPath: (NSString*)path { int d = open([path fileSystemRepresentation], O_RDONLY|O_BINARY); if (d < 0) { #ifdef __ANDROID__ asset = [NSBundle assetForPath:path withMode:AASSET_MODE_RANDOM]; if (asset) { readOK = YES; return self; } #endif DESTROY(self); return nil; } else { self = [self initWithFileDescriptor: d closeOnDealloc: YES]; if (self) { connectOK = NO; acceptOK = NO; writeOK = NO; } return self; } } - (id) initForWritingAtPath: (NSString*)path { int d = open([path fileSystemRepresentation], O_WRONLY|O_BINARY); if (d < 0) { DESTROY(self); return nil; } else { self = [self initWithFileDescriptor: d closeOnDealloc: YES]; if (self) { connectOK = NO; acceptOK = NO; readOK = NO; } return self; } } - (id) initForUpdatingAtPath: (NSString*)path { int d = open([path fileSystemRepresentation], O_RDWR|O_BINARY); if (d < 0) { DESTROY(self); return nil; } else { self = [self initWithFileDescriptor: d closeOnDealloc: YES]; if (self != nil) { connectOK = NO; acceptOK = NO; } return self; } } - (id) initWithStandardError { if (fh_stderr != nil) { ASSIGN(self, fh_stderr); } else { self = [self initWithFileDescriptor: 2 closeOnDealloc: NO]; ASSIGN(fh_stderr, self); if (self) { readOK = NO; } } return self; } - (id) initWithStandardInput { if (fh_stdin != nil) { ASSIGN(self, fh_stdin); } else { self = [self initWithFileDescriptor: 0 closeOnDealloc: NO]; ASSIGN(fh_stdin, self); if (self) { writeOK = NO; } } return self; } - (id) initWithStandardOutput { if (fh_stdout != nil) { ASSIGN(self, fh_stdout); } else { self = [self initWithFileDescriptor: 1 closeOnDealloc: NO]; ASSIGN(fh_stdout, self); if (self) { readOK = NO; } } return self; } - (id) initWithNullDevice { self = [self initWithFileDescriptor: open("/dev/null", O_RDWR|O_BINARY) closeOnDealloc: YES]; if (self) { isNullDevice = YES; } return self; } - (id) initWithFileDescriptor: (int)desc closeOnDealloc: (BOOL)flag { self = [super init]; if (nil == self) { if (YES == flag) { close(desc); } } else { struct stat sbuf; int e; if (fstat(desc, &sbuf) < 0) { #if defined(_WIN32) /* On windows, an fstat will fail if the descriptor is a pipe * or socket, so we simply mark the descriptor as not being a * standard file. */ isStandardFile = NO; #else /* This should never happen on unix. If it does, we have somehow * ended up with a bad descriptor. */ NSLog(@"unable to get status of descriptor %d - %@", desc, [NSError _last]); isStandardFile = NO; #endif } else { if (S_ISREG(sbuf.st_mode)) { isStandardFile = YES; } else { isStandardFile = NO; } } if ((e = fcntl(desc, F_GETFL, 0)) >= 0) { if (e & NBLK_OPT) { wasNonBlocking = YES; } else { wasNonBlocking = NO; } } isNonBlocking = wasNonBlocking; descriptor = desc; closeOnDealloc = flag; readInfo = nil; writeInfo = [NSMutableArray new]; readMax = 0; writePos = 0; readOK = YES; writeOK = YES; acceptOK = YES; connectOK = YES; } return self; } - (id) initWithNativeHandle: (void*)hdl { return [self initWithFileDescriptor: (uintptr_t)hdl closeOnDealloc: NO]; } - (id) initWithNativeHandle: (void*)hdl closeOnDealloc: (BOOL)flag { return [self initWithFileDescriptor: (uintptr_t)hdl closeOnDealloc: flag]; } - (void) checkAccept { if (acceptOK == NO) { [NSException raise: NSFileHandleOperationException format: @"accept not permitted in this file handle"]; } if (readInfo) { id operation = [readInfo objectForKey: NotificationKey]; if (operation == NSFileHandleConnectionAcceptedNotification) { [NSException raise: NSFileHandleOperationException format: @"accept already in progress"]; } else { [NSException raise: NSFileHandleOperationException format: @"read already in progress"]; } } } - (void) checkConnect { if (connectOK == NO) { [NSException raise: NSFileHandleOperationException format: @"connect not permitted in this file handle"]; } if ([writeInfo count] > 0) { NSDictionary *info = [writeInfo objectAtIndex: 0]; id operation = [info objectForKey: NotificationKey]; if (operation == GSFileHandleConnectCompletionNotification) { [NSException raise: NSFileHandleOperationException format: @"connect already in progress"]; } else { [NSException raise: NSFileHandleOperationException format: @"write already in progress"]; } } } - (void) checkRead { if (readOK == NO) { [NSException raise: NSFileHandleOperationException format: @"read not permitted on this file handle"]; } if (readInfo) { id operation = [readInfo objectForKey: NotificationKey]; if (operation == NSFileHandleConnectionAcceptedNotification) { [NSException raise: NSFileHandleOperationException format: @"accept already in progress"]; } else { [NSException raise: NSFileHandleOperationException format: @"read already in progress"]; } } } - (void) checkWrite { if (writeOK == NO) { [NSException raise: NSFileHandleOperationException format: @"write not permitted in this file handle"]; } if ([writeInfo count] > 0) { NSDictionary *info = [writeInfo objectAtIndex: 0]; id operation = [info objectForKey: NotificationKey]; if (operation != GSFileHandleWriteCompletionNotification) { [NSException raise: NSFileHandleOperationException format: @"connect in progress"]; } } } // Returning file handles - (int) fileDescriptor { return descriptor; } - (void*) nativeHandle { return (void*)(intptr_t)descriptor; } // Synchronous I/O operations - (NSData*) availableData { int rmax = [tune recvSize]; char buf[rmax]; NSMutableData* d; int len; [self checkRead]; d = [NSMutableData dataWithCapacity: 0]; if (isStandardFile) { if (isNonBlocking == YES) { [self setNonBlocking: NO]; } while ((len = [self read: buf length: sizeof(buf)]) > 0) { [d appendBytes: buf length: len]; } } else { if (isNonBlocking == NO) { [self setNonBlocking: YES]; } len = [self read: buf length: sizeof(buf)]; if (len <= 0) { if (errno == EAGAIN || errno == EINTR) { /* * Read would have blocked ... so try to get a single character * in non-blocking mode (to ensure we wait until data arrives) * and then try again. * This ensures that we block for *some* data as we should. */ [self setNonBlocking: NO]; len = [self read: buf length: 1]; [self setNonBlocking: YES]; if (len == 1) { len = [self read: &buf[1] length: sizeof(buf) - 1]; if (len <= 0) { len = 1; } else { len = len + 1; } } } } if (len > 0) { [d appendBytes: buf length: len]; } } if (len < 0) { [NSException raise: NSFileHandleOperationException format: @"unable to read from descriptor - %@", [NSError _last]]; } return d; } - (NSData*) readDataToEndOfFile { int rmax = [tune recvSize]; char buf[rmax]; NSMutableData* d; int len; [self checkRead]; if (isNonBlocking == YES) { [self setNonBlocking: NO]; } d = [NSMutableData dataWithCapacity: 0]; while ((len = [self read: buf length: sizeof(buf)]) > 0) { [d appendBytes: buf length: len]; } if (len < 0) { [NSException raise: NSFileHandleOperationException format: @"unable to read from descriptor - %@", [NSError _last]]; } return d; } - (NSData*) readDataOfLength: (unsigned)len { NSMutableData *d; int got; int rmax = [tune recvSize]; char buf[rmax]; [self checkRead]; if (isNonBlocking == YES) { [self setNonBlocking: NO]; } d = [NSMutableData dataWithCapacity: len < sizeof(buf) ? len : sizeof(buf)]; do { int chunk = len > sizeof(buf) ? sizeof(buf) : len; got = [self read: buf length: chunk]; if (got > 0) { [d appendBytes: buf length: got]; len -= got; } else if (got < 0) { [NSException raise: NSFileHandleOperationException format: @"unable to read from descriptor - %@", [NSError _last]]; } } while (len > 0 && got > 0); return d; } - (void) writeData: (NSData*)item { int rval = 0; const void* ptr = [item bytes]; unsigned int len = [item length]; unsigned int pos = 0; [self checkWrite]; if (isNonBlocking == YES) { [self setNonBlocking: NO]; } while (pos < len) { int toWrite = len - pos; toWrite = [tune sendSize: toWrite]; rval = [self write: (char*)ptr+pos length: toWrite]; if (rval < 0) { if (errno == EAGAIN || errno == EINTR) { rval = 0; } else { break; } } pos += rval; } if (rval < 0) { [NSException raise: NSFileHandleOperationException format: @"unable to write to descriptor - %@", [NSError _last]]; } } // Asynchronous I/O operations - (void) acceptConnectionInBackgroundAndNotifyForModes: (NSArray*)modes { [self checkAccept]; readMax = 0; RELEASE(readInfo); readInfo = [[NSMutableDictionary alloc] initWithCapacity: 4]; [readInfo setObject: NSFileHandleConnectionAcceptedNotification forKey: NotificationKey]; [self watchReadDescriptorForModes: modes]; } - (void) readDataInBackgroundAndNotifyLength: (unsigned)len forModes: (NSArray*)modes { NSMutableData *d; [self checkRead]; if (len > 0x7fffffff) { [NSException raise: NSInvalidArgumentException format: @"length (%u) too large", len]; } readMax = len; RELEASE(readInfo); readInfo = [[NSMutableDictionary alloc] initWithCapacity: 4]; [readInfo setObject: NSFileHandleReadCompletionNotification forKey: NotificationKey]; d = [[NSMutableData alloc] initWithCapacity: readMax]; [readInfo setObject: d forKey: NSFileHandleNotificationDataItem]; RELEASE(d); [self watchReadDescriptorForModes: modes]; } - (void) readInBackgroundAndNotifyForModes: (NSArray*)modes { NSMutableData *d; [self checkRead]; readMax = -1; // Accept any quantity of data. RELEASE(readInfo); readInfo = [[NSMutableDictionary alloc] initWithCapacity: 4]; [readInfo setObject: NSFileHandleReadCompletionNotification forKey: NotificationKey]; d = [[NSMutableData alloc] initWithCapacity: 0]; [readInfo setObject: d forKey: NSFileHandleNotificationDataItem]; RELEASE(d); [self watchReadDescriptorForModes: modes]; } - (void) readToEndOfFileInBackgroundAndNotifyForModes: (NSArray*)modes { NSMutableData *d; [self checkRead]; readMax = 0; RELEASE(readInfo); readInfo = [[NSMutableDictionary alloc] initWithCapacity: 4]; [readInfo setObject: NSFileHandleReadToEndOfFileCompletionNotification forKey: NotificationKey]; d = [[NSMutableData alloc] initWithCapacity: 0]; [readInfo setObject: d forKey: NSFileHandleNotificationDataItem]; RELEASE(d); [self watchReadDescriptorForModes: modes]; } - (void) waitForDataInBackgroundAndNotifyForModes: (NSArray*)modes { [self checkRead]; readMax = 0; RELEASE(readInfo); readInfo = [[NSMutableDictionary alloc] initWithCapacity: 4]; [readInfo setObject: NSFileHandleDataAvailableNotification forKey: NotificationKey]; [readInfo setObject: [NSMutableData dataWithCapacity: 0] forKey: NSFileHandleNotificationDataItem]; [self watchReadDescriptorForModes: modes]; } // Seeking within a file - (unsigned long long) offsetInFile { off_t result = -1; #ifdef __ANDROID__ if (asset) { result = AAsset_seek(asset, 0, SEEK_CUR); } else #endif if (isStandardFile && descriptor >= 0) { #if USE_ZLIB if (gzDescriptor != 0) { result = gzseek(gzDescriptor, 0, SEEK_CUR); } else #endif result = lseek(descriptor, 0, SEEK_CUR); } if (result < 0) { [NSException raise: NSFileHandleOperationException format: @"failed to move to offset in file - %@", [NSError _last]]; } return (unsigned long long)result; } - (unsigned long long) seekToEndOfFile { off_t result = -1; #ifdef __ANDROID__ if (asset) { result = AAsset_seek(asset, 0, SEEK_END); } else #endif if (isStandardFile && descriptor >= 0) { #if USE_ZLIB if (gzDescriptor != 0) { result = gzseek(gzDescriptor, 0, SEEK_END); } else #endif result = lseek(descriptor, 0, SEEK_END); } if (result < 0) { [NSException raise: NSFileHandleOperationException format: @"failed to move to offset in file - %@", [NSError _last]]; } return (unsigned long long)result; } - (void) seekToFileOffset: (unsigned long long)pos { off_t result = -1; #ifdef __ANDROID__ if (asset) { result = AAsset_seek(asset, (off_t)pos, SEEK_SET); } else #endif if (isStandardFile && descriptor >= 0) { #if USE_ZLIB if (gzDescriptor != 0) { result = gzseek(gzDescriptor, (off_t)pos, SEEK_SET); } else #endif result = lseek(descriptor, (off_t)pos, SEEK_SET); } if (result < 0) { [NSException raise: NSFileHandleOperationException format: @"failed to move to offset in file - %@", [NSError _last]]; } } // Operations on file - (void) closeFile { if (descriptor < 0) { [NSException raise: NSFileHandleOperationException format: @"attempt to close closed file"]; } [self ignoreReadDescriptor]; [self ignoreWriteDescriptor]; [self setNonBlocking: NO]; #ifdef __ANDROID__ if (asset) { AAsset_close(asset); asset = NULL; } else #endif #if USE_ZLIB if (gzDescriptor != 0) { gzclose(gzDescriptor); gzDescriptor = 0; } #endif if (YES == isSocket) { int milli = [tune delay]; shutdown(descriptor, SHUT_WR); if (milli > 0) { NSTimeInterval until; until = [NSDate timeIntervalSinceReferenceDate]; until += ((double)milli) / 1000.0; [self setNonBlocking: YES]; while ([NSDate timeIntervalSinceReferenceDate] < until) { int result; char buffer[4096]; result = read(descriptor, buffer, sizeof(buffer)); if (result <= 0) { if (result < 0) { if (EAGAIN == errno || EINTR == errno) { continue; } NSLog(@"%@ read fail on socket shutdown: %@", self, [NSError _last]); } break; } } [self setNonBlocking: YES]; } } (void)close(descriptor); descriptor = -1; acceptOK = NO; connectOK = NO; readOK = NO; writeOK = NO; /* * Clear any pending operations on the file handle, sending * notifications if necessary. */ if (readInfo) { [readInfo setObject: @"File handle closed locally" forKey: GSFileHandleNotificationError]; [self postReadNotification]; } if ([writeInfo count]) { NSMutableDictionary *info = [writeInfo objectAtIndex: 0]; [info setObject: @"File handle closed locally" forKey: GSFileHandleNotificationError]; [self postWriteNotification]; [writeInfo removeAllObjects]; } } - (void) synchronizeFile { if (isStandardFile) { (void)sync(); } } - (void) truncateFileAtOffset: (unsigned long long)pos { if (isStandardFile && descriptor >= 0) { (void)ftruncate(descriptor, pos); } [self seekToFileOffset: pos]; } - (void) writeInBackgroundAndNotify: (NSData*)item forModes: (NSArray*)modes { NSMutableDictionary* info; [self checkWrite]; info = [[NSMutableDictionary alloc] initWithCapacity: 4]; [info setObject: item forKey: NSFileHandleNotificationDataItem]; [info setObject: GSFileHandleWriteCompletionNotification forKey: NotificationKey]; if (modes != nil) { [info setObject: modes forKey: NSFileHandleNotificationMonitorModes]; } [writeInfo addObject: info]; RELEASE(info); [self watchWriteDescriptor]; } - (void) writeInBackgroundAndNotify: (NSData*)item; { [self writeInBackgroundAndNotify: item forModes: nil]; } - (void) postReadNotification { NSMutableDictionary *info = readInfo; NSNotification *n; NSNotificationQueue *q; NSArray *modes; NSString *name; [self ignoreReadDescriptor]; readInfo = nil; readMax = 0; modes = (NSArray*)[info objectForKey: NSFileHandleNotificationMonitorModes]; name = (NSString*)[info objectForKey: NotificationKey]; if (name == nil) { return; } n = [NSNotification notificationWithName: name object: self userInfo: info]; RELEASE(info); /* Retained by the notification. */ q = [NSNotificationQueue defaultQueue]; [q enqueueNotification: n postingStyle: NSPostASAP coalesceMask: NSNotificationNoCoalescing forModes: modes]; } - (void) postWriteNotification { NSMutableDictionary *info = [writeInfo objectAtIndex: 0]; NSNotificationQueue *q; NSNotification *n; NSArray *modes; NSString *name; [self ignoreWriteDescriptor]; modes = (NSArray*)[info objectForKey: NSFileHandleNotificationMonitorModes]; name = (NSString*)[info objectForKey: NotificationKey]; n = [NSNotification notificationWithName: name object: self userInfo: info]; writePos = 0; [writeInfo removeObjectAtIndex: 0]; /* Retained by notification. */ q = [NSNotificationQueue defaultQueue]; [q enqueueNotification: n postingStyle: NSPostASAP coalesceMask: NSNotificationNoCoalescing forModes: modes]; if ((writeOK || connectOK) && [writeInfo count] > 0) { [self watchWriteDescriptor]; /* In case of queued writes. */ } } - (BOOL) readInProgress { if (readInfo) { return YES; } return NO; } - (BOOL) writeInProgress { if ([writeInfo count] > 0) { return YES; } return NO; } - (void) ignoreReadDescriptor { NSRunLoop *l; NSArray *modes; if (descriptor < 0) { return; } l = [NSRunLoop currentRunLoop]; modes = nil; if (readInfo) { modes = (NSArray*)[readInfo objectForKey: NSFileHandleNotificationMonitorModes]; } if (modes && [modes count]) { unsigned int i; for (i = 0; i < [modes count]; i++) { [l removeEvent: (void*)(uintptr_t)descriptor type: ET_RDESC forMode: [modes objectAtIndex: i] all: YES]; } } else { [l removeEvent: (void*)(uintptr_t)descriptor type: ET_RDESC forMode: NSDefaultRunLoopMode all: YES]; } } - (void) ignoreWriteDescriptor { NSRunLoop *l; NSArray *modes; if (descriptor < 0) { return; } l = [NSRunLoop currentRunLoop]; modes = nil; if ([writeInfo count] > 0) { NSMutableDictionary *info = [writeInfo objectAtIndex: 0]; modes = [info objectForKey: NSFileHandleNotificationMonitorModes]; } if (modes && [modes count]) { unsigned int i; for (i = 0; i < [modes count]; i++) { [l removeEvent: (void*)(uintptr_t)descriptor type: ET_WDESC forMode: [modes objectAtIndex: i] all: YES]; } } else { [l removeEvent: (void*)(uintptr_t)descriptor type: ET_WDESC forMode: NSDefaultRunLoopMode all: YES]; } } - (void) watchReadDescriptorForModes: (NSArray*)modes; { NSRunLoop *l; if (descriptor < 0) { return; } l = [NSRunLoop currentRunLoop]; [self setNonBlocking: YES]; if (modes && [modes count]) { unsigned int i; for (i = 0; i < [modes count]; i++) { [l addEvent: (void*)(uintptr_t)descriptor type: ET_RDESC watcher: self forMode: [modes objectAtIndex: i]]; } [readInfo setObject: modes forKey: NSFileHandleNotificationMonitorModes]; } else { [l addEvent: (void*)(uintptr_t)descriptor type: ET_RDESC watcher: self forMode: NSDefaultRunLoopMode]; } } - (void) watchWriteDescriptor { if (descriptor < 0) { return; } if ([writeInfo count] > 0) { NSMutableDictionary *info = [writeInfo objectAtIndex: 0]; NSRunLoop *l = [NSRunLoop currentRunLoop]; NSArray *modes = nil; modes = [info objectForKey: NSFileHandleNotificationMonitorModes]; [self setNonBlocking: YES]; if (modes && [modes count]) { unsigned int i; for (i = 0; i < [modes count]; i++) { [l addEvent: (void*)(uintptr_t)descriptor type: ET_WDESC watcher: self forMode: [modes objectAtIndex: i]]; } } else { [l addEvent: (void*)(uintptr_t)descriptor type: ET_WDESC watcher: self forMode: NSDefaultRunLoopMode]; } } } - (void) receivedEventRead { NSString *operation; operation = [readInfo objectForKey: NotificationKey]; if (operation == NSFileHandleConnectionAcceptedNotification) { struct sockaddr buf; int desc; unsigned int blen = sizeof(buf); desc = accept(descriptor, &buf, &blen); if (desc == -1) { NSString *s; s = [NSString stringWithFormat: @"Accept attempt failed - %@", [NSError _last]]; [readInfo setObject: s forKey: GSFileHandleNotificationError]; } else { // Accept attempt completed. GSFileHandle *h; struct sockaddr sin; unsigned int size = sizeof(sin); [tune tune: (void*)(intptr_t)desc]; h = [[[self class] alloc] initWithFileDescriptor: desc closeOnDealloc: YES]; h->isSocket = YES; if (getpeername(desc, &sin, &size) >= 0) { [h setAddr: &sin]; } [readInfo setObject: h forKey: NSFileHandleNotificationFileHandleItem]; RELEASE(h); } [self postReadNotification]; } else if (operation == NSFileHandleDataAvailableNotification) { [self postReadNotification]; } else { NSMutableData *item; int length; int received = 0; int rmax = [tune recvSize]; char buf[rmax]; item = [readInfo objectForKey: NSFileHandleNotificationDataItem]; /* * We may have a maximum data size set... */ if (readMax > 0) { length = (unsigned int)readMax - [item length]; if (length > (int)sizeof(buf)) { length = sizeof(buf); } } else { length = sizeof(buf); } received = [self read: buf length: length]; if (received == 0) { // Read up to end of file. [self postReadNotification]; } else if (received < 0) { if (errno != EAGAIN && errno != EINTR) { NSString *s; s = [NSString stringWithFormat: @"Read attempt failed - %@", [NSError _last]]; [readInfo setObject: s forKey: GSFileHandleNotificationError]; [self postReadNotification]; } } else { [item appendBytes: buf length: received]; if (readMax < 0 || (readMax > 0 && (int)[item length] == readMax)) { // Read a single chunk of data [self postReadNotification]; } } } } - (void) receivedEventWrite { NSString *operation; NSMutableDictionary *info; info = [writeInfo objectAtIndex: 0]; operation = [info objectForKey: NotificationKey]; if (operation == GSFileHandleConnectCompletionNotification || operation == GSSOCKSConnect) { // Connection attempt completed. int result; int rval; unsigned len = sizeof(result); rval = getsockopt(descriptor, SOL_SOCKET, SO_ERROR, (char*)&result, &len); if (rval != 0) { NSString *s; s = [NSString stringWithFormat: @"Connect attempt failed - %@", [NSError _last]]; [info setObject: s forKey: GSFileHandleNotificationError]; } else if (result != 0) { NSString *s; s = [NSString stringWithFormat: @"Connect attempt failed - %@", [NSError _systemError: result]]; [info setObject: s forKey: GSFileHandleNotificationError]; } else { readOK = YES; writeOK = YES; } connectOK = NO; [self postWriteNotification]; } else { NSData *item; int length; const void *ptr; item = [info objectForKey: NSFileHandleNotificationDataItem]; length = [item length]; ptr = [item bytes]; while (writePos < length) { int written; written = [self write: (char*)ptr+writePos length: length-writePos]; if (written <= 0) { if (errno != EAGAIN && errno != EINTR) { NSString *s; s = [NSString stringWithFormat: @"Write attempt failed - %@", [NSError _last]]; [info setObject: s forKey: GSFileHandleNotificationError]; [self postWriteNotification]; } break; } else { writePos += written; } } if (writePos >= length) { // Write operation completed. [self postWriteNotification]; } } } - (void) receivedEvent: (void*)data type: (RunLoopEventType)type extra: (void*)extra forMode: (NSString*)mode { NSDebugMLLog(@"NSFileHandle", @"%@ event: %d", self, type); if (isNonBlocking == NO) { [self setNonBlocking: YES]; } if (type == ET_RDESC) { [self receivedEventRead]; } else { [self receivedEventWrite]; } } - (void) setAddr: (struct sockaddr *)sin { NSString *s; ASSIGN(address, GSPrivateSockaddrHost(sin)); s = [NSString stringWithFormat: @"%d", GSPrivateSockaddrPort(sin)]; ASSIGN(service, s); protocol = @"tcp"; } - (void) setNonBlocking: (BOOL)flag { if (descriptor < 0) { return; } else if (isStandardFile == YES) { return; } else if (isNonBlocking == flag) { return; } else { int e; if ((e = fcntl(descriptor, F_GETFL, 0)) >= 0) { if (flag == YES) { e |= NBLK_OPT; } else { e &= ~NBLK_OPT; } if (fcntl(descriptor, F_SETFL, e) < 0) { NSLog(@"unable to set non-blocking mode for %d - %@", descriptor, [NSError _last]); } else { isNonBlocking = flag; } } else { NSLog(@"unable to get non-blocking mode for %d - %@", descriptor, [NSError _last]); } } } - (NSString*) socketAddress { return address; } - (NSString*) socketLocalAddress { NSString *str = nil; struct sockaddr sin; unsigned size = sizeof(sin); if (getsockname(descriptor, &sin, &size) == -1) { NSLog(@"unable to get socket name - %@", [NSError _last]); } else { str = GSPrivateSockaddrHost(&sin); } return str; } - (NSString*) socketLocalService { NSString *str = nil; struct sockaddr sin; unsigned size = sizeof(sin); if (getsockname(descriptor, &sin, &size) == -1) { NSLog(@"unable to get socket name - %@", [NSError _last]); } else { str = [NSString stringWithFormat: @"%d", GSPrivateSockaddrPort(&sin)]; } return str; } - (NSString*) socketProtocol { return protocol; } - (NSString*) socketService { return service; } - (BOOL) useCompression { #if USE_ZLIB int d; if (gzDescriptor != 0) { return YES; // Already open } if (descriptor < 0) { return NO; // No descriptor available. } if (readOK == YES && writeOK == YES) { return NO; // Can't both read and write. } d = dup(descriptor); // d is closed by gzclose() later. if (d < 0) { return NO; // No descriptor available. } if (readOK == YES) { gzDescriptor = gzdopen(d, "rb"); } else { gzDescriptor = gzdopen(d, "wb"); } if (gzDescriptor == 0) { close(d); return NO; // Open attempt failed. } return YES; #endif return NO; } @end gnustep-base-1.29.0/Source/GSFormat.m000066400000000000000000001477021435650067400173250ustar00rootroot00000000000000/** Implementation of GNUSTEP printf-style formatting Copyright (C) 1994-2000, 2001-2013 Free Software Foundation, Inc. Hacked together by Kai Henningsen from the glibc 2.2.1 sources _i18n_number.h _itowa.h itowa-digits.c outdigits.h outdigitswc.h printf-parse.h printf.h vfprintf.c which were contributed by Ulrich Drepper , 2000, Date: January 2001 FIXME: I wasn't brave enough to include floating point formatting - glibc has CPU dependent routines and also uses gmp. So floating point formats (AaFfGgAa) simply use sprintf. FIXME: This needs to use length, not '\0', when dealing with format and %@ No register_printf_functions in this thing. This file is part of the GNUstep Base Library. 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 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 USA. */ #include "common.h" #if !defined(LLONG_MAX) # if defined(__LONG_LONG_MAX__) # define LLONG_MAX __LONG_LONG_MAX__ # define LLONG_MIN (-LLONG_MAX-1) # define ULLONG_MAX (LLONG_MAX * 2ULL + 1) # else # error Neither LLONG_MAX nor __LONG_LONG_MAX__ found # endif #endif #ifdef HAVE_MALLOC_H #if !defined(__OpenBSD__) #include #endif #endif #ifdef HAVE_ALLOCA_H #include #endif #include #import "Foundation/NSArray.h" #import "Foundation/NSCharacterSet.h" #import "Foundation/NSException.h" #import "Foundation/NSValue.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSUserDefaults.h" #import "Foundation/NSFileManager.h" #import "Foundation/NSPortCoder.h" #import "Foundation/NSPathUtilities.h" #import "Foundation/NSRange.h" #import "Foundation/NSException.h" #import "Foundation/NSData.h" #import "Foundation/NSBundle.h" #import "Foundation/NSURL.h" #import "Foundation/NSMapTable.h" #import "Foundation/NSLock.h" #import "GNUstepBase/GSLocale.h" #import "GSPrivate.h" #include // for strstr() #include #include #if defined(HAVE_SYS_FCNTL_H) # include #elif defined(HAVE_FCNTL_H) # include #endif #include #ifdef HAVE_WCHAR_H #include #else typedef uint32_t wint_t; #endif #ifdef HAVE_SYS_INTTYPES_H #include #endif #ifndef HAVE_UINTMAX_T typedef unsigned long long uintmax_t; #endif #import "GNUstepBase/Unicode.h" struct printf_info { int prec; /* Precision. */ int width; /* Width. */ unichar spec; /* Format letter. */ unsigned int is_long_double:1;/* L flag. */ unsigned int is_short:1; /* h flag. */ unsigned int is_long:1; /* l flag. */ unsigned int alt:1; /* # flag. */ unsigned int space:1; /* Space flag. */ unsigned int left:1; /* - flag. */ unsigned int showsign:1; /* + flag. */ unsigned int group:1; /* ' flag. */ unsigned int extra:1; /* For special use. */ unsigned int is_char:1; /* hh flag. */ unsigned int wide:1; /* Nonzero for wide character streams. */ unsigned int i18n:1; /* I flag. */ unichar pad; /* Padding character. */ }; /* Type of a printf specifier-handler function. STREAM is the GSStr on which to write output. INFO gives information about the format specification. ARGS is a vector of pointers to the argument data; the number of pointers will be the number returned by the associated arginfo function for the same INFO. The function should return the number of characters written, or -1 for errors. */ /* Type of a printf specifier-arginfo function. INFO gives information about the format specification. N, ARGTYPES, and return value are as for printf_parse_format. */ /* Register FUNC to be called to format SPEC specifiers; ARGINFO must be specified to determine how many arguments a SPEC conversion requires and what their types are. */ /* Parse FMT, and fill in N elements of ARGTYPES with the types needed for the conversions FMT specifies. Returns the number of arguments required by FMT. The ARGINFO function registered with a user-defined format is passed a `struct printf_info' describing the format spec being parsed. A width or precision of INT_MIN means a `*' was used to indicate that the width/precision will come from an arg. The function should fill in the array it is passed with the types of the arguments it wants, and return the number of arguments it wants. */ /* Codes returned by `parse_printf_format' for basic types. These values cover all the standard format specifications. Users can add new values after PA_LAST for their own types. */ enum { /* C type: */ PA_INT, /* int */ PA_CHAR, /* int, cast to char */ PA_WCHAR, /* wide char */ PA_STRING, /* const char *, a '\0'-terminated string */ PA_WSTRING, /* const wchar_t *, wide character string */ PA_POINTER, /* void * */ PA_FLOAT, /* float */ PA_DOUBLE, /* double */ PA_OBJECT, /* id */ PA_LAST }; /* Flag bits that can be set in a type returned by `parse_printf_format'. */ #define PA_FLAG_MASK 0xff00 #define PA_FLAG_LONG_LONG (1 << 8) #define PA_FLAG_LONG_DOUBLE PA_FLAG_LONG_LONG #define PA_FLAG_LONG (1 << 9) #define PA_FLAG_SHORT (1 << 10) #define PA_FLAG_PTR (1 << 11) /* Function which can be registered as `printf'-handlers. */ /* Print floating point value using using abbreviations for the orders of magnitude used for numbers ('k' for kilo, 'm' for mega etc). If the format specifier is a uppercase character powers of 1000 are used. Otherwise powers of 1024. */ /* This is the appropriate argument information function for `printf_size'. */ /* Digits. */ /* Lower-case digits. */ static const char _itowa_lower_digits[36] = "0123456789abcdefghijklmnopqrstuvwxyz"; /* Upper-case digits. */ static const char _itowa_upper_digits[36] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; /* This code is shared between the standard stdio implementation found in GNU C library and the libio implementation originally found in GNU libg++. Beside this it is also shared between the normal and wide character implementation as defined in ISO/IEC 9899:1990/Amendment 1:1995. */ # define ISDIGIT(Ch) ((unsigned int) ((Ch) - '0') < 10) /* Internal function for converting integers to ASCII. */ /* Convert VALUE into ASCII in base BASE (2..36). Write backwards starting the character just before BUFLIM. Return the address of the first (left-to-right) character in the number. Use upper case letters iff UPPER_CASE is nonzero. */ static unichar *_itowa (unsigned long long int value, unichar *buflim, unsigned int base, int upper_case) { const char *digits = (upper_case ? _itowa_upper_digits : _itowa_lower_digits); unichar *bp = buflim; switch (base) { #define SPECIAL(Base) \ case Base: \ do \ *--bp = digits[value % Base]; \ while ((value /= Base) != 0); \ break SPECIAL (10); SPECIAL (16); SPECIAL (8); default: do *--bp = digits[value % base]; while ((value /= base) != 0); break; } return bp; } static inline unichar * _itowa_word (unsigned long value, unichar *buflim, unsigned int base, int upper_case) { const char *digits = (upper_case ? _itowa_upper_digits : _itowa_lower_digits); unichar *bp = buflim; switch (base) { #define SPECIAL(Base) \ case Base: \ do \ *--bp = digits[value % Base]; \ while ((value /= Base) != 0); \ break SPECIAL (10); SPECIAL (16); SPECIAL (8); default: do *--bp = digits[value % base]; while ((value /= base) != 0); break; } return bp; } #define PAD(Padchar) \ { \ int w = width; \ while (w-- > 0) outchar(Padchar); \ } /* Look up the value of the next multibyte character and return its numerical value if it is one of the digits known in the locale. If *DECIDED is -1 this means it is not yet decided which form it is and we have to search through all available digits. Otherwise we know which script the digits are from. */ static unichar * _i18n_number_rewrite (unichar *w, unichar *rear_ptr, NSString *locale_digits) { unichar *src; unichar *s; unichar buf[10]; unichar *ld = 0; /* Copy existing string so that nothing gets overwritten. */ src = (unichar *) alloca ((rear_ptr - w) * sizeof (unichar)); s = (unichar *) memcpy (src, w, (rear_ptr - w) * sizeof (unichar)); w = rear_ptr; /* Process all characters in the string. */ while (--s >= src) { if (*s >= '0' && *s <= '9') { if (ld == 0) { if (!locale_digits || [locale_digits length] != 10) { locale_digits = @"0123456789"; } [locale_digits getCharacters: buf]; ld = buf; } *--w = ld[*s - '0']; } else { *--w = *s; } } return w; } /* Include the shared code for parsing the format string. */ /* Internal header for parsing printf format strings. */ struct printf_spec { /* Information parsed from the format spec. */ struct printf_info info; /* Pointers into the format string for the end of this format spec and the next (or to the end of the string if no more). */ const unichar *end_of_fmt, *next_fmt; /* Position of arguments for precision and width, or -1 if `info' has the constant value. */ int prec_arg, width_arg; int data_arg; /* Position of data argument. */ int data_arg_type; /* Type of first argument. */ /* Number of arguments consumed by this format specifier. */ size_t ndata_args; }; /* The various kinds off arguments that can be passed to printf. */ union printf_arg { unsigned char pa_char; wchar_t pa_wchar; short int pa_short_int; int pa_int; long int pa_long_int; long long int pa_long_long_int; unsigned short int pa_u_short_int; unsigned int pa_u_int; unsigned long int pa_u_long_int; unsigned long long int pa_u_long_long_int; float pa_float; double pa_double; long double pa_long_double; const char *pa_string; const wchar_t *pa_wstring; id pa_object; void *pa_pointer; }; /* Read a simple integer from a string and update the string pointer. It is assumed that the first character is a digit. */ static inline unsigned int read_int (const unichar * *pstr) { unsigned int retval = **pstr - '0'; while (ISDIGIT (*++(*pstr))) { retval *= 10; retval += **pstr - '0'; } return retval; } /* Find the next spec in FORMAT, or the end of the string. Returns a pointer into FORMAT, to a '%' or a '\0'. */ static inline const unichar * find_spec (const unichar *format) { while (*format && *format != '%') format++; return format; } /* These are defined in reg-printf.c. */ /* FORMAT must point to a '%' at the beginning of a spec. Fills in *SPEC with the parsed details. POSN is the number of arguments already consumed. At most MAXTYPES - POSN types are filled in TYPES. Return the number of args consumed by this spec; *MAX_REF_ARG is updated so it remains the highest argument index used. */ static inline size_t parse_one_spec (const unichar *format, size_t posn, struct printf_spec *spec, size_t *max_ref_arg) { unsigned int n; size_t nargs = 0; /* Skip the '%'. */ ++format; /* Clear information structure. */ spec->data_arg = -1; spec->info.alt = 0; spec->info.space = 0; spec->info.left = 0; spec->info.showsign = 0; spec->info.group = 0; spec->info.i18n = 0; spec->info.pad = ' '; spec->info.wide = sizeof (unichar) > 1; /* Test for positional argument. */ if (ISDIGIT (*format)) { const unichar *begin = format; n = read_int (&format); if (n > 0 && *format == '$') /* Is positional parameter. */ { ++format; /* Skip the '$'. */ spec->data_arg = n - 1; *max_ref_arg = MAX (*max_ref_arg, n); } else /* Oops; that was actually the width and/or 0 padding flag. Step back and read it again. */ format = begin; } /* Check for spec modifiers. */ do { switch (*format) { case ' ': /* Output a space in place of a sign, when there is no sign. */ spec->info.space = 1; continue; case '+': /* Always output + or - for numbers. */ spec->info.showsign = 1; continue; case '-': /* Left-justify things. */ spec->info.left = 1; continue; case '#': /* Use the "alternate form": Hex has 0x or 0X, FP always has a decimal point. */ spec->info.alt = 1; continue; case '0': /* Pad with 0s. */ spec->info.pad = '0'; continue; case '\'': /* Show grouping in numbers if the locale information indicates any. */ spec->info.group = 1; continue; case 'I': /* Use the internationalized form of the output. Currently means to use the `outdigits' of the current locale. */ spec->info.i18n = 1; continue; default: break; } break; } while (*++format); if (spec->info.left) spec->info.pad = ' '; /* Get the field width. */ spec->width_arg = -1; spec->info.width = 0; if (*format == '*') { /* The field width is given in an argument. A negative field width indicates left justification. */ const unichar *begin = ++format; if (ISDIGIT (*format)) { /* The width argument might be found in a positional parameter. */ n = read_int (&format); if (n > 0 && *format == '$') { spec->width_arg = n - 1; *max_ref_arg = MAX (*max_ref_arg, n); ++format; /* Skip '$'. */ } } if (spec->width_arg < 0) { /* Not in a positional parameter. Consume one argument. */ spec->width_arg = posn++; ++nargs; format = begin; /* Step back and reread. */ } } else if (ISDIGIT (*format)) /* Constant width specification. */ spec->info.width = read_int (&format); /* Get the precision. */ spec->prec_arg = -1; /* -1 means none given; 0 means explicit 0. */ spec->info.prec = -1; if (*format == '.') { ++format; if (*format == '*') { /* The precision is given in an argument. */ const unichar *begin = ++format; if (ISDIGIT (*format)) { n = read_int (&format); if (n > 0 && *format == '$') { spec->prec_arg = n - 1; *max_ref_arg = MAX (*max_ref_arg, n); ++format; } } if (spec->prec_arg < 0) { /* Not in a positional parameter. */ spec->prec_arg = posn++; ++nargs; format = begin; } } else if (ISDIGIT (*format)) spec->info.prec = read_int (&format); else /* "%.?" is treated like "%.0?". */ spec->info.prec = 0; } /* Check for type modifiers. */ spec->info.is_long_double = 0; spec->info.is_short = 0; spec->info.is_long = 0; spec->info.is_char = 0; switch (*format++) { case 'h': /* ints are short ints or chars. */ if (*format != 'h') spec->info.is_short = 1; else { ++format; spec->info.is_char = 1; } break; case 'l': /* ints are long ints. */ spec->info.is_long = 1; if (*format != 'l') break; ++format; /* FALLTHROUGH */ case 'L': /* doubles are long doubles, and ints are long long ints. */ case 'q': /* 4.4 uses this for long long. */ spec->info.is_long_double = 1; break; case 'z': case 'Z': /* ints are size_ts. */ NSCParameterAssert (sizeof (size_t) <= sizeof (unsigned long long int)); #if defined(LLONG_MAX) #if LONG_MAX != LLONG_MAX spec->info.is_long_double = sizeof (size_t) > sizeof (unsigned long int); #endif #endif spec->info.is_long = sizeof (size_t) > sizeof (unsigned int); break; case 't': NSCParameterAssert (sizeof (ptrdiff_t) <= sizeof (long long int)); #if defined(LLONG_MAX) #if LONG_MAX != LLONG_MAX spec->info.is_long_double = (sizeof (ptrdiff_t) > sizeof (long int)); #endif #endif spec->info.is_long = sizeof (ptrdiff_t) > sizeof (int); break; case 'j': NSCParameterAssert (sizeof (uintmax_t) <= sizeof (unsigned long long int)); #if defined(LLONG_MAX) #if LONG_MAX != LLONG_MAX spec->info.is_long_double = (sizeof (uintmax_t) > sizeof (unsigned long int)); #endif #endif spec->info.is_long = sizeof (uintmax_t) > sizeof (unsigned int); break; default: /* Not a recognized modifier. Backup. */ --format; break; } /* Get the format specification. */ spec->info.spec = (unichar) *format++; { /* Find the data argument types of a built-in spec. */ spec->ndata_args = 1; switch (spec->info.spec) { case 'i': case 'd': case 'u': case 'o': case 'X': case 'x': #if defined(LLONG_MAX) #if LONG_MAX != LLONG_MAX if (spec->info.is_long_double) spec->data_arg_type = PA_INT|PA_FLAG_LONG_LONG; else #endif #endif if (spec->info.is_long) spec->data_arg_type = PA_INT|PA_FLAG_LONG; else if (spec->info.is_short) spec->data_arg_type = PA_INT|PA_FLAG_SHORT; else if (spec->info.is_char) spec->data_arg_type = PA_CHAR; else spec->data_arg_type = PA_INT; break; case 'e': case 'E': case 'f': case 'F': case 'g': case 'G': case 'a': case 'A': if (spec->info.is_long_double) spec->data_arg_type = PA_DOUBLE|PA_FLAG_LONG_DOUBLE; else spec->data_arg_type = PA_DOUBLE; break; case 'c': spec->data_arg_type = PA_CHAR; break; case 'C': spec->data_arg_type = PA_WCHAR; break; case 's': spec->data_arg_type = PA_STRING; break; case 'S': spec->data_arg_type = PA_WSTRING; break; case '@': spec->data_arg_type = PA_OBJECT; break; case 'p': spec->data_arg_type = PA_POINTER; break; case 'n': spec->data_arg_type = PA_INT|PA_FLAG_PTR; break; case 'm': default: /* An unknown spec will consume no args. */ spec->ndata_args = 0; break; } } if (spec->data_arg == -1 && spec->ndata_args > 0) { /* There are args consumed, but no positional spec. Use the next sequential arg position. */ spec->data_arg = posn; nargs += spec->ndata_args; } if (spec->info.spec == '\0') /* Format ended before this spec was complete. */ spec->end_of_fmt = spec->next_fmt = format - 1; else { /* Find the next format spec. */ spec->end_of_fmt = format; spec->next_fmt = find_spec (format); } return nargs; } static inline void GSStrAppendUnichar(GSStr s, unichar u) { GSPrivateStrAppendUnichars(s, &u, 1); } #define outchar(Ch) GSStrAppendUnichar(s, Ch) #define outstring(String, Len) GSPrivateStrAppendUnichars(s, String, Len) /* For handling long_double and longlong we use the same flag. If `long' and `long long' are effectively the same type define it to zero. */ #if defined(LLONG_MAX) #if LONG_MAX == LLONG_MAX # define is_longlong 0 #else # define is_longlong is_long_double #endif #else # define is_longlong 0 #endif /* If `long' and `int' is effectively the same type we don't have to handle `long separately. */ #if INT_MAX == LONG_MAX # define is_long_num 0 #else # define is_long_num is_long #endif static NSString *locale_sep() { static NSString *sep = nil; if (sep == nil) { char buf[32]; char *from = buf; char *to; snprintf(buf, sizeof(buf), "%g", 1.2); if (*from == '1') from++; to = from; while (*to != '\0' && *to != '2') to++; *to = '\0'; sep = [[NSString alloc] initWithCString: from]; } return sep; } /* Global variables. */ static const unichar null[] = {'(','n','u','l','l',')','\0'}; /* Handle unknown format specifier. */ static int printf_unknown (GSStr, const struct printf_info *, const void *const *); /* Group digits of number string. */ static unichar *group_number (unichar *, unichar *, const char *, NSString *); /* The function itself. */ void GSPrivateFormat (GSStr s, const unichar *format, va_list ap, NSDictionary *locale) { /* The character used as thousands separator. */ NSString *thousands_sep = @""; /* The string describing the size of groups of digits. */ const char *grouping; /* Place to accumulate the result. */ int done; /* Current character in format string. */ const unichar *f; /* End of leading constant string. */ const unichar *lead_str_end; /* Points to next format specifier. */ /* Buffer intermediate results. */ unichar work_buffer[1000]; unichar *workend; int workend_malloced = 0; /* State for restartable multibyte character handling functions. */ /* We have to save the original argument pointer. */ va_list ap_save; /* Count number of specifiers we already processed. */ int nspecs_done; /* For the %m format we may need the current `errno' value. */ int save_errno = errno; /* This table maps a character into a number representing a class. In each step there is a destination label for each class. */ static const int jump_table[] = { /* ' ' */ 1, 0, 0, /* '#' */ 4, 0, /* '%' */ 14, 0, /* '\''*/ 6, 0, 0, /* '*' */ 7, /* '+' */ 2, 0, /* '-' */ 3, /* '.' */ 9, 0, /* '0' */ 5, /* '1' */ 8, /* '2' */ 8, /* '3' */ 8, /* '4' */ 8, /* '5' */ 8, /* '6' */ 8, /* '7' */ 8, /* '8' */ 8, /* '9' */ 8, 0, 0, 0, 0, 0, 0, /* '@' */ 30, /* 'A' */ 26, 0, /* 'C' */ 25, 0, /* 'E' */ 19, /* F */ 19, /* 'G' */ 19, 0, /* 'I' */ 29, 0, 0, /* 'L' */ 12, 0, 0, 0, 0, 0, 0, /* 'S' */ 21, 0, 0, 0, 0, /* 'X' */ 18, 0, /* 'Z' */ 13, 0, 0, 0, 0, 0, 0, /* 'a' */ 26, 0, /* 'c' */ 20, /* 'd' */ 15, /* 'e' */ 19, /* 'f' */ 19, /* 'g' */ 19, /* 'h' */ 10, /* 'i' */ 15, /* 'j' */ 28, 0, /* 'l' */ 11, /* 'm' */ 24, /* 'n' */ 23, /* 'o' */ 17, /* 'p' */ 22, /* 'q' */ 12, 0, /* 's' */ 21, /* 't' */ 27, /* 'u' */ 16, 0, 0, /* 'x' */ 18, 0, /* 'z' */ 13 }; #define NOT_IN_JUMP_RANGE(Ch) ((Ch) < ' ' || (Ch) > 'z') #define CHAR_CLASS(Ch) (jump_table[(wint_t) (Ch) - ' ']) # define JUMP_TABLE_TYPE const void *const /* Initialize local variables. */ done = 0; grouping = (const char *) -1; #ifdef __va_copy /* This macro will be available soon in gcc's . We need it since on some systems `va_list' is not an integral type. */ __va_copy (ap_save, ap); #else ap_save = ap; #endif nspecs_done = 0; /* Find the first format specifier. */ f = lead_str_end = find_spec ((const unichar *) format); /* Write the literal text before the first format. */ outstring ((const unichar *) format, lead_str_end - (const unichar *) format); /* If we only have to print a simple string, return now. */ if (*f == '\0') goto all_done; /* Process whole format string. */ workend = &work_buffer[sizeof (work_buffer) / sizeof (unichar)]; /* Here starts the more complex loop to handle positional parameters. */ { /* Array with information about the needed arguments. This has to be dynamically extensible. */ size_t nspecs = 0; size_t nspecs_max = 32; /* A more or less arbitrary start value. */ struct printf_spec *specs = alloca (nspecs_max * sizeof (struct printf_spec)); /* The number of arguments the format string requests. This will determine the size of the array needed to store the argument attributes. */ size_t nargs = 0; int *args_type; union printf_arg *args_value = NULL; /* Positional parameters refer to arguments directly. This could also determine the maximum number of arguments. Track the maximum number. */ size_t max_ref_arg = 0; /* Just a counter. */ size_t cnt; if (grouping == (const char *) -1) { thousands_sep = [locale objectForKey: NSThousandsSeparator]; if (thousands_sep == nil) thousands_sep = @","; grouping = ""; // FIXME: grouping info missing in locale? if (*grouping == '\0' || *grouping == CHAR_MAX) grouping = NULL; } for (f = lead_str_end; *f != '\0'; f = specs[nspecs++].next_fmt) { if (nspecs >= nspecs_max) { /* Extend the array of format specifiers. */ struct printf_spec *old = specs; nspecs_max *= 2; specs = alloca (nspecs_max * sizeof (struct printf_spec)); if (specs == &old[nspecs]) /* Stack grows up, OLD was the last thing allocated; extend it. */ nspecs_max += nspecs_max / 2; else { /* Copy the old array's elements to the new space. */ memcpy (specs, old, nspecs * sizeof (struct printf_spec)); if (old == &specs[nspecs]) /* Stack grows down, OLD was just below the new SPECS. We can use that space when the new space runs out. */ nspecs_max += nspecs_max / 2; } } /* Parse the format specifier. */ nargs += parse_one_spec (f, nargs, &specs[nspecs], &max_ref_arg); } /* Determine the number of arguments the format string consumes. */ nargs = MAX (nargs, max_ref_arg); /* Allocate memory for the argument descriptions. */ args_type = alloca (nargs * sizeof (int)); memset (args_type, 0, nargs * sizeof (int)); args_value = alloca (nargs * sizeof (union printf_arg)); /* XXX Could do sanity check here: If any element in ARGS_TYPE is still zero after this loop, format is invalid. For now we simply use 0 as the value. */ /* Fill in the types of all the arguments. */ for (cnt = 0; cnt < nspecs; ++cnt) { /* If the width is determined by an argument this is an int. */ if (specs[cnt].width_arg != -1) args_type[specs[cnt].width_arg] = PA_INT; /* If the precision is determined by an argument this is an int. */ if (specs[cnt].prec_arg != -1) args_type[specs[cnt].prec_arg] = PA_INT; switch (specs[cnt].ndata_args) { case 0: /* No arguments. */ break; case 1: /* One argument; we already have the type. */ args_type[specs[cnt].data_arg] = specs[cnt].data_arg_type; break; default: /* ??? */ break; } } /* Now we know all the types and the order. Fill in the argument values. */ for (cnt = 0; cnt < nargs; ++cnt) switch (args_type[cnt]) { #define T(tag, mem, type) \ case tag: \ args_value[cnt].mem = va_arg (ap_save, type); \ break T (PA_CHAR, pa_char, int); /* Promoted. */ T (PA_WCHAR, pa_wchar, int); /* Sometimes promoted. */ T (PA_INT|PA_FLAG_SHORT, pa_short_int, int); /* Promoted. */ T (PA_INT, pa_int, int); T (PA_INT|PA_FLAG_LONG, pa_long_int, long int); T (PA_INT|PA_FLAG_LONG_LONG, pa_long_long_int, long long int); T (PA_FLOAT, pa_float, double); /* Promoted. */ T (PA_DOUBLE, pa_double, double); T (PA_DOUBLE|PA_FLAG_LONG_DOUBLE, pa_long_double, long double); T (PA_STRING, pa_string, const char *); T (PA_WSTRING, pa_wstring, const wchar_t *); T (PA_OBJECT, pa_object, id); T (PA_POINTER, pa_pointer, void *); #undef T default: if ((args_type[cnt] & PA_FLAG_PTR) != 0) args_value[cnt].pa_pointer = va_arg (ap_save, void *); else args_value[cnt].pa_long_double = 0.0; break; } /* Now walk through all format specifiers and process them. */ for (; (size_t) nspecs_done < nspecs; ++nspecs_done) { # define REF(Name) &&do2_##Name #define LABEL(Name) do2_##Name /* Step 4: processing format specifier. */ static JUMP_TABLE_TYPE step4_jumps[31] = { REF (form_unknown), REF (form_unknown), /* for ' ' */ REF (form_unknown), /* for '+' */ REF (form_unknown), /* for '-' */ REF (form_unknown), /* for '' */ REF (form_unknown), /* for '0' */ REF (form_unknown), /* for '\'' */ REF (form_unknown), /* for '*' */ REF (form_unknown), /* for '1'...'9' */ REF (form_unknown), /* for '.' */ REF (form_unknown), /* for 'h' */ REF (form_unknown), /* for 'l' */ REF (form_unknown), /* for 'L', 'q' */ REF (form_unknown), /* for 'z', 'Z' */ REF (form_percent), /* for '%' */ REF (form_integer), /* for 'd', 'i' */ REF (form_unsigned), /* for 'u' */ REF (form_octal), /* for 'o' */ REF (form_hexa), /* for 'X', 'x' */ REF (form_float), /* for 'E', 'e', 'F', 'f', 'G', 'g' */ REF (form_character), /* for 'c' */ REF (form_string), /* for 's', 'S' */ REF (form_pointer), /* for 'p' */ REF (form_number), /* for 'n' */ REF (form_strerror), /* for 'm' */ REF (form_wcharacter), /* for 'C' */ REF (form_floathex), /* for 'A', 'a' */ REF (form_unknown), /* for 't' */ REF (form_unknown), /* for 'j' */ REF (form_unknown), /* for 'I' */ REF (form_object) /* for '@' */ }; int is_negative; union { unsigned long long int longlong; unsigned long int word; } number; int base; unichar *string; /* Pointer to argument string. */ /* Fill variables from values in struct. */ int alt = specs[nspecs_done].info.alt; int space = specs[nspecs_done].info.space; int left = specs[nspecs_done].info.left; int showsign = specs[nspecs_done].info.showsign; int group = specs[nspecs_done].info.group; #if defined(LLONG_MAX) && (LONG_MAX != LLONG_MAX) int is_long_double = specs[nspecs_done].info.is_long_double; #endif int is_short = specs[nspecs_done].info.is_short; int is_char = specs[nspecs_done].info.is_char; int is_long = specs[nspecs_done].info.is_long; int width = specs[nspecs_done].info.width; int prec = specs[nspecs_done].info.prec; int use_outdigits = specs[nspecs_done].info.i18n; char pad = specs[nspecs_done].info.pad; unichar spec = specs[nspecs_done].info.spec; /* Fill in last information. */ if (specs[nspecs_done].width_arg != -1) { /* Extract the field width from an argument. */ specs[nspecs_done].info.width = args_value[specs[nspecs_done].width_arg].pa_int; if (specs[nspecs_done].info.width < 0) /* If the width value is negative left justification is selected and the value is taken as being positive. */ { specs[nspecs_done].info.width *= -1; left = specs[nspecs_done].info.left = 1; } width = specs[nspecs_done].info.width; } if (specs[nspecs_done].prec_arg != -1) { /* Extract the precision from an argument. */ specs[nspecs_done].info.prec = args_value[specs[nspecs_done].prec_arg].pa_int; if (specs[nspecs_done].info.prec < 0) /* If the precision is negative the precision is omitted. */ specs[nspecs_done].info.prec = -1; prec = specs[nspecs_done].info.prec; } /* Maybe the buffer is too small. */ if ((unsigned)(MAX (prec, width) + 32) > sizeof (work_buffer) / sizeof (unichar)) { size_t want = ((MAX (prec, width) + 32) * sizeof (unichar)) + (MAX (prec, width) + 32); if (want > 168384) { workend = (unichar *)malloc(want); workend_malloced = 1; } else { workend = (unichar *)alloca(want); } } /* Process format specifiers. */ while (1) { int string_malloced; do { void *ptr; ptr = NOT_IN_JUMP_RANGE (spec) ? (void*)REF (form_unknown) : (void*)step4_jumps[CHAR_CLASS (spec)]; goto *ptr; } while (0); /* Start real work. We know about all flags and modifiers and now process the wanted format specifier. */ LABEL (form_percent): /* Write a literal "%". */ outchar ('%'); break; LABEL (form_integer): /* Signed decimal integer. */ base = 10; if (is_longlong) { long long int signed_number; signed_number = args_value[specs[nspecs_done].data_arg].pa_long_long_int; is_negative = signed_number < 0; number.longlong = is_negative ? (- signed_number) : signed_number; goto LABEL (longlong_number); } else { long int signed_number; if (is_char) { signed_number = args_value[specs[nspecs_done].data_arg].pa_char; } else if (is_short) { signed_number = args_value[specs[nspecs_done].data_arg].pa_short_int; } else if (is_long_num) { signed_number = args_value[specs[nspecs_done].data_arg].pa_long_int; } else { signed_number = args_value[specs[nspecs_done].data_arg].pa_int; } is_negative = signed_number < 0; number.word = is_negative ? (- signed_number) : signed_number; goto LABEL (number); } /* NOTREACHED */ LABEL (form_unsigned): /* Unsigned decimal integer. */ base = 10; goto LABEL (unsigned_number); /* NOTREACHED */ LABEL (form_octal): /* Unsigned octal integer. */ base = 8; goto LABEL (unsigned_number); /* NOTREACHED */ LABEL (form_hexa): /* Unsigned hexadecimal integer. */ base = 16; LABEL (unsigned_number): /* Unsigned number of base BASE. */ /* ISO specifies the `+' and ` ' flags only for signed conversions. */ is_negative = 0; showsign = 0; space = 0; if (is_longlong) { number.longlong = args_value[specs[nspecs_done].data_arg].pa_u_long_long_int; LABEL (longlong_number): if (prec < 0) /* Supply a default precision if none was given. */ prec = 1; else /* We have to take care for the '0' flag. If a precision is given it must be ignored. */ pad = ' '; /* If the precision is 0 and the number is 0 nothing has to be written for the number, except for the 'o' format in alternate form. */ if (prec == 0 && number.longlong == 0) { string = workend; if (base == 8 && alt) *--string = '0'; } else { /* Put the number in WORK. */ string = _itowa (number.longlong, workend, base, spec == 'X'); if (group && grouping) string = group_number (string, workend, grouping, thousands_sep); if (use_outdigits && base == 10) string = _i18n_number_rewrite (string, workend, [locale objectForKey: NSDecimalDigits]); } /* Simplify further test for num != 0. */ number.word = number.longlong != 0; } else { if (is_long_num) number.word = args_value[specs[nspecs_done].data_arg].pa_u_long_int; else if (is_char) number.word = (unsigned char) args_value[specs[nspecs_done].data_arg].pa_char; else if (!is_short) number.word = args_value[specs[nspecs_done].data_arg].pa_u_int; else number.word = (unsigned short int) args_value[specs[nspecs_done].data_arg].pa_u_short_int; LABEL (number): if (prec < 0) /* Supply a default precision if none was given. */ prec = 1; else /* We have to take care for the '0' flag. If a precision is given it must be ignored. */ pad = ' '; /* If the precision is 0 and the number is 0 nothing has to be written for the number, except for the 'o' format in alternate form. */ if (prec == 0 && number.word == 0) { string = workend; if (base == 8 && alt) *--string = '0'; } else { /* Put the number in WORK. */ string = _itowa_word (number.word, workend, base, spec == 'X'); if (group && grouping) string = group_number (string, workend, grouping, thousands_sep); if (use_outdigits && base == 10) string = _i18n_number_rewrite (string, workend, [locale objectForKey: NSDecimalDigits]); } } if (prec <= workend - string && number.word != 0 && alt && base == 8) /* Add octal marker. */ *--string = '0'; prec = MAX (0, prec - (workend - string)); if (!left) { width -= workend - string + prec; if (number.word != 0 && alt && base == 16) /* Account for 0X hex marker. */ width -= 2; if (is_negative || showsign || space) --width; if (pad == ' ') { PAD (' '); width = 0; } if (is_negative) outchar ('-'); else if (showsign) outchar ('+'); else if (space) outchar (' '); if (number.word != 0 && alt && base == 16) { outchar ('0'); outchar (spec); } width += prec; PAD ('0'); outstring (string, workend - string); break; } else { if (is_negative) { outchar ('-'); --width; } else if (showsign) { outchar ('+'); --width; } else if (space) { outchar (' '); --width; } if (number.word != 0 && alt && base == 16) { outchar ('0'); outchar (spec); width -= 2; } width -= workend - string + prec; if (prec > 0) { int temp = width; width = prec; PAD ('0'); width = temp; } outstring (string, workend - string); PAD (' '); break; } LABEL (form_float): { /* Floating-point number. This is handled by the native sprintf. */ char buf1[32], *bp; char buf2[specs[nspecs_done].info.width +specs[nspecs_done].info.prec+32]; unichar work_buffer[MAX (specs[nspecs_done].info.width, specs[nspecs_done].info.spec) + 32]; unichar *const workend = &work_buffer[sizeof (work_buffer) / sizeof (unichar)]; register unichar *w; NSString *decimal_sep; decimal_sep = [locale objectForKey: NSDecimalSeparator]; if (decimal_sep == nil) decimal_sep = @"."; bp = buf1; *bp++ = '%'; if (specs[nspecs_done].info.alt) *bp++ = '#'; if (specs[nspecs_done].info.group) *bp++ = '\''; if (specs[nspecs_done].info.showsign) *bp++ = '+'; else if (specs[nspecs_done].info.space) *bp++ = ' '; if (specs[nspecs_done].info.left) *bp++ = '-'; if (specs[nspecs_done].info.pad == '0') *bp++ = '0'; if (specs[nspecs_done].info.i18n) *bp++ = 'I'; if (specs[nspecs_done].info.width != 0) { w = _itowa_word (specs[nspecs_done].info.width, workend, 10, 0); while (w < workend) *bp++ = *w++; } if (specs[nspecs_done].info.prec != -1) { *bp++ = '.'; w = _itowa_word (specs[nspecs_done].info.prec, workend, 10, 0); while (w < workend) *bp++ = *w++; } if (specs[nspecs_done].info.spec != '\0') *bp++ = specs[nspecs_done].info.spec; *bp = '\0'; if (specs[nspecs_done].info.is_long_double) { snprintf(buf2, sizeof(buf2), buf1, args_value[specs[nspecs_done].data_arg].pa_long_double); } else { snprintf(buf2, sizeof(buf2), buf1, args_value[specs[nspecs_done].data_arg].pa_double); } /* * FIXME - hack to rewrite decimal separator into correct locale * if necessary. */ if (decimal_sep != nil) { NSString *sep = locale_sep(); if ([decimal_sep isEqual: sep] == NO && [sep length] == 1) { unichar m = [sep characterAtIndex: 0]; char *p = &buf2[strlen(buf2)]; /* * Assume that we won't be finding an escape in the string * so we can use it as a marker. */ while (p-- > buf2) { if (*p == m) { *p = '\033'; break; } } } } bp = buf2; while (*bp) { if (*bp == '\033') { int i = 0; int c = [decimal_sep length]; unichar b[c]; [decimal_sep getCharacters: b]; while (i < c) { outchar(b[i++]); } bp++; } else { outchar(*bp++); } } } break; LABEL (form_floathex): { /* Floating point number printed as hexadecimal number. */ char buf1[32], *bp; char buf2[specs[nspecs_done].info.width +specs[nspecs_done].info.prec+32]; unichar work_buffer[MAX (specs[nspecs_done].info.width, specs[nspecs_done].info.spec) + 32]; unichar *const workend = &work_buffer[sizeof (work_buffer) / sizeof (unichar)]; register unichar *w; NSString *decimal_sep; decimal_sep = [locale objectForKey: NSDecimalSeparator]; if (decimal_sep == nil) decimal_sep = @"."; bp = buf1; *bp++ = '%'; if (specs[nspecs_done].info.alt) *bp++ = '#'; if (specs[nspecs_done].info.group) *bp++ = '\''; if (specs[nspecs_done].info.showsign) *bp++ = '+'; else if (specs[nspecs_done].info.space) *bp++ = ' '; if (specs[nspecs_done].info.left) *bp++ = '-'; if (specs[nspecs_done].info.pad == '0') *bp++ = '0'; if (specs[nspecs_done].info.i18n) *bp++ = 'I'; if (specs[nspecs_done].info.width != 0) { w = _itowa_word (specs[nspecs_done].info.width, workend, 10, 0); while (w < workend) *bp++ = *w++; } if (specs[nspecs_done].info.prec != -1) { *bp++ = '.'; w = _itowa_word (specs[nspecs_done].info.prec, workend, 10, 0); while (w < workend) *bp++ = *w++; } if (specs[nspecs_done].info.spec != '\0') *bp++ = specs[nspecs_done].info.spec; *bp = '\0'; if (specs[nspecs_done].info.is_long_double) { snprintf(buf2, sizeof(buf2), buf1, args_value[specs[nspecs_done].data_arg].pa_long_double); } else { snprintf(buf2, sizeof(buf2), buf1, args_value[specs[nspecs_done].data_arg].pa_double); } /* * FIXME - hack to rewrite decimal separator into correct locale * if necessary. */ if (decimal_sep != nil) { NSString *sep = locale_sep(); if ([decimal_sep isEqual: sep] == NO && [sep length] == 1) { unichar m = [sep characterAtIndex: 0]; char *p = &buf2[strlen(buf2)]; /* * Assume that we won't be finding an escape in the string * so we can use it as a marker. */ while (p-- > buf2) { if (*p == m) { *p = '\033'; break; } } } } bp = buf2; while (*bp) { if (*bp == '\033') { int i = 0; int c = [decimal_sep length]; unichar b[c]; [decimal_sep getCharacters: b]; while (i < c) { outchar(b[i++]); } bp++; } else { outchar(*bp++); } } } break; LABEL (form_pointer): /* Generic pointer. */ { const void *ptr; ptr = args_value[specs[nspecs_done].data_arg].pa_pointer; if (ptr != NULL) { /* If the pointer is not NULL, write it as a %#x spec. */ base = 16; number.word = (size_t) ptr; is_negative = 0; alt = 1; group = 0; spec = 'x'; goto LABEL (number); } else { string = NULL; goto LABEL (print_string); } } /* NOTREACHED */ LABEL (form_number): /* Answer the count of characters written. */ if (is_longlong) *(long long int *) args_value[specs[nspecs_done].data_arg].pa_pointer = done; else if (is_long_num) *(long int *) args_value[specs[nspecs_done].data_arg].pa_pointer = done; else if (is_long_num) *(long int *) args_value[specs[nspecs_done].data_arg].pa_pointer = done; else if (is_char) *(char *) args_value[specs[nspecs_done].data_arg].pa_pointer = done; else if (!is_short) *(int *) args_value[specs[nspecs_done].data_arg].pa_pointer = done; else *(short int *) args_value[specs[nspecs_done].data_arg].pa_pointer = done; break; LABEL (form_strerror): /* Print description of error ERRNO. */ errno = save_errno; string = (unichar *)(void*)[[[NSError _last] localizedDescription] cStringUsingEncoding: NSUnicodeStringEncoding]; is_long = 1; /* This is a unicode string. */ goto LABEL (print_string); LABEL (form_character): /* Character. */ if (is_long) goto LABEL (form_wcharacter); --width; /* Account for the character itself. */ if (!left) PAD (' '); outchar (((unsigned char) args_value[specs[nspecs_done].data_arg].pa_char)); if (left) PAD (' '); break; LABEL (form_wcharacter): { /* Wide character. */ --width; if (!left) PAD (' '); outchar (args_value[specs[nspecs_done].data_arg].pa_wchar); if (left) PAD (' '); } break; LABEL (form_string): { size_t len = 0; /* The string argument could in fact be `char *' or `wchar_t *'. But this should not make a difference here. */ string = (unichar *) args_value[specs[nspecs_done].data_arg].pa_wstring; /* Entry point for printing other strings. */ LABEL (print_string): string_malloced = 0; if (string == NULL) { /* Write "(null)" if there's space. */ if (prec == -1 || prec >= (int) (sizeof (null) / sizeof (null[0])) - 1) { string = (unichar *) null; len = (sizeof (null) / sizeof (null[0])) - 1; } else { static unichar empty = 0; string = ∅ len = 0; } } else if (!is_long && spec != 'S') { /* This is complicated. We have to transform the multibyte string into a unicode string. */ const char *str = (const char*)string; unsigned blen; static NSStringEncoding enc = GSUndefinedEncoding; static BOOL byteEncoding = NO; if (enc == GSUndefinedEncoding) { enc = [NSString defaultCStringEncoding]; byteEncoding = GSPrivateIsByteEncoding(enc); } if (-1 == prec) { len = strlen(str); // Number of bytes to convert. blen = len; // Size of unichar output buffer. } else { if (byteEncoding == YES) { /* Where the external encoding is one byte per character, * we know we don't need to convert more bytes than the * precision required for output. */ len = 0; while (len < prec && str[len] != 0) { len++; } blen = len; } else { /* FIXME ... it looks like modern standards mean that * the number of *bytes* in an input string may not * exceed the precision ... but that's unintuitive for * input strings with multibyte characters, so we need * to check and emulate OSX behavior. */ len = 0; while (len < prec && str[len] != 0) { len++; } blen = len; } } /* Allocate dynamically an array which definitely is long * enough for the unichar version. */ if (blen < 8192 || ((string = (unichar *) NSZoneMalloc(s->_zone, (blen + 1) * sizeof(unichar))) == NULL)) string = (unichar *) alloca((blen + 1) * sizeof(unichar)); else string_malloced = 1; GSToUnicode(&string, &blen, (unsigned char*)str, len, enc, 0, 0); /* get the number of unichars produced and truncate to the * required output precision if necessary. */ len = blen; if (prec != -1 && prec < len) { len = prec; } } else { /* This is simple. Wide string == unicode string. */ int prc; unichar *wsp; len = 0; prc = prec; wsp = (unichar *)string; while (prc-- && *wsp++) len++; } if ((width -= len) <= 0) { outstring (string, len); } else { if (!left) PAD (' '); outstring (string, len); if (left) PAD (' '); } if (string_malloced) NSZoneFree(s->_zone, string); } break; LABEL (form_object): { size_t len; id obj; NSString *dsc; obj = args_value[specs[nspecs_done].data_arg].pa_object; /* On OSX a nil object is reported as '(null)' so we do the same. */ if (!obj) dsc = @"(null)"; else if ([obj respondsToSelector: @selector(descriptionWithLocale:)]) dsc = [obj descriptionWithLocale: locale]; else dsc = [obj description]; if (!dsc) dsc = @"(null)"; len = [dsc length]; string_malloced = 0; { /* This is complicated. We have to transform the NSString into a unicode string. */ NSRange r; if (prec >= 0 && prec < (int)len) len = prec; /* Allocate dynamically an array which definitely is long enough for the wide character version. */ if (len < 8192 || ((string = (unichar *) NSZoneMalloc(s->_zone, len * sizeof (unichar))) == NULL)) string = (unichar *) alloca (len * sizeof (unichar)); else string_malloced = 1; r.location = 0; r.length = len; [dsc getCharacters: string range: r]; } if ((width -= len) < 0) { outstring (string, len); } else { if (!left) PAD (' '); outstring (string, len); if (left) PAD (' '); } if (string_malloced) NSZoneFree(s->_zone, string); } break; LABEL (form_unknown): { int function_done; unsigned int i; const void **ptr; ptr = alloca (specs[nspecs_done].ndata_args * sizeof (const void *)); /* Fill in an array of pointers to the argument values. */ for (i = 0; i < specs[nspecs_done].ndata_args; ++i) ptr[i] = &args_value[specs[nspecs_done].data_arg + i]; /* Call the function. */ function_done = printf_unknown(s, &specs[nspecs_done].info, ptr); /* If an error occurred we don't have information about # of chars. */ done += function_done; } break; } /* Write the following constant string. */ outstring (specs[nspecs_done].end_of_fmt, specs[nspecs_done].next_fmt - specs[nspecs_done].end_of_fmt); } } all_done: if (workend_malloced) free(workend); /* Unlock the stream. */ #ifdef __va_copy va_end(ap_save); #endif return; } /* Handle an unknown format specifier. This prints out a canonicalized representation of the format spec itself. */ static int printf_unknown (GSStr s, const struct printf_info *info, const void *const *args) { int done = 0; unichar work_buffer[MAX (info->width, info->spec) + 32]; unichar *const workend = &work_buffer[sizeof (work_buffer) / sizeof (unichar)]; register unichar *w; outchar ('%'); if (info->alt) outchar ('#'); if (info->group) outchar ('\''); if (info->showsign) outchar ('+'); else if (info->space) outchar (' '); if (info->left) outchar ('-'); if (info->pad == '0') outchar ('0'); if (info->i18n) outchar ('I'); if (info->width != 0) { w = _itowa_word (info->width, workend, 10, 0); while (w < workend) outchar (*w++); } if (info->prec != -1) { outchar ('.'); w = _itowa_word (info->prec, workend, 10, 0); while (w < workend) outchar (*w++); } if (info->spec != '\0') outchar (info->spec); return done; } /* Group the digits according to the grouping rules of the current locale. The interpretation of GROUPING is as in `struct lconv' from . */ static unichar * group_number (unichar *w, unichar *rear_ptr, const char *grouping, NSString *thousands_sep ) { int len; unichar *src, *s; /* We treat all negative values like CHAR_MAX. */ if (*grouping == CHAR_MAX || *grouping <= 0) /* No grouping should be done. */ return w; len = *grouping; /* Copy existing string so that nothing gets overwritten. */ src = (unichar *) alloca ((rear_ptr - w) * sizeof (unichar)); s = (unichar *) memcpy (src, w, (rear_ptr - w) * sizeof (unichar)); w = rear_ptr; /* Process all characters in the string. */ while (s > src) { *--w = *--s; if (--len == 0 && s > src) { /* A new group begins. */ *--w = [thousands_sep characterAtIndex: 0]; len = *grouping++; if (*grouping == '\0') /* The previous grouping repeats ad infinitum. */ --grouping; else if (*grouping == CHAR_MAX #if CHAR_MIN < 0 || *grouping < 0 #endif ) { /* No further grouping to be done. Copy the rest of the number. */ do { *--w = *--s; } while (s > src); break; } } } return w; } gnustep-base-1.29.0/Source/GSHTTPAuthentication.m000066400000000000000000000410041435650067400215400ustar00rootroot00000000000000/* Implementation for GSHTTPAuthentication for GNUstep Copyright (C) 2006 Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 2006 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #import "GSURLPrivate.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSScanner.h" #import "Foundation/NSSet.h" #import "Foundation/NSValue.h" #import "GNUstepBase/GSLock.h" #import "GNUstepBase/GSMime.h" #import "GNUstepBase/NSData+GNUstepBase.h" static NSMutableDictionary *domainMap = nil; static NSMutableSet *spaces = nil; static NSMutableDictionary *store = nil; static NSLock *storeLock = nil; static GSMimeParser *mimeParser = nil; @interface NSData(GSHTTPDigest) - (NSString*) digestHex; @end @implementation NSData(GSHTTPDigest) - (NSString*) digestHex { static const char *hexChars = "0123456789abcdef"; unsigned slen = [self length]; unsigned dlen = slen * 2; const unsigned char *src = (const unsigned char *)[self bytes]; char *dst; unsigned spos = 0; unsigned dpos = 0; NSData *data; NSString *string; dst = (char*)NSZoneMalloc(NSDefaultMallocZone(), dlen); while (spos < slen) { unsigned char c = src[spos++]; dst[dpos++] = hexChars[(c >> 4) & 0x0f]; dst[dpos++] = hexChars[c & 0x0f]; } data = [NSData allocWithZone: NSDefaultMallocZone()]; data = [data initWithBytesNoCopy: dst length: dlen]; string = [[NSString alloc] initWithData: data encoding: NSASCIIStringEncoding]; RELEASE(data); return AUTORELEASE(string); } @end @implementation GSHTTPAuthentication + (void) initialize { if (store == nil) { mimeParser = [GSMimeParser new]; [[NSObject leakAt: &mimeParser] release]; spaces = [NSMutableSet new]; [[NSObject leakAt: &spaces] release]; domainMap = [NSMutableDictionary new]; [[NSObject leakAt: &domainMap] release]; store = [NSMutableDictionary new]; [[NSObject leakAt: &store] release]; storeLock = [NSLock new]; [[NSObject leakAt: &storeLock] release]; } } + (GSHTTPAuthentication *) authenticationWithCredential: (NSURLCredential*)credential inProtectionSpace: (NSURLProtectionSpace*)space { NSMutableDictionary *cDict = nil; NSURLProtectionSpace *known = nil; GSHTTPAuthentication *authentication = nil; NSAssert([credential isKindOfClass: [NSURLCredential class]] == YES, NSInvalidArgumentException); NSAssert([space isKindOfClass: [NSURLProtectionSpace class]] == YES, NSInvalidArgumentException); [storeLock lock]; NS_DURING { /* * Keep track of known protection spaces so we don't make lots of * duplicate copies, but share one copy between authentication objects. */ known = [spaces member: space]; if (known == nil) { [spaces addObject: space]; known = [spaces member: space]; } space = known; cDict = [store objectForKey: space]; if (cDict == nil) { cDict = [NSMutableDictionary new]; [store setObject: cDict forKey: space]; RELEASE(cDict); } authentication = [cDict objectForKey: credential]; if (authentication == nil) { authentication = [[GSHTTPAuthentication alloc] initWithCredential: credential inProtectionSpace: space]; if (authentication != nil) { [cDict setObject: authentication forKey: [authentication credential]]; RELEASE(authentication); } } IF_NO_ARC([[authentication retain] autorelease];) } NS_HANDLER { [storeLock unlock]; [localException raise]; } NS_ENDHANDLER [storeLock unlock]; return authentication; } + (NSURLProtectionSpace*) protectionSpaceForAuthentication: (NSString*)auth requestURL: (NSURL*)URL; { if ([auth isKindOfClass: [NSString class]] == YES) { NSString *method = nil; NSURLProtectionSpace *space; NSScanner *sc; NSString *domain = nil; NSString *realm = nil; NSString *key; NSString *val; space = [self protectionSpaceForURL: URL]; sc = [NSScanner scannerWithString: auth]; key = [mimeParser scanName: sc]; if ([key caseInsensitiveCompare: @"Basic"] == NSOrderedSame) { method = NSURLAuthenticationMethodHTTPBasic; domain = [URL path]; } else if ([key caseInsensitiveCompare: @"Digest"] == NSOrderedSame) { method = NSURLAuthenticationMethodHTTPDigest; } else if ([key caseInsensitiveCompare: @"NTLM"] == NSOrderedSame) { method = NSURLAuthenticationMethodNTLM; } else if ([key caseInsensitiveCompare: @"Negotiate"] == NSOrderedSame) { method = NSURLAuthenticationMethodNegotiate; } else { return nil; // Unknown authentication } while ((key = [mimeParser scanName: sc]) != nil) { if ([sc scanString: @"=" intoString: 0] == NO) { return nil; // Bad name=value specification } if ((val = [mimeParser scanToken: sc]) == nil) { return nil; // Bad name=value specification } if ([key caseInsensitiveCompare: @"domain"] == NSOrderedSame) { domain = val; } else if ([key caseInsensitiveCompare: @"realm"] == NSOrderedSame) { realm = val; } if ([sc scanString: @"," intoString: 0] == NO) { break; // No more in list. } } if (realm == nil) { return nil; // No realm to authenticate in } /* * If the realm and authentication method match the space we * found for the URL, assume that it is unchanged. */ if ([[space realm] isEqualToString: realm] && [space authenticationMethod] == method) { return space; } space = [[NSURLProtectionSpace alloc] initWithHost: [URL host] port: [[URL port] intValue] protocol: [URL scheme] realm: realm authenticationMethod: method]; [self setProtectionSpace: space forDomains: [domain componentsSeparatedByString: @" "] baseURL: URL]; return AUTORELEASE(space); } return nil; } + (NSURLProtectionSpace *) protectionSpaceForURL: (NSURL*)URL { NSURLProtectionSpace *space = nil; NSString *scheme; NSNumber *port; NSString *server; scheme = [URL scheme]; port = [URL port]; if ([port intValue] == 80 && [scheme isEqualToString: @"http"]) { port = nil; } else if ([port intValue] == 443 && [scheme isEqualToString: @"https"]) { port = nil; } if ([port intValue] == 0) { server = [NSString stringWithFormat: @"%@://%@", scheme, [URL host]]; } else { server = [NSString stringWithFormat: @"%@://%@:%@", scheme, [URL host], port]; } [storeLock lock]; NS_DURING { NSString *found = nil; NSDictionary *sDict; NSArray *keys; unsigned count; NSString *path; sDict = [domainMap objectForKey: server]; keys = [sDict allKeys]; count = [keys count]; path = [URL path]; while (count-- > 0) { NSString *key = [keys objectAtIndex: count]; unsigned kl = [key length]; if (found == nil || kl > [found length]) { if (kl == 0 || [path hasPrefix: key] == YES) { found = key; } } } if (found != nil) { space = AUTORELEASE(RETAIN([sDict objectForKey: found])); } } NS_HANDLER { [storeLock unlock]; [localException raise]; } NS_ENDHANDLER [storeLock unlock]; return space; } + (void) setProtectionSpace: (NSURLProtectionSpace *)space forDomains: (NSArray*)domains baseURL: (NSURL*)base { /* * If there are no URIs specified, everything on the * host of the base URL is in the protection space */ if ([domains count] == 0) { domains = [NSArray arrayWithObject: @"/"]; } [storeLock lock]; NS_DURING { NSEnumerator *e = [domains objectEnumerator]; NSString *domain; while ((domain = [e nextObject]) != nil) { NSURL *u; NSString *path; NSNumber *port; NSString *scheme; NSString *server; NSMutableDictionary *sDict; u = [NSURL URLWithString: domain]; scheme = [u scheme]; if (scheme == nil) { u = [NSURL URLWithString: domain relativeToURL: base]; scheme = [u scheme]; } port = [u port]; if ([port intValue] == 80 && [scheme isEqualToString: @"http"]) { port = nil; } else if ([port intValue] == 443 && [scheme isEqualToString: @"https"]) { port = nil; } path = [u path]; if (path == nil) { path = @""; } if ([port intValue] == 0) { server = [NSString stringWithFormat: @"%@://%@", scheme, [u host]]; } else { server = [NSString stringWithFormat: @"%@://%@:%@", scheme, [u host], port]; } sDict = [domainMap objectForKey: server]; if (sDict == nil) { sDict = [NSMutableDictionary new]; [domainMap setObject: sDict forKey: server]; RELEASE(sDict); } [sDict setObject: space forKey: path]; } } NS_HANDLER { [storeLock unlock]; [localException raise]; } NS_ENDHANDLER [storeLock unlock]; } - (NSString*) authorizationForAuthentication: (NSString*)authentication method: (NSString*)method path: (NSString*)path { NSMutableString *authorisation; if ([self->_space authenticationMethod] == NSURLAuthenticationMethodHTTPDigest) { NSString *realm = nil; NSString *qop = nil; NSString *nonce = nil; NSString *opaque = nil; NSString *stale = @"FALSE"; NSString *algorithm = @"MD5"; NSString *cnonce; NSString *HA1; NSString *HA2; NSString *response; int nc; if (authentication != nil) { NSScanner *sc; NSString *key; NSString *val; sc = [NSScanner scannerWithString: authentication]; if ([sc scanString: @"Digest" intoString: 0] == NO) { NSDebugMLog(@"Bad format HTTP digest in '%@'", authentication); return nil; // Not a digest authentication } while ((key = [mimeParser scanName: sc]) != nil) { if ([sc scanString: @"=" intoString: 0] == NO) { NSDebugMLog(@"Missing '=' in HTTP digest '%@'", authentication); return nil; // Bad name=value specification } if ((val = [mimeParser scanToken: sc]) == nil) { NSDebugMLog(@"Missing value in HTTP digest '%@'", authentication); return nil; // Bad name=value specification } if ([key caseInsensitiveCompare: @"realm"] == NSOrderedSame) { realm = val; } if ([key caseInsensitiveCompare: @"qop"] == NSOrderedSame) { qop = val; } if ([key caseInsensitiveCompare: @"nonce"] == NSOrderedSame) { nonce = val; } if ([key caseInsensitiveCompare: @"opaque"] == NSOrderedSame) { opaque = val; } if ([key caseInsensitiveCompare: @"stale"] == NSOrderedSame) { stale = val; } if ([key caseInsensitiveCompare: @"algorithm"] == NSOrderedSame) { algorithm = val; } if ([sc scanString: @"," intoString: 0] == NO) { break; // No more in list. } } if (realm == nil) { NSDebugMLog(@"Missing HTTP digest realm in '%@'", authentication); return nil; } if ([realm isEqualToString: [self->_space realm]] == NO) { NSDebugMLog(@"Bad HTTP digest realm in '%@'", authentication); return nil; } if (nonce == nil) { NSDebugMLog(@"Missing HTTP digest nonce in '%@'", authentication); return nil; } if ([algorithm isEqualToString: @"MD5"] == NO) { NSDebugMLog(@"Unsupported HTTP digest algorithm in '%@'", authentication); return nil; } if (![[qop componentsSeparatedByString: @","] containsObject: @"auth"]) { NSDebugMLog(@"Unsupported/missing HTTP digest qop in '%@'", authentication); return nil; } [self->_lock lock]; if ([stale boolValue] == YES || [nonce isEqualToString: _nonce] == NO) { _nc = 1; } ASSIGN(_nonce, nonce); ASSIGN(_qop, qop); ASSIGN(_opaque, opaque); } else { [self->_lock lock]; nonce = _nonce; opaque = _opaque; realm = [self->_space realm]; } nc = _nc++; qop = @"auth"; cnonce = [[[[[NSProcessInfo processInfo] globallyUniqueString] dataUsingEncoding: NSUTF8StringEncoding] md5Digest] digestHex]; HA1 = [[[[NSString stringWithFormat: @"%@:%@:%@", [self->_credential user], realm, [self->_credential password]] dataUsingEncoding: NSUTF8StringEncoding] md5Digest] digestHex]; HA2 = [[[[NSString stringWithFormat: @"%@:%@", method, path] dataUsingEncoding: NSUTF8StringEncoding] md5Digest] digestHex]; response = [[[[NSString stringWithFormat: @"%@:%@:%08x:%@:%@:%@", HA1, nonce, nc, cnonce, qop, HA2] dataUsingEncoding: NSUTF8StringEncoding] md5Digest] digestHex]; authorisation = [NSMutableString stringWithCapacity: 512]; [authorisation appendFormat: @"Digest realm=\"%@\"", realm]; [authorisation appendFormat: @",username=\"%@\"", [self->_credential user]]; [authorisation appendFormat: @",nonce=\"%@\"", nonce]; [authorisation appendFormat: @",uri=\"%@\"", path]; [authorisation appendFormat: @",response=\"%@\"", response]; [authorisation appendFormat: @",qop=\"%@\"", qop]; [authorisation appendFormat: @",nc=%08x", nc]; [authorisation appendFormat: @",cnonce=\"%@\"", cnonce]; if (opaque != nil) { [authorisation appendFormat: @",opaque=\"%@\"", opaque]; } [self->_lock unlock]; } else if ([self->_space authenticationMethod] == NSURLAuthenticationMethodHTMLForm) { // This should not generate any authentication header. return nil; } else if ([self->_space authenticationMethod] == NSURLAuthenticationMethodNTLM) { // FIXME: this needs to be implemented return nil; } else if ([self->_space authenticationMethod] == NSURLAuthenticationMethodNegotiate) { // FIXME: this needs to be implemented return nil; } else if ([self->_space authenticationMethod] == NSURLAuthenticationMethodDefault || [self->_space authenticationMethod] == NSURLAuthenticationMethodHTTPBasic) { NSString *toEncode; if (authentication != nil) { NSScanner *sc; sc = [NSScanner scannerWithString: authentication]; if ([sc scanString: @"Basic" intoString: 0] == NO) { NSDebugMLog(@"Bad format HTTP basic in '%@'", authentication); return nil; // Not a basic authentication } } authorisation = [NSMutableString stringWithCapacity: 64]; if ([[self->_credential password] length] > 0) { toEncode = [NSString stringWithFormat: @"%@:%@", [self->_credential user], [self->_credential password]]; } else { toEncode = [NSString stringWithFormat: @"%@", [self->_credential user]]; } [authorisation appendFormat: @"Basic %@", [GSMimeDocument encodeBase64String: toEncode]]; } else { // FIXME: Currently, ClientCertificate and ServerTrust authentication // methods are NOT implemented and will end up here. They should, in fact, // be handled in the SSL connection layer (in GSHTTPURLHandle) rather than // in this method. return nil; } return authorisation; } - (NSURLCredential *) credential { return self->_credential; } - (void) dealloc { RELEASE(_credential); RELEASE(_space); RELEASE(_nonce); RELEASE(_opaque); RELEASE(_qop); RELEASE(_lock); [super dealloc]; } - (id) initWithCredential: (NSURLCredential*)credential inProtectionSpace: (NSURLProtectionSpace*)space { if ((self = [super init]) != nil) { self->_lock = [NSLock new]; ASSIGN(self->_space, space); ASSIGN(self->_credential, credential); } return self; } - (NSURLProtectionSpace *) space { return self->_space; } @end gnustep-base-1.29.0/Source/GSHTTPURLHandle.m000066400000000000000000001501751435650067400203510ustar00rootroot00000000000000/** GSHTTPURLHandle.m - Class GSHTTPURLHandle Copyright (C) 2000 Free Software Foundation, Inc. Written by: Mark Allison Integrated by: Richard Frith-Macdonald Date: November 2000 This file is part of the GNUstep Library. 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 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 USA. */ #import "common.h" #import "Foundation/NSArray.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSByteOrder.h" #import "Foundation/NSData.h" #import "Foundation/NSException.h" #import "Foundation/NSFileHandle.h" #import "Foundation/NSHost.h" #import "Foundation/NSLock.h" #import "Foundation/NSMapTable.h" #import "Foundation/NSNotification.h" #import "Foundation/NSPathUtilities.h" #import "Foundation/NSProcessInfo.h" #import "Foundation/NSRunLoop.h" #import "Foundation/NSURL.h" #import "Foundation/NSURLHandle.h" #import "Foundation/NSValue.h" #import "GNUstepBase/GSMime.h" #import "GNUstepBase/GSLock.h" #import "GNUstepBase/GSTLS.h" #import "GNUstepBase/NSData+GNUstepBase.h" #import "GNUstepBase/NSString+GNUstepBase.h" #import "GNUstepBase/NSURL+GNUstepBase.h" #import "NSCallBacks.h" #import "GSURLPrivate.h" #import "GSPrivate.h" #ifdef HAVE_SYS_FILE_H # include #endif #if defined(HAVE_SYS_FCNTL_H) # include #elif defined(HAVE_FCNTL_H) # include #endif #ifdef HAVE_SYS_SOCKET_H # include // For MSG_PEEK, etc #endif @interface GSMimeHeader (HTTPRequest) - (void) addToBuffer: (NSMutableData*)buf masking: (NSMutableData**)masked; @end /* * Implement map keys for strings with case insensitive comparisons, * so we can have case insensitive matching of http headers (correct * behavior), but actually preserve case of headers stored and written * in case the remote server is buggy and requires particular * captialisation of headers (some http software is faulty like that). */ static NSUInteger _id_hash(void *table, NSString* o) { return [[o uppercaseString] hash]; } static BOOL _id_is_equal(void *table, NSString *o, NSString *p) { return ([o caseInsensitiveCompare: p] == NSOrderedSame) ? YES : NO; } typedef NSUInteger (*NSMT_hash_func_t)(NSMapTable *, const void *); typedef BOOL (*NSMT_is_equal_func_t)(NSMapTable *, const void *, const void *); typedef void (*NSMT_retain_func_t)(NSMapTable *, const void *); typedef void (*NSMT_release_func_t)(NSMapTable *, void *); typedef NSString *(*NSMT_describe_func_t)(NSMapTable *, const void *); static const NSMapTableKeyCallBacks writeKeyCallBacks = { (NSMT_hash_func_t) _id_hash, (NSMT_is_equal_func_t) _id_is_equal, (NSMT_retain_func_t) _NS_id_retain, (NSMT_release_func_t) _NS_id_release, (NSMT_describe_func_t) _NS_id_describe, NSNotAPointerMapKey }; static NSString *httpVersion = @"1.1"; @interface GSHTTPURLHandle : NSURLHandle { BOOL tunnel; BOOL debug; BOOL keepalive; BOOL returnAll; BOOL inResponse; id ioDelegate; unsigned char challenged; NSFileHandle *sock; NSTimeInterval cacheAge; NSString *urlKey; NSURL *url; NSURL *u; NSURL *proxyURL; NSMutableData *dat; GSMimeParser *parser; GSMimeDocument *document; NSMutableDictionary *pageInfo; NSMapTable *wProperties; NSData *wData; NSMutableDictionary *request; unsigned int bodyPos; unsigned int redirects; enum { idle, connecting, writing, reading, } connectionState; @public NSString *in; NSString *out; } + (void) setMaxCached: (NSUInteger)limit; - (void) _tryLoadInBackground: (NSURL*)fromURL; - (id) setDebugLogDelegate: (id)d; @end /** *

* This is a PRIVATE subclass of NSURLHandle. * It is documented here in order to give you information about the * default behavior of an NSURLHandle created to deal with a URL * that has either the http or https scheme. * The name and/or other implementation details of this class * may be changed at any time. *

*

* A GSHTTPURLHandle instance is used to manage connections to * http and https URLs. * Secure connections are handled automatically * (using openSSL) for URLs with the scheme https. * Connection via proxy server is supported, as is proxy tunneling * for secure connections. Basic parsing of http * headers is performed to extract http status * information, cookies etc. Cookies are * retained and automatically sent during subsequent requests where * the cookie is valid. *

*

* Header information from the current page may be obtained using * -propertyForKey and -propertyForKeyIfAvailable. HTTP * status information can be retrieved as by calling either of these * methods specifying one of the following keys: *

* * * NSHTTPPropertyStatusCodeKey - numeric status code * * * NSHTTPPropertyStatusReasonKey - text describing status * * * NSHTTPPropertyServerHTTPVersionKey - http * version supported by remote server * * *

* According to MacOS-X headers, the following should also * be supported, but currently are not: *

* * NSHTTPPropertyRedirectionHeadersKey * NSHTTPPropertyErrorPageDataKey * *

* The omission of these headers is not viewed as important at * present, since the MacOS-X public beta implementation doesn't * work either. *

*

* Other calls to -propertyForKey and -propertyForKeyIfAvailable may * be made specifying a http header field name. * For example specifying a key name of "Content-Length" * would return the value of the "Content-Length" header * field. *

*

* [GSHTTPURLHandle-writeProperty:forKey:] * can be used to specify the parameters * for the http request. The default request uses the * "GET" method when fetching a page, and the * "POST" method when using -writeData:. * This can be over-ridden by calling -writeProperty:forKey: with * the key name "GSHTTPPropertyMethodKey" and specifying an * alternative method (i.e "PUT"). *

*

* A Proxy may be specified by calling -writeProperty:forKey: to set a * URL as the value for either https_proxy or http_proxy.
* For backward compatibility a proxy may also be specified by calling * -writeProperty:forKey: * with the keys "GSHTTPPropertyProxyHostKey" and * "GSHTTPPropertyProxyPortKey" to set the host and port * of the proxy server respectively.
* The proxy property can specify either the IP address or the hostname of * the proxy server. If an attempt is made to load a page via a * secure connection when a proxy is specified, GSHTTPURLHandle will * attempt to open an SSL Tunnel through the proxy. *

*

* Requests to the remote server may be forced to be bound to a * particular local IP address by using the key * "GSHTTPPropertyLocalHostKey" which must contain the * IP address of a network interface on the local host. *

*/ @implementation GSHTTPURLHandle static NSMutableDictionary *urlCache = nil; static NSMutableArray *urlOrder = nil; static NSLock *urlLock = nil; static NSUInteger maxCached = 16; static Class sslClass = 0; static void debugRead(GSHTTPURLHandle *handle, NSData *data) { int len = (int)[data length]; const uint8_t *ptr = (const uint8_t*)[data bytes]; uint8_t *hex; NSUInteger hl; int pos; hl = ((len + 2) / 3) * 4; hex = malloc(hl + 1); hex[hl] = '\0'; GSPrivateEncodeBase64(ptr, (NSUInteger)len, hex); for (pos = 0; pos < len; pos++) { if (0 == ptr[pos]) { char *esc = [data escapedRepresentation: 0]; NSLog(@"Read for %p %@ of %d bytes (escaped) - '%s'\n<[%s]>", handle, handle->in, len, esc, hex); free(esc); free(hex); return; } } NSLog(@"Read for %p %@ of %d bytes - '%*.*s'\n<[%s]>", handle, handle->in, len, len, len, ptr, hex); free(hex); } static void debugWrite(GSHTTPURLHandle *handle, NSData *data) { int len = (int)[data length]; const uint8_t *ptr = (const uint8_t*)[data bytes]; uint8_t *hex; NSUInteger hl; int pos; hl = ((len + 2) / 3) * 4; hex = malloc(hl + 1); hex[hl] = '\0'; GSPrivateEncodeBase64(ptr, (NSUInteger)len, hex); for (pos = 0; pos < len; pos++) { if (0 == ptr[pos]) { char *esc = [data escapedRepresentation: 0]; NSLog(@"Write for %p %@ of %d bytes (escaped) - '%s'\n<[%s]>", handle, handle->out, len, esc, hex); free(esc); free(hex); return; } } NSLog(@"Write for %p %@ of %d bytes - '%*.*s'\n<[%s]>", handle, handle->out, len, len, len, ptr, hex); free(hex); } + (NSURLHandle*) cachedHandleForURL: (NSURL*)newUrl { NSURLHandle *obj = nil; NSString *s = [newUrl scheme]; if ([s caseInsensitiveCompare: @"http"] == NSOrderedSame || [s caseInsensitiveCompare: @"https"] == NSOrderedSame) { NSString *k = [newUrl cacheKey]; //NSLog(@"Lookup for handle for '%@'", newUrl); [urlLock lock]; obj = RETAIN([urlCache objectForKey: k]); if (obj != nil) { ASSIGN(((GSHTTPURLHandle*)obj)->url, newUrl); [urlOrder removeObjectIdenticalTo: obj]; [urlOrder addObject: obj]; } [urlLock unlock]; //NSLog(@"Found handle %@", obj); } return AUTORELEASE(obj); } + (void) initialize { if (self == [GSHTTPURLHandle class]) { urlCache = [NSMutableDictionary new]; [[NSObject leakAt: &urlCache] release]; urlOrder = [NSMutableArray new]; [[NSObject leakAt: &urlOrder] release]; urlLock = [NSLock new]; [[NSObject leakAt: &urlLock] release]; sslClass = [NSFileHandle sslClass]; } } + (void) setMaxCached: (NSUInteger)limit { maxCached = limit; } - (void) _disconnect { if (sock) { NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; [nc removeObserver: self name: nil object: sock]; [sock closeFile]; DESTROY(sock); } DESTROY(in); DESTROY(out); connectionState = idle; } - (void) dealloc { [self _disconnect]; DESTROY(out); DESTROY(in); DESTROY(u); DESTROY(urlKey); DESTROY(url); DESTROY(proxyURL); DESTROY(dat); DESTROY(parser); DESTROY(document); DESTROY(pageInfo); DESTROY(wData); if (wProperties != 0) { NSFreeMapTable(wProperties); } DESTROY(request); [super dealloc]; } - (id) initWithURL: (NSURL*)newUrl cached: (BOOL)cached { if ((self = [super initWithURL: newUrl cached: cached]) != nil) { debug = GSDebugSet(@"NSURLHandle"); dat = [NSMutableData new]; pageInfo = [NSMutableDictionary new]; wProperties = NSCreateMapTable(writeKeyCallBacks, NSObjectMapValueCallBacks, 8); request = [NSMutableDictionary new]; ASSIGN(url, newUrl); ASSIGN(urlKey, [newUrl cacheKey]); connectionState = idle; if (cached == YES) { GSHTTPURLHandle *obj; [urlLock lock]; obj = [urlCache objectForKey: urlKey]; [urlCache setObject: self forKey: urlKey]; if (obj != nil) { [urlOrder removeObjectIdenticalTo: obj]; } [urlOrder addObject: self]; while ([urlOrder count] > maxCached) { obj = [urlOrder objectAtIndex: 0]; obj->cacheAge = 0.0; // Not to be re-cached [urlCache removeObjectForKey: obj->urlKey]; [urlOrder removeObjectAtIndex: 0]; } [urlLock unlock]; //NSLog(@"Cache handle %p for '%@'", self, newUrl); } } return self; } + (BOOL) canInitWithURL: (NSURL*)newUrl { NSString *scheme = [newUrl scheme]; if ([scheme isEqualToString: @"http"] || [scheme isEqualToString: @"https"]) { return YES; } return NO; } - (void) bgdApply: (NSString*)basic { NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; NSMutableString *s; NSString *key; NSString *val; NSMutableData *buf; NSMutableData *masked = nil; NSString *version; NSMapEnumerator enumerator; RETAIN(self); if (debug) { NSLog(@"%@ %p %@ %s", NSStringFromSelector(_cmd), self, out, (keepalive ? "re-used connection" : "initial connection")); } s = [basic mutableCopy]; if ([[u query] length] > 0) { [s appendFormat: @"?%@", [u query]]; } version = [request objectForKey: NSHTTPPropertyServerHTTPVersionKey]; if (version == nil) { version = httpVersion; } [s appendFormat: @" HTTP/%@\r\n", version]; if ((id)NSMapGet(wProperties, (void*)@"Host") == nil) { NSString *s = [u scheme]; id p = [u port]; id h = [u host]; if (h == nil) { h = @""; // Must use an empty host header } if (([s isEqualToString: @"http"] && [p intValue] == 80) || ([s isEqualToString: @"https"] && [p intValue] == 443)) { /* Some buggy systems object to the port being in the Host * header when it's the default (optional) value. To keep * them happy let's omit it in those cases. */ p = nil; } if (nil == p) { NSMapInsert(wProperties, (void*)@"Host", (void*)h); } else { NSMapInsert(wProperties, (void*)@"Host", (void*)[NSString stringWithFormat: @"%@:%@", h, p]); } } /* Ensure we set the correct content length (may be zero) */ if ((id)NSMapGet(wProperties, (void*)@"Content-Length") == nil) { NSMapInsert(wProperties, (void*)@"Content-Length", (void*)[NSString stringWithFormat: @"%"PRIuPTR, [wData length]]); } if ([wData length] > 0) { /* * Assume content type if not specified. */ if ((id)NSMapGet(wProperties, (void*)@"Content-Type") == nil) { NSMapInsert(wProperties, (void*)@"Content-Type", (void*)@"application/x-www-form-urlencoded"); } } if ((id)NSMapGet(wProperties, (void*)@"Authorization") == nil) { NSURLProtectionSpace *space; /* * If we have username/password stored in the URL, and there is a * known protection space for that URL, we generate an authentication * header. */ if ([u user] != nil && (space = [GSHTTPAuthentication protectionSpaceForURL: u]) != nil) { NSString *auth; GSHTTPAuthentication *authentication; NSURLCredential *cred; NSString *method; /* Create credential from user and password stored in the URL. * Returns nil if we have no username or password. */ cred = [[NSURLCredential alloc] initWithUser: [u user] password: [u password] persistence: NSURLCredentialPersistenceForSession]; if (cred == nil) { authentication = nil; } else { /* Create authentication from credential ... returns nil if * we have no credential. */ authentication = [GSHTTPAuthentication authenticationWithCredential: cred inProtectionSpace: space]; RELEASE(cred); } method = [request objectForKey: GSHTTPPropertyMethodKey]; if (method == nil) { if ([wData length] > 0) { method = @"POST"; } else { method = @"GET"; } } auth = [authentication authorizationForAuthentication: nil method: method path: [u fullPath]]; /* If authentication is nil then auth will also be nil */ if (auth != nil) { [self writeProperty: auth forKey: @"Authorization"]; } } } buf = [[s dataUsingEncoding: NSISOLatin1StringEncoding] mutableCopy]; enumerator = NSEnumerateMapTable(wProperties); while (NSNextMapEnumeratorPair(&enumerator, (void **)(&key), (void**)&val)) { GSMimeHeader *h; h = [[GSMimeHeader alloc] initWithName: key value: val parameters: nil]; if (debug || masked) { [h addToBuffer: buf masking: &masked]; } else { [h addToBuffer: buf masking: NULL]; } RELEASE(h); } NSEndMapTableEnumeration(&enumerator); [buf appendBytes: "\r\n" length: 2]; if (masked) { [masked appendBytes: "\r\n" length: 2]; } /* * Append any data to be sent */ if (wData != nil) { [buf appendData: wData]; if (masked) { [masked appendData: wData]; } } /* * Watch for write completion. */ [nc addObserver: self selector: @selector(bgdWrite:) name: GSFileHandleWriteCompletionNotification object: sock]; connectionState = writing; /* * Send request to server. */ if (debug) { if (nil == masked) { masked = buf; // Just log unmasked data } if (NO == [ioDelegate putBytes: [masked bytes] ofLength: [masked length] byHandle: self]) { debugWrite(self, masked); } } [sock writeInBackgroundAndNotify: buf]; RELEASE(buf); RELEASE(s); DESTROY(self); } - (void) bgdRead: (NSNotification*) not { NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; NSDictionary *dict = [not userInfo]; NSData *d; NSRange r; unsigned readCount; RETAIN(self); if (debug) NSLog(@"%@ %p %s", NSStringFromSelector(_cmd), self, keepalive?"K":""); d = [dict objectForKey: NSFileHandleNotificationDataItem]; readCount = [d length]; if (debug) { if (NO == [ioDelegate getBytes: [d bytes] ofLength: readCount byHandle: self]) { debugRead(self, d); } } if (connectionState == idle) { /* * We received an event on a handle which is not in use ... * it should just be the connection being closed by the other * end because of a timeout etc. */ if (debug) { NSUInteger length = [d length]; if (length > 0) { if (nil == ioDelegate) { NSLog(@"%@ %p %s Unexpected data (%*.*s) from remote!", NSStringFromSelector(_cmd), self, keepalive?"K":"", (int)[d length], (int)[d length], (char*)[d bytes]); } else { NSLog(@"%@ %p %s Unexpected data from remote!", NSStringFromSelector(_cmd), self, keepalive?"K":""); if (NO == [ioDelegate getBytes: [d bytes] ofLength: length byHandle: self]) { NSLog(@"%@ %p %s (%*.*s)", NSStringFromSelector(_cmd), self, keepalive?"K":"", (int)[d length], (int)[d length], (char*)[d bytes]); } } } } [self _disconnect]; } else if (0 == readCount && NO == inResponse && YES == keepalive) { /* On a keepalive connection where the remote end * dropped the connection without responding. We * should try again. */ if (connectionState != idle) { [self _disconnect]; if (debug) { NSLog(@"%@ %p restart on new connection", NSStringFromSelector(_cmd), self); } [self _tryLoadInBackground: u]; } } else if ([parser parse: d] == NO && [parser isComplete] == NO) { inResponse = YES; if (debug) { NSLog(@"HTTP parse failure - %@", parser); } [self endLoadInBackground]; [self backgroundLoadDidFailWithReason: @"Response parse failed"]; } else { BOOL complete; inResponse = YES; complete = [parser isComplete]; if (complete == NO && [parser isInHeaders] == NO) { GSMimeHeader *info; NSString *enc; NSString *len; int status; info = [document headerNamed: @"http"]; status = [[info objectForKey: NSHTTPPropertyStatusCodeKey] intValue]; len = [[document headerNamed: @"content-length"] value]; enc = [[document headerNamed: @"content-transfer-encoding"] value]; if (enc == nil) { enc = [[document headerNamed: @"transfer-encoding"] value]; } if (status == 204 || status == 304) { complete = YES; // No body expected. } else if ([enc isEqualToString: @"chunked"] == YES) { complete = NO; // Read chunked body data } else if (nil != len && [len intValue] == 0) { complete = YES; // content-length explicitly zero } if (complete == NO && [d length] == 0) { complete = YES; // Had EOF ... terminate } } if (complete == YES) { GSMimeHeader *info; NSString *val; NSNumber *num; float ver; int code; connectionState = idle; [nc removeObserver: self name: nil object: sock]; ver = [[[document headerNamed: @"http"] value] floatValue]; if (ver < 1.1) { [self _disconnect]; } else if (nil != (val = [[document headerNamed: @"connection"] value])) { val = [val lowercaseString]; if (YES == [val isEqualToString: @"close"]) { [self _disconnect]; } else if ([val length] > 5) { NSEnumerator *e; e = [[val componentsSeparatedByString: @","] objectEnumerator]; while (nil != (val = [e nextObject])) { val = [val stringByTrimmingSpaces]; if (YES == [val isEqualToString: @"close"]) { [self _disconnect]; break; } } } } /* * Retrieve essential keys from document */ info = [document headerNamed: @"http"]; num = [info objectForKey: NSHTTPPropertyStatusCodeKey]; code = [num intValue]; if (code == 401 && self->challenged < 2) { GSMimeHeader *ah; self->challenged++; // Prevent repeated challenge/auth if ((ah = [document headerNamed: @"WWW-Authenticate"]) != nil) { NSURLProtectionSpace *space; NSString *ac; GSHTTPAuthentication *authentication; NSString *method; NSString *auth; ac = [ah value]; space = [GSHTTPAuthentication protectionSpaceForAuthentication: ac requestURL: url]; if (space == nil) { authentication = nil; } else { NSURLCredential *cred; /* * Create credential from user and password * stored in the URL. * Returns nil if we have no username or password. */ cred = [[NSURLCredential alloc] initWithUser: [url user] password: [url password] persistence: NSURLCredentialPersistenceForSession]; if (cred == nil) { authentication = nil; } else { /* * Get the digest object and ask it for a header * to use for authorisation. * Returns nil if we have no credential. */ authentication = [GSHTTPAuthentication authenticationWithCredential: cred inProtectionSpace: space]; RELEASE(cred); } } method = [request objectForKey: GSHTTPPropertyMethodKey]; if (method == nil) { if ([wData length] > 0) { method = @"POST"; } else { method = @"GET"; } } auth = [authentication authorizationForAuthentication: ac method: method path: [url fullPath]]; if (auth != nil) { [self writeProperty: auth forKey: @"Authorization"]; [self _tryLoadInBackground: u]; RELEASE(self); return; // Retrying. } } } if (num != nil) { [pageInfo setObject: num forKey: NSHTTPPropertyStatusCodeKey]; } val = [info objectForKey: NSHTTPPropertyServerHTTPVersionKey]; if (val != nil) { [pageInfo setObject: val forKey: NSHTTPPropertyServerHTTPVersionKey]; } val = [info objectForKey: NSHTTPPropertyStatusReasonKey]; if (val != nil) { [pageInfo setObject: val forKey: NSHTTPPropertyStatusReasonKey]; } /* * Tell superclass that we have successfully loaded the data. */ d = [parser data]; r = NSMakeRange(bodyPos, [d length] - bodyPos); bodyPos = 0; DESTROY(wData); NSResetMapTable(wProperties); connectionState = idle; // Finished I/O if (returnAll || (code >= 200 && code < 300)) { [self didLoadBytes: [d subdataWithRange: r] loadComplete: YES]; } else { [self didLoadBytes: [d subdataWithRange: r] loadComplete: NO]; [self cancelLoadInBackground]; } } else { /* * Report partial data if possible. */ if ([parser isInBody]) { d = [parser data]; r = NSMakeRange(bodyPos, [d length] - bodyPos); bodyPos = [d length]; [self didLoadBytes: [d subdataWithRange: r] loadComplete: NO]; } } if (complete == NO && readCount == 0) { /* The read failed ... dropped, but parsing is not complete. * The request was sent, so we can't know whether it was * lost in the network or the remote end received it and * the response was lost. */ if (debug) { NSLog(@"HTTP response not received - %@", parser); } [self endLoadInBackground]; [self backgroundLoadDidFailWithReason: @"Response parse failed"]; } if (sock != nil && connectionState == reading) { if ([sock readInProgress] == NO) { [sock readInBackgroundAndNotify]; } } } DESTROY(self); } - (void) bgdTunnelRead: (NSNotification*) not { NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; NSDictionary *dict = [not userInfo]; NSData *d; GSMimeParser *p; unsigned readCount; RETAIN(self); if (debug) { NSLog(@"%@ %p %s", NSStringFromSelector(_cmd), self, keepalive?"K":""); } d = [dict objectForKey: NSFileHandleNotificationDataItem]; readCount = [d length]; if (debug) { if (NO == [ioDelegate getBytes: [d bytes] ofLength: [d length] byHandle: self]) { debugRead(self, d); } } if (readCount > 0) { inResponse = YES; [dat appendData: d]; } else if (NO == inResponse) { /* remote end dropped the connection without responding */ [self _disconnect]; if (debug) { NSLog(@"%@ %p restart on new connection", NSStringFromSelector(_cmd), self); } [self _tryLoadInBackground: u]; DESTROY(self); return; } p = [GSMimeParser new]; [p parse: dat]; if ([p isInBody] == YES || [d length] == 0) { GSMimeHeader *info; NSString *val; NSNumber *num; [p parse: nil]; info = [[p mimeDocument] headerNamed: @"http"]; val = [info objectForKey: NSHTTPPropertyServerHTTPVersionKey]; if (val != nil) [pageInfo setObject: val forKey: NSHTTPPropertyServerHTTPVersionKey]; num = [info objectForKey: NSHTTPPropertyStatusCodeKey]; if (num != nil) [pageInfo setObject: num forKey: NSHTTPPropertyStatusCodeKey]; val = [info objectForKey: NSHTTPPropertyStatusReasonKey]; if (val != nil) [pageInfo setObject: val forKey: NSHTTPPropertyStatusReasonKey]; [nc removeObserver: self name: NSFileHandleReadCompletionNotification object: sock]; [dat setLength: 0]; tunnel = NO; } else { if ([sock readInProgress] == NO) { [sock readInBackgroundAndNotify]; } } RELEASE(p); DESTROY(self); } - (void) loadInBackground { self->challenged = 0; [self _tryLoadInBackground: nil]; } - (void) endLoadInBackground { DESTROY(wData); NSResetMapTable(wProperties); [self _disconnect]; [super endLoadInBackground]; } - (void) _apply { NSString *method; NSString *path; NSString *s; /* * Set up request - differs for proxy version unless tunneling via ssl. */ path = [[[u fullPath] stringByTrimmingSpaces] stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]; if ([path length] == 0) { path = @"/"; } method = [request objectForKey: GSHTTPPropertyMethodKey]; if (method == nil) { if ([wData length] > 0) { method = @"POST"; } else { method = @"GET"; } } if (proxyURL && [[u scheme] isEqualToString: @"https"] == NO) { if ([u port] == nil) { s = [[NSString alloc] initWithFormat: @"%@ http://%@%@", method, [u host], path]; } else { s = [[NSString alloc] initWithFormat: @"%@ http://%@:%@%@", method, [u host], [u port], path]; } } else // no proxy { s = [[NSString alloc] initWithFormat: @"%@ %@", method, path]; } [self bgdApply: s]; RELEASE(s); } - (void) bgdConnect: (NSNotification*)notification { NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; NSDictionary *userInfo = [notification userInfo]; NSString *e; [nc removeObserver: self name: GSFileHandleConnectCompletionNotification object: sock]; /* * See if the connection attempt caused an error. */ e = [userInfo objectForKey: GSFileHandleNotificationError]; if (e != nil) { NSLog(@"Unable to connect to %@:%@ via socket ... %@", [sock socketAddress], [sock socketService], e); /* * Tell superclass that the load failed - let it do housekeeping. */ [self endLoadInBackground]; [self backgroundLoadDidFailWithReason: [NSString stringWithFormat: @"Failed to connect: %@", e]]; return; } in = [[NSString alloc] initWithFormat: @"(%@:%@ <-- %@:%@)", [sock socketLocalAddress], [sock socketLocalService], [sock socketAddress], [sock socketService]]; out = [[NSString alloc] initWithFormat: @"(%@:%@ --> %@:%@)", [sock socketLocalAddress], [sock socketLocalService], [sock socketAddress], [sock socketService]]; if (debug) { NSLog(@"%@ %p", NSStringFromSelector(_cmd), self); } /* * If SSL via proxy, set up tunnel first */ if (proxyURL && [[u scheme] isEqualToString: @"https"]) { NSRunLoop *loop = [NSRunLoop currentRunLoop]; NSString *cmd; NSTimeInterval last = 0.0; NSTimeInterval limit = 0.01; NSData *buf; NSDate *when; int status; NSString *version; version = [request objectForKey: NSHTTPPropertyServerHTTPVersionKey]; if (version == nil) { version = httpVersion; } if ([u port] == nil) { cmd = [NSString stringWithFormat: @"CONNECT %@:443 HTTP/%@\r\n\r\n", [u host], version]; } else { cmd = [NSString stringWithFormat: @"CONNECT %@:%@ HTTP/%@\r\n\r\n", [u host], [u port], version]; } /* * Set up default status for if connection is lost. */ [pageInfo setObject: @"1.0" forKey: NSHTTPPropertyServerHTTPVersionKey]; [pageInfo setObject: [NSNumber numberWithInt: 503] forKey: NSHTTPPropertyStatusCodeKey]; [pageInfo setObject: @"Connection dropped by proxy server" forKey: NSHTTPPropertyStatusReasonKey]; tunnel = YES; [nc addObserver: self selector: @selector(bgdWrite:) name: GSFileHandleWriteCompletionNotification object: sock]; buf = [cmd dataUsingEncoding: NSASCIIStringEncoding]; if (debug) { if (NO == [ioDelegate putBytes: [buf bytes] ofLength: [buf length] byHandle: self]) { debugWrite(self, buf); } } [sock writeInBackgroundAndNotify: buf]; when = [NSDate alloc]; while (tunnel == YES) { if (limit < 1.0) { NSTimeInterval tmp = limit; limit += last; last = tmp; } when = [when initWithTimeIntervalSinceNow: limit]; [loop runUntilDate: when]; } RELEASE(when); status = [[pageInfo objectForKey: NSHTTPPropertyStatusCodeKey] intValue]; if (status != 200) { [self endLoadInBackground]; [self backgroundLoadDidFailWithReason: @"Failed proxy tunneling"]; return; } } if ([[u scheme] isEqualToString: @"https"]) { static NSArray *keys = nil; NSMutableDictionary *opts; NSUInteger count; BOOL success = NO; /* If we are an https connection, negotiate secure connection. * Make sure we are not an observer of the file handle while * it is connecting... */ [nc removeObserver: self name: nil object: sock]; if (nil == keys) { keys = [[NSArray alloc] initWithObjects: GSTLSCAFile, GSTLSCertificateFile, GSTLSCertificateKeyFile, GSTLSCertificateKeyPassword, GSTLSDebug, GSTLSIssuers, GSTLSOwners, GSTLSPriority, GSTLSRemoteHosts, GSTLSRevokeFile, GSTLSServerName, GSTLSVerify, nil]; } count = [keys count]; opts = [[NSMutableDictionary alloc] initWithCapacity: count]; while (count-- > 0) { NSString *key = [keys objectAtIndex: count]; NSString *str = [request objectForKey: key]; if (nil != str) { [opts setObject: str forKey: key]; } } /* If there is no value set for the server name, and the host in the * URL is a domain name rather than an address, we use that. */ if (nil == [opts objectForKey: GSTLSServerName]) { NSString *host = [u host]; unichar c = [host length] == 0 ? 0 : [host characterAtIndex: 0]; if (c != 0 && c != ':' && !isdigit(c)) { [opts setObject: host forKey: GSTLSServerName]; } } if (debug) [opts setObject: @"YES" forKey: GSTLSDebug]; [sock sslSetOptions: opts]; RELEASE(opts); if ([sock sslHandshakeEstablished: &success outgoing: YES]) { if (NO == success) { if (debug) NSLog(@"%@ %p %s Failed to make ssl connect", NSStringFromSelector(_cmd), self, keepalive?"K":""); [self endLoadInBackground]; [self backgroundLoadDidFailWithReason: @"Failed to make ssl connect"]; return; } } else { [nc addObserver: self selector: @selector(bgdHandshake:) name: NSFileHandleDataAvailableNotification object: sock]; [sock waitForDataInBackgroundAndNotify]; return; } } [self _apply]; } - (void) bgdHandshake: (NSNotification*)notification { BOOL success = NO; if ([sock sslHandshakeEstablished: &success outgoing: YES]) { if (success) { NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; [nc removeObserver: self name: NSFileHandleDataAvailableNotification object: sock]; [self _apply]; } else { if (debug) NSLog(@"%@ %p %s Failed to make ssl connect", NSStringFromSelector(_cmd), self, keepalive?"K":""); [self endLoadInBackground]; [self backgroundLoadDidFailWithReason: @"Failed to make ssl connect"]; } } else { [sock waitForDataInBackgroundAndNotify]; } } - (void) bgdWrite: (NSNotification*)notification { NSNotificationCenter *nc; NSDictionary *userInfo = [notification userInfo]; NSString *e; RETAIN(self); if (debug) NSLog(@"%@ %p %s", NSStringFromSelector(_cmd), self, keepalive?"K":""); e = [userInfo objectForKey: GSFileHandleNotificationError]; if (e != nil) { tunnel = NO; if (keepalive == YES) { /* * The write failed ... connection dropped ... and we * are re-using an existing connection (keepalive = YES) * then we may try again with a new connection. */ [self _disconnect]; if (debug) { NSLog(@"%@ %p restart on new connection", NSStringFromSelector(_cmd), self); } [self _tryLoadInBackground: u]; RELEASE(self); return; } NSLog(@"Failed to write command to socket - %@ %p %s", e, self, keepalive?"K":""); /* * Tell superclass that the load failed - let it do housekeeping. */ [self endLoadInBackground]; [self backgroundLoadDidFailWithReason: [NSString stringWithFormat: @"Failed to write request: %@", e]]; DESTROY(self); return; } else { /* * Don't watch for write completions any more. */ nc = [NSNotificationCenter defaultCenter]; [nc removeObserver: self name: GSFileHandleWriteCompletionNotification object: sock]; /* * Ok - write completed, let's read the response. */ if (tunnel == YES) { [nc addObserver: self selector: @selector(bgdTunnelRead:) name: NSFileHandleReadCompletionNotification object: sock]; } else { bodyPos = 0; [nc addObserver: self selector: @selector(bgdRead:) name: NSFileHandleReadCompletionNotification object: sock]; } if ([sock readInProgress] == NO) { [sock readInBackgroundAndNotify]; } connectionState = reading; } DESTROY(self); } /** * If necessary, this method calls -loadInForeground to send a * request to the webserver, and get a page back. It then returns * the property for the specified key - * * * NSHTTPPropertyStatusCodeKey - numeric status code returned * by the last request. * * * NSHTTPPropertyStatusReasonKey - text describing status of * the last request * * * NSHTTPPropertyServerHTTPVersionKey - http * version supported by remote server * * * Other keys are taken to be the names of http * headers and the corresponding header value (or nil if there * is none) is returned. * * */ - (id) propertyForKey: (NSString*) propertyKey { if (document == nil) [self loadInForeground]; return [self propertyForKeyIfAvailable: propertyKey]; } - (id) propertyForKeyIfAvailable: (NSString*) propertyKey { id result = [pageInfo objectForKey: propertyKey]; if (result == nil) { NSString *key = [propertyKey lowercaseString]; NSArray *array = [document headersNamed: key]; if ([array count] == 0) { return nil; } else if ([array count] == 1) { GSMimeHeader *hdr = [array objectAtIndex: 0]; result = [hdr value]; } else { NSEnumerator *enumerator = [array objectEnumerator]; GSMimeHeader *val; result = [NSMutableArray arrayWithCapacity: [array count]]; while ((val = [enumerator nextObject]) != nil) { [result addObject: [val value]]; } } } return result; } - (int) setDebug: (int)flag { int old = debug; debug = flag ? YES : NO; return old; } - (id) setDebugLogDelegate: (id)d { id old = ioDelegate; NSAssert(nil == d || [d conformsToProtocol: @protocol(GSLogDelegate)], NSInvalidArgumentException); ioDelegate = d; return old; } - (void) setReturnAll: (BOOL)flag { returnAll = flag; } - (void) setURL: (NSURL*)newUrl { NSAssert(connectionState == idle, NSInternalInconsistencyException); NSAssert([newUrl isKindOfClass: [NSURL class]], NSInvalidArgumentException); if (NO == [newUrl isEqual: url]) { NSString *k = [newUrl cacheKey]; if (NO == [k isEqual: urlKey]) { /* Changing the URL of a handle to one that's not cache-compatible * implies that the handle must be removed from the cache and also * that the underlying network connection can no longer be used. */ [urlLock lock]; if (self == [urlCache objectForKey: urlKey]) { [urlCache removeObjectForKey: urlKey]; [urlOrder removeObjectIdenticalTo: self]; } [urlLock unlock]; [self _disconnect]; ASSIGN(urlKey, k); } ASSIGN(url, newUrl); } } - (void) _tryLoadInBackground: (NSURL*)fromURL { NSNotificationCenter *nc; NSString *host = nil; NSString *port = nil; NSString *s; /* * Don't start a load if one is in progress. */ if (connectionState != idle) { NSLog(@"Attempt to load an http handle which is not idle ... ignored"); return; } inResponse = NO; [dat setLength: 0]; RELEASE(document); RELEASE(parser); [pageInfo removeAllObjects]; parser = [GSMimeParser new]; document = RETAIN([parser mimeDocument]); /* * First time round, fromURL is nil, so we use the url ivar and * we notify that the load is begining. On retries we get a real * value in fromURL to use. */ if (fromURL == nil) { redirects = 0; ASSIGN(u, url); [self beginLoadInBackground]; } else { ASSIGN(u, fromURL); } host = [u host]; port = (id)[u port]; if (port != nil) { port = [NSString stringWithFormat: @"%u", [port intValue]]; } else { port = [u scheme]; } if ([port isEqualToString: @"https"]) { port = @"443"; } else if ([port isEqualToString: @"http"]) { port = @"80"; } /* An existing socket with keepalive may have been closed by the other * end. * On unix systems we can simply peek on the file descriptor for a much * more efficient check. * On windows we use the same system, it is noted to be inefficient but * we don't care because we peek rare enough at each HTTP request. */ if (sock != nil) { int fd = [sock fileDescriptor]; if (debug) { NSLog(@"%@ %p check for reusable socket", NSStringFromSelector(_cmd), self); } if (fd >= 0) { int result; unsigned char c; #if !defined(MSG_DONTWAIT) #define MSG_DONTWAIT 0 #endif result = recv(fd, (void *)&c, 1, MSG_PEEK | MSG_DONTWAIT); if (result == 0 || (result < 0 && errno != EAGAIN && errno != EINTR)) { DESTROY(sock); } } else { DESTROY(sock); } if (debug) { if (sock == nil) { NSLog(@"%@ %p socket closed by remote", NSStringFromSelector(_cmd), self); } else { NSLog(@"%@ %p socket is still open", NSStringFromSelector(_cmd), self); } } } if (sock == nil) { NSURLProtectionSpace *space; NSURL *proxy = nil; NSString *proxyStr = nil; keepalive = NO; // New connection /* * If we have a local address specified, * tell the file handle to bind to it. */ s = [request objectForKey: GSHTTPPropertyLocalHostKey]; if ([s length] > 0) { s = [NSString stringWithFormat: @"bind-%@", s]; } else { s = @"tcp"; // Bind to any. } space = [GSHTTPAuthentication protectionSpaceForURL: u]; if ([space isProxy]) { proxyStr = [NSString stringWithFormat: @"%@://%@:%u/", [u scheme], [space host], (unsigned)[space port]]; } else { NSString *ph; NSString *pp; ph = [request objectForKey: GSHTTPPropertyProxyHostKey]; pp = [request objectForKey: GSHTTPPropertyProxyPortKey]; if (ph) { if (pp) { proxyStr = [NSString stringWithFormat: @"%@://%@:%@/", [u scheme], ph, pp]; } else { proxyStr = [NSString stringWithFormat: @"%@://%@/", [u scheme], ph]; } } /* The preferred proxy specification is by a URL set as a property */ if ([[u scheme] isEqualToString: @"https"]) { proxy = [request objectForKey: @"https_proxy"]; } else { proxy = [request objectForKey: @"http_proxy"]; } } if ([proxy isKindOfClass: [NSString class]]) { proxyStr = (NSString*)proxy; proxy = nil; } /* A generic fallback for the entire process can come from * environment variables. */ if (nil == proxy && nil == proxyStr) { NSDictionary *env; NSString *key; env = [[NSProcessInfo processInfo] environment]; key = [[u scheme] stringByAppendingString: @"_proxy"]; if (nil == (proxyStr = [env objectForKey: key])) { proxyStr = [env objectForKey: [key uppercaseString]]; } } if (nil == proxy) { /* We make the proxy URL from a supplied string unless that is empty; * An empty string in the request can be used to disable the process * wide settings for that request.. */ if ([proxyStr length]) { proxy = [NSURL URLWithString: proxyStr]; } } /* Make sure the proxy URL has a port specified. The default port * depends on the scheme of the request (4430 for TLS, 8080 unencrypted). */ if (proxy && [[proxy port] intValue] == 0) { NSURLComponents *c; c = [NSURLComponents componentsWithURL: proxy resolvingAgainstBaseURL: NO]; if ([[u scheme] isEqualToString: @"https"]) { [c setPort: [NSNumber numberWithInteger: 4430]]; } else { [c setPort: [NSNumber numberWithInteger: 8080]]; } proxy = [c URL]; } ASSIGN(proxyURL, proxy); if (nil == proxyURL) { if ([[u scheme] isEqualToString: @"https"]) { NSString *cert; NSString *key; NSString *pwd; if (sslClass == 0) { [self backgroundLoadDidFailWithReason: @"https not supported" @" ... needs gnustep-base built with GNUTLS"]; return; } sock = [sslClass fileHandleAsClientInBackgroundAtAddress: host service: port protocol: s]; /* Map old SSL keys onto new. */ cert = [request objectForKey: GSHTTPPropertyCertificateFileKey]; if (nil != cert) { [request setObject: cert forKey: GSTLSCertificateFile]; } key = [request objectForKey: GSHTTPPropertyKeyFileKey]; if (nil != key) { [request setObject: key forKey: GSTLSCertificateKeyFile]; } pwd = [request objectForKey: GSHTTPPropertyPasswordKey]; if (nil != pwd) { [request setObject: pwd forKey: GSTLSCertificateKeyPassword]; } } else { sock = [NSFileHandle fileHandleAsClientInBackgroundAtAddress: host service: port protocol: s]; } } else { port = [[proxyURL port] description]; host = [proxyURL host]; if ([[u scheme] isEqualToString: @"https"]) { if (sslClass == 0) { [self backgroundLoadDidFailWithReason: @"https not supported" @" ... needs gnustep-base built with GNUTLS"]; return; } sock = [sslClass fileHandleAsClientInBackgroundAtAddress: host service: port protocol: s]; } else { sock = [NSFileHandle fileHandleAsClientInBackgroundAtAddress: host service: port protocol: s]; } } if (sock == nil) { /* * Tell superclass that the load failed - let it do housekeeping. */ [self backgroundLoadDidFailWithReason: [NSString stringWithFormat: @"Unable to connect to %@:%@ ... %@", host, port, [NSError _last]]]; return; } RETAIN(sock); nc = [NSNotificationCenter defaultCenter]; [nc addObserver: self selector: @selector(bgdConnect:) name: GSFileHandleConnectCompletionNotification object: sock]; connectionState = connecting; if (debug) { NSLog(@"%@ %p start connect to %@:%@", NSStringFromSelector(_cmd), self, host, port); } } else { NSString *method; NSString *path; NSString *basic; // Stop waiting for connection to be closed down. nc = [NSNotificationCenter defaultCenter]; [nc removeObserver: self name: NSFileHandleReadCompletionNotification object: sock]; /* Reusing a connection. Set flag to say that it has been kept * alive and we don't know if the other end has dropped it * until we write to it and read some response. */ keepalive = YES; method = [request objectForKey: GSHTTPPropertyMethodKey]; if (method == nil) { if ([wData length] > 0) { method = @"POST"; } else { method = @"GET"; } } path = [[[u fullPath] stringByTrimmingSpaces] stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]; if ([path length] == 0) { path = @"/"; } basic = [NSString stringWithFormat: @"%@ %@", method, path]; [self bgdApply: basic]; } } /** * Writes the specified data as the body of an http * or https request to the web server. * Returns YES on success, * NO on failure. By default, this method performs a POST operation. * On completion, the resource data for this handle is set to the * page returned by the request. */ - (BOOL) writeData: (NSData*)d { ASSIGN(wData, d); return YES; } /** * Sets a property to be used in the next request made by this handle. * The property is set as a header in the next request, unless it is * one of the following - * * * GSHTTPPropertyBodyKey - set an NSData item to be sent to * the server as the body of the request. * * * GSHTTPPropertyMethodKey - override the default method of * the request (eg. "PUT"). * * * GSHTTPPropertyProxyHostKey - specify the name or IP address * of a host to proxy through. Obsolete ... use * https_proxy or http_proxy to specify the URL of the proxy * * * GSHTTPPropertyProxyPortKey - specify the port number to * connect to on the proxy host. If not give, this defaults * to 8080 for http and 4430 for https. * Obsolete ... use https_proxy or http_proxy to specify the URL * of the proxy. * * * Any GSTLS... key to control TLS behavior * * * Any NSHTTPProperty... key * * */ - (BOOL) writeProperty: (id) property forKey: (NSString*) propertyKey { if (propertyKey == nil || [propertyKey isKindOfClass: [NSString class]] == NO) { [NSException raise: NSInvalidArgumentException format: @"%@ %p with invalid key", NSStringFromSelector(_cmd), self]; } if ([propertyKey hasPrefix: @"GSHTTPProperty"] || [propertyKey hasPrefix: @"GSTLS"] || [propertyKey hasPrefix: @"NSHTTPProperty"]) { if (property == nil) { [request removeObjectForKey: propertyKey]; } else { [request setObject: property forKey: propertyKey]; } } else { if (property == nil) { NSMapRemove(wProperties, (void*)propertyKey); } else { NSMapInsert(wProperties, (void*)propertyKey, (void*)property); } } return YES; } @end gnustep-base-1.29.0/Source/GSHTTPURLProtocol.h000066400000000000000000000002461435650067400207430ustar00rootroot00000000000000#ifndef INCLUDED_GSHTTPURLPROTOCOL_H #define INCLUDED_GSHTTPURLPROTOCOL_H #import "GSNativeProtocol.h" @interface GSHTTPURLProtocol : GSNativeProtocol @end #endif gnustep-base-1.29.0/Source/GSHTTPURLProtocol.m000066400000000000000000000741431435650067400207570ustar00rootroot00000000000000#import "GSURLPrivate.h" #import "GSHTTPURLProtocol.h" #import "GSTransferState.h" #import "GSURLSessionTaskBody.h" #import "GSTimeoutSource.h" #import "Foundation/FoundationErrors.h" #import "Foundation/NSCharacterSet.h" #import "Foundation/NSDateFormatter.h" #import "Foundation/NSError.h" #import "Foundation/NSOperation.h" #import "Foundation/NSSet.h" #import "Foundation/NSStream.h" #import "Foundation/NSURL.h" #import "Foundation/NSURLError.h" #import "Foundation/NSURLSession.h" #import "Foundation/NSValue.h" @interface NSURLSessionTask (Internal) - (void) setCountOfBytesExpectedToReceive: (int64_t)count; - (void) setCountOfBytesExpectedToSend: (int64_t)count; - (dispatch_queue_t) workQueue; @end @implementation NSURLSessionTask (Internal) - (void) setCountOfBytesExpectedToReceive: (int64_t)count { _countOfBytesExpectedToReceive = count; } - (void) setCountOfBytesExpectedToSend: (int64_t)count { _countOfBytesExpectedToSend = count; } - (GSURLSessionTaskBody*) knownBody { return _knownBody; } - (dispatch_queue_t) workQueue { return _workQueue; } @end @interface GSURLCacherHelper : NSObject + (BOOL) canCacheResponse: (NSCachedURLResponse*)response request: (NSURLRequest*)request; @end static NSDate* dateFromString(NSString *v) { // https://tools.ietf.org/html/rfc2616#section-3.3.1 NSDateFormatter *df; NSDate *d; df = AUTORELEASE([[NSDateFormatter alloc] init]); // RFC 822 [df setDateFormat: @"EEE, dd MMM yyyy HH:mm:ss zzz"]; d = [df dateFromString: v]; if (nil != d) { return d; } // RFC 850 [df setDateFormat: @"EEEE, dd-MMM-yy HH:mm:ss zzz"]; d = [df dateFromString: v]; if (nil != d) { return d; } // ANSI C's asctime() format [df setDateFormat: @"EEE MMM dd HH:mm:ss yy"]; d = [df dateFromString: v]; if (nil != d) { return d; } return nil; } static NSInteger parseArgumentPart(NSString *part, NSString *name) { NSString *prefix; prefix = [NSString stringWithFormat: @"%@=", name]; if ([part hasPrefix: prefix]) { NSArray *split; split = [part componentsSeparatedByString: @"="]; if (split && [split count] == 2) { NSString *argument = split[1]; if ([argument hasPrefix: @"\""] && [argument hasSuffix: @"\""]) { if ([argument length] >= 2) { NSRange range = NSMakeRange(1, [argument length] - 2); argument = [argument substringWithRange: range]; return [argument integerValue]; } else { return 0; } } else { return [argument integerValue]; } } } return 0; } @implementation GSURLCacherHelper + (BOOL) canCacheResponse: (NSCachedURLResponse*)response request: (NSURLRequest*)request { NSURLRequest *httpRequest = request; NSHTTPURLResponse *httpResponse = nil; NSDate *now; NSDate *expirationStart; NSString *dateString; NSDictionary *headers; BOOL hasCacheControl = NO; BOOL hasMaxAge = NO; NSString *cacheControl; NSString *pragma; NSString *expires; if (nil == httpRequest) { return NO; } if ([[response response] isKindOfClass: [NSHTTPURLResponse class]]) { httpResponse = (NSHTTPURLResponse*)[response response]; } if (nil == httpResponse) { return NO; } // HTTP status codes: https://tools.ietf.org/html/rfc7231#section-6.1 switch ([httpResponse statusCode]) { case 200: case 203: case 204: case 206: case 300: case 301: case 404: case 405: case 410: case 414: case 501: break; default: return NO; } headers = [httpResponse allHeaderFields]; // Vary: https://tools.ietf.org/html/rfc7231#section-7.1.4 if (nil != [headers objectForKey: @"Vary"]) { return NO; } now = [NSDate date]; dateString = [headers objectForKey: @"Date"]; if (nil != dateString) { expirationStart = dateFromString(dateString); } else { return NO; } // We opt not to cache any requests or responses that contain authorization headers. if ([headers objectForKey: @"WWW-Authenticate"] || [headers objectForKey: @"Proxy-Authenticate"] || [headers objectForKey: @"Authorization"] || [headers objectForKey: @"Proxy-Authorization"]) { return NO; } // HTTP Methods: https://tools.ietf.org/html/rfc7231#section-4.2.3 if ([[httpRequest HTTPMethod] isEqualToString: @"GET"]) { } else if ([[httpRequest HTTPMethod] isEqualToString: @"HEAD"]) { if ([response data] && [[response data] length] > 0) { return NO; } } else { return NO; } // Cache-Control: https://tools.ietf.org/html/rfc7234#section-5.2 cacheControl = [headers objectForKey: @"Cache-Control"]; if (nil != cacheControl) { NSInteger maxAge = 0; NSInteger sharedMaxAge = 0; BOOL noCache = NO; BOOL noStore = NO; [self getCacheControlDeirectivesFromHeaderValue: cacheControl maxAge: &maxAge sharedMaxAge: &sharedMaxAge noCache: &noCache noStore: &noStore]; if (noCache || noStore) { return NO; } if (maxAge > 0) { NSDate *expiration; hasMaxAge = YES; expiration = [expirationStart dateByAddingTimeInterval: maxAge]; if ([now timeIntervalSince1970] >= [expiration timeIntervalSince1970]) { return NO; } } if (sharedMaxAge) { hasMaxAge = YES; } hasCacheControl = YES; } // Pragma: https://tools.ietf.org/html/rfc7234#section-5.4 pragma = [headers objectForKey: @"Pragma"]; if (!hasCacheControl && nil != pragma) { NSArray *cs = [pragma componentsSeparatedByString: @","]; NSMutableArray *components = [NSMutableArray arrayWithCapacity: [cs count]]; NSString *c; for (int i = 0; i < [cs count]; i++) { c = [cs objectAtIndex: i]; c = [c stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceCharacterSet]]; c = [c lowercaseString]; [components setObject: c atIndexedSubscript: i]; } if ([components containsObject: @"no-cache"]) { return NO; } } // Expires: // We should not cache a response that has already expired. // We MUST ignore this if we have Cache-Control: max-age or s-maxage. expires = [headers objectForKey: @"Expires"]; if (!hasMaxAge && nil != expires) { NSDate *expiration = dateFromString(expires); if (nil == expiration) { return NO; } if ([now timeIntervalSince1970] >= [expiration timeIntervalSince1970]) { return NO; } } if (!hasCacheControl) { return NO; } return YES; } + (void) getCacheControlDeirectivesFromHeaderValue: (NSString*)headerValue maxAge: (NSInteger*)maxAge sharedMaxAge: (NSInteger*)sharedMaxAge noCache: (BOOL*)noCache noStore: (BOOL*)noStore { NSArray *components; NSEnumerator *e; NSString *part; components = [headerValue componentsSeparatedByString: @","]; e = [components objectEnumerator]; while (nil != (part = [e nextObject])) { part = [part stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceCharacterSet]]; part = [part lowercaseString]; if ([part isEqualToString: @"no-cache"]) { *noCache = YES; } else if ([part isEqualToString: @"no-store"]) { *noStore = YES; } else if ([part containsString: @"max-age"]) { *maxAge = parseArgumentPart(part, @"max-age"); } else if ([part containsString: @"s-maxage"]) { *sharedMaxAge = parseArgumentPart(part, @"s-maxage"); } } } @end @implementation GSHTTPURLProtocol + (BOOL) canInitWithRequest: (NSURLRequest*)request { NSURL *url; if (nil != (url = [request URL]) && ([[url scheme] isEqualToString: @"http"] || [[url scheme] isEqualToString: @"https"])) { return YES; } else { return NO; } } + (id) _ProtocolClient { return AUTORELEASE([[_NSURLProtocolClient alloc] init]); } - (GSEasyHandleAction) didReceiveHeaderData: (NSData*)data contentLength: (int64_t)contentLength { NSURLSessionTask *task; GSTransferState *newTS; NSError *error = NULL; NSAssert(_internalState == GSNativeProtocolInternalStateTransferInProgress, @"Received header data, but no transfer in progress."); task = [self task]; NSAssert(nil != task, @"Received header data but no task available."); newTS = [_transferState byAppendingHTTPHeaderLineData: data error: &error]; if (nil != newTS && NULL == error) { BOOL didCompleteHeader; didCompleteHeader = ![_transferState isHeaderComplete] && [newTS isHeaderComplete]; [self setInternalState: GSNativeProtocolInternalStateTransferInProgress]; ASSIGN(_transferState, newTS); if (didCompleteHeader) { // The header is now complete, but wasn't before. NSHTTPURLResponse *response; NSString *contentEncoding; response = (NSHTTPURLResponse*)[newTS response]; contentEncoding = [[response allHeaderFields] objectForKey: @"Content-Encoding"]; if (nil != contentEncoding && ![contentEncoding isEqual: @"identity"]) { // compressed responses do not report expected size [task setCountOfBytesExpectedToReceive: -1]; } else { [task setCountOfBytesExpectedToReceive: (contentLength > 0 ? contentLength : -1)]; } [self didReceiveResponse]; } return GSEasyHandleActionProceed; } else { return GSEasyHandleActionAbort; } } - (BOOL) canRespondFromCacheUsing: (NSCachedURLResponse*)response { BOOL canCache; NSURLSessionTask *task; task = [self task]; canCache = [GSURLCacherHelper canCacheResponse: response request: [task currentRequest]]; if (!canCache) { // If somehow cached a response that shouldn't have been, // we should remove it. NSURLCache *cache; cache = [[[task session] configuration] URLCache]; if (nil != cache) { [cache removeCachedResponseForRequest: [task currentRequest]]; } return NO; } return YES; } /// Set options on the easy handle to match the given request. /// This performs a series of `curl_easy_setopt()` calls. - (void) configureEasyHandleForRequest: (NSURLRequest*)request body: (GSURLSessionTaskBody*)body { NSURLSessionTask *task = [self task]; NSURLSession *session = [task session]; NSURLSessionConfiguration *config = [session configuration]; if ([[request HTTPMethod] isEqualToString:@"GET"]) { if ([body type] != GSURLSessionTaskBodyTypeNone) { NSError *error; NSDictionary *info; info = [NSDictionary dictionaryWithObjectsAndKeys: @"resource exceeds maximum size", NSLocalizedDescriptionKey, [[request URL] description], NSURLErrorFailingURLStringErrorKey, nil]; error = [NSError errorWithDomain: NSURLErrorDomain code: NSURLErrorDataLengthExceedsMaximum userInfo: info]; [self setInternalState: GSNativeProtocolInternalStateTransferFailed]; [self transferCompletedWithError: error]; return; } } BOOL debugLibcurl = [[[NSProcessInfo processInfo] environment] objectForKey: @"URLSessionDebugLibcurl"] ? YES : NO; /* Programatically turning debug on in the request supercedes any * environment variable setting. */ if ([request _debug]) { debugLibcurl = YES; } [_easyHandle setVerboseMode: debugLibcurl]; BOOL debugOutput = [[[NSProcessInfo processInfo] environment] objectForKey: @"URLSessionDebug"] ? YES : NO; [_easyHandle setDebugOutput: debugOutput task: task]; [_easyHandle setPassHeadersToDataStream: NO]; [_easyHandle setProgressMeterOff: YES]; [_easyHandle setSkipAllSignalHandling: YES]; // Error Options: [_easyHandle setErrorBuffer: NULL]; [_easyHandle setFailOnHTTPErrorCode: NO]; NSAssert(nil != [request URL], @"No URL in request."); [_easyHandle setURL: [request URL]]; [_easyHandle setPipeWait: [config HTTPShouldUsePipelining]]; [_easyHandle setSessionConfig: config]; [_easyHandle setAllowedProtocolsToHTTPAndHTTPS]; [_easyHandle setPreferredReceiveBufferSize: NSIntegerMax]; NSError *e = nil; NSNumber *bodySize = [body getBodyLengthWithError: &e]; if (nil != e) { NSInteger errorCode; NSError *error; [self setInternalState: GSNativeProtocolInternalStateTransferFailed]; errorCode = [self errorCodeFromFileSystemError: e]; error = [NSError errorWithDomain: NSURLErrorDomain code: errorCode userInfo: @{NSLocalizedDescriptionKey : @"File system error"}]; [self failWithError: error request: request]; return; } if ([body type] == GSURLSessionTaskBodyTypeNone) { if ([[request HTTPMethod] isEqualToString: @"GET"]) { [_easyHandle setUpload: NO]; [_easyHandle setRequestBodyLength: 0]; } else { [_easyHandle setUpload: YES]; [_easyHandle setRequestBodyLength: 0]; } } else if (bodySize != nil) { [task setCountOfBytesExpectedToSend: [bodySize longLongValue]]; [_easyHandle setUpload: YES]; [_easyHandle setRequestBodyLength: [bodySize unsignedLongLongValue]]; } else if (bodySize == nil) { [_easyHandle setUpload: YES]; [_easyHandle setRequestBodyLength:-1]; } [_easyHandle setFollowLocation: NO]; /* The httpAdditionalHeaders from session configuration has to be added to * the request. The request.allHTTPHeaders can override the * httpAdditionalHeaders elements. Add the httpAdditionalHeaders from session * configuration first and then append/update the request.allHTTPHeaders * so that request.allHTTPHeaders can override httpAdditionalHeaders. */ NSMutableDictionary *hh = [NSMutableDictionary dictionary]; NSDictionary *HTTPAdditionalHeaders; NSDictionary *HTTPHeaders; hh = [NSMutableDictionary dictionary]; HTTPAdditionalHeaders = [[[task session] configuration] HTTPAdditionalHeaders]; if (nil == HTTPAdditionalHeaders) { HTTPAdditionalHeaders = [NSDictionary dictionary]; } HTTPHeaders = [request allHTTPHeaderFields]; if (nil == HTTPHeaders) { HTTPHeaders = [NSDictionary dictionary]; } [hh addEntriesFromDictionary: [self transformLowercaseKeyForHTTPHeaders: HTTPAdditionalHeaders]]; [hh addEntriesFromDictionary: [self transformLowercaseKeyForHTTPHeaders: HTTPHeaders]]; NSArray *curlHeaders = [self curlHeadersForHTTPHeaders: hh]; if ([[request HTTPMethod] isEqualToString:@"POST"] && [[request HTTPBody] length] > 0 && [request valueForHTTPHeaderField: @"Content-Type"] == nil) { NSMutableArray *temp = [curlHeaders mutableCopy]; [temp addObject: @"Content-Type:application/x-www-form-urlencoded"]; curlHeaders = temp; } [_easyHandle setCustomHeaders: curlHeaders]; RELEASE(curlHeaders); NSInteger timeoutInterval = [request timeoutInterval] * 1000; GSTimeoutSource *timeoutTimer; timeoutTimer = [[GSTimeoutSource alloc] initWithQueue: [task workQueue] milliseconds: timeoutInterval handler: ^{ NSError *urlError; id client; [self setInternalState: GSNativeProtocolInternalStateTransferFailed]; urlError = [NSError errorWithDomain: NSURLErrorDomain code: NSURLErrorTimedOut userInfo: nil]; [self completeTaskWithError: urlError]; if (nil != (client = [self client]) && [client respondsToSelector: @selector(URLProtocol:didFailWithError:)]) { [client URLProtocol: self didFailWithError: urlError]; } }]; [_easyHandle setTimeoutTimer: timeoutTimer]; RELEASE(timeoutTimer); [_easyHandle setAutomaticBodyDecompression: YES]; [_easyHandle setRequestMethod: [request HTTPMethod] ? [request HTTPMethod] : @"GET"]; // always set the status as it may change if a HEAD is converted to a GET [_easyHandle setNoBody: [[request HTTPMethod] isEqualToString: @"HEAD"]]; [_easyHandle setProxy]; } - (GSCompletionAction*) completeActionForCompletedRequest: (NSURLRequest*)request response: (NSURLResponse*)response { GSCompletionAction *action; NSHTTPURLResponse *httpResponse; NSURLRequest *redirectRequest; NSAssert([response isKindOfClass: [NSHTTPURLResponse class]], @"Response was not NSHTTPURLResponse"); httpResponse = (NSHTTPURLResponse*)response; redirectRequest = [self redirectRequestForResponse: httpResponse fromRequest: request]; action = AUTORELEASE([[GSCompletionAction alloc] init]); if (nil != redirectRequest) { [action setType: GSCompletionActionTypeRedirectWithRequest]; [action setRedirectRequest: redirectRequest]; } else { [action setType: GSCompletionActionTypeCompleteTask]; } return action; } /* If the response is a redirect, return the new request * * RFC 7231 section 6.4 defines redirection behavior for HTTP/1.1 * * - SeeAlso: */ - (NSURLRequest*) redirectRequestForResponse: (NSHTTPURLResponse*)response fromRequest: (NSURLRequest*)fromRequest { NSString *method = nil; NSURL *targetURL; NSString *location; if (nil == [response allHeaderFields]) { return nil; } location = [[response allHeaderFields] objectForKey: @"Location"]; targetURL = [NSURL URLWithString: location]; if (nil == location && nil == targetURL) { return nil; } switch ([response statusCode]) { case 301: case 302: method = [[fromRequest HTTPMethod] isEqualToString:@"POST"] ? @"GET" : [fromRequest HTTPMethod]; break; case 303: method = @"GET"; break; case 305: case 306: case 307: case 308: method = nil != [fromRequest HTTPMethod] ? [fromRequest HTTPMethod] : @"GET"; break; default: return nil; } NSMutableURLRequest *request = AUTORELEASE([fromRequest mutableCopy]); [request setHTTPMethod: method]; if (nil != [targetURL scheme] && nil != [targetURL host]) { [request setURL: targetURL]; return request; } NSString *scheme = [[request URL] scheme]; NSString *host = [[request URL] host]; NSNumber *port = [[request URL] port]; NSURLComponents *components = [[NSURLComponents alloc] init]; [components setScheme: scheme]; [components setHost: host]; /* Use the original port if the new URL does not contain a host * ie Location: /foo => :/Foo * but Location: newhost/foo will ignore the original port */ if ([targetURL host] == nil) { [components setPort: port]; } /* The path must either begin with "/" or be an empty string. */ if (![[targetURL relativePath] hasPrefix:@"/"]) { [components setPath: [NSString stringWithFormat:@"/%@", [targetURL relativePath]]]; } else { [components setPath: [targetURL relativePath]]; } NSString *urlString = [components string]; RELEASE(components); if (nil == urlString) { return nil; } [request setURL: [NSURL URLWithString:urlString]]; double timeSpent = [_easyHandle getTimeoutIntervalSpent]; [request setTimeoutInterval: [fromRequest timeoutInterval] - timeSpent]; return request; } - (void) redirectForRequest: (NSURLRequest*)request { NSURLSessionTask *task; NSURLSession *session; id delegate; NSAssert(_internalState == GSNativeProtocolInternalStateTransferCompleted, @"Trying to redirect, but the transfer is not complete."); task = [self task]; session = [task session]; delegate = [session delegate]; if (nil != delegate && [delegate respondsToSelector:@selector(selectr)]) { // At this point we need to change the internal state to note // that we're waiting for the delegate to call the completion // handler. Then we'll call the delegate callback // (willPerformHTTPRedirection). The task will then switch out of // its internal state once the delegate calls the completion // handler. [self setInternalState: GSNativeProtocolInternalStateWaitingForRedirectCompletionHandler]; [[session delegateQueue] addOperationWithBlock: ^{ id taskDelegate = (id)delegate; [taskDelegate URLSession: session task: task willPerformHTTPRedirection: (NSHTTPURLResponse*)[_transferState response] newRequest: request completionHandler: ^(NSURLRequest *_Nullable request) { dispatch_async([task workQueue], ^{ NSAssert(_internalState == GSNativeProtocolInternalStateWaitingForRedirectCompletionHandler, @"Received callback for HTTP redirection, but we're not waiting " @"for it. Was it called multiple times?"); // If the request is `nil`, we're supposed to treat the current response // as the final response, i.e. not do any redirection. // Otherwise, we'll start a new transfer with the passed in request. if (nil != request) { [self startNewTransferWithRequest: request]; } else { [self setInternalState: GSNativeProtocolInternalStateTransferCompleted]; [self completeTask]; } }); }]; }]; } else { NSURLRequest *configuredRequest; configuredRequest = [[session configuration] configureRequest: request]; [self startNewTransferWithRequest: configuredRequest]; } } - (NSURLResponse*) validateHeaderCompleteTransferState: (GSTransferState*)ts { if (![_transferState isHeaderComplete]) { /* we received body data before CURL tells us that the headers are complete, that happens for HTTP/0.9 simple responses, see - https://www.w3.org/Protocols/HTTP/1.0/spec.html#Message-Types - https://github.com/curl/curl/issues/467 */ return AUTORELEASE([[NSHTTPURLResponse alloc] initWithURL: [ts URL] statusCode: 200 HTTPVersion: @"HTTP/0.9" headerFields: [NSDictionary dictionary]]); } return nil; } - (NSDictionary*) transformLowercaseKeyForHTTPHeaders: (NSDictionary*)HTTPHeaders { NSMutableDictionary *result; NSEnumerator *e; NSString *k; if (nil == HTTPHeaders) { return nil; } result = [NSMutableDictionary dictionary]; e = [HTTPHeaders keyEnumerator]; while (nil != (k = [e nextObject])) { [result setObject: [HTTPHeaders objectForKey: k] forKey: [k lowercaseString]]; } return AUTORELEASE([result copy]); } // These are a list of headers that should be passed to libcurl. // // Headers will be returned as `Accept: text/html` strings for // setting fields, `Accept:` for disabling the libcurl default header, or // `Accept;` for a header with no content. This is the format that libcurl // expects. // // - SeeAlso: https://curl.haxx.se/libcurl/c/CURLOPT_HTTPHEADER.html - (NSArray*) curlHeadersForHTTPHeaders: (NSDictionary*)HTTPHeaders { NSMutableArray *result = [NSMutableArray array]; NSMutableSet *names = [NSMutableSet set]; NSEnumerator *e; NSString *k; NSDictionary *curlHeadersToSet; NSArray *curlHeadersToRemove; if (nil == HTTPHeaders) { return nil; } e = [HTTPHeaders keyEnumerator]; while (nil != (k = [e nextObject])) { NSString *name = [k lowercaseString]; NSString *value = [HTTPHeaders objectForKey: k]; if ([names containsObject: name]) { break; } [names addObject: name]; if ([value length] == 0) { [result addObject: [NSString stringWithFormat: @"%@;", k]]; } else { [result addObject: [NSString stringWithFormat: @"%@: %@", k, value]]; } } curlHeadersToSet = [self curlHeadersToSet]; e = [curlHeadersToSet keyEnumerator]; while (nil != (k = [e nextObject])) { NSString *name = [k lowercaseString]; NSString *value = [curlHeadersToSet objectForKey: k]; if ([names containsObject: name]) { break; } [names addObject: name]; if ([value length] == 0) { [result addObject: [NSString stringWithFormat: @"%@;", k]]; } else { [result addObject: [NSString stringWithFormat: @"%@: %@", k, value]]; } } curlHeadersToRemove = [self curlHeadersToRemove]; e = [curlHeadersToRemove objectEnumerator]; while (nil != (k = [e nextObject])) { NSString *name = [k lowercaseString]; if ([names containsObject: name]) { break; } [names addObject:name]; [result addObject: [NSString stringWithFormat: @"%@:", k]]; } return AUTORELEASE([result copy]); } // Any header values that should be passed to libcurl // // These will only be set if not already part of the request. // - SeeAlso: https://curl.haxx.se/libcurl/c/CURLOPT_HTTPHEADER.html - (NSDictionary*) curlHeadersToSet { return [NSDictionary dictionaryWithObjectsAndKeys: @"keep-alive", @"Connection", [self userAgentString], @"User-Agent", nil]; } // Any header values that should be removed from the ones set by libcurl // - SeeAlso: https://curl.haxx.se/libcurl/c/CURLOPT_HTTPHEADER.html - (NSArray*) curlHeadersToRemove { if ([[self task] knownBody] == nil) { return [NSArray array]; } else if ([[[self task] knownBody] type] == GSURLSessionTaskBodyTypeNone) { return [NSArray array]; } return [NSArray arrayWithObject: @"Expect"]; } - (NSString*) userAgentString { NSProcessInfo *processInfo = [NSProcessInfo processInfo]; NSString *name = [processInfo processName]; curl_version_info_data *curlInfo = curl_version_info(CURLVERSION_NOW); return [NSString stringWithFormat: @"%@ (unknown version) curl/%d.%d.%d", name, curlInfo->version_num >> 16 & 0xff, curlInfo->version_num >> 8 & 0xff, curlInfo->version_num & 0xff]; } - (NSInteger) errorCodeFromFileSystemError: (NSError*)error { if ([error domain] == NSCocoaErrorDomain) { switch (error.code) { case NSFileReadNoSuchFileError: return NSURLErrorFileDoesNotExist; case NSFileReadNoPermissionError: return NSURLErrorNoPermissionsToReadFile; default: return NSURLErrorUnknown; } } else { return NSURLErrorUnknown; } } // Whenever we receive a response (i.e. a complete header) from libcurl, // this method gets called. - (void) didReceiveResponse { NSURLSessionDataTask *task; NSHTTPURLResponse *response; task = (NSURLSessionDataTask*)[self task]; if (![task isKindOfClass: [NSURLSessionDataTask class]]) { return; } NSAssert(_internalState == GSNativeProtocolInternalStateTransferInProgress, @"Transfer not in progress."); NSAssert([[_transferState response] isKindOfClass: [NSHTTPURLResponse class]], @"Header complete, but not URL response."); response = (NSHTTPURLResponse*)[_transferState response]; if (nil != [[task session] delegate]) { switch ([response statusCode]) { case 301: case 302: case 303: case 307: break; default: { id client = [self client]; if (nil != client) { [client URLProtocol: self didReceiveResponse: response cacheStoragePolicy: NSURLCacheStorageNotAllowed]; } } } } } @end gnustep-base-1.29.0/Source/GSICUString.h000066400000000000000000000053561435650067400176750ustar00rootroot00000000000000#import #import #if defined(HAVE_UNICODE_UTEXT_H) #include #elif defined(HAVE_ICU_H) #include // icu.h in Windows 10 is missing a declaration of UTEXT_MAGIC #ifndef UTEXT_MAGIC #define UTEXT_MAGIC 0x345ad82c #endif #endif /* * Define TRUE/FALSE to be used with UBool parameters, as these are no longer * defined in ICU as of ICU 68. */ #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif /** * Initialises a UText structure with an NSString. If txt is NULL, then this * allocates a new structure on the heap, otherwise it fills in the existing * one. * * The returned UText object holds a reference to the NSString and accesses its * contents directly. */ UText* UTextInitWithNSString(UText *txt, NSString *str); /** * Initialises a UText structure with an NSMutableString. If txt is NULL, then * this allocates a new structure on the heap, otherwise it fills in the * existing one. * * The returned UText object holds a reference to the NSMutableString and * accesses its contents directly. * * This function returns a mutable UText, and changes made to it will be * reflected in the underlying NSMutableString. */ UText* UTextInitWithNSMutableString(UText *txt, NSMutableString *str); /** * GSUTextString is an NSString subclass that is backed by a libicu UText * structure. This class is intended to be used when returning UText created * by libicu functions to Objective-C code. */ @interface GSUTextString : NSString { @public /** The UText structure containing the libicu string interface. */ UText txt; } @end /** * GSUTextString is an NSMutableString subclass that is backed by a libicu * UText structure. This class is intended to be used when returning UText * created by libicu functions to Objective-C code. */ @interface GSUTextMutableString : NSMutableString { @public /** The UText structure containing the libicu string interface. */ UText txt; } @end /** * Cleanup function used to fee a unichar buffer. */ static inline void free_string(unichar **buf) { if (0 != *buf) { free(*buf); } } /** * Allocates a temporary buffer of the requested size. This allocates buffers * of up to 64 bytes on the stack or more than 64 bytes on the heap. The * buffer is automatically destroyed when it goes out of scope in either case. * * Buffers created in this way are exception safe when using native exceptions. */ #define TEMP_BUFFER(name, length)\ __attribute__((cleanup(free_string))) unichar *name ##_onheap = 0;\ unichar name ## _onstack[64];\ unichar *name = name ## _onstack;\ if (length > 64)\ {\ name ## _onheap = malloc(length * sizeof(unichar));\ name = name ## _onheap;\ } gnustep-base-1.29.0/Source/GSICUString.m000066400000000000000000000275071435650067400177040ustar00rootroot00000000000000/** Implementation of GSICUString for GNUStep Copyright (C) 2010 Free Software Foundation, Inc. This file is part of the GNUstep Base Library. 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 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 USA. $Date: 2010-09-18 16:09:58 +0100 (Sat, 18 Sep 2010) $ $Revision: 31371 $ */ #import "common.h" #if GS_USE_ICU == 1 #import "GSICUString.h" /** * The number of characters that we use per chunk when fetching a block of * characters at once for iteration. Making this value larger will make UText * iteration faster, at the cost of more memory. Making it larger than the * size of a typical string will make it no faster but will still cost memory. */ static const NSUInteger chunkSize = 32; /** * Returns the number of UTF16 characters in a UText backed by an NSString. */ static int64_t UTextNSStringNativeLength(UText *ut) { /* For constant strings the length is stored in ut->c, but for mutable * strings this is set to -1 and we must check the length every time. */ return (-1 == ut->c) ? [(NSString*)ut->p length] : ut->c; } /** * Loads a group of characters into the buffer that can be directly accessed by * users of the UText. This is used for iteration but UText users. */ UBool UTextNSStringAccess(UText *ut, int64_t nativeIndex, UBool forward) { NSString *str = (NSString*)ut->p; NSInteger length = (-1 == ut->c) ? (NSInteger)[str length] : ut->c; NSInteger nativeStart = ut->chunkNativeStart; NSInteger nativeLimit = ut->chunkNativeLimit; NSRange r; if (forward) { if (nativeIndex < nativeLimit && nativeIndex >= nativeStart) { /* The chunk already contains the index, set the offset * to match it. */ ut->chunkOffset = nativeIndex - nativeStart; return TRUE; } if (nativeIndex >= length && nativeLimit >= length) { /* Asking for a position beyond the end of the string; * Limit it to point just after the last character. */ ut->chunkOffset = ut->chunkLength; return FALSE; } /* Set up to fill the chunk with characters from the string * and to start at the beginning of that buffer. */ nativeStart = nativeIndex; nativeLimit = nativeIndex + chunkSize; if (nativeLimit > length) { nativeLimit = length; } r.location = nativeIndex; r.length = nativeLimit - nativeIndex; ut->chunkOffset = 0; } else { if (nativeIndex <= nativeLimit && nativeIndex > nativeStart) { /* The chunk already contains the index, set the offset * to match it. */ ut->chunkOffset = nativeIndex - nativeStart; return TRUE; } if (nativeIndex <= 0 && nativeStart <= 0) { /* Asking for a position beyond the start of the string; * Limit it to position of the first character. */ ut->chunkOffset = 0; return FALSE; } nativeLimit = nativeIndex; if (nativeLimit > length) { nativeLimit = length; } nativeStart = nativeLimit - chunkSize; if (nativeStart < 0) { nativeStart = 0; } r.location = nativeStart; r.length = nativeLimit - nativeStart; ut->chunkOffset = r.length; } [str getCharacters: ut->pExtra range: r]; ut->chunkNativeLimit = nativeLimit; ut->chunkNativeStart = nativeStart; ut->nativeIndexingLimit = r.length; ut->chunkLength = r.length; return TRUE; } /** * Replaces characters in an NSString-backed UText. */ static int32_t UTextNSMutableStringReplace(UText *ut, int64_t nativeStart, int64_t nativeLimit, const UChar *replacementText, int32_t replacmentLength, UErrorCode *status) { NSMutableString *str = (NSMutableString*)ut->p; NSRange r = NSMakeRange(nativeStart, nativeLimit-nativeStart); NSString *replacement = [NSString alloc]; if (replacmentLength < 0) { replacement = [replacement initWithCString: (const char*)replacementText encoding: NSUTF16StringEncoding]; } else { replacement = [replacement initWithCharactersNoCopy: (unichar*)replacementText length: replacmentLength freeWhenDone: NO]; } [str replaceCharactersInRange: r withString: replacement]; // Setting the chunk length to 0 here forces UTextNSStringAccess to fetch // the data from the string object. ut->chunkLength = 0; UTextNSStringAccess(ut, r.location + [replacement length] + 1, TRUE); ut->chunkOffset++; [replacement release]; if (NULL != status) { *status = 0; } return 0; } /** * Reads some characters. This is roughly analogous to NSString's * -getCharacters:range:. */ static int32_t UTextNSStringExtract(UText *ut, int64_t nativeStart, int64_t nativeLimit, UChar *dest, int32_t destCapacity, UErrorCode *status) { /* If we're loading no characters, we are expected to return the number of * characters that we could load if requested. */ if (destCapacity <= 0) { return nativeLimit - nativeStart; } else { NSString *str = (NSString*)ut->p; NSUInteger length = (-1 == ut->c) ? [str length] : ut->c; NSRange r; if (nativeLimit > length) { nativeLimit = length; } r = NSMakeRange(nativeStart, nativeLimit - nativeStart ); if (destCapacity < r.length) { r.length = destCapacity; } [str getCharacters: dest range: r]; if (destCapacity > r.length) { dest[r.length] = 0; } return r.length; } } /** * Copy or move some characters within a UText. */ void UTextNSStringCopy(UText *ut, int64_t nativeStart, int64_t nativeLimit, int64_t nativeDest, UBool move, UErrorCode *status) { NSMutableString *str = (NSMutableString*)ut->p; NSUInteger length = (-1 == ut->c) ? [str length] : ut->c; NSRange r; NSString *substr; if (nativeLimit > length) { nativeLimit = length; } r = NSMakeRange(nativeStart, nativeLimit - nativeStart); substr = [str substringWithRange: r]; [str insertString: substr atIndex: nativeDest]; if (move) { if (nativeDest < r.location) { r.location += r.length; } [str deleteCharactersInRange: r]; } if (NULL != status) { *status = 0; } } /** * Destructor for the NSString-specific parts of the UText. Because UTexts can * be allocated on the stack, or reused by different storage implementations, * this does not destroy the UText itself. */ static void UTextNStringClose(UText *ut) { ut->chunkContents = NULL; [(NSString*)ut->p release]; ut->p = NULL; } /** * Copies the UText object, optionally copying the NSString. This version is * for NSString-backed UTexts, so uses -copy to copy the string if required. * Typically, this should not actually copy the underlying storage, because it * is immutable. */ UText* UTextNSStringClone(UText *dest, const UText *src, UBool deep, UErrorCode *status) { NSString *str = (NSString*)src->p; if (deep) { str = [[str copy] autorelease]; } return UTextInitWithNSString(dest, str); } /** * Copies the UText object, optionally copying the NSMutableString. */ UText* UTextNSMutableStringClone(UText *dest, const UText *src, UBool deep, UErrorCode *status) { NSMutableString *str = (NSMutableString*)src->p; UText *txt; if (deep) { str = [str mutableCopy]; txt = UTextInitWithNSMutableString(dest, str); [str release]; } else { txt = UTextInitWithNSMutableString(dest, str); } return txt; } /** * Returns the index of the current character in the temporary buffer. */ int64_t UTextNSStringMapOffsetToNative(const UText *ut) { return ut->chunkNativeStart + ut->chunkOffset; } /** * Vtable for NSString-backed UTexts. */ static const UTextFuncs NSStringFuncs = { sizeof(UTextFuncs), // Table size 0, 0, 0, // Reserved UTextNSStringClone, UTextNSStringNativeLength, UTextNSStringAccess, UTextNSStringExtract, 0, // Replace UTextNSStringCopy, UTextNSStringMapOffsetToNative, 0, // Map to UTF16 UTextNStringClose, 0, 0, 0 // Spare }; /** * Vtable for NSMutableString-backed UTexts. */ static const UTextFuncs NSMutableStringFuncs = { sizeof(UTextFuncs), // Table size 0, 0, 0, // Reserved UTextNSMutableStringClone, UTextNSStringNativeLength, UTextNSStringAccess, UTextNSStringExtract, UTextNSMutableStringReplace, UTextNSStringCopy, UTextNSStringMapOffsetToNative, 0, // Map to UTF16 UTextNStringClose, 0, 0, 0 // Spare }; UText* UTextInitWithNSMutableString(UText *txt, NSMutableString *str) { UErrorCode status = 0; txt = utext_setup(txt, chunkSize * sizeof(unichar), &status); if (U_FAILURE(status)) { return NULL; } txt->p = [str retain]; txt->pFuncs = &NSMutableStringFuncs; txt->chunkContents = txt->pExtra; txt->c = -1; // Need to fetch length every time txt->providerProperties = 1<p = [str retain]; txt->pFuncs = &NSStringFuncs; txt->chunkContents = txt->pExtra; txt->c = [str length]; return txt; } @implementation GSUTextString - (id) init { if (nil != (self = [super init])) { UText t = UTEXT_INITIALIZER; memcpy(&txt, &t, sizeof(t)); } return self; } - (NSUInteger) length { return utext_nativeLength(&txt); } - (unichar) characterAtIndex: (NSUInteger)idx { unichar c; [self getCharacters: &c range: NSMakeRange(idx, 1)]; return c; } - (void) getCharacters: (unichar*)buffer range: (NSRange)r { UErrorCode status = 0; utext_extract(&txt, r.location, r.location+r.length, buffer, r.length, &status); if (U_FAILURE(status)) { _NSRangeExceptionRaise(); } } - (void) dealloc { utext_close(&txt); [super dealloc]; } @end @implementation GSUTextMutableString - (id) init { if (nil != (self = [super init])) { UText t = UTEXT_INITIALIZER; memcpy(&txt, &t, sizeof(t)); } return self; } - (NSUInteger) length { return utext_nativeLength(&txt); } - (unichar) characterAtIndex: (NSUInteger)idx { unichar c; [self getCharacters: &c range: NSMakeRange(idx, 1)]; return c; } - (void) getCharacters: (unichar*)buffer range: (NSRange)r { UErrorCode status = 0; utext_extract(&txt, r.location, r.location+r.length, buffer, r.length, &status); if (U_FAILURE(status)) { _NSRangeExceptionRaise(); } } - (void) replaceCharactersInRange: (NSRange)r withString: (NSString*)aString { NSUInteger length = [aString length]; UErrorCode status = 0; TEMP_BUFFER(buffer, length); [aString getCharacters: buffer range: NSMakeRange(0, length)]; utext_replace(&txt, r.location, r.location + r.length, buffer, length, &status); } - (void) dealloc { utext_close(&txt); [super dealloc]; } @end #endif // HAV_ICU gnustep-base-1.29.0/Source/GSInternal.h000066400000000000000000000115471435650067400176410ustar00rootroot00000000000000/* GSInternal Copyright (C) 2009 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald This file is part of the GNUstep Base Library. 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 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 02111 USA. */ /* This file defines macros for managing internal (hidden) instance variables * of a public class so that users of the public class don't need to recompile * their code when the class implementation is changed in new versions of the * library. * * The public class MUST declare its instance variables (after any public * instance variables which are part of the unchanging public API) using * code of the form: * #if GS_NONFRAGILE * # if defined(GS_X_IVARS) * @public GS_X_IVARS; * # endif * #else * @private id _internal GS_UNUSED_IVAR; * #endif * * In the non fragile case, this means that the public header has nothing * visible, but the ivars defined in GS_X_IVARS are visible within the * implementation. * * In the fragile case, the '_internal' instance variable is visible in the * public header, but as an opaque private instance variable, while macros * from this file allow the actual memory to be accessed either as a private * class. The use of a private class rather than simple heap memory is * necessary for automatic reference counting. * * Before including the header file containing the public class declaration, * you must define GS_X_IVARS (where X is the class name) to be the * list of actual instance variable declarations for the class. * * Before including this file, you must define 'GSInternal' to be the name * of your public class with * 'Internal' appended. * eg. if your class is called 'MyClass' then use the following define: * #define GSInternal MyClassInternal * * After including this file you can use the GS_PRIVATE_INTERNAL() macro * to declare the private subclass used to hold real instance variables. * The argument to this macro is the public class name (the GS_X_IVARS * list must also be defined). * * You use GS_CREATE_INTERNAL() in your intialiser to create the object * holding the internal instance variables, and GS_DESTROY_INTERNAL() to * get rid of that object in your -dealloc method. * You use GS_COPY_INTERNAL() in your implementations of -copyWithZone: * and -mutableCopyWithZone: in order to get the default copying behavior * for the internal class (a single copy of all the instance variables). * * Instance variables are referenced using the 'internal->ivar' suntax or * the GSIV(classname,object,ivar) macro. * */ #if !GS_NONFRAGILE /* Code for when we don't have non-fragile instance variables */ /* Start declaration of internal ivars. */ #define GS_PRIVATE_INTERNAL(name) \ @interface name ## Internal : NSObject \ { \ @public \ GS_##name##_IVARS; \ } \ @end \ @implementation name ## Internal \ @end /* Create holder for internal ivars. */ #define GS_CREATE_INTERNAL(name) \ if (nil == _internal) { _internal = [name ## Internal new]; } /* Destroy holder for internal ivars. */ #define GS_DESTROY_INTERNAL(name) \ if (nil != _internal) { [_internal release]; _internal = nil; } /* Create a new copy of the current object's internal class and place * it in the destination instance. This produces a bitwise copy, and you * may wish to perform further action to deepen the copy after using this * macro. * Use this only where D is a new copy of the current instance. */ #define GS_COPY_INTERNAL(D,Z) (D)->_internal = NSCopyObject(_internal, 0, (Z)); /* Checks to see if internal instance variables exist ... use in -dealloc if * there is any chance that the instance is being deallocated before they * were created. */ #define GS_EXISTS_INTERNAL (nil == _internal ? NO : YES) #undef internal #define internal ((GSInternal*)_internal) #undef GSIVar #define GSIVar(X,Y) (((GSInternal*)((X)->_internal))->Y) #else /* GS_NONFRAGILE */ /* We have support for non-fragile ivars */ #define GS_PRIVATE_INTERNAL(name) #define GS_CREATE_INTERNAL(name) #define GS_DESTROY_INTERNAL(name) #define GS_COPY_INTERNAL(D,Z) #define GS_EXISTS_INTERNAL YES /* Define constant to reference internal ivars. */ #undef internal #define internal self #undef GSIVar #define GSIVar(X,Y) ((X)->Y) #endif /* GS_NONFRAGILE */ gnustep-base-1.29.0/Source/GSInvocation.h000066400000000000000000000044631435650067400201750ustar00rootroot00000000000000/* Interface for NSInvocation concrete classes for GNUStep Copyright (C) 1998 Free Software Foundation, Inc. Written: Adam Fedor Date: Nov 2000 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef __GSInvocation_h_GNUSTEP_BASE_INCLUDE #define __GSInvocation_h_GNUSTEP_BASE_INCLUDE #include @class NSMutableData; typedef struct { int offset; unsigned size; const char *type; const char *qtype; unsigned align; unsigned qual; BOOL isReg; } NSArgumentInfo; @interface GSFFIInvocation : NSInvocation { @public uint8_t _retbuf[32]; // Store return values of up to 32 bytes here. NSMutableData *_frame; } @end @interface GSFFCallInvocation : NSInvocation { } @end @interface GSDummyInvocation : NSInvocation { } @end @interface NSInvocation (DistantCoding) - (BOOL) encodeWithDistantCoder: (NSCoder*)coder passPointers: (BOOL)passp; @end @interface NSMethodSignature (GNUstep) - (const char*) methodType; - (NSArgumentInfo*) methodInfo; @end extern void GSFFCallInvokeWithTargetAndImp(NSInvocation *inv, id anObject, IMP imp); extern void GSFFIInvokeWithTargetAndImp(NSInvocation *inv, id anObject, IMP imp); #define CLEAR_RETURN_VALUE_IF_OBJECT \ do {\ if (_validReturn && *_inf[0].type == _C_ID) \ { \ RELEASE (*(id*) _retval); \ *(id*) _retval = nil; \ _validReturn = NO; \ }\ } while (0) #define RETAIN_RETURN_VALUE IF_NO_ARC(do { if (*_inf[0].type == _C_ID) RETAIN (*(id*) _retval);} while (0)) #define _inf ((NSArgumentInfo*)_info) #endif gnustep-base-1.29.0/Source/GSLocale.m000066400000000000000000000207041435650067400172640ustar00rootroot00000000000000/** GSLocale - various functions for localization Copyright (C) 2000 Free Software Foundation, Inc. Written by: Adam Fedor Created: Oct 2000 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #import "GNUstepBase/GSLocale.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSArray.h" #import "Foundation/NSLock.h" static NSString * privateSetLocale(int category, NSString *locale); const char* GSSetLocaleC(int category, const char *loc) { NSWarnLog(@"GSSetLocaleC is deprecated and has no effect"); return NULL; } NSString * GSSetLocale(int category, NSString *locale) { NSWarnLog(@"GSSetLocale is deprecated and has no effect"); return nil; } #if defined(HAVE_LOCALE_H) && defined(HAVE_CURRENCY_SYMBOL_IN_LCONV) /* There is little point in using locale.h if no useful information is exposed through struct lconv. An example platform is Android. */ #include #ifdef HAVE_LANGINFO_H #include #endif #import "Foundation/NSUserDefaults.h" #import "GSPrivate.h" #define ToString(value) [NSString stringWithCString: (value) \ encoding: GSPrivateNativeCStringEncoding()] static NSString * privateSetLocale(int category, NSString *locale) { const char *clocale = NULL; /* Need to get the encoding first as the function call invalidates * the return value of setlocale() */ NSStringEncoding enc = GSPrivateNativeCStringEncoding(); if (locale != nil) { clocale = [locale cString]; } clocale = setlocale(category, clocale); if (clocale != NULL) { return [NSString stringWithCString: clocale encoding: enc]; } return nil; } #define GSLanginfo(value) ToString(nl_langinfo (value)) /* Creates a locale dictionary from information provided by i18n functions. Many, but not all, of the keys are filled in or inferred from the available information */ NSDictionary * GSDomainFromDefaultLocale(void) { static NSDictionary *saved = nil; struct lconv *lconv; NSMutableDictionary *dict; NSString *str1; NSString *str2; #ifdef HAVE_LANGINFO_H int i; NSMutableArray *arr; #endif NSString *backupLocale; if (saved != nil) return saved; dict = [NSMutableDictionary dictionary]; /* Protect locale access with locks to prevent multiple threads using * it and interfering with the buffer. */ [gnustep_global_lock lock]; /** * Set the current locale to the system default, and backup * what it was previously (should have been @"C"). */ backupLocale = privateSetLocale(LC_ALL, nil); privateSetLocale(LC_ALL, @""); #ifdef HAVE_LANGINFO_H /* Time/Date Information */ arr = [NSMutableArray arrayWithCapacity: 7]; for (i = 0; i < 7; i++) { [arr addObject: GSLanginfo(DAY_1+i)]; } [dict setObject: arr forKey: NSWeekDayNameArray]; arr = [NSMutableArray arrayWithCapacity: 7]; for (i = 0; i < 7; i++) { [arr addObject: GSLanginfo(ABDAY_1+i)]; } [dict setObject: arr forKey: NSShortWeekDayNameArray]; arr = [NSMutableArray arrayWithCapacity: 12]; for (i = 0; i < 12; i++) { [arr addObject: GSLanginfo(MON_1+i)]; } [dict setObject: arr forKey: NSMonthNameArray]; arr = [NSMutableArray arrayWithCapacity: 12]; for (i = 0; i < 12; i++) { [arr addObject: GSLanginfo(ABMON_1+i)]; } [dict setObject: arr forKey: NSShortMonthNameArray]; str1 = GSLanginfo(AM_STR); str2 = GSLanginfo(PM_STR); if (str1 != nil && str2 != nil) { [dict setObject: [NSArray arrayWithObjects: str1, str2, nil] forKey: NSAMPMDesignation]; } [dict setObject: GSLanginfo(D_T_FMT) forKey: NSTimeDateFormatString]; [dict setObject: GSLanginfo(D_FMT) forKey: NSShortDateFormatString]; [dict setObject: GSLanginfo(T_FMT) forKey: NSTimeFormatString]; #endif /* HAVE_LANGINFO_H */ lconv = localeconv(); /* Currency Information */ if (lconv->currency_symbol) { [dict setObject: ToString(lconv->currency_symbol) forKey: NSCurrencySymbol]; } if (lconv->int_curr_symbol) { [dict setObject: ToString(lconv->int_curr_symbol) forKey: NSInternationalCurrencyString]; } if (lconv->mon_decimal_point) { [dict setObject: ToString(lconv->mon_decimal_point) forKey: NSInternationalCurrencyString]; } if (lconv->mon_thousands_sep) { [dict setObject: ToString(lconv->mon_thousands_sep) forKey: NSInternationalCurrencyString]; } if (lconv->decimal_point) { [dict setObject: ToString(lconv->decimal_point) forKey: NSDecimalSeparator]; } if (lconv->thousands_sep) { [dict setObject: ToString(lconv->thousands_sep) forKey: NSThousandsSeparator]; } /* FIXME: Get currency format from localeconv */ #ifdef LC_MESSAGES str1 = privateSetLocale(LC_MESSAGES, nil); #else str1 = nil; #endif if (str1 != nil) { [dict setObject: str1 forKey: GSLocale]; } str2 = GSLanguageFromLocale(str1); if (str2 != nil) { [dict setObject: str2 forKey: NSLanguageName]; } /* * Another thread might have been faster in setting the static variable. * If so, we just drop our dict. */ if (saved == nil) { saved = [NSObject leak: dict]; } /** * Restore the current locale to what we backed up (again, should * be restored to @"C") */ privateSetLocale(LC_ALL, backupLocale); [gnustep_global_lock unlock]; return saved; } #else /* HAVE_LOCALE_H */ static NSString * privateSetLocale(int category, NSString *locale) { return nil; } NSDictionary * GSDomainFromDefaultLocale(void) { return nil; } #endif /* !HAVE_LOCALE_H */ NSString * GSLanguageFromLocale(NSString *locale) { NSString *language = nil; NSString *aliases = nil; NSBundle *gbundle; if (locale == nil || [locale isEqual: @"C"] || [locale isEqual: @"POSIX"] || [locale length] < 2) return @"English"; gbundle = [NSBundle bundleForLibrary: @"gnustep-base"]; aliases = [gbundle pathForResource: @"Locale" ofType: @"aliases" inDirectory: @"Languages"]; if (aliases != nil) { NSDictionary *dict; dict = [NSDictionary dictionaryWithContentsOfFile: aliases]; language = [dict objectForKey: locale]; if (language == nil && [locale pathExtension] != nil) { locale = [locale stringByDeletingPathExtension]; if ([locale isEqual: @"C"] || [locale isEqual: @"POSIX"]) return @"English"; language = [dict objectForKey: locale]; } if (language == nil) { locale = [locale substringWithRange: NSMakeRange(0, 2)]; language = [dict objectForKey: locale]; } } return language; } NSArray * GSLocaleVariants(NSString *locale) { NSRange under = [locale rangeOfString: @"_"]; if (under.location != NSNotFound) { return [NSArray arrayWithObjects: locale, [locale substringToIndex: under.location], nil]; } return [NSArray arrayWithObject: locale]; } NSArray * GSLanguagesFromLocale(NSString *locale) { NSArray *variants = GSLocaleVariants(locale); NSMutableArray *result = [NSMutableArray arrayWithCapacity: [variants count]]; NSEnumerator *enumerator = [variants objectEnumerator]; NSString *variant; while ((variant = [enumerator nextObject]) != nil) { NSString *language = GSLanguageFromLocale(variant); if (language != nil) { [result addObject: language]; } } return result; } NSString *GSDefaultLanguageLocale() { NSString *locale = nil; #ifdef HAVE_LOCALE_H #ifdef LC_MESSAGES NSString *backup; [gnustep_global_lock lock]; backup = privateSetLocale(LC_ALL, nil); privateSetLocale(LC_ALL, @""); locale = privateSetLocale(LC_MESSAGES, nil); privateSetLocale(LC_ALL, backup); [gnustep_global_lock unlock]; #endif #endif return locale; } gnustep-base-1.29.0/Source/GSMDNSNetServices.m000066400000000000000000001617161435650067400210120ustar00rootroot00000000000000/* Implementation for NSNetServices for GNUstep Copyright (C) 2006 Free Software Foundation, Inc. Written by: Chris B. Vetter Date: 2006 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #import "GSNetServices.h" #import "Foundation/NSNetServices.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSData.h" #import "Foundation/NSNull.h" #import "Foundation/NSRunLoop.h" #import "Foundation/NSTimer.h" #import "Foundation/NSValue.h" #if defined(_REENTRANT) #import "GNUstepBase/GSLock.h" #endif #import // Apple's DNS Service Discovery #import "GSNetwork.h" // // Define // #if ! defined(INET6_ADDRSTRLEN) # define INET6_ADDRSTRLEN 46 #endif // trigger runloop timer every INTERVAL seconds #define INTERVAL 0.3 #define SHORTTIMEOUT 0.25 // debugging stuff and laziness on my part #if defined(VERBOSE) # define INTERNALTRACE NSDebugLLog(@"Trace", @"%s", __PRETTY_FUNCTION__) # define LOG(f, args...) NSDebugLLog(@"NSNetServices", f, ##args) #else # define INTERNALTRACE # define LOG(f, args...) #endif /* VERBOSE */ #if ! defined(VERSION) # define VERSION (((GNUSTEP_BASE_MAJOR_VERSION * 100) \ + GNUSTEP_BASE_MINOR_VERSION) * 100) \ + GNUSTEP_BASE_SUBMINOR_VERSION #endif #define SETVERSION(aClass) \ do { \ if (self == [aClass class]) { [self setVersion: VERSION]; } \ else { [self doesNotRecognizeSelector: _cmd]; } \ } while (0); #if defined(_REENTRANT) # define THE_LOCK NSRecursiveLock *lock # define CREATELOCK(x) x->lock = [NSRecursiveLock new] # define LOCK(x) [x->lock lock] # define UNLOCK(x) [x->lock unlock] # define DESTROYLOCK(x) DESTROY(x->lock) #else # define THE_LOCK /* nothing */ # define CREATELOCK(x) /* nothing */ # define LOCK(x) /* nothing */ # define UNLOCK(x) /* nothing */ # define DESTROYLOCK(x) /* nothing */ #endif // // Typedef // typedef struct _Browser // The actual NSNetServiceBrowser { THE_LOCK; NSRunLoop *runloop; NSString *runloopmode; NSTimer *timer; // to control the runloop NSMutableDictionary *services; // List of found services. // Key is <_name_type_domain> and value is an initialized NSNetService. int interfaceIndex; } Browser; typedef struct _Service // The actual NSNetService { THE_LOCK; NSRunLoop *runloop; NSString *runloopmode; NSTimer *timer, // to control the runloop *timeout; // to time-out the resolve NSMutableDictionary *info; // The service's information, keys are // - Domain (string) // - Name (string) // - Type (string) // - Host (string) // - Addresses (mutable array) // - TXT (data) NSMutableArray *foundAddresses; // array of char* int interfaceIndex, // should also be in 'info' port; // (in network byte-order) ditto id monitor; // NSNetServiceMonitor BOOL isPublishing, // true if publishing service isMonitoring; // true if monitoring } Service; typedef struct _Monitor // The actual NSNetServiceMonitor { THE_LOCK; NSRunLoop *runloop; NSString *runloopmode; NSTimer *timer; // to control the runloop } Monitor; // // Private // // // Private Interface // @interface GSMDNSNetServiceMonitor : NSObject { @private void * _netServiceMonitor; id _delegate; void * _reserved; } - (id) initWithDelegate: (id) delegate; - (void) removeFromRunLoop: (NSRunLoop *) aRunLoop forMode: (NSString *) mode; - (void) scheduleInRunLoop: (NSRunLoop *) aRunLoop forMode: (NSString *) mode; - (void) start; - (void) stop; @end // // Prototype // static NSDictionary *CreateError(id sender, int errorCode); static int ConvertError(int errorCode); static void DNSSD_API // used by NSNetServiceBrowser EnumerationCallback(DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType errorCode, const char *replyDomain, void *context); static void DNSSD_API BrowserCallback(DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType errorCode, const char *replyName, const char *replyType, const char *replyDomain, void *context); static void DNSSD_API // used by NSNetService ResolverCallback(DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType errorCode, const char *fullname, const char *hosttarget, uint16_t port, uint16_t txtLen, const unsigned char *txtRecord, void *context); static void DNSSD_API RegistrationCallback(DNSServiceRef sdRef, DNSServiceFlags flags, DNSServiceErrorType errorCode, const char *name, const char *regtype, const char *domain, void *context); static void DNSSD_API // used by NSNetService and NSNetServiceMonitor QueryCallback(DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType errorCode, const char *fullname, uint16_t rrtype, uint16_t rrclass, uint16_t rdlen, const void *rdata, uint32_t ttl, void *context); /*************************************************************************** ** ** Implementation ** */ @implementation GSMDNSNetServiceBrowser /** * Description forthcoming * * */ + (void) initialize { INTERNALTRACE; SETVERSION(GSMDNSNetServiceBrowser); { #ifndef _REENTRANT LOG(@"%@ may NOT be thread-safe!", [self class]); #endif } } /*************************************************************************** ** ** Private Methods ** */ /** * Description forthcoming * * */ - (void) cleanup { Browser *browser; INTERNALTRACE; browser = (Browser *) _reserved; LOCK(browser); { if (browser->runloop) { [self removeFromRunLoop: browser->runloop forMode: browser->runloopmode]; } if (browser->timer) { [browser->timer invalidate]; DESTROY(browser->timer); } if (_netServiceBrowser) { DNSServiceRefDeallocate(_netServiceBrowser); _netServiceBrowser = NULL; } [browser->services removeAllObjects]; } UNLOCK(browser); } /** * Description forthcoming * * */ - (void) executeWithError: (DNSServiceErrorType) err { Browser *browser; INTERNALTRACE; browser = (Browser *) _reserved; LOCK(browser); { if (kDNSServiceErr_NoError == err) { [self netServiceBrowserWillSearch: self]; if (! browser->runloop) { [self scheduleInRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode]; } [browser->runloop addTimer: browser->timer forMode: browser->runloopmode]; [browser->timer fire]; } else // notify the delegate of the error { [self netServiceBrowser: self didNotSearch: CreateError(self, err)]; } } UNLOCK(browser); } /** * Description forthcoming * * */ - (void) searchForDomain: (NSInteger) aFlag { DNSServiceErrorType err = kDNSServiceErr_NoError; Browser *browser; INTERNALTRACE; browser = (Browser *) _reserved; LOCK(browser); { do { if (! [self delegate]) { err = NSNetServicesInvalidError; break; } if (browser->timer) { err = NSNetServicesActivityInProgress; break; } err = DNSServiceEnumerateDomains((DNSServiceRef *)&_netServiceBrowser, aFlag, browser->interfaceIndex, EnumerationCallback, self); } while (0); } UNLOCK(browser); [self executeWithError: err]; } /** * Description forthcoming * * */ - (void) enumCallback: (DNSServiceRef) sdRef flags: (DNSServiceFlags) flags interface: (uint32_t) interfaceIndex error: (DNSServiceErrorType) errorCode domain: (const char *) replyDomain { Browser *browser; INTERNALTRACE; browser = (Browser *) _reserved; LOCK(browser); if (_netServiceBrowser) { if (errorCode) { [self cleanup]; [self netServiceBrowser: self didNotSearch: CreateError(self, errorCode)]; } else { BOOL more = NO; if (replyDomain) { NSString *domain; more = flags & kDNSServiceFlagsMoreComing; browser->interfaceIndex = interfaceIndex; domain = [NSString stringWithUTF8String: replyDomain]; if (flags & kDNSServiceFlagsAdd) { LOG(@"Found domain <%s>", replyDomain); [self netServiceBrowser: self didFindDomain: domain moreComing: more]; } else // kDNSServiceFlagsRemove { LOG(@"Removed domain <%s>", replyDomain); [self netServiceBrowser: self didRemoveDomain: domain moreComing: more]; } } } } UNLOCK(browser); } /** * Description forthcoming * * */ - (void) browseCallback: (DNSServiceRef) sdRef flags: (DNSServiceFlags) flags interface: (uint32_t) interfaceIndex error: (DNSServiceErrorType) errorCode name: (const char *) replyName type: (const char *) replyType domain: (const char *) replyDomain { Browser *browser; INTERNALTRACE; browser = (Browser *) _reserved; LOCK(browser); if (_netServiceBrowser) { if (errorCode) { [self cleanup]; [self netServiceBrowser: self didNotSearch: CreateError(self, errorCode)]; } else { NSNetService *service = nil; NSString *domain = nil; NSString *type = nil; NSString *name = nil; NSString *key = nil; BOOL more = (flags & kDNSServiceFlagsMoreComing); browser->interfaceIndex = interfaceIndex; if (nil == browser->services) { browser->services = [[NSMutableDictionary alloc] initWithCapacity: 1]; } domain = [NSString stringWithUTF8String: replyDomain]; type = [NSString stringWithUTF8String: replyType]; name = [NSString stringWithUTF8String: replyName]; key = [NSString stringWithFormat: @"%@%@%@", name, type, domain]; if (flags & kDNSServiceFlagsAdd) { service = AUTORELEASE([[GSMDNSNetService alloc] initWithDomain: domain type: type name: name]); if (service) { LOG(@"Found service <%s>", replyName); [self netServiceBrowser: self didFindService: service moreComing: more]; [browser->services setObject: service forKey: key]; } else { LOG(@"WARNING: Could not create an NSNetService for <%s>", replyName); } } else // kDNSServiceFlagsRemove { service = [browser->services objectForKey: key]; if (service) { LOG(@"Removed service <%@>", [service name]); [self netServiceBrowser: self didRemoveService: service moreComing: more]; } else { LOG(@"WARNING: Could not find <%@> in list", key); } } } } UNLOCK(browser); } /** * Description forthcoming * * */ - (void) loop: (id) sender { int sock = 0; struct timeval tout = { 0 }; fd_set set; DNSServiceErrorType err = kDNSServiceErr_NoError; sock = DNSServiceRefSockFD(_netServiceBrowser); if (-1 != sock) { FD_ZERO(&set); FD_SET(sock, &set); if (1 == select(sock + 1, &set, (fd_set *) NULL, (fd_set *) NULL, &tout)) { err = DNSServiceProcessResult(_netServiceBrowser); } } if (kDNSServiceErr_NoError != err) { [self netServiceBrowser: self didNotSearch: CreateError(self, err)]; } } /** * Removes the receiver from the specified runloop. * * */ - (void) removeFromRunLoop: (NSRunLoop *) aRunLoop forMode: (NSString *) mode { Browser *browser; INTERNALTRACE; browser = (Browser *) _reserved; LOCK(browser); { if (browser->timer) { [browser->timer setFireDate: [NSDate date]]; [browser->timer invalidate]; browser->timer = nil; } // Do not release the runloop! browser->runloop = nil; DESTROY(browser->runloopmode); } UNLOCK(browser); } /** * Adds the receiver to the specified runloop. * * */ - (void) scheduleInRunLoop: (NSRunLoop *) aRunLoop forMode: (NSString *) mode { Browser *browser; INTERNALTRACE; browser = (Browser *) _reserved; LOCK(browser); { if (browser->timer) { [browser->timer setFireDate: [NSDate date]]; [browser->timer invalidate]; browser->timer = nil; } browser->timer = RETAIN([NSTimer timerWithTimeInterval: INTERVAL target: self selector: @selector(loop:) userInfo: nil repeats: YES]); browser->runloop = aRunLoop; browser->runloopmode = mode; } UNLOCK(browser); } /** * Search for all visible domains. This method is deprecated. * * */ - (void) searchForAllDomains { DNSServiceFlags flags = 0; INTERNALTRACE; flags = kDNSServiceFlagsBrowseDomains|kDNSServiceFlagsRegistrationDomains; [self searchForDomain: flags]; } /** * Search for all browsable domains. * * */ - (void) searchForBrowsableDomains { INTERNALTRACE; [self searchForDomain: kDNSServiceFlagsBrowseDomains]; } /** * Search for all registration domains. These domains can be used to register * a service. * */ - (void) searchForRegistrationDomains { INTERNALTRACE; [self searchForDomain: kDNSServiceFlagsRegistrationDomains]; } /** * Search for a particular service within a given domain. * * */ - (void) searchForServicesOfType: (NSString *) serviceType inDomain: (NSString *) domainName { Browser *browser; DNSServiceErrorType err = kDNSServiceErr_NoError; DNSServiceFlags flags = 0; INTERNALTRACE; browser = (Browser *) _reserved; LOCK(browser); { do { if (! [self delegate]) { err = NSNetServicesInvalidError; break; } if (browser->timer) { err = NSNetServicesActivityInProgress; break; } err = DNSServiceBrowse((DNSServiceRef *) &_netServiceBrowser, flags, browser->interfaceIndex, [serviceType UTF8String], [domainName UTF8String], BrowserCallback, self); } while (0); } UNLOCK(browser); [self executeWithError: err]; } /** * Halts all currently running searches. * * */ - (void) stop { Browser *browser; INTERNALTRACE; browser = (Browser *) _reserved; LOCK(browser); { [self cleanup]; [self netServiceBrowserDidStopSearch: self]; } UNLOCK(browser); } /** * Initializes the receiver. * * */ - (id) init { INTERNALTRACE; if ((self = [super init])) { Browser *browser; browser = malloc(sizeof (struct _Browser)); memset(browser, 0, sizeof &browser); CREATELOCK(browser); browser->runloop = nil; browser->runloopmode = nil; browser->timer = nil; browser->services = [[NSMutableDictionary alloc] initWithCapacity: 1]; browser->interfaceIndex = 0; _netServiceBrowser = NULL; [self setDelegate: nil]; _reserved = browser; } return self; } /** * Description forthcoming * * */ - (void) dealloc { Browser *browser; INTERNALTRACE; browser = (Browser *) _reserved; { LOCK(browser); { [self cleanup]; DESTROY(browser->services); [self setDelegate: nil]; } UNLOCK(browser); DESTROYLOCK(browser); free(browser); } [super dealloc]; } @end @implementation GSMDNSNetService /** * Description forthcoming * * */ + (void) initialize { INTERNALTRACE; SETVERSION(GSMDNSNetService); { #ifndef _REENTRANT LOG(@"%@ may NOT be thread-safe!", [self class]); #endif } } /** * Description forthcoming * * */ - (void) executeWithError: (DNSServiceErrorType) err { Service *service; INTERNALTRACE; service = (Service *) _reserved; LOCK(service); { if (kDNSServiceErr_NoError == err) { if (YES == service->isPublishing) { [self netServiceWillPublish: self]; } else { [self netServiceWillResolve: self]; } if (! service->runloop) { [self scheduleInRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode]; } [service->runloop addTimer: service->timer forMode: service->runloopmode]; [service->timer fire]; } else // notify the delegate of the error { if (YES == service->isPublishing) { [self netService: self didNotPublish: CreateError(self, err)]; } else { [self netService: self didNotResolve: CreateError(self, err)]; } } } UNLOCK(service); } /** * Description forthcoming * * */ - (void) cleanup { Service *service; INTERNALTRACE; service = (Service *) _reserved; LOCK(service); { if (service->runloop) { [self removeFromRunLoop: service->runloop forMode: service->runloopmode]; } if (service->timer) { [service->timer invalidate]; DESTROY(service->timer); } if (_netService) { DNSServiceRefDeallocate(_netService); _netService = NULL; } [service->info removeAllObjects]; [service->foundAddresses removeAllObjects]; } UNLOCK(service); } /** * Description forthcoming * * */ - (void) stopResolving: (id) sender { Service *service; INTERNALTRACE; service = (Service *) _reserved; LOCK(service); { [service->timeout invalidate]; [service->timer invalidate]; [self netService: self didNotResolve: CreateError(self, NSNetServicesTimeoutError)]; } UNLOCK(service); } /** * Description forthcoming * * */ - (void) resolverCallback: (DNSServiceRef) sdRef flags: (DNSServiceFlags) flags interface: (uint32_t) interfaceIndex error: (DNSServiceErrorType) errorCode fullname: (const char *) fullname target: (const char *) hosttarget port: (uint16_t) port length: (uint16_t) txtLen record: (const unsigned char *) txtRecord { Service *service; INTERNALTRACE; service = (Service *) _reserved; LOCK(service); if (_netService) { if (errorCode) { [self cleanup]; [self netService: self didNotResolve: CreateError(self, errorCode)]; } else { NSData *txt = nil; NSString *target = nil; // Add the TXT record txt = txtRecord ? [NSData dataWithBytes: txtRecord length: txtLen] : nil; // Get the host target = hosttarget ? [NSString stringWithUTF8String: hosttarget] : nil; // Add the port service->port = port; // Remove the old TXT entry [service->info removeObjectForKey: @"TXT"]; if (txt) { [service->info setObject: txt forKey: @"TXT"]; } // Remove the old host entry [service->info removeObjectForKey: @"Host"]; // Add the host if there is one if (target) { [service->info setObject: target forKey: @"Host"]; } /* Add the interface so all subsequent * queries are on the same interface */ service->interfaceIndex = interfaceIndex; service->timer = nil; // Prepare query for A and/or AAAA record errorCode = DNSServiceQueryRecord((DNSServiceRef *) &_netService, flags, interfaceIndex, hosttarget, kDNSServiceType_ANY, kDNSServiceClass_IN, QueryCallback, self); // No error? Then create a new timer if (kDNSServiceErr_NoError == errorCode) { service->timer = [NSTimer timerWithTimeInterval: INTERVAL target: self selector: @selector(loop:) userInfo: nil repeats: YES]; [service->timer fire]; } } } UNLOCK(service); } /** * Description forthcoming * * */ - (BOOL) addAddress: (char *) addressString { Service *service; NSString *string; INTERNALTRACE; service = (Service *) _reserved; if (nil == service->foundAddresses) { service->foundAddresses = [[NSMutableArray alloc] init]; } string = [NSString stringWithCString: addressString]; if ([service->foundAddresses containsObject: string]) { // duplicate, didn't add it return NO; } [service->foundAddresses addObject: string]; return YES; } /** * Description forthcoming * * */ - (void) addAddress: (const void *) rdata length: (uint16_t) rdlen type: (uint16_t) rrtype interface: (uint32_t) interfaceIndex { Service *service; INTERNALTRACE; service = (Service *) _reserved; LOCK(service); { NSData *data = nil; NSMutableArray *addresses = nil; struct sockaddr *address = { 0 }; size_t length = 0; const unsigned char *rd = rdata; char rdb[INET6_ADDRSTRLEN]; memset(rdb, 0, sizeof rdb); addresses = [service->info objectForKey: @"Addresses"]; if (nil == addresses) { addresses = [NSMutableArray arrayWithCapacity: 1]; } else { addresses = AUTORELEASE([addresses mutableCopy]); } switch(rrtype) { case kDNSServiceType_A: // AF_INET { struct sockaddr_in ip4; // oogly snprintf(rdb, sizeof(rdb), "%d.%d.%d.%d", rd[0], rd[1], rd[2], rd[3]); LOG(@"Found IPv4 <%s> on port %d", rdb, ntohs(service->port)); length = sizeof (struct sockaddr_in); memset(&ip4, 0, length); inet_pton(AF_INET, rdb, &ip4.sin_addr); ip4.sin_family = AF_INET; ip4.sin_port = service->port; address = (struct sockaddr *) &ip4; } break; #if defined(AF_INET6) case kDNSServiceType_AAAA: // AF_INET6 case kDNSServiceType_A6: // deprecates AAAA { struct sockaddr_in6 ip6; // Even more oogly snprintf(rdb, sizeof(rdb), "%x%x:%x%x:%x%x:%x%x:%x%x:%x%x:%x%x:%x%x", rd[0], rd[1], rd[2], rd[3], rd[4], rd[5], rd[6], rd[7], rd[8], rd[9], rd[10], rd[11], rd[12], rd[13], rd[14], rd[15]); LOG(@"Found IPv6 <%s> on port %d", rdb, ntohs(service->port)); length = sizeof (struct sockaddr_in6); memset(&ip6, 0, length); inet_pton(AF_INET6, rdb, &ip6.sin6_addr); #if defined(HAVE_SA_LEN) ip6.sin6_len = sizeof ip6; #endif ip6.sin6_family = AF_INET6; ip6.sin6_port = service->port; ip6.sin6_flowinfo = 0; ip6.sin6_scope_id = interfaceIndex; address = (struct sockaddr *) &ip6; } break; #endif /* AF_INET6 */ default: LOG(@"Unkown type of length <%d>", rdlen); break; } // check for duplicate entries if ([self addAddress: rdb]) { // add it data = [NSData dataWithBytes: address length: length]; [addresses addObject: data]; [service->info setObject: AUTORELEASE([addresses copy]) forKey: @"Addresses"]; // notify the delegate [self netServiceDidResolveAddress: self]; // got it, so invalidate the timeout [service->timeout invalidate]; service->timeout = nil; } } UNLOCK(service); } /** * Description forthcoming * * */ - (void) queryCallback: (DNSServiceRef) sdRef flags: (DNSServiceFlags) flags interface: (uint32_t) interfaceIndex error: (DNSServiceErrorType) errorCode fullname: (const char *) fullname type: (uint16_t) rrtype class: (uint16_t) rrclass length: (uint16_t) rdlen data: (const void *) rdata ttl: (uint32_t) ttl { Service *service; INTERNALTRACE; service = (Service *) _reserved; LOCK(service); if (_netService) { if (errorCode) { [self cleanup]; [self netService: self didNotResolve: CreateError(self, errorCode)]; UNLOCK(service); return; } switch(rrtype) { case kDNSServiceType_A: // 1 -- AF_INET [self addAddress: rdata length: rdlen type: rrtype interface: interfaceIndex]; break; case kDNSServiceType_NS: case kDNSServiceType_MD: case kDNSServiceType_MF: case kDNSServiceType_CNAME: // 5 case kDNSServiceType_SOA: case kDNSServiceType_MB: case kDNSServiceType_MG: case kDNSServiceType_MR: case kDNSServiceType_NULL: // 10 case kDNSServiceType_WKS: case kDNSServiceType_PTR: case kDNSServiceType_HINFO: case kDNSServiceType_MINFO: case kDNSServiceType_MX: // 15 // not handled (yet) break; case kDNSServiceType_TXT: { NSData *data = nil; data = [NSData dataWithBytes: rdata length: rdlen]; [service->info removeObjectForKey: @"TXT"]; [service->info setObject: data forKey: @"TXT"]; [self netService: self didUpdateTXTRecordData: data]; } break; case kDNSServiceType_RP: case kDNSServiceType_AFSDB: case kDNSServiceType_X25: case kDNSServiceType_ISDN: // 20 case kDNSServiceType_RT: case kDNSServiceType_NSAP: case kDNSServiceType_NSAP_PTR: case kDNSServiceType_SIG: case kDNSServiceType_KEY: // 25 case kDNSServiceType_PX: case kDNSServiceType_GPOS: // not handled (yet) break; case kDNSServiceType_AAAA: // 28 -- AF_INET6 [self addAddress: rdata length: rdlen type: rrtype interface: interfaceIndex]; break; case kDNSServiceType_LOC: case kDNSServiceType_NXT: // 30 case kDNSServiceType_EID: case kDNSServiceType_NIMLOC: case kDNSServiceType_SRV: case kDNSServiceType_ATMA: case kDNSServiceType_NAPTR: // 35 case kDNSServiceType_KX: case kDNSServiceType_CERT: // not handled (yet) break; case kDNSServiceType_A6: // 38 -- AF_INET6, deprecates AAAA [self addAddress: rdata length: rdlen type: rrtype interface: interfaceIndex]; break; case kDNSServiceType_DNAME: case kDNSServiceType_SINK: // 40 case kDNSServiceType_OPT: // not handled (yet) break; case kDNSServiceType_TKEY: // 249 case kDNSServiceType_TSIG: // 250 case kDNSServiceType_IXFR: case kDNSServiceType_AXFR: case kDNSServiceType_MAILB: case kDNSServiceType_MAILA: // not handled (yet) break; case kDNSServiceType_ANY: LOG(@"Oops, got the wildcard match..."); break; default: LOG(@"Don't know how to handle rrtype <%d>", rrtype); break; } } UNLOCK(service); } /** * Description forthcoming * * */ - (void) registerCallback: (DNSServiceRef) sdRef flags: (DNSServiceFlags) flags error: (DNSServiceErrorType) errorCode name: (const char *) name type: (const char *) regtype domain: (const char *) domain { Service *service; INTERNALTRACE; service = (Service *) _reserved; LOCK(service); if (_netService) { if (errorCode) { [self cleanup]; [self netService: self didNotPublish: CreateError(self, errorCode)]; } else { [self netServiceDidPublish: self]; } } UNLOCK(service); } /** * Description forthcoming * * */ - (void) loop: (id) sender { int sock = 0; struct timeval tout = { 0 }; fd_set set; DNSServiceErrorType err = kDNSServiceErr_NoError; sock = DNSServiceRefSockFD(_netService); if (-1 != sock) { FD_ZERO(&set); FD_SET(sock, &set); if (1 == select(sock + 1, &set, (fd_set *) NULL, (fd_set *) NULL, &tout)) { err = DNSServiceProcessResult(_netService); } } if (kDNSServiceErr_NoError != err) { Service *service; service = (Service *) _reserved; if (YES == service->isPublishing) { [self netService: self didNotPublish: CreateError(self, err)]; } else { [self netService: self didNotResolve: CreateError(self, err)]; } } } /** * Converts txtDictionary into a TXT data. * * */ + (NSData *) dataFromTXTRecordDictionary: (NSDictionary *) txtDictionary { NSMutableData *result = nil; NSArray *keys = nil; NSArray *values = nil; int count = 0; INTERNALTRACE; count = [txtDictionary count]; if (count) { keys = [txtDictionary allKeys]; values = [txtDictionary allValues]; if (keys && values) { TXTRecordRef txt; int i = 0; char key[256]; TXTRecordCreate(&txt, 0, NULL); for (; i < count; i++) { int length = 0; int used = 0; DNSServiceErrorType err = kDNSServiceErr_Unknown; if (! [[keys objectAtIndex: i] isKindOfClass: [NSString class]]) { LOG(@"%@ is not a string", [keys objectAtIndex: i]); break; } length = [[keys objectAtIndex: i] length]; [[keys objectAtIndex: i] getCString: key maxLength: sizeof key]; used = strlen(key); if (! length || (used >= sizeof key)) { LOG(@"incorrect length %d - %d - %d", length, used, sizeof key); break; } if ([[values objectAtIndex: i] isKindOfClass: [NSString class]]) { char value[256]; length = [[values objectAtIndex: i] length]; [[values objectAtIndex: i] getCString: value maxLength: sizeof value]; used = strlen(value); if (used >= sizeof value) { LOG(@"incorrect length %d - %d - %d", length, used, sizeof value); break; } err = TXTRecordSetValue(&txt, (const char *) key, used, value); } else if ([[values objectAtIndex: i] isKindOfClass: [NSData class]] && [[values objectAtIndex: i] length] < 256 && [[values objectAtIndex: i] length] > 0) { err = TXTRecordSetValue(&txt, (const char *) key, [[values objectAtIndex: i] length], [[values objectAtIndex: i] bytes]); } else if ([values objectAtIndex: i] == [NSNull null]) { err = TXTRecordSetValue(&txt, (const char *) key, 0, NULL); } else { LOG(@"unknown value type"); break; } if (err != kDNSServiceErr_NoError) { LOG(@"error creating data type"); break; } } if (i == count) { result = [NSData dataWithBytes: TXTRecordGetBytesPtr(&txt) length: TXTRecordGetLength(&txt)]; } TXTRecordDeallocate(&txt); } else { LOG(@"No keys or values"); } // both are autorelease'd keys = nil; values = nil; } else { LOG(@"Dictionary seems empty"); } return result; } /** * Converts the TXT data txtData into a dictionary. * * */ + (NSDictionary *) dictionaryFromTXTRecordData: (NSData *) txtData { NSMutableDictionary *result = nil; int len = 0; const void *txt = 0; INTERNALTRACE; len = [txtData length]; txt = [txtData bytes]; // // A TXT record cannot exceed 65535 bytes, see Chapter 6.1 of // http://files.dns-sd.org/draft-cheshire-dnsext-dns-sd.txt // if ((len > 0) && (len < 65536)) { uint16_t i = 0; uint16_t count = 0; // get number of keys count = TXTRecordGetCount(len, txt); result = [NSMutableDictionary dictionaryWithCapacity: 1]; if (result) { // go through all keys for (; i < count; i++) { char key[256]; uint8_t valLen = 0; const void *value = NULL; DNSServiceErrorType err = kDNSServiceErr_NoError; err = TXTRecordGetItemAtIndex(len, txt, i, sizeof key, key, &valLen, &value); // only if we can get the key and value... if (kDNSServiceErr_NoError == err) { NSData *data = nil; NSString *str = nil; str = [NSString stringWithUTF8String: key]; if (value) { data = [NSData dataWithBytes: value length: valLen]; } if (data && str && [str length] && ! [result objectForKey: str]) { /* only add if key and value were created * and key doesn't exist yet */ [result setValue: data forKey: str]; } else { /* I'm not exactly sure what to do if there * is a key WITHOUT a value * Theoretically '<6>foobar' should be identical * to '<7>foobar=' i.e. the value would be [NSNull null] */ [result setValue: [NSNull null] forKey: str]; } // both are autorelease'd data = nil; str = nil; } else { LOG(@"Couldn't get TXTRecord item"); } } } else { LOG(@"Couldn't create dictionary"); } } else { LOG(@"TXT record has incorrect length: <%d>", len); } return result; } /** * Initializes the receiver for service resolution. Use this method to create * an object if you intend to -resolve a service. * */ - (id) initWithDomain: (NSString *) domain type: (NSString *) type name: (NSString *) name { INTERNALTRACE; return [self initWithDomain: domain type: type name: name port: -1]; // -1 to indicate resolution, not publish } /** * Initializes the receiver for service publication. Use this method to create * an object if you intend to -publish a service. * */ - (id) initWithDomain: (NSString *) domain type: (NSString *) type name: (NSString *) name port: (NSInteger) port { INTERNALTRACE; if ((self = [super init])) { Service *service; service = malloc(sizeof (struct _Service)); memset(service, 0, sizeof &service); CREATELOCK(service); service->runloop = nil; service->runloopmode = nil; service->timer = nil; service->timeout = nil; service->info = [[NSMutableDictionary alloc] initWithCapacity: 3]; [service->info setObject: AUTORELEASE([domain copy]) forKey: @"Domain"]; [service->info setObject: AUTORELEASE([name copy]) forKey: @"Name"]; [service->info setObject: AUTORELEASE([type copy]) forKey: @"Type"]; service->foundAddresses = nil; service->interfaceIndex = 0; service->port = htons(port); service->monitor = nil; service->isPublishing = (-1 == port) ? NO : YES; service->isMonitoring = NO; _netService = NULL; [self setDelegate: nil]; _reserved = service; return self; } return nil; } /** * Removes the service from the specified run loop. * * */ - (void) removeFromRunLoop: (NSRunLoop *) aRunLoop forMode: (NSString *) mode { Service *service; INTERNALTRACE; service = (Service *) _reserved; LOCK(service); { if (service->timer) { [service->timer setFireDate: [NSDate date]]; [service->timer invalidate]; // Do not release the timer! service->timer = nil; } // Do not release the runloop! service->runloop = nil; DESTROY(service->runloopmode); } UNLOCK(service); } /** * Adds the service to the specified run loop. * * */ - (void) scheduleInRunLoop: (NSRunLoop *) aRunLoop forMode: (NSString *) mode { Service *service; INTERNALTRACE; service = (Service *) _reserved; LOCK(service); { if (service->timer) { [service->timer setFireDate: [NSDate date]]; [service->timer invalidate]; service->timer = nil; } service->timer = RETAIN([NSTimer timerWithTimeInterval: INTERVAL target: self selector: @selector(loop:) userInfo: nil repeats: YES]); service->runloop = aRunLoop; service->runloopmode = mode; } UNLOCK(service); } /** * Attempts to publish a service on the network. * * */ - (void) publishWithFlags: (DNSServiceFlags)flags { Service *service; DNSServiceErrorType err = kDNSServiceErr_NoError; INTERNALTRACE; service = (Service *) _reserved; LOCK(service); { do { // cannot -publish on a service that's init'd for resolving if (NO == service->isPublishing) { err = NSNetServicesBadArgumentError; break; } if (service->timer) { err = NSNetServicesActivityInProgress; break; } if (service->timeout) { [service->timeout setFireDate: [NSDate date]]; [service->timeout invalidate]; service->timeout = nil; } err = DNSServiceRegister((DNSServiceRef *) &_netService, flags, service->interfaceIndex, [[service->info objectForKey: @"Name"] UTF8String], [[service->info objectForKey: @"Type"] UTF8String], [[service->info objectForKey: @"Domain"] UTF8String], NULL, service->port, 0, NULL, RegistrationCallback, self); } while (0); } UNLOCK(service); [self executeWithError: err]; } - (void) publishWithOptions: (NSNetServiceOptions)options { DNSServiceFlags flags = 0; if (options & NSNetServiceNoAutoRename) { flags = flags | kDNSServiceFlagsNoAutoRename; } [self publishWithFlags: flags]; } - (void) publish { [self publishWithFlags: 0]; } /** * This method is deprecated. Use -resolveWithTimeout: instead. * * */ - (void) resolve { INTERNALTRACE; [self resolveWithTimeout: 5]; } /** * Starts a service resolution for a limited duration. * * */ - (void) resolveWithTimeout: (NSTimeInterval) timeout { Service *service; DNSServiceErrorType err = kDNSServiceErr_NoError; DNSServiceFlags flags = 0; INTERNALTRACE; service = (Service *) _reserved; LOCK(service); { do { // cannot -resolve on a service that's init'd for publishing if (YES == service->isPublishing) { err = NSNetServicesBadArgumentError; break; } if (! [self delegate]) { err = NSNetServicesInvalidError; break; } if (service->timer) { err = NSNetServicesActivityInProgress; break; } if (service->timeout) { [service->timeout setFireDate: [NSDate date]]; [service->timeout invalidate]; service->timeout = nil; } service->timeout = [NSTimer alloc]; { NSDate *date = nil; date = [NSDate dateWithTimeIntervalSinceNow: timeout + SHORTTIMEOUT]; [service->timeout initWithFireDate: date interval: INTERVAL target: self selector: @selector(stopResolving:) userInfo: nil repeats: NO]; } err = DNSServiceResolve((DNSServiceRef *) &_netService, flags, service->interfaceIndex, [[service->info objectForKey: @"Name"] UTF8String], [[service->info objectForKey: @"Type"] UTF8String], [[service->info objectForKey: @"Domain"] UTF8String], ResolverCallback, self); } while (0); } UNLOCK(service); [self executeWithError: err]; } /** * Stops the current attempt to publish or resolve a service. * * */ - (void) stop { Service *service; INTERNALTRACE; service = (Service *) _reserved; LOCK(service); { [self cleanup]; [self netServiceDidStop: self]; } UNLOCK(service); } /** * Starts monitoring of TXT record updates. * * */ - (void) startMonitoring { Service *service; INTERNALTRACE; service = (Service *) _reserved; LOCK(service); { // Obviously this will only work on a resolver if (! service->isPublishing) { if (! service->isMonitoring) { service->monitor = [[GSMDNSNetServiceMonitor alloc] initWithDelegate: self]; [service->monitor scheduleInRunLoop: service->runloop forMode: service->runloopmode]; [service->monitor start]; service->isMonitoring = YES; } } } UNLOCK(service); } /** * Stops monitoring of TXT record updates. * * */ - (void) stopMonitoring { Service *service; INTERNALTRACE; service = (Service *) _reserved; LOCK(service); { if (! service->isPublishing) { if (service->isMonitoring) { [service->monitor stop]; // Probably don't need it anymore, so release it DESTROY(service->monitor); service->isMonitoring = NO; } } } UNLOCK(service); } /** * Returns an array of NSData objects that each contain the socket address of * the service. * */ - (NSArray *) addresses { INTERNALTRACE; return [((Service*)_reserved)->info objectForKey: @"Addresses"]; } /** * Returns the domain name of the service. * * */ - (NSString *) domain { INTERNALTRACE; return [((Service*)_reserved)->info objectForKey: @"Domain"]; } /** * Returns the host name of the computer publishing the service. * * */ - (NSString *) hostName { INTERNALTRACE; return [((Service*)_reserved)->info objectForKey: @"Host"]; } /** * Returns the name of the service. * * */ - (NSString *) name { INTERNALTRACE; return [((Service*)_reserved)->info objectForKey: @"Name"]; } - (NSInteger) port { return ntohs(((Service*)_reserved)->port); return 0; } /** * Returns the type of the service. * * */ - (NSString *) type { INTERNALTRACE; return [((Service*)_reserved)->info objectForKey: @"Type"]; } /** * This method is deprecated. Use -TXTRecordData instead. * * */ - (NSString *) protocolSpecificInformation { NSString *retVal = nil; Service *service; INTERNALTRACE; service = (Service *) _reserved; LOCK(service); { retVal = [super protocolSpecificInformation]; } UNLOCK(service); return retVal; } /** * This method is deprecated. Use -setTXTRecordData: instead. * * */ - (void) setProtocolSpecificInformation: (NSString *) specificInformation { Service *service; INTERNALTRACE; service = (Service *) _reserved; // // Again, the following may not be entirely correct... // LOCK(service); { [super setProtocolSpecificInformation: specificInformation]; } UNLOCK(service); } /** * Returns the TXT record. * * */ - (NSData *) TXTRecordData { INTERNALTRACE; return [((Service*)_reserved)->info objectForKey: @"TXT"]; } /** * Sets the TXT record. * * */ - (BOOL) setTXTRecordData: (NSData *) recordData { Service *service; BOOL result = NO; INTERNALTRACE; service = (Service *) _reserved; LOCK(service); { // Not allowed on a resolver... if (service->isPublishing) { DNSServiceErrorType err = kDNSServiceErr_NoError; // Set the value, or remove it if empty if (recordData) { [service->info setObject: recordData forKey: @"TXT"]; } else { [service->info removeObjectForKey: @"TXT"]; } // Assume it worked result = YES; // Now update the record so others can pick it up err = DNSServiceUpdateRecord(_netService, NULL, 0, recordData ? [recordData length] : 0, recordData ? [recordData bytes] : NULL, 0); if (err) { result = NO; } } } UNLOCK(service); return result; } /** * Description forthcoming * * */ - (void) netService: (NSNetService *) sender didUpdateTXTRecordData: (NSData *) data { id delegate = [self delegate]; INTERNALTRACE; if ([delegate respondsToSelector: @selector(netService:didUpdateTXTRecordData:)]) { [delegate netService: sender didUpdateTXTRecordData: data]; } } /** * Description forthcoming * * */ - (void) netService: (NSNetService *) sender didNotMonitor: (NSDictionary *) errorDict { INTERNALTRACE; // This method is kind of a misnomer. It's called whenever NSNetMonitor // encounters an error while monitoring. // All we do is stop monitoring -- which we COULD do from NSNetMonitor // directly, but this seems to be much cleaner. [self stopMonitoring]; } /** * Description forthcoming * * */ - (id) init { DESTROY(self); return self; } /** * Description forthcoming * * */ - (void) dealloc { Service *service; INTERNALTRACE; [self setDelegate: nil]; service = (Service *) _reserved; { LOCK(service); { [self stopMonitoring]; [self cleanup]; DESTROY(service->info); DESTROY(service->foundAddresses); } UNLOCK(service); DESTROYLOCK(service); free(service); } [super dealloc]; } @end @implementation GSMDNSNetServiceMonitor /** * Description forthcoming * * */ + (void) initialize { INTERNALTRACE; SETVERSION(GSMDNSNetServiceMonitor); } /** * Description forthcoming * * */ - (void) loop: (id) sender { int sock = 0; struct timeval tout = { 0 }; fd_set set; DNSServiceErrorType err = kDNSServiceErr_NoError; sock = DNSServiceRefSockFD(_netServiceMonitor); if (-1 != sock) { FD_ZERO(&set); FD_SET(sock, &set); if (1 == select(sock + 1, &set, (fd_set *) NULL, (fd_set *) NULL, &tout)) { err = DNSServiceProcessResult(_netServiceMonitor); } } if (kDNSServiceErr_NoError != err) { LOG(@"Error <%d> while monitoring", err); [_delegate netService: _delegate didNotMonitor: CreateError(self, err)]; } } /** * Description forthcoming * * */ - (void) queryCallback: (DNSServiceRef) sdRef flags: (DNSServiceFlags) flags interface: (uint32_t) interfaceIndex error: (DNSServiceErrorType) errorCode fullname: (const char *) fullname type: (uint16_t) rrtype class: (uint16_t) rrclass length: (uint16_t) rdlen data: (const void *) rdata ttl: (uint32_t) ttl { Monitor *monitor; INTERNALTRACE; monitor = (Monitor *) _reserved; LOCK(monitor); if (_delegate) { // we are 'monitoring' kDNSServiceType_TXT // this is already handled by the delegate's method of the same name // so we simply pass this through [_delegate queryCallback: sdRef flags: flags interface: interfaceIndex error: errorCode fullname: fullname type: rrtype class: rrclass length: rdlen data: rdata ttl: ttl]; } UNLOCK(monitor); } /** * Description forthcoming * * */ - (id) initWithDelegate: (id) delegate { INTERNALTRACE; if ((self = [super init]) != nil) { Monitor *monitor; monitor = malloc(sizeof (struct _Monitor)); memset(monitor, 0, sizeof &monitor); CREATELOCK(monitor); monitor->runloop = nil; monitor->runloopmode = nil; monitor->timer = nil; _netServiceMonitor = NULL; ASSIGN(_delegate, delegate); _reserved = monitor; } return self; } /** * Description forthcoming * * */ - (void) removeFromRunLoop: (NSRunLoop *) aRunLoop forMode: (NSString *) mode { Monitor *monitor; INTERNALTRACE; monitor = (Monitor *) _reserved; LOCK(monitor); { if (monitor->timer) { [monitor->timer setFireDate: [NSDate date]]; [monitor->timer invalidate]; monitor->timer = nil; } // Do not release the runloop! monitor->runloop = nil; // [monitor->runloopmode release]; monitor->runloopmode = nil; } UNLOCK(monitor); } /** * Description forthcoming * * */ - (void) scheduleInRunLoop: (NSRunLoop *) aRunLoop forMode: (NSString *) mode { Monitor *monitor; INTERNALTRACE; monitor = (Monitor *) _reserved; LOCK(monitor); { if (monitor->timer) { [monitor->timer setFireDate: [NSDate date]]; [monitor->timer invalidate]; monitor->timer = nil; } monitor->runloop = aRunLoop; monitor->runloopmode = mode; } UNLOCK(monitor); } /** * Description forthcoming * * */ - (void) start { Monitor *monitor; INTERNALTRACE; monitor = (Monitor *) _reserved; LOCK(monitor); { DNSServiceErrorType err = kDNSServiceErr_NoError; DNSServiceFlags flags = kDNSServiceFlagsLongLivedQuery; NSString *fullname = nil; do { if (! _delegate) { err = NSNetServicesInvalidError; break; } if (monitor->timer) { err = NSNetServicesActivityInProgress; break; } fullname = [NSString stringWithFormat: @"%@.%@%@", [_delegate name], [_delegate type], [_delegate domain]]; err = DNSServiceQueryRecord((DNSServiceRef *) &_netServiceMonitor, flags, 0, [fullname UTF8String], kDNSServiceType_TXT, kDNSServiceClass_IN, QueryCallback, self); if (kDNSServiceErr_NoError == err) { monitor->timer = [NSTimer timerWithTimeInterval: INTERVAL target: self selector: @selector(loop:) userInfo: nil repeats: YES]; [monitor->runloop addTimer: monitor->timer forMode: monitor->runloopmode]; [monitor->timer fire]; } } while (0); } UNLOCK(monitor); } /** * Description forthcoming * * */ - (void) stop { Monitor *monitor; INTERNALTRACE; monitor = (Monitor *) _reserved; LOCK(monitor); { if (monitor->runloop) { [self removeFromRunLoop: monitor->runloop forMode: monitor->runloopmode]; } if (monitor->timer) { [monitor->timer invalidate]; monitor->timer = nil; } if (_netServiceMonitor) { DNSServiceRefDeallocate(_netServiceMonitor); _netServiceMonitor = NULL; } } UNLOCK(monitor); } /** * Description forthcoming * * */ - (id) init { DESTROY(self); return self; } /** * Description forthcoming * * */ - (void) dealloc { Monitor *monitor; INTERNALTRACE; monitor = (Monitor *) _reserved; { LOCK(monitor); { [self stop]; _delegate = nil; } UNLOCK(monitor); DESTROYLOCK(monitor); free(monitor); } [super dealloc]; } @end /** * Description forthcoming * * */ static NSDictionary * CreateError(id sender, int errorCode) { NSMutableDictionary *dictionary = nil; int error = 0; INTERNALTRACE; dictionary = [NSMutableDictionary dictionary]; error = ConvertError(errorCode); LOG(@"%@ says error <%d> - <%d>", [sender description], errorCode, error); [dictionary setObject: [NSNumber numberWithInt: error] forKey: NSNetServicesErrorCode]; [dictionary setObject: sender forKey: NSNetServicesErrorDomain]; return dictionary; // autorelease'd } /** * Description forthcoming * * */ static int ConvertError(int errorCode) { INTERNALTRACE; switch(errorCode) { case kDNSServiceErr_Unknown: return NSNetServicesUnknownError; case kDNSServiceErr_NoSuchName: return NSNetServicesNotFoundError; case kDNSServiceErr_NoMemory: return NSNetServicesUnknownError; case kDNSServiceErr_BadParam: case kDNSServiceErr_BadReference: case kDNSServiceErr_BadState: case kDNSServiceErr_BadFlags: return NSNetServicesBadArgumentError; case kDNSServiceErr_Unsupported: return NSNetServicesUnknownError; case kDNSServiceErr_NotInitialized: return NSNetServicesInvalidError; case kDNSServiceErr_AlreadyRegistered: case kDNSServiceErr_NameConflict: return NSNetServicesCollisionError; case kDNSServiceErr_Invalid: return NSNetServicesInvalidError; case kDNSServiceErr_Firewall: return NSNetServicesUnknownError; case kDNSServiceErr_Incompatible: // The client library is incompatible with the daemon return NSNetServicesInvalidError; case kDNSServiceErr_BadInterfaceIndex: case kDNSServiceErr_Refused: return NSNetServicesUnknownError; case kDNSServiceErr_NoSuchRecord: case kDNSServiceErr_NoAuth: case kDNSServiceErr_NoSuchKey: return NSNetServicesNotFoundError; case kDNSServiceErr_NATTraversal: case kDNSServiceErr_DoubleNAT: case kDNSServiceErr_BadTime: return NSNetServicesUnknownError; } return errorCode; } /** * Description forthcoming * * */ static void DNSSD_API EnumerationCallback(DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType errorCode, const char *replyDomain, void *context) { // NSNetServiceBrowser [(id) context enumCallback: sdRef flags: flags interface: interfaceIndex error: errorCode domain: replyDomain]; } /** * Description forthcoming * * */ static void DNSSD_API BrowserCallback(DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType errorCode, const char *replyName, const char *replyType, const char *replyDomain, void *context) { // NSNetServiceBrowser [(id) context browseCallback: sdRef flags: flags interface: interfaceIndex error: errorCode name: replyName type: replyType domain: replyDomain]; } /** * Description forthcoming * * */ static void DNSSD_API ResolverCallback(DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType errorCode, const char *fullname, const char *hosttarget, uint16_t port, uint16_t txtLen, const unsigned char *txtRecord, void *context) { // NSNetService [(id) context resolverCallback: sdRef flags: flags interface: interfaceIndex error: errorCode fullname: fullname target: hosttarget port: port length: txtLen record: txtRecord]; } /** * Description forthcoming * * */ static void DNSSD_API RegistrationCallback(DNSServiceRef sdRef, DNSServiceFlags flags, DNSServiceErrorType errorCode, const char *name, const char *regtype, const char *domain, void *context) { // NSNetService [(id) context registerCallback: sdRef flags: flags error: errorCode name: name type: regtype domain: domain]; } /** * Description forthcoming * * */ static void DNSSD_API QueryCallback(DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType errorCode, const char *fullname, uint16_t rrtype, uint16_t rrclass, uint16_t rdlen, const void *rdata, uint32_t ttl, void *context) { // NSNetService, NSNetServiceMonitor [(id) context queryCallback: sdRef flags: flags interface: interfaceIndex error: errorCode fullname: fullname type: rrtype class: rrclass length: rdlen data: rdata ttl: ttl]; } gnustep-base-1.29.0/Source/GSMultiHandle.h000066400000000000000000000051771435650067400202750ustar00rootroot00000000000000#ifndef INCLUDED_GSMULTIHANDLE_H #define INCLUDED_GSMULTIHANDLE_H #import "common.h" #import #import "GSDispatch.h" @class NSURLSessionConfiguration; @class GSEasyHandle; /* * Minimal wrapper around curl multi interface * (https://curl.haxx.se/libcurl/c/libcurl-multi.html). * * The the *multi handle* manages the sockets for easy handles * (`GSEasyHandle`), and this implementation uses * libdispatch to listen for sockets being read / write ready. * * Using `dispatch_source_t` allows this implementation to be * non-blocking and all code to run on the same thread * thus keeping is simple. * * - SeeAlso: GSEasyHandle */ @interface GSMultiHandle : NSObject { CURLM *_rawHandle; } - (CURLM*) rawHandle; - (instancetype) initWithConfiguration: (NSURLSessionConfiguration*)configuration workQueue: (dispatch_queue_t)workQueque; - (void) addHandle: (GSEasyHandle*)easyHandle; - (void) removeHandle: (GSEasyHandle*)easyHandle; - (void) updateTimeoutTimerToValue: (NSInteger)value; @end // What read / write ready event to register / unregister. typedef NS_ENUM(NSUInteger, GSSocketRegisterActionType) { GSSocketRegisterActionTypeNone = 0, GSSocketRegisterActionTypeRegisterRead, GSSocketRegisterActionTypeRegisterWrite, GSSocketRegisterActionTypeRegisterReadAndWrite, GSSocketRegisterActionTypeUnregister, }; @interface GSSocketRegisterAction : NSObject { GSSocketRegisterActionType _type; } - (instancetype) initWithRawValue: (int)rawValue; - (GSSocketRegisterActionType) type; - (BOOL) needsReadSource; - (BOOL) needsWriteSource; - (BOOL) needsSource; @end /* * Read and write libdispatch sources for a specific socket. * * A simple helper that combines two sources -- both being optional. * * This info is stored into the socket using `curl_multi_assign()`. * * - SeeAlso: GSSocketRegisterAction */ @interface GSSocketSources : NSObject { dispatch_source_t _readSource; dispatch_source_t _writeSource; } - (void) createSourcesWithAction: (GSSocketRegisterAction *)action socket: (curl_socket_t)socket queue: (dispatch_queue_t)queue handler: (dispatch_block_t)handler; - (void) createReadSourceWithSocket: (curl_socket_t)socket queue: (dispatch_queue_t)queue handler: (dispatch_block_t)handler; - (void) createWriteSourceWithSocket: (curl_socket_t)socket queue: (dispatch_queue_t)queue handler: (dispatch_block_t)handler; + (instancetype) from: (void*)socketSourcePtr; @end #endif gnustep-base-1.29.0/Source/GSMultiHandle.m000066400000000000000000000325161435650067400202770ustar00rootroot00000000000000#import "GSMultiHandle.h" #import "GSTimeoutSource.h" #import "GSEasyHandle.h" #import "Foundation/NSArray.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSError.h" #import "Foundation/NSException.h" #import "Foundation/NSURLError.h" #import "Foundation/NSURLSession.h" @interface GSMultiHandle () - (void) performActionForSocket: (int)socket; - (void) readAndWriteAvailableDataOnSocket: (int)socket; - (void) readMessages; - (void) completedTransferForEasyHandle: (CURL*)rawEasyHandle easyCode: (int)easyCode; - (int32_t) registerWithSocket: (curl_socket_t)socket what: (int)what socketSourcePtr: (void *)socketSourcePtr; @end static void handleEasyCode(int code) { if (CURLE_OK != code) { NSString *reason; NSException *e; reason = [NSString stringWithFormat: @"An error occurred, CURLcode is %d", code]; e = [NSException exceptionWithName: @"libcurl.easy" reason: reason userInfo: nil]; [e raise]; } } static void handleMultiCode(int code) { if (CURLM_OK != code) { NSString *reason; NSException *e; reason = [NSString stringWithFormat: @"An error occurred, CURLcode is %d", code]; e = [NSException exceptionWithName: @"libcurl.multi" reason: reason userInfo: nil]; [e raise]; } } static int curl_socket_function(CURL *easyHandle, curl_socket_t socket, int what, void *userdata, void *socketptr) { GSMultiHandle *handle = (GSMultiHandle*)userdata; return [handle registerWithSocket: socket what: what socketSourcePtr: socketptr]; } static int curl_timer_function(CURL *easyHandle, int timeout, void *userdata) { GSMultiHandle *handle = (GSMultiHandle*)userdata; [handle updateTimeoutTimerToValue: timeout]; return 0; } @implementation GSMultiHandle { NSMutableArray *_easyHandles; dispatch_queue_t _queue; GSTimeoutSource *_timeoutSource; } - (CURLM*) rawHandle { return _rawHandle; } - (instancetype) initWithConfiguration: (NSURLSessionConfiguration*)conf workQueue: (dispatch_queue_t)aQueue { if (nil != (self = [super init])) { _rawHandle = curl_multi_init(); _easyHandles = [[NSMutableArray alloc] init]; #if HAVE_DISPATCH_QUEUE_CREATE_WITH_TARGET _queue = dispatch_queue_create_with_target("GSMultiHandle.isolation", DISPATCH_QUEUE_SERIAL, aQueue); #else _queue = dispatch_queue_create("GSMultiHandle.isolation", DISPATCH_QUEUE_SERIAL); dispatch_set_target_queue(_queue, aQueue); #endif [self setupCallbacks]; [self configureWithConfiguration: conf]; } return self; } - (void) dealloc { NSEnumerator *e; GSEasyHandle *handle; DESTROY(_timeoutSource); e = [_easyHandles objectEnumerator]; while (nil != (handle = [e nextObject])) { curl_multi_remove_handle([handle rawHandle], _rawHandle); } DESTROY(_easyHandles); curl_multi_cleanup(_rawHandle); [super dealloc]; } - (void) configureWithConfiguration: (NSURLSessionConfiguration*)configuration { handleEasyCode(curl_multi_setopt(_rawHandle, CURLMOPT_MAX_HOST_CONNECTIONS, [configuration HTTPMaximumConnectionsPerHost])); handleEasyCode(curl_multi_setopt(_rawHandle, CURLMOPT_PIPELINING, [configuration HTTPShouldUsePipelining] ? CURLPIPE_MULTIPLEX : CURLPIPE_NOTHING)); } - (void)setupCallbacks { handleEasyCode(curl_multi_setopt(_rawHandle, CURLMOPT_SOCKETDATA, (void*)self)); handleEasyCode(curl_multi_setopt(_rawHandle, CURLMOPT_SOCKETFUNCTION, curl_socket_function)); handleEasyCode(curl_multi_setopt(_rawHandle, CURLMOPT_TIMERDATA, (__bridge void *)self)); handleEasyCode(curl_multi_setopt(_rawHandle, CURLMOPT_TIMERFUNCTION, curl_timer_function)); } - (void) addHandle: (GSEasyHandle*)easyHandle { // If this is the first handle being added, we need to `kick` the // underlying multi handle by calling `timeoutTimerFired` as // described in // . // That will initiate the registration for timeout timer and socket // readiness. BOOL needsTimeout = false; if ([_easyHandles count] == 0) { needsTimeout = YES; } [_easyHandles addObject: easyHandle]; handleMultiCode(curl_multi_add_handle(_rawHandle, [easyHandle rawHandle])); if (needsTimeout) { [self timeoutTimerFired]; } } - (void) removeHandle: (GSEasyHandle*)easyHandle { NSEnumerator *e; int idx = 0; BOOL found = NO; GSEasyHandle *h; e = [_easyHandles objectEnumerator]; while (nil != (h = [e nextObject])) { if ([h rawHandle] == [easyHandle rawHandle]) { found = YES; break; } idx++; } NSAssert(found, @"Handle not in list."); handleMultiCode(curl_multi_remove_handle(_rawHandle, [easyHandle rawHandle])); [_easyHandles removeObjectAtIndex: idx]; } - (void) updateTimeoutTimerToValue: (NSInteger)value { // A timeout_ms value of -1 passed to this callback means you should delete // the timer. All other values are valid expire times in number // of milliseconds. if (-1 == value) { DESTROY(_timeoutSource); } else if (0 == value) { DESTROY(_timeoutSource); dispatch_async(_queue, ^{ [self timeoutTimerFired]; }); } else { if (nil == _timeoutSource || value != [_timeoutSource milliseconds]) { DESTROY(_timeoutSource); _timeoutSource = [[GSTimeoutSource alloc] initWithQueue: _queue milliseconds: value handler: ^{ [self timeoutTimerFired]; }]; } } } - (void) performActionForSocket: (int)socket { [self readAndWriteAvailableDataOnSocket: socket]; } - (void)timeoutTimerFired { [self readAndWriteAvailableDataOnSocket: CURL_SOCKET_TIMEOUT]; } - (void) readAndWriteAvailableDataOnSocket: (int)socket { int runningHandlesCount = 0; handleMultiCode(curl_multi_socket_action(_rawHandle, socket, 0, &runningHandlesCount)); [self readMessages]; } /// Check the status of all individual transfers. /// /// libcurl refers to this as “read multi stack informationalsâ€. /// Check for transfers that completed. - (void) readMessages { while (true) { int count = 0; CURLMsg *msg; CURL *easyHandle; int code; msg = curl_multi_info_read(_rawHandle, &count); if (NULL == msg || CURLMSG_DONE != msg->msg || !msg->easy_handle) break; easyHandle = msg->easy_handle; code = msg->data.result; [self completedTransferForEasyHandle: easyHandle easyCode: code]; } } - (void) completedTransferForEasyHandle: (CURL*)rawEasyHandle easyCode: (int)easyCode { NSEnumerator *e; GSEasyHandle *h; GSEasyHandle *handle = nil; NSError *err = nil; int errCode; e = [_easyHandles objectEnumerator]; while (nil != (h = [e nextObject])) { if ([h rawHandle] == rawEasyHandle) { handle = h; break; } } NSAssert(nil != handle, @"Transfer completed for easy handle" @", but it is not in the list of added handles."); errCode = [handle urlErrorCodeWithEasyCode: easyCode]; if (0 != errCode) { NSString *d = nil; if ([handle errorBuffer][0] == 0) { const char *description = curl_easy_strerror(errCode); d = [[NSString alloc] initWithCString: description encoding: NSUTF8StringEncoding]; } else { d = [[NSString alloc] initWithCString: [handle errorBuffer] encoding: NSUTF8StringEncoding]; } err = [NSError errorWithDomain: NSURLErrorDomain code: errCode userInfo: @{NSLocalizedDescriptionKey : d}]; RELEASE(d); } [handle transferCompletedWithError: err]; } - (int32_t) registerWithSocket: (curl_socket_t)socket what: (int)what socketSourcePtr: (void *)socketSourcePtr { // We get this callback whenever we need to register or unregister a // given socket with libdispatch. // The `action` / `what` defines if we should register or unregister // that we're interested in read and/or write readiness. We will do so // through libdispatch (DispatchSource) and store the source(s) inside // a `SocketSources` which we in turn store inside libcurl's multi handle // by means of curl_multi_assign() -- we retain the object first. GSSocketRegisterAction *action; GSSocketSources *socketSources; action = [[GSSocketRegisterAction alloc] initWithRawValue: what]; socketSources = [GSSocketSources from: socketSourcePtr]; if (nil == socketSources && [action needsSource]) { GSSocketSources *s; s = [[GSSocketSources alloc] init]; curl_multi_assign(_rawHandle, socket, (void*)s); socketSources = s; } else if (nil != socketSources && GSSocketRegisterActionTypeUnregister == [action type]) { DESTROY(socketSources); } if (nil != socketSources) { [socketSources createSourcesWithAction: action socket: socket queue: _queue handler: ^{ [self performActionForSocket: socket]; }]; } RELEASE(action); return 0; } @end @implementation GSSocketRegisterAction - (instancetype) initWithRawValue: (int)rawValue { if (nil != (self = [super init])) { switch (rawValue) { case CURL_POLL_NONE: _type = GSSocketRegisterActionTypeNone; break; case CURL_POLL_IN: _type = GSSocketRegisterActionTypeRegisterRead; break; case CURL_POLL_OUT: _type = GSSocketRegisterActionTypeRegisterWrite; break; case CURL_POLL_INOUT: _type = GSSocketRegisterActionTypeRegisterReadAndWrite; break; case CURL_POLL_REMOVE: _type = GSSocketRegisterActionTypeUnregister; break; default: NSAssert(NO, @"Invalid CURL_POLL value"); } } return self; } - (GSSocketRegisterActionType) type { return _type; } - (BOOL) needsReadSource { switch (self.type) { case GSSocketRegisterActionTypeNone: return false; case GSSocketRegisterActionTypeRegisterRead: return true; case GSSocketRegisterActionTypeRegisterWrite: return false; case GSSocketRegisterActionTypeRegisterReadAndWrite: return true; case GSSocketRegisterActionTypeUnregister: return false; } } - (BOOL) needsWriteSource { switch (self.type) { case GSSocketRegisterActionTypeNone: return false; case GSSocketRegisterActionTypeRegisterRead: return false; case GSSocketRegisterActionTypeRegisterWrite: return true; case GSSocketRegisterActionTypeRegisterReadAndWrite: return true; case GSSocketRegisterActionTypeUnregister: return false; } } - (BOOL)needsSource { return [self needsReadSource] || [self needsWriteSource]; } @end @implementation GSSocketSources - (void) dealloc { if (_readSource) { dispatch_source_cancel(_readSource); } _readSource = NULL; if (_writeSource) { dispatch_source_cancel(_writeSource); } _writeSource = NULL; [super dealloc]; } - (void) createSourcesWithAction: (GSSocketRegisterAction*)action socket: (curl_socket_t)socket queue: (dispatch_queue_t)queue handler: (dispatch_block_t)handler { if ([action needsReadSource]) { [self createReadSourceWithSocket: socket queue: queue handler: handler]; } if ([action needsWriteSource]) { [self createWriteSourceWithSocket: socket queue: queue handler: handler]; } } - (void) createReadSourceWithSocket: (curl_socket_t)socket queue: (dispatch_queue_t)queue handler: (dispatch_block_t)handler { dispatch_source_t s; if (_readSource) { return; } s = dispatch_source_create(DISPATCH_SOURCE_TYPE_READ, socket, 0, queue); dispatch_source_set_event_handler(s, handler); _readSource = s; dispatch_resume(s); } - (void) createWriteSourceWithSocket: (curl_socket_t)socket queue: (dispatch_queue_t)queue handler: (dispatch_block_t)handler { dispatch_source_t s; if (_writeSource) { return; } s = dispatch_source_create(DISPATCH_SOURCE_TYPE_WRITE, socket, 0, queue); dispatch_source_set_event_handler(s, handler); _writeSource = s; dispatch_resume(s); } + (instancetype) from: (void*)socketSourcePtr { if (!socketSourcePtr) { return nil; } else { return (GSSocketSources*)socketSourcePtr; } } @end gnustep-base-1.29.0/Source/GSNativeProtocol.h000066400000000000000000000064221435650067400210310ustar00rootroot00000000000000#ifndef INCLUDED_GSNATIVEPROTOCOL_H #define INCLUDED_GSNATIVEPROTOCOL_H #import "GSEasyHandle.h" #import "Foundation/NSURLProtocol.h" @class GSTransferState; typedef NS_ENUM(NSUInteger, GSCompletionActionType) { GSCompletionActionTypeCompleteTask, GSCompletionActionTypeFailWithError, GSCompletionActionTypeRedirectWithRequest, }; // Action to be taken after a transfer completes @interface GSCompletionAction : NSObject { GSCompletionActionType _type; int _errorCode; NSURLRequest *_redirectRequest; } - (GSCompletionActionType) type; - (void) setType: (GSCompletionActionType) type; - (int) errorCode; - (void) setErrorCode: (int)code; - (NSURLRequest*) redirectRequest; - (void) setRedirectRequest: (NSURLRequest*)request; @end typedef NS_ENUM(NSUInteger, GSNativeProtocolInternalState) { // Task has been created, but nothing has been done, yet GSNativeProtocolInternalStateInitial, // The task is being fulfilled from the cache rather than the network. GSNativeProtocolInternalStateFulfillingFromCache, // The easy handle has been fully configured. But it is not added to // the multi handle. GSNativeProtocolInternalStateTransferReady, // The easy handle is currently added to the multi handle GSNativeProtocolInternalStateTransferInProgress, // The transfer completed. // The easy handle has been removed from the multi handle. This does // not necessarily mean the task completed. A task that gets // redirected will do multiple transfers. GSNativeProtocolInternalStateTransferCompleted, // The transfer failed. // Same as `GSNativeProtocolInternalStateTransferCompleted`, // but without response / body data GSNativeProtocolInternalStateTransferFailed, // Waiting for the completion handler of the HTTP redirect callback. // When we tell the delegate that we're about to perform an HTTP // redirect, we need to wait for the delegate to let us know what // action to take. GSNativeProtocolInternalStateWaitingForRedirectCompletionHandler, // Waiting for the completion handler of the 'did receive response' callback. // When we tell the delegate that we received a response (i.e. when // we received a complete header), we need to wait for the delegate to // let us know what action to take. In this state the easy handle is // paused in order to suspend delegate callbacks. GSNativeProtocolInternalStateWaitingForResponseCompletionHandler, // The task is completed // Contrast this with `GSNativeProtocolInternalStateTransferCompleted`. GSNativeProtocolInternalStateTaskCompleted, }; // This abstract class has the common implementation of Native protocols like // HTTP, FTP, etc. // These are libcurl helpers for the URLSession API code. @interface GSNativeProtocol : NSURLProtocol { GSEasyHandle *_easyHandle; GSNativeProtocolInternalState _internalState; GSTransferState *_transferState; } - (void) setInternalState: (GSNativeProtocolInternalState)newState; - (void) failWithError: (NSError*)error request: (NSURLRequest*)request; - (void) completeTaskWithError: (NSError*)error; - (void) completeTask; - (void) startNewTransferWithRequest: (NSURLRequest*)request; @end #endif gnustep-base-1.29.0/Source/GSNativeProtocol.m000066400000000000000000000600571435650067400210420ustar00rootroot00000000000000#import "GSURLPrivate.h" #import "GSNativeProtocol.h" #import "GSTransferState.h" #import "GSURLSessionTaskBody.h" #import "Foundation/NSData.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSError.h" #import "Foundation/NSException.h" #import "Foundation/NSOperation.h" #import "Foundation/NSURL.h" #import "Foundation/NSURLError.h" #import "Foundation/NSURLSession.h" #import "Foundation/NSFileHandle.h" static BOOL isEasyHandlePaused(GSNativeProtocolInternalState state) { switch (state) { case GSNativeProtocolInternalStateInitial: return NO; case GSNativeProtocolInternalStateFulfillingFromCache: return NO; case GSNativeProtocolInternalStateTransferReady: return NO; case GSNativeProtocolInternalStateTransferInProgress: return NO; case GSNativeProtocolInternalStateTransferCompleted: return NO; case GSNativeProtocolInternalStateTransferFailed: return NO; case GSNativeProtocolInternalStateWaitingForRedirectCompletionHandler: return NO; case GSNativeProtocolInternalStateWaitingForResponseCompletionHandler: return YES; case GSNativeProtocolInternalStateTaskCompleted: return NO; } } static BOOL isEasyHandleAddedToMultiHandle(GSNativeProtocolInternalState state) { switch (state) { case GSNativeProtocolInternalStateInitial: return NO; case GSNativeProtocolInternalStateFulfillingFromCache: return NO; case GSNativeProtocolInternalStateTransferReady: return NO; case GSNativeProtocolInternalStateTransferInProgress: return YES; case GSNativeProtocolInternalStateTransferCompleted: return NO; case GSNativeProtocolInternalStateTransferFailed: return NO; case GSNativeProtocolInternalStateWaitingForRedirectCompletionHandler: return NO; case GSNativeProtocolInternalStateWaitingForResponseCompletionHandler: return YES; case GSNativeProtocolInternalStateTaskCompleted: return NO; } } @interface NSURLSession (Internal) - (void) removeHandle: (GSEasyHandle*)handle; - (void) addHandle: (GSEasyHandle*)handle; @end @implementation NSURLSession (Internal) - (void) removeHandle: (GSEasyHandle*)handle { [_multiHandle removeHandle: handle]; } - (void) addHandle: (GSEasyHandle*)handle { [_multiHandle addHandle: handle]; } @end @interface NSURLSessionTask (Internal) - (void) setCurrentRequest: (NSURLRequest*)request; - (dispatch_queue_t) workQueue; - (NSUInteger) suspendCount; - (void) getBodyWithCompletion: (void (^)(GSURLSessionTaskBody *body))completion; - (void) setKnownBody: (GSURLSessionTaskBody*)body; - (void) setError: (NSError*)error; - (void) setCountOfBytesReceived: (int64_t)count; @end @implementation NSURLSessionTask (Internal) - (void) setCurrentRequest: (NSURLRequest*)request { ASSIGN(_currentRequest, request); } - (dispatch_queue_t) workQueue { return _workQueue; } - (NSUInteger) suspendCount { return _suspendCount; } - (void) getBodyWithCompletion: (void (^)(GSURLSessionTaskBody *body))completion { if (nil != _knownBody) { completion(_knownBody); return; }; GSURLSessionTaskBody *body = AUTORELEASE([[GSURLSessionTaskBody alloc] init]); completion(body); } - (void) setKnownBody: (GSURLSessionTaskBody*)body { ASSIGN(_knownBody, body); } - (void) setError: (NSError*)error { ASSIGN(_error, error); } - (void) setCountOfBytesReceived: (int64_t)count { _countOfBytesReceived = count; } @end @implementation GSCompletionAction - (void) dealloc { DESTROY(_redirectRequest); [super dealloc]; } - (GSCompletionActionType) type { return _type; } - (void) setType: (GSCompletionActionType) type { _type = type; } - (int) errorCode { return _errorCode; } - (void) setErrorCode: (int)code { _errorCode = code; } - (NSURLRequest*) redirectRequest { return _redirectRequest; } - (void) setRedirectRequest: (NSURLRequest*)request { ASSIGN(_redirectRequest, request); } @end @implementation GSNativeProtocol - (instancetype) initWithTask: (NSURLSessionTask*)_task cachedResponse: (NSCachedURLResponse*)_cachedResponse client: (id)_client { if (nil != (self = [super initWithTask: _task cachedResponse: _cachedResponse client: _client])) { _internalState = GSNativeProtocolInternalStateInitial; _easyHandle = [[GSEasyHandle alloc] initWithDelegate: self]; } return self; } - (void) dealloc { DESTROY(_easyHandle); DESTROY(_transferState); [super dealloc]; } + (NSURLRequest*) canonicalRequestForRequest: (NSURLRequest*)request { return request; } - (void) startLoading { [self resume]; } - (void) stopLoading { NSURLSessionTask *task; if (nil != (task = [self task]) && NSURLSessionTaskStateSuspended == [task state]) { [self suspend]; } else { [self setInternalState: GSNativeProtocolInternalStateTransferFailed]; NSAssert(nil != [task error], @"Missing error for failed task"); [self completeTaskWithError: [task error]]; } } - (void) setInternalState: (GSNativeProtocolInternalState)newState { NSURLSessionTask *task; GSNativeProtocolInternalState oldState; if (!isEasyHandlePaused(_internalState) && isEasyHandlePaused(newState)) { NSAssert(NO, @"Need to solve pausing receive."); } if (isEasyHandleAddedToMultiHandle(_internalState) && !isEasyHandleAddedToMultiHandle(newState)) { if (nil != (task = [self task])) { [[task session] removeHandle: _easyHandle]; } } oldState = _internalState; _internalState = newState; if (!isEasyHandleAddedToMultiHandle(oldState) && isEasyHandleAddedToMultiHandle(_internalState)) { if (nil != (task = [self task])) { [[task session] addHandle: _easyHandle]; } } if (isEasyHandlePaused(oldState) && !isEasyHandlePaused(_internalState)) { NSAssert(NO, @"Need to solve pausing receive."); } } - (void) startNewTransferWithRequest: (NSURLRequest*)request { NSURLSessionTask *task = [self task]; [task setCurrentRequest: request]; NSAssert(nil != [request URL], @"No URL in request."); [task getBodyWithCompletion: ^(GSURLSessionTaskBody *body) { [task setKnownBody: body]; [self setInternalState: GSNativeProtocolInternalStateTransferReady]; ASSIGN(_transferState, [self createTransferStateWithURL: [request URL] body: body workQueue: [task workQueue]]); [self configureEasyHandleForRequest: request body: body]; if ([task suspendCount] < 1) { [self resume]; } }]; } - (void) configureEasyHandleForRequest: (NSURLRequest*)request body: (GSURLSessionTaskBody*)body { NSAssert(NO, @"Requires concrete implementation"); } - (GSTransferState*) createTransferStateWithURL: (NSURL*)url body: (GSURLSessionTaskBody*)body workQueue: (dispatch_queue_t)workQueue { GSDataDrain *drain = [self createTransferBodyDataDrain]; switch ([body type]) { case GSURLSessionTaskBodyTypeNone: return AUTORELEASE([[GSTransferState alloc] initWithURL: url bodyDataDrain: drain]); case GSURLSessionTaskBodyTypeData: { GSBodyDataSource *source; source = AUTORELEASE([[GSBodyDataSource alloc] initWithData: [body data]]); return AUTORELEASE([[GSTransferState alloc] initWithURL: url bodyDataDrain: drain bodySource: source]); } case GSURLSessionTaskBodyTypeFile: { GSBodyFileSource *source; source = AUTORELEASE([[GSBodyFileSource alloc] initWithFileURL: [body fileURL] workQueue: workQueue dataAvailableHandler: ^{ [_easyHandle unpauseSend]; }]); return AUTORELEASE([[GSTransferState alloc] initWithURL: url bodyDataDrain: drain bodySource: source]); } case GSURLSessionTaskBodyTypeStream: { GSBodyStreamSource *source; source = AUTORELEASE([[GSBodyStreamSource alloc] initWithInputStream: [body inputStream]]); return AUTORELEASE([[GSTransferState alloc] initWithURL: url bodyDataDrain: drain bodySource: source]); } } } // The data drain. // This depends on what the delegate need. - (GSDataDrain*) createTransferBodyDataDrain { NSURLSession *s = [[self task] session]; GSDataDrain *dd = AUTORELEASE([[GSDataDrain alloc] init]); if (nil != [s delegate]) { // Data will be forwarded to the delegate as we receive it, we don't // need to do anything about it. [dd setType: GSDataDrainTypeIgnore]; return dd; } else { [dd setType: GSDataDrainTypeIgnore]; return dd; } } - (void) resume { NSURLSessionTask *task; task = [self task]; if (_internalState == GSNativeProtocolInternalStateInitial) { NSAssert(nil != [task originalRequest], @"Task has no original request."); // Check if the cached response is good to use: if (nil != [self cachedResponse] && [self canRespondFromCacheUsing: [self cachedResponse]]) { [self setInternalState: GSNativeProtocolInternalStateFulfillingFromCache]; dispatch_async([task workQueue], ^{ id client; client = [self client]; [client URLProtocol: self cachedResponseIsValid: [self cachedResponse]]; [client URLProtocol: self didReceiveResponse: [[self cachedResponse] response] cacheStoragePolicy: NSURLCacheStorageNotAllowed]; if ([[[self cachedResponse] data] length] > 0) { if ([client respondsToSelector: @selector(URLProtocol:didLoad:)]) { [client URLProtocol: self didLoadData: [[self cachedResponse] data]]; } } if ([client respondsToSelector: @selector(URLProtocolDidFinishLoading:)]) { [client URLProtocolDidFinishLoading: self]; } [self setInternalState: GSNativeProtocolInternalStateTaskCompleted]; }); } else { [self startNewTransferWithRequest: [task originalRequest]]; } } if (_internalState == GSNativeProtocolInternalStateTransferReady && nil != _transferState) { [self setInternalState: GSNativeProtocolInternalStateTransferInProgress]; } } - (BOOL) canRespondFromCacheUsing: (NSCachedURLResponse*)response { // Allows a native protocol to process a cached response. // If `YES` is returned, the protocol will replay the cached response // instead of starting a new transfer. The default implementation invalidates // the response in the cache and returns `NO`. NSURLCache *cache; NSURLSessionTask *task; task = [self task]; cache = [[[task session] configuration] URLCache]; if (nil != cache && [task isKindOfClass: [NSURLSessionDataTask class]]) { [cache removeCachedResponseForDataTask: (NSURLSessionDataTask*)task]; } return NO; } - (void) suspend { if (_internalState == GSNativeProtocolInternalStateTransferInProgress) { [self setInternalState: GSNativeProtocolInternalStateTransferReady]; } } - (void) completeTaskWithError: (NSError*)error { [[self task] setError: error]; NSAssert(_internalState == GSNativeProtocolInternalStateTransferFailed, @"Trying to complete the task, but its transfer isn't complete / failed."); // We don't want a timeout to be triggered after this. // The timeout timer needs to be cancelled. [_easyHandle setTimeoutTimer: nil]; [self setInternalState: GSNativeProtocolInternalStateTaskCompleted]; } - (GSEasyHandleAction) didReceiveData: (NSData*)data { NSURLResponse *response; NSAssert(GSNativeProtocolInternalStateTransferInProgress == _internalState, @"Received body data, but no transfer in progress."); response = [self validateHeaderCompleteTransferState: _transferState]; if (nil != response) { [_transferState setResponse: response]; } [self notifyDelegateAboutReceivedData: data]; _internalState = GSNativeProtocolInternalStateTransferInProgress; ASSIGN(_transferState, [_transferState byAppendingBodyData: data]); return GSEasyHandleActionProceed; } - (NSURLResponse*) validateHeaderCompleteTransferState: (GSTransferState*)ts { if (![ts isHeaderComplete]) { NSAssert(NO, @"Received body data, but the header is not complete, yet."); } return nil; } - (void) notifyDelegateAboutReceivedData: (NSData*)data { NSURLSession *session; NSURLSessionTask *task; id delegate; task = [self task]; NSAssert(nil != task, @"Cannot notify"); session = [task session]; NSAssert(nil != session, @"Missing session"); delegate = [session delegate]; if (nil != delegate && [task isKindOfClass: [NSURLSessionDataTask class]] && [delegate respondsToSelector: @selector(URLSession:dataTask:didReceiveData:)]) { id dataDelegate; NSURLSessionDataTask *dataTask; dataDelegate = (id)delegate; dataTask = (NSURLSessionDataTask*)task; [[session delegateQueue] addOperationWithBlock: ^{ [dataDelegate URLSession: session dataTask: dataTask didReceiveData: data]; }]; } /* Don't check whether delegate respondsToSelector. * This delegate is optional. */ if (nil != delegate && [task isKindOfClass: [NSURLSessionDownloadTask class]]) { id downloadDelegate; NSURLSessionDownloadTask *downloadTask; GSDataDrain *dataDrain; NSFileHandle *fileHandle; downloadDelegate = (id)delegate; downloadTask = (NSURLSessionDownloadTask*)task; dataDrain = [_transferState bodyDataDrain]; /* Write to file. GSDataDrain opens the fileHandle. */ fileHandle = [dataDrain fileHandle]; [fileHandle seekToEndOfFile]; [fileHandle writeData: data]; if ([delegate respondsToSelector: @selector (URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:)]) { /* Calculate received data length */ [task setCountOfBytesReceived: (int64_t)[data length] + [task countOfBytesReceived]]; [[session delegateQueue] addOperationWithBlock: ^{ [downloadDelegate URLSession: session downloadTask: downloadTask didWriteData: (int64_t)[data length] totalBytesWritten: [task countOfBytesReceived] totalBytesExpectedToWrite: [task countOfBytesExpectedToReceive]]; }]; } } } - (void) notifyDelegateAboutUploadedDataCount: (int64_t)count { NSURLSessionTask *task; id delegate; task = [self task]; NSAssert(nil != task, @"Cannot notify"); delegate = [[task session] delegate]; if (nil != delegate && [task isKindOfClass: [NSURLSessionUploadTask class]] && [delegate respondsToSelector: @selector(URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:)]) { id taskDelegate; NSURLSession *session; session = [task session]; NSAssert(nil != session, @"Missing session"); taskDelegate = (id)delegate; [[session delegateQueue] addOperationWithBlock: ^{ [taskDelegate URLSession: session task: task didSendBodyData: count totalBytesSent: [task countOfBytesSent] totalBytesExpectedToSend: [task countOfBytesExpectedToSend]]; }]; } } - (GSEasyHandleAction) didReceiveHeaderData: (NSData*)data contentLength: (int64_t)contentLength { NSAssert(NO, @"Require concrete implementation"); return GSEasyHandleActionAbort; } - (void) fillWriteBufferLength: (NSInteger)length result: (void (^)(GSEasyHandleWriteBufferResult result, NSInteger length, NSData *data))result { id source; NSAssert(GSNativeProtocolInternalStateTransferInProgress == _internalState, @"Requested to fill write buffer, but transfer isn't in progress."); source = [_transferState requestBodySource]; NSAssert(nil != source, @"Requested to fill write buffer, but transfer state has no body source."); if (nil == result) { return; } [source getNextChunkWithLength: length completionHandler: ^(GSBodySourceDataChunk chunk, NSData *_Nullable data) { switch (chunk) { case GSBodySourceDataChunkData: { NSUInteger count = [data length]; [self notifyDelegateAboutUploadedDataCount: (int64_t)count]; result(GSEasyHandleWriteBufferResultBytes, count, data); break; } case GSBodySourceDataChunkDone: result(GSEasyHandleWriteBufferResultBytes, 0, nil); break; case GSBodySourceDataChunkRetryLater: // At this point we'll try to pause the easy handle. The body // source is responsible for un-pausing the handle once data // becomes available. result(GSEasyHandleWriteBufferResultPause, -1, nil); break; case GSBodySourceDataChunkError: result(GSEasyHandleWriteBufferResultAbort, -1, nil); break; } }]; } - (void) transferCompletedWithError: (NSError*)error { /* At this point the transfer is complete and we can decide what to do. * If everything went well, we will simply forward the resulting data * to the delegate. But in case of redirects etc. we might send another * request. */ NSURLRequest *request; NSURLResponse *response; GSCompletionAction *action; if (nil != error) { [self setInternalState: GSNativeProtocolInternalStateTransferFailed]; [self failWithError: error request: [self request]]; return; } NSAssert(_internalState == GSNativeProtocolInternalStateTransferInProgress, @"Transfer completed, but it wasn't in progress."); request = [[self task] currentRequest]; NSAssert(nil != request, @"Transfer completed, but there's no current request."); if (nil != [[self task] response]) { [_transferState setResponse: [[self task] response]]; } response = [_transferState response]; NSAssert(nil != response, @"Transfer completed, but there's no response."); [self setInternalState: GSNativeProtocolInternalStateTransferCompleted]; action = [self completeActionForCompletedRequest: request response: response]; switch ([action type]) { case GSCompletionActionTypeCompleteTask: [self completeTask]; break; case GSCompletionActionTypeFailWithError: [self setInternalState: GSNativeProtocolInternalStateTransferFailed]; error = [NSError errorWithDomain: NSURLErrorDomain code: [action errorCode] userInfo: nil]; [self failWithError: error request: request]; break; case GSCompletionActionTypeRedirectWithRequest: [self redirectForRequest: [action redirectRequest]]; break; } } - (GSCompletionAction*) completeActionForCompletedRequest: (NSURLRequest*)request response: (NSURLResponse*)response { GSCompletionAction *action; action = AUTORELEASE([[GSCompletionAction alloc] init]); [action setType: GSCompletionActionTypeCompleteTask]; return action; } - (void) completeTask { NSURLSessionTask *task; GSDataDrain *bodyDataDrain; id client; id delegate; NSAssert(_internalState == GSNativeProtocolInternalStateTransferCompleted, @"Trying to complete the task, but its transfer isn't complete."); task = [self task]; [task setResponse: [_transferState response]]; client = [self client]; delegate = [[task session] delegate]; // We don't want a timeout to be triggered after this. The timeout timer // needs to be cancelled. [_easyHandle setTimeoutTimer: nil]; // because we deregister the task with the session on internalState being set // to taskCompleted we need to do the latter after the delegate/handler was // notified/invoked bodyDataDrain = [_transferState bodyDataDrain]; if (GSDataDrainInMemory == [bodyDataDrain type]) { NSData *data; if (nil != [bodyDataDrain data]) { data = [NSData dataWithData: [bodyDataDrain data]]; } else { data = [NSData data]; } if ([client respondsToSelector: @selector(URLProtocol:didLoadData:)]) { [client URLProtocol: self didLoadData: data]; } [self setInternalState: GSNativeProtocolInternalStateTaskCompleted]; } // Add temporary file URL to NSURLRequest properties // and close the fileHandle if (nil != delegate && [task isKindOfClass: [NSURLSessionDownloadTask class]]) { [[bodyDataDrain fileHandle] closeFile]; [[self request] _setProperty: [bodyDataDrain fileURL] forKey: @"tempFileURL"]; } if ([client respondsToSelector: @selector(URLProtocolDidFinishLoading:)]) { [client URLProtocolDidFinishLoading: self]; } } - (void) redirectForRequest: (NSURLRequest*)request { NSAssert(NO, @"Require concrete implementation"); } - (void) failWithError: (NSError*)error request: (NSURLRequest*)request { NSDictionary *info; NSError *urlError; id client; info = [NSDictionary dictionaryWithObjectsAndKeys: error, NSUnderlyingErrorKey, [request URL], NSURLErrorFailingURLErrorKey, [[request URL] absoluteString], NSURLErrorFailingURLStringErrorKey, [error localizedDescription], NSLocalizedDescriptionKey, nil]; urlError = [NSError errorWithDomain: NSURLErrorDomain code: [error code] userInfo: info]; [self completeTaskWithError: urlError]; client = [self client]; if ([client respondsToSelector: @selector(URLProtocol:didFailWithError:)]) { [client URLProtocol: self didFailWithError: urlError]; } } - (BOOL) seekInputStreamToPosition: (uint64_t)position { //TODO implement seek for NSURLSessionUploadTask return NO; } - (void) updateProgressMeterWithTotalBytesSent: (int64_t)totalBytesSent totalBytesExpectedToSend: (int64_t)totalBytesExpectedToSend totalBytesReceived: (int64_t)totalBytesReceived totalBytesExpectedToReceive: (int64_t)totalBytesExpectedToReceive { // TODO: Update progress. Note that a single NSURLSessionTask might // perform multiple transfers. The values in `progress` are only for // the current transfer. } @end gnustep-base-1.29.0/Source/GSNetServices.h000066400000000000000000000075521435650067400203200ustar00rootroot00000000000000/* Interface for concrete subclasses of NSNetServices on GNUstep Copyright (C) 2010 Free Software Foundation, Inc. Written by: Niels Grewe Date: March 2010 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #define EXPOSE_NSNetService_IVARS 1 #define EXPOSE_NSNetServiceBrowser_IVARS 1 #import "Foundation/NSNetServices.h" #import "GNUstepBase/NSNetServices+GNUstepBase.h" #if GS_USE_AVAHI==1 // Subclasses using Avahi: /** Convenience macro to create NSStrings if possible or return nil otherwise */ #define NSStringIfNotNull(x) x ? [NSString stringWithUTF8String: x] : nil /** * Possible types of Avahi browsers. */ typedef enum { GSAvahiUnknownBrowser, GSAvahiDomainBrowser, GSAvahiServiceBrowser, GSAvahiBrowserMax } GSAvahiBrowserType; /** * States of an Avahi service. */ typedef enum { GSNetServiceIdle, GSNetServiceResolving, GSNetServiceResolved, GSNetServiceRecordBrowsing, GSNetServicePublishing, GSNetServicePublished, GSNetServiceStateMax } GSNetServiceState; /** * Turns a string into an NSString, adding a trailing "." if neccessary. */ NSString* GSNetServiceDotTerminatedNSStringFromString(const char* string); @class GSAvahiRunLoopContext; @class NSTimer; @class NSRecursiveLock; @class NSMutableDictionary; @class NSMapTable; /** * NSNetService using the avahi-client API. */ @interface GSAvahiNetService : NSNetService { // GSAvahiClient behaviour ivars: // From superclass: id _delegate; GSAvahiRunLoopContext *ctx; void *_client; NSRecursiveLock *_lock; // Ivars for this class: NSMutableDictionary *_info; NSRecursiveLock *_infoLock; NSUInteger _infoSeq; GSNetServiceState _serviceState; int _ifIndex; int _protocol; void *_entryGroup; void *_resolver; NSMapTable *_browsers; NSMapTable *_browserTimeouts; NSTimer *_timer; } /** * Intializer that passes interface index and protocol information * alongside the usual information for a mDNS service. This is used by * GSNetServiceBrowser which already knows about these. */ - (id) initWithDomain: (NSString*)domain type: (NSString*)type name: (NSString*)name avahiIfIndex: (int)anIfIndex avahiProtocol: (int)aProtocol; #if GS_USE_AVAHI==1 - (id)delegate; #else - (id)delegate; #endif @end /** * NSNetServiceBrowser using the avahi-client API. */ @interface GSAvahiNetServiceBrowser : NSNetServiceBrowser { // GSAvahiClient behaviour ivars: // from superclass: id _delegate; GSAvahiRunLoopContext *ctx; void *_client; NSRecursiveLock *_lock; // Ivars for this class: void* _browser; GSAvahiBrowserType _type; BOOL _hasFirstEvent; NSMutableDictionary *_services; } @end #else // GS_USE_MDNS // Subclasses using mDNSResponder: /** * NSNetService using the mDNSResponder API. */ @interface GSMDNSNetService : NSNetService @end /** * NSNetServiceBrowser using the mDNSResponder API. */ @interface GSMDNSNetServiceBrowser : NSNetServiceBrowser @end #endif // GS_USE_AVAHI gnustep-base-1.29.0/Source/GSNetwork.h000066400000000000000000000060771435650067400175200ustar00rootroot00000000000000#ifndef INCLUDED_GSNETWORK_H #define INCLUDED_GSNETWORK_H 1 /* GSNetwork.h - This collects the system header files needed for networking code. In future it may also contain internal wrappers to standardise networking operations. Copyright (C) 2008, Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: Jan 2008 This file is part of the GNUstep Base Library. 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 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 USA. */ #include #include #if defined(HAVE_SYS_FCNTL_H) # include #elif defined(HAVE_FCNTL_H) # include #endif #if defined(_WIN32) #include #include #include #include #if !defined(EAFNOSUPPORT) #define EAFNOSUPPORT WSAEAFNOSUPPORT #endif #define BADSOCKET(X) ((X) == INVALID_SOCKET) #define GSNETERROR WSAGetLastError() #define GSWOULDBLOCK (GSNETERROR == WSAEWOULDBLOCK || GSNETERROR == WSAEINPROGRESS) #else #include #include #include #include #include #ifndef AF_LOCAL #define AF_LOCAL AF_UNIX #endif #ifndef PF_LOCAL #define PF_LOCAL PF_UNIX #endif #define SOCKET int /* Socket type */ #define INVALID_SOCKET -1 #define BADSOCKET(X) ((X) < 0) #define GSNETERROR errno #define GSWOULDBLOCK (EINPROGRESS == errno\ || EALREADY == errno\ || EINTR == errno\ || EAGAIN == errno) #endif /* _WIN32 */ /* The backlog argument to the listen() system call. * Systems should silently truncate the backlog if they don't support one * as large as we set, so it makes sense to set a large value in order to * support high volume applications. */ #define GSBACKLOG 10000 #ifndef INADDRSZ #define INADDRSZ 4 #endif #ifndef IN6ADDRSZ #define IN6ADDRSZ 16 #endif #if !defined(HAVE_SOCKLEN_T) # if !defined(socklen_t) # define socklen_t uint32_t # endif #endif #import "GSPrivate.h" NSString* GSPrivateSockaddrHost(struct sockaddr *addr) GS_ATTRIB_PRIVATE; unsigned GSPrivateSockaddrLength(struct sockaddr *addr) GS_ATTRIB_PRIVATE; NSString* GSPrivateSockaddrName(struct sockaddr *addr) GS_ATTRIB_PRIVATE; uint16_t GSPrivateSockaddrPort(struct sockaddr *addr) GS_ATTRIB_PRIVATE; BOOL GSPrivateSockaddrSetup(NSString *machine, uint16_t port, NSString *service, NSString *protocol, struct sockaddr *sin) GS_ATTRIB_PRIVATE; #endif gnustep-base-1.29.0/Source/GSNumberTypes.h000066400000000000000000000026101435650067400203310ustar00rootroot00000000000000/** * GSNumberTypes expects the INTEGER_MACRO macro to be defined. This macro is * invoked once for every type and its Objective-C name. Use this file when * implementing things like the -unsignedIntValue family of methods. For this * case, the macro will be invoked with unsigned int as the type and * unsignedInt as the name. * */ #ifndef INTEGER_MACRO #error Define INTEGER_MACRO(encoding, type, name, capitalizedName) before including GSNumberTypes.h #endif INTEGER_MACRO('d', double, double, Double) INTEGER_MACRO('f', float, float, Float) INTEGER_MACRO('c', signed char, char, Char) INTEGER_MACRO('i', int, int, Int) INTEGER_MACRO('s', short, short, Short) INTEGER_MACRO('l', long, long, Long) #ifndef NO_NSNUMBER # if SIZEOF_VOIDP == 4 INTEGER_MACRO('i', NSInteger, integer, Integer) INTEGER_MACRO('I', NSUInteger, unsignedInteger, UnsignedInteger) # undef NO_NSNUMBER # else INTEGER_MACRO('q', NSInteger, integer, Integer) INTEGER_MACRO('Q', NSUInteger, unsignedInteger, UnsignedInteger) # endif #endif INTEGER_MACRO('q', long long, longLong, LongLong) INTEGER_MACRO('C', unsigned char, unsignedChar, UnsignedChar) INTEGER_MACRO('S', unsigned short, unsignedShort, UnsignedShort) INTEGER_MACRO('I', unsigned int, unsignedInt, UnsignedInt) INTEGER_MACRO('L', unsigned long, unsignedLong, UnsignedLong) INTEGER_MACRO('Q', unsigned long long, unsignedLongLong, UnsignedLongLong) #undef INTEGER_MACRO gnustep-base-1.29.0/Source/GSOrderedSet.m000066400000000000000000000201231435650067400201200ustar00rootroot00000000000000/** Concrete implementation of GSOrderedSet and GSMutableOrderedSet based on GNU NSOrderedSet and NSMutableOrderedSet classes Copyright (C) 2019 Free Software Foundation, Inc. Written by: Gregory Casamento Created: May 17 2019 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #import "Foundation/NSOrderedSet.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSArray.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSException.h" #import "Foundation/NSPortCoder.h" #import "Foundation/NSIndexSet.h" #import "Foundation/NSKeyedArchiver.h" #import "Foundation/NSValue.h" #import "Foundation/NSDictionary.h" #import "GNUstepBase/GSObjCRuntime.h" #import "GSPrivate.h" #import "GSFastEnumeration.h" #import "GSDispatch.h" #import "GSSorting.h" #define GSI_ARRAY_TYPES GSUNION_OBJ #import "GNUstepBase/GSIArray.h" #define GSI_MAP_HAS_VALUE 0 #define GSI_MAP_KTYPES GSUNION_OBJ #define GSI_MAP_RETAIN_KEY(M, X) #define GSI_MAP_RELEASE_KEY(M, X) #include "GNUstepBase/GSIMap.h" @interface GSOrderedSet : NSOrderedSet { @public GSIArray_t array; GSIMapTable_t map; } @end @interface GSMutableOrderedSet : NSMutableOrderedSet { @public GSIArray_t array; GSIMapTable_t map; @private unsigned long _version; } @end @interface GSOrderedSetEnumerator : NSEnumerator { GSOrderedSet *set; unsigned current; unsigned count; } @end @interface GSOrderedSetEnumeratorReverse : GSOrderedSetEnumerator @end @implementation GSOrderedSetEnumerator - (id) initWithOrderedSet: (NSOrderedSet*)d { self = [super init]; if (self != nil) { set = (GSOrderedSet*)RETAIN(d); current = 0; count = GSIArrayCount(&set->array); } return self; } - (id) nextObject { if (current < count) { GSIArrayItem item = GSIArrayItemAtIndex(&set->array, current); current++; return (id)(item.obj); } return nil; } - (void) dealloc { RELEASE(set); [super dealloc]; } @end @implementation GSOrderedSetEnumeratorReverse - (id) initWithOrderedSet: (GSOrderedSet*)d { self = [super initWithOrderedSet: d]; if (self != nil) { current = GSIArrayCount(&set->array); } return self; } - (id) nextObject { GSIArrayItem item; if (current == 0) { return nil; } item = GSIArrayItemAtIndex(&set->array, --current); return (id)(item.obj); } @end @implementation GSOrderedSet static Class setClass; static Class mutableSetClass; + (void) initialize { if (self == [GSOrderedSet class]) { setClass = [GSOrderedSet class]; mutableSetClass = [GSMutableOrderedSet class]; } } - (id) copyWithZone: (NSZone*)z { return RETAIN(self); } - (void) dealloc { GSIArrayEmpty(&array); GSIMapEmptyMap(&map); [super dealloc]; } - (NSUInteger) hash { return [self count]; } - (instancetype) init { return [self initWithObjects: NULL count: 0]; } - (NSEnumerator*) objectEnumerator { return AUTORELEASE([[GSOrderedSetEnumerator alloc] initWithOrderedSet: self]); } - (NSEnumerator*) reverseObjectEnumerator { return AUTORELEASE([[GSOrderedSetEnumeratorReverse alloc] initWithOrderedSet: self]); } - (NSUInteger) sizeInBytesExcluding: (NSHashTable*)exclude { NSUInteger size = GSPrivateMemorySize(self, exclude); if (size > 0) { NSUInteger count = [self count]; NSUInteger i = 0; for (i = 0; i < count; i++) { GSIArrayItem item = GSIArrayItemAtIndex(&array, i); size += [item.obj sizeInBytesExcluding: exclude]; } } return size; } // Put required overrides here... - (BOOL) containsObject: (id)anObject { if (anObject != nil) { GSIMapNode node = GSIMapNodeForKey(&map, (GSIMapKey)anObject); if (node != 0) { return YES; } } return NO; } - (NSUInteger) count { return GSIArrayCount(&array); } - (id) objectAtIndex: (NSUInteger)index { GSIArrayItem item = GSIArrayItemAtIndex(&array, index); return item.obj; } - (void) getObjects: (__unsafe_unretained id[])aBuffer range: (NSRange)aRange { NSUInteger i, j = 0; NSUInteger c = GSIArrayCount(&array); NSUInteger e = NSMaxRange(aRange); GS_RANGE_CHECK(aRange, c); for (i = aRange.location; i < e; i++) { GSIArrayItem item = GSIArrayItemAtIndex(&array, i); aBuffer[j++] = item.obj; } } /* Designated initialiser */ - (id) initWithObjects: (const id*)objs count: (NSUInteger)c { NSUInteger i = 0; // Initialize and fill the set. GSIArrayInitWithZoneAndCapacity(&array, [self zone], c); GSIMapInitWithZoneAndCapacity(&map, [self zone], c); for (i = 0; i < c; i++) { id obj = objs[i]; if (obj == nil) { DESTROY(self); [NSException raise: NSInvalidArgumentException format: @"Tried to init set with nil value"]; } if (![self containsObject: obj]) { GSIArrayItem item; item.obj = obj; GSIArrayAddItem(&array, item); GSIMapAddKey(&map, (GSIMapKey)obj); } } return self; } @end @implementation GSMutableOrderedSet + (void) initialize { if (self == [GSMutableOrderedSet class]) { GSObjCAddClassBehavior(self, [GSOrderedSet class]); } } - (void) insertObject: (id)object atIndex: (NSUInteger)index { if (object == nil) { [NSException raise: NSInvalidArgumentException format: @"Tried to add nil to set"]; } else { if ([self containsObject: object] == NO) { GSIArrayItem item; _version++; item.obj = object; GSIArrayInsertItem(&array, item, index); GSIMapAddKey(&map, (GSIMapKey)object); _version++; } } } - (void) removeObjectAtIndex: (NSUInteger)index { GSIArrayItem item = GSIArrayItemAtIndex(&array, index); _version++; GSIArrayRemoveItemAtIndex(&array, index); GSIMapRemoveKey(&map, (GSIMapKey)item.obj); _version++; } - (id) init { return [self initWithCapacity: 0]; } /* Designated initialiser */ - (id) initWithCapacity: (NSUInteger)cap { GSIArrayInitWithZoneAndCapacity(&array, [self zone], cap); GSIMapInitWithZoneAndCapacity(&map, [self zone], cap); return self; } - (id) initWithObjects: (const id*)objects count: (NSUInteger)count { NSUInteger i = 0; // Init and fill set self = [self initWithCapacity: count]; if (self != nil) { for (i = 0; i < count; i++) { id anObject = objects[i]; [self addObject: anObject]; } } return self; } - (BOOL) makeImmutable { GSClassSwizzle(self, [GSOrderedSet class]); return YES; } - (id) makeImmutableCopyOnFail: (BOOL)force { GSClassSwizzle(self, [GSOrderedSet class]); return self; } - (NSUInteger) countByEnumeratingWithState: (NSFastEnumerationState *)state objects: (__unsafe_unretained id[])stackbuf count: (NSUInteger)len { NSInteger count; /* This is cached in the caller at the start and compared at each * iteration. If it changes during the iteration then * objc_enumerationMutation() will be called, throwing an exception. */ state->mutationsPtr = &_version; count = MIN(len, [self count] - state->state); /* If a mutation has occurred then it's possible that we are being asked to * get objects from after the end of the array. Don't pass negative values * to memcpy. */ if (count > 0) { [self getObjects: stackbuf range: NSMakeRange(state->state, count)]; state->state += count; } else { count = 0; } state->itemsPtr = stackbuf; return count; } @end gnustep-base-1.29.0/Source/GSPThread.h000066400000000000000000000146251435650067400174140ustar00rootroot00000000000000/* GSPThread.h Copyright (C) 2010 Free Software Foundation, Inc. Written by: Niels Grewe This file is part of the GNUstep Base Library. 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 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 02111 USA. */ #ifndef _GSPThread_h_ #define _GSPThread_h_ #if GS_USE_WIN32_THREADS_AND_LOCKS #include #include #include "GSAtomic.h" typedef enum { gs_mutex_attr_normal = 0, gs_mutex_attr_errorcheck = 1, gs_mutex_attr_recursive = 2 } gs_mutex_attr_t; typedef struct { SRWLOCK lock; _Atomic(DWORD) owner; DWORD depth; gs_mutex_attr_t attr; } gs_mutex_t; typedef SRWLOCK gs_cond_mutex_t; typedef CONDITION_VARIABLE gs_cond_t; /* * Locking primitives. */ #define GS_MUTEX_INIT_STATIC {.lock = SRWLOCK_INIT, .attr = gs_mutex_attr_normal} #define GS_MUTEX_INIT(x) gs_mutex_init(&(x), gs_mutex_attr_normal) #define GS_MUTEX_INIT_RECURSIVE(x) gs_mutex_init(&(x), gs_mutex_attr_recursive) #define GS_MUTEX_LOCK(x) gs_mutex_lock(&(x)) #define GS_MUTEX_TRYLOCK(x) gs_mutex_trylock(&(x)) #define GS_MUTEX_UNLOCK(x) gs_mutex_unlock(&(x)) #define GS_MUTEX_DESTROY(x) #define GS_COND_WAIT(cond, mutex) gs_cond_wait(cond, mutex) #define GS_COND_SIGNAL(cond) WakeConditionVariable(&(cond)) #define GS_COND_BROADCAST(cond) WakeAllConditionVariable(&(cond)) /* Pthread-like locking primitives defined in NSLock.m */ void gs_mutex_init(gs_mutex_t *l, gs_mutex_attr_t attr); int gs_mutex_lock(gs_mutex_t *l); int gs_mutex_trylock(gs_mutex_t *l); int gs_mutex_unlock(gs_mutex_t *l); int gs_cond_wait(gs_cond_t *cond, gs_mutex_t *mutex); int gs_cond_timedwait(gs_cond_t *cond, gs_mutex_t *mutex, DWORD millisecs); /* * Threading primitives. * * Use Fiber Local Storage (FLS), as in contrast to Thread Local Storage (TLS) * they provide a destructor callback and will just manipulate the FLS * associated with the current thread if fibers are not being used. */ #define GS_THREAD_KEY_INIT(key, dtor) \ ((key = FlsAlloc(dtor)) != FLS_OUT_OF_INDEXES) #define GS_THREAD_KEY_GET(key) FlsGetValue(key) #define GS_THREAD_KEY_SET(key, val) FlsSetValue(key, val) #define GS_THREAD_ID_SELF() GetCurrentThreadId() #define GS_YIELD() Sleep(0) typedef DWORD gs_thread_key_t; typedef DWORD gs_thread_id_t; #else /* GS_USE_WIN32_THREADS_AND_LOCKS */ #include typedef pthread_mutex_t gs_mutex_t; typedef pthread_mutex_t gs_cond_mutex_t; typedef pthread_cond_t gs_cond_t; /* * Locking primitives */ #define GS_MUTEX_INIT_STATIC PTHREAD_MUTEX_INITIALIZER #define GS_MUTEX_INIT(x) pthread_mutex_init(&(x), NULL) /* * Macro to initialize recursive mutexes in a portable way. Adopted from * libobjc2 (lock.h). */ # ifdef PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP # define GS_MUTEX_INIT_RECURSIVE(x) \ x = (pthread_mutex_t) PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP # elif defined(PTHREAD_RECURSIVE_MUTEX_INITIALIZER) # define GS_MUTEX_INIT_RECURSIVE(x) \ x = (pthread_mutex_t) PTHREAD_RECURSIVE_MUTEX_INITIALIZER # else # define GS_MUTEX_INIT_RECURSIVE(x) GSPThreadInitRecursiveMutex(&(x)) static inline void GSPThreadInitRecursiveMutex(pthread_mutex_t *x) { pthread_mutexattr_t recursiveAttributes; pthread_mutexattr_init(&recursiveAttributes); pthread_mutexattr_settype(&recursiveAttributes, PTHREAD_MUTEX_RECURSIVE); pthread_mutex_init(x, &recursiveAttributes); pthread_mutexattr_destroy(&recursiveAttributes); } # endif // PTHREAD_RECURSIVE_MUTEX_INITIALIZER(_NP) #define GS_MUTEX_LOCK(x) pthread_mutex_lock(&(x)) #define GS_MUTEX_TRYLOCK(x) pthread_mutex_trylock(&(x)) #define GS_MUTEX_UNLOCK(x) pthread_mutex_unlock(&(x)) #define GS_MUTEX_DESTROY(x) pthread_mutex_destroy(&(x)) #define GS_COND_WAIT(cond, mutex) pthread_cond_wait(cond, mutex) #define GS_COND_SIGNAL(cond) pthread_cond_signal(&(cond)) #define GS_COND_BROADCAST(cond) pthread_cond_broadcast(&(cond)) /* * Threading primitives. */ #define GS_THREAD_KEY_INIT(key, dtor) (pthread_key_create(&(key), dtor) == 0) #define GS_THREAD_KEY_GET(key) pthread_getspecific(key) #define GS_THREAD_KEY_SET(key, val) pthread_setspecific(key, val) #define GS_THREAD_ID_SELF() pthread_self() #define GS_YIELD() sched_yield() typedef pthread_key_t gs_thread_key_t; typedef pthread_t gs_thread_id_t; #endif /* GS_USE_WIN32_THREADS_AND_LOCKS */ #ifdef __OBJC__ /* Enables including file in autoconf check */ #import "Foundation/NSLock.h" @class GSStackTrace; @class NSArray; @class NSMapTable; /* Class to obtain/encapsulate a stack trace for exception reporting and/or * lock tracing. */ @interface GSStackTrace : NSObject { NSArray *symbols; NSArray *addresses; @public NSUInteger recursion; // Recursion count for lock trace NSUInteger *returns; // The return addresses on the stack int numReturns; // Number of return addresses } - (NSArray*) addresses; // Return addresses from last trace - (NSArray*) symbols; // Return symbols from last trace - (void) trace; // Populate with new stack trace @end /* Versions of the lock classes where the locking is never traced */ @interface GSUntracedCondition : NSCondition @end @interface GSUntracedConditionLock : NSConditionLock @end @interface GSUntracedLock : NSLock @end @interface GSUntracedRecursiveLock : NSRecursiveLock @end /* Versions of the lock classes where the locking is traced */ @interface GSTracedCondition : NSCondition { GSStackTrace *stack; } - (GSStackTrace*) stack; @end @interface GSTracedConditionLock : NSConditionLock @end @interface GSTracedLock : NSLock { GSStackTrace *stack; } - (GSStackTrace*) stack; @end @interface GSTracedRecursiveLock : NSRecursiveLock { GSStackTrace *stack; } - (GSStackTrace*) stack; @end #endif // __OBJC__ #endif // _GSPThread_h_ gnustep-base-1.29.0/Source/GSPortPrivate.h000066400000000000000000000041351435650067400203370ustar00rootroot00000000000000/* GSPortPrivate Copyright (C) 2005 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald This file is part of the GNUstep Base Library. 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 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 02111 USA. */ #ifndef __GSPortPrivate_h_ #define __GSPortPrivate_h_ /* * Nameserver deregistration methods */ @interface NSPortNameServer (GNUstep) - (NSArray*) namesForPort: (NSPort*)port; /* return all names for port */ - (BOOL) removePort: (NSPort*)port; /* remove all names for port */ - (BOOL) removePort: (NSPort*)port forName: (NSString*)name; @end #if defined(_WIN32) @interface NSMessagePort(Private) + (id) newWithName: (NSString*)name; - (id) initWithName: (NSString*)name; - (NSString*) name; - (void) receivedEventRead; - (void) receivedEventWrite; @end #else @class GSMessageHandle; @interface NSMessagePort(Private) - (int) _listener; - (const unsigned char *) _name; + (NSMessagePort*) _portWithName: (const unsigned char *)socketName listener: (BOOL)shouldListen; - (void) addHandle: (GSMessageHandle*)handle forSend: (BOOL)send; - (void) removeHandle: (GSMessageHandle*)handle; @end #endif /* _WIN32 */ @class GSTcpHandle; @interface NSSocketPort (Private) - (void) addHandle: (GSTcpHandle*)handle forSend: (BOOL)send; - (GSTcpHandle*) handleForPort: (NSSocketPort*)recvPort beforeDate: (NSDate*)when; - (void) removeHandle: (GSTcpHandle*)handle; @end #endif gnustep-base-1.29.0/Source/GSPrivate.h000066400000000000000000000445111435650067400174740ustar00rootroot00000000000000/* GSPrivate Copyright (C) 2001,2002 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald This file is part of the GNUstep Base Library. 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 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 02111 USA. */ #ifndef _GSPrivate_h_ #define _GSPrivate_h_ #include #import "Foundation/NSBundle.h" #import "Foundation/NSError.h" @class _GSInsensitiveDictionary; @class _GSMutableInsensitiveDictionary; @class NSNotification; #if ( (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) ) && HAVE_VISIBILITY_ATTRIBUTE ) #define GS_ATTRIB_PRIVATE __attribute__ ((visibility("internal"))) #else #define GS_ATTRIB_PRIVATE #endif /* Absolute Gregorian date for NSDate reference date Jan 01 2001 * * N = 1; // day of month * N = N + 0; // days in prior months for year * N = N + // days this year * + 365 * (year - 1) // days in previous years ignoring leap days * + (year - 1)/4 // Julian leap days before this year... * - (year - 1)/100 // ...minus prior century years... * + (year - 1)/400 // ...plus prior years divisible by 400 */ #define GREGORIAN_REFERENCE 730486 NSTimeInterval GSPrivateTimeNow() GS_ATTRIB_PRIVATE; #include "GNUstepBase/GSObjCRuntime.h" #include "Foundation/NSArray.h" #ifdef __GNUSTEP_RUNTIME__ struct objc_category; typedef struct objc_category* Category; #endif @interface GSArray : NSArray { @public id *_contents_array; unsigned _count; } @end @interface GSMutableArray : NSMutableArray { @public id *_contents_array; unsigned _count; unsigned _capacity; int _grow_factor; unsigned long _version; } @end @interface GSPlaceholderArray : NSArray { } @end #include "Foundation/NSString.h" /** * Macro to manage memory for chunks of code that need to work with * arrays of items. Use this to start the block of code using * the array and GS_ENDITEMBUF() to end it. The idea is to ensure that small * arrays are allocated on the stack (for speed), but large arrays are * allocated from the heap (to avoid stack overflow). */ #if __GNUC__ > 3 && !defined(__clang__) __attribute__((unused)) static void GSFreeTempBuffer(void **b) { if (NULL != *b) free(*b); } # define GS_BEGINITEMBUF(P, S, T) { \ T _ibuf[GS_MAX_OBJECTS_FROM_STACK];\ T *P = _ibuf;\ __attribute__((cleanup(GSFreeTempBuffer))) void *_base = 0;\ if (S > GS_MAX_OBJECTS_FROM_STACK)\ {\ _base = malloc((S) * sizeof(T));\ P = _base;\ } # define GS_BEGINITEMBUF2(P, S, T) { \ T _ibuf2[GS_MAX_OBJECTS_FROM_STACK];\ T *P = _ibuf2;\ __attribute__((cleanup(GSFreeTempBuffer))) void *_base2 = 0;\ if (S > GS_MAX_OBJECTS_FROM_STACK)\ {\ _base2 = malloc((S) * sizeof(T));\ P = _base2;\ } #else /* Make minimum size of _ibuf 1 to avoid compiler warnings. */ # define GS_BEGINITEMBUF(P, S, T) { \ T _ibuf[(S) > 0 && (S) <= GS_MAX_OBJECTS_FROM_STACK ? (S) : 1]; \ T *_base = ((S) <= GS_MAX_OBJECTS_FROM_STACK) ? _ibuf \ : (T*)malloc((S) * sizeof(T)); \ T *(P) = _base; # define GS_BEGINITEMBUF2(P, S, T) { \ T _ibuf2[(S) > 0 && (S) <= GS_MAX_OBJECTS_FROM_STACK ? (S) : 1]; \ T *_base2 = ((S) <= GS_MAX_OBJECTS_FROM_STACK) ? _ibuf2 \ : (T*)malloc((S) * sizeof(T)); \ T *(P) = _base2; #endif /** * Macro to manage memory for chunks of code that need to work with * arrays of items. Use GS_BEGINITEMBUF() to start the block of code using * the array and this macro to end it. */ #if __GNUC__ > 3 && !defined(__clang__) # define GS_ENDITEMBUF() } # define GS_ENDITEMBUF2() } #else # define GS_ENDITEMBUF() \ if (_base != _ibuf) \ free(_base); \ } # define GS_ENDITEMBUF2() \ if (_base2 != _ibuf2) \ free(_base2); \ } #endif /** * Macro to manage memory for chunks of code that need to work with * arrays of objects. Use this to start the block of code using * the array and GS_ENDIDBUF() to end it. The idea is to ensure that small * arrays are allocated on the stack (for speed), but large arrays are * allocated from the heap (to avoid stack overflow). */ #define GS_BEGINIDBUF(P, S) GS_BEGINITEMBUF(P, S, id) /** * Macro to manage memory for chunks of code that need to work with * arrays of objects. Use GS_BEGINIDBUF() to start the block of code using * the array and this macro to end it. */ #define GS_ENDIDBUF() GS_ENDITEMBUF() /** * Macro to consistently replace public accessable * constant strings with dynamically allocated versions. * This method assumes an initialized NSStringClass symbol * which contains the Class object of NSString.
* Most public accessible strings are used in collection classes * like NSDictionary, and therefore tend to receive -isEqual: * messages (and therefore -hash) rather often. Statically * allocated strings must calculate their hash values while * dynamically allocated strings can store them. This optimization * is by far more effective than using NSString * const. * The drawback is that the memory management cannot enforce these values * to remain unaltered as it would for variables declared NSString * const. * Yet the optimization of the stored hash value is currently deemed * more important. */ #ifndef GNUSTEP_NEW_STRING_ABI #define GS_REPLACE_CONSTANT_STRING(ID) [(ID = [NSObject \ leak: [[NSString alloc] initWithUTF8String: [ID UTF8String]]]) release] #else /** * In the new constant string ABI, the hash can be stored in the constant * string object, so this is not a problem. */ #define GS_REPLACE_CONSTANT_STRING(ID) #endif /* Using cString here is OK here because NXConstantString returns a pointer to it's internal pointer. */ /* * Type to hold either UTF-16 (unichar) or 8-bit encodings, * while satisfying alignment constraints. */ typedef union { unichar *u; // 16-bit unicode characters. unsigned char *c; // 8-bit characters. } GSCharPtr; /* * Private concrete string classes. * NB. All these concrete string classes MUST have the same initial ivar * layout so that we can swap between them as necessary. * The initial layout must also match that of NXConstantString (which is * determined by the compiler) - an initial pointer to the string data * followed by the string length (number of characters). */ @interface GSString : NSString { @public GSCharPtr _contents; unsigned int _count; struct { unsigned int wide: 1; // 16-bit characters in string? unsigned int owned: 1; // Set if the instance owns the // _contents buffer unsigned int unused: 2; unsigned int hash: 28; } _flags; } @end /* * GSMutableString - concrete mutable string, capable of changing its storage * from holding 8-bit to 16-bit character set. */ @interface GSMutableString : NSMutableString { @public GSCharPtr _contents; unsigned int _count; struct { unsigned int wide: 1; unsigned int owned: 1; unsigned int unused: 2; unsigned int hash: 28; } _flags; unsigned int _capacity; NSZone *_zone; } @end typedef GSMutableString *GSStr; /* * Enumeration for MacOS-X compatibility user defaults settings. * For efficiency, we save defaults information which is used by the * base library. */ typedef enum { GSMacOSXCompatible, // General behavior flag. GSOldStyleGeometry, // Control geometry string output. GSLogSyslog, // Force logging to go to syslog. GSLogThread, // Include thread name in log message. GSLogOffset, // Include time zone offset in message. NSWriteOldStylePropertyLists, // Control PList output. GSExceptionStackTrace, // Add trace to exception description. GSUserDefaultMaxFlag // End marker. } GSUserDefaultFlagType; @interface NSBundle (Private) + (NSString *) _absolutePathOfExecutable: (NSString *)path; + (NSBundle*) _addFrameworkFromClass: (Class)frameworkClass; + (NSMutableArray*) _addFrameworks; + (NSString*) _gnustep_target_cpu; + (NSString*) _gnustep_target_dir; + (NSString*) _gnustep_target_os; + (NSString*) _library_combo; @end /** * This class exists simply as a mechanism for encapsulating arrays * encoded using [NSKeyedArchiver-encodeArrayOfObjCType:count:at:] */ @interface _NSKeyedCoderOldStyleArray : NSObject { char _t[2]; unsigned _c; unsigned _s; const void *_a; NSData *_d; // Only valid after initWithCoder: } - (const void*) bytes; - (NSUInteger) count; - (void) encodeWithCoder: (NSCoder*)aCoder; - (id) initWithCoder: (NSCoder*)aCoder; - (id) initWithObjCType: (const char*)t count: (NSInteger)c at: (const void*)a; - (NSUInteger) size; - (const char*) type; @end /* Get error information. */ @interface NSError (GNUstepBase) + (NSError*) _last; + (NSError*) _systemError: (long)number; @end @class NSRunLoop; @class NSLock; @class NSThread; /* Used to handle events performed in one thread from another. */ @interface GSRunLoopThreadInfo : NSObject { @public NSRunLoop *loop; NSLock *lock; NSMutableArray *performers; #ifdef _WIN32 HANDLE event; #else int inputFd; int outputFd; #endif } /* Add a performer to be run in the loop's thread. May be called from * any thread. */ - (void) addPerformer: (id)performer; /* Fire all pending performers in the current thread. May only be called * from the runloop when the event/descriptor is triggered. */ - (void) fire; /* Cancel all pending performers. */ - (void) invalidate; @end /* Return (and optionally create) GSRunLoopThreadInfo for the specified * thread (or the current thread if aThread is nil).
* If aThread is nil and no value is set for the current thread, create * a GSRunLoopThreadInfo and set it for the current thread. */ GSRunLoopThreadInfo * GSRunLoopInfoForThread(NSThread *aThread) GS_ATTRIB_PRIVATE; /* Used by NSException uncaught exception handler - must not call any * methods/functions which might cause a recursive exception. */ const char* GSPrivateArgZero() GS_ATTRIB_PRIVATE; /* get the available string encodings (nul terminated array) */ NSStringEncoding * GSPrivateAvailableEncodings() GS_ATTRIB_PRIVATE; /* Used to check for termination of background tasks. */ BOOL GSPrivateCheckTasks(void) GS_ATTRIB_PRIVATE; /* get the default C-string encoding. */ NSStringEncoding GSPrivateDefaultCStringEncoding() GS_ATTRIB_PRIVATE; /* Get default locale quickly (usually from cache). * External apps would cache the locale themselves. */ NSDictionary * GSPrivateDefaultLocale() GS_ATTRIB_PRIVATE; /* Get one of several standard values. */ BOOL GSPrivateDefaultsFlag(GSUserDefaultFlagType type) GS_ATTRIB_PRIVATE; /* get the name of a string encoding as an NSString. */ NSString * GSPrivateEncodingName(NSStringEncoding encoding) GS_ATTRIB_PRIVATE; /* get a flag from an environment variable - return def if not defined. */ BOOL GSPrivateEnvironmentFlag(const char *name, BOOL def) GS_ATTRIB_PRIVATE; /* Get the path to the xcurrent executable. */ NSString * GSPrivateExecutablePath(void) GS_ATTRIB_PRIVATE; /* Format arguments into an internal string. */ void GSPrivateFormat(GSStr fb, const unichar *fmt, va_list ap, NSDictionary *loc) GS_ATTRIB_PRIVATE; /* determine whether data in a particular encoding can * generally be represented as 8-bit characters including ascii. */ BOOL GSPrivateIsByteEncoding(NSStringEncoding encoding) GS_ATTRIB_PRIVATE; /* determine whether encoding is currently supported. */ BOOL GSPrivateIsEncodingSupported(NSStringEncoding encoding) GS_ATTRIB_PRIVATE; /* load a module into the runtime */ long GSPrivateLoadModule(NSString *filename, FILE *errorStream, void (*loadCallback)(Class, struct objc_category *), void **header, NSString *debugFilename) GS_ATTRIB_PRIVATE; /* Get the native C-string encoding as used by locale specific code in the * operating system. This may differ from the default C-string encoding * if the latter has been set via an environment variable. */ NSStringEncoding GSPrivateNativeCStringEncoding() GS_ATTRIB_PRIVATE; /* Get the native C-string encoding as used by the ICU library, which may * differ from the native locale encoding or the default C-string encoding */ NSStringEncoding GSPrivateICUCStringEncoding() GS_ATTRIB_PRIVATE; /* Function used by the NSRunLoop and friends for processing * queued notifications which should be processed at the first safe moment. */ void GSPrivateNotifyASAP(NSString *mode) GS_ATTRIB_PRIVATE; /* Function used by the NSRunLoop and friends for processing * queued notifications which should be processed when the loop is idle. */ void GSPrivateNotifyIdle(NSString *mode) GS_ATTRIB_PRIVATE; /* Function used by the NSRunLoop and friends for determining whether * there are more queued notifications to be processed. */ BOOL GSPrivateNotifyMore(NSString *mode) GS_ATTRIB_PRIVATE; /* Function to return the function for searching in a string for a range. */ typedef NSRange (*GSRSFunc)(id, id, unsigned, NSRange); GSRSFunc GSPrivateRangeOfString(NSString *receiver, NSString *target) GS_ATTRIB_PRIVATE; /* Function to return the hash value for a small integer (used by NSNumber). */ unsigned GSPrivateSmallHash(int n) GS_ATTRIB_PRIVATE; /* Function to append data to an GSStr */ void GSPrivateStrAppendUnichars(GSStr s, const unichar *u, unsigned l) GS_ATTRIB_PRIVATE; /* Make the content of this string into unicode if it is not in * the external defaults C string encoding. */ void GSPrivateStrExternalize(GSStr s) GS_ATTRIB_PRIVATE; /* * GSPrivateSymbolPath() returns the path to the object file from * which a certain class was loaded. * * If the class was loaded from a shared library, this returns the * filesystem path to the shared library; if it was loaded from a * dynamical object (such as a bundle or framework dynamically * loaded), it returns the filesystem path to the object file; if the * class was loaded from the main executable, it returns the * filesystem path to the main executable path. * * This function is implemented by using the available features of * the dynamic linker on the specific platform we are running on. * * On some platforms, the dynamic linker does not provide enough * facilities to support the GSPrivateSymbolPath() function at all; * in this case, GSPrivateSymbolPath() always returns nil. * * On my platform (a Debian GNU Linux), it seems the dynamic linker * always returns the filesystem path that was used to load the * module. So it returns the full filesystem path for shared libraries * and bundles (which is very nice), but unfortunately it returns * argv[0] (which might be something as horrible as './obj/test') * for classes in the main executable. * * Currently, the function will return nil if any of the following * conditions is satisfied: * - the required functionality is not available on the platform we are * running on; * - memory allocation fails; * - the symbol for that class could not be found. * * In general, if the function returns nil, it means something serious * went wrong in the system preventing it from getting the symbol path. * If your code is to be portable, you (unfortunately) have to be prepared * to work around it in some way when this happens. * * It seems that this function has no corresponding function in the NeXT * runtime ... as far as I know. */ NSString * GSPrivateSymbolPath(Class theClass) GS_ATTRIB_PRIVATE; /* Combining class for composite unichars */ unsigned char GSPrivateUniCop(unichar u) GS_ATTRIB_PRIVATE; /* unload a module from the runtime (not implemented) */ long GSPrivateUnloadModule(FILE *errorStream, void (*unloadCallback)(Class, struct objc_category *)) GS_ATTRIB_PRIVATE; /* Memory to use to put executable code in. */ @interface GSCodeBuffer : NSObject { unsigned size; void *buffer; void *executable; id frame; } + (GSCodeBuffer*) memoryWithSize: (NSUInteger)_size; - (void*) buffer; - (void*) executable; - (id) initWithSize: (NSUInteger)_size; - (void) protect; - (void) setFrame: (id)aFrame; @end BOOL GSPrivateIsCollectable(const void *ptr) GS_ATTRIB_PRIVATE; NSZone* GSAtomicMallocZone (void); /* Generate a 32bit hash from supplied byte data. */ uint32_t GSPrivateHash(uint32_t seed, const void *bytes, int length) GS_ATTRIB_PRIVATE; /* Incorporate 'l' bytes of data from the buffer pointed to by 'b' into * the hash state information pointed to by p0 and p1. * The hash state variables should have been initialised to zero before * the first call to this function, and the result should be produced * by calling the GSPrivateFinishHash() function. */ void GSPrivateIncrementalHash(uint32_t *p0, uint32_t *p1, const void *b, int l) GS_ATTRIB_PRIVATE; /* Generate a 32bit hash from supplied state variables resulting from * calls to the GSPrivateIncrementalHash() function. */ uint32_t GSPrivateFinishHash(uint32_t s0, uint32_t s1, uint32_t totalLength) GS_ATTRIB_PRIVATE; @class NSHashTable; /* If 'self' is not a member of 'exclude', adds to the hash * table and returns the memory footprint of 'self' assuming * it contains no pointers and has no extra memory allocated. * Otherwise returns 0. */ NSUInteger GSPrivateMemorySize(NSObject *self, NSHashTable *exclude) GS_ATTRIB_PRIVATE; /* Return the current thread ID as an NSUInteger. * Ideally, we use the operating-system's notion of a thread ID so * that external process monitoring software will be using the same * value that we log. If we don't know the system's mechanism, we * use the address of the current NSThread object so that, even if * it makes no sense externally, it can still be used to show that * different threads generated different logs. */ NSUInteger GSPrivateThreadID() GS_ATTRIB_PRIVATE; /** Function to base64 encode data. The destination buffer must be of * size (((length + 2) / 3) * 4) or more. */ void GSPrivateEncodeBase64(const uint8_t *src, NSUInteger length, uint8_t *dst) GS_ATTRIB_PRIVATE; #endif /* _GSPrivate_h_ */ gnustep-base-1.29.0/Source/GSPrivateHash.m000066400000000000000000000245241435650067400203070ustar00rootroot00000000000000/* GSPrivateHash.m Copyright (C) 2013 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald This file is part of the GNUstep Base Library. 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 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 02111 USA. */ #import "GSPrivate.h" uint32_t GSPrivateHash(uint32_t seed, const void *bytes, int length) { uint32_t carry = 0; GSPrivateIncrementalHash(&seed, &carry, bytes, length); return GSPrivateFinishHash(seed, carry, length); } #ifndef OLDHASH #define OLDHASH 1 #endif #if OLDHASH /* Very fast, simple hash. Poor distribution properties though. */ void GSPrivateIncrementalHash(uint32_t *p0, uint32_t *p1, const void *b, int l) { unsigned i; for (i = 0; i < l; i++) { *p0 = (*p0 << 5) + *p0 + ((const uint8_t*)b)[i]; } } uint32_t GSPrivateFinishHash(uint32_t s0, uint32_t s1, uint32_t totalLength) { return s0; } #else /* OLDHASH */ /*----------------------------------------------------------------------------- * MurmurHash3 was written by Austin Appleby, and is placed in the public * domain. * * This implementation was written by Shane Day, and is also public domain. * * This is a portable ANSI C implementation of MurmurHash3_x86_32 (Murmur3A) * with support for progressive processing. */ /*----------------------------------------------------------------------------- If you want to understand the MurmurHash algorithm you would be much better off reading the original source. Just point your browser at: http://code.google.com/p/smhasher/source/browse/trunk/MurmurHash3.cpp What this version provides? 1. Progressive data feeding. Useful when the entire payload to be hashed does not fit in memory or when the data is streamed through the application. Also useful when hashing a number of strings with a common prefix. A partial hash of a prefix string can be generated and reused for each suffix string. 2. Portability. Plain old C so that it should compile on any old compiler. Both CPU endian and access-alignment neutral, but avoiding inefficient code when possible depending on CPU capabilities. 3. Drop in. I personally like nice self contained public domain code, making it easy to pilfer without loads of refactoring to work properly in the existing application code & makefile structure and mucking around with licence files. Just copy PMurHash.h and PMurHash.c and you're ready to go. How does it work? We can only process entire 32 bit chunks of input, except for the very end that may be shorter. So along with the partial hash we need to give back to the caller a carry containing up to 3 bytes that we were unable to process. This carry also needs to record the number of bytes the carry holds. I use the low 2 bits as a count (0..3) and the carry bytes are shifted into the high byte in stream order. To handle endianess I simply use a macro that reads a uint32_t and define that macro to be a direct read on little endian machines, a read and swap on big endian machines, or a byte-by-byte read if the endianess is unknown. -----------------------------------------------------------------------------*/ /* MSVC warnings we choose to ignore */ #if defined(_MSC_VER) #pragma warning(disable: 4127) /* conditional expression is constant */ #endif /*----------------------------------------------------------------------------- * Endianess, misalignment capabilities and util macros * * The following 3 macros are defined in this section. The other macros defined * are only needed to help derive these 3. * * READ_UINT32(x) Read a little endian unsigned 32-bit int * UNALIGNED_SAFE Defined if READ_UINT32 works on non-word boundaries * ROTL32(x,r) Rotate x left by r bits */ /* Convention is to define __BYTE_ORDER == to one of these values */ #if !defined(__BIG_ENDIAN) #define __BIG_ENDIAN 4321 #endif #if !defined(__LITTLE_ENDIAN) #define __LITTLE_ENDIAN 1234 #endif /* I386 */ #if defined(_M_IX86) || defined(__i386__) || defined(__i386) || defined(i386) #define __BYTE_ORDER __LITTLE_ENDIAN #define UNALIGNED_SAFE #endif /* gcc 'may' define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ to 1 (Note the trailing __), * or even _LITTLE_ENDIAN or _BIG_ENDIAN (Note the single _ prefix) */ #if !defined(__BYTE_ORDER) #if defined(__LITTLE_ENDIAN__) && __LITTLE_ENDIAN__==1 || defined(_LITTLE_ENDIAN) && _LITTLE_ENDIAN==1 #define __BYTE_ORDER __LITTLE_ENDIAN #elif defined(__BIG_ENDIAN__) && __BIG_ENDIAN__==1 || defined(_BIG_ENDIAN) && _BIG_ENDIAN==1 #define __BYTE_ORDER __BIG_ENDIAN #endif #endif /* gcc (usually) defines xEL/EB macros for ARM and MIPS endianess */ #if !defined(__BYTE_ORDER) #if defined(__ARMEL__) || defined(__MIPSEL__) #define __BYTE_ORDER __LITTLE_ENDIAN #endif #if defined(__ARMEB__) || defined(__MIPSEB__) #define __BYTE_ORDER __BIG_ENDIAN #endif #endif /* Now find best way we can to READ_UINT32 */ #if __BYTE_ORDER==__LITTLE_ENDIAN /* CPU endian matches murmurhash algorithm, so read 32-bit word directly */ #define READ_UINT32(ptr) (*((uint32_t*)(ptr))) #elif __BYTE_ORDER==__BIG_ENDIAN /* TODO: Add additional cases below where a compiler provided bswap32 is available */ #if defined(__GNUC__) && (__GNUC__>4 || (__GNUC__==4 && __GNUC_MINOR__>=3)) #define READ_UINT32(ptr) (__builtin_bswap32(*((uint32_t*)(ptr)))) #else /* Without a known fast bswap32 we're just as well off doing this */ #define READ_UINT32(ptr) (ptr[0]|ptr[1]<<8|ptr[2]<<16|ptr[3]<<24) #define UNALIGNED_SAFE #endif #else /* Unknown endianess so last resort is to read individual bytes */ #define READ_UINT32(ptr) (ptr[0]|ptr[1]<<8|ptr[2]<<16|ptr[3]<<24) /* Since we're not doing word-reads we can skip the messing about with realignment */ #define UNALIGNED_SAFE #endif /* Find best way to ROTL32 */ #if defined(_MSC_VER) #include /* Microsoft put _rotl declaration in here */ #define ROTL32(x,r) _rotl(x,r) #else /* gcc recognises this code and generates a rotate instruction for CPUs with one */ #define ROTL32(x,r) (((uint32_t)x << r) | ((uint32_t)x >> (32 - r))) #endif /*----------------------------------------------------------------------------- * Core murmurhash algorithm macros */ #define C1 (0xcc9e2d51) #define C2 (0x1b873593) /* This is the main processing body of the algorithm. It operates * on each full 32-bits of input. */ #define DOBLOCK(h1, k1) do{ \ k1 *= C1; \ k1 = ROTL32(k1,15); \ k1 *= C2; \ \ h1 ^= k1; \ h1 = ROTL32(h1,13); \ h1 = h1*5+0xe6546b64; \ }while(0) /* Append unaligned bytes to carry, forcing hash churn if we have 4 bytes */ /* cnt=bytes to process, h1=name of h1 var, c=carry, n=bytes in c, ptr/len=payload */ #define DOBYTES(cnt, h1, c, n, ptr, len) do{ \ int _i = cnt; \ while(_i--) { \ c = c>>8 | *ptr++<<24; \ n++; len--; \ if(n==4) { \ DOBLOCK(h1, c); \ n = 0; \ } \ } }while(0) /*---------------------------------------------------------------------------*/ /* Main hashing function. Initialise carry to 0 and h1 to 0 or an initial seed * if wanted. Both ph1 and pcarry are required arguments. */ void GSPrivateIncrementalHash( uint32_t *ph1, uint32_t *pcarry, const void *key, int len) { uint32_t h1 = *ph1; uint32_t c = *pcarry; const uint8_t *ptr = (uint8_t*)key; const uint8_t *end; /* Extract carry count from low 2 bits of c value */ int n = c & 3; #if defined(UNALIGNED_SAFE) /* This CPU handles unaligned word access */ /* Consume any carry bytes */ int i = (4-n) & 3; if(i && i <= len) { DOBYTES(i, h1, c, n, ptr, len); } /* Process 32-bit chunks */ end = ptr + len/4*4; for( ; ptr < end ; ptr+=4) { uint32_t k1 = READ_UINT32(ptr); DOBLOCK(h1, k1); } #else /*UNALIGNED_SAFE*/ /* This CPU does not handle unaligned word access */ /* Consume enough so that the next data byte is word aligned */ int i = -(long)ptr & 3; if(i && i <= len) { DOBYTES(i, h1, c, n, ptr, len); } /* We're now aligned. Process in aligned blocks. Specialise for each possible carry count */ end = ptr + len/4*4; switch(n) { /* how many bytes in c */ case 0: /* c=[----] w=[3210] b=[3210]=w c'=[----] */ for( ; ptr < end ; ptr+=4) { uint32_t k1 = READ_UINT32(ptr); DOBLOCK(h1, k1); } break; case 1: /* c=[0---] w=[4321] b=[3210]=c>>24|w<<8 c'=[4---] */ for( ; ptr < end ; ptr+=4) { uint32_t k1 = c>>24; c = READ_UINT32(ptr); k1 |= c<<8; DOBLOCK(h1, k1); } break; case 2: /* c=[10--] w=[5432] b=[3210]=c>>16|w<<16 c'=[54--] */ for( ; ptr < end ; ptr+=4) { uint32_t k1 = c>>16; c = READ_UINT32(ptr); k1 |= c<<16; DOBLOCK(h1, k1); } break; case 3: /* c=[210-] w=[6543] b=[3210]=c>>8|w<<24 c'=[654-] */ for( ; ptr < end ; ptr+=4) { uint32_t k1 = c>>8; c = READ_UINT32(ptr); k1 |= c<<24; DOBLOCK(h1, k1); } } #endif /*UNALIGNED_SAFE*/ /* Advance over whole 32-bit chunks, possibly leaving 1..3 bytes */ len -= len/4*4; /* Append any remaining bytes into carry */ DOBYTES(len, h1, c, n, ptr, len); /* Copy out new running hash and carry */ *ph1 = h1; *pcarry = (c & ~0xff) | n; } /*---------------------------------------------------------------------------*/ /* Finalize a hash. To match the original Murmur3A the total_length must be provided */ uint32_t GSPrivateFinishHash(uint32_t h, uint32_t carry, uint32_t total_length) { uint32_t k1; int n = carry & 3; if(n) { k1 = carry >> (4-n)*8; k1 *= C1; k1 = ROTL32(k1,15); k1 *= C2; h ^= k1; } h ^= total_length; /* fmix */ h ^= h >> 16; h *= 0x85ebca6b; h ^= h >> 13; h *= 0xc2b2ae35; h ^= h >> 16; return h; } #endif /* OLDHASH */ gnustep-base-1.29.0/Source/GSQuickSort.m000066400000000000000000000050421435650067400200070ustar00rootroot00000000000000/* Implementation of QuickSort for GNUStep Copyright (C) 2005-2012 Free Software Foundation, Inc. Written by: Saso Kiselkov Date: 2005 Modified by: Niels Grewe Date: September 2012 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #import "Foundation/NSSortDescriptor.h" #import "Foundation/NSArray.h" #import "Foundation/NSObjCRuntime.h" #import "GSSorting.h" /** * Sorts the provided object array's sortRange according to sortDescriptor. */ // Quicksort algorithm copied from Wikipedia :-). static inline void SwapObjects(id * o1, id * o2) { id temp; temp = *o1; *o1 = *o2; *o2 = temp; } static void _GSQuickSort(id *objects, NSRange sortRange, id comparisonEntity, GSComparisonType type, void *context) { if (sortRange.length > 1) { id pivot = objects[sortRange.location]; unsigned int left = sortRange.location + 1; unsigned int right = NSMaxRange(sortRange); while (left < right) { if (GSCompareUsingDescriptorOrComparator(objects[left], pivot, comparisonEntity, type, context) == NSOrderedDescending) { SwapObjects(&objects[left], &objects[--right]); } else { left++; } } SwapObjects(&objects[--left], &objects[sortRange.location]); _GSQuickSort(objects, NSMakeRange(sortRange.location, left - sortRange.location), comparisonEntity, type, context); _GSQuickSort(objects, NSMakeRange(right, NSMaxRange(sortRange) - right), comparisonEntity, type, context); } } @interface GSQuickSortPlaceHolder : NSObject + (void) setUnstable; @end @implementation GSQuickSortPlaceHolder + (void) setUnstable { _GSSortUnstable = _GSQuickSort; } @end gnustep-base-1.29.0/Source/GSRunLoopCtxt.h000066400000000000000000000055421435650067400203240ustar00rootroot00000000000000#ifndef __GSRunLoopCtxt_h_GNUSTEP_BASE_INCLUDE #define __GSRunLoopCtxt_h_GNUSTEP_BASE_INCLUDE /** Copyright (C) 2008-2009 Free Software Foundation, Inc. By: Richard Frith-Macdonald This file is part of the GNUstep Base Library. 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 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 USA. $Date$ $Revision$ */ #import "common.h" #import "Foundation/NSException.h" #import "Foundation/NSMapTable.h" #import "Foundation/NSRunLoop.h" /* * Setup for inline operation of arrays. */ #define GSI_ARRAY_TYPES GSUNION_OBJ #define GSI_ARRAY_RELEASE(A, X) [(X).obj release] #define GSI_ARRAY_RETAIN(A, X) [(X).obj retain] #include "GNUstepBase/GSIArray.h" #ifdef HAVE_POLL typedef struct{ int limit; short *index; }pollextra; #endif @class NSString; @class GSRunLoopWatcher; @interface GSRunLoopCtxt : NSObject { @public void *extra; /** Copy of the RunLoop ivar. */ NSString *mode; /** The mode for this context. */ GSIArray performers; /** The actions to perform regularly. */ unsigned maxPerformers; GSIArray timers; /** The timers set for the runloop mode */ unsigned maxTimers; GSIArray watchers; /** The inputs set for the runloop mode */ unsigned maxWatchers; @private #if defined(_WIN32) NSMapTable *handleMap; NSMapTable *winMsgMap; #else NSMapTable *_efdMap; NSMapTable *_rfdMap; NSMapTable *_wfdMap; #endif GSIArray _trigger; // Watchers to trigger unconditionally. int fairStart; // For trying to ensure fair handling. BOOL completed; // To mark operation as completed. #ifdef HAVE_POLL unsigned int pollfds_capacity; unsigned int pollfds_count; struct pollfd *pollfds; #endif } /* Check to see of the thread has been awakened, blocking until it * does get awakened or until the limit date has been reached. * A date in the past (or nil) results in a check followed by an * immediate return. */ + (BOOL) awakenedBefore: (NSDate*)when; - (void) endEvent: (void*)data for: (GSRunLoopWatcher*)watcher; - (void) endPoll; - (id) initWithMode: (NSString*)theMode extra: (void*)e; - (BOOL) pollUntil: (int)milliseconds within: (NSArray*)contexts; @end #endif /* __GSRunLoopCtxt_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Source/GSRunLoopWatcher.h000066400000000000000000000057021435650067400207750ustar00rootroot00000000000000#ifndef __GSRunLoopWatcher_h_GNUSTEP_BASE_INCLUDE #define __GSRunLoopWatcher_h_GNUSTEP_BASE_INCLUDE /** Copyright (C) 2008-2009 Free Software Foundation, Inc. By: Richard Frith-Macdonald This file is part of the GNUstep Base Library. 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 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 USA. $Date$ $Revision$ */ /* * The 'GSRunLoopWatcher' class was written to permit the (relatively) * easy addition of new events to be watched for in the runloop. * * To add a new type of event, the 'RunLoopEventType' enumeration must be * extended, and the methods must be modified to handle the new type. * * The internal variables if the GSRunLoopWatcher are used as follows - * * If '_invalidated' is set, the watcher should be disabled and should * be removed from the runloop when next encountered. * * If 'checkBlocking' is set, the run loop should ask the watcher * whether it should block and/or trigger each loop iteration. * * The 'data' variable is used to identify the resource/event that the * watcher is interested in. Its meaning is system dependent. * * The 'receiver' is the object which should be told when the event * occurs. This object is NOT retained so that we can avoid retain * loops. It is the responsibility of the receiver to invalidate * the watcher before it is destroyed. * * The 'type' variable indentifies the type of event watched for. * NSRunLoops [-acceptInputForMode: beforeDate: ] method MUST contain * code to watch for events of each type. * * NB. This class is private to NSRunLoop and must not be subclassed. */ #import "common.h" #import "Foundation/NSRunLoop.h" @class NSDate; @interface GSRunLoopWatcher: NSObject { @public BOOL _invalidated; BOOL checkBlocking; void *data; id receiver; RunLoopEventType type; unsigned count; } - (id) initWithType: (RunLoopEventType)type receiver: (id)anObj data: (void*)data; /** * Returns a boolean indicating whether the receiver needs the loop to * block to wait for input, or whether the loop can run through at once. * It also sets *trigger to say whether the receiver should be triggered * once the input test has been done or not. */ - (BOOL) runLoopShouldBlock: (BOOL*)trigger; @end #endif /* __GSRunLoopWatcher_h_GNUSTEP_BASE_INCLUDE */ gnustep-base-1.29.0/Source/GSRunLoopWatcher.m000066400000000000000000000050131435650067400207750ustar00rootroot00000000000000/** Copyright (C) 2008-2009 Free Software Foundation, Inc. By: Richard Frith-Macdonald This file is part of the GNUstep Base Library. 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 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 USA. $Date: 2009-02-23 20:42:32 +0000 (Mon, 23 Feb 2009) $ $Revision: 27962 $ */ #import "common.h" #import "GSRunLoopWatcher.h" #import "Foundation/NSException.h" #import "Foundation/NSPort.h" @implementation GSRunLoopWatcher - (void) dealloc { [super dealloc]; } - (id) initWithType: (RunLoopEventType)aType receiver: (id)anObj data: (void*)item { _invalidated = NO; receiver = anObj; data = item; switch (aType) { #if defined(_WIN32) case ET_HANDLE: type = aType; break; case ET_WINMSG: type = aType; break; #else case ET_EDESC: type = aType; break; case ET_RDESC: type = aType; break; case ET_WDESC: type = aType; break; #endif case ET_RPORT: type = aType; break; case ET_TRIGGER: type = aType; break; default: DESTROY(self); [NSException raise: NSInvalidArgumentException format: @"NSRunLoop - unknown event type"]; } if ([anObj respondsToSelector: @selector(runLoopShouldBlock:)]) { checkBlocking = YES; } if (![anObj respondsToSelector: @selector(receivedEvent:type:extra:forMode:)]) { DESTROY(self); [NSException raise: NSInvalidArgumentException format: @"RunLoop listener has no event handling method"]; } return self; } - (BOOL) runLoopShouldBlock: (BOOL*)trigger { if (checkBlocking == YES) { BOOL result = [(id)receiver runLoopShouldBlock: trigger]; return result; } else if (type == ET_TRIGGER) { *trigger = YES; return NO; // By default triggers may fire immediately } *trigger = YES; return YES; // By default we must wait for input sources } @end gnustep-base-1.29.0/Source/GSSet.m000066400000000000000000000447011435650067400166230ustar00rootroot00000000000000/** Concrete implementation of NSSet based on GNU Set class Copyright (C) 1995, 1996, 1998, 2000 Free Software Foundation, Inc. Written by: Andrew Kachites McCallum Created: September 1995 Rewrite by: Richard Frith-Macdonald This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #import "Foundation/NSSet.h" #import "GNUstepBase/GSObjCRuntime.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSArray.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSException.h" #import "Foundation/NSPortCoder.h" // For private method _decodeArrayOfObjectsForKey: #import "Foundation/NSKeyedArchiver.h" #import "GSPrivate.h" #define GSI_MAP_HAS_VALUE 0 #define GSI_MAP_KTYPES GSUNION_OBJ #include "GNUstepBase/GSIMap.h" static SEL memberSel; static SEL privateCountOfSel; @interface GSSet : NSSet { @public GSIMapTable_t map; } @end @interface GSMutableSet : NSMutableSet { @public GSIMapTable_t map; @private unsigned long _version; } @end @interface GSSetEnumerator : NSEnumerator { GSSet *set; GSIMapEnumerator_t enumerator; } @end @implementation GSSetEnumerator - (id) initWithSet: (NSSet*)d { self = [super init]; if (self != nil) { set = (GSSet*)RETAIN(d); enumerator = GSIMapEnumeratorForMap(&set->map); } return self; } - (id) nextObject { GSIMapNode node = GSIMapEnumeratorNextNode(&enumerator); if (node == 0) { return nil; } return node->key.obj; } - (void) dealloc { GSIMapEndEnumerator(&enumerator); RELEASE(set); [super dealloc]; } @end @implementation GSSet static Class arrayClass; static Class setClass; static Class mutableSetClass; - (NSUInteger) sizeOfContentExcluding: (NSHashTable*)exclude { NSUInteger size = GSIMapSize(&map) - sizeof(GSIMapTable); GSIMapEnumerator_t enumerator = GSIMapEnumeratorForMap(&map); GSIMapNode node = GSIMapEnumeratorNextNode(&enumerator); while (node != 0) { size += [node->key.obj sizeInBytesExcluding: exclude]; node = GSIMapEnumeratorNextNode(&enumerator); } GSIMapEndEnumerator(&enumerator); return size; } + (void) initialize { if (self == [GSSet class]) { arrayClass = [NSArray class]; setClass = [GSSet class]; mutableSetClass = [GSMutableSet class]; memberSel = @selector(member:); privateCountOfSel = @selector(_countForObject:); } } - (NSArray*) allObjects { GSIMapEnumerator_t enumerator = GSIMapEnumeratorForMap(&map); GSIMapNode node = GSIMapEnumeratorNextNode(&enumerator); NSUInteger i = 0; NSArray *result; GS_BEGINIDBUF(objects, map.nodeCount); while (node != 0) { objects[i++] = node->key.obj; node = GSIMapEnumeratorNextNode(&enumerator); } GSIMapEndEnumerator(&enumerator); result = AUTORELEASE([[arrayClass allocWithZone: NSDefaultMallocZone()] initWithObjects: objects count: i]); GS_ENDIDBUF(); return result; } - (id) anyObject { if (map.nodeCount > 0) { GSIMapBucket bucket = map.buckets; while (1) { if (bucket->firstNode) { return bucket->firstNode->key.obj; } else { bucket++; } } } else { return nil; } } - (id) copyWithZone: (NSZone*)z { return RETAIN(self); } - (NSUInteger) count { return map.nodeCount; } - (void) dealloc { GSIMapEmptyMap(&map); [super dealloc]; } - (void) encodeWithCoder: (NSCoder*)aCoder { if ([aCoder allowsKeyedCoding]) { [super encodeWithCoder: aCoder]; } else { unsigned count = map.nodeCount; SEL sel = @selector(encodeObject:); IMP imp = [aCoder methodForSelector: sel]; GSIMapEnumerator_t enumerator = GSIMapEnumeratorForMap(&map); GSIMapNode node = GSIMapEnumeratorNextNode(&enumerator); [aCoder encodeValueOfObjCType: @encode(unsigned) at: &count]; while (node != 0) { (*imp)(aCoder, sel, node->key.obj); node = GSIMapEnumeratorNextNode(&enumerator); } GSIMapEndEnumerator(&enumerator); } } - (NSUInteger) hash { return map.nodeCount; } - (id) init { return [self initWithObjects: 0 count: 0]; } - (id) initWithCoder: (NSCoder*)aCoder { if ([aCoder allowsKeyedCoding]) { self = [super initWithCoder: aCoder]; } else { unsigned count; id value; SEL sel = @selector(decodeValueOfObjCType:at:); IMP imp = [aCoder methodForSelector: sel]; const char *type = @encode(id); (*imp)(aCoder, sel, @encode(unsigned), &count); GSIMapInitWithZoneAndCapacity(&map, [self zone], count); while (count-- > 0) { (*imp)(aCoder, sel, type, &value); GSIMapAddKeyNoRetain(&map, (GSIMapKey)value); } } return self; } /* Designated initialiser */ - (id) initWithObjects: (const id*)objs count: (NSUInteger)c { NSUInteger i; GSIMapInitWithZoneAndCapacity(&map, [self zone], c); for (i = 0; i < c; i++) { GSIMapNode node; if (objs[i] == nil) { DESTROY(self); [NSException raise: NSInvalidArgumentException format: @"Tried to init set with nil value"]; } node = GSIMapNodeForKey(&map, (GSIMapKey)objs[i]); if (node == 0) { GSIMapAddKey(&map, (GSIMapKey)objs[i]); } } return self; } - (BOOL) intersectsSet: (NSSet*) otherSet { Class c; /* If this set is empty, or the other is nil/empty, * this method should return NO. */ if (0 == map.nodeCount || nil == otherSet || [otherSet count] == 0) { return NO; } // Loop for all members in otherSet c = object_getClass(otherSet); if (c == setClass || c == mutableSetClass) { GSIMapTable m = &((GSSet*)otherSet)->map; GSIMapEnumerator_t enumerator = GSIMapEnumeratorForMap(m); GSIMapNode node = GSIMapEnumeratorNextNode(&enumerator); while (node != 0) { if (GSIMapNodeForKey(&map, node->key) != 0) { GSIMapEndEnumerator(&enumerator); return YES; } node = GSIMapEnumeratorNextNode(&enumerator); } GSIMapEndEnumerator(&enumerator); } else { NSEnumerator *e; id o; e = [otherSet objectEnumerator]; while ((o = [e nextObject])) // 1. pick a member from otherSet. { if (GSIMapNodeForKey(&map, (GSIMapKey)o) != 0) { return YES; } } } return NO; } - (BOOL) isSubsetOfSet: (NSSet*) otherSet { GSIMapEnumerator_t enumerator; GSIMapNode node; IMP imp; // -1. members of this set(self) <= that of otherSet if (map.nodeCount > [otherSet count]) { return NO; } if (map.nodeCount == 0) { return YES; } imp = [otherSet methodForSelector: memberSel]; enumerator = GSIMapEnumeratorForMap(&map); node = GSIMapEnumeratorNextNode(&enumerator); // 0. Loop for all members in this set(self). while (node != 0) { // 1. check the member is in the otherSet. if ((*imp)(otherSet, memberSel, node->key.obj) != nil) { // 1.1 if true -> continue, try to check the next member. node = GSIMapEnumeratorNextNode(&enumerator); } else { // 1.2 if false -> return NO; GSIMapEndEnumerator(&enumerator); return NO; } } GSIMapEndEnumerator(&enumerator); // 2. return YES; all members in this set are also in the otherSet. return YES; } - (BOOL) isEqualToSet: (NSSet*)other { if (other == nil) { return NO; } else if (other == self) { return YES; } else { Class c = object_getClass(other); if (c == setClass || c == mutableSetClass) { if (map.nodeCount != ((GSSet*)other)->map.nodeCount) { return NO; } else if (map.nodeCount == 0) { return YES; } else { GSIMapEnumerator_t enumerator; GSIMapNode node; enumerator = GSIMapEnumeratorForMap(&map); node = GSIMapEnumeratorNextNode(&enumerator); while (node != 0) { if (GSIMapNodeForKey(&(((GSSet*)other)->map), node->key) == 0) { GSIMapEndEnumerator(&enumerator); return NO; } node = GSIMapEnumeratorNextNode(&enumerator); } GSIMapEndEnumerator(&enumerator); } } else { if (map.nodeCount != [other count]) { return NO; } else if (map.nodeCount == 0) { return YES; } else { GSIMapEnumerator_t enumerator; GSIMapNode node; IMP imp; IMP countImp; imp = [other methodForSelector: memberSel]; countImp = [other methodForSelector: privateCountOfSel]; enumerator = GSIMapEnumeratorForMap(&map); node = GSIMapEnumeratorNextNode(&enumerator); while (node != 0) { if ((*imp)(other, memberSel, node->key.obj) == nil) { GSIMapEndEnumerator(&enumerator); return NO; } else { NSUInteger c = (NSUInteger) countImp(other,privateCountOfSel,node->key.obj); // GSSet does not have duplicate entries if (c != 1) { return NO; } } node = GSIMapEnumeratorNextNode(&enumerator); } GSIMapEndEnumerator(&enumerator); } } return YES; } } - (BOOL) makeImmutable { return YES; } - (void) makeObjectsPerform: (SEL)aSelector { GSIMapEnumerator_t enumerator = GSIMapEnumeratorForMap(&map); GSIMapNode node = GSIMapEnumeratorNextNode(&enumerator); while (node != 0) { [node->key.obj performSelector: aSelector]; node = GSIMapEnumeratorNextNode(&enumerator); } GSIMapEndEnumerator(&enumerator); } - (void) makeObjectsPerformSelector: (SEL)aSelector { GSIMapEnumerator_t enumerator = GSIMapEnumeratorForMap(&map); GSIMapNode node = GSIMapEnumeratorNextNode(&enumerator); while (node != 0) { [node->key.obj performSelector: aSelector]; node = GSIMapEnumeratorNextNode(&enumerator); } GSIMapEndEnumerator(&enumerator); } - (void) makeObjectsPerformSelector: (SEL)aSelector withObject: argument { GSIMapEnumerator_t enumerator = GSIMapEnumeratorForMap(&map); GSIMapNode node = GSIMapEnumeratorNextNode(&enumerator); while (node != 0) { [node->key.obj performSelector: aSelector withObject: argument]; node = GSIMapEnumeratorNextNode(&enumerator); } GSIMapEndEnumerator(&enumerator); } - (void) makeObjectsPerform: (SEL)aSelector withObject: argument { GSIMapEnumerator_t enumerator = GSIMapEnumeratorForMap(&map); GSIMapNode node = GSIMapEnumeratorNextNode(&enumerator); while (node != 0) { [node->key.obj performSelector: aSelector withObject: argument]; node = GSIMapEnumeratorNextNode(&enumerator); } GSIMapEndEnumerator(&enumerator); } - (id) member: (id)anObject { if (anObject != nil) { GSIMapNode node = GSIMapNodeForKey(&map, (GSIMapKey)anObject); if (node != 0) { return node->key.obj; } } return nil; } - (NSEnumerator*) objectEnumerator { return AUTORELEASE([[GSSetEnumerator alloc] initWithSet: self]); } - (NSUInteger) countByEnumeratingWithState: (NSFastEnumerationState*)state objects: (id*)stackbuf count: (NSUInteger)len { state->mutationsPtr = (unsigned long *)self; return GSIMapCountByEnumeratingWithStateObjectsCount (&map, state, stackbuf, len); } @end @implementation GSMutableSet - (NSUInteger) sizeOfContentExcluding: (NSHashTable*)exclude { /* Can't safely calculate for mutable object; just buffer size */ return map.nodeCount * sizeof(GSIMapNode); } + (void) initialize { if (self == [GSMutableSet class]) { GSObjCAddClassBehavior(self, [GSSet class]); } } - (void) addObject: (id)anObject { GSIMapNode node; if (anObject == nil) { [NSException raise: NSInvalidArgumentException format: @"Tried to add nil to set"]; } node = GSIMapNodeForKey(&map, (GSIMapKey)anObject); if (node == 0) { GSIMapAddKey(&map, (GSIMapKey)anObject); _version++; } } - (void) addObjectsFromArray: (NSArray*)array { NSUInteger count = [array count]; while (count-- > 0) { id anObject = [array objectAtIndex: count]; if (anObject == nil) { [NSException raise: NSInvalidArgumentException format: @"Tried to add nil to set"]; } else { GSIMapNode node; node = GSIMapNodeForKey(&map, (GSIMapKey)anObject); if (node == 0) { GSIMapAddKey(&map, (GSIMapKey)anObject); _version++; } } } } /* Override _version from GSSet */ - (id) copyWithZone: (NSZone*)z { NSSet *copy = [setClass allocWithZone: z]; return [copy initWithSet: self copyItems: NO]; } - (id) init { return [self initWithCapacity: 0]; } /* Designated initialiser */ - (id) initWithCapacity: (NSUInteger)cap { GSIMapInitWithZoneAndCapacity(&map, [self zone], cap); return self; } - (id) initWithObjects: (const id*)objects count: (NSUInteger)count { self = [self initWithCapacity: count]; while (count--) { id anObject = objects[count]; if (anObject == nil) { NSLog(@"Tried to init a set with a nil object"); continue; } else { GSIMapNode node; node = GSIMapNodeForKey(&map, (GSIMapKey)anObject); if (node == 0) { GSIMapAddKey(&map, (GSIMapKey)anObject); } } } return self; } - (void) intersectSet: (NSSet*)other { if (nil == other) { GSIMapCleanMap(&map); } else if (other != self && map.nodeCount > 0) { GSIMapEnumerator_t enumerator; GSIMapBucket bucket; GSIMapNode node; Class c; if (NO == [other isKindOfClass: [NSSet class]]) { [NSException raise: NSInvalidArgumentException format: @"-intersectSet: other object is not a set"]; } if (0 == map.nodeCount) { return; // Already empty ... nothing to do } if (0 == [other count]) { GSIMapCleanMap(&map); // Other empty ... no intersection return; } c = object_getClass(other); if (c == setClass || c == mutableSetClass) { GSSet *o = (GSSet*)other; enumerator = GSIMapEnumeratorForMap(&map); bucket = GSIMapEnumeratorBucket(&enumerator); node = GSIMapEnumeratorNextNode(&enumerator); while (node != 0) { if (0 == GSIMapNodeForKey(&o->map, node->key)) { GSIMapRemoveNodeFromMap(&map, bucket, node); GSIMapFreeNode(&map, node); } bucket = GSIMapEnumeratorBucket(&enumerator); node = GSIMapEnumeratorNextNode(&enumerator); } GSIMapEndEnumerator(&enumerator); } else { SEL sel = @selector(member:); IMP imp = [other methodForSelector: sel]; enumerator = GSIMapEnumeratorForMap(&map); bucket = GSIMapEnumeratorBucket(&enumerator); node = GSIMapEnumeratorNextNode(&enumerator); while (node != 0) { if (nil == (*imp)(other, sel, node->key.obj)) { GSIMapRemoveNodeFromMap(&map, bucket, node); GSIMapFreeNode(&map, node); } bucket = GSIMapEnumeratorBucket(&enumerator); node = GSIMapEnumeratorNextNode(&enumerator); } GSIMapEndEnumerator(&enumerator); } } } - (BOOL) makeImmutable { GSClassSwizzle(self, [GSSet class]); return YES; } - (id) makeImmutableCopyOnFail: (BOOL)force { GSClassSwizzle(self, [GSSet class]); return self; } - (void) minusSet: (NSSet*) other { if (other == self) { GSIMapCleanMap(&map); } else { NSEnumerator *e = [other objectEnumerator]; id anObject; while ((anObject = [e nextObject]) != nil) { GSIMapRemoveKey(&map, (GSIMapKey)anObject); _version++; } } } - (void) removeAllObjects { GSIMapCleanMap(&map); } - (void) removeObject: (id)anObject { if (anObject == nil) { NSWarnMLog(@"attempt to remove nil object"); return; } GSIMapRemoveKey(&map, (GSIMapKey)anObject); _version++; } - (void) unionSet: (NSSet*) other { if (other != self) { NSEnumerator *e = [other objectEnumerator]; if (e != nil) { id anObject; SEL sel = @selector(nextObject); IMP imp = [e methodForSelector: sel]; while ((anObject = (*imp)(e, sel)) != nil) { GSIMapNode node; node = GSIMapNodeForKey(&map, (GSIMapKey)anObject); if (node == 0) { GSIMapAddKey(&map, (GSIMapKey)anObject); _version++; } } } } } - (NSUInteger) countByEnumeratingWithState: (NSFastEnumerationState*)state objects: (id*)stackbuf count: (NSUInteger)len { state->mutationsPtr = &_version; return GSIMapCountByEnumeratingWithStateObjectsCount (&map, state, stackbuf, len); } @end @interface NSGSet : NSSet @end @implementation NSGSet - (id) initWithCoder: (NSCoder*)aCoder { NSLog(@"Warning - decoding archive containing obsolete %@ object - please delete/replace this archive", NSStringFromClass([self class])); DESTROY(self); self = (id)NSAllocateObject([GSSet class], 0, NSDefaultMallocZone()); self = [self initWithCoder: aCoder]; return self; } @end @interface NSGMutableSet : NSMutableSet @end @implementation NSGMutableSet - (id) initWithCoder: (NSCoder*)aCoder { NSLog(@"Warning - decoding archive containing obsolete %@ object - please delete/replace this archive", NSStringFromClass([self class])); DESTROY(self); self = (id)NSAllocateObject([GSMutableSet class], 0, NSDefaultMallocZone()); self = [self initWithCoder: aCoder]; return self; } @end gnustep-base-1.29.0/Source/GSShellSort.m000066400000000000000000000057561435650067400200160ustar00rootroot00000000000000/* Implementation of ShellSort for GNUStep Copyright (C) 1995-2012 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Modified by: Niels Grewe Date: September 2012 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #import "Foundation/NSSortDescriptor.h" #import "Foundation/NSArray.h" #import "Foundation/NSObjCRuntime.h" #import "GSSorting.h" void _GSShellSort(id *objects, NSRange sortRange, id comparisonEntity, GSComparisonType type, void *context) { /* Shell sort algorithm taken from SortingInAction - a NeXT example */ #define STRIDE_FACTOR 3 // good value for stride factor is not well-understood // 3 is a fairly good choice (Sedgewick) NSUInteger c; NSUInteger d; NSUInteger stride = 1; BOOL found; NSUInteger count = NSMaxRange(sortRange); #ifdef GSWARN BOOL badComparison = NO; #endif while (stride <= count) { stride = stride * STRIDE_FACTOR + 1; } while (stride > (STRIDE_FACTOR - 1)) { // loop to sort for each value of stride stride = stride / STRIDE_FACTOR; for (c = (sortRange.location + stride); c < count; c++) { found = NO; if (stride > c) { break; } d = c - stride; while (!found) /* move to left until correct place */ { id a = objects[d + stride]; id b = objects[d]; NSComparisonResult r; r = GSCompareUsingDescriptorOrComparator(a, b, comparisonEntity, type, context); if (r < 0) { #ifdef GSWARN if (r != NSOrderedAscending) { badComparison = YES; } #endif objects[d + stride] = b; objects[d] = a; if (stride > d) { break; } d -= stride; // jump by stride factor } else { #ifdef GSWARN if (r != NSOrderedDescending && r != NSOrderedSame) { badComparison = YES; } #endif found = YES; } } } } #ifdef GSWARN if (badComparison == YES) { NSWarnFLog(@"Detected bad return value from comparison"); } #endif } @interface GSShellSortPlaceHolder : NSObject + (void) setUnstable; @end @implementation GSShellSortPlaceHolder + (void) setUnstable { _GSSortUnstable = _GSShellSort; } @end gnustep-base-1.29.0/Source/GSSocketStream.h000066400000000000000000000143111435650067400204610ustar00rootroot00000000000000#ifndef INCLUDED_GSSOCKETSTREAM_H #define INCLUDED_GSSOCKETSTREAM_H /** Implementation for GSSocketStream for GNUStep Copyright (C) 2006-2008 Free Software Foundation, Inc. Written by: Derek Zhou Written by: Richard Frith-Macdonald Date: 2006 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 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 USA. */ /* You should have included GSStream.h before this */ #import "GSNetwork.h" typedef union { struct sockaddr s; struct sockaddr_in i4; #ifdef AF_INET6 struct sockaddr_in6 i6; #endif #ifndef _WIN32 struct sockaddr_un u; #endif } sockaddr_any; #define SOCKIVARS \ { \ id _sibling; /* For bidirectional traffic. */\ BOOL _passive; /* YES means already connected. */\ BOOL _closing; /* Must close on next failure. */\ SOCKET _sock; /* Needed for ms-windows. */\ id _handler; /* TLS/SOCKS handler. */\ sockaddr_any _address; /* Socket address info. */\ } /* The semi-abstract GSSocketStream class is not intended to be subclassed * but is used to add behaviors to other socket based classes. */ @interface GSSocketStream : GSStream SOCKIVARS /** * get the sockaddr */ - (struct sockaddr*) _address; /** * set the sockaddr */ - (void) _setAddress: (struct sockaddr*)address; /** * setter for closing flag ... the remote end has stopped either sending * or receiving, so any I/O operation which would block means that the * connection is no longer operable in that direction. */ - (void) _setClosing: (BOOL)passive; /* * Set the handler for this stream. */ - (void) _setHandler: (id)h; /** * setter for passive (the underlying socket connection is already open and * doesw not need to be re-opened). */ - (void) _setPassive: (BOOL)passive; /** * setter for sibling */ - (void) _setSibling: (GSSocketStream*)sibling; /* * Set the socket used for this stream. */ - (void) _setSock: (SOCKET)sock; /* * Set the socket address from string information. */ - (BOOL) _setSocketAddress: (NSString*)address port: (NSInteger)port family: (NSInteger)family; /* Return the socket */ - (SOCKET) _sock; @end /** * The abstract subclass of NSInputStream that reads from a socket. * It inherits from GSInputStream and adds behaviors from GSSocketStream * so it must have the same instance variable layout as GSSocketStream. */ @interface GSSocketInputStream : GSInputStream SOCKIVARS @end @interface GSSocketInputStream (AddedBehaviors) - (struct sockaddr*) _address; - (void) _setAddress: (struct sockaddr*)address; - (NSInteger) _read: (uint8_t *)buffer maxLength: (NSUInteger)len; - (void) _setClosing: (BOOL)passive; - (void) _setHandler: (id)h; - (void) _setPassive: (BOOL)passive; - (void) _setSibling: (GSSocketStream*)sibling; - (void) _setSock: (SOCKET)sock; - (BOOL) _setSocketAddress: (NSString*)address port: (NSInteger)port family: (NSInteger)family; - (SOCKET) _sock; @end @interface GSInetInputStream : GSSocketInputStream /** * the designated initializer */ - (id) initToAddr: (NSString*)addr port: (NSInteger)port; @end @interface GSInet6InputStream : GSSocketInputStream /** * the designated initializer */ - (id) initToAddr: (NSString*)addr port: (NSInteger)port; @end /** * The abstract subclass of NSOutputStream that writes to a socket. * It inherits from GSOutputStream and adds behaviors from GSSocketStream * so it must have the same instance variable layout as GSSocketStream. */ @interface GSSocketOutputStream : GSOutputStream SOCKIVARS @end @interface GSSocketOutputStream (AddedBehaviors) - (struct sockaddr*) _address; - (void) _setAddress: (struct sockaddr*)address; - (void) _setClosing: (BOOL)passive; - (void) _setHandler: (id)h; - (void) _setPassive: (BOOL)passive; - (void) _setSibling: (GSSocketStream*)sibling; - (void) _setSock: (SOCKET)sock; - (BOOL) _setSocketAddress: (NSString*)address port: (NSInteger)port family: (NSInteger)family; - (SOCKET) _sock; - (NSInteger) _write: (const uint8_t *)buffer maxLength: (NSUInteger)len; @end @interface GSInetOutputStream : GSSocketOutputStream /** * the designated initializer */ - (id) initToAddr: (NSString*)addr port: (NSInteger)port; @end @interface GSInet6OutputStream : GSSocketOutputStream /** * the designated initializer */ - (id) initToAddr: (NSString*)addr port: (NSInteger)port; @end /** * The subclass of NSStream that accepts connections from a socket. * It inherits from GSAbstractServerStream and adds behaviors from * GSSocketStream so it must have the same instance variable layout * as GSSocketStream. */ @interface GSSocketServerStream : GSAbstractServerStream SOCKIVARS /** * Return the class of the inputStream associated with this * type of serverStream. */ - (Class) _inputStreamClass; /** * Return the class of the outputStream associated with this * type of serverStream. */ - (Class) _outputStreamClass; @end @interface GSSocketServerStream (AddedBehaviors) - (struct sockaddr*) _address; - (void) _setAddress: (struct sockaddr*)address; - (void) _setClosing: (BOOL)passive; - (void) _setHandler: (id)h; - (void) _setPassive: (BOOL)passive; - (void) _setSibling: (GSSocketStream*)sibling; - (void) _setSock: (SOCKET)sock; - (BOOL) _setSocketAddress: (NSString*)address port: (NSInteger)port family: (NSInteger)family; - (SOCKET) _sock; @end @interface GSInetServerStream : GSSocketServerStream @end @interface GSInet6ServerStream : GSSocketServerStream @end #endif gnustep-base-1.29.0/Source/GSSocketStream.m000066400000000000000000002251411435650067400204730ustar00rootroot00000000000000/** Implementation for GSSocketStream for GNUStep Copyright (C) 2006-2008 Free Software Foundation, Inc. Written by: Derek Zhou Written by: Richard Frith-Macdonald Date: 2006 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 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 USA. */ #import "common.h" #import "Foundation/NSArray.h" #import "Foundation/NSByteOrder.h" #import "Foundation/NSData.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSException.h" #import "Foundation/NSHost.h" #import "Foundation/NSLock.h" #import "Foundation/NSNotification.h" #import "Foundation/NSRunLoop.h" #import "Foundation/NSUserDefaults.h" #import "Foundation/NSValue.h" #import "GSPrivate.h" #import "GSStream.h" #import "GSSocketStream.h" #import "GNUstepBase/GSTLS.h" #ifndef SHUT_RD # ifdef SD_RECEIVE # define SHUT_RD SD_RECEIVE # define SHUT_WR SD_SEND # define SHUT_RDWR SD_BOTH # else # define SHUT_RD 0 # define SHUT_WR 1 # define SHUT_RDWR 2 # endif #endif #ifdef _WIN32 #ifdef HAVE_WS2TCPIP_H #include #endif // HAVE_WS2TCPIP_H #if !defined(HAVE_INET_NTOP) extern const char* WSAAPI inet_ntop(int, const void *, char *, size_t); #endif #if !defined(HAVE_INET_NTOP) extern int WSAAPI inet_pton(int , const char *, void *); #endif #define OPTLEN int #else // _WIN32 #define OPTLEN socklen_t #endif // _WIN32 unsigned GSPrivateSockaddrLength(struct sockaddr *addr) { switch (addr->sa_family) { case AF_INET: return sizeof(struct sockaddr_in); #ifdef AF_INET6 case AF_INET6: return sizeof(struct sockaddr_in6); #endif #ifndef _WIN32 case AF_LOCAL: return sizeof(struct sockaddr_un); #endif default: return 0; } } NSString * GSPrivateSockaddrHost(struct sockaddr *addr) { char buf[40]; #if defined(AF_INET6) if (AF_INET6 == addr->sa_family) { struct sockaddr_in6 *addr6 = (struct sockaddr_in6*)(void*)addr; inet_ntop(AF_INET, &addr6->sin6_addr, buf, sizeof(buf)); return [NSString stringWithUTF8String: buf]; } #endif inet_ntop(AF_INET, &((struct sockaddr_in*)(void*)addr)->sin_addr, buf, sizeof(buf)); return [NSString stringWithUTF8String: buf]; } NSString * GSPrivateSockaddrName(struct sockaddr *addr) { return [NSString stringWithFormat: @"%@:%d", GSPrivateSockaddrHost(addr), GSPrivateSockaddrPort(addr)]; } uint16_t GSPrivateSockaddrPort(struct sockaddr *addr) { uint16_t port; #if defined(AF_INET6) if (AF_INET6 == addr->sa_family) { struct sockaddr_in6 *addr6 = (struct sockaddr_in6*)(void*)addr; port = addr6->sin6_port; port = GSSwapBigI16ToHost(port); return port; } #endif port = ((struct sockaddr_in*)(void*)addr)->sin_port; port = GSSwapBigI16ToHost(port); return port; } BOOL GSPrivateSockaddrSetup(NSString *machine, uint16_t port, NSString *service, NSString *protocol, struct sockaddr *sin) { memset(sin, '\0', sizeof(*sin)); sin->sa_family = AF_INET; /* If we were given a hostname, we use any address for that host. * Otherwise we expect the given name to be an address unless it is * a null (any address). */ if (0 != [machine length]) { const char *n; n = [machine UTF8String]; if ((!isdigit(n[0]) || sscanf(n, "%*d.%*d.%*d.%*d") != 4) && 0 == strchr(n, ':')) { machine = [[NSHost hostWithName: machine] address]; n = [machine UTF8String]; } if (0 == n) { return NO; } if (0 == strchr(n, ':')) { struct sockaddr_in *addr = (struct sockaddr_in*)(void*)sin; if (inet_pton(AF_INET, n, &addr->sin_addr) <= 0) { return NO; } } else { #if defined(AF_INET6) struct sockaddr_in6 *addr6 = (struct sockaddr_in6*)(void*)sin; sin->sa_family = AF_INET6; if (inet_pton(AF_INET6, n, &addr6->sin6_addr) <= 0) { return NO; } #else return NO; #endif } } else { ((struct sockaddr_in*)(void*)sin)->sin_addr.s_addr = GSSwapHostI32ToBig(INADDR_ANY); } /* The optional service and protocol parameters may be used to * look up the port */ if (nil != service) { const char *sname; const char *proto; struct servent *sp; if (nil == protocol) { proto = "tcp"; } else { proto = [protocol UTF8String]; } sname = [service UTF8String]; if ((sp = getservbyname(sname, proto)) == 0) { const char* ptr = sname; int val = atoi(ptr); while (isdigit(*ptr)) { ptr++; } if (*ptr == '\0' && val <= 0xffff) { port = val; } else if (strcmp(ptr, "gdomap") == 0) { #ifdef GDOMAP_PORT_OVERRIDE port = GDOMAP_PORT_OVERRIDE; #else port = 538; // IANA allocated port #endif } else { return NO; } } else { port = GSSwapBigI16ToHost(sp->s_port); } } #if defined(AF_INET6) if (AF_INET6 == sin->sa_family) { ((struct sockaddr_in6*)(void*)sin)->sin6_port = GSSwapHostI16ToBig(port); } else { ((struct sockaddr_in*)(void*)sin)->sin_port = GSSwapHostI16ToBig(port); } #else ((struct sockaddr_in*)sin)->sin_port = GSSwapHostI16ToBig(port); #endif return YES; } /** The GSStreamHandler abstract class defines the methods used to * implement a handler object for a pair of streams. * The idea is that the handler is installed once the connection is * open, and a handshake is initiated. During the handshake process * all stream events are sent to the handler rather than to the * stream delegate (the streams know to do this because the -handshake * method returns YES to tell them so). * While a handler is installed, the -read:maxLength: and -write:maxLength: * methods of the handle rare called instead of those of the streams (and * the handler may perform I/O using the streams by calling the private * -_read:maxLength: and _write:maxLength: methods instead of the public * methods). */ @interface GSStreamHandler : NSObject { GSSocketInputStream *istream; // Not retained GSSocketOutputStream *ostream; // Not retained BOOL initialised; BOOL handshake; BOOL active; } + (void) tryInput: (GSSocketInputStream*)i output: (GSSocketOutputStream*)o; - (id) initWithInput: (GSSocketInputStream*)i output: (GSSocketOutputStream*)o; - (GSSocketInputStream*) istream; - (GSSocketOutputStream*) ostream; - (void) bye; /* Close down the handled session. */ - (BOOL) handshake; /* A handshake/hello is in progress. */ - (void) hello; /* Start up the session handshake. */ - (BOOL) readable; /* is there buffered data to read? */ - (NSInteger) read: (uint8_t *)buffer maxLength: (NSUInteger)len; - (void) remove: (NSStream*)stream; /* Stream no longer available */ - (void) stream: (NSStream*)stream handleEvent: (NSStreamEvent)event; - (NSInteger) write: (const uint8_t *)buffer maxLength: (NSUInteger)len; @end @implementation GSStreamHandler + (void) initialize { GSMakeWeakPointer(self, "istream"); GSMakeWeakPointer(self, "ostream"); } + (void) tryInput: (GSSocketInputStream*)i output: (GSSocketOutputStream*)o { [self subclassResponsibility: _cmd]; } - (void) bye { [self subclassResponsibility: _cmd]; } - (BOOL) handshake { return handshake; } - (void) hello { [self subclassResponsibility: _cmd]; } - (id) initWithInput: (GSSocketInputStream*)i output: (GSSocketOutputStream*)o { istream = i; ostream = o; handshake = YES; return self; } - (GSSocketInputStream*) istream { return istream; } - (GSSocketOutputStream*) ostream { return ostream; } - (BOOL) readable { return NO; } - (NSInteger) read: (uint8_t *)buffer maxLength: (NSUInteger)len { [self subclassResponsibility: _cmd]; return 0; } - (void) remove: (NSStream*)stream { if ((id)stream == (id)istream) { istream = nil; } if ((id)stream == (id)ostream) { ostream = nil; } } - (void) stream: (NSStream*)stream handleEvent: (NSStreamEvent)event { [self subclassResponsibility: _cmd]; } - (NSInteger) write: (const uint8_t *)buffer maxLength: (NSUInteger)len { [self subclassResponsibility: _cmd]; return 0; } @end #if defined(HAVE_GNUTLS) @interface GSTLSHandler : GSStreamHandler { @public GSTLSSession *session; } /** Populates the dictionary 'dict', copying in all the properties * of the supplied streams. If a property is set for both then * the output stream's one has precedence. */ + (void) populateProperties: (NSMutableDictionary**)dict withSecurityLevel: (NSString*)l fromInputStream: (NSStream*)i orOutputStream: (NSStream*)o; /** Called on verification of the remote end's certificate to tell the * delegate of the input stream who the certificate issuer and owner are. */ - (void) stream: (NSStream*)stream issuer: (NSString*)i owner: (NSString*)o; @end /* Callback to allow the TLS code to pull data from the remote system. * If the operation fails, this sets the error number. */ static ssize_t GSTLSPull(gnutls_transport_ptr_t handle, void *buffer, size_t len) { ssize_t result; GSTLSHandler *tls = (GSTLSHandler*)handle; result = [[tls istream] _read: buffer maxLength: len]; if (result < 0) { int e; if ([[tls istream] streamStatus] == NSStreamStatusError) { e = [[[(GSTLSHandler*)handle istream] streamError] code]; } else { e = EAGAIN; // Tell GNUTLS this would block. } #if HAVE_GNUTLS_TRANSPORT_SET_ERRNO gnutls_transport_set_errno (tls->session->session, e); #else errno = e; // Not thread-safe #endif } return result; } /* Callback to allow the TLS code to push data to the remote system. * If the operation fails, this sets the error number. */ static ssize_t GSTLSPush(gnutls_transport_ptr_t handle, const void *buffer, size_t len) { ssize_t result; GSTLSHandler *tls = (GSTLSHandler*)handle; result = [[tls ostream] _write: buffer maxLength: len]; if (result < 0) { int e; if ([[tls ostream] streamStatus] == NSStreamStatusError) { e = [[[tls ostream] streamError] code]; } else { e = EAGAIN; // Tell GNUTLS this would block. } #if HAVE_GNUTLS_TRANSPORT_SET_ERRNO gnutls_transport_set_errno (tls->session->session, e); #else errno = e; // Not thread-safe #endif } NSDebugFLLog(@"NSStream", @"GSTLSPush write %p of %u on %u", [tls ostream], (unsigned)result, (unsigned)len); return result; } @implementation GSTLSHandler static NSArray *keys = nil; + (void) initialize { [GSTLSObject class]; if (nil == keys) { keys = [[NSArray alloc] initWithObjects: GSTLSCAFile, GSTLSCertificateFile, GSTLSCertificateKeyFile, GSTLSCertificateKeyPassword, GSTLSDebug, GSTLSIssuers, GSTLSOwners, GSTLSPriority, GSTLSRemoteHosts, GSTLSRevokeFile, GSTLSServerName, GSTLSVerify, nil]; [[NSObject leakAt: &keys] release]; } } + (void) populateProperties: (NSMutableDictionary**)dict withSecurityLevel: (NSString*)l fromInputStream: (NSStream*)i orOutputStream: (NSStream*)o { if (NULL != dict) { NSString *str; NSMutableDictionary *opts = *dict; NSUInteger count; if (nil != l) { [opts setObject: l forKey: NSStreamSocketSecurityLevelKey]; } count = [keys count]; while (count-- > 0) { NSString *key = [keys objectAtIndex: count]; str = [o propertyForKey: key]; if (nil == str) str = [i propertyForKey: key]; if (nil != str) [opts setObject: str forKey: key]; } } else { NSWarnLog(@"%@ requires not nil 'dict'", NSStringFromSelector(_cmd)); } } + (void) tryInput: (GSSocketInputStream*)i output: (GSSocketOutputStream*)o { NSString *tls; tls = [i propertyForKey: NSStreamSocketSecurityLevelKey]; if (tls == nil) { tls = [o propertyForKey: NSStreamSocketSecurityLevelKey]; if (tls != nil) { [i setProperty: tls forKey: NSStreamSocketSecurityLevelKey]; } } else { [o setProperty: tls forKey: NSStreamSocketSecurityLevelKey]; } if (tls != nil) { GSTLSHandler *h; h = [[GSTLSHandler alloc] initWithInput: i output: o]; [i _setHandler: h]; [o _setHandler: h]; RELEASE(h); } } - (void) bye { handshake = NO; active = NO; [session disconnect: NO]; } - (void) dealloc { [self bye]; DESTROY(session); [super dealloc]; } - (BOOL) handshake { return handshake; } - (void) hello { if (active == NO) { if (handshake == NO) { /* Set flag to say we are now doing a handshake. */ handshake = YES; } if ([session handshake] == YES) { handshake = NO; // Handshake is now complete. active = [session active]; // Is the TLS session now active? if (NO == active) { NSString *problem = [session problem]; NSError *theError; if (nil == problem) { problem = @"TLS handshake failure"; } theError = [NSError errorWithDomain: NSCocoaErrorDomain code: 0 userInfo: [NSDictionary dictionaryWithObject: problem forKey: NSLocalizedDescriptionKey]]; if ([istream streamStatus] != NSStreamStatusError) { [istream _recordError: theError]; } if ([ostream streamStatus] != NSStreamStatusError) { [ostream _recordError: theError]; } [self bye]; } else { NSString *issuer = [session issuer]; NSString *owner = [session owner]; id del = [istream delegate]; if (nil != issuer && nil != owner && [del respondsToSelector: @selector(stream:issuer:owner:)]) { [del stream: istream issuer: issuer owner: owner]; } } } } } - (id) initWithInput: (GSSocketInputStream*)i output: (GSSocketOutputStream*)o { NSString *str; NSMutableDictionary *opts; BOOL server; // Check whether the input stream has been accepted by a listening socket server = [[i propertyForKey: @"IsServer"] boolValue]; str = [o propertyForKey: NSStreamSocketSecurityLevelKey]; if (nil == str) str = [i propertyForKey: NSStreamSocketSecurityLevelKey]; if ([str isEqual: NSStreamSocketSecurityLevelNone] == YES) { GSOnceMLog(@"NSStreamSocketSecurityLevelNone is insecure ..." @" not implemented"); DESTROY(self); return nil; } else if ([str isEqual: NSStreamSocketSecurityLevelSSLv2] == YES) { GSOnceMLog(@"NSStreamSocketSecurityLevelTLSv2 is insecure ..." @" not implemented"); DESTROY(self); return nil; } else if ([str isEqual: NSStreamSocketSecurityLevelSSLv3] == YES) { str = @"SSLv3"; } else if ([str isEqual: NSStreamSocketSecurityLevelTLSv1] == YES) { str = @"TLSV1"; } else { str = nil; } if ((self = [super initWithInput: i output: o]) == nil) { return nil; } /* Create the options dictionary, copying in any option from the stream * properties. GSTLSPriority overrides NSStreamSocketSecurityLevelKey. */ opts = [NSMutableDictionary new]; [[self class] populateProperties: &opts withSecurityLevel: str fromInputStream: i orOutputStream: o]; session = [[GSTLSSession alloc] initWithOptions: opts direction: (server ? NO : YES) transport: (void*)self push: GSTLSPush pull: GSTLSPull]; [opts release]; initialised = YES; return self; } - (GSSocketInputStream*) istream { return istream; } - (GSSocketOutputStream*) ostream { return ostream; } - (BOOL) readable { if (NO == active || YES == handshake) { return NO; } return ([session pending] > 0) ? YES : NO; } - (NSInteger) read: (uint8_t *)buffer maxLength: (NSUInteger)len { return [session read: buffer length: len]; } - (void) stream: (NSStream*)stream handleEvent: (NSStreamEvent)event { NSDebugMLLog(@"NSStream", @"GSTLSHandler got %@ on %@", [stream stringFromEvent: event], stream); if (handshake == YES) { switch (event) { case NSStreamEventHasSpaceAvailable: case NSStreamEventHasBytesAvailable: case NSStreamEventOpenCompleted: /* try to complete the handshake. */ [self hello]; break; case NSStreamEventErrorOccurred: case NSStreamEventEndEncountered: /* stream error or close ... handshake fails. */ handshake = NO; break; default: break; } if (NO == handshake) { NSDebugMLLog(@"NSStream", @"GSTLSHandler completed on %@", stream); /* Make sure that, if ostream gets released as a result of * the event we send to istream, it doesn't get deallocated * and cause a crash when we try to send to it. */ AUTORELEASE(RETAIN(ostream)); if ([istream streamStatus] == NSStreamStatusOpen) { [istream _resetEvents: NSStreamEventOpenCompleted]; [istream _sendEvent: NSStreamEventOpenCompleted]; } else { [istream _resetEvents: NSStreamEventErrorOccurred]; [istream _sendEvent: NSStreamEventErrorOccurred]; } if ([ostream streamStatus] == NSStreamStatusOpen) { [ostream _resetEvents: NSStreamEventOpenCompleted | NSStreamEventHasSpaceAvailable]; [ostream _sendEvent: NSStreamEventOpenCompleted]; [ostream _sendEvent: NSStreamEventHasSpaceAvailable]; } else { [ostream _resetEvents: NSStreamEventErrorOccurred]; [ostream _sendEvent: NSStreamEventErrorOccurred]; } } } } - (void) stream: (NSStream*)stream issuer: (NSString*)i owner: (NSString*)o { return; } - (NSInteger) write: (const uint8_t *)buffer maxLength: (NSUInteger)len { NSInteger offset = 0; /* The low level code to perform the TLS session write may return a * partial write even though the output stream is still writable. * That means we wouldn't get an event to say there's more space and * our overall write (for a large amount of data) could hang. * To avoid that, we try writing more data as long as the stream * still has space available. */ while ([ostream hasSpaceAvailable] && offset < len) { NSInteger written; written = [session write: buffer + offset length: len - offset]; if (written > 0) { offset += written; } } return offset; } @end #else /* HAVE_GNUTLS */ /* GNUTLS not available ... */ @interface GSTLSHandler : GSStreamHandler @end @implementation GSTLSHandler static NSArray *keys = nil; + (void) initialize { if (nil == keys) { keys = [[NSArray alloc] initWithObjects: GSTLSCAFile, GSTLSCertificateFile, GSTLSCertificateKeyFile, GSTLSCertificateKeyPassword, GSTLSDebug, GSTLSIssuers, GSTLSOwners, GSTLSPriority, GSTLSRemoteHosts, GSTLSRevokeFile, GSTLSVerify, nil]; [[NSObject leakAt: &keys] release]; } } + (void) populateProperties: (NSMutableDictionary**)dict withSecurityLevel: (NSString*)l fromInputStream: (NSStream*)i orOutputStream: (NSStream*)o { NSString *str; NSMutableDictionary *opts = *dict; NSUInteger count; if (NULL != dict) { if (nil != l) { [opts setObject: l forKey: NSStreamSocketSecurityLevelKey]; } count = [keys count]; while (count-- > 0) { NSString *key = [keys objectAtIndex: count]; str = [o propertyForKey: key]; if (nil == str) str = [i propertyForKey: key]; if (nil != str) [opts setObject: str forKey: key]; } } else { NSWarnLog(@"%@ requires not nil 'dict'", NSStringFromSelector(_cmd)); } } + (void) tryInput: (GSSocketInputStream*)i output: (GSSocketOutputStream*)o { NSString *tls; tls = [i propertyForKey: NSStreamSocketSecurityLevelKey]; if (tls == nil) { tls = [o propertyForKey: NSStreamSocketSecurityLevelKey]; } if (tls != nil && [tls isEqualToString: NSStreamSocketSecurityLevelNone] == NO) { NSLog(@"Attempt to use SSL/TLS without support."); NSLog(@"Please reconfigure gnustep-base with GNU TLS."); } return; } - (id) initWithInput: (GSSocketInputStream*)i output: (GSSocketOutputStream*)o { DESTROY(self); return nil; } @end #endif /* HAVE_GNUTLS */ /* * States for socks connection negotiation */ static NSString * const GSSOCKSOfferAuth = @"GSSOCKSOfferAuth"; static NSString * const GSSOCKSRecvAuth = @"GSSOCKSRecvAuth"; static NSString * const GSSOCKSSendAuth = @"GSSOCKSSendAuth"; static NSString * const GSSOCKSAckAuth = @"GSSOCKSAckAuth"; static NSString * const GSSOCKSSendConn = @"GSSOCKSSendConn"; static NSString * const GSSOCKSAckConn = @"GSSOCKSAckConn"; @interface GSSOCKS : GSStreamHandler { NSString *state; /* Not retained */ NSString *address; NSString *port; int roffset; int woffset; int rwant; unsigned char rbuffer[128]; } - (void) stream: (NSStream*)stream handleEvent: (NSStreamEvent)event; @end @implementation GSSOCKS + (void) tryInput: (GSSocketInputStream*)i output: (GSSocketOutputStream*)o { NSDictionary *conf; conf = [i propertyForKey: NSStreamSOCKSProxyConfigurationKey]; if (conf == nil) { conf = [o propertyForKey: NSStreamSOCKSProxyConfigurationKey]; if (conf != nil) { [i setProperty: conf forKey: NSStreamSOCKSProxyConfigurationKey]; } } else { [o setProperty: conf forKey: NSStreamSOCKSProxyConfigurationKey]; } if (conf != nil) { GSSOCKS *h; struct sockaddr *sa = [i _address]; NSString *v; BOOL i6 = NO; v = [conf objectForKey: NSStreamSOCKSProxyVersionKey]; if ([v isEqualToString: NSStreamSOCKSProxyVersion4] == YES) { v = NSStreamSOCKSProxyVersion4; } else { v = NSStreamSOCKSProxyVersion5; } #if defined(AF_INET6) if (sa->sa_family == AF_INET6) { i6 = YES; } else #endif if (sa->sa_family != AF_INET) { GSOnceMLog(@"SOCKS not supported for socket type %d", sa->sa_family); return; } if (v == NSStreamSOCKSProxyVersion5) { GSOnceMLog(@"SOCKS 5 not supported yet"); return; } else if (i6 == YES) { GSOnceMLog(@"INET6 not supported with SOCKS 4"); return; } h = [[GSSOCKS alloc] initWithInput: i output: o]; [i _setHandler: h]; [o _setHandler: h]; RELEASE(h); } } - (void) bye { if (handshake == YES) { GSSocketInputStream *is = RETAIN(istream); GSSocketOutputStream *os = RETAIN(ostream); handshake = NO; [is _setHandler: nil]; [os _setHandler: nil]; [GSTLSHandler tryInput: is output: os]; if ([is streamStatus] == NSStreamStatusOpen) { [is _resetEvents: NSStreamEventOpenCompleted]; [is _sendEvent: NSStreamEventOpenCompleted]; } else { [is _resetEvents: NSStreamEventErrorOccurred]; [is _sendEvent: NSStreamEventErrorOccurred]; } if ([os streamStatus] == NSStreamStatusOpen) { [os _resetEvents: NSStreamEventOpenCompleted | NSStreamEventHasSpaceAvailable]; [os _sendEvent: NSStreamEventOpenCompleted]; [os _sendEvent: NSStreamEventHasSpaceAvailable]; } else { [os _resetEvents: NSStreamEventErrorOccurred]; [os _sendEvent: NSStreamEventErrorOccurred]; } RELEASE(is); RELEASE(os); } } - (void) dealloc { RELEASE(address); RELEASE(port); [super dealloc]; } - (void) hello { if (handshake == NO) { handshake = YES; /* Now send self an event to say we can write, to kick off the * handshake with the SOCKS server. */ [self stream: ostream handleEvent: NSStreamEventHasSpaceAvailable]; } } - (id) initWithInput: (GSSocketInputStream*)i output: (GSSocketOutputStream*)o { if ((self = [super initWithInput: i output: o]) != nil) { if ([istream isKindOfClass: [GSInetInputStream class]] == NO) { NSLog(@"Attempt to use SOCKS with non-INET stream ignored"); DESTROY(self); } #if defined(AF_INET6) else if ([istream isKindOfClass: [GSInet6InputStream class]] == YES) { GSOnceMLog(@"INET6 not supported with SOCKS yet..."); DESTROY(self); } #endif /* AF_INET6 */ else { struct sockaddr_in *addr; NSDictionary *conf; NSString *host; int pnum; /* Record the host and port that the streams are supposed to be * connecting to. */ addr = (struct sockaddr_in*)(void*)[istream _address]; address = [[NSString alloc] initWithUTF8String: (char*)inet_ntoa(addr->sin_addr)]; port = [[NSString alloc] initWithFormat: @"%d", (int)GSSwapBigI16ToHost(addr->sin_port)]; /* Now reconfigure the streams so they will actually connect * to the socks proxy server. */ conf = [istream propertyForKey: NSStreamSOCKSProxyConfigurationKey]; host = [conf objectForKey: NSStreamSOCKSProxyHostKey]; pnum = [[conf objectForKey: NSStreamSOCKSProxyPortKey] intValue]; [istream _setSocketAddress: host port: pnum family: AF_INET]; [ostream _setSocketAddress: host port: pnum family: AF_INET]; } } return self; } - (NSInteger) read: (uint8_t *)buffer maxLength: (NSUInteger)len { return [istream _read: buffer maxLength: len]; } - (void) stream: (NSStream*)stream handleEvent: (NSStreamEvent)event { NSString *error = nil; NSDictionary *conf; NSString *user; NSString *pass; if (event == NSStreamEventErrorOccurred || [stream streamStatus] == NSStreamStatusError || [stream streamStatus] == NSStreamStatusClosed) { [self bye]; return; } conf = [stream propertyForKey: NSStreamSOCKSProxyConfigurationKey]; user = [conf objectForKey: NSStreamSOCKSProxyUserKey]; pass = [conf objectForKey: NSStreamSOCKSProxyPasswordKey]; if ([[conf objectForKey: NSStreamSOCKSProxyVersionKey] isEqual: NSStreamSOCKSProxyVersion4] == YES) { } else { again: if (state == GSSOCKSOfferAuth) { int result; int want; unsigned char buf[4]; /* * Authorisation record is at least three bytes - * socks version (5) * authorisation method bytes to follow (1) * say we do no authorisation (0) * say we do user/pass authorisation (2) */ buf[0] = 5; if (user && pass) { buf[1] = 2; buf[2] = 2; buf[3] = 0; want = 4; } else { buf[1] = 1; buf[2] = 0; want = 3; } result = [ostream _write: buf + woffset maxLength: 4 - woffset]; if (result > 0) { woffset += result; if (woffset == want) { woffset = 0; state = GSSOCKSRecvAuth; goto again; } } } else if (state == GSSOCKSRecvAuth) { int result; result = [istream _read: rbuffer + roffset maxLength: 2 - roffset]; if (result == 0) { error = @"SOCKS end-of-file during negotiation"; } else if (result > 0) { roffset += result; if (roffset == 2) { roffset = 0; if (rbuffer[0] != 5) { error = @"SOCKS authorisation response had wrong version"; } else if (rbuffer[1] == 0) { state = GSSOCKSSendConn; goto again; } else if (rbuffer[1] == 2) { state = GSSOCKSSendAuth; goto again; } else { error = @"SOCKS authorisation response had wrong method"; } } } } else if (state == GSSOCKSSendAuth) { NSData *u = [user dataUsingEncoding: NSUTF8StringEncoding]; unsigned ul = [u length]; NSData *p = [pass dataUsingEncoding: NSUTF8StringEncoding]; unsigned pl = [p length]; if (ul < 1 || ul > 255) { error = @"NSStreamSOCKSProxyUserKey value too long"; } else if (pl < 1 || pl > 255) { error = @"NSStreamSOCKSProxyPasswordKey value too long"; } else { int want = ul + pl + 3; unsigned char buf[want]; int result; buf[0] = 5; buf[1] = ul; memcpy(buf + 2, [u bytes], ul); buf[ul + 2] = pl; memcpy(buf + ul + 3, [p bytes], pl); result = [ostream _write: buf + woffset maxLength: want - woffset]; if (result == 0) { error = @"SOCKS end-of-file during negotiation"; } else if (result > 0) { woffset += result; if (woffset == want) { state = GSSOCKSAckAuth; goto again; } } } } else if (state == GSSOCKSAckAuth) { int result; result = [istream _read: rbuffer + roffset maxLength: 2 - roffset]; if (result == 0) { error = @"SOCKS end-of-file during negotiation"; } else if (result > 0) { roffset += result; if (roffset == 2) { roffset = 0; if (rbuffer[0] != 5) { error = @"SOCKS authorisation response had wrong version"; } else if (rbuffer[1] == 0) { state = GSSOCKSSendConn; goto again; } else if (rbuffer[1] == 2) { error = @"SOCKS authorisation failed"; } } } } else if (state == GSSOCKSSendConn) { unsigned char buf[10]; int want = 10; int result; const char *ptr; /* * Connect command is ten bytes - * socks version * connect command * reserved byte * address type * address 4 bytes (big endian) * port 2 bytes (big endian) */ buf[0] = 5; // Socks version number buf[1] = 1; // Connect command buf[2] = 0; // Reserved buf[3] = 1; // Address type (IPV4) ptr = [address UTF8String]; buf[4] = atoi(ptr); while (isdigit(*ptr)) ptr++; ptr++; buf[5] = atoi(ptr); while (isdigit(*ptr)) ptr++; ptr++; buf[6] = atoi(ptr); while (isdigit(*ptr)) ptr++; ptr++; buf[7] = atoi(ptr); result = [port intValue]; buf[8] = ((result & 0xff00) >> 8); buf[9] = (result & 0xff); result = [ostream _write: buf + woffset maxLength: want - woffset]; if (result == 0) { error = @"SOCKS end-of-file during negotiation"; } else if (result > 0) { woffset += result; if (woffset == want) { rwant = 5; state = GSSOCKSAckConn; goto again; } } } else if (state == GSSOCKSAckConn) { int result; result = [istream _read: rbuffer + roffset maxLength: rwant - roffset]; if (result == 0) { error = @"SOCKS end-of-file during negotiation"; } else if (result > 0) { roffset += result; if (roffset == rwant) { if (rbuffer[0] != 5) { error = @"connect response from SOCKS had wrong version"; } else if (rbuffer[1] != 0) { switch (rbuffer[1]) { case 1: error = @"SOCKS server general failure"; break; case 2: error = @"SOCKS server says permission denied"; break; case 3: error = @"SOCKS server says network unreachable"; break; case 4: error = @"SOCKS server says host unreachable"; break; case 5: error = @"SOCKS server says connection refused"; break; case 6: error = @"SOCKS server says connection timed out"; break; case 7: error = @"SOCKS server says command not supported"; break; case 8: error = @"SOCKS server says address not supported"; break; default: error = @"connect response from SOCKS was failure"; break; } } else if (rbuffer[3] == 1) { rwant = 10; // Fixed size (IPV4) address } else if (rbuffer[3] == 3) { rwant = 7 + rbuffer[4]; // Domain name leading length } else if (rbuffer[3] == 4) { rwant = 22; // Fixed size (IPV6) address } else { error = @"SOCKS server returned unknown address type"; } if (error == nil) { if (roffset < rwant) { goto again; // Need address/port bytes } else { NSString *a; if (rbuffer[3] == 1) { a = [NSString stringWithFormat: @"%d.%d.%d.%d", rbuffer[4], rbuffer[5], rbuffer[6], rbuffer[7]]; } else if (rbuffer[3] == 3) { rbuffer[rwant] = '\0'; a = [NSString stringWithUTF8String: (const char*)rbuffer]; } else { unsigned char buf[40]; int i = 4; int j = 0; while (i < rwant) { int val; val = rbuffer[i++]; val = val * 256 + rbuffer[i++]; if (i > 4) { buf[j++] = ':'; } snprintf((char*)&buf[j], 5, "%04x", val); j += 4; } a = [NSString stringWithUTF8String: (const char*)buf]; } [istream setProperty: a forKey: GSStreamRemoteAddressKey]; [ostream setProperty: a forKey: GSStreamRemoteAddressKey]; a = [NSString stringWithFormat: @"%d", rbuffer[rwant-1] * 256 * rbuffer[rwant-2]]; [istream setProperty: a forKey: GSStreamRemotePortKey]; [ostream setProperty: a forKey: GSStreamRemotePortKey]; /* Return immediately after calling -bye as it * will cause this instance to be deallocated. */ [self bye]; return; } } } } } } if ([error length] > 0) { NSError *theError; theError = [NSError errorWithDomain: NSCocoaErrorDomain code: 0 userInfo: [NSDictionary dictionaryWithObject: error forKey: NSLocalizedDescriptionKey]]; if ([istream streamStatus] != NSStreamStatusError) { [istream _recordError: theError]; } if ([ostream streamStatus] != NSStreamStatusError) { [ostream _recordError: theError]; } [self bye]; } } - (NSInteger) write: (const uint8_t *)buffer maxLength: (NSUInteger)len { return [ostream _write: buffer maxLength: len]; } @end static inline BOOL socketError(int result) { #if defined(_WIN32) return (result == SOCKET_ERROR) ? YES : NO; #else return (result < 0) ? YES : NO; #endif } static inline BOOL socketWouldBlock() { return GSWOULDBLOCK ? YES : NO; } static void setNonBlocking(SOCKET fd) { #if defined(_WIN32) unsigned long dummy = 1; if (ioctlsocket(fd, FIONBIO, &dummy) == SOCKET_ERROR) { NSLog(@"unable to set non-blocking mode - %@", [NSError _last]); } #else int flags = fcntl(fd, F_GETFL, 0); if (fcntl(fd, F_SETFL, flags | O_NONBLOCK) < 0) { NSLog(@"unable to set non-blocking mode - %@", [NSError _last]); } #endif } @implementation GSSocketStream - (void) dealloc { if (_sock != INVALID_SOCKET) { [self close]; } [_sibling _setSibling: nil]; _sibling = nil; [_handler remove: self]; DESTROY(_handler); [super dealloc]; } - (NSString*) description { return [NSString stringWithFormat: @"%@ sock %lld loopID %p", [super description], (long long)_sock, _loopID]; } - (id) init { if ((self = [super init]) != nil) { // so that unopened access will fail _sibling = nil; _closing = NO; _passive = NO; #if defined(_WIN32) _loopID = WSA_INVALID_EVENT; #else _loopID = (void*)(intptr_t)-1; #endif _sock = INVALID_SOCKET; _handler = nil; _address.s.sa_family = AF_UNSPEC; } return self; } - (struct sockaddr*) _address { return &_address.s; } - (id) propertyForKey: (NSString *)key { id result = [super propertyForKey: key]; if (result == nil && _address.s.sa_family != AF_UNSPEC) { SOCKET s = [self _sock]; sockaddr_any sin; socklen_t size = sizeof(sin); memset(&sin, '\0', size); if ([key isEqualToString: GSStreamLocalAddressKey]) { if (getsockname(s, (struct sockaddr*)&sin, (OPTLEN*)&size) != -1) { result = GSPrivateSockaddrHost((struct sockaddr*)&sin); } } else if ([key isEqualToString: GSStreamLocalPortKey]) { if (getsockname(s, (struct sockaddr*)&sin, (OPTLEN*)&size) != -1) { result = [NSString stringWithFormat: @"%d", (int)GSPrivateSockaddrPort((struct sockaddr*)&sin)]; } } else if ([key isEqualToString: GSStreamRemoteAddressKey]) { if (getpeername(s, (struct sockaddr*)&sin, (OPTLEN*)&size) != -1) { result = GSPrivateSockaddrHost((struct sockaddr*)&sin); } } else if ([key isEqualToString: GSStreamRemotePortKey]) { if (getpeername(s, (struct sockaddr*)&sin, (OPTLEN*)&size) != -1) { result = [NSString stringWithFormat: @"%d", (int)GSPrivateSockaddrPort((struct sockaddr*)&sin)]; } } } return result; } - (NSInteger) _read: (uint8_t *)buffer maxLength: (NSUInteger)len { [self subclassResponsibility: _cmd]; return -1; } - (void) _sendEvent: (NSStreamEvent)event { /* If the receiver has a TLS handshake in progress, * we must send events to the TLS handler rather than * the stream delegate. */ if (_handler != nil && [_handler handshake] == YES) { /* Must retain self here to avoid premature deallocation of input * and/or output stream in case of an error during TLS handshake. */ RETAIN(self); [super _sendEvent: event delegate: _handler]; RELEASE(self); } else { [super _sendEvent: event]; } } - (BOOL) _setSocketAddress: (NSString*)address port: (NSInteger)port family: (NSInteger)family { uint16_t p = (uint16_t)port; switch (family) { case AF_INET: { int ptonReturn; const char *addr_c; struct sockaddr_in peer; addr_c = [address cStringUsingEncoding: NSUTF8StringEncoding]; memset(&peer, '\0', sizeof(peer)); peer.sin_family = AF_INET; peer.sin_port = GSSwapHostI16ToBig(p); ptonReturn = inet_pton(AF_INET, addr_c, &peer.sin_addr); if (ptonReturn <= 0) // error { return NO; } else { [self _setAddress: (struct sockaddr*)&peer]; return YES; } } #if defined(AF_INET6) case AF_INET6: { int ptonReturn; const char *addr_c; struct sockaddr_in6 peer; addr_c = [address cStringUsingEncoding: NSUTF8StringEncoding]; memset(&peer, '\0', sizeof(peer)); peer.sin6_family = AF_INET6; peer.sin6_port = GSSwapHostI16ToBig(p); ptonReturn = inet_pton(AF_INET6, addr_c, &peer.sin6_addr); if (ptonReturn <= 0) // error { return NO; } else { [self _setAddress: (struct sockaddr*)&peer]; return YES; } } #endif #ifndef _WIN32 case AF_LOCAL: { struct sockaddr_un peer; const char *c_addr; c_addr = [address fileSystemRepresentation]; memset(&peer, '\0', sizeof(peer)); peer.sun_family = AF_LOCAL; if (strlen(c_addr) > sizeof(peer.sun_path)-1) // too long { return NO; } else { strncpy(peer.sun_path, c_addr, sizeof(peer.sun_path)-1); [self _setAddress: (struct sockaddr*)&peer]; return YES; } } #endif default: return NO; } } - (void) _setAddress: (struct sockaddr*)address { memcpy(&_address.s, address, GSPrivateSockaddrLength(address)); } - (void) _setLoopID: (void *)ref { #if !defined(_WIN32) _sock = (SOCKET)(intptr_t)ref; // On gnu/linux _sock is _loopID #endif _loopID = ref; } - (void) _setClosing: (BOOL)closing { _closing = closing; } - (void) _setPassive: (BOOL)passive { _passive = passive; } - (void) _setSibling: (GSSocketStream*)sibling { _sibling = sibling; } - (void) _setSock: (SOCKET)sock { setNonBlocking(sock); _sock = sock; /* As well as recording the socket, we set up the stream for monitoring it. * On unix style systems we set the socket descriptor as the _loopID to be * monitored, and on mswindows systems we create an event object to be * monitored (the socket events are assoociated with this object later). */ #if defined(_WIN32) _loopID = CreateEvent(NULL, NO, NO, NULL); #else _loopID = (void*)(intptr_t)sock; // On gnu/linux _sock is _loopID #endif } - (void) _setHandler: (id)h { ASSIGN(_handler, h); } - (SOCKET) _sock { return _sock; } - (NSInteger) _write: (const uint8_t *)buffer maxLength: (NSUInteger)len { [self subclassResponsibility: _cmd]; return -1; } @end @implementation GSSocketInputStream + (void) initialize { GSMakeWeakPointer(self, "_sibling"); if (self == [GSSocketInputStream class]) { GSObjCAddClassBehavior(self, [GSSocketStream class]); } } - (void) open { // could be opened because of sibling if ([self _isOpened]) return; if (_sibling && [_sibling streamStatus] == NSStreamStatusError) { [self _setStatus: NSStreamStatusError]; return; } if (_passive || (_sibling && [_sibling _isOpened])) goto open_ok; // check sibling status, avoid double connect if (_sibling && [_sibling streamStatus] == NSStreamStatusOpening) { [self _setStatus: NSStreamStatusOpening]; return; } else { int result; if ([self _sock] == INVALID_SOCKET) { SOCKET s; if (_handler == nil) { [GSSOCKS tryInput: self output: _sibling]; } s = socket(_address.s.sa_family, SOCK_STREAM, 0); if (BADSOCKET(s)) { [self _recordError]; return; } else { [self _setSock: s]; [_sibling _setSock: s]; } } if (nil == _handler) { [GSTLSHandler tryInput: self output: _sibling]; } result = connect([self _sock], &_address.s, GSPrivateSockaddrLength(&_address.s)); if (socketError(result)) { if (socketWouldBlock()) { /* Need to set the status first, so that the run loop can tell * it needs to add the stream as waiting on writable, as an * indication of opened */ [self _setStatus: NSStreamStatusOpening]; } else { /* Had an immediate connect error. */ [self _recordError]; [_sibling _recordError]; } #if defined(_WIN32) WSAEventSelect(_sock, _loopID, FD_ALL_EVENTS); #endif if (NSCountMapTable(_loops) > 0) { [self _schedule]; return; } else if (NSStreamStatusOpening == _currentStatus) { NSRunLoop *r; NSDate *d; /* The stream was not scheduled in any run loop, so we * implement a blocking connect by running in the default * run loop mode. */ r = [NSRunLoop currentRunLoop]; d = [NSDate distantFuture]; [r addStream: self mode: NSDefaultRunLoopMode]; while ([r runMode: NSDefaultRunLoopMode beforeDate: d] == YES) { if (_currentStatus != NSStreamStatusOpening) { break; } } [r removeStream: self mode: NSDefaultRunLoopMode]; return; } } } open_ok: #if defined(_WIN32) WSAEventSelect(_sock, _loopID, FD_ALL_EVENTS); #endif [super open]; } - (void) close { /* If the socket descriptor is still present, we need to close it to * avoid a leak no matter what the nominal state of the stream is. * The descriptor is created before the stream is formally opened. */ if (INVALID_SOCKET == _sock) { if (_currentStatus == NSStreamStatusNotOpen) { NSDebugMLLog(@"NSStream", @"Attempt to close unopened stream %@", self); return; } if (_currentStatus == NSStreamStatusClosed) { NSDebugMLLog(@"NSStream", @"Attempt to close already closed stream %@", self); return; } } [_handler bye]; #if defined(_WIN32) [super close]; if (_sibling && [_sibling streamStatus] != NSStreamStatusClosed) { /* * Windows only permits a single event to be associated with a socket * at any time, but the runloop system only allows an event handle to * be added to the loop once, and we have two streams for each socket. * So we use two events, one for each stream, and when one stream is * closed, we must call WSAEventSelect to ensure that the event handle * of the sibling is used to signal events from now on. */ shutdown(_sock, SHUT_RD); [_sibling _unschedule]; if (WSAEventSelect(_sock, [_sibling _loopID], FD_ALL_EVENTS) == SOCKET_ERROR) { NSDebugMLLog(@"NSStream", @"%@ Error %d transferring to %@", self, WSAGetLastError(), _sibling); } [_sibling _schedule]; } else { closesocket(_sock); } WSACloseEvent(_loopID); _loopID = WSA_INVALID_EVENT; #else [super close]; // read shutdown is ignored, because the other side may shutdown first. if (!_sibling || [_sibling streamStatus] == NSStreamStatusClosed) close((intptr_t)_loopID); else shutdown((intptr_t)_loopID, SHUT_RD); _loopID = (void*)(intptr_t)-1; #endif _sock = INVALID_SOCKET; } - (NSInteger) read: (uint8_t *)buffer maxLength: (NSUInteger)len { if (buffer == 0) { [NSException raise: NSInvalidArgumentException format: @"null pointer for buffer"]; } if (len == 0) { [NSException raise: NSInvalidArgumentException format: @"zero byte read requested"]; } if (_handler == nil) return [self _read: buffer maxLength: len]; else return [_handler read: buffer maxLength: len]; } - (NSInteger) _read: (uint8_t *)buffer maxLength: (NSUInteger)len { int readLen; _events &= ~NSStreamEventHasBytesAvailable; if ([self streamStatus] == NSStreamStatusClosed) { return 0; } if ([self streamStatus] == NSStreamStatusAtEnd) { readLen = 0; } else { #if defined(_WIN32) readLen = recv([self _sock], (char*) buffer, (socklen_t) len, 0); #else readLen = read([self _sock], buffer, len); #endif } if (socketError(readLen)) { if (_closing == YES) { /* If a read fails on a closing socket, * we have reached the end of all data sent by * the remote end before it shut down. */ [self _setClosing: NO]; [self _setStatus: NSStreamStatusAtEnd]; [self _sendEvent: NSStreamEventEndEncountered]; readLen = 0; } else { if (socketWouldBlock()) { /* We need an event from the operating system * to tell us we can start reading again. */ [self _setStatus: NSStreamStatusReading]; } else { [self _recordError]; } readLen = -1; } } else if (readLen == 0) { [self _setStatus: NSStreamStatusAtEnd]; [self _sendEvent: NSStreamEventEndEncountered]; } else { [self _setStatus: NSStreamStatusOpen]; } return readLen; } - (BOOL) getBuffer: (uint8_t **)buffer length: (NSUInteger *)len { return NO; } - (void) _dispatch { #if defined(_WIN32) AUTORELEASE(RETAIN(self)); /* * Windows only permits a single event to be associated with a socket * at any time, but the runloop system only allows an event handle to * be added to the loop once, and we have two streams for each socket. * So we use two events, one for each stream, and the _dispatch method * must handle things for both streams. */ if ([self streamStatus] == NSStreamStatusClosed) { /* * It is possible the stream is closed yet recieving event because * of not closed sibling */ NSAssert([_sibling streamStatus] != NSStreamStatusClosed, @"Received event for closed stream"); [_sibling _dispatch]; } else if ([self streamStatus] == NSStreamStatusError) { [self _sendEvent: NSStreamEventErrorOccurred]; } else { WSANETWORKEVENTS events; int error = 0; int getReturn = -1; if (WSAEnumNetworkEvents(_sock, _loopID, &events) == SOCKET_ERROR) { error = WSAGetLastError(); NSDebugMLLog(@"NSStream", @"%@ Error %d", self, error); } #ifndef NDEBUG else { NSDebugMLLog(@"NSStream", @"%@ EVENTS 0x%lx", self, events.lNetworkEvents); } #endif if ([self streamStatus] == NSStreamStatusOpening) { [self _unschedule]; if (error == 0) { socklen_t len = sizeof(error); getReturn = getsockopt(_sock, SOL_SOCKET, SO_ERROR, (char*)&error, (OPTLEN*)&len); } if (getReturn >= 0 && error == 0 && (events.lNetworkEvents & FD_CONNECT)) { // finish up the opening _passive = YES; [self open]; // notify sibling if (_sibling) { [_sibling open]; [_sibling _sendEvent: NSStreamEventOpenCompleted]; } [self _sendEvent: NSStreamEventOpenCompleted]; } } if (error != 0) { errno = error; [self _recordError]; [self _sendEvent: NSStreamEventErrorOccurred]; if ([_sibling streamStatus] == NSStreamStatusOpening) { [_sibling _recordError]; [_sibling _sendEvent: NSStreamEventErrorOccurred]; } } else { if (events.lNetworkEvents & FD_WRITE) { NSAssert([_sibling _isOpened], NSInternalInconsistencyException); /* Clear NSStreamStatusWriting if it was set */ [_sibling _setStatus: NSStreamStatusOpen]; } /* On winsock a socket is always writable unless it has had * failure/closure or a write blocked and we have not been * signalled again. */ while ([_sibling _unhandledData] == NO && [_sibling hasSpaceAvailable]) { [_sibling _sendEvent: NSStreamEventHasSpaceAvailable]; } if (events.lNetworkEvents & FD_READ) { [self _setStatus: NSStreamStatusOpen]; while ([self hasBytesAvailable] && [self _unhandledData] == NO) { [self _sendEvent: NSStreamEventHasBytesAvailable]; } } if (events.lNetworkEvents & FD_CLOSE) { [self _setClosing: YES]; [_sibling _setClosing: YES]; while ([self hasBytesAvailable] && [self _unhandledData] == NO) { [self _sendEvent: NSStreamEventHasBytesAvailable]; } } if (events.lNetworkEvents == 0) { [self _sendEvent: NSStreamEventHasBytesAvailable]; } } } #else NSStreamEvent myEvent; if ([self streamStatus] == NSStreamStatusOpening) { int error; int result; socklen_t len = sizeof(error); IF_NO_ARC([[self retain] autorelease];) [self _unschedule]; result = getsockopt([self _sock], SOL_SOCKET, SO_ERROR, &error, (OPTLEN*)&len); if (result >= 0 && !error) { // finish up the opening myEvent = NSStreamEventOpenCompleted; _passive = YES; [self open]; // notify sibling [_sibling open]; [_sibling _sendEvent: myEvent]; } else // must be an error { if (error) errno = error; [self _recordError]; myEvent = NSStreamEventErrorOccurred; [_sibling _recordError]; [_sibling _sendEvent: myEvent]; } } else if ([self streamStatus] == NSStreamStatusAtEnd) { myEvent = NSStreamEventEndEncountered; } else if ([self streamStatus] == NSStreamStatusError) { myEvent = NSStreamEventErrorOccurred; } else { [self _setStatus: NSStreamStatusOpen]; myEvent = NSStreamEventHasBytesAvailable; } [self _sendEvent: myEvent]; #endif } - (BOOL) runLoopShouldBlock: (BOOL*)trigger { /* If there is a handler in place which has data buffered for reading * the run loop should trigger immediately so we read it. */ if ([_handler readable]) { *trigger = YES; return NO; } #if defined(_WIN32) *trigger = YES; return YES; #else return [super runLoopShouldBlock: trigger]; #endif } @end @implementation GSSocketOutputStream + (void) initialize { GSMakeWeakPointer(self, "_sibling"); if (self == [GSSocketOutputStream class]) { GSObjCAddClassBehavior(self, [GSSocketStream class]); } } - (NSInteger) _write: (const uint8_t *)buffer maxLength: (NSUInteger)len { int writeLen; _events &= ~NSStreamEventHasSpaceAvailable; if ([self streamStatus] == NSStreamStatusClosed) { return 0; } if ([self streamStatus] == NSStreamStatusAtEnd) { [self _sendEvent: NSStreamEventEndEncountered]; return 0; } #if defined(_WIN32) writeLen = send([self _sock], (char*) buffer, (socklen_t) len, 0); #else writeLen = write([self _sock], buffer, (socklen_t) len); #endif if (socketError(writeLen)) { if (_closing == YES) { /* If a write fails on a closing socket, * we know the other end is no longer reading. */ [self _setClosing: NO]; [self _setStatus: NSStreamStatusAtEnd]; [self _sendEvent: NSStreamEventEndEncountered]; writeLen = 0; } else { if (socketWouldBlock()) { /* We need an event from the operating system * to tell us we can start writing again. */ [self _setStatus: NSStreamStatusWriting]; } else { [self _recordError]; } writeLen = -1; } } else { [self _setStatus: NSStreamStatusOpen]; } return writeLen; } - (void) open { // could be opened because of sibling if ([self _isOpened]) return; if (_sibling && [_sibling streamStatus] == NSStreamStatusError) { [self _setStatus: NSStreamStatusError]; return; } if (_passive || (_sibling && [_sibling _isOpened])) goto open_ok; // check sibling status, avoid double connect if (_sibling && [_sibling streamStatus] == NSStreamStatusOpening) { [self _setStatus: NSStreamStatusOpening]; return; } else { int result; if ([self _sock] == INVALID_SOCKET) { SOCKET s; if (_handler == nil) { [GSSOCKS tryInput: _sibling output: self]; } s = socket(_address.s.sa_family, SOCK_STREAM, 0); if (BADSOCKET(s)) { [self _recordError]; return; } else { [self _setSock: s]; [_sibling _setSock: s]; } } if (nil == _handler) { [GSTLSHandler tryInput: _sibling output: self]; } result = connect([self _sock], &_address.s, GSPrivateSockaddrLength(&_address.s)); if (socketError(result)) { if (socketWouldBlock()) { /* * Need to set the status first, so that the run loop can tell * it needs to add the stream as waiting on writable, as an * indication of opened */ [self _setStatus: NSStreamStatusOpening]; } else { /* Had an immediate connect error. */ [self _recordError]; [_sibling _recordError]; } #if defined(_WIN32) WSAEventSelect(_sock, _loopID, FD_ALL_EVENTS); #endif if (NSCountMapTable(_loops) > 0) { [self _schedule]; return; } else if (NSStreamStatusOpening == _currentStatus) { NSRunLoop *r; NSDate *d; /* The stream was not scheduled in any run loop, so we * implement a blocking connect by running in the default * run loop mode. */ r = [NSRunLoop currentRunLoop]; d = [NSDate distantFuture]; [r addStream: self mode: NSDefaultRunLoopMode]; while ([r runMode: NSDefaultRunLoopMode beforeDate: d] == YES) { if (_currentStatus != NSStreamStatusOpening) { break; } } [r removeStream: self mode: NSDefaultRunLoopMode]; return; } } } open_ok: #if defined(_WIN32) WSAEventSelect(_sock, _loopID, FD_ALL_EVENTS); #endif [super open]; } - (void) close { /* If the socket descriptor is still present, we need to close it to * avoid a leak no matter what the nominal state of the stream is. * The descriptor is created before the stream is formally opened. */ if (INVALID_SOCKET == _sock) { if (_currentStatus == NSStreamStatusNotOpen) { NSDebugMLLog(@"NSStream", @"Attempt to close unopened stream %@", self); return; } if (_currentStatus == NSStreamStatusClosed) { NSDebugMLLog(@"NSStream", @"Attempt to close already closed stream %@", self); return; } } [_handler bye]; #if defined(_WIN32) if (_sibling && [_sibling streamStatus] != NSStreamStatusClosed) { /* * Windows only permits a single event to be associated with a socket * at any time, but the runloop system only allows an event handle to * be added to the loop once, and we have two streams for each socket. * So we use two events, one for each stream, and when one stream is * closed, we must call WSAEventSelect to ensure that the event handle * of the sibling is used to signal events from now on. */ shutdown(_sock, SHUT_WR); _sock = INVALID_SOCKET; [_sibling _unschedule]; if (WSAEventSelect([_sibling _sock], [_sibling _loopID], FD_ALL_EVENTS) == SOCKET_ERROR) { NSDebugMLLog(@"NSStream", @"%@ Error %d transferring to %@", self, WSAGetLastError(), _sibling); } [_sibling _schedule]; } else { closesocket(_sock); } WSACloseEvent(_loopID); [super close]; _loopID = WSA_INVALID_EVENT; #else // read shutdown is ignored, because the other side may shutdown first. if (!_sibling || [_sibling streamStatus] == NSStreamStatusClosed) close((intptr_t)_loopID); else shutdown((intptr_t)_loopID, SHUT_WR); [super close]; _loopID = (void*)(intptr_t)-1; #endif _sock = INVALID_SOCKET; } - (NSInteger) write: (const uint8_t *)buffer maxLength: (NSUInteger)len { if (len == 0) { /* * The method allows the 'len' equal to 0. In this case the 'buffer' * is ignored. This can be useful if there is a necessity to postpone * actual writing (for no data are ready for example) without leaving * the stream in the state of unhandled NSStreamEventHasSpaceAvailable * (to keep receiving of that event from a runloop). * The delegate's -[stream:handleEvent:] would keep calling of * -[write: NULL maxLength: 0] until the delegate's state allows it * to write actual bytes. * The downside of that is that it produces a busy wait ... with the * run loop immediately notifying the stream that it has space to * write, so care should be taken to ensure that the delegate has a * near constant supply of data to write, or has some mechanism to * detect that no more data is arriving, and shut down. */ _events &= ~NSStreamEventHasSpaceAvailable; return 0; } if (buffer == 0) { [NSException raise: NSInvalidArgumentException format: @"null pointer for buffer"]; } if (_handler == nil) return [self _write: buffer maxLength: len]; else return [_handler write: buffer maxLength: len]; } - (void) _dispatch { #if defined(_WIN32) AUTORELEASE(RETAIN(self)); /* * Windows only permits a single event to be associated with a socket * at any time, but the runloop system only allows an event handle to * be added to the loop once, and we have two streams for each socket. * So we use two events, one for each stream, and the _dispatch method * must handle things for both streams. */ if ([self streamStatus] == NSStreamStatusClosed) { /* * It is possible the stream is closed yet recieving event because * of not closed sibling */ NSAssert([_sibling streamStatus] != NSStreamStatusClosed, @"Received event for closed stream"); [_sibling _dispatch]; } else if ([self streamStatus] == NSStreamStatusError) { [self _sendEvent: NSStreamEventErrorOccurred]; } else { WSANETWORKEVENTS events; int error = 0; int getReturn = -1; if (WSAEnumNetworkEvents(_sock, _loopID, &events) == SOCKET_ERROR) { error = WSAGetLastError(); NSDebugMLLog(@"NSStream", @"%@ Error %d", self, error); } #ifndef NDEBUG else { NSDebugMLLog(@"NSStream", @"%@ EVENTS 0x%lx", self, events.lNetworkEvents); } #endif if ([self streamStatus] == NSStreamStatusOpening) { [self _unschedule]; if (error == 0) { socklen_t len = sizeof(error); getReturn = getsockopt(_sock, SOL_SOCKET, SO_ERROR, (char*)&error, (OPTLEN*)&len); } if (getReturn >= 0 && error == 0 && (events.lNetworkEvents & FD_CONNECT)) { // finish up the opening events.lNetworkEvents ^= FD_CONNECT; _passive = YES; [self open]; // notify sibling if (_sibling) { [_sibling open]; [_sibling _sendEvent: NSStreamEventOpenCompleted]; } [self _sendEvent: NSStreamEventOpenCompleted]; } } if (error != 0) { errno = error; [self _recordError]; [self _sendEvent: NSStreamEventErrorOccurred]; if ([_sibling streamStatus] == NSStreamStatusOpening) { [_sibling _recordError]; [_sibling _sendEvent: NSStreamEventErrorOccurred]; } } else { if (events.lNetworkEvents & FD_WRITE) { /* Clear NSStreamStatusWriting if it was set */ [self _setStatus: NSStreamStatusOpen]; } /* On winsock a socket is always writable unless it has had * failure/closure or a write blocked and we have not been * signalled again. */ while ([self _unhandledData] == NO && [self hasSpaceAvailable]) { [self _sendEvent: NSStreamEventHasSpaceAvailable]; } if (events.lNetworkEvents & FD_READ) { [_sibling _setStatus: NSStreamStatusOpen]; while ([_sibling hasBytesAvailable] && [_sibling _unhandledData] == NO) { [_sibling _sendEvent: NSStreamEventHasBytesAvailable]; } } if (events.lNetworkEvents & FD_CLOSE) { [self _setClosing: YES]; [_sibling _setClosing: YES]; while ([_sibling hasBytesAvailable] && [_sibling _unhandledData] == NO) { [_sibling _sendEvent: NSStreamEventHasBytesAvailable]; } } if (events.lNetworkEvents == 0) { [self _sendEvent: NSStreamEventHasSpaceAvailable]; } } } #else NSStreamEvent myEvent; if ([self streamStatus] == NSStreamStatusOpening) { int error; socklen_t len = sizeof(error); int result; IF_NO_ARC([[self retain] autorelease];) [self _schedule]; result = getsockopt((intptr_t)_loopID, SOL_SOCKET, SO_ERROR, &error, (OPTLEN*)&len); if (result >= 0 && !error) { // finish up the opening myEvent = NSStreamEventOpenCompleted; _passive = YES; [self open]; // notify sibling [_sibling open]; [_sibling _sendEvent: myEvent]; } else // must be an error { if (error) errno = error; [self _recordError]; myEvent = NSStreamEventErrorOccurred; [_sibling _recordError]; [_sibling _sendEvent: myEvent]; } } else if ([self streamStatus] == NSStreamStatusAtEnd) { myEvent = NSStreamEventEndEncountered; } else if ([self streamStatus] == NSStreamStatusError) { myEvent = NSStreamEventErrorOccurred; } else { [self _setStatus: NSStreamStatusOpen]; myEvent = NSStreamEventHasSpaceAvailable; } [self _sendEvent: myEvent]; #endif } #if defined(_WIN32) - (BOOL) runLoopShouldBlock: (BOOL*)trigger { *trigger = YES; if ([self _unhandledData] == YES && [self streamStatus] == NSStreamStatusOpen) { /* In winsock, a writable status is only signalled if an earlier * write failed (because it would block), so we must simulate the * writable event by having the run loop trigger without blocking. */ return NO; } return YES; } #endif @end @implementation GSSocketServerStream + (void) initialize { GSMakeWeakPointer(self, "_sibling"); if (self == [GSSocketServerStream class]) { GSObjCAddClassBehavior(self, [GSSocketStream class]); } } - (Class) _inputStreamClass { [self subclassResponsibility: _cmd]; return Nil; } - (Class) _outputStreamClass { [self subclassResponsibility: _cmd]; return Nil; } - (void) open { int bindReturn; int listenReturn; SOCKET s; if (_currentStatus != NSStreamStatusNotOpen) { NSDebugMLLog(@"NSStream", @"Attempt to re-open stream %@", self); return; } s = socket(_address.s.sa_family, SOCK_STREAM, 0); if (BADSOCKET(s)) { [self _recordError]; [self _sendEvent: NSStreamEventErrorOccurred]; return; } else { [(GSSocketStream*)self _setSock: s]; } #ifndef BROKEN_SO_REUSEADDR if (_address.s.sa_family == AF_INET #ifdef AF_INET6 || _address.s.sa_family == AF_INET6 #endif ) { /* * Under decent systems, SO_REUSEADDR means that the port can be reused * immediately that this process exits. Under some it means * that multiple processes can serve the same port simultaneously. * We don't want that broken behavior! */ int status = 1; if (setsockopt([self _sock], SOL_SOCKET, SO_REUSEADDR, (char *)&status, (OPTLEN)sizeof(status)) < 0) { NSDebugMLLog(@"GSTcpTune", @"setsockopt reuseaddr failed"); } } #endif bindReturn = bind([self _sock], &_address.s, GSPrivateSockaddrLength(&_address.s)); if (socketError(bindReturn)) { [self _recordError]; [self _sendEvent: NSStreamEventErrorOccurred]; return; } listenReturn = listen([self _sock], GSBACKLOG); if (socketError(listenReturn)) { [self _recordError]; [self _sendEvent: NSStreamEventErrorOccurred]; return; } #if defined(_WIN32) if (_loopID != WSA_INVALID_EVENT) { WSAEventSelect(_sock, _loopID, FD_ALL_EVENTS); } #endif [super open]; } - (void) close { #if defined(_WIN32) if (_loopID != WSA_INVALID_EVENT) { WSACloseEvent(_loopID); } if (_sock != INVALID_SOCKET) { closesocket(_sock); [super close]; _loopID = WSA_INVALID_EVENT; } #else if (_loopID != (void*)(intptr_t)-1) { close((intptr_t)_loopID); [super close]; _loopID = (void*)(intptr_t)-1; } #endif _sock = INVALID_SOCKET; } - (void) acceptWithInputStream: (NSInputStream **)inputStream outputStream: (NSOutputStream **)outputStream { NSArray *keys; NSUInteger count; NSMutableDictionary *opts; NSString *str; GSSocketStream *ins = AUTORELEASE([[self _inputStreamClass] new]); GSSocketStream *outs = AUTORELEASE([[self _outputStreamClass] new]); /* Align on a 2 byte boundary for a 16bit port number in the sockaddr */ struct { uint8_t bytes[BUFSIZ]; } __attribute__((aligned(2)))buf; struct sockaddr *addr = (struct sockaddr*)&buf; socklen_t len = sizeof(buf); int acceptReturn; acceptReturn = accept([self _sock], addr, (OPTLEN*)&len); _events &= ~NSStreamEventHasBytesAvailable; if (socketError(acceptReturn)) { // test for real error if (!socketWouldBlock()) { [self _recordError]; } ins = nil; outs = nil; } else { // no need to connect again [ins _setPassive: YES]; [outs _setPassive: YES]; // copy the addr to outs [ins _setAddress: addr]; [outs _setAddress: addr]; [ins _setSock: acceptReturn]; [outs _setSock: acceptReturn]; /* Set property to indicate that the input stream was accepted by * a listening socket (server) rather than produced by an outgoing * connection (client). */ [ins setProperty: @"YES" forKey: @"IsServer"]; /* At this point, we can insert the handler to deal with TLS */ str = [self propertyForKey: NSStreamSocketSecurityLevelKey]; if (nil != str) { opts = [NSMutableDictionary new]; [opts setObject: str forKey: NSStreamSocketSecurityLevelKey]; // copy the properties in the 'opts' [GSTLSHandler populateProperties: &opts withSecurityLevel: str fromInputStream: self orOutputStream: nil]; // and set the input/output streams's properties from the 'opts' keys = [opts allKeys]; count = [keys count]; while(count-- > 0) { NSString *key = [keys objectAtIndex: count]; str = [opts objectForKey: key]; [ins setProperty: str forKey: key]; [outs setProperty: str forKey: key]; } /* Set the streams to be 'open' in order to have the TLS * handshake done. On completion the state will be reset. */ [ins _setStatus: NSStreamStatusOpen]; [outs _setStatus: NSStreamStatusOpen]; [GSTLSHandler tryInput: (GSSocketInputStream *)ins output: (GSSocketOutputStream *)outs]; DESTROY(opts); } } if (inputStream) { [ins _setSibling: outs]; *inputStream = (NSInputStream*)ins; } if (outputStream) { [outs _setSibling: ins]; *outputStream = (NSOutputStream*)outs; } /* Now the streams are redy to be opened. */ } - (void) _dispatch { #if defined(_WIN32) WSANETWORKEVENTS events; if (WSAEnumNetworkEvents(_sock, _loopID, &events) == SOCKET_ERROR) { errno = WSAGetLastError(); [self _recordError]; [self _sendEvent: NSStreamEventErrorOccurred]; } else if (events.lNetworkEvents & FD_ACCEPT) { events.lNetworkEvents ^= FD_ACCEPT; [self _setStatus: NSStreamStatusReading]; [self _sendEvent: NSStreamEventHasBytesAvailable]; } #else NSStreamEvent myEvent; [self _setStatus: NSStreamStatusOpen]; myEvent = NSStreamEventHasBytesAvailable; [self _sendEvent: myEvent]; #endif } @end @implementation GSInetInputStream - (id) initToAddr: (NSString*)addr port: (NSInteger)port { if ((self = [super init]) != nil) { if ([self _setSocketAddress: addr port: port family: AF_INET] == NO) { DESTROY(self); } } return self; } @end @implementation GSInet6InputStream #if defined(AF_INET6) - (id) initToAddr: (NSString*)addr port: (NSInteger)port { if ((self = [super init]) != nil) { if ([self _setSocketAddress: addr port: port family: AF_INET6] == NO) { DESTROY(self); } } return self; } #else - (id) initToAddr: (NSString*)addr port: (NSInteger)port { DESTROY(self); return nil; } #endif @end @implementation GSInetOutputStream - (id) initToAddr: (NSString*)addr port: (NSInteger)port { if ((self = [super init]) != nil) { if ([self _setSocketAddress: addr port: port family: AF_INET] == NO) { DESTROY(self); } } return self; } @end @implementation GSInet6OutputStream #if defined(AF_INET6) - (id) initToAddr: (NSString*)addr port: (NSInteger)port { if ((self = [super init]) != nil) { if ([self _setSocketAddress: addr port: port family: AF_INET6] == NO) { DESTROY(self); } } return self; } #else - (id) initToAddr: (NSString*)addr port: (NSInteger)port { DESTROY(self); return nil; } #endif @end @implementation GSInetServerStream - (Class) _inputStreamClass { return [GSInetInputStream class]; } - (Class) _outputStreamClass { return [GSInetOutputStream class]; } - (id) initToAddr: (NSString*)addr port: (NSInteger)port { if ((self = [super init]) != nil) { if ([addr length] == 0) { addr = @"0.0.0.0"; } if ([self _setSocketAddress: addr port: port family: AF_INET] == NO) { DESTROY(self); } } return self; } @end @implementation GSInet6ServerStream #if defined(AF_INET6) - (Class) _inputStreamClass { return [GSInet6InputStream class]; } - (Class) _outputStreamClass { return [GSInet6OutputStream class]; } - (id) initToAddr: (NSString*)addr port: (NSInteger)port { if ([super init] != nil) { if ([addr length] == 0) { addr = @"0:0:0:0:0:0:0:0"; /* Bind on all addresses */ } if ([self _setSocketAddress: addr port: port family: AF_INET6] == NO) { DESTROY(self); } } return self; } #else - (id) initToAddr: (NSString*)addr port: (NSInteger)port { DESTROY(self); return nil; } #endif @end gnustep-base-1.29.0/Source/GSSocksParser/000077500000000000000000000000001435650067400201435ustar00rootroot00000000000000gnustep-base-1.29.0/Source/GSSocksParser/GSSocks4Parser.h000066400000000000000000000020431435650067400230700ustar00rootroot00000000000000/* * Parsers of SOCKS protocol messages * Copyright (C) 2013 Free Software Foundation, Inc. * * Written by Marat Ibadinov * Date: 2013 * * This file is part of the GNUstep Base Library. * * 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 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 * Library General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110 USA. * * $Date$ $Revision$ */ #import "GSSocksParser.h" @interface GSSocks4Parser : GSSocksParser { } @end gnustep-base-1.29.0/Source/GSSocksParser/GSSocks4Parser.m000066400000000000000000000116321435650067400231010ustar00rootroot00000000000000/* * Parsers of SOCKS protocol messages * Copyright (C) 2013 Free Software Foundation, Inc. * * Written by Marat Ibadinov * Date: 2013 * * This file is part of the GNUstep Base Library. * * 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 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 * Library General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110 USA. * * $Date$ $Revision$ */ #import "GSSocks4Parser.h" #import "GSSocksParserPrivate.h" typedef enum GSSocks4InternalError { GSSocks4InternalErrorIPv6 = 0x4a } GSSocks4InternalError; typedef enum GSSocks4ResponseStatus { GSSocks4ResponseStatusAccessGranted = 0x5a, GSSocks4ResponseStatusRequestRejected = 0x5b, GSSocks4ResponseStatusIdentdFailed = 0x5c, GSSocks4ResponseStatusUserNotConfirmed = 0x5d, } GSSocks4ResponseStatus; #ifdef __clang__ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wcast-align" #endif @implementation GSSocks4Parser - (id) initWithConfiguration: (NSDictionary *)aConfiguration address: (NSString *)anAddress port: (NSUInteger)aPort { if (nil != (self = [super init])) { configuration = [aConfiguration retain]; address = [anAddress retain]; port = aPort; } return self; } - (void) start { NSMutableData *data; uint8_t *bytes; uint8_t zero; NSString *user; GSSocksAddressType addressType; addressType = [self addressType]; if (addressType == GSSocksAddressTypeIPv6) { NSError *error; error = [self errorWithCode: GSSocks4InternalErrorIPv6 description: @"IPv6 addresses are not supported by SOCKS4 proxies"]; [delegate parser: self encounteredError: error]; return; } data = [NSMutableData dataWithLength: 8]; bytes = [data mutableBytes]; bytes[0] = 0x4; bytes[1] = 0x1; *(uint16_t *)(bytes + 2) = NSSwapHostShortToBig((uint16_t)port); if (addressType == GSSocksAddressTypeDomain) { bytes[4] = bytes[5] = bytes[6] = 0; bytes[7] = 1; } else { const uint32_t *addressBytes = [[self addressData] bytes]; *(uint32_t *)(bytes + 4) = NSSwapHostLongToBig(*addressBytes); } zero = 0x0; user = [configuration objectForKey: NSStreamSOCKSProxyUserKey]; if (user) { [data appendData: [user dataUsingEncoding: NSUTF8StringEncoding]]; [data appendBytes: &zero length: 1]; } if (addressType == GSSocksAddressTypeDomain) { [data appendData: [address dataUsingEncoding: NSUTF8StringEncoding]]; [data appendBytes: &zero length: 1]; } [delegate parser: self formedRequest: data]; [delegate parser: self needsMoreBytes: 8]; } - (NSError *) errorWithResponseStatus: (NSInteger)aStatus { NSString *description; switch ((GSSocks4ResponseStatus)aStatus) { case GSSocks4ResponseStatusRequestRejected: description = @"request was rejected or the server failed to fulfil it"; break; case GSSocks4ResponseStatusIdentdFailed: description = @"identd is not running or not reachable from the server"; break; case GSSocks4ResponseStatusUserNotConfirmed: description = @"identd could not confirm the user ID string in the request"; break; default: description = @"unknown"; break; } description = [NSString stringWithFormat: @"SOCKS4 connection failed, reason: %@", description]; return [self errorWithCode: aStatus description: description]; } - (void) parseNextChunk: (NSData *)aChunk { NSUInteger bndPort; uint32_t addressBytes; NSData *addressData; NSString *bndAddress; const uint8_t *bytes; bytes = [aChunk bytes]; if (bytes[1] != GSSocks4ResponseStatusAccessGranted) { NSError *error = [self errorWithResponseStatus:bytes[1]]; [delegate parser:self encounteredError:error]; return; } bndPort = NSSwapBigShortToHost(*(uint16_t *)(bytes + 2)); addressBytes = NSSwapBigLongToHost(*(uint32_t *)(bytes + 4)); addressData = [NSData dataWithBytesNoCopy: &addressBytes length: 4 freeWhenDone: NO]; bndAddress = [self addressFromData: addressData withType :GSSocksAddressTypeIPv4]; [delegate parser: self finishedWithAddress: bndAddress port: bndPort]; } @end #ifdef __clang__ #pragma GCC diagnostic pop #endif gnustep-base-1.29.0/Source/GSSocksParser/GSSocks5Parser.h000066400000000000000000000022051435650067400230710ustar00rootroot00000000000000/* * Parsers of SOCKS protocol messages * Copyright (C) 2013 Free Software Foundation, Inc. * * Written by Marat Ibadinov * Date: 2013 * * This file is part of the GNUstep Base Library. * * 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 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 * Library General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110 USA. * * $Date$ $Revision$ */ #import "GSSocksParser.h" @interface GSSocks5Parser : GSSocksParser { NSUInteger state; NSUInteger addressSize; uint8_t addressType; BOOL stopped; } @end gnustep-base-1.29.0/Source/GSSocksParser/GSSocks5Parser.m000066400000000000000000000225111435650067400231000ustar00rootroot00000000000000/* * Parsers of SOCKS protocol messages * Copyright (C) 2013 Free Software Foundation, Inc. * * Written by Marat Ibadinov * Date: 2013 * * This file is part of the GNUstep Base Library. * * 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 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 * Library General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110 USA. * * $Date$ $Revision$ */ #import "GSSocks5Parser.h" #import "GSSocksParserPrivate.h" typedef enum GSSocks5ParserState { GSSocks5ParserStateHandshake, GSSocks5ParserStateAuthenticationRequest, GSSocks5ParserStateAuthenticationResponse, GSSocks5ParserStateRequest, GSSocks5ParserStateResponse, GSSocks5ParserStateResponseAddressLength, GSSocks5ParserStateResponseAddressAndPort, } GSSocks5ParserState; typedef enum GSSocks5AuthenticationMethod { GSSocks5AuthenticationMethodNone = 0x00, GSSocks5AuthenticationMethodGSSAPI = 0x01, GSSocks5AuthenticationMethodPassword = 0x02, GSSocks5AuthenticationMethodNoAcceptable = 0xFF, } GSSocks5AuthenticationMethod; typedef enum GSSocks5ResponseStatus { GSSocks5ResponseStatusSuccess = 0x0, GSSocks5ResponseStatusGeneralFailure = 0x1, GSSocks5ResponseStatusConnectionNotAllowed = 0x2, GSSocks5ResponseStatusNetworkUnreachable = 0x3, GSSocks5ResponseStatusHostUnreachable = 0x4, GSSocks5ResponseStatusConnectionRefused = 0x5, GSSocks5ResponseStatusTTLExpired = 0x6, GSSocks5ResponseStatusCommandNotSupported = 0x7, GSSocks5ResponseStatusAddressTypeNotSupported = 0x8, } GSSocks5ResponseStatus; #ifdef __clang__ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wcast-align" #endif @implementation GSSocks5Parser - (id) initWithConfiguration: (NSDictionary *)aConfiguration address: (NSString *)anAddress port: (NSUInteger)aPort { if (nil != (self = [super init])) { configuration = [aConfiguration retain]; address = [anAddress retain]; port = aPort; stopped = YES; } return self; } - (void) start { uint8_t bytes[3] = {0x5, 0x1, GSSocks5AuthenticationMethodNone}; state = GSSocks5ParserStateHandshake; stopped = NO; if ([configuration objectForKey: NSStreamSOCKSProxyUserKey]) { bytes[2] = GSSocks5AuthenticationMethodPassword; } [delegate parser: self formedRequest: [NSData dataWithBytes: bytes length: 3]]; [delegate parser: self needsMoreBytes: 2]; } - (NSError *) errorWithResponseStatus: (NSInteger)aStatus { NSString *description; switch ((GSSocks5ResponseStatus)aStatus) { case GSSocks5ResponseStatusGeneralFailure: description = @"general server failure"; break; case GSSocks5ResponseStatusConnectionNotAllowed: description = @"connection is not allowed by a ruleset"; break; case GSSocks5ResponseStatusNetworkUnreachable: description = @"destination network is unreachable"; break; case GSSocks5ResponseStatusHostUnreachable: description = @"destination host is unreachable"; break; case GSSocks5ResponseStatusConnectionRefused: description = @"connection has been refused"; break; case GSSocks5ResponseStatusTTLExpired: description = @"connection has timed out"; break; case GSSocks5ResponseStatusCommandNotSupported: description = @"command is not supported"; break; case GSSocks5ResponseStatusAddressTypeNotSupported: description = @"address type is not supported"; break; default: description = @"unknown"; break; } description = [NSString stringWithFormat: @"SOCKS5 server failed to fulfil request, reason: %@", description]; return [self errorWithCode: aStatus description: description]; } - (void) reportError: (NSError *)anError { stopped = YES; [delegate parser: self encounteredError: anError]; } - (void) parseNextChunk: (NSData *)aChunk { const uint8_t *bytes; if (stopped) { return; } bytes = [aChunk bytes]; switch ((GSSocks5ParserState)state) { case GSSocks5ParserStateHandshake: { if (bytes[1] == GSSocks5AuthenticationMethodNoAcceptable) { NSError *error; error = [self errorWithCode: GSSocks5AuthenticationMethodNoAcceptable description: @"SOCKS server does not support" @" requested authentication method"]; [self reportError:error]; break; } if (![configuration objectForKey: NSStreamSOCKSProxyUserKey]) { state = GSSocks5ParserStateRequest; goto GSSocks5ParserStateRequest; } state = GSSocks5ParserStateAuthenticationRequest; } case GSSocks5ParserStateAuthenticationRequest: { NSString *username = [configuration objectForKey: NSStreamSOCKSProxyUserKey]; NSString *password = [configuration objectForKey: NSStreamSOCKSProxyPasswordKey]; uint8_t bytes[3] = { 0x5, (uint8_t)[username length], (uint8_t)[password length]}; NSMutableData *request = [NSMutableData dataWithCapacity:bytes[1] + bytes[2] + 3]; [request appendBytes: bytes length: 2]; [request appendBytes: [username UTF8String] length: bytes[1]]; [request appendBytes: &bytes[2] length: 1]; [request appendBytes: [password UTF8String] length: bytes[2]]; state = GSSocks5ParserStateAuthenticationResponse; [delegate parser: self formedRequest: request]; [delegate parser: self needsMoreBytes: 2]; break; } case GSSocks5ParserStateAuthenticationResponse: { if (bytes[1]) { NSError *error; error = [self errorWithCode: 0xFF + bytes[1] description: @"SOCKS authentication failed"]; [self reportError: error]; break; } state = GSSocks5ParserStateRequest; } GSSocks5ParserStateRequest: case GSSocks5ParserStateRequest: { GSSocksAddressType type = [self addressType]; uint8_t request[4] = { 0x5, 0x1, 0x0, type }; uint16_t portWithNetworkEndianness; NSMutableData *data = [NSMutableData dataWithBytes:request length:4]; NSData *addressData = [self addressData]; if (type == GSSocksAddressTypeDomain) { uint8_t length = (uint8_t)[addressData length]; [data appendBytes: &length length: 1]; } [data appendData: addressData]; portWithNetworkEndianness = NSSwapHostShortToBig((uint16_t)port); [data appendBytes: &portWithNetworkEndianness length: 2]; state = GSSocks5ParserStateResponse; [delegate parser: self formedRequest: data]; [delegate parser: self needsMoreBytes: 4]; break; } case GSSocks5ParserStateResponse: { if (bytes[1] != GSSocks5ResponseStatusSuccess) { NSError *error = [self errorWithResponseStatus: bytes[1]]; [self reportError: error]; break; } addressType = bytes[3]; /* addess type */ if (addressType == GSSocksAddressTypeDomain) { state = GSSocks5ParserStateResponseAddressLength; [delegate parser: self needsMoreBytes: 1]; } else { state = GSSocks5ParserStateResponseAddressAndPort; addressSize = addressType == GSSocksAddressTypeIPv4 ? 4 : 16; [delegate parser: self needsMoreBytes: addressSize + 2]; } break; } case GSSocks5ParserStateResponseAddressLength: { addressSize = bytes[0]; state = GSSocks5ParserStateResponseAddressAndPort; [delegate parser: self needsMoreBytes: addressSize + 2]; break; } case GSSocks5ParserStateResponseAddressAndPort: { NSString *bndAddress; NSUInteger bndPort; NSData *data; data = [NSData dataWithBytes: [aChunk bytes] length: addressSize]; bndAddress = [self addressFromData: data withType: addressType]; bndPort = NSSwapBigShortToHost(*(uint16_t *)(bytes + addressSize)); [delegate parser: self finishedWithAddress: bndAddress port: bndPort]; break; } } } @end #ifdef __clang__ #pragma GCC diagnostic pop #endif gnustep-base-1.29.0/Source/GSSocksParser/GSSocksParser.h000066400000000000000000000042031435650067400230040ustar00rootroot00000000000000/* * Parsers of SOCKS protocol messages * Copyright (C) 2013 Free Software Foundation, Inc. * * Written by Marat Ibadinov * Date: 2013 * * This file is part of the GNUstep Base Library. * * 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 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 * Library General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110 USA. * * $Date$ $Revision$ */ #import #import #import #import #import #import @class GSSocksParser; @protocol GSSocksParserDelegate - (void) parser: (GSSocksParser *)aParser needsMoreBytes: (NSUInteger)aLength; - (void) parser: (GSSocksParser *)aParser formedRequest: (NSData *)aRequest; - (void) parser: (GSSocksParser *)aParser finishedWithAddress: (NSString *)anAddress port: (NSUInteger)aPort; - (void) parser: (GSSocksParser *)aParser encounteredError: (NSError *)anError; @end @interface GSSocksParser : NSObject { NSDictionary *configuration; NSString *address; id delegate; NSUInteger port; } - (id) initWithConfiguration: (NSDictionary *)aConfiguration address: (NSString *)anAddress port: (NSUInteger)aPort; - (id) delegate; - (void) setDelegate: (id)aDelegate; - (NSString *) address; - (NSUInteger) port; - (void) start; - (void) parseNextChunk: (NSData *)aChunk; @end gnustep-base-1.29.0/Source/GSSocksParser/GSSocksParser.m000066400000000000000000000056211435650067400230160ustar00rootroot00000000000000/* * Parsers of SOCKS protocol messages * Copyright (C) 2013 Free Software Foundation, Inc. * * Written by Marat Ibadinov * Date: 2013 * * This file is part of the GNUstep Base Library. * * 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 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 * Library General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110 USA. * * $Date$ $Revision$ */ #import "GSSocksParser.h" #import "GSSocks4Parser.h" #import "GSSocks5Parser.h" #import "Foundation/NSException.h" @interface NSObject (SubclassResponsibility) - (id) subclassResponsibility: (SEL)aSelector; @end @implementation GSSocksParser - (id) init { if (nil != (self = [super init])) { configuration = nil; address = nil; delegate = nil; port = 0; } return self; } - (id) initWithConfiguration: (NSDictionary *)aConfiguration address: (NSString *)anAddress port: (NSUInteger)aPort { NSString *version; Class concreteClass; version = [aConfiguration objectForKey: NSStreamSOCKSProxyVersionKey]; version = version ? version : NSStreamSOCKSProxyVersion5; [self release]; if ([version isEqualToString: NSStreamSOCKSProxyVersion5]) { concreteClass = [GSSocks5Parser class]; } else if ([version isEqualToString: NSStreamSOCKSProxyVersion4]) { concreteClass = [GSSocks4Parser class]; } else { [NSException raise: NSInternalInconsistencyException format: @"Unsupported socks version: %@", version]; return nil; // Avoid spurious compiler warning } return [[concreteClass alloc] initWithConfiguration: aConfiguration address: anAddress port: aPort]; } - (void) dealloc { [delegate release]; [address release]; [configuration release]; [super dealloc]; } - (id) delegate { return delegate; } - (void) setDelegate: (id)aDelegate { id previous = delegate; delegate = [aDelegate retain]; [previous release]; } - (NSString *) address { return address; } - (NSUInteger) port { return port; } - (void) start { [self subclassResponsibility:_cmd]; } - (void) parseNextChunk: (NSData *)aChunk { [self subclassResponsibility: _cmd]; } @end gnustep-base-1.29.0/Source/GSSocksParser/GSSocksParserPrivate.h000066400000000000000000000027271435650067400243500ustar00rootroot00000000000000/* * Parsers of SOCKS protocol messages * Copyright (C) 2013 Free Software Foundation, Inc. * * Written by Marat Ibadinov * Date: 2013 * * This file is part of the GNUstep Base Library. * * 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 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 * Library General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110 USA. * * $Date$ $Revision$ */ #import "GSSocksParser.h" typedef enum GSSocksAddressType { GSSocksAddressTypeIPv4 = 0x1, GSSocksAddressTypeIPv6 = 0x4, GSSocksAddressTypeDomain = 0x3, } GSSocksAddressType; @interface GSSocksParser (Private) - (NSError *) errorWithCode: (NSInteger)aCode description: (NSString *)aDescription; - (GSSocksAddressType) addressType; - (NSData *) addressData; - (NSString *) addressFromData: (NSData *)aData withType: (GSSocksAddressType)anAddressType; @end gnustep-base-1.29.0/Source/GSSocksParser/GSSocksParserPrivate.m000066400000000000000000000160441435650067400243520ustar00rootroot00000000000000/* * Parsers of SOCKS protocol messages * Copyright (C) 2013 Free Software Foundation, Inc. * * Written by Marat Ibadinov * Date: 2013 * * This file is part of the GNUstep Base Library. * * 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 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 * Library General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110 USA. * * $Date$ $Revision$ */ #import "GSSocksParserPrivate.h" #import "Foundation/NSArray.h" #import "Foundation/NSBundle.h" #import "Foundation/NSCharacterSet.h" #import "Foundation/NSException.h" #import @interface NSString (GSSocksParser) - (NSString *) stringByRepeatingCurrentString: (NSUInteger)times; @end @implementation NSString (GSSocksParser) - (NSString *) stringByRepeatingCurrentString: (NSUInteger)times { return [@"" stringByPaddingToLength: times * [self length] withString: self startingAtIndex: 0]; } @end @implementation GSSocksParser (Private) - (NSError *) errorWithCode: (NSInteger)aCode description: (NSString *)aDescription { NSDictionary *userInfo; aDescription = NSLocalizedString(aDescription, @""); userInfo = [NSDictionary dictionaryWithObject: aDescription forKey: NSLocalizedDescriptionKey]; return [NSError errorWithDomain: NSStreamSOCKSErrorDomain code: aCode userInfo: userInfo]; } - (GSSocksAddressType) addressType { const char *cAddress; NSUInteger index; BOOL hasAlpha; BOOL hasDot; char character; if ([address length] > 16) { return GSSocksAddressTypeDomain; } cAddress = [address UTF8String]; index = 0; hasAlpha = NO; hasDot = NO; while (0 != (character = cAddress[index])) { BOOL isAlpha = character >= 'a' && character <= 'f'; if (!(character >= '0' && character <= '9') && !isAlpha && character != '.' && character != ':') { return GSSocksAddressTypeDomain; } hasAlpha = hasAlpha || isAlpha; hasDot = hasDot || character == '.'; ++index; } return hasAlpha && hasDot ? GSSocksAddressTypeDomain : (hasDot ? GSSocksAddressTypeIPv4 : GSSocksAddressTypeIPv6); } - (NSData *) addressData { switch ([self addressType]) { case GSSocksAddressTypeIPv4: { NSMutableData *result = [NSMutableData dataWithLength: 4]; const char *cString = [address UTF8String]; int elements[4]; uint8_t *bytes = [result mutableBytes]; sscanf(cString, "%d.%d.%d.%d", &elements[0], &elements[1], &elements[2], &elements[3]); bytes[0] = (uint8_t)elements[0]; bytes[1] = (uint8_t)elements[1]; bytes[2] = (uint8_t)elements[2]; bytes[3] = (uint8_t)elements[3]; return result; } case GSSocksAddressTypeIPv6: { NSArray *components = [address componentsSeparatedByString: @"::"]; NSMutableData *result; uint16_t *bytes; if ([components count] == 2) { NSString *leading; NSString *trailing; NSCharacterSet *charset; NSArray *separated; NSUInteger leadingCount; NSUInteger trailingCount; leading = [components objectAtIndex: 0]; trailing = [components objectAtIndex: 1]; charset = [NSCharacterSet characterSetWithCharactersInString: @":"]; separated = [leading componentsSeparatedByCharactersInSet: charset]; leadingCount = [leading length] ? [separated count] : 0; /* FIXME ... do we need to add this following statement? separated = [trailing componentsSeparatedByCharactersInSet: charset]; */ trailingCount = [trailing length] ? [separated count] : 0; if (leadingCount && trailingCount) { NSString *middle; middle = [@"0:" stringByRepeatingCurrentString: 8 - leadingCount - trailingCount]; address = [[[leading stringByAppendingString: @":"] stringByAppendingString: middle] stringByAppendingString: trailing]; } else if (!leadingCount) { NSString *start; start = [@"0:" stringByRepeatingCurrentString: 8 - trailingCount]; address = [start stringByAppendingString: trailing]; } else { NSString *end; end = [@":0" stringByRepeatingCurrentString: 8 - leadingCount]; address = [leading stringByAppendingString: end]; } } result = [NSMutableData dataWithLength:16]; bytes = [result mutableBytes]; sscanf([address UTF8String], "%hx:%hx:%hx:%hx:%hx:%hx:%hx:%hx", &bytes[0], &bytes[1], &bytes[2], &bytes[3], &bytes[4], &bytes[5], &bytes[6], &bytes[7]); return result; } case GSSocksAddressTypeDomain: { return [address dataUsingEncoding:NSUTF8StringEncoding]; } default: [NSException raise: NSInternalInconsistencyException format: @"Unknown address type"]; return nil; } } - (NSString *) addressFromData: (NSData *)aData withType: (GSSocksAddressType)anAddressType { switch (anAddressType) { case GSSocksAddressTypeIPv4: { const uint8_t *bytes = [aData bytes]; return [NSString stringWithFormat: @"%hhu.%hhu.%hhu.%hhu", bytes[0], bytes[1], bytes[2], bytes[3]]; } case GSSocksAddressTypeIPv6: { const uint16_t *bytes = [aData bytes]; return [NSString stringWithFormat: @"%hx:%hx:%hx:%hx:%hx:%hx:%hx:%hx", bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5], bytes[6], bytes[7]]; } case GSSocksAddressTypeDomain: { return [[[NSString alloc] initWithData: aData encoding: NSUTF8StringEncoding] autorelease]; } default: [NSException raise: NSInternalInconsistencyException format: @"Unknown address type"]; return nil; } } @end gnustep-base-1.29.0/Source/GSSorting.h000066400000000000000000000136461435650067400175140ustar00rootroot00000000000000/* Header file for sorting functions in GNUstep Copyright (C) 2012 Free Software Foundation, Inc. Written by: Niels Grewe Date: September 2012 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "Foundation/NSSortDescriptor.h" #import "GNUstepBase/GSObjCRuntime.h" #import "Foundation/NSException.h" #import "GSPrivate.h" enum { GSComparisonTypeSortDescriptor = 0, /** Comparison using NSSortDescriptor */ GSComparisonTypeComparatorBlock, /** Comparison using an NSComparator */ GSComparisonTypeFunction, /** Comparison using a comparison function of type * NSInteger(*)(id,id,void*) */ GSComparisonTypeMax }; typedef NSUInteger GSComparisonType; /** * This is the internal prototype of an unstable, non-concurrency safe sorting * function that can be used either through NSComparator or NSSortDescriptor. It * may or may not be implemented by one of the sorting implementations in * GNUstep. */ extern void (*_GSSortUnstable)(id *buffer, NSRange range, id comparisonEntity, GSComparisonType cmprType, void *context); /** * This is the internal prototype of an stable, non-concurrency safe sorting * function that can be used either through NSComparator or NSSortDescriptor. * It may or may not be implemented by one of the sorting implementations in * GNUstep. */ extern void (*_GSSortStable)(id *buffer, NSRange range, id comparisonEntity, GSComparisonType cmprType, void *context); /** * This is the internal prototype of an unstable, concurrency safe sorting * function that can be used either through NSComparator or NSSortDescriptor. * It may or may not be implemented by one of the sorting implementations in * GNUstep. */ extern void (*_GSSortUnstableConcurrent)(id *buffer, NSRange range, id comparisonEntity, GSComparisonType cmprType, void *context); /** * This is the internal prototype of an stable, concurrency safe sorting * function that can be used either through NSComparator or NSSortDescriptor. * It may or may not be implemented by one of the sorting implementations in * GNUstep. */ extern void (*_GSSortStableConcurrent)(id *buffer, NSRange range, id comparisonEntity, GSComparisonType cmprType, void *context); /** * GSSortUnstable() uses the above prototypes to provide sorting that does not * make any specific guarantees. If no explicit unstable sorting algorithm is * available, it will fall through to stable sorting. */ void GSSortUnstable(id *buffer, NSRange range, id sortDecriptorOrCompatator, GSComparisonType cmprType, void *context); /** * GSSortStable() uses one of the internal sorting algorithms to provide stable * sorting. If no stable sorting method is available, it raises an exception. */ void GSSortStable(id *buffer, NSRange range, id sortDecriptorOrCompatator, GSComparisonType cmprType, void *context); /** * GSSortUnstableConcurrent() uses the above prototypes to provide sorting that * does not make guarantees about stability, but allows for concurrent sorting. * If no such sorting algorithm is available, it first falls through to stable * concurrent sorting, then unstable non-concurrent sorting and finally stable * concurrent sorting. */ void GSSortUnstableConcurrent(id *buffer, NSRange range, id sortDecriptorOrCompatator, GSComparisonType cmprType, void *context); /** * GSSortStableConcurrent() uses one of the internal sorting algorithms to * provide stable sorting that may be executed concurrently. If no such * algorithm is available, it falls through to non-concurrent GSSortStable(). */ void GSSortStableConcurrent(id *buffer, NSRange range, id sortDecriptorOrCompatator, GSComparisonType cmprType, void *context); /** * This function finds the proper point for inserting a new key into a sorted * range, placing the new key at the rightmost position of all equal keys. * * This function is provided using the implementation of the timsort algorithm. */ NSUInteger GSRightInsertionPointForKeyInSortedRange(id key, id *buffer, NSRange range, NSComparator comparator); /** * This function finds the proper point for inserting a new key into a sorted * range, placing the new key at the leftmost position of all equal keys. * * This function is provided using the implementation of the timsort algorithm. */ NSUInteger GSLeftInsertionPointForKeyInSortedRange(id key, id *buffer, NSRange range, NSComparator comparator); /** * Convenience function to operate with sort descriptors, * comparator blocks and functions. */ static inline NSComparisonResult GSCompareUsingDescriptorOrComparator(id first, id second, id descOrComp, GSComparisonType cmprType, void *context) { switch (cmprType) { case GSComparisonTypeSortDescriptor: return [(NSSortDescriptor*)descOrComp compareObject: first toObject: second]; case GSComparisonTypeComparatorBlock: return CALL_NON_NULL_BLOCK(((NSComparator)descOrComp), first, second); case GSComparisonTypeFunction: return ((NSInteger (*)(id, id, void *))descOrComp)(first, second, context); default: [NSException raise: @"NSInternalInconstitencyException" format: @"Invalid comparison type"]; } // Not reached: return 0; } gnustep-base-1.29.0/Source/GSStream.h000066400000000000000000000136141435650067400173150ustar00rootroot00000000000000#ifndef INCLUDED_GSSTREAM_H #define INCLUDED_GSSTREAM_H /** Implementation for GSStream for GNUStep Copyright (C) 2006 Free Software Foundation, Inc. Written by: Derek Zhou Written by: Richard Frith-Macdonald Date: 2006 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 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 USA. NSInputStream and NSOutputStream are clusters rather than concrete classes The inherance graph is: NSStream |-- GSStream | `--GSSocketStream |-- NSInputStream | `--GSInputStream | |-- GSDataInputStream | |-- GSFileInputStream | |-- GSPipeInputStream (mswindows only) | `-- GSSocketInputStream | |-- GSInetInputStream | |-- GSLocalInputStream | `-- GSInet6InputStream |-- NSOutputStream | `--GSOutputStream | |-- GSBufferOutputStream | |-- GSDataOutputStream | |-- GSFileOutputStream | |-- GSPipeOutputStream (mswindows only) | `-- GSSocketOutputStream | |-- GSInetOutputStream | |-- GSLocalOutputStream | `-- GSInet6InputStream `-- GSServerStream `-- GSAbstractServerStream |-- GSLocalServerStream (mswindows) `-- GSSocketServerStream |-- GSInetServerStream |-- GSInet6ServerStream `-- GSLocalServerStream (gnu/linux) */ #import "Foundation/NSStream.h" #import "Foundation/NSRunLoop.h" #import "Foundation/NSMapTable.h" #import "GNUstepBase/NSStream+GNUstepBase.h" /** * Convenience methods used to add streams to the run loop. */ @interface NSRunLoop (NSStream) - (void) addStream: (NSStream*)aStream mode: (NSString*)mode; - (void) removeStream: (NSStream*)aStream mode: (NSString*)mode; @end @class NSMutableData; #define IVARS \ { \ id _delegate; /* Delegate controls operation. */\ NSMutableDictionary *_properties; /* storage for properties */\ BOOL _delegateValid; /* whether the delegate responds*/\ BOOL _scheduled; /* Are the loops sceduled? */\ NSError *_lastError; /* last error occured */\ NSStreamStatus _currentStatus;/* current status */\ NSMapTable *_loops; /* Run loops and their modes. */\ void *_loopID; /* file descriptor etc. */\ int _events; /* Signalled events. */\ } /** * GSInputStream and GSOutputStream both inherit methods from the * GSStream class using 'behaviors', and must therefore share * EXACTLY THE SAME initial ivar layout. */ @interface GSStream : NSStream IVARS /** Return description of current event mask. */ - (NSString*) _stringFromEvents; @end @interface GSAbstractServerStream : GSServerStream IVARS @end @interface NSStream(Private) /** * Async notification */ - (void) _dispatch; /** * Return YES if the stream is opened, NO otherwise. */ - (BOOL) _isOpened; /** * Return previously set reference for IO in run loop. */ - (void*) _loopID; /** Reset events in mask to allow them to be sent again. */ - (void) _resetEvents: (NSUInteger)mask; /** * Place the stream in all the scheduled runloops. */ - (void) _schedule; /** Return YES if the stream is *actually* scheduled in one or more loops. */ - (BOOL) _scheduled; /** Low level method to place the stream in the scheduled runloop. * Must only be called by -_schedule and -scheduleInRunLoop:forMode: */ - (void) _scheduleInRunLoop: (NSRunLoop*)aRunLoop forMode: (NSString*)mode; /** * send an event to delegate */ - (void) _sendEvent: (NSStreamEvent)event; /** * send an event to delegate */ - (void) _sendEvent: (NSStreamEvent)event delegate: (id)delegate; /** * setter for IO event reference (file descriptor, file handle etc ) */ - (void) _setLoopID: (void *)ref; /** * set the status to newStatus. an exception is error cannot * be overwriten by closed */ - (void) _setStatus: (NSStreamStatus)newStatus; /** * record an error based on errno */ - (void) _recordError; - (void) _recordError: (NSError*)anError; /** Low level method to remove the stream from the scheduled runloop. * Must only be called by -_sunchedule and -removeFromRunLoop:forMode: */ - (void) _removeFromRunLoop: (NSRunLoop*)aRunLoop forMode: (NSString*)mode; /** * say whether there is unhandled data for the stream. */ - (BOOL) _unhandledData; /** * Remove the stream from all the scheduled runloops. */ - (void) _unschedule; /** Return name of event */ - (NSString*) stringFromEvent: (NSStreamEvent)e; /** Return name of status */ - (NSString*) stringFromStatus: (NSStreamStatus)s; @end @interface GSInputStream : NSInputStream IVARS @end @interface GSOutputStream : NSOutputStream IVARS @end /** * The concrete subclass of NSInputStream that reads from the memory */ @interface GSDataInputStream : GSInputStream { @private NSData *_data; unsigned long _pointer; } @end /** * The concrete subclass of NSOutputStream that writes to a buffer */ @interface GSBufferOutputStream : GSOutputStream { @private uint8_t *_buffer; unsigned _capacity; unsigned long _pointer; } @end /** * The concrete subclass of NSOutputStream that writes to a variable sise buffer */ @interface GSDataOutputStream : GSOutputStream { @private NSMutableData *_data; unsigned long _pointer; } @end #endif gnustep-base-1.29.0/Source/GSStream.m000066400000000000000000000617561435650067400173340ustar00rootroot00000000000000/** Implementation for GSStream for GNUStep Copyright (C) 2006 Free Software Foundation, Inc. Written by: Derek Zhou Written by: Richard Frith-Macdonald Date: 2006 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 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 USA. */ #import "common.h" #import "Foundation/NSArray.h" #import "Foundation/NSByteOrder.h" #import "Foundation/NSData.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSException.h" #import "Foundation/NSHost.h" #import "Foundation/NSRunLoop.h" #import "Foundation/NSValue.h" #import "GSStream.h" #import "GSPrivate.h" #import "GSSocketStream.h" NSString * const NSStreamDataWrittenToMemoryStreamKey = @"NSStreamDataWrittenToMemoryStreamKey"; NSString * const NSStreamFileCurrentOffsetKey = @"NSStreamFileCurrentOffsetKey"; NSString * const NSStreamSocketSecurityLevelKey = @"NSStreamSocketSecurityLevelKey"; NSString * const NSStreamSocketSecurityLevelNone = @"NSStreamSocketSecurityLevelNone"; NSString * const NSStreamSocketSecurityLevelSSLv2 = @"NSStreamSocketSecurityLevelSSLv2"; NSString * const NSStreamSocketSecurityLevelSSLv3 = @"NSStreamSocketSecurityLevelSSLv3"; NSString * const NSStreamSocketSecurityLevelTLSv1 = @"NSStreamSocketSecurityLevelTLSv1"; NSString * const NSStreamSocketSecurityLevelNegotiatedSSL = @"NSStreamSocketSecurityLevelNegotiatedSSL"; NSString * const NSStreamSocketSSLErrorDomain = @"NSStreamSocketSSLErrorDomain"; NSString * const NSStreamSOCKSErrorDomain = @"NSStreamSOCKSErrorDomain"; NSString * const NSStreamSOCKSProxyConfigurationKey = @"NSStreamSOCKSProxyConfigurationKey"; NSString * const NSStreamSOCKSProxyHostKey = @"NSStreamSOCKSProxyHostKey"; NSString * const NSStreamSOCKSProxyPasswordKey = @"NSStreamSOCKSProxyPasswordKey"; NSString * const NSStreamSOCKSProxyPortKey = @"NSStreamSOCKSProxyPortKey"; NSString * const NSStreamSOCKSProxyUserKey = @"NSStreamSOCKSProxyUserKey"; NSString * const NSStreamSOCKSProxyVersion4 = @"NSStreamSOCKSProxyVersion4"; NSString * const NSStreamSOCKSProxyVersion5 = @"NSStreamSOCKSProxyVersion5"; NSString * const NSStreamSOCKSProxyVersionKey = @"NSStreamSOCKSProxyVersionKey"; /* * Determine the type of event to use when adding a stream to the run loop. * By default add as an 'ET_TRIGGER' so that the stream will be notified * every time the loop runs (the event id/reference must be the address of * the stream itsself to ensure that event/type is unique). * * Streams which actually expect to wait for I/O events must be added with * the appropriate information for the loop to signal them. */ static RunLoopEventType typeForStream(NSStream *aStream) { NSStreamStatus status = [aStream streamStatus]; if (NSStreamStatusError == status || [aStream _loopID] == (void*)aStream) { return ET_TRIGGER; } #if defined(_WIN32) return ET_HANDLE; #else if ([aStream isKindOfClass: [NSOutputStream class]] == NO && status != NSStreamStatusOpening) { return ET_RDESC; } return ET_WDESC; #endif } @implementation NSRunLoop (NSStream) - (void) addStream: (NSStream*)aStream mode: (NSString*)mode { RunLoopEventType type = typeForStream(aStream); void *event = [aStream _loopID]; NSDebugMLLog(@"NSStream", @"%@ (type %d) to %@ mode %@", aStream, type, self, mode); [self addEvent: event type: type watcher: (id)aStream forMode: mode]; } - (void) removeStream: (NSStream*)aStream mode: (NSString*)mode { RunLoopEventType type = typeForStream(aStream); void *event = [aStream _loopID]; NSDebugMLLog(@"NSStream", @"-removeStream:mode: %@ (desc %d,%d) from %@ mode %@", aStream, (int)(intptr_t)event, type, self, mode); /* We may have added the stream more than once (eg if the stream -open * method was called more than once, so we need to remove all event * registrations. */ [self removeEvent: event type: type forMode: mode all: YES]; } @end @implementation GSStream + (void) initialize { GSMakeWeakPointer(self, "delegate"); } - (void) close { if (_currentStatus == NSStreamStatusNotOpen) { NSDebugMLLog(@"NSStream", @"Attempt to close unopened stream %@", self); } [self _unschedule]; [self _setStatus: NSStreamStatusClosed]; /* We don't want to send any events to the delegate after the * stream has been closed. */ _delegateValid = NO; } - (void) finalize { if (_currentStatus != NSStreamStatusNotOpen && _currentStatus != NSStreamStatusClosed) { [self close]; } GSAssignZeroingWeakPointer((void**)&_delegate, (void*)0); } - (void) dealloc { [self finalize]; if (_loops != 0) { NSFreeMapTable(_loops); _loops = 0; } DESTROY(_properties); DESTROY(_lastError); [super dealloc]; } - (id) delegate { return _delegate; } - (id) init { if ((self = [super init]) != nil) { _delegate = self; _properties = nil; _lastError = nil; _loops = NSCreateMapTable(NSObjectMapKeyCallBacks, NSObjectMapValueCallBacks, 1); _currentStatus = NSStreamStatusNotOpen; _loopID = (void*)self; } return self; } - (void) open { if (_currentStatus != NSStreamStatusNotOpen && _currentStatus != NSStreamStatusOpening) { NSDebugMLLog(@"NSStream", @"Attempt to re-open stream %@", self); return; } [self _setStatus: NSStreamStatusOpen]; [self _schedule]; [self _sendEvent: NSStreamEventOpenCompleted]; } - (id) propertyForKey: (NSString *)key { return [_properties objectForKey: key]; } - (void) receivedEvent: (void*)data type: (RunLoopEventType)type extra: (void*)extra forMode: (NSString*)mode { // NSDebugMLLog(@"NSStream", @"receivedEvent for %@ - %d", self, type); [self _dispatch]; } - (void) removeFromRunLoop: (NSRunLoop *)aRunLoop forMode: (NSString *)mode { if (aRunLoop != nil && mode != nil) { NSMutableArray *modes; modes = (NSMutableArray*)NSMapGet(_loops, (void*)aRunLoop); if ([modes containsObject: mode]) { [self _removeFromRunLoop: aRunLoop forMode: mode]; [modes removeObject: mode]; if ([modes count] == 0) { NSMapRemove(_loops, (void*)aRunLoop); } } if (NSCountMapTable(_loops) == 0) { _scheduled = NO; } } } - (void) scheduleInRunLoop: (NSRunLoop *)aRunLoop forMode: (NSString *)mode { if (aRunLoop != nil && mode != nil) { NSMutableArray *modes; modes = (NSMutableArray*)NSMapGet(_loops, (void*)aRunLoop); if (modes == nil) { modes = [[NSMutableArray alloc] initWithCapacity: 1]; NSMapInsert(_loops, (void*)aRunLoop, (void*)modes); RELEASE(modes); } if ([modes containsObject: mode] == NO) { mode = [mode copy]; [modes addObject: mode]; RELEASE(mode); /* We only add open streams to the runloop .. subclasses may add * streams when they are in the process of opening if they need * to do so. */ if ([self _isOpened]) { [self _scheduleInRunLoop: aRunLoop forMode: mode]; } } } } - (void) setDelegate: (id)delegate { if ([self streamStatus] == NSStreamStatusClosed || [self streamStatus] == NSStreamStatusError) { _delegateValid = NO; GSAssignZeroingWeakPointer((void**)&_delegate, (void*)0); } else { if (delegate == nil) { _delegate = self; } if (delegate == self) { if (_delegate != nil && _delegate != self) { GSAssignZeroingWeakPointer((void**)&_delegate, (void*)0); } _delegate = delegate; } else { GSAssignZeroingWeakPointer((void**)&_delegate, (void*)delegate); } /* We don't want to send any events the the delegate after the * stream has been closed. */ _delegateValid = [_delegate respondsToSelector: @selector(stream:handleEvent:)]; } } - (BOOL) setProperty: (id)property forKey: (NSString *)key { if (_properties == nil) { _properties = [NSMutableDictionary new]; } [_properties setObject: property forKey: key]; return YES; } - (NSError *) streamError { return _lastError; } - (NSStreamStatus) streamStatus { return _currentStatus; } - (NSString*) _stringFromEvents { NSMutableString *s = [NSMutableString stringWithCapacity: 100]; if (_events & NSStreamEventOpenCompleted) [s appendString: @"|NSStreamEventOpenCompleted"]; if (_events & NSStreamEventHasBytesAvailable) [s appendString: @"|NSStreamEventHasBytesAvailable"]; if (_events & NSStreamEventHasSpaceAvailable) [s appendString: @"|NSStreamEventHasSpaceAvailable"]; if (_events & NSStreamEventErrorOccurred) [s appendString: @"|NSStreamEventErrorOccurred"]; if (_events & NSStreamEventEndEncountered) [s appendString: @"|NSStreamEventEndEncountered"]; return s; } @end @implementation NSStream (Private) - (void) _dispatch { } - (BOOL) _isOpened { return NO; } - (void*) _loopID { return (void*)self; // By default a stream is a TRIGGER event. } - (void) _recordError { } - (void) _recordError: (NSError*)anError { return; } - (void) _removeFromRunLoop: (NSRunLoop *)aRunLoop forMode: (NSString *)mode { [aRunLoop removeStream: self mode: mode]; } - (void) _resetEvents: (NSUInteger)mask { return; } - (void) _schedule { } - (BOOL) _scheduled { return NO; } - (void) _scheduleInRunLoop: (NSRunLoop*)loop forMode: (NSString*)mode { [loop addStream: self mode: mode]; } - (void) _sendEvent: (NSStreamEvent)event { } - (void) _sendEvent: (NSStreamEvent)event delegate: (id)delegate { } - (void) _setLoopID: (void *)ref { } - (void) _setStatus: (NSStreamStatus)newStatus { } - (BOOL) _unhandledData { return NO; } - (void) _unschedule { } - (NSString*) stringFromEvent: (NSStreamEvent)e { switch (e) { case NSStreamEventNone: return @"NSStreamEventNone"; case NSStreamEventOpenCompleted: return @"NSStreamEventOpenCompleted"; case NSStreamEventHasBytesAvailable: return @"NSStreamEventHasBytesAvailable"; case NSStreamEventHasSpaceAvailable: return @"NSStreamEventHasSpaceAvailable"; case NSStreamEventErrorOccurred: return @"NSStreamEventErrorOccurred"; case NSStreamEventEndEncountered: return @"NSStreamEventEndEncountered"; default: return [NSString stringWithFormat: @"NSStreamEventValue%ld", (long)e]; } } - (NSString*) stringFromStatus: (NSStreamStatus)s { switch (s) { case NSStreamStatusNotOpen: return @"NSStreamStatusNotOpen"; case NSStreamStatusOpening: return @"NSStreamStatusOpening"; case NSStreamStatusOpen: return @"NSStreamStatusOpen"; case NSStreamStatusReading: return @"NSStreamStatusReading"; case NSStreamStatusWriting: return @"NSStreamStatusWriting"; case NSStreamStatusAtEnd: return @"NSStreamStatusAtEnd"; case NSStreamStatusClosed: return @"NSStreamStatusClosed"; case NSStreamStatusError: return @"NSStreamStatusError"; default: return [NSString stringWithFormat: @"NSStreamStatusValue%ld", (long)s]; } } @end @implementation GSStream (Private) - (BOOL) _isOpened { return !(_currentStatus == NSStreamStatusNotOpen || _currentStatus == NSStreamStatusOpening || _currentStatus == NSStreamStatusClosed); } - (void*) _loopID { return _loopID; } - (void) _recordError { NSError *theError; theError = [NSError _last]; [self _recordError: theError]; } - (void) _recordError: (NSError*)anError { NSDebugMLLog(@"NSStream", @"%@ - %@", self, anError); ASSIGN(_lastError, anError); [self _setStatus: NSStreamStatusError]; } - (void) _resetEvents: (NSUInteger)mask { _events &= ~mask; } - (void) _schedule { NSMapEnumerator enumerator; NSRunLoop *k; NSMutableArray *v; enumerator = NSEnumerateMapTable(_loops); while (NSNextMapEnumeratorPair(&enumerator, (void **)(&k), (void**)&v)) { unsigned i = [v count]; while (i-- > 0) { [self _scheduleInRunLoop: k forMode: [v objectAtIndex: i]]; } } NSEndMapTableEnumeration(&enumerator); } - (BOOL) _scheduled { return _scheduled; } - (void) _scheduleInRunLoop: (NSRunLoop*)loop forMode: (NSString*)mode { [loop addStream: self mode: mode]; _scheduled = YES; } - (void) _sendEvent: (NSStreamEvent)event { [self _sendEvent: event delegate: _delegateValid == YES ? _delegate : nil]; } - (void) _sendEvent: (NSStreamEvent)event delegate: (id)delegate { NSDebugMLLog(@"NSStream", @"%@ sendEvent %@", self, [self stringFromEvent:event]); if (event == NSStreamEventNone) { return; } else if (event == NSStreamEventOpenCompleted) { if ((_events & event) == 0) { _events |= NSStreamEventOpenCompleted; if (delegate != nil) { [delegate stream: self handleEvent: NSStreamEventOpenCompleted]; } } } else if (event == NSStreamEventHasBytesAvailable) { if ((_events & NSStreamEventOpenCompleted) == 0) { _events |= NSStreamEventOpenCompleted; if (delegate != nil) { [delegate stream: self handleEvent: NSStreamEventOpenCompleted]; } } if ((_events & NSStreamEventHasBytesAvailable) == 0) { _events |= NSStreamEventHasBytesAvailable; if (delegate != nil) { [delegate stream: self handleEvent: NSStreamEventHasBytesAvailable]; } } } else if (event == NSStreamEventHasSpaceAvailable) { if ((_events & NSStreamEventOpenCompleted) == 0) { _events |= NSStreamEventOpenCompleted; if (delegate != nil) { [delegate stream: self handleEvent: NSStreamEventOpenCompleted]; } } if ((_events & NSStreamEventHasSpaceAvailable) == 0) { _events |= NSStreamEventHasSpaceAvailable; if (_currentStatus == NSStreamStatusWriting) { [self _setStatus: NSStreamStatusOpen]; } if (delegate != nil) { [delegate stream: self handleEvent: NSStreamEventHasSpaceAvailable]; } } } else if (event == NSStreamEventErrorOccurred) { if ((_events & NSStreamEventErrorOccurred) == 0) { _events |= NSStreamEventErrorOccurred; if (delegate != nil) { [delegate stream: self handleEvent: NSStreamEventErrorOccurred]; } } } else if (event == NSStreamEventEndEncountered) { if ((_events & NSStreamEventEndEncountered) == 0) { _events |= NSStreamEventEndEncountered; if (delegate != nil) { [delegate stream: self handleEvent: NSStreamEventEndEncountered]; } } } else { [NSException raise: NSInvalidArgumentException format: @"Unknown event (%"PRIuPTR") passed to _sendEvent:", event]; } } - (void) _setLoopID: (void *)ref { _loopID = ref; } - (void) _setStatus: (NSStreamStatus)newStatus { if (_currentStatus != newStatus) { if (NSStreamStatusError == newStatus && NSCountMapTable(_loops) > 0) { /* After an error, we are in the run loops only to trigger * errors, not for I/O, sop we must re-schedule in the right mode. */ [self _unschedule]; _currentStatus = newStatus; [self _schedule]; } else { _currentStatus = newStatus; } } } - (BOOL) _unhandledData { if (_events & (NSStreamEventHasBytesAvailable | NSStreamEventHasSpaceAvailable)) { return YES; } return NO; } - (void) _unschedule { NSMapEnumerator enumerator; NSRunLoop *k; NSMutableArray *v; enumerator = NSEnumerateMapTable(_loops); while (NSNextMapEnumeratorPair(&enumerator, (void **)(&k), (void**)&v)) { unsigned i = [v count]; while (i-- > 0) { [k removeStream: self mode: [v objectAtIndex: i]]; } } NSEndMapTableEnumeration(&enumerator); _scheduled = NO; } - (BOOL) runLoopShouldBlock: (BOOL*)trigger { if (_events & (NSStreamEventHasBytesAvailable | NSStreamEventHasSpaceAvailable)) { /* If we have an unhandled data event, we should not watch for more * or trigger until the appropriate read or write has been done. */ *trigger = NO; return NO; } if (_currentStatus == NSStreamStatusError) { if ((_events & NSStreamEventErrorOccurred) == 0) { /* An error has occurred but not been handled, * so we should trigger an error event at once. */ *trigger = YES; return NO; } else { /* An error has occurred (and been handled), * so we should not watch for any events at all. */ *trigger = NO; return NO; } } if (_currentStatus == NSStreamStatusAtEnd) { if ((_events & NSStreamEventEndEncountered) == 0) { /* An end of stream has occurred but not been handled, * so we should trigger an end of stream event at once. */ *trigger = YES; return NO; } else { /* An end of stream has occurred (and been handled), * so we should not watch for any events at all. */ *trigger = NO; return NO; } } if (_loopID == (void*)self) { /* If _loopID is the receiver, the stream is not receiving external * input, so it must trigger an event when the loop runs and must not * block the loop from running. */ *trigger = YES; return NO; } else { *trigger = YES; return YES; } } @end @implementation GSInputStream + (void) initialize { if (self == [GSInputStream class]) { GSObjCAddClassBehavior(self, [GSStream class]); GSMakeWeakPointer(self, "delegate"); } } - (BOOL) hasBytesAvailable { if (_currentStatus == NSStreamStatusOpen) { return YES; } if (_currentStatus == NSStreamStatusAtEnd) { if ((_events & NSStreamEventEndEncountered) == 0) { /* We have not sent the appropriate event yet, so the * client must not have issued a read:maxLength: * (which is the point at which we should send). */ return YES; } } return NO; } @end @implementation GSOutputStream + (void) initialize { if (self == [GSOutputStream class]) { GSObjCAddClassBehavior(self, [GSStream class]); GSMakeWeakPointer(self, "delegate"); } } - (BOOL) hasSpaceAvailable { if (_currentStatus == NSStreamStatusOpen) { return YES; } return NO; } @end @implementation GSDataInputStream /** * the designated initializer */ - (id) initWithData: (NSData *)data { if ((self = [super init]) != nil) { ASSIGN(_data, data); _pointer = 0; } return self; } - (void) dealloc { if (_currentStatus != NSStreamStatusNotOpen && _currentStatus != NSStreamStatusClosed) { [self close]; } RELEASE(_data); [super dealloc]; } - (NSInteger) read: (uint8_t *)buffer maxLength: (NSUInteger)len { NSUInteger dataSize; if (buffer == 0) { [NSException raise: NSInvalidArgumentException format: @"null pointer for buffer"]; } if (len == 0) { [NSException raise: NSInvalidArgumentException format: @"zero byte read write requested"]; } if ([self streamStatus] == NSStreamStatusClosed || [self streamStatus] == NSStreamStatusAtEnd) { return 0; } /* Mark the data availability event as handled, so we can generate more. */ _events &= ~NSStreamEventHasBytesAvailable; dataSize = [_data length]; NSAssert(dataSize >= _pointer, @"Buffer overflow!"); if (len + _pointer >= dataSize) { len = dataSize - _pointer; [self _setStatus: NSStreamStatusAtEnd]; } if (len > 0) { memcpy(buffer, [_data bytes] + _pointer, len); _pointer = _pointer + len; } return len; } - (BOOL) getBuffer: (uint8_t **)buffer length: (NSUInteger *)len { unsigned long dataSize = [_data length]; NSAssert(dataSize >= _pointer, @"Buffer overflow!"); *buffer = (uint8_t*)[_data bytes] + _pointer; *len = dataSize - _pointer; return YES; } - (BOOL) hasBytesAvailable { unsigned long dataSize = [_data length]; return (dataSize > _pointer); } - (id) propertyForKey: (NSString *)key { if ([key isEqualToString: NSStreamFileCurrentOffsetKey]) return [NSNumber numberWithLong: _pointer]; return [super propertyForKey: key]; } - (void) _dispatch { BOOL av = [self hasBytesAvailable]; NSStreamEvent myEvent = av ? NSStreamEventHasBytesAvailable : NSStreamEventEndEncountered; NSStreamStatus myStatus = av ? NSStreamStatusOpen : NSStreamStatusAtEnd; [self _setStatus: myStatus]; [self _sendEvent: myEvent]; } @end @implementation GSBufferOutputStream - (id) initToBuffer: (uint8_t *)buffer capacity: (NSUInteger)capacity { if ((self = [super init]) != nil) { _buffer = buffer; _capacity = capacity; _pointer = 0; } return self; } - (NSInteger) write: (const uint8_t *)buffer maxLength: (NSUInteger)len { if (buffer == 0) { [NSException raise: NSInvalidArgumentException format: @"null pointer for buffer"]; } if (len == 0) { [NSException raise: NSInvalidArgumentException format: @"zero byte length write requested"]; } if ([self streamStatus] == NSStreamStatusClosed || [self streamStatus] == NSStreamStatusAtEnd) { return 0; } /* We have consumed the 'writable' event ... mark that so another can * be generated. */ _events &= ~NSStreamEventHasSpaceAvailable; if ((_pointer + len) > _capacity) { len = _capacity - _pointer; [self _setStatus: NSStreamStatusAtEnd]; } if (len > 0) { memcpy((_buffer + _pointer), buffer, len); _pointer += len; } return len; } - (id) propertyForKey: (NSString *)key { if ([key isEqualToString: NSStreamFileCurrentOffsetKey]) { return [NSNumber numberWithLong: _pointer]; } return [super propertyForKey: key]; } - (void) _dispatch { BOOL av = [self hasSpaceAvailable]; NSStreamEvent myEvent = av ? NSStreamEventHasSpaceAvailable : NSStreamEventEndEncountered; [self _sendEvent: myEvent]; } @end @implementation GSDataOutputStream - (id) init { if ((self = [super init]) != nil) { _data = [NSMutableData new]; _pointer = 0; } return self; } - (void) dealloc { RELEASE(_data); [super dealloc]; } - (NSInteger) write: (const uint8_t *)buffer maxLength: (NSUInteger)len { if (buffer == 0) { [NSException raise: NSInvalidArgumentException format: @"null pointer for buffer"]; } if (len == 0) { [NSException raise: NSInvalidArgumentException format: @"zero byte length write requested"]; } if ([self streamStatus] == NSStreamStatusClosed) { return 0; } /* We have consumed the 'writable' event ... mark that so another can * be generated. */ _events &= ~NSStreamEventHasSpaceAvailable; [_data appendBytes: buffer length: len]; _pointer += len; return len; } - (BOOL) hasSpaceAvailable { return YES; } - (id) propertyForKey: (NSString *)key { if ([key isEqualToString: NSStreamFileCurrentOffsetKey]) { return [NSNumber numberWithLong: _pointer]; } else if ([key isEqualToString: NSStreamDataWrittenToMemoryStreamKey]) { return _data; } return [super propertyForKey: key]; } - (void) _dispatch { BOOL av = [self hasSpaceAvailable]; NSStreamEvent myEvent = av ? NSStreamEventHasSpaceAvailable : NSStreamEventEndEncountered; [self _sendEvent: myEvent]; } @end @interface GSLocalServerStream : GSServerStream @end @implementation GSServerStream + (void) initialize { GSMakeWeakPointer(self, "delegate"); } + (id) serverStreamToAddr: (NSString*)addr port: (NSInteger)port { GSServerStream *s; // try inet first, then inet6 s = [[GSInetServerStream alloc] initToAddr: addr port: port]; if (!s) s = [[GSInet6ServerStream alloc] initToAddr: addr port: port]; return AUTORELEASE(s); } + (id) serverStreamToAddr: (NSString*)addr { return AUTORELEASE([[GSLocalServerStream alloc] initToAddr: addr]); } - (id) initToAddr: (NSString*)addr port: (NSInteger)port { DESTROY(self); // try inet first, then inet6 self = [[GSInetServerStream alloc] initToAddr: addr port: port]; if (!self) self = [[GSInet6ServerStream alloc] initToAddr: addr port: port]; return self; } - (id) initToAddr: (NSString*)addr { DESTROY(self); return [[GSLocalServerStream alloc] initToAddr: addr]; } - (void) acceptWithInputStream: (NSInputStream **)inputStream outputStream: (NSOutputStream **)outputStream { [self subclassResponsibility: _cmd]; } @end @implementation GSAbstractServerStream + (void) initialize { if (self == [GSAbstractServerStream class]) { GSObjCAddClassBehavior(self, [GSStream class]); } } @end gnustep-base-1.29.0/Source/GSString.m000066400000000000000000004311271435650067400173400ustar00rootroot00000000000000/** Implementation for GNUStep of NSString concrete subclasses Copyright (C) 1997,1998,2000 Free Software Foundation, Inc. Base on code written by Stevo Crvenkovski Date: February 1997 Based on NSGCString and NSString Written by: Andrew Kachites McCallum Date: March 1995 Optimised by Richard Frith-Macdonald Date: October 1998 Redesign/rewrite by Richard Frith-Macdonald Date: September 2000 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #import "Foundation/NSArray.h" #import "Foundation/NSCharacterSet.h" #import "Foundation/NSCoder.h" #import "Foundation/NSData.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSException.h" #import "Foundation/NSHashTable.h" #import "Foundation/NSKeyedArchiver.h" #import "Foundation/NSRange.h" #import "Foundation/NSValue.h" #import "GNUstepBase/GSObjCRuntime.h" #import "GSPrivate.h" #ifdef HAVE_MALLOC_H #if !defined(__OpenBSD__) #include #endif #endif #ifdef HAVE_ALLOCA_H #include #endif /* memcpy(), strlen(), strcmp() are gcc builtin's */ #import "GNUstepBase/Unicode.h" static NSStringEncoding externalEncoding = 0; static NSStringEncoding internalEncoding = NSISOLatin1StringEncoding; static BOOL isByteEncoding(NSStringEncoding enc) { return GSPrivateIsByteEncoding(enc); } #ifdef NeXT_RUNTIME /* Used by the Darwin/NeXT ObjC Runtime until Apple Radar 2870817 is fixed. */ struct objc_class _NSConstantStringClassReference; #endif /* Count the number of bytes that make up this UTF-8 code point. This to keep in mind: * This macro doesn't return anything larger than '4' * Legal UTF-8 cannot be larger than 4 bytes long (0x10FFFF) * It will return 0 for anything illegal */ #define UTF8_BYTE_COUNT(c) \ (((c) < 0xf8) ? 1 + ((c) >= 0xc0) + ((c) >= 0xe0) + ((c) >= 0xf0) : 0) #ifndef GNUSTEP_NEW_STRING_ABI /* Determine the length of the UTF-8 string as a unicode (UTF-16) string. * sets the ascii flag according to the content found. */ static NSUInteger lengthUTF8(const uint8_t *p, unsigned l, BOOL *ascii, BOOL *latin1) { const uint8_t *e = p + l; BOOL a = YES; BOOL l1 = YES; l = 0; while (p < e) { uint8_t c = *p; uint32_t u = c; if (c > 0x7f) { int i, sle = 0; a = NO; /* calculated the expected sequence length */ while (c & 0x80) { c = c << 1; sle++; } /* legal ? */ if ((sle < 2) || (sle > 6)) { [NSException raise: NSInternalInconsistencyException format: @"Bad sequence length in constant string"]; } if (p + sle > e) { [NSException raise: NSInternalInconsistencyException format: @"Short data in constant string"]; } /* get the codepoint */ for (i = 1; i < sle; i++) { if (p[i] < 0x80 || p[i] >= 0xc0) break; u = (u << 6) | (p[i] & 0x3f); } if (i < sle) { [NSException raise: NSInternalInconsistencyException format: @"Codepoint out of range in constant string"]; } u = u & ~(0xffffffff << ((5 * sle) + 1)); p += sle; /* * We check for invalid codepoints here. */ if (u > 0x10ffff) { [NSException raise: NSInternalInconsistencyException format: @"Codepoint invalid in constant string"]; } if ((u >= 0xd800) && (u <= 0xdfff)) { [NSException raise: NSInternalInconsistencyException format: @"Bad surrogate pair in constant string"]; } } else { p++; } /* * Add codepoint as either a single unichar for BMP * or as a pair of surrogates for codepoints over 16 bits. */ if (u < 0x10000) { l++; if (u > 255) { l1 = NO; } } else { l += 2; l1 = NO; } } if (0 != ascii) { *ascii = a; } if (0 != latin1) { *latin1 = l1; } return l; } /* Sequentially extracts characters from UTF-8 string * p = pointer to the utf-8 data * l = length (bytes) of the utf-8 data * o = pointer to current offset within the data * n = pointer to either zero or the next pre-read part of a surrogate pair. * The condition for having read the entire string is that the offset (*o) * is the number of bytes in the string, and the unichar pointed to by *n * is zero (meaning there is no second part of a surrogate pair remaining). */ static inline unichar nextUTF8(const uint8_t *p, unsigned l, unsigned *o, unichar *n) { unsigned i; /* If we still have the second part of a surrogate pair, return it. */ if (*n > 0) { unichar u = *n; *n = 0; return u; } if ((i = *o) < l) { uint8_t c = p[i]; uint32_t u = c; if (c > 0x7f) { int j, sle = 0; /* calculated the expected sequence length */ sle = UTF8_BYTE_COUNT(c); /* legal ? */ if (sle < 2) { [NSException raise: NSInvalidArgumentException format: @"bad multibyte character length"]; } if (sle + i > l) { [NSException raise: NSInvalidArgumentException format: @"multibyte character extends beyond data"]; } /* get the codepoint */ for (j = 1; j < sle; j++) { uint8_t b = p[i + j]; if (b < 0x80 || b >= 0xc0) break; u = (u << 6) | (b & 0x3f); } if (j < sle) { [NSException raise: NSInvalidArgumentException format: @"bad data in multibyte character"]; } u = u & ~(0xffffffff << ((5 * sle) + 1)); i += sle; /* * We discard invalid codepoints here. */ if (u > 0x10ffff) { [NSException raise: NSInvalidArgumentException format: @"invalid unicode codepoint"]; } } else { i++; } /* * Add codepoint as either a single unichar for BMP * or as a pair of surrogates for codepoints over 16 bits. */ if (u >= 0x10000) { unichar ul, uh; u -= 0x10000; ul = u & 0x3ff; uh = (u >> 10) & 0x3ff; *n = ul + 0xdc00; // record second part of pair u = uh + 0xd800; // return first part. } *o = i; // Return new index return (unichar)u; } [NSException raise: NSInvalidArgumentException format: @"no more data in UTF-8 string"]; return 0; } #endif static BOOL literalIsEqualInternal(NXConstantString *s, GSStr o) { #ifdef GNUSTEP_NEW_STRING_ABI if (s->nxcslen != o->_count) { return NO; } size_t end = s->nxcslen; static const int buffer_size = 64; unichar buffer1[buffer_size]; unichar buffer2[buffer_size]; NSRange r = { 0, buffer_size }; do { if (r.location + r.length > end) { r.length = s->nxcslen - r.location; } [s getCharacters: buffer1 range: r]; [o getCharacters: buffer2 range: r]; if (memcmp(buffer1, buffer2, r.length * sizeof(unichar)) != 0) { return NO; } r.location += buffer_size; } while (r.location < end); return YES; #else unsigned len = o->_count; /* Since UTF-8 is a multibyte character set, it must have at least * as many bytes as another string of the same length. So if the * UTF-8 string is shorter, the two cannot be equal. * A check for this can quickly give us a result in half the cases * where the two strings have different lengths. */ if (len > s->nxcslen) { return NO; } else { NSUInteger pos = 0; unichar n = 0; unsigned i = 0; unichar u; if (0 == o->_flags.wide) { /* If the other string is a buffer containing ascii characters, * we can perform a bytewise comparison. */ if (internalEncoding == NSASCIIStringEncoding) { if (len == s->nxcslen && 0 == memcmp(o->_contents.c, s->nxcsptr, len)) { return YES; } else { return NO; } } /* If the other string is a buffer containing latin1 characters, * we can compare buffer contents with unichar values directly. */ if (internalEncoding == NSISOLatin1StringEncoding) { while (i < s->nxcslen || n > 0) { u = nextUTF8((const uint8_t *)s->nxcsptr, s->nxcslen, &i, &n); if (pos >= len || (unichar)o->_contents.c[pos] != u) { return NO; } pos++; } if (pos != len) { return NO; } return YES; } /* For any other narrow internal string, we know that ascii is * a subset of the encoding, so as long as characters are ascii * (don't have the top bit set) we can do bytewise comparison. */ if (len == s->nxcslen) { unsigned index; for (index = 0; index < len; index++) { uint8_t c = s->nxcsptr[index]; if (c != o->_contents.c[index] || c >= 128) { /* Characters differ at this point. */ break; } } if (index == len) { return YES; } /* The characters were the same up to 'index', so we won't * need to recheck those first few characters. */ pos = i = index; } } /* For small strings, or ones where we already have an array of * UTF-16 characters, we can do a UTF-16 comparison directly. * For larger strings, we may do as well with a character by * character comparison. */ if (1 == o->_flags.wide || (len < 200 && pos < len)) { unichar *ptr; if (1 == o->_flags.wide) { ptr = o->_contents.u; } else { ptr = alloca(sizeof(unichar) * len); if (NO == GSToUnicode(&ptr, &len, o->_contents.c, len, internalEncoding, 0, 0)) { return NO; } } /* Now we have a UTF-16 buffer, so we can do a UTF-16 comparison. */ while (i < s->nxcslen || n > 0) { u = nextUTF8((const uint8_t *)s->nxcsptr, s->nxcslen, &i, &n); if (pos >= len || ptr[pos] != u) { return NO; } pos++; } } else { unichar (*imp)(id, SEL, NSUInteger); /* Do a character by character comparison using characterAtIndex: * This will be relatively slow, but how often will we actually * need to do this for a literal string? Most string literals will * either be short or will differ from any other string we are * doing a comparison with within the first few tens of characters. */ imp = (unichar(*)(id,SEL,NSUInteger))[(id)o methodForSelector: @selector(characterAtIndex:)]; while (i < s->nxcslen || n > 0) { u = nextUTF8((const uint8_t *)s->nxcsptr, s->nxcslen, &i, &n); if (pos >= len || (*imp)((id)o, @selector(characterAtIndex:), pos) != u) { return NO; } pos++; } } if (pos != len) { return NO; } return YES; } #endif } /* * GSPlaceholderString - placeholder class for objects awaiting intialisation. */ @interface GSPlaceholderString : NSString { NSZone *myZone; } @end /* GSString is the root class of our hierarchy of string classes. All our classes except GSPlaceholderString inherit from it. GSString provides the common part of the ivar layout. It also has safe implementations of all the memory management methods subclasses should override. Concrete subclasses of GSString are identified by two properties: how the string is encoded (its structure; 8-bit data or 16-bit unicode data), and how the memory for the contents is handled (its memory management). Two direct subclasses of GSString provide the code for the two structures. The memory management part of the concrete subclasses is abstracted to a single flag for the structure classes: free. This is set only if the _contents buffer is guaranteed to remain valid at least until the instance has been deallocated. Many optimizations, such as retaining instead of copying, and using pointers to another strings _contents buffer, are valid only if this flag is set. GSCString, an abstract class that stores the string as 8-bit data in the internal encoding. */ @interface GSCString : GSString { } @end /* And GSUnicodeString, an abstract class that stores the string as 16-bit unicode characters. */ @interface GSUnicodeString : GSString { } @end /* For each memory management scheme, there is a pair of concrete subclasses of the two abstract structure classes. Each subclass has a single -init... method which can be used to initialize that specific subclass. GS*BufferString, concrete subclasses that store the data in an external (wrt. the instance itself) buffer. The buffer may or may not be owned by the instance; the 'owned' flag indicates which. If it is set, we may need to free the buffer when we are deallocated. */ @interface GSCBufferString : GSCString { } @end @interface GSUnicodeBufferString : GSUnicodeString { } @end /* GS*InlineString, concrete subclasses that store the data immediately after the instance iself. */ @interface GSCInlineString : GSCString { } @end @interface GSUInlineString : GSUnicodeString { } @end /* GS*SubString, concrete subclasses that use the data in another string instance. */ @interface GSCSubString : GSCString { @public GSString *_parent; } @end @interface GSUnicodeSubString : GSUnicodeString { @public GSString *_parent; } @end /* * Include sequence handling code with instructions to generate search * and compare functions for NSString objects. */ #define GSEQ_STRCOMP strCompUsNs #define GSEQ_STRRANGE strRangeUsNs #define GSEQ_O GSEQ_NS #define GSEQ_S GSEQ_US #include "GSeq.h" #define GSEQ_STRCOMP strCompUsUs #define GSEQ_STRRANGE strRangeUsUs #define GSEQ_O GSEQ_US #define GSEQ_S GSEQ_US #include "GSeq.h" #define GSEQ_STRCOMP strCompUsCs #define GSEQ_STRRANGE strRangeUsCs #define GSEQ_O GSEQ_CS #define GSEQ_S GSEQ_US #include "GSeq.h" #define GSEQ_STRCOMP strCompCsNs #define GSEQ_STRRANGE strRangeCsNs #define GSEQ_O GSEQ_NS #define GSEQ_S GSEQ_CS #include "GSeq.h" #define GSEQ_STRCOMP strCompCsUs #define GSEQ_STRRANGE strRangeCsUs #define GSEQ_O GSEQ_US #define GSEQ_S GSEQ_CS #include "GSeq.h" #define GSEQ_STRCOMP strCompCsCs #define GSEQ_STRRANGE strRangeCsCs #define GSEQ_O GSEQ_CS #define GSEQ_S GSEQ_CS #include "GSeq.h" #define GSEQ_STRRANGE strRangeNsNs #define GSEQ_O GSEQ_NS #define GSEQ_S GSEQ_NS #include "GSeq.h" static Class NSDataClass = 0; static Class NSStringClass = 0; static Class GSStringClass = 0; static Class GSCStringClass = 0; static Class GSCBufferStringClass = 0; static Class GSCInlineStringClass = 0; static Class GSCSubStringClass = 0; static Class GSUnicodeStringClass = 0; static Class GSUnicodeBufferStringClass = 0; static Class GSUnicodeSubStringClass = 0; static Class GSUInlineStringClass = 0; static Class GSImmutableStringClass = 0; static Class GSMutableStringClass = 0; static Class NSConstantStringClass = 0; static SEL cMemberSel; static SEL convertSel; static BOOL (*convertImp)(id, SEL, NSStringEncoding); static SEL equalSel; static BOOL (*equalImp)(id, SEL, id); static SEL hashSel; static NSUInteger (*hashImp)(id, SEL); static Ivar immutableIvar; /* * The setup() function is called when any concrete string class is * initialized, and caches classes and some method implementations. */ static void setup(BOOL rerun) { static BOOL beenHere = NO; if (!beenHere || rerun) { beenHere = YES; caiSel = @selector(characterAtIndex:); gcrSel = @selector(getCharacters:range:); ranSel = @selector(rangeOfComposedCharacterSequenceAtIndex:); /* * Cache the default string encoding, and set the internal encoding * used by 8-bit character strings to match if possible. */ externalEncoding = GSPrivateDefaultCStringEncoding(); if (isByteEncoding(externalEncoding) == YES) { internalEncoding = externalEncoding; } /* * Cache pointers to classes to work round misfeature in * GNU compiler/runtime system where class lookup is very slow. */ NSDataClass = [NSData class]; NSStringClass = [NSString class]; GSStringClass = [GSString class]; GSCStringClass = [GSCString class]; GSUnicodeStringClass = [GSUnicodeString class]; GSCBufferStringClass = [GSCBufferString class]; GSUnicodeBufferStringClass = [GSUnicodeBufferString class]; GSCInlineStringClass = [GSCInlineString class]; GSUInlineStringClass = [GSUInlineString class]; GSCSubStringClass = [GSCSubString class]; GSUnicodeSubStringClass = [GSUnicodeSubString class]; GSMutableStringClass = [GSMutableString class]; NSConstantStringClass = [NXConstantString class]; /* This comes from the base additions library. The instance variable * pointing to the original mutable string is not public, but we want * to use it efficiently. */ GSImmutableStringClass = NSClassFromString(@"GSImmutableString"); immutableIvar = class_getInstanceVariable(GSImmutableStringClass, "_parent"); /* * Cache some selectors and method implementations for * cases where we want to use the implementation * provided in the abstract rolot cllass of the cluster. */ cMemberSel = @selector(characterIsMember:); convertSel = @selector(canBeConvertedToEncoding:); convertImp = (BOOL (*)(id, SEL, NSStringEncoding)) [NSStringClass instanceMethodForSelector: convertSel]; equalSel = @selector(isEqualToString:); equalImp = (BOOL (*)(id, SEL, id)) [NSStringClass instanceMethodForSelector: equalSel]; hashSel = @selector(hash); hashImp = (NSUInteger (*)(id, SEL)) [GSStringClass instanceMethodForSelector: hashSel]; caiSel = @selector(characterAtIndex:); gcrSel = @selector(getCharacters:range:); ranSel = @selector(rangeOfComposedCharacterSequenceAtIndex:); } } static GSCInlineString* newCInline(unsigned length, NSZone *zone) { GSCInlineString *me; me = (GSCInlineString*) NSAllocateObject(GSCInlineStringClass, length, zone); me->_contents.c = (unsigned char*) (((void*)me)+class_getInstanceSize(GSCInlineStringClass)); me->_count = length; me->_flags.wide = 0; me->_flags.owned = 1; // Ignored on dealloc, but means we own buffer return me; } static GSUInlineString* newUInline(unsigned length, NSZone *zone) { GSUInlineString *me; me = (GSUInlineString*) NSAllocateObject(GSUInlineStringClass, length*sizeof(unichar), zone); me->_contents.u = (unichar*) (((void*)me)+class_getInstanceSize(GSUInlineStringClass)); me->_count = length; me->_flags.wide = 1; me->_flags.owned = 1; // Ignored on dealloc, but means we own buffer return me; } @implementation NSString (RegressionTesting) /* This method is provided to enable regression tests to ensure they are * using an object whose internal representation is wide (unicode) text, * so that all the comparison operations between 8bit and 16bit strings * can be tested. */ - (NSString*) _unicodeString { GSUInlineString *o; unsigned i = [self length]; o = [newUInline(i, [self zone]) autorelease]; while (i-- > 0) { o->_contents.u[i] = [self characterAtIndex: i]; } return o; } @end /* Predeclare a few functions */ static void GSStrWiden(GSStr s); static void getCString_u(GSStr self, char *buffer, unsigned int maxLength, NSRange aRange, NSRange *leftoverRange); #if defined(OBJC_SMALL_OBJECT_SHIFT) && (OBJC_SMALL_OBJECT_SHIFT == 3) #define TINY_STRING_MASK 4 static BOOL useTinyStrings; /** * A GSTinyString is used on 64-bit platforms to store up to 8 ASCII (7-bit) * characters inside a pointer. Note that a mutable version of this class is * not possible, because modifying the string changes the pointer value. * The layout of a tiny string is as follows: struct { uintptr_t char0 :7; uintptr_t char1 :7; uintptr_t char2 :7; uintptr_t char3 :7; uintptr_t char4 :7; uintptr_t char5 :7; uintptr_t char6 :7; uintptr_t char7 :7; uintptr_t length :5; uintptr_t tag :3; }; */ #define TINY_STRING_CHAR(s, x) ((s & (0xFE00000000000000 >> (x*7))) >> (57-(x*7))) #define TINY_STRING_LENGTH_MASK 0x1f #define TINY_STRING_LENGTH_SHIFT OBJC_SMALL_OBJECT_SHIFT static BOOL tinyEqualToString(uintptr_t s, NSString *aString) { NSUInteger l; if ((NSString*)s == aString) { return YES; } if (nil == aString) { return NO; } l = (s >> TINY_STRING_LENGTH_SHIFT) & TINY_STRING_LENGTH_MASK; if ([aString length] != l) { return NO; } else if (l > 0) { unichar buf[8]; [aString getCharacters: buf range: NSMakeRange(0, l)]; while (l-- > 0) { if ((unichar)TINY_STRING_CHAR(s, l) != buf[l]) { return NO; } } } return YES; } @interface GSTinyString : NSString @end #ifdef GS_PROFILE_TINY_STRINGS static int tinyStrings = 0; static void logTinyStringCount(void) { fprintf(stderr, "%d tiny strings created\n", tinyStrings); } #endif static int tsbytes(uintptr_t s, char *buf) { int length = (s >> TINY_STRING_LENGTH_SHIFT) & TINY_STRING_LENGTH_MASK; int index; for (index = 0; index < length; index++) { buf[index] = (char)TINY_STRING_CHAR(s, index); } buf[index] = 0; return index; } @implementation GSTinyString - (BOOL) boolValue { char buf[9]; int count = tsbytes((uintptr_t)self, buf); int i; for (i = 0; i < count; i++) { char c = buf[i]; if (strchr("123456789yYtT", c) != 0) { return YES; } if (!isspace(c) && c != '0' && c != '-' && c != '+') { break; } } return NO; } - (unichar) characterAtIndex: (NSUInteger)anIndex { uintptr_t s = (uintptr_t)self; NSUInteger length = (s >> TINY_STRING_LENGTH_SHIFT) & TINY_STRING_LENGTH_MASK; if (anIndex >= length) { [NSException raise: NSInvalidArgumentException format: @"-characterAtIndex: index out of range"]; } // Implicit NULL terminator on slightly-too-long strings. if (anIndex == 8) { return '\0'; } return TINY_STRING_CHAR(s, anIndex); } - (void) getCharacters: (unichar*)buffer { uintptr_t s = (uintptr_t)self; int length = (s >> TINY_STRING_LENGTH_SHIFT) & TINY_STRING_LENGTH_MASK; int index; for (index = 0; index < length; index++) { buffer[index] = (unichar)TINY_STRING_CHAR(s, index); } } - (void) getCharacters: (unichar*)buffer range: (NSRange)aRange { uintptr_t s = (uintptr_t)self; int length = (s >> TINY_STRING_LENGTH_SHIFT) & TINY_STRING_LENGTH_MASK; int index; int offset; GS_RANGE_CHECK(aRange, length); length = NSMaxRange(aRange); offset = 0; for (index = aRange.location; index < length; index++) { buffer[offset++] = (unichar)TINY_STRING_CHAR(s, index); } } - (BOOL) getCString: (char*)buffer maxLength: (NSUInteger)maxLength encoding: (NSStringEncoding)encoding { uintptr_t s = (uintptr_t)self; int length = (s >> TINY_STRING_LENGTH_SHIFT) & TINY_STRING_LENGTH_MASK; int index; if (buffer == 0) { return NO; // Can't fit in here } if (NSUnicodeStringEncoding == encoding) { maxLength /= 2; if (maxLength > 1) { unichar *buf = (unichar*)(void*)buffer; BOOL result = (length < maxLength) ? YES : NO; if (maxLength <= length) { length = maxLength - 1; } for (index = 0; index < length; index++) { buf[index] = (unichar)TINY_STRING_CHAR(s, index); } buf[index] = 0; return result; } return NO; } else if (isByteEncoding(encoding)) { if (maxLength > 0) { BOOL result = (length < maxLength) ? YES : NO; if (maxLength <= length) { length = maxLength - 1; } for (index = 0; index < length; index++) { buffer[index] = (char)TINY_STRING_CHAR(s, index); } buffer[index] = 0; return result; } return NO; } return [super getCString: buffer maxLength: maxLength encoding: encoding]; } - (NSUInteger) hash { uintptr_t s = (uintptr_t)self; int length = (s >> TINY_STRING_LENGTH_SHIFT) & TINY_STRING_LENGTH_MASK; uint32_t ret = 0; if (length > 0) { unichar buf[10]; int index; for (index = 0; index < length; index++) { buf[index] = (char)TINY_STRING_CHAR(s, index); } ret = GSPrivateHash(0, buf, length * sizeof(unichar)); /* * The hash caching in our concrete string classes uses zero to denote * an empty cache value, so we MUST NOT return a hash of zero. */ ret &= 0x0fffffff; if (ret == 0) { ret = 0x0fffffff; } } else { ret = 0x0ffffffe; /* Hash for an empty string. */ } return ret; } - (int) intValue { char buf[9]; tsbytes((uintptr_t)self, buf); return strtol(buf, 0, 10); } - (NSInteger) integerValue { char buf[9]; tsbytes((uintptr_t)self, buf); #if GS_SIZEOF_VOIDP == GS_SIZEOF_LONG return strtol(buf, 0, 10); #else return strtoll(buf, 0, 10); #endif } - (BOOL) isEqualToString: (NSString*)aString { return tinyEqualToString((uintptr_t)self, aString); } - (NSUInteger) length { uintptr_t s = (uintptr_t)self; return (s >> TINY_STRING_LENGTH_SHIFT) & TINY_STRING_LENGTH_MASK; } - (long long) longLongValue { char buf[9]; tsbytes((uintptr_t)self, buf); return strtoll(buf, 0, 10); } - (id) mutableCopyWithZone: (NSZone*)z { uintptr_t s = (uintptr_t)self; NSUInteger i; NSUInteger l; GSMutableString *obj; char bytes[8]; l = (s >> TINY_STRING_LENGTH_SHIFT) & TINY_STRING_LENGTH_MASK; for (i = 0; i < l; i++) { bytes[i] = (unichar)TINY_STRING_CHAR(s, i); } obj = (GSMutableString*)NSAllocateObject(GSMutableStringClass, 0, z); obj = [obj initWithBytes: bytes length: l encoding: internalEncoding]; return obj; } - (NSRange) rangeOfComposedCharacterSequenceAtIndex: (NSUInteger)anIndex { uintptr_t s = (uintptr_t)self; NSUInteger l = (s >> TINY_STRING_LENGTH_SHIFT) & TINY_STRING_LENGTH_MASK; if (anIndex >= l) [NSException raise: NSRangeException format:@"Invalid location."]; return NSMakeRange(anIndex, 1); } - (NSUInteger) sizeOfContentExcluding: (NSHashTable*)exclude { return 0; // Tiny string uses no heap } - (NSUInteger) sizeOfInstance { return 0; // Tiny string uses no heap } - (const char*) UTF8String { char *buf = GSAutoreleasedBuffer(9); tsbytes((uintptr_t)self, buf); return buf; } + (void) load { useTinyStrings = objc_registerSmallObjectClass_np(self, TINY_STRING_MASK); #ifdef GS_PROFILE_TINY_STRINGS atexit(logTinyStringCount); #endif } + (id) alloc { return (id)TINY_STRING_MASK; } + (id) allocWithZone: (NSZone*)aZone { return (id)TINY_STRING_MASK; } - (id) copy { return self; } - (id) copyWithZone: (NSZone*)aZone { return self; } - (id) retain { return self; } - (NSUInteger) retainCount { return UINT_MAX; } - (id) autorelease { return self; } - (oneway void) release { return; } - (NSUInteger) sizeInBytesExcluding: (NSHashTable*)exclude { if (0 == NSHashGet(exclude, self)) { return 0; } return 8; } @end /** * Constructs a tiny string. */ static inline id createTinyString(const char *str, int length) { unsigned int i; uintptr_t s = TINY_STRING_MASK; /* No tiny string support detected at run time, give up */ if (!useTinyStrings) { return nil; } /* String too long to fit in a pointer, give up */ if (length > 9) { return nil; } /* String would fit if the last byte was an implicit 0, but it isn't. */ if ((length == 9) && str[8] != '\0') { return nil; } s |= length << TINY_STRING_LENGTH_SHIFT; for (i = 0 ; imyZone = z; return o; } + (void) initialize { setup(NO); } - (id) autorelease { NSWarnLog(@"-autorelease sent to uninitialised string"); return self; // placeholders never get released. } - (unichar) characterAtIndex: (NSUInteger)index { [NSException raise: NSInternalInconsistencyException format: @"attempt to use uninitialised string"]; return 0; } - (void) dealloc { NSLog(@"Warning ... attempt to deallocate instance of %@ in zone %p", NSStringFromClass([self class]), [self zone]); GSNOSUPERDEALLOC; // Placeholders never get deallocated. } /* * Replace self with an empty inline unicode string. */ - (id) init { return [self initWithBytes: 0 length: 0 encoding: internalEncoding]; } /* * Remove any BOM and perform byte swapping if required. */ static void fixBOM(unsigned char **bytes, NSUInteger*length, BOOL *owned, NSStringEncoding encoding) { unsigned char *b = *bytes; unsigned len = *length; if (encoding == NSUnicodeStringEncoding && *length >= 2 && ((b[0] == 0xFE && b[1] == 0xFF) || (b[0] == 0xFF && b[1] == 0xFE))) { // Got a byte order marker ... remove it. if (len == sizeof(unichar)) { if (*owned) { NSZoneFree(NSZoneFromPointer(b), b); *owned = NO; } *length = 0; *bytes = 0; } else { unsigned char *from = b; unsigned char *to; unichar u; // Got a byte order marker ... remove it. len -= sizeof(unichar); memcpy(&u, from, sizeof(unichar)); from += sizeof(unichar); to = NSAllocateCollectable(len, 0); if (u == 0xFEFF) { // Native byte order memcpy(to, from, len); } else { unsigned i; for (i = 0; i < len; i += 2) { to[i] = from[i+1]; to[i+1] = from[i]; } } if (*owned == YES) { NSZoneFree(NSZoneFromPointer(b), b); } else { *owned = YES; } *length = len; *bytes = to; } } else if (encoding == NSUTF8StringEncoding && len >= 3 && b[0] == 0xEF && b[1] == 0xBB && b[2] == 0xBF) { if (len == 3) { if (*owned) { NSZoneFree(NSZoneFromPointer(b), b); *owned = NO; } *length = 0; *bytes = 0; } else { unsigned char *from = b; unsigned char *to; // Got a byte order marker ... remove it. len -= 3; from += 3; to = NSAllocateCollectable(len, 0); memcpy(to, from, len); if (*owned == YES) { NSZoneFree(NSZoneFromPointer(b), b); } else { *owned = YES; } *length = len; *bytes = to; } } } - (id) initWithBytes: (const void*)bytes length: (NSUInteger)length encoding: (NSStringEncoding)encoding { const void *original; void *chars = 0; BOOL flag = NO; if (0 == length) { return (id)@""; } if (0 == bytes) { [NSException raise: NSInvalidArgumentException format: @"-initWithBytes:lenth:encoding given nul bytes"]; } #if defined(OBJC_SMALL_OBJECT_SHIFT) && (OBJC_SMALL_OBJECT_SHIFT == 3) if (useTinyStrings) { if (NSASCIIStringEncoding == encoding) { id tinyString = createTinyString(bytes, length); if (tinyString) { return tinyString; } } if (length < 9) { if (NSUTF8StringEncoding == encoding || GSPrivateIsByteEncoding(encoding)) { NSUInteger i; for (i = 0; i < length; i++) { if (((const char*)bytes)[i] & 0x80) { break; } } if (i == length) { id tinyString = createTinyString(bytes, length); if (tinyString) { return tinyString; } } } } } #endif original = bytes; fixBOM((unsigned char**)&bytes, &length, &flag, encoding); /* * We need to copy the data if there is any, unless fixBOM() * has already done it for us. */ if (original == bytes) { chars = NSZoneMalloc(myZone, length); memcpy(chars, bytes, length); } else { /* * The fixBOM() function has already copied the data and allocated * new memory, so we can just pass that to the designated initialiser */ chars = (void*)bytes; } return [self initWithBytesNoCopy: chars length: length encoding: encoding freeWhenDone: YES]; } - (id) initWithBytesNoCopy: (void*)bytes length: (NSUInteger)length encoding: (NSStringEncoding)encoding freeWhenDone: (BOOL)flag { GSCharPtr chars = { .u = 0 }; BOOL isASCII = NO; BOOL isLatin1 = NO; GSStr me; if (0 == length) { if (YES == flag && 0 != bytes) { NSZoneFree(NSZoneFromPointer(bytes), bytes); } return (id)@""; } if (0 == bytes) { [NSException raise: NSInvalidArgumentException format: @"-%@ given NULL pointer", NSStringFromSelector(_cmd)]; } fixBOM((unsigned char**)&bytes, &length, &flag, encoding); if (encoding == NSUnicodeStringEncoding) { chars.u = bytes; } else { chars.c = bytes; } if (encoding == NSUTF8StringEncoding || (encoding != internalEncoding && isByteEncoding(encoding) == YES)) { unsigned i; for (i = 0; i < length; i++) { if ((chars.c)[i] > 127) { if (encoding == NSASCIIStringEncoding) { if (flag == YES) { NSZoneFree(NSZoneFromPointer(chars.c), chars.c); } return nil; // Invalid data } break; } } if (i == length) { /* * This is actually ASCII data ... so we can just store it as if * in the internal 8bit encoding scheme. */ encoding = internalEncoding; } } if (encoding == internalEncoding) { me = (GSStr)NSAllocateObject(GSCBufferStringClass, 0, myZone); me->_contents.c = chars.c; me->_count = length; me->_flags.wide = 0; me->_flags.owned = flag; return (id)me; } /* * Any remaining encoding needs to be converted to UTF-16. */ if (encoding != NSUnicodeStringEncoding) { unichar *u = 0; unsigned l = 0; if (GSPrivateIsEncodingSupported(encoding) == NO) { if (flag == YES && bytes != 0) { NSZoneFree(NSZoneFromPointer(bytes), bytes); } return nil; // Invalid encoding } if (GSToUnicode(&u, &l, chars.c, length, encoding, myZone, 0) == NO) { if (flag == YES && chars.c != 0) { NSZoneFree(NSZoneFromPointer(chars.c), chars.c); } return nil; // Invalid data } if (flag == YES && chars.c != 0) { NSZoneFree(NSZoneFromPointer(chars.c), chars.c); } chars.u = u; length = l * sizeof(unichar); flag = YES; } length /= sizeof(unichar); if (GSUnicode(chars.u, length, &isASCII, &isLatin1) != length) { if (flag == YES && chars.u != 0) { NSZoneFree(NSZoneFromPointer(chars.u), chars.u); } return nil; // Invalid data } if (isASCII == YES || (internalEncoding == NSISOLatin1StringEncoding && isLatin1 == YES)) { me = (GSStr)newCInline(length, myZone); while (length-- > 0) { me->_contents.c[length] = chars.u[length]; } if (flag == YES && chars.u != 0) { NSZoneFree(NSZoneFromPointer(chars.u), chars.u); } } else { me = (GSStr)NSAllocateObject(GSUnicodeBufferStringClass, 0, myZone); me->_contents.u = chars.u; me->_count = length; me->_flags.wide = 1; me->_flags.owned = flag; } return (id)me; } - (id) initWithFormat: (NSString*)format locale: (NSDictionary*)locale arguments: (va_list)argList { GSStr f; unsigned char buf[2048]; unichar fbuf[1024]; unichar *fmt = fbuf; size_t len; GSStr me; if (NULL == format) [NSException raise: NSInvalidArgumentException format: @"[GSPlaceholderString-initWithFormat:locale:arguments:]: NULL format"]; /* * First we provide an array of unichar characters containing the * format string. For performance reasons we try to use an on-stack * buffer if the format string is small enough ... it almost always * will be. */ len = [format length]; if (len >= 1024) { fmt = NSZoneMalloc(NSDefaultMallocZone(), (len+1)*sizeof(unichar)); } [format getCharacters: fmt]; fmt[len] = '\0'; /* * Now set up 'f' as a GSMutableString object whose initial buffer is * allocated on the stack. The GSPrivateFormat function can write into it. */ f = (GSStr)alloca(class_getInstanceSize(GSMutableStringClass)); object_setClass(f, GSMutableStringClass); f->_zone = NSDefaultMallocZone(); f->_contents.c = buf; f->_capacity = sizeof(buf); f->_count = 0; f->_flags.wide = 0; f->_flags.owned = 0; GSPrivateFormat(f, fmt, argList, locale); if (fmt != fbuf) { NSZoneFree(NSDefaultMallocZone(), fmt); } /* * Don't use noCopy because f->_contents.u may be memory on the stack, * and even if it wasn't f->_capacity may be greater than f->_count so * we could be wasting quite a bit of space. Better to accept a * performance hit due to copying data (and allocating/deallocating * the temporary buffer) for large strings. For most strings, the * on-stack memory will have been used, so we will get better performance. */ if (f->_flags.wide == 1) { me = (GSStr)newUInline(f->_count, myZone); memcpy(me->_contents.u, f->_contents.u, f->_count*sizeof(unichar)); } else { me = (GSStr)newCInline(f->_count, myZone); memcpy(me->_contents.c, f->_contents.c, f->_count); } /* * If the string had to grow beyond the initial buffer size, we must * release any allocated memory. */ if (1 == f->_flags.owned) { NSZoneFree(f->_zone, f->_contents.c); } return (id)me; } /* * Replace self with an inline string matching the sort of information * given. */ - (id) initWithString: (NSString*)string { unsigned length; Class c; GSStr me; if (string == nil) [NSException raise: NSInvalidArgumentException format: @"GSPlaceholderString-initWithString: given nil string"]; if (NO == [string isKindOfClass: NSStringClass]) // may be proxy [NSException raise: NSInvalidArgumentException format: @"-initWithString: given non-string object"]; c = object_getClass(string); length = [string length]; if (GSObjCIsKindOf(c, GSCStringClass) == YES || (GSObjCIsKindOf(c, GSMutableStringClass) == YES && ((GSStr)string)->_flags.wide == 0)) { /* * For a GSCString subclass, or an 8-bit GSMutableString, * we can copy the bytes directly into an inline string. */ me = (GSStr)newCInline(length, myZone); memcpy(me->_contents.c, ((GSStr)string)->_contents.c, length); } else if (GSObjCIsKindOf(c, GSUnicodeStringClass) == YES || GSObjCIsKindOf(c, GSMutableStringClass) == YES) { /* * For a GSUnicodeString subclass, or a 16-bit GSMutableString, * we can copy the bytes directly into an inline string. */ me = (GSStr)newUInline(length, myZone); memcpy(me->_contents.u, ((GSStr)string)->_contents.u, length*sizeof(unichar)); } else { /* * For a string with an unknown class, we can initialise by * having the string copy its content directly into our buffer. */ me = (GSStr)newUInline(length, myZone); [string getCharacters: me->_contents.u]; } return (id)me; } - (id) initWithUTF8String: (const char*)bytes { const uint8_t *b = (const uint8_t*)bytes; BOOL ascii = YES; NSUInteger length; GSStr me; uint8_t c; if (NULL == bytes) [NSException raise: NSInvalidArgumentException format: @"[GSPlaceholderString-initWithUTF8String:]: NULL cString"]; /* Skip leading BOM */ if (b[0] == 0xEF && b[1] == 0xBB && b[2] == 0xBF) { b = &b[3]; } length = 0; while ((c = b[length])) { length++; if (c > 127) { ascii = NO; while (b[length]) { length++; } break; } } if (YES == ascii) { id o = createTinyString((const char*)b, length); if (nil == o) { me = (GSStr)newCInline(length, myZone); memcpy(me->_contents.c, b, length); o = (id)me; } return o; } else { unichar *u = 0; unsigned l = 0; if (GSToUnicode(&u, &l, b, length, NSUTF8StringEncoding, myZone, 0) == NO) { return nil; // Invalid data } me = (GSStr)NSAllocateObject(GSUnicodeBufferStringClass, 0, myZone); me->_contents.u = u; me->_count = l; me->_flags.wide = 1; me->_flags.owned = YES; } return (id)me; } - (NSUInteger) length { [NSException raise: NSInternalInconsistencyException format: @"attempt to use uninitialised string"]; return 0; } - (oneway void) release { return; // placeholders never get released. } - (id) retain { return self; // placeholders never get retained. } @end /* * The following inline functions are used by the concrete string classes * to implement their core functionality. * GSCString uses the functions with the _c suffix. * GSCSubString, GSCInlineString, GSCBufferString * inherit methods from GSCString. * GSUnicodeString uses the functions with the _u suffix. * GSUnicodeSubString, GSUInlineString, and GSUnicodeBufferString * inherit methods from GSUnicodeString. * GSMutableString uses all the functions, selecting the _c or _u versions * depending on whether its storage is 8-bit or 16-bit. * In addition, GSMutableString uses a few functions without a suffix that are * peculiar to its memory management (shrinking, growing, and converting). */ static inline const char* UTF8String_c(GSStr self) { unsigned char *r; if (self->_count == 0) { return ""; } if (internalEncoding == NSASCIIStringEncoding) { unsigned i = self->_count; r = (unsigned char*)GSAutoreleasedBuffer(self->_count+1); while (i-- > 0) { r[i] = self->_contents.c[i] & 0x7f; } r[self->_count] = '\0'; } else { unichar *u = 0; unsigned l = 0; unsigned s = 0; /* * We must convert from internal format to unicode and then to * UTF8 string encoding. */ if (GSToUnicode(&u, &l, self->_contents.c, self->_count, internalEncoding, NSDefaultMallocZone(), 0) == NO) { [NSException raise: NSCharacterConversionException format: @"Can't convert to Unicode string."]; } r = 0; if (GSFromUnicode((unsigned char**)&r, &s, u, l, NSUTF8StringEncoding, NSDefaultMallocZone(), GSUniTerminate|GSUniTemporary|GSUniStrict) == NO) { NSZoneFree(NSDefaultMallocZone(), u); [NSException raise: NSCharacterConversionException format: @"Can't convert from Unicode to UTF8."]; } NSZoneFree(NSDefaultMallocZone(), u); } return (const char*)r; } static inline const char* UTF8String_u(GSStr self) { unsigned c = self->_count; if (c == 0) { return ""; } else { unsigned int l = 0; unsigned char *r = 0; if (GSFromUnicode(&r, &l, self->_contents.u, c, NSUTF8StringEncoding, NSDefaultMallocZone(), GSUniTerminate|GSUniTemporary|GSUniStrict) == NO) { [NSException raise: NSCharacterConversionException format: @"Can't get UTF8 from Unicode string."]; } return (const char*)r; } } static inline BOOL boolValue_c(GSStr self) { unsigned count = self->_count; unsigned i; for (i = 0; i < count; i++) { char c = self->_contents.c[i]; if (strchr("123456789yYtT", c) != 0) { return YES; } if (!isspace(c) && c != '0' && c != '-' && c != '+') { break; } } return NO; } static inline BOOL boolValue_u(GSStr self) { unsigned count = self->_count; unsigned i; for (i = 0; i < count; i++) { unichar c = self->_contents.u[i]; if (c > 'y') { break; } if (strchr("123456789yYtT", c) != 0) { return YES; } if (!isspace(c) && c != '0' && c != '-' && c != '+') { break; } } return NO; } static inline void intBuf_c(GSStr self, char *buf) { unsigned c = self->_count; unsigned i = 0; unsigned j = 0; while (i < c && isspace(self->_contents.c[i])) { i++; } if (i < c) { char sign = self->_contents.c[i]; if ('+' == sign || '-' == sign) { buf[j++] = sign; i++; } } while (i < c && j < 20 && isdigit(self->_contents.c[i])) { buf[j++] = self->_contents.c[i++]; } buf[j] = '\0'; } static inline void intBuf_u(GSStr self, char *buf) { unsigned c = self->_count; unsigned i = 0; unsigned j = 0; while (i < c && isspace(self->_contents.u[i])) { i++; } if (i < c) { unichar sign = self->_contents.u[i]; if ('+' == sign || '-' == sign) { buf[j++] = (char)sign; i++; } } while (i < c && j < 20 && isdigit(self->_contents.u[i])) { buf[j++] = (char)self->_contents.u[i++]; } buf[j] = '\0'; } static inline BOOL canBeConvertedToEncoding_c(GSStr self, NSStringEncoding enc) { unsigned c = self->_count; BOOL result = YES; /* * If the length is zero, or we are already using the required encoding, * or the required encoding is unicode (can hold any character) then we * can assume that a conversion would succeed. * We also know a conversion must succeed if the internal encoding is * ascii and the required encoding has ascii as a subset. */ if (c > 0 && enc != internalEncoding && enc != NSUTF8StringEncoding && enc != NSUnicodeStringEncoding && ((internalEncoding != NSASCIIStringEncoding) || !isByteEncoding(enc))) { unsigned l = 0; unichar *r = 0; /* * To check whether conversion is possible, we first convert to * unicode and then check to see whether it is possible to convert * to the desired encoding. */ result = GSToUnicode(&r, &l, self->_contents.c, self->_count, internalEncoding, NSDefaultMallocZone(), GSUniStrict); if (result == YES) { if (enc == NSISOLatin1StringEncoding) { unsigned i; /* * If all the unicode characters are in the 0 to 255 range * they are all latin1. */ for (i = 0; i < l; i++) { if (r[i] > 255) { result = NO; break; } } } else if (enc == NSASCIIStringEncoding) { unsigned i; /* * If all the unicode characters are in the 0 to 127 range * they are all ascii. */ for (i = 0; i < l; i++) { if (r[i] > 127) { result = NO; break; } } } else { unsigned dummy = 0; // Hold returned length. result = GSFromUnicode(0, &dummy, r, l, enc, 0, GSUniStrict); } // Temporary unicode string no longer needed. NSZoneFree(NSDefaultMallocZone(), r); } } return result; } static inline BOOL canBeConvertedToEncoding_u(GSStr self, NSStringEncoding enc) { unsigned c = self->_count; BOOL result = YES; if (c > 0) { if (enc == NSUTF8StringEncoding || enc == NSUnicodeStringEncoding) { if (GSUnicode(self->_contents.u, c, 0, 0) != c) { return NO; } } else { if (enc == NSISOLatin1StringEncoding) { unsigned i; /* * If all the unicode characters are in the 0 to 255 range * they are all latin1. */ for (i = 0; i < self->_count; i++) { if (self->_contents.u[i] > 255) { result = NO; break; } } } else if (enc == NSASCIIStringEncoding) { unsigned i; /* * If all the unicode characters are in the 0 to 127 range * they are all ascii. */ for (i = 0; i < self->_count; i++) { if (self->_contents.u[i] > 127) { result = NO; break; } } } else { unsigned dummy = 0; // Hold returned length. result = GSFromUnicode(0, &dummy, self->_contents.u, c, enc, 0, GSUniStrict); } } } return result; } static inline unichar characterAtIndex_c(GSStr self, unsigned index) { unichar u; if (index >= self->_count) [NSException raise: NSRangeException format: @"Invalid index."]; u = self->_contents.c[index]; if (u > 127) { unsigned char c = (unsigned char)u; unsigned int s = 1; unichar *d = &u; if (GSToUnicode(&d, &s, &c, 1, internalEncoding, 0, 0) == NO) { [NSException raise: NSInternalInconsistencyException format: @"unable to convert character to unicode"]; } } return u; } static inline unichar characterAtIndex_u(GSStr self,unsigned index) { if (index >= self->_count) [NSException raise: NSRangeException format: @"Invalid index."]; return self->_contents.u[index]; } static inline NSComparisonResult compare_c(GSStr self, NSString *aString, unsigned mask, NSRange aRange) { Class c; c = object_getClass(aString); if (GSObjCIsKindOf(c, GSUnicodeStringClass) == YES || (c == GSMutableStringClass && ((GSStr)aString)->_flags.wide == 1)) return strCompCsUs((id)self, aString, mask, aRange); else if (GSObjCIsKindOf(c, GSCStringClass) == YES || (c == GSMutableStringClass && ((GSStr)aString)->_flags.wide == 0)) return strCompCsCs((id)self, aString, mask, aRange); else return strCompCsNs((id)self, aString, mask, aRange); } static inline NSComparisonResult compare_u(GSStr self, NSString *aString, unsigned mask, NSRange aRange) { Class c; c = object_getClass(aString); if (GSObjCIsKindOf(c, GSUnicodeStringClass) || (c == GSMutableStringClass && ((GSStr)aString)->_flags.wide == 1)) return strCompUsUs((id)self, aString, mask, aRange); else if (GSObjCIsKindOf(c, GSCStringClass) || (c == GSMutableStringClass && ((GSStr)aString)->_flags.wide == 0)) return strCompUsCs((id)self, aString, mask, aRange); else return strCompUsNs((id)self, aString, mask, aRange); } static inline const char* cString_c(GSStr self, NSStringEncoding enc) { unsigned char *r = 0; if (self->_count == 0) { return "\0"; } else if (enc == internalEncoding) { r = (unsigned char*)GSAutoreleasedBuffer(self->_count+1); if (self->_count > 0) { memcpy(r, self->_contents.c, self->_count); } r[self->_count] = '\0'; } else if (enc == NSUnicodeStringEncoding) { unsigned l = 0; /* * The external C string encoding is unicode ... convert to it. */ if (GSToUnicode((unichar**)&r, &l, self->_contents.c, self->_count, internalEncoding, NSDefaultMallocZone(), GSUniTerminate|GSUniTemporary|GSUniStrict) == NO) { [NSException raise: NSCharacterConversionException format: @"Can't convert to Unicode string."]; } } else { unichar *u = 0; unsigned l = 0; unsigned s = 0; /* * The external C string encoding is not compatible with the internal * 8-bit character strings ... we must convert from internal format to * unicode and then to the external C string encoding. */ if (GSToUnicode(&u, &l, self->_contents.c, self->_count, internalEncoding, NSDefaultMallocZone(), 0) == NO) { [NSException raise: NSCharacterConversionException format: @"Can't convert to Unicode string."]; } if (GSFromUnicode((unsigned char**)&r, &s, u, l, enc, NSDefaultMallocZone(), GSUniTerminate|GSUniTemporary|GSUniStrict) == NO) { NSZoneFree(NSDefaultMallocZone(), u); [NSException raise: NSCharacterConversionException format: @"Can't convert from Unicode string."]; } NSZoneFree(NSDefaultMallocZone(), u); } return (const char*)r; } static inline const char* cString_u(GSStr self, NSStringEncoding enc) { unsigned c = self->_count; if (c == 0) { return "\0"; } else if (enc == NSUnicodeStringEncoding) { unichar *tmp; unsigned l; if ((l = GSUnicode(self->_contents.u, c, 0, 0)) != c) { [NSException raise: NSCharacterConversionException format: @"NSString is not legal UTF-16 at %u", l]; } tmp = (unichar*)NSZoneMalloc(NSDefaultMallocZone(), (c + 1)*2); memcpy(tmp, self->_contents.u, c*2); tmp[c] = 0; [NSDataClass dataWithBytesNoCopy: tmp length: (c + 1)*2 freeWhenDone: YES]; return (const char*)tmp; } else { unsigned int l = 0; unsigned char *r = 0; if (GSFromUnicode(&r, &l, self->_contents.u, c, enc, NSDefaultMallocZone(), GSUniTerminate|GSUniTemporary|GSUniStrict) == NO) { [NSException raise: NSCharacterConversionException format: @"Can't get cString from Unicode string."]; } return (const char*)r; } } static inline unsigned int cStringLength_c(GSStr self, NSStringEncoding enc) { if (enc == internalEncoding) { return self->_count; } else { /* * The external C string encoding is not compatible with the internal * 8-bit character strings ... we must convert from internal format to * unicode and then to the external C string encoding. */ if (self->_count == 0) { return 0; } else { unichar *u = 0; unsigned l = 0; unsigned s = 0; if (GSToUnicode(&u, &l, self->_contents.c, self->_count, internalEncoding, NSDefaultMallocZone(), 0) == NO) { [NSException raise: NSCharacterConversionException format: @"Can't convert to/from Unicode string."]; } if (GSFromUnicode(0, &s, u, l, enc, 0, GSUniStrict) == NO) { NSZoneFree(NSDefaultMallocZone(), u); [NSException raise: NSCharacterConversionException format: @"Can't get cStringLength from string."]; } NSZoneFree(NSDefaultMallocZone(), u); return s; } } } static inline unsigned int cStringLength_u(GSStr self, NSStringEncoding enc) { unsigned c = self->_count; if (c == 0) { return 0; } else { unsigned l = 0; if (GSFromUnicode(0, &l, self->_contents.u, c, enc, 0, GSUniStrict) == NO) { [NSException raise: NSCharacterConversionException format: @"Can't get cStringLength from Unicode string."]; } return l; } } static inline void fillHole(GSStr self, unsigned index, unsigned size) { NSCAssert(size > 0, @"size <= zero"); NSCAssert(index + size <= self->_count, @"index + size > length"); self->_count -= size; if (self->_flags.wide == 1) { memmove(self->_contents.u + index, self->_contents.u + index + size, sizeof(unichar)*(self->_count - index)); } else { memmove(self->_contents.c + index, self->_contents.c + index + size, (self->_count - index)); } self->_flags.hash = 0; } static inline void getCharacters_c(GSStr self, unichar *buffer, NSRange aRange) { if (aRange.length) { if (NSISOLatin1StringEncoding == internalEncoding) { register NSUInteger count = aRange.length; register NSUInteger base = aRange.location; while (count-- > 0) { buffer[count] = self->_contents.c[base + count]; } } else { unsigned len = aRange.length; if (!GSToUnicode(&buffer, &len, self->_contents.c + aRange.location, aRange.length, internalEncoding, 0, 0)) { [NSException raise: NSInternalInconsistencyException format: @"Can't convert to Unicode."]; } } } } static inline void getCharacters_u(GSStr self, unichar *buffer, NSRange aRange) { memcpy(buffer, self->_contents.u + aRange.location, aRange.length*sizeof(unichar)); } static void getCString_c(GSStr self, char *buffer, unsigned int maxLength, NSRange aRange, NSRange *leftoverRange) { GSMutableString *o; int len; if (maxLength > self->_count) { maxLength = self->_count; } if (maxLength < aRange.length) { len = maxLength; if (leftoverRange != 0) { leftoverRange->location = aRange.location + maxLength; leftoverRange->length = aRange.length - maxLength; } } else { len = aRange.length; if (leftoverRange != 0) { leftoverRange->location = 0; leftoverRange->length = 0; } } if (externalEncoding == internalEncoding) { memcpy(buffer, &self->_contents.c[aRange.location], len); buffer[len] = '\0'; return; } if (isByteEncoding(internalEncoding)) { if (externalEncoding == NSUTF8StringEncoding || isByteEncoding(externalEncoding)) { const unsigned char *ptr = self->_contents.c + aRange.location; unsigned i; /* * Maybe we actually contain ascii data, which can be * copied out directly. */ for (i = 0; i < len; i++) { unsigned char c = ptr[i]; if (c > 127) { break; } buffer[i] = c; } if (i == len) { buffer[i] = '\0'; return; } } } /* As the internal and external encodings don't match, the simplest * thing to do is widen the internal data to unicode and use the * unicode function to get the cString. */ o = (GSMutableString*)alloca(class_getInstanceSize(GSMutableStringClass)); object_setClass(o, GSMutableStringClass); o->_count = self->_count; o->_flags.wide = 0; o->_flags.owned = 0; o->_flags.unused = 0; o->_flags.hash = 0; o->_capacity = self->_count; o->_contents.c = self->_contents.c; o->_zone = NSDefaultMallocZone(); GSStrWiden(o); getCString_u(o, buffer, maxLength, aRange, leftoverRange); if (o->_flags.owned == 1) { NSZoneFree(o->_zone, o->_contents.u); } } static void getCString_u(GSStr self, char *buffer, unsigned int maxLength, NSRange aRange, NSRange *leftoverRange) { /* The primitive we have for converting from unicode, GSFromUnicode, can't deal with our leftoverRange case, so we need to use a bit of complexity instead. */ unsigned int len; /* TODO: this is an extremely ugly hack to work around buggy iconvs that return -1/E2BIG for buffers larger than 0x40000acf */ if (maxLength > 0x40000000) maxLength = 0x40000000; /* First, try converting the whole thing. */ len = maxLength; if (GSFromUnicode((unsigned char **)&buffer, &len, self->_contents.u + aRange.location, aRange.length, externalEncoding, 0, GSUniTerminate | GSUniStrict) == YES) { if (leftoverRange) leftoverRange->location = leftoverRange->length = 0; return; } /* The conversion failed. Either the buffer is too small for the whole range, or there are characters in it we can't convert. Check for unconvertable characters first. */ len = 0; if (GSFromUnicode(NULL, &len, self->_contents.u + aRange.location, aRange.length, externalEncoding, 0, GSUniTerminate | GSUniStrict) == NO) { [NSException raise: NSCharacterConversionException format: @"Can't get cString from Unicode string."]; return; } /* The string can be converted, but not all of it. Do a binary search to find the longest subrange that fits in the buffer. */ { unsigned int lo, hi, mid; lo = 0; hi = aRange.length; while (lo < hi) { mid = (lo + hi + 1) / 2; /* round up to get edge case right */ len = maxLength; if (GSFromUnicode((unsigned char **)&buffer, &len, self->_contents.u + aRange.location, mid, externalEncoding, 0, GSUniTerminate | GSUniStrict) == YES) { lo = mid; } else { hi = mid - 1; } } /* lo==hi characters fit. Do the real conversion. */ len = maxLength; if (lo == 0) { buffer[0] = 0; } else if (GSFromUnicode((unsigned char **)&buffer, &len, self->_contents.u + aRange.location, lo, externalEncoding, 0, GSUniTerminate | GSUniStrict) == NO) { NSCAssert(NO, @"binary search gave inconsistent results"); } if (leftoverRange) { leftoverRange->location = aRange.location + lo; leftoverRange->length = NSMaxRange(aRange) - leftoverRange->location; } } } static inline BOOL getCStringE_c(GSStr self, char *buffer, unsigned int maxLength, NSStringEncoding enc) { if (buffer == 0) { return NO; // Can't fit in here } if (enc == NSUnicodeStringEncoding) { if (maxLength >= sizeof(unichar)) { unsigned bytes = maxLength - sizeof(unichar); unichar *u = (unichar*)(void*)buffer; if (GSToUnicode(&u, &bytes, self->_contents.c, self->_count, internalEncoding, NSDefaultMallocZone(), GSUniTerminate) == NO) { [NSException raise: NSCharacterConversionException format: @"Can't convert to Unicode string."]; } if (u == (unichar*)(void*)buffer) { return YES; } NSZoneFree(NSDefaultMallocZone(), u); } return NO; } else { if (maxLength > sizeof(char)) { unsigned bytes = maxLength - sizeof(char); if (enc == internalEncoding) { if (bytes > self->_count) { bytes = self->_count; } memcpy(buffer, self->_contents.c, bytes); buffer[bytes] = '\0'; if (bytes < self->_count) { return NO; } return YES; } if (enc == NSUTF8StringEncoding && isByteEncoding(internalEncoding)) { unsigned i; /* * Maybe we actually contain ascii data, which can be * copied out directly as a utf-8 string. */ if (bytes > self->_count) { bytes = self->_count; } for (i = 0; i < bytes; i++) { unsigned char c = self->_contents.c[i]; if (c > 127) { break; } buffer[i] = c; } if (i == bytes) { buffer[bytes] = '\0'; if (bytes < self->_count) { return NO; } return YES; } } if (enc == NSASCIIStringEncoding && isByteEncoding(internalEncoding)) { unsigned i; if (bytes > self->_count) { bytes = self->_count; } for (i = 0; i < bytes; i++) { unsigned char c = self->_contents.c[i]; if (c > 127) { [NSException raise: NSCharacterConversionException format: @"unable to convert to encoding"]; } buffer[i] = c; } buffer[bytes] = '\0'; if (bytes < self->_count) { return NO; } return YES; } else { unichar *u = 0; unsigned char *c = (unsigned char*)buffer; unsigned l = 0; /* * The specified C string encoding is not compatible with * the internal 8-bit character strings ... we must convert * from internal format to unicode and then to the specified * C string encoding. */ bytes = maxLength - sizeof(char); if (GSToUnicode(&u, &l, self->_contents.c, self->_count, internalEncoding, NSDefaultMallocZone(), 0) == NO) { [NSException raise: NSCharacterConversionException format: @"Can't convert to Unicode string."]; } if (GSFromUnicode((unsigned char**)&c, &bytes, u, l, enc, 0, GSUniTerminate|GSUniStrict) == NO) { c = 0; // Unable to convert } NSZoneFree(NSDefaultMallocZone(), u); if (c == (unsigned char*)buffer) { return YES; // Fitted in original buffer } else if (c != 0) { NSZoneFree(NSDefaultMallocZone(), c); } } } return NO; } } static inline BOOL getCStringE_u(GSStr self, char *buffer, unsigned int maxLength, NSStringEncoding enc) { if (enc == NSUnicodeStringEncoding) { if (maxLength >= sizeof(unichar)) { unsigned bytes = maxLength - sizeof(unichar); if (bytes/sizeof(unichar) > self->_count) { bytes = self->_count * sizeof(unichar); } memcpy(buffer, self->_contents.u, bytes); buffer[bytes] = '\0'; buffer[bytes + 1] = '\0'; if (bytes/sizeof(unichar) == self->_count) { return YES; } } return NO; } else { if (maxLength >= 1) { if (enc == NSISOLatin1StringEncoding) { unsigned bytes = maxLength - sizeof(char); unsigned i; if (bytes > self->_count) { bytes = self->_count; } for (i = 0; i < bytes; i++) { unichar u = self->_contents.u[i]; if (u & 0xff00) { [NSException raise: NSCharacterConversionException format: @"unable to convert to encoding"]; } buffer[i] = (char)u; } buffer[i] = '\0'; if (bytes == self->_count) { return YES; } } else if (enc == NSASCIIStringEncoding) { unsigned bytes = maxLength - sizeof(char); unsigned i; if (bytes > self->_count) { bytes = self->_count; } for (i = 0; i < bytes; i++) { unichar u = self->_contents.u[i]; if (u & 0xff80) { [NSException raise: NSCharacterConversionException format: @"unable to convert to encoding"]; } buffer[i] = (char)u; } buffer[i] = '\0'; if (bytes == self->_count) { return YES; } } else { unsigned char *c = (unsigned char*)buffer; if (GSFromUnicode((unsigned char**)&c, &maxLength, self->_contents.u, self->_count, enc, 0, GSUniTerminate|GSUniStrict) == NO) { return NO; } return YES; } } return NO; } } static inline BOOL isEqual_c(GSStr self, id anObject) { Class c; if (anObject == (id)self) { return YES; } if (anObject == nil) { return NO; } c = object_getClass(anObject); if (class_isMetaClass(c) == YES) { return NO; } if (c == NSConstantStringClass) { return literalIsEqualInternal((NXConstantString*)anObject, (GSStr)self); } if (c == GSMutableStringClass || GSObjCIsKindOf(c, GSStringClass) == YES) { GSStr other = (GSStr)anObject; NSRange r = {0, self->_count}; /* First see if the hash is the same - if not, we can't be equal. * However, it's not worth calculating hashes unless the strings * are fairly long. */ if (self->_count > 15) { if (self->_flags.hash == 0) self->_flags.hash = (*hashImp)((id)self, hashSel); if (other->_flags.hash == 0) other->_flags.hash = (*hashImp)((id)other, hashSel); if (self->_flags.hash != other->_flags.hash) return NO; } else if (self->_flags.hash && other->_flags.hash) { if (self->_flags.hash != other->_flags.hash) return NO; } /* * Do a compare depending on the type of the other string. */ if (other->_flags.wide == 1) { if (strCompCsUs((id)self, (id)other, 0, r) == NSOrderedSame) return YES; } else { if (other->_count == self->_count && memcmp(other->_contents.c, self->_contents.c, self->_count) == 0) return YES; } return NO; } else if (YES == [anObject isKindOfClass: NSStringClass]) // may be proxy { return (*equalImp)((id)self, equalSel, anObject); } else { return NO; } } static inline BOOL isEqual_u(GSStr self, id anObject) { Class c; if (anObject == (id)self) { return YES; } if (anObject == nil) { return NO; } c = object_getClass(anObject); if (class_isMetaClass(c) == YES) { return NO; } if (c == NSConstantStringClass) { return literalIsEqualInternal((NXConstantString*)anObject, (GSStr)self); } if (c == GSMutableStringClass || GSObjCIsKindOf(c, GSStringClass) == YES) { GSStr other = (GSStr)anObject; NSRange r = {0, self->_count}; /* First see if the hash is the same - if not, we can't be equal. * However, it's not worth calculating hashes unless the strings * are fairly long. */ if (self->_count > 15) { if (self->_flags.hash == 0) self->_flags.hash = (*hashImp)((id)self, hashSel); if (other->_flags.hash == 0) other->_flags.hash = (*hashImp)((id)other, hashSel); if (self->_flags.hash != other->_flags.hash) return NO; } else if (self->_flags.hash && other->_flags.hash) { if (self->_flags.hash != other->_flags.hash) return NO; } /* * Do a compare depending on the type of the other string. */ if (other->_flags.wide == 1) { if (strCompUsUs((id)self, (id)other, 0, r) == NSOrderedSame) return YES; } else { if (strCompUsCs((id)self, (id)other, 0, r) == NSOrderedSame) return YES; } return NO; } else if (YES == [anObject isKindOfClass: NSStringClass]) // may be proxy { return (*equalImp)((id)self, equalSel, anObject); } else { return NO; } } static inline const char* lossyCString_c(GSStr self) { char *r; if (self->_count == 0) { return ""; } if (externalEncoding == internalEncoding) { r = (char*)GSAutoreleasedBuffer(self->_count+1); if (self->_count > 0) { memcpy(r, self->_contents.c, self->_count); } r[self->_count] = '\0'; } else { unichar *u = 0; unsigned l = 0; unsigned s = 0; /* * The external C string encoding is not compatible with the internal * 8-bit character strings ... we must convert from internal format to * unicode and then to the external C string encoding. */ if (GSToUnicode(&u, &l, self->_contents.c, self->_count, internalEncoding, NSDefaultMallocZone(), 0) == NO) { [NSException raise: NSCharacterConversionException format: @"Can't convert to/from Unicode string."]; } if (GSFromUnicode((unsigned char**)&r, &s, u, l, externalEncoding, NSDefaultMallocZone(), GSUniTerminate|GSUniTemporary) == NO) { NSZoneFree(NSDefaultMallocZone(), u); [NSException raise: NSCharacterConversionException format: @"Can't convert to/from Unicode string."]; } NSZoneFree(NSDefaultMallocZone(), u); } return r; } static inline const char* lossyCString_u(GSStr self) { unsigned l = 0; unsigned char *r = 0; (void)GSFromUnicode(&r, &l, self->_contents.u, self->_count, externalEncoding, NSDefaultMallocZone(), GSUniTemporary|GSUniTerminate); return (const char*)r; } static void GSStrMakeSpace(GSStr s, unsigned size) { unsigned want; want = size + s->_count + 1; s->_capacity += s->_capacity/2; if (want > s->_capacity) { s->_capacity = want; } if (s->_flags.owned == 1) { /* * If we own the character buffer, we can simply realloc. */ if (s->_flags.wide == 1) { s->_contents.u = NSZoneRealloc(s->_zone, s->_contents.u, s->_capacity*sizeof(unichar)); } else { s->_contents.c = NSZoneRealloc(s->_zone, s->_contents.c, s->_capacity); } } else { /* * If the initial data was not to be freed, we must allocate new * buffer, copy the data, and set up the zone we are using. */ if (s->_zone == 0) { s->_zone = [(NSString*)s zone]; } if (s->_flags.wide == 1) { unichar *tmp = s->_contents.u; s->_contents.u = NSZoneMalloc(s->_zone, s->_capacity*sizeof(unichar)); if (s->_count > 0) { memcpy(s->_contents.u, tmp, s->_count*sizeof(unichar)); } } else { unsigned char *tmp = s->_contents.c; s->_contents.c = NSZoneMalloc(s->_zone, s->_capacity); if (s->_count > 0) { memcpy(s->_contents.c, tmp, s->_count); } } s->_flags.owned = 1; } } static void GSStrWiden(GSStr s) { unichar *tmp = 0; unsigned len = 0; NSCAssert(s->_flags.wide == 0, @"string is not wide"); /* * As a special case, where we are ascii or latin1 and the buffer size * is big enough, we can widen to unicode without having to allocate * more memory or call a character conversion function. */ if (s->_count <= s->_capacity / 2) { if (internalEncoding == NSISOLatin1StringEncoding || internalEncoding == NSASCIIStringEncoding) { len = s->_count; while (len-- > 0) { s->_contents.u[len] = s->_contents.c[len]; } s->_capacity /= 2; s->_flags.wide = 1; return; } } if (!s->_zone) { s->_zone = [(NSString*)s zone]; } if (!GSToUnicode(&tmp, &len, s->_contents.c, s->_count, internalEncoding, s->_zone, 0)) { [NSException raise: NSInternalInconsistencyException format: @"widen of string failed"]; } if (s->_flags.owned == 1) { NSZoneFree(s->_zone, s->_contents.c); } else { s->_flags.owned = 1; } s->_contents.u = tmp; s->_flags.wide = 1; s->_count = len; s->_capacity = len; } static inline void makeHole(GSStr self, unsigned int index, unsigned int size) { NSCAssert(size > 0, @"size < zero"); NSCAssert(index <= self->_count, @"index > length"); if (self->_count + size + 1 >= self->_capacity) { GSStrMakeSpace((GSStr)self, size); } if (index < self->_count) { if (self->_flags.wide == 1) { memmove(self->_contents.u + index + size, self->_contents.u + index, sizeof(unichar)*(self->_count - index)); } else { memmove(self->_contents.c + index + size, self->_contents.c + index, (self->_count - index)); } } self->_count += size; self->_flags.hash = 0; } static inline NSRange rangeOfSequence_c(GSStr self, unsigned anIndex) { if (anIndex >= self->_count) [NSException raise: NSRangeException format:@"Invalid location."]; return (NSRange){anIndex, 1}; } static inline NSRange rangeOfSequence_u(GSStr self, unsigned anIndex) { unsigned start; unsigned end; if (anIndex >= self->_count) [NSException raise: NSRangeException format:@"Invalid location."]; start = anIndex; while (uni_isnonsp(self->_contents.u[start]) && start > 0) start--; end = start + 1; if (end < self->_count) while ((end < self->_count) && (uni_isnonsp(self->_contents.u[end]))) end++; return (NSRange){start, end-start}; } static inline NSRange rangeOfCharacter_c(GSStr self, NSCharacterSet *aSet, unsigned mask, NSRange aRange) { int i; int start; int stop; int step; NSRange range; BOOL (*mImp)(id, SEL, unichar); if (aSet == nil) [NSException raise: NSInvalidArgumentException format: @"range of nil"]; if ((mask & NSBackwardsSearch) == NSBackwardsSearch) { start = NSMaxRange(aRange) - 1; stop = aRange.location - 1; step = -1; } else { start = aRange.location; stop = NSMaxRange(aRange); step = 1; } range.location = NSNotFound; range.length = 0; mImp = (BOOL(*)(id,SEL,unichar)) [aSet methodForSelector: cMemberSel]; for (i = start; i != stop; i += step) { unichar u = self->_contents.c[i]; if (u > 127 && internalEncoding != NSISOLatin1StringEncoding) { unsigned char c = (unsigned char)u; unsigned int s = 1; unichar *d = &u; if (GSToUnicode(&d, &s, &c, 1, internalEncoding, 0, 0) == NO) { [NSException raise: NSInternalInconsistencyException format: @"unable to convert character to unicode"]; } } /* FIXME ... what about UTF-16 sequences of more than one 16bit value * corresponding to a single UCS-32 codepoint? */ if ((*mImp)(aSet, cMemberSel, u)) { range = NSMakeRange(i, 1); break; } } return range; } static inline NSRange rangeOfCharacter_u(GSStr self, NSCharacterSet *aSet, unsigned mask, NSRange aRange) { int i; int start; int stop; int step; NSRange range; BOOL (*mImp)(id, SEL, unichar); if (aSet == nil) [NSException raise: NSInvalidArgumentException format: @"range of nil"]; if ((mask & NSBackwardsSearch) == NSBackwardsSearch) { start = NSMaxRange(aRange) - 1; stop = aRange.location - 1; step = -1; } else { start = aRange.location; stop = NSMaxRange(aRange); step = 1; } range.location = NSNotFound; range.length = 0; mImp = (BOOL(*)(id,SEL,unichar)) [aSet methodForSelector: cMemberSel]; /* FIXME ... what about UTF-16 sequences of more than one 16bit value * corresponding to a single UCS-32 codepoint? */ for (i = start; i != stop; i += step) { unichar letter = self->_contents.u[i]; if ((*mImp)(aSet, cMemberSel, letter)) { range = NSMakeRange(i, 1); break; } } return range; } GSRSFunc GSPrivateRangeOfString(NSString *receiver, NSString *target) { Class c; c = object_getClass(receiver); if (GSObjCIsKindOf(c, GSUnicodeStringClass) == YES || (c == GSMutableStringClass && ((GSStr)receiver)->_flags.wide == 1)) { c = object_getClass(target); if (GSObjCIsKindOf(c, GSUnicodeStringClass) == YES || (c == GSMutableStringClass && ((GSStr)target)->_flags.wide == 1)) return (GSRSFunc)strRangeUsUs; else if (GSObjCIsKindOf(c, GSCStringClass) == YES || (c == GSMutableStringClass && ((GSStr)target)->_flags.wide == 0)) return (GSRSFunc)strRangeUsCs; else return (GSRSFunc)strRangeUsNs; } else if (GSObjCIsKindOf(c, GSCStringClass) == YES || (c == GSMutableStringClass && ((GSStr)receiver)->_flags.wide == 0)) { c = object_getClass(target); if (GSObjCIsKindOf(c, GSUnicodeStringClass) == YES || (c == GSMutableStringClass && ((GSStr)target)->_flags.wide == 1)) return (GSRSFunc)strRangeCsUs; else if (GSObjCIsKindOf(c, GSCStringClass) == YES || (c == GSMutableStringClass && ((GSStr)target)->_flags.wide == 0)) return (GSRSFunc)strRangeCsCs; else return (GSRSFunc)strRangeCsNs; } else { return (GSRSFunc)strRangeNsNs; } } static inline NSString* substring_c(GSStr self, NSRange aRange) { GSCSubString *o; if (aRange.length == 0) { return @""; } o = (__typeof__(o))NSAllocateObject(GSCSubStringClass, 0, NSDefaultMallocZone()); o->_contents.c = self->_contents.c + aRange.location; o->_count = aRange.length; o->_flags.wide = 0; o->_flags.owned = 0; ASSIGN(o->_parent, (id)self); return AUTORELEASE((id)o); } static inline NSString* substring_u(GSStr self, NSRange aRange) { GSCSubString *o; if (aRange.length == 0) { return @""; } o = (__typeof__(o))NSAllocateObject(GSUnicodeSubStringClass, 0, NSDefaultMallocZone()); o->_contents.u = self->_contents.u + aRange.location; o->_count = aRange.length; o->_flags.wide = 1; o->_flags.owned = 0; ASSIGN(o->_parent, (id)self); return AUTORELEASE((id)o); } /* Function to examine the given string and see if it is one of our concrete * string classes. Converts the mutable string (self) from 8-bit to 16-bit * representation if necessary in order to contain the data in aString. * Returns a pointer to aStrings GSStr if aString is a concrete class * from which contents may be copied directly without conversion. */ static inline GSStr transmute(GSStr self, NSString *aString) { GSStr other = (GSStr)aString; BOOL transmute = YES; Class c = object_getClass(aString); // NB aString must not be nil /* If the string is an immutable proxy to a mutable string, we want to * access the original (which we won't modify) for better performance. */ if (c == GSImmutableStringClass) { aString = object_getIvar(aString, immutableIvar); other = (GSStr)aString; c = object_getClass(aString); } if (self->_flags.wide == 1) { /* This is already a unicode string, so we don't need to transmute, * but we still need to know if the other string is a unicode * string whose GSStr we can access directly. */ transmute = NO; if (GSObjCIsKindOf(c, GSUnicodeStringClass) == NO && (c != GSMutableStringClass || other->_flags.wide != 1)) { other = 0; } } else { /* This is a string held in the internal 8-bit encoding. */ if (GSObjCIsKindOf(c, GSCStringClass) || (c == GSMutableStringClass && other->_flags.wide == 0)) { /* The other string is also held in the internal 8-bit encoding, * so we don't need to transmute, and we can use its GSStr. */ transmute = NO; } else if ([aString canBeConvertedToEncoding: internalEncoding] == YES) { /* The other string can be converted to the internal 8-bit encoding, * so we don't need to transmute, but we can *not* use its GSStr. */ transmute = NO; other = 0; } else if ((c == GSMutableStringClass && other->_flags.wide == 1) || GSObjCIsKindOf(c, GSUnicodeStringClass) == YES) { /* The other string can not be converted to the internal 8-bit * encoding, so we need to transmute, and will then be able to * use its GSStr. */ transmute = YES; } else { /* The other string can not be converted to the internal 8-bit * character string, so we need to transmute, but even then we * will not be able to use the other strings GSStr because that * string is not a known GSString subclass. */ other = 0; } } if (transmute == YES) { GSStrWiden((GSStr)self); } return other; } /* * The GSString class is actually only provided to provide a common ivar * layout for all subclasses, so that they can all share the same code. * This class should never be instantiated, and with the exception of * -copyWithZone:, none of its memory management related methods * (initializers and -dealloc) should ever be called. We guard against * this happening. */ @implementation GSString + (void) initialize { setup(NO); } + (void) reinitialize { setup(YES); } /* * Return a 28-bit hash value for the string contents - this * MUST match the algorithm used by the NSString base class. */ - (NSUInteger) hash { if (self->_flags.hash == 0) { uint32_t ret = 0; int len = (int)self->_count; if (len > 0) { if (self->_flags.wide) { const unichar *p = self->_contents.u; ret = GSPrivateHash(0, p, len * sizeof(unichar)); } else if (len > 64) { return (self->_flags.hash = [super hash]); } else { unichar buf[64]; unsigned index; const unsigned char *p = self->_contents.c; if (internalEncoding == NSISOLatin1StringEncoding) { for (index = 0; index < len; index++) { buf[index] = p[index]; } } else { for (index = 0; index < len; index++) { unichar u = p[index]; if (u > 127) { return (self->_flags.hash = [super hash]); } buf[index] = u; } } ret = GSPrivateHash(0, buf, len * sizeof(unichar)); } /* * The hash caching in our concrete string classes uses zero to denote * an empty cache value, so we MUST NOT return a hash of zero. */ ret &= 0x0fffffff; if (ret == 0) { ret = 0x0fffffff; } } else { ret = 0x0ffffffe; /* Hash for an empty string. */ } self->_flags.hash = ret; } return self->_flags.hash; } - (id) initWithBytesNoCopy: (void*)chars length: (NSUInteger)length encoding: (NSStringEncoding)encoding freeWhenDone: (BOOL)flag { NSString *c = NSStringFromClass([self class]); NSString *s = NSStringFromSelector(_cmd); DESTROY(self); [NSException raise: NSInternalInconsistencyException format: @"[%@-%@] called on string already initialised", c, s]; return nil; } - (BOOL) makeImmutable { return YES; } - (NSUInteger) sizeInBytesExcluding: (NSHashTable*)exclude { NSUInteger size = GSPrivateMemorySize(self, exclude); if (size > 0 && _flags.owned) { size += _count; if (_flags.wide) { size += _count; } } return size; } @end @implementation GSCString - (BOOL) boolValue { return boolValue_c((GSStr)self); } - (BOOL) canBeConvertedToEncoding: (NSStringEncoding)enc { return canBeConvertedToEncoding_c((GSStr)self, enc); } - (unichar) characterAtIndex: (NSUInteger)index { return characterAtIndex_c((GSStr)self, index); } - (NSComparisonResult) compare: (NSString*)aString options: (NSUInteger)mask range: (NSRange)aRange { if (mask & NSNumericSearch) { return [super compare: aString options: mask range: aRange]; } GS_RANGE_CHECK(aRange, _count); if (aString == nil) [NSException raise: NSInvalidArgumentException format: @"[%@ -%@] nil string argument", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; if (GSObjCIsInstance(aString) == NO) [NSException raise: NSInvalidArgumentException format: @"[%@ -%@] not a string argument", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; return compare_c((GSStr)self, aString, mask, aRange); } /* Default copy implementation. Retain if we own the buffer and the zones agree, create a new GSCInlineString otherwise. */ - (id) copyWithZone: (NSZone*)z { if (!_flags.owned || NSShouldRetainWithZone(self, z) == NO) { GSCInlineString *me = newCInline(_count, z); memcpy(me->_contents.c, _contents.c, _count); return me; } else { return RETAIN(self); } } - (const char *) cString { return cString_c((GSStr)self, externalEncoding); } - (const char *) cStringUsingEncoding: (NSStringEncoding)encoding { return cString_c((GSStr)self, encoding); } - (NSUInteger) cStringLength { return cStringLength_c((GSStr)self, externalEncoding); } - (void) encodeWithCoder: (NSCoder*)aCoder { if ([aCoder allowsKeyedCoding]) { [(NSKeyedArchiver*)aCoder _encodePropertyList: self forKey: @"NS.string"]; return; } [aCoder encodeValueOfObjCType: @encode(unsigned) at: &_count]; if (_count > 0) { [aCoder encodeValueOfObjCType: @encode(int) at: &internalEncoding]; [aCoder encodeArrayOfObjCType: @encode(unsigned char) count: _count at: _contents.c]; } } - (NSStringEncoding) fastestEncoding { return internalEncoding; } - (void) getCharacters: (unichar*)buffer { getCharacters_c((GSStr)self, buffer, (NSRange){0, _count}); } - (void) getCharacters: (unichar*)buffer range: (NSRange)aRange { GS_RANGE_CHECK(aRange, _count); getCharacters_c((GSStr)self, buffer, aRange); } - (void) getCString: (char*)buffer { getCString_c((GSStr)self, buffer, NSMaximumStringLength, (NSRange){0, _count}, 0); } - (void) getCString: (char*)buffer maxLength: (NSUInteger)maxLength { getCString_c((GSStr)self, buffer, maxLength, (NSRange){0, _count}, 0); } - (BOOL) getCString: (char*)buffer maxLength: (NSUInteger)maxLength encoding: (NSStringEncoding)encoding { return getCStringE_c((GSStr)self, buffer, maxLength, encoding); } - (void) getCString: (char*)buffer maxLength: (NSUInteger)maxLength range: (NSRange)aRange remainingRange: (NSRange*)leftoverRange { GS_RANGE_CHECK(aRange, _count); getCString_c((GSStr)self, buffer, maxLength, aRange, leftoverRange); } - (int) intValue { char buf[24]; intBuf_c((GSStr)self, buf); return strtol(buf, 0, 10); } - (NSInteger) integerValue { char buf[24]; intBuf_c((GSStr)self, buf); #if GS_SIZEOF_VOIDP == GS_SIZEOF_LONG return strtol(buf, 0, 10); #else return strtoll(buf, 0, 10); #endif } - (BOOL) isEqual: (id)anObject { return isEqual_c((GSStr)self, anObject); } - (BOOL) isEqualToString: (NSString*)anObject { return isEqual_c((GSStr)self, anObject); } - (NSUInteger) length { return _count; } - (NSUInteger) lengthOfBytesUsingEncoding: (NSStringEncoding)encoding { return cStringLength_c((GSStr)self, encoding); } - (long long) longLongValue { char buf[24]; intBuf_c((GSStr)self, buf); return strtoll(buf, 0, 10); } - (const char*) lossyCString { return lossyCString_c((GSStr)self); } - (id) mutableCopy { GSMutableString *obj; obj = (GSMutableString*)NSAllocateObject(GSMutableStringClass, 0, NSDefaultMallocZone()); obj = [obj initWithBytes: (char*)_contents.c length: _count encoding: internalEncoding]; return obj; } - (id) mutableCopyWithZone: (NSZone*)z { GSMutableString *obj; obj = (GSMutableString*)NSAllocateObject(GSMutableStringClass, 0, z); obj = [obj initWithBytes: (char*)_contents.c length: _count encoding: internalEncoding]; return obj; } - (NSRange) rangeOfComposedCharacterSequenceAtIndex: (NSUInteger)anIndex { return rangeOfSequence_c((GSStr)self, anIndex); } - (NSRange) rangeOfCharacterFromSet: (NSCharacterSet*)aSet options: (NSUInteger)mask range: (NSRange)aRange { GS_RANGE_CHECK(aRange, _count); return rangeOfCharacter_c((GSStr)self, aSet, mask, aRange); } - (NSStringEncoding) smallestEncoding { return internalEncoding; } - (NSString*) substringFromRange: (NSRange)aRange { if (!_flags.wide) { id tinyString; tinyString = createTinyString((char*)_contents.c + aRange.location, aRange.length); if (tinyString) { return tinyString; } } if (_flags.owned) { GS_RANGE_CHECK(aRange, _count); return substring_c((GSStr)self, aRange); } return [super substringWithRange: aRange]; } - (NSString*) substringWithRange: (NSRange)aRange { if (_flags.owned) { GS_RANGE_CHECK(aRange, _count); return substring_c((GSStr)self, aRange); } if (!_flags.wide) { id tinyString; tinyString = createTinyString((char*)_contents.c + aRange.location, aRange.length); if (tinyString) { return tinyString; } } return [super substringWithRange: aRange]; } - (const char *) UTF8String { return UTF8String_c((GSStr)self); } // private method for Unicode level 3 implementation - (int) _baseLength { return _count; } @end @implementation GSCBufferString - (void) dealloc { if (_contents.c != 0) { if (_flags.owned) { NSZoneFree(NSZoneFromPointer(_contents.c), _contents.c); } _contents.c = 0; } [super dealloc]; } @end @implementation GSCInlineString - (NSUInteger) sizeOfContentExcluding: (NSHashTable*)exclude { return 0; // Inline string content uses no heap } - (NSUInteger) sizeOfInstance { NSUInteger size; #if HAVE_MALLOC_USABLE_SIZE size = malloc_usable_size((void*)self - sizeof(intptr_t)); #else size = class_getInstanceSize(GSCInlineStringClass); size += _count; #endif return size; } @end @implementation GSCSubString /* * Assume that a copy should be a new string, never just a retained substring. */ - (id) copyWithZone: (NSZone*)z { GSCInlineString *o; o = newCInline(_count, z); memcpy(o->_contents.c, _contents.c, _count); return (id)o; } - (void) dealloc { DESTROY(_parent); [super dealloc]; } - (NSString*) substringFromRange: (NSRange)aRange { id s; GS_RANGE_CHECK(aRange, _count); s = createTinyString((char*)_contents.c + aRange.location, aRange.length); if (nil == s) { aRange.location += (_contents.c - _parent->_contents.c); s = substring_c((GSStr)_parent, aRange); } return s; } - (NSString*) substringWithRange: (NSRange)aRange { id s; GS_RANGE_CHECK(aRange, _count); s = createTinyString((char*)_contents.c + aRange.location, aRange.length); if (nil == s) { aRange.location += (_contents.c - _parent->_contents.c); s = substring_c((GSStr)_parent, aRange); } return s; } @end @implementation GSUnicodeString - (const char *) UTF8String { return UTF8String_u((GSStr)self); } - (BOOL) boolValue { return boolValue_u((GSStr)self); } - (BOOL) canBeConvertedToEncoding: (NSStringEncoding)enc { return canBeConvertedToEncoding_u((GSStr)self, enc); } - (unichar) characterAtIndex: (NSUInteger)index { return characterAtIndex_u((GSStr)self, index); } - (NSComparisonResult) compare: (NSString*)aString options: (NSUInteger)mask range: (NSRange)aRange { if (mask & NSNumericSearch) { return [super compare: aString options: mask range: aRange]; } GS_RANGE_CHECK(aRange, _count); if (aString == nil) [NSException raise: NSInvalidArgumentException format: @"[%@ -%@] nil string argument", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; if (GSObjCIsInstance(aString) == NO) [NSException raise: NSInvalidArgumentException format: @"[%@ -%@] not a string argument", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; return compare_u((GSStr)self, aString, mask, aRange); } - (const char *) cString { return cString_u((GSStr)self, externalEncoding); } - (const char *) cStringUsingEncoding: (NSStringEncoding)encoding { return cString_u((GSStr)self, encoding); } - (NSUInteger) cStringLength { return cStringLength_u((GSStr)self, externalEncoding); } - (void) encodeWithCoder: (NSCoder*)aCoder { if ([aCoder allowsKeyedCoding]) { [(NSKeyedArchiver*)aCoder _encodePropertyList: self forKey: @"NS.string"]; return; } [aCoder encodeValueOfObjCType: @encode(unsigned) at: &_count]; if (_count > 0) { NSStringEncoding enc = NSUnicodeStringEncoding; [aCoder encodeValueOfObjCType: @encode(int) at: &enc]; [aCoder encodeArrayOfObjCType: @encode(unichar) count: _count at: _contents.u]; } } - (NSStringEncoding) fastestEncoding { return NSUnicodeStringEncoding; } - (void) getCharacters: (unichar*)buffer { getCharacters_u((GSStr)self, buffer, (NSRange){0, _count}); } - (void) getCharacters: (unichar*)buffer range: (NSRange)aRange { GS_RANGE_CHECK(aRange, _count); getCharacters_u((GSStr)self, buffer, aRange); } - (void) getCString: (char*)buffer { getCString_u((GSStr)self, buffer, NSMaximumStringLength, (NSRange){0, _count}, 0); } - (void) getCString: (char*)buffer maxLength: (NSUInteger)maxLength { getCString_u((GSStr)self, buffer, maxLength, (NSRange){0, _count}, 0); } - (BOOL) getCString: (char*)buffer maxLength: (NSUInteger)maxLength encoding: (NSStringEncoding)encoding { return getCStringE_u((GSStr)self, buffer, maxLength, encoding); } - (void) getCString: (char*)buffer maxLength: (NSUInteger)maxLength range: (NSRange)aRange remainingRange: (NSRange*)leftoverRange { GS_RANGE_CHECK(aRange, _count); getCString_u((GSStr)self, buffer, maxLength, aRange, leftoverRange); } - (int) intValue { char buf[24]; intBuf_u((GSStr)self, buf); return strtol(buf, 0, 10); } - (NSInteger) integerValue { char buf[24]; intBuf_u((GSStr)self, buf); #if GS_SIZEOF_VOIDP == GS_SIZEOF_LONG return strtol(buf, 0, 10); #else return strtoll(buf, 0, 10); #endif } - (BOOL) isEqual: (id)anObject { return isEqual_u((GSStr)self, anObject); } - (BOOL) isEqualToString: (NSString*)anObject { return isEqual_u((GSStr)self, anObject); } - (NSUInteger) length { return _count; } - (NSUInteger) lengthOfBytesUsingEncoding: (NSStringEncoding)encoding { return cStringLength_u((GSStr)self, encoding); } - (long long) longLongValue { char buf[24]; intBuf_u((GSStr)self, buf); return strtoll(buf, 0, 10); } - (const char*) lossyCString { return lossyCString_u((GSStr)self); } - (id) lowercaseString { GSUInlineString *o; unsigned i; o = [newUInline(_count, [self zone]) autorelease]; i = _count; while (i-- > 0) { o->_contents.u[i] = uni_tolower(_contents.u[i]); } return o; } - (id) mutableCopy { GSMutableString *obj; obj = (GSMutableString*)NSAllocateObject(GSMutableStringClass, 0, NSDefaultMallocZone()); obj = [obj initWithBytes: (const void*)_contents.u length: _count * sizeof(unichar) encoding: NSUnicodeStringEncoding]; return obj; } - (id) mutableCopyWithZone: (NSZone*)z { GSMutableString *obj; obj = (GSMutableString*)NSAllocateObject(GSMutableStringClass, 0, z); obj = [obj initWithBytes: (const void*)_contents.u length: _count * sizeof(unichar) encoding: NSUnicodeStringEncoding]; return obj; } - (NSRange) rangeOfComposedCharacterSequenceAtIndex: (NSUInteger)anIndex { return rangeOfSequence_u((GSStr)self, anIndex); } - (NSRange) rangeOfCharacterFromSet: (NSCharacterSet*)aSet options: (NSUInteger)mask range: (NSRange)aRange { GS_RANGE_CHECK(aRange, _count); return rangeOfCharacter_u((GSStr)self, aSet, mask, aRange); } - (NSStringEncoding) smallestEncoding { return NSUnicodeStringEncoding; } - (NSString*) substringFromRange: (NSRange)aRange { if (!_flags.wide) { id tinyString; tinyString = createTinyString((char*)_contents.c + aRange.location, aRange.length); if (tinyString) { return tinyString; } } if (_flags.owned) { GS_RANGE_CHECK(aRange, _count); return substring_u((GSStr)self, aRange); } return [super substringWithRange: aRange]; } - (NSString*) substringWithRange: (NSRange)aRange { if (!_flags.wide) { id tinyString; tinyString = createTinyString((char*)_contents.c + aRange.location, aRange.length); if (tinyString) { return tinyString; } } if (_flags.owned) { GS_RANGE_CHECK(aRange, _count); return substring_u((GSStr)self, aRange); } return [super substringWithRange: aRange]; } - (id) uppercaseString { GSUInlineString *o; unsigned i; o = [newUInline(_count, [self zone]) autorelease]; i = _count; while (i-- > 0) { o->_contents.u[i] = uni_toupper(_contents.u[i]); } return o; } // private method for Unicode level 3 implementation - (int) _baseLength { unsigned int count = 0; unsigned int blen = 0; while (count < _count) if (!uni_isnonsp(_contents.u[count++])) blen++; return blen; } /* Default -copy implementation. Retain if we own the buffer and the zones agree, create a new GSUInlineString otherwise. */ - (id) copyWithZone: (NSZone*)z { if (!_flags.owned || NSShouldRetainWithZone(self, z) == NO) { GSUInlineString *o; o = newUInline(_count, z); memcpy(o->_contents.u, _contents.u, _count * sizeof(unichar)); return o; } else { return RETAIN(self); } } @end @implementation GSUnicodeBufferString - (void) dealloc { if (_contents.u != 0) { if (_flags.owned) { NSZoneFree(NSZoneFromPointer(_contents.u), _contents.u); } _contents.u = 0; } [super dealloc]; } @end @implementation GSUInlineString - (NSUInteger) sizeOfContentExcluding: (NSHashTable*)exclude { return 0; // Inline string content uses no heap } - (NSUInteger) sizeOfInstance { NSUInteger size; #if HAVE_MALLOC_USABLE_SIZE size = malloc_usable_size((void*)self - sizeof(intptr_t)); #else size = class_getInstanceSize(GSUInlineStringClass); size += _count * sizeof(unichar); #endif return size; } @end @implementation GSUnicodeSubString /* * Assume that a copy should be a new string, never just a retained substring. */ - (id) copyWithZone: (NSZone*)z { GSUInlineString *o; o = newUInline(_count, z); memcpy(o->_contents.u, _contents.u, _count * sizeof(unichar)); return o; } - (void) dealloc { DESTROY(_parent); [super dealloc]; } - (NSString*) substringFromRange: (NSRange)aRange { GS_RANGE_CHECK(aRange, _count); aRange.location += (_contents.u - _parent->_contents.u); return substring_u((GSStr)_parent, aRange); } - (NSString*) substringWithRange: (NSRange)aRange { GS_RANGE_CHECK(aRange, _count); aRange.location += (_contents.u - _parent->_contents.u); return substring_u((GSStr)_parent, aRange); } @end /* * The GSMutableString class shares a common initial ivar layout with * the GSString class, but adds a few of its own. It uses _flags.wide * to determine whether it should use 8-bit or 16-bit characters and * is capable of changing that flag (and its underlying storage) to * move from an 8-bit to a 16-bit representation is that should be * necessary because wide characters have been placed in the string. */ @implementation GSMutableString + (void) initialize { setup(NO); GSObjCAddClassBehavior(self, [GSString class]); } - (void) appendFormat: (NSString*)format, ... { va_list ap; unichar buf[1024]; unichar *fmt = buf; size_t len; va_start(ap, format); /* * Make sure we have the format string in a nul terminated array of * unichars for passing to GSPrivateFormat. Use on-stack memory for * performance unless the size of the format string is really big * (a rare occurrence). */ len = [format length]; if (len >= 1024) { fmt = NSZoneMalloc(NSDefaultMallocZone(), (len+1)*sizeof(unichar)); } [format getCharacters: fmt]; fmt[len] = '\0'; /* * If no zone is set, make sure we have one so any memory mangement * (buffer growth) is done with the correct zone. */ if (_zone == 0) { _zone = [self zone]; } GSPrivateFormat((GSStr)self, fmt, ap, nil); _flags.hash = 0; // Invalidate the hash for this string. if (fmt != buf) { NSZoneFree(NSDefaultMallocZone(), fmt); } va_end(ap); } - (BOOL) boolValue { if (_flags.wide == 1) return boolValue_u((GSStr)self); else return boolValue_c((GSStr)self); } - (BOOL) canBeConvertedToEncoding: (NSStringEncoding)enc { if (_flags.wide == 1) return canBeConvertedToEncoding_u((GSStr)self, enc); else return canBeConvertedToEncoding_c((GSStr)self, enc); } - (unichar) characterAtIndex: (NSUInteger)index { if (_flags.wide == 1) return characterAtIndex_u((GSStr)self, index); else return characterAtIndex_c((GSStr)self, index); } - (NSComparisonResult) compare: (NSString*)aString options: (NSUInteger)mask range: (NSRange)aRange { if (mask & NSNumericSearch) { return [super compare: aString options: mask range: aRange]; } GS_RANGE_CHECK(aRange, _count); if (aString == nil) [NSException raise: NSInvalidArgumentException format: @"[%@ -%@] nil string argument", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; if (GSObjCIsInstance(aString) == NO) [NSException raise: NSInvalidArgumentException format: @"[%@ -%@] not a string argument", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; if (_flags.wide == 1) return compare_u((GSStr)self, aString, mask, aRange); else return compare_c((GSStr)self, aString, mask, aRange); } - (id) copyWithZone: (NSZone*)z { if (_flags.wide == 1) { GSUInlineString *o; o = newUInline(_count, z); memcpy(o->_contents.u, _contents.u, _count * sizeof(unichar)); return o; } else { GSCInlineString *o; o = newCInline(_count, z); memcpy(o->_contents.c, _contents.c, _count); return o; } } - (const char *) cString { if (_flags.wide == 1) return cString_u((GSStr)self, externalEncoding); else return cString_c((GSStr)self, externalEncoding); } - (const char *) cStringUsingEncoding: (NSStringEncoding)encoding { if (_flags.wide == 1) return cString_u((GSStr)self, encoding); else return cString_c((GSStr)self, encoding); } - (NSUInteger) cStringLength { if (_flags.wide == 1) return cStringLength_u((GSStr)self, externalEncoding); else return cStringLength_c((GSStr)self, externalEncoding); } - (void) dealloc { if (_contents.c != 0) { NSAssert(_flags.owned == 1 && _zone != 0, NSInternalInconsistencyException); NSZoneFree(self->_zone, self->_contents.c); self->_contents.c = 0; self->_zone = 0; } [super dealloc]; } - (void) deleteCharactersInRange: (NSRange)range { GS_RANGE_CHECK(range, _count); if (range.length > 0) { fillHole((GSStr)self, range.location, range.length); } } - (void) encodeWithCoder: (NSCoder*)aCoder { if ([aCoder allowsKeyedCoding]) { [(NSKeyedArchiver*)aCoder _encodePropertyList: self forKey: @"NS.string"]; return; } [aCoder encodeValueOfObjCType: @encode(unsigned) at: &_count]; if (_count > 0) { if (_flags.wide == 1) { NSStringEncoding enc = NSUnicodeStringEncoding; [aCoder encodeValueOfObjCType: @encode(int) at: &enc]; [aCoder encodeArrayOfObjCType: @encode(unichar) count: _count at: _contents.u]; } else { [aCoder encodeValueOfObjCType: @encode(int) at: &internalEncoding]; [aCoder encodeArrayOfObjCType: @encode(unsigned char) count: _count at: _contents.c]; } } } - (NSStringEncoding) fastestEncoding { if (_flags.wide == 1) return NSUnicodeStringEncoding; else return internalEncoding; } - (void) getCharacters: (unichar*)buffer { if (_flags.wide == 1) getCharacters_u((GSStr)self, buffer, (NSRange){0, _count}); else getCharacters_c((GSStr)self, buffer, (NSRange){0, _count}); } - (void) getCharacters: (unichar*)buffer range: (NSRange)aRange { GS_RANGE_CHECK(aRange, _count); if (_flags.wide == 1) { getCharacters_u((GSStr)self, buffer, aRange); } else { getCharacters_c((GSStr)self, buffer, aRange); } } - (void) getCString: (char*)buffer { if (_flags.wide == 1) getCString_u((GSStr)self, buffer, NSMaximumStringLength, (NSRange){0, _count}, 0); else getCString_c((GSStr)self, buffer, NSMaximumStringLength, (NSRange){0, _count}, 0); } - (void) getCString: (char*)buffer maxLength: (NSUInteger)maxLength { if (_flags.wide == 1) getCString_u((GSStr)self, buffer, maxLength, (NSRange){0, _count}, 0); else getCString_c((GSStr)self, buffer, maxLength, (NSRange){0, _count}, 0); } - (BOOL) getCString: (char*)buffer maxLength: (NSUInteger)maxLength encoding: (NSStringEncoding)encoding { if (_flags.wide == 1) return getCStringE_u((GSStr)self, buffer, maxLength, encoding); else return getCStringE_c((GSStr)self, buffer, maxLength, encoding); } - (void) getCString: (char*)buffer maxLength: (NSUInteger)maxLength range: (NSRange)aRange remainingRange: (NSRange*)leftoverRange { GS_RANGE_CHECK(aRange, _count); if (_flags.wide == 1) { getCString_u((GSStr)self, buffer, maxLength, aRange, leftoverRange); } else { getCString_c((GSStr)self, buffer, maxLength, aRange, leftoverRange); } } - (id) init { return [self initWithCapacity: 0]; } - (id) initWithBytes: (const void*)bytes length: (NSUInteger)length encoding: (NSStringEncoding)encoding { unsigned char *chars = 0; BOOL isASCII = NO; BOOL isLatin1 = NO; BOOL shouldFree = NO; _flags.owned = YES; _zone = [self zone]; if (length > 0) { fixBOM((unsigned char**)&bytes, &length, &shouldFree, encoding); chars = (unsigned char*)bytes; } if (0 == length) { return [self initWithCapacity: 0]; } if (0 == chars) { [NSException raise: NSInvalidArgumentException format: @"-initWithBytes:lenth:encoding given nul bytes"]; } if (encoding == NSUTF8StringEncoding) { unsigned i; for (i = 0; i < length; i++) { if (chars[i] > 127) { break; } } if (i == length) { /* * This is actually ASCII data ... so we can just store it as if * in the internal 8bit encoding scheme. */ encoding = internalEncoding; } } else if (encoding != internalEncoding && isByteEncoding(encoding) == YES) { unsigned i; for (i = 0; i < length; i++) { if (((unsigned char*)chars)[i] > 127) { if (encoding == NSASCIIStringEncoding) { DESTROY(self); if (shouldFree == YES) { NSZoneFree(NSZoneFromPointer(chars), chars); } return nil; // Invalid data } break; } } if (i == length) { /* * This is actually ASCII data ... so we can just store it as if * in the internal 8bit encoding scheme. */ encoding = internalEncoding; } } if (encoding == internalEncoding) { if (0 != chars) { if (shouldFree == YES) { _zone = NSZoneFromPointer(chars); _contents.c = chars; } else { _contents.c = NSZoneMalloc(_zone, length); memcpy(_contents.c, chars, length); } } _count = length; _flags.wide = 0; return self; } /* * Any remaining encoding needs to be converted to UTF-16. */ if (encoding != NSUnicodeStringEncoding) { unichar *u = 0; unsigned l = 0; if (GSToUnicode(&u, &l, (unsigned char*)chars, length, encoding, _zone, 0) == NO) { DESTROY(self); if (shouldFree == YES) { NSZoneFree(NSZoneFromPointer(chars), chars); } return nil; // Invalid data } chars = (unsigned char*)u; length = l * sizeof(unichar); shouldFree = YES; } length /= sizeof(unichar); if (GSUnicode((unichar*)(void*)chars, length, &isASCII, &isLatin1) != length) { if (shouldFree == YES && chars != 0) { NSZoneFree(NSZoneFromPointer(chars), chars); } return nil; // Invalid data } if (isASCII == YES || (internalEncoding == NSISOLatin1StringEncoding && isLatin1 == YES)) { _contents.c = NSZoneMalloc(_zone, length); _count = length; _flags.wide = 0; while (length-- > 0) { _contents.c[length] = ((unichar*)(void*)chars)[length]; } if (shouldFree == YES && chars != 0) { NSZoneFree(NSZoneFromPointer(chars), chars); } return self; } else { if (shouldFree == YES) { _zone = NSZoneFromPointer(chars); _contents.u = (unichar*)(void*)chars; } else { _contents.u = NSZoneMalloc(_zone, length * sizeof(unichar)); memcpy(_contents.u, chars, length * sizeof(unichar)); } _count = length; _flags.wide = 1; return self; } } - (id) initWithBytesNoCopy: (void*)bytes length: (NSUInteger)length encoding: (NSStringEncoding)encoding freeWhenDone: (BOOL)flag { self = [self initWithBytes: bytes length: length encoding: encoding]; if (flag == YES && bytes != 0) { NSZoneFree(NSZoneFromPointer(bytes), bytes); } return self; } - (id) initWithCapacity: (NSUInteger)capacity { if (capacity < 2) { capacity = 2; } _count = 0; _capacity = capacity; _zone = [self zone]; _contents.c = NSZoneMalloc(_zone, capacity + 1); _flags.wide = 0; _flags.owned = 1; return self; } - (id) initWithCharactersNoCopy: (unichar*)chars length: (NSUInteger)length freeWhenDone: (BOOL)flag { return [self initWithBytesNoCopy: (void*)chars length: length*sizeof(unichar) encoding: NSUnicodeStringEncoding freeWhenDone: flag]; } - (id) initWithCStringNoCopy: (char*)chars length: (NSUInteger)length freeWhenDone: (BOOL)flag { return [self initWithBytesNoCopy: (void*)chars length: length encoding: externalEncoding freeWhenDone: flag]; } - (id) initWithFormat: (NSString*)format locale: (NSDictionary*)locale arguments: (va_list)argList { unichar fbuf[1024]; unichar *fmt = fbuf; size_t len; if (NULL == format) [NSException raise: NSInvalidArgumentException format: @"[GSMutableString-initWithFormat:locale:arguments:]: NULL format"]; /* * First we provide an array of unichar characters containing the * format string. For performance reasons we try to use an on-stack * buffer if the format string is small enough ... it almost always * will be. */ len = [format length]; if (len >= 1024) { fmt = NSZoneMalloc(NSDefaultMallocZone(), (len+1)*sizeof(unichar)); } [format getCharacters: fmt]; fmt[len] = '\0'; GSPrivateFormat((GSStr)self, fmt, argList, locale); if (fmt != fbuf) { NSZoneFree(NSDefaultMallocZone(), fmt); } return self; } - (int) intValue { char buf[24]; if (_flags.wide == 1) intBuf_u((GSStr)self, buf); else intBuf_c((GSStr)self, buf); return strtol(buf, 0, 10); } - (NSInteger) integerValue { char buf[24]; if (_flags.wide == 1) intBuf_u((GSStr)self, buf); else intBuf_c((GSStr)self, buf); #if GS_SIZEOF_VOIDP == GS_SIZEOF_LONG return strtol(buf, 0, 10); #else return strtoll(buf, 0, 10); #endif } - (BOOL) isEqual: (id)anObject { if (_flags.wide == 1) return isEqual_u((GSStr)self, anObject); else return isEqual_c((GSStr)self, anObject); } - (BOOL) isEqualToString: (NSString*)anObject { if (_flags.wide == 1) return isEqual_u((GSStr)self, anObject); else return isEqual_c((GSStr)self, anObject); } - (NSUInteger) length { return _count; } - (NSUInteger) lengthOfBytesUsingEncoding: (NSStringEncoding)encoding { if (_flags.wide == 1) return cStringLength_u((GSStr)self, encoding); else return cStringLength_c((GSStr)self, encoding); } - (long long) longLongValue { char buf[24]; if (_flags.wide == 1) intBuf_u((GSStr)self, buf); else intBuf_c((GSStr)self, buf); return strtoll(buf, 0, 10); } - (const char*) lossyCString { if (_flags.wide == 1) return lossyCString_u((GSStr)self); else return lossyCString_c((GSStr)self); } - (id) lowercaseString { if (_flags.wide == 1) { GSUInlineString *o; unsigned i; o = newUInline(_count, [self zone]); i = _count; while (i-- > 0) { o->_contents.u[i] = uni_tolower(_contents.u[i]); } return [o autorelease]; } return [super lowercaseString]; } - (BOOL) makeImmutable { NSAssert(_flags.owned == 1 && _zone != 0, NSInternalInconsistencyException); if (_flags.wide == 1) { GSClassSwizzle(self, [GSUnicodeBufferString class]); } else { GSClassSwizzle(self, [GSCBufferString class]); } return YES; } - (id) makeImmutableCopyOnFail: (BOOL)force { NSAssert(_flags.owned == 1 && _zone != 0, NSInternalInconsistencyException); if (_flags.wide == 1) { GSClassSwizzle(self, [GSUnicodeBufferString class]); } else { GSClassSwizzle(self, [GSCBufferString class]); } return self; } - (id) mutableCopy { GSMutableString *obj; obj = (GSMutableString*)NSAllocateObject(GSMutableStringClass, 0, NSDefaultMallocZone()); if (_flags.wide == 1) obj = [obj initWithBytes: (void*)_contents.u length: _count * sizeof(unichar) encoding: NSUnicodeStringEncoding]; else obj = [obj initWithBytes: (void*)_contents.c length: _count encoding: internalEncoding]; return obj; } - (id) mutableCopyWithZone: (NSZone*)z { GSMutableString *obj; obj = (GSMutableString*)NSAllocateObject(GSMutableStringClass, 0, z); if (_flags.wide == 1) obj = [obj initWithBytes: (void*)_contents.u length: _count * sizeof(unichar) encoding: NSUnicodeStringEncoding]; else obj = [obj initWithBytes: (char*)_contents.c length: _count encoding: internalEncoding]; return obj; } - (NSRange) rangeOfComposedCharacterSequenceAtIndex: (NSUInteger)anIndex { if (_flags.wide == 1) return rangeOfSequence_u((GSStr)self, anIndex); else return rangeOfSequence_c((GSStr)self, anIndex); } - (NSRange) rangeOfCharacterFromSet: (NSCharacterSet*)aSet options: (NSUInteger)mask range: (NSRange)aRange { GS_RANGE_CHECK(aRange, _count); if (_flags.wide == 1) return rangeOfCharacter_u((GSStr)self, aSet, mask, aRange); else return rangeOfCharacter_c((GSStr)self, aSet, mask, aRange); } - (void) replaceCharactersInRange: (NSRange)aRange withString: (NSString*)aString { unsigned length = 0; GS_RANGE_CHECK(aRange, _count); if (aString != nil) { if (GSObjCIsInstance(aString) == NO) { [NSException raise: NSInvalidArgumentException format: @"replace characters with non-string"]; } length = [aString length]; } /* Either we have data to copy into the string (possibly requiring * length adjustment first), or we have no data but possibly a gap * (the range specified) needing to be closed. */ if (length > 0) { int offset = length - aRange.length; GSStr other = 0; /* We must change into a unicode string (if necessary) *before* * adjusting length and capacity, so that the transmute doesn't * mess up due to any hole in the string etc. */ other = transmute((GSStr)self, aString); if (other == self) { if (aRange.length == _count) { // NSLog(@"replace all characters with self ... nothing to do"); return; } else if (aRange.length == 0 && (aRange.location == _count || aRange.location == 0)) { /* We are appending self at the end of self, or we are * prepending self at the start of the self. * Either way in effect we double the string, so we can * do an efficient size extension and copy. */ makeHole((GSStr)self, length, length); if (_flags.wide) { memcpy(&_contents.u[length], _contents.u, length * sizeof(unichar)); } else { memcpy(&_contents.c[length], _contents.c, length * sizeof(char)); } _flags.hash = 0; return; } // NSLog(@"replace characters in range with self"); } if (0 == other || other == self) { /* Either we couldn't get access to the internal of the string * to be copied, or we are copying from ourself and need to * use an intermediate buffer to prevent overwriting. */ if (_flags.wide) { GS_BEGINITEMBUF(buf, (length * sizeof(unichar)), unichar); [aString getCharacters: buf]; if (offset < 0) { fillHole((GSStr)self, NSMaxRange(aRange) + offset, -offset); } else if (offset > 0) { makeHole((GSStr)self, NSMaxRange(aRange), (NSUInteger)offset); } memcpy(&_contents.u[aRange.location], buf, length * sizeof(unichar)); GS_ENDITEMBUF() } else { GS_BEGINITEMBUF(buf, ((length+1) * sizeof(char)), char); [aString getCString: buf maxLength: length+1 encoding: internalEncoding]; if (offset < 0) { fillHole((GSStr)self, NSMaxRange(aRange) + offset, -offset); } else if (offset > 0) { makeHole((GSStr)self, NSMaxRange(aRange), (NSUInteger)offset); } memcpy(&_contents.c[aRange.location], buf, length * sizeof(char)); GS_ENDITEMBUF() } } else { if (offset < 0) { fillHole((GSStr)self, NSMaxRange(aRange) + offset, -offset); } else if (offset > 0) { makeHole((GSStr)self, NSMaxRange(aRange), (NSUInteger)offset); } if (_flags.wide == 1) { memcpy(&_contents.u[aRange.location], other->_contents.u, length * sizeof(unichar)); } else { memcpy(&_contents.c[aRange.location], other->_contents.c, length * sizeof(char)); } } _flags.hash = 0; } else if (aRange.length > 0) { fillHole((GSStr)self, aRange.location, aRange.length); _flags.hash = 0; } } - (void) setString: (NSString*)aString { unsigned int len = (aString == nil) ? 0 : [aString length]; GSStr other; if (len == 0) { _count = 0; return; } other = transmute((GSStr)self, aString); if (_count < len) { makeHole((GSStr)self, _count, (NSUInteger)(len - _count)); } else { _count = len; _flags.hash = 0; } if (_flags.wide == 1) { if (other == 0) { [aString getCharacters: _contents.u]; } else { memcpy(_contents.u, other->_contents.u, len * sizeof(unichar)); } } else { if (other == 0) { unsigned l; unsigned s = 1; unichar u; unsigned char *d; /* * Since getCString appends a '\0' terminator, we must ask for * one character less than we actually want, then get the last * character separately. */ l = len - 1; if (l > 0) { [aString getCString: (char*)_contents.c maxLength: l+1 encoding: internalEncoding]; } u = [aString characterAtIndex: l]; d = _contents.c + l; GSFromUnicode(&d, &s, &u, 1, internalEncoding, 0, GSUniStrict); } else { memcpy(_contents.c, other->_contents.c, len); } } } - (NSStringEncoding) smallestEncoding { if (_flags.wide == 1) { return NSUnicodeStringEncoding; } else { return internalEncoding; } } - (NSString*) substringFromRange: (NSRange)aRange { GS_RANGE_CHECK(aRange, _count); if (aRange.length == 0) { return @""; } if (_flags.wide == 1) { GSUInlineString *o; o = [newUInline(aRange.length, [self zone]) autorelease]; memcpy(o->_contents.u, _contents.u + aRange.location, aRange.length * sizeof(unichar)); return o; } else { id tinyString; tinyString = createTinyString((char*)_contents.c + aRange.location, aRange.length); if (tinyString) { return tinyString; } else { GSCInlineString *o; o = [newCInline(aRange.length, [self zone]) autorelease]; memcpy(o->_contents.c, _contents.c + aRange.location, aRange.length); return o; } } } - (NSString*) substringWithRange: (NSRange)aRange { GS_RANGE_CHECK(aRange, _count); if (aRange.length == 0) { return @""; } if (_flags.wide == 1) { GSUInlineString *o; o = [newUInline(aRange.length, [self zone]) autorelease]; memcpy(o->_contents.u, _contents.u + aRange.location, aRange.length * sizeof(unichar)); return o; } else { id tinyString; tinyString = createTinyString((char*)_contents.c + aRange.location, aRange.length); if (tinyString) { return tinyString; } else { GSCInlineString *o; o = [newCInline(aRange.length, [self zone]) autorelease]; memcpy(o->_contents.c, _contents.c + aRange.location, aRange.length); return o; } } } - (id) uppercaseString { if (_flags.wide == 1) { GSUInlineString *o; unsigned i; o = [newUInline(_count, [self zone]) autorelease]; i = _count; while (i-- > 0) { o->_contents.u[i] = uni_toupper(_contents.u[i]); } return o; } return [super uppercaseString]; } - (const char *) UTF8String { if (_flags.wide == 1) return UTF8String_u((GSStr)self); return UTF8String_c((GSStr)self); } // private method for Unicode level 3 implementation - (int) _baseLength { if (_flags.wide == 1) { unsigned int count = 0; unsigned int blen = 0; while (count < _count) if (!uni_isnonsp(_contents.u[count++])) blen++; return blen; } else return _count; } - (NSUInteger) sizeInBytesExcluding: (NSHashTable*)exclude { NSUInteger size = GSPrivateMemorySize(self, exclude); if (size > 0 && _flags.owned) { size += _capacity; if (_flags.wide) { size += _capacity; } } return size; } @end #ifndef GNUSTEP_NEW_STRING_ABI static BOOL literalIsEqual(NXConstantString *self, id anObject) { Class c; if (anObject == (id)self) { return YES; } if (anObject == nil) { return NO; } #if defined(OBJC_SMALL_OBJECT_SHIFT) && (OBJC_SMALL_OBJECT_SHIFT == 3) if (useTinyStrings) { uintptr_t s = (uintptr_t)anObject; if (s & TINY_STRING_MASK) { return tinyEqualToString((uintptr_t)anObject, self); } } #endif if (GSObjCIsInstance(anObject) == NO) { return NO; } c = object_getClass(anObject); if (c == NSConstantStringClass) { NXConstantString *other = (NXConstantString*)anObject; if (other->nxcslen != self->nxcslen || strcmp(other->nxcsptr, self->nxcsptr) != 0) { return NO; } return YES; } else if (c == GSMutableStringClass || GSObjCIsKindOf(c, GSStringClass) == YES) { return literalIsEqualInternal(self, (GSStr)anObject); } else if (YES == [anObject isKindOfClass: NSStringClass]) // may be proxy { unichar (*imp)(id, SEL, NSUInteger); NSUInteger len = [anObject length]; NSUInteger pos = 0; unichar n = 0; unsigned i = 0; unichar u; if (len > self->nxcslen) { /* Since UTF-8 is a multibyte character set, it must have at least * as many bytes as another string of the same length. So if the * UTF-8 string is shorter, the two cannot be equal. */ return NO; } /* Do a character by character comparison using characterAtIndex: */ imp = (unichar(*)(id,SEL,NSUInteger))[anObject methodForSelector: @selector(characterAtIndex:)]; while (i < self->nxcslen || n > 0) { u = nextUTF8((const uint8_t *)self->nxcsptr, self->nxcslen, &i, &n); if (pos >= len || (*imp)(anObject, @selector(characterAtIndex:), pos) != u) { return NO; } pos++; } if (pos != len) { return NO; } return YES; } return NO; } #endif #ifdef GNUSTEP_NEW_STRING_ABI # define CONSTANT_STRING_ENCODING() (flags & 3) # define CONSTANT_STRING_HAS_HASH() ((flags & (1<<16)) == (1<<16)) # define CONSTANT_STRING_SET_HAS_HASH() do { flags |= (1<<16); } while(0) #endif /** *

The NXConstantString class is used by the compiler for constant * strings, as such its ivar layout is determined by the compiler * and consists of a pointer (_contents.c) and a character count * (_count). */ @implementation NXConstantString + (void) initialize { if (self == [NXConstantString class]) { NSConstantStringClass = self; } } - (const char*) UTF8String { #ifdef GNUSTEP_NEW_STRING_ABI switch (CONSTANT_STRING_ENCODING()) { case 0: // ASCII case 1: // UTF-8 return nxcsptr; case 2: // UTF-16 { unsigned int l = 0; unsigned char *r = 0; if (GSFromUnicode(&r, &l, (const unichar*)(void*)nxcsptr, nxcslen, NSUTF8StringEncoding, NSDefaultMallocZone(), GSUniTerminate|GSUniTemporary|GSUniStrict) == NO) { [NSException raise: NSCharacterConversionException format: @"Can't get UTF8 from Unicode string."]; } return (const char*)r; } case 4: // UTF-32 return [super UTF8String]; } GS_UNREACHABLE(); #else return nxcsptr; #endif } - (unichar) characterAtIndex: (NSUInteger)index { #ifdef GNUSTEP_NEW_STRING_ABI if (index >= nxcslen) { [NSException raise: NSInvalidArgumentException format: @"-characterAtIndex: index out of range"]; } switch (CONSTANT_STRING_ENCODING()) { case 0: // ASCII case 1: // UTF-8 return nxcsptr[index]; case 2: // UTF-16 return ((unichar*)(void*)nxcsptr)[index]; } GS_UNREACHABLE(); #else NSUInteger l = 0; unichar u; unichar n = 0; unsigned i = 0; while (i < nxcslen || n > 0) { u = nextUTF8((const uint8_t *)nxcsptr, nxcslen, &i, &n); if (l++ == index) { return u; } } [NSException raise: NSInvalidArgumentException format: @"-characterAtIndex: index out of range"]; return 0; #endif } #ifndef GNUSTEP_NEW_STRING_ABI - (BOOL) canBeConvertedToEncoding: (NSStringEncoding)encoding { /* If the string contains bad (non-utf8) data, the lengthUTF8() function * will raise an exception ... we catch it and return NO in that case * since this method is not expected to raise exceptions. */ NS_DURING { if (NSASCIIStringEncoding == encoding) { BOOL ascii; lengthUTF8((const uint8_t*)nxcsptr, nxcslen, &ascii, 0); NS_VALRETURN(ascii); } else if (NSISOLatin1StringEncoding == encoding) { BOOL latin1; lengthUTF8((const uint8_t*)nxcsptr, nxcslen, 0, &latin1); NS_VALRETURN(latin1); } else if (NSUTF8StringEncoding == encoding || NSUnicodeStringEncoding == encoding) { lengthUTF8((const uint8_t*)nxcsptr, nxcslen, 0, 0); NS_VALRETURN(YES); } else { id d = [self dataUsingEncoding: encoding allowLossyConversion: NO]; NS_VALRETURN(d != nil ? YES : NO); } } NS_HANDLER { return NO; } NS_ENDHANDLER } - (NSData*) dataUsingEncoding: (NSStringEncoding)encoding allowLossyConversion: (BOOL)flag { BOOL ascii; BOOL latin1; unsigned length; /* Check what is actually in this string ... if it's corrupt an exception * is raised. */ length = lengthUTF8((const uint8_t*)nxcsptr, nxcslen, &ascii, &latin1); if (NSUTF8StringEncoding == encoding) { /* We want utf-8, so we can just return an object pointing to the * constant string data since e just checked that it's UTF8 in * lengthUTF8(). */ return [NSDataClass dataWithBytesNoCopy: (void*)nxcsptr length: nxcslen freeWhenDone: NO]; } if (YES == ascii && GSPrivateIsByteEncoding(encoding)) { /* The constant string data is just ascii, so we can return a * pointer to it directly for any encoding which has ascii as * a subset. */ return [NSDataClass dataWithBytesNoCopy: (void*)nxcsptr length: nxcslen freeWhenDone: NO]; } if (YES == latin1 && NSISOLatin1StringEncoding == encoding) { unsigned i = 0; unichar n = 0; uint8_t *b; uint8_t *p; /* If all the characters are latin1 we can copy them efficiently. */ p = b = NSAllocateCollectable(length, 0); while (i < nxcslen) { *p++ = (uint8_t)nextUTF8((const uint8_t *)nxcsptr, nxcslen, &i, &n); } return [NSDataClass dataWithBytesNoCopy: (void*)b length: length freeWhenDone: YES]; } return [super dataUsingEncoding: encoding allowLossyConversion: flag]; } #endif - (void) dealloc { GSNOSUPERDEALLOC; } - (void) getCharacters: (unichar*)buffer range: (NSRange)aRange { #ifdef GNUSTEP_NEW_STRING_ABI GS_RANGE_CHECK(aRange, nxcslen); switch (CONSTANT_STRING_ENCODING()) { case 0: // ASCII for (int i=0 ; i 0)) { nextUTF8((const uint8_t *)nxcsptr, nxcslen, &i, &n); index++; } if (index == aRange.location) { while (index < max && (i < nxcslen || n > 0)) { *buffer++ = nextUTF8((const uint8_t *)nxcsptr, nxcslen, &i, &n); index++; } } if (index != max) { [NSException raise: NSRangeException format: @"in %s, range { %"PRIuPTR", %"PRIuPTR" } extends beyond string", GSNameFromSelector(_cmd), aRange.location, aRange.length]; } #endif } // This method was deprecated on Mac OS X 10.5, so if we provide an improved // version here then we should do it using the newer version. #ifndef GNUSTEP_NEW_STRING_ABI - (BOOL) getCString: (char*)buffer maxLength: (NSUInteger)maxLength encoding: (NSStringEncoding)encoding { const uint8_t *ptr = (const uint8_t*)nxcsptr; int length = nxcslen; int index; if (0 == maxLength || 0 == buffer) { return NO; // Can't fit in here } if (NSUTF8StringEncoding == encoding) { BOOL result = (length < maxLength) ? YES : NO; /* We are already using UTF-8 so we can just copy directly. */ if (maxLength <= length) { length = maxLength - 1; } for (index = 0; index < length; index++) { buffer[index] = (char)ptr[index]; } /* Step back before any multibyte sequence */ while (index > 0 && (ptr[index - 1] & 0x80)) { index--; } buffer[index] = '\0'; return result; } else if (isByteEncoding(encoding)) { BOOL result = (length < maxLength) ? YES : NO; /* We want a single-byte encoding (ie ascii is a subset), * so as long as this constant string is ascii, we can just * copy directly. */ if (maxLength <= length) { length = maxLength - 1; } for (index = 0; index < length; index++) { buffer[index] = (char)ptr[index]; if (ptr[index] & 0x80) { break; // Not ascii } } if (index == length) { buffer[index] = '\0'; return result; } // Fall through to use superclass method. } return [super getCString: buffer maxLength: maxLength encoding: encoding]; } #endif /* Must match the implementation in NSString * To avoid allocating memory, we build the hash incrementally. */ - (NSUInteger) hash { #ifdef GNUSTEP_NEW_STRING_ABI if (CONSTANT_STRING_HAS_HASH()) return hash; hash = [super hash]; CONSTANT_STRING_SET_HAS_HASH(); return hash; #else if (nxcslen > 0) { uint32_t s0 = 0; uint32_t s1 = 0; unichar chunk[64]; uint32_t ret; unichar n = 0; unsigned i = 0; int l = 0; uint32_t t = 0; while (i < nxcslen) { chunk[l++] = nextUTF8((const uint8_t *)nxcsptr, nxcslen, &i, &n); if (64 == l) { GSPrivateIncrementalHash(&s0, &s1, chunk, l * sizeof(unichar)); t += l; l = 0; } } if (0 != n) { chunk[l++] = n; // Add final character } if (l > 0) { GSPrivateIncrementalHash(&s0, &s1, chunk, l * sizeof(unichar)); t += l; } ret = GSPrivateFinishHash(s0, s1, t * sizeof(unichar)); ret &= 0x0fffffff; if (ret == 0) { ret = 0x0fffffff; } return ret; } else { return 0x0ffffffe; /* Hash for an empty string. */ } #endif } - (id) initWithBytes: (const void*)bytes length: (NSUInteger)length encoding: (NSStringEncoding)encoding { [NSException raise: NSGenericException format: @"Attempt to init a constant string"]; return nil; } - (id) initWithBytesNoCopy: (void*)bytes length: (NSUInteger)length encoding: (NSStringEncoding)encoding freeWhenDone: (BOOL)flag { [NSException raise: NSGenericException format: @"Attempt to init a constant string"]; return nil; } #ifdef GNUSTEP_NEW_STRING_ABI - (NSUInteger) length { // In the new encoding, nxcslen is always the length of the string in UTF-16 // codepoints return nxcslen; } #else - (BOOL) isEqual: (id)anObject { return literalIsEqual(self, anObject); } - (BOOL) isEqualToString: (NSString*)other { return literalIsEqual(self, other); } - (int) intValue { return strtol((const char*)nxcsptr, 0, 10); } - (NSInteger) integerValue { #if GS_SIZEOF_VOIDP == GS_SIZEOF_LONG return strtol((const char*)nxcsptr, 0, 10); #else return strtoll((const char*)nxcsptr, 0, 10); #endif } - (NSUInteger) length { return lengthUTF8((const uint8_t*)nxcsptr, nxcslen, 0, 0); } - (long long) longLongValue { return strtoll((const char*)nxcsptr, 0, 10); } - (NSRange) rangeOfCharacterFromSet: (NSCharacterSet*)aSet options: (NSUInteger)mask range: (NSRange)aRange { NSUInteger index; NSUInteger start; NSUInteger stop; NSRange range; BOOL ascii; index = lengthUTF8((const uint8_t*)nxcsptr, nxcslen, &ascii, 0); GS_RANGE_CHECK(aRange, index); start = aRange.location; stop = NSMaxRange(aRange); range.location = NSNotFound; range.length = 0; if (stop > start) { BOOL (*mImp)(id, SEL, unichar); unichar n = 0; unsigned i = 0; mImp = (BOOL(*)(id,SEL,unichar)) [aSet methodForSelector: @selector(characterIsMember:)]; for (index = 0; index < start; index++) { nextUTF8((const uint8_t *)nxcsptr, nxcslen, &i, &n); } if ((mask & NSBackwardsSearch) == NSBackwardsSearch) { unichar buf[stop - start]; NSUInteger pos = 0; for (pos = 0; pos + start < stop; pos++) { buf[pos] = nextUTF8((const uint8_t *)nxcsptr, nxcslen, &i, &n); } index = stop; while (index-- > start) { if ((*mImp)(aSet, @selector(characterIsMember:), buf[--pos])) { range = NSMakeRange(index, 1); break; } } } else { while (index < stop) { unichar letter; letter = nextUTF8((const uint8_t *)nxcsptr, nxcslen, &i, &n); if ((*mImp)(aSet, @selector(characterIsMember:), letter)) { range = NSMakeRange(index, 1); break; } index++; } } } return range; } - (NSRange) rangeOfComposedCharacterSequenceAtIndex: (NSUInteger)anIndex { NSUInteger start = 0; NSUInteger pos = 0; unichar n = 0; unsigned i = 0; unichar u; /* A composed character sequence consists of a single base character * followed by zero or more non-base characters. */ while (i < nxcslen || n > 0) { u = nextUTF8((const uint8_t *)nxcsptr, nxcslen, &i, &n); if (!uni_isnonsp(u)) { /* This may be the base character at the start of the sequence. */ start = pos; } if (pos++ == anIndex) { /* Look ahead to see if the character at the specified index is * followed by one or more non-base characters. If it is, we * make the range longer before returning it. */ while (i < nxcslen || n > 0) { u = nextUTF8((const uint8_t *)nxcsptr, nxcslen, &i, &n); if (!uni_isnonsp(u)) { break; } pos++; } return NSMakeRange(start, pos - start); } } [NSException raise: NSInvalidArgumentException format: @"-rangeOfComposedCharacterSequenceAtIndex: index out of range"]; return NSMakeRange(NSNotFound, 0); } #endif // GNUSTEP_NEW_STRING_ABI - (id) retain { return self; } - (oneway void) release { return; } - (id) autorelease { return self; } - (id) copyWithZone: (NSZone*)z { return self; } - (NSZone*) zone { return NSDefaultMallocZone(); } - (NSStringEncoding) fastestEncoding { #ifdef GNUSTEP_NEW_STRING_ABI switch (CONSTANT_STRING_ENCODING()) { case 0: // ASCII return NSASCIIStringEncoding; case 1: // UTF-8 return NSUTF8StringEncoding; case 2: // UTF-16 return NSUTF16StringEncoding; case 3: // UTF-32 return NSUTF32StringEncoding; } GS_UNREACHABLE(); #else return NSUTF8StringEncoding; #endif } - (NSStringEncoding) smallestEncoding { #ifdef GNUSTEP_NEW_STRING_ABI // UTF-16 might not be the smallest encoding for UTF-16 strings, but for now // we'll pretend that it is. switch (CONSTANT_STRING_ENCODING()) { case 0: // ASCII return NSASCIIStringEncoding; case 1: // UTF-8 return NSUTF8StringEncoding; case 2: // UTF-16 case 3: // UTF-32 return NSUTF16StringEncoding; } GS_UNREACHABLE(); #else return NSUTF8StringEncoding; #endif } - (NSUInteger) sizeOfContentExcluding: (NSHashTable*)exclude { return 0; // Constant string uses no heap } - (NSUInteger) sizeOfInstance { return 0; // Constant string uses no heap } @end /** * Append characters to a string. */ void GSPrivateStrAppendUnichars(GSStr s, const unichar *u, unsigned l) { /* * Make the string wide if necessary. */ if (s->_flags.wide == 0) { BOOL widen = NO; if (internalEncoding == NSISOLatin1StringEncoding) { unsigned i; for (i = 0; i < l; i++) { if (u[i] > 255) { widen = YES; break; } } } else { unsigned i; for (i = 0; i < l; i++) { if (u[i] > 127) { widen = YES; break; } } } if (widen == YES) { GSStrWiden(s); } } /* * Make room for the characters we are appending. */ if (s->_count + l + 1 >= s->_capacity) { GSStrMakeSpace(s, l); } /* * Copy the characters into place. */ if (s->_flags.wide == 1) { memcpy(s->_contents.u + s->_count, u, l * sizeof(unichar)); s->_count += l; } else { unsigned i; for (i = 0; i < l; i++) { s->_contents.c[s->_count++] = u[i]; } } } void GSPrivateStrExternalize(GSStr s) { if (s->_flags.wide == 0 && internalEncoding != externalEncoding) { GSStrWiden(s); } } gnustep-base-1.29.0/Source/GSTLS.m000066400000000000000000002120521435650067400165260ustar00rootroot00000000000000/** Implementation for GSTLS classes for GNUStep Copyright (C) 2012 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 2101 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 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 USA. */ #import "common.h" #import "Foundation/NSArray.h" #import "Foundation/NSBundle.h" #import "Foundation/NSData.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSFileManager.h" #import "Foundation/NSHost.h" #import "Foundation/NSException.h" #import "Foundation/NSLock.h" #import "Foundation/NSNotification.h" #import "Foundation/NSProcessInfo.h" #import "Foundation/NSStream.h" #import "Foundation/NSTask.h" #import "Foundation/NSThread.h" #import "Foundation/NSUserDefaults.h" #import "Foundation/NSUUID.h" #import "GNUstepBase/GSTLS.h" #import "GSPrivate.h" @interface NSString(gnutlsFileSystemRepresentation) - (const char*) gnutlsFileSystemRepresentation; @end @implementation NSString(gnutlsFileSystemRepresentation) - (const char*) gnutlsFileSystemRepresentation { #if defined(_WIN32) const unichar *buf = (const unichar*)[self fileSystemRepresentation]; int len = 0; NSString *str; const char *result; while (buf[len] > 0) { len++; } str = [[NSString alloc] initWithBytes: buf length: len * 2 encoding: NSUnicodeStringEncoding]; result = [str UTF8String]; RELEASE(str); return result; #else return [self fileSystemRepresentation]; #endif } @end #if defined(HAVE_GNUTLS) static NSString * standardizedPath(NSString *path) { if (0 == [path length]) { return nil; // Not a path } if (NO == [path isAbsolutePath]) { path = [[[NSFileManager defaultManager] currentDirectoryPath] stringByAppendingPathComponent: path]; } return [path stringByStandardizingPath]; } #if GNUTLS_VERSION_NUMBER <= 0x020b00 /* Set up locking callbacks for gcrypt so that it will be thread-safe. */ static int gcry_mutex_init(void **priv) { NSLock *lock = [NSLock new]; *priv = (void*)lock; return 0; } static int gcry_mutex_destroy(void **lock) { [((NSLock*)*lock) release]; return 0; } static int gcry_mutex_lock(void **lock) { [((NSLock*)*lock) lock]; return 0; } static int gcry_mutex_unlock(void **lock) { [((NSLock*)*lock) unlock]; return 0; } static struct gcry_thread_cbs gcry_threads_other = { GCRY_THREAD_OPTION_DEFAULT, NULL, gcry_mutex_init, gcry_mutex_destroy, gcry_mutex_lock, gcry_mutex_unlock }; #endif static void GSTLSLog(int level, const char *msg) { NSLog(@"%s", msg); } /* The caFile variable holds the location of the file containing the default * certificate authorities to be used by our system. * The hard-coded value is a file in the GSTLS folder of the base library * resource bundle, but this can be overridden by the GS_TLS_CA_FILE * environment variable, which in turn will be overridden by the GSTLSCAFile * user default string. */ static NSString *caFile = nil; // GSTLS/ca-certificates.crt /* The caRevoke variable holds the location of the file containing the default * certificate revocation list to be used by our system. * The hard-coded value is a file in the GSTLS folder of the base library * resource bundle, but this can be overridden by the GS_TLS_REVOKE * environment variable, which in turn will be overridden by the GSTLSRevokeFile * user default string. */ static NSString *revokeFile = nil; // GSTLS/revoke.crl /* The verifyClient variable tells us if connections from a remote server * should (by default) provide a client certificate which we verify against * our trusted authorities. * The hard-coded value can be overridden by the GS_TLS_VERIFY_C environment * variable, which in turn will be overridden by the GSTLSVerifyClient user * default string. * A GSTLSVerify option set for a specific session overrides this default */ static BOOL verifyClient = NO; /* The verifyServer variable tells us if outgoing connections (as a client) * to a remote server should (by default) verify that server's certificate * against our trusted authorities. * The hard-coded value can be overridden by the GS_TLS_VERIFY_S environment * variable, which in turn will be overridden by the GSTLSVerifyServer user * default string. * A GSTLSVerify option set for a specific session overrides this default */ static BOOL verifyServer = NO; /* The globalDebug variable turns on gnutls debug. The hard-code value is * overridden by GS_TLS_DEBUG, which in turn can be overridden by the * GSTLSDebug user default. This is an integer debug level with higher * values producing more debug output. Usually levels above 1 are too * verbose and not useful unless you have the gnutls source code to hand. * NB. The GSTLSDebug session option is a boolean to turn on extra debug for * a particular session to be produced on verification failure. */ static int globalDebug = 0; /* Defines the default priority list. */ static NSString *priority = nil; static gnutls_anon_client_credentials_t anoncred; /* This class is used to ensure that the GNUTLS system is initialised * and thread-safe. */ @implementation GSTLSObject static NSLock *fileLock = nil; static NSMutableDictionary *fileMap = nil; + (void) _defaultsChanged: (NSNotification*)n { NSBundle *bundle; NSUserDefaults *defs; NSDictionary *env; NSString *str; bundle = [NSBundle bundleForClass: [NSObject class]]; defs = [NSUserDefaults standardUserDefaults]; env = [[NSProcessInfo processInfo] environment]; str = [defs stringForKey: @"GSCipherList"]; if (nil != str) { GSOnceMLog(@"GSCipherList is no longer used, please try GSTLSPriority"); } str = [defs stringForKey: GSTLSPriority]; if (0 == [str length]) { str = nil; // nil or empty string resets to default } ASSIGN(priority, str); /* The GSTLSCAFile user default overrides the builtin value or the * GS_TLS_CA_FILE environment variable. */ str = [defs stringForKey: GSTLSCAFile]; if (nil == str) { /* Let the GS_TLS_CA_FILE environment variable override the * default certificate authority location. * Failing that, use the same environment variable as OpenSSL */ str = [env objectForKey: @"GS_TLS_CA_FILE"]; if (nil == str) { str = [env objectForKey: @"SSL_CERT_FILE"]; } if (nil == str) { str = [bundle pathForResource: @"ca-certificates" ofType: @"crt" inDirectory: @"GSTLS"]; } } str = standardizedPath(str); ASSIGN(caFile, str); /* The GSTLSRevokeFile user default overrides the builtin value or the * GS_TLS_REVOKE environment variable. */ str = [defs stringForKey: GSTLSRevokeFile]; if (nil == str) { /* Let the GS_TLS_REVOKE environment variable override the * default revocation list location. */ str = [env objectForKey: @"GS_TLS_REVOKE"]; if (nil == str) { str = [bundle pathForResource: @"revoke" ofType: @"crl" inDirectory: @"GSTLS"]; } } str = standardizedPath(str); ASSIGN(revokeFile, str); str = [defs stringForKey: @"GSTLSVerifyClient"]; if (nil == str) { str = [env objectForKey: @"GS_TLS_VERIFY_C"]; } verifyClient = [str boolValue]; str = [defs stringForKey: @"GSTLSVerifyServer"]; if (nil == str) { str = [env objectForKey: @"GS_TLS_VERIFY_S"]; } verifyServer = [str boolValue]; str = [defs stringForKey: GSTLSDebug]; if (nil == str) { str = [env objectForKey: @"GS_TLS_DEBUG"]; } globalDebug = [str intValue]; if (globalDebug < 0) { globalDebug = 0; } gnutls_global_set_log_level(globalDebug); } + (NSData*) dataForTLSFile: (NSString*)fileName { NSData *result; if (NO == [fileName isKindOfClass: [NSString class]]) { [NSException raise: NSInvalidArgumentException format: @"[GSTLS+dataForTLSFile:] called with bad file name"]; } [fileLock lock]; NS_DURING { result = [[fileMap objectForKey: fileName] retain]; } NS_HANDLER { [fileLock unlock]; result = nil; [localException raise]; } NS_ENDHANDLER [fileLock unlock]; if (nil == result) { return [NSData dataWithContentsOfFile: fileName]; } return [result autorelease]; } + (void) initialize { if ([GSTLSObject class] == self) { static BOOL beenHere = NO; if (beenHere == NO) { beenHere = YES; fileLock = [NSLock new]; fileMap = [NSMutableDictionary new]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(_defaultsChanged:) name: NSUserDefaultsDidChangeNotification object: nil]; #if GNUTLS_VERSION_NUMBER <= 0x020b00 /* Make gcrypt thread-safe */ gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_other); #endif /* Initialise gnutls */ gnutls_global_init(); /* Allocate global credential information for anonymous tls */ gnutls_anon_allocate_client_credentials(&anoncred); /* Enable gnutls logging via NSLog */ gnutls_global_set_log_function(GSTLSLog); [self _defaultsChanged: nil]; } } } + (void) setData: (NSData*)data forTLSFile: (NSString*)fileName { fileName = standardizedPath(fileName); if (nil != data && NO == [data isKindOfClass: [NSData class]]) { [NSException raise: NSInvalidArgumentException format: @"[GSTLS+setData:forTLSFile:] called with bad data"]; } if (NO == [fileName isKindOfClass: [NSString class]]) { [NSException raise: NSInvalidArgumentException format: @"[GSTLS+setData:forTLSFile:] called with bad file"]; } [fileLock lock]; NS_DURING { if (data == nil) { [fileMap removeObjectForKey: fileName]; } else { [fileMap setObject: data forKey: fileName]; } } NS_HANDLER { [fileLock unlock]; [localException raise]; } NS_ENDHANDLER [fileLock unlock]; } @end @implementation GSTLSDHParams static NSLock *paramsLock = nil; static NSMutableDictionary *paramsCache = nil; static NSTimeInterval paramsWhen = 0.0; static BOOL paramsGenerating = NO; static GSTLSDHParams *paramsCurrent = nil; + (GSTLSDHParams*) current { GSTLSDHParams *p; [paramsLock lock]; if (nil == paramsCurrent) { if (NO == paramsGenerating) { [paramsLock unlock]; [self generate]; [paramsLock lock]; } while (nil == paramsCurrent) { [paramsLock unlock]; [NSThread sleepForTimeInterval: 0.2]; [paramsLock lock]; } } p = [paramsCurrent retain]; [paramsLock unlock]; return [p autorelease]; } + (void) generate { GSTLSDHParams *p; [paramsLock lock]; if (YES == paramsGenerating) { [paramsLock unlock]; return; } paramsGenerating = YES; [paramsLock unlock]; p = [GSTLSDHParams new]; /* Generate Diffie-Hellman parameters - for use with DHE * kx algorithms. When short bit length is used, it might * be wise to regenerate parameters often. */ gnutls_dh_params_init(&p->params); gnutls_dh_params_generate2 (p->params, 2048); [paramsLock lock]; [paramsCurrent release]; paramsCurrent = p; paramsWhen = [NSDate timeIntervalSinceReferenceDate]; paramsGenerating = NO; [paramsLock unlock]; } + (void) housekeeping: (NSNotification*)n { NSEnumerator *enumerator; NSString *key; NSTimeInterval now; now = [NSDate timeIntervalSinceReferenceDate]; [paramsLock lock]; enumerator = [[paramsCache allKeys] objectEnumerator]; while (nil != (key = [enumerator nextObject])) { GSTLSDHParams *p; p = [paramsCache objectForKey: key]; if (now - p->when > 300.0) { [paramsCache removeObjectForKey: key]; } } /* Regenerate DH params once per day, perfoming generation in another * thread since it's likely to be rather slow. */ if (nil != paramsCurrent && NO == paramsGenerating && (now = paramsWhen) > 24.0 * 60.0 * 60.0) { [NSThread detachNewThreadSelector: @selector(generate) toTarget: self withObject: nil]; } [paramsLock unlock]; } + (void) initialize { if (nil == paramsLock) { paramsLock = [NSLock new]; [[NSObject leakAt: ¶msLock] release]; paramsWhen = [NSDate timeIntervalSinceReferenceDate]; paramsCache = [NSMutableDictionary new]; [[NSObject leakAt: ¶msCache] release]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(housekeeping:) name: @"GSHousekeeping" object: nil]; } } + (GSTLSDHParams*) paramsFromFile: (NSString*)f { GSTLSDHParams *p; if (nil == f) { return nil; } f = standardizedPath(f); [paramsLock lock]; p = [[paramsCache objectForKey: f] retain]; [paramsLock unlock]; if (nil == p) { NSData *data; int ret; gnutls_datum_t datum; data = [[self class] dataForTLSFile: f]; if (nil == data) { NSLog(@"Unable to read DF params file '%@'", f); return nil; } datum.data = (unsigned char*)[data bytes]; datum.size = (unsigned int)[data length]; p = [self alloc]; p->when = [NSDate timeIntervalSinceReferenceDate]; p->path = [f copy]; gnutls_dh_params_init(&p->params); ret = gnutls_dh_params_import_pkcs3(p->params, &datum, GNUTLS_X509_FMT_PEM); if (ret < 0) { NSLog(@"Unable to parse DH params file '%@': %s", p->path, gnutls_strerror(ret)); [p release]; return nil; } [paramsLock lock]; [paramsCache setObject: p forKey: p->path]; [paramsLock unlock]; } return [p autorelease]; } - (void) dealloc { gnutls_dh_params_deinit(params); [super dealloc]; } - (gnutls_dh_params_t) params { return params; } @end @implementation GSTLSCertificateList static NSLock *certificateListLock = nil; static NSMutableDictionary *certificateListCache = nil; + (void) certInfo: (gnutls_x509_crt_t)cert to: (NSMutableString*)str { #if GNUTLS_VERSION_NUMBER >= 0x030507 gnutls_datum_t dn; #else char dn[1024]; size_t dn_size = sizeof(dn); #endif char serial[40]; size_t serial_size = sizeof(serial); time_t expiret; time_t activet; int algo; unsigned int bits; int i; [str appendFormat: _(@"- Certificate version: #%d\n"), gnutls_x509_crt_get_version(cert)]; #if GNUTLS_VERSION_NUMBER >= 0x030507 if (GNUTLS_E_SUCCESS == gnutls_x509_crt_get_dn3(cert, &dn, 0)) { [str appendFormat: @"- Certificate DN: %@\n", [NSString stringWithUTF8String: (const char*)dn.data]]; gnutls_free(dn.data); } if (GNUTLS_E_SUCCESS == gnutls_x509_crt_get_issuer_dn3(cert, &dn, 0)) { [str appendFormat: _(@"- Certificate Issuer's DN: %@\n"), [NSString stringWithUTF8String: (const char*)dn.data]]; gnutls_free(dn.data); } #else dn_size = sizeof(dn) - 1; gnutls_x509_crt_get_dn(cert, dn, &dn_size); dn[dn_size] = '\0'; [str appendFormat: @"- Certificate DN: %@\n", [NSString stringWithUTF8String: dn]]; dn_size = sizeof(dn) - 1; gnutls_x509_crt_get_issuer_dn(cert, dn, &dn_size); dn[dn_size] = '\0'; [str appendFormat: _(@"- Certificate Issuer's DN: %@\n"), [NSString stringWithUTF8String: dn]]; #endif activet = gnutls_x509_crt_get_activation_time(cert); [str appendFormat: _(@"- Certificate is valid since: %s"), ctime(&activet)]; expiret = gnutls_x509_crt_get_expiration_time(cert); [str appendFormat: _(@"- Certificate expires: %s"), ctime (&expiret)]; #if 0 { char digest[20]; size_t digest_size = sizeof(digest); if (gnutls_x509_fingerprint(GNUTLS_DIG_MD5, &cert_list[0], digest, &digest_size) >= 0) { [str appendString: _(@"- Certificate fingerprint: ")]; for (i = 0; i < digest_size; i++) { [str appendFormat: @"%.2x ", (unsigned char)digest[i]]; } [str appendString: @"\n"]; } } #endif if (gnutls_x509_crt_get_serial(cert, serial, &serial_size) >= 0) { [str appendString: _(@"- Certificate serial number: ")]; for (i = 0; i < serial_size; i++) { [str appendFormat: @"%.2x ", (unsigned char)serial[i]]; } [str appendString: @"\n"]; } [str appendString: _(@"- Certificate public key: ")]; algo = gnutls_x509_crt_get_pk_algorithm(cert, &bits); if (GNUTLS_PK_RSA == algo) { [str appendFormat: _(@"RSA - Modulus: %d bits\n"), bits]; } else if (GNUTLS_PK_DSA == algo) { [str appendFormat: _(@"DSA - Exponent: %d bits\n"), bits]; } else { [str appendString: _(@"UNKNOWN\n")]; } } /* Method to purge older lists from cache. */ + (void) housekeeping: (NSNotification*)n { NSEnumerator *enumerator; NSString *key; NSTimeInterval now; now = [NSDate timeIntervalSinceReferenceDate]; [certificateListLock lock]; enumerator = [[certificateListCache allKeys] objectEnumerator]; while (nil != (key = [enumerator nextObject])) { GSTLSCertificateList *list; list = [certificateListCache objectForKey: key]; if (now - list->when > 300.0) { [certificateListCache removeObjectForKey: key]; } } [certificateListLock unlock]; } + (void) initialize { if (nil == certificateListLock) { certificateListLock = [NSLock new]; [[NSObject leakAt: &certificateListLock] release]; certificateListCache = [NSMutableDictionary new]; [[NSObject leakAt: &certificateListCache] release]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(housekeeping:) name: @"GSHousekeeping" object: nil]; } } + (GSTLSCertificateList*) listFromFile: (NSString*)f { GSTLSCertificateList *l; if (nil == f) { return nil; } f = standardizedPath(f); [certificateListLock lock]; l = [[certificateListCache objectForKey: f] retain]; [certificateListLock unlock]; if (nil == l) { NSData *data; int ret; gnutls_datum_t datum; unsigned int count = 100; gnutls_x509_crt_t crts[count]; data = [[self class] dataForTLSFile: f]; if (nil == data) { NSLog(@"Unable to read certificate file '%@'", f); return nil; } datum.data = (unsigned char*)[data bytes]; datum.size = (unsigned int)[data length]; l = [self alloc]; l->when = [NSDate timeIntervalSinceReferenceDate]; l->path = [f copy]; ret = gnutls_x509_crt_list_import(crts, &count, &datum, GNUTLS_X509_FMT_PEM, // GNUTLS_X509_CRT_LIST_FAIL_IF_UNSORTED | GNUTLS_X509_CRT_LIST_IMPORT_FAIL_IF_EXCEED); if (ret < 0) { NSLog(@"Unable to parse certificate file '%@': %s", l->path, gnutls_strerror(ret)); [l release]; return nil; } if (count > 0) { time_t now = (time_t)[[NSDate date] timeIntervalSince1970]; unsigned int i = count; l->crts = malloc(sizeof(gnutls_x509_crt_t) * count); memcpy(l->crts, crts, sizeof(gnutls_x509_crt_t) * count); l->count = count; for (i = 0; i < count; i++) { time_t expiret = gnutls_x509_crt_get_expiration_time(crts[i]); time_t activet = gnutls_x509_crt_get_activation_time(crts[i]); if (expiret <= now) { NSLog(@"WARNING: at index %u in %@ ... expired at %s", i, l->path, ctime(&activet)); } if (activet > now) { NSLog(@"WARNING: at index %u in %@ ... not valid until %s", i, l->path, ctime(&activet)); } if (expiret <= now || activet > now) { NSMutableString *m; m = [NSMutableString stringWithCapacity: 2000]; [self certInfo: crts[i] to: m]; NSLog(@"%@", m); } } } [certificateListLock lock]; [certificateListCache setObject: l forKey: l->path]; [certificateListLock unlock]; } return [l autorelease]; } - (gnutls_x509_crt_t*) certificateList { return crts; } - (unsigned int) count { return count; } - (NSDate*) expiresAt { unsigned index = count; time_t expiret; if (index-- == 0) { return nil; } expiret = gnutls_x509_crt_get_expiration_time(crts[index]); if (expiret < 0) { return nil; } while (index > 0) { time_t t = gnutls_x509_crt_get_expiration_time(crts[--index]); if (t < 0) { return nil; } if (t < expiret) { expiret = t; } } return [NSDate dateWithTimeIntervalSince1970: expiret]; } - (NSDate*) expiresAt: (unsigned)index { time_t expiret; if (count == 0 || index > count - 1) { return nil; } expiret = gnutls_x509_crt_get_expiration_time(crts[index]); if (expiret < 0) { return nil; } else { return [NSDate dateWithTimeIntervalSince1970: expiret]; } } - (void) dealloc { if (nil != path) { DESTROY(path); if (count > 0) { while (count-- > 0) { if (crts) gnutls_x509_crt_deinit(crts[count]); } if (crts) free(crts); } } [super dealloc]; } @end @implementation GSTLSPrivateKey static NSLock *privateKeyLock = nil; static NSMutableDictionary *privateKeyCache0 = nil; static NSMutableDictionary *privateKeyCache1 = nil; /* Method to purge older keys from cache. */ + (void) housekeeping: (NSNotification*)n { NSEnumerator *outer; NSString *oKey; NSTimeInterval now; now = [NSDate timeIntervalSinceReferenceDate]; [privateKeyLock lock]; outer = [[privateKeyCache0 allKeys] objectEnumerator]; while (nil != (oKey = [outer nextObject])) { GSTLSPrivateKey *key; key = [privateKeyCache0 objectForKey: oKey]; if (now - key->when > 300.0) { [privateKeyCache0 removeObjectForKey: oKey]; } } outer = [[privateKeyCache1 allKeys] objectEnumerator]; while (nil != (oKey = [outer nextObject])) { NSMutableDictionary *m; NSEnumerator *inner; NSString *iKey; m = [privateKeyCache1 objectForKey: oKey]; inner = [[m allKeys] objectEnumerator]; while (nil != (iKey = [inner nextObject])) { GSTLSPrivateKey *key = [m objectForKey: iKey]; if (now - key->when > 300.0) { [m removeObjectForKey: iKey]; if (0 == [m count]) { [privateKeyCache1 removeObjectForKey: oKey]; } } } } [privateKeyLock unlock]; } + (void) initialize { if (nil == privateKeyLock) { privateKeyLock = [NSLock new]; [[NSObject leakAt: &privateKeyLock] release]; privateKeyCache0 = [NSMutableDictionary new]; [[NSObject leakAt: &privateKeyCache0] release]; privateKeyCache1 = [NSMutableDictionary new]; [[NSObject leakAt: &privateKeyCache1] release]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(housekeeping:) name: @"GSHousekeeping" object: nil]; } } + (GSTLSPrivateKey*) keyFromFile: (NSString*)f withPassword: (NSString*)p { GSTLSPrivateKey *k; if (nil == f) { return nil; } f = standardizedPath(f); [privateKeyLock lock]; if (nil == p) { k = [privateKeyCache0 objectForKey: f]; } else { NSMutableDictionary *m; m = [privateKeyCache1 objectForKey: f]; if (nil == m) { k = nil; } else { k = [m objectForKey: p]; } } [k retain]; [privateKeyLock unlock]; if (nil == k) { NSData *data; int ret; gnutls_datum_t datum; data = [[self class] dataForTLSFile: f]; if (nil == data) { NSLog(@"Unable to read private key file '%@'", f); return nil; } datum.data = (unsigned char*)[data bytes]; datum.size = (unsigned int)[data length]; k = [self alloc]; k->when = [NSDate timeIntervalSinceReferenceDate]; k->path = [f copy]; k->password = [p copy]; gnutls_x509_privkey_init(&k->key); #ifdef HAVE_GNUTLS_X509_PRIVKEY_IMPORT2 /* This function can read openssl proprietory key format, * and uses the password if supplied. */ ret = gnutls_x509_privkey_import2(k->key, &datum, GNUTLS_X509_FMT_PEM, [k->password UTF8String], 0); #else if (nil == k->password) { ret = gnutls_x509_privkey_import(k->key, &datum, GNUTLS_X509_FMT_PEM); } else { ret = gnutls_x509_privkey_import_pkcs8(k->key, &datum, GNUTLS_X509_FMT_PEM, [k->password UTF8String], 0); } #endif if (ret < 0) { NSLog(@"Unable to parse private key file '%@': %s", k->path, gnutls_strerror(ret)); [k release]; return nil; } [privateKeyLock lock]; if (nil == k->password) { [privateKeyCache0 setObject: k forKey: k->path]; } else { NSMutableDictionary *m; m = [privateKeyCache1 objectForKey: f]; if (nil == m) { m = [NSMutableDictionary new]; [privateKeyCache1 setObject: m forKey: f]; [m release]; } [m setObject: k forKey: p]; } [privateKeyLock unlock]; } return [k autorelease]; } - (void) dealloc { if (nil != path) { DESTROY(path); DESTROY(password); gnutls_x509_privkey_deinit(key); } [super dealloc]; } - (gnutls_x509_privkey_t) key { return key; } @end @implementation GSTLSCredentials static NSLock *credentialsLock = nil; static NSMutableDictionary *credentialsCache = nil; /* Method to purge older credentials from cache. */ + (void) housekeeping: (NSNotification*)n { NSEnumerator *enumerator; NSDictionary *key; NSTimeInterval now; now = [NSDate timeIntervalSinceReferenceDate]; [credentialsLock lock]; enumerator = [[credentialsCache allKeys] objectEnumerator]; while (nil != (key = [enumerator nextObject])) { GSTLSCredentials *cred; cred = [credentialsCache objectForKey: key]; if (now - cred->when > 300.0) { [credentialsCache removeObjectForKey: key]; } } [credentialsLock unlock]; } + (void) initialize { if (nil == credentialsLock) { credentialsLock = [NSLock new]; [[NSObject leakAt: &credentialsLock] release]; credentialsCache = [NSMutableDictionary new]; [[NSObject leakAt: &credentialsCache] release]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(housekeeping:) name: @"GSHousekeeping" object: nil]; } } + (GSTLSCredentials*) selfSigned: (BOOL)debug { NSString *crtPath = standardizedPath(@"self-signed-crt"); NSString *keyPath = standardizedPath(@"self-signed-key"); NSData *crt = [self dataForTLSFile: crtPath]; NSData *key = [self dataForTLSFile: keyPath]; if (nil == crt || nil == key) { ENTER_POOL static NSString *tmp = @"organization = SelfSigned\n" @"state = Example\n" @"country = EX\n" @"cn = SelfSigned\n" @"serial = 007\n" @"expiration_days = 730\n" @"dns_name = server.selfsigned.com\n" @"tls_www_server\n" @"encryption_key\n"; NSFileManager *mgr = [NSFileManager defaultManager]; NSString *path = NSTemporaryDirectory(); NSFileHandle *devNull = [NSFileHandle fileHandleWithNullDevice]; NSTask *task; NSString *tmpCrt; NSString *tmpKey; NSString *tmpTmp; path = [path stringByAppendingPathComponent: [[NSUUID UUID] UUIDString]]; tmpCrt = [path stringByAppendingPathExtension: @"crt"]; tmpKey = [path stringByAppendingPathExtension: @"key"]; tmpTmp = [path stringByAppendingPathExtension: @"tmp"]; [tmp writeToFile: tmpTmp atomically: NO]; task = [NSTask new]; [task setLaunchPath: @"certtool"]; [task setArguments: [NSArray arrayWithObjects: @"--generate-privkey", @"--sec-param", @"high", @"--outfile", tmpKey, nil]]; [task setStandardOutput: devNull]; [task setStandardError: devNull]; [task launch]; [task waitUntilExit]; RELEASE(task); key = [NSData dataWithContentsOfFile: tmpKey]; task = [NSTask new]; [task setLaunchPath: @"certtool"]; [task setArguments: [NSArray arrayWithObjects: @"--generate-self-signed", @"--load-privkey", tmpKey, @"--template", tmpTmp, @"--outfile", tmpCrt, nil]]; [task setStandardOutput: devNull]; [task setStandardError: devNull]; [task launch]; [task waitUntilExit]; RELEASE(task); crt = [NSData dataWithContentsOfFile: tmpCrt]; [mgr removeFileAtPath: tmpCrt handler: nil]; [mgr removeFileAtPath: tmpKey handler: nil]; [mgr removeFileAtPath: tmpTmp handler: nil]; if (key && crt) { [self setData: crt forTLSFile: crtPath]; [self setData: key forTLSFile: keyPath]; } LEAVE_POOL if (nil == key) { NSLog(@"Failed to make self-signed certificate key using 'certtool'"); return nil; } if (nil == crt) { NSLog(@"Failed to make self-signed certificate using 'certtool'"); return nil; } } return [self credentialsFromCAFile: nil defaultCAFile: nil revokeFile: nil defaultRevokeFile: nil certificateFile: crtPath certificateKeyFile: keyPath certificateKeyPassword: nil asClient: NO debug: debug]; } + (GSTLSCredentials*) credentialsFromCAFile: (NSString*)ca defaultCAFile: (NSString*)dca revokeFile: (NSString*)rv defaultRevokeFile: (NSString*)drv certificateFile: (NSString*)cf certificateKeyFile: (NSString*)ck certificateKeyPassword: (NSString*)cp asClient: (BOOL)client debug: (BOOL)debug { GSTLSCredentials *c; NSMutableString *k; /* Build a unique key for the credentials based on all the * information used to build them (apart from password used * to load the key). */ k = [NSMutableString stringWithCapacity: 1024]; ca = standardizedPath(ca); if (nil != ca) [k appendString: ca]; [k appendString: @":"]; if (nil != dca) [k appendString: dca]; [k appendString: @":"]; rv = standardizedPath(rv); if (nil != rv) [k appendString: rv]; [k appendString: @":"]; if (nil != drv) [k appendString: drv]; [k appendString: @":"]; if (nil != cf) [k appendString: cf]; [k appendString: @":"]; if (nil != ck) [k appendString: ck]; [credentialsLock lock]; c = [credentialsCache objectForKey: k]; if (nil != c) { [c retain]; if (YES == debug) { NSLog(@"Re-used credentials %p for '%@'", c, k); } } [credentialsLock unlock]; if (nil == c) { c = [self new]; c->name = [k copy]; c->when = [NSDate timeIntervalSinceReferenceDate]; gnutls_certificate_allocate_credentials(&c->certcred); c->freeCred = YES; // Need to free on dealloc /* Set the default trusted authority certificates. */ if ([dca length] > 0) { const char *path; int ret; path = [dca gnutlsFileSystemRepresentation]; ret = gnutls_certificate_set_x509_trust_file(c->certcred, path, GNUTLS_X509_FMT_PEM); if (ret < 0) { NSLog(@"Problem loading trusted authorities from %@: %s", dca, gnutls_strerror(ret)); } else { if (ret > 0) { c->trust = YES; // Loaded at least one trusted CA } if (YES == debug) { NSLog(@"Default trusted authorities (from %@): %d", dca, ret); } } } /* Load any specified trusted authority certificates. */ if ([ca length] > 0) { const char *path; int ret; path = [dca gnutlsFileSystemRepresentation]; ret = gnutls_certificate_set_x509_trust_file(c->certcred, path, GNUTLS_X509_FMT_PEM); if (ret < 0) { NSLog(@"Problem loading trusted authorities from %@: %s", ca, gnutls_strerror(ret)); } else { if (ret > 0) { c->trust = YES; } else if (0 == ret) { NSLog(@"No certificates processed from %@", ca); } if (YES == debug) { NSLog(@"Trusted authorities (from %@): %d", ca, ret); } } } /* Load default revocation list. */ if ([drv length] > 0) { const char *path; int ret; path = [drv gnutlsFileSystemRepresentation]; ret = gnutls_certificate_set_x509_crl_file(c->certcred, path, GNUTLS_X509_FMT_PEM); if (ret < 0) { NSLog(@"Problem loading default revocation list from %@: %s", drv, gnutls_strerror(ret)); } else { if (YES == debug) { NSLog(@"Default revocations (from %@): %d", drv, ret); } } } /* Load any specified revocation list. */ if ([rv length] > 0) { const char *path; int ret; path = [rv gnutlsFileSystemRepresentation]; ret = gnutls_certificate_set_x509_crl_file(c->certcred, path, GNUTLS_X509_FMT_PEM); if (ret < 0) { NSLog(@"Problem loading revocation list from %@: %s", rv, gnutls_strerror(ret)); } else { if (0 == ret) { NSLog(@"No revocations processed from %@", rv); } if (YES == debug) { NSLog(@"Revocations (from %@): %d", rv, ret); } } } /* Get the key for our certificate .. if one is specified. */ if (nil != ck) { c->key = [[GSTLSPrivateKey keyFromFile: ck withPassword: cp] retain]; if (nil == c->key) { [c release]; return nil; } } /* Load our certificate (may be a list) if the file is specified. */ if (nil != cf) { c->list = [[GSTLSCertificateList listFromFile: cf] retain]; if (nil == c->list) { [c release]; return nil; } } /* If we have loaded a certificate, we add it to the credentials * using the certificate key so we can use it. */ if (nil != c->list) { int ret; ret = gnutls_certificate_set_x509_key(c->certcred, [c->list certificateList], [c->list count], [c->key key]); if (ret < 0) { c->freeCred = NO; // Already freed NSLog(@"Unable to set certificate for session: %s", gnutls_strerror(ret)); [c release]; return nil; } /* if (NO == client) { // FIXME ... if the server certificate required DH params ... c->dhParams = [[GSTLSDHParams current] retain]; gnutls_certificate_set_dh_params(c->certcred, [c->dhParams params]); } */ } if (YES == debug) { NSLog(@"%@ created credentials %p for '%@'", self, c, k); } [credentialsLock lock]; [credentialsCache setObject: c forKey: c->name]; [credentialsLock unlock]; } return [c autorelease]; } - (void) dealloc { if (nil != name) { if (YES == freeCred) { gnutls_certificate_free_credentials(certcred); } DESTROY(key); DESTROY(list); DESTROY(dhParams); DESTROY(name); } [super dealloc]; } - (gnutls_certificate_credentials_t) credentials { return certcred; } - (GSTLSPrivateKey*) key { return key; } - (GSTLSCertificateList*) list { return list; } - (BOOL) trust { return trust; } @end #if GNUTLS_VERSION_NUMBER >= 0x020C00 /* Callback used only when debug is enabled, to print the request for a * certificate and the response to that request. * NB. This function always returns the certificate set for the session * even if that certificate does not match the CAs or algorithms requested * by the server. This differs from the default behavior which is for the * library code to only return a certificate matching the request. * So, the logging of a returned certificate does not guarantee that the * certificate is acceptable to the server. */ static int retrieve_callback(gnutls_session_t session, const gnutls_datum_t *req_ca_rdn, int nreqs, const gnutls_pk_algorithm_t *sign_algos, int sign_algos_length, gnutls_retr2_st *st) { GSTLSSession *s = gnutls_session_get_ptr(session); char issuer_dn[256]; int i; int ret; size_t len; /* Print the server's trusted CAs */ if (nreqs > 0) NSLog(@"- Server's trusted authorities:"); else NSLog(@"- Server did not send us any trusted authorities names."); /* print the names (if any) */ for (i = 0; i < nreqs; i++) { len = sizeof(issuer_dn); ret = gnutls_x509_rdn_get(&req_ca_rdn[i], issuer_dn, &len); if (ret >= 0) { NSLog(@" [%d]: %s", i, issuer_dn); } } /* Select a certificate and return it. * The certificate must be of any of the "sign algorithms" * supported by the server. */ if (gnutls_certificate_type_get(session) == GNUTLS_CRT_X509) { GSTLSCredentials *credentials = [s credentials]; GSTLSPrivateKey *key = [credentials key]; GSTLSCertificateList *list = [credentials list]; int count = (int)[list count]; gnutls_x509_crt_t *crts = [list certificateList]; NSMutableString *m; m = [NSMutableString stringWithCapacity: 2000]; for (i = 0; i < count; i++) { [GSTLSCertificateList certInfo: crts[i] to: m]; } if (0 == count) { [m appendString: @"None."]; } NSLog(@"Certificates retrieved for sending to peer -\n%@", m); st->cert_type = GNUTLS_CRT_X509; st->ncerts = count; st->cert.x509 = crts; st->key.x509 = [key key]; return 0; } else { NSLog(@"Certificates retrieved for sending to peer -\n" @"None: not a request for an X509 certificate."); return -1; } } #endif @implementation GSTLSSession + (GSTLSSession*) sessionWithOptions: (NSDictionary*)options direction: (BOOL)isOutgoing transport: (void*)ioHandle push: (GSTLSIOW)pushFunc pull: (GSTLSIOR)pullFunc { GSTLSSession *sess; sess = [[self alloc] initWithOptions: options direction: isOutgoing transport: ioHandle push: pushFunc pull: pullFunc]; return [sess autorelease]; } - (BOOL) active { return active; } - (NSTimeInterval) age { return [NSDate timeIntervalSinceReferenceDate] - created; } - (GSTLSCredentials*) credentials { return credentials; } - (void) dealloc { [self finalize]; DESTROY(opts); DESTROY(credentials); DESTROY(problem); DESTROY(issuer); DESTROY(owner); [super dealloc]; } - (BOOL) debug { return debug; } - (BOOL) disconnect: (BOOL)reusable { BOOL ok = YES; if (YES == active || YES == handshake) { int result; active = NO; handshake = NO; if (NO == reusable) { /* Since the connection is not reusable, we need only try once. */ result = gnutls_bye(session, GNUTLS_SHUT_WR); } else { NSTimeInterval start; /* Attempting to do a clean shutdown on a reusable connection, * so we keep retrying for a little while to let the other end * close down cleanly. */ start = [NSDate timeIntervalSinceReferenceDate]; do { result = gnutls_bye(session, GNUTLS_SHUT_RDWR); } while ((GNUTLS_E_AGAIN == result || GNUTLS_E_INTERRUPTED == result) && ([NSDate timeIntervalSinceReferenceDate] - start) < 10.0); } if (result < 0) { ok = NO; } } if (YES == setup) { setup = NO; gnutls_db_remove_session(session); gnutls_deinit(session); } return ok; } - (void) finalize { [self disconnect: NO]; [super finalize]; } - (id) initWithOptions: (NSDictionary*)options direction: (BOOL)isOutgoing transport: (void*)ioHandle push: (GSTLSIOW)pushFunc pull: (GSTLSIOR)pullFunc { if (nil != (self = [super init])) { GSTLSCredentials *cr; NSString *ca; NSString *dca; NSString *rv; NSString *drv; NSString *cf; NSString *ck; NSString *cp; NSString *pri; NSString *str; BOOL trust; BOOL verify; /* Set this early because it is needed in debug output during init. */ handle = ioHandle; created = [NSDate timeIntervalSinceReferenceDate]; opts = [options copy]; outgoing = isOutgoing ? YES : NO; if (YES == outgoing) { verify = verifyServer; // Verify connection to remote server } else { verify = verifyClient; // Verify certificate of remote client } str = [opts objectForKey: GSTLSVerify]; if (nil != str) { verify = [str boolValue]; } debug = (globalDebug > 0) ? YES : NO; if (NO == debug) { debug = [[opts objectForKey: GSTLSDebug] boolValue]; } /* Now initialise session and set it up. It's simplest to always * allocate a credentials structure at this point (and get rid of * it when the session is disconnected) too. */ if (YES == outgoing) { gnutls_init(&session, GNUTLS_CLIENT); str = [opts objectForKey: GSTLSServerName]; if ([str length] > 0) { const char *ptr = [str UTF8String]; unsigned len = strlen(ptr); int ret; ret = gnutls_server_name_set(session, GNUTLS_NAME_DNS, ptr, len); if (YES == debug) { if (ret < 0) { NSLog(@"%p %@: failed '%s'", handle, GSTLSServerName, gnutls_strerror(ret)); } else { NSLog(@"%p %@: set to '%s'", handle, GSTLSServerName, ptr); } } } else if (YES == debug) { NSLog(@"%p %@: not set", handle, GSTLSServerName); } } else { gnutls_init(&session, GNUTLS_SERVER); if (NO == verify) { /* We don't want to demand/verify the client certificate, * but we still ask the other end to send it so that higher * level code can see what distinguished names are in it. */ gnutls_certificate_server_set_request(session, GNUTLS_CERT_REQUEST); } else { /* We request the client certificate and require them client * end to send it (if not, we don't allow the session). */ gnutls_certificate_server_set_request(session, GNUTLS_CERT_REQUIRE); } } setup = YES; cf = [opts objectForKey: GSTLSCertificateFile]; if (nil == cf && NO == outgoing) { /* Server with no certiticate supplied: generate self signed one. */ cr = [GSTLSCredentials selfSigned: debug]; } else { ca = [opts objectForKey: GSTLSCAFile]; dca = caFile; rv = [opts objectForKey: GSTLSRevokeFile]; drv = revokeFile; ck = [opts objectForKey: GSTLSCertificateKeyFile]; cp = [opts objectForKey: GSTLSCertificateKeyPassword]; cr = [GSTLSCredentials credentialsFromCAFile: ca defaultCAFile: dca revokeFile: rv defaultRevokeFile: drv certificateFile: cf certificateKeyFile: ck certificateKeyPassword: cp asClient: outgoing debug: debug]; } if (cr) { ASSIGN(credentials, cr); } else { RELEASE(self); return nil; } trust = [credentials trust]; if (YES == verify && NO == trust) { NSLog(@"You have requested that a TLS/SSL connection be to a remote" @" system with a verified certificate, but have provided no trusted" @" certificate authorities."); NSLog(@"If you did not use the GSTLSCAFile option to specify a file" @" containing certificate authorities for a session, and did not" @" specify a default file using the GSTLSCAFile user default or" @" the GS_TLS_CA_FILE environment variable, then the system will" @" have attempted to use the GSTLS/ca-certificates.crt file in the" @" gnustep-base resource bundle. Unfortunately, it has not been" @" possible to read any trusted certificate authorities from" @" these locations."); } pri = [opts objectForKey: NSStreamSocketSecurityLevelKey]; str = [opts objectForKey: GSTLSPriority]; if (nil == pri && nil == str) { str = priority; // Default setting } if (YES == [str isEqual: @"SSLv3"]) { pri = NSStreamSocketSecurityLevelSSLv3; str = nil; } else if (YES == [str isEqual: @"TLSv1"]) { pri = NSStreamSocketSecurityLevelTLSv1; str = nil; } if (nil == str) { if ([pri isEqual: NSStreamSocketSecurityLevelNone] == YES) { // pri = NSStreamSocketSecurityLevelNone; GSOnceMLog(@"NSStreamSocketSecurityLevelNone is insecure ..." @" not implemented"); DESTROY(self); return nil; } else if ([pri isEqual: NSStreamSocketSecurityLevelSSLv2] == YES) { // pri = NSStreamSocketSecurityLevelSSLv2; GSOnceMLog(@"NSStreamSocketSecurityLevelSSLv2 is insecure ..." @" not implemented"); DESTROY(self); return nil; } else if ([pri isEqual: NSStreamSocketSecurityLevelSSLv3] == YES) { #if GNUTLS_VERSION_NUMBER < 0x020C00 const int proto_prio[2] = { GNUTLS_SSL3, 0 }; gnutls_protocol_set_priority(session, proto_prio); #else gnutls_priority_set_direct(session, "NORMAL:-VERS-TLS-ALL:+VERS-SSL3.0", NULL); #endif GSOnceMLog(@"NSStreamSocketSecurityLevelSSLv3 is insecure ..." @" please change your code to stop using it"); } else if ([pri isEqual: NSStreamSocketSecurityLevelTLSv1] == YES) { #if GNUTLS_VERSION_NUMBER < 0x020C00 const int proto_prio[4] = { #if defined(GNUTLS_TLS1_2) GNUTLS_TLS1_2, #endif GNUTLS_TLS1_1, GNUTLS_TLS1_0, 0 }; gnutls_protocol_set_priority(session, proto_prio); #else gnutls_priority_set_direct(session, "NORMAL:-VERS-SSL3.0:+VERS-TLS-ALL", NULL); #endif } else { #if GNUTLS_VERSION_NUMBER < 0x020C00 gnutls_set_default_priority(session); #else /* By default we disable SSL3.0 as the 'POODLE' attack (Oct 2014) * renders it insecure. */ gnutls_priority_set_direct(session, "NORMAL:-VERS-SSL3.0", NULL); #endif } } else { #if GNUTLS_VERSION_NUMBER < 0x020C00 gnutls_set_default_priority(session); #else /* By default we disable SSL3.0 as the 'POODLE' attack (Oct 2014) * renders it insecure. */ const char *err_pos; if (gnutls_priority_set_direct(session, [str UTF8String], &err_pos)) { NSLog(@"Invalid GSTLSPriority: %s", err_pos); NSLog(@"Falling back to NORMAL:-VERS-SSL3.0"); gnutls_priority_set_direct(session, "NORMAL:-VERS-SSL3.0", NULL); } #endif } /* Set certificate credentials for this session. */ gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, [credentials credentials]); #if GNUTLS_VERSION_NUMBER >= 0x020C00 if (YES == outgoing && YES == debug) { /* Set a callback to log handling of a request (from the server) * for the client certificate. The callback always returns the * certificate set for this session, even if that does not match * the server's request. */ gnutls_certificate_set_retrieve_function( [credentials credentials], retrieve_callback); } #endif /* Set transport layer to use */ #if GNUTLS_VERSION_NUMBER < 0x020C00 gnutls_transport_set_lowat(session, 0); #endif gnutls_transport_set_pull_function(session, pullFunc); gnutls_transport_set_push_function(session, pushFunc); gnutls_transport_set_ptr(session, (gnutls_transport_ptr_t)ioHandle); gnutls_session_set_ptr(session, (void*)self); } return self; } - (BOOL) handshake { int ret; if (YES == active || NO == setup) { return YES; // Handshake completed or impossible. } handshake = YES; ret = gnutls_handshake(session); if (ret < 0) { if (gnutls_error_is_fatal(ret)) { NSString *p; p = [NSString stringWithFormat: @"%s", gnutls_strerror(ret)]; /* We want to differentiate between errors which are usually * due to the remote end not expecting to be using TLS/SSL, * and errors which are caused by other interoperability * issues. The first sort are not normally worth reporting. */ if (ret == GNUTLS_E_UNEXPECTED_PACKET_LENGTH || ret == GNUTLS_E_FATAL_ALERT_RECEIVED || ret == GNUTLS_E_DECRYPTION_FAILED #ifdef GNUTLS_E_PREMATURE_TERMINATION || ret == GNUTLS_E_PREMATURE_TERMINATION #endif || ret == GNUTLS_E_UNSUPPORTED_VERSION_PACKET) { NSString *extra = nil; switch (ret) { case GNUTLS_E_FATAL_ALERT_RECEIVED: extra = @"The TLS protocol does not tell us why the remote" @" end sent an alert, but the most common problem during" @" handshake is a cipher mismatch"; break; case GNUTLS_E_UNEXPECTED_PACKET_LENGTH: case GNUTLS_E_PREMATURE_TERMINATION: extra = @"Most often this is due to the remote end not" @" expecting/supporting TLS"; break; } if (extra) { p = [p stringByAppendingFormat: @"\n%@", extra]; } ASSIGN(problem, p); if (YES == debug) { NSLog(@"%p in handshake: %@", handle, p); } } else { ASSIGN(problem, p); NSLog(@"%p in handshake: %@", handle, p); } [self disconnect: NO]; return YES; // Failed ... not active. } else { return NO; // Non-fatal error needs a retry. } } else { NSString *str; BOOL shouldVerify = NO; active = YES; // The TLS session is now active. handshake = NO; // Handshake is over. if (YES == outgoing) { shouldVerify = verifyServer; // Verify remote server certificate? } else { shouldVerify = verifyClient; // Verify remote client certificate? } str = [opts objectForKey: GSTLSVerify]; if (nil != str) { shouldVerify = [str boolValue]; } if (globalDebug > 1) { NSLog(@"%p trying verify:\n%@", handle, [self sessionInfo]); } ret = [self verify]; if (ret < 0) { if (globalDebug > 1 || (YES == shouldVerify && globalDebug > 0) || YES == [[opts objectForKey: GSTLSDebug] boolValue]) { NSLog(@"%p unable to verify SSL connection - %s", handle, gnutls_strerror(ret)); NSLog(@"%p %@", handle, [self sessionInfo]); } if (YES == shouldVerify) { [self disconnect: NO]; } } else { if (globalDebug > 1) { NSLog(@"%p succeeded verify:\n%@", handle, [self sessionInfo]); } } return YES; // Handshake complete } } - (NSString*) issuer { return issuer; } - (NSString*) owner { return owner; } - (size_t) pending { return gnutls_record_check_pending(session); } - (NSString*) problem { return problem; } - (NSInteger) read: (void*)buf length: (NSUInteger)len { int result = gnutls_record_recv(session, buf, len); if (result < 0) { NSString *p; if (GNUTLS_E_AGAIN == result) { errno = EAGAIN; // Need to retry. } else if (GNUTLS_E_INTERRUPTED == result) { errno = EINTR; // Need to retry } else if (gnutls_error_is_fatal(result)) { p = [NSString stringWithFormat: @"%s", gnutls_strerror(result)]; ASSIGN(problem, p); if (YES == debug) { NSLog(@"%p in tls read: %@", handle, p); } if (EAGAIN == errno || EINTR == errno) { errno = EBADF; // Fatal ... don't retry } } else { if (GNUTLS_E_WARNING_ALERT_RECEIVED == result) { if (YES == debug) { p = [NSString stringWithFormat: @"%s", gnutls_alert_get_name(gnutls_alert_get(session))]; NSLog(@"%p in tls read: %@", handle, p); } } errno = EAGAIN; // Need to retry. } result = -1; #if defined(_WIN32) /* Windows specific code expects to use winsock functions for error * codes rather than looking at errno, so we must translate a few. */ if (EAGAIN == errno) WSASetLastError(WSAEWOULDBLOCK); else if (EINTR == errno) WSASetLastError(WSAEINTR); else WSASetLastError(errno); #endif } return result; } - (NSInteger) write: (const void*)buf length: (NSUInteger)len { int result = gnutls_record_send(session, buf, len); if (result < 0) { if (GNUTLS_E_AGAIN == result) { errno = EAGAIN; // Need to retry. } else if (GNUTLS_E_INTERRUPTED == result) { errno = EINTR; // Need to retry } else if (gnutls_error_is_fatal(result)) { NSString *p; p = [NSString stringWithFormat: @"%s", gnutls_strerror(result)]; ASSIGN(problem, p); if (YES == debug) { NSLog(@"%p in tls write: %@", handle, p); } if (EAGAIN == errno || EINTR == errno) { errno = EBADF; // Fatal ... don't retry } } else { errno = EAGAIN; // Need to retry. } result = -1; #if defined(_WIN32) /* Windows specific code expects to use winsock functions for error * codes rather than looking at errno, so we must translate a few. */ if (EAGAIN == errno) WSASetLastError(WSAEWOULDBLOCK); else if (EINTR == errno) WSASetLastError(WSAEINTR); else WSASetLastError(errno); #endif } return result; } /* Copied/based on the public domain code provided by gnutls * to print the session ... I've left in details for features * we don't yet support. */ - (NSString*) sessionInfo { NSMutableString *str; const char *tmp; gnutls_credentials_type_t cred; gnutls_kx_algorithm_t kx; int dhe = 0; #if defined(XXX_ECDH) /* At some point we may want to implement ecdh */ int ecdh = 0; #endif str = [NSMutableString stringWithCapacity: 2000]; /* get the key exchange's algorithm name */ kx = gnutls_kx_get(session); tmp = gnutls_kx_get_name(kx); [str appendFormat: _(@"- Key Exchange: %s\n"), tmp]; /* Check the authentication type used and switch to the appropriate. */ cred = gnutls_auth_get_type(session); switch (cred) { case GNUTLS_CRD_IA: [str appendString: _(@"- TLS/IA session\n")]; break; case GNUTLS_CRD_SRP: #ifdef ENABLE_SRP [str appendFormat: _(@"- SRP session with username %s\n"), gnutls_srp_server_get_username(session)]; #endif break; case GNUTLS_CRD_PSK: #if 0 /* This returns NULL in server side. */ if (gnutls_psk_client_get_hint(session) != NULL) { [str appendFormat: _(@"- PSK authentication. PSK hint '%s'\n"), gnutls_psk_client_get_hint(session)]; } /* This returns NULL in client side. */ if (gnutls_psk_server_get_username(session) != NULL) { [str appendFormat: _(@"- PSK authentication. Connected as '%s'\n"), gnutls_psk_server_get_username(session)]; } if (GNUTLS_KX_ECDHE_PSK == kx) { ecdh = 1; } else if (GNUTLS_KX_DHE_PSK == kx) { dhe = 1; } #endif break; case GNUTLS_CRD_ANON: /* anonymous authentication */ #if 0 [str appendFormat: _(@"- Anonymous authentication.\n")]; if (GNUTLS_KX_ANON_ECDH == kx) { ecdh = 1; } else if (GNUTLS_KX_ANON_DH == kx) { dhe = 1; } #endif break; case GNUTLS_CRD_CERTIFICATE: /* certificate authentication */ /* Check if we have been using ephemeral Diffie-Hellman. */ if (GNUTLS_KX_DHE_RSA == kx || GNUTLS_KX_DHE_DSS == kx) { dhe = 1; } #if defined(XXX_ECDH) if (GNUTLS_KX_ECDHE_RSA == kx || GNUTLS_KX_ECDHE_ECDSA == kx) { dhe = 0; ecdh = 1; } #endif tmp = gnutls_certificate_type_get_name( gnutls_certificate_type_get(session)); [str appendFormat: _(@"- Authentication using certificate type: %s\n"), tmp]; break; } /* switch */ #if defined(XXXECDH) if (ecdh != 0) { [str appendFormat: _(@"- Ephemeral ECDH using curve %s\n"), gnutls_ecc_curve_get_name(gnutls_ecc_curve_get(session))]; } #endif if (dhe != 0) { [str appendFormat: _(@"- Ephemeral DH using prime of %d bits\n"), gnutls_dh_get_prime_bits(session)]; } /* print the protocol's name (eg TLS 1.0) */ tmp = gnutls_protocol_get_name(gnutls_protocol_get_version(session)); [str appendFormat: _(@"- Protocol: %s\n"), tmp]; /* print the certificates of the peer. */ if (gnutls_certificate_type_get(session) == GNUTLS_CRT_X509) { unsigned int cert_list_size = 0; const gnutls_datum_t *cert_list; gnutls_x509_crt_t cert; cert_list = gnutls_certificate_get_peers(session, &cert_list_size); if (0 == cert_list_size) { [str appendString: _(@"- Peer provided no certificate.\n")]; } else { int cert_num; for (cert_num = 0; cert_num < cert_list_size; cert_num++) { gnutls_x509_crt_init(&cert); /* NB. the list of peer certificate is in memory in native * format (DER) rather than the normal file format (PEM). */ gnutls_x509_crt_import(cert, &cert_list[cert_num], GNUTLS_X509_FMT_DER); [str appendFormat: _(@"- Certificate %d info:\n"), cert_num]; [GSTLSCertificateList certInfo: cert to: str]; gnutls_x509_crt_deinit(cert); } } } else { tmp = gnutls_certificate_type_get_name( gnutls_certificate_type_get(session)); [str appendFormat: _(@"- Certificate Type: %s\n"), tmp]; } /* print the name of the cipher used. * eg 3DES. */ tmp = gnutls_cipher_get_name(gnutls_cipher_get(session)); [str appendFormat: _(@"- Cipher: %s\n"), tmp]; /* Print the MAC algorithms name. * eg SHA1 */ tmp = gnutls_mac_get_name(gnutls_mac_get(session)); [str appendFormat: _(@"- MAC: %s\n"), tmp]; return str; } - (int) verify { NSArray *names; NSString *str; unsigned int status; const gnutls_datum_t *cert_list; unsigned int cert_list_size; int ret; gnutls_x509_crt_t cert; /* This verification function uses the trusted CAs in the credentials * structure. So you must have installed one or more CA certificates. */ ret = gnutls_certificate_verify_peers2(session, &status); if (ret < 0) { str = [NSString stringWithFormat: @"TLS verification: error %s", gnutls_strerror(ret)]; ASSIGN(problem, str); if (YES == debug) NSLog(@"%p %@", handle, problem); return GNUTLS_E_CERTIFICATE_ERROR; } if (YES == debug) { if (status & GNUTLS_CERT_SIGNER_NOT_FOUND) NSLog(@"%p TLS verification: certificate hasn't got a known issuer.", handle); if (status & GNUTLS_CERT_REVOKED) NSLog(@"%p TLS verification: certificate has been revoked.", handle); #if defined(GNUTLS_CERT_EXPIRED) if (status & GNUTLS_CERT_EXPIRED) NSLog(@"%p TLS verification: certificate has expired", handle); #endif #if defined(GNUTLS_CERT_NOT_ACTIVATED) if (status & GNUTLS_CERT_NOT_ACTIVATED) NSLog(@"%p TLS verification: certificate is not yet activated", handle); #endif } if (status & GNUTLS_CERT_INVALID) { ASSIGN(problem, @"TLS verification: remote certificate is not trusted."); if (YES == debug) NSLog(@"%p %@", handle, problem); return GNUTLS_E_CERTIFICATE_ERROR; } /* Up to here the process is the same for X.509 certificates and * OpenPGP keys. From now on X.509 certificates are assumed. This can * be easily extended to work with openpgp keys as well. */ if (gnutls_certificate_type_get(session) != GNUTLS_CRT_X509) { ASSIGN(problem, @"TLS verification: remote certificate not of the X509 type."); if (YES == debug) NSLog(@"%p %@", handle, problem); return GNUTLS_E_CERTIFICATE_ERROR; } if (gnutls_x509_crt_init(&cert) < 0) { ASSIGN(problem, @"TLS verification: error in certificate initialization"); gnutls_x509_crt_deinit(cert); if (YES == debug) NSLog(@"%p %@", handle, problem); return GNUTLS_E_CERTIFICATE_ERROR; } cert_list = gnutls_certificate_get_peers(session, &cert_list_size); if (cert_list == NULL) { ASSIGN(problem, @"TLS verification: no certificate from remote end!"); gnutls_x509_crt_deinit(cert); if (YES == debug) NSLog(@"%p %@", handle, problem); return GNUTLS_E_CERTIFICATE_ERROR; } if (gnutls_x509_crt_import(cert, &cert_list[0], GNUTLS_X509_FMT_DER) < 0) { ASSIGN(problem, @"TLS verification: error parsing certificate"); gnutls_x509_crt_deinit(cert); if (YES == debug) NSLog(@"%p %@", handle, problem); return GNUTLS_E_CERTIFICATE_ERROR; } else { #if GNUTLS_VERSION_NUMBER >= 0x030507 gnutls_datum_t dn; if (GNUTLS_E_SUCCESS == gnutls_x509_crt_get_dn3(cert, &dn, 0)) { ASSIGN(owner, [NSString stringWithUTF8String: (const char*)dn.data]); gnutls_free(dn.data); } if (GNUTLS_E_SUCCESS == gnutls_x509_crt_get_issuer_dn3(cert, &dn, 0)) { ASSIGN(issuer, [NSString stringWithUTF8String: (const char*)dn.data]); gnutls_free(dn.data); } #else char dn[1024]; size_t dn_size; /* Get certificate owner and issuer */ dn_size = sizeof(dn)-1; gnutls_x509_crt_get_dn(cert, dn, &dn_size); dn[dn_size] = '\0'; ASSIGN(owner, [NSString stringWithUTF8String: dn]); dn_size = sizeof(dn)-1; gnutls_x509_crt_get_issuer_dn(cert, dn, &dn_size); dn[dn_size] = '\0'; ASSIGN(issuer, [NSString stringWithUTF8String: dn]); #endif } str = [opts objectForKey: GSTLSRemoteHosts]; if (nil == str) { names = nil; } else { /* The string is a comma separated list of permitted host names. */ names = [str componentsSeparatedByString: @","]; } if (nil != names) { NSEnumerator *enumerator = [names objectEnumerator]; BOOL found = NO; NSString *name; while (nil != (name = [enumerator nextObject])) { if (0 == gnutls_x509_crt_check_hostname(cert, [name UTF8String])) { found = YES; break; } } if (NO == found) { str = [NSString stringWithFormat: @"TLS verification: certificate's owner does not match '%@'", names]; ASSIGN(problem, str); gnutls_x509_crt_deinit(cert); if (YES == debug) NSLog(@"%p %@", handle, problem); return GNUTLS_E_CERTIFICATE_ERROR; } } gnutls_x509_crt_deinit(cert); names = [opts objectForKey: GSTLSIssuers]; if ([names isKindOfClass: [NSArray class]]) { if (nil == issuer || NO == [names containsObject: issuer]) { str = [NSString stringWithFormat: @"TLS verification: certificate's issuer does not match '%@'", names]; ASSIGN(problem, str); if (YES == debug) NSLog(@"%p %@", handle, problem); return GNUTLS_E_CERTIFICATE_ERROR; } } names = [opts objectForKey: GSTLSOwners]; if ([names isKindOfClass: [NSArray class]]) { if (nil == owner || NO == [names containsObject: owner]) { str = [NSString stringWithFormat: @"TLS verification: certificate's owner does not match '%@'", names]; ASSIGN(problem, str); if (YES == debug) NSLog(@"%p %@", handle, problem); return GNUTLS_E_CERTIFICATE_ERROR; } } return 0; // Verified } @end #endif gnustep-base-1.29.0/Source/GSTaskRegistry.h000066400000000000000000000011211435650067400205030ustar00rootroot00000000000000#ifndef INCLUDED_GSTASKREGISTRY_H #define INCLUDED_GSTASKREGISTRY_H #import "common.h" @class NSArray; @class NSURLSessionTask; /* * This helper class keeps track of all tasks. * * Each `NSURLSession` has a `GSTaskRegistry` for its running tasks. * * - Note: This must **only** be accessed on the owning session's work queue. */ @interface GSTaskRegistry : NSObject - (void ) addTask: (NSURLSessionTask*)task; - (void) removeTask: (NSURLSessionTask*)task; - (void) notifyOnTasksCompletion: (void (^)(void))tasksCompletion; - (NSArray*) allTasks; - (BOOL) isEmpty; @end #endif gnustep-base-1.29.0/Source/GSTaskRegistry.m000066400000000000000000000037501435650067400205220ustar00rootroot00000000000000#import "GSTaskRegistry.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSException.h" #import "Foundation/NSURLSession.h" @implementation GSTaskRegistry { NSMutableDictionary *_tasks; void (^_tasksCompletion)(void); } - (instancetype) init { if (nil != (self = [super init])) { _tasks = [[NSMutableDictionary alloc] init]; } return self; } - (void) dealloc { DESTROY(_tasks); [super dealloc]; } - (NSArray*) allTasks { return [_tasks allValues]; } - (BOOL) isEmpty { return [_tasks count] == 0; } - (void) notifyOnTasksCompletion: (void (^)(void))tasksCompletion { _tasksCompletion = tasksCompletion; } - (void) addTask: (NSURLSessionTask*)task { NSString *identifier; NSUInteger taskIdentifier; NSURLSessionTask *t; taskIdentifier = [task taskIdentifier]; NSAssert(taskIdentifier != 0, @"Invalid task identifier"); identifier = [NSString stringWithFormat: @"%lu", taskIdentifier]; if (nil != (t = [_tasks objectForKey: identifier])) { if ([t isEqual: task]) { NSAssert(NO, @"Trying to re-insert a task that's already in the registry."); } else { NSAssert(NO, @"Trying to insert a task, but a different task with the same" @" identifier is already in the registry."); } } [_tasks setObject: task forKey: identifier]; } - (void) removeTask: (NSURLSessionTask*)task { NSString *identifier; NSUInteger taskIdentifier; taskIdentifier = [task taskIdentifier]; NSAssert(taskIdentifier != 0, @"Invalid task identifier"); identifier = [NSString stringWithFormat: @"%lu", taskIdentifier]; if (nil == [_tasks objectForKey: identifier]) { NSAssert(NO, @"Trying to remove task, but it's not in the registry."); } [_tasks removeObjectForKey: identifier]; if (nil != _tasksCompletion && [self isEmpty]) { _tasksCompletion(); } } @end gnustep-base-1.29.0/Source/GSTimSort.m000066400000000000000000001034121435650067400174640ustar00rootroot00000000000000/* Implementation for the timsort sorting algorithm for GNUStep Copyright (C) 2012 Free Software Foundation, Inc. Written by: Niels Grewe Date: September 2012 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #import "Foundation/NSSortDescriptor.h" #import "Foundation/NSCoder.h" #import "Foundation/NSException.h" #import "Foundation/NSKeyValueCoding.h" #import "GNUstepBase/GSObjCRuntime.h" #import "GSPrivate.h" #import "GSSorting.h" /* * About this implementation. * * Timsort is a stable, adaptive hybrid of merge- and insertion-sort which * exploits existing structure in the data to be sorted, so that it takes * usually takes less than O(n*log(n)) comparisons for real world data. The * algorithm has been developed by Tim Peters and is described in [0]. * * This implementation takes inspiration both from the C implementation in * Python [1] and from the Java implementation in OpenJDK [2]. * * [0] http://svn.python.org/projects/python/trunk/Objects/listsort.txt * [1] http://svn.python.org/projects/python/trunk/Objects/listobject.c * [2] http://cr.openjdk.java.net/~martin/webrevs/openjdk7/timsort/raw_files/new/src/share/classes/java/util/TimSort.java */ #define GS_MIN_MERGE 32 #define GS_MIN_GALLOP 7 #define GS_INITIAL_TEMP_STORAGE 256 /* * Galloping from left searches for an insertion point for key into the * already sorted buffer and returns the point immediately left of the first * equal element. We can also use this function, and gallopRight(), its twin, to * implement -[NSArray indexOfObject:inSortedRange:options:usingComparator:]. * Since we want to do that, this implementation is a bit different than the one * in Python's listobject.c, since it takes into account the range and does just * the buffer's length starting from the base address. The hint argument is used * to give galloping a sensible start point for the search (it's usually 0 or * (r.length - 1)). */ static NSUInteger gallopLeft(id key, id *buf, NSRange r, NSUInteger hint, id descOrComp, GSComparisonType type, void* context) { NSInteger offset = 1; NSInteger lastOffset = 0; NSInteger k = 0; buf += (hint + r.location); if (NSOrderedAscending == GSCompareUsingDescriptorOrComparator(*buf, key, descOrComp, type, context)) { /* In an ascending order, we gallop to the right until the key * is no longer greater than the element from the range */ NSInteger maxOffset = (r.length - hint); while (offset < maxOffset) { if (NSOrderedAscending == GSCompareUsingDescriptorOrComparator(buf[offset], key, descOrComp, type, context)) { lastOffset = offset; // We gallop by 1, 3, 7, 15,... offset = (offset << 1) + 1; if (offset <= 0) { offset = maxOffset; } } else { break; } } if (offset > maxOffset) { offset = maxOffset; } /* we incremented the buf pointer by hint, so we need to * account for that in order to get the offset to the base address */ lastOffset += r.location + hint; offset += r.location + hint; } else { /* In descending (or equal) order, we gallop to the left * until the key is no longer less than the element from the range */ NSInteger maxOffset = hint + 1; while (offset < maxOffset) { if (NSOrderedAscending == GSCompareUsingDescriptorOrComparator(*(buf - offset), key, descOrComp, type, context)) { break; } lastOffset = offset; offset = (offset << 1) + 1; if (offset <= 0) { offset = maxOffset; } } // Translate into positive offsets from array base address again. k = lastOffset; lastOffset = (r.location + hint) - offset; offset = (r.location + hint) - k; } // Restore base address: buf -= (hint + r.location); /* * We are now sure that we need to insert key somewhere between offset and * lastOffset, though the stride might have been to large for the range. * Fix the range and do a binary search with a vastly diminished search space. */ offset = MIN(offset, NSMaxRange(r)); if (lastOffset < (NSInteger)r.location) { lastOffset = (NSInteger)r.location; } while (lastOffset < offset) { NSInteger midPoint = lastOffset + ((offset - lastOffset) >> 1); if (NSOrderedAscending == GSCompareUsingDescriptorOrComparator(buf[midPoint], key, descOrComp, type, context)) { lastOffset = midPoint + 1; } else { offset = midPoint; } } return (NSUInteger)offset; } /* * Equivalent to gallopLeft() except that it searches for an insertion point * right of the last equal element. */ static NSUInteger gallopRight(id key, id *buf, NSRange r, NSUInteger hint, id descOrComp, GSComparisonType type, void *context) { NSInteger offset = 1; NSInteger lastOffset = 0; NSInteger k = 0; buf += (hint + r.location); if (NSOrderedAscending == GSCompareUsingDescriptorOrComparator(key, *buf, descOrComp, type, context)) { /* In an ascending order, we gallop to the right until * the key is no longer greater than the element from the range */ NSInteger maxOffset = hint + 1; while (offset < maxOffset) { if (NSOrderedAscending == GSCompareUsingDescriptorOrComparator(key, *(buf - offset), descOrComp, type, context)) { lastOffset = offset; offset = (offset << 1) + 1; if (offset <= 0) { offset = maxOffset; } } else { break; } } if (offset > maxOffset) { offset = maxOffset; } // Translation to positive offsets against the base address. k = lastOffset; lastOffset = (r.location + hint) - offset; offset = (r.location + hint) - k; } else { // In descending (or equal) order, we gallop to the right NSInteger maxOffset = (r.length - hint); while (offset < maxOffset) { if (NSOrderedAscending == GSCompareUsingDescriptorOrComparator(key, buf[offset], descOrComp, type, context)) { break; } lastOffset = offset; offset = (offset << 1) + 1; if (offset <= 0) { offset = maxOffset; } } // Translate into positive offsets from array base address again. lastOffset += (hint + r.location); offset += (hint + r.location); } // Restore base address: buf -= (hint + r.location); /* * We are now sure that we need to insert key somewhere between offset and * lastOffset, though the stride might have been to large for the range. * Fix the range and do a binary search with a vastly diminished search space. */ lastOffset++; offset = MIN(offset, NSMaxRange(r)); if (lastOffset < (NSInteger)r.location) { lastOffset = (NSInteger)r.location; } while (lastOffset < offset) { NSInteger midPoint = lastOffset + ((offset - lastOffset) >> 1); if (NSOrderedAscending == GSCompareUsingDescriptorOrComparator(key, buf[midPoint], descOrComp, type, context)) { offset = midPoint; } else { lastOffset = midPoint + 1; } } return (NSUInteger)offset; } // Public versions of the galloping functions NSUInteger GSLeftInsertionPointForKeyInSortedRange(id key, id *buffer, NSRange range, NSComparator cmptr) { return gallopLeft(key, buffer, range, 0, (id)cmptr, GSComparisonTypeComparatorBlock, NULL); } NSUInteger GSRightInsertionPointForKeyInSortedRange(id key, id *buffer, NSRange range, NSComparator cmptr) { return gallopRight(key, buffer, range, 0, (id)cmptr, GSComparisonTypeComparatorBlock, NULL); } static inline void reverseRange(id *buffer, NSRange r) { NSUInteger loc = r.location; NSUInteger max = (NSMaxRange(r) - 1); while (loc < max) { id temp = buffer[loc]; buffer[loc++] = buffer[max]; buffer[max--] = temp; } } /* In-place binary insertion sorting for small arrays (i.e. those which are * smaller than GS_MIN_MERGE. We use this to generate minimal runs for timsort. */ static void internalBinarySort(id *buffer, NSRange r, NSUInteger start, id compOrDesc, GSComparisonType type, void *context) { NSUInteger min = r.location; NSUInteger max = NSMaxRange(r); NSCAssert2(NSLocationInRange(start, r), @"Start index %lu not in range %@", start, NSStringFromRange(r)); if (min == start) { start++; } // We assume that everything before start is sorted. for (; start < max; ++start) { NSUInteger left = min; NSUInteger right = start; id pivot = buffer[right]; int i = 0; do { NSUInteger midPoint = (left + ((right - left) >> 1)); NSComparisonResult res = GSCompareUsingDescriptorOrComparator(pivot, buffer[midPoint], compOrDesc, type, context); if (NSOrderedAscending == res) { right = midPoint; } else { left = midPoint + 1; } } while (left < right); NSCAssert(left == right, @"Binary sort iteration did not end correctly,"); // We make room for the pivot and place it at left. for (i = start; i > left; --i) { buffer[i] = buffer[(i - 1)]; } buffer[left] = pivot; } } /* * Count the number of elements in the range that are already ordered. * If the order is a descending one, reverse it so that all runs are ordered the * same way. */ static inline NSUInteger countAscendizedRun(id *buf, NSRange r, id descOrComp, GSComparisonType type, void*context) { NSUInteger min = r.location; NSUInteger runMax = min + 1; NSUInteger rangeMax = NSMaxRange(r); if (runMax == rangeMax) { return 1; } if (NSOrderedDescending == GSCompareUsingDescriptorOrComparator(buf[min], buf[runMax++], descOrComp, type, context)) { while ((runMax < rangeMax) && NSOrderedDescending == GSCompareUsingDescriptorOrComparator(buf[runMax - 1], buf[runMax], descOrComp, type, context)) { runMax++; } reverseRange(buf, NSMakeRange(min, (runMax - min))); } else // ascending or equal { while ((runMax < rangeMax) && NSOrderedDescending != GSCompareUsingDescriptorOrComparator(buf[runMax - 1], buf[runMax], descOrComp, type, context)) { runMax++; } } return (runMax - min); } /* * Calculate a sensible minimum length for the runs, these need to be powers of * two, or less than, but close to, one, but always at least GS_MIN_MERGE. For * details on why this is useful, see Python's listsort.txt. */ static inline NSUInteger minimumRunLength(NSUInteger length) { NSUInteger r = 0; while (length >= GS_MIN_MERGE) { r |= length & 1; length >>= 1; } return (length + r); } /* * For arrays up to GS_MIN_MERGE, we don't do merging. Instead, we identify * pre-ordering at the begining of the range and sort the rest using binary * sort. */ static inline void miniTimSort(id *buf, NSRange r, id descOrComp, GSComparisonType ty, void *ctx) { NSUInteger firstRunLength = countAscendizedRun(buf, r, descOrComp, ty, ctx); if (r.length == firstRunLength) { // In this case, we have already sorted the array here. return; } internalBinarySort(buf, r, (r.location + firstRunLength), descOrComp, ty, ctx); } /* These macros make calling the cached IMPs easier, * if we choose to do so later. */ #define GS_TIMSORT_CACHED_MSG(recv, sel) sel ## Imp(recv,@selector(sel)) #define GS_TIMSORT_CACHED_MSGV(recv, imp, sel, ...) imp(recv, @selector(sel), __VA_ARGS__) #define GS_TIMSORT_SUGGEST_MERGE(desc) GS_TIMSORT_CACHED_MSG(desc, suggestMerge) #define GS_TIMSORT_FORCE_MERGE(desc) GS_TIMSORT_CACHED_MSG(desc, forceMerge) #define GS_TIMSORT_PUSH_RUN(desc, run) \ GS_TIMSORT_CACHED_MSGV(desc, pushRunImp, pushRun:, run) #define GS_TIMSORT_MERGE_AT_INDEX(desc, n) \ GS_TIMSORT_CACHED_MSGV(desc, mergeAtIndexImp, mergeAtIndex:, n) #define GS_TIMSORT_MERGE_LOW(desc, r1, r2) \ GS_TIMSORT_CACHED_MSGV(desc, mergeLowImp, mergeLowRun:withRun:, r1, r2) #define GS_TIMSORT_MERGE_HIGH(desc, r1, r2) \ GS_TIMSORT_CACHED_MSGV(desc, mergeHighImp, mergeHighRun:withRun:, r1, r2) #define GS_TIMSORT_ENSURE_TEMP_CAPACITY(desc, length) \ GS_TIMSORT_CACHED_MSGV(desc, ensureCapImp, ensureTempCapacity:, length) static IMP pushRunImp; static IMP suggestMergeImp; static IMP forceMergeImp; static IMP mergeAtIndexImp; static IMP mergeLowImp; static IMP mergeHighImp; static IMP ensureCapImp; @interface GSTimSortPlaceHolder : NSObject { id *objects; NSRange sortRange; id sortDescriptorOrComparator; GSComparisonType comparisonType; void *functionContext; NSUInteger minGallop; NSUInteger tempCapacity; id *tempBuffer; NSUInteger stackSize; NSRange* runStack; } - (id)initWithObjects: (id*)theObjects sortRange: (NSRange)theSortRange descriptor: (NSSortDescriptor*)descriptor; - (id)initWithObjects: (id*)theObjects sortRange: (NSRange)theSortRange comparator: (NSComparator)comparator; - (void)mergeAtIndex: (NSUInteger)index; - (void)suggestMerge; - (void)forceMerge; @end // Prototype for the actual timsort function. static void _GSTimSort(id *objects, NSRange sortRange, id sortDescriptorOrComparator, GSComparisonType comparisonType, void *context); @implementation GSTimSortPlaceHolder + (void) load { _GSSortStable = _GSTimSort; } + (void) initialize { if ([GSTimSortPlaceHolder class] == [self class]) { // We need to be fast, so we cache a lot of IMPs pushRunImp = [self instanceMethodForSelector: @selector(pushRun:)]; suggestMergeImp = [self instanceMethodForSelector: @selector(suggestMerge)]; forceMergeImp = [self instanceMethodForSelector: @selector(forceMerge)]; mergeAtIndexImp = [self instanceMethodForSelector: @selector(mergeAtIndex:)]; mergeLowImp = [self instanceMethodForSelector: @selector(mergeLowRun:withRun:)]; mergeHighImp = [self instanceMethodForSelector: @selector(mergeHighRun:withRun:)]; ensureCapImp = [self instanceMethodForSelector: @selector(ensureTempCapacity:)]; } } + (void) setUnstable { _GSSortUnstable = _GSTimSort; // Use for unstable even though we are stable } - (id) initWithObjects: (id*)theObjects sortRange: (NSRange)theSortRange descriptorOrComparator: (id)descriptorOrComparator comparisonType: (GSComparisonType)ty functionContext: (void*)ctx { NSUInteger sortLength = theSortRange.length; NSUInteger stackSpace = 0; if (nil == (self = [super init])) { return nil; } /* GSTimSortPlaceHolders are ephemeral objects that just track state, so we * don't bother making sure that the objects don't go away. */ objects = theObjects; sortRange = theSortRange; sortDescriptorOrComparator = descriptorOrComparator; comparisonType = ty; functionContext = ctx; /* minGallop will be adjusted based on heuristics on whether we have a highly * structured array (in which case galloping is useful) or a more random one * (when it isn't). */ minGallop = GS_MIN_GALLOP; stackSize = 0; /* timsort needs at most half the array size as temporary storage, so * we optimize for arrays that require less storage than we'd usually * allocate. */ tempCapacity = ((sortLength < (2 * GS_INITIAL_TEMP_STORAGE)) ? sortLength >> 1 : GS_INITIAL_TEMP_STORAGE); tempBuffer = malloc(sizeof(id) * tempCapacity ); /* We also allocate the stack in which we track the runs based on the array * size. (The values are based of the OpenJDK implementation of timsort) */ stackSpace = (sortLength < 120 ? 5 : sortLength < 1542 ? 10 : sortLength < 119151 ? 19 : 40); runStack = malloc(sizeof(NSRange) * stackSpace); return self; } - (id) initWithObjects: (id*)theObjects sortRange: (NSRange)theSortRange descriptor: (NSSortDescriptor*)descriptor { return [self initWithObjects: theObjects sortRange: theSortRange descriptorOrComparator: descriptor comparisonType: GSComparisonTypeSortDescriptor functionContext: NULL]; } - (id) initWithObjects: (id*)theObjects sortRange: (NSRange)theSortRange comparator: (NSComparator)comparator { return [self initWithObjects: theObjects sortRange: theSortRange descriptorOrComparator: (id)comparator comparisonType: GSComparisonTypeComparatorBlock functionContext: NULL]; } - (void) pushRun: (NSRange)r { runStack[stackSize] = r; stackSize++; NSDebugMLLog(@"GSTimSort", @"Pushing run: %@", NSStringFromRange(r)); } /** * Ensure that the invariant enabling the algorithm holds for the stack. * * see: http://www.envisage-project.eu/proving-android-java-and-python-sorting-algorithm-is-broken-and-how-to-fix-it/#sec3 */ - (void) suggestMerge { while (stackSize > 1) { NSInteger n = stackSize -2; if ((n >= 1 && runStack[n-1].length <= (runStack[n].length + runStack[n+1].length)) || (n >= 2 && runStack[n-2].length <= (runStack[n].length + runStack[n-1].length))) { if (runStack[n-1].length < runStack[n+1].length) { n--; } } else if (runStack[n].length > runStack[n+1].length) { break; //invariant reached } GS_TIMSORT_MERGE_AT_INDEX(self, n); } } - (void) ensureTempCapacity: (NSUInteger)elementsRequired { if (elementsRequired <= tempCapacity) { return; } /* We don't realloc any memory because we don't care about the contents from * previous merge iterations. */ free(tempBuffer); tempBuffer = malloc(sizeof(id) * elementsRequired); tempCapacity = elementsRequired; //TODO: OOM exception } /* * Main merge algorithm: Does a pairwise merge in the general-case and * adaptively switches to galloping mode, which moves around whole chunks of the * array. This method is called if r1 is the shorter run (i.e. the one which * requires less temporary storage). */ - (void) mergeLowRun: (NSRange)r1 withRun: (NSRange)r2 { NSUInteger num1 = r1.length; NSUInteger num2 = r2.length; id *buf1 = objects + r1.location; id *buf2 = objects + r2.location; id *destination = buf1; NSUInteger k = 0; // Local variables for performance NSUInteger localMinGallop = minGallop; id descOrComp = sortDescriptorOrComparator; GSComparisonType ty = comparisonType; void *ctx = functionContext; /* We use the first run as our destination, so we copy out its contents into * the temporary storage (which needs to be large enough, though). */ GS_TIMSORT_ENSURE_TEMP_CAPACITY(self, r1.length); memcpy(tempBuffer, buf1, (sizeof(id) * r1.length)); destination = buf1; buf1 = tempBuffer; *destination++ = *buf2++; num2--; if (num2 == 0) { if (0 != num1) { memcpy(destination, buf1, num1 * sizeof(id)); } return; } if (num1 == 1) { memmove(destination, buf2, num2 * sizeof(id)); destination[num2] = *buf1; return; } NS_DURING { for (;;) { // Variables to track whether galloping is useful NSUInteger winners1 = 0; NSUInteger winners2 = 0; do { if (NSOrderedAscending == GSCompareUsingDescriptorOrComparator(*buf2, *buf1, descOrComp, ty, ctx)) { *destination++ = *buf2++; winners2++; winners1 = 0; num2--; if (num2 == 0) { goto Success; } } else { *destination++ = *buf1++; winners1++; winners2 = 0; num1--; if (num1 == 1) { goto CopyB; } } } while ((winners1 | winners2) < localMinGallop); localMinGallop++; do { /* If we fall through here, one of the runs is very structured, * so we assume that galloping will also be useful in the future. */ localMinGallop -= localMinGallop > 1; minGallop = localMinGallop; k = gallopRight(*buf2, buf1, NSMakeRange(0,num1), 0, descOrComp, ty, ctx); winners1 = k; if (0 != k) { memcpy(destination, buf1, k * sizeof(id)); destination += k; buf1 += k; num1 -= k; if (1 == num1) { goto CopyB; } if (0 == num1) { goto Success; } } /* Since our galloping run finishes here, the next element * comes from r2 */ *destination++ = *buf2++; num2--; if (0 == num2) { goto Success; } // Now we try to gallop into the other direction k = gallopLeft(*buf1, buf2, NSMakeRange(0, num2), 0, descOrComp, ty, ctx); winners2 = k; if (0 != k) { /* buf2 is part of the destination, not the temporary * storage, so we need to memmove instead of memcpy to * account for potential overlap. */ memmove(destination, buf2, k * sizeof(id)); destination += k; buf2 += k; num2 -= k; if (0 == num2) { goto Success; } } /* Galloping run for r2 finished, next element comes from r1, * and starts the next loop iteration */ *destination++ = *buf1++; num1--; if (1 == num1) { goto CopyB; } } while (winners1 >= GS_MIN_GALLOP || winners2 >= GS_MIN_GALLOP); localMinGallop++; minGallop = localMinGallop; } Success: if (0 != num1) { memcpy(destination, buf1, num1 * sizeof(id)); } NS_VOIDRETURN; CopyB: memmove(destination, buf2, num2 * sizeof(id)); destination[num2] = *buf1; NS_VOIDRETURN; } NS_HANDLER { //In case of an exception, we need to copy back r1 into its original //position if (0 != num1) { memcpy(destination, buf1, num1 * sizeof(id)); } [localException raise]; } NS_ENDHANDLER } - (void) mergeHighRun: (NSRange)r1 withRun: (NSRange)r2 { NSUInteger num1 = r1.length; NSUInteger num2 = r2.length; id *buf1 = objects + r1.location; id *buf2 = objects + r2.location; id *base1 = buf1; id *base2 = NULL; // We are walking backwards, so destination pointer is at the high end // initially. id *destination = buf2 + num2 - 1; NSUInteger k = 0; // Local variables for performance NSUInteger localMinGallop = minGallop; id descOrComp = sortDescriptorOrComparator; GSComparisonType ty = comparisonType; void *ctx = functionContext; // We use the first run as our destination, so we copy out its contents into // the temporary storage (which needs to be large enough, though). GS_TIMSORT_ENSURE_TEMP_CAPACITY(self, r2.length); memcpy(tempBuffer, buf2, (sizeof(id) * r2.length)); base2 = tempBuffer; buf2 = tempBuffer + num2 - 1; buf1 += num1 - 1; *destination-- = *buf1--; num1--; if (num1 == 0) { if (0 != num2) { memcpy(destination - (num2-1), base2, num2 * sizeof(id)); } return; } if (num2 == 1) { destination -= num1; buf1 -= num1; memmove(destination + 1, buf1 + 1, num1 * sizeof(id)); *destination = *buf2; return; } NS_DURING { for (;;) { // Variables to track whether galloping is useful NSUInteger winners1 = 0; NSUInteger winners2 = 0; do { if (NSOrderedAscending == GSCompareUsingDescriptorOrComparator(*buf2, *buf1, descOrComp, ty, ctx)) { *destination-- = *buf1--; winners1++; winners2 = 0; num1--; if (num1 == 0) { goto Success; } } else { *destination-- = *buf2--; winners2++; winners1 = 0; num2--; if (num2 == 1) { goto CopyA; } } } while ((winners1 | winners2) < localMinGallop); localMinGallop++; do { /* If we fall through here, one of the runs is very structured, * so we assume that galloping will also be useful in the future. */ localMinGallop -= localMinGallop > 1; minGallop = localMinGallop; k = gallopRight(*buf2, base1, NSMakeRange(0, num1), num1 - 1, descOrComp, ty, ctx); k = num1 - k; winners1 = k; if (0 != k) { destination -= k; buf1 -= k; memmove(destination+1, buf1+1, k * sizeof(id)); num1 -= k; if (0 == num1) { goto Success; } } /* Since our galloping run finishes here, * the next element comes from r2 */ *destination-- = *buf2--; num2--; if (1 == num2) { goto CopyA; } // Now we try to gallop into the other direction k = gallopLeft(*buf1, base2, NSMakeRange(0, num2), num2-1, descOrComp, ty, ctx); k = num2 - k; winners2 = k; if (0 != k) { destination -= k; buf2 -= k; memcpy(destination + 1, buf2 + 1, k * sizeof(id)); num2 -= k; if (1 == num2) { goto CopyA; } if (0 == num2) { goto Success; } } /* Galloping run for r2 finished, next element comes from r1, * and starts the next loop iteration */ *destination-- = *buf1--; num1--; if (0 == num1) { goto Success; } } while (winners1 >= GS_MIN_GALLOP || winners2 >= GS_MIN_GALLOP); localMinGallop++; minGallop = localMinGallop; } Success: if (0 != num2) { memcpy(destination - (num2-1), base2, num2 * sizeof(id)); } NS_VOIDRETURN; CopyA: destination -= num1; buf1 -= num1; memmove(destination + 1, buf1 + 1, num1 * sizeof(id)); *destination = *buf2; NS_VOIDRETURN; } NS_HANDLER { //In case of an exception, we need to copy back r1 into its original //position if (0 != num2) { memcpy(destination - (num2-1), base2, num2 * sizeof(id)); } [localException raise]; } NS_ENDHANDLER } - (void) mergeAtIndex: (NSUInteger)i { NSRange r1; NSRange r2; NSUInteger insert = 0; NSAssert((stackSize >= 2), @"Trying to merge without a plurality of runs."); NSAssert(((i == (stackSize - 2)) || (i == (stackSize - 3))), @"Trying at an index other than the penultimate or antepenultimate."); r1 = runStack[i]; r2 = runStack[i+1]; NSDebugMLLog(@"GSTimSort", @"Merging stack location %lu (stack size: %lu, run %@ with %@)", (unsigned long)i, (unsigned long)stackSize, NSStringFromRange(r1), NSStringFromRange(r2)); /* Do some housekeeping on the stack: We combine the two runs * being merged and move around the last run on the stack * if we are merging on the antepenultimate run. * In any case, the run at i+1 is consumed in the merge and * the stack shrinks. */ runStack[i] = NSUnionRange(r1, r2); if (i == (stackSize - 3)) { runStack[i+1] = runStack[i+2]; } stackSize--; // Find an insertion point for the first element in r2 into r1 insert = gallopRight(objects[r2.location], objects, r1, 0, sortDescriptorOrComparator, comparisonType, functionContext); r1.length = r1.length - (insert - r1.location); r1.location = insert; if (r1.length == 0) { // The entire run r2 lies after r1, just return. return; } NSDebugMLLog(@"GSTimSort", @"Insertion point for r2 in r1: %lu, r1 for the merge is now %@.", (unsigned long)insert, NSStringFromRange(r1)); // Find an insertion point for the last element of r1 into r2. Subtracting the // location from that point gives us the length of the subrange we need to // merge. r2.length = (gallopLeft(objects[NSMaxRange(r1) - 1], objects, r2, (r2.length - 1), sortDescriptorOrComparator, comparisonType, functionContext) - r2.location); if (r2.length == 0) { return; } (r1.length <= r2.length) ? GS_TIMSORT_MERGE_LOW(self, r1, r2) : GS_TIMSORT_MERGE_HIGH(self, r1, r2); } /** * Force a final merge of the runs on the stack, so that only one run, covering * the whole array, remains. */ - (void) forceMerge { while (stackSize > 1) { NSInteger n = stackSize - 2; if ((n > 0) && (runStack[n-1].length < runStack[n+1].length)) { n--; } GS_TIMSORT_MERGE_AT_INDEX(self, n); } } - (void) dealloc { free(runStack); free(tempBuffer); [super dealloc]; } @end static void _GSTimSort(id *objects, NSRange sortRange, id sortDescriptorOrComparator, GSComparisonType comparisonType, void *context) { NSUInteger sortStart = sortRange.location; NSUInteger sortEnd = NSMaxRange(sortRange); NSUInteger sortLen = sortRange.length; NSUInteger minimalRunLen = 0; GSTimSortPlaceHolder *desc = nil; if (sortLen < 2) { // Don't sort anything that doesn't contain at least two elements. return; } if (sortLen < GS_MIN_MERGE) { miniTimSort(objects, sortRange, sortDescriptorOrComparator, comparisonType, context); return; } // Now we need a timsort descriptor for state-tracking. desc = [[GSTimSortPlaceHolder alloc] initWithObjects: objects sortRange: sortRange descriptorOrComparator: sortDescriptorOrComparator comparisonType: comparisonType functionContext: context]; NS_DURING { minimalRunLen = minimumRunLength(sortLen); do { NSUInteger runLen = countAscendizedRun(objects, NSMakeRange(sortStart, sortLen), sortDescriptorOrComparator, comparisonType, context); /* If the run is too short, coerce it up to minimalRunLen * or the end of the sortRange. */ if (runLen < MIN(sortLen, minimalRunLen)) { NSUInteger coercionLen; coercionLen = sortLen <= minimalRunLen ? sortLen : minimalRunLen; internalBinarySort(objects, NSMakeRange(sortStart, coercionLen), sortStart + runLen, sortDescriptorOrComparator, comparisonType, context); runLen = coercionLen; } GS_TIMSORT_PUSH_RUN(desc, NSMakeRange(sortStart, runLen)); GS_TIMSORT_SUGGEST_MERGE(desc); sortStart += runLen; sortLen -= runLen; } while (sortLen != 0); NSCAssert(sortStart == sortEnd, @"Sorting did not complete"); GS_TIMSORT_FORCE_MERGE(desc); } NS_HANDLER { [desc release]; [localException raise]; } NS_ENDHANDLER [desc release]; } gnustep-base-1.29.0/Source/GSTimeoutSource.h000066400000000000000000000012631435650067400206660ustar00rootroot00000000000000#ifndef INCLUDED_GSTIMEOUTSOURCE_H #define INCLUDED_GSTIMEOUTSOURCE_H #import "common.h" #import "GSDispatch.h" /* * A helper class that wraps a libdispatch timer. * * Used to implement the timeout of `GSMultiHandle` and `GSEasyHandle` */ @interface GSTimeoutSource : NSObject { dispatch_source_t _rawSource; NSInteger _milliseconds; dispatch_queue_t _queue; dispatch_block_t _handler; } - (NSInteger) milliseconds; - (dispatch_queue_t) queue; - (dispatch_block_t) handler; - (instancetype) initWithQueue: (dispatch_queue_t)queue milliseconds: (NSInteger)milliseconds handler: (dispatch_block_t)handler; @end #endif gnustep-base-1.29.0/Source/GSTimeoutSource.m000066400000000000000000000020751435650067400206750ustar00rootroot00000000000000#import "GSTimeoutSource.h" @implementation GSTimeoutSource - (instancetype) initWithQueue: (dispatch_queue_t)queue milliseconds: (NSInteger)milliseconds handler: (dispatch_block_t)handler { if (nil != (self = [super init])) { _queue = queue; _handler = handler; _milliseconds = milliseconds; _rawSource = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, _queue); uint64_t delay = MAX(1, milliseconds - 1); dispatch_time_t start = dispatch_time(DISPATCH_TIME_NOW, delay * NSEC_PER_MSEC); dispatch_source_set_timer(_rawSource, start, delay * NSEC_PER_MSEC, _milliseconds == 1 ? 1 * NSEC_PER_USEC : 1 * NSEC_PER_MSEC); dispatch_source_set_event_handler(_rawSource, _handler); dispatch_resume(_rawSource); } return self; } - (void) dealloc { dispatch_source_cancel(_rawSource); [super dealloc]; } - (NSInteger) milliseconds { return _milliseconds; } - (dispatch_queue_t) queue { return _queue; } - (dispatch_block_t) handler { return _handler; } @endgnustep-base-1.29.0/Source/GSTransferState.h000066400000000000000000000074711435650067400206530ustar00rootroot00000000000000#ifndef INCLUDED_GSTRANSFERTSTATE_H #define INCLUDED_GSTRANSFERTSTATE_H #import "GSURLSessionTaskBodySource.h" @class GSURLSessionTaskBodySource; @class NSArray; @class NSData; @class NSFileHandle; @class NSHTTPURLResponse; @class NSURL; @class NSURLResponse; typedef NS_ENUM(NSUInteger, GSParsedResponseHeaderType) { GSParsedResponseHeaderTypePartial, GSParsedResponseHeaderTypeComplete }; /* * A native protocol like HTTP header being parsed. * * It can either be complete (i.e. the final CR LF CR LF has been * received), or partial. */ @interface GSParsedResponseHeader: NSObject { NSArray *_lines; GSParsedResponseHeaderType _type; } - (GSParsedResponseHeaderType) type; /* * Parse a header line passed by libcurl. * * These contain the ending and the final line contains nothing but * that ending. * - Returns: Returning nil indicates failure. Otherwise returns a new * `GSParsedResponseHeader` with the given line added. */ - (instancetype) byAppendingHeaderLine: (NSData*)data; - (NSHTTPURLResponse*) createHTTPURLResponseForURL: (NSURL*)URL; @end typedef NS_ENUM(NSUInteger, GSDataDrainType) { // Concatenate in-memory GSDataDrainInMemory, // Write to file GSDataDrainTypeToFile, // Do nothing. Might be forwarded to delegate GSDataDrainTypeIgnore, }; @interface GSDataDrain: NSObject { GSDataDrainType _type; NSData *_data; NSURL *_fileURL; NSFileHandle *_fileHandle; } - (GSDataDrainType) type; - (void) setType: (GSDataDrainType)type; - (NSData*) data; - (void) setData: (NSData*)data; - (NSURL*) fileURL; - (void) setFileURL: (NSURL*)url; - (NSFileHandle*) fileHandle; - (void) setFileHandle: (NSFileHandle*)handle; @end /* * State related to an ongoing transfer. * * This contains headers received so far, body data received so far, etc. * * There's a strict 1-to-1 relationship between a `GSEasyHandle` and a * `GSTransferState`. */ @interface GSTransferState: NSObject { NSURL *_url; // The URL that's being requested GSParsedResponseHeader *_parsedResponseHeader; // Raw headers received. NSURLResponse *_response; // Once the headers is complete, this will contain the response id _requestBodySource; // The body data to be sent in the request GSDataDrain *_bodyDataDrain; // Body data received BOOL _isHeaderComplete; } // Transfer state that can receive body data, but will not send body data. - (instancetype) initWithURL: (NSURL*)url bodyDataDrain: (GSDataDrain*)bodyDataDrain; // Transfer state that sends body data and can receive body data. - (instancetype) initWithURL: (NSURL*)url bodyDataDrain: (GSDataDrain*)bodyDataDrain bodySource: (id)bodySource; - (instancetype) initWithURL: (NSURL*)url parsedResponseHeader: (GSParsedResponseHeader*)parsedResponseHeader response: (NSURLResponse*)response bodySource: (id)bodySource bodyDataDrain: (GSDataDrain*)bodyDataDrain; /* * Append body data */ - (instancetype) byAppendingBodyData: (NSData*)bodyData; /* * Appends a header line * * Will set the complete response once the header is complete, i.e. the * return value's `isHeaderComplete` will then by `YES`. * * When a parsing error occurs `error` will be set. */ - (instancetype) byAppendingHTTPHeaderLineData: (NSData*)data error: (NSError**)error; - (NSURLResponse*) response; - (void) setResponse: (NSURLResponse*)response; - (BOOL) isHeaderComplete; - (id) requestBodySource; - (GSDataDrain*) bodyDataDrain; - (NSURL*) URL; @end #endif gnustep-base-1.29.0/Source/GSTransferState.m000066400000000000000000000301131435650067400206450ustar00rootroot00000000000000#import "GSTransferState.h" #import "GSURLSessionTaskBodySource.h" #import "Foundation/NSArray.h" #import "Foundation/NSCharacterSet.h" #import "Foundation/NSData.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSFileHandle.h" #import "Foundation/NSError.h" #import "Foundation/NSURL.h" #import "Foundation/NSURLError.h" #import "Foundation/NSURLResponse.h" #import "Foundation/NSURLSession.h" #import "Foundation/NSUUID.h" #import "Foundation/NSFileManager.h" #import "Foundation/NSPathUtilities.h" #define GS_DELIMITERS_CR 0x0d #define GS_DELIMITERS_LR 0x0a @implementation GSParsedResponseHeader - (instancetype) init { if (nil != (self = [super init])) { _lines = [[NSMutableArray alloc] init]; _type = GSParsedResponseHeaderTypePartial; } return self; } - (void) dealloc { DESTROY(_lines); [super dealloc]; } - (GSParsedResponseHeaderType) type { return _type; } - (void) setType: (GSParsedResponseHeaderType)type { _type = type; } - (void) setLines: (NSArray*)lines { ASSIGN(_lines, lines); } - (instancetype) byAppendingHeaderLine: (NSData*)data { NSUInteger length = [data length]; if (length >= 2) { uint8_t last2; uint8_t last1; [data getBytes: &last2 range: NSMakeRange(length - 2, 1)]; [data getBytes: &last1 range: NSMakeRange(length - 1, 1)]; if (GS_DELIMITERS_CR == last2 && GS_DELIMITERS_LR == last1) { NSData *lineBuffer; NSString *line; lineBuffer = [data subdataWithRange: NSMakeRange(0, length - 2)]; line = AUTORELEASE([[NSString alloc] initWithData: lineBuffer encoding: NSUTF8StringEncoding]); if (nil == line) { return nil; } return [self _byAppendingHeaderLine: line]; } } return nil; } - (NSHTTPURLResponse*) createHTTPURLResponseForURL: (NSURL*)URL { NSArray *tail; NSArray *startLine; NSDictionary *headerFields; NSString *head; NSString *s, *v; head = [_lines firstObject]; if (nil == head) { return nil; } if ([_lines count] == 0) { return nil; } tail = [_lines subarrayWithRange: NSMakeRange(1, [_lines count] - 1)]; startLine = [self statusLineFromLine: head]; if (nil == startLine) { return nil; } headerFields = [self createHeaderFieldsFromLines: tail]; v = [startLine objectAtIndex: 0]; s = [startLine objectAtIndex: 1]; return AUTORELEASE([[NSHTTPURLResponse alloc] initWithURL: URL statusCode: [s integerValue] HTTPVersion: v headerFields: headerFields]); } - (NSArray*) statusLineFromLine: (NSString*)line { NSArray *a; NSString *s; NSInteger status; a = [line componentsSeparatedByString: @" "]; if ([a count] < 3) { return nil; } s = [a objectAtIndex: 1]; status = [s integerValue]; if (status >= 100 && status <= 999) { return a; } else { return nil; } } - (NSDictionary *) createHeaderFieldsFromLines: (NSArray *)lines { NSMutableDictionary *headerFields = nil; NSEnumerator *e; NSString *line; e = [_lines objectEnumerator]; while (nil != (line = [e nextObject])) { NSRange r; NSString *head; NSString *tail; NSCharacterSet *set; NSString *key; NSString *value; NSString *v; r = [line rangeOfString: @":"]; if (r.location != NSNotFound) { head = [line substringToIndex: r.location]; tail = [line substringFromIndex: r.location + 1]; set = [NSCharacterSet whitespaceAndNewlineCharacterSet]; key = [head stringByTrimmingCharactersInSet: set]; value = [tail stringByTrimmingCharactersInSet: set]; if (nil != key && nil != value) { if (nil == headerFields) { headerFields = [NSMutableDictionary dictionary]; } if (nil != [headerFields objectForKey: key]) { v = [NSString stringWithFormat:@"%@, %@", [headerFields objectForKey: key], value]; [headerFields setObject: v forKey: key]; } else { [headerFields setObject: value forKey: key]; } } } else { continue; } } return AUTORELEASE([headerFields copy]); } - (instancetype) _byAppendingHeaderLine: (NSString*)line { GSParsedResponseHeader *header; header = AUTORELEASE([[GSParsedResponseHeader alloc] init]); if ([line length] == 0) { switch (_type) { case GSParsedResponseHeaderTypePartial: { [header setType: GSParsedResponseHeaderTypeComplete]; [header setLines: _lines]; return header; } case GSParsedResponseHeaderTypeComplete: return header; } } else { NSMutableArray *lines = [[self partialResponseHeader] mutableCopy]; [lines addObject:line]; [header setType: GSParsedResponseHeaderTypePartial]; [header setLines: lines]; RELEASE(lines); return header; } } - (NSArray*) partialResponseHeader { switch (_type) { case GSParsedResponseHeaderTypeComplete: return [NSArray array]; case GSParsedResponseHeaderTypePartial: return _lines; } } @end @implementation GSDataDrain - (void) dealloc { DESTROY(_data); DESTROY(_fileURL); DESTROY(_fileHandle); [super dealloc]; } - (GSDataDrainType) type { return _type; } - (void) setType: (GSDataDrainType)type { _type = type; } - (NSData*) data { return _data; } - (void) setData: (NSData*)data { ASSIGN(_data, data); } - (NSURL*) fileURL { /* Generate a random fileURL if fileURL is not initialized. * It would be nice to have this implemented in an initializer. */ if (!_fileURL) { NSUUID *randomUUID; NSString *fileName; NSURL *tempURL; randomUUID = [NSUUID UUID]; fileName = [[randomUUID UUIDString] stringByAppendingPathExtension: @"tmp"]; tempURL = [NSURL fileURLWithPath: NSTemporaryDirectory()]; _fileURL = [NSURL fileURLWithPath: fileName relativeToURL: tempURL]; } return _fileURL; } - (void) setFileURL: (NSURL*)url { ASSIGN(_fileURL, url); } - (NSFileHandle*) fileHandle { /* Create temporary file and open a fileHandle for writing. */ if (!_fileHandle) { NSFileManager *fileManager = [NSFileManager defaultManager]; [fileManager createFileAtPath: [[self fileURL] relativePath] contents: nil attributes: nil]; _fileHandle = [NSFileHandle fileHandleForWritingToURL: [self fileURL] error: NULL]; } return _fileHandle; } - (void) setFileHandle: (NSFileHandle*)handle { ASSIGN(_fileHandle, handle); } @end @implementation GSTransferState - (instancetype) initWithURL: (NSURL*)url bodyDataDrain: (GSDataDrain*)bodyDataDrain { return [self initWithURL: url parsedResponseHeader: nil response: nil bodySource: nil bodyDataDrain: bodyDataDrain]; } - (instancetype) initWithURL: (NSURL*)url bodyDataDrain: (GSDataDrain*)bodyDataDrain bodySource: (id)bodySource { return [self initWithURL: url parsedResponseHeader: nil response: nil bodySource: bodySource bodyDataDrain: bodyDataDrain]; } - (instancetype) initWithURL: (NSURL*)url parsedResponseHeader: (GSParsedResponseHeader*)parsedResponseHeader response: (NSURLResponse*)response bodySource: (id)bodySource bodyDataDrain: (GSDataDrain*)bodyDataDrain { if (nil != (self = [super init])) { ASSIGN(_url, url); if (nil != parsedResponseHeader) { ASSIGN(_parsedResponseHeader, parsedResponseHeader); } else { _parsedResponseHeader = [[GSParsedResponseHeader alloc] init]; } ASSIGN(_response, response); ASSIGN(_requestBodySource, bodySource); ASSIGN(_bodyDataDrain, bodyDataDrain); } return self; } - (void) dealloc { DESTROY(_url); DESTROY(_parsedResponseHeader); DESTROY(_response); DESTROY(_requestBodySource); DESTROY(_bodyDataDrain); [super dealloc]; } - (instancetype) byAppendingBodyData: (NSData*)bodyData { switch ([_bodyDataDrain type]) { case GSDataDrainInMemory: { NSMutableData *data; GSDataDrain *dataDrain; GSTransferState *ts; data = [_bodyDataDrain data] ? AUTORELEASE([[_bodyDataDrain data] mutableCopy]) : [NSMutableData data]; [data appendData: bodyData]; dataDrain = AUTORELEASE([[GSDataDrain alloc] init]); [dataDrain setType: GSDataDrainInMemory]; [dataDrain setData: data]; ts = [[GSTransferState alloc] initWithURL: _url parsedResponseHeader: _parsedResponseHeader response: _response bodySource: _requestBodySource bodyDataDrain: dataDrain]; return AUTORELEASE(ts); } case GSDataDrainTypeToFile: { NSFileHandle *fileHandle; fileHandle = [_bodyDataDrain fileHandle]; [fileHandle seekToEndOfFile]; [fileHandle writeData: bodyData]; return self; } case GSDataDrainTypeIgnore: return self; } } - (instancetype) byAppendingHTTPHeaderLineData: (NSData*)data error: (NSError**)error { GSParsedResponseHeader *h; h = [_parsedResponseHeader byAppendingHeaderLine: data]; if (nil == h) { if (error != NULL) { *error = [NSError errorWithDomain: NSURLErrorDomain code: -1 userInfo: nil]; } return nil; } if ([h type] == GSParsedResponseHeaderTypeComplete) { NSHTTPURLResponse *response; GSParsedResponseHeader *ph; GSTransferState *ts; response = [h createHTTPURLResponseForURL: _url]; if (nil == response) { if (error != NULL) { *error = [NSError errorWithDomain: NSURLErrorDomain code: -1 userInfo: nil]; } return nil; } ph = AUTORELEASE([[GSParsedResponseHeader alloc] init]); ts = [[GSTransferState alloc] initWithURL: _url parsedResponseHeader: ph response: response bodySource: _requestBodySource bodyDataDrain: _bodyDataDrain]; return AUTORELEASE(ts); } else { GSTransferState *ts; ts = [[GSTransferState alloc] initWithURL: _url parsedResponseHeader: h response: nil bodySource: _requestBodySource bodyDataDrain: _bodyDataDrain]; return AUTORELEASE(ts); } } - (BOOL) isHeaderComplete { return _response != nil; } - (NSURLResponse*) response { return _response; } - (void) setResponse: (NSURLResponse*)response { ASSIGN(_response, response); } - (id) requestBodySource { return _requestBodySource; } - (GSDataDrain*) bodyDataDrain { return _bodyDataDrain; } - (NSURL*) URL { return _url; } @end gnustep-base-1.29.0/Source/GSURLPrivate.h000066400000000000000000000102761435650067400200600ustar00rootroot00000000000000/* GSURLPrivate Copyright (C) 2006 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald This file is part of the GNUstep Base Library. 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 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 02111 USA. */ #ifndef __GSURLPrivate_h_ #define __GSURLPrivate_h_ /* * Headers needed by many URL loading classes */ #import "common.h" #import "Foundation/NSArray.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSData.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSException.h" #import "Foundation/NSHTTPCookie.h" #import "Foundation/NSHTTPCookieStorage.h" #import "Foundation/NSLock.h" #import "Foundation/NSStream.h" #import "Foundation/NSString.h" #import "Foundation/NSURL.h" #import "Foundation/NSURLAuthenticationChallenge.h" #import "Foundation/NSURLCache.h" #import "Foundation/NSURLConnection.h" #import "Foundation/NSURLCredential.h" #import "Foundation/NSURLCredentialStorage.h" #import "Foundation/NSURLDownload.h" #import "Foundation/NSURLError.h" #import "Foundation/NSURLProtectionSpace.h" #import "Foundation/NSURLProtocol.h" #import "Foundation/NSURLRequest.h" #import "Foundation/NSURLResponse.h" /* * Private accessors for URL loading classes */ @interface NSURLRequest (Private) - (BOOL) _debug; - (id) _debugLogDelegate; - (id) _propertyForKey: (NSString*)key; - (void) _setProperty: (id)value forKey: (NSString*)key; @end @interface NSURLResponse (Private) - (void) _setHeaders: (id)headers; - (void) _setStatusCode: (NSInteger)code text: (NSString*)text; - (void) _setValue: (NSString *)value forHTTPHeaderField: (NSString *)field; - (NSString*) _valueForHTTPHeaderField: (NSString*)field; @end @interface NSURLProtocol (Private) + (Class) _classToHandleRequest: (NSURLRequest *)request; + (id) _ProtocolClient; @end /* Internal class for handling HTTP protocol client messages */ @interface _NSURLProtocolClient : NSObject { NSURLRequestCachePolicy _cachePolicy; NSMutableArray *_cacheableData; NSURLResponse *_cacheableResponse; } @end /* Internal class for handling HTTP authentication */ @class NSLock; @interface GSHTTPAuthentication : NSObject { NSLock *_lock; NSURLCredential *_credential; NSURLProtectionSpace *_space; NSString *_nonce; NSString *_opaque; NSString *_qop; int _nc; } /* * Return the object for the specified credential/protection space. */ + (GSHTTPAuthentication *) authenticationWithCredential: (NSURLCredential*)credential inProtectionSpace: (NSURLProtectionSpace*)space; /* * Create/return the protection space involved in the specified authentication * header returned in a response to a request sent to the URL. */ + (NSURLProtectionSpace*) protectionSpaceForAuthentication: (NSString*)auth requestURL: (NSURL*)URL; /* * Return the protection space for the specified URL (if known). */ + (NSURLProtectionSpace *) protectionSpaceForURL: (NSURL*)URL; + (void) setProtectionSpace: (NSURLProtectionSpace *)space forDomains: (NSArray*)domains baseURL: (NSURL*)base; /* * Generate next authorisation header for the specified authentication * header, method, and path. */ - (NSString*) authorizationForAuthentication: (NSString*)authentication method: (NSString*)method path: (NSString*)path; - (NSURLCredential *) credential; - (id) initWithCredential: (NSURLCredential*)credential inProtectionSpace: (NSURLProtectionSpace*)space; - (NSURLProtectionSpace *) space; @end #endif gnustep-base-1.29.0/Source/GSURLSessionTaskBody.h000066400000000000000000000020361435650067400215250ustar00rootroot00000000000000#ifndef INCLUDED_GSURLSESSIONTASKBODY_H #define INCLUDED_GSURLSESSIONTASKBODY_H #import "common.h" @class NSData; @class NSError; @class NSInputStream; @class NSNumber; @class NSURL; typedef NS_ENUM(NSUInteger, GSURLSessionTaskBodyType) { GSURLSessionTaskBodyTypeNone, GSURLSessionTaskBodyTypeData, // Body data is read from the given file URL GSURLSessionTaskBodyTypeFile, // Body data is read from the given input stream GSURLSessionTaskBodyTypeStream, }; @interface GSURLSessionTaskBody : NSObject { GSURLSessionTaskBodyType _type; NSData *_data; NSURL *_fileURL; NSInputStream *_inputStream; } - (instancetype) init; - (instancetype) initWithData: (NSData*)data; - (instancetype) initWithFileURL: (NSURL*)fileURL; - (instancetype) initWithInputStream: (NSInputStream*)inputStream; - (GSURLSessionTaskBodyType) type; - (NSData*) data; - (NSURL*) fileURL; - (NSInputStream*) inputStream; - (NSNumber*) getBodyLengthWithError: (NSError**)error; @end #endif gnustep-base-1.29.0/Source/GSURLSessionTaskBody.m000066400000000000000000000040631435650067400215340ustar00rootroot00000000000000#import "GSURLSessionTaskBody.h" #import "Foundation/NSData.h" #import "Foundation/NSFileManager.h" #import "Foundation/NSStream.h" #import "Foundation/NSURL.h" #import "Foundation/NSValue.h" @implementation GSURLSessionTaskBody - (instancetype) init { if (nil != (self = [super init])) { _type = GSURLSessionTaskBodyTypeNone; } return self; } - (instancetype) initWithData: (NSData*)data { if (nil != (self = [super init])) { _type = GSURLSessionTaskBodyTypeData; ASSIGN(_data, data); } return self; } - (instancetype) initWithFileURL: (NSURL*)fileURL { if (nil != (self = [super init])) { _type = GSURLSessionTaskBodyTypeFile; ASSIGN(_fileURL, fileURL); } return self; } - (instancetype) initWithInputStream: (NSInputStream*)inputStream { if (nil != (self = [super init])) { _type = GSURLSessionTaskBodyTypeStream; ASSIGN(_inputStream, inputStream); } return self; } - (void) dealloc { DESTROY(_data); DESTROY(_fileURL); DESTROY(_inputStream); [super dealloc]; } - (GSURLSessionTaskBodyType) type { return _type; } - (NSData*) data { return _data; } - (NSURL*) fileURL { return _fileURL; } - (NSInputStream*) inputStream { return _inputStream; } - (NSNumber*) getBodyLengthWithError: (NSError**)error { switch (_type) { case GSURLSessionTaskBodyTypeNone: return [NSNumber numberWithInt: 0]; case GSURLSessionTaskBodyTypeData: return [NSNumber numberWithUnsignedInteger: [_data length]]; case GSURLSessionTaskBodyTypeFile: { NSDictionary *attributes; attributes = [[NSFileManager defaultManager] attributesOfItemAtPath: [_fileURL path] error: error]; if (!error) { NSNumber *size = [attributes objectForKey: NSFileSize]; return size; } else { return nil; } } case GSURLSessionTaskBodyTypeStream: return nil; } } @end gnustep-base-1.29.0/Source/GSURLSessionTaskBodySource.h000066400000000000000000000023641435650067400227120ustar00rootroot00000000000000#ifndef INCLUDED_GSURLSESSIONTASKBODYSOURCE_H #define INCLUDED_GSURLSESSIONTASKBODYSOURCE_H #import "common.h" #import "GSDispatch.h" @class NSFileHandle; @class NSInputStream; typedef NS_ENUM(NSUInteger, GSBodySourceDataChunk) { GSBodySourceDataChunkData, // The source is depleted. GSBodySourceDataChunkDone, // Retry later to get more data. GSBodySourceDataChunkRetryLater, GSBodySourceDataChunkError }; /* * A (non-blocking) source for body data. */ @protocol GSURLSessionTaskBodySource /* * Get the next chunck of data. */ - (void) getNextChunkWithLength: (NSInteger)length completionHandler: (void (^)(GSBodySourceDataChunk chunk, NSData *data))completionHandler; @end @interface GSBodyStreamSource : NSObject - (instancetype) initWithInputStream: (NSInputStream*)inputStream; @end @interface GSBodyDataSource : NSObject - (instancetype)initWithData:(NSData *)data; @end @interface GSBodyFileSource : NSObject - (instancetype) initWithFileURL: (NSURL*)fileURL workQueue: (dispatch_queue_t)workQueue dataAvailableHandler: (void (^)(void))dataAvailableHandler; @end #endif gnustep-base-1.29.0/Source/GSURLSessionTaskBodySource.m000066400000000000000000000063101435650067400227120ustar00rootroot00000000000000#import "GSURLSessionTaskBodySource.h" #import "Foundation/NSData.h" #import "Foundation/NSStream.h" @implementation GSBodyStreamSource { NSInputStream *_inputStream; } - (instancetype) initWithInputStream: (NSInputStream*)inputStream { if (nil != (self = [super init])) { ASSIGN(_inputStream, inputStream); if ([_inputStream streamStatus] == NSStreamStatusNotOpen) { [_inputStream open]; } } return self; } - (void) dealloc { DESTROY(_inputStream); [super dealloc]; } - (void) getNextChunkWithLength: (NSInteger)length completionHandler: (void (^)(GSBodySourceDataChunk, NSData*))completionHandler { if (nil == completionHandler) { return; } if (![_inputStream hasBytesAvailable]) { completionHandler(GSBodySourceDataChunkDone, nil); return; } uint8_t buffer[length]; NSInteger readBytes; NSData *data; readBytes = [_inputStream read: buffer maxLength: length]; if (readBytes > 0) { data = AUTORELEASE([[NSData alloc] initWithBytes: buffer length: readBytes]); completionHandler(GSBodySourceDataChunkData, data); } else if (readBytes == 0) { completionHandler(GSBodySourceDataChunkDone, nil); } else { completionHandler(GSBodySourceDataChunkError, nil); } } @end @implementation GSBodyDataSource { NSData *_data; } - (instancetype) initWithData: (NSData*)data { if (nil != (self = [super init])) { ASSIGN(_data, data); } return self; } - (void) dealloc { DESTROY(_data); [super dealloc]; } - (void) getNextChunkWithLength: (NSInteger)length completionHandler: (void (^)(GSBodySourceDataChunk, NSData*))completionHandler { if (nil == completionHandler) { return; } NSUInteger remaining = [_data length]; if (remaining == 0) { completionHandler(GSBodySourceDataChunkDone, nil); } else if (remaining <= length) { NSData *r = AUTORELEASE([[NSData alloc] initWithData: _data]); DESTROY(_data); completionHandler(GSBodySourceDataChunkData, r); } else { NSData *chunk = [_data subdataWithRange: NSMakeRange(0, length)]; NSData *remainder = [_data subdataWithRange: NSMakeRange(length - 1, [_data length] - length)]; ASSIGN(_data, remainder); completionHandler(GSBodySourceDataChunkData, chunk); } } @end @implementation GSBodyFileSource { NSURL *_fileURL; dispatch_queue_t _workQueue; void (^_dataAvailableHandler)(void); } - (instancetype) initWithFileURL: (NSURL*)fileURL workQueue: (dispatch_queue_t)workQueue dataAvailableHandler: (void (^)(void))dataAvailableHandler { if (nil != (self = [super init])) { ASSIGN(_fileURL, fileURL); _workQueue = workQueue; _dataAvailableHandler = dataAvailableHandler; } return self; } - (void) dealloc { DESTROY(_fileURL); [super dealloc]; } - (void) getNextChunkWithLength: (NSInteger)length completionHandler: (void (^)(GSBodySourceDataChunk chunk, NSData *data))completionHandler { //FIXME } @end gnustep-base-1.29.0/Source/GSValue.m000066400000000000000000000147631435650067400171510ustar00rootroot00000000000000/** GSValue - Object encapsulation for C types. Copyright (C) 1993,1994,1995,1999 Free Software Foundation, Inc. Written by: Adam Fedor Date: Mar 1995 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #import "Foundation/NSValue.h" #import "Foundation/NSData.h" #import "Foundation/NSException.h" #import "Foundation/NSCoder.h" @interface GSValue : NSValue { void *data; char *objctype; } @end /* This is the real, general purpose value object. I've implemented all the methods here (like pointValue) even though most likely, other concrete subclasses were created to handle these types */ @implementation GSValue static inline unsigned typeSize(const char* type) { switch (*type) { case _C_ID: return sizeof(id); case _C_CLASS: return sizeof(Class); case _C_SEL: return sizeof(SEL); case _C_CHR: return sizeof(char); case _C_UCHR: return sizeof(unsigned char); case _C_SHT: return sizeof(short); case _C_USHT: return sizeof(unsigned short); case _C_INT: return sizeof(int); case _C_UINT: return sizeof(unsigned int); case _C_LNG: return sizeof(long); case _C_ULNG: return sizeof(unsigned long); case _C_LNG_LNG: return sizeof(long long); case _C_ULNG_LNG: return sizeof(unsigned long long); case _C_FLT: return sizeof(float); case _C_DBL: return sizeof(double); #if defined(_C_BOOL) && (!defined(__GNUC__) || __GNUC__ > 2) case _C_BOOL: return sizeof(_Bool); #endif case _C_PTR: return sizeof(void*); case _C_CHARPTR: return sizeof(char*); case _C_BFLD: case _C_ARY_B: case _C_UNION_B: case _C_STRUCT_B: { NSUInteger size; NSGetSizeAndAlignment(type, &size, NULL); return (int)size; } case _C_VOID: return 0; default: return 0; } } // Allocating and Initializing - (id) initWithBytes: (const void *)value objCType: (const char *)type { if (!value || !type) { NSLog(@"Tried to create NSValue with NULL value or NULL type"); DESTROY(self); return nil; } self = [super init]; if (self != nil) { unsigned size = typeSize(type); if (size > 0) { data = (void *)NSZoneMalloc([self zone], size); memcpy(data, value, size); } else { NSLog(@"Tried to create NSValue with invalid Objective-C type"); DESTROY(self); return nil; } size = strlen(type); objctype = (char *)NSZoneMalloc([self zone], size + 1); memcpy(objctype, type, size); objctype[size] = '\0'; } return self; } - (void) dealloc { if (objctype != 0) NSZoneFree([self zone], objctype); if (data != 0) NSZoneFree([self zone], data); [super dealloc]; } // Accessing Data - (void) getValue: (void *)value { unsigned size; size = typeSize(objctype); if (size > 0) { if (value == 0) { [NSException raise: NSInvalidArgumentException format: @"Cannot copy value into NULL buffer"]; /* NOT REACHED */ } memcpy(value, data, size); } } - (NSUInteger) hash { unsigned size = typeSize(objctype); unsigned hash = 0; while (size-- > 0) { hash += ((unsigned char*)data)[size]; } return hash; } - (BOOL) isEqualToValue: (NSValue*)aValue { if (aValue == self) { return YES; } if (aValue == nil) { return NO; } if (object_getClass(aValue) != object_getClass(self)) { return NO; } if (!GSSelectorTypesMatch(objctype, ((GSValue*)aValue)->objctype)) { return NO; } if (memcmp(((GSValue*)aValue)->data, data, typeSize(objctype)) != 0) { return NO; } return YES; } - (const char *)objCType { return objctype; } - (id) nonretainedObjectValue { unsigned size = typeSize(objctype); if (size != sizeof(void*)) { [NSException raise: NSInternalInconsistencyException format: @"Return value of size %u as object", size]; } return *((id *)data); } - (NSPoint) pointValue { unsigned size = typeSize(objctype); if (size != sizeof(NSPoint)) { [NSException raise: NSInternalInconsistencyException format: @"Return value of size %u as NSPoint", size]; } return *((NSPoint *)data); } - (void *) pointerValue { unsigned size = typeSize(objctype); if (size != sizeof(void*)) { [NSException raise: NSInternalInconsistencyException format: @"Return value of size %u as pointer", size]; } return *((void **)data); } - (NSRect) rectValue { unsigned size = (unsigned)typeSize(objctype); if (size != sizeof(NSRect)) { [NSException raise: NSInternalInconsistencyException format: @"Return value of size %u as NSRect", size]; } return *((NSRect *)data); } - (NSSize) sizeValue { unsigned size = typeSize(objctype); if (size != sizeof(NSSize)) { [NSException raise: NSInternalInconsistencyException format: @"Return value of size %u as NSSize", size]; } return *((NSSize *)data); } - (NSString *) description { unsigned size; NSData *rep; size = typeSize(objctype); rep = [NSData dataWithBytes: data length: size]; return [NSString stringWithFormat: @"(%s) %@", objctype, [rep description]]; } - (void) encodeWithCoder: (NSCoder *)coder { NSUInteger tsize; unsigned size; NSMutableData *d; size = strlen(objctype)+1; [coder encodeValueOfObjCType: @encode(unsigned) at: &size]; [coder encodeArrayOfObjCType: @encode(signed char) count: size at: objctype]; NSGetSizeAndAlignment(objctype, &tsize, NULL); size = tsize; d = [NSMutableData new]; [d serializeDataAt: data ofObjCType: objctype context: nil]; size = [d length]; [coder encodeValueOfObjCType: @encode(unsigned) at: &size]; [coder encodeArrayOfObjCType: @encode(unsigned char) count: size at: [d bytes]]; RELEASE(d); } @end gnustep-base-1.29.0/Source/GSeq.h000066400000000000000000000657351435650067400165020ustar00rootroot00000000000000/* Implementation of composite character sequence functions for GNUSTEP Copyright (C) 1999 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: May 1999 Based on code by: Stevo Crvenkovski Date: March 1997 This file is part of the GNUstep Base Library. 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 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 USA. */ /* * Warning - this contains hairy code - handle with care. * The first part of this file contains variable and constant definitions * plus inline function definitions for handling sequences of unicode * characters. It is bracketed in preprocessor conditionals so that it * is only ever included once. * The second part of the file contains inline function definitions that * are designed to be modified depending on the defined macros at the * point where they are included. This is meant to be included multiple * times so the same code can be used for NSString, and subclasses. */ #ifndef __GSeq_h_GNUSTEP_GSEQ_BASE_INCLUDE #define __GSeq_h_GNUSTEP_GSEQ_BASE_INCLUDE /* * Some standard selectors for frequently used methods. Set in NSString * +initialize or the GSString.m setup() function. */ static SEL caiSel = NULL; static SEL gcrSel = NULL; static SEL ranSel = NULL; /* * The maximum decompostion level for composite unicode characters. */ #define MAXDEC 18 /* * The structure definition for handling a unicode character sequence * for a single character. */ typedef struct { unichar *chars; NSUInteger count; NSUInteger capacity; BOOL normalized; } GSeqStruct; typedef GSeqStruct *GSeq; /* * A macro to define a GSeqStruct variable capable of holding a * unicode character sequence of the specified length. */ #define GSEQ_MAKE(BUF, SEQ, LEN) \ unichar BUF[LEN * MAXDEC + 1]; \ GSeqStruct SEQ = { BUF, LEN, LEN * MAXDEC, 0 } /* * A function to normalize a unicode character sequence ... produces a * sequence containing composed characters in a well defined order and * with a nul terminator as well as a character count. */ static inline void GSeq_normalize(GSeq seq) { NSUInteger count = seq->count; if (count) { unichar *source = seq->chars; unichar target[count*MAXDEC+1]; NSUInteger base = 0; /* * Pre-scan ... anything with a code under 0x00C0 is not a decomposable * character, so we don't need to expand it. * If there are no decomposable characters or composed sequences, the * sequence is already normalised and we don't need to make any changes. */ while (base < count) { if (source[base] >= 0x00C0) { break; } base++; } source[count] = (unichar)(0); if (base < count) { /* * Now expand decomposable characters into the long format. * Use the 'base' value to avoid re-checking characters which have * already been expanded. */ while (base < count) { unichar *spoint = &source[base]; unichar *tpoint = &target[base]; NSUInteger newbase = 0; do { unichar *dpoint = uni_is_decomp(*spoint); if (!dpoint) { *tpoint++ = *spoint; } else { while (*dpoint) { *tpoint++ = *dpoint++; } if (newbase <= 0) { newbase = (spoint - source) + 1; } } } while (*spoint++); count = tpoint - target; memcpy(&source[base], &target[base], 2*(count - base)); source[count] = (unichar)(0); if (newbase > 0) { base = newbase; } else { base = count; } } seq->count = count; /* * Now standardise ordering of all composed character sequences. */ if (count > 1) { BOOL notdone = YES; while (notdone) { unichar *first = seq->chars; unichar *second = first + 1; NSUInteger i; notdone = NO; for (i = 1; i < count; i++) { if (GSPrivateUniCop(*second)) { if (GSPrivateUniCop(*first) > GSPrivateUniCop(*second)) { unichar tmp = *first; *first = *second; *second = tmp; notdone = YES; } else if (GSPrivateUniCop(*first) == GSPrivateUniCop(*second)) { if (*first > *second) { unichar tmp = *first; *first = *second; *second = tmp; notdone = YES; } else if (*first == *second) { unichar *end = seq->chars + count; while (*first == *second && second < end) { second++; count--; } first++; while (second < end) { *first++ = *second++; } notdone = YES; break; } } } first++; second++; } } seq->count = count; } } seq->normalized = YES; } } /* * A function to compare two unicode character sequences normalizing if * required. */ static inline NSComparisonResult GSeq_compare(GSeq s0, GSeq s1) { NSUInteger i; NSUInteger end; NSUInteger len0; NSUInteger len1; unichar *c0 = s0->chars; unichar *c1 = s1->chars; len0 = s0->count; len1 = s1->count; if (len0 == len1) { for (i = 0; i < len1; i++) { if (c0[i] != c1[i]) { break; } } if (i == len0) { return NSOrderedSame; } } if (s0->normalized == NO) GSeq_normalize(s0); if (s1->normalized == NO) GSeq_normalize(s1); len0 = s0->count; len1 = s1->count; if (len0 < len1) end = len0; else end = len1; for (i = 0; i < end; i++) { if (c0[i] < c1[i]) return NSOrderedAscending; if (c0[i] > c1[i]) return NSOrderedDescending; } if (len0 < len1) return NSOrderedAscending; if (len0 > len1) return NSOrderedDescending; return NSOrderedSame; } static inline void GSeq_lowercase(GSeq seq) { unichar *s = seq->chars; NSUInteger len = seq->count; NSUInteger i; for (i = 0; i < len; i++) s[i] = uni_tolower(s[i]); } static inline void GSeq_uppercase(GSeq seq) { unichar *s = seq->chars; NSUInteger len = seq->count; NSUInteger i; for (i = 0; i < len; i++) s[i] = uni_toupper(s[i]); } /* * Specify NSString, GSUString or GSCString */ #define GSEQ_NS 0 #define GSEQ_US 1 #define GSEQ_CS 2 /* * Definitions for bitmask of search options. These MUST match the * enumeration in NSString.h */ #define GSEQ_FCLS 3 #define GSEQ_BCLS 7 #define GSEQ_FLS 2 #define GSEQ_BLS 6 #define GSEQ_FCS 1 #define GSEQ_BCS 5 #define GSEQ_FS 0 #define GSEQ_BS 4 #define GSEQ_FCLAS 11 #define GSEQ_BCLAS 15 #define GSEQ_FLAS 10 #define GSEQ_BLAS 14 #define GSEQ_FCAS 9 #define GSEQ_BCAS 13 #define GESQ_FAS 8 #define GSEQ_BAS 12 #endif /* __GSeq_h_GNUSTEP_GSEQ_BASE_INCLUDE */ /* * Set up macros for dealing with 'self' on the basis of GSQ_S */ #if GSEQ_S == GSEQ_US #define GSEQ_ST GSStr #define GSEQ_SLEN s->_count #define GSEQ_SGETC(I) s->_contents.u[I] #define GSEQ_SGETR(B,R) memcpy(B, &s->_contents.u[R.location], 2*(R).length) #define GSEQ_SRANGE(I) (*srImp)((id)s, ranSel, I) #else #if GSEQ_S == GSEQ_CS #define GSEQ_ST GSStr #define GSEQ_SLEN s->_count #define GSEQ_SGETC(I) (unichar)s->_contents.c[I] #define GSEQ_SGETR(B,R) ( { \ NSUInteger _lcount = 0; \ while (_lcount < (R).length) \ { \ (B)[_lcount] = (unichar)s->_contents.c[(R).location + _lcount]; \ _lcount++; \ } \ } ) #define GSEQ_SRANGE(I) (NSRange){I,1} #else #define GSEQ_ST NSString* #define GSEQ_SLEN [s length] #define GSEQ_SGETC(I) (*scImp)(s, caiSel, I) #define GSEQ_SGETR(B,R) (*sgImp)(s, gcrSel, B, R) #define GSEQ_SRANGE(I) (*srImp)(s, ranSel, I) #endif #endif /* * Set up macros for dealing with 'other' string on the basis of GSQ_O */ #if GSEQ_O == GSEQ_US #define GSEQ_OT GSStr #define GSEQ_OLEN o->_count #define GSEQ_OGETC(I) o->_contents.u[I] #define GSEQ_OGETR(B,R) memcpy(B, &o->_contents.u[R.location], 2*(R).length) #define GSEQ_ORANGE(I) (*orImp)((id)o, ranSel, I) #else #if GSEQ_O == GSEQ_CS #define GSEQ_OT GSStr #define GSEQ_OLEN o->_count #define GSEQ_OGETC(I) (unichar)o->_contents.c[I] #define GSEQ_OGETR(B,R) ( { \ NSUInteger _lcount = 0; \ while (_lcount < (R).length) \ { \ (B)[_lcount] = (unichar)o->_contents.c[(R).location + _lcount]; \ _lcount++; \ } \ } ) #define GSEQ_ORANGE(I) (NSRange){I,1} #else #define GSEQ_OT NSString* #define GSEQ_OLEN [o length] #define GSEQ_OGETC(I) (*ocImp)(o, caiSel, I) #define GSEQ_OGETR(B,R) (*ogImp)(o, gcrSel, B, R) #define GSEQ_ORANGE(I) (*orImp)(o, ranSel, I) #endif #endif /* * If a string comparison function is required, implement it. */ #ifdef GSEQ_STRCOMP static NSComparisonResult GSEQ_STRCOMP(NSString *ss, NSString *os, NSUInteger mask, NSRange aRange) { GSEQ_ST s = (GSEQ_ST)ss; GSEQ_OT o = (GSEQ_OT)os; NSUInteger oLength; /* Length of other. */ #if 0 /* Range should be checked in calling code */ if (aRange.location > GSEQ_SLEN) [NSException raise: NSRangeException format: @"Invalid location."]; if (aRange.length > (GSEQ_SLEN - aRange.location)) [NSException raise: NSRangeException format: @"Invalid location+length."]; #endif oLength = GSEQ_OLEN; if (aRange.length == 0) { if (oLength == 0) { return NSOrderedSame; } return NSOrderedAscending; } else if (oLength == 0) { return NSOrderedDescending; } if (mask & NSLiteralSearch) { NSUInteger i; NSUInteger sLen = aRange.length; NSUInteger oLen = oLength; NSUInteger end; #if GSEQ_S == GSEQ_NS void (*sgImp)(NSString*, SEL, unichar*, NSRange); unichar sBuf[sLen]; #else #if GSEQ_S == GSEQ_US unichar *sBuf; #else unsigned char *sBuf; #endif #endif #if GSEQ_O == GSEQ_NS void (*ogImp)(NSString*, SEL, unichar*, NSRange); unichar oBuf[oLen]; #else #if GSEQ_O == GSEQ_US unichar *oBuf; #else unsigned char *oBuf; #endif #endif #if GSEQ_S == GSEQ_NS sgImp = (void (*)(NSString*,SEL,unichar*,NSRange)) [(id)s methodForSelector: gcrSel]; GSEQ_SGETR(sBuf, aRange); #else #if GSEQ_S == GSEQ_CS sBuf = &s->_contents.c[aRange.location]; #else sBuf = &s->_contents.u[aRange.location]; #endif #endif #if GSEQ_O == GSEQ_NS ogImp = (void (*)(NSString*,SEL,unichar*,NSRange)) [(id)o methodForSelector: gcrSel]; GSEQ_OGETR(oBuf, NSMakeRange(0, oLen)); #else #if GSEQ_O == GSEQ_CS oBuf = o->_contents.c; #else oBuf = o->_contents.u; #endif #endif if (oLen < sLen) end = oLen; else end = sLen; if (mask & NSCaseInsensitiveSearch) { #if GSEQ_O == GSEQ_CS || GSEQ_S == GSEQ_CS if (GSPrivateDefaultCStringEncoding() == NSISOLatin1StringEncoding) { /* Using latin1 internally, rather than native encoding, * so we can't use native tolower() function. */ for (i = 0; i < end; i++) { unichar c1 = uni_tolower((unichar)sBuf[i]); unichar c2 = uni_tolower((unichar)oBuf[i]); if (c1 < c2) return NSOrderedAscending; if (c1 > c2) return NSOrderedDescending; } } else { /* We are not using latin1 encoding internally, so we trust * that the internal encoding matches the native encoding * and the native tolower() function will work. */ for (i = 0; i < end; i++) { #if GSEQ_S == GSEQ_CS unichar c1 = tolower(sBuf[i]); #else unichar c1 = uni_tolower((unichar)sBuf[i]); #endif #if GSEQ_O == GSEQ_CS unichar c2 = tolower(oBuf[i]); #else unichar c2 = uni_tolower((unichar)oBuf[i]); #endif if (c1 < c2) return NSOrderedAscending; if (c1 > c2) return NSOrderedDescending; } } #else for (i = 0; i < end; i++) { unichar c1 = uni_tolower((unichar)sBuf[i]); unichar c2 = uni_tolower((unichar)oBuf[i]); if (c1 < c2) return NSOrderedAscending; if (c1 > c2) return NSOrderedDescending; } #endif } else { for (i = 0; i < end; i++) { #if GSEQ_O == GSEQ_CS && GSEQ_S == GSEQ_CS if (sBuf[i] < oBuf[i]) return NSOrderedAscending; if (sBuf[i] > oBuf[i]) return NSOrderedDescending; #else if ((unichar)sBuf[i] < (unichar)oBuf[i]) return NSOrderedAscending; if ((unichar)sBuf[i] > (unichar)oBuf[i]) return NSOrderedDescending; #endif } } if (sLen > oLen) return NSOrderedDescending; else if (sLen < oLen) return NSOrderedAscending; else return NSOrderedSame; } else { NSUInteger start = aRange.location; NSUInteger end = start + aRange.length; NSUInteger sLength = GSEQ_SLEN; NSUInteger sCount = start; NSUInteger oCount = 0; NSComparisonResult result; #if GSEQ_S == GSEQ_NS || GSEQ_S == GSEQ_US NSRange (*srImp)(NSString*, SEL, NSUInteger); #endif #if GSEQ_O == GSEQ_NS || GSEQ_O == GSEQ_US NSRange (*orImp)(NSString*, SEL, NSUInteger); #endif #if GSEQ_S == GSEQ_NS void (*sgImp)(NSString*, SEL, unichar*, NSRange); #endif #if GSEQ_O == GSEQ_NS void (*ogImp)(NSString*, SEL, unichar*, NSRange); #endif #if GSEQ_S == GSEQ_NS || GSEQ_S == GSEQ_US srImp = (NSRange (*)(NSString*, SEL, NSUInteger)) [(id)s methodForSelector: ranSel]; #endif #if GSEQ_O == GSEQ_NS || GSEQ_O == GSEQ_US orImp = (NSRange (*)(NSString*, SEL, NSUInteger)) [(id)o methodForSelector: ranSel]; #endif #if GSEQ_S == GSEQ_NS sgImp = (void (*)(NSString*, SEL, unichar*, NSRange)) [(id)s methodForSelector: gcrSel]; #endif #if GSEQ_O == GSEQ_NS ogImp = (void (*)(NSString*, SEL, unichar*, NSRange)) [(id)o methodForSelector: gcrSel]; #endif while (sCount < end) { if (oCount >= oLength) { return NSOrderedDescending; } else if (sCount >= sLength) { return NSOrderedAscending; } else { NSRange sRange = GSEQ_SRANGE(sCount); NSRange oRange = GSEQ_ORANGE(oCount); GSEQ_MAKE(sBuf, sSeq, sRange.length); GSEQ_MAKE(oBuf, oSeq, oRange.length); GSEQ_SGETR(sBuf, sRange); GSEQ_OGETR(oBuf, oRange); result = GSeq_compare(&sSeq, &oSeq); if (result != NSOrderedSame) { if (mask & NSCaseInsensitiveSearch) { GSeq_lowercase(&oSeq); GSeq_lowercase(&sSeq); result = GSeq_compare(&sSeq, &oSeq); if (result != NSOrderedSame) { return result; } } else { return result; } } sCount += sRange.length; oCount += oRange.length; } } if (oCount < oLength) return NSOrderedAscending; return NSOrderedSame; } } #undef GSEQ_STRCOMP #endif /* * If a string search function is required, implement it. */ #ifdef GSEQ_STRRANGE static NSRange GSEQ_STRRANGE(NSString *ss, NSString *os, NSUInteger mask, NSRange aRange) { GSEQ_ST s = (GSEQ_ST)ss; GSEQ_OT o = (GSEQ_OT)os; NSUInteger rangeEnd = NSMaxRange(aRange); NSUInteger myIndex; NSUInteger myEndIndex; NSUInteger strLength; #if GSEQ_S == GSEQ_NS unichar (*scImp)(NSString*, SEL, NSUInteger); void (*sgImp)(NSString*, SEL, unichar*, NSRange); #endif #if GSEQ_O == GSEQ_NS unichar (*ocImp)(NSString*, SEL, NSUInteger); void (*ogImp)(NSString*, SEL, unichar*, NSRange); #endif #if GSEQ_S == GSEQ_NS || GSEQ_S == GSEQ_US NSRange (*srImp)(NSString*, SEL, NSUInteger); #endif #if GSEQ_O == GSEQ_NS || GSEQ_O == GSEQ_US NSRange (*orImp)(NSString*, SEL, NSUInteger); #endif #if 0 /* Check that the search range is reasonable */ NSUInteger myLength = GSEQ_SLEN; /* Range should be checked in calling code */ if (aRange.location > myLength) [NSException raise: NSRangeException format: @"Invalid location."]; if (aRange.length > (myLength - aRange.location)) [NSException raise: NSRangeException format: @"Invalid location+length."]; #endif /* Ensure the string can be found */ strLength = GSEQ_OLEN; if (strLength > aRange.length || strLength == 0) return (NSRange){NSNotFound, 0}; /* * Cache method implementations for getting characters and ranges */ #if GSEQ_S == GSEQ_NS scImp = (unichar (*)(NSString*,SEL,NSUInteger)) [(id)s methodForSelector: caiSel]; sgImp = (void (*)(NSString*,SEL,unichar*,NSRange)) [(id)s methodForSelector: gcrSel]; #endif #if GSEQ_O == GSEQ_NS ocImp = (unichar (*)(NSString*,SEL,NSUInteger)) [(id)o methodForSelector: caiSel]; ogImp = (void (*)(NSString*,SEL,unichar*,NSRange)) [(id)o methodForSelector: gcrSel]; #endif #if GSEQ_S == GSEQ_NS || GSEQ_S == GSEQ_US srImp = (NSRange (*)(NSString*,SEL,NSUInteger)) [(id)s methodForSelector: ranSel]; #endif #if GSEQ_O == GSEQ_NS || GSEQ_O == GSEQ_US orImp = (NSRange (*)(NSString*,SEL,NSUInteger)) [(id)o methodForSelector: ranSel]; #endif switch (mask) { case GSEQ_FCLS: case GSEQ_FCLAS: { unichar strFirstCharacter = GSEQ_OGETC(0); myIndex = aRange.location; myEndIndex = rangeEnd - strLength; if (mask & NSAnchoredSearch) myEndIndex = myIndex; for (;;) { NSUInteger i = 1; unichar myCharacter = GSEQ_SGETC(myIndex); unichar strCharacter = strFirstCharacter; for (;;) { if ((myCharacter != strCharacter) && ((uni_tolower(myCharacter) != uni_tolower(strCharacter)))) break; if (i == strLength) return (NSRange){myIndex, strLength}; if (myIndex + i >= rangeEnd) break; myCharacter = GSEQ_SGETC(myIndex + i); strCharacter = GSEQ_OGETC(i); i++; } if (myIndex == myEndIndex) break; myIndex++; } return (NSRange){NSNotFound, 0}; } case GSEQ_BCLS: case GSEQ_BCLAS: { unichar strFirstCharacter = GSEQ_OGETC(0); myIndex = rangeEnd - strLength; myEndIndex = aRange.location; if (mask & NSAnchoredSearch) myEndIndex = myIndex; for (;;) { NSUInteger i = 1; unichar myCharacter = GSEQ_SGETC(myIndex); unichar strCharacter = strFirstCharacter; for (;;) { if ((myCharacter != strCharacter) && ((uni_tolower(myCharacter) != uni_tolower(strCharacter)))) break; if (i == strLength) return (NSRange){myIndex, strLength}; if (myIndex + i >= rangeEnd) break; myCharacter = GSEQ_SGETC(myIndex + i); strCharacter = GSEQ_OGETC(i); i++; } if (myIndex-- == myEndIndex) break; } return (NSRange){NSNotFound, 0}; } case GSEQ_FLS: case GSEQ_FLAS: { unichar strFirstCharacter = GSEQ_OGETC(0); myIndex = aRange.location; myEndIndex = rangeEnd - strLength; if (mask & NSAnchoredSearch) myEndIndex = myIndex; for (;;) { NSUInteger i = 1; unichar myCharacter = GSEQ_SGETC(myIndex); unichar strCharacter = strFirstCharacter; for (;;) { if (myCharacter != strCharacter) break; if (i == strLength) return (NSRange){myIndex, strLength}; if (myIndex + i >= rangeEnd) break; myCharacter = GSEQ_SGETC(myIndex + i); strCharacter = GSEQ_OGETC(i); i++; } if (myIndex++ == myEndIndex) break; } return (NSRange){NSNotFound, 0}; } case GSEQ_BLS: case GSEQ_BLAS: { unichar strFirstCharacter = GSEQ_OGETC(0); myIndex = rangeEnd - strLength; myEndIndex = aRange.location; if (mask & NSAnchoredSearch) myEndIndex = myIndex; for (;;) { NSUInteger i = 1; unichar myCharacter = GSEQ_SGETC(myIndex); unichar strCharacter = strFirstCharacter; for (;;) { if (myCharacter != strCharacter) break; if (i == strLength) return (NSRange){myIndex, strLength}; if (myIndex + i >= rangeEnd) break; myCharacter = GSEQ_SGETC(myIndex + i); strCharacter = GSEQ_OGETC(i); i++; } if (myIndex-- == myEndIndex) break; } return (NSRange){NSNotFound, 0}; } case GSEQ_FCS: case GSEQ_FCAS: { NSUInteger strBaseLength = [(NSString*)o _baseLength]; NSRange iRange; myIndex = aRange.location; myEndIndex = rangeEnd - strBaseLength; if (mask & NSAnchoredSearch) myEndIndex = myIndex; iRange = GSEQ_ORANGE(0); if (iRange.length) { GSEQ_MAKE(iBuf, iSeq, iRange.length); GSEQ_OGETR(iBuf, iRange); GSeq_lowercase(&iSeq); for (;;) { NSRange sRange = GSEQ_SRANGE(myIndex); GSEQ_MAKE(sBuf, sSeq, sRange.length); GSEQ_SGETR(sBuf, sRange); GSeq_lowercase(&sSeq); if (GSeq_compare(&iSeq, &sSeq) == NSOrderedSame) { NSUInteger myCount = sRange.length; NSUInteger strCount = iRange.length; if (strCount >= strLength) { return (NSRange){myIndex, myCount}; } while (myIndex + myCount < rangeEnd) { NSRange r0 = GSEQ_SRANGE(myIndex + myCount); GSEQ_MAKE(b0, s0, r0.length); NSRange r1 = GSEQ_ORANGE(strCount); GSEQ_MAKE(b1, s1, r1.length); GSEQ_SGETR(b0, r0); GSEQ_OGETR(b1, r1); if (GSeq_compare(&s0, &s1) != NSOrderedSame) { GSeq_lowercase(&s0); GSeq_lowercase(&s1); if (GSeq_compare(&s0, &s1) != NSOrderedSame) { break; } } myCount += r0.length; strCount += r1.length; if (strCount >= strLength) { return (NSRange){myIndex, myCount}; } } } myIndex += sRange.length; if (myIndex > myEndIndex) break; } } return (NSRange){NSNotFound, 0}; } case GSEQ_BCS: case GSEQ_BCAS: { NSUInteger strBaseLength = [(NSString*)o _baseLength]; NSRange iRange; myIndex = rangeEnd - strBaseLength; myEndIndex = aRange.location; if (mask & NSAnchoredSearch) myEndIndex = myIndex; iRange = GSEQ_ORANGE(0); if (iRange.length) { GSEQ_MAKE(iBuf, iSeq, iRange.length); GSEQ_OGETR(iBuf, iRange); GSeq_lowercase(&iSeq); for (;;) { NSRange sRange = GSEQ_SRANGE(myIndex); GSEQ_MAKE(sBuf, sSeq, sRange.length); GSEQ_SGETR(sBuf, sRange); GSeq_lowercase(&sSeq); if (GSeq_compare(&iSeq, &sSeq) == NSOrderedSame) { NSUInteger myCount = sRange.length; NSUInteger strCount = iRange.length; if (strCount >= strLength) { return (NSRange){myIndex, myCount}; } while (myIndex + myCount < rangeEnd) { NSRange r0 = GSEQ_SRANGE(myIndex + myCount); GSEQ_MAKE(b0, s0, r0.length); NSRange r1 = GSEQ_ORANGE(strCount); GSEQ_MAKE(b1, s1, r1.length); GSEQ_SGETR(b0, r0); GSEQ_OGETR(b1, r1); if (GSeq_compare(&s0, &s1) != NSOrderedSame) { GSeq_lowercase(&s0); GSeq_lowercase(&s1); if (GSeq_compare(&s0, &s1) != NSOrderedSame) { break; } } myCount += r0.length; strCount += r1.length; if (strCount >= strLength) { return (NSRange){myIndex, myCount}; } } } if (myIndex-- <= myEndIndex) break; while (uni_isnonsp(GSEQ_SGETC(myIndex)) && (myIndex > 0)) myIndex--; } } return (NSRange){NSNotFound, 0}; } case GSEQ_BS: case GSEQ_BAS: { NSUInteger strBaseLength = [(NSString*)o _baseLength]; NSRange iRange; myIndex = rangeEnd - strBaseLength; myEndIndex = aRange.location; if (mask & NSAnchoredSearch) myEndIndex = myIndex; iRange = GSEQ_ORANGE(0); if (iRange.length) { GSEQ_MAKE(iBuf, iSeq, iRange.length); GSEQ_OGETR(iBuf, iRange); for (;;) { NSRange sRange = GSEQ_SRANGE(myIndex); GSEQ_MAKE(sBuf, sSeq, sRange.length); GSEQ_SGETR(sBuf, sRange); if (GSeq_compare(&iSeq, &sSeq) == NSOrderedSame) { NSUInteger myCount = sRange.length; NSUInteger strCount = iRange.length; if (strCount >= strLength) { return (NSRange){myIndex, myCount}; } while (myIndex + myCount < rangeEnd) { NSRange r0 = GSEQ_SRANGE(myIndex + myCount); GSEQ_MAKE(b0, s0, r0.length); NSRange r1 = GSEQ_ORANGE(strCount); GSEQ_MAKE(b1, s1, r1.length); GSEQ_SGETR(b0, r0); GSEQ_OGETR(b1, r1); if (GSeq_compare(&s0, &s1) != NSOrderedSame) { break; } myCount += r0.length; strCount += r1.length; if (strCount >= strLength) { return (NSRange){myIndex, myCount}; } } } if (myIndex-- <= myEndIndex) break; while (uni_isnonsp(GSEQ_SGETC(myIndex)) && (myIndex > 0)) { myIndex--; } } } return (NSRange){NSNotFound, 0}; } case GSEQ_FS: case GESQ_FAS: default: { NSUInteger strBaseLength = [(NSString*)o _baseLength]; NSRange iRange; myIndex = aRange.location; myEndIndex = rangeEnd - strBaseLength; if (mask & NSAnchoredSearch) myEndIndex = myIndex; iRange = GSEQ_ORANGE(0); if (iRange.length) { GSEQ_MAKE(iBuf, iSeq, iRange.length); GSEQ_OGETR(iBuf, iRange); for (;;) { NSRange sRange = GSEQ_SRANGE(myIndex); GSEQ_MAKE(sBuf, sSeq, sRange.length); GSEQ_SGETR(sBuf, sRange); if (GSeq_compare(&iSeq, &sSeq) == NSOrderedSame) { NSUInteger myCount = sRange.length; NSUInteger strCount = iRange.length; if (strCount >= strLength) { return (NSRange){myIndex, myCount}; } while (myIndex + myCount < rangeEnd) { NSRange r0 = GSEQ_SRANGE(myIndex + myCount); GSEQ_MAKE(b0, s0, r0.length); NSRange r1 = GSEQ_ORANGE(strCount); GSEQ_MAKE(b1, s1, r1.length); GSEQ_SGETR(b0, r0); GSEQ_OGETR(b1, r1); if (GSeq_compare(&s0, &s1) != NSOrderedSame) { break; } myCount += r0.length; strCount += r1.length; if (strCount >= strLength) { return (NSRange){myIndex, myCount}; } } } myIndex += sRange.length; if (myIndex > myEndIndex) break; } } return (NSRange){NSNotFound, 0}; } } } #undef GSEQ_STRRANGE #endif /* * Clean up macro namespace */ #ifdef GSEQ_S #undef GSEQ_SLEN #undef GSEQ_SGETC #undef GSEQ_SGETR #undef GSEQ_SRANGE #undef GSEQ_ST #undef GSEQ_S #endif #ifdef GSEQ_O #undef GSEQ_OLEN #undef GSEQ_OGETC #undef GSEQ_OGETR #undef GSEQ_ORANGE #undef GSEQ_OT #undef GSEQ_O #endif gnustep-base-1.29.0/Source/Makefile.postamble000066400000000000000000000123621435650067400211030ustar00rootroot00000000000000# -*-makefile-gmake-*- # Makefile.postamble # # Copyright (C) 1997 Free Software Foundation, Inc. # # Author: Scott Christley # # This file is part of the GNUstep Base Library. # # 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 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 # Library General Public License for more details. # # If you are interested in a warranty or support for this source code, # contact Scott Christley at scottc@net-community.com # # You should have received a copy of the GNU Lesser General Public # License along with this library; see the file COPYING.LIB. # If not, write to the Free Software Foundation, # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # Makefile.postamble # # Project specific makefile rules # # Uncomment the targets you want. # The double colons (::) are important, do not make them single colons # otherwise the normal makefile rules will not be performed. # # Things to do before compiling before-all:: $(GENERATED_HFILES) # Things to do after compiling after-all:: Info-gnustep.plist # Things to do before installing #before-install:: # Things to do after installing # ifeq ($(OBJC2RUNTIME),0) after-install:: $(MKDIRS) $(GNUSTEP_HEADERS)/ObjectiveC2 $(MKDIRS) $(GNUSTEP_HEADERS)/ObjectiveC2/objc for file in $(OBJECTIVEC2_HEADERS); do \ $(INSTALL_DATA) ../Headers/ObjectiveC2/objc/$$file \ $(GNUSTEP_HEADERS)/ObjectiveC2/objc/$$file ; \ done endif after-install:: $(MKDIRS) $(GNUSTEP_HEADERS)/GNUstepBase for file in $(GNUSTEPBASE_HEADERS); do \ $(INSTALL_DATA) ../Headers/GNUstepBase/$$file \ $(GNUSTEP_HEADERS)/GNUstepBase/$$file ; \ done $(INSTALL_DATA) $(GNUSTEP_TARGET_DIR)/GNUstepBase/GSConfig.h \ $(GNUSTEP_HEADERS)/GNUstepBase/GSConfig.h if [ "$(DESTDIR)" = "" ]; then \ services=/etc/services; \ if [ "`$(WHOAMI)`" != root ]; then \ echo "WARNING: Please add the following lines to $$services"; \ echo "gdomap 538/tcp # GNUstep distrib objects"; \ echo "gdomap 538/udp # GNUstep distrib objects"; \ else \ if [ "`fgrep gdomap $$services 2>/dev/null`" = "" ]; then \ echo "GNUstep addons for /etc/services written to $$services"; \ set -x; \ echo "gdomap 538/tcp # GNUstep distrib objects" >> $$services; \ echo "gdomap 538/udp # GNUstep distrib objects" >> $$services; \ fi; \ fi; \ fi # Things to do before uninstalling ifeq ($(OBJC2RUNTIME),0) before-uninstall:: for file in $(OBJECTIVEC2_HEADERS); do \ rm -f $(GNUSTEP_HEADERS)/ObjectiveC2/objc/$$file ; \ done endif before-uninstall:: for file in $(GNUSTEPBASE_HEADERS); do \ rm -f $(GNUSTEP_HEADERS)/GNUstepBase/$$file ; \ done rm -f $(GNUSTEP_HEADERS)/$(GNUSTEP_TARGET_DIR)/GNUstepBase/GSConfig.h # Things to do before cleaning # before-clean:: # Things to do after cleaning after-clean:: rm -f libgnustep-base.def Info-gnustep.plist # Things to do before distcleaning # before-distclean:: # Things to do after distcleaning after-distclean:: rm -f $(GNUSTEP_TARGET_DIR)/config.h rm -f $(GNUSTEP_TARGET_DIR)/GNUstepBase/GSConfig.h # rm -rf $(GNUSTEP_TARGET_DIR) # Things to do before checking # before-check:: # Things to do after checking # after-check:: dynamic-load.h: ../config.status rm -f dynamic-load.h cp $(DYNAMIC_LINKER)-load.h dynamic-load.h # # The following header files are specific to a target, so to enable multiple # builds in the same directory, we copy them to a target-specific subdirectory # which will be found by the compiler first when compiling for that target # $(GNUSTEP_TARGET_DIR)/config.h: ../config.status $(MKDIRS) $(GNUSTEP_TARGET_DIR) -cp $(HEADER_DIR_BASE)/config.h $(GNUSTEP_TARGET_DIR) -touch $(GNUSTEP_TARGET_DIR)/config.h $(GNUSTEP_TARGET_DIR)/GNUstepBase/GSConfig.h: ../config.status $(MKDIRS) $(GNUSTEP_TARGET_DIR)/GNUstepBase -cp $(HEADER_DIR_BASE)/GSConfig.h $(GNUSTEP_TARGET_DIR)/GNUstepBase -touch $(GNUSTEP_TARGET_DIR)/GNUstepBase/GSConfig.h # # Files where optimisation breaks the code! # These have to filter the optimisation flag out. # libgnustep-base-entry.m_FILE_FILTER_OUT_FLAGS = -O% # gcc 4.4 on mingw # # Make list of class names for DLL exports. Uses the actual classes from # the .o files, so it should really have everything needed. # libgnustep-base.def: $(OBJ_FILES_TO_LINK) rm -f $@ rm -f _tmp.def cat win32-def.top > $@ nm $^ | grep '^........ [TR] _' | sed 's/[^_]*_//' > _tmp.def cat _tmp.def | grep "_class_name_" >> $@ rm -rf _tmp.def # # Make an Info.plist since libraries don't have these normally # Info-gnustep.plist: ../Version $(ECHO_CREATING)(echo "{"; \ echo " NSExecutable = \"gnustep-base\";"; \ echo " NSPrincipalClass = \"NSObject\";"; \ echo " GSBundleShortVersionString = \"$(VERSION)\";"; \ echo " GSBundleVersion = $(VERSION_NUMBER);"; \ echo " CFBundleShortVersionString = \"$(VERSION)\";"; \ echo " CFBundleVersion = $(VERSION_NUMBER);"; \ echo "}") > $@$(END_ECHO) gnustep-base-1.29.0/Source/Makefile.preamble000066400000000000000000000052521435650067400207040ustar00rootroot00000000000000# # Makefile.preamble # # Copyright (C) 1997 Free Software Foundation, Inc. # # Author: Scott Christley # # This file is part of the GNUstep Base Library. # # 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 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 # Library General Public License for more details. # # If you are interested in a warranty or support for this source code, # contact Scott Christley at scottc@net-community.com # # You should have received a copy of the GNU Lesser General Public # License along with this library; see the file COPYING.LIB. # If not, write to the Free Software Foundation, # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # Makefile.preamble # # Project specific makefile variables # # Do not put any Makefile rules in this file, instead they should # be put into Makefile.postamble. # # # Flags dealing with compiling and linking # # Additional flags to pass to the preprocessor ADDITIONAL_CPPFLAGS = $(DEFS) \ $(WARN_FLAGS) \ -Wcast-align \ #-Wstrict-prototypes \ #-Wpointer-arith \ #-Wcast-qual \ #-Wwrite-strings \ #-Wmissing-prototypes \ #-Wmissing-declarations \ #-Wredundant-decls \ #-Wnested-externs \ #-Winline \ #-Werror \ #-Wshadow #-Wconversion # Additional flags to pass to the Objective-C compiler #ADDITIONAL_OBJCFLAGS+= # Additional flags to pass to the C compiler #ADDITIONAL_CFLAGS+= ifneq ($(GNUSTEP_GDOMAP_PORT_OVERRIDE),no) ADDITIONAL_CPPFLAGS += -DGDOMAP_PORT_OVERRIDE=$(GNUSTEP_GDOMAP_PORT_OVERRIDE) endif # Additional include directories the compiler should search ADDITIONAL_INCLUDE_DIRS = \ -I../Headers \ -I./$(GNUSTEP_TARGET_DIR) # Additional LDFLAGS to pass to the linker #ADDITIONAL_LDFLAGS+= # Additional library directories the linker should search ADDITIONAL_LIB_DIRS = -L$(GNUSTEP_OBJ_DIR) libgnustep-base_LIBRARIES_DEPEND_UPON += $(AUXILIARY_OBJC_LIBS) $(OBJC_LIBS) ifeq ($(shared),yes) libgnustep-base_LIBRARIES_DEPEND_UPON += $(TARGET_SYSTEM_LIBS) libgnustep-baseadd_LIBRARIES_DEPEND_UPON += $(TARGET_SYSTEM_LIBS) endif # # Flags dealing with installing and uninstalling # # Additional directories to be created during installation ADDITIONAL_INSTALL_DIRS = $(GNUSTEP_HEADERS)/Foundation \ $(GNUSTEP_HEADERS)/GNUstepBase \ HEADER_DIR_BASE = ../Headers/GNUstepBase HEADER_DIR_FND = ../Headers/Foundation gnustep-base-1.29.0/Source/NSAffineTransform.m000066400000000000000000000411141435650067400211560ustar00rootroot00000000000000/** NSAffineTransform.m This class provides a way to perform affine transforms. It provides a matrix for transforming from one coordinate system to another. Copyright (C) 1996,1999 Free Software Foundation, Inc. Author: Ovidiu Predescu Date: August 1997 Author: Richard Frith-Macdonald Date: March 1999 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #include #define EXPOSE_NSAffineTransform_IVARS 1 #import "Foundation/NSArray.h" #import "Foundation/NSData.h" #import "Foundation/NSException.h" #import "Foundation/NSAffineTransform.h" #import "Foundation/NSCoder.h" /* Private definitions */ #define A _matrix.m11 #define B _matrix.m12 #define C _matrix.m21 #define D _matrix.m22 #define TX _matrix.tX #define TY _matrix.tY /* A Postscript matrix looks like this: / a b 0 \ | c d 0 | \ tx ty 1 / */ static const CGFloat pi = 3.1415926535897932384626434; #if 0 #define valid(o) NSAssert((o->_isIdentity && o->A==1.0 && o->B==0.0 && o->C==0.0 && o->D==1.0) || (o->_isFlipY && o->A==1.0 && o->B==0.0 && o->C==0.0 && o->D==-1.0) || !(o->_isIdentity||o->_isFlipY), NSInternalInconsistencyException) #define check() valid(self) #else #define valid(o) #define check() #endif /* Quick function to multiply two coordinate matrices. C = AB */ static inline NSAffineTransformStruct matrix_multiply (NSAffineTransformStruct MA, NSAffineTransformStruct MB) { NSAffineTransformStruct MC; MC.m11 = MA.m11 * MB.m11 + MA.m12 * MB.m21; MC.m12 = MA.m11 * MB.m12 + MA.m12 * MB.m22; MC.m21 = MA.m21 * MB.m11 + MA.m22 * MB.m21; MC.m22 = MA.m21 * MB.m12 + MA.m22 * MB.m22; MC.tX = MA.tX * MB.m11 + MA.tY * MB.m21 + MB.tX; MC.tY = MA.tX * MB.m12 + MA.tY * MB.m22 + MB.tY; return MC; } /* MC.m11 = MA->A * MB->A + MA->B * MB->C; MC.m12 = MA->A * MB->B + MA->B * MB->D; MC.m21 = MA->C * MB->A + MA->D * MB->C; MC.m22 = MA->C * MB->B + MA->D * MB->D; MC.tX = MA->TX * MB->A + MA->TY * MB->C + MB->TX; MC.tY = MA->TX * MB->B + MA->TY * MB->D + MB->TY; */ @implementation NSAffineTransform static NSAffineTransformStruct identityTransform = { 1.0, 0.0, 0.0, 1.0, 0.0, 0.0 }; /** * Return an autoreleased instance of this class. */ + (NSAffineTransform*) transform { NSAffineTransform *t; t = (NSAffineTransform*)NSAllocateObject(self, 0, NSDefaultMallocZone()); t->_matrix = identityTransform; t->_isIdentity = YES; return AUTORELEASE(t); } /** * Return an autoreleased instance of this class. */ + (id) new { NSAffineTransform *t; t = (NSAffineTransform*)NSAllocateObject(self, 0, NSDefaultMallocZone()); t->_matrix = identityTransform; t->_isIdentity = YES; return t; } /** * Appends the transform matrix to the receiver. This is done by performing a * matrix multiplication of the receiver with aTransform so that aTransform * is the first transform applied to the user coordinate. The new * matrix then replaces the receiver's matrix. */ - (void) appendTransform: (NSAffineTransform*)aTransform { valid(aTransform); if (aTransform->_isIdentity) { TX += aTransform->TX; TY += aTransform->TY; check(); return; } if (aTransform->_isFlipY) { B = -B; D = -D; TX = aTransform->TX + TX; TY = aTransform->TY - TY; if (_isIdentity) { _isFlipY = YES; _isIdentity = NO; } else if (_isFlipY) { _isFlipY = NO; _isIdentity = YES; } check(); return; } if (_isIdentity) { CGFloat newTX; A = aTransform->A; B = aTransform->B; C = aTransform->C; D = aTransform->D; newTX = TX * aTransform->A + TY * aTransform->C + aTransform->TX; TY = TX * aTransform->B + TY * aTransform->D + aTransform->TY; TX = newTX; _isIdentity = NO; // because aTransform is not an identity transform. _isFlipY = aTransform->_isFlipY; check(); return; } if (_isFlipY) { CGFloat newTX; A = aTransform->A; B = aTransform->B; C = -aTransform->C; D = -aTransform->D; newTX = TX * aTransform->A + TY * aTransform->C + aTransform->TX; TY = TX * aTransform->B + TY * aTransform->D + aTransform->TY; TX = newTX; _isIdentity = NO; _isFlipY = NO; check(); return; } _matrix = matrix_multiply(_matrix, aTransform->_matrix); _isIdentity = NO; _isFlipY = NO; check(); } - (NSString*) description { return [NSString stringWithFormat: @"NSAffineTransform ((%f, %f) (%f, %f) (%f, %f))", A, B, C, D, TX, TY]; } /** * Initialize the transformation matrix instance to the identity matrix. * The identity matrix transforms a point to itself. */ - (id) init { _matrix = identityTransform; _isIdentity = YES; return self; } /** * Initialize the receiever's instance with the instance represented * by aTransform. */ - (id) initWithTransform: (NSAffineTransform*)aTransform { _matrix = aTransform->_matrix; _isIdentity = aTransform->_isIdentity; _isFlipY = aTransform->_isFlipY; return self; } /** * Calculates the inverse of the receiver's matrix and replaces the * receiever's matrix with it. */ - (void) invert { CGFloat newA, newB, newC, newD, newTX, newTY; CGFloat det; if (_isIdentity) { TX = -TX; TY = -TY; return; } if (_isFlipY) { TX = -TX; return; } det = A * D - B * C; if (det == 0) { NSLog (@"error: determinant of matrix is 0!"); return; } newA = D / det; newB = -B / det; newC = -C / det; newD = A / det; newTX = (-D * TX + C * TY) / det; newTY = (B * TX - A * TY) / det; NSDebugLLog(@"NSAffineTransform", @"inverse of matrix ((%f, %f) (%f, %f) (%f, %f))\n" @"is ((%f, %f) (%f, %f) (%f, %f))", A, B, C, D, TX, TY, newA, newB, newC, newD, newTX, newTY); A = newA; B = newB; C = newC; D = newD; TX = newTX; TY = newTY; } /** * Prepends the transform matrix to the receiver. This is done by performing a * matrix multiplication of the receiver with aTransform so that aTransform * is the last transform applied to the user coordinate. The new * matrix then replaces the receiver's matrix. */ - (void) prependTransform: (NSAffineTransform*)aTransform { valid(aTransform); if (aTransform->_isIdentity) { CGFloat newTX; newTX = aTransform->TX * A + aTransform->TY * C + TX; TY = aTransform->TX * B + aTransform->TY * D + TY; TX = newTX; check(); return; } if (aTransform->_isFlipY) { CGFloat newTX; newTX = aTransform->TX * A + aTransform->TY * C + TX; TY = aTransform->TX * B + aTransform->TY * D + TY; TX = newTX; C = -C; D = -D; if (_isIdentity) { _isFlipY = YES; _isIdentity = NO; } else if (_isFlipY) { _isFlipY = NO; _isIdentity = YES; } check(); return; } if (_isIdentity) { A = aTransform->A; B = aTransform->B; C = aTransform->C; D = aTransform->D; TX += aTransform->TX; TY += aTransform->TY; _isIdentity = NO; _isFlipY = aTransform->_isFlipY; check(); return; } if (_isFlipY) { A = aTransform->A; B = -aTransform->B; C = aTransform->C; D = -aTransform->D; TX += aTransform->TX; TY -= aTransform->TY; _isIdentity = NO; _isFlipY = NO; check(); return; } _matrix = matrix_multiply(aTransform->_matrix, _matrix); _isIdentity = NO; _isFlipY = NO; check(); } /** * Applies the rotation specified by angle in degrees. Points transformed * with the transformation matrix of the receiver are rotated counter-clockwise * by the number of degrees specified by angle. */ - (void) rotateByDegrees: (CGFloat)angle { [self rotateByRadians: pi * angle / 180]; } /** * Applies the rotation specified by angle in radians. Points transformed * with the transformation matrix of the receiver are rotated counter-clockwise * by the number of radians specified by angle. */ - (void) rotateByRadians: (CGFloat)angleRad { if (angleRad != 0.0) { CGFloat sine; CGFloat cosine; NSAffineTransformStruct rotm; sine = sin (angleRad); cosine = cos (angleRad); rotm.m11 = cosine; rotm.m12 = sine; rotm.m21 = -sine; rotm.m22 = cosine; rotm.tX = rotm.tY = 0; _matrix = matrix_multiply(rotm, _matrix); _isIdentity = NO; _isFlipY = NO; check(); } } /** * Scales the transformation matrix of the reciever by the factor specified * by scale. */ - (void) scaleBy: (CGFloat)scale { NSAffineTransformStruct scam = identityTransform; scam.m11 = scale; scam.m22 = scale; _matrix = matrix_multiply(scam, _matrix); _isIdentity = NO; _isFlipY = NO; check(); } /** * Scales the X axis of the receiver's transformation matrix * by scaleX and the Y axis of the transformation matrix by scaleY. */ - (void) scaleXBy: (CGFloat)scaleX yBy: (CGFloat)scaleY { if (_isIdentity && scaleX == 1.0) { if (scaleY == 1.0) { return; // no scaling } if (scaleY == -1.0) { D = -1.0; _isFlipY = YES; _isIdentity = NO; return; } } if (_isFlipY && scaleX == 1.0) { if (scaleY == 1.0) { return; // no scaling } if (scaleY == -1.0) { D = 1.0; _isFlipY = NO; _isIdentity = YES; return; } } A *= scaleX; B *= scaleX; C *= scaleY; D *= scaleY; _isIdentity = NO; _isFlipY = NO; } /** *

* Sets the structure which represents the matrix of the reciever. * The struct is of the form:

*

{m11, m12, m21, m22, tX, tY}

*/ - (void) setTransformStruct: (NSAffineTransformStruct)val { _matrix = val; _isIdentity = NO; _isFlipY = NO; if (A == 1.0 && B == 0.0 && C == 0.0) { if (D == 1.0) { _isIdentity = YES; } else if (D == -1.0) { _isFlipY = YES; } } check(); } /** * Transforms a single point based on the transformation matrix. * Returns the resulting point. */ - (NSPoint) transformPoint: (NSPoint)aPoint { NSPoint new; if (_isIdentity) { new.x = TX + aPoint.x; new.y = TY + aPoint.y; } else if (_isFlipY) { new.x = TX + aPoint.x; new.y = TY - aPoint.y; } else { new.x = A * aPoint.x + C * aPoint.y + TX; new.y = B * aPoint.x + D * aPoint.y + TY; } return new; } /** * Transforms the NSSize represented by aSize using the reciever's * transformation matrix. Returns the resulting NSSize.
* NB. A transform can result in negative size components ... so calling * code should check for and deal with that situation. */ - (NSSize) transformSize: (NSSize)aSize { if (_isIdentity) { return aSize; } else { NSSize new; if (_isFlipY) { new.width = aSize.width; new.height = -aSize.height; } else { new.width = A * aSize.width + C * aSize.height; new.height = B * aSize.width + D * aSize.height; } return new; } } /** *

* Returns the NSAffineTransformStruct structure * which represents the matrix of the reciever. * The struct is of the form:

*

{m11, m12, m21, m22, tX, tY}

*/ - (NSAffineTransformStruct) transformStruct { return _matrix; } /** * Applies the translation specified by tranX and tranY to the receiver's * matrix. * Points transformed by the reciever's matrix after this operation will * be shifted in position based on the specified translation. */ - (void) translateXBy: (CGFloat)tranX yBy: (CGFloat)tranY { if (_isIdentity) { TX += tranX; TY += tranY; } else if (_isFlipY) { TX += tranX; TY -= tranY; } else { TX += A * tranX + C * tranY; TY += B * tranX + D * tranY; } check(); } - (id) copyWithZone: (NSZone*)zone { return NSCopyObject(self, 0, zone); } - (BOOL) isEqual: (id)anObject { if (anObject == self) { return YES; } if (YES == [anObject isKindOfClass: [NSAffineTransform class]]) { NSAffineTransformStruct o = [anObject transformStruct]; if (0 == memcmp((void*)&o, (void*)&_matrix, sizeof(o))) { return YES; } } return NO; } - (id) initWithCoder: (NSCoder*)aCoder { NSAffineTransformStruct replace = identityTransform; if ([aCoder allowsKeyedCoding]) { if ([aCoder containsValueForKey: @"NSTransformStruct"]) { NSUInteger length; const uint8_t *data; NSData *d; unsigned int cursor = 0; data = [aCoder decodeBytesForKey: @"NSTransformStruct" returnedLength: &length]; d = [NSData dataWithBytes: data length: length]; if (length == 9) { float f, g; replace = identityTransform; cursor = 1; [d deserializeDataAt: &f ofObjCType: "f" atCursor: &cursor context: nil]; [d deserializeDataAt: &g ofObjCType: "f" atCursor: &cursor context: nil]; if (data[0] == 1) { replace.tX = f; replace.tY = g; } else if (data[0] == 2) { replace.m11 = f; replace.m22 = g; } else { // FIXME NSLog(@"Got type %d for affine transform", data[0]); return [self notImplemented: _cmd]; } } else if (16 == length) { float s[4]; [d deserializeDataAt: s ofObjCType: "[4f]" atCursor: &cursor context: nil]; replace.m11 = s[0]; replace.m22 = s[1]; replace.tX = s[2]; replace.tY = s[3]; } else if (24 == length) { float s[6]; [d deserializeDataAt: s ofObjCType: "[6f]" atCursor: &cursor context: nil]; replace.m11 = s[0]; replace.m12 = s[1]; replace.m21 = s[2]; replace.m22 = s[3]; replace.tX = s[4]; replace.tY = s[5]; } else { // FIXME NSLog(@"Got data %@ len %d for affine transform", d, (int)length); return [self notImplemented: _cmd]; } } else { replace = identityTransform; } } else { [aCoder decodeArrayOfObjCType: @encode(CGFloat) count: 6 at: (CGFloat*)&replace]; } [self setTransformStruct: replace]; return self; } - (void) encodeWithCoder: (NSCoder*)aCoder { NSAffineTransformStruct replace; replace = [self transformStruct]; if ([aCoder allowsKeyedCoding]) { if (!_isIdentity) { float s[6]; NSMutableData *d = [NSMutableData data]; s[0] = replace.m11; s[1] = replace.m12; s[2] = replace.m21; s[3] = replace.m22; s[4] = replace.tX; s[5] = replace.tY; [d serializeDataAt: s ofObjCType: "[6f]" context: nil]; [aCoder encodeBytes: [d bytes] length: [d length] forKey: @"NSTransformStruct"]; } } else { [aCoder encodeArrayOfObjCType: @encode(CGFloat) count: 6 at: (CGFloat*)&replace]; } } @end /* NSAffineTransform */ gnustep-base-1.29.0/Source/NSAppleEventDescriptor.m000066400000000000000000000020241435650067400221710ustar00rootroot00000000000000/* Implementation of class NSAppleEventDescriptor Copyright (C) 2019 Free Software Foundation, Inc. By: heron Date: Fri Nov 1 00:25:01 EDT 2019 This file is part of the GNUstep Library. 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 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 USA. */ #include @implementation NSAppleEventDescriptor @end gnustep-base-1.29.0/Source/NSAppleEventManager.m000066400000000000000000000020131435650067400214230ustar00rootroot00000000000000/* Implementation of class NSAppleEventManager Copyright (C) 2019 Free Software Foundation, Inc. By: heron Date: Fri Nov 1 00:25:06 EDT 2019 This file is part of the GNUstep Library. 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 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 USA. */ #include @implementation NSAppleEventManager @end gnustep-base-1.29.0/Source/NSAppleScript.m000066400000000000000000000020461435650067400203210ustar00rootroot00000000000000 /* Implementation of class NSAppleScript Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory John Casamento Date: Thu Sep 26 09:49:55 EDT 2019 This file is part of the GNUstep Library. 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 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 USA. */ #include @implementation NSAppleScript @end gnustep-base-1.29.0/Source/NSArchiver.m000066400000000000000000000626651435650067400176530ustar00rootroot00000000000000/** Implementation of NSArchiver for GNUstep Copyright (C) 1998,1999 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: October 1998 This file is part of the GNUstep Base Library. 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 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 USA. NSArchiver class reference $Date$ $Revision$ */ #import "common.h" #if !defined (__GNU_LIBOBJC__) # include #endif #define EXPOSE_NSArchiver_IVARS 1 #define EXPOSE_NSUnarchiver_IVARS 1 /* * Setup for inline operation of pointer map tables. */ #define GSI_MAP_KTYPES GSUNION_NSINT | GSUNION_PTR | GSUNION_OBJ | GSUNION_CLS #define GSI_MAP_VTYPES GSUNION_NSINT | GSUNION_PTR | GSUNION_OBJ #define GSI_MAP_RETAIN_KEY(M, X) #define GSI_MAP_RELEASE_KEY(M, X) #define GSI_MAP_RETAIN_VAL(M, X) #define GSI_MAP_RELEASE_VAL(M, X) #define GSI_MAP_HASH(M, X) ((X).nsu) #define GSI_MAP_EQUAL(M, X,Y) ((X).ptr == (Y).ptr) #define GSI_MAP_NOCLEAN 1 #include "GNUstepBase/GSIMap.h" #define _IN_NSARCHIVER_M #import "Foundation/NSArchiver.h" #undef _IN_NSARCHIVER_M #import "Foundation/NSCoder.h" #import "Foundation/NSData.h" #import "Foundation/NSException.h" typedef unsigned char uchar; #define PREFIX "GNUstep archive" static SEL serSel; static SEL tagSel; static SEL xRefSel; static SEL eObjSel; static SEL eValSel; @class NSMutableDataMalloc; @interface NSMutableDataMalloc : NSObject // Help the compiler @end static Class NSMutableDataMallocClass; /** *

Implementation of [NSCoder] capable of creating sequential archives which * must be read in the same order they were written. This class implements * methods for saving to and restoring from a serial archive (usually a file * on disk, but can be an [NSData] object) as well as methods that can be * used by objects that need to write/restore themselves.

* *

Note, the sibling class [NSKeyedArchiver] supports a form of archive * that is more robust to class changes, and is recommended over this one.

*/ @implementation NSArchiver + (void) initialize { if (self == [NSArchiver class]) { serSel = @selector(serializeDataAt:ofObjCType:context:); tagSel = @selector(serializeTypeTag:); xRefSel = @selector(serializeTypeTag:andCrossRef:); eObjSel = @selector(encodeObject:); eValSel = @selector(encodeValueOfObjCType:at:); NSMutableDataMallocClass = [NSMutableDataMalloc class]; } } /** * Creates an NSMutableData instance and calls * [initForWritingWithMutableData:]. */ - (id) init { NSMutableData *d; d = [[NSMutableDataMallocClass allocWithZone: [self zone]] init]; self = [self initForWritingWithMutableData: d]; RELEASE(d); return self; } /** * Init instance that will archive its data to mdata. (Even if * [archiveRootObject:toFile:] is called, this still gets written to.) */ - (id) initForWritingWithMutableData: (NSMutableData*)mdata { self = [super init]; if (self) { NSZone *zone = [self zone]; _data = RETAIN(mdata); if ([self directDataAccess] == YES) { _dst = _data; } else { _dst = self; } _serImp = [_dst methodForSelector: serSel]; _tagImp = [_dst methodForSelector: tagSel]; _xRefImp = [_dst methodForSelector: xRefSel]; _eObjImp = [self methodForSelector: eObjSel]; _eValImp = [self methodForSelector: eValSel]; [self resetArchiver]; /* * Set up map tables. */ _clsMap = (GSIMapTable)NSZoneMalloc(zone, sizeof(GSIMapTable_t)*6); _cIdMap = &_clsMap[1]; _uIdMap = &_clsMap[2]; _ptrMap = &_clsMap[3]; _namMap = &_clsMap[4]; _repMap = &_clsMap[5]; GSIMapInitWithZoneAndCapacity(_clsMap, zone, 100); GSIMapInitWithZoneAndCapacity(_cIdMap, zone, 10); GSIMapInitWithZoneAndCapacity(_uIdMap, zone, 200); GSIMapInitWithZoneAndCapacity(_ptrMap, zone, 100); GSIMapInitWithZoneAndCapacity(_namMap, zone, 1); GSIMapInitWithZoneAndCapacity(_repMap, zone, 1); } return self; } - (void) dealloc { RELEASE(_data); if (_clsMap) { GSIMapEmptyMap(_clsMap); if (_cIdMap) { GSIMapEmptyMap(_cIdMap); } if (_uIdMap) { GSIMapEmptyMap(_uIdMap); } if (_ptrMap) { GSIMapEmptyMap(_ptrMap); } if (_namMap) { GSIMapEmptyMap(_namMap); } if (_repMap) { GSIMapEmptyMap(_repMap); } NSZoneFree(_clsMap->zone, (void*)_clsMap); } [super dealloc]; } /** * Writes serialized representation of object and, recursively, any * other objects it holds references to, to byte array. */ + (NSData*) archivedDataWithRootObject: (id)rootObject { NSArchiver *archiver; id d; NSZone *z = NSDefaultMallocZone(); d = [[NSMutableDataMallocClass allocWithZone: z] initWithCapacity: 0]; if (d == nil) { return nil; } archiver = [[self allocWithZone: z] initForWritingWithMutableData: d]; RELEASE(d); d = nil; if (archiver) { NS_DURING { [archiver encodeRootObject: rootObject]; d = AUTORELEASE([archiver->_data copy]); } NS_HANDLER { RELEASE(archiver); [localException raise]; } NS_ENDHANDLER RELEASE(archiver); } return d; } /** * Writes out serialized representation of object and, recursively, any * other objects it holds references to. */ + (BOOL) archiveRootObject: (id)rootObject toFile: (NSString*)path { id d = [self archivedDataWithRootObject: rootObject]; return [d writeToFile: path atomically: YES]; } - (void) encodeArrayOfObjCType: (const char*)type count: (NSUInteger)count at: (const void*)buf { uint32_t c; uint8_t bytes[20]; uint8_t *bytePtr = 0; uint8_t byteCount = 0; NSUInteger i; NSUInteger offset = 0; uint32_t size; uint32_t version; uchar info; type = GSSkipTypeQualifierAndLayoutInfo(type); size = objc_sizeof_type(type); version = [self systemVersion]; if (12402 == version) { NSUInteger tmp = count; bytes[sizeof(bytes) - ++byteCount] = (uint8_t)(tmp % 128); tmp /= 128; while (tmp > 0) { bytes[sizeof(bytes) - ++byteCount] = (uint8_t)(128 | (tmp % 128)); tmp /= 128; } bytePtr = &bytes[sizeof(bytes) - byteCount]; } /* We normally store the count as a 32bit integer ... but if it's * very big, we store 0xffffffff and then an additional 64bit value * containing the actual count. */ if (count >= 0xffffffff) { c = 0xffffffff; } else { c = count; } switch (*type) { case _C_ID: info = _GSC_NONE; break; case _C_CHR: info = _GSC_CHR; break; case _C_UCHR: info = _GSC_UCHR; break; case _C_SHT: info = _GSC_SHT | _GSC_S_SHT; break; case _C_USHT: info = _GSC_USHT | _GSC_S_SHT; break; case _C_INT: info = _GSC_INT | _GSC_S_INT; break; case _C_UINT: info = _GSC_UINT | _GSC_S_INT; break; case _C_LNG: info = _GSC_LNG | _GSC_S_LNG; break; case _C_ULNG: info = _GSC_ULNG | _GSC_S_LNG; break; case _C_LNG_LNG: info = _GSC_LNG_LNG | _GSC_S_LNG_LNG; break; case _C_ULNG_LNG: info = _GSC_ULNG_LNG | _GSC_S_LNG_LNG; break; case _C_FLT: info = _GSC_FLT; break; case _C_DBL: info = _GSC_DBL; break; #if defined(_C_BOOL) && (!defined(__GNUC__) || __GNUC__ > 2) case _C_BOOL: info = _GSC_BOOL; break; #endif default: info = _GSC_NONE; break; } /* * Simple types can be serialized immediately, more complex ones * are dealt with by our [encodeValueOfObjCType:at:] method. */ if (info == _GSC_NONE) { if (_initialPass == NO) { (*_tagImp)(_dst, tagSel, _GSC_ARY_B); if (12402 == version) { for (i = 0; i < byteCount; i++) { (*_serImp)(_dst, serSel, bytePtr + i, @encode(uint8_t), nil); } } else { (*_serImp)(_dst, serSel, &c, @encode(uint32_t), nil); if (0xffffffff == c) { (*_serImp)(_dst, serSel, &count, @encode(NSUInteger), nil); } } } for (i = 0; i < c; i++) { (*_eValImp)(self, eValSel, type, (char*)buf + offset); offset += size; } } else if (_initialPass == NO) { (*_tagImp)(_dst, tagSel, _GSC_ARY_B); if (12402 == version) { for (i = 0; i < byteCount; i++) { (*_serImp)(_dst, serSel, bytePtr + i, @encode(uint8_t), nil); } } else { (*_serImp)(_dst, serSel, &c, @encode(uint32_t), nil); if (0xffffffff == c) { (*_serImp)(_dst, serSel, &count, @encode(NSUInteger), nil); } } (*_tagImp)(_dst, tagSel, info); for (i = 0; i < count; i++) { (*_serImp)(_dst, serSel, (char*)buf + offset, type, nil); offset += size; } } } - (void) encodeValueOfObjCType: (const char*)type at: (const void*)buf { type = GSSkipTypeQualifierAndLayoutInfo(type); switch (*type) { case _C_ID: (*_eObjImp)(self, eObjSel, *(void**)buf); return; case _C_ARY_B: { unsigned count = atoi(++type); while (isdigit(*type)) { type++; } if (_initialPass == NO) { (*_tagImp)(_dst, tagSel, _GSC_ARY_B); } [self encodeArrayOfObjCType: type count: count at: buf]; } return; case _C_STRUCT_B: { struct objc_struct_layout layout; if (_initialPass == NO) { (*_tagImp)(_dst, tagSel, _GSC_STRUCT_B); } objc_layout_structure (type, &layout); while (objc_layout_structure_next_member (&layout)) { unsigned offset; unsigned align; const char *ftype; objc_layout_structure_get_info (&layout, &offset, &align, &ftype); (*_eValImp)(self, eValSel, ftype, (char*)buf + offset); } } return; case _C_PTR: if (*(void**)buf == 0) { if (_initialPass == NO) { /* * Special case - a null pointer gets an xref of zero */ (*_tagImp)(_dst, tagSel, _GSC_PTR | _GSC_XREF | _GSC_X_0); } } else { GSIMapNode node; node = GSIMapNodeForKey(_ptrMap, (GSIMapKey)*(void**)buf); if (_initialPass == YES) { /* * First pass - add pointer to map and encode item pointed * to in case it is a conditionally encoded object. */ if (node == 0) { GSIMapAddPair(_ptrMap, (GSIMapKey)*(void**)buf, (GSIMapVal)(NSUInteger)0); type++; buf = *(char**)buf; (*_eValImp)(self, eValSel, type, buf); } } else if (node == 0 || node->value.nsu == 0) { /* * Second pass, unwritten pointer - write it. */ if (node == 0) { node = GSIMapAddPair(_ptrMap, (GSIMapKey)*(void**)buf, (GSIMapVal)(NSUInteger)++_xRefP); } else { node->value.nsu = ++_xRefP; } (*_xRefImp)(_dst, xRefSel, _GSC_PTR, node->value.nsu); type++; buf = *(char**)buf; (*_eValImp)(self, eValSel, type, buf); } else { /* * Second pass, write a cross-reference number. */ (*_xRefImp)(_dst, xRefSel, _GSC_PTR|_GSC_XREF, node->value.nsu); } } return; default: /* Types that can be ignored in first pass. */ if (_initialPass) { return; } break; } switch (*type) { case _C_CLASS: if (*(Class*)buf == 0) { /* * Special case - a null pointer gets an xref of zero */ (*_tagImp)(_dst, tagSel, _GSC_CLASS | _GSC_XREF | _GSC_X_0); } else { Class c = *(Class*)buf; GSIMapNode node; BOOL done = NO; node = GSIMapNodeForKey(_clsMap, (GSIMapKey)(void*)c); if (node != 0) { (*_xRefImp)(_dst, xRefSel, _GSC_CLASS | _GSC_XREF, node->value.nsu); return; } while (done == NO) { int tmp = class_getVersion(c); unsigned version = tmp; Class s = class_getSuperclass(c); if (tmp < 0) { [NSException raise: NSInternalInconsistencyException format: @"negative class version"]; } node = GSIMapAddPair(_clsMap, (GSIMapKey)(void*)c, (GSIMapVal)(NSUInteger)++_xRefC); /* * Encode tag and crossref number. */ (*_xRefImp)(_dst, xRefSel, _GSC_CLASS, node->value.nsu); /* * Encode class, and version. */ (*_serImp)(_dst, serSel, &c, @encode(Class), nil); (*_serImp)(_dst, serSel, &version, @encode(unsigned), nil); /* * If we have a super class that has not been encoded, * we must loop round to encode it here so that its * version information will be available when objects * of its subclasses are decoded and call * [super initWithCoder:ccc] */ if (s == c || s == 0 || GSIMapNodeForKey(_clsMap, (GSIMapKey)(void*)s) != 0) { done = YES; } else { c = s; } } /* * Encode an empty tag to terminate the list of classes. */ (*_tagImp)(_dst, tagSel, _GSC_NONE); } return; case _C_SEL: if (*(SEL*)buf == 0) { /* * Special case - a null pointer gets an xref of zero */ (*_tagImp)(_dst, tagSel, _GSC_SEL | _GSC_XREF | _GSC_X_0); } else { SEL s = *(SEL*)buf; GSIMapNode node = GSIMapNodeForKey(_ptrMap, (GSIMapKey)(void*)s); if (node == 0) { node = GSIMapAddPair(_ptrMap, (GSIMapKey)(void*)s, (GSIMapVal)(NSUInteger)++_xRefP); (*_xRefImp)(_dst, xRefSel, _GSC_SEL, node->value.nsu); /* * Encode selector. */ (*_serImp)(_dst, serSel, buf, @encode(SEL), nil); } else { (*_xRefImp)(_dst, xRefSel, _GSC_SEL|_GSC_XREF, node->value.nsu); } } return; case _C_CHARPTR: if (*(char**)buf == 0) { /* * Special case - a null pointer gets an xref of zero */ (*_tagImp)(_dst, tagSel, _GSC_CHARPTR | _GSC_XREF | _GSC_X_0); } else { GSIMapNode node; node = GSIMapNodeForKey(_ptrMap, (GSIMapKey)*(char**)buf); if (node == 0) { node = GSIMapAddPair(_ptrMap, (GSIMapKey)*(char**)buf, (GSIMapVal)(NSUInteger)++_xRefP); (*_xRefImp)(_dst, xRefSel, _GSC_CHARPTR, node->value.nsu); (*_serImp)(_dst, serSel, buf, type, nil); } else { (*_xRefImp)(_dst, xRefSel, _GSC_CHARPTR|_GSC_XREF, node->value.nsu); } } return; case _C_CHR: (*_tagImp)(_dst, tagSel, _GSC_CHR); (*_serImp)(_dst, serSel, (void*)buf, @encode(signed char), nil); return; case _C_UCHR: (*_tagImp)(_dst, tagSel, _GSC_UCHR); (*_serImp)(_dst, serSel, (void*)buf, @encode(unsigned char), nil); return; case _C_SHT: (*_tagImp)(_dst, tagSel, _GSC_SHT | _GSC_S_SHT); (*_serImp)(_dst, serSel, (void*)buf, @encode(short), nil); return; case _C_USHT: (*_tagImp)(_dst, tagSel, _GSC_USHT | _GSC_S_SHT); (*_serImp)(_dst, serSel, (void*)buf, @encode(unsigned short), nil); return; case _C_INT: (*_tagImp)(_dst, tagSel, _GSC_INT | _GSC_S_INT); (*_serImp)(_dst, serSel, (void*)buf, @encode(int), nil); return; case _C_UINT: (*_tagImp)(_dst, tagSel, _GSC_UINT | _GSC_S_INT); (*_serImp)(_dst, serSel, (void*)buf, @encode(unsigned int), nil); return; case _C_LNG: (*_tagImp)(_dst, tagSel, _GSC_LNG | _GSC_S_LNG); (*_serImp)(_dst, serSel, (void*)buf, @encode(long), nil); return; case _C_ULNG: (*_tagImp)(_dst, tagSel, _GSC_ULNG | _GSC_S_LNG); (*_serImp)(_dst, serSel, (void*)buf, @encode(unsigned long), nil); return; case _C_LNG_LNG: (*_tagImp)(_dst, tagSel, _GSC_LNG_LNG | _GSC_S_LNG_LNG); (*_serImp)(_dst, serSel, (void*)buf, @encode(long long), nil); return; case _C_ULNG_LNG: (*_tagImp)(_dst, tagSel, _GSC_ULNG_LNG | _GSC_S_LNG_LNG); (*_serImp)(_dst, serSel, (void*)buf, @encode(unsigned long long), nil); return; case _C_FLT: (*_tagImp)(_dst, tagSel, _GSC_FLT); (*_serImp)(_dst, serSel, (void*)buf, @encode(float), nil); return; case _C_DBL: (*_tagImp)(_dst, tagSel, _GSC_DBL); (*_serImp)(_dst, serSel, (void*)buf, @encode(double), nil); return; #if defined(_C_BOOL) && (!defined(__GNUC__) || __GNUC__ > 2) case _C_BOOL: (*_tagImp)(_dst, tagSel, _GSC_BOOL); (*_serImp)(_dst, serSel, (void*)buf, @encode(_Bool), nil); return; #endif case _C_VOID: [NSException raise: NSInvalidArgumentException format: @"can't encode void item"]; default: [NSException raise: NSInvalidArgumentException format: @"item with unknown type - %s", type]; } } - (void) encodeRootObject: (id)rootObject { if (_encodingRoot) { [NSException raise: NSInvalidArgumentException format: @"encoding root object more than once"]; } _encodingRoot = YES; /* * First pass - find conditional objects. */ _initialPass = YES; (*_eObjImp)(self, eObjSel, rootObject); /* * Second pass - write archive. */ _initialPass = NO; (*_eObjImp)(self, eObjSel, rootObject); /* * Write sizes of crossref arrays to head of archive. */ [self serializeHeaderAt: _startPos version: [self systemVersion] classes: _clsMap->nodeCount objects: _uIdMap->nodeCount pointers: _ptrMap->nodeCount]; _encodingRoot = NO; } - (void) encodeConditionalObject: (id)anObject { if (_encodingRoot == NO) { [NSException raise: NSInvalidArgumentException format: @"conditionally encoding without root object"]; return; } if (_initialPass) { GSIMapNode node; /* * Conditionally encoding 'nil' is a no-op. */ if (anObject == nil) { return; } /* * If we have already conditionally encoded this object, we can * ignore it this time. */ node = GSIMapNodeForKey(_cIdMap, (GSIMapKey)anObject); if (node != 0) { return; } /* * If we have unconditionally encoded this object, we can ignore * it now. */ node = GSIMapNodeForKey(_uIdMap, (GSIMapKey)anObject); if (node != 0) { return; } GSIMapAddPair(_cIdMap, (GSIMapKey)anObject, (GSIMapVal)(NSUInteger)0); } else if (anObject == nil) { (*_eObjImp)(self, eObjSel, nil); } else { GSIMapNode node; if (_repMap->nodeCount) { node = GSIMapNodeForKey(_repMap, (GSIMapKey)anObject); if (node) { anObject = (id)node->value.ptr; } } node = GSIMapNodeForKey(_cIdMap, (GSIMapKey)anObject); if (node != 0) { (*_eObjImp)(self, eObjSel, nil); } else { (*_eObjImp)(self, eObjSel, anObject); } } } - (void) encodeDataObject: (NSData*)anObject { unsigned l = [anObject length]; (*_eValImp)(self, eValSel, @encode(unsigned int), &l); if (l) { const void *b = [anObject bytes]; unsigned char c = 0; /* Type tag */ /* * The type tag 'c' is used to specify an encoding scheme for the * actual data - at present we have '0' meaning raw data. In the * future we might want zipped data for instance. */ (*_eValImp)(self, eValSel, @encode(unsigned char), &c); [self encodeArrayOfObjCType: @encode(unsigned char) count: l at: b]; } } - (void) encodeObject: (id)anObject { if (anObject == nil) { if (_initialPass == NO) { /* * Special case - encode a nil pointer as a crossref of zero. */ (*_tagImp)(_dst, tagSel, _GSC_ID | _GSC_XREF, _GSC_X_0); } } else { GSIMapNode node; /* * Substitute replacement object if required. */ node = GSIMapNodeForKey(_repMap, (GSIMapKey)anObject); if (node) { anObject = (id)node->value.ptr; } /* * See if the object has already been encoded. */ node = GSIMapNodeForKey(_uIdMap, (GSIMapKey)anObject); if (_initialPass) { if (node == 0) { /* * Remove object from map of conditionally encoded objects * and add it to the map of unconditionay encoded ones. */ GSIMapRemoveKey(_cIdMap, (GSIMapKey)anObject); GSIMapAddPair(_uIdMap, (GSIMapKey)anObject, (GSIMapVal)(NSUInteger)0); [anObject encodeWithCoder: self]; } return; } if (node == 0 || node->value.nsu == 0) { Class cls; id obj; if (node == 0) { node = GSIMapAddPair(_uIdMap, (GSIMapKey)anObject, (GSIMapVal)(NSUInteger)++_xRefO); } else { node->value.nsu = ++_xRefO; } obj = [anObject replacementObjectForArchiver: self]; if (GSObjCIsInstance(obj) == NO) { /* * If the object we have been given is actually a class, * we encode it as a special case. */ (*_xRefImp)(_dst, xRefSel, _GSC_CID, node->value.nsu); (*_eValImp)(self, eValSel, @encode(Class), &obj); } else { cls = [obj classForArchiver]; if (_namMap->nodeCount) { GSIMapNode n; n = GSIMapNodeForKey(_namMap, (GSIMapKey)cls); if (n) { cls = (Class)n->value.ptr; } } (*_xRefImp)(_dst, xRefSel, _GSC_ID, node->value.nsu); (*_eValImp)(self, eValSel, @encode(Class), &cls); [obj encodeWithCoder: self]; } } else { (*_xRefImp)(_dst, xRefSel, _GSC_ID | _GSC_XREF, node->value.nsu); } } } /** * Returns whatever data has been encoded thus far. */ - (NSMutableData*) archiverData { return _data; } /** * Returns substitute class used to encode objects of given class. This * would have been set through an earlier call to * [NSArchiver -encodeClassName:intoClassName:]. */ - (NSString*) classNameEncodedForTrueClassName: (NSString*)trueName { if (_namMap->nodeCount) { GSIMapNode node; Class c; c = objc_lookUpClass([trueName cString]); node = GSIMapNodeForKey(_namMap, (GSIMapKey)c); if (node) { c = (Class)node->value.ptr; return [NSString stringWithUTF8String: class_getName(c)]; } } return trueName; } /** * Specify substitute class used in archiving objects of given class. This * class is written to the archive as the class to use for restoring the * object, instead of what is returned from [NSObject -classForArchiver]. * This can be used to provide backward compatibility across class name * changes. The object is still encoded by calling * encodeWithCoder: as normal. */ - (void) encodeClassName: (NSString*)trueName intoClassName: (NSString*)inArchiveName { GSIMapNode node; Class tc; Class ic; tc = objc_lookUpClass([trueName cString]); if (tc == 0) { [NSException raise: NSInternalInconsistencyException format: @"Can't find class '%@'.", trueName]; } ic = objc_lookUpClass([inArchiveName cString]); if (ic == 0) { [NSException raise: NSInternalInconsistencyException format: @"Can't find class '%@'.", inArchiveName]; } node = GSIMapNodeForKey(_namMap, (GSIMapKey)tc); if (node == 0) { GSIMapAddPair(_namMap, (GSIMapKey)(void*)tc, (GSIMapVal)(void*)ic); } else { node->value.ptr = (void*)ic; } } /** * Set encoder to write out newObject in place of object. */ - (void) replaceObject: (id)object withObject: (id)newObject { GSIMapNode node; if (object == 0) { [NSException raise: NSInternalInconsistencyException format: @"attempt to remap nil"]; } if (newObject == 0) { [NSException raise: NSInternalInconsistencyException format: @"attempt to remap object to nil"]; } node = GSIMapNodeForKey(_repMap, (GSIMapKey)object); if (node == 0) { GSIMapAddPair(_repMap, (GSIMapKey)object, (GSIMapVal)newObject); } else { node->value.ptr = (void*)newObject; } } @end /** * Category for compatibility with old GNUstep encoding. */ @implementation NSArchiver (GNUstep) /** * Allow reuse of archiver (clears class substitution maps, etc.) but * do not clear out current serialized data. */ - (void) resetArchiver { if (_clsMap) { GSIMapCleanMap(_clsMap); if (_cIdMap) { GSIMapCleanMap(_cIdMap); } if (_uIdMap) { GSIMapCleanMap(_uIdMap); } if (_ptrMap) { GSIMapCleanMap(_ptrMap); } if (_namMap) { GSIMapCleanMap(_namMap); } if (_repMap) { GSIMapCleanMap(_repMap); } } _encodingRoot = NO; _initialPass = NO; _xRefC = 0; _xRefO = 0; _xRefP = 0; /* * Write dummy header */ _startPos = [_data length]; [self serializeHeaderAt: _startPos version: [self systemVersion] classes: 0 objects: 0 pointers: 0]; } /** * Returns YES. */ - (BOOL) directDataAccess { return YES; } /** * Writes out header for GNUstep archive format. */ - (void) serializeHeaderAt: (unsigned)positionInData version: (unsigned)systemVersion classes: (unsigned)classCount objects: (unsigned)objectCount pointers: (unsigned)pointerCount { unsigned headerLength = strlen(PREFIX)+36; char header[headerLength+1]; unsigned dataLength = [_data length]; snprintf(header, sizeof(header), "%s%08x:%08x:%08x:%08x:", PREFIX, systemVersion, classCount, objectCount, pointerCount); if (positionInData + headerLength <= dataLength) { [_data replaceBytesInRange: NSMakeRange(positionInData, headerLength) withBytes: header]; } else if (positionInData == dataLength) { [_data appendBytes: header length: headerLength]; } else { [NSException raise: NSInternalInconsistencyException format: @"serializeHeader:at: bad location"]; } } @end gnustep-base-1.29.0/Source/NSArray.m000066400000000000000000002072651435650067400171630ustar00rootroot00000000000000/** NSArray - Array object to hold other objects. Copyright (C) 1995-2015 Free Software Foundation, Inc. Written by: Andrew Kachites McCallum From skeleton by: Adam Fedor Created: March 1995 Rewrite by: Richard Frith-Macdonald January 1998 - new methods and changes as documented for Rhapsody plus changes of array indices to type unsigned, plus major efficiency hacks. This file is part of the GNUstep Base Library. 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 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 USA. NSArray class reference $Date$ $Revision$ */ #import "common.h" #import "Foundation/NSArray.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSCoder.h" #import "Foundation/NSData.h" #import "Foundation/NSRange.h" #import "Foundation/NSException.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSThread.h" #import "Foundation/NSMapTable.h" #import "Foundation/NSLock.h" #import "Foundation/NSValue.h" #import "Foundation/NSNull.h" #import "Foundation/NSKeyValueCoding.h" #import "Foundation/NSSet.h" #import "Foundation/NSUserDefaults.h" #import "Foundation/NSIndexSet.h" // For private method _decodeArrayOfObjectsForKey: #import "Foundation/NSKeyedArchiver.h" #import "GSPrivate.h" #import "GSPThread.h" #import "GSFastEnumeration.h" #import "GSDispatch.h" #import "GSSorting.h" static BOOL GSMacOSXCompatiblePropertyLists(void) { if (GSPrivateDefaultsFlag(NSWriteOldStylePropertyLists) == YES) return NO; return GSPrivateDefaultsFlag(GSMacOSXCompatible); } extern void GSPropertyListMake(id,NSDictionary*,BOOL,BOOL,unsigned,id*); @interface NSArrayEnumerator : NSEnumerator { NSArray *array; NSUInteger pos; IMP get; NSUInteger (*cnt)(NSArray*, SEL); } - (id) initWithArray: (NSArray*)anArray; @end @interface NSArrayEnumeratorReverse : NSArrayEnumerator @end static Class NSArrayClass; static Class GSArrayClass; static Class NSMutableArrayClass; static Class GSMutableArrayClass; static Class GSPlaceholderArrayClass; static GSPlaceholderArray *defaultPlaceholderArray; static NSMapTable *placeholderMap; static gs_mutex_t placeholderLock = GS_MUTEX_INIT_STATIC; /** * A simple, low overhead, ordered container for objects. All the objects * in the container are retained by it. The container may not contain nil * (though it may contain [NSNull+null]). */ @implementation NSArray static SEL addSel; static SEL appSel; static SEL countSel; static SEL eqSel; static SEL oaiSel; static SEL remSel; static SEL rlSel; + (void) atExit { DESTROY(defaultPlaceholderArray); DESTROY(placeholderMap); } + (void) initialize { if (self == [NSArray class]) { [self setVersion: 1]; addSel = @selector(addObject:); appSel = @selector(appendString:); countSel = @selector(count); eqSel = @selector(isEqual:); oaiSel = @selector(objectAtIndex:); remSel = @selector(removeObjectAtIndex:); rlSel = @selector(removeLastObject); NSArrayClass = [NSArray class]; NSMutableArrayClass = [NSMutableArray class]; GSArrayClass = [GSArray class]; GSMutableArrayClass = [GSMutableArray class]; GSPlaceholderArrayClass = [GSPlaceholderArray class]; /* * Set up infrastructure for placeholder arrays. */ defaultPlaceholderArray = (GSPlaceholderArray*) NSAllocateObject(GSPlaceholderArrayClass, 0, NSDefaultMallocZone()); placeholderMap = NSCreateMapTable(NSNonOwnedPointerMapKeyCallBacks, NSNonRetainedObjectMapValueCallBacks, 0); [self registerAtExit]; } } + (id) allocWithZone: (NSZone*)z { if (self == NSArrayClass) { /* * For a constant array, we return a placeholder object that can * be converted to a real object when its initialisation method * is called. */ if (z == NSDefaultMallocZone() || z == 0) { /* * As a special case, we can return a placeholder for an array * in the default malloc zone extremely efficiently. */ return defaultPlaceholderArray; } else { id obj; /* * For anything other than the default zone, we need to * locate the correct placeholder in the (lock protected) * table of placeholders. */ GS_MUTEX_LOCK(placeholderLock); obj = (id)NSMapGet(placeholderMap, (void*)z); if (obj == nil) { /* * There is no placeholder object for this zone, so we * create a new one and use that. */ obj = (id)NSAllocateObject(GSPlaceholderArrayClass, 0, z); NSMapInsert(placeholderMap, (void*)z, (void*)obj); } GS_MUTEX_UNLOCK(placeholderLock); return obj; } } else { return NSAllocateObject(self, 0, z); } } /** * Returns an empty autoreleased array. */ + (id) array { id o; o = [self allocWithZone: NSDefaultMallocZone()]; o = [o initWithObjects: (id*)0 count: 0]; return AUTORELEASE(o); } /** * Returns a new autoreleased NSArray instance containing all the objects from * array, in the same order as the original. */ + (id) arrayWithArray: (NSArray*)array { id o; o = [self allocWithZone: NSDefaultMallocZone()]; o = [o initWithArray: array]; return AUTORELEASE(o); } /** * Returns an autoreleased array based upon the file. The new array is * created using [NSObject+allocWithZone:] and initialised using the * [NSArray-initWithContentsOfFile:] method. See the documentation for those * methods for more detail. */ + (id) arrayWithContentsOfFile: (NSString*)file { id o; o = [self allocWithZone: NSDefaultMallocZone()]; o = [o initWithContentsOfFile: file]; return AUTORELEASE(o); } /** * Returns an autoreleased array from the contents of aURL. The new array is * created using [NSObject+allocWithZone:] and initialised using the * -initWithContentsOfURL: method. See the documentation for those * methods for more detail. */ + (id) arrayWithContentsOfURL: (NSURL*)aURL { id o; o = [self allocWithZone: NSDefaultMallocZone()]; o = [o initWithContentsOfURL: aURL]; return AUTORELEASE(o); } /** * Returns an autoreleased array containing anObject. */ + (id) arrayWithObject: (id)anObject { id o; o = [self allocWithZone: NSDefaultMallocZone()]; o = [o initWithObjects: &anObject count: 1]; return AUTORELEASE(o); } /** * Returns an autoreleased array containing the list * of objects, preserving order. */ + (id) arrayWithObjects: firstObject, ... { id a = [self allocWithZone: NSDefaultMallocZone()]; GS_USEIDLIST(firstObject, a = [a initWithObjects: __objects count: __count]); return AUTORELEASE(a); } /** * Returns an autoreleased array containing the specified * objects, preserving order. */ + (id) arrayWithObjects: (const id[])objects count: (NSUInteger)count { return AUTORELEASE([[self allocWithZone: NSDefaultMallocZone()] initWithObjects: objects count: count]); } /** * Returns an autoreleased array formed from the contents of * the receiver and adding anObject as the last item. */ - (NSArray*) arrayByAddingObject: (id)anObject { id na; NSUInteger c = [self count]; if (anObject == nil) [NSException raise: NSInvalidArgumentException format: @"Attempt to add nil to an array"]; if (c == 0) { na = [[GSArrayClass allocWithZone: NSDefaultMallocZone()] initWithObjects: &anObject count: 1]; } else { GS_BEGINIDBUF(objects, c+1); [self getObjects: objects]; objects[c] = anObject; na = [[GSArrayClass allocWithZone: NSDefaultMallocZone()] initWithObjects: objects count: c+1]; GS_ENDIDBUF(); } return AUTORELEASE(na); } /** * Returns a new array which is the concatenation of self and * otherArray (in this precise order). */ - (NSArray*) arrayByAddingObjectsFromArray: (NSArray*)anotherArray { id na; NSUInteger c; NSUInteger l; NSUInteger e; c = [self count]; l = [anotherArray count]; e = c + l; { GS_BEGINIDBUF(objects, e); [self getObjects: objects]; if ([anotherArray isProxy]) { NSUInteger i = c; NSUInteger j = 0; while (i < e) { objects[i++] = [anotherArray objectAtIndex: j++]; } } else { [anotherArray getObjects: &objects[c]]; } na = [NSArrayClass arrayWithObjects: objects count: e]; GS_ENDIDBUF(); } return na; } /** * Returns the abstract class ... arrays are coded as abstract arrays. */ - (Class) classForCoder { return NSArrayClass; } /** * Returns YES if anObject belongs to self. No otherwise.
* The [NSObject-isEqual:] method of anObject is used to test for equality. */ - (BOOL) containsObject: (id)anObject { return ([self indexOfObject: anObject] != NSNotFound); } /** * Returns a new copy of the receiver.
* The default abstract implementation of a copy is to use the * -initWithArray:copyItems: method with the flag set to YES.
* Immutable subclasses generally simply retain and return the receiver. */ - (id) copyWithZone: (NSZone*)zone { NSArray *copy = [NSArrayClass allocWithZone: zone]; return [copy initWithArray: self copyItems: YES]; } - (NSUInteger) count { [self subclassResponsibility: _cmd]; return 0; } - (NSUInteger) countByEnumeratingWithState: (NSFastEnumerationState*)state objects: (__unsafe_unretained id[])stackbuf count: (NSUInteger)len { NSInteger count; /* In a mutable subclass, the mutationsPtr should be set to point to a * value (unsigned long) which will be changed (incremented) whenever * the container is mutated (content added, removed, re-ordered). * This is cached in the caller at the start and compared at each * iteration. If it changes during the iteration then * objc_enumerationMutation() will be called, throwing an exception. * The abstract base class implementation points to a fixed value * (the enumeration state pointer should exist and be unchanged for as * long as the enumeration process runs), which is fine for enumerating * an immutable array. */ state->mutationsPtr = (unsigned long *)&state->mutationsPtr; count = MIN(len, [self count] - state->state); /* If a mutation has occurred then it's possible that we are being asked to * get objects from after the end of the array. Don't pass negative values * to memcpy. */ if (count > 0) { IMP imp = [self methodForSelector: @selector(objectAtIndex:)]; int p = state->state; int i; for (i = 0; i < count; i++, p++) { stackbuf[i] = (*imp)(self, @selector(objectAtIndex:), p); } state->state += count; } else { count = 0; } state->itemsPtr = stackbuf; return count; } /** * Encodes the receiver for storing to archive or sending over an * [NSConnection]. */ - (void) encodeWithCoder: (NSCoder*)aCoder { NSUInteger count = [self count]; if ([aCoder allowsKeyedCoding]) { /* HACK ... MacOS-X seems to code differently if the coder is an * actual instance of NSKeyedArchiver */ if ([aCoder class] == [NSKeyedArchiver class]) { [(NSKeyedArchiver*)aCoder _encodeArrayOfObjects: self forKey: @"NS.objects"]; } else { NSUInteger i; for (i = 0; i < count; i++) { NSString *key; key = [NSString stringWithFormat: @"NS.object.%lu", (unsigned long)i]; [(NSKeyedArchiver*)aCoder encodeObject: [self objectAtIndex: i] forKey: key]; } } } else { unsigned items = (unsigned)count; [aCoder encodeValueOfObjCType: @encode(unsigned) at: &items]; if (count > 0) { GS_BEGINIDBUF(a, count); [self getObjects: a]; [aCoder encodeArrayOfObjCType: @encode(id) count: count at: a]; GS_ENDIDBUF(); } } } /** * Copies the objects from the receiver to aBuffer, which must be * an area of memory large enough to hold them. */ - (void) getObjects: (__unsafe_unretained id[])aBuffer { NSUInteger i, c = [self count]; IMP get = [self methodForSelector: oaiSel]; for (i = 0; i < c; i++) aBuffer[i] = (*get)(self, oaiSel, i); } /** * Copies the objects from the range aRange of the receiver to aBuffer, * which must be an area of memory large enough to hold them. */ - (void) getObjects: (__unsafe_unretained id[])aBuffer range: (NSRange)aRange { NSUInteger i, j = 0, c = [self count], e = aRange.location + aRange.length; IMP get = [self methodForSelector: oaiSel]; GS_RANGE_CHECK(aRange, c); for (i = aRange.location; i < e; i++) aBuffer[j++] = (*get)(self, oaiSel, i); } /** * Returns the same value as -count */ - (NSUInteger) hash { return [self count]; } /** * Returns the index of the specified object in the receiver, or * NSNotFound if the object is not present. */ - (NSUInteger) indexOfObjectIdenticalTo: (id)anObject { NSUInteger c = [self count]; if (c > 0) { IMP get = [self methodForSelector: oaiSel]; NSUInteger i; for (i = 0; i < c; i++) if (anObject == (*get)(self, oaiSel, i)) return i; } return NSNotFound; } /** * Returns the index of the specified object in the range of the receiver, * or NSNotFound if the object is not present. */ - (NSUInteger) indexOfObjectIdenticalTo: anObject inRange: (NSRange)aRange { NSUInteger i, e = aRange.location + aRange.length, c = [self count]; IMP get = [self methodForSelector: oaiSel]; GS_RANGE_CHECK(aRange, c); for (i = aRange.location; i < e; i++) if (anObject == (*get)(self, oaiSel, i)) return i; return NSNotFound; } /** * Returns the index of the first object found in the receiver * which is equal to anObject (using anObject's [NSObject-isEqual:] method). * Returns NSNotFound on failure. */ - (NSUInteger) indexOfObject: (id)anObject { NSUInteger c = [self count]; if (c > 0 && anObject != nil) { NSUInteger i; IMP get = [self methodForSelector: oaiSel]; BOOL (*eq)(id, SEL, id) = (BOOL (*)(id, SEL, id))[anObject methodForSelector: eqSel]; for (i = 0; i < c; i++) if ((*eq)(anObject, eqSel, (*get)(self, oaiSel, i)) == YES) return i; } return NSNotFound; } /** * Returns the index of the first object found in aRange of receiver * which is equal to anObject (using anObject's [NSObject-isEqual:] method). * Returns NSNotFound on failure. */ - (NSUInteger) indexOfObject: (id)anObject inRange: (NSRange)aRange { NSUInteger i, e = aRange.location + aRange.length, c = [self count]; IMP get = [self methodForSelector: oaiSel]; BOOL (*eq)(id, SEL, id) = (BOOL (*)(id, SEL, id))[anObject methodForSelector: eqSel]; GS_RANGE_CHECK(aRange, c); for (i = aRange.location; i < e; i++) { if ((*eq)(anObject, eqSel, (*get)(self, oaiSel, i)) == YES) return i; } return NSNotFound; } /** *

In MacOS-X class clusters do not have designated initialisers, * and there is a general rule that -init is treated as the designated * initialiser of the class cluster, but that other intitialisers * may not work s expected an would need to be individually overridden * in any subclass. *

*

GNUstep tries to make it easier to subclass a class cluster, * by making class clusters follow the same convention as normal * classes, so the designated initialiser is the richest * initialiser. This means that all other initialisers call the * documented designated initialiser (which calls -init only for * MacOS-X compatibility), and anyone writing a subclass only needs * to override that one initialiser in order to have all the other * ones work. *

*

For MacOS-X compatibility, you may also need to override various * other initialisers. Exactly which ones, you will need to determine * by trial on a MacOS-X system ... and may vary between releases of * MacOS-X. So to be safe, on MacOS-X you probably need to re-implement * all the class cluster initialisers you might use in conjunction * with your subclass. *

*/ - (id) init { self = [super init]; return self; } /** * Initialize the receiver with the contents of array. * The order of array is preserved.
* If shouldCopy is YES then the objects are copied * rather than simply retained.
* Invokes -initWithObjects:count: */ - (id) initWithArray: (NSArray*)array copyItems: (BOOL)shouldCopy { NSUInteger c = [array count]; GS_BEGINIDBUF(objects, c); if ([array isProxy]) { NSUInteger i; for (i = 0; i < c; i++) { objects[i] = [array objectAtIndex: i]; } } else { [array getObjects: objects]; } if (shouldCopy == YES) { NSUInteger i; for (i = 0; i < c; i++) { objects[i] = [objects[i] copy]; } self = [self initWithObjects: objects count: c]; while (i > 0) { [objects[--i] release]; } } else { self = [self initWithObjects: objects count: c]; } GS_ENDIDBUF(); return self; } /** * Initialize the receiver with the contents of array. * The order of array is preserved.
* Invokes -initWithObjects:count: */ - (id) initWithArray: (NSArray*)array { NSUInteger c = [array count]; GS_BEGINIDBUF(objects, c); if ([array isProxy]) { NSUInteger i; for (i = 0; i < c; i++) { objects[i] = [array objectAtIndex: i]; } } else { [array getObjects: objects]; } self = [self initWithObjects: objects count: c]; GS_ENDIDBUF(); return self; } /** * Initialize the array by decoding from an archive.
* Invokes -initWithObjects:count: */ - (id) initWithCoder: (NSCoder*)aCoder { if ([aCoder allowsKeyedCoding]) { id array; array = [(NSKeyedUnarchiver*)aCoder _decodeArrayOfObjectsForKey: @"NS.objects"]; if (array == nil) { NSUInteger i = 0; NSString *key; id val; array = [NSMutableArray arrayWithCapacity: 2]; key = [NSString stringWithFormat: @"NS.object.%lu", (unsigned long)i]; val = [(NSKeyedUnarchiver*)aCoder decodeObjectForKey: key]; while (val != nil) { [array addObject: val]; i++; key = [NSString stringWithFormat: @"NS.object.%lu", (unsigned long)i]; val = [(NSKeyedUnarchiver*)aCoder decodeObjectForKey: key]; } } self = [self initWithArray: array]; } else { unsigned items; [aCoder decodeValueOfObjCType: @encode(unsigned) at: &items]; if (items > 0) { GS_BEGINIDBUF(contents, items); [aCoder decodeArrayOfObjCType: @encode(id) count: items at: contents]; self = [self initWithObjects: contents count: items]; while (items-- > 0) { [contents[items] release]; } GS_ENDIDBUF(); } else { self = [self initWithObjects: 0 count: 0]; } } return self; } /** *

Initialises the array with the contents of the specified file, * which must contain an array in property-list format. *

*

In GNUstep, the property-list format may be either the OpenStep * format (ASCII data), or the MacOS-X format (UTF-8 XML data) ... this * method will recognise which it is. *

*

If there is a failure to load the file for any reason, the receiver * will be released, the method will return nil, and a warning may be logged. *

*

Works by invoking [NSString-initWithContentsOfFile:] and * [NSString-propertyList] then checking that the result is an array. *

*/ - (id) initWithContentsOfFile: (NSString*)file { NSString *myString; myString = [[NSString allocWithZone: NSDefaultMallocZone()] initWithContentsOfFile: file]; if (myString == nil) { DESTROY(self); } else { id result; NS_DURING { result = [myString propertyList]; } NS_HANDLER { result = nil; } NS_ENDHANDLER RELEASE(myString); if ([result isKindOfClass: NSArrayClass]) { //self = [self initWithArray: result]; /* OSX appears to always return a mutable array rather than * the class of the receiver. */ RELEASE(self); self = RETAIN(result); } else { NSWarnMLog(@"Contents of file '%@' does not contain an array", file); DESTROY(self); } } return self; } /** *

Initialises the array with the contents of the specified URL, * which must contain an array in property-list format. *

*

In GNUstep, the property-list format may be either the OpenStep * format (ASCII data), or the MacOS-X format (UTF8 XML data) ... this * method will recognise which it is. *

*

If there is a failure to load the URL for any reason, the receiver * will be released, the method will return nil, and a warning may be logged. *

*

Works by invoking [NSString-initWithContentsOfURL:] and * [NSString-propertyList] then checking that the result is an array. *

*/ - (id) initWithContentsOfURL: (NSURL*)aURL { NSString *myString; myString = [[NSString allocWithZone: NSDefaultMallocZone()] initWithContentsOfURL: aURL]; if (myString == nil) { DESTROY(self); } else { id result; NS_DURING { result = [myString propertyList]; } NS_HANDLER { result = nil; } NS_ENDHANDLER RELEASE(myString); if ([result isKindOfClass: NSArrayClass]) { self = [self initWithArray: result]; } else { NSWarnMLog(@"Contents of URL '%@' does not contain an array", aURL); DESTROY(self); } } return self; } - (id) initWithObjects: (const id[])objects count: (NSUInteger)count { self = [self init]; return self; } /** * Initialize the array the list of objects. *
May change the value of self before returning it. */ - (id) initWithObjects: firstObject, ... { GS_USEIDLIST(firstObject, self = [self initWithObjects: __objects count: __count]); return self; } /** * Returns an NSMutableArray instance containing the same objects as * the receiver.
* The default implementation does this by calling the * -initWithArray:copyItems: method on a newly created object, * and passing it NO to tell it just to retain the items. */ - (id) mutableCopyWithZone: (NSZone*)zone { NSMutableArray *copy = [NSMutableArrayClass allocWithZone: zone]; return [copy initWithArray: self copyItems: NO]; } - (id) objectAtIndex: (NSUInteger)index { [self subclassResponsibility: _cmd]; return nil; } - (id) objectAtIndexedSubscript: (NSUInteger)anIndex { return [self objectAtIndex: anIndex]; } - (NSArray *) objectsAtIndexes: (NSIndexSet *)indexes { //FIXME: probably slow! NSMutableArray *group = [NSMutableArray arrayWithCapacity: [indexes count]]; NSUInteger i = [indexes firstIndex]; while (i != NSNotFound) { [group addObject: [self objectAtIndex: i]]; i = [indexes indexGreaterThanIndex: i]; } return GS_IMMUTABLE(group); } - (BOOL) isEqual: (id)anObject { if (self == anObject) return YES; if ([anObject isKindOfClass: NSArrayClass]) return [self isEqualToArray: anObject]; return NO; } /** * Returns YES if the receiver is equal to otherArray, NO otherwise. */ - (BOOL) isEqualToArray: (NSArray*)otherArray { NSUInteger i, c; if (self == (id)otherArray) return YES; c = [self count]; if (c != [otherArray count]) return NO; if (c > 0) { IMP get0 = [self methodForSelector: oaiSel]; IMP get1 = [otherArray methodForSelector: oaiSel]; for (i = 0; i < c; i++) if (![(*get0)(self, oaiSel, i) isEqual: (*get1)(otherArray, oaiSel, i)]) return NO; } return YES; } /** * Returns the last object in the receiver, or nil if the receiver is empty. */ - (id) lastObject { NSUInteger count = [self count]; if (count == 0) return nil; return [self objectAtIndex: count-1]; } /** * Returns the first object in the receiver, or nil if the receiver is empty. */ - (id) firstObject { NSUInteger count = [self count]; if (count == 0) return nil; return [self objectAtIndex: 0]; } /** * Makes each object in the array perform aSelector.
* This is done sequentially from the first to the last object. */ - (void) makeObjectsPerformSelector: (SEL)aSelector { NSUInteger c = [self count]; if (c > 0) { IMP get = [self methodForSelector: oaiSel]; NSUInteger i = 0; while (i < c) { [(*get)(self, oaiSel, i++) performSelector: aSelector]; } } } /** * Obsolete version of -makeObjectsPerformSelector: */ - (void) makeObjectsPerform: (SEL)aSelector { [self makeObjectsPerformSelector: aSelector]; } /** * Makes each object in the array perform aSelector with arg.
* This is done sequentially from the first to the last object. */ - (void) makeObjectsPerformSelector: (SEL)aSelector withObject: (id)arg { NSUInteger c = [self count]; if (c > 0) { IMP get = [self methodForSelector: oaiSel]; NSUInteger i = 0; while (i < c) { [(*get)(self, oaiSel, i++) performSelector: aSelector withObject: arg]; } } } /** * Obsolete version of -makeObjectsPerformSelector:withObject: */ - (void) makeObjectsPerform: (SEL)aSelector withObject: (id)argument { [self makeObjectsPerformSelector: aSelector withObject: argument]; } static NSComparisonResult compare(id elem1, id elem2, void* context) { NSComparisonResult (*imp)(id, SEL, id); if (context == 0) { [NSException raise: NSInvalidArgumentException format: @"compare null selector given"]; } imp = (NSComparisonResult (*)(id, SEL, id)) [elem1 methodForSelector: context]; if (imp == NULL) { [NSException raise: NSGenericException format: @"invalid selector passed to compare"]; } return (*imp)(elem1, context, elem2); } /** * Returns an autoreleased array in which the objects are ordered * according to a sort with comparator. */ - (NSArray*) sortedArrayUsingSelector: (SEL)comparator { return [self sortedArrayUsingFunction: compare context: (void *)comparator]; } /** * Returns an autoreleased array in which the objects are ordered * according to a sort with comparator. This invokes * -sortedArrayUsingFunction:context:hint: with a nil hint. */ - (NSArray*) sortedArrayUsingFunction: (NSComparisonResult(*)(id,id,void*))comparator context: (void*)context { return [self sortedArrayUsingFunction: comparator context: context hint: nil]; } /** * Subclasses may provide a hint for sorting ... The default GNUstep * implementation just returns nil. */ - (NSData*) sortedArrayHint { return nil; } /** * Returns an autoreleased array in which the objects are ordered * according to a sort with comparator, where the comparator function * is passed two objects to compare, and the context as the third * argument. The hint argument is currently ignored, and may be nil. */ - (NSArray*) sortedArrayUsingFunction: (NSComparisonResult(*)(id,id,void*))comparator context: (void*)context hint: (NSData*)hint { NSMutableArray *sortedArray; sortedArray = AUTORELEASE([[NSMutableArrayClass allocWithZone: NSDefaultMallocZone()] initWithArray: self copyItems: NO]); [sortedArray sortUsingFunction: comparator context: context]; return GS_IMMUTABLE(sortedArray); } - (NSArray*) sortedArrayWithOptions: (NSSortOptions)options usingComparator: (NSComparator)comparator { NSMutableArray *sortedArray; sortedArray = AUTORELEASE([[NSMutableArrayClass allocWithZone: NSDefaultMallocZone()] initWithArray: self copyItems: NO]); [sortedArray sortWithOptions: options usingComparator: comparator]; return GS_IMMUTABLE(sortedArray); } - (NSArray*) sortedArrayUsingComparator: (NSComparator)comparator { return [self sortedArrayWithOptions: 0 usingComparator: comparator]; } - (NSUInteger) indexOfObject: (id)key inSortedRange: (NSRange)range options: (NSBinarySearchingOptions)options usingComparator: (NSComparator)comparator { if (range.length == 0) { return options & NSBinarySearchingInsertionIndex ? range.location : NSNotFound; } if (range.length == 1) { switch (CALL_NON_NULL_BLOCK(comparator, key, [self objectAtIndex: range.location])) { case NSOrderedSame: return range.location; case NSOrderedAscending: return options & NSBinarySearchingInsertionIndex ? range.location : NSNotFound; case NSOrderedDescending: return options & NSBinarySearchingInsertionIndex ? (range.location + 1) : NSNotFound; default: // Shouldn't happen return NSNotFound; } } else { NSUInteger index = NSNotFound; NSUInteger count = [self count]; GS_BEGINIDBUF(objects, count); [self getObjects: objects]; // We use the timsort galloping to find the insertion index: if (options & NSBinarySearchingLastEqual) { index = GSRightInsertionPointForKeyInSortedRange(key, objects, range, comparator); } else { // Left insertion is our default index = GSLeftInsertionPointForKeyInSortedRange(key, objects, range, comparator); } GS_ENDIDBUF() // If we were looking for the insertion point, we are done here if (options & NSBinarySearchingInsertionIndex) { return index; } /* Otherwise, we need need another equality check in order to * know whether we need return NSNotFound. */ if (options & NSBinarySearchingLastEqual) { /* For search from the right, the equal object would be * the one before the index, but only if it's not at the * very beginning of the range (though that might not * actually be possible, it's better to check nonetheless). */ if (index > range.location) { index--; } } if (index >= NSMaxRange(range)) { return NSNotFound; } /* * For a search from the left, we'd have the correct index anyways. Check * whether it's equal to the key and return NSNotFound otherwise */ return (NSOrderedSame == CALL_NON_NULL_BLOCK(comparator, key, [self objectAtIndex: index]) ? index : NSNotFound); } // Never reached return NSNotFound; } /** * Returns a string formed by concatenating the objects in the receiver, * with the specified separator string inserted between each part. */ - (NSString*) componentsJoinedByString: (NSString*)separator { NSUInteger c = [self count]; NSMutableString *s; s = [NSMutableString stringWithCapacity: c]; if (c > 0) { NSUInteger l = [separator length]; NSUInteger i; [s appendString: [[self objectAtIndex: 0] description]]; for (i = 1; i < c; i++) { if (l > 0) { [s appendString: separator]; } [s appendString: [[self objectAtIndex: i] description]]; } } return GS_IMMUTABLE(s); } /** * Assumes that the receiver is an array of paths, and returns an * array formed by selecting the subset of those patch matching * the specified array of extensions. */ - (NSArray*) pathsMatchingExtensions: (NSArray*)extensions { NSUInteger i, c = [self count]; NSMutableArray *a = AUTORELEASE([[NSMutableArray alloc] initWithCapacity: 1]); Class cls = [NSString class]; IMP get = [self methodForSelector: oaiSel]; IMP add = [a methodForSelector: addSel]; for (i = 0; i < c; i++) { id o = (*get)(self, oaiSel, i); if ([o isKindOfClass: cls]) { if ([extensions containsObject: [o pathExtension]]) { (*add)(a, addSel, o); } } } return GS_IMMUTABLE(a); } /** * Returns the first object found in the receiver (starting at index 0) * which is present in the otherArray as determined by using the * -containsObject: method. */ - (id) firstObjectCommonWithArray: (NSArray*)otherArray { NSUInteger i, c = [self count]; id o; for (i = 0; i < c; i++) { if ([otherArray containsObject: (o = [self objectAtIndex: i])]) { return o; } } return nil; } /** * Returns a subarray of the receiver containing the objects found in * the specified range aRange. */ - (NSArray*) subarrayWithRange: (NSRange)aRange { id na; NSUInteger c = [self count]; GS_RANGE_CHECK(aRange, c); if (aRange.length == 0) { na = [NSArray array]; } else { GS_BEGINIDBUF(objects, aRange.length); [self getObjects: objects range: aRange]; na = [NSArray arrayWithObjects: objects count: aRange.length]; GS_ENDIDBUF(); } return na; } /** * Returns an enumerator describing the array sequentially * from the first to the last element.
* If you use a mutable subclass of NSArray, * you should not modify the array during enumeration. */ - (NSEnumerator*) objectEnumerator { id e; e = [NSArrayEnumerator allocWithZone: NSDefaultMallocZone()]; e = [e initWithArray: self]; return AUTORELEASE(e); } /** * Returns an enumerator describing the array sequentially * from the last to the first element.
* If you use a mutable subclass of NSArray, * you should not modify the array during enumeration. */ - (NSEnumerator*) reverseObjectEnumerator { id e; e = [NSArrayEnumeratorReverse allocWithZone: NSDefaultMallocZone()]; e = [e initWithArray: self]; return AUTORELEASE(e); } /** * Returns the result of invoking -descriptionWithLocale:indent: with a nil * locale and zero indent. */ - (NSString*) description { return [self descriptionWithLocale: nil]; } /** * Returns the result of invoking -descriptionWithLocale:indent: * with a zero indent. */ - (NSString*) descriptionWithLocale: (id)locale { return [self descriptionWithLocale: locale indent: 0]; } /** * Returns the receiver as a text property list in the traditional format.
* See [NSString-propertyList] for details.
* If locale is nil, no formatting is done, otherwise entries are formatted * according to the locale, and indented according to level.
* Unless locale is nil, a level of zero indents items by four spaces, * while a level of one indents them by a tab.
* The items in the property list string appear in the same order as * they appear in the receiver. */ - (NSString*) descriptionWithLocale: (id)locale indent: (NSUInteger)level { NSString *result = nil; GSPropertyListMake(self, locale, NO, YES, level == 1 ? 3 : 2, &result); return result; } /** *

Writes the contents of the array to the file specified by path. * The file contents will be in property-list format ... under GNUstep * this is either OpenStep style (ASCII characters using \U hexadecimal * escape sequences for unicode), or MacOS-X style (XML in the UTF8 * character set). *

*

If the useAuxiliaryFile flag is YES, the file write operation is * atomic ... the data is written to a temporary file, which is then * renamed to the actual file name. *

*

If the conversion of data into the correct property-list format fails * or the write operation fails, the method returns NO, otherwise it * returns YES. *

*

NB. The fact that the file is in property-list format does not * necessarily mean that it can be used to reconstruct the array using * the -initWithContentsOfFile: method. If the original array contains * non-property-list objects, the descriptions of those objects will * have been written, and reading in the file as a property-list will * result in a new array containing the string descriptions. *

*/ - (BOOL) writeToFile: (NSString *)path atomically: (BOOL)useAuxiliaryFile { NSDictionary *loc; NSString *desc = nil; NSData *data; loc = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]; if (GSMacOSXCompatiblePropertyLists() == YES) { GSPropertyListMake(self, loc, YES, NO, 2, &desc); data = [desc dataUsingEncoding: NSUTF8StringEncoding]; } else { GSPropertyListMake(self, loc, NO, NO, 2, &desc); data = [desc dataUsingEncoding: NSASCIIStringEncoding]; } return [data writeToFile: path atomically: useAuxiliaryFile]; } /** *

Writes the contents of the array to the specified url. * This functions just like -writeToFile:atomically: except that the * output may be written to any URL, not just a local file. *

*/ - (BOOL) writeToURL: (NSURL *)url atomically: (BOOL)useAuxiliaryFile { NSDictionary *loc; NSString *desc = nil; NSData *data; loc = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]; if (GSMacOSXCompatiblePropertyLists() == YES) { GSPropertyListMake(self, loc, YES, NO, 2, &desc); data = [desc dataUsingEncoding: NSUTF8StringEncoding]; } else { GSPropertyListMake(self, loc, NO, NO, 2, &desc); data = [desc dataUsingEncoding: NSASCIIStringEncoding]; } return [data writeToURL: url atomically: useAuxiliaryFile]; } /** * This overrides NSObjects implementation of this method. * This method returns an array of objects returned by * invoking -valueForKey: for each item in the receiver, * substituting NSNull for nil. * A special case: the key "count" is not forwarded to each object * of the receiver but returns the number of objects of the receiver.
*/ - (id) valueForKey: (NSString*)key { id result = nil; if ([key isEqualToString: @"@count"] == YES) { result = [NSNumber numberWithUnsignedInteger: [self count]]; } else if ([key isEqualToString: @"count"] == YES) { GSOnceMLog( @"[NSArray-valueForKey:] called with 'count' is deprecated .. use '@count'"); result = [NSNumber numberWithUnsignedInteger: [self count]]; } else { NSMutableArray *results = nil; static NSNull *null = nil; NSUInteger i; NSUInteger count = [self count]; volatile id object = nil; results = [NSMutableArray arrayWithCapacity: count]; for (i = 0; i < count; i++) { id result; object = [self objectAtIndex: i]; result = [object valueForKey: key]; if (result == nil) { if (null == nil) { null = RETAIN([NSNull null]); } result = null; } [results addObject: result]; } result = results; } return result; } - (id) valueForKeyPath: (NSString*)path { id result = nil; if ([path hasPrefix: @"@"]) { NSRange r; r = [path rangeOfString: @"."]; if (r.length == 0) { if ([path isEqualToString: @"@count"] == YES) { result = [NSNumber numberWithUnsignedInteger: [self count]]; } else { result = [self valueForKey: path]; } } else { NSString *op = [path substringToIndex: r.location]; NSString *rem = [path substringFromIndex: NSMaxRange(r)]; NSUInteger count = [self count]; if ([op isEqualToString: @"@count"] == YES) { result = [NSNumber numberWithUnsignedInteger: count]; } else if ([op isEqualToString: @"@avg"] == YES) { double d = 0; if (count > 0) { NSEnumerator *e = [self objectEnumerator]; id o; while ((o = [e nextObject]) != nil) { d += [[o valueForKeyPath: rem] doubleValue]; } d /= count; } result = [NSNumber numberWithDouble: d]; } else if ([op isEqualToString: @"@max"] == YES) { if (count > 0) { NSEnumerator *e = [self objectEnumerator]; id o; while ((o = [e nextObject]) != nil) { o = [o valueForKeyPath: rem]; if (result == nil || [result compare: o] == NSOrderedAscending) { result = o; } } } } else if ([op isEqualToString: @"@min"] == YES) { if (count > 0) { NSEnumerator *e = [self objectEnumerator]; id o; while ((o = [e nextObject]) != nil) { o = [o valueForKeyPath: rem]; if (result == nil || [result compare: o] == NSOrderedDescending) { result = o; } } } } else if ([op isEqualToString: @"@sum"] == YES) { double d = 0; if (count > 0) { NSEnumerator *e = [self objectEnumerator]; id o; while ((o = [e nextObject]) != nil) { d += [[o valueForKeyPath: rem] doubleValue]; } } result = [NSNumber numberWithDouble: d]; } else if ([op isEqualToString: @"@distinctUnionOfArrays"] == YES) { if (count > 0) { NSEnumerator *e = [self objectEnumerator]; id o; result = [NSMutableSet set]; while ((o = [e nextObject]) != nil) { o = [o valueForKeyPath: rem]; [result addObjectsFromArray: o]; } result = [result allObjects]; } else { result = [NSArray array]; } } else if ([op isEqualToString: @"@distinctUnionOfObjects"] == YES) { if (count > 0) { NSEnumerator *e = [self objectEnumerator]; id o; result = [NSMutableSet set]; while ((o = [e nextObject]) != nil) { o = [o valueForKeyPath: rem]; [result addObject: o]; } result = [result allObjects]; } else { result = [NSArray array]; } } else if ([op isEqualToString: @"@distinctUnionOfSets"] == YES) { if (count > 0) { NSEnumerator *e = [self objectEnumerator]; id o; result = [NSMutableSet set]; while ((o = [e nextObject]) != nil) { o = [o valueForKeyPath: rem]; [result addObjectsFromArray: [o allObjects]]; } result = [result allObjects]; } else { result = [NSArray array]; } } else if ([op isEqualToString: @"@unionOfArrays"] == YES) { if (count > 0) { NSEnumerator *e = [self objectEnumerator]; id o; result = [GSMutableArray array]; while ((o = [e nextObject]) != nil) { o = [o valueForKeyPath: rem]; [result addObjectsFromArray: o]; } result = GS_IMMUTABLE(result); } else { result = [NSArray array]; } } else if ([op isEqualToString: @"@unionOfObjects"] == YES) { if (count > 0) { NSEnumerator *e = [self objectEnumerator]; id o; result = [GSMutableArray array]; while ((o = [e nextObject]) != nil) { o = [o valueForKeyPath: rem]; [result addObject: o]; } result = GS_IMMUTABLE(result); } else { result = [NSArray array]; } } else if ([op isEqualToString: @"@unionOfSets"] == YES) { if (count > 0) { NSEnumerator *e = [self objectEnumerator]; id o; result = [GSMutableArray array]; while ((o = [e nextObject]) != nil) { o = [o valueForKeyPath: rem]; [result addObjectsFromArray: [o allObjects]]; } result = GS_IMMUTABLE(result); } else { result = [NSArray array]; } } else { result = [super valueForKeyPath: path]; } } } else { result = [super valueForKeyPath: path]; } return result; } /** * Call setValue:forKey: on each of the receiver's items * with the value and key. */ - (void) setValue: (id)value forKey: (NSString*)key { NSUInteger i; NSUInteger count = [self count]; volatile id object = nil; for (i = 0; i < count; i++) { object = [self objectAtIndex: i]; [object setValue: value forKey: key]; } } - (void) enumerateObjectsUsingBlock: (GSEnumeratorBlock)aBlock { [self enumerateObjectsWithOptions: 0 usingBlock: aBlock]; } - (void) enumerateObjectsWithOptions: (NSEnumerationOptions)opts usingBlock: (GSEnumeratorBlock)aBlock { NSUInteger count = 0; BLOCK_SCOPE BOOL shouldStop = NO; BOOL isReverse = (opts & NSEnumerationReverse); id enumerator = self; /* If we are enumerating in reverse, use the reverse enumerator for fast * enumeration. */ if (isReverse) { enumerator = [self reverseObjectEnumerator]; count = ([self count] - 1); } { GS_DISPATCH_CREATE_QUEUE_AND_GROUP_FOR_ENUMERATION(enumQueue, opts) FOR_IN (id, obj, enumerator) GS_DISPATCH_SUBMIT_BLOCK(enumQueueGroup, enumQueue, if (shouldStop == NO) {, }, aBlock, obj, count, &shouldStop); if (isReverse) { count--; } else { count++; } if (shouldStop) { break; } END_FOR_IN(enumerator) GS_DISPATCH_TEARDOWN_QUEUE_AND_GROUP_FOR_ENUMERATION(enumQueue, opts) } } - (void) enumerateObjectsAtIndexes: (NSIndexSet*)indexSet options: (NSEnumerationOptions)opts usingBlock: (GSEnumeratorBlock)block { [[self objectsAtIndexes: indexSet] enumerateObjectsWithOptions: opts usingBlock: block]; } - (NSIndexSet *) indexesOfObjectsWithOptions: (NSEnumerationOptions)opts passingTest: (GSPredicateBlock)predicate { /* TODO: Concurrency. */ NSMutableIndexSet *set = [NSMutableIndexSet indexSet]; BLOCK_SCOPE BOOL shouldStop = NO; id enumerator = self; NSUInteger count = 0; BLOCK_SCOPE NSLock *setLock = nil; /* If we are enumerating in reverse, use the reverse enumerator for fast * enumeration. */ if (opts & NSEnumerationReverse) { enumerator = [self reverseObjectEnumerator]; } if (opts & NSEnumerationConcurrent) { setLock = [NSLock new]; } { GS_DISPATCH_CREATE_QUEUE_AND_GROUP_FOR_ENUMERATION(enumQueue, opts) FOR_IN (id, obj, enumerator) # if __has_feature(blocks) && (GS_USE_LIBDISPATCH == 1) if (enumQueue != NULL) { dispatch_group_async(enumQueueGroup, enumQueue, ^(void){ if (shouldStop) { return; } if (predicate(obj, count, &shouldStop)) { [setLock lock]; [set addIndex: count]; [setLock unlock]; } }); } else // call block directly # endif if (CALL_NON_NULL_BLOCK(predicate, obj, count, &shouldStop)) { /* TODO: It would be more efficient to collect an NSRange and only * pass it to the index set when CALL_NON_NULL_BLOCK returned NO. */ [set addIndex: count]; } if (shouldStop) { break; } count++; END_FOR_IN(enumerator) GS_DISPATCH_TEARDOWN_QUEUE_AND_GROUP_FOR_ENUMERATION(enumQueue, opts); } RELEASE(setLock); return set; } - (NSIndexSet*) indexesOfObjectsPassingTest: (GSPredicateBlock)predicate { return [self indexesOfObjectsWithOptions: 0 passingTest: predicate]; } - (NSIndexSet*) indexesOfObjectsAtIndexes: (NSIndexSet*)indexSet options: (NSEnumerationOptions)opts passingTest: (GSPredicateBlock)predicate { NSIndexSet *rindexes =[[self objectsAtIndexes: indexSet] indexesOfObjectsWithOptions: opts passingTest: predicate]; NSUInteger count = [indexSet count]; NSUInteger resultCount = [rindexes count]; NSUInteger indexArray[count], resultIndexArray[resultCount]; NSMutableIndexSet *resultSet = [NSMutableIndexSet indexSet]; NSUInteger i = 0; [indexSet getIndexes: indexArray maxCount: count inIndexRange: NULL]; [rindexes getIndexes: resultIndexArray maxCount: resultCount inIndexRange: NULL]; // interate over indexes and collect the matching ones.. for(i = 0; i < resultCount; i++) { NSUInteger rindx = resultIndexArray[i]; NSUInteger indx = indexArray[rindx]; [resultSet addIndex: indx]; } return resultSet; } - (NSUInteger) indexOfObjectWithOptions: (NSEnumerationOptions)opts passingTest: (GSPredicateBlock)predicate { /* TODO: Concurrency. */ id enumerator = self; BLOCK_SCOPE BOOL shouldStop = NO; NSUInteger count = 0; BLOCK_SCOPE NSUInteger index = NSNotFound; BLOCK_SCOPE NSLock *indexLock = nil; /* If we are enumerating in reverse, use the reverse enumerator for fast * enumeration. */ if (opts & NSEnumerationReverse) { enumerator = [self reverseObjectEnumerator]; } if (opts & NSEnumerationConcurrent) { indexLock = [NSLock new]; } { GS_DISPATCH_CREATE_QUEUE_AND_GROUP_FOR_ENUMERATION(enumQueue, opts) FOR_IN (id, obj, enumerator) # if __has_feature(blocks) && (GS_USE_LIBDISPATCH == 1) if (enumQueue != NULL) { dispatch_group_async(enumQueueGroup, enumQueue, ^(void){ if (shouldStop) { return; } if (predicate(obj, count, &shouldStop)) { // FIXME: atomic operation on the shouldStop variable would be nicer, // but we don't expose the GSAtomic* primitives anywhere. [indexLock lock]; index = count; // Cancel all other predicate evaluations: shouldStop = YES; [indexLock unlock]; } }); } else // call block directly # endif if (CALL_NON_NULL_BLOCK(predicate, obj, count, &shouldStop)) { index = count; shouldStop = YES; } if (shouldStop) { break; } count++; END_FOR_IN(enumerator) GS_DISPATCH_TEARDOWN_QUEUE_AND_GROUP_FOR_ENUMERATION(enumQueue, opts); } RELEASE(indexLock); return index; } - (NSUInteger) indexOfObjectPassingTest: (GSPredicateBlock)predicate { return [self indexOfObjectWithOptions: 0 passingTest: predicate]; } - (NSUInteger) indexOfObjectAtIndexes: (NSIndexSet*)indexSet options: (NSEnumerationOptions)opts passingTest: (GSPredicateBlock)predicate { NSUInteger index = [[self objectsAtIndexes: indexSet] indexOfObjectWithOptions: 0 passingTest: predicate]; NSUInteger count = [indexSet count]; NSUInteger indexArray[count]; [indexSet getIndexes: indexArray maxCount: count inIndexRange: NULL]; return indexArray[index]; } @end /** * NSMutableArray is the mutable version of [NSArray]. It * provides methods for altering the contents of the array. */ @implementation NSMutableArray + (void) initialize { if (self == [NSMutableArray class]) { } } + (id) allocWithZone: (NSZone*)z { if (self == NSMutableArrayClass) { return NSAllocateObject(GSMutableArrayClass, 0, z); } else { return NSAllocateObject(self, 0, z); } } + (id) arrayWithObject: (id)anObject { NSMutableArray *obj = [self allocWithZone: NSDefaultMallocZone()]; obj = [obj initWithObjects: &anObject count: 1]; return AUTORELEASE(obj); } - (Class) classForCoder { return NSMutableArrayClass; } - (id) initWithCapacity: (NSUInteger)numItems { self = [self init]; return self; } - (void) addObject: (id)anObject { [self subclassResponsibility: _cmd]; } /** * Swaps the positions of two objects in the array. Raises an exception * if either array index is out of bounds. */ - (void) exchangeObjectAtIndex: (NSUInteger)i1 withObjectAtIndex: (NSUInteger)i2 { id tmp = [self objectAtIndex: i1]; RETAIN(tmp); [self replaceObjectAtIndex: i1 withObject: [self objectAtIndex: i2]]; [self replaceObjectAtIndex: i2 withObject: tmp]; RELEASE(tmp); } - (void) replaceObjectAtIndex: (NSUInteger)index withObject: (id)anObject { [self subclassResponsibility: _cmd]; } - (void) setObject: (id)anObject atIndexedSubscript: (NSUInteger)anIndex { if ([self count] == anIndex) { [self addObject: anObject]; } else { [self replaceObjectAtIndex: anIndex withObject: anObject]; } } /** Replaces the values in the receiver at the locations given by the * indexes set with values from the objects array. */ - (void) replaceObjectsAtIndexes: (NSIndexSet *)indexes withObjects: (NSArray *)objects { NSUInteger index = [indexes firstIndex]; NSEnumerator *enumerator = [objects objectEnumerator]; id object = [enumerator nextObject]; while (object != nil && index != NSNotFound) { [self replaceObjectAtIndex: index withObject: object]; object = [enumerator nextObject]; index = [indexes indexGreaterThanIndex: index]; } } /** * Replaces objects in the receiver with those from anArray.
* Raises an exception if given a range extending beyond the array.
*/ - (void) replaceObjectsInRange: (NSRange)aRange withObjectsFromArray: (NSArray*)anArray { id e, o; if ([self count] < (aRange.location + aRange.length)) [NSException raise: NSRangeException format: @"Replacing objects beyond end of array."]; [self removeObjectsInRange: aRange]; e = [anArray reverseObjectEnumerator]; while ((o = [e nextObject])) [self insertObject: o atIndex: aRange.location]; } /** * Replaces objects in the receiver with some of those from anArray.
* Raises an exception if given a range extending beyond the array.
*/ - (void) replaceObjectsInRange: (NSRange)aRange withObjectsFromArray: (NSArray*)anArray range: (NSRange)anotherRange { [self replaceObjectsInRange: aRange withObjectsFromArray: [anArray subarrayWithRange: anotherRange]]; } - (void) insertObject: anObject atIndex: (NSUInteger)index { [self subclassResponsibility: _cmd]; } /** Inserts the values from the objects array into the receiver at the * locations given by the indexes set.
* The values are inserted in the same order that they appear in the * array. */ - (void) insertObjects: (NSArray *)objects atIndexes: (NSIndexSet *)indexes { NSUInteger index = [indexes firstIndex]; NSEnumerator *enumerator = [objects objectEnumerator]; id object = [enumerator nextObject]; while (object != nil && index != NSNotFound) { [self insertObject: object atIndex: index]; object = [enumerator nextObject]; index = [indexes indexGreaterThanIndex: index]; } } - (void) removeObjectAtIndex: (NSUInteger)index { [self subclassResponsibility: _cmd]; } /** * Creates an autoreleased mutable array able to store at least numItems. * See the -initWithCapacity: method. */ + (id) arrayWithCapacity: (NSUInteger)numItems { return AUTORELEASE([[self allocWithZone: NSDefaultMallocZone()] initWithCapacity: numItems]); } /** * Override our superclass's designated initializer to go our's */ - (id) initWithObjects: (const id[])objects count: (NSUInteger)count { self = [self initWithCapacity: count]; if (count > 0) { NSUInteger i; IMP add = [self methodForSelector: addSel]; for (i = 0; i < count; i++) (*add)(self, addSel, objects[i]); } return self; } /** * Removes the last object in the array. Raises an exception if the array * is already empty. */ - (void) removeLastObject { NSUInteger count = [self count]; if (count == 0) [NSException raise: NSRangeException format: @"Trying to remove from an empty array."]; [self removeObjectAtIndex: count-1]; } /** * Removes all occurrences of anObject (found by pointer equality) * from the receiver. */ - (void) removeObjectIdenticalTo: (id)anObject { NSUInteger i; if (anObject == nil) { NSWarnMLog(@"attempt to remove nil object"); return; } i = [self count]; if (i > 0) { IMP rem = 0; IMP get = [self methodForSelector: oaiSel]; while (i-- > 0) { id o = (*get)(self, oaiSel, i); if (o == anObject) { if (rem == 0) { rem = [self methodForSelector: remSel]; } (*rem)(self, remSel, i); } } } } /** * Removes all occurrences of anObject (found by the [NSObject-isEqual:] method * of anObject) aRange in the receiver. */ - (void) removeObject: (id)anObject inRange: (NSRange)aRange { NSUInteger c; NSUInteger s; NSUInteger i; if (anObject == nil) { NSWarnMLog(@"attempt to remove nil object"); return; } c = [self count]; s = aRange.location; i = aRange.location + aRange.length; if (i > c) { i = c; } if (i > s) { IMP rem = 0; IMP get = [self methodForSelector: oaiSel]; BOOL (*eq)(id, SEL, id) = (BOOL (*)(id, SEL, id))[anObject methodForSelector: eqSel]; while (i-- > s) { id o = (*get)(self, oaiSel, i); if (o == anObject || (*eq)(anObject, eqSel, o) == YES) { if (rem == 0) { rem = [self methodForSelector: remSel]; /* * We need to retain the object so that when we remove the * first equal object we don't get left with a bad object * pointer for later comparisons. */ RETAIN(anObject); } (*rem)(self, remSel, i); } } if (rem != 0) { RELEASE(anObject); } } } /** * Removes all occurrences of anObject (found by pointer equality) * from aRange in the receiver. */ - (void) removeObjectIdenticalTo: (id)anObject inRange: (NSRange)aRange { NSUInteger c; NSUInteger s; NSUInteger i; if (anObject == nil) { NSWarnMLog(@"attempt to remove nil object"); return; } c = [self count]; s = aRange.location; i = aRange.location + aRange.length; if (i > c) { i = c; } if (i > s) { IMP rem = 0; IMP get = [self methodForSelector: oaiSel]; while (i-- > s) { id o = (*get)(self, oaiSel, i); if (o == anObject) { if (rem == 0) { rem = [self methodForSelector: remSel]; } (*rem)(self, remSel, i); } } } } /** * Removes all occurrences of anObject (found by anObject's * [NSObject-isEqual:] method) from the receiver. */ - (void) removeObject: (id)anObject { NSUInteger i; if (anObject == nil) { NSWarnMLog(@"attempt to remove nil object"); return; } i = [self count]; if (i > 0) { IMP rem = 0; IMP get = [self methodForSelector: oaiSel]; BOOL (*eq)(id, SEL, id) = (BOOL (*)(id, SEL, id))[anObject methodForSelector: eqSel]; while (i-- > 0) { id o = (*get)(self, oaiSel, i); if (o == anObject || (*eq)(anObject, eqSel, o) == YES) { if (rem == 0) { rem = [self methodForSelector: remSel]; /* * We need to retain the object so that when we remove the * first equal object we don't get left with a bad object * pointer for later comparisons. */ RETAIN(anObject); } (*rem)(self, remSel, i); } } if (rem != 0) { RELEASE(anObject); } } } /** * Removes all objects from the receiver, leaving an empty array. */ - (void) removeAllObjects { NSUInteger c = [self count]; if (c > 0) { IMP remLast = [self methodForSelector: rlSel]; while (c--) { (*remLast)(self, rlSel); } } } /** * Adds each object from otherArray to the receiver, in first to last order. */ - (void) addObjectsFromArray: (NSArray*)otherArray { NSUInteger c = [otherArray count]; if (c > 0) { NSUInteger i; IMP get = [otherArray methodForSelector: oaiSel]; IMP add = [self methodForSelector: addSel]; for (i = 0; i < c; i++) (*add)(self, addSel, (*get)(otherArray, oaiSel, i)); } } /** * Sets the contents of the receiver to be identical to the contents * of otherArray. */ - (void) setArray: (NSArray *)otherArray { [self removeAllObjects]; [self addObjectsFromArray: otherArray]; } /** * Removes objects from the receiver at the indices supplied by an NSIndexSet */ - (void) removeObjectsAtIndexes: (NSIndexSet *)indexes { NSUInteger count = [indexes count]; NSUInteger indexArray[count]; [indexes getIndexes: indexArray maxCount: count inIndexRange: NULL]; [self removeObjectsFromIndices: indexArray numIndices: count]; } /** * Supplied with a C array of indices containing count values, this method * removes all corresponding objects from the receiver. The objects are * removed in such a way that the removal is safe irrespective * of the order in which they are specified in the indices array. */ - (void) removeObjectsFromIndices: (NSUInteger*)indices numIndices: (NSUInteger)count { if (count > 0) { NSUInteger to = 0; NSUInteger from = 0; NSUInteger i; GS_BEGINITEMBUF(sorted, count, NSUInteger); while (from < count) { NSUInteger val = indices[from++]; i = to; while (i > 0 && sorted[i-1] > val) { i--; } if (i == to) { sorted[to++] = val; } else if (sorted[i] != val) { NSUInteger j = to++; if (sorted[i] < val) { i++; } while (j > i) { sorted[j] = sorted[j-1]; j--; } sorted[i] = val; } } if (to > 0) { IMP rem = [self methodForSelector: remSel]; while (to--) { (*rem)(self, remSel, sorted[to]); } } GS_ENDITEMBUF(); } } /** * Removes from the receiver, all the objects present in otherArray, * as determined by using the [NSObject-isEqual:] method. */ - (void) removeObjectsInArray: (NSArray*)otherArray { if (otherArray == self) { [self removeAllObjects]; } else if (otherArray != nil) { NSUInteger c; if (NO == [otherArray isKindOfClass: NSArrayClass]) { [NSException raise: NSInvalidArgumentException format: @"-removeObjectsInArray: non-array argument"]; } if ((c = [otherArray count]) > 0) { NSUInteger i; IMP get = [otherArray methodForSelector: oaiSel]; IMP rem = [self methodForSelector: @selector(removeObject:)]; /* Guard otherArray in case it's a subclass which does not * retain its contents; in that case it would be possible * for otherArray to be contained by the receiver and be * deallocated during the loop below. */ RETAIN(otherArray); for (i = 0; i < c; i++) { (*rem)(self, @selector(removeObject:), (*get)(otherArray, oaiSel, i)); } RELEASE(otherArray); } } } /** * Removes all the objects in aRange from the receiver. */ - (void) removeObjectsInRange: (NSRange)aRange { NSUInteger i; NSUInteger s = aRange.location; NSUInteger c = [self count]; i = aRange.location + aRange.length; if (c < i) i = c; if (i > s) { IMP rem = [self methodForSelector: remSel]; while (i-- > s) { (*rem)(self, remSel, i); } } } /** * Sorts the array according to the supplied comparator. */ - (void) sortUsingSelector: (SEL)comparator { [self sortUsingFunction: compare context: (void *)comparator]; } /** * Sorts the array according to the supplied compare function * with the context information. */ - (void) sortUsingFunction: (NSComparisonResult (*)(id,id,void*))compare context: (void*)context { NSUInteger count = [self count]; if ((1 < count) && (NULL != compare)) { NSArray *res = nil; GS_BEGINIDBUF(objects, count); [self getObjects: objects]; GSSortUnstable(objects, NSMakeRange(0,count), (id)compare, GSComparisonTypeFunction, context); res = [[NSArray alloc] initWithObjects: objects count: count]; [self setArray: res]; RELEASE(res); GS_ENDIDBUF(); } } - (void) sortWithOptions: (NSSortOptions)options usingComparator: (NSComparator)comparator { NSUInteger count = [self count]; if ((1 < count) && (NULL != comparator)) { NSArray *res = nil; GS_BEGINIDBUF(objects, count); [self getObjects: objects]; if (options & NSSortStable) { if (options & NSSortConcurrent) { GSSortStableConcurrent(objects, NSMakeRange(0,count), (id)comparator, GSComparisonTypeComparatorBlock, NULL); } else { GSSortStable(objects, NSMakeRange(0,count), (id)comparator, GSComparisonTypeComparatorBlock, NULL); } } else { if (options & NSSortConcurrent) { GSSortUnstableConcurrent(objects, NSMakeRange(0,count), (id)comparator, GSComparisonTypeComparatorBlock, NULL); } else { GSSortUnstable(objects, NSMakeRange(0,count), (id)comparator, GSComparisonTypeComparatorBlock, NULL); } } res = [[NSArray alloc] initWithObjects: objects count: count]; [self setArray: res]; RELEASE(res); GS_ENDIDBUF(); } } - (void) sortUsingComparator: (NSComparator)comparator { [self sortWithOptions: 0 usingComparator: comparator]; } @end @implementation NSArrayEnumerator - (id) initWithArray: (NSArray*)anArray { self = [super init]; if (self != nil) { array = anArray; IF_NO_ARC(RETAIN(array);) pos = 0; get = [array methodForSelector: oaiSel]; cnt = (NSUInteger (*)(NSArray*, SEL))[array methodForSelector: countSel]; } return self; } /** * Returns the next object in the enumeration or nil if there are no more * objects.
* NB. modifying a mutable array during an enumeration can break things ... * don't do it. */ - (id) nextObject { if (pos >= (*cnt)(array, countSel)) return nil; return (*get)(array, oaiSel, pos++); } - (void) dealloc { RELEASE(array); [super dealloc]; } @end @implementation NSArrayEnumeratorReverse - (id) initWithArray: (NSArray*)anArray { self = [super initWithArray: anArray]; if (self != nil) { pos = (*cnt)(array, countSel); } return self; } /** * Returns the next object in the enumeration or nil if there are no more * objects.
* NB. modifying a mutable array during an enumeration can break things ... * don't do it. */ - (id) nextObject { if (pos == 0) return nil; return (*get)(array, oaiSel, --pos); } @end gnustep-base-1.29.0/Source/NSAssertionHandler.m000066400000000000000000000066461435650067400213520ustar00rootroot00000000000000/** NSAssertionHandler - Object encapsulation of assertions Copyright (C) 1995, 1997 Free Software Foundation, Inc. Written by: Adam Fedor Date: Apr 1995 This file is part of the GNUstep Base Library. 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 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 USA. NSAssertionHandler class reference $Date$ $Revision$ */ #import "common.h" #import "Foundation/NSException.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSThread.h" @implementation NSAssertionHandler /* Key for thread dictionary. */ NSString *const NSAssertionHandlerKey = @"NSAssertionHandler"; /** * Returns the assertion handler object for the current thread.
* If none exists, creates one and returns it. */ + (NSAssertionHandler*) currentHandler { NSMutableDictionary *dict; NSAssertionHandler *handler; dict = GSCurrentThreadDictionary(); handler = [dict objectForKey: NSAssertionHandlerKey]; if (handler == nil) { handler = [[NSAssertionHandler alloc] init]; [dict setObject: handler forKey: NSAssertionHandlerKey]; RELEASE(handler); } return handler; } /** * Handles an assertion failure by using NSLogv() to print an error * message built from the supplied arguments, and then raising an * NSInternalInconsistencyException */ - (void) handleFailureInFunction: (NSString*)functionName file: (NSString*)fileName lineNumber: (NSInteger)line description: (NSString*)format,... { id message; va_list ap; va_start(ap, format); message = [NSString stringWithFormat: @"%@:%"PRIdPTR" Assertion failed in %@. %@", fileName, line, functionName, format]; NSLogv(message, ap); [NSException raise: NSInternalInconsistencyException format: message arguments: ap]; va_end(ap); GS_UNREACHABLE(); /* NOT REACHED */ } /** * Handles an assertion failure by using NSLogv() to print an error * message built from the supplied arguments, and then raising an * NSInternalInconsistencyException */ - (void) handleFailureInMethod: (SEL) aSelector object: object file: (NSString *) fileName lineNumber: (NSInteger) line description: (NSString *) format,... { id message; va_list ap; va_start(ap, format); message = [NSString stringWithFormat: @"%@:%"PRIdPTR" Assertion failed in %@(%@), method %@. %@", fileName, line, NSStringFromClass([object class]), class_isMetaClass([object class]) ? @"class" : @"instance", NSStringFromSelector(aSelector), format]; NSLogv(message, ap); [NSException raise: NSInternalInconsistencyException format: message arguments: ap]; va_end(ap); /* NOT REACHED */ GS_UNREACHABLE(); } @end gnustep-base-1.29.0/Source/NSAttributedString.m000066400000000000000000000763161435650067400214040ustar00rootroot00000000000000/** NSAttributedString.m Implementation of string class with attributes Copyright (C) 1997,1999 Free Software Foundation, Inc. Written by: ANOQ of the sun Date: November 1997 Rewrite by: Richard Frith-Macdonald Date: April 1999 This file is part of GNUstep-base 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 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. If you are interested in a warranty or support for this source code, contact Scott Christley for more information. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110 USA. NSAttributedString class reference $Date$ $Revision$ */ /* Warning - [-initWithString:attributes:] is the designated initialiser, * but it doesn't provide any way to perform the function of the * [-initWithAttributedString:] initialiser. * In order to work round this, the string argument of the * designated initialiser has been overloaded such that it * is expected to accept an NSAttributedString here instead of * a string. If you create an NSAttributedString subclass, you * must make sure that your implementation of the initialiser * copes with either an NSString or an NSAttributedString. * If it receives an NSAttributedString, it should ignore the * attributes argument and use the values from the string. */ #import "common.h" #import "GNUstepBase/Unicode.h" #import "Foundation/NSAttributedString.h" #import "Foundation/NSData.h" #import "Foundation/NSException.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSPortCoder.h" #import "Foundation/NSRange.h" @class GSAttributedString; @interface GSAttributedString : NSObject // Help the compiler @end @class GSMutableAttributedString; @interface GSMutableAttributedString : NSObject // Help the compiler @end @class GSMutableDictionary; @interface GSMutableDictionary : NSObject // Help the compiler @end static Class dictionaryClass = 0; static SEL eqSel; static SEL setSel; static SEL getSel; static SEL allocDictSel; static SEL initDictSel; static SEL addDictSel; static SEL setDictSel; static SEL relDictSel; static SEL remDictSel; static IMP allocDictImp; static IMP initDictImp; static IMP addDictImp; static IMP setDictImp; static IMP relDictImp; static IMP remDictImp; @interface GSMutableAttributedStringTracker : NSMutableString { NSMutableAttributedString *_owner; } + (NSMutableString*) stringWithOwner: (NSMutableAttributedString*)as; @end /** * A string in which name-value pairs represented by an [NSDictionary] may * be associated to ranges of characters. Used for text rendering by the * GUI/AppKit framework, in which fonts, sizes, etc. are stored under standard * attributes in the dictionaries. * */ @implementation NSAttributedString static Class NSAttributedStringClass; static Class GSAttributedStringClass; static Class NSMutableAttributedStringClass; static Class GSMutableAttributedStringClass; + (void) initialize { if (self == [NSAttributedString class]) { NSAttributedStringClass = self; GSAttributedStringClass = [GSAttributedString class]; NSMutableAttributedStringClass = [NSMutableAttributedString class]; GSMutableAttributedStringClass = [GSMutableAttributedString class]; dictionaryClass = [GSMutableDictionary class]; eqSel = @selector(isEqual:); setSel = @selector(setAttributes:range:); getSel = @selector(attributesAtIndex:effectiveRange:); allocDictSel = @selector(allocWithZone:); initDictSel = @selector(initWithDictionary:); addDictSel = @selector(addEntriesFromDictionary:); setDictSel = @selector(setObject:forKey:); relDictSel = @selector(release); remDictSel = @selector(removeObjectForKey:); allocDictImp = [dictionaryClass methodForSelector: allocDictSel]; initDictImp = [dictionaryClass instanceMethodForSelector: initDictSel]; addDictImp = [dictionaryClass instanceMethodForSelector: addDictSel]; setDictImp = [dictionaryClass instanceMethodForSelector: setDictSel]; remDictImp = [dictionaryClass instanceMethodForSelector: remDictSel]; relDictImp = [dictionaryClass instanceMethodForSelector: relDictSel]; } } + (id) allocWithZone: (NSZone*)z { if (self == NSAttributedStringClass) return NSAllocateObject(GSAttributedStringClass, 0, z); else return NSAllocateObject(self, 0, z); } - (Class) classForCoder { return NSAttributedStringClass; } static void appendUIntData(NSMutableData *d, NSUInteger i) { unsigned int aux = i; unsigned int len = 1; while (aux >= 128) { aux /= 128; len++; } { unsigned char *p, buf[len]; p = buf; while (i >= 128) { *p++ = (i & 0x7f) + 128; i /= 128; } *p = i; [d appendBytes: buf length: len]; } } - (void) encodeWithCoder: (NSCoder*)aCoder { if ([aCoder allowsKeyedCoding]) { NSUInteger length = [self length]; [aCoder encodeObject: [self string] forKey: @"NSString"]; if (length > 0) { NSRange range; NSDictionary *attrs; attrs = [self attributesAtIndex: 0 effectiveRange: &range]; if (range.length == length) { [aCoder encodeObject: attrs forKey: @"NSAttributes"]; } else { NSUInteger i = 0; NSUInteger pos = 0; NSMutableArray *attrs = [NSMutableArray arrayWithCapacity: 1]; NSMutableData *info = [NSMutableData dataWithCapacity: 2]; while (pos < length) { [attrs addObject: [self attributesAtIndex: pos effectiveRange: &range]]; appendUIntData(info, range.length); appendUIntData(info, i++); pos = NSMaxRange(range); } [aCoder encodeObject: [[attrs copy] autorelease] forKey: @"NSAttributes"]; [aCoder encodeObject: [[info copy] autorelease] forKey: @"NSAttributeInfo"]; } } } else { NSRange r = NSMakeRange(0, 0); unsigned index = NSMaxRange(r); unsigned length = [self length]; NSString *string = [self string]; NSDictionary *attrs; [aCoder encodeObject: string]; while (index < length) { attrs = [self attributesAtIndex: index effectiveRange: &r]; index = NSMaxRange(r); [aCoder encodeValueOfObjCType: @encode(unsigned) at: &index]; [aCoder encodeObject: attrs]; } } } - (id) initWithCoder: (NSCoder*)aDecoder { if ([aDecoder allowsKeyedCoding]) { NSString *string = [aDecoder decodeObjectForKey: @"NSString"]; if (![aDecoder containsValueForKey: @"NSAttributeInfo"]) { NSDictionary *attributes; attributes = [aDecoder decodeObjectForKey: @"NSAttributes"]; self = [self initWithString: string attributes: attributes]; } else { NSArray *attributes = [aDecoder decodeObjectForKey: @"NSAttributes"]; NSData *info = [aDecoder decodeObjectForKey: @"NSAttributeInfo"]; unsigned int pos = 0; const unsigned char *p = [info bytes]; const unsigned char *end = p + [info length]; NSMutableAttributedString *m = [[NSMutableAttributedString alloc] initWithString: string attributes: nil]; while (p < end) { unsigned int idx; unsigned int len; unsigned int shift; NSRange r; len = shift = 0; while (*p & 0x80) { len += (*p++ - 128) << shift; shift += 7; } len += *p++ << shift; idx = shift = 0; while (*p & 0x80) { idx += (*p++ - 128) << shift; shift += 7; } idx += *p++ << shift; r = NSMakeRange(pos, len); [m setAttributes: [attributes objectAtIndex: idx] range: r]; pos = NSMaxRange(r); } DESTROY(self); self = [m copy]; RELEASE(m); } } else { NSString *string = [aDecoder decodeObject]; unsigned length = [string length]; if (length == 0) { self = [self initWithString: string attributes: nil]; } else { unsigned index; NSDictionary *attrs; [aDecoder decodeValueOfObjCType: @encode(unsigned) at: &index]; attrs = [aDecoder decodeObject]; if (index == length) { self = [self initWithString: string attributes: attrs]; } else { NSRange r = NSMakeRange(0, index); unsigned last = index; NSMutableAttributedString *m; m = [NSMutableAttributedString alloc]; m = [m initWithString: string attributes: nil]; [m setAttributes: attrs range: r]; while (index < length) { [aDecoder decodeValueOfObjCType: @encode(unsigned) at: &index]; attrs = [aDecoder decodeObject]; r = NSMakeRange(last, index - last); [m setAttributes: attrs range: r]; last = index; } DESTROY(self); self = [m copy]; RELEASE(m); } } } return self; } - (id) replacementObjectForPortCoder: (NSPortCoder*)aCoder { if ([aCoder isByref] == NO) return self; return [super replacementObjectForPortCoder: aCoder]; } //NSCopying protocol - (id) copyWithZone: (NSZone*)zone { if ([self isKindOfClass: [NSMutableAttributedString class]] || NSShouldRetainWithZone(self, zone) == NO) return [[GSAttributedStringClass allocWithZone: zone] initWithAttributedString: self]; else return RETAIN(self); } //NSMutableCopying protocol - (id) mutableCopyWithZone: (NSZone*)zone { return [[GSMutableAttributedStringClass allocWithZone: zone] initWithAttributedString: self]; } //Creating an NSAttributedString - (id) init { return [self initWithString: @"" attributes: nil]; } /** * Initialize to aString with no attributes. */ - (id) initWithString: (NSString*)aString { return [self initWithString: aString attributes: nil]; } /** * Initialize to copy of attributedString. */ - (id) initWithAttributedString: (NSAttributedString*)attributedString { return [self initWithString: (NSString*)attributedString attributes: nil]; } /** * Initialize to aString with given attributes applying over full range of * string. */ - (id) initWithString: (NSString*)aString attributes: (NSDictionary*)attributes { //This is the designated initializer [self subclassResponsibility: _cmd];/* Primitive method! */ return nil; } - (NSString*) description { NSRange r = NSMakeRange(0, 0); unsigned index = NSMaxRange(r); unsigned length = [self length]; NSString *string = [self string]; NSDictionary *attrs; NSMutableString *desc; desc = [NSMutableString stringWithCapacity: length]; while (index < length && (attrs = [self attributesAtIndex: index effectiveRange: &r]) != nil) { index = NSMaxRange(r); [desc appendFormat: @"%@%@", [string substringWithRange: r], attrs]; } return desc; } //Retrieving character information /** * Return length of the underlying string. */ - (NSUInteger) length { return [[self string] length]; } /** * Return the underlying string, stripped of attributes. */ - (NSString*) string { [self subclassResponsibility: _cmd];/* Primitive method! */ return nil; } //Retrieving attribute information /** * Returns attributes and values at index, and, if effectiveRange * is non-nil, this gets filled with a range over which these attributes * and values still hold. This may not be the maximum range, depending * on the implementation. */ - (NSDictionary*) attributesAtIndex: (NSUInteger)index effectiveRange: (NSRange*)aRange { [self subclassResponsibility: _cmd];/* Primitive method! */ return nil; } /** * Returns attributes and values at index, and, if longestEffectiveRange * is non-nil, this gets filled with the range over which the attribute-value * set is the same as at index, clipped to rangeLimit. */ - (NSDictionary*) attributesAtIndex: (NSUInteger)index longestEffectiveRange: (NSRange*)aRange inRange: (NSRange)rangeLimit { NSDictionary *attrDictionary, *tmpDictionary; NSRange tmpRange; IMP getImp; if (NSMaxRange(rangeLimit) > [self length]) { [NSException raise: NSRangeException format: @"RangeError in method -attributesAtIndex:longestEffectiveRange:inRange: in class NSAttributedString"]; } getImp = [self methodForSelector: getSel]; attrDictionary = (*getImp)(self, getSel, index, aRange); if (aRange == 0) return attrDictionary; while (aRange->location > rangeLimit.location) { //Check extend range backwards tmpDictionary = (*getImp)(self, getSel, aRange->location-1, &tmpRange); if ([tmpDictionary isEqualToDictionary: attrDictionary]) { aRange->length = NSMaxRange(*aRange) - tmpRange.location; aRange->location = tmpRange.location; } else { break; } } while (NSMaxRange(*aRange) < NSMaxRange(rangeLimit)) { //Check extend range forwards tmpDictionary = (*getImp)(self, getSel, NSMaxRange(*aRange), &tmpRange); if ([tmpDictionary isEqualToDictionary: attrDictionary]) { aRange->length = NSMaxRange(tmpRange) - aRange->location; } else { break; } } *aRange = NSIntersectionRange(*aRange,rangeLimit);//Clip to rangeLimit return attrDictionary; } /** * Returns value for given attribute at index, and, if effectiveRange is * non-nil, this gets filled with a range over which this value holds. This * may not be the maximum range, depending on the implementation. */ - (id) attribute: (NSString*)attributeName atIndex: (NSUInteger)index effectiveRange: (NSRange*)aRange { NSDictionary *tmpDictionary; id attrValue; tmpDictionary = [self attributesAtIndex: index effectiveRange: aRange]; if (attributeName == nil) { if (aRange != 0) { *aRange = NSMakeRange(0,[self length]); /* * If attributeName is nil, then the attribute will not exist in the * entire text - therefore aRange of the entire text must be correct */ } return nil; } attrValue = [tmpDictionary objectForKey: attributeName]; return attrValue; } /** * Returns value for given attribute at index, and, if longestEffectiveRange * is non-nil, this gets filled with the range over which the attribute * applies, clipped to rangeLimit. */ - (id) attribute: (NSString*)attributeName atIndex: (NSUInteger)index longestEffectiveRange: (NSRange*)aRange inRange: (NSRange)rangeLimit { NSDictionary *tmpDictionary; id attrValue; id tmpAttrValue; NSRange tmpRange; BOOL (*eImp)(id,SEL,id); IMP getImp; if (NSMaxRange(rangeLimit) > [self length]) { [NSException raise: NSRangeException format: @"RangeError in method %@ in class %@", NSStringFromSelector(_cmd), NSStringFromClass([self class])]; } if (attributeName == nil) return nil; attrValue = [self attribute: attributeName atIndex: index effectiveRange: aRange]; if (aRange == 0) return attrValue; /* * If attrValue == nil then eImp will be zero */ eImp = (BOOL(*)(id,SEL,id))[attrValue methodForSelector: eqSel]; getImp = [self methodForSelector: getSel]; while (aRange->location > rangeLimit.location) { //Check extend range backwards tmpDictionary = (*getImp)(self, getSel, aRange->location-1, &tmpRange); tmpAttrValue = [tmpDictionary objectForKey: attributeName]; if (tmpAttrValue == attrValue || (eImp != 0 && (*eImp)(attrValue, eqSel, tmpAttrValue))) { aRange->length = NSMaxRange(*aRange) - tmpRange.location; aRange->location = tmpRange.location; } else { break; } } while (NSMaxRange(*aRange) < NSMaxRange(rangeLimit)) { //Check extend range forwards tmpDictionary = (*getImp)(self, getSel, NSMaxRange(*aRange), &tmpRange); tmpAttrValue = [tmpDictionary objectForKey: attributeName]; if (tmpAttrValue == attrValue || (eImp != 0 && (*eImp)(attrValue, eqSel, tmpAttrValue))) { aRange->length = NSMaxRange(tmpRange) - aRange->location; } else { break; } } *aRange = NSIntersectionRange(*aRange,rangeLimit);//Clip to rangeLimit return attrValue; } //Comparing attributed strings /** * Returns whether all characters and attributes are equal between this * string and otherString. */ - (BOOL) isEqualToAttributedString: (NSAttributedString*)otherString { NSRange ownEffectiveRange,otherEffectiveRange; unsigned int length; NSDictionary *ownDictionary,*otherDictionary; BOOL result; if (!otherString) return NO; if (![[otherString string] isEqual: [self string]]) return NO; length = [otherString length]; if (length == 0) return YES; ownDictionary = [self attributesAtIndex: 0 effectiveRange: &ownEffectiveRange]; otherDictionary = [otherString attributesAtIndex: 0 effectiveRange: &otherEffectiveRange]; result = YES; while (YES) { if (NSIntersectionRange(ownEffectiveRange, otherEffectiveRange).length > 0 && ![ownDictionary isEqualToDictionary: otherDictionary]) { result = NO; break; } if (NSMaxRange(ownEffectiveRange) < NSMaxRange(otherEffectiveRange)) { ownDictionary = [self attributesAtIndex: NSMaxRange(ownEffectiveRange) effectiveRange: &ownEffectiveRange]; } else { if (NSMaxRange(otherEffectiveRange) >= length) { break;//End of strings } otherDictionary = [otherString attributesAtIndex: NSMaxRange(otherEffectiveRange) effectiveRange: &otherEffectiveRange]; } } return result; } - (BOOL) isEqual: (id)anObject { if (anObject == self) return YES; if ([anObject isKindOfClass: NSAttributedStringClass]) return [self isEqualToAttributedString: anObject]; return NO; } //Extracting a substring /** * Returns substring with attribute information. */ - (NSAttributedString*) attributedSubstringFromRange: (NSRange)aRange { NSAttributedString *newAttrString; NSString *newSubstring; NSDictionary *attrs; NSRange range; unsigned len = [self length]; GS_RANGE_CHECK(aRange, len); newSubstring = [[self string] substringWithRange: aRange]; attrs = [self attributesAtIndex: aRange.location effectiveRange: &range]; range = NSIntersectionRange(range, aRange); if (NSEqualRanges(range, aRange) == YES) { newAttrString = [GSAttributedStringClass alloc]; newAttrString = [newAttrString initWithString: newSubstring attributes: attrs]; } else { NSMutableAttributedString *m; NSRange rangeToSet = range; m = [GSMutableAttributedStringClass alloc]; m = [m initWithString: newSubstring attributes: nil]; rangeToSet.location = 0; [m setAttributes: attrs range: rangeToSet]; while (NSMaxRange(range) < NSMaxRange(aRange)) { attrs = [self attributesAtIndex: NSMaxRange(range) effectiveRange: &range]; rangeToSet = NSIntersectionRange(range, aRange); rangeToSet.location -= aRange.location; [m setAttributes: attrs range: rangeToSet]; } newAttrString = [m copy]; RELEASE(m); } IF_NO_ARC(AUTORELEASE(newAttrString);) return newAttrString; } @end //NSAttributedString /** * Mutable version of [NSAttributedString]. */ @implementation NSMutableAttributedString + (id) allocWithZone: (NSZone*)z { if (self == NSMutableAttributedStringClass) return NSAllocateObject(GSMutableAttributedStringClass, 0, z); else return NSAllocateObject(self, 0, z); } - (Class) classForCoder { return NSMutableAttributedStringClass; } - (id) initWithCoder: (NSCoder*)aDecoder { if ([aDecoder allowsKeyedCoding]) { NSString *string = [aDecoder decodeObjectForKey: @"NSString"]; if (![aDecoder containsValueForKey: @"NSAttributeInfo"]) { NSDictionary *attributes; attributes = [aDecoder decodeObjectForKey: @"NSAttributes"]; self = [self initWithString: string attributes: attributes]; } else { NSArray *attributes = [aDecoder decodeObjectForKey: @"NSAttributes"]; NSData *info = [aDecoder decodeObjectForKey: @"NSAttributeInfo"]; unsigned int pos = 0; const unsigned char *p = [info bytes]; const unsigned char *end = p + [info length]; self = [self initWithString: string attributes: nil]; while (p < end) { unsigned int idx; unsigned int len; unsigned int shift; NSRange r; len = shift = 0; while (*p & 0x80) { len += (*p++ - 128) << shift; shift += 7; } len += *p++ << shift; idx = shift = 0; while (*p & 0x80) { idx += (*p++ - 128) << shift; shift += 7; } idx += *p++ << shift; r = NSMakeRange(pos, len); [self setAttributes: [attributes objectAtIndex: idx] range: r]; pos = NSMaxRange(r); } } } else { NSString *string = [aDecoder decodeObject]; unsigned length = [string length]; if (length == 0) { self = [self initWithString: string attributes: nil]; } else { unsigned index; NSDictionary *attrs; [aDecoder decodeValueOfObjCType: @encode(unsigned) at: &index]; attrs = [aDecoder decodeObject]; if (index == length) { self = [self initWithString: string attributes: attrs]; } else { NSRange r = NSMakeRange(0, index); unsigned last = index; self = [self initWithString: string attributes: nil]; [self setAttributes: attrs range: r]; while (index < length) { [aDecoder decodeValueOfObjCType: @encode(unsigned) at: &index]; attrs = [aDecoder decodeObject]; r = NSMakeRange(last, index - last); [self setAttributes: attrs range: r]; last = index; } } } } return self; } //Retrieving character information /** * Returns mutable version of the underlying string. */ - (NSMutableString*) mutableString { return [GSMutableAttributedStringTracker stringWithOwner: self]; } //Changing characters /** * Removes characters and attributes applying to them. */ - (void) deleteCharactersInRange: (NSRange)aRange { [self replaceCharactersInRange: aRange withString: nil]; } //Changing attributes /** * Sets attributes to apply over range, replacing any previous attributes. */ - (void) setAttributes: (NSDictionary*)attributes range: (NSRange)aRange { [self subclassResponsibility: _cmd];// Primitive method! } /** * Adds attribute applying to given range. */ - (void) addAttribute: (NSString*)name value: (id)value range: (NSRange)aRange { NSRange effectiveRange; NSDictionary *attrDict; NSMutableDictionary *newDict; unsigned int tmpLength; IMP getImp; tmpLength = [self length]; GS_RANGE_CHECK(aRange, tmpLength); getImp = [self methodForSelector: getSel]; attrDict = (*getImp)(self, getSel, aRange.location, &effectiveRange); if (effectiveRange.location < NSMaxRange(aRange)) { IMP setImp; setImp = [self methodForSelector: setSel]; [self beginEditing]; while (effectiveRange.location < NSMaxRange(aRange)) { effectiveRange = NSIntersectionRange(aRange, effectiveRange); newDict = (*allocDictImp)(dictionaryClass, allocDictSel, NSDefaultMallocZone()); newDict = (*initDictImp)(newDict, initDictSel, attrDict); (*setDictImp)(newDict, setDictSel, value, name); (*setImp)(self, setSel, newDict, effectiveRange); IF_NO_ARC((*relDictImp)(newDict, relDictSel);) if (NSMaxRange(effectiveRange) >= NSMaxRange(aRange)) { effectiveRange.location = NSMaxRange(aRange);// stop the loop... } else if (NSMaxRange(effectiveRange) < tmpLength) { attrDict = (*getImp)(self, getSel, NSMaxRange(effectiveRange), &effectiveRange); } } [self endEditing]; } } /** * Add attributes to apply over given range. */ - (void) addAttributes: (NSDictionary*)attributes range: (NSRange)aRange { NSRange effectiveRange; NSDictionary *attrDict; NSMutableDictionary *newDict; unsigned int tmpLength; IMP getImp; if (!attributes) { [NSException raise: NSInvalidArgumentException format: @"attributes is nil in method -addAttributes:range: " @"in class NSMutableAtrributedString"]; } tmpLength = [self length]; if (NSMaxRange(aRange) > tmpLength) { [NSException raise: NSRangeException format: @"RangeError in method -addAttribute:value:range: " @"in class NSMutableAttributedString"]; } getImp = [self methodForSelector: getSel]; attrDict = (*getImp)(self, getSel, aRange.location, &effectiveRange); if (effectiveRange.location < NSMaxRange(aRange)) { IMP setImp; setImp = [self methodForSelector: setSel]; [self beginEditing]; while (effectiveRange.location < NSMaxRange(aRange)) { effectiveRange = NSIntersectionRange(aRange,effectiveRange); newDict = (*allocDictImp)(dictionaryClass, allocDictSel, NSDefaultMallocZone()); newDict = (*initDictImp)(newDict, initDictSel, attrDict); (*addDictImp)(newDict, addDictSel, attributes); (*setImp)(self, setSel, newDict, effectiveRange); IF_NO_ARC((*relDictImp)(newDict, relDictSel);) if (NSMaxRange(effectiveRange) >= NSMaxRange(aRange)) { effectiveRange.location = NSMaxRange(aRange);// stop the loop... } else if (NSMaxRange(effectiveRange) < tmpLength) { attrDict = (*getImp)(self, getSel, NSMaxRange(effectiveRange), &effectiveRange); } } [self endEditing]; } } /** * Removes given attribute from aRange. */ - (void) removeAttribute: (NSString*)name range: (NSRange)aRange { NSRange effectiveRange; NSDictionary *attrDict; NSMutableDictionary *newDict; unsigned int tmpLength; IMP getImp; tmpLength = [self length]; GS_RANGE_CHECK(aRange, tmpLength); getImp = [self methodForSelector: getSel]; attrDict = (*getImp)(self, getSel, aRange.location, &effectiveRange); if (effectiveRange.location < NSMaxRange(aRange)) { IMP setImp; setImp = [self methodForSelector: setSel]; [self beginEditing]; while (effectiveRange.location < NSMaxRange(aRange)) { effectiveRange = NSIntersectionRange(aRange,effectiveRange); newDict = (*allocDictImp)(dictionaryClass, allocDictSel, NSDefaultMallocZone()); newDict = (*initDictImp)(newDict, initDictSel, attrDict); (*remDictImp)(newDict, remDictSel, name); (*setImp)(self, setSel, newDict, effectiveRange); IF_NO_ARC((*relDictImp)(newDict, relDictSel);) if (NSMaxRange(effectiveRange) >= NSMaxRange(aRange)) { effectiveRange.location = NSMaxRange(aRange);// stop the loop... } else if (NSMaxRange(effectiveRange) < tmpLength) { attrDict = (*getImp)(self, getSel, NSMaxRange(effectiveRange), &effectiveRange); } } [self endEditing]; } } //Changing characters and attributes /** * Appends attributed string to end of this one, preserving attributes. */ - (void) appendAttributedString: (NSAttributedString*)attributedString { [self replaceCharactersInRange: NSMakeRange([self length],0) withAttributedString: attributedString]; } /** * Inserts attributed string within this one, preserving attributes. */ - (void) insertAttributedString: (NSAttributedString*)attributedString atIndex: (NSUInteger)index { [self replaceCharactersInRange: NSMakeRange(index,0) withAttributedString: attributedString]; } /** * Replaces substring and attributes. */ - (void) replaceCharactersInRange: (NSRange)aRange withAttributedString: (NSAttributedString*)attributedString { NSDictionary *attrDict; NSString *tmpStr; unsigned max; if (attributedString == nil) { [self replaceCharactersInRange: aRange withString: nil]; return; } [self beginEditing]; tmpStr = [attributedString string]; [self replaceCharactersInRange: aRange withString: tmpStr]; max = [tmpStr length]; if (max > 0) { unsigned loc = 0; NSRange effectiveRange = NSMakeRange(0, loc); NSRange clipRange = NSMakeRange(0, max); IMP getImp; IMP setImp; getImp = [attributedString methodForSelector: getSel]; setImp = [self methodForSelector: setSel]; while (loc < max) { NSRange ownRange; attrDict = (*getImp)(attributedString, getSel, loc, &effectiveRange); ownRange = NSIntersectionRange(clipRange, effectiveRange); ownRange.location += aRange.location; (*setImp)(self, setSel, attrDict, ownRange); loc = NSMaxRange(effectiveRange); } } [self endEditing]; } /** * Replaces substring; replacement is granted attributes equal to those of * the first character of the portion replaced. */ - (void) replaceCharactersInRange: (NSRange)aRange withString: (NSString*)aString { [self subclassResponsibility: _cmd];// Primitive method! } /** * Replaces entire contents (so this object can be reused). */ - (void) setAttributedString: (NSAttributedString*)attributedString { [self replaceCharactersInRange: NSMakeRange(0,[self length]) withAttributedString: attributedString]; } /** * Call before executing a collection of changes, for optimization. */ - (void) beginEditing { } /** * Call after executing a collection of changes, for optimization. */ - (void) endEditing { } @end //NSMutableAttributedString /* * The GSMutableAttributedStringTracker class is a concrete subclass of * NSMutableString which keeps it's owner informed of any changes made * to it. */ @implementation GSMutableAttributedStringTracker + (NSMutableString*) stringWithOwner: (NSMutableAttributedString*)as { GSMutableAttributedStringTracker *str; NSZone *z = NSDefaultMallocZone(); str = (GSMutableAttributedStringTracker*) NSAllocateObject(self, 0, z); str->_owner = RETAIN(as); return AUTORELEASE(str); } - (void) dealloc { RELEASE(_owner); [super dealloc]; } - (NSUInteger) length { return [[_owner string] length]; } - (unichar) characterAtIndex: (NSUInteger)index { return [[_owner string] characterAtIndex: index]; } - (void)getCharacters: (unichar*)buffer { [[_owner string] getCharacters: buffer]; } - (void)getCharacters: (unichar*)buffer range: (NSRange)aRange { [[_owner string] getCharacters: buffer range: aRange]; } - (const char*) cString { return [[_owner string] cString]; } - (NSUInteger) cStringLength { return [[_owner string] cStringLength]; } - (NSStringEncoding) fastestEncoding { return [[_owner string] fastestEncoding]; } - (NSStringEncoding) smallestEncoding { return [[_owner string] smallestEncoding]; } - (int) _baseLength { return [[_owner string] _baseLength]; } - (void) encodeWithCoder: (NSCoder*)aCoder { [[_owner string] encodeWithCoder: aCoder]; } - (Class) classForCoder { return [[_owner string] classForCoder]; } - (void) replaceCharactersInRange: (NSRange)aRange withString: (NSString*)aString { [_owner replaceCharactersInRange: aRange withString: aString]; } @end gnustep-base-1.29.0/Source/NSAutoreleasePool.m000066400000000000000000000422151435650067400212000ustar00rootroot00000000000000/** Implementation of auto release pool for delayed disposal Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. Written by: Andrew Kachites McCallum Written by: Richard Frith-Macdonald Date: January 1995 This file is part of the GNUstep Base Library. 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 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 USA. NSAutoreleasePool class reference $Date$ $Revision$ */ #import "common.h" #define EXPOSE_NSAutoreleasePool_IVARS 1 #define EXPOSE_NSThread_IVARS 1 #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSException.h" #import "Foundation/NSThread.h" #if __has_include() # include # ifdef OBJC_ARC_AUTORELEASE_DEBUG # include # define ARC_RUNTIME 1 # endif #endif /* When this is `NO', autoreleased objects are never actually recorded in an NSAutoreleasePool, and are not sent a `release' message. Thus memory for objects use grows, and grows, and... */ static BOOL autorelease_enabled = YES; /* When the _released_count of a pool gets over this value, we raise an exception. This can be adjusted with +setPoolCountThreshold */ static unsigned pool_count_warning_threshold = UINT_MAX-1; /* When the number of pools in a thread gets over this value, we raise an exception. This can be adjusted with +setPoolNumberThreshold */ static unsigned pool_number_warning_threshold = 10000; /* The size of the first _released array. */ #define BEGINNING_POOL_SIZE 32 /* Easy access to the thread variables belonging to NSAutoreleasePool. */ #define ARP_THREAD_VARS (&((GSCurrentThread())->_autorelease_vars)) @interface NSAutoreleasePool (Private) + (unsigned) autoreleaseCountForObject: (id)anObject; - (void) _reallyDealloc; @end /* Functions for managing a per-thread cache of NSAutoreleasedPool's already alloc'ed. The cache is kept in the autorelease_thread_var structure, which is an ivar of NSThread. */ static id pop_pool_from_cache (struct autorelease_thread_vars *tv); static inline void free_pool_cache (struct autorelease_thread_vars *tv) { while (tv->pool_cache_count) { NSAutoreleasePool *pool = pop_pool_from_cache(tv); [pool _reallyDealloc]; } if (tv->pool_cache) { NSZoneFree(NSDefaultMallocZone(), tv->pool_cache); tv->pool_cache = 0; tv->pool_cache_size = 0; } } static inline void init_pool_cache (struct autorelease_thread_vars *tv) { tv->pool_cache_size = 32; tv->pool_cache_count = 0; tv->pool_cache = (id*)NSZoneMalloc(NSDefaultMallocZone(), sizeof(id) * tv->pool_cache_size); } static void push_pool_to_cache (struct autorelease_thread_vars *tv, id p) { if (!tv->pool_cache) { init_pool_cache (tv); } else if (tv->pool_cache_count == tv->pool_cache_size) { tv->pool_cache_size *= 2; tv->pool_cache = (id*)NSZoneRealloc(NSDefaultMallocZone(), tv->pool_cache, sizeof(id) * tv->pool_cache_size); } tv->pool_cache[tv->pool_cache_count++] = p; } static id pop_pool_from_cache (struct autorelease_thread_vars *tv) { return tv->pool_cache[--(tv->pool_cache_count)]; } @implementation NSAutoreleasePool + (void) initialize { /* Do nothing here which might interact with ther classes since this * is called by [NSObject+initialize] ! */ return; } + (id) allocWithZone: (NSZone*)zone { struct autorelease_thread_vars *tv = ARP_THREAD_VARS; if (tv->pool_cache_count) { NSAutoreleasePool *p = pop_pool_from_cache (tv); /* When we cache a 'deallocated' pool, we set its _released_count to * UINT_MAX, so when we rtrieve it fromm the cache we must increment * it to start with a count of zero. */ if (++(p->_released_count) != 0) { [NSException raise: NSInternalInconsistencyException format: @"NSAutoreleasePool corrupted pool in cache"]; } return p; } return NSAllocateObject (self, 0, zone); } + (id) new { static IMP allocImp = 0; static IMP initImp = 0; id arp; if (0 == allocImp) { allocImp = [NSAutoreleasePool methodForSelector: @selector(allocWithZone:)]; initImp = [NSAutoreleasePool instanceMethodForSelector: @selector(init)]; } arp = (*allocImp)(self, @selector(allocWithZone:), NSDefaultMallocZone()); return (*initImp)(arp, @selector(init)); } #ifdef ARC_RUNTIME - (id) init { _released = objc_autoreleasePoolPush(); { struct autorelease_thread_vars *tv = ARP_THREAD_VARS; unsigned level = 0; _parent = tv->current_pool; if (_parent) { NSAutoreleasePool *pool = _parent; while (nil != pool) { level++; pool = pool->_parent; } _parent->_child = self; } tv->current_pool = self; if (level > pool_number_warning_threshold) { [NSException raise: NSGenericException format: @"Too many (%u) autorelease pools ... leaking them?", level]; } } /* Catch the case where the receiver is a pool still in use (wrongly put in the pool cache previously). */ NSCAssert(_child != self, @"Invalid child pool"); NSCAssert(_parent != self, @"Invalid parent pool"); return self; } - (unsigned) autoreleaseCountForObject: (id)anObject { return objc_arc_autorelease_count_for_object_np(anObject); } + (unsigned) autoreleaseCountForObject: (id)anObject { return objc_arc_autorelease_count_for_object_np(anObject); } - (unsigned) autoreleaseCount { return objc_arc_autorelease_count_np(); } + (void) addObject: (id)anObj { if (autorelease_enabled) objc_autorelease(anObj); } - (void) addObject: (id)anObj { if (autorelease_enabled) objc_autorelease(anObj); } - (void) emptyPool { struct autorelease_thread_vars *tv = ARP_THREAD_VARS; tv->current_pool = self; objc_autoreleasePoolPop(_released); } /** * Indicate to the runtime that we have an ARC-compatible implementation of * NSAutoreleasePool and that it doesn't need to bother creating objects for * pools. */ - (void)_ARCCompatibleAutoreleasePool {} #else - (id) init { if (!_released_head) { _addImp = (void (*)(id, SEL, id)) [self methodForSelector: @selector(addObject:)]; /* Allocate the array that will be the new head of the list of arrays. */ _released = (struct autorelease_array_list*) NSZoneMalloc(NSDefaultMallocZone(), sizeof(struct autorelease_array_list) + (BEGINNING_POOL_SIZE * sizeof(id))); /* Currently no NEXT array in the list, so NEXT == NULL. */ _released->next = NULL; _released->size = BEGINNING_POOL_SIZE; _released->count = 0; _released_head = _released; _released_count = 0; } else /* Already initialized; (it came from autorelease_pool_cache); we don't have to allocate new array list memory. */ { _released = _released_head; } /* Install ourselves as the current pool. * The only other place where the parent/child linked list is modified * should be in -dealloc */ { struct autorelease_thread_vars *tv = ARP_THREAD_VARS; unsigned level = 0; _parent = tv->current_pool; if (_parent) { NSAutoreleasePool *pool = _parent; while (nil != pool) { level++; pool = pool->_parent; } _parent->_child = self; } tv->current_pool = self; if (level > pool_number_warning_threshold) { [NSException raise: NSGenericException format: @"Too many (%u) autorelease pools ... leaking them?", level]; } } return self; } - (unsigned) autoreleaseCount { unsigned count = 0; struct autorelease_array_list *released = _released_head; while (released != 0) { count += released->count; released = released->next; } return count; } - (unsigned) autoreleaseCountForObject: (id)anObject { unsigned count = 0; struct autorelease_array_list *released = _released_head; unsigned int i; while (released != 0) { for (i = 0; i < released->count; i++) if (released->objects[i] == anObject) count++; released = released->next; } return count; } + (unsigned) autoreleaseCountForObject: (id)anObject { unsigned count = 0; NSAutoreleasePool *pool = ARP_THREAD_VARS->current_pool; while (pool) { count += [pool autoreleaseCountForObject: anObject]; pool = pool->_parent; } return count; } + (void) addObject: (id)anObj { NSThread *t = GSCurrentThread(); NSAutoreleasePool *pool; NSAssert(nil != t, @"Creating autorelease pool on nonexistent thread!"); pool = t->_autorelease_vars.current_pool; if (pool == nil && t->_active == NO) { // Don't leak while exiting thread. pool = t->_autorelease_vars.current_pool = [self new]; } if (pool != nil) { (*pool->_addImp)(pool, @selector(addObject:), anObj); } else { NSAutoreleasePool *arp = [NSAutoreleasePool new]; if (anObj != nil) { NSLog(@"autorelease called without pool for object (%p) " @"of class %@ in thread %@", anObj, NSStringFromClass([anObj class]), [NSThread currentThread]); } else { NSLog(@"autorelease called without pool for nil object."); } [arp drain]; } } - (void) addObject: (id)anObj { /* If the global, static variable AUTORELEASE_ENABLED is not set, do nothing, just return. */ if (!autorelease_enabled) return; if (_released_count >= pool_count_warning_threshold) { [NSException raise: NSGenericException format: @"AutoreleasePool count threshold exceeded."]; } /* Get a new array for the list, if the current one is full. */ while (_released->count == _released->size) { if (_released->next) { /* There is an already-allocated one in the chain; use it. */ _released = _released->next; } else { /* We are at the end of the chain, and need to allocate a new one. */ struct autorelease_array_list *new_released; unsigned new_size = _released->size * 2; new_released = (struct autorelease_array_list*) NSZoneMalloc(NSDefaultMallocZone(), sizeof(struct autorelease_array_list) + (new_size * sizeof(id))); new_released->next = NULL; new_released->size = new_size; new_released->count = 0; _released->next = new_released; _released = new_released; } } /* Put the object at the end of the list. */ _released->objects[_released->count] = anObj; (_released->count)++; /* Keep track of the total number of objects autoreleased in this pool */ _released_count++; } - (void) emptyPool { unsigned i; Class classes[16]; IMP imps[16]; for (i = 0; i < 16; i++) { classes[i] = 0; imps[i] = 0; } /* * Loop throught the deallocation code repeatedly ... since we deallocate * objects in the receiver while the receiver remains set as the current * autorelease pool ... so if any object which is being deallocated adds * any object to the current autorelease pool, we may need to release it * again. */ while (_child != nil || _released_count > 0) { volatile struct autorelease_array_list *released; /* If there are NSAutoreleasePool below us in the list of * NSAutoreleasePools, then deallocate them also. * The (only) way we could get in this situation (in correctly * written programs, that don't release NSAutoreleasePools in * weird ways), is if an exception threw us up the stack. * However, if a program has leaked pools we may be deallocating * a pool with LOTS of children. To avoid stack overflow we * therefore deallocate children starting with the oldest first. */ if (nil != _child) { NSAutoreleasePool *pool = _child; /* Find other end of linked list ... oldest child. */ while (nil != pool->_child) { pool = pool->_child; } /* Deallocate the children in the list. */ while (pool != self) { pool = pool->_parent; [pool->_child dealloc]; } } /* Take the object out of the released list just before releasing it, * so if we are doing "double_release_check"ing, then * autoreleaseCountForObject: won't find the object we are currently * releasing. */ released = _released_head; while (released != 0) { id *objects = (id*)(released->objects); for (i = 0; i < released->count; i++) { id anObject; Class c; unsigned hash; anObject = objects[i]; objects[i] = nil; if (anObject == nil) { fprintf(stderr, "nil object encountered in autorelease pool\n"); continue; } c = object_getClass(anObject); if (c == 0) { [NSException raise: NSInternalInconsistencyException format: @"nul class for object in autorelease pool"]; } hash = (((unsigned)(uintptr_t)c) >> 3) & 0x0f; if (classes[hash] != c) { /* If anObject was an instance, c is it's class. * If anObject was a class, c is its metaclass. * Either way, we should get the appropriate pointer. * If anObject is a proxy to something, * the +instanceMethodForSelector: and -methodForSelector: * methods may not exist, but this will return the * address of the forwarding method if necessary. */ imps[hash] = class_getMethodImplementation(c, @selector(release)); classes[hash] = c; } (imps[hash])(anObject, @selector(release)); } _released_count -= released->count; released->count = 0; released = released->next; } } } #endif // ARC_RUNTIME + (id) currentPool { return ARP_THREAD_VARS->current_pool; } - (void) drain { // Don't call -release, make both -release and -drain have the same cost in // non-GC mode. [self dealloc]; } - (id) retain { [NSException raise: NSGenericException format: @"Don't call `-retain' on a NSAutoreleasePool"]; return self; } - (oneway void) release { [self dealloc]; } - (void) dealloc { struct autorelease_thread_vars *tv = ARP_THREAD_VARS; if (UINT_MAX == _released_count) { [NSException raise: NSInternalInconsistencyException format: @"NSAutoreleasePool -dealloc of deallocated pool"]; } [self emptyPool]; NSAssert(0 == _released_count, NSInternalInconsistencyException); /* Remove self from the linked list of pools in use. * We already know that we have deallocated any child (in -emptyPool), * but we may have a parent which needs to know we have gone. * The only other place where the parent/child linked list is modified * should be in -init */ if (tv->current_pool == self) { tv->current_pool = _parent; } if (_parent != nil) { _parent->_child = nil; _parent = nil; } /* Mark pool as cached so that any attempt to add an object to use it * or to deallocate it again will raise an exception. * We reset to zero when we get i out of the cache as a new allocation. */ _released_count = UINT_MAX; /* Don't deallocate ourself, just save us for later use. */ push_pool_to_cache (tv, self); GSNOSUPERDEALLOC; } - (void) _reallyDealloc { struct autorelease_array_list *a; for (a = _released_head; a;) { void *n = a->next; NSZoneFree(NSDefaultMallocZone(), a); a = n; } _released = _released_head = 0; [super dealloc]; } - (id) autorelease { [NSException raise: NSGenericException format: @"Don't call `-autorelease' on a NSAutoreleasePool"]; return self; } + (void) _endThread: (NSThread*)thread { struct autorelease_thread_vars *tv; NSAutoreleasePool *pool; tv = &((thread)->_autorelease_vars); /* First release any objects in the pool... bearing in mind that * releasing any object could cause other objects to be added to * the pool. */ pool = tv->current_pool; while (pool) { [pool emptyPool]; pool = pool->_parent; } /* Now free the memory (we have finished usingthe pool). */ pool = tv->current_pool; tv->current_pool = nil; while (pool) { NSAutoreleasePool *p = pool->_parent; [pool _reallyDealloc]; pool = p; } free_pool_cache(tv); } + (void) enableRelease: (BOOL)enable { autorelease_enabled = enable; } + (void) freeCache { free_pool_cache(ARP_THREAD_VARS); } + (void) setPoolCountThreshold: (unsigned)c { if (c >= UINT_MAX) c = UINT_MAX - 1; pool_count_warning_threshold = c; } + (void) setPoolNumberThreshold: (unsigned)c { pool_number_warning_threshold = c; } @end gnustep-base-1.29.0/Source/NSBackgroundActivityScheduler.m000066400000000000000000000101401435650067400235200ustar00rootroot00000000000000/* Implementation of class NSBackgroundActivityScheduler Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory John Casamento Date: Fri Oct 25 00:52:54 EDT 2019 This file is part of the GNUstep Library. 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 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 USA. */ #import "Foundation/NSBackgroundActivityScheduler.h" #import "Foundation/NSString.h" #import "Foundation/NSTimer.h" @implementation NSBackgroundActivityScheduler - (instancetype) initWithIdentifier: (NSString *)identifier { self = [super init]; if(self != nil) { _identifier = identifier; _qualityOfService = NSQualityOfServiceDefault; _repeats = NO; _interval = 0; _tolerance = 0; _shouldDefer = NO; _timer = nil; _opts = 0; _token = nil; _reason = [NSString stringWithFormat: @"Reason-%@", self]; } return self; } - (void) dealloc { RELEASE(_identifier); RELEASE(_token); RELEASE(_reason); [super dealloc]; } - (NSString *) identifier { return _identifier; } - (void) setIdentifier: (NSString *)identifier { ASSIGNCOPY(_identifier, identifier); } - (NSQualityOfService) qualityOfService { return _qualityOfService; } - (void) setQualityOfService: (NSQualityOfService)qualityOfService { _qualityOfService = qualityOfService; } - (BOOL) repeats { return _repeats; } - (void) setRepeats: (BOOL)flag { _repeats = flag; } - (NSTimeInterval) interval { return _interval; } - (void) setInterval: (NSTimeInterval)interval { _interval = interval; } - (NSTimeInterval) tolerance { return _tolerance; } - (void) setTolerance: (NSTimeInterval)tolerance { _tolerance = tolerance; } - (BOOL) shouldDefer { return _shouldDefer; } - (void) setShouldDefer: (BOOL)flag { _shouldDefer = flag; } - (void) _performActivity { # if __has_feature(blocks) NSProcessInfo *pinfo = [NSProcessInfo processInfo]; [pinfo performActivityWithOptions: _opts reason: _reason usingBlock: ^{ // TODO: Need to implement the NSProcessInfo performActivity... methods. }]; # else NSLog(@"No block support, so not running background activity...."); # endif } - (void) scheduleWithBlock: (GSScheduledBlock)block { NSProcessInfo *pinfo = [NSProcessInfo processInfo]; ASSIGN(_block, (id)block); switch(_qualityOfService) { case NSQualityOfServiceUserInteractive: _opts = NSActivityUserInitiated | NSActivityIdleDisplaySleepDisabled; break; case NSQualityOfServiceUserInitiated: _opts = NSActivityUserInitiated; break; case NSQualityOfServiceUtility: _opts = NSActivityUserInitiated | NSActivityIdleDisplaySleepDisabled; break; case NSQualityOfServiceBackground: _opts = NSActivityBackground; break; case NSQualityOfServiceDefault: _opts = NSActivityLatencyCritical; break; } _token = [pinfo beginActivityWithOptions: _opts reason: _reason]; _timer = [NSTimer scheduledTimerWithTimeInterval: _interval target: self selector: @selector(_performActivity) userInfo: nil repeats: _repeats]; } - (void) invalidate { NSProcessInfo *pinfo = [NSProcessInfo processInfo]; [_timer invalidate]; [pinfo endActivity: _token]; } @end gnustep-base-1.29.0/Source/NSBundle.m000066400000000000000000002712611435650067400173130ustar00rootroot00000000000000/** Implementation of NSBundle class Copyright (C) 1993-2002 Free Software Foundation, Inc. Written by: Adam Fedor Date: May 1993 Author: Mirko Viviani Date: October 2000 Added frameworks support Author: Nicola Pero This file is part of the GNUstep Base Library. 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 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 USA. NSBundle class reference $Date$ $Revision$ */ #define EXPOSE_NSBundle_IVARS 1 #import "common.h" #include "objc-load.h" #import "Foundation/NSBundle.h" #import "Foundation/NSException.h" #import "Foundation/NSArray.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSNull.h" #import "Foundation/NSProcessInfo.h" #import "Foundation/NSUserDefaults.h" #import "Foundation/NSNotification.h" #import "Foundation/NSLock.h" #import "Foundation/NSMapTable.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSFileManager.h" #import "Foundation/NSPathUtilities.h" #import "Foundation/NSData.h" #import "Foundation/NSURL.h" #import "Foundation/NSValue.h" #import "Foundation/NSSet.h" #import "GNUstepBase/NSString+GNUstepBase.h" #import "GNUstepBase/NSTask+GNUstepBase.h" #import "GSPrivate.h" static NSFileManager * manager() { static NSFileManager *mgr = nil; if (mgr == nil) { mgr = RETAIN([NSFileManager defaultManager]); [[NSObject leakAt: &mgr] release]; } return mgr; } static NSDictionary *langAliases = nil; static NSDictionary *langCanonical = nil; /* Map a language name to any alternative versions. This function should * return an array of alternative language/localisation directory names in * the preferred order of precedence (ie resources in the directories named * earlier in the array are to be preferred to those in directories named * later). * We should support regional language specifications (such as en-GB) * as our first priority, and then fall back to the more general names. * NB. Also handle the form like en-GB_US (English language, British dialect, * in the United States region). */ static NSArray * altLang(NSString *full) { NSMutableArray *a = nil; if (nil != full) { NSString *alias = nil; NSString *canon = nil; NSString *lang = nil; NSString *dialect = nil; NSString *region = nil; NSRange r; alias = [langAliases objectForKey: full]; if (nil == alias) { canon = [langCanonical objectForKey: full]; if (nil != canon) { alias = [langAliases objectForKey: canon]; } if (nil == alias) { alias = full; } } canon = [langCanonical objectForKey: alias]; if (nil == canon) { canon = [langCanonical objectForKey: full]; if (nil == canon) { canon = full; } } if ((r = [canon rangeOfString: @"-"]).length > 1) { dialect = [canon substringFromIndex: NSMaxRange(r)]; lang = [canon substringToIndex: r.location]; if ((r = [dialect rangeOfString: @"_"]).length > 1) { region = [dialect substringFromIndex: NSMaxRange(r)]; dialect = [dialect substringToIndex: r.location]; } } else if ((r = [canon rangeOfString: @"_"]).length > 1) { region = [canon substringFromIndex: NSMaxRange(r)]; lang = [canon substringToIndex: r.location]; } else { lang = canon; } a = [NSMutableArray arrayWithCapacity: 5]; if (nil != dialect && nil != region) { [a addObject: [NSString stringWithFormat: @"%@-%@_%@", lang, dialect, region]]; } if (nil != dialect) { [a addObject: [NSString stringWithFormat: @"%@-%@", lang, dialect]]; } if (nil != region) { [a addObject: [NSString stringWithFormat: @"%@_%@", lang, region]]; } [a addObject: lang]; if (NO == [a containsObject: alias]) { [a addObject: alias]; } } return a; } static NSLock *pathCacheLock = nil; static NSMutableDictionary *pathCache = nil; @interface NSObject (PrivateFrameworks) + (NSString*) frameworkVersion; + (NSString**) frameworkClasses; @end typedef enum { NSBUNDLE_BUNDLE = 1, NSBUNDLE_APPLICATION, NSBUNDLE_FRAMEWORK, NSBUNDLE_LIBRARY } bundle_t; /* Class variables - We keep track of all the bundles */ static NSBundle *_mainBundle = nil; static NSMapTable *_bundles = NULL; static NSMapTable *_byClass = NULL; static NSMapTable *_byIdentifier = NULL; /* Store the working directory at startup */ static NSString *_launchDirectory = nil; static NSString *_base_version = OBJC_STRINGIFY(GNUSTEP_BASE_MAJOR_VERSION.GNUSTEP_BASE_MINOR_VERSION); /* * An empty strings file table for use when localization files can't be found. */ static NSDictionary *_emptyTable = nil; /* When we are linking in an object file, GSPrivateLoadModule calls our callback routine for every Class and Category loaded. The following variable stores the bundle that is currently doing the loading so we know where to store the class names. */ static NSBundle *_loadingBundle = nil; static NSBundle *_gnustep_bundle = nil; static NSRecursiveLock *load_lock = nil; static BOOL _strip_after_loading = NO; /* List of framework linked in the _loadingBundle */ static NSMutableArray *_loadingFrameworks = nil; static NSString *_currentFrameworkName = nil; static NSString *gnustep_target_dir = #ifdef GNUSTEP_TARGET_DIR @GNUSTEP_TARGET_DIR; #else nil; #endif static NSString *gnustep_target_cpu = #ifdef GNUSTEP_TARGET_CPU @GNUSTEP_TARGET_CPU; #else nil; #endif static NSString *gnustep_target_os = #ifdef GNUSTEP_TARGET_OS @GNUSTEP_TARGET_OS; #else nil; #endif static NSString *library_combo = #ifdef LIBRARY_COMBO @LIBRARY_COMBO; #else nil; #endif #ifdef __ANDROID__ static jobject _jassetManager = NULL; static AAssetManager *_assetManager = NULL; #endif /* * Try to find the absolute path of an executable. * Search all the directoried in the PATH. * The atLaunch flag determines whether '.' is considered to be * the current working directory or the working directory at the * time when the program was launched (technically the directory * at the point when NSBundle was first used ... so programs must * use NSBundle *before* changing their working directories). */ static NSString* AbsolutePathOfExecutable(NSString *path, BOOL atLaunch) { if (NO == [path isAbsolutePath]) { NSFileManager *mgr = manager(); NSDictionary *env; NSString *pathlist; NSString *prefix; id patharr; NSString *result = nil; env = [[NSProcessInfo processInfo] environment]; pathlist = [env objectForKey: @"PATH"]; /* Windows 2000 and perhaps others have "Path" not "PATH" */ if (pathlist == nil) { pathlist = [env objectForKey: @"Path"]; } #if defined(_WIN32) patharr = [pathlist componentsSeparatedByString: @";"]; #else patharr = [pathlist componentsSeparatedByString: @":"]; #endif /* Add . if not already in path */ if ([patharr indexOfObject: @"."] == NSNotFound) { patharr = AUTORELEASE([patharr mutableCopy]); [patharr addObject: @"."]; } patharr = [patharr objectEnumerator]; while (nil != (prefix = [patharr nextObject])) { if ([prefix isEqual: @"."]) { if (atLaunch == YES) { prefix = _launchDirectory; } else { prefix = [mgr currentDirectoryPath]; } } prefix = [prefix stringByAppendingPathComponent: path]; if ([mgr isExecutableFileAtPath: prefix]) { result = [prefix stringByStandardizingPath]; break; } #if defined(_WIN32) else { NSString *extension = [path pathExtension]; /* Also try adding any executable extensions on windows */ if ([extension length] == 0) { static NSSet *executable = nil; NSString *wpath; NSEnumerator *e; NSString *s; if (nil == executable) { executable = [[NSTask executableExtensions] copy]; } e = [executable objectEnumerator]; while (nil != (s = [e nextObject])) { wpath = [prefix stringByAppendingPathExtension: s]; if ([mgr isExecutableFileAtPath: wpath]) { result = [wpath stringByStandardizingPath]; break; } } } } #endif } path = result; } path = [path stringByResolvingSymlinksInPath]; path = [path stringByStandardizingPath]; return path; } /* * Return the path to this executable. */ NSString * GSPrivateExecutablePath() { static NSString *executablePath = nil; static BOOL beenHere = NO; if (beenHere == NO) { [load_lock lock]; if (beenHere == NO) { #if defined(PROCFS_EXE_LINK) executablePath = [manager() pathContentOfSymbolicLinkAtPath: [NSString stringWithUTF8String: PROCFS_EXE_LINK]]; /* On some systems, the link is of the form "[device]:inode", which can be used to open the executable, but is useless if you want the path to it. Thus we check that the path is an actual absolute path. (Using '/' here is safe; it isn't the path separator everywhere, but it is on all systems that have PROCFS_EXE_LINK.) */ if ([executablePath length] > 0 && [executablePath characterAtIndex: 0] != '/') { executablePath = nil; } #endif if (executablePath == nil || [executablePath length] == 0) { executablePath = [[[NSProcessInfo processInfo] arguments] objectAtIndex: 0]; } if (NO == [executablePath isAbsolutePath]) { executablePath = AbsolutePathOfExecutable(executablePath, YES); } else { executablePath = [executablePath stringByResolvingSymlinksInPath]; executablePath = [executablePath stringByStandardizingPath]; } IF_NO_ARC([executablePath retain];) beenHere = YES; } [load_lock unlock]; NSCAssert(executablePath != nil, NSInternalInconsistencyException); } return executablePath; } static NSArray * bundle_directory_readable(NSString *path) { id found; [pathCacheLock lock]; found = [[[pathCache objectForKey: path] retain] autorelease]; [pathCacheLock unlock]; if (nil == found) { NSFileManager *mgr = manager(); found = [mgr directoryContentsAtPath: path]; if (nil == found) { found = [NSNull null]; } [pathCacheLock lock]; [pathCache setObject: found forKey: path]; [pathCacheLock unlock]; } if ((id)[NSNull null] == found) { found = nil; } return (NSArray*)found; } /* Get the object file that should be located in the bundle of the same name */ static NSString * bundle_object_name(NSString *path, NSString* executable) { NSFileManager *mgr = manager(); NSString *name, *path0, *path1, *path2; if (executable) { NSString *exepath; name = [executable lastPathComponent]; exepath = [executable stringByDeletingLastPathComponent]; if ([exepath isEqualToString: @""] == NO) { if ([exepath isAbsolutePath] == YES) path = exepath; else path = [path stringByAppendingPathComponent: exepath]; } } else { name = [[path lastPathComponent] stringByDeletingPathExtension]; path = [path stringByDeletingLastPathComponent]; } path0 = [path stringByAppendingPathComponent: name]; path = [path stringByAppendingPathComponent: gnustep_target_dir]; path1 = [path stringByAppendingPathComponent: name]; path = [path stringByAppendingPathComponent: library_combo]; path2 = [path stringByAppendingPathComponent: name]; if ([mgr isReadableFileAtPath: path2] == YES) return path2; else if ([mgr isReadableFileAtPath: path1] == YES) return path1; else if ([mgr isReadableFileAtPath: path0] == YES) return path0; #if defined(_WIN32) /* If we couldn't find the binary, and we are on windows, and the name * has no path extension, then let's try looking for a dll. */ if ([name pathExtension] == nil) { if ([mgr isReadableFileAtPath: [path2 stringByAppendingPathExtension: @"dll"]] == YES) return [path2 stringByAppendingPathExtension: @"dll"]; else if ([mgr isReadableFileAtPath: [path1 stringByAppendingPathExtension: @"dll"]] == YES) return [path1 stringByAppendingPathExtension: @"dll"]; else if ([mgr isReadableFileAtPath: [path0 stringByAppendingPathExtension: @"dll"]] == YES) return [path0 stringByAppendingPathExtension: @"dll"]; } #endif return path0; } /* Construct a path from components */ static void addBundlePath(NSMutableArray *list, NSArray *contents, NSString *path, NSString *subdir, NSString *lang) { if (nil == contents) { return; } if (nil != subdir) { NSEnumerator *e = [[subdir pathComponents] objectEnumerator]; NSString *subdirComponent; while ((subdirComponent = [e nextObject]) != nil) { if (NO == [contents containsObject: subdirComponent]) { return; } path = [path stringByAppendingPathComponent: subdirComponent]; if (nil == (contents = bundle_directory_readable(path))) { return; } } } if (nil == lang) { [list addObject: path]; } else { NSEnumerator *enumerator = [altLang(lang) objectEnumerator]; NSString *alt; /* Add each language specific subdirectory in order. */ while (nil != (alt = [enumerator nextObject])) { alt = [alt stringByAppendingPathExtension: @"lproj"]; if (YES == [contents containsObject: alt]) { alt = [path stringByAppendingPathComponent: alt]; if (nil != (contents = bundle_directory_readable(alt))) { [list addObject: alt]; } } } } } /* Try to locate name framework in standard places which are like /Library/Frameworks/(name).framework */ static inline NSString * _find_framework(NSString *name) { NSArray *paths; NSFileManager *file_mgr = manager(); NSString *file_name; NSString *file_path; NSString *path; NSEnumerator *enumerator; NSCParameterAssert(name != nil); file_name = [name stringByAppendingPathExtension: @"framework"]; paths = NSSearchPathForDirectoriesInDomains(GSFrameworksDirectory, NSAllDomainsMask,YES); enumerator = [paths objectEnumerator]; while ((path = [enumerator nextObject])) { file_path = [path stringByAppendingPathComponent: file_name]; if ([file_mgr fileExistsAtPath: file_path] == YES) { return file_path; // Found it! } } return nil; } /* Try to locate resources for tool name (which is this tool) in * standard places like xxx/Library/Tools/Resources/name */ /* This could be converted into a public +bundleForTool: * method. At the moment it's only used privately * to locate the main bundle for this tool. */ static inline NSString * _find_main_bundle_for_tool(NSString *toolName) { NSArray *paths; NSEnumerator *enumerator; NSString *path; NSString *tail; NSFileManager *fm = manager(); /* * Eliminate any base path or extensions. */ toolName = [toolName lastPathComponent]; do { toolName = [toolName stringByDeletingPathExtension]; } while ([[toolName pathExtension] length] > 0); if ([toolName length] == 0) { return nil; } tail = [@"Tools" stringByAppendingPathComponent: [@"Resources" stringByAppendingPathComponent: toolName]]; paths = NSSearchPathForDirectoriesInDomains (NSLibraryDirectory, NSAllDomainsMask, YES); enumerator = [paths objectEnumerator]; while ((path = [enumerator nextObject])) { BOOL isDir; path = [path stringByAppendingPathComponent: tail]; if ([fm fileExistsAtPath: path isDirectory: &isDir] && isDir) { return path; } } return nil; } @implementation NSBundle (Private) + (NSString *) _absolutePathOfExecutable: (NSString *)path { return AbsolutePathOfExecutable(path, NO); } /* Nicola & Mirko: Frameworks can be used in an application in two different ways: () the framework is dynamically/manually loaded, as if it were a bundle. This is the easier case, because we already have the bundle setup with the correct path (it's the programmer's responsibility to find the framework bundle on disk); we get all information from the bundle dictionary, such as the version; we also create the class list when loading the bundle, as for any other bundle. () the framework was linked into the application. This is much more difficult, because without using tricks, we have no way of knowing where the framework bundle (needed eg for resources) is on disk, and we have no way of knowing what the class list is, or the version. So the trick we use in this case to work around those problems is that gnustep-make generates a 'NSFramework_xxx' class and compiles it into each framework. By asking to the class, we can get the version information and the list of classes which were compiled into the framework. To get the location of the framework on disk, we try using advanced dynamic linker features to get the shared object file on disk from which the NSFramework_xxx class was loaded. If that doesn't work, because the dynamic linker can't provide this information on this platform (or maybe because the framework was statically linked into the application), we have a fallback trick :-) We look for the framework in the standard locations and in the main bundle. This might fail if the framework is not in a standard location or there is more than one installed framework of the same name (and different versions?). So at startup, we scan all classes which were compiled into the application. For each NSFramework_ class, we call the following function, which records the name of the framework, the version, the classes belonging to it, and tries to determine the path on disk to the framework bundle. Bundles (and frameworks if dynamically loaded as bundles) could depend on other frameworks (linked togheter on platform that supports this behaviour) so whenever we dynamically load a bundle, we need to spot out any additional NSFramework_* classes which are loaded, and call this method (exactly as for frameworks linked into the main application) to record them, and try finding the path on disk to those framework bundles. */ + (NSBundle*) _addFrameworkFromClass: (Class)frameworkClass { NSBundle *bundle = nil; NSString **fmClasses; NSString *bundlePath = nil; unsigned int len; const char *frameworkClassName; if (frameworkClass == Nil) { return nil; } frameworkClassName = class_getName(frameworkClass); len = strlen (frameworkClassName); if (len > 12 * sizeof(char) && !strncmp ("NSFramework_", frameworkClassName, 12)) { /* The name of the framework. */ NSString *name; /* If the bundle for this framework class is already loaded, * simply return it. The lookup will return an NSNull object * if the framework class has no known bundle. */ bundle = (id)NSMapGet(_byClass, frameworkClass); if (nil != bundle) { if ((id)bundle == (id)[NSNull null]) { bundle = nil; } return bundle; } name = [NSString stringWithUTF8String: &frameworkClassName[12]]; /* Important - gnustep-make mangles framework names to encode * them as ObjC class names. Here we need to demangle them. We * apply the reverse transformations in the reverse order. */ name = [name stringByReplacingString: @"_1" withString: @"+"]; name = [name stringByReplacingString: @"_0" withString: @"-"]; name = [name stringByReplacingString: @"__" withString: @"_"]; /* Try getting the path to the framework using the dynamic * linker. When it works it's really cool :-) This is the only * really universal way of getting the framework path ... we can * locate the framework no matter where it is on disk! */ bundlePath = GSPrivateSymbolPath(frameworkClass); if ([bundlePath isEqualToString: GSPrivateExecutablePath()]) { /* Oops ... the NSFramework_xxx class is linked in the main * executable. Maybe the framework was statically linked * into the application ... resort to searching the * framework bundle on the filesystem manually. */ bundlePath = nil; } if (bundlePath != nil) { NSString *pathComponent; /* bundlePath should really be an absolute path; we * recommend you use only absolute paths in LD_LIBRARY_PATH. * * If it isn't, we try to survive the situation; we assume * it's relative to the launch directory. That's how the * dynamic linker would have found it after all. This is * fragile though, so please use absolute paths. */ if ([bundlePath isAbsolutePath] == NO) { bundlePath = [_launchDirectory stringByAppendingPathComponent: bundlePath]; } /* Dereference symlinks, and standardize path. This will * only work properly if the original bundlePath is * absolute. */ bundlePath = [bundlePath stringByStandardizingPath]; /* We now have the location of the shared library object * file inside the framework directory. We need to walk up * the directory tree up to the top of the framework. To do * so, we need to chop off the extra subdirectories, the * library combo and the target cpu/os if they exist. The * framework and this library should match so we can use the * compiled-in settings. */ /* library name */ bundlePath = [bundlePath stringByDeletingLastPathComponent]; /* library combo */ pathComponent = [bundlePath lastPathComponent]; if ([pathComponent isEqual: library_combo]) { bundlePath = [bundlePath stringByDeletingLastPathComponent]; } /* target directory */ pathComponent = [bundlePath lastPathComponent]; if ([pathComponent isEqual: gnustep_target_dir]) { bundlePath = [bundlePath stringByDeletingLastPathComponent]; } #if defined(_WIN32) /* On windows, the library (dll) is in the Tools area rather than * in the framework, so we can adjust the path here. */ if ([[bundlePath lastPathComponent] isEqual: @"Tools"]) { bundlePath = [bundlePath stringByDeletingLastPathComponent]; bundlePath = [bundlePath stringByAppendingPathComponent: @"Library"]; bundlePath = [bundlePath stringByAppendingPathComponent: @"Frameworks"]; bundlePath = [bundlePath stringByAppendingPathComponent: [NSString stringWithFormat: @"%@%@", name, @".framework"]]; } #else /* There are no Versions on MinGW. So the version check is only * done on non-MinGW. */ /* version name */ bundlePath = [bundlePath stringByDeletingLastPathComponent]; pathComponent = [bundlePath lastPathComponent]; if ([pathComponent isEqual: @"Versions"]) { bundlePath = [bundlePath stringByDeletingLastPathComponent]; #endif pathComponent = [bundlePath lastPathComponent]; if ([pathComponent isEqualToString: [NSString stringWithFormat: @"%@%@", name, @".framework"]]) { /* Try creating the bundle. */ if (bundlePath) bundle = [[self alloc] initWithPath: bundlePath]; } #if !defined(_WIN32) } #endif /* Failed - buu - try the fallback trick. */ if (bundle == nil) { bundlePath = nil; } } if (bundlePath == nil) { /* NICOLA: In an ideal world, the following is just a hack * for when GSPrivateSymbolPath() fails! But in real life * GSPrivateSymbolPath() is risky (some platforms don't * have it at all!), so this hack might be used a lot! It * must be quite robust. We try to look for the framework * in the standard GNUstep installation dirs and in the main * bundle. This should be reasonably safe if the user is * not being too clever ... :-) */ bundlePath = _find_framework(name); if (bundlePath == nil) { bundlePath = [[NSBundle mainBundle] pathForResource: name ofType: @"framework" inDirectory: @"Frameworks"]; } /* Try creating the bundle. */ if (bundlePath != nil) { bundle = [[self alloc] initWithPath: bundlePath]; } } [load_lock lock]; if (bundle == nil) { NSMapInsert(_byClass, frameworkClass, [NSNull null]); [load_lock unlock]; NSWarnMLog (@"Could not find framework %@ in any standard location", name); return nil; } else { bundle->_principalClass = frameworkClass; NSMapInsert(_byClass, frameworkClass, bundle); [load_lock unlock]; } bundle->_bundleType = NSBUNDLE_FRAMEWORK; bundle->_codeLoaded = YES; /* frameworkVersion is something like 'A'. */ bundle->_frameworkVersion = RETAIN([frameworkClass frameworkVersion]); bundle->_bundleClasses = RETAIN([NSMutableArray arrayWithCapacity: 2]); /* A NULL terminated list of class names - the classes contained in the framework. */ fmClasses = [frameworkClass frameworkClasses]; while (*fmClasses != NULL) { NSValue *value; Class class = NSClassFromString(*fmClasses); NSMapInsert(_byClass, class, bundle); value = [NSValue valueWithPointer: (void*)class]; [bundle->_bundleClasses addObject: value]; fmClasses++; } /* If _loadingBundle is not nil, it means we reached this point * while loading a bundle. This can happen if the framework is * linked into the bundle (then, the dynamic linker * automatically drags in the framework when the bundle is * loaded). But then, the classes in the framework should be * removed from the list of classes in the bundle. Check that * _loadingBundle != bundle which happens on Windows machines when * loading in Frameworks. */ if (_loadingBundle != nil && _loadingBundle != bundle) { int i, j; id b = bundle->_bundleClasses; id l = _loadingBundle->_bundleClasses; /* The following essentially does: * * [_loadingBundle->_bundleClasses * removeObjectsInArray: bundle->_bundleClasses]; * * The problem with that code is isEqual: gets * sent to the classes, which will cause them to be * initialized (which should not happen.) */ for (i = 0; i < [b count]; i++) { for (j = 0; j < [l count]; j++) { if ([[l objectAtIndex: j] pointerValue] == [[b objectAtIndex: i] pointerValue]) { [l removeObjectAtIndex: j]; } } } } } return bundle; } + (NSMutableArray*) _addFrameworks { int i; int numClasses = 0; int newNumClasses; Class *classes = NULL; NSMutableArray *added = nil; newNumClasses = objc_getClassList(NULL, 0); while (numClasses < newNumClasses) { numClasses = newNumClasses; classes = realloc(classes, sizeof(Class) * numClasses); newNumClasses = objc_getClassList(classes, numClasses); } for (i = 0; i < numClasses; i++) { NSBundle *bundle = [self _addFrameworkFromClass: classes[i]]; if (nil != bundle) { if (nil == added) { added = [NSMutableArray arrayWithCapacity: 100]; } [added addObject: bundle]; } } free(classes); return added; } + (NSString*) _gnustep_target_cpu { return gnustep_target_cpu; } + (NSString*) _gnustep_target_dir { return gnustep_target_dir; } + (NSString*) _gnustep_target_os { return gnustep_target_os; } + (NSString*) _library_combo { return library_combo; } @end /* Mirko: The gnu-runtime calls the +load method of each class before the _bundle_load_callback() is called and we can't provide the list of classes ready for this method. */ static void _bundle_load_callback(Class theClass, struct objc_category *theCategory) { const char *className; NSCAssert(_loadingBundle, NSInternalInconsistencyException); NSCAssert(_loadingFrameworks, NSInternalInconsistencyException); /* We never record categories - if this is a category, just do nothing. */ if (theCategory != 0) { return; } className = class_getName(theClass); /* Don't store the internal NSFramework_xxx class into the list of bundle classes, but store the linked frameworks in _loadingFrameworks */ if (strlen (className) > 12 && !strncmp ("NSFramework_", className, 12)) { if (_currentFrameworkName) { const char *frameworkName; frameworkName = [_currentFrameworkName cString]; if (!strcmp(className, frameworkName)) return; } [_loadingFrameworks addObject: [NSValue valueWithPointer: (void*)theClass]]; return; } /* Store classes (but don't store categories) */ [(_loadingBundle)->_bundleClasses addObject: [NSValue valueWithPointer: (void*)theClass]]; } @implementation NSBundle + (void) atExit { if ([NSObject shouldCleanUp]) { DESTROY(_emptyTable); DESTROY(langAliases); DESTROY(langCanonical); DESTROY(_bundles); DESTROY(_byClass); DESTROY(_byIdentifier); DESTROY(pathCache); DESTROY(pathCacheLock); DESTROY(load_lock); DESTROY(gnustep_target_cpu); DESTROY(gnustep_target_os); DESTROY(gnustep_target_dir); DESTROY(library_combo); DESTROY(_launchDirectory); DESTROY(_gnustep_bundle); DESTROY(_mainBundle); } } + (void) initialize { if (self == [NSBundle class]) { NSAutoreleasePool *pool = [NSAutoreleasePool new]; NSString *file; const char *mode; NSDictionary *env; NSString *str; /* Ensure we do 'right' path handling while initializing core paths. */ mode = GSPathHandling("right"); _emptyTable = [NSDictionary new]; /* Create basic mapping dictionaries for bootstrapping and * for use if the full dictionaries can't be loaded from the * gnustep-base library resource bundle. */ langAliases = [[NSDictionary alloc] initWithObjectsAndKeys: @"Dutch", @"nl", @"English", @"en", @"Esperanto", @"eo", @"French", @"fr", @"German", @"de", @"Hungarian", @"hu", @"Italian", @"it", @"Korean", @"ko", @"Russian", @"ru", @"Slovak", @"sk", @"Spanish", @"es", @"TraditionalChinese", @"zh", @"Ukrainian", @"uk", nil]; langCanonical = [[NSDictionary alloc] initWithObjectsAndKeys: @"de", @"German", @"de", @"ger", @"de", @"deu", @"en", @"English", @"en", @"eng", @"ep", @"Esperanto", @"ep", @"epo", @"ep", @"epo", @"fr", @"French", @"fr", @"fra", @"fr", @"fre", @"hu", @"Hungarian", @"hu", @"hun", @"it", @"Italian", @"it", @"ita", @"ko", @"Korean", @"ko", @"kir", @"nl", @"Dutch", @"nl", @"dut", @"nl", @"nld", @"ru", @"Russian", @"ru", @"rus", @"sk", @"Slovak", @"sk", @"slo", @"sk", @"slk", @"sp", @"Spanish", @"sp", @"spa", @"uk", @"Ukrainian", @"uk", @"ukr", @"zh", @"TraditionalChinese", @"zh", @"chi", @"zh", @"zho", nil]; /* Initialise manager here so it's thread-safe. */ manager(); /* Set up tables for bundle lookups */ _bundles = NSCreateMapTable(NSObjectMapKeyCallBacks, NSNonOwnedPointerMapValueCallBacks, 0); _byClass = NSCreateMapTable(NSNonOwnedPointerMapKeyCallBacks, NSNonOwnedPointerMapValueCallBacks, 0); _byIdentifier = NSCreateMapTable(NSObjectMapKeyCallBacks, NSNonOwnedPointerMapValueCallBacks, 0); pathCacheLock = [NSLock new]; [pathCacheLock setName: @"pathCacheLock"]; pathCache = [NSMutableDictionary new]; /* Need to make this recursive since both mainBundle and * initWithPath: want to lock the thread. */ load_lock = [NSRecursiveLock new]; [load_lock setName: @"load_lock"]; env = [[NSProcessInfo processInfo] environment]; /* These variables are used when we are running non-flattened. * This means that there are multiple binaries for different * OSes, and we need constantly to choose the right one (eg, * when loading a bundle or a framework). The choice is based * on these environments variables that are set by GNUstep.sh * (you must source GNUstep.sh when non-flattened). */ if ((str = [env objectForKey: @"GNUSTEP_TARGET_CPU"]) != nil) gnustep_target_cpu = RETAIN(str); else if ((str = [env objectForKey: @"GNUSTEP_HOST_CPU"]) != nil) gnustep_target_cpu = RETAIN(str); if ((str = [env objectForKey: @"GNUSTEP_TARGET_OS"]) != nil) gnustep_target_os = RETAIN(str); else if ((str = [env objectForKey: @"GNUSTEP_HOST_OS"]) != nil) gnustep_target_os = RETAIN(str); if ((str = [env objectForKey: @"GNUSTEP_TARGET_DIR"]) != nil) gnustep_target_dir = RETAIN(str); else if ((str = [env objectForKey: @"GNUSTEP_HOST_DIR"]) != nil) gnustep_target_dir = RETAIN(str); else if (gnustep_target_cpu != nil && gnustep_target_os != nil) gnustep_target_dir = [[NSString alloc] initWithFormat: @"%@-%@", gnustep_target_cpu, gnustep_target_os]; if ((str = [env objectForKey: @"LIBRARY_COMBO"]) != nil) library_combo = RETAIN(str); _launchDirectory = RETAIN([manager() currentDirectoryPath]); _gnustep_bundle = RETAIN([self bundleForLibrary: @"gnustep-base" version: _base_version]); /* The Locale aliases map converts canonical names to old-style names */ file = [_gnustep_bundle pathForResource: @"Locale" ofType: @"aliases" inDirectory: @"Languages"]; if (file != nil) { NSDictionary *d; d = [[NSDictionary alloc] initWithContentsOfFile: file]; if ([d count] > 0) { ASSIGN(langAliases, d); } [d release]; } /* The Locale canonical map converts old-style names to ISO 639 names * and converts ISO 639-2 names to the preferred ISO 639-1 names where * an ISO 639-1 name exists. */ file = [_gnustep_bundle pathForResource: @"Locale" ofType: @"canonical" inDirectory: @"Languages"]; if (file != nil) { NSDictionary *d; d = [[NSDictionary alloc] initWithContentsOfFile: file]; if ([d count] > 0) { ASSIGN(langCanonical, d); } [d release]; } #if 0 _loadingBundle = [self mainBundle]; handle = objc_open_main_module(stderr); printf("%08x\n", handle); #endif [self _addFrameworks]; #if 0 // _bundle_load_callback(class, NULL); // bundle = (NSBundle *)NSMapGet(_bundles, bundlePath); objc_close_main_module(handle); _loadingBundle = nil; #endif GSPathHandling(mode); [pool release]; [self registerAtExit]; } } /** * Returns an array of all the bundles which do not belong to frameworks.
* This always contains the main bundle. */ + (NSArray *) allBundles { NSMutableArray *array = [NSMutableArray arrayWithCapacity: 2]; NSMapEnumerator enumerate; void *key; NSBundle *bundle; [load_lock lock]; if (!_mainBundle) { [self mainBundle]; } enumerate = NSEnumerateMapTable(_bundles); while (NSNextMapEnumeratorPair(&enumerate, &key, (void **)&bundle)) { if (bundle->_bundleType == NSBUNDLE_FRAMEWORK) { continue; } if ([array indexOfObjectIdenticalTo: bundle] == NSNotFound) { [array addObject: bundle]; } } NSEndMapTableEnumeration(&enumerate); [load_lock unlock]; return array; } /** * Returns an array containing all the known bundles representing frameworks. */ + (NSArray *) allFrameworks { NSMapEnumerator enumerate; NSMutableArray *array = [NSMutableArray arrayWithCapacity: 2]; void *key; NSBundle *bundle; [load_lock lock]; enumerate = NSEnumerateMapTable(_bundles); while (NSNextMapEnumeratorPair(&enumerate, &key, (void **)&bundle)) { if (bundle->_bundleType == NSBUNDLE_FRAMEWORK && [array indexOfObjectIdenticalTo: bundle] == NSNotFound) { [array addObject: bundle]; } } NSEndMapTableEnumeration(&enumerate); [load_lock unlock]; return array; } /** * For an application, returns the main bundle of the application.
* For a tool, returns the main bundle associated with the tool.
*
* For an application, the structure is as follows - *

* The executable is Gomoku.app/ix86/linux-gnu/gnu-gnu-gnu/Gomoku * and the main bundle directory is Gomoku.app/. *

* For a tool, the structure is as follows - *

* The executable is xxx/Tools/ix86/linux-gnu/gnu-gnu-gnu/Control * and the main bundle directory is xxx/Tools/Resources/Control. *

*

(when the tool has not yet been installed, it's similar - * xxx/obj/ix86/linux-gnu/gnu-gnu-gnu/Control * and the main bundle directory is xxx/Resources/Control). *

*

(For a flattened structure, the structure is the same without the * ix86/linux-gnu/gnu-gnu-gnu directories). *

*/ + (NSBundle *) mainBundle { [load_lock lock]; if (!_mainBundle) { /* We figure out the main bundle directory by examining the location of the executable on disk. */ NSString *path, *s; /* We don't know at the beginning if it's a tool or an application. */ BOOL isApplication = YES; /* Sometimes we detect that this is a non-installed tool. That is * special because we want to lookup local resources before installed * ones. Keep track of this special case in this variable. */ BOOL isNonInstalledTool = NO; /* If it's a tool, we will need the tool name. Since we don't know yet if it's a tool or an application, we always store the executable name here - just in case it turns out it's a tool. */ NSString *toolName = [GSPrivateExecutablePath() lastPathComponent]; #if defined(_WIN32) || defined(__CYGWIN__) toolName = [toolName stringByDeletingPathExtension]; #endif /* Strip off the name of the program */ path = [GSPrivateExecutablePath() stringByDeletingLastPathComponent]; /* We now need to chop off the extra subdirectories, the library combo and the target directory if they exist. The executable and this library should match so that is why we can use the compiled-in settings. */ /* library combo */ s = [path lastPathComponent]; if ([s isEqual: library_combo]) { path = [path stringByDeletingLastPathComponent]; } /* target dir */ s = [path lastPathComponent]; if ([s isEqual: gnustep_target_dir]) { path = [path stringByDeletingLastPathComponent]; } /* object dir */ s = [path lastPathComponent]; if ([s hasSuffix: @"obj"]) { path = [path stringByDeletingLastPathComponent]; /* if it has an object dir it can only be a non-yet-installed tool. */ isApplication = NO; isNonInstalledTool = YES; } #ifndef __ANDROID__ /* don't check suffix on Android's fake executable path */ if (isApplication == YES) { s = [path lastPathComponent]; if ([s hasSuffix: @".app"] == NO && [s hasSuffix: @".debug"] == NO && [s hasSuffix: @".profile"] == NO && [s hasSuffix: @".gswa"] == NO // GNUstep Web && [s hasSuffix: @".woa"] == NO // GNUstep Web ) { NSFileManager *mgr = manager(); BOOL f; /* Not one of the common extensions, but * might be an app wrapper with another extension... * Look for Info-gnustep.plist or Info.plist in a * Resources subdirectory. */ s = [path stringByAppendingPathComponent: @"Resources"]; if ([mgr fileExistsAtPath: s isDirectory: &f] == NO || f == NO) { isApplication = NO; } else { NSString *i; i = [s stringByAppendingPathComponent: @"Info-gnustep.plist"]; if ([mgr isReadableFileAtPath: i] == NO) { i = [s stringByAppendingPathComponent: @"Info.plist"]; if ([mgr isReadableFileAtPath: i] == NO) { isApplication = NO; } } } } } #endif /* !__ANDROID__ */ if (isApplication == NO) { NSString *maybePath = nil; if (isNonInstalledTool) { /* We're pretty confident about this case. 'path' is * obtained by {tool location on disk} and walking up * until we got out of the obj directory. So we're * now in GNUSTEP_BUILD_DIR. Resources will be in * Resources/{toolName}. */ path = [path stringByAppendingPathComponent: @"Resources"]; maybePath = [path stringByAppendingPathComponent: toolName]; /* PS: We could check here if we found the resources, * and if not, keep going with the other attempts at * locating them. But if we know that this is an * uninstalled tool, really we don't want to use * installed resources - we prefer resource lookup to * fail so the developer will fix whatever issue they * have with their building. */ } else { if (maybePath == nil) { /* This is for gnustep-make version 2, where tool resources * are in GNUSTEP_*_LIBRARY/Tools/Resources/{toolName}. */ maybePath = _find_main_bundle_for_tool (toolName); } /* If that didn't work, maybe the tool was created with * gnustep-make version 1. So we try {tool location on * disk after walking up the non-flattened * dirs}/Resources/{toolName}, which is where * gnustep-make version 1 would put resources. */ if (maybePath == nil) { path = [path stringByAppendingPathComponent: @"Resources"]; maybePath = [path stringByAppendingPathComponent: toolName]; } } path = maybePath; } NSDebugMLLog(@"NSBundle", @"Found main in %@\n", path); /* We do alloc and init separately so initWithPath: knows we are the _mainBundle. Please note that we do *not* autorelease mainBundle, because we don't want it to be ever released. */ _mainBundle = [self alloc]; /* Please note that _mainBundle should *not* be nil. */ _mainBundle = [_mainBundle initWithPath: path]; NSAssert(_mainBundle != nil, NSInternalInconsistencyException); } [load_lock unlock]; return _mainBundle; } /** * Returns the bundle whose code contains the specified class.
* NB: We will not find a class if the bundle has not been loaded yet! */ + (NSBundle *) bundleForClass: (Class)aClass { void *key; NSBundle *bundle; NSMapEnumerator enumerate; if (!aClass) return nil; /* This is asked relatively frequently inside gnustep-base itself; * shortcut it. */ if (aClass == [NSObject class]) { if (nil != _gnustep_bundle) { return _gnustep_bundle; } } [load_lock lock]; /* Try lookup ... if not found, make sure that all loaded bundles have * class->bundle map entries set up and check again. */ bundle = (NSBundle *)NSMapGet(_byClass, aClass); if ((id)bundle == (id)[NSNull null]) { [load_lock unlock]; return nil; } if (nil == bundle) { enumerate = NSEnumerateMapTable(_bundles); while (NSNextMapEnumeratorPair(&enumerate, &key, (void **)&bundle)) { NSArray *classes = bundle->_bundleClasses; NSUInteger count = [classes count]; if (count > 0 && 0 == NSMapGet(_byClass, [[classes lastObject] pointerValue])) { while (count-- > 0) { NSMapInsert(_byClass, (void*)[[classes objectAtIndex: count] pointerValue], (void*)bundle); } } } NSEndMapTableEnumeration(&enumerate); bundle = (NSBundle *)NSMapGet(_byClass, aClass); if ((id)bundle == (id)[NSNull null]) { [load_lock unlock]; return nil; } } if (nil == bundle) { /* Is it in the main bundle or a library? */ if (!class_isMetaClass(aClass)) { NSString *lib; /* * Take the path to the binary containing the class and * convert it to the format for a library name as used for * obtaining a library resource bundle. */ lib = GSPrivateSymbolPath(aClass); if ([lib isEqual: GSPrivateExecutablePath()] == YES) { lib = nil; // In program, not library. } /* * Get the library bundle ... if there wasn't one then we * will check to see if it's in a newly loaded framework * and if not, assume the class was in the program executable * and return the mainBundle instead. */ bundle = [NSBundle bundleForLibrary: lib]; if (nil == bundle && [[self _addFrameworks] count] > 0) { bundle = (NSBundle *)NSMapGet(_byClass, aClass); if ((id)bundle == (id)[NSNull null]) { [load_lock unlock]; return nil; } } if (nil == bundle) { bundle = [self mainBundle]; } /* * Add the class to the list of classes known to be in the * library or executable. We didn't find it there to start * with, so we know it's safe to add now. */ if (bundle->_bundleClasses == nil) { bundle->_bundleClasses = [[NSMutableArray alloc] initWithCapacity: 2]; } [bundle->_bundleClasses addObject: [NSValue valueWithPointer: (void*)aClass]]; } } [load_lock unlock]; return bundle; } + (NSBundle*) bundleWithPath: (NSString*)path { return AUTORELEASE([[self alloc] initWithPath: path]); } + (NSBundle*) bundleWithURL: (NSURL*)url { return AUTORELEASE([[self alloc] initWithURL: url]); } + (NSBundle*) bundleWithIdentifier: (NSString*)identifier { NSBundle *bundle = nil; [load_lock lock]; if (_byIdentifier) { bundle = (NSBundle *)NSMapGet(_byIdentifier, identifier); IF_NO_ARC( [bundle retain]; /* retain - look as if we were alloc'ed */ ) } [load_lock unlock]; // Some OS X apps try to get the foundation bundle by looking it up by // identifier. This is expected to be faster than looking it up by class, so // we lazily insert it into the table if it's requested. if (nil == bundle && [@"com.apple.Foundation" isEqualToString: identifier]) { NSBundle *foundation = [self bundleForClass: self]; [load_lock lock]; NSMapInsert(_byIdentifier, @"com.apple.Foundation", foundation); [load_lock unlock]; return foundation; } return AUTORELEASE(bundle); } - (id) initWithPath: (NSString*)path { NSString *identifier; NSBundle *bundle; self = [super init]; if (!path || [path length] == 0) { NSDebugMLog(@"No path specified for bundle"); [self dealloc]; return nil; } /* * Make sure we have an absolute and fully expanded path, * so we can manipulate it without having to worry about * details like that throughout the code. */ /* 1. make path absolute. */ if ([path isAbsolutePath] == NO) { NSWarnMLog(@"NSBundle -initWithPath: requires absolute path names, " @"given '%@'", path); #if defined(_WIN32) if ([path length] > 0 && ([path characterAtIndex: 0]=='/' || [path characterAtIndex: 0]=='\\')) { NSString *root; unsigned length; /* The path has a leading path separator, so we try assuming * that it's a path on the current filesystem, and append it * to the filesystem root. */ root = [manager() currentDirectoryPath]; length = [root length]; root = [root stringByDeletingLastPathComponent]; while ([root length] != length) { length = [root length]; root = [root stringByDeletingLastPathComponent]; } path = [root stringByAppendingPathComponent: path]; } else { /* Try appending to the current working directory. */ path = [[manager() currentDirectoryPath] stringByAppendingPathComponent: path]; } #else path = [[manager() currentDirectoryPath] stringByAppendingPathComponent: path]; #endif } /* 2. Expand any symbolic links. */ path = [path stringByResolvingSymlinksInPath]; /* 3. Standardize so we can be sure that cache lookup is consistent. */ path = [path stringByStandardizingPath]; /* check if we were already initialized for this directory */ [load_lock lock]; bundle = (NSBundle *)NSMapGet(_bundles, path); if (bundle != nil) { IF_NO_ARC([bundle retain];) [load_lock unlock]; [self dealloc]; return bundle; } [load_lock unlock]; if (bundle_directory_readable(path) == nil) { NSDebugMLLog(@"NSBundle", @"Could not access path %@ for bundle", path); // if this is not the main bundle ... deallocate and return. if (self != _mainBundle) { [self dealloc]; return nil; } } /* OK ... this is a new bundle ... need to insert it in the global map * to be found by this path so that a leter call to -bundleIdentifier * can work. */ _path = [path copy]; [load_lock lock]; NSMapInsert(_bundles, _path, self); [load_lock unlock]; if ([[[_path lastPathComponent] pathExtension] isEqual: @"framework"] == YES) { _bundleType = (unsigned int)NSBUNDLE_FRAMEWORK; } else { if (self == _mainBundle) _bundleType = (unsigned int)NSBUNDLE_APPLICATION; else _bundleType = (unsigned int)NSBUNDLE_BUNDLE; } identifier = [self bundleIdentifier]; [load_lock lock]; if (identifier != nil) { NSBundle *bundle = (NSBundle *)NSMapGet(_byIdentifier, identifier); if (bundle != self) { if (bundle != nil) { IF_NO_ARC([bundle retain];) [load_lock unlock]; [self dealloc]; return bundle; } NSMapInsert(_byIdentifier, identifier, self); } } [load_lock unlock]; return self; } - (id) initWithURL: (NSURL*)url { // FIXME return [self initWithPath: [url path]]; } - (void) dealloc { if ([self isLoaded] == YES && self != _mainBundle && self ->_bundleType != NSBUNDLE_LIBRARY) { /* * Prevent unloading of bundles where code has been loaded ... * the objc runtime does not currently support unloading of * dynamically loaded code, so we want to prevent a bundle * being loaded twice. */ IF_NO_ARC([self retain];) return; } if (_path != nil) { NSString *identifier = [self bundleIdentifier]; NSUInteger count; [load_lock lock]; if (_bundles != nil) { NSMapRemove(_bundles, _path); } if (identifier != nil) { NSMapRemove(_byIdentifier, identifier); } if (_principalClass != nil) { NSMapRemove(_byClass, _principalClass); } if (_byClass != nil) { count = [_bundleClasses count]; while (count-- > 0) { NSMapRemove(_byClass, [[_bundleClasses objectAtIndex: count] pointerValue]); } } [load_lock unlock]; /* Clean up path cache for this bundle. */ [self cleanPathCache]; RELEASE(_path); } TEST_RELEASE(_frameworkVersion); TEST_RELEASE(_bundleClasses); TEST_RELEASE(_infoDict); TEST_RELEASE(_localizations); [super dealloc]; } - (NSString*) description { return [[super description] stringByAppendingFormat: @" <%@>%@", [self bundlePath], [self isLoaded] ? @" (loaded)" : @""]; } - (NSString*) bundlePath { return _path; } - (NSURL*) bundleURL { return [NSURL fileURLWithPath: [self bundlePath]]; } - (Class) classNamed: (NSString *)className { int i, j; Class theClass = Nil; if (!_codeLoaded) { if (self != _mainBundle && ![self load]) { NSLog(@"No classes in bundle"); return Nil; } } if (self == _mainBundle || self == _gnustep_bundle) { theClass = NSClassFromString(className); if (theClass && [[self class] bundleForClass: theClass] != self) { theClass = Nil; } } else { BOOL found = NO; theClass = NSClassFromString(className); [load_lock lock]; j = [_bundleClasses count]; for (i = 0; i < j && found == NO; i++) { Class c = (Class)[[_bundleClasses objectAtIndex: i] pointerValue]; if (c == theClass) { found = YES; } } [load_lock unlock]; if (found == NO) { theClass = Nil; } } return theClass; } - (Class) principalClass { NSString *class_name; if (_principalClass) { return _principalClass; } if ([self load] == NO) { return Nil; } class_name = [[self infoDictionary] objectForKey: @"NSPrincipalClass"]; if (class_name) { _principalClass = NSClassFromString(class_name); } else if (self == _gnustep_bundle) { _principalClass = [NSObject class]; } if (_principalClass == nil) { [load_lock lock]; if (_principalClass == nil && [_bundleClasses count] > 0) { _principalClass = (Class)[[_bundleClasses objectAtIndex: 0] pointerValue]; } [load_lock unlock]; } return _principalClass; } /** * Returns YES if the receiver's code is loaded, otherwise, returns NO. */ - (BOOL) isLoaded { return _codeLoaded; } - (BOOL) load { if (self == _mainBundle || self ->_bundleType == NSBUNDLE_LIBRARY) { _codeLoaded = YES; return YES; } [load_lock lock]; if (_codeLoaded == NO) { NSString *object; NSEnumerator *classEnumerator; NSMutableArray *classNames; NSValue *class; NSBundle *savedLoadingBundle; /* Get the binary and set up fraework name if it is a framework. */ object = [self executablePath]; if (object == nil || [object length] == 0) { [load_lock unlock]; return NO; } savedLoadingBundle = _loadingBundle; _loadingBundle = self; _bundleClasses = [[NSMutableArray alloc] initWithCapacity: 2]; if (nil == savedLoadingBundle) { _loadingFrameworks = [[NSMutableArray alloc] initWithCapacity: 2]; } /* This code is executed twice if a class linked in the bundle calls a NSBundle method inside +load (-principalClass). To avoid this we set _codeLoaded before loading the bundle. */ _codeLoaded = YES; if (GSPrivateLoadModule(object, stderr, _bundle_load_callback, 0, 0)) { _codeLoaded = NO; _loadingBundle = savedLoadingBundle; if (nil == _loadingBundle) { DESTROY(_loadingFrameworks); DESTROY(_currentFrameworkName); } [load_lock unlock]; return NO; } /* We now construct the list of bundles from frameworks linked with this one */ classEnumerator = [_loadingFrameworks objectEnumerator]; while ((class = [classEnumerator nextObject]) != nil) { [NSBundle _addFrameworkFromClass: (Class)[class pointerValue]]; } /* After we load code from a bundle, we retain the bundle until we unload it (because we never unload bundles, that is forever). The reason why we retain it is that we need it! We need it to answer calls like bundleForClass:; also, users normally want all loaded bundles to appear when they call +allBundles. */ IF_NO_ARC([self retain];) classNames = [NSMutableArray arrayWithCapacity: [_bundleClasses count]]; classEnumerator = [_bundleClasses objectEnumerator]; while ((class = [classEnumerator nextObject]) != nil) { NSMapInsert(_byClass, class, self); [classNames addObject: NSStringFromClass((Class)[class pointerValue])]; } _loadingBundle = savedLoadingBundle; if (nil == _loadingBundle) { DESTROY(_loadingFrameworks); DESTROY(_currentFrameworkName); } [load_lock unlock]; [[NSNotificationCenter defaultCenter] postNotificationName: NSBundleDidLoadNotification object: self userInfo: [NSDictionary dictionaryWithObject: classNames forKey: NSLoadedClasses]]; return YES; } [load_lock unlock]; return YES; } - (oneway void) release { /* We lock during release so that other threads can't grab the * object between us checking the reference count and deallocating. */ [load_lock lock]; if (NSDecrementExtraRefCountWasZero(self)) { [self dealloc]; } [load_lock unlock]; } /* This method is the backbone of the resource searching for NSBundle. It constructs an array of paths, where each path is a possible location for a resource in the bundle. The current algorithm for searching goes: /Resources/ /Resources// / // */ + (NSArray *) _bundleResourcePathsWithRootPath: (NSString*)rootPath subPath: (NSString*)subPath localization: (NSString*)localization { NSString *primary; NSString *language; NSArray *languages; NSArray *contents; NSMutableArray *array; NSEnumerator *enumerate; array = [NSMutableArray arrayWithCapacity: 8]; languages = [[NSUserDefaults standardUserDefaults] stringArrayForKey: @"NSLanguages"]; primary = [rootPath stringByAppendingPathComponent: @"Resources"]; contents = bundle_directory_readable(primary); addBundlePath(array, contents, primary, subPath, nil); /* If we have been asked for a specific localization, we add it. */ if (localization != nil) { addBundlePath(array, contents, primary, subPath, localization); } else { /* This matches OS X behavior, which only searches languages that * are in the user's preference. Don't use -preferredLocalizations - * that would cause a recursive loop. */ enumerate = [languages objectEnumerator]; while ((language = [enumerate nextObject])) { addBundlePath(array, contents, primary, subPath, language); } } #ifdef __ANDROID__ /* Android: check subdir and localization directly, as AAssetDir and thereby * NSDirectoryEnumerator doesn't list directories */ NSString *originalPrimary = primary; if (subPath) { primary = [originalPrimary stringByAppendingPathComponent: subPath]; contents = bundle_directory_readable(primary); addBundlePath(array, contents, primary, nil, nil); if (localization) { primary = [primary stringByAppendingPathComponent: [localization stringByAppendingPathExtension: @"lproj"]]; contents = bundle_directory_readable(primary); addBundlePath(array, contents, primary, nil, nil); } else { NSString *subPathPrimary = primary; enumerate = [languages objectEnumerator]; while ((language = [enumerate nextObject])) { primary = [subPathPrimary stringByAppendingPathComponent: [language stringByAppendingPathExtension: @"lproj"]]; contents = bundle_directory_readable(primary); addBundlePath(array, contents, primary, nil, nil); } } } if (localization) { primary = [originalPrimary stringByAppendingPathComponent: [localization stringByAppendingPathExtension: @"lproj"]]; contents = bundle_directory_readable(primary); addBundlePath(array, contents, primary, nil, nil); } else { enumerate = [languages objectEnumerator]; while ((language = [enumerate nextObject])) { primary = [originalPrimary stringByAppendingPathComponent: [language stringByAppendingPathExtension: @"lproj"]]; contents = bundle_directory_readable(primary); addBundlePath(array, contents, primary, nil, nil); } } #endif /* __ANDROID__ */ primary = rootPath; contents = bundle_directory_readable(primary); addBundlePath(array, contents, primary, subPath, nil); if (localization != nil) { addBundlePath(array, contents, primary, subPath, localization); } else { enumerate = [languages objectEnumerator]; while ((language = [enumerate nextObject])) { addBundlePath(array, contents, primary, subPath, language); } } return array; } + (NSString *) _pathForResource: (NSString *)name ofType: (NSString *)extension inRootPath: (NSString *)rootPath inDirectory: (NSString *)subPath { NSFileManager *mgr = manager(); NSString *path; NSString *file; NSEnumerator *pathlist; if (name == nil) { name = @""; } if ([extension length] == 0) { file = name; } else { file = [name stringByAppendingPathExtension: extension]; } pathlist = [[self _bundleResourcePathsWithRootPath: rootPath subPath: subPath localization: nil] objectEnumerator]; while ((path = [pathlist nextObject]) != nil) { NSArray *paths = bundle_directory_readable(path); if (YES == [paths containsObject: file]) { path = [path stringByAppendingPathComponent: file]; if (YES == [mgr isReadableFileAtPath: path]) { return path; } } } #ifdef __ANDROID__ /* Android: check for directory resources by passing file path as subpath, * as AAssetDir and thereby NSDirectoryEnumerator doesn't list directories */ subPath = subPath ? [subPath stringByAppendingPathComponent: file] : file; pathlist = [[self _bundleResourcePathsWithRootPath: rootPath subPath: subPath localization: nil] objectEnumerator]; while ((path = [pathlist nextObject]) != nil) { NSString *lastPathComponent = [path lastPathComponent]; if ([lastPathComponent isEqualToString:file] && [mgr isReadableFileAtPath: path]) { return path; } } #endif /* __ANDROID__ */ return nil; } + (NSString *) pathForResource: (NSString *)name ofType: (NSString *)extension inDirectory: (NSString *)bundlePath withVersion: (int)version { return [self _pathForResource: name ofType: extension inRootPath: bundlePath inDirectory: nil]; } + (NSString *) pathForResource: (NSString *)name ofType: (NSString *)extension inDirectory: (NSString *)bundlePath { return [self _pathForResource: name ofType: extension inRootPath: bundlePath inDirectory: nil]; } + (NSURL*) URLForResource: (NSString*)name withExtension: (NSString*)extension subdirectory: (NSString*)subpath inBundleWithURL: (NSURL*)bundleURL { NSBundle *root = [self bundleWithURL: bundleURL]; return [root URLForResource: name withExtension: extension subdirectory: subpath]; } - (NSString *) pathForResource: (NSString *)name ofType: (NSString *)extension { return [self pathForResource: name ofType: extension inDirectory: nil]; } - (NSString *) pathForResource: (NSString *)name ofType: (NSString *)extension inDirectory: (NSString *)subPath { NSString *rootPath; #if !defined(_WIN32) if (_frameworkVersion) rootPath = [NSString stringWithFormat: @"%@/Versions/%@", [self bundlePath], _frameworkVersion]; else #endif rootPath = [self bundlePath]; return [NSBundle _pathForResource: name ofType: extension inRootPath: rootPath inDirectory: subPath]; } - (NSURL *) URLForResource: (NSString *)name withExtension: (NSString *)extension { return [self URLForResource: name withExtension: extension subdirectory: nil localization: nil]; } - (NSURL *) URLForResource: (NSString *)name withExtension: (NSString *)extension subdirectory: (NSString *)subpath { return [self URLForResource: name withExtension: extension subdirectory: subpath localization: nil]; } - (NSURL *) URLForResource: (NSString *)name withExtension: (NSString *)extension subdirectory: (NSString *)subpath localization: (NSString *)localizationName { NSString *path; path = [self pathForResource: name ofType: extension inDirectory: subpath forLocalization: localizationName]; if (nil == path) { return nil; } return [NSURL fileURLWithPath: path]; } + (NSArray*) _pathsForResourcesOfType: (NSString*)extension inRootDirectory: (NSString*)bundlePath inSubDirectory: (NSString*)subPath localization: (NSString*)localization { BOOL allfiles; NSString *path; NSMutableArray *resources; NSEnumerator *pathlist; pathlist = [[NSBundle _bundleResourcePathsWithRootPath: bundlePath subPath: subPath localization: localization] objectEnumerator]; resources = [NSMutableArray arrayWithCapacity: 2]; allfiles = (extension == nil || [extension length] == 0); while ((path = [pathlist nextObject])) { NSEnumerator *filelist; NSString *match; filelist = [bundle_directory_readable(path) objectEnumerator]; while ((match = [filelist nextObject])) { if (allfiles || [extension isEqual: [match pathExtension]]) [resources addObject: [path stringByAppendingPathComponent: match]]; } } return resources; } + (NSArray*) pathsForResourcesOfType: (NSString*)extension inDirectory: (NSString*)bundlePath { return [self _pathsForResourcesOfType: extension inRootDirectory: bundlePath inSubDirectory: nil localization: nil]; } - (NSArray *) pathsForResourcesOfType: (NSString *)extension inDirectory: (NSString *)subPath { return [[self class] _pathsForResourcesOfType: extension inRootDirectory: [self bundlePath] inSubDirectory: subPath localization: nil]; } - (NSArray*) pathsForResourcesOfType: (NSString*)extension inDirectory: (NSString*)subPath forLocalization: (NSString*)localizationName { NSArray *paths = nil; NSMutableArray *result = nil; NSEnumerator *enumerator = nil; NSString *path = nil; result = [NSMutableArray array]; paths = [[self class] _pathsForResourcesOfType: extension inRootDirectory: [self bundlePath] inSubDirectory: subPath localization: localizationName]; enumerator = [paths objectEnumerator]; while ((path = [enumerator nextObject]) != nil) { /* Add all non-localized paths, plus ones in the particular localization (if there is one). */ NSString *theDir = [path stringByDeletingLastPathComponent]; NSString *last = [theDir lastPathComponent]; if ([[last pathExtension] isEqual: @"lproj"] == NO) { [result addObject: path]; } else { NSString *lang = [last stringByDeletingPathExtension]; NSArray *alternatives = altLang(lang); if ([alternatives count] > 0) { [result addObject: path]; } } } return result; } - (NSString*) pathForResource: (NSString*)name ofType: (NSString*)extension inDirectory: (NSString*)subPath forLocalization: (NSString*)localizationName { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSString *result = nil; NSArray *array; if ([extension length] == 0) { extension = [name pathExtension]; if (extension != nil) { name = [name stringByDeletingPathExtension]; } } array = [self pathsForResourcesOfType: extension inDirectory: subPath forLocalization: localizationName]; if (array != nil) { NSEnumerator *enumerator = [array objectEnumerator]; NSString *path; name = [name stringByAppendingPathExtension: extension]; while ((path = [enumerator nextObject]) != nil) { NSString *found = [path lastPathComponent]; if ([found isEqualToString: name] == YES) { result = path; break; // localised paths occur before non-localised } } } [result retain]; [arp drain]; return [result autorelease]; } + (NSArray *) preferredLocalizationsFromArray: (NSArray *)localizationsArray { return [self preferredLocalizationsFromArray: localizationsArray forPreferences: [[NSUserDefaults standardUserDefaults] stringArrayForKey: @"NSLanguages"]]; } + (NSArray *) preferredLocalizationsFromArray: (NSArray *)localizationsArray forPreferences: (NSArray *)preferencesArray { NSString *locale; NSMutableArray *array; NSEnumerator *enumerate; array = [NSMutableArray arrayWithCapacity: 2]; enumerate = [preferencesArray objectEnumerator]; while ((locale = [enumerate nextObject])) { if ([localizationsArray indexOfObject: locale] != NSNotFound) [array addObject: locale]; } /* I guess this is arbitrary if we can't find a match? */ if ([array count] == 0 && [localizationsArray count] > 0) [array addObject: [localizationsArray objectAtIndex: 0]]; return GS_IMMUTABLE(array); } - (NSDictionary*) localizedInfoDictionary { NSString *path; NSArray *locales; NSString *locale = nil; NSDictionary *dict = nil; locales = [self preferredLocalizations]; if ([locales count] > 0) locale = [locales objectAtIndex: 0]; path = [self pathForResource: @"Info-gnustep" ofType: @"plist" inDirectory: nil forLocalization: locale]; if (path) { dict = [[NSDictionary alloc] initWithContentsOfFile: path]; } else { path = [self pathForResource: @"Info" ofType: @"plist" inDirectory: nil forLocalization: locale]; if (path) { dict = [[NSDictionary alloc] initWithContentsOfFile: path]; } } if (nil == [dict autorelease]) { dict = [self infoDictionary]; } return dict; } - (id) objectForInfoDictionaryKey: (NSString *)key { return [[self infoDictionary] objectForKey: key]; } - (NSString*) developmentLocalization { return nil; } - (NSArray *) localizations { NSString *locale; NSArray *localizations; NSEnumerator* enumerate; NSMutableArray *array = [NSMutableArray arrayWithCapacity: 2]; localizations = [self pathsForResourcesOfType: @"lproj" inDirectory: nil]; enumerate = [localizations objectEnumerator]; while ((locale = [enumerate nextObject])) { locale = [[locale lastPathComponent] stringByDeletingPathExtension]; [array addObject: locale]; } #ifdef __ANDROID__ // Android: Check known languages for localizations directly, as AAssetDir // and thereby NSDirectoryEnumerator doesn't list directories and the above // call to list lproj resources will therefore come up empty. NSArray *languages = [[NSUserDefaults standardUserDefaults] stringArrayForKey: @"NSLanguages"]; for (locale in languages) { NSString *path = [self pathForResource: @"Localizable" ofType: @"strings" inDirectory: nil forLocalization: locale]; if (path) { [array addObject: locale]; } } #endif /* __ANDROID__ */ return GS_IMMUTABLE(array); } - (NSArray *) preferredLocalizations { return [NSBundle preferredLocalizationsFromArray: [self localizations]]; } - (NSString *) localizedStringForKey: (NSString *)key value: (NSString *)value table: (NSString *)tableName { NSDictionary *table; NSString *newString = nil; if (_localizations == nil) _localizations = [[NSMutableDictionary alloc] initWithCapacity: 1]; if (tableName == nil || [tableName isEqualToString: @""] == YES) { tableName = @"Localizable"; table = [_localizations objectForKey: tableName]; } else if ((table = [_localizations objectForKey: tableName]) == nil && [@"strings" isEqual: [tableName pathExtension]] == YES) { tableName = [tableName stringByDeletingPathExtension]; table = [_localizations objectForKey: tableName]; } if (table == nil) { NSString *tablePath; /* * Make sure we have an empty table in place in case anything * we do somehow causes recursion. The recursive call will look * up the string in the empty table. */ [_localizations setObject: _emptyTable forKey: tableName]; tablePath = [self pathForResource: tableName ofType: @"strings"]; if (tablePath != nil) { NSStringEncoding encoding; NSString *tableContent; NSData *tableData; const unsigned char *bytes; unsigned length; tableData = [[NSData alloc] initWithContentsOfFile: tablePath]; bytes = [tableData bytes]; length = [tableData length]; /* * A localisation file can be: * - UTF-16 with a leading BOM, * - UTF-8, * - or ASCII with \U escapes. */ if (length > 2 && ((bytes[0] == 0xFF && bytes[1] == 0xFE) || (bytes[0] == 0xFE && bytes[1] == 0xFF))) { encoding = NSUnicodeStringEncoding; } else { encoding = NSUTF8StringEncoding; } tableContent = [[NSString alloc] initWithData: tableData encoding: encoding]; if (tableContent == nil && encoding == NSUTF8StringEncoding) { encoding = [NSString defaultCStringEncoding]; tableContent = [[NSString alloc] initWithData: tableData encoding: encoding]; if (tableContent != nil) { NSWarnMLog (@"Localisation file %@ not in portable encoding," @" so I'm using the default encoding for the current" @" system, which may not display messages correctly.\n" @"The file should be UTF-8, UTF-16 with a leading" @" byte-order-marker, or ASCII (using \\U escapes for" @" unicode characters.\n", tablePath); } } if (tableContent == nil) { NSWarnMLog(@"Failed to load strings file %@ - bad character" @" encoding", tablePath); } else { NS_DURING { table = [tableContent propertyListFromStringsFileFormat]; } NS_HANDLER { NSWarnMLog(@"Failed to parse strings file %@ - %@", tablePath, localException); } NS_ENDHANDLER } RELEASE(tableData); RELEASE(tableContent); } else { NSDebugMLLog(@"NSBundle", @"Failed to locate strings file %@", tableName); } /* * If we couldn't found and parsed the strings table, we put it in * the cache of strings tables in this bundle, otherwise we will just * be keeping the empty table in the cache so we don't keep retrying. */ if (table != nil) [_localizations setObject: table forKey: tableName]; } if (key == nil || (newString = [table objectForKey: key]) == nil) { NSString *show = [[NSUserDefaults standardUserDefaults] objectForKey: NSShowNonLocalizedStrings]; if (show && [show isEqual: @"YES"]) { /* It would be bad to localize this string! */ NSLog(@"Non-localized string: %@\n", key); newString = [key uppercaseString]; } else { newString = value; if (newString == nil || [newString isEqualToString: @""] == YES) newString = key; } if (newString == nil) newString = @""; } return newString; } + (void) stripAfterLoading: (BOOL)flag { _strip_after_loading = flag; } - (NSArray *) executableArchitectures { return nil; } - (BOOL) preflightAndReturnError: (NSError **)error { return NO; } - (BOOL) loadAndReturnError: (NSError **)error { return NO; } - (NSString *) executablePath { NSString *object, *path; if (!_mainBundle) { [NSBundle mainBundle]; } if (self == _mainBundle) { return GSPrivateExecutablePath(); } if (self->_bundleType == NSBUNDLE_LIBRARY) { return GSPrivateSymbolPath([self principalClass]); } object = [[self infoDictionary] objectForKey: @"NSExecutable"]; if (object == nil || [object length] == 0) { object = [[self infoDictionary] objectForKey: @"CFBundleExecutable"]; if (object == nil || [object length] == 0) { return nil; } } if (_bundleType == NSBUNDLE_FRAMEWORK) { /* Mangle the name before building the _currentFrameworkName, * which really is a class name. */ NSString *mangledName = object; mangledName = [mangledName stringByReplacingString: @"_" withString: @"__"]; mangledName = [mangledName stringByReplacingString: @"-" withString: @"_0"]; mangledName = [mangledName stringByReplacingString: @"+" withString: @"_1"]; #if !defined(_WIN32) path = [_path stringByAppendingPathComponent: @"Versions/Current"]; #else path = _path; #endif _currentFrameworkName = RETAIN(([NSString stringWithFormat: @"NSFramework_%@", mangledName])); } else { path = _path; } object = bundle_object_name(path, object); return object; } - (NSURL *) executableURL { return [NSURL fileURLWithPath: [self executablePath]]; } - (NSString *) pathForAuxiliaryExecutable: (NSString *) executableName { NSString *version = _frameworkVersion; if (!version) version = @"Current"; if (_bundleType == NSBUNDLE_FRAMEWORK) { #if !defined(_WIN32) return [_path stringByAppendingPathComponent: [NSString stringWithFormat: @"Versions/%@/%@", version, executableName]]; #else return [_path stringByAppendingPathComponent: executableName]; #endif } else { return [_path stringByAppendingPathComponent: executableName]; } } - (NSURL *) URLForAuxiliaryExecutable: (NSString *) executableName { return [NSURL fileURLWithPath: [self pathForAuxiliaryExecutable: executableName]]; } - (NSString *) resourcePath { NSString *version = _frameworkVersion; if (!version) version = @"Current"; if (_bundleType == NSBUNDLE_FRAMEWORK) { #if !defined(_WIN32) return [_path stringByAppendingPathComponent: [NSString stringWithFormat: @"Versions/%@/Resources", version]]; #else /* No Versions (that require symlinks) on mswindows */ return [_path stringByAppendingPathComponent: @"Resources"]; #endif } else { return [_path stringByAppendingPathComponent: @"Resources"]; } } - (NSURL *) resourceURL { return [NSURL fileURLWithPath: [self resourcePath]]; } - (NSDictionary *) infoDictionary { NSString* path; if (_infoDict) return _infoDict; path = [self pathForResource: @"Info-gnustep" ofType: @"plist"]; if (path) { _infoDict = [[NSDictionary alloc] initWithContentsOfFile: path]; } else { path = [self pathForResource: @"Info" ofType: @"plist"]; if (path) { _infoDict = [[NSDictionary alloc] initWithContentsOfFile: path]; } else { _infoDict = RETAIN([NSDictionary dictionary]); } } return _infoDict; } - (NSString *) builtInPlugInsPath { NSString *version = _frameworkVersion; if (!version) version = @"Current"; if (_bundleType == NSBUNDLE_FRAMEWORK) { #if !defined(_WIN32) return [_path stringByAppendingPathComponent: [NSString stringWithFormat: @"Versions/%@/PlugIns", version]]; #else return [_path stringByAppendingPathComponent: @"PlugIns"]; #endif } else { return [_path stringByAppendingPathComponent: @"PlugIns"]; } } - (NSURL *) builtInPlugInsURL { return [NSURL fileURLWithPath: [self builtInPlugInsPath]]; } - (NSString *) privateFrameworksPath { NSString *version = _frameworkVersion; if (!version) version = @"Current"; if (_bundleType == NSBUNDLE_FRAMEWORK) { #if !defined(_WIN32) return [_path stringByAppendingPathComponent: [NSString stringWithFormat: @"Versions/%@/PrivateFrameworks", version]]; #else return [_path stringByAppendingPathComponent: @"PrivateFrameworks"]; #endif } else { return [_path stringByAppendingPathComponent: @"PrivateFrameworks"]; } } - (NSURL *) privateFrameworksURL { return [NSURL fileURLWithPath: [self privateFrameworksPath]]; } - (NSString*) bundleIdentifier { return [[self infoDictionary] objectForKey: @"CFBundleIdentifier"]; } - (unsigned) bundleVersion { return _version; } - (void) setBundleVersion: (unsigned)version { _version = version; } - (BOOL) unload { return NO; } @end @implementation NSBundle (GNUstep) + (NSBundle *) bundleForLibrary: (NSString *)libraryName { return [self bundleForLibrary: libraryName version: nil]; } + (NSBundle *) bundleForLibrary: (NSString *)libraryName version: (NSString *)interfaceVersion { /* Important: if you change this code, make sure to also * change NSUserDefault's manual gnustep-base resource * lookup to match. */ NSArray *paths; NSEnumerator *enumerator; NSString *path; NSFileManager *fm = manager(); NSRange r; if ([libraryName length] == 0) { return nil; } /* * Eliminate any base path or extensions. */ libraryName = [libraryName lastPathComponent]; #if defined(_WIN32) /* A dll is usually of the form 'xxx-maj_min.dll' * so we can extract the version info and use it. */ if ([[libraryName pathExtension] isEqual: @"dll"]) { libraryName = [libraryName stringByDeletingPathExtension]; r = [libraryName rangeOfString: @"-" options: NSBackwardsSearch]; if (r.length > 0) { NSString *ver; ver = [[libraryName substringFromIndex: NSMaxRange(r)] stringByReplacingString: @"_" withString: @"."]; libraryName = [libraryName substringToIndex: r.location]; if (interfaceVersion == nil) { interfaceVersion = ver; } } } #elif defined(__APPLE__) /* A .dylib is usually of the form 'libxxx.maj.min.sub.dylib', * but GNUstep-make installs them with 'libxxx.dylib.maj.min.sub'. * For maximum compatibility with support both forms here. */ if ([[libraryName pathExtension] isEqual: @"dylib"]) { NSString *s = [libraryName stringByDeletingPathExtension]; NSArray *a = [s componentsSeparatedByString: @"."]; if ([a count] > 1) { libraryName = [a objectAtIndex: 0]; if (interfaceVersion == nil && [a count] >= 3) { interfaceVersion = [NSString stringWithFormat: @"%@.%@", [a objectAtIndex: 1], [a objectAtIndex: 2]]; } } } else { r = [libraryName rangeOfString: @".dylib."]; if (r.length > 0) { NSString *s = [libraryName substringFromIndex: NSMaxRange(r)]; NSArray *a = [s componentsSeparatedByString: @"."]; libraryName = [libraryName substringToIndex: r.location]; if (interfaceVersion == nil && [a count] >= 2) { interfaceVersion = [NSString stringWithFormat: @"%@.%@", [a objectAtIndex: 0], [a objectAtIndex: 1]]; } } } #else /* A .so is usually of the form 'libxxx.so.maj.min.sub' * so we can extract the version info and use it. */ r = [libraryName rangeOfString: @".so."]; if (r.length > 0) { NSString *s = [libraryName substringFromIndex: NSMaxRange(r)]; NSArray *a = [s componentsSeparatedByString: @"."]; libraryName = [libraryName substringToIndex: r.location]; if (interfaceVersion == nil && [a count] >= 2) { interfaceVersion = [NSString stringWithFormat: @"%@.%@", [a objectAtIndex: 0], [a objectAtIndex: 1]]; } } #endif while ([[libraryName pathExtension] length] > 0) { libraryName = [libraryName stringByDeletingPathExtension]; } /* * Discard leading 'lib' */ if ([libraryName hasPrefix: @"lib"] == YES) { libraryName = [libraryName substringFromIndex: 3]; } if ([libraryName length] == 0) { return nil; } /* * We expect to find the library resources in the GNUSTEP_LIBRARY domain in: * * Libraries//Versions//Resources/ * * if no is specified, and if can't find any versioned * resources in those directories, we'll also accept the old unversioned * subdirectory: * * Libraries/Resources// * */ paths = NSSearchPathForDirectoriesInDomains (NSLibraryDirectory, NSAllDomainsMask, YES); enumerator = [paths objectEnumerator]; while ((path = [enumerator nextObject]) != nil) { NSBundle *b; BOOL isDir; path = [path stringByAppendingPathComponent: @"Libraries"]; if ([fm fileExistsAtPath: path isDirectory: &isDir] && isDir) { /* As a special case, if we have been asked to get the base * library bundle without a version, we check to see if the * bundle for the current version is available and use that * in preference to all others. * This lets older code (using the non-versioned api) work * on systems where multiple versions are installed. */ if (interfaceVersion == nil && [libraryName isEqualToString: @"gnustep-base"]) { NSString *p; p = [[[[path stringByAppendingPathComponent: libraryName] stringByAppendingPathComponent: @"Versions"] stringByAppendingPathComponent: _base_version] stringByAppendingPathComponent: @"Resources"]; if ([fm fileExistsAtPath: p isDirectory: &isDir] && isDir) { interfaceVersion = _base_version; } } if (interfaceVersion != nil) { /* We're looking for a specific version. */ path = [[[[path stringByAppendingPathComponent: libraryName] stringByAppendingPathComponent: @"Versions"] stringByAppendingPathComponent: interfaceVersion] stringByAppendingPathComponent: @"Resources"]; if ([fm fileExistsAtPath: path isDirectory: &isDir] && isDir) { b = [self bundleWithPath: path]; if (b != nil && b->_bundleType == NSBUNDLE_BUNDLE) { b->_bundleType = NSBUNDLE_LIBRARY; } return b; } } else { /* Any version will do. */ NSString *versionsPath; versionsPath = [[path stringByAppendingPathComponent: libraryName] stringByAppendingPathComponent: @"Versions"]; if ([fm fileExistsAtPath: versionsPath isDirectory: &isDir] && isDir) { /* TODO: Ignore subdirectories. */ NSEnumerator *fileEnumerator; NSString *potentialPath; fileEnumerator = [fm enumeratorAtPath: versionsPath]; while ((potentialPath = [fileEnumerator nextObject]) != nil) { potentialPath = [potentialPath stringByAppendingPathComponent: @"Resources"]; potentialPath = [versionsPath stringByAppendingPathComponent: potentialPath]; if ([fm fileExistsAtPath: potentialPath isDirectory: &isDir] && isDir) { b = [self bundleWithPath: potentialPath]; if (b != nil && b->_bundleType == NSBUNDLE_BUNDLE) { b->_bundleType = NSBUNDLE_LIBRARY; } return b; } } } /* We didn't find anything! For backwards * compatibility, try the unversioned directory itself: * we used to put library resources directly in * unversioned directories such as * GNUSTEP_LIBRARY/Libraries/Resources/gnustep-base/{resources * here}. This was deprecated/obsoleted on 9 March 2007 * when we added library resource versioning. */ { NSString *oldResourcesPath; oldResourcesPath = [path stringByAppendingPathComponent: @"Resources"]; oldResourcesPath = [oldResourcesPath stringByAppendingPathComponent: libraryName]; if ([fm fileExistsAtPath: oldResourcesPath isDirectory: &isDir] && isDir) { b = [self bundleWithPath: oldResourcesPath]; if (b != nil && b->_bundleType == NSBUNDLE_BUNDLE) { b->_bundleType = NSBUNDLE_LIBRARY; } return b; } } } } } return nil; } + (NSString *) pathForLibraryResource: (NSString *)name ofType: (NSString *)extension inDirectory: (NSString *)bundlePath { NSString *path = nil; NSString *bundle_path = nil; NSArray *paths; NSBundle *bundle; NSEnumerator *enumerator; /* Gather up the paths */ paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSAllDomainsMask, YES); enumerator = [paths objectEnumerator]; while ((path == nil) && (bundle_path = [enumerator nextObject])) { bundle = [self bundleWithPath: bundle_path]; path = [bundle pathForResource: name ofType: extension inDirectory: bundlePath]; } return path; } - (void)cleanPathCache { NSUInteger plen = [_path length]; NSEnumerator *enumerator; NSString *path; [pathCacheLock lock]; enumerator = [pathCache keyEnumerator]; while (nil != (path = [enumerator nextObject])) { if (YES == [path hasPrefix: _path]) { if ([path length] == plen) { /* Remove the bundle directory path from the cache. */ [pathCache removeObjectForKey: path]; } else { unichar c = [path characterAtIndex: plen]; /* if the directory is inside the bundle, remove from cache. */ if ('/' == c) { [pathCache removeObjectForKey: path]; } #if defined(_WIN32) else if ('\\' == c) { [pathCache removeObjectForKey: path]; } #endif } } } [pathCacheLock unlock]; /* also destroy cached variables depending on bundle paths */ DESTROY(_infoDict); DESTROY(_localizations); } #ifdef __ANDROID__ + (AAssetManager *)assetManager { return _assetManager; } + (void) setJavaAssetManager: (jobject)jassetManager withJNIEnv: (JNIEnv *)env { /* create global reference to Java asset manager to prevent garbage * collection */ _jassetManager = (*env)->NewGlobalRef(env, jassetManager); // get native asset manager (may be shared across multiple threads) _assetManager = AAssetManager_fromJava(env, _jassetManager); // clean main bundle path cache in case it was accessed before [_mainBundle cleanPathCache]; } + (AAsset *) assetForPath: (NSString *)path { return [self assetForPath: path withMode: AASSET_MODE_UNKNOWN]; } + (AAsset *) assetForPath: (NSString *)path withMode: (int)mode { AAsset *asset = NULL; if (_assetManager && _mainBundle) { NSString *resourcePath = [_mainBundle resourcePath]; if ([path hasPrefix: resourcePath] && [path length] > [resourcePath length]) { NSString *assetPath; assetPath = [path substringFromIndex: [resourcePath length] + 1]; asset = AAssetManager_open(_assetManager, [assetPath fileSystemRepresentation], mode); } } return asset; } + (AAssetDir *) assetDirForPath: (NSString *)path { AAssetDir *assetDir = NULL; if (_assetManager && _mainBundle) { NSString *resourcePath = [_mainBundle resourcePath]; if ([path hasPrefix: resourcePath]) { NSString *assetPath = @""; if ([path length] > [resourcePath length]) { assetPath = [path substringFromIndex: [resourcePath length] + 1]; } assetDir = AAssetManager_openDir(_assetManager, [assetPath fileSystemRepresentation]); if (assetDir) { /* AAssetManager_openDir() always returns an object, * so we check if the directory exists by ensuring * it contains a file */ BOOL exists = AAssetDir_getNextFileName(assetDir) != NULL; if (exists) { AAssetDir_rewind(assetDir); } else { AAssetDir_close(assetDir); assetDir = NULL; } } } } return assetDir; } #endif /* __ANDROID__ */ @end gnustep-base-1.29.0/Source/NSByteCountFormatter.m000066400000000000000000000170771435650067400217050ustar00rootroot00000000000000/* Definition of class NSByteCountFormatter Copyright (C) 2019 Free Software Foundation, Inc. Written by: Gregory Casamento Date: July 2019 This file is part of the GNUstep Library. 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 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 USA. */ #define GS_NSByteCountFormatter_IVARS \ NSFormattingContext _formattingContext; \ NSByteCountFormatterCountStyle _countStyle; \ BOOL _allowsNonnumericFormatting; \ BOOL _includesActualByteCount; \ BOOL _adaptive; \ NSByteCountFormatterUnits _allowedUnits; \ BOOL _includesCount; \ BOOL _includesUnit; \ BOOL _zeroPadsFractionDigits; #define EXPOSE_NSByteCountFormatter_IVARS 1 #import #import #import #import #import #import #import #define GSInternal NSByteCountFormatterInternal #include "GSInternal.h" GS_PRIVATE_INTERNAL(NSByteCountFormatter) // Unit definitions... #define KB (double)1024.0 #define MB (double)(1024.0 * 1024.0) #define GB (double)(1024.0 * 1024.0 * 1024.0) #define TB (double)(1024.0 * 1024.0 * 1024.0 * 1024.0) #define PB (double)(1024.0 * 1024.0 * 1024.0 * 1024.0 * 1024.0) #define EB (double)(1024.0 * 1024.0 * 1024.0 * 1024.0 * 1024.0 * 1024.0) #define ZB (double)(1024.0 * 1024.0 * 1024.0 * 1024.0 * 1024.0 * 1024.0 * 1024.0) #define YB (double)(1024.0 * 1024.0 * 1024.0 * 1024.0 * 1024.0 * 1024.0 * 1024.0 * 1024.0) @implementation NSByteCountFormatter + (NSString*) stringFromByteCount: (long long)byteCount countStyle: (NSByteCountFormatterCountStyle)countStyle { NSByteCountFormatter *formatter = AUTORELEASE([NSByteCountFormatter new]); [formatter setCountStyle: countStyle]; return [formatter stringFromByteCount: byteCount]; } - (NSString*) stringForObjectValue: (id)obj { long long byteCount = 0; if ([obj respondsToSelector: @selector(longLongValue)]) { byteCount = [obj longLongValue]; } return [self stringFromByteCount: byteCount]; } - (NSByteCountFormatterUnits) _adaptiveSettings: (double)byteCount { NSByteCountFormatterUnits units = NSByteCountFormatterUseDefault; if (byteCount >= KB || byteCount == 0.0) { units = NSByteCountFormatterUseKB; } if (byteCount >= MB) { units = NSByteCountFormatterUseMB; } if (byteCount >= GB) { units = NSByteCountFormatterUseGB; } if (byteCount >= TB) { units = NSByteCountFormatterUseTB; } if (byteCount >= PB) { units = NSByteCountFormatterUsePB; } if (byteCount >= EB) { units = NSByteCountFormatterUseEB; } if (byteCount >= YB) { units = NSByteCountFormatterUseYBOrHigher; } return units; } - (NSString*) stringFromByteCount: (long long)byteCount { NSString *result = nil; double bc = (double)byteCount; double count = 0; NSString *outputFormat = @""; NSString *unitName = @""; NSByteCountFormatterUnits allowed = internal->_allowedUnits; if (internal->_adaptive) { allowed = [self _adaptiveSettings: bc]; } else if (allowed == NSByteCountFormatterUseDefault) { allowed = NSByteCountFormatterUseMB; } if (allowed & NSByteCountFormatterUseYBOrHigher) { count = bc / YB; unitName = @"YB"; } if (allowed & NSByteCountFormatterUseEB) { count = bc / EB; unitName = @"EB"; } if (allowed & NSByteCountFormatterUsePB) { count = bc / PB; unitName = @"PB"; } if (allowed & NSByteCountFormatterUseTB) { count = bc / TB; unitName = @"TB"; } if (allowed & NSByteCountFormatterUseGB) { count = bc / GB; unitName = @"GB"; } if (allowed & NSByteCountFormatterUseMB) { count = bc / MB; unitName = @"MB"; } if (allowed & NSByteCountFormatterUseKB) { count = bc / KB; unitName = @"KB"; } if (allowed & NSByteCountFormatterUseBytes) { count = bc; unitName = @"bytes"; } if (internal->_allowsNonnumericFormatting && count == 0.0) { outputFormat = [outputFormat stringByAppendingString: @"Zero"]; } else { if (internal->_zeroPadsFractionDigits) { outputFormat = [outputFormat stringByAppendingString: @"%01.08f"]; } else { NSInteger whole = (NSInteger)(count / 1); double frac = (double)count - (double)whole; if (frac > 0.0) { whole += 1; } count = (double)whole; outputFormat = [outputFormat stringByAppendingString: @"%01.0f"]; } } if (internal->_includesUnit) { NSString *paddedUnit = [NSString stringWithFormat: @" %@",unitName]; outputFormat = [outputFormat stringByAppendingString: paddedUnit]; } // Do the formatting... result = [NSString stringWithFormat: outputFormat, count]; return result; } - (id) init { if (nil == (self = [super init])) { return nil; } GS_CREATE_INTERNAL(NSByteCountFormatter); internal->_countStyle = NSByteCountFormatterCountStyleFile; internal->_allowedUnits = NSByteCountFormatterUseDefault; internal->_adaptive = YES; internal->_formattingContext = NSFormattingContextUnknown; internal->_allowsNonnumericFormatting = YES; internal->_includesUnit = YES; return self; } - (NSFormattingContext) formattingContext { return internal->_formattingContext; } - (void) setFormattingContext: (NSFormattingContext)ctx { internal->_formattingContext = ctx; } - (NSByteCountFormatterCountStyle) countStyle { return internal->_countStyle; } - (void) setCountStyle: (NSByteCountFormatterCountStyle)style { internal->_countStyle = style; } - (BOOL) allowsNonnumericFormatting { return internal->_allowsNonnumericFormatting; } - (void) setAllowsNonnumericFormatting: (BOOL)flag { internal->_allowsNonnumericFormatting = flag; } - (BOOL) includesActualByteCount { return internal->_includesActualByteCount; } - (void) setIncludesActualByteCount: (BOOL)flag { internal->_includesActualByteCount = flag; } - (BOOL) isAdaptive { return internal->_adaptive; } - (void) setAdaptive: (BOOL)flag { internal->_adaptive = flag; } - (NSByteCountFormatterUnits) allowedUnits { return internal->_allowedUnits; } - (void) setAllowedUnits: (NSByteCountFormatterUnits)units { internal->_allowedUnits = units; } - (BOOL) includesCount { return internal->_includesCount; } - (void) setIncludesCount: (BOOL)flag { internal->_includesCount = flag; } - (BOOL) includesUnit { return internal->_includesUnit; } - (void) setIncludesUnit: (BOOL)flag { internal->_includesUnit = flag; } - (BOOL) zeroPadsFractionDigits { return internal->_zeroPadsFractionDigits; } - (void) setZeroPadsFractionDigits: (BOOL)flag { internal->_zeroPadsFractionDigits = flag; } @end gnustep-base-1.29.0/Source/NSCache.m000066400000000000000000000151321435650067400170760ustar00rootroot00000000000000/* Implementation for NSCache for GNUStep Copyright (C) 2009 Free Software Foundation, Inc. Written by: David Chisnall Created: 2009 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #define EXPOSE_NSCache_IVARS 1 #import "Foundation/NSArray.h" #import "Foundation/NSCache.h" #import "Foundation/NSMapTable.h" #import "Foundation/NSEnumerator.h" /** * _GSCachedObject is effectively used as a structure containing the various * things that need to be associated with objects stored in an NSCache. It is * an NSObject subclass so that it can be used with OpenStep collection * classes. */ @interface _GSCachedObject : NSObject { @public id object; NSString *key; int accessCount; NSUInteger cost; BOOL isEvictable; } @end @interface NSCache (EvictionPolicy) /** The method controlling eviction policy in an NSCache. */ - (void) _evictObjectsToMakeSpaceForObjectWithCost: (NSUInteger)cost; @end @implementation NSCache - (id) init { if (nil == (self = [super init])) { return nil; } ASSIGN(_objects,[NSMapTable strongToStrongObjectsMapTable]); _accesses = [NSMutableArray new]; return self; } - (NSUInteger) countLimit { return _countLimit; } - (id) delegate { return _delegate; } - (BOOL) evictsObjectsWithDiscardedContent { return _evictsObjectsWithDiscardedContent; } - (NSString*) name { return _name; } - (id) objectForKey: (id)key { _GSCachedObject *obj = [_objects objectForKey: key]; if (nil == obj) { return nil; } if (obj->isEvictable) { // Move the object to the end of the access list. [_accesses removeObjectIdenticalTo: obj]; [_accesses addObject: obj]; } obj->accessCount++; _totalAccesses++; return obj->object; } - (void) removeAllObjects { NSEnumerator *e = [_objects objectEnumerator]; _GSCachedObject *obj; while (nil != (obj = [e nextObject])) { [_delegate cache: self willEvictObject: obj->object]; } [_objects removeAllObjects]; [_accesses removeAllObjects]; _totalAccesses = 0; } - (void) removeObjectForKey: (id)key { _GSCachedObject *obj = [_objects objectForKey: key]; if (nil != obj) { [_delegate cache: self willEvictObject: obj->object]; _totalAccesses -= obj->accessCount; [_objects removeObjectForKey: key]; [_accesses removeObjectIdenticalTo: obj]; } } - (void) setCountLimit: (NSUInteger)lim { _countLimit = lim; } - (void) setDelegate:(id)del { _delegate = del; } - (void) setEvictsObjectsWithDiscardedContent:(BOOL)b { _evictsObjectsWithDiscardedContent = b; } - (void) setName: (NSString*)cacheName { ASSIGN(_name, cacheName); } - (void) setObject: (id)obj forKey: (id)key cost: (NSUInteger)num { _GSCachedObject *oldObject = [_objects objectForKey: key]; _GSCachedObject *newObject; if (nil != oldObject) { [self removeObjectForKey: oldObject->key]; } [self _evictObjectsToMakeSpaceForObjectWithCost: num]; newObject = [_GSCachedObject new]; // Retained here, released when obj is dealloc'd newObject->object = RETAIN(obj); newObject->key = RETAIN(key); newObject->cost = num; if ([obj conformsToProtocol: @protocol(NSDiscardableContent)]) { newObject->isEvictable = YES; [_accesses addObject: newObject]; } [_objects setObject: newObject forKey: key]; RELEASE(newObject); _totalCost += num; } - (void) setObject: (id)obj forKey: (id)key { [self setObject: obj forKey: key cost: 0]; } - (void) setTotalCostLimit: (NSUInteger)lim { _costLimit = lim; } - (NSUInteger) totalCostLimit { return _costLimit; } /** * This method is the one that handles the eviction policy. This * implementation uses a relatively simple LRU/LFU hybrid. The NSCache * documentation from Apple makes it clear that the policy may change, so we * could in future have a class cluster with pluggable policies for different * caches or some other mechanism. */ - (void)_evictObjectsToMakeSpaceForObjectWithCost: (NSUInteger)cost { NSUInteger spaceNeeded = 0; NSUInteger count = [_objects count]; if (_costLimit > 0 && _totalCost + cost > _costLimit) { spaceNeeded = _totalCost + cost - _costLimit; } // Only evict if we need the space. if (count > 0 && (spaceNeeded > 0 || count >= _countLimit)) { NSMutableArray *evictedKeys = nil; // Round up slightly. NSUInteger averageAccesses = ((_totalAccesses / (double)count) * 0.2) + 1; NSEnumerator *e = [_accesses objectEnumerator]; _GSCachedObject *obj; if (_evictsObjectsWithDiscardedContent) { evictedKeys = [[NSMutableArray alloc] init]; } while (nil != (obj = [e nextObject])) { // Don't evict frequently accessed objects. if (obj->accessCount < averageAccesses && obj->isEvictable) { [obj->object discardContentIfPossible]; if ([obj->object isContentDiscarded]) { NSUInteger cost = obj->cost; // Evicted objects have no cost. obj->cost = 0; // Don't try evicting this again in future; it's gone already. obj->isEvictable = NO; // Remove this object as well as its contents if required if (_evictsObjectsWithDiscardedContent) { [evictedKeys addObject: obj->key]; } _totalCost -= cost; // If we've freed enough space, give up if (cost > spaceNeeded) { break; } spaceNeeded -= cost; } } } // Evict all of the objects whose content we have discarded if required if (_evictsObjectsWithDiscardedContent) { NSString *key; e = [evictedKeys objectEnumerator]; while (nil != (key = [e nextObject])) { [self removeObjectForKey: key]; } } [evictedKeys release]; } } - (void) dealloc { [_name release]; [_objects release]; [_accesses release]; [super dealloc]; } @end @implementation _GSCachedObject - (void) dealloc { [object release]; [key release]; [super dealloc]; } @end gnustep-base-1.29.0/Source/NSCachedURLResponse.m000066400000000000000000000063661435650067400213550ustar00rootroot00000000000000/* Implementation for NSCachedURLResponse for GNUstep Copyright (C) 2006 Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 2006 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #define EXPOSE_NSCachedURLResponse_IVARS 1 #import "GSURLPrivate.h" #import "Foundation/NSCoder.h" // Internal data storage typedef struct { NSData *data; NSURLResponse *response; NSDictionary *userInfo; NSURLCacheStoragePolicy storagePolicy; } Internal; #define this ((Internal*)(self->_NSCachedURLResponseInternal)) @implementation NSCachedURLResponse + (id) allocWithZone: (NSZone*)z { NSCachedURLResponse *o = [super allocWithZone: z]; if (o != nil) { o->_NSCachedURLResponseInternal = NSZoneMalloc(z, sizeof(Internal)); memset(o->_NSCachedURLResponseInternal, '\0', sizeof(Internal)); } return o; } - (id) copyWithZone: (NSZone*)z { NSCachedURLResponse *o; if (NSShouldRetainWithZone(self, z) == YES) { o = RETAIN(self); } else { o = [[self class] allocWithZone: z]; o = [o initWithResponse: [self response] data: [self data] userInfo: [self userInfo] storagePolicy: [self storagePolicy]]; } return o; } - (void) dealloc { if (this != 0) { RELEASE(this->data); RELEASE(this->response); RELEASE(this->userInfo); NSZoneFree([self zone], this); } [super dealloc]; } - (void) encodeWithCoder: (NSCoder*)aCoder { // FIXME if ([aCoder allowsKeyedCoding]) { } else { } } - (id) initWithCoder: (NSCoder*)aCoder { // FIXME if ([aCoder allowsKeyedCoding]) { } else { } return self; } - (NSData *) data { return this->data; } - (id) initWithResponse: (NSURLResponse *)response data: (NSData *)data { return [self initWithResponse: response data: data userInfo: nil storagePolicy: NSURLCacheStorageAllowed]; } - (id) initWithResponse: (NSURLResponse *)response data: (NSData *)data userInfo: (NSDictionary *)userInfo storagePolicy: (NSURLCacheStoragePolicy)storagePolicy; { if ((self = [super init]) != nil) { ASSIGNCOPY(this->data, data); ASSIGNCOPY(this->response, response); ASSIGNCOPY(this->userInfo, userInfo); this->storagePolicy = storagePolicy; } return self; } - (NSURLResponse *) response { return this->response; } - (NSURLCacheStoragePolicy) storagePolicy { return this->storagePolicy; } - (NSDictionary *) userInfo { return this->userInfo; } @end gnustep-base-1.29.0/Source/NSCalendar.m000066400000000000000000001023301435650067400176010ustar00rootroot00000000000000/* NSCalendar.m Copyright (C) 2010 Free Software Foundation, Inc. Written by: Stefan Bidigaray Date: December, 2010 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 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; see the file COPYING.LIB. If not, see or write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #import "common.h" #import "Foundation/NSCalendar.h" #import "Foundation/NSCoder.h" #import "Foundation/NSDate.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSException.h" #import "Foundation/NSLocale.h" #import "Foundation/NSNotification.h" #import "Foundation/NSString.h" #import "Foundation/NSTimeZone.h" #import "Foundation/NSUserDefaults.h" #import "GNUstepBase/GSLock.h" #if defined(HAVE_UNICODE_UCAL_H) #define id ucal_id #include #include #undef id #elif defined(HAVE_ICU_H) #include #endif #if GS_USE_ICU == 1 static UCalendarDateFields _NSCalendarUnitToDateField(NSCalendarUnit unit) { if (unit & NSCalendarUnitEra) return UCAL_ERA; if (unit & NSCalendarUnitYear) return UCAL_YEAR; if (unit & NSCalendarUnitMonth) return UCAL_MONTH; if (unit & NSCalendarUnitDay) return UCAL_DAY_OF_MONTH; if (unit & NSCalendarUnitHour) return UCAL_HOUR_OF_DAY; if (unit & NSCalendarUnitMinute) return UCAL_MINUTE; if (unit & NSCalendarUnitSecond) return UCAL_SECOND; if (unit & NSCalendarUnitWeekOfYear) return UCAL_WEEK_OF_YEAR; if (unit & NSCalendarUnitWeekday) return UCAL_DAY_OF_WEEK; if (unit & NSCalendarUnitWeekdayOrdinal) return UCAL_DAY_OF_WEEK_IN_MONTH; return (UCalendarDateFields)-1; } #endif /* GS_USE_ICU */ typedef struct { NSString *identifier; NSString *localeID; NSTimeZone *tz; void *cal; NSInteger firstWeekday; NSInteger minimumDaysInFirstWeek; } Calendar; #define my ((Calendar*)_NSCalendarInternal) @interface NSCalendar (PrivateMethods) - (void *) _openCalendarFor: (NSTimeZone *)timeZone; - (void) _resetCalendar; - (void *) _UCalendar; - (NSString *) _localeIDWithLocale: (NSLocale*)locale; - (NSString *) _localeIdentifier; - (void) _setLocaleIdentifier: (NSString*)identifier; @end static NSCalendar *autoupdatingCalendar = nil; static NSRecursiveLock *classLock = nil; #define TZ_NAME_LENGTH 1024 #define SECOND_TO_MILLI 1000.0 #define MILLI_TO_NANO 1000000 @implementation NSCalendar (PrivateMethods) #if GS_USE_ICU == 1 - (void *) _openCalendarFor: (NSTimeZone *)timeZone { NSString *tzName; NSUInteger tzLen; unichar cTzId[TZ_NAME_LENGTH]; const char *cLocaleId; UErrorCode err = U_ZERO_ERROR; UCalendarType type; cLocaleId = [my->localeID UTF8String]; tzName = [timeZone name]; tzLen = [tzName length]; if (tzLen > TZ_NAME_LENGTH) { tzLen = TZ_NAME_LENGTH; } [tzName getCharacters: cTzId range: NSMakeRange(0, tzLen)]; if ([NSGregorianCalendar isEqualToString: my->identifier]) { type = UCAL_GREGORIAN; } else { #ifndef UCAL_DEFAULT /* * Older versions of ICU used UCAL_TRADITIONAL rather than UCAL_DEFAULT * so if one is not available we use the other. */ type = UCAL_TRADITIONAL; #else type = UCAL_DEFAULT; #endif // We do not need to call uloc_setKeywordValue() here to set the calendar on the locale // as the calendar is already encoded in the locale id by _localeIDWithLocale:. } return ucal_open((const UChar *)cTzId, tzLen, cLocaleId, type, &err); } #endif - (void) _resetCalendar { #if GS_USE_ICU == 1 if (my->cal != NULL) { ucal_close(my->cal); } my->cal = [self _openCalendarFor: my->tz]; if (NSNotFound == my->firstWeekday) { my->firstWeekday = ucal_getAttribute(my->cal, UCAL_FIRST_DAY_OF_WEEK); } else { ucal_setAttribute(my->cal, UCAL_FIRST_DAY_OF_WEEK, (int32_t)my->firstWeekday); } if (NSNotFound == my->minimumDaysInFirstWeek) { my->minimumDaysInFirstWeek = ucal_getAttribute(my->cal, UCAL_MINIMAL_DAYS_IN_FIRST_WEEK); } else { ucal_setAttribute(my->cal, UCAL_MINIMAL_DAYS_IN_FIRST_WEEK, (int32_t)my->minimumDaysInFirstWeek); } #endif } - (void *) _UCalendar { return my->cal; } - (NSString*) _localeIDWithLocale: (NSLocale *)locale { NSString *result; NSString *localeId; NSMutableDictionary *tmpDict; localeId = [locale localeIdentifier]; if (my->identifier) { tmpDict = [[NSLocale componentsFromLocaleIdentifier: localeId] mutableCopyWithZone: NULL]; [tmpDict removeObjectForKey: NSLocaleCalendar]; [tmpDict setObject: my->identifier forKey: NSLocaleCalendarIdentifier]; result = [NSLocale localeIdentifierFromComponents: tmpDict]; RELEASE(tmpDict); } else { result = localeId; } return result; } - (NSString*) _localeIdentifier { return my->localeID; } - (void) _setLocaleIdentifier: (NSString *) identifier { if ([identifier isEqualToString: my->localeID]) { return; } ASSIGN(my->localeID, identifier); [self _resetCalendar]; } - (void) _defaultsDidChange: (NSNotification*)n { NSUserDefaults *defs; NSString *locale; NSString *calendar; NSString *tz; defs = [NSUserDefaults standardUserDefaults]; locale = [defs stringForKey: @"Locale"]; calendar = [defs stringForKey: @"Calendar"]; tz = [defs stringForKey: @"Local Time Zone"]; [classLock lock]; if ([locale isEqual: my->localeID] == NO || [calendar isEqual: my->identifier] == NO || [tz isEqual: [my->tz name]] == NO) { #if GS_USE_ICU == 1 ucal_close(my->cal); #endif ASSIGN(my->localeID, locale); ASSIGN(my->identifier, calendar); RELEASE(my->tz); my->tz = [[NSTimeZone alloc] initWithName: tz]; [self _resetCalendar]; } [classLock unlock]; } @end @implementation NSCalendar + (void) initialize { if (self == [NSCalendar class]) { classLock = [NSRecursiveLock new]; } } + (id) currentCalendar { NSCalendar *result; NSString *identifier; // This identifier may be nil identifier = [[NSLocale currentLocale] objectForKey: NSLocaleCalendarIdentifier]; result = [[NSCalendar alloc] initWithCalendarIdentifier: identifier]; return AUTORELEASE(result); } + (id) autoupdatingCurrentCalendar { [classLock lock]; if (nil == autoupdatingCalendar) { autoupdatingCalendar = [[self currentCalendar] copy]; [[NSNotificationCenter defaultCenter] addObserver: autoupdatingCalendar selector: @selector(_defaultsDidChange:) name: NSUserDefaultsDidChangeNotification object: nil]; } [classLock unlock]; return autoupdatingCalendar; } + (id) calendarWithIdentifier: (NSString *) identifier { return AUTORELEASE([[self alloc] initWithCalendarIdentifier: identifier]); } - (id) init { return [self initWithCalendarIdentifier: nil]; } - (id) initWithCalendarIdentifier: (NSString *) identifier { NSAssert(0 == _NSCalendarInternal, NSInvalidArgumentException); _NSCalendarInternal = NSZoneCalloc([self zone], sizeof(Calendar), 1); my->firstWeekday = NSNotFound; my->minimumDaysInFirstWeek = NSNotFound; ASSIGN(my->identifier, identifier); ASSIGN(my->tz, [NSTimeZone defaultTimeZone]); [self setLocale: [NSLocale currentLocale]]; return self; } - (void) dealloc { if (0 != _NSCalendarInternal) { #if GS_USE_ICU == 1 ucal_close (my->cal); #endif RELEASE(my->identifier); RELEASE(my->localeID); RELEASE(my->tz); NSZoneFree([self zone], _NSCalendarInternal); } [super dealloc]; } - (NSString *) calendarIdentifier { return my->identifier; } - (NSInteger) component: (NSCalendarUnit)unit fromDate: (NSDate *)date { NSDateComponents *comps = [self components: unit fromDate: date]; NSInteger val = 0; switch (unit) { case NSCalendarUnitEra: val = [comps era]; break; case NSCalendarUnitYear: val = [comps year]; break; case NSCalendarUnitMonth: val = [comps month]; break; case NSCalendarUnitDay: val = [comps day]; break; case NSCalendarUnitHour: val = [comps hour]; break; case NSCalendarUnitMinute: val = [comps minute]; break; case NSCalendarUnitSecond: val = [comps second]; break; case NSCalendarUnitWeekday: val = [comps weekday]; break; case NSCalendarUnitWeekdayOrdinal: val = [comps weekdayOrdinal]; break; case NSCalendarUnitQuarter: val = [comps quarter]; break; case NSCalendarUnitWeekOfMonth: val = [comps weekOfMonth]; break; case NSCalendarUnitWeekOfYear: val = [comps weekOfYear]; break; case NSCalendarUnitYearForWeekOfYear: val = [comps yearForWeekOfYear]; break; case NSCalendarUnitNanosecond: val = [comps nanosecond]; break; case NSCalendarUnitCalendar: case NSCalendarUnitTimeZone: // in these cases do nothing since they are undefined. break; } return val; } - (NSDateComponents *) components: (NSUInteger) unitFlags fromDate: (NSDate *) date { #if GS_USE_ICU == 1 NSDateComponents *comps; UErrorCode err = U_ZERO_ERROR; UDate udate; udate = (UDate)floor([date timeIntervalSince1970] * SECOND_TO_MILLI); ucal_setMillis(my->cal, udate, &err); if (U_FAILURE(err)) { return nil; } comps = [[NSDateComponents alloc] init]; if (unitFlags & NSCalendarUnitEra) { [comps setEra: ucal_get(my->cal, UCAL_ERA, &err)]; } if (unitFlags & NSCalendarUnitYear) { [comps setYear: ucal_get(my->cal, UCAL_YEAR, &err)]; } if (unitFlags & NSCalendarUnitMonth) { [comps setMonth: ucal_get(my->cal, UCAL_MONTH, &err) + 1]; } if (unitFlags & NSCalendarUnitDay) { [comps setDay: ucal_get(my->cal, UCAL_DAY_OF_MONTH, &err)]; } if (unitFlags & NSCalendarUnitHour) { [comps setHour: ucal_get(my->cal, UCAL_HOUR_OF_DAY, &err)]; } if (unitFlags & NSCalendarUnitMinute) { [comps setMinute: ucal_get(my->cal, UCAL_MINUTE, &err)]; } if (unitFlags & NSCalendarUnitSecond) { [comps setSecond: ucal_get(my->cal, UCAL_SECOND, &err)]; } if (unitFlags & (NSWeekCalendarUnit | NSCalendarUnitWeekOfYear)) { [comps setWeek: ucal_get(my->cal, UCAL_WEEK_OF_YEAR, &err)]; } if (unitFlags & NSCalendarUnitWeekday) { [comps setWeekday: ucal_get(my->cal, UCAL_DAY_OF_WEEK, &err)]; } if (unitFlags & NSCalendarUnitWeekdayOrdinal) { [comps setWeekdayOrdinal: ucal_get(my->cal, UCAL_DAY_OF_WEEK_IN_MONTH, &err)]; } if (unitFlags & NSCalendarUnitQuarter) { [comps setQuarter: (ucal_get(my->cal, UCAL_MONTH, &err) + 3) / 3]; } if (unitFlags & NSCalendarUnitWeekOfMonth) { [comps setWeekOfMonth: ucal_get(my->cal, UCAL_WEEK_OF_MONTH, &err)]; } if (unitFlags & NSCalendarUnitYearForWeekOfYear) { [comps setYearForWeekOfYear: ucal_get(my->cal, UCAL_YEAR_WOY, &err)]; } if (unitFlags & NSCalendarUnitNanosecond) { [comps setNanosecond: ucal_get(my->cal, UCAL_MILLISECOND, &err) * MILLI_TO_NANO]; } return AUTORELEASE(comps); #else return nil; #endif } /* * Convenience macro for field extraction. * TODO: We need to implement NSWrapCalendarComponents, * but it is unclear how that actually works. */ #define COMPONENT_DIFF( \ cal, units, components, toDate, nsunit, setSel, uunit, err) \ do \ { \ if (nsunit == (units & nsunit)) \ { \ int32_t uunit ## Diff \ = ucal_getFieldDifference(cal, toDate, uunit, &err); \ if (U_FAILURE(err)) \ { \ RELEASE(components); \ return nil; \ } \ [components setSel uunit ## Diff]; \ } \ } while (0) - (NSDateComponents *) components: (NSUInteger) unitFlags fromDate: (NSDate *) startingDate toDate: (NSDate *) resultDate options: (NSUInteger) opts { #if GS_USE_ICU == 1 && (U_ICU_VERSION_MAJOR_NUM > 4 \ || (U_ICU_VERSION_MAJOR_NUM == 4 && U_ICU_VERSION_MINOR_NUM >= 8) \ || defined(HAVE_ICU_H)) NSDateComponents *comps = nil; UErrorCode err = U_ZERO_ERROR; UDate udateFrom = (UDate)floor([startingDate timeIntervalSince1970] * SECOND_TO_MILLI); UDate udateTo = (UDate)floor([resultDate timeIntervalSince1970] * SECOND_TO_MILLI); ucal_setMillis(my->cal, udateFrom, &err); if (U_FAILURE(err)) { return nil; } comps = [[NSDateComponents alloc] init]; /* * Since the ICU field difference function automatically advances * the calendar as appropriate, we need to process the units from * the largest to the smallest. */ COMPONENT_DIFF(my->cal, unitFlags, comps, udateTo, NSCalendarUnitEra, setEra:, UCAL_ERA, err); COMPONENT_DIFF(my->cal, unitFlags, comps, udateTo, NSCalendarUnitYear, setYear:, UCAL_YEAR, err); COMPONENT_DIFF(my->cal, unitFlags, comps, udateTo, NSCalendarUnitMonth, setMonth:, UCAL_MONTH, err); COMPONENT_DIFF(my->cal, unitFlags, comps, udateTo, NSCalendarUnitWeekOfYear, setWeek:, UCAL_WEEK_OF_YEAR, err); if (!(unitFlags & NSCalendarUnitWeekOfYear)) { /* We must avoid setting the same unit twice (it would be zero because * of the automatic advancement. */ COMPONENT_DIFF(my->cal, unitFlags, comps, udateTo, NSWeekCalendarUnit, setWeek:, UCAL_WEEK_OF_YEAR, err); } COMPONENT_DIFF(my->cal, unitFlags, comps, udateTo, NSCalendarUnitWeekOfMonth, setWeekOfMonth:, UCAL_WEEK_OF_MONTH, err); COMPONENT_DIFF(my->cal, unitFlags, comps, udateTo, NSCalendarUnitDay, setDay:, UCAL_DAY_OF_MONTH, err); COMPONENT_DIFF(my->cal, unitFlags, comps, udateTo, NSCalendarUnitWeekdayOrdinal, setWeekdayOrdinal:, UCAL_DAY_OF_WEEK_IN_MONTH, err); COMPONENT_DIFF(my->cal, unitFlags, comps, udateTo, NSCalendarUnitWeekday, setWeekday:, UCAL_DAY_OF_WEEK, err); COMPONENT_DIFF(my->cal, unitFlags, comps, udateTo, NSCalendarUnitHour, setHour:, UCAL_HOUR_OF_DAY, err); COMPONENT_DIFF(my->cal, unitFlags, comps, udateTo, NSCalendarUnitMinute, setMinute:, UCAL_MINUTE, err); COMPONENT_DIFF(my->cal, unitFlags, comps, udateTo, NSCalendarUnitSecond, setSecond:, UCAL_SECOND, err); if (unitFlags & NSCalendarUnitNanosecond) { int32_t ms; ms = ucal_getFieldDifference(my->cal, udateTo, UCAL_MILLISECOND, &err); if (U_FAILURE(err)) { RELEASE(comps); return nil; } [comps setNanosecond: ms * MILLI_TO_NANO]; } return AUTORELEASE(comps); #else return nil; #endif } #undef COMPONENT_DIFF #define _ADD_COMPONENT(c, n) \ if (opts & NSWrapCalendarComponents) \ ucal_roll(my->cal, c, n, &err); \ else \ ucal_add(my->cal, c, n, &err); \ if (U_FAILURE(err)) \ { \ return nil; \ } - (NSDate *) dateByAddingComponents: (NSDateComponents *) comps toDate: (NSDate *) date options: (NSUInteger) opts { #if GS_USE_ICU == 1 NSInteger amount; UErrorCode err = U_ZERO_ERROR; UDate udate; [self _resetCalendar]; udate = (UDate)([date timeIntervalSince1970] * SECOND_TO_MILLI); ucal_setMillis(my->cal, udate, &err); if ((amount = [comps era]) != NSDateComponentUndefined) { _ADD_COMPONENT(UCAL_ERA, (int32_t)amount); } if ((amount = [comps year]) != NSDateComponentUndefined) { _ADD_COMPONENT(UCAL_YEAR, (int32_t)amount); } if ((amount = [comps month]) != NSDateComponentUndefined) { _ADD_COMPONENT(UCAL_MONTH, (int32_t)amount); } if ((amount = [comps day]) != NSDateComponentUndefined) { _ADD_COMPONENT(UCAL_DAY_OF_MONTH, (int32_t)amount); } if ((amount = [comps hour]) != NSDateComponentUndefined) { _ADD_COMPONENT(UCAL_HOUR_OF_DAY, (int32_t)amount); } if ((amount = [comps minute]) != NSDateComponentUndefined) { _ADD_COMPONENT(UCAL_MINUTE, (int32_t)amount); } if ((amount = [comps second]) != NSDateComponentUndefined) { _ADD_COMPONENT(UCAL_SECOND, (int32_t)amount); } if ((amount = [comps week]) != NSDateComponentUndefined) { _ADD_COMPONENT(UCAL_WEEK_OF_YEAR, (int32_t)amount); } if ((amount = [comps weekday]) != NSDateComponentUndefined) { _ADD_COMPONENT(UCAL_DAY_OF_WEEK, (int32_t)amount); } if ((amount = [comps weekOfMonth]) != NSDateComponentUndefined) { _ADD_COMPONENT(UCAL_WEEK_OF_MONTH, (int32_t)amount); } if ((amount = [comps yearForWeekOfYear]) != NSDateComponentUndefined) { _ADD_COMPONENT(UCAL_YEAR_WOY, (int32_t)amount); } if ((amount = [comps nanosecond]) != NSDateComponentUndefined) { _ADD_COMPONENT(UCAL_MILLISECOND, (int32_t)(amount / MILLI_TO_NANO)); } udate = ucal_getMillis(my->cal, &err); if (U_FAILURE(err)) { return nil; } return [NSDate dateWithTimeIntervalSince1970: (udate / SECOND_TO_MILLI)]; #else return nil; #endif } #undef _ADD_COMPONENT - (NSDate *) dateFromComponents: (NSDateComponents *) comps { #if GS_USE_ICU == 1 NSInteger amount; UDate udate; UErrorCode err = U_ZERO_ERROR; void *cal; NSTimeZone *timeZone; timeZone = [comps timeZone]; if (timeZone == nil) { timeZone = [self timeZone]; } cal = [self _openCalendarFor: timeZone]; if (!cal) { return nil; } ucal_clear(cal); if ((amount = [comps era]) != NSDateComponentUndefined) { ucal_set(cal, UCAL_ERA, (int32_t)amount); } if ((amount = [comps year]) != NSDateComponentUndefined) { ucal_set (cal, UCAL_YEAR, (int32_t)amount); } if ((amount = [comps month]) != NSDateComponentUndefined) { ucal_set (cal, UCAL_MONTH, amount - 1); } if ((amount = [comps day]) != NSDateComponentUndefined) { ucal_set (cal, UCAL_DAY_OF_MONTH, (int32_t)amount); } if ((amount = [comps hour]) != NSDateComponentUndefined) { ucal_set (cal, UCAL_HOUR_OF_DAY, (int32_t)amount); } if ((amount = [comps minute]) != NSDateComponentUndefined) { ucal_set (cal, UCAL_MINUTE, (int32_t)amount); } if ((amount = [comps second]) != NSDateComponentUndefined) { ucal_set (cal, UCAL_SECOND, (int32_t)amount); } if ((amount = [comps week]) != NSDateComponentUndefined) { ucal_set (cal, UCAL_WEEK_OF_YEAR, (int32_t)amount); } if ((amount = [comps weekday]) != NSDateComponentUndefined) { ucal_set (cal, UCAL_DAY_OF_WEEK, (int32_t)amount); } if ((amount = [comps weekdayOrdinal]) != NSDateComponentUndefined) { ucal_set (cal, UCAL_DAY_OF_WEEK_IN_MONTH, (int32_t)amount); } if ((amount = [comps weekOfMonth]) != NSDateComponentUndefined) { ucal_set (cal, UCAL_WEEK_OF_MONTH, (int32_t)amount); } if ((amount = [comps yearForWeekOfYear]) != NSDateComponentUndefined) { ucal_set (cal, UCAL_YEAR_WOY, (int32_t)amount); } if ((amount = [comps nanosecond]) != NSDateComponentUndefined) { ucal_set (cal, UCAL_MILLISECOND, (int32_t)(amount / MILLI_TO_NANO)); } udate = ucal_getMillis(cal, &err); ucal_close(cal); if (U_FAILURE(err)) { return nil; } return [NSDate dateWithTimeIntervalSince1970: (udate / SECOND_TO_MILLI)]; #else return nil; #endif } - (NSLocale *) locale { return AUTORELEASE([[NSLocale alloc] initWithLocaleIdentifier: my->localeID]); } - (void) setLocale: (NSLocale *) locale { // It's much easier to keep a copy of the NSLocale's string representation // than to have to build it everytime we have to open a UCalendar. [self _setLocaleIdentifier: [self _localeIDWithLocale: locale]]; } - (NSUInteger) firstWeekday { return my->firstWeekday; } - (void) setFirstWeekday: (NSUInteger)weekday { my->firstWeekday = weekday; #if GS_USE_ICU == 1 ucal_setAttribute(my->cal, UCAL_FIRST_DAY_OF_WEEK, my->firstWeekday); #endif } - (NSUInteger) minimumDaysInFirstWeek { return my->minimumDaysInFirstWeek; } - (void) setMinimumDaysInFirstWeek: (NSUInteger)mdw { my->minimumDaysInFirstWeek = (int32_t)mdw; #if GS_USE_ICU == 1 ucal_setAttribute(my->cal, UCAL_MINIMAL_DAYS_IN_FIRST_WEEK, my->minimumDaysInFirstWeek); #endif } - (NSTimeZone *) timeZone { return my->tz; } - (void) setTimeZone: (NSTimeZone *) tz { if ([tz isEqual: my->tz]) { return; } ASSIGN(my->tz, tz); [self _resetCalendar]; } - (NSRange) maximumRangeOfUnit: (NSCalendarUnit) unit { NSRange result = NSMakeRange (0, 0); #if GS_USE_ICU == 1 UCalendarDateFields dateField; UErrorCode err = U_ZERO_ERROR; [self _resetCalendar]; dateField = _NSCalendarUnitToDateField(unit); if (dateField != (UCalendarDateFields)-1) { // We really don't care if there are any errors... result.location = (NSUInteger)ucal_getLimit(my->cal, dateField, UCAL_MINIMUM, &err); result.length = (NSUInteger)ucal_getLimit(my->cal, dateField, UCAL_MAXIMUM, &err) - result.location + 1; // ICU's month is 0-based, while NSCalendar is 1-based if (dateField == UCAL_MONTH) { result.location += 1; } } #endif return result; } - (NSRange) minimumRangeofUnit: (NSCalendarUnit) unit { NSRange result = NSMakeRange (0, 0); #if GS_USE_ICU == 1 UCalendarDateFields dateField; UErrorCode err = U_ZERO_ERROR; [self _resetCalendar]; dateField = _NSCalendarUnitToDateField(unit); if (dateField != (UCalendarDateFields)-1) { // We really don't care if there are any errors... result.location = (NSUInteger)ucal_getLimit(my->cal, dateField, UCAL_GREATEST_MINIMUM, &err); result.length = (NSUInteger)ucal_getLimit(my->cal, dateField, UCAL_LEAST_MAXIMUM, &err) - result.location + 1; // ICU's month is 0-based, while NSCalendar is 1-based if (dateField == UCAL_MONTH) { result.location += 1; } } #endif return result; } - (NSUInteger) ordinalityOfUnit: (NSCalendarUnit) smaller inUnit: (NSCalendarUnit) larger forDate: (NSDate *) date { return 0; } - (NSRange) rangeOfUnit: (NSCalendarUnit) smaller inUnit: (NSCalendarUnit) larger forDate: (NSDate *) date { return NSMakeRange (0, 0); } - (BOOL) rangeOfUnit: (NSCalendarUnit) unit startDate: (NSDate **) datep interval: (NSTimeInterval *)tip forDate: (NSDate *)date { return NO; } - (BOOL) isEqual: (id) obj { #if GS_USE_ICU == 1 return (BOOL)ucal_equivalentTo(my->cal, [obj _UCalendar]); #else if ([obj isKindOfClass: [self class]]) { if (![my->identifier isEqual: [obj calendarIdentifier]]) return NO; if (![my->localeID isEqual: [obj localeIdentifier]]) return NO; if (![my->tz isEqual: [obj timeZone]]) return NO; if (my->firstWeekday != [obj firstWeekday]) return NO; if (my->minimumDaysInFirstWeek != [obj minimumDaysInFirstWeek]) return NO; return YES; } return NO; #endif } - (void) getEra: (NSInteger *)eraValuePointer year: (NSInteger *)yearValuePointer month: (NSInteger *)monthValuePointer day: (NSInteger *)dayValuePointer fromDate: (NSDate *)date { #if GS_USE_ICU == 1 UErrorCode err = U_ZERO_ERROR; UDate udate; [self _resetCalendar]; ucal_clear (my->cal); udate = (UDate)floor([date timeIntervalSince1970] * 1000.0); ucal_setMillis (my->cal, udate, &err); if (U_FAILURE(err)) return; if (eraValuePointer != NULL) *eraValuePointer = ucal_get(my->cal, UCAL_ERA, &err); if (yearValuePointer != NULL) *yearValuePointer = ucal_get(my->cal, UCAL_YEAR, &err); if (monthValuePointer != NULL) *monthValuePointer = ucal_get(my->cal, UCAL_MONTH, &err) + 1; if (dayValuePointer != NULL) *dayValuePointer = ucal_get(my->cal, UCAL_DAY_OF_MONTH, &err); #endif } - (void) getHour: (NSInteger *)hourValuePointer minute: (NSInteger *)minuteValuePointer second: (NSInteger *)secondValuePointer nanosecond: (NSInteger *)nanosecondValuePointer fromDate: (NSDate *)date { #if GS_USE_ICU == 1 UErrorCode err = U_ZERO_ERROR; UDate udate; [self _resetCalendar]; ucal_clear (my->cal); udate = (UDate)floor([date timeIntervalSince1970] * 1000.0); ucal_setMillis (my->cal, udate, &err); if (U_FAILURE(err)) return; if (hourValuePointer != NULL) *hourValuePointer = ucal_get(my->cal, UCAL_HOUR_OF_DAY, &err); if (minuteValuePointer != NULL) *minuteValuePointer = ucal_get(my->cal, UCAL_MINUTE, &err); if (secondValuePointer != NULL) *secondValuePointer = ucal_get(my->cal, UCAL_SECOND, &err); if (nanosecondValuePointer != NULL) *nanosecondValuePointer = ucal_get(my->cal, UCAL_MILLISECOND, &err) * 1000; #endif } - (void) getEra: (NSInteger *)eraValuePointer yearForWeekOfYear: (NSInteger *)yearValuePointer weekOfYear: (NSInteger *)weekValuePointer weekday: (NSInteger *)weekdayValuePointer fromDate: (NSDate *)date { #if GS_USE_ICU == 1 UErrorCode err = U_ZERO_ERROR; UDate udate; [self _resetCalendar]; ucal_clear (my->cal); udate = (UDate)floor([date timeIntervalSince1970] * 1000.0); ucal_setMillis (my->cal, udate, &err); if (U_FAILURE(err)) return; if (eraValuePointer != NULL) *eraValuePointer = ucal_get(my->cal, UCAL_ERA, &err); if (yearValuePointer != NULL) *yearValuePointer = ucal_get(my->cal, UCAL_YEAR_WOY, &err); if (weekValuePointer != NULL) *weekValuePointer = ucal_get(my->cal, UCAL_WEEK_OF_YEAR, &err); if (weekdayValuePointer != NULL) *weekdayValuePointer = ucal_get(my->cal, UCAL_DAY_OF_WEEK, &err); #endif } - (void) encodeWithCoder: (NSCoder*)encoder { [encoder encodeObject: my->identifier]; [encoder encodeObject: my->localeID]; [encoder encodeObject: my->tz]; } - (id) initWithCoder: (NSCoder*)decoder { NSString *s = [decoder decodeObject]; [self initWithCalendarIdentifier: s]; [self _setLocaleIdentifier: [decoder decodeObject]]; [self setTimeZone: [decoder decodeObject]]; return self; } - (id) copyWithZone: (NSZone*)zone { NSCalendar *result; if (NSShouldRetainWithZone(self, zone)) { return RETAIN(self); } else { result = [[[self class] allocWithZone: zone] initWithCalendarIdentifier: my->identifier]; [result _setLocaleIdentifier: my->localeID]; [result setTimeZone: my->tz]; } return result; } @end #undef my @implementation NSDateComponents typedef struct { NSInteger era; NSInteger year; NSInteger month; NSInteger day; NSInteger hour; NSInteger minute; NSInteger second; NSInteger week; NSInteger weekday; NSInteger weekdayOrdinal; NSInteger quarter; NSInteger weekOfMonth; NSInteger yearForWeekOfYear; BOOL leapMonth; NSInteger nanosecond; NSCalendar *cal; NSTimeZone *tz; } DateComp; #define my ((DateComp*)_NSDateComponentsInternal) - (void) dealloc { if (0 != _NSDateComponentsInternal) { RELEASE(my->cal); RELEASE(my->tz); NSZoneFree([self zone], _NSDateComponentsInternal); } [super dealloc]; } - (id) init { if (nil != (self = [super init])) { _NSDateComponentsInternal = NSZoneCalloc([self zone], sizeof(DateComp), 1); my->era = NSDateComponentUndefined; my->year = NSDateComponentUndefined; my->month = NSDateComponentUndefined; my->day = NSDateComponentUndefined; my->hour = NSDateComponentUndefined; my->minute = NSDateComponentUndefined; my->second = NSDateComponentUndefined; my->week = NSDateComponentUndefined; my->weekday = NSDateComponentUndefined; my->weekdayOrdinal = NSDateComponentUndefined; my->quarter = NSDateComponentUndefined; my->weekOfMonth = NSDateComponentUndefined; my->yearForWeekOfYear = NSDateComponentUndefined; my->leapMonth = NO; my->nanosecond = NSDateComponentUndefined; my->cal = NULL; my->tz = NULL; } return self; } - (NSInteger) day { return my->day; } - (NSInteger) era { return my->era; } - (NSInteger) hour { return my->hour; } - (NSInteger) minute { return my->minute; } - (NSInteger) month { return my->month; } - (NSInteger) quarter { return my->quarter; } - (NSInteger) second { return my->second; } - (NSInteger) nanosecond { return my->nanosecond; } - (NSInteger) week { return my->week; } - (NSInteger) weekday { return my->weekday; } - (NSInteger) weekdayOrdinal { return my->weekdayOrdinal; } - (NSInteger) year { return my->year; } - (NSInteger) weekOfMonth { return my->weekOfMonth; } - (NSInteger) weekOfYear { return my->week; } - (NSInteger) yearForWeekOfYear { return my->yearForWeekOfYear; } - (BOOL) leapMonth { return my->leapMonth; } - (NSCalendar *) calendar { return my->cal; } - (NSTimeZone *) timeZone { return my->tz; } - (NSDate *) date { NSCalendar* cal = [self calendar]; return [cal dateFromComponents: self]; } - (void) setDay: (NSInteger) v { my->day = v; } - (void) setEra: (NSInteger) v { my->era = v; } - (void) setHour: (NSInteger) v { my->hour = v; } - (void) setMinute: (NSInteger) v { my->minute = v; } - (void) setMonth: (NSInteger) v { my->month = v; } - (void) setQuarter: (NSInteger) v { my->quarter = v; } - (void) setSecond: (NSInteger) v { my->second = v; } - (void) setNanosecond: (NSInteger) v { my->nanosecond = v; } - (void) setWeek: (NSInteger) v { my->week = v; } - (void) setWeekday: (NSInteger) v { my->weekday = v; } - (void) setWeekdayOrdinal: (NSInteger) v { my->weekdayOrdinal = v; } - (void) setYear: (NSInteger) v { my->year = v; } - (void) setWeekOfYear: (NSInteger) v { my->week = v; } - (void) setWeekOfMonth: (NSInteger) v { my->weekOfMonth = v; } - (void) setYearForWeekOfYear: (NSInteger) v { my->yearForWeekOfYear = v; } - (void) setLeapMonth: (BOOL) v { my->leapMonth = v; } - (void) setCalendar: (NSCalendar *) cal { ASSIGN(my->cal, cal); } - (void) setTimeZone: (NSTimeZone *) tz { ASSIGN(my->tz, tz); } - (BOOL) isValidDate { if (my->cal == nil) { return NO; } return [self isValidDateInCalendar: my->cal]; } - (BOOL) isValidDateInCalendar: (NSCalendar *) calendar { return [calendar dateFromComponents: self] != nil; } - (NSInteger) valueForComponent: (NSCalendarUnit) unit { switch (unit) { case NSCalendarUnitEra: return my->era; case NSCalendarUnitYear: return my->year; case NSCalendarUnitMonth: return my->month; case NSCalendarUnitDay: return my->day; case NSCalendarUnitHour: return my->hour; case NSCalendarUnitMinute: return my->minute; case NSCalendarUnitSecond: return my->second; case NSCalendarUnitWeekday: return my->weekday; case NSCalendarUnitWeekdayOrdinal: return my->weekdayOrdinal; case NSCalendarUnitQuarter: return my->quarter; case NSCalendarUnitWeekOfMonth: return my->weekOfMonth; case NSCalendarUnitWeekOfYear: return my->week; case NSWeekCalendarUnit: return my->week; case NSCalendarUnitYearForWeekOfYear: return my->yearForWeekOfYear; case NSCalendarUnitNanosecond: return my->nanosecond; default: return 0; } } - (void) setValue: (NSInteger) value forComponent: (NSCalendarUnit) unit { switch (unit) { case NSCalendarUnitEra: my->era = value; break; case NSCalendarUnitYear: my->year = value; break; case NSCalendarUnitMonth: my->month = value; break; case NSCalendarUnitDay: my->day = value; break; case NSCalendarUnitHour: my->hour = value; break; case NSCalendarUnitMinute: my->minute = value; break; case NSCalendarUnitSecond: my->second = value; break; case NSCalendarUnitWeekday: my->weekday = value; break; case NSCalendarUnitWeekdayOrdinal: my->weekdayOrdinal = value; break; case NSCalendarUnitQuarter: my->quarter = value; break; case NSCalendarUnitWeekOfMonth: my->weekOfMonth = value; break; case NSCalendarUnitWeekOfYear: my->week = value; break; case NSWeekCalendarUnit: my->week = value; break; case NSCalendarUnitYearForWeekOfYear: my->yearForWeekOfYear = value; break; case NSCalendarUnitNanosecond: my->nanosecond = value; break; default: break; } } - (id) copyWithZone: (NSZone*)zone { if (NSShouldRetainWithZone(self, zone)) { return RETAIN(self); } else { NSDateComponents *c = [[NSDateComponents allocWithZone: zone] init]; memcpy(c->_NSDateComponentsInternal, _NSDateComponentsInternal, sizeof(DateComp)); /* We gave objects to the copy, so we need to retain them too. */ RETAIN(my->cal); RETAIN(my->tz); return c; } } @end gnustep-base-1.29.0/Source/NSCalendarDate.m000066400000000000000000002067351435650067400204150ustar00rootroot00000000000000/** Implementation for NSCalendarDate for GNUstep Copyright (C) 1996, 1998, 1999, 2000, 2002 Free Software Foundation, Inc. Author: Scott Christley Date: October 1996 Author: Richard Frith-Macdonald Date: September 2002 This file is part of the GNUstep Base Library. 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 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 USA. NSCalendarDate class reference $Date$ $Revision$ */ #import "common.h" #define EXPOSE_NSCalendarDate_IVARS 1 #include #import "Foundation/NSArray.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSCalendarDate.h" #import "Foundation/NSCoder.h" #import "Foundation/NSData.h" #import "Foundation/NSDate.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSException.h" #import "Foundation/NSTimeZone.h" #import "Foundation/NSUserDefaults.h" #import "GNUstepBase/GSObjCRuntime.h" #import "GSPrivate.h" #ifdef HAVE_SYS_TIME_H #include #endif #include #include #include @class GSTimeZone; @interface GSTimeZone : NSObject // Help the compiler @end @class GSAbsTimeZone; @interface GSAbsTimeZone : NSObject // Help the compiler @end @class NSGDate; @interface NSGDate : NSObject // Help the compiler @end #define DISTANT_FUTURE 63113990400.0 #define DISTANT_PAST -63113817600.0 static NSString *cformat = @"%Y-%m-%d %H:%M:%S %z"; static NSTimeZone *localTZ = nil; static Class NSCalendarDateClass; static Class absClass; static Class dstClass; static SEL offSEL; static int (*offIMP)(id, SEL, id); static int (*absOffIMP)(id, SEL, id); static int (*dstOffIMP)(id, SEL, id); static SEL abrSEL; static NSString* (*abrIMP)(id, SEL, id); static NSString* (*absAbrIMP)(id, SEL, id); static NSString* (*dstAbrIMP)(id, SEL, id); /* Do not fetch the default locale unless we actually need it. * Tries to avoid recursion when loading NSUserDefaults containing dates. * This is also a little more efficient with many date formats. */ #define LOCALE (nil == locale ? (locale = GSPrivateDefaultLocale()) : locale) /* * Return the offset from GMT for a date in a timezone ... * Optimize for the local timezone, and less so for the other * base library time zone classes. */ static inline int offset(NSTimeZone *tz, NSDate *d) { if (tz == nil) { return 0; } if (tz == localTZ && offIMP != 0) { return (*offIMP)(tz, offSEL, d); } else { Class c = object_getClass(tz); if (c == dstClass && dstOffIMP != 0) { return (*dstOffIMP)(tz, offSEL, d); } if (c == absClass && absOffIMP != 0) { return (*absOffIMP)(tz, offSEL, d); } return [tz secondsFromGMTForDate: d]; } } /* * Return the offset from GMT for a date in a timezone ... * Optimize for the local timezone, and less so for the other * base library time zone classes. */ static inline NSString* abbrev(NSTimeZone *tz, NSDate *d) { if (tz == nil) { return @"GMT"; } if (tz == localTZ && abrIMP != 0) { return (*abrIMP)(tz, abrSEL, d); } else { Class c = object_getClass(tz); if (c == dstClass && dstAbrIMP != 0) { return (*dstAbrIMP)(tz, abrSEL, d); } if (c == absClass && absAbrIMP != 0) { return (*absAbrIMP)(tz, abrSEL, d); } return [tz abbreviationForDate: d]; } } static inline NSUInteger lastDayOfGregorianMonth(NSUInteger month, NSUInteger year) { switch (month) { case 2: if ((((year % 4) == 0) && ((year % 100) != 0)) || ((year % 400) == 0)) return 29; else return 28; case 4: case 6: case 9: case 11: return 30; default: return 31; } } static inline NSUInteger absoluteGregorianDay(NSUInteger day, NSUInteger month, NSUInteger year) { if (month > 1) { while (--month > 0) { day = day + lastDayOfGregorianMonth(month, year); } } if (year > 0) { year--; } return (day // days this year + 365 * year // days in previous years ignoring leap days + year/4 // Julian leap days before this year... - year/100 // ...minus prior century years... + year/400); // ...plus prior years divisible by 400 } static inline NSInteger dayOfCommonEra(NSTimeInterval when) { NSInteger r; // Get reference date in terms of days when /= 86400.0; // Offset by Gregorian reference when += GREGORIAN_REFERENCE; r = (NSInteger)when; return r; } static void gregorianDateFromAbsolute(NSInteger abs, NSInteger *day, NSInteger *month, NSInteger *year) { NSInteger y; NSInteger m; // Search forward year by year from approximate year y = abs/366; while (abs >= absoluteGregorianDay(1, 1, y+1)) { y++; } // Search forward month by month from January m = 1; while (abs > absoluteGregorianDay(lastDayOfGregorianMonth(m, y), m, y)) { m++; } *year = y; *month = m; *day = abs - absoluteGregorianDay(1, m, y) + 1; } /** * Convert a broken out time specification into a time interval * since the reference date. */ static NSTimeInterval GSTime(unsigned day, unsigned month, unsigned year, unsigned hour, unsigned minute, unsigned second, unsigned mil) { NSTimeInterval a; a = (NSTimeInterval)absoluteGregorianDay(day, month, year); // Calculate date as GMT a -= GREGORIAN_REFERENCE; a = (NSTimeInterval)a * 86400; a += hour * 3600; a += minute * 60; a += second; a += ((NSTimeInterval)mil)/1000.0; return a; } /** * Convert a time interval since the reference date into broken out * elements.
* External - so NSTimeZone can use it ... but should really be static. */ void GSBreakTime(NSTimeInterval when, NSInteger *year, NSInteger *month, NSInteger *day, NSInteger *hour, NSInteger *minute, NSInteger *second, NSInteger *mil) { NSInteger h, m, dayOfEra; double a, b, c, d; /* The 0.1 constant was experimentally derived to cause our behavior * to match Mac OS X 10.9.1. */ when = floor(when * 1000.0 + 0.1) / 1000.0; // Get reference date in terms of days a = when / 86400.0; // Offset by Gregorian reference a += GREGORIAN_REFERENCE; // result is the day of common era. dayOfEra = (NSInteger)a; // Calculate year, month, and day gregorianDateFromAbsolute(dayOfEra, day, month, year); // Calculate hour, minute, and seconds d = dayOfEra - GREGORIAN_REFERENCE; d *= 86400; a = fabs(d - when); b = a / 3600; *hour = (NSInteger)b; h = *hour; h = h * 3600; b = a - h; b = b / 60; *minute = (NSInteger)b; m = *minute; m = m * 60; c = a - h - m; *second = (NSInteger)c; *mil = (NSInteger)rint((a - h - m - *second) * 1000.0); } /** * Returns the current time (seconds since reference date) as an NSTimeInterval. */ NSTimeInterval GSPrivateTimeNow(void) { NSTimeInterval t; #if !defined(_WIN32) struct timeval tp; gettimeofday (&tp, NULL); t = (NSTimeInterval)tp.tv_sec - NSTimeIntervalSince1970; t += (NSTimeInterval)tp.tv_usec / (NSTimeInterval)1000000.0; #if 1 /* This is a workaround for a bug on some SMP intel systems where the TSC * clock information from the processors gets out of sync and causes a * leap of 4398 seconds into the future for an instant, and then back. * If we detect a time jump back by more than the sort of small interval * that ntpd might do (or forwards by a very large amount) we refetch the * system time to make sure we don't have a temporary glitch. */ { static int old = 0; if (old == 0) { old = tp.tv_sec; } else { int diff = tp.tv_sec - old; old = tp.tv_sec; if (diff < -1 || diff > 3000) { time_t now = (time_t)tp.tv_sec; fprintf(stderr, "WARNING: system time changed by %d seconds: %s\n", diff, ctime(&now)); /* Get time again ... should be OK now. */ t = GSPrivateTimeNow(); } } } #endif #else SYSTEMTIME sys_time; /* * Get current GMT time, convert to NSTimeInterval since reference date, */ GetSystemTime(&sys_time); t = GSTime(sys_time.wDay, sys_time.wMonth, sys_time.wYear, sys_time.wHour, sys_time.wMinute, sys_time.wSecond, sys_time.wMilliseconds); #endif /* _WIN32 */ return t; } /** * An [NSDate] subclass which understands about timezones and provides * methods for dealing with date and time information by calendar and * with hours minutes and seconds. */ @implementation NSCalendarDate + (void) initialize { if (self == [NSCalendarDate class] && nil == NSCalendarDateClass) { NSAutoreleasePool *pool = [NSAutoreleasePool new]; NSCalendarDateClass = self; [self setVersion: 1]; localTZ = RETAIN([NSTimeZone localTimeZone]); dstClass = [GSTimeZone class]; absClass = [GSAbsTimeZone class]; offSEL = @selector(secondsFromGMTForDate:); offIMP = (int (*)(id,SEL,id)) [localTZ methodForSelector: offSEL]; dstOffIMP = (int (*)(id,SEL,id)) [dstClass instanceMethodForSelector: offSEL]; absOffIMP = (int (*)(id,SEL,id)) [absClass instanceMethodForSelector: offSEL]; abrSEL = @selector(abbreviationForDate:); abrIMP = (NSString* (*)(id,SEL,id)) [localTZ methodForSelector: abrSEL]; dstAbrIMP = (NSString* (*)(id,SEL,id)) [dstClass instanceMethodForSelector: abrSEL]; absAbrIMP = (NSString* (*)(id,SEL,id)) [absClass instanceMethodForSelector: abrSEL]; GSObjCAddClassBehavior(self, [NSGDate class]); [pool release]; } } /** * Return an NSCalendarDate for the current date and time using the * default timezone. */ + (id) calendarDate { id d = [[self alloc] init]; return AUTORELEASE(d); } /** * Return an NSCalendarDate generated from the supplied description * using the format specified for parsing that string.
* Calls -initWithString:calendarFormat: to create the date. */ + (id) dateWithString: (NSString *)description calendarFormat: (NSString *)format { NSCalendarDate *d = [[self alloc] initWithString: description calendarFormat: format]; return AUTORELEASE(d); } /** * Return an NSCalendarDate generated from the supplied description * using the format specified for parsing that string and interpreting * it according to the dictionary specified.
* Calls -initWithString:calendarFormat:locale: to create the date. */ + (id) dateWithString: (NSString *)description calendarFormat: (NSString *)format locale: (NSDictionary *)dictionary { NSCalendarDate *d = [[self alloc] initWithString: description calendarFormat: format locale: dictionary]; return AUTORELEASE(d); } /** * Creates and returns an NSCalendarDate from the specified values * by calling -initWithYear:month:day:hour:minute:second:timeZone: */ + (id) dateWithYear: (NSInteger)year month: (NSUInteger)month day: (NSUInteger)day hour: (NSUInteger)hour minute: (NSUInteger)minute second: (NSUInteger)second timeZone: (NSTimeZone *)aTimeZone { NSCalendarDate *d = [[self alloc] initWithYear: year month: month day: day hour: hour minute: minute second: second timeZone: aTimeZone]; return AUTORELEASE(d); } /** * Creates and returns a new NSCalendarDate object by taking the * value of the receiver and adding the interval in seconds specified. */ - (id) addTimeInterval: (NSTimeInterval)seconds { return [self dateByAddingTimeInterval: seconds]; } - (Class) classForCoder { return [self class]; } /** * Creates and returns a new NSCalendarDate object by taking the * value of the receiver and adding the interval specified. */ - (id) dateByAddingTimeInterval: (NSTimeInterval)seconds { id newObj = [[self class] dateWithTimeIntervalSinceReferenceDate: [self timeIntervalSinceReferenceDate] + seconds]; [newObj setTimeZone: [self timeZoneDetail]]; [newObj setCalendarFormat: [self calendarFormat]]; return newObj; } - (id) replacementObjectForPortCoder: (NSPortCoder*)aRmc { return self; } - (void) encodeWithCoder: (NSCoder*)coder { [coder encodeValueOfObjCType: @encode(NSTimeInterval) at: &_seconds_since_ref]; [coder encodeObject: _calendar_format]; [coder encodeObject: _time_zone]; } - (id) initWithCoder: (NSCoder*)coder { [coder decodeValueOfObjCType: @encode(NSTimeInterval) at: &_seconds_since_ref]; [coder decodeValueOfObjCType: @encode(id) at: &_calendar_format]; [coder decodeValueOfObjCType: @encode(id) at: &_time_zone]; return self; } - (void) dealloc { RELEASE(_calendar_format); RELEASE(_time_zone); [super dealloc]; } /** * Initializes an NSCalendarDate using the specified description and the * default calendar format and locale.
* Calls -initWithString:calendarFormat:locale: */ - (id) initWithString: (NSString *)description { return [self initWithString: description calendarFormat: cformat locale: nil]; } /** * Initializes an NSCalendarDate using the specified description and format * string interpreted in the default locale.
* Calls -initWithString:calendarFormat:locale: */ - (id) initWithString: (NSString *)description calendarFormat: (NSString *)format { return [self initWithString: description calendarFormat: format locale: nil]; } /* * read up to the specified number of characters, terminating at a non-digit * except for leading whitespace characters. */ static inline int getDigits(const char *from, char *to, int limit, BOOL *error) { int i = 0; int j = 0; BOOL foundDigit = NO; while (i < limit) { if (isdigit(from[i])) { to[j++] = from[i]; foundDigit = YES; } else if (isspace(from[i])) { if (foundDigit == YES) { break; } } else { break; } i++; } to[j] = '\0'; if (j == 0) { *error = YES; // No digits read } return i; } #define hadY 1 #define hadM 2 #define hadD 4 #define hadh 8 #define hadm 16 #define hads 32 #define hadw 64 /** * Initializes an NSCalendarDate using the specified description and format * string interpreted in the given locale.
* If description does not match fmt exactly, this method returns nil.
* Excess characters in the description (after the format is matched) * are ignored.
* Format specifiers are - * * * %% literal % character * * * %a abbreviated weekday name according to locale * * * %A full weekday name according to locale * * * %b abbreviated month name according to locale * * * %B full month name according to locale * * * %c same as '%X %x' * * * %d day of month as a two digit decimal number * * * %e same as %d without leading zero * * * %F milliseconds as a decimal number * * * %H hour as a decimal number using 24-hour clock * * * %I hour as a decimal number using 12-hour clock * * * %j day of year as a decimal number * * * %k same as %H without leading zero (leading space is used instead) * * * %m month as decimal number * * * %M minute as decimal number * * * %p 'am' or 'pm' * * * %S second as decimal number * * * %U week of the current year as decimal number (Sunday first day) * * * %W week of the current year as decimal number (Monday first day) * * * %w day of the week as decimal number (Sunday = 0) * * * %x date with date representation for locale * * * %X time with time representation for locale * * * %y year as a decimal number without century * * * %Y year as a decimal number with century * * * %z time zone offset in hours and minutes from GMT (HHMM) * * * %Z time zone abbreviation * * * If no year is specified in the format, the current year is assumed.
* If no month is specified in the format, January is assumed.
* If no day is specified in the format, 1 is assumed.
* If no hour is specified in the format, 0 is assumed.
* If no minute is specified in the format, 0 is assumed.
* If no second is specified in the format, 0 is assumed.
* If no millisecond is specified in the format, 0 is assumed.
* If no timezone is specified in the format, the local timezone is assumed. *

If GSMacOSXCompatible is YES, the %k specifier is not recognized.

*

NB. Where the format calls for a numeric value and the string contains * fewer digits than expected, the value will be accepted and left padded * with zeros to the expected size.
* For instance, the '%z' format implies four digits (two for the hour * offset and two for the digit offset) and if the string contains '01' * it will be treated as '0001' ie. a timezone offset of 1 minute.
* Similarly, the '%F' format implies three digits, so a value of '1' * would be treated as '001' or 1 millisecond, not a tenth of a second * (as you might assume as '%F' is usually used after a decimal separator). *

*/ - (id) initWithString: (NSString*)description calendarFormat: (NSString*)fmt locale: (NSDictionary*)locale { int milliseconds = 0; int year = 1; int month = 1; int day = 1; int hour = 0; int min = 0; int sec = 0; NSTimeZone *tz = nil; BOOL ampm = NO; BOOL isPM = NO; BOOL twelveHrClock = NO; int julianWeeks = -1, weekStartsMonday = 0, dayOfWeek = -1; const char *source; unsigned sourceLen; unichar *format; unsigned formatLen; unsigned formatIdx = 0; unsigned sourceIdx = 0; char tmpStr[120]; unsigned int tmpIdx; unsigned int tmpEnd; unsigned had = 0; unsigned int pos; BOOL hadPercent = NO; NSMutableData *fd; BOOL changedFormat = NO; BOOL error = NO; if (description == nil) { description = @""; } source = [description cString]; sourceLen = strlen(source); if (fmt == nil) { fmt = [LOCALE objectForKey: NSTimeDateFormatString]; if (fmt == nil) { fmt = @""; } } /* * Get format into a buffer, leaving room for expansion in case it has * escapes that need to be converted. */ formatLen = [fmt length]; fd = [[NSMutableData alloc] initWithLength: (formatLen + 32) * sizeof(unichar)]; format = (unichar*)[fd mutableBytes]; [fmt getCharacters: format]; /* * Expand any sequences to their basic components. */ for (pos = 0; pos < formatLen; pos++) { unichar c = format[pos]; if (c == '%') { if (hadPercent == YES) { hadPercent = NO; } else { hadPercent = YES; } } else { if (hadPercent == YES) { NSString *sub = nil; if (c == 'c') { sub = [LOCALE objectForKey: NSTimeDateFormatString]; if (sub == nil) { sub = @"%X %x"; } } else if (c == 'R') { sub = @"%H:%M"; } else if (c == 'r') { sub = @"%I:%M:%S %p"; } else if (c == 'T') { sub = @"%H:%M:%S"; } else if (c == 't') { sub = @"\t"; } else if (c == 'X') { sub = [LOCALE objectForKey: NSTimeFormatString]; if (sub == nil) { sub = @"%H-%M-%S"; } } else if (c == 'x') { sub = [LOCALE objectForKey: NSShortDateFormatString]; if (sub == nil) { sub = @"%y-%m-%d"; } } if (sub != nil) { unsigned sLen = [sub length]; int i; if (sLen > 2) { [fd setLength: (formatLen + sLen - 2) * sizeof(unichar)]; format = (unichar*)[fd mutableBytes]; for (i = formatLen-1; i > (NSInteger)pos; i--) { format[i+sLen-2] = format[i]; } } else { for (i = pos+1; i < (NSInteger)formatLen; i++) { format[i+sLen-2] = format[i]; } [fd setLength: (formatLen + sLen - 2) * sizeof(unichar)]; format = (unichar*)[fd mutableBytes]; } [sub getCharacters: &format[pos-1]]; formatLen += sLen - 2; changedFormat = YES; pos -= 2; // Re-parse the newly substituted data. } } hadPercent = NO; } } /* * Set up calendar format. */ if (changedFormat == YES) { fmt = [NSString stringWithCharacters: format length: formatLen]; } ASSIGN(_calendar_format, fmt); // // WARNING: // -Most locale stuff is dubious at best. // -Long day and month names depend on a non-alpha character after the // last digit to work. // while (error == NO && formatIdx < formatLen) { if (format[formatIdx] != '%') { // If it's not a format specifier, ignore it. if (isspace(format[formatIdx])) { // Skip any amount of white space. while (source[sourceIdx] != 0 && isspace(source[sourceIdx])) { sourceIdx++; } } else { if (sourceIdx < sourceLen) { if (source[sourceIdx] != format[formatIdx]) { error = YES; NSDebugMLog( @"Expected literal '%c' but got '%c' parsing" @"'%@' using '%@'", format[formatIdx], source[sourceIdx], description, fmt); } sourceIdx++; } } } else { // Skip '%' formatIdx++; while (formatIdx < formatLen && isdigit(format[formatIdx])) { formatIdx++; // skip field width } if (formatIdx < formatLen) { switch (format[formatIdx]) { case '%': // skip literal % if (sourceIdx < sourceLen) { if (source[sourceIdx] != '%') { error = YES; NSDebugMLog( @"Expected literal '%%' but got '%c' parsing" @"'%@' using '%@'", source[sourceIdx], description, fmt); } sourceIdx++; } else { error = YES; NSDebugMLog( @"Expected literal '%%' but got end of string parsing" @"'%@' using '%@'", description, fmt); } break; case 'a': /* FIXME ... Should look for all values from the locale, * matching for longest values first, rather than (wrongly) * assuming a fixed length of three characters. */ tmpStr[0] = toupper(source[sourceIdx]); if (sourceIdx < sourceLen) sourceIdx++; tmpStr[1] = tolower(source[sourceIdx]); if (sourceIdx < sourceLen) sourceIdx++; tmpStr[2] = tolower(source[sourceIdx]); if (sourceIdx < sourceLen) sourceIdx++; tmpStr[3] = '\0'; { NSString *currDay; NSArray *dayNames; currDay = [[NSString alloc] initWithCString: tmpStr]; dayNames = [LOCALE objectForKey: NSShortWeekDayNameArray]; for (tmpIdx = 0; tmpIdx < 7; tmpIdx++) { if ([[dayNames objectAtIndex: tmpIdx] isEqual: currDay] == YES) { break; } } if (tmpIdx == 7) { error = YES; NSDebugMLog(@"Day of week '%@' not found in locale", currDay); } else { dayOfWeek = tmpIdx; had |= hadw; } RELEASE(currDay); } break; case 'A': /* FIXME ... Should look for all values from the locale, * matching for longest values first, rather than (wrongly) * assuming the name contains only western letters. */ tmpEnd = sizeof(tmpStr) - 1; if (sourceLen - sourceIdx < tmpEnd) { tmpEnd = sourceLen - sourceIdx; } for (tmpIdx = 0; tmpIdx < tmpEnd; tmpIdx++) { if (isalpha(source[sourceIdx + tmpIdx])) { tmpStr[tmpIdx] = source[sourceIdx + tmpIdx]; } else { break; } } tmpStr[tmpIdx] = '\0'; sourceIdx += tmpIdx; { NSString *currDay; NSArray *dayNames; currDay = [[NSString alloc] initWithCString: tmpStr]; dayNames = [LOCALE objectForKey: NSWeekDayNameArray]; for (tmpIdx = 0; tmpIdx < 7; tmpIdx++) { if ([[dayNames objectAtIndex: tmpIdx] isEqual: currDay] == YES) { break; } } if (tmpIdx == 7) { error = YES; NSDebugMLog(@"Day of week '%@' not found in locale", currDay); } else { dayOfWeek = tmpIdx; had |= hadw; } RELEASE(currDay); } break; case 'b': /* FIXME ... Should look for all values from the locale, * matching for longest values first, rather than (wrongly) * assuming a fixed length of three characters. */ tmpStr[0] = toupper(source[sourceIdx]); if (sourceIdx < sourceLen) sourceIdx++; tmpStr[1] = tolower(source[sourceIdx]); if (sourceIdx < sourceLen) sourceIdx++; tmpStr[2] = tolower(source[sourceIdx]); if (sourceIdx < sourceLen) sourceIdx++; tmpStr[3] = '\0'; { NSString *currMonth; NSArray *monthNames; currMonth = [[NSString alloc] initWithCString: tmpStr]; monthNames = [LOCALE objectForKey: NSShortMonthNameArray]; for (tmpIdx = 0; tmpIdx < 12; tmpIdx++) { if ([[monthNames objectAtIndex: tmpIdx] isEqual: currMonth] == YES) { break; } } if (tmpIdx == 12) { error = YES; NSDebugMLog(@"Month of year '%@' not found in locale", currMonth); } else { month = tmpIdx+1; had |= hadM; } RELEASE(currMonth); } break; case 'B': /* FIXME ... Should look for all values from the locale, * matching for longest values first, rather than (wrongly) * assuming the name contains only western letters. */ tmpEnd = sizeof(tmpStr) - 1; if (sourceLen - sourceIdx < tmpEnd) { tmpEnd = sourceLen - sourceIdx; } for (tmpIdx = 0; tmpIdx < tmpEnd; tmpIdx++) { if (isalpha(source[sourceIdx + tmpIdx])) { tmpStr[tmpIdx] = source[sourceIdx + tmpIdx]; } else { break; } } tmpStr[tmpIdx] = '\0'; sourceIdx += tmpIdx; { NSString *currMonth; NSArray *monthNames; currMonth = [[NSString alloc] initWithCString: tmpStr]; monthNames = [LOCALE objectForKey: NSMonthNameArray]; for (tmpIdx = 0; tmpIdx < 12; tmpIdx++) { if ([[monthNames objectAtIndex: tmpIdx] isEqual: currMonth] == YES) { break; } } if (tmpIdx == 12) { error = YES; NSDebugMLog(@"Month of year '%@' not found in locale", currMonth); } else { month = tmpIdx+1; had |= hadM; } RELEASE(currMonth); } break; case 'd': // fall through case 'e': sourceIdx += getDigits(&source[sourceIdx], tmpStr, 2, &error); day = atoi(tmpStr); had |= hadD; if (error == NO && day < 1) { error = YES; NSDebugMLog(@"Day of month is zero"); } break; case 'F': sourceIdx += getDigits(&source[sourceIdx], tmpStr, 3, &error); milliseconds = atoi(tmpStr); break; case 'k': // GNUstep extension, not available in Cocoa if (GSPrivateDefaultsFlag(GSMacOSXCompatible)) { error = YES; NSLog(@"Invalid NSCalendar date, " @"specifier %c not recognized in format %@", format[formatIdx], fmt); } case 'I': // fall through twelveHrClock = YES; case 'H': sourceIdx += getDigits(&source[sourceIdx], tmpStr, 2, &error); hour = atoi(tmpStr); had |= hadh; break; case 'j': sourceIdx += getDigits(&source[sourceIdx], tmpStr, 3, &error); day = atoi(tmpStr); had |= hadD; break; case 'm': sourceIdx += getDigits(&source[sourceIdx], tmpStr, 2, &error); month = atoi(tmpStr); had |= hadM; if (error == NO && month < 1) { error = YES; NSDebugMLog(@"Month of year is zero"); } break; case 'M': sourceIdx += getDigits(&source[sourceIdx], tmpStr, 2, &error); min = atoi(tmpStr); had |= hadm; break; case 'p': /* FIXME ... Should look for all values from the locale, * matching for longest values first, rather than (wrongly) * assuming the name is always two uppercase letters. */ twelveHrClock = YES; tmpStr[0] = toupper(source[sourceIdx]); if (sourceIdx < sourceLen) sourceIdx++; tmpStr[1] = toupper(source[sourceIdx]); if (sourceIdx < sourceLen) sourceIdx++; tmpStr[2] = '\0'; { NSString *currAMPM; NSArray *amPMNames; currAMPM = [NSString stringWithUTF8String: tmpStr]; amPMNames = [LOCALE objectForKey: NSAMPMDesignation]; /* * The time addition is handled below because this * indicator only modifies the time on a 12hour clock. */ if ([currAMPM caseInsensitiveCompare: [amPMNames objectAtIndex: 0]] == NSOrderedSame) { ampm = YES; isPM = NO; } else if ([currAMPM caseInsensitiveCompare: [amPMNames objectAtIndex: 1]] == NSOrderedSame) { ampm = YES; isPM = YES; } } break; case 'S': sourceIdx += getDigits(&source[sourceIdx], tmpStr, 2, &error); sec = atoi(tmpStr); had |= hads; break; case 'w': sourceIdx += getDigits(&source[sourceIdx], tmpStr, 1, &error); dayOfWeek = atoi(tmpStr); had |= hadw; break; case 'W': // Fall through weekStartsMonday = 1; case 'U': sourceIdx += getDigits(&source[sourceIdx], tmpStr, 1, &error); julianWeeks = atoi(tmpStr); break; // case 'x': // break; // case 'X': // break; case 'y': sourceIdx += getDigits(&source[sourceIdx], tmpStr, 2, &error); year = atoi(tmpStr); if (year >= 70) { year += 1900; } else { year += 2000; } had |= hadY; break; case 'Y': sourceIdx += getDigits(&source[sourceIdx], tmpStr, 4, &error); year = atoi(tmpStr); had |= hadY; break; case 'z': { int sign = 1; int zone; int found; if (source[sourceIdx] == '+') { sourceIdx++; } else if (source[sourceIdx] == '-') { sign = -1; sourceIdx++; } found = getDigits(&source[sourceIdx], tmpStr, 4, &error); if (found > 0) { sourceIdx += found; zone = atoi(tmpStr); if (found == 2) { zone *= 100; // Convert 2 digits to 4 } tz = [NSTimeZone timeZoneForSecondsFromGMT: sign * ((zone / 100) * 60 + (zone % 100)) * 60]; } } break; case 'Z': /* Can we assume a timezone name is always space terminated? */ tmpEnd = sizeof(tmpStr) - 1; if (sourceLen - sourceIdx < tmpEnd) { tmpEnd = sourceLen - sourceIdx; } for (tmpIdx = 0; tmpIdx < tmpEnd; tmpIdx++) { if (!isspace(source[sourceIdx + tmpIdx])) { tmpStr[tmpIdx] = source[sourceIdx + tmpIdx]; } else { break; } } tmpStr[tmpIdx] = '\0'; sourceIdx += tmpIdx; { NSString *z = [NSString stringWithUTF8String: tmpStr]; /* Abbreviations aren't one-to-one with time zone names so just look for the zone named after the abbreviation, then look up the abbreviation as a last resort */ if ([z length] > 0) { tz = [NSTimeZone timeZoneWithName: z]; if (tz == nil) { tz = [NSTimeZone timeZoneWithAbbreviation: z]; if (tz == nil) { error = YES; NSDebugMLog(@"Time zone '%@' not found", z); } } } else { error = YES; NSDebugMLog(@"Time zone not given"); } } break; default: error = YES; NSLog(@"Invalid NSCalendar date, " @"specifier %c not recognized in format %@", format[formatIdx], fmt); break; } } } formatIdx++; } RELEASE(fd); if (error == NO) { if (tz == nil) { tz = localTZ; } if (twelveHrClock == YES) { if (ampm == YES && isPM == YES && hour != 12) { hour += 12; } else if (ampm == YES && isPM == NO && hour == 12) { hour = 0; // 12 AM } } if (julianWeeks != -1) { NSTimeZone *gmtZone; NSCalendarDate *d; int currDay; gmtZone = [NSTimeZone timeZoneForSecondsFromGMT: 0]; if ((had & (hadY|hadw)) != (hadY|hadw)) { NSCalendarDate *now = [[NSCalendarDateClass alloc] init]; [now setTimeZone: gmtZone]; if ((had & hadY) == 0) { year = [now yearOfCommonEra]; had |= hadY; } if ((had & hadw) == 0) { dayOfWeek = [now dayOfWeek]; had |= hadw; } RELEASE(now); } d = [[NSCalendarDateClass alloc] initWithYear: year month: 1 day: 1 hour: 0 minute: 0 second: 0 timeZone: gmtZone]; currDay = [d dayOfWeek]; RELEASE(d); /* * The julian weeks are either sunday relative or monday relative * but all of the day of week specifiers are sunday relative. * This means that if no day of week specifier was used the week * starts on monday. */ if (dayOfWeek == -1) { if (weekStartsMonday) { dayOfWeek = 1; } else { dayOfWeek = 0; } } day = dayOfWeek + (julianWeeks * 7 - (currDay - 1)); had |= hadD; } /* * If the year has not been set ... use this year ... as on MacOS-X */ if ((had & hadY) == 0) { NSCalendarDate *now = [[NSCalendarDateClass alloc] init]; year = [now yearOfCommonEra]; RELEASE(now); } self = [self initWithYear: year month: month day: day hour: hour minute: min second: sec timeZone: tz]; if (self != nil) { _seconds_since_ref += ((NSTimeInterval)milliseconds) / 1000.0; } } if (error == YES) { DESTROY(self); } return self; } /** * Returns an NSCalendarDate instance with the given year, month, day, * hour, minute, and second, using aTimeZone.
* The year includes the century (ie you can't just say '02' when you * mean '2002').
* The month is in the range 1 to 12,
* The day is in the range 1 to 31,
* The hour is in the range 0 to 23,
* The minute is in the range 0 to 59,
* The second is in the range 0 to 59.
* If aTimeZone is nil, the [NSTimeZone+localTimeZone] value is used. *

* GNUstep checks the validity of the method arguments, and unless * the base library was built with 'warn=no' it generates a warning * for bad values. It tries to use those bad values to generate a * date anyway though, rather than failing (this also appears to be * the behavior of MacOS-X). *

* The algorithm GNUstep uses to create the date is this ...
* * * Convert the broken out date values into a time interval since * the reference date, as if those values represent a GMT date/time. * * * Ask the time zone for the offset from GMT at the resulting date, * and apply that offset to the time interval ... so get the value * for the specified timezone. * * * Ask the time zone for the offset from GMT at the new date ... * in case the new date is in a different daylight savings time * band from the original date. If this offset differs from the * previous one, apply the difference so that the result is * corrected for daylight savings. This is the final result used. * * * After establishing the time interval we will use and completing * initialisation, we ask the time zone for the offset from GMT again. * If it is not the same as the last time, then the time specified by * the broken out date does not really exist ... since it's in the * period lost by the transition to daylight savings. The resulting * date is therefore not the date that was actually asked for, but is * the best approximation we can do. If the base library was not * built with 'warn=no' then a warning message is logged for this * condition. * * */ - (id) initWithYear: (NSInteger)year month: (NSUInteger)month day: (NSUInteger)day hour: (NSUInteger)hour minute: (NSUInteger)minute second: (NSUInteger)second timeZone: (NSTimeZone *)aTimeZone { unsigned int c; NSTimeInterval s; NSTimeInterval oldOffset; NSTimeInterval newOffset; if (month < 1 || month > 12) { NSWarnMLog(@"invalid month given - %"PRIuPTR, month); } c = lastDayOfGregorianMonth(month, year); if (day < 1 || day > c) { NSWarnMLog(@"invalid day given - %"PRIuPTR, day); } if (hour > 23) { NSWarnMLog(@"invalid hour given - %"PRIuPTR, hour); } if (minute > 59) { NSWarnMLog(@"invalid minute given - %"PRIuPTR, minute); } if (second > 59) { NSWarnMLog(@"invalid second given - %"PRIuPTR, second); } // Calculate date as GMT s = GSTime(day, month, year, hour, minute, second, 0); // Assign time zone detail if (aTimeZone == nil) { _time_zone = localTZ; // retain is a no-op for the local timezone. } else { _time_zone = RETAIN(aTimeZone); } if (_calendar_format == nil) { _calendar_format = cformat; } _seconds_since_ref = s; /* * Adjust date so it is correct for time zone. */ oldOffset = offset(_time_zone, self); s -= oldOffset; _seconds_since_ref = s; /* * See if we need to adjust for daylight savings time */ newOffset = offset(_time_zone, self); if (oldOffset != newOffset) { s -= (newOffset - oldOffset); _seconds_since_ref = s; oldOffset = offset(_time_zone, self); /* * If the adjustment puts us in another offset, we must be in the * non-existent period at the start of daylight savings time. */ if (oldOffset != newOffset) { NSWarnMLog(@"init non-existent time at start of daylight savings"); } } return self; } /** * Initialises the receiver with the specified interval since the * reference date. Uses th standard format string "%Y-%m-%d %H:%M:%S %z" * and the default time zone. */ - (id) initWithTimeIntervalSinceReferenceDate: (NSTimeInterval)seconds { if (isnan(seconds)) { [NSException raise: NSInvalidArgumentException format: @"[%@-%@] interval is not a number", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; } #if GS_SIZEOF_VOIDP == 4 if (seconds <= DISTANT_PAST) { seconds = DISTANT_PAST; } else if (seconds >= DISTANT_FUTURE) { seconds = DISTANT_FUTURE; } #endif _seconds_since_ref = seconds; if (_calendar_format == nil) { _calendar_format = cformat; } if (_time_zone == nil) { _time_zone = localTZ; // retain is a no-op for the local timezone. } return self; } /** * Return the day number (ie number of days since the start of) in the * 'common' era of the receiving date. The era starts at 1 A.D. */ - (NSInteger) dayOfCommonEra { NSTimeInterval when; when = _seconds_since_ref + offset(_time_zone, self); return dayOfCommonEra(when); } /** * Return the month (1 to 31) of the receiving date. */ - (NSInteger) dayOfMonth { NSInteger m, d, y; NSTimeInterval when; when = _seconds_since_ref + offset(_time_zone, self); gregorianDateFromAbsolute(dayOfCommonEra(when), &d, &m, &y); return d; } /** * Return the day of the week (0 to 6) of the receiving date. * * 0 is sunday * 1 is monday * 2 is tuesday * 3 is wednesday * 4 is thursday * 5 is friday * 6 is saturday * */ - (NSInteger) dayOfWeek { NSInteger d; NSTimeInterval when; when = _seconds_since_ref + offset(_time_zone, self); d = dayOfCommonEra(when); /* The era started on a sunday. Did we always have a seven day week? Did we lose week days changing from Julian to Gregorian? AFAIK seven days a week is ok for all reasonable dates. */ d = d % 7; if (d < 0) d += 7; return d; } /** * Return the day of the year (1 to 366) of the receiving date. */ - (NSInteger) dayOfYear { NSInteger m, d, y, days, i; NSTimeInterval when; when = _seconds_since_ref + offset(_time_zone, self); gregorianDateFromAbsolute(dayOfCommonEra(when), &d, &m, &y); days = d; for (i = m - 1; i > 0; i--) // days in prior months this year days = days + lastDayOfGregorianMonth(i, y); return days; } /** * Return the hour of the day (0 to 23) of the receiving date. */ - (NSInteger) hourOfDay { NSInteger h; double a, d; NSTimeInterval when; when = _seconds_since_ref + offset(_time_zone, self); d = dayOfCommonEra(when); d -= GREGORIAN_REFERENCE; d *= 86400; a = fabs(d - (_seconds_since_ref + offset(_time_zone, self))); a = a / 3600; h = (NSInteger)a; // There is a small chance of getting // it right at the stroke of midnight if (h == 24) h = 0; return h; } /** * Return the minute of the hour (0 to 59) of the receiving date. */ - (NSInteger) minuteOfHour { NSInteger h, m; double a, b, d; NSTimeInterval when; when = _seconds_since_ref + offset(_time_zone, self); d = dayOfCommonEra(when); d -= GREGORIAN_REFERENCE; d *= 86400; a = fabs(d - (_seconds_since_ref + offset(_time_zone, self))); b = a / 3600; h = (NSInteger)b; h = h * 3600; b = a - h; b = b / 60; m = (NSInteger)b; return m; } /** * Return the month of the year (1 to 12) of the receiving date. */ - (NSInteger) monthOfYear { NSInteger m, d, y; NSTimeInterval when; when = _seconds_since_ref + offset(_time_zone, self); gregorianDateFromAbsolute(dayOfCommonEra(when), &d, &m, &y); return m; } /** * Return the second of the minute (0 to 59) of the receiving date. */ - (NSInteger) secondOfMinute { NSInteger h, m, s; double a, b, c, d; NSTimeInterval when; when = _seconds_since_ref + offset(_time_zone, self); d = dayOfCommonEra(when); d -= GREGORIAN_REFERENCE; d *= 86400; a = fabs(d - (_seconds_since_ref + offset(_time_zone, self))); b = a / 3600; h = (NSInteger)b; h = h * 3600; b = a - h; b = b / 60; m = (NSInteger)b; m = m * 60; c = a - h - m; s = (NSInteger)c; return s; } /** * Return the year of the 'common' era of the receiving date. * The era starts at 1 A.D. */ - (NSInteger) yearOfCommonEra { NSInteger m, d, y; NSTimeInterval when; when = _seconds_since_ref + offset(_time_zone, self); gregorianDateFromAbsolute(dayOfCommonEra(when), &d, &m, &y); return y; } /** * This method exists solely for conformance to the OpenStep spec. * Its use is deprecated ... it simply calls * -dateByAddingYears:months:days:hours:minutes:seconds: */ - (NSCalendarDate*) addYear: (NSInteger)year month: (NSInteger)month day: (NSInteger)day hour: (NSInteger)hour minute: (NSInteger)minute second: (NSInteger)second { return [self dateByAddingYears: year months: month days: day hours: hour minutes: minute seconds: second]; } /** * Calls -descriptionWithCalendarFormat:locale: passing the receiver's * calendar format and a nil locale. */ - (NSString*) description { return [self descriptionWithCalendarFormat: _calendar_format locale: nil]; } /** * Returns a string representation of the receiver using the specified * format string.
* Calls -descriptionWithCalendarFormat:locale: with a nil locale. */ - (NSString*) descriptionWithCalendarFormat: (NSString *)format { return [self descriptionWithCalendarFormat: format locale: nil]; } #define UNIX_REFERENCE_INTERVAL -978307200.0 typedef struct { unichar *base; unichar *t; unsigned length; unsigned offset; NSInteger yd; NSInteger md; NSInteger dom; NSInteger hd; NSInteger mnd; NSInteger sd; NSInteger mil; } DescriptionInfo; static void Grow(DescriptionInfo *info, unsigned size) { if (info->offset + size >= info->length) { if (info->t == info->base) { unichar *old = info->t; info->t = NSZoneMalloc(NSDefaultMallocZone(), (info->length + 512) * sizeof(unichar)); memcpy(info->t, old, info->length*sizeof(unichar)); } else { info->t = NSZoneRealloc(NSDefaultMallocZone(), info->t, (info->length + 512) * sizeof(unichar)); } info->length += 512; } } #define MAX_FLD_WIDTH 99 static void outputValueWithFormat(int v, char *fldfmt, DescriptionInfo *info) { char cbuf[MAX_FLD_WIDTH + 1]; int idx = 0; snprintf((char*)cbuf, sizeof(cbuf), fldfmt, v); Grow(info, strlen((char*)cbuf)); while (cbuf[idx] != '\0') { info->t[info->offset++] = cbuf[idx++]; } } - (void) _format: (NSString*)fmt locale: (NSDictionary*)locale info: (DescriptionInfo*)info { unichar fbuf[512]; unichar *f = fbuf; unsigned lf = [fmt length]; unsigned i = 0; int v; if (lf == 0) { return; // Nothing to do. } if (lf >= sizeof(fbuf)/sizeof(unichar)) { /* * Make temporary buffer to hold format string as unicode. */ f = (unichar*)NSZoneMalloc(NSDefaultMallocZone(), lf*sizeof(unichar)); } [fmt getCharacters: f]; while (i < lf) { NSString *str; BOOL mtag = NO; BOOL dtag = NO; BOOL ycent = NO; BOOL mname = NO; BOOL dname = NO; BOOL twelve = NO; BOOL hspc = NO; char fldfmt[8]; int fmtlen = 0; int width = 0; // Only care about a format specifier if (f[i] == '%') { i++; fldfmt[fmtlen++] = '%'; // field width specified while (fmtlen < 5 && f[i] >= '0' && f[i] <= '9') { fldfmt[fmtlen++] = f[i]; width = 10 * width + f[i] - '0'; i++; } if (fmtlen >= 5 || width > MAX_FLD_WIDTH) { /* ignore formats that specify field width * greater than the max allowed. * set i back so all ignored characters will * be copied */ i -= fmtlen; } // check the character that comes after switch (f[i++]) { // literal % case '%': Grow(info, 1); info->t[info->offset++] = f[i-1]; break; case 'R': [self _format: @"%H:%M" locale: locale info: info]; break; case 'r': [self _format: @"%I:%M:%S %p" locale: locale info: info]; break; case 'T': [self _format: @"%H:%M:%S" locale: locale info: info]; break; case 't': Grow(info, 1); info->t[info->offset++] = '\t'; break; case 'c': str = (NSString*)[LOCALE objectForKey: NSTimeFormatString]; [self _format: str locale: locale info: info]; Grow(info, 1); info->t[info->offset++] = ' '; str = (NSString*)[LOCALE objectForKey: NSDateFormatString]; [self _format: str locale: locale info: info]; break; case 'X': str = (NSString*)[LOCALE objectForKey: NSTimeFormatString]; [self _format: str locale: locale info: info]; break; case 'x': str = (NSString*)[LOCALE objectForKey: NSDateFormatString]; [self _format: str locale: locale info: info]; break; // is it the year case 'Y': ycent = YES; case 'y': v = info->yd; if (ycent) { if (fmtlen == 1) { // no format width specified; supply default fldfmt[fmtlen++] = '0'; fldfmt[fmtlen++] = '4'; } } else { if (v < 0) v = -v; v = v % 100; if (fmtlen == 1) { // no format width specified; supply default fldfmt[fmtlen++] = '0'; fldfmt[fmtlen++] = '2'; } } fldfmt[fmtlen++] = 'd'; fldfmt[fmtlen] = 0; outputValueWithFormat(v, fldfmt, info); break; // is it the month case 'b': mname = YES; case 'B': mtag = YES; // Month is character string case 'm': if (mtag == YES) { NSArray *months; if (mname) months = [LOCALE objectForKey: NSShortMonthNameArray]; else months = [LOCALE objectForKey: NSMonthNameArray]; if (info->md > [months count]) { mtag = NO; } else { NSString *name; name = [months objectAtIndex: info->md-1]; v = [name length]; Grow(info, v); [name getCharacters: info->t + info->offset]; info->offset += v; } } if (mtag == NO) { v = info->md; v = v % 100; if (fmtlen == 1) { // no format width specified; supply default fldfmt[fmtlen++] = '0'; fldfmt[fmtlen++] = '2'; } fldfmt[fmtlen++] = 'd'; fldfmt[fmtlen] = 0; outputValueWithFormat(v, fldfmt, info); } break; case 'd': // day of month with leading zero v = info->dom; v = v % 100; if (fmtlen == 1) // no format width specified; supply default { fldfmt[fmtlen++] = '0'; fldfmt[fmtlen++] = '2'; } fldfmt[fmtlen++] = 'd'; fldfmt[fmtlen] = 0; outputValueWithFormat(v, fldfmt, info); break; case 'e': // day of month with leading space v = info->dom; v = v % 100; if (fmtlen == 1) // no format width specified; supply default { fldfmt[fmtlen++] = '1'; // no leading space, just like Cocoa } fldfmt[fmtlen++] = 'd'; fldfmt[fmtlen] = 0; outputValueWithFormat(v, fldfmt, info); break; case 'F': // milliseconds v = info->mil; if (fmtlen == 1) // no format width specified; supply default { fldfmt[fmtlen++] = '0'; fldfmt[fmtlen++] = '3'; } fldfmt[fmtlen++] = 'd'; fldfmt[fmtlen] = 0; outputValueWithFormat(v, fldfmt, info); break; case 'j': // day of year v = [self dayOfYear]; if (fmtlen == 1) // no format width specified; supply default { fldfmt[fmtlen++] = '0'; fldfmt[fmtlen++] = '3'; } fldfmt[fmtlen++] = 'd'; fldfmt[fmtlen] = 0; outputValueWithFormat(v, fldfmt, info); break; // is it the week-day case 'a': dname = YES; case 'A': dtag = YES; // Day is character string case 'w': { v = [self dayOfWeek]; if (dtag == YES) { NSArray *days; if (dname) days = [LOCALE objectForKey: NSShortWeekDayNameArray]; else days = [LOCALE objectForKey: NSWeekDayNameArray]; if (v < [days count]) { NSString *name; name = [days objectAtIndex: v]; v = [name length]; Grow(info, v); [name getCharacters: info->t + info->offset]; info->offset += v; } else { dtag = NO; } } if (dtag == NO) { if (fmtlen == 1) { // no format width specified; supply default fldfmt[fmtlen++] = '1'; } fldfmt[fmtlen++] = 'd'; fldfmt[fmtlen] = 0; outputValueWithFormat(v, fldfmt, info); } } break; // is it the hour case 'I': twelve = YES; case 'k': if (twelve == NO) hspc = YES; case 'H': v = info->hd; if (twelve == YES) { if (info->hd == 12 || info->hd == 0) { v = 12; } else { v = v % 12; } } if (fmtlen == 1) // no format width specified; supply default { if (hspc == YES) fldfmt[fmtlen++] = '2'; // ensure a leading space else { fldfmt[fmtlen++] = '0'; fldfmt[fmtlen++] = '2'; } } fldfmt[fmtlen++] = 'd'; fldfmt[fmtlen] = 0; if (GSPrivateDefaultsFlag(GSMacOSXCompatible) && hspc == YES) { Grow(info, 2); info->t[info->offset++] = '%'; info->t[info->offset++] = f[i-1]; break; } else outputValueWithFormat(v, fldfmt, info); break; // is it the minute case 'M': v = info->mnd; if (fmtlen == 1) // no format width specified; supply default { fldfmt[fmtlen++] = '0'; fldfmt[fmtlen++] = '2'; } fldfmt[fmtlen++] = 'd'; fldfmt[fmtlen] = 0; outputValueWithFormat(v, fldfmt, info); break; // is it the second case 'S': v = info->sd; if (fmtlen == 1) // no format width specified; supply default { fldfmt[fmtlen++] = '0'; fldfmt[fmtlen++] = '2'; } fldfmt[fmtlen++] = 'd'; fldfmt[fmtlen] = 0; outputValueWithFormat(v, fldfmt, info); break; // Is it the am/pm indicator case 'p': { NSArray *a = [LOCALE objectForKey: NSAMPMDesignation]; NSString *ampm; if (info->hd >= 12) { if ([a count] > 1) ampm = [a objectAtIndex: 1]; else ampm = @"pm"; } else { if ([a count] > 0) ampm = [a objectAtIndex: 0]; else ampm = @"am"; } v = [ampm length]; Grow(info, v); [ampm getCharacters: info->t + info->offset]; info->offset += v; } break; // is it the zone name case 'Z': { NSString *s; s = abbrev(_time_zone, self); v = [s length]; Grow(info, v); [s getCharacters: info->t + info->offset]; info->offset += v; } break; case 'z': { int z; Grow(info, 5); z = offset(_time_zone, self); if (z < 0) { z = -z; info->t[info->offset++] = '-'; } else { info->t[info->offset++] = '+'; } z /= 60; // Convert seconds to minutes. v = z / 60; info->t[info->offset+1] = (v%10) + '0'; v /= 10; info->t[info->offset+0] = (v%10) + '0'; info->offset += 2; v = z % 60; info->t[info->offset+1] = (v%10) + '0'; v /= 10; info->t[info->offset+0] = (v%10) + '0'; info->offset += 2; } break; // Anything else is unknown so just copy default: Grow(info, 2); info->t[info->offset++] = '%'; info->t[info->offset++] = f[i-1]; break; } } else { Grow(info, 1); info->t[info->offset++] = f[i++]; } } if (f != fbuf) { NSZoneFree(NSDefaultMallocZone(), f); } } /** * Returns a string representation of the receiver using the specified * format string and locale dictionary.
* Format specifiers are - * * * %a abbreviated weekday name according to locale * * * %A full weekday name according to locale * * * %b abbreviated month name according to locale * * * %c this is the same as %X %x * * * %B full month name according to locale * * * %d day of month as two digit decimal number (leading zero) * * * %e day of month as decimal number (without leading zero) * * * %F milliseconds (000 to 999) * * * %H hour as a decimal number using 24-hour clock * * * %I hour as a decimal number using 12-hour clock * * * %j day of year as a decimal number * * * %k same as %H with leading space instead of zero * * * %m month as decimal number * * * %M minute as decimal number * * * %p 'am' or 'pm' * * * %S second as decimal number * * * %U week of the current year as decimal number (Sunday first day) * * * %W week of the current year as decimal number (Monday first day) * * * %w day of the week as decimal number (Sunday = 0) * * * %x date formatted according to the locale * * * %X time formatted according to the locale * * * %y year as a decimal number without century (minimum 0) * * * %Y year as a decimal number with century, minimum 0, maximum 9999 * * * %z time zone offset (HHMM) * * * %Z time zone * * * %% literal % character * * * *

NB. If GSMacOSCompatible is set to YES, the %k specifier is not * recognized.

*/ - (NSString*) descriptionWithCalendarFormat: (NSString*)format locale: (NSDictionary*)locale { unichar tbuf[512]; NSString *result; DescriptionInfo info; if (format == nil) format = [LOCALE objectForKey: NSTimeDateFormatString]; GSBreakTime(_seconds_since_ref + offset(_time_zone, self), &info.yd, &info.md, &info.dom, &info.hd, &info.mnd, &info.sd, &info.mil); info.base = tbuf; info.t = tbuf; info.length = sizeof(tbuf)/sizeof(unichar); info.offset = 0; [self _format: format locale: locale info: &info]; result = [NSString stringWithCharacters: info.t length: info.offset]; if (info.t != tbuf) { NSZoneFree(NSDefaultMallocZone(), info.t); } return result; } - (id) copyWithZone: (NSZone*)zone { NSCalendarDate *newDate; if (NSShouldRetainWithZone(self, zone)) { newDate = RETAIN(self); } else { newDate = (NSCalendarDate*)NSCopyObject(self, 0, zone); if (newDate != nil) { if (_calendar_format != cformat) { newDate->_calendar_format = [_calendar_format copyWithZone: zone]; } if (_time_zone != localTZ) { newDate->_time_zone = RETAIN(_time_zone); } } } return newDate; } /** * Returns a description of the receiver using its normal format but with * the specified locale dictionary.
* Calls -descriptionWithCalendarFormat:locale: to do this. */ - (NSString*) descriptionWithLocale: (id)locale { return [self descriptionWithCalendarFormat: _calendar_format locale: locale]; } /** * Returns the format string associated with the receiver.
* See -descriptionWithCalendarFormat:locale: for details. */ - (NSString*) calendarFormat { return _calendar_format; } /** * Sets the format string associated with the receiver.
* Providing a nil argument sets the default calendar format.
* See -descriptionWithCalendarFormat:locale: for details. */ - (void) setCalendarFormat: (NSString *)format { if (format == nil) { format = cformat; } ASSIGNCOPY(_calendar_format, format); } /** * Sets the time zone associated with the receiver.
* Providing a nil argument sets the local time zone. */ - (void) setTimeZone: (NSTimeZone *)aTimeZone { if (aTimeZone == nil) { aTimeZone = localTZ; } ASSIGN(_time_zone, aTimeZone); } /** * Returns the time zone associated with the receiver. */ - (NSTimeZone*) timeZone { return _time_zone; } /** * Returns the time zone detail associated with the receiver. */ - (NSTimeZoneDetail*) timeZoneDetail { NSTimeZoneDetail *detail = [_time_zone timeZoneDetailForDate: self]; return detail; } @end /** * Routines for manipulating Gregorian dates. */ // The following code is based upon the source code in // ``Calendrical Calculations'' by Nachum Dershowitz and Edward M. Reingold, // Software---Practice & Experience, vol. 20, no. 9 (September, 1990), // pp. 899--928. @implementation NSCalendarDate (GregorianDate) /** * Returns the number of the last day of the month in the specified year. */ - (NSInteger) lastDayOfGregorianMonth: (NSInteger)month year: (NSInteger)year { return lastDayOfGregorianMonth(month, year); } /** * Returns the number of days since the start of the era for the specified * day, month, and year. */ - (NSInteger) absoluteGregorianDay: (NSInteger)day month: (NSInteger)month year: (NSInteger)year { return absoluteGregorianDay(day, month, year); } /** * Given a day number since the start of the era, returns the date as a * day, month, and year. */ - (void) gregorianDateFromAbsolute: (NSInteger)d day: (NSInteger *)day month: (NSInteger *)month year: (NSInteger *)year { gregorianDateFromAbsolute(d, day, month, year); } @end /** * Methods present in OpenStep but later removed from MacOS-X. */ @implementation NSCalendarDate (OPENSTEP) - (NSCalendarDate*) dateByAddingYears: (NSInteger)years months: (NSInteger)months days: (NSInteger)days hours: (NSInteger)hours minutes: (NSInteger)minutes seconds: (NSInteger)seconds { NSCalendarDate *c; NSTimeInterval s; NSTimeInterval oldOffset; NSTimeInterval newOffset; NSInteger i, year, month, day, hour, minute, second, mil; /* Apply timezone offset to _seconds_since_ref from GMT to local time, * then break into components in local time zone. */ oldOffset = offset(_time_zone, self); s = _seconds_since_ref + oldOffset; GSBreakTime(s, &year, &month, &day, &hour, &minute, &second, &mil); /* Apply required offsets to get new local time. */ while (years != 0 || months != 0 || days != 0 || hours != 0 || minutes != 0 || seconds != 0) { year += years; years = 0; month += months; months = 0; while (month > 12) { year++; month -= 12; } while (month < 1) { year--; month += 12; } day += days; days = 0; if (day > 28) { i = lastDayOfGregorianMonth(month, year); while (day > i) { day -= i; if (month < 12) { month++; } else { month = 1; year++; } i = lastDayOfGregorianMonth(month, year); } } else { while (day < 1) { if (month == 1) { year--; month = 12; } else { month--; } day += lastDayOfGregorianMonth(month, year); } } hour += hours; hours = 0; days += hour/24; hour %= 24; if (hour < 0) { days--; hour += 24; } minute += minutes; minutes = 0; hours += minute/60; minute %= 60; if (minute < 0) { hours--; minute += 60; } second += seconds; seconds = 0; minutes += second/60; second %= 60; if (second < 0) { minutes--; second += 60; } } /* * Reassemble and apply original timezone offset to get * _seconds_since_ref back to GMT. */ s = GSTime(day, month, year, hour, minute, second, mil); s -= oldOffset; c = [NSCalendarDateClass alloc]; c->_calendar_format = [_calendar_format copy]; c->_time_zone = [_time_zone copy]; c->_seconds_since_ref = s; /* * Adjust date to try to maintain the time of day over * a daylight savings time boundary if necessary. */ newOffset = offset(_time_zone, c); if (newOffset != oldOffset) { NSTimeInterval tmpOffset = newOffset; s -= (newOffset - oldOffset); c->_seconds_since_ref = s; /* * If the date we have lies within a missing hour at a * daylight savings time transition, we use the original * date rather than the adjusted one. */ newOffset = offset(_time_zone, c); if (newOffset == oldOffset) { s += (tmpOffset - oldOffset); c->_seconds_since_ref = s; } } return AUTORELEASE(c); } /** * Returns the number of years, months, days, hours, minutes, and seconds * between the receiver and the given date.
* If date is in the future of the receiver, the returned values will * be negative (or zero), otherwise they are all positive.
* If any of the pointers to return value in is null, the corresponding * value will not be returned, and other return values will be adjusted * accordingly. eg. If a difference of 1 hour was to be returned but * hours is null, then the value returned in minutes will be increased * by 60. */ - (void) years: (NSInteger*)years months: (NSInteger*)months days: (NSInteger*)days hours: (NSInteger*)hours minutes: (NSInteger*)minutes seconds: (NSInteger*)seconds sinceDate: (NSDate*)date { NSCalendarDate *start; NSCalendarDate *end; NSCalendarDate *tmp; int diff; int extra; int sign; NSInteger mil; NSInteger syear, smonth, sday, shour, sminute, ssecond; NSInteger eyear, emonth, eday, ehour, eminute, esecond; /* FIXME What if the two dates are in different time zones? How about daylight savings time? */ if ([date isKindOfClass: NSCalendarDateClass]) { tmp = (NSCalendarDate*)RETAIN(date); } else if ([date isKindOfClass: [NSDate class]]) { tmp = [[NSCalendarDateClass alloc] initWithTimeIntervalSinceReferenceDate: [date timeIntervalSinceReferenceDate]]; } else { tmp = nil; // Avoid compiler warning [NSException raise: NSInvalidArgumentException format: @"%@ invalid date given - %@", NSStringFromSelector(_cmd), date]; } end = (NSCalendarDate*)[self laterDate: tmp]; if (end == self) { start = tmp; sign = 1; } else { start = self; sign = -1; } GSBreakTime(start->_seconds_since_ref + offset(start->_time_zone, start), &syear, &smonth, &sday, &shour, &sminute, &ssecond, &mil); GSBreakTime(end->_seconds_since_ref + offset(end->_time_zone, end), &eyear, &emonth, &eday, &ehour, &eminute, &esecond, &mil); if (esecond < ssecond) { eminute -= 1; esecond += 60; } if (eminute < sminute) { ehour -= 1; eminute += 60; } if (ehour < shour) { eday -= 1; ehour += 24; } if (eday < sday) { emonth -= 1; if (emonth >= 0) { eday += [end lastDayOfGregorianMonth: emonth year: eyear]; } else { eday += 31; } } if (emonth < smonth || (emonth == smonth && eday < sday)) { eyear -= 1; emonth += 12; } /* Calculate year difference and leave any remaining months in 'extra' */ diff = eyear - syear; extra = 0; if (years != 0) { *years = sign*diff; } else { extra += diff*12; } /* Calculate month difference and leave any remaining days in 'extra' */ diff = emonth - smonth + extra; extra = 0; if (months != 0) { *months = sign*diff; } else { while (diff-- > 0) { int tmpmonth = emonth - diff - 1; int tmpyear = eyear; while (tmpmonth < 1) { tmpmonth += 12; tmpyear--; } extra += lastDayOfGregorianMonth(tmpmonth, tmpyear); } } /* Calculate day difference and leave any remaining hours in 'extra' */ diff = eday - sday + extra; extra = 0; if (days != 0) { *days = sign*diff; } else { extra += diff*24; } /* Calculate hour difference and leave any remaining minutes in 'extra' */ diff = ehour - shour + extra; extra = 0; if (hours != 0) { *hours = sign*diff; } else { extra += diff*60; } /* Calculate minute difference and leave any remaining seconds in 'extra' */ diff = eminute - sminute + extra; extra = 0; if (minutes != 0) { *minutes = sign*diff; } else { extra += diff*60; } diff = esecond - ssecond + extra; if (seconds != 0) { *seconds = sign*diff; } RELEASE(tmp); } @end gnustep-base-1.29.0/Source/NSCallBacks.h000066400000000000000000000075271435650067400177160ustar00rootroot00000000000000/* GNUStep callback functions prototypes. * Copyright(C) 1996 Free Software Foundation, Inc. * * Author: Albin L. Jones * Created: Tue Feb 13 23:10:29 EST 1996 * Updated: Tue Feb 13 23:10:29 EST 1996 * Updated: Mon Feb 7 10:25:00 GMT 2000 * Serial: 96.02.13.01 * * This file is part of the GNUstep Base Library. * * 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 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 USA. */ #ifndef __NSCallBacks_h_OBJECTS_INCLUDE #define __NSCallBacks_h_OBJECTS_INCLUDE 1 /**** Included Headers *******************************************************/ #include "Foundation/NSObject.h" #include "Foundation/NSString.h" #if ( (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) ) && HAVE_VISIBILITY_ATTRIBUTE ) #define GS_HIDDEN __attribute__ ((visibility("hidden"))) #else #define GS_HIDDEN #endif /**** Type, Constant, and Macro Definitions **********************************/ /**** Function Prototypes ****************************************************/ /** For `int's **/ NSUInteger _NS_int_hash(void *table, void* i) GS_HIDDEN; BOOL _NS_int_is_equal(void *table, void* i, void* j) GS_HIDDEN; void _NS_int_retain(void *table, void* i) GS_HIDDEN; void _NS_int_release(void *table, void* i) GS_HIDDEN; NSString *_NS_int_describe(void *table, void* i) GS_HIDDEN; /** For owned `void *' **/ NSUInteger _NS_owned_void_p_hash(void *table, void *p) GS_HIDDEN; BOOL _NS_owned_void_p_is_equal(void *table, void *p, void *q) GS_HIDDEN; void _NS_owned_void_p_retain(void *table, void *p) GS_HIDDEN; void _NS_owned_void_p_release(void *table, void *p) GS_HIDDEN; NSString *_NS_owned_void_p_describe(void *table, void *p) GS_HIDDEN; /** For non-retained Objective-C objects **/ NSUInteger _NS_non_retained_id_hash(void *table, id o) GS_HIDDEN; BOOL _NS_non_retained_id_is_equal(void *table, id o, id p) GS_HIDDEN; void _NS_non_retained_id_retain(void *table, id o) GS_HIDDEN; void _NS_non_retained_id_release(void *table, id o) GS_HIDDEN; NSString *_NS_non_retained_id_describe(void *table, id o) GS_HIDDEN; /** For(retainable) objects **/ NSUInteger _NS_id_hash(void *table, id o) GS_HIDDEN; BOOL _NS_id_is_equal(void *table, id o, id p) GS_HIDDEN; void _NS_id_retain(void *table, id o) GS_HIDDEN; void _NS_id_release(void *table, id o) GS_HIDDEN; NSString *_NS_id_describe(void *table, id o) GS_HIDDEN; /** For(non-owned) `void *' **/ NSUInteger _NS_non_owned_void_p_hash(void *table, void *p) GS_HIDDEN; BOOL _NS_non_owned_void_p_is_equal(void *table, void *p, void *q) GS_HIDDEN; void _NS_non_owned_void_p_retain(void *table, void *p) GS_HIDDEN; void _NS_non_owned_void_p_release(void *table, void *p) GS_HIDDEN; NSString *_NS_non_owned_void_p_describe(void *table, void *p) GS_HIDDEN; /** For pointers to structures and `int *' **/ NSUInteger _NS_int_p_hash(void *table, int *p) GS_HIDDEN; BOOL _NS_int_p_is_equal(void *table, int *p, int *q) GS_HIDDEN; void _NS_int_p_retain(void *table, int *p) GS_HIDDEN; void _NS_int_p_release(void *table, int *p) GS_HIDDEN; NSString *_NS_int_p_describe(void *table, int *p) GS_HIDDEN; #endif /* __NSCallBacks_h_OBJECTS_INCLUDE **/ gnustep-base-1.29.0/Source/NSCallBacks.m000066400000000000000000000104641435650067400177150ustar00rootroot00000000000000/** GNUStep callback functions. Implicitly required by the standard. * Copyright(C) 1996 Free Software Foundation, Inc. * * Author: Albin L. Jones * Created: Tue Feb 13 23:10:29 EST 1996 * Updated: Wed Mar 20 19:53:48 EST 1996 * Updated: Mon Feb 7 10:25:00 GMT 2000 * Serial: 96.03.20.02 * * This file is part of the GNUstep Base Library. * * 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 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 NSCallBacks class reference $Date$ $Revision$ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110 USA. */ /**** Included Headers *******************************************************/ #import "common.h" #import "NSCallBacks.h" /**** Type, Constant, and Macro Definitions **********************************/ /**** Function Implementations ***********************************************/ /** For `int's **/ NSUInteger _NS_int_hash(void *table, void* i) { return (uintptr_t)i; } BOOL _NS_int_is_equal(void *table, void* i, void* j) { return (i == j) ? YES : NO; } void _NS_int_retain(void *table, void* i) { return; } void _NS_int_release(void *table, void* i) { return; } NSString * _NS_int_describe(void *table, void* i) { return [NSString stringWithFormat: @"%d", (int)(intptr_t)i]; } /** For owned `void *' **/ NSUInteger _NS_owned_void_p_hash(void *table, void *p) { /* P may be aligned, so we need to compensate. */ return ((uintptr_t)p)/4; } BOOL _NS_owned_void_p_is_equal(void *table, void *p, void *q) { return (p == q) ? YES : NO; } void _NS_owned_void_p_retain(void *table, void *p) { return; } void _NS_owned_void_p_release(void *table, void *p) { if (p != 0) free(p); return; } NSString * _NS_owned_void_p_describe(void *table, void *p) { return [NSString stringWithFormat: @"%#"PRIxPTR, (NSUInteger)p]; } /** For non-retained Objective-C objects **/ NSUInteger _NS_non_retained_id_hash(void *table, id o) { return [o hash]; } BOOL _NS_non_retained_id_is_equal(void *table, id o, id p) { return [o isEqual: p]; } void _NS_non_retained_id_retain(void *table, id o) { return; } void _NS_non_retained_id_release(void *table, id o) { return; } NSString * _NS_non_retained_id_describe(void *table, id o) { return [o description]; } /** For(retainable) objects **/ NSUInteger _NS_id_hash(void *table, id o) { return [o hash]; } BOOL _NS_id_is_equal(void *table, id o, id p) { return [o isEqual: p]; } void _NS_id_retain(void *table, id o) { IF_NO_ARC(RETAIN(o);) return; } void _NS_id_release(void *table, id o) { RELEASE(o); return; } NSString * _NS_id_describe(void *table, id o) { return [o description]; } /** For(non-owned) `void *' **/ NSUInteger _NS_non_owned_void_p_hash(void *table, void *p) { return ((uintptr_t)p)/4; } BOOL _NS_non_owned_void_p_is_equal(void *table, void *p, void *q) { return (p == q) ? YES : NO; } void _NS_non_owned_void_p_retain(void *table, void *p) { return; } void _NS_non_owned_void_p_release(void *table, void *p) { return; } NSString * _NS_non_owned_void_p_describe(void *table, void *p) { return [NSString stringWithFormat: @"%0"PRIxPTR, (NSUInteger)p]; } /** For pointers to structures and `int *' **/ NSUInteger _NS_int_p_hash(void *table, int *p) { return ((uintptr_t)p)/4; } BOOL _NS_int_p_is_equal(void *table, int *p, int *q) { return (p == q) ? YES : NO; } void _NS_int_p_retain(void *table, int *p) { return; } void _NS_int_p_release(void *table, int *p) { return; } NSString * _NS_int_p_describe(void *table, int *p) { /* Is this useful? */ return [NSString stringWithFormat: @"%d(%#"PRIxPTR")", *p, (NSUInteger)p]; } gnustep-base-1.29.0/Source/NSCharacterSet.m000066400000000000000000001120561435650067400204460ustar00rootroot00000000000000/** NSCharacterSet - Character set holder Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. Written by: Adam Fedor Date: Apr 1995 Updates by: Richard Frith-Macdonald This file is part of the GNUstep Base Library. 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 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 USA. NSCharacterSet class reference $Date$ $Revision$ */ #import "common.h" #import "GSPThread.h" #import "Foundation/NSArray.h" #import "Foundation/NSCoder.h" #import "Foundation/NSException.h" #import "Foundation/NSData.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSIndexSet.h" #import "Foundation/NSThread.h" #import "Foundation/NSNotification.h" #import "Foundation/NSCharacterSet.h" #import "Foundation/NSData.h" /* Using an index set to hold a characterset is more space efficient but * on the intel core-2 system I benchmarked on, it made my applications * about 20% slower. * It only makes sense to build base to use index charactersets on machines * with a very low memory (eg PDAs), and possibly not even there. */ //#define GNUSTEP_INDEX_CHARSET 1 #undef GNUSTEP_INDEX_CHARSET #import "NSCharacterSetData.h" #define GSUNICODE_MAX 1114112 #define GSBITMAP_SIZE 8192 #define GSBITMAP_MAX 139264 #ifndef GSSETBIT #define GSSETBIT(a,i) ((a) |= 1<<(i)) #define GSCLRBIT(a,i) ((a) &= ~(1<<(i))) #define GSISSET(a,i) ((a) & (1<<(i))) #endif @interface _GSIndexCharSet : NSCharacterSet { NSMutableIndexSet *indexes; } - (NSIndexSet*) _indexes; - (id) initWithBitmap: (NSData*)d; @end @interface _GSMutableIndexCharSet : NSMutableCharacterSet { NSMutableIndexSet *indexes; } @end @interface NSDataStatic : NSData // Help the compiler @end /* Private class from NSIndexSet.m */ @interface _GSStaticIndexSet : NSIndexSet - (id) _initWithBytes: (const void*)bytes length: (NSUInteger)length; @end @interface NSBitmapCharSet : NSCharacterSet { const unsigned char *_data; unsigned _length; NSData *_obj; unsigned _known; unsigned _present; } - (id) initWithBitmap: (NSData*)bitmap; @end @interface NSMutableBitmapCharSet : NSMutableCharacterSet { unsigned char *_data; unsigned _length; NSMutableData *_obj; unsigned _known; unsigned _present; } - (id) initWithBitmap: (NSData*)bitmap; @end @implementation NSBitmapCharSet - (NSData*) bitmapRepresentation { unsigned i = 17; while (i > 0 && [self hasMemberInPlane: i-1] == NO) { i--; } i *= GSBITMAP_SIZE; if (GSBITMAP_SIZE == i) { /* In the base plane, find the number of used bytes, so we don't * produce a bitmap that is longer than necessary. */ if (_length < i) { i = _length; } while (i > 0 && 0 == _data[i - 1]) { i--; } } if (i < _length) { return [NSData dataWithBytes: _data length: i]; } return _obj; } - (BOOL) characterIsMember: (unichar)aCharacter { unsigned byte = aCharacter/8; if (byte < _length && GSISSET(_data[byte], aCharacter % 8)) { return YES; } return NO; } - (Class) classForCoder { return [self class]; } - (void) dealloc { DESTROY(_obj); [super dealloc]; } - (void) encodeWithCoder: (NSCoder*)aCoder { [aCoder encodeObject: [self bitmapRepresentation]]; } - (BOOL) hasMemberInPlane: (uint8_t)aPlane { unsigned bit; if (aPlane > 16) { return NO; } bit = (1 << aPlane); if (_known & bit) { if (_present & bit) { return YES; } else { return NO; } } if (aPlane * GSBITMAP_SIZE < _length) { unsigned i = GSBITMAP_SIZE * aPlane; unsigned e = GSBITMAP_SIZE * (aPlane + 1); while (i < e) { if (_data[i] != 0) { _present |= bit; _known |= bit; return YES; } i++; } } _present &= ~bit; _known |= bit; return NO; } - (id) init { return [self initWithBitmap: nil]; } - (id) initWithBitmap: (NSData*)bitmap { unsigned length = [bitmap length]; if (length > GSBITMAP_MAX) { NSLog(@"attempt to initialize character set with invalid bitmap"); [self dealloc]; return nil; } if (bitmap == nil) { bitmap = [NSData data]; } ASSIGNCOPY(_obj, bitmap); _length = length; _data = [_obj bytes]; return self; } - (id) initWithCoder: (NSCoder*)aCoder { NSData *rep; rep = [aCoder decodeObject]; self = [self initWithBitmap: rep]; return self; } - (BOOL) longCharacterIsMember: (UTF32Char)aCharacter { unsigned byte = aCharacter/8; if (aCharacter >= GSUNICODE_MAX) { [NSException raise: NSInvalidArgumentException format: @"[%@-%@] argument (0x%08x) is too large", NSStringFromClass([self class]), NSStringFromSelector(_cmd), aCharacter]; } if (byte < _length && GSISSET(_data[byte], aCharacter % 8)) { return YES; } return NO; } @end @implementation NSMutableBitmapCharSet + (void) initialize { if (self == [NSMutableBitmapCharSet class]) { [self setVersion: 1]; GSObjCAddClassBehavior(self, [NSBitmapCharSet class]); } } - (void) addCharactersInRange: (NSRange)aRange { NSUInteger i; NSUInteger m; NSUInteger b; m = NSMaxRange(aRange); if (m > GSUNICODE_MAX) { [NSException raise:NSInvalidArgumentException format:@"Specified range exceeds character set"]; /* NOT REACHED */ } else if (m < 1) { return; } /* Make space if needed. * Use exact size if we have nothing beyond the base plane, * otherwise round up to a plane boundary. */ b = (m - 1) / 8; if (b >= _length) { if (b < GSBITMAP_SIZE) { _length = b + 1; } else { while (b >= _length) { _length += GSBITMAP_SIZE; } } [_obj setLength: _length]; _data = [_obj mutableBytes]; } /* Fill the first byte in the range. */ i = aRange.location; b = i / 8; while (i % 8 != 0 && i < m) { GSSETBIT(_data[b], i % 8); i++; } /* Set any complete bytes in the range. */ b = (m - i) / 8; if (b > 0) { memset(&_data[i / 8], 0xff, b); i += b * 8; } /* Partial set of any bits needed in the last byte. */ b = i / 8; while (i < m) { GSSETBIT(_data[b], i % 8); i++; } _known = 0; // Invalidate cache } - (void) addCharactersInString: (NSString*)aString { unsigned length; if (!aString) { [NSException raise:NSInvalidArgumentException format:@"Adding characters from nil string"]; /* NOT REACHED */ } length = [aString length]; if (length > 0) { NSUInteger i; unsigned max = _length; unichar (*get)(id, SEL, NSUInteger); get = (unichar (*)(id, SEL, NSUInteger)) [aString methodForSelector: @selector(characterAtIndex:)]; /* Determine size of bitmap needed. */ for (i = 0; i < length; i++) { unichar letter; unichar second; unsigned byte; letter = (*get)(aString, @selector(characterAtIndex:), i); // Convert a surrogate pair if necessary if (letter >= 0xd800 && letter <= 0xdbff && i < length-1 && (second = (*get)(aString, @selector(characterAtIndex:), i+1)) >= 0xdc00 && second <= 0xdfff) { i++; letter = ((letter - 0xd800) << 10) + (second - 0xdc00) + 0x0010000; } byte = letter/8; if (byte >= max) { max = byte; } } /* Make space if needed. * Use exact size if we have nothing beyond the base plane, * otherwise round up to a plane boundary. */ if (max >= _length) { if (max < GSBITMAP_SIZE) { _length = max + 1; } else { while (max >= _length) { _length += GSBITMAP_SIZE; } } [_obj setLength: _length]; _data = [_obj mutableBytes]; } for (i = 0; i < length; i++) { unichar letter; unichar second; unsigned byte; letter = (*get)(aString, @selector(characterAtIndex:), i); // Convert a surrogate pair if necessary if (letter >= 0xd800 && letter <= 0xdbff && i < length-1 && (second = (*get)(aString, @selector(characterAtIndex:), i+1)) >= 0xdc00 && second <= 0xdfff) { i++; letter = ((letter - 0xd800) << 10) + (second - 0xdc00) + 0x0010000; } byte = letter/8; GSSETBIT(_data[byte], letter % 8); } } _known = 0; // Invalidate cache } - (NSData*) bitmapRepresentation { unsigned i = 17; while (i > 0 && [self hasMemberInPlane: i-1] == NO) { i--; } i *= GSBITMAP_SIZE; if (GSBITMAP_SIZE == i) { /* In the base plane, find the number of used bytes, so we don't * produce a bitmap that is longer than necessary. */ if (_length < i) { i = _length; } while (i > 0 && 0 == _data[i - 1]) { i--; } } return [NSData dataWithBytes: _data length: i]; } - (void) formIntersectionWithCharacterSet: (NSCharacterSet *)otherSet { unsigned i; NSData *otherData = [otherSet bitmapRepresentation]; unsigned other_length = [otherData length]; const unsigned char *other_bytes = [otherData bytes]; if (_length > other_length) { [_obj setLength: other_length]; _length = other_length; _data = [_obj mutableBytes]; } for (i = 0; i < _length; i++) { _data[i] = (_data[i] & other_bytes[i]); } _known = 0; // Invalidate cache } - (void) formUnionWithCharacterSet: (NSCharacterSet*)otherSet { unsigned i; NSData *otherData = [otherSet bitmapRepresentation]; unsigned other_length = [otherData length]; const unsigned char *other_bytes = [otherData bytes]; if (other_length > _length) { [_obj setLength: other_length]; _length = other_length; _data = [_obj mutableBytes]; } for (i = 0; i < other_length; i++) { _data[i] = (_data[i] | other_bytes[i]); } _known = 0; // Invalidate cache } - (id) initWithBitmap: (NSData*)bitmap { unsigned length = [bitmap length]; id tmp; if (length > GSBITMAP_MAX) { NSLog(@"attempt to initialize character set with invalid bitmap"); [self dealloc]; return nil; } if (bitmap == nil) { tmp = [NSMutableData new]; } else { tmp = [bitmap mutableCopy]; } DESTROY(_obj); _obj = tmp; _length = length; _data = [_obj mutableBytes]; _known = 0; // Invalidate cache return self; } - (void) invert { unsigned i; if (_length < GSBITMAP_MAX) { [_obj setLength: GSBITMAP_MAX]; _length = GSBITMAP_MAX; _data = [_obj mutableBytes]; } for (i = 0; i < _length; i++) { _data[i] = ~_data[i]; } _known = 0; // Invalidate cache } - (void) removeCharactersInRange: (NSRange)aRange { unsigned i; unsigned limit = NSMaxRange(aRange); if (NSMaxRange(aRange) > GSUNICODE_MAX) { [NSException raise:NSInvalidArgumentException format:@"Specified range exceeds character set"]; /* NOT REACHED */ } if (limit > _length * 8) { limit = _length * 8; } for (i = aRange.location; i < limit; i++) { GSCLRBIT(_data[i/8], i % 8); } _known = 0; // Invalidate cache } - (void) removeCharactersInString: (NSString*)aString { unsigned length; if (!aString) { [NSException raise:NSInvalidArgumentException format:@"Removing characters from nil string"]; /* NOT REACHED */ } length = [aString length]; if (length > 0) { NSUInteger i; unichar (*get)(id, SEL, NSUInteger); get = (unichar (*)(id, SEL, NSUInteger)) [aString methodForSelector: @selector(characterAtIndex:)]; for (i = 0; i < length; i++) { unichar letter; unichar second; unsigned byte; letter = (*get)(aString, @selector(characterAtIndex:), i); // Convert a surrogate pair if necessary if (letter >= 0xd800 && letter <= 0xdbff && i < length-1 && (second = (*get)(aString, @selector(characterAtIndex:), i+1)) >= 0xdc00 && second <= 0xdfff) { i++; letter = ((letter - 0xd800) << 10) + (second - 0xdc00) + 0x0010000; } byte = letter/8; if (byte < _length) { GSCLRBIT(_data[byte], letter % 8); } } } _known = 0; // Invalidate cache } @end /* A simple array for caching standard bitmap sets */ #define MAX_STANDARD_SETS 21 static NSCharacterSet *cache_set[MAX_STANDARD_SETS]; static Class abstractClass = nil; static Class abstractMutableClass = nil; static Class concreteClass = nil; static Class concreteMutableClass = nil; #if defined(GNUSTEP_INDEX_CHARSET) @interface _GSStaticCharSet : _GSIndexCharSet { int _index; } @end @implementation _GSStaticCharSet - (Class) classForCoder { return abstractClass; } - (void) encodeWithCoder: (NSCoder*)aCoder { [aCoder encodeValueOfObjCType: @encode(int) at: &_index]; } - (id) init { DESTROY(self); return nil; } - (id) initWithBitmap: (NSData*)bitmap number: (int)number { _index = number; indexes = [[_GSStaticIndexSet alloc] _initWithBytes: [bitmap bytes] length: [bitmap length]]; return self; } @end #else /* GNUSTEP_INDEX_CHARSET */ @interface _GSStaticCharSet : NSCharacterSet { const unsigned char *_data; unsigned _length; NSData *_obj; unsigned _known; unsigned _present; int _index; } @end @implementation _GSStaticCharSet + (void) initialize { GSObjCAddClassBehavior(self, [NSBitmapCharSet class]); } - (Class) classForCoder { return abstractClass; } - (void) encodeWithCoder: (NSCoder*)aCoder { [aCoder encodeValueOfObjCType: @encode(int) at: &_index]; } - (id) init { DESTROY(self); return nil; } - (id) initWithBitmap: (NSData*)bitmap number: (int)number { if ((self = (_GSStaticCharSet*)[(NSBitmapCharSet*)self initWithBitmap: bitmap]) != nil) { _index = number; } return self; } @end #endif /* GNUSTEP_INDEX_CHARSET */ @implementation NSCharacterSet + (void) initialize { static BOOL beenHere = NO; if (beenHere == NO) { abstractClass = [NSCharacterSet class]; abstractMutableClass = [NSMutableCharacterSet class]; #if defined(GNUSTEP_INDEX_CHARSET) concreteClass = [_GSIndexCharSet class]; concreteMutableClass = [_GSMutableIndexCharSet class]; #else concreteClass = [NSBitmapCharSet class]; concreteMutableClass = [NSMutableBitmapCharSet class]; #endif beenHere = YES; } } /** * Creat and cache (or retrieve from cache) a characterset * using static bitmap data. * Return nil if no data is supplied and the cache is empty. */ + (NSCharacterSet*) _staticSet: (const void*)bytes length: (unsigned)length number: (int)number { static gs_mutex_t cache_lock = GS_MUTEX_INIT_STATIC; GS_MUTEX_LOCK(cache_lock); if (cache_set[number] == nil && bytes != 0) { NSData *bitmap; bitmap = [[NSDataStatic alloc] initWithBytesNoCopy: (void*)bytes length: length freeWhenDone: NO]; cache_set[number] = [[_GSStaticCharSet alloc] initWithBitmap: bitmap number: number]; [[NSObject leakAt: &cache_set[number]] release]; RELEASE(bitmap); } GS_MUTEX_UNLOCK(cache_lock); return cache_set[number]; } + (id) alphanumericCharacterSet { return [self _staticSet: alphanumericCharSet length: sizeof(alphanumericCharSet) number: 0]; } + (id) capitalizedLetterCharacterSet { return [self _staticSet: titlecaseLetterCharSet length: sizeof(titlecaseLetterCharSet) number: 13]; } + (id) controlCharacterSet { return [self _staticSet: controlCharSet length: sizeof(controlCharSet) number: 1]; } + (id) decimalDigitCharacterSet { return [self _staticSet: decimalDigitCharSet length: sizeof(decimalDigitCharSet) number: 2]; } + (id) decomposableCharacterSet { return [self _staticSet: decomposableCharSet length: sizeof(decomposableCharSet) number: 3]; } + (id) illegalCharacterSet { return [self _staticSet: illegalCharSet length: sizeof(illegalCharSet) number: 4]; } + (id) letterCharacterSet { return [self _staticSet: letterCharSet length: sizeof(letterCharSet) number: 5]; } + (id) lowercaseLetterCharacterSet { return [self _staticSet: lowercaseLetterCharSet length: sizeof(lowercaseLetterCharSet) number: 6]; } + (id) newlineCharacterSet { return [self _staticSet: newlineCharSet length: sizeof(newlineCharSet) number: 14]; } + (id) nonBaseCharacterSet { return [self _staticSet: nonBaseCharSet length: sizeof(nonBaseCharSet) number: 7]; } + (id) punctuationCharacterSet { return [self _staticSet: punctuationCharSet length: sizeof(punctuationCharSet) number: 8]; } + (id) symbolCharacterSet { return [self _staticSet: symbolAndOperatorCharSet length: sizeof(symbolAndOperatorCharSet) number: 9]; } // FIXME ... deprecated ... remove after next release. + (id) symbolAndOperatorCharacterSet { GSOnceMLog(@"symbolAndOperatorCharacterSet is deprecated ... use symbolCharacterSet"); return [self _staticSet: symbolAndOperatorCharSet length: sizeof(symbolAndOperatorCharSet) number: 9]; } + (id) uppercaseLetterCharacterSet { return [self _staticSet: uppercaseLetterCharSet length: sizeof(uppercaseLetterCharSet) number: 10]; } + (id) whitespaceAndNewlineCharacterSet { return [self _staticSet: whitespaceAndNlCharSet length: sizeof(whitespaceAndNlCharSet) number: 11]; } + (id) whitespaceCharacterSet { return [self _staticSet: whitespaceCharSet length: sizeof(whitespaceCharSet) number: 12]; } + (id) characterSetWithBitmapRepresentation: (NSData*)data { return AUTORELEASE([[concreteClass alloc] initWithBitmap: data]); } + (id) characterSetWithCharactersInString: (NSString*)aString { NSMutableCharacterSet *ms; NSCharacterSet *cs; ms = [NSMutableCharacterSet new]; [ms addCharactersInString: aString]; cs = [ms copy]; RELEASE(ms); return AUTORELEASE(cs); } + (id) characterSetWithRange: (NSRange)aRange { NSMutableCharacterSet *ms; NSCharacterSet *cs; ms = [NSMutableCharacterSet new]; [ms addCharactersInRange: aRange]; cs = [ms copy]; RELEASE(ms); return AUTORELEASE(cs); } + (id) characterSetWithContentsOfFile: (NSString*)aFile { if ([@"bitmap" isEqual: [aFile pathExtension]]) { NSData *bitmap = [NSData dataWithContentsOfFile: aFile]; return [self characterSetWithBitmapRepresentation: bitmap]; } else return nil; } + (id) URLFragmentAllowedCharacterSet { return [self _staticSet: URLFragmentAllowedCharSet length: sizeof(URLFragmentAllowedCharSet) number: 15]; } + (id) URLPasswordAllowedCharacterSet { return [self _staticSet: URLPasswordAllowedCharSet length: sizeof(URLPasswordAllowedCharSet) number: 16]; } + (id) URLPathAllowedCharacterSet { return [self _staticSet: URLPathAllowedCharSet length: sizeof(URLPathAllowedCharSet) number: 17]; } + (id) URLQueryAllowedCharacterSet { return [self _staticSet: URLQueryAllowedCharSet length: sizeof(URLQueryAllowedCharSet) number: 18]; } + (id) URLUserAllowedCharacterSet { return [self _staticSet: URLUserAllowedCharSet length: sizeof(URLUserAllowedCharSet) number: 19]; } + (id) URLHostAllowedCharacterSet { return [self _staticSet: URLHostAllowedCharSet length: sizeof(URLHostAllowedCharSet) number: 20]; } - (NSData*) bitmapRepresentation { BOOL (*imp)(id, SEL, unichar); NSMutableData *m; unsigned char *p; unsigned end; unsigned i; imp = (BOOL (*)(id,SEL,unichar)) [self methodForSelector: @selector(characterIsMember:)]; for (end = 0xffff; end > 0; end--) { if (imp(self, @selector(characterIsMember:), end) == YES) { break; } } m = [NSMutableData dataWithLength: end / 8 + 1]; p = (unsigned char*)[m mutableBytes]; for (i = 0; i <= end; i++) { if (imp(self, @selector(characterIsMember:), i) == YES) { GSSETBIT(p[i/8], i % 8); } } return m; } - (BOOL) characterIsMember: (unichar)aCharacter { [self subclassResponsibility: _cmd]; return 0; } - (id) copyWithZone: (NSZone*)zone { if (NSShouldRetainWithZone(self, zone)) { return RETAIN(self); } else { id obj; obj = [concreteClass allocWithZone: zone]; obj = [obj initWithBitmap: [self bitmapRepresentation]]; return obj; } } - (void) encodeWithCoder: (NSCoder*)aCoder { } - (BOOL) hasMemberInPlane: (uint8_t)aPlane { if (aPlane == 0) { return YES; } return NO; } - (id) init { if (object_getClass(self) == abstractClass) { id obj; obj = [concreteClass allocWithZone: [self zone]]; obj = [obj initWithBitmap: nil]; DESTROY(self); self = obj; } return self; } - (id) initWithCoder: (NSCoder*)aCoder { if ([self class] == abstractClass) { int index; /* * Abstract class returns characterset from cache. */ DESTROY(self); [aCoder decodeValueOfObjCType: @encode(int) at: &index]; self = RETAIN([abstractClass _staticSet: 0 length: 0 number: index]); } else { } return self; } - (NSCharacterSet*) invertedSet { NSMutableCharacterSet *m = [self mutableCopy]; NSCharacterSet *c; [m invert]; c = [m copy]; RELEASE(m); return AUTORELEASE(c); } - (BOOL) isEqual: (id)anObject { if (anObject == self) { return YES; } if ([anObject isKindOfClass: abstractClass]) { unsigned i; unsigned p; BOOL (*rImp)(id, SEL, unichar); BOOL (*oImp)(id, SEL, unichar); rImp = (BOOL (*)(id,SEL,unichar)) [self methodForSelector: @selector(characterIsMember:)]; oImp = (BOOL (*)(id,SEL,unichar)) [anObject methodForSelector: @selector(characterIsMember:)]; for (p = 0; p <= 16; p++) { if ([self hasMemberInPlane: p] == YES) { if ([anObject hasMemberInPlane: p] == YES) { for (i = 0; i <= 0xffff; i++) { if (rImp(self, @selector(characterIsMember:), i) != oImp(anObject, @selector(characterIsMember:), i)) { return NO; } } } else { return NO; } } else { if ([anObject hasMemberInPlane: p] == YES) { return NO; } } } return YES; } return NO; } - (BOOL) isSupersetOfSet: (NSCharacterSet*)aSet { NSMutableCharacterSet *m = [self mutableCopy]; BOOL superset; [m formUnionWithCharacterSet: aSet]; superset = [self isEqual: m]; RELEASE(m); return superset; } - (BOOL) longCharacterIsMember: (UTF32Char)aCharacter { int plane = (aCharacter >> 16); if (aCharacter >= GSUNICODE_MAX) { [NSException raise: NSInvalidArgumentException format: @"[%@-%@] argument (0x%08x) is too large", NSStringFromClass([self class]), NSStringFromSelector(_cmd), aCharacter]; } if (plane == 0) { unichar u = (unichar)(aCharacter & 0xffff); return [self characterIsMember: u]; } else { return NO; } } - (id) mutableCopyWithZone: (NSZone*)zone { NSData *bitmap; bitmap = [self bitmapRepresentation]; return [[concreteMutableClass allocWithZone: zone] initWithBitmap: bitmap]; } @end @implementation NSMutableCharacterSet /* Override this from NSCharacterSet to create the correct class */ + (id) characterSetWithBitmapRepresentation: (NSData*)data { return AUTORELEASE([[concreteMutableClass alloc] initWithBitmap: data]); } + (id) alphanumericCharacterSet { return AUTORELEASE([[abstractClass performSelector: _cmd] mutableCopy]); } + (id) capitalizedLetterCharacterSet { return AUTORELEASE([[abstractClass performSelector: _cmd] mutableCopy]); } + (id) controlCharacterSet { return AUTORELEASE([[abstractClass performSelector: _cmd] mutableCopy]); } + (id) decimalDigitCharacterSet { return AUTORELEASE([[abstractClass performSelector: _cmd] mutableCopy]); } + (id) decomposableCharacterSet { return AUTORELEASE([[abstractClass performSelector: _cmd] mutableCopy]); } + (id) illegalCharacterSet { return AUTORELEASE([[abstractClass performSelector: _cmd] mutableCopy]); } + (id) letterCharacterSet { return AUTORELEASE([[abstractClass performSelector: _cmd] mutableCopy]); } + (id) lowercaseLetterCharacterSet { return AUTORELEASE([[abstractClass performSelector: _cmd] mutableCopy]); } + (id) newlineCharacterSet { return AUTORELEASE([[abstractClass performSelector: _cmd] mutableCopy]); } + (id) nonBaseCharacterSet { return AUTORELEASE([[abstractClass performSelector: _cmd] mutableCopy]); } + (id) punctuationCharacterSet { return AUTORELEASE([[abstractClass performSelector: _cmd] mutableCopy]); } + (id) symbolCharacterSet { return AUTORELEASE([[abstractClass performSelector: _cmd] mutableCopy]); } // FIXME ... deprecated ... remove after next release. + (id) symbolAndOperatorCharacterSet { return AUTORELEASE([[abstractClass performSelector: _cmd] mutableCopy]); } + (id) uppercaseLetterCharacterSet { return AUTORELEASE([[abstractClass performSelector: _cmd] mutableCopy]); } + (id) whitespaceAndNewlineCharacterSet { return AUTORELEASE([[abstractClass performSelector: _cmd] mutableCopy]); } + (id) whitespaceCharacterSet { return AUTORELEASE([[abstractClass performSelector: _cmd] mutableCopy]); } + (id) URLFragmentAllowedCharacterSet { return AUTORELEASE([[abstractClass performSelector: _cmd] mutableCopy]); } + (id) URLHostAllowedCharacterSet { return AUTORELEASE([[abstractClass performSelector: _cmd] mutableCopy]); } + (id) URLPasswordAllowedCharacterSet { return AUTORELEASE([[abstractClass performSelector: _cmd] mutableCopy]); } + (id) URLPathAllowedCharacterSet { return AUTORELEASE([[abstractClass performSelector: _cmd] mutableCopy]); } + (id) URLQueryAllowedCharacterSet { return AUTORELEASE([[abstractClass performSelector: _cmd] mutableCopy]); } + (id) URLUserAllowedCharacterSet { return AUTORELEASE([[abstractClass performSelector: _cmd] mutableCopy]); } + (id) characterSetWithCharactersInString: (NSString*)aString { NSMutableCharacterSet *ms; ms = [abstractMutableClass new]; [ms addCharactersInString: aString]; return AUTORELEASE(ms); } + (id) characterSetWithRange: (NSRange)aRange { NSMutableCharacterSet *ms; ms = [abstractMutableClass new]; [ms addCharactersInRange: aRange]; return AUTORELEASE(ms); } - (void) addCharactersInRange: (NSRange)aRange { [self subclassResponsibility: _cmd]; } - (void) addCharactersInString: (NSString*)aString { [self subclassResponsibility: _cmd]; } - (id) copyWithZone: (NSZone*)zone { NSData *bitmap; bitmap = [self bitmapRepresentation]; return [[concreteClass allocWithZone: zone] initWithBitmap: bitmap]; } - (void) formIntersectionWithCharacterSet: (NSCharacterSet*)otherSet { [self subclassResponsibility: _cmd]; } - (void) formUnionWithCharacterSet: (NSCharacterSet*)otherSet { [self subclassResponsibility: _cmd]; } - (id) init { if (object_getClass(self) == abstractMutableClass) { id obj; obj = [concreteMutableClass allocWithZone: [self zone]]; obj = [obj initWithBitmap: nil]; DESTROY(self); self = obj; } return self; } - (id) initWithBitmap: (NSData*)bitmap { if (object_getClass(self) == abstractMutableClass) { id obj; obj = [concreteMutableClass allocWithZone: [self zone]]; obj = [obj initWithBitmap: bitmap]; DESTROY(self); self = obj; } return self; } - (void) invert { [self subclassResponsibility: _cmd]; } - (void) removeCharactersInRange: (NSRange)aRange { [self subclassResponsibility: _cmd]; } - (void) removeCharactersInString: (NSString*)aString { [self subclassResponsibility: _cmd]; } @end /* Below is an experimental implementation of a mutable character set * implemented in terms of an NSMutableIndexSet. This should be much * smaller than a bitmap representation for normal charactersets. */ @interface NSIndexSet (NSCharacterSet) - (NSUInteger) _gapGreaterThanIndex: (NSUInteger)anIndex; @end @implementation _GSIndexCharSet - (NSData*) bitmapRepresentation { NSMutableBitmapCharSet *tmp; NSData *result; NSUInteger index = 0; tmp = [NSMutableBitmapCharSet new]; while ((index = [indexes indexGreaterThanOrEqualToIndex: index]) != NSNotFound) { NSRange r; r.location = index; index = [indexes _gapGreaterThanIndex: index]; if (index == NSNotFound) { r.length = 1; } else { r.length = index - r.location; } [tmp addCharactersInRange: r]; index = NSMaxRange(r); } result = AUTORELEASE(RETAIN([tmp bitmapRepresentation])); RELEASE(tmp); return result; } - (BOOL) characterIsMember: (unichar)aCharacter { return [indexes containsIndex: (int)aCharacter]; } - (Class) classForCoder { return [NSBitmapCharSet class]; } - (void) dealloc { DESTROY(indexes); [super dealloc]; } - (void) encodeWithCoder: (NSCoder*)aCoder { [aCoder encodeObject: [self bitmapRepresentation]]; } - (BOOL) hasMemberInPlane: (uint8_t)aPlane { NSUInteger found; found = [indexes indexGreaterThanOrEqualToIndex: 0x10000 * aPlane]; if (found != NSNotFound && found < 0x10000 * (aPlane + 1)) { return YES; } return NO; } - (NSIndexSet*) _indexes { return indexes; } - (id) init { return [self initWithBitmap: nil]; } - (id) initWithBitmap: (NSData*)bitmap { const unsigned char *bytes = [bitmap bytes]; unsigned length = [bitmap length]; unsigned index = 0; unsigned i; NSRange r; BOOL findingLocation = YES; r.location = 0; indexes = [NSMutableIndexSet new]; for (i = 0; i < length; i++) { unsigned char byte = bytes[i]; if (byte == 0) { if (findingLocation == NO) { r.length = index - r.location; [indexes addIndexesInRange: r]; findingLocation = YES; } index += 8; } else if (byte == 0xff) { if (findingLocation == YES) { r.location = index; findingLocation = NO; } index += 8; } else { unsigned int bit; for (bit = 1; bit & 0xff; bit <<= 1) { if ((byte & bit) == 0) { if (findingLocation == NO) { r.length = index - r.location; [indexes addIndexesInRange: r]; findingLocation = YES; } } else { if (findingLocation == YES) { r.location = index; findingLocation = NO; } } index++; } } } if (findingLocation == NO) { r.length = index - r.location; [indexes addIndexesInRange: r]; } return self; } - (id) initWithCoder: (NSCoder*)aCoder { NSData *rep; rep = [aCoder decodeObject]; self = [self initWithBitmap: rep]; return self; } - (BOOL) longCharacterIsMember: (UTF32Char)aCharacter { return [indexes containsIndex: (int)aCharacter]; } @end @implementation _GSMutableIndexCharSet + (void) initialize { if (self == [_GSMutableIndexCharSet class]) { [self setVersion: 1]; GSObjCAddClassBehavior(self, [_GSIndexCharSet class]); } } - (void) addCharactersInRange: (NSRange)aRange { if (NSMaxRange(aRange) > GSUNICODE_MAX) { [NSException raise:NSInvalidArgumentException format:@"Specified range exceeds character set"]; /* NOT REACHED */ } [indexes addIndexesInRange: aRange]; } - (void) addCharactersInString: (NSString*)aString { unsigned length; if (!aString) { [NSException raise:NSInvalidArgumentException format:@"Adding characters from nil string"]; /* NOT REACHED */ } length = [aString length]; if (length > 0) { NSUInteger i; unichar (*get)(id, SEL, NSUInteger); get = (unichar (*)(id, SEL, NSUInteger)) [aString methodForSelector: @selector(characterAtIndex:)]; for (i = 0; i < length; i++) { unichar letter; unichar second; letter = (*get)(aString, @selector(characterAtIndex:), i); // Convert a surrogate pair if necessary if (letter >= 0xd800 && letter <= 0xdbff && i < length-1 && (second = (*get)(aString, @selector(characterAtIndex:), i+1)) >= 0xdc00 && second <= 0xdfff) { i++; letter = ((letter - 0xd800) << 10) + (second - 0xdc00) + 0x0010000; } [indexes addIndexesInRange: NSMakeRange(letter, 1)]; } } } - (Class) classForCoder { return [NSMutableBitmapCharSet class]; } - (void) formIntersectionWithCharacterSet: (NSCharacterSet *)otherSet { NSIndexSet *otherIndexes; NSUInteger index = 0; NSUInteger i0; NSUInteger i1; if ([otherSet isKindOfClass: [_GSIndexCharSet class]] == YES) { otherIndexes = [(_GSIndexCharSet*)otherSet _indexes]; } else { _GSIndexCharSet *tmp; tmp = [[_GSIndexCharSet alloc] initWithBitmap: [otherSet bitmapRepresentation]]; otherIndexes = AUTORELEASE(RETAIN([tmp _indexes])); RELEASE(tmp); } /* Find first index in each set. */ i0 = [indexes indexGreaterThanOrEqualToIndex: 0]; i1 = [otherIndexes indexGreaterThanOrEqualToIndex: 0]; /* Loop until there are no more indexes to process in the set and * the intersection operation has therefore completed. */ while (i0 != NSNotFound) { if (i1 == NSNotFound) { /* No more indexes in other set ... remove everything from the * last gap onwards, and finish. */ [indexes removeIndexesInRange: NSMakeRange(index, NSNotFound-index)]; break; } if (i1 > i0) { /* Indexes in other set start after this set ... so remove any * from the last gap to the index in the other set. */ [indexes removeIndexesInRange: NSMakeRange(index, i1 - index)]; index = i1; } else { index = i0; } /* Find the next gap in each set, and set our gap index to the * lower of the two. */ i0 = [indexes _gapGreaterThanIndex: index]; i1 = [otherIndexes _gapGreaterThanIndex: index]; index = i0; if (i1 < i0) { index = i1; } /* Find the next index in each set so wer can loop round and * do it all again. */ i0 = [indexes indexGreaterThanIndex: i0]; i1 = [otherIndexes indexGreaterThanIndex: i1]; } } - (void) formUnionWithCharacterSet: (NSCharacterSet*)otherSet { NSIndexSet *otherIndexes; NSUInteger index; if ([otherSet isKindOfClass: [_GSIndexCharSet class]] == YES) { otherIndexes = [(_GSIndexCharSet*)otherSet _indexes]; } else { _GSIndexCharSet *tmp; tmp = [[_GSIndexCharSet alloc] initWithBitmap: [otherSet bitmapRepresentation]]; otherIndexes = AUTORELEASE(RETAIN([tmp _indexes])); RELEASE(tmp); } index = [otherIndexes indexGreaterThanOrEqualToIndex: 0]; while (index != NSNotFound) { NSRange r; r.location = index; index = [otherIndexes _gapGreaterThanIndex: index]; r.length = index - r.location; [indexes addIndexesInRange: r]; index = [otherIndexes indexGreaterThanOrEqualToIndex: index]; } } - (void) invert { NSMutableIndexSet *tmp; NSUInteger index; tmp = [NSMutableIndexSet new]; /* Locate the start of the first gap */ if ([indexes containsIndex: 0] == YES) { index = [indexes _gapGreaterThanIndex: 0]; } else { index = 0; } while (index != NSNotFound) { NSRange r; r.location = index; index = [indexes indexGreaterThanIndex: index]; if (index == NSNotFound) { /* No more indexes, so we have a gap to the end of all * unicode characters which we can invert. */ index = GSUNICODE_MAX; } r.length = index - r.location; [tmp addIndexesInRange: r]; index = [indexes _gapGreaterThanIndex: NSMaxRange(r) - 1]; } ASSIGN(indexes, tmp); RELEASE(tmp); } - (void) removeCharactersInRange: (NSRange)aRange { if (NSMaxRange(aRange) > GSUNICODE_MAX) { [NSException raise:NSInvalidArgumentException format:@"Specified range exceeds character set"]; /* NOT REACHED */ } [indexes removeIndexesInRange: aRange]; } - (void) removeCharactersInString: (NSString*)aString { unsigned length; if (!aString) { [NSException raise:NSInvalidArgumentException format:@"Removing characters from nil string"]; /* NOT REACHED */ } length = [aString length]; if (length > 0) { NSUInteger i; unichar (*get)(id, SEL, NSUInteger); get = (unichar (*)(id, SEL, NSUInteger)) [aString methodForSelector: @selector(characterAtIndex:)]; for (i = 0; i < length; i++) { unichar letter; unichar second; letter = (*get)(aString, @selector(characterAtIndex:), i); // Convert a surrogate pair if necessary if (letter >= 0xd800 && letter <= 0xdbff && i < length-1 && (second = (*get)(aString, @selector(characterAtIndex:), i+1)) >= 0xdc00 && second <= 0xdfff) { i++; letter = ((letter - 0xd800) << 10) + (second - 0xdc00) + 0x0010000; } [indexes removeIndexesInRange: NSMakeRange(letter, 1)]; } } } @end gnustep-base-1.29.0/Source/NSCharacterSetData.h000066400000000000000000251705751435650067400212540ustar00rootroot00000000000000/* * THIS FILE WAS GENERATED AUTOMATICALLY BY data2header.m * PLEASE DO NOT EDIT IT DIRECTLY. * You can find data2header.m at * http://svn.gna.org/viewcvs/gnustep/tools/charsets/ * The characterset rule tables for Unicode handling are * really rather large, so the bitmaps are converted into * constant data compiled into the GNUstep base library * and are therefore shared between all running GNUstep * applications, reducing the overall memory usage of a * gnustep system and speeding up startup of GNUstep * processes. */ #if defined(GNUSTEP_INDEX_CHARSET) static const NSRange alphanumericCharSet[] = {{48,10},{65,26},{97,26},{170,1},{178,2},{181,1},{185,2},{188,3},{192,23},{216,31},{248,458},{710,12},{736,5},{748,1},{750,1},{768,117},{886,2},{890,4},{895,1},{902,1},{904,3},{908,1},{910,20},{931,83},{1015,139},{1155,173},{1329,38},{1369,1},{1376,41},{1425,45},{1471,1},{1473,2},{1476,2},{1479,1},{1488,27},{1519,4},{1552,11},{1568,74},{1646,102},{1749,8},{1759,10},{1770,19},{1791,1},{1808,59},{1869,101},{1984,54},{2042,1},{2045,1},{2048,46},{2112,28},{2144,11},{2208,21},{2230,18},{2259,15},{2275,129},{2406,10},{2417,19},{2437,8},{2447,2},{2451,22},{2474,7},{2482,1},{2486,4},{2492,9},{2503,2},{2507,4},{2519,1},{2524,2},{2527,5},{2534,12},{2548,6},{2556,1},{2558,1},{2561,3},{2565,6},{2575,2},{2579,22},{2602,7},{2610,2},{2613,2},{2616,2},{2620,1},{2622,5},{2631,2},{2635,3},{2641,1},{2649,4},{2654,1},{2662,16},{2689,3},{2693,9},{2703,3},{2707,22},{2730,7},{2738,2},{2741,5},{2748,10},{2759,3},{2763,3},{2768,1},{2784,4},{2790,10},{2809,7},{2817,3},{2821,8},{2831,2},{2835,22},{2858,7},{2866,2},{2869,5},{2876,9},{2887,2},{2891,3},{2901,3},{2908,2},{2911,5},{2918,10},{2929,7},{2946,2},{2949,6},{2958,3},{2962,4},{2969,2},{2972,1},{2974,2},{2979,2},{2984,3},{2990,12},{3006,5},{3014,3},{3018,4},{3024,1},{3031,1},{3046,13},{3072,13},{3086,3},{3090,23},{3114,16},{3133,8},{3142,3},{3146,4},{3157,2},{3160,3},{3168,4},{3174,10},{3192,7},{3200,4},{3205,8},{3214,3},{3218,23},{3242,10},{3253,5},{3260,9},{3270,3},{3274,4},{3285,2},{3294,1},{3296,4},{3302,10},{3313,2},{3328,13},{3342,3},{3346,51},{3398,3},{3402,5},{3412,16},{3430,19},{3450,6},{3457,3},{3461,18},{3482,24},{3507,9},{3517,1},{3520,7},{3530,1},{3535,6},{3542,1},{3544,8},{3558,10},{3570,2},{3585,58},{3648,15},{3664,10},{3713,2},{3716,1},{3718,5},{3724,24},{3749,1},{3751,23},{3776,5},{3782,1},{3784,6},{3792,10},{3804,4},{3840,1},{3864,2},{3872,20},{3893,1},{3895,1},{3897,1},{3902,10},{3913,36},{3953,20},{3974,18},{3993,36},{4038,1},{4096,74},{4176,78},{4256,38},{4295,1},{4301,1},{4304,43},{4348,333},{4682,4},{4688,7},{4696,1},{4698,4},{4704,41},{4746,4},{4752,33},{4786,4},{4792,7},{4800,1},{4802,4},{4808,15},{4824,57},{4882,4},{4888,67},{4957,3},{4969,20},{4992,16},{5024,86},{5112,6},{5121,620},{5743,17},{5761,26},{5792,75},{5870,11},{5888,13},{5902,7},{5920,21},{5952,20},{5984,13},{5998,3},{6002,2},{6016,84},{6103,1},{6108,2},{6112,10},{6128,10},{6155,3},{6160,10},{6176,89},{6272,43},{6320,70},{6400,31},{6432,12},{6448,12},{6470,40},{6512,5},{6528,44},{6576,26},{6608,11},{6656,28},{6688,63},{6752,29},{6783,11},{6800,10},{6823,1},{6832,17},{6912,76},{6992,10},{7019,9},{7040,116},{7168,56},{7232,10},{7245,49},{7296,9},{7312,43},{7357,3},{7376,3},{7380,39},{7424,250},{7675,283},{7960,6},{7968,38},{8008,6},{8016,8},{8025,1},{8027,1},{8029,1},{8031,31},{8064,53},{8118,7},{8126,1},{8130,3},{8134,7},{8144,4},{8150,6},{8160,13},{8178,3},{8182,7},{8304,2},{8308,6},{8319,11},{8336,13},{8400,33},{8450,1},{8455,1},{8458,10},{8469,1},{8473,5},{8484,1},{8486,1},{8488,1},{8490,4},{8495,11},{8508,4},{8517,5},{8526,1},{8528,58},{9312,60},{9450,22},{10102,30},{11264,47},{11312,47},{11360,133},{11499,9},{11517,1},{11520,38},{11559,1},{11565,1},{11568,56},{11631,1},{11647,24},{11680,7},{11688,7},{11696,7},{11704,7},{11712,7},{11720,7},{11728,7},{11736,7},{11744,32},{11823,1},{12293,3},{12321,15},{12337,5},{12344,5},{12353,86},{12441,2},{12445,3},{12449,90},{12540,4},{12549,43},{12593,94},{12690,4},{12704,32},{12784,16},{12832,10},{12872,8},{12881,15},{12928,10},{12977,15},{13312,6591},{19968,20988},{40960,1165},{42192,46},{42240,269},{42512,28},{42560,51},{42612,10},{42623,115},{42775,9},{42786,103},{42891,53},{42946,9},{42997,51},{43052,1},{43056,6},{43072,52},{43136,70},{43216,10},{43232,24},{43259,1},{43261,49},{43312,36},{43360,29},{43392,65},{43471,11},{43488,31},{43520,55},{43584,14},{43600,10},{43616,23},{43642,73},{43739,3},{43744,16},{43762,5},{43777,6},{43785,6},{43793,6},{43808,7},{43816,7},{43824,43},{43868,14},{43888,123},{44012,2},{44016,10},{44032,11171},{55216,23},{55243,49},{63744,366},{64112,106},{64256,7},{64275,5},{64285,12},{64298,13},{64312,5},{64318,1},{64320,2},{64323,2},{64326,108},{64467,363},{64848,64},{64914,54},{65008,12},{65024,16},{65056,16},{65136,5},{65142,135},{65296,10},{65313,26},{65345,26},{65382,89},{65474,6},{65482,6},{65490,6},{65498,3},{65536,12},{65549,26},{65576,19},{65596,2},{65599,15},{65616,14},{65664,123},{65799,45},{65856,57},{65930,2},{66045,1},{66176,29},{66208,49},{66272,28},{66304,36},{66349,30},{66384,43},{66432,30},{66464,36},{66504,8},{66513,5},{66560,158},{66720,10},{66736,36},{66776,36},{66816,40},{66864,52},{67072,311},{67392,22},{67424,8},{67584,6},{67592,1},{67594,44},{67639,2},{67644,1},{67647,23},{67672,31},{67705,38},{67751,9},{67808,19},{67828,2},{67835,33},{67872,26},{67968,56},{68028,20},{68050,50},{68101,2},{68108,8},{68117,3},{68121,29},{68152,3},{68159,10},{68192,31},{68224,32},{68288,8},{68297,30},{68331,5},{68352,54},{68416,22},{68440,27},{68472,26},{68521,7},{68608,73},{68736,51},{68800,51},{68858,46},{68912,10},{69216,31},{69248,42},{69291,2},{69296,2},{69376,40},{69424,37},{69552,28},{69600,23},{69632,71},{69714,30},{69759,60},{69840,25},{69872,10},{69888,53},{69942,10},{69956,4},{69968,36},{70006,1},{70016,69},{70089,4},{70094,13},{70108,1},{70113,20},{70144,18},{70163,37},{70206,1},{70272,7},{70280,1},{70282,4},{70287,15},{70303,10},{70320,59},{70384,10},{70400,4},{70405,8},{70415,2},{70419,22},{70442,7},{70450,2},{70453,5},{70459,10},{70471,2},{70475,3},{70480,1},{70487,1},{70493,7},{70502,7},{70512,5},{70656,75},{70736,10},{70750,4},{70784,70},{70855,1},{70864,10},{71040,54},{71096,9},{71128,6},{71168,65},{71236,1},{71248,10},{71296,57},{71360,10},{71424,27},{71453,15},{71472,12},{71680,59},{71840,83},{71935,8},{71945,1},{71948,8},{71957,2},{71960,30},{71991,2},{71995,9},{72016,10},{72096,8},{72106,46},{72154,8},{72163,2},{72192,63},{72263,1},{72272,74},{72349,1},{72384,57},{72704,9},{72714,45},{72760,9},{72784,29},{72818,30},{72850,22},{72873,14},{72960,7},{72968,2},{72971,44},{73018,1},{73020,2},{73023,9},{73040,10},{73056,6},{73063,2},{73066,37},{73104,2},{73107,6},{73120,10},{73440,23},{73648,1},{73664,21},{73728,922},{74752,111},{74880,196},{77824,1071},{82944,583},{92160,569},{92736,31},{92768,10},{92880,30},{92912,5},{92928,55},{92992,4},{93008,10},{93019,7},{93027,21},{93053,19},{93760,87},{93952,75},{94031,57},{94095,17},{94176,2},{94179,2},{94192,2},{94208,6135},{100352,1238},{101632,8},{110592,287},{110928,3},{110948,4},{110960,396},{113664,107},{113776,13},{113792,9},{113808,10},{113821,2},{119141,5},{119149,6},{119163,8},{119173,7},{119210,4},{119362,3},{119520,20},{119648,25},{119808,85},{119894,71},{119966,2},{119970,1},{119973,2},{119977,4},{119982,12},{119995,1},{119997,7},{120005,65},{120071,4},{120077,8},{120086,7},{120094,28},{120123,4},{120128,5},{120134,1},{120138,7},{120146,340},{120488,25},{120514,25},{120540,31},{120572,25},{120598,31},{120630,25},{120656,31},{120688,25},{120714,31},{120746,25},{120772,8},{120782,50},{121344,55},{121403,50},{121461,1},{121476,1},{121499,5},{121505,15},{122880,7},{122888,17},{122907,7},{122915,2},{122918,5},{123136,45},{123184,14},{123200,10},{123214,1},{123584,58},{124928,197},{125127,16},{125184,76},{125264,10},{126065,59},{126125,3},{126129,4},{126209,45},{126255,15},{126464,4},{126469,27},{126497,2},{126500,1},{126503,1},{126505,10},{126516,4},{126521,1},{126523,1},{126530,1},{126535,1},{126537,1},{126539,1},{126541,3},{126545,2},{126548,1},{126551,1},{126553,1},{126555,1},{126557,1},{126559,1},{126561,2},{126564,1},{126567,4},{126572,7},{126580,4},{126585,4},{126590,1},{126592,10},{126603,17},{126625,3},{126629,5},{126635,17},{127232,13},{130032,10},{131072,42718},{173824,4148},{177984,221},{178208,5761},{183984,7472},{192576,1},{192584,5},{192643,1},{192646,1},{192649,4},{192654,1},{192656,1},{192659,2},{192662,2},{192668,1},{192671,1},{192674,4},{192679,8},{192707,1},{192710,1},{192713,4},{192718,1},{192720,1},{192723,2},{192726,2},{192732,1},{192735,1},{192738,4},{192743,8},{192773,1},{192775,3},{192782,4},{192787,1},{192792,1},{192837,1},{192839,3},{192846,4},{192851,1},{192856,1},{192896,16},{192914,20},{192936,9},{192946,6},{192953,8},{192963,7},{192972,6},{192980,18},{193000,24},{193056,2},{193071,2},{193092,25},{193118,6},{193126,16},{193144,36},{193182,2},{193190,14},{193328,9},{193368,6},{193376,5},{193472,2},{193475,2},{193524,1},{193530,1},{193534,1},{193540,7},{193548,1},{193550,3},{193578,7},{193610,5},{193616,7},{193648,3},{193652,2},{193657,1},{193664,2},{193667,1},{193671,1},{193676,3},{193689,1},{193721,1},{193744,2},{193747,1},{193751,1},{193756,3},{193782,2},{193857,2},{193872,4},{193878,2},{193882,6},{193890,6},{193898,12},{193912,2},{194055,1},{194210,5},{194293,4},{194368,1},{194370,1},{194387,1},{194560,542},{195147,2},{195164,2},{195167,1},{195251,1},{195254,1},{195289,3},{195294,1},{195528,1},{195531,2},{195548,2},{195604,1},{195658,3},{195784,1},{195904,1},{195911,2},{195914,2},{196042,3},{196186,1},{196188,3},{196275,1},{196403,1},{196444,2},{196492,1},{196547,1},{196557,1},{196562,1},{196567,1},{196572,1},{196585,1},{196595,1},{196597,5},{196608,4938},{917760,240},{930112,1},{930116,2},{930121,2},{930126,1},{930209,3},{930213,6},{930220,4},{930234,2},{930239,2},{930267,3},{930271,1},{930299,1},{930301,1},{930337,1},{930343,1},{930347,1},{930358,2},{930363,1},{930367,1},{931070,1},{931079,1},{931546,6},{931593,2},{931646,1},{931648,1},{931651,1},{931654,1},{931699,2},{931721,2},{931724,2},{931739,1},{931742,2},{931818,4},{931924,1},{931968,14},{932215,3},{932272,15},{932318,1},{932580,2},{932592,1},{932733,1},{932854,1},{932976,1},{933367,1},{933380,1},{933748,1},{933839,1},{933850,2},{934020,15},{934036,1},{934074,4},{934149,1},{934224,5},{934233,2},{934346,6},{934523,1},{935136,9},{935296,1},{935918,1},{935963,2},{936043,3},{936117,2},{936276,3},{936280,3},{936320,11},{936644,2},{936862,2},{936992,7},{937000,6},{937178,7},{937340,4},{937403,5},{937470,2},{937536,8},{937555,1},{938384,24},{938416,20},{938437,13},{938451,12},{938493,2},{938509,2},{939144,4},{939177,2},{940264,14},{940357,2},{940390,10},{940803,22},{940888,4},{940924,2},{941689,4},{941694,2},{941808,1},{941952,47},{942000,32},{942034,1},{942465,3},{942472,10},{942484,12},{942512,1},{942525,1},{942624,1},{942715,1},{972414,2},{972685,3},{972787,1},{972798,1},{972914,6},{973300,4},{973390,2},{973432,3},{973436,1},{973486,2},{973535,1},{973633,13},{973662,2},{973788,4},{973918,2},{973936,2},{974187,1}}; #else /* GNUSTEP_INDEX_CHARSET */ static const unsigned char alphanumericCharSet[122880] = {'\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x03','\xfe','\xff','\xff','\x07','\xfe','\xff','\xff','\x07','\x00','\x00','\x00','\x00','\x00','\x04','\x2c','\x76','\xff','\xff','\x7f','\xff','\xff','\xff','\x7f','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xc3','\xff','\x03','\x00','\x1f','\x50','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xdf','\xbc','\x40','\xd7','\xff','\xff','\xfb','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xbf','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xfb','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xfe','\xff','\xff','\xff','\x7f','\x02','\xff','\xff','\xff','\xff','\xff','\x01','\xfe','\xff','\xff','\xff','\xff','\xbf','\xb6','\x00','\xff','\xff','\xff','\x87','\x07','\x00','\x00','\x00','\xff','\x07','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xc3','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xef','\x9f','\xff','\xfd','\xff','\x9f','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xe7','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x03','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\x3f','\x24','\xff','\xff','\xff','\xff','\xff','\x3f','\x00','\x00','\xff','\xff','\xff','\x0f','\xff','\x07','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xdf','\xff','\xff','\x00','\xf8','\xff','\xfb','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xcf','\xff','\xfe','\xff','\xef','\x9f','\xf9','\xff','\xff','\xfd','\xc5','\xf3','\x9f','\x79','\x80','\xb0','\xcf','\xff','\xf3','\x53','\xee','\x87','\xf9','\xff','\xff','\xfd','\x6d','\xd3','\x87','\x39','\x02','\x5e','\xc0','\xff','\x3f','\x00','\xee','\xbf','\xfb','\xff','\xff','\xfd','\xed','\xf3','\xbf','\x3b','\x01','\x00','\xcf','\xff','\x00','\xfe','\xee','\x9f','\xf9','\xff','\xff','\xfd','\xed','\xf3','\x9f','\x39','\xe0','\xb0','\xcf','\xff','\xfe','\x00','\xec','\xc7','\x3d','\xd6','\x18','\xc7','\xff','\xc3','\xc7','\x3d','\x81','\x00','\xc0','\xff','\x07','\x00','\xff','\xdf','\xfd','\xff','\xff','\xfd','\xff','\xe3','\xdf','\x3d','\x60','\x07','\xcf','\xff','\x00','\x7f','\xef','\xdf','\xfd','\xff','\xff','\xfd','\xef','\xf3','\xdf','\x3d','\x60','\x40','\xcf','\xff','\x06','\x00','\xff','\xdf','\xfd','\xff','\xff','\xff','\xff','\xff','\xdf','\x7d','\xf0','\xff','\xcf','\xff','\xff','\xfd','\xee','\xff','\x7f','\xfc','\xff','\xff','\xfb','\x2f','\x7f','\x84','\x5f','\xff','\xc0','\xff','\x0c','\x00','\xfe','\xff','\xff','\xff','\xff','\xff','\xff','\x07','\xff','\x7f','\xff','\x03','\x00','\x00','\x00','\x00','\xd6','\xf7','\xff','\xff','\xaf','\xff','\xff','\x3f','\x5f','\x3f','\xff','\xf3','\x00','\x00','\x00','\x00','\x01','\x00','\x00','\x03','\xff','\xff','\xaf','\xc2','\xff','\xfe','\xff','\xff','\xff','\x1f','\xfe','\xff','\xdf','\xff','\xff','\xfe','\xff','\xff','\xff','\x1f','\x40','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x03','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x3f','\xff','\xff','\xff','\xff','\xbf','\x20','\xff','\xff','\xff','\xff','\xff','\xf7','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x3d','\x7f','\x3d','\xff','\xff','\xff','\xff','\xff','\x3d','\xff','\xff','\xff','\xff','\x3d','\x7f','\x3d','\xff','\x7f','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x3d','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xe7','\x00','\xfe','\xff','\x1f','\xff','\xff','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x3f','\x3f','\xfe','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x9f','\xff','\xff','\xfe','\xff','\xff','\x07','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xc7','\xff','\x01','\xff','\xdf','\x1f','\x00','\xff','\xff','\x1f','\x00','\xff','\xff','\x0f','\x00','\xff','\xdf','\x0d','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x8f','\x30','\xff','\x03','\xff','\x03','\x00','\x38','\xff','\x03','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x01','\xff','\xff','\xff','\xff','\xff','\x07','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x3f','\x00','\xff','\xff','\xff','\x7f','\xff','\x0f','\xff','\x0f','\xc0','\xff','\xff','\xff','\xff','\x3f','\x1f','\x00','\xff','\xff','\xff','\xff','\xff','\x0f','\xff','\xff','\xff','\x03','\xff','\x07','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\x0f','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x7f','\xff','\xff','\xff','\x9f','\xff','\x03','\xff','\x03','\x80','\x00','\xff','\xff','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x0f','\xff','\x03','\x00','\xf8','\x0f','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x0f','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\xff','\xe3','\xff','\xff','\xff','\xff','\xff','\x3f','\xff','\x01','\xff','\xff','\xff','\xff','\xff','\xe7','\x00','\x00','\xf7','\xff','\xff','\xff','\xff','\x07','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xfb','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x3f','\x3f','\xff','\xff','\xff','\xff','\x3f','\x3f','\xff','\xaa','\xff','\xff','\xff','\x3f','\xff','\xff','\xff','\xff','\xff','\xff','\xdf','\x5f','\xdc','\x1f','\xcf','\x0f','\xff','\x1f','\xdc','\x1f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf3','\x83','\xff','\x03','\xff','\x1f','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\x01','\x00','\x84','\xfc','\x2f','\x3e','\x50','\xbd','\xff','\xf3','\xe0','\x43','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x0f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfc','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\xff','\xff','\xff','\x0f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\x7f','\xff','\xff','\xff','\xff','\xff','\x7f','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x1f','\xf8','\x0f','\x20','\xff','\xff','\xff','\xff','\xbf','\x20','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x80','\x00','\x80','\xff','\xff','\x7f','\x00','\x7f','\x7f','\x7f','\x7f','\x7f','\x7f','\x7f','\x7f','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xe0','\x00','\x00','\x00','\xfe','\xff','\x3e','\x1f','\xfe','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x7f','\xe6','\xfe','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xf7','\xe0','\xff','\xff','\xff','\xff','\xff','\xfe','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x7f','\x3c','\x00','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\xff','\xfe','\xff','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\xfe','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x7f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x0f','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x1f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\x3f','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x1f','\xff','\xff','\xff','\x0f','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xf7','\xbf','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x03','\x00','\x00','\x00','\x80','\xff','\xfc','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xf9','\xff','\xff','\xff','\xff','\xff','\xff','\xfc','\x07','\x00','\x00','\x00','\x00','\xe0','\xff','\xff','\xff','\xff','\xff','\xff','\x10','\x3f','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\x0f','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x3f','\x00','\xff','\x03','\xff','\xff','\xff','\xe8','\xff','\xff','\xff','\xff','\xff','\x3f','\xff','\xff','\xff','\xff','\x0f','\x00','\xff','\xff','\xff','\x1f','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x01','\x80','\xff','\x03','\xff','\xff','\xff','\x7f','\xff','\xff','\xff','\xff','\xff','\xff','\x7f','\x00','\xff','\x3f','\xff','\x03','\xff','\xff','\x7f','\xfc','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x07','\x00','\x00','\x38','\xff','\xff','\x7c','\x00','\x7e','\x7e','\x7e','\x00','\x7f','\x7f','\xff','\xff','\xff','\xff','\xff','\xf7','\xff','\x03','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x37','\xff','\x03','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x07','\x00','\xff','\xff','\x7f','\xf8','\xff','\xff','\xff','\xff','\xff','\x0f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x3f','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x03','\x00','\x00','\x00','\x00','\x7f','\x00','\xf8','\xe0','\xff','\xfd','\x7f','\x5f','\xdb','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x03','\x00','\x00','\x00','\xf8','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x3f','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xfc','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\xff','\x0f','\xff','\xff','\x00','\x00','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xdf','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x1f','\x00','\x00','\xff','\x03','\xfe','\xff','\xff','\x07','\xfe','\xff','\xff','\x07','\xc0','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x7f','\xfc','\xfc','\xfc','\x1c','\x00','\x00','\x00','\x00','\xff','\xef','\xff','\xff','\x7f','\xff','\xff','\xb7','\xff','\x3f','\xff','\x3f','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x07','\x80','\xff','\xff','\xff','\xff','\xff','\x0f','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x01','\x00','\x0c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x20','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\x1f','\xff','\xff','\xff','\xff','\xff','\xff','\x01','\x00','\xff','\xff','\xff','\x0f','\xff','\xff','\xff','\xff','\x0f','\xe0','\xff','\xff','\xff','\x07','\xff','\xff','\xff','\xff','\xff','\x07','\xff','\xff','\xff','\x3f','\xff','\xff','\xff','\xff','\x0f','\xff','\x3e','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x3f','\xff','\x03','\xff','\xff','\xff','\xff','\x0f','\xff','\xff','\xff','\xff','\x0f','\xff','\xff','\xff','\xff','\xff','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\x0f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x7f','\x00','\xff','\xff','\x3f','\x00','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x3f','\xfd','\xff','\xff','\xff','\xff','\xbf','\x91','\xff','\xff','\x3f','\xff','\xff','\xff','\x7f','\xfe','\xff','\xff','\xff','\x7f','\x80','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\x37','\xf8','\xff','\xff','\xff','\x0f','\xff','\xff','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xf0','\xff','\xff','\xfc','\xff','\xff','\xff','\xff','\xff','\x6f','\xf0','\xef','\xfe','\xff','\xff','\x3f','\x87','\xff','\x01','\x00','\x00','\xff','\xff','\xff','\x7f','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\xff','\xfe','\xff','\xff','\x7f','\xf8','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\x3f','\x00','\xff','\xff','\x3f','\xff','\xff','\xff','\x07','\xff','\xff','\xff','\x03','\x00','\x00','\xfe','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\x07','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\x07','\xfc','\xff','\xff','\xff','\xff','\xff','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\x7f','\xff','\xff','\xff','\xff','\xff','\x1b','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\x00','\xff','\xff','\xff','\xff','\x1f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\x0f','\x00','\x00','\xff','\xff','\x7f','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x7f','\x00','\xfc','\xff','\xff','\xff','\x00','\x80','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x07','\x00','\x00','\xff','\xff','\xff','\x01','\xff','\x03','\xff','\xff','\xff','\xff','\xff','\xff','\xdf','\xff','\xf0','\x00','\xff','\xff','\xff','\xff','\x4f','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x1f','\xde','\xff','\x17','\xfe','\xff','\x1f','\x00','\xff','\xff','\xfb','\xff','\xff','\xff','\xff','\x40','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x7f','\xbd','\xff','\xbf','\xff','\x01','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x07','\xff','\x03','\xef','\x9f','\xf9','\xff','\xff','\xfd','\xed','\xfb','\x9f','\x39','\x81','\xe0','\xcf','\x1f','\x1f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x07','\xff','\xc3','\x03','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xbf','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\x3f','\xff','\x01','\x00','\x00','\x3f','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x11','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x01','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xe7','\xff','\x0f','\xff','\x0f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x07','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x07','\x80','\x7f','\xf2','\x6f','\xff','\xff','\xff','\xbf','\xf9','\x0f','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xfc','\xff','\xff','\xff','\xff','\xff','\xfc','\x1b','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x7f','\x80','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x23','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xfd','\xff','\xff','\xff','\xff','\x7f','\xff','\x01','\x00','\xff','\xff','\xff','\x1f','\xfc','\xff','\xff','\xff','\xfc','\xff','\xff','\xfe','\x7f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x7f','\xfb','\xff','\xff','\xff','\xff','\x7f','\xb4','\xff','\x00','\xff','\x03','\xbf','\xfd','\xff','\xff','\xff','\x7f','\xfb','\x01','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\x7f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01','\x00','\xff','\xff','\x1f','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x7f','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x0f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x7f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x7f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x01','\xff','\xff','\xff','\x7f','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\x3f','\x1f','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\x7f','\x00','\x0f','\x00','\xff','\xfb','\xfb','\xff','\xff','\xe0','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x7f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x87','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x80','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x1b','\x00','\x03','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x7f','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x3f','\x00','\x00','\x00','\x00','\x00','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x7f','\x00','\x00','\x00','\x00','\x00','\x00','\x07','\x00','\xf0','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x0f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x07','\xff','\x1f','\xff','\x01','\xff','\x63','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xe0','\xe3','\x07','\xf8','\xe7','\x0f','\x00','\x00','\x00','\x3c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x1c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\x0f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xdf','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xdf','\x64','\xde','\xff','\xeb','\xef','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xbf','\xe7','\xdf','\xdf','\xff','\xff','\xff','\x7b','\x5f','\xfc','\xfd','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x3f','\xff','\xff','\xff','\xfd','\xff','\xff','\xf7','\xff','\xff','\xff','\xf7','\xff','\xff','\xdf','\xff','\xff','\xff','\xdf','\xff','\xff','\x7f','\xff','\xff','\xff','\x7f','\xff','\xff','\xff','\xfd','\xff','\xff','\xff','\xfd','\xff','\xff','\xf7','\xcf','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\x7f','\xf8','\xff','\xff','\xff','\xff','\xff','\x1f','\x20','\x00','\x10','\x00','\x00','\xf8','\xfe','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x7f','\xff','\xff','\xf9','\xdb','\x07','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\x1f','\xff','\x3f','\xff','\x43','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x9f','\xff','\x7f','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x0f','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfe','\xff','\xff','\xff','\xff','\xff','\xff','\xef','\x1e','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfe','\xff','\xff','\xff','\xff','\xbf','\xff','\x3f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xef','\xff','\xff','\xff','\x96','\xfe','\xf7','\x0a','\x84','\xea','\x96','\xaa','\x96','\xf7','\xf7','\x5e','\xff','\xfb','\xff','\x0f','\xee','\xfb','\xff','\x0f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x1f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x3f','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x0f','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x1f','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x01','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01','\x1f','\x00','\x00','\x00','\x00','\x00','\x00','\x48','\x5e','\xd9','\x90','\xbc','\x7f','\x00','\x00','\x48','\x5e','\xd9','\x90','\xbc','\x7f','\x00','\x00','\xa0','\xc3','\x0b','\x01','\x00','\x00','\x00','\x00','\xa0','\xc3','\x0b','\x01','\x00','\x00','\x00','\x00','\xff','\xff','\xfc','\xff','\x3f','\xff','\xfd','\xfe','\xf9','\xf3','\xf3','\xff','\x3f','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x03','\x80','\x01','\x00','\xf0','\xff','\xff','\xdf','\xcf','\xff','\x3f','\xff','\xff','\xff','\xff','\xcf','\xc0','\xff','\x0f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x01','\x00','\x00','\x00','\x3f','\x1f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x1b','\x00','\x00','\x00','\x00','\x00','\x10','\x44','\xf0','\xd7','\x01','\x00','\x00','\xfc','\x01','\x00','\x00','\x7c','\x7f','\x00','\x00','\x00','\x37','\x02','\x8b','\x70','\x00','\x02','\x00','\x00','\x00','\x02','\x00','\x00','\x8b','\x70','\x00','\x00','\xc0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x06','\x00','\xcf','\xfc','\xfc','\xfc','\x3f','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x7c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xe0','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x05','\x00','\x08','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x3f','\x00','\x00','\x00','\x00','\x00','\x18','\x00','\xb0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x48','\x00','\x00','\x00','\x00','\x4e','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x19','\x00','\x30','\x00','\x00','\x00','\x00','\x00','\x00','\x10','\x00','\x00','\x00','\x00','\x00','\x00','\x1c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x81','\x0d','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x1c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x74','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x08','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x08','\x00','\x00','\x00','\x00','\x30','\x00','\x00','\x00','\x00','\x00','\x10','\x00','\x00','\x00','\x00','\x00','\x00','\x08','\x20','\x84','\x10','\x00','\x02','\xe8','\x03','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x31','\x46','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xee','\xf7','\x00','\x8c','\x01','\x00','\x00','\xb8','\x00','\x00','\x00','\x28','\x00','\x00','\x00','\x00','\x82','\x08','\xc0','\x88','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x40','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfc','\x00','\x00','\x00','\x00','\x00','\x06','\x00','\x00','\x00','\x00','\x00','\x40','\x49','\x00','\x00','\x00','\x00','\x00','\x18','\x00','\x00','\x36','\x00','\xc8','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x3c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x10','\x00','\x00','\x00','\x00','\x00','\xff','\x3f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x7f','\x00','\x00','\x00','\x40','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x30','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x20','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x40','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x10','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x10','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x0c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf0','\xff','\x17','\x00','\x00','\x00','\x00','\x3c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x20','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x1f','\x06','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfc','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x08','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x40','\x00','\x00','\x00','\x00','\x00','\x18','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x38','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x60','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x70','\x07','\x00','\x00','\x00','\x00','\xff','\x07','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x30','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x7f','\x3f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfc','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf8','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x00','\x08','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\x00','\xff','\xff','\xef','\xff','\xfb','\x7f','\x00','\x00','\x00','\x60','\x00','\x60','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x0f','\x00','\x00','\x00','\x06','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x3f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x60','\x00','\x00','\x00','\xc0','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf8','\xff','\xff','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x0f','\x00','\x00','\x00','\x30','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xde','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\x7f','\xff','\xff','\xff','\xff','\x04','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x0e','\xff','\xf3','\xff','\x00','\x00','\x01','\x20','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x08','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xe0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x08','\x40','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfc','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\x00','\x00','\x00','\x00','\x00','\x17','\x00','\x00','\x00','\x00','\x00','\xc0','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfe','\x3f','\x00','\xc0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\x00','\x00','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x08','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00'}; #endif /* GNUSTEP_INDEX_CHARSET */ #if defined(GNUSTEP_INDEX_CHARSET) static const NSRange controlCharSet[] = {{0,32},{127,33},{173,1},{1536,6},{1564,1},{1757,1},{1807,1},{2274,1},{6158,1},{8203,5},{8234,5},{8288,5},{8294,10},{65279,1},{65529,3},{69821,1},{69837,1},{78896,9},{113824,4},{119155,8},{917505,1},{917536,96},{919872,1},{919876,2},{919881,2},{919886,3},{920624,18},{920646,12},{920672,5},{920684,1},{920686,1},{920704,112},{920820,1},{920826,1},{921091,7},{921305,1},{921361,45},{921407,1},{921409,2},{921412,2},{921415,1},{921488,11},{921536,1},{921547,21},{921584,1},{921686,7},{921695,10},{921706,4},{921745,1},{921776,27},{921894,11},{921963,11},{921978,1},{921981,1},{922006,24},{922073,3},{922195,15},{922211,33},{922298,3},{922302,18},{922321,7},{922338,2},{922353,1},{922369,3},{922428,1},{922430,7},{922439,2},{922443,3},{922455,1},{922466,2},{922494,1},{922497,3},{922556,1},{922558,5},{922567,2},{922571,3},{922577,1},{922608,2},{922613,1},{922625,3},{922684,1},{922686,8},{922695,3},{922699,3},{922722,2},{922746,6},{922753,3},{922812,1},{922814,7},{922823,2},{922827,3},{922837,3},{922850,2},{922882,1},{922942,5},{922950,3},{922954,4},{922967,1},{923008,5},{923070,7},{923078,3},{923082,4},{923093,2},{923106,2},{923137,3},{923196,1},{923198,7},{923206,3},{923210,4},{923221,2},{923234,2},{923264,4},{923323,2},{923326,7},{923334,3},{923338,4},{923351,1},{923362,2},{923393,3},{923466,1},{923471,6},{923478,1},{923480,8},{923506,2},{923569,1},{923572,7},{923590,9},{923697,1},{923700,9},{923718,1},{923720,6},{923800,2},{923829,1},{923831,1},{923833,1},{923838,2},{923889,20},{923910,2},{923917,11},{923929,36},{923974,1},{924075,20},{924118,4},{924126,3},{924130,3},{924135,7},{924145,4},{924162,12},{924175,1},{924186,4},{924284,1},{924893,3},{925842,3},{925874,3},{925906,2},{925938,2},{926004,32},{926039,1},{926045,1},{926091,3},{926147,1},{926213,2},{926249,1},{926368,12},{926384,12},{926615,5},{926677,10},{926688,29},{926719,1},{926759,1},{926768,17},{926848,5},{926900,17},{926955,9},{926976,3},{927009,13},{927078,14},{927140,20},{927224,6},{927312,3},{927316,21},{927341,1},{927348,1},{927351,3},{927404,63},{927480,1},{927515,95},{927611,5},{928241,1},{928255,1},{928272,13},{928336,33},{931324,2},{931439,3},{931567,1},{931583,1},{931680,32},{931759,1},{932229,1},{932266,6},{932273,5},{932283,1},{932377,2},{932381,2},{932476,3},{960917,1},{962168,6},{962444,1},{962543,4},{962548,10},{962559,1},{962588,4},{962672,2},{962711,9},{962800,1},{962824,1},{962936,2},{962946,1},{962950,1},{962955,1},{962979,5},{962988,1},{963072,2},{963124,18},{963168,18},{963199,1},{963238,8},{963271,13},{963328,4},{963379,14},{963407,1},{963429,2},{963497,14},{963523,1},{963532,2},{963568,1},{963579,3},{963632,1},{963634,3},{963639,2},{963646,2},{963649,1},{963677,1},{963691,5},{963699,4},{963804,4},{963817,1},{963939,8},{963948,2}}; #else /* GNUSTEP_INDEX_CHARSET */ static const unsigned char controlCharSet[122880] = {'\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\xff','\xff','\xff','\xff','\x00','\x20','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x3f','\x00','\x00','\x10','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x20','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x04','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x40','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf8','\x00','\x00','\x00','\x7c','\x00','\x00','\x00','\x00','\x00','\x00','\xdf','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x0e','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x20','\x00','\x20','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x0f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf8','\x07','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x02','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x31','\xc6','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xc3','\xff','\x03','\x00','\x1f','\x50','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x10','\x04','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf8','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x02','\x00','\x00','\x00','\x00','\x00','\x00','\xfe','\xff','\xff','\xff','\xff','\xbf','\xb6','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x07','\x00','\x00','\x00','\x00','\x01','\xf8','\xff','\xff','\x00','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\x9f','\xff','\x3d','\x00','\x00','\x00','\x00','\x02','\x00','\x00','\x00','\xff','\xff','\xff','\x07','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\xff','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\xf8','\x3f','\x24','\x00','\x00','\xc0','\xff','\xff','\x3f','\x00','\x00','\x00','\x00','\x00','\x0e','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf8','\xff','\xfb','\xff','\xff','\xff','\x0f','\x00','\x00','\x00','\x00','\x00','\x00','\xdc','\xff','\xff','\xfe','\x00','\x0c','\x00','\x02','\x00','\x0e','\x00','\x00','\x00','\x00','\x00','\x00','\xd0','\x9f','\x39','\x80','\x00','\x0c','\x00','\x00','\x40','\x0e','\x00','\x00','\x00','\x00','\x00','\x00','\xd0','\x87','\x39','\x02','\x00','\x00','\x00','\x23','\x00','\x0e','\x00','\x00','\x00','\x00','\x00','\x00','\xd0','\xbf','\x3b','\x00','\x00','\x0c','\x00','\x00','\xfc','\x0e','\x00','\x00','\x00','\x00','\x00','\x00','\xd0','\x9f','\x39','\xe0','\x00','\x0c','\x00','\x00','\x00','\x04','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\xc7','\x3d','\x80','\x00','\x00','\x00','\x00','\x00','\x1f','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\xdf','\x3d','\x60','\x00','\x0c','\x00','\x00','\x00','\x0e','\x00','\x00','\x00','\x00','\x00','\x00','\xd0','\xdf','\x3d','\x60','\x00','\x0c','\x00','\x00','\x00','\x0f','\x00','\x00','\x00','\x00','\x00','\x00','\xd8','\xdf','\x3d','\x80','\x00','\x0c','\x00','\x00','\x00','\x0e','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x84','\x5f','\xff','\x00','\x00','\x0c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf2','\x07','\xc0','\x7f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf2','\x1f','\x40','\x3f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x03','\x00','\x00','\xa0','\xc2','\x00','\x00','\x00','\x00','\x00','\x00','\xfe','\xff','\xdf','\xe0','\xff','\xfe','\xff','\xff','\xff','\x1f','\x40','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf8','\xff','\x7f','\x00','\x00','\xc0','\xc3','\x9d','\x3f','\x1e','\x00','\xfc','\xbf','\x00','\x3c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x10','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xe0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x1c','\x00','\x00','\x00','\x1c','\x00','\x00','\x00','\x0c','\x00','\x00','\x00','\x0c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf0','\xff','\xff','\xff','\x8f','\x20','\x00','\x00','\x00','\x00','\x00','\x38','\x00','\x00','\x00','\x00','\x00','\x00','\x08','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x60','\x00','\x00','\x00','\x00','\x02','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x0f','\xff','\x0f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x0f','\x00','\x00','\x00','\x00','\x00','\x00','\xe0','\x7f','\xff','\xff','\xff','\x9f','\x00','\x00','\x00','\x00','\x80','\x00','\xff','\xff','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x1f','\x00','\x00','\x00','\x00','\x00','\xf0','\xff','\x1f','\x00','\x00','\x00','\x00','\xf8','\x0f','\x00','\x07','\x00','\x00','\x00','\xfe','\x3f','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\xff','\x0f','\x00','\x00','\x00','\x00','\x00','\xf0','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x3f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf7','\xff','\xff','\x21','\x90','\x03','\x00','\x00','\x00','\x00','\x00','\xf0','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x07','\x00','\x01','\x00','\x00','\x00','\xf8','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xfb','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x02','\x80','\x00','\x00','\xff','\x1f','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x30','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x20','\x00','\x00','\x00','\x00','\xfc','\x3e','\x08','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x66','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x70','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x20','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x3f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x10','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\xf7','\xbf','\x00','\x00','\x00','\xf0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x03','\x00','\x00','\x00','\x80','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01','\x00','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x03','\x44','\x08','\x00','\x00','\xf8','\x10','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x03','\x00','\x00','\x00','\x00','\x00','\xf0','\xff','\x3f','\x00','\x00','\x00','\xff','\xff','\x03','\x80','\x00','\x00','\x00','\x00','\xc0','\x3f','\x00','\x00','\x80','\xff','\x0f','\x00','\x00','\x00','\x00','\x00','\x0f','\x00','\x00','\x00','\x00','\x00','\xf8','\xff','\x01','\x80','\x00','\x00','\x60','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfe','\x7f','\x00','\x08','\x30','\x00','\x00','\x00','\x00','\x01','\x38','\x00','\x00','\x00','\x00','\x00','\x00','\x9d','\xc1','\x02','\x00','\x00','\x20','\x00','\xf8','\x78','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf0','\x00','\x02','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf8','\x37','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00'}; #endif /* GNUSTEP_INDEX_CHARSET */ #if defined(GNUSTEP_INDEX_CHARSET) static const NSRange decimalDigitCharSet[] = {{48,10},{1632,10},{1776,10},{1984,10},{2406,10},{2534,10},{2662,10},{2790,10},{2918,10},{3046,10},{3174,10},{3302,10},{3430,10},{3558,10},{3664,10},{3792,10},{3872,10},{4160,10},{4240,10},{6112,10},{6160,10},{6470,10},{6608,10},{6784,10},{6800,10},{6992,10},{7088,10},{7232,10},{7248,10},{42528,10},{43216,10},{43264,10},{43472,10},{43504,10},{43600,10},{44016,10},{65296,10},{66720,10},{68912,10},{69734,10},{69872,10},{69942,10},{70096,10},{70384,10},{70736,10},{70864,10},{71248,10},{71360,10},{71472,10},{71904,10},{72016,10},{72784,10},{73040,10},{73120,10},{92768,10},{93008,10},{120782,50},{123200,10},{123632,10},{125264,10},{130032,10},{138432,1},{138437,1},{138503,3},{138511,1},{138514,1},{138517,2},{138568,5},{138575,1},{138578,2},{138583,1},{138629,1},{138693,2},{138697,2},{138784,1},{138912,1},{144512,1},{146944,11},{146984,2},{146991,1},{147039,1},{151040,1},{151093,2},{151252,3},{151256,3},{151296,11},{151620,2},{151744,1},{151748,1},{151754,1},{152261,1},{152264,1},{152267,1},{152306,1},{159880,8},{159896,8},{159912,8},{159932,1},{159948,1},{159996,1},{160064,1},{160068,1},{160070,1},{160196,1},{160203,1},{160206,3},{160212,5},{160220,1},{160223,1},{160226,4},{160231,8},{160259,2},{160325,1},{160327,2},{160332,2},{160341,1},{160343,1},{160451,2},{160462,2},{160466,7},{160476,1},{160479,1},{160482,4},{160487,8},{160513,1},{160517,1},{160576,3},{160580,1},{160704,1},{160708,1},{160710,1},{160836,1},{160843,1},{160846,3},{160852,5},{160860,1},{160863,1},{160866,4},{160871,8},{160896,2},{160900,1},{160965,4},{160971,1},{160974,1},{160976,1},{160978,1},{160982,2},{161091,2},{161102,2},{161106,7},{161116,1},{161119,1},{161122,4},{161127,8},{161152,2},{161155,2},{161217,1},{161220,1},{161344,1},{161350,1},{161352,1},{161355,1},{161411,5},{161418,3},{161422,1},{161424,1},{161427,2},{161430,2},{161436,1},{161439,1},{161442,4},{161447,8},{161475,5},{161482,3},{161486,1},{161488,1},{161491,2},{161494,2},{161500,1},{161503,1},{161506,4},{161511,8},{161541,2},{161546,1},{161548,2},{161551,3},{161555,1},{161560,1},{161605,2},{161610,1},{161612,2},{161615,3},{161619,1},{161624,1},{162246,3},{162253,2},{162256,1},{162259,2},{162262,2},{162268,1},{162271,1},{162274,4},{162279,8},{162304,32},{162500,1},{162502,1},{162504,1},{162506,1},{162508,2},{162511,3},{162515,1},{162520,1},{162560,64},{162693,2},{162696,1},{162698,1},{162700,2},{162703,3},{162707,1},{162712,1},{162944,32},{163143,3},{163149,1},{163152,1},{163155,2},{163158,2},{163164,1},{163167,1},{163170,4},{163175,8},{164768,38},{164807,1},{164813,1},{165254,1},{165257,4},{165264,1},{165267,2},{165270,2},{165276,1},{165279,1},{165282,4},{165287,8},{165312,1},{165316,1},{165318,1},{165320,3},{165379,3},{165383,4},{165388,1},{165390,1},{165392,1},{165395,2},{165398,2},{165404,1},{165407,1},{165410,4},{165415,8},{165443,3},{165447,4},{165452,1},{165454,1},{165456,1},{165459,2},{165462,2},{165468,1},{165471,1},{165474,4},{165479,8},{165894,1},{165897,4},{165904,1},{165907,2},{165910,2},{165916,1},{165919,1},{165922,4},{165927,8},{165952,1},{165960,3},{166019,3},{166023,4},{166028,1},{166030,1},{166032,1},{166035,2},{166038,2},{166044,1},{166047,1},{166050,4},{166055,8},{166083,3},{166087,4},{166092,1},{166094,1},{166096,1},{166099,2},{166102,2},{166108,1},{166111,1},{166114,4},{166119,8},{167824,43},{167869,3},{168192,1},{168194,1},{168196,1},{168198,1},{168200,1},{168202,1},{168204,1},{168206,1},{168208,1},{168210,1},{168212,1},{168214,1},{168216,1},{168218,1},{168220,1},{168222,1},{168224,1},{168226,1},{168228,1},{168230,1},{168232,1},{168234,1},{168236,1},{168238,1},{168240,1},{168242,1},{168244,1},{168246,1},{168248,1},{168250,1},{168252,1},{168254,1},{168256,1},{168258,1},{168260,1},{168262,1},{168264,1},{168266,1},{168268,1},{168270,1},{168272,1},{168274,1},{168276,1},{168278,1},{168280,1},{168282,1},{168284,1},{168286,1},{168288,1},{168290,1},{168292,1},{168294,1},{168296,1},{168298,1},{168300,1},{168302,1},{168304,1},{168306,1},{168308,1},{168310,1},{168312,1},{168314,1},{168316,1},{168318,1},{168320,1},{168322,1},{168324,1},{168326,1},{168328,1},{168330,1},{168332,1},{168334,1},{168336,1},{168338,1},{168340,1},{168350,1},{168352,1},{168354,1},{168356,1},{168358,1},{168360,1},{168362,1},{168364,1},{168366,1},{168368,1},{168370,1},{168372,1},{168374,1},{168376,1},{168378,1},{168380,1},{168382,1},{168384,1},{168386,1},{168388,1},{168390,1},{168392,1},{168394,1},{168396,1},{168398,1},{168400,1},{168402,1},{168404,1},{168406,1},{168408,1},{168410,1},{168412,1},{168414,1},{168416,1},{168418,1},{168420,1},{168422,1},{168424,1},{168426,1},{168428,1},{168430,1},{168432,1},{168434,1},{168436,1},{168438,1},{168440,1},{168442,1},{168444,1},{168446,1},{168456,8},{168472,6},{168488,8},{168504,8},{168520,6},{168537,1},{168539,1},{168541,1},{168543,1},{168552,8},{168632,4},{168648,4},{168664,4},{168680,5},{168696,4},{168962,1},{168967,1},{168971,3},{168976,3},{168981,1},{168985,5},{168996,1},{168998,1},{169000,1},{169002,4},{169008,4},{169022,2},{169029,1},{169091,1},{171776,47},{171872,1},{171874,3},{171879,1},{171881,1},{171883,1},{171885,4},{171890,1},{171893,1},{171902,3},{171906,1},{171908,1},{171910,1},{171912,1},{171914,1},{171916,1},{171918,1},{171920,1},{171922,1},{171924,1},{171926,1},{171928,1},{171930,1},{171932,1},{171934,1},{171936,1},{171938,1},{171940,1},{171942,1},{171944,1},{171946,1},{171948,1},{171950,1},{171952,1},{171954,1},{171956,1},{171958,1},{171960,1},{171962,1},{171964,1},{171966,1},{171968,1},{171970,1},{171972,1},{171974,1},{171976,1},{171978,1},{171980,1},{171982,1},{171984,1},{171986,1},{171988,1},{171990,1},{171992,1},{171994,1},{171996,1},{171998,1},{172000,1},{172002,1},{172011,1},{172013,1},{172018,1},{172097,2},{172112,4},{172118,2},{172122,6},{172130,6},{172138,12},{172152,2},{172295,1},{172450,5},{172533,4},{172608,1},{172610,1},{172627,1},{173225,1},{173233,1},{173236,1},{173272,8},{173387,2},{173404,2},{173407,1},{173491,1},{173494,1},{173529,3},{173534,1},{173768,1},{173771,2},{173788,2},{173844,1},{173898,3},{174024,1},{174144,1},{174151,2},{174154,2},{174282,3},{174426,1},{174428,3},{174515,1},{174643,1},{174684,2},{174732,1},{174787,1},{174797,1},{174802,1},{174807,1},{174812,1},{174825,1},{174835,1},{174837,5},{174849,1},{174867,1},{174877,1},{174882,1},{174887,1},{174892,1},{174905,1},{174912,1},{174917,1},{174919,1},{174921,1},{174979,1},{174982,1},{174985,1},{174987,2},{174990,1},{174992,1},{174995,2},{174998,2},{175004,1},{175007,1},{175010,4},{175015,8},{175043,1},{175046,1},{175049,1},{175051,2},{175054,1},{175056,1},{175059,2},{175062,2},{175068,1},{175071,1},{175074,4},{175079,8},{175228,1},{177798,1},{177800,1},{177802,1},{177804,1},{177806,1},{177810,1},{177851,1},{177853,1},{177856,2},{177859,1},{178348,3},{178352,11},{178364,18},{178383,28},{178424,1},{178459,37},{178560,156},{178720,90},{178816,22},{178840,6},{178848,38},{178888,6},{178896,8},{178905,1},{178907,1},{178909,1},{178911,31},{178944,53},{178998,15},{179014,14},{179030,6},{179037,19},{179058,3},{179062,9},{179072,11},{179089,1},{179095,1},{179108,3},{179119,1},{179123,2},{179126,2},{179132,1},{179134,1},{179143,3},{179159,1},{179167,1},{179184,2},{179188,27},{179216,13},{179240,1},{179328,4},{179333,3},{179337,11},{179349,2},{179353,5},{179360,3},{179364,1},{179366,1},{179368,1},{179370,4},{179375,3},{179379,7},{179387,6},{179397,5},{179408,48},{179465,1},{179482,2},{179502,1},{179533,3},{179588,1},{179593,1},{179596,1},{179620,1},{179622,1},{179628,2},{179631,2},{179649,1},{179652,1},{179655,1},{179657,1},{179680,1},{179682,1},{179693,5},{179700,2},{179704,2},{179712,2},{179716,2},{179720,2},{179756,4},{179808,4},{179818,4},{179881,2},{180192,24},{180230,1},{180232,1},{180235,1},{180297,2},{180805,1},{180808,1},{180811,1},{180850,1},{188424,8},{188440,8},{188456,8},{188476,1},{188492,1},{188540,1},{192576,1},{192584,5},{192643,1},{192646,1},{192649,4},{192654,1},{192656,1},{192659,2},{192662,2},{192668,1},{192671,1},{192674,4},{192679,8},{192707,1},{192710,1},{192713,4},{192718,1},{192720,1},{192723,2},{192726,2},{192732,1},{192735,1},{192738,4},{192743,8},{192773,1},{192775,3},{192782,4},{192787,1},{192792,1},{192837,1},{192839,3},{192846,4},{192851,1},{192856,1},{192896,16},{192914,20},{192936,9},{192946,6},{192953,8},{192963,7},{192972,6},{192980,18},{193000,24},{193056,2},{193071,2},{193092,25},{193118,6},{193126,16},{193144,36},{193182,2},{193190,14},{193328,9},{193368,6},{193376,5},{193472,2},{193475,2},{193524,1},{193530,1},{193534,1},{193540,7},{193548,1},{193550,3},{193578,7},{193610,5},{193616,7},{193648,3},{193652,2},{193657,1},{193664,2},{193667,1},{193671,1},{193676,3},{193689,1},{193721,1},{193744,2},{193747,1},{193751,1},{193756,3},{193782,2},{193857,2},{193872,4},{193878,2},{193882,6},{193890,6},{193898,12},{193912,2},{194055,1},{194210,5},{194293,4},{194368,1},{194370,1},{194387,1},{194985,1},{194993,1},{194996,1},{195032,8},{195147,2},{195164,2},{195167,1},{195251,1},{195254,1},{195289,3},{195294,1},{195528,1},{195531,2},{195548,2},{195604,1},{195658,3},{195784,1},{195904,1},{195911,2},{195914,2},{196042,3},{196186,1},{196188,3},{196275,1},{196403,1},{196444,2},{196492,1},{196547,1},{196557,1},{196562,1},{196567,1},{196572,1},{196585,1},{196595,1},{196597,5}}; #else /* GNUSTEP_INDEX_CHARSET */ static const unsigned char decimalDigitCharSet[24576] = {'\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x03','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x03','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x21','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x83','\x64','\x00','\x00','\x00','\x00','\x00','\x00','\x9f','\x8c','\x00','\x00','\x00','\x00','\x00','\x20','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x60','\x06','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x07','\x00','\x00','\x00','\x83','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x60','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x70','\x07','\x00','\x00','\x00','\x00','\xff','\x07','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x30','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x11','\x04','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x20','\x09','\x00','\x00','\x00','\x00','\x04','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x00','\xff','\x00','\xff','\x00','\x10','\x00','\x10','\x00','\x00','\x00','\x00','\x00','\x10','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x51','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x10','\xc8','\xf1','\x91','\xbc','\x7f','\x00','\x00','\x18','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xa0','\x31','\xa0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x18','\xc0','\xfc','\x91','\xbc','\x7f','\x00','\x00','\x22','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x17','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x51','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x10','\xc8','\xf1','\x91','\xbc','\x7f','\x00','\x00','\x13','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xe0','\x49','\xc5','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x18','\xc0','\xfc','\x91','\xbc','\x7f','\x00','\x00','\x1b','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x12','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x41','\x09','\x00','\x00','\x00','\x00','\x00','\x00','\xf8','\x5c','\xd9','\x90','\xbc','\x7f','\x00','\x00','\xf8','\x5c','\xd9','\x90','\xbc','\x7f','\x00','\x00','\x60','\xb4','\x0b','\x01','\x00','\x00','\x00','\x00','\x60','\xb4','\x0b','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\x61','\xd9','\x90','\xbc','\x7f','\x00','\x00','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x50','\xb5','\x0b','\x01','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x60','\xb5','\x0b','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x23','\xd9','\x90','\xbc','\x7f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xbf','\x20','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x40','\x1e','\xd9','\x90','\xbc','\x7f','\x00','\x00','\x51','\x07','\x00','\x00','\x00','\x00','\x00','\x00','\xb8','\x57','\xd9','\x90','\xbc','\x7f','\x00','\x00','\xb8','\x57','\xd9','\x90','\xbc','\x7f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x40','\x1e','\xd9','\x90','\xbc','\x7f','\x00','\x00','\x01','\x07','\x00','\x00','\x00','\x00','\x00','\x00','\xb8','\x57','\xd9','\x90','\xbc','\x7f','\x00','\x00','\xb8','\x57','\xd9','\x90','\xbc','\x7f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xe7','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x15','\x40','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x00','\xff','\x00','\x3f','\x00','\xff','\x00','\xff','\x00','\x3f','\x00','\xaa','\x00','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x0f','\x00','\x0f','\x00','\x0f','\x00','\x1f','\x00','\x0f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x84','\x38','\x27','\x3e','\x50','\x3d','\x0f','\xc0','\x20','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x08','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\x7f','\x00','\x00','\x00','\x00','\x00','\x00','\x9d','\xea','\x25','\xc0','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x05','\x28','\x04','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x06','\x00','\xcf','\xfc','\xfc','\xfc','\x3f','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x7c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xe0','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x05','\x00','\x08','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x02','\x12','\x00','\x00','\x00','\x00','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x18','\x00','\xb0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x48','\x00','\x00','\x00','\x00','\x4e','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x19','\x00','\x30','\x00','\x00','\x00','\x00','\x00','\x00','\x10','\x00','\x00','\x00','\x00','\x00','\x00','\x1c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x81','\x0d','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x1c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x74','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x08','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x08','\x00','\x00','\x00','\x00','\x30','\x00','\x00','\x00','\x00','\x00','\x10','\x00','\x00','\x00','\x00','\x00','\x00','\x08','\x20','\x84','\x10','\x00','\x02','\xe8','\x03','\x02','\x00','\x08','\x20','\x84','\x10','\x00','\x02','\xa1','\x02','\x00','\x00','\x00','\x00','\x00','\x00','\x48','\x5a','\xd9','\x90','\xbc','\x7f','\x00','\x00','\x48','\x5a','\xd9','\x90','\xbc','\x7f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x10','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x40','\x55','\x04','\x00','\x00','\x00','\x00','\x28','\x0b','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x70','\xff','\xf7','\xff','\xbf','\xff','\xff','\xff','\x07','\x00','\x01','\x00','\x00','\x00','\xf8','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x0f','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x03','\xff','\xff','\x3f','\x3f','\xff','\xff','\xff','\xff','\x3f','\x3f','\xff','\xaa','\xff','\xff','\xff','\x3f','\xff','\xff','\xff','\xff','\xff','\xff','\xdf','\xff','\xdf','\xff','\xcf','\xef','\xff','\xff','\xdc','\x7f','\xff','\x07','\x82','\x00','\x70','\x80','\xd8','\x50','\x80','\x03','\x80','\x80','\x00','\x00','\xf3','\xff','\xff','\x7f','\xff','\x1f','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xef','\xfe','\x6f','\x3e','\x57','\xbd','\xfb','\xfb','\xe1','\x03','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x02','\x00','\x0c','\x00','\x40','\x00','\x00','\x00','\xe0','\x00','\x00','\x00','\x00','\x00','\x00','\x10','\x12','\x00','\x00','\x50','\xb0','\x01','\x00','\x92','\x02','\x00','\x00','\x05','\xe0','\x33','\x03','\x33','\x03','\x00','\x00','\x00','\xf0','\x00','\x00','\x00','\x00','\x00','\x00','\x0f','\x3c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x06','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\x00','\x40','\x09','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x06','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x20','\x09','\x00','\x00','\x00','\x00','\x04','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x00','\xff','\x00','\xff','\x00','\x10','\x00','\x10','\x00','\x00','\x00','\x00','\x00','\x10','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01','\x1f','\x00','\x00','\x00','\x00','\x00','\x00','\x48','\x5e','\xd9','\x90','\xbc','\x7f','\x00','\x00','\x48','\x5e','\xd9','\x90','\xbc','\x7f','\x00','\x00','\xa0','\xc3','\x0b','\x01','\x00','\x00','\x00','\x00','\xa0','\xc3','\x0b','\x01','\x00','\x00','\x00','\x00','\xff','\xff','\xfc','\xff','\x3f','\xff','\xfd','\xfe','\xf9','\xf3','\xf3','\xff','\x3f','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x03','\x80','\x01','\x00','\xf0','\xff','\xff','\xdf','\xcf','\xff','\x3f','\xff','\xff','\xff','\xff','\xcf','\xc0','\xff','\x0f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x01','\x00','\x00','\x00','\x3f','\x1f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x1b','\x00','\x00','\x00','\x00','\x00','\x10','\x44','\xf0','\xd7','\x01','\x00','\x00','\xfc','\x01','\x00','\x00','\x7c','\x7f','\x00','\x00','\x00','\x37','\x02','\x8b','\x70','\x00','\x02','\x00','\x00','\x00','\x02','\x00','\x00','\x8b','\x70','\x00','\x00','\xc0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x06','\x00','\xcf','\xfc','\xfc','\xfc','\x3f','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x7c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xe0','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x05','\x00','\x08','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x02','\x12','\x00','\x00','\x00','\x00','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x18','\x00','\xb0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x48','\x00','\x00','\x00','\x00','\x4e','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x19','\x00','\x30','\x00','\x00','\x00','\x00','\x00','\x00','\x10','\x00','\x00','\x00','\x00','\x00','\x00','\x1c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x81','\x0d','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x1c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x74','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x08','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x08','\x00','\x00','\x00','\x00','\x30','\x00','\x00','\x00','\x00','\x00','\x10','\x00','\x00','\x00','\x00','\x00','\x00','\x08','\x20','\x84','\x10','\x00','\x02','\xe8','\x03'}; #endif /* GNUSTEP_INDEX_CHARSET */ #if defined(GNUSTEP_INDEX_CHARSET) static const NSRange decomposableCharSet[] = {{160,1},{168,1},{170,1},{175,1},{178,4},{184,3},{188,3},{192,6},{199,9},{209,6},{217,5},{224,6},{231,9},{241,6},{249,5},{255,17},{274,20},{296,9},{306,6},{313,8},{323,7},{332,6},{340,18},{360,24},{416,2},{431,2},{452,25},{478,6},{486,16},{504,36},{542,2},{550,14},{688,9},{728,6},{736,5},{832,2},{835,2},{884,1},{890,1},{894,1},{900,7},{908,1},{910,3},{938,7},{970,5},{976,7},{1008,3},{1012,2},{1017,1},{1024,2},{1027,1},{1031,1},{1036,3},{1049,1},{1081,1},{1104,2},{1107,1},{1111,1},{1116,3},{1142,2},{1217,2},{1232,4},{1238,2},{1242,6},{1250,6},{1258,12},{1272,2},{1415,1},{1570,5},{1653,4},{1728,1},{1730,1},{1747,1},{2345,1},{2353,1},{2356,1},{2392,8},{2507,2},{2524,2},{2527,1},{2611,1},{2614,1},{2649,3},{2654,1},{2888,1},{2891,2},{2908,2},{2964,1},{3018,3},{3144,1},{3264,1},{3271,2},{3274,2},{3402,3},{3546,1},{3548,3},{3635,1},{3763,1},{3804,2},{3852,1},{3907,1},{3917,1},{3922,1},{3927,1},{3932,1},{3945,1},{3955,1},{3957,5},{3969,1},{3987,1},{3997,1},{4002,1},{4007,1},{4012,1},{4025,1},{4134,1},{4348,1},{6918,1},{6920,1},{6922,1},{6924,1},{6926,1},{6930,1},{6971,1},{6973,1},{6976,2},{6979,1},{7468,3},{7472,11},{7484,18},{7503,28},{7544,1},{7579,37},{7680,156},{7840,90},{7936,22},{7960,6},{7968,38},{8008,6},{8016,8},{8025,1},{8027,1},{8029,1},{8031,31},{8064,53},{8118,15},{8134,14},{8150,6},{8157,19},{8178,3},{8182,9},{8192,11},{8209,1},{8215,1},{8228,3},{8239,1},{8243,2},{8246,2},{8252,1},{8254,1},{8263,3},{8279,1},{8287,1},{8304,2},{8308,27},{8336,13},{8360,1},{8448,4},{8453,3},{8457,11},{8469,2},{8473,5},{8480,3},{8484,1},{8486,1},{8488,1},{8490,4},{8495,3},{8499,7},{8507,6},{8517,5},{8528,48},{8585,1},{8602,2},{8622,1},{8653,3},{8708,1},{8713,1},{8716,1},{8740,1},{8742,1},{8748,2},{8751,2},{8769,1},{8772,1},{8775,1},{8777,1},{8800,1},{8802,1},{8813,5},{8820,2},{8824,2},{8832,2},{8836,2},{8840,2},{8876,4},{8928,4},{8938,4},{9001,2},{9312,139},{10764,1},{10868,3},{10972,1},{11388,2},{11631,1},{11935,1},{12019,1},{12032,214},{12288,1},{12342,1},{12344,3},{12364,1},{12366,1},{12368,1},{12370,1},{12372,1},{12374,1},{12376,1},{12378,1},{12380,1},{12382,1},{12384,1},{12386,1},{12389,1},{12391,1},{12393,1},{12400,2},{12403,2},{12406,2},{12409,2},{12412,2},{12436,1},{12443,2},{12446,2},{12460,1},{12462,1},{12464,1},{12466,1},{12468,1},{12470,1},{12472,1},{12474,1},{12476,1},{12478,1},{12480,1},{12482,1},{12485,1},{12487,1},{12489,1},{12496,2},{12499,2},{12502,2},{12505,2},{12508,2},{12532,1},{12535,4},{12542,2},{12593,94},{12690,14},{12800,31},{12832,40},{12880,47},{12928,384},{42652,2},{42864,1},{43000,2},{43868,4},{43881,1},{63744,270},{64016,1},{64018,1},{64021,10},{64032,1},{64034,1},{64037,2},{64042,68},{64112,106},{64256,7},{64275,5},{64285,1},{64287,24},{64312,5},{64318,1},{64320,2},{64323,2},{64326,108},{64467,363},{64848,64},{64914,54},{65008,13},{65040,10},{65072,21},{65095,12},{65108,19},{65128,4},{65136,3},{65140,1},{65142,135},{65281,190},{65474,6},{65482,6},{65490,6},{65498,3},{65504,7},{65512,7},{69786,1},{69788,1},{69803,1},{69934,2},{70475,2},{70843,2},{70846,1},{71098,2},{71992,1},{119134,7},{119227,6},{119808,85},{119894,71},{119966,2},{119970,1},{119973,2},{119977,4},{119982,12},{119995,1},{119997,7},{120005,65},{120071,4},{120077,8},{120086,7},{120094,28},{120123,4},{120128,5},{120134,1},{120138,7},{120146,340},{120488,292},{120782,50},{126464,4},{126469,27},{126497,2},{126500,1},{126503,1},{126505,10},{126516,4},{126521,1},{126523,1},{126530,1},{126535,1},{126537,1},{126539,1},{126541,3},{126545,2},{126548,1},{126551,1},{126553,1},{126555,1},{126557,1},{126559,1},{126561,2},{126564,1},{126567,4},{126572,7},{126580,4},{126585,4},{126590,1},{126592,10},{126603,17},{126625,3},{126629,5},{126635,17},{127232,11},{127248,31},{127280,32},{127338,3},{127376,1},{127488,3},{127504,44},{127552,9},{127568,2},{130032,10},{194560,542}}; #else /* GNUSTEP_INDEX_CHARSET */ static const unsigned char decomposableCharSet[24576] = {'\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01','\x85','\x3c','\x77','\xbf','\xff','\x7e','\x3e','\xbf','\xff','\x7e','\xbe','\xff','\xff','\xfc','\xff','\x3f','\xff','\xfd','\xfe','\xf9','\xf3','\xf3','\xff','\x3f','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x03','\x80','\x01','\x00','\xf0','\xff','\xff','\xdf','\xcf','\xff','\x3f','\xff','\xff','\xff','\xff','\xcf','\xc0','\xff','\x0f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x01','\x00','\x00','\x00','\x3f','\x1f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x1b','\x00','\x00','\x00','\x00','\x00','\x10','\x44','\xf0','\xd7','\x01','\x00','\x00','\xfc','\x01','\x00','\x00','\x7c','\x7f','\x00','\x00','\x00','\x37','\x02','\x8b','\x70','\x00','\x02','\x00','\x00','\x00','\x02','\x00','\x00','\x8b','\x70','\x00','\x00','\xc0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x06','\x00','\xcf','\xfc','\xfc','\xfc','\x3f','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x7c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xe0','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x05','\x00','\x08','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x02','\x12','\x00','\x00','\x00','\x00','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x18','\x00','\xb0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x48','\x00','\x00','\x00','\x00','\x4e','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x19','\x00','\x30','\x00','\x00','\x00','\x00','\x00','\x00','\x10','\x00','\x00','\x00','\x00','\x00','\x00','\x1c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x81','\x0d','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x1c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x74','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x08','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x08','\x00','\x00','\x00','\x00','\x30','\x00','\x00','\x00','\x00','\x00','\x10','\x00','\x00','\x00','\x00','\x00','\x00','\x08','\x20','\x84','\x10','\x00','\x02','\xe8','\x03','\x02','\x00','\x08','\x20','\x84','\x10','\x00','\x02','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x40','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x10','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x40','\x55','\x04','\x00','\x00','\x00','\x00','\x28','\x0b','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x70','\xff','\xf7','\xff','\xbf','\xff','\xff','\xff','\x07','\x00','\x01','\x00','\x00','\x00','\xf8','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x0f','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x03','\xff','\xff','\x3f','\x3f','\xff','\xff','\xff','\xff','\x3f','\x3f','\xff','\xaa','\xff','\xff','\xff','\x3f','\xff','\xff','\xff','\xff','\xff','\xff','\xdf','\xff','\xdf','\xff','\xcf','\xef','\xff','\xff','\xdc','\x7f','\xff','\x07','\x82','\x00','\x70','\x80','\xd8','\x50','\x80','\x03','\x80','\x80','\x00','\x00','\xf3','\xff','\xff','\x7f','\xff','\x1f','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xef','\xfe','\x6f','\x3e','\x57','\xbd','\xfb','\xfb','\xe1','\x03','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x02','\x00','\x0c','\x00','\x40','\x00','\x00','\x00','\xe0','\x00','\x00','\x00','\x00','\x00','\x00','\x10','\x12','\x00','\x00','\x50','\xb0','\x01','\x00','\x92','\x02','\x00','\x00','\x05','\xe0','\x33','\x03','\x33','\x03','\x00','\x00','\x00','\xf0','\x00','\x00','\x00','\x00','\x00','\x00','\x0f','\x3c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x06','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x07','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x10','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x70','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x10','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x30','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x08','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x3f','\x00','\x00','\x00','\x00','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x40','\x07','\x00','\x50','\x55','\x55','\xa5','\x02','\xdb','\x36','\x00','\x00','\x10','\xd8','\x00','\x50','\x55','\x55','\xa5','\x02','\xdb','\x36','\x00','\x00','\x90','\xc7','\x00','\x00','\x00','\x00','\x00','\x00','\xfe','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x7f','\xfc','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\x7f','\xff','\xff','\xff','\xff','\xff','\x00','\xff','\xff','\xff','\xff','\xff','\x7f','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x30','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf0','\x00','\x02','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x3f','\xe5','\x7f','\x65','\xfc','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x3f','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x03','\x00','\x00','\x00','\x00','\x7f','\x00','\xf8','\xa0','\xff','\xff','\x7f','\x5f','\xdb','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x03','\x00','\x00','\x00','\xf8','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x3f','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xfc','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\xff','\x1f','\x00','\x00','\xff','\x03','\x00','\x00','\xff','\xff','\x9f','\xff','\xf7','\xff','\x7f','\x0f','\xd7','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x1f','\xfe','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x7f','\xfc','\xfc','\xfc','\x1c','\x7f','\x7f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x14','\x00','\x08','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x18','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x58','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x0c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\x1f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf8','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xdf','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xdf','\x64','\xde','\xff','\xeb','\xef','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xbf','\xe7','\xdf','\xdf','\xff','\xff','\xff','\x7b','\x5f','\xfc','\xfd','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x3f','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xcf','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xef','\xff','\xff','\xff','\x96','\xfe','\xf7','\x0a','\x84','\xea','\x96','\xaa','\x96','\xf7','\xf7','\x5e','\xff','\xfb','\xff','\x0f','\xee','\xfb','\xff','\x0f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x07','\xff','\xff','\xff','\x7f','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x1c','\x00','\x00','\x00','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x07','\x00','\xff','\xff','\xff','\xff','\xff','\x0f','\xff','\x01','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x3f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00'}; #endif /* GNUSTEP_INDEX_CHARSET */ #if defined(GNUSTEP_INDEX_CHARSET) static const NSRange illegalCharSet[] = {{888,2},{896,4},{907,1},{909,1},{930,1},{1328,1},{1367,2},{1419,2},{1424,1},{1480,8},{1515,4},{1525,11},{1565,1},{1806,1},{1867,2},{1970,14},{2043,2},{2094,2},{2111,1},{2140,2},{2143,1},{2155,53},{2229,1},{2248,11},{2436,1},{2445,2},{2449,2},{2473,1},{2481,1},{2483,3},{2490,2},{2501,2},{2505,2},{2511,8},{2520,4},{2526,1},{2532,2},{2559,2},{2564,1},{2571,4},{2577,2},{2601,1},{2609,1},{2612,1},{2615,1},{2618,2},{2621,1},{2627,4},{2633,2},{2638,3},{2642,7},{2653,1},{2655,7},{2679,10},{2692,1},{2702,1},{2706,1},{2729,1},{2737,1},{2740,1},{2746,2},{2758,1},{2762,1},{2766,2},{2769,15},{2788,2},{2802,7},{2816,1},{2820,1},{2829,2},{2833,2},{2857,1},{2865,1},{2868,1},{2874,2},{2885,2},{2889,2},{2894,7},{2904,4},{2910,1},{2916,2},{2936,10},{2948,1},{2955,3},{2961,1},{2966,3},{2971,1},{2973,1},{2976,3},{2981,3},{2987,3},{3002,4},{3011,3},{3017,1},{3022,2},{3025,6},{3032,14},{3067,5},{3085,1},{3089,1},{3113,1},{3130,3},{3141,1},{3145,1},{3150,7},{3159,1},{3163,5},{3172,2},{3184,7},{3213,1},{3217,1},{3241,1},{3252,1},{3258,2},{3269,1},{3273,1},{3278,7},{3287,7},{3295,1},{3300,2},{3312,1},{3315,13},{3341,1},{3345,1},{3397,1},{3401,1},{3408,4},{3428,2},{3456,1},{3460,1},{3479,3},{3506,1},{3516,1},{3518,2},{3527,3},{3531,4},{3541,1},{3543,1},{3552,6},{3568,2},{3573,12},{3643,4},{3676,37},{3715,1},{3717,1},{3723,1},{3748,1},{3750,1},{3774,2},{3781,1},{3783,1},{3790,2},{3802,2},{3808,32},{3912,1},{3949,4},{3992,1},{4029,1},{4045,1},{4059,37},{4294,1},{4296,5},{4302,2},{4681,1},{4686,2},{4695,1},{4697,1},{4702,2},{4745,1},{4750,2},{4785,1},{4790,2},{4799,1},{4801,1},{4806,2},{4823,1},{4881,1},{4886,2},{4955,2},{4989,3},{5018,6},{5110,2},{5118,2},{5789,3},{5881,7},{5901,1},{5909,11},{5943,9},{5972,12},{5997,1},{6001,1},{6004,12},{6110,2},{6122,6},{6138,6},{6159,1},{6170,6},{6265,7},{6315,5},{6390,10},{6431,1},{6444,4},{6460,4},{6465,3},{6510,2},{6517,11},{6572,4},{6602,6},{6619,3},{6684,2},{6751,1},{6781,2},{6794,6},{6810,6},{6830,2},{6849,63},{6988,4},{7037,3},{7156,8},{7224,3},{7242,3},{7305,7},{7355,2},{7368,8},{7419,5},{7674,1},{7958,2},{7966,2},{8006,2},{8014,2},{8024,1},{8026,1},{8028,1},{8030,1},{8062,2},{8117,1},{8133,1},{8148,2},{8156,1},{8176,2},{8181,1},{8191,1},{8293,1},{8306,2},{8335,1},{8349,3},{8384,16},{8433,15},{8588,4},{9255,25},{9291,21},{11124,2},{11158,1},{11311,1},{11359,1},{11508,5},{11558,1},{11560,5},{11566,2},{11624,7},{11633,14},{11671,9},{11687,1},{11695,1},{11703,1},{11711,1},{11719,1},{11727,1},{11735,1},{11743,1},{11859,45},{11930,1},{12020,12},{12246,26},{12284,4},{12352,1},{12439,2},{12544,5},{12592,1},{12687,1},{12772,12},{12831,1},{19903,1},{40956,4},{42125,3},{42183,9},{42540,20},{42744,8},{42944,2},{42955,42},{43053,3},{43066,6},{43128,8},{43206,8},{43226,6},{43348,11},{43389,3},{43470,1},{43482,4},{43519,1},{43575,9},{43598,2},{43610,2},{43715,24},{43767,10},{43783,2},{43791,2},{43799,9},{43815,1},{43823,1},{43884,4},{44014,2},{44026,6},{55203,13},{55239,4},{55292,4},{56191,1},{56319,1},{57343,1},{63743,1},{64110,2},{64218,38},{64263,12},{64280,5},{64311,1},{64317,1},{64319,1},{64322,1},{64325,1},{64450,17},{64832,16},{64912,2},{64968,40},{65022,2},{65050,6},{65107,1},{65127,1},{65132,4},{65141,1},{65277,2},{65280,1},{65471,3},{65480,2},{65488,2},{65496,2},{65501,3},{65511,1},{65519,10},{65534,2},{65548,1},{65575,1},{65595,1},{65598,1},{65614,2},{65630,34},{65787,5},{65795,4},{65844,3},{65935,1},{65949,3},{65953,47},{66046,130},{66205,3},{66257,15},{66300,4},{66340,9},{66379,5},{66427,5},{66462,1},{66500,4},{66518,42},{66718,2},{66730,6},{66772,4},{66812,4},{66856,8},{66916,11},{66928,144},{67383,9},{67414,10},{67432,152},{67590,2},{67593,1},{67638,1},{67641,3},{67645,2},{67670,1},{67743,8},{67760,48},{67827,1},{67830,5},{67868,3},{67898,5},{67904,64},{68024,4},{68048,2},{68100,1},{68103,5},{68116,1},{68120,1},{68150,2},{68155,4},{68169,7},{68185,7},{68256,32},{68327,4},{68343,9},{68406,3},{68438,2},{68467,5},{68498,7},{68509,12},{68528,80},{68681,55},{68787,13},{68851,7},{68904,8},{68922,294},{69247,1},{69290,1},{69294,2},{69298,78},{69416,8},{69466,86},{69580,20},{69623,9},{69710,4},{69744,15},{69826,11},{69838,2},{69865,7},{69882,6},{69941,1},{69960,8},{70007,9},{70112,1},{70133,11},{70162,1},{70207,65},{70279,1},{70281,1},{70286,1},{70302,1},{70314,6},{70379,5},{70394,6},{70404,1},{70413,2},{70417,2},{70441,1},{70449,1},{70452,1},{70458,1},{70469,2},{70473,2},{70478,2},{70481,6},{70488,5},{70500,2},{70509,3},{70517,139},{70748,1},{70754,30},{70856,8},{70874,166},{71094,2},{71134,34},{71237,11},{71258,6},{71277,19},{71353,7},{71370,54},{71451,2},{71468,4},{71488,192},{71740,100},{71923,12},{71943,2},{71946,2},{71956,1},{71959,1},{71990,1},{71993,2},{72007,9},{72026,70},{72104,2},{72152,2},{72165,27},{72264,8},{72355,29},{72441,263},{72713,1},{72759,1},{72774,10},{72813,3},{72848,2},{72872,1},{72887,73},{72967,1},{72970,1},{73015,3},{73019,1},{73022,1},{73032,8},{73050,6},{73062,1},{73065,1},{73103,1},{73106,1},{73113,7},{73130,310},{73465,183},{73649,15},{73714,13},{74650,102},{74863,1},{74869,11},{75076,2748},{78895,1},{78905,4039},{83527,8633},{92729,7},{92767,1},{92778,4},{92784,96},{92910,2},{92918,10},{92998,10},{93018,1},{93026,1},{93048,5},{93072,688},{93851,101},{94027,4},{94088,7},{94112,64},{94181,11},{94194,14},{100343,9},{101590,42},{101640,8952},{110879,49},{110931,17},{110952,8},{111356,2308},{113771,5},{113789,3},{113801,7},{113818,2},{113828,4956},{119030,10},{119079,2},{119273,23},{119366,154},{119540,12},{119639,9},{119673,135},{119893,1},{119965,1},{119968,2},{119971,2},{119975,2},{119981,1},{119994,1},{119996,1},{120004,1},{120070,1},{120075,2},{120085,1},{120093,1},{120122,1},{120127,1},{120133,1},{120135,3},{120145,1},{120486,2},{120780,2},{121484,15},{121504,1},{121520,1360},{122887,1},{122905,2},{122914,1},{122917,1},{122923,213},{123181,3},{123198,2},{123210,4},{123216,368},{123642,5},{123648,1280},{125125,2},{125143,41},{125260,4},{125274,4},{125280,785},{126133,76},{126270,194},{126468,1},{126496,1},{126499,1},{126501,2},{126504,1},{126515,1},{126520,1},{126522,1},{126524,6},{126531,4},{126536,1},{126538,1},{126540,1},{126544,1},{126547,1},{126549,2},{126552,1},{126554,1},{126556,1},{126558,1},{126560,1},{126563,1},{126565,2},{126571,1},{126579,1},{126584,1},{126589,1},{126591,1},{126602,1},{126620,5},{126628,1},{126634,1},{126652,52},{126706,270},{127020,4},{127124,12},{127151,2},{127168,1},{127184,1},{127222,10},{127406,56},{127491,13},{127548,4},{127561,7},{127570,14},{127590,154},{128728,8},{128749,3},{128765,3},{128884,12},{128985,7},{129004,20},{129036,4},{129096,8},{129114,6},{129160,8},{129198,2},{129202,78},{129401,1},{129484,1},{129620,12},{129646,2},{129653,3},{129659,5},{129671,9},{129705,7},{129719,9},{129731,13},{129751,41},{129939,1},{129995,37},{130042,1030},{173789,35},{177972,12},{178205,3},{183969,15},{191456,3104},{195102,1506},{201546,715959},{917506,30},{917632,128},{918000,65040},{1048573,3},{1114109,3}}; #else /* GNUSTEP_INDEX_CHARSET */ static const unsigned char illegalCharSet[139264] = {'\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x03','\x0f','\x28','\x00','\x00','\x04','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01','\x00','\x00','\x00','\x80','\x01','\x00','\x00','\x00','\x00','\x00','\x18','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x00','\x00','\x00','\x78','\xe0','\xff','\x00','\x00','\x00','\x20','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x40','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x18','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfc','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x18','\x00','\x00','\x00','\x00','\x00','\xc0','\x00','\x80','\x00','\x00','\x00','\xb0','\x00','\xf8','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x20','\x00','\x00','\xff','\x07','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x10','\x60','\x06','\x00','\x00','\x02','\x3a','\x0c','\x60','\x86','\x7f','\x4f','\x30','\x00','\x00','\x80','\x11','\x78','\x06','\x00','\x00','\x02','\x92','\x2c','\x78','\xc6','\xfd','\xa1','\x3f','\x00','\x80','\xff','\x11','\x40','\x04','\x00','\x00','\x02','\x12','\x0c','\x40','\xc4','\xfe','\xff','\x30','\x00','\xfc','\x01','\x11','\x60','\x06','\x00','\x00','\x02','\x12','\x0c','\x60','\xc6','\x1f','\x4f','\x30','\x00','\x00','\xff','\x13','\x38','\xc2','\x29','\xe7','\x38','\x00','\x3c','\x38','\xc2','\x7e','\xff','\x3f','\x00','\x00','\xf8','\x00','\x20','\x02','\x00','\x00','\x02','\x00','\x1c','\x20','\xc2','\x9f','\xf8','\x30','\x00','\x7f','\x00','\x00','\x20','\x02','\x00','\x00','\x02','\x10','\x0c','\x20','\xc2','\x9f','\xbf','\x30','\x00','\xf9','\xff','\x00','\x20','\x02','\x00','\x00','\x00','\x00','\x00','\x20','\x02','\x0f','\x00','\x30','\x00','\x00','\x00','\x11','\x00','\x80','\x03','\x00','\x00','\x04','\xd0','\x80','\x7b','\xa0','\x00','\x3f','\x00','\xe3','\xff','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x78','\x00','\x00','\x00','\xf0','\xff','\xff','\xff','\xff','\x29','\x08','\x00','\x00','\x50','\x00','\x00','\xc0','\xa0','\xc0','\x00','\x0c','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01','\x00','\x00','\x00','\xe0','\x01','\x00','\x00','\x00','\x00','\x01','\x00','\x00','\x00','\x20','\x00','\x20','\x00','\xf8','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x40','\xdf','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc2','\x80','\xc2','\x00','\x00','\x00','\x00','\x00','\xc2','\x00','\x00','\x00','\x00','\xc2','\x80','\xc2','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc2','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x18','\x00','\x00','\x00','\xe0','\x00','\x00','\x00','\xfc','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\xc0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xe0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfe','\x00','\x20','\xe0','\xff','\x00','\x00','\x80','\xff','\x00','\x00','\xf0','\xff','\x00','\x20','\xf2','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\x00','\xfc','\x00','\xfc','\x00','\x80','\x00','\xfc','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfe','\x00','\x00','\x00','\x00','\x00','\xf8','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\xff','\x00','\x00','\x00','\x80','\x00','\xf0','\x00','\xf0','\x0e','\x00','\x00','\x00','\x00','\xc0','\xe0','\xff','\x00','\x00','\x00','\x00','\x00','\xf0','\x00','\x00','\x00','\xfc','\x00','\x38','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x30','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x60','\x00','\xfc','\x00','\xfc','\x00','\xc0','\x00','\x00','\xfe','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf0','\x00','\x00','\x00','\x00','\x00','\xe0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf0','\x0f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x07','\x00','\x1c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfe','\x00','\x00','\x00','\x00','\x00','\x18','\x00','\xff','\x00','\x00','\x00','\x00','\x00','\xf8','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x04','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\xc0','\x00','\x00','\x00','\x00','\xc0','\xc0','\x00','\x55','\x00','\x00','\x00','\xc0','\x00','\x00','\x00','\x00','\x00','\x00','\x20','\x00','\x20','\x00','\x30','\x10','\x00','\x00','\x23','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x20','\x00','\x0c','\x00','\x00','\x80','\x00','\xe0','\x00','\x00','\x00','\x00','\xff','\xff','\x00','\x00','\x00','\x00','\xfe','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\xff','\xff','\xff','\x00','\xf8','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x30','\x00','\x00','\x00','\x40','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf0','\x01','\x00','\x00','\x00','\x00','\x40','\xdf','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x7f','\xfe','\x7f','\x00','\x00','\x80','\xff','\x80','\x80','\x80','\x80','\x80','\x80','\x80','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf8','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x04','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf0','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\xff','\xff','\xff','\x00','\xf0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x1f','\x00','\x00','\x00','\x00','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf0','\xff','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xe0','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf0','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x03','\xf8','\xff','\xff','\xff','\xff','\x1f','\x00','\x00','\x00','\x00','\x00','\x00','\xe0','\x00','\xfc','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\x3f','\x00','\xfc','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf0','\x7f','\x00','\x00','\x00','\xe0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x40','\x00','\x3c','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\xff','\x00','\xc0','\x00','\x0c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf8','\xff','\xff','\x07','\x00','\x00','\x80','\xff','\x81','\x81','\x81','\xff','\x80','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\x00','\xfc','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf8','\xff','\x00','\x00','\x80','\x07','\x00','\x00','\x00','\x00','\x00','\xf0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfc','\xff','\xff','\xff','\xff','\x80','\xff','\x07','\x1f','\x00','\x00','\x80','\xa0','\x24','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfc','\xff','\x07','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\x00','\xc0','\x00','\x00','\x00','\xfc','\x00','\x00','\x00','\x00','\x00','\x00','\x08','\x00','\x80','\xf0','\x20','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x60','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x03','\x03','\x03','\xe3','\x80','\x80','\xff','\xc1','\x00','\x10','\x00','\x00','\x80','\x00','\x00','\x48','\x00','\xc0','\x00','\xc0','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf8','\x78','\x00','\x00','\x00','\x00','\x00','\x70','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\xe0','\xfe','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\xc0','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\xe0','\x00','\x00','\x00','\x00','\x00','\x00','\xfe','\xff','\x00','\x00','\x00','\xf0','\x00','\x00','\x00','\x00','\xf0','\x1f','\x00','\x00','\x00','\xf8','\x00','\x00','\x00','\x00','\x00','\xf8','\x00','\x00','\x00','\x40','\x00','\x00','\x00','\x00','\xf0','\x00','\xc0','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\x00','\xfc','\x00','\x00','\x00','\x00','\xf0','\x00','\x00','\x00','\x00','\xf0','\x00','\x00','\x00','\x00','\x00','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\xf0','\x7f','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\xff','\x00','\x00','\xc0','\xff','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xc0','\x02','\x00','\x00','\x00','\x00','\x40','\x6e','\x00','\x00','\x40','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x7f','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\xc8','\x07','\x00','\x00','\x00','\x70','\x00','\x00','\x00','\x7c','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x0f','\x00','\x00','\x03','\x00','\x00','\x00','\x00','\x00','\x90','\x0f','\x10','\x01','\x00','\x00','\xc0','\x78','\x00','\xfe','\x00','\xfe','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x80','\x07','\x80','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\x01','\x00','\x00','\xc0','\x00','\x00','\x00','\xf8','\x00','\x00','\x00','\xfc','\xe1','\xff','\x01','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfe','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\xf8','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\xf8','\x03','\x00','\x00','\x00','\x00','\x00','\xff','\x00','\xfc','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\xc4','\xfc','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\xff','\x00','\x00','\x00','\x00','\x00','\xfc','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\xf0','\xff','\xff','\x00','\x00','\x80','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\x03','\x00','\x00','\x00','\xff','\x7f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfc','\xdf','\x00','\x00','\x00','\xfe','\x00','\xfc','\x00','\x00','\x00','\x00','\x00','\x00','\x20','\x00','\x00','\xff','\x00','\x00','\x00','\x00','\x80','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01','\x00','\xe0','\xff','\x00','\x00','\x04','\x00','\x00','\x00','\x00','\x80','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x80','\x42','\x00','\x40','\x00','\xfc','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf8','\x00','\xfc','\x10','\x60','\x06','\x00','\x00','\x02','\x12','\x04','\x60','\xc6','\x7e','\x1f','\x30','\xe0','\xe0','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x10','\xfc','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x00','\xfc','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\x00','\x00','\x00','\x00','\xc0','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xe0','\xff','\x00','\xfc','\x00','\xe0','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfe','\x00','\xfc','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x18','\x00','\xf0','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf0','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf8','\x7f','\x80','\x0d','\x90','\x00','\x00','\x00','\x40','\x06','\x80','\xff','\x00','\xfc','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x03','\x00','\x00','\x00','\x00','\x00','\x03','\xe0','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf8','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfe','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x02','\x00','\x00','\x00','\x00','\x80','\x00','\xc0','\xff','\x00','\x00','\x00','\xe0','\x00','\x00','\x00','\x00','\x03','\x00','\x00','\x01','\x80','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x80','\x04','\x00','\x00','\x00','\x00','\x80','\x4b','\x00','\xff','\x00','\xfc','\x40','\x02','\x00','\x00','\x00','\x80','\x04','\xfe','\x00','\xfc','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\xfe','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xfe','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\xfc','\x7f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfc','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\xe0','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf0','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\xfe','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfe','\x00','\x00','\x00','\x80','\x00','\x3c','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\xc0','\xc0','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\xff','\x00','\x04','\x04','\x00','\x00','\x1f','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf8','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x78','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x7f','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xe0','\xff','\xfc','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\xff','\xff','\xff','\xff','\xff','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\xff','\xff','\xff','\xff','\xff','\xff','\xf8','\xff','\x0f','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf0','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf8','\x00','\xe0','\x00','\xfe','\x00','\x0c','\xf0','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\xff','\x00','\x00','\x00','\x00','\x80','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfe','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\xf0','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\xff','\x00','\x00','\x00','\xfe','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x20','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x20','\x9b','\x21','\x00','\x14','\x10','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x40','\x18','\x20','\x20','\x00','\x00','\x00','\x84','\xa0','\x03','\x02','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x30','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf0','\xff','\x07','\x01','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x80','\x00','\x00','\x06','\x24','\xf8','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\xe0','\x00','\xc0','\x00','\x3c','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x7c','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x60','\x00','\x80','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf0','\x00','\x3c','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xe0','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x10','\x00','\x00','\x00','\x69','\x01','\x08','\xf5','\x7b','\x15','\x69','\x55','\x69','\x08','\x08','\xa1','\x00','\x04','\x00','\xf0','\x11','\x04','\x00','\xf0','\xff','\xff','\xff','\xff','\xff','\xff','\xfc','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\xf0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf0','\xff','\x00','\x80','\x01','\x00','\x01','\x00','\x01','\x00','\x00','\x00','\xc0','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\xff','\xff','\xff','\xff','\xff','\xff','\x3f','\x00','\x00','\x00','\xf8','\xff','\x00','\x00','\x00','\x00','\x00','\xf0','\x00','\xfe','\xfc','\xff','\xc0','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x00','\xe0','\x00','\xe0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf0','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfe','\x00','\xf0','\xff','\xff','\x00','\xf0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x00','\xfc','\x00','\x00','\x00','\x00','\x00','\xff','\x00','\x00','\x00','\xc0','\xfc','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x02','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x10','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf0','\xff','\x00','\xc0','\xe0','\xf8','\x80','\xff','\x00','\x00','\x00','\xfe','\x80','\xff','\xf8','\xff','\x80','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x08','\x00','\x00','\x00','\x00','\x00','\x00','\xf8','\xff','\xff','\xff','\xff','\x00','\xfc','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xe0','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf0','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xe0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfe','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfc','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xfd','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xe0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xe0'}; #endif /* GNUSTEP_INDEX_CHARSET */ #if defined(GNUSTEP_INDEX_CHARSET) static const NSRange letterCharSet[] = {{65,26},{97,26},{170,1},{178,2},{181,1},{185,2},{188,3},{192,23},{216,31},{248,458},{710,12},{736,5},{748,1},{750,1},{768,117},{886,2},{890,4},{895,1},{902,1},{904,3},{908,1},{910,20},{931,83},{1015,139},{1155,173},{1329,38},{1369,1},{1376,41},{1425,45},{1471,1},{1473,2},{1476,2},{1479,1},{1488,27},{1519,4},{1552,11},{1568,64},{1646,102},{1749,8},{1759,10},{1770,6},{1786,3},{1791,1},{1808,59},{1869,101},{1994,44},{2042,1},{2045,1},{2048,46},{2112,28},{2144,11},{2208,21},{2230,18},{2259,15},{2275,129},{2417,19},{2437,8},{2447,2},{2451,22},{2474,7},{2482,1},{2486,4},{2492,9},{2503,2},{2507,4},{2519,1},{2524,2},{2527,5},{2544,2},{2548,6},{2556,1},{2558,1},{2561,3},{2565,6},{2575,2},{2579,22},{2602,7},{2610,2},{2613,2},{2616,2},{2620,1},{2622,5},{2631,2},{2635,3},{2641,1},{2649,4},{2654,1},{2672,6},{2689,3},{2693,9},{2703,3},{2707,22},{2730,7},{2738,2},{2741,5},{2748,10},{2759,3},{2763,3},{2768,1},{2784,4},{2809,7},{2817,3},{2821,8},{2831,2},{2835,22},{2858,7},{2866,2},{2869,5},{2876,9},{2887,2},{2891,3},{2901,3},{2908,2},{2911,5},{2929,7},{2946,2},{2949,6},{2958,3},{2962,4},{2969,2},{2972,1},{2974,2},{2979,2},{2984,3},{2990,12},{3006,5},{3014,3},{3018,4},{3024,1},{3031,1},{3056,3},{3072,13},{3086,3},{3090,23},{3114,16},{3133,8},{3142,3},{3146,4},{3157,2},{3160,3},{3168,4},{3192,7},{3200,4},{3205,8},{3214,3},{3218,23},{3242,10},{3253,5},{3260,9},{3270,3},{3274,4},{3285,2},{3294,1},{3296,4},{3313,2},{3328,13},{3342,3},{3346,51},{3398,3},{3402,5},{3412,16},{3440,9},{3450,6},{3457,3},{3461,18},{3482,24},{3507,9},{3517,1},{3520,7},{3530,1},{3535,6},{3542,1},{3544,8},{3570,2},{3585,58},{3648,15},{3713,2},{3716,1},{3718,5},{3724,24},{3749,1},{3751,23},{3776,5},{3782,1},{3784,6},{3804,4},{3840,1},{3864,2},{3882,10},{3893,1},{3895,1},{3897,1},{3902,10},{3913,36},{3953,20},{3974,18},{3993,36},{4038,1},{4096,64},{4176,64},{4250,4},{4256,38},{4295,1},{4301,1},{4304,43},{4348,333},{4682,4},{4688,7},{4696,1},{4698,4},{4704,41},{4746,4},{4752,33},{4786,4},{4792,7},{4800,1},{4802,4},{4808,15},{4824,57},{4882,4},{4888,67},{4957,3},{4969,20},{4992,16},{5024,86},{5112,6},{5121,620},{5743,17},{5761,26},{5792,75},{5870,11},{5888,13},{5902,7},{5920,21},{5952,20},{5984,13},{5998,3},{6002,2},{6016,84},{6103,1},{6108,2},{6128,10},{6155,3},{6176,89},{6272,43},{6320,70},{6400,31},{6432,12},{6448,12},{6480,30},{6512,5},{6528,44},{6576,26},{6618,1},{6656,28},{6688,63},{6752,29},{6783,1},{6823,1},{6832,17},{6912,76},{7019,9},{7040,48},{7098,58},{7168,56},{7245,3},{7258,36},{7296,9},{7312,43},{7357,3},{7376,3},{7380,39},{7424,250},{7675,283},{7960,6},{7968,38},{8008,6},{8016,8},{8025,1},{8027,1},{8029,1},{8031,31},{8064,53},{8118,7},{8126,1},{8130,3},{8134,7},{8144,4},{8150,6},{8160,13},{8178,3},{8182,7},{8304,2},{8308,6},{8319,11},{8336,13},{8400,33},{8450,1},{8455,1},{8458,10},{8469,1},{8473,5},{8484,1},{8486,1},{8488,1},{8490,4},{8495,11},{8508,4},{8517,5},{8526,1},{8528,58},{9312,60},{9450,22},{10102,30},{11264,47},{11312,47},{11360,133},{11499,9},{11517,1},{11520,38},{11559,1},{11565,1},{11568,56},{11631,1},{11647,24},{11680,7},{11688,7},{11696,7},{11704,7},{11712,7},{11720,7},{11728,7},{11736,7},{11744,32},{11823,1},{12293,3},{12321,15},{12337,5},{12344,5},{12353,86},{12441,2},{12445,3},{12449,90},{12540,4},{12549,43},{12593,94},{12690,4},{12704,32},{12784,16},{12832,10},{12872,8},{12881,15},{12928,10},{12977,15},{13312,6591},{19968,20988},{40960,1165},{42192,46},{42240,269},{42512,16},{42538,2},{42560,51},{42612,10},{42623,115},{42775,9},{42786,103},{42891,53},{42946,9},{42997,51},{43052,1},{43056,6},{43072,52},{43136,70},{43232,24},{43259,1},{43261,3},{43274,36},{43312,36},{43360,29},{43392,65},{43471,1},{43488,16},{43514,5},{43520,55},{43584,14},{43616,23},{43642,73},{43739,3},{43744,16},{43762,5},{43777,6},{43785,6},{43793,6},{43808,7},{43816,7},{43824,43},{43868,14},{43888,123},{44012,2},{44032,11171},{55216,23},{55243,49},{63744,366},{64112,106},{64256,7},{64275,5},{64285,12},{64298,13},{64312,5},{64318,1},{64320,2},{64323,2},{64326,108},{64467,363},{64848,64},{64914,54},{65008,12},{65024,16},{65056,16},{65136,5},{65142,135},{65313,26},{65345,26},{65382,89},{65474,6},{65482,6},{65490,6},{65498,3},{65536,12},{65549,26},{65576,19},{65596,2},{65599,15},{65616,14},{65664,123},{65799,45},{65856,57},{65930,2},{66045,1},{66176,29},{66208,49},{66272,28},{66304,36},{66349,30},{66384,43},{66432,30},{66464,36},{66504,8},{66513,5},{66560,158},{66736,36},{66776,36},{66816,40},{66864,52},{67072,311},{67392,22},{67424,8},{67584,6},{67592,1},{67594,44},{67639,2},{67644,1},{67647,23},{67672,31},{67705,38},{67751,9},{67808,19},{67828,2},{67835,33},{67872,26},{67968,56},{68028,20},{68050,50},{68101,2},{68108,8},{68117,3},{68121,29},{68152,3},{68159,10},{68192,31},{68224,32},{68288,8},{68297,30},{68331,5},{68352,54},{68416,22},{68440,27},{68472,26},{68521,7},{68608,73},{68736,51},{68800,51},{68858,46},{69216,31},{69248,42},{69291,2},{69296,2},{69376,40},{69424,37},{69552,28},{69600,23},{69632,71},{69714,20},{69759,60},{69840,25},{69888,53},{69956,4},{69968,36},{70006,1},{70016,69},{70089,4},{70094,2},{70106,1},{70108,1},{70113,20},{70144,18},{70163,37},{70206,1},{70272,7},{70280,1},{70282,4},{70287,15},{70303,10},{70320,59},{70400,4},{70405,8},{70415,2},{70419,22},{70442,7},{70450,2},{70453,5},{70459,10},{70471,2},{70475,3},{70480,1},{70487,1},{70493,7},{70502,7},{70512,5},{70656,75},{70750,4},{70784,70},{70855,1},{71040,54},{71096,9},{71128,6},{71168,65},{71236,1},{71296,57},{71424,27},{71453,15},{71482,2},{71680,59},{71840,64},{71914,9},{71935,8},{71945,1},{71948,8},{71957,2},{71960,30},{71991,2},{71995,9},{72096,8},{72106,46},{72154,8},{72163,2},{72192,63},{72263,1},{72272,74},{72349,1},{72384,57},{72704,9},{72714,45},{72760,9},{72794,19},{72818,30},{72850,22},{72873,14},{72960,7},{72968,2},{72971,44},{73018,1},{73020,2},{73023,9},{73056,6},{73063,2},{73066,37},{73104,2},{73107,6},{73440,23},{73648,1},{73664,21},{73728,922},{74752,111},{74880,196},{77824,1071},{82944,583},{92160,569},{92736,31},{92880,30},{92912,5},{92928,55},{92992,4},{93019,7},{93027,21},{93053,19},{93760,87},{93952,75},{94031,57},{94095,17},{94176,2},{94179,2},{94192,2},{94208,6135},{100352,1238},{101632,8},{110592,287},{110928,3},{110948,4},{110960,396},{113664,107},{113776,13},{113792,9},{113808,10},{113821,2},{119141,5},{119149,6},{119163,8},{119173,7},{119210,4},{119362,3},{119520,20},{119648,25},{119808,85},{119894,71},{119966,2},{119970,1},{119973,2},{119977,4},{119982,12},{119995,1},{119997,7},{120005,65},{120071,4},{120077,8},{120086,7},{120094,28},{120123,4},{120128,5},{120134,1},{120138,7},{120146,340},{120488,25},{120514,25},{120540,31},{120572,25},{120598,31},{120630,25},{120656,31},{120688,25},{120714,31},{120746,25},{120772,8},{121344,55},{121403,50},{121461,1},{121476,1},{121499,5},{121505,15},{122880,7},{122888,17},{122907,7},{122915,2},{122918,5},{123136,45},{123184,14},{123214,1},{123584,48},{124928,197},{125127,16},{125184,76},{126065,59},{126125,3},{126129,4},{126209,45},{126255,15},{126464,4},{126469,27},{126497,2},{126500,1},{126503,1},{126505,10},{126516,4},{126521,1},{126523,1},{126530,1},{126535,1},{126537,1},{126539,1},{126541,3},{126545,2},{126548,1},{126551,1},{126553,1},{126555,1},{126557,1},{126559,1},{126561,2},{126564,1},{126567,4},{126572,7},{126580,4},{126585,4},{126590,1},{126592,10},{126603,17},{126625,3},{126629,5},{126635,17},{127232,13},{131072,42717},{173824,4148},{177984,221},{178208,5761},{183984,7472},{194560,542},{196608,4938},{917760,240},{930112,1},{930116,2},{930121,2},{930126,1},{930209,3},{930213,6},{930220,4},{930234,2},{930239,2},{930267,3},{930271,1},{930299,1},{930301,1},{930337,1},{930343,1},{930347,1},{930358,2},{930363,1},{930367,1},{931070,1},{931079,1},{931546,6},{931593,2},{931646,1},{931648,1},{931651,1},{931654,1},{931699,2},{931721,2},{931724,2},{931739,1},{931742,2},{931818,4},{931924,1},{931968,14},{932215,3},{932272,15},{932318,1},{932580,2},{932592,1},{932733,1},{932854,1},{932976,1},{933367,1},{933380,1},{933748,1},{933839,1},{933850,2},{934020,15},{934036,1},{934074,4},{934149,1},{934224,5},{934233,2},{934346,6},{934523,1},{935136,9},{935296,1},{935918,1},{935963,2},{936043,3},{936117,2},{936276,3},{936280,3},{936320,11},{936644,2},{936862,2},{936992,7},{937000,6},{937178,7},{937340,4},{937403,5},{937470,2},{937536,8},{937555,1},{938384,24},{938416,20},{938437,13},{938451,12},{938493,2},{938509,2},{939144,4},{939177,2},{940264,14},{940357,2},{940390,10},{940803,22},{940888,4},{940924,2},{941689,4},{941694,2},{941808,1},{941952,47},{942000,32},{942034,1},{942465,3},{942472,10},{942484,12},{942512,1},{942525,1},{942624,1},{942715,1},{972414,2},{972685,3},{972787,1},{972798,1},{972914,6},{973300,4},{973390,2},{973432,3},{973436,1},{973486,2},{973535,1},{973633,13},{973662,2},{973788,4},{973918,2},{973936,2},{974187,1}}; #else /* GNUSTEP_INDEX_CHARSET */ static const unsigned char letterCharSet[122880] = {'\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfe','\xff','\xff','\x07','\xfe','\xff','\xff','\x07','\x00','\x00','\x00','\x00','\x00','\x04','\x2c','\x76','\xff','\xff','\x7f','\xff','\xff','\xff','\x7f','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xc3','\xff','\x03','\x00','\x1f','\x50','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xdf','\xbc','\x40','\xd7','\xff','\xff','\xfb','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xbf','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xfb','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xfe','\xff','\xff','\xff','\x7f','\x02','\xff','\xff','\xff','\xff','\xff','\x01','\xfe','\xff','\xff','\xff','\xff','\xbf','\xb6','\x00','\xff','\xff','\xff','\x87','\x07','\x00','\x00','\x00','\xff','\x07','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\xc0','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xef','\x9f','\xff','\xfd','\x00','\x9c','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xe7','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x03','\x00','\x00','\xfc','\xff','\xff','\xff','\xff','\x3f','\x24','\xff','\xff','\xff','\xff','\xff','\x3f','\x00','\x00','\xff','\xff','\xff','\x0f','\xff','\x07','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xdf','\xff','\xff','\x00','\xf8','\xff','\xfb','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x0f','\x00','\xfe','\xff','\xef','\x9f','\xf9','\xff','\xff','\xfd','\xc5','\xf3','\x9f','\x79','\x80','\xb0','\x0f','\x00','\xf3','\x53','\xee','\x87','\xf9','\xff','\xff','\xfd','\x6d','\xd3','\x87','\x39','\x02','\x5e','\x00','\x00','\x3f','\x00','\xee','\xbf','\xfb','\xff','\xff','\xfd','\xed','\xf3','\xbf','\x3b','\x01','\x00','\x0f','\x00','\x00','\xfe','\xee','\x9f','\xf9','\xff','\xff','\xfd','\xed','\xf3','\x9f','\x39','\xe0','\xb0','\x0f','\x00','\xfe','\x00','\xec','\xc7','\x3d','\xd6','\x18','\xc7','\xff','\xc3','\xc7','\x3d','\x81','\x00','\x00','\x00','\x07','\x00','\xff','\xdf','\xfd','\xff','\xff','\xfd','\xff','\xe3','\xdf','\x3d','\x60','\x07','\x0f','\x00','\x00','\x7f','\xef','\xdf','\xfd','\xff','\xff','\xfd','\xef','\xf3','\xdf','\x3d','\x60','\x40','\x0f','\x00','\x06','\x00','\xff','\xdf','\xfd','\xff','\xff','\xff','\xff','\xff','\xdf','\x7d','\xf0','\xff','\x0f','\x00','\xff','\xfd','\xee','\xff','\x7f','\xfc','\xff','\xff','\xfb','\x2f','\x7f','\x84','\x5f','\xff','\x00','\x00','\x0c','\x00','\xfe','\xff','\xff','\xff','\xff','\xff','\xff','\x07','\xff','\x7f','\x00','\x00','\x00','\x00','\x00','\x00','\xd6','\xf7','\xff','\xff','\xaf','\xff','\xff','\x3f','\x5f','\x3f','\x00','\xf0','\x00','\x00','\x00','\x00','\x01','\x00','\x00','\x03','\x00','\xfc','\xaf','\xc2','\xff','\xfe','\xff','\xff','\xff','\x1f','\xfe','\xff','\xdf','\xff','\xff','\xfe','\xff','\xff','\xff','\x1f','\x40','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x3c','\xff','\xff','\xff','\xff','\xbf','\x20','\xff','\xff','\xff','\xff','\xff','\xf7','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x3d','\x7f','\x3d','\xff','\xff','\xff','\xff','\xff','\x3d','\xff','\xff','\xff','\xff','\x3d','\x7f','\x3d','\xff','\x7f','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x3d','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xe7','\x00','\xfe','\xff','\x1f','\xff','\xff','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x3f','\x3f','\xfe','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x9f','\xff','\xff','\xfe','\xff','\xff','\x07','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xc7','\xff','\x01','\xff','\xdf','\x1f','\x00','\xff','\xff','\x1f','\x00','\xff','\xff','\x0f','\x00','\xff','\xdf','\x0d','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x8f','\x30','\x00','\x00','\xff','\x03','\x00','\x38','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x01','\xff','\xff','\xff','\xff','\xff','\x07','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x3f','\x00','\xff','\xff','\xff','\x7f','\xff','\x0f','\xff','\x0f','\x00','\x00','\xff','\xff','\xff','\x3f','\x1f','\x00','\xff','\xff','\xff','\xff','\xff','\x0f','\xff','\xff','\xff','\x03','\x00','\x04','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\x0f','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x7f','\xff','\xff','\xff','\x9f','\x00','\x00','\x00','\x00','\x80','\x00','\xff','\xff','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x0f','\x00','\x00','\x00','\xf8','\x0f','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\xfc','\xff','\xff','\xff','\xff','\xff','\xff','\x0f','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\xe0','\x00','\xfc','\xff','\xff','\xff','\x3f','\xff','\x01','\xff','\xff','\xff','\xff','\xff','\xe7','\x00','\x00','\xf7','\xff','\xff','\xff','\xff','\x07','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xfb','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x3f','\x3f','\xff','\xff','\xff','\xff','\x3f','\x3f','\xff','\xaa','\xff','\xff','\xff','\x3f','\xff','\xff','\xff','\xff','\xff','\xff','\xdf','\x5f','\xdc','\x1f','\xcf','\x0f','\xff','\x1f','\xdc','\x1f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf3','\x83','\xff','\x03','\xff','\x1f','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\x01','\x00','\x84','\xfc','\x2f','\x3e','\x50','\xbd','\xff','\xf3','\xe0','\x43','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x0f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfc','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\xff','\xff','\xff','\x0f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\x7f','\xff','\xff','\xff','\xff','\xff','\x7f','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x1f','\xf8','\x0f','\x20','\xff','\xff','\xff','\xff','\xbf','\x20','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x80','\x00','\x80','\xff','\xff','\x7f','\x00','\x7f','\x7f','\x7f','\x7f','\x7f','\x7f','\x7f','\x7f','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xe0','\x00','\x00','\x00','\xfe','\xff','\x3e','\x1f','\xfe','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x7f','\xe6','\xfe','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xf7','\xe0','\xff','\xff','\xff','\xff','\xff','\xfe','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x7f','\x3c','\x00','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\xff','\xfe','\xff','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\xfe','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x7f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x0f','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x1f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\x3f','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x1f','\xff','\xff','\x00','\x0c','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xf7','\xbf','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x03','\x00','\x00','\x00','\x80','\xff','\xfc','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xf9','\xff','\xff','\xff','\xff','\xff','\xff','\xfc','\x07','\x00','\x00','\x00','\x00','\xe0','\xff','\xff','\xff','\xff','\xff','\xff','\x10','\x3f','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\x0f','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x3f','\x00','\x00','\x00','\xff','\xff','\xff','\xe8','\x00','\xfc','\xff','\xff','\xff','\x3f','\xff','\xff','\xff','\xff','\x0f','\x00','\xff','\xff','\xff','\x1f','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x01','\x80','\x00','\x00','\xff','\xff','\x00','\x7c','\xff','\xff','\xff','\xff','\xff','\xff','\x7f','\x00','\xff','\x3f','\x00','\x00','\xff','\xff','\x7f','\xfc','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x07','\x00','\x00','\x38','\xff','\xff','\x7c','\x00','\x7e','\x7e','\x7e','\x00','\x7f','\x7f','\xff','\xff','\xff','\xff','\xff','\xf7','\xff','\x03','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x37','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x07','\x00','\xff','\xff','\x7f','\xf8','\xff','\xff','\xff','\xff','\xff','\x0f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x3f','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x03','\x00','\x00','\x00','\x00','\x7f','\x00','\xf8','\xe0','\xff','\xfd','\x7f','\x5f','\xdb','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x03','\x00','\x00','\x00','\xf8','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x3f','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xfc','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\xff','\x0f','\xff','\xff','\x00','\x00','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xdf','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x1f','\x00','\x00','\x00','\x00','\xfe','\xff','\xff','\x07','\xfe','\xff','\xff','\x07','\xc0','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x7f','\xfc','\xfc','\xfc','\x1c','\x00','\x00','\x00','\x00','\xff','\xef','\xff','\xff','\x7f','\xff','\xff','\xb7','\xff','\x3f','\xff','\x3f','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x07','\x80','\xff','\xff','\xff','\xff','\xff','\x0f','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x01','\x00','\x0c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x20','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\x1f','\xff','\xff','\xff','\xff','\xff','\xff','\x01','\x00','\xff','\xff','\xff','\x0f','\xff','\xff','\xff','\xff','\x0f','\xe0','\xff','\xff','\xff','\x07','\xff','\xff','\xff','\xff','\xff','\x07','\xff','\xff','\xff','\x3f','\xff','\xff','\xff','\xff','\x0f','\xff','\x3e','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x3f','\x00','\x00','\xff','\xff','\xff','\xff','\x0f','\xff','\xff','\xff','\xff','\x0f','\xff','\xff','\xff','\xff','\xff','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\x0f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x7f','\x00','\xff','\xff','\x3f','\x00','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x3f','\xfd','\xff','\xff','\xff','\xff','\xbf','\x91','\xff','\xff','\x3f','\xff','\xff','\xff','\x7f','\xfe','\xff','\xff','\xff','\x7f','\x80','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\x37','\xf8','\xff','\xff','\xff','\x0f','\xff','\xff','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xf0','\xff','\xff','\xfc','\xff','\xff','\xff','\xff','\xff','\x6f','\xf0','\xef','\xfe','\xff','\xff','\x3f','\x87','\xff','\x01','\x00','\x00','\xff','\xff','\xff','\x7f','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\xff','\xfe','\xff','\xff','\x7f','\xf8','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\x3f','\x00','\xff','\xff','\x3f','\xff','\xff','\xff','\x07','\xff','\xff','\xff','\x03','\x00','\x00','\xfe','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\x07','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\x07','\xfc','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\x7f','\xff','\xff','\xff','\xff','\xff','\x1b','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\x00','\xff','\xff','\xff','\xff','\x1f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\x0f','\x00','\x00','\xff','\xff','\x7f','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x7f','\x00','\xfc','\xff','\x3f','\x00','\x00','\x80','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x07','\x00','\x00','\xff','\xff','\xff','\x01','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\x1f','\x00','\xf0','\x00','\xff','\xff','\xff','\xff','\x4f','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x1f','\xde','\x00','\x14','\xfe','\xff','\x1f','\x00','\xff','\xff','\xfb','\xff','\xff','\xff','\xff','\x40','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x7f','\xbd','\xff','\xbf','\xff','\x01','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x07','\x00','\x00','\xef','\x9f','\xf9','\xff','\xff','\xfd','\xed','\xfb','\x9f','\x39','\x81','\xe0','\xcf','\x1f','\x1f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x07','\x00','\xc0','\x03','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xbf','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\x3f','\xff','\x01','\x00','\x00','\x3f','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x11','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xe7','\xff','\x0f','\x00','\x0c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x07','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\xfc','\x07','\x80','\x7f','\xf2','\x6f','\xff','\xff','\xff','\xbf','\xf9','\x0f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xfc','\xff','\xff','\xff','\xff','\xff','\xfc','\x1b','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x7f','\x80','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x23','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xfd','\xff','\xff','\xff','\xff','\x7f','\xff','\x01','\x00','\x00','\xfc','\xff','\x1f','\xfc','\xff','\xff','\xff','\xfc','\xff','\xff','\xfe','\x7f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x7f','\xfb','\xff','\xff','\xff','\xff','\x7f','\xb4','\xff','\x00','\x00','\x00','\xbf','\xfd','\xff','\xff','\xff','\x7f','\xfb','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\x7f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01','\x00','\xff','\xff','\x1f','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x7f','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x0f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x7f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x7f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x01','\xff','\xff','\xff','\x7f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\x3f','\x1f','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\x7f','\x00','\x0f','\x00','\x00','\xf8','\xfb','\xff','\xff','\xe0','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x7f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x87','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x80','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x1b','\x00','\x03','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x7f','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x3f','\x00','\x00','\x00','\x00','\x00','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x7f','\x00','\x00','\x00','\x00','\x00','\x00','\x07','\x00','\xf0','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x0f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x07','\xff','\x1f','\xff','\x01','\xff','\x63','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xe0','\xe3','\x07','\xf8','\xe7','\x0f','\x00','\x00','\x00','\x3c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x1c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\x0f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xdf','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xdf','\x64','\xde','\xff','\xeb','\xef','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xbf','\xe7','\xdf','\xdf','\xff','\xff','\xff','\x7b','\x5f','\xfc','\xfd','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x3f','\xff','\xff','\xff','\xfd','\xff','\xff','\xf7','\xff','\xff','\xff','\xf7','\xff','\xff','\xdf','\xff','\xff','\xff','\xdf','\xff','\xff','\x7f','\xff','\xff','\xff','\x7f','\xff','\xff','\xff','\xfd','\xff','\xff','\xff','\xfd','\xff','\xff','\xf7','\x0f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\x7f','\xf8','\xff','\xff','\xff','\xff','\xff','\x1f','\x20','\x00','\x10','\x00','\x00','\xf8','\xfe','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x7f','\xff','\xff','\xf9','\xdb','\x07','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\x1f','\xff','\x3f','\x00','\x40','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x9f','\xff','\x7f','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x0f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfe','\xff','\xff','\xff','\xff','\xff','\xff','\xef','\x1e','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfe','\xff','\xff','\xff','\xff','\xbf','\xff','\x3f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xef','\xff','\xff','\xff','\x96','\xfe','\xf7','\x0a','\x84','\xea','\x96','\xaa','\x96','\xf7','\xf7','\x5e','\xff','\xfb','\xff','\x0f','\xee','\xfb','\xff','\x0f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x1f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x1f','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x0f','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x1f','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x01','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x3f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x31','\x46','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xee','\xf7','\x00','\x8c','\x01','\x00','\x00','\xb8','\x00','\x00','\x00','\x28','\x00','\x00','\x00','\x00','\x82','\x08','\xc0','\x88','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x40','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfc','\x00','\x00','\x00','\x00','\x00','\x06','\x00','\x00','\x00','\x00','\x00','\x40','\x49','\x00','\x00','\x00','\x00','\x00','\x18','\x00','\x00','\x36','\x00','\xc8','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x3c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x10','\x00','\x00','\x00','\x00','\x00','\xff','\x3f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x7f','\x00','\x00','\x00','\x40','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x30','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x20','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x40','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x10','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x10','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x0c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf0','\xff','\x17','\x00','\x00','\x00','\x00','\x3c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x20','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x1f','\x06','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfc','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x08','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x40','\x00','\x00','\x00','\x00','\x00','\x18','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x38','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x60','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x70','\x07','\x00','\x00','\x00','\x00','\xff','\x07','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x30','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x7f','\x3f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfc','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf8','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x00','\x08','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\x00','\xff','\xff','\xef','\xff','\xfb','\x7f','\x00','\x00','\x00','\x60','\x00','\x60','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x0f','\x00','\x00','\x00','\x06','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x3f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x60','\x00','\x00','\x00','\xc0','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf8','\xff','\xff','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x0f','\x00','\x00','\x00','\x30','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xde','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\x7f','\xff','\xff','\xff','\xff','\x04','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x0e','\xff','\xf3','\xff','\x00','\x00','\x01','\x20','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x08','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xe0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x08','\x40','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfc','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\x00','\x00','\x00','\x00','\x00','\x17','\x00','\x00','\x00','\x00','\x00','\xc0','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfe','\x3f','\x00','\xc0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\x00','\x00','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x08','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00'}; #endif /* GNUSTEP_INDEX_CHARSET */ #if defined(GNUSTEP_INDEX_CHARSET) static const NSRange lowercaseLetterCharSet[] = {{97,26},{181,1},{223,24},{248,8},{257,1},{259,1},{261,1},{263,1},{265,1},{267,1},{269,1},{271,1},{273,1},{275,1},{277,1},{279,1},{281,1},{283,1},{285,1},{287,1},{289,1},{291,1},{293,1},{295,1},{297,1},{299,1},{301,1},{303,1},{305,1},{307,1},{309,1},{311,2},{314,1},{316,1},{318,1},{320,1},{322,1},{324,1},{326,1},{328,2},{331,1},{333,1},{335,1},{337,1},{339,1},{341,1},{343,1},{345,1},{347,1},{349,1},{351,1},{353,1},{355,1},{357,1},{359,1},{361,1},{363,1},{365,1},{367,1},{369,1},{371,1},{373,1},{375,1},{378,1},{380,1},{382,3},{387,1},{389,1},{392,1},{396,2},{402,1},{405,1},{409,3},{414,1},{417,1},{419,1},{421,1},{424,1},{426,2},{429,1},{432,1},{436,1},{438,1},{441,2},{445,3},{454,1},{457,1},{460,1},{462,1},{464,1},{466,1},{468,1},{470,1},{472,1},{474,1},{476,2},{479,1},{481,1},{483,1},{485,1},{487,1},{489,1},{491,1},{493,1},{495,2},{499,1},{501,1},{505,1},{507,1},{509,1},{511,1},{513,1},{515,1},{517,1},{519,1},{521,1},{523,1},{525,1},{527,1},{529,1},{531,1},{533,1},{535,1},{537,1},{539,1},{541,1},{543,1},{545,1},{547,1},{549,1},{551,1},{553,1},{555,1},{557,1},{559,1},{561,1},{563,7},{572,1},{575,2},{578,1},{583,1},{585,1},{587,1},{589,1},{591,69},{661,27},{881,1},{883,1},{887,1},{891,3},{912,1},{940,35},{976,2},{981,3},{985,1},{987,1},{989,1},{991,1},{993,1},{995,1},{997,1},{999,1},{1001,1},{1003,1},{1005,1},{1007,5},{1013,1},{1016,1},{1019,2},{1072,48},{1121,1},{1123,1},{1125,1},{1127,1},{1129,1},{1131,1},{1133,1},{1135,1},{1137,1},{1139,1},{1141,1},{1143,1},{1145,1},{1147,1},{1149,1},{1151,1},{1153,1},{1163,1},{1165,1},{1167,1},{1169,1},{1171,1},{1173,1},{1175,1},{1177,1},{1179,1},{1181,1},{1183,1},{1185,1},{1187,1},{1189,1},{1191,1},{1193,1},{1195,1},{1197,1},{1199,1},{1201,1},{1203,1},{1205,1},{1207,1},{1209,1},{1211,1},{1213,1},{1215,1},{1218,1},{1220,1},{1222,1},{1224,1},{1226,1},{1228,1},{1230,2},{1233,1},{1235,1},{1237,1},{1239,1},{1241,1},{1243,1},{1245,1},{1247,1},{1249,1},{1251,1},{1253,1},{1255,1},{1257,1},{1259,1},{1261,1},{1263,1},{1265,1},{1267,1},{1269,1},{1271,1},{1273,1},{1275,1},{1277,1},{1279,1},{1281,1},{1283,1},{1285,1},{1287,1},{1289,1},{1291,1},{1293,1},{1295,1},{1297,1},{1299,1},{1301,1},{1303,1},{1305,1},{1307,1},{1309,1},{1311,1},{1313,1},{1315,1},{1317,1},{1319,1},{1321,1},{1323,1},{1325,1},{1327,1},{1376,41},{4304,43},{4349,3},{5112,6},{7296,9},{7424,44},{7531,13},{7545,34},{7681,1},{7683,1},{7685,1},{7687,1},{7689,1},{7691,1},{7693,1},{7695,1},{7697,1},{7699,1},{7701,1},{7703,1},{7705,1},{7707,1},{7709,1},{7711,1},{7713,1},{7715,1},{7717,1},{7719,1},{7721,1},{7723,1},{7725,1},{7727,1},{7729,1},{7731,1},{7733,1},{7735,1},{7737,1},{7739,1},{7741,1},{7743,1},{7745,1},{7747,1},{7749,1},{7751,1},{7753,1},{7755,1},{7757,1},{7759,1},{7761,1},{7763,1},{7765,1},{7767,1},{7769,1},{7771,1},{7773,1},{7775,1},{7777,1},{7779,1},{7781,1},{7783,1},{7785,1},{7787,1},{7789,1},{7791,1},{7793,1},{7795,1},{7797,1},{7799,1},{7801,1},{7803,1},{7805,1},{7807,1},{7809,1},{7811,1},{7813,1},{7815,1},{7817,1},{7819,1},{7821,1},{7823,1},{7825,1},{7827,1},{7829,9},{7839,1},{7841,1},{7843,1},{7845,1},{7847,1},{7849,1},{7851,1},{7853,1},{7855,1},{7857,1},{7859,1},{7861,1},{7863,1},{7865,1},{7867,1},{7869,1},{7871,1},{7873,1},{7875,1},{7877,1},{7879,1},{7881,1},{7883,1},{7885,1},{7887,1},{7889,1},{7891,1},{7893,1},{7895,1},{7897,1},{7899,1},{7901,1},{7903,1},{7905,1},{7907,1},{7909,1},{7911,1},{7913,1},{7915,1},{7917,1},{7919,1},{7921,1},{7923,1},{7925,1},{7927,1},{7929,1},{7931,1},{7933,1},{7935,9},{7952,6},{7968,8},{7984,8},{8000,6},{8016,8},{8032,8},{8048,14},{8064,8},{8080,8},{8096,8},{8112,5},{8118,2},{8126,1},{8130,3},{8134,2},{8144,4},{8150,2},{8160,8},{8178,3},{8182,2},{8458,1},{8462,2},{8467,1},{8495,1},{8500,1},{8505,1},{8508,2},{8518,4},{8526,1},{8580,1},{11312,47},{11361,1},{11365,2},{11368,1},{11370,1},{11372,1},{11377,1},{11379,2},{11382,6},{11393,1},{11395,1},{11397,1},{11399,1},{11401,1},{11403,1},{11405,1},{11407,1},{11409,1},{11411,1},{11413,1},{11415,1},{11417,1},{11419,1},{11421,1},{11423,1},{11425,1},{11427,1},{11429,1},{11431,1},{11433,1},{11435,1},{11437,1},{11439,1},{11441,1},{11443,1},{11445,1},{11447,1},{11449,1},{11451,1},{11453,1},{11455,1},{11457,1},{11459,1},{11461,1},{11463,1},{11465,1},{11467,1},{11469,1},{11471,1},{11473,1},{11475,1},{11477,1},{11479,1},{11481,1},{11483,1},{11485,1},{11487,1},{11489,1},{11491,2},{11500,1},{11502,1},{11507,1},{11520,38},{11559,1},{11565,1},{42561,1},{42563,1},{42565,1},{42567,1},{42569,1},{42571,1},{42573,1},{42575,1},{42577,1},{42579,1},{42581,1},{42583,1},{42585,1},{42587,1},{42589,1},{42591,1},{42593,1},{42595,1},{42597,1},{42599,1},{42601,1},{42603,1},{42605,1},{42625,1},{42627,1},{42629,1},{42631,1},{42633,1},{42635,1},{42637,1},{42639,1},{42641,1},{42643,1},{42645,1},{42647,1},{42649,1},{42651,1},{42787,1},{42789,1},{42791,1},{42793,1},{42795,1},{42797,1},{42799,3},{42803,1},{42805,1},{42807,1},{42809,1},{42811,1},{42813,1},{42815,1},{42817,1},{42819,1},{42821,1},{42823,1},{42825,1},{42827,1},{42829,1},{42831,1},{42833,1},{42835,1},{42837,1},{42839,1},{42841,1},{42843,1},{42845,1},{42847,1},{42849,1},{42851,1},{42853,1},{42855,1},{42857,1},{42859,1},{42861,1},{42863,1},{42865,8},{42874,1},{42876,1},{42879,1},{42881,1},{42883,1},{42885,1},{42887,1},{42892,1},{42894,1},{42897,1},{42899,3},{42903,1},{42905,1},{42907,1},{42909,1},{42911,1},{42913,1},{42915,1},{42917,1},{42919,1},{42921,1},{42927,1},{42933,1},{42935,1},{42937,1},{42939,1},{42941,1},{42943,1},{42947,1},{42952,1},{42954,1},{42998,1},{43002,1},{43824,43},{43872,9},{43888,80},{64256,7},{64275,5},{65345,26},{66600,40},{66776,36},{68800,51},{71872,32},{93792,32},{119834,26},{119886,7},{119894,18},{119938,26},{119990,4},{119995,1},{119997,7},{120005,11},{120042,26},{120094,26},{120146,26},{120198,26},{120250,26},{120302,26},{120354,26},{120406,26},{120458,28},{120514,25},{120540,6},{120572,25},{120598,6},{120630,25},{120656,6},{120688,25},{120714,6},{120746,25},{120772,6},{120779,1},{125218,34},{142656,1},{142660,1},{142669,2},{142817,26},{142901,1},{142943,24},{142968,8},{142977,1},{142979,1},{142981,1},{142983,1},{142985,1},{142987,1},{142989,1},{142991,1},{142993,1},{142995,1},{142997,1},{142999,1},{143001,1},{143003,1},{143005,1},{143007,1},{143009,1},{143011,1},{143013,1},{143015,1},{143017,1},{143019,1},{143021,1},{143023,1},{143025,1},{143027,1},{143029,1},{143031,2},{143034,1},{143036,1},{143038,1},{143040,1},{143042,1},{143044,1},{143046,1},{143048,2},{143051,1},{143053,1},{143055,1},{143057,1},{143059,1},{143061,1},{143063,1},{143065,1},{143067,1},{143069,1},{143071,1},{143073,1},{143075,1},{143077,1},{143079,1},{143081,1},{143083,1},{143085,1},{143087,1},{143089,1},{143091,1},{143093,1},{143095,1},{143098,1},{143100,1},{143102,3},{143107,1},{143109,1},{143112,1},{143116,2},{143122,1},{143125,1},{143129,3},{143134,1},{143137,1},{143139,1},{143141,1},{143144,1},{143146,2},{143149,1},{143152,1},{143156,1},{143158,1},{143161,2},{143165,3},{143174,1},{143177,1},{143180,1},{143182,1},{143184,1},{143186,1},{143188,1},{143190,1},{143192,1},{143194,1},{143196,2},{143199,1},{143201,1},{143203,1},{143205,1},{143207,1},{143209,1},{143211,1},{143213,1},{143215,2},{143219,1},{143221,1},{143225,1},{143227,1},{143229,1},{143231,1},{143233,1},{143235,1},{143237,1},{143239,1},{143241,1},{143243,1},{143245,1},{143247,1},{143249,1},{143251,1},{143253,1},{143255,1},{143257,1},{143259,1},{143261,1},{143263,1},{143265,1},{143267,1},{143269,1},{143271,1},{143273,1},{143275,1},{143277,1},{143279,1},{143281,1},{143283,7},{143292,1},{143295,2},{143298,1},{143303,1},{143305,1},{143307,1},{143309,1},{143311,69},{143381,27},{143601,1},{143603,1},{143607,1},{143611,3},{143632,1},{143660,35},{143696,2},{143701,3},{143705,1},{143707,1},{143709,1},{143711,1},{143713,1},{143715,1},{143717,1},{143719,1},{143721,1},{143723,1},{143725,1},{143727,5},{143733,1},{143736,1},{143739,2},{143792,48},{143841,1},{143843,1},{143845,1},{143847,1},{143849,1},{143851,1},{143853,1},{143855,1},{143857,1},{143859,1},{143861,1},{143863,1},{143865,1},{143867,1},{143869,1},{143871,1},{143873,1},{143883,1},{143885,1},{143887,1},{143889,1},{143891,1},{143893,1},{143895,1},{143897,1},{143899,1},{143901,1},{143903,1},{143905,1},{143907,1},{143909,1},{143911,1},{143913,1},{143915,1},{143917,1},{143919,1},{143921,1},{143923,1},{143925,1},{143927,1},{143929,1},{143931,1},{143933,1},{143935,1},{143938,1},{143940,1},{143942,1},{143944,1},{143946,1},{143948,1},{143950,2},{143953,1},{143955,1},{143957,1},{143959,1},{143961,1},{143963,1},{143965,1},{143967,1},{143969,1},{143971,1},{143973,1},{143975,1},{143977,1},{143979,1},{143981,1},{143983,1},{143985,1},{143987,1},{143989,1},{143991,1},{143993,1},{143995,1},{143997,1},{143999,1},{144001,1},{144003,1},{144005,1},{144007,1},{144009,1},{144011,1},{144013,1},{144015,1},{144017,1},{144019,1},{144021,1},{144023,1},{144025,1},{144027,1},{144029,1},{144031,1},{144033,1},{144035,1},{144037,1},{144039,1},{144041,1},{144043,1},{144045,1},{144047,1},{144096,41},{147024,43},{147069,3},{147832,6},{150016,9},{150144,44},{150251,13},{150265,34},{150401,1},{150403,1},{150405,1},{150407,1},{150409,1},{150411,1},{150413,1},{150415,1},{150417,1},{150419,1},{150421,1},{150423,1},{150425,1},{150427,1},{150429,1},{150431,1},{150433,1},{150435,1},{150437,1},{150439,1},{150441,1},{150443,1},{150445,1},{150447,1},{150449,1},{150451,1},{150453,1},{150455,1},{150457,1},{150459,1},{150461,1},{150463,1},{150465,1},{150467,1},{150469,1},{150471,1},{150473,1},{150475,1},{150477,1},{150479,1},{150481,1},{150483,1},{150485,1},{150487,1},{150489,1},{150491,1},{150493,1},{150495,1},{150497,1},{150499,1},{150501,1},{150503,1},{150505,1},{150507,1},{150509,1},{150511,1},{150513,1},{150515,1},{150517,1},{150519,1},{150521,1},{150523,1},{150525,1},{150527,1},{150529,1},{150531,1},{150533,1},{150535,1},{150537,1},{150539,1},{150541,1},{150543,1},{150545,1},{150547,1},{150549,9},{150559,1},{150561,1},{150563,1},{150565,1},{150567,1},{150569,1},{150571,1},{150573,1},{150575,1},{150577,1},{150579,1},{150581,1},{150583,1},{150585,1},{150587,1},{150589,1},{150591,1},{150593,1},{150595,1},{150597,1},{150599,1},{150601,1},{150603,1},{150605,1},{150607,1},{150609,1},{150611,1},{150613,1},{150615,1},{150617,1},{150619,1},{150621,1},{150623,1},{150625,1},{150627,1},{150629,1},{150631,1},{150633,1},{150635,1},{150637,1},{150639,1},{150641,1},{150643,1},{150645,1},{150647,1},{150649,1},{150651,1},{150653,1},{150655,9},{150672,6},{150688,8},{150704,8},{150720,6},{150736,8},{150752,8},{150768,14},{150784,8},{150800,8},{150816,8},{150832,5},{150838,2},{150846,1},{150850,3},{150854,2},{150864,4},{150870,2},{150880,8},{150898,3},{150902,2},{151178,1},{151182,2},{151187,1},{151215,1},{151220,1},{151225,1},{151228,2},{151238,4},{151246,1},{151300,1},{154032,47},{154081,1},{154085,2},{154088,1},{154090,1},{154092,1},{154097,1},{154099,2},{154102,6},{154113,1},{154115,1},{154117,1},{154119,1},{154121,1},{154123,1},{154125,1},{154127,1},{154129,1},{154131,1},{154133,1},{154135,1},{154137,1},{154139,1},{154141,1},{154143,1},{154145,1},{154147,1},{154149,1},{154151,1},{154153,1},{154155,1},{154157,1},{154159,1},{154161,1},{154163,1},{154165,1},{154167,1},{154169,1},{154171,1},{154173,1},{154175,1},{154177,1},{154179,1},{154181,1},{154183,1},{154185,1},{154187,1},{154189,1},{154191,1},{154193,1},{154195,1},{154197,1},{154199,1},{154201,1},{154203,1},{154205,1},{154207,1},{154209,1},{154211,2},{154220,1},{154222,1},{154227,1},{154240,38},{154279,1},{154285,1},{185281,1},{185283,1},{185285,1},{185287,1},{185289,1},{185291,1},{185293,1},{185295,1},{185297,1},{185299,1},{185301,1},{185303,1},{185305,1},{185307,1},{185309,1},{185311,1},{185313,1},{185315,1},{185317,1},{185319,1},{185321,1},{185323,1},{185325,1},{185345,1},{185347,1},{185349,1},{185351,1},{185353,1},{185355,1},{185357,1},{185359,1},{185361,1},{185363,1},{185365,1},{185367,1},{185369,1},{185371,1},{185507,1},{185509,1},{185511,1},{185513,1},{185515,1},{185517,1},{185519,3},{185523,1},{185525,1},{185527,1},{185529,1},{185531,1},{185533,1},{185535,1},{185537,1},{185539,1},{185541,1},{185543,1},{185545,1},{185547,1},{185549,1},{185551,1},{185553,1},{185555,1},{185557,1},{185559,1},{185561,1},{185563,1},{185565,1},{185567,1},{185569,1},{185571,1},{185573,1},{185575,1},{185577,1},{185579,1},{185581,1},{185583,1},{185585,8},{185594,1},{185596,1},{185599,1},{185601,1},{185603,1},{185605,1},{185607,1},{185612,1},{185614,1},{185617,1},{185619,3},{185623,1},{185625,1},{185627,1},{185629,1},{185631,1},{185633,1},{185635,1},{185637,1},{185639,1},{185641,1},{185647,1},{185653,1},{185655,1},{185657,1},{185659,1},{185661,1},{185663,1},{185667,1},{185672,1},{185674,1},{185718,1},{185722,1},{186544,43},{186592,9},{186608,80}}; #else /* GNUSTEP_INDEX_CHARSET */ static const unsigned char lowercaseLetterCharSet[24576] = {'\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfe','\xff','\xff','\x07','\x00','\x00','\x00','\x00','\x00','\x00','\x20','\x00','\x00','\x00','\x00','\x80','\xff','\xff','\x7f','\xff','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\x55','\x55','\xab','\xaa','\xaa','\xaa','\xaa','\xaa','\xd4','\x29','\x31','\x24','\x4e','\x2a','\x2d','\x51','\xe6','\x40','\x52','\x55','\xb5','\xaa','\xaa','\x29','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xfa','\x93','\x85','\xaa','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xef','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x8a','\x38','\x00','\x00','\x01','\x00','\x00','\xf0','\xff','\xff','\xff','\x7f','\xe3','\xaa','\xaa','\xaa','\x2f','\x19','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xaa','\xaa','\xaa','\xaa','\x02','\xa8','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\x54','\xd5','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xe7','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x3f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\x0f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf8','\xff','\xfe','\xff','\xff','\xff','\x07','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xea','\xbf','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xff','\x00','\x3f','\x00','\xff','\x00','\xff','\x00','\x3f','\x00','\xff','\x00','\xff','\x00','\xff','\x3f','\xff','\x00','\xff','\x00','\xff','\x00','\xdf','\x40','\xdc','\x00','\xcf','\x00','\xff','\x00','\xdc','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc4','\x08','\x00','\x00','\x80','\x10','\x32','\xc0','\x43','\x00','\x00','\x00','\x00','\x00','\x00','\x10','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\x7f','\x62','\x15','\xda','\x0f','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\x1a','\x50','\x08','\x00','\xff','\xff','\xff','\xff','\xbf','\x20','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xaa','\xaa','\xaa','\xaa','\xaa','\x2a','\x00','\x00','\xaa','\xaa','\xaa','\x0a','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xa8','\xaa','\xab','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xfe','\x95','\xaa','\x50','\xba','\xaa','\xaa','\x82','\xa0','\xaa','\x08','\x05','\x00','\x00','\x00','\x00','\x40','\x04','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\x07','\xff','\x01','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x7f','\x00','\xf8','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfe','\xff','\xff','\x07','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\x0f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\x07','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfc','\xff','\xff','\x0f','\x00','\x00','\xc0','\xdf','\xff','\xff','\x00','\x00','\x00','\xfc','\xff','\xff','\x0f','\x00','\x00','\xc0','\xeb','\xef','\xff','\x00','\x00','\x00','\xfc','\xff','\xff','\x0f','\x00','\x00','\xc0','\xff','\xff','\xff','\x00','\x00','\x00','\xfc','\xff','\xff','\x0f','\x00','\x00','\xc0','\xff','\xff','\xff','\x00','\x00','\x00','\xfc','\xff','\xff','\x0f','\x00','\x00','\xc0','\xff','\xff','\xff','\x00','\x00','\x00','\xfc','\xff','\xff','\x0f','\x00','\x00','\xc0','\xff','\xff','\xff','\x00','\x00','\x00','\xfc','\xff','\xff','\x3f','\x00','\x00','\x00','\xfc','\xff','\xff','\xf7','\x03','\x00','\x00','\xf0','\xff','\xff','\xdf','\x0f','\x00','\x00','\xc0','\xff','\xff','\x7f','\x3f','\x00','\x00','\x00','\xff','\xff','\xff','\xfd','\x00','\x00','\x00','\xfc','\xff','\xff','\xf7','\x0b','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfc','\xff','\xff','\xff','\x0f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x11','\x60','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfe','\xff','\xff','\x07','\x00','\x00','\x00','\x00','\x00','\x00','\x20','\x00','\x00','\x00','\x00','\x80','\xff','\xff','\x7f','\xff','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\x55','\x55','\xab','\xaa','\xaa','\xaa','\xaa','\xaa','\xd4','\x29','\x31','\x24','\x4e','\x2a','\x2d','\x51','\xe6','\x40','\x52','\x55','\xb5','\xaa','\xaa','\x29','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xfa','\x93','\x85','\xaa','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xef','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x8a','\x38','\x00','\x00','\x01','\x00','\x00','\xf0','\xff','\xff','\xff','\x7f','\xe3','\xaa','\xaa','\xaa','\x2f','\x19','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xaa','\xaa','\xaa','\xaa','\x02','\xa8','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\x54','\xd5','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xe7','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x3f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\x0f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf8','\xff','\xfe','\xff','\xff','\xff','\x07','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xea','\xbf','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xff','\x00','\x3f','\x00','\xff','\x00','\xff','\x00','\x3f','\x00','\xff','\x00','\xff','\x00','\xff','\x3f','\xff','\x00','\xff','\x00','\xff','\x00','\xdf','\x40','\xdc','\x00','\xcf','\x00','\xff','\x00','\xdc','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc4','\x08','\x00','\x00','\x80','\x10','\x32','\xc0','\x43','\x00','\x00','\x00','\x00','\x00','\x00','\x10','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\x7f','\x62','\x15','\xda','\x0f','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\x1a','\x50','\x08','\x00','\xff','\xff','\xff','\xff','\xbf','\x20','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xaa','\xaa','\xaa','\xaa','\xaa','\x2a','\x00','\x00','\xaa','\xaa','\xaa','\x0a','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xa8','\xaa','\xab','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xfe','\x95','\xaa','\x50','\xba','\xaa','\xaa','\x82','\xa0','\xaa','\x08','\x05','\x00','\x00','\x00','\x00','\x40','\x04','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\x07','\xff','\x01','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00'}; #endif /* GNUSTEP_INDEX_CHARSET */ #if defined(GNUSTEP_INDEX_CHARSET) static const NSRange newlineCharSet[] = {{10,4},{133,1}}; #else /* GNUSTEP_INDEX_CHARSET */ static const unsigned char newlineCharSet[17] = {'\x00','\x3c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x20'}; #endif /* GNUSTEP_INDEX_CHARSET */ #if defined(GNUSTEP_INDEX_CHARSET) static const NSRange nonBaseCharSet[] = {{688,18},{710,12},{736,5},{748,1},{750,1},{768,112},{884,1},{890,1},{1155,7},{1369,1},{1425,45},{1471,1},{1473,2},{1476,2},{1479,1},{1552,11},{1600,1},{1611,21},{1648,1},{1750,7},{1759,10},{1770,4},{1809,1},{1840,27},{1958,11},{2027,11},{2042,1},{2045,1},{2070,24},{2137,3},{2259,15},{2275,33},{2362,3},{2366,18},{2385,7},{2402,2},{2417,1},{2433,3},{2492,1},{2494,7},{2503,2},{2507,3},{2519,1},{2530,2},{2558,1},{2561,3},{2620,1},{2622,5},{2631,2},{2635,3},{2641,1},{2672,2},{2677,1},{2689,3},{2748,1},{2750,8},{2759,3},{2763,3},{2786,2},{2810,6},{2817,3},{2876,1},{2878,7},{2887,2},{2891,3},{2901,3},{2914,2},{2946,1},{3006,5},{3014,3},{3018,4},{3031,1},{3072,5},{3134,7},{3142,3},{3146,4},{3157,2},{3170,2},{3201,3},{3260,1},{3262,7},{3270,3},{3274,4},{3285,2},{3298,2},{3328,4},{3387,2},{3390,7},{3398,3},{3402,4},{3415,1},{3426,2},{3457,3},{3530,1},{3535,6},{3542,1},{3544,8},{3570,2},{3633,1},{3636,7},{3654,9},{3761,1},{3764,9},{3782,1},{3784,6},{3864,2},{3893,1},{3895,1},{3897,1},{3902,2},{3953,20},{3974,2},{3981,11},{3993,36},{4038,1},{4139,20},{4182,4},{4190,3},{4194,3},{4199,7},{4209,4},{4226,12},{4239,1},{4250,4},{4348,1},{4957,3},{5906,3},{5938,3},{5970,2},{6002,2},{6068,32},{6103,1},{6109,1},{6155,3},{6211,1},{6277,2},{6313,1},{6432,12},{6448,12},{6679,5},{6741,10},{6752,29},{6783,1},{6823,1},{6832,17},{6912,5},{6964,17},{7019,9},{7040,3},{7073,13},{7142,14},{7204,20},{7288,6},{7376,3},{7380,21},{7405,1},{7412,1},{7415,3},{7468,63},{7544,1},{7579,95},{7675,5},{8305,1},{8319,1},{8336,13},{8400,33},{11388,2},{11503,3},{11631,1},{11647,1},{11744,32},{11823,1},{12293,1},{12330,6},{12337,5},{12347,1},{12441,2},{12445,2},{12540,3},{40981,1},{42232,6},{42508,1},{42607,4},{42612,10},{42623,1},{42652,4},{42736,2},{42775,9},{42864,1},{42888,1},{43000,2},{43010,1},{43014,1},{43019,1},{43043,5},{43052,1},{43136,2},{43188,18},{43232,18},{43263,1},{43302,8},{43335,13},{43392,4},{43443,14},{43471,1},{43493,2},{43561,14},{43587,1},{43596,2},{43632,1},{43643,3},{43696,1},{43698,3},{43703,2},{43710,2},{43713,1},{43741,1},{43755,5},{43763,4},{43868,4},{43881,1},{44003,8},{44012,2},{64286,1},{65024,16},{65056,16},{65392,1},{65438,2},{66045,1},{66272,1},{66422,5},{68097,3},{68101,2},{68108,4},{68152,3},{68159,1},{68325,2},{68900,4},{69291,2},{69446,11},{69632,3},{69688,15},{69759,4},{69808,11},{69888,3},{69927,14},{69957,2},{70003,1},{70016,3},{70067,14},{70089,4},{70094,2},{70188,12},{70206,1},{70367,12},{70400,4},{70459,2},{70462,7},{70471,2},{70475,3},{70487,1},{70498,2},{70502,7},{70512,5},{70709,18},{70750,1},{70832,20},{71087,7},{71096,9},{71132,2},{71216,17},{71339,13},{71453,15},{71724,15},{71984,6},{71991,2},{71995,4},{72000,1},{72002,2},{72145,7},{72154,7},{72164,1},{72193,10},{72243,7},{72251,4},{72263,1},{72273,11},{72330,16},{72751,8},{72760,8},{72850,22},{72873,14},{73009,6},{73018,1},{73020,2},{73023,7},{73031,1},{73098,5},{73104,2},{73107,5},{73459,4},{92912,5},{92976,7},{92992,4},{94031,1},{94033,55},{94095,17},{94176,2},{94179,2},{94192,2},{113821,2},{119141,5},{119149,6},{119163,8},{119173,7},{119210,4},{119362,3},{121344,55},{121403,50},{121461,1},{121476,1},{121499,5},{121505,15},{122880,7},{122888,17},{122907,7},{122915,2},{122918,5},{123184,14},{123628,4},{125136,7},{125252,8},{917760,240},{930112,1},{930116,2},{930121,2},{930126,1},{930209,3},{930213,6},{930220,4},{930234,2},{930239,2},{930267,3},{930271,1},{930299,1},{930301,1},{930337,1},{930343,1},{930347,1},{930358,2},{930363,1},{930367,1},{931070,1},{931079,1},{931546,6},{931593,2},{931646,1},{931648,1},{931651,1},{931654,1},{931699,2},{931721,2},{931724,2},{931739,1},{931742,2},{931818,4},{931924,1},{931968,14},{932215,3},{932272,15},{932318,1},{932580,2},{932592,1},{932733,1},{932854,1},{932976,1},{933367,1},{933380,1},{933748,1},{933839,1},{933850,2},{934020,15},{934036,1},{934074,4},{934149,1},{934224,5},{934233,2},{934346,6},{934523,1},{935136,9},{935296,1},{935918,1},{935963,2},{936043,3},{936117,2},{936276,3},{936280,3},{936320,11},{936644,2},{936862,2},{936992,7},{937000,6},{937178,7},{937340,4},{937403,5},{937470,2},{937536,8},{937555,1},{938384,24},{938416,20},{938437,13},{938451,12},{938493,2},{938509,2},{939144,4},{939177,2},{940264,14},{940357,2},{940390,10},{940803,22},{940888,4},{940924,2},{941689,4},{941694,2},{941808,1},{941952,47},{942000,32},{942034,1},{942465,3},{942472,10},{942484,12},{942512,1},{942525,1},{942624,1},{942715,1},{972414,2},{972685,3},{972787,1},{972798,1},{972914,6},{973300,4},{973390,2},{973432,3},{973436,1},{973486,2},{973535,1},{973633,13},{973662,2},{973788,4},{973918,2},{973936,2},{974187,1}}; #else /* GNUSTEP_INDEX_CHARSET */ static const unsigned char nonBaseCharSet[122880] = {'\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xc3','\xff','\x03','\x00','\x1f','\x50','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x10','\x04','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf8','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x02','\x00','\x00','\x00','\x00','\x00','\x00','\xfe','\xff','\xff','\xff','\xff','\xbf','\xb6','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x07','\x00','\x00','\x00','\x00','\x01','\xf8','\xff','\xff','\x00','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\x9f','\xff','\x3d','\x00','\x00','\x00','\x00','\x02','\x00','\x00','\x00','\xff','\xff','\xff','\x07','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\xff','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\xf8','\x3f','\x24','\x00','\x00','\xc0','\xff','\xff','\x3f','\x00','\x00','\x00','\x00','\x00','\x0e','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf8','\xff','\xfb','\xff','\xff','\xff','\x0f','\x00','\x00','\x00','\x00','\x00','\x00','\xdc','\xff','\xff','\xfe','\x00','\x0c','\x00','\x02','\x00','\x0e','\x00','\x00','\x00','\x00','\x00','\x00','\xd0','\x9f','\x39','\x80','\x00','\x0c','\x00','\x00','\x40','\x0e','\x00','\x00','\x00','\x00','\x00','\x00','\xd0','\x87','\x39','\x02','\x00','\x00','\x00','\x23','\x00','\x0e','\x00','\x00','\x00','\x00','\x00','\x00','\xd0','\xbf','\x3b','\x00','\x00','\x0c','\x00','\x00','\xfc','\x0e','\x00','\x00','\x00','\x00','\x00','\x00','\xd0','\x9f','\x39','\xe0','\x00','\x0c','\x00','\x00','\x00','\x04','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\xc7','\x3d','\x80','\x00','\x00','\x00','\x00','\x00','\x1f','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\xdf','\x3d','\x60','\x00','\x0c','\x00','\x00','\x00','\x0e','\x00','\x00','\x00','\x00','\x00','\x00','\xd0','\xdf','\x3d','\x60','\x00','\x0c','\x00','\x00','\x00','\x0f','\x00','\x00','\x00','\x00','\x00','\x00','\xd8','\xdf','\x3d','\x80','\x00','\x0c','\x00','\x00','\x00','\x0e','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x84','\x5f','\xff','\x00','\x00','\x0c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf2','\x07','\xc0','\x7f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf2','\x1f','\x40','\x3f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x03','\x00','\x00','\xa0','\xc2','\x00','\x00','\x00','\x00','\x00','\x00','\xfe','\xff','\xdf','\xe0','\xff','\xfe','\xff','\xff','\xff','\x1f','\x40','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf8','\xff','\x7f','\x00','\x00','\xc0','\xc3','\x9d','\x3f','\x1e','\x00','\xfc','\xbf','\x00','\x3c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x10','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xe0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x1c','\x00','\x00','\x00','\x1c','\x00','\x00','\x00','\x0c','\x00','\x00','\x00','\x0c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf0','\xff','\xff','\xff','\x8f','\x20','\x00','\x00','\x00','\x00','\x00','\x38','\x00','\x00','\x00','\x00','\x00','\x00','\x08','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x60','\x00','\x00','\x00','\x00','\x02','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x0f','\xff','\x0f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x0f','\x00','\x00','\x00','\x00','\x00','\x00','\xe0','\x7f','\xff','\xff','\xff','\x9f','\x00','\x00','\x00','\x00','\x80','\x00','\xff','\xff','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x1f','\x00','\x00','\x00','\x00','\x00','\xf0','\xff','\x1f','\x00','\x00','\x00','\x00','\xf8','\x0f','\x00','\x07','\x00','\x00','\x00','\xfe','\x3f','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\xff','\x0f','\x00','\x00','\x00','\x00','\x00','\xf0','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x3f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf7','\xff','\xff','\x21','\x90','\x03','\x00','\x00','\x00','\x00','\x00','\xf0','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x07','\x00','\x01','\x00','\x00','\x00','\xf8','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xfb','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x02','\x80','\x00','\x00','\xff','\x1f','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x30','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x20','\x00','\x00','\x00','\x00','\xfc','\x3e','\x08','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x66','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x70','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x20','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x3f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x10','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\xf7','\xbf','\x00','\x00','\x00','\xf0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x03','\x00','\x00','\x00','\x80','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01','\x00','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x03','\x44','\x08','\x00','\x00','\xf8','\x10','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x03','\x00','\x00','\x00','\x00','\x00','\xf0','\xff','\x3f','\x00','\x00','\x00','\xff','\xff','\x03','\x80','\x00','\x00','\x00','\x00','\xc0','\x3f','\x00','\x00','\x80','\xff','\x0f','\x00','\x00','\x00','\x00','\x00','\x0f','\x00','\x00','\x00','\x00','\x00','\xf8','\xff','\x01','\x80','\x00','\x00','\x60','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfe','\x7f','\x00','\x08','\x30','\x00','\x00','\x00','\x00','\x01','\x38','\x00','\x00','\x00','\x00','\x00','\x00','\x9d','\xc1','\x02','\x00','\x00','\x20','\x00','\xf8','\x78','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf0','\x00','\x02','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf8','\x37','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x40','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\x00','\x00','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01','\x00','\x00','\x00','\x00','\xc0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x20','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\x07','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x6e','\xf0','\x00','\x00','\x00','\x00','\x00','\x87','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x60','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x18','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\xff','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x07','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x7f','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x07','\x00','\x00','\x00','\x00','\x00','\xff','\x07','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x07','\x00','\x00','\x00','\x80','\xff','\x1f','\x00','\x60','\x00','\x00','\x00','\x00','\x00','\x08','\x00','\x07','\x00','\x00','\x00','\x00','\x00','\xf8','\xff','\x01','\xde','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf0','\xff','\x40','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\xff','\x07','\x00','\x00','\x0f','\x00','\x00','\x00','\x00','\x00','\x00','\xd8','\x9f','\x39','\x80','\x00','\xcc','\x1f','\x1f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xe0','\xff','\x7f','\x00','\x00','\x40','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\x0f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x3f','\xff','\x01','\x00','\x00','\x30','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf8','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xe0','\xff','\x0f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf0','\xff','\x07','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xbf','\x79','\x0d','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfe','\xfc','\x11','\x00','\x00','\x00','\xfe','\x07','\x00','\x00','\x00','\x00','\xf8','\x7b','\x80','\x00','\xfe','\x0f','\x00','\x00','\x00','\x00','\x00','\xfc','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x7f','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfc','\xff','\xff','\xfe','\x7f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x7e','\xb4','\xbf','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x7c','\xfb','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x78','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x1f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x7f','\x00','\x0f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\xfe','\xff','\xff','\xff','\xff','\xff','\xff','\x80','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x1b','\x00','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x60','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xe0','\xe3','\x07','\xf8','\xe7','\x0f','\x00','\x00','\x00','\x3c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x1c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\x7f','\xf8','\xff','\xff','\xff','\xff','\xff','\x1f','\x20','\x00','\x10','\x00','\x00','\xf8','\xfe','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x7f','\xff','\xff','\xf9','\xdb','\x07','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x3f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x7f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf0','\x0f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x31','\x46','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xee','\xf7','\x00','\x8c','\x01','\x00','\x00','\xb8','\x00','\x00','\x00','\x28','\x00','\x00','\x00','\x00','\x82','\x08','\xc0','\x88','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x40','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfc','\x00','\x00','\x00','\x00','\x00','\x06','\x00','\x00','\x00','\x00','\x00','\x40','\x49','\x00','\x00','\x00','\x00','\x00','\x18','\x00','\x00','\x36','\x00','\xc8','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x3c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x10','\x00','\x00','\x00','\x00','\x00','\xff','\x3f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x7f','\x00','\x00','\x00','\x40','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x30','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x20','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x40','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x10','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x10','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x0c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf0','\xff','\x17','\x00','\x00','\x00','\x00','\x3c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x20','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x1f','\x06','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfc','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x08','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x40','\x00','\x00','\x00','\x00','\x00','\x18','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x38','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x60','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x70','\x07','\x00','\x00','\x00','\x00','\xff','\x07','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x30','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x7f','\x3f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfc','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf8','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x00','\x08','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\x00','\xff','\xff','\xef','\xff','\xfb','\x7f','\x00','\x00','\x00','\x60','\x00','\x60','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x0f','\x00','\x00','\x00','\x06','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x3f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x60','\x00','\x00','\x00','\xc0','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf8','\xff','\xff','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x0f','\x00','\x00','\x00','\x30','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xde','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\x7f','\xff','\xff','\xff','\xff','\x04','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x0e','\xff','\xf3','\xff','\x00','\x00','\x01','\x20','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x08','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xe0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x08','\x40','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfc','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\x00','\x00','\x00','\x00','\x00','\x17','\x00','\x00','\x00','\x00','\x00','\xc0','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfe','\x3f','\x00','\xc0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\x00','\x00','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x08','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00'}; #endif /* GNUSTEP_INDEX_CHARSET */ #if defined(GNUSTEP_INDEX_CHARSET) static const NSRange punctuationCharSet[] = {{33,3},{37,6},{44,4},{58,2},{63,2},{91,3},{95,1},{123,1},{125,1},{161,1},{167,1},{171,1},{182,2},{187,1},{191,1},{894,1},{903,1},{1370,6},{1417,2},{1470,1},{1472,1},{1475,1},{1478,1},{1523,2},{1545,2},{1548,2},{1563,1},{1566,2},{1642,4},{1748,1},{1792,14},{2039,3},{2096,15},{2142,1},{2404,2},{2416,1},{2557,1},{2678,1},{2800,1},{3191,1},{3204,1},{3572,1},{3663,1},{3674,2},{3844,15},{3860,1},{3898,4},{3973,1},{4048,5},{4057,2},{4170,6},{4347,1},{4960,9},{5120,1},{5742,1},{5787,2},{5867,3},{5941,2},{6100,3},{6104,3},{6144,11},{6468,2},{6686,2},{6816,7},{6824,6},{7002,7},{7164,4},{7227,5},{7294,2},{7360,8},{7379,1},{8208,24},{8240,20},{8261,13},{8275,12},{8317,2},{8333,2},{8968,4},{9001,2},{10088,14},{10181,2},{10214,10},{10627,22},{10712,4},{10748,2},{11513,4},{11518,2},{11632,1},{11776,47},{11824,32},{11858,1},{12289,3},{12296,10},{12308,12},{12336,1},{12349,1},{12448,1},{12539,1},{42238,2},{42509,3},{42611,1},{42622,1},{42738,6},{43124,4},{43214,2},{43256,3},{43260,1},{43310,2},{43359,1},{43457,13},{43486,2},{43612,4},{43742,2},{43760,2},{44011,1},{64830,2},{65040,10},{65072,35},{65108,14},{65123,1},{65128,1},{65130,2},{65281,3},{65285,6},{65292,4},{65306,2},{65311,2},{65339,3},{65343,1},{65371,1},{65373,1},{65375,7},{65792,3},{66463,1},{66512,1},{66927,1},{67671,1},{67871,1},{67903,1},{68176,9},{68223,1},{68336,7},{68409,7},{68505,4},{69293,1},{69461,5},{69703,7},{69819,2},{69822,4},{69952,4},{70004,2},{70085,4},{70093,1},{70107,1},{70109,3},{70200,6},{70313,1},{70731,5},{70746,2},{70749,1},{70854,1},{71105,23},{71233,3},{71264,13},{71484,3},{71739,1},{72004,3},{72162,1},{72255,8},{72346,3},{72350,5},{72769,5},{72816,2},{73463,2},{73727,1},{74864,5},{92782,2},{92917,1},{92983,5},{92996,1},{93847,4},{94178,1},{113823,1},{121479,5},{125278,2},{143680,1},{143684,1},{143687,1},{143689,2},{143694,1},{143780,1},{143787,1},{143804,3},{143838,1},{143840,1},{143868,1},{143870,1},{143906,5},{143912,2},{143916,1},{143918,4},{143924,1},{143928,1},{143959,1},{143991,1},{144450,4},{144466,14},{144485,7},{144493,1},{144495,17},{144629,1},{144644,2},{144758,1},{144898,1},{145165,3},{145286,3},{145291,1},{145294,2},{145502,1},{145513,1},{145533,2},{145782,1},{145790,2},{146290,2},{146298,2},{146545,1},{146672,1},{146803,8},{146943,1},{147151,1},{147193,1},{147391,1},{147585,3},{147603,1},{147605,3},{147610,6},{147636,1},{147638,1},{147640,1},{147774,8},{147783,6},{147790,2},{147797,4},{147998,2},{148752,10},{149485,1},{149851,1},{150208,1},{150366,34},{150753,10},{150772,9},{151869,1},{151871,3},{151885,3},{151901,3},{151917,3},{151933,2},{152004,1},{152018,1},{152058,3},{152074,3},{152096,32},{152192,2},{152195,4},{152200,2},{152212,1},{152214,3},{152222,6},{152229,1},{152231,1},{152233,1},{152238,1},{152250,2},{152256,5},{152266,4},{152271,1},{152330,2},{152336,376},{152716,29},{152747,252},{153024,11},{153116,78},{153216,616},{153876,49},{153927,31},{153968,403},{154393,63},{154460,32},{154494,374},{154870,32},{154903,105},{155237,6},{155600,2},{155648,26},{155675,89},{155776,214},{156016,12},{156036,1},{156050,2},{156064,1},{156086,2},{156094,2},{156187,2},{156432,2},{156438,10},{156480,36},{156544,31},{156586,30},{156624,1},{156640,32},{156682,39},{156736,320},{163648,64},{185872,55},{186496,23},{186528,2},{186633,2},{186792,4},{186806,4},{187383,3},{187611,1},{187626,2}}; #else /* GNUSTEP_INDEX_CHARSET */ static const unsigned char punctuationCharSet[24576] = {'\x00','\x00','\x00','\x00','\xee','\xf7','\x00','\x8c','\x01','\x00','\x00','\xb8','\x00','\x00','\x00','\x28','\x00','\x00','\x00','\x00','\x82','\x08','\xc0','\x88','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x40','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfc','\x00','\x00','\x00','\x00','\x00','\x06','\x00','\x00','\x00','\x00','\x00','\x40','\x49','\x00','\x00','\x00','\x00','\x00','\x18','\x00','\x00','\x36','\x00','\xc8','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x3c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x10','\x00','\x00','\x00','\x00','\x00','\xff','\x3f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x7f','\x00','\x00','\x00','\x40','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x30','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x20','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x40','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x10','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x10','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x0c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf0','\xff','\x17','\x00','\x00','\x00','\x00','\x3c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x20','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x1f','\x06','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfc','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x08','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x40','\x00','\x00','\x00','\x00','\x00','\x18','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x38','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x60','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x70','\x07','\x00','\x00','\x00','\x00','\xff','\x07','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x30','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x7f','\x3f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfc','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf8','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x00','\x08','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\x00','\xff','\xff','\xef','\xff','\xfb','\x7f','\x00','\x00','\x00','\x60','\x00','\x60','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x0f','\x00','\x00','\x00','\x06','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x3f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x60','\x00','\x00','\x00','\xc0','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf8','\xff','\xff','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x0f','\x00','\x00','\x00','\x30','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xde','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\x7f','\xff','\xff','\xff','\xff','\x04','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x0e','\xff','\xf3','\xff','\x00','\x00','\x01','\x20','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x08','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xe0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x08','\x40','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfc','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\x00','\x00','\x00','\x00','\x00','\x17','\x00','\x00','\x00','\x00','\x00','\xc0','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfe','\x3f','\x00','\xc0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\x00','\x00','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x08','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\xff','\xff','\xff','\xff','\xf7','\xff','\x0b','\x0d','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xee','\xf7','\x00','\x8c','\x01','\x00','\x00','\xb8','\x00','\x00','\x00','\xa8','\x3f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x07','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x01','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x7f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfe','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x1e','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x20','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xe0','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x3f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xd8','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x0f','\x00','\x00','\x00','\x00','\x00','\x30','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xe0','\x21','\x00','\xe8','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x3f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x02','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf8','\x00','\x2c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x40','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfe','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x0e','\x00','\x00','\x00','\xff','\x1f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x70','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x08','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x70','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x04','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x7f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xdc','\x07','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x3e','\x00','\x00','\x00','\x00','\x00','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x1f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x20','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x0f','\x10','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x07','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x04','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x0f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x91','\x46','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x10','\x08','\x00','\x70','\x00','\x00','\x00','\x40','\x01','\x00','\x00','\x50','\x00','\x00','\x00','\x00','\x7c','\xd3','\x13','\x01','\x00','\x00','\x80','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x3c','\x00','\xfc','\xff','\xe0','\xaf','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x20','\x00','\x30','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x40','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x04','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xe0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\xc9','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x40','\x00','\x02','\x00','\x60','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x40','\xc0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x0c','\x0c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x02','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf8','\x07','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x02','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x0e','\x00','\xe8','\xfc','\x00','\x00','\x50','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\xbf','\xdf','\xe0','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x20','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x08','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfe','\x07','\xf0','\x1f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xa0','\x03','\xe0','\x00','\xe0','\x00','\xe0','\x00','\x60','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x10','\x00','\x04','\x00','\x00','\x00','\x00','\x1c','\x00','\x1c','\x00','\x00','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x7b','\x03','\xd0','\xc1','\xaf','\x42','\x00','\x0c','\x1f','\xbc','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x0c','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xf0','\xff','\xff','\xff','\xf9','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x7f','\x00','\x00','\x00','\xff','\x07','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf0','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x03','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\xf0','\xff','\xff','\xff','\xff','\xff','\x9f','\xff','\xff','\xff','\x3f','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x07','\x00','\x00','\xfe','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xf0','\xff','\xff','\xff','\xcf','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xcf','\xff','\xff','\xff','\xbf','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xe0','\x07','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x03','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xfb','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x0f','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x3f','\x00','\x00','\x00','\xff','\x0f','\x10','\x00','\x0c','\x00','\x01','\x00','\xc0','\xc0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x18','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc3','\xff','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\x0f','\x00','\x00','\x00','\xff','\xff','\xff','\x7f','\x00','\xfc','\xff','\xff','\xff','\x00','\x01','\x00','\xff','\xff','\xff','\xff','\x00','\xfc','\xff','\xff','\xff','\xff','\x01','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\x7f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\x7f','\x00','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x06','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x0f','\xc0','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x08','\x00','\x0c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00'}; #endif /* GNUSTEP_INDEX_CHARSET */ #if defined(GNUSTEP_INDEX_CHARSET) static const NSRange symbolAndOperatorCharSet[] = {{36,1},{43,1},{60,3},{94,1},{96,1},{124,1},{126,1},{162,5},{168,2},{172,1},{174,4},{180,1},{184,1},{215,1},{247,1},{706,4},{722,14},{741,7},{749,1},{751,17},{885,1},{900,2},{1014,1},{1154,1},{1421,3},{1542,3},{1547,1},{1550,2},{1758,1},{1769,1},{1789,2},{2038,1},{2046,2},{2546,2},{2554,2},{2801,1},{2928,1},{3059,8},{3199,1},{3407,1},{3449,1},{3647,1},{3841,3},{3859,1},{3861,3},{3866,6},{3892,1},{3894,1},{3896,1},{4030,8},{4039,6},{4046,2},{4053,4},{4254,2},{5008,10},{5741,1},{6107,1},{6464,1},{6622,34},{7009,10},{7028,9},{8125,1},{8127,3},{8141,3},{8157,3},{8173,3},{8189,2},{8260,1},{8274,1},{8314,3},{8330,3},{8352,32},{8448,2},{8451,4},{8456,2},{8468,1},{8470,3},{8478,6},{8485,1},{8487,1},{8489,1},{8494,1},{8506,2},{8512,5},{8522,4},{8527,1},{8586,2},{8592,376},{8972,29},{9003,252},{9280,11},{9372,78},{9472,616},{10132,49},{10183,31},{10224,403},{10649,63},{10716,32},{10750,374},{11126,32},{11159,105},{11493,6},{11856,2},{11904,26},{11931,89},{12032,214},{12272,12},{12292,1},{12306,2},{12320,1},{12342,2},{12350,2},{12443,2},{12688,2},{12694,10},{12736,36},{12800,31},{12842,30},{12880,1},{12896,32},{12938,39},{12992,320},{19904,64},{42128,55},{42752,23},{42784,2},{42889,2},{43048,4},{43062,4},{43639,3},{43867,1},{43882,2},{64297,1},{64434,16},{65020,2},{65122,1},{65124,3},{65129,1},{65284,1},{65291,1},{65308,3},{65342,1},{65344,1},{65372,1},{65374,1},{65504,7},{65512,7},{65532,2},{65847,9},{65913,17},{65932,3},{65936,13},{65952,1},{66000,45},{67703,2},{68296,1},{71487,1},{73685,29},{92988,4},{92997,1},{113820,1},{118784,246},{119040,39},{119081,60},{119146,3},{119171,2},{119180,30},{119214,59},{119296,66},{119365,1},{119552,87},{120513,1},{120539,1},{120571,1},{120597,1},{120629,1},{120655,1},{120687,1},{120713,1},{120745,1},{120771,1},{120832,512},{121399,4},{121453,8},{121462,14},{121477,2},{123215,1},{123647,1},{126124,1},{126128,1},{126254,1},{126704,2},{126976,44},{127024,100},{127136,15},{127153,15},{127169,15},{127185,37},{127245,161},{127462,29},{127504,44},{127552,9},{127568,2},{127584,6},{127744,984},{128736,13},{128752,13},{128768,116},{128896,89},{128992,12},{129024,12},{129040,56},{129104,10},{129120,40},{129168,30},{129200,2},{129280,121},{129402,82},{129485,135},{129632,14},{129648,5},{129656,3},{129664,7},{129680,25},{129712,7},{129728,3},{129744,7},{129792,147},{129940,55},{144448,1},{144452,2},{144455,2},{144458,1},{144462,1},{144577,26},{144704,23},{144728,7},{144768,1},{144770,1},{144772,1},{144774,1},{144776,1},{144778,1},{144780,1},{144782,1},{144784,1},{144786,1},{144788,1},{144790,1},{144792,1},{144794,1},{144796,1},{144798,1},{144800,1},{144802,1},{144804,1},{144806,1},{144808,1},{144810,1},{144812,1},{144814,1},{144816,1},{144818,1},{144820,1},{144822,1},{144825,1},{144827,1},{144829,1},{144831,1},{144833,1},{144835,1},{144837,1},{144839,1},{144842,1},{144844,1},{144846,1},{144848,1},{144850,1},{144852,1},{144854,1},{144856,1},{144858,1},{144860,1},{144862,1},{144864,1},{144866,1},{144868,1},{144870,1},{144872,1},{144874,1},{144876,1},{144878,1},{144880,1},{144882,1},{144884,1},{144886,1},{144888,2},{144891,1},{144893,1},{144897,2},{144900,1},{144902,2},{144905,3},{144910,4},{144915,2},{144918,3},{144924,2},{144927,2},{144930,1},{144932,1},{144934,2},{144937,1},{144940,1},{144942,2},{144945,3},{144949,1},{144951,2},{144956,1},{144964,1},{144967,1},{144970,1},{144973,1},{144975,1},{144977,1},{144979,1},{144981,1},{144983,1},{144985,1},{144987,1},{144990,1},{144992,1},{144994,1},{144996,1},{144998,1},{145000,1},{145002,1},{145004,1},{145006,1},{145009,1},{145012,1},{145014,3},{145018,1},{145020,1},{145022,1},{145024,1},{145026,1},{145028,1},{145030,1},{145032,1},{145034,1},{145036,1},{145038,1},{145040,1},{145042,1},{145044,1},{145046,1},{145048,1},{145050,1},{145052,1},{145054,1},{145056,1},{145058,1},{145060,1},{145062,1},{145064,1},{145066,1},{145068,1},{145070,1},{145072,1},{145074,1},{145082,2},{145085,2},{145089,1},{145091,4},{145096,1},{145098,1},{145100,1},{145102,1},{145392,1},{145394,1},{145398,1},{145407,1},{145414,1},{145416,3},{145420,1},{145422,2},{145425,17},{145443,9},{145487,1},{145490,3},{145496,1},{145498,1},{145500,1},{145502,1},{145504,1},{145506,1},{145508,1},{145510,1},{145512,1},{145514,1},{145516,1},{145518,1},{145524,1},{145527,1},{145529,2},{145533,51},{145632,1},{145634,1},{145636,1},{145638,1},{145640,1},{145642,1},{145644,1},{145646,1},{145648,1},{145650,1},{145652,1},{145654,1},{145656,1},{145658,1},{145660,1},{145662,1},{145664,1},{145674,1},{145676,1},{145678,1},{145680,1},{145682,1},{145684,1},{145686,1},{145688,1},{145690,1},{145692,1},{145694,1},{145696,1},{145698,1},{145700,1},{145702,1},{145704,1},{145706,1},{145708,1},{145710,1},{145712,1},{145714,1},{145716,1},{145718,1},{145720,1},{145722,1},{145724,1},{145726,1},{145728,2},{145731,1},{145733,1},{145735,1},{145737,1},{145739,1},{145741,1},{145744,1},{145746,1},{145748,1},{145750,1},{145752,1},{145754,1},{145756,1},{145758,1},{145760,1},{145762,1},{145764,1},{145766,1},{145768,1},{145770,1},{145772,1},{145774,1},{145776,1},{145778,1},{145780,1},{145782,1},{145784,1},{145786,1},{145788,1},{145790,1},{145792,1},{145794,1},{145796,1},{145798,1},{145800,1},{145802,1},{145804,1},{145806,1},{145808,1},{145810,1},{145812,1},{145814,1},{145816,1},{145818,1},{145820,1},{145822,1},{145824,1},{145826,1},{145828,1},{145830,1},{145832,1},{145834,1},{145836,1},{145838,1},{145841,38},{148768,38},{148807,1},{148813,1},{149536,86},{151824,43},{151869,3},{152192,1},{152194,1},{152196,1},{152198,1},{152200,1},{152202,1},{152204,1},{152206,1},{152208,1},{152210,1},{152212,1},{152214,1},{152216,1},{152218,1},{152220,1},{152222,1},{152224,1},{152226,1},{152228,1},{152230,1},{152232,1},{152234,1},{152236,1},{152238,1},{152240,1},{152242,1},{152244,1},{152246,1},{152248,1},{152250,1},{152252,1},{152254,1},{152256,1},{152258,1},{152260,1},{152262,1},{152264,1},{152266,1},{152268,1},{152270,1},{152272,1},{152274,1},{152276,1},{152278,1},{152280,1},{152282,1},{152284,1},{152286,1},{152288,1},{152290,1},{152292,1},{152294,1},{152296,1},{152298,1},{152300,1},{152302,1},{152304,1},{152306,1},{152308,1},{152310,1},{152312,1},{152314,1},{152316,1},{152318,1},{152320,1},{152322,1},{152324,1},{152326,1},{152328,1},{152330,1},{152332,1},{152334,1},{152336,1},{152338,1},{152340,1},{152350,1},{152352,1},{152354,1},{152356,1},{152358,1},{152360,1},{152362,1},{152364,1},{152366,1},{152368,1},{152370,1},{152372,1},{152374,1},{152376,1},{152378,1},{152380,1},{152382,1},{152384,1},{152386,1},{152388,1},{152390,1},{152392,1},{152394,1},{152396,1},{152398,1},{152400,1},{152402,1},{152404,1},{152406,1},{152408,1},{152410,1},{152412,1},{152414,1},{152416,1},{152418,1},{152420,1},{152422,1},{152424,1},{152426,1},{152428,1},{152430,1},{152432,1},{152434,1},{152436,1},{152438,1},{152440,1},{152442,1},{152444,1},{152446,1},{152456,8},{152472,6},{152488,8},{152504,8},{152520,6},{152537,1},{152539,1},{152541,1},{152543,1},{152552,8},{152632,4},{152648,4},{152664,4},{152680,5},{152696,4},{152962,1},{152967,1},{152971,3},{152976,3},{152981,1},{152985,5},{152996,1},{152998,1},{153000,1},{153002,4},{153008,4},{153022,2},{153029,1},{153091,1},{155776,47},{155872,1},{155874,3},{155879,1},{155881,1},{155883,1},{155885,4},{155890,1},{155893,1},{155902,3},{155906,1},{155908,1},{155910,1},{155912,1},{155914,1},{155916,1},{155918,1},{155920,1},{155922,1},{155924,1},{155926,1},{155928,1},{155930,1},{155932,1},{155934,1},{155936,1},{155938,1},{155940,1},{155942,1},{155944,1},{155946,1},{155948,1},{155950,1},{155952,1},{155954,1},{155956,1},{155958,1},{155960,1},{155962,1},{155964,1},{155966,1},{155968,1},{155970,1},{155972,1},{155974,1},{155976,1},{155978,1},{155980,1},{155982,1},{155984,1},{155986,1},{155988,1},{155990,1},{155992,1},{155994,1},{155996,1},{155998,1},{156000,1},{156002,1},{156011,1},{156013,1},{156018,1},{187072,1},{187074,1},{187076,1},{187078,1},{187080,1},{187082,1},{187084,1},{187086,1},{187088,1},{187090,1},{187092,1},{187094,1},{187096,1},{187098,1},{187100,1},{187102,1},{187104,1},{187106,1},{187108,1},{187110,1},{187112,1},{187114,1},{187116,1},{187136,1},{187138,1},{187140,1},{187142,1},{187144,1},{187146,1},{187148,1},{187150,1},{187152,1},{187154,1},{187156,1},{187158,1},{187160,1},{187162,1},{187298,1},{187300,1},{187302,1},{187304,1},{187306,1},{187308,1},{187310,1},{187314,1},{187316,1},{187318,1},{187320,1},{187322,1},{187324,1},{187326,1},{187328,1},{187330,1},{187332,1},{187334,1},{187336,1},{187338,1},{187340,1},{187342,1},{187344,1},{187346,1},{187348,1},{187350,1},{187352,1},{187354,1},{187356,1},{187358,1},{187360,1},{187362,1},{187364,1},{187366,1},{187368,1},{187370,1},{187372,1},{187374,1},{187385,1},{187387,1},{187389,2},{187392,1},{187394,1},{187396,1},{187398,1},{187403,1},{187405,1},{187408,1},{187410,1},{187414,1},{187416,1},{187418,1},{187420,1},{187422,1},{187424,1},{187426,1},{187428,1},{187430,1},{187432,1},{187434,5},{187440,5},{187446,1},{187448,1},{187450,1},{187452,1},{187454,1},{187458,1},{187460,4},{187465,1},{187509,1}}; #else /* GNUSTEP_INDEX_CHARSET */ static const unsigned char symbolAndOperatorCharSet[24576] = {'\x00','\x00','\x00','\x00','\x10','\x08','\x00','\x70','\x00','\x00','\x00','\x40','\x01','\x00','\x00','\x50','\x00','\x00','\x00','\x00','\x7c','\xd3','\x13','\x01','\x00','\x00','\x80','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x3c','\x00','\xfc','\xff','\xe0','\xaf','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x20','\x00','\x30','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x40','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x04','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xe0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\xc9','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x40','\x00','\x02','\x00','\x60','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x40','\xc0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x0c','\x0c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x02','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf8','\x07','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x02','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x0e','\x00','\xe8','\xfc','\x00','\x00','\x50','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\xbf','\xdf','\xe0','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x20','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x08','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfe','\x07','\xf0','\x1f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xa0','\x03','\xe0','\x00','\xe0','\x00','\xe0','\x00','\x60','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x10','\x00','\x04','\x00','\x00','\x00','\x00','\x1c','\x00','\x1c','\x00','\x00','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x7b','\x03','\xd0','\xc1','\xaf','\x42','\x00','\x0c','\x1f','\xbc','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x0c','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xf0','\xff','\xff','\xff','\xf9','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x7f','\x00','\x00','\x00','\xff','\x07','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf0','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x03','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\xf0','\xff','\xff','\xff','\xff','\xff','\x9f','\xff','\xff','\xff','\x3f','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x07','\x00','\x00','\xfe','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xf0','\xff','\xff','\xff','\xcf','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xcf','\xff','\xff','\xff','\xbf','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xe0','\x07','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x03','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xfb','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x0f','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x3f','\x00','\x00','\x00','\xff','\x0f','\x10','\x00','\x0c','\x00','\x01','\x00','\xc0','\xc0','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x18','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc3','\xff','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\x0f','\x00','\x00','\x00','\xff','\xff','\xff','\x7f','\x00','\xfc','\xff','\xff','\xff','\x00','\x01','\x00','\xff','\xff','\xff','\xff','\x00','\xfc','\xff','\xff','\xff','\xff','\x01','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\x7f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\x7f','\x00','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x06','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x0f','\xc0','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x08','\x00','\x0c','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x02','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfc','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x30','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x74','\x02','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x10','\x08','\x00','\x70','\x00','\x00','\x00','\x40','\x01','\x00','\x00','\x50','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x7f','\x7f','\x00','\x30','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfe','\xff','\x73','\xff','\x1f','\x01','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\x1f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xe0','\xff','\xff','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf0','\x20','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x10','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x3f','\x00','\xff','\xff','\xff','\xff','\x7f','\xfe','\xff','\xff','\xff','\xff','\xff','\xff','\x1f','\x1c','\x00','\x00','\x18','\xf0','\xff','\xff','\xff','\xc3','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x01','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x23','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x7f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x02','\x00','\x00','\x08','\x00','\x00','\x00','\x08','\x00','\x00','\x20','\x00','\x00','\x00','\x20','\x00','\x00','\x80','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x02','\x00','\x00','\x00','\x02','\x00','\x00','\x08','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x07','\x00','\x00','\x00','\x00','\x00','\xe0','\xdf','\xff','\x6f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x10','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x40','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\x0f','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x0f','\x00','\xff','\x7f','\xfe','\xff','\xfe','\xff','\xfe','\xff','\xff','\xff','\x3f','\x00','\x00','\xe0','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x3f','\x00','\x00','\x00','\x00','\x00','\x00','\xc0','\xff','\xff','\xff','\x07','\x00','\xff','\xff','\xff','\xff','\xff','\x0f','\xff','\x01','\x03','\x00','\x3f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\xff','\x1f','\xff','\x1f','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x0f','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x01','\xff','\x0f','\x00','\x00','\xff','\x0f','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\xff','\x03','\xff','\xff','\xff','\xff','\xff','\x00','\xff','\xff','\xff','\x3f','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xfd','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xef','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x0f','\x00','\xff','\x3f','\x1f','\x07','\x7f','\x00','\xff','\xff','\xff','\x01','\x7f','\x00','\x07','\x00','\x7f','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xf7','\xff','\xff','\xff','\xff','\xff','\xff','\x07','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xb1','\x45','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfe','\xff','\xff','\x07','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\x7f','\x7f','\x00','\x00','\x00','\x00','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\xaa','\xaa','\x54','\x55','\x55','\x55','\x55','\x55','\x2b','\xd6','\xce','\xdb','\xb1','\xd5','\xd2','\xae','\x11','\x90','\xa4','\xaa','\x4a','\x55','\x55','\xd2','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x05','\x6c','\x7a','\x55','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x45','\x80','\x40','\xd7','\xfe','\xff','\xfb','\x0f','\x00','\x00','\x00','\x80','\x1c','\x55','\x55','\x55','\x90','\xe6','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x55','\x55','\x55','\x55','\x01','\x54','\x55','\x55','\x55','\x55','\x55','\x55','\xab','\x2a','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\xfe','\xff','\xff','\xff','\x7f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xbf','\x20','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x3f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xe7','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x15','\x40','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x00','\xff','\x00','\x3f','\x00','\xff','\x00','\xff','\x00','\x3f','\x00','\xaa','\x00','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x0f','\x00','\x0f','\x00','\x0f','\x00','\x1f','\x00','\x0f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x84','\x38','\x27','\x3e','\x50','\x3d','\x0f','\xc0','\x20','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x08','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\x7f','\x00','\x00','\x00','\x00','\x00','\x00','\x9d','\xea','\x25','\xc0','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x05','\x28','\x04','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x55','\x55','\x55','\x55','\x55','\x15','\x00','\x00','\x55','\x55','\x55','\x05','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x54','\x55','\x54','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x00','\x6a','\x55','\x28','\x45','\x55','\x55','\x7d','\x5f','\x55','\xf4','\x02','\x00','\x00','\x00','\x00','\x20','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00'}; #endif /* GNUSTEP_INDEX_CHARSET */ #if defined(GNUSTEP_INDEX_CHARSET) static const NSRange titlecaseLetterCharSet[] = {{453,1},{456,1},{459,1},{498,1},{8072,8},{8088,8},{8104,8},{8124,1},{8140,1},{8188,1}}; #else /* GNUSTEP_INDEX_CHARSET */ static const unsigned char titlecaseLetterCharSet[1024] = {'\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x20','\x09','\x00','\x00','\x00','\x00','\x04','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x00','\xff','\x00','\xff','\x00','\x10','\x00','\x10','\x00','\x00','\x00','\x00','\x00','\x10'}; #endif /* GNUSTEP_INDEX_CHARSET */ #if defined(GNUSTEP_INDEX_CHARSET) static const NSRange uppercaseLetterCharSet[] = {{65,26},{192,23},{216,7},{256,1},{258,1},{260,1},{262,1},{264,1},{266,1},{268,1},{270,1},{272,1},{274,1},{276,1},{278,1},{280,1},{282,1},{284,1},{286,1},{288,1},{290,1},{292,1},{294,1},{296,1},{298,1},{300,1},{302,1},{304,1},{306,1},{308,1},{310,1},{313,1},{315,1},{317,1},{319,1},{321,1},{323,1},{325,1},{327,1},{330,1},{332,1},{334,1},{336,1},{338,1},{340,1},{342,1},{344,1},{346,1},{348,1},{350,1},{352,1},{354,1},{356,1},{358,1},{360,1},{362,1},{364,1},{366,1},{368,1},{370,1},{372,1},{374,1},{376,2},{379,1},{381,1},{385,2},{388,1},{390,2},{393,3},{398,4},{403,2},{406,3},{412,2},{415,2},{418,1},{420,1},{422,2},{425,1},{428,1},{430,2},{433,3},{437,1},{439,2},{444,1},{452,1},{455,1},{458,1},{461,1},{463,1},{465,1},{467,1},{469,1},{471,1},{473,1},{475,1},{478,1},{480,1},{482,1},{484,1},{486,1},{488,1},{490,1},{492,1},{494,1},{497,1},{500,1},{502,3},{506,1},{508,1},{510,1},{512,1},{514,1},{516,1},{518,1},{520,1},{522,1},{524,1},{526,1},{528,1},{530,1},{532,1},{534,1},{536,1},{538,1},{540,1},{542,1},{544,1},{546,1},{548,1},{550,1},{552,1},{554,1},{556,1},{558,1},{560,1},{562,1},{570,2},{573,2},{577,1},{579,4},{584,1},{586,1},{588,1},{590,1},{880,1},{882,1},{886,1},{895,1},{902,1},{904,3},{908,1},{910,2},{913,17},{931,9},{975,1},{978,3},{984,1},{986,1},{988,1},{990,1},{992,1},{994,1},{996,1},{998,1},{1000,1},{1002,1},{1004,1},{1006,1},{1012,1},{1015,1},{1017,2},{1021,51},{1120,1},{1122,1},{1124,1},{1126,1},{1128,1},{1130,1},{1132,1},{1134,1},{1136,1},{1138,1},{1140,1},{1142,1},{1144,1},{1146,1},{1148,1},{1150,1},{1152,1},{1162,1},{1164,1},{1166,1},{1168,1},{1170,1},{1172,1},{1174,1},{1176,1},{1178,1},{1180,1},{1182,1},{1184,1},{1186,1},{1188,1},{1190,1},{1192,1},{1194,1},{1196,1},{1198,1},{1200,1},{1202,1},{1204,1},{1206,1},{1208,1},{1210,1},{1212,1},{1214,1},{1216,2},{1219,1},{1221,1},{1223,1},{1225,1},{1227,1},{1229,1},{1232,1},{1234,1},{1236,1},{1238,1},{1240,1},{1242,1},{1244,1},{1246,1},{1248,1},{1250,1},{1252,1},{1254,1},{1256,1},{1258,1},{1260,1},{1262,1},{1264,1},{1266,1},{1268,1},{1270,1},{1272,1},{1274,1},{1276,1},{1278,1},{1280,1},{1282,1},{1284,1},{1286,1},{1288,1},{1290,1},{1292,1},{1294,1},{1296,1},{1298,1},{1300,1},{1302,1},{1304,1},{1306,1},{1308,1},{1310,1},{1312,1},{1314,1},{1316,1},{1318,1},{1320,1},{1322,1},{1324,1},{1326,1},{1329,38},{4256,38},{4295,1},{4301,1},{5024,86},{7312,43},{7357,3},{7680,1},{7682,1},{7684,1},{7686,1},{7688,1},{7690,1},{7692,1},{7694,1},{7696,1},{7698,1},{7700,1},{7702,1},{7704,1},{7706,1},{7708,1},{7710,1},{7712,1},{7714,1},{7716,1},{7718,1},{7720,1},{7722,1},{7724,1},{7726,1},{7728,1},{7730,1},{7732,1},{7734,1},{7736,1},{7738,1},{7740,1},{7742,1},{7744,1},{7746,1},{7748,1},{7750,1},{7752,1},{7754,1},{7756,1},{7758,1},{7760,1},{7762,1},{7764,1},{7766,1},{7768,1},{7770,1},{7772,1},{7774,1},{7776,1},{7778,1},{7780,1},{7782,1},{7784,1},{7786,1},{7788,1},{7790,1},{7792,1},{7794,1},{7796,1},{7798,1},{7800,1},{7802,1},{7804,1},{7806,1},{7808,1},{7810,1},{7812,1},{7814,1},{7816,1},{7818,1},{7820,1},{7822,1},{7824,1},{7826,1},{7828,1},{7838,1},{7840,1},{7842,1},{7844,1},{7846,1},{7848,1},{7850,1},{7852,1},{7854,1},{7856,1},{7858,1},{7860,1},{7862,1},{7864,1},{7866,1},{7868,1},{7870,1},{7872,1},{7874,1},{7876,1},{7878,1},{7880,1},{7882,1},{7884,1},{7886,1},{7888,1},{7890,1},{7892,1},{7894,1},{7896,1},{7898,1},{7900,1},{7902,1},{7904,1},{7906,1},{7908,1},{7910,1},{7912,1},{7914,1},{7916,1},{7918,1},{7920,1},{7922,1},{7924,1},{7926,1},{7928,1},{7930,1},{7932,1},{7934,1},{7944,8},{7960,6},{7976,8},{7992,8},{8008,6},{8025,1},{8027,1},{8029,1},{8031,1},{8040,8},{8120,4},{8136,4},{8152,4},{8168,5},{8184,4},{8450,1},{8455,1},{8459,3},{8464,3},{8469,1},{8473,5},{8484,1},{8486,1},{8488,1},{8490,4},{8496,4},{8510,2},{8517,1},{8579,1},{11264,47},{11360,1},{11362,3},{11367,1},{11369,1},{11371,1},{11373,4},{11378,1},{11381,1},{11390,3},{11394,1},{11396,1},{11398,1},{11400,1},{11402,1},{11404,1},{11406,1},{11408,1},{11410,1},{11412,1},{11414,1},{11416,1},{11418,1},{11420,1},{11422,1},{11424,1},{11426,1},{11428,1},{11430,1},{11432,1},{11434,1},{11436,1},{11438,1},{11440,1},{11442,1},{11444,1},{11446,1},{11448,1},{11450,1},{11452,1},{11454,1},{11456,1},{11458,1},{11460,1},{11462,1},{11464,1},{11466,1},{11468,1},{11470,1},{11472,1},{11474,1},{11476,1},{11478,1},{11480,1},{11482,1},{11484,1},{11486,1},{11488,1},{11490,1},{11499,1},{11501,1},{11506,1},{42560,1},{42562,1},{42564,1},{42566,1},{42568,1},{42570,1},{42572,1},{42574,1},{42576,1},{42578,1},{42580,1},{42582,1},{42584,1},{42586,1},{42588,1},{42590,1},{42592,1},{42594,1},{42596,1},{42598,1},{42600,1},{42602,1},{42604,1},{42624,1},{42626,1},{42628,1},{42630,1},{42632,1},{42634,1},{42636,1},{42638,1},{42640,1},{42642,1},{42644,1},{42646,1},{42648,1},{42650,1},{42786,1},{42788,1},{42790,1},{42792,1},{42794,1},{42796,1},{42798,1},{42802,1},{42804,1},{42806,1},{42808,1},{42810,1},{42812,1},{42814,1},{42816,1},{42818,1},{42820,1},{42822,1},{42824,1},{42826,1},{42828,1},{42830,1},{42832,1},{42834,1},{42836,1},{42838,1},{42840,1},{42842,1},{42844,1},{42846,1},{42848,1},{42850,1},{42852,1},{42854,1},{42856,1},{42858,1},{42860,1},{42862,1},{42873,1},{42875,1},{42877,2},{42880,1},{42882,1},{42884,1},{42886,1},{42891,1},{42893,1},{42896,1},{42898,1},{42902,1},{42904,1},{42906,1},{42908,1},{42910,1},{42912,1},{42914,1},{42916,1},{42918,1},{42920,1},{42922,5},{42928,5},{42934,1},{42936,1},{42938,1},{42940,1},{42942,1},{42946,1},{42948,4},{42953,1},{42997,1},{65313,26},{66560,40},{66736,36},{68736,51},{71840,32},{93760,32},{119808,26},{119860,26},{119912,26},{119964,1},{119966,2},{119970,1},{119973,2},{119977,4},{119982,8},{120016,26},{120068,2},{120071,4},{120077,8},{120086,7},{120120,2},{120123,4},{120128,5},{120134,1},{120138,7},{120172,26},{120224,26},{120276,26},{120328,26},{120380,26},{120432,26},{120488,25},{120546,25},{120604,25},{120662,25},{120720,25},{120778,1},{125184,34},{142656,1},{142660,2},{142663,2},{142666,1},{142670,1},{142817,26},{142901,1},{142943,24},{142968,8},{142977,1},{142979,1},{142981,1},{142983,1},{142985,1},{142987,1},{142989,1},{142991,1},{142993,1},{142995,1},{142997,1},{142999,1},{143001,1},{143003,1},{143005,1},{143007,1},{143009,1},{143011,1},{143013,1},{143015,1},{143017,1},{143019,1},{143021,1},{143023,1},{143025,1},{143027,1},{143029,1},{143031,2},{143034,1},{143036,1},{143038,1},{143040,1},{143042,1},{143044,1},{143046,1},{143048,2},{143051,1},{143053,1},{143055,1},{143057,1},{143059,1},{143061,1},{143063,1},{143065,1},{143067,1},{143069,1},{143071,1},{143073,1},{143075,1},{143077,1},{143079,1},{143081,1},{143083,1},{143085,1},{143087,1},{143089,1},{143091,1},{143093,1},{143095,1},{143098,1},{143100,1},{143102,3},{143107,1},{143109,1},{143112,1},{143116,2},{143122,1},{143125,1},{143129,3},{143134,1},{143137,1},{143139,1},{143141,1},{143144,1},{143146,2},{143149,1},{143152,1},{143156,1},{143158,1},{143161,2},{143165,3},{143174,1},{143177,1},{143180,1},{143182,1},{143184,1},{143186,1},{143188,1},{143190,1},{143192,1},{143194,1},{143196,2},{143199,1},{143201,1},{143203,1},{143205,1},{143207,1},{143209,1},{143211,1},{143213,1},{143215,2},{143219,1},{143221,1},{143225,1},{143227,1},{143229,1},{143231,1},{143233,1},{143235,1},{143237,1},{143239,1},{143241,1},{143243,1},{143245,1},{143247,1},{143249,1},{143251,1},{143253,1},{143255,1},{143257,1},{143259,1},{143261,1},{143263,1},{143265,1},{143267,1},{143269,1},{143271,1},{143273,1},{143275,1},{143277,1},{143279,1},{143281,1},{143283,7},{143292,1},{143295,2},{143298,1},{143303,1},{143305,1},{143307,1},{143309,1},{143311,69},{143381,27},{143601,1},{143603,1},{143607,1},{143611,3},{143632,1},{143660,35},{143696,2},{143701,3},{143705,1},{143707,1},{143709,1},{143711,1},{143713,1},{143715,1},{143717,1},{143719,1},{143721,1},{143723,1},{143725,1},{143727,5},{143733,1},{143736,1},{143739,2},{143792,48},{143841,1},{143843,1},{143845,1},{143847,1},{143849,1},{143851,1},{143853,1},{143855,1},{143857,1},{143859,1},{143861,1},{143863,1},{143865,1},{143867,1},{143869,1},{143871,1},{143873,1},{143883,1},{143885,1},{143887,1},{143889,1},{143891,1},{143893,1},{143895,1},{143897,1},{143899,1},{143901,1},{143903,1},{143905,1},{143907,1},{143909,1},{143911,1},{143913,1},{143915,1},{143917,1},{143919,1},{143921,1},{143923,1},{143925,1},{143927,1},{143929,1},{143931,1},{143933,1},{143935,1},{143938,1},{143940,1},{143942,1},{143944,1},{143946,1},{143948,1},{143950,2},{143953,1},{143955,1},{143957,1},{143959,1},{143961,1},{143963,1},{143965,1},{143967,1},{143969,1},{143971,1},{143973,1},{143975,1},{143977,1},{143979,1},{143981,1},{143983,1},{143985,1},{143987,1},{143989,1},{143991,1},{143993,1},{143995,1},{143997,1},{143999,1},{144001,1},{144003,1},{144005,1},{144007,1},{144009,1},{144011,1},{144013,1},{144015,1},{144017,1},{144019,1},{144021,1},{144023,1},{144025,1},{144027,1},{144029,1},{144031,1},{144033,1},{144035,1},{144037,1},{144039,1},{144041,1},{144043,1},{144045,1},{144047,1},{144096,41},{147024,43},{147069,3},{147832,6},{150016,9},{150144,44},{150251,13},{150265,34},{150401,1},{150403,1},{150405,1},{150407,1},{150409,1},{150411,1},{150413,1},{150415,1},{150417,1},{150419,1},{150421,1},{150423,1},{150425,1},{150427,1},{150429,1},{150431,1},{150433,1},{150435,1},{150437,1},{150439,1},{150441,1},{150443,1},{150445,1},{150447,1},{150449,1},{150451,1},{150453,1},{150455,1},{150457,1},{150459,1},{150461,1},{150463,1},{150465,1},{150467,1},{150469,1},{150471,1},{150473,1},{150475,1},{150477,1},{150479,1},{150481,1},{150483,1},{150485,1},{150487,1},{150489,1},{150491,1},{150493,1},{150495,1},{150497,1},{150499,1},{150501,1},{150503,1},{150505,1},{150507,1},{150509,1},{150511,1},{150513,1},{150515,1},{150517,1},{150519,1},{150521,1},{150523,1},{150525,1},{150527,1},{150529,1},{150531,1},{150533,1},{150535,1},{150537,1},{150539,1},{150541,1},{150543,1},{150545,1},{150547,1},{150549,9},{150559,1},{150561,1},{150563,1},{150565,1},{150567,1},{150569,1},{150571,1},{150573,1},{150575,1},{150577,1},{150579,1},{150581,1},{150583,1},{150585,1},{150587,1},{150589,1},{150591,1},{150593,1},{150595,1},{150597,1},{150599,1},{150601,1},{150603,1},{150605,1},{150607,1},{150609,1},{150611,1},{150613,1},{150615,1},{150617,1},{150619,1},{150621,1},{150623,1},{150625,1},{150627,1},{150629,1},{150631,1},{150633,1},{150635,1},{150637,1},{150639,1},{150641,1},{150643,1},{150645,1},{150647,1},{150649,1},{150651,1},{150653,1},{150655,9},{150672,6},{150688,8},{150704,8},{150720,6},{150736,8},{150752,8},{150768,14},{150784,8},{150800,8},{150816,8},{150832,5},{150838,2},{150846,1},{150850,3},{150854,2},{150864,4},{150870,2},{150880,8},{150898,3},{150902,2},{151178,1},{151182,2},{151187,1},{151215,1},{151220,1},{151225,1},{151228,2},{151238,4},{151246,1},{151300,1},{154032,47},{154081,1},{154085,2},{154088,1},{154090,1},{154092,1},{154097,1},{154099,2},{154102,6},{154113,1},{154115,1},{154117,1},{154119,1},{154121,1},{154123,1},{154125,1},{154127,1},{154129,1},{154131,1},{154133,1},{154135,1},{154137,1},{154139,1},{154141,1},{154143,1},{154145,1},{154147,1},{154149,1},{154151,1},{154153,1},{154155,1},{154157,1},{154159,1},{154161,1},{154163,1},{154165,1},{154167,1},{154169,1},{154171,1},{154173,1},{154175,1},{154177,1},{154179,1},{154181,1},{154183,1},{154185,1},{154187,1},{154189,1},{154191,1},{154193,1},{154195,1},{154197,1},{154199,1},{154201,1},{154203,1},{154205,1},{154207,1},{154209,1},{154211,2},{154220,1},{154222,1},{154227,1},{154240,38},{154279,1},{154285,1},{185281,1},{185283,1},{185285,1},{185287,1},{185289,1},{185291,1},{185293,1},{185295,1},{185297,1},{185299,1},{185301,1},{185303,1},{185305,1},{185307,1},{185309,1},{185311,1},{185313,1},{185315,1},{185317,1},{185319,1},{185321,1},{185323,1},{185325,1},{185345,1},{185347,1},{185349,1},{185351,1},{185353,1},{185355,1},{185357,1},{185359,1},{185361,1},{185363,1},{185365,1},{185367,1},{185369,1},{185371,1},{185507,1},{185509,1},{185511,1},{185513,1},{185515,1},{185517,1},{185519,3},{185523,1},{185525,1},{185527,1},{185529,1},{185531,1},{185533,1},{185535,1},{185537,1},{185539,1},{185541,1},{185543,1},{185545,1},{185547,1},{185549,1},{185551,1},{185553,1},{185555,1},{185557,1},{185559,1},{185561,1},{185563,1},{185565,1},{185567,1},{185569,1},{185571,1},{185573,1},{185575,1},{185577,1},{185579,1},{185581,1},{185583,1},{185585,8},{185594,1},{185596,1},{185599,1},{185601,1},{185603,1},{185605,1},{185607,1},{185612,1},{185614,1},{185617,1},{185619,3},{185623,1},{185625,1},{185627,1},{185629,1},{185631,1},{185633,1},{185635,1},{185637,1},{185639,1},{185641,1},{185647,1},{185653,1},{185655,1},{185657,1},{185659,1},{185661,1},{185663,1},{185667,1},{185672,1},{185674,1},{185718,1},{185722,1},{186544,43},{186592,9},{186608,80}}; #else /* GNUSTEP_INDEX_CHARSET */ static const unsigned char uppercaseLetterCharSet[24576] = {'\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfe','\xff','\xff','\x07','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\x7f','\x7f','\x00','\x00','\x00','\x00','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\xaa','\xaa','\x54','\x55','\x55','\x55','\x55','\x55','\x2b','\xd6','\xce','\xdb','\xb1','\xd5','\xd2','\xae','\x11','\x90','\xa4','\xaa','\x4a','\x55','\x55','\xd2','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x05','\x6c','\x7a','\x55','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x45','\x80','\x40','\xd7','\xfe','\xff','\xfb','\x0f','\x00','\x00','\x00','\x80','\x1c','\x55','\x55','\x55','\x90','\xe6','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x55','\x55','\x55','\x55','\x01','\x54','\x55','\x55','\x55','\x55','\x55','\x55','\xab','\x2a','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\xfe','\xff','\xff','\xff','\x7f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xbf','\x20','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x3f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xe7','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x15','\x40','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x00','\xff','\x00','\x3f','\x00','\xff','\x00','\xff','\x00','\x3f','\x00','\xaa','\x00','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x0f','\x00','\x0f','\x00','\x0f','\x00','\x1f','\x00','\x0f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x84','\x38','\x27','\x3e','\x50','\x3d','\x0f','\xc0','\x20','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x08','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\x7f','\x00','\x00','\x00','\x00','\x00','\x00','\x9d','\xea','\x25','\xc0','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x05','\x28','\x04','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x55','\x55','\x55','\x55','\x55','\x15','\x00','\x00','\x55','\x55','\x55','\x05','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x54','\x55','\x54','\x55','\x55','\x55','\x55','\x55','\x55','\x55','\x00','\x6a','\x55','\x28','\x45','\x55','\x55','\x7d','\x5f','\x55','\xf4','\x02','\x00','\x00','\x00','\x00','\x20','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfe','\xff','\xff','\x07','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\x0f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\x07','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\x03','\x00','\x00','\xf0','\xff','\xff','\x3f','\x00','\x00','\x00','\xff','\xff','\xff','\x03','\x00','\x00','\xd0','\x64','\xde','\x3f','\x00','\x00','\x00','\xff','\xff','\xff','\x03','\x00','\x00','\xb0','\xe7','\xdf','\x1f','\x00','\x00','\x00','\x7b','\x5f','\xfc','\x01','\x00','\x00','\xf0','\xff','\xff','\x3f','\x00','\x00','\x00','\xff','\xff','\xff','\x03','\x00','\x00','\xf0','\xff','\xff','\x3f','\x00','\x00','\x00','\xff','\xff','\xff','\x03','\x00','\x00','\xf0','\xff','\xff','\x3f','\x00','\x00','\x00','\xff','\xff','\xff','\x03','\x00','\x00','\x00','\xff','\xff','\xff','\x01','\x00','\x00','\x00','\xfc','\xff','\xff','\x07','\x00','\x00','\x00','\xf0','\xff','\xff','\x1f','\x00','\x00','\x00','\xc0','\xff','\xff','\x7f','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\x01','\x00','\x00','\x00','\x04','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\x03','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xb1','\x45','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xfe','\xff','\xff','\x07','\x00','\x00','\x00','\x00','\x00','\x00','\x20','\x00','\x00','\x00','\x00','\x80','\xff','\xff','\x7f','\xff','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\x55','\x55','\xab','\xaa','\xaa','\xaa','\xaa','\xaa','\xd4','\x29','\x31','\x24','\x4e','\x2a','\x2d','\x51','\xe6','\x40','\x52','\x55','\xb5','\xaa','\xaa','\x29','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xfa','\x93','\x85','\xaa','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xef','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x8a','\x38','\x00','\x00','\x01','\x00','\x00','\xf0','\xff','\xff','\xff','\x7f','\xe3','\xaa','\xaa','\xaa','\x2f','\x19','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xff','\xaa','\xaa','\xaa','\xaa','\x02','\xa8','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\x54','\xd5','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\xe7','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x3f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\x0f','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xf8','\xff','\xfe','\xff','\xff','\xff','\x07','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xea','\xbf','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xff','\x00','\x3f','\x00','\xff','\x00','\xff','\x00','\x3f','\x00','\xff','\x00','\xff','\x00','\xff','\x3f','\xff','\x00','\xff','\x00','\xff','\x00','\xdf','\x40','\xdc','\x00','\xcf','\x00','\xff','\x00','\xdc','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xc4','\x08','\x00','\x00','\x80','\x10','\x32','\xc0','\x43','\x00','\x00','\x00','\x00','\x00','\x00','\x10','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\x7f','\x62','\x15','\xda','\x0f','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\x1a','\x50','\x08','\x00','\xff','\xff','\xff','\xff','\xbf','\x20','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xaa','\xaa','\xaa','\xaa','\xaa','\x2a','\x00','\x00','\xaa','\xaa','\xaa','\x0a','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xa8','\xaa','\xab','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xaa','\xfe','\x95','\xaa','\x50','\xba','\xaa','\xaa','\x82','\xa0','\xaa','\x08','\x05','\x00','\x00','\x00','\x00','\x40','\x04','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\xff','\xff','\xff','\xff','\x07','\xff','\x01','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\xff','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00'}; #endif /* GNUSTEP_INDEX_CHARSET */ #if defined(GNUSTEP_INDEX_CHARSET) static const NSRange URLFragmentAllowedCharSet[] = {{33,1},{36,1},{38,22},{61,1},{63,28},{95,1},{97,26},{126,1}}; #else /* GNUSTEP_INDEX_CHARSET */ static const unsigned char URLFragmentAllowedCharSet[16] = {'\x00','\x00','\x00','\x00','\xd2','\xff','\xff','\xaf','\xff','\xff','\xff','\x87','\xfe','\xff','\xff','\x47'}; #endif /* GNUSTEP_INDEX_CHARSET */ #if defined(GNUSTEP_INDEX_CHARSET) static const NSRange URLHostAllowedCharSet[] = {{33,1},{36,1},{38,9},{48,12},{61,1},{65,27},{93,1},{95,1},{97,26},{126,1}}; #else /* GNUSTEP_INDEX_CHARSET */ static const unsigned char URLHostAllowedCharSet[16] = {'\x00','\x00','\x00','\x00','\xd2','\x7f','\xff','\x2f','\xfe','\xff','\xff','\xaf','\xfe','\xff','\xff','\x47'}; #endif /* GNUSTEP_INDEX_CHARSET */ #if defined(GNUSTEP_INDEX_CHARSET) static const NSRange URLPasswordAllowedCharSet[] = {{33,1},{36,1},{38,9},{48,10},{59,1},{61,1},{65,26},{95,1},{97,26},{126,1}}; #else /* GNUSTEP_INDEX_CHARSET */ static const unsigned char URLPasswordAllowedCharSet[16] = {'\x00','\x00','\x00','\x00','\xd2','\x7f','\xff','\x2b','\xfe','\xff','\xff','\x87','\xfe','\xff','\xff','\x47'}; #endif /* GNUSTEP_INDEX_CHARSET */ #if defined(GNUSTEP_INDEX_CHARSET) static const NSRange URLPathAllowedCharSet[] = {{33,1},{36,1},{38,21},{61,1},{64,27},{95,1},{97,26},{126,1}}; #else /* GNUSTEP_INDEX_CHARSET */ static const unsigned char URLPathAllowedCharSet[16] = {'\x00','\x00','\x00','\x00','\xd2','\xff','\xff','\x27','\xff','\xff','\xff','\x87','\xfe','\xff','\xff','\x47'}; #endif /* GNUSTEP_INDEX_CHARSET */ #if defined(GNUSTEP_INDEX_CHARSET) static const NSRange URLQueryAllowedCharSet[] = {{33,1},{36,1},{38,22},{61,1},{63,28},{95,1},{97,26},{126,1}}; #else /* GNUSTEP_INDEX_CHARSET */ static const unsigned char URLQueryAllowedCharSet[16] = {'\x00','\x00','\x00','\x00','\xd2','\xff','\xff','\xaf','\xff','\xff','\xff','\x87','\xfe','\xff','\xff','\x47'}; #endif /* GNUSTEP_INDEX_CHARSET */ #if defined(GNUSTEP_INDEX_CHARSET) static const NSRange URLUserAllowedCharSet[] = {{33,1},{36,1},{38,9},{48,10},{59,1},{61,1},{65,26},{95,1},{97,26},{126,1}}; #else /* GNUSTEP_INDEX_CHARSET */ static const unsigned char URLUserAllowedCharSet[16] = {'\x00','\x00','\x00','\x00','\xd2','\x7f','\xff','\x2b','\xfe','\xff','\xff','\x87','\xfe','\xff','\xff','\x47'}; #endif /* GNUSTEP_INDEX_CHARSET */ #if defined(GNUSTEP_INDEX_CHARSET) static const NSRange whitespaceAndNlCharSet[] = {{9,5},{32,1},{133,1},{160,1},{5760,1},{8192,12},{8232,2},{8239,1},{8287,1},{12288,1}}; #else /* GNUSTEP_INDEX_CHARSET */ static const unsigned char whitespaceAndNlCharSet[1537] = {'\x00','\x3e','\x00','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x20','\x00','\x00','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x0f','\x00','\x00','\x00','\x83','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01'}; #endif /* GNUSTEP_INDEX_CHARSET */ #if defined(GNUSTEP_INDEX_CHARSET) static const NSRange whitespaceCharSet[] = {{9,1},{32,1},{160,1},{5760,1},{8192,12},{8232,2},{8239,1},{8287,1},{12288,1}}; #else /* GNUSTEP_INDEX_CHARSET */ static const unsigned char whitespaceCharSet[1537] = {'\x00','\x02','\x00','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\xff','\x0f','\x00','\x00','\x00','\x83','\x00','\x00','\x00','\x00','\x00','\x80','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01'}; #endif /* GNUSTEP_INDEX_CHARSET */ gnustep-base-1.29.0/Source/NSClassDescription.m000066400000000000000000000136431435650067400213510ustar00rootroot00000000000000/** NSClassDescription Copyright (C) 2000 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 2000 This file is part of the GNUstep Base Library. 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 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 USA. NSClassDescription class reference $Date$ $Revision$ */ #import "common.h" #import "Foundation/NSClassDescription.h" #import "Foundation/NSLock.h" #import "Foundation/NSMapTable.h" #import "Foundation/NSNotification.h" /** * Each instance of this class provides descriptive information for an * Objective C class. This is used for key-value coding, a framework * used in Cocoa for scripting with Objective-C objects. Scripting is * available in GNUstep in many ways, however those implementations do * not make use of class descriptions. Therefore the primary purpose * of this class is to smooth the process of porting between GNUstep * and other OpenStep-derived systems. */ @implementation NSClassDescription static NSRecursiveLock *mapLock = nil; static NSMapTable *classMap; /** * Returns the class description for aClass. If there is no such description * available, sends an * NSClassDescriptionNeededForClassNotification (with aClass as * its object) so that objects providing class descriptions can register one, * and tries again to find one.
Returns nil if there is no description * found.
Handles locking to ensure thread safety and ensures that the * returned object will not be destroyed by other threads. */ + (NSClassDescription*) classDescriptionForClass: (Class)aClass { NSClassDescription *description; [mapLock lock]; description = NSMapGet(classMap, aClass); if (description == nil) { NSNotificationCenter *nc; /* * As we have a recursive lock, we can ask other objects to * supply descriptuions right now, without having to unlock * and re-lock */ nc = [NSNotificationCenter defaultCenter]; [nc postNotificationName: NSClassDescriptionNeededForClassNotification object: aClass]; description = NSMapGet(classMap, aClass); } IF_NO_ARC([description retain];) [mapLock unlock]; return AUTORELEASE(description); } + (void) initialize { if (self == [NSClassDescription class]) { classMap = NSCreateMapTable(NSObjectMapKeyCallBacks, NSObjectMapValueCallBacks, 100); [[NSObject leakAt: &classMap] release]; mapLock = [NSRecursiveLock new]; [[NSObject leakAt: &mapLock] release]; } } /** * Invalidates the cache of class descriptions so the new descriptions * will be fetched as required and begin to refill the cache. You need * this only if you suspect that a class description should have * changed. */ + (void) invalidateClassDescriptionCache { [mapLock lock]; NSResetMapTable(classMap); [mapLock unlock]; } /** * Registers aDescription for aClass ... placing it in the cache and * replacing any previous version. */ + (void) registerClassDescription: (NSClassDescription*)aDescription forClass: (Class)aClass { if (aDescription != nil && aClass != 0) { [mapLock lock]; NSMapInsert(classMap, aClass, aDescription); [mapLock unlock]; } } /** * Returns the attribute keys - default implementation returns nil. */ - (NSArray*) attributeKeys { return nil; } /** * Returns the inverse relationship keys - default implementation returns nil. */ - (NSString*) inverseForRelationshipKey: (NSString*)aKey { return nil; } /** * Returns the to many relationship keys - default implementation returns nil. */ - (NSArray*) toManyRelationshipKeys { return nil; } /** * Returns the to one relationship keys - default implementation returns nil. */ - (NSArray*) toOneRelationshipKeys { return nil; } @end @implementation NSObject(NSClassDescriptionPrimitives) static Class NSClassDescriptionClass = 0; /** * Returns the attribute keys supplied by the * * object for the receivers class. */ - (NSArray*) attributeKeys { return [[self classDescription] attributeKeys]; } /** * Returns the * object for the receivers class. */ - (NSClassDescription*) classDescription { if (NSClassDescriptionClass == 0) { NSClassDescriptionClass = [NSClassDescription class]; } return [NSClassDescriptionClass classDescriptionForClass: [self class]]; } /** * Returns the inverse relationship keys supplied by the * * object for the receivers class. */ - (NSString*) inverseForRelationshipKey: (NSString*)aKey { return [[self classDescription] inverseForRelationshipKey: aKey]; } /** * Returns the to many relationship keys supplied by the * * object for the receivers class. */ - (NSArray*) toManyRelationshipKeys { return [[self classDescription] toManyRelationshipKeys]; } /** * Returns the to one relationship keys supplied by the * * object for the receivers class. */ - (NSArray*) toOneRelationshipKeys { return [[self classDescription] toOneRelationshipKeys]; } @end gnustep-base-1.29.0/Source/NSCoder.m000066400000000000000000000272231435650067400171330ustar00rootroot00000000000000/** NSCoder - coder object for serialization and persistance. Copyright (C) 1995, 1996 Free Software Foundation, Inc. Written by: Andrew Kachites McCallum From skeleton by: Adam Fedor Date: Mar 1995 This file is part of the GNUstep Base Library. 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 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 USA. NSCoder class reference $Date$ $Revision$ */ #import "common.h" #if !defined (__GNU_LIBOBJC__) # include #endif #define EXPOSE_NSCoder_IVARS 1 #import "Foundation/NSData.h" #import "Foundation/NSCoder.h" #import "Foundation/NSSet.h" #import "Foundation/NSSerialization.h" #import "Foundation/NSUserDefaults.h" @implementation NSCoder /* We used to use a system version which actually reflected the version * of GNUstep-base ... but people screwed that up by releasing versions * of base with unofficial version numbers conflicting with the scheme. * So ... we are now starting from a basepoint of 1 million ... on the * basis that the old numbering scheme derived from the gnustep-base * major.minor.subminor versioning (in which each can range from 0 to 99) * should not have allowed anyone to create an archive with a version * greater than 999999. * In future, the system version will change if (and only if) the format * of the encoded data changes. */ #define MAX_SUPPORTED_SYSTEM_VERSION 1000000 static unsigned systemVersion = MAX_SUPPORTED_SYSTEM_VERSION; + (void) initialize { if (self == [NSCoder class]) { unsigned sv; /* The GSCoderSystemVersion user default is provided for testing * and to allow new code to communicate (via Distributed Objects) * with systems running older versions. */ sv = [[NSUserDefaults standardUserDefaults] integerForKey: @"GSCoderSystemVersion"]; if (sv > 0 && sv <= MAX_SUPPORTED_SYSTEM_VERSION) { systemVersion = sv; } } } - (void) encodeValueOfObjCType: (const char*)type at: (const void*)address { [self subclassResponsibility: _cmd]; } - (void) decodeValueOfObjCType: (const char*)type at: (void*)address { [self subclassResponsibility: _cmd]; } - (void) encodeDataObject: (NSData*)data { [self subclassResponsibility: _cmd]; } - (NSData*) decodeDataObject { [self subclassResponsibility: _cmd]; return nil; } - (NSInteger) versionForClassName: (NSString*)className { [self subclassResponsibility: _cmd]; return (NSInteger)NSNotFound; } // Encoding Data - (void) encodeArrayOfObjCType: (const char*)type count: (NSUInteger)count at: (const void*)array { unsigned i; unsigned size = objc_sizeof_type(type); const char *where = array; IMP imp; imp = [self methodForSelector: @selector(encodeValueOfObjCType:at:)]; for (i = 0; i < count; i++, where += size) { (*imp)(self, @selector(encodeValueOfObjCType:at:), type, where); } } - (void) encodeBycopyObject: (id)anObject { [self encodeObject: anObject]; } - (void) encodeByrefObject: (id)anObject { [self encodeObject: anObject]; } - (void) encodeBytes: (void*)d length: (NSUInteger)l { const char *type = @encode(unsigned char); const unsigned char *where = (const unsigned char*)d; IMP imp; imp = [self methodForSelector: @selector(encodeValueOfObjCType:at:)]; (*imp)(self, @selector(encodeValueOfObjCType:at:), @encode(unsigned), &l); while (l-- > 0) (*imp)(self, @selector(encodeValueOfObjCType:at:), type, where++); } - (void) encodeConditionalObject: (id)anObject { [self encodeObject: anObject]; } - (void) encodeObject: (id)anObject { [self encodeValueOfObjCType: @encode(id) at: &anObject]; } - (void) encodePropertyList: (id)plist { id anObject; anObject = plist ? (id)[NSSerializer serializePropertyList: plist] : nil; [self encodeValueOfObjCType: @encode(id) at: &anObject]; } - (void) encodePoint: (NSPoint)point { [self encodeValueOfObjCType: @encode(NSPoint) at: &point]; } - (void) encodeRect: (NSRect)rect { [self encodeValueOfObjCType: @encode(NSRect) at: &rect]; } - (void) encodeRootObject: (id)rootObject { [self encodeObject: rootObject]; } - (void) encodeSize: (NSSize)size { [self encodeValueOfObjCType: @encode(NSSize) at: &size]; } - (void) encodeValuesOfObjCTypes: (const char*)types,... { va_list ap; IMP imp; imp = [self methodForSelector: @selector(encodeValueOfObjCType:at:)]; va_start(ap, types); while (*types) { (*imp)(self, @selector(encodeValueOfObjCType:at:), types, va_arg(ap, void*)); types = objc_skip_typespec(types); } va_end(ap); } // Decoding Data - (void) decodeArrayOfObjCType: (const char*)type count: (NSUInteger)count at: (void*)address { unsigned i; unsigned size = objc_sizeof_type(type); char *where = address; IMP imp; imp = [self methodForSelector: @selector(decodeValueOfObjCType:at:)]; for (i = 0; i < count; i++, where += size) { (*imp)(self, @selector(decodeValueOfObjCType:at:), type, where); } } - (void*) decodeBytesWithReturnedLength: (NSUInteger*)l { unsigned int count; const char *type = @encode(unsigned char); unsigned char *where; unsigned char *array; IMP imp; imp = [self methodForSelector: @selector(decodeValueOfObjCType:at:)]; (*imp)(self, @selector(decodeValueOfObjCType:at:), @encode(unsigned int), &count); *l = (NSUInteger)count; array = NSZoneMalloc(NSDefaultMallocZone(), count); where = array; while (count-- > 0) { (*imp)(self, @selector(decodeValueOfObjCType:at:), type, where++); } [NSData dataWithBytesNoCopy: array length: count]; return array; } - (id) decodeObject { id o = nil; [self decodeValueOfObjCType: @encode(id) at: &o]; return AUTORELEASE(o); } - (id) decodePropertyList { id o; id d = nil; [self decodeValueOfObjCType: @encode(id) at: &d]; if (d != nil) { o = [NSDeserializer deserializePropertyListFromData: d mutableContainers: NO]; RELEASE(d); } else { o = nil; } return o; } - (NSPoint) decodePoint { NSPoint point; [self decodeValueOfObjCType: @encode(NSPoint) at: &point]; return point; } - (NSRect) decodeRect { NSRect rect; [self decodeValueOfObjCType: @encode(NSRect) at: &rect]; return rect; } - (NSSize) decodeSize { NSSize size; [self decodeValueOfObjCType: @encode(NSSize) at: &size]; return size; } - (void) decodeValuesOfObjCTypes: (const char*)types,... { va_list ap; IMP imp; imp = [self methodForSelector: @selector(decodeValueOfObjCType:at:)]; va_start(ap, types); while (*types) { (*imp)(self, @selector(decodeValueOfObjCType:at:), types, va_arg(ap, void*)); types = objc_skip_typespec(types); } va_end(ap); } // Managing Zones - (NSZone*) objectZone { return NSDefaultMallocZone(); } - (void) setObjectZone: (NSZone*)zone { ; } // Getting a Version - (unsigned) systemVersion { return systemVersion; } // Keyed archiving extensions - (BOOL) requiresSecureCoding { [self subclassResponsibility: _cmd]; return NO; } - (void) setRequiresSecureCoding: (BOOL)secure { [self subclassResponsibility: _cmd]; } - (BOOL) allowsKeyedCoding { return NO; } - (BOOL) containsValueForKey: (NSString*)aKey { [self subclassResponsibility: _cmd]; return NO; } - (BOOL) decodeBoolForKey: (NSString*)aKey { [self subclassResponsibility: _cmd]; return NO; } - (const uint8_t*) decodeBytesForKey: (NSString*)aKey returnedLength: (NSUInteger*)alength { [self subclassResponsibility: _cmd]; return 0; } - (double) decodeDoubleForKey: (NSString*)aKey { [self subclassResponsibility: _cmd]; return 0.0; } - (float) decodeFloatForKey: (NSString*)aKey { [self subclassResponsibility: _cmd]; return 0.0; } - (int) decodeIntForKey: (NSString*)aKey { [self subclassResponsibility: _cmd]; return 0; } - (NSInteger) decodeIntegerForKey: (NSString*)key { [self subclassResponsibility: _cmd]; return 0; } - (int32_t) decodeInt32ForKey: (NSString*)aKey { [self subclassResponsibility: _cmd]; return 0; } - (int64_t) decodeInt64ForKey: (NSString*)aKey { [self subclassResponsibility: _cmd]; return 0; } - (id) decodeObjectForKey: (NSString*)aKey { [self subclassResponsibility: _cmd]; return nil; } - (id) decodeObjectOfClass: (Class)cls forKey: (NSString *)aKey { return [self decodeObjectOfClasses: [NSSet setWithObject:(id)cls] forKey: aKey]; } - (id) decodeObjectOfClasses: (NSSet *)classes forKey: (NSString *)aKey { [self subclassResponsibility: _cmd]; return nil; } - (void) encodeBool: (BOOL) aBool forKey: (NSString*)aKey { [self subclassResponsibility: _cmd]; } - (void) encodeBytes: (const uint8_t*)aPointer length: (NSUInteger)length forKey: (NSString*)aKey { [self subclassResponsibility: _cmd]; } - (void) encodeConditionalObject: (id)anObject forKey: (NSString*)aKey { [self subclassResponsibility: _cmd]; } - (void) encodeDouble: (double)aDouble forKey: (NSString*)aKey { [self subclassResponsibility: _cmd]; } - (void) encodeFloat: (float)aFloat forKey: (NSString*)aKey { [self subclassResponsibility: _cmd]; } - (void) encodeInt: (int)anInteger forKey: (NSString*)aKey { [self subclassResponsibility: _cmd]; } - (void) encodeInteger: (NSInteger)anInteger forKey: (NSString*)key { [self subclassResponsibility: _cmd]; } - (void) encodeInt32: (int32_t)anInteger forKey: (NSString*)aKey { [self subclassResponsibility: _cmd]; } - (void) encodeInt64: (int64_t)anInteger forKey: (NSString*)aKey { [self subclassResponsibility: _cmd]; } - (void) encodeObject: (id)anObject forKey: (NSString*)aKey { [self subclassResponsibility: _cmd]; } @end #import "GSPrivate.h" @implementation _NSKeyedCoderOldStyleArray - (const void*) bytes { return _a; } - (NSUInteger) count { return _c; } - (void) dealloc { DESTROY(_d); [super dealloc]; } - (id) initWithCoder: (NSCoder*)aCoder { id o; void *address; unsigned i; _c = [aCoder decodeIntForKey: @"NS.count"]; _t[0] = (char)[aCoder decodeIntForKey: @"NS.type"]; _t[1] = '\0'; /* * We decode the size from the remote end, but discard it as we * are probably safer to use the local size of the datatype involved. */ _s = [aCoder decodeIntForKey: @"NS.size"]; _s = objc_sizeof_type(_t); _d = o = [[NSMutableData alloc] initWithLength: _c * _s]; _a = address = [o mutableBytes]; for (i = 0; i < _c; i++) { [aCoder decodeValueOfObjCType: _t at: address]; address += _s; } return self; } - (id) initWithObjCType: (const char*)t count: (NSInteger)c at: (const void*)a { t = GSSkipTypeQualifierAndLayoutInfo(t); _t[0] = *t; _t[1] = '\0'; _s = objc_sizeof_type(_t); _c = c; _a = a; return self; } - (void) encodeWithCoder: (NSCoder*)aCoder { int i; [aCoder encodeInt: _c forKey: @"NS.count"]; [aCoder encodeInt: *_t forKey: @"NS.type"]; [aCoder encodeInt: _s forKey: @"NS.size"]; for (i = 0; i < _c; i++) { [aCoder encodeValueOfObjCType: _t at: _a]; _a += _s; } } - (NSUInteger) size { return _s; } - (const char*) type { return _t; } @end gnustep-base-1.29.0/Source/NSConcreteHashTable.m000066400000000000000000000631061435650067400214150ustar00rootroot00000000000000/** Implementation of NSHashTable for GNUStep Copyright (C) 2009 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: April 2009 Based on original o_hash code by Albin L. Jones This file is part of the GNUstep Base Library. 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 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 USA. $Date: 2008-06-08 11:38:33 +0100 (Sun, 08 Jun 2008) $ $Revision: 26606 $ */ #import "common.h" #import "Foundation/NSArray.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSException.h" #import "Foundation/NSHashTable.h" #import "NSConcretePointerFunctions.h" #import "NSCallBacks.h" #import "GSPrivate.h" static Class concreteClass = Nil; static unsigned instanceSize = 0; /* Here is the interface for the concrete class as used by the functions. */ typedef struct _GSIMapBucket GSIMapBucket_t; typedef struct _GSIMapNode GSIMapNode_t; typedef GSIMapBucket_t *GSIMapBucket; typedef GSIMapNode_t *GSIMapNode; @interface NSConcreteHashTable : NSHashTable { @public NSZone *zone; size_t nodeCount; /* Number of used nodes in hash. */ size_t bucketCount; /* Number of buckets in hash. */ GSIMapBucket buckets; /* Array of buckets. */ GSIMapNode freeNodes; /* List of unused nodes. */ GSIMapNode *nodeChunks; /* Chunks of allocated memory. */ size_t chunkCount; /* Number of chunks in array. */ size_t increment; /* Amount to grow by. */ unsigned long version; /* For fast enumeration. */ BOOL legacy; /* old style callbacks? */ union { PFInfo pf; NSHashTableCallBacks old; }cb; } @end #define GSI_MAP_HAS_VALUE 0 #define GSI_MAP_KTYPES GSUNION_PTR | GSUNION_OBJ #define GSI_MAP_TABLE_T NSConcreteHashTable #define GSI_MAP_TABLE_S instanceSize #define IS_WEAK(M) \ M->cb.pf.options & (NSPointerFunctionsZeroingWeakMemory | NSPointerFunctionsWeakMemory) #define GSI_MAP_HASH(M, X)\ (M->legacy ? M->cb.old.hash(M, X.ptr) \ : pointerFunctionsHash(&M->cb.pf, X.ptr)) #define GSI_MAP_EQUAL(M, X, Y)\ (M->legacy ? M->cb.old.isEqual(M, X.ptr, Y.ptr) \ : pointerFunctionsEqual(&M->cb.pf, X.ptr, Y.ptr)) #define GSI_MAP_RELEASE_KEY(M, X)\ (M->legacy ? M->cb.old.release(M, X.ptr) \ : IS_WEAK(M) ? nil : pointerFunctionsRelinquish(&M->cb.pf, &X.ptr)) #define GSI_MAP_RETAIN_KEY(M, X)\ (M->legacy ? M->cb.old.retain(M, X.ptr) \ : IS_WEAK(M) ? nil : pointerFunctionsAcquire(&M->cb.pf, &X.ptr, X.ptr)) #define GSI_MAP_ZEROED(M)\ (M->legacy ? 0 \ : (IS_WEAK(M) ? YES : NO)) #define GSI_MAP_WRITE_KEY(M, addr, x) \ if (M->legacy) \ *(addr) = x;\ else\ pointerFunctionsAssign(&M->cb.pf, (void**)addr, (x).obj); #define GSI_MAP_READ_KEY(M,addr) \ (M->legacy ? *(addr) :\ (__typeof__(*addr))pointerFunctionsRead(&M->cb.pf, (void**)addr)) #define GSI_MAP_ENUMERATOR NSHashEnumerator #include "GNUstepBase/GSIMap.h" /**** Function Implementations ****/ /** * Returns an array of all the objects in the table. * NB. The table must contain objects for its keys. */ NSArray * NSAllHashTableObjects(NSHashTable *table) { return [table allObjects]; } /** * Compares the two hash tables for equality. * If the tables are different sizes, returns NO. * Otherwise, compares the values in the two tables * and returns NO if they differ.
* The GNUstep implementation enumerates the values in table1 * and uses the hash and isEqual functions of table2 for comparison. */ BOOL NSCompareHashTables(NSHashTable *table1, NSHashTable *table2) { if (table1 == table2) { return YES; } if (table1 == nil) { NSWarnFLog(@"Nul first argument supplied"); return NO; } if (table2 == nil) { NSWarnFLog(@"Nul second argument supplied"); return NO; } if ([table1 count] != [table2 count]) { return NO; } if (object_getClass(table1) != concreteClass && object_getClass(table2) == concreteClass) { id t = table1; table1 = table2; table2 = t; } if (object_getClass(table1) == concreteClass) { BOOL result = YES; NSHashEnumerator enumerator; GSIMapNode n1; enumerator = NSEnumerateHashTable(table1); if (object_getClass(table2) == concreteClass) { GSIMapTable t2 = (GSIMapTable)table2; while ((n1 = GSIMapEnumeratorNextNode(&enumerator)) != 0) { if (GSIMapNodeForKey(t2, n1->key) == 0) { result = NO; break; } } } else { while ((n1 = GSIMapEnumeratorNextNode(&enumerator)) != 0) { void *v1 = n1->key.ptr; void *v2; v2 = NSHashGet(table2, v1); if (v2 == 0 && v2 != v1) { result = NO; break; } } } NSEndHashTableEnumeration(&enumerator); return result; } else { BOOL result = YES; NSHashEnumerator enumerator; void *v1; enumerator = NSEnumerateHashTable(table1); while ((v1 = NSNextHashEnumeratorItem(&enumerator)) != 0) { void *v2; v2 = NSHashGet(table2, v1); if (v2 == 0 && v2 != v1) { result = NO; break; } } NSEndHashTableEnumeration(&enumerator); return result; } } /** * Copy the supplied hash table.
* Returns a hash table, space for which is allocated in zone, which * has (newly retained) copies of table's contents. As always, * if zone is 0, then NSDefaultMallocZone() is used. */ NSHashTable * NSCopyHashTableWithZone(NSHashTable *table, NSZone *zone) { GSIMapTable o = (GSIMapTable)table; GSIMapTable t; GSIMapNode n; NSHashEnumerator enumerator; if (table == nil) { NSWarnFLog(@"Null table argument supplied"); return 0; } t = (GSIMapTable)[concreteClass allocWithZone: zone]; t->legacy = o->legacy; if (t->legacy == YES) { t->cb.old = o->cb.old; } else { t->cb.pf = o->cb.pf; } GSIMapInitWithZoneAndCapacity(t, zone, ((GSIMapTable)table)->nodeCount); enumerator = GSIMapEnumeratorForMap((GSIMapTable)table); while ((n = GSIMapEnumeratorNextNode(&enumerator)) != 0) { GSIMapAddKey(t, n->key); } GSIMapEndEnumerator((GSIMapEnumerator)&enumerator); return (NSHashTable*)t; } /** * Returns the number of items in the table. */ NSUInteger NSCountHashTable(NSHashTable *table) { return [table count]; } /** * Create a new hash table by calling NSCreateHashTableWithZone() using * NSDefaultMallocZone().
* Returns a (pointer to) an NSHashTable space for which is allocated * in the default zone. If capacity is small or 0, then the returned * table has a reasonable capacity. */ NSHashTable * NSCreateHashTable( NSHashTableCallBacks callBacks, NSUInteger capacity) { return NSCreateHashTableWithZone(callBacks, capacity, NSDefaultMallocZone()); } /** * Create a new hash table using the supplied callbacks structures. * If any functions in the callback structures are null the default * values are used ... as for non-owned pointers.
* Of course, if you send 0 for zone, then the hash table will be * created in NSDefaultMallocZone().
* The table will be created with the specified capacity ... ie ready * to hold at least that many items. */ NSHashTable * NSCreateHashTableWithZone( NSHashTableCallBacks k, NSUInteger capacity, NSZone *zone) { GSIMapTable table; if (concreteClass == Nil) { [NSConcreteHashTable class]; // Force +initialize NSCAssert(concreteClass != Nil, NSInternalInconsistencyException); } table = (GSIMapTable)[concreteClass allocWithZone: zone]; if (k.hash == 0) k.hash = NSNonOwnedPointerHashCallBacks.hash; if (k.isEqual == 0) k.isEqual = NSNonOwnedPointerHashCallBacks.isEqual; if (k.retain == 0) k.retain = NSNonOwnedPointerHashCallBacks.retain; if (k.release == 0) k.release = NSNonOwnedPointerHashCallBacks.release; if (k.describe == 0) k.describe = NSNonOwnedPointerHashCallBacks.describe; table->legacy = YES; table->cb.old = k; GSIMapInitWithZoneAndCapacity(table, zone, capacity); return (NSHashTable*)table; } /** * Function to be called when finished with the enumerator. * This permits memory used by the enumerator to be released! */ void NSEndHashTableEnumeration(NSHashEnumerator *enumerator) { if (enumerator == 0) { NSWarnFLog(@"Null enumerator argument supplied"); return; } if (enumerator->map != 0) { /* The 'map' field is non-null, so this NSHashEnumerator is actually * a GSIMapEnumerator. */ GSIMapEndEnumerator((GSIMapEnumerator)enumerator); } else if (enumerator->node != 0) { /* The 'map' field is null but the 'node' field is not, so the * NSHashEnumerator structure actually contains an NSEnumerator * in the 'node' field. */ [(id)enumerator->node release]; memset(enumerator, '\0', sizeof(NSHashEnumerator)); } } /** * Return an enumerator for stepping through a hash table using the * NSNextHashEnumeratorPair() function. */ NSHashEnumerator NSEnumerateHashTable(NSHashTable *table) { if (table == nil) { NSHashEnumerator v = {0, 0, 0}; NSWarnFLog(@"Null table argument supplied"); return v; } if (object_getClass(table) == concreteClass) { return GSIMapEnumeratorForMap((GSIMapTable)table); } else { NSHashEnumerator v = {0, 0, 0}; v.node = (void*)[[table objectEnumerator] retain]; return v; } } /** * Destroy the hash table and release its contents.
* Releases all the keys and values of table (using the key and * value callbacks specified at the time of table's creation), * and then proceeds to deallocate the space allocated for table itself. */ void NSFreeHashTable(NSHashTable *table) { [table release]; } /** * Returns the value for the specified item, or a null pointer if the * item is not found in the table. */ void * NSHashGet(NSHashTable *table, const void *element) { if (table == nil) { NSWarnFLog(@"Null table argument supplied"); return 0; } if (object_getClass(table) == concreteClass) { GSIMapNode n; n = GSIMapNodeForKey((GSIMapTable)table, (GSIMapKey)element); if (n == 0) { return 0; } else { return n->key.ptr; } } return [table member: (id)element]; } /** * Adds the element to table.
* If an equal element is already in table, replaces it with the new one.
* If element is null raises an NSInvalidArgumentException. */ void NSHashInsert(NSHashTable *table, const void *element) { if (table == 0) { [NSException raise: NSInvalidArgumentException format: @"Attempt to place value in null hash table"]; } if (element == 0) { [NSException raise: NSInvalidArgumentException format: @"Attempt to place null in hash table"]; } if (object_getClass(table) == concreteClass) { GSIMapTable t = (GSIMapTable)table; GSIMapNode n; n = GSIMapNodeForKey(t, (GSIMapKey)element); if (n == 0) { GSIMapAddKey(t, (GSIMapKey)element); ((NSConcreteHashTable*)table)->version++; } else if (element != n->key.ptr) { GSI_MAP_RELEASE_KEY(t, n->key); n->key = (GSIMapKey)element; GSI_MAP_RETAIN_KEY(t, n->key); ((NSConcreteHashTable*)table)->version++; } } else { [table addObject: (id)element]; } } /** * Adds the element to table and returns nul.
* If an equal element is already in table, returns the old element * instead of adding the new one.
* If element is nul, raises an NSInvalidArgumentException. */ void * NSHashInsertIfAbsent(NSHashTable *table, const void *element) { if (table == 0) { [NSException raise: NSInvalidArgumentException format: @"Attempt to place value in null hash table"]; } if (element == 0) { [NSException raise: NSInvalidArgumentException format: @"Attempt to place null in hash table"]; } if (object_getClass(table) == concreteClass) { GSIMapTable t = (GSIMapTable)table; GSIMapNode n; n = GSIMapNodeForKey(t, (GSIMapKey)element); if (n == 0) { GSIMapAddKey(t, (GSIMapKey)element); ((NSConcreteHashTable*)table)->version++; return 0; } else { return n->key.ptr; } } else { id old = [table member: (id)element]; if (old == nil) { [table addObject: (id)element]; return 0; } else { return (void*)old; } } } /** * Adds the element to table and returns nul.
* If an equal element is already present, raises NSInvalidArgumentException. *
If element is null raises an NSInvalidArgumentException. */ void NSHashInsertKnownAbsent(NSHashTable *table, const void *element) { if (table == 0) { [NSException raise: NSInvalidArgumentException format: @"Attempt to place value in null hash table"]; } if (element == 0) { [NSException raise: NSInvalidArgumentException format: @"Attempt to place null in hash table"]; } if (object_getClass(table) == concreteClass) { GSIMapTable t = (GSIMapTable)table; GSIMapNode n; n = GSIMapNodeForKey(t, (GSIMapKey)element); if (n == 0) { GSIMapAddKey(t, (GSIMapKey)element); ((NSConcreteHashTable*)table)->version++; } else { [NSException raise: NSInvalidArgumentException format: @"NSHashInsertKnownAbsent ... item not absent"]; } } else { id old = [table member: (id)element]; if (old == nil) { [table addObject: (id)element]; } else { [NSException raise: NSInvalidArgumentException format: @"NSHashInsertKnownAbsent ... item not absent"]; } } } /** * Remove the specified element from the table. */ void NSHashRemove(NSHashTable *table, const void *element) { if (table == 0) { NSWarnFLog(@"Nul table argument supplied"); return; } if (object_getClass(table) == concreteClass) { GSIMapTable map = (GSIMapTable)table; GSIMapBucket bucket; GSIMapNode node; bucket = GSIMapBucketForKey(map, (GSIMapKey)element); node = GSIMapNodeForKeyInBucket(map, bucket, (GSIMapKey)element); if (node != 0) { GSIMapRemoveNodeFromMap(map, bucket, node); GSIMapFreeNode(map, node); ((NSConcreteHashTable*)table)->version++; } } else { [table removeObject: (id)element]; } } /** * Step through the hash table ... return the next item or * return nul if we hit the of the table. */ void * NSNextHashEnumeratorItem(NSHashEnumerator *enumerator) { if (enumerator == 0) { NSWarnFLog(@"Nul enumerator argument supplied"); return 0; } if (enumerator->map != 0) // Got a GSIMapTable enumerator { GSIMapNode n; /* The 'map' field is non-null, so this NSHashEnumerator is actually * a GSIMapEnumerator. */ n = GSIMapEnumeratorNextNode((GSIMapEnumerator)enumerator); if (n == 0) { return 0; } else { NSConcreteHashTable *map = enumerator->map; return GSI_MAP_READ_KEY(map, &n->key).ptr; } } else if (enumerator->node != 0) // Got an enumerator object { /* The 'map' field is null but the 'node' field is not, so the * NSHashEnumerator structure actually contains an NSEnumerator * in the 'node' field, and the map table being enumerated in the * 'bucket' field. */ return (void*)[(id)enumerator->node nextObject]; } else { return 0; } } /** * Empty the hash table (releasing all elements), but preserve its capacity. */ void NSResetHashTable(NSHashTable *table) { if (table == 0) { NSWarnFLog(@"Nul table argument supplied"); return; } if (object_getClass(table) == concreteClass) { NSConcreteHashTable *t = (NSConcreteHashTable*)table; if (t->nodeCount > 0) { GSIMapCleanMap((GSIMapTable)table); t->version++; } } else { [table removeAllObjects]; } } /** * Returns a string describing the table contents.
* For each item, a string of the form "value;\n" * is appended. The appropriate describe function is used to generate * the strings for each item. */ GS_DECLARE NSString * NSStringFromHashTable(NSHashTable *table) { GSIMapTable t = (GSIMapTable)table; NSMutableString *string; NSHashEnumerator enumerator; const void *element; if (table == 0) { NSWarnFLog(@"Nul table argument supplied"); return nil; } /* This will be our string. */ string = [NSMutableString stringWithCapacity: 0]; /* Get an enumerator for TABLE. */ enumerator = NSEnumerateHashTable(table); /* Iterate over the elements of TABLE, appending the description of * each to the mutable string STRING. */ if (t->legacy) { while ((element = NSNextHashEnumeratorItem(&enumerator)) != nil) { [string appendFormat: @"%@;\n", (t->cb.old.describe)(table, element)]; } } else { while ((element = NSNextHashEnumeratorItem(&enumerator)) != nil) { [string appendFormat: @"%@;\n", (t->cb.pf.descriptionFunction)(element)]; } } NSEndHashTableEnumeration(&enumerator); return string; } /* These are to increase readabilty locally. */ typedef NSUInteger (*NSHT_hash_func_t)(NSHashTable *, const void *); typedef BOOL (*NSHT_isEqual_func_t)(NSHashTable *, const void *, const void *); typedef void (*NSHT_retain_func_t)(NSHashTable *, const void *); typedef void (*NSHT_release_func_t)(NSHashTable *, void *); typedef NSString *(*NSHT_describe_func_t)(NSHashTable *, const void *); /** For sets of pointer-sized or smaller quantities. */ const NSHashTableCallBacks NSIntegerHashCallBacks = { (NSHT_hash_func_t) _NS_int_hash, (NSHT_isEqual_func_t) _NS_int_is_equal, (NSHT_retain_func_t) _NS_int_retain, (NSHT_release_func_t) _NS_int_release, (NSHT_describe_func_t) _NS_int_describe }; /** For backward compatibility. */ const NSHashTableCallBacks NSIntHashCallBacks = { (NSHT_hash_func_t) _NS_int_hash, (NSHT_isEqual_func_t) _NS_int_is_equal, (NSHT_retain_func_t) _NS_int_retain, (NSHT_release_func_t) _NS_int_release, (NSHT_describe_func_t) _NS_int_describe }; /** For sets of pointers hashed by address. */ const NSHashTableCallBacks NSNonOwnedPointerHashCallBacks = { (NSHT_hash_func_t) _NS_non_owned_void_p_hash, (NSHT_isEqual_func_t) _NS_non_owned_void_p_is_equal, (NSHT_retain_func_t) _NS_non_owned_void_p_retain, (NSHT_release_func_t) _NS_non_owned_void_p_release, (NSHT_describe_func_t) _NS_non_owned_void_p_describe }; /** For sets of objects without retaining and releasing. */ const NSHashTableCallBacks NSNonRetainedObjectHashCallBacks = { (NSHT_hash_func_t) _NS_non_retained_id_hash, (NSHT_isEqual_func_t) _NS_non_retained_id_is_equal, (NSHT_retain_func_t) _NS_non_retained_id_retain, (NSHT_release_func_t) _NS_non_retained_id_release, (NSHT_describe_func_t) _NS_non_retained_id_describe }; /** For sets of objects; similar to [NSSet]. */ const NSHashTableCallBacks NSObjectHashCallBacks = { (NSHT_hash_func_t) _NS_id_hash, (NSHT_isEqual_func_t) _NS_id_is_equal, (NSHT_retain_func_t) _NS_id_retain, (NSHT_release_func_t) _NS_id_release, (NSHT_describe_func_t) _NS_id_describe }; /** For sets of pointers with transfer of ownership upon insertion. */ const NSHashTableCallBacks NSOwnedPointerHashCallBacks = { (NSHT_hash_func_t) _NS_owned_void_p_hash, (NSHT_isEqual_func_t) _NS_owned_void_p_is_equal, (NSHT_retain_func_t) _NS_owned_void_p_retain, (NSHT_release_func_t) _NS_owned_void_p_release, (NSHT_describe_func_t) _NS_owned_void_p_describe }; /** For sets of pointers to structs when the first field of the * struct is the size of an int. */ const NSHashTableCallBacks NSPointerToStructHashCallBacks = { (NSHT_hash_func_t) _NS_int_p_hash, (NSHT_isEqual_func_t) _NS_int_p_is_equal, (NSHT_retain_func_t) _NS_int_p_retain, (NSHT_release_func_t) _NS_int_p_release, (NSHT_describe_func_t) _NS_int_p_describe }; @interface NSConcreteHashTableEnumerator : NSEnumerator { NSConcreteHashTable *table; GSIMapEnumerator_t enumerator; } - (id) initWithHashTable: (NSConcreteHashTable*)t; @end @implementation NSConcreteHashTable - (NSUInteger) sizeOfContentExcluding: (NSHashTable*)exclude { /* Can't safely calculate for mutable object; just buffer size */ return nodeCount * sizeof(GSIMapNode); } + (void) initialize { if (concreteClass == Nil) { concreteClass = [NSConcreteHashTable class]; instanceSize = class_getInstanceSize(concreteClass); } } - (void) addObject: (id)anObject { GSIMapTable t = (GSIMapTable)self; GSIMapNode n; if (anObject == nil) { [NSException raise: NSInvalidArgumentException format: @"[%@-%@:] given nil argument", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; } n = GSIMapNodeForKey(t, (GSIMapKey)anObject); if (n == 0) { GSIMapAddKey(t, (GSIMapKey)anObject); version++; } else if (n->key.obj != anObject) { GSI_MAP_RELEASE_KEY(t, n->key); n->key = (GSIMapKey)anObject; GSI_MAP_RETAIN_KEY(t, n->key); version++; } } - (NSArray*) allObjects { NSHashEnumerator enumerator; NSUInteger index; NSArray *a; GS_BEGINITEMBUF(objects, nodeCount, id); enumerator = NSEnumerateHashTable(self); index = 0; while (index < nodeCount && (objects[index] = NSNextHashEnumeratorItem(&enumerator)) != nil) { index++; } NSEndHashTableEnumeration(&enumerator); a = [[[NSArray alloc] initWithObjects: objects count: index] autorelease]; GS_ENDITEMBUF(); return a; } - (id) anyObject { GSIMapNode node = GSIMapFirstNode(self); if (node == 0) { return nil; } return node->key.obj; } - (BOOL) containsObject: (id)anObject { if (anObject != nil) { GSIMapNode node = GSIMapNodeForKey(self, (GSIMapKey)anObject); if (node) { return YES; } } return NO; } - (id) copyWithZone: (NSZone*)aZone { return NSCopyHashTableWithZone(self, aZone); } - (NSUInteger) count { GSIMapRemoveWeak(self); return (NSUInteger)nodeCount; } - (NSUInteger) countByEnumeratingWithState: (NSFastEnumerationState*)state objects: (id*)stackbuf count: (NSUInteger)len { state->mutationsPtr = &version; return GSIMapCountByEnumeratingWithStateObjectsCount (self, state, stackbuf, len); } - (void) dealloc { GSIMapEmptyMap(self); [super dealloc]; } - (void) encodeWithCoder: (NSCoder*)aCoder { [self subclassResponsibility: _cmd]; } - (void) finalize { GSIMapEmptyMap(self); } - (NSUInteger) hash { return (NSUInteger)nodeCount; } - (id) init { return [self initWithPointerFunctions: nil capacity: 0]; } - (id) initWithCoder: (NSCoder*)aCoder { [self subclassResponsibility: _cmd]; return nil; } - (id) initWithPointerFunctions: (NSPointerFunctions*)functions capacity: (NSUInteger)initialCapacity { legacy = NO; if (![functions isKindOfClass: [NSConcretePointerFunctions class]]) { static NSConcretePointerFunctions *defaultFunctions = nil; if (defaultFunctions == nil) { defaultFunctions = [[NSConcretePointerFunctions alloc] initWithOptions: 0]; } functions = defaultFunctions; } memcpy(&self->cb.pf, &((NSConcretePointerFunctions*)functions)->_x, sizeof(self->cb.pf)); #if GC_WITH_GC if (self->cb.pf.usesWeakReadAndWriteBarriers) { zone = (NSZone*)nodeW; } else { zone = (NSZone*)nodeS; } #endif GSIMapInitWithZoneAndCapacity(self, zone, initialCapacity); return self; } - (NSEnumerator*) objectEnumerator { NSEnumerator *e; e = [[NSConcreteHashTableEnumerator alloc] initWithHashTable: self]; return [e autorelease]; } - (id) member: (id)aKey { if (aKey != nil) { GSIMapNode node = GSIMapNodeForKey(self, (GSIMapKey)aKey); if (node) { return node->key.obj; } } return nil; } - (NSPointerFunctions*) pointerFunctions { NSConcretePointerFunctions *p = [NSConcretePointerFunctions new]; p->_x = self->cb.pf; return [p autorelease]; } - (void) removeAllObjects { if (nodeCount > 0) { GSIMapCleanMap(self); version++; } } - (void) removeObject: (id)anObject { if (anObject == nil) { NSWarnMLog(@"attempt to remove nil object from hash table %@", self); return; } if (nodeCount > 0) { GSIMapTable map = (GSIMapTable)self; GSIMapBucket bucket; GSIMapNode node; bucket = GSIMapBucketForKey(map, (GSIMapKey)anObject); node = GSIMapNodeForKeyInBucket(map, bucket, (GSIMapKey)anObject); if (node != 0) { GSIMapRemoveNodeFromMap(map, bucket, node); GSIMapFreeNode(map, node); version++; } } } @end @implementation NSConcreteHashTableEnumerator - (id) initWithHashTable: (NSConcreteHashTable*)t { table = RETAIN(t); enumerator = GSIMapEnumeratorForMap(table); return self; } - (id) nextObject { GSIMapNode node = GSIMapEnumeratorNextNode(&enumerator); if (node == 0) { return nil; } return node->key.obj; } - (void) dealloc { GSIMapEndEnumerator(&enumerator); RELEASE(table); [super dealloc]; } @end gnustep-base-1.29.0/Source/NSConcreteMapTable.m000066400000000000000000001071031435650067400212430ustar00rootroot00000000000000/** Implementation of NSMapTable for GNUStep Copyright (C) 2009 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: Feb 2009 Based on original o_map code by Albin L. Jones This file is part of the GNUstep Base Library. 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 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 USA. $Date: 2008-06-08 11:38:33 +0100 (Sun, 08 Jun 2008) $ $Revision: 26606 $ */ #import "common.h" #import "Foundation/NSArray.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSException.h" #import "Foundation/NSMapTable.h" #import "NSConcretePointerFunctions.h" #import "NSCallBacks.h" static Class concreteClass = Nil; static unsigned instanceSize = 0; /* Here is the interface for the concrete class as used by the functions. */ typedef struct _GSIMapBucket GSIMapBucket_t; typedef struct _GSIMapNode GSIMapNode_t; typedef GSIMapBucket_t *GSIMapBucket; typedef GSIMapNode_t *GSIMapNode; @interface NSConcreteMapTable : NSMapTable { @public NSZone *zone; size_t nodeCount; /* Number of used nodes in map. */ size_t bucketCount; /* Number of buckets in map. */ GSIMapBucket buckets; /* Array of buckets. */ GSIMapNode freeNodes; /* List of unused nodes. */ GSIMapNode *nodeChunks; /* Chunks of allocated memory. */ size_t chunkCount; /* Number of chunks in array. */ size_t increment; /* Amount to grow by. */ unsigned long version; /* For fast enumeration. */ BOOL legacy; /* old style callbacks? */ union { struct { PFInfo k; PFInfo v; } pf; struct { NSMapTableKeyCallBacks k; NSMapTableValueCallBacks v; } old; }cb; } @end #define GSI_MAP_TABLE_T NSConcreteMapTable #define GSI_MAP_TABLE_S instanceSize #define GSI_MAP_KTYPES GSUNION_PTR | GSUNION_OBJ #define GSI_MAP_VTYPES GSUNION_PTR | GSUNION_OBJ #define IS_WEAK_KEY(M) \ M->cb.pf.k.options & (NSPointerFunctionsZeroingWeakMemory | NSPointerFunctionsWeakMemory) #define IS_WEAK_VALUE(M) \ M->cb.pf.v.options & (NSPointerFunctionsZeroingWeakMemory | NSPointerFunctionsWeakMemory) #define GSI_MAP_HASH(M, X)\ (M->legacy ? M->cb.old.k.hash(M, X.ptr) \ : pointerFunctionsHash(&M->cb.pf.k, X.ptr)) #define GSI_MAP_EQUAL(M, X, Y)\ (M->legacy ? M->cb.old.k.isEqual(M, X.ptr, Y.ptr) \ : pointerFunctionsEqual(&M->cb.pf.k, X.ptr, Y.ptr)) #define GSI_MAP_RELEASE_KEY(M, X)\ (M->legacy ? M->cb.old.k.release(M, X.ptr) \ : IS_WEAK_KEY(M) ? nil : pointerFunctionsRelinquish(&M->cb.pf.k, &X.ptr)) #define GSI_MAP_RETAIN_KEY(M, X)\ (M->legacy ? M->cb.old.k.retain(M, X.ptr) \ : IS_WEAK_KEY(M) ? nil : pointerFunctionsAcquire(&M->cb.pf.k, &X.ptr, X.ptr)) #define GSI_MAP_RELEASE_VAL(M, X)\ (M->legacy ? M->cb.old.v.release(M, X.ptr) \ : IS_WEAK_VALUE(M) ? nil : pointerFunctionsRelinquish(&M->cb.pf.v, &X.ptr)) #define GSI_MAP_RETAIN_VAL(M, X)\ (M->legacy ? M->cb.old.v.retain(M, X.ptr) \ : IS_WEAK_VALUE(M) ? nil : pointerFunctionsAcquire(&M->cb.pf.v, &X.ptr, X.ptr)) /* 2013-05-25 Here are the macros originally added for GC/ARC ... * but they caused map table entries to be doubly retained :-( * The question is, are the new versions I hacked in below to * fix this correct? #define GSI_MAP_WRITE_KEY(M, addr, x) \ if (M->legacy) \ *(addr) = x;\ else\ pointerFunctionsAssign(&M->cb.pf.k, (void**)addr, (x).obj); #define GSI_MAP_WRITE_VAL(M, addr, x) \ if (M->legacy) \ *(addr) = x;\ else\ pointerFunctionsAssign(&M->cb.pf.v, (void**)addr, (x).obj); */ #define GSI_MAP_WRITE_KEY(M, addr, x) \ if (M->legacy) \ *(addr) = x;\ else\ (IS_WEAK_KEY(M) ? pointerFunctionsAssign(&M->cb.pf.k, (void**)addr, (x).obj) : (*(id*)(addr) = (x).obj)); #define GSI_MAP_WRITE_VAL(M, addr, x) \ if (M->legacy) \ *(addr) = x;\ else\ (IS_WEAK_VALUE(M) ? pointerFunctionsAssign(&M->cb.pf.v, (void**)addr, (x).obj) : (*(id*)(addr) = (x).obj)); #define GSI_MAP_READ_KEY(M,addr) \ (M->legacy ? *(addr)\ : (__typeof__(*addr))pointerFunctionsRead(&M->cb.pf.k, (void**)addr)) #define GSI_MAP_READ_VALUE(M,addr) \ (M->legacy ? *(addr)\ : (__typeof__(*addr))pointerFunctionsRead(&M->cb.pf.v, (void**)addr)) #define GSI_MAP_ZEROED(M)\ (M->legacy ? 0\ : (IS_WEAK_KEY(M) || IS_WEAK_VALUE(M)) ? YES : NO) #define GSI_MAP_ENUMERATOR NSMapEnumerator #include "GNUstepBase/GSIMap.h" /**** Function Implementations ****/ /** * Returns an array of all the keys in the table. * NB. The table must contain objects for its keys. */ NSArray * NSAllMapTableKeys(NSMapTable *table) { NSMutableArray *keyArray; NSMapEnumerator enumerator; id key = nil; void *dummy; if (table == nil) { NSWarnFLog(@"Null table argument supplied"); return nil; } /* Create our mutable key array. */ keyArray = [NSMutableArray arrayWithCapacity: NSCountMapTable(table)]; /* Get an enumerator for TABLE. */ enumerator = NSEnumerateMapTable(table); /* Step through TABLE... */ while (NSNextMapEnumeratorPair(&enumerator, (void **)(&key), &dummy)) { [keyArray addObject: key]; } NSEndMapTableEnumeration(&enumerator); return keyArray; } /** * Returns an array of all the values in the table. * NB. The table must contain objects for its values. */ NSArray * NSAllMapTableValues(NSMapTable *table) { NSMapEnumerator enumerator; NSMutableArray *valueArray; id value = nil; void *dummy; if (table == nil) { NSWarnFLog(@"Null table argument supplied"); return nil; } /* Create our mutable value array. */ valueArray = [NSMutableArray arrayWithCapacity: NSCountMapTable(table)]; /* Get an enumerator for TABLE. */ enumerator = NSEnumerateMapTable(table); /* Step through TABLE... */ while (NSNextMapEnumeratorPair(&enumerator, &dummy, (void **)(&value))) { [valueArray addObject: value]; } NSEndMapTableEnumeration(&enumerator); return valueArray; } static BOOL equalPointers(const void *item1, const void *item2, NSUInteger (*size)(const void *item)) { return (item1 == item2) ? YES : NO; } /** * Compares the two map tables for equality. * If the tables are different sizes, returns NO. * Otherwise, compares the keys (not the values) * in the two map tables and returns NO if they differ.
* The GNUstep implementation enumerates the keys in table1 * and uses the hash and isEqual functions of table2 for comparison. */ BOOL NSCompareMapTables(NSMapTable *table1, NSMapTable *table2) { if (table1 == table2) { return YES; } if (table1 == nil) { NSWarnFLog(@"Null first argument supplied"); return NO; } if (table2 == nil) { NSWarnFLog(@"Null second argument supplied"); return NO; } if ([table1 count] != [table2 count]) { return NO; } if (object_getClass(table1) != concreteClass && object_getClass(table2) == concreteClass) { id t = table1; table1 = table2; table2 = t; } if (object_getClass(table1) == concreteClass) { NSConcreteMapTable *c1 = (NSConcreteMapTable*)table1; GSIMapTable t1 = (GSIMapTable)table1; BOOL result = YES; NSMapEnumerator enumerator; GSIMapNode n1; enumerator = GSIMapEnumeratorForMap(t1); if (object_getClass(table2) == concreteClass) { GSIMapTable t2 = (GSIMapTable)table2; while ((n1 = GSIMapEnumeratorNextNode(&enumerator)) != 0) { GSIMapNode n2; n2 = GSIMapNodeForKey(t2, n1->key); if (n2 == 0) { result = NO; } else { void *v1 = n1->value.ptr; void *v2 = n2->value.ptr; result = (c1->legacy ? c1->cb.old.k.isEqual(c1, v1, v2) : pointerFunctionsEqual(&c1->cb.pf.v, v2, v2)); } if (result == NO) { break; } } } else { while ((n1 = GSIMapEnumeratorNextNode(&enumerator)) != 0) { void *k1 = n1->key.ptr; void *v1 = n1->value.ptr; void *v2 = NSMapGet(table2, k1); result = (c1->legacy ? c1->cb.old.k.isEqual(c1, v1, v2) : pointerFunctionsEqual(&c1->cb.pf.v, v1, v2)); if (result == NO) { break; } } } GSIMapEndEnumerator((GSIMapEnumerator)&enumerator); return result; } else { BOOL result = YES; NSMapEnumerator enumerator; void *k1; void *v1; NSPointerFunctions *pf; BOOL (*isEqualFunction)(const void *item1, const void *item2, NSUInteger (*size)(const void *item)); NSUInteger (*sizeFunction)(const void *item); /* Get functions needed for comparison. */ pf = [table1 valuePointerFunctions]; isEqualFunction = [pf isEqualFunction]; sizeFunction = [pf sizeFunction]; if (isEqualFunction == 0) isEqualFunction = equalPointers; enumerator = NSEnumerateMapTable(table1); while (NSNextMapEnumeratorPair(&enumerator, &k1, &v1) == YES) { void *v2 = NSMapGet(table2, k1); if ((*isEqualFunction)(v1, v2, sizeFunction) == NO) { result = NO; break; } } NSEndMapTableEnumeration(&enumerator); return result; } } /** * Copy the supplied map table.
* Returns a map table, space for which is allocated in zone, which * has (newly retained) copies of table's keys and values. As always, * if zone is 0, then NSDefaultMallocZone() is used. */ NSMapTable * NSCopyMapTableWithZone(NSMapTable *table, NSZone *zone) { GSIMapTable o = (GSIMapTable)table; GSIMapTable t; GSIMapNode n; if (table == nil) { NSWarnFLog(@"Null table argument supplied"); return 0; } t = (GSIMapTable)[concreteClass allocWithZone: zone]; t->legacy = o->legacy; if (t->legacy == YES) { t->cb.old.k = o->cb.old.k; t->cb.old.v = o->cb.old.v; } else { t->cb.pf.k = o->cb.pf.k; t->cb.pf.v = o->cb.pf.v; } GSIMapInitWithZoneAndCapacity(t, zone, ((GSIMapTable)table)->nodeCount); if (object_getClass(table) == concreteClass) { NSMapEnumerator enumerator; enumerator = GSIMapEnumeratorForMap((GSIMapTable)table); while ((n = GSIMapEnumeratorNextNode(&enumerator)) != 0) { GSIMapAddPair(t, n->key, n->value); } GSIMapEndEnumerator((GSIMapEnumerator)&enumerator); } else { NSEnumerator *enumerator; id k; enumerator = [table keyEnumerator]; while ((k = [enumerator nextObject]) != nil) { GSIMapAddPair(t, (GSIMapKey)k, (GSIMapVal)[table objectForKey: k]); } } return (NSMapTable*)t; } /** * Returns the number of key/value pairs in the table. */ NSUInteger NSCountMapTable(NSMapTable *table) { if (table == nil) { NSWarnFLog(@"Null table argument supplied"); return 0; } if (object_getClass(table) == concreteClass) { return ((GSIMapTable)table)->nodeCount; } return [table count]; } /** * Create a new map table by calling NSCreateMapTableWithZone() using * NSDefaultMallocZone().
* Returns a (pointer to) an NSMapTable space for which is allocated * in the default zone. If capacity is small or 0, then the returned * table has a reasonable capacity. */ NSMapTable * NSCreateMapTable( NSMapTableKeyCallBacks keyCallBacks, NSMapTableValueCallBacks valueCallBacks, NSUInteger capacity) { return NSCreateMapTableWithZone(keyCallBacks, valueCallBacks, capacity, NSDefaultMallocZone()); } /** * Create a new map table using the supplied callbacks structures. * If any functions in the callback structures are null the default * values are used ... as for non-owned pointers.
* Of course, if you send 0 for zone, then the map table will be * created in NSDefaultMallocZone().
* The table will be created with the specified capacity ... ie ready * to hold at least that many items. */ NSMapTable * NSCreateMapTableWithZone( NSMapTableKeyCallBacks k, NSMapTableValueCallBacks v, NSUInteger capacity, NSZone *zone) { GSIMapTable table; if (concreteClass == Nil) { [NSConcreteMapTable class]; // Force +initialize NSCAssert(concreteClass != Nil, NSInternalInconsistencyException); } table = (GSIMapTable)[concreteClass allocWithZone: zone]; if (k.hash == 0) k.hash = NSNonOwnedPointerMapKeyCallBacks.hash; if (k.isEqual == 0) k.isEqual = NSNonOwnedPointerMapKeyCallBacks.isEqual; if (k.retain == 0) k.retain = NSNonOwnedPointerMapKeyCallBacks.retain; if (k.release == 0) k.release = NSNonOwnedPointerMapKeyCallBacks.release; if (k.describe == 0) k.describe = NSNonOwnedPointerMapKeyCallBacks.describe; if (v.retain == 0) v.retain = NSNonOwnedPointerMapValueCallBacks.retain; if (v.release == 0) v.release = NSNonOwnedPointerMapValueCallBacks.release; if (v.describe == 0) v.describe = NSNonOwnedPointerMapValueCallBacks.describe; table->legacy = YES; table->cb.old.k = k; table->cb.old.v = v; GSIMapInitWithZoneAndCapacity(table, zone, capacity); return (NSMapTable*)table; } /** * Function to be called when finished with the enumerator. * This permits memory used by the enumerator to be released! */ void NSEndMapTableEnumeration(NSMapEnumerator *enumerator) { if (enumerator == 0) { NSWarnFLog(@"Null enumerator argument supplied"); return; } if (enumerator->map != 0) { /* The 'map' field is non-null, so this NSMapEnumerator is actually * a GSIMapEnumerator. */ GSIMapEndEnumerator((GSIMapEnumerator)enumerator); } else if (enumerator->node != 0) { /* The 'map' field is null but the 'node' field is not, so the * NSMapEnumerator structure actually contains an NSEnumerator * in the 'node' field, and the map table being enumerated in the * 'bucket' field. */ [(id)enumerator->node release]; memset(enumerator, '\0', sizeof(NSMapEnumerator)); } } /** * Return an enumerator for stepping through a map table using the * NSNextMapEnumeratorPair() function. */ NSMapEnumerator NSEnumerateMapTable(NSMapTable *table) { if (table == nil) { NSMapEnumerator v = {0, 0, 0}; NSWarnFLog(@"Null table argument supplied"); return v; } if (object_getClass(table) == concreteClass) { return GSIMapEnumeratorForMap((GSIMapTable)table); } else { NSMapEnumerator v = {0, 0, 0}; NSEnumerator *e = [[table keyEnumerator] retain]; v.node = (void*)e; GS_CONSUMED(e) v.bucket = (unsigned long)(uintptr_t)table; return v; } } /** * Destroy the map table and release its contents.
* Releases all the keys and values of table (using the key and * value callbacks specified at the time of table's creation), * and then proceeds to deallocate the space allocated for table itself. */ void NSFreeMapTable(NSMapTable *table) { if (table == nil) { NSWarnFLog(@"Null table argument supplied"); } else { [table release]; } } /** * Returns the value for the specified key, or a null pointer if the * key is not found in the table. */ void * NSMapGet(NSMapTable *table, const void *key) { if (table == nil) { NSWarnFLog(@"Null table argument supplied"); return 0; } if (object_getClass(table) == concreteClass) { GSIMapNode n; n = GSIMapNodeForKey((GSIMapTable)table, (GSIMapKey)key); if (n == 0) { return 0; } else { return n->value.ptr; } } else { return [table objectForKey: (id)key]; } } /** * Adds the key and value to table.
* If an equal key is already in table, replaces its mapped value * with the new one, without changing the key itself.
* If key is equal to the notAKeyMarker field of the table's * NSMapTableKeyCallBacks, raises an NSInvalidArgumentException. */ void NSMapInsert(NSMapTable *table, const void *key, const void *value) { if (table == nil) { [NSException raise: NSInvalidArgumentException format: @"Attempt to place key-value in null table"]; } if (object_getClass(table) == concreteClass) { GSIMapTable t = (GSIMapTable)table; GSIMapNode n; if (t->legacy == YES) { if (key == t->cb.old.k.notAKeyMarker) { [NSException raise: NSInvalidArgumentException format: @"Attempt to place notAKeyMarker in map"]; } } else if (key == 0) { [NSException raise: NSInvalidArgumentException format: @"Attempt to place nil key in map"]; } n = GSIMapNodeForKey(t, (GSIMapKey)key); if (n == 0) { GSIMapAddPair(t, (GSIMapKey)key, (GSIMapVal)value); t->version++; } else if (n->value.ptr != value) { GSIMapVal tmp = n->value; n->value = (GSIMapVal)value; GSI_MAP_RETAIN_VAL(t, n->value); GSI_MAP_RELEASE_VAL(t, tmp); t->version++; } } else { [table setObject: (id)value forKey: (id)key]; } } /** * Adds the key and value to table and returns nul.
* If an equal key is already in table, returns the old key * instead of adding the new key-value pair.
* If key is equal to the notAKeyMarker field of the table's * NSMapTableKeyCallBacks, raises an NSInvalidArgumentException. */ void * NSMapInsertIfAbsent(NSMapTable *table, const void *key, const void *value) { if (table == nil) { [NSException raise: NSInvalidArgumentException format: @"Attempt to place key-value in null table"]; } if (object_getClass(table) == concreteClass) { GSIMapTable t = (GSIMapTable)table; GSIMapNode n; if (t->legacy == YES) { if (key == t->cb.old.k.notAKeyMarker) { [NSException raise: NSInvalidArgumentException format: @"Attempt to place notAKeyMarker in map table"]; } } else if (key == 0) { [NSException raise: NSInvalidArgumentException format: @"Attempt to place nil key in map"]; } n = GSIMapNodeForKey(t, (GSIMapKey)key); if (n == 0) { GSIMapAddPair(t, (GSIMapKey)key, (GSIMapVal)value); t->version++; return 0; } else { return n->key.ptr; } } else { void *v = (void*)[table objectForKey: (id)key]; if (v == 0) { [table setObject: (id)value forKey: (id)v]; return 0; } return v; } } /** * Adds the key and value to table and returns nul.
* If an equal key is already in table, raises an NSInvalidArgumentException. *
If key is equal to the notAKeyMarker field of the table's * NSMapTableKeyCallBacks, raises an NSInvalidArgumentException. */ void NSMapInsertKnownAbsent(NSMapTable *table, const void *key, const void *value) { if (table == nil) { [NSException raise: NSInvalidArgumentException format: @"Attempt to place key-value in null table"]; } if (object_getClass(table) == concreteClass) { GSIMapTable t = (GSIMapTable)table; GSIMapNode n; if (t->legacy == YES) { if (key == t->cb.old.k.notAKeyMarker) { [NSException raise: NSInvalidArgumentException format: @"Attempt to place notAKeyMarker in map table"]; } } else if (key == 0) { [NSException raise: NSInvalidArgumentException format: @"Attempt to place nil key in map"]; } n = GSIMapNodeForKey(t, (GSIMapKey)key); if (n == 0) { GSIMapAddPair(t, (GSIMapKey)key, (GSIMapVal)value); t->version++; } else { [NSException raise: NSInvalidArgumentException format: @"NSMapInsertKnownAbsent ... key not absent"]; } } else { void *v = (void*)[table objectForKey: (id)key]; if (v == 0) { [table setObject: (id)value forKey: (id)v]; } else { [NSException raise: NSInvalidArgumentException format: @"NSMapInsertKnownAbsent ... key not absent"]; } } } /** * Returns a flag to say whether the table contains the specified key. * Returns the original key and the value it maps to.
* The GNUstep implementation checks originalKey and value to see if * they are null pointers, and only updates them if non-null. */ BOOL NSMapMember(NSMapTable *table, const void *key, void **originalKey, void **value) { if (table == nil) { NSWarnFLog(@"Null table argument supplied"); return NO; } if (object_getClass(table) == concreteClass) { GSIMapNode n; n = GSIMapNodeForKey((GSIMapTable)table, (GSIMapKey)key); if (n == 0) { return NO; } else { if (originalKey != 0) { *originalKey = n->key.ptr; } if (value != 0) { *value = n->value.ptr; } return YES; } } else { return [table objectForKey: (id)key] ? YES : NO; } } /** * Remove the specified key from the table (if present).
* Causes the key and its associated value to be released. */ void NSMapRemove(NSMapTable *table, const void *key) { if (table == nil) { NSWarnFLog(@"Null table argument supplied"); return; } if (object_getClass(table) == concreteClass) { if (((GSIMapTable)table)->nodeCount > 0) { GSIMapRemoveKey((GSIMapTable)table, (GSIMapKey)key); ((GSIMapTable)table)->version++; } } else { [table removeObjectForKey: (id)key]; } } /** * Step through the map table ... return the next key-value pair and * return YES, or hit the end of the table and return NO.
* The enumerator parameter is a value supplied by NSEnumerateMapTable() * and must be destroyed using NSEndMapTableEnumeration().
* The GNUstep implementation permits either key or value to be a * null pointer, and refrains from attempting to return the appropriate * result in that case. */ BOOL NSNextMapEnumeratorPair(NSMapEnumerator *enumerator, void **key, void **value) { if (enumerator == 0) { NSWarnFLog(@"Null enumerator argument supplied"); return NO; } if (enumerator->map != 0) { GSIMapNode n; /* The 'map' field is non-null, so this NSMapEnumerator is actually * a GSIMapEnumerator and we can use the GSIMap... functions to work * with it. */ n = GSIMapEnumeratorNextNode((GSIMapEnumerator)enumerator); if (n == 0) { return NO; } else { NSConcreteMapTable *map = enumerator->map; if (key != 0) { *key = GSI_MAP_READ_KEY(map, &n->key).ptr; } else { NSWarnFLog(@"Null key return address"); } if (value != 0) { *value = GSI_MAP_READ_VALUE(map, &n->value).ptr; } else { NSWarnFLog(@"Null value return address"); } return YES; } } else if (enumerator->node != 0) { id k; /* The 'map' field is null but the 'node' field is not, so the * NSMapEnumerator structure actually contains an NSEnumerator * in the 'node' field, and the map table being enumerated in the * 'bucket' field. */ k = [(NSEnumerator*)enumerator->node nextObject]; if (k == nil) { return NO; } if (key != 0) { *key = k; } else { NSWarnFLog(@"Null key return address"); } if (value != 0) { *value = [(NSMapTable*)enumerator->bucket objectForKey: k]; } else { NSWarnFLog(@"Null value return address"); } return YES; } else { return NO; } } /** * Empty the map table (releasing every key and value), * but preserve its capacity. */ void NSResetMapTable(NSMapTable *table) { if (table == nil) { NSWarnFLog(@"Null table argument supplied"); return; } if (object_getClass(table) == concreteClass) { if (((GSIMapTable)table)->nodeCount > 0) { GSIMapCleanMap((GSIMapTable)table); ((GSIMapTable)table)->version++; } } else { [table removeAllObjects]; } } /** * Returns a string describing the table contents.
* For each key-value pair, a string of the form "key = value;\n" * is appended. The appropriate describe functions are used to generate * the strings for each key and value. */ GS_DECLARE NSString * NSStringFromMapTable(NSMapTable *table) { if (table == nil) { NSWarnFLog(@"Null table argument supplied"); return nil; } if (object_getClass(table) == concreteClass) { GSIMapTable t = (GSIMapTable)table; NSMutableString *string; NSMapEnumerator enumerator; void *key; void *value; string = [NSMutableString stringWithCapacity: 0]; enumerator = NSEnumerateMapTable(table); /* * Now, just step through the elements of the table, and add their * descriptions to the string. */ if (t->legacy) { while (NSNextMapEnumeratorPair(&enumerator, &key, &value) == YES) { [string appendFormat: @"%@ = %@;\n", (t->cb.old.k.describe)(table, key), (t->cb.old.v.describe)(table, value)]; } } else { while (NSNextMapEnumeratorPair(&enumerator, &key, &value) == YES) { [string appendFormat: @"%@ = %@;\n", (t->cb.pf.k.descriptionFunction)(key), (t->cb.pf.v.descriptionFunction)(value)]; } } NSEndMapTableEnumeration(&enumerator); return string; } else { return [table description]; } } /* These are to increase readabilty locally. */ typedef NSUInteger (*NSMT_hash_func_t)(NSMapTable *, const void *); typedef BOOL (*NSMT_is_equal_func_t)(NSMapTable *, const void *, const void *); typedef void (*NSMT_retain_func_t)(NSMapTable *, const void *); typedef void (*NSMT_release_func_t)(NSMapTable *, void *); typedef NSString *(*NSMT_describe_func_t)(NSMapTable *, const void *); /** For keys that are pointer-sized or smaller quantities. */ const NSMapTableKeyCallBacks NSIntegerMapKeyCallBacks = { (NSMT_hash_func_t) _NS_int_hash, (NSMT_is_equal_func_t) _NS_int_is_equal, (NSMT_retain_func_t) _NS_int_retain, (NSMT_release_func_t) _NS_int_release, (NSMT_describe_func_t) _NS_int_describe, NSNotAnIntMapKey }; /** For backward compatibility. */ const NSMapTableKeyCallBacks NSIntMapKeyCallBacks = { (NSMT_hash_func_t) _NS_int_hash, (NSMT_is_equal_func_t) _NS_int_is_equal, (NSMT_retain_func_t) _NS_int_retain, (NSMT_release_func_t) _NS_int_release, (NSMT_describe_func_t) _NS_int_describe, NSNotAnIntMapKey }; /** For keys that are pointers not freed. */ const NSMapTableKeyCallBacks NSNonOwnedPointerMapKeyCallBacks = { (NSMT_hash_func_t) _NS_non_owned_void_p_hash, (NSMT_is_equal_func_t) _NS_non_owned_void_p_is_equal, (NSMT_retain_func_t) _NS_non_owned_void_p_retain, (NSMT_release_func_t) _NS_non_owned_void_p_release, (NSMT_describe_func_t) _NS_non_owned_void_p_describe, NSNotAPointerMapKey }; /** For keys that are pointers not freed, or 0. */ const NSMapTableKeyCallBacks NSNonOwnedPointerOrNullMapKeyCallBacks = { (NSMT_hash_func_t) _NS_non_owned_void_p_hash, (NSMT_is_equal_func_t) _NS_non_owned_void_p_is_equal, (NSMT_retain_func_t) _NS_non_owned_void_p_retain, (NSMT_release_func_t) _NS_non_owned_void_p_release, (NSMT_describe_func_t) _NS_non_owned_void_p_describe, NSNotAPointerMapKey }; /** For sets of objects without retaining and releasing. */ const NSMapTableKeyCallBacks NSNonRetainedObjectMapKeyCallBacks = { (NSMT_hash_func_t) _NS_non_retained_id_hash, (NSMT_is_equal_func_t) _NS_non_retained_id_is_equal, (NSMT_retain_func_t) _NS_non_retained_id_retain, (NSMT_release_func_t) _NS_non_retained_id_release, (NSMT_describe_func_t) _NS_non_retained_id_describe, NSNotAPointerMapKey }; /** For keys that are objects. */ const NSMapTableKeyCallBacks NSObjectMapKeyCallBacks = { (NSMT_hash_func_t) _NS_id_hash, (NSMT_is_equal_func_t) _NS_id_is_equal, (NSMT_retain_func_t) _NS_id_retain, (NSMT_release_func_t) _NS_id_release, (NSMT_describe_func_t) _NS_id_describe, NSNotAPointerMapKey }; /** For keys that are pointers with transfer of ownership upon insertion. */ const NSMapTableKeyCallBacks NSOwnedPointerMapKeyCallBacks = { (NSMT_hash_func_t) _NS_owned_void_p_hash, (NSMT_is_equal_func_t) _NS_owned_void_p_is_equal, (NSMT_retain_func_t) _NS_owned_void_p_retain, (NSMT_release_func_t) _NS_owned_void_p_release, (NSMT_describe_func_t) _NS_owned_void_p_describe, NSNotAPointerMapKey }; /** For values that are pointer-sized integer quantities. */ const NSMapTableValueCallBacks NSIntegerMapValueCallBacks = { (NSMT_retain_func_t) _NS_int_retain, (NSMT_release_func_t) _NS_int_release, (NSMT_describe_func_t) _NS_int_describe }; /** For backward compatibilty. */ const NSMapTableValueCallBacks NSIntMapValueCallBacks = { (NSMT_retain_func_t) _NS_int_retain, (NSMT_release_func_t) _NS_int_release, (NSMT_describe_func_t) _NS_int_describe }; /** For values that are pointers not freed. */ const NSMapTableValueCallBacks NSNonOwnedPointerMapValueCallBacks = { (NSMT_retain_func_t) _NS_non_owned_void_p_retain, (NSMT_release_func_t) _NS_non_owned_void_p_release, (NSMT_describe_func_t) _NS_non_owned_void_p_describe }; /** For sets of objects without retaining and releasing. */ const NSMapTableValueCallBacks NSNonRetainedObjectMapValueCallBacks = { (NSMT_retain_func_t) _NS_non_retained_id_retain, (NSMT_release_func_t) _NS_non_retained_id_release, (NSMT_describe_func_t) _NS_non_retained_id_describe }; /** For values that are objects. */ const NSMapTableValueCallBacks NSObjectMapValueCallBacks = { (NSMT_retain_func_t) _NS_id_retain, (NSMT_release_func_t) _NS_id_release, (NSMT_describe_func_t) _NS_id_describe }; /** For values that are pointers with transfer of ownership upon insertion. */ const NSMapTableValueCallBacks NSOwnedPointerMapValueCallBacks = { (NSMT_retain_func_t) _NS_owned_void_p_retain, (NSMT_release_func_t) _NS_owned_void_p_release, (NSMT_describe_func_t) _NS_owned_void_p_describe }; @interface NSConcreteMapTableKeyEnumerator : NSEnumerator { NSConcreteMapTable *table; GSIMapEnumerator_t enumerator; } - (id) initWithMapTable: (NSConcreteMapTable*)m; @end @interface NSConcreteMapTableObjectEnumerator : NSConcreteMapTableKeyEnumerator @end @implementation NSConcreteMapTable - (NSUInteger) sizeOfContentExcluding: (NSHashTable*)exclude { /* Can't safely calculate for mutable object; just buffer size */ return nodeCount * sizeof(GSIMapNode); } + (void) initialize { if (concreteClass == Nil) { concreteClass = [NSConcreteMapTable class]; instanceSize = class_getInstanceSize(concreteClass); } } - (id) copyWithZone: (NSZone*)aZone { return NSCopyMapTableWithZone(self, aZone); } - (NSUInteger) count { GSIMapRemoveWeak(self); return (NSUInteger)nodeCount; } - (NSUInteger) countByEnumeratingWithState: (NSFastEnumerationState*)state objects: (id*)stackbuf count: (NSUInteger)len { state->mutationsPtr = &version; return GSIMapCountByEnumeratingWithStateObjectsCount (self, state, stackbuf, len); } - (void) dealloc { GSIMapEmptyMap(self); [super dealloc]; } - (void) encodeWithCoder: (NSCoder*)aCoder { [self subclassResponsibility: _cmd]; } - (void) finalize { GSIMapEmptyMap(self); } - (NSUInteger) hash { return (NSUInteger)nodeCount; } - (id) init { return [self initWithKeyPointerFunctions: nil valuePointerFunctions: nil capacity: 0]; } - (id) initWithCoder: (NSCoder*)aCoder { [self subclassResponsibility: _cmd]; return nil; } - (id) initWithKeyPointerFunctions: (NSPointerFunctions*)keyFunctions valuePointerFunctions: (NSPointerFunctions*)valueFunctions capacity: (NSUInteger)initialCapacity { static NSConcretePointerFunctions *defaultFunctions = nil; if (defaultFunctions == nil) { defaultFunctions = [[NSConcretePointerFunctions alloc] initWithOptions: 0]; } legacy = NO; if (![keyFunctions isKindOfClass: [NSConcretePointerFunctions class]]) { keyFunctions = defaultFunctions; } memcpy(&self->cb.pf.k, &((NSConcretePointerFunctions*)keyFunctions)->_x, sizeof(self->cb.pf.k)); if (![valueFunctions isKindOfClass: [NSConcretePointerFunctions class]]) { valueFunctions = defaultFunctions; } memcpy(&self->cb.pf.v, &((NSConcretePointerFunctions*)valueFunctions)->_x, sizeof(self->cb.pf.v)); #if GC_WITH_GC if (self->cb.pf.k.usesWeakReadAndWriteBarriers) { if (self->cb.pf.v.usesWeakReadAndWriteBarriers) { zone = (NSZone*)nodeWW; } else { zone = (NSZone*)nodeWS; } } else { if (self->cb.pf.v.usesWeakReadAndWriteBarriers) { zone = (NSZone*)nodeSW; } else { zone = (NSZone*)nodeSS; } } #endif GSIMapInitWithZoneAndCapacity(self, zone, initialCapacity); return self; } - (BOOL) isEqual: (id)other { return NSCompareMapTables(self, other); } - (NSEnumerator*) keyEnumerator { NSEnumerator *e; e = [[NSConcreteMapTableKeyEnumerator alloc] initWithMapTable: self]; return [e autorelease]; } - (NSPointerFunctions*) keyPointerFunctions { NSConcretePointerFunctions *p = [NSConcretePointerFunctions new]; p->_x = self->cb.pf.k; return [p autorelease]; } - (NSEnumerator*) objectEnumerator { NSEnumerator *e; e = [[NSConcreteMapTableObjectEnumerator alloc] initWithMapTable: self]; return [e autorelease]; } - (id) objectForKey: (id)aKey { if (aKey != nil) { GSIMapNode node = GSIMapNodeForKey(self, (GSIMapKey)aKey); if (node) { return GSI_MAP_READ_VALUE(self, &node->value).obj; } } return nil; } - (void) removeAllObjects { if (nodeCount > 0) { GSIMapEmptyMap(self); version++; } } - (void) removeObjectForKey: (id)aKey { if (aKey == nil) { NSWarnMLog(@"attempt to remove nil key from map table %@", self); return; } if (nodeCount > 0) { GSIMapTable map = (GSIMapTable)self; GSIMapBucket bucket; GSIMapNode node; bucket = GSIMapBucketForKey(map, (GSIMapKey)aKey); node = GSIMapNodeForKeyInBucket(map, bucket, (GSIMapKey)aKey); if (node != 0) { GSIMapRemoveNodeFromMap(map, bucket, node); GSIMapFreeNode(map, node); version++; } } } - (void) setObject: (id)anObject forKey: (id)aKey { GSIMapNode node; if (aKey == nil) { [NSException raise: NSInvalidArgumentException format: @"[%@-%@:] given nil argument", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; } node = GSIMapNodeForKey(self, (GSIMapKey)aKey); if (node) { if (GSI_MAP_READ_VALUE(self, &node->value).obj != anObject) { GSI_MAP_RELEASE_VAL(self, node->value); GSI_MAP_WRITE_VAL(self, &node->value, (GSIMapVal)anObject); GSI_MAP_RETAIN_VAL(self, node->value); version++; } } else { GSIMapAddPair(self, (GSIMapKey)aKey, (GSIMapVal)anObject); version++; } } - (NSPointerFunctions*) valuePointerFunctions { NSConcretePointerFunctions *p = [NSConcretePointerFunctions new]; p->_x = self->cb.pf.v; return [p autorelease]; } @end @implementation NSConcreteMapTableKeyEnumerator - (id) initWithMapTable: (NSConcreteMapTable*)t { table = RETAIN(t); enumerator = GSIMapEnumeratorForMap(table); return self; } - (id) nextObject { GSIMapNode node = GSIMapEnumeratorNextNode(&enumerator); if (node == 0) { return nil; } return node->key.obj; } - (void) dealloc { GSIMapEndEnumerator(&enumerator); RELEASE(table); [super dealloc]; } @end @implementation NSConcreteMapTableObjectEnumerator - (id) nextObject { GSIMapNode node = GSIMapEnumeratorNextNode(&enumerator); if (node == 0) { return nil; } return node->value.obj; } @end gnustep-base-1.29.0/Source/NSConcretePointerFunctions.h000066400000000000000000000143371435650067400230700ustar00rootroot00000000000000/**Interface for NSConcretePointerFunctions for GNUStep Copyright (C) 2009 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 2009 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "Foundation/NSPointerFunctions.h" #ifdef __GNUSTEP_RUNTIME__ # include #endif #if defined(OBJC_CAP_ARC) # include # define ARC_WEAK_READ(x) objc_loadWeak((id*)x) # define ARC_WEAK_WRITE(addr, x) objc_storeWeak((id*)addr, (id)x) # define WEAK_READ(x) (*x) # define WEAK_WRITE(addr, x) (*(addr) = x) # define STRONG_WRITE(addr, x) objc_storeStrong((id*)addr, (id)x) # define STRONG_ACQUIRE(x) objc_retain(x) #else # define WEAK_READ(x) (*x) # define WEAK_WRITE(addr, x) (*(addr) = x) # define STRONG_WRITE(addr, x) ASSIGN(*((id*)addr), ((id)x)) # define STRONG_ACQUIRE(x) RETAIN(((id)x)) #endif #ifndef ARC_WEAK_WRITE # define ARC_WEAK_WRITE(addr, x) WEAK_WRITE(addr, x) #endif #ifndef ARC_WEAK_READ # define ARC_WEAK_READ(x) WEAK_READ(x) #endif /* Declare a structure type to copy pointer functions information * around easily. */ typedef struct { void* (*acquireFunction)(const void *item, NSUInteger (*size)(const void *item), BOOL shouldCopy); NSString *(*descriptionFunction)(const void *item); NSUInteger (*hashFunction)(const void *item, NSUInteger (*size)(const void *item)); BOOL (*isEqualFunction)(const void *item1, const void *item2, NSUInteger (*size)(const void *item)); void (*relinquishFunction)(const void *item, NSUInteger (*size)(const void *item)); NSUInteger (*sizeFunction)(const void *item); NSPointerFunctionsOptions options; } PFInfo; inline static BOOL memoryType(int options, int flag) { return (options & 0xff) == flag; } /* Declare the concrete pointer functions class as a wrapper around * an instance of the PFInfo structure. */ @interface NSConcretePointerFunctions : NSPointerFunctions { @public PFInfo _x; } @end /* Wrapper functions to make use of the pointer functions. */ /** * Reads the pointer from the specified address, inserting a read barrier if * required. */ static inline void *pointerFunctionsRead(PFInfo *PF, void **addr) { if (memoryType(PF->options, NSPointerFunctionsWeakMemory)) { return ARC_WEAK_READ((id*)addr); } if (memoryType(PF->options, NSPointerFunctionsZeroingWeakMemory)) { return WEAK_READ((id*)addr); } return *addr; } /** * Assigns a pointer, inserting the correct write barrier if required. */ static inline void pointerFunctionsAssign(PFInfo *PF, void **addr, void *value) { if (memoryType(PF->options, NSPointerFunctionsWeakMemory)) { ARC_WEAK_WRITE(addr, value); } else if (memoryType(PF->options, NSPointerFunctionsZeroingWeakMemory)) { WEAK_WRITE(addr, value); } else if (memoryType(PF->options, NSPointerFunctionsStrongMemory)) { STRONG_WRITE(addr, value); } else { *addr = value; } } /* Acquire the pointer value to store for the specified item. */ static inline void * pointerFunctionsAcquire(PFInfo *PF, void **dst, void *src) { if (PF->acquireFunction != 0) src = (*PF->acquireFunction)(src, PF->sizeFunction, PF->options & NSPointerFunctionsCopyIn ? YES : NO); // FIXME: This shouldn't be here. Acquire and assign are separate // operations. Acquire is for copy-in operations (i.e. retain / copy), // assign is for move operations of already-owned pointers. Combining them // like this is Just Plain Wrongâ„¢ pointerFunctionsAssign(PF, dst, src); return src; } /** * Moves a pointer from location to another. */ static inline void pointerFunctionsMove(PFInfo *PF, void **new, void **old) { pointerFunctionsAssign(PF, new, pointerFunctionsRead(PF, old)); } /* Generate an NSString description of the item */ static inline NSString * pointerFunctionsDescribe(PFInfo *PF, void *item) { if (PF->descriptionFunction != 0) return (*PF->descriptionFunction)(item); return nil; } /* Generate the hash of the item */ static inline NSUInteger pointerFunctionsHash(PFInfo *PF, void *item) { if (PF->hashFunction != 0) return (*PF->hashFunction)(item, PF->sizeFunction); return (NSUInteger)(uintptr_t)item; } /* Compare two items for equality */ static inline BOOL pointerFunctionsEqual(PFInfo *PF, void *item1, void *item2) { if (PF->isEqualFunction != 0) return (*PF->isEqualFunction)(item1, item2, PF->sizeFunction); if (item1 == item2) return YES; return NO; } /* Relinquish the specified item and set it to zero. */ static inline void pointerFunctionsRelinquish(PFInfo *PF, void **itemptr) { if (PF->relinquishFunction != 0) (*PF->relinquishFunction)(*itemptr, PF->sizeFunction); if (memoryType(PF->options, NSPointerFunctionsWeakMemory)) ARC_WEAK_WRITE(itemptr, 0); else if (memoryType(PF->options, NSPointerFunctionsZeroingWeakMemory)) WEAK_WRITE(itemptr, (void*)0); else *itemptr = 0; } static inline void pointerFunctionsReplace(PFInfo *PF, void **dst, void *src) { if (src != *dst) { if (PF->acquireFunction != 0) src = (*PF->acquireFunction)(src, PF->sizeFunction, PF->options & NSPointerFunctionsCopyIn ? YES : NO); if (PF->relinquishFunction != 0) (*PF->relinquishFunction)(*dst, PF->sizeFunction); if (memoryType(PF->options, NSPointerFunctionsWeakMemory)) ARC_WEAK_WRITE(dst, 0); else if (memoryType(PF->options, NSPointerFunctionsZeroingWeakMemory)) WEAK_WRITE(dst, (void*)0); else *dst = src; } } gnustep-base-1.29.0/Source/NSConcretePointerFunctions.m000066400000000000000000000216541435650067400230750ustar00rootroot00000000000000/**Implementation for NSConcretePointerFunctions for GNUStep Copyright (C) 2009 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 2009 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #import "NSConcretePointerFunctions.h" static void* acquireMallocMemory(const void *item, NSUInteger (*size)(const void *item), BOOL shouldCopy) { if (shouldCopy == YES) { NSUInteger len = (*size)(item); void *newItem = malloc(len); memcpy(newItem, item, len); item = newItem; } return (void*)item; } static void* acquireRetainedObject(const void *item, NSUInteger (*size)(const void *item), BOOL shouldCopy) { if (shouldCopy == YES) { return [(NSObject*)item copy]; } return [(NSObject*)item retain]; } static void* acquireExistingMemory(const void *item, NSUInteger (*size)(const void *item), BOOL shouldCopy) { return (void*)item; } static NSString* describeString(const void *item) { return [NSString stringWithFormat: @"%s", (char*)item]; } static NSString* describeInteger(const void *item) { return [NSString stringWithFormat: @"%"PRIdPTR, (intptr_t)item]; } static NSString* describeObject(const void *item) { return [(NSObject*)item description]; } static NSString* describePointer(const void *item) { return [NSString stringWithFormat: @"%p", item]; } static BOOL equalDirect(const void *item1, const void *item2, NSUInteger (*size)(const void *item)) { return (item1 == item2) ? YES : NO; } static BOOL equalObject(const void *item1, const void *item2, NSUInteger (*size)(const void *item)) { return [(NSObject*)item1 isEqual: (NSObject*)item2]; } static BOOL equalMemory(const void *item1, const void *item2, NSUInteger (*size)(const void *item)) { NSUInteger s1 = (*size)(item1); NSUInteger s2 = (*size)(item2); return (s1 == s2 && memcmp(item1, item2, s1) == 0) ? YES : NO; } static BOOL equalString(const void *item1, const void *item2, NSUInteger (*size)(const void *item)) { return (strcmp((const char*)item1, (const char*)item2) == 0) ? YES : NO; } static NSUInteger hashDirect(const void *item, NSUInteger (*size)(const void *item)) { return (NSUInteger)(uintptr_t)item; } static NSUInteger hashObject(const void *item, NSUInteger (*size)(const void *item)) { return [(NSObject*)item hash]; } static NSUInteger hashMemory(const void *item, NSUInteger (*size)(const void *item)) { unsigned len = (*size)(item); NSUInteger hash = 0; while (len-- > 0) { hash = (hash << 5) + hash + *(const uint8_t*)item++; } return hash; } static NSUInteger hashShifted(const void *item, NSUInteger (*size)(const void *item)) { return ((NSUInteger)(uintptr_t)item) >> 2; } static NSUInteger hashString(const void *item, NSUInteger (*size)(const void *item)) { NSUInteger hash = 0; while (*(const uint8_t*)item != 0) { hash = (hash << 5) + hash + *(const uint8_t*)item++; } return hash; } static void relinquishMallocMemory(const void *item, NSUInteger (*size)(const void *item)) { free((void*)item); } static void relinquishRetainedMemory(const void *item, NSUInteger (*size)(const void *item)) { [(NSObject*)item release]; } @implementation NSConcretePointerFunctions + (id) allocWithZone: (NSZone*)zone { return (id) NSAllocateObject(self, 0, zone); } - (id) copyWithZone: (NSZone*)zone { return NSCopyObject(self, 0, zone); } - (id) initWithOptions: (NSPointerFunctionsOptions)options { _x.options = options; /* First we look at the memory management options to see which function * should be used to relinquish contents of a container with these * options. */ if (options & NSPointerFunctionsZeroingWeakMemory) { _x.relinquishFunction = 0; } else if (options & NSPointerFunctionsOpaqueMemory) { _x.relinquishFunction = 0; } else if (options & NSPointerFunctionsMallocMemory) { _x.relinquishFunction = relinquishMallocMemory; } else if (options & NSPointerFunctionsMachVirtualMemory) { _x.relinquishFunction = relinquishMallocMemory; } else { _x.relinquishFunction = relinquishRetainedMemory; } /* Now we look at the personality options to determine other functions. */ if (options & NSPointerFunctionsOpaquePersonality) { _x.acquireFunction = acquireExistingMemory; _x.descriptionFunction = describePointer; _x.hashFunction = hashShifted; _x.isEqualFunction = equalDirect; } else if (options & NSPointerFunctionsObjectPointerPersonality) { if (options & NSPointerFunctionsZeroingWeakMemory) { _x.acquireFunction = acquireExistingMemory; } else { _x.acquireFunction = acquireRetainedObject; } _x.descriptionFunction = describeObject; _x.hashFunction = hashShifted; _x.isEqualFunction = equalDirect; } else if (options & NSPointerFunctionsCStringPersonality) { _x.acquireFunction = acquireMallocMemory; _x.descriptionFunction = describeString; _x.hashFunction = hashString; _x.isEqualFunction = equalString; } else if (options & NSPointerFunctionsStructPersonality) { _x.acquireFunction = acquireMallocMemory; _x.descriptionFunction = describePointer; _x.hashFunction = hashMemory; _x.isEqualFunction = equalMemory; } else if (options & NSPointerFunctionsIntegerPersonality) { _x.acquireFunction = acquireExistingMemory; _x.descriptionFunction = describeInteger; _x.hashFunction = hashDirect; _x.isEqualFunction = equalDirect; } else /* objects */ { if (options & NSPointerFunctionsZeroingWeakMemory) { _x.acquireFunction = acquireExistingMemory; } else { _x.acquireFunction = acquireRetainedObject; } _x.descriptionFunction = describeObject; _x.hashFunction = hashObject; _x.isEqualFunction = equalObject; } return self; } - (void* (*)(const void *item, NSUInteger (*size)(const void *item), BOOL shouldCopy)) acquireFunction { return _x.acquireFunction; } - (NSString *(*)(const void *item)) descriptionFunction { return _x.descriptionFunction; } - (NSUInteger (*)(const void *item, NSUInteger (*size)(const void *item))) hashFunction { return _x.hashFunction; } - (BOOL (*)(const void *item1, const void *item2, NSUInteger (*size)(const void *item))) isEqualFunction { return _x.isEqualFunction; } - (void (*)(const void *item, NSUInteger (*size)(const void *item))) relinquishFunction { return _x.relinquishFunction; } - (void) setAcquireFunction: (void* (*)(const void *item, NSUInteger (*size)(const void *item), BOOL shouldCopy))func { _x.acquireFunction = func; } - (void) setDescriptionFunction: (NSString *(*)(const void *item))func { _x.descriptionFunction = func; } - (void) setHashFunction: (NSUInteger (*)(const void *item, NSUInteger (*size)(const void *item)))func { _x.hashFunction = func; } - (void) setIsEqualFunction: (BOOL (*)(const void *item1, const void *item2, NSUInteger (*size)(const void *item)))func { _x.isEqualFunction = func; } - (void) setRelinquishFunction: (void (*)(const void *item, NSUInteger (*size)(const void *item))) func { _x.relinquishFunction = func; } - (void) setSizeFunction: (NSUInteger (*)(const void *item))func { _x.sizeFunction = func; } - (void) setUsesStrongWriteBarrier: (BOOL)flag { _x.options &= ~(NSPointerFunctionsZeroingWeakMemory |NSPointerFunctionsOpaqueMemory |NSPointerFunctionsMallocMemory |NSPointerFunctionsMachVirtualMemory); } - (void) setUsesWeakReadAndWriteBarriers: (BOOL)flag { _x.options |= NSPointerFunctionsZeroingWeakMemory; _x.options &= ~(NSPointerFunctionsOpaqueMemory |NSPointerFunctionsMallocMemory |NSPointerFunctionsMachVirtualMemory); } - (NSUInteger (*)(const void *item)) sizeFunction { return _x.sizeFunction; } - (BOOL) usesStrongWriteBarrier { if ((_x.options & (NSPointerFunctionsZeroingWeakMemory |NSPointerFunctionsOpaqueMemory |NSPointerFunctionsMallocMemory |NSPointerFunctionsMachVirtualMemory)) == NSPointerFunctionsStrongMemory) return YES; return NO; } - (BOOL) usesWeakReadAndWriteBarriers { if (_x.options & NSPointerFunctionsZeroingWeakMemory) return YES; return NO; } @end gnustep-base-1.29.0/Source/NSConnection.m000066400000000000000000003227041435650067400202000ustar00rootroot00000000000000/** Implementation of connection object for remote object messaging Copyright (C) 1994-2017 Free Software Foundation, Inc. Created by: Andrew Kachites McCallum Date: July 1994 Minor rewrite for OPENSTEP by: Richard Frith-Macdonald Date: August 1997 Major rewrite for MACOSX by: Richard Frith-Macdonald Date: 2000 This file is part of the GNUstep Base Library. 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 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 USA. NSConnection class reference $Date$ $Revision$ */ #import "common.h" #if !defined (__GNU_LIBOBJC__) # include #endif #define GS_NSConnection_IVARS \ BOOL _isValid; \ BOOL _independentQueueing; \ BOOL _authenticateIn; \ BOOL _authenticateOut; \ BOOL _multipleThreads; \ BOOL _shuttingDown; \ BOOL _useKeepalive; \ BOOL _keepaliveWait; \ NSPort *_receivePort; \ NSPort *_sendPort; \ unsigned _requestDepth; \ unsigned _messageCount; \ unsigned _reqOutCount; \ unsigned _reqInCount; \ unsigned _repOutCount; \ unsigned _repInCount; \ GSIMapTable _localObjects; \ GSIMapTable _localTargets; \ GSIMapTable _remoteProxies; \ GSIMapTable _replyMap; \ NSTimeInterval _replyTimeout; \ NSTimeInterval _requestTimeout; \ NSMutableArray *_requestModes; \ NSMutableArray *_runLoops; \ NSMutableArray *_requestQueue; \ id _delegate; \ NSRecursiveLock *_refGate; \ NSMutableArray *_cachedDecoders; \ NSMutableArray *_cachedEncoders; \ NSString *_remoteName; \ NSString *_registeredName; \ NSPortNameServer *_nameServer; \ int _lastKeepalive #define EXPOSE_NSDistantObject_IVARS 1 #ifdef HAVE_MALLOC_H #if !defined(__OpenBSD__) #include #endif #endif #ifdef HAVE_ALLOCA_H #include #endif #import "Foundation/NSEnumerator.h" #import "GNUstepBase/GSLock.h" /* Skip past an argument and also any offset information before the next. */ static inline const char * skip_argspec(const char *ptr) { if (ptr != NULL) { ptr = NSGetSizeAndAlignment(ptr, NULL, NULL); if (*ptr == '+') ptr++; while (isdigit(*ptr)) ptr++; } return ptr; } /* * Setup for inline operation of pointer map tables. */ #define GSI_MAP_KTYPES GSUNION_PTR | GSUNION_OBJ | GSUNION_NSINT #define GSI_MAP_VTYPES GSUNION_PTR | GSUNION_OBJ #define GSI_MAP_RETAIN_KEY(M, X) #define GSI_MAP_RELEASE_KEY(M, X) #define GSI_MAP_RETAIN_VAL(M, X) #define GSI_MAP_RELEASE_VAL(M, X) #define GSI_MAP_HASH(M, X) ((X).nsu ^ ((X).nsu >> 3)) #define GSI_MAP_EQUAL(M, X,Y) ((X).ptr == (Y).ptr) #define GSI_MAP_NOCLEAN 1 #include "GNUstepBase/GSIMap.h" #define _IN_CONNECTION_M #import "Foundation/NSConnection.h" #undef _IN_CONNECTION_M #import "Foundation/NSPortCoder.h" #import "GNUstepBase/DistributedObjects.h" #import "Foundation/NSHashTable.h" #import "Foundation/NSMapTable.h" #import "Foundation/NSData.h" #import "Foundation/NSRunLoop.h" #import "Foundation/NSArray.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSValue.h" #import "Foundation/NSDate.h" #import "Foundation/NSException.h" #import "Foundation/NSLock.h" #import "Foundation/NSThread.h" #import "Foundation/NSPort.h" #import "Foundation/NSPortMessage.h" #import "Foundation/NSPortNameServer.h" #import "Foundation/NSNotification.h" #import "GSInvocation.h" #import "GSPortPrivate.h" #import "GSPrivate.h" static inline NSRunLoop * GSRunLoopForThread(NSThread *aThread) { GSRunLoopThreadInfo *info = GSRunLoopInfoForThread(aThread); if (info == nil || info->loop == nil) { if (aThread == nil || aThread == GSCurrentThread()) { return [NSRunLoop currentRunLoop]; } return nil; } return info->loop; } @interface NSPortCoder (Private) - (NSMutableArray*) _components; @end @interface NSPortMessage (Private) - (NSMutableArray*) _components; @end @interface NSConnection (GNUstepExtensions) - (void) finalize; - (void) forwardInvocation: (NSInvocation *)inv forProxy: (NSDistantObject*)object; - (const char *) typeForSelector: (SEL)sel remoteTarget: (unsigned)target; @end #define GS_F_LOCK(X) \ {NSDebugFLLog(@"GSConnection",@"Lock %@",X);[X lock];} #define GS_F_UNLOCK(X) \ {NSDebugFLLog(@"GSConnection",@"Unlock %@",X);[X unlock];} #define GS_M_LOCK(X) \ {NSDebugMLLog(@"GSConnection",@"Lock %@",X);[X lock];} #define GSM_UNLOCK(X) \ {NSDebugMLLog(@"GSConnection",@"Unlock %@",X);[X unlock];} /* * Cache various class pointers. */ static id dummyObject; static Class connectionClass; static Class dateClass; static Class distantObjectClass; static Class sendCoderClass; static Class recvCoderClass; static Class runLoopClass; static NSString* stringFromMsgType(int type) { switch (type) { case METHOD_REQUEST: return @"method request"; case METHOD_REPLY: return @"method reply"; case ROOTPROXY_REQUEST: return @"root proxy request"; case ROOTPROXY_REPLY: return @"root proxy reply"; case CONNECTION_SHUTDOWN: return @"connection shutdown"; case METHODTYPE_REQUEST: return @"methodtype request"; case METHODTYPE_REPLY: return @"methodtype reply"; case PROXY_RELEASE: return @"proxy release"; case PROXY_RETAIN: return @"proxy retain"; case RETAIN_REPLY: return @"retain replay"; default: return @"unknown operation type!"; } } /* * CachedLocalObject is a trivial class to keep track of local * proxies which have been removed from their connections and * need to persist a while in case another process needs them. */ @interface CachedLocalObject : NSObject { NSDistantObject *obj; int time; } - (BOOL) countdown; - (NSDistantObject*) obj; + (id) newWithObject: (NSDistantObject*)o time: (int)t; @end @implementation CachedLocalObject + (id) newWithObject: (NSDistantObject*)o time: (int)t { CachedLocalObject *item; item = (CachedLocalObject*)NSAllocateObject(self, 0, NSDefaultMallocZone()); item->obj = RETAIN(o); item->time = t; return item; } - (void) dealloc { RELEASE(obj); [super dealloc]; } - (BOOL) countdown { if (time-- > 0) return YES; return NO; } - (NSDistantObject*) obj { return obj; } @end /** */ #define GSInternal NSConnectionInternal #include "GSInternal.h" GS_PRIVATE_INTERNAL(NSConnection) #define IisValid (internal->_isValid) #define IindependentQueueing (internal->_independentQueueing) #define IauthenticateIn (internal->_authenticateIn) #define IauthenticateOut (internal->_authenticateOut) #define ImultipleThreads (internal->_multipleThreads) #define IshuttingDown (internal->_shuttingDown) #define IuseKeepalive (internal->_useKeepalive) #define IkeepaliveWait (internal->_keepaliveWait) #define IreceivePort (internal->_receivePort) #define IsendPort (internal->_sendPort) #define IrequestDepth (internal->_requestDepth) #define ImessageCount (internal->_messageCount) #define IreqOutCount (internal->_reqOutCount) #define IreqInCount (internal->_reqInCount) #define IrepOutCount (internal->_repOutCount) #define IrepInCount (internal->_repInCount) #define IlocalObjects (internal->_localObjects) #define IlocalTargets (internal->_localTargets) #define IremoteProxies (internal->_remoteProxies) #define IreplyMap (internal->_replyMap) #define IreplyTimeout (internal->_replyTimeout) #define IrequestTimeout (internal->_requestTimeout) #define IrequestModes (internal->_requestModes) #define IrunLoops (internal->_runLoops) #define IrequestQueue (internal->_requestQueue) #define Idelegate (internal->_delegate) #define IrefGate (internal->_refGate) #define IcachedDecoders (internal->_cachedDecoders) #define IcachedEncoders (internal->_cachedEncoders) #define IremoteName (internal->_remoteName) #define IregisteredName (internal->_registeredName) #define InameServer (internal->_nameServer) #define IlastKeepalive (internal->_lastKeepalive) /** */ @interface NSConnection(Private) - (void) handlePortMessage: (NSPortMessage*)msg; - (void) _runInNewThread; + (int) setDebug: (int)val; - (void) _enableKeepalive; - (void) addLocalObject: (NSDistantObject*)anObj; - (void) removeLocalObject: (NSDistantObject*)anObj; - (void) _doneInReply: (NSPortCoder*)c; - (void) _doneInRmc: (NSPortCoder*) NS_CONSUMED c; - (void) _failInRmc: (NSPortCoder*)c; - (void) _failOutRmc: (NSPortCoder*)c; - (NSPortCoder*) _getReplyRmc: (int)sn for: (const char*)request; - (NSPortCoder*) _newInRmc: (NSMutableArray*)components; - (NSPortCoder*) _newOutRmc: (int)sequence generate: (int*)sno reply: (BOOL)f; - (void) _portIsInvalid: (NSNotification*)notification; - (void) _sendOutRmc: (NSPortCoder*) NS_CONSUMED c type: (int)msgid sequence: (int)sno; - (void) _service_forwardForProxy: (NSPortCoder*)rmc; - (void) _service_release: (NSPortCoder*)rmc; - (void) _service_retain: (NSPortCoder*)rmc; - (void) _service_rootObject: (NSPortCoder*)rmc; - (void) _service_shutdown: (NSPortCoder*)rmc; - (void) _service_typeForSelector: (NSPortCoder*)rmc; - (void) _shutdown; + (void) _threadWillExit: (NSNotification*)notification; @end /* class defaults */ static NSTimer *timer = nil; static BOOL cacheCoders = NO; static int debug_connection = 0; static NSHashTable *connection_table; static NSRecursiveLock *connection_table_gate = nil; /* * Locate an existing connection with the specified send and receive ports. * nil ports act as wildcards and return the first match. */ static NSConnection* existingConnection(NSPort *receivePort, NSPort *sendPort) { NSHashEnumerator enumerator; NSConnection *c; GS_F_LOCK(connection_table_gate); enumerator = NSEnumerateHashTable(connection_table); while ((c = (NSConnection*)NSNextHashEnumeratorItem(&enumerator)) != nil) { if ((sendPort == nil || [sendPort isEqual: [c sendPort]]) && (receivePort == nil || [receivePort isEqual: [c receivePort]])) { /* * We don't want this connection to be destroyed by another thread * between now and when it's returned from this function and used! */ IF_NO_ARC([[c retain] autorelease];) break; } } NSEndHashTableEnumeration(&enumerator); GS_F_UNLOCK(connection_table_gate); return c; } static NSMapTable *root_object_map; static NSLock *root_object_map_gate = nil; static id rootObjectForInPort(NSPort *aPort) { id rootObject; GS_F_LOCK(root_object_map_gate); rootObject = (id)NSMapGet(root_object_map, (void*)(uintptr_t)aPort); GS_F_UNLOCK(root_object_map_gate); return rootObject; } /* Pass nil to remove any reference keyed by aPort. */ static void setRootObjectForInPort(id anObj, NSPort *aPort) { id oldRootObject; GS_F_LOCK(root_object_map_gate); oldRootObject = (id)NSMapGet(root_object_map, (void*)(uintptr_t)aPort); if (oldRootObject != anObj) { if (anObj != nil) { NSMapInsert(root_object_map, (void*)(uintptr_t)aPort, (void*)(uintptr_t)anObj); } else /* anObj == nil && oldRootObject != nil */ { NSMapRemove(root_object_map, (void*)(uintptr_t)aPort); } } GS_F_UNLOCK(root_object_map_gate); } static NSMapTable *targetToCached = NULL; static NSLock *cached_proxies_gate = nil; /** * NSConnection objects are used to manage communications between * objects in different processes, in different machines, or in * different threads. */ @implementation NSConnection /** * Returns an array containing all the NSConnection objects known to * the system. These connections will be valid at the time that the * array was created, but may be invalidated by other threads * before you get to examine the array. */ + (NSArray*) allConnections { NSArray *a; GS_M_LOCK(connection_table_gate); a = NSAllHashTableObjects(connection_table); GSM_UNLOCK(connection_table_gate); return a; } /** * Returns a connection initialised using -initWithReceivePort:sendPort:
* Both ports must be of the same type. */ + (NSConnection*) connectionWithReceivePort: (NSPort*)r sendPort: (NSPort*)s { NSConnection *c = existingConnection(r, s); if (c == nil) { c = [self allocWithZone: NSDefaultMallocZone()]; c = [c initWithReceivePort: r sendPort: s]; IF_NO_ARC([c autorelease];) } return c; } /** *

Returns an NSConnection object whose send port is that of the * NSConnection registered under the name n on the host h *

*

This method calls +connectionWithRegisteredName:host:usingNameServer: * using the default system name server. *

*

Use [NSSocketPortNameServer] for connections to remote hosts. *

*/ + (NSConnection*) connectionWithRegisteredName: (NSString*)n host: (NSString*)h { NSPortNameServer *s; s = [NSPortNameServer systemDefaultPortNameServer]; return [self connectionWithRegisteredName: n host: h usingNameServer: s]; } /** *

* Returns an NSConnection object whose send port is that of the * NSConnection registered under name on host. *

*

* The nameserver server is used to look up the send * port to be used for the connection.
* Use [NSSocketPortNameServer+sharedInstance] * for connections to remote hosts. *

*

* If host is nil or an empty string, * the host is taken to be the local machine.
* If it is an asterisk ('*') then the nameserver checks all * hosts on the local subnet (unless the nameserver is one * that only manages local ports).
* In the GNUstep implementation, the local host is searched before * any other hosts.
* NB. if the nameserver does not support connections to remote hosts * (the default situation) the host argeument should be omitted. *

*

* If no NSConnection can be found for name and * hosthost, the method returns nil. *

*

* The returned object has the default NSConnection of the * current thread as its parent (it has the same receive port * as the default connection). *

*/ + (NSConnection*) connectionWithRegisteredName: (NSString*)n host: (NSString*)h usingNameServer: (NSPortNameServer*)s { NSConnection *con = nil; if (s != nil) { NSPort *sendPort = [s portForName: n onHost: h]; if (sendPort != nil) { NSPort *recvPort; recvPort = [[self defaultConnection] receivePort]; if (recvPort == sendPort) { /* * If the receive and send port are the same, the server * must be in this process - so we need to create a new * connection to talk to it. */ recvPort = [NSPort port]; } else if (![recvPort isMemberOfClass: [sendPort class]]) { /* We can only use the port of the default connection for connections using the same port class. For other port classes, we must use a receiving port of the same class as the sending port, so we allocate one here. */ recvPort = [[sendPort class] port]; } con = existingConnection(recvPort, sendPort); if (con == nil) { con = [self connectionWithReceivePort: recvPort sendPort: sendPort]; } ASSIGNCOPY(GSIVar(con, _remoteName), n); } } return con; } /** * Return the current conversation ... not implemented in GNUstep */ + (id) currentConversation { return nil; } /** * Returns the default connection for a thread.
* Creates a new instance if necessary.
* The default connection has a single NSPort object used for * both sending and receiving - this it can't be used to * connect to a remote process, but can be used to vend objects.
* Possible problem - if the connection is invalidated, it won't be * cleaned up until this thread calls this method again. The connection * and it's ports could hang around for a very long time. */ + (NSConnection*) defaultConnection { static NSString *tkey = @"NSConnectionThreadKey"; NSConnection *c; NSMutableDictionary *d; d = GSCurrentThreadDictionary(); c = (NSConnection*)[d objectForKey: tkey]; if (c != nil && [c isValid] == NO) { /* * If the default connection for this thread has been invalidated - * release it and create a new one. */ [d removeObjectForKey: tkey]; c = nil; } if (c == nil) { NSPort *port; c = [self alloc]; port = [NSPort port]; c = [c initWithReceivePort: port sendPort: nil]; if (c != nil) { [d setObject: c forKey: tkey]; RELEASE(c); } } return c; } + (void) initialize { if (connectionClass == nil) { NSNotificationCenter *nc; GSMakeWeakPointer(self, "delegate"); connectionClass = self; dateClass = [NSDate class]; distantObjectClass = [NSDistantObject class]; sendCoderClass = [NSPortCoder class]; recvCoderClass = [NSPortCoder class]; runLoopClass = [NSRunLoop class]; dummyObject = [NSObject new]; [[NSObject leakAt: &dummyObject] release]; connection_table = NSCreateHashTable(NSNonRetainedObjectHashCallBacks, 0); [[NSObject leakAt: &connection_table] release]; targetToCached = NSCreateMapTable(NSIntegerMapKeyCallBacks, NSObjectMapValueCallBacks, 0); [[NSObject leakAt: &targetToCached] release]; root_object_map = NSCreateMapTable(NSNonOwnedPointerMapKeyCallBacks, NSObjectMapValueCallBacks, 0); [[NSObject leakAt: &root_object_map] release]; if (connection_table_gate == nil) { connection_table_gate = [NSRecursiveLock new]; [[NSObject leakAt: &connection_table_gate] release]; } if (cached_proxies_gate == nil) { cached_proxies_gate = [NSLock new]; [[NSObject leakAt: &cached_proxies_gate] release]; } if (root_object_map_gate == nil) { root_object_map_gate = [NSLock new]; [[NSObject leakAt: &root_object_map_gate] release]; } /* * When any thread exits, we must check to see if we are using its * runloop, and remove ourselves from it if necessary. */ nc = [NSNotificationCenter defaultCenter]; [nc addObserver: self selector: @selector(_threadWillExit:) name: NSThreadWillExitNotification object: nil]; } } /** * Undocumented feature for compatibility with OPENSTEP/MacOS-X * +new returns the default connection. */ + (id) new { return RETAIN([self defaultConnection]); } /** * This method calls * +rootProxyForConnectionWithRegisteredName:host:usingNameServer: * to return a proxy for a root object on the remote connection with * the send port registered under name n on host h. */ + (NSDistantObject*) rootProxyForConnectionWithRegisteredName: (NSString*)n host: (NSString*)h { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSConnection *connection; NSDistantObject *proxy = nil; connection = [self connectionWithRegisteredName: n host: h]; if (connection != nil) { proxy = [[connection rootProxy] retain]; } [arp drain]; return [proxy autorelease]; } /** * This method calls * +connectionWithRegisteredName:host:usingNameServer: * to get a connection, then sends it a -rootProxy message to get * a proxy for the root object being vended by the remote connection. * Returns the proxy or nil if it couldn't find a connection or if * the root object for the connection has not been set.
* Use [NSSocketPortNameServer+sharedInstance] * for connections to remote hosts. */ + (NSDistantObject*) rootProxyForConnectionWithRegisteredName: (NSString*)n host: (NSString*)h usingNameServer: (NSPortNameServer*)s { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSConnection *connection; NSDistantObject *proxy = nil; connection = [self connectionWithRegisteredName: n host: h usingNameServer: s]; if (connection != nil) { proxy = RETAIN([connection rootProxy]); } [arp drain]; return AUTORELEASE(proxy); } + (id) serviceConnectionWithName: (NSString *)name rootObject: (id)root { return [self serviceConnectionWithName: name rootObject: root usingNameServer: [NSPortNameServer systemDefaultPortNameServer]]; } + (id) serviceConnectionWithName: (NSString *)name rootObject: (id)root usingNameServer: (NSPortNameServer *)server { NSConnection *c; NSPort *p; if ([server isKindOfClass: [NSMessagePortNameServer class]] == YES) { p = [NSMessagePort port]; } else if ([server isKindOfClass: [NSSocketPortNameServer class]] == YES) { p = [NSSocketPort port]; } else { p = nil; } c = [[NSConnection alloc] initWithReceivePort: p sendPort: nil]; [c setRootObject: root]; if ([c registerName: name withNameServer: server] == NO) { DESTROY(c); } return AUTORELEASE(c); } + (void) _timeout: (NSTimer*)t { NSArray *cached_locals; int i; GS_M_LOCK(cached_proxies_gate); cached_locals = NSAllMapTableValues(targetToCached); for (i = [cached_locals count]; i > 0; i--) { CachedLocalObject *item = [cached_locals objectAtIndex: i-1]; if ([item countdown] == NO) { NSDistantObject *obj = [item obj]; NSMapRemove(targetToCached, (void*)(uintptr_t)obj->_handle); } } if ([cached_locals count] == 0) { [t invalidate]; timer = nil; } GSM_UNLOCK(cached_proxies_gate); } /** * Adds mode to the run loop modes that the NSConnection * will listen to for incoming messages. */ - (void) addRequestMode: (NSString*)mode { GS_M_LOCK(IrefGate); if ([self isValid] == YES) { if ([IrequestModes containsObject: mode] == NO) { NSUInteger c = [IrunLoops count]; while (c-- > 0) { NSRunLoop *loop = [IrunLoops objectAtIndex: c]; [IreceivePort addConnection: self toRunLoop: loop forMode: mode]; } [IrequestModes addObject: mode]; } } GSM_UNLOCK(IrefGate); } /** * Adds loop to the set of run loops that the NSConnection * will listen to for incoming messages. */ - (void) addRunLoop: (NSRunLoop*)loop { GS_M_LOCK(IrefGate); if ([self isValid] == YES) { if ([IrunLoops indexOfObjectIdenticalTo: loop] == NSNotFound) { NSUInteger c = [IrequestModes count]; while (c-- > 0) { NSString *mode = [IrequestModes objectAtIndex: c]; [IreceivePort addConnection: self toRunLoop: loop forMode: mode]; } [IrunLoops addObject: loop]; } } GSM_UNLOCK(IrefGate); } - (void) dealloc { if (debug_connection) NSLog(@"deallocating %@", self); [self finalize]; if (internal != nil) { GS_DESTROY_INTERNAL(NSConnection); } [super dealloc]; } /** * Returns the delegate of the NSConnection. */ - (id) delegate { return Idelegate; } - (NSString*) description { return [NSString stringWithFormat: @"%@ local: '%@',%@ remote '%@',%@", [super description], IregisteredName ? (id)IregisteredName : (id)@"", [self receivePort], IremoteName ? (id)IremoteName : (id)@"", [self sendPort]]; } /** * Sets the NSConnection configuration so that multiple threads may * use the connection to send requests to the remote connection.
* This option is inherited by child connections.
* NB. A connection with multiple threads enabled will run slower than * a normal connection. */ - (void) enableMultipleThreads { ImultipleThreads = YES; } /** * Returns YES if the NSConnection is configured to * handle remote messages atomically, NO otherwise.
* This option is inherited by child connections. */ - (BOOL) independentConversationQueueing { return IindependentQueueing; } /** * Return a connection able to act as a server receive incoming requests. */ - (id) init { NSPort *port = [NSPort port]; self = [self initWithReceivePort: port sendPort: nil]; return self; } /** * Initialises an NSConnection with the receive port r and the * send port s.
* Behavior varies with the port values as follows - * * r is nil * * The NSConnection is released and the method returns * nil. * * s is nil * * The NSConnection uses r as the send port as * well as the receive port. * * s is the same as r * * The NSConnection is usable only for vending objects. * * A connection with the same ports exists * * The new connection is released and the old connection * is retained and returned. * * A connection with the same ports (swapped) exists * * The new connection is initialised as normal, and will * communicate with the old connection. * * *

* If a connection exists whose send and receive ports are * both the same as the new connections receive port, that * existing connection is deemed to be the parent of the * new connection. The new connection inherits configuration * information from the parent, and the delegate of the * parent has a chance to adjust the configuration of the * new connection or veto its creation. *
* NSConnectionDidInitializeNotification is posted once a new * connection is initialised. *

*/ - (id) initWithReceivePort: (NSPort*)r sendPort: (NSPort*)s { NSNotificationCenter *nCenter; NSConnection *parent; NSConnection *conn; NSRunLoop *loop; id del; NSZone *z; z = NSDefaultMallocZone(); /* * If the receive port is nil, deallocate connection and return nil. */ if (r == nil) { if (debug_connection > 2) { NSLog(@"Asked to create connection with nil receive port"); } DESTROY(self); return self; } /* * If the send port is nil, set it to the same as the receive port * This connection will then only be useful to act as a server. */ if (s == nil) { s = r; } conn = existingConnection(r, s); /* * If the send and receive ports match an existing connection * deallocate the new one and retain and return the old one. */ if (conn != nil) { DESTROY(self); self = RETAIN(conn); if (debug_connection > 2) { NSLog(@"Found existing connection (%@) for \n\t%@\n\t%@", conn, r, s); } return self; } /* Create our private data structure. */ GS_CREATE_INTERNAL(NSConnection); /* * The parent connection is the one whose send and receive ports are * both the same as our receive port. */ parent = existingConnection(r, r); if (debug_connection) { NSLog(@"Initialising new connection with parent %@, %@\n " @"Send: %@\n Recv: %@", parent, self, s, r); } GS_M_LOCK(connection_table_gate); IisValid = YES; IreceivePort = RETAIN(r); IsendPort = RETAIN(s); ImessageCount = 0; IrepOutCount = 0; IreqOutCount = 0; IrepInCount = 0; IreqInCount = 0; /* * These arrays cache NSPortCoder objects */ if (cacheCoders == YES) { IcachedDecoders = [NSMutableArray new]; IcachedEncoders = [NSMutableArray new]; } /* * This is used to queue up incoming NSPortMessages representing requests * that can't immediately be dealt with. */ IrequestQueue = [NSMutableArray new]; /* * This maps request sequence numbers to the NSPortCoder objects representing * replies arriving from the remote connection. */ IreplyMap = (GSIMapTable)NSZoneMalloc(z, sizeof(GSIMapTable_t)); GSIMapInitWithZoneAndCapacity(IreplyMap, z, 4); /* * This maps (void*)obj to (id)obj. The obj's are retained. * We use this instead of an NSHashTable because we only care about * the object's address, and don't want to send the -hash message to it. */ IlocalObjects = (GSIMapTable)NSZoneMalloc(z, sizeof(GSIMapTable_t)); GSIMapInitWithZoneAndCapacity(IlocalObjects, z, 4); /* * This maps handles for local objects to their local proxies. */ IlocalTargets = (GSIMapTable)NSZoneMalloc(z, sizeof(GSIMapTable_t)); GSIMapInitWithZoneAndCapacity(IlocalTargets, z, 4); /* * This maps targets to remote proxies. */ IremoteProxies = (GSIMapTable)NSZoneMalloc(z, sizeof(GSIMapTable_t)); GSIMapInitWithZoneAndCapacity(IremoteProxies, z, 4); IrequestDepth = 0; Idelegate = nil; IrefGate = [NSRecursiveLock new]; /* * Some attributes are inherited from the parent if possible. */ if (parent != nil) { NSUInteger count; ImultipleThreads = GSIVar(parent, _multipleThreads); IindependentQueueing = GSIVar(parent, _independentQueueing); IreplyTimeout = GSIVar(parent, _replyTimeout); IrequestTimeout = GSIVar(parent, _requestTimeout); IrunLoops = [GSIVar(parent, _runLoops) mutableCopy]; count = [GSIVar(parent, _requestModes) count]; IrequestModes = [[NSMutableArray alloc] initWithCapacity: count]; while (count-- > 0) { [self addRequestMode: [GSIVar(parent, _requestModes) objectAtIndex: count]]; } if (GSIVar(parent, _useKeepalive) == YES) { [self _enableKeepalive]; } } else { ImultipleThreads = NO; IindependentQueueing = NO; IreplyTimeout = 1.0E12; IrequestTimeout = 1.0E12; /* * Set up request modes array and make sure the receiving port * is added to the run loop to get data. */ loop = GSRunLoopForThread(nil); IrunLoops = [[NSMutableArray alloc] initWithObjects: &loop count: 1]; IrequestModes = [[NSMutableArray alloc] initWithCapacity: 2]; [self addRequestMode: NSDefaultRunLoopMode]; [self addRequestMode: NSConnectionReplyMode]; IuseKeepalive = NO; /* * If we have no parent, we must handle incoming packets on our * receive port ourself - so we set ourself up as the port delegate. */ [IreceivePort setDelegate: self]; } /* Ask the delegate for permission, (OpenStep-style and GNUstep-style). */ /* Preferred MacOS-X version, which just allows the returning of BOOL */ del = [parent delegate]; if ([del respondsToSelector: @selector(connection:shouldMakeNewConnection:)]) { if ([del connection: parent shouldMakeNewConnection: self] == NO) { GSM_UNLOCK(connection_table_gate); DESTROY(self); return nil; } } /* Deprecated OpenStep version, which just allows the returning of BOOL */ if ([del respondsToSelector: @selector(makeNewConnection:sender:)]) { if (![del makeNewConnection: self sender: parent]) { GSM_UNLOCK(connection_table_gate); DESTROY(self); return nil; } } /* Here is the GNUstep version, which allows the delegate to specify a substitute. Note: The delegate is responsible for freeing newConn if it returns something different. */ if ([del respondsToSelector: @selector(connection:didConnect:)]) { self = [del connection: parent didConnect: self]; } nCenter = [NSNotificationCenter defaultCenter]; /* * Register ourselves for invalidation notification when the * ports become invalid. */ [nCenter addObserver: self selector: @selector(_portIsInvalid:) name: NSPortDidBecomeInvalidNotification object: r]; if (s != nil) { [nCenter addObserver: self selector: @selector(_portIsInvalid:) name: NSPortDidBecomeInvalidNotification object: s]; } /* In order that connections may be deallocated - there is an implementation of [-release] to automatically remove the connection from this array when it is the only thing retaining it. */ NSHashInsert(connection_table, (void*)self); GSM_UNLOCK(connection_table_gate); [nCenter postNotificationName: NSConnectionDidInitializeNotification object: self]; return self; } /** * Marks the receiving NSConnection as invalid. *
* Removes the NSConnections ports from any run loops. *
* Posts an NSConnectionDidDieNotification. *
* Invalidates all remote objects and local proxies. */ - (void) invalidate { GS_M_LOCK(IrefGate); if (IisValid == NO) { GSM_UNLOCK(IrefGate); return; } if (IshuttingDown == NO) { IshuttingDown = YES; /* * Not invalidated as a result of a shutdown from the other end, * so tell the other end it must shut down. */ //[self _shutdown]; } IisValid = NO; GS_M_LOCK(connection_table_gate); NSHashRemove(connection_table, self); GSM_UNLOCK(connection_table_gate); GSM_UNLOCK(IrefGate); /* * Don't need notifications any more - so remove self as observer. */ [[NSNotificationCenter defaultCenter] removeObserver: self]; /* * Make sure we are not registered. */ #if !defined(_WIN32) if ([IreceivePort isKindOfClass: [NSMessagePort class]]) { [self registerName: nil withNameServer: [NSMessagePortNameServer sharedInstance]]; } else #endif if ([IreceivePort isKindOfClass: [NSSocketPort class]]) { [self registerName: nil withNameServer: [NSSocketPortNameServer sharedInstance]]; } else { [self registerName: nil]; } /* * Withdraw from run loops. */ [self setRequestMode: nil]; IF_NO_ARC(RETAIN(self);) if (debug_connection) { NSLog(@"Invalidating connection %@", self); } /* * We need to notify any watchers of our death - but if we are already * in the deallocation process, we can't have a notification retaining * and autoreleasing us later once we are deallocated - so we do the * notification with a local autorelease pool to ensure that any release * is done before the deallocation completes. */ { NSAutoreleasePool *arp = [NSAutoreleasePool new]; [[NSNotificationCenter defaultCenter] postNotificationName: NSConnectionDidDieNotification object: self]; [arp drain]; } /* * If we have been invalidated, we don't need to retain proxies * for local objects any more. In fact, we want to get rid of * these proxies in case they are keeping us retained when we * might otherwise de deallocated. */ GS_M_LOCK(IrefGate); if (IlocalTargets != 0) { NSMutableArray *targets; NSUInteger i = IlocalTargets->nodeCount; GSIMapEnumerator_t enumerator; GSIMapNode node; targets = [[NSMutableArray alloc] initWithCapacity: i]; enumerator = GSIMapEnumeratorForMap(IlocalTargets); node = GSIMapEnumeratorNextNode(&enumerator); while (node != 0) { [targets addObject: node->value.obj]; node = GSIMapEnumeratorNextNode(&enumerator); } while (i-- > 0) { [self removeLocalObject: [targets objectAtIndex: i]]; } RELEASE(targets); GSIMapEmptyMap(IlocalTargets); NSZoneFree(IlocalTargets->zone, (void*)IlocalTargets); IlocalTargets = 0; } if (IremoteProxies != 0) { GSIMapEmptyMap(IremoteProxies); NSZoneFree(IremoteProxies->zone, (void*)IremoteProxies); IremoteProxies = 0; } if (IlocalObjects != 0) { GSIMapEnumerator_t enumerator; GSIMapNode node; enumerator = GSIMapEnumeratorForMap(IlocalObjects); node = GSIMapEnumeratorNextNode(&enumerator); while (node != 0) { RELEASE(node->key.obj); node = GSIMapEnumeratorNextNode(&enumerator); } GSIMapEmptyMap(IlocalObjects); NSZoneFree(IlocalObjects->zone, (void*)IlocalObjects); IlocalObjects = 0; } GSM_UNLOCK(IrefGate); /* * If we are invalidated, we shouldn't be receiving any event and * should not need to be in any run loops. */ while ([IrunLoops count] > 0) { [self removeRunLoop: [IrunLoops lastObject]]; } /* * Invalidate the current conversation so we don't leak. */ if ([IsendPort isValid] == YES) { [[IsendPort conversation: IreceivePort] invalidate]; } RELEASE(self); } /** * Returns YES if the connection is valid, NO otherwise. * A connection is valid until it has been sent an -invalidate message. */ - (BOOL) isValid { return IisValid; } /** * Returns an array of all the local objects that have proxies at the * remote end of the connection because they have been sent over the * connection and not yet released by the far end. */ - (NSArray*) localObjects { NSArray *a; /* Don't assert (IisValid); */ GS_M_LOCK(IrefGate); if (IlocalObjects != 0) { GSIMapEnumerator_t enumerator; GSIMapNode node; NSMutableArray *c; enumerator = GSIMapEnumeratorForMap(IlocalObjects); node = GSIMapEnumeratorNextNode(&enumerator); c = [NSMutableArray arrayWithCapacity: IlocalObjects->nodeCount]; while (node != 0) { [c addObject: node->key.obj]; node = GSIMapEnumeratorNextNode(&enumerator); } a = c; } else { a = [NSArray array]; } GSM_UNLOCK(IrefGate); return a; } /** * Returns YES if the connection permits multiple threads to use it to * send requests, NO otherwise.
* See the -enableMultipleThreads method. */ - (BOOL) multipleThreadsEnabled { return ImultipleThreads; } /** * Returns the NSPort object on which incoming messages are received. */ - (NSPort*) receivePort { return IreceivePort; } /** * Simply invokes -registerName:withNameServer: * passing it the default system nameserver. */ - (BOOL) registerName: (NSString*)name { NSPortNameServer *svr = [NSPortNameServer systemDefaultPortNameServer]; return [self registerName: name withNameServer: svr]; } /** * Registers the receive port of the NSConnection as name and * unregisters the previous value (if any).
* Returns YES on success, NO on failure.
* On failure, the connection remains registered under the * previous name.
* Supply nil as name to unregister the NSConnection. */ - (BOOL) registerName: (NSString*)name withNameServer: (NSPortNameServer*)svr { BOOL result = YES; if (name != nil) { result = [svr registerPort: IreceivePort forName: name]; } if (result == YES) { if (IregisteredName != nil) { [InameServer removePort: IreceivePort forName: IregisteredName]; } ASSIGN(IregisteredName, name); ASSIGN(InameServer, svr); } return result; } - (oneway void) release { /* We lock the connection table while checking, to prevent * another thread from grabbing this connection while we are * checking it. * If we are going to deallocate the object, we first remove * it from the table so that no other thread will find it * and try to use it while it is being deallocated. */ GS_M_LOCK(connection_table_gate); if (NSDecrementExtraRefCountWasZero(self)) { NSHashRemove(connection_table, self); GSM_UNLOCK(connection_table_gate); [self dealloc]; } else { GSM_UNLOCK(connection_table_gate); } } /** * Returns an array of proxies to all the remote objects known to * the NSConnection. */ - (NSArray *) remoteObjects { NSMutableArray *c; /* Don't assert (IisValid); */ GS_M_LOCK(IrefGate); if (IremoteProxies != 0) { GSIMapEnumerator_t enumerator; GSIMapNode node; enumerator = GSIMapEnumeratorForMap(IremoteProxies); node = GSIMapEnumeratorNextNode(&enumerator); c = [NSMutableArray arrayWithCapacity: IremoteProxies->nodeCount]; while (node != 0) { [c addObject: node->key.obj]; node = GSIMapEnumeratorNextNode(&enumerator); } } else { c = [NSMutableArray array]; } GSM_UNLOCK(IrefGate); return c; } /** * Removes mode from the run loop modes used to receive incoming messages. */ - (void) removeRequestMode: (NSString*)mode { GS_M_LOCK(IrefGate); if (IrequestModes != nil && [IrequestModes containsObject: mode]) { NSUInteger c = [IrunLoops count]; while (c-- > 0) { NSRunLoop *loop = [IrunLoops objectAtIndex: c]; [IreceivePort removeConnection: self fromRunLoop: loop forMode: mode]; } [IrequestModes removeObject: mode]; } GSM_UNLOCK(IrefGate); } /** * Removes loop from the run loops used to receive incoming messages. */ - (void) removeRunLoop: (NSRunLoop*)loop { GS_M_LOCK(IrefGate); if (IrunLoops != nil) { NSUInteger pos = [IrunLoops indexOfObjectIdenticalTo: loop]; if (pos != NSNotFound) { NSUInteger c = [IrequestModes count]; while (c-- > 0) { NSString *mode = [IrequestModes objectAtIndex: c]; [IreceivePort removeConnection: self fromRunLoop: [IrunLoops objectAtIndex: pos] forMode: mode]; } [IrunLoops removeObjectAtIndex: pos]; } } GSM_UNLOCK(IrefGate); } /** * Returns the timeout interval used when waiting for a reply to * a request sent on the NSConnection. This value is inherited * from the parent connection or may be set using the -setReplyTimeout: * method.
* The default value is the maximum delay (effectively infinite). */ - (NSTimeInterval) replyTimeout { return IreplyTimeout; } /** * Returns an array of all the run loop modes that the NSConnection * uses when waiting for an incoming request. */ - (NSArray*) requestModes { NSArray *c; GS_M_LOCK(IrefGate); c = AUTORELEASE([IrequestModes copy]); GSM_UNLOCK(IrefGate); return c; } /** * Returns the timeout interval used when trying to send a request * on the NSConnection. This value is inherited from the parent * connection or may be set using the -setRequestTimeout: method.
* The default value is the maximum delay (effectively infinite). */ - (NSTimeInterval) requestTimeout { return IrequestTimeout; } /** * Returns the object that is made available by this connection * or by its parent (the object is associated with the receive port).
* Returns nil if no root object has been set. */ - (id) rootObject { return rootObjectForInPort(IreceivePort); } /** * Returns the proxy for the root object of the remote NSConnection.
* Generally you will wish to call [NSDistantObject-setProtocolForProxy:] * immediately after obtaining such a root proxy. */ - (NSDistantObject*) rootProxy { NSPortCoder *op; NSPortCoder *ip; NSDistantObject *newProxy = nil; int seq_num; NSParameterAssert(IreceivePort); NSParameterAssert(IisValid); NS_DURING { /* * If this is a server connection without a remote end, its root proxy * is the same as its root object. */ if (IreceivePort == IsendPort) { return [self rootObject]; } op = [self _newOutRmc: 0 generate: &seq_num reply: YES]; [self _sendOutRmc: op type: ROOTPROXY_REQUEST sequence: seq_num]; ip = [self _getReplyRmc: seq_num for: "rootproxy"]; [ip decodeValueOfObjCType: @encode(id) at: &newProxy]; [self _doneInRmc: ip]; } NS_HANDLER { /* The ports/connection may have been invalidated while getting the * root proxy ... if so we should return nil. */ newProxy = nil; } NS_ENDHANDLER return AUTORELEASE(newProxy); } /** * Removes the NSConnection from the current threads default * run loop, then creates a new thread and runs the NSConnection in it. */ - (void) runInNewThread { [self removeRunLoop: GSRunLoopForThread(nil)]; [NSThread detachNewThreadSelector: @selector(_runInNewThread) toTarget: self withObject: nil]; } /** * Returns the port on which the NSConnection sends messages. */ - (NSPort*) sendPort { return IsendPort; } /** * Sets the NSConnection's delegate (without retaining it).
* The delegate is able to control some of the NSConnection's * behavior by implementing methods in an informal protocol. */ - (void) setDelegate: (id)anObj { Idelegate = anObj; IauthenticateIn = [anObj respondsToSelector: @selector(authenticateComponents:withData:)]; IauthenticateOut = [anObj respondsToSelector: @selector(authenticationDataForComponents:)]; } /** * Sets whether or not the NSConnection should handle requests * arriving from the remote NSConnection atomically.
* By default, this is set to NO ... if set to YES then any messages * arriving while one message is being dealt with, will be queued.
* NB. careful - use of this option can cause deadlocks. */ - (void) setIndependentConversationQueueing: (BOOL)flag { IindependentQueueing = flag; } /** * Sets the time interval that the NSConnection will wait for a * reply for one of its requests before raising an * NSPortTimeoutException.
* NB. In GNUstep you may also get such an exception if the connection * becomes invalidated while waiting for a reply to a request. */ - (void) setReplyTimeout: (NSTimeInterval)to { if (to <= 0.0 || to > 1.0E12) to = 1.0E12; IreplyTimeout = to; } /** * Sets the runloop mode in which requests will be sent to the remote * end of the connection. Normally this is NSDefaultRunloopMode */ - (void) setRequestMode: (NSString*)mode { GS_M_LOCK(IrefGate); if (IrequestModes != nil) { while ([IrequestModes count] > 0 && [IrequestModes objectAtIndex: 0] != mode) { [self removeRequestMode: [IrequestModes objectAtIndex: 0]]; } while ([IrequestModes count] > 1) { [self removeRequestMode: [IrequestModes objectAtIndex: 1]]; } if (mode != nil && [IrequestModes count] == 0) { [self addRequestMode: mode]; } } GSM_UNLOCK(IrefGate); } /** * Sets the time interval that the NSConnection will wait to send * one of its requests before raising an NSPortTimeoutException. */ - (void) setRequestTimeout: (NSTimeInterval)to { if (to <= 0.0 || to > 1.0E12) to = 1.0E12; IrequestTimeout = to; } /** * Sets the root object that is vended by the connection. */ - (void) setRootObject: (id)anObj { setRootObjectForInPort(anObj, IreceivePort); #if defined(_WIN32) /* On ms-windows, the operating system does not inform us when the remote * client of a message port goes away ... so we need to enable keepalive * to detect that condition. */ if ([IreceivePort isKindOfClass: [NSMessagePort class]]) { [self _enableKeepalive]; } #endif } /** * Returns an object containing various statistics for the * NSConnection. *
* On GNUstep the dictionary contains - * * NSConnectionRepliesReceived * * The number of messages replied to by the remote NSConnection. * * NSConnectionRepliesSent * * The number of replies sent to the remote NSConnection. * * NSConnectionRequestsReceived * * The number of messages received from the remote NSConnection. * * NSConnectionRequestsSent * * The number of messages sent to the remote NSConnection. * * NSConnectionLocalCount * * The number of local objects currently vended. * * NSConnectionProxyCount * * The number of remote objects currently in use. * * */ - (NSDictionary*) statistics { NSMutableDictionary *d; id o; d = [NSMutableDictionary dictionaryWithCapacity: 8]; GS_M_LOCK(IrefGate); /* * These are in OPENSTEP 4.2 */ o = [NSNumber numberWithUnsignedInt: IrepInCount]; [d setObject: o forKey: NSConnectionRepliesReceived]; o = [NSNumber numberWithUnsignedInt: IrepOutCount]; [d setObject: o forKey: NSConnectionRepliesSent]; o = [NSNumber numberWithUnsignedInt: IreqInCount]; [d setObject: o forKey: NSConnectionRequestsReceived]; o = [NSNumber numberWithUnsignedInt: IreqOutCount]; [d setObject: o forKey: NSConnectionRequestsSent]; /* * These are GNUstep extras */ o = [NSNumber numberWithUnsignedInt: IlocalTargets ? IlocalTargets->nodeCount : 0]; [d setObject: o forKey: NSConnectionLocalCount]; o = [NSNumber numberWithUnsignedInt: IremoteProxies ? IremoteProxies->nodeCount : 0]; [d setObject: o forKey: NSConnectionProxyCount]; o = [NSNumber numberWithUnsignedInt: IreplyMap ? IreplyMap->nodeCount : 0]; [d setObject: o forKey: @"NSConnectionReplyQueue"]; o = [NSNumber numberWithUnsignedInt: [IrequestQueue count]]; [d setObject: o forKey: @"NSConnectionRequestQueue"]; GSM_UNLOCK(IrefGate); return d; } @end @implementation NSConnection (GNUstepExtensions) + (NSConnection*) newRegisteringAtName: (NSString*)name withRootObject: (id)anObject { NSConnection *conn; GSOnceMLog(@"This method is deprecated, use standard initialisation"); conn = [[self alloc] initWithReceivePort: [NSPort port] sendPort: nil]; [conn setRootObject: anObject]; if ([conn registerName: name] == NO) { DESTROY(conn); } return conn; } - (void) finalize { NSAutoreleasePool *arp = [NSAutoreleasePool new]; if (debug_connection) NSLog(@"finalising %@", self); [self invalidate]; /* Remove rootObject from root_object_map if this is last connection */ if (IreceivePort != nil && existingConnection(IreceivePort, nil) == nil) { setRootObjectForInPort(nil, IreceivePort); } /* Remove receive port from run loop. */ [self setRequestMode: nil]; DESTROY(IrequestModes); DESTROY(IrunLoops); /* * Finished with ports - releasing them may generate a notification * If we are the receive port delagate, try to shift responsibility. */ if ([IreceivePort delegate] == self) { NSConnection *root = existingConnection(IreceivePort, IreceivePort); if (root == nil) { root = existingConnection(IreceivePort, nil); } [IreceivePort setDelegate: root]; } DESTROY(IreceivePort); DESTROY(IsendPort); DESTROY(IrequestQueue); if (IreplyMap != 0) { GSIMapEnumerator_t enumerator; GSIMapNode node; enumerator = GSIMapEnumeratorForMap(IreplyMap); node = GSIMapEnumeratorNextNode(&enumerator); while (node != 0) { if (node->value.obj != dummyObject) { RELEASE(node->value.obj); } node = GSIMapEnumeratorNextNode(&enumerator); } GSIMapEmptyMap(IreplyMap); NSZoneFree(IreplyMap->zone, (void*)IreplyMap); IreplyMap = 0; } DESTROY(IcachedDecoders); DESTROY(IcachedEncoders); DESTROY(IremoteName); DESTROY(IrefGate); [arp drain]; } /* * NSDistantObject's -forwardInvocation: method calls this to send the message * over the wire. */ - (void) forwardInvocation: (NSInvocation*)inv forProxy: (NSDistantObject*)object { NSPortCoder *op; BOOL outParams; BOOL needsResponse; const char *name; const char *type; unsigned seq; NSRunLoop *runLoop = GSRunLoopForThread(nil); if ([IrunLoops indexOfObjectIdenticalTo: runLoop] == NSNotFound) { if (ImultipleThreads == NO) { [NSException raise: NSObjectInaccessibleException format: @"Forwarding message for %p in wrong thread - %@", object, inv]; } else { [self addRunLoop: runLoop]; } } /* Encode the method on an RMC, and send it. */ NSParameterAssert (IisValid); /* get the method types from the selector */ type = [[inv methodSignature] methodType]; if (type == 0 || *type == '\0') { type = [[object methodSignatureForSelector: [inv selector]] methodType]; if (type) { GSSelectorFromNameAndTypes(sel_getName([inv selector]), type); } } NSParameterAssert(type); NSParameterAssert(*type); op = [self _newOutRmc: 0 generate: (int*)&seq reply: YES]; if (debug_connection > 4) NSLog(@"building packet seq %d", seq); [inv setTarget: object]; outParams = [inv encodeWithDistantCoder: op passPointers: NO]; if (outParams == YES) { needsResponse = YES; } else { int flags; needsResponse = NO; flags = objc_get_type_qualifiers(type); if ((flags & _F_ONEWAY) == 0) { needsResponse = YES; } else { const char *tmptype = objc_skip_type_qualifiers(type); if (*tmptype != _C_VOID) { needsResponse = YES; } } } [self _sendOutRmc: op type: METHOD_REQUEST sequence: seq]; name = sel_getName([inv selector]); NSDebugMLLog(@"RMC", @"Sent message %s RMC %d to %p", name, seq, self); if (needsResponse == NO) { GSIMapNode node; /* * Since we don't need a response, we can remove the placeholder from * the IreplyMap. However, in case the other end has already sent us * a response, we must check for it and scrap it if necessary. */ GS_M_LOCK(IrefGate); node = GSIMapNodeForKey(IreplyMap, (GSIMapKey)(NSUInteger)seq); if (node != 0 && node->value.obj != dummyObject) { BOOL is_exception = NO; [node->value.obj decodeValueOfObjCType: @encode(BOOL) at: &is_exception]; if (is_exception == YES) { /* Decode the exception object, and log it. */ id exc = [node->value.obj decodeObject]; NSLog(@"%@ got exception from oneway method %s - %@", self, name, exc); } else { NSLog(@"%@ got response from oneway method %s", self, name); } [self _doneInRmc: node->value.obj]; } GSIMapRemoveKey(IreplyMap, (GSIMapKey)(NSUInteger)seq); GSM_UNLOCK(IrefGate); } else { int argnum; int flags; const char *tmptype; void *datum; NSPortCoder *aRmc; BOOL is_exception; if ([self isValid] == NO) { [NSException raise: NSGenericException format: @"connection waiting for request was shut down"]; } aRmc = [self _getReplyRmc: seq for: name]; /* * Find out if the server is returning an exception instead * of the return values. */ [aRmc decodeValueOfObjCType: @encode(BOOL) at: &is_exception]; if (is_exception == YES) { /* Decode the exception object, and raise it. */ id exc = [aRmc decodeObject]; [self _doneInReply: aRmc]; [exc raise]; } /* Get the return type qualifier flags, and the return type. */ flags = objc_get_type_qualifiers(type); tmptype = objc_skip_type_qualifiers(type); /* Decode the return value and pass-by-reference values, if there are any. OUT_PARAMETERS should be the value returned by cifframe_dissect_call(). */ if (outParams || *tmptype != _C_VOID || (flags & _F_ONEWAY) == 0) /* xxx What happens with method declared "- (oneway) foo: (out int*)ip;" */ /* xxx What happens with method declared "- (in char *) bar;" */ /* xxx Is this right? Do we also have to check _F_ONEWAY? */ { id obj; /* If there is a return value, decode it, and put it in datum. */ if (*tmptype != _C_VOID || (flags & _F_ONEWAY) == 0) { switch (*tmptype) { case _C_ID: datum = &obj; [aRmc decodeValueOfObjCType: tmptype at: datum]; [obj autorelease]; break; case _C_PTR: /* We are returning a pointer to something. */ tmptype++; datum = alloca (objc_sizeof_type (tmptype)); [aRmc decodeValueOfObjCType: tmptype at: datum]; break; case _C_VOID: datum = alloca (sizeof (int)); [aRmc decodeValueOfObjCType: @encode(int) at: datum]; break; default: datum = alloca (objc_sizeof_type (tmptype)); [aRmc decodeValueOfObjCType: tmptype at: datum]; break; } } else { datum = 0; } [inv setReturnValue: datum]; /* Decode the values returned by reference. Note: this logic must match exactly the code in _service_forwardForProxy: */ if (outParams) { /* Step through all the arguments, finding the ones that were passed by reference. */ for (tmptype = skip_argspec (tmptype), argnum = 0; *tmptype != '\0'; tmptype = skip_argspec (tmptype), argnum++) { /* Get the type qualifiers, like IN, OUT, INOUT, ONEWAY. */ flags = objc_get_type_qualifiers(tmptype); /* Skip over the type qualifiers, so now TYPE is pointing directly at the char corresponding to the argument's type. */ tmptype = objc_skip_type_qualifiers(tmptype); if (*tmptype == _C_PTR && ((flags & _F_OUT) || !(flags & _F_IN))) { /* If the arg was byref, we obtain its address * and decode the data directly to it. */ tmptype++; [inv getArgument: &datum atIndex: argnum]; [aRmc decodeValueOfObjCType: tmptype at: datum]; if (*tmptype == _C_ID) { [*(id*)datum autorelease]; } } else if (*tmptype == _C_CHARPTR && ((flags & _F_OUT) || !(flags & _F_IN))) { [aRmc decodeValueOfObjCType: tmptype at: &datum]; [inv setArgument: datum atIndex: argnum]; } } } } [self _doneInReply: aRmc]; } } - (const char *) typeForSelector: (SEL)sel remoteTarget: (unsigned)target { id op, ip; char *type = 0; int seq_num; NSData *data; NSParameterAssert(IreceivePort); NSParameterAssert (IisValid); op = [self _newOutRmc: 0 generate: &seq_num reply: YES]; [op encodeValueOfObjCType: ":" at: &sel]; [op encodeValueOfObjCType: @encode(unsigned) at: &target]; [self _sendOutRmc: op type: METHODTYPE_REQUEST sequence: seq_num]; ip = [self _getReplyRmc: seq_num for: "methodtype"]; [ip decodeValueOfObjCType: @encode(char*) at: &type]; data = type ? [NSData dataWithBytes: type length: strlen(type)+1] : nil; [self _doneInRmc: ip]; return (const char*)[data bytes]; } /* Class-wide stats and collections. */ + (unsigned) connectionsCount { unsigned result; GS_M_LOCK(connection_table_gate); result = NSCountHashTable(connection_table); GSM_UNLOCK(connection_table_gate); return result; } + (unsigned) connectionsCountWithInPort: (NSPort*)aPort { unsigned count = 0; NSHashEnumerator enumerator; NSConnection *o; GS_M_LOCK(connection_table_gate); enumerator = NSEnumerateHashTable(connection_table); while ((o = (NSConnection*)NSNextHashEnumeratorItem(&enumerator)) != nil) { if ([aPort isEqual: [o receivePort]]) { count++; } } NSEndHashTableEnumeration(&enumerator); GSM_UNLOCK(connection_table_gate); return count; } @end @implementation NSConnection (Private) - (void) handlePortMessage: (NSPortMessage*)msg { NSPortCoder *rmc; int type = [msg msgid]; NSMutableArray *components = [msg _components]; NSPort *rp = [msg receivePort]; NSPort *sp = [msg sendPort]; NSConnection *conn; if (debug_connection > 4) { NSLog(@"handling packet of type %d (%@)", type, stringFromMsgType(type)); } conn = [connectionClass connectionWithReceivePort: rp sendPort: sp]; if (conn == nil) { NSLog(@"Received port message for unknown connection - %@", msg); NSLog(@"All connections: %@", [NSConnection allConnections]); return; } else if ([conn isValid] == NO) { if (debug_connection) { NSLog(@"received port message for invalid connection - %@", msg); } return; } if (debug_connection > 4) { NSLog(@" connection is %@", conn); } if (GSIVar(conn, _authenticateIn) == YES && (type == METHOD_REQUEST || type == METHOD_REPLY)) { NSData *d; NSUInteger count = [components count]; d = RETAIN([components objectAtIndex: --count]); [components removeObjectAtIndex: count]; if ([[conn delegate] authenticateComponents: components withData: d] == NO) { RELEASE(d); [NSException raise: NSFailedAuthenticationException format: @"message not authenticated by delegate"]; } RELEASE(d); } rmc = [conn _newInRmc: components]; if (debug_connection > 5) { NSLog(@"made rmc %p for %d", rmc, type); } switch (type) { case ROOTPROXY_REQUEST: /* It won't take much time to handle this, so go ahead and service it, even if we are waiting for a reply. */ [conn _service_rootObject: rmc]; break; case METHODTYPE_REQUEST: /* It won't take much time to handle this, so go ahead and service it, even if we are waiting for a reply. */ [conn _service_typeForSelector: rmc]; break; case METHOD_REQUEST: /* * We just got a new request; we need to decide whether to queue * it or service it now. * If the REPLY_DEPTH is 0, then we aren't in the middle of waiting * for a reply, we are waiting for requests---so service it now. * If REPLY_DEPTH is non-zero, we may still want to service it now * if independent_queuing is NO. */ GS_M_LOCK(GSIVar(conn, _refGate)); if (GSIVar(conn, _requestDepth) == 0 || GSIVar(conn, _independentQueueing) == NO) { GSIVar(conn, _requestDepth)++; GSM_UNLOCK(GSIVar(conn, _refGate)); [conn _service_forwardForProxy: rmc]; // Catches exceptions GS_M_LOCK(GSIVar(conn, _refGate)); GSIVar(conn, _requestDepth)--; } else { [GSIVar(conn, _requestQueue) addObject: rmc]; } /* * Service any requests that were queued while we * were waiting for replies. */ while (GSIVar(conn, _requestDepth) == 0 && [GSIVar(conn, _requestQueue) count] > 0) { rmc = [GSIVar(conn, _requestQueue) objectAtIndex: 0]; [GSIVar(conn, _requestQueue) removeObjectAtIndex: 0]; GSM_UNLOCK(GSIVar(conn, _refGate)); [conn _service_forwardForProxy: rmc]; // Catches exceptions GS_M_LOCK(GSIVar(conn, _refGate)); } GSM_UNLOCK(GSIVar(conn, _refGate)); break; /* * For replies, we read the sequence number from the reply object and * store it in a map using thee sequence number as the key. That way * it's easy for the connection to find replies by their numbers. */ case ROOTPROXY_REPLY: case METHOD_REPLY: case METHODTYPE_REPLY: case RETAIN_REPLY: { int sequence; GSIMapNode node; [rmc decodeValueOfObjCType: @encode(int) at: &sequence]; if (type == ROOTPROXY_REPLY && GSIVar(conn, _keepaliveWait) == YES && sequence == GSIVar(conn, _lastKeepalive)) { GSIVar(conn, _keepaliveWait) = NO; NSDebugMLLog(@"NSConnection", @"Handled keepalive %d on %@", sequence, conn); [self _doneInRmc: rmc]; break; } GS_M_LOCK(GSIVar(conn, _refGate)); node = GSIMapNodeForKey(GSIVar(conn, _replyMap), (GSIMapKey)(NSUInteger)sequence); if (node == 0) { NSDebugMLLog(@"NSConnection", @"Ignoring reply RMC %d on %@", sequence, conn); [self _doneInRmc: rmc]; } else if (node->value.obj == dummyObject) { NSDebugMLLog(@"NSConnection", @"Saving reply RMC %d on %@", sequence, conn); node->value.obj = rmc; } else { NSDebugMLLog(@"NSConnection", @"Replace reply RMC %d on %@", sequence, conn); [self _doneInRmc: node->value.obj]; node->value.obj = rmc; } GSM_UNLOCK(GSIVar(conn, _refGate)); } break; case CONNECTION_SHUTDOWN: { [conn _service_shutdown: rmc]; break; } case PROXY_RELEASE: { [conn _service_release: rmc]; break; } case PROXY_RETAIN: { [conn _service_retain: rmc]; break; } default: [NSException raise: NSGenericException format: @"unrecognized NSPortCoder identifier"]; } } - (void) _runInNewThread { NSRunLoop *loop = GSRunLoopForThread(nil); [self addRunLoop: loop]; [loop run]; } + (int) setDebug: (int)val { int old = debug_connection; debug_connection = val; return old; } - (void) _keepalive: (NSNotification*)n { if ([self isValid]) { if (IkeepaliveWait == NO) { NSPortCoder *op; /* Send out a root proxy request to ping the other end. */ op = [self _newOutRmc: 0 generate: &IlastKeepalive reply: NO]; IkeepaliveWait = YES; [self _sendOutRmc: op type: ROOTPROXY_REQUEST sequence: IlastKeepalive]; } else { /* keepalive timeout outstanding still. */ [self invalidate]; } } } /** */ - (void) _enableKeepalive { IuseKeepalive = YES; /* Set so that child connections will inherit. */ IkeepaliveWait = NO; if (IreceivePort !=IsendPort) { /* If this is not a listening connection, we actually enable the * keepalive timing (usng the regular housekeeping notifications) * and must also enable multiple thread support as the keepalive * notification may arrive in a different thread from the one we * are running in. */ [self enableMultipleThreads]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(_keepalive:) name: @"GSHousekeeping" object: nil]; } } /* NSConnection calls this to service the incoming method request. */ - (void) _service_forwardForProxy: (NSPortCoder*)aRmc { char *forward_type = 0; NSPortCoder *decoder = nil; NSPortCoder *encoder = nil; NSInvocation *inv = nil; unsigned seq; /* Save this for later */ [aRmc decodeValueOfObjCType: @encode(int) at: &seq]; /* * Make sure don't let exceptions caused by servicing the client's * request cause us to crash. */ NS_DURING { NSRunLoop *runLoop = GSRunLoopForThread(nil); const char *type; const char *tmptype; const char *etmptype; id tmp; id target; SEL selector; BOOL is_exception = NO; BOOL is_async = NO; BOOL is_void = NO; unsigned flags; int argnum; unsigned in_parameters = 0; unsigned out_parameters = 0; NSMethodSignature *sig; const char *encoded_types = forward_type; NSParameterAssert (IisValid); if ([IrunLoops indexOfObjectIdenticalTo: runLoop] == NSNotFound) { if (ImultipleThreads == YES) { [self addRunLoop: runLoop]; } else { [NSException raise: NSObjectInaccessibleException format: @"Message received in wrong thread"]; } } /* * Get the types that we're using, so that we know * exactly what qualifiers the forwarder used. * If all selectors included qualifiers and I could make * sel_types_match() work the way I wanted, we wouldn't need * to do this. */ [aRmc decodeValueOfObjCType: @encode(char*) at: &forward_type]; if (debug_connection > 1) { NSLog(@"Handling message (sig %s) RMC %d from %p", forward_type, seq, self); } IreqInCount++; /* Handling an incoming request. */ encoded_types = forward_type; etmptype = encoded_types; decoder = aRmc; /* Decode the object, (which is always the first argument to a method). * Use the -decodeObject method to ensure that the target of the * invocation is autoreleased and will be deallocated when we finish. */ target = [decoder decodeObject]; /* Decode the selector, (which is the second argument to a method). */ /* xxx @encode(SEL) produces "^v" in gcc 2.5.8. It should be ":" */ [decoder decodeValueOfObjCType: @encode(SEL) at: &selector]; /* Get the "selector type" for this method. The "selector type" is a string that lists the return and argument types, and also indicates in which registers and where on the stack the arguments should be placed before the method call. The selector type string we get here should have the same argument and return types as the ENCODED_TYPES string, but it will have different register and stack locations if the ENCODED_TYPES came from a machine of a different architecture. */ sig = [target methodSignatureForSelector: selector]; if (nil == sig) { [NSException raise: NSInvalidArgumentException format: @"decoded object %p doesn't handle %s", target, sel_getName(selector)]; } type = [sig methodType]; /* Make sure we successfully got the method type, and that its types match the ENCODED_TYPES. */ NSCParameterAssert (type); if (GSSelectorTypesMatch(encoded_types, type) == NO) { [NSException raise: NSInvalidArgumentException format: @"NSConection types (%s / %s) mismatch for %s", encoded_types, type, sel_getName(selector)]; } inv = [[NSInvocation alloc] initWithMethodSignature: sig]; tmptype = skip_argspec (type); etmptype = skip_argspec (etmptype); [inv setTarget: target]; tmptype = skip_argspec (tmptype); etmptype = skip_argspec (etmptype); [inv setSelector: selector]; /* Step TMPTYPE and ETMPTYPE in lock-step through their method type strings. */ for (tmptype = skip_argspec (tmptype), etmptype = skip_argspec (etmptype), argnum = 2; *tmptype != '\0'; tmptype = skip_argspec (tmptype), etmptype = skip_argspec (etmptype), argnum++) { void *datum; /* Get the type qualifiers, like IN, OUT, INOUT, ONEWAY. */ flags = objc_get_type_qualifiers (etmptype); /* Skip over the type qualifiers, so now TYPE is pointing directly at the char corresponding to the argument's type. */ tmptype = objc_skip_type_qualifiers(tmptype); /* Decide how, (or whether or not), to decode the argument depending on its FLAGS and TMPTYPE. Only the first two cases involve parameters that may potentially be passed by reference, and thus only the first two may change the value of OUT_PARAMETERS. *** Note: This logic must match exactly the code in cifframe_dissect_call(); that function should encode exactly what we decode here. *** */ switch (*tmptype) { case _C_CHARPTR: /* Handle a (char*) argument. */ /* If the char* is qualified as an OUT parameter, or if it not explicitly qualified as an IN parameter, then we will have to get this char* again after the method is run, because the method may have changed it. Set OUT_PARAMETERS accordingly. */ if ((flags & _F_OUT) || !(flags & _F_IN)) out_parameters++; else in_parameters++; /* If the char* is qualified as an IN parameter, or not explicity qualified as an OUT parameter, then decode it. Note: the decoder allocates memory for holding the string, and it is also responsible for making sure that the memory gets freed eventually, (usually through the autorelease of NSData object). */ if ((flags & _F_IN) || !(flags & _F_OUT)) { datum = alloca (sizeof(char*)); [decoder decodeValueOfObjCType: tmptype at: datum]; [inv setArgument: datum atIndex: argnum]; } break; case _C_PTR: /* If the pointer's value is qualified as an OUT parameter, or if it not explicitly qualified as an IN parameter, then we will have to get the value pointed to again after the method is run, because the method may have changed it. Set OUT_PARAMETERS accordingly. */ if ((flags & _F_OUT) || !(flags & _F_IN)) out_parameters++; else in_parameters++; /* Handle an argument that is a pointer to a non-char. But (void*) and (anything**) is not allowed. */ /* The argument is a pointer to something; increment TYPE so we can see what it is a pointer to. */ tmptype++; /* If the pointer's value is qualified as an IN parameter, or not explicity qualified as an OUT parameter, then decode it. */ if ((flags & _F_IN) || !(flags & _F_OUT)) { datum = alloca (objc_sizeof_type (tmptype)); [decoder decodeValueOfObjCType: tmptype at: datum]; [inv setArgument: &datum atIndex: argnum]; } break; default: in_parameters++; datum = alloca (objc_sizeof_type (tmptype)); if (*tmptype == _C_ID) { *(id*)datum = [decoder decodeObject]; } else { [decoder decodeValueOfObjCType: tmptype at: datum]; } [inv setArgument: datum atIndex: argnum]; } } /* Stop using the decoder. */ tmp = decoder; decoder = nil; [self _doneInRmc: tmp]; /* Get the qualifier type of the return value. */ flags = objc_get_type_qualifiers (encoded_types); /* Get the return type; store it our two temporary char*'s. */ etmptype = objc_skip_type_qualifiers (encoded_types); tmptype = objc_skip_type_qualifiers (type); if (_C_VOID == *tmptype) { is_void = YES; } /* If this is a oneway void with no out parameters, we don't need to * send back any response. */ if (YES == is_void && (flags & _F_ONEWAY) && !out_parameters) { is_async = YES; } NSDebugMLLog(@"RMC", @"RMC %d %s method '%s' on %p(%s)", seq, (YES == is_async) ? "async" : "invoke", selector ? sel_getName(selector) : "nil", target, target ? class_getName([target class]) : "nil"); /* Invoke the method! */ [inv invoke]; if (YES == is_async) { tmp = inv; inv = nil; [tmp release]; NS_VOIDRETURN; } /* It is possible that our connection died while the method was * being called - in this case we mustn't try to send the result * back to the remote application! */ if ([self isValid] == NO) { NSDebugMLLog(@"RMC", @"RMC %d invalidated ... no return", seq); tmp = inv; inv = nil; [tmp release]; NS_VOIDRETURN; } /* Encode the return value and pass-by-reference values, if there are any. This logic must match exactly that in cifframe_build_return(). */ /* OUT_PARAMETERS should be true here in exactly the same situations as it was true in cifframe_dissect_call(). */ /* We create a new coder object and encode a flag to * say that this is not an exception. */ encoder = [self _newOutRmc: seq generate: 0 reply: NO]; [encoder encodeValueOfObjCType: @encode(BOOL) at: &is_exception]; /* Only encode return values if there is a non-void return value, a non-oneway void return value, or if there are values that were passed by reference. */ if (YES == is_void) { if ((flags & _F_ONEWAY) == 0) { int dummy = 0; [encoder encodeValueOfObjCType: @encode(int) at: (void*)&dummy]; } /* No return value to encode; do nothing. */ } else { void *datum; if (*tmptype == _C_PTR) { /* The argument is a pointer to something; increment TYPE so we can see what it is a pointer to. */ tmptype++; datum = alloca (objc_sizeof_type (tmptype)); } else { datum = alloca (objc_sizeof_type (tmptype)); } [inv getReturnValue: datum]; [encoder encodeValueOfObjCType: tmptype at: datum]; } /* Encode the values returned by reference. Note: this logic must match exactly the code in cifframe_build_return(); that function should decode exactly what we encode here. */ if (out_parameters) { /* Step through all the arguments, finding the ones that were passed by reference. */ for (tmptype = skip_argspec (tmptype), argnum = 0, etmptype = skip_argspec (etmptype); *tmptype != '\0'; tmptype = skip_argspec (tmptype), argnum++, etmptype = skip_argspec (etmptype)) { /* Get the type qualifiers, like IN, OUT, INOUT, ONEWAY. */ flags = objc_get_type_qualifiers(etmptype); /* Skip over the type qualifiers, so now TYPE is pointing directly at the char corresponding to the argument's type. */ tmptype = objc_skip_type_qualifiers (tmptype); /* Decide how, (or whether or not), to encode the argument depending on its FLAGS and TMPTYPE. */ if (((flags & _F_OUT) || !(flags & _F_IN)) && (*tmptype == _C_PTR || *tmptype == _C_CHARPTR)) { void *datum; if (*tmptype == _C_PTR) { /* The argument is a pointer (to a non-char), and the pointer's value is qualified as an OUT parameter, or it not explicitly qualified as an IN parameter, then it is a pass-by-reference argument.*/ ++tmptype; [inv getArgument: &datum atIndex: argnum]; [encoder encodeValueOfObjCType: tmptype at: datum]; } else if (*tmptype == _C_CHARPTR) { datum = alloca (sizeof (char*)); [inv getArgument: datum atIndex: argnum]; [encoder encodeValueOfObjCType: tmptype at: datum]; } } } } tmp = inv; inv = nil; [tmp release]; tmp = encoder; encoder = nil; NSDebugMLLog(@"RMC", @"RMC %d replying with %s and %u out parameters", seq, (YES == is_void ? "void result" : "result"), out_parameters); [self _sendOutRmc: tmp type: METHOD_REPLY sequence: seq]; } NS_HANDLER { if (debug_connection > 3) NSLog(@"forwarding exception for (%@) - %@", self, localException); /* Send the exception back to the client. */ if (IisValid == YES) { BOOL is_exception = YES; NS_DURING { NSPortCoder *op; if (inv != nil) { [inv release]; } if (decoder != nil) { [self _failInRmc: decoder]; } if (encoder != nil) { [self _failOutRmc: encoder]; } op = [self _newOutRmc: seq generate: 0 reply: NO]; [op encodeValueOfObjCType: @encode(BOOL) at: &is_exception]; [op encodeBycopyObject: localException]; [self _sendOutRmc: op type: METHOD_REPLY sequence: seq]; } NS_HANDLER { NSLog(@"Exception when sending exception back to client - %@", localException); } NS_ENDHANDLER; } } NS_ENDHANDLER; } - (void) _service_rootObject: (NSPortCoder*)rmc { id rootObject = rootObjectForInPort(IreceivePort); int sequence; NSPortCoder *op; NSParameterAssert(IreceivePort); NSParameterAssert(IisValid); NSParameterAssert([rmc connection] == self); [rmc decodeValueOfObjCType: @encode(int) at: &sequence]; [self _doneInRmc: rmc]; op = [self _newOutRmc: sequence generate: 0 reply: NO]; [op encodeObject: rootObject]; [self _sendOutRmc: op type: ROOTPROXY_REPLY sequence: sequence]; } - (void) _service_release: (NSPortCoder*)rmc { unsigned int count; unsigned int pos; int sequence; NSParameterAssert (IisValid); [rmc decodeValueOfObjCType: @encode(int) at: &sequence]; [rmc decodeValueOfObjCType: @encode(__typeof__(count)) at: &count]; for (pos = 0; pos < count; pos++) { unsigned target; NSDistantObject *prox; [rmc decodeValueOfObjCType: @encode(__typeof__(target)) at: &target]; prox = [self includesLocalTarget: target]; if (prox != 0) { if (debug_connection > 3) NSLog(@"releasing object with target (0x%x) on (%@) counter %d", target, self, prox->_counter); GS_M_LOCK(IrefGate); NS_DURING { if (--(prox->_counter) == 0) { id rootObject = rootObjectForInPort(IreceivePort); if (rootObject == prox->_object) { /* Don't deallocate root object ... */ prox->_counter = 0; } else { [self removeLocalObject: (id)prox]; } } } NS_HANDLER { GSM_UNLOCK(IrefGate); [localException raise]; } NS_ENDHANDLER GSM_UNLOCK(IrefGate); } else if (debug_connection > 3) NSLog(@"releasing object with target (0x%x) on (%@) - nothing to do", target, self); } [self _doneInRmc: rmc]; } - (void) _service_retain: (NSPortCoder*)rmc { unsigned target; NSPortCoder *op; int sequence; NSDistantObject *local; NSString *response = nil; NSParameterAssert (IisValid); [rmc decodeValueOfObjCType: @encode(int) at: &sequence]; op = [self _newOutRmc: sequence generate: 0 reply: NO]; [rmc decodeValueOfObjCType: @encode(__typeof__(target)) at: &target]; [self _doneInRmc: rmc]; if (debug_connection > 3) NSLog(@"looking to retain local object with target (0x%x) on (%@)", target, self); GS_M_LOCK(IrefGate); local = [self locateLocalTarget: target]; if (local == nil) { response = @"target not found anywhere"; } else { local->_counter++; // Vended on connection. } GSM_UNLOCK(IrefGate); [op encodeObject: response]; [self _sendOutRmc: op type: RETAIN_REPLY sequence: sequence]; } - (void) _shutdown { NSParameterAssert(IreceivePort); NSParameterAssert (IisValid); NS_DURING { NSPortCoder *op; int sno; op = [self _newOutRmc: 0 generate: &sno reply: NO]; [self _sendOutRmc: op type: CONNECTION_SHUTDOWN sequence: sno]; } NS_HANDLER NS_ENDHANDLER } - (void) _service_shutdown: (NSPortCoder*)rmc { NSParameterAssert (IisValid); IshuttingDown = YES; // Prevent shutdown being sent back to other end [self _doneInRmc: rmc]; [self invalidate]; } - (void) _service_typeForSelector: (NSPortCoder*)rmc { NSPortCoder *op; unsigned target; NSDistantObject *p; int sequence; id o; SEL sel; const char *type; struct objc_method* m; NSParameterAssert(IreceivePort); NSParameterAssert (IisValid); [rmc decodeValueOfObjCType: @encode(int) at: &sequence]; op = [self _newOutRmc: sequence generate: 0 reply: NO]; [rmc decodeValueOfObjCType: ":" at: &sel]; [rmc decodeValueOfObjCType: @encode(unsigned) at: &target]; [self _doneInRmc: rmc]; p = [self includesLocalTarget: target]; o = (p != nil) ? p->_object : nil; /* xxx We should make sure that TARGET is a valid object. */ /* Not actually a Proxy, but we avoid the warnings "id" would have made. */ m = GSGetMethod(object_getClass(o), sel, YES, YES); /* Perhaps I need to be more careful in the line above to get the version of the method types that has the type qualifiers in it. Search the protocols list. */ if (m) type = method_getTypeEncoding(m); else type = ""; [op encodeValueOfObjCType: @encode(char*) at: &type]; [self _sendOutRmc: op type: METHODTYPE_REPLY sequence: sequence]; } /* * Check the queue, then try to get it from the network by waiting * while we run the NSRunLoop. Raise exception if we don't get anything * before timing out. */ - (NSPortCoder*) _getReplyRmc: (int)sn for: (const char*)request { NSPortCoder *rmc = nil; GSIMapNode node = 0; NSDate *timeout_date = nil; NSTimeInterval delay_interval = 0.0; NSTimeInterval last_interval; NSTimeInterval maximum_interval; NSDate *delay_date = nil; NSDate *start_date = nil; NSRunLoop *runLoop; BOOL isLocked = NO; if (IisValid == NO) { [NSException raise: NSObjectInaccessibleException format: @"Connection has been invalidated for reply %d (%s)", sn, request]; } /* * If we have sent out a request on a run loop that we don't already * know about, it must be on a new thread - so if we have multipleThreads * enabled, we must add the run loop of the new thread so that we can * get the reply in this thread. */ runLoop = GSRunLoopForThread(nil); if ([IrunLoops indexOfObjectIdenticalTo: runLoop] == NSNotFound) { if (ImultipleThreads == YES) { [self addRunLoop: runLoop]; } else { [NSException raise: NSObjectInaccessibleException format: @"Waiting for reply %d (%s) in wrong thread", sn, request]; } } if (ImultipleThreads == YES) { /* Since multiple threads are using this connection, another * thread may read the reply we are waiting for - so we must * break out of the runloop frequently to check. We do this * by setting a small delay and increasing it each time round * so that this semi-busy wait doesn't consume too much * processor time (I hope). * We set an upper limit on the delay to avoid responsiveness * problems. */ last_interval = 0.0001; maximum_interval = 1.0; } else { /* As the connection is single threaded, we can wait indefinitely * for a response ... but we recheck every five minutes anyway. */ last_interval = maximum_interval = 300.0; } NS_DURING { BOOL warned = NO; NSDebugMLLog(@"RMC", @"Waiting for reply RMC %d (%s) on %@", sn, request, self); GS_M_LOCK(IrefGate); isLocked = YES; while (IisValid == YES && (node = GSIMapNodeForKey(IreplyMap, (GSIMapKey)(NSUInteger)sn)) != 0 && node->value.obj == dummyObject) { NSDate *limit_date; GSM_UNLOCK(IrefGate); isLocked = NO; if (start_date == nil) { start_date = [dateClass allocWithZone: NSDefaultMallocZone()]; start_date = [start_date init]; timeout_date = [dateClass allocWithZone: NSDefaultMallocZone()]; timeout_date = [timeout_date initWithTimeIntervalSinceNow: IreplyTimeout]; } RELEASE(delay_date); delay_date = [dateClass allocWithZone: NSDefaultMallocZone()]; if (delay_interval < maximum_interval) { NSTimeInterval next_interval = last_interval + delay_interval; last_interval = delay_interval; delay_interval = next_interval; } delay_date = [delay_date initWithTimeIntervalSinceNow: delay_interval]; /* * We must not set a delay date that is further in the future * than the timeout date for the response to be returned. */ if ([timeout_date earlierDate: delay_date] == timeout_date) { limit_date = timeout_date; } else { limit_date = delay_date; } /* * If the runloop returns without having done anything, AND we * were waiting for the final timeout, then we must break out * of the loop. */ if (([runLoop runMode: NSConnectionReplyMode beforeDate: limit_date] == NO && (limit_date == timeout_date)) || [timeout_date timeIntervalSinceNow] <= 0.0) { GS_M_LOCK(IrefGate); isLocked = YES; node = GSIMapNodeForKey(IreplyMap, (GSIMapKey)(NSUInteger)sn); break; } else if (warned == NO && [start_date timeIntervalSinceNow] <= -300.0) { warned = YES; NSLog(@"WARNING ... waiting for reply %u (%s) since %@ on %@", sn, request, start_date, self); } GS_M_LOCK(IrefGate); isLocked = YES; } if (node == 0) { rmc = nil; } else { rmc = node->value.obj; GSIMapRemoveKey(IreplyMap, (GSIMapKey)(NSUInteger)sn); } GSM_UNLOCK(IrefGate); isLocked = NO; TEST_RELEASE(start_date); TEST_RELEASE(delay_date); TEST_RELEASE(timeout_date); if (rmc == nil) { [NSException raise: NSInternalInconsistencyException format: @"no reply available %d (%s)", sn, request]; } if (rmc == dummyObject) { if (IisValid == YES) { [NSException raise: NSPortTimeoutException format: @"timed out waiting for reply %d (%s)", sn, request]; } else { [NSException raise: NSInvalidReceivePortException format: @"invalidated while awaiting reply %d (%s)", sn, request]; } } } NS_HANDLER { if (isLocked == YES) { GSM_UNLOCK(IrefGate); } [localException raise]; } NS_ENDHANDLER NSDebugMLLog(@"RMC", @"Consuming reply RMC %d (%s) on %p", sn, request, self); return rmc; } - (void) _doneInReply: (NSPortCoder*)c { [self _doneInRmc: c]; IrepInCount++; } - (void) _doneInRmc: (NSPortCoder*) NS_CONSUMED c { GS_M_LOCK(IrefGate); if (debug_connection > 5) { NSLog(@"done rmc %p", c); } if (cacheCoders == YES && IcachedDecoders != nil) { [IcachedDecoders addObject: c]; } [c dispatch]; /* Tell NSPortCoder to release the connection. */ RELEASE(c); GSM_UNLOCK(IrefGate); } /* * This method called if an exception occurred, and we don't know * whether we have already tidied the NSPortCoder object up or not. */ - (void) _failInRmc: (NSPortCoder*)c { GS_M_LOCK(IrefGate); if (cacheCoders == YES && IcachedDecoders != nil && [IcachedDecoders indexOfObjectIdenticalTo: c] == NSNotFound) { [IcachedDecoders addObject: c]; } if (debug_connection > 5) { NSLog(@"fail rmc %p", c); } [c dispatch]; /* Tell NSPortCoder to release the connection. */ RELEASE(c); GSM_UNLOCK(IrefGate); } /* * This method called if an exception occurred, and we don't know * whether we have already tidied the NSPortCoder object up or not. */ - (void) _failOutRmc: (NSPortCoder*)c { GS_M_LOCK(IrefGate); if (cacheCoders == YES && IcachedEncoders != nil && [IcachedEncoders indexOfObjectIdenticalTo: c] == NSNotFound) { [IcachedEncoders addObject: c]; } [c dispatch]; /* Tell NSPortCoder to release the connection. */ RELEASE(c); GSM_UNLOCK(IrefGate); } - (NSPortCoder*) _newInRmc: (NSMutableArray*)components { NSPortCoder *coder; NSUInteger count; NSParameterAssert(IisValid); GS_M_LOCK(IrefGate); if (cacheCoders == YES && IcachedDecoders != nil && (count = [IcachedDecoders count]) > 0) { coder = RETAIN([IcachedDecoders objectAtIndex: --count]); [IcachedDecoders removeObjectAtIndex: count]; } else { coder = [recvCoderClass allocWithZone: NSDefaultMallocZone()]; } GSM_UNLOCK(IrefGate); coder = [coder initWithReceivePort: IreceivePort sendPort: IsendPort components: components]; return coder; } /* * Create an NSPortCoder object for encoding an outgoing message or reply. * * sno Is the seqence number to encode into the coder. * ret If non-null, generate a new sequence number and return it * here. Ignore the sequence number passed in sno. * rep If this flag is YES, add a placeholder to the IreplyMap * so we handle an incoming reply for this sequence number. */ - (NSPortCoder*) _newOutRmc: (int)sno generate: (int*)ret reply: (BOOL)rep { NSPortCoder *coder; NSUInteger count; NSParameterAssert(IisValid); GS_M_LOCK(IrefGate); /* * Generate a new sequence number if required. */ if (ret != 0) { sno = ImessageCount++; *ret = sno; } /* * Add a placeholder to the reply map if we expect a reply. */ if (rep == YES) { GSIMapAddPair(IreplyMap, (GSIMapKey)(NSUInteger)sno, (GSIMapVal)dummyObject); } /* * Locate or create an rmc */ if (cacheCoders == YES && IcachedEncoders != nil && (count = [IcachedEncoders count]) > 0) { coder = RETAIN([IcachedEncoders objectAtIndex: --count]); [IcachedEncoders removeObjectAtIndex: count]; } else { coder = [sendCoderClass allocWithZone: NSDefaultMallocZone()]; } GSM_UNLOCK(IrefGate); coder = [coder initWithReceivePort: IreceivePort sendPort:IsendPort components: nil]; [coder encodeValueOfObjCType: @encode(int) at: &sno]; NSDebugMLLog(@"NSConnection", @"Make out RMC %u on %@", sno, self); return coder; } - (void) _sendOutRmc: (NSPortCoder*)c type: (int)msgid sequence: (int)sno { NSDate *limit; BOOL sent = NO; BOOL raiseException = NO; NSMutableArray *components = [c _components]; if (IauthenticateOut == YES && (msgid == METHOD_REQUEST || msgid == METHOD_REPLY)) { NSData *d; d = [[self delegate] authenticationDataForComponents: components]; if (d == nil) { RELEASE(c); [NSException raise: NSGenericException format: @"Bad authentication data provided by delegate"]; } [components addObject: d]; } switch (msgid) { case PROXY_RETAIN: case CONNECTION_SHUTDOWN: case METHOD_REPLY: case ROOTPROXY_REPLY: case METHODTYPE_REPLY: case PROXY_RELEASE: case RETAIN_REPLY: raiseException = NO; break; case METHOD_REQUEST: case ROOTPROXY_REQUEST: case METHODTYPE_REQUEST: default: raiseException = YES; break; } NSDebugMLLog(@"NSConnection", @"Sending %d (%@) on %@", sno, stringFromMsgType(msgid), self); limit = [dateClass dateWithTimeIntervalSinceNow: IrequestTimeout]; sent = [IsendPort sendBeforeDate: limit msgid: msgid components: components from: IreceivePort reserved: [IsendPort reservedSpaceLength]]; GS_M_LOCK(IrefGate); /* * We replace the coder we have just used in the cache, and tell it not to * retain this connection any more. */ if (cacheCoders == YES && IcachedEncoders != nil) { [IcachedEncoders addObject: c]; } [c dispatch]; /* Tell NSPortCoder to release the connection. */ RELEASE(c); GSM_UNLOCK(IrefGate); if (sent == NO) { NSString *text = stringFromMsgType(msgid); if ([IsendPort isValid] == NO) { text = [text stringByAppendingFormat: @" - port was invalidated"]; } if (raiseException == YES) { [NSException raise: NSPortTimeoutException format: @"%@", text]; } else { NSLog(@"Port operation timed out - %@", text); } } else { switch (msgid) { case METHOD_REQUEST: IreqOutCount++; /* Sent a request. */ break; case METHOD_REPLY: IrepOutCount++; /* Sent back a reply. */ break; default: break; } } } /* Managing objects and proxies. */ - (void) addLocalObject: (NSDistantObject*)anObj { static unsigned local_object_counter = 0; id object; unsigned target; GSIMapNode node; GS_M_LOCK(IrefGate); NSParameterAssert (IisValid); object = anObj->_object; target = anObj->_handle; /* * If there is no target allocated to the proxy, we add one. */ if (target == 0) { anObj->_handle = target = ++local_object_counter; } /* * Record the value in the IlocalObjects map, retaining it. */ node = GSIMapNodeForKey(IlocalObjects, (GSIMapKey)object); NSAssert(node == 0, NSInternalInconsistencyException); node = GSIMapNodeForKey(IlocalTargets, (GSIMapKey)(NSUInteger)target); NSAssert(node == 0, NSInternalInconsistencyException); IF_NO_ARC([anObj retain];) GSIMapAddPair(IlocalObjects, (GSIMapKey)object, (GSIMapVal)((id)anObj)); GSIMapAddPair(IlocalTargets, (GSIMapKey)(NSUInteger)target, (GSIMapVal)((id)anObj)); if (debug_connection > 2) NSLog(@"add local object (%p) target (0x%x) " @"to connection (%@)", object, target, self); GSM_UNLOCK(IrefGate); } - (NSDistantObject*) retainOrAddLocal: (NSDistantObject*)proxy forObject: (id)object { GSIMapNode node; NSDistantObject *p; /* Don't assert (IisValid); */ GS_M_LOCK(IrefGate); node = GSIMapNodeForKey(IlocalObjects, (GSIMapKey)object); if (node == 0) { p = nil; } else { p = RETAIN(node->value.obj); DESTROY(proxy); } if (p == nil && proxy != nil) { p = proxy; [self addLocalObject: p]; } GSM_UNLOCK(IrefGate); return p; } - (void) removeLocalObject: (NSDistantObject*)prox { id anObj; unsigned target; unsigned val = 0; GSIMapNode node; GS_M_LOCK(IrefGate); anObj = prox->_object; node = GSIMapNodeForKey(IlocalObjects, (GSIMapKey)anObj); /* * The NSDistantObject concerned may not belong to this connection, * so we need to check that any matching proxy is identical to the * argument we were given. */ if (node != 0 && node->value.obj == prox) { target = prox->_handle; /* * If this proxy has been vended onwards to another process * which has not myet released it, we need to keep a reference * to the local object around for a while in case that other * process needs it. */ if ((prox->_counter) != 0) { CachedLocalObject *item; (prox->_counter) = 0; GS_M_LOCK(cached_proxies_gate); if (timer == nil) { timer = [NSTimer scheduledTimerWithTimeInterval: 1.0 target: connectionClass selector: @selector(_timeout:) userInfo: nil repeats: YES]; } item = [CachedLocalObject newWithObject: prox time: 5]; NSMapInsert(targetToCached, (void*)(uintptr_t)target, item); GSM_UNLOCK(cached_proxies_gate); RELEASE(item); if (debug_connection > 3) NSLog(@"placed local object (%p) target (0x%x) in cache", anObj, target); } /* * Remove the proxy from IlocalObjects and release it. */ GSIMapRemoveKey(IlocalObjects, (GSIMapKey)anObj); RELEASE(prox); /* * Remove the target info too - no release required. */ GSIMapRemoveKey(IlocalTargets, (GSIMapKey)(NSUInteger)target); if (debug_connection > 2) NSLog(@"removed local object (%p) target (0x%x) " @"from connection (%@) (ref %d)", anObj, target, self, val); } GSM_UNLOCK(IrefGate); } - (void) _release_target: (unsigned)target count: (unsigned)number { NS_DURING { /* * Tell the remote app that it can release its local objects * for the targets in the specified list since we don't have * proxies for them any more. */ if (IreceivePort != nil && IisValid == YES && number > 0) { id op; unsigned i; int sequence; op = [self _newOutRmc: 0 generate: &sequence reply: NO]; [op encodeValueOfObjCType: @encode(unsigned) at: &number]; for (i = 0; i < number; i++) { [op encodeValueOfObjCType: @encode(unsigned) at: &target]; if (debug_connection > 3) NSLog(@"sending release for target (0x%x) on (%@)", target, self); } [self _sendOutRmc: op type: PROXY_RELEASE sequence: sequence]; } } NS_HANDLER { if (debug_connection) NSLog(@"failed to release targets - %@", localException); } NS_ENDHANDLER } - (NSDistantObject*) locateLocalTarget: (unsigned)target { NSDistantObject *proxy = nil; GSIMapNode node; GS_M_LOCK(IrefGate); /* * Try a quick lookup to see if the target references a local object * belonging to the receiver ... usually it should. */ node = GSIMapNodeForKey(IlocalTargets, (GSIMapKey)(NSUInteger)target); if (node != 0) { proxy = node->value.obj; } /* * If the target doesn't exist in the receiver, but still * persists in the cache (ie it was recently released) then * we move it back from the cache to the receiver. */ if (proxy == nil) { CachedLocalObject *cached; GS_M_LOCK(cached_proxies_gate); cached = NSMapGet (targetToCached, (void*)(uintptr_t)target); if (cached != nil) { proxy = [cached obj]; /* * Found in cache ... add to this connection as the object * is no longer in use by any connection. */ ASSIGN(proxy->_connection, self); [self addLocalObject: proxy]; NSMapRemove(targetToCached, (void*)(uintptr_t)target); if (debug_connection > 3) NSLog(@"target (0x%x) moved from cache", target); } GSM_UNLOCK(cached_proxies_gate); } /* * If not found in the current connection or the cache of local references * of recently invalidated connections, try all other existing connections. */ if (proxy == nil) { NSHashEnumerator enumerator; NSConnection *c; GS_M_LOCK(connection_table_gate); enumerator = NSEnumerateHashTable(connection_table); while (proxy == nil && (c = (NSConnection*)NSNextHashEnumeratorItem(&enumerator)) != nil) { if (c != self && [c isValid] == YES) { GS_M_LOCK(GSIVar(c, _refGate)); node = GSIMapNodeForKey(GSIVar(c, _localTargets), (GSIMapKey)(NSUInteger)target); if (node != 0) { id local; unsigned nTarget; /* * We found the local object in use in another connection * so we create a new reference to the same object and * add it to our connection, adjusting the target of the * new reference to be the value we need. * * We don't want to just share the NSDistantObject with * the other connection, since we might want to keep * track of information on a per-connection basis in * order to handle connection shutdown cleanly. */ proxy = node->value.obj; local = RETAIN(proxy->_object); proxy = [NSDistantObject proxyWithLocal: local connection: self]; nTarget = proxy->_handle; GSIMapRemoveKey(IlocalTargets, (GSIMapKey)(NSUInteger)nTarget); proxy->_handle = target; GSIMapAddPair(IlocalTargets, (GSIMapKey)(NSUInteger)target, (GSIMapVal)((id)proxy)); } GSM_UNLOCK(GSIVar(c, _refGate)); } } NSEndHashTableEnumeration(&enumerator); GSM_UNLOCK(connection_table_gate); } GSM_UNLOCK(IrefGate); if (proxy == nil) { if (debug_connection > 3) NSLog(@"target (0x%x) not found anywhere", target); } return proxy; } - (void) vendLocal: (NSDistantObject*)aProxy { GS_M_LOCK(IrefGate); aProxy->_counter++; GSM_UNLOCK(IrefGate); } - (void) acquireProxyForTarget: (unsigned)target { NSDistantObject *found; GSIMapNode node; /* Don't assert (IisValid); */ GS_M_LOCK(IrefGate); node = GSIMapNodeForKey(IremoteProxies, (GSIMapKey)(NSUInteger)target); if (node == 0) { found = nil; } else { found = node->value.obj; } GSM_UNLOCK(IrefGate); if (found == nil) { NS_DURING { /* * Tell the remote app that it must retain the local object * for the target on this connection. */ if (IreceivePort && IisValid) { NSPortCoder *op; id ip; id result; int seq_num; op = [self _newOutRmc: 0 generate: &seq_num reply: YES]; [op encodeValueOfObjCType: @encode(__typeof__(target)) at: &target]; [self _sendOutRmc: op type: PROXY_RETAIN sequence: seq_num]; ip = [self _getReplyRmc: seq_num for: "retain"]; [ip decodeValueOfObjCType: @encode(id) at: &result]; [self _doneInRmc: ip]; if (result != nil) NSLog(@"failed to retain target - %@", result); else if (debug_connection > 3) NSLog(@"sending retain for target - %u", target); } } NS_HANDLER { NSLog(@"failed to retain target - %@", localException); } NS_ENDHANDLER } } - (id) retain { return [super retain]; } - (void) removeProxy: (NSDistantObject*)aProxy { GS_M_LOCK(IrefGate); if (IisValid == YES) { unsigned target; unsigned count = 1; GSIMapNode node; target = aProxy->_handle; node = GSIMapNodeForKey(IremoteProxies, (GSIMapKey)(NSUInteger)target); /* * Only remove if the proxy for the target is the same as the * supplied argument. */ if (node != 0 && node->value.obj == aProxy) { count = aProxy->_counter; GSIMapRemoveKey(IremoteProxies, (GSIMapKey)(NSUInteger)target); /* * Tell the remote application that we have removed our proxy and * it can release it's local object. */ [self _release_target: target count: count]; } } GSM_UNLOCK(IrefGate); } /** * Private method used only when a remote process/thread has sent us a * target which we are decoding into a proxy in this process/thread. *

The argument aProxy may be nil, in which case an existing proxy * matching aTarget is retrieved retained, and returned (this is done * when a proxy target is sent to us by a remote process). *

*

If aProxy is not nil, but a proxy with the same target already * exists, then aProxy is released and the existing proxy is returned * as in the case where aProxy was nil. *

*

If aProxy is not nil and there was no prior proxy with the same * target, aProxy is added to the receiver and returned. *

*/ - (NSDistantObject*) retainOrAddProxy: (NSDistantObject*)aProxy forTarget: (unsigned)aTarget { NSDistantObject *p; GSIMapNode node; /* Don't assert (IisValid); */ NSParameterAssert(aTarget > 0); NSParameterAssert(aProxy == nil || object_getClass(aProxy) == distantObjectClass); NSParameterAssert(aProxy == nil || [aProxy connectionForProxy] == self); NSParameterAssert(aProxy == nil || aTarget == aProxy->_handle); GS_M_LOCK(IrefGate); node = GSIMapNodeForKey(IremoteProxies, (GSIMapKey)(NSUInteger)aTarget); if (node == 0) { p = nil; } else { p = RETAIN(node->value.obj); DESTROY(aProxy); } if (p == nil && aProxy != nil) { p = aProxy; GSIMapAddPair(IremoteProxies, (GSIMapKey)(NSUInteger)aTarget, (GSIMapVal)((id)p)); } /* * Whether this is a new proxy or an existing proxy, this method is * only called for an object being vended by a remote process/thread. * We therefore need to increment the count of the number of times * the proxy has been vended. */ if (p != nil) { p->_counter++; } GSM_UNLOCK(IrefGate); return p; } - (id) includesLocalObject: (id)anObj { NSDistantObject *ret; GSIMapNode node; /* Don't assert (IisValid); */ GS_M_LOCK(IrefGate); node = GSIMapNodeForKey(IlocalObjects, (GSIMapKey)(NSUInteger)anObj); if (node == 0) { ret = nil; } else { ret = node->value.obj; } GSM_UNLOCK(IrefGate); return ret; } - (NSDistantObject*) includesLocalTarget: (unsigned)target { NSDistantObject *ret; GSIMapNode node; /* Don't assert (IisValid); */ GS_M_LOCK(IrefGate); node = GSIMapNodeForKey(IlocalTargets, (GSIMapKey)(NSUInteger)target); if (node == 0) { ret = nil; } else { ret = node->value.obj; } GSM_UNLOCK(IrefGate); return ret; } /* Prevent trying to encode the connection itself */ - (void) encodeWithCoder: (NSCoder*)anEncoder { [self shouldNotImplement: _cmd]; } - (id) initWithCoder: (NSCoder*)aDecoder; { [self shouldNotImplement: _cmd]; return self; } /* * We register this method for a notification when a port dies. * NB. It is possible that the death of a port could be notified * to us after we are invalidated - in which case we must ignore it. */ - (void) _portIsInvalid: (NSNotification*)notification { if (IisValid) { id port = [notification object]; if (debug_connection) { NSLog(@"Received port invalidation notification for " @"connection %@\n\t%@", self, port); } /* We shouldn't be getting any port invalidation notifications, except from our own ports; this is how we registered ourselves with the NSNotificationCenter in +newForInPort: outPort: ancestorConnection. */ NSParameterAssert (port == IreceivePort || port == IsendPort); [self invalidate]; } } /** * On thread exit, we need all connections to be removed from the runloop * of the thread or they will retain that and cause a memory leak. */ + (void) _threadWillExit: (NSNotification*)notification { NSRunLoop *runLoop = GSRunLoopForThread ([notification object]); if (runLoop != nil) { NSEnumerator *enumerator; NSConnection *c; GS_M_LOCK (connection_table_gate); enumerator = [NSAllHashTableObjects(connection_table) objectEnumerator]; GSM_UNLOCK (connection_table_gate); /* * We enumerate an array copy of the contents of the hash table * as we know we can do that safely outside the locked region. * The temporary array and the enumerator are autoreleased and * will be deallocated with the threads autorelease pool. */ while ((c = [enumerator nextObject]) != nil) { [c removeRunLoop: runLoop]; } } } @end gnustep-base-1.29.0/Source/NSCopyObject.m000066400000000000000000000024641435650067400201400ustar00rootroot00000000000000/** Implementation of NSCopyObject() for GNUStep Copyright (C) 1994, 1995 Free Software Foundation, Inc. Written by: Andrew Kachites McCallum Date: August 1994 This file is part of the GNUstep Base Library. 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 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 USA. NSCopyObject class reference $Date$ $Revision$ */ #import "common.h" NSObject *NSCopyObject(NSObject *anObject, NSUInteger extraBytes, NSZone *zone) { Class c = object_getClass(anObject); id copy = NSAllocateObject(c, extraBytes, zone); memcpy(copy, anObject, class_getInstanceSize(c) + extraBytes); return copy; } gnustep-base-1.29.0/Source/NSCountedSet.m000066400000000000000000000221551435650067400201530ustar00rootroot00000000000000/** NSCountedSet - CountedSet object Copyright (C) 1995, 1996 Free Software Foundation, Inc. Written by: Andrew Kachites McCallum Created: Sep 1995 This file is part of the GNUstep Base Library. 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 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 USA. NSCountedSet class reference $Date$ $Revision$ */ #import "common.h" #import "GNUstepBase/GSLock.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSSet.h" #import "Foundation/NSCoder.h" #import "Foundation/NSArray.h" #import "Foundation/NSLock.h" #import "Foundation/NSNotification.h" #import "Foundation/NSThread.h" @class GSCountedSet; @interface GSCountedSet : NSObject // Help the compiler @end /* * Class variables for uniquing objects; */ static NSRecursiveLock *uniqueLock = nil; static NSCountedSet *uniqueSet = nil; static IMP uniqueImp = 0; static IMP lockImp = 0; static IMP unlockImp = 0; static BOOL uniquing = NO; /** *

* The NSCountedSet class is used to maintain a set of objects * where the number of times each object has been added (without a * corresponding removal) is kept track of. *

*

* In GNUstep, the purge and unique methods * are provided to make use of a counted set for uniquing objects * easier. *

*/ @implementation NSCountedSet static Class NSCountedSet_abstract_class; static Class NSCountedSet_concrete_class; + (void) initialize { if (self == [NSCountedSet class]) { NSCountedSet_abstract_class = self; NSCountedSet_concrete_class = [GSCountedSet class]; uniqueLock = [NSRecursiveLock new]; [[NSObject leakAt: &uniqueLock] release]; lockImp = [uniqueLock methodForSelector: @selector(lock)]; unlockImp = [uniqueLock methodForSelector: @selector(unlock)]; } } + (id) allocWithZone: (NSZone*)z { if (self == NSCountedSet_abstract_class) { return NSAllocateObject(NSCountedSet_concrete_class, 0, z); } else { return NSAllocateObject(self, 0, z); } } - (NSUInteger) _countForObject: (id)anObject { return [self countForObject: anObject]; } /** * Returns the number of times that an object that is equal to the * specified object (as determined by the [-isEqual:] method) has * been added to the set and not removed from it. */ - (NSUInteger) countForObject: (id)anObject { [self subclassResponsibility: _cmd]; return 0; } - (id) copyWithZone: (NSZone*)z { return [[[self class] allocWithZone: z] initWithSet: self copyItems: YES]; } - (id) mutableCopyWithZone: (NSZone*)z { return [[[self class] allocWithZone: z] initWithSet: self copyItems: NO]; } - (id) initWithCoder: (NSCoder*)aCoder { unsigned count; Class c = object_getClass(self); if (c == NSCountedSet_abstract_class) { DESTROY(self); self = [NSCountedSet_concrete_class allocWithZone: NSDefaultMallocZone()]; return [self initWithCoder: aCoder]; } [aCoder decodeValueOfObjCType: @encode(unsigned) at: &count]; { id objs[count]; unsigned refs[count]; unsigned i; IMP addImp = [self methodForSelector: @selector(addObject:)]; for (i = 0; i < count; i++) { [aCoder decodeValueOfObjCType: @encode(id) at: &objs[i]]; [aCoder decodeValueOfObjCType: @encode(unsigned) at: &refs[i]]; } self = [self initWithObjects: objs count: count]; for (i = 0; i < count; i++) { unsigned j = refs[i]; while (j-- > 1) { (*addImp)(self, @selector(addObject:), objs[i]); } RELEASE(objs[i]); } } return self; } - (Class) classForCoder { return NSCountedSet_abstract_class; } - (void) encodeWithCoder: (NSCoder*)aCoder { unsigned count = [self count]; NSEnumerator *e = [self objectEnumerator]; id o; [aCoder encodeValueOfObjCType: @encode(unsigned) at: &count]; while ((o = [e nextObject]) != nil) { [aCoder encodeValueOfObjCType: @encode(id) at: &o]; count = [self countForObject: o]; [aCoder encodeValueOfObjCType: @encode(unsigned) at: &count]; } } - (id) initWithSet: (NSSet*)other copyItems: (BOOL)flag { unsigned c = [other count]; id os[c], o, e = [other objectEnumerator]; unsigned i = 0; NSZone *z = [self zone]; IMP next = [e methodForSelector: @selector(nextObject)]; while ((o = (*next)(e, @selector(nextObject))) != nil) { if (flag) os[i] = [o copyWithZone: z]; else os[i] = o; i++; } self = [self initWithObjects: os count: c]; if ([other isKindOfClass: NSCountedSet_abstract_class]) { unsigned j; IMP addImp = [self methodForSelector: @selector(addObject:)]; for (j = 0; j < i; j++) { unsigned extra = [(NSCountedSet*)other countForObject: os[j]]; while (extra-- > 1) (*addImp)(self, @selector(addObject:), os[j]); } } if (flag) while (i--) [os[i] release]; return self; } - (void) purge: (NSInteger)level { if (level > 0) { NSEnumerator *enumerator = [self objectEnumerator]; if (enumerator != nil) { id obj; id (*nImp)(NSEnumerator*, SEL); unsigned (*cImp)(NSCountedSet*, SEL, id); void (*rImp)(NSCountedSet*, SEL, id); nImp = (id (*)(NSEnumerator*, SEL)) [enumerator methodForSelector: @selector(nextObject)]; cImp = (unsigned (*)(NSCountedSet*, SEL, id)) [self methodForSelector: @selector(countForObject:)]; rImp = (void (*)(NSCountedSet*, SEL, id)) [self methodForSelector: @selector(removeObject:)]; while ((obj = (*nImp)(enumerator, @selector(nextObject))) != nil) { unsigned c = (*cImp)(self, @selector(countForObject:), obj); if (c <= (NSUInteger)level) { while (c-- > 0) { (*rImp)(self, @selector(removeObject:), obj); } } } } } } - (id) unique: (id)anObject { id o = [self member: anObject]; [self addObject: anObject]; if (o == nil) { o = anObject; } if (o != anObject) { [anObject release]; [o retain]; } return o; } @end /** * This function purges the global [NSCountedSet] object used for * uniquing. It handles locking as necessary. It can be used to * purge the set even when uniquing is turned off. */ void GSUPurge(NSUInteger count) { if (uniqueLock != nil) { (*lockImp)(uniqueLock, @selector(lock)); } [uniqueSet purge: count]; if (uniqueLock != nil) { (*unlockImp)(uniqueLock, @selector(unlock)); } } /** * This function sets the count for the specified object. If the * count for the object is set to zero then the object is removed * from the global uniquing set. The object is added to the set * if necessary. The object returned is the one stored in the set. * The function handles locking as necessary. It can be used to * alter the set even when uniquing is turned off. */ id GSUSet(id anObject, NSUInteger count) { id found; NSUInteger i; if (uniqueLock != nil) { (*lockImp)(uniqueLock, @selector(lock)); } found = [uniqueSet member: anObject]; if (found == nil) { found = anObject; for (i = 0; i < count; i++) { [uniqueSet addObject: anObject]; } } else { i = [uniqueSet countForObject: found]; if (i < count) { while (i < count) { [uniqueSet addObject: found]; i++; } } else if (i > count) { while (i > count) { [uniqueSet removeObject: found]; i--; } } } if (uniqueLock != nil) { (*unlockImp)(uniqueLock, @selector(unlock)); } return found; } /** * This function uniques the supplied argument, returning * the result. It works by using the [-unique:] method of a global * NSCountedSet object. It handles locking as necessary. * If uniquing is turned off, it simply returns its argument. */ id GSUnique(id anObject) { if (uniquing == YES) { if (uniqueLock != nil) { (*lockImp)(uniqueLock, @selector(lock)); } anObject = (*uniqueImp)(uniqueSet, @selector(unique:), anObject); if (uniqueLock != nil) { (*unlockImp)(uniqueLock, @selector(unlock)); } } return anObject; } /** * This function sets the state of a flag that determines the * behavior of the GSUnique() function. If the flag is on, * uniquing is performed, if it is off the function has no effect. * The default is for uniquing to be turned off. */ void GSUniquing(BOOL flag) { if (uniqueSet == nil) { uniqueSet = [NSCountedSet new]; uniqueImp = [uniqueSet methodForSelector: @selector(unique:)]; } uniquing = flag; } gnustep-base-1.29.0/Source/NSData.m000066400000000000000000003317751435650067400167620ustar00rootroot00000000000000/** Copyright (C) 1995-2015 Free Software Foundation, Inc. Written by: Andrew Kachites McCallum Date: March 1995 Rewritten by: Richard Frith-Macdonald Date: September 1997 This file is part of the GNUstep Base Library. 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 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 USA. NSData class reference $Date$ $Revision$ */ /* NOTES - Richard Frith-Macdonald 1997 * * Rewritten to use the class cluster architecture as in OPENSTEP. * * NB. In our implementaion we require an extra primitive for the * NSMutableData subclasses. This new primitive method is the * [-setCapacity:] method, and it differs from [-setLength:] * as follows - * * [-setLength:] * clears bytes when the allocated buffer grows * never shrinks the allocated buffer capacity * [-setCapacity:] * doesn't clear newly allocated bytes * sets the size of the allocated buffer. * * The actual class hierarchy is as follows - * * NSData Abstract base class. * NSDataStatic Concrete class static buffers. * NSDataEmpty Concrete class static buffers. * NSDataMalloc Concrete class. * NSDataMappedFile Memory mapped files. * NSDataShared Extension for shared memory. * NSDataFinalized For GC of non-GC data. * NSDataWithDeallocatorBlock Adds custom deallocation behaviour * NSMutableData Abstract base class. * NSMutableDataMalloc Concrete class. * NSMutableDataShared Extension for shared memory. * NSDataMutableFinalized For GC of non-GC data. * NSMutableDataWithDeallocatorBlock Adds custom deallocation behaviour * * NSMutableDataMalloc MUST share it's initial instance variable layout * with NSDataMalloc so that it can use the 'behavior' code to inherit * methods from NSDataMalloc. * * Since all the other subclasses are based on NSDataMalloc or * NSMutableDataMalloc, we can put most methods in here and not * bother with duplicating them in the other classes. * */ #import "common.h" #if !defined (__GNU_LIBOBJC__) # include #endif #import "GNUstepBase/GSObjCRuntime.h" #import "Foundation/NSByteOrder.h" #import "Foundation/NSCoder.h" #import "Foundation/NSData.h" #import "Foundation/NSException.h" #import "Foundation/NSFileManager.h" #import "Foundation/NSPathUtilities.h" #import "Foundation/NSRange.h" #import "Foundation/NSURL.h" #import "Foundation/NSValue.h" #import "GSPrivate.h" #include #ifdef HAVE_MMAP #include #if defined(HAVE_SYS_FCNTL_H) # include #elif defined(HAVE_FCNTL_H) # include #endif #ifndef MAP_FAILED #define MAP_FAILED ((void*)-1) /* Failure address. */ #endif @class NSDataMappedFile; #endif #ifdef HAVE_SYS_STAT_H #include #endif #ifdef HAVE_SHMCTL #include #include #define VM_RDONLY 0644 /* self read/write - other readonly */ #define VM_ACCESS 0666 /* read/write access for all */ @class NSDataShared; @class NSMutableDataShared; #endif @class NSDataMalloc; @class NSDataStatic; @class NSMutableDataMalloc; /* * Some static variables to cache classes and methods for quick access - * these are set up at process startup or in [NSData +initialize] */ static Class dataStatic; static Class dataMalloc; static Class mutableDataMalloc; static Class dataBlock; static Class mutableDataBlock; static Class NSDataAbstract; static Class NSMutableDataAbstract; static SEL appendSel; static IMP appendImp; static inline void decodebase64(unsigned char *dst, const unsigned char *src) { dst[0] = (src[0] << 2) | ((src[1] & 0x30) >> 4); dst[1] = ((src[1] & 0x0F) << 4) | ((src[2] & 0x3C) >> 2); dst[2] = ((src[2] & 0x03) << 6) | (src[3] & 0x3F); } static char b64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; static const int crlf64 = NSDataBase64EncodingEndLineWithCarriageReturn | NSDataBase64EncodingEndLineWithLineFeed; static NSUInteger encodebase64(unsigned char **dstRef, const unsigned char *src, NSUInteger length, NSDataBase64EncodingOptions options) { unsigned char *dst; NSUInteger dIndex = 0; NSUInteger dIndexNoNewLines = 0; NSUInteger sIndex; NSUInteger lineLength; NSUInteger destLen; lineLength = 0; if (options & NSDataBase64Encoding64CharacterLineLength) lineLength = 64; else if (options & NSDataBase64Encoding76CharacterLineLength) lineLength = 76; /* if no EndLine options are set but a line length is given, * CR+LF is implied */ if (lineLength && !(options & crlf64)) { options |= crlf64; } /* estimate destination length */ destLen = 4 * ((length + 2) / 3); /* we need to take in account line-endings */ if (lineLength) { if ((options & crlf64) == crlf64) destLen += (destLen / lineLength)*2; // CR and LF else destLen += (destLen / lineLength); // CR or LF } dst = NSZoneMalloc(NSDefaultMallocZone(), destLen); for (sIndex = 0; sIndex < length; sIndex += 3) { int c0 = src[sIndex]; int c1 = (sIndex+1 < length) ? src[sIndex+1] : 0; int c2 = (sIndex+2 < length) ? src[sIndex+2] : 0; dst[dIndex++] = b64[(c0 >> 2) & 077]; dst[dIndex++] = b64[((c0 << 4) & 060) | ((c1 >> 4) & 017)]; dst[dIndex++] = b64[((c1 << 2) & 074) | ((c2 >> 6) & 03)]; dst[dIndex++] = b64[c2 & 077]; dIndexNoNewLines += 4; if (lineLength && !(dIndexNoNewLines % lineLength) ) { if (options & NSDataBase64EncodingEndLineWithCarriageReturn) dst[dIndex++] = '\r'; if (options & NSDataBase64EncodingEndLineWithLineFeed) dst[dIndex++] = '\n'; } } /* If len was not a multiple of 3, then we have encoded too * many characters. Adjust appropriately. */ if (sIndex == length + 1) { /* There were only 2 bytes in that last group */ dst[dIndex - 1] = '='; } else if (sIndex == length + 2) { /* There was only 1 byte in that last group */ dst[dIndex - 1] = '='; dst[dIndex - 2] = '='; } *dstRef = dst; return dIndex; } static BOOL readContentsOfFile(NSString *path, void **buf, off_t *len, NSZone *zone) { NSFileManager *mgr = [NSFileManager defaultManager]; NSDictionary *att; const GSNativeChar *thePath = 0; FILE *theFile = 0; void *tmp = 0; int c; off_t fileLength; #ifdef __ANDROID__ // Android: try using asset manager if path is in main bundle resources AAsset *asset = [NSBundle assetForPath: path withMode: AASSET_MODE_BUFFER]; if (asset) { fileLength = AAsset_getLength(asset); tmp = NSZoneMalloc(zone, fileLength); if (tmp == 0) { NSLog(@"Malloc failed for file (%@) of length %jd - %@", path, (intmax_t)fileLength, [NSError _last]); AAsset_close(asset); goto failure; } int result = AAsset_read(asset, tmp, fileLength); AAsset_close(asset); if (result < 0) { NSWarnFLog(@"read of file (%@) contents failed - %@", path, [NSError errorWithDomain: NSPOSIXErrorDomain code: result userInfo: nil]); goto failure; } *buf = tmp; *len = fileLength; return YES; } #endif /* __ANDROID__ */ thePath = [path fileSystemRepresentation]; if (thePath == 0) { NSWarnFLog(@"Open (%@) attempt failed - bad path", path); return NO; } att = [mgr fileAttributesAtPath: path traverseLink: YES]; if (nil == att) { return NO; // No such file ... fail quietly } if ([att fileType] != NSFileTypeRegular) { NSWarnFLog(@"Open (%@) attempt failed - not a regular file", path); return NO; } #if defined(_WIN32) theFile = _wfopen(thePath, L"rb"); #else theFile = fopen(thePath, "rb"); #endif if (theFile == 0) /* We failed to open the file. */ { NSDebugFLog(@"Open (%@) attempt failed - %@", path, [NSError _last]); goto failure; } /* * Seek to the end of the file. */ c = fseeko(theFile, 0, SEEK_END); if (c != 0) { NSWarnFLog(@"Seek to end of file (%@) failed - %@", path, [NSError _last]); goto failure; } /* * Determine the length of the file (having seeked to the end of the * file) by calling ftello(). */ fileLength = ftello(theFile); if (fileLength == (off_t)-1) { NSWarnFLog(@"Ftell on %@ failed - %@", path, [NSError _last]); goto failure; } if (fileLength >= 2147483647) { fileLength = 0; } /* * Rewind the file pointer to the beginning, preparing to read in * the file. */ c = fseeko(theFile, 0, SEEK_SET); if (c != 0) { NSWarnFLog(@"Fseek to start of file (%@) failed - %@", path, [NSError _last]); goto failure; } clearerr(theFile); if (fileLength == 0) { unsigned char buf[BUFSIZ]; /* * Special case ... a file of length zero may be a named pipe or some * file in the /proc filesystem, which will return us data if we read * from it ... so we try reading as much as we can. */ while ((c = fread(buf, 1, BUFSIZ, theFile)) != 0) { if (tmp == 0) { tmp = NSZoneMalloc(zone, c); } else { tmp = NSZoneRealloc(zone, tmp, fileLength + c); } if (tmp == 0) { NSLog(@"Malloc failed for file (%@) of length %jd - %@", path, (intmax_t)fileLength + c, [NSError _last]); goto failure; } memcpy(tmp + fileLength, buf, c); fileLength += c; } } else { off_t offset = 0; tmp = NSZoneMalloc(zone, fileLength); if (tmp == 0) { NSLog(@"Malloc failed for file (%@) of length %jd - %@", path, (intmax_t)fileLength, [NSError _last]); goto failure; } while (offset < fileLength && (c = fread(tmp + offset, 1, fileLength - offset, theFile)) != 0) { offset += c; } if (offset < fileLength) { fileLength = offset; tmp = NSZoneRealloc(zone, tmp, fileLength); } } if (ferror(theFile)) { NSWarnFLog(@"read of file (%@) contents failed - %@", path, [NSError _last]); goto failure; } *buf = tmp; *len = fileLength; fclose(theFile); return YES; /* * Just in case the failure action needs to be changed. */ failure: { NSZoneFree(zone, tmp); } if (theFile != 0) { fclose(theFile); } return NO; } /* * NB, The start of the NSMutableDataMalloc instance variables must be * identical to that of NSDataMalloc in order to inherit its methods. */ @interface NSDataStatic : NSData { NSUInteger length; __strong void *bytes; /** * This is a GSDataDeallocatorBlock instance, stored as an id for backwards * compatibility. */ id deallocator; } @end @interface NSDataEmpty: NSDataStatic @end @interface NSDataMalloc : NSDataStatic @end @interface NSDataWithDeallocatorBlock : NSDataMalloc @end @interface NSMutableDataMalloc : NSMutableData { NSUInteger length; __strong void *bytes; /** * This is a GSDataDeallocatorBlock instance, stored as an id for backwards * compatibility. */ id deallocator; NSZone *zone; NSUInteger capacity; NSUInteger growth; } /* Increase capacity to at least the specified minimum value. */ - (void) _grow: (NSUInteger)minimum; @end @interface NSMutableDataWithDeallocatorBlock : NSMutableDataMalloc @end #ifdef HAVE_MMAP @interface NSDataMappedFile : NSDataMalloc @end #endif #ifdef HAVE_SHMCTL @interface NSDataShared : NSDataMalloc { int shmid; } - (id) initWithShmID: (int)anId length: (NSUInteger)bufferSize; @end @interface NSMutableDataShared : NSMutableDataMalloc { int shmid; } - (id) initWithShmID: (int)anId length: (NSUInteger)bufferSize; @end #endif /** *

Class for storing a byte array. Methods for initializing from memory a * file, or the network are provided, as well as the ability to write to a * file or the network. If desired, object can take over management of a * pre-allocated buffer (with malloc or similar), free'ing it when deallocated. *

*

The data buffer at any given time has a capacity, which is the * size of its allocated memory area, in bytes, and a length, which * is the length of data it is currently storing.

*/ @implementation NSData - (NSUInteger) sizeOfContentExcluding: (NSHashTable*)exclude { return [self length]; } + (void) initialize { if (self == [NSData class]) { NSDataAbstract = self; NSMutableDataAbstract = [NSMutableData class]; dataStatic = [NSDataStatic class]; dataMalloc = [NSDataMalloc class]; dataBlock = [NSDataWithDeallocatorBlock class]; mutableDataMalloc = [NSMutableDataMalloc class]; mutableDataBlock = [NSMutableDataWithDeallocatorBlock class]; appendSel = @selector(appendBytes:length:); appendImp = [mutableDataMalloc instanceMethodForSelector: appendSel]; } } + (id) allocWithZone: (NSZone*)z { if (self == NSDataAbstract) { return NSAllocateObject(dataMalloc, 0, z); } else { return NSAllocateObject(self, 0, z); } } /** * Returns an empty data object. */ + (id) data { static NSData *empty = nil; if (empty == nil) { empty = [dataStatic allocWithZone: NSDefaultMallocZone()]; empty = [empty initWithBytesNoCopy: 0 length: 0 freeWhenDone: NO]; } return empty; } /** * Returns an autoreleased data object containing data copied from bytes * and with the specified length. Invokes -initWithBytes:length: */ + (id) dataWithBytes: (const void*)bytes length: (NSUInteger)length { NSData *d; d = [dataMalloc allocWithZone: NSDefaultMallocZone()]; d = [d initWithBytes: bytes length: length]; return AUTORELEASE(d); } /** * Returns an autoreleased data object encapsulating the data at bytes * and with the specified length. Invokes * -initWithBytesNoCopy:length:freeWhenDone: with YES */ + (id) dataWithBytesNoCopy: (void*)bytes length: (NSUInteger)length { NSData *d; d = [dataMalloc allocWithZone: NSDefaultMallocZone()]; d = [d initWithBytesNoCopy: bytes length: length freeWhenDone: YES]; return AUTORELEASE(d); } /** * Returns an autoreleased data object encapsulating the data at bytes * and with the specified length. Invokes * -initWithBytesNoCopy:length:freeWhenDone: */ + (id) dataWithBytesNoCopy: (void*)aBuffer length: (NSUInteger)bufferSize freeWhenDone: (BOOL)shouldFree { NSData *d; if (shouldFree == YES) { d = [dataMalloc allocWithZone: NSDefaultMallocZone()]; } else { d = [dataStatic allocWithZone: NSDefaultMallocZone()]; } d = [d initWithBytesNoCopy: aBuffer length: bufferSize freeWhenDone: shouldFree]; return AUTORELEASE(d); } /** * Returns a data object encapsulating the contents of the specified file. * Invokes -initWithContentsOfFile: */ + (id) dataWithContentsOfFile: (NSString*)path { NSData *d; d = [dataMalloc allocWithZone: NSDefaultMallocZone()]; d = [d initWithContentsOfFile: path]; return AUTORELEASE(d); } /** * Returns a data object encapsulating the contents of the specified * file mapped directly into memory. * Invokes -initWithContentsOfMappedFile: */ + (id) dataWithContentsOfMappedFile: (NSString*)path { NSData *d; #ifdef HAVE_MMAP d = [NSDataMappedFile allocWithZone: NSDefaultMallocZone()]; d = [d initWithContentsOfMappedFile: path]; #else d = [dataMalloc allocWithZone: NSDefaultMallocZone()]; d = [d initWithContentsOfMappedFile: path]; #endif return AUTORELEASE(d); } /** * Retrieves the information at the specified url and returns an NSData * instance encapsulating it. */ + (id) dataWithContentsOfURL: (NSURL*)url { NSData *d; d = [url resourceDataUsingCache: YES]; return d; } /** * Returns an autoreleased instance initialised by copying the contents of data. */ + (id) dataWithData: (NSData*)data { NSData *d; d = [dataMalloc allocWithZone: NSDefaultMallocZone()]; d = [d initWithBytes: [data bytes] length: [data length]]; return AUTORELEASE(d); } /** * Returns a new empty data object. */ + (id) new { NSData *d; d = [dataMalloc allocWithZone: NSDefaultMallocZone()]; d = [d initWithBytesNoCopy: 0 length: 0 freeWhenDone: YES]; return d; } - (id) init { return [self initWithBytesNoCopy: 0 length: 0 freeWhenDone: YES]; } - (id) initWithBase64EncodedData: (NSData*)base64Data options: (NSDataBase64DecodingOptions)options { NSUInteger length; NSUInteger declen; const unsigned char *src; const unsigned char *end; unsigned char *result; unsigned char *dst; unsigned char buf[4]; unsigned pos = 0; NSZone *zone = [self zone]; if (nil == base64Data) { AUTORELEASE(self); [NSException raise: NSInvalidArgumentException format: @"[%@-initWithBase64EncodedData:options:] called with " @"nil data", NSStringFromClass([self class])]; return nil; } length = [base64Data length]; if (length == 0) { return [self initWithBytesNoCopy: 0 length: 0 freeWhenDone: YES]; } declen = ((length + 3) * 3)/4; src = (const unsigned char*)[base64Data bytes]; end = &src[length]; result = NSZoneMalloc(zone, declen); dst = result; while (src != end) { int c = *src++; if (isupper(c)) { c -= 'A'; } else if (islower(c)) { c = c - 'a' + 26; } else if (isdigit(c)) { c = c - '0' + 52; } else if (c == '/') { c = 63; } else if (c == '+') { c = 62; } else if (c == '=') { /* Only legal as padding at end of string */ while (src != end) { c = *src++; if (c != '=') { if (options & NSDataBase64DecodingIgnoreUnknownCharacters) { if (!isupper(c) && !islower(c) && !isdigit(c) && c != '/' && c != '+') { continue; // An unknown character } } free(result); DESTROY(self); return nil; } } /* For OSX compatibility, if we have unnecessary padding at the * end of a string, we treat it as representing a zero byte. */ if (0 == pos) { *dst++ = '\0'; } c = -1; } else if (options & NSDataBase64DecodingIgnoreUnknownCharacters) { c = -1; /* ignore */ } else { free(result); DESTROY(self); return nil; } if (c >= 0) { buf[pos++] = c; if (pos == 4) { pos = 0; decodebase64(dst, buf); dst += 3; } } } if (pos > 0) { unsigned i; for (i = pos; i < 4; i++) { buf[i] = '\0'; } pos--; if (pos > 0) { unsigned char tail[3]; decodebase64(tail, buf); memcpy(dst, tail, pos); dst += pos; } } length = dst - result; if (options & NSDataBase64DecodingIgnoreUnknownCharacters) { /* If the decoded length is a lot shorter than expected (because we * ignored a lot of characters), reallocate to get smaller memory. */ if ((((declen - length) * 100) / declen) > 5) { result = NSZoneRealloc(zone, result, length); } } return [self initWithBytesNoCopy: result length: length freeWhenDone: YES]; } - (id) initWithBase64EncodedString: (NSString*)base64String options: (NSDataBase64DecodingOptions)options { NSData *data; if (nil == base64String) { AUTORELEASE(self); [NSException raise: NSInvalidArgumentException format: @"[%@-initWithBase64EncodedString:options:] called with " @"nil string", NSStringFromClass([self class])]; return nil; } data = [base64String dataUsingEncoding: NSUTF8StringEncoding]; return [self initWithBase64EncodedData: data options: options]; } /** * Makes a copy of bufferSize bytes of data at aBuffer, and passes it to * -initWithBytesNoCopy:length:freeWhenDone: with a YES argument in order * to initialise the receiver. Returns the result. */ - (id) initWithBytes: (const void*)aBuffer length: (NSUInteger)bufferSize { void *ptr = 0; if (bufferSize > 0) { if (aBuffer == 0) { [NSException raise: NSInvalidArgumentException format: @"[%@-initWithBytes:length:] called with " @"length but null bytes", NSStringFromClass([self class])]; } ptr = NSAllocateCollectable(bufferSize, 0); if (ptr == 0) { DESTROY(self); return nil; } memcpy(ptr, aBuffer, bufferSize); } return [self initWithBytesNoCopy: ptr length: bufferSize freeWhenDone: YES]; } /** * Invokes -initWithBytesNoCopy:length:freeWhenDone: with the last argument * set to YES. Returns the resulting initialised data object (which may not * be the receiver). */ - (id) initWithBytesNoCopy: (void*)aBuffer length: (NSUInteger)bufferSize { return [self initWithBytesNoCopy: aBuffer length: bufferSize freeWhenDone: YES]; } /** * Initialises the receiver.
* The value of aBuffer is a pointer to something to be stored.
* The value of bufferSize is the number of bytes to use.
* The value of shouldFree specifies whether the receiver should * attempt to free the memory pointer to by aBuffer when the receiver * is deallocated ... ie. it says whether the receiver owns * the memory. Supplying the wrong value here will lead to memory * leaks or crashes. */ - (id) initWithBytesNoCopy: (void*)aBuffer length: (NSUInteger)bufferSize freeWhenDone: (BOOL)shouldFree { [self subclassResponsibility: _cmd]; return nil; } - (instancetype) initWithBytesNoCopy: (void*)bytes length: (NSUInteger)length deallocator: (GSDataDeallocatorBlock)deallocator { [self subclassResponsibility: _cmd]; return nil; } /** * Initialises the receiver with the contents of the specified file.
* Returns the resulting object.
* Returns nil if the file does not exist or can not be read for some reason. */ - (id) initWithContentsOfFile: (NSString*)path { void *fileBytes; off_t fileLength; if (readContentsOfFile(path, &fileBytes, &fileLength, [self zone]) == NO) { DESTROY(self); return nil; } self = [self initWithBytesNoCopy: fileBytes length: (NSUInteger)fileLength freeWhenDone: YES]; return self; } /** * Initialize with data pointing to contents of file at path. Bytes are * only "swapped in" as needed. File should not be moved or deleted for * the life of this object. */ - (id) initWithContentsOfMappedFile: (NSString *)path { #ifdef HAVE_MMAP NSZone *z = [self zone]; DESTROY(self); self = [NSDataMappedFile allocWithZone: z]; return [self initWithContentsOfMappedFile: path]; #else return [self initWithContentsOfFile: path]; #endif } /** * Initialize with data pointing to contents of URL, which will be * retrieved immediately in a blocking manner. */ - (id) initWithContentsOfURL: (NSURL*)url { NSData *data = [url resourceDataUsingCache: YES]; return [self initWithData: data]; } /** * Initializes by copying data's bytes into a new buffer. */ - (id) initWithData: (NSData*)data { if (data == nil) { return [self initWithBytesNoCopy: 0 length: 0 freeWhenDone: YES]; } if ([data isKindOfClass: [NSData class]] == NO) { NSLog(@"-initWithData: passed a non-data object"); DESTROY(self); return nil; } return [self initWithBytes: [data bytes] length: [data length]]; } // Accessing Data /** * Returns a pointer to the data encapsulated by the receiver. */ - (const void*) bytes { [self subclassResponsibility: _cmd]; return 0; } /** * Returns a short description of this object. */ - (NSString*) description { extern void GSPropertyListMake(id,NSDictionary*,BOOL,BOOL,unsigned,id*); NSMutableString *result = nil; GSPropertyListMake(self, nil, NO, YES, 0, &result); return result; } /** * Copies the contents of the memory encapsulated by the receiver into * the specified buffer. The buffer must be large enough to contain * -length bytes of data ... if it isn't then a crash is likely to occur.
* Invokes -getBytes:range: with the range set to the whole of the receiver. */ - (void) getBytes: (void*)buffer { [self getBytes: buffer range: NSMakeRange(0, [self length])]; } /** * Copies length bytes of data from the memory encapsulated by the receiver * into the specified buffer. The buffer must be large enough to contain * length bytes of data ... if it isn't then a crash is likely to occur.
* If length is greater than the size of the receiver, only the available * bytes are copied. */ - (void) getBytes: (void*)buffer length: (NSUInteger)length { NSUInteger l = [self length]; [self getBytes: buffer range: NSMakeRange(0, l < length ? l : length)]; } /** * Copies data from the memory encapsulated by the receiver (in the range * specified by aRange) into the specified buffer.
* The buffer must be large enough to contain the data ... if it isn't then * a crash is likely to occur.
* If aRange specifies a range which does not entirely lie within the * receiver, an exception is raised. */ - (void) getBytes: (void*)buffer range: (NSRange)aRange { NSUInteger size = [self length]; GS_RANGE_CHECK(aRange, size); if (aRange.length > 0) { const void *bytes = [self bytes]; if (0 == bytes) { [NSException raise: NSInternalInconsistencyException format: @"missing bytes in getBytes:range:"]; } memcpy(buffer, bytes + aRange.location, aRange.length); } } - (id) replacementObjectForPortCoder: (NSPortCoder*)aCoder { return self; } /** * Returns an NSData instance encapsulating the memory from the receiver * specified by the range aRange.
* If aRange specifies a range which does not entirely lie within the * receiver, an exception is raised. */ - (NSData*) subdataWithRange: (NSRange)aRange { void *buffer; NSUInteger l = [self length]; GS_RANGE_CHECK(aRange, l); buffer = NSZoneMalloc(NSDefaultMallocZone(), aRange.length); if (buffer == 0) { [NSException raise: NSMallocException format: @"No memory for subdata of NSData object"]; } [self getBytes: buffer range: aRange]; return [NSData dataWithBytesNoCopy: buffer length: aRange.length]; } /** * Finds and returns the range of the first occurrence of the given data, within the given range, subject to given options. */ - (NSRange) rangeOfData: (NSData *)dataToFind options: (NSDataSearchOptions)mask range: (NSRange)searchRange { NSUInteger length = [self length]; NSUInteger countOther = [dataToFind length]; const void* bytesSelf = [self bytes]; const void* bytesOther = [dataToFind bytes]; NSRange result; GS_RANGE_CHECK(searchRange, length); if (dataToFind == nil) [NSException raise: NSInvalidArgumentException format: @"range of nil"]; /* Zero length data is always found at the start of the given range. */ if (0 == countOther) { if ((mask & NSDataSearchBackwards) == NSDataSearchBackwards) { searchRange.location += searchRange.length; } searchRange.length = 0; return searchRange; } if (searchRange.length < countOther) { /* Range to search is smaller than data to look for. */ result = NSMakeRange(NSNotFound, 0); } else { if ((mask & NSDataSearchAnchored) == NSDataSearchAnchored || searchRange.length == countOther) { /* Range to search is same size as data to look for. */ if ((mask & NSDataSearchBackwards) == NSDataSearchBackwards) { searchRange.location = NSMaxRange(searchRange) - countOther; searchRange.length = countOther; } else { searchRange.length = countOther; } if (memcmp(bytesSelf + searchRange.location, bytesOther, countOther) == 0) { result = searchRange; } else { result = NSMakeRange(NSNotFound, 0); } } else { /* Range to search is bigger than data to look for. */ NSUInteger pos; NSUInteger end; end = searchRange.length - countOther + 1; if ((mask & NSDataSearchBackwards) == NSDataSearchBackwards) { pos = end; } else { pos = 0; } if ((mask & NSDataSearchBackwards) == NSDataSearchBackwards) { while (pos-- > 0) { if (memcmp(bytesSelf + searchRange.location + pos, bytesOther, countOther) == 0) { break; } } } else { while (pos < end) { if (memcmp(bytesSelf + searchRange.location + pos, bytesOther, countOther) == 0) { break; } pos++; } } if (pos >= end) { result = NSMakeRange(NSNotFound, 0); } else { result = NSMakeRange(searchRange.location + pos, countOther); } } } return result; } - (NSData *) base64EncodedDataWithOptions: (NSDataBase64EncodingOptions)options { void *srcBytes = (void*)[self bytes]; NSUInteger length = [self length]; NSUInteger resLen; unsigned char *resBytes; NSData *result; resLen = encodebase64(&resBytes, srcBytes, length, options); result = [[NSData alloc] initWithBytesNoCopy: resBytes length: resLen freeWhenDone: YES]; return AUTORELEASE(result); } - (NSString *) base64EncodedStringWithOptions: (NSDataBase64EncodingOptions)options { void *srcBytes = (void*)[self bytes]; NSUInteger length = [self length]; NSUInteger resLen; unsigned char *resBytes; NSString *result; resLen = encodebase64(&resBytes, srcBytes, length, options); result = [[NSString alloc] initWithBytesNoCopy: resBytes length: resLen encoding: NSASCIIStringEncoding freeWhenDone: YES]; return AUTORELEASE(result); } - (NSUInteger) hash { unsigned char buf[64]; NSUInteger l = [self length]; NSUInteger ret =0; l = MIN(l,64); /* * hash for empty data matches hash for empty string */ if (l == 0) { return 0xfffffffe; } [self getBytes: &buf range: NSMakeRange(0, l)]; while (l-- > 0) { ret = (ret << 5) + ret + buf[l]; } // Again, match NSString if (ret == 0) { ret = 0xffffffff; } return ret; } - (BOOL) isEqual: anObject { if ([anObject isKindOfClass: [NSData class]]) return [self isEqualToData: anObject]; return NO; } /** * Returns a boolean value indicating if the receiver and other contain * identical data (using a byte by byte comparison). Assumes that the * other object is an NSData instance ... may raise an exception if it isn't. */ - (BOOL) isEqualToData: (NSData*)other { NSUInteger len; if (other == self) { return YES; } if ((len = [self length]) != [other length]) { return NO; } return (memcmp([self bytes], [other bytes], len) ? NO : YES); } /** * Returns the number of bytes of data encapsulated by the receiver. */ - (NSUInteger) length { /* This is left to concrete subclasses to implement. */ [self subclassResponsibility: _cmd]; return 0; } - (BOOL) writeToFile: (NSString*)path atomically: (BOOL)useAuxiliaryFile { if (useAuxiliaryFile) { return [self writeToFile: path options: NSDataWritingAtomic error: 0]; } else { return [self writeToFile: path options: 0 error: 0]; } } - (BOOL) writeToURL: (NSURL*)anURL atomically: (BOOL)flag { if (flag) { return [self writeToURL: anURL options: NSDataWritingAtomic error: 0]; } else { return [self writeToURL: anURL options: 0 error: 0]; } } // Deserializing Data /** * Copies data from buffer starting from cursor. Deprecated. * Use [-getBytes:] and related methods instead. */ - (unsigned int) deserializeAlignedBytesLengthAtCursor: (unsigned int*)cursor { return (unsigned)[self deserializeIntAtCursor: cursor]; } /** * Copies data from buffer starting from cursor. Deprecated. * Use [-getBytes:] and related methods instead. */ - (void) deserializeBytes: (void*)buffer length: (unsigned int)bytes atCursor: (unsigned int*)cursor { NSRange range = { *cursor, bytes }; [self getBytes: buffer range: range]; *cursor += bytes; } - (void) deserializeDataAt: (void*)data ofObjCType: (const char*)type atCursor: (unsigned int*)cursor context: (id )callback { if (!type || !data) return; switch (*type) { case _C_ID: { [callback deserializeObjectAt: data ofObjCType: type fromData: self atCursor: cursor]; return; } case _C_CHARPTR: { int32_t length; [self deserializeBytes: &length length: sizeof(length) atCursor: cursor]; length = GSSwapBigI32ToHost(length); if (length == -1) { *(const char**)data = 0; return; } else { unsigned len = (length+1)*sizeof(char); *(char**)data = (char*)NSZoneMalloc(NSDefaultMallocZone(), len); if (*(char**)data == 0) { [NSException raise: NSMallocException format: @"out of memory to deserialize bytes"]; } } [self deserializeBytes: *(char**)data length: length atCursor: cursor]; (*(char**)data)[length] = '\0'; return; } case _C_ARY_B: { unsigned offset = 0; unsigned size; unsigned count = atoi(++type); unsigned i; while (isdigit(*type)) { type++; } size = objc_sizeof_type(type); for (i = 0; i < count; i++) { [self deserializeDataAt: (char*)data + offset ofObjCType: type atCursor: cursor context: callback]; offset += size; } return; } case _C_STRUCT_B: { struct objc_struct_layout layout; objc_layout_structure (type, &layout); while (objc_layout_structure_next_member (&layout)) { unsigned offset; unsigned align; const char *ftype; objc_layout_structure_get_info (&layout, &offset, &align, &ftype); [self deserializeDataAt: ((char*)data) + offset ofObjCType: ftype atCursor: cursor context: callback]; } return; } case _C_PTR: { unsigned len = objc_sizeof_type(++type); *(char**)data = (char*)NSZoneMalloc(NSDefaultMallocZone(), len); if (*(char**)data == 0) { [NSException raise: NSMallocException format: @"out of memory to deserialize bytes"]; } [self deserializeDataAt: *(char**)data ofObjCType: type atCursor: cursor context: callback]; return; } case _C_CHR: case _C_UCHR: { [self deserializeBytes: data length: sizeof(unsigned char) atCursor: cursor]; return; } case _C_SHT: case _C_USHT: { unsigned short ns; [self deserializeBytes: &ns length: sizeof(unsigned short) atCursor: cursor]; *(unsigned short*)data = NSSwapBigShortToHost(ns); return; } case _C_INT: case _C_UINT: { unsigned ni; [self deserializeBytes: &ni length: sizeof(unsigned) atCursor: cursor]; *(unsigned*)data = NSSwapBigIntToHost(ni); return; } case _C_LNG: case _C_ULNG: { unsigned long nl; [self deserializeBytes: &nl length: sizeof(unsigned long) atCursor: cursor]; *(unsigned long*)data = NSSwapBigLongToHost(nl); return; } case _C_LNG_LNG: case _C_ULNG_LNG: { unsigned long long nl; [self deserializeBytes: &nl length: sizeof(unsigned long long) atCursor: cursor]; *(unsigned long long*)data = NSSwapBigLongLongToHost(nl); return; } case _C_FLT: { NSSwappedFloat nf; [self deserializeBytes: &nf length: sizeof(NSSwappedFloat) atCursor: cursor]; *(float*)data = NSSwapBigFloatToHost(nf); return; } case _C_DBL: { NSSwappedDouble nd; [self deserializeBytes: &nd length: sizeof(NSSwappedDouble) atCursor: cursor]; *(double*)data = NSSwapBigDoubleToHost(nd); return; } #if defined(_C_BOOL) && (!defined(__GNUC__) || __GNUC__ > 2) case _C_BOOL: { [self deserializeBytes: data length: sizeof(_Bool) atCursor: cursor]; return; } #endif case _C_CLASS: { uint16_t ni; [self deserializeBytes: &ni length: sizeof(ni) atCursor: cursor]; ni = GSSwapBigI16ToHost(ni); if (ni == 0) { *(Class*)data = 0; } else { char name[ni+1]; Class c; [self deserializeBytes: name length: ni atCursor: cursor]; name[ni] = '\0'; c = objc_lookUpClass(name); if (c == 0) { NSLog(@"[%s %s] can't find class - %s", class_getName([self class]), sel_getName(_cmd), name); } *(Class*)data = c; } return; } case _C_SEL: { uint16_t ln; uint16_t lt; [self deserializeBytes: &ln length: sizeof(ln) atCursor: cursor]; ln = GSSwapBigI16ToHost(ln); [self deserializeBytes: < length: sizeof(lt) atCursor: cursor]; lt = GSSwapBigI16ToHost(lt); if (ln == 0) { *(SEL*)data = 0; } else { char name[ln+1]; char types[lt+1]; SEL sel; [self deserializeBytes: name length: ln atCursor: cursor]; name[ln] = '\0'; [self deserializeBytes: types length: lt atCursor: cursor]; types[lt] = '\0'; if (lt) { sel = GSSelectorFromNameAndTypes(name, types); } else { sel = sel_registerName(name); } if (sel == 0) { [NSException raise: NSInternalInconsistencyException format: @"can't make sel with name '%s' " @"and types '%s'", name, types]; } *(SEL*)data = sel; } return; } default: [NSException raise: NSGenericException format: @"Unknown type to deserialize - '%s'", type]; } } /** * Retrieve an int from this data, which is assumed to be in network * (big-endian) byte order. Cursor refers to byte position. */ - (int) deserializeIntAtCursor: (unsigned int*)cursor { unsigned ni, result; [self deserializeBytes: &ni length: sizeof(unsigned) atCursor: cursor]; result = NSSwapBigIntToHost(ni); return result; } /** * Retrieve an int from this data, which is assumed to be in network * (big-endian) byte order. Index refers to byte position. */ - (int) deserializeIntAtIndex: (unsigned int)index { unsigned ni, result; [self deserializeBytes: &ni length: sizeof(unsigned) atCursor: &index]; result = NSSwapBigIntToHost(ni); return result; } /** * Retrieve ints from intBuffer, which is assumed to be in network (big-endian) * byte order. Count refers to number of ints, but index refers to byte * position. */ - (void) deserializeInts: (int*)intBuffer count: (unsigned int)numInts atCursor: (unsigned int*)cursor { unsigned i; [self deserializeBytes: &intBuffer length: numInts * sizeof(unsigned) atCursor: cursor]; for (i = 0; i < numInts; i++) intBuffer[i] = NSSwapBigIntToHost(intBuffer[i]); } /** * Retrieve ints from intBuffer, which is assumed to be in network (big-endian) * byte order. Count refers to number of ints, but index refers to byte * position. */ - (void) deserializeInts: (int*)intBuffer count: (unsigned int)numInts atIndex: (unsigned int)index { unsigned i; [self deserializeBytes: &intBuffer length: numInts * sizeof(int) atCursor: &index]; for (i = 0; i < numInts; i++) { intBuffer[i] = NSSwapBigIntToHost(intBuffer[i]); } } - (id) copyWithZone: (NSZone*)z { if (NSShouldRetainWithZone(self, z) && [self isKindOfClass: [NSMutableData class]] == NO) return RETAIN(self); else return [[dataMalloc allocWithZone: z] initWithBytes: [self bytes] length: [self length]]; } - (id) mutableCopyWithZone: (NSZone*)zone { return [[mutableDataMalloc allocWithZone: zone] initWithBytes: [self bytes] length: [self length]]; } - (void) encodeWithCoder: (NSCoder*)coder { if ([coder allowsKeyedCoding]) { [coder encodeObject: self forKey: @"NS.bytes"]; } else { [coder encodeDataObject: self]; } } - (id) initWithCoder: (NSCoder*)coder { id obj = nil; if ([coder allowsKeyedCoding]) { obj = [coder decodeObjectForKey: @"NS.bytes"]; } else { obj = [coder decodeDataObject]; } if (obj != self) { ASSIGN(self, obj); } return self; } - (BOOL) writeToFile: (NSString *)path options: (NSUInteger)writeOptionsMask error: (NSError **)errorPtr { #if defined(_WIN32) NSUInteger length = [path length]; GSNativeChar wthePath[length + 100]; GSNativeChar wtheRealPath[length + 100]; int c; FILE *theFile; BOOL useAuxiliaryFile = NO; BOOL error_BadPath = YES; if (writeOptionsMask & NSDataWritingAtomic) { useAuxiliaryFile = YES; } [path getCharacters: wtheRealPath]; wtheRealPath[length] = L'\0'; error_BadPath = (length <= 0); if (error_BadPath) { NSWarnMLog(@"Open (%@) attempt failed - bad path",path); return NO; } if (useAuxiliaryFile) { /* Use the path name of the destination file as a prefix for the * _wmktemp() call so that we can be sure that both files are on * the same filesystem and the subsequent rename() will work. */ wcscpy(wthePath, wtheRealPath); wcscat(wthePath, L"XXXXXX"); if (_wmktemp(wthePath) == 0) { NSWarnMLog(@"mktemp (%@) failed - %@", [NSString stringWithCharacters: wthePath length: wcslen(wthePath)], [NSError _last]); goto failure; } } else { wcscpy(wthePath,wtheRealPath); } theFile = _wfopen(wthePath, L"wb"); if (theFile == 0) { /* Something went wrong; we weren't * even able to open the file. */ NSWarnMLog(@"Open (%@) failed - %@", [NSString stringWithCharacters: wthePath length: wcslen(wthePath)], [NSError _last]); goto failure; } /* Now we try and write the NSData's bytes to the file. Here `c' is * the number of bytes which were successfully written to the file * in the fwrite() call. */ c = fwrite([self bytes], sizeof(char), [self length], theFile); if (c < (int)[self length]) /* We failed to write everything for * some reason. */ { NSWarnMLog(@"Fwrite (%@) failed - %@", [NSString stringWithCharacters: wthePath length: wcslen(wthePath)], [NSError _last]); goto failure; } /* We're done, so close everything up. */ c = fclose(theFile); if (c != 0) /* I can't imagine what went wrong * closing the file, but we got here, * so we need to deal with it. */ { NSWarnMLog(@"Fclose (%@) failed - %@", [NSString stringWithCharacters: wthePath length: wcslen(wthePath)], [NSError _last]); goto failure; } /* If we used a temporary file, we still need to rename() it be the * real file. Also, we need to try to retain the file attributes of * the original file we are overwriting (if we are) */ if (useAuxiliaryFile) { NSFileManager *mgr = [NSFileManager defaultManager]; NSMutableDictionary *att = nil; NSUInteger perm; if ([mgr fileExistsAtPath: path]) { att = [[mgr fileAttributesAtPath: path traverseLink: YES] mutableCopy]; IF_NO_ARC(AUTORELEASE(att);) } /* To replace the existing file on windows, it must be writable. */ perm = [att filePosixPermissions]; if (perm != NSNotFound && (perm & 0200) == 0) { [mgr changeFileAttributes: [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithUnsignedInt: 0777], NSFilePosixPermissions, nil] atPath: path]; } /* * The windoze implementation of the POSIX rename() function is buggy * and doesn't work if the destination file already exists ... so we * use a windoze specific move file function instead. */ if (MoveFileExW(wthePath, wtheRealPath, MOVEFILE_REPLACE_EXISTING) != 0) { c = 0; } /* Windows 9x does not support MoveFileEx */ else if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) { GSNativeChar secondaryFile[length + 100]; wcscpy(secondaryFile, wthePath); wcscat(secondaryFile, L"-delete"); // Delete the intermediate name just in case DeleteFileW(secondaryFile); // Move the existing file to the temp name if (MoveFileW(wtheRealPath, secondaryFile) != 0) { if (MoveFileW(wthePath, wtheRealPath) != 0) { c = 0; // Delete the old file if possible DeleteFileW(secondaryFile); } else { c = -1; // failure, restore the old file if possible MoveFileW(secondaryFile, wtheRealPath); } } else { c = -1; // failure } } else { c = -1; } if (c != 0) /* Many things could go wrong, I guess. */ { NSWarnMLog(@"Rename ('%@' to '%@') failed - %@", [NSString stringWithCharacters: wthePath length: wcslen(wthePath)], [NSString stringWithCharacters: wtheRealPath length: wcslen(wtheRealPath)], [NSError _last]); goto failure; } if (att != nil) { /* * We have created a new file - so we attempt to make it's * attributes match that of the original (except for those * we can't reasonably set). */ [att removeObjectForKey: NSFileSize]; [att removeObjectForKey: NSFileCreationDate]; [att removeObjectForKey: NSFileModificationDate]; [att removeObjectForKey: NSFileReferenceCount]; [att removeObjectForKey: NSFileSystemNumber]; [att removeObjectForKey: NSFileSystemFileNumber]; [att removeObjectForKey: NSFileDeviceIdentifier]; [att removeObjectForKey: NSFileType]; if ([mgr changeFileAttributes: att atPath: path] == NO) { NSWarnMLog(@"Unable to correctly set attributes for '%@' to %@", path, att); } } #ifdef HAVE_GETEUID else if (geteuid() == 0 && [@"root" isEqualToString: NSUserName()] == NO) { att = [NSDictionary dictionaryWithObjectsAndKeys: NSFileOwnerAccountName, NSUserName(), nil]; if ([mgr changeFileAttributes: att atPath: path] == NO) { NSWarnMLog(@"Unable to correctly set ownership for '%@'", path); } } #endif } /* success: */ return YES; /* Just in case the failure action needs to be changed. */ failure: /* * Attempt to tidy up by removing temporary file on failure. */ if (useAuxiliaryFile) { _wunlink(wthePath); } return NO; #else char thePath[BUFSIZ*2+8]; char theRealPath[BUFSIZ*2]; int c; FILE *theFile; BOOL useAuxiliaryFile = NO; BOOL error_BadPath = YES; if (writeOptionsMask & NSDataWritingAtomic) { useAuxiliaryFile = YES; } if ([path canBeConvertedToEncoding: [NSString defaultCStringEncoding]]) { const char *local_c_path = [path cString]; if (local_c_path != 0 && strlen(local_c_path) < (BUFSIZ*2)) { strncpy(theRealPath, local_c_path, sizeof(theRealPath) - 1); theRealPath[sizeof(theRealPath) - 1] = '\0'; error_BadPath = NO; } } if (error_BadPath) { NSWarnMLog(@"Open (%@) attempt failed - bad path",path); return NO; } # if defined(HAVE_MKSTEMP) if (useAuxiliaryFile) { int desc; int mask; int length; length = strlen(theRealPath); if (length > sizeof(thePath) - 7) { length = sizeof(thePath) - 7; } memcpy(thePath, theRealPath, length); memcpy(thePath + length, "XXXXXX", 6); thePath[length + 6] = '\0'; if ((desc = mkstemp(thePath)) < 0) { NSWarnMLog(@"mkstemp (%s) failed - %@", thePath, [NSError _last]); goto failure; } mask = umask(0); umask(mask); fchmod(desc, 0644 & ~mask); if ((theFile = fdopen(desc, "w")) == 0) { close(desc); } } else { strncpy(thePath, theRealPath, sizeof(thePath) - 1); thePath[sizeof(thePath) - 1] = '\0'; theFile = fopen(thePath, "wb"); } # else if (useAuxiliaryFile) { /* Use the path name of the destination file as a prefix for the * mktemp() call so that we can be sure that both files are on * the same filesystem and the subsequent rename() will work. */ strncpy(thePath, theRealPath, sizeof(thePath) - 1); thePath[sizeof(thePath) - 1] = '\0'; strncat(thePath, "XXXXXX", 6); if (mktemp(thePath) == 0) { NSWarnMLog(@"mktemp (%s) failed - %@", thePath, [NSError _last]); goto failure; } } else { strncpy(thePath, theRealPath, sizeof(thePath) - 1); thePath[sizeof(thePath) - 1] = '\0'; } theFile = fopen(thePath, "wb"); # endif if (theFile == 0) { /* Something went wrong; we weren't * even able to open the file. */ NSWarnMLog(@"Open (%s) failed - %@", thePath, [NSError _last]); goto failure; } /* Now we try and write the NSData's bytes to the file. Here `c' is * the number of bytes which were successfully written to the file * in the fwrite() call. */ c = fwrite([self bytes], sizeof(char), [self length], theFile); if (c < (int)[self length]) /* We failed to write everything. */ { NSWarnMLog(@"Fwrite (%s) failed - %@", thePath, [NSError _last]); fclose(theFile); goto failure; } /* We're done, so close everything up. */ c = fclose(theFile); if (c != 0) /* I can't imagine what went wrong * closing the file, but we got here, * so we need to deal with it. */ { NSWarnMLog(@"Fclose (%s) failed - %@", thePath, [NSError _last]); goto failure; } /* If we used a temporary file, we still need to rename() it be the * real file. Also, we need to try to retain the file attributes of * the original file we are overwriting (if we are) */ if (useAuxiliaryFile) { NSFileManager *mgr = [NSFileManager defaultManager]; NSDictionary *att = nil; if ([mgr fileExistsAtPath: path]) { att = [mgr fileAttributesAtPath: path traverseLink: YES]; } c = rename(thePath, theRealPath); if (c != 0) /* Many things could go wrong, I guess. */ { NSWarnMLog(@"Rename ('%s' to '%s') failed - %@", thePath, theRealPath, [NSError _last]); goto failure; } if (att != nil) { NSMutableDictionary *mAtt = [att mutableCopy]; IF_NO_ARC(AUTORELEASE(mAtt);) /* * We have created a new file - so we attempt to make it's * attributes match that of the original. */ [mAtt removeObjectForKey: NSFileSize]; [mAtt removeObjectForKey: NSFileCreationDate]; [mAtt removeObjectForKey: NSFileModificationDate]; [mAtt removeObjectForKey: NSFileReferenceCount]; [mAtt removeObjectForKey: NSFileSystemNumber]; [mAtt removeObjectForKey: NSFileSystemFileNumber]; [mAtt removeObjectForKey: NSFileDeviceIdentifier]; [mAtt removeObjectForKey: NSFileType]; if ([mgr changeFileAttributes: mAtt atPath: path] == NO) { NSWarnMLog(@"Unable to correctly set attributes for '%@' to %@", path, mAtt); } } #ifdef HAVE_GETEUID else if (geteuid() == 0 && [@"root" isEqualToString: NSUserName()] == NO) { att = [NSDictionary dictionaryWithObjectsAndKeys: NSFileOwnerAccountName, NSUserName(), nil]; if ([mgr changeFileAttributes: att atPath: path] == NO) { NSWarnMLog(@"Unable to correctly set ownership for '%@'", path); } } #endif } /* success: */ return YES; /* Just in case the failure action needs to be changed. */ failure: /* * Attempt to tidy up by removing temporary file on failure. */ if (useAuxiliaryFile) { unlink(thePath); } return NO; #endif } - (BOOL) writeToURL: (NSURL *)url options: (NSUInteger)writeOptionsMask error: (NSError **)errorPtr { if ([url isFileURL] == YES) { return [self writeToFile: [url path] options: writeOptionsMask error: errorPtr]; } else { return [url setResourceData: self]; } return NO; } @end /** * Provides some shared-memory extensions to [NSData]. */ @implementation NSData (GNUstepExtensions) /** * New instance with given shared memory ID. */ + (id) dataWithShmID: (int)anID length: (NSUInteger)length { #ifdef HAVE_SHMCTL NSDataShared *d; d = [NSDataShared allocWithZone: NSDefaultMallocZone()]; d = [d initWithShmID: anID length: length]; return AUTORELEASE(d); #else NSLog(@"[NSData -dataWithSmdID:length:] no shared memory support"); return nil; #endif } /** * New instance with given bytes in shared memory. */ + (id) dataWithSharedBytes: (const void*)bytes length: (NSUInteger)length { NSData *d; #ifdef HAVE_SHMCTL d = [NSDataShared allocWithZone: NSDefaultMallocZone()]; d = [d initWithBytes: bytes length: length]; #else d = [dataMalloc allocWithZone: NSDefaultMallocZone()]; d = [d initWithBytes: bytes length: length]; #endif return AUTORELEASE(d); } + (id) dataWithStaticBytes: (const void*)bytes length: (NSUInteger)length { NSDataStatic *d; d = [dataStatic allocWithZone: NSDefaultMallocZone()]; d = [d initWithBytesNoCopy: (void*)bytes length: length freeWhenDone: NO]; return AUTORELEASE(d); } - (void) deserializeTypeTag: (unsigned char*)tag andCrossRef: (unsigned int*)ref atCursor: (unsigned int*)cursor { [self deserializeDataAt: (void*)tag ofObjCType: @encode(uint8_t) atCursor: cursor context: nil]; if (*tag & _GSC_MAYX) { switch (*tag & _GSC_SIZE) { case _GSC_X_0: { return; } case _GSC_X_1: { uint8_t x; [self deserializeDataAt: (void*)&x ofObjCType: @encode(uint8_t) atCursor: cursor context: nil]; *ref = (unsigned int)x; return; } case _GSC_X_2: { uint16_t x; [self deserializeDataAt: (void*)&x ofObjCType: @encode(uint16_t) atCursor: cursor context: nil]; *ref = (unsigned int)x; return; } default: { uint32_t x; [self deserializeDataAt: (void*)&x ofObjCType: @encode(uint32_t) atCursor: cursor context: nil]; *ref = (unsigned int)x; return; } } } } @end /** * Mutable version of [NSData]. Methods are provided for appending and * replacing bytes in the buffer, which will be grown as needed. */ @implementation NSMutableData + (id) allocWithZone: (NSZone*)z { if (self == NSMutableDataAbstract) { return NSAllocateObject(mutableDataMalloc, 0, z); } else { return NSAllocateObject(self, 0, z); } } - (NSUInteger) sizeOfContentExcluding: (NSHashTable*)exclude { return [self capacity]; } + (id) data { NSMutableData *d; d = [mutableDataMalloc allocWithZone: NSDefaultMallocZone()]; d = [d initWithCapacity: 0]; return AUTORELEASE(d); } + (id) dataWithBytes: (const void*)bytes length: (NSUInteger)length { NSData *d; d = [mutableDataMalloc allocWithZone: NSDefaultMallocZone()]; d = [d initWithBytes: bytes length: length]; return AUTORELEASE(d); } + (id) dataWithBytesNoCopy: (void*)bytes length: (NSUInteger)length { NSData *d; d = [mutableDataMalloc allocWithZone: NSDefaultMallocZone()]; d = [d initWithBytesNoCopy: bytes length: length]; return AUTORELEASE(d); } + (id) dataWithBytesNoCopy: (void*)aBuffer length: (NSUInteger)bufferSize freeWhenDone: (BOOL)shouldFree { NSData *d; d = [mutableDataMalloc allocWithZone: NSDefaultMallocZone()]; d = [d initWithBytesNoCopy: aBuffer length: bufferSize freeWhenDone: shouldFree]; return AUTORELEASE(d); } /** * New instance with buffer of given numBytes with length of valid data set * to zero. Note that capacity will be automatically increased as necessary. */ + (id) dataWithCapacity: (NSUInteger)numBytes { NSMutableData *d; d = [mutableDataMalloc allocWithZone: NSDefaultMallocZone()]; d = [d initWithCapacity: numBytes]; return AUTORELEASE(d); } + (id) dataWithContentsOfFile: (NSString*)path { NSMutableData *d; d = [mutableDataMalloc allocWithZone: NSDefaultMallocZone()]; d = [d initWithContentsOfFile: path]; return AUTORELEASE(d); } + (id) dataWithContentsOfMappedFile: (NSString*)path { NSMutableData *d; d = [mutableDataMalloc allocWithZone: NSDefaultMallocZone()]; d = [d initWithContentsOfMappedFile: path]; return AUTORELEASE(d); } + (id) dataWithContentsOfURL: (NSURL*)url { NSMutableData *d; NSData *data; d = [mutableDataMalloc allocWithZone: NSDefaultMallocZone()]; data = [url resourceDataUsingCache: YES]; d = [d initWithBytes: [data bytes] length: [data length]]; return AUTORELEASE(d); } + (id) dataWithData: (NSData*)data { NSMutableData *d; d = [mutableDataMalloc allocWithZone: NSDefaultMallocZone()]; d = [d initWithBytes: [data bytes] length: [data length]]; return AUTORELEASE(d); } /** * New instance with buffer of capacity and valid data size equal to given * length in bytes. The buffer contents are set to zero. The length of * valid data is set to zero. Note that buffer will be automatically * increased as necessary. */ + (id) dataWithLength: (NSUInteger)length { NSMutableData *d; d = [mutableDataMalloc allocWithZone: NSDefaultMallocZone()]; d = [d initWithLength: length]; return AUTORELEASE(d); } + (id) new { NSMutableData *d; d = [mutableDataMalloc allocWithZone: NSDefaultMallocZone()]; d = [d initWithCapacity: 0]; return d; } - (const void*) bytes { return [self mutableBytes]; } - (void) encodeWithCoder: (NSCoder*)aCoder { NSUInteger length = [self length]; void *bytes = [self mutableBytes]; if ([aCoder allowsKeyedCoding]) { [aCoder encodeBytes: bytes length: length forKey: @"NS.data"]; } else { [aCoder encodeValueOfObjCType: @encode(NSUInteger) at: &length]; if (length) { [aCoder encodeArrayOfObjCType: @encode(unsigned char) count: length at: bytes]; } } } /** * Initialize with buffer capable of holding size bytes. The length of valid * data is initially set to zero. * */ - (id) initWithCapacity: (NSUInteger)capacity { [self subclassResponsibility: _cmd]; return nil; } - (id) initWithCoder: (NSCoder*)aCoder { if ([aCoder allowsKeyedCoding]) { const uint8_t *data; NSUInteger l; data = [aCoder decodeBytesForKey: @"NS.data" returnedLength: &l]; self = [self initWithBytes: data length: l]; } else { NSUInteger l; [aCoder decodeValueOfObjCType: @encode(NSUInteger) at: &l]; if (l) { void *b; b = NSZoneMalloc([self zone], l); if (b == 0) { NSLog(@"[NSDataMalloc -initWithCoder:] unable to get %u bytes", (unsigned int)l); DESTROY(self); return nil; } [aCoder decodeArrayOfObjCType: @encode(unsigned char) count: l at: b]; self = [self initWithBytesNoCopy: b length: l]; } else { self = [self initWithBytesNoCopy: 0 length: 0]; } } return self; } /** * Initialize with buffer of capacity equal to length, and with the length * of valid data set to length. Data is set to zero. */ - (id) initWithLength: (NSUInteger)length { [self subclassResponsibility: _cmd]; return nil; } // Adjusting Capacity /** * Increases buffer length by given number of bytes, filling the new space * with zeros. */ - (void) increaseLengthBy: (NSUInteger)extraLength { [self setLength: [self length]+extraLength]; } /** *

* Sets the length of the NSMutableData object. * If the length is increased, the newly allocated data area * is filled with zero bytes. *

*

* This is a 'primitive' method ... you need to implement it * if you write a subclass of NSMutableData. *

*/ - (void) setLength: (NSUInteger)size { [self subclassResponsibility: _cmd]; } /** *

* Returns a pointer to the data storage of the receiver.
* Modifications to the memory pointed to by this pointer will * change the contents of the object. It is important that * your code should not try to modify the memory beyond the * number of bytes given by the -length method. *

*

* NB. if the object is released, or any method that changes its * size or content is called, then the pointer previously returned * by this method may cease to be valid. *

*

* This is a 'primitive' method ... you need to implement it * if you write a subclass of NSMutableData. *

*/ - (void*) mutableBytes { [self subclassResponsibility: _cmd]; return 0; } // Appending Data /** * Appends bufferSize bytes from aBuffer to data, increasing capacity if * necessary. */ - (void) appendBytes: (const void*)aBuffer length: (NSUInteger)bufferSize { NSUInteger oldLength = [self length]; void *buffer; [self setLength: oldLength + bufferSize]; buffer = [self mutableBytes]; if (0 == buffer) { [NSException raise: NSInternalInconsistencyException format: @"missing bytes in appendBytes:length:"]; } memcpy(buffer + oldLength, aBuffer, bufferSize); } /** * Copies and appends data from other to data, increasing capacity if * necessary. */ - (void) appendData: (NSData*)other { [self appendBytes: [other bytes] length: [other length]]; } /** * Replaces the bytes of data in the specified range with a * copy of the new bytes supplied.
* If the location of the range specified lies beyond the end * of the data ([self length] < range.location) * then a range exception is raised.
* Otherwise, if the range specified extends beyond the end * of the data, then the size of the data is increased to * accommodate the new bytes.
*/ - (void) replaceBytesInRange: (NSRange)aRange withBytes: (const void*)bytes { NSUInteger size = [self length]; NSUInteger need = NSMaxRange(aRange); if (aRange.location > size) { [NSException raise: NSRangeException format: @"location bad in %@", NSStringFromSelector(_cmd)]; } if (aRange.length > 0) { void *buf; if (need > size) { [self setLength: need]; } buf = [self mutableBytes]; if (0 == buf) { [NSException raise: NSInternalInconsistencyException format: @"missing bytes in %@", NSStringFromSelector(_cmd)]; } memmove(buf + aRange.location, bytes, aRange.length); } } /** * Replace the content of the receiver which lies in aRange with * the specified length of data from the buffer pointed to by bytes.
* The size of the receiver is adjusted to allow for the change. */ - (void) replaceBytesInRange: (NSRange)aRange withBytes: (const void*)bytes length: (NSUInteger)length { NSUInteger size = [self length]; NSUInteger end = NSMaxRange(aRange); NSInteger shift = length - aRange.length; NSUInteger need = size + shift; void *buf; if (aRange.location > size) { [NSException raise: NSRangeException format: @"location bad in %@", NSStringFromSelector(_cmd)]; } if (0 == length && 0 == shift) { return; // Nothing to do } if (need > size) { [self setLength: need]; } buf = [self mutableBytes]; if (0 == buf) { [NSException raise: NSInternalInconsistencyException format: @"missing bytes in %@", NSStringFromSelector(_cmd)]; } if (shift < 0) { if (length > 0) { // Copy bytes into place. memmove(buf + aRange.location, bytes, length); } // Fill gap memmove(buf + end + shift, buf + end, size - end); } else { if (shift > 0) { // Open space memmove(buf + end + shift, buf + end, size - end); } if (length > 0) { // Copy bytes into place. memmove(buf + aRange.location, bytes, length); } } if (need < size) { [self setLength: need]; } } /** * Set bytes in aRange to 0. */ - (void) resetBytesInRange: (NSRange)aRange { NSUInteger size = [self length]; void *bytes = [self mutableBytes]; GS_RANGE_CHECK(aRange, size); if (0 == bytes) { [NSException raise: NSInternalInconsistencyException format: @"missing bytes in resetBytesInRange:"]; } memset((char*)bytes + aRange.location, 0, aRange.length); } /** * Replaces contents of buffer with contents of data's buffer, increasing * or shrinking capacity to match. */ - (void) setData: (NSData*)data { NSRange r = NSMakeRange(0, [data length]); [self setCapacity: r.length]; [self replaceBytesInRange: r withBytes: [data bytes]]; } // Serializing Data /** * Does not act as the name suggests. Instead, serializes length itself * as an int into buffer. */ - (void) serializeAlignedBytesLength: (unsigned int)length { [self serializeInt: length]; } - (void) serializeDataAt: (const void*)data ofObjCType: (const char*)type context: (id )callback { if (!data || !type) return; switch (*type) { case _C_ID: [callback serializeObjectAt: (id*)data ofObjCType: type intoData: self]; return; case _C_CHARPTR: { uint32_t len; uint32_t ni; if (!*(void**)data) { ni = (uint32_t)-1; ni = GSSwapHostI32ToBig(ni); [self appendBytes: (void*)&ni length: sizeof(ni)]; return; } len = (uint32_t)strlen(*(void**)data); ni = GSSwapHostI32ToBig(len); [self appendBytes: (void*)&ni length: sizeof(ni)]; [self appendBytes: *(void**)data length: len]; return; } case _C_ARY_B: { unsigned offset = 0; unsigned size; unsigned count = atoi(++type); unsigned i; while (isdigit(*type)) { type++; } size = objc_sizeof_type(type); for (i = 0; i < count; i++) { [self serializeDataAt: (char*)data + offset ofObjCType: type context: callback]; offset += size; } return; } case _C_STRUCT_B: { struct objc_struct_layout layout; objc_layout_structure (type, &layout); while (objc_layout_structure_next_member (&layout)) { unsigned offset; unsigned align; const char *ftype; objc_layout_structure_get_info (&layout, &offset, &align, &ftype); [self serializeDataAt: ((char*)data) + offset ofObjCType: ftype context: callback]; } return; } case _C_PTR: [self serializeDataAt: *(char**)data ofObjCType: ++type context: callback]; return; case _C_CHR: case _C_UCHR: [self appendBytes: data length: sizeof(unsigned char)]; return; case _C_SHT: case _C_USHT: { unsigned short ns = NSSwapHostShortToBig(*(unsigned short*)data); [self appendBytes: &ns length: sizeof(unsigned short)]; return; } case _C_INT: case _C_UINT: { unsigned ni = NSSwapHostIntToBig(*(unsigned int*)data); [self appendBytes: &ni length: sizeof(unsigned)]; return; } case _C_LNG: case _C_ULNG: { unsigned long nl = NSSwapHostLongToBig(*(unsigned long*)data); [self appendBytes: &nl length: sizeof(unsigned long)]; return; } case _C_LNG_LNG: case _C_ULNG_LNG: { unsigned long long nl; nl = NSSwapHostLongLongToBig(*(unsigned long long*)data); [self appendBytes: &nl length: sizeof(unsigned long long)]; return; } case _C_FLT: { NSSwappedFloat nf = NSSwapHostFloatToBig(*(float*)data); [self appendBytes: &nf length: sizeof(NSSwappedFloat)]; return; } case _C_DBL: { NSSwappedDouble nd = NSSwapHostDoubleToBig(*(double*)data); [self appendBytes: &nd length: sizeof(NSSwappedDouble)]; return; } #if defined(_C_BOOL) && (!defined(__GNUC__) || __GNUC__ > 2) case _C_BOOL: [self appendBytes: data length: sizeof(_Bool)]; return; #endif case _C_CLASS: { const char *name = *(Class*)data?class_getName(*(Class*)data):""; uint16_t ln = (uint16_t)strlen(name); uint16_t ni; ni = GSSwapHostI16ToBig(ln); [self appendBytes: &ni length: sizeof(ni)]; if (ln) { [self appendBytes: name length: ln]; } return; } case _C_SEL: { const char *name = *(SEL*)data?sel_getName(*(SEL*)data):""; uint16_t ln = (name == 0) ? 0 : (uint16_t)strlen(name); const char *types = *(SEL*)data?GSTypesFromSelector(*(SEL*)data):""; uint16_t lt = (types == 0) ? 0 : (uint16_t)strlen(types); uint16_t ni; ni = GSSwapHostI16ToBig(ln); [self appendBytes: &ni length: sizeof(ni)]; ni = GSSwapHostI16ToBig(lt); [self appendBytes: &ni length: sizeof(ni)]; if (ln) { [self appendBytes: name length: ln]; } if (lt) { [self appendBytes: types length: lt]; } return; } default: [NSException raise: NSGenericException format: @"Unknown type to serialize - '%s'", type]; } } /** * Serialize an int into this object's data buffer, swapping it to network * (big-endian) byte order first. */ - (void) serializeInt: (int)value { unsigned ni = NSSwapHostIntToBig(value); [self appendBytes: &ni length: sizeof(unsigned)]; } /** * Serialize an int into this object's data buffer at index (replacing * anything there currently), swapping it to network (big-endian) byte order * first. */ - (void) serializeInt: (int)value atIndex: (unsigned int)index { unsigned ni = NSSwapHostIntToBig(value); NSRange range = { index, sizeof(int) }; [self replaceBytesInRange: range withBytes: &ni]; } /** * Serialize one or more ints into this object's data buffer, swapping them to * network (big-endian) byte order first. */ - (void) serializeInts: (int*)intBuffer count: (unsigned int)numInts { unsigned i; SEL sel = @selector(serializeInt:); IMP imp = [self methodForSelector: sel]; for (i = 0; i < numInts; i++) { (*imp)(self, sel, intBuffer[i]); } } /** * Serialize one or more ints into this object's data buffer at index * (replacing anything there currently), swapping them to network (big-endian) * byte order first. */ - (void) serializeInts: (int*)intBuffer count: (unsigned int)numInts atIndex: (unsigned int)index { unsigned i; SEL sel = @selector(serializeInt:atIndex:); IMP imp = [self methodForSelector: sel]; for (i = 0; i < numInts; i++) { (*imp)(self, sel, intBuffer[i], index++); } } @end /** * Provides some additional methods to [NSData]. */ @implementation NSMutableData (GNUstepExtensions) /** * New instance with given shared memory ID. */ + (id) dataWithShmID: (int)anID length: (NSUInteger)length { #ifdef HAVE_SHMCTL NSMutableDataShared *d; d = [NSMutableDataShared allocWithZone: NSDefaultMallocZone()]; d = [d initWithShmID: anID length: length]; return AUTORELEASE(d); #else NSLog(@"[NSMutableData -dataWithSmdID:length:] no shared memory support"); return nil; #endif } /** * New instance with given bytes in shared memory. */ + (id) dataWithSharedBytes: (const void*)bytes length: (NSUInteger)length { NSData *d; #ifdef HAVE_SHMCTL d = [NSMutableDataShared allocWithZone: NSDefaultMallocZone()]; d = [d initWithBytes: bytes length: length]; #else d = [mutableDataMalloc allocWithZone: NSDefaultMallocZone()]; d = [d initWithBytes: bytes length: length]; #endif return AUTORELEASE(d); } /** * Returns current capacity of data buffer. */ - (NSUInteger) capacity { [self subclassResponsibility: _cmd]; return 0; } /** * Sets current capacity of data buffer. Unlike [-setLength:], this will * shrink the buffer if requested. */ - (id) setCapacity: (NSUInteger)newCapacity { [self subclassResponsibility: _cmd]; return nil; } /** * Return shared memory ID, if using one, else -1. */ - (int) shmID { return -1; } - (void) serializeTypeTag: (unsigned char)tag { [self serializeDataAt: (void*)&tag ofObjCType: @encode(unsigned char) context: nil]; } - (void) serializeTypeTag: (unsigned char)tag andCrossRef: (unsigned int)xref { if (xref <= 0xff) { uint8_t x = (uint8_t)xref; tag = (tag & ~_GSC_SIZE) | _GSC_X_1; [self serializeDataAt: (void*)&tag ofObjCType: @encode(unsigned char) context: nil]; [self serializeDataAt: (void*)&x ofObjCType: @encode(uint8_t) context: nil]; } else if (xref <= 0xffff) { uint16_t x = (uint16_t)xref; tag = (tag & ~_GSC_SIZE) | _GSC_X_2; [self serializeDataAt: (void*)&tag ofObjCType: @encode(unsigned char) context: nil]; [self serializeDataAt: (void*)&x ofObjCType: @encode(uint16_t) context: nil]; } else { uint32_t x = (uint32_t)xref; tag = (tag & ~_GSC_SIZE) | _GSC_X_4; [self serializeDataAt: (void*)&tag ofObjCType: @encode(unsigned char) context: nil]; [self serializeDataAt: (void*)&x ofObjCType: @encode(uint32_t) context: nil]; } } @end /* * This is the top of the hierarchy of concrete implementations. * As such, it contains efficient implementations of most methods. */ @implementation NSDataStatic + (id) allocWithZone: (NSZone*)z { return NSAllocateObject(self, 0, z); } /* Creation and Destruction of objects. */ - (id) copyWithZone: (NSZone*)z { return RETAIN(self); } - (id) mutableCopyWithZone: (NSZone*)z { return [[mutableDataMalloc allocWithZone: z] initWithBytes: bytes length: length]; } - (void) dealloc { bytes = 0; length = 0; [super dealloc]; } - (id) initWithBytesNoCopy: (void*)aBuffer length: (NSUInteger)bufferSize freeWhenDone: (BOOL)shouldFree { if (aBuffer == 0 && bufferSize > 0) { [NSException raise: NSInvalidArgumentException format: @"[%@-initWithBytesNoCopy:length:freeWhenDone:] called with " @"length but null bytes", NSStringFromClass([self class])]; } bytes = aBuffer; length = bufferSize; return self; } - (Class) classForCoder { return NSDataAbstract; } /* Basic methods */ - (const void*) bytes { return bytes; } - (void) getBytes: (void*)buffer range: (NSRange)aRange { GS_RANGE_CHECK(aRange, length); memcpy(buffer, bytes + aRange.location, aRange.length); } - (NSUInteger) length { return length; } static inline void getBytes(void* dst, void* src, unsigned len, unsigned limit, unsigned *pos) { if (*pos > limit || len > limit || len+*pos > limit) { [NSException raise: NSRangeException format: @"Range: (%u, %u) Size: %d", *pos, len, limit]; } memcpy(dst, src + *pos, len); *pos += len; } - (void) deserializeDataAt: (void*)data ofObjCType: (const char*)type atCursor: (unsigned int*)cursor context: (id )callback { if (data == 0 || type == 0) { if (data == 0) { NSLog(@"attempt to deserialize to a null pointer"); } if (type == 0) { NSLog(@"attempt to deserialize with a null type encoding"); } return; } switch (*type) { case _C_ID: { [callback deserializeObjectAt: data ofObjCType: type fromData: self atCursor: cursor]; return; } case _C_CHARPTR: { int32_t len; [self deserializeBytes: &len length: sizeof(len) atCursor: cursor]; len = GSSwapBigI32ToHost(len); if (len == -1) { *(const char**)data = 0; return; } else { *(char**)data = (char*)NSZoneMalloc(NSDefaultMallocZone(), len+1); if (*(char**)data == 0) { [NSException raise: NSMallocException format: @"out of memory to deserialize bytes"]; } } getBytes(*(void**)data, bytes, len, length, cursor); (*(char**)data)[len] = '\0'; return; } case _C_ARY_B: { unsigned offset = 0; unsigned size; unsigned count = atoi(++type); unsigned i; while (isdigit(*type)) { type++; } size = objc_sizeof_type(type); for (i = 0; i < count; i++) { [self deserializeDataAt: (char*)data + offset ofObjCType: type atCursor: cursor context: callback]; offset += size; } return; } case _C_STRUCT_B: { struct objc_struct_layout layout; objc_layout_structure (type, &layout); while (objc_layout_structure_next_member (&layout)) { unsigned offset; unsigned align; const char *ftype; objc_layout_structure_get_info (&layout, &offset, &align, &ftype); [self deserializeDataAt: ((char*)data) + offset ofObjCType: ftype atCursor: cursor context: callback]; } return; } case _C_PTR: { unsigned len = objc_sizeof_type(++type); *(char**)data = (char*)NSZoneMalloc(NSDefaultMallocZone(), len); if (*(char**)data == 0) { [NSException raise: NSMallocException format: @"out of memory to deserialize bytes"]; } [self deserializeDataAt: *(char**)data ofObjCType: type atCursor: cursor context: callback]; return; } case _C_CHR: case _C_UCHR: { getBytes(data, bytes, sizeof(unsigned char), length, cursor); return; } case _C_SHT: case _C_USHT: { unsigned short ns; getBytes((void*)&ns, bytes, sizeof(ns), length, cursor); *(unsigned short*)data = NSSwapBigShortToHost(ns); return; } case _C_INT: case _C_UINT: { unsigned ni; getBytes((void*)&ni, bytes, sizeof(ni), length, cursor); *(unsigned*)data = NSSwapBigIntToHost(ni); return; } case _C_LNG: case _C_ULNG: { unsigned long nl; getBytes((void*)&nl, bytes, sizeof(nl), length, cursor); *(unsigned long*)data = NSSwapBigLongToHost(nl); return; } case _C_LNG_LNG: case _C_ULNG_LNG: { unsigned long long nl; getBytes((void*)&nl, bytes, sizeof(nl), length, cursor); *(unsigned long long*)data = NSSwapBigLongLongToHost(nl); return; } case _C_FLT: { NSSwappedFloat nf; getBytes((void*)&nf, bytes, sizeof(nf), length, cursor); *(float*)data = NSSwapBigFloatToHost(nf); return; } case _C_DBL: { NSSwappedDouble nd; getBytes((void*)&nd, bytes, sizeof(nd), length, cursor); *(double*)data = NSSwapBigDoubleToHost(nd); return; } #if defined(_C_BOOL) && (!defined(__GNUC__) || __GNUC__ > 2) case _C_BOOL: { getBytes(data, bytes, sizeof(_Bool), length, cursor); return; } #endif case _C_CLASS: { uint16_t ni; getBytes((void*)&ni, bytes, sizeof(ni), length, cursor); ni = GSSwapBigI16ToHost(ni); if (ni == 0) { *(Class*)data = 0; } else { char name[ni+1]; Class c; getBytes((void*)name, bytes, ni, length, cursor); name[ni] = '\0'; c = objc_lookUpClass(name); if (c == 0) { NSLog(@"[%s %s] can't find class - %s", class_getName([self class]), sel_getName(_cmd), name); } *(Class*)data = c; } return; } case _C_SEL: { uint16_t ln; uint16_t lt; getBytes((void*)&ln, bytes, sizeof(ln), length, cursor); ln = GSSwapBigI16ToHost(ln); getBytes((void*)<, bytes, sizeof(lt), length, cursor); lt = GSSwapBigI16ToHost(lt); if (ln == 0) { *(SEL*)data = 0; } else { char name[ln+1]; char types[lt+1]; SEL sel; getBytes((void*)name, bytes, ln, length, cursor); name[ln] = '\0'; getBytes((void*)types, bytes, lt, length, cursor); types[lt] = '\0'; if (lt) { sel = GSSelectorFromNameAndTypes(name, types); } else { sel = sel_registerName(name); } if (sel == 0) { [NSException raise: NSInternalInconsistencyException format: @"can't make sel with name '%s' " @"and types '%s'", name, types]; } *(SEL*)data = sel; } return; } default: [NSException raise: NSGenericException format: @"Unknown type to deserialize - '%s'", type]; } } - (void) deserializeTypeTag: (unsigned char*)tag andCrossRef: (unsigned int*)ref atCursor: (unsigned int*)cursor { if (*cursor >= length) { [NSException raise: NSRangeException format: @"Range: (%u, 1) Size: %"PRIuPTR, *cursor, length]; } *tag = *((unsigned char*)bytes + (*cursor)++); if (*tag & _GSC_MAYX) { switch (*tag & _GSC_SIZE) { case _GSC_X_0: { return; } case _GSC_X_1: { if (*cursor >= length) { [NSException raise: NSRangeException format: @"Range: (%u, 1) Size: %"PRIuPTR, *cursor, length]; } *ref = (unsigned int)*((unsigned char*)bytes + (*cursor)++); return; } case _GSC_X_2: { uint16_t x; if (*cursor >= length-1) { [NSException raise: NSRangeException format: @"Range: (%u, 1) Size: %"PRIuPTR, *cursor, length]; } #if NEED_WORD_ALIGNMENT if ((*cursor % __alignof__(uint16_t)) != 0) memcpy(&x, (bytes + *cursor), 2); else #endif x = *(uint16_t*)(bytes + *cursor); *cursor += 2; *ref = (unsigned int)GSSwapBigI16ToHost(x); return; } default: { uint32_t x; if (*cursor >= length-3) { [NSException raise: NSRangeException format: @"Range: (%u, 1) Size: %"PRIuPTR, *cursor, length]; } #if NEED_WORD_ALIGNMENT if ((*cursor % __alignof__(uint32_t)) != 0) memcpy(&x, (bytes + *cursor), 4); else #endif x = *(uint32_t*)(bytes + *cursor); *cursor += 4; *ref = (unsigned int)GSSwapBigI32ToHost(x); return; } } } } @end @implementation NSDataEmpty - (void) dealloc { GSNOSUPERDEALLOC; } @end @implementation NSDataMalloc - (id) copyWithZone: (NSZone*)z { if (NSShouldRetainWithZone(self, z)) return RETAIN(self); else return [[dataMalloc allocWithZone: z] initWithBytes: bytes length: length]; } - (void) dealloc { if (bytes != 0) { NSZoneFree(NSZoneFromPointer(bytes), bytes); bytes = 0; } [super dealloc]; } - (id) initWithBytesNoCopy: (void*)aBuffer length: (NSUInteger)bufferSize freeWhenDone: (BOOL)shouldFree { if (aBuffer == 0 && bufferSize > 0) { [NSException raise: NSInvalidArgumentException format: @"[%@-initWithBytesNoCopy:length:freeWhenDone:] called with " @"length but null bytes", NSStringFromClass([self class])]; } if (shouldFree == NO) { GSClassSwizzle(self, dataStatic); } bytes = aBuffer; length = bufferSize; return self; } - (instancetype) initWithBytesNoCopy: (void*)buf length: (NSUInteger)len deallocator: (GSDataDeallocatorBlock)deallocBlock { if (buf == NULL && len > 0) { [self release]; [NSException raise: NSInvalidArgumentException format: @"[%@-initWithBytesNoCopy:length:deallocator:] called with " @"length but NULL bytes", NSStringFromClass([self class])]; } else if (NULL == deallocBlock) { // For a nil deallocator we can just swizzle into a static data object GSClassSwizzle(self, dataStatic); bytes = buf; length = len; return self; } GSClassSwizzle(self, dataBlock); bytes = buf; length = len; ASSIGN(deallocator, (id)deallocBlock); return self; } @end @implementation NSDataWithDeallocatorBlock - (instancetype) initWithBytesNoCopy: (void*)buf length: (NSUInteger)len deallocator: (GSDataDeallocatorBlock)deallocBlock { if (buf == NULL && len > 0) { [self release]; [NSException raise: NSInvalidArgumentException format: @"[%@-initWithBytesNoCopy:length:deallocator:] called with " @"length but NULL bytes", NSStringFromClass([self class])]; } bytes = buf; length = len; ASSIGN(deallocator, (id)deallocBlock); return self; } - (void) dealloc { if (deallocator != NULL) { CALL_NON_NULL_BLOCK(((GSDataDeallocatorBlock)deallocator), bytes, length); DESTROY(deallocator); } // Clear out the ivars so that super doesn't double free. bytes = NULL; length = 0; [super dealloc]; } @end #ifdef HAVE_MMAP @implementation NSDataMappedFile + (id) allocWithZone: (NSZone*)z { return NSAllocateObject([NSDataMappedFile class], 0, z); } - (void) dealloc { [self finalize]; [super dealloc]; } - (void) finalize { if (bytes != 0) { munmap(bytes, length); bytes = 0; } [super finalize]; } /** * Initialize with data pointing to contents of file at path. Bytes are * only "swapped in" as needed. File should not be moved or deleted for * the life of this object. */ - (id) initWithContentsOfMappedFile: (NSString*)path { off_t off; int fd; const GSNativeChar *thePath = [path fileSystemRepresentation]; if (thePath == 0) { NSWarnMLog(@"Open (%@) attempt failed - bad path", path); DESTROY(self); return nil; } #if defined(_WIN32) fd = _wopen(thePath, _O_RDONLY); #else fd = open(thePath, O_RDONLY); #endif if (fd < 0) { NSWarnMLog(@"unable to open %@ - %@", path, [NSError _last]); DESTROY(self); return nil; } /* Find size of file to be mapped. */ off = lseek(fd, 0, SEEK_END); if (off < 0) { NSWarnMLog(@"unable to seek to eof %@ - %@", path, [NSError _last]); close(fd); DESTROY(self); return nil; } length = off; /* Position at start of file. */ if (lseek(fd, 0, SEEK_SET) != 0) { NSWarnMLog(@"unable to seek to sof %@ - %@", path, [NSError _last]); close(fd); DESTROY(self); return nil; } bytes = mmap(0, length, PROT_READ, MAP_SHARED, fd, 0); if (bytes == MAP_FAILED) { NSWarnMLog(@"mapping failed for %@ - %@", path, [NSError _last]); DESTROY(self); self = [dataMalloc allocWithZone: NSDefaultMallocZone()]; self = [self initWithContentsOfFile: path]; } close(fd); return self; } @end #endif /* HAVE_MMAP */ #ifdef HAVE_SHMCTL @implementation NSDataShared + (id) allocWithZone: (NSZone*)z { return NSAllocateObject([NSDataShared class], 0, z); } - (void) dealloc { if (bytes != 0) { struct shmid_ds buf; if (shmctl(shmid, IPC_STAT, &buf) < 0) NSLog(@"[NSDataShared -dealloc] shared memory control failed - %@", [NSError _last]); else if (buf.shm_nattch == 1) if (shmctl(shmid, IPC_RMID, &buf) < 0) /* Mark for deletion. */ NSLog(@"[NSDataShared -dealloc] shared memory delete failed - %@", [NSError _last]); if (shmdt(bytes) < 0) NSLog(@"[NSDataShared -dealloc] shared memory detach failed - %@", [NSError _last]); bytes = 0; length = 0; shmid = -1; } [super dealloc]; } - (id) initWithBytes: (const void*)aBuffer length: (NSUInteger)bufferSize { shmid = -1; if (bufferSize > 0) { if (aBuffer == 0) { [NSException raise: NSInvalidArgumentException format: @"[%@-initWithBytes:length:] called with " @"length but null bytes", NSStringFromClass([self class])]; } shmid = shmget(IPC_PRIVATE, bufferSize, IPC_CREAT|VM_RDONLY); if (shmid == -1) /* Created memory? */ { NSLog(@"[-initWithBytes:length:] shared mem get failed for %" PRIuPTR" - %@", bufferSize, [NSError _last]); DESTROY(self); self = [dataMalloc allocWithZone: NSDefaultMallocZone()]; return [self initWithBytes: aBuffer length: bufferSize]; } bytes = shmat(shmid, 0, 0); if (bytes == (void*)-1) { NSLog(@"[-initWithBytes:length:] shared mem attach failed for %" PRIuPTR" - %@", bufferSize, [NSError _last]); bytes = 0; DESTROY(self); self = [dataMalloc allocWithZone: NSDefaultMallocZone()]; return [self initWithBytes: aBuffer length: bufferSize]; } length = bufferSize; } return self; } - (id) initWithShmID: (int)anId length: (NSUInteger)bufferSize { struct shmid_ds buf; shmid = anId; if (shmctl(shmid, IPC_STAT, &buf) < 0) { NSLog(@"[NSDataShared -initWithShmID:length:] shared memory " @"control failed - %@", [NSError _last]); DESTROY(self); /* Unable to access memory. */ return nil; } if (buf.shm_segsz < bufferSize) { NSLog(@"[NSDataShared -initWithShmID:length:] shared memory " @"segment too small"); DESTROY(self); /* Memory segment too small. */ return nil; } bytes = shmat(shmid, 0, 0); if (bytes == (void*)-1) { NSLog(@"[NSDataShared -initWithShmID:length:] shared memory " @"attach failed - %@", [NSError _last]); bytes = 0; DESTROY(self); /* Unable to attach to memory. */ return nil; } length = bufferSize; return self; } - (int) shmID { return shmid; } @end #endif /* HAVE_SHMCTL */ @implementation NSMutableDataMalloc + (void) initialize { if (self == [NSMutableDataMalloc class]) { GSObjCAddClassBehavior(self, [NSDataMalloc class]); } } + (id) allocWithZone: (NSZone*)z { return NSAllocateObject(mutableDataMalloc, 0, z); } - (Class) classForCoder { return NSMutableDataAbstract; } - (id) copyWithZone: (NSZone*)z { return [[dataMalloc allocWithZone: z] initWithBytes: bytes length: length]; } - (void) dealloc { if (bytes != 0) { if (zone != 0) { NSZoneFree(zone, bytes); } bytes = 0; } [super dealloc]; } - (id) initWithBytes: (const void*)aBuffer length: (NSUInteger)bufferSize { self = [self initWithCapacity: bufferSize]; if (self) { if (bufferSize > 0) { if (aBuffer == 0) { [NSException raise: NSInvalidArgumentException format: @"[%@-initWithBytes:length:] called with " @"length but null bytes", NSStringFromClass([self class])]; } length = bufferSize; memcpy(bytes, aBuffer, length); } } return self; } - (id) initWithBytesNoCopy: (void*)aBuffer length: (NSUInteger)bufferSize freeWhenDone: (BOOL)shouldFree { if (aBuffer == 0) { if (bufferSize > 0) { [NSException raise: NSInvalidArgumentException format: @"[%@-initWithBytesNoCopy:length:freeWhenDone:] called with " @"length but null bytes", NSStringFromClass([self class])]; } self = [self initWithCapacity: bufferSize]; [self setLength: 0]; return self; } self = [self initWithCapacity: 0]; if (self) { if (shouldFree == NO) { zone = 0; // Don't free this memory. } else { zone = NSZoneFromPointer(aBuffer); } bytes = aBuffer; length = bufferSize; capacity = bufferSize; growth = capacity/2; if (growth == 0) { growth = 1; } } return self; } - (instancetype) initWithBytesNoCopy: (void*)buf length: (NSUInteger)len deallocator: (GSDataDeallocatorBlock)deallocBlock; { if (buf == NULL && len > 0) { [self release]; [NSException raise: NSInvalidArgumentException format: @"[%@-initWithBytesNoCopy:length:deallocator:] called with " @"length but NULL bytes", NSStringFromClass([self class])]; } else if (NULL == deallocBlock) { // Can reuse this class. return [self initWithBytesNoCopy: buf length: len freeWhenDone: NO]; } /* * Custom deallocator. swizzle to NSMutableDataWithDeallocatorBlock */ GSClassSwizzle(self, mutableDataBlock); if (nil == (self = [self initWithBytesNoCopy: buf length: len freeWhenDone: NO])) { return nil; } ASSIGN(deallocator, (id)deallocBlock); return self; } // THIS IS THE DESIGNATED INITIALISER /** * Initialize with buffer capable of holding size bytes. * */ - (id) initWithCapacity: (NSUInteger)size { if (size) { zone = [self zone]; bytes = NSZoneMalloc(zone, size); if (bytes == 0) { NSLog(@"[NSMutableDataMalloc -initWithCapacity:] out of memory " @"for %"PRIuPTR" bytes - %@", size, [NSError _last]); DESTROY(self); return nil; } } capacity = size; growth = capacity/2; if (growth == 0) { growth = 1; } length = 0; return self; } /** * Initialize with buffer capable of holding size bytes. Buffer is zeroed * out. */ - (id) initWithLength: (NSUInteger)size { self = [self initWithCapacity: size]; if (self) { memset(bytes, '\0', size); length = size; } return self; } - (id) initWithContentsOfMappedFile: (NSString *)path { return [self initWithContentsOfFile: path]; } - (void) appendBytes: (const void*)aBuffer length: (NSUInteger)bufferSize { if (bufferSize > 0) { NSUInteger oldLength = length; NSUInteger minimum = length + bufferSize; if (aBuffer == 0) { [NSException raise: NSInvalidArgumentException format: @"[%@-appendBytes:length:] called with " @"length but null bytes", NSStringFromClass([self class])]; } if (minimum > capacity) { [self _grow: minimum]; } memcpy(bytes + oldLength, aBuffer, bufferSize); length = minimum; } } - (NSUInteger) capacity { return capacity; } - (void) _grow: (NSUInteger)minimum { if (minimum > capacity) { NSUInteger nextCapacity = capacity + growth; NSUInteger nextGrowth = capacity ? capacity : 1; while (nextCapacity < minimum) { NSUInteger tmp = nextCapacity + nextGrowth; nextGrowth = nextCapacity; nextCapacity = tmp; } [self setCapacity: nextCapacity]; growth = nextGrowth; } } - (void*) mutableBytes { return bytes; } - (void) replaceBytesInRange: (NSRange)aRange withBytes: (const void*)moreBytes { NSUInteger need = NSMaxRange(aRange); if (aRange.location > length) { [NSException raise: NSRangeException format: @"location bad in replaceBytesInRange:withBytes:"]; } if (aRange.length > 0) { if (moreBytes == 0) { [NSException raise: NSInvalidArgumentException format: @"[%@-replaceBytesInRange:withBytes:] called with " @"range but null bytes", NSStringFromClass([self class])]; } if (need > length) { [self setCapacity: need]; length = need; } memcpy(bytes + aRange.location, moreBytes, aRange.length); } } - (void) serializeDataAt: (const void*)data ofObjCType: (const char*)type context: (id )callback { if (data == 0 || type == 0) { if (data == 0) { NSLog(@"attempt to serialize from a null pointer"); } if (type == 0) { NSLog(@"attempt to serialize with a null type encoding"); } return; } switch (*type) { case _C_ID: [callback serializeObjectAt: (id*)data ofObjCType: type intoData: self]; return; case _C_CHARPTR: { unsigned len; int32_t ni; uint32_t minimum; if (!*(void**)data) { ni = -1; ni = GSSwapHostI32ToBig(ni); [self appendBytes: (void*)&len length: sizeof(len)]; return; } len = strlen(*(void**)data); ni = GSSwapHostI32ToBig(len); minimum = length + len + sizeof(ni); if (minimum > capacity) { [self _grow: minimum]; } memcpy(bytes+length, &ni, sizeof(ni)); length += sizeof(ni); if (len) { memcpy(bytes+length, *(void**)data, len); length += len; } return; } case _C_ARY_B: { unsigned offset = 0; unsigned size; unsigned count = atoi(++type); unsigned i; uint32_t minimum; while (isdigit(*type)) { type++; } size = objc_sizeof_type(type); /* * Serialized objects are going to take up at least as much * space as the originals, so we can calculate a minimum space * we are going to need and make sure our buffer is big enough. */ minimum = length + size*count; if (minimum > capacity) { [self _grow: minimum]; } for (i = 0; i < count; i++) { [self serializeDataAt: (char*)data + offset ofObjCType: type context: callback]; offset += size; } return; } case _C_STRUCT_B: { struct objc_struct_layout layout; objc_layout_structure (type, &layout); while (objc_layout_structure_next_member (&layout)) { unsigned offset; unsigned align; const char *ftype; objc_layout_structure_get_info (&layout, &offset, &align, &ftype); [self serializeDataAt: ((char*)data) + offset ofObjCType: ftype context: callback]; } return; } case _C_PTR: [self serializeDataAt: *(char**)data ofObjCType: ++type context: callback]; return; case _C_CHR: case _C_UCHR: (*appendImp)(self, appendSel, data, sizeof(unsigned char)); return; case _C_SHT: case _C_USHT: { unsigned short ns = NSSwapHostShortToBig(*(unsigned short*)data); (*appendImp)(self, appendSel, &ns, sizeof(unsigned short)); return; } case _C_INT: case _C_UINT: { unsigned ni = NSSwapHostIntToBig(*(unsigned int*)data); (*appendImp)(self, appendSel, &ni, sizeof(unsigned)); return; } case _C_LNG: case _C_ULNG: { unsigned long nl = NSSwapHostLongToBig(*(unsigned long*)data); (*appendImp)(self, appendSel, &nl, sizeof(unsigned long)); return; } case _C_LNG_LNG: case _C_ULNG_LNG: { unsigned long long nl; nl = NSSwapHostLongLongToBig(*(unsigned long long*)data); (*appendImp)(self, appendSel, &nl, sizeof(unsigned long long)); return; } case _C_FLT: { NSSwappedFloat nf = NSSwapHostFloatToBig(*(float*)data); (*appendImp)(self, appendSel, &nf, sizeof(NSSwappedFloat)); return; } case _C_DBL: { NSSwappedDouble nd = NSSwapHostDoubleToBig(*(double*)data); (*appendImp)(self, appendSel, &nd, sizeof(NSSwappedDouble)); return; } #if defined(_C_BOOL) && (!defined(__GNUC__) || __GNUC__ > 2) case _C_BOOL: (*appendImp)(self, appendSel, data, sizeof(_Bool)); return; #endif case _C_CLASS: { const char *name = *(Class*)data?class_getName(*(Class*)data):""; uint16_t ln = (uint16_t)strlen(name); uint32_t minimum = length + ln + sizeof(uint16_t); uint16_t ni; if (minimum > capacity) { [self _grow: minimum]; } ni = GSSwapHostI16ToBig(ln); memcpy(bytes+length, &ni, sizeof(ni)); length += sizeof(ni); if (ln) { memcpy(bytes+length, name, ln); length += ln; } return; } case _C_SEL: { const char *name = *(SEL*)data?sel_getName(*(SEL*)data):""; uint16_t ln = (name == 0) ? 0 : (uint16_t)strlen(name); const char *types = *(SEL*)data?GSTypesFromSelector(*(SEL*)data):""; uint16_t lt = (types == 0) ? 0 : (uint16_t)strlen(types); uint32_t minimum = length + ln + lt + 2*sizeof(uint16_t); uint16_t ni; if (minimum > capacity) { [self _grow: minimum]; } ni = GSSwapHostI16ToBig(ln); memcpy(bytes+length, &ni, sizeof(ni)); length += sizeof(ni); ni = GSSwapHostI16ToBig(lt); memcpy(bytes+length, &ni, sizeof(ni)); length += sizeof(ni); if (ln) { memcpy(bytes+length, name, ln); length += ln; } if (lt) { memcpy(bytes+length, types, lt); length += lt; } return; } default: [NSException raise: NSMallocException format: @"Unknown type to serialize - '%s'", type]; } } - (void) serializeTypeTag: (unsigned char)tag { if (length == capacity) { [self _grow: length + 1]; } ((unsigned char*)bytes)[length++] = tag; } - (void) serializeTypeTag: (unsigned char)tag andCrossRef: (unsigned int)xref { if (xref <= 0xff) { tag = (tag & ~_GSC_SIZE) | _GSC_X_1; if (length + 2 >= capacity) { [self _grow: length + 2]; } *(uint8_t*)(bytes + length++) = tag; *(uint8_t*)(bytes + length++) = xref; } else if (xref <= 0xffff) { uint16_t x = (uint16_t)xref; tag = (tag & ~_GSC_SIZE) | _GSC_X_2; if (length + 3 >= capacity) { [self _grow: length + 3]; } *(uint8_t*)(bytes + length++) = tag; #if NEED_WORD_ALIGNMENT if ((length % __alignof__(uint16_t)) != 0) { x = GSSwapHostI16ToBig(x); memcpy((bytes + length), &x, 2); } else #endif *(uint16_t*)(bytes + length) = GSSwapHostI16ToBig(x); length += 2; } else { uint32_t x = (uint32_t)xref; tag = (tag & ~_GSC_SIZE) | _GSC_X_4; if (length + 5 >= capacity) { [self _grow: length + 5]; } *(uint8_t*)(bytes + length++) = tag; #if NEED_WORD_ALIGNMENT if ((length % __alignof__(uint32_t)) != 0) { x = GSSwapHostI32ToBig(x); memcpy((bytes + length), &x, 4); } else #endif *(uint32_t*)(bytes + length) = GSSwapHostI32ToBig(x); length += 4; } } - (id) setCapacity: (NSUInteger)size { if (size != capacity) { void *tmp; tmp = NSZoneMalloc(zone, size); if (tmp == 0) { [NSException raise: NSMallocException format: @"Unable to set data capacity to '%"PRIuPTR"'", size]; } if (bytes) { memcpy(tmp, bytes, capacity < size ? capacity : size); if (zone == 0) { zone = NSDefaultMallocZone(); } else { NSZoneFree(zone, bytes); } } else if (zone == 0) { zone = NSDefaultMallocZone(); } bytes = tmp; capacity = size; growth = capacity/2; if (growth == 0) { growth = 1; } } if (size < length) { length = size; } return self; } - (void) setData: (NSData*)data { NSUInteger l = [data length]; [self setCapacity: l]; length = l; memcpy(bytes, [data bytes], length); } - (void) setLength: (NSUInteger)size { if (size > capacity) { NSUInteger growTo = capacity + capacity / 2; if (size > growTo) { growTo = size; } [self setCapacity: growTo]; } if (size > length) { memset(bytes + length, '\0', size - length); } length = size; } @end @implementation NSMutableDataWithDeallocatorBlock + (id) allocWithZone: (NSZone*)z { return NSAllocateObject(mutableDataBlock, 0, z); } - (instancetype) initWithBytesNoCopy: (void*)buf length: (NSUInteger)len deallocator: (GSDataDeallocatorBlock)deallocBlock { if (buf == NULL && len > 0) { [self release]; [NSException raise: NSInvalidArgumentException format: @"[%@-initWithBytesNoCopy:length:deallocator:] called with " @"length but NULL bytes", NSStringFromClass([self class])]; } /* The assumption here is that the superclass if fully concrete and will * not return a different instance. This invariant holds for the current * implementation of NSMutableDataMalloc, but not NSDataMalloc. */ if (nil == (self = [super initWithBytesNoCopy: buf length: len freeWhenDone: NO])) { return nil; } ASSIGN(deallocator, (id)deallocBlock); return self; } - (void) dealloc { if (deallocator != NULL) { CALL_NON_NULL_BLOCK(((GSDataDeallocatorBlock)deallocator), bytes, capacity); // Clear out the ivars so that super doesn't double free. bytes = NULL; length = 0; DESTROY(deallocator); } [super dealloc]; } - (id) setCapacity: (NSUInteger)size { /* We need to override capacity modification so that we correctly call the * block when we are operating on the initial allocation, usual malloc/free * machinery otherwise. */ if (size != capacity) { void *tmp; tmp = NSZoneMalloc(zone, size); if (tmp == 0) { [NSException raise: NSMallocException format: @"Unable to set data capacity to '%"PRIuPTR"'", size]; } if (bytes) { memcpy(tmp, bytes, capacity < size ? capacity : size); if (deallocator != NULL) { CALL_NON_NULL_BLOCK(((GSDataDeallocatorBlock)deallocator), bytes, capacity); DESTROY(deallocator); zone = NSDefaultMallocZone(); } else { NSZoneFree(zone, bytes); } } else if (deallocator != NULL) { CALL_NON_NULL_BLOCK(((GSDataDeallocatorBlock)deallocator), bytes, capacity); DESTROY(deallocator); zone = NSDefaultMallocZone(); } bytes = tmp; capacity = size; growth = capacity/2; if (growth == 0) { growth = 1; } } if (size < length) { length = size; } return self; } @end #ifdef HAVE_SHMCTL @implementation NSMutableDataShared + (id) allocWithZone: (NSZone*)z { return NSAllocateObject([NSMutableDataShared class], 0, z); } - (void) dealloc { [self finalize]; [super dealloc]; } - (void) finalize { if (bytes != 0) { struct shmid_ds buf; if (shmctl(shmid, IPC_STAT, &buf) < 0) { NSLog(@"[NSMutableDataShared -dealloc] shared memory " @"control failed - %@", [NSError _last]); } else if (buf.shm_nattch == 1) { if (shmctl(shmid, IPC_RMID, &buf) < 0) /* Mark for deletion. */ { NSLog(@"[NSMutableDataShared -dealloc] shared memory " @"delete failed - %@", [NSError _last]); } } if (shmdt(bytes) < 0) { NSLog(@"[NSMutableDataShared -dealloc] shared memory " @"detach failed - %@", [NSError _last]); } bytes = 0; length = 0; capacity = 0; shmid = -1; } [super finalize]; } - (id) initWithCapacity: (NSUInteger)bufferSize { shmid = shmget(IPC_PRIVATE, bufferSize, IPC_CREAT|VM_ACCESS); if (shmid == -1) /* Created memory? */ { NSLog(@"[NSMutableDataShared -initWithCapacity:] shared memory " @"get failed for %"PRIuPTR" - %@", bufferSize, [NSError _last]); DESTROY(self); self = [mutableDataMalloc allocWithZone: NSDefaultMallocZone()]; return [self initWithCapacity: bufferSize]; } bytes = shmat(shmid, 0, 0); if (bytes == (void*)-1) { NSLog(@"[NSMutableDataShared -initWithCapacity:] shared memory " @"attach failed for %"PRIuPTR" - %@", bufferSize, [NSError _last]); bytes = 0; DESTROY(self); self = [mutableDataMalloc allocWithZone: NSDefaultMallocZone()]; return [self initWithCapacity: bufferSize]; } length = 0; capacity = bufferSize; return self; } - (id) initWithShmID: (int)anId length: (NSUInteger)bufferSize { struct shmid_ds buf; shmid = anId; if (shmctl(shmid, IPC_STAT, &buf) < 0) { NSLog(@"[NSMutableDataShared -initWithShmID:length:] shared memory " @"control failed - %@", [NSError _last]); DESTROY(self); /* Unable to access memory. */ return nil; } if (buf.shm_segsz < bufferSize) { NSLog(@"[NSMutableDataShared -initWithShmID:length:] shared memory " @"segment too small"); DESTROY(self); /* Memory segment too small. */ return nil; } bytes = shmat(shmid, 0, 0); if (bytes == (void*)-1) { NSLog(@"[NSMutableDataShared -initWithShmID:length:] shared memory " @"attach failed - %@", [NSError _last]); bytes = 0; DESTROY(self); /* Unable to attach to memory. */ return nil; } length = bufferSize; capacity = length; return self; } - (id) setCapacity: (NSUInteger)size { if (size != capacity) { void *tmp; int newid; newid = shmget(IPC_PRIVATE, size, IPC_CREAT|VM_ACCESS); if (newid == -1) /* Created memory? */ { [NSException raise: NSMallocException format: @"Unable to create shared memory segment" @" (size:%"PRIuPTR") - %@.", size, [NSError _last]]; } tmp = shmat(newid, 0, 0); if ((intptr_t)tmp == -1) /* Attached memory? */ { [NSException raise: NSMallocException format: @"Unable to attach to shared memory segment."]; } memcpy(tmp, bytes, length); if (bytes) { struct shmid_ds buf; if (shmctl(shmid, IPC_STAT, &buf) < 0) { NSLog(@"[NSMutableDataShared -setCapacity:] shared memory " @"control failed - %@", [NSError _last]); } else if (buf.shm_nattch == 1) { if (shmctl(shmid, IPC_RMID, &buf) < 0) /* Mark for deletion. */ { NSLog(@"[NSMutableDataShared -setCapacity:] shared memory " @"delete failed - %@", [NSError _last]); } } if (shmdt(bytes) < 0) /* Detach memory. */ { NSLog(@"[NSMutableDataShared -setCapacity:] shared memory " @"detach failed - %@", [NSError _last]); } } bytes = tmp; shmid = newid; capacity = size; } if (size < length) { length = size; } return self; } - (int) shmID { return shmid; } @end #endif /* HAVE_SHMCTL */ gnustep-base-1.29.0/Source/NSDate.m000066400000000000000000000753331435650067400167610ustar00rootroot00000000000000/** Implementation for NSDate for GNUStep Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. Written by: Jeremy Bettis Rewritten by: Scott Christley Date: March 1995 Modifications by: Richard Frith-Macdonald This file is part of the GNUstep Base Library. 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 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 USA. NSDate class reference $Date$ $Revision$ */ #import "common.h" #import "Foundation/NSArray.h" #import "Foundation/NSCalendarDate.h" #import "Foundation/NSCharacterSet.h" #import "Foundation/NSCoder.h" #import "Foundation/NSDate.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSException.h" #import "Foundation/NSPortCoder.h" #import "Foundation/NSScanner.h" #import "Foundation/NSTimeZone.h" #import "Foundation/NSUserDefaults.h" #import "GNUstepBase/GSObjCRuntime.h" #import "GSPrivate.h" #include /* These constants seem to be what MacOS-X uses */ #define DISTANT_FUTURE 63113990400.0 #define DISTANT_PAST -63113817600.0 /* On older Solaris we don't have NAN nor nan() */ #if defined(__sun) && defined(__SVR4) && !defined(NAN) #define NAN 0x7fffffffffffffff #endif GS_DECLARE const NSTimeInterval NSTimeIntervalSince1970 = 978307200.0; static BOOL debug = NO; static Class abstractClass = nil; static Class concreteClass = nil; static Class calendarClass = nil; /** * Our concrete base class - NSCalendar date must share the ivar layout. */ @interface NSGDate : NSDate { @public NSTimeInterval _seconds_since_ref; } @end @interface GSDateSingle : NSGDate @end @interface GSDatePast : GSDateSingle @end @interface GSDateFuture : GSDateSingle @end static id _distantPast = nil; static id _distantFuture = nil; static NSString* findInArray(NSArray *array, unsigned pos, NSString *str) { unsigned index; unsigned limit = [array count]; for (index = pos; index < limit; index++) { NSString *item; item = [array objectAtIndex: index]; if ([str caseInsensitiveCompare: item] == NSOrderedSame) return item; } return nil; } static inline NSTimeInterval otherTime(NSDate* other) { Class c; if (other == nil) [NSException raise: NSInvalidArgumentException format: @"other time nil"]; if (GSObjCIsInstance(other) == NO) [NSException raise: NSInvalidArgumentException format: @"other time bad"]; c = object_getClass(other); if (c == concreteClass || c == calendarClass) return ((NSGDate*)other)->_seconds_since_ref; else return [other timeIntervalSinceReferenceDate]; } /** * An NSDate object encapsulates a constant date/time to a high * resolution represented by the NSTimeInterval typedef. * NSDate has methods relating to times and time differences in * the abstract, but not calendar dates or time zones. These features are * added in the [NSCalendarDate] subclass. The [NSTimeZone] class handles time * zone information. */ @implementation NSDate + (void) initialize { if (self == [NSDate class]) { [self setVersion: 1]; abstractClass = self; concreteClass = [NSGDate class]; calendarClass = [NSCalendarDate class]; } } + (id) alloc { if (self == abstractClass) { return NSAllocateObject(concreteClass, 0, NSDefaultMallocZone()); } return NSAllocateObject(self, 0, NSDefaultMallocZone()); } + (id) allocWithZone: (NSZone*)z { if (self == abstractClass) { return NSAllocateObject(concreteClass, 0, z); } return NSAllocateObject(self, 0, z); } + (instancetype) date { return AUTORELEASE([[self allocWithZone: NSDefaultMallocZone()] initWithTimeIntervalSinceReferenceDate: GSPrivateTimeNow()]); } /** * Returns an autoreleased instance representing the date and time given * by string. The value of string may be a 'natural' specification as * specified by the preferences in the user defaults database, allowing * phrases like 'last tuesday' */ + (instancetype) dateWithNaturalLanguageString: (NSString*)string { return [self dateWithNaturalLanguageString: string locale: nil]; } + (instancetype) dateWithNaturalLanguageString: (NSString*)string locale: (NSDictionary*)locale { NSCharacterSet *ws; NSCharacterSet *digits; NSScanner *scanner; NSString *tmp; NSString *dto; NSArray *ymw; NSMutableArray *words; unsigned index; unsigned length; NSCalendarDate *theDate; BOOL hadHour = NO; BOOL hadMinute = NO; BOOL hadSecond = NO; BOOL hadDay = NO; BOOL hadMonth = NO; BOOL hadYear = NO; BOOL hadWeekDay = NO; int weekDay = 0; int dayOfWeek = 0; int modMonth = 0; int modYear = 0; int modDay = 0; int D, M, Y; int h = 12; int m = 0; int s = 0; unsigned dtoIndex; if (locale == nil) { locale = GSPrivateDefaultLocale(); } ws = [NSCharacterSet whitespaceAndNewlineCharacterSet]; digits = [NSCharacterSet decimalDigitCharacterSet]; scanner = [NSScanner scannerWithString: string]; words = [NSMutableArray arrayWithCapacity: 10]; theDate = (NSCalendarDate*)[calendarClass date]; Y = [theDate yearOfCommonEra]; M = [theDate monthOfYear]; D = [theDate dayOfMonth]; dayOfWeek = [theDate dayOfWeek]; [scanner scanCharactersFromSet: ws intoString: 0]; while ([scanner scanUpToCharactersFromSet: ws intoString: &tmp] == YES) { [words addObject: tmp]; [scanner scanCharactersFromSet: ws intoString: 0]; } /* * Scan the array for day specifications and remove them. */ if (hadDay == NO) { NSArray *tdd = [locale objectForKey: NSThisDayDesignations]; NSArray *ndd = [locale objectForKey: NSNextDayDesignations]; NSArray *pdd = [locale objectForKey: NSPriorDayDesignations]; NSArray *nndd = [locale objectForKey: NSNextNextDayDesignations]; for (index = 0; hadDay == NO && index < [words count]; index++) { tmp = [words objectAtIndex: index]; if (findInArray(tdd, 0 ,tmp) != nil) { hadDay = YES; } else if (findInArray(ndd, 0 ,tmp) != nil) { modDay++; hadDay = YES; } else if (findInArray(nndd, 0 ,tmp) != nil) { modDay += 2; hadDay = YES; } else if (findInArray(pdd, 0 ,tmp) != nil) { modDay--; hadDay = YES; } if (hadDay) { hadMonth = YES; hadYear = YES; [words removeObjectAtIndex: index]; } } } /* * Scan the array for month specifications and remove them. */ if (hadMonth == NO) { NSArray *lm = [locale objectForKey: NSMonthNameArray]; NSArray *sm = [locale objectForKey: NSShortMonthNameArray]; for (index = 0; hadMonth == NO && index < [words count]; index++) { NSString *mname; tmp = [words objectAtIndex: index]; if ((mname = findInArray(lm, 0, tmp)) != nil) { M = [lm indexOfObjectIdenticalTo: mname] + 1; } else if ((mname = findInArray(sm, 0, tmp)) != nil) { M = [sm indexOfObjectIdenticalTo: mname] + 1; } if (mname != nil) { hadMonth = YES; [words removeObjectAtIndex: index]; } } } /* * Scan the array for weekday specifications and remove them. */ if (hadWeekDay == NO) { NSArray *lw = [locale objectForKey: NSWeekDayNameArray]; NSArray *sw = [locale objectForKey: NSShortWeekDayNameArray]; for (index = 0; hadWeekDay == NO && index < [words count]; index++) { NSString *dname; tmp = [words objectAtIndex: index]; if ((dname = findInArray(lw, 0, tmp)) != nil) { weekDay = [lw indexOfObjectIdenticalTo: dname]; } else if ((dname = findInArray(sw, 0, tmp)) != nil) { weekDay = [sw indexOfObjectIdenticalTo: dname]; } if (dname != nil) { hadWeekDay = YES; [words removeObjectAtIndex: index]; } } } /* * Scan the array for year month week modifiers and remove them. * Going by the documentation, these modifiers adjust the date by * plus or minus a week, month, or year. */ ymw = [locale objectForKey: NSYearMonthWeekDesignations]; if (ymw != nil && [ymw count] > 0) { unsigned c = [ymw count]; NSString *yname = [ymw objectAtIndex: 0]; NSString *mname = c > 1 ? [ymw objectAtIndex: 1] : nil; NSArray *early = [locale objectForKey: NSEarlierTimeDesignations]; NSArray *later = [locale objectForKey: NSLaterTimeDesignations]; for (index = 0; index < [words count]; index++) { tmp = [words objectAtIndex: index]; /* * See if the current word is a year, month, or week. */ if (findInArray(ymw, 0, tmp)) { BOOL hadAdjective = NO; int adjective = 0; NSString *adj = nil; /* * See if there is a prefix adjective */ if (index > 0) { adj = [words objectAtIndex: index - 1]; if (findInArray(early, 0, adj)) { hadAdjective = YES; adjective = -1; } else if (findInArray(later, 0, adj)) { hadAdjective = YES; adjective = 1; } if (hadAdjective) { [words removeObjectAtIndex: --index]; } } /* * See if there is a prefix adjective */ if (hadAdjective == NO && index < [words count] - 1) { NSString *adj = [words objectAtIndex: index + 1]; if (findInArray(early, 0, adj)) { hadAdjective = YES; adjective = -1; } else if (findInArray(later, 0, adj)) { hadAdjective = YES; adjective = 1; } if (hadAdjective) { [words removeObjectAtIndex: index]; } } /* * Record the adjective information. */ if (hadAdjective) { if ([tmp caseInsensitiveCompare: yname] == NSOrderedSame) { modYear += adjective; hadYear = YES; } else if (mname != nil && [tmp caseInsensitiveCompare: mname] == NSOrderedSame) { modMonth += adjective; hadMonth = YES; } else { if (hadWeekDay) { modDay += weekDay - dayOfWeek; } modDay += 7*adjective; hadDay = YES; hadMonth = YES; hadYear = YES; } } /* * Remove from list of words. */ [words removeObjectAtIndex: index]; } } } /* Scan for hour of the day */ if (hadHour == NO) { NSArray *hours = [locale objectForKey: NSHourNameDesignations]; unsigned hLimit = [hours count]; unsigned hIndex; for (index = 0; hadHour == NO && index < [words count]; index++) { tmp = [words objectAtIndex: index]; for (hIndex = 0; hadHour == NO && hIndex < hLimit; hIndex++) { NSArray *names; names = [hours objectAtIndex: hIndex]; if (findInArray(names, 1, tmp) != nil) { h = [[names objectAtIndex: 0] intValue]; hadHour = YES; hadMinute = YES; hadSecond = YES; } } } } /* * Now re-scan the string for numeric information. */ dto = [locale objectForKey: NSDateTimeOrdering]; if (dto == nil) { if (debug) { NSLog(@"no NSDateTimeOrdering - default to DMYH."); } dto = @"DMYH"; } length = [dto length]; if (length > 4) { if (debug) { NSLog(@"too many characters in NSDateTimeOrdering - truncating."); } length = 4; } dtoIndex = 0; scanner = [NSScanner scannerWithString: string]; [scanner setCaseSensitive: NO]; // We don't care if there are non-digit characters ... skip if they are there (void)[scanner scanUpToCharactersFromSet: digits intoString: 0]; while ([scanner scanCharactersFromSet: digits intoString: &tmp] == YES) { int num = [tmp intValue]; if ([scanner scanUpToCharactersFromSet: digits intoString: &tmp] == NO) { tmp = nil; } /* * Numbers separated by colons are a time specification. */ if (tmp && ([tmp characterAtIndex: 0] == (unichar)':')) { BOOL done = NO; BOOL checkForAMPM = NO; do { if (hadHour == NO) { if (num > 23) { if (debug) { NSLog(@"hour (%d) too large - ignored.", num); } else { return nil; } } else { h = num; m = 0; s = 0; hadHour = YES; checkForAMPM = YES; } } else if (hadMinute == NO) { if (num > 59) { if (debug) { NSLog(@"minute (%d) too large - ignored.", num); } else { return nil; } } else { m = num; s = 0; hadMinute = YES; } } else if (hadSecond == NO) { if (num > 59) { if (debug) { NSLog(@"second (%d) too large - ignored.", num); } else { return nil; } } else { s = num; hadSecond = YES; } } else { if (debug) { NSLog(@"odd time spec - excess numbers ignored."); } } done = YES; if (tmp && ([tmp characterAtIndex: 0] == (unichar)':')) { if ([scanner scanCharactersFromSet: digits intoString: &tmp]) { num = [tmp intValue]; done = NO; if ([scanner scanString: @":" intoString: &tmp] == NO) { tmp = nil; } } } } while (done == NO); if (checkForAMPM) { NSArray *ampm; ampm = [locale objectForKey: NSAMPMDesignation]; if ([scanner scanString: [ampm objectAtIndex: 0] intoString: NULL]) { if (h == 12) // 12 AM means midnight h = 0; } else if ([scanner scanString: [ampm objectAtIndex: 1] intoString: NULL]) { if (h < 12) // if PM add 12 to any hour less than 12 h += 12; } } } else { BOOL mustSkip = YES; while ((dtoIndex < length) && (mustSkip == YES)) { switch ([dto characterAtIndex: dtoIndex]) { case 'D': if (hadDay) dtoIndex++; else mustSkip = NO; break; case 'M': if (hadMonth) dtoIndex++; else mustSkip = NO; break; case 'Y': if (hadYear) dtoIndex++; else mustSkip = NO; break; case 'H': if (hadHour) dtoIndex++; else mustSkip = NO; break; default: if (debug) { NSLog(@"odd char (unicode %d) in NSDateTimeOrdering.", [dto characterAtIndex: dtoIndex]); } dtoIndex++; break; } } if (dtoIndex >= length) { if (debug) { NSLog(@"odd date specification - excess numbers ignored."); } break; } switch ([dto characterAtIndex: dtoIndex]) { case 'D': if (num < 1) { if (debug) { NSLog(@"day (0) too small - ignored."); } else { return nil; } } else if (num > 31) { if (debug) { NSLog(@"day (%d) too large - ignored.", num); } else { return nil; } } else { D = num; hadDay = YES; } break; case 'M': if (num < 1) { if (debug) { NSLog(@"month (0) too small - ignored."); } else { return nil; } } else if (num > 12) { if (debug) { NSLog(@"month (%d) too large - ignored.", num); } else { return nil; } } else { M = num; hadMonth = YES; } break; case 'Y': if (num < 100) { if (num < 70) { Y = num + 2000; } else { Y = num + 1900; } if (debug) { NSLog(@"year (%d) adjusted to %d.", num, Y); } } else { Y = num; } hadYear = YES; break; case 'H': { BOOL shouldIgnore = NO; /* * Check the next text to see if it is an am/pm * designation. */ if (tmp) { NSArray *ampm; NSString *mod; ampm = [locale objectForKey: NSAMPMDesignation]; mod = findInArray(ampm, 0, tmp); if (mod) { if (num > 11) { if (debug) { NSLog(@"hour (%d) too large - ignored.", num); } else { return nil; } shouldIgnore = YES; } else if (mod == [ampm objectAtIndex: 1]) { num += 12; } } } if (shouldIgnore == NO) { if (num > 23) { if (debug) { NSLog(@"hour (%d) too large - ignored.", num); } else { return nil; } } else { hadHour = YES; h = num; } } break; } default: if (debug) { NSLog(@"unexpected char (unicode%d) in NSDateTimeOrdering.", [dto characterAtIndex: dtoIndex]); } break; } } } /* * If we had no date or time information - we give up, otherwise * we can use reasonable defaults for any missing info. * Missing date => today * Missing time => 12: 00 * If we had a week/month/year modifier without a day, we assume today. * If we had a day name without any more day detail - adjust to that * day this week. */ if (hadDay == NO && hadWeekDay == YES) { modDay += weekDay - dayOfWeek; hadDay = YES; } if (hadDay == NO && hadHour == NO) { if (modDay == NO && modMonth == NO && modYear == NO) { return nil; } } /* * Build a calendar date we can adjust easily. */ theDate = [calendarClass dateWithYear: Y month: M day: D hour: h minute: m second: s timeZone: [NSTimeZone defaultTimeZone]]; /* * Adjust the date by year month or days if necessary. */ if (modYear || modMonth || modDay) { theDate = [theDate dateByAddingYears: modYear months: modMonth days: modDay hours: 0 minutes: 0 seconds: 0]; } if (hadWeekDay && [theDate dayOfWeek] != weekDay) { if (debug) { NSLog(@"Date resulted in wrong day of week."); } return nil; } if (theDate == nil) { return theDate; } else { return [self dateWithTimeIntervalSinceReferenceDate: otherTime(theDate)]; } } + (instancetype) dateWithString: (NSString*)description { return AUTORELEASE([[self alloc] initWithString: description]); } + (instancetype) dateWithTimeInterval: (NSTimeInterval)seconds sinceDate: (NSDate*)date { return AUTORELEASE([[self alloc] initWithTimeInterval: seconds sinceDate: date]); } + (instancetype) dateWithTimeIntervalSince1970: (NSTimeInterval)seconds { return AUTORELEASE([[self alloc] initWithTimeIntervalSinceReferenceDate: seconds - NSTimeIntervalSince1970]); } + (instancetype) dateWithTimeIntervalSinceNow: (NSTimeInterval)seconds { return AUTORELEASE([[self alloc] initWithTimeIntervalSinceNow: seconds]); } + (instancetype) dateWithTimeIntervalSinceReferenceDate: (NSTimeInterval)seconds { return AUTORELEASE([[self alloc] initWithTimeIntervalSinceReferenceDate: seconds]); } + (instancetype) distantPast { if (_distantPast == nil) { _distantPast = [GSDatePast allocWithZone: 0]; } return _distantPast; } + (instancetype) distantFuture { if (_distantFuture == nil) { _distantFuture = [GSDateFuture allocWithZone: 0]; } return _distantFuture; } /** * Returns the time interval between the current date and the * reference date (1 January 2001, GMT). */ + (NSTimeInterval) timeIntervalSinceReferenceDate { return GSPrivateTimeNow(); } - (instancetype) addTimeInterval: (NSTimeInterval)seconds { return [self dateByAddingTimeInterval: seconds]; } - (NSComparisonResult) compare: (NSDate*)otherDate { if (otherDate == self) { return NSOrderedSame; } if (otherTime(self) > otherTime(otherDate)) { return NSOrderedDescending; } if (otherTime(self) < otherTime(otherDate)) { return NSOrderedAscending; } return NSOrderedSame; } - (id) copyWithZone: (NSZone*)zone { if (NSShouldRetainWithZone(self, zone)) { return RETAIN(self); } return NSCopyObject(self, 0, zone); } - (Class) classForCoder { return abstractClass; } - (instancetype) dateByAddingTimeInterval: (NSTimeInterval)ti { return [[self class] dateWithTimeIntervalSinceReferenceDate: otherTime(self) + ti]; } - (NSCalendarDate *) dateWithCalendarFormat: (NSString*)formatString timeZone: (NSTimeZone*)timeZone { NSCalendarDate *d = [calendarClass alloc]; d = [d initWithTimeIntervalSinceReferenceDate: otherTime(self)]; [d setCalendarFormat: formatString]; [d setTimeZone: timeZone]; return AUTORELEASE(d); } - (NSString*) description { // Easiest to just have NSCalendarDate do the work for us NSString *s; NSCalendarDate *d = [calendarClass alloc]; d = [d initWithTimeIntervalSinceReferenceDate: otherTime(self)]; s = [d description]; RELEASE(d); return s; } - (NSString*) descriptionWithCalendarFormat: (NSString*)format timeZone: (NSTimeZone*)aTimeZone locale: (NSDictionary*)l { // Easiest to just have NSCalendarDate do the work for us NSString *s; NSCalendarDate *d = [calendarClass alloc]; id f; d = [d initWithTimeIntervalSinceReferenceDate: otherTime(self)]; if (!format) { f = [d calendarFormat]; } else { f = format; } if (aTimeZone) { [d setTimeZone: aTimeZone]; } s = [d descriptionWithCalendarFormat: f locale: l]; RELEASE(d); return s; } - (NSString *) descriptionWithLocale: (id)locale { // Easiest to just have NSCalendarDate do the work for us NSString *s; NSCalendarDate *d = [calendarClass alloc]; d = [d initWithTimeIntervalSinceReferenceDate: otherTime(self)]; s = [d descriptionWithLocale: locale]; RELEASE(d); return s; } - (NSDate*) earlierDate: (NSDate*)otherDate { if (otherTime(self) > otherTime(otherDate)) { return otherDate; } return self; } - (void) encodeWithCoder: (NSCoder*)coder { NSTimeInterval interval = [self timeIntervalSinceReferenceDate]; if ([coder allowsKeyedCoding]) { [coder encodeDouble: interval forKey: @"NS.time"]; } [coder encodeValueOfObjCType: @encode(NSTimeInterval) at: &interval]; } - (NSUInteger) hash { return (NSUInteger)[self timeIntervalSinceReferenceDate]; } - (instancetype) initWithCoder: (NSCoder*)coder { NSTimeInterval interval; id o; if ([coder allowsKeyedCoding]) { interval = [coder decodeDoubleForKey: @"NS.time"]; } else { [coder decodeValueOfObjCType: @encode(NSTimeInterval) at: &interval]; } if (interval == DISTANT_PAST) { o = RETAIN([abstractClass distantPast]); } else if (interval == DISTANT_FUTURE) { o = RETAIN([abstractClass distantFuture]); } else { o = [concreteClass allocWithZone: NSDefaultMallocZone()]; o = [o initWithTimeIntervalSinceReferenceDate: interval]; } DESTROY(self); return o; } - (instancetype) init { return [self initWithTimeIntervalSinceReferenceDate: GSPrivateTimeNow()]; } - (instancetype) initWithString: (NSString*)description { // Easiest to just have NSCalendarDate do the work for us NSCalendarDate *d = [calendarClass alloc]; d = [d initWithString: description]; if (nil == d) { DESTROY(self); return nil; } else { self = [self initWithTimeIntervalSinceReferenceDate: otherTime(d)]; RELEASE(d); return self; } } - (instancetype) initWithTimeInterval: (NSTimeInterval)secsToBeAdded sinceDate: (NSDate*)anotherDate { if (anotherDate == nil) { NSLog(@"initWithTimeInterval:sinceDate: given nil date"); DESTROY(self); return nil; } // Get the other date's time, add the secs and init thyself return [self initWithTimeIntervalSinceReferenceDate: otherTime(anotherDate) + secsToBeAdded]; } - (instancetype) initWithTimeIntervalSince1970: (NSTimeInterval)seconds { return [self initWithTimeIntervalSinceReferenceDate: seconds - NSTimeIntervalSince1970]; } - (instancetype) initWithTimeIntervalSinceNow: (NSTimeInterval)secsToBeAdded { // Get the current time, add the secs and init thyself return [self initWithTimeIntervalSinceReferenceDate: GSPrivateTimeNow() + secsToBeAdded]; } - (instancetype) initWithTimeIntervalSinceReferenceDate: (NSTimeInterval)secs { [self subclassResponsibility: _cmd]; return self; } - (BOOL) isEqual: (id)other { if (other != nil && [other isKindOfClass: abstractClass] && otherTime(self) == otherTime(other)) { return YES; } return NO; } - (BOOL) isEqualToDate: (NSDate*)other { if (other != nil && otherTime(self) == otherTime(other)) { return YES; } return NO; } - (NSDate*) laterDate: (NSDate*)otherDate { if (otherTime(self) < otherTime(otherDate)) { return otherDate; } return self; } - (id) replacementObjectForPortCoder: (NSPortCoder*)aCoder { if ([aCoder isByref] == NO) { return self; } return [super replacementObjectForPortCoder: aCoder]; } - (NSTimeInterval) timeIntervalSince1970 { return otherTime(self) + NSTimeIntervalSince1970; } - (NSTimeInterval) timeIntervalSinceDate: (NSDate*)otherDate { if (nil == otherDate) { #ifndef NAN return nan(""); #else return NAN; #endif } return otherTime(self) - otherTime(otherDate); } - (NSTimeInterval) timeIntervalSinceNow { return otherTime(self) - GSPrivateTimeNow(); } - (NSTimeInterval) timeIntervalSinceReferenceDate { [self subclassResponsibility: _cmd]; return 0; } @end @implementation NSGDate + (void) initialize { if (self == [NSDate class]) { [self setVersion: 1]; } } - (NSComparisonResult) compare: (NSDate*)otherDate { if (otherDate == self) { return NSOrderedSame; } if (otherDate == nil) { [NSException raise: NSInvalidArgumentException format: @"nil argument for compare:"]; } if (_seconds_since_ref > otherTime(otherDate)) { return NSOrderedDescending; } if (_seconds_since_ref < otherTime(otherDate)) { return NSOrderedAscending; } return NSOrderedSame; } - (NSDate*) earlierDate: (NSDate*)otherDate { if (otherDate == nil) { [NSException raise: NSInvalidArgumentException format: @"nil argument for earlierDate:"]; } if (_seconds_since_ref > otherTime(otherDate)) { return otherDate; } return self; } - (void) encodeWithCoder: (NSCoder*)coder { if ([coder allowsKeyedCoding]) { [coder encodeDouble:_seconds_since_ref forKey:@"NS.time"]; } else { [coder encodeValueOfObjCType: @encode(NSTimeInterval) at: &_seconds_since_ref]; } } - (NSUInteger) hash { return (unsigned)_seconds_since_ref; } - (id) initWithCoder: (NSCoder*)coder { if ([coder allowsKeyedCoding]) { _seconds_since_ref = [coder decodeDoubleForKey: @"NS.time"]; } else { [coder decodeValueOfObjCType: @encode(NSTimeInterval) at: &_seconds_since_ref]; } return self; } - (id) initWithTimeIntervalSinceReferenceDate: (NSTimeInterval)secs { if (isnan(secs)) { [NSException raise: NSInvalidArgumentException format: @"[%@-%@] interval is not a number", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; } #if GS_SIZEOF_VOIDP == 4 if (secs <= DISTANT_PAST) { secs = DISTANT_PAST; } else if (secs >= DISTANT_FUTURE) { secs = DISTANT_FUTURE; } #endif _seconds_since_ref = secs; return self; } - (BOOL) isEqual: (id)other { if (other != nil && [other isKindOfClass: abstractClass] && _seconds_since_ref == otherTime(other)) { return YES; } return NO; } - (BOOL) isEqualToDate: (NSDate*)other { if (other != nil && _seconds_since_ref == otherTime(other)) { return YES; } return NO; } - (NSDate*) laterDate: (NSDate*)otherDate { if (otherDate == nil) { [NSException raise: NSInvalidArgumentException format: @"nil argument for laterDate:"]; } if (_seconds_since_ref < otherTime(otherDate)) { return otherDate; } return self; } - (NSTimeInterval) timeIntervalSince1970 { return _seconds_since_ref + NSTimeIntervalSince1970; } - (NSTimeInterval) timeIntervalSinceDate: (NSDate*)otherDate { if (otherDate == nil) { [NSException raise: NSInvalidArgumentException format: @"nil argument for timeIntervalSinceDate:"]; } return _seconds_since_ref - otherTime(otherDate); } - (NSTimeInterval) timeIntervalSinceNow { return _seconds_since_ref - GSPrivateTimeNow(); } - (NSTimeInterval) timeIntervalSinceReferenceDate { return _seconds_since_ref; } @end /* * This abstract class represents a date of which there can be only * one instance. */ @implementation GSDateSingle + (void) initialize { if (self == [GSDateSingle class]) { [self setVersion: 1]; GSObjCAddClassBehavior(self, [NSGDate class]); } } - (id) autorelease { return self; } - (oneway void) release { } - (id) retain { return self; } + (id) allocWithZone: (NSZone*)z { [NSException raise: NSInternalInconsistencyException format: @"Attempt to allocate fixed date"]; return nil; } - (id) copyWithZone: (NSZone*)z { return self; } - (void) dealloc { [NSException raise: NSInternalInconsistencyException format: @"Attempt to deallocate fixed date"]; GSNOSUPERDEALLOC; } - (id) initWithTimeIntervalSinceReferenceDate: (NSTimeInterval)secs { return self; } @end @implementation GSDatePast + (id) allocWithZone: (NSZone*)z { if (_distantPast == nil) { id obj = NSAllocateObject(self, 0, NSDefaultMallocZone()); _distantPast = [obj init]; } return _distantPast; } - (id) initWithTimeIntervalSinceReferenceDate: (NSTimeInterval)secs { _seconds_since_ref = DISTANT_PAST; return self; } @end @implementation GSDateFuture + (id) allocWithZone: (NSZone*)z { if (_distantFuture == nil) { id obj = NSAllocateObject(self, 0, NSDefaultMallocZone()); _distantFuture = [obj init]; } return _distantFuture; } - (id) initWithTimeIntervalSinceReferenceDate: (NSTimeInterval)secs { _seconds_since_ref = DISTANT_FUTURE; return self; } @end gnustep-base-1.29.0/Source/NSDateComponentsFormatter.m000066400000000000000000000414001435650067400226770ustar00rootroot00000000000000/* Implementation of class NSDateComponentsFormatter Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory Casamento Date: Wed Nov 6 00:24:02 EST 2019 This file is part of the GNUstep Library. 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 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 USA. */ #include #include #include #include #include #include @implementation NSDateComponentsFormatter - (instancetype) init { self = [super init]; if (self != nil) { _calendar = nil; _referenceDate = nil; _allowsFractionalUnits = NO; _collapsesLargestUnit = NO; _includesApproximationPhrase = NO; _formattingContext = NSFormattingContextUnknown; _maximumUnitCount = 0; _zeroFormattingBehavior = NSDateComponentsFormatterZeroFormattingBehaviorDefault; _allowedUnits = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond; _unitsStyle = NSDateComponentsFormatterUnitsStylePositional; } return self; } - (instancetype) initWithCoder: (NSCoder *)coder { self = [super initWithCoder: coder]; if (self != nil) { // TODO: Implement coding... } return self; } - (void) encodeWithCoder: (NSCoder *)coder { [super encodeWithCoder: coder]; // TODO: Implement coding... } - (void) dealloc { RELEASE(_calendar); RELEASE(_referenceDate); [super dealloc]; } - (NSString *) stringForObjectValue: (id)obj { NSString *result = nil; if ([obj isKindOfClass: [NSDateComponents class]]) { result = [self stringFromDateComponents: obj]; } else if ([obj isKindOfClass: [NSNumber class]]) { NSTimeInterval ti = [obj longLongValue]; result = [self stringFromTimeInterval: ti]; } return result; } - (NSString *) stringFromDateComponents: (NSDateComponents *)components { NSString *result = @""; if (_allowedUnits & NSCalendarUnitYear) { if (_unitsStyle == NSDateComponentsFormatterUnitsStyleSpellOut) { NSNumberFormatter *fmt = [[NSNumberFormatter alloc] init]; NSNumber *num = [NSNumber numberWithInteger: [components year]]; AUTORELEASE(fmt); [fmt setNumberStyle: NSNumberFormatterSpellOutStyle]; result = [result stringByAppendingString: [fmt stringFromNumber: num]]; result = [result stringByAppendingString: @" years"]; } else { if (_zeroFormattingBehavior & NSDateComponentsFormatterZeroFormattingBehaviorDefault) { NSString *s; s = [NSString stringWithFormat: @"%4ld", (long)[components year]]; result = [result stringByAppendingString: s]; } if (_unitsStyle == NSDateComponentsFormatterUnitsStylePositional) { result = [result stringByAppendingString: @" yr "]; } else if (_unitsStyle == NSDateComponentsFormatterUnitsStyleAbbreviated) { result = [result stringByAppendingString: @" yr "]; } else if (_unitsStyle == NSDateComponentsFormatterUnitsStyleShort) { result = [result stringByAppendingString: @" yr "]; } else if (_unitsStyle == NSDateComponentsFormatterUnitsStyleFull) { result = [result stringByAppendingString: @" years "]; } } } if (_allowedUnits & NSCalendarUnitMonth) { if (_unitsStyle == NSDateComponentsFormatterUnitsStyleSpellOut) { NSNumberFormatter *fmt = [[NSNumberFormatter alloc] init]; NSNumber *num = [NSNumber numberWithInteger: [components month]]; AUTORELEASE(fmt); [fmt setNumberStyle: NSNumberFormatterSpellOutStyle]; result = [result stringByAppendingString: [fmt stringFromNumber: num]]; result = [result stringByAppendingString: @" months "]; } else { if (_zeroFormattingBehavior & NSDateComponentsFormatterZeroFormattingBehaviorDefault) { NSString *s; s = [NSString stringWithFormat: @"%2ld", (long)[components month]]; result = [result stringByAppendingString: s]; } if (_unitsStyle == NSDateComponentsFormatterUnitsStylePositional) { result = [result stringByAppendingString: @" "]; } else if (_unitsStyle == NSDateComponentsFormatterUnitsStyleAbbreviated) { result = [result stringByAppendingString: @" mn "]; } else if (_unitsStyle == NSDateComponentsFormatterUnitsStyleShort) { result = [result stringByAppendingString: @" mon "]; } else if (_unitsStyle == NSDateComponentsFormatterUnitsStyleFull) { result = [result stringByAppendingString: @" months "]; } } } if (_allowedUnits & NSCalendarUnitDay) { if (_unitsStyle == NSDateComponentsFormatterUnitsStyleSpellOut) { NSNumberFormatter *fmt = [[NSNumberFormatter alloc] init]; NSNumber *num = [NSNumber numberWithInteger: [components day]]; AUTORELEASE(fmt); [fmt setNumberStyle: NSNumberFormatterSpellOutStyle]; result = [result stringByAppendingString: [fmt stringFromNumber: num]]; result = [result stringByAppendingString: @" days "]; } else { if (_zeroFormattingBehavior & NSDateComponentsFormatterZeroFormattingBehaviorDefault) { NSString *s; s = [NSString stringWithFormat: @"%2ld", (long)[components day]]; result = [result stringByAppendingString: s]; } if (_unitsStyle == NSDateComponentsFormatterUnitsStylePositional) { result = [result stringByAppendingString: @" "]; } else if (_unitsStyle == NSDateComponentsFormatterUnitsStyleAbbreviated) { result = [result stringByAppendingString: @" d "]; } else if (_unitsStyle == NSDateComponentsFormatterUnitsStyleShort) { result = [result stringByAppendingString: @" day "]; } else if (_unitsStyle == NSDateComponentsFormatterUnitsStyleFull) { result = [result stringByAppendingString: @" days "]; } } } if (_allowedUnits & NSCalendarUnitHour) { if (_unitsStyle == NSDateComponentsFormatterUnitsStyleSpellOut) { NSNumberFormatter *fmt = [[NSNumberFormatter alloc] init]; NSNumber *num = [NSNumber numberWithInteger: [components hour]]; AUTORELEASE(fmt); [fmt setNumberStyle: NSNumberFormatterSpellOutStyle]; result = [result stringByAppendingString: [fmt stringFromNumber: num]]; result = [result stringByAppendingString: @" hours "]; } else { if (_zeroFormattingBehavior & NSDateComponentsFormatterZeroFormattingBehaviorDefault) { NSString *s; s = [NSString stringWithFormat: @"%2ld", (long)[components hour]]; result = [result stringByAppendingString: s]; } if (_unitsStyle == NSDateComponentsFormatterUnitsStylePositional) { result = [result stringByAppendingString: @" "]; } else if (_unitsStyle == NSDateComponentsFormatterUnitsStyleAbbreviated) { result = [result stringByAppendingString: @" h "]; } else if (_unitsStyle == NSDateComponentsFormatterUnitsStyleShort) { result = [result stringByAppendingString: @" hrs "]; } else if (_unitsStyle == NSDateComponentsFormatterUnitsStyleFull) { result = [result stringByAppendingString: @" hours "]; } } } if (_allowedUnits & NSCalendarUnitMinute) { if (_unitsStyle == NSDateComponentsFormatterUnitsStyleSpellOut) { NSNumberFormatter *fmt = [[NSNumberFormatter alloc] init]; NSNumber *num = [NSNumber numberWithInteger: [components minute]]; AUTORELEASE(fmt); [fmt setNumberStyle: NSNumberFormatterSpellOutStyle]; result = [result stringByAppendingString: [fmt stringFromNumber: num]]; result = [result stringByAppendingString: @" minutes "]; } else { if (_zeroFormattingBehavior & NSDateComponentsFormatterZeroFormattingBehaviorDefault) { NSString *s; s = [NSString stringWithFormat: @"%2ld", (long)[components minute]]; result = [result stringByAppendingString: s]; } if (_unitsStyle == NSDateComponentsFormatterUnitsStylePositional) { result = [result stringByAppendingString: @" "]; } else if (_unitsStyle == NSDateComponentsFormatterUnitsStyleAbbreviated) { result = [result stringByAppendingString: @" min "]; } else if (_unitsStyle == NSDateComponentsFormatterUnitsStyleShort) { result = [result stringByAppendingString: @" mins "]; } else if (_unitsStyle == NSDateComponentsFormatterUnitsStyleFull) { result = [result stringByAppendingString: @" minutes "]; } } } if (_allowedUnits & NSCalendarUnitSecond) { if (_unitsStyle == NSDateComponentsFormatterUnitsStyleSpellOut) { NSNumberFormatter *fmt = [[NSNumberFormatter alloc] init]; NSNumber *num = [NSNumber numberWithInteger: [components second]]; AUTORELEASE(fmt); [fmt setNumberStyle: NSNumberFormatterSpellOutStyle]; result = [result stringByAppendingString: [fmt stringFromNumber: num]]; result = [result stringByAppendingString: @" seconds "]; } else { if (_zeroFormattingBehavior & NSDateComponentsFormatterZeroFormattingBehaviorDefault) { NSString *s; s = [NSString stringWithFormat: @"%2ld", (long)[components second]]; result = [result stringByAppendingString: s]; } if (_unitsStyle == NSDateComponentsFormatterUnitsStylePositional) { result = [result stringByAppendingString: @" "]; } else if (_unitsStyle == NSDateComponentsFormatterUnitsStyleAbbreviated) { result = [result stringByAppendingString: @" s "]; } else if (_unitsStyle == NSDateComponentsFormatterUnitsStyleShort) { result = [result stringByAppendingString: @" secs "]; } else if (_unitsStyle == NSDateComponentsFormatterUnitsStyleFull) { result = [result stringByAppendingString: @" seconds "]; } } } if (_allowedUnits & NSCalendarUnitWeekOfMonth) { if (_unitsStyle == NSDateComponentsFormatterUnitsStyleSpellOut) { NSNumberFormatter *fmt; NSNumber *num; fmt = AUTORELEASE([[NSNumberFormatter alloc] init]); num = [NSNumber numberWithInteger: [components weekOfMonth]]; [fmt setNumberStyle: NSNumberFormatterSpellOutStyle]; result = [result stringByAppendingString: [fmt stringFromNumber: num]]; result = [result stringByAppendingString: @" days "]; } else { if (_zeroFormattingBehavior & NSDateComponentsFormatterZeroFormattingBehaviorDefault) { long wom = (long)[components weekOfMonth]; NSString *s = [NSString stringWithFormat: @"%2ld", wom]; result = [result stringByAppendingString: s]; } if (_unitsStyle == NSDateComponentsFormatterUnitsStylePositional) { result = [result stringByAppendingString: @" "]; } else if (_unitsStyle == NSDateComponentsFormatterUnitsStyleAbbreviated) { result = [result stringByAppendingString: @" wm "]; } else if (_unitsStyle == NSDateComponentsFormatterUnitsStyleShort) { result = [result stringByAppendingString: @" wom "]; } else if (_unitsStyle == NSDateComponentsFormatterUnitsStyleFull) { result = [result stringByAppendingString: @" week of month "]; } } } return result; } - (NSString *) stringFromDate: (NSDate *)startDate toDate: (NSDate *)endDate { NSDateComponents *dc; NSCalendar *calendar; calendar = ( _calendar != nil ) ? _calendar : [NSCalendar currentCalendar]; dc = [calendar components: _allowedUnits fromDate: startDate toDate: endDate options: NSCalendarMatchStrictly]; return [self stringFromDateComponents: dc]; } - (NSString *) stringFromTimeInterval: (NSTimeInterval)ti { NSDate *startDate = [NSDate date]; NSDate *endDate = [startDate dateByAddingTimeInterval: (ti > 0) ? ti : -ti]; return [self stringFromDate: startDate toDate: endDate]; } - (NSDateComponentsFormatterUnitsStyle) unitsStyle { return _unitsStyle; } - (void) setUnitsStyle: (NSDateComponentsFormatterUnitsStyle)style { _unitsStyle = style; } - (NSCalendarUnit) allowedUnits { return _allowedUnits; } - (void) setAllowedUnits: (NSCalendarUnit)units { if (units & NSCalendarUnitYear && units & NSCalendarUnitMonth && units & NSCalendarUnitDay && units & NSCalendarUnitHour && units & NSCalendarUnitMinute && units & NSCalendarUnitSecond && units & NSCalendarUnitWeekOfMonth) { [NSException raise: NSInvalidArgumentException format: @"Passed invalid unit into allowedUnits"]; } _allowedUnits = units; } - (NSDateComponentsFormatterZeroFormattingBehavior) zeroFormattingBehavior { return _zeroFormattingBehavior; } - (void) setZeroFormattingBehavior: (NSDateComponentsFormatterZeroFormattingBehavior)behavior; { _zeroFormattingBehavior = behavior; } - (NSCalendar *) calendar { return _calendar; } - (void) setCalender: (NSCalendar *)calendar { ASSIGNCOPY(_calendar, calendar); } - (NSDate *) referenceDate { return _referenceDate; } - (void) setReferenceDate: (NSDate *)referenceDate { ASSIGNCOPY(_referenceDate, referenceDate); } - (BOOL) allowsFractionalUnits { return _allowsFractionalUnits; } - (void) setAllowsFractionalUnits: (BOOL)allowsFractionalUnits { _allowsFractionalUnits = allowsFractionalUnits; } - (NSInteger) maximumUnitCount { return _maximumUnitCount; } - (void) setMaximumUnitCount: (NSInteger)maximumUnitCount { _maximumUnitCount = maximumUnitCount; } - (BOOL) collapsesLargestUnit { return _collapsesLargestUnit; } - (void) setCollapsesLargestUnit: (BOOL)collapsesLargestUnit { _collapsesLargestUnit = collapsesLargestUnit; } - (BOOL) includesApproximationPhrase { return _includesApproximationPhrase; } - (void) setIncludesApproximationPhrase: (BOOL)includesApproximationPhrase { _includesApproximationPhrase = includesApproximationPhrase; } - (NSFormattingContext) formattingContext { return _formattingContext; } - (void) setFormattingContext: (NSFormattingContext)formattingContext { _formattingContext = formattingContext; } - (BOOL) getObjectValue: (id*)obj forString: (NSString *)string errorDescription: (NSString **)error { return NO; } + (NSString *) localizedStringFromDateComponents: (NSDateComponents *)components unitsStyle: (NSDateComponentsFormatterUnitsStyle)unitsStyle { NSDateComponentsFormatter *fmt = [[NSDateComponentsFormatter alloc] init]; [fmt setUnitsStyle: unitsStyle]; AUTORELEASE(fmt); return [fmt stringFromDateComponents: components]; } @end gnustep-base-1.29.0/Source/NSDateFormatter.m000066400000000000000000000527771435650067400206540ustar00rootroot00000000000000/** Implementation of NSDateFormatter class Copyright (C) 1998 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: December 1998 This file is part of the GNUstep Base Library. 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 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 USA. NSDateFormatter class reference $Date$ $Revision$ */ #define GS_NSDateFormatter_IVARS \ NSUInteger _behavior; \ NSLocale *_locale; \ NSTimeZone *_tz; \ NSDateFormatterStyle _timeStyle; \ NSDateFormatterStyle _dateStyle; \ void *_formatter #define EXPOSE_NSDateFormatter_IVARS 1 #import "common.h" #import "Foundation/NSArray.h" #import "Foundation/NSDate.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSCalendar.h" #import "Foundation/NSCalendarDate.h" #import "Foundation/NSLocale.h" #import "Foundation/NSTimeZone.h" #import "Foundation/NSFormatter.h" #import "Foundation/NSDateFormatter.h" #import "Foundation/NSCoder.h" #if defined(HAVE_UNICODE_UDAT_H) && defined(HAVE_UNICODE_UDATPG_H) #define id id_ucal #include #undef id #include #elif defined(HAVE_ICU_H) #include #endif // This is defined to be the same as UDAT_RELATIVE #define FormatterDoesRelativeDateFormatting (1<<16) #define BUFFER_SIZE 1024 @interface NSDateFormatter (PrivateMethods) - (void) _resetUDateFormat; - (void) _setSymbols: (NSArray *)array : (NSInteger)symbol; - (NSArray *) _getSymbols: (NSInteger)symbol; @end static inline NSInteger NSToUDateFormatStyle (NSDateFormatterStyle style) { #if GS_USE_ICU == 1 NSInteger relative = (style & FormatterDoesRelativeDateFormatting) ? UDAT_RELATIVE : 0; switch (style) { case NSDateFormatterNoStyle: return (relative | UDAT_NONE); case NSDateFormatterShortStyle: return (relative | UDAT_SHORT); case NSDateFormatterMediumStyle: return (relative | UDAT_MEDIUM); case NSDateFormatterLongStyle: return (relative | UDAT_LONG); case NSDateFormatterFullStyle: return (relative | UDAT_FULL); } #endif return -1; } #define GSInternal NSDateFormatterInternal #include "GSInternal.h" GS_PRIVATE_INTERNAL(NSDateFormatter) @implementation NSDateFormatter static NSDateFormatterBehavior _defaultBehavior = 0; - (id) init { self = [super init]; if (self == nil) return nil; GS_CREATE_INTERNAL(NSDateFormatter) internal->_behavior = _defaultBehavior; internal->_locale = RETAIN([NSLocale currentLocale]); internal->_tz = RETAIN([NSTimeZone defaultTimeZone]); [self _resetUDateFormat]; return self; } - (BOOL) allowsNaturalLanguage { return _allowsNaturalLanguage; } - (NSAttributedString*) attributedStringForObjectValue: (id)anObject withDefaultAttributes: (NSDictionary*)attr { return nil; } - (id) copyWithZone: (NSZone*)zone { NSDateFormatter *o = (id)NSCopyObject(self, 0, zone); IF_NO_ARC(RETAIN(o->_dateFormat);) if (0 != internal) { GS_COPY_INTERNAL(o, zone) IF_NO_ARC(RETAIN(GSIVar(o,_locale));) #if GS_USE_ICU == 1 { UErrorCode err = U_ZERO_ERROR; GSIVar(o,_formatter) = udat_clone (internal->_formatter, &err); } #endif } return o; } - (NSString*) dateFormat { return _dateFormat; } - (void) dealloc { RELEASE(_dateFormat); if (internal != 0) { RELEASE(internal->_locale); RELEASE(internal->_tz); #if GS_USE_ICU == 1 udat_close (internal->_formatter); #endif GS_DESTROY_INTERNAL(NSDateFormatter) } [super dealloc]; } - (NSString*) editingStringForObjectValue: (id)anObject { return [self stringForObjectValue: anObject]; } - (void) encodeWithCoder: (NSCoder*)aCoder { [aCoder encodeValuesOfObjCTypes: "@C", &_dateFormat, &_allowsNaturalLanguage]; } - (BOOL) getObjectValue: (id*)anObject forString: (NSString*)string errorDescription: (NSString**)error { NSCalendarDate *d; if ([string length] == 0) { d = nil; } else { d = [NSCalendarDate dateWithString: string calendarFormat: _dateFormat]; } if (d == nil) { if (_allowsNaturalLanguage) { d = [NSCalendarDate dateWithNaturalLanguageString: string]; } if (d == nil) { if (error) { *error = @"Couldn't convert to date"; } return NO; } } if (anObject) { *anObject = d; } return YES; } - (id) initWithCoder: (NSCoder*)aCoder { GS_CREATE_INTERNAL(NSDateFormatter) [aCoder decodeValuesOfObjCTypes: "@C", &_dateFormat, &_allowsNaturalLanguage]; return self; } - (id) initWithDateFormat: (NSString *)format allowNaturalLanguage: (BOOL)flag { self = [self init]; if (self == nil) return nil; [self setDateFormat: format]; _allowsNaturalLanguage = flag; internal->_behavior = NSDateFormatterBehavior10_0; return self; } - (BOOL) isPartialStringValid: (NSString*)partialString newEditingString: (NSString**)newString errorDescription: (NSString**)error { if (newString) { *newString = nil; } if (error) { *error = nil; } return YES; } - (NSString*) stringForObjectValue: (id)anObject { if ([anObject isKindOfClass: [NSDate class]] == NO) { return nil; } return [anObject descriptionWithCalendarFormat: _dateFormat timeZone: [NSTimeZone defaultTimeZone] locale: nil]; } + (NSDateFormatterBehavior) defaultFormatterBehavior { return _defaultBehavior; } + (void) setDefaultFormatterBehavior: (NSDateFormatterBehavior)behavior { _defaultBehavior = behavior; } - (NSDateFormatterBehavior) formatterBehavior { return internal->_behavior; } - (void) setFormatterBehavior: (NSDateFormatterBehavior)behavior { internal->_behavior = behavior; } - (BOOL) generatesCalendarDates { return NO; // FIXME } - (void) setGeneratesCalendarDates: (BOOL)flag { return; // FIXME } - (BOOL) isLenient { #if GS_USE_ICU == 1 return (BOOL)udat_isLenient (internal->_formatter); #else return NO; #endif } - (void) setLenient: (BOOL)flag { #if GS_USE_ICU == 1 udat_setLenient (internal->_formatter, flag); #else return; #endif } - (NSDate *) dateFromString: (NSString *) string { #if GS_USE_ICU == 1 NSDate *result = nil; UDate date; UChar *text; int32_t textLength; UErrorCode err = U_ZERO_ERROR; int32_t pPos = 0; textLength = [string length]; text = malloc(sizeof(UChar) * textLength); if (text == NULL) return nil; [string getCharacters: text range: NSMakeRange (0, textLength)]; date = udat_parse (internal->_formatter, text, textLength, &pPos, &err); if (U_SUCCESS(err)) result = [NSDate dateWithTimeIntervalSince1970: (NSTimeInterval)(date / 1000.0)]; free(text); return result; #else return nil; #endif } - (NSString *) stringFromDate: (NSDate *) date { #if GS_USE_ICU == 1 NSString *result; int32_t length; unichar *string; UDate udate = [date timeIntervalSince1970] * 1000.0; UErrorCode err = U_ZERO_ERROR; length = udat_format (internal->_formatter, udate, NULL, 0, NULL, &err); string = malloc(sizeof(UChar) * (length + 1)); err = U_ZERO_ERROR; udat_format (internal->_formatter, udate, string, length, NULL, &err); if (U_SUCCESS(err)) { result = AUTORELEASE([[NSString allocWithZone: NSDefaultMallocZone()] initWithBytesNoCopy: string length: length * sizeof(UChar) encoding: NSUnicodeStringEncoding freeWhenDone: YES]); return result; } free(string); return nil; #else return nil; #endif } - (BOOL) getObjectValue: (out id *) obj forString: (NSString *) string range: (inout NSRange *) range error: (out NSError **) error { return NO; // FIXME } - (void) setDateFormat: (NSString *)string { ASSIGNCOPY(_dateFormat, string); [self _resetUDateFormat]; } - (NSDateFormatterStyle) dateStyle { return internal->_dateStyle; } - (void) setDateStyle: (NSDateFormatterStyle)style { internal->_dateStyle = style; [self _resetUDateFormat]; } - (NSDateFormatterStyle) timeStyle { return internal->_timeStyle; } - (void) setTimeStyle: (NSDateFormatterStyle)style { internal->_timeStyle = style; [self _resetUDateFormat]; } - (NSCalendar *) calendar { return [internal->_locale objectForKey: NSLocaleCalendar]; } - (void) setCalendar: (NSCalendar *)calendar { NSMutableDictionary *dict; NSLocale *locale; dict = [[NSLocale componentsFromLocaleIdentifier: [internal->_locale localeIdentifier]] mutableCopy]; [dict setValue: calendar forKey: NSLocaleCalendar]; locale = [[NSLocale alloc] initWithLocaleIdentifier: [NSLocale localeIdentifierFromComponents: dict]]; [self setLocale: locale]; /* Don't have to use udat_setCalendar here because -setLocale: will take care of setting the calendar when it resets the formatter. */ RELEASE(locale); RELEASE(dict); } - (NSDate *) defaultDate { return nil; // FIXME } - (void) setDefaultDate: (NSDate *)date { return; // FIXME } - (NSLocale *) locale { return internal->_locale; } - (void) setLocale: (NSLocale *)locale { if (locale == internal->_locale) return; RELEASE(internal->_locale); internal->_locale = RETAIN(locale); [self _resetUDateFormat]; } - (NSTimeZone *) timeZone { return internal->_tz; } - (void) setTimeZone: (NSTimeZone *)tz { if (tz == internal->_tz) return; RELEASE(internal->_tz); internal->_tz = RETAIN(tz); [self _resetUDateFormat]; } - (NSDate *) twoDigitStartDate { #if GS_USE_ICU == 1 UErrorCode err = U_ZERO_ERROR; return [NSDate dateWithTimeIntervalSince1970: (udat_get2DigitYearStart (internal->_formatter, &err) / 1000.0)]; #else return nil; #endif } - (void) setTwoDigitStartDate: (NSDate *)date { #if GS_USE_ICU == 1 UErrorCode err = U_ZERO_ERROR; udat_set2DigitYearStart (internal->_formatter, ([date timeIntervalSince1970] * 1000.0), &err); #else return; #endif } - (NSString *) AMSymbol { #if GS_USE_ICU == 1 NSArray *array = [self _getSymbols: UDAT_AM_PMS]; return [array objectAtIndex: 0]; #else return nil; #endif } - (void) setAMSymbol: (NSString *) string { return; } - (NSString *) PMSymbol { #if GS_USE_ICU == 1 NSArray *array = [self _getSymbols: UDAT_AM_PMS]; return [array objectAtIndex: 1]; #else return nil; #endif } - (void) setPMSymbol: (NSString *)string { return; } - (NSArray *) weekdaySymbols { #if GS_USE_ICU == 1 return [self _getSymbols: UDAT_WEEKDAYS]; #else return nil; #endif } - (void) setWeekdaySymbols: (NSArray *)array { #if GS_USE_ICU == 1 [self _setSymbols: array : UDAT_WEEKDAYS]; #else return; #endif } - (NSArray *) shortWeekdaySymbols { #if GS_USE_ICU == 1 return [self _getSymbols: UDAT_SHORT_WEEKDAYS]; #else return nil; #endif } - (void) setShortWeekdaySymbols: (NSArray *)array { #if GS_USE_ICU == 1 [self _setSymbols: array : UDAT_SHORT_WEEKDAYS]; #else return; #endif } - (NSArray *) monthSymbols { #if GS_USE_ICU == 1 return [self _getSymbols: UDAT_MONTHS]; #else return nil; #endif } - (void) setMonthSymbols: (NSArray *)array { #if GS_USE_ICU == 1 [self _setSymbols: array : UDAT_MONTHS]; #else return; #endif } - (NSArray *) shortMonthSymbols { #if GS_USE_ICU == 1 return [self _getSymbols: UDAT_SHORT_MONTHS]; #else return nil; #endif } - (void) setShortMonthSymbols: (NSArray *)array { #if GS_USE_ICU == 1 [self _setSymbols: array : UDAT_SHORT_MONTHS]; #else return; #endif } - (NSArray *) eraSymbols { #if GS_USE_ICU == 1 return [self _getSymbols: UDAT_ERAS]; #else return nil; #endif } - (void) setEraSymbols: (NSArray *)array { #if GS_USE_ICU == 1 [self _setSymbols: array : UDAT_ERAS]; #else return; #endif } - (NSDate *) gregorianStartDate { return nil; } - (void) setGregorianStartDate: (NSDate *)date { return; } - (NSArray *) longEraSymbols { #if GS_USE_ICU == 1 return [self _getSymbols: UDAT_ERA_NAMES]; #else return nil; #endif } - (void) setLongEraSymbols: (NSArray *)array { #if GS_USE_ICU == 1 [self _setSymbols: array : UDAT_ERA_NAMES]; #else return; #endif } - (NSArray *) quarterSymbols { #if GS_USE_ICU == 1 return [self _getSymbols: UDAT_QUARTERS]; #else return nil; #endif } - (void) setQuarterSymbols: (NSArray *)array { #if GS_USE_ICU == 1 [self _setSymbols: array : UDAT_QUARTERS]; #else return; #endif } - (NSArray *) shortQuarterSymbols { #if GS_USE_ICU == 1 return [self _getSymbols: UDAT_SHORT_QUARTERS]; #else return nil; #endif } - (void) setShortQuarterSymbols: (NSArray *)array { #if GS_USE_ICU == 1 [self _setSymbols: array : UDAT_SHORT_QUARTERS]; #else return; #endif } - (NSArray *) standaloneQuarterSymbols { #if GS_USE_ICU == 1 return [self _getSymbols: UDAT_STANDALONE_QUARTERS]; #else return nil; #endif } - (void) setStandaloneQuarterSymbols: (NSArray *)array { #if GS_USE_ICU == 1 [self _setSymbols: array : UDAT_STANDALONE_QUARTERS]; #else return; #endif } - (NSArray *) shortStandaloneQuarterSymbols { #if GS_USE_ICU == 1 return [self _getSymbols: UDAT_STANDALONE_SHORT_QUARTERS]; #else return nil; #endif } - (void) setShortStandaloneQuarterSymbols: (NSArray *)array { #if GS_USE_ICU == 1 [self _setSymbols: array : UDAT_STANDALONE_SHORT_QUARTERS]; #else return; #endif } - (NSArray *) shortStandaloneMonthSymbols { #if GS_USE_ICU == 1 return [self _getSymbols: UDAT_STANDALONE_SHORT_MONTHS]; #else return nil; #endif } - (void) setShortStandaloneMonthSymbols: (NSArray *)array { #if GS_USE_ICU == 1 [self _setSymbols: array : UDAT_STANDALONE_SHORT_MONTHS]; #else return; #endif } - (NSArray *) standaloneMonthSymbols { #if GS_USE_ICU == 1 return [self _getSymbols: UDAT_STANDALONE_MONTHS]; #else return nil; #endif } - (void) setStandaloneMonthSymbols: (NSArray *)array { #if GS_USE_ICU == 1 [self _setSymbols: array : UDAT_STANDALONE_MONTHS]; #else return; #endif } - (NSArray *) veryShortMonthSymbols { #if GS_USE_ICU == 1 return [self _getSymbols: UDAT_NARROW_MONTHS]; #else return nil; #endif } - (void) setVeryShortMonthSymbols: (NSArray *)array { #if GS_USE_ICU == 1 [self _setSymbols: array : UDAT_NARROW_MONTHS]; #else return; #endif } - (NSArray *) veryShortStandaloneMonthSymbols { #if GS_USE_ICU == 1 return [self _getSymbols: UDAT_STANDALONE_NARROW_MONTHS]; #else return nil; #endif } - (void) setVeryShortStandaloneMonthSymbols: (NSArray *)array { #if GS_USE_ICU == 1 [self _setSymbols: array : UDAT_STANDALONE_NARROW_MONTHS]; #else return; #endif } - (NSArray *) shortStandaloneWeekdaySymbols { #if GS_USE_ICU == 1 return [self _getSymbols: UDAT_STANDALONE_SHORT_WEEKDAYS]; #else return nil; #endif } - (void) setShortStandaloneWeekdaySymbols: (NSArray *)array { #if GS_USE_ICU == 1 [self _setSymbols: array : UDAT_STANDALONE_SHORT_WEEKDAYS]; #else return; #endif } - (NSArray *) standaloneWeekdaySymbols { #if GS_USE_ICU == 1 return [self _getSymbols: UDAT_STANDALONE_WEEKDAYS]; #else return nil; #endif } - (void) setStandaloneWeekdaySymbols: (NSArray *)array { #if GS_USE_ICU == 1 [self _setSymbols: array : UDAT_STANDALONE_WEEKDAYS]; #else return; #endif } - (NSArray *) veryShortWeekdaySymbols { #if GS_USE_ICU == 1 return [self _getSymbols: UDAT_SHORT_WEEKDAYS]; #else return nil; #endif } - (void) setVeryShortWeekdaySymbols: (NSArray *)array { #if GS_USE_ICU == 1 [self _setSymbols: array : UDAT_SHORT_WEEKDAYS]; #else return; #endif } - (NSArray *) veryShortStandaloneWeekdaySymbols { #if GS_USE_ICU == 1 return [self _getSymbols: UDAT_STANDALONE_NARROW_WEEKDAYS]; #else return nil; #endif } - (void) setVeryShortStandaloneWeekdaySymbols: (NSArray *)array { #if GS_USE_ICU == 1 [self _setSymbols: array : UDAT_STANDALONE_NARROW_WEEKDAYS]; #else return; #endif } + (NSString *) localizedStringFromDate: (NSDate *) date dateStyle: (NSDateFormatterStyle) dateStyle timeStyle: (NSDateFormatterStyle) timeStyle { NSString *result; NSDateFormatter *fmt = [[self alloc] init]; [fmt setDateStyle: dateStyle]; [fmt setTimeStyle: timeStyle]; result = [fmt stringFromDate: date]; RELEASE(fmt); return result; } + (NSString *) dateFormatFromTemplate: (NSString *) aTemplate options: (NSUInteger) opts locale: (NSLocale *) locale { #if GS_USE_ICU == 1 unichar pat[BUFFER_SIZE]; unichar skel[BUFFER_SIZE]; int32_t patLen; int32_t skelLen; UDateTimePatternGenerator *datpg; UErrorCode err = U_ZERO_ERROR; datpg = udatpg_open ([[locale localeIdentifier] UTF8String], &err); if (U_FAILURE(err)) return nil; if ((patLen = [aTemplate length]) > BUFFER_SIZE) patLen = BUFFER_SIZE; [aTemplate getCharacters: pat range: NSMakeRange(0, patLen)]; skelLen = udatpg_getSkeleton (datpg, pat, patLen, skel, BUFFER_SIZE, &err); if (U_FAILURE(err)) return nil; patLen = udatpg_getBestPattern (datpg, skel, skelLen, pat, BUFFER_SIZE, &err); udatpg_close (datpg); return [NSString stringWithCharacters: pat length: patLen]; #else return nil; #endif } - (BOOL) doesRelativeDateFormatting { return (internal->_dateStyle & FormatterDoesRelativeDateFormatting) ? YES : NO; } - (void) setDoesRelativeDateFormatting: (BOOL)flag { internal->_dateStyle |= FormatterDoesRelativeDateFormatting; } @end @implementation NSDateFormatter (PrivateMethods) - (void) _resetUDateFormat { #if GS_USE_ICU == 1 UChar *pat = NULL; UChar *tzID; int32_t patLength = 0; int32_t tzIDLength; UDateFormatStyle timeStyle; UDateFormatStyle dateStyle; UErrorCode err = U_ZERO_ERROR; if (internal->_formatter) udat_close (internal->_formatter); tzIDLength = [[internal->_tz name] length]; tzID = malloc(sizeof(UChar) * tzIDLength); [[internal->_tz name] getCharacters: tzID]; if (self->_dateFormat) { patLength = [self->_dateFormat length]; pat = malloc(sizeof(UChar) * patLength); [self->_dateFormat getCharacters: pat]; } #if U_ICU_VERSION_MAJOR_NUM >= 50 || defined(HAVE_ICU_H) timeStyle = pat ? UDAT_PATTERN : NSToUDateFormatStyle (internal->_timeStyle); dateStyle = pat ? UDAT_PATTERN : NSToUDateFormatStyle (internal->_dateStyle); #else timeStyle = NSToUDateFormatStyle (internal->_timeStyle); dateStyle = NSToUDateFormatStyle (internal->_dateStyle); #endif internal->_formatter = udat_open (timeStyle, dateStyle, [[internal->_locale localeIdentifier] UTF8String], tzID, tzIDLength, pat, patLength, &err); if (U_FAILURE(err)) internal->_formatter = NULL; if (pat) free(pat); free(tzID); #else return; #endif } #if GS_USE_ICU == 1 static inline void symbolRange(NSInteger symbol, int *from) { switch (symbol) { case UDAT_SHORT_WEEKDAYS: case UDAT_STANDALONE_NARROW_WEEKDAYS: case UDAT_STANDALONE_SHORT_WEEKDAYS: case UDAT_STANDALONE_WEEKDAYS: case UDAT_WEEKDAYS: /* In ICU days of the week number from 1 rather than zero. */ *from = 1; break; default: *from = 0; break; } } #endif - (void) _setSymbols: (NSArray*)array : (NSInteger)symbol { #if GS_USE_ICU == 1 int idx; int count = udat_countSymbols (internal->_formatter, symbol); symbolRange(symbol, &idx); if ([array count] == count - idx) { while (idx < count) { int length; UChar *value; UErrorCode err = U_ZERO_ERROR; NSString *string = [array objectAtIndex: idx]; length = [string length]; value = malloc(sizeof(unichar) * length); [string getCharacters: value range: NSMakeRange(0, length)]; udat_setSymbols(internal->_formatter, symbol, idx, value, length, &err); free(value); ++idx; } } #endif return; } - (NSArray *) _getSymbols: (NSInteger)symbol { #if GS_USE_ICU == 1 NSMutableArray *mArray; int idx; int count; count = udat_countSymbols(internal->_formatter, symbol); symbolRange(symbol, &idx); mArray = [NSMutableArray arrayWithCapacity: count - idx]; while (idx < count) { int length; unichar *value; NSString *str; NSZone *z = [self zone]; UErrorCode err = U_ZERO_ERROR; length = udat_getSymbols(internal->_formatter, symbol, idx, NULL, 0, &err); value = NSZoneMalloc(z, sizeof(unichar) * (length + 1)); err = U_ZERO_ERROR; udat_getSymbols(internal->_formatter, symbol, idx, value, length, &err); if (U_SUCCESS(err)) { str = [[NSString allocWithZone: z] initWithBytesNoCopy: value length: length * sizeof(unichar) encoding: NSUnicodeStringEncoding freeWhenDone: YES]; [mArray addObject: str]; RELEASE(str); } else { NSZoneFree (z, value); } ++idx; } return [NSArray arrayWithArray: mArray]; #else return nil; #endif } @end gnustep-base-1.29.0/Source/NSDateInterval.m000066400000000000000000000132141435650067400204540ustar00rootroot00000000000000/* Implementation of class NSDateInterval Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory Casamento Date: Wed Oct 9 16:24:13 EDT 2019 This file is part of the GNUstep Library. 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 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 USA. */ #include #include #include #include @implementation NSDateInterval // Init - (instancetype)init { self = [super init]; if(self != nil) { _startDate = [NSDate date]; _duration = 0.0; RETAIN(_startDate); } return self; } - (instancetype)initWithStartDate:(NSDate *)startDate duration:(NSTimeInterval)duration { self = [super init]; if(self != nil) { ASSIGNCOPY(_startDate, startDate); if(duration < 0) { [NSException raise: NSInvalidArgumentException format: @"Duration %f is less than zero", duration]; } _duration = duration; } return self; } - (instancetype)initWithStartDate:(NSDate *)startDate endDate:(NSDate *)endDate { return [self initWithStartDate: startDate duration: [endDate timeIntervalSinceDate: startDate]]; } - (instancetype) initWithCoder: (NSCoder *)coder { // TODO: Implement encoding return nil; } - (void) encodeWithCoder: (NSCoder *)coder { } - (id) copyWithZone: (NSZone *)zone { return [[[self class] allocWithZone: zone] initWithStartDate: _startDate duration: _duration]; } - (void) dealloc { RELEASE(_startDate); [super dealloc]; } // Access - (NSDate *) startDate { return _startDate; } - (void) setStartDate: (NSDate *)startDate { ASSIGNCOPY(_startDate, startDate); } - (NSDate *) endDate { return [_startDate dateByAddingTimeInterval: _duration]; } - (void) setEndDate: (NSDate *)endDate { _duration = [endDate timeIntervalSinceDate: _startDate]; } - (NSTimeInterval) duration { return _duration; } - (void) setDuration: (NSTimeInterval)duration { _duration = duration; } // Compare - (NSComparisonResult) compare: (NSDateInterval *)dateInterval { NSComparisonResult result = NSOrderedSame; if([_startDate isEqualToDate: [dateInterval startDate]] && _duration < [dateInterval duration]) { result = NSOrderedAscending; } else if([_startDate compare: [dateInterval startDate]] == NSOrderedAscending) { result = NSOrderedAscending; } else if([self isEqualToDateInterval: dateInterval]) { result = NSOrderedSame; } else if([_startDate isEqualToDate: [dateInterval startDate]] && _duration > [dateInterval duration]) { result = NSOrderedDescending; } else if([_startDate compare: [dateInterval startDate]] == NSOrderedDescending) { result = NSOrderedDescending; } return result; } - (BOOL) isEqualToDateInterval: (NSDateInterval *)dateInterval { return ([_startDate isEqualToDate: [dateInterval startDate]] && _duration == [dateInterval duration]); } // Determine - (BOOL) intersectsDateInterval: (NSDateInterval *)dateInterval { return [self intersectionWithDateInterval: dateInterval] != nil; } - (NSDateInterval *) intersectionWithDateInterval: (NSDateInterval *)dateInterval { NSDateInterval *result = nil; NSDateInterval *first = self; //[sortedArray firstObject]; NSDateInterval *last = dateInterval; // [sortedArray lastObject]; NSDate *intersectStartDate = nil; NSDate *intersectEndDate = nil; // NSArray *array = [NSArray arrayWithObjects: self, dateInterval, nil]; // NSArray *sortedArray = [array sortedArrayUsingSelector: @selector(compare:)]; // Max of start date.... if([[first startDate] compare: [last startDate]] == NSOrderedAscending || [[first startDate] isEqualToDate: [last startDate]]) { intersectStartDate = [last startDate]; } if([[first startDate] compare: [last startDate]] == NSOrderedDescending) { intersectStartDate = [first startDate]; } // Min of end date... if([[first endDate] compare: [last endDate]] == NSOrderedDescending || [[first endDate] isEqualToDate: [last endDate]]) { intersectEndDate = [last endDate]; } if([[first endDate] compare: [last endDate]] == NSOrderedAscending) { intersectEndDate = [first endDate]; } if([intersectStartDate compare: intersectEndDate] == NSOrderedAscending) { result = [[NSDateInterval alloc] initWithStartDate: intersectStartDate endDate: intersectEndDate]; AUTORELEASE(result); } return result; } // Contain - (BOOL) containsDate: (NSDate *)date { NSDate *endDate = [self endDate]; return ([_startDate compare: date] == NSOrderedSame || [endDate compare: date] == NSOrderedSame || ([_startDate compare: date] == NSOrderedAscending && [endDate compare: date] == NSOrderedDescending)); } @end gnustep-base-1.29.0/Source/NSDateIntervalFormatter.m000066400000000000000000000053521435650067400223440ustar00rootroot00000000000000/* Implementation of class NSDateIntervalFormatter Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory John Casamento Date: Wed Oct 9 16:23:55 EDT 2019 This file is part of the GNUstep Library. 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 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 USA. */ #include #include #include #include #include #include #include @implementation NSDateIntervalFormatter // Properties - (NSLocale *) locale { return _locale; } - (void) setLocale: (NSLocale *)locale { ASSIGNCOPY(_locale, locale); } - (NSCalendar *) calendar { return _calendar; } - (void) setCalendar: (NSCalendar *)calendar { ASSIGNCOPY(_calendar, calendar); } - (NSTimeZone *) timeZone { return _timeZone; } - (void) setTimeZone: (NSTimeZone *)timeZone { ASSIGNCOPY(_timeZone, timeZone); } - (NSString *) dateTemplate { return _dateTemplate; } - (void) setDateTemplate: (NSString *)dateTemplate { ASSIGNCOPY(_dateTemplate, dateTemplate); } - (NSDateIntervalFormatterStyle) dateStyle { return _dateStyle; } - (void) setDateStyle: (NSDateIntervalFormatterStyle)dateStyle { _dateStyle = dateStyle; } - (NSDateIntervalFormatterStyle) timeStyle { return _timeStyle; } - (void) setTimeStyle: (NSDateIntervalFormatterStyle)timeStyle { _timeStyle = timeStyle; } // Create strings - (NSString *) stringFromDate: (NSDate *)fromDate toDate: (NSDate *)toDate { NSDateInterval *interval = [[NSDateInterval alloc] initWithStartDate: fromDate endDate: toDate]; AUTORELEASE(interval); return [self stringFromDateInterval: interval]; } - (NSString *) stringFromDateInterval: (NSDateInterval *)dateInterval { NSDate *fromDate = [dateInterval startDate]; NSDate *toDate = [dateInterval endDate]; // Add formatting of NSDate here. return [NSString stringWithFormat: @"%@ - %@", fromDate, toDate]; } @end gnustep-base-1.29.0/Source/NSDebug.m000066400000000000000000000454421435650067400171300ustar00rootroot00000000000000/** Debugging utilities for GNUStep and OpenStep Copyright (C) 1997,1999,2000,2001 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: August 1997 Extended by: Nicola Pero Date: December 2000, April 2001 This file is part of the GNUstep Base Library. 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 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 USA. NSDebug utilities reference $Date$ $Revision$ */ #import "common.h" #include #import "GSPrivate.h" #import "GSPThread.h" #import "GNUstepBase/GSLock.h" #import "Foundation/NSArray.h" #import "Foundation/NSData.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSException.h" #import "Foundation/NSLock.h" #import "Foundation/NSNotification.h" #import "Foundation/NSNotificationQueue.h" #import "Foundation/NSThread.h" #import "Foundation/NSValue.h" #import "GSSorting.h" #if HAVE_EXECINFO_H #include #endif #ifdef HAVE_MALLOC_H #include #endif typedef struct { Class class; /* The following are used for statistical info */ uint32_t count; uint32_t lastc; uint32_t totalc; uint32_t peak; uint64_t bytes; uint64_t totalb; uint64_t lastb; uint32_t nominal_size; /* The following are used to record actual objects */ BOOL is_recording; id *recorded_objects; id *recorded_tags; uint32_t num_recorded_objects; uint32_t stack_size; } table_entry; typedef struct { const char *name; int count; long bytes; } list_entry; static NSInteger itemComp(id v0, id v1, void *ctxt) { int i = strcmp(((list_entry*)v0)->name, ((list_entry *)v1)->name); if (i < 0) return NSOrderedAscending; if (i > 0) return NSOrderedDescending; return NSOrderedSame; } static unsigned int num_classes = 0; static unsigned int table_size = 0; static table_entry* the_table = 0; static BOOL debug_allocation = NO; static BOOL debug_byte_size = NO; BOOL NSDebugEnabled = NO; static gs_mutex_t uniqueLock; static void _GSDebugAllocationFetch(list_entry *items, BOOL difference); static void _GSDebugAllocationFetchAll(list_entry *items); static void _GSDebugAllocationAdd(Class c, id o); static void _GSDebugAllocationRemove(Class c, id o); static void (*_GSDebugAllocationAddFunc)(Class c, id o) = _GSDebugAllocationAdd; static void (*_GSDebugAllocationRemoveFunc)(Class c, id o) = _GSDebugAllocationRemove; #define doLock() GS_MUTEX_LOCK(uniqueLock) #define unLock() GS_MUTEX_UNLOCK(uniqueLock) @interface GSDebugAlloc : NSObject + (void) initialize; @end @implementation GSDebugAlloc + (void) initialize { GS_MUTEX_INIT_RECURSIVE(uniqueLock); } @end void GSSetDebugAllocationFunctions(void (*newAddObjectFunc)(Class c, id o), void (*newRemoveObjectFunc)(Class c, id o)) { doLock(); if (newAddObjectFunc && newRemoveObjectFunc) { _GSDebugAllocationAddFunc = newAddObjectFunc; _GSDebugAllocationRemoveFunc = newRemoveObjectFunc; } else { // Back to default _GSDebugAllocationAddFunc = _GSDebugAllocationAdd; _GSDebugAllocationRemoveFunc = _GSDebugAllocationRemove; } unLock(); } BOOL GSDebugAllocationActive(BOOL active) { BOOL old = debug_allocation; [GSDebugAlloc class]; /* Ensure thread support is working */ debug_allocation = active ? YES : NO; return old; } BOOL GSDebugAllocationBytes(BOOL active) { BOOL old = debug_byte_size; debug_byte_size = active ? YES : NO; return old; } BOOL GSDebugAllocationRecordObjects(Class c, BOOL newState) { BOOL oldState = NO; unsigned int i; if (newState) { GSDebugAllocationActive(YES); } for (i = 0; i < num_classes; i++) { if (the_table[i].class == c) { doLock(); oldState = (YES == the_table[i].is_recording) ? YES : NO; if (newState) { the_table[i].is_recording = YES; } else if (YES == oldState) { while (the_table[i].num_recorded_objects > 0) { int j = the_table[i].num_recorded_objects; the_table[i].num_recorded_objects = --j; [the_table[i].recorded_objects[j] release]; the_table[i].recorded_objects[j] = nil; [the_table[i].recorded_tags[j] release]; the_table[i].recorded_tags[j] = nil; } } unLock(); return oldState; } } if (YES == newState) { doLock(); if (num_classes >= table_size) { int more = table_size + 128; table_entry *tmp; tmp = NSZoneMalloc(NSDefaultMallocZone(), more * sizeof(table_entry)); if (tmp == 0) { unLock(); return NO; } if (the_table) { memcpy(tmp, the_table, num_classes * sizeof(table_entry)); NSZoneFree(NSDefaultMallocZone(), the_table); } the_table = tmp; table_size = more; } the_table[num_classes].class = c; the_table[num_classes].count = 0; the_table[num_classes].lastc = 0; the_table[num_classes].totalc = 0; the_table[num_classes].peak = 0; the_table[num_classes].bytes = 0; the_table[num_classes].lastb = 0; the_table[num_classes].totalb = 0; the_table[num_classes].nominal_size = class_getInstanceSize(c); the_table[num_classes].is_recording = YES; the_table[num_classes].recorded_objects = NULL; the_table[num_classes].recorded_tags = NULL; the_table[num_classes].num_recorded_objects = 0; the_table[num_classes].stack_size = 0; num_classes++; unLock(); } return oldState; } void GSDebugAllocationActiveRecordingObjects(Class c) { GSDebugAllocationRecordObjects(c, YES); } void GSDebugAllocationAdd(Class c, id o) { (*_GSDebugAllocationAddFunc)(c,o); } void _GSDebugAllocationAdd(Class c, id o) { if (debug_allocation == YES) { unsigned int i; unsigned bytes; for (i = 0; i < num_classes; i++) { if (the_table[i].class == c) { doLock(); the_table[i].count++; the_table[i].totalc++; if (YES == debug_byte_size) { bytes = [o sizeOfInstance]; } else { bytes = the_table[i].nominal_size; } the_table[i].bytes += bytes; the_table[i].totalb += bytes; if (the_table[i].count > the_table[i].peak) { the_table[i].peak = the_table[i].count; } if (the_table[i].is_recording == YES) { if (the_table[i].num_recorded_objects >= the_table[i].stack_size) { int more = the_table[i].stack_size + 128; id *tmp; id *tmp1; tmp = NSZoneMalloc(NSDefaultMallocZone(), more * sizeof(id)); if (tmp == 0) { unLock(); return; } tmp1 = NSZoneMalloc(NSDefaultMallocZone(), more * sizeof(id)); if (tmp1 == 0) { NSZoneFree(NSDefaultMallocZone(), tmp); unLock(); return; } if (the_table[i].recorded_objects != NULL) { memcpy(tmp, the_table[i].recorded_objects, the_table[i].num_recorded_objects * sizeof(id)); NSZoneFree(NSDefaultMallocZone(), the_table[i].recorded_objects); memcpy(tmp1, the_table[i].recorded_tags, the_table[i].num_recorded_objects * sizeof(id)); NSZoneFree(NSDefaultMallocZone(), the_table[i].recorded_tags); } the_table[i].recorded_objects = tmp; the_table[i].recorded_tags = tmp1; the_table[i].stack_size = more; } (the_table[i].recorded_objects) [the_table[i].num_recorded_objects] = o; (the_table[i].recorded_tags) [the_table[i].num_recorded_objects] = nil; the_table[i].num_recorded_objects++; } unLock(); return; } } doLock(); if (num_classes >= table_size) { unsigned int more = table_size + 128; table_entry *tmp; tmp = NSZoneMalloc(NSDefaultMallocZone(), more * sizeof(table_entry)); if (tmp == 0) { unLock(); return; /* Argh */ } if (the_table) { memcpy(tmp, the_table, num_classes * sizeof(table_entry)); NSZoneFree(NSDefaultMallocZone(), the_table); } the_table = tmp; table_size = more; } the_table[num_classes].class = c; the_table[num_classes].count = 1; the_table[num_classes].nominal_size = class_getInstanceSize(c); if (YES == debug_byte_size) { bytes = [o sizeOfInstance]; } else { bytes = the_table[num_classes].nominal_size; } the_table[num_classes].bytes = bytes; the_table[num_classes].totalb = bytes; the_table[num_classes].lastb = 0; the_table[num_classes].lastc = 0; the_table[num_classes].totalc = 1; the_table[num_classes].peak = 1; the_table[num_classes].is_recording = NO; the_table[num_classes].recorded_objects = NULL; the_table[num_classes].recorded_tags = NULL; the_table[num_classes].num_recorded_objects = 0; the_table[num_classes].stack_size = 0; num_classes++; unLock(); } } int GSDebugAllocationCount(Class c) { unsigned int i; for (i = 0; i < num_classes; i++) { if (the_table[i].class == c) { return the_table[i].count; } } return 0; } int GSDebugAllocationTotal(Class c) { unsigned int i; for (i = 0; i < num_classes; i++) { if (the_table[i].class == c) { return the_table[i].totalc; } } return 0; } int GSDebugAllocationPeak(Class c) { unsigned int i; for (i = 0; i < num_classes; i++) { if (the_table[i].class == c) { return the_table[i].peak; } } return 0; } Class * GSDebugAllocationClassList() { Class *ans; size_t siz; unsigned int i; doLock(); siz = sizeof(Class) * (num_classes + 1); ans = NSZoneMalloc(NSDefaultMallocZone(), siz); for (i = 0; i < num_classes; i++) { ans[i] = the_table[i].class; } ans[num_classes] = NULL; unLock(); return ans; } const char* GSDebugAllocationList(BOOL changeFlag) { list_entry *items; unsigned size; if (debug_allocation == NO) { return "Debug allocation system is not active!\n"; } doLock(); size = num_classes; if (size > 0) { items = malloc(sizeof(list_entry) * size); _GSDebugAllocationFetch(items, changeFlag); } else { items = 0; } unLock(); while (size > 0 && 0 == items[size - 1].name) { size--; } if (0 == size) { if (items != 0) { free(items); } if (changeFlag) { return "There are NO newly allocated or deallocated object!\n"; } else { return "I can find NO allocated object!\n"; } } else { NSMutableString *result; id order[size]; unsigned index; for (index = 0; index < size; index++) { order[index] = (id)&items[index]; } GSSortUnstable(order, NSMakeRange(0,size), (id)itemComp, GSComparisonTypeFunction, 0); result = [NSMutableString stringWithCapacity: 1000]; for (index = 0; index < size; index++) { list_entry *item = (list_entry*)order[index]; if (YES == debug_byte_size) { [result appendFormat: @"%d\t%-32s\t%ld\n", item->count, item->name, item->bytes]; } else { [result appendFormat: @"%d\t%s\n", item->count, item->name]; } } free(items); return [result UTF8String]; } } const char* GSDebugAllocationListAll() { list_entry *items; unsigned size; if (debug_allocation == NO) { return "Debug allocation system is not active!\n"; } doLock(); size = num_classes; if (size > 0) { items = malloc(sizeof(list_entry) * size); _GSDebugAllocationFetchAll(items); } else { items = 0; } unLock(); if (0 == items) { return "I can find NO allocated object!\n"; } else { NSMutableString *result; id order[size]; unsigned index; for (index = 0; index < size; index++) { order[index] = (id)&items[index]; } GSSortUnstable(order, NSMakeRange(0,size), (id)itemComp, GSComparisonTypeFunction, 0); result = [NSMutableString stringWithCapacity: 1000]; for (index = 0; index < size; index++) { list_entry *item = (list_entry*)order[index]; if (YES == debug_byte_size) { [result appendFormat: @"%d\t%-32s\t%ld\n", item->count, item->name, item->bytes]; } else { [result appendFormat: @"%d\t%s\n", item->count, item->name]; } } free(items); return [result UTF8String]; } } static void _GSDebugAllocationFetch(list_entry *items, BOOL difference) { unsigned i; unsigned pos; for (i = pos = 0; i < num_classes; i++) { int count = the_table[i].count; long bytes = the_table[i].bytes; if (difference) { count -= the_table[i].lastc; bytes -= the_table[i].lastb; the_table[i].lastc = the_table[i].count; the_table[i].lastb = the_table[i].bytes; } if (count || (bytes && debug_byte_size)) { items[pos].name = class_getName(the_table[i].class); items[pos].count = count; items[pos].bytes = bytes; pos++; } } while (pos < num_classes) { items[pos].name = 0; items[pos].count = 0; items[pos].bytes = 0; pos++; } } static void _GSDebugAllocationFetchAll(list_entry *items) { unsigned i; for (i = 0; i < num_classes; i++) { items[i].name = class_getName(the_table[i].class); items[i].count = the_table[i].totalc; items[i].bytes = the_table[i].totalb; } } void GSDebugAllocationRemove(Class c, id o) { (*_GSDebugAllocationRemoveFunc)(c,o); } void _GSDebugAllocationRemove(Class c, id o) { if (debug_allocation == YES) { unsigned int i; for (i = 0; i < num_classes; i++) { if (the_table[i].class == c) { id tag = nil; unsigned bytes; doLock(); if (YES == debug_byte_size) { bytes = [o sizeOfInstance]; } else { bytes = the_table[i].nominal_size; } the_table[i].count--; the_table[i].bytes -= bytes; if (the_table[i].is_recording) { unsigned j, k; for (j = 0; j < the_table[i].num_recorded_objects; j++) { if ((the_table[i].recorded_objects)[j] == o) { tag = (the_table[i].recorded_tags)[j]; break; } } if (j < the_table[i].num_recorded_objects) { for (k = j; k + 1 < the_table[i].num_recorded_objects; k++) { (the_table[i].recorded_objects)[k] = (the_table[i].recorded_objects)[k + 1]; (the_table[i].recorded_tags)[k] = (the_table[i].recorded_tags)[k + 1]; } the_table[i].num_recorded_objects--; } else { /* Not found - no problem - this happens if the object was allocated before we started recording */ ; } } unLock(); [tag release]; return; } } } } id GSDebugAllocationTagRecordedObject(id object, id tag) { Class c = [object class]; id o = nil; int i; int j; if (debug_allocation == NO) { return nil; } doLock(); for (i = 0; i < num_classes; i++) { if (the_table[i].class == c) { break; } } if (i == num_classes || the_table[i].is_recording == NO || the_table[i].num_recorded_objects == 0) { unLock(); return nil; } for (j = 0; j < the_table[i].num_recorded_objects; j++) { if (the_table[i].recorded_objects[j] == object) { o = the_table[i].recorded_tags[j]; the_table[i].recorded_tags[j] = RETAIN(tag); break; } } unLock(); return AUTORELEASE(o); } NSArray * GSDebugAllocationListRecordedObjects(Class c) { NSArray *answer; unsigned int i, k; id *tmp; if (debug_allocation == NO) { return nil; } doLock(); for (i = 0; i < num_classes; i++) { if (the_table[i].class == c) { break; } } if (i == num_classes) { unLock(); return nil; } if (the_table[i].is_recording == NO) { unLock(); return nil; } if (the_table[i].num_recorded_objects == 0) { unLock(); return [NSArray array]; } tmp = NSZoneMalloc(NSDefaultMallocZone(), the_table[i].num_recorded_objects * sizeof(id)); if (tmp == 0) { unLock(); return nil; } /* First, we copy the objects into a temporary buffer */ memcpy(tmp, the_table[i].recorded_objects, the_table[i].num_recorded_objects * sizeof(id)); /* Retain all the objects - NB: if retaining one of the objects as a * side effect releases another one of them , we are broken ... */ for (k = 0; k < the_table[i].num_recorded_objects; k++) { [tmp[k] retain]; } /* Then, we bravely unlock the lock */ unLock(); /* Only then we create an array with them - this is now safe as we * have copied the objects out, unlocked, and retained them. */ answer = [NSArray arrayWithObjects: tmp count: the_table[i].num_recorded_objects]; /* Now we release all the objects to balance the retain */ for (k = 0; k < the_table[i].num_recorded_objects; k++) { [tmp[k] release]; } /* And free the space used by them */ NSZoneFree(NSDefaultMallocZone(), tmp); return answer; } const char * _NSPrintForDebugger(id object) { if (object && [object respondsToSelector: @selector(description)]) return [[object description] UTF8String]; return NULL; } NSString * _NSNewStringFromCString(const char *cstring) { NSString *string; string = [NSString stringWithCString: cstring encoding: [NSString defaultCStringEncoding]]; if (nil == string) { string = [NSString stringWithUTF8String: cstring]; if (nil == string) { string = [NSString stringWithCString: cstring encoding: NSISOLatin1StringEncoding]; } } return string; } gnustep-base-1.29.0/Source/NSDecimal.m000066400000000000000000001137131435650067400174350ustar00rootroot00000000000000/** NSDecimal functions Copyright (C) 2000 Free Software Foundation, Inc. Written by: Fred Kiefer Created: July 2000 This file is part of the GNUstep Base Library. 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 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 USA. NSDecimal class reference $Date$ $Revision$ */ #import "common.h" #include #if !defined(__APPLE__) || !defined(GNU_RUNTIME) #include #endif #import "Foundation/NSDecimal.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSUserDefaults.h" #ifndef NAN #define NAN 0.0 #endif /* This file provides two implementations of the NSDecimal functions. One is based on pure simple decimal mathematics, as we all learned it in school. This version is rather slow and may be inexact in the extreme cases. THIS IS TESTED AND WORKING. The second implemenation requires the GMP library, the GNU math package, to do the hard work. This is very fast and accurate. But as GMP is not available on all computers this has to be switched on at compile time. THIS IS STILL NOT IMPLEMENTED. The data structure used for NSDecimals is a bit strange. It also does not correspond to the description in the OpenStep specification. But this is not consistent, so a decision had to be made. The mantissa part (I know D. Knuth does not like this term, but it is used in the specification so we stay with it) consists of up to 38 digits, this are stored as an integer (in decimal representation or limps depending on the USE_GMP flag). And the exponent is stored in a signed character. As a result the numbers that can be represented are the ranges from -9(38 times)*10**127 to -1*10**-128, the number 0 and 1*10**-128 to 9(38 times)*10**127. This means we have more big numbers than one would expect (almost up to 10**165) but small numbers can only be represented with limited exactness (one digit for -128, two for -127 and so on). I think this is as close as possible to the specification, but other interpretations are also valid. (Changing the exponent either absolut [eg minus 38] or relative to the number of digits in the mantissa [minus length].) */ #if USE_GMP // Define GSDecimal as using a character vector typedef struct { signed char exponent; /* Signed exponent - -128 to 127 */ BOOL isNegative; /* Is this negative? */ BOOL validNumber; /* Is this a valid number? */ unsigned char length; /* digits in mantissa. */ unsigned char cMantissa[2*NSDecimalMaxDigit]; /* Make this big enough for multiplication */ } GSDecimal; static NSDecimal zero = {0, NO, YES, 0, {0}}; static NSDecimal one = {0, NO, YES, 1, {1}}; #define NSDECIMAL_IS_ZERO(num) (0 == num->size) #define GSDECIMAL_IS_ZERO(num) (0 == num->length) #else // Make GSDecimal a synonym of NSDecimal /** typedef struct {
signed char exponent; // Signed exponent - -128 to 127
BOOL isNegative; // Is this negative?
BOOL validNumber; // Is this a valid number?
unsigned char length; // digits in mantissa.
unsigned char cMantissa[2*NSDecimalMaxDigit];
}
*/ typedef NSDecimal GSDecimal; static NSDecimal zero = {0, NO, YES, 0, {0}}; static NSDecimal one = {0, NO, YES, 1, {1}}; #define NSDECIMAL_IS_ZERO(num) (0 == num->length) #define GSDECIMAL_IS_ZERO(num) (0 == num->length) #endif GS_DECLARE void NSDecimalCopy(NSDecimal *destination, const NSDecimal *source) { memcpy(destination, source, sizeof(NSDecimal)); } static void GSDecimalCompact(GSDecimal *number) { int i, j; //NSLog(@"Compact start %@ ", NSDecimalString(number, nil)); if (!number->validNumber) return; // Cut off leading 0's for (i = 0; i < number->length; i++) { if (number->cMantissa[i] != 0) break; } if (i > 0) { for (j = 0; j < number->length-i; j++) { number->cMantissa[j] = number->cMantissa[j+i]; } number->length -= i; } // Cut off trailing 0's for (i = number->length-1; i >= 0; i--) { if (0 == number->cMantissa[i]) { if (127 == number->exponent) { // Overflow in compacting!! // Leave the remaining 0s there. break; } number->length--; number->exponent++; } else break; } if (GSDECIMAL_IS_ZERO(number)) { number->exponent = 0; number->isNegative = NO; } //NSLog(@"Compact end %@ ", NSDecimalString(number, nil)); } static NSComparisonResult GSDecimalCompare(const GSDecimal *leftOperand, const GSDecimal *rightOperand) { int i, l; int s1 = leftOperand->exponent + leftOperand->length; int s2 = rightOperand->exponent + rightOperand->length; if (leftOperand->validNumber != rightOperand->validNumber) { if (rightOperand->validNumber) return NSOrderedDescending; else return NSOrderedAscending; } if (leftOperand->isNegative != rightOperand->isNegative) { if (rightOperand->isNegative) return NSOrderedDescending; else return NSOrderedAscending; } // Same sign, check size if (s1 < s2) { if (rightOperand->isNegative) return NSOrderedDescending; else return NSOrderedAscending; } if (s1 > s2) { if (rightOperand->isNegative) return NSOrderedAscending; else return NSOrderedDescending; } // Same size, check digits l = MIN(leftOperand->length, rightOperand->length); for (i = 0; i < l; i++) { int d = rightOperand->cMantissa[i] - leftOperand->cMantissa[i]; if (d > 0) { if (rightOperand->isNegative) return NSOrderedDescending; else return NSOrderedAscending; } if (d < 0) { if (rightOperand->isNegative) return NSOrderedAscending; else return NSOrderedDescending; } } // Same digits, check length if (leftOperand->length > rightOperand->length) { if (rightOperand->isNegative) return NSOrderedAscending; else return NSOrderedDescending; } if (leftOperand->length < rightOperand->length) { if (rightOperand->isNegative) return NSOrderedDescending; else return NSOrderedAscending; } return NSOrderedSame; } static NSComparisonResult NSSimpleCompare(const NSDecimal *leftOperand, const NSDecimal *rightOperand); static void GSDecimalRound(GSDecimal *result, int scale, NSRoundingMode mode) { int i; // last valid digit in number int l = scale + result->exponent + result->length; if (NSDecimalNoScale == scale) return; if (!result->validNumber) return; if (result->length <= l) return; else if (l < 0) { result->length = 0; result->exponent = 0; result->isNegative = NO; return; } else { int c, n; BOOL up; if (l == 0) { int x; x = result->length; result->length += 1; l += 1; while (x > 0) { result->cMantissa[x] = result->cMantissa[x-1]; x--; } result->cMantissa[0] = 0; } // Adjust length and exponent result->exponent += result->length - l; result->length = l; switch (mode) { case NSRoundDown: up = result->isNegative; break; case NSRoundUp: up = !result->isNegative; break; case NSRoundPlain: n = result->cMantissa[l]; up = (n >= 5); break; case NSRoundBankers: n = result->cMantissa[l]; if (n > 5) { up = YES; } else if (n < 5) { up = NO; } else { c = result->cMantissa[l-1]; up = ((c % 2) != 0); } break; default: // No way to get here up = NO; break; } if (up) { for (i = l-1; i >= 0; i--) { if (result->cMantissa[i] != 9) { result->cMantissa[i]++; break; } result->cMantissa[i] = 0; } // Final overflow? if (-1 == i) { // As all digits are zeros, just change the first result->cMantissa[0] = 1; if (127 == result->exponent) { // Overflow in rounding!! // Add one zero add the end. There must be space as // we just cut off some digits. result->cMantissa[l] = 0; result->length++; } else result->exponent++; } } } GSDecimalCompact(result); } static NSCalculationError GSDecimalNormalize(GSDecimal *n1, GSDecimal *n2, NSRoundingMode mode) { // Both are valid numbers and the exponents are not equal int e1 = n1->exponent; int e2 = n2->exponent; int i, l; // make sure n2 has the bigger exponent if (e1 > e2) { GSDecimal *t; t = n1; n1 = n2; n2 = t; i = e2; e2 = e1; e1 = i; } // Add zeros to n2, as far as possible l = MIN(NSDecimalMaxDigit - n2->length, e2 - e1); for (i = 0; i < l; i++) { n2->cMantissa[i + n2->length] = 0; } n2->length += l; n2->exponent -= l; if (l != e2 - e1) { // Round of some digits from n1 to increase exponent GSDecimalRound(n1, -n2->exponent, mode); if (n1->exponent != n2->exponent) { // Some zeros where cut of again by compacting l = MIN(NSDecimalMaxDigit - n1->length, n1->exponent - n2->exponent); for (i = 0; i < l; i++) { n1->cMantissa[(NSInteger)n1->length] = 0; n1->length++; } n1->exponent = n2->exponent; } return NSCalculationLossOfPrecision; } return NSCalculationNoError; } static NSCalculationError GSSimpleAdd(NSDecimal *result, const NSDecimal *left, const NSDecimal *right, NSRoundingMode mode); GS_DECLARE NSCalculationError NSDecimalAdd(NSDecimal *result, const NSDecimal *left, const NSDecimal *right, NSRoundingMode mode) { NSCalculationError error = NSCalculationNoError; NSCalculationError error1; NSDecimal n1; NSDecimal n2; NSComparisonResult comp; if (!left->validNumber || !right->validNumber) { result->validNumber = NO; return error; } // check for zero if (NSDECIMAL_IS_ZERO(left)) { NSDecimalCopy(result, right); return error; } if (NSDECIMAL_IS_ZERO(right)) { NSDecimalCopy(result, left); return error; } // For different signs use subtraction if (left->isNegative != right->isNegative) { if (left->isNegative) { NSDecimalCopy(&n1, left); n1.isNegative = NO; return NSDecimalSubtract(result, right, &n1, mode); } else { NSDecimalCopy(&n1, right); n1.isNegative = NO; return NSDecimalSubtract(result, left, &n1, mode); } } NSDecimalCopy(&n1, left); NSDecimalCopy(&n2, right); error = NSDecimalNormalize(&n1, &n2, mode); comp = NSSimpleCompare(&n1, &n2); /* NSLog(@"Add left %@ right %@", NSDecimalString(left, nil), NSDecimalString(right, nil)); NSLog(@"Add n1 %@ n2 %@ comp %d", NSDecimalString(&n1, nil), NSDecimalString(&n2, nil), comp); */ // both negative, make positive if (left->isNegative) { n1.isNegative = NO; n2.isNegative = NO; // SimpleCompare does not look at sign if (NSOrderedDescending == comp) { error1 = GSSimpleAdd(result, &n1, &n2, mode); } else { error1 = GSSimpleAdd(result, &n2, &n1, mode); } result->isNegative = YES; if (NSCalculationUnderflow == error1) error1 = NSCalculationOverflow; else if (NSCalculationOverflow == error1) error1 = NSCalculationUnderflow; } else { if (NSOrderedAscending == comp) { error1 = GSSimpleAdd(result, &n2, &n1, mode); } else { error1 = GSSimpleAdd(result, &n1, &n2, mode); } } NSDecimalCompact(result); if (NSCalculationNoError == error1) return error; else return error1; } static NSCalculationError GSSimpleSubtract(NSDecimal *result, const NSDecimal *left, const NSDecimal *right, NSRoundingMode mode); GS_DECLARE NSCalculationError NSDecimalSubtract(NSDecimal *result, const NSDecimal *left, const NSDecimal *right, NSRoundingMode mode) { NSCalculationError error = NSCalculationNoError; NSCalculationError error1; NSDecimal n1; NSDecimal n2; NSComparisonResult comp; if (!left->validNumber || !right->validNumber) { result->validNumber = NO; return error; } if (NSDECIMAL_IS_ZERO(right)) { NSDecimalCopy(result, left); return error; } if (NSDECIMAL_IS_ZERO(left)) { NSDecimalCopy(result, right); result->isNegative = !result->isNegative; return error; } // For different signs use addition if (left->isNegative != right->isNegative) { if (left->isNegative) { NSDecimalCopy(&n1, left); n1.isNegative = NO; error1 = NSDecimalAdd(result, &n1, right, mode); result->isNegative = YES; if (NSCalculationUnderflow == error1) error1 = NSCalculationOverflow; else if (NSCalculationOverflow == error1) error1 = NSCalculationUnderflow; return error1; } else { NSDecimalCopy(&n1, right); n1.isNegative = NO; return NSDecimalAdd(result, left, &n1, mode); } } NSDecimalCopy(&n1, left); NSDecimalCopy(&n2, right); error = NSDecimalNormalize(&n1, &n2, mode); comp = NSDecimalCompare(left, right); /* NSLog(@"Sub left %@ right %@", NSDecimalString(left, nil), NSDecimalString(right, nil)); NSLog(@"Sub n1 %@ n2 %@ comp %d", NSDecimalString(&n1, nil), NSDecimalString(&n2, nil), comp); */ if (NSOrderedSame == comp) { NSDecimalCopy(result, &zero); return NSCalculationNoError; } // both negative, make positive and change order if (left->isNegative) { n1.isNegative = NO; n2.isNegative = NO; if (NSOrderedAscending == comp) { error1 = GSSimpleSubtract(result, &n1, &n2, mode); result->isNegative = YES; } else { error1 = GSSimpleSubtract(result, &n2, &n1, mode); } } else { if (NSOrderedAscending == comp) { error1 = GSSimpleSubtract(result, &n2, &n1, mode); result->isNegative = YES; } else { error1 = GSSimpleSubtract(result, &n1, &n2, mode); } } NSDecimalCompact(result); if (NSCalculationNoError == error1) return error; else return error1; } static NSCalculationError GSSimpleMultiply(NSDecimal *result, NSDecimal *l, NSDecimal *r, NSRoundingMode mode); GS_DECLARE NSCalculationError NSDecimalMultiply(NSDecimal *result, const NSDecimal *l, const NSDecimal *r, NSRoundingMode mode) { NSCalculationError error = NSCalculationNoError; NSDecimal n1; NSDecimal n2; int exp = l->exponent + r->exponent; BOOL neg = l->isNegative != r->isNegative; NSComparisonResult comp; if (!l->validNumber || !r->validNumber) { result->validNumber = NO; return error; } // check for zero if (NSDECIMAL_IS_ZERO(l) || NSDECIMAL_IS_ZERO(r)) { NSDecimalCopy(result, &zero); return error; } if (exp > 127) { result->validNumber = NO; if (neg) return NSCalculationUnderflow; else return NSCalculationOverflow; } NSDecimalCopy(&n1, l); NSDecimalCopy(&n2, r); n1.exponent = 0; n2.exponent = 0; n1.isNegative = NO; n2.isNegative = NO; comp = NSSimpleCompare(&n1, &n2); if (NSOrderedDescending == comp) { error = GSSimpleMultiply(result, &n1, &n2, mode); } else { error = GSSimpleMultiply(result, &n2, &n1, mode); } NSDecimalCompact(result); if (result->exponent + exp > 127) { result->validNumber = NO; if (neg) return NSCalculationUnderflow; else return NSCalculationOverflow; } else if (result->exponent + exp < -128) { // We must cut off some digits NSDecimalRound(result, result, exp+128, mode); error = NSCalculationLossOfPrecision; if (result->exponent + exp < -128) { NSDecimalCopy(result, &zero); return error; } } result->exponent += exp; result->isNegative = neg; return error; } static NSCalculationError GSSimpleDivide(NSDecimal *result, const NSDecimal *l, const NSDecimal *r, NSRoundingMode mode); GS_DECLARE NSCalculationError NSDecimalDivide(NSDecimal *result, const NSDecimal *l, const NSDecimal *rr, NSRoundingMode mode) { NSCalculationError error = NSCalculationNoError; NSDecimal n1; NSDecimal n2; int exp = l->exponent - rr->exponent; BOOL neg = l->isNegative != rr->isNegative; if (!l->validNumber || !rr->validNumber) { result->validNumber = NO; return NSCalculationNoError; } // Check for zero if (NSDECIMAL_IS_ZERO(rr)) { result->validNumber = NO; return NSCalculationDivideByZero; } if (NSDECIMAL_IS_ZERO(l)) { NSDecimalCopy(result, &zero); return error; } // Should also check for one NSDecimalCopy(&n1, l); n1.exponent = 0; n1.isNegative = NO; NSDecimalCopy(&n2, rr); n2.exponent = 0; n2.isNegative = NO; error = GSSimpleDivide(result, &n1, &n2, mode); NSDecimalCompact(result); if (result->exponent + exp > 127) { result->validNumber = NO; if (neg) return NSCalculationUnderflow; else return NSCalculationOverflow; } else if (result->exponent + exp < -128) { // We must cut off some digits NSDecimalRound(result, result, exp+128, mode); error = NSCalculationLossOfPrecision; if (result->exponent + exp < -128) { NSDecimalCopy(result, &zero); return error; } } result->exponent += exp; result->isNegative = neg; return error; } GS_DECLARE NSCalculationError NSDecimalPower(NSDecimal *result, const NSDecimal *n, NSUInteger power, NSRoundingMode mode) { NSCalculationError error = NSCalculationNoError; unsigned int e = power; NSDecimal n1; BOOL neg = (n->isNegative && (power % 2)); NSDecimalCopy(&n1, n); n1.isNegative = NO; NSDecimalCopy(result, &one); // NSDecimalCopy(result, &zero); // result->length = 1; // result->cMantissa[0] = 1; while (e) { if (e & 1) { error = NSDecimalMultiply(result, result, &n1, mode); if (NSCalculationNoError != error) { break; } } // keep on squaring the number error = NSDecimalMultiply(&n1, &n1, &n1, mode); if (NSCalculationNoError != error) { break; } e >>= 1; } result->isNegative = neg; NSDecimalCompact(result); return error; } GS_DECLARE NSCalculationError NSDecimalMultiplyByPowerOf10(NSDecimal *result, const NSDecimal *n, short power, NSRoundingMode mode) { int p; NSDecimalCopy(result, n); p = result->exponent + power; if (p > 127) { result->validNumber = NO; return NSCalculationOverflow; } if (p < -128) { result->validNumber = NO; return NSCalculationUnderflow; } result->exponent += power; return NSCalculationNoError; } static NSString* GSDecimalString(const GSDecimal *number, NSDictionary *locale) { int i; int d; NSString *s; NSMutableString *string; NSString *sep; int size; if (!number->validNumber) return @"NaN"; if ((nil == locale) || (sep = [locale objectForKey: NSDecimalSeparator]) == nil) sep = @"."; string = [NSMutableString stringWithCapacity: 45]; if (!number->length) { [string appendString: @"0"]; [string appendString: sep]; [string appendString: @"0"]; return string; } if (number->isNegative) [string appendString: @"-"]; size = number->length + number->exponent; if ((number->length <= 6) && (0 < size) && (size < 7)) { // For small numbers use the normal format for (i = 0; i < number->length; i++) { if (size == i) [string appendString: sep]; d = number->cMantissa[i]; s = [NSString stringWithFormat: @"%d", d]; [string appendString: s]; } for (i = 0; i < number->exponent; i++) { [string appendString: @"0"]; } } else if ((number->length <= 6) && (0 >= size) && (size > -3)) { // For small numbers use the normal format [string appendString: @"0"]; [string appendString: sep]; for (i = 0; i > size; i--) { [string appendString: @"0"]; } for (i = 0; i < number->length; i++) { d = number->cMantissa[i]; s = [NSString stringWithFormat: @"%d", d]; [string appendString: s]; } } else { // Scientific format for (i = 0; i < number->length; i++) { if (1 == i) [string appendString: sep]; d = number->cMantissa[i]; s = [NSString stringWithFormat: @"%d", d]; [string appendString: s]; } if (size != 1) { s = [NSString stringWithFormat: @"E%d", size-1]; [string appendString: s]; } } return string; } // GNUstep extensions to make the implementation of NSDecimalNumber totaly // independent for NSDecimals internal representation // Give back the biggest NSDecimal GS_DECLARE void NSDecimalMax(NSDecimal *result) { // FIXME: this is too small NSDecimalFromComponents(result, 9, 127, NO); } // Give back the smallest NSDecimal GS_DECLARE void NSDecimalMin(NSDecimal *result) { // This is the smallest possible not the smallest positive number // FIXME: this is too big NSDecimalFromComponents(result, 9, 127, YES); } // Give back the value of a NSDecimal as a double static double GSDecimalDouble(GSDecimal *number) { double d = 0.0; int i; if (!number->validNumber) return NAN; // Sum up the digits for (i = 0; i < number->length; i++) { d *= 10; d += number->cMantissa[i]; } // multiply with the exponent // There is also a GNU extension pow10!! d *= pow(10, number->exponent); if (number->isNegative) d = -d; return d; } // Create a NSDecimal with a cMantissa, exponent and a negative flag static void GSDecimalFromComponents(GSDecimal *result, unsigned long long mantissa, short exponent, BOOL negative) { unsigned char digit; int i, j; result->isNegative = negative; result->exponent = exponent; result->validNumber = YES; i = 0; while (mantissa) { digit = mantissa % 10; // Store the digit starting from the end of the array result->cMantissa[NSDecimalMaxDigit-i-1] = digit; mantissa = mantissa / 10; i++; } for (j = 0; j < i; j++) { // Move the digits to the beginning result->cMantissa[j] = result->cMantissa[j + NSDecimalMaxDigit-i]; } result->length = i; GSDecimalCompact(result); } // Create a NSDecimal from a string using the local static void GSDecimalFromString(GSDecimal *result, NSString *numberValue, NSDictionary *locale) { NSRange found; NSString *sep = [locale objectForKey: NSDecimalSeparator]; const char *s; int i; if (nil == sep) sep = @"."; result->isNegative = NO; result->exponent = 0; result->validNumber = YES; result->length = 0; found = [numberValue rangeOfString: sep]; if (found.length) { s = [[numberValue substringToIndex: found.location] lossyCString]; if ('-' == *s) { result->isNegative = YES; s++; } while ((*s) && (!isdigit(*s))) s++; i = 0; while ((*s) && (isdigit(*s))) { result->cMantissa[i++] = *s - '0'; result->length++; s++; } s = [[numberValue substringFromIndex: NSMaxRange(found)] lossyCString]; while ((*s) && (isdigit(*s))) { result->cMantissa[i++] = *s - '0'; result->length++; result->exponent--; s++; } } else { s = [numberValue lossyCString]; if ('-' == *s) { result->isNegative = YES; s++; } while ((*s) && (!isdigit(*s))) s++; i = 0; while ((*s) && (isdigit(*s))) { result->cMantissa[i++] = *s - '0'; result->length++; s++; } } if ((*s == 'e') || (*s == 'E')) { s++; result->exponent += atoi(s); } if (!result->length) result->validNumber = NO; GSDecimalCompact(result); } #if USE_GMP static void CharvecToDecimal(const GSDecimal *m, NSDecimal *n) { // Convert from a GSDecimal to a NSDecimal n->exponent = m->exponent; n->isNegative = m->isNegative; n->validNumber = m->validNumber; if (0 == m->length) n->size = 0; else { n->size = mpn_set_str(n->lMantissa, m->cMantissa, m->length, 10); } } static void DecimalToCharvec(const NSDecimal *n, GSDecimal *m) { // Convert from a NSDecimal to a GSDecimal m->exponent = n->exponent; m->isNegative = n->isNegative; m->validNumber = n->validNumber; if (0 == n->size) { m->length = 0; } else { NSDecimal n1; NSDecimalCopy(&n1, n); m->length = mpn_get_str(m->cMantissa, 10, n1.lMantissa, n->size); // Do a compact only if the first digit is zero if (0 == m->cMantissa[0]) GSDecimalCompact(m); } } GS_DECLARE void NSDecimalCompact(NSDecimal *number) { GSDecimal m; DecimalToCharvec(number, &m); GSDecimalCompact(&m); // FIXME: Here we need a check if the string fits into a GSDecimal, // if not we must round some limbs off. if (NSDecimalMaxDigit < m.length) GSDecimalRound(&m, NSDecimalMaxDigit - m.exponent, NSRoundPlain); CharvecToDecimal(&m, number); } GS_DECLARE NSComparisonResult NSDecimalCompare(const NSDecimal *leftOperand, const NSDecimal *rightOperand) { GSDecimal m1; GSDecimal m2; DecimalToCharvec(leftOperand, &m1); DecimalToCharvec(rightOperand, &m2); return GSDecimalCompare(&m1, &m2); } static NSComparisonResult NSSimpleCompare(const NSDecimal *leftOperand, const NSDecimal *rightOperand) { // This only checks the size of the operands. if (leftOperand->size == rightOperand->size) return NSOrderedSame; else if (leftOperand->size > rightOperand->size) return NSOrderedDescending; else return NSOrderedAscending; } void NSDecimalRound(NSDecimal *result, const NSDecimal *number, NSInteger scale, NSRoundingMode mode) { GSDecimal m; DecimalToCharvec(number, &m); GSDecimalRound(&m, scale, mode); CharvecToDecimal(&m, result); } GS_DECLARE NSCalculationError NSDecimalNormalize(NSDecimal *n1, NSDecimal *n2, NSRoundingMode mode) { NSCalculationError error; GSDecimal m1; GSDecimal m2; if (!n1->validNumber || !n2->validNumber) return NSCalculationNoError; // Do they have the same exponent already? if (n1->exponent == n2->exponent) return NSCalculationNoError; DecimalToCharvec(n1, &m1); DecimalToCharvec(n2, &m2); /* NSLog(@"Normalize n1 %@ n2 %@", NSDecimalString(n1, nil), NSDecimalString(n2, nil)); NSLog(@"Normalize m1 %@ m2 %@", GSDecimalString(&m1, nil), GSDecimalString(&m2, nil)); */ error = GSDecimalNormalize(&m1, &m2, mode); CharvecToDecimal(&m1, n1); CharvecToDecimal(&m2, n2); /* NSLog(@"Normalized m1 %@ m2 %@", GSDecimalString(&m1, nil), GSDecimalString(&m2, nil)); NSLog(@"Normalized n1 %@ n2 %@", NSDecimalString(n1, nil), NSDecimalString(n2, nil)); */ } static NSCalculationError GSSimpleAdd(NSDecimal *result, const NSDecimal *left, const NSDecimal *right, NSRoundingMode mode) { NSCalculationError error = NSCalculationNoError; mp_limb_t carry; NSDecimalCopy(result, left); if (0 == right->size) return error; carry = mpn_add(result->lMantissa, left->lMantissa, left->size, right->lMantissa, right->size); result->size = left->size; // check carry if (carry) { result->lMantissa[result->size] = carry; result->size++; } return error; } static NSCalculationError GSSimpleSubtract(NSDecimal *result, const NSDecimal *left, const NSDecimal *right, NSRoundingMode mode) { NSCalculationError error = NSCalculationNoError; mp_limb_t borrow; /* NSLog(@"SimpleSub left %@ right %@ size %d", NSDecimalString(left, nil), NSDecimalString(right, nil), right->size); */ NSDecimalCopy(result, left); if (0 == right->size) return error; borrow = mpn_sub(result->lMantissa, left->lMantissa, left->size, right->lMantissa, right->size); result->size = left->size; // check borrow if (borrow) NSLog(@"Impossible error in subtraction"); return error; } static NSCalculationError GSSimpleMultiply(NSDecimal *result, NSDecimal *left, NSDecimal *right, NSRoundingMode mode) { NSCalculationError error = NSCalculationNoError; mp_limb_t limb; /* NSLog(@"SimpleMul left %@ right %@ size %d", NSDecimalString(left, nil), NSDecimalString(right, nil), right->size); */ NSDecimalCopy(result, &zero); // FIXME: Make sure result is big enougth limb = mpn_mul(result->lMantissa, left->lMantissa, left->size, right->lMantissa, right->size); if (limb) { result->size = left->size + right->size; } else { //NSLog(@"Limb not set"); result->size = left->size + right->size - 1; } // NSLog(@"SimpleMul result %@", NSDecimalString(result, nil)); return error; } static NSCalculationError GSSimpleDivide(NSDecimal *result, const NSDecimal *left, const NSDecimal *right, NSRoundingMode mode) { NSCalculationError error = NSCalculationNoError; mp_limb_t limb; mp_size_t x = 38 + right->size - left->size; NSDecimal n; NSDecimalCopy(&n, left); // FIXME: I don't understand how to do this limb = mpn_divrem (result->lMantissa, x, n.lMantissa, left->size, right->lMantissa, right->size); return error; } GS_DECLARE NSString* NSDecimalString(const NSDecimal *decimal, NSDictionary *locale) { GSDecimal n; DecimalToCharvec(decimal, &n); return GSDecimalString(&n, locale); } GS_DECLARE double NSDecimalDouble(NSDecimal *number) { GSDecimal n; DecimalToCharvec(number, &n); return GSDecimalDouble(&n); } GS_DECLARE void NSDecimalFromComponents(NSDecimal *result, unsigned long long mantissa, short exponent, BOOL negative) { GSDecimal n; //GSDecimal n1; GSDecimalFromComponents(&n, mantissa, exponent, negative); CharvecToDecimal(&n, result); //NSLog(@"GSDecimal 1: %@", GSDecimalString(&n, nil)); //NSLog(@"NSDecimal 1: %@", NSDecimalString(result, nil)); //DecimalToCharvec(result, &n1); //NSLog(@"GSDecimal 2: %@", GSDecimalString(&n1, nil)); //NSLog(@"NSDecimal 2: %@", NSDecimalString(result, nil)); } GS_DECLARE void NSDecimalFromString(NSDecimal *result, NSString *numberValue, NSDictionary *locale) { GSDecimal n; GSDecimalFromString(&n, numberValue, locale); CharvecToDecimal(&n, result); } #else // First implementations of the functions defined in NSDecimal.h GS_DECLARE void NSDecimalCompact(NSDecimal *number) { GSDecimalCompact(number); } GS_DECLARE NSComparisonResult NSDecimalCompare(const NSDecimal *leftOperand, const NSDecimal *rightOperand) { return GSDecimalCompare(leftOperand, rightOperand); } GS_DECLARE void NSDecimalRound(NSDecimal *result, const NSDecimal *number, NSInteger scale, NSRoundingMode mode) { NSDecimalCopy(result, number); GSDecimalRound(result, scale, mode); } GS_DECLARE NSCalculationError NSDecimalNormalize(NSDecimal *n1, NSDecimal *n2, NSRoundingMode mode) { if (!n1->validNumber || !n2->validNumber) return NSCalculationNoError; // Do they have the same exponent already? if (n1->exponent == n2->exponent) return NSCalculationNoError; return GSDecimalNormalize(n1, n2, mode); } static NSComparisonResult NSSimpleCompare(const NSDecimal *leftOperand, const NSDecimal *rightOperand) { // This only checks the length of the operands. if (leftOperand->length == rightOperand->length) return NSOrderedSame; else if (leftOperand->length > rightOperand->length) return NSOrderedDescending; else return NSOrderedAscending; } static NSCalculationError GSSimpleAdd(NSDecimal *result, const NSDecimal *left, const NSDecimal *right, NSRoundingMode mode) { // left and right are both valid and positive, non-zero. The have been normalized and // left is bigger than right. result, left and right all point to different entities. // Result will not be compacted. NSCalculationError error = NSCalculationNoError; int i, j, l, d; int carry = 0; NSDecimalCopy(result, left); j = left->length - right->length; l = right->length; // Add all the digits for (i = l-1; i >= 0; i--) { d = right->cMantissa[i] + result->cMantissa[i + j] + carry; if (d >= 10) { d = d % 10; carry = 1; } else carry = 0; result->cMantissa[i + j] = d; } if (carry) { for (i = j-1; i >= 0; i--) { if (result->cMantissa[i] != 9) { result->cMantissa[i]++; carry = 0; break; } result->cMantissa[i] = 0; } if (carry) { // The number must be shifted to the right if (NSDecimalMaxDigit == result->length) { NSDecimalRound(result, result, NSDecimalMaxDigit - 1 - result->exponent, mode); } if (127 == result->exponent) { result->validNumber = NO; error = NSCalculationOverflow; } for (i = result->length-1; i >= 0; i--) { result->cMantissa[i+1] = result->cMantissa[i]; } result->cMantissa[0] = 1; result->length++; } } return error; } static NSCalculationError GSSimpleSubtract(NSDecimal *result, const NSDecimal *left, const NSDecimal *right, NSRoundingMode mode) { // left and right are both valid and positive, non-zero. The have been normalized and // left is bigger than right. result, left and right all point to different entities. // Result will not be compacted. NSCalculationError error = NSCalculationNoError; int i, j, l, d; int borrow = 0; j = left->length - right->length; NSDecimalCopy(result, left); l = right->length; // Now subtract all digits for (i = l-1; i >= 0; i--) { d = result->cMantissa[i + j] - right->cMantissa[i] - borrow; if (d < 0) { d = d + 10; borrow = 1; } else borrow = 0; result->cMantissa[i + j] = d; } if (borrow) { for (i = j-1; i >= 0; i--) { if (result->cMantissa[i] != 0) { result->cMantissa[i]--; break; } result->cMantissa[i] = 9; } if (-1 == i) { NSLog(@"Impossible error in subtraction left: %@, right: %@", NSDecimalString(left, nil), NSDecimalString(right, nil)); } } return error; } static NSCalculationError GSSimpleMultiply(NSDecimal *result, NSDecimal *l, NSDecimal *r, NSRoundingMode mode) { NSCalculationError error = NSCalculationNoError; NSCalculationError error1; int i, j, d, e; int carry = 0; NSDecimal n; int exp = 0; NSDecimalCopy(result, &zero); n.validNumber = YES; n.isNegative = NO; // if l->length = 38 round one off if (NSDecimalMaxDigit == l->length) { exp = -l->exponent; NSDecimalRound(l, l, -1-l->exponent, mode); // This might changed more than one exp += l->exponent; } // Do every digit of the second number for (i = 0; i < r->length; i++) { n.length = l->length+1; n.exponent = r->length - i - 1; carry = 0; d = r->cMantissa[i]; if (0 == d) continue; for (j = l->length-1; j >= 0; j--) { e = l->cMantissa[j] * d + carry; if (e >= 10) { carry = e / 10; e = e % 10; } else carry = 0; // This is one off to allow final carry n.cMantissa[j+1] = e; } n.cMantissa[0] = carry; NSDecimalCompact(&n); error1 = NSDecimalAdd(result, result, &n, mode); if (NSCalculationNoError != error1) error = error1; } if (result->exponent + exp > 127) { // This should almost never happen result->validNumber = NO; return NSCalculationOverflow; } result->exponent += exp; return error; } static NSCalculationError GSSimpleDivide(NSDecimal *result, const NSDecimal *l, const NSDecimal *r, NSRoundingMode mode) { NSCalculationError error = NSCalculationNoError; NSCalculationError error1; int k; int used; // How many digits of l have been used? NSDecimal n1; NSDecimalCopy(&n1, &zero); NSDecimalCopy(result, &zero); k = 0; used = 0; while ((k < l->length) || (n1.length)) { while (NSOrderedAscending == NSDecimalCompare(&n1, r)) { if (NSDecimalMaxDigit-1 == k) break; if (n1.exponent) { // Put back zeros removed by compacting n1.cMantissa[(NSInteger)n1.length] = 0; n1.length++; n1.exponent--; } else { if (used < l->length) { // Fill up with own digits if (n1.length || l->cMantissa[used]) { // only add 0 if there is already something n1.cMantissa[(NSInteger)n1.length] = l->cMantissa[used]; n1.length++; } used++; } else { if (-128 == result->exponent) { // use this as an end flag k = NSDecimalMaxDigit-1; break; } // Borrow one digit n1.cMantissa[(NSInteger)n1.length] = 0; n1.length++; result->exponent--; } k++; result->cMantissa[k-1] = 0; result->length++; } } if (NSDecimalMaxDigit-1 == k) { error = NSCalculationLossOfPrecision; break; } error1 = NSDecimalSubtract(&n1, &n1, r, mode); if (NSCalculationNoError != error1) error = error1; result->cMantissa[k-1]++; } return error; } GS_DECLARE NSString* NSDecimalString(const NSDecimal *decimal, NSDictionary *locale) { return GSDecimalString(decimal, locale); } // GNUstep extensions to make the implementation of NSDecimalNumber totaly // independent for NSDecimals internal representation GS_DECLARE double NSDecimalDouble(NSDecimal *number) { return GSDecimalDouble(number); } GS_DECLARE void NSDecimalFromComponents(NSDecimal *result, unsigned long long mantissa, short exponent, BOOL negative) { GSDecimalFromComponents(result, mantissa, exponent, negative); } GS_DECLARE void NSDecimalFromString(NSDecimal *result, NSString *numberValue, NSDictionary *locale) { GSDecimalFromString(result, numberValue, locale); } #endif gnustep-base-1.29.0/Source/NSDecimalNumber.m000066400000000000000000000535511435650067400206110ustar00rootroot00000000000000/** NSDecimalNumber class Copyright (C) 2000 Free Software Foundation, Inc. Written by: Fred Kiefer Created: July 2000 This file is part of the GNUstep Base Library. 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 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 USA. NSDecimalNumber class reference $Date$ $Revision$ */ #import "common.h" #include #define EXPOSE_NSDecimalNumber_IVARS 1 #define EXPOSE_NSDecimalNumberHandler_IVARS 1 #import "Foundation/NSCoder.h" #import "Foundation/NSDecimal.h" #import "Foundation/NSDecimalNumber.h" #import "Foundation/NSException.h" #import "Foundation/NSPortCoder.h" #import "GSPrivate.h" #ifdef fpclassify #define GSIsNAN(n) (fpclassify(n) == FP_NAN) #define GSIsInf(n) (fpclassify(n) == FP_INFINITE) #else #warning C99 macro fpclassify not found: Cannot determine NAN/Inf float-values #define GSIsNAN(n) (0) #define GSIsInf(n) (0) #endif // shared default behavior for NSDecimalNumber class static NSDecimalNumberHandler *handler; @implementation NSDecimalNumberHandler + (id) defaultDecimalNumberHandler { if (handler == nil) handler = [[self alloc] initWithRoundingMode: NSRoundPlain scale: 38 raiseOnExactness: NO raiseOnOverflow: YES raiseOnUnderflow: YES raiseOnDivideByZero: YES]; return handler; } + (id) decimalNumberHandlerWithRoundingMode: (NSRoundingMode)roundingMode scale: (short)scale raiseOnExactness: (BOOL)raiseOnExactness raiseOnOverflow: (BOOL)raiseOnOverflow raiseOnUnderflow: (BOOL)raiseOnUnderflow raiseOnDivideByZero: (BOOL)raiseOnDivideByZero { return AUTORELEASE([[self alloc] initWithRoundingMode: roundingMode scale: scale raiseOnExactness: raiseOnExactness raiseOnOverflow: raiseOnOverflow raiseOnUnderflow: raiseOnUnderflow raiseOnDivideByZero: raiseOnDivideByZero]); } - (id) initWithRoundingMode: (NSRoundingMode)roundingMode scale: (short)scale raiseOnExactness: (BOOL)raiseOnExactness raiseOnOverflow: (BOOL)raiseOnOverflow raiseOnUnderflow: (BOOL)raiseOnUnderflow raiseOnDivideByZero: (BOOL)raiseOnDivideByZero { _roundingMode = roundingMode; _scale = scale; _raiseOnExactness = raiseOnExactness; _raiseOnOverflow = raiseOnOverflow; _raiseOnUnderflow = raiseOnUnderflow; _raiseOnDivideByZero = raiseOnDivideByZero; return self; } - (NSDecimalNumber*) exceptionDuringOperation: (SEL)method error: (NSCalculationError)error leftOperand: (NSDecimalNumber*)leftOperand rightOperand: (NSDecimalNumber*)rightOperand { switch (error) { case NSCalculationNoError: return nil; case NSCalculationUnderflow: if (_raiseOnUnderflow) // FIXME: What exception to raise? [NSException raise: @"NSDecimalNumberException" format: @"Underflow"]; else return [NSDecimalNumber minimumDecimalNumber]; break; case NSCalculationOverflow: if (_raiseOnOverflow) [NSException raise: @"NSDecimalNumberException" format: @"Overflow"]; else return [NSDecimalNumber maximumDecimalNumber]; break; case NSCalculationLossOfPrecision: if (_raiseOnExactness) [NSException raise: @"NSDecimalNumberException" format: @"Loss of precision"]; else return nil; break; case NSCalculationDivideByZero: if (_raiseOnDivideByZero) [NSException raise: @"NSDecimalNumberException" format: @"Divide by zero"]; else return [NSDecimalNumber notANumber]; break; } return nil; } - (NSRoundingMode) roundingMode { return _roundingMode; } - (short) scale { return _scale; } @end @implementation NSDecimalNumber static Class NSDecimalNumberClass; static NSDecimalNumber *maxNumber; static NSDecimalNumber *minNumber; static NSDecimalNumber *notANumber; static NSDecimalNumber *zero; static NSDecimalNumber *one; + (void) initialize { /* Initialize d to an empty structure to avoid compiler warnings. * This also sets d.validNumber to NO ... which is what is actually needed. */ NSDecimal d = { 0 }; notANumber = [[self alloc] initWithDecimal: d]; [[NSObject leakAt: ¬ANumber] release]; NSDecimalMax(&d); maxNumber = [[self alloc] initWithDecimal: d]; [[NSObject leakAt: &maxNumber] release]; NSDecimalMin(&d); minNumber = [[self alloc] initWithDecimal: d]; [[NSObject leakAt: &minNumber] release]; zero = [[self alloc] initWithMantissa: 0 exponent: 0 isNegative: NO]; [[NSObject leakAt: &zero] release]; one = [[self alloc] initWithMantissa: 1 exponent: 0 isNegative: NO]; [[NSObject leakAt: &one] release]; NSDecimalNumberClass = [NSDecimalNumber class]; } + (id ) defaultBehavior { // Reuse the handler from the class NSDecimalNumberHandler return [NSDecimalNumberHandler defaultDecimalNumberHandler]; } + (void) setDefaultBehavior: (id )behavior { // Reuse the handler from the class NSDecimalNumberHandler // Might give interessting result on this class as behavior may came // from a different class ASSIGN(handler, (id)behavior); } + (NSDecimalNumber*) maximumDecimalNumber { return maxNumber; } + (NSDecimalNumber*) minimumDecimalNumber { return minNumber; } + (NSDecimalNumber*) notANumber { return notANumber; } + (NSDecimalNumber*) zero { return zero; } + (NSDecimalNumber*) one { return one; } + (NSDecimalNumber*) decimalNumberWithDecimal: (NSDecimal)decimal { return AUTORELEASE([[self alloc] initWithDecimal: decimal]); } + (NSDecimalNumber*) decimalNumberWithMantissa: (unsigned long long)mantissa exponent: (short)exponent isNegative: (BOOL)isNegative { return AUTORELEASE([[self alloc] initWithMantissa: mantissa exponent: exponent isNegative: isNegative]); } + (NSDecimalNumber*) decimalNumberWithString: (NSString*)numericString { return AUTORELEASE([[self alloc] initWithString: numericString]); } + (NSDecimalNumber*) decimalNumberWithString: (NSString*)numericString locale: (NSDictionary*)locale { return AUTORELEASE([[self alloc] initWithString: numericString locale: locale]); } /** * Inefficient ... quick hack by converting double value to string, * then initialising from string. */ - (id) initWithBytes: (const void*)value objCType: (const char*)type { unsigned long long val = 0ll; long long llval = 0ll; NSDecimal decimal; BOOL negative, llvalSet; if (strlen(type) != 1) { DESTROY(self); return nil; } llvalSet = YES; negative = NO; switch (*type) { case _C_CHR: { signed char v = *(signed char *)value; llval = (long long)v; break; } case _C_UCHR: { unsigned char v = *(unsigned char *)value; llval = (long long)v; break; } case _C_SHT: { short v = *(short *)value; llval = (long long)v; break; } case _C_USHT: { unsigned short v = *(unsigned short *)value; llval = (long long)v; break; } case _C_INT: { int v = *(int *)value; llval = (long long)v; break; } case _C_UINT: { unsigned int v = *(unsigned int *)value; llval = (long long)v; break; } case _C_LNG: { long v = *(long *)value; llval = (long long)v; break; } case _C_ULNG: { unsigned long v = *(unsigned long *)value; llval = (long long)v; break; } #if defined(_C_BOOL) && (!defined(__GNUC__) || __GNUC__ > 2) case _C_BOOL: { llval = (long long)((*(unsigned char *)value == 0) ? 0 : 1); break; } #endif #ifdef _C_LNGLNG case _C_LNGLNG: #else case 'q': #endif { long long v = *(long long *)value; llval = (long long)v; break; } #ifdef _C_ULNGLNG case _C_ULNGLNG: #else case 'Q': #endif default: { llvalSet = NO; break; } } if (llvalSet) { if (llval<0) { negative = YES; llval *= -1; } val = llval; } else { switch (*type) { case _C_FLT: /* FIXME: This is better implemented with GMP where available. */ { NSString *s; float v = *(float *)value; if (GSIsNAN(v)) { DESTROY(self); return RETAIN(notANumber); } if (GSIsInf(v)) { DESTROY(self); return (v < 0.0) ? RETAIN(minNumber) : RETAIN(maxNumber); } s = [[NSString alloc] initWithFormat: @"%g" locale: GSPrivateDefaultLocale(), (double)v]; self = [self initWithString: s]; RELEASE(s); return self; break; } case _C_DBL: /* FIXME: This is better implemented with GMP where available. */ { NSString *s; double v = *(double *)value; if (GSIsNAN(v)) { DESTROY(self); return RETAIN(notANumber); } if (GSIsInf(v)) { DESTROY(self); return (v < 0.0) ? RETAIN(minNumber) : RETAIN(maxNumber); } s = [[NSString alloc] initWithFormat: @"%g" locale: GSPrivateDefaultLocale(), v]; self = [self initWithString: s]; RELEASE(s); return self; break; } #ifdef _C_ULNGLNG case _C_ULNGLNG: #else case 'Q': #endif { val = *(unsigned long long *)value; break; } } } NSDecimalFromComponents(&decimal, val, 0, negative); return [self initWithDecimal: decimal]; } - (id) initWithDecimal: (NSDecimal)decimal { NSDecimalCopy(&data, &decimal); return self; } - (id) initWithMantissa: (unsigned long long)mantissa exponent: (short)exponent isNegative: (BOOL)flag { NSDecimal decimal; NSDecimalFromComponents(&decimal, mantissa, exponent, flag); return [self initWithDecimal: decimal]; } - (id) initWithString: (NSString*)numberValue { return [self initWithString: numberValue locale: GSPrivateDefaultLocale()]; } - (id) initWithString: (NSString*)numberValue locale: (NSDictionary*)locale { NSDecimal decimal; NSDecimalFromString(&decimal, numberValue, locale); return [self initWithDecimal: decimal]; } - (id) initWithBool: (BOOL)value { return [self initWithMantissa: (value == YES) ? 1 : 0 exponent: 0 isNegative: NO]; } - (id) initWithChar: (signed char)value { if (value < 0) { return [self initWithMantissa: -value exponent: 0 isNegative: YES]; } else { return [self initWithMantissa: value exponent: 0 isNegative: NO]; } } - (id) initWithDouble: (double)value { return [self initWithBytes: &value objCType: "d"]; } - (id) initWithFloat: (float)value { double d = (double)value; return [self initWithBytes: &d objCType: "d"]; } - (id) initWithInt: (int)value { if (value < 0) { return [self initWithMantissa: -value exponent: 0 isNegative: YES]; } else { return [self initWithMantissa: value exponent: 0 isNegative: NO]; } } - (id) initWithInteger: (NSInteger)value { if (value < 0) { return [self initWithMantissa: -value exponent: 0 isNegative: YES]; } else { return [self initWithMantissa: value exponent: 0 isNegative: NO]; } } - (id) initWithLong: (signed long)value { if (value < 0) { return [self initWithMantissa: -value exponent: 0 isNegative: YES]; } else { return [self initWithMantissa: value exponent: 0 isNegative: NO]; } } - (id) initWithLongLong: (signed long long)value { if (value < 0) { return [self initWithMantissa: -value exponent: 0 isNegative: YES]; } else { return [self initWithMantissa: value exponent: 0 isNegative: NO]; } } - (id) initWithShort: (signed short)value { if (value < 0) { return [self initWithMantissa: -value exponent: 0 isNegative: YES]; } else { return [self initWithMantissa: value exponent: 0 isNegative: NO]; } } - (id) initWithUnsignedChar: (unsigned char)value { return [self initWithMantissa: value exponent: 0 isNegative: NO]; } - (id) initWithUnsignedInt: (unsigned int)value { return [self initWithMantissa: value exponent: 0 isNegative: NO]; } - (id) initWithUnsignedInteger: (NSUInteger)value { return [self initWithMantissa: value exponent: 0 isNegative: NO]; } - (id) initWithUnsignedLong: (unsigned long)value { return [self initWithMantissa: value exponent: 0 isNegative: NO]; } - (id) initWithUnsignedLongLong: (unsigned long long)value { return [self initWithMantissa: value exponent: 0 isNegative: NO]; } - (id) initWithUnsignedShort: (unsigned short)value { return [self initWithMantissa: value exponent: 0 isNegative: NO]; } - (NSString*) descriptionWithLocale: (id)locale { return NSDecimalString(&data, locale); } - (const char*) objCType { return "d"; } - (NSDecimal) decimalValue { NSDecimal decimal; NSDecimalCopy(&decimal, &data); return decimal; } - (BOOL) boolValue { return NSDecimalDouble(&data) == 0.0 ? NO : YES; } - (double) doubleValue { return NSDecimalDouble(&data); } - (float) floatValue { return (float)NSDecimalDouble(&data); } - (signed char) charValue { return (char)NSDecimalDouble(&data); } - (int) intValue { return (int)NSDecimalDouble(&data); } - (NSInteger) integerValue { return (NSInteger)NSDecimalDouble(&data); } - (long) longValue { return (long)NSDecimalDouble(&data); } - (long long) longLongValue { return (long long)NSDecimalDouble(&data); } - (short) shortValue { return (short)NSDecimalDouble(&data); } - (unsigned char) unsignedCharValue { return (unsigned char)NSDecimalDouble(&data); } - (unsigned int) unsignedIntValue { return (unsigned int)NSDecimalDouble(&data); } - (NSUInteger) unsignedIntegerValue { return (NSUInteger)NSDecimalDouble(&data); } - (unsigned long) unsignedLongValue { return (unsigned long)NSDecimalDouble(&data); } - (unsigned long long) unsignedLongLongValue { return (unsigned long long)NSDecimalDouble(&data); } - (unsigned short) unsignedShortValue { return (unsigned short)NSDecimalDouble(&data); } /** * Get the approximate value of the decimal number into a buffer * as a double. */ - (void) getValue: (void*)buffer { double tmp = NSDecimalDouble(&data); memcpy(buffer, &tmp, sizeof(tmp)); } - (NSComparisonResult) compare: (NSNumber*)decimalNumber { if (self == decimalNumber) { return NSOrderedSame; } if (self == notANumber) { return NSOrderedAscending; // NaN is considered less than anything } if ([decimalNumber isKindOfClass: NSDecimalNumberClass]) { NSDecimal d1 = [self decimalValue]; NSDecimal d2 = [(NSDecimalNumber*)decimalNumber decimalValue]; return NSDecimalCompare(&d1, &d2); } else if ([decimalNumber isKindOfClass: [NSNumber class]]) { NSComparisonResult r = [decimalNumber compare: self]; if (r == NSOrderedAscending) { return NSOrderedDescending; } else if (r == NSOrderedDescending) { return NSOrderedAscending; } return NSOrderedSame; } else { return [super compare: decimalNumber]; } } - (NSDecimalNumber*) decimalNumberByAdding: (NSDecimalNumber*)decimalNumber { return [self decimalNumberByAdding: decimalNumber withBehavior: [[self class] defaultBehavior]]; } - (NSDecimalNumber*) decimalNumberByAdding: (NSDecimalNumber*)decimalNumber withBehavior: (id)behavior { NSDecimal result; NSDecimal d1 = [self decimalValue]; NSDecimal d2 = [decimalNumber decimalValue]; NSCalculationError error; NSDecimalNumber *res; error = NSDecimalAdd(&result, &d1, &d2, [behavior roundingMode]); if (error) { res = [behavior exceptionDuringOperation: _cmd error: error leftOperand: self rightOperand: decimalNumber]; if (res != nil) return res; } return [NSDecimalNumber decimalNumberWithDecimal: result]; } - (NSDecimalNumber*) decimalNumberBySubtracting: (NSDecimalNumber*)decimalNumber { return [self decimalNumberBySubtracting: decimalNumber withBehavior: [[self class] defaultBehavior]]; } - (NSDecimalNumber*) decimalNumberBySubtracting: (NSDecimalNumber*)decimalNumber withBehavior: (id )behavior { NSDecimal result; NSDecimal d1 = [self decimalValue]; NSDecimal d2 = [decimalNumber decimalValue]; NSCalculationError error; NSDecimalNumber *res; error = NSDecimalSubtract(&result, &d1, &d2, [behavior roundingMode]); if (error) { res = [behavior exceptionDuringOperation: _cmd error: error leftOperand: self rightOperand: decimalNumber]; if (res != nil) return res; } return [NSDecimalNumber decimalNumberWithDecimal: result]; } - (NSDecimalNumber*) decimalNumberByMultiplyingBy: (NSDecimalNumber*)decimalNumber { return [self decimalNumberByMultiplyingBy: decimalNumber withBehavior: [[self class] defaultBehavior]]; } - (NSDecimalNumber*) decimalNumberByMultiplyingBy: (NSDecimalNumber*)decimalNumber withBehavior: (id )behavior { NSDecimal result; NSDecimal d1 = [self decimalValue]; NSDecimal d2 = [decimalNumber decimalValue]; NSCalculationError error; NSDecimalNumber *res; error = NSDecimalMultiply(&result, &d1, &d2, [behavior roundingMode]); if (error) { res = [behavior exceptionDuringOperation: _cmd error: error leftOperand: self rightOperand: decimalNumber]; if (res != nil) return res; } return [NSDecimalNumber decimalNumberWithDecimal: result]; } - (NSDecimalNumber*) decimalNumberByDividingBy: (NSDecimalNumber*)decimalNumber { return [self decimalNumberByDividingBy: decimalNumber withBehavior: [[self class] defaultBehavior]]; } - (NSDecimalNumber*) decimalNumberByDividingBy: (NSDecimalNumber*)decimalNumber withBehavior: (id )behavior { NSDecimal result; NSDecimal d1 = [self decimalValue]; NSDecimal d2 = [decimalNumber decimalValue]; NSCalculationError error; NSDecimalNumber *res; error = NSDecimalDivide(&result, &d1, &d2, [behavior roundingMode]); if (error) { res = [behavior exceptionDuringOperation: _cmd error: error leftOperand: self rightOperand: decimalNumber]; if (res != nil) return res; } return [NSDecimalNumber decimalNumberWithDecimal: result]; } - (NSDecimalNumber*) decimalNumberByMultiplyingByPowerOf10: (short)power { return [self decimalNumberByMultiplyingByPowerOf10: power withBehavior: [[self class] defaultBehavior]]; } - (NSDecimalNumber*) decimalNumberByMultiplyingByPowerOf10: (short)power withBehavior: (id )behavior { NSDecimal result; NSDecimal d1 = [self decimalValue]; NSCalculationError error; NSDecimalNumber *res; error = NSDecimalMultiplyByPowerOf10(&result, &d1, power, [behavior roundingMode]); if (error) { res = [behavior exceptionDuringOperation: _cmd error: error leftOperand: self rightOperand: nil]; if (res != nil) return res; } return [NSDecimalNumber decimalNumberWithDecimal: result]; } - (NSDecimalNumber*) decimalNumberByRaisingToPower: (NSUInteger)power { return [self decimalNumberByRaisingToPower: power withBehavior: [[self class] defaultBehavior]]; } - (NSDecimalNumber*) decimalNumberByRaisingToPower: (NSUInteger)power withBehavior: (id )behavior { NSDecimal result; NSDecimal d1 = [self decimalValue]; NSCalculationError error; NSDecimalNumber *res; error = NSDecimalPower(&result, &d1, power, [behavior roundingMode]); if (error) { res = [behavior exceptionDuringOperation: _cmd error: error leftOperand: self rightOperand: nil]; if (res != nil) return res; } return [NSDecimalNumber decimalNumberWithDecimal: result]; } - (NSDecimalNumber*) decimalNumberByRoundingAccordingToBehavior: (id )behavior { NSDecimal result; NSDecimal d1 = [self decimalValue]; NSDecimalRound(&result, &d1, [behavior scale], [behavior roundingMode]); return [NSDecimalNumber decimalNumberWithDecimal: result]; } // Methods for NSDecimalNumberBehaviors - (NSDecimalNumber*) exceptionDuringOperation: (SEL)method error: (NSCalculationError)error leftOperand: (NSDecimalNumber*)leftOperand rightOperand: (NSDecimalNumber*)rightOperand { return [[[self class] defaultBehavior] exceptionDuringOperation: method error: error leftOperand: leftOperand rightOperand: rightOperand]; } - (NSRoundingMode) roundingMode { return [[[self class] defaultBehavior] roundingMode]; } - (short) scale { return [[[self class] defaultBehavior] scale]; } - (Class) classForCoder { return [NSDecimalNumber class]; } - (id) replacementObjectForPortCoder: (NSPortCoder*)aCoder { if ([aCoder isByref] == NO) return self; return [super replacementObjectForPortCoder: aCoder]; } - (void) encodeWithCoder: (NSCoder*)coder { NSString *s = [self descriptionWithLocale: nil]; [coder encodeObject: s]; } - (id) initWithCoder: (NSCoder*)coder { NSString *s = [coder decodeObject]; return [self initWithString: s locale: nil]; } @end @implementation NSNumber (NSDecimalNumber) /** Returns an NSDecimal representation of the number. Float and double values may not be converted exactly */ - (NSDecimal) decimalValue { double num; NSDecimalNumber *dnum; num = [self doubleValue]; dnum = AUTORELEASE([[NSDecimalNumber alloc] initWithBytes: &num objCType: "d"]); return [dnum decimalValue]; } @end gnustep-base-1.29.0/Source/NSDictionary.m000066400000000000000000001217441435650067400202070ustar00rootroot00000000000000/** NSDictionary - Dictionary object to store key/value pairs Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. Written by: Andrew Kachites McCallum From skeleton by: Adam Fedor Date: Mar 1995 This file is part of the GNUstep Base Library. 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 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 USA. NSDictionary class reference $Date$ $Revision$ */ #import "common.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSArray.h" #import "Foundation/NSOrderedSet.h" #import "Foundation/NSData.h" #import "Foundation/NSException.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSFileManager.h" #import "Foundation/NSCoder.h" #import "Foundation/NSLock.h" #import "Foundation/NSSet.h" #import "Foundation/NSValue.h" #import "Foundation/NSKeyValueCoding.h" #import "Foundation/NSUserDefaults.h" // For private method _decodeArrayOfObjectsForKey: #import "Foundation/NSKeyedArchiver.h" #import "GSPrivate.h" #import "GSFastEnumeration.h" #import "GSDispatch.h" static BOOL GSMacOSXCompatiblePropertyLists(void) { if (GSPrivateDefaultsFlag(NSWriteOldStylePropertyLists) == YES) return NO; return GSPrivateDefaultsFlag(GSMacOSXCompatible); } @class GSDictionary; @interface GSDictionary : NSObject // Help the compiler @end @class GSMutableDictionary; @interface GSMutableDictionary : NSObject // Help the compiler @end extern void GSPropertyListMake(id,NSDictionary*,BOOL,BOOL,unsigned,id*); static Class NSArray_class; static Class NSDictionaryClass; static Class NSMutableDictionaryClass; static Class GSDictionaryClass; static Class GSMutableDictionaryClass; static SEL eqSel; static SEL nxtSel; static SEL objSel; static SEL remSel; static SEL setSel; static SEL appSel; /** *

This class and its subclasses store key-value pairs, where the key and * the value are objects. A great many utility methods for working with * dictionaries are provided as part of this class, including the ability to * retrieve multiple entries simultaneously, obtain sorted contents, and * read/write from/to a serialized representation.

* *

The keys are copied and values are retained by the implementation, * and both are released when either their entry is dropped or the entire * dictionary is deallocated.
* As in the OS X implementation, keys must therefore implement the * [(NSCopying)] protocol. *

* *

Objects of this class are immutable. For a mutable version, use the * [NSMutableDictionary] subclass.

* *

The basic functionality in NSDictionary is similar to that * in Java's HashMap, and like that class it includes no locking * code and is not thread-safe. If the contents will be modified and * accessed from multiple threads you should enclose critical operations * within locks (see [NSLock]).

*/ @implementation NSDictionary + (void) initialize { if (self == [NSDictionary class]) { eqSel = @selector(isEqual:); nxtSel = @selector(nextObject); objSel = @selector(objectForKey:); remSel = @selector(removeObjectForKey:); setSel = @selector(setObject:forKey:); appSel = @selector(appendString:); NSArray_class = [NSArray class]; NSDictionaryClass = self; GSDictionaryClass = [GSDictionary class]; [NSMutableDictionary class]; } } + (id) allocWithZone: (NSZone*)z { if (self == NSDictionaryClass) { return NSAllocateObject(GSDictionaryClass, 0, z); } else { return NSAllocateObject(self, 0, z); } } /** * Returns a new copy of the receiver.
* The default abstract implementation of a copy is to use the * -initWithDictionary:copyItems: method with the flag set to YES.
* Immutable subclasses generally simply retain and return the receiver. */ - (id) copyWithZone: (NSZone*)z { NSDictionary *copy = [NSDictionaryClass allocWithZone: z]; return [copy initWithDictionary: self copyItems: NO]; } /** * Returns an unsigned integer which is the number of elements * stored in the dictionary. */ - (NSUInteger) count { [self subclassResponsibility: _cmd]; return 0; } - (void) enumerateKeysAndObjectsUsingBlock: (GSKeysAndObjectsEnumeratorBlock)aBlock { [self enumerateKeysAndObjectsWithOptions: 0 usingBlock: aBlock]; } - (void) enumerateKeysAndObjectsWithOptions: (NSEnumerationOptions)opts usingBlock: (GSKeysAndObjectsEnumeratorBlock)aBlock { /* * NOTE: According to the Cocoa documentation, NSEnumerationReverse is * undefined for NSDictionary. NSEnumerationConcurrent will be handled through * the GS_DISPATCH_* macros if libdispatch is available. */ id enumerator = [self keyEnumerator]; SEL objectForKeySelector = @selector(objectForKey:); IMP objectForKey = [self methodForSelector: objectForKeySelector]; BLOCK_SCOPE BOOL shouldStop = NO; id obj; GS_DISPATCH_CREATE_QUEUE_AND_GROUP_FOR_ENUMERATION(enumQueue, opts) FOR_IN(id, key, enumerator) obj = (*objectForKey)(self, objectForKeySelector, key); GS_DISPATCH_SUBMIT_BLOCK(enumQueueGroup, enumQueue, if (shouldStop == NO) {, }, aBlock, key, obj, &shouldStop); if (YES == shouldStop) { break; } END_FOR_IN(enumerator) GS_DISPATCH_TEARDOWN_QUEUE_AND_GROUP_FOR_ENUMERATION(enumQueue, opts) } /** *

In MacOS-X class clusters do not have designated initialisers, * and there is a general rule that -init is treated as the designated * initialiser of the class cluster, but that other intitialisers * may not work s expected an would need to be individually overridden * in any subclass. *

*

GNUstep tries to make it easier to subclass a class cluster, * by making class clusters follow the same convention as normal * classes, so the designated initialiser is the richest * initialiser. This means that all other initialisers call the * documented designated initialiser (which calls -init only for * MacOS-X compatibility), and anyone writing a subclass only needs * to override that one initialiser in order to have all the other * ones work. *

*

For MacOS-X compatibility, you may also need to override various * other initialisers. Exactly which ones, you will need to determine * by trial on a MacOS-X system ... and may vary between releases of * MacOS-X. So to be safe, on MacOS-X you probably need to re-implement * all the class cluster initialisers you might use in conjunction * with your subclass. *

*/ - (id) init { self = [super init]; return self; } /** * Initializes contents to the given objects and keys. * The two arrays must have the same size. * The n th element of the objects array is associated with the n th * element of the keys array.
* Calls -init (which does nothing but maintain MacOS-X compatibility), * and needs to be re-implemented in subclasses in order to have all * other initialisers work. */ - (id) initWithObjects: (const id[])objects forKeys: (const id [])keys count: (NSUInteger)count { self = [self init]; return self; } /** * Return an enumerator object containing all the keys of the dictionary. */ - (NSEnumerator*) keyEnumerator { return [self subclassResponsibility: _cmd]; } /** * Returns the object in the dictionary corresponding to aKey, or nil if * the key is not present. */ - (id) objectForKey: (id)aKey { return [self subclassResponsibility: _cmd]; } - (id) objectForKeyedSubscript: (id)aKey { return [self objectForKey: aKey]; } /** * Return an enumerator object containing all the objects of the dictionary. */ - (NSEnumerator*) objectEnumerator { return [self subclassResponsibility: _cmd]; } /** * Returns a new instance containing the same objects as * the receiver.
* The default implementation does this by calling the * -initWithDictionary:copyItems: method on a newly created object, * and passing it NO to tell it just to retain the items. */ - (id) mutableCopyWithZone: (NSZone*)z { NSMutableDictionary *copy = [NSMutableDictionaryClass allocWithZone: z]; return [copy initWithDictionary: self copyItems: NO]; } - (Class) classForCoder { return NSDictionaryClass; } - (void) encodeWithCoder: (NSCoder*)aCoder { unsigned count = [self count]; if ([aCoder allowsKeyedCoding]) { id key; unsigned i; if ([aCoder class] == [NSKeyedArchiver class]) { NSArray *keys = [self allKeys]; id objects = [NSMutableArray arrayWithCapacity: count]; for (i = 0; i < count; i++) { key = [keys objectAtIndex: i]; [objects addObject: [self objectForKey: key]]; } [(NSKeyedArchiver*)aCoder _encodeArrayOfObjects: keys forKey: @"NS.keys"]; [(NSKeyedArchiver*)aCoder _encodeArrayOfObjects: objects forKey: @"NS.objects"]; } else if (count > 0) { NSEnumerator *enumerator = [self keyEnumerator]; i = 0; while ((key = [enumerator nextObject]) != nil) { NSString *s; s = [NSString stringWithFormat: @"NS.key.%u", i]; [aCoder encodeObject: key forKey: s]; s = [NSString stringWithFormat: @"NS.object.%u", i]; [aCoder encodeObject: [self objectForKey: key] forKey: s]; i++; } } } else { [aCoder encodeValueOfObjCType: @encode(unsigned) at: &count]; if (count > 0) { NSEnumerator *enumerator = [self keyEnumerator]; id key; IMP enc; IMP nxt; IMP ofk; nxt = [enumerator methodForSelector: @selector(nextObject)]; enc = [aCoder methodForSelector: @selector(encodeObject:)]; ofk = [self methodForSelector: @selector(objectForKey:)]; while ((key = (*nxt)(enumerator, @selector(nextObject))) != nil) { id val = (*ofk)(self, @selector(objectForKey:), key); (*enc)(aCoder, @selector(encodeObject:), key); (*enc)(aCoder, @selector(encodeObject:), val); } } } } - (id) initWithCoder: (NSCoder*)aCoder { if ([aCoder allowsKeyedCoding]) { id keys = nil; id objects = nil; if ([aCoder containsValueForKey: @"NS.keys"]) { keys = [(NSKeyedUnarchiver*)aCoder _decodeArrayOfObjectsForKey: @"NS.keys"]; objects = [(NSKeyedUnarchiver*)aCoder _decodeArrayOfObjectsForKey: @"NS.objects"]; } else if ([aCoder containsValueForKey: @"dict.sortedKeys"]) { keys = [aCoder decodeObjectForKey: @"dict.sortedKeys"]; objects = [aCoder decodeObjectForKey: @"dict.values"]; } if (keys == nil) { unsigned i = 0; NSString *key; id val; keys = [NSMutableArray arrayWithCapacity: 2]; objects = [NSMutableArray arrayWithCapacity: 2]; key = [NSString stringWithFormat: @"NS.object.%u", i]; val = [(NSKeyedUnarchiver*)aCoder decodeObjectForKey: key]; while (val != nil) { [objects addObject: val]; key = [NSString stringWithFormat: @"NS.key.%u", i]; val = [(NSKeyedUnarchiver*)aCoder decodeObjectForKey: key]; [keys addObject: val]; i++; key = [NSString stringWithFormat: @"NS.object.%u", i]; val = [(NSKeyedUnarchiver*)aCoder decodeObjectForKey: key]; } } self = [self initWithObjects: objects forKeys: keys]; } else { unsigned count; [aCoder decodeValueOfObjCType: @encode(unsigned) at: &count]; if (count > 0) { id *keys = NSZoneMalloc(NSDefaultMallocZone(), sizeof(id)*count); id *vals = NSZoneMalloc(NSDefaultMallocZone(), sizeof(id)*count); unsigned i; IMP dec; dec = [aCoder methodForSelector: @selector(decodeObject)]; for (i = 0; i < count; i++) { keys[i] = (*dec)(aCoder, @selector(decodeObject)); vals[i] = (*dec)(aCoder, @selector(decodeObject)); } self = [self initWithObjects: vals forKeys: keys count: count]; NSZoneFree(NSDefaultMallocZone(), keys); NSZoneFree(NSDefaultMallocZone(), vals); } } return self; } /** * Returns a new autoreleased empty dictionary. */ + (id) dictionary { return AUTORELEASE([[self allocWithZone: NSDefaultMallocZone()] init]); } /** * Returns a newly created dictionary with the keys and objects * of otherDictionary. * (The keys and objects are not copied.) */ + (id) dictionaryWithDictionary: (NSDictionary*)otherDictionary { return AUTORELEASE([[self allocWithZone: NSDefaultMallocZone()] initWithDictionary: otherDictionary]); } /** * Returns a dictionary created using the given objects and keys. * The two arrays must have the same size. * The n th element of the objects array is associated with the n th * element of the keys array. */ + (id) dictionaryWithObjects: (const id[])objects forKeys: (const id [])keys count: (NSUInteger)count { return AUTORELEASE([[self allocWithZone: NSDefaultMallocZone()] initWithObjects: objects forKeys: keys count: count]); } - (NSUInteger) hash { return [self count]; } /** * Initialises a dictionary created using the given objects and keys. * The two arrays must have the same size. * The n th element of the objects array is associated with the n th * element of the keys array. */ - (id) initWithObjects: (NSArray*)objects forKeys: (NSArray*)keys { unsigned objectCount = [objects count]; if (objectCount != [keys count]) { [NSException raise: NSInvalidArgumentException format: @"init with obj and key arrays of different sizes"]; } else { GS_BEGINIDBUF(o, objectCount*2); if ([objects isProxy]) { unsigned i; for (i = 0; i < objectCount; i++) { o[i] = [objects objectAtIndex: i]; } } else { [objects getObjects: o]; } if ([keys isProxy]) { unsigned i; for (i = 0; i < objectCount; i++) { o[objectCount + i] = [keys objectAtIndex: i]; } } else { [keys getObjects: o + objectCount]; } self = [self initWithObjects: o forKeys: o + objectCount count: objectCount]; GS_ENDIDBUF(); } return self; } /** * Initialises a dictionary created using the list given as argument. * The list is alternately composed of objects and keys and * terminated by nil. Thus, the list's length must be even, * followed by nil. */ - (id) initWithObjectsAndKeys: (id)firstObject, ... { GS_USEIDPAIRLIST(firstObject, self = [self initWithObjects: __objects forKeys: __pairs count: __count/2]); return self; } /** * Returns a dictionary created using the list given as argument. * The list is alternately composed of objects and keys and * terminated by nil. Thus, the list's length must be even, * followed by nil. */ + (id) dictionaryWithObjectsAndKeys: (id)firstObject, ... { id o = [self allocWithZone: NSDefaultMallocZone()]; GS_USEIDPAIRLIST(firstObject, o = [o initWithObjects: __objects forKeys: __pairs count: __count/2]); return AUTORELEASE(o); } /** * Returns a dictionary created using the given objects and keys. * The two arrays must have the same length. * The n th element of the objects array is associated with the n th * element of the keys array. */ + (id) dictionaryWithObjects: (NSArray*)objects forKeys: (NSArray*)keys { return AUTORELEASE([[self allocWithZone: NSDefaultMallocZone()] initWithObjects: objects forKeys: keys]); } /** * Returns a dictionary containing only one object which is associated * with a key. */ + (id) dictionaryWithObject: (id)object forKey: (id)key { return AUTORELEASE([[self allocWithZone: NSDefaultMallocZone()] initWithObjects: &object forKeys: &key count: 1]); } /** * Initializes with the keys and objects of otherDictionary. * (The keys and objects are not copied.) */ - (id) initWithDictionary: (NSDictionary*)otherDictionary { return [self initWithDictionary: otherDictionary copyItems: NO]; } /** * Initialise dictionary with the keys and values of otherDictionary. * If the shouldCopy flag is YES then the values are copied into the * newly initialised dictionary, otherwise they are simply retained, * on the assumption that it is safe to retain the keys from another * dictionary since that other dictionary mwill have copied the keys * originally to ensure that they are immutable. */ - (id) initWithDictionary: (NSDictionary*)other copyItems: (BOOL)shouldCopy { unsigned c = [other count]; if (c > 0) { id k; NSEnumerator *e = [other keyEnumerator]; unsigned i = 0; IMP nxtObj = [e methodForSelector: nxtSel]; IMP otherObj = [other methodForSelector: objSel]; GS_BEGINIDBUF(o, c*2); if (shouldCopy) { NSZone *z = [self zone]; while ((k = (*nxtObj)(e, nxtSel)) != nil) { o[i] = k; o[c + i] = [(*otherObj)(other, objSel, k) copyWithZone: z]; i++; } self = [self initWithObjects: o + c forKeys: o count: i]; while (i-- > 0) { [o[c + i] release]; } } else { while ((k = (*nxtObj)(e, nxtSel)) != nil) { o[i] = k; o[c + i] = (*otherObj)(other, objSel, k); i++; } self = [self initWithObjects: o + c forKeys: o count: c]; } GS_ENDIDBUF(); } return self; } /** *

Initialises the dictionary with the contents of the specified file, * which must contain a dictionary in property-list format. *

*

In GNUstep, the property-list format may be either the OpenStep * format (ASCII data), or the MacOS-X format (UTF-8 XML data) ... this * method will recognise which it is. *

*

If there is a failure to load the file for any reason, the receiver * will be released and the method will return nil. *

*

Works by invoking [NSString-initWithContentsOfFile:] and * [NSString-propertyList] then checking that the result is a dictionary. *

*/ - (id) initWithContentsOfFile: (NSString*)path { NSString *myString; myString = [[NSString allocWithZone: NSDefaultMallocZone()] initWithContentsOfFile: path]; if (myString == nil) { DESTROY(self); } else { id result; NS_DURING { result = [myString propertyList]; } NS_HANDLER { result = nil; } NS_ENDHANDLER RELEASE(myString); if ([result isKindOfClass: NSDictionaryClass]) { self = [self initWithDictionary: result]; } else { NSWarnMLog(@"Contents of file '%@' does not contain a dictionary", path); DESTROY(self); } } return self; } /** *

Initialises the dictionary with the contents of the specified URL, * which must contain a dictionary in property-list format. *

*

In GNUstep, the property-list format may be either the OpenStep * format (ASCII data), or the MacOS-X format (UTF-8 XML data) ... this * method will recognise which it is. *

*

If there is a failure to load the URL for any reason, the receiver * will be released and the method will return nil. *

*

Works by invoking [NSString-initWithContentsOfURL:] and * [NSString-propertyList] then checking that the result is a dictionary. *

*/ - (id) initWithContentsOfURL: (NSURL*)aURL { NSString *myString; myString = [[NSString allocWithZone: NSDefaultMallocZone()] initWithContentsOfURL: aURL]; if (myString == nil) { DESTROY(self); } else { id result; NS_DURING { result = [myString propertyList]; } NS_HANDLER { result = nil; } NS_ENDHANDLER RELEASE(myString); if ([result isKindOfClass: NSDictionaryClass]) { self = [self initWithDictionary: result]; } else { NSWarnMLog(@"Contents of URL '%@' does not contain a dictionary", aURL); DESTROY(self); } } return self; } /** * Returns a dictionary using the file located at path. * The file must be a property list containing a dictionary as its root object. */ + (id) dictionaryWithContentsOfFile: (NSString*)path { return AUTORELEASE([[self allocWithZone: NSDefaultMallocZone()] initWithContentsOfFile: path]); } /** * Returns a dictionary using the contents of aURL. * The URL must be a property list containing a dictionary as its root object. */ + (id) dictionaryWithContentsOfURL: (NSURL*)aURL { return AUTORELEASE([[self allocWithZone: NSDefaultMallocZone()] initWithContentsOfURL: aURL]); } - (BOOL) isEqual: other { if (other == self) return YES; if ([other isKindOfClass: NSDictionaryClass]) return [self isEqualToDictionary: other]; return NO; } /** * Two dictionaries are equal if they each hold the same number of * entries, each key in one isEqual to a key in the other, * and, for a given key, the corresponding value objects also satisfy * isEqual. */ - (BOOL) isEqualToDictionary: (NSDictionary*)other { unsigned count; if (other == self) { return YES; } count = [self count]; if (count == [other count]) { if (count > 0) { NSEnumerator *e = [self keyEnumerator]; IMP nxtObj = [e methodForSelector: nxtSel]; IMP myObj = [self methodForSelector: objSel]; IMP otherObj = [other methodForSelector: objSel]; id k; while ((k = (*nxtObj)(e, @selector(nextObject))) != nil) { id o1 = (*myObj)(self, objSel, k); id o2 = (*otherObj)(other, objSel, k); if (o1 == o2) continue; if ([o1 isEqual: o2] == NO) return NO; } } return YES; } return NO; } /** * Returns an array containing all the dictionary's keys. */ - (NSArray*) allKeys { unsigned c = [self count]; if (c == 0) { return [NSArray_class array]; } else { NSEnumerator *e = [self keyEnumerator]; IMP nxtObj = [e methodForSelector: nxtSel]; unsigned i; id result; GS_BEGINIDBUF(k, c); for (i = 0; i < c; i++) { k[i] = (*nxtObj)(e, nxtSel); NSAssert (k[i], NSInternalInconsistencyException); } result = [[NSArray_class allocWithZone: NSDefaultMallocZone()] initWithObjects: k count: c]; GS_ENDIDBUF(); return AUTORELEASE(result); } } /** * Returns an array containing all the dictionary's objects. */ - (NSArray*) allValues { unsigned c = [self count]; if (c == 0) { return [NSArray_class array]; } else { NSEnumerator *e = [self objectEnumerator]; IMP nxtObj = [e methodForSelector: nxtSel]; id result; unsigned i; GS_BEGINIDBUF(k, c); for (i = 0; i < c; i++) { k[i] = (*nxtObj)(e, nxtSel); } result = [[NSArray_class allocWithZone: NSDefaultMallocZone()] initWithObjects: k count: c]; GS_ENDIDBUF(); return AUTORELEASE(result); } } - (void) getObjects: (__unsafe_unretained id[])objects andKeys: (__unsafe_unretained id[])keys { NSUInteger i = 0; FOR_IN(id, key, self) if (keys != NULL) keys[i] = key; if (objects != NULL) objects[i] = [self objectForKey: key]; i++; END_FOR_IN(self) } /** * Returns an array containing all the dictionary's keys that are * associated with anObject. */ - (NSArray*) allKeysForObject: (id)anObject { unsigned c; if (anObject == nil || (c = [self count]) == 0) { return nil; } else { NSEnumerator *e = [self keyEnumerator]; IMP nxtObj = [e methodForSelector: nxtSel]; IMP myObj = [self methodForSelector: objSel]; BOOL (*eqObj)(id, SEL, id); id k; id result; GS_BEGINIDBUF(a, [self count]); eqObj = (BOOL (*)(id, SEL, id))[anObject methodForSelector: eqSel]; c = 0; while ((k = (*nxtObj)(e, nxtSel)) != nil) { id o = (*myObj)(self, objSel, k); if (o == anObject || (*eqObj)(anObject, eqSel, o)) { a[c++] = k; } } if (c == 0) { result = nil; } else { result = [[NSArray_class allocWithZone: NSDefaultMallocZone()] initWithObjects: a count: c]; } GS_ENDIDBUF(); return AUTORELEASE(result); } } struct foo { NSDictionary *d; SEL s; IMP i; }; static NSInteger compareIt(id o1, id o2, void* context) { struct foo *f = (struct foo*)context; o1 = (*f->i)(f->d, @selector(objectForKey:), o1); o2 = (*f->i)(f->d, @selector(objectForKey:), o2); return (NSInteger)(intptr_t)[o1 performSelector: f->s withObject: o2]; } /** * Returns ordered array of the keys sorted according to the values they * correspond to. To sort the values, a message with selector comp is * send to each value with another value as argument, as in * [a comp: b]. The comp method should return * NSOrderedSame, NSOrderedAscending, or * NSOrderedDescending as appropriate. */ - (NSArray*) keysSortedByValueUsingSelector: (SEL)comp { struct foo info; id k; info.d = self; info.s = comp; info.i = [self methodForSelector: objSel]; k = [[self allKeys] sortedArrayUsingFunction: compareIt context: &info]; return k; } - (NSArray *) keysSortedByValueUsingComparator: (NSComparator)cmptr { return [self keysSortedByValueWithOptions: 0 usingComparator: cmptr]; } - (NSArray *) keysSortedByValueWithOptions: (NSSortOptions)opts usingComparator: (NSComparator)cmptr { NSArray *sortedValues; NSArray *noDuplicates; NSMutableArray *result; ENTER_POOL sortedValues = [[self allValues] sortedArrayWithOptions: opts usingComparator: cmptr]; noDuplicates = [[NSOrderedSet orderedSetWithArray: sortedValues] array]; result = [[NSMutableArray alloc] initWithCapacity: [sortedValues count]]; FOR_IN(NSObject*, value, noDuplicates) [result addObjectsFromArray: [self allKeysForObject: value]]; END_FOR_IN(noDuplicates) LEAVE_POOL return AUTORELEASE(result); } /** * Multiple version of [-objectForKey:]. Objects for each key in keys are * looked up and placed into return array in same order. For each key that * has no corresponding value in this dictionary, marker is put into the * array in its place. */ - (NSArray*) objectsForKeys: (NSArray*)keys notFoundMarker: (id)marker { unsigned c = [keys count]; if (c == 0) { return [NSArray_class array]; } else { unsigned i; IMP myObj = [self methodForSelector: objSel]; id result; GS_BEGINIDBUF(obuf, c); if ([keys isProxy]) { for (i = 0; i < c; i++) { obuf[i] = [keys objectAtIndex: i]; } } else { [keys getObjects: obuf]; } for (i = 0; i < c; i++) { id o = (*myObj)(self, objSel, obuf[i]); if (o == nil) { obuf[i] = marker; } else { obuf[i] = o; } } result = [[NSArray_class allocWithZone: NSDefaultMallocZone()] initWithObjects: obuf count: c]; GS_ENDIDBUF(); return AUTORELEASE(result); } } - (NSSet*) keysOfEntriesWithOptions: (NSEnumerationOptions)opts passingTest: (GSKeysAndObjectsPredicateBlock)aPredicate { /* * See -enumerateKeysAndObjectsWithOptions:usingBlock: for note about * NSEnumerationOptions. */ id enumerator = [self keyEnumerator]; SEL objectForKeySelector = @selector(objectForKey:); IMP objectForKey = [self methodForSelector: objectForKeySelector]; BLOCK_SCOPE BOOL shouldStop = NO; NSMutableSet *buildSet = [NSMutableSet new]; SEL addObjectSelector = @selector(addObject:); IMP addObject = [buildSet methodForSelector: addObjectSelector]; NSSet *resultSet = nil; id obj = nil; BLOCK_SCOPE NSLock *setLock = nil; if (opts & NSEnumerationConcurrent) { setLock = [NSLock new]; } GS_DISPATCH_CREATE_QUEUE_AND_GROUP_FOR_ENUMERATION(enumQueue, opts) FOR_IN(id, key, enumerator) obj = (*objectForKey)(self, objectForKeySelector, key); #if (__has_feature(blocks) && (GS_USE_LIBDISPATCH == 1)) if (enumQueue != NULL) { dispatch_group_async(enumQueueGroup, enumQueue, ^(void){ if (shouldStop) { return; } if (aPredicate(key, obj, &shouldStop)) { [setLock lock]; addObject(buildSet, addObjectSelector, key); [setLock unlock]; } }); } else // call block directly #endif if (CALL_NON_NULL_BLOCK(aPredicate, key, obj, &shouldStop)) { addObject(buildSet, addObjectSelector, key); } if (shouldStop) { break; } END_FOR_IN(enumerator) GS_DISPATCH_TEARDOWN_QUEUE_AND_GROUP_FOR_ENUMERATION(enumQueue, opts) [setLock release]; resultSet = [NSSet setWithSet: buildSet]; [buildSet release]; return resultSet; } - (NSSet*) keysOfEntriesPassingTest: (GSKeysAndObjectsPredicateBlock)aPredicate { return [self keysOfEntriesWithOptions: 0 passingTest: aPredicate]; } /** *

Writes the contents of the dictionary to the file specified by path. * The file contents will be in property-list format ... under GNUstep * this is either OpenStep style (ASCII characters using \U hexadecimal * escape sequences for unicode), or MacOS-X style (XML in the UTF8 * character set). *

*

If the useAuxiliaryFile flag is YES, the file write operation is * atomic ... the data is written to a temporary file, which is then * renamed to the actual file name. *

*

If the conversion of data into the correct property-list format fails * or the write operation fails, the method returns NO, otherwise it * returns YES. *

*

NB. The fact that the file is in property-list format does not * necessarily mean that it can be used to reconstruct the dictionary using * the -initWithContentsOfFile: method. If the original dictionary contains * non-property-list objects, the descriptions of those objects will * have been written, and reading in the file as a property-list will * result in a new dictionary containing the string descriptions. *

*/ - (BOOL) writeToFile: (NSString *)path atomically: (BOOL)useAuxiliaryFile { NSDictionary *loc; NSString *desc = nil; NSData *data; loc = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]; if (GSMacOSXCompatiblePropertyLists() == YES) { GSPropertyListMake(self, loc, YES, NO, 2, &desc); data = [desc dataUsingEncoding: NSUTF8StringEncoding]; } else { GSPropertyListMake(self, loc, NO, NO, 2, &desc); data = [desc dataUsingEncoding: NSASCIIStringEncoding]; } return [data writeToFile: path atomically: useAuxiliaryFile]; } /** *

Writes the contents of the dictionary to the specified url. * This functions just like -writeToFile:atomically: except that the * output may be written to any URL, not just a local file. *

*/ - (BOOL) writeToURL: (NSURL *)url atomically: (BOOL)useAuxiliaryFile { NSDictionary *loc; NSString *desc = nil; NSData *data; loc = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]; if (GSMacOSXCompatiblePropertyLists() == YES) { GSPropertyListMake(self, loc, YES, NO, 2, &desc); data = [desc dataUsingEncoding: NSUTF8StringEncoding]; } else { GSPropertyListMake(self, loc, NO, NO, 2, &desc); data = [desc dataUsingEncoding: NSASCIIStringEncoding]; } return [data writeToURL: url atomically: useAuxiliaryFile]; } /** * Returns the result of invoking -descriptionWithLocale:indent: with a nil * locale and zero indent. */ - (NSString*) description { return [self descriptionWithLocale: nil indent: 0]; } /** * Returns the receiver as a text property list strings file format.
* See [NSString-propertyListFromStringsFileFormat] for details.
* The order of the items is undefined. */ - (NSString*) descriptionInStringsFileFormat { NSMutableString *result = nil; NSEnumerator *enumerator = [self keyEnumerator]; IMP nxtObj = [enumerator methodForSelector: nxtSel]; IMP myObj = [self methodForSelector: objSel]; id key; while ((key = (*nxtObj)(enumerator, nxtSel)) != nil) { id val = (*myObj)(self, objSel, key); GSPropertyListMake(key, nil, NO, YES, 0, &result); if (val != nil && [val isEqualToString: @""] == NO) { [result appendString: @" = "]; GSPropertyListMake(val, nil, NO, YES, 0, &result); } [result appendString: @";\n"]; } return result; } /** * Returns the result of invoking -descriptionWithLocale:indent: with * a zero indent. */ - (NSString*) descriptionWithLocale: (id)locale { return [self descriptionWithLocale: locale indent: 0]; } /** * Returns the receiver as a text property list in the traditional format.
* See [NSString-propertyList] for details.
* If locale is nil, no formatting is done, otherwise entries are formatted * according to the locale, and indented according to level.
* Unless locale is nil, a level of zero indents items by four spaces, * while a level of one indents them by a tab.
* If the keys in the dictionary respond to [NSObject-compare:], the items are * listed by key in ascending order. If not, the order in which the * items are listed is undefined. */ - (NSString*) descriptionWithLocale: (id)locale indent: (NSUInteger)level { NSMutableString *result = nil; GSPropertyListMake(self, locale, NO, YES, level == 1 ? 3 : 2, &result); return result; } /** * Default implementation for this class is to return the value stored in * the dictionary under the specified key, or nil if there is no value.
* However, if the key begins with '@' that character is stripped from * it and the superclass implementation of the method is used. */ - (id) valueForKey: (NSString*)key { id o; if ([key isKindOfClass: [NSString class]] && [key hasPrefix: @"@"]) { o = [super valueForKey: [key substringFromIndex: 1]]; } else { o = [self objectForKey: key]; } return o; } - (NSUInteger) countByEnumeratingWithState: (NSFastEnumerationState*)state objects: (__unsafe_unretained id[])stackbuf count: (NSUInteger)len { [self subclassResponsibility: _cmd]; return 0; } @end /** * Mutable version of [NSDictionary]. */ @implementation NSMutableDictionary + (void) initialize { if (self == [NSMutableDictionary class]) { NSMutableDictionaryClass = self; GSMutableDictionaryClass = [GSMutableDictionary class]; } } + (id) allocWithZone: (NSZone*)z { if (self == NSMutableDictionaryClass) { return NSAllocateObject(GSMutableDictionaryClass, 0, z); } else { return NSAllocateObject(self, 0, z); } } - (id) copyWithZone: (NSZone*)z { /* a deep copy */ unsigned count = [self count]; NSDictionary *newDictionary; unsigned i; id key; NSEnumerator *enumerator = [self keyEnumerator]; IMP nxtImp = [enumerator methodForSelector: nxtSel]; IMP objImp = [self methodForSelector: objSel]; GS_BEGINIDBUF(o, count*2); for (i = 0; (key = (*nxtImp)(enumerator, nxtSel)); i++) { o[i] = key; o[count + i] = (*objImp)(self, objSel, key); o[count + i] = [o[count + i] copyWithZone: z]; } newDictionary = [[GSDictionaryClass allocWithZone: z] initWithObjects: o + count forKeys: o count: count]; while (i-- > 0) { [o[count + i] release]; } GS_ENDIDBUF(); return newDictionary; } - (Class) classForCoder { return NSMutableDictionaryClass; } /** * Initializes an empty dictionary with memory preallocated for given number * of entries. Although memory space will be grown as needed when entries * are added, this can avoid the reallocate-and-copy process if the size of * the ultimate contents is known in advance.
* Calls -init (which does nothing but maintain MacOS-X compatibility), * and needs to be re-implemented in subclasses in order to have all * other initialisers work. */ - (id) initWithCapacity: (NSUInteger)numItems { self = [self init]; return self; } /** * Adds entry for aKey, mapping to anObject. If either is nil, an exception * is raised. If aKey already in dictionary, the value it maps to is * silently replaced. The value anObject is retained, but aKey is copied * (because a dictionary key must be immutable) and must therefore implement * the [(NSCopying)] protocol.) */ - (void) setObject: anObject forKey: (id)aKey { [self subclassResponsibility: _cmd]; } - (void) setObject: (id)anObject forKeyedSubscript: (id)aKey { if (anObject == nil) { [self removeObjectForKey: aKey]; } else { [self setObject: anObject forKey: aKey]; } } /** * Remove key-value mapping for given key aKey. No error if there is no * mapping for the key. A warning will be generated if aKey is nil. */ - (void) removeObjectForKey: (id)aKey { [self subclassResponsibility: _cmd]; } /** * Returns an empty dictionary with memory preallocated for given number of * entries. Although memory space will be grown as needed when entries are * added, this can avoid the reallocate-and-copy process if the size of the * ultimate contents is known in advance. */ + (id) dictionaryWithCapacity: (NSUInteger)numItems { return AUTORELEASE([[self allocWithZone: NSDefaultMallocZone()] initWithCapacity: numItems]); } /* Override superclass's designated initializer */ /** * Initializes contents to the given objects and keys. * The two arrays must have the same size. * The n th element of the objects array is associated with the n th * element of the keys array. */ - (id) initWithObjects: (const id[])objects forKeys: (const id [])keys count: (NSUInteger)count { self = [self initWithCapacity: count]; if (self != nil) { IMP setObj; setObj = [self methodForSelector: setSel]; while (count--) { (*setObj)(self, setSel, objects[count], keys[count]); } } return self; } /** * Clears out this dictionary by removing all entries. */ - (void) removeAllObjects { id k; NSEnumerator *e = [self keyEnumerator]; IMP nxtObj = [e methodForSelector: nxtSel]; IMP remObj = [self methodForSelector: remSel]; while ((k = (*nxtObj)(e, nxtSel)) != nil) { (*remObj)(self, remSel, k); } } /** * Remove entries specified by the given keyArray. No error is generated if * no mapping exists for a key or one is nil, although a console warning is * produced in the latter case. */ - (void) removeObjectsForKeys: (NSArray*)keyArray { unsigned c = [keyArray count]; if (c > 0) { IMP remObj = [self methodForSelector: remSel]; GS_BEGINIDBUF(keys, c); if ([keyArray isProxy]) { unsigned i; for (i = 0; i < c; i++) { keys[i] = [keyArray objectAtIndex: i]; } } else { [keyArray getObjects: keys]; } while (c--) { (*remObj)(self, remSel, keys[c]); } GS_ENDIDBUF(); } } /** * Merges information from otherDictionary into the receiver. * If a key exists in both dictionaries, the value from otherDictionary * replaces that which was originally in the receiver. */ - (void) addEntriesFromDictionary: (NSDictionary*)otherDictionary { if (otherDictionary != nil && otherDictionary != self) { id k; NSEnumerator *e = [otherDictionary keyEnumerator]; IMP nxtObj = [e methodForSelector: nxtSel]; IMP getObj = [otherDictionary methodForSelector: objSel]; IMP setObj = [self methodForSelector: setSel]; while ((k = (*nxtObj)(e, nxtSel)) != nil) { (*setObj)(self, setSel, (*getObj)(otherDictionary, objSel, k), k); } } } /** * Remove all entries, then add all entries from otherDictionary. */ - (void) setDictionary: (NSDictionary*)otherDictionary { [self removeAllObjects]; [self addEntriesFromDictionary: otherDictionary]; } /** * Default implementation for this class is equivalent to the * -setObject:forKey: method unless value is nil, in which case * it is equivalent to -removeObjectForKey: */ - (void) takeStoredValue: (id)value forKey: (NSString*)key { if (value == nil) { [self removeObjectForKey: key]; } else { [self setObject: value forKey: key]; } } /** * Default implementation for this class is equivalent to the * -setObject:forKey: method unless value is nil, in which case * it is equivalent to -removeObjectForKey: */ - (void) takeValue: (id)value forKey: (NSString*)key { if (value == nil) { [self removeObjectForKey: key]; } else { [self setObject: value forKey: key]; } } /** * Default implementation for this class is equivalent to the * -setObject:forKey: method unless value is nil, in which case * it is equivalent to -removeObjectForKey: */ - (void) setValue: (id)value forKey: (NSString*)key { if (value == nil) { [self removeObjectForKey: key]; } else { [self setObject: value forKey: key]; } } @end gnustep-base-1.29.0/Source/NSDistantObject.m000066400000000000000000000652451435650067400206420ustar00rootroot00000000000000/** Implementation for GNU Objective-C version of NSDistantObject Copyright (C) 1997 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Based on code by: Andrew Kachites McCallum Created: August 1997 This file is part of the GNUstep Base Library. 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 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 USA. NSDistantObject class reference $Date$ $Revision$ */ #import "common.h" #define EXPOSE_NSDistantObject_IVARS 1 #import "GNUstepBase/DistributedObjects.h" #import "GNUstepBase/GSObjCRuntime.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSLock.h" #import "Foundation/NSPort.h" #import "Foundation/NSMethodSignature.h" #import "Foundation/NSException.h" #import "Foundation/NSHashTable.h" #import "Foundation/NSInvocation.h" #include #import "GSInvocation.h" @interface NSDistantObject(GNUstepExtensions) - (Class) classForPortCoder; - (void) finalize; @end #define DO_FORWARD_INVOCATION(_SELX, _ARG1) ({ \ sig = [self methodSignatureForSelector: @selector(_SELX)]; \ if (sig != nil) \ { \ inv = [NSInvocation invocationWithMethodSignature: sig]; \ [inv setSelector: @selector(_SELX)]; \ [inv setTarget: self]; \ [inv setArgument: (void*)&_ARG1 atIndex: 2]; \ [self forwardInvocation: inv]; \ [inv getReturnValue: &m]; \ } \ else \ { \ NSWarnLog(@"DO_FORWARD_INVOCATION failed, got nil signature for '%@'.", \ NSStringFromSelector(@selector(_SELX))); \ }}) static int debug_proxy = 0; static Class placeHolder = 0; static Class distantObjectClass = 0; #ifndef __GNUSTEP_RUNTIME__ @interface Object (NSConformsToProtocolNamed) - (BOOL) _conformsToProtocolNamed: (const char*)aName; @end #endif @interface NSObject (NSConformsToProtocolNamed) - (BOOL) _conformsToProtocolNamed: (const char*)aName; @end /* * Evil hack ... if a remote system wants to know if we conform * to a protocol we use a local protocol with the same name. */ #ifndef __GNUSTEP_RUNTIME__ @interface Object (conformsTo) - (BOOL) conformsTo: (Protocol*)p; @end @implementation Object (NSConformsToProtocolNamed) - (BOOL) _conformsToProtocolNamed: (const char*)aName { Protocol *p; p = objc_getProtocol(aName); return [(id)self conformsTo: p]; } @end #endif @implementation NSObject (NSConformsToProtocolNamed) - (BOOL) _conformsToProtocolNamed: (const char*)aName { Protocol *p; p = objc_getProtocol(aName); return [self conformsToProtocol: p]; } @end @interface NSConnection (DistantObjectHacks) - (void) acquireProxyForTarget: (unsigned)target; - (NSDistantObject*) retainOrAddLocal: (NSDistantObject*)aProxy forObject: (id)anObject; - (NSDistantObject*) retainOrAddProxy: (NSDistantObject*)aProxy forTarget: (unsigned)aTarget; - (void) removeProxy: (id)obj; - (void) vendLocal: (NSDistantObject*)aProxy; @end /* This is the proxy tag; it indicates where the local object is, and determines whether the reply port to the Connection-where-the- proxy-is-local needs to encoded/decoded or not. */ enum proxyLocation { PROXY_LOCAL_FOR_RECEIVER = 0, PROXY_LOCAL_FOR_SENDER, PROXY_REMOTE_FOR_BOTH }; /* * The GSDistantObjectPlaceHolder class is simply used as a placeholder * for an NSDistantObject so we can manage efficient allocation and * initialisation - in most cases when we ask for an NSDistantObject * instance, we will get a pre-existing one, so we don't want to go * allocating the memory for a new instance unless absolutely necessary. */ GS_ROOT_CLASS @interface GSDistantObjectPlaceHolder + (id) initWithCoder: (NSCoder*)aCoder; + (id) initWithLocal: (id)anObject connection: (NSConnection*)aConnection; + (id) initWithTarget: (unsigned)target connection: (NSConnection*)aConnection; + (id) autorelease; + (void) release; + (id) retain; + (BOOL) respondsToSelector: (SEL)sel; @end @implementation GSDistantObjectPlaceHolder + (id) autorelease { return self; } + (void) release { } + (id) retain { return self; } + (void) initialize { if (self == objc_lookUpClass("GSDistantObjectPlaceHolder")) { distantObjectClass = [NSDistantObject class]; } } + (BOOL) respondsToSelector: (SEL)sel { return class_getClassMethod(self, sel) != NULL; } + (id) initWithCoder: (NSCoder*)aCoder { uint8_t proxy_tag; unsigned target; id decoder_connection; NSDistantObject *o; /* if ([aCoder isKindOfClass: [NSPortCoder class]] == NO) { [NSException raise: NSGenericException format: @"NSDistantObject objects only decode with " @"NSPortCoder class"]; } */ decoder_connection = [(NSPortCoder*)aCoder connection]; NSAssert(decoder_connection, NSInternalInconsistencyException); /* First get the tag, so we know what values need to be decoded. */ [aCoder decodeValueOfObjCType: @encode(__typeof__(proxy_tag)) at: &proxy_tag]; switch (proxy_tag) { case PROXY_LOCAL_FOR_RECEIVER: /* * This was a proxy on the other side of the connection, but * here it's local. * Lookup the target handle to ensure that it exists here. * Return a retained copy of the local target object. */ [aCoder decodeValueOfObjCType: @encode(__typeof__(target)) at: &target]; if (debug_proxy) NSLog(@"Receiving a proxy for local object 0x%x " @"connection %p\n", target, decoder_connection); o = [decoder_connection locateLocalTarget: target]; if (o == nil) { [NSException raise: @"ProxyDecodedBadTarget" format: @"No local object with given target (0x%x)", target]; } else { if (debug_proxy) { NSLog(@"Local object is %p (%p)\n", (void*)(uintptr_t)o, o->_object); } return RETAIN(o->_object); } case PROXY_LOCAL_FOR_SENDER: /* * This was a local object on the other side of the connection, * but here it's a proxy object. Get the target address, and * send [NSDistantObject +proxyWithTarget:connection:]; this will * return the proxy object we already created for this target, or * create a new proxy object if necessary. */ [aCoder decodeValueOfObjCType: @encode(__typeof__(target)) at: &target]; if (debug_proxy) NSLog(@"Receiving a proxy, was local 0x%x connection %p\n", target, decoder_connection); o = [self initWithTarget: target connection: decoder_connection]; return o; case PROXY_REMOTE_FOR_BOTH: /* * This was a proxy on the other side of the connection, and it * will be a proxy on this side too; that is, the local version * of this object is not on this host, not on the host the * NSPortCoder is connected to, but on a *third* host. * This is why I call this a "triangle connection". In addition * to decoding the target, we decode the NSPort object that we * will use to talk directly to this third host. We send * [NSConnection +connectionWithReceivePort:sendPort:]; this * will either return the connection already created for this * inPort/outPort pair, or create a new connection if necessary. */ { NSConnection *proxy_connection; NSPort *proxy_connection_out_port = nil; unsigned intermediary; /* * There is an object on the intermediary host that is keeping * that hosts proxy for the original object retained, thus * ensuring that the original is not released. We create a * proxy for that intermediate proxy. When we release this * proxy, the intermediary will be free to release it's proxy * and the original can then be released. Of course, by that * time we will have obtained our own proxy for the original * object ... */ [aCoder decodeValueOfObjCType: @encode(__typeof__(intermediary)) at: &intermediary]; AUTORELEASE([self initWithTarget: intermediary connection: decoder_connection]); /* * Now we get the target number and port for the orignal object * and (if necessary) get the originating process to retain the * object for us. */ [aCoder decodeValueOfObjCType: @encode(__typeof__(target)) at: &target]; [aCoder decodeValueOfObjCType: @encode(id) at: &proxy_connection_out_port]; NSAssert(proxy_connection_out_port, NSInternalInconsistencyException); /* # If there already exists a connection for talking to the * out port, we use that one rather than creating a new one from * our listening port. * * First we try for a connection from our receive port, * Then we try any connection to the send port * Finally we resort to creating a new connection - we don't * release the newly created connection - it will get released * automatically when no proxies are left on it. */ proxy_connection = [[decoder_connection class] connectionWithReceivePort: [decoder_connection receivePort] sendPort: proxy_connection_out_port]; if (debug_proxy) NSLog(@"Receiving a triangle-connection proxy 0x%x " @"connection %p\n", target, proxy_connection); NSAssert(proxy_connection != decoder_connection, NSInternalInconsistencyException); NSAssert([proxy_connection isValid], NSInternalInconsistencyException); /* * We may not already have a proxy for the object on the * remote system, we must tell the connection to make sure * the other end knows we are creating one. */ [proxy_connection acquireProxyForTarget: target]; /* * Finally - we get a proxy via a direct connection to the * originating server. We have also created a proxy to an * intermediate object - but this proxy has not been retained * and will therefore go away when the current autorelease * pool is destroyed. */ o = [self initWithTarget: target connection: proxy_connection]; return o; } default: /* xxx This should be something different than NSGenericException. */ [NSException raise: NSGenericException format: @"Bad proxy tag"]; } /* Not reached. */ return nil; } + (id) initWithLocal: (id)anObject connection: (NSConnection*)aConnection { NSDistantObject *proxy; NSAssert([aConnection isValid], NSInternalInconsistencyException); /* * If there already is a local proxy for this target/connection * combination, don't create a new one, just return the old one. */ proxy = [aConnection retainOrAddLocal: nil forObject: anObject]; if (proxy == nil) { proxy = (NSDistantObject*)NSAllocateObject(distantObjectClass, 0, NSDefaultMallocZone()); proxy = [proxy initWithLocal: anObject connection: aConnection]; } return proxy; } + (id) initWithTarget: (unsigned)target connection: (NSConnection*)aConnection { NSDistantObject *proxy; NSAssert([aConnection isValid], NSInternalInconsistencyException); /* * If there already is a local proxy for this target/connection * combination, don't create a new one, just return the old one. */ proxy = [aConnection retainOrAddProxy: nil forTarget: target]; if (proxy == nil) { proxy = (NSDistantObject*)NSAllocateObject(distantObjectClass, 0, NSDefaultMallocZone()); proxy = [proxy initWithTarget: target connection: aConnection]; } return proxy; } @end @interface NSDistantObject (Debug) + (int) setDebug: (int)val; @end @implementation NSDistantObject (Debug) + (int) setDebug: (int)val { int old = debug_proxy; debug_proxy = val; return old; } @end /** * Instances of this class act as proxies to remote objects using * the Distributed Objects system. They also hold references to * local objects which are vended to remote processes. */ @implementation NSDistantObject + (void) initialize { if (self == [NSDistantObject class]) { placeHolder = objc_lookUpClass("GSDistantObjectPlaceHolder"); } } + (id) allocWithZone: (NSZone*)z { return (NSDistantObject*)placeHolder; } /** * Creates and returns a proxy associated with aConnection * which will hold a reference to the local object anObject. */ + (NSDistantObject*) proxyWithLocal: (id)anObject connection: (NSConnection*)aConnection { return AUTORELEASE([placeHolder initWithLocal: anObject connection: aConnection]); } /** * Creates and returns a proxy associated with aConnection * which will provide a link to a remote object whose reference * locally is anObject. */ + (NSDistantObject*) proxyWithTarget: (unsigned)anObject connection: (NSConnection*)aConnection { return AUTORELEASE([placeHolder initWithTarget: anObject connection: aConnection]); } /** * Returns the [NSConnection] instance with which the receiver is * associated. */ - (NSConnection*) connectionForProxy { return _connection; } /** * NSProxy subclasses must override -init or an exception will be thrown. This * calls the forwarding mechanism to invoke -init on the remote object. */ - (id) init { NSMethodSignature *sig; NSInvocation *inv; id ret; sig = [self methodSignatureForSelector: _cmd]; inv = [NSInvocation invocationWithMethodSignature: sig]; [inv setTarget: self]; [inv setSelector: _cmd]; [self forwardInvocation: inv]; [inv getReturnValue: &ret]; return ret; } - (void) dealloc { [self finalize]; if (_sigs != 0) [(NSMutableDictionary*)_sigs release]; [super dealloc]; } - (void) encodeWithCoder: (NSCoder*)aRmc { unsigned proxy_target; uint8_t proxy_tag; NSConnection *encoder_connection; /* if ([aRmc isKindOfClass: [NSPortCoder class]] == NO) { [NSException raise: NSGenericException format: @"NSDistantObject objects only " @"encode with NSPortCoder class"]; } */ encoder_connection = [(NSPortCoder*)aRmc connection]; NSAssert(encoder_connection, NSInternalInconsistencyException); if (![encoder_connection isValid]) [NSException raise: NSGenericException format: @"Trying to encode to an invalid Connection.\n" @"You should request NSConnectionDidDieNotification's and\n" @"release all references to the proxy's of invalid Connections."]; proxy_target = _handle; if (encoder_connection == _connection) { if (_object) { /* * This proxy is a local to us, remote to other side. */ proxy_tag = PROXY_LOCAL_FOR_SENDER; if (debug_proxy) NSLog(@"Sending a proxy, will be remote 0x%x connection %p\n", proxy_target, _connection); [aRmc encodeValueOfObjCType: @encode(__typeof__(proxy_tag)) at: &proxy_tag]; [aRmc encodeValueOfObjCType: @encode(__typeof__(proxy_target)) at: &proxy_target]; /* * Tell connection this object is being vended. */ [_connection vendLocal: self]; } else { /* * This proxy is a local object on the other side. */ proxy_tag = PROXY_LOCAL_FOR_RECEIVER; if (debug_proxy) NSLog(@"Sending a proxy, will be local 0x%x connection %p\n", proxy_target, _connection); [aRmc encodeValueOfObjCType: @encode(__typeof__(proxy_tag)) at: &proxy_tag]; [aRmc encodeValueOfObjCType: @encode(__typeof__(proxy_target)) at: &proxy_target]; } } else { /* * This proxy will still be remote on the other side */ NSPort *proxy_connection_out_port = [_connection sendPort]; NSDistantObject *localProxy; NSAssert(proxy_connection_out_port, NSInternalInconsistencyException); NSAssert([proxy_connection_out_port isValid], NSInternalInconsistencyException); NSAssert(proxy_connection_out_port != [encoder_connection sendPort], NSInternalInconsistencyException); proxy_tag = PROXY_REMOTE_FOR_BOTH; /* * Get a proxy to refer to self - we send this to the other * side so we will be retained until the other side has * obtained a proxy to the original object via a connection * to the original vendor. */ localProxy = [NSDistantObject proxyWithLocal: self connection: encoder_connection]; if (debug_proxy) NSLog(@"Sending triangle-connection proxy 0x%x " @"proxy-conn %p to-proxy 0x%x to-conn %p\n", localProxy->_handle, localProxy->_connection, proxy_target, _connection); /* * It's remote here, so we need to tell other side where to form * triangle connection to */ [aRmc encodeValueOfObjCType: @encode(__typeof__(proxy_tag)) at: &proxy_tag]; [aRmc encodeValueOfObjCType: @encode(__typeof__(localProxy->_handle)) at: &localProxy->_handle]; [aRmc encodeValueOfObjCType: @encode(__typeof__(proxy_target)) at: &proxy_target]; [aRmc encodeBycopyObject: proxy_connection_out_port]; /* * Tell connection that localProxy is being vended. */ [encoder_connection vendLocal: localProxy]; } } /* * This method needs to be implemented to actually do anything. */ - (void) forwardInvocation: (NSInvocation*)anInvocation { if (debug_proxy) NSLog(@"NSDistantObject forwardInvocation: %@\n", anInvocation); if (![_connection isValid]) [NSException raise: NSGenericException format: @"Trying to send message to an invalid Proxy.\n" @"You should request NSConnectionDidDieNotification's and\n" @"release all references to the proxy's of invalid Connections."]; /* We could be released while the connection is forwarding, so we need * to retain self. But, the remote end couild raise an exception, so * we can't rely on being able to release again; use autorelease. */ AUTORELEASE(RETAIN(self)); [_connection forwardInvocation: anInvocation forProxy: self]; } - (id) initWithCoder: (NSCoder*)aCoder { DESTROY(self); [NSException raise: NSGenericException format: @"NSDistantObject decodes from placeholder"]; return nil; } /** * Initialises and returns a proxy associated with aConnection * which will hold a reference to the local object anObject. */ - (id) initWithLocal: (id)anObject connection: (NSConnection*)aConnection { NSAssert([aConnection isValid], NSInternalInconsistencyException); _object = RETAIN(anObject); _handle = 0; _connection = RETAIN(aConnection); self = [_connection retainOrAddLocal: self forObject: anObject]; if (debug_proxy) { NSLog(@"Created new local=%p object %p target 0x%x connection %p\n", self, _object, _handle, _connection); } return self; } /** * Initialises and returns a proxy associated with aConnection * which will provide a link to a remote object whose reference * locally is target. */ - (id) initWithTarget: (unsigned)target connection: (NSConnection*)aConnection { NSAssert([aConnection isValid], NSInternalInconsistencyException); _object = nil; _handle = target; _connection = RETAIN(aConnection); /* * We register this object with the connection using it. * Conceivably this could result in self being changed. */ self = [_connection retainOrAddProxy: self forTarget: target]; if (debug_proxy) { NSLog(@"Created new proxy=%p target 0x%x connection %p\n", self, _handle, _connection); } return self; } /** *

Returns the method signature describing the arguments and return * types of the method in the object referred to by the receiver * which implements the aSelector message. *

*

This method may need to refer to another process (causing relatively * slow network communication) and approximately double the time taken for * sending a distributed objects message, so you are advised to use the * -setProtocolForProxy: method to avoid this occurring. *

*/ - (NSMethodSignature*) methodSignatureForSelector: (SEL)aSelector { if (0 == aSelector) { return nil; } if (_object != nil) { return [_object methodSignatureForSelector: aSelector]; } else { /* * Evil hack to prevent recursion - if we are asking a remote * object for a method signature, we can't ask it for the * signature of methodSignatureForSelector:, so we hack in * the signature required manually :-( */ if (sel_isEqual(aSelector, _cmd)) { static NSMethodSignature *sig = nil; if (sig == nil) { sig = RETAIN([NSMethodSignature signatureWithObjCTypes: "@@::"]); } return sig; } if (sel_isEqual(aSelector, @selector(methodType))) { static NSMethodSignature *sig = nil; if (sig == nil) { sig = RETAIN([NSMethodSignature signatureWithObjCTypes: "r*@:"]); } return sig; } if (_protocol != nil) { struct objc_method_description mth; mth = GSProtocolGetMethodDescriptionRecursive( _protocol, aSelector, YES, YES); if (mth.name == NULL && mth.types == NULL) { // Search for class method mth = GSProtocolGetMethodDescriptionRecursive( _protocol, aSelector, YES, NO); } if (mth.types) { return [NSMethodSignature signatureWithObjCTypes: mth.types]; } } if (_sigs != 0) { NSMutableDictionary *d = (NSMutableDictionary*)_sigs; NSString *s = NSStringFromSelector(aSelector); NSMethodSignature *m = [d objectForKey: s]; if (m != nil) return m; } { id m = nil; id inv; id sig; DO_FORWARD_INVOCATION(methodSignatureForSelector:, aSelector); if ([m isProxy] == YES) { const char *types; types = [m methodType]; /* Create a local method signature. */ m = [NSMethodSignature signatureWithObjCTypes: types]; } if (m != nil) { NSMutableDictionary *d = (NSMutableDictionary*)_sigs; NSString *s = NSStringFromSelector(aSelector); if (d == nil) { d = [NSMutableDictionary new]; _sigs = (void*)d; } [d setObject: m forKey: s]; } return m; } } } /** *

A key method for Distributed Objects performance. This sets the * a protocol that the distant object referred to by the proxy should * conform to. When messages in that protocol are sent to the proxy, * the proxy knows that it does not need to ask the remote object for * the method signature in order to send the message to it, but can * send the message straight away based on the local method signature * information obtained from the protocol. *

* * if ([anObj isProxy] == YES) * { * [anObj setProtocolForProxy: @protocol(MyProtocol)]; * } * *

It is highly recommended that you make use of this facility, * but you must beware that versions of the compiler prior to 3.3 suffer a * serious bug with respect to the @protocol directive. If the protocol * referred to is not declared and implemented in the file where @protocol * is used to refer to the protocol by name, a runtime error will occur * when you try to use it. *

*

Beware, if you don't use this method to set the protocol, the system * might well ask the remote process for method signature information, and * the remote process might get it wrong. This is because the * class of the remote object needs to have been declared to conform to the * protocol in order for it to know about any protocol qualifiers (the * keywords bycopy, byref, in, out, inout, and * oneway). If the author of the server process forgot to do * this, the type information returned from that process may not be what * you are expecting. *

* The class of the server object should be declared like this ... * * @interface MyServerClass : NSObject <MyProtocol> * ... * @end * */ - (void) setProtocolForProxy: (Protocol*)aProtocol { _protocol = aProtocol; } @end /** * Adds some backwards-compatibility and other methods. */ @implementation NSDistantObject(GNUstepExtensions) - (NSUInteger) sizeOfContentExcluding: (NSHashTable*)exclude { return 0; } /** * Used to tidy up when a proxy is destroyed. */ - (void) finalize { if (_connection) { if (debug_proxy > 3) NSLog(@"retain count for connection (%p) is now %lx\n", _connection, (unsigned long)[_connection retainCount]); /* * A proxy for local object retains its target - so we release it. * For a local object the connection also retains this proxy, so we * can't be deallocated unless we are already removed from the * connection, and there is no need to remove self from connection. * * A proxy has a nil local object, and retains it's connection so * that the connection will continue to exist as long as there is * a something to use it. * So we release our reference to the connection here just as soon * as we have removed ourself from the connection. */ if (_object == nil) [_connection removeProxy: self]; else DESTROY(_object); RELEASE(_connection); } } - (Class) classForCoder { return object_getClass(self); } /** * Returns the class of the receiver. */ - (Class) classForPortCoder { return object_getClass(self); } /** * If a protocol has been set for the receiver, this method tests to * see that the set protocol conforms to aProtocol. Otherwise, the * remote object is checked to see whether it conforms to aProtocol. */ - (BOOL) conformsToProtocol: (Protocol*)aProtocol { if (_protocol != nil) { return protocol_conformsToProtocol(_protocol, aProtocol); } else { return [(id)self _conformsToProtocolNamed: protocol_getName(aProtocol)]; } } - (BOOL) respondsToSelector: (SEL)aSelector { if (aSelector == 0) { return NO; } if (class_respondsToSelector(object_getClass(self), aSelector)) { return YES; } else { BOOL m = NO; id inv; id sig; DO_FORWARD_INVOCATION(respondsToSelector:, aSelector); return m; } } - (id) replacementObjectForCoder: (NSCoder*)aCoder { return self; } - (id) replacementObjectForPortCoder: (NSPortCoder*)aCoder { return self; } - (NSUInteger) sizeInBytesExcluding: (NSHashTable*)exclude { if (0 == NSHashGet(exclude, self)) { Class c = object_getClass(self); NSUInteger size = class_getInstanceSize(c); return size; } return 0; } @end @implementation Protocol (DistributedObjectsCoding) - (Class) classForPortCoder { return object_getClass(self); } - (id) replacementObjectForPortCoder: (NSPortCoder*)aRmc; { if ([aRmc isBycopy]) return self; else return [NSDistantObject proxyWithLocal: self connection: [aRmc connection]]; } @end gnustep-base-1.29.0/Source/NSDistributedLock.m000066400000000000000000000220471435650067400211710ustar00rootroot00000000000000/** Implementation for GNU Objective-C version of NSDistributedLock Copyright (C) 1997 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: November 1997 This file is part of the GNUstep Base Library. 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 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 USA. NSDistributedLock class reference $Date$ $Revision$ */ #import "common.h" #define EXPOSE_NSDistributedLock_IVARS 1 #import "Foundation/NSDistributedLock.h" #import "Foundation/NSException.h" #import "Foundation/NSFileManager.h" #import "Foundation/NSLock.h" #import "Foundation/NSValue.h" #import "GSPrivate.h" #if defined(HAVE_SYS_FCNTL_H) # include #elif defined(HAVE_FCNTL_H) # include #endif static NSFileManager *mgr = nil; /** * This class does not adopt the [(NSLocking)] protocol but supports locking * across processes, including processes on different machines, as long as * they can access a common filesystem. */ @implementation NSDistributedLock + (void) initialize { if (mgr == nil) { mgr = RETAIN([NSFileManager defaultManager]); [[NSObject leakAt: &mgr] release]; } } /** * Return a distributed lock for aPath. * See -initWithPath: for details. */ + (NSDistributedLock*) lockWithPath: (NSString*)aPath { return AUTORELEASE([[self alloc] initWithPath: aPath]); } /** * Forces release of the lock whether the receiver owns it or not.
* Raises an NSGenericException if unable to remove the lock. */ - (void) breakLock { [_localLock lock]; NS_DURING { NSDictionary *attributes; DESTROY(_lockTime); attributes = [mgr fileAttributesAtPath: _lockPath traverseLink: YES]; if (attributes != nil) { NSDate *modDate = [attributes fileModificationDate]; if ([mgr removeFileAtPath: _lockPath handler: nil] == NO) { NSString *err = [[NSError _last] localizedDescription]; attributes = [mgr fileAttributesAtPath: _lockPath traverseLink: YES]; if ([modDate isEqual: [attributes fileModificationDate]] == YES) { [NSException raise: NSGenericException format: @"Failed to remove lock directory '%@' - %@", _lockPath, err]; } } } } NS_HANDLER { [_localLock unlock]; [localException raise]; } NS_ENDHANDLER [_localLock unlock]; } - (void) dealloc { if (_lockTime != nil) { NSLog(@"[%@-dealloc] still locked for %@ since %@", NSStringFromClass([self class]), _lockPath, _lockTime); [self unlock]; } RELEASE(_lockPath); RELEASE(_lockTime); RELEASE(_localLock); [super dealloc]; } - (NSString*) description { NSString *result; [_localLock lock]; if (_lockTime == nil) { result = [[super description] stringByAppendingFormat: @" path '%@' not locked", _lockPath]; } else { result = [[super description] stringByAppendingFormat: @" path '%@' locked at %@", _lockPath, _lockTime]; } [_localLock unlock]; return result; } /** * Initialises the receiver with the specified filesystem path.
* The location in the filesystem must be accessible for this * to be usable. That is, the processes using the lock must be able * to access, create, and destroy files at the path.
* The directory in which the last path component resides must already * exist ... create it using NSFileManager if you need to. */ - (id) initWithPath: (NSString*)aPath { NSString *lockDir; BOOL isDirectory; _localLock = [NSLock new]; _lockPath = [[aPath stringByStandardizingPath] copy]; _lockTime = nil; lockDir = [_lockPath stringByDeletingLastPathComponent]; if ([mgr fileExistsAtPath: lockDir isDirectory: &isDirectory] == NO) { NSLog(@"part of the path to the lock file '%@' is missing\n", aPath); DESTROY(self); return nil; } if (isDirectory == NO) { NSLog(@"part of the path to the lock file '%@' is not a directory\n", _lockPath); DESTROY(self); return nil; } if ([mgr isWritableFileAtPath: lockDir] == NO) { NSLog(@"parent directory of lock file '%@' is not writable\n", _lockPath); DESTROY(self); return nil; } if ([mgr isExecutableFileAtPath: lockDir] == NO) { NSLog(@"parent directory of lock file '%@' is not accessible\n", _lockPath); DESTROY(self); return nil; } return self; } /** * Returns the date at which the lock was acquired by any * NSDistributedLock using the same path. If nothing has * the lock, this returns nil. */ - (NSDate*) lockDate { NSDictionary *attributes; attributes = [mgr fileAttributesAtPath: _lockPath traverseLink: YES]; return [attributes fileModificationDate]; } /** * Attempt to acquire the lock and return YES on success, NO on failure.
* May raise an NSGenericException if a problem occurs. */ - (BOOL) tryLock { BOOL locked = NO; [_localLock lock]; NS_DURING { NSMutableDictionary *attributesToSet; NSDictionary *attributes; if (nil != _lockTime) { [NSException raise: NSGenericException format: @"Attempt to re-lock distributed lock %@", _lockPath]; } attributesToSet = [NSMutableDictionary dictionaryWithCapacity: 1]; [attributesToSet setObject: [NSNumber numberWithUnsignedInt: 0755] forKey: NSFilePosixPermissions]; /* Here we depend on the fact that directory creation will fail if * the directory already exists. * We don't worry about any intermediate directories since we checked * those when the receiver was initialised in the -initWithPath: method. */ locked = [mgr createDirectoryAtPath: _lockPath attributes: attributesToSet]; if (NO == locked) { BOOL dir; /* We expect the directory creation to have failed because * it already exists as another processes lock. * If the directory doesn't exist, then either the other * process has removed it's lock (and we can retry) * or we have a severe problem! */ if ([mgr fileExistsAtPath: _lockPath isDirectory: &dir] == NO) { locked = [mgr createDirectoryAtPath: _lockPath withIntermediateDirectories: YES attributes: attributesToSet error: NULL]; if (NO == locked) { NSLog(@"Failed to create lock directory '%@' - %@", _lockPath, [NSError _last]); } } } if (YES == locked) { attributes = [mgr fileAttributesAtPath: _lockPath traverseLink: YES]; if (attributes == nil) { [NSException raise: NSGenericException format: @"Unable to get attributes of lock file we made at %@", _lockPath]; } ASSIGN(_lockTime, [attributes fileModificationDate]); if (nil == _lockTime) { [NSException raise: NSGenericException format: @"Unable to get date of lock file we made at %@", _lockPath]; } } } NS_HANDLER { [_localLock unlock]; [localException raise]; } NS_ENDHANDLER [_localLock unlock]; return locked; } /** * Releases the lock. Raises an NSGenericException if unable to release * the lock (for instance if the receiver does not own it or another * process has broken it). */ - (void) unlock { [_localLock lock]; NS_DURING { NSDictionary *attributes; if (_lockTime == nil) { [NSException raise: NSGenericException format: @"not locked by us"]; } /* Don't remove the lock if it has already been broken by someone * else and re-created. Unfortunately, there is a window between * testing and removing, but we do the bset we can. */ attributes = [mgr fileAttributesAtPath: _lockPath traverseLink: YES]; if (attributes == nil) { DESTROY(_lockTime); [NSException raise: NSGenericException format: @"lock '%@' already broken", _lockPath]; } if ([_lockTime isEqual: [attributes fileModificationDate]]) { DESTROY(_lockTime); if ([mgr removeFileAtPath: _lockPath handler: nil] == NO) { [NSException raise: NSGenericException format: @"Failed to remove lock directory '%@' - %@", _lockPath, [NSError _last]]; } } else { DESTROY(_lockTime); [NSException raise: NSGenericException format: @"lock '%@' already broken and in use again", _lockPath]; } DESTROY(_lockTime); } NS_HANDLER { [_localLock unlock]; [localException raise]; } NS_ENDHANDLER [_localLock unlock]; } @end gnustep-base-1.29.0/Source/NSDistributedNotificationCenter.m000066400000000000000000000602401435650067400240650ustar00rootroot00000000000000/** Copyright (C) 1998-2009 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: October 1998 This file is part of the GNUstep Base Library. 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 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 USA. NSDistributedNotificationCenter class reference $Date$ $Revision$ */ #import "common.h" #define EXPOSE_NSDistributedNotificationCenter_IVARS 1 #import "Foundation/NSConnection.h" #import "Foundation/NSDistantObject.h" #import "Foundation/NSException.h" #import "Foundation/NSFileManager.h" #import "Foundation/NSArchiver.h" #import "Foundation/NSNotification.h" #import "Foundation/NSDate.h" #import "Foundation/NSPathUtilities.h" #import "Foundation/NSRunLoop.h" #import "Foundation/NSTask.h" #import "GNUstepBase/NSTask+GNUstepBase.h" #import "Foundation/NSDistributedNotificationCenter.h" #import "Foundation/NSUserDefaults.h" #import "Foundation/NSHost.h" #import "Foundation/NSPortNameServer.h" #import "Foundation/NSThread.h" #import "../Tools/gdnc.h" @interface NSDistributedNotificationCenter (Private) - (void) _connect; - (void) _invalidated: (NSNotification*)notification; - (void) postNotificationName: (NSString*)name object: (NSString*)object userInfo: (NSData*)info selector: (NSString*)aSelector to: (uint64_t)observer; @end /** *

The NSDistributedNotificationCenter provides a versatile yet * simple mechanism for objects in different processes to communicate * effectively while knowing very little about each others' internals.
* A distributed notification center acts much like a normal * notification center, but it handles notifications on a machine-wide * (or local network wide) basis rather than just notifications within * a single process. Objects are able to register themselves as * observers for particular notification names and objects, and they * will then receive notifications (including optional user information * consisting of a dictionary of property-list objects) as they are posted. *

*

Since posting of distributed notifications involves inter-process * (and sometimes inter-host) communication, it is fundamentally slower * than normal notifications, and should be used relatively sparingly. * In order to help with this, the NSDistributedNotificationCenter * provides a notion of 'suspension', whereby a center can be suspended * causing notifications for observers in the process where the center * was suspended to cease receiving notifications. Observers can * specify how notifications are to be handled in this case (queued * or discarded) and posters can specify that particular notifications * are to be delivered immediately irrespective of suspension. *

*

Distributed notifications are mediated by a server process which * handles all notifications for a particular center type. In GNUstep * this process is the gdnc tool, and when started without special * options, a gdnc process acts as the local centre for the host it is * running on. When started with the GSNetwork user default set * to YES, the gdnc tool acts as a local network wide server (you * should only run one copy of gdnc like this on your LAN).
* The gdnc process should be started at machine boot time, but * GNUstep will attempt to start it automatically if it can't find it. *

*

MacOS-X currently defines only a notification center for the * local host. GNUstep also defines a local network center which can * be used from multiple hosts. By default the system sends this to * any gdnc process it can find which is configured as a network-wide * server, but the GDNCHost user default may be used to specify a * particular host to be contacted ... this may be of use where you * wish to have logically separate clusters of machines on a shared LAN. *

*/ @implementation NSDistributedNotificationCenter static NSDistributedNotificationCenter *locCenter = nil; static NSDistributedNotificationCenter *pubCenter = nil; static NSDistributedNotificationCenter *netCenter = nil; + (id) allocWithZone: (NSZone*)z { [NSException raise: NSInternalInconsistencyException format: @"Should not call +alloc for NSDistributedNotificationCenter"]; return nil; } /** * Returns the default notification center ... a shared notification * center for the local host. This is simply a convenience method * equivalent to calling +notificationCenterForType: with * NSLocalNotificationCenterType as its argument. */ + (id) defaultCenter { return [self notificationCenterForType: NSLocalNotificationCenterType]; } /** * Returns a notification center of the specified type.
* The NSLocalNotificationCenterType provides a shared access to * a notification center used by processes on the local host which belong to * the current user.
* The GSPublicNotificationCenterType provides a shared access to * a notification center used by processes on the local host belonging to * any user.
* The GSNetworkNotificationCenterType provides a shared access to * a notification center used by processes on the local network.
* MacOS-X supports only NSLocalNotificationCenterType. */ + (NSDistributedNotificationCenter*) notificationCenterForType: (NSString*)type { if ([type isEqual: NSLocalNotificationCenterType] == YES) { if (locCenter == nil) { [gnustep_global_lock lock]; if (locCenter == nil) { NS_DURING { NSDistributedNotificationCenter *tmp; tmp = (NSDistributedNotificationCenter*) NSAllocateObject(self, 0, NSDefaultMallocZone()); tmp->_centerLock = [NSRecursiveLock new]; tmp->_type = RETAIN(NSLocalNotificationCenterType); locCenter = [NSObject leak: tmp]; [tmp release]; } NS_HANDLER { [gnustep_global_lock unlock]; [localException raise]; } NS_ENDHANDLER } [gnustep_global_lock unlock]; } return locCenter; } else if ([type isEqual: GSPublicNotificationCenterType] == YES) { if (pubCenter == nil) { [gnustep_global_lock lock]; if (pubCenter == nil) { NS_DURING { NSDistributedNotificationCenter *tmp; tmp = (NSDistributedNotificationCenter*) NSAllocateObject(self, 0, NSDefaultMallocZone()); tmp->_centerLock = [NSRecursiveLock new]; tmp->_type = RETAIN(GSPublicNotificationCenterType); pubCenter = [NSObject leak: tmp]; [tmp release]; } NS_HANDLER { [gnustep_global_lock unlock]; [localException raise]; } NS_ENDHANDLER } [gnustep_global_lock unlock]; } return pubCenter; } else if ([type isEqual: GSNetworkNotificationCenterType] == YES) { if (netCenter == nil) { [gnustep_global_lock lock]; if (netCenter == nil) { NS_DURING { NSDistributedNotificationCenter *tmp; tmp = (NSDistributedNotificationCenter*) NSAllocateObject(self, 0, NSDefaultMallocZone()); tmp->_centerLock = [NSRecursiveLock new]; tmp->_type = RETAIN(GSNetworkNotificationCenterType); netCenter = [NSObject leak: tmp]; [tmp release]; } NS_HANDLER { [gnustep_global_lock unlock]; [localException raise]; } NS_ENDHANDLER } [gnustep_global_lock unlock]; } return netCenter; } else { [NSException raise: NSInvalidArgumentException format: @"Unknown center type (%@)", type]; return nil; /* NOT REACHED */ } } - (void) dealloc { if ([[_remote connectionForProxy] isValid]) { [_remote unregisterClient: (id)self]; } RELEASE(_remote); RELEASE(_type); [super dealloc]; } /** * Should not be used. */ - (id) init { DESTROY(self); [NSException raise: NSInternalInconsistencyException format: @"Should not call -init for NSDistributedNotificationCenter"]; return nil; } /** * Adds an observer to the receiver. Calls * -addObserver:selector:name:object:suspensionBehavior: with * NSNotificationSuspensionBehaviorCoalesce. */ - (void) addObserver: (id)anObserver selector: (SEL)aSelector name: (NSString*)notificationName object: (NSString*)anObject { [self addObserver: anObserver selector: aSelector name: notificationName object: anObject suspensionBehavior: NSNotificationSuspensionBehaviorCoalesce]; } /** * Adds an observer to the receiver.
* When a notification matching notificationName and anObject is * sent to the center, the object anObserver is sent the message * aSelector with the notification info dictionary as its argument.
* The suspensionBehavior governs how the center deals with notifications * when the process to which the notification should be delivered is * suspended: * * NSNotificationSuspensionBehaviorDrop * * Discards the notification if the observing process is suspended. * * NSNotificationSuspensionBehaviorCoalesce * * Discards previously queued notifications when the observing process * is suspended, leaving only the last notification posted in the queue. * Delivers this single notification when the process becomes unsuspended. * * NSNotificationSuspensionBehaviorHold * * Queues notifications when the observing process is suspended, * delivering all the queued notifications when the process becomes * unsuspended again. * * NSNotificationSuspensionBehaviorDeliverImmediately * * Deliver the notification immediately, even if the destination * process is suspended. * * */ - (void) addObserver: (id)anObserver selector: (SEL)aSelector name: (NSString*)notificationName object: (NSString*)anObject suspensionBehavior: (NSNotificationSuspensionBehavior)suspensionBehavior { if (anObserver == nil) { [NSException raise: NSInvalidArgumentException format: @"nil observer"]; } if (aSelector == 0) { [NSException raise: NSInvalidArgumentException format: @"null selector"]; } if (notificationName != nil && [notificationName isKindOfClass: [NSString class]] == NO) { [NSException raise: NSInvalidArgumentException format: @"invalid notification name"]; } if (anObject != nil && [anObject isKindOfClass: [NSString class]] == NO) { [NSException raise: NSInvalidArgumentException format: @"invalid notification object"]; } if (anObject == nil && notificationName == nil) { [NSException raise: NSInvalidArgumentException format: @"notification name and object both nil"]; } [_centerLock lock]; NS_DURING { [self _connect]; [(id)_remote addObserver: (uint64_t)(uintptr_t)anObserver selector: NSStringFromSelector(aSelector) name: notificationName object: anObject suspensionBehavior: suspensionBehavior for: (id)self]; } NS_HANDLER { [_centerLock unlock]; [localException raise]; } NS_ENDHANDLER [_centerLock unlock]; } /** * Posts the notification to the center using * postNotificationName:object:userInfo:deliverImmediately: with the * delivery flag set to NO. */ - (void) postNotification: (NSNotification*)notification { [self postNotificationName: [notification name] object: [notification object] userInfo: [notification userInfo] deliverImmediately: NO]; } /** * Posts the notificationName and anObject to the center using * postNotificationName:object:userInfo:deliverImmediately: with the * user info set to nil and the delivery flag set to NO. */ - (void) postNotificationName: (NSString*)notificationName object: (NSString*)anObject { [self postNotificationName: notificationName object: anObject userInfo: nil deliverImmediately: NO]; } /** * Posts the notificationName, anObject and userInfo to the center using * postNotificationName:object:userInfo:deliverImmediately: with the * delivery flag set to NO. */ - (void) postNotificationName: (NSString*)notificationName object: (NSString*)anObject userInfo: (NSDictionary*)userInfo { [self postNotificationName: notificationName object: anObject userInfo: userInfo deliverImmediately: NO]; } /** * The primitive notification posting method ...
* The userInfo dictionary may contain only property-list objects.
* The deliverImmediately flag specifies whether the suspension * state of the receiving process is to be ignored. */ - (void) postNotificationName: (NSString*)notificationName object: (NSString*)anObject userInfo: (NSDictionary*)userInfo deliverImmediately: (BOOL)deliverImmediately { if (notificationName == nil || [notificationName isKindOfClass: [NSString class]] == NO) { [NSException raise: NSInvalidArgumentException format: @"invalid notification name"]; } if (anObject != nil && [anObject isKindOfClass: [NSString class]] == NO) { [NSException raise: NSInvalidArgumentException format: @"invalid notification object"]; } [_centerLock lock]; NS_DURING { NSData *d; [self _connect]; d = [NSArchiver archivedDataWithRootObject: userInfo]; [(id)_remote postNotificationName: notificationName object: anObject userInfo: d deliverImmediately: deliverImmediately for: (id)self]; } NS_HANDLER { [_centerLock unlock]; [localException raise]; } NS_ENDHANDLER [_centerLock unlock]; } /** * Removes the observer from the center. */ - (void) removeObserver: (id)anObserver name: (NSString*)notificationName object: (NSString*)anObject { if (notificationName != nil && [notificationName isKindOfClass: [NSString class]] == NO) { [NSException raise: NSInvalidArgumentException format: @"invalid notification name"]; } if (anObject != nil && [anObject isKindOfClass: [NSString class]] == NO) { [NSException raise: NSInvalidArgumentException format: @"invalid notification object"]; } [_centerLock lock]; NS_DURING { [self _connect]; [(id)_remote removeObserver: (uint64_t)(uintptr_t)anObserver name: notificationName object: anObject for: (id)self]; } NS_HANDLER { [_centerLock unlock]; [localException raise]; } NS_ENDHANDLER [_centerLock unlock]; } /** * Sets the suspension state of the receiver ... if the receiver is * suspended, it won't handle notification until it is unsuspended * again, unless the notifications are posted to be delivered * immediately. */ - (void) setSuspended: (BOOL)flag { [_centerLock lock]; NS_DURING { [self _connect]; _suspended = flag; [(id)_remote setSuspended: flag for: (id)self]; } NS_HANDLER { [_centerLock unlock]; [localException raise]; } NS_ENDHANDLER [_centerLock unlock]; } /** * Returns the current suspension state of the receiver. */ - (BOOL) suspended { return _suspended; } @end /* * The following dummy class is here solely as a workaround for pre 3.3 * versions of gcc where protocols didn't work properly unless implemented * in the source where the '@protocol()' directive is used. */ @interface NSDistributedNotificationCenterDummy : NSObject - (void) addObserver: (uint64_t)anObserver selector: (NSString*)aSelector name: (NSString*)notificationname object: (NSString*)anObject suspensionBehavior: (NSNotificationSuspensionBehavior)suspensionBehavior for: (id)client; - (oneway void) postNotificationName: (NSString*)notificationName object: (NSString*)anObject userInfo: (NSData*)d deliverImmediately: (BOOL)deliverImmediately for: (id)client; - (void) registerClient: (id)client; - (void) removeObserver: (uint64_t)anObserver name: (NSString*)notificationname object: (NSString*)anObject for: (id)client; - (void) setSuspended: (BOOL)flag for: (id)client; - (void) unregisterClient: (id)client; @end @implementation NSDistributedNotificationCenterDummy - (void) addObserver: (uint64_t)anObserver selector: (NSString*)aSelector name: (NSString*)notificationname object: (NSString*)anObject suspensionBehavior: (NSNotificationSuspensionBehavior)suspensionBehavior for: (id)client { } - (oneway void) postNotificationName: (NSString*)notificationName object: (NSString*)anObject userInfo: (NSData*)d deliverImmediately: (BOOL)deliverImmediately for: (id)client { } - (void) registerClient: (id)client { } - (void) removeObserver: (uint64_t)anObserver name: (NSString*)notificationname object: (NSString*)anObject for: (id)client { } - (void) setSuspended: (BOOL)flag for: (id)client { } - (void) unregisterClient: (id)client { } @end @implementation NSDistributedNotificationCenter (Private) /** * Establish a connection to the server. This method should only be called * when protected by the center's lock, so that it is thread-safe. */ - (void) _connect { if (_remote == nil) { NSString *host = nil; NSString *service = nil; NSString *description = nil; NSString *alternate = nil; NSPortNameServer *ns = nil; Protocol *p = @protocol(GDNCProtocol); NSConnection *c; if (_type == NSLocalNotificationCenterType) { NSUserDefaults *defs = [NSUserDefaults standardUserDefaults]; if ([defs objectForKey: @"NSPortIsMessagePort"] != nil && [defs boolForKey: @"NSPortIsMessagePort"] == NO) { ns = [NSSocketPortNameServer sharedInstance]; } else { ns = [NSMessagePortNameServer sharedInstance]; } host = @""; service = GDNC_SERVICE; description = @"local host"; } else if (_type == GSPublicNotificationCenterType) { /* * Connect to the NSDistributedNotificationCenter for this host. */ host = [[NSUserDefaults standardUserDefaults] stringForKey: @"NSHost"]; if (host == nil) { host = @""; } else { NSHost *h; /* * If we have a host specified, but it is the current host, * we do not need to ask for a host by name (nameserver lookup * can be faster) and the empty host name can be used to * indicate that we may start a gdnc server locally. */ h = [NSHost hostWithName: host]; if (h == nil) { NSLog(@"Unknown -NSHost '%@' ignored", host); host = @""; } else if ([h isEqual: [NSHost currentHost]] == YES) { host = @""; } else { host = [h name]; } if ([host isEqual: @""] == NO) { alternate = [service stringByAppendingFormat: @"-%@", host] ; } } if ([host length] == 0 || [host isEqualToString: @"localhost"] == YES || [host isEqualToString: @"127.0.0.1"] == YES) { host = @""; description = @"local host"; } else { description = host; } service = GDNC_SERVICE; ns = [NSSocketPortNameServer sharedInstance]; } else if (_type == GSNetworkNotificationCenterType) { host = [[NSUserDefaults standardUserDefaults] stringForKey: @"GDNCHost"]; description = host; if (host == nil) { host = @"*"; description = @"network host"; } service = GDNC_NETWORK; ns = [NSSocketPortNameServer sharedInstance]; } else { [NSException raise: NSInternalInconsistencyException format: @"Unknown center type - %@", _type]; } _remote = [NSConnection rootProxyForConnectionWithRegisteredName: service host: host usingNameServer: ns]; if (_remote == nil && alternate != nil) { _remote = [NSConnection rootProxyForConnectionWithRegisteredName: alternate host: @"*" usingNameServer: ns]; } if (_remote == nil) { NSString *cmd = nil; NSArray *args = nil; NSDate *limit; cmd = [NSTask launchPathForTool: @"gdnc"]; NSDebugMLLog(@"NSDistributedNotificationCenter", @"\nI couldn't contact the notification server for %@ -\n" @"so I'm attempting to to start one - which will take a few seconds.\n" @"Trying to launch gdnc from %@ or a machine/operating-system subdirectory.\n" @"It is recommended that you start the notification server (gdnc) either at\n" @"login or (better) when your computer is started up.\n", description, [cmd stringByDeletingLastPathComponent]); if (_type == GSNetworkNotificationCenterType) { args = [NSArray arrayWithObjects: @"-GSNetwork", @"YES", @"--auto", nil]; } else if (_type == GSPublicNotificationCenterType) { args = [NSArray arrayWithObjects: @"-GSPublic", @"YES", @"--auto", nil]; } else if ([host length] > 0) { args = [NSArray arrayWithObjects: @"-NSHost", host, @"--auto", nil]; } else { args = [NSArray arrayWithObjects: @"--auto", nil]; } [NSTask launchedTaskWithLaunchPath: cmd arguments: args]; limit = [NSDate dateWithTimeIntervalSinceNow: 10.0]; while (_remote == nil && [limit timeIntervalSinceNow] > 0) { NSAutoreleasePool *pool = [NSAutoreleasePool new]; [NSThread sleepForTimeInterval: 0.05]; _remote = [NSConnection rootProxyForConnectionWithRegisteredName: service host: host usingNameServer: ns]; [_remote retain]; [pool drain]; } if (_remote == nil) { [NSException raise: NSInternalInconsistencyException format: @"unable to contact GDNC server -\n" @"please check that the gdnc process is running.\n" @"I attempted to start it at '%@'\n", cmd]; } } else { [_remote retain]; } c = [_remote connectionForProxy]; [_remote setProtocolForProxy: p]; /* * Ensure that this center can be used safely from different * threads. */ [c enableMultipleThreads]; /* * Ask to be told if the connection goes away. */ [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(_invalidated:) name: NSConnectionDidDieNotification object: c]; [_remote registerClient: (id)self]; } } - (void) _invalidated: (NSNotification*)notification { id connection = [notification object]; /* * Tidy up now that the connection has gone away. */ [[NSNotificationCenter defaultCenter] removeObserver: self name: NSConnectionDidDieNotification object: connection]; NSAssert(connection == [_remote connectionForProxy], NSInternalInconsistencyException); RELEASE(_remote); _remote = nil; } - (void) postNotificationName: (NSString*)name object: (NSString*)object userInfo: (NSData*)info selector: (NSString*)aSelector to: (uint64_t)observer { id userInfo; NSNotification *notification; id recipient = (id)(uintptr_t)observer; userInfo = [NSUnarchiver unarchiveObjectWithData: info]; notification = [NSNotification notificationWithName: name object: object userInfo: userInfo]; [recipient performSelector: GSSelectorFromNameAndTypes([aSelector cString], 0) withObject: notification]; } @end gnustep-base-1.29.0/Source/NSEnergyFormatter.m000066400000000000000000000064451435650067400212170ustar00rootroot00000000000000/* Implementation of class NSEnergyFormatter Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory John Casamento Date: Tue Oct 8 13:30:10 EDT 2019 This file is part of the GNUstep Library. 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 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 USA. */ #import "Foundation/NSEnergyFormatter.h" #import "Foundation/NSMeasurement.h" #import "Foundation/NSMeasurementFormatter.h" #import "Foundation/NSNumberFormatter.h" #import "Foundation/NSUnit.h" @implementation NSEnergyFormatter - (instancetype) init { self = [super init]; if (self != nil) { _numberFormatter = nil; _unitStyle = NSFormattingUnitStyleMedium; _isForFoodEnergyUse = NO; } return self; } - (NSNumberFormatter *) numberFormatter { return _numberFormatter; } - (void) setNumberFormatter: (NSNumberFormatter *)formatter { ASSIGN(_numberFormatter, formatter); } - (NSFormattingUnitStyle) unitStyle { return _unitStyle; } - (void) setUnitStyle: (NSFormattingUnitStyle)style { _unitStyle = style; } - (BOOL) isForFoodEnergyUse { return _isForFoodEnergyUse; } - (void) setForFoodEnergyUse: (BOOL)flag { _isForFoodEnergyUse = flag; } - (NSString *) stringFromValue: (double)value unit: (NSEnergyFormatterUnit)unit { NSUnit *u = nil; NSMeasurement *m = nil; NSMeasurementFormatter *mf = nil; switch (unit) { case NSEnergyFormatterUnitJoule: u = [NSUnitEnergy joules]; break; case NSEnergyFormatterUnitKilojoule: u = [NSUnitEnergy kilojoules]; break; case NSEnergyFormatterUnitCalorie: u = [NSUnitEnergy calories]; break; case NSEnergyFormatterUnitKilocalorie: u = [NSUnitEnergy kilocalories]; break; } m = [[NSMeasurement alloc] initWithDoubleValue: value unit: u]; AUTORELEASE(m); mf = [[NSMeasurementFormatter alloc] init]; AUTORELEASE(mf); [mf setUnitStyle: _unitStyle]; [mf setNumberFormatter: _numberFormatter]; return [mf stringFromMeasurement: m]; } - (NSString *) stringFromJoules: (double)numberInJoules { return [self stringFromValue: numberInJoules unit: NSEnergyFormatterUnitJoule]; } - (NSString *) unitStringFromValue: (double)value unit: (NSEnergyFormatterUnit)unit { return [self stringFromValue: value unit: unit]; } - (NSString *) unitStringFromJoules: (double)numberInJoules usedUnit: (NSEnergyFormatterUnit *)unit { *unit = NSEnergyFormatterUnitJoule; return [self stringFromValue: numberInJoules unit: *unit]; } - (BOOL) getObjectValue: (id *)obj forString: (NSString *)string errorDescription: (NSString **)error { return NO; } @end gnustep-base-1.29.0/Source/NSEnumerator.m000066400000000000000000000055561435650067400202250ustar00rootroot00000000000000/** NSEnumerator abstrace class for GNUStep Copyright (C) 1995, 1996 Free Software Foundation, Inc. Written by: Andrew Kachites McCallum Date: March 1995 This file is part of the GNUstep Base Library. 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 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 USA. NSEnumerator class reference $Date$ $Revision$ */ #import "common.h" #import "Foundation/NSArray.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSException.h" /** * Simple class for iterating over a collection of objects, usually returned * from an [NSArray] or similar. */ @implementation NSEnumerator /** * Returns all objects remaining in the enumeration as an array.
* Calling this method 'exhausts' the enumerator, leaving it at the * end of the collection being enumerated. */ - (NSArray*) allObjects { NSMutableArray *array; id obj; SEL nsel; IMP nimp; SEL asel; IMP aimp; array = [NSMutableArray arrayWithCapacity: 10]; nsel = @selector(nextObject); nimp = [self methodForSelector: nsel]; asel = @selector(addObject:); aimp = [array methodForSelector: asel]; while ((obj = (*nimp)(self, nsel)) != nil) { (*aimp)(array, asel, obj); } return array; } /** * Returns next object in enumeration, or nil if none remain. Use code like * while (object = [enumerator nextObject]) { ... }. */ - (id) nextObject { [self subclassResponsibility:_cmd]; return nil; } - (NSUInteger) countByEnumeratingWithState: (NSFastEnumerationState*)state objects: (id*)stackbuf count: (NSUInteger)len { IMP nextObject = [self methodForSelector: @selector(nextObject)]; int i; state->itemsPtr = stackbuf; state->mutationsPtr = (unsigned long*)self; for (i = 0; i < len; i++) { id next = nextObject(self, @selector(nextObject)); if (nil == next) { return i; } *(stackbuf+i) = next; } return len; } @end /** * objc_enumerationMutation() is called whenever a collection mutates in the * middle of fast enumeration. */ void objc_enumerationMutation(id obj) { [NSException raise: NSGenericException format: @"Collection %@ was mutated while being enumerated", obj]; } gnustep-base-1.29.0/Source/NSError.m000066400000000000000000000100061435650067400171570ustar00rootroot00000000000000/** Implementation for NSError for GNUStep Copyright (C) 2004 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: May 2004 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #define EXPOSE_NSError_IVARS 1 #import "Foundation/NSDictionary.h" #import "Foundation/NSError.h" #import "Foundation/NSCoder.h" @implementation NSError + (id) errorWithDomain: (NSErrorDomain)aDomain code: (NSInteger)aCode userInfo: (NSDictionary*)aDictionary { NSError *e = [self allocWithZone: NSDefaultMallocZone()]; e = [e initWithDomain: aDomain code: aCode userInfo: aDictionary]; return AUTORELEASE(e); } - (NSInteger) code { return _code; } - (id) copyWithZone: (NSZone*)z { NSError *e = [[self class] allocWithZone: z]; e = [e initWithDomain: _domain code: _code userInfo: _userInfo]; return e; } - (void) dealloc { DESTROY(_domain); DESTROY(_userInfo); [super dealloc]; } - (NSString*) description { return [self localizedDescription]; } - (NSErrorDomain) domain { return _domain; } - (void) encodeWithCoder: (NSCoder*)aCoder { if ([aCoder allowsKeyedCoding]) { [aCoder encodeInt: _code forKey: @"NSCode"]; [aCoder encodeObject: _domain forKey: @"NSDomain"]; [aCoder encodeObject: _userInfo forKey: @"NSUserInfo"]; } else { [aCoder encodeValueOfObjCType: @encode(int) at: &_code]; [aCoder encodeValueOfObjCType: @encode(id) at: &_domain]; [aCoder encodeValueOfObjCType: @encode(id) at: &_userInfo]; } } - (id) init { return [self initWithDomain: nil code: 0 userInfo: nil]; } - (id) initWithCoder: (NSCoder*)aCoder { if ([aCoder allowsKeyedCoding]) { int c; id d; id u; c = [aCoder decodeIntForKey: @"NSCode"]; d = [aCoder decodeObjectForKey: @"NSDomain"]; u = [aCoder decodeObjectForKey: @"NSUserInfo"]; self = [self initWithDomain: d code: c userInfo: u]; } else { [aCoder decodeValueOfObjCType: @encode(int) at: &_code]; [aCoder decodeValueOfObjCType: @encode(id) at: &_domain]; [aCoder decodeValueOfObjCType: @encode(id) at: &_userInfo]; } return self; } - (id) initWithDomain: (NSErrorDomain)aDomain code: (NSInteger)aCode userInfo: (NSDictionary*)aDictionary { if (aDomain == nil) { NSLog(@"[%@-%@] with nil domain", NSStringFromClass([self class]), NSStringFromSelector(_cmd)); DESTROY(self); } else if ((self = [super init]) != nil) { ASSIGN(_domain, aDomain); _code = aCode; ASSIGN(_userInfo, aDictionary); } return self; } - (NSString *) localizedDescription { NSString *desc = [_userInfo objectForKey: NSLocalizedDescriptionKey]; if (desc == nil) { desc = [NSString stringWithFormat: @"%@ %d", _domain, _code]; } return desc; } - (NSString *) localizedFailureReason { return [_userInfo objectForKey: NSLocalizedFailureReasonErrorKey]; } - (NSArray *) localizedRecoveryOptions { return [_userInfo objectForKey: NSLocalizedRecoveryOptionsErrorKey]; } - (NSString *) localizedRecoverySuggestion { return [_userInfo objectForKey: NSLocalizedRecoverySuggestionErrorKey]; } - (id) recoveryAttempter { return [_userInfo objectForKey: NSRecoveryAttempterErrorKey]; } - (NSDictionary*) userInfo { return _userInfo; } @end gnustep-base-1.29.0/Source/NSException.m000066400000000000000000001363001435650067400200320ustar00rootroot00000000000000/** NSException - Object encapsulation of a general exception handler Copyright (C) 1993-2013 Free Software Foundation, Inc. Written by: Adam Fedor Date: Mar 1995 This file is part of the GNUstep Base Library. 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 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 USA. $Date$ $Revision$ */ #import "common.h" #define EXPOSE_NSException_IVARS 1 #define EXPOSE_NSThread_IVARS 1 #import "GSPrivate.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSException.h" #import "Foundation/NSArray.h" #import "Foundation/NSCoder.h" #import "Foundation/NSData.h" #import "Foundation/NSLock.h" #import "Foundation/NSNull.h" #import "Foundation/NSThread.h" #import "Foundation/NSLock.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSValue.h" #import "GNUstepBase/NSString+GNUstepBase.h" #import "GSPThread.h" #ifdef __GNUSTEP_RUNTIME__ #include #endif #ifdef HAVE_SET_UNCAUGHT_EXCEPTION_HANDLER #include #endif #ifdef HAVE_MALLOC_H #if !defined(__OpenBSD__) #include #endif #endif #ifdef HAVE_ALLOCA_H #include #endif #include #ifdef HAVE_BACKTRACE #include #endif /* * Turn off USE_BFD if we don't have bfd support for it. */ #if !(defined(HAVE_BFD_H) && defined(HAVE_LIBBFD) && defined(HAVE_LIBIBERTY)) # if defined(USE_BFD) # undef USE_BFD # endif #endif #if defined(_WIN32) && !defined(USE_BFD) #include #if defined(HAVE_DBGHELP_H) #include #else /* Supply the relevant bits from dbghelp.h if we could't find the header. */ #define SYMOPT_UNDNAME 0x00000002 #define SYMOPT_DEFERRED_LOADS 0x00000004 typedef struct _SYMBOL_INFO { ULONG SizeOfStruct; ULONG TypeIndex; uint64_t Reserved[2]; ULONG Index; ULONG Size; uint64_t ModBase; ULONG Flags; uint64_t Value; uint64_t Address; ULONG Register; ULONG Scope; ULONG Tag; ULONG NameLen; ULONG MaxNameLen; TCHAR Name[1]; } SYMBOL_INFO; #endif #endif static NSUncaughtExceptionHandler *_NSUncaughtExceptionHandler = 0; #define _e_info (((id*)_reserved)[0]) #define _e_stack (((id*)_reserved)[1]) @interface NSException (GSPrivate) - (GSStackTrace*) _callStack; @end #if defined(_WIN32) #if defined(USE_BFD) static NSString * GSPrivateBaseAddress(void *addr, void **base) { MEMORY_BASIC_INFORMATION info; /* Found a note saying that according to Matt Pietrek's "Under the Hood" * column for the April 1997 issue of Microsoft Systems Journal, the * allocation base returned by VirtualQuery can be used as the handle * to obtain module information for a loaded library. */ if (VirtualQuery (addr, &info, sizeof(info)) != 0) { HMODULE handle = (HMODULE) info.AllocationBase; unichar path[MAX_PATH+1]; if (GetModuleFileNameW(handle, path, sizeof(path)-1) != 0) { path[sizeof(path)-1] = '\0'; *base = info.BaseAddress; return [NSString stringWithCharacters: path length: wcslen(path)]; } } return nil; } #endif /* USE_BFD */ #else /* _WIN32 */ #include #if defined(USE_BFD) static NSString * GSPrivateBaseAddress(void *addr, void **base) { #ifdef HAVE_DLADDR Dl_info info; if (!dladdr(addr, &info)) return nil; *base = info.dli_fbase; return [NSString stringWithUTF8String: info.dli_fname]; #else return nil; #endif } #endif /* USE_BFD */ #endif /* _WIN32 */ #if defined(USE_BFD) // GSStackTrace inspired by FYStackTrace.m // created by Wim Oudshoorn on Mon 11-Apr-2006 // reworked by Lloyd Dupont @ NovaMind.com on 4-May-2006 #include @class GSBinaryFileInfo; @interface GSFunctionInfo : NSObject { void *_address; NSString *_fileName; NSString *_functionName; int _lineNo; GSBinaryFileInfo *_module; } - (void*) address; - (NSString *) fileName; - (NSString *) function; - (id) initWithModule: (GSBinaryFileInfo*)module address: (void*)address file: (NSString*)file function: (NSString*)function line: (int)lineNo; - (int) lineNumber; - (GSBinaryFileInfo*) module; @end @interface GSBinaryFileInfo : NSObject { NSString *_fileName; bfd *_abfd; asymbol **_symbols; long _symbolCount; } - (NSString *) fileName; - (GSFunctionInfo *) functionForAddress: (void*) address; - (id) initWithBinaryFile: (NSString *)fileName; - (id) init; // return info for the current executing process @end @implementation GSFunctionInfo - (void*) address { return _address; } - (oneway void) dealloc { DESTROY(_module); DESTROY(_fileName); DESTROY(_functionName); [super dealloc]; } - (NSString *) description { return [NSString stringWithFormat: @"(%@: %p) %@ %@: %d", [_module fileName], _address, _functionName, _fileName, _lineNo]; } - (NSString *) fileName { return _fileName; } - (NSString *) function { return _functionName; } - (id) init { DESTROY(self); return nil; } - (id) initWithModule: (GSBinaryFileInfo*)module address: (void*)address file: (NSString*)file function: (NSString*)function line: (int)lineNo { _module = RETAIN(module); _address = address; _fileName = [file copy]; _functionName = [function copy]; _lineNo = lineNo; return self; } - (int) lineNumber { return _lineNo; } - (GSBinaryFileInfo *) module { return _module; } @end @implementation GSBinaryFileInfo + (GSBinaryFileInfo*) infoWithBinaryFile: (NSString *)fileName { return [[[self alloc] initWithBinaryFile: fileName] autorelease]; } + (void) initialize { static BOOL first = YES; if (first == NO) { return; } first = NO; bfd_init (); } - (oneway void) dealloc { DESTROY(_fileName); if (_abfd) { bfd_close (_abfd); _abfd = NULL; } if (_symbols) { free(_symbols); _symbols = NULL; } [super dealloc]; } - (NSString *) fileName { return _fileName; } - (id) init { NSString *processName; processName = [[[NSProcessInfo processInfo] arguments] objectAtIndex: 0]; return [self initWithBinaryFile: processName]; } - (id) initWithBinaryFile: (NSString *)fileName { int neededSpace; // 1st initialize the bfd if ([fileName length] == 0) { //NSLog (@"GSBinaryFileInfo: No File"); DESTROY(self); return nil; } _fileName = [fileName copy]; _abfd = bfd_openr ([fileName cString], NULL); if (!_abfd) { //NSLog (@"GSBinaryFileInfo: No Binary Info"); DESTROY(self); return nil; } if (!bfd_check_format_matches (_abfd, bfd_object, NULL)) { //NSLog (@"GSBinaryFileInfo: BFD format object error"); DESTROY(self); return nil; } // second read the symbols from it if (!(bfd_get_file_flags (_abfd) & HAS_SYMS)) { //NSLog (@"GSBinaryFileInfo: BFD does not contain any symbols"); DESTROY(self); return nil; } neededSpace = bfd_get_symtab_upper_bound (_abfd); if (neededSpace < 0) { //NSLog (@"GSBinaryFileInfo: BFD error while deducing needed space"); DESTROY(self); return nil; } if (neededSpace == 0) { //NSLog (@"GSBinaryFileInfo: BFD no space for symbols needed"); DESTROY(self); return nil; } _symbols = malloc (neededSpace); if (!_symbols) { //NSLog (@"GSBinaryFileInfo: Can't allocate buffer"); DESTROY(self); return nil; } _symbolCount = bfd_canonicalize_symtab (_abfd, _symbols); if (_symbolCount < 0) { //NSLog (@"GSBinaryFileInfo: BFD error while reading symbols"); DESTROY(self); return nil; } return self; } struct SearchAddressStruct { void *theAddress; GSBinaryFileInfo *module; asymbol **symbols; GSFunctionInfo *theInfo; }; static void find_address (bfd *abfd, asection *section, struct SearchAddressStruct *info) { bfd_vma address; bfd_vma vma; unsigned size; const char *fileName = 0; const char *functionName = 0; unsigned line = 0; if (info->theInfo) { return; } address = (bfd_vma) (uintptr_t)info->theAddress; /* bfd_get_section_vma() was changed to bfd_section_vma() together with * changes to a couple of other inline functions. */ #if defined(HAVE_BFD_SECTION_VMA) if (!(bfd_section_flags(section) & SEC_ALLOC)) { return; // Only debug in this section } if (bfd_section_flags(section) & SEC_DATA) { return; // Only data in this section } vma = bfd_section_vma(section); size = bfd_section_size(section); #else if (!(bfd_get_section_flags(abfd, section) & SEC_ALLOC)) { return; // Only debug in this section } if (bfd_get_section_flags(abfd, section) & SEC_DATA) { return; // Only data in this section } vma = bfd_get_section_vma(abfd, section); size = bfd_section_size(abfd, section); #endif if (address < vma || address >= vma + size) { return; } if (bfd_find_nearest_line (abfd, section, info->symbols, address - vma, &fileName, &functionName, &line)) { GSFunctionInfo *fi; NSString *file = nil; NSString *func = nil; if (fileName != 0) { file = [NSString stringWithCString: fileName encoding: [NSString defaultCStringEncoding]]; } if (functionName != 0) { func = [NSString stringWithCString: functionName encoding: [NSString defaultCStringEncoding]]; } fi = [GSFunctionInfo alloc]; fi = [fi initWithModule: info->module address: info->theAddress file: file function: func line: line]; [fi autorelease]; info->theInfo = fi; } } - (GSFunctionInfo *) functionForAddress: (void*) address { struct SearchAddressStruct searchInfo = { address, self, _symbols, nil }; bfd_map_over_sections (_abfd, (void (*) (bfd *, asection *, void *)) find_address, &searchInfo); return searchInfo.theInfo; } @end static gs_mutex_t modLock; static NSMutableDictionary *stackModules = nil; // initialize stack trace info static id GSLoadModule(NSString *fileName) { GSBinaryFileInfo *module = nil; GS_MUTEX_LOCK(modLock); if (stackModules == nil) { NSEnumerator *enumerator; NSBundle *bundle; stackModules = [NSMutableDictionary new]; /* * Try to ensure we have the main, base and gui library bundles. */ [NSBundle mainBundle]; [NSBundle bundleForClass: [NSObject class]]; [NSBundle bundleForClass: NSClassFromString(@"NSView")]; /* * Add file info for all bundles with code. */ enumerator = [[NSBundle allBundles] objectEnumerator]; while ((bundle = [enumerator nextObject]) != nil) { if ([bundle load] == YES) { GSLoadModule([bundle executablePath]); } } } if ([fileName length] > 0) { module = [stackModules objectForKey: fileName]; if (module == nil) { module = [GSBinaryFileInfo infoWithBinaryFile: fileName]; if (module == nil) { module = (id)[NSNull null]; } if ([stackModules objectForKey: fileName] == nil) { [stackModules setObject: module forKey: fileName]; } else { module = [stackModules objectForKey: fileName]; } } } GS_MUTEX_UNLOCK(modLock); if (module == (id)[NSNull null]) { module = nil; } return module; } static NSArray* GSListModules() { NSArray *result; GSLoadModule(nil); // initialise GS_MUTEX_LOCK(modLock); result = [stackModules allValues]; GS_MUTEX_UNLOCK(modLock); return result; } #endif /* USE_BFD */ #if defined(WITH_UNWIND) && !defined(HAVE_BACKTRACE) #include #if !defined(_WIN32) #include #endif struct GSBacktraceState { void **current; void **end; }; static _Unwind_Reason_Code GSUnwindCallback(struct _Unwind_Context* context, void* arg) { struct GSBacktraceState *state = (struct GSBacktraceState*)arg; uintptr_t pc = _Unwind_GetIP(context); if (pc) { if (state->current == state->end) { return _URC_END_OF_STACK; } else { *state->current++ = (void*)pc; } } return 0; //_URC_OK/_URC_NO_REASON } #endif /* WITH_UNWIND && !HAVE_BACKTRACE */ #if defined(_WIN32) && !defined(USE_BFD) typedef USHORT (WINAPI *CaptureStackBackTraceType)(ULONG,ULONG,PVOID*,PULONG); typedef BOOL (WINAPI *SymInitializeType)(HANDLE,char*,BOOL); typedef DWORD (WINAPI *SymSetOptionsType)(DWORD); typedef BOOL (WINAPI *SymFromAddrType)(HANDLE,DWORD64,PDWORD64,SYMBOL_INFO*); static CaptureStackBackTraceType capture = 0; static SymInitializeType initSym = 0; static SymSetOptionsType optSym = 0; static SymFromAddrType fromSym = 0; static HANDLE hProcess = 0; static gs_mutex_t traceLock; #define MAXFRAMES 62 /* Limitation of windows-xp */ #else #define MAXFRAMES 128 /* 1KB buffer on 64bit machine */ #endif #if !defined(HAVE_BUILTIN_EXTRACT_RETURN_ADDRESS) # define __builtin_extract_return_address(X) X #endif #define _NS_FRAME_HACK(a) \ case a: env->addr = __builtin_frame_address(a + 1); break; #define _NS_RETURN_HACK(a) \ case a: env->addr = (__builtin_frame_address(a + 1) ? \ __builtin_extract_return_address(__builtin_return_address(a + 1)) : 0); break; /* * The following horrible signal handling code is a workaround for the fact * that the __builtin_frame_address() and __builtin_return_address() * functions are not reliable (at least not on my EM64T based system) and * will sometimes walk off the stack and access illegal memory locations. * In order to prevent such an occurrance from crashing the application, * we use sigsetjmp() and siglongjmp() to ensure that we can recover, and * we keep the jump buffer in thread-local memory to avoid possible thread * safety issues. * Of course this will fail horribly if an exception occurs in one of the * few methods we use to manage the per-thread jump buffer. */ #if defined(HAVE_SYS_SIGNAL_H) # include #elif defined(HAVE_SIGNAL_H) # include #endif #if defined(_WIN32) #ifndef SIGBUS #define SIGBUS SIGILL #endif #endif /* sigsetjmp may be a function or a macro. The test for the function is * done at configure time so we can tell here if either is available. */ #if !defined(HAVE_SIGSETJMP) && !defined(sigsetjmp) #define siglongjmp(A,B) longjmp(A,B) #define sigsetjmp(A,B) setjmp(A) #define sigjmp_buf jmp_buf #endif typedef struct { sigjmp_buf buf; void *addr; void (*bus)(int); void (*segv)(int); } jbuf_type; static jbuf_type * jbuf() { NSMutableData *d; NSMutableDictionary *dict; dict = [[NSThread currentThread] threadDictionary]; d = [dict objectForKey: @"GSjbuf"]; if (d == nil) { d = [[NSMutableData alloc] initWithLength: sizeof(jbuf_type)]; [dict setObject: d forKey: @"GSjbuf"]; RELEASE(d); } return (jbuf_type*)[d mutableBytes]; } static void recover(int sig) { siglongjmp(jbuf()->buf, 1); } #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wframe-address" #else #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wframe-address" #endif void * NSFrameAddress(NSUInteger offset) { jbuf_type *env; env = jbuf(); if (sigsetjmp(env->buf, 1) == 0) { env->segv = signal(SIGSEGV, recover); env->bus = signal(SIGBUS, recover); switch (offset) { _NS_FRAME_HACK(0); _NS_FRAME_HACK(1); _NS_FRAME_HACK(2); _NS_FRAME_HACK(3); _NS_FRAME_HACK(4); _NS_FRAME_HACK(5); _NS_FRAME_HACK(6); _NS_FRAME_HACK(7); _NS_FRAME_HACK(8); _NS_FRAME_HACK(9); _NS_FRAME_HACK(10); _NS_FRAME_HACK(11); _NS_FRAME_HACK(12); _NS_FRAME_HACK(13); _NS_FRAME_HACK(14); _NS_FRAME_HACK(15); _NS_FRAME_HACK(16); _NS_FRAME_HACK(17); _NS_FRAME_HACK(18); _NS_FRAME_HACK(19); _NS_FRAME_HACK(20); _NS_FRAME_HACK(21); _NS_FRAME_HACK(22); _NS_FRAME_HACK(23); _NS_FRAME_HACK(24); _NS_FRAME_HACK(25); _NS_FRAME_HACK(26); _NS_FRAME_HACK(27); _NS_FRAME_HACK(28); _NS_FRAME_HACK(29); _NS_FRAME_HACK(30); _NS_FRAME_HACK(31); _NS_FRAME_HACK(32); _NS_FRAME_HACK(33); _NS_FRAME_HACK(34); _NS_FRAME_HACK(35); _NS_FRAME_HACK(36); _NS_FRAME_HACK(37); _NS_FRAME_HACK(38); _NS_FRAME_HACK(39); _NS_FRAME_HACK(40); _NS_FRAME_HACK(41); _NS_FRAME_HACK(42); _NS_FRAME_HACK(43); _NS_FRAME_HACK(44); _NS_FRAME_HACK(45); _NS_FRAME_HACK(46); _NS_FRAME_HACK(47); _NS_FRAME_HACK(48); _NS_FRAME_HACK(49); _NS_FRAME_HACK(50); _NS_FRAME_HACK(51); _NS_FRAME_HACK(52); _NS_FRAME_HACK(53); _NS_FRAME_HACK(54); _NS_FRAME_HACK(55); _NS_FRAME_HACK(56); _NS_FRAME_HACK(57); _NS_FRAME_HACK(58); _NS_FRAME_HACK(59); _NS_FRAME_HACK(60); _NS_FRAME_HACK(61); _NS_FRAME_HACK(62); _NS_FRAME_HACK(63); _NS_FRAME_HACK(64); _NS_FRAME_HACK(65); _NS_FRAME_HACK(66); _NS_FRAME_HACK(67); _NS_FRAME_HACK(68); _NS_FRAME_HACK(69); _NS_FRAME_HACK(70); _NS_FRAME_HACK(71); _NS_FRAME_HACK(72); _NS_FRAME_HACK(73); _NS_FRAME_HACK(74); _NS_FRAME_HACK(75); _NS_FRAME_HACK(76); _NS_FRAME_HACK(77); _NS_FRAME_HACK(78); _NS_FRAME_HACK(79); _NS_FRAME_HACK(80); _NS_FRAME_HACK(81); _NS_FRAME_HACK(82); _NS_FRAME_HACK(83); _NS_FRAME_HACK(84); _NS_FRAME_HACK(85); _NS_FRAME_HACK(86); _NS_FRAME_HACK(87); _NS_FRAME_HACK(88); _NS_FRAME_HACK(89); _NS_FRAME_HACK(90); _NS_FRAME_HACK(91); _NS_FRAME_HACK(92); _NS_FRAME_HACK(93); _NS_FRAME_HACK(94); _NS_FRAME_HACK(95); _NS_FRAME_HACK(96); _NS_FRAME_HACK(97); _NS_FRAME_HACK(98); _NS_FRAME_HACK(99); default: env->addr = NULL; break; } signal(SIGSEGV, env->segv); signal(SIGBUS, env->bus); } else { env = jbuf(); signal(SIGSEGV, env->segv); signal(SIGBUS, env->bus); env->addr = NULL; } return env->addr; } NSUInteger NSCountFrames(void) { jbuf_type *env; env = jbuf(); if (sigsetjmp(env->buf, 1) == 0) { env->segv = signal(SIGSEGV, recover); env->bus = signal(SIGBUS, recover); env->addr = 0; #define _NS_COUNT_HACK(X) if (__builtin_frame_address(X + 1) == 0) \ goto done; else env->addr = (void*)(X + 1); _NS_COUNT_HACK(0); _NS_COUNT_HACK(1); _NS_COUNT_HACK(2); _NS_COUNT_HACK(3); _NS_COUNT_HACK(4); _NS_COUNT_HACK(5); _NS_COUNT_HACK(6); _NS_COUNT_HACK(7); _NS_COUNT_HACK(8); _NS_COUNT_HACK(9); _NS_COUNT_HACK(10); _NS_COUNT_HACK(11); _NS_COUNT_HACK(12); _NS_COUNT_HACK(13); _NS_COUNT_HACK(14); _NS_COUNT_HACK(15); _NS_COUNT_HACK(16); _NS_COUNT_HACK(17); _NS_COUNT_HACK(18); _NS_COUNT_HACK(19); _NS_COUNT_HACK(20); _NS_COUNT_HACK(21); _NS_COUNT_HACK(22); _NS_COUNT_HACK(23); _NS_COUNT_HACK(24); _NS_COUNT_HACK(25); _NS_COUNT_HACK(26); _NS_COUNT_HACK(27); _NS_COUNT_HACK(28); _NS_COUNT_HACK(29); _NS_COUNT_HACK(30); _NS_COUNT_HACK(31); _NS_COUNT_HACK(32); _NS_COUNT_HACK(33); _NS_COUNT_HACK(34); _NS_COUNT_HACK(35); _NS_COUNT_HACK(36); _NS_COUNT_HACK(37); _NS_COUNT_HACK(38); _NS_COUNT_HACK(39); _NS_COUNT_HACK(40); _NS_COUNT_HACK(41); _NS_COUNT_HACK(42); _NS_COUNT_HACK(43); _NS_COUNT_HACK(44); _NS_COUNT_HACK(45); _NS_COUNT_HACK(46); _NS_COUNT_HACK(47); _NS_COUNT_HACK(48); _NS_COUNT_HACK(49); _NS_COUNT_HACK(50); _NS_COUNT_HACK(51); _NS_COUNT_HACK(52); _NS_COUNT_HACK(53); _NS_COUNT_HACK(54); _NS_COUNT_HACK(55); _NS_COUNT_HACK(56); _NS_COUNT_HACK(57); _NS_COUNT_HACK(58); _NS_COUNT_HACK(59); _NS_COUNT_HACK(60); _NS_COUNT_HACK(61); _NS_COUNT_HACK(62); _NS_COUNT_HACK(63); _NS_COUNT_HACK(64); _NS_COUNT_HACK(65); _NS_COUNT_HACK(66); _NS_COUNT_HACK(67); _NS_COUNT_HACK(68); _NS_COUNT_HACK(69); _NS_COUNT_HACK(70); _NS_COUNT_HACK(71); _NS_COUNT_HACK(72); _NS_COUNT_HACK(73); _NS_COUNT_HACK(74); _NS_COUNT_HACK(75); _NS_COUNT_HACK(76); _NS_COUNT_HACK(77); _NS_COUNT_HACK(78); _NS_COUNT_HACK(79); _NS_COUNT_HACK(80); _NS_COUNT_HACK(81); _NS_COUNT_HACK(82); _NS_COUNT_HACK(83); _NS_COUNT_HACK(84); _NS_COUNT_HACK(85); _NS_COUNT_HACK(86); _NS_COUNT_HACK(87); _NS_COUNT_HACK(88); _NS_COUNT_HACK(89); _NS_COUNT_HACK(90); _NS_COUNT_HACK(91); _NS_COUNT_HACK(92); _NS_COUNT_HACK(93); _NS_COUNT_HACK(94); _NS_COUNT_HACK(95); _NS_COUNT_HACK(96); _NS_COUNT_HACK(97); _NS_COUNT_HACK(98); _NS_COUNT_HACK(99); done: signal(SIGSEGV, env->segv); signal(SIGBUS, env->bus); } else { env = jbuf(); signal(SIGSEGV, env->segv); signal(SIGBUS, env->bus); } return (uintptr_t)env->addr; } void * NSReturnAddress(NSUInteger offset) { jbuf_type *env; env = jbuf(); if (sigsetjmp(env->buf, 1) == 0) { env->segv = signal(SIGSEGV, recover); env->bus = signal(SIGBUS, recover); switch (offset) { _NS_RETURN_HACK(0); _NS_RETURN_HACK(1); _NS_RETURN_HACK(2); _NS_RETURN_HACK(3); _NS_RETURN_HACK(4); _NS_RETURN_HACK(5); _NS_RETURN_HACK(6); _NS_RETURN_HACK(7); _NS_RETURN_HACK(8); _NS_RETURN_HACK(9); _NS_RETURN_HACK(10); _NS_RETURN_HACK(11); _NS_RETURN_HACK(12); _NS_RETURN_HACK(13); _NS_RETURN_HACK(14); _NS_RETURN_HACK(15); _NS_RETURN_HACK(16); _NS_RETURN_HACK(17); _NS_RETURN_HACK(18); _NS_RETURN_HACK(19); _NS_RETURN_HACK(20); _NS_RETURN_HACK(21); _NS_RETURN_HACK(22); _NS_RETURN_HACK(23); _NS_RETURN_HACK(24); _NS_RETURN_HACK(25); _NS_RETURN_HACK(26); _NS_RETURN_HACK(27); _NS_RETURN_HACK(28); _NS_RETURN_HACK(29); _NS_RETURN_HACK(30); _NS_RETURN_HACK(31); _NS_RETURN_HACK(32); _NS_RETURN_HACK(33); _NS_RETURN_HACK(34); _NS_RETURN_HACK(35); _NS_RETURN_HACK(36); _NS_RETURN_HACK(37); _NS_RETURN_HACK(38); _NS_RETURN_HACK(39); _NS_RETURN_HACK(40); _NS_RETURN_HACK(41); _NS_RETURN_HACK(42); _NS_RETURN_HACK(43); _NS_RETURN_HACK(44); _NS_RETURN_HACK(45); _NS_RETURN_HACK(46); _NS_RETURN_HACK(47); _NS_RETURN_HACK(48); _NS_RETURN_HACK(49); _NS_RETURN_HACK(50); _NS_RETURN_HACK(51); _NS_RETURN_HACK(52); _NS_RETURN_HACK(53); _NS_RETURN_HACK(54); _NS_RETURN_HACK(55); _NS_RETURN_HACK(56); _NS_RETURN_HACK(57); _NS_RETURN_HACK(58); _NS_RETURN_HACK(59); _NS_RETURN_HACK(60); _NS_RETURN_HACK(61); _NS_RETURN_HACK(62); _NS_RETURN_HACK(63); _NS_RETURN_HACK(64); _NS_RETURN_HACK(65); _NS_RETURN_HACK(66); _NS_RETURN_HACK(67); _NS_RETURN_HACK(68); _NS_RETURN_HACK(69); _NS_RETURN_HACK(70); _NS_RETURN_HACK(71); _NS_RETURN_HACK(72); _NS_RETURN_HACK(73); _NS_RETURN_HACK(74); _NS_RETURN_HACK(75); _NS_RETURN_HACK(76); _NS_RETURN_HACK(77); _NS_RETURN_HACK(78); _NS_RETURN_HACK(79); _NS_RETURN_HACK(80); _NS_RETURN_HACK(81); _NS_RETURN_HACK(82); _NS_RETURN_HACK(83); _NS_RETURN_HACK(84); _NS_RETURN_HACK(85); _NS_RETURN_HACK(86); _NS_RETURN_HACK(87); _NS_RETURN_HACK(88); _NS_RETURN_HACK(89); _NS_RETURN_HACK(90); _NS_RETURN_HACK(91); _NS_RETURN_HACK(92); _NS_RETURN_HACK(93); _NS_RETURN_HACK(94); _NS_RETURN_HACK(95); _NS_RETURN_HACK(96); _NS_RETURN_HACK(97); _NS_RETURN_HACK(98); _NS_RETURN_HACK(99); default: env->addr = NULL; break; } signal(SIGSEGV, env->segv); signal(SIGBUS, env->bus); } else { env = jbuf(); signal(SIGSEGV, env->segv); signal(SIGBUS, env->bus); env->addr = NULL; } return env->addr; } #ifdef __clang__ #pragma clang diagnostic pop #else #pragma GCC diagnostic pop #endif unsigned GSPrivateReturnAddresses(NSUInteger **returns) { unsigned numReturns; #if defined(_WIN32) && !defined(USE_BFD) NSUInteger addr[MAXFRAMES]; GS_MUTEX_LOCK(traceLock); if (0 == hProcess) { hProcess = GetCurrentProcess(); if (0 == capture) { HANDLE hModule; hModule = LoadLibrary("kernel32.dll"); if (0 == hModule) { fprintf(stderr, "Failed to load kernel32.dll with error: %d\n", (int)GetLastError()); GS_MUTEX_UNLOCK(traceLock); return 0; } capture = (CaptureStackBackTraceType)GetProcAddress( hModule, "RtlCaptureStackBackTrace"); if (0 == capture) { fprintf(stderr, "Failed to find RtlCaptureStackBackTrace: %d\n", (int)GetLastError()); GS_MUTEX_UNLOCK(traceLock); return 0; } hModule = LoadLibrary("dbghelp.dll"); if (0 == hModule) { fprintf(stderr, "Failed to load dbghelp.dll with error: %d\n", (int)GetLastError()); GS_MUTEX_UNLOCK(traceLock); return 0; } optSym = (SymSetOptionsType)GetProcAddress( hModule, "SymSetOptions"); if (0 == optSym) { fprintf(stderr, "Failed to find SymSetOptions: %d\n", (int)GetLastError()); GS_MUTEX_UNLOCK(traceLock); return 0; } initSym = (SymInitializeType)GetProcAddress( hModule, "SymInitialize"); if (0 == initSym) { fprintf(stderr, "Failed to find SymInitialize: %d\n", (int)GetLastError()); GS_MUTEX_UNLOCK(traceLock); return 0; } fromSym = (SymFromAddrType)GetProcAddress( hModule, "SymFromAddr"); if (0 == fromSym) { fprintf(stderr, "Failed to find SymFromAddr: %d\n", (int)GetLastError()); GS_MUTEX_UNLOCK(traceLock); return 0; } } (optSym)(SYMOPT_UNDNAME | SYMOPT_DEFERRED_LOADS); if (!(initSym)(hProcess, NULL, TRUE)) { fprintf(stderr, "SymInitialize failed with error: %d\n", (int)GetLastError()); fromSym = 0; GS_MUTEX_UNLOCK(traceLock); return 0; } } if (0 == capture) { GS_MUTEX_UNLOCK(traceLock); return 0; } numReturns = (capture)(0, MAXFRAMES, (void**)addr, NULL); if (numReturns > 0) { *returns = malloc(numReturns * sizeof(void*)); memcpy(*returns, addr, numReturns * sizeof(void*)); } GS_MUTEX_UNLOCK(traceLock); #elif defined(HAVE_BACKTRACE) void *addr[MAXFRAMES*sizeof(void*)]; numReturns = backtrace(addr, MAXFRAMES); if (numReturns > 0) { *returns = malloc(numReturns * sizeof(void*)); memcpy(*returns, addr, numReturns * sizeof(void*)); } #elif defined(WITH_UNWIND) void *addr[MAXFRAMES]; struct GSBacktraceState state = {addr, addr + MAXFRAMES}; _Unwind_Backtrace(GSUnwindCallback, &state); numReturns = state.current - addr; if (numReturns > 0) { *returns = malloc(numReturns * sizeof(void*)); memcpy(*returns, addr, numReturns * sizeof(void*)); } #else int n; n = NSCountFrames(); /* There should be more frame addresses than return addresses. */ if (n > 0) { n--; } if (n > 0) { n--; } if ((numReturns = n) > 0) { jbuf_type *env; *returns = malloc(numReturns * sizeof(void*)); env = jbuf(); if (sigsetjmp(env->buf, 1) == 0) { unsigned i; env->segv = signal(SIGSEGV, recover); env->bus = signal(SIGBUS, recover); for (i = 0; i < n; i++) { switch (i) { _NS_RETURN_HACK(0); _NS_RETURN_HACK(1); _NS_RETURN_HACK(2); _NS_RETURN_HACK(3); _NS_RETURN_HACK(4); _NS_RETURN_HACK(5); _NS_RETURN_HACK(6); _NS_RETURN_HACK(7); _NS_RETURN_HACK(8); _NS_RETURN_HACK(9); _NS_RETURN_HACK(10); _NS_RETURN_HACK(11); _NS_RETURN_HACK(12); _NS_RETURN_HACK(13); _NS_RETURN_HACK(14); _NS_RETURN_HACK(15); _NS_RETURN_HACK(16); _NS_RETURN_HACK(17); _NS_RETURN_HACK(18); _NS_RETURN_HACK(19); _NS_RETURN_HACK(20); _NS_RETURN_HACK(21); _NS_RETURN_HACK(22); _NS_RETURN_HACK(23); _NS_RETURN_HACK(24); _NS_RETURN_HACK(25); _NS_RETURN_HACK(26); _NS_RETURN_HACK(27); _NS_RETURN_HACK(28); _NS_RETURN_HACK(29); _NS_RETURN_HACK(30); _NS_RETURN_HACK(31); _NS_RETURN_HACK(32); _NS_RETURN_HACK(33); _NS_RETURN_HACK(34); _NS_RETURN_HACK(35); _NS_RETURN_HACK(36); _NS_RETURN_HACK(37); _NS_RETURN_HACK(38); _NS_RETURN_HACK(39); _NS_RETURN_HACK(40); _NS_RETURN_HACK(41); _NS_RETURN_HACK(42); _NS_RETURN_HACK(43); _NS_RETURN_HACK(44); _NS_RETURN_HACK(45); _NS_RETURN_HACK(46); _NS_RETURN_HACK(47); _NS_RETURN_HACK(48); _NS_RETURN_HACK(49); _NS_RETURN_HACK(50); _NS_RETURN_HACK(51); _NS_RETURN_HACK(52); _NS_RETURN_HACK(53); _NS_RETURN_HACK(54); _NS_RETURN_HACK(55); _NS_RETURN_HACK(56); _NS_RETURN_HACK(57); _NS_RETURN_HACK(58); _NS_RETURN_HACK(59); _NS_RETURN_HACK(60); _NS_RETURN_HACK(61); _NS_RETURN_HACK(62); _NS_RETURN_HACK(63); _NS_RETURN_HACK(64); _NS_RETURN_HACK(65); _NS_RETURN_HACK(66); _NS_RETURN_HACK(67); _NS_RETURN_HACK(68); _NS_RETURN_HACK(69); _NS_RETURN_HACK(70); _NS_RETURN_HACK(71); _NS_RETURN_HACK(72); _NS_RETURN_HACK(73); _NS_RETURN_HACK(74); _NS_RETURN_HACK(75); _NS_RETURN_HACK(76); _NS_RETURN_HACK(77); _NS_RETURN_HACK(78); _NS_RETURN_HACK(79); _NS_RETURN_HACK(80); _NS_RETURN_HACK(81); _NS_RETURN_HACK(82); _NS_RETURN_HACK(83); _NS_RETURN_HACK(84); _NS_RETURN_HACK(85); _NS_RETURN_HACK(86); _NS_RETURN_HACK(87); _NS_RETURN_HACK(88); _NS_RETURN_HACK(89); _NS_RETURN_HACK(90); _NS_RETURN_HACK(91); _NS_RETURN_HACK(92); _NS_RETURN_HACK(93); _NS_RETURN_HACK(94); _NS_RETURN_HACK(95); _NS_RETURN_HACK(96); _NS_RETURN_HACK(97); _NS_RETURN_HACK(98); _NS_RETURN_HACK(99); default: env->addr = 0; break; } if (env->addr == 0) { break; } memcpy(&(*returns)[i], env->addr, sizeof(void*)); } signal(SIGSEGV, env->segv); signal(SIGBUS, env->bus); } else { env = jbuf(); signal(SIGSEGV, env->segv); signal(SIGBUS, env->bus); } } #endif return numReturns; } @implementation GSStackTrace : NSObject /** Offset from the top of the stack (when we generate a trace) to the * first frame likely to be of interest for debugging. */ #define FrameOffset 4 + (void) initialize { #if defined(_WIN32) && !defined(USE_BFD) GS_MUTEX_INIT_RECURSIVE(traceLock); #endif #if defined(USE_BFD) GS_MUTEX_INIT_RECURSIVE(modLock); #endif } - (NSArray*) addresses { if (nil == addresses && numReturns > FrameOffset) { ENTER_POOL NSInteger count = numReturns - FrameOffset; NSValue *objects[count]; NSUInteger index; void **ptrs = (void **)returns; for (index = 0; index < count; index++) { objects[index] = [NSValue valueWithPointer: ptrs[FrameOffset+index]]; } addresses = [[NSArray alloc] initWithObjects: objects count: count]; LEAVE_POOL } return addresses; } - (oneway void) dealloc { DESTROY(addresses); DESTROY(symbols); if (returns != NULL) { free(returns); returns = NULL; } [super dealloc]; } - (NSString*) description { NSMutableString *result; NSArray *s; int i; int n; result = [NSMutableString string]; s = [self symbols]; n = [s count]; for (i = 0; i < n; i++) { NSString *line = [s objectAtIndex: i]; [result appendFormat: @"%3d: %@\n", i, line]; } return result; } - (id) init { return self; } - (NSArray*) symbols { if (nil == symbols && numReturns > FrameOffset) { NSInteger count = numReturns - FrameOffset; NSUInteger i; #if defined(USE_BFD) void **ptrs = (void**)&returns[FrameOffset]; NSMutableArray *a; a = [[NSMutableArray alloc] initWithCapacity: count]; for (i = 0; i < count; i++) { GSFunctionInfo *aFrame = nil; void *address = (void*)*ptrs++; void *base; NSString *modulePath; GSBinaryFileInfo *bfi; modulePath = GSPrivateBaseAddress(address, &base); if (modulePath != nil && (bfi = GSLoadModule(modulePath)) != nil) { aFrame = [bfi functionForAddress: (void*)(address - base)]; if (aFrame == nil) { /* We know we have the right module but function lookup * failed ... perhaps we need to use the absolute * address rather than offest by 'base' in this case. */ aFrame = [bfi functionForAddress: address]; } } else { NSArray *modules; int j; int m; modules = GSListModules(); m = [modules count]; for (j = 0; j < m; j++) { bfi = [modules objectAtIndex: j]; if ((id)bfi != (id)[NSNull null]) { aFrame = [bfi functionForAddress: address]; if (aFrame != nil) { break; } } } } // not found (?!), add an 'unknown' function if (aFrame == nil) { aFrame = [GSFunctionInfo alloc]; [aFrame initWithModule: nil address: address file: nil function: nil line: 0]; [aFrame autorelease]; } [a addObject: [aFrame description]]; } symbols = [a copy]; [a release]; #elif defined(_WIN32) void **ptrs = (void**)&returns[FrameOffset]; SYMBOL_INFO *symbol; NSString *syms[MAXFRAMES]; symbol = (SYMBOL_INFO *)calloc(sizeof(SYMBOL_INFO) + 1024 * sizeof(char), 1); symbol->MaxNameLen = 1024; symbol->SizeOfStruct = sizeof(SYMBOL_INFO); GS_MUTEX_LOCK(traceLock); for (i = 0; i < count; i++) { NSUInteger addr = (NSUInteger)*ptrs++; if ((fromSym)(hProcess, (DWORD64)addr, 0, symbol)) { syms[i] = [NSString stringWithFormat: @"%s - %lx", symbol->Name, (unsigned long)addr]; } else { syms[i] = [NSString stringWithFormat: @"unknown - %lx", (unsigned long)addr]; } } GS_MUTEX_UNLOCK(traceLock); free(symbol); symbols = [[NSArray alloc] initWithObjects: syms count: count]; #elif defined(HAVE_BACKTRACE) void **ptrs = (void**)&returns[FrameOffset]; char **strs; NSString **symbolArray; strs = backtrace_symbols(ptrs, count); symbolArray = alloca(count * sizeof(NSString*)); for (i = 0; i < count; i++) { symbolArray[i] = [NSString stringWithUTF8String: strs[i]]; } symbols = [[NSArray alloc] initWithObjects: symbolArray count: count]; free(strs); #elif defined(WITH_UNWIND) void **ptrs = (void**)&returns[FrameOffset]; NSString **symbolArray; symbolArray = alloca(count * sizeof(NSString*)); for (i = 0; i < count; i++) { const void *addr = ptrs[i]; Dl_info info; if (dladdr(addr, &info)) { const char *libname = "unknown"; if (info.dli_fname) { // strip library path char *delim = strrchr(info.dli_fname, '/'); libname = delim ? delim + 1 : info.dli_fname; } if (info.dli_sname) { symbolArray[i] = [NSString stringWithFormat: @"%lu: %p %s %s + %d", (unsigned long)i, addr, libname, info.dli_sname, (int)(addr - info.dli_saddr)]; } else { symbolArray[i] = [NSString stringWithFormat: @"%lu: %p %s unknown", (unsigned long)i, addr, libname]; } } else { symbolArray[i] = [NSString stringWithFormat: @"%lu: %p unknown", (unsigned long)i, addr]; } } symbols = [[NSArray alloc] initWithObjects: symbolArray count: count]; #else NSMutableArray *a; symbols = a = [[self addresses] mutableCopy]; for (i = 0; i < count; i++) { NSString *s; s = [[NSString alloc] initWithFormat: @"%p: symbol not available", [[a objectAtIndex: i] pointerValue]]; [a replaceObjectAtIndex: i withObject: s]; RELEASE(s); } #endif } return symbols; } - (void) trace { DESTROY(addresses); DESTROY(symbols); if (returns != NULL) { free(returns); returns = NULL; } numReturns = GSPrivateReturnAddresses(&returns); } @end GS_DECLARE NSString* const NSCharacterConversionException = @"NSCharacterConversionException"; GS_DECLARE NSString* const NSGenericException = @"NSGenericException"; GS_DECLARE NSString* const NSInternalInconsistencyException = @"NSInternalInconsistencyException"; GS_DECLARE NSString* const NSInvalidArgumentException = @"NSInvalidArgumentException"; GS_DECLARE NSString* const NSMallocException = @"NSMallocException"; GS_DECLARE NSString* const NSOldStyleException = @"NSOldStyleException"; GS_DECLARE NSString* const NSParseErrorException = @"NSParseErrorException"; GS_DECLARE NSString* const NSRangeException = @"NSRangeException"; static void _terminate() { BOOL shouldAbort; #ifdef DEBUG shouldAbort = YES; // abort() by default. #else shouldAbort = NO; // exit() by default. #endif shouldAbort = GSPrivateEnvironmentFlag("CRASH_ON_ABORT", shouldAbort); if (shouldAbort == YES) { abort(); } else { exit(1); } } static void _NSFoundationUncaughtExceptionHandler (NSException *exception) { NSAutoreleasePool *pool = [NSAutoreleasePool new]; fprintf(stderr, "%s: Uncaught exception %s, reason: %s\n", GSPrivateArgZero(), [[exception name] lossyCString], [[exception reason] lossyCString]); fflush(stderr); /* NEEDED UNDER MINGW */ if (GSPrivateEnvironmentFlag("GNUSTEP_STACK_TRACE", NO) == YES || GSPrivateDefaultsFlag(GSExceptionStackTrace) == YES) { fprintf(stderr, "Stack\n%s\n", [[[exception _callStack] description] lossyCString]); } fflush(stderr); /* NEEDED UNDER MINGW */ [pool drain]; _terminate(); } static void callUncaughtHandler(id value) { if (_NSUncaughtExceptionHandler != NULL) { (*_NSUncaughtExceptionHandler)(value); } /* The uncaught exception handler which is set has not exited, * so we MUST call the builtin handler, (normal behavior of MacOS-X). * The standard handler is guaranteed to exit/abort, which is the * required behavior for OSX compatibility. * NB Cocoa's Exception Handling framework might bypass this behavior * somehow (it's not clear if it does that or simply wraps various * things with its own exception handlers thus preventing the * uncaught handler from ever being needed) ... if anyone contributes * an implementation, perhaps we could integrate it here. */ _NSFoundationUncaughtExceptionHandler(value); } @implementation NSException + (void) initialize { if (self == [NSException class]) { #if defined(_NATIVE_OBJC_EXCEPTIONS) # ifdef HAVE_SET_UNCAUGHT_EXCEPTION_HANDLER objc_setUncaughtExceptionHandler(callUncaughtHandler); # elif defined(HAVE_UNEXPECTED) _objc_unexpected_exception = callUncaughtHandler; # elif defined(HAVE_SET_UNEXPECTED) objc_set_unexpected(callUncaughtHandler); # endif #endif } } + (NSException*) exceptionWithName: (NSString*)name reason: (NSString*)reason userInfo: (NSDictionary*)userInfo { return AUTORELEASE([[self alloc] initWithName: name reason: reason userInfo: userInfo]); } + (void) raise: (NSString*)name format: (NSString*)format,... { va_list args; va_start(args, format); [self raise: name format: format arguments: args]; // This probably doesn't matter, but va_end won't get called va_end(args); while (1); // does not return } + (void) raise: (NSString*)name format: (NSString*)format arguments: (va_list)argList { NSString *reason; NSException *except; reason = [NSString stringWithFormat: format arguments: argList]; except = [self exceptionWithName: name reason: reason userInfo: nil]; [except raise]; while (1); // does not return } /* For OSX compatibility -init returns nil. */ - (id) init { DESTROY(self); return nil; } - (id) initWithName: (NSString*)name reason: (NSString*)reason userInfo: (NSDictionary*)userInfo { ASSIGN(_e_name, name); ASSIGN(_e_reason, reason); if (userInfo != nil) { if (_reserved == 0) { _reserved = NSZoneCalloc([self zone], 2, sizeof(id)); } ASSIGN(_e_info, userInfo); } return self; } - (NSArray*) callStackReturnAddresses { if (_reserved == 0) { return nil; } return [_e_stack addresses]; } - (NSArray *) callStackSymbols { if (_reserved == 0) { return nil; } return [_e_stack symbols]; } - (void) dealloc { DESTROY(_e_name); DESTROY(_e_reason); if (_reserved != 0) { DESTROY(_e_info); DESTROY(_e_stack); NSZoneFree([self zone], _reserved); _reserved = 0; } [super dealloc]; } - (NSString*) description { NSAutoreleasePool *pool = [NSAutoreleasePool new]; NSString *result; if (_e_name == nil) { [NSException raise: NSInvalidArgumentException format: @"Atttempt to use uninitialised NSException"]; } if (_reserved != 0) { if (_e_stack != nil && (GSPrivateEnvironmentFlag("GNUSTEP_STACK_TRACE", NO) == YES || GSPrivateDefaultsFlag(GSExceptionStackTrace) == YES)) { if (_e_info != nil) { result = [NSString stringWithFormat: @"%@ NAME:%@ REASON:%@ INFO:%@ STACK:%@", [super description], _e_name, _e_reason, _e_info, _e_stack]; } else { result = [NSString stringWithFormat: @"%@ NAME:%@ REASON:%@ STACK:%@", [super description], _e_name, _e_reason, _e_stack]; } } else { result = [NSString stringWithFormat: @"%@ NAME:%@ REASON:%@ INFO:%@", [super description], _e_name, _e_reason, _e_info]; } } else { result = [NSString stringWithFormat: @"%@ NAME:%@ REASON:%@", [super description], _e_name, _e_reason]; } [result retain]; [pool drain]; return [result autorelease]; } - (void) raise { if (_reserved == 0) { _reserved = NSZoneCalloc([self zone], 2, sizeof(id)); } if (nil == _e_stack) { // Only set the stack when first raised _e_stack = [GSStackTrace new]; [_e_stack trace]; } #if defined(_NATIVE_OBJC_EXCEPTIONS) @throw self; #else { NSThread *thread; NSHandler *handler; thread = GSCurrentThread(); handler = thread->_exception_handler; if (NULL == handler) { static int recursion = 0; /* * Set/check a counter to prevent recursive uncaught exceptions. * Allow a little recursion in case we have different handlers * being tried. */ if (recursion++ > 3) { fprintf(stderr, "recursion encountered handling uncaught exception\n"); fflush(stderr); /* NEEDED UNDER MINGW */ _terminate(); } /* * Call the uncaught exception handler (if there is one). * The calls the built-in default handler to terminate the program! */ callUncaughtHandler(self); } else { thread->_exception_handler = handler->next; handler->exception = self; longjmp(handler->jumpState, 1); } } #endif while (1); // does not return } - (NSString*) name { if (_e_name != nil) { return _e_name; } else { return NSStringFromClass([self class]); } } - (NSString*) reason { if (_e_reason != nil) { return _e_reason; } else { return @"unspecified reason"; } } - (NSDictionary*) userInfo { if (_reserved == 0) { return nil; } return _e_info; } - (Class) classForPortCoder { return [self class]; } - (id) replacementObjectForPortCoder: (NSPortCoder*)aCoder { return self; } - (void) encodeWithCoder: (NSCoder*)aCoder { id info = (_reserved == 0) ? nil : _e_info; [aCoder encodeValueOfObjCType: @encode(id) at: &_e_name]; [aCoder encodeValueOfObjCType: @encode(id) at: &_e_reason]; [aCoder encodeValueOfObjCType: @encode(id) at: &info]; } - (id) initWithCoder: (NSCoder*)aDecoder { id info; [aDecoder decodeValueOfObjCType: @encode(id) at: &_e_name]; [aDecoder decodeValueOfObjCType: @encode(id) at: &_e_reason]; [aDecoder decodeValueOfObjCType: @encode(id) at: &info]; if (info != nil) { if (_reserved == 0) { _reserved = NSZoneCalloc([self zone], 2, sizeof(id)); } _e_info = info; } return self; } - (id) copyWithZone: (NSZone*)zone { if (NSShouldRetainWithZone(self, zone)) { return RETAIN(self); } else { return [[[self class] alloc] initWithName: [self name] reason: [self reason] userInfo: [self userInfo]]; } } @end @implementation NSException (GSPrivate) - (GSStackTrace*) _callStack { if (_reserved == 0) { return nil; } return _e_stack; } @end @implementation NSThread (CallStackSymbols) + (NSArray *) callStackSymbols { GSStackTrace *stackTrace = AUTORELEASE([GSStackTrace new]); [stackTrace trace]; return [stackTrace symbols]; } @end void _NSAddHandler (NSHandler* handler) { NSThread *thread; thread = GSCurrentThread(); #if defined(_WIN32) && defined(DEBUG) if (thread->_exception_handler && IsBadReadPtr(thread->_exception_handler, sizeof(NSHandler))) { fprintf(stderr, "ERROR: Current exception handler is bogus.\n"); } #endif handler->next = thread->_exception_handler; thread->_exception_handler = handler; } void _NSRemoveHandler (NSHandler* handler) { NSThread *thread; thread = GSCurrentThread(); #if defined(DEBUG) if (thread->_exception_handler != handler) { fprintf(stderr, "ERROR: Removing exception handler that is not on top " "of the stack. (You probably called return in an NS_DURING block.)\n"); } #if defined(_WIN32) if (IsBadReadPtr(handler, sizeof(NSHandler))) { fprintf(stderr, "ERROR: Could not remove exception handler, " "handler is bad pointer.\n"); thread->_exception_handler = 0; return; } if (handler->next && IsBadReadPtr(handler->next, sizeof(NSHandler))) { fprintf(stderr, "ERROR: Could not restore exception handler, " "handler->next is bad pointer.\n"); thread->_exception_handler = 0; return; } #endif #endif thread->_exception_handler = handler->next; } NSUncaughtExceptionHandler * NSGetUncaughtExceptionHandler() { return _NSUncaughtExceptionHandler; } void NSSetUncaughtExceptionHandler(NSUncaughtExceptionHandler *handler) { _NSUncaughtExceptionHandler = handler; } gnustep-base-1.29.0/Source/NSExtensionContext.m000066400000000000000000000031531435650067400214140ustar00rootroot00000000000000/* Implementation of class NSExtensionContext Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory Casamento Date: Sun Nov 10 03:59:38 EST 2019 This file is part of the GNUstep Library. 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 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 USA. */ #include #include #include #include #include @implementation NSExtensionContext - (void) setInputItems: (NSArray *)inputItems { ASSIGNCOPY(_inputItems, inputItems); } - (NSArray *) inputItems { return _inputItems; } - (void)completeRequestReturningItems: (NSArray *)items completionHandler: (GSExtensionContextReturningItemsCompletionHandler)completionHandler { } - (void)cancelRequestWithError:(NSError *)error { } - (void)openURL: (NSURL *)URL completionHandler: (GSOpenURLCompletionHandler)completionHandler { } @end gnustep-base-1.29.0/Source/NSExtensionItem.m000066400000000000000000000034131435650067400206650ustar00rootroot00000000000000/* Implementation of class NSExtensionItem Copyright (C) 2019 Free Software Foundation, Inc. By: heron Date: Sun Nov 10 03:59:46 EST 2019 This file is part of the GNUstep Library. 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 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 USA. */ #include #include #include #include @implementation NSExtensionItem - (NSAttributedString *) attributedTitle { return _attributedTitle; } - (void) setAttributedTitle: (NSAttributedString *)string { ASSIGNCOPY(_attributedTitle, string); } - (NSAttributedString *) attributedContentText { return _attributedContentText; } - (void) setAttributedContentText: (NSAttributedString *)string { ASSIGNCOPY(_attributedContentText, string); } - (NSArray *) attachments { return _attachments; } - (void) setAttachments: (NSArray *)attachments { ASSIGNCOPY(_attachments, attachments); } - (NSDictionary *) userInfo { return _userInfo; } - (void) setUserInfo: (NSDictionary *) userInfo { ASSIGNCOPY(_userInfo, userInfo); } @end gnustep-base-1.29.0/Source/NSFileCoordinator.m000066400000000000000000000215341435650067400211610ustar00rootroot00000000000000/* Definition of class NSFileCoordinator Copyright (C) 2019 Free Software Foundation, Inc. Implemented by: Gregory Casamento Date: Sep 2019 Original File by: Daniel Ferreira This file is part of the GNUstep Library. 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 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 USA. */ #import #import #import #import #import #import #import static NSMutableArray *__presenters = nil; static NSMutableDictionary *__presenterMap = nil; static unsigned int __pid = 0; static NSMutableDictionary *__presenterIdDict = nil; @implementation NSFileAccessIntent - (instancetype) init { self = [super init]; if (self != nil) { _url = nil; _isRead = NO; _options = 0L; } return self; } + (instancetype) readingIntentWithURL: (NSURL *)url options: (NSFileCoordinatorReadingOptions)options { NSFileAccessIntent *result = [[self alloc] init]; ASSIGNCOPY(result->_url, url); result->_options = options; result->_isRead = YES; return AUTORELEASE(result); } + (instancetype) writingIntentWithURL: (NSURL *)url options: (NSFileCoordinatorWritingOptions)options { NSFileAccessIntent *result = [[self alloc] init]; ASSIGNCOPY(result->_url, url); result->_options = options; result->_isRead = NO; return AUTORELEASE(result); } - (NSURL *) URL { return _url; } @end @implementation NSFileCoordinator + (void) initialize { if (self == [NSFileCoordinator class]) { __presenters = [[NSMutableArray alloc] init]; __presenterMap = [[NSMutableDictionary alloc] init]; __presenterIdDict = [[NSMutableDictionary alloc] init]; } } + (NSArray *) filePresenters { return __presenters; } + (void) addFilePresenter: (id)presenter { [__presenters addObject: presenter]; [__presenterMap setObject: presenter forKey: [presenter presentedItemURL]]; [__presenterIdDict setObject: presenter forKey: [presenter purposeIdentifier]]; } + (void) removeFilePresenter: (id)presenter { [__presenters removeObject: presenter]; [__presenterMap removeObjectForKey: [presenter presentedItemURL]]; [__presenterIdDict removeObjectForKey: [presenter purposeIdentifier]]; } - (instancetype) init { self = [super init]; if (self != nil) { NSString *p = nil; __pid++; p = [NSString stringWithFormat: @"%d",__pid]; _purposeIdentifier = RETAIN(p); _isCancelled = NO; } return self; } - (NSString *) purposeIdentifier { return _purposeIdentifier; } - (void) setPurposeIdentifier: (NSString *)ident // copy { ASSIGNCOPY(_purposeIdentifier, ident); } - (void)cancel { NSEnumerator *en = [__presenters objectEnumerator]; id obj = nil; while ((obj = [en nextObject]) != nil) { id o = (id)obj; NSOperationQueue *q = [o presentedItemOperationQueue]; [q cancelAllOperations]; } _isCancelled = YES; } - (void)coordinateAccessWithIntents: (NSArray *)intents queue: (NSOperationQueue *)queue byAccessor: (GSAccessorCallbackHandler)accessor { NSEnumerator *en = [intents objectEnumerator]; id obj = nil; while ((obj = [en nextObject]) != nil) { NSBlockOperation *op; op = [NSBlockOperation blockOperationWithBlock: (GSBlockOperationBlock)accessor]; [queue addOperation: op]; } } - (void) coordinateReadingItemAtURL: (NSURL *)readingURL options: (NSFileCoordinatorReadingOptions)readingOptions writingItemAtURL: (NSURL *)writingURL options: (NSFileCoordinatorWritingOptions)writingOptions error: (NSError **)outError byAccessor: (GSNoEscapeReadWriteHandler)readerWriter { if (readingOptions == 0L) { id p = [__presenterMap objectForKey: readingURL]; if ([p respondsToSelector: @selector(savePresentedItemChangesWithCompletionHandler:)]) { [p savePresentedItemChangesWithCompletionHandler: NULL]; } } if (writingOptions == 0L) { id p = [__presenterMap objectForKey: writingURL]; if ([p respondsToSelector: @selector(savePresentedItemChangesWithCompletionHandler:)]) { [p savePresentedItemChangesWithCompletionHandler: NULL]; } } CALL_BLOCK(readerWriter, readingURL, writingURL); } - (void) coordinateReadingItemAtURL: (NSURL *)url options: (NSFileCoordinatorReadingOptions)options error: (NSError **)outError byAccessor: (GSNoEscapeNewURLHandler)reader { if (options == 0L) { id p = [__presenterMap objectForKey: url]; if ([p respondsToSelector: @selector(savePresentedItemChangesWithCompletionHandler:)]) { [p savePresentedItemChangesWithCompletionHandler: NULL]; } } CALL_BLOCK(reader, url); } - (void) coordinateWritingItemAtURL: (NSURL *)url options: (NSFileCoordinatorWritingOptions)options error: (NSError **)outError byAccessor: (GSNoEscapeNewURLHandler)writer { if (options == 0L) { id p = [__presenterMap objectForKey: url]; if ([p respondsToSelector: @selector(savePresentedItemChangesWithCompletionHandler:)]) { [p savePresentedItemChangesWithCompletionHandler: NULL]; } } CALL_BLOCK(writer, url); } - (void) coordinateWritingItemAtURL: (NSURL *)url1 options: (NSFileCoordinatorWritingOptions)options1 writingItemAtURL: (NSURL *)url2 options: (NSFileCoordinatorWritingOptions)options2 error: (NSError **)outError byAccessor: (GSDualWriteURLCallbackHandler)writer { if (options1 == 0L) { id p = [__presenterMap objectForKey: url1]; if ([p respondsToSelector: @selector(savePresentedItemChangesWithCompletionHandler:)]) { [p savePresentedItemChangesWithCompletionHandler: NULL]; } } if (options2 == 0L) { id p = [__presenterMap objectForKey: url2]; if ([p respondsToSelector: @selector(savePresentedItemChangesWithCompletionHandler:)]) { [p savePresentedItemChangesWithCompletionHandler: NULL]; } } CALL_BLOCK(writer, url1, url2); } - (void) itemAtURL: (NSURL *)oldURL didMoveToURL: (NSURL *)newURL { id presenter = [__presenterMap objectForKey: oldURL]; [presenter presentedItemDidMoveToURL: newURL]; } - (void) itemAtURL: (NSURL *)oldURL willMoveToURL: (NSURL *)newURL { id presenter = [__presenterMap objectForKey: oldURL]; [presenter presentedItemDidChange]; // there is no "Will" method for this, so I am a bit perplexed. } - (void) itemAtURL: (NSURL *)url didChangeUbiquityAttributes: (NSSet *)attributes { id presenter = [__presenterMap objectForKey: url]; [presenter presentedItemDidChangeUbiquityAttributes: attributes]; } - (void) prepareForReadingItemsAtURLs: (NSArray *)readingURLs options: (NSFileCoordinatorReadingOptions)readingOptions writingItemsAtURLs: (NSArray *)writingURLs options: (NSFileCoordinatorWritingOptions)writingOptions error: (NSError **)outError byAccessor: (GSBatchAccessorCompositeBlock)batchAccessor { if (readingOptions == 0L) { NSEnumerator *en = [readingURLs objectEnumerator]; NSURL *aurl = nil; while ((aurl = [en nextObject]) != nil) { id p = [__presenterMap objectForKey: aurl]; if ([p respondsToSelector: @selector(savePresentedItemChangesWithCompletionHandler:)]) { [p savePresentedItemChangesWithCompletionHandler: NULL]; } } } // CALL_BLOCK(batchAccessor, batchAccessor.argTys[0]); // NOT SURE HOW TO CALL COMPOSITE BLOCK } @end gnustep-base-1.29.0/Source/NSFileHandle.m000066400000000000000000000724061435650067400200750ustar00rootroot00000000000000/** Implementation for NSFileHandle for GNUStep Copyright (C) 1997 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 1997 This file is part of the GNUstep Base Library. 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 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 USA. NSFileHandle class reference $Date$ $Revision$ */ #import "common.h" #define EXPOSE_NSFileHandle_IVARS 1 #import "Foundation/NSData.h" #import "Foundation/NSException.h" #import "Foundation/NSHost.h" #import "Foundation/NSFileHandle.h" #import "Foundation/NSPathUtilities.h" #import "Foundation/NSURL.h" #import "GNUstepBase/GSTLS.h" #import "GNUstepBase/NSString+GNUstepBase.h" #import "GSPrivate.h" #import "GSNetwork.h" #define EXPOSE_GSFileHandle_IVARS 1 #import "GSFileHandle.h" static Class NSFileHandle_abstract_class = nil; static Class NSFileHandle_concrete_class = nil; static Class NSFileHandle_ssl_class = nil; #if defined(HAVE_GNUTLS) @interface GSTLSHandle : GSFileHandle { @public NSDictionary *opts; GSTLSSession *session; } - (void) sslDisconnect; - (BOOL) sslHandshakeEstablished: (BOOL*)result outgoing: (BOOL)isOutgoing; - (NSDictionary*) sslOptions; - (NSString*) sslSetOptions: (NSDictionary*)options; @end #endif /** *

* NSFileHandle is a class that provides a wrapper for accessing * system files and socket connections. You can open connections to a * file using class methods such as +fileHandleForReadingAtPath:. *

*

* GNUstep extends the use of this class to allow you to create * network connections (sockets), secure connections and also allows * you to use compression with these files and connections (as long as * GNUstep Base was compiled with the zlib library). *

*/ @implementation NSFileHandle + (void) initialize { if (self == [NSFileHandle class]) { NSFileHandle_abstract_class = self; NSFileHandle_concrete_class = [GSFileHandle class]; #if defined(HAVE_GNUTLS) NSFileHandle_ssl_class = [GSTLSHandle class]; #endif } } + (id) allocWithZone: (NSZone*)z { if (self == NSFileHandle_abstract_class) { return NSAllocateObject (NSFileHandle_concrete_class, 0, z); } else { return NSAllocateObject (self, 0, z); } } // Allocating and Initializing a FileHandle Object /** * Returns an NSFileHandle object set up for reading from the * file listed at path. If the file does not exist or cannot * be opened for some other reason, nil is returned. */ + (id) fileHandleForReadingAtPath: (NSString*)path { id o = [self allocWithZone: NSDefaultMallocZone()]; return AUTORELEASE([o initForReadingAtPath: path]); } /** * Returns an NSFileHandle object set up for writing to the * file listed at path. If the file does not exist or cannot * be opened for some other reason, nil is returned. */ + (id) fileHandleForWritingAtPath: (NSString*)path { id o = [self allocWithZone: NSDefaultMallocZone()]; return AUTORELEASE([o initForWritingAtPath: path]); } /** * Returns an NSFileHandle object setup for updating (reading and * writing) from the file listed at path. If the file does not exist * or cannot be opened for some other reason, nil is returned. */ + (id) fileHandleForUpdatingAtPath: (NSString*)path { id o = [self allocWithZone: NSDefaultMallocZone()]; return AUTORELEASE([o initForUpdatingAtPath: path]); } /** * Returns an NSFileHandle object for the standard error * descriptor. The returned object is a shared instance as there can only be * one standard error per process. */ + (id) fileHandleWithStandardError { id o = [self allocWithZone: NSDefaultMallocZone()]; return AUTORELEASE([o initWithStandardError]); } /** * Returns an NSFileHandle object for the standard input * descriptor. The returned object is a shared instance as there can only be * one standard input per process. */ + (id) fileHandleWithStandardInput { id o = [self allocWithZone: NSDefaultMallocZone()]; return AUTORELEASE([o initWithStandardInput]); } /** * Returns an NSFileHandle object for the standard output * descriptor. The returned object is a shared instance as there can only be * one standard output per process. */ + (id) fileHandleWithStandardOutput { id o = [self allocWithZone: NSDefaultMallocZone()]; return AUTORELEASE([o initWithStandardOutput]); } /** * Returns a file handle object that is connected to the null device * (i.e. a device that does nothing.) It is typically used in arrays * and other collections of file handle objects as a place holder * (null) object, so that all objects can respond to the same * messages. */ + (id) fileHandleWithNullDevice { id o = [self allocWithZone: NSDefaultMallocZone()]; return AUTORELEASE([o initWithNullDevice]); } + (id) fileHandleForReadingFromURL: (NSURL*)url error:(NSError**)error { id o = [self fileHandleForReadingAtPath: [url path]]; if (!o && error) { *error = [NSError _last]; } return o; } + (id) fileHandleForWritingToURL: (NSURL*)url error:(NSError**)error { id o = [self fileHandleForWritingAtPath: [url path]]; if (!o && error) { *error = [NSError _last]; } return o; } + (id) fileHandleForUpdatingURL: (NSURL*)url error:(NSError**)error { id o = [self fileHandleForUpdatingAtPath: [url path]]; if (!o && error) { *error = [NSError _last]; } return o; } /** * Initialize with desc, which can point to either a regular file or * socket connection. */ - (id) initWithFileDescriptor: (int)desc { return [self initWithFileDescriptor: desc closeOnDealloc: NO]; } /** * Initialize with desc, which can point to either a regular file or * socket connection. Close desc when this instance is deallocated if * flag is YES. */ - (id) initWithFileDescriptor: (int)desc closeOnDealloc: (BOOL)flag { [self subclassResponsibility: _cmd]; return nil; } /** * Windows-Unix compatibility support. */ - (id) initWithNativeHandle: (void*)hdl { return [self initWithNativeHandle: hdl closeOnDealloc: NO]; } // This is the designated initializer. /** * * Windows-Unix compatibility support. */ - (id) initWithNativeHandle: (void*)hdl closeOnDealloc: (BOOL)flag { [self subclassResponsibility: _cmd]; return nil; } // Returning file handles /** * Return the underlying file descriptor for this instance. */ - (int) fileDescriptor { [self subclassResponsibility: _cmd]; return -1; } /** * Windows-Unix compatibility support. */ - (void*) nativeHandle { [self subclassResponsibility: _cmd]; return 0; } // Synchronous I/O operations /** * Synchronously returns data available through this file or connection. * If the handle represents a file, the entire contents from current file * pointer to end are returned. If this is a network connection, reads * what is available, blocking if nothing is available. Raises * NSFileHandleOperationException if problem encountered. */ - (NSData*) availableData { [self subclassResponsibility: _cmd]; return nil; } /** * Reads up to maximum unsigned int bytes from file or communications * channel into return data.
* If the file is empty, returns an empty data item. */ - (NSData*) readDataToEndOfFile { [self subclassResponsibility: _cmd]; return nil; } /** * Reads up to len bytes from file or communications channel into return data. */ - (NSData*) readDataOfLength: (unsigned int)len { [self subclassResponsibility: _cmd]; return nil; } /** * Synchronously writes given data item to file or connection. */ - (void) writeData: (NSData*)item { [self subclassResponsibility: _cmd]; } // Asynchronous I/O operations /** * Asynchronously accept a stream-type socket connection and act as the * (server) end of the communications channel. This instance should have * been created by -initWithFileDescriptor: with a stream-type socket created * by the appropriate system routine. Posts a * NSFileHandleConnectionAcceptedNotification when connection * initiated, returning an NSFileHandle for the client side with * that notification. */ - (void) acceptConnectionInBackgroundAndNotify { [self acceptConnectionInBackgroundAndNotifyForModes: nil]; } /** *

Asynchronously accept a stream-type socket connection and act as the * (server) end of the communications channel. This instance should have * been created by -initWithFileDescriptor: with a stream-type socket created * by the appropriate system routine. Posts a * NSFileHandleConnectionAcceptedNotification when connection * initiated, returning an NSFileHandle for the client side with * that notification.

* *

The modes array specifies [NSRunLoop] modes that the notification can * be posted in.

*/ - (void) acceptConnectionInBackgroundAndNotifyForModes: (NSArray*)modes { [self subclassResponsibility: _cmd]; } /** * Call -readInBackgroundAndNotifyForModes: with nil modes. */ - (void) readInBackgroundAndNotify { [self readInBackgroundAndNotifyForModes: nil]; } /** * Set up an asynchronous read operation which will cause a notification to * be sent when any amount of data (or end of file) is read. Note that * the file handle will not continuously send notifications when data * is available. If you want to continue to receive notifications, you * need to send this message again after receiving a notification. */ - (void) readInBackgroundAndNotifyForModes: (NSArray*)modes { [self subclassResponsibility: _cmd]; } /** * Call -readToEndOfFileInBackgroundAndNotifyForModes: with nil modes. */ - (void) readToEndOfFileInBackgroundAndNotify { [self readToEndOfFileInBackgroundAndNotifyForModes: nil]; } /** * Set up an asynchronous read operation which will cause a notification to * be sent when end of file is read. */ - (void) readToEndOfFileInBackgroundAndNotifyForModes: (NSArray*)modes { [self subclassResponsibility: _cmd]; } /** * Call -waitForDataInBackgroundAndNotifyForModes: with nil modes. */ - (void) waitForDataInBackgroundAndNotify { [self waitForDataInBackgroundAndNotifyForModes: nil]; } /** * Set up to provide a notification when data can be read from the handle. */ - (void) waitForDataInBackgroundAndNotifyForModes: (NSArray*)modes { [self subclassResponsibility: _cmd]; } // Seeking within a file /** * Return current position in file, or raises exception if instance does * not represent a regular file. */ - (unsigned long long) offsetInFile { [self subclassResponsibility: _cmd]; return 0; } /** * Position file pointer at end of file, raising exception if instance does * not represent a regular file. */ - (unsigned long long) seekToEndOfFile { [self subclassResponsibility: _cmd]; return 0; } /** * Position file pointer at pos, raising exception if instance does * not represent a regular file. */ - (void) seekToFileOffset: (unsigned long long)pos { [self subclassResponsibility: _cmd]; } // Operations on file /** * Disallows further reading from read-access files or connections, and sends * EOF on write-access files or connections. Descriptor is only * deleted when this instance is deallocated. */ - (void) closeFile { [self subclassResponsibility: _cmd]; } /** * Flush in-memory buffer to file or connection, then return. */ - (void) synchronizeFile { [self subclassResponsibility: _cmd]; } /** * Chops file beyond pos then sets file pointer to that point. */ - (void) truncateFileAtOffset: (unsigned long long)pos { [self subclassResponsibility: _cmd]; } @end // GNUstep class extensions /** * A set of convenience methods for utilizing the socket communications * capabilities of the [NSFileHandle] class. */ @implementation NSFileHandle (GNUstepExtensions) /** * Opens an outgoing network connection by initiating an asynchronous * connection (see * [+fileHandleAsClientInBackgroundAtAddress:service:protocol:forModes:]) * and waiting for it to succeed, fail, or time out. */ + (id) fileHandleAsClientAtAddress: (NSString*)address service: (NSString*)service protocol: (NSString*)protocol { id o = [self allocWithZone: NSDefaultMallocZone()]; return AUTORELEASE([o initAsClientAtAddress: address service: service protocol: protocol]); } /** * Opens an outgoing network connection asynchronously using * [+fileHandleAsClientInBackgroundAtAddress:service:protocol:forModes:] */ + (id) fileHandleAsClientInBackgroundAtAddress: (NSString*)address service: (NSString*)service protocol: (NSString*)protocol { id o = [self allocWithZone: NSDefaultMallocZone()]; return AUTORELEASE([o initAsClientInBackgroundAtAddress: address service: service protocol: protocol forModes: nil]); } /** *

* Opens an outgoing network connection asynchronously. *

* * * The address is the name (or IP dotted quad) of the machine to * which the connection should be made. * * * The service is the name (or number) of the port to * which the connection should be made. * * * The protocol is provided so support different network protocols, * but at present only 'tcp' is supported. However, a protocol * specification of the form 'socks-...' can be used to control socks5 * support.
* If '...' is empty (ie the string is just 'socks-' then the connection * is not made via a socks server.
* Otherwise, the text '...' must be the name of the host on which the * socks5 server is running, with an optional port number separated * from the host name by a colon.
* Alternatively a prefix of the form 'bind-' followed by an IP address * may be used (for non-socks connections) to ensure that the connection * is made from the specified address. *
* * If modes is nil or empty, uses NSDefaultRunLoopMode. * *
*

* This method supports connection through a firewall via socks5. The * socks5 connection may be controlled via the protocol argument, but if * no socks information is supplied here, the GSSOCKS user default * will be used, and failing that, the SOCKS5_SERVER or * SOCKS_SERVER environment variables will be used to set the * socks server. If none of these mechanisms specify a socks server, the * connection will be made directly rather than through socks. *

*/ + (id) fileHandleAsClientInBackgroundAtAddress: (NSString*)address service: (NSString*)service protocol: (NSString*)protocol forModes: (NSArray*)modes { id o = [self allocWithZone: NSDefaultMallocZone()]; return AUTORELEASE([o initAsClientInBackgroundAtAddress: address service: service protocol: protocol forModes: modes]); } /** * Opens a network server socket and listens for incoming connections * using the specified service and protocol. * * * The service is the name (or number) of the port to * which the connection should be made. * * * The protocol may at present only be 'tcp' * * */ + (id) fileHandleAsServerAtAddress: (NSString*)address service: (NSString*)service protocol: (NSString*)protocol { id o = [self allocWithZone: NSDefaultMallocZone()]; return AUTORELEASE([o initAsServerAtAddress: address service: service protocol: protocol]); } /** * Call -readDataInBackgroundAndNotifyLength:forModes: with nil modes. */ - (void) readDataInBackgroundAndNotifyLength: (unsigned)len { [self readDataInBackgroundAndNotifyLength: len forModes: nil]; } /** * Set up an asynchronous read operation which will cause a notification to * be sent when the specified amount of data (or end of file) is read. */ - (void) readDataInBackgroundAndNotifyLength: (unsigned)len forModes: (NSArray*)modes { [self subclassResponsibility: _cmd]; } /** * Returns a boolean to indicate whether a read operation of any kind is * in progress on the handle. */ - (BOOL) readInProgress { [self subclassResponsibility: _cmd]; return NO; } /** * Returns the host address of the network connection represented by * the file handle. If this handle is an incoming connection which * was received by a local server handle, this is the name or address * of the client machine. */ - (NSString*) socketAddress { return nil; } /** * Returns the local address of the network connection or nil. */ - (NSString*) socketLocalAddress { return nil; } /** * Returns the local service/port of the network connection or nil. */ - (NSString*) socketLocalService { return nil; } /** * Returns the name (or number) of the service (network port) in use for * the network connection represented by the file handle. */ - (NSString*) socketService { return nil; } /** * Returns the name of the protocol in use for the network connection * represented by the file handle. */ - (NSString*) socketProtocol { return nil; } /** *

* Return a flag to indicate whether compression has been turned on for * the file handle ... this is only available on systems where GNUstep * was built with 'zlib' support for compressing/decompressing data. *

*

* On systems which support it, this method may be called after * a file handle has been initialised to turn on compression or * decompression of the data being written/read. *

* Returns YES on success, NO on failure.
* Reasons for failure are -
* * Not supported/built in to GNUstep * File handle has been closed * File handle is open for both read and write * Failure in compression/decompression library * */ - (BOOL) useCompression { return NO; } /** * Call -writeInBackgroundAndNotify:forModes: with nil modes. */ - (void) writeInBackgroundAndNotify: (NSData*)item { [self writeInBackgroundAndNotify: item forModes: nil]; } /** * Write the specified data asynchronously, and notify on completion. */ - (void) writeInBackgroundAndNotify: (NSData*)item forModes: (NSArray*)modes { [self subclassResponsibility: _cmd]; } /** * Returns a boolean to indicate whether a write operation of any kind is * in progress on the handle. An outgoing network connection attempt * (as a client) is considered to be a write operation. */ - (BOOL) writeInProgress { [self subclassResponsibility: _cmd]; return NO; } @end @implementation NSFileHandle (GNUstepTLS) + (void) setData: (NSData*)data forTLSFile: (NSString*)fileName { #if defined(HAVE_GNUTLS) [GSTLSObject setData: data forTLSFile: fileName]; #else [NSException raise: NSInternalInconsistencyException format: @"[NSFileHandle+setData:forTLSFile:] called for a copy of gnustep-base which had GNUTLS support explicitly disabled at configure time"]; #endif } /** * returns the concrete class used to implement SSL/TLS connections. */ + (Class) sslClass { return NSFileHandle_ssl_class; } - (BOOL) sslAccept { BOOL result = NO; if (NO == [self sslHandshakeEstablished: &result outgoing: NO]) { NSRunLoop *loop; IF_NO_ARC([self retain];) // Don't get destroyed during runloop loop = [NSRunLoop currentRunLoop]; [loop runUntilDate: [NSDate dateWithTimeIntervalSinceNow: 0.01]]; if (NO == [self sslHandshakeEstablished: &result outgoing: NO]) { NSDate *final; NSDate *when; NSTimeInterval last = 0.0; NSTimeInterval limit = 0.1; final = [[NSDate alloc] initWithTimeIntervalSinceNow: 30.0]; when = [NSDate alloc]; while (NO == [self sslHandshakeEstablished: &result outgoing: NO] && [final timeIntervalSinceNow] > 0.0) { NSTimeInterval tmp = limit; limit += last; last = tmp; if (limit > 0.5) { limit = 0.1; last = 0.1; } when = [when initWithTimeIntervalSinceNow: limit]; [loop runUntilDate: when]; } RELEASE(when); RELEASE(final); } DESTROY(self); } return result; } - (BOOL) sslConnect { BOOL result = NO; if (NO == [self sslHandshakeEstablished: &result outgoing: YES]) { NSRunLoop *loop; IF_NO_ARC([self retain];) // Don't get destroyed during runloop loop = [NSRunLoop currentRunLoop]; [loop runUntilDate: [NSDate dateWithTimeIntervalSinceNow: 0.01]]; if (NO == [self sslHandshakeEstablished: &result outgoing: YES]) { NSDate *final; NSDate *when; NSTimeInterval last = 0.0; NSTimeInterval limit = 0.1; final = [[NSDate alloc] initWithTimeIntervalSinceNow: 30.0]; when = [NSDate alloc]; while (NO == [self sslHandshakeEstablished: &result outgoing: YES] && [final timeIntervalSinceNow] > 0.0) { NSTimeInterval tmp = limit; limit += last; last = tmp; if (limit > 0.5) { limit = 0.1; last = 0.1; } when = [when initWithTimeIntervalSinceNow: limit]; [loop runUntilDate: when]; } RELEASE(when); RELEASE(final); } DESTROY(self); } return result; } - (void) sslDisconnect { return; } - (BOOL) sslHandshakeEstablished: (BOOL*)result outgoing: (BOOL)isOutgoing { if (0 != result) { *result = NO; } return YES; } - (NSString*) sslIssuer { return nil; } - (NSDictionary*) sslOptions { return nil; } - (NSString*) sslOwner { return nil; } - (void) sslSetCertificate: (NSString*)certFile privateKey: (NSString*)privateKey PEMpasswd: (NSString*)PEMpasswd { NSMutableDictionary *opts; NSString *err; opts = AUTORELEASE([[self sslOptions] mutableCopy]); if (nil == opts) { opts = [NSMutableDictionary dictionaryWithCapacity: 3]; } if (nil != certFile) { [opts setObject: certFile forKey: GSTLSCertificateFile]; } if (nil != privateKey) { [opts setObject: privateKey forKey: GSTLSCertificateKeyFile]; } if (nil != PEMpasswd) { [opts setObject: PEMpasswd forKey: GSTLSCertificateKeyPassword]; } err = [self sslSetOptions: opts]; if (nil != err) { NSLog(@"%@", err); } } - (NSString*) sslSetOptions: (NSDictionary*)options { return nil; } @end #if defined(HAVE_GNUTLS) /* Callback to allow the TLS code to pull data from the remote system. * If the operation fails, this sets the error number. */ static ssize_t GSTLSHandlePull(gnutls_transport_ptr_t handle, void *buffer, size_t len) { ssize_t result = 0; GSTLSHandle *tls = (GSTLSHandle*)handle; int descriptor = (int)(intptr_t)[tls nativeHandle]; result = recv(descriptor, buffer, len, 0); if (result < 0) { #if HAVE_GNUTLS_TRANSPORT_SET_ERRNO if (tls->session && tls->session->session) { int e; #if defined(_WIN32) /* For windows, we need to map winsock errors to unix ones that * gnutls understands. */ e = WSAGetLastError(); if (WSAEWOULDBLOCK == e) { e = EAGAIN; } else if (WSAEINTR == e) { e = EINTR; } #else e = errno; #endif gnutls_transport_set_errno (tls->session->session, e); } #endif } return result; } /* Callback to allow the TLS code to push data to the remote system. * If the operation fails, this sets the error number. */ static ssize_t GSTLSHandlePush(gnutls_transport_ptr_t handle, const void *buffer, size_t len) { ssize_t result = 0; GSTLSHandle *tls = (GSTLSHandle*)handle; int descriptor = (int)(intptr_t)[tls nativeHandle]; result = send(descriptor, buffer, len, 0); if (result < 0) { #if HAVE_GNUTLS_TRANSPORT_SET_ERRNO if (tls->session && tls->session->session) { int e; #if defined(_WIN32) /* For windows, we need to map winsock errors to unix ones that * gnutls understands. */ e = WSAGetLastError(); if (WSAEWOULDBLOCK == e) { e = EAGAIN; } else if (WSAEINTR == e) { e = EINTR; } #else e = errno; #endif gnutls_transport_set_errno(tls->session->session, e); } #endif } return result; } @implementation GSTLSHandle + (void) initialize { if (self == [GSTLSHandle class]) { [GSTLSObject class]; // Force initialisation of gnu tls stuff } } - (void) closeFile { [self sslDisconnect]; [super closeFile]; } - (void) dealloc { // Don't DESTROY ivars below. First release them, then set nil, because // `session' may need this back-reference during TLS teardown. TEST_RELEASE(opts); TEST_RELEASE(session); opts = nil; session = nil; [super dealloc]; } - (void) finalize { [self sslDisconnect]; [super finalize]; } - (NSInteger) read: (void*)buf length: (NSUInteger)len { if (YES == [session active]) { return [session read: buf length: len]; } return [super read: buf length: len]; } - (void) watchReadDescriptorForModes: (NSArray*)modes { if (descriptor < 0) { return; } if ([session pending] > 0) { NSRunLoop *l = [NSRunLoop currentRunLoop]; /* The underlying TLS buffers already have data so we signal * an event as soon as possible. */ [l performSelector: @selector(receivedEventRead) target: self argument: nil order: 0 modes: modes]; } else { [super watchReadDescriptorForModes: modes]; } } - (BOOL) sslAccept { /* If a server session is over five minutes old, destroy it so that * we create a new one to accept the incoming connection. This is * needed in case the certificate files associated with a long running * server have been updated and we need to load/use the new certificate. */ if (session != nil && [session age] >= 300.0) { DESTROY(session); } return [super sslAccept]; } - (void) sslDisconnect { /* When disconnecting, since the TCP/IP connection is not going to be * re-used, we can use non-blocking I/O and abandon the cleanup in the * TLS layer if the I/O cannot complete immediately. * We don't want to block because a network issue (or a failure at the * remote end) could tie up this thread until the 5 minute TCP/IP * keepalive expires. */ [self setNonBlocking: YES]; [session disconnect: NO]; } - (BOOL) sslHandshakeEstablished: (BOOL*)result outgoing: (BOOL)isOutgoing { NSAssert(0 != result, NSInvalidArgumentException); if (YES == [session active]) { *result = YES; return YES; /* Already connected. */ } if (YES == isStandardFile) { NSLog(@"Attempt to perform ssl handshake with a standard file"); *result = NO; return YES; } /* Set the handshake direction so we know how to set up the connection. */ if (nil == session) { /* If No value is specified for GSTLSRemoteHosts, make a comma separated * list of all known names for the remote host and use that. */ if (nil == [opts objectForKey: GSTLSRemoteHosts]) { NSHost *host = [NSHost hostWithAddress: [self socketAddress]]; NSString *s = [[host names] description]; s = [s stringByReplacingString: @"\"" withString: @""]; if ([s length] > 1) { s = [s substringWithRange: NSMakeRange(1, [s length] - 2)]; } if ([s length] > 0) { NSMutableDictionary *d = [opts mutableCopy]; [d setObject:s forKey: GSTLSRemoteHosts]; ASSIGNCOPY(opts, d); [d release]; } } [self setNonBlocking: YES]; session = [[GSTLSSession alloc] initWithOptions: opts direction: isOutgoing transport: (void*)self push: GSTLSHandlePush pull: GSTLSHandlePull]; } if (NO == [session handshake]) { *result = NO; if (nil == session) { return YES; // Unable to create session } return NO; // Need more. } else { *result = [session active]; return YES; } } - (NSString*) sslIssuer { return [session issuer]; } - (NSDictionary*) sslOptions { return opts; } - (NSString*) sslOwner { return [session owner]; } - (NSString*) sslSetOptions: (NSDictionary*)options { if (isStandardFile == YES) { return @"Attempt to set ssl options for a standard file"; } ASSIGNCOPY(opts, options); return nil; } - (NSInteger) write: (const void*)buf length: (NSUInteger)len { if (YES == [session active]) { return [session write: buf length: len]; } return [super write: buf length: len]; } @end #endif /* defined(HAVE_GNUTLS) */ gnustep-base-1.29.0/Source/NSFileManager.m000066400000000000000000003255741435650067400202630ustar00rootroot00000000000000 /** NSFileManager.m Copyright (C) 1997-2020 Free Software Foundation, Inc. Author: Mircea Oancea Author: Ovidiu Predescu Date: Feb 1997 Updates and fixes: Richard Frith-Macdonald Author: Nicola Pero Date: Apr 2001 Rewritten NSDirectoryEnumerator Author: Richard Frith-Macdonald Date: Sep 2002 Rewritten attribute handling code This file is part of the GNUstep Base Library. 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 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 USA. NSFileManager class reference $Date$ $Revision$ */ /* The following define is needed for Solaris get(pw/gr)(nam/uid)_r declartions which default to pre POSIX declaration. */ #define _POSIX_PTHREAD_SEMANTICS #import "common.h" #define EXPOSE_NSFileManager_IVARS 1 #define EXPOSE_NSDirectoryEnumerator_IVARS 1 #import "Foundation/NSArray.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSData.h" #import "Foundation/NSDate.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSError.h" #import "Foundation/NSException.h" #import "Foundation/NSFileManager.h" #import "Foundation/NSLock.h" #import "Foundation/NSPathUtilities.h" #import "Foundation/NSProcessInfo.h" #import "Foundation/NSSet.h" #import "Foundation/NSURL.h" #import "Foundation/NSValue.h" #import "GSPrivate.h" #import "GNUstepBase/NSString+GNUstepBase.h" #import "GNUstepBase/NSTask+GNUstepBase.h" #include /* determine directory reading files */ #if defined(HAVE_DIRENT_H) # include #elif defined(HAVE_SYS_DIR_H) # include #elif defined(HAVE_SYS_NDIR_H) # include #elif defined(HAVE_NDIR_H) # include #elif defined(_MSC_VER) // we provide our own version of dirent.h on Windows MSVC # include #endif #ifdef HAVE_WINDOWS_H # include #endif #if defined(_WIN32) #include #include #include #include #include #define WIN32ERR ((DWORD)0xFFFFFFFF) #endif /* determine filesystem max path length */ #if defined(_POSIX_VERSION) || defined(_WIN32) # if defined(_WIN32) # include # else # include # endif #endif #ifdef HAVE_SYS_CDEFS_H # include #endif #ifdef HAVE_SYS_SYSLIMITS_H # include #endif #ifdef HAVE_SYS_PARAM_H # include /* for MAXPATHLEN */ #endif #ifndef PATH_MAX # ifdef _POSIX_VERSION # define PATH_MAX _POSIX_PATH_MAX # else # ifdef MAXPATHLEN # define PATH_MAX MAXPATHLEN # else # define PATH_MAX 1024 # endif # endif #endif /* determine if we have statfs struct and function */ #ifdef HAVE_SYS_VFS_H # include #endif #ifdef HAVE_SYS_STATVFS_H # include #endif #ifdef HAVE_SYS_STATFS_H # include #endif #if defined(HAVE_SYS_FILE_H) # include #endif #ifdef HAVE_SYS_MOUNT_H #include #endif #ifdef HAVE_SYS_STAT_H #include #endif #if defined(HAVE_SYS_FCNTL_H) # include #elif defined(HAVE_FCNTL_H) # include #endif #ifdef HAVE_PWD_H #include /* For struct passwd */ #endif #ifdef HAVE_GRP_H #include /* For struct group */ #endif #ifdef HAVE_UTIME_H # include #endif /* * On systems that have the O_BINARY flag, use it for a binary copy. */ #if defined(O_BINARY) #define GSBINIO O_BINARY #else #define GSBINIO 0 #endif @interface NSDirectoryEnumerator (Local) - (id) initWithDirectoryPath: (NSString*)path recurseIntoSubdirectories: (BOOL)recurse followSymlinks: (BOOL)follow justContents: (BOOL)justContents for: (NSFileManager*)mgr; - (id) initWithDirectoryPath: (NSString*)path recurseIntoSubdirectories: (BOOL)recurse followSymlinks: (BOOL)follow justContents: (BOOL)justContents skipHidden: (BOOL)skipHidden errorHandler: (GSDirEnumErrorHandler) handler for: (NSFileManager*)mgr; - (void) _setSkipHidden: (BOOL)flag; - (void) _setErrorHandler: (GSDirEnumErrorHandler) handler; @end /* * Macros to handle unichar filesystem support. */ #if defined(_WIN32) #define _CHMOD(A,B) _wchmod(A,B) #define _CLOSEDIR(A) _wclosedir(A) #define _OPENDIR(A) _wopendir(A) #define _READDIR(A) _wreaddir(A) #define _RENAME(A,B) (MoveFileExW(A,B,MOVEFILE_COPY_ALLOWED|MOVEFILE_REPLACE_EXISTING|MOVEFILE_WRITE_THROUGH)==0)?-1:0 #define _RMDIR(A) _wrmdir(A) #define _STAT(A,B) _wstat(A,B) #define _UTIME(A,B) _wutime(A,B) #define _DIR _WDIR #define _DIRENT _wdirent #define _STATB _stat #define _UTIMB _utimbuf #define _NUL L'\0' #else #define _CHMOD(A,B) chmod(A,B) #define _CLOSEDIR(A) closedir(A) #define _OPENDIR(A) opendir(A) #define _READDIR(A) readdir(A) #define _RENAME(A,B) rename(A,B) #define _RMDIR(A) rmdir(A) #define _STAT(A,B) stat(A,B) #define _UTIME(A,B) utime(A,B) #define _DIR DIR #define _DIRENT dirent #define _STATB stat #define _UTIMB utimbuf #define _NUL '\0' #endif /* * GSAttrDictionary is a private NSDictionary subclass used to * handle file attributes efficiently ... using lazy evaluation * to ensure that we only do the minimum work necessary at any time. */ @interface GSAttrDictionary : NSDictionary { @public struct _STATB statbuf; GSNativeChar _path[0]; } + (NSDictionary*) attributesAt: (NSString *)path traverseLink: (BOOL)traverse; @end static Class GSAttrDictionaryClass = 0; /* * We also need a special enumerator class to enumerate the dictionary. */ @interface GSAttrDictionaryEnumerator : NSEnumerator { NSDictionary *dictionary; NSEnumerator *enumerator; } + (NSEnumerator*) enumeratorFor: (NSDictionary*)d; @end @interface NSFileManager (PrivateMethods) /* Copies the contents of source file to destination file. Assumes source and destination are regular files or symbolic links. */ - (BOOL) _copyFile: (NSString*)source toFile: (NSString*)destination handler: (id)handler; /* Recursively copies the contents of source directory to destination. */ - (BOOL) _copyPath: (NSString*)source toPath: (NSString*)destination handler: (id)handler; /* Recursively links the contents of source directory to destination. */ - (BOOL) _linkPath: (NSString*)source toPath: (NSString*)destination handler: handler; /* encapsulates the will Process check for existence of selector. */ - (void) _sendToHandler: (id) handler willProcessPath: (NSString*) path; /* methods to encapsulates setting up and calling the handler in case of an error */ - (BOOL) _proceedAccordingToHandler: (id) handler forError: (NSString*) error inPath: (NSString*) path; - (BOOL) _proceedAccordingToHandler: (id) handler forError: (NSString*) error inPath: (NSString*) path fromPath: (NSString*) fromPath toPath: (NSString*) toPath; /* A convenience method to return an NSError object. * If the _lastError message is set, this creates an NSError using * that message in the NSCocoaErrorDomain, otherwise it used the * most recent system error and the Posix error domain. * The userInfo is set to contain NSLocalizedDescriptionKey for the * message text, 'Path' if only the fromPath argument is specified, * and 'FromPath' and 'ToPath' if both path argument are specified. */ - (NSError*) _errorFrom: (NSString*)fromPath to: (NSString*)toPath; @end /* NSFileManager (PrivateMethods) */ /** * This is the main class for platform-independent management of the local * filesystem, which allows you to read and save files, create/list * directories, and move or delete files and directories. In addition to * simply listing directories, you may obtain an [NSDirectoryEnumerator] * instance for recursive directory contents enumeration. */ @implementation NSFileManager // Getting the default manager static NSFileManager* defaultManager = nil; static NSStringEncoding defaultEncoding; + (NSFileManager*) defaultManager { if (defaultManager == nil) { NS_DURING { [gnustep_global_lock lock]; if (defaultManager == nil) { defaultManager = [[self alloc] init]; } [gnustep_global_lock unlock]; } NS_HANDLER { // unlock then re-raise the exception [gnustep_global_lock unlock]; [localException raise]; } NS_ENDHANDLER } return defaultManager; } + (void) initialize { defaultEncoding = [NSString defaultCStringEncoding]; GSAttrDictionaryClass = [GSAttrDictionary class]; } - (void) dealloc { TEST_RELEASE(_lastError); [super dealloc]; } - (id) delegate { return _delegate; } - (void) setDelegate: (id)delegate { _delegate = delegate; } - (BOOL) changeCurrentDirectoryPath: (NSString*)path { static Class bundleClass = 0; const GSNativeChar *lpath = [self fileSystemRepresentationWithPath: path]; /* * On some systems the only way NSBundle can determine the path to the * executable is by searching for it ... so it needs to know what was * the current directory at launch time ... so we must make sure it is * initialised before we change the current directory. */ if (bundleClass == 0) { bundleClass = [NSBundle class]; } #if defined(_WIN32) return SetCurrentDirectoryW(lpath) == TRUE ? YES : NO; #else return (chdir(lpath) == 0) ? YES : NO; #endif } /** * Change the attributes of the file at path to those specified.
* Returns YES if all requested changes were made (or if the dictionary * was nil or empty, so no changes were requested), NO otherwise.
* On failure, some of the requested changes may have taken place.
*/ - (BOOL) changeFileAttributes: (NSDictionary*)attributes atPath: (NSString*)path { NSDictionary *old; const GSNativeChar *lpath = 0; NSUInteger num; NSString *str; NSDate *date; BOOL allOk = YES; if (0 == [attributes count]) { return YES; } old = [self fileAttributesAtPath: path traverseLink: YES]; lpath = [defaultManager fileSystemRepresentationWithPath: path]; #ifndef _WIN32 if (object_getClass(attributes) == GSAttrDictionaryClass) { num = ((GSAttrDictionary*)attributes)->statbuf.st_uid; } else { NSNumber *tmpNum = [attributes fileOwnerAccountID]; num = tmpNum ? [tmpNum unsignedLongValue] : NSNotFound; } if (num != NSNotFound && num != [[old fileOwnerAccountID] unsignedLongValue]) { if (chown(lpath, num, -1) != 0) { allOk = NO; str = [NSString stringWithFormat: @"Unable to change NSFileOwnerAccountID to '%"PRIuPTR"' - %@", num, [NSError _last]]; ASSIGN(_lastError, str); } } else { if ((str = [attributes fileOwnerAccountName]) != nil && NO == [str isEqual: [old fileOwnerAccountName]]) { BOOL ok = NO; #ifdef HAVE_PWD_H #if defined(HAVE_GETPWNAM_R) struct passwd pw; struct passwd *p; char buf[BUFSIZ*10]; if (getpwnam_r([str cStringUsingEncoding: defaultEncoding], &pw, buf, sizeof(buf), &p) == 0) { ok = (chown(lpath, pw.pw_uid, -1) == 0); (void)chown(lpath, -1, pw.pw_gid); } #else #if defined(HAVE_GETPWNAM) struct passwd *pw; [gnustep_global_lock lock]; pw = getpwnam([str cStringUsingEncoding: defaultEncoding]); if (pw != 0) { ok = (chown(lpath, pw->pw_uid, -1) == 0); (void)chown(lpath, -1, pw->pw_gid); } [gnustep_global_lock unlock]; #endif #endif #endif if (ok == NO) { allOk = NO; str = [NSString stringWithFormat: @"Unable to change NSFileOwnerAccountName to '%@' - %@", str, [NSError _last]]; ASSIGN(_lastError, str); } } } if (object_getClass(attributes) == GSAttrDictionaryClass) { num = ((GSAttrDictionary*)attributes)->statbuf.st_gid; } else { NSNumber *tmpNum = [attributes fileGroupOwnerAccountID]; num = tmpNum ? [tmpNum unsignedLongValue] : NSNotFound; } if (num != NSNotFound && num != [[old fileGroupOwnerAccountID] unsignedLongValue]) { if (chown(lpath, -1, num) != 0) { allOk = NO; str = [NSString stringWithFormat: @"Unable to change NSFileGroupOwnerAccountID to '%"PRIuPTR"' - %@", num, [NSError _last]]; ASSIGN(_lastError, str); } } else if ((str = [attributes fileGroupOwnerAccountName]) != nil && NO == [str isEqual: [old fileGroupOwnerAccountName]]) { BOOL ok = NO; #ifdef HAVE_GRP_H #ifdef HAVE_GETGRNAM_R struct group gp; struct group *p; char buf[BUFSIZ*10]; if (getgrnam_r([str cStringUsingEncoding: defaultEncoding], &gp, buf, sizeof(buf), &p) == 0) { if (chown(lpath, -1, gp.gr_gid) == 0) ok = YES; } #else #ifdef HAVE_GETGRNAM struct group *gp; [gnustep_global_lock lock]; gp = getgrnam([str cStringUsingEncoding: defaultEncoding]); if (gp) { if (chown(lpath, -1, gp->gr_gid) == 0) ok = YES; } [gnustep_global_lock unlock]; #endif #endif #endif if (ok == NO) { allOk = NO; str = [NSString stringWithFormat: @"Unable to change NSFileGroupOwnerAccountName to '%@' - %@", str, [NSError _last]]; ASSIGN(_lastError, str); } } #endif /* _WIN32 */ num = [attributes filePosixPermissions]; if (num != NSNotFound && num != [old filePosixPermissions]) { if (_CHMOD(lpath, num) != 0) { allOk = NO; str = [NSString stringWithFormat: @"Unable to change NSFilePosixPermissions to '%o' - %@", (unsigned)num, [NSError _last]]; ASSIGN(_lastError, str); } } date = [attributes fileCreationDate]; if (date != nil && NO == [date isEqual: [old fileCreationDate]]) { BOOL ok = NO; struct _STATB sb; const GSNativeChar *lpath; lpath = [self fileSystemRepresentationWithPath: path]; if (_STAT(lpath, &sb) != 0) { ok = NO; } #if defined(_WIN32) else if (sb.st_mode & _S_IFDIR) { ok = YES; // Directories don't have creation times. } #endif else { #if defined(_WIN32) FILETIME ctime; HANDLE fh; ULONGLONG nanosecs = ((ULONGLONG)([date timeIntervalSince1970]*10000000)+116444736000000000ULL); fh = CreateFileW(lpath, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL ); if (fh == INVALID_HANDLE_VALUE) { ok = NO; } else { ctime.dwLowDateTime = (DWORD) (nanosecs & 0xFFFFFFFF ); ctime.dwHighDateTime = (DWORD) (nanosecs >> 32 ); ok = SetFileTime(fh, &ctime, NULL, NULL); CloseHandle(fh); } #else NSTimeInterval ti = [date timeIntervalSince1970]; /* on Unix we try setting the creation date by setting the modification date earlier than the current one */ #if defined (HAVE_UTIMENSAT) struct timespec ub[2]; ub[0].tv_sec = 0; ub[0].tv_nsec = UTIME_OMIT; // we don't touch access time ub[1].tv_sec = (time_t)trunc(ti); ub[1].tv_nsec = (long)trunc((ti - trunc(ti)) * 1.0e9); ok = (utimensat(AT_FDCWD, lpath, ub, 0) == 0); #elif defined(_POSIX_VERSION) struct _UTIMB ub; ub.actime = sb.st_atime; ub.modtime = ti; ok = (_UTIME(lpath, &ub) == 0); #else time_t ub[2]; ub[0] = sb.st_atime; ub[1] = ti; ok = (_UTIME(lpath, ub) == 0); #endif #endif } if (ok == NO) { allOk = NO; str = [NSString stringWithFormat: @"Unable to change NSFileCreationDate to '%@' - %@", date, [NSError _last]]; ASSIGN(_lastError, str); } } date = [attributes fileModificationDate]; if (date != nil && NO == [date isEqual: [old fileModificationDate]]) { BOOL ok = NO; struct _STATB sb; if (_STAT(lpath, &sb) != 0) { ok = NO; } #if defined(_WIN32) else if (sb.st_mode & _S_IFDIR) { ok = YES; // Directories don't have modification times. } #endif else { NSTimeInterval ti = [date timeIntervalSince1970]; #if defined (HAVE_UTIMENSAT) struct timespec ub[2]; ub[0].tv_sec = 0; ub[0].tv_nsec = UTIME_OMIT; // we don't touch access time ub[1].tv_sec = (time_t)trunc(ti); ub[1].tv_nsec = (long)trunc((ti - trunc(ti)) * 1.0e9); ok = (utimensat(AT_FDCWD, lpath, ub, 0) == 0); #elif defined(_WIN32) || defined(_POSIX_VERSION) struct _UTIMB ub; ub.actime = sb.st_atime; ub.modtime = ti; ok = (_UTIME(lpath, &ub) == 0); #else time_t ub[2]; ub[0] = sb.st_atime; ub[1] = ti; ok = (_UTIME(lpath, ub) == 0); #endif } if (ok == NO) { allOk = NO; str = [NSString stringWithFormat: @"Unable to change NSFileModificationDate to '%@' - %@", date, [NSError _last]]; ASSIGN(_lastError, str); } } return allOk; } - (BOOL) setAttributes:(NSDictionary *)attributes ofItemAtPath:(NSString *)path error:(NSError **)error { BOOL success = [self changeFileAttributes: attributes atPath: path]; if (!success && error != NULL) *error = [NSError _last]; return success; } /** * Returns an array of path components suitably modified for display * to the end user. This modification may render the returned strings * unusable for path manipulation, so you should work with two arrays ... * one returned by this method (for display to the user), and a * parallel one returned by [NSString-pathComponents] (for path * manipulation). */ - (NSArray*) componentsToDisplayForPath: (NSString*)path { return [path pathComponents]; } /** * Reads the file at path an returns its contents as an NSData object.
* If an error occurs or if path specifies a directory etc then nil is * returned. */ - (NSData*) contentsAtPath: (NSString*)path { return [NSData dataWithContentsOfFile: path]; } /** * Returns YES if the contents of the file or directory at path1 are the same * as those at path2.
* If path1 and path2 are files, this is a simple comparison. If they are * directories, the contents of the files in those subdirectories are * compared recursively.
* Symbolic links are not followed.
* A comparison checks first file identity, then size, then content. */ - (BOOL) contentsEqualAtPath: (NSString*)path1 andPath: (NSString*)path2 { NSDictionary *d1; NSDictionary *d2; NSString *t; if ([path1 isEqual: path2]) return YES; d1 = [self fileAttributesAtPath: path1 traverseLink: NO]; d2 = [self fileAttributesAtPath: path2 traverseLink: NO]; t = [d1 fileType]; if ([t isEqual: [d2 fileType]] == NO) { return NO; } if ([t isEqual: NSFileTypeRegular]) { if ([d1 fileSize] == [d2 fileSize]) { NSData *c1 = [NSData dataWithContentsOfFile: path1]; NSData *c2 = [NSData dataWithContentsOfFile: path2]; if ([c1 isEqual: c2]) { return YES; } } return NO; } else if ([t isEqual: NSFileTypeDirectory]) { NSArray *a1 = [self directoryContentsAtPath: path1]; NSArray *a2 = [self directoryContentsAtPath: path2]; unsigned index, count = [a1 count]; BOOL ok = YES; if ([a1 isEqual: a2] == NO) { return NO; } for (index = 0; ok == YES && index < count; index++) { NSString *n = [a1 objectAtIndex: index]; NSString *p1; NSString *p2; ENTER_POOL p1 = [path1 stringByAppendingPathComponent: n]; p2 = [path2 stringByAppendingPathComponent: n]; d1 = [self fileAttributesAtPath: p1 traverseLink: NO]; d2 = [self fileAttributesAtPath: p2 traverseLink: NO]; t = [d1 fileType]; if ([t isEqual: [d2 fileType]] == NO) { ok = NO; } else if ([t isEqual: NSFileTypeDirectory] || [t isEqual: NSFileTypeRegular]) { ok = [self contentsEqualAtPath: p1 andPath: p2]; } LEAVE_POOL } return ok; } else { return YES; } } - (NSArray*) contentsOfDirectoryAtURL: (NSURL*)url includingPropertiesForKeys: (NSArray*)keys options: (NSDirectoryEnumerationOptions)mask error: (NSError **)error { NSArray *result; NSDirectoryEnumerator *direnum; NSString *path; DESTROY(_lastError); if (![[url scheme] isEqualToString: @"file"]) { return nil; } path = [url path]; direnum = [[NSDirectoryEnumerator alloc] initWithDirectoryPath: path recurseIntoSubdirectories: NO followSymlinks: NO justContents: NO for: self]; /* we make an array of NSURLs */ result = nil; if (nil != direnum) { IMP nxtImp; NSMutableArray *urlArray; NSString *tempPath; nxtImp = [direnum methodForSelector: @selector(nextObject)]; urlArray = [NSMutableArray arrayWithCapacity: 128]; while ((tempPath = (*nxtImp)(direnum, @selector(nextObject))) != nil) { NSURL *tempURL; NSString *lastComponent; tempURL = [NSURL fileURLWithPath: tempPath]; lastComponent = [tempPath lastPathComponent]; /* we purge files beginning with . */ if (!((mask & NSDirectoryEnumerationSkipsHiddenFiles) && [lastComponent hasPrefix: @"."])) { [urlArray addObject: tempURL]; } } RELEASE(direnum); if ([urlArray count] > 0) { result = [NSArray arrayWithArray: urlArray]; } } if (error != NULL) { if (nil == result) { *error = [self _errorFrom: path to: nil]; } } return result; } - (NSURL *)URLForDirectory: (NSSearchPathDirectory)directory inDomain: (NSSearchPathDomainMask)domain appropriateForURL: (NSURL *)url create: (BOOL)shouldCreate error: (NSError **)error { NSString *path = nil; if (directory == NSItemReplacementDirectory) { path = NSTemporaryDirectory(); } else { NSArray *pathArray = NSSearchPathForDirectoriesInDomains(directory, domain, YES); if ([pathArray count] > 0) { path = [pathArray objectAtIndex: 0]; } } if (shouldCreate && ![self fileExistsAtPath: path]) { [self createDirectoryAtPath: path withIntermediateDirectories: YES attributes: nil error: error]; } return [NSURL fileURLWithPath: path]; } - (NSDirectoryEnumerator *)enumeratorAtURL: (NSURL *)url includingPropertiesForKeys: (NSArray *)keys options: (NSDirectoryEnumerationOptions)mask errorHandler: (GSDirEnumErrorHandler)handler { NSDirectoryEnumerator *direnum; NSString *path; BOOL shouldRecurse; BOOL shouldSkipHidden; DESTROY(_lastError); if (![[url scheme] isEqualToString: @"file"]) { return nil; } path = [url path]; if ((mask & NSDirectoryEnumerationSkipsSubdirectoryDescendants) == NSDirectoryEnumerationSkipsSubdirectoryDescendants) { shouldRecurse = NO; } else { shouldRecurse = YES; } if ((mask & NSDirectoryEnumerationSkipsHiddenFiles) == NSDirectoryEnumerationSkipsHiddenFiles) { shouldSkipHidden = YES; } else { shouldSkipHidden = NO; } direnum = [[NSDirectoryEnumerator alloc] initWithDirectoryPath: path recurseIntoSubdirectories: shouldRecurse followSymlinks: NO justContents: NO skipHidden: shouldSkipHidden errorHandler: handler for: self]; return direnum; } - (NSArray*) contentsOfDirectoryAtPath: (NSString*)path error: (NSError**)error { NSArray *result; DESTROY(_lastError); result = [self directoryContentsAtPath: path]; if (error != NULL) { if (nil == result) { *error = [self _errorFrom: path to: nil]; } } return result; } /** * Creates a new directory (and all intermediate directories if flag is YES). * Creates only the last directory in the path if flag is NO.
* The directory is created with the attributes specified, and any problem * is returned in error.
* Returns YES if the directory is created (or flag is YES and the directory * already exists), NO on failure. */ - (BOOL) createDirectoryAtPath: (NSString *)path withIntermediateDirectories: (BOOL)flag attributes: (NSDictionary *)attributes error: (NSError **)error { BOOL result = NO; DESTROY(_lastError); if (YES == flag) { NSEnumerator *paths = [[path pathComponents] objectEnumerator]; NSString *path = nil; NSString *dir = [NSString string]; result = YES; while (YES == result && (path = (NSString *)[paths nextObject]) != nil) { dir = [dir stringByAppendingPathComponent: path]; // create directory only if it doesn't exist if (NO == [self fileExistsAtPath: dir]) { result = [self createDirectoryAtPath: dir attributes: attributes]; } } } else { BOOL isDir; if ([self fileExistsAtPath: [path stringByDeletingLastPathComponent] isDirectory: &isDir] && isDir) { result = [self createDirectoryAtPath: path attributes: attributes]; } else { result = NO; ASSIGN(_lastError, @"Could not create directory - intermediate path did not exist or was not a directory"); } } if (error != NULL) { if (NO == result) { *error = [self _errorFrom: path to: nil]; } } return result; } /** * Creates a new directory and all intermediate directories in the file URL * if flag is YES.
* Creates only the last directory in the URL if flag is NO.
* The directory is created with the attributes specified and any problem * is returned in error.
* Returns YES if the directory is created (or flag is YES and the directory * already exists), NO on failure. */ - (BOOL) createDirectoryAtURL: (NSURL *)url withIntermediateDirectories: (BOOL)flag attributes: (NSDictionary *)attributes error: (NSError **) error { return [self createDirectoryAtPath: [url path] withIntermediateDirectories: flag attributes: attributes error: error]; } /** * Creates a new directory, and sets its attributes as specified.
* Fails if directories in the path are missing.
* Returns YES if the directory was actually created, NO otherwise. */ - (BOOL) createDirectoryAtPath: (NSString*)path attributes: (NSDictionary*)attributes { BOOL isDir; /* This is consistent with MacOSX - just return NO for an invalid path. */ if ([path length] == 0) { ASSIGN(_lastError, @"no path given"); return NO; } if (YES == [self fileExistsAtPath: path isDirectory: &isDir]) { NSString *e; if (NO == isDir) { e = [NSString stringWithFormat: @"path %@ exists, but is not a directory", path]; } else { e = [NSString stringWithFormat: @"path %@ exists ... cannot create", path]; } ASSIGN(_lastError, e); return NO; } else { const GSNativeChar *lpath; lpath = [self fileSystemRepresentationWithPath: path]; #if defined(_WIN32) isDir = (CreateDirectoryW(lpath, 0) != FALSE) ? YES : NO; #else isDir = (mkdir(lpath, 0777) == 0) ? YES : NO; if (YES == isDir) { /* * If there is no file owner specified, and we are running * setuid to root, then we assume we need to change ownership * to the correct user. */ if (attributes == nil || ([attributes fileOwnerAccountID] == nil && [attributes fileOwnerAccountName] == nil)) { if (geteuid() == 0 && [@"root" isEqualToString: NSUserName()] == NO) { NSMutableDictionary *m; m = [[attributes mutableCopy] autorelease]; if (nil == m) { m = [NSMutableDictionary dictionaryWithCapacity: 1]; } [m setObject: NSUserName() forKey: NSFileOwnerAccountName]; attributes = m; } } } #endif if (NO == isDir) { NSString *e; e = [NSString stringWithFormat: @"Could not create '%@' - '%@'", path, [NSError _last]]; ASSIGN(_lastError, e); return NO; } } return [self changeFileAttributes: attributes atPath: path]; } /** * Creates a new file, and sets its attributes as specified.
* Initialises the file content with the specified data.
* Returns YES on success, NO on failure. */ - (BOOL) createFileAtPath: (NSString*)path contents: (NSData*)contents attributes: (NSDictionary*)attributes { const GSNativeChar *lpath; #if defined(_WIN32) HANDLE fh; DWORD written = 0; DWORD len = [contents length]; #else int fd; int len; int written; #endif /* This is consistent with MacOSX - just return NO for an invalid path. */ if ([path length] == 0) { ASSIGN(_lastError, @"no path given"); return NO; } lpath = [self fileSystemRepresentationWithPath: path]; #if defined(_WIN32) fh = CreateFileW(lpath, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); if (fh == INVALID_HANDLE_VALUE) { return NO; } else { if (len > 0) { WriteFile(fh, [contents bytes], len, &written, 0); } CloseHandle(fh); if (attributes != nil && [self changeFileAttributes: attributes atPath: path] == NO) { return NO; } return YES; } #else fd = open(lpath, GSBINIO|O_WRONLY|O_TRUNC|O_CREAT, 0644); if (fd < 0) { return NO; } if (attributes != nil && [self changeFileAttributes: attributes atPath: path] == NO) { close (fd); return NO; } /* * If there is no file owner specified, and we are running setuid to * root, then we assume we need to change ownership to correct user. */ if (attributes == nil || ([attributes fileOwnerAccountID] == nil && [attributes fileOwnerAccountName] == nil)) { if (geteuid() == 0 && [@"root" isEqualToString: NSUserName()] == NO) { attributes = [NSDictionary dictionaryWithObjectsAndKeys: NSFileOwnerAccountName, NSUserName(), nil]; if (![self changeFileAttributes: attributes atPath: path]) { NSDebugLog(@"Failed to change ownership of '%@' to '%@'", path, NSUserName()); } } } len = [contents length]; if (len > 0) { written = write(fd, [contents bytes], len); } else { written = 0; } close (fd); #endif return written == len; } /** * Returns the current working directory used by all instance of the file * manager in the current task. */ - (NSString*) currentDirectoryPath { NSString *currentDir = nil; #if defined(_WIN32) int len = GetCurrentDirectoryW(0, 0); if (len > 0) { GSNativeChar *lpath = (GSNativeChar*)calloc(len + 10, sizeof(GSNativeChar)); if (lpath != 0) { if (GetCurrentDirectoryW(len, lpath)>0) { NSString *path; // Windows may count the trailing nul ... we don't want to. if (len > 0 && lpath[len] == 0) len--; path = [[NSString alloc] initWithCharacters: lpath length: len]; // Standardise to get rid of backslashes currentDir = [path stringByStandardizingPath]; RELEASE(path); } free(lpath); } } #else GSNativeChar path[PATH_MAX]; #ifdef HAVE_GETCWD if (getcwd(path, PATH_MAX-1) == 0) return nil; #else if (getwd(path) == 0) return nil; #endif /* HAVE_GETCWD */ currentDir = [self stringWithFileSystemRepresentation: path length: strlen(path)]; #endif /* !_WIN32 */ return currentDir; } /** * Copies the file or directory at source to destination, using a * handler object which should respond to * [NSObject(NSFileManagerHandler)-fileManager:willProcessPath:] and * [NSObject(NSFileManagerHandler)-fileManager:shouldProceedAfterError:] * messages.
* Will not copy to a destination which already exists. */ - (BOOL) copyPath: (NSString*)source toPath: (NSString*)destination handler: (id)handler { NSDictionary *attrs; NSString *fileType; if ([self fileExistsAtPath: destination] == YES) { return NO; } attrs = [self fileAttributesAtPath: source traverseLink: NO]; if (attrs == nil) { return NO; } fileType = [attrs fileType]; /* Don't attempt to retain ownership of copy ... we want the copy * to be owned by the current user. * However, the new copy should have the creation/modification date * of the original (unlike Posix semantics). */ attrs = AUTORELEASE([attrs mutableCopy]); [(NSMutableDictionary*)attrs removeObjectForKey: NSFileOwnerAccountID]; [(NSMutableDictionary*)attrs removeObjectForKey: NSFileGroupOwnerAccountID]; [(NSMutableDictionary*)attrs removeObjectForKey: NSFileGroupOwnerAccountName]; [(NSMutableDictionary*)attrs setObject: NSUserName() forKey: NSFileOwnerAccountName]; if ([fileType isEqualToString: NSFileTypeDirectory] == YES) { /* If destination directory is a descendant of source directory copying * isn't possible. */ if ([[destination stringByAppendingString: @"/"] hasPrefix: [source stringByAppendingString: @"/"]]) { ASSIGN(_lastError, @"Could not copy - destination is a descendant of source"); return NO; } [self _sendToHandler: handler willProcessPath: destination]; if ([self createDirectoryAtPath: destination attributes: attrs] == NO) { return [self _proceedAccordingToHandler: handler forError: _lastError inPath: destination fromPath: source toPath: destination]; } if ([self _copyPath: source toPath: destination handler: handler] == NO) { return NO; } } else if ([fileType isEqualToString: NSFileTypeSymbolicLink] == YES) { NSString *path; BOOL result; [self _sendToHandler: handler willProcessPath: source]; path = [self pathContentOfSymbolicLinkAtPath: source]; result = [self createSymbolicLinkAtPath: destination pathContent: path]; if (result == NO) { result = [self _proceedAccordingToHandler: handler forError: @"cannot link to file" inPath: source fromPath: source toPath: destination]; if (result == NO) { return NO; } } } else { [self _sendToHandler: handler willProcessPath: source]; if ([self _copyFile: source toFile: destination handler: handler] == NO) { return NO; } } [self changeFileAttributes: attrs atPath: destination]; return YES; } - (BOOL) copyItemAtPath: (NSString*)src toPath: (NSString*)dst error: (NSError**)error { BOOL result; DESTROY(_lastError); result = [self copyPath: src toPath: dst handler: nil]; if (error != NULL) { if (NO == result) { *error = [self _errorFrom: src to: dst]; } } return result; } - (BOOL) copyItemAtURL: (NSURL*)src toURL: (NSURL*)dst error: (NSError**)error { return [self copyItemAtPath: [src path] toPath: [dst path] error: error]; } /** * Moves the file or directory at source to destination, using a * handler object which should respond to * [NSObject(NSFileManagerHandler)-fileManager:willProcessPath:] and * [NSObject(NSFileManagerHandler)-fileManager:shouldProceedAfterError:] * messages. * Will not move to a destination which already exists.
*/ - (BOOL) movePath: (NSString*)source toPath: (NSString*)destination handler: (id)handler { BOOL sourceIsDir; BOOL fileExists; NSString *destinationParent; unsigned int sourceDevice; unsigned int destinationDevice; const GSNativeChar *sourcePath; const GSNativeChar *destPath; sourcePath = [self fileSystemRepresentationWithPath: source]; destPath = [self fileSystemRepresentationWithPath: destination]; if ([self fileExistsAtPath: destination] == YES) { return NO; } fileExists = [self fileExistsAtPath: source isDirectory: &sourceIsDir]; if (!fileExists) { return NO; } /* Check to see if the source and destination's parent are on the same physical device so we can perform a rename syscall directly. */ sourceDevice = [[self fileSystemAttributesAtPath: source] fileSystemNumber]; destinationParent = [destination stringByDeletingLastPathComponent]; if ([destinationParent isEqual: @""]) destinationParent = @"."; destinationDevice = [[self fileSystemAttributesAtPath: destinationParent] fileSystemNumber]; if (sourceDevice != destinationDevice) { /* If destination directory is a descendant of source directory moving isn't possible. */ if (sourceIsDir && [[destination stringByAppendingString: @"/"] hasPrefix: [source stringByAppendingString: @"/"]]) { ASSIGN(_lastError, @"Could not move - destination is a descendant of source"); return NO; } if ([self copyPath: source toPath: destination handler: handler]) { NSDictionary *attributes; attributes = [self fileAttributesAtPath: source traverseLink: NO]; [self changeFileAttributes: attributes atPath: destination]; return [self removeFileAtPath: source handler: handler]; } else { return NO; } } else { /* source and destination are on the same device so we can simply invoke rename on source. */ [self _sendToHandler: handler willProcessPath: source]; if (_RENAME (sourcePath, destPath) == -1) { return [self _proceedAccordingToHandler: handler forError: @"cannot move file" inPath: source fromPath: source toPath: destination]; } return YES; } return NO; } - (BOOL) moveItemAtPath: (NSString*)src toPath: (NSString*)dst error: (NSError**)error { BOOL result; DESTROY(_lastError); result = [self movePath: src toPath: dst handler: nil]; if (error != NULL) { if (NO == result) { *error = [self _errorFrom: src to: dst]; } } return result; } - (BOOL) moveItemAtURL: (NSURL*)src toURL: (NSURL*)dst error: (NSError**)error { return [self moveItemAtPath: [src path] toPath: [dst path] error: error]; } /** *

Links the file or directory at source to destination, using a * handler object which should respond to * [NSObject(NSFileManagerHandler)-fileManager:willProcessPath:] and * [NSObject(NSFileManagerHandler)-fileManager:shouldProceedAfterError:] * messages. *

*

If the destination is a directory, the source path is linked * into that directory, otherwise the destination must not exist, * but its parent directory must exist and the source will be linked * into the parent as the name specified by the destination. *

*

If the source is a symbolic link, it is copied to the destination.
* If the source is a directory, it is copied to the destination and its * contents are linked into the new directory.
* Otherwise, a hard link is made from the destination to the source. *

*/ - (BOOL) linkPath: (NSString*)source toPath: (NSString*)destination handler: (id)handler { #ifdef HAVE_LINK NSDictionary *attrs; NSString *fileType; BOOL isDir; if ([self fileExistsAtPath: destination isDirectory: &isDir] == YES && isDir == YES) { destination = [destination stringByAppendingPathComponent: [source lastPathComponent]]; } attrs = [self fileAttributesAtPath: source traverseLink: NO]; if (attrs == nil) { return NO; } [self _sendToHandler: handler willProcessPath: destination]; fileType = [attrs fileType]; if ([fileType isEqualToString: NSFileTypeDirectory] == YES) { /* If destination directory is a descendant of source directory linking isn't possible because of recursion. */ if ([[destination stringByAppendingString: @"/"] hasPrefix: [source stringByAppendingString: @"/"]]) { ASSIGN(_lastError, @"Could not link - destination is a descendant of source"); return NO; } if ([self createDirectoryAtPath: destination attributes: attrs] == NO) { return [self _proceedAccordingToHandler: handler forError: _lastError inPath: destination fromPath: source toPath: destination]; } if ([self _linkPath: source toPath: destination handler: handler] == NO) { return NO; } } else if ([fileType isEqual: NSFileTypeSymbolicLink]) { NSString *path; path = [self pathContentOfSymbolicLinkAtPath: source]; if ([self createSymbolicLinkAtPath: destination pathContent: path] == NO) { if ([self _proceedAccordingToHandler: handler forError: @"cannot create symbolic link" inPath: source fromPath: source toPath: destination] == NO) { return NO; } } } else { if (link([self fileSystemRepresentationWithPath: source], [self fileSystemRepresentationWithPath: destination]) < 0) { if ([self _proceedAccordingToHandler: handler forError: @"cannot create hard link" inPath: source fromPath: source toPath: destination] == NO) { return NO; } } } [self changeFileAttributes: attrs atPath: destination]; return YES; #else ASSIGN(_lastError, @"Links not supported on this platform"); return NO; #endif } - (BOOL) removeFileAtPath: (NSString*)path handler: handler { BOOL is_dir; const GSNativeChar *lpath; if ([path isEqualToString: @"."] || [path isEqualToString: @".."]) { [NSException raise: NSInvalidArgumentException format: @"Attempt to remove illegal path"]; } [self _sendToHandler: handler willProcessPath: path]; lpath = [self fileSystemRepresentationWithPath: path]; if (lpath == 0 || *lpath == 0) { ASSIGN(_lastError, @"Could not remove - no path"); return NO; } else { #if defined(_WIN32) DWORD res; res = GetFileAttributesW(lpath); if (res == WIN32ERR) { return NO; } if (res & FILE_ATTRIBUTE_DIRECTORY) { is_dir = YES; } else { is_dir = NO; } #else struct _STATB statbuf; if (lstat(lpath, &statbuf) != 0) { return NO; } is_dir = ((statbuf.st_mode & S_IFMT) == S_IFDIR); #endif /* _WIN32 */ } if (!is_dir) { #if defined(_WIN32) if (DeleteFileW(lpath) == FALSE) #else if (unlink(lpath) < 0) #endif { NSString *message = [[NSError _last] localizedDescription]; return [self _proceedAccordingToHandler: handler forError: message inPath: path]; } else { return YES; } } else { NSArray *contents = [self directoryContentsAtPath: path]; unsigned count = [contents count]; unsigned i; for (i = 0; i < count; i++) { NSString *item; NSString *next; BOOL result; ENTER_POOL item = [contents objectAtIndex: i]; next = [path stringByAppendingPathComponent: item]; result = [self removeFileAtPath: next handler: handler]; LEAVE_POOL if (result == NO) { return NO; } } if (_RMDIR([self fileSystemRepresentationWithPath: path]) < 0) { NSString *message = [[NSError _last] localizedDescription]; return [self _proceedAccordingToHandler: handler forError: message inPath: path]; } else { return YES; } } } - (BOOL) removeItemAtPath: (NSString*)path error: (NSError**)error { BOOL result; DESTROY(_lastError); result = [self removeFileAtPath: path handler: nil]; if (error != NULL) { if (NO == result) { *error = [self _errorFrom: path to: nil]; } } return result; } - (BOOL) removeItemAtURL: (NSURL*)url error: (NSError**)error { return [self removeItemAtPath: [url path] error: error]; } - (BOOL) createSymbolicLinkAtPath: (NSString*)path withDestinationPath: (NSString*)destPath error: (NSError**)error { BOOL result; DESTROY(_lastError); result = [self createSymbolicLinkAtPath: path pathContent: destPath]; if (error != NULL) { if (NO == result) { *error = [self _errorFrom: path to: destPath]; } } return result; } - (BOOL) fileExistsAtPath: (NSString*)path { return [self fileExistsAtPath: path isDirectory: 0]; } - (BOOL) fileExistsAtPath: (NSString*)path isDirectory: (BOOL*)isDirectory { const GSNativeChar *lpath = [self fileSystemRepresentationWithPath: path]; if (isDirectory != 0) { *isDirectory = NO; } if (lpath == 0 || *lpath == _NUL) { ASSIGN(_lastError, @"no path given"); return NO; } #if defined(_WIN32) { DWORD res; res = GetFileAttributesW(lpath); if (res == WIN32ERR) { return NO; } if (isDirectory != 0) { if (res & FILE_ATTRIBUTE_DIRECTORY) { *isDirectory = YES; } } return YES; } #else { struct _STATB statbuf; if (_STAT(lpath, &statbuf) != 0) { #ifdef __ANDROID__ /* Android: try using asset manager if path is in * main bundle resources */ AAsset *asset = [NSBundle assetForPath: path]; if (asset) { AAsset_close(asset); return YES; } AAssetDir *assetDir = [NSBundle assetDirForPath: path]; if (assetDir) { AAssetDir_close(assetDir); if (isDirectory) { *isDirectory = YES; } return YES; } #endif return NO; } if (isDirectory) { if ((statbuf.st_mode & S_IFMT) == S_IFDIR) { *isDirectory = YES; } } return YES; } #endif /* _WIN32 */ } /** * Returns YES if a file (or directory etc) exists at the specified path * and is readable. */ - (BOOL) isReadableFileAtPath: (NSString*)path { const GSNativeChar* lpath = [self fileSystemRepresentationWithPath: path]; if (lpath == 0 || *lpath == _NUL) { ASSIGN(_lastError, @"no path given"); return NO; } #if defined(_WIN32) { DWORD res; res = GetFileAttributesW(lpath); if (res == WIN32ERR) { return NO; } return YES; } #else { if (access(lpath, R_OK) == 0) { return YES; } #ifdef __ANDROID__ /* Android: try using asset manager if path is in * main bundle resources */ AAsset *asset = [NSBundle assetForPath: path]; if (asset) { AAsset_close(asset); return YES; } AAssetDir *assetDir = [NSBundle assetDirForPath: path]; if (assetDir) { AAssetDir_close(assetDir); return YES; } #endif return NO; } #endif } /** * Returns YES if a file (or directory etc) exists at the specified path * and is writable. */ - (BOOL) isWritableFileAtPath: (NSString*)path { const GSNativeChar* lpath = [self fileSystemRepresentationWithPath: path]; if (lpath == 0 || *lpath == _NUL) { ASSIGN(_lastError, @"no path given"); return NO; } #if defined(_WIN32) { DWORD res; res = GetFileAttributesW(lpath); if (res == WIN32ERR) { return NO; } if (res & FILE_ATTRIBUTE_READONLY) { return NO; } return YES; } #else { if (access(lpath, W_OK) == 0) { return YES; } return NO; } #endif } /** * Returns YES if a file (or directory etc) exists at the specified path * and is executable (if a directory is executable, you can access its * contents). */ - (BOOL) isExecutableFileAtPath: (NSString*)path { const GSNativeChar* lpath = [self fileSystemRepresentationWithPath: path]; if (lpath == 0 || *lpath == _NUL) { ASSIGN(_lastError, @"no path given"); return NO; } #if defined(_WIN32) { DWORD res; NSString *ext; res = GetFileAttributesW(lpath); if (res == WIN32ERR) { return NO; } ext = [[path pathExtension] uppercaseString]; if ([ext length] > 0) { static NSSet *executable = nil; if (nil == executable) { executable = [[NSTask executableExtensions] copy]; } if (nil != [executable member: ext]) { return YES; } } /* FIXME: On unix, directory accessible == executable, so we simulate that here for Windows. Is there a better check for directory access? */ if (res & FILE_ATTRIBUTE_DIRECTORY) { return YES; } return NO; } #else { if (access(lpath, X_OK) == 0) { return YES; } return NO; } #endif } /** * Returns YES if a file (or directory etc) exists at the specified path * and is deletable. */ - (BOOL) isDeletableFileAtPath: (NSString*)path { const GSNativeChar* lpath = [self fileSystemRepresentationWithPath: path]; if (lpath == 0 || *lpath == _NUL) { ASSIGN(_lastError, @"no path given"); return NO; } #if defined(_WIN32) // TODO - handle directories { DWORD res; res = GetFileAttributesW(lpath); if (res == WIN32ERR) { return NO; } return (res & FILE_ATTRIBUTE_READONLY) ? NO : YES; } #else { // TODO - handle directories path = [path stringByDeletingLastPathComponent]; if ([path length] == 0) { path = @"."; } lpath = [self fileSystemRepresentationWithPath: path]; if (access(lpath, X_OK | W_OK) == 0) { return YES; } return NO; } #endif } /** * If a file (or directory etc) exists at the specified path, and can be * queried for its attributes, this method returns a dictionary containing * the various attributes of that file. Otherwise nil is returned.
* If the flag is NO and the file is a symbolic link, the attributes of * the link itself (rather than the file it points to) are returned.
*

* The dictionary keys for attributes are - *

* * NSFileAppendOnly * NSNumber ... boolean * NSFileCreationDate * NSDate when the file was created (if supported) * NSFileDeviceIdentifier * NSNumber (identifies the device on which the file is stored) * NSFileExtensionHidden * NSNumber ... boolean * NSFileGroupOwnerAccountName * NSString name of the file group * NSFileGroupOwnerAccountID * NSNumber ID of the file group * NSFileHFSCreatorCode * NSNumber not used * NSFileHFSTypeCode * NSNumber not used * NSFileImmutable * NSNumber ... boolean * NSFileModificationDate * NSDate when the file was last modified * NSFileOwnerAccountName * NSString name of the file owner * NSFileOwnerAccountID * NSNumber ID of the file owner * NSFilePosixPermissions * NSNumber posix access permissions mask * NSFileReferenceCount * NSNumber number of links to this file * NSFileSize * NSNumber size of the file in bytes * NSFileSystemFileNumber * NSNumber the identifier for the file on the filesystem * NSFileSystemNumber * NSNumber the filesystem on which the file is stored * NSFileType * NSString the type of file * *

* The [NSDictionary] class also has a set of convenience accessor methods * which enable you to get at file attribute information more efficiently * than using the keys above to extract it. You should generally * use the accessor methods where they are available. *

* * [NSDictionary(NSFileAttributes)-fileCreationDate] * [NSDictionary(NSFileAttributes)-fileExtensionHidden] * [NSDictionary(NSFileAttributes)-fileHFSCreatorCode] * [NSDictionary(NSFileAttributes)-fileHFSTypeCode] * [NSDictionary(NSFileAttributes)-fileIsAppendOnly] * [NSDictionary(NSFileAttributes)-fileIsImmutable] * [NSDictionary(NSFileAttributes)-fileSize] * [NSDictionary(NSFileAttributes)-fileType] * [NSDictionary(NSFileAttributes)-fileOwnerAccountName] * [NSDictionary(NSFileAttributes)-fileOwnerAccountID] * [NSDictionary(NSFileAttributes)-fileGroupOwnerAccountName] * [NSDictionary(NSFileAttributes)-fileGroupOwnerAccountID] * [NSDictionary(NSFileAttributes)-fileModificationDate] * [NSDictionary(NSFileAttributes)-filePosixPermissions] * [NSDictionary(NSFileAttributes)-fileSystemNumber] * [NSDictionary(NSFileAttributes)-fileSystemFileNumber] * */ - (NSDictionary*) fileAttributesAtPath: (NSString*)path traverseLink: (BOOL)flag { NSDictionary *d; d = [GSAttrDictionaryClass attributesAt: path traverseLink: flag]; return d; } /** * If a file (or directory etc) exists at the specified path, and can be * queried for its attributes, this method returns a dictionary containing * the various attributes of that file. Otherwise nil is returned.
* If an error occurs, error describes the problem. * Pass NULL if you do not want error information. *

* The dictionary keys for attributes are - *

* * NSFileAppendOnly * NSNumber ... boolean * NSFileCreationDate * NSDate when the file was created (if supported) * NSFileDeviceIdentifier * NSNumber (identifies the device on which the file is stored) * NSFileExtensionHidden * NSNumber ... boolean * NSFileGroupOwnerAccountName * NSString name of the file group * NSFileGroupOwnerAccountID * NSNumber ID of the file group * NSFileHFSCreatorCode * NSNumber not used * NSFileHFSTypeCode * NSNumber not used * NSFileImmutable * NSNumber ... boolean * NSFileModificationDate * NSDate when the file was last modified * NSFileOwnerAccountName * NSString name of the file owner * NSFileOwnerAccountID * NSNumber ID of the file owner * NSFilePosixPermissions * NSNumber posix access permissions mask * NSFileReferenceCount * NSNumber number of links to this file * NSFileSize * NSNumber size of the file in bytes * NSFileSystemFileNumber * NSNumber the identifier for the file on the filesystem * NSFileSystemNumber * NSNumber the filesystem on which the file is stored * NSFileType * NSString the type of file * *

* The [NSDictionary] class also has a set of convenience accessor methods * which enable you to get at file attribute information more efficiently * than using the keys above to extract it. You should generally * use the accessor methods where they are available. *

* * [NSDictionary(NSFileAttributes)-fileCreationDate] * [NSDictionary(NSFileAttributes)-fileExtensionHidden] * [NSDictionary(NSFileAttributes)-fileHFSCreatorCode] * [NSDictionary(NSFileAttributes)-fileHFSTypeCode] * [NSDictionary(NSFileAttributes)-fileIsAppendOnly] * [NSDictionary(NSFileAttributes)-fileIsImmutable] * [NSDictionary(NSFileAttributes)-fileSize] * [NSDictionary(NSFileAttributes)-fileType] * [NSDictionary(NSFileAttributes)-fileOwnerAccountName] * [NSDictionary(NSFileAttributes)-fileOwnerAccountID] * [NSDictionary(NSFileAttributes)-fileGroupOwnerAccountName] * [NSDictionary(NSFileAttributes)-fileGroupOwnerAccountID] * [NSDictionary(NSFileAttributes)-fileModificationDate] * [NSDictionary(NSFileAttributes)-filePosixPermissions] * [NSDictionary(NSFileAttributes)-fileSystemNumber] * [NSDictionary(NSFileAttributes)-fileSystemFileNumber] * */ - (NSDictionary*) attributesOfItemAtPath: (NSString*)path error: (NSError**)error { NSDictionary *d; DESTROY(_lastError); d = [GSAttrDictionaryClass attributesAt: path traverseLink: NO]; if (error != NULL) { if (nil == d) { *error = [self _errorFrom: path to: nil]; } } return d; } - (NSDictionary*) attributesOfFileSystemForPath: (NSString*)path error: (NSError**)error { #if defined(_WIN32) unsigned long long totalsize, freesize; id values[5]; id keys[5] = { NSFileSystemSize, NSFileSystemFreeSize, NSFileSystemNodes, NSFileSystemFreeNodes, NSFileSystemNumber }; DWORD SectorsPerCluster, BytesPerSector, NumberFreeClusters; DWORD TotalNumberClusters; DWORD volumeSerialNumber = 0; const GSNativeChar *lpath = [self fileSystemRepresentationWithPath: path]; GSNativeChar volumePathName[128]; if (!GetVolumePathNameW(lpath, volumePathName, 128)) { if (error != NULL) { *error = [NSError _last]; } return nil; } GetVolumeInformationW(volumePathName, NULL, 0, &volumeSerialNumber, NULL, NULL, NULL, 0); if (!GetDiskFreeSpaceW(volumePathName, &SectorsPerCluster, &BytesPerSector, &NumberFreeClusters, &TotalNumberClusters)) { if (error != NULL) { *error = [NSError _last]; } return nil; } totalsize = (unsigned long long)TotalNumberClusters * (unsigned long long)SectorsPerCluster * (unsigned long long)BytesPerSector; freesize = (unsigned long long)NumberFreeClusters * (unsigned long long)SectorsPerCluster * (unsigned long long)BytesPerSector; values[0] = [NSNumber numberWithUnsignedLongLong: totalsize]; values[1] = [NSNumber numberWithUnsignedLongLong: freesize]; values[2] = [NSNumber numberWithLong: LONG_MAX]; values[3] = [NSNumber numberWithLong: LONG_MAX]; values[4] = [NSNumber numberWithUnsignedInt: volumeSerialNumber]; return [NSDictionary dictionaryWithObjects: values forKeys: keys count: 5]; #else #if defined(HAVE_SYS_VFS_H) || defined(HAVE_SYS_STATFS_H) \ || defined(HAVE_SYS_MOUNT_H) struct _STATB statbuf; #ifdef HAVE_STATVFS struct statvfs statfsbuf; #else struct statfs statfsbuf; #endif unsigned long long totalsize, freesize; unsigned long blocksize; const GSNativeChar* lpath = [self fileSystemRepresentationWithPath: path]; id values[5]; id keys[5] = { NSFileSystemSize, NSFileSystemFreeSize, NSFileSystemNodes, NSFileSystemFreeNodes, NSFileSystemNumber }; if (_STAT(lpath, &statbuf) != 0) { if (error != NULL) { *error = [NSError _last]; } NSDebugMLLog(@"NSFileManager", @"stat failed for '%s' ... %@", lpath, [NSError _last]); return nil; } #ifdef HAVE_STATVFS if (statvfs(lpath, &statfsbuf) != 0) { if (error != NULL) { *error = [NSError _last]; } NSDebugMLLog(@"NSFileManager", @"statvfs failed for '%s' ... %@", lpath, [NSError _last]); return nil; } blocksize = statfsbuf.f_frsize; #else if (statfs(lpath, &statfsbuf) != 0) { if (error != NULL) { *error = [NSError _last]; } NSDebugMLLog(@"NSFileManager", @"statfs failed for '%s' ... %@", lpath, [NSError _last]); return nil; } blocksize = statfsbuf.f_bsize; #endif totalsize = (unsigned long long) blocksize * (unsigned long long) statfsbuf.f_blocks; freesize = (unsigned long long) blocksize * (unsigned long long) statfsbuf.f_bavail; values[0] = [NSNumber numberWithUnsignedLongLong: totalsize]; values[1] = [NSNumber numberWithUnsignedLongLong: freesize]; values[2] = [NSNumber numberWithLong: statfsbuf.f_files]; values[3] = [NSNumber numberWithLong: statfsbuf.f_ffree]; values[4] = [NSNumber numberWithUnsignedLong: statbuf.st_dev]; return [NSDictionary dictionaryWithObjects: values forKeys: keys count: 5]; #else GSOnceMLog(@"NSFileManager", @"no support for filesystem attributes"); ASSIGN(_lastError, @"no support for filesystem attributes"); return nil; #endif #endif /* _WIN32 */ } /** * Returns a dictionary containing the filesystem attributes for the * specified path (or nil if the path is not valid).
* * NSFileSystemSize * NSNumber the size of the filesystem in bytes * NSFileSystemFreeSize * NSNumber the amount of unused space on the filesystem in bytes * NSFileSystemNodes * NSNumber the number of nodes in use to store files * NSFileSystemFreeNodes * NSNumber the number of nodes available to create files * NSFileSystemNumber * NSNumber the identifying number for the filesystem * */ - (NSDictionary*) fileSystemAttributesAtPath: (NSString*)path { return [self attributesOfFileSystemForPath: path error: NULL]; } /** * Returns an array of the contents of the specified directory.
* The listing does not recursively list subdirectories.
* The special files '.' and '..' are not listed.
* Indicates an error by returning nil (eg. if path is not a directory or * it can't be read for some reason). */ - (NSArray*) directoryContentsAtPath: (NSString*)path { NSDirectoryEnumerator *direnum; NSMutableArray *content; BOOL is_dir; /* * See if this is a directory (don't follow links). */ if ([self fileExistsAtPath: path isDirectory: &is_dir] == NO || is_dir == NO) { return nil; } content = [NSMutableArray arrayWithCapacity: 128]; /* We initialize the directory enumerator with justContents == YES, which tells the NSDirectoryEnumerator code that we only enumerate the contents non-recursively once, and exit. NSDirectoryEnumerator can perform some optimisations using this assumption. */ direnum = [[NSDirectoryEnumerator alloc] initWithDirectoryPath: path recurseIntoSubdirectories: NO followSymlinks: NO justContents: YES for: self]; if (nil != direnum) { IMP nxtImp; IMP addImp; nxtImp = [direnum methodForSelector: @selector(nextObject)]; addImp = [content methodForSelector: @selector(addObject:)]; while ((path = (*nxtImp)(direnum, @selector(nextObject))) != nil) { (*addImp)(content, @selector(addObject:), path); } RELEASE(direnum); } return GS_IMMUTABLE(content); } /** * Returns the name of the file or directory at path. Converts it into * a format for display to an end user. This may render it unusable as * part of a file/path name.
* For instance, if a user has elected not to see file extensions, this * method may return filenames with the extension removed.
* The default operation is to return the result of calling * [NSString-lastPathComponent] on the path. */ - (NSString*) displayNameAtPath: (NSString*)path { return [path lastPathComponent]; } - (NSDirectoryEnumerator*) enumeratorAtPath: (NSString*)path { return AUTORELEASE([[NSDirectoryEnumerator alloc] initWithDirectoryPath: path recurseIntoSubdirectories: YES followSymlinks: NO justContents: NO for: self]); } /** * Returns an array containing the (relative) paths of all the items * in the directory at path.
* The listing follows all subdirectories, so it can produce a very * large array ... use with care. */ - (NSArray*) subpathsAtPath: (NSString*)path { NSDirectoryEnumerator *direnum; NSMutableArray *content; BOOL isDir; if (![self fileExistsAtPath: path isDirectory: &isDir] || !isDir) { return nil; } content = [NSMutableArray arrayWithCapacity: 128]; direnum = [[NSDirectoryEnumerator alloc] initWithDirectoryPath: path recurseIntoSubdirectories: YES followSymlinks: NO justContents: NO for: self]; if (nil != direnum) { IMP nxtImp; IMP addImp; nxtImp = [direnum methodForSelector: @selector(nextObject)]; addImp = [content methodForSelector: @selector(addObject:)]; while ((path = (*nxtImp)(direnum, @selector(nextObject))) != nil) { (*addImp)(content, @selector(addObject:), path); } RELEASE(direnum); } return GS_IMMUTABLE(content); } /** * Creates a symbolic link at path which links to the location * specified by otherPath. */ - (BOOL) createSymbolicLinkAtPath: (NSString*)path pathContent: (NSString*)otherPath { #ifdef HAVE_SYMLINK const GSNativeChar* oldpath; const GSNativeChar* newpath; newpath = [self fileSystemRepresentationWithPath: path]; oldpath = [self fileSystemRepresentationWithPath: otherPath]; return (symlink(oldpath, newpath) == 0); #else ASSIGN(_lastError, @"symbolic links not supported on this system"); return NO; #endif } /** * Returns the name of the file or directory that the symbolic link * at path points to. */ - (NSString*) pathContentOfSymbolicLinkAtPath: (NSString*)path { #ifdef HAVE_READLINK char buf[PATH_MAX]; const GSNativeChar* lpath = [self fileSystemRepresentationWithPath: path]; int llen = readlink(lpath, buf, PATH_MAX-1); if (llen > 0) { return [self stringWithFileSystemRepresentation: buf length: llen]; } else { return nil; } #else ASSIGN(_lastError, @"symbolic links not supported on this system"); return nil; #endif } #if defined(_WIN32) - (const GSNativeChar*) fileSystemRepresentationWithPath: (NSString*)path { if (path != nil && [path rangeOfString: @"/"].length > 0) { path = [path stringByReplacingString: @"/" withString: @"\\"]; } return (const GSNativeChar*)[path cStringUsingEncoding: NSUnicodeStringEncoding]; } - (NSString*) stringWithFileSystemRepresentation: (const GSNativeChar*)string length: (NSUInteger)len { return [NSString stringWithCharacters: string length: len]; } #else - (const GSNativeChar*) fileSystemRepresentationWithPath: (NSString*)path { return (const GSNativeChar*)[path cStringUsingEncoding: defaultEncoding]; } - (NSString*) stringWithFileSystemRepresentation: (const GSNativeChar*)string length: (NSUInteger)len { return AUTORELEASE([[NSString allocWithZone: NSDefaultMallocZone()] initWithBytes: string length: len encoding: defaultEncoding]); } #endif @end /* NSFileManager */ /* A directory to enumerate. We keep a stack of the directories we still have to enumerate. We start by putting the top-level directory into the stack, then we start reading files from it (using readdir). If we find a file which is actually a directory, and if we have to recurse into it, we create a new GSEnumeratedDirectory struct for the subdirectory, open its DIR *pointer for reading, and put it on top of the stack, so next time -nextObject is called, it will read from that directory instead of the top level one. Once all the subdirectory is read, it is removed from the stack, so the top of the stack if the top directory again, and enumeration continues in there. */ typedef struct _GSEnumeratedDirectory { NSString *path; _DIR *pointer; #ifdef __ANDROID__ AAssetDir *assetDir; #endif } GSEnumeratedDirectory; static inline void gsedRelease(GSEnumeratedDirectory X) { DESTROY(X.path); _CLOSEDIR(X.pointer); #ifdef __ANDROID__ if (X.assetDir) { AAssetDir_close(X.assetDir); } #endif } #define GSI_ARRAY_TYPES 0 #define GSI_ARRAY_TYPE GSEnumeratedDirectory #define GSI_ARRAY_RELEASE(A, X) gsedRelease(X.ext) #define GSI_ARRAY_RETAIN(A, X) #include "GNUstepBase/GSIArray.h" @implementation NSDirectoryEnumerator /* * The Objective-C interface hides a traditional C implementation. * This was the only way I could get near the speed of standard unix * tools for big directories. */ + (void) initialize { if (self == [NSDirectoryEnumerator class]) { } } - (void) _setSkipHidden: (BOOL)flag { _flags.skipHidden = flag ? 1 : 0; } - (void) _setErrorHandler: (GSDirEnumErrorHandler) handler { _errorHandler = handler; } - (id) initWithDirectoryPath: (NSString*)path recurseIntoSubdirectories: (BOOL)recurse followSymlinks: (BOOL)follow justContents: (BOOL)justContents skipHidden: (BOOL)skipHidden errorHandler: (GSDirEnumErrorHandler) handler for: (NSFileManager*)mgr { if (nil != (self = [super init])) { //TODO: the justContents flag is currently basically useless and should be // removed _DIR *dir_pointer; const GSNativeChar *localPath; _mgr = RETAIN(mgr); _stack = NSZoneMalloc([self zone], sizeof(GSIArray_t)); GSIArrayInitWithZoneAndCapacity(_stack, [self zone], 64); _flags.isRecursive = recurse ? 1 : 0; _flags.isFollowing = follow ? 1 : 0; _flags.justContents = justContents ? 1 : 0; _flags.skipHidden = skipHidden ? 1 : 0; _errorHandler = handler; _topPath = [[NSString alloc] initWithString: path]; localPath = [_mgr fileSystemRepresentationWithPath: path]; dir_pointer = _OPENDIR(localPath); #ifdef __ANDROID__ AAssetDir *assetDir = NULL; if (!dir_pointer) { /* Android: try using asset manager if path is in * main bundle resources */ assetDir = [NSBundle assetDirForPath: path]; } if (dir_pointer || assetDir) #else if (dir_pointer) #endif { GSIArrayItem item; item.ext.path = @""; item.ext.pointer = dir_pointer; #ifdef __ANDROID__ item.ext.assetDir = assetDir; #endif GSIArrayAddItem(_stack, item); } else { NSDebugLog(@"Failed to recurse into directory '%@' - %@", path, [NSError _last]); } } return self; } /** * Initialize instance to enumerate contents at path, which should be a * directory and can be specified in relative or absolute, and may include * Unix conventions like '~' for user home directory, which will * be appropriately converted on Windoze systems. The justContents flag, if * set, is equivalent to recurseIntoSubdirectories = NO and followSymlinks = * NO, but the implementation will be made more efficient. */ - (id) initWithDirectoryPath: (NSString*)path recurseIntoSubdirectories: (BOOL)recurse followSymlinks: (BOOL)follow justContents: (BOOL)justContents for: (NSFileManager*)mgr { return [self initWithDirectoryPath: path recurseIntoSubdirectories: recurse followSymlinks: follow justContents: justContents skipHidden: NO errorHandler: NULL for: mgr]; } - (void) dealloc { GSIArrayEmpty(_stack); NSZoneFree([self zone], _stack); DESTROY(_topPath); DESTROY(_currentFilePath); DESTROY(_mgr); [super dealloc]; } /** * Returns a dictionary containing the attributes of the directory * at which enumeration started.
* The contents of this dictionary are as produced by * [NSFileManager-fileAttributesAtPath:traverseLink:] */ - (NSDictionary*) directoryAttributes { return [_mgr fileAttributesAtPath: _topPath traverseLink: _flags.isFollowing ? YES : NO]; } /** * Returns a dictionary containing the attributes of the file * currently being enumerated.
* The contents of this dictionary are as produced by * [NSFileManager-fileAttributesAtPath:traverseLink:] */ - (NSDictionary*) fileAttributes { return [_mgr fileAttributesAtPath: _currentFilePath traverseLink: _flags.isFollowing ? YES : NO]; } /** * Informs the receiver that any descendents of the current directory * should be skipped rather than enumerated. Use this to avoid enumerating * the contents of directories you are not interested in. */ - (void) skipDescendents { if (GSIArrayCount(_stack) > 0) { GSIArrayRemoveLastItem(_stack); if (_currentFilePath != 0) { DESTROY(_currentFilePath); } } } /* * finds the next file according to the top enumerator * - if there is a next file it is put in currentFile * - if the current file is a directory and if isRecursive calls * recurseIntoDirectory: currentFile * - if the current file is a symlink to a directory and if isRecursive * and isFollowing calls recurseIntoDirectory: currentFile * - if at end of current directory pops stack and attempts to * find the next entry in the parent * - sets currentFile to nil if there are no more files to enumerate */ - (id) nextObject { NSString *returnFileName = nil; if (_currentFilePath != 0) { DESTROY(_currentFilePath); } while (GSIArrayCount(_stack) > 0) { GSEnumeratedDirectory dir = GSIArrayLastItem(_stack).ext; struct _STATB statbuf; const GSNativeChar *dirname = NULL; #ifdef __ANDROID__ if (dir.assetDir) { /* This will only return files and not directories, which means that * recursion is not supported. * See https://issuetracker.google.com/issues/37002833 */ dirname = AAssetDir_getNextFileName(dir.assetDir); } else if (dir.pointer) #endif { struct _DIRENT *dirbuf = _READDIR(dir.pointer); if (dirbuf) { dirname = dirbuf->d_name; } } if (dirname) { // Skip it if it is hidden and flag is yes... if (dirname[0] == '.' && _flags.skipHidden) { continue; } #if defined(_WIN32) /* Skip "." and ".." directory entries */ if (wcscmp(dirname, L".") == 0 || wcscmp(dirname, L"..") == 0) { continue; } /* Name of file to return */ returnFileName = [_mgr stringWithFileSystemRepresentation: dirname length: wcslen(dirname)]; #else /* Skip "." and ".." directory entries */ if (strcmp(dirname, ".") == 0 || strcmp(dirname, "..") == 0) { continue; } /* Name of file to return */ returnFileName = [_mgr stringWithFileSystemRepresentation: dirname length: strlen(dirname)]; #endif /* if we have a null FileName something went wrong (charset?) * and we skip it */ if (returnFileName == nil) continue; returnFileName = [dir.path stringByAppendingPathComponent: returnFileName]; if (!_flags.justContents) _currentFilePath = RETAIN([_topPath stringByAppendingPathComponent: returnFileName]); if (_flags.isRecursive) { // Do not follow links #ifdef S_IFLNK #ifdef _WIN32 #warning "lstat does not support unichars" #else if (!_flags.isFollowing) { if (lstat([_mgr fileSystemRepresentationWithPath: _currentFilePath], &statbuf) != 0) { break; } // If link then return it as link if (S_IFLNK == (S_IFMT & statbuf.st_mode)) { break; } } else #endif #endif { if (_STAT([_mgr fileSystemRepresentationWithPath: _currentFilePath], &statbuf) != 0) { break; } } if (S_IFDIR == (S_IFMT & statbuf.st_mode)) { _DIR *dir_pointer; dir_pointer = _OPENDIR([_mgr fileSystemRepresentationWithPath: _currentFilePath]); if (dir_pointer) { GSIArrayItem item; item.ext.path = RETAIN(returnFileName); item.ext.pointer = dir_pointer; GSIArrayAddItem(_stack, item); } else { BOOL flag = YES; NSDebugLog(@"Failed to recurse into directory '%@' - %@", _currentFilePath, [NSError _last]); if (_errorHandler != NULL) { flag = CALL_NON_NULL_BLOCK(_errorHandler, [NSURL fileURLWithPath: _currentFilePath], [NSError _last]); } if (flag == NO) { return nil; // Stop enumeration... } } } } break; // Got a file name - break out of loop } else { GSIArrayRemoveLastItem(_stack); if (_currentFilePath != 0) { DESTROY(_currentFilePath); } } } return returnFileName; } @end /* NSDirectoryEnumerator */ /** * Convenience methods for accessing named file attributes in a dictionary. */ @implementation NSDictionary(NSFileAttributes) /** * Return the file creation date attribute (or nil if not found). */ - (NSDate*) fileCreationDate { return [self objectForKey: NSFileCreationDate]; } /** * Return the file extension hidden attribute (or NO if not found). */ - (BOOL) fileExtensionHidden { return [[self objectForKey: NSFileExtensionHidden] boolValue]; } /** * Returns HFS creator attribute (OS X). */ - (OSType) fileHFSCreatorCode { return [[self objectForKey: NSFileHFSCreatorCode] unsignedLongValue]; } /** * Returns HFS type code attribute (OS X). */ - (OSType) fileHFSTypeCode { return [[self objectForKey: NSFileHFSTypeCode] unsignedLongValue]; } /** * Return the file append only attribute (or NO if not found). */ - (BOOL) fileIsAppendOnly { return [[self objectForKey: NSFileAppendOnly] boolValue]; } /** * Return the file immutable attribute (or NO if not found). */ - (BOOL) fileIsImmutable { return [[self objectForKey: NSFileImmutable] boolValue]; } /** * Return the size of the file, or NSNotFound if the file size attribute * is not found in the dictionary. */ - (unsigned long long) fileSize { NSNumber *n = [self objectForKey: NSFileSize]; if (n == nil) { return NSNotFound; } return [n unsignedLongLongValue]; } /** * Return the file type attribute or nil if not present. */ - (NSString*) fileType { return [self objectForKey: NSFileType]; } /** * Return the file owner account name attribute or nil if not present. */ - (NSString*) fileOwnerAccountName { return [self objectForKey: NSFileOwnerAccountName]; } /** * Return an NSNumber with the numeric value of the NSFileOwnerAccountID attribute * in the dictionary, or nil if the attribute is not present. */ - (NSNumber*) fileOwnerAccountID { return [self objectForKey: NSFileOwnerAccountID]; } /** * Return the file group owner account name attribute or nil if not present. */ - (NSString*) fileGroupOwnerAccountName { return [self objectForKey: NSFileGroupOwnerAccountName]; } /** * Return an NSNumber with the numeric value of the NSFileGroupOwnerAccountID attribute * in the dictionary, or nil if the attribute is not present. */ - (NSNumber*) fileGroupOwnerAccountID { return [self objectForKey: NSFileGroupOwnerAccountID]; } /** * Return the file modification date attribute (or nil if not found) */ - (NSDate*) fileModificationDate { return [self objectForKey: NSFileModificationDate]; } /** * Return the file posix permissions attribute (or NSNotFound if * the attribute is not present in the dictionary). */ - (NSUInteger) filePosixPermissions { NSNumber *n = [self objectForKey: NSFilePosixPermissions]; if (n == nil) { return NSNotFound; } return [n unsignedIntegerValue]; } /** * Return the file system number attribute (or NSNotFound if * the attribute is not present in the dictionary). */ - (NSUInteger) fileSystemNumber { NSNumber *n = [self objectForKey: NSFileSystemNumber]; if (n == nil) { return NSNotFound; } return [n unsignedIntegerValue]; } /** * Return the file system file identification number attribute * or NSNotFound if the attribute is not present in the dictionary). */ - (NSUInteger) fileSystemFileNumber { NSNumber *n = [self objectForKey: NSFileSystemFileNumber]; if (n == nil) { return NSNotFound; } return [n unsignedIntegerValue]; } @end @implementation NSFileManager (PrivateMethods) - (BOOL) _copyFile: (NSString*)source toFile: (NSString*)destination handler: (id)handler { #if defined(_WIN32) if (CopyFileW([self fileSystemRepresentationWithPath: source], [self fileSystemRepresentationWithPath: destination], NO)) { return YES; } return [self _proceedAccordingToHandler: handler forError: @"cannot copy file" inPath: source fromPath: source toPath: destination]; #else NSDictionary *attributes; NSDate *modification; unsigned long long fileSize; unsigned long long i; int bufsize = 8096; int sourceFd; int destFd; int fileMode; int rbytes; int wbytes; char buffer[bufsize]; #ifdef __ANDROID__ AAsset *asset = NULL; #endif attributes = [self fileAttributesAtPath: source traverseLink: NO]; if (nil == attributes) { return [self _proceedAccordingToHandler: handler forError: @"source file does not exist" inPath: source fromPath: source toPath: destination]; } fileSize = [attributes fileSize]; fileMode = [attributes filePosixPermissions]; modification = [attributes fileModificationDate]; /* Open the source file. In case of error call the handler. */ sourceFd = open([self fileSystemRepresentationWithPath: source], GSBINIO|O_RDONLY); #ifdef __ANDROID__ if (sourceFd < 0) { // Android: try using asset manager if path is in main bundle resources asset = [NSBundle assetForPath: source withMode: AASSET_MODE_STREAMING]; } if (sourceFd < 0 && asset == NULL) #else if (sourceFd < 0) #endif { return [self _proceedAccordingToHandler: handler forError: @"cannot open file for reading" inPath: source fromPath: source toPath: destination]; } /* Open the destination file. In case of error call the handler. */ destFd = open([self fileSystemRepresentationWithPath: destination], GSBINIO|O_WRONLY|O_CREAT|O_TRUNC, fileMode); if (destFd < 0) { #ifdef __ANDROID__ if (asset) { AAsset_close(asset); } else #endif close (sourceFd); return [self _proceedAccordingToHandler: handler forError: @"cannot open file for writing" inPath: destination fromPath: source toPath: destination]; } /* Read bufsize bytes from source file and write them into the destination file. In case of errors call the handler and abort the operation. */ for (i = 0; i < fileSize; i += rbytes) { #ifdef __ANDROID__ if (asset) { rbytes = AAsset_read(asset, buffer, bufsize); } else #endif rbytes = read (sourceFd, buffer, bufsize); if (rbytes <= 0) { if (0 == rbytes) { break; // End of input file } #ifdef __ANDROID__ if (asset) { AAsset_close(asset); } else #endif close (sourceFd); close (destFd); return [self _proceedAccordingToHandler: handler forError: @"cannot read from file" inPath: source fromPath: source toPath: destination]; } wbytes = write (destFd, buffer, rbytes); if (wbytes != rbytes) { #ifdef __ANDROID__ if (asset) { AAsset_close(asset); } else #endif close (sourceFd); close (destFd); return [self _proceedAccordingToHandler: handler forError: @"cannot write to file" inPath: destination fromPath: source toPath: destination]; } } #ifdef __ANDROID__ if (asset) { AAsset_close(asset); } else #endif close (sourceFd); close (destFd); /* Check for modification during copy. */ attributes = [self fileAttributesAtPath: source traverseLink: NO]; if (NO == [modification isEqual: [attributes fileModificationDate]] || [attributes fileSize] != fileSize) { return [self _proceedAccordingToHandler: handler forError: @"source modified during copy" inPath: destination fromPath: source toPath: destination]; } return YES; #endif } - (BOOL) _copyPath: (NSString*)source toPath: (NSString*)destination handler: handler { NSDirectoryEnumerator *enumerator; NSString *dirEntry; BOOL result = YES; ENTER_POOL enumerator = [self enumeratorAtPath: source]; while ((dirEntry = [enumerator nextObject])) { NSString *sourceFile; NSString *fileType; NSString *destinationFile; NSDictionary *attributes; attributes = [enumerator fileAttributes]; fileType = [attributes fileType]; sourceFile = [source stringByAppendingPathComponent: dirEntry]; destinationFile = [destination stringByAppendingPathComponent: dirEntry]; [self _sendToHandler: handler willProcessPath: sourceFile]; if ([fileType isEqual: NSFileTypeDirectory]) { NSMutableDictionary *newAttributes; BOOL dirOK; newAttributes = [attributes mutableCopy]; [newAttributes removeObjectForKey: NSFileOwnerAccountID]; [newAttributes removeObjectForKey: NSFileGroupOwnerAccountID]; [newAttributes removeObjectForKey: NSFileGroupOwnerAccountName]; [newAttributes setObject: NSUserName() forKey: NSFileOwnerAccountName]; dirOK = [self createDirectoryAtPath: destinationFile attributes: newAttributes]; RELEASE(newAttributes); if (dirOK == NO) { if (![self _proceedAccordingToHandler: handler forError: _lastError inPath: destinationFile fromPath: sourceFile toPath: destinationFile]) { result = NO; break; } /* * We may have managed to create the directory but not set * its attributes ... if so we can continue copying. */ if (![self fileExistsAtPath: destinationFile isDirectory: &dirOK]) { dirOK = NO; } } if (dirOK == YES) { [enumerator skipDescendents]; if (![self _copyPath: sourceFile toPath: destinationFile handler: handler]) { result = NO; break; } } } else if ([fileType isEqual: NSFileTypeRegular]) { if (![self _copyFile: sourceFile toFile: destinationFile handler: handler]) { result = NO; break; } } else if ([fileType isEqual: NSFileTypeSymbolicLink]) { NSString *path; path = [self pathContentOfSymbolicLinkAtPath: sourceFile]; if (![self createSymbolicLinkAtPath: destinationFile pathContent: path]) { if (![self _proceedAccordingToHandler: handler forError: @"cannot create symbolic link" inPath: sourceFile fromPath: sourceFile toPath: destinationFile]) { result = NO; break; } } } else { NSString *s; s = [NSString stringWithFormat: @"cannot copy file type '%@'", fileType]; ASSIGN(_lastError, s); NSDebugLog(@"%@: %@", sourceFile, s); continue; } [self changeFileAttributes: attributes atPath: destinationFile]; } LEAVE_POOL return result; } - (BOOL) _linkPath: (NSString*)source toPath: (NSString*)destination handler: handler { #ifdef HAVE_LINK NSDirectoryEnumerator *enumerator; NSString *dirEntry; BOOL result = YES; ENTER_POOL enumerator = [self enumeratorAtPath: source]; while ((dirEntry = [enumerator nextObject])) { NSString *sourceFile; NSString *fileType; NSString *destinationFile; NSDictionary *attributes; attributes = [enumerator fileAttributes]; fileType = [attributes fileType]; sourceFile = [source stringByAppendingPathComponent: dirEntry]; destinationFile = [destination stringByAppendingPathComponent: dirEntry]; [self _sendToHandler: handler willProcessPath: sourceFile]; if ([fileType isEqual: NSFileTypeDirectory] == YES) { if ([self createDirectoryAtPath: destinationFile attributes: attributes] == NO) { if ([self _proceedAccordingToHandler: handler forError: _lastError inPath: destinationFile fromPath: sourceFile toPath: destinationFile] == NO) { result = NO; break; } } else { [enumerator skipDescendents]; if ([self _linkPath: sourceFile toPath: destinationFile handler: handler] == NO) { result = NO; break; } } } else if ([fileType isEqual: NSFileTypeSymbolicLink]) { NSString *path; path = [self pathContentOfSymbolicLinkAtPath: sourceFile]; if ([self createSymbolicLinkAtPath: destinationFile pathContent: path] == NO) { if ([self _proceedAccordingToHandler: handler forError: @"cannot create symbolic link" inPath: sourceFile fromPath: sourceFile toPath: destinationFile] == NO) { result = NO; break; } } } else { if (link([self fileSystemRepresentationWithPath: sourceFile], [self fileSystemRepresentationWithPath: destinationFile]) < 0) { if ([self _proceedAccordingToHandler: handler forError: @"cannot create hard link" inPath: sourceFile fromPath: sourceFile toPath: destinationFile] == NO) { result = NO; break; } } } [self changeFileAttributes: attributes atPath: destinationFile]; } LEAVE_POOL return result; #else ASSIGN(_lastError, @"Links not supported on this platform"); return NO; #endif } - (void) _sendToHandler: (id) handler willProcessPath: (NSString*) path { if ([handler respondsToSelector: @selector (fileManager:willProcessPath:)]) { [handler fileManager: self willProcessPath: path]; } } - (BOOL) _proceedAccordingToHandler: (id) handler forError: (NSString*) error inPath: (NSString*) path { if ([handler respondsToSelector: @selector (fileManager:shouldProceedAfterError:)]) { NSDictionary *errorInfo = [NSDictionary dictionaryWithObjectsAndKeys: path, NSFilePathErrorKey, error, @"Error", nil]; return [handler fileManager: self shouldProceedAfterError: errorInfo]; } return NO; } - (BOOL) _proceedAccordingToHandler: (id) handler forError: (NSString*) error inPath: (NSString*) path fromPath: (NSString*) fromPath toPath: (NSString*) toPath { if ([handler respondsToSelector: @selector (fileManager:shouldProceedAfterError:)]) { NSDictionary *errorInfo = [NSDictionary dictionaryWithObjectsAndKeys: path, NSFilePathErrorKey, fromPath, @"FromPath", toPath, @"ToPath", error, @"Error", nil]; return [handler fileManager: self shouldProceedAfterError: errorInfo]; } return NO; } - (NSError*) _errorFrom: (NSString *)fromPath to: (NSString *)toPath { NSError *error; NSDictionary *errorInfo; NSString *message; NSString *domain; NSInteger code; if (_lastError) { message = _lastError; domain = NSCocoaErrorDomain; code = 0; } else { error = [NSError _last]; message = [error localizedDescription]; domain = [error domain]; code = [error code]; } if (fromPath && toPath) { errorInfo = [NSDictionary dictionaryWithObjectsAndKeys: fromPath, @"FromPath", toPath, @"ToPath", message, NSLocalizedDescriptionKey, nil]; } else if (fromPath) { errorInfo = [NSDictionary dictionaryWithObjectsAndKeys: fromPath, NSFilePathErrorKey, message, NSLocalizedDescriptionKey, nil]; } else { errorInfo = [NSDictionary dictionaryWithObjectsAndKeys: message, NSLocalizedDescriptionKey, nil]; } error = [NSError errorWithDomain: domain code: code userInfo: errorInfo]; DESTROY(_lastError); return error; } @end /* NSFileManager (PrivateMethods) */ @implementation GSAttrDictionary static NSSet *fileKeys = nil; + (NSDictionary*) attributesAt: (NSString *)path traverseLink: (BOOL)traverse { GSAttrDictionary *d; unsigned l = 0; unsigned i; const GSNativeChar *lpath; #ifdef __ANDROID__ AAsset *asset = NULL; #endif lpath = [defaultManager fileSystemRepresentationWithPath: path]; if (lpath == 0 || *lpath == 0) { return nil; } while (lpath[l] != 0) { l++; } d = (GSAttrDictionary*)NSAllocateObject(self, (l+1)*sizeof(GSNativeChar), NSDefaultMallocZone()); #if defined(S_IFLNK) && !defined(_WIN32) if (traverse == NO) { if (lstat(lpath, &d->statbuf) != 0) { #ifdef __ANDROID__ /* Android: try using asset manager if path is in * main bundle resources */ asset = [NSBundle assetForPath: path]; if (asset == NULL) #endif DESTROY(d); } } else #endif if (_STAT(lpath, &d->statbuf) != 0) { #ifdef __ANDROID__ // Android: try using asset manager if path is in main bundle resources asset = [NSBundle assetForPath: path]; if (asset == NULL) #endif DESTROY(d); } if (d != nil) { for (i = 0; i <= l; i++) { d->_path[i] = lpath[i]; } #ifdef __ANDROID__ if (asset) { // set some basic stat values for Android assets memset(&d->statbuf, 0, sizeof(d->statbuf)); d->statbuf.st_mode = S_IRUSR; d->statbuf.st_size = AAsset_getLength(asset); AAsset_close(asset); } #endif } return AUTORELEASE(d); } + (void) initialize { if (fileKeys == nil) { fileKeys = [[NSSet alloc] initWithObjects: NSFileAppendOnly, NSFileCreationDate, NSFileDeviceIdentifier, NSFileExtensionHidden, NSFileGroupOwnerAccountName, NSFileGroupOwnerAccountID, NSFileHFSCreatorCode, NSFileHFSTypeCode, NSFileImmutable, NSFileModificationDate, NSFileOwnerAccountName, NSFileOwnerAccountID, NSFilePosixPermissions, NSFileReferenceCount, NSFileSize, NSFileSystemFileNumber, NSFileSystemNumber, NSFileType, nil]; [[NSObject leakAt: &fileKeys] release]; } } - (NSUInteger) count { return [fileKeys count]; } - (NSDate*) fileCreationDate { #if defined(_WIN32) return [NSDate dateWithTimeIntervalSince1970: statbuf.st_ctime]; #elif defined (HAVE_STRUCT_STAT_ST_BIRTHTIM) NSTimeInterval ti; ti = statbuf.st_birthtim.tv_sec + (double)statbuf.st_birthtim.tv_nsec / 1.0e9; return [NSDate dateWithTimeIntervalSince1970: ti]; #elif defined (HAVE_STRUCT_STAT_ST_BIRTHTIME) return [NSDate dateWithTimeIntervalSince1970: statbuf.st_birthtime]; #elif defined (HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC) || defined (HAVE_STRUCT_STAT64_ST_BIRTHTIMESPEC) NSTimeInterval ti; ti = statbuf.st_birthtimespec.tv_sec + (double)statbuf.st_birthtimespec.tv_nsec / 1.0e9; return [NSDate dateWithTimeIntervalSince1970: ti]; #else /* We don't know a better way to get creation date, it is not defined in POSIX * Use the earlier of ctime or mtime */ if (statbuf.st_ctime < statbuf.st_mtime) return [NSDate dateWithTimeIntervalSince1970: statbuf.st_ctime]; else return [NSDate dateWithTimeIntervalSince1970: statbuf.st_mtime]; #endif } - (BOOL) fileExtensionHidden { return NO; } - (NSNumber*) fileGroupOwnerAccountID { return [NSNumber numberWithInt: statbuf.st_gid]; } - (NSString*) fileGroupOwnerAccountName { NSString *group = @"UnknownGroup"; #if defined(_WIN32) DWORD returnCode = 0; PSID sidOwner; int result = TRUE; GSNativeChar account[BUFSIZ]; GSNativeChar domain[BUFSIZ]; DWORD accountSize = 1024; DWORD domainSize = 1024; SID_NAME_USE eUse = SidTypeUnknown; HANDLE hFile; PSECURITY_DESCRIPTOR pSD; // Get the handle of the file object. hFile = CreateFileW( _path, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); // Check GetLastError for CreateFile error code. if (hFile == INVALID_HANDLE_VALUE) { DWORD dwErrorCode = 0; dwErrorCode = GetLastError(); NSDebugMLog(@"Error %lu getting file handle for '%ls'", dwErrorCode, (const unichar *)_path); return group; } // Get the group SID of the file. returnCode = GetSecurityInfo( hFile, SE_FILE_OBJECT, GROUP_SECURITY_INFORMATION, 0, &sidOwner, 0, 0, &pSD); CloseHandle(hFile); // Check GetLastError for GetSecurityInfo error condition. if (returnCode != ERROR_SUCCESS) { DWORD dwErrorCode = 0; dwErrorCode = GetLastError(); NSDebugMLog(@"Error %lu getting security info for '%ls'", dwErrorCode, (const unichar *)_path); return group; } // First call to LookupAccountSid to get the buffer sizes. result = LookupAccountSidW( 0, // local computer sidOwner, account, (LPDWORD)&accountSize, domain, (LPDWORD)&domainSize, &eUse); // Check GetLastError for LookupAccountSid error condition. if (result == FALSE) { DWORD dwErrorCode = 0; dwErrorCode = GetLastError(); if (dwErrorCode == ERROR_NONE_MAPPED) NSDebugMLog(@"Error %lu in LookupAccountSid for '%ls'", dwErrorCode, (const unichar *)_path); else NSDebugMLog(@"Error %lu getting security info for '%ls'", dwErrorCode, (const unichar *)_path); return group; } if (accountSize >= 1024) { NSDebugMLog(@"Account name for '%ls' is unreasonably long", (const unichar *)_path); return group; } return [NSString stringWithCharacters: account length: accountSize]; #else #if defined(HAVE_GRP_H) #if defined(HAVE_GETGRGID_H) struct group gp; struct group *p; char buf[BUFSIZ*10]; if (getgrgid_r(statbuf.st_gid, &gp, buf, sizeof(buf), &p) == 0) { group = [NSString stringWithCString: gp.gr_name encoding: defaultEncoding]; } #else #if defined(HAVE_GETGRGID) struct group *gp; [gnustep_global_lock lock]; gp = getgrgid(statbuf.st_gid); if (gp != 0) { group = [NSString stringWithCString: gp->gr_name encoding: defaultEncoding]; } [gnustep_global_lock unlock]; #endif #endif #endif #endif return group; } - (OSType) fileHFSCreatorCode { return 0; } - (OSType) fileHFSTypeCode { return 0; } - (BOOL) fileIsAppendOnly { return 0; } - (BOOL) fileIsImmutable { return 0; } - (NSDate*) fileModificationDate { NSTimeInterval ti; #if defined (HAVE_STRUCT_STAT_ST_MTIM) ti = statbuf.st_mtim.tv_sec + (double)statbuf.st_mtim.tv_nsec / 1.0e9; #else ti = (double)statbuf.st_mtime; #endif return [NSDate dateWithTimeIntervalSince1970: ti]; } - (NSUInteger) filePosixPermissions { return (statbuf.st_mode & ~S_IFMT); } - (NSNumber*) fileOwnerAccountID { return [NSNumber numberWithInt: statbuf.st_uid]; } - (NSString*) fileOwnerAccountName { NSString *owner = @"UnknownUser"; #if defined(_WIN32) DWORD returnCode = 0; PSID sidOwner; int result = TRUE; GSNativeChar account[BUFSIZ]; GSNativeChar domain[BUFSIZ]; DWORD accountSize = 1024; DWORD domainSize = 1024; SID_NAME_USE eUse = SidTypeUnknown; HANDLE hFile; PSECURITY_DESCRIPTOR pSD; // Get the handle of the file object. hFile = CreateFileW( _path, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); // Check GetLastError for CreateFile error code. if (hFile == INVALID_HANDLE_VALUE) { DWORD dwErrorCode = 0; dwErrorCode = GetLastError(); NSDebugMLog(@"Error %lu getting file handle for '%ls'", dwErrorCode, (const unichar *)_path); return owner; } // Get the owner SID of the file. returnCode = GetSecurityInfo( hFile, SE_FILE_OBJECT, OWNER_SECURITY_INFORMATION, &sidOwner, 0, 0, 0, &pSD); CloseHandle(hFile); // Check GetLastError for GetSecurityInfo error condition. if (returnCode != ERROR_SUCCESS) { DWORD dwErrorCode = 0; dwErrorCode = GetLastError(); NSDebugMLog(@"Error %lu getting security info for '%ls'", dwErrorCode, (const unichar *)_path); return owner; } // First call to LookupAccountSid to get the buffer sizes. result = LookupAccountSidW( 0, // local computer sidOwner, account, (LPDWORD)&accountSize, domain, (LPDWORD)&domainSize, &eUse); // Check GetLastError for LookupAccountSid error condition. if (result == FALSE) { DWORD dwErrorCode = 0; dwErrorCode = GetLastError(); if (dwErrorCode == ERROR_NONE_MAPPED) NSDebugMLog(@"Error %lu in LookupAccountSid for '%ls'", dwErrorCode, (const unichar *)_path); else NSDebugMLog(@"Error %lu getting security info for '%ls'", dwErrorCode, (const unichar *)_path); return owner; } if (accountSize >= 1024) { NSDebugMLog(@"Account name for '%ls' is unreasonably long", (const unichar *)_path); return owner; } return [NSString stringWithCharacters: account length: accountSize]; #else #ifdef HAVE_PWD_H #if defined(HAVE_GETPWUID_R) struct passwd pw; struct passwd *p; char buf[BUFSIZ*10]; if (getpwuid_r(statbuf.st_uid, &pw, buf, sizeof(buf), &p) == 0) { owner = [NSString stringWithCString: pw.pw_name encoding: defaultEncoding]; } #else #if defined(HAVE_GETPWUID) struct passwd *pw; [gnustep_global_lock lock]; pw = getpwuid(statbuf.st_uid); if (pw != 0) { owner = [NSString stringWithCString: pw->pw_name encoding: defaultEncoding]; } [gnustep_global_lock unlock]; #endif #endif #endif /* HAVE_PWD_H */ #endif return owner; } - (unsigned long long) fileSize { return statbuf.st_size; } - (NSUInteger) fileSystemFileNumber { return statbuf.st_ino; } - (NSUInteger) fileSystemNumber { #if defined(_WIN32) DWORD volumeSerialNumber = 0; GSNativeChar volumePathName[128]; if (GetVolumePathNameW(_path,volumePathName,128)) { GetVolumeInformationW(volumePathName,NULL,0,&volumeSerialNumber,NULL,NULL,NULL,0); } return (NSUInteger)volumeSerialNumber; #else return statbuf.st_dev; #endif } - (NSString*) fileType { switch (statbuf.st_mode & S_IFMT) { case S_IFREG: return NSFileTypeRegular; case S_IFDIR: return NSFileTypeDirectory; case S_IFCHR: return NSFileTypeCharacterSpecial; #if defined(S_IFBLK) && !defined(_WIN32) case S_IFBLK: return NSFileTypeBlockSpecial; #endif #if defined(S_IFLNK) && !defined(_WIN32) case S_IFLNK: return NSFileTypeSymbolicLink; #endif #ifdef S_IFIFO case S_IFIFO: return NSFileTypeFifo; #endif #ifdef S_IFSOCK case S_IFSOCK: return NSFileTypeSocket; #endif default: return NSFileTypeUnknown; } } - (NSEnumerator*) keyEnumerator { return [fileKeys objectEnumerator]; } - (NSEnumerator*) objectEnumerator { return [GSAttrDictionaryEnumerator enumeratorFor: self]; } - (id) objectForKey: (id)key { int count = 0; while (key != 0 && count < 2) { if (key == NSFileAppendOnly) return [NSNumber numberWithBool: [self fileIsAppendOnly]]; if (key == NSFileCreationDate) return [self fileCreationDate]; if (key == NSFileDeviceIdentifier) return [NSNumber numberWithUnsignedInt: statbuf.st_dev]; if (key == NSFileExtensionHidden) return [NSNumber numberWithBool: [self fileExtensionHidden]]; if (key == NSFileGroupOwnerAccountName) return [self fileGroupOwnerAccountName]; if (key == NSFileGroupOwnerAccountID) return [self fileGroupOwnerAccountID]; if (key == NSFileHFSCreatorCode) return [NSNumber numberWithUnsignedLong: [self fileHFSCreatorCode]]; if (key == NSFileHFSTypeCode) return [NSNumber numberWithUnsignedLong: [self fileHFSTypeCode]]; if (key == NSFileImmutable) return [NSNumber numberWithBool: [self fileIsImmutable]]; if (key == NSFileModificationDate) return [self fileModificationDate]; if (key == NSFileOwnerAccountName) return [self fileOwnerAccountName]; if (key == NSFileOwnerAccountID) return [self fileOwnerAccountID]; if (key == NSFilePosixPermissions) return [NSNumber numberWithUnsignedInt: [self filePosixPermissions]]; if (key == NSFileReferenceCount) return [NSNumber numberWithUnsignedInt: statbuf.st_nlink]; if (key == NSFileSize) return [NSNumber numberWithUnsignedLongLong: [self fileSize]]; if (key == NSFileSystemFileNumber) return [NSNumber numberWithUnsignedInt: [self fileSystemFileNumber]]; if (key == NSFileSystemNumber) return [NSNumber numberWithUnsignedInt: [self fileSystemNumber]]; if (key == NSFileType) return [self fileType]; /* * Now, if we didn't get an exact pointer match, check for * string equalities and ensure we get an exact match next * time round the loop. */ count++; key = [fileKeys member: key]; } if (count >= 2) { NSDebugLog(@"Warning ... key '%@' not handled", key); } return nil; } @end /* GSAttrDictionary */ @implementation GSAttrDictionaryEnumerator + (NSEnumerator*) enumeratorFor: (NSDictionary*)d { GSAttrDictionaryEnumerator *e; e = (GSAttrDictionaryEnumerator*) NSAllocateObject(self, 0, NSDefaultMallocZone()); e->dictionary = RETAIN(d); e->enumerator = RETAIN([fileKeys objectEnumerator]); return AUTORELEASE(e); } - (void) dealloc { RELEASE(enumerator); RELEASE(dictionary); [super dealloc]; } - (id) nextObject { NSString *key = [enumerator nextObject]; id val = nil; if (key != nil) { val = [dictionary objectForKey: key]; } return val; } @end gnustep-base-1.29.0/Source/NSFileVersion.m000066400000000000000000000133621435650067400203230ustar00rootroot00000000000000/* Definition of class NSFileVersion Copyright (C) 2019 Free Software Foundation, Inc. Implemented by: Gregory Casamento Date: Sep 2019 Original File by: Daniel Ferreira This file is part of the GNUstep Library. 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 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 USA. */ #include #include #include #include #include #include #include #include #include #include @interface NSFileVersion (Private) - (void) _setURL: (NSURL *)u; - (void) _setContentsURL: (NSURL *)u; - (void) _setConflict: (BOOL)f; - (void) _setLocalizedName: (NSString *)name; - (void) _initWithURL: (NSURL *)url; @end @implementation NSFileVersion (Private) - (void) _setURL: (NSURL *)u { ASSIGNCOPY(_fileURL, u); } - (void) _setContentsURL: (NSURL *)u { ASSIGNCOPY(_contentsURL, u); } - (void) _setConflict: (BOOL)f { _conflict = f; } - (void) _setLocalizedName: (NSString *)name { ASSIGNCOPY(_localizedName, name); } - (void) _initWithURL: (NSURL *)url { [self _setURL: url]; [self _setContentsURL: url]; [self _setConflict: NO]; [self _setLocalizedName: [url path]]; [self setDiscardable: NO]; [self setResolved: YES]; } @end @implementation NSFileVersion // Initializers + (NSFileVersion *)currentVersionOfItemAtURL: (NSURL *)url { NSFileVersion *fileVersion = AUTORELEASE([[NSFileVersion alloc] init]); if (fileVersion != nil) { [fileVersion _initWithURL: url]; } return fileVersion; } + (NSArray *)otherVersionsOfItemAtURL: (NSURL *)url { NSArray *array = AUTORELEASE([[NSArray alloc] init]); return array; } + (NSFileVersion *)versionOfItemAtURL: (NSURL *)url forPersistentIdentifier: (id)persistentIdentifier { return [NSFileVersion currentVersionOfItemAtURL: url]; } + (NSURL *)temporaryDirectoryURLForNewVersionOfItemAtURL: (NSURL *)url { return nil; } + (NSFileVersion *)addVersionOfItemAtURL: (NSURL *)url withContentsOfURL: (NSURL *)contentsURL options: (NSFileVersionAddingOptions)options error: (NSError **)outError { NSFileVersion *fileVersion = AUTORELEASE([[NSFileVersion alloc] init]); if (fileVersion != nil) { NSData *data = [NSData dataWithContentsOfURL: contentsURL]; NSFileManager *mgr = [NSFileManager defaultManager]; [fileVersion _initWithURL: url]; // Create new file... [mgr createFileAtPath: [url path] contents: data attributes: nil]; } return fileVersion; } + (NSArray *)unresolvedConflictVersionsOfItemAtURL: (NSURL *)url { return nil; } + (BOOL)removeOtherVersionsOfItemAtURL: (NSURL *)url error: (NSError **)outError { NSFileManager *mgr = [NSFileManager defaultManager]; return [mgr removeItemAtPath: [url path] error: outError]; } // Instance methods... - (instancetype) init { self = [super init]; if(self != nil) { _isDiscardable = NO; _isResolved = NO; _modificationDate = [[NSDate alloc] init]; _fileURL = nil; _contentsURL = nil; _persistentIdentifier = nil; _nonLocalVersion = nil; _hasThumbnail = NO; _hasLocalContents = YES; _conflict = NO; _localizedName = nil; _localizedNameOfSavingComputer = nil; } return self; } - (BOOL) isDiscardable { return _isDiscardable; } - (void) setDiscardable: (BOOL)flag { _isDiscardable = flag; } - (BOOL) isResolved { return _isResolved; } - (void) setResolved: (BOOL)flag { _isResolved = flag; } - (NSDate *) modificationDate { return _modificationDate; } - (NSPersonNameComponents *) originatorNameComponents { return nil; } - (NSString *) localizedName { return _localizedName; } - (NSString *) localizedNameOfSavingComputer { return _localizedNameOfSavingComputer; } - (BOOL) hasLocalContents { return _hasLocalContents; } - (BOOL) hasThumbnail { return _hasThumbnail; } - (NSURL *) URL { return _fileURL; } - (BOOL) conflict { return _conflict; } - (id) persistentIdentifier { return _persistentIdentifier; } - (BOOL) removeAndReturnError: (NSError **)outError { NSURL *url = [self URL]; NSFileManager *mgr = [NSFileManager defaultManager]; return [mgr removeItemAtPath: [url path] error: outError]; } - (NSURL *) replaceItemAtURL: (NSURL *)url options: (NSFileVersionReplacingOptions)options error: (NSError **)error { NSFileManager *mgr = [NSFileManager defaultManager]; if([mgr removeItemAtPath: [url path] error: error]) { NSData *data = [NSData dataWithContentsOfURL: _contentsURL]; NSFileManager *mgr = [NSFileManager defaultManager]; // Create new file... [mgr createFileAtPath: [url path] contents: data attributes: nil]; } return url; } @end gnustep-base-1.29.0/Source/NSFileWrapper.m000066400000000000000000000476031435650067400203230ustar00rootroot00000000000000/** NSFileWrapper Hold a file's contents in dynamic memory. Copyright (C) 1996 Free Software Foundation, Inc. Author: Felipe A. Rodriguez Date: Sept 1998 Author: Jonathan Gapen Date: Dec 1999 Moved to BASE by Gregory Casamento Date: Sep 2019 This file is part of the GNUstep BASE Library. 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 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; see the file COPYING.LIB. If not, see or write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "config.h" #import #import #import #import #import #import #import #import #import #import @implementation NSFileWrapper // // Initialization // // Init instance of directory type - (id) initDirectoryWithFileWrappers: (NSDictionary*)docs { self = [super init]; if (self != nil) { NSEnumerator *enumerator; id key; NSFileWrapper *wrapper; _wrapperType = GSFileWrapperDirectoryType; _wrapperData = [[NSMutableDictionary alloc] initWithCapacity: [docs count]]; enumerator = [docs keyEnumerator]; while ((key = [enumerator nextObject]) != nil) { wrapper = (NSFileWrapper*)[docs objectForKey: key]; if (![wrapper preferredFilename]) { [wrapper setPreferredFilename: key]; } [_wrapperData setObject: wrapper forKey: key]; } } return self; } // Init instance of regular file type - (id) initRegularFileWithContents: (NSData*)data { self = [super init]; if (self != nil) { _wrapperData = [data copyWithZone: [self zone]]; _wrapperType = GSFileWrapperRegularFileType; } return self; } // Init instance of symbolic link type - (id) initSymbolicLinkWithDestination: (NSString*)path { self = [super init]; if (self != nil) { _wrapperData = [path copyWithZone: [self zone]]; _wrapperType = GSFileWrapperSymbolicLinkType; } return self; } - (id) initSymbolicLinkWithDestinationURL: (NSURL*)url { // FIXME return [self initSymbolicLinkWithDestination: [url path]]; } /** * Init an instance from the file, directory, or symbolic link at path.
* This can create a tree of instances with a directory instance at the top */ - (id) initWithPath: (NSString*)path { ENTER_POOL NSFileManager *fm = [NSFileManager defaultManager]; NSDictionary *fileAttributes; NSString *fileType; NSDebugLLog(@"NSFileWrapper", @"initWithPath: %@", path); fileAttributes = [fm fileAttributesAtPath: path traverseLink: NO]; fileType = [fileAttributes fileType]; if ([fileType isEqualToString: NSFileTypeDirectory]) { NSString *filename; NSMutableArray *fileWrappers = [NSMutableArray array]; NSArray *filenames = [fm directoryContentsAtPath: path]; NSEnumerator *enumerator = [filenames objectEnumerator]; while ((filename = [enumerator nextObject]) != nil) { NSFileWrapper *w; w = [[NSFileWrapper alloc] initWithPath: [path stringByAppendingPathComponent: filename]]; [fileWrappers addObject: w]; RELEASE(w); } self = [self initDirectoryWithFileWrappers: [NSDictionary dictionaryWithObjects: fileWrappers forKeys: filenames]]; } else if ([fileType isEqualToString: NSFileTypeRegular]) { self = [self initRegularFileWithContents: AUTORELEASE([[NSData alloc] initWithContentsOfFile: path])]; } else if ([fileType isEqualToString: NSFileTypeSymbolicLink]) { self = [self initSymbolicLinkWithDestination: [fm pathContentOfSymbolicLinkAtPath: path]]; } // Store the full path in filename, the specification is unclear in this point [self setFilename: path]; [self setPreferredFilename: [path lastPathComponent]]; [self setFileAttributes: fileAttributes]; LEAVE_POOL return self; } - (id) initWithURL: (NSURL*)url options: (NSFileWrapperReadingOptions)options error: (NSError**)outError { // FIXME if ([self readFromURL: url options: options error: outError]) { return self; } else { DESTROY(self); return nil; } } // Init an instance from data in std serial format. Serial format is the // same as that used by NSText's RTFDFromRange: method. This can // create a tree of instances with a directory instance at the top - (id) initWithSerializedRepresentation: (NSData*)data { // FIXME - This should use a serializer. To get that working a helper object // is needed that implements the NSObjCTypeSerializationCallBack protocol. // We should add this later, currently the NSArchiver is used. // Thanks to Richard, for pointing this out. NSFileWrapper *wrapper = [NSUnarchiver unarchiveObjectWithData: data]; RELEASE(self); return RETAIN(wrapper); } - (void) dealloc { TEST_RELEASE(_filename); TEST_RELEASE(_fileAttributes); TEST_RELEASE(_preferredFilename); TEST_RELEASE(_wrapperData); TEST_RELEASE(_icon); [super dealloc]; } // // General methods // // write instance to disk at path; if directory type, this // method is recursive; if updateFilenamesFlag is YES, the wrapper // will be updated with the name used in writing the file - (BOOL) writeToFile: (NSString*)path atomically: (BOOL)atomicFlag updateFilenames: (BOOL)updateFilenamesFlag { NSFileManager *fm = [NSFileManager defaultManager]; BOOL success = NO; NSDebugLLog(@"NSFileWrapper", @"writeToFile: %@ atomically: updateFilenames: ", path); switch (_wrapperType) { case GSFileWrapperDirectoryType: { // FIXME - more robust save proceedure when atomicFlag set NSEnumerator *enumerator = [_wrapperData keyEnumerator]; NSString *key; [fm createDirectoryAtPath: path withIntermediateDirectories: YES attributes: _fileAttributes error: NULL]; while ((key = (NSString*)[enumerator nextObject])) { NSString *newPath = [path stringByAppendingPathComponent: key]; [[_wrapperData objectForKey: key] writeToFile: newPath atomically: atomicFlag updateFilenames: updateFilenamesFlag]; } success = YES; break; } case GSFileWrapperRegularFileType: { if ([_wrapperData writeToFile: path atomically: atomicFlag]) success = [fm changeFileAttributes: _fileAttributes atPath: path]; break; } case GSFileWrapperSymbolicLinkType: { success = [fm createSymbolicLinkAtPath: path pathContent: _wrapperData]; break; } } if (success && updateFilenamesFlag) { [self setFilename: [path lastPathComponent]]; } return success; } - (NSData*) serializedRepresentation { // FIXME - This should use a serializer. To get that working a helper object // is needed that implements the NSObjCTypeSerializationCallBack protocol. // We should add this later, currently the NSArchiver is used. // Thanks to Richard, for pointing this out. return [NSArchiver archivedDataWithRootObject: self]; } - (void) setFilename: (NSString*)filename { if (filename == nil || [filename isEqualToString: @""]) { [NSException raise: NSInternalInconsistencyException format: @"Empty or nil argument to setFilename: "]; } else { ASSIGN(_filename, filename); } } - (NSString*) filename { return _filename; } - (void) setPreferredFilename: (NSString*)filename { if (filename == nil || [filename isEqualToString: @""]) { [NSException raise: NSInternalInconsistencyException format: @"Empty or nil argument to setPreferredFilename: "]; } else { ASSIGN(_preferredFilename, filename); } } - (NSString*) preferredFilename { return _preferredFilename; } - (void) setFileAttributes: (NSDictionary*)attributes { if (_fileAttributes == nil) { _fileAttributes = [NSMutableDictionary new]; } [_fileAttributes addEntriesFromDictionary: attributes]; } - (NSDictionary*) fileAttributes { return _fileAttributes; } - (BOOL) isRegularFile { if (_wrapperType == GSFileWrapperRegularFileType) { return YES; } else { return NO; } } - (BOOL) isDirectory { if (_wrapperType == GSFileWrapperDirectoryType) { return YES; } else { return NO; } } - (BOOL) isSymbolicLink { if (_wrapperType == GSFileWrapperSymbolicLinkType) { return YES; } else { return NO; } } - (BOOL) needsToBeUpdatedFromPath: (NSString*)path { NSFileManager *fm = [NSFileManager defaultManager]; switch (_wrapperType) { case GSFileWrapperRegularFileType: if ([[self fileAttributes] isEqualToDictionary: [fm fileAttributesAtPath: path traverseLink: NO]]) return NO; break; case GSFileWrapperSymbolicLinkType: if ([_wrapperData isEqualToString: [fm pathContentOfSymbolicLinkAtPath: path]]) return NO; break; case GSFileWrapperDirectoryType: // Has the dictory itself changed? if (![[self fileAttributes] isEqualToDictionary: [fm fileAttributesAtPath: path traverseLink: NO]]) return YES; // FIXME - for directory wrappers, we have to check if all the files are still there, // if they have the same attributes and if any new files have been added. // And this recursive for all included file wrappers return NO; break; } return YES; } - (BOOL) updateFromPath: (NSString*)path { NSFileManager *fm = [NSFileManager defaultManager]; switch (_wrapperType) { case GSFileWrapperRegularFileType: if ([[self fileAttributes] isEqualToDictionary: [fm fileAttributesAtPath: path traverseLink: NO]]) return NO; [self initWithPath: path]; break; case GSFileWrapperSymbolicLinkType: if ([[self fileAttributes] isEqualToDictionary: [fm fileAttributesAtPath: path traverseLink: NO]] && [_wrapperData isEqualToString: [fm pathContentOfSymbolicLinkAtPath: path]]) return NO; [self initWithPath: path]; break; case GSFileWrapperDirectoryType: // Has the dictory itself changed? if (![[self fileAttributes] isEqualToDictionary: [fm fileAttributesAtPath: path traverseLink: NO]]) { // FIXME: This is not effizent [self initWithPath: path]; return YES; } // FIXME - for directory wrappers, we have to check if all the files are still there, // if they have the same attributes and if any new files have been added. // And this recursive for all included file wrappers return NO; break; } return YES; } // // Directory type methods // #define GSFileWrapperDirectoryTypeCheck() \ if (![self isDirectory]) \ [NSException raise: NSInternalInconsistencyException \ format: @"Can't invoke %@ on a file wrapper that" \ @" does not wrap a directory!", NSStringFromSelector(_cmd)]; - (NSString*) addFileWrapper: (NSFileWrapper*)doc { NSString *key; GSFileWrapperDirectoryTypeCheck(); key = [doc preferredFilename]; if (key == nil || [key isEqualToString: @""]) { [NSException raise: NSInvalidArgumentException format: @"Adding file wrapper with no preferred filename."]; return nil; } if ([_wrapperData objectForKey: key] != nil) { // FIXME - handle duplicate names } [_wrapperData setObject: doc forKey: key]; return key; } - (void) removeFileWrapper: (NSFileWrapper*)doc { GSFileWrapperDirectoryTypeCheck(); [_wrapperData removeObjectsForKeys: [_wrapperData allKeysForObject: doc]]; } - (NSDictionary*) fileWrappers { GSFileWrapperDirectoryTypeCheck(); return _wrapperData; } - (NSString*) keyForFileWrapper: (NSFileWrapper*)doc { GSFileWrapperDirectoryTypeCheck(); return [[_wrapperData allKeysForObject: doc] objectAtIndex: 0]; } - (NSString*) addFileWithPath: (NSString*)path { NSFileWrapper *wrapper; GSFileWrapperDirectoryTypeCheck(); wrapper = AUTORELEASE([[NSFileWrapper alloc] initWithPath: path]); if (wrapper != nil) { return [self addFileWrapper: wrapper]; } else { return nil; } } - (NSString*) addRegularFileWithContents: (NSData*)data preferredFilename: (NSString*)filename { NSFileWrapper *wrapper; GSFileWrapperDirectoryTypeCheck(); wrapper = AUTORELEASE([[NSFileWrapper alloc] initRegularFileWithContents: data]); if (wrapper != nil) { [wrapper setPreferredFilename: filename]; return [self addFileWrapper: wrapper]; } else { return nil; } } - (NSString*) addSymbolicLinkWithDestination: (NSString*)path preferredFilename: (NSString*)filename { NSFileWrapper *wrapper; GSFileWrapperDirectoryTypeCheck(); wrapper = AUTORELEASE([[NSFileWrapper alloc] initSymbolicLinkWithDestination: path]); if (wrapper != nil) { [wrapper setPreferredFilename: filename]; return [self addFileWrapper: wrapper]; } else { return nil; } } // // Regular file type methods // - (NSData*) regularFileContents { if ([self isRegularFile]) { return _wrapperData; } else { [NSException raise: NSInternalInconsistencyException format: @"File wrapper does not wrap regular file."]; } return nil; } // // Symbolic link type methods // - (NSString*) symbolicLinkDestination { if ([self isSymbolicLink]) { return _wrapperData; } else { [NSException raise: NSInternalInconsistencyException format: @"File wrapper does not wrap symbolic link."]; } return nil; } - (NSURL *)symbolicLinkDestinationURL { // FIXME return [NSURL fileURLWithPath: [self symbolicLinkDestination]]; } - (BOOL) matchesContentsOfURL: (NSURL*)url { // FIXME // For return NO; } - (BOOL) readFromURL: (NSURL*)url options: (NSFileWrapperReadingOptions)options error: (NSError**)outError { // FIXME NSFileManager *fm = [NSFileManager defaultManager]; NSString *path = [url path]; NSDictionary *fileAttributes; NSString *fileType; NSDebugLLog(@"NSFileWrapper", @"readFromURL: %@", path); fileAttributes = [fm fileAttributesAtPath: path traverseLink: NO]; fileType = [fileAttributes fileType]; if ([fileType isEqualToString: NSFileTypeDirectory]) { if (options & NSFileWrapperReadingImmediate) { NSString *filename; NSMutableArray *fileWrappers = [NSMutableArray array]; NSArray *filenames = [fm directoryContentsAtPath: path]; NSEnumerator *enumerator = [filenames objectEnumerator]; while ((filename = [enumerator nextObject]) != nil) { NSFileWrapper *w; w = [[NSFileWrapper alloc] initWithPath: [path stringByAppendingPathComponent: filename]]; [fileWrappers addObject: w]; RELEASE(w); } self = [self initDirectoryWithFileWrappers: [NSDictionary dictionaryWithObjects: fileWrappers forKeys: filenames]]; } else { self = [self initDirectoryWithFileWrappers: nil]; } } else if ([fileType isEqualToString: NSFileTypeRegular]) { if (options & NSFileWrapperReadingWithoutMapping) { self = [self initRegularFileWithContents: AUTORELEASE([[NSData alloc] initWithContentsOfFile: path])]; } else { self = [self initRegularFileWithContents: AUTORELEASE([[NSData alloc] initWithContentsOfMappedFile: path])]; } } else if ([fileType isEqualToString: NSFileTypeSymbolicLink]) { self = [self initSymbolicLinkWithDestination: [fm pathContentOfSymbolicLinkAtPath: path]]; } // Store the full path in filename, the specification is unclear in this point [self setFilename: path]; [self setPreferredFilename: [path lastPathComponent]]; [self setFileAttributes: [fm fileAttributesAtPath: path traverseLink: NO]]; return NO; } - (BOOL) writeToURL: (NSURL*)url options: (NSFileWrapperWritingOptions)options originalContentsURL: (NSURL*)originalContentsURL error: (NSError**)outError { // FIXME return [self writeToFile: [url path] atomically: options & NSFileWrapperWritingAtomic updateFilenames: options & NSFileWrapperWritingWithNameUpdating]; } - (void) setIcon: (id)image { // this method is here to quell compiler warnings. } // // Archiving // - (void) encodeWithCoder: (NSCoder*)aCoder { if ([aCoder allowsKeyedCoding]) { [aCoder encodeObject: [self serializedRepresentation] forKey: @"NSFileWrapperData"]; } else { [aCoder encodeValueOfObjCType: @encode(int) at: &_wrapperType]; // Dont store the file name [aCoder encodeObject: _preferredFilename]; [aCoder encodeObject: _fileAttributes]; [aCoder encodeObject: _wrapperData]; [aCoder encodeObject: _icon]; } } - (id) initWithCoder: (NSCoder*)aDecoder { if ([aDecoder allowsKeyedCoding]) { NSData *data = [aDecoder decodeObjectForKey: @"NSFileWrapperData"]; return [self initWithSerializedRepresentation: data]; } else { int wrapperType; NSString *preferredFilename; NSDictionary *fileAttributes; id wrapperData; id icon; [aDecoder decodeValueOfObjCType: @encode(int) at: &wrapperType]; // Dont restore the file name preferredFilename = [aDecoder decodeObject]; fileAttributes = [aDecoder decodeObject]; wrapperData = [aDecoder decodeObject]; icon = [aDecoder decodeObject]; switch (wrapperType) { case GSFileWrapperRegularFileType: { self = [self initRegularFileWithContents: wrapperData]; break; } case GSFileWrapperSymbolicLinkType: { self = [self initSymbolicLinkWithDestination: wrapperData]; break; } case GSFileWrapperDirectoryType: { self = [self initDirectoryWithFileWrappers: wrapperData]; break; } } if (preferredFilename != nil) { [self setPreferredFilename: preferredFilename]; } if (fileAttributes != nil) { [self setFileAttributes: fileAttributes]; } if (icon != nil) { if([self respondsToSelector: @selector(setIcon:)]) { [self setIcon: icon]; } } } return self; } @end gnustep-base-1.29.0/Source/NSFormatter.m000066400000000000000000000044571435650067400200460ustar00rootroot00000000000000/** Implementation of NSFormatter class Copyright (C) 1998 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: October 1998 This file is part of the GNUstep Base Library. 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 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 USA. NSFormatter class reference $Date$ $Revision$ */ #import "common.h" #import "Foundation/NSFormatter.h" @implementation NSFormatter - (NSAttributedString*) attributedStringForObjectValue: (id)anObject withDefaultAttributes: (NSDictionary*)attr { return nil; } - (id) copyWithZone: (NSZone*)zone { return [[self class] allocWithZone: zone]; } - (NSString*) editingStringForObjectValue: (id)anObject { return [self stringForObjectValue: anObject]; } - (void) encodeWithCoder: (NSCoder*)aCoder { } - (BOOL) getObjectValue: (id*)anObject forString: (NSString*)string errorDescription: (NSString**)error { [self subclassResponsibility: _cmd]; return NO; } - (id) initWithCoder: (NSCoder*)aCoder { return [super init]; } - (BOOL) isPartialStringValid: (NSString*)partialString newEditingString: (NSString**)newString errorDescription: (NSString**)error { *newString = nil; *error = nil; return YES; } - (BOOL) isPartialStringValid: (NSString**)partialStringPtr proposedSelectedRange: (NSRange*)proposedSelRangePtr originalString: (NSString*)origString originalSelectedRange: (NSRange)originalSelRangePtr errorDescription: (NSString**)error { *error = nil; return YES; } - (NSString*) stringForObjectValue: (id)anObject { [self subclassResponsibility: _cmd]; return nil; } @end gnustep-base-1.29.0/Source/NSGarbageCollector.m000066400000000000000000000030471435650067400212740ustar00rootroot00000000000000/** Implementation for NSGarbageCollector for GNUStep Copyright (C) 2009 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: Jan 2009 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #import "Foundation/NSGarbageCollector.h" @implementation NSGarbageCollector + (id) defaultCollector { return nil; } - (void) collectIfNeeded { return; } - (void) collectExhaustively { return; } - (void) disable { return; } - (void) disableCollectorForPointer: (void *)ptr { return; } - (void) enable { return; } - (void) enableCollectorForPointer: (void *)ptr { return; } - (id) init { [self dealloc]; return nil; } - (BOOL) isCollecting { return NO; } - (BOOL) isEnabled { return NO; } - (NSZone*) zone { return NSDefaultMallocZone(); } @end gnustep-base-1.29.0/Source/NSGeometry.m000066400000000000000000000334741435650067400176770ustar00rootroot00000000000000/** NSGeometry.m - geometry functions * Copyright (C) 1993, 1994, 1995 Free Software Foundation, Inc. * * Written by: Adam Fedor * Date: Mar 1995 * * This file is part of the GNUstep Base Library. * * 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 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 USA. NSGeometry class reference $Date$ $Revision$ */ /* * Define IN_NSGEOMETRY_M so that the Foundation/NSGeometry.h header can * provide non-inline versions of the function implementations for us. */ #define IN_NSGEOMETRY_M /**** Included Headers *******************************************************/ #import "common.h" #include #import "Foundation/NSGeometry.h" #import "Foundation/NSScanner.h" #import "Foundation/NSNotification.h" #import "GSPrivate.h" static Class NSStringClass = 0; static Class NSScannerClass = 0; static SEL scanFloatSel; static SEL scanStringSel; static SEL scannerSel; static BOOL (*scanFloatImp)(NSScanner*, SEL, CGFloat*); static BOOL (*scanStringImp)(NSScanner*, SEL, NSString*, NSString**); static id (*scannerImp)(Class, SEL, NSString*); static inline void setupCache(void) { if (NSStringClass == 0) { NSStringClass = [NSString class]; NSScannerClass = [NSScanner class]; if (sizeof(CGFloat) == sizeof(double)) { scanFloatSel = @selector(scanDouble:); } else { scanFloatSel = @selector(scanFloat:); } scanStringSel = @selector(scanString:intoString:); scannerSel = @selector(scannerWithString:); scanFloatImp = (BOOL (*)(NSScanner*, SEL, CGFloat*)) [NSScannerClass instanceMethodForSelector: scanFloatSel]; scanStringImp = (BOOL (*)(NSScanner*, SEL, NSString*, NSString**)) [NSScannerClass instanceMethodForSelector: scanStringSel]; scannerImp = (id (*)(Class, SEL, NSString*)) [NSScannerClass methodForSelector: scannerSel]; } } static BOOL GSMacOSXCompatibleGeometry(void) { if (GSPrivateDefaultsFlag(GSOldStyleGeometry) == YES) return NO; return GSPrivateDefaultsFlag(GSMacOSXCompatible); } /**** Function Implementations ***********************************************/ /* Most of these are implemented in the header file as inline functkions */ NSRect NSIntegralRect(NSRect aRect) { NSRect rect; if (NSIsEmptyRect(aRect)) return NSMakeRect(0, 0, 0, 0); rect.origin.x = floor(NSMinX(aRect)); rect.origin.y = floor(NSMinY(aRect)); rect.size.width = ceil(NSMaxX(aRect)) - rect.origin.x; rect.size.height = ceil(NSMaxY(aRect)) - rect.origin.y; return rect; } void NSDivideRect(NSRect aRect, NSRect *slice, NSRect *remainder, CGFloat amount, NSRectEdge edge) { static NSRect sRect; static NSRect rRect; if (!slice) slice = &sRect; if (!remainder) remainder = &rRect; if (NSIsEmptyRect(aRect)) { *slice = NSMakeRect(0,0,0,0); *remainder = NSMakeRect(0,0,0,0); return; } switch (edge) { case NSMinXEdge: if (amount > aRect.size.width) { *slice = aRect; *remainder = NSMakeRect(NSMaxX(aRect), aRect.origin.y, 0, aRect.size.height); } else { *slice = NSMakeRect(aRect.origin.x, aRect.origin.y, amount, aRect.size.height); *remainder = NSMakeRect(NSMaxX(*slice), aRect.origin.y, NSMaxX(aRect) - NSMaxX(*slice), aRect.size.height); } break; case NSMinYEdge: if (amount > aRect.size.height) { *slice = aRect; *remainder = NSMakeRect(aRect.origin.x, NSMaxY(aRect), aRect.size.width, 0); } else { *slice = NSMakeRect(aRect.origin.x, aRect.origin.y, aRect.size.width, amount); *remainder = NSMakeRect(aRect.origin.x, NSMaxY(*slice), aRect.size.width, NSMaxY(aRect) - NSMaxY(*slice)); } break; case (NSMaxXEdge): if (amount > aRect.size.width) { *slice = aRect; *remainder = NSMakeRect(aRect.origin.x, aRect.origin.y, 0, aRect.size.height); } else { *slice = NSMakeRect(NSMaxX(aRect) - amount, aRect.origin.y, amount, aRect.size.height); *remainder = NSMakeRect(aRect.origin.x, aRect.origin.y, NSMinX(*slice) - aRect.origin.x, aRect.size.height); } break; case NSMaxYEdge: if (amount > aRect.size.height) { *slice = aRect; *remainder = NSMakeRect(aRect.origin.x, aRect.origin.y, aRect.size.width, 0); } else { *slice = NSMakeRect(aRect.origin.x, NSMaxY(aRect) - amount, aRect.size.width, amount); *remainder = NSMakeRect(aRect.origin.x, aRect.origin.y, aRect.size.width, NSMinY(*slice) - aRect.origin.y); } break; default: break; } return; } /** Get a String Representation... **/ /* NOTE: Spaces around '=' so that old OpenStep implementations can read our strings (Both GNUstep and Mac OS X can read these as well). */ NSString* NSStringFromPoint(NSPoint aPoint) { setupCache(); if (GSMacOSXCompatibleGeometry() == YES) return [NSStringClass stringWithFormat: @"{%g, %g}", aPoint.x, aPoint.y]; else return [NSStringClass stringWithFormat: @"{x = %g; y = %g}", aPoint.x, aPoint.y]; } NSString* NSStringFromRect(NSRect aRect) { setupCache(); if (GSMacOSXCompatibleGeometry() == YES) return [NSStringClass stringWithFormat: @"{{%g, %g}, {%g, %g}}", aRect.origin.x, aRect.origin.y, aRect.size.width, aRect.size.height]; else return [NSStringClass stringWithFormat: @"{x = %g; y = %g; width = %g; height = %g}", aRect.origin.x, aRect.origin.y, aRect.size.width, aRect.size.height]; } NSString* NSStringFromSize(NSSize aSize) { setupCache(); if (GSMacOSXCompatibleGeometry() == YES) return [NSStringClass stringWithFormat: @"{%g, %g}", aSize.width, aSize.height]; else return [NSStringClass stringWithFormat: @"{width = %g; height = %g}", aSize.width, aSize.height]; } NSPoint NSPointFromString(NSString* string) { NSScanner *scanner; NSPoint point; setupCache(); scanner = (*scannerImp)(NSScannerClass, scannerSel, string); if ((*scanStringImp)(scanner, scanStringSel, @"{", NULL) && (*scanStringImp)(scanner, scanStringSel, @"x", NULL) && (*scanStringImp)(scanner, scanStringSel, @"=", NULL) && (*scanFloatImp)(scanner, scanFloatSel, &point.x) && (*scanStringImp)(scanner, scanStringSel, @";", NULL) && (*scanStringImp)(scanner, scanStringSel, @"y", NULL) && (*scanStringImp)(scanner, scanStringSel, @"=", NULL) && (*scanFloatImp)(scanner, scanFloatSel, &point.y) && (*scanStringImp)(scanner, scanStringSel, @"}", NULL)) { return point; } else { [scanner setScanLocation: 0]; if ((*scanStringImp)(scanner, scanStringSel, @"{", NULL) && (*scanFloatImp)(scanner, scanFloatSel, &point.x) && (*scanStringImp)(scanner, scanStringSel, @",", NULL) && (*scanFloatImp)(scanner, scanFloatSel, &point.y) && (*scanStringImp)(scanner, scanStringSel, @"}", NULL)) { return point; } else { return NSMakePoint(0, 0); } } } NSSize NSSizeFromString(NSString* string) { NSScanner *scanner; NSSize size; setupCache(); scanner = (*scannerImp)(NSScannerClass, scannerSel, string); if ((*scanStringImp)(scanner, scanStringSel, @"{", NULL) && (*scanStringImp)(scanner, scanStringSel, @"width", NULL) && (*scanStringImp)(scanner, scanStringSel, @"=", NULL) && (*scanFloatImp)(scanner, scanFloatSel, &size.width) && (*scanStringImp)(scanner, scanStringSel, @";", NULL) && (*scanStringImp)(scanner, scanStringSel, @"height", NULL) && (*scanStringImp)(scanner, scanStringSel, @"=", NULL) && (*scanFloatImp)(scanner, scanFloatSel, &size.height) && (*scanStringImp)(scanner, scanStringSel, @"}", NULL)) { return size; } else { [scanner setScanLocation: 0]; if ((*scanStringImp)(scanner, scanStringSel, @"{", NULL) && (*scanFloatImp)(scanner, scanFloatSel, &size.width) && (*scanStringImp)(scanner, scanStringSel, @",", NULL) && (*scanFloatImp)(scanner, scanFloatSel, &size.height) && (*scanStringImp)(scanner, scanStringSel, @"}", NULL)) { return size; } else { return NSMakeSize(0, 0); } } } NSRect NSRectFromString(NSString* string) { NSScanner *scanner; NSRect rect; setupCache(); scanner = (*scannerImp)(NSScannerClass, scannerSel, string); if ((*scanStringImp)(scanner, scanStringSel, @"{", NULL) && (*scanStringImp)(scanner, scanStringSel, @"x", NULL) && (*scanStringImp)(scanner, scanStringSel, @"=", NULL) && (*scanFloatImp)(scanner, scanFloatSel, &rect.origin.x) && (*scanStringImp)(scanner, scanStringSel, @";", NULL) && (*scanStringImp)(scanner, scanStringSel, @"y", NULL) && (*scanStringImp)(scanner, scanStringSel, @"=", NULL) && (*scanFloatImp)(scanner, scanFloatSel, &rect.origin.y) && (*scanStringImp)(scanner, scanStringSel, @";", NULL) && (*scanStringImp)(scanner, scanStringSel, @"width", NULL) && (*scanStringImp)(scanner, scanStringSel, @"=", NULL) && (*scanFloatImp)(scanner, scanFloatSel, &rect.size.width) && (*scanStringImp)(scanner, scanStringSel, @";", NULL) && (*scanStringImp)(scanner, scanStringSel, @"height", NULL) && (*scanStringImp)(scanner, scanStringSel, @"=", NULL) && (*scanFloatImp)(scanner, scanFloatSel, &rect.size.height) && (*scanStringImp)(scanner, scanStringSel, @"}", NULL)) { return rect; } else { [scanner setScanLocation: 0]; if ((*scanStringImp)(scanner, scanStringSel, @"{", NULL) && (*scanStringImp)(scanner, scanStringSel, @"{", NULL) && (*scanFloatImp)(scanner, scanFloatSel, &rect.origin.x) && (*scanStringImp)(scanner, scanStringSel, @",", NULL) && (*scanFloatImp)(scanner, scanFloatSel, &rect.origin.y) && (*scanStringImp)(scanner, scanStringSel, @"}", NULL) && (*scanStringImp)(scanner, scanStringSel, @",", NULL) && (*scanStringImp)(scanner, scanStringSel, @"{", NULL) && (*scanFloatImp)(scanner, scanFloatSel, &rect.size.width) && (*scanStringImp)(scanner, scanStringSel, @",", NULL) && (*scanFloatImp)(scanner, scanFloatSel, &rect.size.height) && (*scanStringImp)(scanner, scanStringSel, @"}", NULL) && (*scanStringImp)(scanner, scanStringSel, @"}", NULL)) { return rect; } else { return NSMakeRect(0, 0, 0, 0); } } } /* Tests for equality of floats/doubles. * WARNING assumes the values are in the standard IEEE format ... * this may not be true on all systems, though afaik it is the case * on all systems we target. * * We use integer arithmetic for speed, assigning the float/double * to an integer of the same size and then converting any negative * values to twos-complement integer values so that a simple integer * comparison can be done. * * MAX_ULP specified the number of Units in the Last Place by which * the two values may differ and still be considered equal. A value * of zero means that the two numbers must be identical. * * The way that infinity is represented means that it will be considered * equal to MAX_FLT (or MAX_DBL) unless we are doing an exact comparison * with MAX_ULP set to zero. * * The implementation will also treat two NaN values as being equal, which * is technically wrong ... but is it worth adding a check for that? */ #define MAX_ULP 0 static inline BOOL almostEqual(CGFloat A, CGFloat B) { #if MAX_ULP == 0 return (A == B) ? YES : NO; #else /* MAX_UPL == 0 */ #if defined(CGFLOAT_IS_DBL) union {int64_t i; double d;} valA, valB; valA.d = A; valB.d = B; #if GS_SIZEOF_LONG == 8 if (valA.i < 0) { valA.i = 0x8000000000000000L - valA.i; } if (valB.i < 0) { valB.i = 0x8000000000000000L - valB.i; } if (labs(valA.i - valB.i) <= MAX_ULP) { return YES; } #else /* GS_SIZEOF_LONG == 8 */ if (valA.i < 0) { valA.i = 0x8000000000000000LL - valA.i; } if (valB.i < 0) { valB.i = 0x8000000000000000LL - valB.i; } if (llabs(valA.i - valB.i) <= MAX_ULP) { return YES; } #endif /* GS_SIZEOF_LONG == 8 */ return NO; #else /* DEFINED(CGFLOAT_IS_DBL) */ union {int32_t i; float f;} valA, valB; valA.f = A; if (valA.i < 0) { valA.i = 0x80000000 - valA.i; } valB.f = B; if (valB.i < 0) { valB.i = 0x80000000 - valB.i; } if (abs(valA.i - valB.i) <= MAX_ULP) { return YES; } return NO; #endif /* DEFINED(CGFLOAT_IS_DBL) */ #endif /* MAX_UPL == 0 */ } BOOL NSEqualRects(NSRect aRect, NSRect bRect) { return (almostEqual(NSMinX(aRect), NSMinX(bRect)) && almostEqual(NSMinY(aRect), NSMinY(bRect)) && almostEqual(NSWidth(aRect), NSWidth(bRect)) && almostEqual(NSHeight(aRect), NSHeight(bRect))) ? YES : NO; } BOOL NSEqualSizes(NSSize aSize, NSSize bSize) { return (almostEqual(aSize.width, bSize.width) && almostEqual(aSize.height, bSize.height)) ? YES : NO; } BOOL NSEqualPoints(NSPoint aPoint, NSPoint bPoint) { return (almostEqual(aPoint.x, bPoint.x) && almostEqual(aPoint.y, bPoint.y)) ? YES : NO; } BOOL NSEdgeInsetsEqual(NSEdgeInsets e1, NSEdgeInsets e2) { return ( almostEqual(e1.top, e2.top) && almostEqual(e1.left, e2.left) && almostEqual(e1.bottom, e2.bottom) && almostEqual(e1.right, e2.right) ); } gnustep-base-1.29.0/Source/NSHFSFileTypes.m000066400000000000000000000024121435650067400203350ustar00rootroot00000000000000/* Implementation of class NSHFSFileTypes Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory John Casamento Date: Fri Nov 1 00:25:22 EDT 2019 This file is part of the GNUstep Library. 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 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 USA. */ #include GS_DECLARE NSString *NSFileTypeForHFSTypeCode(NSUInteger hfsFileTypeCode) { return nil; } GS_DECLARE NSUInteger NSHFSTypeCodeFromFileType(NSString *fileTypeString) { return 0; } GS_DECLARE NSString *NSHFSTypeOfFile(NSString *fullFilePath) { return nil; } gnustep-base-1.29.0/Source/NSHTTPCookie.m000066400000000000000000000542301435650067400200060ustar00rootroot00000000000000/* Implementation for NSHTTPCookie for GNUstep Copyright (C) 2006 Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 2006 This file is part of the GNUstep Base Library. 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 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 USA. */ /* Try to handle cookies via the original Netscape specification (http://web.archive.org/web/20070805052634/http://wp.netscape.com/newsref/std/cookie_spec.html) and the official RFC2965 (http://tools.ietf.org/html/rfc2965). Header fields named "Set-Cookie" are processed using either the original spec or RFC2965. "Set-Cookie2" fields use the RFC spec. There are some crazy things to be aware of though. Multiple cookies can be specified in the same header and are separated by a comma. However, cookies themselves can also contain commas, most notably in the Expires field (which is not quoted and can contain spaces as well). The last key/value does not have to have a semi-colon, so this can be tricky to parse if another cookie occurs after this (See GSCookieStrings). */ #import "common.h" #define EXPOSE_NSHTTPCookie_IVARS 1 #import "GSURLPrivate.h" #import "Foundation/NSSet.h" #import "Foundation/NSValue.h" #import "Foundation/NSString.h" #import "Foundation/NSCalendarDate.h" #import "GNUstepBase/Unicode.h" static NSString * const HTTPCookieHTTPOnly = @"HTTPOnly"; // Internal data storage typedef struct { NSDictionary *_properties; } Internal; #define this ((Internal*)(self->_NSHTTPCookieInternal)) #define inst ((Internal*)(o->_NSHTTPCookieInternal)) /* Bitmap of characters considered white space if in an old style property * list. This is the same as the set given by the isspace() function in the * POSIX locale, but (for cross-locale portability of property list files) * is fixed, rather than locale dependent. */ static const unsigned char whitespace[32] = { '\x00', '\x3f', '\x00', '\x00', '\x01', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', }; #define IS_BIT_SET(a,i) ((((a) & (1<<(i)))) > 0) #define GS_IS_WHITESPACE(X) IS_BIT_SET(whitespace[(X)/8], (X) % 8) static id GSPropertyListFromCookieFormat(NSString *string, int version); static NSMutableArray *GSCookieStrings(NSString *string); @implementation NSHTTPCookie + (id) allocWithZone: (NSZone*)z { NSHTTPCookie *o = [super allocWithZone: z]; if (o != nil) { o->_NSHTTPCookieInternal = NSZoneCalloc(z, 1, sizeof(Internal)); } return o; } + (id) cookieWithProperties: (NSDictionary *)properties { NSHTTPCookie *o; o = [[self alloc] initWithProperties: properties]; return AUTORELEASE(o); } + (NSMutableArray *) _parseField: (NSString *)field forHeader: (NSString *)header andURL: (NSURL *)url { int version; NSString *defaultPath; NSString *defaultDomain; NSMutableArray *cookies; NSUInteger count; if ([header isEqual: @"Set-Cookie"]) { version = 0; } else if ([header isEqual: @"Set-Cookie2"]) { version = 1; } else { return nil; } defaultDomain = [url host]; defaultPath = [url path]; if ([[url absoluteString] hasSuffix: @"/"] == NO) { defaultPath = [defaultPath stringByDeletingLastPathComponent]; } cookies = GSCookieStrings(field); count = [cookies count]; /* We could use an NSScanner here, but this string could contain all sorts of odd stuff. It's not quite a property list either - it has dates and also could have tokens without values. */ while (count-- > 0) { NSHTTPCookie *cookie; NSMutableDictionary *dict; NSString *onecookie = [cookies objectAtIndex: count]; NS_DURING dict = GSPropertyListFromCookieFormat(onecookie, version); NS_HANDLER dict = nil; NS_ENDHANDLER if ([dict count]) { if ([dict objectForKey: NSHTTPCookiePath] == nil) { [dict setObject: defaultPath forKey: NSHTTPCookiePath]; } if ([dict objectForKey: NSHTTPCookieDomain] == nil) { [dict setObject: defaultDomain forKey: NSHTTPCookieDomain]; } cookie = [NSHTTPCookie cookieWithProperties: dict]; if (cookie) { [cookies replaceObjectAtIndex: count withObject: cookie]; } else { [cookies removeObjectAtIndex: count]; } } } return cookies; } + (NSArray *) cookiesWithResponseHeaderFields: (NSDictionary *)headerFields forURL: (NSURL *)URL { NSEnumerator *henum = [headerFields keyEnumerator]; NSMutableArray *a = [NSMutableArray array]; NSString *header; while ((header = [henum nextObject])) { NSMutableArray *suba = [self _parseField: [headerFields objectForKey: header] forHeader: header andURL: URL]; if (suba) [a addObjectsFromArray: suba]; } return a; } + (NSDictionary *) requestHeaderFieldsWithCookies: (NSArray *)cookies { int version; NSString *field; NSHTTPCookie *ck; NSEnumerator *ckenum = [cookies objectEnumerator]; if ([cookies count] == 0) { NSLog(@"NSHTTPCookie requestHeaderFieldWithCookies: empty array"); return nil; } /* Assume these cookies all came from the same URL so we format based on the version of the first. */ field = nil; version = [(NSHTTPCookie *)[cookies objectAtIndex: 0] version]; if (version) field = @"$Version=\"1\""; while ((ck = [ckenum nextObject])) { NSString *str; str = [NSString stringWithFormat: @"%@=%@", [ck name], [ck value]]; if (field) field = [field stringByAppendingFormat: @"; %@", str]; else field = str; if (version && [ck path]) field = [field stringByAppendingFormat: @"; $Path=\"%@\"", [ck path]]; } return [NSDictionary dictionaryWithObject: field forKey: @"Cookie"]; } - (NSString *) comment { return [this->_properties objectForKey: NSHTTPCookieComment]; } - (NSURL *) commentURL { return [this->_properties objectForKey: NSHTTPCookieCommentURL]; } - (void) dealloc { if (this != 0) { RELEASE(this->_properties); NSZoneFree([self zone], this); } [super dealloc]; } - (NSString *) domain { return [this->_properties objectForKey: NSHTTPCookieDomain]; } - (NSDate *) expiresDate { return [this->_properties objectForKey: NSHTTPCookieExpires]; } - (BOOL) _isValidProperty: (NSString *)prop { return ([prop length] && [prop rangeOfString: @"\n"].location == NSNotFound); } - (id) initWithProperties: (NSDictionary *)properties { NSMutableDictionary *rawProps; if ((self = [super init]) == nil) return nil; /* Check a few values. Based on Mac OS X tests. */ if (![self _isValidProperty: [properties objectForKey: NSHTTPCookiePath]] || ![self _isValidProperty: [properties objectForKey: NSHTTPCookieDomain]] || ![self _isValidProperty: [properties objectForKey: NSHTTPCookieName]] || ![self _isValidProperty: [properties objectForKey: NSHTTPCookieValue]] ) { [self release]; return nil; } rawProps = [[properties mutableCopy] autorelease]; if ([rawProps objectForKey: @"Created"] == nil) { NSInteger seconds; NSDate *now; /* Round to whole seconds, so that a serialization/deserialisation * cycle produces an identical object whic hcan be used to eliminate * duplicates. */ seconds = [NSDate timeIntervalSinceReferenceDate]; now = [NSDate dateWithTimeIntervalSinceReferenceDate: seconds]; [rawProps setObject: now forKey: @"Created"]; } if ([rawProps objectForKey: NSHTTPCookieExpires] == nil || [[rawProps objectForKey: NSHTTPCookieExpires] isKindOfClass: [NSDate class]] == NO) { [rawProps setObject: [NSNumber numberWithBool: YES] forKey: NSHTTPCookieDiscard]; } this->_properties = [rawProps copy]; return self; } - (BOOL) isSecure { return [[this->_properties objectForKey: NSHTTPCookieSecure] boolValue]; } - (BOOL) isHTTPOnly { return [[this->_properties objectForKey: HTTPCookieHTTPOnly] boolValue]; } - (BOOL) isSessionOnly { return [[this->_properties objectForKey: NSHTTPCookieDiscard] boolValue]; } - (NSString *) name { return [this->_properties objectForKey: NSHTTPCookieName]; } - (NSString *) path { return [this->_properties objectForKey: NSHTTPCookiePath]; } - (NSArray *) portList { return [[this->_properties objectForKey: NSHTTPCookiePort] componentsSeparatedByString: @","]; } - (NSDictionary *) properties { return this->_properties; } - (NSString *) value { return [this->_properties objectForKey: NSHTTPCookieValue]; } - (NSUInteger) version { return [[this->_properties objectForKey: NSHTTPCookieVersion] integerValue]; } - (NSString *) description { return [NSString stringWithFormat: @"", self, [self name], [self value]]; } - (NSUInteger) hash { return [[self properties] hash]; } - (BOOL) isEqual: (id)other { return [[other properties] isEqual: [self properties]]; } @end #define inrange(ch,min,max) ((ch)>=(min) && (ch)<=(max)) #define char2num(ch) \ inrange(ch,'0','9') \ ? ((ch)-0x30) \ : (inrange(ch,'a','f') \ ? ((ch)-0x57) : ((ch)-0x37)) typedef struct { const unsigned char *ptr; unsigned end; unsigned pos; unsigned lin; NSString *err; int opt; BOOL key; BOOL old; } pldata; /* * Returns YES if there is any non-whitespace text remaining. */ static BOOL skipSpace(pldata *pld) { unsigned char c; while (pld->pos < pld->end) { c = pld->ptr[pld->pos]; if (GS_IS_WHITESPACE(c) == NO) { return YES; } if (c == '\n') { pld->lin++; } pld->pos++; } pld->err = @"reached end of string"; return NO; } NS_RETURNS_RETAINED static inline NSString* parseQuotedString(pldata* pld) { unsigned start = ++pld->pos; unsigned escaped = 0; unsigned shrink = 0; BOOL hex = NO; NSString *obj; while (pld->pos < pld->end) { unsigned char c = pld->ptr[pld->pos]; if (escaped) { if (escaped == 1 && c >= '0' && c <= '7') { escaped = 2; hex = NO; } else if (escaped == 1 && (c == 'u' || c == 'U')) { escaped = 2; hex = YES; } else if (escaped > 1) { if (hex && isxdigit(c)) { shrink++; escaped++; if (escaped == 6) { escaped = 0; } } else if (c >= '0' && c <= '7') { shrink++; escaped++; if (escaped == 4) { escaped = 0; } } else { pld->pos--; escaped = 0; } } else { escaped = 0; } } else { if (c == '\\') { escaped = 1; shrink++; } else if (c == '"') { break; } } if (c == '\n') pld->lin++; pld->pos++; } if (pld->pos >= pld->end) { pld->err = @"reached end of string while parsing quoted string"; return nil; } if (pld->pos - start - shrink == 0) { obj = @""; } else { unsigned length; unichar *chars; unichar *temp = NULL; unsigned int temp_length = 0; unsigned j; unsigned k; if (!GSToUnicode(&temp, &temp_length, &pld->ptr[start], pld->pos - start, NSUTF8StringEncoding, NSDefaultMallocZone(), 0)) { pld->err = @"invalid utf8 data while parsing quoted string"; return nil; } length = temp_length - shrink; chars = NSAllocateCollectable(sizeof(unichar) * length, 0); escaped = 0; hex = NO; for (j = 0, k = 0; j < temp_length; j++) { unichar c = temp[j]; if (escaped) { if (escaped == 1 && c >= '0' && c <= '7') { chars[k] = c - '0'; hex = NO; escaped++; } else if (escaped == 1 && (c == 'u' || c == 'U')) { chars[k] = 0; hex = YES; escaped++; } else if (escaped > 1) { if (hex && isxdigit(c)) { chars[k] <<= 4; chars[k] |= char2num(c); escaped++; if (escaped == 6) { escaped = 0; k++; } } else if (c >= '0' && c <= '7') { chars[k] <<= 3; chars[k] |= (c - '0'); escaped++; if (escaped == 4) { escaped = 0; k++; } } else { escaped = 0; j--; k++; } } else { escaped = 0; switch (c) { case 'a' : chars[k] = '\a'; break; case 'b' : chars[k] = '\b'; break; case 't' : chars[k] = '\t'; break; case 'r' : chars[k] = '\r'; break; case 'n' : chars[k] = '\n'; break; case 'v' : chars[k] = '\v'; break; case 'f' : chars[k] = '\f'; break; default : chars[k] = c; break; } k++; } } else { chars[k] = c; if (c == '\\') { escaped = 1; } else { k++; } } } NSZoneFree(NSDefaultMallocZone(), temp); length = k; obj = [NSString alloc]; obj = [obj initWithCharactersNoCopy: chars length: length freeWhenDone: YES]; } pld->pos++; return obj; } /* In cookies, keys are terminated by '=' and values are terminated by ';' or and EOL */ NS_RETURNS_RETAINED static inline NSString* parseUnquotedString(pldata *pld, char endChar) { unsigned start = pld->pos; unsigned i; unsigned length; NSString *obj; unichar *chars; while (pld->pos < pld->end) { if ((pld->ptr[pld->pos]) == endChar) break; pld->pos++; } length = pld->pos - start; chars = NSAllocateCollectable(sizeof(unichar) * length, 0); for (i = 0; i < length; i++) { chars[i] = pld->ptr[start + i]; } obj = [NSString alloc]; obj = [obj initWithCharactersNoCopy: chars length: length freeWhenDone: YES]; return obj; } static BOOL _setCookieKey(NSMutableDictionary *dict, NSString *key, NSString *value) { if ([dict count] == 0) { /* This must be the name=value pair */ if ([value length] == 0) return NO; [dict setObject: key forKey: NSHTTPCookieName]; [dict setObject: value forKey: NSHTTPCookieValue]; return YES; } if ([[key lowercaseString] isEqual: @"comment"]) [dict setObject: value forKey: NSHTTPCookieComment]; else if ([[key lowercaseString] isEqual: @"commenturl"]) [dict setObject: value forKey: NSHTTPCookieCommentURL]; else if ([[key lowercaseString] isEqual: @"discard"]) [dict setObject: [NSNumber numberWithBool: YES] forKey: NSHTTPCookieDiscard]; else if ([[key lowercaseString] isEqual: @"domain"]) [dict setObject: value forKey: NSHTTPCookieDomain]; else if ([[key lowercaseString] isEqual: @"expires"]) { NSDate *expireDate; expireDate = [NSCalendarDate dateWithString: value calendarFormat: @"%a, %d-%b-%Y %I:%M:%S %Z"]; if (expireDate) [dict setObject: expireDate forKey: NSHTTPCookieExpires]; } else if ([[key lowercaseString] isEqual: @"max-age"]) [dict setObject: value forKey: NSHTTPCookieMaximumAge]; else if ([[key lowercaseString] isEqual: @"originurl"]) [dict setObject: value forKey: NSHTTPCookieOriginURL]; else if ([[key lowercaseString] isEqual: @"path"]) [dict setObject: value forKey: NSHTTPCookiePath]; else if ([[key lowercaseString] isEqual: @"port"]) [dict setObject: value forKey: NSHTTPCookiePort]; else if ([[key lowercaseString] isEqual: @"secure"]) [dict setObject: [NSNumber numberWithBool: YES] forKey: NSHTTPCookieSecure]; else if ([[key lowercaseString] isEqual:@"httponly"]) [dict setObject: [NSNumber numberWithBool: YES] forKey: HTTPCookieHTTPOnly]; else if ([[key lowercaseString] isEqual: @"version"]) [dict setObject: value forKey: NSHTTPCookieVersion]; return YES; } static id GSPropertyListFromCookieFormat(NSString *string, int version) { NSMutableDictionary *dict; pldata _pld; pldata *pld = &_pld; NSData *d; BOOL moreCharacters; /* * An empty string is a nil property list. */ if ([string length] == 0) { return nil; } d = [string dataUsingEncoding: NSUTF8StringEncoding]; NSCAssert(d, @"Couldn't get utf8 data from string."); _pld.ptr = (unsigned char*)[d bytes]; _pld.pos = 0; _pld.end = [d length]; _pld.err = nil; _pld.lin = 0; _pld.opt = 0; _pld.key = NO; _pld.old = YES; // OpenStep style dict = [[NSMutableDictionary allocWithZone: NSDefaultMallocZone()] initWithCapacity: 0]; while (skipSpace(pld) == YES) { id key; id val; if (pld->ptr[pld->pos] == '"') { key = parseQuotedString(pld); } else { unsigned int oldpos = pld->pos; unsigned int keyvalpos = 0; id keyval = parseUnquotedString(pld, ';'); keyvalpos = pld->pos; pld->pos = oldpos; key = parseUnquotedString(pld, '='); // Detect value-less cookies like HTTPOnly; and Secure; if ([keyval length] < [key length]) { pld->pos = keyvalpos; DESTROY(key); key = keyval; } else { DESTROY(keyval); } } if (key == nil) { DESTROY(dict); break; } moreCharacters = skipSpace(pld); if (moreCharacters == NO || pld->ptr[pld->pos] == ';') { pld->pos++; if (_setCookieKey(dict, key, @"") == NO) { pld->err = @"invalid cookie pair"; DESTROY(dict); } RELEASE(key); } else if (pld->ptr[pld->pos] == '=') { pld->pos++; if (skipSpace(pld) == NO) { RELEASE(key); DESTROY(dict); break; } if (pld->ptr[pld->pos] == '"') { val = parseQuotedString(pld); } else { val = parseUnquotedString(pld, ';'); } if (val == nil) { RELEASE(key); DESTROY(dict); break; } skipSpace(pld); if (_setCookieKey(dict, key, val) == NO) { pld->err = @"invalid cookie pair"; DESTROY(dict); } RELEASE(key); RELEASE(val); if (pld->ptr[pld->pos] == ';') { pld->pos++; } else { break; } } else { pld->err = @"unexpected character (wanted '=' or ';')"; RELEASE(key); DESTROY(dict); break; } } if (dict == nil && _pld.err != nil) { RELEASE(dict); [NSException raise: NSGenericException format: @"Parse failed at line %d (char %d) - %@", _pld.lin + 1, _pld.pos + 1, _pld.err]; } return AUTORELEASE(dict); } /* Split a string containing comma seprated cookeie settings into an array * of individual cookie specifications. * Look for the comma that separates cookies. Commas can also occur in * date strings, like "expires", but perhaps it can occur other places. * For instance, the key/value pair key=value1,value2 is not really * valid, but should we handle it anyway? Definitely we should handle the * perfectly normal case of: * * Set-Cookie: domain=test.com; expires=Thu, 12-Sep-2109 14:58:04 GMT; * session=foo * Set-Cookie: bar=baz * * which gets concatenated into something like: * * Set-Cookie: domain=test.com; expires=Thu, 12-Sep-2109 14:58:04 GMT; * session=foo,bar=baz */ static NSMutableArray* GSCookieStrings(NSString *string) { unsigned char *ptr; unsigned pos; unsigned end; NSData *d; NSMutableArray *cookies; unsigned start = 0; unsigned saved = 0; if ([string length] == 0) { return nil; } d = [string dataUsingEncoding: NSUTF8StringEncoding]; NSCAssert(d, @"Couldn't get utf8 data from string."); ptr = (unsigned char*)[d bytes]; pos = 0; end = [d length]; cookies = [NSMutableArray arrayWithCapacity: 4]; while (pos < end) { while (pos < end && isspace(ptr[pos])) { pos++; } start = pos; while (pos < end) { if (ptr[pos] == ',') { /* Look ahead for something that will tell us if this is a * separate cookie or not. We look for something of the form * ' token =' where a space represents any optional whitespace. */ saved = pos++; while (pos < end && isspace(ptr[pos])) { pos++; } if (pos < end) { const char *bad = "()<>@,;:\\\"/[]?={}"; int c = ptr[pos]; /* skip past token characters. */ while (c > 32 && c < 128 && strchr(bad, c) == 0) { pos++; if (pos < end) { c = ptr[pos]; } } while (pos < end && isspace(ptr[pos])) { pos++; } if (pos < end && '=' == ptr[pos]) { pos = saved + 1; /* We found a comma separator: so make the text before * the comma a cooke string as long as it is not empty. */ while (saved > start && isspace(ptr[saved - 1])) { saved--; } if (saved > start) { NSString *str = [NSString alloc]; str = [str initWithBytes: ptr + start length: saved - start encoding: NSUTF8StringEncoding]; [cookies addObject: str]; RELEASE(str); } start = saved = pos; } } pos = saved; } pos++; } } if (pos > start) { /* There was data after the last comma; make it into a cookie string * as long as it's not empty after removing spaces */ saved = pos; while (saved > start && isspace(ptr[saved - 1])) { saved--; } if (saved > start) { NSString *str = [NSString alloc]; /* There may not be room to add a nul terminator, so we use an * initialiser which doesn't need one. */ str = [str initWithBytes: ptr + start length: saved - start encoding: NSUTF8StringEncoding]; [cookies addObject: str]; RELEASE(str); } } return cookies; // The individual cookies } gnustep-base-1.29.0/Source/NSHTTPCookieStorage.m000066400000000000000000000221271435650067400213330ustar00rootroot00000000000000/* Implementation for NSHTTPCookieStorage for GNUstep Copyright (C) 2006 Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 2006 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #define EXPOSE_NSHTTPCookieStorage_IVARS 1 #import "GSURLPrivate.h" #import "Foundation/NSSet.h" #import "Foundation/NSArray.h" #import "Foundation/NSFileManager.h" #import "Foundation/NSPathUtilities.h" #import "Foundation/NSString.h" #import "Foundation/NSDistributedNotificationCenter.h" NSString *objectObserver = @"org.GNUstep.NSHTTPCookieStorage"; // Internal data storage typedef struct { NSHTTPCookieAcceptPolicy _policy; NSMutableArray *_cookies; } Internal; #define this ((Internal*)(self->_NSHTTPCookieStorageInternal)) #define inst ((Internal*)(o->_NSHTTPCookieStorageInternal)) @interface NSHTTPCookieStorage (Private) - (void) _updateFromCookieStore; @end @implementation NSHTTPCookieStorage static NSHTTPCookieStorage *storage = nil; + (id) allocWithZone: (NSZone*)z { return RETAIN([self sharedHTTPCookieStorage]); } + (NSHTTPCookieStorage *) sharedHTTPCookieStorage { if (storage == nil) { [gnustep_global_lock lock]; if (storage == nil) { NSHTTPCookieStorage *o; o = (NSHTTPCookieStorage*) NSAllocateObject(self, 0, NSDefaultMallocZone()); o->_NSHTTPCookieStorageInternal = (Internal*) NSZoneCalloc(NSDefaultMallocZone(), 1, sizeof(Internal)); [o init]; storage = o; } [gnustep_global_lock unlock]; } return storage; } - init { this->_policy = NSHTTPCookieAcceptPolicyAlways; this->_cookies = [NSMutableArray new]; [[NSDistributedNotificationCenter defaultCenter] addObserver: self selector: @selector(cookiesChangedNotification:) name: NSHTTPCookieManagerCookiesChangedNotification object: objectObserver]; [[NSDistributedNotificationCenter defaultCenter] addObserver: self selector: @selector(acceptPolicyChangeNotification:) name: NSHTTPCookieManagerAcceptPolicyChangedNotification object: objectObserver]; [self _updateFromCookieStore]; return self; } - (void) dealloc { if (this != 0) { [[NSDistributedNotificationCenter defaultCenter] removeObserver: self]; RELEASE(this->_cookies); NSZoneFree([self zone], this); } [super dealloc]; } - (NSString *) _cookieStorePath { BOOL isDir; NSString *path; NSArray *dirs; dirs = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES); path = [[dirs objectAtIndex: 0] stringByAppendingPathComponent: @"Cookies"]; if ([[NSFileManager defaultManager] fileExistsAtPath: path isDirectory: &isDir] == NO || isDir == NO) { BOOL ok; ok = [[NSFileManager defaultManager] createDirectoryAtPath: path withIntermediateDirectories: YES attributes: nil error: NULL]; if (ok == NO) return nil; } path = [path stringByAppendingPathComponent: @"Cookies.plist"]; return path; } /* Remove all cookies that have expired */ /* FIXME: When will we know that the user session expired? */ - (BOOL) _expireCookies: (BOOL)endUserSession { BOOL changed = NO; NSDate *now = [NSDate date]; unsigned count = [this->_cookies count]; /* FIXME: Handle Max-age */ while (count-- > 0) { NSHTTPCookie *ck = [this->_cookies objectAtIndex: count]; NSDate *expDate = [ck expiresDate]; if ((endUserSession && expDate == nil) || (expDate != nil && [expDate compare: now] != NSOrderedDescending)) { [this->_cookies removeObject: ck]; changed = YES; } } return changed; } - (void) _updateFromCookieStore { int i; NSArray *properties; NSString *path = [self _cookieStorePath]; if (path == nil) { return; } properties = nil; NS_DURING if (YES == [[NSFileManager defaultManager] fileExistsAtPath: path]) { properties = [[NSString stringWithContentsOfFile: path] propertyList]; } NS_HANDLER NSLog(@"NSHTTPCookieStorage: Error reading cookies plist"); NS_ENDHANDLER if (nil == properties) return; for (i = 0; i < [properties count]; i++) { NSDictionary *props; NSHTTPCookie *cookie; props = [properties objectAtIndex: i]; cookie = [NSHTTPCookie cookieWithProperties: props]; if (NO == [this->_cookies containsObject: cookie]) { [this->_cookies addObject:cookie]; } } } - (void) _updateToCookieStore { int i, count; NSMutableArray *properties; NSString *path = [self _cookieStorePath]; if (path == nil) { return; } count = [this->_cookies count]; properties = [NSMutableArray arrayWithCapacity: count]; for (i = 0; i < count; i++) [properties addObject: [[this->_cookies objectAtIndex: i] properties]]; [properties writeToFile: path atomically: YES]; } - (void) _doExpireUpdateAndNotify { [self _expireCookies: NO]; [self _updateToCookieStore]; [[NSDistributedNotificationCenter defaultCenter] postNotificationName: NSHTTPCookieManagerCookiesChangedNotification object: objectObserver]; } - (void) cookiesChangedNotification: (NSNotification *)note { if ([note object] == self) return; [self _updateFromCookieStore]; } - (void) acceptPolicyChangeNotification: (NSNotification *)note { if ([note object] == self) return; /* FIXME: Do we need a common place to store the policy? */ } - (NSHTTPCookieAcceptPolicy) cookieAcceptPolicy { return this->_policy; } - (NSArray *) cookies { return [[this->_cookies copy] autorelease]; } - (NSArray *) cookiesForURL: (NSURL *)URL { NSMutableArray *a = [NSMutableArray array]; NSEnumerator *ckenum = [this->_cookies objectEnumerator]; NSHTTPCookie *cookie; NSString *receive_domain = [URL host]; while ((cookie = [ckenum nextObject])) { if ([receive_domain hasSuffix: [cookie domain]]) [a addObject: cookie]; } return a; } - (void) deleteCookie: (NSHTTPCookie *)cookie { if ([this->_cookies indexOfObject: cookie] != NSNotFound) { [this->_cookies removeObject: cookie]; [self _doExpireUpdateAndNotify]; } else NSLog(@"NSHTTPCookieStorage: trying to delete a cookie that is not in the storage"); } - (void) _setCookieNoNotify: (NSHTTPCookie *)cookie { NSEnumerator *ckenum = [this->_cookies objectEnumerator]; NSHTTPCookie *ck, *remove_ck; NSString *name = [cookie name]; NSString *path = [cookie path]; NSString *domain = [cookie domain]; NSAssert([cookie isKindOfClass: [NSHTTPCookie class]] == YES, NSInvalidArgumentException); remove_ck = nil; while ((ck = [ckenum nextObject])) { if ([name isEqual: [ck name]] && [path isEqual: [ck path]]) { /* The Apple documentation says the domain should match and RFC 2965 says they should match, though the original Netscape docs doesn't mention that the domain should match, so here, if the version is explicitely set to 0, we don't require it */ id ckv = [[ck properties] objectForKey: NSHTTPCookieVersion]; if ((ckv && [ckv intValue] == 0) || [domain isEqual: [ck domain]]) { remove_ck = ck; break; } } } if (remove_ck) [this->_cookies removeObject: remove_ck]; [this->_cookies addObject: cookie]; } - (void) setCookie: (NSHTTPCookie *)cookie { if (this->_policy == NSHTTPCookieAcceptPolicyNever) return; [self _setCookieNoNotify: cookie]; [self _doExpireUpdateAndNotify]; } - (void) setCookieAcceptPolicy: (NSHTTPCookieAcceptPolicy)cookieAcceptPolicy { this->_policy = cookieAcceptPolicy; [[NSDistributedNotificationCenter defaultCenter] postNotificationName: NSHTTPCookieManagerAcceptPolicyChangedNotification object: objectObserver]; } - (void) setCookies: (NSArray *)cookies forURL: (NSURL *)URL mainDocumentURL: (NSURL *)mainDocumentURL { BOOL changed = NO; unsigned count = [cookies count]; if (count == 0 || this->_policy == NSHTTPCookieAcceptPolicyNever) return; while (count-- > 0) { NSHTTPCookie *ck = [cookies objectAtIndex: count]; if (this->_policy == NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain && [[URL host] hasSuffix: [mainDocumentURL host]] == NO) continue; [self _setCookieNoNotify: ck]; changed = YES; } if (changed) [self _doExpireUpdateAndNotify]; } @end gnustep-base-1.29.0/Source/NSHashTable.m000066400000000000000000000152261435650067400177320ustar00rootroot00000000000000/** NSHashTable implementation for GNUStep. * Copyright (C) 2009 Free Software Foundation, Inc. * * Author: Richard Frith-Macdonald * * This file is part of the GNUstep Base Library. * * 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 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 USA. * * NSHashTable class reference * $Date$ $Revision$ */ #import "common.h" #import "Foundation/NSArray.h" #import "Foundation/NSException.h" #import "Foundation/NSPointerFunctions.h" #import "Foundation/NSSet.h" #import "Foundation/NSHashTable.h" #import "NSCallBacks.h" #import "GSPrivate.h" @interface NSConcreteHashTable : NSHashTable @end @implementation NSHashTable static Class abstractClass = 0; static Class concreteClass = 0; + (id) allocWithZone: (NSZone*)aZone { if (self == abstractClass) { return NSAllocateObject(concreteClass, 0, aZone); } return NSAllocateObject(self, 0, aZone); } + (void) initialize { if (abstractClass == 0) { abstractClass = [NSHashTable class]; concreteClass = [NSConcreteHashTable class]; } } + (id) hashTableWithOptions: (NSPointerFunctionsOptions)options { NSHashTable *t; t = [self allocWithZone: NSDefaultMallocZone()]; t = [t initWithOptions: options capacity: 0]; return AUTORELEASE(t); } + (id) hashTableWithWeakObjects { return [self hashTableWithOptions: NSPointerFunctionsObjectPersonality | NSPointerFunctionsZeroingWeakMemory]; } + (id) weakObjectsHashTable { return [self hashTableWithOptions: NSPointerFunctionsObjectPersonality | NSPointerFunctionsWeakMemory]; } - (id) initWithOptions: (NSPointerFunctionsOptions)options capacity: (NSUInteger)initialCapacity { NSPointerFunctions *k; id o; k = [[NSPointerFunctions alloc] initWithOptions: options]; o = [self initWithPointerFunctions: k capacity: initialCapacity]; [k release]; return o; } - (id) initWithPointerFunctions: (NSPointerFunctions*)functions capacity: (NSUInteger)initialCapacity { [self subclassResponsibility: _cmd]; return nil; } - (void) addObject: (id)object { [self subclassResponsibility: _cmd]; } - (NSArray*) allObjects { NSEnumerator *enumerator; unsigned nodeCount = [self count]; unsigned index; NSArray *a; GS_BEGINITEMBUF(objects, nodeCount, id); enumerator = [self objectEnumerator]; index = 0; while (index < nodeCount && (objects[index] = [enumerator nextObject]) != nil) { index++; } a = [[[NSArray alloc] initWithObjects: objects count: index] autorelease]; GS_ENDITEMBUF(); return a; } - (id) anyObject { return [[self objectEnumerator] nextObject]; } - (BOOL) containsObject: (id)anObject { return [self member: anObject] ? YES : NO; } - (id) copyWithZone: (NSZone*)aZone { [self subclassResponsibility: _cmd]; return nil; } - (NSUInteger) count { return (NSUInteger)[self subclassResponsibility: _cmd]; } - (NSUInteger) countByEnumeratingWithState: (NSFastEnumerationState*)state objects: (id*)stackbuf count: (NSUInteger)len { return (NSUInteger)[self subclassResponsibility: _cmd]; } - (void) encodeWithCoder: (NSCoder*)aCoder { [self subclassResponsibility: _cmd]; } - (NSUInteger) hash { return [self count]; } - (id) initWithCoder: (NSCoder*)aCoder { [self subclassResponsibility: _cmd]; return nil; } - (void) intersectHashTable: (NSHashTable*)other { unsigned count = [self count]; if (count > 0) { NSEnumerator *enumerator; NSMutableArray *array; id object; array = [NSMutableArray arrayWithCapacity: count]; enumerator = [self objectEnumerator]; while ((object = [enumerator nextObject]) != nil) { if ([other member: object] == nil) { [array addObject: object]; } } enumerator = [array objectEnumerator]; while ((object = [enumerator nextObject]) != nil) { [self removeObject: object]; } } } - (BOOL) intersectsHashTable: (NSHashTable*)other { NSEnumerator *enumerator; id object; enumerator = [self objectEnumerator]; while ((object = [enumerator nextObject]) != nil) { if ([other member: object] != nil) { return YES; } } return NO; } - (BOOL) isEqual: (id)other { if ([other isKindOfClass: abstractClass] == NO) return NO; return NSCompareHashTables(self, other); } - (BOOL) isEqualToHashTable: (NSHashTable*)other { return NSCompareHashTables(self, other); } - (BOOL) isSubsetOfHashTable: (NSHashTable*)other { NSEnumerator *enumerator; id object; enumerator = [self objectEnumerator]; while ((object = [enumerator nextObject]) != nil) { if ([other member: object] == nil) { return NO; } } return YES; } - (id) member: (id)object { return [self subclassResponsibility: _cmd]; } - (void) minusHashTable: (NSHashTable*)other { if ([self count] > 0 && [other count] > 0) { NSEnumerator *enumerator; id object; enumerator = [other objectEnumerator]; while ((object = [enumerator nextObject]) != nil) { [self removeObject: object]; } } } - (NSEnumerator*) objectEnumerator { return [self subclassResponsibility: _cmd]; } - (NSPointerFunctions*) pointerFunctions { return [self subclassResponsibility: _cmd]; } - (void) removeAllObjects { NSEnumerator *enumerator; id object; enumerator = [[self allObjects] objectEnumerator]; while ((object = [enumerator nextObject]) != nil) { [self removeObject: object]; } } - (void) removeObject: (id)object { [self subclassResponsibility: _cmd]; } - (NSSet*) setRepresentation { NSEnumerator *enumerator; NSMutableSet *set; id object; set = [NSMutableSet setWithCapacity: [self count]]; enumerator = [[self allObjects] objectEnumerator]; while ((object = [enumerator nextObject]) != nil) { [set addObject: object]; } return [[set copy] autorelease]; } - (void) unionHashTable: (NSHashTable*)other { NSEnumerator *enumerator; id object; enumerator = [other objectEnumerator]; while ((object = [enumerator nextObject]) != nil) { [self addObject: object]; } } @end gnustep-base-1.29.0/Source/NSHost.m000066400000000000000000000414521435650067400170140ustar00rootroot00000000000000/** Implementation of host class Copyright (C) 1996, 1997,1999 Free Software Foundation, Inc. Written by: Luke Howard Date: 1996 Rewrite by: Richard Frith-Macdonald Date: 1999 This file is part of the GNUstep Base Library. 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 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 USA. NSHost class reference $Date$ $Revision$ */ #import "common.h" #define EXPOSE_NSHost_IVARS 1 #import "Foundation/NSLock.h" #import "Foundation/NSHost.h" #import "Foundation/NSArray.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSNull.h" #import "Foundation/NSSet.h" #import "Foundation/NSCoder.h" #if defined(_WIN32) #ifdef HAVE_WS2TCPIP_H #include #endif // HAVE_WS2TCPIP_H #if !defined(HAVE_INET_NTOP) extern const char* WSAAPI inet_ntop(int, const void *, char *, size_t); #endif #if !defined(HAVE_INET_NTOP) extern int WSAAPI inet_pton(int , const char *, void *); #endif #else /* !_WIN32 */ #include #include #include #include #include #endif /* !_WIN32 */ #ifndef INADDR_NONE #define INADDR_NONE -1 #endif static NSString *localHostName = @"GNUstep local host"; static Class hostClass; static NSRecursiveLock *_hostCacheLock = nil; static BOOL _hostCacheEnabled = YES; static NSMutableDictionary *_hostCache = nil; static id null = nil; @interface NSHost (Private) - (void) _addName: (NSString*)name; #if defined(HAVE_GETADDRINFO) - (id) _initWithAddrinfo: (struct addrinfo*)entry key: (NSString*)name; #endif - (id) _initWithHostEntry: (struct hostent*)entry key: (NSString*)name; + (NSMutableSet*) _localAddresses; @end @implementation NSHost (Private) - (void) _addName: (NSString*)name { NSMutableSet *s = [_names mutableCopy]; name = [name copy]; [s addObject: name]; ASSIGNCOPY(_names, s); RELEASE(s); if (YES == _hostCacheEnabled) { [_hostCache setObject: self forKey: name]; } RELEASE(name); } - (id) _initWithAddress: (NSString*)name { if ((self = [super init]) == nil) { return nil; } name = [name copy]; _names = [[NSSet alloc] initWithObjects: &name count: 1]; _addresses = RETAIN(_names); if (YES == _hostCacheEnabled) { [_hostCache setObject: self forKey: name]; } RELEASE(name); return self; } #if defined(HAVE_GETADDRINFO) - (id) _initWithAddrinfo: (struct addrinfo*)entry key: (NSString*)name { NSMutableSet *names; NSMutableSet *addresses; NSMutableSet *extra; if ((self = [super init]) == nil) { return nil; } if ([name isEqualToString: localHostName] == NO && entry == (struct addrinfo*)NULL) { NSLog(@"Host '%@' init failed - perhaps the name/address is wrong or " @"networking is not set up on your machine", name); DESTROY(self); return nil; } else if (name == nil && entry != (struct addrinfo*)NULL) { NSLog(@"Nil hostname supplied but network database entry is not empty"); DESTROY(self); return nil; } names = [NSMutableSet new]; addresses = [NSMutableSet new]; if ([name isEqualToString: localHostName] == YES) { extra = [hostClass _localAddresses]; } else { extra = nil; } for (;;) { struct addrinfo *tmp; /* * We remove all the IP addresses that we have added to the host so * far from the set of extra addresses available on the current host. * Then we try to find a new network database entry for one of the * remaining extra addresses, and loop round to add all the names * and addresses for that entry. */ [extra minusSet: addresses]; while (entry == 0 && [extra count] > 0) { NSString *a = [extra anyObject]; struct addrinfo hints; memset(&hints, '\0', sizeof(hints)); hints.ai_flags = AI_CANONNAME; if (getaddrinfo([a UTF8String], 0, &hints, &entry) != 0) { /* * Can't find a database entry for this IP address, but since * we know the address is valid, we add it to the list of * addresses for this host anyway. */ [addresses addObject: a]; [extra removeObject: a]; } } if (0 == entry) { break; } for (tmp = entry; tmp != 0; tmp = tmp->ai_next) { if (tmp->ai_canonname && *tmp->ai_canonname) { NSString *n; n = [[NSString alloc] initWithUTF8String: tmp->ai_canonname]; [names addObject: n]; [n release]; } if (tmp->ai_addrlen > 0) { char host[NI_MAXHOST]; char port[NI_MAXSERV]; if (0 == getnameinfo(tmp->ai_addr, tmp->ai_addrlen, host, NI_MAXHOST, port, NI_MAXSERV, NI_NUMERICSERV)) { NSString *a; a = [[NSString alloc] initWithUTF8String: host]; [addresses addObject: a]; [a release]; } } } freeaddrinfo(entry); entry = 0; } _names = [names copy]; RELEASE(names); _addresses = [addresses copy]; RELEASE(addresses); if (YES == _hostCacheEnabled) { [_hostCache setObject: self forKey: name]; } return self; } #endif - (id) _initWithHostEntry: (struct hostent*)entry key: (NSString*)name { int i; char *ptr; struct in_addr in; NSString *h_name; NSMutableSet *names; NSMutableSet *addresses; NSMutableSet *extra; if ((self = [super init]) == nil) { return nil; } if ([name isEqualToString: localHostName] == NO && entry == (struct hostent*)NULL) { NSLog(@"Host '%@' init failed - perhaps the name/address is wrong or " @"networking is not set up on your machine", name); DESTROY(self); return nil; } else if (name == nil && entry != (struct hostent*)NULL) { NSLog(@"Nil hostname supplied but network database entry is not empty"); DESTROY(self); return nil; } names = [NSMutableSet new]; addresses = [NSMutableSet new]; if ([name isEqualToString: localHostName] == YES) { extra = [hostClass _localAddresses]; } else { extra = nil; } for (;;) { /* * We remove all the IP addresses that we have added to the host so * far from the set of extra addresses available on the current host. * Then we try to find a new network database entry for one of the * remaining extra addresses, and loop round to add all the names * and addresses for that entry. */ [extra minusSet: addresses]; while (entry == 0 && [extra count] > 0) { NSString *a = [extra anyObject]; entry = gethostbyname([a UTF8String]); if (entry == 0) { /* * Can't find a database entry for this IP address, but since * we know the address is valid, we add it to the list of * addresses for this host anyway. */ [addresses addObject: a]; [extra removeObject: a]; } } if (entry == 0) { break; } h_name = [NSString stringWithUTF8String: entry->h_name]; [names addObject: h_name]; if (entry->h_aliases != 0) { i = 0; while ((ptr = entry->h_aliases[i++]) != 0) { [names addObject: [NSString stringWithUTF8String: ptr]]; } } if (entry->h_addr_list != 0) { i = 0; while ((ptr = entry->h_addr_list[i++]) != 0) { NSString *addr; memset((void*)&in, '\0', sizeof(in)); memcpy((void*)&in.s_addr, (const void*)ptr, entry->h_length); addr = [NSString stringWithUTF8String: (char*)inet_ntoa(in)]; [addresses addObject: addr]; } } entry = 0; } _names = [names copy]; RELEASE(names); _addresses = [addresses copy]; RELEASE(addresses); if (YES == _hostCacheEnabled) { [_hostCache setObject: self forKey: name]; } return self; } + (NSMutableSet*) _localAddresses { NSMutableSet *set; set = [[self currentHost]->_addresses mutableCopy]; [set addObject: @"127.0.0.1"]; return AUTORELEASE(set); } @end @implementation NSHost /* * Max hostname length in line with RFC 1123 */ #define GSMAXHOSTNAMELEN 255 /** * Return the current host name ... may change if we are using dhcp etc */ static NSString* myHostName() { static NSString *name = nil; static char old[GSMAXHOSTNAMELEN+1]; char buf[GSMAXHOSTNAMELEN+1]; int res; [_hostCacheLock lock]; res = gethostname(buf, GSMAXHOSTNAMELEN); if (res < 0 || *buf == '\0') { NSLog(@"Unable to get name of current host - using 'localhost'"); ASSIGN(name, @"localhost"); } else if (name == nil || strcmp(old, buf) != 0) { strncpy(old, buf, sizeof(old) - 1); old[sizeof(old) - 1] = '\0'; RELEASE(name); name = [[NSString alloc] initWithCString: buf]; } [_hostCacheLock unlock]; return name; } + (void) initialize { if (self == [NSHost class]) { hostClass = self; null = [[NSNull null] retain]; [[NSObject leakAt: &null] release]; _hostCacheLock = [[NSRecursiveLock alloc] init]; [[NSObject leakAt: &_hostCacheLock] release]; _hostCache = [NSMutableDictionary new]; [[NSObject leakAt: &_hostCache] release]; } } + (NSHost*) currentHost { return [self hostWithName: myHostName()]; } + (NSHost*) hostWithName: (NSString*)name { NSHost *host = nil; const char *n; if (name == nil) { NSLog(@"Nil host name sent to [NSHost +hostWithName:]"); return nil; } if ([name isEqual: @""] == YES) { NSLog(@"Empty host name sent to [NSHost +hostWithName:]"); return nil; } /* If this looks like an address rather than a host name ... * call the correct method instead of this one. */ n = [name UTF8String]; if ((isdigit(n[0]) && sscanf(n, "%*d.%*d.%*d.%*d") == 4) || 0 != strchr(n, ':')) { return [self hostWithAddress: name]; } [_hostCacheLock lock]; if (YES == _hostCacheEnabled) { host = [_hostCache objectForKey: name]; } if (host == nil) { if ([name isEqualToString: localHostName] == YES) { /* * Special GNUstep extension host - we try to have a host entry * with ALL the IP addresses of any interfaces on the local machine */ host = [[self alloc] _initWithHostEntry: 0 key: localHostName]; IF_NO_ARC([host autorelease];) } else { struct hostent *h; h = gethostbyname((char*)n); if (0 == h) { if ([name isEqualToString: myHostName()] == YES) { host = [self hostWithAddress: @"127.0.0.1"]; [host _addName: name]; } else { if (YES == _hostCacheEnabled) { [_hostCache setObject: null forKey: name]; } NSLog(@"Host '%@' not found using 'gethostbyname()' - " @"perhaps the hostname is wrong or networking is not " @"set up on your machine", name); } } else { host = [[self alloc] _initWithHostEntry: h key: name]; IF_NO_ARC([host autorelease];) } } } else if ((id)host == null) { host = nil; } else { IF_NO_ARC([[host retain] autorelease];) } [_hostCacheLock unlock]; return host; } + (NSHost*) hostWithAddress: (NSString*)address { NSHost *host = nil; char buf[40]; const char *a; if (address == nil) { NSLog(@"Nil host address sent to [NSHost +hostWithAddress:]"); return nil; } a = [address UTF8String]; if (0 == a || '\0' == *a) { NSLog(@"Empty host address sent to [NSHost +hostWithAddress:]"); return nil; } /* Now check that the address is of valid format, and standardise it * by converting from characters to binary and back. */ if (0 == strchr(a, ':')) { struct in_addr hostaddr; if (inet_pton(AF_INET, a, (void*)&hostaddr) <= 0) { NSLog(@"Invalid host address sent to [NSHost +hostWithAddress:]"); return nil; } inet_ntop(AF_INET, (void*)&hostaddr, buf, sizeof(buf)); a = buf; address = [NSString stringWithUTF8String: a]; } else #if defined(AF_INET6) { struct in6_addr hostaddr6; if (inet_pton(AF_INET6, a, (void*)&hostaddr6) <= 0) { NSLog(@"Invalid host address sent to [NSHost +hostWithAddress:]"); return nil; } inet_ntop(AF_INET6, (void*)&hostaddr6, buf, sizeof(buf)); a = buf; address = [NSString stringWithUTF8String: a]; } #else NSLog(@"Unsupported host address sent to [NSHost +hostWithAddress:]"); return nil; #endif [_hostCacheLock lock]; if (YES == _hostCacheEnabled) { host = [_hostCache objectForKey: address]; } if (nil == host) { struct hostent *h; /* The gethostbyname() function should handle names, ipv4 addresses, * and ipv6 addresses ... so we can use it whatever we have. */ h = gethostbyname(a); if (0 == h) { host = [[self alloc] _initWithAddress: address]; IF_NO_ARC([host autorelease];) } else { host = [[self alloc] _initWithHostEntry: h key: address]; IF_NO_ARC([host autorelease];) } } else { IF_NO_ARC([[host retain] autorelease];) } [_hostCacheLock unlock]; return host; } + (void) setHostCacheEnabled: (BOOL)flag { [_hostCacheLock lock]; _hostCacheEnabled = flag; [_hostCacheLock unlock]; } + (BOOL) isHostCacheEnabled { return _hostCacheEnabled; } + (void) flushHostCache { [_hostCacheLock lock]; [_hostCache removeAllObjects]; [_hostCacheLock unlock]; } /* Methods for encoding/decoding*/ - (id) replacementObjectForPortCoder: (NSPortCoder*)aCoder { return self; } - (void) encodeWithCoder: (NSCoder*)aCoder { NSString *address = [self address]; if ([address isEqual: @"127.0.0.1"] == YES) { NSEnumerator *e = [_addresses objectEnumerator]; while ((address = [e nextObject]) != nil) { if ([address isEqual: @"127.0.0.1"] == NO) { break; } } } [aCoder encodeObject: address]; } - (id) initWithCoder: (NSCoder*)aCoder { NSString *address; NSHost *host; address = [aCoder decodeObject]; if (address != nil) { host = [NSHost hostWithAddress: address]; } else { host = [NSHost currentHost]; } IF_NO_ARC([host retain];) DESTROY(self); return host; } - (void) dealloc { RELEASE(_names); RELEASE(_addresses); [super dealloc]; } - (id) init { [self dealloc]; return nil; } /* * The OpenStep spec says that [-hash] must be the same for any two * objects that [-isEqual: ] returns YES for. We have a problem in * that [-isEqualToHost: ] is specified to return YES if any name or * address part of two hosts is the same. That means we can't * reasonably calculate a hash since two hosts with radically * different ivar contents may be 'equal'. The best I can think of * is for all hosts to hash to the same value - which makes it very * inefficient to store them in a set, dictionary, map or hash table. */ - (NSUInteger) hash { return 1; } - (BOOL) isEqual: (id)other { if (other == self) { return YES; } if ([other isKindOfClass: [NSHost class]]) { return [self isEqualToHost: (NSHost*)other]; } return NO; } - (BOOL) isEqualToHost: (NSHost*)aHost { NSEnumerator *e; NSString *a; if (aHost == self) { return YES; } e = [aHost->_addresses objectEnumerator]; while ((a = [e nextObject]) != nil) { if ([_addresses member: a] != nil) { return YES; } } return NO; } - (NSString*) localizedName { NSString *n = myHostName(); if (self != [NSHost hostWithName: n]) { n = nil; } return n; } - (NSString*) name { return [_names anyObject]; } - (NSArray*) names { return [_names allObjects]; } - (NSString*) address { return [_addresses anyObject]; } - (NSArray*) addresses { return [_addresses allObjects]; } - (NSString*) description { return [NSString stringWithFormat: @"Host %@ (%@ %@)", [self name], _names, _addresses]; } @end @implementation NSHost (GNUstep) + (NSHost*) localHost { return [self hostWithName: localHostName]; } @end @implementation NSHost (NSProcessInfo) + (NSString*) _myHostName { return myHostName(); } @end gnustep-base-1.29.0/Source/NSISO8601DateFormatter.m000066400000000000000000000127111435650067400215260ustar00rootroot00000000000000/* Implementation of class NSISO8601DateFormatter Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory John Casamento Date: Tue Oct 29 04:43:13 EDT 2019 This file is part of the GNUstep Library. 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 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 USA. */ #import "Foundation/NSCoder.h" #import "Foundation/NSDateFormatter.h" #import "Foundation/NSISO8601DateFormatter.h" #import "Foundation/NSString.h" #import "Foundation/NSTimeZone.h" @implementation NSISO8601DateFormatter - (instancetype) init { self = [super init]; if (self != nil) { _formatter = [[NSDateFormatter alloc] init]; _timeZone = RETAIN([NSTimeZone localTimeZone]); _formatOptions = NSISO8601DateFormatWithInternetDateTime; } return self; } - (oneway void) dealloc { RELEASE(_formatter); RELEASE(_timeZone); [super dealloc]; } - (NSTimeZone *) timeZone { return _timeZone; } - (void) setTimeZone: (NSTimeZone *)tz { _timeZone = tz; } - (NSISO8601DateFormatOptions) formatOptions { return _formatOptions; } - (NSString *) _buildFormatWithOptions { NSString *result = @""; // Build date... if (_formatOptions & NSISO8601DateFormatWithYear) { result = [result stringByAppendingString: @"yyyy"]; } if (_formatOptions & NSISO8601DateFormatWithDashSeparatorInDate && _formatOptions & NSISO8601DateFormatWithMonth) { result = [result stringByAppendingString: @"-"]; } if (_formatOptions & NSISO8601DateFormatWithMonth) { result = [result stringByAppendingString: @"MM"]; } if (_formatOptions & NSISO8601DateFormatWithDashSeparatorInDate && _formatOptions & NSISO8601DateFormatWithDay) { result = [result stringByAppendingString: @"-"]; } if (_formatOptions & NSISO8601DateFormatWithDay) { result = [result stringByAppendingString: @"dd"]; } // Build time... if (_formatOptions & NSISO8601DateFormatWithSpaceBetweenDateAndTime && _formatOptions & NSISO8601DateFormatWithTime) { result = [result stringByAppendingString: @" "]; } else { // Add T in format if we have a time component... result = [result stringByAppendingString: @"'T'"]; } if (_formatOptions & NSISO8601DateFormatWithTime) { if (_formatOptions & NSISO8601DateFormatWithColonSeparatorInTime) { result = [result stringByAppendingString: @"HH:mm:ss"]; } else { result = [result stringByAppendingString: @"HHmmss"]; } } if (_formatOptions & NSISO8601DateFormatWithFractionalSeconds) { result = [result stringByAppendingString: @".SSSSSS"]; } if (_formatOptions & NSISO8601DateFormatWithTimeZone) { if (_formatOptions & NSISO8601DateFormatWithColonSeparatorInTimeZone) { result = [result stringByAppendingString: @"ZZ:ZZ"]; } else { result = [result stringByAppendingString: @"ZZZZ"]; } } return result; } - (void) setFormatOptions: (NSISO8601DateFormatOptions)options { _formatOptions = options; } - (NSString *) stringFromDate: (NSDate *)date { NSString *formatString = [self _buildFormatWithOptions]; [_formatter setTimeZone: _timeZone]; [_formatter setDateFormat: formatString]; return [_formatter stringFromDate: date]; } - (NSDate *) dateFromString: (NSString *)string { NSString *formatString = [self _buildFormatWithOptions]; [_formatter setTimeZone: _timeZone]; [_formatter setDateFormat: formatString]; return [_formatter dateFromString: string]; } + (NSString *) stringFromDate: (NSDate *)date timeZone: (NSTimeZone *)timeZone formatOptions: (NSISO8601DateFormatOptions)formatOptions { NSISO8601DateFormatter *formatter = [[NSISO8601DateFormatter alloc] init]; AUTORELEASE(formatter); [formatter setTimeZone: timeZone]; [formatter setFormatOptions: formatOptions]; return [formatter stringFromDate: date]; } - (void) encodeWithCoder: (NSCoder *)coder { if ([coder allowsKeyedCoding]) { [coder encodeObject: _timeZone forKey: @"NS.timeZone"]; [coder encodeInteger: _formatOptions forKey: @"NS.formatOptions"]; } else { [coder encodeObject: _timeZone]; [coder encodeValueOfObjCType: @encode(NSUInteger) at: &_formatOptions]; } } - (id) initWithCoder: (NSCoder *)decoder { if ((self = [super init]) != nil) { if ([decoder allowsKeyedCoding]) { ASSIGN(_timeZone, [decoder decodeObjectForKey: @"NS.timeZone"]); _formatOptions = [decoder decodeIntegerForKey: @"NS.formatOptions"]; } else { ASSIGN(_timeZone, [decoder decodeObject]); [decoder decodeValueOfObjCType: @encode(NSUInteger) at: &_formatOptions]; } } return self; } @end gnustep-base-1.29.0/Source/NSIndexPath.m000066400000000000000000000263041435650067400177620ustar00rootroot00000000000000/** Implementation for NSIndexPath for GNUStep Copyright (C) 2006 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: Feb 2006 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #define EXPOSE_NSIndexPath_IVARS 1 #import "Foundation/NSByteOrder.h" #import "Foundation/NSData.h" #import "Foundation/NSException.h" #import "Foundation/NSHashTable.h" #import "Foundation/NSIndexPath.h" #import "Foundation/NSKeyedArchiver.h" #import "Foundation/NSLock.h" #import "GNUstepBase/GSLock.h" static NSRecursiveLock *lock = nil; static NSHashTable *shared = 0; static Class myClass = 0; static NSIndexPath *empty = nil; static NSIndexPath *dummy = nil; @implementation NSIndexPath + (id) allocWithZone: (NSZone*)aZone { if (self == myClass) { return empty; } return [super allocWithZone: aZone]; } + (id) indexPathWithIndex: (NSUInteger)anIndex { return [self indexPathWithIndexes: &anIndex length: 1]; } + (id) indexPathWithIndexes: (NSUInteger*)indexes length: (NSUInteger)length { id o = [self allocWithZone: NSDefaultMallocZone()]; o = [o initWithIndexes: indexes length: length]; return AUTORELEASE(o); } + (NSIndexPath *) indexPathForItem: (NSInteger)item inSection: (NSInteger)section; { NSUInteger idxs[2]; idxs[0] = (NSUInteger)section; idxs[1] = (NSUInteger)item; return [self indexPathWithIndexes: idxs length: 2]; } + (NSIndexPath *) indexPathForRow: (NSInteger)row inSection: (NSInteger)section; { NSUInteger idxs[2]; idxs[0] = (NSUInteger)section; idxs[1] = (NSUInteger)row; return [self indexPathWithIndexes: idxs length: 2]; } + (void) initialize { if (empty == nil) { myClass = self; empty = (NSIndexPath*)NSAllocateObject(self, 0, NSDefaultMallocZone()); [[NSObject leakAt: &empty] release]; dummy = (NSIndexPath*)NSAllocateObject(self, 0, NSDefaultMallocZone()); [[NSObject leakAt: &dummy] release]; shared = NSCreateHashTable(NSNonRetainedObjectHashCallBacks, 1024); [[NSObject leakAt: &shared] release]; NSHashInsert(shared, empty); lock = [NSRecursiveLock new]; [[NSObject leakAt: &lock] release]; } } - (NSComparisonResult) compare: (NSIndexPath*)other { if (other != self) { NSUInteger olength = other->_length; NSUInteger *oindexes = other->_indexes; NSUInteger end = (_length > olength) ? _length : olength; NSUInteger pos; for (pos = 0; pos < end; pos++) { if (pos >= _length) { return NSOrderedDescending; } else if (pos >= olength) { return NSOrderedAscending; } if (oindexes[pos] < _indexes[pos]) { return NSOrderedDescending; } if (oindexes[pos] > _indexes[pos]) { return NSOrderedAscending; } } /* * Should never get here. */ NSLog(@"Argh ... two identical index paths exist!"); } return NSOrderedSame; } - (id) copyWithZone: (NSZone*)aZone { return RETAIN(self); } - (void) dealloc { if (self != empty) { [lock lock]; if (shared != nil) { NSHashRemove(shared, self); } [lock unlock]; if (_indexes != 0) { NSZoneFree(NSDefaultMallocZone(), _indexes); } [super dealloc]; } GSNOSUPERDEALLOC; } - (NSString*) description { NSMutableString *m = [[super description] mutableCopy]; NSUInteger i; [m appendFormat: @"%"PRIuPTR" indexes [", _length]; for (i = 0; i < _length; i++) { if (i > 0) { [m appendString: @", "]; } [m appendFormat: @"%"PRIuPTR, _indexes[i]]; } [m appendString: @"]"]; return AUTORELEASE(m); } - (void) encodeWithCoder: (NSCoder*)aCoder { if ([aCoder allowsKeyedCoding] == YES) { [aCoder encodeInt: (NSInteger)_length forKey: @"NSIndexPathLength"]; if (_length == 1) { [aCoder encodeInt: (NSInteger)_indexes[0] forKey: @"NSIndexPathValue"]; } else if (_length > 1) { NSMutableData *m; NSUInteger *buf; NSUInteger i; m = [NSMutableData new]; [m setLength: _length * sizeof(NSUInteger)]; buf = [m mutableBytes]; for (i = 0; i < _length; i++) { buf[i] = NSSwapHostIntToBig(_indexes[i]); } [aCoder encodeObject: m forKey: @"NSIndexPathData"]; RELEASE(m); } } else { [aCoder encodeValueOfObjCType: @encode(NSUInteger) at: &_length]; if (_length > 0) { [aCoder encodeArrayOfObjCType: @encode(NSUInteger) count: _length at: _indexes]; } } } - (NSInteger) row { return (NSInteger)[self indexAtPosition: 1]; } - (NSInteger) item { return (NSInteger)[self indexAtPosition: 1]; } - (NSInteger) section { return (NSInteger)[self indexAtPosition: 0]; } - (void) getIndexes: (NSUInteger*)aBuffer { memcpy(aBuffer, _indexes, _length * sizeof(NSUInteger)); } - (NSUInteger) hash { return _hash; } - (NSUInteger) indexAtPosition: (NSUInteger)position { if (position >= _length) { return NSNotFound; } return _indexes[position]; } /** * Return path formed by adding the index to the receiver. */ - (NSIndexPath *) indexPathByAddingIndex: (NSUInteger)anIndex { NSUInteger buffer[_length + 1]; [self getIndexes: buffer]; buffer[_length] = anIndex; return [[self class] indexPathWithIndexes: buffer length: _length + 1]; } - (NSIndexPath *) indexPathByRemovingLastIndex { if (_length <= 1) { return empty; } else { return [[self class] indexPathWithIndexes: _indexes length: _length - 1]; } } - (id) initWithCoder: (NSCoder*)aCoder { if ([aCoder allowsKeyedCoding] == YES) { NSUInteger length; NSUInteger index; length = [aCoder decodeIntegerForKey: @"NSIndexPathLength"]; if (length == 1) { index = [aCoder decodeIntegerForKey: @"NSIndexPathValue"]; self = [self initWithIndex: index]; } else if (length > 1) { // FIXME ... not MacOS-X NSMutableData *d = [aCoder decodeObjectForKey: @"NSIndexPathData"]; NSUInteger l = [d length]; NSUInteger s = l / length; NSUInteger i; void *src = [d mutableBytes]; NSUInteger *dst; if (s == sizeof(NSUInteger)) { dst = (NSUInteger*)src; } else { dst = (NSUInteger*)NSZoneMalloc(NSDefaultMallocZone(), length * sizeof(NSUInteger)); } if (s == sizeof(long)) { long *ptr = (long*)src; for (i = 0; i < _length; i++) { dst[i] = (NSUInteger)NSSwapBigLongToHost(ptr[i]); } } else if (s == sizeof(short)) { short *ptr = (short*)src; for (i = 0; i < _length; i++) { dst[i] = (NSUInteger)NSSwapBigShortToHost(ptr[i]); } } else if (s == sizeof(long long)) { long long *ptr = (long long*)src; for (i = 0; i < _length; i++) { dst[i] = (NSUInteger)NSSwapBigLongLongToHost(ptr[i]); } } else { if ((void*)dst != src) { NSZoneFree(NSDefaultMallocZone(), dst); } [NSException raise: NSGenericException format: @"Unable to decode unsigned integers of size %"PRIuPTR, s]; } self = [self initWithIndexes: dst length: length]; if ((void*)dst != src) { NSZoneFree(NSDefaultMallocZone(), dst); } } } else { NSUInteger length; [aCoder decodeValueOfObjCType: @encode(NSUInteger) at: &length]; if (length == 0) { ASSIGN(self, empty); } else { NSUInteger buf[16]; NSUInteger *indexes = buf; if (length > 16) { indexes = NSZoneMalloc(NSDefaultMallocZone(), length * sizeof(NSUInteger)); } [aCoder decodeArrayOfObjCType: @encode(NSUInteger) count: length at: indexes]; self = [self initWithIndexes: indexes length: length]; if (indexes != buf) { NSZoneFree(NSDefaultMallocZone(), indexes); } } } return self; } - (id) initWithIndex: (NSUInteger)anIndex { return [self initWithIndexes: &anIndex length: 1]; } /** * Initialise the receiver to contain the specified indexes.
* May return an existing index path. */ - (id) initWithIndexes: (NSUInteger*)indexes length: (NSUInteger)length { NSIndexPath *found; NSUInteger h = 0; NSUInteger i; if (_length != 0) { [NSException raise: NSGenericException format: @"Attempt to re-initialize NSIndexPath"]; } // FIXME ... need better hash function? for (i = 0; i < length; i++) { h = (h << 5) ^ indexes[i]; } [lock lock]; dummy->_hash = h; dummy->_length = length; dummy->_indexes = indexes; found = NSHashGet(shared, dummy); if (found == nil) { if (self == empty) { RELEASE(self); self = (NSIndexPath*)NSAllocateObject([self class], 0, NSDefaultMallocZone()); } _hash = dummy->_hash; _length = dummy->_length; _indexes = NSZoneMalloc(NSDefaultMallocZone(), _length * sizeof(NSUInteger)); memcpy(_indexes, dummy->_indexes, _length * sizeof(NSUInteger)); NSHashInsert(shared, self); } else { ASSIGN(self, found); } dummy->_indexes = 0; // Don't want static indexes deallocated atExit [lock unlock]; return self; } - (BOOL) isEqual: (id)other { if (other == self) { return YES; } if (other == nil || GSObjCIsKindOf(object_getClass(other), myClass) == NO) { return NO; } if (((NSIndexPath*)other)->_length != _length) { return NO; } else { NSUInteger *oindexes = ((NSIndexPath*)other)->_indexes; NSUInteger pos = _length; while (pos-- > 0) { if (_indexes[pos] != oindexes[pos]) { return NO; } } } return YES; } - (NSUInteger) length { return _length; } - (oneway void) release { if (self != empty) { /* We lock the table while checking, to prevent * another thread from grabbing this object while we are * checking it. * If we are going to deallocate the object, we first remove * it from the table so that no other thread will find it * and try to use it while it is being deallocated. */ [lock lock]; if (NSDecrementExtraRefCountWasZero(self)) { [self dealloc]; } [lock unlock]; } } @end gnustep-base-1.29.0/Source/NSIndexSet.m000066400000000000000000001006231435650067400176160ustar00rootroot00000000000000/** Implementation for NSIndexSet, NSMutableIndexSet for GNUStep Copyright (C) 2004 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: Feb 2004 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #define EXPOSE_NSIndexSet_IVARS 1 #import "Foundation/NSCoder.h" #import "Foundation/NSData.h" #import "Foundation/NSIndexSet.h" #import "Foundation/NSException.h" #import "GSDispatch.h" #define GSI_ARRAY_TYPE NSRange #define GSI_ARRAY_NO_RELEASE 1 #define GSI_ARRAY_NO_RETAIN 1 #include "GNUstepBase/GSIArray.h" #define _array ((GSIArray)(self->_data)) #define _other ((GSIArray)(aSet->_data)) #ifdef SANITY_CHECKS static void sanity(GSIArray array) { if (array != 0) { NSUInteger c = GSIArrayCount(array); NSUInteger i; NSUInteger last = 0; for (i = 0; i < c; i++) { NSRange r = GSIArrayItemAtIndex(array, i).ext; if (i > 0) { NSCAssert(r.location > last, @"Overlap or touching ranges"); } else { NSCAssert(r.location >= last, @"Overlap ranges"); } NSCAssert(NSMaxRange(r) > r.location, @"Bad range length"); last = NSMaxRange(r); } } } #define SANITY() sanity(_array) #else #define SANITY() #endif /* * Returns the position in the array at which the index should be inserted. * This may be the position of a range containing the index if it is already * present, otherwise it is the position of the first range containing an * index greater than the argument (or a position beyond the end of the * array). */ static NSUInteger posForIndex(GSIArray array, NSUInteger index) { NSUInteger upper = GSIArrayCount(array); NSUInteger lower = 0; NSUInteger pos; /* * Binary search for an item equal to the one to be inserted. */ for (pos = upper/2; upper != lower; pos = (upper+lower)/2) { NSRange r = GSIArrayItemAtIndex(array, pos).ext; if (index < r.location) { upper = pos; } else if (index > NSMaxRange(r)) { lower = pos + 1; } else { break; } } /* * Now skip past any item containing no values as high as the index. */ while (pos < GSIArrayCount(array) && index >= NSMaxRange(GSIArrayItemAtIndex(array, pos).ext)) { pos++; } return pos; } @implementation NSIndexSet + (id) indexSet { id o = [self allocWithZone: NSDefaultMallocZone()]; o = [o init]; return AUTORELEASE(o); } + (id) indexSetWithIndex: (NSUInteger)anIndex { id o = [self allocWithZone: NSDefaultMallocZone()]; o = [o initWithIndex: anIndex]; return AUTORELEASE(o); } + (id) indexSetWithIndexesInRange: (NSRange)aRange { id o = [self allocWithZone: NSDefaultMallocZone()]; o = [o initWithIndexesInRange: aRange]; return AUTORELEASE(o); } - (BOOL) containsIndex: (NSUInteger)anIndex { NSUInteger pos; NSRange r; if (_array == 0 || GSIArrayCount(_array) == 0 || (pos = posForIndex(_array, anIndex)) >= GSIArrayCount(_array)) { return NO; } r = GSIArrayItemAtIndex(_array, pos).ext; return NSLocationInRange(anIndex, r); } - (BOOL) containsIndexes: (NSIndexSet*)aSet { NSUInteger count = _other ? GSIArrayCount(_other) : 0; if (count > 0) { NSUInteger i; for (i = 0; i < count; i++) { NSRange r = GSIArrayItemAtIndex(_other, i).ext; if ([self containsIndexesInRange: r] == NO) { return NO; } } } return YES; } - (BOOL) containsIndexesInRange: (NSRange)aRange { NSUInteger pos; NSRange r; if (NSNotFound - aRange.length < aRange.location) { [NSException raise: NSInvalidArgumentException format: @"[%@-%@]: Bad range", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; } if (_array == 0 || GSIArrayCount(_array) == 0 || (pos = posForIndex(_array, aRange.location)) >= GSIArrayCount(_array)) { return NO; // Empty ... contains no indexes. } if (aRange.length == 0) { return YES; // No indexes needed. } r = GSIArrayItemAtIndex(_array, pos).ext; if (NSLocationInRange(aRange.location, r) && NSLocationInRange(NSMaxRange(aRange)-1, r)) { return YES; } return NO; } - (id) copyWithZone: (NSZone*)aZone { if (NSShouldRetainWithZone(self, aZone)) { return RETAIN(self); } else { NSIndexSet *c = [NSIndexSet allocWithZone: aZone]; return [c initWithIndexSet: self]; } } - (NSUInteger) count { if (_array == 0 || GSIArrayCount(_array) == 0) { return 0; } else { NSUInteger count = GSIArrayCount(_array); NSUInteger total = 0; NSUInteger i = 0; while (i < count) { total += GSIArrayItemAtIndex(_array, i).ext.length; i++; } return total; } } - (NSUInteger) countOfIndexesInRange: (NSRange)range { if (_array == 0 || GSIArrayCount(_array) == 0) { return 0; } else { NSUInteger count = GSIArrayCount(_array); NSUInteger total = 0; NSUInteger i = 0; while (i < count) { NSRange r = GSIArrayItemAtIndex(_array, i).ext; r = NSIntersectionRange(r, range); total += r.length; i++; } return total; } } - (void) dealloc { if (_array != 0) { GSIArrayClear(_array); NSZoneFree([self zone], _array); _data = 0; } [super dealloc]; } - (NSString*) description { NSMutableString *m; NSUInteger c = (_array == 0) ? 0 : GSIArrayCount(_array); NSUInteger i; if (c == 0) { return [NSString stringWithFormat: @"%@(no indexes)", [super description]]; } m = [NSMutableString stringWithFormat: @"%@[number of indexes: %"PRIuPTR" (in %"PRIuPTR" ranges), indexes:", [super description], [self count], c]; for (i = 0; i < c; i++) { NSRange r = GSIArrayItemAtIndex(_array, i).ext; if (r.length > 1) { [m appendFormat: @" (%"PRIuPTR"-%"PRIuPTR")", r.location, NSMaxRange(r) - 1]; } else { [m appendFormat: @" %"PRIuPTR, r.location]; } } [m appendString: @"]"]; return m; } - (void) encodeWithCoder: (NSCoder*)aCoder { NSUInteger rangeCount = 0; if (_array != 0) { rangeCount = GSIArrayCount(_array); } if ([aCoder allowsKeyedCoding]) { [aCoder encodeInt: rangeCount forKey: @"NSRangeCount"]; } else { [aCoder encodeValueOfObjCType: @encode(NSUInteger) at: &rangeCount]; } if (rangeCount == 0) { // Do nothing } else if (rangeCount == 1) { NSRange r; r = GSIArrayItemAtIndex(_array, 0).ext; if ([aCoder allowsKeyedCoding]) { [aCoder encodeInt: r.location forKey: @"NSLocation"]; [aCoder encodeInt: r.length forKey: @"NSLength"]; } else { [aCoder encodeValueOfObjCType: @encode(NSUInteger) at: &r.location]; [aCoder encodeValueOfObjCType: @encode(NSUInteger) at: &r.length]; } } else { NSMutableData *m = [NSMutableData dataWithCapacity: rangeCount*2]; NSUInteger i; for (i = 0; i < rangeCount; i++) { NSRange r; NSUInteger v; uint8_t b; r = GSIArrayItemAtIndex(_array, i).ext; v = r.location; do { if (v > 0x7f) { b = (v & 0x7f) | 0x80; } else { b = v; } v >>= 7; [m appendBytes: &b length: 1]; } while (v > 0); v = r.length; do { if (v > 0x7f) { b = (v & 0x7f) | 0x80; } else { b = v; } v >>= 7; [m appendBytes: &b length: 1]; } while (v > 0); } if ([aCoder allowsKeyedCoding]) { [aCoder encodeObject: m forKey: @"NSRangeData"]; } else { [aCoder encodeObject: m]; } } } - (NSUInteger) firstIndex { if (_array == 0 || GSIArrayCount(_array) == 0) { return NSNotFound; } return GSIArrayItemAtIndex(_array, 0).ext.location; } - (NSUInteger) getIndexes: (NSUInteger*)aBuffer maxCount: (NSUInteger)aCount inIndexRange: (NSRangePointer)aRange { NSUInteger pos; NSUInteger i = 0; NSRange r; NSRange fullRange; if (aBuffer == 0) { [NSException raise: NSInvalidArgumentException format: @"[%@-%@]: nul pointer argument", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; } if (aRange == 0) { fullRange = (NSRange){0, NSNotFound}; aRange = &fullRange; } else if (NSNotFound - aRange->length < aRange->location) { [NSException raise: NSInvalidArgumentException format: @"[%@-%@]: Bad range", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; } if (_array == 0 || GSIArrayCount(_array) == 0 || (pos = posForIndex(_array, aRange->location)) >= GSIArrayCount(_array)) { *aRange = NSMakeRange(NSMaxRange(*aRange), 0); return 0; } while (aRange->length > 0 && i < aCount && pos < GSIArrayCount(_array)) { r = GSIArrayItemAtIndex(_array, pos).ext; if (aRange->location < r.location) { NSUInteger skip = r.location - aRange->location; if (skip > aRange->length) { skip = aRange->length; } aRange->location += skip; aRange->length -= skip; } if (NSLocationInRange(aRange->location, r)) { while (aRange->length > 0 && i < aCount && aRange->location < NSMaxRange(r)) { aBuffer[i++] = aRange->location++; aRange->length--; } } else { } pos++; } return i; } - (NSUInteger) hash { return [self count]; } - (NSUInteger) indexGreaterThanIndex: (NSUInteger)anIndex { NSUInteger pos; NSRange r; if (anIndex++ == NSNotFound) { return NSNotFound; } if (_array == 0 || GSIArrayCount(_array) == 0 || (pos = posForIndex(_array, anIndex)) >= GSIArrayCount(_array)) { return NSNotFound; } r = GSIArrayItemAtIndex(_array, pos).ext; if (NSLocationInRange(anIndex, r)) { return anIndex; } return r.location; } - (NSUInteger) indexGreaterThanOrEqualToIndex: (NSUInteger)anIndex { NSUInteger pos; NSRange r; if (anIndex == NSNotFound) { return NSNotFound; } if (_array == 0 || GSIArrayCount(_array) == 0 || (pos = posForIndex(_array, anIndex)) >= GSIArrayCount(_array)) { return NSNotFound; } r = GSIArrayItemAtIndex(_array, pos).ext; if (NSLocationInRange(anIndex, r)) { return anIndex; } return r.location; } - (NSUInteger) indexLessThanIndex: (NSUInteger)anIndex { NSUInteger pos; NSRange r; if (anIndex-- == 0) { return NSNotFound; } if (_array == 0 || GSIArrayCount(_array) == 0 || (pos = posForIndex(_array, anIndex)) >= GSIArrayCount(_array)) { return NSNotFound; } r = GSIArrayItemAtIndex(_array, pos).ext; if (NSLocationInRange(anIndex, r)) { return anIndex; } if (pos-- == 0) { return NSNotFound; } r = GSIArrayItemAtIndex(_array, pos).ext; return NSMaxRange(r) - 1; } - (NSUInteger) indexLessThanOrEqualToIndex: (NSUInteger)anIndex { NSUInteger pos; NSRange r; if (_array == 0 || GSIArrayCount(_array) == 0 || (pos = posForIndex(_array, anIndex)) >= GSIArrayCount(_array)) { return NSNotFound; } r = GSIArrayItemAtIndex(_array, pos).ext; if (NSLocationInRange(anIndex, r)) { return anIndex; } if (pos-- == 0) { return NSNotFound; } r = GSIArrayItemAtIndex(_array, pos).ext; return NSMaxRange(r) - 1; } - (id) init { return self; } - (id) initWithCoder: (NSCoder*)aCoder { NSUInteger rangeCount = 0; if ([aCoder allowsKeyedCoding]) { if ([aCoder containsValueForKey: @"NSRangeCount"]) { rangeCount = [aCoder decodeIntForKey: @"NSRangeCount"]; } } else { [aCoder decodeValueOfObjCType: @encode(NSUInteger) at: &rangeCount]; } if (rangeCount == 0) { // Do nothing } else if (rangeCount == 1) { NSUInteger len = 0; NSUInteger loc = 0; if ([aCoder allowsKeyedCoding]) { if ([aCoder containsValueForKey: @"NSLocation"]) { loc = [aCoder decodeIntForKey: @"NSLocation"]; } if ([aCoder containsValueForKey: @"NSLength"]) { len = [aCoder decodeIntForKey: @"NSLength"]; } } else { [aCoder decodeValueOfObjCType: @encode(NSUInteger) at: &loc]; [aCoder decodeValueOfObjCType: @encode(NSUInteger) at: &len]; } self = [self initWithIndexesInRange: NSMakeRange(loc, len)]; } else { NSMutableIndexSet *other = [NSMutableIndexSet new]; NSData *data = nil; const uint8_t *bytes; NSUInteger length; NSUInteger index = 0; if ([aCoder allowsKeyedCoding]) { if ([aCoder containsValueForKey: @"NSRangeData"]) { data = [aCoder decodeObjectForKey: @"NSRangeData"]; } } else { data = [aCoder decodeObject]; } bytes = (const uint8_t*)[data bytes]; length = [data length]; while (index < length) { NSRange range; NSUInteger offset; NSUInteger value; NSUInteger next; for (offset = 0; index + offset < length; offset++) { if (bytes[index + offset] < 0x80) { break; } } NSAssert(index + offset < length && bytes[index + offset] < 0x80, NSInternalInconsistencyException); next = index + offset + 1; value = bytes[index + offset]; while (offset-- > 0) { value <<= 7; value += (bytes[index + offset] & 0x7f); } range.location = value; index = next; for (offset = 0; index + offset < length; offset++) { if (bytes[index + offset] < 0x80) { break; } } NSAssert(index + offset < length && bytes[index + offset] < 0x80, NSInternalInconsistencyException); next = index + offset + 1; value = bytes[index + offset]; while (offset-- > 0) { value <<= 7; value += (bytes[index + offset] & 0x7f); } range.length = value; index = next; [other addIndexesInRange: range]; } self = [self initWithIndexSet: other]; RELEASE(other); /* FIXME: NSLog(@"Decoded count %d, data %@", rangeCount, data); This is a very strange format: 5 + 6 + 9 gives <05020901> 5 + 6 + 23 gives <05021701> 155 + 156 + 223 gives <9b0102df 0101> */ } return self; } - (id) initWithIndex: (NSUInteger)anIndex { if (anIndex == NSNotFound) { DESTROY(self); // NSNotFound is not legal } else { self = [self initWithIndexesInRange: NSMakeRange(anIndex, 1)]; } return self; } - (id) initWithIndexesInRange: (NSRange)aRange { if (aRange.length > 0) { if (NSMaxRange(aRange) == NSNotFound) { DESTROY(self); // NSNotFound is not legal } else { _data = (GSIArray)NSZoneMalloc([self zone], sizeof(GSIArray_t)); GSIArrayInitWithZoneAndCapacity(_array, [self zone], 1); GSIArrayAddItem(_array, (GSIArrayItem)aRange); } } return self; } - (id) initWithIndexSet: (NSIndexSet*)aSet { if (aSet == nil || [aSet isKindOfClass: [NSIndexSet class]] == NO) { DESTROY(self); } else { NSUInteger count = _other ? GSIArrayCount(_other) : 0; if (count > 0) { NSUInteger i; _data = (GSIArray)NSZoneMalloc([self zone], sizeof(GSIArray_t)); GSIArrayInitWithZoneAndCapacity(_array, [self zone], count); for (i = 0; i < count; i++) { GSIArrayAddItem(_array, GSIArrayItemAtIndex(_other, i)); } } } return self; } - (BOOL) intersectsIndexesInRange: (NSRange)aRange { NSUInteger p1; NSUInteger p2; if (NSNotFound - aRange.length < aRange.location) { [NSException raise: NSInvalidArgumentException format: @"[%@-%@]: Bad range", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; } if (aRange.length == 0 || _array == 0 || GSIArrayCount(_array) == 0) { return NO; // Empty } p1 = posForIndex(_array, aRange.location); p2 = posForIndex(_array, NSMaxRange(aRange) - 1); if (p1 != p2) { return YES; } if (p1 >= GSIArrayCount(_array)) { return NO; } if (NSLocationInRange(aRange.location, GSIArrayItemAtIndex(_array, p1).ext)) { return YES; } if (NSLocationInRange(NSMaxRange(aRange)-1, GSIArrayItemAtIndex(_array, p1).ext)) { return YES; } return NO; } - (BOOL) isEqual: (id)aSet { if ([aSet isKindOfClass: [NSIndexSet class]] == YES) { return [self isEqualToIndexSet: aSet]; } return NO; } - (BOOL) isEqualToIndexSet: (NSIndexSet*)aSet { NSUInteger count = _other ? GSIArrayCount(_other) : 0; if (count != (_array ? GSIArrayCount(_array) : 0)) { return NO; } if (count > 0) { NSUInteger i; for (i = 0; i < count; i++) { NSRange rself = GSIArrayItemAtIndex(_array, i).ext; NSRange rother = GSIArrayItemAtIndex(_other, i).ext; if (NSEqualRanges(rself, rother) == NO) { return NO; } } } return YES; } - (NSUInteger) lastIndex { if (_array == 0 || GSIArrayCount(_array) == 0) { return NSNotFound; } return NSMaxRange(GSIArrayItemAtIndex(_array, GSIArrayCount(_array)-1).ext)-1; } - (id) mutableCopyWithZone: (NSZone*)aZone { NSMutableIndexSet *c = [NSMutableIndexSet allocWithZone: aZone]; return [c initWithIndexSet: self]; } - (void) enumerateIndexesInRange: (NSRange)range options: (NSEnumerationOptions)opts usingBlock: (GSIndexSetEnumerationBlock)aBlock { NSUInteger lastInRange; NSUInteger startArrayIndex; NSUInteger endArrayIndex; NSUInteger i; NSUInteger c; BOOL isReverse = opts & NSEnumerationReverse; BLOCK_SCOPE BOOL shouldStop = NO; if ((0 == [self count]) || (NSNotFound == range.location)) { return; } startArrayIndex = posForIndex(_array, range.location); if (NSNotFound == startArrayIndex) { startArrayIndex = 0; } lastInRange = (NSMaxRange(range) - 1); endArrayIndex = MIN(posForIndex(_array, lastInRange), (GSIArrayCount(_array) - 1)); if (NSNotFound == endArrayIndex) { endArrayIndex = GSIArrayCount(_array) - 1; } if (isReverse) { i = endArrayIndex; c = startArrayIndex; } else { i = startArrayIndex; c = endArrayIndex; } GS_DISPATCH_CREATE_QUEUE_AND_GROUP_FOR_ENUMERATION(enumQueue, opts) while (isReverse ? i >= c : i <= c) { NSRange r = GSIArrayItemAtIndex(_array, i).ext; NSUInteger innerI; NSUInteger innerC; if (isReverse) { innerI = NSMaxRange(r) - 1; innerC = r.location; } else { innerI = r.location; innerC = NSMaxRange(r) - 1; } while (isReverse ? innerI >= innerC : innerI <= innerC) { if ((innerI <= lastInRange) && (innerI >= range.location)) { GS_DISPATCH_SUBMIT_BLOCK(enumQueueGroup, enumQueue, if (shouldStop == NO) {, }, aBlock, innerI, &shouldStop); } if (shouldStop) { break; } if (isReverse) { if (0 == innerI) { break; } innerI--; } else { innerI++; } } if (shouldStop) { break; } if (isReverse) { if (0 == i) { break; } i--; } else { i++; } } GS_DISPATCH_TEARDOWN_QUEUE_AND_GROUP_FOR_ENUMERATION(enumQueue, opts) } - (void) enumerateIndexesWithOptions: (NSEnumerationOptions)opts usingBlock: (GSIndexSetEnumerationBlock)aBlock { NSUInteger firstIndex; NSUInteger lastIndex; NSRange range; firstIndex = [self firstIndex]; if (NSNotFound == firstIndex) { return; } lastIndex = [self lastIndex]; range = NSMakeRange(firstIndex, ((lastIndex - firstIndex) + 1)); [self enumerateIndexesInRange: range options: opts usingBlock: aBlock]; } - (void) enumerateIndexesUsingBlock: (GSIndexSetEnumerationBlock)aBlock { [self enumerateIndexesWithOptions: 0 usingBlock: aBlock]; } @end @implementation NSMutableIndexSet #undef _other #define _other ((GSIArray)(((NSMutableIndexSet*)aSet)->_data)) - (void) addIndex: (NSUInteger)anIndex { [self addIndexesInRange: NSMakeRange(anIndex, 1)]; } - (void) addIndexes: (NSIndexSet*)aSet { NSUInteger count = _other ? GSIArrayCount(_other) : 0; if (count > 0) { NSUInteger i; for (i = 0; i < count; i++) { NSRange r = GSIArrayItemAtIndex(_other, i).ext; [self addIndexesInRange: r]; } } } - (void) addIndexesInRange: (NSRange)aRange { NSUInteger pos; if (NSNotFound - aRange.length < aRange.location) { [NSException raise: NSInvalidArgumentException format: @"[%@-%@]: Bad range", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; } if (aRange.length == 0) { return; } if (_array == 0) { _data = (GSIArray)NSZoneMalloc([self zone], sizeof(GSIArray_t)); GSIArrayInitWithZoneAndCapacity(_array, [self zone], 1); } pos = posForIndex(_array, aRange.location); if (pos >= GSIArrayCount(_array)) { /* * The start of the range to add lies beyond the existing * ranges, so we can simply append it. */ GSIArrayAddItem(_array, (GSIArrayItem)aRange); } else { NSRange r = GSIArrayItemAtIndex(_array, pos).ext; if (NSLocationInRange(aRange.location, r)) { pos++; } GSIArrayInsertItem(_array, (GSIArrayItem)aRange, pos); } /* * Combine with the preceding ranges if possible. */ while (pos > 0) { NSRange r = GSIArrayItemAtIndex(_array, pos-1).ext; if (NSMaxRange(r) < aRange.location) { break; } if (NSMaxRange(r) >= NSMaxRange(aRange)) { GSIArrayRemoveItemAtIndex(_array, pos--); } else { r.length += (NSMaxRange(aRange) - NSMaxRange(r)); GSIArrayRemoveItemAtIndex(_array, pos--); GSIArraySetItemAtIndex(_array, (GSIArrayItem)r, pos); } } /* * Combine with any following ranges where possible. */ while (pos + 1 < GSIArrayCount(_array)) { NSRange r = GSIArrayItemAtIndex(_array, pos+1).ext; if (NSMaxRange(aRange) < r.location) { break; } GSIArrayRemoveItemAtIndex(_array, pos + 1); if (NSMaxRange(r) > NSMaxRange(aRange)) { int offset = NSMaxRange(r) - NSMaxRange(aRange); r = GSIArrayItemAtIndex(_array, pos).ext; r.length += offset; GSIArraySetItemAtIndex(_array, (GSIArrayItem)r, pos); } } SANITY(); } - (id) copyWithZone: (NSZone*)aZone { NSIndexSet *c = [NSIndexSet allocWithZone: aZone]; return [c initWithIndexSet: self]; } - (void) removeAllIndexes { if (_array != 0) { GSIArrayRemoveAllItems(_array); } } - (void) removeIndex: (NSUInteger)anIndex { [self removeIndexesInRange: NSMakeRange(anIndex, 1)]; } - (void) removeIndexes: (NSIndexSet*)aSet { NSUInteger count = _other ? GSIArrayCount(_other) : 0; if (count > 0) { NSUInteger i; for (i = 0; i < count; i++) { NSRange r = GSIArrayItemAtIndex(_other, i).ext; [self removeIndexesInRange: r]; } } } - (void) removeIndexesInRange: (NSRange)aRange { NSUInteger pos; NSRange r; if (NSNotFound - aRange.length < aRange.location) { [NSException raise: NSInvalidArgumentException format: @"[%@-%@]: Bad range", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; } if (aRange.length == 0 || _array == 0 || (pos = posForIndex(_array, aRange.location)) >= GSIArrayCount(_array)) { return; // Already empty } r = GSIArrayItemAtIndex(_array, pos).ext; if (r.location <= aRange.location) { if (r.location == aRange.location) { if (NSMaxRange(r) <= NSMaxRange(aRange)) { /* * Found range is entirely within range to remove, * leaving next range to check at current position. */ GSIArrayRemoveItemAtIndex(_array, pos); } else { /* * Range to remove is entirely within found range and * overlaps the start of the found range ... shrink it * and then we are finished. */ r.location += aRange.length; r.length -= aRange.length; GSIArraySetItemAtIndex(_array, (GSIArrayItem)r, pos); pos++; } } else { if (NSMaxRange(r) <= NSMaxRange(aRange)) { /* * Range to remove overlaps the end of the found range. * May also overlap next range ... so shorten found * range and move on. */ r.length = aRange.location - r.location; GSIArraySetItemAtIndex(_array, (GSIArrayItem)r, pos); pos++; } else { NSRange next = r; /* * Range to remove is entirely within found range and * overlaps the middle of the found range ... split it. * Then we are finished. */ next.location = NSMaxRange(aRange); next.length = NSMaxRange(r) - next.location; r.length = aRange.location - r.location; GSIArraySetItemAtIndex(_array, (GSIArrayItem)r, pos); pos++; GSIArrayInsertItem(_array, (GSIArrayItem)next, pos); pos++; } } } /* * At this point we are guaranteed that, if there is a range at pos, * it does not start before aRange.location */ while (pos < GSIArrayCount(_array)) { NSRange r = GSIArrayItemAtIndex(_array, pos).ext; if (NSMaxRange(r) <= NSMaxRange(aRange)) { /* * Found range is entirely within range to remove ... * delete it. */ GSIArrayRemoveItemAtIndex(_array, pos); } else { if (r.location < NSMaxRange(aRange)) { /* * Range to remove overlaps start of found range ... * shorten it. */ r.length = NSMaxRange(r) - NSMaxRange(aRange); r.location = NSMaxRange(aRange); GSIArraySetItemAtIndex(_array, (GSIArrayItem)r, pos); } /* * Found range extends beyond range to remove ... finished. */ break; } } SANITY(); } - (void) shiftIndexesStartingAtIndex: (NSUInteger)anIndex by: (NSInteger)amount { if (amount != 0 && _array != 0 && GSIArrayCount(_array) > 0) { NSUInteger c; NSUInteger pos; if (amount > 0) { c = GSIArrayCount(_array); pos = posForIndex(_array, anIndex); if (pos < c) { NSRange r = GSIArrayItemAtIndex(_array, pos).ext; /* * If anIndex is within an existing range, we split * that range so we have one starting at anIndex. */ if (r.location < anIndex) { NSRange t; /* * Split the range. */ t = NSMakeRange(r.location, anIndex - r.location); GSIArrayInsertItem(_array, (GSIArrayItem)t, pos); c++; r.length = NSMaxRange(r) - anIndex; r.location = anIndex; GSIArraySetItemAtIndex(_array, (GSIArrayItem)r, ++pos); } /* * Shift all higher ranges to the right. */ while (c > pos) { NSRange r = GSIArrayItemAtIndex(_array, --c).ext; if (NSNotFound - amount <= r.location) { GSIArrayRemoveItemAtIndex(_array, c); } else if (NSNotFound - amount < NSMaxRange(r)) { r.location += amount; r.length = NSNotFound - r.location; GSIArraySetItemAtIndex(_array, (GSIArrayItem)r, c); } else { r.location += amount; GSIArraySetItemAtIndex(_array, (GSIArrayItem)r, c); } } } } else { amount = -amount; /* * Delete range which will be overwritten. */ if (amount >= anIndex) { [self removeIndexesInRange: NSMakeRange(0, anIndex)]; } else { [self removeIndexesInRange: NSMakeRange(anIndex - amount, amount)]; } pos = posForIndex(_array, anIndex); /* * Now shift everything left into the hole we made. */ c = GSIArrayCount(_array); while (c > pos) { NSRange r = GSIArrayItemAtIndex(_array, --c).ext; if (NSMaxRange(r) <= amount) { GSIArrayRemoveItemAtIndex(_array, c); } else if (r.location <= amount) { r.length += (r.location - amount); r.location = 0; GSIArraySetItemAtIndex(_array, (GSIArrayItem)r, c); } else { r.location -= amount; GSIArraySetItemAtIndex(_array, (GSIArrayItem)r, c); } } if (pos > 0) { c = GSIArrayCount(_array); if (pos < c) { NSRange r0 = GSIArrayItemAtIndex(_array, pos - 1).ext; NSRange r1 = GSIArrayItemAtIndex(_array, pos).ext; if (NSMaxRange(r0) == r1.location) { r0.length += r1.length; GSIArraySetItemAtIndex(_array, (GSIArrayItem)r0, pos - 1); GSIArrayRemoveItemAtIndex(_array, pos); } } } } } SANITY(); } @end @implementation NSIndexSet (NSCharacterSet) /* Extra method to let NSCharacterSet play with index sets more efficiently. */ - (NSUInteger) _gapGreaterThanIndex: (NSUInteger)anIndex { NSUInteger pos; NSRange r; if (anIndex++ == NSNotFound) { return NSNotFound; } if (_array == 0 || GSIArrayCount(_array) == 0) { return NSNotFound; } if ((pos = posForIndex(_array, anIndex)) >= GSIArrayCount(_array)) { r = GSIArrayItemAtIndex(_array, pos-1).ext; if (anIndex > NSMaxRange(r)) { return NSNotFound; } return anIndex; // anIndex is the gap after the last index. } r = GSIArrayItemAtIndex(_array, pos).ext; if (r.location > anIndex) { return anIndex; // anIndex is in a gap between index ranges. } return NSMaxRange(r); // Return start of gap after the index range. } @end /* A subclass used to access a pre-generated table of information on the * stack or in other non-heap allocated memory. */ @interface _GSStaticIndexSet : NSIndexSet @end @implementation _GSStaticIndexSet - (void) dealloc { if (_array != 0) { /* Free the array without freeing its static content. */ NSZoneFree([self zone], _array); _data = 0; } [super dealloc]; } - (id) _initWithBytes: (const void*)bytes length: (NSUInteger)length { NSAssert(length % sizeof(GSIArrayItem) == 0, NSInvalidArgumentException); NSAssert(length % __alignof__(GSIArrayItem) == 0, NSInvalidArgumentException); length /= sizeof(NSRange); _data = NSZoneMalloc([self zone], sizeof(GSIArray_t)); _array->ptr = (GSIArrayItem*)bytes; _array->count = length; _array->cap = length; _array->old = length; _array->zone = 0; return self; } - (id) init { return [self _initWithBytes: 0 length: 0]; } @end gnustep-base-1.29.0/Source/NSInvocation.m000066400000000000000000000502101435650067400202000ustar00rootroot00000000000000/** Implementation of NSInvocation for GNUStep Copyright (C) 1998,2003 Free Software Foundation, Inc. Author: Richard Frith-Macdonald Date: August 1998 Based on code by: Andrew Kachites McCallum This file is part of the GNUstep Base Library. 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 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 USA. NSInvocation class reference $Date$ $Revision$ */ #import "common.h" #define EXPOSE_NSInvocation_IVARS 1 #import "Foundation/NSException.h" #import "Foundation/NSCoder.h" #import "Foundation/NSData.h" #import "Foundation/NSInvocation.h" #import "Foundation/NSZone.h" #import "GSInvocation.h" #import "GSPrivate.h" #if defined(USE_LIBFFI) #include "cifframe.h" #elif defined(USE_FFCALL) #include "callframe.h" #endif #if defined(HAVE_SYS_MMAN_H) #include #endif #if defined(HAVE_MMAP) # if !defined(MAP_ANONYMOUS) # if defined(MAP_ANON) # define MAP_ANONYMOUS MAP_ANON # else # undef HAVE_MMAP # endif # endif #endif @implementation GSCodeBuffer + (GSCodeBuffer*) memoryWithSize: (NSUInteger)_size { return [[[self alloc] initWithSize: _size] autorelease]; } - (void*) buffer { return buffer; } - (void) dealloc { DESTROY(frame); if (size > 0) { #if defined(HAVE_FFI_PREP_CLOSURE_LOC) ffi_closure_free(buffer); #else #if defined(HAVE_MMAP) munmap(buffer, size); #else #if !defined(_WIN32) && defined(HAVE_MPROTECT) if (mprotect(buffer, NSPageSize(), PROT_READ|PROT_WRITE) == -1) { NSLog(@"Failed to protect memory as writable: %@", [NSError _last]); } #endif NSDeallocateMemoryPages(buffer, NSPageSize()); #endif #endif buffer = 0; executable = 0; size = 0; } [super dealloc]; } - (void*) executable { return executable; } - (id) initWithSize: (NSUInteger)_size { NSAssert(_size > 0, @"Tried to allocate zero length buffer."); NSAssert(_size <= NSPageSize(), @"Tried to allocate more than one page."); #if defined(HAVE_FFI_PREP_CLOSURE_LOC) buffer = ffi_closure_alloc(_size, &executable); if (0 == buffer) { executable = 0; } else { size = _size; } #else #if defined(HAVE_MMAP) #if defined(HAVE_MPROTECT) /* We have mprotect, so we create memory as writable and change it to * executable later (writable and executable may not be possible at * the same time). */ buffer = mmap (NULL, _size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); #else /* We do not have mprotect, so we have to try to create writable and * executable memory. */ buffer = mmap (NULL, _size, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); #endif /* HAVE_MPROTECT */ if (buffer == (void*)-1) buffer = (void*)0; #else buffer = NSAllocateMemoryPages(NSPageSize()); #endif /* HAVE_MMAP */ if (buffer == (void*)0) { NSLog(@"Failed to map %"PRIuPTR " bytes for execute: %@", _size, [NSError _last]); buffer = 0; executable = 0; [self dealloc]; self = nil; } else { executable = buffer; size = _size; } #endif /* USE_LIBFFI */ return self; } /* Ensure that the protection on the buffer is such that it will execute * on any architecture. */ - (void) protect { #if !defined(HAVE_FFI_PREP_CLOSURE_LOC) #if defined(_WIN32) DWORD old; if (VirtualProtect(buffer, size, PAGE_EXECUTE, &old) == 0) { NSLog(@"Failed to protect memory as executable: %@", [NSError _last]); } #elif defined(HAVE_MPROTECT) if (mprotect(buffer, NSPageSize(), PROT_READ|PROT_EXEC) == -1) { NSLog(@"Failed to protect memory as executable: %@", [NSError _last]); } #endif #endif } - (void) setFrame: (id)aFrame { ASSIGN(frame, aFrame); } @end static Class NSInvocation_abstract_class; static Class NSInvocation_concrete_class; GS_ROOT_CLASS @interface GSInvocationProxy { @public Class isa; id target; NSInvocation *invocation; } + (id) _newWithTarget: (id)t; - (NSInvocation*) _invocation; - (void) forwardInvocation: (NSInvocation*)anInvocation; - (NSMethodSignature*) methodSignatureForSelector: (SEL)aSelector; @end @interface GSMessageProxy : GSInvocationProxy @end #define _inf ((NSArgumentInfo*)_info) /** *

The NSInvocation class implements a mechanism of constructing * messages (as NSInvocation instances), sending these to other * objects, and handling the returned values. *

*

An NSInvocation object may contain a target object to which a * message can be sent, or may send the message to an arbitrary object.
* Each message consists of a selector for that method and an argument * list. Once the message has been sent, the invocation will contain * a return value whose contents may be copied out of it. *

*

The target, selector, and arguments of an instance be constructed * dynamically, providing a great deal of power/flexibility. *

*

The sending of the message to the target object (using the -invoke * or -invokeWithTarget: method) can be done at any time, but a standard * use of this is by the [NSObject-forwardInvocation:] method which is * called whenever a method is not implemented by the class of the * object to which it was sent. *

*

Related to the class are two convenience macros ... NS_MESSAGE() * and NS_INVOCATION() ... to allow easy construction of invocations * with all the arguments set up. *

*/ @implementation NSInvocation #ifdef USE_LIBFFI static inline void _get_arg(NSInvocation *inv, int index, void *buffer) { cifframe_get_arg((cifframe_t *)inv->_cframe, index, buffer, ((NSArgumentInfo*)inv->_info)[index+1].size); } static inline void _set_arg(NSInvocation *inv, int index, void *buffer) { cifframe_set_arg((cifframe_t *)inv->_cframe, index, buffer, ((NSArgumentInfo*)inv->_info)[index+1].size); } static inline void * _arg_addr(NSInvocation *inv, int index) { return cifframe_arg_addr((cifframe_t *)inv->_cframe, index); } #elif defined(USE_FFCALL) static inline void _get_arg(NSInvocation *inv, int index, void *buffer) { callframe_get_arg((callframe_t *)inv->_cframe, index, buffer, ((NSArgumentInfo*)inv->_info)[index+1].size); } static inline void _set_arg(NSInvocation *inv, int index, void *buffer) { callframe_set_arg((callframe_t *)inv->_cframe, index, buffer, ((NSArgumentInfo*)inv->_info)[index+1].size); } static inline void * _arg_addr(NSInvocation *inv, int index) { return callframe_arg_addr((callframe_t *)inv->_cframe, index); } #else static inline void _get_arg(NSInvocation *inv, int index, void *buffer) { } static inline void _set_arg(NSInvocation *inv, int index, void *buffer) { } static inline void * _arg_addr(NSInvocation *inv, int index) { return 0; } #endif + (id) allocWithZone: (NSZone*)aZone { if (self == NSInvocation_abstract_class) { return NSAllocateObject(NSInvocation_concrete_class, 0, aZone); } else { return NSAllocateObject(self, 0, aZone); } } + (void) initialize { if (self == [NSInvocation class]) { NSInvocation_abstract_class = self; #if defined(USE_LIBFFI) NSInvocation_concrete_class = [GSFFIInvocation class]; #elif defined(USE_FFCALL) NSInvocation_concrete_class = [GSFFCallInvocation class]; #else NSInvocation_concrete_class = [GSDummyInvocation class]; #endif } } /** * Returns an invocation instance which can be used to send messages to * a target object using the described signature.
* You must set the target and selector (using -setTarget: and -setSelector:) * before you attempt to use the invocation.
* Raises an NSInvalidArgumentException if the signature is nil. */ + (NSInvocation*) invocationWithMethodSignature: (NSMethodSignature*)_signature { return AUTORELEASE([[NSInvocation_concrete_class alloc] initWithMethodSignature: _signature]); } - (void) dealloc { if (_targetRetained) { _targetRetained = NO; RELEASE(_target); } if (_argsRetained) { _argsRetained = NO; if (_cframe && _sig) { unsigned int i; for (i = 3; i <= _numArgs; i++) { if (*_inf[i].type == _C_CHARPTR) { char *str = 0; _get_arg(self, i-1, &str); if (str != 0) { NSZoneFree(NSDefaultMallocZone(), str); } } else if (*_inf[i].type == _C_ID) { id obj = nil; _get_arg(self, i-1, &obj); RELEASE(obj); } } } } CLEAR_RETURN_VALUE_IF_OBJECT; #if defined(USE_LIBFFI) if (_cframe) { /* If we get here then we are not using GC, so the _frame instance * variable points to a mutable data object containing _cframe and * we can release it. */ [((GSFFIInvocation*)self)->_frame release]; } #elif defined(USE_FFCALL) if (_cframe) { NSZoneFree(NSDefaultMallocZone(), _cframe); } #endif if (_retptr) { NSZoneFree(NSDefaultMallocZone(), _retptr); } RELEASE(_sig); [super dealloc]; } /** * Copies the argument identified by index into the memory location specified * by the buffer argument.
* An index of zero is the target object, an index of one is the selector, * so the actual method arguments start at index 2. */ - (void) getArgument: (void*)buffer atIndex: (NSInteger)index { if ((NSUInteger)index >= _numArgs) { [NSException raise: NSInvalidArgumentException format: @"bad invocation argument index"]; } if (index == 0) { *(id*)buffer = _target; } else if (index == 1) { *(SEL*)buffer = _selector; } else { _get_arg(self, index, buffer); } } /** * Copies the invocations return value to the location pointed to by buffer * if a return value has been set (see the -setReturnValue: method).
* If there isn't a return value then this method raises an exception. */ - (void) getReturnValue: (void*)buffer { if (_validReturn == NO) { [NSException raise: NSGenericException format: @"getReturnValue with no value set"]; } if (*_inf[0].type != _C_VOID) { memcpy(buffer, _retval, _inf[0].size); } } /** * Returns the selector of the invocation (the argument at index 1) */ - (SEL) selector { return _selector; } /** * Sets the argument identified by index from the memory location specified * by the buffer argument.
* Using an index of 0 is equivalent to calling -setTarget: and using an * argument of 1 is equivalent to -setSelector:
* Proper arguments start at index 2.
* NB. Unlike -setTarget: and -setSelector: the value of buffer must be * a pointer to the argument to be set in the invocation.
* If -retainArguments was called, then any object argument set in the * receiver is retained by it. */ - (void) setArgument: (void*)buffer atIndex: (NSInteger)index { if ((NSUInteger)index >= _numArgs) { [NSException raise: NSInvalidArgumentException format: @"bad invocation argument index"]; } if (index == 0) { [self setTarget: *(id*)buffer]; } else if (index == 1) { [self setSelector: *(SEL*)buffer]; } else { int i = index+1; /* Allow for return type in '_inf' */ const char *type = _inf[i].type; if (_argsRetained && (*type == _C_ID || *type == _C_CHARPTR)) { if (*type == _C_ID) { id old; _get_arg(self, index, &old); _set_arg(self, index, buffer); IF_NO_ARC(RETAIN(*(id*)buffer);) if (old != nil) { RELEASE(old); } } else { char *oldstr; char *newstr = *(char**)buffer; _get_arg(self, index, &oldstr); if (newstr == 0) { _set_arg(self, index, buffer); } else { int len; char *tmp; len = strlen(newstr); tmp = NSZoneMalloc(NSDefaultMallocZone(), len + 1); strncpy(tmp, newstr, len); tmp[len] = '\0'; _set_arg(self, index, tmp); } if (oldstr != 0) { NSZoneFree(NSDefaultMallocZone(), oldstr); } } } else { _set_arg(self, index, buffer); } } } /** * Sets the return value of the invocation to the item that buffer points to. */ - (void) setReturnValue: (void*)buffer { const char *type; type = _inf[0].type; CLEAR_RETURN_VALUE_IF_OBJECT; if (*type != _C_VOID) { memcpy(_retval, buffer, _inf[0].size); } RETAIN_RETURN_VALUE; _validReturn = YES; } /** * Sets the selector for the invocation. */ - (void) setSelector: (SEL)aSelector { _selector = aSelector; } /** * Sets the target object for the invocation.
* If -retainArguments was called, then the target is retained. */ - (void) setTarget: (id)anObject { if (_targetRetained) { ASSIGN(_target, anObject); } else { _target = anObject; } } /** * Returns the target object of the invocation. */ - (id) target { return _target; } /** * Returns a flag to indicate whether object arguments of the invocation * (including its target) are retained by the invocation. */ - (BOOL) argumentsRetained { return _argsRetained; } /** * Instructs the invocation to retain its object arguments (including the * target). The default is not to retain them. */ - (void) retainArguments { [self retainArgumentsIncludingTarget: YES]; } /** * Returns YES if target has been retained yet, NO otherwise. */ - (BOOL) targetRetained { return _targetRetained; } /** * Similar to -[NSInvocation retainArguments], but allows the sender to * explicitly control whether the target is retained as well. Retaining * the target is sometimes not desirable (such as in NSUndoManager), as * retain loops could result. */ - (void) retainArgumentsIncludingTarget: (BOOL)retainTargetFlag { if (_argsRetained == NO) { unsigned int i; _argsRetained = YES; if (_cframe == 0) { return; } for (i = 3; i <= _numArgs; i++) { if (*_inf[i].type == _C_ID) { id old; _get_arg(self, i-1, &old); if (old != nil) { IF_NO_ARC(RETAIN(old);) } } else if (*_inf[i].type == _C_CHARPTR) { char *str; _get_arg(self, i-1, &str); if (str != 0) { char *tmp; int len; len = strlen(str); tmp = NSZoneMalloc(NSDefaultMallocZone(), len + 1); strncpy(tmp, str, len); tmp[len] = '\0'; _set_arg(self, i-1, &tmp); } } } } if (retainTargetFlag && _targetRetained == NO) { _targetRetained = YES; IF_NO_ARC(RETAIN(_target);) } } /** * Sends the message encapsulated in the invocation to its target. */ - (void) invoke { [self invokeWithTarget: _target]; } /** * Sends the message encapsulated in the invocation to anObject. */ - (void) invokeWithTarget: (id)anObject { [self subclassResponsibility: _cmd]; } /** * Returns the method signature of the invocation. */ - (NSMethodSignature*) methodSignature { return _sig; } - (NSString*) description { /* * Don't use -[NSString stringWithFormat:] method because it can cause * infinite recursion. */ char buffer[1024]; snprintf (buffer, 1024, "<%s %p selector: %s target: %s>", \ GSClassNameFromObject(self), \ self, \ _selector ? sel_getName(_selector) : "nil", \ _target ? class_getName([_target class]) : "nil" \ ); return [NSString stringWithUTF8String: buffer]; } - (void) encodeWithCoder: (NSCoder*)aCoder { const char *types = [_sig methodType]; unsigned int i; [aCoder encodeValueOfObjCType: @encode(char*) at: &types]; [aCoder encodeObject: _target]; [aCoder encodeValueOfObjCType: _inf[2].type at: &_selector]; for (i = 3; i <= _numArgs; i++) { const char *type = _inf[i].type; void *datum; datum = _arg_addr(self, i-1); if (*type == _C_ID) { [aCoder encodeObject: *(id*)datum]; } else { [aCoder encodeValueOfObjCType: type at: datum]; } } if (*_inf[0].type != _C_VOID) { [aCoder encodeValueOfObjCType: @encode(BOOL) at: &_validReturn]; if (_validReturn) { [aCoder encodeValueOfObjCType: _inf[0].type at: _retval]; } } } - (id) initWithCoder: (NSCoder*)aCoder { NSMethodSignature *newSig; const char *types; void *datum; unsigned int i; [aCoder decodeValueOfObjCType: @encode(char*) at: &types]; newSig = [NSMethodSignature signatureWithObjCTypes: types]; NSZoneFree(NSDefaultMallocZone(), (void*)types); DESTROY(self); self = RETAIN([NSInvocation invocationWithMethodSignature: newSig]); [aCoder decodeValueOfObjCType: @encode(id) at: &_target]; [aCoder decodeValueOfObjCType: @encode(SEL) at: &_selector]; for (i = 3; i <= _numArgs; i++) { datum = _arg_addr(self, i-1); [aCoder decodeValueOfObjCType: _inf[i].type at: datum]; } _argsRetained = YES; if (*_inf[0].type != _C_VOID) { [aCoder decodeValueOfObjCType: @encode(BOOL) at: &_validReturn]; if (_validReturn) { [aCoder decodeValueOfObjCType: _inf[0].type at: _retval]; } } return self; } @end /** * Provides some minor extensions and some utility methods to aid * integration of NSInvocation with the Objective-C runtime. */ @implementation NSInvocation (GNUstep) - (BOOL) sendsToSuper { return _sendToSuper; } - (void) setSendsToSuper: (BOOL)flag { _sendToSuper = flag; } @end /** * These methods are for internal use only ... not public API
* They are used by the NS_INVOCATION() and NS_MESSAGE() macros to help * create invocations. */ @implementation NSInvocation (MacroSetup) /** * Initialised an invocation instance which can be used to send messages to * a target object using aSignature.
* You must set the target and selector (using -setTarget: and -setSelector:) * before you attempt to use the invocation.
* Raises an NSInvalidArgumentException if aSignature is nil. */ - (id) initWithMethodSignature: (NSMethodSignature*)aSignature { [self subclassResponsibility: _cmd]; return nil; } /** * Internal use. */ + (id) _newProxyForInvocation: (id)target { return (id)[GSInvocationProxy _newWithTarget: target]; } + (id) _newProxyForMessage: (id)target { return (id)[GSMessageProxy _newWithTarget: target]; } + (NSInvocation*) _returnInvocationAndDestroyProxy: (id)proxy { NSInvocation *inv = [proxy _invocation]; NSDeallocateObject(proxy); return inv; } @end @implementation NSInvocation (BackwardCompatibility) - (void) invokeWithObject: (id)obj { [self invokeWithTarget: (id)obj]; } @end #if !defined(USE_FFCALL) && !defined(USE_LIBFFI) #warning Using dummy NSInvocation implementation. It is strongly recommended that you use libffi. @implementation GSDummyInvocation /* * This is the de_signated initialiser. */ - (id) initWithMethodSignature: (NSMethodSignature*)aSignature { return self; } - (void) invokeWithTarget: (id)anObject { CLEAR_RETURN_VALUE_IF_OBJECT; _validReturn = NO; /* * A message to a nil object returns nil. */ if (anObject == nil) { _validReturn = YES; return; } } @end #endif @implementation GSInvocationProxy + (id) _newWithTarget: (id)t { GSInvocationProxy *o; o = (GSInvocationProxy*) NSAllocateObject(self, 0, NSDefaultMallocZone()); o->target = RETAIN(t); return o; } - (NSInvocation*) _invocation { return invocation; } - (void) forwardInvocation: (NSInvocation*)anInvocation { invocation = anInvocation; } - (NSMethodSignature*) methodSignatureForSelector: (SEL)aSelector { return [target methodSignatureForSelector: aSelector]; } @end @implementation GSMessageProxy - (NSInvocation*) _invocation { [invocation setTarget: target]; return invocation; } @end gnustep-base-1.29.0/Source/NSInvocationOperation.m000066400000000000000000000065231435650067400220710ustar00rootroot00000000000000/**Implementation for NSInvocationOperation for GNUStep Copyright (C) 2013 Free Software Foundation, Inc. Written by: Graham Lee Date: 2013 This file is part of the GNUstep Base Library. 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 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 USA. NSInvocationOperation class reference $Date$ $Revision$ */ #import "common.h" #import "Foundation/NSInvocationOperation.h" #import "Foundation/NSException.h" #import "Foundation/NSInvocation.h" #import "Foundation/NSMethodSignature.h" #import "Foundation/NSValue.h" #import "GNUstepBase/GSObjCRuntime.h" @implementation NSInvocationOperation - (id) initWithInvocation: (NSInvocation *)inv { if (((self = [super init])) != nil) { [inv retainArguments]; _invocation = RETAIN(inv); } return self; } - (id) initWithTarget: (id)target selector: (SEL)aSelector object: (id)arg { NSMethodSignature *methodSignature; NSInvocation *inv; methodSignature = [target methodSignatureForSelector: aSelector]; inv = [NSInvocation invocationWithMethodSignature: methodSignature]; [inv setTarget: target]; [inv setSelector: aSelector]; if ([methodSignature numberOfArguments] > 2) { [inv setArgument: &arg atIndex: 2]; } return [self initWithInvocation: inv]; } - (void) main { if (![self isCancelled]) { NS_DURING { [_invocation invoke]; } NS_HANDLER { ASSIGN(_exception, localException); } NS_ENDHANDLER } } - (NSInvocation *) invocation { return AUTORELEASE(RETAIN(_invocation)); } - (id) result { id result = nil; if (![self isFinished]) { return nil; } if (nil != _exception) { [_exception raise]; } else if ([self isCancelled]) { [NSException raise: (id)NSInvocationOperationCancelledException format: @"*** %s: operation was cancelled", __PRETTY_FUNCTION__]; } else { const char *returnType = [[_invocation methodSignature] methodReturnType]; if (0 == strncmp(@encode(void), GSSkipTypeQualifierAndLayoutInfo(returnType), 1)) { [NSException raise: (id)NSInvocationOperationVoidResultException format: @"*** %s: void result", __PRETTY_FUNCTION__]; } else if (0 == strncmp(@encode(id), GSSkipTypeQualifierAndLayoutInfo(returnType), 1)) { [_invocation getReturnValue: &result]; } else { unsigned char *buffer = malloc([[_invocation methodSignature] methodReturnLength]); [_invocation getReturnValue: buffer]; result = [NSValue valueWithBytes: buffer objCType: returnType]; } } return result; } - (void) dealloc { DESTROY(_invocation); DESTROY(_exception); [super dealloc]; } @end gnustep-base-1.29.0/Source/NSItemProvider.m000066400000000000000000000112541435650067400205050ustar00rootroot00000000000000/* Implementation of class NSItemProvider Copyright (C) 2019 Free Software Foundation, Inc. By: heron Date: Sun Nov 10 04:00:17 EST 2019 This file is part of the GNUstep Library. 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 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 USA. */ #include #include @implementation NSItemProvider - (instancetype) init { return nil; } - (void) registerDataRepresentationForTypeIdentifier: (NSString *)typeIdentifier visibility: (NSItemProviderRepresentationVisibility)visibility loadHandler: (GSProgressHandler)loadHandler { } - (void) registerFileRepresentationForTypeIdentifier: (NSString *)typeIdentifier fileOptions: (NSItemProviderFileOptions)fileOptions visibility: (NSItemProviderRepresentationVisibility)visibility loadHandler: (GSProgressURLBOOLHandler)loadHandler { } - (NSArray *) registeredTypeIdentifiers { return nil; } - (NSArray *) registeredTypeIdentifiersWithFileOptions: (NSItemProviderFileOptions)fileOptions { return nil; } - (BOOL) hasItemConformingToTypeIdentifier: (NSString *)typeIdentifier { return NO; } - (BOOL) hasRepresentationConformingToTypeIdentifier: (NSString *)typeIdentifier fileOptions: (NSItemProviderFileOptions)fileOptions { return NO; } - (NSProgress *) loadDataRepresentationForTypeIdentifier: (NSString *)typeIdentifier completionHandler: (GSProviderCompletionHandler)completionHandler { return nil; } - (NSProgress *) loadFileRepresentationForTypeIdentifier: (NSString *)typeIdentifier completionHandler: (GSProviderURLCompletionHandler)completionHandler { return nil; } - (NSProgress *) loadInPlaceFileRepresentationForTypeIdentifier: (NSString *)typeIdentifier completionHandler: (GSProviderURLBOOLCompletionHandler)completionHandler { return nil; } - (NSString *) suggestedName { return nil; } - (void) setSuggestedName: (NSString *)suggestedName { } - (instancetype) initWithObject: (id)object { return nil; } - (void) registerObject: (id)object visibility: (NSItemProviderRepresentationVisibility)visibility { } - (void) registerObjectOfClass: (Class)aClass // NSItemProviderWriting conforming class... visibility: (NSItemProviderRepresentationVisibility)visibility loadHandler: (GSItemProviderWritingHandler)loadHandler { } - (BOOL) canLoadObjectOfClass: (Class)aClass { return NO; } - (NSProgress *) loadObjectOfClass: (Class)aClass // NSItemProviderReading conforming class... completionHandler: (GSItemProviderReadingHandler)completionHandler { return nil; } - (instancetype) initWithItem: (id)item typeIdentifier: (NSString *)typeIdentifier // designated init { return nil; } - (instancetype) initWithContentsOfURL: (NSURL *)fileURL { return nil; } - (void) registerItemForTypeIdentifier: (NSString *)typeIdentifier loadHandler: (NSItemProviderLoadHandler)loadHandler { } - (void)loadItemForTypeIdentifier: (NSString *)typeIdentifier options: (NSDictionary *)options completionHandler: (NSItemProviderCompletionHandler)completionHandler { } - (instancetype) copyWithZone: (NSZone*)zone { return nil; } @end // Preview support @implementation NSItemProvider (NSPreviewSupport) - (NSItemProviderLoadHandler) previewImageHandler { return (NSItemProviderLoadHandler)0; } - (void) setPreviewImageHandler: (NSItemProviderLoadHandler) previewImageHandler { } - (void) loadPreviewImageWithOptions: (NSDictionary *)options completionHandler: (NSItemProviderCompletionHandler)completionHandler { } @end gnustep-base-1.29.0/Source/NSItemProviderReadingWriting.m000066400000000000000000000020461435650067400233420ustar00rootroot00000000000000/* Implementation of class NSItemProviderReadingWriting Copyright (C) 2019 Free Software Foundation, Inc. By: heron Date: Sun Nov 10 04:00:24 EST 2019 This file is part of the GNUstep Library. 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 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 USA. */ #include @implementation NSItemProviderReadingWriting @end gnustep-base-1.29.0/Source/NSJSONSerialization.m000066400000000000000000000710641435650067400214100ustar00rootroot00000000000000/** * NSJSONSerialization.m. This file provides an implementation of the JSON * reading and writing APIs introduced with OS X 10.7. * * The parser is implemented as a simple recursive parser. The JSON is * unambiguous, so this requires no read-ahead or backtracking. The source of * data for the parse can be either a static JSON string or some JSON data. */ #import "common.h" #import "Foundation/NSArray.h" #import "Foundation/NSByteOrder.h" #import "Foundation/NSCharacterSet.h" #import "Foundation/NSData.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSError.h" #import "Foundation/NSJSONSerialization.h" #import "Foundation/NSNull.h" #import "Foundation/NSStream.h" #import "Foundation/NSString.h" #import "Foundation/NSValue.h" #import "GSFastEnumeration.h" /* Boolean constants. */ static id boolN; static id boolY; /** * The number of (unicode) characters to fetch from the source at once. */ #define BUFFER_SIZE 64 /** * Structure for storing the internal state of the parser. An instance of this * is allocated on the stack, and a copy of it passed down to each parse * function. */ typedef struct ParserStateStruct { /** * The data source. This is either an NSString or an NSStream, depending on * the source. */ id source; /** * The length of the byte order mark in the source. 0 if there is no BOM. */ int BOMLength; /** * The string encoding used in the source. */ NSStringEncoding enc; /** * Function used to pull the next BUFFER_SIZE characters from the string. */ void (*updateBuffer)(struct ParserStateStruct*); /** * Buffer used to store the next data from the input stream. */ unichar buffer[BUFFER_SIZE]; /** * The index of the parser within the buffer. */ NSUInteger bufferIndex; /** * The number of bytes stored within the buffer. */ NSUInteger bufferLength; /** * The index of the parser within the source. */ NSInteger sourceIndex; /** * Should the parser construct mutable string objects? */ BOOL mutableStrings; /** * Should the parser construct mutable containers? */ BOOL mutableContainers; /** * Error value, if this parser is currently in an error state, nil otherwise. */ NSError *error; } ParserState; /** * Pulls the next group of characters from a string source. */ static inline void updateStringBuffer(ParserState* state) { NSRange r = {state->sourceIndex, BUFFER_SIZE}; NSUInteger end = [state->source length]; if (end - state->sourceIndex < BUFFER_SIZE) { r.length = end - state->sourceIndex; } [state->source getCharacters: state->buffer range: r]; state->sourceIndex = r.location; state->bufferIndex = 0; state->bufferLength = r.length; if (r.length == 0) { state->buffer[0] = 0; } } static inline void updateStreamBuffer(ParserState* state) { NSInputStream *stream = state->source; uint8_t *buffer; NSUInteger length; NSString *str; // Discard anything that we've already consumed while (state->sourceIndex > 0) { uint8_t discard[128]; NSUInteger toRead = 128; NSInteger amountRead; if (state->sourceIndex < 128) { toRead = state->sourceIndex; } amountRead = [stream read: discard maxLength: toRead]; /* If something goes wrong with the stream, return the stream * error as our error. */ if (amountRead == 0) { state->error = [stream streamError]; state->bufferIndex = 0; state->bufferLength = 0; state->buffer[0] = 0; } state->sourceIndex -= amountRead; } /* Get the temporary buffer. We need to read from here so that we can read * characters from the stream without advancing the stream position. * If the stream doesn't do buffering, then we need to get data one character * at a time. */ if (![stream getBuffer: &buffer length: &length]) { uint8_t bytes[7] = { 0 }; switch (state->enc) { case NSUTF8StringEncoding: { // Read one UTF8 character from the stream NSUInteger i = 0; NSInteger n; n = [stream read: &bytes[0] maxLength: 1]; if (n != 1) { state->error = [stream streamError]; if (state->error == nil) { state->error = [NSError errorWithDomain: NSCocoaErrorDomain code: 0 userInfo: nil]; } break; } else { if ((bytes[0] & 0xC0) == 0xC0) { for (i = 1; i <= 5; i++) if ((bytes[0] & (0x40 >> i)) == 0) break; } } if (0 == i) { state->buffer[0] = bytes[0]; } else { n = [stream read: &bytes[1] maxLength: i]; if (n == i) { str = [[NSString alloc] initWithUTF8String: (char*)bytes]; [str getCharacters: state->buffer range: NSMakeRange(0,1)]; [str release]; } else { state->error = [stream streamError]; if (state->error == nil) { state->error = [NSError errorWithDomain: NSCocoaErrorDomain code: 0 userInfo: nil]; } break; } } break; } case NSUTF32LittleEndianStringEncoding: { [stream read: bytes maxLength: 4]; state->buffer[0] = (unichar)NSSwapLittleIntToHost (*(unsigned int*)(void*)bytes); break; } case NSUTF32BigEndianStringEncoding: { [stream read: bytes maxLength: 4]; state->buffer[0] = (unichar)NSSwapBigIntToHost (*(unsigned int*)(void*)bytes); break; } case NSUTF16LittleEndianStringEncoding: { [stream read: bytes maxLength: 2]; state->buffer[0] = (unichar)NSSwapLittleShortToHost (*(unsigned short*)(void*)bytes); break; } case NSUTF16BigEndianStringEncoding: { [stream read: bytes maxLength: 4]; state->buffer[0] = (unichar)NSSwapBigShortToHost (*(unsigned short*)(void*)bytes); break; } default: GS_UNREACHABLE(); } // Set the source index to -1 so it will be 0 when we've finished with it state->sourceIndex = -1; state->bufferIndex = 0; state->bufferLength = 1; return; } // Use an NSString to do the character set conversion. We could do this more // efficiently. We could also reuse the string. str = [[NSString alloc] initWithBytesNoCopy: buffer length: length encoding: state->enc freeWhenDone: NO]; // Just use the string buffer fetch function to actually get the data state->source = str; updateStringBuffer(state); state->source = stream; } /** * Returns the current character. */ static inline unichar currentChar(ParserState *state) { if (state->bufferIndex >= state->bufferLength) { state->updateBuffer(state); } return state->buffer[state->bufferIndex]; } /** * Consumes a character. */ static inline unichar consumeChar(ParserState *state) { state->sourceIndex++; state->bufferIndex++; if (state->bufferIndex >= state->bufferLength) { state->updateBuffer(state); } return currentChar(state); } /** * Consumes all whitespace characters and returns the first non-space * character. Returns 0 if we're past the end of the input. */ static inline unichar consumeSpace(ParserState *state) { while (isspace(currentChar(state))) { consumeChar(state); } return currentChar(state); } /** * Sets an error state. */ static void parseError(ParserState *state) { /* TODO: Work out what stuff should go in this and probably add them to * parameters for this function. */ NSDictionary *userInfo = [[NSDictionary alloc] initWithObjectsAndKeys: _(@"JSON Parse error"), NSLocalizedDescriptionKey, _(([NSString stringWithFormat: @"Unexpected character %c at index %"PRIdPTR, (char)currentChar(state), state->sourceIndex])), NSLocalizedFailureReasonErrorKey, nil]; state->error = [NSError errorWithDomain: NSCocoaErrorDomain code: 0 userInfo: userInfo]; [userInfo release]; } NS_RETURNS_RETAINED static id parseValue(ParserState *state); /** * Parse a string, as defined by RFC4627, section 2.5 */ NS_RETURNS_RETAINED static NSString* parseString(ParserState *state) { NSMutableString *val = nil; unichar buffer[BUFFER_SIZE]; int bufferIndex = 0; unichar next; if (state->error) { return nil; } if (currentChar(state) != '"') { parseError(state); return nil; } next = consumeChar(state); while ((next != 0) && (next != '"')) { // Unexpected end of stream if (next == '\\') { next = consumeChar(state); switch (next) { // Simple escapes, just ignore the leading ' case '"': case '\\': case '/': break; // Map to the unicode values specified in RFC4627 case 'b': next = 0x0008; break; case 'f': next = 0x000c; break; case 'n': next = 0x000a; break; case 'r': next = 0x000d; break; case 't': next = 0x0009; break; // decode a unicode value from 4 hex digits case 'u': { char hex[5] = {0}; unsigned i; for (i = 0 ; i < 4 ; i++) { next = consumeChar(state); if (!isxdigit(next)) { [val release]; parseError(state); return nil; } hex[i] = next; } // Parse 4 hex digits and a NULL terminator into a 16-bit // unicode character ID. next = (unichar)strtol(hex, 0, 16); } } } buffer[bufferIndex++] = next; if (bufferIndex >= BUFFER_SIZE) { NSMutableString *str; str = [[NSMutableString alloc] initWithCharacters: buffer length: bufferIndex]; bufferIndex = 0; if (nil == val) { val = str; } else { [val appendString: str]; [str release]; } } next = consumeChar(state); } if (currentChar(state) != '"') { [val release]; parseError(state); return nil; } if (bufferIndex > 0) { NSMutableString *str; str = [[NSMutableString alloc] initWithCharacters: buffer length: bufferIndex]; if (nil == val) { val = str; } else { [val appendString: str]; [str release]; } } else if (nil == val) { val = [NSMutableString new]; } if (!state->mutableStrings) { if (NO == [val makeImmutable]) { val = [val copy]; } } // Consume the trailing " consumeChar(state); return val; } /** * Parses a number, as defined by section 2.4 of the JSON specification. */ NS_RETURNS_RETAINED static NSNumber* parseNumber(ParserState *state) { unichar c = currentChar(state); char numberBuffer[128]; char *number = numberBuffer; int bufferSize = 128; int parsedSize = 0; double num; // Define a macro to add a character to the buffer, because we'll need to do // it a lot. This resizes the buffer if required. #define BUFFER(x) do {\ if (parsedSize == bufferSize)\ {\ bufferSize *= 2;\ if (number == numberBuffer)\ {\ number = malloc(bufferSize);\ memcpy(number, numberBuffer, sizeof(numberBuffer));\ }\ else\ {\ number = realloc(number, bufferSize);\ }\ }\ number[parsedSize++] = (char)x; } while (0) // JSON numbers must start with a - or a digit if (!(c == '-' || isdigit(c))) { parseError(state); return nil; } // digit or - BUFFER(c); // Read as many digits as we see while (isdigit(c = consumeChar(state))) { BUFFER(c); } // Parse the fractional component, if there is one if ('.' == c) { BUFFER(c); while (isdigit(c = consumeChar(state))) { BUFFER(c); } } // parse the exponent if there is one if ('e' == tolower(c)) { BUFFER(c); c = consumeChar(state); // The exponent must be a valid number if (!(c == '-' || c == '+' || isdigit(c))) { if (number != numberBuffer) { free(number); number = numberBuffer; } parseError(state); return nil; } BUFFER(c); while (isdigit(c = consumeChar(state))) { BUFFER(c); } } // Add a null terminator on the buffer. BUFFER(0); num = strtod(number, 0); if (number != numberBuffer) { free(number); } return [[NSNumber alloc] initWithDouble: num]; #undef BUFFER } /** * Parse an array, as described by section 2.3 of RFC 4627. */ NS_RETURNS_RETAINED static NSArray* parseArray(ParserState *state) { unichar c = consumeSpace(state); NSMutableArray *array; if (c != '[') { parseError(state); return nil; } // Eat the [ consumeChar(state); array = [NSMutableArray new]; c = consumeSpace(state); while (c != ']') { // If this fails, it will already set the error, so we don't have to. id obj = parseValue(state); if (nil == obj) { [array release]; return nil; } [array addObject: obj]; [obj release]; c = consumeSpace(state); if (c == ',') { consumeChar(state); c = consumeSpace(state); } } // Eat the trailing ] consumeChar(state); if (!state->mutableContainers) { if (NO == [array makeImmutable]) { id a = array; array = [array copy]; RELEASE(a); } } return array; } NS_RETURNS_RETAINED static NSDictionary* parseObject(ParserState *state) { unichar c = consumeSpace(state); NSMutableDictionary *dict; if (c != '{') { parseError(state); return nil; } // Eat the { consumeChar(state); dict = [NSMutableDictionary new]; c = consumeSpace(state); while (c != '}') { id key = parseString(state); id obj; if (nil == key) { [dict release]; return nil; } c = consumeSpace(state); if (':' != c) { [key release]; [dict release]; parseError(state); return nil; } // Eat the : consumeChar(state); obj = parseValue(state); if (nil == obj) { [key release]; [dict release]; return nil; } [dict setObject: obj forKey: key]; [key release]; [obj release]; c = consumeSpace(state); if (c == ',') { consumeChar(state); } c = consumeSpace(state); } // Eat the trailing } consumeChar(state); if (!state->mutableContainers) { if (NO == [dict makeImmutable]) { id d = dict; dict = [dict copy]; RELEASE(d); } } return dict; } /** * Parses a JSON value, as defined by RFC4627, section 2.1. */ NS_RETURNS_RETAINED static id parseValue(ParserState *state) { unichar c; if (state->error) { return nil; }; c = consumeSpace(state); /* 2.1: A JSON value MUST be an object, array, number, or string, * or one of the following three literal names: * false null true */ switch (c) { case (unichar)'"': return parseString(state); case (unichar)'[': return parseArray(state); case (unichar)'{': return parseObject(state); case (unichar)'-': case (unichar)'0' ... (unichar)'9': return parseNumber(state); // Literal null case 'n': { if ((consumeChar(state) == 'u') && (consumeChar(state) == 'l') && (consumeChar(state) == 'l')) { consumeChar(state); return [[NSNull null] retain]; } break; } // literal case 't': { if ((consumeChar(state) == 'r') && (consumeChar(state) == 'u') && (consumeChar(state) == 'e')) { consumeChar(state); return [boolY retain]; } break; } case 'f': { if ((consumeChar(state) == 'a') && (consumeChar(state) == 'l') && (consumeChar(state) == 's') && (consumeChar(state) == 'e')) { consumeChar(state); return [boolN retain]; } break; } } parseError(state); return nil; } /** * We have to autodetect the string encoding. We know that it is some * unicode encoding, which may or may not contain a BOM. If it contains a * BOM, then we need to skip that. If it doesn't, then we need to work out * the encoding from the position of the NULLs. The first two characters are * guaranteed to be ASCII in a JSON stream, so we can work out the encoding * from the pattern of NULLs. */ static void getEncoding(const uint8_t BOM[4], ParserState *state) { NSStringEncoding enc = NSUTF8StringEncoding; int BOMLength = 0; if ((BOM[0] == 0xEF) && (BOM[1] == 0xBB) && (BOM[2] == 0xBF)) { BOMLength = 3; } else if ((BOM[0] == 0xFE) && (BOM[1] == 0xFF)) { BOMLength = 2; enc = NSUTF16BigEndianStringEncoding; } else if ((BOM[0] == 0xFF) && (BOM[1] == 0xFE)) { if ((BOM[2] == 0) && (BOM[3] == 0)) { BOMLength = 4; enc = NSUTF32LittleEndianStringEncoding; } else { BOMLength = 2; enc = NSUTF16LittleEndianStringEncoding; } } else if ((BOM[0] == 0) && (BOM[1] == 0) && (BOM[2] == 0xFE) && (BOM[3] == 0xFF)) { BOMLength = 4; enc = NSUTF32BigEndianStringEncoding; } else if (BOM[0] == 0) { // TODO: Throw an error if this doesn't match one of the patterns // described in section 3 of RFC4627 if (BOM[1] == 0) { enc = NSUTF32BigEndianStringEncoding; } else { enc = NSUTF16BigEndianStringEncoding; } } else if (BOM[1] == 0) { if (BOM[2] == 0) { enc = NSUTF32LittleEndianStringEncoding; } else { enc = NSUTF16LittleEndianStringEncoding; } } state->enc = enc; state->BOMLength = BOMLength; } /** * Classes that are permitted to be written. */ static Class NSArrayClass; static Class NSDictionaryClass; static Class NSNullClass; static Class NSNumberClass; static Class NSStringClass; static NSMutableCharacterSet *escapeSet; static inline void writeTabs(NSMutableString *output, NSInteger tabs) { NSInteger i; for (i = 0 ; i < tabs ; i++) { [output appendString: @"\t"]; } } static inline void writeNewline(NSMutableString *output, NSInteger tabs) { if (tabs >= 0) { [output appendString: @"\n"]; } } static BOOL writeObject(id obj, NSMutableString *output, NSInteger tabs) { if ([obj isKindOfClass: NSArrayClass]) { BOOL writeComma = NO; [output appendString: @"["]; FOR_IN(id, o, obj) if (writeComma) { [output appendString: @","]; } writeComma = YES; writeNewline(output, tabs); writeTabs(output, tabs); writeObject(o, output, tabs + 1); END_FOR_IN(obj) writeNewline(output, tabs); writeTabs(output, tabs); [output appendString: @"]"]; } else if ([obj isKindOfClass: NSDictionaryClass]) { BOOL writeComma = NO; [output appendString: @"{"]; FOR_IN(id, o, obj) // Keys in dictionaries must be strings if (![o isKindOfClass: NSStringClass]) { return NO; } if (writeComma) { [output appendString: @","]; } writeComma = YES; writeNewline(output, tabs); writeTabs(output, tabs); writeObject(o, output, tabs + 1); [output appendString: @": "]; writeObject([obj objectForKey: o], output, tabs + 1); END_FOR_IN(obj) writeNewline(output, tabs); writeTabs(output, tabs); [output appendString: @"}"]; } else if ([obj isKindOfClass: NSStringClass]) { NSString *str = (NSString*)obj; unsigned length = [str length]; if (length == 0) { [output appendString: @"\"\""]; } else { unsigned size = 2; unichar *from; unsigned i = 0; unichar *to; unsigned j = 0; from = NSZoneMalloc (NSDefaultMallocZone(), sizeof(unichar) * length); [str getCharacters: from]; for (i = 0; i < length; i++) { unichar c = from[i]; if (c == '"' || c == '\\' || c == '\b' || c == '\f' || c == '\n' || c == '\r' || c == '\t') { size += 2; } else if (c < 0x20 || c > 0x7f) { size += 6; } else { size++; } } to = NSZoneMalloc (NSDefaultMallocZone(), sizeof(unichar) * size); to[j++] = '"'; for (i = 0; i < length; i++) { unichar c = from[i]; if (c == '"' || c == '\\' || c == '\b' || c == '\f' || c == '\n' || c == '\r' || c == '\t') { to[j++] = '\\'; switch (c) { case '\\': to[j++] = '\\'; break; case '\b': to[j++] = 'b'; break; case '\f': to[j++] = 'f'; break; case '\n': to[j++] = 'n'; break; case '\r': to[j++] = 'r'; break; case '\t': to[j++] = 't'; break; default: to[j++] = '"'; break; } } else if (c < 0x20 || c > 0x7f) { char buf[5]; to[j++] = '\\'; to[j++] = 'u'; sprintf(buf, "%04x", c); to[j++] = buf[0]; to[j++] = buf[1]; to[j++] = buf[2]; to[j++] = buf[3]; } else { to[j++] = c; } } to[j] = '"'; str = [[NSStringClass alloc] initWithCharacters: to length: size]; NSZoneFree (NSDefaultMallocZone (), to); NSZoneFree (NSDefaultMallocZone (), from); [output appendString: str]; [str release]; } } else if (obj == boolN) { [output appendString: @"false"]; } else if (obj == boolY) { [output appendString: @"true"]; } else if ([obj isKindOfClass: NSNumberClass]) { const char *t = [obj objCType]; if (strchr("csilq", *t) != 0) { long long i = [(NSNumber*)obj longLongValue]; [output appendFormat: @"%lld", i]; } else if (strchr("CSILQ", *t) != 0) { unsigned long long u = [(NSNumber *)obj unsignedLongLongValue]; [output appendFormat: @"%llu", u]; } else { [output appendFormat: @"%.17g", [(NSNumber*)obj doubleValue]]; } } else if ([obj isKindOfClass: NSNullClass]) { [output appendString: @"null"]; } else { return NO; } return YES; } @implementation NSJSONSerialization + (void) initialize { static BOOL beenHere = NO; if (NO == beenHere) { NSNullClass = [NSNull class]; NSArrayClass = [NSArray class]; NSStringClass = [NSString class]; NSDictionaryClass = [NSDictionary class]; NSNumberClass = [NSNumber class]; escapeSet = [NSMutableCharacterSet new]; [[NSObject leakAt: &escapeSet] release]; [escapeSet addCharactersInString: @"\"\\"]; boolN = [[NSNumber alloc] initWithBool: NO]; [[NSObject leakAt: &boolN] release]; boolY = [[NSNumber alloc] initWithBool: YES]; [[NSObject leakAt: &boolY] release]; beenHere = YES; } } + (NSData*) dataWithJSONObject: (id)obj options: (NSJSONWritingOptions)opt error: (NSError **)error { /* Temporary string: allocate more space than we are likely to use so we just * quickly claim a page and then give it back later */ NSMutableString *str = [[NSMutableString alloc] initWithCapacity: 4096]; NSData *data = nil; NSUInteger tabs; tabs = ((opt & NSJSONWritingPrettyPrinted) == NSJSONWritingPrettyPrinted) ? 0 : NSIntegerMin; if (writeObject(obj, str, tabs)) { data = [str dataUsingEncoding: NSUTF8StringEncoding]; if (NULL != error) { *error = nil; } } else { if (NULL != error) { NSDictionary *userInfo = [[NSDictionary alloc] initWithObjectsAndKeys: _(@"JSON writing error"), NSLocalizedDescriptionKey, nil]; *error = [NSError errorWithDomain: NSCocoaErrorDomain code: 0 userInfo: userInfo]; } } [str release]; return data; } + (BOOL) isValidJSONObject: (id)obj { return writeObject(obj, nil, NSIntegerMin); } + (id) JSONObjectWithData: (NSData *)data options: (NSJSONReadingOptions)opt error: (NSError **)error { uint8_t BOM[4]; ParserState p = { 0 }; id obj; [data getBytes: BOM length: 4]; getEncoding(BOM, &p); p.source = [[NSString alloc] initWithData: data encoding: p.enc]; p.updateBuffer = updateStringBuffer; p.mutableContainers = (opt & NSJSONReadingMutableContainers) == NSJSONReadingMutableContainers; p.mutableStrings = (opt & NSJSONReadingMutableLeaves) == NSJSONReadingMutableLeaves; obj = parseValue(&p); [p.source release]; if (NULL != error) { *error = p.error; } return [obj autorelease]; } + (id) JSONObjectWithStream: (NSInputStream *)stream options: (NSJSONReadingOptions)opt error: (NSError **)error { uint8_t BOM[4]; ParserState p = { 0 }; id obj; // TODO: Handle failure here! [stream read: (uint8_t*)BOM maxLength: 4]; getEncoding(BOM, &p); p.mutableContainers = (opt & NSJSONReadingMutableContainers) == NSJSONReadingMutableContainers; p.mutableStrings = (opt & NSJSONReadingMutableLeaves) == NSJSONReadingMutableLeaves; if (p.BOMLength < 4) { p.source = [[NSString alloc] initWithBytesNoCopy: &BOM[p.BOMLength] length: 4 - p.BOMLength encoding: p.enc freeWhenDone: NO]; updateStringBuffer(&p); /* Negative source index because we are before the * current point in the buffer */ p.sourceIndex = p.BOMLength - 4; } p.source = stream; p.updateBuffer = updateStreamBuffer; obj = parseValue(&p); // Consume any data in the stream that we've failed to read updateStreamBuffer(&p); if (NULL != error) { *error = p.error; } return [obj autorelease]; } + (NSInteger) writeJSONObject: (id)obj toStream: (NSOutputStream *)stream options: (NSJSONWritingOptions)opt error: (NSError **)error { NSData *data = [self dataWithJSONObject: obj options: opt error: error]; if (nil != data) { const char *bytes = [data bytes]; NSUInteger toWrite = [data length]; while (toWrite > 0) { NSInteger wrote = [stream write: (uint8_t*)bytes maxLength: toWrite]; bytes += wrote; toWrite -= wrote; if (0 == wrote) { if (NULL != error) { *error = [stream streamError]; } return 0; } } } return [data length]; } @end gnustep-base-1.29.0/Source/NSKeyValueCoding.m000066400000000000000000000547241435650067400207560ustar00rootroot00000000000000/** Implementation of KeyValueCoding for GNUStep Copyright (C) 2000,2002 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald This file is part of the GNUstep Base Library. 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 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 USA. NSKeyValueCoding informal protocol reference $Date$ $Revision$ */ #import "common.h" #import "Foundation/NSArray.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSException.h" #import "Foundation/NSKeyValueCoding.h" #import "Foundation/NSMethodSignature.h" #import "Foundation/NSNull.h" #import "Foundation/NSSet.h" #import "Foundation/NSValue.h" /* For the NSKeyValueMutableArray and NSKeyValueMutableSet classes */ #include "NSKeyValueMutableArray.m" #include "NSKeyValueMutableSet.m" /* this should move into autoconf once it's accepted */ #define WANT_DEPRECATED_KVC_COMPAT 1 #ifdef WANT_DEPRECATED_KVC_COMPAT static IMP takePath = 0; static IMP takeValue = 0; static IMP takePathKVO = 0; static IMP takeValueKVO = 0; static inline void setupCompat() { if (takePath == 0) { Class c = NSClassFromString(@"GSKVOBase"); takePathKVO = [c instanceMethodForSelector: @selector(takeValue:forKeyPath:)]; takePath = [NSObject instanceMethodForSelector: @selector(takeValue:forKeyPath:)]; takeValueKVO = [c instanceMethodForSelector: @selector(takeValue:forKey:)]; takeValue = [NSObject instanceMethodForSelector: @selector(takeValue:forKey:)]; } } #endif static void SetValueForKey(NSObject *self, id anObject, const char *key, unsigned size) { SEL sel = 0; const char *type = 0; int off = 0; if (size > 0) { const char *name; char buf[size + 6]; char lo; char hi; memcpy(buf, "_set", 4); memcpy(&buf[4], key, size); lo = buf[4]; hi = islower(lo) ? toupper(lo) : lo; buf[4] = hi; buf[size + 4] = ':'; buf[size + 5] = '\0'; name = &buf[1]; // setKey: type = NULL; sel = sel_getUid(name); if (sel == 0 || [self respondsToSelector: sel] == NO) { name = buf; // _setKey: sel = sel_getUid(name); if (sel == 0 || [self respondsToSelector: sel] == NO) { sel = 0; if ([[self class] accessInstanceVariablesDirectly] == YES) { buf[size + 4] = '\0'; buf[3] = '_'; buf[4] = lo; name = &buf[3]; // _key if (GSObjCFindVariable(self, name, &type, &size, &off) == NO) { buf[4] = hi; buf[3] = 's'; buf[2] = 'i'; buf[1] = '_'; name = &buf[1]; // _isKey if (GSObjCFindVariable(self, name, &type, &size, &off) == NO) { buf[4] = lo; name = &buf[4]; // key if (GSObjCFindVariable(self, name, &type, &size, &off) == NO) { buf[4] = hi; buf[3] = 's'; buf[2] = 'i'; name = &buf[2]; // isKey GSObjCFindVariable(self, name, &type, &size, &off); } } } } } else { GSOnceFLog(@"Key-value access using _setKey: is deprecated:"); } } } GSObjCSetVal(self, key, anObject, sel, type, size, off); } static id ValueForKey(NSObject *self, const char *key, unsigned size) { SEL sel = 0; int off = 0; const char *type = NULL; if (size > 0) { const char *name; char buf[size + 5]; char lo; char hi; memcpy(buf, "_get", 4); memcpy(&buf[4], key, size); buf[size + 4] = '\0'; lo = buf[4]; hi = islower(lo) ? toupper(lo) : lo; buf[4] = hi; name = &buf[1]; // getKey sel = sel_getUid(name); if (sel == 0 || [self respondsToSelector: sel] == NO) { buf[4] = lo; name = &buf[4]; // key sel = sel_getUid(name); if (sel == 0 || [self respondsToSelector: sel] == NO) { buf[4] = hi; buf[3] = 's'; buf[2] = 'i'; name = &buf[2]; // isKey sel = sel_getUid(name); if (sel == 0 || [self respondsToSelector: sel] == NO) { sel = 0; } } } if (sel == 0 && [[self class] accessInstanceVariablesDirectly] == YES) { buf[4] = hi; name = buf; // _getKey sel = sel_getUid(name); if (sel == 0 || [self respondsToSelector: sel] == NO) { buf[4] = lo; buf[3] = '_'; name = &buf[3]; // _key sel = sel_getUid(name); if (sel == 0 || [self respondsToSelector: sel] == NO) { sel = 0; } } if (sel == 0) { if (GSObjCFindVariable(self, name, &type, &size, &off) == NO) { buf[4] = hi; buf[3] = 's'; buf[2] = 'i'; buf[1] = '_'; name = &buf[1]; // _isKey if (!GSObjCFindVariable(self, name, &type, &size, &off)) { buf[4] = lo; name = &buf[4]; // key if (!GSObjCFindVariable(self, name, &type, &size, &off)) { buf[4] = hi; buf[3] = 's'; buf[2] = 'i'; name = &buf[2]; // isKey GSObjCFindVariable(self, name, &type, &size, &off); } } } } } } return GSObjCGetVal(self, key, sel, type, size, off); } @implementation NSObject(KeyValueCoding) + (BOOL) accessInstanceVariablesDirectly { return YES; } - (NSDictionary*) dictionaryWithValuesForKeys: (NSArray*)keys { NSMutableDictionary *dictionary; NSEnumerator *enumerator; id key; #ifdef WANT_DEPRECATED_KVC_COMPAT static IMP o = 0; /* Backward compatibility hack */ if (o == 0) { o = [NSObject instanceMethodForSelector: @selector(valuesForKeys:)]; } if ([self methodForSelector: @selector(valuesForKeys:)] != o) { return [self valuesForKeys: keys]; } #endif dictionary = [NSMutableDictionary dictionaryWithCapacity: [keys count]]; enumerator = [keys objectEnumerator]; while ((key = [enumerator nextObject]) != nil) { id value = [self valueForKey: key]; if (value == nil) { value = [NSNull null]; } [dictionary setObject: value forKey: key]; } return dictionary; } - (NSMutableSet*) mutableSetValueForKey: (NSString*)aKey { return [NSKeyValueMutableSet setForKey: aKey ofObject: self]; } - (NSMutableSet*) mutableSetValueForKeyPath: (NSString*)aKey { NSRange r = [aKey rangeOfString: @"." options: NSLiteralSearch]; if (r.length == 0) { return [self mutableSetValueForKey: aKey]; } else { NSString *key = [aKey substringToIndex: r.location]; NSString *path = [aKey substringFromIndex: NSMaxRange(r)]; return [[self valueForKey: key] mutableSetValueForKeyPath: path]; } } - (NSMutableArray*) mutableArrayValueForKey: (NSString*)aKey { return [NSKeyValueMutableArray arrayForKey: aKey ofObject: self]; } - (NSMutableArray*) mutableArrayValueForKeyPath: (NSString*)aKey { NSRange r = [aKey rangeOfString: @"." options: NSLiteralSearch]; if (r.length == 0) { return [self mutableArrayValueForKey: aKey]; } else { NSString *key = [aKey substringToIndex: r.location]; NSString *path = [aKey substringFromIndex: NSMaxRange(r)]; return [[self valueForKey: key] mutableArrayValueForKeyPath: path]; } } - (void) setNilValueForKey: (NSString*)aKey { #ifdef WANT_DEPRECATED_KVC_COMPAT static IMP o = 0; /* Backward compatibility hack */ if (o == 0) { o = [NSObject instanceMethodForSelector: @selector(unableToSetNilForKey:)]; } if ([self methodForSelector: @selector(unableToSetNilForKey:)] != o) { [self unableToSetNilForKey: aKey]; return; } #endif [NSException raise: NSInvalidArgumentException format: @"%@ -- %@ 0x%"PRIxPTR": Given nil value to set for key \"%@\"", NSStringFromSelector(_cmd), NSStringFromClass([self class]), (NSUInteger)self, aKey]; } - (void) setValue: (id)anObject forKey: (NSString*)aKey { unsigned size = [aKey length] * 8; char key[size + 1]; #ifdef WANT_DEPRECATED_KVC_COMPAT IMP o = [self methodForSelector: @selector(takeValue:forKey:)]; setupCompat(); if (o != takeValue && o != takeValueKVO) { (*o)(self, @selector(takeValue:forKey:), anObject, aKey); return; } #endif [aKey getCString: key maxLength: size + 1 encoding: NSUTF8StringEncoding]; size = strlen(key); SetValueForKey(self, anObject, key, size); } - (void) setValue: (id)anObject forKeyPath: (NSString*)aKey { NSRange r = [aKey rangeOfString: @"." options: NSLiteralSearch]; #ifdef WANT_DEPRECATED_KVC_COMPAT IMP o = [self methodForSelector: @selector(takeValue:forKeyPath:)]; setupCompat(); if (o != takePath && o != takePathKVO) { (*o)(self, @selector(takeValue:forKeyPath:), anObject, aKey); return; } #endif if (r.length == 0) { [self setValue: anObject forKey: aKey]; } else { NSString *key = [aKey substringToIndex: r.location]; NSString *path = [aKey substringFromIndex: NSMaxRange(r)]; [[self valueForKey: key] setValue: anObject forKeyPath: path]; } } - (void) setValue: (id)anObject forUndefinedKey: (NSString*)aKey { NSDictionary *dict; NSException *exp; #ifdef WANT_DEPRECATED_KVC_COMPAT static IMP o = 0; /* Backward compatibility hack */ if (o == 0) { o = [NSObject instanceMethodForSelector: @selector(handleTakeValue:forUnboundKey:)]; } if ([self methodForSelector: @selector(handleTakeValue:forUnboundKey:)] != o) { [self handleTakeValue: anObject forUnboundKey: aKey]; return; } #endif dict = [NSDictionary dictionaryWithObjectsAndKeys: (anObject ? (id)anObject : (id)@"(nil)"), @"NSTargetObjectUserInfoKey", (aKey ? (id)aKey : (id)@"(nil)"), @"NSUnknownUserInfoKey", nil]; exp = [NSException exceptionWithName: NSUndefinedKeyException reason: @"Unable to set value for undefined key" userInfo: dict]; [exp raise]; } - (void) setValuesForKeysWithDictionary: (NSDictionary*)aDictionary { NSEnumerator *enumerator; NSString *key; #ifdef WANT_DEPRECATED_KVC_COMPAT static IMP o = 0; /* Backward compatibility hack */ if (o == 0) { o = [NSObject instanceMethodForSelector: @selector(takeValuesFromDictionary:)]; } if ([self methodForSelector: @selector(takeValuesFromDictionary:)] != o) { [self takeValuesFromDictionary: aDictionary]; return; } #endif enumerator = [aDictionary keyEnumerator]; while ((key = [enumerator nextObject]) != nil) { [self setValue: [aDictionary objectForKey: key] forKey: key]; } } - (BOOL) validateValue: (id*)aValue forKey: (NSString*)aKey error: (NSError**)anError { unsigned size; if (aValue == 0 || (size = [aKey length] * 8) == 0) { [NSException raise: NSInvalidArgumentException format: @"nil argument"]; } else { char name[size + 16]; SEL sel; BOOL (*imp)(id,SEL,id*,id*); memcpy(name, "validate", 8); [aKey getCString: &name[8] maxLength: size + 1 encoding: NSUTF8StringEncoding]; size = strlen(&name[8]); memcpy(&name[size + 8], ":error:", 7); name[size + 15] = '\0'; if (islower(name[8])) { name[8] = toupper(name[8]); } sel = sel_getUid(name); if (sel != 0 && [self respondsToSelector: sel] == YES) { imp = (BOOL (*)(id,SEL,id*,id*))[self methodForSelector: sel]; return (*imp)(self, sel, aValue, anError); } } return YES; } - (BOOL) validateValue: (id*)aValue forKeyPath: (NSString*)aKey error: (NSError**)anError { NSRange r = [aKey rangeOfString: @"." options: NSLiteralSearch]; if (r.length == 0) { return [self validateValue: aValue forKey: aKey error: anError]; } else { NSString *key = [aKey substringToIndex: r.location]; NSString *path = [aKey substringFromIndex: NSMaxRange(r)]; return [[self valueForKey: key] validateValue: aValue forKeyPath: path error: anError]; } } - (id) valueForKey: (NSString*)aKey { unsigned size = [aKey length] * 8; char key[size + 1]; [aKey getCString: key maxLength: size + 1 encoding: NSUTF8StringEncoding]; size = strlen(key); return ValueForKey(self, key, size); } - (id) valueForKeyPath: (NSString*)aKey { NSRange r = [aKey rangeOfString: @"." options: NSLiteralSearch]; if (r.length == 0) { return [self valueForKey: aKey]; } else { NSString *key = [aKey substringToIndex: r.location]; NSString *path = [aKey substringFromIndex: NSMaxRange(r)]; return [[self valueForKey: key] valueForKeyPath: path]; } } - (id) valueForUndefinedKey: (NSString*)aKey { NSDictionary *dict; NSException *exp; NSString *reason; #ifdef WANT_DEPRECATED_KVC_COMPAT static IMP o = 0; /* Backward compatibility hack */ if (o == 0) { o = [NSObject instanceMethodForSelector: @selector(handleQueryWithUnboundKey:)]; } if ([self methodForSelector: @selector(handleQueryWithUnboundKey:)] != o) { return [self handleQueryWithUnboundKey: aKey]; } #endif dict = [NSDictionary dictionaryWithObjectsAndKeys: self, @"NSTargetObjectUserInfoKey", (aKey ? (id)aKey : (id)@"(nil)"), @"NSUnknownUserInfoKey", nil]; reason = [NSString stringWithFormat: @"Unable to find value for key \"%@\" of object %@ (%@)", aKey, self, [self class]]; exp = [NSException exceptionWithName: NSUndefinedKeyException reason: reason userInfo: dict]; [exp raise]; return nil; } #ifdef WANT_DEPRECATED_KVC_COMPAT + (BOOL) useStoredAccessor { return YES; } - (id) storedValueForKey: (NSString*)aKey { unsigned size; if ([[self class] useStoredAccessor] == NO) { return [self valueForKey: aKey]; } size = [aKey length] * 8; if (size > 0) { SEL sel = 0; const char *type = NULL; int off = 0; const char *name; char key[size + 1]; char buf[size + 5]; char lo; char hi; memcpy(buf, "_get", 4); [aKey getCString: key maxLength: size + 1 encoding: NSUTF8StringEncoding]; size = strlen(key); memcpy(&buf[4], key, size); buf[size + 4] = '\0'; lo = buf[4]; hi = islower(lo) ? toupper(lo) : lo; buf[4] = hi; name = buf; // _getKey sel = sel_getUid(name); if (sel == 0 || [self respondsToSelector: sel] == NO) { buf[3] = '_'; buf[4] = lo; name = &buf[3]; // _key sel = sel_getUid(name); if (sel == 0 || [self respondsToSelector: sel] == NO) { sel = 0; } } if (sel == 0) { if ([[self class] accessInstanceVariablesDirectly] == YES) { // _key if (GSObjCFindVariable(self, name, &type, &size, &off) == NO) { name = &buf[4]; // key GSObjCFindVariable(self, name, &type, &size, &off); } } if (type == NULL) { buf[3] = 't'; buf[4] = hi; name = &buf[1]; // getKey sel = sel_getUid(name); if (sel == 0 || [self respondsToSelector: sel] == NO) { buf[4] = lo; name = &buf[4]; // key sel = sel_getUid(name); if (sel == 0 || [self respondsToSelector: sel] == NO) { sel = 0; } } } } if (sel != 0 || type != NULL) { return GSObjCGetVal(self, key, sel, type, size, off); } } [self handleTakeValue: nil forUnboundKey: aKey]; return nil; } - (void) takeStoredValue: (id)anObject forKey: (NSString*)aKey { unsigned size; if ([[self class] useStoredAccessor] == NO) { [self takeValue: anObject forKey: aKey]; return; } size = [aKey length] * 8; if (size > 0) { SEL sel; const char *type; int off; const char *name; char key[size + 1]; char buf[size + 6]; char lo; char hi; memcpy(buf, "_set", 4); [aKey getCString: key maxLength: size + 1 encoding: NSUTF8StringEncoding]; size = strlen(key); memcpy(&buf[4], key, size); buf[size + 4] = '\0'; lo = buf[4]; hi = islower(lo) ? toupper(lo) : lo; buf[4] = hi; buf[size + 4] = ':'; buf[size + 5] = '\0'; name = buf; // _setKey: type = NULL; off = 0; sel = sel_getUid(name); if (sel == 0 || [self respondsToSelector: sel] == NO) { sel = 0; if ([[self class] accessInstanceVariablesDirectly] == YES) { buf[size + 4] = '\0'; buf[4] = lo; buf[3] = '_'; name = &buf[3]; // _key if (GSObjCFindVariable(self, name, &type, &size, &off) == NO) { name = &buf[4]; // key GSObjCFindVariable(self, name, &type, &size, &off); } } if (type == NULL) { buf[size + 4] = ':'; buf[4] = hi; buf[3] = 't'; name = &buf[1]; // setKey: sel = sel_getUid(name); if (sel == 0 || [self respondsToSelector: sel] == NO) { sel = 0; } } } if (sel != 0 || type != NULL) { GSObjCSetVal(self, key, anObject, sel, type, size, off); return; } } [self handleTakeValue: anObject forUnboundKey: aKey]; } - (void) takeStoredValuesFromDictionary: (NSDictionary*)aDictionary { NSEnumerator *enumerator = [aDictionary keyEnumerator]; NSNull *null = [NSNull null]; NSString *key; while ((key = [enumerator nextObject]) != nil) { id obj = [aDictionary objectForKey: key]; if (obj == null) { obj = nil; } [self takeStoredValue: obj forKey: key]; } } - (id) handleQueryWithUnboundKey: (NSString*)aKey { NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: self, @"NSTargetObjectUserInfoKey", (aKey ? (id)aKey : (id)@"(nil)"), @"NSUnknownUserInfoKey", nil]; NSException *exp = [NSException exceptionWithName: NSUndefinedKeyException reason: @"Unable to find value for key" userInfo: dict]; GSOnceMLog(@"This method is deprecated, use -valueForUndefinedKey:"); [exp raise]; return nil; } - (void) handleTakeValue: (id)anObject forUnboundKey: (NSString*)aKey { NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: (anObject ? (id)anObject : (id)@"(nil)"), @"NSTargetObjectUserInfoKey", (aKey ? (id)aKey : (id)@"(nil)"), @"NSUnknownUserInfoKey", nil]; NSException *exp = [NSException exceptionWithName: NSUndefinedKeyException reason: @"Unable to set value for key" userInfo: dict]; GSOnceMLog(@"This method is deprecated, use -setValue:forUndefinedKey:"); [exp raise]; } - (void) takeValue: (id)anObject forKey: (NSString*)aKey { SEL sel = 0; const char *type = 0; int off = 0; unsigned size = [aKey length] * 8; char key[size + 1]; GSOnceMLog(@"This method is deprecated, use -setValue:forKey:"); [aKey getCString: key maxLength: size + 1 encoding: NSUTF8StringEncoding]; size = strlen(key); if (size > 0) { const char *name; char buf[size + 6]; char lo; char hi; memcpy(buf, "_set", 4); memcpy(&buf[4], key, size); lo = buf[4]; hi = islower(lo) ? toupper(lo) : lo; buf[4] = hi; buf[size + 4] = ':'; buf[size + 5] = '\0'; name = &buf[1]; // setKey: type = NULL; sel = sel_getUid(name); if (sel == 0 || [self respondsToSelector: sel] == NO) { name = buf; // _setKey: sel = sel_getUid(name); if (sel == 0 || [self respondsToSelector: sel] == NO) { sel = 0; if ([[self class] accessInstanceVariablesDirectly] == YES) { buf[size + 4] = '\0'; buf[3] = '_'; buf[4] = lo; name = &buf[4]; // key if (GSObjCFindVariable(self, name, &type, &size, &off) == NO) { name = &buf[3]; // _key GSObjCFindVariable(self, name, &type, &size, &off); } } } } } GSObjCSetVal(self, key, anObject, sel, type, size, off); } - (void) takeValue: (id)anObject forKeyPath: (NSString*)aKey { NSRange r = [aKey rangeOfString: @"." options: NSLiteralSearch]; GSOnceMLog(@"This method is deprecated, use -setValue:forKeyPath:"); if (r.length == 0) { [self takeValue: anObject forKey: aKey]; } else { NSString *key = [aKey substringToIndex: r.location]; NSString *path = [aKey substringFromIndex: NSMaxRange(r)]; [[self valueForKey: key] takeValue: anObject forKeyPath: path]; } } - (void) takeValuesFromDictionary: (NSDictionary*)aDictionary { NSEnumerator *enumerator = [aDictionary keyEnumerator]; NSNull *null = [NSNull null]; NSString *key; GSOnceMLog(@"This method is deprecated, use -setValuesForKeysWithDictionary:"); while ((key = [enumerator nextObject]) != nil) { id obj = [aDictionary objectForKey: key]; if (obj == null) { obj = nil; } [self takeValue: obj forKey: key]; } } - (void) unableToSetNilForKey: (NSString*)aKey { GSOnceMLog(@"This method is deprecated, use -setNilValueForKey:"); [NSException raise: NSInvalidArgumentException format: @"%@ -- %@ 0x%"PRIxPTR": Given nil value to set for key \"%@\"", NSStringFromSelector(_cmd), NSStringFromClass([self class]), (NSUInteger)self, aKey]; } - (NSDictionary*) valuesForKeys: (NSArray*)keys { NSMutableDictionary *dict; NSNull *null = [NSNull null]; unsigned count = [keys count]; unsigned pos; GSOnceMLog(@"This method is deprecated, use -dictionaryWithValuesForKeys:"); dict = [NSMutableDictionary dictionaryWithCapacity: count]; for (pos = 0; pos < count; pos++) { NSString *key = [keys objectAtIndex: pos]; id val = [self valueForKey: key]; if (val == nil) { val = null; } [dict setObject: val forKey: key]; } return AUTORELEASE([dict copy]); } #endif @end gnustep-base-1.29.0/Source/NSKeyValueMutableArray.m000066400000000000000000000353321435650067400221350ustar00rootroot00000000000000/* Mutable array proxies for GNUstep's KeyValueCoding Copyright (C) 2007 Free Software Foundation, Inc. Written by: Chris Farber This file is part of the GNUstep Base Library. 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 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 USA. $Date: 2007-06-08 04: 04: 14 -0400 (Fri, 08 Jun 2007) $ $Revision: 25230 $ */ #import "common.h" #import "Foundation/NSInvocation.h" #import "Foundation/NSIndexSet.h" #import "Foundation/NSKeyValueObserving.h" @interface NSKeyValueMutableArray : NSMutableArray { @protected id object; NSString *key; NSMutableArray *array; BOOL otherChangeInProgress; BOOL notifiesObservers; } + (NSKeyValueMutableArray *) arrayForKey: (NSString *)aKey ofObject: (id)anObject; - (id) initWithKey: (NSString *)aKey ofObject: (id)anObject; @end @interface NSKeyValueFastMutableArray : NSKeyValueMutableArray { @private NSInvocation *insertObjectInvocation; NSInvocation *removeObjectInvocation; NSInvocation *replaceObjectInvocation; } + (id) arrayForKey: (NSString *)aKey ofObject: (id)anObject withCapitalizedKey: (const char *)capitalized; - (id) initWithKey: (NSString *)aKey ofObject: (id)anObject withCapitalizedKey: (const char *)capitalized; @end @interface NSKeyValueSlowMutableArray : NSKeyValueMutableArray { @private NSInvocation *setArrayInvocation; } + (id) arrayForKey: (NSString *)aKey ofObject: (id)anObject withCapitalizedKey: (const char *)capitalized; - (id) initWithKey: (NSString *)aKey ofObject: (id)anObject withCapitalizedKey: (const char *)capitalized; @end @interface NSKeyValueIvarMutableArray : NSKeyValueMutableArray { @private } + (id) arrayForKey: (NSString *)aKey ofObject: (id)anObject; - (id) initWithKey: (NSString *)aKey ofObject: (id)anObject; @end @implementation NSKeyValueMutableArray + (NSKeyValueMutableArray *) arrayForKey: (NSString *)aKey ofObject: (id)anObject { NSKeyValueMutableArray *proxy; unsigned size = [aKey maximumLengthOfBytesUsingEncoding: NSUTF8StringEncoding]; char keybuf[size + 1]; [aKey getCString: keybuf maxLength: size + 1 encoding: NSUTF8StringEncoding]; if (islower(*keybuf)) { *keybuf = toupper(*keybuf); } proxy = [NSKeyValueFastMutableArray arrayForKey: aKey ofObject: anObject withCapitalizedKey: keybuf]; if (proxy == nil) { proxy = [NSKeyValueSlowMutableArray arrayForKey: aKey ofObject: anObject withCapitalizedKey: keybuf]; if (proxy == nil) { proxy = [NSKeyValueIvarMutableArray arrayForKey: aKey ofObject: anObject]; } } return proxy; } - (id) initWithKey: (NSString *)aKey ofObject: (id)anObject { if ((self = [super init]) != nil) { object = anObject; key = [aKey copy]; otherChangeInProgress = NO; notifiesObservers = [[anObject class] automaticallyNotifiesObserversForKey: aKey]; } return self; } - (NSUInteger) count { if (array == nil) { array = [object valueForKey: key]; } return [array count]; } - (id) objectAtIndex: (NSUInteger)index { if (array == nil) { array = [object valueForKey: key]; } return [array objectAtIndex: index]; } - (void) addObject: (id)anObject { [self insertObject: anObject atIndex: [self count]]; } - (void) removeLastObject { [self removeObjectAtIndex: ([self count] - 1)]; } @end @implementation NSKeyValueFastMutableArray + (id) arrayForKey: (NSString *)aKey ofObject: (id)anObject withCapitalizedKey: (const char *)capitalized { return [[[self alloc] initWithKey: aKey ofObject: anObject withCapitalizedKey: capitalized] autorelease]; } - (id) initWithKey: (NSString *)aKey ofObject: (id)anObject withCapitalizedKey: (const char *)capitalized { SEL insert; SEL remove; SEL replace; insert = NSSelectorFromString ([NSString stringWithFormat: @"insertObject:in%sAtIndex:", capitalized]); remove = NSSelectorFromString ([NSString stringWithFormat: @"removeObjectFrom%sAtIndex:", capitalized]); if (!([anObject respondsToSelector: insert] && [anObject respondsToSelector: remove])) { DESTROY(self); return nil; } replace = NSSelectorFromString ([NSString stringWithFormat: @"replaceObjectIn%sAtIndex:withObject:", capitalized]); if ((self = [super initWithKey: aKey ofObject: anObject]) != nil) { insertObjectInvocation = [[NSInvocation invocationWithMethodSignature: [anObject methodSignatureForSelector: insert]] retain]; [insertObjectInvocation setTarget: anObject]; [insertObjectInvocation setSelector: insert]; removeObjectInvocation = [[NSInvocation invocationWithMethodSignature: [anObject methodSignatureForSelector: remove]] retain]; [removeObjectInvocation setTarget: anObject]; [removeObjectInvocation setSelector: remove]; if ([anObject respondsToSelector: replace]) { replaceObjectInvocation = [[NSInvocation invocationWithMethodSignature: [anObject methodSignatureForSelector: replace]] retain]; [replaceObjectInvocation setTarget: anObject]; [replaceObjectInvocation setSelector: replace]; } } return self; } - (void) dealloc { [insertObjectInvocation release]; [removeObjectInvocation release]; [replaceObjectInvocation release]; [super dealloc]; } - (void) removeObjectAtIndex: (NSUInteger)index { NSIndexSet *indexes = nil; if (notifiesObservers && !otherChangeInProgress) { indexes = [NSIndexSet indexSetWithIndex: index]; [object willChange: NSKeyValueChangeRemoval valuesAtIndexes: indexes forKey: key]; } [removeObjectInvocation setArgument: &index atIndex: 2]; [removeObjectInvocation invoke]; if (notifiesObservers && !otherChangeInProgress) { [object didChange: NSKeyValueChangeRemoval valuesAtIndexes: indexes forKey: key]; } } - (void) insertObject: (id)anObject atIndex: (NSUInteger)index { NSIndexSet *indexes = nil; if (notifiesObservers && !otherChangeInProgress) { indexes = [NSIndexSet indexSetWithIndex: index]; [object willChange: NSKeyValueChangeInsertion valuesAtIndexes: indexes forKey: key]; } [insertObjectInvocation setArgument: &anObject atIndex: 2]; [insertObjectInvocation setArgument: &index atIndex: 3]; [insertObjectInvocation invoke]; if (notifiesObservers && !otherChangeInProgress) { [object didChange: NSKeyValueChangeInsertion valuesAtIndexes: indexes forKey: key]; } } - (void) replaceObjectAtIndex: (NSUInteger)index withObject: (id)anObject { NSIndexSet *indexes = nil; if (notifiesObservers && !otherChangeInProgress) { otherChangeInProgress = YES; indexes = [NSIndexSet indexSetWithIndex: index]; [object willChange: NSKeyValueChangeReplacement valuesAtIndexes: indexes forKey: key]; } if (replaceObjectInvocation) { [replaceObjectInvocation setArgument: &index atIndex: 2]; [replaceObjectInvocation setArgument: &anObject atIndex: 3]; [replaceObjectInvocation invoke]; } else { [self removeObjectAtIndex: index]; [self insertObject: anObject atIndex: index]; } if (notifiesObservers && !otherChangeInProgress) { [object didChange: NSKeyValueChangeReplacement valuesAtIndexes: indexes forKey: key]; otherChangeInProgress = NO; } } @end @implementation NSKeyValueSlowMutableArray + (id) arrayForKey: (NSString *)aKey ofObject: (id)anObject withCapitalizedKey: (const char *)capitalized { return [[[self alloc] initWithKey: aKey ofObject: anObject withCapitalizedKey: capitalized] autorelease]; } - (id) initWithKey: (NSString *)aKey ofObject: (id)anObject withCapitalizedKey: (const char *)capitalized; { SEL set = NSSelectorFromString([NSString stringWithFormat: @"set%s:", capitalized]); if (![anObject respondsToSelector: set]) { DESTROY(self); return nil; } if ((self = [super initWithKey: aKey ofObject: anObject]) != nil) { setArrayInvocation = [[NSInvocation invocationWithMethodSignature: [anObject methodSignatureForSelector: set]] retain]; [setArrayInvocation setSelector: set]; [setArrayInvocation setTarget: anObject]; } return self; } - (void) removeObjectAtIndex: (NSUInteger)index { NSIndexSet *indexes = nil; NSMutableArray *temp; if (notifiesObservers && !otherChangeInProgress) { indexes = [NSIndexSet indexSetWithIndex: index]; [object willChange: NSKeyValueChangeRemoval valuesAtIndexes: indexes forKey: key]; } temp = [NSMutableArray arrayWithArray: [object valueForKey: key]]; [temp removeObjectAtIndex: index]; [setArrayInvocation setArgument: &temp atIndex: 2]; [setArrayInvocation invoke]; if (notifiesObservers && !otherChangeInProgress) { [object didChange: NSKeyValueChangeRemoval valuesAtIndexes: indexes forKey: key]; } } - (void) insertObject: (id)anObject atIndex: (NSUInteger)index { NSIndexSet *indexes = nil; NSMutableArray *temp; if (notifiesObservers && !otherChangeInProgress) { indexes = [NSIndexSet indexSetWithIndex: index]; [object willChange: NSKeyValueChangeInsertion valuesAtIndexes: indexes forKey: key]; } temp = [NSMutableArray arrayWithArray: [object valueForKey: key]]; [temp insertObject: anObject atIndex: index]; [setArrayInvocation setArgument: &temp atIndex: 2]; [setArrayInvocation invoke]; if (notifiesObservers && !otherChangeInProgress) { [object didChange: NSKeyValueChangeInsertion valuesAtIndexes: indexes forKey: key]; } } - (void) replaceObjectAtIndex: (NSUInteger)index withObject: (id)anObject { NSIndexSet *indexes = nil; NSMutableArray *temp; if (notifiesObservers && !otherChangeInProgress) { indexes = [NSIndexSet indexSetWithIndex: index]; [object willChange: NSKeyValueChangeReplacement valuesAtIndexes: indexes forKey: key]; } temp = [NSMutableArray arrayWithArray: [object valueForKey: key]]; [temp removeObjectAtIndex: index]; [temp insertObject: anObject atIndex: index]; [setArrayInvocation setArgument: &temp atIndex: 2]; [setArrayInvocation invoke]; if (notifiesObservers && !otherChangeInProgress) { [object didChange: NSKeyValueChangeReplacement valuesAtIndexes: indexes forKey: key]; } } @end @implementation NSKeyValueIvarMutableArray + (id) arrayForKey: (NSString *)aKey ofObject: (id)anObject { return [[[self alloc] initWithKey: aKey ofObject: anObject] autorelease]; } - (id) initWithKey: (NSString *)aKey ofObject: (id)anObject { if ((self = [super initWithKey: aKey ofObject: anObject]) != nil) { unsigned size = [aKey maximumLengthOfBytesUsingEncoding: NSUTF8StringEncoding]; char cKey[size + 2]; char *cKeyPtr = &cKey[0]; const char *type = 0; BOOL found = NO; int offset; cKey[0] = '_'; [aKey getCString: cKeyPtr + 1 maxLength: size + 1 encoding: NSUTF8StringEncoding]; if (!GSObjCFindVariable (anObject, cKeyPtr, &type, &size, &offset)) found = GSObjCFindVariable (anObject, ++cKeyPtr, &type, &size, &offset); if (found) { array = GSObjCGetVal (anObject, cKeyPtr, NULL, type, size, offset); } else { array = [object valueForKey: key]; } } return self; } - (void) addObject: (id)anObject { NSIndexSet *indexes = nil; if (notifiesObservers) { indexes = [NSIndexSet indexSetWithIndex: [array count]]; [object willChange: NSKeyValueChangeInsertion valuesAtIndexes: indexes forKey: key]; } [array addObject: anObject]; if (notifiesObservers) { [object didChange: NSKeyValueChangeInsertion valuesAtIndexes: indexes forKey: key]; } } - (void) removeObjectAtIndex: (NSUInteger)index { NSIndexSet *indexes = nil; if (notifiesObservers) { indexes = [NSIndexSet indexSetWithIndex: index]; [object willChange: NSKeyValueChangeRemoval valuesAtIndexes: indexes forKey: key]; } [array removeObjectAtIndex: index]; if (notifiesObservers) { [object didChange: NSKeyValueChangeRemoval valuesAtIndexes: indexes forKey: key]; } } - (void) insertObject: (id)anObject atIndex: (NSUInteger)index { NSIndexSet *indexes = nil; if (notifiesObservers) { indexes = [NSIndexSet indexSetWithIndex: index]; [object willChange: NSKeyValueChangeInsertion valuesAtIndexes: indexes forKey: key]; } [array insertObject: anObject atIndex: index]; if (notifiesObservers) { [object didChange: NSKeyValueChangeInsertion valuesAtIndexes: indexes forKey: key]; } } - (void) removeLastObject { NSIndexSet *indexes = nil; if (notifiesObservers) { indexes = [NSIndexSet indexSetWithIndex: [array count] - 1]; [object willChange: NSKeyValueChangeRemoval valuesAtIndexes: indexes forKey: key]; } [array removeObjectAtIndex: [indexes firstIndex]]; if (notifiesObservers) { [object didChange: NSKeyValueChangeRemoval valuesAtIndexes: indexes forKey: key]; } } - (void) replaceObjectAtIndex: (NSUInteger)index withObject: (id)anObject { NSIndexSet *indexes = nil; if (notifiesObservers) { indexes = [NSIndexSet indexSetWithIndex: index]; [object willChange: NSKeyValueChangeReplacement valuesAtIndexes: indexes forKey: key]; } [array replaceObjectAtIndex: index withObject: anObject]; if (notifiesObservers) { [object didChange: NSKeyValueChangeReplacement valuesAtIndexes: indexes forKey: key]; } } @end gnustep-base-1.29.0/Source/NSKeyValueMutableSet.m000066400000000000000000000515521435650067400216140ustar00rootroot00000000000000/* Mutable set proxies for GNUstep's KeyValueCoding Copyright (C) 2007 Free Software Foundation, Inc. Written by: Chris Farber This file is part of the GNUstep Base Library. 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 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 USA. $Date: 2007-06-08 04:04:14 -0400 (Fri, 08 Jun 2007) $ $Revision: 25230 $ */ #import "common.h" #import "Foundation/NSInvocation.h" @interface NSKeyValueMutableSet : NSMutableSet { @protected id object; NSString *key; NSMutableSet *set; BOOL changeInProgress; BOOL notifiesObservers; } + (NSKeyValueMutableSet*) setForKey: (NSString*)aKey ofObject: (id)anObject; - (id) initWithKey: (NSString*)aKey ofObject: (id)anObject; @end @interface NSKeyValueFastMutableSet : NSKeyValueMutableSet { @private NSInvocation *addObjectInvocation; NSInvocation *removeObjectInvocation; NSInvocation *addSetInvocation; NSInvocation *removeSetInvocation; NSInvocation *intersectInvocation; NSInvocation *setSetInvocation; } + (id) setForKey: (NSString*)aKey ofObject: (id)anObject withCapitalizedKey: (const char *)capitalized; - (id) initWithKey: (NSString *)aKey ofObject: (id)anObject withCapitalizedKey: (const char *)capitalized; @end @interface NSKeyValueSlowMutableSet : NSKeyValueMutableSet { @private NSInvocation *setSetInvocation; } + (id) setForKey: (NSString *)aKey ofObject: (id)anObject withCapitalizedKey: (const char *)capitalized; - (id) initWithKey: (NSString *)aKey ofObject: (id)anObject withCapitalizedKey: (const char *)capitalized; @end @interface NSKeyValueIvarMutableSet : NSKeyValueMutableSet { @private } + (id) setForKey: (NSString *)aKey ofObject: (id)anObject; - (id) initWithKey: (NSString *)aKey ofObject: (id)anObject; @end @implementation NSKeyValueMutableSet + (NSKeyValueMutableSet *) setForKey: (NSString *)aKey ofObject: (id)anObject { NSKeyValueMutableSet *proxy; unsigned size = [aKey maximumLengthOfBytesUsingEncoding: NSUTF8StringEncoding]; char keybuf[size + 1]; [aKey getCString: keybuf maxLength: size + 1 encoding: NSUTF8StringEncoding]; if (islower(*keybuf)) { *keybuf = toupper(*keybuf); } proxy = [NSKeyValueFastMutableSet setForKey: aKey ofObject: anObject withCapitalizedKey: keybuf]; if (proxy == nil) { proxy = [NSKeyValueSlowMutableSet setForKey: aKey ofObject: anObject withCapitalizedKey: keybuf]; if (proxy == nil) { proxy = [NSKeyValueIvarMutableSet setForKey: aKey ofObject: anObject]; } } return proxy; } - (id) initWithKey: (NSString *)aKey ofObject: (id)anObject { if ((self = [super init]) != nil) { object = anObject; key = [aKey copy]; changeInProgress = NO; notifiesObservers = [[anObject class] automaticallyNotifiesObserversForKey: aKey]; } return self; } - (NSUInteger) count { if (set == nil) { set = [object valueForKey: key]; } return [set count]; } - (id) member: (id)anObject { if (set == nil) { set = [object valueForKey: key]; } return [set member: anObject]; } - (NSEnumerator *) objectEnumerator { if (set == nil) { set = [object valueForKey: key]; } return [set objectEnumerator]; } - (void) removeAllObjects { if (set == nil) { set = [object valueForKey: key]; } [set removeAllObjects]; } @end @implementation NSKeyValueFastMutableSet + (id) setForKey: (NSString *)aKey ofObject: (id)anObject withCapitalizedKey: (const char *)capitalized { return [[[self alloc] initWithKey: aKey ofObject: anObject withCapitalizedKey: capitalized] autorelease]; } - (id) initWithKey: (NSString *)aKey ofObject: (id)anObject withCapitalizedKey: (const char *)capitalized { SEL addObject; SEL removeObject; SEL addSet; SEL removeSet; SEL intersect; SEL setSet; BOOL canAdd = NO; BOOL canRemove = NO; addObject = NSSelectorFromString ([NSString stringWithFormat: @"add%sObject:", capitalized]); removeObject = NSSelectorFromString ([NSString stringWithFormat: @"remove%sObject:", capitalized]); addSet = NSSelectorFromString ([NSString stringWithFormat: @"add%s:", capitalized]); removeSet = NSSelectorFromString ([NSString stringWithFormat: @"remove%s:", capitalized]); if ([anObject respondsToSelector: addObject]) { canAdd = YES; addObjectInvocation = [[NSInvocation invocationWithMethodSignature: [anObject methodSignatureForSelector: addObject]] retain]; [addObjectInvocation setTarget: anObject]; [addObjectInvocation setSelector: addObject]; } if ([anObject respondsToSelector: removeObject]) { canRemove = YES; removeObjectInvocation = [[NSInvocation invocationWithMethodSignature: [anObject methodSignatureForSelector: removeObject]] retain]; [removeObjectInvocation setTarget: anObject]; [removeObjectInvocation setSelector: removeObject]; } if ([anObject respondsToSelector: addSet]) { canAdd = YES; addSetInvocation = [[NSInvocation invocationWithMethodSignature: [anObject methodSignatureForSelector: addSet]] retain]; [addSetInvocation setTarget: anObject]; [addSetInvocation setSelector: addSet]; } if ([anObject respondsToSelector: removeSet]) { canRemove = YES; removeSetInvocation = [[NSInvocation invocationWithMethodSignature: [anObject methodSignatureForSelector: removeSet]] retain]; [removeSetInvocation setTarget: anObject]; [removeSetInvocation setSelector: removeSet]; } if (!canAdd || !canRemove) { DESTROY(self); return nil; } if ((self = [super initWithKey: aKey ofObject: anObject]) != nil) { intersect = NSSelectorFromString ([NSString stringWithFormat: @"intersect%s:", capitalized]); setSet = NSSelectorFromString ([NSString stringWithFormat: @"set%s:", capitalized]); if ([anObject respondsToSelector: intersect]) { intersectInvocation = [[NSInvocation invocationWithMethodSignature: [anObject methodSignatureForSelector: intersect]] retain]; [intersectInvocation setTarget: anObject]; [intersectInvocation setSelector: intersect]; } if ([anObject respondsToSelector: setSet]) { setSetInvocation = [[NSInvocation invocationWithMethodSignature: [anObject methodSignatureForSelector: setSet]] retain]; [setSetInvocation setTarget: anObject]; [setSetInvocation setSelector: setSet]; } } return self; } - (void) dealloc { [setSetInvocation release]; [intersectInvocation release]; [removeSetInvocation release]; [addSetInvocation release]; [removeObjectInvocation release]; [addObjectInvocation release]; [super dealloc]; } - (void) addObject: (id)anObject { if (addObjectInvocation) { if (notifiesObservers && !changeInProgress) { [object willChangeValueForKey: key withSetMutation: NSKeyValueUnionSetMutation usingObjects: [NSSet setWithObject: anObject]]; } [addObjectInvocation setArgument: &anObject atIndex: 2]; [addObjectInvocation invoke]; if (notifiesObservers && !changeInProgress) { [object didChangeValueForKey: key withSetMutation: NSKeyValueUnionSetMutation usingObjects: [NSSet setWithObject: anObject]]; } } else { [self unionSet: [NSSet setWithObject: anObject]]; } } - (void) unionSet: (NSSet *)aSet { if (notifiesObservers) { changeInProgress = YES; [object willChangeValueForKey: key withSetMutation: NSKeyValueUnionSetMutation usingObjects: aSet]; } if (addSetInvocation) { [addSetInvocation setArgument: &aSet atIndex: 2]; [addSetInvocation invoke]; } else { [super unionSet: aSet]; } if (notifiesObservers) { changeInProgress = NO; [object didChangeValueForKey: key withSetMutation: NSKeyValueUnionSetMutation usingObjects: aSet]; } } - (void) removeObject: (id)anObject { if (removeObjectInvocation) { if (notifiesObservers && !changeInProgress) { [object willChangeValueForKey: key withSetMutation: NSKeyValueMinusSetMutation usingObjects: [NSSet setWithObject: anObject]]; } [removeObjectInvocation setArgument: &anObject atIndex: 2]; [removeObjectInvocation invoke]; if (notifiesObservers && !changeInProgress) { [object didChangeValueForKey: key withSetMutation: NSKeyValueMinusSetMutation usingObjects: [NSSet setWithObject: anObject]]; } } else [self minusSet: [NSSet setWithObject: anObject]]; } - (void) minusSet: (NSSet *)aSet { if (notifiesObservers) { changeInProgress = YES; [object willChangeValueForKey: key withSetMutation: NSKeyValueMinusSetMutation usingObjects: aSet]; } if (removeSetInvocation) { [removeSetInvocation setArgument: &aSet atIndex: 2]; [removeSetInvocation invoke]; } else { [super minusSet: aSet]; } if (notifiesObservers) { [object didChangeValueForKey: key withSetMutation: NSKeyValueMinusSetMutation usingObjects: aSet]; changeInProgress = NO; } } - (void) intersectSet: (NSSet *)aSet { if (notifiesObservers) { changeInProgress = YES; [object willChangeValueForKey: key withSetMutation: NSKeyValueIntersectSetMutation usingObjects: aSet]; } if (intersectInvocation) { [intersectInvocation setArgument: &aSet atIndex: 2]; [intersectInvocation invoke]; } else { [super intersectSet: aSet]; } if (notifiesObservers) { [object didChangeValueForKey: key withSetMutation: NSKeyValueIntersectSetMutation usingObjects: aSet]; changeInProgress = NO; } } - (void) setSet: (NSSet *)aSet { if (notifiesObservers) { changeInProgress = YES; [object willChangeValueForKey: key withSetMutation: NSKeyValueSetSetMutation usingObjects: aSet]; } if (setSetInvocation) { [setSetInvocation setArgument: &aSet atIndex: 2]; [setSetInvocation invoke]; } else { [super setSet: aSet]; } if (notifiesObservers) { [object didChangeValueForKey: key withSetMutation: NSKeyValueSetSetMutation usingObjects: aSet]; changeInProgress = NO; } } @end @implementation NSKeyValueSlowMutableSet + (id) setForKey: (NSString *)aKey ofObject: (id)anObject withCapitalizedKey: (const char *)capitalized { return [[[self alloc] initWithKey: aKey ofObject: anObject withCapitalizedKey: capitalized] autorelease]; } - (id) initWithKey: (NSString *)aKey ofObject: (id)anObject withCapitalizedKey: (const char *)capitalized; { SEL setSelector = NSSelectorFromString([NSString stringWithFormat: @"set%s:", capitalized]); if (![anObject respondsToSelector: setSelector]) { DESTROY(self); return nil; } if ((self = [super initWithKey: aKey ofObject: anObject]) != nil) { setSetInvocation = [[NSInvocation invocationWithMethodSignature: [anObject methodSignatureForSelector: setSelector]] retain]; [setSetInvocation setSelector: setSelector]; [setSetInvocation setTarget: anObject]; } return self; } - (void) setSet: (id)aSet { if (notifiesObservers) { [object willChangeValueForKey: key withSetMutation: NSKeyValueSetSetMutation usingObjects: aSet]; } [setSetInvocation setArgument: &aSet atIndex: 2]; [setSetInvocation invoke]; if (notifiesObservers) { [object didChangeValueForKey: key withSetMutation: NSKeyValueSetSetMutation usingObjects: aSet]; } } - (void) removeAllObjects { NSSet *nothing; NSSet *theSet = [NSSet setWithSet: [object valueForKey: key]]; if (notifiesObservers) { [object willChangeValueForKey: key withSetMutation: NSKeyValueMinusSetMutation usingObjects: theSet]; } nothing = [NSSet set]; [setSetInvocation setArgument: ¬hing atIndex: 2]; [setSetInvocation invoke]; if (notifiesObservers) { [object didChangeValueForKey: key withSetMutation: NSKeyValueMinusSetMutation usingObjects: theSet]; } } - (void) addObject: (id)anObject { NSMutableSet *temp; NSSet *unionSet = [NSSet setWithObject: anObject]; if (notifiesObservers) { [object willChangeValueForKey: key withSetMutation: NSKeyValueUnionSetMutation usingObjects: unionSet]; } temp = [NSMutableSet setWithSet: [object valueForKey: key]]; [temp addObject: anObject]; [setSetInvocation setArgument: &temp atIndex: 2]; [setSetInvocation invoke]; if (notifiesObservers) { [object didChangeValueForKey: key withSetMutation: NSKeyValueUnionSetMutation usingObjects: unionSet]; } } - (void) removeObject: (id)anObject { NSMutableSet *temp; NSSet *minusSet = [NSSet setWithObject: anObject]; if (notifiesObservers) { [object willChangeValueForKey: key withSetMutation: NSKeyValueMinusSetMutation usingObjects: minusSet]; } temp = [NSMutableSet setWithSet: [object valueForKey: key]]; [temp removeObject: anObject]; [setSetInvocation setArgument: &temp atIndex: 2]; [setSetInvocation invoke]; if (notifiesObservers) { [object didChangeValueForKey: key withSetMutation: NSKeyValueMinusSetMutation usingObjects: minusSet]; } } - (void) unionSet: (id)anObject { NSMutableSet *temp; if (notifiesObservers) { [object willChangeValueForKey: key withSetMutation: NSKeyValueUnionSetMutation usingObjects: anObject]; } temp = [NSMutableSet setWithSet: [object valueForKey: key]]; [temp unionSet: anObject]; [setSetInvocation setArgument: &temp atIndex: 2]; [setSetInvocation invoke]; if (notifiesObservers) { [object didChangeValueForKey: key withSetMutation: NSKeyValueUnionSetMutation usingObjects: anObject]; } } - (void) minusSet: (id)anObject { NSMutableSet *temp; if (notifiesObservers) { [object willChangeValueForKey: key withSetMutation: NSKeyValueMinusSetMutation usingObjects: anObject]; } temp = [NSMutableSet setWithSet: [object valueForKey: key]]; [temp minusSet: anObject]; [setSetInvocation setArgument: &temp atIndex: 2]; [setSetInvocation invoke]; if (notifiesObservers) { [object didChangeValueForKey: key withSetMutation: NSKeyValueMinusSetMutation usingObjects: anObject]; } } - (void) intersectSet: (id)anObject { NSMutableSet *temp; if (notifiesObservers) { [object willChangeValueForKey: key withSetMutation: NSKeyValueIntersectSetMutation usingObjects: anObject]; } temp = [NSMutableSet setWithSet: [object valueForKey: key]]; [temp intersectSet: anObject]; [setSetInvocation setArgument: &temp atIndex: 2]; [setSetInvocation invoke]; if (notifiesObservers) { [object didChangeValueForKey: key withSetMutation: NSKeyValueIntersectSetMutation usingObjects: anObject]; } } @end @implementation NSKeyValueIvarMutableSet + (id) setForKey: (NSString *)aKey ofObject: (id)anObject { return [[[self alloc] initWithKey: aKey ofObject: anObject] autorelease]; } - (id) initWithKey: (NSString *)aKey ofObject: (id)anObject { if ((self = [super initWithKey: aKey ofObject: anObject]) != nil) { unsigned size = [aKey maximumLengthOfBytesUsingEncoding: NSUTF8StringEncoding]; char cKey[size + 2]; char *cKeyPtr = &cKey[0]; const char *type = 0; int offset; cKey[0] = '_'; [aKey getCString: cKeyPtr + 1 maxLength: size + 1 encoding: NSUTF8StringEncoding]; if (!GSObjCFindVariable (anObject, cKeyPtr, &type, &size, &offset)) { GSObjCFindVariable (anObject, ++cKeyPtr, &type, &size, &offset); } set = GSObjCGetVal (anObject, cKeyPtr, NULL, type, size, offset); } return self; } - (NSUInteger) count { return [set count]; } - (NSArray *) allObjects { return [set allObjects]; } - (BOOL) containsObject: (id)anObject { return [set containsObject: anObject]; } - (id) member: (id)anObject { return [set member: anObject]; } - (void) addObject: (id)anObject { if (notifiesObservers && !changeInProgress) { [object willChangeValueForKey: key withSetMutation: NSKeyValueUnionSetMutation usingObjects: [NSSet setWithObject: anObject]]; } [set addObject: anObject]; if (notifiesObservers && !changeInProgress) { [object didChangeValueForKey: key withSetMutation: NSKeyValueUnionSetMutation usingObjects: [NSSet setWithObject:anObject]]; } } - (void) removeObject: (id)anObject { if (notifiesObservers && !changeInProgress) { [object willChangeValueForKey: key withSetMutation: NSKeyValueMinusSetMutation usingObjects: [NSSet setWithObject:anObject]]; } [set removeObject: anObject]; if (notifiesObservers && !changeInProgress) { [object didChangeValueForKey: key withSetMutation: NSKeyValueMinusSetMutation usingObjects: [NSSet setWithObject: anObject]]; } } - (void) unionSet: (id)anObject { if (notifiesObservers && !changeInProgress) { [object willChangeValueForKey: key withSetMutation: NSKeyValueUnionSetMutation usingObjects: [NSSet setWithObject: anObject]]; } [set unionSet: anObject]; if (notifiesObservers && !changeInProgress) { [object didChangeValueForKey: key withSetMutation: NSKeyValueUnionSetMutation usingObjects: [NSSet setWithObject:anObject]]; } } - (void) minusSet: (id)anObject { if (notifiesObservers && !changeInProgress) { [object willChangeValueForKey: key withSetMutation: NSKeyValueMinusSetMutation usingObjects: [NSSet setWithObject: anObject]]; } [set minusSet: anObject]; if (notifiesObservers && !changeInProgress) { [object didChangeValueForKey: key withSetMutation: NSKeyValueMinusSetMutation usingObjects: [NSSet setWithObject: anObject]]; } } - (void) intersectSet: (id)anObject { if (notifiesObservers && !changeInProgress) { [object willChangeValueForKey: key withSetMutation: NSKeyValueIntersectSetMutation usingObjects: [NSSet setWithObject: anObject]]; } [set intersectSet: anObject]; if (notifiesObservers && !changeInProgress) { [object didChangeValueForKey: key withSetMutation: NSKeyValueIntersectSetMutation usingObjects: [NSSet setWithObject: anObject]]; } } - (void) setSet: (id)anObject { if (notifiesObservers && !changeInProgress) { [object willChangeValueForKey: key withSetMutation: NSKeyValueSetSetMutation usingObjects: [NSSet setWithObject: anObject]]; } [set setSet: anObject]; if (notifiesObservers && !changeInProgress) { [object didChangeValueForKey: key withSetMutation: NSKeyValueSetSetMutation usingObjects: [NSSet setWithObject: anObject]]; } } @end gnustep-base-1.29.0/Source/NSKeyValueObserving.m000066400000000000000000001560141435650067400215040ustar00rootroot00000000000000/** Implementation of GNUSTEP key value observing Copyright (C) 2005 Free Software Foundation, Inc. Written by Richard Frith-Macdonald Date: 2005-2008 This file is part of the GNUstep Base Library. 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 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 USA. $Date$ $Revision$ */ #import "common.h" #import "Foundation/NSCharacterSet.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSException.h" #import "Foundation/NSHashTable.h" #import "Foundation/NSIndexSet.h" #import "Foundation/NSKeyValueCoding.h" #import "Foundation/NSKeyValueObserving.h" #import "Foundation/NSLock.h" #import "Foundation/NSMapTable.h" #import "Foundation/NSMethodSignature.h" #import "Foundation/NSNull.h" #import "Foundation/NSSet.h" #import "Foundation/NSValue.h" #import "GNUstepBase/GSObjCRuntime.h" #import "GNUstepBase/Unicode.h" #import "GNUstepBase/GSLock.h" #import "GSInvocation.h" #if defined(USE_LIBFFI) #import "cifframe.h" #endif /* * IMPLEMENTATION NOTES * * Originally, I wanted to do KVO via a proxy, with class pointer swizzling * to turn the original instance into an instance of the proxy class. * However, I couldn't figure a way to get decent performance out of * this model, as every message to the instance would have to be * forwarded through the proxy class methods to the original class * methods. * * So, instead I arrived at the mechanism of creating a subclass of * each class being observed, with a few subclass methods overriding * those of the original, but most remaining the same. * The same class pointer swizzling technique was used to convert between the * original class and the superclass. * This subclass basically overrides several standard methods with * those from a template class, and then overrides any setter methods * with a another generic setter. */ static NSRecursiveLock *kvoLock = nil; static NSMapTable *classTable = 0; static NSMapTable *infoTable = 0; static NSMapTable *dependentKeyTable; static Class baseClass; static id null; static inline void setup() { if (nil == kvoLock) { [gnustep_global_lock lock]; if (nil == kvoLock) { kvoLock = [NSRecursiveLock new]; null = [[NSNull null] retain]; classTable = NSCreateMapTable(NSNonOwnedPointerMapKeyCallBacks, NSNonOwnedPointerMapValueCallBacks, 128); infoTable = NSCreateMapTable(NSNonOwnedPointerMapKeyCallBacks, NSNonOwnedPointerMapValueCallBacks, 1024); dependentKeyTable = NSCreateMapTable(NSNonOwnedPointerMapKeyCallBacks, NSOwnedPointerMapValueCallBacks, 128); baseClass = NSClassFromString(@"GSKVOBase"); } [gnustep_global_lock unlock]; } } /* * This is the template class whose methods are added to KVO classes to * override the originals and make the swizzled class look like the * original class. */ @interface GSKVOBase : NSObject @end /* * This holds information about a subclass replacing a class which is * being observed. */ @interface GSKVOReplacement : NSObject { Class original; /* The original class */ Class replacement; /* The replacement class */ NSMutableSet *keys; /* The observed setter keys */ } - (id) initWithClass: (Class)aClass; - (void) overrideSetterFor: (NSString*)aKey; - (Class) replacement; @end /* * This is a placeholder class which has the abstract setter method used * to replace all setter methods in the original. */ @interface GSKVOSetter : NSObject - (void) setter: (void*)val; - (void) setterChar: (unsigned char)val; - (void) setterDouble: (double)val; - (void) setterFloat: (float)val; - (void) setterInt: (unsigned int)val; - (void) setterLong: (unsigned long)val; #ifdef _C_LNG_LNG - (void) setterLongLong: (unsigned long long)val; #endif - (void) setterShort: (unsigned short)val; - (void) setterRange: (NSRange)val; - (void) setterPoint: (NSPoint)val; - (void) setterSize: (NSSize)val; - (void) setterRect: (NSRect)rect; @end /* An instance of this records all the information for a single observation. */ @interface GSKVOObservation : NSObject { @public NSObject *observer; // Not retained (zeroing weak pointer) void *context; int options; } @end /* An instance of thsi records the observations for a key path and the * recursion state of the process of sending notifications. */ @interface GSKVOPathInfo : NSObject { @public unsigned recursion; unsigned allOptions; NSMutableArray *observations; NSMutableDictionary *change; } - (void) notifyForKey: (NSString *)aKey ofInstance: (id)instance prior: (BOOL)f; @end /* * Instances of this class are created to hold information about the * observers monitoring a particular object which is being observed. */ @interface GSKVOInfo : NSObject { NSObject *instance; // Not retained. NSRecursiveLock *iLock; NSMapTable *paths; } - (GSKVOPathInfo *) lockReturningPathInfoForKey: (NSString *)key; - (void*) contextForObserver: (NSObject*)anObserver ofKeyPath: (NSString*)aPath; - (id) initWithInstance: (NSObject*)i; - (NSObject*) instance; - (BOOL) isUnobserved; - (void) unlock; @end @interface NSKeyValueObservationForwarder : NSObject { id target; NSKeyValueObservationForwarder *child; void *contextToForward; id observedObjectForUpdate; NSString *keyForUpdate; id observedObjectForForwarding; NSString *keyForForwarding; NSString *keyPathToForward; } - (id) initWithKeyPath: (NSString *)keyPath ofObject: (id)object withTarget: (id)aTarget context: (void *)context; - (void) keyPathChanged: (id)objectToObserve; @end @implementation GSKVOBase - (void) dealloc { // Turn off KVO for self ... then call the real dealloc implementation. [self setObservationInfo: nil]; object_setClass(self, [self class]); [self dealloc]; GSNOSUPERDEALLOC; } - (Class) class { return class_getSuperclass(object_getClass(self)); } - (void) setValue: (id)anObject forKey: (NSString*)aKey { Class c = [self class]; void (*imp)(id,SEL,id,id); imp = (void (*)(id,SEL,id,id))[c instanceMethodForSelector: _cmd]; if ([[self class] automaticallyNotifiesObserversForKey: aKey]) { [self willChangeValueForKey: aKey]; imp(self,_cmd,anObject,aKey); [self didChangeValueForKey: aKey]; } else { imp(self,_cmd,anObject,aKey); } } - (void) takeStoredValue: (id)anObject forKey: (NSString*)aKey { Class c = [self class]; void (*imp)(id,SEL,id,id); imp = (void (*)(id,SEL,id,id))[c instanceMethodForSelector: _cmd]; if ([[self class] automaticallyNotifiesObserversForKey: aKey]) { [self willChangeValueForKey: aKey]; imp(self,_cmd,anObject,aKey); [self didChangeValueForKey: aKey]; } else { imp(self,_cmd,anObject,aKey); } } - (void) takeValue: (id)anObject forKey: (NSString*)aKey { Class c = [self class]; void (*imp)(id,SEL,id,id); imp = (void (*)(id,SEL,id,id))[c instanceMethodForSelector: _cmd]; if ([[self class] automaticallyNotifiesObserversForKey: aKey]) { [self willChangeValueForKey: aKey]; imp(self,_cmd,anObject,aKey); [self didChangeValueForKey: aKey]; } else { imp(self,_cmd,anObject,aKey); } } - (void) takeValue: (id)anObject forKeyPath: (NSString*)aKey { Class c = [self class]; void (*imp)(id,SEL,id,id); imp = (void (*)(id,SEL,id,id))[c instanceMethodForSelector: _cmd]; if ([[self class] automaticallyNotifiesObserversForKey: aKey]) { [self willChangeValueForKey: aKey]; imp(self,_cmd,anObject,aKey); [self didChangeValueForKey: aKey]; } else { imp(self,_cmd,anObject,aKey); } } - (Class) superclass { return class_getSuperclass(class_getSuperclass(object_getClass(self))); } @end /* * Get a key name from a selector (setKey: or _setKey:) by * taking the key part and making the first letter lowercase. */ static NSString *newKey(SEL _cmd) { const char *name = sel_getName(_cmd); unsigned len; NSString *key; unsigned i; if (0 == _cmd || 0 == (name = sel_getName(_cmd))) { [NSException raise: NSInvalidArgumentException format: @"Missing selector name"]; } len = strlen(name); if (*name == '_') { name++; len--; } if (len < 5 || name[len-1] != ':' || strncmp(name, "set", 3) != 0) { [NSException raise: NSInvalidArgumentException format: @"Invalid selector name"]; } name += 3; // Step past 'set' len -= 4; // allow for 'set' and trailing ':' for (i = 0; i < len; i++) { if (name[i] & 0x80) { break; } } if (i == len) { char buf[len]; /* Efficient key creation for ascii keys */ for (i = 0; i < len; i++) buf[i] = name[i]; if (isupper(buf[0])) { buf[0] = tolower(buf[0]); } key = [[NSString alloc] initWithBytes: buf length: len encoding: NSASCIIStringEncoding]; } else { unichar u; NSMutableString *m; NSString *tmp; /* * Key creation for unicode strings. */ m = [[NSMutableString alloc] initWithBytes: name length: len encoding: NSUTF8StringEncoding]; u = [m characterAtIndex: 0]; u = uni_tolower(u); tmp = [[NSString alloc] initWithCharacters: &u length: 1]; [m replaceCharactersInRange: NSMakeRange(0, 1) withString: tmp]; [tmp release]; key = m; } return key; } static GSKVOReplacement * replacementForClass(Class c) { GSKVOReplacement *r; setup(); [kvoLock lock]; r = (GSKVOReplacement*)NSMapGet(classTable, (void*)c); if (r == nil) { r = [[GSKVOReplacement alloc] initWithClass: c]; NSMapInsert(classTable, (void*)c, (void*)r); } [kvoLock unlock]; return r; } #if defined(USE_LIBFFI) static void cifframe_callback(ffi_cif *cif, void *retp, void **args, void *user) { id obj; SEL sel; NSString *key; Class c; void (*imp)(id,SEL,void*); obj = *(id *)args[0]; sel = *(SEL *)args[1]; c = [obj class]; imp = (void (*)(id,SEL,void*))[c instanceMethodForSelector: sel]; key = newKey(sel); if ([c automaticallyNotifiesObserversForKey: key] == YES) { // pre setting code here [obj willChangeValueForKey: key]; ffi_call(cif, (void*)imp, retp, args); // post setting code here [obj didChangeValueForKey: key]; } else { ffi_call(cif, (void*)imp, retp, args); } RELEASE(key); } #endif @implementation GSKVOReplacement - (void) dealloc { DESTROY(keys); [super dealloc]; } - (id) initWithClass: (Class)aClass { NSValue *template; NSString *superName; NSString *name; if (nil == (self = [super init])) { return nil; } if ([aClass instanceMethodForSelector: @selector(takeValue:forKey:)] != [NSObject instanceMethodForSelector: @selector(takeValue:forKey:)]) { NSLog(@"WARNING The class '%@' (or one of its superclasses) overrides" @" the deprecated takeValue:forKey: method. Using KVO to observe" @" this class may interfere with this method. Please change the" @" class to override -setValue:forKey: instead.", NSStringFromClass(aClass)); } if ([aClass instanceMethodForSelector: @selector(takeValue:forKeyPath:)] != [NSObject instanceMethodForSelector: @selector(takeValue:forKeyPath:)]) { NSLog(@"WARNING The class '%@' (or one of its superclasses) overrides" @" the deprecated takeValue:forKeyPath: method. Using KVO to observe" @" this class may interfere with this method. Please change the" @" class to override -setValue:forKeyPath: instead.", NSStringFromClass(aClass)); } original = aClass; /* * Create subclass of the original, and override some methods * with implementations from our abstract base class. */ superName = NSStringFromClass(original); name = [@"GSKVO" stringByAppendingString: superName]; template = GSObjCMakeClass(name, superName, nil); GSObjCAddClasses([NSArray arrayWithObject: template]); replacement = NSClassFromString(name); GSObjCAddClassBehavior(replacement, baseClass); /* Create the set of setter methods overridden. */ keys = [NSMutableSet new]; return self; } - (void) overrideSetterFor: (NSString*)aKey { if ([keys member: aKey] == nil) { NSMethodSignature *sig; SEL sel; IMP imp; const char *type; NSString *suffix; NSString *a[2]; unsigned i; BOOL found = NO; NSString *tmp; unichar u; suffix = [aKey substringFromIndex: 1]; u = uni_toupper([aKey characterAtIndex: 0]); tmp = [[NSString alloc] initWithCharacters: &u length: 1]; a[0] = [NSString stringWithFormat: @"set%@%@:", tmp, suffix]; a[1] = [NSString stringWithFormat: @"_set%@%@:", tmp, suffix]; [tmp release]; for (i = 0; i < 2; i++) { /* * Replace original setter with our own version which does KVO * notifications. */ sel = NSSelectorFromString(a[i]); if (sel == 0) { continue; } sig = [original instanceMethodSignatureForSelector: sel]; if (sig == 0) { continue; } /* * A setter must take three arguments (self, _cmd, value). * The return value (if any) is ignored. */ if ([sig numberOfArguments] != 3) { continue; // Not a valid setter method. } /* * Since the compiler passes different argument types * differently, we must use a different setter method * for each argument type. * FIXME ... support structures * Unsupported types are quietly ignored ... is that right? */ type = [sig getArgumentTypeAtIndex: 2]; switch (*type) { case _C_CHR: case _C_UCHR: imp = [[GSKVOSetter class] instanceMethodForSelector: @selector(setterChar:)]; break; case _C_SHT: case _C_USHT: imp = [[GSKVOSetter class] instanceMethodForSelector: @selector(setterShort:)]; break; case _C_INT: case _C_UINT: imp = [[GSKVOSetter class] instanceMethodForSelector: @selector(setterInt:)]; break; case _C_LNG: case _C_ULNG: imp = [[GSKVOSetter class] instanceMethodForSelector: @selector(setterLong:)]; break; #ifdef _C_LNG_LNG case _C_LNG_LNG: case _C_ULNG_LNG: imp = [[GSKVOSetter class] instanceMethodForSelector: @selector(setterLongLong:)]; break; #endif case _C_FLT: imp = [[GSKVOSetter class] instanceMethodForSelector: @selector(setterFloat:)]; break; case _C_DBL: imp = [[GSKVOSetter class] instanceMethodForSelector: @selector(setterDouble:)]; break; #if defined(_C_BOOL) && (!defined(__GNUC__) || __GNUC__ > 2) case _C_BOOL: imp = [[GSKVOSetter class] instanceMethodForSelector: @selector(setterChar:)]; break; #endif case _C_ID: case _C_CLASS: case _C_PTR: imp = [[GSKVOSetter class] instanceMethodForSelector: @selector(setter:)]; break; case _C_STRUCT_B: if (GSSelectorTypesMatch(@encode(NSRange), type)) { imp = [[GSKVOSetter class] instanceMethodForSelector: @selector(setterRange:)]; } else if (GSSelectorTypesMatch(@encode(NSPoint), type)) { imp = [[GSKVOSetter class] instanceMethodForSelector: @selector(setterPoint:)]; } else if (GSSelectorTypesMatch(@encode(NSSize), type)) { imp = [[GSKVOSetter class] instanceMethodForSelector: @selector(setterSize:)]; } else if (GSSelectorTypesMatch(@encode(NSRect), type)) { imp = [[GSKVOSetter class] instanceMethodForSelector: @selector(setterRect:)]; } else { #if defined(USE_LIBFFI) GSCodeBuffer *b; b = cifframe_closure(sig, cifframe_callback); [b retain]; imp = [b executable]; #else imp = 0; #endif } break; default: imp = 0; break; } if (imp != 0) { if (class_addMethod(replacement, sel, imp, [sig methodType])) { found = YES; } else { NSLog(@"Failed to add setter method for %s to %s", sel_getName(sel), class_getName(original)); } } } if (found == YES) { [keys addObject: aKey]; } else { NSMapTable *depKeys = NSMapGet(dependentKeyTable, original); if (depKeys) { NSMapEnumerator enumerator = NSEnumerateMapTable(depKeys); NSString *mainKey; NSHashTable *dependents; while (NSNextMapEnumeratorPair(&enumerator, (void **)(&mainKey), (void**)&dependents)) { NSHashEnumerator dependentKeyEnum; NSString *dependentKey; if (!dependents) continue; dependentKeyEnum = NSEnumerateHashTable(dependents); while ((dependentKey = NSNextHashEnumeratorItem(&dependentKeyEnum))) { if ([dependentKey isEqual: aKey]) { [self overrideSetterFor: mainKey]; // Mark the key as used [keys addObject: aKey]; found = YES; } } NSEndHashTableEnumeration(&dependentKeyEnum); } NSEndMapTableEnumeration(&enumerator); } if (!found) { NSDebugLLog(@"KVC", @"class %@ not KVC compliant for %@", original, aKey); /* [NSException raise: NSInvalidArgumentException format: @"class not KVC complient for %@", aKey]; */ } } } } - (Class) replacement { return replacement; } @end /* * This class */ @implementation GSKVOSetter - (void) setter: (void*)val { NSString *key; Class c = [self class]; void (*imp)(id,SEL,void*); imp = (void (*)(id,SEL,void*))[c instanceMethodForSelector: _cmd]; key = newKey(_cmd); if ([c automaticallyNotifiesObserversForKey: key] == YES) { // pre setting code here [self willChangeValueForKey: key]; (*imp)(self, _cmd, val); // post setting code here [self didChangeValueForKey: key]; } else { (*imp)(self, _cmd, val); } RELEASE(key); } - (void) setterChar: (unsigned char)val { NSString *key; Class c = [self class]; void (*imp)(id,SEL,unsigned char); imp = (void (*)(id,SEL,unsigned char))[c instanceMethodForSelector: _cmd]; key = newKey(_cmd); if ([c automaticallyNotifiesObserversForKey: key] == YES) { // pre setting code here [self willChangeValueForKey: key]; (*imp)(self, _cmd, val); // post setting code here [self didChangeValueForKey: key]; } else { (*imp)(self, _cmd, val); } RELEASE(key); } - (void) setterDouble: (double)val { NSString *key; Class c = [self class]; void (*imp)(id,SEL,double); imp = (void (*)(id,SEL,double))[c instanceMethodForSelector: _cmd]; key = newKey(_cmd); if ([c automaticallyNotifiesObserversForKey: key] == YES) { // pre setting code here [self willChangeValueForKey: key]; (*imp)(self, _cmd, val); // post setting code here [self didChangeValueForKey: key]; } else { (*imp)(self, _cmd, val); } RELEASE(key); } - (void) setterFloat: (float)val { NSString *key; Class c = [self class]; void (*imp)(id,SEL,float); imp = (void (*)(id,SEL,float))[c instanceMethodForSelector: _cmd]; key = newKey(_cmd); if ([c automaticallyNotifiesObserversForKey: key] == YES) { // pre setting code here [self willChangeValueForKey: key]; (*imp)(self, _cmd, val); // post setting code here [self didChangeValueForKey: key]; } else { (*imp)(self, _cmd, val); } RELEASE(key); } - (void) setterInt: (unsigned int)val { NSString *key; Class c = [self class]; void (*imp)(id,SEL,unsigned int); imp = (void (*)(id,SEL,unsigned int))[c instanceMethodForSelector: _cmd]; key = newKey(_cmd); if ([c automaticallyNotifiesObserversForKey: key] == YES) { // pre setting code here [self willChangeValueForKey: key]; (*imp)(self, _cmd, val); // post setting code here [self didChangeValueForKey: key]; } else { (*imp)(self, _cmd, val); } RELEASE(key); } - (void) setterLong: (unsigned long)val { NSString *key; Class c = [self class]; void (*imp)(id,SEL,unsigned long); imp = (void (*)(id,SEL,unsigned long))[c instanceMethodForSelector: _cmd]; key = newKey(_cmd); if ([c automaticallyNotifiesObserversForKey: key] == YES) { // pre setting code here [self willChangeValueForKey: key]; (*imp)(self, _cmd, val); // post setting code here [self didChangeValueForKey: key]; } else { (*imp)(self, _cmd, val); } RELEASE(key); } #ifdef _C_LNG_LNG - (void) setterLongLong: (unsigned long long)val { NSString *key; Class c = [self class]; void (*imp)(id,SEL,unsigned long long); imp = (void (*)(id,SEL,unsigned long long)) [c instanceMethodForSelector: _cmd]; key = newKey(_cmd); if ([c automaticallyNotifiesObserversForKey: key] == YES) { // pre setting code here [self willChangeValueForKey: key]; (*imp)(self, _cmd, val); // post setting code here [self didChangeValueForKey: key]; } else { (*imp)(self, _cmd, val); } RELEASE(key); } #endif - (void) setterShort: (unsigned short)val { NSString *key; Class c = [self class]; void (*imp)(id,SEL,unsigned short); imp = (void (*)(id,SEL,unsigned short))[c instanceMethodForSelector: _cmd]; key = newKey(_cmd); if ([c automaticallyNotifiesObserversForKey: key] == YES) { // pre setting code here [self willChangeValueForKey: key]; (*imp)(self, _cmd, val); // post setting code here [self didChangeValueForKey: key]; } else { (*imp)(self, _cmd, val); } RELEASE(key); } - (void) setterRange: (NSRange)val { NSString *key; Class c = [self class]; void (*imp)(id,SEL,NSRange); imp = (void (*)(id,SEL,NSRange))[c instanceMethodForSelector: _cmd]; key = newKey(_cmd); if ([c automaticallyNotifiesObserversForKey: key] == YES) { // pre setting code here [self willChangeValueForKey: key]; (*imp)(self, _cmd, val); // post setting code here [self didChangeValueForKey: key]; } else { (*imp)(self, _cmd, val); } RELEASE(key); } - (void) setterPoint: (NSPoint)val { NSString *key; Class c = [self class]; void (*imp)(id,SEL,NSPoint); imp = (void (*)(id,SEL,NSPoint))[c instanceMethodForSelector: _cmd]; key = newKey(_cmd); if ([c automaticallyNotifiesObserversForKey: key] == YES) { // pre setting code here [self willChangeValueForKey: key]; (*imp)(self, _cmd, val); // post setting code here [self didChangeValueForKey: key]; } else { (*imp)(self, _cmd, val); } RELEASE(key); } - (void) setterSize: (NSSize)val { NSString *key; Class c = [self class]; void (*imp)(id,SEL,NSSize); imp = (void (*)(id,SEL,NSSize))[c instanceMethodForSelector: _cmd]; key = newKey(_cmd); if ([c automaticallyNotifiesObserversForKey: key] == YES) { // pre setting code here [self willChangeValueForKey: key]; (*imp)(self, _cmd, val); // post setting code here [self didChangeValueForKey: key]; } else { (*imp)(self, _cmd, val); } RELEASE(key); } - (void) setterRect: (NSRect)val { NSString *key; Class c = [self class]; void (*imp)(id,SEL,NSRect); imp = (void (*)(id,SEL,NSRect))[c instanceMethodForSelector: _cmd]; key = newKey(_cmd); if ([c automaticallyNotifiesObserversForKey: key] == YES) { // pre setting code here [self willChangeValueForKey: key]; (*imp)(self, _cmd, val); // post setting code here [self didChangeValueForKey: key]; } else { (*imp)(self, _cmd, val); } RELEASE(key); } @end @implementation GSKVOObservation @end @implementation GSKVOPathInfo - (void) dealloc { [change release]; [observations release]; [super dealloc]; } - (id) init { change = [NSMutableDictionary new]; observations = [NSMutableArray new]; return self; } - (void) notifyForKey: (NSString *)aKey ofInstance: (id)instance prior: (BOOL)f { unsigned count; id oldValue; id newValue; if (f == YES) { if ((allOptions & NSKeyValueObservingOptionPrior) == 0) { return; // Nothing to do. } [change setObject: [NSNumber numberWithBool: YES] forKey: NSKeyValueChangeNotificationIsPriorKey]; } else { [change removeObjectForKey: NSKeyValueChangeNotificationIsPriorKey]; } oldValue = [[change objectForKey: NSKeyValueChangeOldKey] retain]; if (oldValue == nil) { oldValue = null; } newValue = [[change objectForKey: NSKeyValueChangeNewKey] retain]; if (newValue == nil) { newValue = null; } /* Retain self so that we won't be deallocated during the * notification process. */ [self retain]; count = [observations count]; while (count-- > 0) { GSKVOObservation *o = [observations objectAtIndex: count]; if (f == YES) { if ((o->options & NSKeyValueObservingOptionPrior) == 0) { continue; } } else { if (o->options & NSKeyValueObservingOptionNew) { [change setObject: newValue forKey: NSKeyValueChangeNewKey]; } } if (o->options & NSKeyValueObservingOptionOld) { [change setObject: oldValue forKey: NSKeyValueChangeOldKey]; } [o->observer observeValueForKeyPath: aKey ofObject: instance change: change context: o->context]; } [change setObject: oldValue forKey: NSKeyValueChangeOldKey]; [oldValue release]; [change setObject: newValue forKey: NSKeyValueChangeNewKey]; [newValue release]; [self release]; } @end @implementation GSKVOInfo - (NSObject*) instance { return instance; } /* Locks receiver and returns path info on success, otherwise leaves * receiver unlocked and returns nil. * The returned path info is retained and autoreleased in case something * removes it from the receiver while it's being used by the caller. */ - (GSKVOPathInfo*) lockReturningPathInfoForKey: (NSString*)key { GSKVOPathInfo *pathInfo; [iLock lock]; pathInfo = AUTORELEASE(RETAIN((GSKVOPathInfo*)NSMapGet(paths, (void*)key))); if (pathInfo == nil) { [iLock unlock]; } return pathInfo; } - (void) unlock { [iLock unlock]; } - (void) addObserver: (NSObject*)anObserver forKeyPath: (NSString*)aPath options: (NSKeyValueObservingOptions)options context: (void*)aContext { GSKVOPathInfo *pathInfo; GSKVOObservation *observation; unsigned count; if ([anObserver respondsToSelector: @selector(observeValueForKeyPath:ofObject:change:context:)] == NO) { return; } [iLock lock]; pathInfo = (GSKVOPathInfo*)NSMapGet(paths, (void*)aPath); if (pathInfo == nil) { pathInfo = [GSKVOPathInfo new]; // use immutable object for map key aPath = [aPath copy]; NSMapInsert(paths, (void*)aPath, (void*)pathInfo); [pathInfo release]; [aPath release]; } observation = nil; pathInfo->allOptions = 0; count = [pathInfo->observations count]; while (count-- > 0) { GSKVOObservation *o; o = [pathInfo->observations objectAtIndex: count]; if (o->observer == anObserver) { o->context = aContext; o->options = options; observation = o; } pathInfo->allOptions |= o->options; } if (observation == nil) { observation = [GSKVOObservation new]; GSAssignZeroingWeakPointer((void**)&observation->observer, (void*)anObserver); observation->context = aContext; observation->options = options; [pathInfo->observations addObject: observation]; [observation release]; pathInfo->allOptions |= options; } if (options & NSKeyValueObservingOptionInitial) { /* If the NSKeyValueObservingOptionInitial option is set, * we must send an immediate notification containing the * existing value in the NSKeyValueChangeNewKey */ [pathInfo->change setObject: [NSNumber numberWithInt: 1] forKey: NSKeyValueChangeKindKey]; if (options & NSKeyValueObservingOptionNew) { id value; value = [instance valueForKeyPath: aPath]; if (value == nil) { value = null; } [pathInfo->change setObject: value forKey: NSKeyValueChangeNewKey]; } [anObserver observeValueForKeyPath: aPath ofObject: instance change: pathInfo->change context: aContext]; } [iLock unlock]; } - (void) dealloc { if (paths != 0) NSFreeMapTable(paths); RELEASE(iLock); [super dealloc]; } - (id) initWithInstance: (NSObject*)i { instance = i; paths = NSCreateMapTable(NSObjectMapKeyCallBacks, NSObjectMapValueCallBacks, 8); iLock = [NSRecursiveLock new]; return self; } - (BOOL) isUnobserved { BOOL result = NO; [iLock lock]; if (NSCountMapTable(paths) == 0) { result = YES; } [iLock unlock]; return result; } /* * removes the observer */ - (void) removeObserver: (NSObject*)anObserver forKeyPath: (NSString*)aPath { GSKVOPathInfo *pathInfo; [iLock lock]; pathInfo = (GSKVOPathInfo*)NSMapGet(paths, (void*)aPath); if (pathInfo != nil) { unsigned count = [pathInfo->observations count]; pathInfo->allOptions = 0; while (count-- > 0) { GSKVOObservation *o; o = [pathInfo->observations objectAtIndex: count]; if (o->observer == anObserver || o->observer == nil) { [pathInfo->observations removeObjectAtIndex: count]; if ([pathInfo->observations count] == 0) { NSMapRemove(paths, (void*)aPath); } } else { pathInfo->allOptions |= o->options; } } } [iLock unlock]; } - (void*) contextForObserver: (NSObject*)anObserver ofKeyPath: (NSString*)aPath { GSKVOPathInfo *pathInfo; void *context = 0; [iLock lock]; pathInfo = (GSKVOPathInfo*)NSMapGet(paths, (void*)aPath); if (pathInfo != nil) { unsigned count = [pathInfo->observations count]; while (count-- > 0) { GSKVOObservation *o; o = [pathInfo->observations objectAtIndex: count]; if (o->observer == anObserver) { context = o->context; break; } } } [iLock unlock]; return context; } @end @implementation NSKeyValueObservationForwarder - (id) initWithKeyPath: (NSString *)keyPath ofObject: (id)object withTarget: (id)aTarget context: (void *)context { NSString *remainingKeyPath; NSRange dot; if (nil == (self = [super init])) { return nil; } target = aTarget; keyPathToForward = [keyPath copy]; contextToForward = context; dot = [keyPath rangeOfString: @"."]; if (dot.location == NSNotFound) { [NSException raise: NSInvalidArgumentException format: @"NSKeyValueObservationForwarder was not given a key path"]; } keyForUpdate = [[keyPath substringToIndex: dot.location] copy]; remainingKeyPath = [keyPath substringFromIndex: dot.location + 1]; observedObjectForUpdate = object; [object addObserver: self forKeyPath: keyForUpdate options: NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context: target]; dot = [remainingKeyPath rangeOfString: @"."]; if (dot.location != NSNotFound) { child = [[NSKeyValueObservationForwarder alloc] initWithKeyPath: remainingKeyPath ofObject: [object valueForKey: keyForUpdate] withTarget: self context: NULL]; observedObjectForForwarding = nil; } else { keyForForwarding = [remainingKeyPath copy]; observedObjectForForwarding = [object valueForKey: keyForUpdate]; [observedObjectForForwarding addObserver: self forKeyPath: keyForForwarding options: NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context: target]; child = nil; } return self; } - (void) finalize { if (child) { [child finalize]; } if (observedObjectForUpdate) { [observedObjectForUpdate removeObserver: self forKeyPath: keyForUpdate]; } if (observedObjectForForwarding) { [observedObjectForForwarding removeObserver: self forKeyPath: keyForForwarding]; } DESTROY(self); } - (void) dealloc { [keyForUpdate release]; [keyForForwarding release]; [keyPathToForward release]; [super dealloc]; } - (void) observeValueForKeyPath: (NSString *)keyPath ofObject: (id)anObject change: (NSDictionary *)change context: (void *)context { if (anObject == observedObjectForUpdate) { [self keyPathChanged: nil]; } else { [target observeValueForKeyPath: keyPathToForward ofObject: observedObjectForUpdate change: change context: contextToForward]; } } - (void) keyPathChanged: (id)objectToObserve { if (objectToObserve != nil) { [observedObjectForUpdate removeObserver: self forKeyPath: keyForUpdate]; observedObjectForUpdate = objectToObserve; [objectToObserve addObserver: self forKeyPath: keyForUpdate options: NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context: target]; } if (child != nil) { [child keyPathChanged: [observedObjectForUpdate valueForKey: keyForUpdate]]; } else { NSMutableDictionary *change; change = [NSMutableDictionary dictionaryWithObject: [NSNumber numberWithInt: 1] forKey: NSKeyValueChangeKindKey]; if (observedObjectForForwarding != nil) { id oldValue; oldValue = [observedObjectForForwarding valueForKey: keyForForwarding]; [observedObjectForForwarding removeObserver: self forKeyPath: keyForForwarding]; if (oldValue) { [change setObject: oldValue forKey: NSKeyValueChangeOldKey]; } } observedObjectForForwarding = [observedObjectForUpdate valueForKey:keyForUpdate]; if (observedObjectForForwarding != nil) { id newValue; [observedObjectForForwarding addObserver: self forKeyPath: keyForForwarding options: NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context: target]; //prepare change notification newValue = [observedObjectForForwarding valueForKey: keyForForwarding]; if (newValue) { [change setObject: newValue forKey: NSKeyValueChangeNewKey]; } } [target observeValueForKeyPath: keyPathToForward ofObject: observedObjectForUpdate change: change context: contextToForward]; } } @end @implementation NSObject (NSKeyValueObserving) - (void) observeValueForKeyPath: (NSString*)aPath ofObject: (id)anObject change: (NSDictionary*)aChange context: (void*)aContext { [NSException raise: NSInvalidArgumentException format: @"-%@ cannot be sent to %@ ..." @" create an instance overriding this", NSStringFromSelector(_cmd), NSStringFromClass([self class])]; return; } @end @implementation NSObject (NSKeyValueObserverRegistration) - (void) addObserver: (NSObject*)anObserver forKeyPath: (NSString*)aPath options: (NSKeyValueObservingOptions)options context: (void*)aContext { GSKVOInfo *info; GSKVOReplacement *r; NSKeyValueObservationForwarder *forwarder; NSRange dot; setup(); [kvoLock lock]; // Use the original class r = replacementForClass([self class]); /* * Get the existing observation information, creating it (and changing * the receiver to start key-value-observing by switching its class) * if necessary. */ info = (GSKVOInfo*)[self observationInfo]; if (info == nil) { info = [[GSKVOInfo alloc] initWithInstance: self]; [self setObservationInfo: info]; object_setClass(self, [r replacement]); } /* * Now add the observer. */ dot = [aPath rangeOfString:@"."]; if (dot.location != NSNotFound) { forwarder = [[NSKeyValueObservationForwarder alloc] initWithKeyPath: aPath ofObject: self withTarget: anObserver context: aContext]; [info addObserver: anObserver forKeyPath: aPath options: options context: forwarder]; } else { [r overrideSetterFor: aPath]; [info addObserver: anObserver forKeyPath: aPath options: options context: aContext]; } [kvoLock unlock]; } - (void) removeObserver: (NSObject*)anObserver forKeyPath: (NSString*)aPath { GSKVOInfo *info; id forwarder; /* * Get the observation information and remove this observation. */ info = (GSKVOInfo*)[self observationInfo]; forwarder = [info contextForObserver: anObserver ofKeyPath: aPath]; [info removeObserver: anObserver forKeyPath: aPath]; if ([info isUnobserved] == YES) { /* * The instance is no longer being observed ... so we can * turn off key-value-observing for it. */ object_setClass(self, [self class]); IF_NO_ARC(AUTORELEASE(info);) [self setObservationInfo: nil]; } if ([aPath rangeOfString:@"."].location != NSNotFound) [forwarder finalize]; } @end /** * NSArray objects are not observable, so the registration methods * raise an exception. */ @implementation NSArray (NSKeyValueObserverRegistration) - (void) addObserver: (NSObject*)anObserver forKeyPath: (NSString*)aPath options: (NSKeyValueObservingOptions)options context: (void*)aContext { [NSException raise: NSGenericException format: @"[%@-%@]: This class is not observable", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; } - (void) addObserver: (NSObject*)anObserver toObjectsAtIndexes: (NSIndexSet*)indexes forKeyPath: (NSString*)aPath options: (NSKeyValueObservingOptions)options context: (void*)aContext { NSUInteger i = [indexes firstIndex]; while (i != NSNotFound) { NSObject *elem = [self objectAtIndex: i]; [elem addObserver: anObserver forKeyPath: aPath options: options context: aContext]; i = [indexes indexGreaterThanIndex: i]; } } - (void) removeObserver: (NSObject*)anObserver forKeyPath: (NSString*)aPath { [NSException raise: NSGenericException format: @"[%@-%@]: This class is not observable", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; } - (void) removeObserver: (NSObject*)anObserver fromObjectsAtIndexes: (NSIndexSet*)indexes forKeyPath: (NSString*)aPath { NSUInteger i = [indexes firstIndex]; while (i != NSNotFound) { NSObject *elem = [self objectAtIndex: i]; [elem removeObserver: anObserver forKeyPath: aPath]; i = [indexes indexGreaterThanIndex: i]; } } @end /** * NSSet objects are not observable, so the registration methods * raise an exception. */ @implementation NSSet (NSKeyValueObserverRegistration) - (void) addObserver: (NSObject*)anObserver forKeyPath: (NSString*)aPath options: (NSKeyValueObservingOptions)options context: (void*)aContext { [NSException raise: NSGenericException format: @"[%@-%@]: This class is not observable", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; } - (void) removeObserver: (NSObject*)anObserver forKeyPath: (NSString*)aPath { [NSException raise: NSGenericException format: @"[%@-%@]: This class is not observable", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; } @end @implementation NSObject (NSKeyValueObserverNotification) - (void) willChangeValueForDependentsOfKey: (NSString *)aKey { NSMapTable *keys = NSMapGet(dependentKeyTable, [self class]); if (keys != nil) { NSHashTable *dependents = NSMapGet(keys, aKey); if (dependents != 0) { NSString *dependentKey; NSHashEnumerator dependentKeyEnum; dependentKeyEnum = NSEnumerateHashTable(dependents); while ((dependentKey = NSNextHashEnumeratorItem(&dependentKeyEnum))) { [self willChangeValueForKey: dependentKey]; } NSEndHashTableEnumeration(&dependentKeyEnum); } } } - (void) didChangeValueForDependentsOfKey: (NSString *)aKey { NSMapTable *keys = NSMapGet(dependentKeyTable, [self class]); if (keys != nil) { NSHashTable *dependents = NSMapGet(keys, aKey); if (dependents != nil) { NSString *dependentKey; NSHashEnumerator dependentKeyEnum; dependentKeyEnum = NSEnumerateHashTable(dependents); while ((dependentKey = NSNextHashEnumeratorItem(&dependentKeyEnum))) { [self didChangeValueForKey: dependentKey]; } NSEndHashTableEnumeration(&dependentKeyEnum); } } } - (void) willChangeValueForKey: (NSString*)aKey { GSKVOPathInfo *pathInfo; GSKVOInfo *info; info = (GSKVOInfo *)[self observationInfo]; if (info == nil) { return; } pathInfo = [info lockReturningPathInfoForKey: aKey]; if (pathInfo != nil) { if (pathInfo->recursion++ == 0) { id old = [pathInfo->change objectForKey: NSKeyValueChangeNewKey]; if (old != nil) { /* We have set a value for this key already, so the value * we set must now be the old value and we don't need to * refetch it. */ [pathInfo->change setObject: old forKey: NSKeyValueChangeOldKey]; [pathInfo->change removeObjectForKey: NSKeyValueChangeNewKey]; } else if (pathInfo->allOptions & NSKeyValueObservingOptionOld) { /* We don't have an old value set, so we must fetch the * existing value because at least one observation wants it. */ old = [self valueForKey: aKey]; if (old == nil) { old = null; } [pathInfo->change setObject: old forKey: NSKeyValueChangeOldKey]; } [pathInfo->change setValue: [NSNumber numberWithInt: NSKeyValueChangeSetting] forKey: NSKeyValueChangeKindKey]; [pathInfo notifyForKey: aKey ofInstance: [info instance] prior: YES]; } [info unlock]; } [self willChangeValueForDependentsOfKey: aKey]; } - (void) didChangeValueForKey: (NSString*)aKey { GSKVOPathInfo *pathInfo; GSKVOInfo *info; info = (GSKVOInfo *)[self observationInfo]; if (info == nil) { return; } pathInfo = [info lockReturningPathInfoForKey: aKey]; if (pathInfo != nil) { if (pathInfo->recursion == 1) { id value = [self valueForKey: aKey]; if (value == nil) { value = null; } [pathInfo->change setValue: value forKey: NSKeyValueChangeNewKey]; [pathInfo->change setValue: [NSNumber numberWithInt: NSKeyValueChangeSetting] forKey: NSKeyValueChangeKindKey]; [pathInfo notifyForKey: aKey ofInstance: [info instance] prior: NO]; } if (pathInfo->recursion > 0) { pathInfo->recursion--; } [info unlock]; } [self didChangeValueForDependentsOfKey: aKey]; } - (void) didChange: (NSKeyValueChange)changeKind valuesAtIndexes: (NSIndexSet*)indexes forKey: (NSString*)aKey { GSKVOPathInfo *pathInfo; GSKVOInfo *info; info = [self observationInfo]; if (info == nil) { return; } pathInfo = [info lockReturningPathInfoForKey: aKey]; if (pathInfo != nil) { if (pathInfo->recursion == 1) { NSMutableArray *array; array = [self valueForKey: aKey]; [pathInfo->change setValue: [NSNumber numberWithInt: changeKind] forKey: NSKeyValueChangeKindKey]; [pathInfo->change setValue: indexes forKey: NSKeyValueChangeIndexesKey]; if (changeKind == NSKeyValueChangeInsertion || changeKind == NSKeyValueChangeReplacement) { [pathInfo->change setValue: [array objectsAtIndexes: indexes] forKey: NSKeyValueChangeNewKey]; } [pathInfo notifyForKey: aKey ofInstance: [info instance] prior: NO]; } if (pathInfo->recursion > 0) { pathInfo->recursion--; } [info unlock]; } [self didChangeValueForDependentsOfKey: aKey]; } - (void) willChange: (NSKeyValueChange)changeKind valuesAtIndexes: (NSIndexSet*)indexes forKey: (NSString*)aKey { GSKVOPathInfo *pathInfo; GSKVOInfo *info; info = [self observationInfo]; if (info == nil) { return; } pathInfo = [info lockReturningPathInfoForKey: aKey]; if (pathInfo != nil) { if (pathInfo->recursion++ == 0) { NSMutableArray *array; array = [self valueForKey: aKey]; if (changeKind == NSKeyValueChangeRemoval || changeKind == NSKeyValueChangeReplacement) { [pathInfo->change setValue: [array objectsAtIndexes: indexes] forKey: NSKeyValueChangeOldKey]; } [pathInfo->change setValue: [NSNumber numberWithInt: changeKind] forKey: NSKeyValueChangeKindKey]; [pathInfo notifyForKey: aKey ofInstance: [info instance] prior: YES]; } [info unlock]; } [self willChangeValueForDependentsOfKey: aKey]; } - (void) willChangeValueForKey: (NSString*)aKey withSetMutation: (NSKeyValueSetMutationKind)mutationKind usingObjects: (NSSet*)objects { GSKVOPathInfo *pathInfo; GSKVOInfo *info; info = [self observationInfo]; if (info == nil) { return; } pathInfo = [info lockReturningPathInfoForKey: aKey]; if (pathInfo != nil) { if (pathInfo->recursion++ == 0) { id set = objects; if (nil == set) { set = [self valueForKey: aKey]; } set = [set mutableCopy]; [pathInfo->change setValue: set forKey: @"oldSet"]; RELEASE(set); [pathInfo notifyForKey: aKey ofInstance: [info instance] prior: YES]; } [info unlock]; } [self willChangeValueForDependentsOfKey: aKey]; } - (void) didChangeValueForKey: (NSString*)aKey withSetMutation: (NSKeyValueSetMutationKind)mutationKind usingObjects: (NSSet*)objects { GSKVOPathInfo *pathInfo; GSKVOInfo *info; info = [self observationInfo]; if (info == nil) { return; } pathInfo = [info lockReturningPathInfoForKey: aKey]; if (pathInfo != nil) { if (pathInfo->recursion == 1) { NSMutableSet *oldSet; id set = objects; oldSet = RETAIN([pathInfo->change valueForKey: @"oldSet"]); if (nil == set) { set = [self valueForKey: aKey]; } [pathInfo->change removeObjectForKey: @"oldSet"]; if (mutationKind == NSKeyValueUnionSetMutation) { set = [set mutableCopy]; [set minusSet: oldSet]; [pathInfo->change setValue: [NSNumber numberWithInt: NSKeyValueChangeInsertion] forKey: NSKeyValueChangeKindKey]; [pathInfo->change setValue: set forKey: NSKeyValueChangeNewKey]; RELEASE(set); } else if (mutationKind == NSKeyValueMinusSetMutation || mutationKind == NSKeyValueIntersectSetMutation) { [oldSet minusSet: set]; [pathInfo->change setValue: [NSNumber numberWithInt: NSKeyValueChangeRemoval] forKey: NSKeyValueChangeKindKey]; [pathInfo->change setValue: oldSet forKey: NSKeyValueChangeOldKey]; } else if (mutationKind == NSKeyValueSetSetMutation) { NSMutableSet *old; NSMutableSet *new; old = [oldSet mutableCopy]; [old minusSet: set]; new = [set mutableCopy]; [new minusSet: oldSet]; [pathInfo->change setValue: [NSNumber numberWithInt: NSKeyValueChangeReplacement] forKey: NSKeyValueChangeKindKey]; [pathInfo->change setValue: old forKey: NSKeyValueChangeOldKey]; [pathInfo->change setValue: new forKey: NSKeyValueChangeNewKey]; RELEASE(old); RELEASE(new); } RELEASE(oldSet); [pathInfo notifyForKey: aKey ofInstance: [info instance] prior: NO]; } if (pathInfo->recursion > 0) { pathInfo->recursion--; } [info unlock]; } [self didChangeValueForDependentsOfKey: aKey]; } @end @implementation NSObject (NSKeyValueObservingCustomization) + (BOOL) automaticallyNotifiesObserversForKey: (NSString*)aKey { return YES; } + (void) setKeys: (NSArray*)triggerKeys triggerChangeNotificationsForDependentKey: (NSString*)dependentKey { NSMapTable *affectingKeys; NSEnumerator *enumerator; NSString *affectingKey; setup(); affectingKeys = NSMapGet(dependentKeyTable, self); if (!affectingKeys) { affectingKeys = NSCreateMapTable(NSObjectMapKeyCallBacks, NSNonOwnedPointerMapValueCallBacks, 10); NSMapInsert(dependentKeyTable, self, affectingKeys); } enumerator = [triggerKeys objectEnumerator]; while ((affectingKey = [enumerator nextObject])) { NSHashTable *dependentKeys = NSMapGet(affectingKeys, affectingKey); if (!dependentKeys) { dependentKeys = NSCreateHashTable(NSObjectHashCallBacks, 10); NSMapInsert(affectingKeys, affectingKey, dependentKeys); } NSHashInsert(dependentKeys, dependentKey); } } + (NSSet*) keyPathsForValuesAffectingValueForKey: (NSString*)dependentKey { NSString *selString = [NSString stringWithFormat: @"keyPathsForValuesAffecting%@", [dependentKey capitalizedString]]; SEL sel = NSSelectorFromString(selString); NSMapTable *affectingKeys; NSEnumerator *enumerator; NSString *affectingKey; NSMutableSet *keyPaths; if ([self respondsToSelector: sel]) { return [self performSelector: sel]; } affectingKeys = NSMapGet(dependentKeyTable, self); keyPaths = [[NSMutableSet alloc] initWithCapacity: [affectingKeys count]]; enumerator = [affectingKeys keyEnumerator]; while ((affectingKey = [enumerator nextObject])) { [keyPaths addObject: affectingKey]; } return AUTORELEASE(keyPaths); } - (void*) observationInfo { void *info; setup(); [kvoLock lock]; info = NSMapGet(infoTable, (void*)self); IF_NO_ARC(AUTORELEASE(RETAIN((id)info));) [kvoLock unlock]; return info; } - (void) setObservationInfo: (void*)observationInfo { setup(); [kvoLock lock]; if (observationInfo == 0) { NSMapRemove(infoTable, (void*)self); } else { NSMapInsert(infoTable, (void*)self, observationInfo); } [kvoLock unlock]; } @end gnustep-base-1.29.0/Source/NSKeyedArchiver.m000066400000000000000000000643321435650067400206260ustar00rootroot00000000000000/** Implementation for NSKeyedArchiver for GNUstep Copyright (C) 2004 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: January 2004 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #define EXPOSE_NSKeyedArchiver_IVARS 1 #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSData.h" #import "Foundation/NSException.h" #import "Foundation/NSScanner.h" #import "Foundation/NSValue.h" #import "GSPrivate.h" @class GSString; /* * Setup for inline operation of pointer map tables. */ #define GSI_MAP_KTYPES GSUNION_PTR | GSUNION_OBJ | GSUNION_CLS | GSUNION_NSINT #define GSI_MAP_VTYPES GSUNION_PTR | GSUNION_OBJ | GSUNION_NSINT #define GSI_MAP_RETAIN_VAL(M, X) #define GSI_MAP_RELEASE_VAL(M, X) #define GSI_MAP_HASH(M, X) ((X).nsu) #define GSI_MAP_EQUAL(M, X,Y) ((X).ptr == (Y).ptr) #undef GSI_MAP_NOCLEAN #define GSI_MAP_RETAIN_KEY(M, X) RETAIN(X.obj) #define GSI_MAP_RELEASE_KEY(M, X) RELEASE(X.obj) #include "GNUstepBase/GSIMap.h" #define _IN_NSKEYEDARCHIVER_M 1 #import "Foundation/NSKeyedArchiver.h" #undef _IN_NSKEYEDARCHIVER_M static NSMapTable *globalClassMap = 0; static Class NSStringClass = 0; static Class NSScannerClass = 0; static SEL scanFloatSel; static SEL scanStringSel; static SEL scannerSel; static BOOL (*scanFloatImp)(NSScanner*, SEL, CGFloat*); static BOOL (*scanStringImp)(NSScanner*, SEL, NSString*, NSString**); static id (*scannerImp)(Class, SEL, NSString*); static inline void setupCache(void) { if (NSStringClass == 0) { NSStringClass = [NSString class]; NSScannerClass = [NSScanner class]; if (sizeof(CGFloat) == sizeof(double)) { scanFloatSel = @selector(scanDouble:); } else { scanFloatSel = @selector(scanFloat:); } scanStringSel = @selector(scanString:intoString:); scannerSel = @selector(scannerWithString:); scanFloatImp = (BOOL (*)(NSScanner*, SEL, CGFloat*)) [NSScannerClass instanceMethodForSelector: scanFloatSel]; scanStringImp = (BOOL (*)(NSScanner*, SEL, NSString*, NSString**)) [NSScannerClass instanceMethodForSelector: scanStringSel]; scannerImp = (id (*)(Class, SEL, NSString*)) [NSScannerClass methodForSelector: scannerSel]; } } #define CHECKKEY \ if ([aKey isKindOfClass: [NSString class]] == NO) \ { \ [NSException raise: NSInvalidArgumentException \ format: @"%@, bad key '%@' in %@", \ NSStringFromClass([self class]), aKey, NSStringFromSelector(_cmd)]; \ } \ if ([aKey hasPrefix: @"$"] == YES) \ { \ aKey = [@"$" stringByAppendingString: aKey]; \ } \ if ([_enc objectForKey: aKey] != nil) \ { \ [NSException raise: NSInvalidArgumentException \ format: @"%@, duplicate key '%@' in %@", \ NSStringFromClass([self class]), aKey, NSStringFromSelector(_cmd)]; \ } /* * Make a dictionary referring to the object at ref in the array of all objects. */ static NSDictionary *makeReference(unsigned ref) { NSNumber *n; NSDictionary *d; n = [NSNumber numberWithUnsignedInt: ref]; d = [NSDictionary dictionaryWithObject: n forKey: @"CF$UID"]; return d; } @interface NSKeyedArchiver (Private) - (id) _encodeObject: (id)anObject conditional: (BOOL)conditional; @end @implementation NSKeyedArchiver (Internal) /** * Internal method used to encode an array relatively efficiently.
* Some MacOS-X library classes seem to use this. */ - (void) _encodeArrayOfObjects: (NSArray*)anArray forKey: (NSString*)aKey { id o; CHECKKEY if (anArray == nil) { o = makeReference(0); } else { NSMutableArray *m; unsigned c; unsigned i; c = [anArray count]; m = [NSMutableArray arrayWithCapacity: c]; for (i = 0; i < c; i++) { o = [self _encodeObject: [anArray objectAtIndex: i] conditional: NO]; [m addObject: o]; } o = m; } [_enc setObject: o forKey: aKey]; } - (void) _encodePropertyList: (id)anObject forKey: (NSString*)aKey { CHECKKEY [_enc setObject: anObject forKey: aKey]; } @end @implementation NSKeyedArchiver (Private) /* * The real workhorse of the archiving process ... this deals with all * archiving of objects. It returns the object to be stored in the * mapping dictionary (_enc). */ - (id) _encodeObject: (id)anObject conditional: (BOOL)conditional { id original = anObject; GSIMapNode node; id objectInfo = nil; // Encoded object NSMutableDictionary *m = nil; NSDictionary *refObject; unsigned ref = 0; // Reference to nil if (anObject != nil) { /* * Obtain replacement object for the value being encoded. * Notify delegate of progress and set up new mapping if necessary. */ node = GSIMapNodeForKey(_repMap, (GSIMapKey)anObject); if (node == 0) { anObject = [original replacementObjectForKeyedArchiver: self]; if (_delegate != nil) { if (anObject != nil) { anObject = [_delegate archiver: self willEncodeObject: anObject]; } if (original != anObject) { [_delegate archiver: self willReplaceObject: original withObject: anObject]; } } GSIMapAddPair(_repMap, (GSIMapKey)original, (GSIMapVal)anObject); } else { /* * If the object has a replacement, use it. */ anObject = node->value.obj; } } if (anObject != nil) { node = GSIMapNodeForKey(_uIdMap, (GSIMapKey)anObject); if (node == 0) { if (conditional == YES) { node = GSIMapNodeForKey(_cIdMap, (GSIMapKey)anObject); if (node == 0) { ref = [_obj count]; GSIMapAddPair(_cIdMap, (GSIMapKey)anObject, (GSIMapVal)(NSUInteger)ref); /* * Use the null object as a placeholder for a conditionally * encoded object. */ [_obj addObject: [_obj objectAtIndex: 0]]; } else { /* * This object has already been conditionally encoded. */ ref = node->value.nsu; } } else { Class c = [anObject classForKeyedArchiver]; // FIXME ... exactly what classes are stored directly??? if (c == [NSString class] || c == [NSNumber class] || c == [NSDate class] || c == [NSData class] ) { objectInfo = anObject; } else { // We store a dictionary describing the object. m = [NSMutableDictionary new]; objectInfo = m; } node = GSIMapNodeForKey(_cIdMap, (GSIMapKey)anObject); if (node == 0) { /* * Not encoded ... create dictionary for it. */ ref = [_obj count]; GSIMapAddPair(_uIdMap, (GSIMapKey)anObject, (GSIMapVal)(NSUInteger)ref); [_obj addObject: objectInfo]; } else { /* * Conditionally encoded ... replace with actual value. */ ref = node->value.nsu; GSIMapAddPair(_uIdMap, (GSIMapKey)anObject, (GSIMapVal)(NSUInteger)ref); GSIMapRemoveKey(_cIdMap, (GSIMapKey)anObject); [_obj replaceObjectAtIndex: ref withObject: objectInfo]; } RELEASE(m); } } else { ref = node->value.nsu; } } /* * Build an object to reference the encoded value of anObject */ refObject = makeReference(ref); /* * objectInfo is a dictionary describing the object. */ if (objectInfo != nil && m == objectInfo) { NSMutableDictionary *savedEnc = _enc; unsigned savedKeyNum = _keyNum; Class c = [anObject class]; NSString *classname; Class mapped; /* * Map the class of the object to the actual class it is encoded as. * First ask the object, then apply any name mappings to that value. */ mapped = [anObject classForKeyedArchiver]; if (mapped != nil) { c = mapped; } classname = [self classNameForClass: c]; if (classname == nil) { classname = [[self class] classNameForClass: c]; } if (classname == nil) { classname = NSStringFromClass(c); } else { c = NSClassFromString(classname); } /* * At last, get the object to encode itself. Save and restore the * current object scope of course. */ _enc = m; _keyNum = 0; [anObject encodeWithCoder: self]; _keyNum = savedKeyNum; _enc = savedEnc; /* * This is ugly, but it seems to be the way MacOS-X does it ... * We create class information by storing it directly into the * table of all objects, and making a reference so we can look * up the table entry by class pointer. * A much cleaner way to do it would be by encoding the class * normally, but we are trying to be compatible. * * Also ... we encode the class *after* encoding the instance, * simply because that seems to be the way MacOS-X does it and * we want to maximise compatibility (perhaps they had good reason?) */ node = GSIMapNodeForKey(_uIdMap, (GSIMapKey)c); if (node == 0) { NSMutableDictionary *cDict; NSMutableArray *hierarchy; ref = [_obj count]; GSIMapAddPair(_uIdMap, (GSIMapKey)c, (GSIMapVal)(NSUInteger)ref); cDict = [[NSMutableDictionary alloc] initWithCapacity: 2]; /* * record class name */ [cDict setObject: classname forKey: @"$classname"]; /* * Record the class hierarchy for this object. */ hierarchy = [NSMutableArray new]; while (c != 0) { Class next = [c superclass]; [hierarchy addObject: NSStringFromClass(c)]; if (next == c) { break; } c = next; } [cDict setObject: hierarchy forKey: @"$classes"]; RELEASE(hierarchy); [_obj addObject: cDict]; RELEASE(cDict); } else { ref = node->value.nsu; } /* * Now create a reference to the class information and store it * in the object description dictionary for the object we just encoded. */ [m setObject: makeReference(ref) forKey: @"$class"]; } /* * If we have encoded the object information, tell the delegaate. */ if (objectInfo != nil && _delegate != nil) { [_delegate archiver: self didEncodeObject: anObject]; } /* * Return the dictionary identifying the encoded object. */ return refObject; } @end @implementation NSKeyedArchiver + (NSData *) archivedDataWithRootObject: (id)anObject requiringSecureCoding: (BOOL)requiresSecureCoding error: (NSError **)error { NSData *d = nil; if (requiresSecureCoding == NO) { NSMutableData *m = nil; NSKeyedArchiver *a = nil; error = NULL; NS_DURING { m = [[NSMutableData alloc] initWithCapacity: 10240]; a = [[NSKeyedArchiver alloc] initForWritingWithMutableData: m]; [a encodeObject: anObject forKey: @"root"]; [a finishEncoding]; d = [m copy]; DESTROY(m); DESTROY(a); } NS_HANDLER { DESTROY(m); DESTROY(a); [localException raise]; } NS_ENDHANDLER; } return AUTORELEASE(d); } /* * When I tried this on MacOS 10.3 it encoded the object with the key 'root', * so this implementation does the same. */ + (NSData*) archivedDataWithRootObject: (id)anObject { return [self archivedDataWithRootObject: anObject requiringSecureCoding: NO error: NULL]; } + (BOOL) archiveRootObject: (id)anObject toFile: (NSString*)aPath { NSAutoreleasePool *pool = [NSAutoreleasePool new]; NSData *d; BOOL result; d = [self archivedDataWithRootObject: anObject]; result = [d writeToFile: aPath atomically: YES]; [pool drain]; return result; } + (NSString*) classNameForClass: (Class)aClass { return (NSString*)NSMapGet(globalClassMap, (void*)aClass); } + (void) initialize { GSMakeWeakPointer(self, "delegate"); if (globalClassMap == 0) { globalClassMap = NSCreateMapTable(NSNonOwnedPointerMapKeyCallBacks, NSObjectMapValueCallBacks, 0); [[NSObject leakAt: &globalClassMap] release]; } } + (void) setClassName: (NSString*)aString forClass: (Class)aClass { if (aString == nil) { NSMapRemove(globalClassMap, (void*)aClass); } else { NSMapInsert(globalClassMap, (void*)aClass, aString); } } - (BOOL) requiresSecureCoding { return _requiresSecureCoding; } - (void) setRequiresSecureCoding: (BOOL)flag { _requiresSecureCoding = flag; } - (BOOL) allowsKeyedCoding { return YES; } - (NSString*) classNameForClass: (Class)aClass { return (NSString*)NSMapGet(_clsMap, (void*)aClass); } - (void) dealloc { RELEASE(_enc); RELEASE(_obj); RELEASE(_data); if (_clsMap != 0) { NSFreeMapTable(_clsMap); _clsMap = 0; } if (_cIdMap) { GSIMapEmptyMap(_cIdMap); if (_uIdMap) { GSIMapEmptyMap(_uIdMap); } if (_repMap) { GSIMapEmptyMap(_repMap); } NSZoneFree(_cIdMap->zone, (void*)_cIdMap); } [super dealloc]; } - (id) delegate { return _delegate; } - (NSString*) description { if (_data == nil) { // For consistency with OSX [NSException raise: NSInvalidArgumentException format: @"method sent to uninitialised archiver"]; } return [super description]; } - (void) encodeArrayOfObjCType: (const char*)aType count: (NSUInteger)aCount at: (const void*)address { id o; o = [[_NSKeyedCoderOldStyleArray alloc] initWithObjCType: aType count: aCount at: address]; [self encodeObject: o]; RELEASE(o); } - (void) encodeBool: (BOOL)aBool forKey: (NSString*)aKey { CHECKKEY [_enc setObject: [NSNumber numberWithBool: aBool] forKey: aKey]; } - (void) encodeBytes: (const uint8_t*)aPointer length: (NSUInteger)length forKey: (NSString*)aKey { CHECKKEY [_enc setObject: [NSData dataWithBytes: aPointer length: length] forKey: aKey]; } - (void) encodeConditionalObject: (id)anObject { NSString *aKey = [NSString stringWithFormat: @"$%u", _keyNum++]; anObject = [self _encodeObject: anObject conditional: YES]; [_enc setObject: anObject forKey: aKey]; } - (void) encodeConditionalObject: (id)anObject forKey: (NSString*)aKey { CHECKKEY anObject = [self _encodeObject: anObject conditional: YES]; [_enc setObject: anObject forKey: aKey]; } - (void) encodeDouble: (double)aDouble forKey: (NSString*)aKey { CHECKKEY [_enc setObject: [NSNumber numberWithDouble: aDouble] forKey: aKey]; } - (void) encodeFloat: (float)aFloat forKey: (NSString*)aKey { CHECKKEY [_enc setObject: [NSNumber numberWithFloat: aFloat] forKey: aKey]; } - (void) encodeInt: (int)anInteger forKey: (NSString*)aKey { CHECKKEY [_enc setObject: [NSNumber numberWithInt: anInteger] forKey: aKey]; } - (void) encodeInteger: (NSInteger)anInteger forKey: (NSString*)aKey { CHECKKEY [_enc setObject: [NSNumber numberWithInteger: anInteger] forKey: aKey]; } - (void) encodeInt32: (int32_t)anInteger forKey: (NSString*)aKey { CHECKKEY [_enc setObject: [NSNumber numberWithLong: anInteger] forKey: aKey]; } - (void) encodeInt64: (int64_t)anInteger forKey: (NSString*)aKey { CHECKKEY [_enc setObject: [NSNumber numberWithLongLong: anInteger] forKey: aKey]; } - (void) encodeObject: (id)anObject { NSString *aKey = [NSString stringWithFormat: @"$%u", _keyNum++]; anObject = [self _encodeObject: anObject conditional: NO]; [_enc setObject: anObject forKey: aKey]; } - (void) encodeObject: (id)anObject forKey: (NSString*)aKey { CHECKKEY anObject = [self _encodeObject: anObject conditional: NO]; [_enc setObject: anObject forKey: aKey]; } - (void) encodePoint: (NSPoint)p { [self encodeValueOfObjCType: @encode(CGFloat) at: &p.x]; [self encodeValueOfObjCType: @encode(CGFloat) at: &p.y]; } - (void) encodeRect: (NSRect)r { [self encodeValueOfObjCType: @encode(CGFloat) at: &r.origin.x]; [self encodeValueOfObjCType: @encode(CGFloat) at: &r.origin.y]; [self encodeValueOfObjCType: @encode(CGFloat) at: &r.size.width]; [self encodeValueOfObjCType: @encode(CGFloat) at: &r.size.height]; } - (void) encodeSize: (NSSize)s { [self encodeValueOfObjCType: @encode(CGFloat) at: &s.width]; [self encodeValueOfObjCType: @encode(CGFloat) at: &s.height]; } - (void) encodeValueOfObjCType: (const char*)type at: (const void*)address { NSString *aKey; id o; type = GSSkipTypeQualifierAndLayoutInfo(type); if (*type == _C_ID || *type == _C_CLASS) { [self encodeObject: *(id*)address]; return; } aKey = [NSString stringWithFormat: @"$%u", _keyNum++]; switch (*type) { case _C_SEL: { // Selectors are encoded by name as strings. o = NSStringFromSelector(*(SEL*)address); [self encodeObject: o]; } return; case _C_CHARPTR: { /* * Bizzarely MacOS-X seems to encode char* values by creating * string objects and encoding those objects! */ o = [NSString stringWithUTF8String: (char*)address]; [self encodeObject: o]; } return; case _C_CHR: o = [NSNumber numberWithInt: (NSInteger)*(char*)address]; [_enc setObject: o forKey: aKey]; return; case _C_UCHR: o = [NSNumber numberWithInt: (NSInteger)*(unsigned char*)address]; [_enc setObject: o forKey: aKey]; return; case _C_SHT: o = [NSNumber numberWithInt: (NSInteger)*(short*)address]; [_enc setObject: o forKey: aKey]; return; case _C_USHT: o = [NSNumber numberWithLong: (long)*(unsigned short*)address]; [_enc setObject: o forKey: aKey]; return; case _C_INT: o = [NSNumber numberWithInt: *(int*)address]; [_enc setObject: o forKey: aKey]; return; case _C_UINT: o = [NSNumber numberWithUnsignedInt: *(unsigned int*)address]; [_enc setObject: o forKey: aKey]; return; case _C_LNG: o = [NSNumber numberWithLong: *(long*)address]; [_enc setObject: o forKey: aKey]; return; case _C_ULNG: o = [NSNumber numberWithUnsignedLong: *(unsigned long*)address]; [_enc setObject: o forKey: aKey]; return; case _C_LNG_LNG: o = [NSNumber numberWithLongLong: *(long long*)address]; [_enc setObject: o forKey: aKey]; return; case _C_ULNG_LNG: o = [NSNumber numberWithUnsignedLongLong: *(unsigned long long*)address]; [_enc setObject: o forKey: aKey]; return; case _C_FLT: o = [NSNumber numberWithFloat: *(float*)address]; [_enc setObject: o forKey: aKey]; return; case _C_DBL: o = [NSNumber numberWithDouble: *(double*)address]; [_enc setObject: o forKey: aKey]; return; #if defined(_C_BOOL) && (!defined(__GNUC__) || __GNUC__ > 2) case _C_BOOL: o = [NSNumber numberWithInt: (NSInteger)*(_Bool*)address]; [_enc setObject: o forKey: aKey]; return; #endif case _C_STRUCT_B: [NSException raise: NSInvalidArgumentException format: @"-[%@ %@]: this archiver cannote encode structs", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; return; case _C_ARY_B: { int count = atoi(++type); while (isdigit(*type)) { type++; } [self encodeArrayOfObjCType: type count: count at: address]; } return; default: /* Types that can be ignored in first pass. */ [NSException raise: NSInvalidArgumentException format: @"-[%@ %@]: unknown type encoding ('%c')", NSStringFromClass([self class]), NSStringFromSelector(_cmd), *type]; break; } } - (void) finishEncoding { NSMutableDictionary *final; NSData *data; NSString *error; [_delegate archiverWillFinish: self]; final = [NSMutableDictionary new]; [final setObject: NSStringFromClass([self class]) forKey: @"$archiver"]; [final setObject: [NSNumber numberWithInt: 100000] forKey: @"$version"]; [final setObject: _enc forKey: @"$top"]; [final setObject: _obj forKey: @"$objects"]; data = [NSPropertyListSerialization dataFromPropertyList: final format: _format errorDescription: &error]; RELEASE(final); [_data setData: data]; [_delegate archiverDidFinish: self]; } - (id) init { Class c = [self class]; DESTROY(self); [NSException raise: NSInvalidArgumentException format: @"-[%@ init]: cannot use -init for initialisation", NSStringFromClass(c)]; return nil; } - (id) initForWritingWithMutableData: (NSMutableData*)data { self = [super init]; if (self) { NSZone *zone = [self zone]; _keyNum = 0; _data = RETAIN(data); _clsMap = NSCreateMapTable(NSNonOwnedPointerMapKeyCallBacks, NSObjectMapValueCallBacks, 0); /* * Set up map tables. */ _cIdMap = (GSIMapTable)NSZoneMalloc(zone, sizeof(GSIMapTable_t)*5); _uIdMap = &_cIdMap[1]; _repMap = &_cIdMap[2]; GSIMapInitWithZoneAndCapacity(_cIdMap, zone, 10); GSIMapInitWithZoneAndCapacity(_uIdMap, zone, 200); GSIMapInitWithZoneAndCapacity(_repMap, zone, 1); _enc = [NSMutableDictionary new]; // Top level mapping dict _obj = [NSMutableArray new]; // Array of objects. [_obj addObject: @"$null"]; // Placeholder. _format = NSPropertyListBinaryFormat_v1_0; } return self; } - (NSPropertyListFormat) outputFormat { return _format; } - (void) setClassName: (NSString*)aString forClass: (Class)aClass { if (aString == nil) { NSMapRemove(_clsMap, (void*)aClass); } else { NSMapInsert(_clsMap, (void*)aClass, aString); } } - (void) setDelegate: (id)anObject { _delegate = anObject; // Not retained. } - (void) setOutputFormat: (NSPropertyListFormat)format { _format = format; } @end @implementation NSObject (NSKeyedArchiverDelegate) /** */ - (void) archiver: (NSKeyedArchiver*)anArchiver didEncodeObject: (id)anObject { } /** */ - (id) archiver: (NSKeyedArchiver*)anArchiver willEncodeObject: (id)anObject { return anObject; } /** */ - (void) archiverDidFinish: (NSKeyedArchiver*)anArchiver { } /** */ - (void) archiverWillFinish: (NSKeyedArchiver*)anArchiver { } /** */ - (void) archiver: (NSKeyedArchiver*)anArchiver willReplaceObject: (id)anObject withObject: (id)newObject { } @end @implementation NSObject (NSKeyedArchiverObjectSubstitution) - (Class) classForKeyedArchiver { return [self classForArchiver]; } - (id) replacementObjectForKeyedArchiver: (NSKeyedArchiver*)archiver { return [self replacementObjectForArchiver: nil]; } @end @implementation NSCoder (NSGeometryKeyedCoding) - (void) encodePoint: (NSPoint)aPoint forKey: (NSString*)aKey { NSString *val; val = [NSString stringWithFormat: @"{%g, %g}", aPoint.x, aPoint.y]; [self encodeObject: val forKey: aKey]; } - (void) encodeRect: (NSRect)aRect forKey: (NSString*)aKey { NSString *val; val = [NSString stringWithFormat: @"{{%g, %g}, {%g, %g}}", aRect.origin.x, aRect.origin.y, aRect.size.width, aRect.size.height]; [self encodeObject: val forKey: aKey]; } - (void) encodeSize: (NSSize)aSize forKey: (NSString*)aKey { NSString *val; val = [NSString stringWithFormat: @"{%g, %g}", aSize.width, aSize.height]; [self encodeObject: val forKey: aKey]; } - (NSPoint) decodePointForKey: (NSString*)aKey { NSString *val = [self decodeObjectForKey: aKey]; NSPoint aPoint; if (val == 0) { aPoint = NSMakePoint(0, 0); } else { NSScanner *scanner; setupCache(); scanner = (*scannerImp)(NSScannerClass, scannerSel, val); if (!(*scanStringImp)(scanner, scanStringSel, @"{", NULL) || !(*scanFloatImp)(scanner, scanFloatSel, &aPoint.x) || !(*scanStringImp)(scanner, scanStringSel, @",", NULL) || !(*scanFloatImp)(scanner, scanFloatSel, &aPoint.y) || !(*scanStringImp)(scanner, scanStringSel, @"}", NULL)) { [NSException raise: NSInvalidArgumentException format: @"[%@ -%@]: bad value - '%@'", NSStringFromClass([self class]), NSStringFromSelector(_cmd), val]; } } return aPoint; } - (NSRect) decodeRectForKey: (NSString*)aKey { NSString *val = [self decodeObjectForKey: aKey]; NSRect aRect; if (val == 0) { aRect = NSMakeRect(0, 0, 0, 0); } else { NSScanner *scanner; setupCache(); scanner = (*scannerImp)(NSScannerClass, scannerSel, val); if (!(*scanStringImp)(scanner, scanStringSel, @"{", NULL) || !(*scanStringImp)(scanner, scanStringSel, @"{", NULL) || !(*scanFloatImp)(scanner, scanFloatSel, &aRect.origin.x) || !(*scanStringImp)(scanner, scanStringSel, @",", NULL) || !(*scanFloatImp)(scanner, scanFloatSel, &aRect.origin.y) || !(*scanStringImp)(scanner, scanStringSel, @"}", NULL) || !(*scanStringImp)(scanner, scanStringSel, @",", NULL) || !(*scanStringImp)(scanner, scanStringSel, @"{", NULL) || !(*scanFloatImp)(scanner, scanFloatSel, &aRect.size.width) || !(*scanStringImp)(scanner, scanStringSel, @",", NULL) || !(*scanFloatImp)(scanner, scanFloatSel, &aRect.size.height) || !(*scanStringImp)(scanner, scanStringSel, @"}", NULL) || !(*scanStringImp)(scanner, scanStringSel, @"}", NULL)) { [NSException raise: NSInvalidArgumentException format: @"[%@ -%@]: bad value - '%@'", NSStringFromClass([self class]), NSStringFromSelector(_cmd), val]; } } return aRect; } - (NSSize) decodeSizeForKey: (NSString*)aKey { NSString *val = [self decodeObjectForKey: aKey]; NSSize aSize; if (val == 0) { aSize = NSMakeSize(0, 0); } else { NSScanner *scanner; setupCache(); scanner = (*scannerImp)(NSScannerClass, scannerSel, val); if (!(*scanStringImp)(scanner, scanStringSel, @"{", NULL) || !(*scanFloatImp)(scanner, scanFloatSel, &aSize.width) || !(*scanStringImp)(scanner, scanStringSel, @",", NULL) || !(*scanFloatImp)(scanner, scanFloatSel, &aSize.height) || !(*scanStringImp)(scanner, scanStringSel, @"}", NULL)) { [NSException raise: NSInvalidArgumentException format: @"[%@ -%@]: bad value - '%@'", NSStringFromClass([self class]), NSStringFromSelector(_cmd), val]; } } return aSize; } @end gnustep-base-1.29.0/Source/NSKeyedUnarchiver.m000066400000000000000000000507031435650067400211660ustar00rootroot00000000000000/** Implementation for NSKeyedUnarchiver for GNUstep Copyright (C) 2004 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: January 2004 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #define EXPOSE_NSKeyedUnarchiver_IVARS 1 #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSData.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSException.h" #import "Foundation/NSMapTable.h" #import "Foundation/NSNull.h" #import "Foundation/NSValue.h" #import "GSPrivate.h" /* * Setup for inline operation of arrays. */ #define GSI_ARRAY_RETAIN(A, X) [(X).obj retain] #define GSI_ARRAY_RELEASE(A, X) [(X).obj release] #define GSI_ARRAY_TYPES GSUNION_OBJ #include "GNUstepBase/GSIArray.h" #define _IN_NSKEYEDUNARCHIVER_M 1 #import "Foundation/NSKeyedArchiver.h" #undef _IN_NSKEYEDUNARCHIVER_M @interface NilMarker: NSObject @end @implementation NilMarker @end static NSMapTable *globalClassMap = 0; #define GETVAL \ id o; \ \ if ([aKey isKindOfClass: [NSString class]] == NO) \ { \ [NSException raise: NSInvalidArgumentException \ format: @"%@, bad key '%@' in %@", \ NSStringFromClass([self class]), aKey, NSStringFromSelector(_cmd)]; \ } \ if ([aKey hasPrefix: @"$"] == YES) \ { \ aKey = [@"$" stringByAppendingString: aKey]; \ } \ o = [_keyMap objectForKey: aKey]; @interface NSKeyedUnarchiver (Private) - (id) _decodeObject: (unsigned)index; @end @implementation NSKeyedUnarchiver (Internal) /** * Internal method used to decode an array relatively efficiently.
* Some MacOS-X library classes seem to use this. */ - (id) _decodeArrayOfObjectsForKey: (NSString*)aKey { id o = [_keyMap objectForKey: aKey]; if (o != nil) { if ([o isKindOfClass: [NSArray class]] == YES) { unsigned c = [o count]; NSMutableArray *m = [NSMutableArray arrayWithCapacity: c]; unsigned i; for (i = 0; i < c; i++) { unsigned ref; id val; ref = [[[o objectAtIndex: i] objectForKey: @"CF$UID"] unsignedIntValue]; val = [self _decodeObject: ref]; if (val == nil) { [NSException raise: NSInvalidUnarchiveOperationException format: @"[%@ +%@]: decoded nil in array", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; } [m addObject: val]; } o = m; } else { o = nil; } } return o; } - (id) _decodePropertyListForKey: (NSString*)aKey { id o = [_keyMap objectForKey: aKey]; return o; } /** * This method is used to replace oldObj with newObj * in the map that is maintained in NSKeyedUnarchiver. */ - (BOOL) replaceObject: (id)oldObj withObject: (id)newObj { unsigned int i = 0; unsigned int count = GSIArrayCount(_objMap); for (i = 0; i < count; i++) { id obj = GSIArrayItemAtIndex(_objMap, i).obj; if (obj == oldObj) break; } if (i < count) { GSIArraySetItemAtIndex(_objMap, (GSIArrayItem)newObj, i); return YES; } return NO; } @end @implementation NSKeyedUnarchiver (Private) - (id) _decodeObject: (unsigned)index { id o; id obj; /* * If the referenced object is already in _objMap * we simply return it (the object at index 0 maps to nil) */ obj = GSIArrayItemAtIndex(_objMap, index).obj; if (obj != nil) { if (obj == GSIArrayItemAtIndex(_objMap, 0).obj) { return nil; } return obj; } /* * No mapped object, so we decode from the property list * in _objects */ obj = [_objects objectAtIndex: index]; if ([obj isKindOfClass: [NSDictionary class]] == YES) { NSString *classname; NSArray *classes; Class c; id r; NSDictionary *savedKeyMap; unsigned savedCursor; /* * Fetch the class information from the table. */ o = [obj objectForKey: @"$class"]; o = [o objectForKey: @"CF$UID"]; o = [_objects objectAtIndex: [o intValue]]; classname = [o objectForKey: @"$classname"]; classes = [o objectForKey: @"$classes"]; c = [self classForClassName: classname]; if (c == nil) { c = [[self class] classForClassName: classname]; if (c == nil) { c = NSClassFromString(classname); if (c == nil) { c = [_delegate unarchiver: self cannotDecodeObjectOfClassName: classname originalClasses: classes]; if (c == nil) { [NSException raise: NSInvalidUnarchiveOperationException format: @"[%@ +%@]: no class for name '%@'", NSStringFromClass([self class]), NSStringFromSelector(_cmd), classname]; } } } } savedCursor = _cursor; savedKeyMap = _keyMap; _cursor = 0; // Starting object decode _keyMap = obj; // Dictionary describing object o = [c allocWithZone: _zone]; // Create instance. // Store object in map so that decoding of it can be self referential. GSIArraySetItemAtIndex(_objMap, (GSIArrayItem)o, index); r = [o initWithCoder: self]; if (r != o) { [_delegate unarchiver: self willReplaceObject: o withObject: r]; o = r; GSIArraySetItemAtIndex(_objMap, (GSIArrayItem)o, index); } r = [o awakeAfterUsingCoder: self]; if (r != o) { [_delegate unarchiver: self willReplaceObject: o withObject: r]; o = r; GSIArraySetItemAtIndex(_objMap, (GSIArrayItem)o, index); } if (_delegate != nil) { r = [_delegate unarchiver: self didDecodeObject: o]; if (r != o) { [_delegate unarchiver: self willReplaceObject: o withObject: r]; o = r; GSIArraySetItemAtIndex(_objMap, (GSIArrayItem)o, index); } } RELEASE(o); // Retained in array obj = o; _keyMap = savedKeyMap; _cursor = savedCursor; } else { // Use the decoded object directly GSIArraySetItemAtIndex(_objMap, (GSIArrayItem)obj, index); } if ((obj == nil) || [@"$null" isEqual: obj]) { // Record NilMarker for decoded object. o = GSIArrayItemAtIndex(_objMap, 0).obj; GSIArraySetItemAtIndex(_objMap, (GSIArrayItem)o, index); obj = nil; } return obj; } @end @implementation NSKeyedUnarchiver + (Class) classForClassName: (NSString*)aString { return (Class)NSMapGet(globalClassMap, (void*)aString); } + (void) initialize { GSMakeWeakPointer(self, "delegate"); if (globalClassMap == 0) { globalClassMap = NSCreateMapTable(NSObjectMapKeyCallBacks, NSNonOwnedPointerMapValueCallBacks, 0); [[NSObject leakAt: &globalClassMap] release]; } } + (void) setClass: (Class)aClass forClassName: (NSString*)aString { if (aClass == nil) { NSMapRemove(globalClassMap, (void*)aString); } else { NSMapInsert(globalClassMap, (void*)aString, aClass); } } /* * When I tried this on MacOS 10.3 it encoded the object with the key 'root', * so this implementation does the same. */ + (id) unarchiveObjectWithData: (NSData*)data { NSKeyedUnarchiver *u = nil; id o = nil; NS_DURING { u = [[NSKeyedUnarchiver alloc] initForReadingWithData: data]; o = RETAIN([u decodeObjectForKey: @"root"]); [u finishDecoding]; DESTROY(u); } NS_HANDLER { DESTROY(u); DESTROY(o); [localException raise]; } NS_ENDHANDLER return AUTORELEASE(o); } + (id) unarchiveObjectWithFile: (NSString*)aPath { NSData *d; id o; d = [NSData dataWithContentsOfFile: aPath]; o = [self unarchiveObjectWithData: d]; return o; } - (BOOL) allowsKeyedCoding { return YES; } - (BOOL)requiresSecureCoding { return _requiresSecureCoding; } - (void)setRequiresSecureCoding: (BOOL)secure { _requiresSecureCoding = secure; } - (Class) classForClassName: (NSString*)aString { return _clsMap == 0 ? Nil : (Class)NSMapGet(_clsMap, (void*)aString); } - (BOOL) containsValueForKey: (NSString*)aKey { GETVAL if (o != nil) { return YES; } return NO; } - (void) dealloc { DESTROY(_archive); if (_clsMap != 0) { NSFreeMapTable(_clsMap); _clsMap = 0; } if (_objMap != 0) { NSZone *z = _objMap->zone; GSIArrayEmpty(_objMap); NSZoneFree(z, (void*)_objMap); } [super dealloc]; } - (void) decodeArrayOfObjCType: (const char*)type count: (NSUInteger)expected at: (void*)buf { id o = [self decodeObject]; NSUInteger size; if ([o isKindOfClass: [_NSKeyedCoderOldStyleArray class]] == NO) { [NSException raise: NSInvalidUnarchiveOperationException format: @"[%@ +%@]: value is '%@'", NSStringFromClass([self class]), NSStringFromSelector(_cmd), o]; } if (strcmp([o type], type) != 0) { [NSException raise: NSInvalidUnarchiveOperationException format: @"[%@ +%@]: type mismatch for %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd), o]; } if ([o count] != expected) { [NSException raise: NSInvalidUnarchiveOperationException format: @"[%@ +%@]: count mismatch for %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd), o]; } NSGetSizeAndAlignment(type, &size, NULL); memcpy(buf, [o bytes], expected * size); } - (BOOL) decodeBoolForKey: (NSString*)aKey { NSString *oldKey = aKey; GETVAL if (o != nil) { if ([o isKindOfClass: [NSNumber class]] == YES) { return [o boolValue]; } else { [NSException raise: NSInvalidUnarchiveOperationException format: @"[%@ +%@]: value for key(%@) is '%@'", NSStringFromClass([self class]), NSStringFromSelector(_cmd), oldKey, o]; } } return NO; } - (const uint8_t*) decodeBytesForKey: (NSString*)aKey returnedLength: (NSUInteger*)length { NSString *oldKey = aKey; GETVAL if (o != nil) { if ([o isKindOfClass: [NSData class]] == YES) { *length = [o length]; return [o bytes]; } else { [NSException raise: NSInvalidUnarchiveOperationException format: @"[%@ +%@]: value for key(%@) is '%@'", NSStringFromClass([self class]), NSStringFromSelector(_cmd), oldKey, o]; } } *length = 0; return 0; } - (double) decodeDoubleForKey: (NSString*)aKey { NSString *oldKey = aKey; GETVAL if (o != nil) { if ([o isKindOfClass: [NSNumber class]] == YES) { return [o doubleValue]; } else { [NSException raise: NSInvalidUnarchiveOperationException format: @"[%@ +%@]: value for key(%@) is '%@'", NSStringFromClass([self class]), NSStringFromSelector(_cmd), oldKey, o]; } } return 0.0; } - (float) decodeFloatForKey: (NSString*)aKey { NSString *oldKey = aKey; GETVAL if (o != nil) { if ([o isKindOfClass: [NSNumber class]] == YES) { return [o floatValue]; } else { [NSException raise: NSInvalidUnarchiveOperationException format: @"[%@ +%@]: value for key(%@) is '%@'", NSStringFromClass([self class]), NSStringFromSelector(_cmd), oldKey, o]; } } return 0.0; } - (int) decodeIntForKey: (NSString*)aKey { int64_t i = [self decodeInt64ForKey: aKey]; #if (INT_MAX < INT64_MAX) if (i > INT_MAX || i < INT_MIN) { [NSException raise: NSRangeException format: @"[%@ +%@]: value %"PRIu64" for key(%@) is out of range", NSStringFromClass([self class]), NSStringFromSelector(_cmd), i, aKey]; } #endif return (int)i; } - (NSInteger) decodeIntegerForKey: (NSString*)aKey { int64_t i = [self decodeInt64ForKey: aKey]; /* Older Solaris systems define INTPTR_MAX incorrectly ... so we use the * void pointer size we determined at configure time to decide whether * we need to check for overflow. */ #if (GS_SIZEOF_VOIDP < 8) if (i > INT32_MAX || i < INT32_MIN) { [NSException raise: NSRangeException format: @"[%@ +%@]: value for key(%@) is out of range", NSStringFromClass([self class]), NSStringFromSelector(_cmd), aKey]; } #endif return (NSInteger)i; } - (int32_t) decodeInt32ForKey: (NSString*)aKey { int64_t i = [self decodeInt64ForKey: aKey]; if (i > INT32_MAX || i < INT32_MIN) { [NSException raise: NSRangeException format: @"[%@ +%@]: value %"PRIu64" for key(%@) is out of range", NSStringFromClass([self class]), NSStringFromSelector(_cmd), i, aKey]; } return (int32_t)i; } - (int64_t) decodeInt64ForKey: (NSString*)aKey { NSString *oldKey = aKey; GETVAL if (o != nil) { if ([o isKindOfClass: [NSNumber class]] == YES) { long long l = [o longLongValue]; return l; } else { [NSException raise: NSInvalidUnarchiveOperationException format: @"[%@ +%@]: value for key(%@) is '%@'", NSStringFromClass([self class]), NSStringFromSelector(_cmd), oldKey, o]; } } return 0; } - (id) decodeObject { NSString *key = [NSString stringWithFormat: @"$%d", _cursor++]; NSNumber *pos; id o = [_keyMap objectForKey: key]; if (o != nil) { if ([o isKindOfClass: [NSDictionary class]] == YES && (pos = [o objectForKey: @"CF$UID"]) != nil) { int index = [pos intValue]; return [self _decodeObject: index]; } else { [NSException raise: NSInvalidUnarchiveOperationException format: @"[%@ +%@]: value for key(%@) is '%@'", NSStringFromClass([self class]), NSStringFromSelector(_cmd), key, o]; } } return nil; } - (id) decodeObjectForKey: (NSString*)aKey { NSString *oldKey = aKey; GETVAL if (o != nil) { NSNumber *pos; if ([o isKindOfClass: [NSDictionary class]] == YES && (pos = [o objectForKey: @"CF$UID"]) != nil) { int index = [pos intValue]; return [self _decodeObject: index]; } else { [NSException raise: NSInvalidUnarchiveOperationException format: @"[%@ +%@]: value for key(%@) is '%@'", NSStringFromClass([self class]), NSStringFromSelector(_cmd), oldKey, o]; } } return nil; } - (id) decodeObjectOfClasses: (NSSet *)classes forKey: (NSString *)key { return [self decodeObjectForKey: key]; } - (NSPoint) decodePoint { NSPoint p; [self decodeValueOfObjCType: @encode(CGFloat) at: &p.x]; [self decodeValueOfObjCType: @encode(CGFloat) at: &p.y]; return p; } - (NSRect) decodeRect { NSRect r; [self decodeValueOfObjCType: @encode(CGFloat) at: &r.origin.x]; [self decodeValueOfObjCType: @encode(CGFloat) at: &r.origin.y]; [self decodeValueOfObjCType: @encode(CGFloat) at: &r.size.width]; [self decodeValueOfObjCType: @encode(CGFloat) at: &r.size.height]; return r; } - (NSSize) decodeSize { NSSize s; [self decodeValueOfObjCType: @encode(CGFloat) at: &s.width]; [self decodeValueOfObjCType: @encode(CGFloat) at: &s.height]; return s; } - (void) decodeValueOfObjCType: (const char*)type at: (void*)address { NSString *aKey; id o; if (*type == _C_ID || *type == _C_CLASS || *type == _C_SEL || *type == _C_CHARPTR) { o = [self decodeObject]; if (*type == _C_ID || *type == _C_CLASS) { *(id*)address = RETAIN(o); } else if (*type == _C_SEL) { *(SEL*)address = NSSelectorFromString(o); } else if (*type == _C_CHARPTR) { *(const char**)address = [o cString]; } return; } aKey = [NSString stringWithFormat: @"$%u", _cursor++]; o = [_keyMap objectForKey: aKey]; switch (*type) { case _C_CHR: *(char*)address = [o charValue]; return; case _C_UCHR: *(unsigned char*)address = [o unsignedCharValue]; return; case _C_SHT: *(short*)address = [o shortValue]; return; case _C_USHT: *(unsigned short*)address = [o unsignedShortValue]; return; case _C_INT: *(int*)address = [o intValue]; return; case _C_UINT: *(unsigned int*)address = [o unsignedIntValue]; return; case _C_LNG: *(long int*)address = [o longValue]; return; case _C_ULNG: *(unsigned long int*)address = [o unsignedLongValue]; return; case _C_LNG_LNG: *(long long int*)address = [o longLongValue]; return; case _C_ULNG_LNG: *(unsigned long long int*)address = [o unsignedLongLongValue]; return; case _C_FLT: *(float*)address = [o floatValue]; return; case _C_DBL: *(double*)address = [o doubleValue]; return; #if defined(_C_BOOL) && (!defined(__GNUC__) || __GNUC__ > 2) case _C_BOOL: *(_Bool*)address = (_Bool)[o unsignedCharValue]; return; #endif case _C_STRUCT_B: [NSException raise: NSInvalidArgumentException format: @"-[%@ %@]: this archiver cannote decode structs", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; return; case _C_ARY_B: { int count = atoi(++type); while (isdigit(*type)) { type++; } [self decodeArrayOfObjCType: type count: count at: address]; } return; default: [NSException raise: NSInvalidArgumentException format: @"-[%@ %@]: unknown type encoding ('%c')", NSStringFromClass([self class]), NSStringFromSelector(_cmd), *type]; break; } } - (id) delegate { return _delegate; } - (NSString*) description { if (_archive == nil) { // For consistency with OSX [NSException raise: NSInvalidArgumentException format: @"method sent to uninitialised unarchiver"]; } return [super description]; } - (void) finishDecoding { [_delegate unarchiverWillFinish: self]; DESTROY(_archive); [_delegate unarchiverDidFinish: self]; } - (id) init { Class c = [self class]; DESTROY(self); [NSException raise: NSInvalidArgumentException format: @"-[%@ init]: cannot use -init for initialisation", NSStringFromClass(c)]; return nil; } - (id) initForReadingWithData: (NSData*)data { self = [super init]; if (self) { NSPropertyListFormat format; NSString *error; _zone = [self zone]; _archive = [NSPropertyListSerialization propertyListFromData: data mutabilityOption: NSPropertyListImmutable format: &format errorDescription: &error]; if (_archive == nil) { DESTROY(self); } else { unsigned count; unsigned i; IF_NO_ARC(RETAIN(_archive);) _archiverClass = [_archive objectForKey: @"$archiver"]; _version = [_archive objectForKey: @"$version"]; _objects = [_archive objectForKey: @"$objects"]; _keyMap = [_archive objectForKey: @"$top"]; _objMap = NSZoneMalloc(_zone, sizeof(GSIArray_t)); count = [_objects count]; GSIArrayInitWithZoneAndCapacity(_objMap, _zone, count); // Add marker for nil object GSIArrayAddItem(_objMap, (GSIArrayItem)((id)[NilMarker class])); // Add markers for unencoded objects. for (i = 1; i < count; i++) { GSIArrayAddItem(_objMap, (GSIArrayItem)(id)nil); } } } return self; } - (void) setClass: (Class)aClass forClassName: (NSString*)aString { if (aString == nil) { if (_clsMap != 0) { NSMapRemove(_clsMap, (void*)aString); } } else { if (_clsMap == 0) { _clsMap = NSCreateMapTable(NSObjectMapKeyCallBacks, NSNonOwnedPointerMapValueCallBacks, 0); } NSMapInsert(_clsMap, (void*)aString, (void*)aClass); } } - (void) setDelegate: (id)delegate { _delegate = delegate; // Not retained. } - (NSInteger) versionForClassName: (NSString*)className { return 0; // Not used for keyed unarchiving. } @end @implementation NSObject (NSKeyedUnarchiverDelegate) /** */ - (Class) unarchiver: (NSKeyedUnarchiver*)anUnarchiver cannotDecodeObjectOfClassName: (NSString*)aName originalClasses: (NSArray*)classNames { return nil; } /** */ - (id) unarchiver: (NSKeyedUnarchiver*)anUnarchiver didDecodeObject: (id)anObject { return anObject; } /** */ - (void) unarchiverDidFinish: (NSKeyedUnarchiver*)anUnarchiver { } /** */ - (void) unarchiverWillFinish: (NSKeyedUnarchiver*)anUnarchiver { } /** */ - (void) unarchiver: (NSKeyedUnarchiver*)anUnarchiver willReplaceObject: (id)anObject withObject: (id)newObject { } @end @implementation NSObject (NSKeyedUnarchiverObjectSubstitution) + (Class) classForKeyedUnarchiver { return self; } @end gnustep-base-1.29.0/Source/NSLengthFormatter.m000066400000000000000000000072741435650067400212100ustar00rootroot00000000000000 /* Implementation of class NSLengthFormatter Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory John Casamento Date: Tue Oct 8 13:30:33 EDT 2019 This file is part of the GNUstep Library. 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 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 USA. */ #import "Foundation/NSLengthFormatter.h" #import "Foundation/NSMeasurement.h" #import "Foundation/NSMeasurementFormatter.h" #import "Foundation/NSNumberFormatter.h" #import "Foundation/NSUnit.h" @implementation NSLengthFormatter - (instancetype) init { self = [super init]; if(self != nil) { _numberFormatter = nil; _unitStyle = NSFormattingUnitStyleMedium; _isForPersonHeightUse = NO; } return self; } - (void) dealloc { RELEASE(_numberFormatter); [super dealloc]; } - (NSNumberFormatter *) numberFormatter { return _numberFormatter; } - (void) setNumberFormatter: (NSNumberFormatter *)formatter { ASSIGN(_numberFormatter, formatter); } - (NSFormattingUnitStyle) unitStyle { return _unitStyle; } - (void) setUnitStyle: (NSFormattingUnitStyle)style { _unitStyle = style; } - (BOOL) isForPersonHeightUse { return _isForPersonHeightUse; } - (void) setForPersonHeightUse: (BOOL)flag { _isForPersonHeightUse = flag; } - (NSString *) stringFromValue: (double)value unit: (NSLengthFormatterUnit)unit { NSUnit *u = nil; NSMeasurement *m = nil; NSMeasurementFormatter *mf = nil; switch(unit) { case NSLengthFormatterUnitMillimeter: u = [NSUnitLength millimeters]; break; case NSLengthFormatterUnitCentimeter: u = [NSUnitLength centimeters]; break; case NSLengthFormatterUnitMeter: u = [NSUnitLength meters]; break; case NSLengthFormatterUnitKilometer: u = [NSUnitLength kilometers]; break; case NSLengthFormatterUnitInch: u = [NSUnitLength inches]; break; case NSLengthFormatterUnitFoot: u = [NSUnitLength feet]; break; case NSLengthFormatterUnitYard: u = [NSUnitLength yards]; break; case NSLengthFormatterUnitMile: u = [NSUnitLength miles]; break; } m = [[NSMeasurement alloc] initWithDoubleValue: value unit: u]; AUTORELEASE(m); mf = [[NSMeasurementFormatter alloc] init]; AUTORELEASE(mf); [mf setUnitStyle: _unitStyle]; [mf setNumberFormatter: _numberFormatter]; return [mf stringFromMeasurement: m]; } - (NSString *) stringFromMeters: (double)numberInMeters { return [self stringFromValue: numberInMeters unit: NSLengthFormatterUnitMeter]; } - (NSString *) unitStringFromValue: (double)value unit: (NSLengthFormatterUnit)unit { return [self stringFromValue: value unit: unit]; } - (NSString *) unitStringFromMeters: (double)numberInMeters usedUnit: (NSLengthFormatterUnit *)unit { *unit = NSLengthFormatterUnitMeter; return [self stringFromValue: numberInMeters unit: *unit]; } - (BOOL) getObjectValue: (id *)obj forString: (NSString *)string errorDescription: (NSString **)error { return NO; } @end gnustep-base-1.29.0/Source/NSLinguisticTagger.m000066400000000000000000000222421435650067400213370ustar00rootroot00000000000000/* Implementation of class NSLinguisticTagger Copyright (C) 2019 Free Software Foundation, Inc. By: heron Date: Sat Nov 2 21:37:50 EDT 2019 This file is part of the GNUstep Library. 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 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 USA. */ #include #include #include #include #include #include NSLinguisticTagScheme const NSLinguisticTagSchemeTokenType = @"NSLinguisticTagSchemeTokenType"; NSLinguisticTagScheme const NSLinguisticTagSchemeLexicalClass = @"NSLinguisticTagSchemeLexicalClass"; NSLinguisticTagScheme const NSLinguisticTagSchemeNameType = @"NSLinguisticTagSchemeNameType"; NSLinguisticTagScheme const NSLinguisticTagSchemeNameTypeOrLexicalClass = @"NSLinguisticTagSchemeNameTypeOrLexicalClass"; NSLinguisticTagScheme const NSLinguisticTagSchemeLemma = @"NSLinguisticTagSchemeLemma"; NSLinguisticTagScheme const NSLinguisticTagSchemeLanguage = @"NSLinguisticTagSchemeLanguage"; NSLinguisticTagScheme const NSLinguisticTagSchemeScript = @"NSLinguisticTagSchemeScript"; /* Tags for NSLinguisticTagSchemeTokenType */ NSLinguisticTag const NSLinguisticTagWord = @"NSLinguisticTagWord"; NSLinguisticTag const NSLinguisticTagPunctuation = @"NSLinguisticTagPunctuation"; NSLinguisticTag const NSLinguisticTagWhitespace = @"NSLinguisticTagWhitespae"; NSLinguisticTag const NSLinguisticTagOther = @"NSLinguisticTagOther"; /* Tags for NSLinguisticTagSchemeLexicalClass */ NSLinguisticTag const NSLinguisticTagNoun = @"NSLinguisticTagNoun"; NSLinguisticTag const NSLinguisticTagVerb = @"NSLinguisticTagVerb"; NSLinguisticTag const NSLinguisticTagAdjective = @"NSLinguisticTagAdjective"; NSLinguisticTag const NSLinguisticTagAdverb = @"NSLinguisticTagAdverb"; NSLinguisticTag const NSLinguisticTagPronoun = @"NSLinguisticTagPronoun"; NSLinguisticTag const NSLinguisticTagDeterminer = @"NSLinguisticTagDeterminer"; NSLinguisticTag const NSLinguisticTagParticle = @"NSLinguisticTagParticle"; NSLinguisticTag const NSLinguisticTagPreposition = @"NSLinguisticTagPrepostion"; NSLinguisticTag const NSLinguisticTagNumber = @"NSLinguisticTagNumber"; NSLinguisticTag const NSLinguisticTagConjunction = @"NSLinguisticTagConjunction"; NSLinguisticTag const NSLinguisticTagInterjection = @"NSLinguisticTagInterjection"; NSLinguisticTag const NSLinguisticTagClassifier = @"NSLinguisticTagClassifier"; NSLinguisticTag const NSLinguisticTagIdiom = @"NSLinguisticTagIdiom"; NSLinguisticTag const NSLinguisticTagOtherWord = @"NSLinguisticTagOtherWord"; NSLinguisticTag const NSLinguisticTagSentenceTerminator = @"NSLinguisticTagSentenceTerminator"; NSLinguisticTag const NSLinguisticTagOpenQuote = @"NSLinguisticTagOpenQuote"; NSLinguisticTag const NSLinguisticTagCloseQuote = @"NSLinguisticTagCloseQuote"; NSLinguisticTag const NSLinguisticTagOpenParenthesis = @"NSLinguisticTagOpenParenthesis"; NSLinguisticTag const NSLinguisticTagCloseParenthesis = @"NSLinguisticTagCloseParenthesis"; NSLinguisticTag const NSLinguisticTagWordJoiner = @"NSLinguisticTagWordJoiner"; NSLinguisticTag const NSLinguisticTagDash = @"NSLinguisticTagDash"; NSLinguisticTag const NSLinguisticTagOtherPunctuation = @"NSLinguisticTagOtherPunctuation"; NSLinguisticTag const NSLinguisticTagParagraphBreak = @"NSLinguisticTagParagraphBreak"; NSLinguisticTag const NSLinguisticTagOtherWhitespace = @"NSLinguisticTagOtherWhitespace"; /* Tags for NSLinguisticTagSchemeNameType */ NSLinguisticTag const NSLinguisticTagPersonalName = @"NSLinguisticTagPersonalName"; NSLinguisticTag const NSLinguisticTagPlaceName = @"NSLinguisticTagPlaceName"; NSLinguisticTag const NSLinguisticTagOrganizationName = @"NSLinguisticTagOrganizationName"; @implementation NSLinguisticTagger - (instancetype) initWithTagSchemes: (NSArray *)tagSchemes options: (NSUInteger)opts { self = [super init]; if(self != nil) { ASSIGNCOPY(_schemes, tagSchemes); _options = opts; _string = nil; _dominantLanguage = nil; _tokenArray = nil; _orthographyArray = nil; } return self; } - (void) dealloc { RELEASE(_schemes); RELEASE(_string); RELEASE(_dominantLanguage); RELEASE(_tokenArray); RELEASE(_orthographyArray); [super dealloc]; } - (NSArray *) tagSchemes { return _schemes; } - (NSString *) string { return _string; } - (void) setString: (NSString *)string { ASSIGNCOPY(_string, string); } + (NSArray *) availableTagSchemesForUnit: (NSLinguisticTaggerUnit)unit language: (NSString *)language { return nil; } + (NSArray *) availableTagSchemesForLanguage: (NSString *)language { return nil; } - (void) setOrthography: (NSOrthography *)orthography range: (NSRange)range { } - (NSOrthography *) orthographyAtIndex: (NSUInteger)charIndex effectiveRange: (NSRangePointer)effectiveRange { return nil; } - (void) stringEditedInRange: (NSRange)newRange changeInLength: (NSInteger)delta { } - (NSRange) tokenRangeAtIndex: (NSUInteger)charIndex unit: (NSLinguisticTaggerUnit)unit { return NSMakeRange(0,0); } - (NSRange) sentenceRangeForRange: (NSRange)range { return NSMakeRange(0,0); } - (void) enumerateTagsInRange: (NSRange)range unit: (NSLinguisticTaggerUnit)unit scheme: (NSLinguisticTagScheme)scheme options: (NSLinguisticTaggerOptions)options usingBlock: (GSLinguisticTagRangeBoolBlock)block { } - (NSLinguisticTag) tagAtIndex: (NSUInteger)charIndex unit: (NSLinguisticTaggerUnit)unit scheme: (NSLinguisticTagScheme)scheme tokenRange: (NSRangePointer)tokenRange { return nil; } - (NSArray *) tagsInRange: (NSRange)range unit: (NSLinguisticTaggerUnit)unit scheme: (NSLinguisticTagScheme)scheme options: (NSLinguisticTaggerOptions)options tokenRanges: (NSArray **)tokenRanges { return nil; } - (void) enumerateTagsInRange: (NSRange)range scheme: (NSLinguisticTagScheme)tagScheme options: (NSLinguisticTaggerOptions)opts usingBlock: (GSLinguisticTagRangeRangeBoolBlock)block { } - (NSLinguisticTag) tagAtIndex: (NSUInteger)charIndex scheme: (NSLinguisticTagScheme)scheme tokenRange: (NSRangePointer)tokenRange sentenceRange: (NSRangePointer)sentenceRange { return nil; } - (NSArray *) tagsInRange: (NSRange)range scheme: (NSString *)tagScheme options: (NSLinguisticTaggerOptions)opts tokenRanges: (NSArray **)tokenRanges { return nil; } - (NSString *) dominantLanguage { return nil; } + (NSString *) dominantLanguageForString: (NSString *)string { return nil; } + (NSLinguisticTag) tagForString: (NSString *)string atIndex: (NSUInteger)charIndex unit: (NSLinguisticTaggerUnit)unit scheme: (NSLinguisticTagScheme)scheme orthography: (NSOrthography *)orthography tokenRange: (NSRangePointer)tokenRange { return nil; } + (NSArray *)tagsForString: (NSString *)string range: (NSRange)range unit: (NSLinguisticTaggerUnit)unit scheme: (NSLinguisticTagScheme)scheme options: (NSLinguisticTaggerOptions)options orthography: (NSOrthography *)orthography tokenRanges: (NSArray **)tokenRanges { return nil; } + (void) enumerateTagsForString: (NSString *)string range: (NSRange)range unit: (NSLinguisticTaggerUnit)unit scheme: (NSLinguisticTagScheme)scheme options: (NSLinguisticTaggerOptions)options orthography: (NSOrthography *)orthography usingBlock: (GSLinguisticTagRangeBoolBlock)block { } - (NSArray *) possibleTagsAtIndex: (NSUInteger)charIndex scheme: (NSString *)tagScheme tokenRange: (NSRangePointer)tokenRange sentenceRange: (NSRangePointer)sentenceRange scores: (NSArray **)scores { return nil; } @end gnustep-base-1.29.0/Source/NSLocale.m000066400000000000000000000717621435650067400173050ustar00rootroot00000000000000/* NSLocale.m Copyright (C) 2010 Free Software Foundation, Inc. Written by: Stefan Bidigaray Date: June, 2010 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 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; see the file COPYING.LIB. If not, see or write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #define EXPOSE_NSLocale_IVARS 1 #import "common.h" #import "Foundation/NSLocale.h" #import "Foundation/NSArray.h" #import "Foundation/NSCalendar.h" #import "Foundation/NSCoder.h" #import "Foundation/NSCharacterSet.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSLock.h" #import "Foundation/NSValue.h" #import "Foundation/NSNotification.h" #import "Foundation/NSNumberFormatter.h" #import "Foundation/NSUserDefaults.h" #import "Foundation/NSString.h" #import "GNUstepBase/GSLock.h" #if defined(HAVE_UNICODE_ULOC_H) # include #endif #if defined(HAVE_UNICODE_ULOCDATA_H) # include #endif #if defined(HAVE_UNICODE_UCURR_H) # include #endif #if defined(HAVE_ICU_H) # include #endif @interface NSLocale (PrivateMethods) + (void) _updateCanonicalLocales; - (NSString *) _getMeasurementSystem; - (NSCharacterSet *) _getExemplarCharacterSet; - (NSString *) _getDelimiterWithType: (NSInteger) delimiterType; - (NSCalendar *) _getCalendar; - (NSString *) _getDecimalSeparator; - (NSString *) _getGroupingSeparator; - (NSString *) _getCurrencySymbol; - (NSString *) _getCurrencyCode; @end #if GS_USE_ICU == 1 // // ICU Component Keywords // static const char * ICUCalendarKeyword = "calendar"; static const char * ICUCollationKeyword = "collation"; static NSLocaleLanguageDirection ICUToNSLocaleOrientation (ULayoutType layout) { switch (layout) { case ULOC_LAYOUT_LTR: return NSLocaleLanguageDirectionLeftToRight; case ULOC_LAYOUT_RTL: return NSLocaleLanguageDirectionRightToLeft; case ULOC_LAYOUT_TTB: return NSLocaleLanguageDirectionTopToBottom; case ULOC_LAYOUT_BTT: return NSLocaleLanguageDirectionBottomToTop; default: return NSLocaleLanguageDirectionUnknown; } } static NSArray *_currencyCodesWithType (uint32_t currType) { NSArray *result; NSMutableArray *currencies; UErrorCode err = U_ZERO_ERROR; const char *currCode; UEnumeration *codes; codes = ucurr_openISOCurrencies (currType, &err); if (U_FAILURE(err)) return nil; currencies = [[NSMutableArray alloc] initWithCapacity: 10]; do { int strLength; err = U_ZERO_ERROR; currCode = uenum_next (codes, &strLength, &err); if (U_FAILURE(err)) { uenum_close (codes); [currencies release]; return nil; } if (currCode == NULL) break; [currencies addObject: [NSString stringWithUTF8String: currCode]]; } while (NULL != currCode); uenum_close (codes); result = [NSArray arrayWithArray: currencies]; [currencies release]; return result; } #endif @implementation NSLocale static NSLocale *autoupdatingLocale = nil; static NSLocale *currentLocale = nil; static NSLocale *systemLocale = nil; static NSMutableDictionary *allLocales = nil; static NSDictionary *canonicalLocales = nil; static NSRecursiveLock *classLock = nil; + (void) initialize { if (self == [NSLocale class]) { classLock = [NSRecursiveLock new]; [[NSObject leakAt: &classLock] release]; allLocales = [[NSMutableDictionary alloc] initWithCapacity: 0]; [[NSObject leakAt: &allLocales] release]; } } + (void) defaultsDidChange: (NSNotification*)n { NSUserDefaults *defs; NSString *name; defs = [NSUserDefaults standardUserDefaults]; name = [defs stringForKey: @"Locale"]; if ([name isEqual: autoupdatingLocale->_localeId] == NO) { [classLock lock]; RELEASE(autoupdatingLocale->_localeId); RELEASE(autoupdatingLocale->_components); autoupdatingLocale->_localeId = RETAIN(name); autoupdatingLocale->_components = nil; RELEASE(currentLocale); currentLocale = nil; [classLock unlock]; [[NSNotificationCenter defaultCenter] postNotificationName: NSCurrentLocaleDidChangeNotification object: nil]; } } + (id) autoupdatingCurrentLocale { NSLocale *result; [classLock lock]; if (nil == autoupdatingLocale) { autoupdatingLocale = [[self currentLocale] copy]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(defaultsDidChange:) name: NSUserDefaultsDidChangeNotification object: nil]; } result = RETAIN(autoupdatingLocale); [classLock unlock]; return AUTORELEASE(result); } + (NSArray *) availableLocaleIdentifiers { static NSArray *available = nil; #if GS_USE_ICU == 1 if (nil == available) { [classLock lock]; if (nil == available) { NSMutableArray *array; int32_t i; int32_t count = uloc_countAvailable (); array = [[NSMutableArray alloc] initWithCapacity: count]; for (i = 0; i < count; ++i) { const char *localeID = uloc_getAvailable (i); [array addObject: [NSString stringWithUTF8String: localeID]]; } available = [[NSArray alloc] initWithArray: array]; [array release]; } [classLock unlock]; } #endif return [[available copy] autorelease]; } + (NSString *) canonicalLanguageIdentifierFromString: (NSString *) string { NSString *result; NSString *localeId; NSArray *localeComps; /* Can't use the ICU functions here because, according to Apple locale docs, the language has a format like "zh-Hant". ICU, however, uses an underscore to separate Scripts "zh_Hant". */ if (canonicalLocales == nil) [self _updateCanonicalLocales]; localeId = [canonicalLocales objectForKey: string]; if (nil == localeId) { result = string; } else { localeComps = [localeId componentsSeparatedByString: @"_"]; result = [localeComps objectAtIndex: 0]; } return result; } + (NSString *) canonicalLocaleIdentifierFromString: (NSString *) string { /* The way this works, according to Apple docs, is a mess. It seems that both BCP 47's "-" and ICU's "_" separators are used. According to "Language and Locale Designations" (Apple docs) Taiwan, for example, has zh-Hant_TW as it's locale identifier (was zh_TW on 10.3.9 and below). Since ICU doesn't use "-" as a separator it will modify that identifier to zh_Hant_TW. */ NSString *result; NSMutableString *mStr; NSRange range; if (string == nil) return nil; if (canonicalLocales == nil) [self _updateCanonicalLocales]; result = [canonicalLocales objectForKey: string]; if (result == nil) result = string; // Strip script info from locale range = [result rangeOfString: @"-"]; if (range.location != NSNotFound) { NSUInteger start = range.location; NSUInteger length; range = [result rangeOfString: @"_"]; length = range.location - start; mStr = [NSMutableString stringWithString: result]; [mStr deleteCharactersInRange: NSMakeRange (start, length)]; result = [NSString stringWithString: mStr]; } return result; } + (NSLocaleLanguageDirection) characterDirectionForLanguage: (NSString *)isoLangCode { #if GS_USE_ICU == 1 ULayoutType result; UErrorCode status = U_ZERO_ERROR; result = uloc_getCharacterOrientation ([isoLangCode UTF8String], &status); if (U_FAILURE(status) || ULOC_LAYOUT_UNKNOWN == result) return NSLocaleLanguageDirectionUnknown; return ICUToNSLocaleOrientation (result); #else return NSLocaleLanguageDirectionLeftToRight; // FIXME #endif } + (NSDictionary *) componentsFromLocaleIdentifier: (NSString *) string { #if GS_USE_ICU == 1 char buffer[ULOC_KEYWORD_AND_VALUES_CAPACITY]; const char *cLocaleId = [string UTF8String]; int32_t strLength; UEnumeration *enumerator; UErrorCode error = U_ZERO_ERROR; NSDictionary *result; NSMutableDictionary *tmpDict = [[NSMutableDictionary alloc] initWithCapacity: 5]; strLength = uloc_getLanguage (cLocaleId, buffer, ULOC_KEYWORD_AND_VALUES_CAPACITY, &error); if (U_SUCCESS(error) && strLength) { [tmpDict setValue: [NSString stringWithUTF8String: buffer] forKey: NSLocaleLanguageCode]; } error = U_ZERO_ERROR; strLength = uloc_getCountry (cLocaleId, buffer, ULOC_KEYWORD_AND_VALUES_CAPACITY, &error); if (U_SUCCESS(error) && strLength) { [tmpDict setValue: [NSString stringWithUTF8String: buffer] forKey: NSLocaleCountryCode]; } error = U_ZERO_ERROR; strLength = uloc_getScript (cLocaleId, buffer, ULOC_KEYWORD_AND_VALUES_CAPACITY, &error); if (U_SUCCESS(error) && strLength) { [tmpDict setValue: [NSString stringWithUTF8String: buffer] forKey: NSLocaleScriptCode]; } error = U_ZERO_ERROR; strLength = uloc_getVariant (cLocaleId, buffer, ULOC_KEYWORD_AND_VALUES_CAPACITY, &error); if (U_SUCCESS(error) && strLength) { [tmpDict setValue: [NSString stringWithUTF8String: buffer] forKey: NSLocaleVariantCode]; } error = U_ZERO_ERROR; enumerator = uloc_openKeywords (cLocaleId, &error); if (U_SUCCESS(error)) { const char *keyword; error = U_ZERO_ERROR; keyword = uenum_next(enumerator, NULL, &error); while (keyword && U_SUCCESS(error)) { error = U_ZERO_ERROR; strLength = uloc_getKeywordValue (cLocaleId, keyword, buffer, ULOC_KEYWORD_AND_VALUES_CAPACITY, &error); if (strLength && U_SUCCESS(error)) { // This is OK because NSLocaleCalendarIdentifier = "calendar" // and NSLocaleCollationIdentifier = "collation". [tmpDict setValue: [NSString stringWithUTF8String: buffer] forKey: [NSString stringWithUTF8String: keyword]]; error = U_ZERO_ERROR; keyword = uenum_next (enumerator, NULL, &error); } } } uenum_close (enumerator); result = [NSDictionary dictionaryWithDictionary: tmpDict]; RELEASE(tmpDict); return result; #else return nil; // FIXME #endif } + (id) currentLocale { NSLocale *result; [classLock lock]; if (nil == currentLocale) { NSString *localeId; [classLock unlock]; localeId = [[NSUserDefaults standardUserDefaults] objectForKey: @"Locale"]; [classLock lock]; if (currentLocale == nil) currentLocale = [[NSLocale alloc] initWithLocaleIdentifier: localeId]; } result = RETAIN(currentLocale); [classLock unlock]; return AUTORELEASE(result); } + (NSArray *) commonISOCurrencyCodes { #if GS_USE_ICU == 1 return _currencyCodesWithType (UCURR_COMMON | UCURR_NON_DEPRECATED); #else return nil; // FIXME #endif } + (NSArray *) ISOCurrencyCodes { #if GS_USE_ICU == 1 return _currencyCodesWithType (UCURR_ALL); #else return nil; // FIXME #endif } + (NSArray *) ISOCountryCodes { static NSArray *countries = nil; if (nil == countries) { #if GS_USE_ICU == 1 [classLock lock]; if (nil == countries) { NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity: 10]; const char *const *codes = uloc_getISOCountries (); while (*codes != NULL) { [array addObject: [NSString stringWithUTF8String: *codes]]; ++codes; } countries = [[NSArray alloc] initWithArray: array]; [array release]; } [classLock unlock]; #endif } return [[countries copy] autorelease]; } + (NSArray *) ISOLanguageCodes { static NSArray *languages = nil; if (nil == languages) { #if GS_USE_ICU == 1 [classLock lock]; if (nil == languages) { NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity: 10]; const char *const *codes = uloc_getISOLanguages (); while (*codes != NULL) { [array addObject: [NSString stringWithUTF8String: *codes]]; ++codes; } languages = [[NSArray alloc] initWithArray: array]; [array release]; } [classLock unlock]; #endif } return [[languages copy] autorelease]; } + (NSLocaleLanguageDirection) lineDirectionForLanguage: (NSString *) isoLangCode { #if GS_USE_ICU == 1 ULayoutType result; UErrorCode status = U_ZERO_ERROR; result = uloc_getLineOrientation ([isoLangCode UTF8String], &status); if (U_FAILURE(status) || ULOC_LAYOUT_UNKNOWN == result) return NSLocaleLanguageDirectionUnknown; return ICUToNSLocaleOrientation (result); #else return NSLocaleLanguageDirectionTopToBottom; // FIXME #endif } + (NSArray *) preferredLanguages { NSArray *result; NSMutableArray *mArray; NSUInteger cnt; NSUInteger idx = 0; NSArray *languages; languages = [[NSUserDefaults standardUserDefaults] stringArrayForKey: @"NSLanguages"]; if (languages == nil) return [NSArray arrayWithObject: @"en"]; mArray = [NSMutableArray array]; cnt = [languages count]; while (idx < cnt) { NSString *lang = [self canonicalLanguageIdentifierFromString: [languages objectAtIndex: idx]]; if (![mArray containsObject: lang]) [mArray addObject: lang]; ++idx; } result = [NSArray arrayWithArray: mArray]; return result; } + (id) systemLocale { NSLocale *result; [classLock lock]; if (nil == systemLocale) { #if GS_USE_ICU == 1 #if U_ICU_VERSION_MAJOR_NUM >= 64 /* Since ICU 64, the locale handling has changed such that passing an empty string to uloc_canonicalize no longer returns the en_US_POSIX locale as it did in previous versions. See https://icu.unicode.org/download/64#h.plg55ia6o3du */ systemLocale = [[NSLocale alloc] initWithLocaleIdentifier: @"en_US_POSIX"]; #else systemLocale = [[NSLocale alloc] initWithLocaleIdentifier: @""]; #endif #endif } result = RETAIN(systemLocale); [classLock unlock]; return AUTORELEASE(result); } + (id) localeWithLocaleIdentifier:(NSString *)string { return AUTORELEASE([[NSLocale alloc] initWithLocaleIdentifier: string]); } + (NSString *) localeIdentifierFromComponents: (NSDictionary *) dict { NSString *result; NSMutableString *string; const char *language = [[dict objectForKey: NSLocaleLanguageCode] UTF8String]; const char *script = [[dict objectForKey: NSLocaleScriptCode] UTF8String]; const char *country = [[dict objectForKey: NSLocaleCountryCode] UTF8String]; const char *variant = [[dict objectForKey: NSLocaleVariantCode] UTF8String]; const char *calendar = [[[dict objectForKey: NSLocaleCalendar] calendarIdentifier] UTF8String]; const char *collation = [[dict objectForKey: NSLocaleCollationIdentifier] UTF8String]; const char *currency = [[dict objectForKey: NSLocaleCurrencyCode] UTF8String]; if (!calendar) { calendar = [[dict objectForKey: NSLocaleCalendarIdentifier] UTF8String]; } // A locale cannot be constructed without a language. if (language == NULL) return nil; #define TEST_CODE(x) (x ? "_" : ""), (x ? x : "") string = [[NSMutableString alloc] initWithFormat: @"%s%s%s%s%s%s%s", language, TEST_CODE(script), TEST_CODE(country), TEST_CODE(variant)]; #undef TEST_CODE // I'm not using uloc_setKeywordValue() here because the format is easy // enough to reproduce and has the added advatange that we doesn't need ICU. if (calendar || collation || currency) [string appendString: @"@"]; if (calendar) [string appendFormat: @"calendar=%s", calendar]; if (collation) { if (calendar) [string appendString: @";"]; [string appendFormat: @"collation=%s", collation]; } if (currency) { if (calendar || currency) [string appendString: @";"]; [string appendFormat: @"currency=%s", currency]; } result = [NSString stringWithString: string]; RELEASE(string); return result; } + (NSString *) localeIdentifierFromWindowsLocaleCode: (uint32_t) lcid { #if GS_USE_ICU == 1 char buffer[ULOC_FULLNAME_CAPACITY]; UErrorCode status = U_ZERO_ERROR; uloc_getLocaleForLCID (lcid, buffer, ULOC_FULLNAME_CAPACITY, &status); if (U_FAILURE(status)) return nil; return [NSString stringWithUTF8String: buffer]; #else return nil; // FIXME Check // msdn.microsoft.com/en-us/library/0h88fahh%28v=vs.85%29.aspx #endif } + (uint32_t) windowsLocaleCodeFromLocaleIdentifier: (NSString *)localeIdentifier { #if GS_USE_ICU == 1 return uloc_getLCID ([localeIdentifier UTF8String]); #else return 0; // FIXME: Check // msdn.microsoft.com/en-us/library/0h88fahh%28v=vs.85%29.aspx #endif } - (NSString *) displayNameForKey: (NSString *) key value: (id) value { #if GS_USE_ICU == 1 int32_t length = 0; unichar buffer[ULOC_FULLNAME_CAPACITY]; UErrorCode status = 0; const char *keyword = NULL; const char *locale = [_localeId UTF8String]; if ([key isEqualToString: NSLocaleIdentifier]) { length = uloc_getDisplayName([value UTF8String], locale, (UChar *)buffer, sizeof(buffer)/sizeof(unichar), &status); } else if ([key isEqualToString: NSLocaleLanguageCode]) { length = uloc_getDisplayLanguage([value UTF8String], locale, (UChar *)buffer, sizeof(buffer)/sizeof(unichar), &status); } else if ([key isEqualToString: NSLocaleCountryCode]) { length = uloc_getDisplayCountry([value UTF8String], locale, (UChar *)buffer, sizeof(buffer)/sizeof(unichar), &status); } else if ([key isEqualToString: NSLocaleScriptCode]) { length = uloc_getDisplayCountry([value UTF8String], locale, (UChar *)buffer, sizeof(buffer)/sizeof(unichar), &status); } else if ([key isEqualToString: NSLocaleVariantCode]) { length = uloc_getDisplayVariant([value UTF8String], locale, (UChar *)buffer, sizeof(buffer)/sizeof(unichar), &status); } else if ([key isEqualToString: NSLocaleCalendar]) { keyword = ICUCalendarKeyword; } else if ([key isEqualToString: NSLocaleCollationIdentifier]) { keyword = ICUCollationKeyword; } else { return nil; } /* * TODO: Implement handling of the other locale component constants. */ if (NULL != keyword) { length = uloc_getDisplayKeywordValue ([value UTF8String], keyword, locale, (UChar *)buffer, sizeof(buffer)/sizeof(unichar), &status); } if (U_FAILURE(status)) return nil; return [NSString stringWithCharacters: buffer length: (NSUInteger)length]; #else return nil; // FIXME #endif } - (id) initWithLocaleIdentifier: (NSString*)string { NSLocale *newLocale; NSString *localeId; #if GS_USE_ICU == 1 char cLocaleId[ULOC_FULLNAME_CAPACITY]; UErrorCode error = U_ZERO_ERROR; localeId = [NSLocale canonicalLocaleIdentifierFromString: string]; // Normalize locale ID uloc_canonicalize ([localeId UTF8String], cLocaleId, ULOC_FULLNAME_CAPACITY, &error); if (U_FAILURE(error)) { [self release]; return nil; } localeId = [NSString stringWithUTF8String: cLocaleId]; #else localeId = [NSLocale canonicalLocaleIdentifierFromString: string]; #endif if (nil == localeId) { [self release]; return nil; } [classLock lock]; newLocale = [allLocales objectForKey: localeId]; if (nil == newLocale) { _localeId = [localeId copy]; _components = [[NSMutableDictionary alloc] initWithCapacity: 0]; [allLocales setObject: self forKey: localeId]; } else { [self release]; self = [newLocale retain]; } [classLock unlock]; return self; } - (NSString *) localeIdentifier { return _localeId; } - (id) objectForKey: (id) key { id result = nil; #if GS_USE_ICU == 1 if (key == NSLocaleIdentifier || key == NSLocaleCollatorIdentifier) return _localeId; if ((result = [_components objectForKey: key])) return result; if ([_components count] == 0) { [_components addEntriesFromDictionary: [NSLocale componentsFromLocaleIdentifier: _localeId]]; if ((result = [_components objectForKey: key])) return result; } if ([key isEqualToString: NSLocaleUsesMetricSystem]) { NSString *mSys = [_components objectForKey: key]; mSys = (mSys == nil) ? [self _getMeasurementSystem] : mSys; if (mSys != nil) { [_components setValue: mSys forKey: NSLocaleMeasurementSystem]; if ([mSys isEqualToString: @"Metric"]) result = [NSNumber numberWithBool: YES]; else result = [NSNumber numberWithBool: NO]; } } else if ([key isEqualToString: NSLocaleMeasurementSystem]) result = [self _getMeasurementSystem]; else if ([key isEqualToString: NSLocaleExemplarCharacterSet]) result = [self _getExemplarCharacterSet]; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) else if ([key isEqualToString: NSLocaleQuotationBeginDelimiterKey]) result = [self _getDelimiterWithType: ULOCDATA_QUOTATION_START]; else if ([key isEqualToString: NSLocaleQuotationEndDelimiterKey]) result = [self _getDelimiterWithType: ULOCDATA_QUOTATION_END]; else if ([key isEqualToString: NSLocaleAlternateQuotationBeginDelimiterKey]) result = [self _getDelimiterWithType: ULOCDATA_ALT_QUOTATION_START]; else if ([key isEqualToString: NSLocaleAlternateQuotationEndDelimiterKey]) result = [self _getDelimiterWithType: ULOCDATA_ALT_QUOTATION_END]; #endif else if ([key isEqualToString: NSLocaleCalendar]) result = [self _getCalendar]; else if ([key isEqualToString: NSLocaleDecimalSeparator]) result = [self _getDecimalSeparator]; else if ([key isEqualToString: NSLocaleGroupingSeparator]) result = [self _getGroupingSeparator]; else if ([key isEqualToString: NSLocaleCurrencySymbol]) result = [self _getCurrencySymbol]; else if ([key isEqualToString: NSLocaleCurrencyCode]) result = [self _getCurrencyCode]; [_components setValue: result forKey: key]; #endif return result; } - (NSString *) languageCode { return [self objectForKey: NSLocaleLanguageCode]; } - (NSString *) countryCode { return [self objectForKey: NSLocaleLanguageCode]; } - (NSString *) scriptCode { return [self objectForKey: NSLocaleScriptCode]; } - (NSString *) variantCode { return [self objectForKey: NSLocaleVariantCode]; } - (NSCharacterSet *) exemplarCharacterSet { return [self objectForKey: NSLocaleExemplarCharacterSet]; } - (NSString *) collationIdentifier { return [self objectForKey: NSLocaleCollationIdentifier]; } - (NSString *) collatorIdentifier { return [self objectForKey: NSLocaleCollatorIdentifier]; } - (NSString *) description { return _localeId; } - (BOOL) isEqual: (id)obj { if ([obj isKindOfClass: [self class]]) { return [_localeId isEqual: [obj localeIdentifier]]; } return NO; } - (void) dealloc { RELEASE(_localeId); RELEASE(_components); [super dealloc]; } - (void) encodeWithCoder: (NSCoder*)encoder { [encoder encodeObject: _localeId]; } - (id) initWithCoder: (NSCoder*)decoder { NSString *s = [decoder decodeObject]; return [self initWithLocaleIdentifier: s]; } - (id) copyWithZone: (NSZone *) zone { NSLocale *result; if (NSShouldRetainWithZone(self, zone)) result = RETAIN(self); else { result = (NSLocale *)NSCopyObject(self, 0, zone); result->_localeId = [_localeId copyWithZone: zone]; } return result; } @end @implementation NSLocale (PrimateMethods) + (void) _updateCanonicalLocales { NSBundle *gbundle = [NSBundle bundleForLibrary: @"gnustep-base"]; NSString *file = [gbundle pathForResource: @"Locale" ofType: @"canonical" inDirectory: @"Languages"]; if (file != nil) canonicalLocales = [[NSDictionary alloc] initWithContentsOfFile: file]; } - (NSString *) _getMeasurementSystem { #if GS_USE_ICU == 1 const char *cLocaleId; ULocaleData *localeData; UMeasurementSystem msystem; UErrorCode err = U_ZERO_ERROR; NSString *result = nil; cLocaleId = [_localeId UTF8String]; localeData = ulocdata_open (cLocaleId, &err); if (U_FAILURE(err)) return nil; msystem = ulocdata_getMeasurementSystem (cLocaleId, &err); if (U_SUCCESS(err)) { if (msystem == UMS_SI) result = @"Metric"; else result = @"U.S."; } ulocdata_close (localeData); return result; #else return nil; #endif } - (NSCharacterSet *) _getExemplarCharacterSet { #if GS_USE_ICU == 1 const char *cLocaleId; int idx; int count; UChar buffer[1024]; // This is an arbitrary size, increase it if it's not enough. ULocaleData *localeData; USet *charSet; UErrorCode err = U_ZERO_ERROR; NSCharacterSet *result; NSMutableCharacterSet *mSet; cLocaleId = [_localeId UTF8String]; localeData = ulocdata_open(cLocaleId, &err); if (U_FAILURE(err)) { return nil; } charSet = ulocdata_getExemplarSet(localeData, NULL, USET_ADD_CASE_MAPPINGS, ULOCDATA_ES_STANDARD, &err); if (U_FAILURE(err)) { ulocdata_close(localeData); return nil; } ulocdata_close(localeData); mSet = [[NSMutableCharacterSet alloc] init]; if (mSet == nil) { uset_close(charSet); return nil; } count = uset_getItemCount(charSet); for (idx = 0 ; idx < count ; ++idx) { UChar32 start, end; int strLen; err = U_ZERO_ERROR; strLen = uset_getItem(charSet, idx, &start, &end, buffer, 1024, &err); if (U_FAILURE(err)) { uset_close(charSet); RELEASE(mSet); return nil; } if (strLen == 0) { [mSet addCharactersInRange: NSMakeRange(start, (end - start) + 1)]; } else if (strLen >= 2) { NSString *str = [NSString stringWithCharacters: buffer length: strLen]; [mSet addCharactersInString: str]; } // FIXME: The icu docs are a bit iffy and don't explain what len == 1 // means. So, if it is encountered, we simply skip it. } uset_close(charSet); result = [mSet copyWithZone: NULL]; RELEASE(mSet); return AUTORELEASE(result); #else return nil; #endif } - (NSString *) _getDelimiterWithType: (NSInteger) delimiterType { #if GS_USE_ICU == 1 const char *cLocaleId; int strLen; UErrorCode err = U_ZERO_ERROR; ULocaleData *localeData; UChar result[32]; // Arbritrary size cLocaleId = [_localeId UTF8String]; localeData = ulocdata_open (cLocaleId, &err); strLen = ulocdata_getDelimiter (localeData, delimiterType, result, 32, &err); ulocdata_close (localeData); if (U_SUCCESS(err)) return [NSString stringWithCharacters: (unichar *)result length: strLen]; #endif return nil; } - (NSCalendar *) _getCalendar { #if GS_USE_ICU == 1 NSCalendar *result; NSString *calId; int strLen; char buffer[ULOC_KEYWORDS_CAPACITY]; UErrorCode err = U_ZERO_ERROR; strLen = uloc_getKeywordValue ([_localeId UTF8String], ICUCalendarKeyword, buffer, ULOC_KEYWORDS_CAPACITY, &err); if (U_SUCCESS(err) && strLen > 0) calId = [NSString stringWithUTF8String: buffer]; else calId = NSGregorianCalendar; result = [[NSCalendar alloc] initWithCalendarIdentifier: calId]; return AUTORELEASE(result); #else return nil; #endif } - (NSString *) _getDecimalSeparator { NSNumberFormatter *nFor; NSString *result; nFor = [[NSNumberFormatter alloc] init]; [nFor setLocale: self]; [nFor setNumberStyle: NSNumberFormatterDecimalStyle]; result = [nFor decimalSeparator]; RELEASE(nFor); return result; } - (NSString *) _getGroupingSeparator { NSNumberFormatter *nFor; NSString *result; nFor = [[NSNumberFormatter alloc] init]; [nFor setLocale: self]; [nFor setNumberStyle: NSNumberFormatterDecimalStyle]; result = [nFor groupingSeparator]; RELEASE(nFor); return result; } - (NSString *) _getCurrencySymbol { NSNumberFormatter *nFor; NSString *result; nFor = [[NSNumberFormatter alloc] init]; [nFor setLocale: self]; [nFor setNumberStyle: NSNumberFormatterCurrencyStyle]; result = [nFor currencySymbol]; RELEASE(nFor); return result; } - (NSString *) _getCurrencyCode { NSNumberFormatter *nFor; NSString *result; nFor = [[NSNumberFormatter alloc] init]; [nFor setLocale: self]; [nFor setNumberStyle: NSNumberFormatterCurrencyStyle]; result = [nFor currencyCode]; RELEASE(nFor); return result; } @end gnustep-base-1.29.0/Source/NSLock.m000066400000000000000000000543301435650067400167660ustar00rootroot00000000000000/** Control of executable units within a shared virtual memory space Copyright (C) 1996-2010 Free Software Foundation, Inc. Original Author: David Chisnall 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 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 USA. NSLock class reference All autogsdoc markup is in the header */ #import "common.h" #define EXPOSE_NSLock_IVARS 1 #define EXPOSE_NSRecursiveLock_IVARS 1 #define EXPOSE_NSCondition_IVARS 1 #define EXPOSE_NSConditionLock_IVARS 1 #define gs_cond_public_t gs_cond_t #define gs_cond_mutex_public_t gs_cond_mutex_t #define gs_mutex_public_t gs_mutex_t #import "GSPrivate.h" #import "GSPThread.h" #include #import "common.h" #import "Foundation/NSLock.h" #import "Foundation/NSException.h" #import "Foundation/NSThread.h" #define class_createInstance(C,E) NSAllocateObject(C,E,NSDefaultMallocZone()) static Class baseConditionClass = Nil; static Class baseConditionLockClass = Nil; static Class baseLockClass = Nil; static Class baseRecursiveLockClass = Nil; static Class tracedConditionClass = Nil; static Class tracedConditionLockClass = Nil; static Class tracedLockClass = Nil; static Class tracedRecursiveLockClass = Nil; static Class untracedConditionClass = Nil; static Class untracedConditionLockClass = Nil; static Class untracedLockClass = Nil; static Class untracedRecursiveLockClass = Nil; static BOOL traceLocks = NO; @implementation NSObject (GSTraceLocks) + (BOOL) shouldCreateTraceableLocks: (BOOL)shouldTrace { BOOL old = traceLocks; traceLocks = shouldTrace ? YES : NO; return old; } + (NSCondition*) tracedCondition { return AUTORELEASE([GSTracedCondition new]); } + (NSConditionLock*) tracedConditionLockWithCondition: (NSInteger)value { return AUTORELEASE([[GSTracedConditionLock alloc] initWithCondition: value]); } + (NSLock*) tracedLock { return AUTORELEASE([GSTracedLock new]); } + (NSRecursiveLock*) tracedRecursiveLock { return AUTORELEASE([GSTracedRecursiveLock new]); } @end /* In untraced operations these macros do nothing. * When tracing they are defined to perform the trace methods of the thread. */ #define CHKT(T,X) #define CHK(X) /* * Methods shared between NSLock, NSRecursiveLock, and NSCondition * * Note: These methods currently throw exceptions when locks are incorrectly * acquired. This is compatible with earlier GNUstep behaviour. In OS X 10.5 * and later, these will just NSLog a warning instead. Throwing an exception * is probably better behaviour, because it encourages developer to fix their * code. */ #define MDEALLOC \ - (void) dealloc\ {\ [self finalize];\ [_name release];\ [super dealloc];\ } #if defined(HAVE_PTHREAD_MUTEX_OWNER) #define MDESCRIPTION \ - (NSString*) description\ {\ if (_mutex.__data.__owner)\ {\ if (_name == nil)\ {\ return [NSString stringWithFormat: @"%@ (locked by %llu)",\ [super description], (unsigned long long)_mutex.__data.__owner];\ }\ return [NSString stringWithFormat: @"%@ '%@' (locked by %llu)",\ [super description], _name, (unsigned long long)_mutex.__data.__owner];\ }\ else\ {\ if (_name == nil)\ {\ return [super description];\ }\ return [NSString stringWithFormat: @"%@ '%@'",\ [super description], _name];\ }\ } #define MISLOCKED \ - (BOOL) isLockedByCurrentThread\ {\ if (GSPrivateThreadID() == (NSUInteger)_mutex.__data.__owner)\ return YES;\ else\ return NO; \ } #else #define MDESCRIPTION \ - (NSString*) description\ {\ if (_name == nil)\ {\ return [super description];\ }\ return [NSString stringWithFormat: @"%@ '%@'",\ [super description], _name];\ } #define MISLOCKED \ - (BOOL) isLockedByCurrentThread\ {\ [NSException raise: NSGenericException format: @"Not supported"];\ return NO;\ } #endif #define MFINALIZE \ - (void) finalize\ {\ GS_MUTEX_DESTROY(_mutex);\ } #define MLOCK \ - (void) lock\ {\ int err = GS_MUTEX_LOCK(_mutex);\ if (EDEADLK == err)\ {\ (*_NSLock_error_handler)(self, _cmd, YES, @"deadlock");\ }\ else if (err != 0)\ {\ [NSException raise: NSLockException format: @"failed to lock mutex"];\ }\ } #define MLOCKBEFOREDATE \ - (BOOL) lockBeforeDate: (NSDate*)limit\ {\ do\ {\ int err = GS_MUTEX_TRYLOCK(_mutex);\ if (0 == err)\ {\ CHK(Hold) \ return YES;\ }\ GS_YIELD();\ } while ([limit timeIntervalSinceNow] > 0);\ return NO;\ } #define MNAME \ - (void) setName: (NSString*)newName\ {\ ASSIGNCOPY(_name, newName);\ }\ - (NSString*) name\ {\ return _name;\ } #define MSTACK \ - (GSStackTrace*) stack \ { \ return nil; \ } #define MTRYLOCK \ - (BOOL) tryLock\ {\ int err = GS_MUTEX_TRYLOCK(_mutex);\ if (0 == err) \ { \ CHK(Hold) \ return YES; \ } \ else \ { \ return NO;\ } \ } #define MUNLOCK \ - (void) unlock\ {\ if (0 != GS_MUTEX_UNLOCK(_mutex))\ {\ [NSException raise: NSLockException\ format: @"failed to unlock mutex"];\ }\ CHK(Drop) \ } static gs_mutex_t deadlock; #if !GS_USE_WIN32_THREADS_AND_LOCKS static pthread_mutexattr_t attr_normal; static pthread_mutexattr_t attr_reporting; static pthread_mutexattr_t attr_recursive; #endif /* * OS X 10.5 compatibility function to allow debugging deadlock conditions. */ void _NSLockError(id obj, SEL _cmd, BOOL stop, NSString *msg) { NSLog(@"*** -[%@ %@]: %@ (%@)", [obj class], NSStringFromSelector(_cmd), msg, obj); NSLog(@"*** Break on _NSLockError() to debug."); if (YES == stop) GS_MUTEX_LOCK(deadlock); } NSLock_error_handler *_NSLock_error_handler = _NSLockError; // Exceptions NSString *NSLockException = @"NSLockException"; @implementation NSLock + (id) allocWithZone: (NSZone*)z { if (self == baseLockClass && YES == traceLocks) { return class_createInstance(tracedLockClass, 0); } return class_createInstance(self, 0); } + (void) initialize { static BOOL beenHere = NO; if (beenHere == NO) { beenHere = YES; #if !GS_USE_WIN32_THREADS_AND_LOCKS /* Initialise attributes for the different types of mutex. * We do it once, since attributes can be shared between multiple * mutexes. * If we had a pthread_mutexattr_t instance for each mutex, we would * either have to store it as an ivar of our NSLock (or similar), or * we would potentially leak instances as we couldn't destroy them * when destroying the NSLock. I don't know if any implementation * of pthreads actually allocates memory when you call the * pthread_mutexattr_init function, but they are allowed to do so * (and deallocate the memory in pthread_mutexattr_destroy). */ pthread_mutexattr_init(&attr_normal); pthread_mutexattr_settype(&attr_normal, PTHREAD_MUTEX_NORMAL); pthread_mutexattr_init(&attr_reporting); pthread_mutexattr_settype(&attr_reporting, PTHREAD_MUTEX_ERRORCHECK); pthread_mutexattr_init(&attr_recursive); pthread_mutexattr_settype(&attr_recursive, PTHREAD_MUTEX_RECURSIVE); #endif /* To emulate OSX behavior, we need to be able both to detect deadlocks * (so we can log them), and also hang the thread when one occurs. * the simple way to do that is to set up a locked mutex we can * force a deadlock on. */ #if GS_USE_WIN32_THREADS_AND_LOCKS gs_mutex_init(&deadlock, gs_mutex_attr_normal); #else pthread_mutex_init(&deadlock, &attr_normal); #endif GS_MUTEX_LOCK(deadlock); baseConditionClass = [NSCondition class]; baseConditionLockClass = [NSConditionLock class]; baseLockClass = [NSLock class]; baseRecursiveLockClass = [NSRecursiveLock class]; tracedConditionClass = [GSTracedCondition class]; tracedConditionLockClass = [GSTracedConditionLock class]; tracedLockClass = [GSTracedLock class]; tracedRecursiveLockClass = [GSTracedRecursiveLock class]; untracedConditionClass = [GSUntracedCondition class]; untracedConditionLockClass = [GSUntracedConditionLock class]; untracedLockClass = [GSUntracedLock class]; untracedRecursiveLockClass = [GSUntracedRecursiveLock class]; } } MDEALLOC MDESCRIPTION MFINALIZE /* Use an error-checking lock. This is marginally slower, but lets us throw * exceptions when incorrect locking occurs. */ - (id) init { if (nil != (self = [super init])) { #if GS_USE_WIN32_THREADS_AND_LOCKS gs_mutex_init(&_mutex, gs_mutex_attr_errorcheck); #else if (0 != pthread_mutex_init(&_mutex, &attr_reporting)) { DESTROY(self); } #endif } return self; } MISLOCKED MLOCK - (BOOL) lockBeforeDate: (NSDate*)limit { do { int err = GS_MUTEX_TRYLOCK(_mutex); if (0 == err) { CHK(Hold) return YES; } if (EDEADLK == err) { (*_NSLock_error_handler)(self, _cmd, NO, @"deadlock"); } GS_YIELD(); } while ([limit timeIntervalSinceNow] > 0); return NO; } MNAME MSTACK MTRYLOCK MUNLOCK @end @implementation NSRecursiveLock + (id) allocWithZone: (NSZone*)z { if (self == baseRecursiveLockClass && YES == traceLocks) { return class_createInstance(tracedRecursiveLockClass, 0); } return class_createInstance(self, 0); } + (void) initialize { [NSLock class]; // Ensure mutex attributes are set up. } MDEALLOC MDESCRIPTION MFINALIZE - (id) init { if (nil != (self = [super init])) { #if GS_USE_WIN32_THREADS_AND_LOCKS gs_mutex_init(&_mutex, gs_mutex_attr_recursive); #else if (0 != pthread_mutex_init(&_mutex, &attr_recursive)) { DESTROY(self); } #endif } return self; } MISLOCKED MLOCK MLOCKBEFOREDATE MNAME MSTACK MTRYLOCK MUNLOCK @end @implementation NSCondition + (id) allocWithZone: (NSZone*)z { if (self == baseConditionClass && YES == traceLocks) { return class_createInstance(tracedConditionClass, 0); } return class_createInstance(self, 0); } + (void) initialize { [NSLock class]; // Ensure mutex attributes are set up. } - (void) broadcast { GS_COND_BROADCAST(_condition); } MDEALLOC MDESCRIPTION - (void) finalize { #if !GS_USE_WIN32_THREADS_AND_LOCKS pthread_cond_destroy(&_condition); #endif GS_MUTEX_DESTROY(_mutex); } - (id) init { if (nil != (self = [super init])) { #if GS_USE_WIN32_THREADS_AND_LOCKS InitializeConditionVariable(&_condition); gs_mutex_init(&_mutex, gs_mutex_attr_errorcheck); #else if (0 != pthread_cond_init(&_condition, NULL)) { DESTROY(self); } else if (0 != pthread_mutex_init(&_mutex, &attr_reporting)) { pthread_cond_destroy(&_condition); DESTROY(self); } #endif } return self; } MISLOCKED MLOCK MLOCKBEFOREDATE MNAME - (void) signal { GS_COND_SIGNAL(_condition); } MSTACK MTRYLOCK MUNLOCK - (void) wait { GS_COND_WAIT(&_condition, &_mutex); } - (BOOL) waitUntilDate: (NSDate*)limit { int retVal = 0; #if GS_USE_WIN32_THREADS_AND_LOCKS NSTimeInterval ti = [limit timeIntervalSinceNow]; if (ti < 0) { ti = 0.0; // handle timeout in the past } retVal = gs_cond_timedwait(&_condition, &_mutex, ti * 1000.0); #else NSTimeInterval ti = [limit timeIntervalSince1970]; double secs, subsecs; struct timespec timeout; // Split the float into seconds and fractions of a second subsecs = modf(ti, &secs); timeout.tv_sec = secs; // Convert fractions of a second to nanoseconds timeout.tv_nsec = subsecs * 1e9; /* NB. On timeout the lock is still held even through condition is not met */ retVal = pthread_cond_timedwait(&_condition, &_mutex, &timeout); #endif /* GS_USE_WIN32_THREADS_AND_LOCKS */ if (retVal == 0) { return YES; } if (retVal == ETIMEDOUT) { return NO; } NSLog(@"Error calling pthread_cond_timedwait: %d", retVal); return NO; } @end @implementation NSConditionLock + (id) allocWithZone: (NSZone*)z { if (self == baseConditionLockClass && YES == traceLocks) { return class_createInstance(tracedConditionLockClass, 0); } return class_createInstance(self, 0); } + (void) initialize { [NSLock class]; // Ensure mutex attributes are set up. } - (NSInteger) condition { return _condition_value; } - (void) dealloc { [_name release]; [_condition release]; [super dealloc]; } - (id) init { return [self initWithCondition: 0]; } - (id) initWithCondition: (NSInteger)value { if (nil != (self = [super init])) { if (nil == (_condition = [NSCondition new])) { DESTROY(self); } else { _condition_value = value; [_condition setName: [NSString stringWithFormat: @"condition-for-lock-%p", self]]; } } return self; } - (BOOL) isLockedByCurrentThread { return [_condition isLockedByCurrentThread]; } - (void) lock { [_condition lock]; } - (BOOL) lockBeforeDate: (NSDate*)limit { return [_condition lockBeforeDate: limit]; } - (void) lockWhenCondition: (NSInteger)value { [_condition lock]; while (value != _condition_value) { [_condition wait]; } } - (BOOL) lockWhenCondition: (NSInteger)condition_to_meet beforeDate: (NSDate*)limitDate { if (NO == [_condition lockBeforeDate: limitDate]) { return NO; // Not locked } if (condition_to_meet == _condition_value) { return YES; // Keeping the lock } while ([_condition waitUntilDate: limitDate]) { if (condition_to_meet == _condition_value) { return YES; // Keeping the lock } } [_condition unlock]; return NO; // Not locked } MNAME MSTACK - (BOOL) tryLock { return [_condition tryLock]; } - (BOOL) tryLockWhenCondition: (NSInteger)condition_to_meet { if ([_condition tryLock]) { if (condition_to_meet == _condition_value) { return YES; // KEEP THE LOCK } else { [_condition unlock]; } } return NO; } - (void) unlock { [_condition unlock]; } - (void) unlockWithCondition: (NSInteger)value { _condition_value = value; [_condition broadcast]; [_condition unlock]; } @end /* Versions of the lock classes where the locking is unconditionally traced */ #undef CHKT #define CHKT(T,X) \ { \ NSString *msg = [T mutex ## X: self]; \ if (nil != msg) \ { \ (*_NSLock_error_handler)(self, _cmd, YES, msg); \ } \ } #undef CHK #define CHK(X) CHKT(GSCurrentThread(), X) #undef MDEALLOC #define MDEALLOC \ - (void) dealloc \ { \ DESTROY(stack); \ [super dealloc]; \ } #undef MLOCK #define MLOCK \ - (void) lock\ { \ NSThread *t = GSCurrentThread(); \ int err; \ CHKT(t,Wait) \ err = GS_MUTEX_LOCK(_mutex);\ if (EDEADLK == err)\ {\ CHKT(t,Drop) \ (*_NSLock_error_handler)(self, _cmd, YES, @"deadlock");\ }\ else if (err != 0)\ {\ CHKT(t,Drop) \ [NSException raise: NSLockException format: @"failed to lock mutex"];\ }\ CHKT(t,Hold) \ } #undef MSTACK #define MSTACK \ - (GSStackTrace*) stack \ { \ if (nil == stack) \ { \ stack = [GSStackTrace new]; \ } \ return stack; \ } @implementation GSTracedCondition + (id) allocWithZone: (NSZone*)z { return class_createInstance(tracedConditionClass, 0); } MDEALLOC MLOCK MLOCKBEFOREDATE MSTACK MTRYLOCK - (void) wait { NSThread *t = GSCurrentThread(); CHKT(t,Drop) CHKT(t,Wait) GS_COND_WAIT(&_condition, &_mutex); CHKT(t,Hold) } - (BOOL) waitUntilDate: (NSDate*)limit { int retVal = 0; NSThread *t = GSCurrentThread(); #if GS_USE_WIN32_THREADS_AND_LOCKS NSTimeInterval ti = [limit timeIntervalSinceNow]; if (ti < 0) { ti = 0.0; // handle timeout in the past } CHKT(t,Drop) retVal = gs_cond_timedwait(&_condition, &_mutex, ti * 1000.0); #else NSTimeInterval ti = [limit timeIntervalSince1970]; double secs, subsecs; struct timespec timeout; // Split the float into seconds and fractions of a second subsecs = modf(ti, &secs); timeout.tv_sec = secs; // Convert fractions of a second to nanoseconds timeout.tv_nsec = subsecs * 1e9; /* NB. On timeout the lock is still held even through condition is not met */ CHKT(t,Drop) retVal = pthread_cond_timedwait(&_condition, &_mutex, &timeout); #endif /* GS_USE_WIN32_THREADS_AND_LOCKS */ if (retVal == 0) { CHKT(t,Hold) return YES; } if (retVal == ETIMEDOUT) { CHKT(t,Hold) return NO; } NSLog(@"Error calling pthread_cond_timedwait: %d", retVal); return NO; } MUNLOCK @end @implementation GSTracedConditionLock + (id) allocWithZone: (NSZone*)z { return class_createInstance(tracedConditionLockClass, 0); } - (id) initWithCondition: (NSInteger)value { if (nil != (self = [super init])) { if (nil == (_condition = [GSTracedCondition new])) { DESTROY(self); } else { _condition_value = value; [_condition setName: [NSString stringWithFormat: @"condition-for-lock-%p", self]]; } } return self; } @end @implementation GSTracedLock + (id) allocWithZone: (NSZone*)z { return class_createInstance(tracedLockClass, 0); } MDEALLOC MLOCK MLOCKBEFOREDATE MSTACK MTRYLOCK MUNLOCK @end @implementation GSTracedRecursiveLock + (id) allocWithZone: (NSZone*)z { return class_createInstance(tracedRecursiveLockClass, 0); } MDEALLOC MLOCK MLOCKBEFOREDATE MSTACK MTRYLOCK MUNLOCK @end /* Versions of the lock classes where the locking is never traced */ @implementation GSUntracedCondition + (id) allocWithZone: (NSZone*)z { return class_createInstance(baseConditionClass, 0); } @end @implementation GSUntracedConditionLock + (id) allocWithZone: (NSZone*)z { return class_createInstance(baseConditionLockClass, 0); } @end @implementation GSUntracedLock + (id) allocWithZone: (NSZone*)z { return class_createInstance(baseRecursiveLockClass, 0); } @end @implementation GSUntracedRecursiveLock + (id) allocWithZone: (NSZone*)z { return class_createInstance(baseRecursiveLockClass, 0); } @end /* * Pthread-like locking primitives using Windows SRWLock. Provides * normal, recursive, and error-checked locks. */ #if GS_USE_WIN32_THREADS_AND_LOCKS void gs_mutex_init(gs_mutex_t *mutex, gs_mutex_attr_t attr) { memset(mutex, 0, sizeof(gs_mutex_t)); InitializeSRWLock(&mutex->lock); mutex->attr = attr; } int gs_mutex_lock(gs_mutex_t *mutex) { DWORD thisThread = GetCurrentThreadId(); DWORD ownerThread; // fast path if lock is not taken if (TryAcquireSRWLockExclusive(&mutex->lock)) { assert(mutex->depth == 0); mutex->depth = 1; atomic_store(&mutex->owner, thisThread); return 0; } // needs to be atomic because another thread can concurrently set it ownerThread = atomic_load(&mutex->owner); if (ownerThread == thisThread) { // this thread already owns this lock switch (mutex->attr) { case gs_mutex_attr_normal: // deadlock assert(mutex->depth == 1); AcquireSRWLockExclusive(&mutex->lock); assert(false); // not reached return 0; case gs_mutex_attr_errorcheck: // return deadlock error assert(mutex->depth == 1); return EDEADLK; case gs_mutex_attr_recursive: // recursive lock mutex->depth++; return 0; } } // wait for another thread to release the lock AcquireSRWLockExclusive(&mutex->lock); assert(mutex->depth == 0); mutex->depth = 1; atomic_store(&mutex->owner, thisThread); return 0; } int gs_mutex_trylock(gs_mutex_t *mutex) { DWORD thisThread = GetCurrentThreadId(); DWORD ownerThread; if (TryAcquireSRWLockExclusive(&mutex->lock)) { assert(mutex->depth == 0); mutex->depth = 1; atomic_store(&mutex->owner, thisThread); return 0; } // needs to be atomic because another thread can concurrently set it ownerThread = atomic_load(&mutex->owner); if (ownerThread == thisThread && mutex->attr == gs_mutex_attr_recursive) { // this thread already owns this lock and it's recursive assert(mutex->depth > 0); mutex->depth++; return 0; } // lock is taken return EBUSY; } int gs_mutex_unlock(gs_mutex_t *mutex) { switch (mutex->attr) { case gs_mutex_attr_normal: break; case gs_mutex_attr_errorcheck: case gs_mutex_attr_recursive: { // return error if lock is not held by this thread DWORD thisThread = GetCurrentThreadId(); DWORD ownerThread = atomic_load(&mutex->owner); if (ownerThread != thisThread) { return EPERM; } break; } } if (mutex->attr == gs_mutex_attr_recursive && mutex->depth > 1) { // recursive lock releasing inner lock mutex->depth--; return 0; } else { assert(mutex->depth == 1); mutex->depth = 0; atomic_store(&mutex->owner, 0); ReleaseSRWLockExclusive(&mutex->lock); return 0; } } // NB: timeout specified in milliseconds relative to now int gs_cond_timedwait(gs_cond_t *cond, gs_mutex_t *mutex, DWORD millisecs) { int retVal = 0; assert(mutex->depth == 1); mutex->depth = 0; atomic_store(&mutex->owner, 0); if (!SleepConditionVariableSRW(cond, &mutex->lock, millisecs, 0)) { DWORD lastError = GetLastError(); if (lastError == ERROR_TIMEOUT) { retVal = ETIMEDOUT; } else { retVal = lastError; } } assert(mutex->depth == 0); mutex->depth = 1; atomic_store(&mutex->owner, GetCurrentThreadId()); return retVal; } inline int gs_cond_wait(gs_cond_t *cond, gs_mutex_t *mutex) { return gs_cond_timedwait(cond, mutex, INFINITE); } #endif /* GS_USE_WIN32_THREADS_AND_LOCKS */ gnustep-base-1.29.0/Source/NSLog.m000066400000000000000000000321251435650067400166150ustar00rootroot00000000000000/** Interface for NSLog for GNUStep Copyright (C) 1996, 1997 Free Software Foundation, Inc. Written by: Adam Fedor Date: November 1996 This file is part of the GNUstep Base Library. 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 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 USA. NSLog reference $Date$ $Revision$ */ #import "common.h" #import "Foundation/NSDate.h" #import "Foundation/NSCalendarDate.h" #import "Foundation/NSTimeZone.h" #import "Foundation/NSException.h" #import "Foundation/NSProcessInfo.h" #import "Foundation/NSLock.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSData.h" #import "Foundation/NSThread.h" #import "GNUstepBase/NSString+GNUstepBase.h" // Some older BSD systems used a non-standard range of thread priorities. #ifdef HAVE_SYSLOG_H #include #elif HAVE_SYS_SLOG_H /* we are on a QNX-ish system, which has a syslog symbol somewhere, * but it isn't our syslog function (we use slogf().) */ # ifdef HAVE_SYSLOG # undef HAVE_SYSLOG # endif # include # ifdef HAVE_SYS_SLOGCODES_H # include # endif #endif #define UNISTR(X) \ ((const unichar*)[(X) cStringUsingEncoding: NSUnicodeStringEncoding]) #if defined(HAVE_SYSLOG) # if defined(LOG_ERR) # if defined(LOG_USER) # define SYSLOGMASK (LOG_ERR|LOG_USER) # else # define SYSLOGMASK (LOG_ERR) # endif // LOG_USER # elif defined(LOG_ERROR) # if defined(LOG_USER) # define SYSLOGMASK (LOG_ERROR|LOG_USER) # else # define SYSLOGMASK (LOG_ERROR) # endif // LOG_USER # else # error "Help, I can't find a logging level for syslog" # endif #endif // HAVE_SYSLOG #import "GSPrivate.h" extern NSThread *GSCurrentThread(); /** * A variable holding the file descriptor to which NSLogv() messages are * written by default. GNUstep initialises this to stderr.
* You may change this, but for thread safety should * use the lock provided by GSLogLock() to protect the change. */ int _NSLogDescriptor = 2; static NSRecursiveLock *myLock = nil; static IMP lockImp = 0; static IMP unlockImp = 0; /** * Returns the lock used to protect the GNUstep NSLogv() implementation. * Use this to protect changes to * _NSLogDescriptor and * _NSLog_printf_handler */ NSRecursiveLock * GSLogLock() { if (myLock == nil) { [gnustep_global_lock lock]; if (myLock == nil) { myLock = [NSRecursiveLock new]; lockImp = [myLock methodForSelector: @selector(lock)]; unlockImp = [myLock methodForSelector: @selector(unlock)]; } [gnustep_global_lock unlock]; } return myLock; } static void _NSLog_standard_printf_handler(NSString* message) { NSData *d; const char *buf; unsigned len; #if defined(_WIN32) LPCWSTR null_terminated_buf; #else #if defined(HAVE_SYSLOG) || defined(HAVE_SLOGF) char *null_terminated_buf = NULL; #endif #endif static NSStringEncoding enc = 0; if (enc == 0) { enc = [NSString defaultCStringEncoding]; } d = [message dataUsingEncoding: enc allowLossyConversion: NO]; if (d == nil) { d = [message dataUsingEncoding: NSUTF8StringEncoding allowLossyConversion: NO]; } if (d == nil) // Should never happen. { buf = [message lossyCString]; len = strlen(buf); } else { buf = (const char*)[d bytes]; len = [d length]; } #if defined(_WIN32) null_terminated_buf = UNISTR(message); OutputDebugStringW(null_terminated_buf); if ((GSPrivateDefaultsFlag(GSLogSyslog) == YES || write(_NSLogDescriptor, buf, len) != (int)len) && !IsDebuggerPresent()) { static HANDLE eventloghandle = 0; if (!eventloghandle) { eventloghandle = RegisterEventSourceW(NULL, UNISTR([[NSProcessInfo processInfo] processName])); } if (eventloghandle) { ReportEventW(eventloghandle, // event log handle EVENTLOG_WARNING_TYPE, // event type 0, // category zero 0, // event identifier NULL, // no user security identifier 1, // one substitution string 0, // no data &null_terminated_buf, // pointer to string array NULL); // pointer to data } } #else #if defined(HAVE_SYSLOG) if (GSPrivateDefaultsFlag(GSLogSyslog) == YES || write(_NSLogDescriptor, buf, len) != (int)len) { null_terminated_buf = malloc(sizeof (char) * (len + 1)); strncpy (null_terminated_buf, buf, len); null_terminated_buf[len] = '\0'; syslog(SYSLOGMASK, "%s", null_terminated_buf); free(null_terminated_buf); } #elif defined(HAVE_SLOGF) if (GSPrivateDefaultsFlag(GSLogSyslog) == YES || write(_NSLogDescriptor, buf, len) != (int)len) { /* QNX's slog has a size limit per entry. We might need to iterate over * _SLOG_MAXSIZEd chunks of the buffer */ const char *newBuf = buf; unsigned newLen = len; // Allocate at most _SLOG_MAXSIZE bytes null_terminated_buf = malloc(sizeof(char) * MIN(newLen, _SLOG_MAXSIZE)); // If it's shorter than that, we never even enter the loop while (newLen >= _SLOG_MAXSIZE) { strncpy(null_terminated_buf, newBuf, (_SLOG_MAXSIZE - 1)); null_terminated_buf[_SLOG_MAXSIZE] = '\0'; slogf(_SLOG_SETCODE(_SLOG_SYSLOG, 0), _SLOG_ERROR, "%s", null_terminated_buf); newBuf += (_SLOG_MAXSIZE - 1); newLen -= (_SLOG_MAXSIZE - 1); } /* Write out the rest (which will be at most (_SLOG_MAXSIZE - 1) chars, * so the terminator still fits. */ if (0 != newLen) { strncpy(null_terminated_buf, newBuf, newLen); null_terminated_buf[newLen] = '\0'; slogf(_SLOG_SETCODE(_SLOG_SYSLOG, 0), _SLOG_ERROR, "%s", null_terminated_buf); } free(null_terminated_buf); } #else write(_NSLogDescriptor, buf, len); #endif #endif // _WIN32 } /** * A pointer to a function used to actually write the log data. *

* GNUstep initialises this to a function implementing the standard * behavior for logging, but you may change this in your program * in order to implement any custom behavior you wish. You should * use the lock returned by GSLogLock() to protect any change you make. *

*

* Calls from NSLogv() to the function pointed to by this variable * are protected by a lock, and should therefore be thread safe. *

*

* This function should accept a single NSString argument and return void. *

* The default implementation in GNUstep performs as follows - * * * Converts the string to be logged to data in the default CString * encoding or, if that is not possible, to UTF8 data. * * * If the system supports writing to syslog and the user default to * say that logging should be done to syslog (GSLogSyslog) is set, * writes the data to the syslog.
* On an mswindows system, where syslog is not available, the * GSLogSyslog user default controls whether or not data is written * to the system event log, *
* * Otherwise, writes the data to the file descriptor stored in the * variable * _NSLogDescriptor, * which is set by default to stderr.
* Your program may change this descriptor ... but you should protect * changes using the lock provided by GSLogLock().
* NB. If the write to the descriptor fails, and the system supports * writing to syslog, then the log is written to syslog as if the * appropriate user default had been set. *
*
*/ NSLog_printf_handler *_NSLog_printf_handler = _NSLog_standard_printf_handler; /** *

Provides the standard OpenStep logging facility. For details see * the lower level NSLogv() function (which this function uses). *

*

GNUstep provides powerful alternatives for logging ... see * NSDebugLog(), NSWarnLog() and GSPrintf() for example. We recommend * the use of NSDebugLog() and its relatives for debug purposes, and * GSPrintf() for general log messages, with NSLog() being reserved * for reporting possible/likely errors. GSPrintf() is declared in * GSObjCRuntime.h. *

*/ void NSLog(NSString* format, ...) { va_list ap; va_start(ap, format); NSLogv(format, ap); va_end(ap); } /** * The core logging function ... *

* The function generates a standard log entry by prepending * process ID and date/time information to your message, and * ensuring that a newline is present at the end of the message. *

*

* In GNUstep, the GSLogThread user default may be set to YES in * order to instruct this function to include the name (if any) * of the current thread after the process ID. This can help you * to track the behavior of a multi-threaded program.
* Also the GSLogOffset user default may be set to YES in order * to instruct this function to include the time zone offset in * the timestamp it logs (good when examining debug logs from * systems running in different countries). *

*

* The resulting message is then passed to a handler function to * perform actual output. Locking is performed around the call to * the function actually writing the message out, to ensure that * logging is thread-safe. However, the actual creation of the * message written is only as safe as the [NSObject-description] methods * of the arguments you supply. *

*

* The function to write the data is pointed to by * _NSLog_printf_handler *

*/ void NSLogv(NSString* format, va_list args) { NSMutableString *prefix; NSString *message; NSString *threadName = nil; NSThread *t = nil; /* NB. On systems like Android where there is no operating system thread * ID available, the value returned by GSPrivateThreadID() should actually * be the pointer to the NSThread object. We will check for that later. */ NSUInteger tid = GSPrivateThreadID(); static int pid = 0; if (_NSLog_printf_handler == NULL) { _NSLog_printf_handler = *_NSLog_standard_printf_handler; } if (pid == 0) { #if defined(_WIN32) pid = (int)GetCurrentProcessId(); #else pid = (int)getpid(); #endif } if (GSPrivateDefaultsFlag(GSLogThread) == YES) { /* If no name has been set for the current thread, * we log the address of the NSThread object instead. */ t = GSCurrentThread(); threadName = [t name]; } prefix = [[NSMutableString alloc] initWithCapacity: 1000]; #ifdef HAVE_SYSLOG if (GSPrivateDefaultsFlag(GSLogSyslog) == YES) { if (nil == t || ((NSThread*)tid == t && nil == threadName)) { [prefix appendFormat: @"[thread:%"PRIuPTR"] ", tid]; } else if (nil == threadName) { [prefix appendFormat: @"[thread:%"PRIuPTR",%p] ", tid, t]; } else { [prefix appendFormat: @"[thread:%"PRIuPTR",%@] ", tid, threadName]; } } else #endif { NSString *fmt; NSString *cal; if (GSPrivateDefaultsFlag(GSLogOffset) == YES) { fmt = @"%Y-%m-%d %H:%M:%S.%F %z"; } else { fmt = @"%Y-%m-%d %H:%M:%S.%F"; } cal = [[NSCalendarDate calendarDate] descriptionWithCalendarFormat: fmt]; [prefix appendString: cal]; [prefix appendString: @" "]; [prefix appendString: [[NSProcessInfo processInfo] processName]]; if (nil == t || ((NSThread*)tid == t && nil == threadName)) { [prefix appendFormat: @"[%d:%"PRIuPTR"] ", pid, tid]; } else if (nil == threadName) { [prefix appendFormat: @"[%d:%"PRIuPTR",%p] ", pid, tid, t]; } else { [prefix appendFormat: @"[%d:%"PRIuPTR",%@] ", pid, tid, threadName]; } } message = [[NSString alloc] initWithFormat: format arguments: args]; [prefix appendString: message]; [message release]; if ([prefix hasSuffix: @"\n"] == NO) { [prefix appendString: @"\n"]; } if (nil == myLock) { GSLogLock(); } (*lockImp)(myLock, @selector(lock)); _NSLog_printf_handler(prefix); (*unlockImp)(myLock, @selector(unlock)); [prefix release]; } gnustep-base-1.29.0/Source/NSMapTable.m000066400000000000000000000155341435650067400175660ustar00rootroot00000000000000/** NSMapTable implementation for GNUStep. * Copyright (C) 2009 Free Software Foundation, Inc. * * Author: Richard Frith-Macdonald * * This file is part of the GNUstep Base Library. * * 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 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 USA. * * NSMapTable class reference * $Date$ $Revision$ */ #import "common.h" #import "Foundation/NSArray.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSException.h" #import "Foundation/NSPointerFunctions.h" #import "Foundation/NSMapTable.h" #import "NSCallBacks.h" @interface NSConcreteMapTable : NSMapTable @end @implementation NSMapTable static Class abstractClass = 0; static Class concreteClass = 0; + (id) allocWithZone: (NSZone*)aZone { if (self == abstractClass) { return NSAllocateObject(concreteClass, 0, aZone); } return NSAllocateObject(self, 0, aZone); } + (void) initialize { if (abstractClass == 0) { abstractClass = [NSMapTable class]; concreteClass = [NSConcreteMapTable class]; } } + (id) mapTableWithKeyOptions: (NSPointerFunctionsOptions)keyOptions valueOptions: (NSPointerFunctionsOptions)valueOptions { NSMapTable *t; t = [self allocWithZone: NSDefaultMallocZone()]; t = [t initWithKeyOptions: keyOptions valueOptions: valueOptions capacity: 0]; return AUTORELEASE(t); } + (id) mapTableWithStrongToStrongObjects { return [self mapTableWithKeyOptions: NSPointerFunctionsObjectPersonality valueOptions: NSPointerFunctionsObjectPersonality]; } + (id) mapTableWithStrongToWeakObjects { return [self mapTableWithKeyOptions: NSPointerFunctionsObjectPersonality valueOptions: NSPointerFunctionsObjectPersonality | NSPointerFunctionsZeroingWeakMemory]; } + (id) mapTableWithWeakToStrongObjects { return [self mapTableWithKeyOptions: NSPointerFunctionsObjectPersonality | NSPointerFunctionsZeroingWeakMemory valueOptions: NSPointerFunctionsObjectPersonality]; } + (id) mapTableWithWeakToWeakObjects { return [self mapTableWithKeyOptions: NSPointerFunctionsObjectPersonality | NSPointerFunctionsZeroingWeakMemory valueOptions: NSPointerFunctionsObjectPersonality | NSPointerFunctionsZeroingWeakMemory]; } + (id) strongToStrongObjectsMapTable { return [self mapTableWithKeyOptions: NSPointerFunctionsObjectPersonality valueOptions: NSPointerFunctionsObjectPersonality]; } + (id) strongToWeakObjectsMapTable { return [self mapTableWithKeyOptions: NSPointerFunctionsObjectPersonality valueOptions: NSPointerFunctionsObjectPersonality | NSMapTableWeakMemory]; } + (id) weakToStrongObjectsMapTable { return [self mapTableWithKeyOptions: NSPointerFunctionsObjectPersonality | NSMapTableWeakMemory valueOptions: NSPointerFunctionsObjectPersonality]; } + (id) weakToWeakObjectsMapTable { return [self mapTableWithKeyOptions: NSPointerFunctionsObjectPersonality | NSMapTableWeakMemory valueOptions: NSPointerFunctionsObjectPersonality | NSMapTableWeakMemory]; } - (id) initWithKeyOptions: (NSPointerFunctionsOptions)keyOptions valueOptions: (NSPointerFunctionsOptions)valueOptions capacity: (NSUInteger)initialCapacity { NSPointerFunctions *k; NSPointerFunctions *v; id o; k = [[NSPointerFunctions alloc] initWithOptions: keyOptions]; v = [[NSPointerFunctions alloc] initWithOptions: valueOptions]; o = [self initWithKeyPointerFunctions: k valuePointerFunctions: v capacity: initialCapacity]; [k release]; [v release]; return o; } - (id) initWithKeyPointerFunctions: (NSPointerFunctions*)keyFunctions valuePointerFunctions: (NSPointerFunctions*)valueFunctions capacity: (NSUInteger)initialCapacity { [self subclassResponsibility: _cmd]; return nil; } - (id) copyWithZone: (NSZone*)aZone { [self subclassResponsibility: _cmd]; return nil; } - (NSUInteger) count { [self subclassResponsibility: _cmd]; return (NSUInteger)0; } - (NSUInteger) countByEnumeratingWithState: (NSFastEnumerationState*)state objects: (id*)stackbuf count: (NSUInteger)len { [self subclassResponsibility: _cmd]; return (NSUInteger)0; } - (NSDictionary*) dictionaryRepresentation { NSEnumerator *enumerator; NSMutableDictionary *dictionary; id key; dictionary = [NSMutableDictionary dictionaryWithCapacity: [self count]]; enumerator = [self keyEnumerator]; while ((key = [enumerator nextObject]) != nil) { [dictionary setObject: [self objectForKey: key] forKey: key]; } return [[dictionary copy] autorelease]; } - (void) encodeWithCoder: (NSCoder*)aCoder { [self subclassResponsibility: _cmd]; } - (NSUInteger) hash { return [self count]; } - (id) initWithCoder: (NSCoder*)aCoder { [self subclassResponsibility: _cmd]; return nil; } - (BOOL) isEqual: (id)other { if ([other isKindOfClass: abstractClass] == NO) return NO; return NSCompareMapTables(self, other); } - (NSEnumerator*) keyEnumerator { return [self subclassResponsibility: _cmd]; } - (NSPointerFunctions*) keyPointerFunctions { return [self subclassResponsibility: _cmd]; } - (NSEnumerator*) objectEnumerator { return [self subclassResponsibility: _cmd]; } - (id) objectForKey: (id)aKey { return [self subclassResponsibility: _cmd]; } - (void) removeAllObjects { NSUInteger count = [self count]; if (count > 0) { NSEnumerator *enumerator; NSMutableArray *array; id key; array = [[NSMutableArray alloc] initWithCapacity: count]; enumerator = [self objectEnumerator]; while ((key = [enumerator nextObject]) != nil) { [array addObject: key]; } enumerator = [array objectEnumerator]; while ((key = [enumerator nextObject]) != nil) { [self removeObjectForKey: key]; } [array release]; } } - (void) removeObjectForKey: (id)aKey { [self subclassResponsibility: _cmd]; } - (void) setObject: (id)anObject forKey: (id)aKey { [self subclassResponsibility: _cmd]; } - (NSPointerFunctions*) valuePointerFunctions { return [self subclassResponsibility: _cmd]; } @end gnustep-base-1.29.0/Source/NSMassFormatter.m000066400000000000000000000065321435650067400206660ustar00rootroot00000000000000 /* Implementation of class NSMassFormatter Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory John Casamento Date: Mon Sep 30 15:58:21 EDT 2019 This file is part of the GNUstep Library. 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 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 USA. */ #import "Foundation/NSMassFormatter.h" #import "Foundation/NSMeasurement.h" #import "Foundation/NSMeasurementFormatter.h" #import "Foundation/NSNumberFormatter.h" #import "Foundation/NSUnit.h" @implementation NSMassFormatter - (instancetype) init { self = [super init]; if (self != nil) { _numberFormatter = nil; _unitStyle = NSFormattingUnitStyleMedium; _isForPersonMassUse = NO; } return self; } - (NSNumberFormatter *) numberFormatter { return _numberFormatter; } - (void) setNumberFormatter: (NSNumberFormatter *)formatter { ASSIGN(_numberFormatter, formatter); } - (NSFormattingUnitStyle) unitStyle { return _unitStyle; } - (void) setUnitStyle: (NSFormattingUnitStyle)style; { _unitStyle = style; } - (BOOL) isForPersonMassUse; { return _isForPersonMassUse; } - (void) setForPersonMassUse: (BOOL)flag; { _isForPersonMassUse = flag; } - (NSString *) stringFromValue: (double)value unit: (NSMassFormatterUnit)unit; { NSUnit *u = nil; NSMeasurement *m = nil; NSMeasurementFormatter *mf = nil; switch(unit) { case NSMassFormatterUnitGram: u = [NSUnitMass grams]; break; case NSMassFormatterUnitKilogram: u = [NSUnitMass kilograms]; break; case NSMassFormatterUnitOunce: u = [NSUnitMass ounces]; break; case NSMassFormatterUnitPound: u = [NSUnitMass pounds]; break; case NSMassFormatterUnitStone: u = [NSUnitMass stones]; break; } m = [[NSMeasurement alloc] initWithDoubleValue: value unit: u]; AUTORELEASE(m); mf = [[NSMeasurementFormatter alloc] init]; AUTORELEASE(mf); [mf setUnitStyle: _unitStyle]; [mf setNumberFormatter: _numberFormatter]; return [mf stringFromMeasurement: m]; } - (NSString *) stringFromKilograms: (double)numberInKilograms; { return [self stringFromValue: numberInKilograms unit: NSMassFormatterUnitKilogram]; } - (NSString *) unitStringFromValue: (double)value unit: (NSMassFormatterUnit)unit; { return [self stringFromValue: value unit: unit]; } - (NSString *) unitStringFromKilograms: (double)numberInKilograms usedUnit: (NSMassFormatterUnit *)unit { *unit = NSMassFormatterUnitKilogram; return [self stringFromValue: numberInKilograms unit: *unit]; } - (BOOL) getObjectValue: (id*)obj forString: (NSString *)string errorDescription: (NSString **)error { return NO; } @end gnustep-base-1.29.0/Source/NSMeasurement.m000066400000000000000000000101561435650067400203610ustar00rootroot00000000000000/* Implementation of class NSMeasurement Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory John Casamento Date: Mon Sep 30 15:58:21 EDT 2019 This file is part of the GNUstep Library. 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 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 USA. */ #import "Foundation/NSArchiver.h" #import "Foundation/NSException.h" #import "Foundation/NSKeyedArchiver.h" #import "Foundation/NSMeasurement.h" #import "Foundation/NSUnit.h" @implementation NSMeasurement // Creating Measurements - (instancetype) initWithDoubleValue: (double)doubleValue unit: (NSUnit *)unit { self = [super init]; if (self != nil) { ASSIGNCOPY(_unit, unit); _doubleValue = doubleValue; } return self; } - (void) dealloc { RELEASE(_unit); [super dealloc]; } // Accessing unit and value - (NSUnit *) unit { return _unit; } - (double) doubleValue { return _doubleValue; } // Conversion - (BOOL) canBeConvertedToUnit: (NSUnit *)unit { return ([unit isKindOfClass: [_unit class]] && [unit respondsToSelector: @selector(converter)]); } - (NSMeasurement *) measurementByConvertingToUnit: (NSUnit *)unit { if ([self canBeConvertedToUnit: unit]) { NSMeasurement *result = nil; double val = 0.0; // Do conversion... NSUnitConverter *c = [(NSDimension *)_unit converter]; val = [c baseUnitValueFromValue: _doubleValue]; c = [(NSDimension *)unit converter]; val = [c valueFromBaseUnitValue: val]; result = [[NSMeasurement alloc] initWithDoubleValue: val unit: unit]; return AUTORELEASE(result); } else { [NSException raise: NSInvalidArgumentException format: @"Cannot convert from %@ to %@", _unit, unit]; } return nil; } // Operating - (NSMeasurement *) measurementByAddingMeasurement: (NSMeasurement *)measurement { NSMeasurement *newMeasurement = [measurement measurementByConvertingToUnit: _unit]; double v = _doubleValue + [newMeasurement doubleValue]; NSMeasurement *result = [[NSMeasurement alloc] initWithDoubleValue: v unit: _unit]; return AUTORELEASE(result); } - (NSMeasurement *) measurementBySubtractingMeasurement: (NSMeasurement *)measurement { NSMeasurement *newMeasurement = [measurement measurementByConvertingToUnit: _unit]; double v = _doubleValue - [newMeasurement doubleValue]; NSMeasurement *result = [[NSMeasurement alloc] initWithDoubleValue: v unit: _unit]; return AUTORELEASE(result); } // NSCopying - (id) copyWithZone: (NSZone *)zone { return [[[self class] allocWithZone: zone] initWithDoubleValue: _doubleValue unit: _unit]; } // NSCoding - (void) encodeWithCoder: (NSCoder *)coder { if ([coder allowsKeyedCoding]) { [coder encodeObject: _unit forKey: @"NS.unit"]; [coder encodeDouble: _doubleValue forKey: @"NS.value"]; } else { [coder encodeObject: _unit]; [coder encodeValueOfObjCType: @encode(double) at: &_doubleValue]; } } - (id) initWithCoder: (NSCoder *)coder { if ((self = [super init]) != nil) { if ([coder allowsKeyedCoding]) { _unit = [coder decodeObjectForKey: @"NS.unit"]; _doubleValue = [coder decodeDoubleForKey: @"NS.value"]; } else { _unit = [coder decodeObject]; [coder decodeValueOfObjCType: @encode(double) at: &_doubleValue]; } } return self; } @end gnustep-base-1.29.0/Source/NSMeasurementFormatter.m000066400000000000000000000063161435650067400222500ustar00rootroot00000000000000/* Implementation of class NSMeasurementFormatter Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory John Casamento Date: Mon Sep 30 15:58:21 EDT 2019 This file is part of the GNUstep Library. 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 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 USA. */ #import "Foundation/NSLocale.h" #import "Foundation/NSMeasurement.h" #import "Foundation/NSMeasurementFormatter.h" #import "Foundation/NSNumberFormatter.h" #import "Foundation/NSUnit.h" @implementation NSMeasurementFormatter - (instancetype) init { self = [super init]; if (self != nil) { _unitOptions = NSMeasurementFormatterUnitOptionsProvidedUnit; _unitStyle = NSFormattingUnitStyleMedium; _locale = RETAIN([NSLocale currentLocale]); } return self; } - (void) dealloc { RELEASE(_locale); [super dealloc]; } - (NSMeasurementFormatterUnitOptions) unitOptions { return _unitOptions; } - (void) setUnitOptions: (NSMeasurementFormatterUnitOptions) unitOptions { _unitOptions = unitOptions; } - (NSFormattingUnitStyle) unitStyle { return _unitStyle; } - (void) setUnitStyle: (NSFormattingUnitStyle)style { _unitStyle = style; } - (NSLocale *) locale { return _locale; } - (void) setLocale: (NSLocale *)locale { ASSIGNCOPY(_locale, locale); } - (NSNumberFormatter *) numberFormatter { return _numberFormatter; } - (void) setNumberFormatter: (NSNumberFormatter *)numberFormatter { ASSIGNCOPY(_numberFormatter, numberFormatter); } - (NSString *) stringFromMeasurement: (NSMeasurement *)measurement { NSString *result = nil; NSNumber *num = [NSNumber numberWithDouble: [measurement doubleValue]]; NSUnit *u = [measurement unit]; result = [_numberFormatter stringForObjectValue: num]; switch (_unitStyle) { case NSFormattingUnitStyleShort: case NSFormattingUnitStyleMedium: case NSFormattingUnitStyleLong: result = [result stringByAppendingString: [self stringFromUnit: u]]; break; } return result; } - (NSString *) stringFromUnit: (NSUnit *)unit { return [unit symbol]; } - (NSString *) stringForObjectValue: (id)obj { NSString *result = nil; if ([obj isKindOfClass: [NSMeasurement class]]) { result = [self stringFromMeasurement: obj]; } else if ([obj isKindOfClass: [NSUnit class]]) { result = [self stringFromUnit: obj]; } return result; } - (id) initWithCoder: (NSCoder*)decoder { self = [super initWithCoder: decoder]; return self; } - (void) encodeWithCoder: (NSCoder*)encoder { [super encodeWithCoder: encoder]; } @end gnustep-base-1.29.0/Source/NSMessagePort.m000066400000000000000000001352421435650067400203310ustar00rootroot00000000000000/** Implementation of network port object based on unix domain sockets Copyright (C) 2000 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Based on code by: Andrew Kachites McCallum This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #define EXPOSE_NSPort_IVARS 1 #define EXPOSE_NSMessagePort_IVARS 1 #import "GNUstepBase/GSLock.h" #import "Foundation/NSArray.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSNotification.h" #import "Foundation/NSException.h" #import "Foundation/NSRunLoop.h" #import "Foundation/NSByteOrder.h" #import "Foundation/NSData.h" #import "Foundation/NSDate.h" #import "Foundation/NSMapTable.h" #import "Foundation/NSPortMessage.h" #import "Foundation/NSPortNameServer.h" #import "Foundation/NSLock.h" #import "Foundation/NSConnection.h" #import "Foundation/NSPathUtilities.h" #import "Foundation/NSValue.h" #import "Foundation/NSFileManager.h" #import "Foundation/NSProcessInfo.h" #import "GSPrivate.h" #import "GSNetwork.h" #import "GSPortPrivate.h" #include #include /* for MAXHOSTNAMELEN */ #include #include #include /* for inet_ntoa() */ #include /* for strchr() */ #if defined(HAVE_SYS_FCNTL_H) # include #elif defined(HAVE_FCNTL_H) # include #endif #include #include #include #include #if defined(HAVE_SYS_FILE_H) # include #endif #include /* * Stuff for setting the sockets into non-blocking mode. */ #if defined(__POSIX_SOURCE)\ || defined(__EXT_POSIX1_198808)\ || defined(O_NONBLOCK) #define NBLK_OPT O_NONBLOCK #else #define NBLK_OPT FNDELAY #endif #include #include #if !defined(SIOCGIFCONF) || defined(__CYGWIN__) #include #ifndef SIOCGIFCONF #include #endif #endif #if defined(__svr4__) # if defined(HAVE_SYS_STROPTS) # include # endif #endif @interface NSProcessInfo (private) + (BOOL) _exists: (int)pid; @end /* * Largest chunk of data possible in DO */ static uint32_t maxDataLength = 32 * 1024 * 1024; #if 0 #define M_LOCK(X) {NSDebugMLLog(@"NSMessagePort",@"lock %@",X); [X lock];} #define M_UNLOCK(X) {NSDebugMLLog(@"NSMessagePort",@"unlock %@",X); [X unlock];} #else #define M_LOCK(X) {[X lock];} #define M_UNLOCK(X) {[X unlock];} #endif /* * The GSPortItemType constant is used to identify the type of data in * each packet read. All data transmitted is in a packet, each packet * has an initial packet type and packet length. */ typedef enum { GSP_NONE, GSP_PORT, /* Simple port item. */ GSP_DATA, /* Simple data item. */ GSP_HEAD /* Port message header + initial data. */ } GSPortItemType; /* * The GSPortItemHeader structure defines the header for each item transmitted. * Its contents are transmitted in network byte order. */ typedef struct { uint32_t type; /* A GSPortItemType as a 4-byte number. */ uint32_t length; /* The length of the item (excluding header). */ } GSPortItemHeader; /* * The GSPortMsgHeader structure is at the start of any item of type GSP_HEAD. * Its contents are transmitted in network byte order. * Any additional data in the item is an NSData object. * NB. additional data counts as part of the same item. */ typedef struct { uint32_t mId; /* The ID for the message starting with this. */ uint32_t nItems; /* Number of items (including this one). */ } GSPortMsgHeader; typedef struct { unsigned char version; unsigned char addr[0]; /* name of the port on the local host */ } GSPortInfo; /* * Utility functions for encoding and decoding ports. */ static NSMessagePort* decodePort(NSData *data) { GSPortItemHeader *pih; GSPortInfo *pi; pih = (GSPortItemHeader*)[data bytes]; NSCAssert(GSSwapBigI32ToHost(pih->type) == GSP_PORT, NSInternalInconsistencyException); pi = (GSPortInfo*)&pih[1]; if (pi->version != 0) { NSLog(@"Remote version of GNUstep is more recent than this one (%i)", pi->version); return nil; } NSDebugFLLog(@"NSMessagePort", @"Decoded port as '%s'", pi->addr); return [NSMessagePort _portWithName: pi->addr listener: NO]; } static NSData* newDataWithEncodedPort(NSMessagePort *port) { GSPortItemHeader *pih; GSPortInfo *pi; NSMutableData *data; unsigned plen; const unsigned char *name = [port _name]; plen = 2 + strlen((char*)name); data = [[NSMutableData alloc] initWithLength: sizeof(GSPortItemHeader)+plen]; pih = (GSPortItemHeader*)[data mutableBytes]; pih->type = GSSwapHostI32ToBig(GSP_PORT); pih->length = GSSwapHostI32ToBig(plen); pi = (GSPortInfo*)&pih[1]; strncpy((char*)pi->addr, (char*)name, strlen((char*)name) + 1); NSDebugFLLog(@"NSMessagePort", @"Encoded port as '%s'", pi->addr); return data; } /* Older systems (Solaris) compatibility */ #ifndef AF_LOCAL #define AF_LOCAL AF_UNIX #define PF_LOCAL PF_UNIX #endif #ifndef SUN_LEN #define SUN_LEN(su) \ (sizeof(*(su)) - sizeof((su)->sun_path) + strlen((su)->sun_path)) #endif #define GS_CONNECTION_MSG 0 #define NETBLOCK 8192 /* * Theory of operation * * */ /* Private interfaces */ /* * Here is how data is transmitted over a socket - * Initially the process making the connection sends an item of type * GSP_PORT to tell the remote end what port is connecting to it. * Therafter, all communication is via port messages. Each port message * consists of an item of type GSP_HEAD followed by zero or more items * of type GSP_PORT or GSP_DATA. The number of items in a port message * is encoded in the 'nItems' field of the header. */ typedef enum { GS_H_UNCON = 0, // Currently idle and unconnected. GS_H_TRYCON, // Trying connection (outgoing). GS_H_ACCEPT, // Making initial connection (incoming). GS_H_CONNECTED // Currently connected. } GSHandleState; @interface GSMessageHandle : NSObject { int desc; /* File descriptor for I/O. */ unsigned wItem; /* Index of item being written. */ NSMutableData *wData; /* Data object being written. */ unsigned wLength; /* Ammount written so far. */ NSMutableArray *wMsgs; /* Message in progress. */ NSMutableData *rData; /* Buffer for incoming data */ uint32_t rLength; /* Amount read so far. */ uint32_t rWant; /* Amount desired. */ NSMutableArray *rItems; /* Message in progress. */ GSPortItemType rType; /* Type of data being read. */ uint32_t rId; /* Id of incoming message. */ unsigned nItems; /* Number of items to be read. */ GSHandleState state; /* State of the handle. */ unsigned int addrNum; /* Address number within host. */ @public NSRecursiveLock *myLock; /* Lock for this handle. */ BOOL caller; /* Did we connect to other end? */ BOOL valid; NSMessagePort *recvPort; NSMessagePort *sendPort; struct sockaddr_un sockAddr; /* Far end of connection. */ } + (GSMessageHandle*) handleWithDescriptor: (int)d; - (BOOL) connectToPort: (NSMessagePort*)aPort beforeDate: (NSDate*)when; - (int) descriptor; - (void) invalidate; - (BOOL) isValid; - (void) receivedEvent: (void*)data type: (RunLoopEventType)type extra: (void*)extra forMode: (NSString*)mode; - (NSMessagePort*) recvPort; - (BOOL) sendMessage: (NSArray*)components beforeDate: (NSDate*)when; - (NSMessagePort*) sendPort; - (void) setState: (GSHandleState)s; - (GSHandleState) state; @end @implementation GSMessageHandle static Class mutableArrayClass; static Class mutableDataClass; static Class portMessageClass; static Class runLoopClass; + (id) allocWithZone: (NSZone*)zone { [NSException raise: NSGenericException format: @"attempt to alloc a GSMessageHandle!"]; return nil; } + (GSMessageHandle*) handleWithDescriptor: (int)d { GSMessageHandle *handle; int e; if (d < 0) { NSLog(@"illegal descriptor (%d) for message handle", d); return nil; } if ((e = fcntl(d, F_GETFL, 0)) >= 0) { e |= NBLK_OPT; if (fcntl(d, F_SETFL, e) < 0) { NSLog(@"unable to set non-blocking mode on %d - %@", d, [NSError _last]); return nil; } } else { NSLog(@"unable to get non-blocking mode on %d - %@", d, [NSError _last]); return nil; } handle = (GSMessageHandle*)NSAllocateObject(self, 0, NSDefaultMallocZone()); handle->desc = d; handle->wMsgs = [NSMutableArray new]; handle->myLock = [NSRecursiveLock new]; handle->valid = YES; return AUTORELEASE(handle); } + (void) initialize { if (self == [GSMessageHandle class]) { mutableArrayClass = [NSMutableArray class]; mutableDataClass = [NSMutableData class]; portMessageClass = [NSPortMessage class]; runLoopClass = [NSRunLoop class]; } } - (void) _add: (NSRunLoop*)l { [l addEvent: (void*)(uintptr_t)desc type: ET_WDESC watcher: self forMode: NSConnectionReplyMode]; [l addEvent: (void*)(uintptr_t)desc type: ET_WDESC watcher: self forMode: NSDefaultRunLoopMode]; } - (void) _rem: (NSRunLoop*)l { [l removeEvent: (void*)(uintptr_t)desc type: ET_WDESC forMode: NSConnectionReplyMode all: NO]; [l removeEvent: (void*)(uintptr_t)desc type: ET_WDESC forMode: NSDefaultRunLoopMode all: NO]; } - (BOOL) connectToPort: (NSMessagePort*)aPort beforeDate: (NSDate*)when { NSRunLoop *l; const unsigned char *name; M_LOCK(myLock); NSDebugMLLog(@"NSMessagePort", @"Connecting on 0x%"PRIxPTR" before %@", (NSUInteger)self, when); if (state != GS_H_UNCON) { BOOL result; if (state == GS_H_CONNECTED) /* Already connected. */ { NSLog(@"attempting connect on connected handle"); result = YES; } else if (state == GS_H_ACCEPT) /* Impossible. */ { NSLog(@"attempting connect with accepting handle"); result = NO; } else /* Already connecting. */ { NSLog(@"attempting connect while connecting"); result = NO; } M_UNLOCK(myLock); return result; } if (recvPort == nil || aPort == nil) { NSLog(@"attempting connect with port(s) unset"); M_UNLOCK(myLock); return NO; /* impossible. */ } name = [aPort _name]; memset(&sockAddr, '\0', sizeof(sockAddr)); sockAddr.sun_family = AF_LOCAL; strncpy(sockAddr.sun_path, (char*)name, sizeof(sockAddr.sun_path) - 1); if (connect(desc, (struct sockaddr*)&sockAddr, SUN_LEN(&sockAddr)) < 0) { if (!GSWOULDBLOCK) { NSLog(@"unable to make connection to %s - %@", sockAddr.sun_path, [NSError _last]); M_UNLOCK(myLock); return NO; } } state = GS_H_TRYCON; l = [NSRunLoop currentRunLoop]; [self _add: l]; while (valid == YES && state == GS_H_TRYCON && [when timeIntervalSinceNow] > 0) { [l runMode: NSConnectionReplyMode beforeDate: when]; } [self _rem: l]; if (state == GS_H_TRYCON) { state = GS_H_UNCON; addrNum = 0; M_UNLOCK(myLock); return NO; /* Timed out */ } else if (state == GS_H_UNCON) { addrNum = 0; state = GS_H_UNCON; M_UNLOCK(myLock); return NO; } else { int status = 1; if (setsockopt(desc, SOL_SOCKET, SO_KEEPALIVE, (char*)&status, sizeof(status)) < 0) { NSLog(@"failed to turn on keepalive for connected socket %d", desc); } addrNum = 0; caller = YES; [aPort addHandle: self forSend: YES]; M_UNLOCK(myLock); return YES; } } - (void) dealloc { [self finalize]; DESTROY(rData); DESTROY(rItems); DESTROY(wMsgs); DESTROY(myLock); [super dealloc]; } - (NSString*) description { return [NSString stringWithFormat: @"", self, desc, sockAddr.sun_path]; } - (int) descriptor { return desc; } - (void) finalize { [self invalidate]; (void)close(desc); desc = -1; } - (void) invalidate { if (valid == YES) { M_LOCK(myLock); if (valid == YES) { NSRunLoop *l; valid = NO; l = [runLoopClass currentRunLoop]; [l removeEvent: (void*)(uintptr_t)desc type: ET_RDESC forMode: nil all: YES]; [l removeEvent: (void*)(uintptr_t)desc type: ET_WDESC forMode: nil all: YES]; NSDebugMLLog(@"NSMessagePort", @"invalidated 0x%"PRIxPTR, (NSUInteger)self); [[self recvPort] removeHandle: self]; [[self sendPort] removeHandle: self]; } M_UNLOCK(myLock); } } - (BOOL) isValid { return valid; } - (NSMessagePort*) recvPort { if (recvPort == nil) return nil; else return recvPort; } - (void) receivedEvent: (void*)data type: (RunLoopEventType)type extra: (void*)extra forMode: (NSString*)mode { NSDebugMLLog(@"NSMessagePort_details", @"received %s event on 0x%"PRIxPTR, type != ET_WDESC ? "read" : "write", (NSUInteger)self); /* * If we have been invalidated (desc < 0) then we should ignore this * event and remove ourself from the runloop. */ if (desc < 0) { NSRunLoop *l = [runLoopClass currentRunLoop]; [l removeEvent: data type: ET_WDESC forMode: mode all: YES]; return; } M_LOCK(myLock); if (type != ET_WDESC) { unsigned want; void *bytes; int res; /* * Make sure we have a buffer big enough to hold all the data we are * expecting, or NETBLOCK bytes, whichever is greater. */ if (rData == nil) { rData = [[mutableDataClass alloc] initWithLength: NETBLOCK]; rWant = sizeof(GSPortItemHeader); rLength = 0; want = NETBLOCK; } else { want = [rData length]; if (want < rWant) { want = rWant; [rData setLength: want]; } if (want < NETBLOCK) { want = NETBLOCK; [rData setLength: want]; } } /* * Now try to fill the buffer with data. */ bytes = [rData mutableBytes]; res = read(desc, bytes + rLength, want - rLength); if (res <= 0) { if (res == 0) { NSDebugMLLog(@"NSMessagePort", @"read eof on 0x%"PRIxPTR, (NSUInteger)self); M_UNLOCK(myLock); [self invalidate]; return; } else if (errno != EINTR && errno != EAGAIN) { NSDebugMLLog(@"NSMessagePort", @"read failed - %@ on 0x%p", [NSError _last], self); M_UNLOCK(myLock); [self invalidate]; return; } res = 0; /* Interrupted - continue */ } NSDebugMLLog(@"NSMessagePort_details", @"read %d bytes on 0x%"PRIxPTR, res, (NSUInteger)self); rLength += res; while (valid == YES && rLength >= rWant) { BOOL shouldDispatch = NO; switch (rType) { case GSP_NONE: { GSPortItemHeader *h; unsigned l; /* * We have read an item header - set up to read the * remainder of the item. */ h = (GSPortItemHeader*)bytes; rType = GSSwapBigI32ToHost(h->type); l = GSSwapBigI32ToHost(h->length); if (rType == GSP_PORT) { if (l > 512) { NSLog(@"%@ - unreasonable length (%u) for port", self, l); M_UNLOCK(myLock); [self invalidate]; return; } /* * For a port, we leave the item header in the data * so that our decode function can check length info. */ rWant += l; } else if (rType == GSP_DATA) { if (l == 0) { NSData *d; /* * For a zero-length data chunk, we create an empty * data object and add it to the current message. */ rType = GSP_NONE; /* ready for a new item */ rLength -= rWant; if (rLength > 0) { memmove(bytes, bytes + rWant, rLength); } rWant = sizeof(GSPortItemHeader); d = [mutableDataClass new]; [rItems addObject: d]; RELEASE(d); if (nItems == [rItems count]) { shouldDispatch = YES; } } else { if (l > maxDataLength) { NSLog(@"%@ - unreasonable length (%u) for data", self, l); M_UNLOCK(myLock); [self invalidate]; return; } /* * If not a port or zero length data, * we discard the data read so far and fill the * data object with the data item from the msg. */ rLength -= rWant; if (rLength > 0) { memmove(bytes, bytes + rWant, rLength); } rWant = l; } } else if (rType == GSP_HEAD) { if (l > maxDataLength) { NSLog(@"%@ - unreasonable length (%u) for data", self, l); M_UNLOCK(myLock); [self invalidate]; return; } /* * If not a port or zero length data, * we discard the data read so far and fill the * data object with the data item from the msg. */ rLength -= rWant; if (rLength > 0) { memmove(bytes, bytes + rWant, rLength); } rWant = l; } else { NSLog(@"%@ - bad data received on port handle, rType=%i", self, rType); M_UNLOCK(myLock); [self invalidate]; return; } } break; case GSP_HEAD: { GSPortMsgHeader *h; rType = GSP_NONE; /* ready for a new item */ /* * We have read a message header - set up to read the * remainder of the message. */ h = (GSPortMsgHeader*)bytes; rId = GSSwapBigI32ToHost(h->mId); nItems = GSSwapBigI32ToHost(h->nItems); NSAssert(nItems >0, NSInternalInconsistencyException); rItems = [mutableArrayClass allocWithZone: NSDefaultMallocZone()]; rItems = [rItems initWithCapacity: nItems]; if (rWant > sizeof(GSPortMsgHeader)) { NSData *d; /* * The first data item of the message was included in * the header - so add it to the rItems array. */ rWant -= sizeof(GSPortMsgHeader); d = [mutableDataClass alloc]; d = [d initWithBytes: bytes + sizeof(GSPortMsgHeader) length: rWant]; [rItems addObject: d]; RELEASE(d); rWant += sizeof(GSPortMsgHeader); rLength -= rWant; if (rLength > 0) { memmove(bytes, bytes + rWant, rLength); } rWant = sizeof(GSPortItemHeader); if (nItems == 1) { shouldDispatch = YES; } } else { /* * want to read another item */ rLength -= rWant; if (rLength > 0) { memmove(bytes, bytes + rWant, rLength); } rWant = sizeof(GSPortItemHeader); } } break; case GSP_DATA: { NSData *d; rType = GSP_NONE; /* ready for a new item */ d = [mutableDataClass allocWithZone: NSDefaultMallocZone()]; d = [d initWithBytes: bytes length: rWant]; [rItems addObject: d]; RELEASE(d); rLength -= rWant; if (rLength > 0) { memmove(bytes, bytes + rWant, rLength); } rWant = sizeof(GSPortItemHeader); if (nItems == [rItems count]) { shouldDispatch = YES; } } break; case GSP_PORT: { NSMessagePort *p; rType = GSP_NONE; /* ready for a new item */ p = decodePort(rData); if (p == nil) { NSLog(@"%@ - unable to decode remote port", self); M_UNLOCK(myLock); [self invalidate]; return; } /* * Set up to read another item header. */ rLength -= rWant; if (rLength > 0) { memmove(bytes, bytes + rWant, rLength); } rWant = sizeof(GSPortItemHeader); if (state == GS_H_ACCEPT) { /* * This is the initial port information on a new * connection - set up port relationships. */ state = GS_H_CONNECTED; [p addHandle: self forSend: YES]; } else { /* * This is a port within a port message - add * it to the message components. */ [rItems addObject: p]; if (nItems == [rItems count]) { shouldDispatch = YES; } } } break; } if (shouldDispatch == YES) { NSPortMessage *pm; NSMessagePort *rp = [self recvPort]; pm = [portMessageClass allocWithZone: NSDefaultMallocZone()]; pm = [pm initWithSendPort: [self sendPort] receivePort: rp components: rItems]; [pm setMsgid: rId]; rId = 0; DESTROY(rItems); NSDebugMLLog(@"NSMessagePort_details", @"got message %@ on 0x%"PRIxPTR, pm, (NSUInteger)self); IF_NO_ARC([rp retain];) M_UNLOCK(myLock); NS_DURING { [rp handlePortMessage: pm]; } NS_HANDLER { M_LOCK(myLock); RELEASE(pm); RELEASE(rp); [localException raise]; } NS_ENDHANDLER M_LOCK(myLock); RELEASE(pm); RELEASE(rp); bytes = [rData mutableBytes]; } } } else { if (state == GS_H_TRYCON) /* Connection attempt. */ { int res = 0; unsigned len = sizeof(res); /* Currently gnu hurd doesn't support getsockopt on local domain sockets * and fails with a 'protocol not supported' error. * We therefore just hope the connect was a success. */ #if !defined(__gnu_hurd__) if (getsockopt(desc, SOL_SOCKET, SO_ERROR, (char*)&res, &len) != 0) { state = GS_H_UNCON; NSLog(@"connect attempt failed - %@", [NSError _last]); } else if (res != 0) { state = GS_H_UNCON; NSLog(@"connect attempt failed - %@", [NSError _systemError: res]); } else #endif { NSData *d = newDataWithEncodedPort([self recvPort]); len = write(desc, [d bytes], [d length]); if (len == (int)[d length]) { NSDebugMLLog(@"NSMessagePort_details", @"wrote %d bytes on 0x%"PRIxPTR, len, (NSUInteger)self); state = GS_H_CONNECTED; } else { state = GS_H_UNCON; NSLog(@"connect write attempt failed - %@", [NSError _last]); } RELEASE(d); } } else { int res; unsigned l; const void *b; if (wData == nil) { if ([wMsgs count] > 0) { NSArray *components = [wMsgs objectAtIndex: 0]; wData = [components objectAtIndex: wItem++]; wLength = 0; } else { // NSLog(@"No messages to write on 0x%"PRIxPTR".", (NSUInteger)self); M_UNLOCK(myLock); return; } } b = [wData bytes]; l = [wData length]; res = write(desc, b + wLength, l - wLength); if (res < 0) { if (errno != EINTR && errno != EAGAIN) { NSLog(@"write attempt failed - %@", [NSError _last]); M_UNLOCK(myLock); [self invalidate]; return; } } else { NSDebugMLLog(@"NSMessagePort_details", @"wrote %d bytes on 0x%"PRIxPTR, res, (NSUInteger)self); wLength += res; if (wLength == l) { NSArray *components; /* * We have completed a data item so see what is * left of the message components. */ components = [wMsgs objectAtIndex: 0]; wLength = 0; if ([components count] > wItem) { /* * More to write - get next item. */ wData = [components objectAtIndex: wItem++]; } else { /* * message completed - remove from list. */ NSDebugMLLog(@"NSMessagePort_details", @"completed 0x%"PRIxPTR" on 0x%"PRIxPTR, (NSUInteger)components, (NSUInteger)self); wData = nil; wItem = 0; [wMsgs removeObjectAtIndex: 0]; } } } } } M_UNLOCK(myLock); } - (BOOL) sendMessage: (NSArray*)components beforeDate: (NSDate*)when { NSRunLoop *l; BOOL sent = NO; NSAssert([components count] > 0, NSInternalInconsistencyException); NSDebugMLLog(@"NSMessagePort_details", @"Sending message 0x%"PRIxPTR" %@ on 0x%"PRIxPTR"(%d) before %@", (NSUInteger)components, components, (NSUInteger)self, desc, when); M_LOCK(myLock); [wMsgs addObject: components]; l = [runLoopClass currentRunLoop]; IF_NO_ARC(RETAIN(self);) [self _add: l]; while (valid == YES && [wMsgs indexOfObjectIdenticalTo: components] != NSNotFound && [when timeIntervalSinceNow] > 0) { M_UNLOCK(myLock); [l runMode: NSConnectionReplyMode beforeDate: when]; M_LOCK(myLock); } [self _rem: l]; if ([wMsgs indexOfObjectIdenticalTo: components] == NSNotFound) { sent = YES; } else { [wMsgs removeObjectIdenticalTo: components]; } M_UNLOCK(myLock); NSDebugMLLog(@"NSMessagePort_details", @"Message send 0x%"PRIxPTR" on 0x%"PRIxPTR" status %d", (NSUInteger)components, (NSUInteger)self, sent); RELEASE(self); return sent; } - (NSMessagePort*) sendPort { if (sendPort == nil) return nil; else if (caller == YES) return sendPort; // We called, so port is not retained. else return sendPort; // Retained port. } - (void) setState: (GSHandleState)s { state = s; } - (GSHandleState) state { return state; } @end @interface NSMessagePort (RunLoop) - (void) receivedEvent: (void*)data type: (RunLoopEventType)type extra: (void*)extra forMode: (NSString*)mode; @end @implementation NSMessagePort static NSRecursiveLock *messagePortLock = nil; /* * Maps port name to NSMessagePort objects. */ static NSMapTable *messagePortMap = 0; static Class messagePortClass; + (void) atExit { NSMessagePort *port; NSData *name; NSMapEnumerator mEnum; NSAutoreleasePool *arp = [NSAutoreleasePool new]; mEnum = NSEnumerateMapTable(messagePortMap); while (NSNextMapEnumeratorPair(&mEnum, (void *)&name, (void *)&port)) { if ([port _listener] != -1) unlink([name bytes]); } NSEndMapTableEnumeration(&mEnum); DESTROY(messagePortMap); DESTROY(messagePortLock); [arp drain]; } typedef struct { NSData *_name; NSRecursiveLock *_myLock; NSMapTable *_handles; /* Handles indexed by socket. */ int _listener; /* Descriptor to listen on. */ } internal; #define name ((internal*)_internal)->_name #define myLock ((internal*)_internal)->_myLock #define handles ((internal*)_internal)->_handles #define lDesc ((internal*)_internal)->_listener + (void) initialize { if (self == [NSMessagePort class]) { NSAutoreleasePool *pool = [NSAutoreleasePool new]; NSFileManager *mgr; NSString *path; NSString *pref; NSString *file; NSEnumerator *files; messagePortClass = self; messagePortMap = NSCreateMapTable(NSNonRetainedObjectMapKeyCallBacks, NSNonOwnedPointerMapValueCallBacks, 0); messagePortLock = [NSRecursiveLock new]; /* It's possible that an old process, with the same process ID as * this one, got forcibly killed or crashed so that clean_up_sockets * was never called. * To deal with that unlikely situation, we need to remove all such * ports which have been left over. */ path = NSTemporaryDirectory(); path = [path stringByAppendingPathComponent: @"NSMessagePort"]; path = [path stringByAppendingPathComponent: @"ports"]; pref = [NSString stringWithFormat: @"%i.", [[NSProcessInfo processInfo] processIdentifier]]; mgr = [NSFileManager defaultManager]; files = [[mgr directoryContentsAtPath: path] objectEnumerator]; while ((file = [files nextObject]) != nil) { NSString *old = [path stringByAppendingPathComponent: file]; if (YES == [file hasPrefix: pref]) { NSDebugMLLog(@"NSMessagePort", @"Removing old port %@", old); [mgr removeFileAtPath: old handler: nil]; } else { int pid = [file intValue]; if (pid > 0) { if (NO == [NSProcessInfo _exists: pid]) { NSDebugMLLog(@"NSMessagePort", @"Removing old port %@ for process %d", old, pid); [mgr removeFileAtPath: old handler: nil]; } } } } [pool release]; [self registerAtExit]; } } + (id) new { static int unique_index = 0; NSString *path; NSDictionary *attr; if (nil == (path = NSTemporaryDirectory())) { return nil; } attr = [NSDictionary dictionaryWithObject: [NSNumber numberWithInt: 0700] forKey: NSFilePosixPermissions]; path = [path stringByAppendingPathComponent: @"NSMessagePort"]; [[NSFileManager defaultManager] createDirectoryAtPath: path withIntermediateDirectories: YES attributes: attr error: NULL]; path = [path stringByAppendingPathComponent: @"ports"]; [[NSFileManager defaultManager] createDirectoryAtPath: path withIntermediateDirectories: YES attributes: attr error: NULL]; M_LOCK(messagePortLock); path = [path stringByAppendingPathComponent: [NSString stringWithFormat: @"%i.%i", [[NSProcessInfo processInfo] processIdentifier], unique_index++]]; M_UNLOCK(messagePortLock); return RETAIN([self _portWithName: (unsigned char*)[path fileSystemRepresentation] listener: YES]); } /* * This is the preferred initialisation method for NSMessagePort * * 'socketName' is the name of the socket in the port directory */ + (NSMessagePort*) _portWithName: (const unsigned char *)socketName listener: (BOOL)shouldListen { unsigned i; NSMessagePort *port = nil; NSData *theName; theName = [[NSData alloc] initWithBytes: socketName length: strlen((char*)socketName)+1]; M_LOCK(messagePortLock); /* * First try to find a pre-existing port. */ port = (NSMessagePort*)NSMapGet(messagePortMap, theName); if (port == nil) { port = (NSMessagePort*)NSAllocateObject(self, 0, NSDefaultMallocZone()); port->_internal = (internal*)NSZoneMalloc(NSDefaultMallocZone(), sizeof(internal)); ((internal*)(port->_internal))->_name = theName; ((internal*)(port->_internal))->_listener = -1; ((internal*)(port->_internal))->_handles = NSCreateMapTable(NSIntegerMapKeyCallBacks, NSObjectMapValueCallBacks, 0); ((internal*)(port->_internal))->_myLock = [NSRecursiveLock new]; port->_is_valid = YES; if (shouldListen == YES) { int desc; struct sockaddr_un sockAddr; /* * Need size of buffer for getsockbyname() later. */ i = sizeof(sockAddr); /* * Creating a new port on the local host - so we must create a * listener socket to accept incoming connections. */ memset(&sockAddr, '\0', sizeof(sockAddr)); sockAddr.sun_family = AF_LOCAL; strncpy(sockAddr.sun_path, (char*)socketName, sizeof(sockAddr.sun_path) - 1); if ((desc = socket(PF_LOCAL, SOCK_STREAM, PF_UNSPEC)) < 0) { NSLog(@"unable to create socket - %@", [NSError _last]); desc = -1; } else if (bind(desc, (struct sockaddr *)&sockAddr, SUN_LEN(&sockAddr)) < 0) { if (connect(desc, (struct sockaddr*)&sockAddr, SUN_LEN(&sockAddr)) < 0) { NSDebugLLog(@"NSMessagePort", @"not live, resetting"); unlink((const char*)socketName); close(desc); if ((desc = socket(PF_LOCAL, SOCK_STREAM, PF_UNSPEC)) < 0) { NSLog(@"unable to create socket - %@", [NSError _last]); desc = -1; } else if (bind(desc, (struct sockaddr *)&sockAddr, SUN_LEN(&sockAddr)) < 0) { NSLog(@"unable to bind to %s - %@", sockAddr.sun_path, [NSError _last]); (void) close(desc); desc = -1; } } else { NSLog(@"unable to bind to %s - %@", sockAddr.sun_path, [NSError _last]); (void) close(desc); desc = -1; } } if (desc == -1) { DESTROY(port); } else if (listen(desc, GSBACKLOG) < 0) { NSLog(@"unable to listen on port - %@", [NSError _last]); (void) close(desc); DESTROY(port); } else if (getsockname(desc, (struct sockaddr*)&sockAddr, &i) < 0) { NSLog(@"unable to get socket name - %@", [NSError _last]); (void) close(desc); DESTROY(port); } else { /* * Set up the listening descriptor and the actual message port * number (which will have been set to a real port number when * we did the 'bind' call. */ ((internal*)port->_internal)->_listener = desc; /* * Make sure we have the map table for this port. */ NSMapInsert(messagePortMap, (void*)theName, (void*)port); NSDebugMLLog(@"NSMessagePort", @"Created listening port: %@", port); } } else { /* * Make sure we have the map table for this port. */ NSMapInsert(messagePortMap, (void*)theName, (void*)port); NSDebugMLLog(@"NSMessagePort", @"Created speaking port: %@", port); } } else { RELEASE(theName); IF_NO_ARC([port retain];) NSDebugMLLog(@"NSMessagePort", @"Using pre-existing port: %@", port); } IF_NO_ARC(AUTORELEASE(port);) M_UNLOCK(messagePortLock); return port; } - (void) addHandle: (GSMessageHandle*)handle forSend: (BOOL)send { M_LOCK(myLock); if (send == YES) { if (handle->caller == YES) handle->sendPort = self; else ASSIGN(handle->sendPort, self); } else { handle->recvPort = self; } NSMapInsert(handles, (void*)(uintptr_t)[handle descriptor], (void*)handle); M_UNLOCK(myLock); } - (id) copyWithZone: (NSZone*)zone { return RETAIN(self); } - (void) dealloc { [self finalize]; [super dealloc]; } - (NSString*) description { NSString *desc; desc = [NSString stringWithFormat: @"<%s %p file name %s>", GSClassNameFromObject(self), self, (char*)[name bytes]]; return desc; } - (void) finalize { NSDebugMLLog(@"NSMessagePort", @"NSMessagePort 0x%"PRIxPTR" finalized", (NSUInteger)self); [self invalidate]; if (_internal != 0) { DESTROY(name); NSFreeMapTable(handles); RELEASE(myLock); NSZoneFree(NSDefaultMallocZone(), _internal); } } /* * This is a callback method used by the NSRunLoop class to determine which * descriptors to watch for the port. */ - (void) getFds: (NSInteger*)fds count: (NSInteger*)count { NSInteger limit = *count; NSInteger pos = 0; NSMapEnumerator me; void *sock; GSMessageHandle *handle; id recvSelf; M_LOCK(myLock); /* * Put in our listening socket. */ if (lDesc >= 0) { if (pos < limit) { fds[pos] = lDesc; } pos++; } /* * Enumerate all our socket handles, and put them in as long as they * are to be used for receiving. */ recvSelf = self; me = NSEnumerateMapTable(handles); while (NSNextMapEnumeratorPair(&me, &sock, (void**)&handle)) { if (handle->recvPort == recvSelf) { if (pos < limit) { fds[pos] = (int)(intptr_t)sock; } pos++; } } NSEndMapTableEnumeration(&me); M_UNLOCK(myLock); *count = pos; } - (id) conversation: (NSPort*)recvPort { NSMapEnumerator me; void *dummy; GSMessageHandle *handle = nil; M_LOCK(myLock); /* * Enumerate all our socket handles, and look for one with port. */ me = NSEnumerateMapTable(handles); while (NSNextMapEnumeratorPair(&me, &dummy, (void**)&handle)) { if ((NSPort*) [handle recvPort] == recvPort) { IF_NO_ARC([handle retain];) NSEndMapTableEnumeration(&me); M_UNLOCK(myLock); return AUTORELEASE(handle); } } NSEndMapTableEnumeration(&me); M_UNLOCK(myLock); return nil; } - (GSMessageHandle*) handleForPort: (NSMessagePort*)recvPort beforeDate: (NSDate*)when { NSMapEnumerator me; int sock; void *dummy; GSMessageHandle *handle = nil; M_LOCK(myLock); /* * Enumerate all our socket handles, and look for one with port. */ me = NSEnumerateMapTable(handles); while (NSNextMapEnumeratorPair(&me, &dummy, (void**)&handle)) { if ([handle recvPort] == recvPort) { M_UNLOCK(myLock); NSEndMapTableEnumeration(&me); return handle; } } NSEndMapTableEnumeration(&me); /* * Not found ... create a new handle. */ handle = nil; sock = socket(PF_LOCAL, SOCK_STREAM, PF_UNSPEC); if (sock < 0) { NSLog(@"unable to create socket - %@", [NSError _last]); } else if ((handle = [GSMessageHandle handleWithDescriptor: sock]) == nil) { (void)close(sock); NSLog(@"unable to create GSMessageHandle - %@", [NSError _last]); } else { [recvPort addHandle: handle forSend: NO]; } M_UNLOCK(myLock); /* * If we succeeded in creating a new handle - connect to remote host. */ if (handle != nil) { if ([handle connectToPort: self beforeDate: when] == NO) { [handle invalidate]; handle = nil; } } return handle; } - (void) handlePortMessage: (NSPortMessage*)m { id d = [self delegate]; if (d == nil) { NSDebugMLLog(@"NSMessagePort", @"%@", @"No delegate to handle incoming message"); return; } if ([d respondsToSelector: @selector(handlePortMessage:)] == NO) { NSDebugMLLog(@"NSMessagePort", @"%@", @"delegate doesn't handle messages"); return; } [d handlePortMessage: m]; } - (NSUInteger) hash { return [name hash]; } - (id) init { DESTROY(self); self = [messagePortClass new]; return self; } - (void) invalidate { if ([self isValid] == YES) { IF_NO_ARC(RETAIN(self);) M_LOCK(myLock); if ([self isValid] == YES) { NSArray *handleArray; unsigned i; M_LOCK(messagePortLock); NSMapRemove(messagePortMap, (void*)name); M_UNLOCK(messagePortLock); if (lDesc >= 0) { (void) close(lDesc); unlink([name bytes]); lDesc = -1; } handleArray = NSAllMapTableValues(handles); i = [handleArray count]; while (i-- > 0) { GSMessageHandle *handle; handle = [handleArray objectAtIndex: i]; [handle invalidate]; } [[NSMessagePortNameServer sharedInstance] removePort: self]; [super invalidate]; } M_UNLOCK(myLock); RELEASE(self); } } - (BOOL) isEqual: (id)anObject { if (anObject == self) { return YES; } if ([anObject class] == [self class] && [self isValid] && [anObject isValid]) { NSMessagePort *o = (NSMessagePort*)anObject; return [((internal*)o->_internal)->_name isEqual: name]; } return NO; } - (void) receivedEvent: (void*)data type: (RunLoopEventType)type extra: (void*)extra forMode: (NSString*)mode { int desc = (int)(uintptr_t)extra; GSMessageHandle *handle; if (desc == lDesc) { struct sockaddr_un sockAddr; unsigned size = sizeof(sockAddr); desc = accept(lDesc, (struct sockaddr*)&sockAddr, &size); if (desc < 0) { NSDebugMLLog(@"NSMessagePort", @"accept failed - handled in other thread?"); } else { int status = 1; if (setsockopt(desc, SOL_SOCKET, SO_KEEPALIVE, (char*)&status, sizeof(status)) < 0) { NSLog(@"failed to turn on keepalive for accepted socket %d", desc); } /* * Create a handle for the socket and set it up so we are its * receiving port, and it's waiting to get the port name from * the other end. */ handle = [GSMessageHandle handleWithDescriptor: desc]; memcpy(&handle->sockAddr, &sockAddr, sizeof(sockAddr)); [handle setState: GS_H_ACCEPT]; [self addHandle: handle forSend: NO]; } } else { M_LOCK(myLock); handle = (GSMessageHandle*)NSMapGet(handles, (void*)(uintptr_t)desc); IF_NO_ARC(AUTORELEASE(RETAIN(handle));) M_UNLOCK(myLock); if (handle == nil) { const char *t; if (type == ET_RDESC) t = "rdesc"; else if (type == ET_WDESC) t = "wdesc"; else if (type == ET_RPORT) t = "rport"; else t = "unknown"; NSLog(@"No handle for event %s on descriptor %d", t, desc); } else { [handle receivedEvent: data type: type extra: extra forMode: mode]; } } } - (oneway void) release { M_LOCK(messagePortLock); if (NSDecrementExtraRefCountWasZero(self)) { if (_internal != 0) { NSMapRemove(messagePortMap, (void*)name); } M_UNLOCK(messagePortLock); [self dealloc]; } else { M_UNLOCK(messagePortLock); } } - (void) removeHandle: (GSMessageHandle*)handle { IF_NO_ARC(RETAIN(self);) M_LOCK(myLock); if ([handle sendPort] == self) { if (handle->caller != YES) { /* * This is a handle for a send port, and the handle was not formed * by calling the remote process, so this port object must have * been created to deal with an incoming connection and will have * been retained - we must therefore release this port since the * handle no longer uses it. */ IF_NO_ARC([self autorelease];) } handle->sendPort = nil; } if ([handle recvPort] == self) { handle->recvPort = nil; } NSMapRemove(handles, (void*)(uintptr_t)[handle descriptor]); if (lDesc < 0 && NSCountMapTable(handles) == 0) { [self invalidate]; } M_UNLOCK(myLock); RELEASE(self); } /* * This returns the amount of space that a port coder should reserve at the * start of its encoded data so that the NSMessagePort can insert header info * into the data. * The idea is that a message consisting of a single data item with space at * the start can be written directly without having to copy data to another * buffer etc. */ - (NSUInteger) reservedSpaceLength { return sizeof(GSPortItemHeader) + sizeof(GSPortMsgHeader); } - (BOOL) sendBeforeDate: (NSDate*)when msgid: (NSInteger)msgId components: (NSMutableArray*)components from: (NSPort*)receivingPort reserved: (NSUInteger)length { BOOL sent = NO; GSMessageHandle *h; unsigned rl; if ([self isValid] == NO) { return NO; } if ([components count] == 0) { NSLog(@"empty components sent"); return NO; } /* * If the reserved length in the first data object is wrong - we have to * fail, unless it's zero, in which case we can insert a data object for * the header. */ rl = [self reservedSpaceLength]; if (length != 0 && length != rl) { NSLog(@"bad reserved length - %"PRIuPTR, length); return NO; } if ([receivingPort isKindOfClass: messagePortClass] == NO) { NSLog(@"woah there - receiving port is not the correct type"); return NO; } h = [self handleForPort: (NSMessagePort*)receivingPort beforeDate: when]; if (h != nil) { NSMutableData *header; unsigned hLength; unsigned l; GSPortItemHeader *pih; GSPortMsgHeader *pmh; unsigned c = [components count]; unsigned i; BOOL pack = YES; /* * Ok - ensure we have space to insert header info. */ if (length == 0 && rl != 0) { header = [[mutableDataClass alloc] initWithCapacity: NETBLOCK]; [header setLength: rl]; [components insertObject: header atIndex: 0]; RELEASE(header); } header = [components objectAtIndex: 0]; /* * The Item header contains the item type and the length of the * data in the item (excluding the item header itself). */ hLength = [header length]; l = hLength - sizeof(GSPortItemHeader); pih = (GSPortItemHeader*)[header mutableBytes]; pih->type = GSSwapHostI32ToBig(GSP_HEAD); pih->length = GSSwapHostI32ToBig(l); /* * The message header contains the message Id and the original count * of components in the message (excluding any extra component added * simply to hold the header). */ pmh = (GSPortMsgHeader*)&pih[1]; pmh->mId = GSSwapHostI32ToBig(msgId); pmh->nItems = GSSwapHostI32ToBig(c); /* * Now insert item header information as required. * Pack as many items into the initial data object as possible, up to * a maximum of NETBLOCK bytes. This is to try to get a single, * efficient write operation if possible. */ c = [components count]; for (i = 1; i < c; i++) { id o = [components objectAtIndex: i]; if ([o isKindOfClass: [NSData class]]) { GSPortItemHeader *pih; unsigned h = sizeof(GSPortItemHeader); unsigned l = [o length]; void *b; if (pack == YES && hLength + l + h <= NETBLOCK) { [header setLength: hLength + l + h]; b = [header mutableBytes]; b += hLength; #if NEED_WORD_ALIGNMENT /* * When packing data, an item may not be aligned on a * word boundary, so we work with an aligned buffer * and use memcmpy() */ if ((hLength % __alignof__(uint32_t)) != 0) { GSPortItemHeader itemHeader; pih = (GSPortItemHeader*)&itemHeader; pih->type = GSSwapHostI32ToBig(GSP_DATA); pih->length = GSSwapHostI32ToBig(l); memcpy(b, (void*)pih, h); } else { pih = (GSPortItemHeader*)b; pih->type = GSSwapHostI32ToBig(GSP_DATA); pih->length = GSSwapHostI32ToBig(l); } #else pih = (GSPortItemHeader*)b; pih->type = GSSwapHostI32ToBig(GSP_DATA); pih->length = GSSwapHostI32ToBig(l); #endif memcpy(b+h, [o bytes], l); [components removeObjectAtIndex: i--]; c--; hLength += l + h; } else { NSMutableData *d; pack = NO; d = [[NSMutableData alloc] initWithLength: l + h]; b = [d mutableBytes]; pih = (GSPortItemHeader*)b; memcpy(b+h, [o bytes], l); pih->type = GSSwapHostI32ToBig(GSP_DATA); pih->length = GSSwapHostI32ToBig(l); [components replaceObjectAtIndex: i withObject: d]; RELEASE(d); } } else if ([o isKindOfClass: messagePortClass]) { NSData *d = newDataWithEncodedPort(o); unsigned dLength = [d length]; if (pack == YES && hLength + dLength <= NETBLOCK) { void *b; [header setLength: hLength + dLength]; b = [header mutableBytes]; b += hLength; hLength += dLength; memcpy(b, [d bytes], dLength); [components removeObjectAtIndex: i--]; c--; } else { pack = NO; [components replaceObjectAtIndex: i withObject: d]; } RELEASE(d); } } /* * Now send the message. */ sent = [h sendMessage: components beforeDate: when]; } return sent; } - (const unsigned char *) _name { return [name bytes]; } - (int) _listener { return lDesc; } @end gnustep-base-1.29.0/Source/NSMessagePortNameServer.m000066400000000000000000000420421435650067400223140ustar00rootroot00000000000000/* Implementation of message port subclass of NSPortNameServer Copyright (C) 2005 Free Software Foundation, Inc. This file is part of the GNUstep Base Library. 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 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 USA. NSMessagePortNameServer class reference $Date$ $Revision$ */ #import "common.h" #import "Foundation/NSPortNameServer.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSException.h" #import "Foundation/NSLock.h" #import "Foundation/NSDistributedLock.h" #import "Foundation/NSMapTable.h" #import "Foundation/NSPathUtilities.h" #import "Foundation/NSPort.h" #import "Foundation/NSFileManager.h" #import "Foundation/NSValue.h" #import "Foundation/NSThread.h" #import "GNUstepBase/GSMime.h" #import "GSPortPrivate.h" #include #if defined(HAVE_SYS_SIGNAL_H) # include #elif defined(HAVE_SIGNAL_H) # include #endif #if defined(HAVE_SYS_FCNTL_H) # include #elif defined(HAVE_FCNTL_H) # include #endif #include /* Older systems (Solaris) compatibility */ #ifndef AF_LOCAL #define AF_LOCAL AF_UNIX #define PF_LOCAL PF_UNIX #endif #ifndef SUN_LEN #define SUN_LEN(su) \ (sizeof(*(su)) - sizeof((su)->sun_path) + strlen((su)->sun_path)) #endif @interface NSProcessInfo (private) + (BOOL) _exists: (int)pid; @end static NSRecursiveLock *serverLock = nil; static NSMessagePortNameServer *defaultServer = nil; /* Maps NSMessagePort objects to NSMutableArray:s of NSString:s. The array is an array of names the port has been registered under by _us_. Note that this map holds the names the port has been registered under at some time. If the name is been unregistered by some other program, we can't update the table, so we have to deal with the case where the array contains names that the port isn't registered under. Since we _have_to_ deal with this anyway, we handle it in -removePort: and -removePort:forName:, and we don't bother removing entries in the map when unregistering a name not for a specific port. */ static NSMapTable *portToNamesMap; @interface NSMessagePortNameServer (private) + (NSDistributedLock*) _fileLock; + (NSString *) _pathForName: (NSString *)name; @end /** * Subclass of [NSPortNameServer] taking/returning instances of [NSMessagePort]. * Port removal functionality is not supported; if you want to cancel a service, * you have to destroy the port (invalidate the [NSMessagePort] given to * [NSPortNameServer-registerPort:forName:]). */ @implementation NSMessagePortNameServer + (void) atExit { NSMapEnumerator mEnum; NSMessagePort *port; NSString *name; NSAutoreleasePool *arp = [NSAutoreleasePool new]; mEnum = NSEnumerateMapTable(portToNamesMap); while (NSNextMapEnumeratorPair(&mEnum, (void *)&port, (void *)&name)) { [defaultServer removePort: port]; } NSEndMapTableEnumeration(&mEnum); DESTROY(portToNamesMap); DESTROY(serverLock); [arp drain]; } + (void) initialize { if (self == [NSMessagePortNameServer class]) { NSAutoreleasePool *pool = [NSAutoreleasePool new]; NSFileManager *mgr; NSString *path; NSString *pid; NSString *file; NSEnumerator *files; serverLock = [NSRecursiveLock new]; /* Use NSNonOwnedPointerMapKeyCallBacks for the ports used as keys * since we want as pointer test for equality as we may be doing * lookup while dealocating the port (in which case the -isEqual: * method could fail). */ portToNamesMap = NSCreateMapTable(NSNonOwnedPointerMapKeyCallBacks, NSObjectMapValueCallBacks, 0); [self registerAtExit]; /* It's possible that an old process, with the same process ID as * this one, got forcibly killed or crashed so that +atExit * was never called. * To deal with that unlikely situation, we need to remove all such * names which have been left over. */ path = NSTemporaryDirectory(); path = [path stringByAppendingPathComponent: @"NSMessagePort"]; path = [path stringByAppendingPathComponent: @"names"]; pid = [NSString stringWithFormat: @"%i", [[NSProcessInfo processInfo] processIdentifier]]; mgr = [NSFileManager defaultManager]; files = [[mgr directoryContentsAtPath: path] objectEnumerator]; while ((file = [files nextObject]) != nil) { NSString *old = [path stringByAppendingPathComponent: file]; NSArray *lines; NSString *line; int opid; BOOL isDir = NO; if ([mgr fileExistsAtPath: old isDirectory: &isDir] == NO || YES == isDir) { continue; // Ignore removed file or lock directory } lines = [[NSString stringWithContentsOfFile: old] componentsSeparatedByString: @"\n"]; if ([lines count] > 1 && (opid = [(line = [lines objectAtIndex: 1]) intValue]) > 0) { if (YES == [line isEqual: pid]) { NSDebugMLLog(@"NSMessagePort", @"Removing old name %@", old); [mgr removeFileAtPath: old handler: nil]; } else if (NO == [NSProcessInfo _exists: opid]) { NSDebugMLLog(@"NSMessagePort", @"Removing old name %@ for process %d", old, opid); [mgr removeFileAtPath: old handler: nil]; } } else { NSDebugMLLog(@"NSMessagePort", @"Removing bad name %@", old); [mgr removeFileAtPath: old handler: nil]; } } [pool release]; } } /** * Obtain single instance for this host. */ + (id) sharedInstance { if (defaultServer == nil) { [serverLock lock]; if (defaultServer == nil) { defaultServer = (NSMessagePortNameServer *)NSAllocateObject(self, 0, NSDefaultMallocZone()); } [serverLock unlock]; } return defaultServer; } + (NSDistributedLock*) _fileLock { NSDistributedLock *dl; dl = [NSDistributedLock lockWithPath: [self _pathForName: nil]]; if ([dl tryLock] == NO) { NSDate *limit = [NSDate dateWithTimeIntervalSinceNow: 2.0]; while (dl != nil && [dl tryLock] == NO) { if ([limit timeIntervalSinceNow] > 0.0) { [NSThread sleepForTimeInterval: 0.1]; } else { if ([[dl lockDate] timeIntervalSinceNow] < -15.0) { NS_DURING { [dl breakLock]; } NS_HANDLER { NSLog(@"Failed to break lock on names for " @"NSMessagePortNameServer: %@", localException); dl = nil; } NS_ENDHANDLER } else { NSLog(@"Failed to lock names for NSMessagePortNameServer"); dl = nil; } } } } return dl; } /* Return the full path for the supplied port name or, if it's nil, * the path for the distributed lock protecting all names. */ + (NSString *) _pathForName: (NSString *)name { static NSString *base_path = nil; NSString *path; NSData *data; if (name == nil) { name = @"lock"; } else { /* * Make sure name is representable as a filename ... assume base64 encoded * strings are valid on all filesystems. */ data = [name dataUsingEncoding: NSUTF8StringEncoding]; data = [GSMimeDocument encodeBase64: data]; name = [[NSString alloc] initWithData: data encoding: NSASCIIStringEncoding]; IF_NO_ARC([name autorelease];) } [serverLock lock]; if (!base_path) { NSDictionary *attr; if (nil == (path = NSTemporaryDirectory())) { [serverLock unlock]; return nil; } attr = [NSDictionary dictionaryWithObject: [NSNumber numberWithInt: 0700] forKey: NSFilePosixPermissions]; path = [path stringByAppendingPathComponent: @"NSMessagePort"]; [[NSFileManager defaultManager] createDirectoryAtPath: path withIntermediateDirectories: YES attributes: attr error: NULL]; path = [path stringByAppendingPathComponent: @"names"]; [[NSFileManager defaultManager] createDirectoryAtPath: path withIntermediateDirectories: YES attributes: attr error: NULL]; base_path = RETAIN(path); } else { path = base_path; } [serverLock unlock]; path = [path stringByAppendingPathComponent: name]; return path; } + (BOOL) _livePort: (NSString *)path { FILE *f; char socket_path[512]; int len; int pid; struct stat sb; NSDebugLLog(@"NSMessagePort", @"_livePort: %@", path); f = fopen([path fileSystemRepresentation], "rt"); if (!f) { NSDebugLLog(@"NSMessagePort", @"not live, couldn't open %@ (%m)", path); return NO; } if (fstat(fileno(f), &sb) < 0) { NSDebugLLog(@"NSMessagePort", @"not live, couldn't stat %@ (%m)", path); fclose(f); return NO; } if (sb.st_uid != getuid() && sb.st_uid != geteuid()) { NSDebugLLog(@"NSMessagePort", @"not live, %@ not owned by us", path); fclose(f); return NO; } if ((sb.st_mode & 0777) != 0600) { NSDebugLLog(@"NSMessagePort", @"not live, %@ not correct access", path); fclose(f); return NO; } fgets(socket_path, sizeof(socket_path), f); len = strlen(socket_path); if (len == 0 || socket_path[len - 1] != '\n') { fclose(f); NSDebugLLog(@"NSMessagePort", @"not live, couldn't get file in %@", path); return NO; } socket_path[len - 1] = '\0'; if (fscanf(f, "%i", &pid) != 1) { fclose(f); NSDebugLLog(@"NSMessagePort", @"not live, couldn't read PID in %@", path); return NO; } fclose(f); if (stat(socket_path, &sb) < 0) { unlink([path fileSystemRepresentation]); NSDebugLLog(@"NSMessagePort", @"not live, couldn't stat socket (%m)"); return NO; } if (kill(pid, 0) < 0) { unlink([path fileSystemRepresentation]); unlink(socket_path); NSDebugLLog(@"NSMessagePort", @"not live, no such process (%m)"); return NO; } else { struct sockaddr_un sockAddr; int desc; memset(&sockAddr, '\0', sizeof(sockAddr)); sockAddr.sun_family = AF_LOCAL; strncpy(sockAddr.sun_path, socket_path, sizeof(sockAddr.sun_path) - 1); if ((desc = socket(PF_LOCAL, SOCK_STREAM, PF_UNSPEC)) < 0) { unlink([path fileSystemRepresentation]); unlink(socket_path); NSDebugLLog(@"NSMessagePort", @"couldn't create socket, assuming not live (%m)"); return NO; } if (connect(desc, (struct sockaddr*)&sockAddr, SUN_LEN(&sockAddr)) < 0) { close(desc); unlink([path fileSystemRepresentation]); unlink(socket_path); NSDebugLLog(@"NSMessagePort", @"not live, can't connect (%m)"); return NO; } close(desc); NSDebugLLog(@"NSMessagePort", @"port is live"); return YES; } } - (NSPort*) portForName: (NSString*)name { return [self portForName: name onHost: nil]; } - (NSPort*) portForName: (NSString *)name onHost: (NSString *)host { NSDistributedLock *dl; NSString *path; FILE *f; char socket_path[512]; NSDebugLLog(@"NSMessagePort", @"portForName: %@ host: %@", name, host); if ([host length] > 0) { NSLog(@"Attempt to contact a named host using a " @"message port name server. This name server can only be used " @"to contact processes owned by the same user on the local host " @"(host name must be nil or an empty string). To contact processes " @"owned by other users or on other hosts you must use an instance " @"of the NSSocketPortNameServer class."); if (NO == [host isEqualToString: @"*"]) { return nil; } } path = [[self class] _pathForName: name]; if ((dl = [[self class] _fileLock]) == nil) { [NSException raise: NSGenericException format: @"Failed to lock names for NSMessagePortNameServer"]; } if (![[self class] _livePort: path]) { [dl unlock]; NSDebugLLog(@"NSMessagePort", @"not a live port"); return nil; } f = fopen([path fileSystemRepresentation], "rt"); if (!f) { [dl unlock]; NSDebugLLog(@"NSMessagePort", @"can't open file (%m)"); return nil; } fgets(socket_path, sizeof(socket_path), f); if (strlen(socket_path) > 0) socket_path[strlen(socket_path) - 1] = 0; fclose(f); NSDebugLLog(@"NSMessagePort", @"got %s", socket_path); [dl unlock]; return [NSMessagePort _portWithName: (unsigned char*)socket_path listener: NO]; } - (BOOL) registerPort: (NSPort *)port forName: (NSString *)name { int fd; unsigned char buf[32]; NSDistributedLock *dl; NSString *path; const unsigned char *socket_name; NSMutableArray *a; NSDebugLLog(@"NSMessagePort", @"register %@ as %@\n", port, name); if ([port isKindOfClass: [NSMessagePort class]] == NO) { [NSException raise: NSInvalidArgumentException format: @"Attempted to register a non-NSMessagePort (%@)", port]; } path = [[self class] _pathForName: name]; if ((dl = [[self class] _fileLock]) == nil) { [NSException raise: NSGenericException format: @"Failed to lock names for NSMessagePortNameServer"]; } if ([[self class] _livePort: path]) { [dl unlock]; NSDebugLLog(@"NSMessagePort", @"fail, is a live port (%@)", name); return NO; } fd = open([path fileSystemRepresentation], O_CREAT|O_EXCL|O_WRONLY, 0600); if (fd < 0) { [dl unlock]; NSDebugLLog(@"NSMessagePort", @"fail, can't open file (%@) for %@", path, name); return NO; } socket_name = [(NSMessagePort *)port _name]; write(fd, (char*)socket_name, strlen((char*)socket_name)); write(fd, "\n", 1); snprintf((char*)buf, sizeof(buf), "%i\n", getpid()); write(fd, (char*)buf, strlen((char*)buf)); close(fd); [serverLock lock]; a = NSMapGet(portToNamesMap, port); if (!a) { a = [[NSMutableArray alloc] init]; NSMapInsert(portToNamesMap, port, a); RELEASE(a); } name = [name copy]; [a addObject: name]; [name release]; [serverLock unlock]; [dl unlock]; return YES; } - (BOOL) removePortForName: (NSString *)name { NSDistributedLock *dl; NSString *path; NSDebugLLog(@"NSMessagePort", @"removePortForName: %@", name); path = [[self class] _pathForName: name]; if ((dl = [[self class] _fileLock]) == nil) { [NSException raise: NSGenericException format: @"Failed to lock names for NSMessagePortNameServer"]; } unlink([path fileSystemRepresentation]); [dl unlock]; return YES; } - (NSArray *) namesForPort: (NSPort *)port { NSMutableArray *a; [serverLock lock]; a = NSMapGet(portToNamesMap, port); a = [a copy]; [serverLock unlock]; return AUTORELEASE(a); } - (BOOL) removePort: (NSPort *)port { NSMutableArray *a; int i; NSDebugLLog(@"NSMessagePort", @"removePort: %@", port); [serverLock lock]; a = NSMapGet(portToNamesMap, port); for (i = 0; i < [a count]; i++) { [self removePort: port forName: [a objectAtIndex: i]]; } NSMapRemove(portToNamesMap, port); [serverLock unlock]; return YES; } - (BOOL) removePort: (NSPort*)port forName: (NSString*)name { FILE *f; char socket_path[512]; NSDistributedLock *dl; NSString *path; const unsigned char *port_path; NSDebugLLog(@"NSMessagePort", @"removePort: %@ forName: %@", port, name); path = [[self class] _pathForName: name]; if ((dl = [[self class] _fileLock]) == nil) { [NSException raise: NSGenericException format: @"Failed to lock names for NSMessagePortNameServer"]; } f = fopen([path fileSystemRepresentation], "rt"); if (!f) { [dl unlock]; return YES; } fgets(socket_path, sizeof(socket_path), f); if (strlen(socket_path) > 0) { socket_path[strlen(socket_path) - 1] = 0; } fclose(f); port_path = [(NSMessagePort *)port _name]; if (!strcmp((char*)socket_path, (char*)port_path)) { unlink([path fileSystemRepresentation]); } [dl unlock]; return YES; } @end gnustep-base-1.29.0/Source/NSMetadata.m000066400000000000000000000165021435650067400176150ustar00rootroot00000000000000/**Interface for NSMetadataQuery for GNUStep Copyright (C) 2012 Free Software Foundation, Inc. Written by: Gregory Casamento Date: 2012 This file is part of the GNUstep Base Library. 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 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 USA. AutogsdocSource: NSMetadata.m */ #import "common.h" #define EXPOSE_NSMetadataItem_IVARS 1 #define EXPOSE_NSMetadataQuery_IVARS 1 #define EXPOSE_NSMetadataQueryAttributeValueTuple_IVARS 1 #define EXPOSE_NSMetadataQueryResultGroupInternal_IVARS 1 #define EXPOSE_NSMetadataQueryResultGroup_IVARS 1 #import "Foundation/NSMetadata.h" #import "Foundation/NSArray.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSPredicate.h" #import "Foundation/NSString.h" #import "Foundation/NSTimer.h" @implementation NSMetadataItem #define myAttributes ((NSMutableDictionary*)_NSMetadataItemInternal) - (NSArray *) attributes { return [myAttributes allKeys]; } - (void) dealloc { [myAttributes release]; [super dealloc]; } - (id) init { if (nil != (self = [super init])) { _NSMetadataItemInternal = (void*)[NSMutableDictionary new]; } return self; } - (id) valueForAttribute: (NSString *)key { return [myAttributes objectForKey: key]; } - (NSDictionary *) valuesForAttributes: (NSArray *)keys { NSMutableDictionary *results = [NSMutableDictionary dictionary]; NSEnumerator *en = [keys objectEnumerator]; id key = nil; while ((key = [en nextObject]) != nil) { id value = [self valueForAttribute: key]; [results setObject: value forKey: key]; } return results; } @end @interface NSMetadataQueryInternal : NSObject { @public BOOL _isStopped; BOOL _isGathering; BOOL _isStarted; NSArray *_searchURLs; NSArray *_scopes; NSArray *_sortDescriptors; NSPredicate *_predicate; NSArray *_groupingAttributes; NSArray *_valueListAttributes; NSTimeInterval _notificationBatchingInterval; NSMutableDictionary *_results; id _delegate; } @end @implementation NSMetadataQueryInternal @end #ifdef this #undef this #endif #define this ((NSMetadataQueryInternal*)_NSMetadataQueryInternal) @implementation NSMetadataQuery - (void) dealloc { [this release]; [super dealloc]; } - (id) delegate; { return this->_delegate; } - (void) disableUpdates { [self subclassResponsibility: _cmd]; } - (void) enableUpdates { [self subclassResponsibility: _cmd]; } - (NSArray *) groupedResults; { return [self subclassResponsibility: _cmd]; } - (NSArray *) groupingAttributes { return [self subclassResponsibility: _cmd]; } - (NSUInteger) indexOfResult: (id)result { [self subclassResponsibility: _cmd]; return NSNotFound; } - (id) init { if ((self = [super init]) != nil) { _NSMetadataQueryInternal = (void*)[NSMetadataQueryInternal new]; this->_isStopped = YES; this->_isGathering = NO; this->_isStarted = NO; this->_notificationBatchingInterval = (NSTimeInterval)0.0; } return self; } - (BOOL) isGathering { return this->_isGathering; } - (BOOL) isStarted { return this->_isStarted; } - (BOOL) isStopped { return this->_isStopped; } - (NSTimeInterval) notificationBatchingInterval { [self subclassResponsibility: _cmd]; return (NSTimeInterval)0; } - (NSPredicate *) predicate { return this->_predicate; } - (id) resultAtIndex: (NSUInteger)index { return [self subclassResponsibility: _cmd]; } - (NSUInteger) resultCount { [self subclassResponsibility: _cmd]; return 0; } - (NSArray *) results { return [self subclassResponsibility: _cmd]; } - (NSArray *) searchItemURLs { return this->_searchURLs; } - (NSArray *) searchScopes { return this->_scopes; } - (void) setDelegate: (id)delegate; { this->_delegate = delegate; } - (void) setGroupingAttributes: (NSArray *)attrs { [self subclassResponsibility: _cmd]; } - (void) setNotificationBatchingInterval: (NSTimeInterval)interval { [self subclassResponsibility: _cmd]; } - (void) setPredicate: (NSPredicate *)predicate { ASSIGNCOPY(this->_predicate, predicate); } - (void) setSearchItemURLs: (NSArray *)urls { ASSIGNCOPY(this->_searchURLs, urls); } - (void) setSearchScopes: (NSArray *)scopes { ASSIGNCOPY(this->_scopes, scopes); } - (void) setSortDescriptors: (NSArray *)descriptors { ASSIGNCOPY(this->_sortDescriptors, descriptors); } - (void) setValueListAttributes: (NSArray *)attrs { [self subclassResponsibility: _cmd]; } - (NSArray *) sortDescriptors { return this->_sortDescriptors; } - (BOOL) startQuery { [self subclassResponsibility: _cmd]; return NO; } - (void) stopQuery { [self subclassResponsibility: _cmd]; } - (id) valueOfAttribute: (id)attr forResultAtIndex: (NSUInteger)index { return [self subclassResponsibility: _cmd]; } - (NSDictionary *) valueLists { return [self subclassResponsibility: _cmd]; } - (NSArray *) valueListAttributes { return [self subclassResponsibility: _cmd]; } @end @interface NSMetadataQueryAttributeValueTupleInternal : NSObject { @public id _attribute; id _value; NSUInteger _count; } @end @implementation NSMetadataQueryAttributeValueTupleInternal @end #ifdef this #undef this #endif #define this ((NSMetadataQueryAttributeValueTupleInternal*)\ _NSMetadataQueryAttributeValueTupleInternal) @implementation NSMetadataQueryAttributeValueTuple - (NSString *) attribute { return this->_attribute; } - (NSUInteger) count { return this->_count; } - (void) dealloc { [this release]; [super dealloc]; } - (id) init { if (nil != (self = [super init])) { _NSMetadataQueryAttributeValueTupleInternal = (void*)[NSMetadataQueryAttributeValueTupleInternal new]; } return self; } - (id) value { return this->_value; } @end @interface NSMetadataQueryResultGroupInternal : NSObject { @public id _attribute; id _value; NSMutableArray *_subgroups; } @end @implementation NSMetadataQueryResultGroupInternal @end #ifdef this #undef this #endif #define this ((NSMetadataQueryResultGroupInternal*)\ _NSMetadataQueryResultGroupInternal) @implementation NSMetadataQueryResultGroup : NSObject - (NSString *) attribute { return this->_attribute; } - (void) dealloc { [this release]; [super dealloc]; } - (id) init { if (nil != (self = [super init])) { _NSMetadataQueryResultGroupInternal = (void*)[NSMetadataQueryResultGroupInternal new]; } return self; } - (id) resultAtIndex: (NSUInteger)index { return [this->_subgroups objectAtIndex:index]; } - (NSUInteger) resultCount { return [this->_subgroups count]; } - (NSArray *) results { return [self subgroups]; } - (NSArray *) subgroups { return this->_subgroups; } - (id) value { return this->_value; } @end gnustep-base-1.29.0/Source/NSMetadataAttributes.m000066400000000000000000000445521435650067400216720ustar00rootroot00000000000000/* Implementation of class NSMetadataAttributes Copyright (C) 2019 Free Software Foundation, Inc. By: heron Date: Tue Oct 29 00:53:11 EDT 2019 This file is part of the GNUstep Library. 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 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 USA. */ #include #include GS_DECLARE NSString *const NSMetadataItemAcquisitionMakeKey = @"NSMetadataItemAcquisitionMakeKey"; GS_DECLARE NSString *const NSMetadataItemAcquisitionModelKey = @"NSMetadataItemAcquisitionModelKey"; GS_DECLARE NSString *const NSMetadataItemAlbumKey = @"NSMetadataItemAlbumKey"; GS_DECLARE NSString *const NSMetadataItemAltitudeKey = @"NSMetadataItemAltitudeKey"; GS_DECLARE NSString *const NSMetadataItemApertureKey = @"NSMetadataItemApertureKey"; GS_DECLARE NSString *const NSMetadataItemAppleLoopDescriptorsKey = @"NSMetadataItemAppleLoopDescriptorsKey"; GS_DECLARE NSString *const NSMetadataItemAppleLoopsKeyFilterTypeKey = @"NSMetadataItemAppleLoopsKeyFilterTypeKey"; GS_DECLARE NSString *const NSMetadataItemAppleLoopsLoopModeKey = @"NSMetadataItemAppleLoopsLoopModeKey"; GS_DECLARE NSString *const NSMetadataItemAppleLoopsRootKeyKey = @"NSMetadataItemAppleLoopsRootKeyKey"; GS_DECLARE NSString *const NSMetadataItemApplicationCategoriesKey = @"NSMetadataItemApplicationCategoriesKey"; GS_DECLARE NSString *const NSMetadataItemAttributeChangeDateKey = @"NSMetadataItemAttributeChangeDateKey"; GS_DECLARE NSString *const NSMetadataItemAudiencesKey = @"NSMetadataItemAudiencesKey"; GS_DECLARE NSString *const NSMetadataItemAudioBitRateKey = @"NSMetadataItemAudioBitRateKey"; GS_DECLARE NSString *const NSMetadataItemAudioChannelCountKey = @"NSMetadataItemAudioChannelCountKey"; GS_DECLARE NSString *const NSMetadataItemAudioEncodingApplicationKey = @"NSMetadataItemAudioEncodingApplicationKey"; GS_DECLARE NSString *const NSMetadataItemAudioSampleRateKey = @"NSMetadataItemAudioSampleRateKey"; GS_DECLARE NSString *const NSMetadataItemAudioTrackNumberKey = @"NSMetadataItemAudioTrackNumberKey"; GS_DECLARE NSString *const NSMetadataItemAuthorAddressesKey = @"NSMetadataItemAuthorAddressesKey"; GS_DECLARE NSString *const NSMetadataItemAuthorEmailAddressesKey = @"NSMetadataItemAuthorEmailAddressesKey"; GS_DECLARE NSString *const NSMetadataItemAuthorsKey = @"NSMetadataItemAuthorsKey"; GS_DECLARE NSString *const NSMetadataItemBitsPerSampleKey = @"NSMetadataItemBitsPerSampleKey"; GS_DECLARE NSString *const NSMetadataItemCameraOwnerKey = @"NSMetadataItemCameraOwnerKey"; GS_DECLARE NSString *const NSMetadataItemCFBundleIdentifierKey = @"NSMetadataItemCFBundleIdentifierKey"; GS_DECLARE NSString *const NSMetadataItemCityKey = @"NSMetadataItemCityKey"; GS_DECLARE NSString *const NSMetadataItemCodecsKey = @"NSMetadataItemCodecsKey"; GS_DECLARE NSString *const NSMetadataItemColorSpaceKey = @"NSMetadataItemColorSpaceKey"; GS_DECLARE NSString *const NSMetadataItemCommentKey = @"NSMetadataItemCommentKey"; GS_DECLARE NSString *const NSMetadataItemComposerKey = @"NSMetadataItemComposerKey"; GS_DECLARE NSString *const NSMetadataItemContactKeywordsKey = @"NSMetadataItemContactKeywordsKey"; GS_DECLARE NSString *const NSMetadataItemContentCreationDateKey = @"NSMetadataItemContentCreationDateKey"; GS_DECLARE NSString *const NSMetadataItemContentModificationDateKey = @"NSMetadataItemContentModificationDateKey"; GS_DECLARE NSString *const NSMetadataItemContentTypeKey = @"NSMetadataItemContentTypeKey"; GS_DECLARE NSString *const NSMetadataItemContentTypeTreeKey = @"NSMetadataItemContentTypeTreeKey"; GS_DECLARE NSString *const NSMetadataItemContributorsKey = @"NSMetadataItemContributorsKey"; GS_DECLARE NSString *const NSMetadataItemCopyrightKey = @"NSMetadataItemCopyrightKey"; GS_DECLARE NSString *const NSMetadataItemCountryKey = @"NSMetadataItemCountryKey"; GS_DECLARE NSString *const NSMetadataItemCoverageKey = @"NSMetadataItemCoverageKey"; GS_DECLARE NSString *const NSMetadataItemCreatorKey = @"NSMetadataItemCreatorKey"; GS_DECLARE NSString *const NSMetadataItemDateAddedKey = @"NSMetadataItemDateAddedKey"; GS_DECLARE NSString *const NSMetadataItemDeliveryTypeKey = @"NSMetadataItemDeliveryTypeKey"; GS_DECLARE NSString *const NSMetadataItemDescriptionKey = @"NSMetadataItemDescriptionKey"; GS_DECLARE NSString *const NSMetadataItemDirectorKey = @"NSMetadataItemDirectorKey"; GS_DECLARE NSString *const NSMetadataItemDisplayNameKey = @"NSMetadataItemDisplayNameKey"; GS_DECLARE NSString *const NSMetadataItemDownloadedDateKey = @"NSMetadataItemDownloadedDateKey"; GS_DECLARE NSString *const NSMetadataItemDueDateKey = @"NSMetadataItemDueDateKey"; GS_DECLARE NSString *const NSMetadataItemDurationSecondsKey = @"NSMetadataItemDurationSecondsKey"; GS_DECLARE NSString *const NSMetadataItemEditorsKey = @"NSMetadataItemEditorsKey"; GS_DECLARE NSString *const NSMetadataItemEmailAddressesKey = @"NSMetadataItemEmailAddressesKey"; GS_DECLARE NSString *const NSMetadataItemEncodingApplicationsKey = @"NSMetadataItemEncodingApplicationsKey"; GS_DECLARE NSString *const NSMetadataItemExecutableArchitecturesKey = @"NSMetadataItemExecutableArchitecturesKey"; GS_DECLARE NSString *const NSMetadataItemExecutablePlatformKey = @"NSMetadataItemExecutablePlatformKey"; GS_DECLARE NSString *const NSMetadataItemEXIFGPSVersionKey = @"NSMetadataItemEXIFGPSVersionKey"; GS_DECLARE NSString *const NSMetadataItemEXIFVersionKey = @"NSMetadataItemEXIFVersionKey"; GS_DECLARE NSString *const NSMetadataItemExposureModeKey = @"NSMetadataItemExposureModeKey"; GS_DECLARE NSString *const NSMetadataItemExposureProgramKey = @"NSMetadataItemExposureProgramKey"; GS_DECLARE NSString *const NSMetadataItemExposureTimeSecondsKey = @"NSMetadataItemExposureTimeSecondsKey"; GS_DECLARE NSString *const NSMetadataItemExposureTimeStringKey = @"NSMetadataItemExposureTimeStringKey"; GS_DECLARE NSString *const NSMetadataItemFinderCommentKey = @"NSMetadataItemFinderCommentKey"; GS_DECLARE NSString *const NSMetadataItemFlashOnOffKey = @"NSMetadataItemFlashOnOffKey"; GS_DECLARE NSString *const NSMetadataItemFNumberKey = @"NSMetadataItemFNumberKey"; GS_DECLARE NSString *const NSMetadataItemFocalLength35mmKey = @"NSMetadataItemFocalLength35mmKey"; GS_DECLARE NSString *const NSMetadataItemFocalLengthKey = @"NSMetadataItemFocalLengthKey"; GS_DECLARE NSString *const NSMetadataItemFontsKey = @"NSMetadataItemFontsKey"; GS_DECLARE NSString *const NSMetadataItemFSContentChangeDateKey = @"NSMetadataItemFSContentChangeDateKey"; GS_DECLARE NSString *const NSMetadataItemFSCreationDateKey = @"NSMetadataItemFSCreationDateKey"; GS_DECLARE NSString *const NSMetadataItemFSNameKey = @"NSMetadataItemFSNameKey"; GS_DECLARE NSString *const NSMetadataItemFSSizeKey = @"NSMetadataItemFSSizeKey"; GS_DECLARE NSString *const NSMetadataItemGenreKey = @"NSMetadataItemGenreKey"; GS_DECLARE NSString *const NSMetadataItemGPSAreaInformationKey = @"NSMetadataItemGPSAreaInformationKey"; GS_DECLARE NSString *const NSMetadataItemGPSDateStampKey = @"NSMetadataItemGPSDateStampKey"; GS_DECLARE NSString *const NSMetadataItemGPSDestBearingKey = @"NSMetadataItemGPSDestBearingKey"; GS_DECLARE NSString *const NSMetadataItemGPSDestDistanceKey = @"NSMetadataItemGPSDestDistanceKey"; GS_DECLARE NSString *const NSMetadataItemGPSDestLatitudeKey = @"NSMetadataItemGPSDestLatitudeKey"; GS_DECLARE NSString *const NSMetadataItemGPSDestLongitudeKey = @"NSMetadataItemGPSDestLongitudeKey"; GS_DECLARE NSString *const NSMetadataItemGPSDifferentalKey = @"NSMetadataItemGPSDifferentalKey"; GS_DECLARE NSString *const NSMetadataItemGPSDOPKey = @"NSMetadataItemGPSDOPKey"; GS_DECLARE NSString *const NSMetadataItemGPSMapDatumKey = @"NSMetadataItemGPSMapDatumKey"; GS_DECLARE NSString *const NSMetadataItemGPSMeasureModeKey = @"NSMetadataItemGPSMeasureModeKey"; GS_DECLARE NSString *const NSMetadataItemGPSProcessingMethodKey = @"NSMetadataItemGPSProcessingMethodKey"; GS_DECLARE NSString *const NSMetadataItemGPSStatusKey = @"NSMetadataItemGPSStatusKey"; GS_DECLARE NSString *const NSMetadataItemGPSTrackKey = @"NSMetadataItemGPSTrackKey"; GS_DECLARE NSString *const NSMetadataItemHasAlphaChannelKey = @"NSMetadataItemHasAlphaChannelKey"; GS_DECLARE NSString *const NSMetadataItemHeadlineKey = @"NSMetadataItemHeadlineKey"; GS_DECLARE NSString *const NSMetadataItemIdentifierKey = @"NSMetadataItemIdentifierKey"; GS_DECLARE NSString *const NSMetadataItemImageDirectionKey = @"NSMetadataItemImageDirectionKey"; GS_DECLARE NSString *const NSMetadataItemInformationKey = @"NSMetadataItemInformationKey"; GS_DECLARE NSString *const NSMetadataItemInstantMessageAddressesKey = @"NSMetadataItemInstantMessageAddressesKey"; GS_DECLARE NSString *const NSMetadataItemInstructionsKey = @"NSMetadataItemInstructionsKey"; GS_DECLARE NSString *const NSMetadataItemIsApplicationManagedKey = @"NSMetadataItemIsApplicationManagedKey"; GS_DECLARE NSString *const NSMetadataItemIsGeneralMIDISequenceKey = @"NSMetadataItemIsGeneralMIDISequenceKey"; GS_DECLARE NSString *const NSMetadataItemIsLikelyJunkKey = @"NSMetadataItemIsLikelyJunkKey"; GS_DECLARE NSString *const NSMetadataItemISOSpeedKey = @"NSMetadataItemISOSpeedKey"; GS_DECLARE NSString *const NSMetadataItemIsUbiquitousKey = @"NSMetadataItemIsUbiquitousKey"; GS_DECLARE NSString *const NSMetadataItemKeySignatureKey = @"NSMetadataItemKeySignatureKey"; GS_DECLARE NSString *const NSMetadataItemKeywordsKey = @"NSMetadataItemKeywordsKey"; GS_DECLARE NSString *const NSMetadataItemKindKey = @"NSMetadataItemKindKey"; GS_DECLARE NSString *const NSMetadataItemLanguagesKey = @"NSMetadataItemLanguagesKey"; GS_DECLARE NSString *const NSMetadataItemLastUsedDateKey = @"NSMetadataItemLastUsedDateKey"; GS_DECLARE NSString *const NSMetadataItemLatitudeKey = @"NSMetadataItemLatitudeKey"; GS_DECLARE NSString *const NSMetadataItemLayerNamesKey = @"NSMetadataItemLayerNamesKey"; GS_DECLARE NSString *const NSMetadataItemLensModelKey = @"NSMetadataItemLensModelKey"; GS_DECLARE NSString *const NSMetadataItemLongitudeKey = @"NSMetadataItemLongitudeKey"; GS_DECLARE NSString *const NSMetadataItemLyricistKey = @"NSMetadataItemLyricistKey"; GS_DECLARE NSString *const NSMetadataItemMaxApertureKey = @"NSMetadataItemMaxApertureKey"; GS_DECLARE NSString *const NSMetadataItemMediaTypesKey = @"NSMetadataItemMediaTypesKey"; GS_DECLARE NSString *const NSMetadataItemMeteringModeKey = @"NSMetadataItemMeteringModeKey"; GS_DECLARE NSString *const NSMetadataItemMusicalGenreKey = @"NSMetadataItemMusicalGenreKey"; GS_DECLARE NSString *const NSMetadataItemMusicalInstrumentCategoryKey = @"NSMetadataItemMusicalInstrumentCategoryKey"; GS_DECLARE NSString *const NSMetadataItemMusicalInstrumentNameKey = @"NSMetadataItemMusicalInstrumentNameKey"; GS_DECLARE NSString *const NSMetadataItemNamedLocationKey = @"NSMetadataItemNamedLocationKey"; GS_DECLARE NSString *const NSMetadataItemNumberOfPagesKey = @"NSMetadataItemNumberOfPagesKey"; GS_DECLARE NSString *const NSMetadataItemOrganizationsKey = @"NSMetadataItemOrganizationsKey"; GS_DECLARE NSString *const NSMetadataItemOrientationKey = @"NSMetadataItemOrientationKey"; GS_DECLARE NSString *const NSMetadataItemOriginalFormatKey = @"NSMetadataItemOriginalFormatKey"; GS_DECLARE NSString *const NSMetadataItemOriginalSourceKey = @"NSMetadataItemOriginalSourceKey"; GS_DECLARE NSString *const NSMetadataItemPageHeightKey = @"NSMetadataItemPageHeightKey"; GS_DECLARE NSString *const NSMetadataItemPageWidthKey = @"NSMetadataItemPageWidthKey"; GS_DECLARE NSString *const NSMetadataItemParticipantsKey = @"NSMetadataItemParticipantsKey"; GS_DECLARE NSString *const NSMetadataItemPathKey = @"NSMetadataItemPathKey"; GS_DECLARE NSString *const NSMetadataItemPerformersKey = @"NSMetadataItemPerformersKey"; GS_DECLARE NSString *const NSMetadataItemPhoneNumbersKey = @"NSMetadataItemPhoneNumbersKey"; GS_DECLARE NSString *const NSMetadataItemPixelCountKey = @"NSMetadataItemPixelCountKey"; GS_DECLARE NSString *const NSMetadataItemPixelHeightKey = @"NSMetadataItemPixelHeightKey"; GS_DECLARE NSString *const NSMetadataItemPixelWidthKey = @"NSMetadataItemPixelWidthKey"; GS_DECLARE NSString *const NSMetadataItemProducerKey = @"NSMetadataItemProducerKey"; GS_DECLARE NSString *const NSMetadataItemProfileNameKey = @"NSMetadataItemProfileNameKey"; GS_DECLARE NSString *const NSMetadataItemProjectsKey = @"NSMetadataItemProjectsKey"; GS_DECLARE NSString *const NSMetadataItemPublishersKey = @"NSMetadataItemPublishersKey"; GS_DECLARE NSString *const NSMetadataItemRecipientAddressesKey = @"NSMetadataItemRecipientAddressesKey"; GS_DECLARE NSString *const NSMetadataItemRecipientEmailAddressesKey = @"NSMetadataItemRecipientEmailAddressesKey"; GS_DECLARE NSString *const NSMetadataItemRecipientsKey = @"NSMetadataItemRecipientsKey"; GS_DECLARE NSString *const NSMetadataItemRecordingDateKey = @"NSMetadataItemRecordingDateKey"; GS_DECLARE NSString *const NSMetadataItemRecordingYearKey = @"NSMetadataItemRecordingYearKey"; GS_DECLARE NSString *const NSMetadataItemRedEyeOnOffKey = @"NSMetadataItemRedEyeOnOffKey"; GS_DECLARE NSString *const NSMetadataItemResolutionHeightDPIKey = @"NSMetadataItemResolutionHeightDPIKey"; GS_DECLARE NSString *const NSMetadataItemResolutionWidthDPIKey = @"NSMetadataItemResolutionWidthDPIKey"; GS_DECLARE NSString *const NSMetadataItemRightsKey = @"NSMetadataItemRightsKey"; GS_DECLARE NSString *const NSMetadataItemSecurityMethodKey = @"NSMetadataItemSecurityMethodKey"; GS_DECLARE NSString *const NSMetadataItemSpeedKey = @"NSMetadataItemSpeedKey"; GS_DECLARE NSString *const NSMetadataItemStarRatingKey = @"NSMetadataItemStarRatingKey"; GS_DECLARE NSString *const NSMetadataItemStateOrProvinceKey = @"NSMetadataItemStateOrProvinceKey"; GS_DECLARE NSString *const NSMetadataItemStreamableKey = @"NSMetadataItemStreamableKey"; GS_DECLARE NSString *const NSMetadataItemSubjectKey = @"NSMetadataItemSubjectKey"; GS_DECLARE NSString *const NSMetadataItemTempoKey = @"NSMetadataItemTempoKey"; GS_DECLARE NSString *const NSMetadataItemTextContentKey = @"NSMetadataItemTextContentKey"; GS_DECLARE NSString *const NSMetadataItemThemeKey = @"NSMetadataItemThemeKey"; GS_DECLARE NSString *const NSMetadataItemTimeSignatureKey = @"NSMetadataItemTimeSignatureKey"; GS_DECLARE NSString *const NSMetadataItemTimestampKey = @"NSMetadataItemTimestampKey"; GS_DECLARE NSString *const NSMetadataItemTitleKey = @"NSMetadataItemTitleKey"; GS_DECLARE NSString *const NSMetadataItemTotalBitRateKey = @"NSMetadataItemTotalBitRateKey"; GS_DECLARE NSString *const NSMetadataItemURLKey = @"NSMetadataItemURLKey"; GS_DECLARE NSString *const NSMetadataItemVersionKey = @"NSMetadataItemVersionKey"; GS_DECLARE NSString *const NSMetadataItemVideoBitRateKey = @"NSMetadataItemVideoBitRateKey"; GS_DECLARE NSString *const NSMetadataItemWhereFromsKey = @"NSMetadataItemWhereFromsKey"; GS_DECLARE NSString *const NSMetadataItemWhiteBalanceKey = @"NSMetadataItemWhiteBalanceKey"; GS_DECLARE NSString *const NSMetadataUbiquitousItemContainerDisplayNameKey = @"NSMetadataUbiquitousItemContainerDisplayNameKey"; GS_DECLARE NSString *const NSMetadataUbiquitousItemDownloadingErrorKey = @"NSMetadataUbiquitousItemDownloadingErrorKey"; GS_DECLARE NSString *const NSMetadataUbiquitousItemDownloadingStatusCurrent = @"NSMetadataUbiquitousItemDownloadingStatusCurrent"; GS_DECLARE NSString *const NSMetadataUbiquitousItemDownloadingStatusDownloaded = @"NSMetadataUbiquitousItemDownloadingStatusDownloaded"; GS_DECLARE NSString *const NSMetadataUbiquitousItemDownloadingStatusKey = @"NSMetadataUbiquitousItemDownloadingStatusKey"; GS_DECLARE NSString *const NSMetadataUbiquitousItemDownloadingStatusNotDownloaded = @"NSMetadataUbiquitousItemDownloadingStatusNotDownloaded"; GS_DECLARE NSString *const NSMetadataUbiquitousItemDownloadRequestedKey = @"NSMetadataUbiquitousItemDownloadRequestedKey"; GS_DECLARE NSString *const NSMetadataUbiquitousItemHasUnresolvedConflictsKey = @"NSMetadataUbiquitousItemHasUnresolvedConflictsKey"; GS_DECLARE NSString *const NSMetadataUbiquitousItemIsDownloadedKey = @"NSMetadataUbiquitousItemIsDownloadedKey"; GS_DECLARE NSString *const NSMetadataUbiquitousItemIsDownloadingKey = @"NSMetadataUbiquitousItemIsDownloadingKey"; GS_DECLARE NSString *const NSMetadataUbiquitousItemIsExternalDocumentKey = @"NSMetadataUbiquitousItemIsExternalDocumentKey"; GS_DECLARE NSString *const NSMetadataUbiquitousItemIsSharedKey = @"NSMetadataUbiquitousItemIsSharedKey"; GS_DECLARE NSString *const NSMetadataUbiquitousItemIsUploadedKey = @"NSMetadataUbiquitousItemIsUploadedKey"; GS_DECLARE NSString *const NSMetadataUbiquitousItemIsUploadingKey = @"NSMetadataUbiquitousItemIsUploadingKey"; GS_DECLARE NSString *const NSMetadataUbiquitousItemPercentDownloadedKey = @"NSMetadataUbiquitousItemPercentDownloadedKey"; GS_DECLARE NSString *const NSMetadataUbiquitousItemPercentUploadedKey = @"NSMetadataUbiquitousItemPercentUploadedKey"; GS_DECLARE NSString *const NSMetadataUbiquitousItemUploadingErrorKey = @"NSMetadataUbiquitousItemUploadingErrorKey"; GS_DECLARE NSString *const NSMetadataUbiquitousItemURLInLocalContainerKey = @"NSMetadataUbiquitousItemURLInLocalContainerKey"; GS_DECLARE NSString *const NSMetadataUbiquitousSharedItemCurrentUserPermissionsKey = @"NSMetadataUbiquitousSharedItemCurrentUserPermissionsKey"; GS_DECLARE NSString *const NSMetadataUbiquitousSharedItemCurrentUserRoleKey = @"NSMetadataUbiquitousSharedItemCurrentUserRoleKey"; GS_DECLARE NSString *const NSMetadataUbiquitousSharedItemMostRecentEditorNameComponentsKey = @"NSMetadataUbiquitousSharedItemMostRecentEditorNameComponentsKey"; GS_DECLARE NSString *const NSMetadataUbiquitousSharedItemOwnerNameComponentsKey = @"NSMetadataUbiquitousSharedItemOwnerNameComponentsKey"; GS_DECLARE NSString *const NSMetadataUbiquitousSharedItemPermissionsReadOnly = @"NSMetadataUbiquitousSharedItemPermissionsReadOnly"; GS_DECLARE NSString *const NSMetadataUbiquitousSharedItemPermissionsReadWrite = @"NSMetadataUbiquitousSharedItemPermissionsReadWrite"; GS_DECLARE NSString *const NSMetadataUbiquitousSharedItemRoleOwner = @"NSMetadataUbiquitousSharedItemRoleOwner"; GS_DECLARE NSString *const NSMetadataUbiquitousSharedItemRoleParticipant = @"NSMetadataUbiquitousSharedItemRoleParticipant"; gnustep-base-1.29.0/Source/NSMethodSignature.m000066400000000000000000000377711435650067400212120ustar00rootroot00000000000000/** Implementation of NSMethodSignature for GNUStep Copyright (C) 1994-2015 Free Software Foundation, Inc. Written by: Andrew Kachites McCallum Date: August 1994 Rewritten: Richard Frith-Macdonald Date: August 1998 This file is part of the GNUstep Base Library. 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 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 USA. NSMethodSignature class reference $Date$ $Revision$ */ #import "common.h" #if !defined (__GNU_LIBOBJC__) # include #endif #define EXPOSE_NSMethodSignature_IVARS 1 #import "Foundation/NSMethodSignature.h" #import "Foundation/NSException.h" #import "Foundation/NSCoder.h" #import "GSInvocation.h" #ifdef HAVE_MALLOC_H #if !defined(__OpenBSD__) #include #endif #endif #ifdef HAVE_ALLOCA_H #include #endif /* The objc runtime library objc_skip_offset() is buggy on some compiler * versions, so we use our own alternative implementation. */ static const char * skip_offset(const char *ptr) { if (*ptr == '+' || *ptr == '-') ptr++; while (isdigit(*ptr)) ptr++; return ptr; } #define ROUND(V, A) \ ({ __typeof__(V) __v=(V); __typeof__(A) __a=(A); \ __a*((__v+__a-1)/__a); }) /* Step through method encoding information extracting details. * If outTypes is non-nul then we copy the qualified type into * the buffer as a nul terminated string and use the values in * this buffer for the qtype and type in info, rather than pointers * to positions in typePtr */ static const char * next_arg(const char *typePtr, NSArgumentInfo *info, char *outTypes) { NSArgumentInfo local; BOOL flag; BOOL negative = NO; if (0 == typePtr) { return 0; } if (0 == info) { info = &local; } info->qtype = typePtr; /* * Skip past any type qualifiers - if the caller wants them, return them. */ flag = YES; info->qual = 0; while (flag) { switch (*typePtr) { case _C_CONST: info->qual |= _F_CONST; break; case _C_IN: info->qual |= _F_IN; break; case _C_INOUT: info->qual |= _F_INOUT; break; case _C_OUT: info->qual |= _F_OUT; break; case _C_BYCOPY: info->qual |= _F_BYCOPY; break; #ifdef _C_BYREF case _C_BYREF: info->qual |= _F_BYREF; break; #endif case _C_ONEWAY: info->qual |= _F_ONEWAY; break; #ifdef _C_GCINVISIBLE case _C_GCINVISIBLE: info->qual |= _F_GCINVISIBLE; break; #endif default: flag = NO; } if (flag) { typePtr++; } } info->type = typePtr; /* * Scan for size and alignment information. */ switch (*typePtr++) { case _C_ID: info->size = sizeof(id); info->align = __alignof__(id); /* Blocks are encoded as @? */ if (*(typePtr) == '?') { typePtr++; } break; case _C_CLASS: info->size = sizeof(Class); info->align = __alignof__(Class); break; case _C_SEL: info->size = sizeof(SEL); info->align = __alignof__(SEL); break; case _C_CHR: info->size = sizeof(char); info->align = __alignof__(char); break; case _C_UCHR: info->size = sizeof(unsigned char); info->align = __alignof__(unsigned char); break; case _C_SHT: info->size = sizeof(short); info->align = __alignof__(short); break; case _C_USHT: info->size = sizeof(unsigned short); info->align = __alignof__(unsigned short); break; case _C_INT: info->size = sizeof(int); info->align = __alignof__(int); break; case _C_UINT: info->size = sizeof(unsigned int); info->align = __alignof__(unsigned int); break; case _C_LNG: info->size = sizeof(long); info->align = __alignof__(long); break; case _C_ULNG: info->size = sizeof(unsigned long); info->align = __alignof__(unsigned long); break; case _C_LNG_LNG: info->size = sizeof(long long); info->align = __alignof__(long long); break; case _C_ULNG_LNG: info->size = sizeof(unsigned long long); info->align = __alignof__(unsigned long long); break; case _C_FLT: info->size = sizeof(float); info->align = __alignof__(float); break; case _C_DBL: info->size = sizeof(double); info->align = __alignof__(double); break; case _C_PTR: info->size = sizeof(char*); info->align = __alignof__(char*); if (*typePtr == '?') { typePtr++; } else { typePtr = objc_skip_typespec(typePtr); } break; case _C_ATOM: case _C_CHARPTR: info->size = sizeof(char*); info->align = __alignof__(char*); break; case _C_ARY_B: { int length = atoi(typePtr); while (isdigit(*typePtr)) { typePtr++; } typePtr = next_arg(typePtr, &local, 0); info->size = length * ROUND(local.size, local.align); info->align = local.align; typePtr++; /* Skip end-of-array */ } break; case _C_STRUCT_B: { unsigned int acc_size = 0; unsigned int def_align = objc_alignof_type(typePtr-1); unsigned int acc_align = def_align; const char *ptr = typePtr; /* * Skip "=" stuff. */ while (*ptr != _C_STRUCT_E && *ptr != '=') ptr++; if (*ptr == '=') typePtr = ptr; typePtr++; /* * Base structure alignment on first element. */ if (*typePtr != _C_STRUCT_E) { typePtr = next_arg(typePtr, &local, 0); if (typePtr == 0) { return 0; /* error */ } acc_size = ROUND(acc_size, local.align); acc_size += local.size; acc_align = MAX(local.align, def_align); } /* * Continue accumulating structure size * and adjust alignment if necessary */ while (*typePtr != _C_STRUCT_E) { typePtr = next_arg(typePtr, &local, 0); if (typePtr == 0) { return 0; /* error */ } acc_size = ROUND(acc_size, local.align); acc_size += local.size; acc_align = MAX(local.align, acc_align); } /* * Size must be a multiple of alignment */ if (acc_size % acc_align != 0) { acc_size += acc_align - acc_size % acc_align; } info->size = acc_size; info->align = acc_align; typePtr++; /* Skip end-of-struct */ } break; case _C_UNION_B: { unsigned int max_size = 0; unsigned int max_align = 0; /* * Skip "=" stuff. */ while (*typePtr != _C_UNION_E) { if (*typePtr++ == '=') { break; } } while (*typePtr != _C_UNION_E) { typePtr = next_arg(typePtr, &local, 0); if (typePtr == 0) { return 0; /* error */ } max_size = MAX(max_size, local.size); max_align = MAX(max_align, local.align); } info->size = max_size; info->align = max_align; typePtr++; /* Skip end-of-union */ } break; case _C_VOID: info->size = 0; info->align = __alignof__(char*); break; #if defined(_C_BOOL) && (!defined(__GNUC__) || __GNUC__ > 2) case _C_BOOL: info->size = sizeof(_Bool); info->align = __alignof__(_Bool); break; #endif #if defined(_C_BFLD) case _C_BFLD: /* Rely on the runtime to either provide the info or bomb out. * Nowadays we ought to be able to expect modern enough runtimes. */ typePtr--; info->size = objc_sizeof_type(typePtr); info->align = objc_alignof_type(typePtr); typePtr = objc_skip_typespec(typePtr); break; #endif #if defined(_C_COMPLEX) case _C_COMPLEX: switch (*typePtr++) { case _C_CHR: info->size = sizeof(_Complex char); info->align = __alignof__(_Complex char); break; case _C_UCHR: info->size = sizeof(_Complex unsigned char); info->align = __alignof__(_Complex unsigned char); break; case _C_SHT: info->size = sizeof(_Complex short); info->align = __alignof__(_Complex short); break; case _C_USHT: info->size = sizeof(_Complex unsigned short); info->align = __alignof__(_Complex unsigned short); break; case _C_INT: info->size = sizeof(_Complex int); info->align = __alignof__(_Complex int); break; case _C_UINT: info->size = sizeof(_Complex unsigned int); info->align = __alignof__(_Complex unsigned int); break; case _C_LNG: info->size = sizeof(_Complex long); info->align = __alignof__(_Complex long); break; case _C_ULNG: info->size = sizeof(_Complex unsigned long); info->align = __alignof__(_Complex unsigned long); break; case _C_LNG_LNG: info->size = sizeof(_Complex long long); info->align = __alignof__(_Complex long long); break; case _C_ULNG_LNG: info->size = sizeof(_Complex unsigned long long); info->align = __alignof__(_Complex unsigned long long); break; case _C_FLT: info->size = sizeof(_Complex float); info->align = __alignof__(_Complex float); break; case _C_DBL: info->size = sizeof(_Complex double); info->align = __alignof__(_Complex double); break; default: { NSLog(@"unknown complex type '%s'", typePtr-2); return 0; } } break; #endif default: return 0; } if (typePtr == 0) { /* Error condition. */ return 0; } /* Copy the type information into the buffer if provided. */ if (outTypes != 0) { unsigned len = typePtr - info->qtype; strncpy(outTypes, info->qtype, len); outTypes[len] = '\0'; info->qtype = outTypes; info->type = objc_skip_type_qualifiers (outTypes); } /* * May tell the caller if the item is stored in a register. */ if (*typePtr == '+') { typePtr++; info->isReg = YES; } else { info->isReg = NO; } /* * Cope with negative offsets. */ if (*typePtr == '-') { typePtr++; negative = YES; } /* * May tell the caller what the stack/register offset is for * this argument. */ info->offset = 0; while (isdigit(*typePtr)) { info->offset = info->offset * 10 + (*typePtr++ - '0'); } if (negative == YES) { info->offset = -info->offset; } return typePtr; } @implementation NSMethodSignature - (id) _initWithObjCTypes: (const char*)t { const char *p = t; if (t == 0 || *t == '\0') { DESTROY(self); } else { const char *q; char *args; char *ret; char *end; char *ptr; int alen; int blen; int rlen; /* In case we have been given a method encoding string without offsets, * we attempt to generate the frame size and offsets in a new copy of * the types string. */ blen = (strlen(t) + 1) * 16; // Total buffer length ret = alloca(blen); end = ret + blen; /* Copy the return type (including qualifiers) with ehough room * after it to store the frame size. */ p = t; p = objc_skip_typespec (p); rlen = p - t; strncpy(ret, t, rlen); ret[rlen] = '\0'; ptr = args = ret + rlen + 10; // Allow room for a decimal integer *ptr = '\0'; /* Skip to the first arg type, taking note of where the qualifiers start. * Assume that casting _argFrameLength to int will not lose information. */ p = skip_offset (p); q = p; p = objc_skip_type_qualifiers (p); while (p && *p) { int size; _numArgs++; size = objc_promoted_size (p); p = objc_skip_typespec (p); memcpy(ptr, q, p - q); ptr += (p - q); snprintf(ptr, end - ptr, "%d", (int)_argFrameLength); ptr += strlen(ptr); _argFrameLength += size; p = skip_offset (p); q = p; p = objc_skip_type_qualifiers (p); } alen = ptr - args; rlen += sprintf(ret + rlen, "%d", (int)_argFrameLength); _methodTypes = NSAllocateCollectable(alen + rlen + 1, 0); strncpy((char*)_methodTypes, ret, rlen); strncpy(((char*)_methodTypes) + rlen, args, alen); ((char*)_methodTypes)[alen + rlen] = '\0'; } return self; } + (NSMethodSignature*) signatureWithObjCTypes: (const char*)t { return AUTORELEASE([[[self class] alloc] _initWithObjCTypes: t]); } - (NSArgumentInfo) argumentInfoAtIndex: (NSUInteger)index { if (index >= _numArgs) { [NSException raise: NSInvalidArgumentException format: @"Index too high."]; } if (_inf == 0) { [self methodInfo]; NSAssert(0 != _inf, @"Initialising failed"); } return _inf[index+1]; } - (NSUInteger) frameLength { return _argFrameLength; } - (const char*) getArgumentTypeAtIndex: (NSUInteger)index { if (index >= _numArgs) { [NSException raise: NSInvalidArgumentException format: @"Index too high."]; } if (_inf == 0) { [self methodInfo]; NSAssert(0 != _inf, @"Initialising failed"); } return _inf[index+1].qtype; } - (BOOL) isOneway { if (_inf == 0) { [self methodInfo]; NSAssert(0 != _inf, @"Initialising failed"); } return (_inf[0].qual & _F_ONEWAY) ? YES : NO; } - (NSUInteger) methodReturnLength { if (_inf == 0) { [self methodInfo]; NSAssert(0 != _inf, @"Initialising failed"); } return _inf[0].size; } - (const char*) methodReturnType { if (_inf == 0) { [self methodInfo]; NSAssert(0 != _inf, @"Initialising failed"); } return _inf[0].qtype; } - (NSUInteger) numberOfArguments { return _numArgs; } - (void) dealloc { if (_methodTypes) NSZoneFree(NSDefaultMallocZone(), (void*)_methodTypes); if (_inf) NSZoneFree(NSDefaultMallocZone(), (void*)_inf); [super dealloc]; } - (BOOL) isEqual: (id)other { BOOL isEqual = YES; if (other == nil) { return NO; } if (object_getClass(other) != object_getClass(self)) { return NO; } isEqual = ([self numberOfArguments] == [other numberOfArguments] && [self frameLength] == [other frameLength] && *[self methodReturnType] == *[other methodReturnType] && [self isOneway] == [other isOneway]); if (isEqual == NO) { return NO; } else { int i, n; n = [self numberOfArguments]; for (i = 0; i < n; i++) { if ((*[self getArgumentTypeAtIndex:i] == *[other getArgumentTypeAtIndex:i]) == NO) { return NO; } } } return isEqual; } @end @implementation NSMethodSignature(GNUstep) - (NSArgumentInfo*) methodInfo { if (_inf == 0) { const char *types = _methodTypes; char *outTypes; unsigned int i; /* Allocate space enough for an NSArgumentInfo structure for each * argument (including the return type), and enough space to hold * the type information for each argument as a nul terminated * string. */ outTypes = NSZoneMalloc(NSDefaultMallocZone(), sizeof(NSArgumentInfo)*(_numArgs+1) + strlen(types)*2); _info = (void*)outTypes; outTypes = outTypes + sizeof(NSArgumentInfo)*(_numArgs+1); /* Fill in the full argment information for each arg. */ for (i = 0; i <= _numArgs; i++) { types = next_arg(types, &_inf[i], outTypes); outTypes += strlen(outTypes) + 1; } } return _inf; } - (const char*) methodType { return _methodTypes; } @end gnustep-base-1.29.0/Source/NSNetServices.m000066400000000000000000000312141435650067400203240ustar00rootroot00000000000000/* Interface for NSNetServices for GNUstep Copyright (C) 2006, 2010 Free Software Foundation, Inc. Originally written by: Chris B. Vetter Date: 2006 Modified by: Niels Grewe Date: March 2010 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #import "GSNetServices.h" #import "GSFastEnumeration.h" #import "GNUstepBase/NSNetServices+GNUstepBase.h" #import "Foundation/NSArray.h" #import "Foundation/NSData.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSHost.h" #import "Foundation/NSStream.h" #import "Foundation/NSString.h" static Class abstractServiceClass; static Class concreteServiceClass; static Class abstractBrowserClass; static Class concreteBrowserClass; @implementation NSNetService + (void)initialize { if (self == [NSNetService class]) { abstractServiceClass = self; # if GS_USE_AVAHI==1 concreteServiceClass = [GSAvahiNetService class]; # else concreteServiceClass = [GSMDNSNetService class]; # endif } } + (id) allocWithZone: (NSZone*)zone { if (self == abstractServiceClass) { return [concreteServiceClass allocWithZone: zone]; } return [super allocWithZone: zone]; } + (NSData *) dataFromTXTRecordDictionary: (NSDictionary *) txtDictionary { return [concreteServiceClass dataFromTXTRecordDictionary: txtDictionary]; } + (NSDictionary *) dictionaryFromTXTRecordData: (NSData *) txtData { return [concreteServiceClass dictionaryFromTXTRecordData: txtData]; } - (id) initWithDomain: (NSString *) domain type: (NSString *) type name: (NSString *) name { return [self subclassResponsibility: _cmd]; } - (id) initWithDomain: (NSString *) domain type: (NSString *) type name: (NSString *) name port: (NSInteger) port { return [self subclassResponsibility: _cmd]; } - (void) removeFromRunLoop: (NSRunLoop *) aRunLoop forMode: (NSString *) mode { [self subclassResponsibility: _cmd]; } - (void) scheduleInRunLoop: (NSRunLoop *) aRunLoop forMode: (NSString *) mode { [self subclassResponsibility: _cmd]; } #if OS_API_VERSION(100500,GS_API_LATEST) /** Not implemented */ - (NSInteger)port { [self subclassResponsibility: _cmd]; return 0; } /** Not implemented */ - (void) publishWithOptions: (NSNetServiceOptions)options { [self subclassResponsibility: _cmd]; } #endif - (void) publish { [self subclassResponsibility: _cmd]; } - (void) resolve { [self subclassResponsibility: _cmd]; } - (void) resolveWithTimeout: (NSTimeInterval) timeout { [self subclassResponsibility: _cmd]; } - (void) stop { [self subclassResponsibility: _cmd]; } - (void) startMonitoring { [self subclassResponsibility: _cmd]; } - (void) stopMonitoring { [self subclassResponsibility: _cmd]; } - (id) delegate { return _delegate; } - (void) setDelegate: (id) delegate { _delegate = delegate; } - (NSArray *) addresses { return [self subclassResponsibility: _cmd]; } - (NSString *) domain { return [self subclassResponsibility: _cmd]; } - (NSString *) hostName { return [self subclassResponsibility: _cmd]; } - (NSString *) name { return [self subclassResponsibility: _cmd]; } - (NSString *) type { return [self subclassResponsibility: _cmd]; } - (NSData *) TXTRecordData { return [self subclassResponsibility: _cmd]; } - (BOOL) setTXTRecordData: (NSData *) recordData { [self subclassResponsibility: _cmd]; return NO; } - (NSString*)protocolSpecificInformation { /* * Note: This implementation follows the one that was in GSMDNSNetService, * which had the following comment: * * I must admit, the following may not be entirely correct... * * It uses [self class] to obtain the concrete subclass that implements * +dictionaryFromTXTRecordData:. */ NSDictionary *dict; NSMutableArray *array = nil; NSString *retVal = nil; dict = [[self class] dictionaryFromTXTRecordData: [self TXTRecordData]]; if (dict == nil) { return nil; } array = [[NSMutableArray alloc] initWithCapacity: [dict count]]; FOR_IN(NSString*, key, dict) { NSData *value = [dict objectForKey: key]; if ([value length] > 0) { NSString *valueString; valueString = [[NSString alloc] initWithBytes: [value bytes] length: [value length] encoding: NSUTF8StringEncoding]; [array addObject: [NSString stringWithFormat: @"%@=%@", key, valueString]]; DESTROY(valueString); } else if ([key length] > 0) { [array addObject: [[key copy] autorelease]]; } } END_FOR_IN(dict) if ([array count] > 0) { retVal = [array componentsJoinedByString: @"\001"]; } [array release]; return retVal; } - (void) setProtocolSpecificInformation: (NSString *) specificInformation { NSArray *array = [specificInformation componentsSeparatedByString: @"\001"]; if (array != nil) { NSMutableDictionary *dictionary; dictionary = [[NSMutableDictionary alloc] initWithCapacity: [array count]]; FOR_IN(NSString*, item, array) { NSArray *parts; NSData *value; parts = [item componentsSeparatedByString: @"="]; value = [[parts objectAtIndex: 1] dataUsingEncoding: NSUTF8StringEncoding]; [dictionary setObject: value forKey: [parts objectAtIndex: 0]]; } END_FOR_IN(array) [self setTXTRecordData: [[self class] dataFromTXTRecordDictionary: dictionary]]; } } - (BOOL) getInputStream: (NSInputStream **) inputStream outputStream: (NSOutputStream **) outputStream { [NSStream getStreamsToHost: [NSHost hostWithName: [self hostName]] port: [self port] inputStream: inputStream outputStream: outputStream]; return inputStream || outputStream; } /* * NSNetService delegate methods: */ - (void) netServiceWillResolve: (NSNetService*)service { if ([_delegate respondsToSelector: @selector(netServiceWillResolve:)]) { [_delegate netServiceWillResolve: service]; } } - (void) netService: (NSNetService*)service didNotResolve: (NSDictionary*)errorDict { if ([_delegate respondsToSelector: @selector(netService:didNotResolve:)]) { [_delegate netService: service didNotResolve: errorDict]; } } - (void) netServiceDidResolveAddress: service { if ([_delegate respondsToSelector: @selector(netServiceDidResolveAddress:)]) { [_delegate netServiceDidResolveAddress: service]; } } - (void) netServiceDidStop: (NSNetService*)service { if ([_delegate respondsToSelector: @selector(netServiceDidStop:)]) { [_delegate netServiceDidStop: service]; } } - (void) netServiceWillPublish: (NSNetService*)service { if ([_delegate respondsToSelector: @selector(netServiceWillPublish:)]) { [_delegate netServiceWillPublish: service]; } } - (void) netService: (NSNetService*)service didNotPublish: (NSDictionary*)errorDict { if ([_delegate respondsToSelector: @selector(netService:didNotPublish:)]) { [_delegate netService: service didNotPublish: errorDict]; } } - (void) netServiceDidPublish: (NSNetService*)service { if ([_delegate respondsToSelector: @selector(netServiceDidPublish:)]) { [_delegate netServiceDidPublish: service]; } } /* * Define extensions for the Avahi API subclass. */ #if GS_USE_AVAHI==1 - (void) startMonitoringForRecordType: (NSString*)recordType { [self subclassResponsibility: _cmd]; } - (void) stopMonitoringForRecordType: (NSString*)recordType { [self subclassResponsibility: _cmd]; } - (BOOL) addServiceRecord { [self subclassResponsibility: _cmd]; return 0; } - (BOOL) addRecordData: (NSData*)data { [self subclassResponsibility: _cmd]; return 0; } - (id) recordDataForRecordType: (NSString*)type { return [self subclassResponsibility: _cmd]; } - (NSString*) fullServiceName { return [self subclassResponsibility: _cmd]; } #endif // GS_USE_AVAHI @end @implementation NSNetServiceBrowser + (void) initialize { if (self == [NSNetServiceBrowser class]) { abstractBrowserClass = self; # if GS_USE_AVAHI==1 concreteBrowserClass = [GSAvahiNetServiceBrowser class]; # else // Not Avahi (=GS_USE_MDNS) concreteBrowserClass = [GSMDNSNetServiceBrowser class]; # endif // GS_USE_AVAHI } } + (id) allocWithZone: (NSZone*)zone { if (self == abstractBrowserClass) { return [concreteBrowserClass allocWithZone: zone]; } return [super allocWithZone: zone]; } - (id) init { return [super init]; } - (void) removeFromRunLoop: (NSRunLoop *) aRunLoop forMode: (NSString *) mode { [self subclassResponsibility: _cmd]; } - (void) scheduleInRunLoop: (NSRunLoop *) aRunLoop forMode: (NSString *) mode { [self subclassResponsibility: _cmd]; } - (void) searchForAllDomains { [self subclassResponsibility: _cmd]; } - (void) searchForBrowsableDomains { [self subclassResponsibility: _cmd]; } - (void) searchForRegistrationDomains { [self subclassResponsibility: _cmd]; } - (void) searchForServicesOfType: (NSString *) serviceType inDomain: (NSString *) domainName { [self subclassResponsibility: _cmd]; } - (void) stop { [self subclassResponsibility: _cmd]; } - (id) delegate { return _delegate; } - (void) setDelegate: (id) delegate { _delegate = delegate; } - (void) netServiceBrowserWillSearch: (NSNetServiceBrowser*)aBrowser { if ([_delegate respondsToSelector: @selector(netServiceBrowserWillSearch:)]) { [_delegate netServiceBrowserWillSearch: aBrowser]; } } - (void) netServiceBrowserDidStopSearch: (NSNetServiceBrowser*)aBrowser { if ([_delegate respondsToSelector: @selector(netServiceBrowserDidStopSearch:)]) { [_delegate netServiceBrowserDidStopSearch: aBrowser]; } } - (void) netServiceBrowser: (NSNetServiceBrowser*)aBrowser didNotSearch: (NSDictionary*)errorDict { if ([_delegate respondsToSelector: @selector(netServiceBrowser:didNotSearch:)]) { [_delegate netServiceBrowser: aBrowser didNotSearch: errorDict]; } } - (void) netServiceBrowser: (NSNetServiceBrowser*)aBrowser didFindDomain: (NSString*)theDomain moreComing: (BOOL)moreComing { if ([_delegate respondsToSelector: @selector(netServiceBrowser:didFindDomain:moreComing:)]) { [_delegate netServiceBrowser: aBrowser didFindDomain: theDomain moreComing: moreComing]; } } - (void) netServiceBrowser: (NSNetServiceBrowser*)aBrowser didRemoveDomain: (NSString*)theDomain moreComing: (BOOL)moreComing { if ([_delegate respondsToSelector: @selector(netServiceBrowser:didRemoveDomain:moreComing:)]) { [_delegate netServiceBrowser: aBrowser didRemoveDomain: theDomain moreComing: moreComing]; } } - (void) netServiceBrowser: (NSNetServiceBrowser*)aBrowser didFindService: (NSNetService*)theService moreComing: (BOOL)moreComing { if ([_delegate respondsToSelector: @selector(netServiceBrowser:didFindService:moreComing:)]) { [_delegate netServiceBrowser: aBrowser didFindService: theService moreComing: moreComing]; } } - (void) netServiceBrowser: (NSNetServiceBrowser*)aBrowser didRemoveService: (NSNetService*)theService moreComing: (BOOL)moreComing { if ([_delegate respondsToSelector: @selector(netServiceBrowser:didRemoveService:moreComing:)]) { [_delegate netServiceBrowser: aBrowser didRemoveService: theService moreComing: moreComing]; } } @end gnustep-base-1.29.0/Source/NSNotification.m000066400000000000000000000121701435650067400205200ustar00rootroot00000000000000/** Implementation of NSNotification for GNUstep Copyright (C) 1996 Free Software Foundation, Inc. Written by: Andrew Kachites McCallum Created: March 1996 This file is part of the GNUstep Base Library. 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 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 USA. NSNotification class reference $Date$ $Revision$ */ #import "common.h" #define EXPOSE_NSNotification_IVARS 1 #import "Foundation/NSNotification.h" #import "Foundation/NSCoder.h" #import "Foundation/NSDictionary.h" @class GSNotification; @interface GSNotification : NSObject // Help the compiler @end /** *

Represents a notification for posting to an [NSNotificationCenter]. * Consists of a name, an object, and an optional dictionary. The * notification center will check for observers registered to receive * either notifications with the name, the object, or both and pass the * notification instance on to them.

*

This class is actually the interface for a class cluster, so instances * will be of a (private) subclass.

*/ @implementation NSNotification static Class abstractClass = 0; static Class concreteClass = 0; + (id) allocWithZone: (NSZone*)z { if (self == abstractClass) { return (id)NSAllocateObject(concreteClass, 0, z); } return (id)NSAllocateObject(self, 0, z); } + (void) initialize { if (concreteClass == 0) { abstractClass = [NSNotification class]; concreteClass = [GSNotification class]; } } /** * Create a new autoreleased notification. */ + (NSNotification*) notificationWithName: (NSString*)name object: (id)object userInfo: (NSDictionary*)info { return [concreteClass notificationWithName: name object: object userInfo: info]; } /** * Create a new autoreleased notification by calling * +notificationWithName:object:userInfo: with a nil user info argument. */ + (NSNotification*) notificationWithName: (NSString*)name object: (id)object { return [concreteClass notificationWithName: name object: object userInfo: nil]; } /** * The abstract class implements a copy as a simple retain ... * subclasses override to perform more intelligent copy operations. */ - (id) copyWithZone: (NSZone*)zone { return [self retain]; } /** * Return a description of the parts of the notification. */ - (NSString*) description { return [[super description] stringByAppendingFormat: @" Name: %@ Object: %@ Info: %@", [self name], [self object], [self userInfo]]; } - (NSUInteger) hash { return [[self name] hash] ^ [[self object] hash]; } - (id) init { if ([self class] == abstractClass) { NSZone *z = [self zone]; DESTROY(self); self = (id)NSAllocateObject (concreteClass, 0, z); } return self; } - (BOOL) isEqual: (id)other { NSNotification *o; NSObject *v1; NSObject *v2; if (NO == [(o = other) isKindOfClass: [NSNotification class]] || ((v1 = [self name]) != (v2 = [o name]) && ![v1 isEqual: v2]) || ((v1 = [self object]) != (v2 = [o object]) && ![v1 isEqual: v2]) || ((v1 = [self userInfo]) != (v2 = [o userInfo]) && ![v1 isEqual: v2])) { return NO; } return YES; } /** * Returns the notification name. */ - (NSString*) name { [self subclassResponsibility: _cmd]; return nil; } /** * Returns the notification object. */ - (id) object { [self subclassResponsibility: _cmd]; return nil; } /** * Returns the notification user information. */ - (NSDictionary*) userInfo { [self subclassResponsibility: _cmd]; return nil; } /* * NSCoding protocol - the MacOS-X documentation says it should conform, * but how can we meaningfully encode/decode the object and userInfo. * We do it anyway - at least it should make sense over DO. */ - (void) encodeWithCoder: (NSCoder*)aCoder { id o; o = [self name]; [aCoder encodeValueOfObjCType: @encode(id) at: &o]; o = [self object]; [aCoder encodeValueOfObjCType: @encode(id) at: &o]; o = [self userInfo]; [aCoder encodeValueOfObjCType: @encode(id) at: &o]; } - (id) initWithCoder: (NSCoder*)aCoder { NSString *name; id object; NSDictionary *info; id n; [aCoder decodeValueOfObjCType: @encode(id) at: &name]; [aCoder decodeValueOfObjCType: @encode(id) at: &object]; [aCoder decodeValueOfObjCType: @encode(id) at: &info]; n = [NSNotification notificationWithName: name object: object userInfo: info]; RELEASE(name); RELEASE(object); RELEASE(info); DESTROY(self); return RETAIN(n); } @end gnustep-base-1.29.0/Source/NSNotificationCenter.m000066400000000000000000000745201435650067400216700ustar00rootroot00000000000000/** Implementation of NSNotificationCenter for GNUstep Copyright (C) 1999 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: June 1999 Many thanks for the earlier version, (from which this is loosely derived) by Andrew Kachites McCallum Created: March 1996 This file is part of the GNUstep Base Library. 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 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 USA. NSNotificationCenter class reference $Date$ $Revision$ */ #import "common.h" #define EXPOSE_NSNotificationCenter_IVARS 1 #import "Foundation/NSNotification.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSException.h" #import "Foundation/NSLock.h" #import "Foundation/NSOperation.h" #import "Foundation/NSThread.h" #import "GNUstepBase/GSLock.h" static NSZone *_zone = 0; /** * Concrete class implementing NSNotification. */ @interface GSNotification : NSNotification { @public NSString *_name; id _object; NSDictionary *_info; } @end @implementation GSNotification static Class concrete = 0; + (void) initialize { if (concrete == 0) { concrete = [GSNotification class]; } } + (NSNotification*) notificationWithName: (NSString*)name object: (id)object userInfo: (NSDictionary*)info { GSNotification *n; n = (GSNotification*)NSAllocateObject(self, 0, NSDefaultMallocZone()); n->_name = [name copyWithZone: [self zone]]; n->_object = TEST_RETAIN(object); n->_info = TEST_RETAIN(info); return AUTORELEASE(n); } - (id) copyWithZone: (NSZone*)zone { GSNotification *n; if (NSShouldRetainWithZone (self, zone)) { return [self retain]; } n = (GSNotification*)NSAllocateObject(concrete, 0, zone); n->_name = [_name copyWithZone: [self zone]]; n->_object = TEST_RETAIN(_object); n->_info = TEST_RETAIN(_info); return n; } - (void) dealloc { RELEASE(_name); TEST_RELEASE(_object); TEST_RELEASE(_info); [super dealloc]; } - (NSString*) name { return _name; } - (id) object { return _object; } - (NSDictionary*) userInfo { return _info; } @end struct NCTbl; /* Notification Center Table structure */ /* * Observation structure - One of these objects is created for * each -addObserver... request. It holds the requested selector, * name and object. Each struct is placed in one LinkedList, * as keyed by the NAME/OBJECT parameters. * If 'next' is 0 then the observation is unused (ie it has been * removed from, or not yet added to any list). The end of a * list is marked by 'next' being set to 'ENDOBS'. * * This is normally a structure which handles memory management using a fast * reference count mechanism, but when built with clang for GC, a structure * can't hold a zeroing weak pointer to an observer so it's implemented as a * trivial class instead ... and gets managed by the garbage collector. */ typedef struct Obs { id observer; /* Object to receive message. */ SEL selector; /* Method selector. */ struct Obs *next; /* Next item in linked list. */ int retained; /* Retain count for structure. */ struct NCTbl *link; /* Pointer back to chunk table */ } Observation; #define ENDOBS ((Observation*)-1) static inline NSUInteger doHash(BOOL shouldHash, NSString* key) { if (key == nil) { return 0; } else if (NO == shouldHash) { return (NSUInteger)(uintptr_t)key; } else { return [key hash]; } } static inline BOOL doEqual(BOOL shouldHash, NSString* key1, NSString* key2) { if (key1 == key2) { return YES; } else if (NO == shouldHash) { return NO; } else { return [key1 isEqualToString: key2]; } } /* * Setup for inline operation on arrays of Observers. */ static void listFree(Observation *list); /* Observations have retain/release counts managed explicitly by fast * function calls. */ static void obsRetain(Observation *o); static void obsFree(Observation *o); #define GSI_ARRAY_TYPES 0 #define GSI_ARRAY_TYPE Observation* #define GSI_ARRAY_RELEASE(A, X) obsFree(X.ext) #define GSI_ARRAY_RETAIN(A, X) obsRetain(X.ext) #include "GNUstepBase/GSIArray.h" #define GSI_MAP_RETAIN_KEY(M, X) #define GSI_MAP_RELEASE_KEY(M, X) ({if (YES == M->extra) RELEASE(X.obj);}) #define GSI_MAP_HASH(M, X) doHash(M->extra, X.obj) #define GSI_MAP_EQUAL(M, X,Y) doEqual(M->extra, X.obj, Y.obj) #define GSI_MAP_RETAIN_VAL(M, X) #define GSI_MAP_RELEASE_VAL(M, X) #define GSI_MAP_KTYPES GSUNION_OBJ|GSUNION_NSINT #define GSI_MAP_VTYPES GSUNION_PTR #define GSI_MAP_VEXTRA Observation* #define GSI_MAP_EXTRA BOOL #include "GNUstepBase/GSIMap.h" /* * An NC table is used to keep track of memory allocated to store * Observation structures. When an Observation is removed from the * notification center, it's memory is returned to the free list of * the chunk table, rather than being released to the general * memory allocation system. This means that, once a large numbner * of observers have been registered, memory usage will never shrink * even if the observers are removed. On the other hand, the process * of adding and removing observers is speeded up. * * As another minor aid to performance, we also maintain a cache of * the map tables used to keep mappings of notification objects to * lists of Observations. This lets us avoid the overhead of creating * and destroying map tables when we are frequently adding and removing * notification observations. */ #define CHUNKSIZE 128 #define CACHESIZE 16 typedef struct NCTbl { Observation *wildcard; /* Get ALL messages. */ GSIMapTable nameless; /* Get messages for any name. */ GSIMapTable named; /* Getting named messages only. */ unsigned lockCount; /* Count recursive operations. */ NSRecursiveLock *_lock; /* Lock out other threads. */ Observation *freeList; Observation **chunks; unsigned numChunks; GSIMapTable cache[CACHESIZE]; unsigned short chunkIndex; unsigned short cacheIndex; } NCTable; #define TABLE ((NCTable*)_table) #define WILDCARD (TABLE->wildcard) #define NAMELESS (TABLE->nameless) #define NAMED (TABLE->named) #define LOCKCOUNT (TABLE->lockCount) static Observation * obsNew(NCTable *t, SEL s, id o) { Observation *obs; /* Generally, observations are cached and we create a 'new' observation * by retrieving from the cache or by allocating a block of observations * in one go. This works nicely to provide high * performance for situations where apps add/remove lots of observers * very frequently (poor design, but something which happens in the * real world unfortunately). */ if (t->freeList == 0) { Observation *block; if (t->chunkIndex == CHUNKSIZE) { unsigned size; t->numChunks++; size = t->numChunks * sizeof(Observation*); t->chunks = (Observation**)NSReallocateCollectable( t->chunks, size, NSScannedOption); size = CHUNKSIZE * sizeof(Observation); t->chunks[t->numChunks - 1] = (Observation*)NSAllocateCollectable(size, 0); t->chunkIndex = 0; } block = t->chunks[t->numChunks - 1]; t->freeList = &block[t->chunkIndex]; t->chunkIndex++; t->freeList->link = 0; } obs = t->freeList; t->freeList = (Observation*)obs->link; obs->link = (void*)t; obs->retained = 0; obs->next = 0; obs->selector = s; obs->observer = o; return obs; } static GSIMapTable mapNew(NCTable *t) { if (t->cacheIndex > 0) { return t->cache[--t->cacheIndex]; } else { GSIMapTable m; m = NSAllocateCollectable(sizeof(GSIMapTable_t), NSScannedOption); GSIMapInitWithZoneAndCapacity(m, _zone, 2); return m; } } static void mapFree(NCTable *t, GSIMapTable m) { if (t->cacheIndex < CACHESIZE) { t->cache[t->cacheIndex++] = m; } else { GSIMapEmptyMap(m); NSZoneFree(NSDefaultMallocZone(), (void*)m); } } static void endNCTable(NCTable *t) { unsigned i; GSIMapEnumerator_t e0; GSIMapNode n0; Observation *l; TEST_RELEASE(t->_lock); /* * Free observations without notification names or numbers. */ listFree(t->wildcard); /* * Free lists of observations without notification names. */ e0 = GSIMapEnumeratorForMap(t->nameless); n0 = GSIMapEnumeratorNextNode(&e0); while (n0 != 0) { l = (Observation*)n0->value.ptr; n0 = GSIMapEnumeratorNextNode(&e0); listFree(l); } GSIMapEmptyMap(t->nameless); NSZoneFree(NSDefaultMallocZone(), (void*)t->nameless); /* * Free lists of observations keyed by name and observer. */ e0 = GSIMapEnumeratorForMap(t->named); n0 = GSIMapEnumeratorNextNode(&e0); while (n0 != 0) { GSIMapTable m = (GSIMapTable)n0->value.ptr; GSIMapEnumerator_t e1 = GSIMapEnumeratorForMap(m); GSIMapNode n1 = GSIMapEnumeratorNextNode(&e1); n0 = GSIMapEnumeratorNextNode(&e0); while (n1 != 0) { l = (Observation*)n1->value.ptr; n1 = GSIMapEnumeratorNextNode(&e1); listFree(l); } GSIMapEmptyMap(m); NSZoneFree(NSDefaultMallocZone(), (void*)m); } GSIMapEmptyMap(t->named); NSZoneFree(NSDefaultMallocZone(), (void*)t->named); for (i = 0; i < t->numChunks; i++) { NSZoneFree(NSDefaultMallocZone(), t->chunks[i]); } for (i = 0; i < t->cacheIndex; i++) { GSIMapEmptyMap(t->cache[i]); NSZoneFree(NSDefaultMallocZone(), (void*)t->cache[i]); } NSZoneFree(NSDefaultMallocZone(), t->chunks); NSZoneFree(NSDefaultMallocZone(), t); } static NCTable *newNCTable(void) { NCTable *t; t = (NCTable*)NSAllocateCollectable(sizeof(NCTable), NSScannedOption); t->chunkIndex = CHUNKSIZE; t->wildcard = ENDOBS; t->nameless = NSAllocateCollectable(sizeof(GSIMapTable_t), NSScannedOption); t->named = NSAllocateCollectable(sizeof(GSIMapTable_t), NSScannedOption); GSIMapInitWithZoneAndCapacity(t->nameless, _zone, 16); GSIMapInitWithZoneAndCapacity(t->named, _zone, 128); t->named->extra = YES; // This table retains keys t->_lock = [NSRecursiveLock new]; return t; } static inline void lockNCTable(NCTable* t) { [t->_lock lock]; t->lockCount++; } static inline void unlockNCTable(NCTable* t) { t->lockCount--; [t->_lock unlock]; } static void obsFree(Observation *o) { NSCAssert(o->retained >= 0, NSInternalInconsistencyException); if (o->retained-- == 0) { NCTable *t = o->link; o->link = (NCTable*)t->freeList; t->freeList = o; } } static void obsRetain(Observation *o) { o->retained++; } static void listFree(Observation *list) { while (list != ENDOBS) { Observation *o = list; list = o->next; o->next = 0; obsFree(o); } } /* * NB. We need to explicitly set the 'next' field of any observation * we remove to be zero so that, if it currently exists in an array * of observations being posted, the posting code can notice that it * has been removed from its linked list. * * Also, */ static Observation *listPurge(Observation *list, id observer) { Observation *tmp; while (list != ENDOBS && list->observer == observer) { tmp = list->next; list->next = 0; obsFree(list); list = tmp; } if (list != ENDOBS) { tmp = list; while (tmp->next != ENDOBS) { if (tmp->next->observer == observer) { Observation *next = tmp->next; tmp->next = next->next; next->next = 0; obsFree(next); } else { tmp = tmp->next; } } } return list; } /* * Utility function to remove all the observations from a particular * map table node that match the specified observer. If the observer * is nil, then all observations are removed. * If the list of observations in the map node is emptied, the node is * removed from the map. */ static inline void purgeMapNode(GSIMapTable map, GSIMapNode node, id observer) { Observation *list = node->value.ext; if (observer == 0) { listFree(list); GSIMapRemoveKey(map, node->key); } else { Observation *start = list; list = listPurge(list, observer); if (list == ENDOBS) { /* * The list is empty so remove from map. */ GSIMapRemoveKey(map, node->key); } else if (list != start) { /* * The list is not empty, but we have changed its * start, so we must place the new head in the map. */ node->value.ext = list; } } } /* purgeCollected() returns a list of observations with any observations for * a collected observer removed. * purgeCollectedFromMapNode() does the same thing but also handles cleanup * of the map node containing the list if necessary. */ #define purgeCollected(X) (X) #define purgeCollectedFromMapNode(X, Y) ((Observation*)Y->value.ext) @interface GSNotificationBlockOperation : NSOperation { NSNotification *_notification; GSNotificationBlock _block; } - (id) initWithNotification: (NSNotification *)notif block: (GSNotificationBlock)block; @end @implementation GSNotificationBlockOperation - (id) initWithNotification: (NSNotification *)notif block: (GSNotificationBlock)block { self = [super init]; if (self == nil) return nil; ASSIGN(_notification, notif); _block = Block_copy(block); return self; } - (void) dealloc { DESTROY(_notification); Block_release(_block); [super dealloc]; } - (void) main { CALL_BLOCK(_block, _notification); } @end @interface GSNotificationObserver : NSObject { NSOperationQueue *_queue; GSNotificationBlock _block; } @end @implementation GSNotificationObserver - (id) initWithQueue: (NSOperationQueue *)queue block: (GSNotificationBlock)block { self = [super init]; if (self == nil) return nil; ASSIGN(_queue, queue); _block = Block_copy(block); return self; } - (void) dealloc { DESTROY(_queue); Block_release(_block); [super dealloc]; } - (void) didReceiveNotification: (NSNotification *)notif { if (_queue != nil) { GSNotificationBlockOperation *op = [[GSNotificationBlockOperation alloc] initWithNotification: notif block: _block]; [_queue addOperation: op]; } else { CALL_BLOCK(_block, notif); } } @end /** *

GNUstep provides a framework for sending messages between objects within * a process called notifications. Objects register with an * NSNotificationCenter to be informed whenever other objects * post [NSNotification]s to it matching certain criteria. The notification * center processes notifications synchronously -- that is, control is only * returned to the notification poster once every recipient of the * notification has received it and processed it. Asynchronous processing is * possible using an [NSNotificationQueue].

* *

Obtain an instance using the +defaultCenter method.

* *

In a multithreaded process, notifications are always sent on the thread * that they are posted from.

* *

Use the [NSDistributedNotificationCenter] for interprocess * communications on the same machine.

*/ @implementation NSNotificationCenter /* The default instance, most often the only one created. It is accessed by the class methods at the end of this file. There is no need to mutex locking of this variable. */ static NSNotificationCenter *default_center = nil; + (void) atExit { id tmp = default_center; default_center = nil; [tmp release]; } + (void) initialize { if (self == [NSNotificationCenter class]) { _zone = NSDefaultMallocZone(); if (concrete == 0) { concrete = [GSNotification class]; } /* * Do alloc and init separately so the default center can refer to * the 'default_center' variable during initialisation. */ default_center = [self alloc]; [default_center init]; [self registerAtExit]; } } /** * Returns the default notification center being used for this task (process). * This is used for all notifications posted by the Base library unless * otherwise noted. */ + (NSNotificationCenter*) defaultCenter { return default_center; } /* Initializing. */ - (id) init { if ((self = [super init]) != nil) { _table = newNCTable(); } return self; } - (void) dealloc { [self finalize]; [super dealloc]; } - (void) finalize { if (self == default_center) { [NSException raise: NSInternalInconsistencyException format: @"Attempt to destroy the default center"]; } /* * Release all memory used to store Observations etc. */ endNCTable(TABLE); } /* Adding new observers. */ /** *

Registers observer to receive notifications with the name * notificationName and/or containing object (one or both of these two must be * non-nil; nil acts like a wildcard). When a notification of name name * containing object is posted, observer receives a selector message with this * notification as the argument. The notification center waits for the * observer to finish processing the message, then informs the next registree * matching the notification, and after all of this is done, control returns * to the poster of the notification. Therefore the processing in the * selector implementation should be short.

* *

The notification center does not retain observer or object. Therefore, * you should always send removeObserver: or removeObserver:name:object: to * the notification center before releasing these objects.
*

* *

NB. For MacOS-X compatibility, adding an observer multiple times will * register it to receive multiple copies of any matching notification, however * removing an observer will remove all of the multiple registrations. *

*/ - (void) addObserver: (id)observer selector: (SEL)selector name: (NSString*)name object: (id)object { Observation *list; Observation *o; GSIMapTable m; GSIMapNode n; if (observer == nil) [NSException raise: NSInvalidArgumentException format: @"Nil observer passed to addObserver ..."]; if (selector == 0) [NSException raise: NSInvalidArgumentException format: @"Null selector passed to addObserver ..."]; if ([observer respondsToSelector: selector] == NO) { [NSException raise: NSInvalidArgumentException format: @"[%@-%@] Observer '%@' does not respond to selector '%@'", NSStringFromClass([self class]), NSStringFromSelector(_cmd), observer, NSStringFromSelector(selector)]; } lockNCTable(TABLE); o = obsNew(TABLE, selector, observer); /* * Record the Observation in one of the linked lists. * * NB. It is possible to register an observer for a notification more than * once - in which case, the observer will receive multiple messages when * the notification is posted... odd, but the MacOS-X docs specify this. */ if (name) { /* * Locate the map table for this name - create it if not present. */ n = GSIMapNodeForKey(NAMED, (GSIMapKey)(id)name); if (n == 0) { m = mapNew(TABLE); /* * As this is the first observation for the given name, we take a * copy of the name so it cannot be mutated while in the map. */ name = [name copyWithZone: NSDefaultMallocZone()]; GSIMapAddPair(NAMED, (GSIMapKey)(id)name, (GSIMapVal)(void*)m); GS_CONSUMED(name) } else { m = (GSIMapTable)n->value.ptr; } /* * Add the observation to the list for the correct object. */ n = GSIMapNodeForSimpleKey(m, (GSIMapKey)object); if (n == 0) { o->next = ENDOBS; GSIMapAddPair(m, (GSIMapKey)object, (GSIMapVal)o); } else { list = (Observation*)n->value.ptr; o->next = list->next; list->next = o; } } else if (object) { n = GSIMapNodeForSimpleKey(NAMELESS, (GSIMapKey)object); if (n == 0) { o->next = ENDOBS; GSIMapAddPair(NAMELESS, (GSIMapKey)object, (GSIMapVal)o); } else { list = (Observation*)n->value.ptr; o->next = list->next; list->next = o; } } else { o->next = WILDCARD; WILDCARD = o; } unlockNCTable(TABLE); } /** *

Returns a new observer added to the notification center, in order to * observe the given notification name posted by an object or any object (if * the object argument is nil).

* *

For the name and object arguments, the constraints and behavior described * in -addObserver:name:selector:object: remain valid.

* *

For each notification received by the center, the observer will execute * the notification block. If the queue is not nil, the notification block is * wrapped in a NSOperation and scheduled in the queue, otherwise the block is * executed immediately in the posting thread.

*/ - (id) addObserverForName: (NSString *)name object: (id)object queue: (NSOperationQueue *)queue usingBlock: (GSNotificationBlock)block { GSNotificationObserver *observer = [[GSNotificationObserver alloc] initWithQueue: queue block: block]; [self addObserver: observer selector: @selector(didReceiveNotification:) name: name object: object]; return observer; } /** * Deregisters observer for notifications matching name and/or object. If * either or both is nil, they act like wildcards. The observer may still * remain registered for other notifications; use -removeObserver: to remove * it from all. If observer is nil, the effect is to remove all registrees * for the specified notifications, unless both observer and name are nil, in * which case nothing is done. */ - (void) removeObserver: (id)observer name: (NSString*)name object: (id)object { if (name == nil && object == nil && observer == nil) return; /* * NB. The removal algorithm depends on an implementation characteristic * of our map tables - while enumerating a table, it is safe to remove * the entry returned by the enumerator. */ lockNCTable(TABLE); if (name == nil && object == nil) { WILDCARD = listPurge(WILDCARD, observer); } if (name == nil) { GSIMapEnumerator_t e0; GSIMapNode n0; /* * First try removing all named items set for this object. */ e0 = GSIMapEnumeratorForMap(NAMED); n0 = GSIMapEnumeratorNextNode(&e0); while (n0 != 0) { GSIMapTable m = (GSIMapTable)n0->value.ptr; NSString *thisName = (NSString*)n0->key.obj; n0 = GSIMapEnumeratorNextNode(&e0); if (object == nil) { GSIMapEnumerator_t e1 = GSIMapEnumeratorForMap(m); GSIMapNode n1 = GSIMapEnumeratorNextNode(&e1); /* * Nil object and nil name, so we step through all the maps * keyed under the current name and remove all the objects * that match the observer. */ while (n1 != 0) { GSIMapNode next = GSIMapEnumeratorNextNode(&e1); purgeMapNode(m, n1, observer); n1 = next; } } else { GSIMapNode n1; /* * Nil name, but non-nil object - we locate the map for the * specified object, and remove all the items that match * the observer. */ n1 = GSIMapNodeForSimpleKey(m, (GSIMapKey)object); if (n1 != 0) { purgeMapNode(m, n1, observer); } } /* * If we removed all the observations keyed under this name, we * must remove the map table too. */ if (m->nodeCount == 0) { mapFree(TABLE, m); GSIMapRemoveKey(NAMED, (GSIMapKey)(id)thisName); } } /* * Now remove unnamed items */ if (object == nil) { e0 = GSIMapEnumeratorForMap(NAMELESS); n0 = GSIMapEnumeratorNextNode(&e0); while (n0 != 0) { GSIMapNode next = GSIMapEnumeratorNextNode(&e0); purgeMapNode(NAMELESS, n0, observer); n0 = next; } } else { n0 = GSIMapNodeForSimpleKey(NAMELESS, (GSIMapKey)object); if (n0 != 0) { purgeMapNode(NAMELESS, n0, observer); } } } else { GSIMapTable m; GSIMapEnumerator_t e0; GSIMapNode n0; /* * Locate the map table for this name. */ n0 = GSIMapNodeForKey(NAMED, (GSIMapKey)((id)name)); if (n0 == 0) { unlockNCTable(TABLE); return; /* Nothing to do. */ } m = (GSIMapTable)n0->value.ptr; if (object == nil) { e0 = GSIMapEnumeratorForMap(m); n0 = GSIMapEnumeratorNextNode(&e0); while (n0 != 0) { GSIMapNode next = GSIMapEnumeratorNextNode(&e0); purgeMapNode(m, n0, observer); n0 = next; } } else { n0 = GSIMapNodeForSimpleKey(m, (GSIMapKey)object); if (n0 != 0) { purgeMapNode(m, n0, observer); } } if (m->nodeCount == 0) { mapFree(TABLE, m); GSIMapRemoveKey(NAMED, (GSIMapKey)((id)name)); } } unlockNCTable(TABLE); } /** * Deregisters observer from all notifications. This should be called before * the observer is deallocated. */ - (void) removeObserver: (id)observer { if (observer == nil) return; [self removeObserver: observer name: nil object: nil]; } /** * Private method to perform the actual posting of a notification. * Release the notification before returning, or before we raise * any exception ... to avoid leaks. */ - (void) _postAndRelease: (NSNotification*)notification { Observation *o; unsigned count; NSString *name = [notification name]; id object; GSIMapNode n; GSIMapTable m; GSIArrayItem i[64]; GSIArray_t b; GSIArray a = &b; if (name == nil) { RELEASE(notification); [NSException raise: NSInvalidArgumentException format: @"Tried to post a notification with no name."]; } object = [notification object]; /* * Lock the table of observations while we traverse it. * * The table of observations contains weak pointers which are zeroed when * the observers get destroyed. So to avoid consistency problems * we use scanned memory in the array in the case where there are more * than the 64 observers we allowed room for on the stack. */ GSIArrayInitWithZoneAndStaticCapacity(a, _zone, 64, i); lockNCTable(TABLE); /* * Find all the observers that specified neither NAME nor OBJECT. */ for (o = WILDCARD = purgeCollected(WILDCARD); o != ENDOBS; o = o->next) { GSIArrayAddItem(a, (GSIArrayItem)o); } /* * Find the observers that specified OBJECT, but didn't specify NAME. */ if (object) { n = GSIMapNodeForSimpleKey(NAMELESS, (GSIMapKey)object); if (n != 0) { o = purgeCollectedFromMapNode(NAMELESS, n); while (o != ENDOBS) { GSIArrayAddItem(a, (GSIArrayItem)o); o = o->next; } } } /* * Find the observers of NAME, except those observers with a non-nil OBJECT * that doesn't match the notification's OBJECT). */ if (name) { n = GSIMapNodeForKey(NAMED, (GSIMapKey)((id)name)); if (n) { m = (GSIMapTable)n->value.ptr; } else { m = 0; } if (m != 0) { /* * First, observers with a matching object. */ n = GSIMapNodeForSimpleKey(m, (GSIMapKey)object); if (n != 0) { o = purgeCollectedFromMapNode(m, n); while (o != ENDOBS) { GSIArrayAddItem(a, (GSIArrayItem)o); o = o->next; } } if (object != nil) { /* * Now observers with a nil object. */ n = GSIMapNodeForSimpleKey(m, (GSIMapKey)(id)nil); if (n != 0) { o = purgeCollectedFromMapNode(m, n); while (o != ENDOBS) { GSIArrayAddItem(a, (GSIArrayItem)o); o = o->next; } } } } } /* Finished with the table ... we can unlock it, */ unlockNCTable(TABLE); /* * Now send all the notifications. */ count = GSIArrayCount(a); while (count-- > 0) { o = GSIArrayItemAtIndex(a, count).ext; if (o->next != 0) { NS_DURING { [o->observer performSelector: o->selector withObject: notification]; } NS_HANDLER { BOOL logged; /* Try to report the notification along with the exception, * but if there's a problem with the notification itself, * we just log the exception. */ NS_DURING NSLog(@"Problem posting %@: %@", notification, localException); logged = YES; NS_HANDLER logged = NO; NS_ENDHANDLER if (NO == logged) { NSLog(@"Problem posting notification: %@", localException); } } NS_ENDHANDLER } } lockNCTable(TABLE); GSIArrayEmpty(a); unlockNCTable(TABLE); RELEASE(notification); } /** * Posts notification to all the observers that match its NAME and OBJECT.
* The GNUstep implementation calls -postNotificationName:object:userInfo: to * perform the actual posting. */ - (void) postNotification: (NSNotification*)notification { if (notification == nil) { [NSException raise: NSInvalidArgumentException format: @"Tried to post a nil notification."]; } [self _postAndRelease: RETAIN(notification)]; } /** * Creates and posts a notification using the * -postNotificationName:object:userInfo: passing a nil user info argument. */ - (void) postNotificationName: (NSString*)name object: (id)object { [self postNotificationName: name object: object userInfo: nil]; } /** * The preferred method for posting a notification. *
* For performance reasons, we don't wrap an exception handler round every * message sent to an observer. This means that, if one observer raises * an exception, later observers in the lists will not get the notification. */ - (void) postNotificationName: (NSString*)name object: (id)object userInfo: (NSDictionary*)info { GSNotification *notification; notification = (id)NSAllocateObject(concrete, 0, NSDefaultMallocZone()); notification->_name = [name copyWithZone: [self zone]]; notification->_object = [object retain]; notification->_info = [info retain]; [self _postAndRelease: notification]; } @end gnustep-base-1.29.0/Source/NSNotificationQueue.m000066400000000000000000000415351435650067400215340ustar00rootroot00000000000000/** Implementation for NSNotificationQueue for GNUStep Copyright (C) 1995-1999 Free Software Foundation, Inc. Author: Mircea Oancea Date: 1995 Modified by: Richard Frith-Macdonald Date: 1997 Rewritten: 1999 This file is part of the GNUstep Base Library. 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 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 USA. NSNotificationQueue class reference $Date$ $Revision$ */ #import "common.h" #define EXPOSE_NSNotificationQueue_IVARS 1 #import "Foundation/NSRunLoop.h" #import "Foundation/NSNotificationQueue.h" #import "Foundation/NSNotification.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSArray.h" #import "Foundation/NSThread.h" #import "GSPrivate.h" /* NotificationQueueList by Richard Frith-Macdonald These objects are used to maintain lists of NSNotificationQueue objects. There is one list per NSThread, with the first object in the list stored in the thread dictionary and accessed using the key below. */ static NSString* lkey = @"NotificationQueueListThreadKey"; static NSString* qkey = @"NotificationQueueThreadKey"; @interface NotificationQueueList : NSObject { @public NotificationQueueList *next; NSNotificationQueue *queue; } + (void) registerQueue: (NSNotificationQueue*)q; + (void) unregisterQueue: (NSNotificationQueue*)q; @end static NotificationQueueList* currentList(void) { NotificationQueueList *list; NSMutableDictionary *d; d = GSCurrentThreadDictionary(); list = (NotificationQueueList*)[d objectForKey: lkey]; if (list == nil) { list = [NotificationQueueList new]; [d setObject: list forKey: lkey]; RELEASE(list); /* retained in dictionary. */ } return list; } @implementation NotificationQueueList - (void) dealloc { while (next != nil) { NotificationQueueList *tmp = next; next = tmp->next; RELEASE(tmp); } [super dealloc]; } + (void) registerQueue: (NSNotificationQueue*)q { NotificationQueueList *list; NotificationQueueList *elem; list = currentList(); /* List of queues for thread. */ if (list->queue == nil) { list->queue = q; /* Make this the default. */ } while (list->queue != q && list->next != nil) { list = list->next; } if (list->queue == q) { return; /* Queue already registered. */ } elem = (NotificationQueueList*)NSAllocateObject(self, 0, NSDefaultMallocZone()); elem->queue = q; list->next = elem; } + (void) unregisterQueue: (NSNotificationQueue*)q { NotificationQueueList *list; list = currentList(); if (list->queue == q) { NSMutableDictionary *d = GSCurrentThreadDictionary(); NotificationQueueList *tmp = list->next; if (tmp != nil) { [d setObject: tmp forKey: lkey]; RELEASE(tmp); /* retained in dictionary. */ } else { [d removeObjectForKey: lkey]; } } else { while (list->next != nil) { if (list->next->queue == q) { NotificationQueueList *tmp = list->next; list->next = tmp->next; RELEASE(tmp); break; } } } } @end /* * NSNotificationQueue queue */ typedef struct _NSNotificationQueueRegistration { struct _NSNotificationQueueRegistration *next; struct _NSNotificationQueueRegistration *prev; NSNotification *notification; id name; id object; NSArray *modes; } NSNotificationQueueRegistration; struct _NSNotificationQueueList; typedef struct _NSNotificationQueueList { struct _NSNotificationQueueRegistration *head; struct _NSNotificationQueueRegistration *tail; } NSNotificationQueueList; /* * Queue functions * * Queue Elem Elem Elem * head ---------> next -----------> next -----------> next --> nil * nil <-- prev <----------- prev <----------- prev * tail ---------------------------------------------> */ static inline void remove_from_queue_no_release(NSNotificationQueueList *queue, NSNotificationQueueRegistration *item) { if (item->next) { item->next->prev = item->prev; } else { NSCAssert(queue->tail == item, @"tail item not at tail of queue!"); queue->tail = item->prev; } if (item->prev) { item->prev->next = item->next; } else { NSCAssert(queue->head == item, @"head item not at head of queue!"); queue->head = item->next; } } static void remove_from_queue(NSNotificationQueueList *queue, NSNotificationQueueRegistration *item, NSZone *_zone) { remove_from_queue_no_release(queue, item); RELEASE(item->notification); RELEASE(item->modes); NSZoneFree(_zone, item); } static void add_to_queue(NSNotificationQueueList *queue, NSNotification *notification, NSArray *modes, NSZone *_zone) { NSNotificationQueueRegistration *item; item = NSZoneCalloc(_zone, 1, sizeof(NSNotificationQueueRegistration)); if (item == 0) { [NSException raise: NSMallocException format: @"Unable to add to notification queue"]; } item->notification = RETAIN(notification); item->name = [notification name]; item->object = [notification object]; item->modes = [modes copyWithZone: [modes zone]]; item->next = NULL; item->prev = queue->tail; queue->tail = item; if (item->prev) { item->prev->next = item; } if (!queue->head) { queue->head = item; } } /* * NSNotificationQueue class implementation */ @interface NSNotificationQueue (Private) - (NSNotificationCenter*) _center; @end /** * This class supports asynchronous posting of [NSNotification]s to an * [NSNotificationCenter]. The method to add a notification to the queue * returns immediately. The queue will periodically post its oldest * notification to the notification center. In a multithreaded process, * notifications are always sent on the thread that they are posted from. */ @implementation NSNotificationQueue static NSArray *defaultMode = nil; + (void) initialize { if (defaultMode == nil) { defaultMode = [[NSArray alloc] initWithObjects: (id*)&NSDefaultRunLoopMode count: 1]; [[NSObject leakAt: &defaultMode] release]; } } /** * Returns the default notification queue for use in this thread. It will * always post notifications to the default notification center (for the * entire task, which may have multiple threads and therefore multiple * notification queues). */ + (NSNotificationQueue*) defaultQueue { NotificationQueueList *list; NSNotificationQueue *item; list = currentList(); item = list->queue; if (item == nil) { item = (NSNotificationQueue*)NSAllocateObject(self, 0, NSDefaultMallocZone()); item = [item initWithNotificationCenter: [NSNotificationCenter defaultCenter]]; if (item != nil) { NSMutableDictionary *d; d = GSCurrentThreadDictionary(); [d setObject: item forKey: qkey]; RELEASE(item); /* retained in dictionary. */ } } return item; } - (id) init { return [self initWithNotificationCenter: [NSNotificationCenter defaultCenter]]; } /** * Initialize a new instance to post notifications to the given * notificationCenter (instead of the default). */ - (id) initWithNotificationCenter: (NSNotificationCenter*)notificationCenter { _zone = [self zone]; // init queue _center = RETAIN(notificationCenter); _asapQueue = NSZoneCalloc(_zone, 1, sizeof(NSNotificationQueueList)); _idleQueue = NSZoneCalloc(_zone, 1, sizeof(NSNotificationQueueList)); if (_asapQueue == 0 || _idleQueue == 0) { DESTROY(self); } else { /* * insert in global queue list */ [NotificationQueueList registerQueue: self]; } return self; } - (void) dealloc { NSNotificationQueueRegistration *item; /* * remove from class instances list */ [NotificationQueueList unregisterQueue: self]; /* * release items from our queues */ while ((item = _asapQueue->head) != 0) { remove_from_queue(_asapQueue, item, _zone); } NSZoneFree(_zone, _asapQueue); while ((item = _idleQueue->head) != 0) { remove_from_queue(_idleQueue, item, _zone); } NSZoneFree(_zone, _idleQueue); RELEASE(_center); [super dealloc]; } /* Inserting and Removing Notifications From a Queue */ /** * Immediately remove all notifications from queue matching notification on * name and/or object as specified by coalesce mask, which is an OR * ('|') of the options * NSNotificationCoalescingOnName, * NSNotificationCoalescingOnSender (object), and * NSNotificationNoCoalescing (match only the given instance * exactly). If both of the first options are specified, notifications must * match on both attributes (not just either one). Removed notifications are * not posted. */ - (void) dequeueNotificationsMatching: (NSNotification*)notification coalesceMask: (NSUInteger)coalesceMask { NSNotificationQueueRegistration *item; NSNotificationQueueRegistration *prev; id name = [notification name]; id object = [notification object]; if ((coalesceMask & NSNotificationCoalescingOnName) && (coalesceMask & NSNotificationCoalescingOnSender)) { /* * find in ASAP notification in queue matching both */ for (item = _asapQueue->tail; item; item = prev) { prev = item->prev; //PENDING: should object comparison be '==' instead of isEqual?! if ((object == item->object) && [name isEqual: item->name]) { remove_from_queue(_asapQueue, item, _zone); } } /* * find in idle notification in queue matching both */ for (item = _idleQueue->tail; item; item = prev) { prev = item->prev; if ((object == item->object) && [name isEqual: item->name]) { remove_from_queue(_idleQueue, item, _zone); } } } else if ((coalesceMask & NSNotificationCoalescingOnName)) { /* * find in ASAP notification in queue matching name */ for (item = _asapQueue->tail; item; item = prev) { prev = item->prev; if ([name isEqual: item->name]) { remove_from_queue(_asapQueue, item, _zone); } } /* * find in idle notification in queue matching name */ for (item = _idleQueue->tail; item; item = prev) { prev = item->prev; if ([name isEqual: item->name]) { remove_from_queue(_idleQueue, item, _zone); } } } else if ((coalesceMask & NSNotificationCoalescingOnSender)) { /* * find in ASAP notification in queue matching sender */ for (item = _asapQueue->tail; item; item = prev) { prev = item->prev; if (object == item->object) { remove_from_queue(_asapQueue, item, _zone); } } /* * find in idle notification in queue matching sender */ for (item = _idleQueue->tail; item; item = prev) { prev = item->prev; if (object == item->object) { remove_from_queue(_idleQueue, item, _zone); } } } } /** * Sets notification to be posted to notification center at time dependent on * postingStyle, which may be either NSPostNow (synchronous post), * NSPostASAP (post soon), or NSPostWhenIdle (post * when runloop is idle). */ - (void) enqueueNotification: (NSNotification*)notification postingStyle: (NSPostingStyle)postingStyle { [self enqueueNotification: notification postingStyle: postingStyle coalesceMask: NSNotificationCoalescingOnName + NSNotificationCoalescingOnSender forModes: nil]; } /** * Sets notification to be posted to notification center at time dependent on * postingStyle, which may be either NSPostNow (synchronous * post), NSPostASAP (post soon), or NSPostWhenIdle * (post when runloop is idle). coalesceMask determines whether this * notification should be considered same as other ones already on the queue, * in which case they are removed through a call to * -dequeueNotificationsMatching:coalesceMask: . The modes argument * determines which [NSRunLoop] mode notification may be posted in (nil means * NSDefaultRunLoopMode). */ - (void) enqueueNotification: (NSNotification*)notification postingStyle: (NSPostingStyle)postingStyle coalesceMask: (NSUInteger)coalesceMask forModes: (NSArray*)modes { if (modes == nil) { modes = defaultMode; } if (coalesceMask != NSNotificationNoCoalescing) { [self dequeueNotificationsMatching: notification coalesceMask: coalesceMask]; } switch (postingStyle) { case NSPostNow: { NSString *mode; mode = [[NSRunLoop currentRunLoop] currentMode]; if (mode == nil || [modes indexOfObject: mode] != NSNotFound) { [_center postNotification: notification]; } } break; case NSPostASAP: add_to_queue(_asapQueue, notification, modes, _zone); break; case NSPostWhenIdle: add_to_queue(_idleQueue, notification, modes, _zone); break; } } @end @implementation NSNotificationQueue (Private) - (NSNotificationCenter*) _center { return _center; } @end static void notify(NSNotificationCenter *center, NSNotificationQueueList *list, NSString *mode, NSZone *zone) { BOOL allocated = NO; void *buf[100]; void **ptr = buf; unsigned len = sizeof(buf) / sizeof(*buf); unsigned pos = 0; NSNotificationQueueRegistration *item = list->head; /* Gather matching items into a buffer. */ while (item != 0) { if (mode == nil || [item->modes indexOfObject: mode] != NSNotFound) { if (pos == len) { unsigned want; want = (len == 0) ? 2 : len * 2; if (NO == allocated) { void *tmp; tmp = NSZoneMalloc(NSDefaultMallocZone(), want * sizeof(void*)); memcpy(tmp, (void*)ptr, len * sizeof(void*)); ptr = tmp; allocated = YES; } else { ptr = NSZoneRealloc(NSDefaultMallocZone(), ptr, want * sizeof(void*)); } len = want; } ptr[pos++] = item; } item = item->next; // head --> tail uses next link } len = pos; // Number of items found /* Posting a notification catches exceptions, so it's OK to use * retain/release of objects here as we won't get an exception * causing a leak. */ if (len > 0) { /* First, we make a note of each notification while removing the * corresponding list item from the queue ... so that when we get * round to posting the notifications we will not get problems * with another notif() trying to use the same items. */ for (pos = 0; pos < len; pos++) { item = ptr[pos]; ptr[pos] = RETAIN(item->notification); remove_from_queue(list, item, zone); } /* Now that we no longer need to worry about r-entrancy, * we step through our notifications, posting each one in turn. */ for (pos = 0; pos < len; pos++) { NSNotification *n = (NSNotification*)ptr[pos]; [center postNotification: n]; RELEASE(n); } if (allocated) { NSZoneFree(NSDefaultMallocZone(), ptr); } } } /* * The following code handles sending of queued notifications by * NSRunLoop. */ void GSPrivateNotifyASAP(NSString *mode) { NotificationQueueList *item; GSPrivateCheckTasks(); for (item = currentList(); item; item = item->next) { if (item->queue) { notify(item->queue->_center, item->queue->_asapQueue, mode, item->queue->_zone); } } } void GSPrivateNotifyIdle(NSString *mode) { NotificationQueueList *item; for (item = currentList(); item; item = item->next) { if (item->queue) { notify(item->queue->_center, item->queue->_idleQueue, mode, item->queue->_zone); } } } BOOL GSPrivateNotifyMore(NSString *mode) { NotificationQueueList *item; for (item = currentList(); item; item = item->next) { if (item->queue != nil) { NSNotificationQueueRegistration *r; r = item->queue->_idleQueue->head; while (r != 0) { if (mode == nil || [r->modes indexOfObject: mode] != NSNotFound) { return YES; } r = r->next; } } } return NO; } gnustep-base-1.29.0/Source/NSNull.m000066400000000000000000000040571435650067400170110ustar00rootroot00000000000000/** Implementation for NSNull for GNUStep Copyright (C) 2000 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 2000 This file is part of the GNUstep Base Library. 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 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 USA. NSNull class reference $Date$ $Revision$ */ #import "common.h" #import "Foundation/NSNull.h" /** * An object to use as a placeholder - in collections for instance. */ @implementation NSNull static NSNull *null = 0; + (id) allocWithZone: (NSZone*)z { return null; } + (id) alloc { return null; } + (void) initialize { if (null == 0) { null = (NSNull*)NSAllocateObject(self, 0, NSDefaultMallocZone()); [[NSObject leakAt: &null] release]; } } /** * Return an object that can be used as a placeholder in a collection. * This method always returns the same object. */ + (NSNull*) null { return null; } - (id) autorelease { return self; } - (id) copyWithZone: (NSZone*)z { return self; } - (id) copy { return self; } - (void) dealloc { GSNOSUPERDEALLOC; } - (NSString*) description { return @""; } - (void) encodeWithCoder: (NSCoder*)aCoder { } - (id) initWithCoder: (NSCoder*)aCoder { return self; } - (BOOL) isEqual: (id)other { if (other == self) return YES; else return NO; } - (oneway void) release { } - (id) retain { return self; } @end gnustep-base-1.29.0/Source/NSNumber.m000066400000000000000000000610471435650067400173310ustar00rootroot00000000000000/** Implementation of NSNumber for GNUStep Copyright (C) 2010 Free Software Foundation, Inc. Written by: David Chisnall Partial rewrite: Richard Frith-Macdonld (to compile on gnu/linux and mswindows, to meet coding/style standards, to restore lost functionality) Date: February 2010 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #if !defined(LLONG_MAX) # if defined(__LONG_LONG_MAX__) # define LLONG_MAX __LONG_LONG_MAX__ # define LLONG_MIN (-LLONG_MAX-1) # define ULLONG_MAX (LLONG_MAX * 2ULL + 1) # else # error Neither LLONG_MAX nor __LONG_LONG_MAX__ found # endif #endif #import "common.h" #import "Foundation/NSCoder.h" #import "Foundation/NSDecimalNumber.h" #import "Foundation/NSException.h" #import "Foundation/NSValue.h" #if __has_include() # include #endif /* * NSNumber implementation. This matches the behaviour of Apple's * implementation. Values in the range -1 to 12 inclusive are mapped to * singletons. All other values are mapped to the smallest signed value that * will store them, unless they are greater than LLONG_MAX, in which case * they are stored in an unsigned long long. * Booleans are handled as a special case since some stuff (notably interface * builder (nib) archives) needs to differentiate between booleans and integers. */ @interface NSSignedIntegerNumber : NSNumber @end @interface NSIntNumber : NSSignedIntegerNumber { @public int value; } @end /* Some code needs to differentiate between booleans and other NSNumber * instances, so we need a special subclass to permit that. */ @interface NSBoolNumber : NSIntNumber @end @interface NSLongLongNumber : NSSignedIntegerNumber { @public long long int value; } @end @interface NSUnsignedLongLongNumber : NSNumber { @public unsigned long long int value; } @end // The value ivar in all of the concrete classes contains the real value. #define VALUE value #define COMPARE(value, other) \ if (value < other)\ {\ return NSOrderedAscending;\ }\ if (value > other)\ {\ return NSOrderedDescending;\ }\ return NSOrderedSame; #define DCOMPARE(value, other) \ if (isnan(value)) \ { \ if (isnan(other)) \ { \ return NSOrderedSame; \ } \ else \ { \ return NSOrderedAscending; \ } \ } \ else \ { \ if (isnan(other)) \ { \ if (value < 0.0) \ { \ return NSOrderedAscending; \ } \ return NSOrderedDescending; \ } \ else if (value < other) \ { \ return NSOrderedAscending; \ } \ else if (value > other) \ { \ return NSOrderedDescending; \ } \ return NSOrderedSame; \ } @implementation NSSignedIntegerNumber - (NSComparisonResult) compare: (NSNumber*)aNumber { if (aNumber == self) { return NSOrderedSame; } if (aNumber == nil) { [NSException raise: NSInvalidArgumentException format: @"nil argument for compare:"]; } switch ([aNumber objCType][0]) { /* For cases smaller than or equal to an int, we could get the int * value and compare. */ case 'c': case 'C': case 's': case 'S': case 'i': case 'I': case 'l': case 'L': case 'q': { long long value = [self longLongValue]; long long other = [aNumber longLongValue]; COMPARE (value, other); } case 'Q': { unsigned long long other; unsigned long long value; long long v; /* According to the C type promotion rules, we should cast this to * an unsigned long long, however Apple's code does not do this. * Instead, it performs a real comparison. */ v = [self longLongValue]; /* If this value is less than 0, then it is less than any value * that can possibly be stored in an unsigned value. */ if (v < 0) { return NSOrderedAscending; } other = [aNumber unsignedLongLongValue]; value = (unsigned long long) v; COMPARE (value, other); } case 'f': case 'd': { double other = [aNumber doubleValue]; double value = [self doubleValue]; DCOMPARE(value, other) } default: [NSException raise: NSInvalidArgumentException format: @"unrecognised type for compare:"]; } return 0; // Not reached. } @end @implementation NSIntNumber #define FORMAT @"%i" #include "NSNumberMethods.h" @end @implementation NSBoolNumber - (void) getValue: (void*)buffer { BOOL *ptr = (BOOL*)buffer; *ptr = VALUE; } - (const char *) objCType { return @encode(BOOL); } @end @implementation NSLongLongNumber #define FORMAT @"%lli" #include "NSNumberMethods.h" @end @implementation NSUnsignedLongLongNumber #define FORMAT @"%llu" #include "NSNumberMethods.h" - (NSComparisonResult) compare: (NSNumber*)aNumber { if (aNumber == self) { return NSOrderedSame; } if (aNumber == nil) { [NSException raise: NSInvalidArgumentException format: @"nil argument for compare:"]; } switch ([aNumber objCType][0]) { /* For cases smaller than or equal to an int, we could get the int * value and compare. */ case 'c': case 'C': case 's': case 'S': case 'i': case 'I': case 'l': case 'L': case 'q': { long long other = [aNumber longLongValue]; if (other < 0) { return NSOrderedDescending; } COMPARE (value, ((unsigned long long) other)); } case 'Q': { unsigned long long other = [aNumber unsignedLongLongValue]; COMPARE (value, other); } case 'f': case 'd': { double other = [aNumber doubleValue]; double selfv = [self doubleValue]; DCOMPARE(selfv, other) } default: [NSException raise: NSInvalidArgumentException format: @"unrecognised type for compare:"]; } return 0; // Not reached. } @end /* * Abstract superclass for floating point numbers. */ @interface NSFloatingPointNumber : NSNumber @end @implementation NSFloatingPointNumber /* For floats, the type promotion rules say that we always promote to a * floating point type, even if the other value is really an integer. */ - (BOOL) isEqualToNumber: (NSNumber*)aNumber { return ([self doubleValue] == [aNumber doubleValue]) ? YES : NO; } - (NSComparisonResult) compare: (NSNumber*)aNumber { double other; double value; if (aNumber == self) { return NSOrderedSame; } if (aNumber == nil) { [NSException raise: NSInvalidArgumentException format: @"nil argument for compare:"]; } other = [aNumber doubleValue]; value = [self doubleValue]; DCOMPARE(value, other) } @end @interface NSFloatNumber : NSFloatingPointNumber { @public float value; } @end @implementation NSFloatNumber #define FORMAT @"%0.7g" #include "NSNumberMethods.h" @end @interface NSDoubleNumber : NSFloatingPointNumber { @public double value; } @end @implementation NSDoubleNumber #define FORMAT @"%0.16g" #include "NSNumberMethods.h" @end #ifdef OBJC_SMALL_OBJECT_SHIFT static BOOL useSmallInt; #if OBJC_SMALL_OBJECT_SHIFT == 3 static BOOL useSmallExtendedDouble; static BOOL useSmallRepeatingDouble; static BOOL useSmallFloat; #endif #define SMALL_INT_MASK 1 #define SMALL_EXTENDED_DOUBLE_MASK 2 #define SMALL_REPEATING_DOUBLE_MASK 3 // 4 is GSTinyString #define SMALL_FLOAT_MASK 5 @interface NSSmallInt : NSSignedIntegerNumber @end @implementation NSSmallInt #undef VALUE #define VALUE (((intptr_t)self) >> OBJC_SMALL_OBJECT_SHIFT) #define FORMAT @"%"PRIdPTR #include "NSNumberMethods.h" + (void) load { useSmallInt = objc_registerSmallObjectClass_np(self, SMALL_INT_MASK); } + (id) alloc { return (id)1; } + (id) allocWithZone: (NSZone*)aZone { return (id)1; } - (id) copy { return self; } - (id) copyWithZone: (NSZone*)aZone { return self; } - (id) retain { return self; } - (NSUInteger) retainCount { return UINT_MAX; } - (id) autorelease { return self; } - (oneway void) release { return; } @end #if OBJC_SMALL_OBJECT_SHIFT == 3 union BoxedDouble { id obj; uintptr_t bits; double d; }; @interface NSSmallExtendedDouble : NSFloatingPointNumber @end @implementation NSSmallExtendedDouble static double unboxSmallExtendedDouble(uintptr_t boxed) { // The low bit of the mantissa uintptr_t mask = boxed & 8; union BoxedDouble ret; // Clear the class pointer boxed &= ~7; ret.bits = boxed | (mask >> 1) | (mask >> 2) | (mask >> 3); return ret.d; } static BOOL isSmallExtendedDouble(double d) { union BoxedDouble b = {.d=d}; return unboxSmallExtendedDouble(b.bits) == d; } static double unboxSmallRepeatingDouble(uintptr_t boxed) { // The low bit of the mantissa uintptr_t mask = boxed & 56; union BoxedDouble ret; // Clear the class pointer boxed &= ~7; ret.bits = boxed | (mask >> 3); return ret.d; } static BOOL isSmallRepeatingDouble(double d) { union BoxedDouble b = {.d=d}; return unboxSmallRepeatingDouble(b.bits) == d; } static id boxDouble(double d, uintptr_t mask) { union BoxedDouble b = {.d=d}; b.bits &= ~OBJC_SMALL_OBJECT_MASK; b.bits |= mask; return b.obj; } #undef VALUE #define VALUE (unboxSmallExtendedDouble((uintptr_t)self)) #define FORMAT @"%0.16g" #include "NSNumberMethods.h" + (void) load { useSmallExtendedDouble = objc_registerSmallObjectClass_np (self, SMALL_EXTENDED_DOUBLE_MASK); } + (id) alloc { return (id)SMALL_EXTENDED_DOUBLE_MASK; } + (id) allocWithZone: (NSZone*)aZone { return (id)SMALL_EXTENDED_DOUBLE_MASK; } - (id) copy { return self; } - (id) copyWithZone: (NSZone*)aZone { return self; } - (id) retain { return self; } - (NSUInteger) retainCount { return UINT_MAX; } - (id) autorelease { return self; } - (oneway void) release { return; } @end @interface NSSmallRepeatingDouble : NSFloatingPointNumber @end @implementation NSSmallRepeatingDouble #undef VALUE #define VALUE (unboxSmallRepeatingDouble((uintptr_t)self)) #define FORMAT @"%0.16g" #include "NSNumberMethods.h" + (void) load { useSmallRepeatingDouble = objc_registerSmallObjectClass_np (self, SMALL_REPEATING_DOUBLE_MASK); } + (id) alloc { return (id)SMALL_REPEATING_DOUBLE_MASK; } + (id) allocWithZone: (NSZone*)aZone { return (id)SMALL_REPEATING_DOUBLE_MASK; } - (id) copy { return self; } - (id) copyWithZone: (NSZone*)aZone { return self; } - (id) retain { return self; } - (NSUInteger) retainCount { return UINT_MAX; } - (id) autorelease { return self; } - (oneway void) release { return; } @end /* * Technically, all floats are small on 64bit and fit into a NSRepeatingDouble, * but we want to get the description FORMAT right for floats (i.e. "%0.7g" and * not "%0.16g". */ @interface NSSmallFloat : NSSmallRepeatingDouble @end @implementation NSSmallFloat #undef VALUE #define VALUE (unboxSmallRepeatingDouble((uintptr_t)self)) #define FORMAT @"%0.7g" #include "NSNumberMethods.h" + (void) load { useSmallFloat = objc_registerSmallObjectClass_np (self, SMALL_FLOAT_MASK); } + (id) alloc { return (id)SMALL_FLOAT_MASK; } + (id) allocWithZone: (NSZone*)aZone { return (id)SMALL_FLOAT_MASK; } @end #endif #endif @implementation NSNumber static Class NSNumberClass; static Class NSBoolNumberClass; static Class NSIntNumberClass; static Class NSLongLongNumberClass; static Class NSUnsignedLongLongNumberClass; static Class NSFloatNumberClass; static Class NSDoubleNumberClass; /* * Numbers from -1 to 12 inclusive that are reused. */ static NSNumber *ReusedInstances[14]; static NSBoolNumber *boolY; // Boolean YES (integer 1) static NSBoolNumber *boolN; // Boolean NO (integer 0) + (void) initialize { int i; if ([NSNumber class] != self) { return; } NSNumberClass = self; NSBoolNumberClass = [NSBoolNumber class]; NSIntNumberClass = [NSIntNumber class]; NSLongLongNumberClass = [NSLongLongNumber class]; NSUnsignedLongLongNumberClass = [NSUnsignedLongLongNumber class]; NSFloatNumberClass = [NSFloatNumber class]; NSDoubleNumberClass = [NSDoubleNumber class]; boolY = NSAllocateObject(NSBoolNumberClass, 0, 0); [[NSObject leakAt: &boolY] release]; boolY->value = 1; boolN = NSAllocateObject(NSBoolNumberClass, 0, 0); boolN->value = 0; [[NSObject leakAt: &boolN] release]; for (i = 0; i < 14; i++) { NSIntNumber *n = NSAllocateObject(NSIntNumberClass, 0, 0); n->value = i - 1; ReusedInstances[i] = n; [[NSObject leakAt: &ReusedInstances[i]] release]; } } - (const char *) objCType { /* All concrete NSNumber types must implement this so we know which one * they are. */ [self subclassResponsibility: _cmd]; return NULL; // Not reached } - (BOOL) isEqualToNumber: (NSNumber*)aNumber { return ([self compare: aNumber] == NSOrderedSame) ? YES : NO; } - (BOOL) isEqual: (id)anObject { if ([anObject isKindOfClass: NSNumberClass]) { return [self isEqualToNumber: anObject]; } return [super isEqual: anObject]; } - (BOOL) isEqualToValue: (NSValue*)aValue { if ([aValue isKindOfClass: NSNumberClass]) { return [self isEqualToNumber: (NSNumber*)aValue]; } return NO; } - (NSUInteger) hash { return (unsigned)[self doubleValue]; } - (NSString*) stringValue { return [self descriptionWithLocale: nil]; } - (NSString*) descriptionWithLocale: (id)aLocale { [self subclassResponsibility: _cmd]; return nil; // Not reached } - (NSComparisonResult) compare: (NSNumber*)aNumber { [self subclassResponsibility: _cmd]; return 0; // Not reached } #define INTEGER_MACRO(encoding,type, ignored, name) \ - (id) initWith ## name: (type)aValue \ {\ DESTROY(self);\ return [[NSNumberClass numberWith ## name: aValue] retain];\ } #include "GSNumberTypes.h" - (id) initWithBool: (BOOL)aValue { DESTROY(self); return [(aValue == 0 ? boolN : boolY) retain];\ } /* * Macro for checking whether this value is the same as one of the singleton * instances. */ #define CHECK_SINGLETON(aValue) \ if (aValue >= -1 && aValue <= 12)\ {\ return ReusedInstances[aValue+1];\ } + (NSNumber *) numberWithBool: (BOOL)aValue { if (self != NSNumberClass) { return [[[self alloc] initWithBytes: (const void *)&aValue objCType: @encode(BOOL)] autorelease]; } if (0 == aValue) { return boolN; } return boolY; } + (NSNumber *) numberWithChar: (signed char)aValue { if (self != NSNumberClass) { return [[[self alloc] initWithBytes: (const void *)&aValue objCType: @encode(signed char)] autorelease]; } return [self numberWithInt: aValue]; } + (NSNumber *) numberWithUnsignedChar: (unsigned char)aValue { if (self != NSNumberClass) { return [[[self alloc] initWithBytes: (const void *)&aValue objCType: @encode(unsigned char)] autorelease]; } return [self numberWithInt: aValue]; } + (NSNumber *) numberWithShort: (short)aValue { if (self != NSNumberClass) { return [[[self alloc] initWithBytes: (const void *)&aValue objCType: @encode(short)] autorelease]; } return [self numberWithInt: aValue]; } + (NSNumber *) numberWithUnsignedShort: (unsigned short)aValue { if (self != NSNumberClass) { return [[[self alloc] initWithBytes: (const void *)&aValue objCType: @encode(unsigned short)] autorelease]; } return [self numberWithInt: aValue]; } + (NSNumber *) numberWithInt: (int)aValue { NSIntNumber *n; if (self != NSNumberClass) { return [[[self alloc] initWithBytes: (const void *)&aValue objCType: @encode(int)] autorelease]; } CHECK_SINGLETON(aValue); #ifdef OBJC_SMALL_OBJECT_SHIFT if (useSmallInt && (aValue < (INT_MAX>>OBJC_SMALL_OBJECT_SHIFT)) && (aValue > -(INT_MAX>>OBJC_SMALL_OBJECT_SHIFT))) { return (id)((((NSInteger)aValue) << OBJC_SMALL_OBJECT_SHIFT) | SMALL_INT_MASK); } #endif n = NSAllocateObject(NSIntNumberClass, 0, 0); n->value = aValue; return AUTORELEASE(n); } + (NSNumber *) numberWithUnsignedInt: (unsigned int)aValue { if (self != NSNumberClass) { return [[[self alloc] initWithBytes: (const void *)&aValue objCType: @encode(unsigned int)] autorelease]; } CHECK_SINGLETON(aValue); if (aValue < (unsigned int) INT_MAX) { return [self numberWithInt: (int)aValue]; } return [self numberWithLongLong: aValue]; } + (NSNumber *) numberWithLong: (long)aValue { if (self != NSNumberClass) { return [[[self alloc] initWithBytes: (const void *)&aValue objCType: @encode(long)] autorelease]; } return [self numberWithLongLong: aValue]; } + (NSNumber *) numberWithUnsignedLong: (unsigned long)aValue { if (self != NSNumberClass) { return [[[self alloc] initWithBytes: (const void *)&aValue objCType: @encode(unsigned long)] autorelease]; } return [self numberWithUnsignedLongLong: aValue]; } + (NSNumber *) numberWithLongLong: (long long)aValue { NSLongLongNumber *n; if (self != NSNumberClass) { return [[[self alloc] initWithBytes: (const void *)&aValue objCType: @encode(long long)] autorelease]; } CHECK_SINGLETON(aValue); if (aValue < (long long)INT_MAX && aValue > (long long)INT_MIN) { return [self numberWithInt: (int) aValue]; } n = NSAllocateObject(NSLongLongNumberClass, 0, 0); n->value = aValue; return AUTORELEASE(n); } + (NSNumber *) numberWithUnsignedLongLong: (unsigned long long)aValue { NSUnsignedLongLongNumber *n; if (self != NSNumberClass) { return [[[self alloc] initWithBytes: (const void *)&aValue objCType: @encode(unsigned long long)] autorelease]; } if (aValue < (unsigned long long) LLONG_MAX) { return [self numberWithLongLong: (long long) aValue]; } n = NSAllocateObject(NSUnsignedLongLongNumberClass, 0, 0); n->value = aValue; return AUTORELEASE(n); } + (NSNumber *) numberWithFloat: (float)aValue { NSFloatNumber *n; if (self != NSNumberClass) { return [[[self alloc] initWithBytes: (const void *)&aValue objCType: @encode(float)] autorelease]; } #if OBJC_SMALL_OBJECT_SHIFT == 3 if (useSmallFloat) { return boxDouble(aValue, SMALL_FLOAT_MASK); } #endif n = NSAllocateObject(NSFloatNumberClass, 0, 0); n->value = aValue; return AUTORELEASE(n); } + (NSNumber *) numberWithDouble: (double)aValue { NSDoubleNumber *n; if (self != NSNumberClass) { return [[[self alloc] initWithBytes: (const void *)&aValue objCType: @encode(double)] autorelease]; } #if OBJC_SMALL_OBJECT_SHIFT == 3 if (useSmallRepeatingDouble && isSmallRepeatingDouble(aValue)) { return boxDouble(aValue, SMALL_REPEATING_DOUBLE_MASK); } if (useSmallExtendedDouble && isSmallExtendedDouble(aValue)) { return boxDouble(aValue, SMALL_EXTENDED_DOUBLE_MASK); } #endif n = NSAllocateObject(NSDoubleNumberClass, 0, 0); n->value = aValue; return AUTORELEASE(n); } + (NSNumber *) numberWithInteger: (NSInteger)aValue { if (self != NSNumberClass) { return [[[self alloc] initWithBytes: (const void *)&aValue objCType: @encode(NSInteger)] autorelease]; } // Compile time constant; the compiler will remove this conditional if (sizeof (NSInteger) == sizeof (int)) { return [self numberWithInt: aValue]; } return [self numberWithLongLong: aValue]; } + (NSNumber *) numberWithUnsignedInteger: (NSUInteger)aValue { if (self != NSNumberClass) { return [[[self alloc] initWithBytes: (const void *)&aValue objCType: @encode(NSUInteger)] autorelease]; } // Compile time constant; the compiler will remove this conditional if (sizeof (NSUInteger) == sizeof (unsigned int)) { return [self numberWithUnsignedInt: aValue]; } return [self numberWithUnsignedLongLong: aValue]; } - (id) initWithBytes: (const void *) value objCType: (const char *)type { switch (type[0]) { case 'c': return [self initWithInteger: *(signed char *) value]; case 'C': return [self initWithInteger: *(unsigned char *) value]; case 's': return [self initWithInteger: *(short *) value]; case 'S': return [self initWithInteger: *(unsigned short *) value]; case 'i': return [self initWithInteger: *(int *) value]; case 'I': return [self initWithInteger: *(unsigned int *) value]; case 'l': return [self initWithLong: *(long *) value]; case 'L': return [self initWithUnsignedLong: *(unsigned long *) value]; case 'q': return [self initWithLongLong: *(long long *) value]; case 'Q': return [self initWithUnsignedLongLong: *(unsigned long long *) value]; case 'f': return [self initWithFloat: *(float *) value]; case 'd': return [self initWithDouble: *(double *) value]; } return [super initWithBytes: value objCType: type]; } - (void *) pointerValue { return (void *)[self unsignedIntegerValue]; } - (id) replacementObjectForPortCoder: (NSPortCoder *) encoder { return self; } - (Class) classForCoder { return NSNumberClass; } - (void) encodeWithCoder: (NSCoder *) coder { const char *type = [self objCType]; unsigned char charbuf; unsigned short shortbuf; unsigned int intbuf; unsigned long longbuf; unsigned long long llongbuf; float floatbuf; double doublebuf; void *buffer; [coder encodeValueOfObjCType: @encode(char) at: type]; switch (type[0]) { case 'c': case 'C': buffer = &charbuf; break; case 's': case 'S': buffer = &shortbuf; break; case 'i': case 'I': buffer = &intbuf; break; case 'l': case 'L': buffer = &longbuf; break; case 'q': case 'Q': buffer = &llongbuf; break; case 'f': buffer = &floatbuf; break; case 'd': buffer = &doublebuf; break; default: [NSException raise: NSInternalInconsistencyException format: @"unknown NSNumber type '%s'", type]; return; // Avoid spurious compiler warning. } [self getValue: buffer]; [coder encodeValueOfObjCType: type at: buffer]; } - (id) copyWithZone: (NSZone *) aZone { // OSX just returns the receive with no copy. return RETAIN (self); } - (id) initWithCoder: (NSCoder *) coder { char type[2] = { 0 }; unsigned char charbuf; unsigned short shortbuf; unsigned int intbuf; unsigned long longbuf; unsigned long long llongbuf; float floatbuf; double doublebuf; void *buffer; [coder decodeValueOfObjCType: @encode(char) at: type]; switch (type[0]) { case 'c': case 'C': buffer = &charbuf; break; case 's': case 'S': buffer = &shortbuf; break; case 'i': case 'I': buffer = &intbuf; break; case 'l': case 'L': buffer = &longbuf; break; case 'q': case 'Q': buffer = &llongbuf; break; case 'f': buffer = &floatbuf; break; case 'd': buffer = &doublebuf; break; default: [NSException raise: NSInternalInconsistencyException format: @"unknown NSNumber type '%c'", type[0]]; return nil; // Avoid spurious compiler warning. } [coder decodeValueOfObjCType: type at: buffer]; return [self initWithBytes: buffer objCType: type]; } - (NSString *) description { return [self stringValue]; } /* Return nil for an NSNumber that is allocated and initialized without * providing a real value. Yes, this seems weird, but it is actually what * happens on OS X. */ - (id) init { if (object_getClass(self) != NSNumberClass) { return [super init]; } DESTROY(self); return nil; } /* Stop the compiler complaining about unimplemented methods. Throwing an * exception here matches OS X behaviour, although they throw an invalid * argument exception. */ #define INTEGER_MACRO(encoding, type, name, ignored) \ - (type) name ## Value\ {\ [self subclassResponsibility: _cmd];\ return (type)0;\ } #include "GSNumberTypes.h" - (BOOL) boolValue { [self subclassResponsibility: _cmd]; return NO; } - (NSDecimal) decimalValue { NSDecimalNumber *dn; NSDecimal decimal; dn = [[NSDecimalNumber alloc] initWithString: [self stringValue]]; decimal = [dn decimalValue]; [dn release]; return decimal; } @end gnustep-base-1.29.0/Source/NSNumberFormatter.m000066400000000000000000001615371435650067400212220ustar00rootroot00000000000000/** NSNumberFormatter class Copyright (C) 2000 Free Software Foundation, Inc. Written by: Fred Kiefer Created: July 2000 Updated by: Richard Frith-Macdonald Sept 2001 This file is part of the GNUstep Base Library. 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 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 USA. NSNumberFormatter class reference $Date$ $Revision$ */ /* Unfortunately, libicu does not define the maximum values allowed for all of these attributes. We define them here to, though. These are based off libicu version 4.6. */ #define MAX_SYMBOLS 27 #define MAX_TEXTATTRIBUTES 8 #define MAX_ATTRIBUTES 20 #define GS_NSNumberFormatter_IVARS \ NSUInteger _behavior; \ BOOL _genDecimal; \ NSUInteger _style; \ NSLocale *_locale; \ void *_formatter; \ id _symbols[MAX_SYMBOLS]; \ id _textAttributes[MAX_TEXTATTRIBUTES]; \ int _attributes[MAX_ATTRIBUTES] #import "common.h" #define EXPOSE_NSNumberFormatter_IVARS 1 #import "Foundation/NSAttributedString.h" #import "Foundation/NSDecimalNumber.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSError.h" #import "Foundation/NSException.h" #import "Foundation/NSLocale.h" #import "Foundation/NSMapTable.h" #import "Foundation/NSValue.h" #import "Foundation/NSNumberFormatter.h" #import "Foundation/NSUserDefaults.h" #import "Foundation/NSCharacterSet.h" #import "GNUstepBase/GSLocale.h" @class NSDoubleNumber; #if defined(HAVE_UNICODE_UNUM_H) # include #endif #if defined(HAVE_ICU_H) # include #endif #define BUFFER_SIZE 1024 #if GS_USE_ICU == 1 static inline UNumberFormatStyle NSToICUFormatStyle (NSNumberFormatterStyle style) { UNumberFormatStyle result; switch (style) { case NSNumberFormatterDecimalStyle: result = UNUM_DECIMAL; break; case NSNumberFormatterCurrencyStyle: result = UNUM_CURRENCY; break; case NSNumberFormatterPercentStyle: result = UNUM_PERCENT; break; case NSNumberFormatterScientificStyle: result = UNUM_SCIENTIFIC; break; case NSNumberFormatterSpellOutStyle: result = UNUM_SPELLOUT; break; case NSNumberFormatterNoStyle: default: result = UNUM_IGNORE; } return result; } static inline UNumberFormatPadPosition NSToICUPadPosition (NSNumberFormatterPadPosition position) { UNumberFormatPadPosition result = 0; switch (position) { case NSNumberFormatterPadBeforePrefix: result = UNUM_PAD_BEFORE_PREFIX; break; case NSNumberFormatterPadAfterPrefix: result = UNUM_PAD_AFTER_PREFIX; break; case NSNumberFormatterPadBeforeSuffix: result = UNUM_PAD_BEFORE_SUFFIX; break; case NSNumberFormatterPadAfterSuffix: result = UNUM_PAD_AFTER_SUFFIX; break; } return result; } static inline NSNumberFormatterPadPosition ICUToNSPadPosition (UNumberFormatPadPosition position) { NSNumberFormatterPadPosition result = 0; switch (position) { case UNUM_PAD_BEFORE_PREFIX: result = NSNumberFormatterPadBeforePrefix; break; case UNUM_PAD_AFTER_PREFIX: result = NSNumberFormatterPadAfterPrefix; break; case UNUM_PAD_BEFORE_SUFFIX: result = NSNumberFormatterPadBeforeSuffix; break; case UNUM_PAD_AFTER_SUFFIX: result = NSNumberFormatterPadAfterSuffix; break; } return result; } static inline UNumberFormatRoundingMode NSToICURoundingMode (NSNumberFormatterRoundingMode mode) { UNumberFormatRoundingMode result = 0; switch (mode) { case NSNumberFormatterRoundCeiling: result = UNUM_ROUND_CEILING; break; case NSNumberFormatterRoundFloor: result = UNUM_ROUND_FLOOR; break; case NSNumberFormatterRoundDown: result = UNUM_ROUND_DOWN; break; case NSNumberFormatterRoundUp: result = UNUM_ROUND_UP; break; case NSNumberFormatterRoundHalfEven: result = UNUM_ROUND_HALFEVEN; break; case NSNumberFormatterRoundHalfDown: result = UNUM_ROUND_HALFDOWN; break; case NSNumberFormatterRoundHalfUp: result = UNUM_ROUND_HALFUP; break; } return result; } static inline NSNumberFormatterRoundingMode ICUToNSRoundingMode (UNumberFormatRoundingMode mode) { NSNumberFormatterRoundingMode result = 0; switch (mode) { case UNUM_ROUND_CEILING: result = NSNumberFormatterRoundCeiling; break; case UNUM_ROUND_FLOOR: result = NSNumberFormatterRoundFloor; break; case UNUM_ROUND_DOWN: result = NSNumberFormatterRoundDown; break; case UNUM_ROUND_UP: result = NSNumberFormatterRoundUp; break; case UNUM_ROUND_HALFEVEN: result = NSNumberFormatterRoundHalfEven; break; case UNUM_ROUND_HALFDOWN: result = NSNumberFormatterRoundHalfDown; break; case UNUM_ROUND_HALFUP: result = NSNumberFormatterRoundHalfUp; break; default: result = NSNumberFormatterRoundHalfUp; } return result; } #else /* Define fake ICU constants so we can use them when ICU is not available. */ #define NSToICUFormatStyle(X) X #define NSToICUPadPosition(X) X #define ICUToNSPadPosition(X) X #define NSToICURoundingMode(X) X #define ICUToNSRoundingMode(X) X #define UNUM_CURRENCY_CODE 0 #define UNUM_CURRENCY_SYMBOL 0 #define UNUM_DECIMAL_ALWAYS_SHOWN 0 #define UNUM_DECIMAL_SEPARATOR_SYMBOL 0 #define UNUM_EXPONENTIAL_SYMBOL 0 #define UNUM_FORMAT_WIDTH 0 #define UNUM_GROUPING_SEPARATOR_SYMBOL 0 #define UNUM_GROUPING_SIZE 0 #define UNUM_GROUPING_USED 0 #define UNUM_INFINITY_SYMBOL 0 #define UNUM_INTL_CURRENCY_SYMBOL 0 #define UNUM_LENIENT_PARSE 0 #define UNUM_MAX_FRACTION_DIGITS 0 #define UNUM_MAX_INTEGER_DIGITS 0 #define UNUM_MAX_SIGNIFICANT_DIGITS 0 #define UNUM_MIN_FRACTION_DIGITS 0 #define UNUM_MIN_INTEGER_DIGITS 0 #define UNUM_MIN_SIGNIFICANT_DIGITS 0 #define UNUM_MINUS_SIGN_SYMBOL 0 #define UNUM_MONETARY_GROUPING_SEPARATOR_SYMBOL 0 #define UNUM_MONETARY_SEPARATOR_SYMBOL 0 #define UNUM_MULTIPLIER 0 #define UNUM_NAN_SYMBOL 0 #define UNUM_NEGATIVE_PREFIX 0 #define UNUM_NEGATIVE_SUFFIX 0 #define UNUM_PADDING_CHARACTER 0 #define UNUM_PADDING_POSITION 0 #define UNUM_PERCENT_SYMBOL 0 #define UNUM_PERMILL_SYMBOL 0 #define UNUM_PLUS_SIGN_SYMBOL 0 #define UNUM_POSITIVE_PREFIX 0 #define UNUM_POSITIVE_SUFFIX 0 #define UNUM_ROUNDING_MODE 0 #define UNUM_SECONDARY_GROUPING_SIZE 0 #define UNUM_SIGNIFICANT_DIGITS_USED 0 #define UNUM_ZERO_DIGIT_SYMBOL 0 #endif #define GSInternal NSNumberFormatterInternal #include "GSInternal.h" GS_PRIVATE_INTERNAL(NSNumberFormatter) #if GS_NONFRAGILE @interface NSNumberFormatter (Internal) #else @interface NSNumberFormatterInternal (Methods) #endif - (int32_t) attributeForKey: (int)key; - (NSString*) symbolForKey: (int)key; - (NSString*) textAttributeForKey: (int)key; - (void) setAttribute: (int32_t)value forKey: (int)key; - (void) setSymbol: (NSString*)value forKey: (int)key; - (void) setTextAttribute: (NSString*)value forKey: (int)key; @end #if GS_NONFRAGILE @implementation NSNumberFormatter (Internal) #else @implementation NSNumberFormatterInternal (Methods) #endif - (int32_t) attributeForKey: (int)key { NSAssert(key >= 0 && key < sizeof(_attributes) / sizeof(*_attributes), NSInvalidArgumentException); #if GS_USE_ICU == 1 if (_attributes[key] <= 0) { _attributes[key] = unum_getAttribute (_formatter, key); } #endif return _attributes[key]; } - (BOOL) boolForKey: (int)key { NSAssert(key >= 0 && key < sizeof(_attributes) / sizeof(*_attributes), NSInvalidArgumentException); #if GS_USE_ICU == 1 if (0 == _attributes[key]) { _attributes[key] = (1 == unum_getAttribute (_formatter, key)) ? 2 : 1; } #endif if (2 == _attributes[key]) { return YES; } return NO; } - (NSString*) symbolForKey: (int)key { #if GS_USE_ICU == 1 UChar buffer[BUFFER_SIZE]; int32_t length; UErrorCode err = U_ZERO_ERROR; NSAssert(key >= 0 && key < sizeof(_symbols) / sizeof(*_symbols), NSInvalidArgumentException); length = unum_getSymbol(_formatter, key, buffer, BUFFER_SIZE, &err); if (length > BUFFER_SIZE) length = BUFFER_SIZE; return [NSString stringWithCharacters: buffer length: length]; #else return nil; #endif } - (NSString*) textAttributeForKey: (int)key { #if GS_USE_ICU == 1 UChar buffer[BUFFER_SIZE]; int32_t length; UErrorCode err = U_ZERO_ERROR; NSAssert(key >= 0 && key < sizeof(_textAttributes) / sizeof(*_textAttributes), NSInvalidArgumentException); length = unum_getTextAttribute(_formatter, key, buffer, BUFFER_SIZE, &err); if (length > BUFFER_SIZE) length = BUFFER_SIZE; return [NSString stringWithCharacters: buffer length: length]; #else return nil; #endif } - (void) setAttribute: (int32_t)value forKey: (int)key { NSAssert(key >= 0 && key < sizeof(_attributes) / sizeof(*_attributes), NSInvalidArgumentException); #if GS_USE_ICU == 1 if (value < 0) value = -1; _attributes[key] = value; unum_setAttribute (_formatter, key, value); #endif return; } - (void) setBool: (BOOL)value forKey: (int)key { NSAssert(key >= 0 && key < sizeof(_symbols) / sizeof(*_symbols), NSInvalidArgumentException); #if GS_USE_ICU == 1 _attributes[key] = (value ? 2 : 1); unum_setAttribute (_formatter, key, (int32_t)(value ? 1 : 0)); #endif return; } - (void) setSymbol: (NSString*)value forKey: (int)key { #if GS_USE_ICU == 1 unichar buffer[BUFFER_SIZE]; NSUInteger length; UErrorCode err = U_ZERO_ERROR; NSAssert(key >= 0 && key < sizeof(_symbols) / sizeof(*_symbols), NSInvalidArgumentException); ASSIGNCOPY(_symbols[key], value); length = [value length]; if (length > BUFFER_SIZE) length = BUFFER_SIZE; [value getCharacters: buffer range: NSMakeRange (0, length)]; unum_setSymbol (_formatter, key, buffer, length, &err); #endif return; } - (void) setTextAttribute: (NSString*)value forKey: (int)key { #if GS_USE_ICU == 1 unichar buffer[BUFFER_SIZE]; NSUInteger length; UErrorCode err = U_ZERO_ERROR; NSAssert(key >= 0 && key < sizeof(_textAttributes) / sizeof(*_textAttributes), NSInvalidArgumentException); ASSIGNCOPY(_textAttributes[key], value); length = [value length]; if (length > BUFFER_SIZE) length = BUFFER_SIZE; [value getCharacters: buffer range: NSMakeRange (0, length)]; unum_setTextAttribute (_formatter, key, buffer, length, &err); #endif return; } @end @interface NSNumberFormatter (PrivateMethods) - (void) _resetUNumberFormat; @end @implementation NSNumberFormatter #if GS_USE_ICU == 1 #define MYBEHAVIOR internal->_behavior #else #define MYBEHAVIOR NSNumberFormatterBehavior10_0 #endif static NSUInteger _defaultBehavior = NSNumberFormatterBehavior10_4; - (BOOL) allowsFloats { return _allowsFloats; } - (NSAttributedString*) attributedStringForObjectValue: (id)anObject withDefaultAttributes: (NSDictionary*)attr { NSString *stringForObjectValue; NSDecimalNumber *zeroNumber = [NSDecimalNumber zero]; NSDecimalNumber *nanNumber = [NSDecimalNumber notANumber]; if (anObject == nil) { return [self attributedStringForNil]; } else if (![anObject isKindOfClass: [NSNumber class]]) { return [self attributedStringForNotANumber]; } else if ([anObject isEqual: nanNumber]) { return [self attributedStringForNotANumber]; } else if ([anObject isEqual: zeroNumber]) { return [self attributedStringForZero]; } if (([(NSNumber*)anObject compare: zeroNumber] == NSOrderedDescending) && (_attributesForPositiveValues)) { attr = _attributesForPositiveValues; } else if (([(NSNumber*)anObject compare: zeroNumber] == NSOrderedAscending) && (_attributesForNegativeValues)) { attr = _attributesForNegativeValues; } stringForObjectValue = [self stringForObjectValue: anObject]; if (stringForObjectValue == nil) { stringForObjectValue = @""; } return AUTORELEASE([[NSAttributedString alloc] initWithString: stringForObjectValue attributes: attr]); } - (NSAttributedString*) attributedStringForNil { return _attributedStringForNil; } - (NSAttributedString*) attributedStringForNotANumber { return _attributedStringForNotANumber; } - (NSAttributedString*) attributedStringForZero { return _attributedStringForZero; } - (id) copyWithZone: (NSZone *)zone { NSNumberFormatter *o = (NSNumberFormatter*) NSCopyObject(self, 0, zone); IF_NO_ARC(RETAIN(o->_negativeFormat);) IF_NO_ARC(RETAIN(o->_positiveFormat);) IF_NO_ARC(RETAIN(o->_attributesForPositiveValues);) IF_NO_ARC(RETAIN(o->_attributesForNegativeValues);) IF_NO_ARC(RETAIN(o->_maximum);) IF_NO_ARC(RETAIN(o->_minimum);) IF_NO_ARC(RETAIN(o->_roundingBehavior);) IF_NO_ARC(RETAIN(o->_attributedStringForNil);) IF_NO_ARC(RETAIN(o->_attributedStringForNotANumber);) IF_NO_ARC(RETAIN(o->_attributedStringForZero);) if (0 != internal) { int idx; GS_COPY_INTERNAL(o, zone) IF_NO_ARC( [GSIVar(o,_locale) retain]; for (idx = 0; idx < MAX_SYMBOLS; ++idx) { [GSIVar(o,_symbols)[idx] retain]; } for (idx = 0; idx < MAX_TEXTATTRIBUTES; ++idx) { [GSIVar(o,_textAttributes)[idx] retain]; } ) #if GS_USE_ICU == 1 { UErrorCode err = U_ZERO_ERROR; GSIVar(o,_formatter) = unum_clone (internal->_formatter, &err); } #endif } return o; } - (void) dealloc { RELEASE(_negativeFormat); RELEASE(_positiveFormat); RELEASE(_attributesForPositiveValues); RELEASE(_attributesForNegativeValues); RELEASE(_maximum); RELEASE(_minimum); RELEASE(_roundingBehavior); RELEASE(_attributedStringForNil); RELEASE(_attributedStringForNotANumber); RELEASE(_attributedStringForZero); if (internal != 0) { int idx; RELEASE(internal->_locale); #if GS_USE_ICU == 1 unum_close (internal->_formatter); #endif for (idx = 0; idx < MAX_SYMBOLS; ++idx) { [internal->_symbols[idx] release]; } for (idx = 0; idx < MAX_TEXTATTRIBUTES; ++idx) { [internal->_textAttributes[idx] release]; } GS_DESTROY_INTERNAL(NSNumberFormatter) } [super dealloc]; } - (NSString*) decimalSeparator { if (MYBEHAVIOR == NSNumberFormatterBehavior10_4 || MYBEHAVIOR == NSNumberFormatterBehaviorDefault) { return [internal symbolForKey: UNUM_DECIMAL_SEPARATOR_SYMBOL]; } else if (MYBEHAVIOR == NSNumberFormatterBehavior10_0) { if (_decimalSeparator == 0) return @""; else return [NSString stringWithCharacters: &_decimalSeparator length: 1]; } return nil; } - (NSString*) editingStringForObjectValue: (id)anObject { return [self stringForObjectValue: anObject]; } - (void) encodeWithCoder: (NSCoder*)encoder { [encoder encodeValueOfObjCType: @encode(BOOL) at: &_hasThousandSeparators]; [encoder encodeValueOfObjCType: @encode(BOOL) at: &_allowsFloats]; [encoder encodeValueOfObjCType: @encode(BOOL) at: &_localizesFormat]; [encoder encodeValueOfObjCType: @encode(unichar) at: &_thousandSeparator]; [encoder encodeValueOfObjCType: @encode(unichar) at: &_decimalSeparator]; [encoder encodeObject: _roundingBehavior]; [encoder encodeObject: _maximum]; [encoder encodeObject: _minimum]; [encoder encodeObject: _attributedStringForNil]; [encoder encodeObject: _attributedStringForNotANumber]; [encoder encodeObject: _attributedStringForZero]; [encoder encodeObject: _negativeFormat]; [encoder encodeObject: _positiveFormat]; [encoder encodeObject: _attributesForPositiveValues]; [encoder encodeObject: _attributesForNegativeValues]; // FIXME: Add new ivars } - (NSString*) format { if (_attributedStringForZero != nil) { return [NSString stringWithFormat: @"%@;%@;%@", _positiveFormat, [_attributedStringForZero string], _negativeFormat]; } else { return [NSString stringWithFormat: @"%@;%@", _positiveFormat, _negativeFormat]; } } - (BOOL) getObjectValue: (id*)anObject forString: (NSString*)string errorDescription: (NSString**)error { if (MYBEHAVIOR == NSNumberFormatterBehavior10_4 || MYBEHAVIOR == NSNumberFormatterBehaviorDefault) { BOOL result; NSRange range = NSMakeRange (0, [string length]); NSError *outError = nil; result = [self getObjectValue: anObject forString: string range: &range error: &outError]; if (!result && error) *error = [outError localizedDescription]; return result; } else if (MYBEHAVIOR == NSNumberFormatterBehavior10_0) { /* FIXME: This is just a quick hack implementation. */ NSLog(@"NSNumberFormatter-getObjectValue:forString:... not fully implemented"); if (nil == string) { if (0 != error) { *error = _(@"nil string"); } return NO; } if (NO == [self allowsFloats] && [string rangeOfString: @"."].length > 0) { if (0 != error) { *error = _(@"Floating Point not allowed"); } return NO; } /* Just assume nothing else has been setup and do a simple conversion. */ if ([self hasThousandSeparators]) { NSRange range; range = [string rangeOfString: [self thousandSeparator]]; if (range.length != 0) { string = AUTORELEASE([string mutableCopy]); [(NSMutableString*)string replaceOccurrencesOfString: [self thousandSeparator] withString: @"" options: 0 range: NSMakeRange(0, [string length])]; } } if (anObject) { NSDictionary *locale; locale = [NSDictionary dictionaryWithObject: [self decimalSeparator] forKey: NSDecimalSeparator]; *anObject = [NSDecimalNumber decimalNumberWithString: string locale: locale]; if (*anObject) { return YES; } } } return NO; } - (BOOL) hasThousandSeparators { return _hasThousandSeparators; } - (id) init { id o; int idx; GS_CREATE_INTERNAL(NSNumberFormatter) _allowsFloats = YES; _decimalSeparator = '.'; _thousandSeparator = ','; _hasThousandSeparators = YES; o = [[NSAttributedString alloc] initWithString: @""]; [self setAttributedStringForNil: o]; RELEASE(o); o = [[NSAttributedString alloc] initWithString: @"NaN"]; [self setAttributedStringForNotANumber: o]; RELEASE(o); internal->_behavior = _defaultBehavior; internal->_locale = RETAIN([NSLocale currentLocale]); internal->_style = NSNumberFormatterNoStyle; /* Set all attributes to -1 before resetting the formatter. When * resetting them only values < 0 will be skipped. */ for (idx = 0; idx < MAX_ATTRIBUTES; ++idx) internal->_attributes[idx] = -1; [self _resetUNumberFormat]; #if GS_USE_ICU == 1 if (internal->_formatter == NULL) { RELEASE(self); return nil; } #endif [self setMaximumFractionDigits: 0]; return self; } - (id) initWithCoder: (NSCoder*)decoder { /* We can call our -init method to set up default values, then * override settings with information from the archive. */ if (nil == (self = [self init])) { [NSException raise: NSInternalInconsistencyException format: @"Failed to initialise number formatter"]; } if ([decoder allowsKeyedCoding]) { if ([decoder containsValueForKey: @"NS.allowsfloats"]) { [self setAllowsFloats: [decoder decodeBoolForKey: @"NS.allowsfloats"]]; } if ([decoder containsValueForKey: @"NS.decimal"]) { [self setDecimalSeparator: [decoder decodeObjectForKey: @"NS.decimal"]]; } if ([decoder containsValueForKey: @"NS.hasthousands"]) { [self setHasThousandSeparators: [decoder decodeBoolForKey: @"NS.hasthousands"]]; } if ([decoder containsValueForKey: @"NS.localized"]) { [self setLocalizesFormat: [decoder decodeBoolForKey: @"NS.localized"]]; } if ([decoder containsValueForKey: @"NS.max"]) { [self setMaximum: [decoder decodeObjectForKey: @"NS.max"]]; } if ([decoder containsValueForKey: @"NS.min"]) { [self setMinimum: [decoder decodeObjectForKey: @"NS.min"]]; } if ([decoder containsValueForKey: @"NS.nan"]) { [self setAttributedStringForNotANumber: [decoder decodeObjectForKey: @"NS.nan"]]; } if ([decoder containsValueForKey: @"NS.negativeattrs"]) { [self setTextAttributesForNegativeValues: [decoder decodeObjectForKey: @"NS.negativeattrs"]]; } if ([decoder containsValueForKey: @"NS.negativeformat"]) { [self setNegativeFormat: [decoder decodeObjectForKey: @"NS.negativeformat"]]; } if ([decoder containsValueForKey: @"NS.nil"]) { [self setAttributedStringForNil: [decoder decodeObjectForKey: @"NS.nil"]]; } if ([decoder containsValueForKey: @"NS.positiveattrs"]) { [self setTextAttributesForPositiveValues: [decoder decodeObjectForKey: @"NS.positiveattrs"]]; } if ([decoder containsValueForKey: @"NS.positiveformat"]) { [self setPositiveFormat: [decoder decodeObjectForKey: @"NS.positiveformat"]]; } if ([decoder containsValueForKey: @"NS.rounding"]) { [self setRoundingBehavior: [decoder decodeObjectForKey: @"NS.rounding"]]; } if ([decoder containsValueForKey: @"NS.thousand"]) { [self setThousandSeparator: [decoder decodeObjectForKey: @"NS.thousand"]]; } if ([decoder containsValueForKey: @"NS.zero"]) { [self setAttributedStringForZero: [decoder decodeObjectForKey: @"NS.zero"]]; } } else { [decoder decodeValueOfObjCType: @encode(BOOL) at: &_hasThousandSeparators]; [decoder decodeValueOfObjCType: @encode(BOOL) at: &_allowsFloats]; [decoder decodeValueOfObjCType: @encode(BOOL) at: &_localizesFormat]; [decoder decodeValueOfObjCType: @encode(unichar) at: &_thousandSeparator]; [decoder decodeValueOfObjCType: @encode(unichar) at: &_decimalSeparator]; [decoder decodeValueOfObjCType: @encode(id) at: &_roundingBehavior]; [decoder decodeValueOfObjCType: @encode(id) at: &_maximum]; [decoder decodeValueOfObjCType: @encode(id) at: &_minimum]; [decoder decodeValueOfObjCType: @encode(id) at: &_attributedStringForNil]; [decoder decodeValueOfObjCType: @encode(id) at: &_attributedStringForNotANumber]; [decoder decodeValueOfObjCType: @encode(id) at: &_attributedStringForZero]; [decoder decodeValueOfObjCType: @encode(id) at: &_negativeFormat]; [decoder decodeValueOfObjCType: @encode(id) at: &_positiveFormat]; [decoder decodeValueOfObjCType: @encode(id) at: &_attributesForPositiveValues]; [decoder decodeValueOfObjCType: @encode(id) at: &_attributesForNegativeValues]; // FIXME: add new ivars } return self; } - (BOOL) isPartialStringValid: (NSString*)partialString newEditingString: (NSString**)newString errorDescription: (NSString**)error { // FIXME if (newString != NULL) { *newString = partialString; } if (error) { *error = nil; } return YES; } - (BOOL) localizesFormat { return _localizesFormat; } - (NSDecimalNumber*) maximum { return _maximum; } - (NSDecimalNumber*) minimum { return _minimum; } - (NSString*) negativeFormat { return _negativeFormat; } - (NSString*) positiveFormat { return _positiveFormat; } - (NSDecimalNumberHandler*) roundingBehavior { return _roundingBehavior; } - (void) setAllowsFloats: (BOOL)flag { _allowsFloats = flag; } - (void) setAttributedStringForNil: (NSAttributedString*)newAttributedString { ASSIGN(_attributedStringForNil, newAttributedString); } - (void) setAttributedStringForNotANumber: (NSAttributedString*)newAttributedString { ASSIGN(_attributedStringForNotANumber, newAttributedString); } - (void) setAttributedStringForZero: (NSAttributedString*)newAttributedString { ASSIGN(_attributedStringForZero, newAttributedString); } - (void) setDecimalSeparator: (NSString*)newSeparator { if (MYBEHAVIOR == NSNumberFormatterBehavior10_4 || MYBEHAVIOR == NSNumberFormatterBehaviorDefault) { [internal setSymbol: newSeparator forKey: UNUM_DECIMAL_SEPARATOR_SYMBOL]; } else if (MYBEHAVIOR == NSNumberFormatterBehavior10_0) { if ([newSeparator length] > 0) _decimalSeparator = [newSeparator characterAtIndex: 0]; else _decimalSeparator = 0; } } - (void) setFormat: (NSString*)aFormat { NSRange r; r = [aFormat rangeOfString: @";"]; if (r.length == 0) { [self setPositiveFormat: aFormat]; [self setNegativeFormat: [@"-" stringByAppendingString: aFormat]]; } else { [self setPositiveFormat: [aFormat substringToIndex: r.location]]; aFormat = [aFormat substringFromIndex: NSMaxRange(r)]; r = [aFormat rangeOfString: @";"]; if (r.length == 0) { [self setNegativeFormat: aFormat]; } else { RELEASE(_attributedStringForZero); _attributedStringForZero = [[NSAttributedString alloc] initWithString: [aFormat substringToIndex: r.location]]; [self setNegativeFormat: [aFormat substringFromIndex: NSMaxRange(r)]]; } } } - (void) setHasThousandSeparators: (BOOL)flag { _hasThousandSeparators = flag; } - (void) setLocalizesFormat: (BOOL)flag { _localizesFormat = flag; } - (void) setMaximum: (NSDecimalNumber*)aMaximum { // FIXME: NSNumberFormatterBehavior10_4 ASSIGN(_maximum, aMaximum); } - (void) setMinimum: (NSDecimalNumber*)aMinimum { // FIXME: NSNumberFormatterBehavior10_4 ASSIGN(_minimum, aMinimum); } - (void) setNegativeFormat: (NSString*)aFormat { // FIXME: Should extract separators and attributes ASSIGN(_negativeFormat, aFormat); } - (void) setPositiveFormat: (NSString*)aFormat { // FIXME: Should extract separators and attributes ASSIGN(_positiveFormat, aFormat); } - (void) setRoundingBehavior: (NSDecimalNumberHandler*)newRoundingBehavior { ASSIGN(_roundingBehavior, newRoundingBehavior); } - (void) setTextAttributesForNegativeValues: (NSDictionary*)newAttributes { ASSIGN(_attributesForNegativeValues, newAttributes); } - (void) setTextAttributesForPositiveValues: (NSDictionary*)newAttributes { ASSIGN(_attributesForPositiveValues, newAttributes); } - (void) setThousandSeparator: (NSString*)newSeparator { if ([newSeparator length] > 0) _thousandSeparator = [newSeparator characterAtIndex: 0]; else _thousandSeparator = 0; } - (NSString*) stringForObjectValue: (id)anObject { if (MYBEHAVIOR == NSNumberFormatterBehaviorDefault || MYBEHAVIOR == NSNumberFormatterBehavior10_4) { #if GS_USE_ICU == 1 #define STRING_FROM_NUMBER(function, number) do \ { \ UErrorCode err = U_ZERO_ERROR; \ int32_t len; \ NSString *result; \ \ len = function (internal->_formatter, number, buffer, \ BUFFER_SIZE, NULL, &err); \ if (len > BUFFER_SIZE) \ len = BUFFER_SIZE; \ result = [NSString stringWithCharacters: buffer length: len]; \ return result; \ } while (0) /* This is quite inefficient. See the GSUText stuff for how * to use ICU 4.6 UText objects as NSStrings. This saves us from * needing to do a load of O(n) things. In 4.6, these APIs in ICU * haven't been updated to use UText (so we have to use the UChar buffer * approach), but they probably will be in the future. We should * revisit this code when they have been. */ UChar buffer[BUFFER_SIZE]; /* FIXME: What to do with unsigned types? * * The only unsigned case we actually need to worry about is unsigned * long long - all of the others are stored as signed values. We're now * falling through to the double case for this, which will lose us some * precision, but hopefully not matter too much... */ if (nil == anObject) return [self nilSymbol]; if (![anObject isKindOfClass: [NSNumber class]]) return [self notANumberSymbol]; switch ([anObject objCType][0]) { case _C_LNG_LNG: STRING_FROM_NUMBER(unum_formatInt64, [anObject longLongValue]); break; case _C_INT: STRING_FROM_NUMBER(unum_format, [anObject intValue]); break; /* Note: This case is probably wrong: the compiler doesn't generate B * for bool, it generates C or c (depending on the platform). I * don't think it matters, because we don't bother with anything * smaller than int for NSNumbers */ #if defined(_C_BOOL) && (!defined(__GNUC__) || __GNUC__ > 2) case _C_BOOL: STRING_FROM_NUMBER(unum_format, (int)[anObject boolValue]); break; #endif /* If it's not a type encoding that we recognise, let the receiver * cast it to a double, which probably has enough precision for what * we need. This needs testing with NSDecimalNumber though, because * I managed to break stuff last time I did anything with NSNumber by * forgetting that NSDecimalNumber existed... */ default: case _C_DBL: STRING_FROM_NUMBER(unum_formatDouble, [anObject doubleValue]); break; case _C_FLT: STRING_FROM_NUMBER(unum_formatDouble, (double)[anObject floatValue]); break; } #endif } else if (MYBEHAVIOR == NSNumberFormatterBehavior10_0) { NSMutableDictionary *locale; NSCharacterSet *formattingCharacters; NSCharacterSet *placeHolders; NSString *prefix; NSString *suffix; NSString *wholeString; NSString *fracPad = nil; NSString *fracPartString; NSMutableString *intPartString; NSMutableString *formattedNumber; NSMutableString *intPad; NSRange prefixRange; NSRange decimalPlaceRange; NSRange suffixRange; NSRange intPartRange; NSDecimal representativeDecimal; NSDecimal roundedDecimal; NSDecimalNumber *roundedNumber; NSDecimalNumber *intPart; NSDecimalNumber *fracPart; int decimalPlaces = 0; BOOL displayThousandsSeparators = NO; BOOL displayFractionalPart = NO; BOOL negativeNumber = NO; NSString *useFormat; NSString *defaultDecimalSeparator = nil; NSString *defaultThousandsSeparator = nil; if (_localizesFormat) { NSDictionary *defaultLocale = GSDomainFromDefaultLocale(); defaultDecimalSeparator = [defaultLocale objectForKey: NSDecimalSeparator]; defaultThousandsSeparator = [defaultLocale objectForKey: NSThousandsSeparator]; } if (defaultDecimalSeparator == nil) { defaultDecimalSeparator = @"."; } if (defaultThousandsSeparator == nil) { defaultThousandsSeparator = @","; } formattingCharacters = [NSCharacterSet characterSetWithCharactersInString: @"0123456789#.,_"]; placeHolders = [NSCharacterSet characterSetWithCharactersInString: @"0123456789#_"]; if (nil == anObject) return [[self attributedStringForNil] string]; if (![anObject isKindOfClass: [NSNumber class]]) return [[self attributedStringForNotANumber] string]; if ([anObject isEqual: [NSDecimalNumber notANumber]]) return [[self attributedStringForNotANumber] string]; if (_attributedStringForZero && [anObject isEqual: [NSDecimalNumber zero]]) return [[self attributedStringForZero] string]; useFormat = _positiveFormat; if ([(NSNumber*)anObject compare: [NSDecimalNumber zero]] == NSOrderedAscending) { useFormat = _negativeFormat; negativeNumber = YES; } // if no format specified, use the same default that Cocoa does if (nil == useFormat) { useFormat = [NSString stringWithFormat: @"%@#%@###%@##", negativeNumber ? @"-" : @"", defaultThousandsSeparator, defaultDecimalSeparator]; } prefixRange = [useFormat rangeOfCharacterFromSet: formattingCharacters]; if (NSNotFound != prefixRange.location) { prefix = [useFormat substringToIndex: prefixRange.location]; } else { prefix = @""; } locale = [NSMutableDictionary dictionaryWithCapacity: 3]; [locale setObject: @"" forKey: NSThousandsSeparator]; [locale setObject: @"" forKey: NSDecimalSeparator]; //should also set NSDecimalDigits? if ([self hasThousandSeparators] && (0 != [useFormat rangeOfString: defaultThousandsSeparator].length)) { displayThousandsSeparators = YES; } if (NSNotFound != [useFormat rangeOfString: defaultDecimalSeparator].location) { decimalPlaceRange = [useFormat rangeOfString: defaultDecimalSeparator options: NSBackwardsSearch]; if (NSMaxRange(decimalPlaceRange) == [useFormat length]) { decimalPlaces = 0; } else { while ([placeHolders characterIsMember: [useFormat characterAtIndex: NSMaxRange(decimalPlaceRange)]]) { decimalPlaceRange.length++; if (NSMaxRange(decimalPlaceRange) == [useFormat length]) break; } decimalPlaces=decimalPlaceRange.length -= 1; decimalPlaceRange.location += 1; fracPad = [useFormat substringWithRange:decimalPlaceRange]; } if (0 != decimalPlaces) displayFractionalPart = YES; } representativeDecimal = [anObject decimalValue]; NSDecimalRound(&roundedDecimal, &representativeDecimal, decimalPlaces, NSRoundPlain); roundedNumber = [NSDecimalNumber decimalNumberWithDecimal: roundedDecimal]; /* Arguably this fiddling could be done by GSDecimalString() but I * thought better to leave that behaviour as it is and provide the * desired prettification here */ if (negativeNumber) roundedNumber = [roundedNumber decimalNumberByMultiplyingBy: (NSDecimalNumber*)[NSDecimalNumber numberWithInt: -1]]; intPart = (NSDecimalNumber*) [NSDecimalNumber numberWithInt: (int)[roundedNumber doubleValue]]; fracPart = [roundedNumber decimalNumberBySubtracting: intPart]; intPartString = AUTORELEASE([[intPart descriptionWithLocale: locale] mutableCopy]); //sort out the padding for the integer part intPartRange = [useFormat rangeOfCharacterFromSet: placeHolders]; if (intPartRange.location != NSNotFound) { int nextFormatCharLoc = intPartRange.location; while (([placeHolders characterIsMember: [useFormat characterAtIndex: nextFormatCharLoc]] || [[useFormat substringWithRange: NSMakeRange(nextFormatCharLoc, 1)] isEqual: defaultThousandsSeparator]) && nextFormatCharLoc < [useFormat length] - 1) { intPartRange.length++; nextFormatCharLoc++; } } intPad = [[[useFormat substringWithRange: intPartRange] mutableCopy] autorelease]; [intPad replaceOccurrencesOfString: defaultThousandsSeparator withString: @"" options: 0 range: NSMakeRange(0, [intPad length])]; [intPad replaceOccurrencesOfString: @"#" withString: @"" options: NSAnchoredSearch range: NSMakeRange(0, [intPad length])]; if ([intPad length] > [intPartString length]) { NSRange ipRange; ipRange = NSMakeRange(0, [intPad length] - [intPartString length]); [intPartString insertString: [intPad substringWithRange: ipRange] atIndex: 0]; [intPartString replaceOccurrencesOfString: @"_" withString: @" " options: 0 range: NSMakeRange(0, [intPartString length])]; [intPartString replaceOccurrencesOfString: @"#" withString: @"0" options: 0 range: NSMakeRange(0, [intPartString length])]; } // fix the thousands separators up if (displayThousandsSeparators && [intPartString length] > 3) { int index = [intPartString length]; while (0 < (index -= 3)) { [intPartString insertString: [self thousandSeparator] atIndex: index]; } } formattedNumber = [intPartString mutableCopy]; //fix up the fractional part if (displayFractionalPart) { NSMutableString *ms; fracPart = [fracPart decimalNumberByMultiplyingByPowerOf10: decimalPlaces]; ms = [[fracPart descriptionWithLocale: locale] mutableCopy]; if ([fracPad length] > [ms length]) { NSRange fpRange; fpRange = NSMakeRange([ms length], ([fracPad length] - [ms length])); [ms insertString: [fracPad substringWithRange: fpRange] atIndex: 0]; [ms replaceOccurrencesOfString: @"#" withString: @"" options: (NSBackwardsSearch | NSAnchoredSearch) range: NSMakeRange(0, [ms length])]; [ms replaceOccurrencesOfString: @"#" withString: @"0" options: 0 range: NSMakeRange(0, [ms length])]; [ms replaceOccurrencesOfString: @"_" withString: @" " options: 0 range: NSMakeRange(0, [ms length])]; } [ms replaceOccurrencesOfString: @"0" withString: @"" options: (NSBackwardsSearch | NSAnchoredSearch) range: NSMakeRange(0, [ms length])]; fracPartString = AUTORELEASE(ms); [formattedNumber appendString: [self decimalSeparator]]; [formattedNumber appendString: fracPartString]; } /*FIXME - the suffix doesn't behave the same as on Mac OS X. * Our suffix is everything which follows the final formatting * character. Cocoa's suffix is everything which isn't a * formatting character nor in the prefix */ suffixRange = [useFormat rangeOfCharacterFromSet: formattingCharacters options: NSBackwardsSearch]; suffix = [useFormat substringFromIndex: NSMaxRange(suffixRange)]; wholeString = [[prefix stringByAppendingString: formattedNumber] stringByAppendingString: suffix]; [formattedNumber release]; return wholeString; } return nil; } - (NSDictionary*) textAttributesForNegativeValues { return _attributesForNegativeValues; } - (NSDictionary*) textAttributesForPositiveValues { return _attributesForPositiveValues; } - (NSString*) thousandSeparator { if (!_thousandSeparator) return @""; else return [NSString stringWithCharacters: &_thousandSeparator length: 1]; } - (NSString *) stringFromNumber: (NSNumber *)number { // This is a 10.4 and above method and should not work with earlier version. return [self stringForObjectValue: number]; } - (NSNumber *) numberFromString: (NSString *)string { // This is a 10.4 and above method and should not work with earlier version. #if GS_USE_ICU == 1 NSNumber *result; NSUInteger length; NSRange range; UErrorCode err = U_ZERO_ERROR; unichar *ustring; int64_t intNum; double doubleNum; if (string == nil) return nil; length = [string length]; ustring = NSZoneMalloc ([self zone], sizeof(unichar) * length); if (ustring == NULL) return nil; [string getCharacters: ustring range: NSMakeRange(0, length)]; // FIXME: Not sure if this is correct.... range = [string rangeOfString: @"."]; if (range.location == NSNotFound) { intNum = unum_parseInt64(internal->_formatter, ustring, length, NULL, &err); if (U_FAILURE(err)) return nil; if (intNum == 0 || intNum == 1) result = [NSNumber numberWithBool: (BOOL) intNum]; else if (intNum < INT_MAX && intNum > INT_MIN) result = [NSNumber numberWithInt: (int32_t)intNum]; else result = [NSNumber numberWithLongLong: intNum]; } else { doubleNum = unum_parseDouble(internal->_formatter, ustring, length, NULL, &err); if (U_FAILURE(err)) return nil; result = [NSNumber numberWithDouble: doubleNum]; } NSZoneFree ([self zone], ustring); return result; #else return nil; #endif } - (void) setFormatterBehavior: (NSNumberFormatterBehavior)behavior { if (NSNumberFormatterBehavior10_4 == behavior || NSNumberFormatterBehavior10_0 == behavior || NSNumberFormatterBehaviorDefault == behavior) { internal->_behavior = behavior; } } - (NSNumberFormatterBehavior)formatterBehavior { return internal->_behavior; } + (void) setDefaultFormatterBehavior: (NSNumberFormatterBehavior)behavior { if (NSNumberFormatterBehavior10_0 == behavior) { _defaultBehavior = behavior; } else if (NSNumberFormatterBehavior10_4 == behavior || NSNumberFormatterBehaviorDefault == behavior) { _defaultBehavior = NSNumberFormatterBehavior10_4; } else { _defaultBehavior = behavior; // Yeuch ... but OSX accepts any value } } + (NSNumberFormatterBehavior) defaultFormatterBehavior { return _defaultBehavior; } - (void) setNumberStyle: (NSNumberFormatterStyle) style { internal->_style = style; [self _resetUNumberFormat]; } - (NSNumberFormatterStyle) numberStyle { return internal->_style; } - (void) setGeneratesDecimalNumbers: (BOOL) flag { internal->_genDecimal = flag; } - (BOOL) generatesDecimalNumbers { return internal->_genDecimal; // FIXME } - (void) setLocale: (NSLocale *)locale { if (nil == locale) { locale = [NSLocale currentLocale]; } if (NO == [locale isEqual: internal->_locale]) { ASSIGN(internal->_locale, locale); [self _resetUNumberFormat]; } } - (NSLocale *) locale { return internal->_locale; } - (void) setRoundingIncrement: (NSNumber *) number { switch ([number objCType][0]) { case 'd': case 'f': #if GS_USE_ICU == 1 unum_setDoubleAttribute (internal->_formatter, UNUM_ROUNDING_INCREMENT, [number doubleValue]); #endif default: return; } } - (NSNumber *) roundingIncrement { #if GS_USE_ICU == 1 double value = unum_getDoubleAttribute (internal->_formatter, UNUM_ROUNDING_INCREMENT); return [NSNumber numberWithDouble: value]; #else return nil; #endif } - (void) setRoundingMode: (NSNumberFormatterRoundingMode) mode { [internal setAttribute: NSToICURoundingMode(mode) forKey: UNUM_ROUNDING_MODE]; } - (NSNumberFormatterRoundingMode) roundingMode { return ICUToNSRoundingMode([internal attributeForKey: UNUM_ROUNDING_MODE]); } - (void) setFormatWidth: (NSUInteger) number { [internal setAttribute: number forKey: UNUM_FORMAT_WIDTH]; } - (NSUInteger) formatWidth { return (NSUInteger)[internal attributeForKey: UNUM_FORMAT_WIDTH]; } - (void) setMultiplier: (NSNumber *) number { [internal setAttribute: [number intValue] forKey: UNUM_MULTIPLIER]; } - (NSNumber *) multiplier { return [NSNumber numberWithInt: [internal attributeForKey: UNUM_MULTIPLIER]]; } - (void) setPercentSymbol: (NSString *) string { [internal setSymbol: string forKey: UNUM_PERCENT_SYMBOL]; } - (NSString *) percentSymbol { return [internal symbolForKey: UNUM_PERCENT_SYMBOL]; } - (void) setPerMillSymbol: (NSString *) string { [internal setSymbol: string forKey: UNUM_PERMILL_SYMBOL]; } - (NSString *) perMillSymbol { return [internal symbolForKey: UNUM_PERMILL_SYMBOL]; } - (void) setMinusSign: (NSString *) string { [internal setSymbol: string forKey: UNUM_MINUS_SIGN_SYMBOL]; } - (NSString *) minusSign { return [internal symbolForKey: UNUM_MINUS_SIGN_SYMBOL]; } - (void) setPlusSign: (NSString *) string { [internal setSymbol: string forKey: UNUM_PLUS_SIGN_SYMBOL]; } - (NSString *) plusSign { return [internal symbolForKey: UNUM_PLUS_SIGN_SYMBOL]; } - (void) setExponentSymbol: (NSString *) string { [internal setSymbol: string forKey: UNUM_EXPONENTIAL_SYMBOL]; } - (NSString *) exponentSymbol { return [internal symbolForKey: UNUM_EXPONENTIAL_SYMBOL]; } - (void) setZeroSymbol: (NSString *) string { [internal setSymbol: string forKey: UNUM_ZERO_DIGIT_SYMBOL]; } - (NSString *) zeroSymbol { return [internal symbolForKey: UNUM_ZERO_DIGIT_SYMBOL]; } - (void) setNilSymbol: (NSString *) string { return; // FIXME } - (NSString *) nilSymbol { return nil; // FIXME } - (void) setNotANumberSymbol: (NSString *) string { [internal setSymbol: string forKey: UNUM_NAN_SYMBOL]; } - (NSString *) notANumberSymbol { return [internal symbolForKey: UNUM_NAN_SYMBOL]; } - (void) setNegativeInfinitySymbol: (NSString *) string { // FIXME: ICU doesn't differenciate between positive and negative infinity. [internal setSymbol: string forKey: UNUM_INFINITY_SYMBOL]; } - (NSString *) negativeInfinitySymbol { return [internal symbolForKey: UNUM_INFINITY_SYMBOL]; } - (void) setPositiveInfinitySymbol: (NSString *) string { // FIXME: ICU doesn't differenciate between positive and negative infinity. [internal setSymbol: string forKey: UNUM_INFINITY_SYMBOL]; } - (NSString *) positiveInfinitySymbol { return [internal symbolForKey: UNUM_INFINITY_SYMBOL]; } - (void) setCurrencySymbol: (NSString *) string { [internal setSymbol: string forKey: UNUM_CURRENCY_SYMBOL]; } - (NSString *) currencySymbol { return [internal symbolForKey: UNUM_CURRENCY_SYMBOL]; } - (void) setCurrencyCode: (NSString *) string { [internal setSymbol: string forKey: UNUM_CURRENCY_CODE]; } - (NSString *) currencyCode { return [internal textAttributeForKey: UNUM_CURRENCY_CODE]; } - (void) setInternationalCurrencySymbol: (NSString *) string { [internal setSymbol: string forKey: UNUM_INTL_CURRENCY_SYMBOL]; } - (NSString *) internationalCurrencySymbol { return [internal symbolForKey: UNUM_INTL_CURRENCY_SYMBOL]; } - (void) setPositivePrefix: (NSString *) string { [internal setTextAttribute: string forKey: UNUM_POSITIVE_PREFIX]; } - (NSString *) positivePrefix { return [internal textAttributeForKey: UNUM_POSITIVE_PREFIX]; } - (void) setPositiveSuffix: (NSString *) string { [internal setTextAttribute: string forKey: UNUM_POSITIVE_SUFFIX]; } - (NSString *) positiveSuffix { return [internal textAttributeForKey: UNUM_POSITIVE_SUFFIX]; } - (void) setNegativePrefix: (NSString *) string { [internal setTextAttribute: string forKey: UNUM_NEGATIVE_PREFIX]; } - (NSString *) negativePrefix { return [internal textAttributeForKey: UNUM_NEGATIVE_PREFIX]; } - (void) setNegativeSuffix: (NSString *) string { [internal setTextAttribute: string forKey: UNUM_NEGATIVE_SUFFIX]; } - (NSString *) negativeSuffix { return [internal textAttributeForKey: UNUM_NEGATIVE_SUFFIX]; } - (void) setTextAttributesForZero: (NSDictionary *) newAttributes { return; // FIXME } - (NSDictionary *) textAttributesForZero { return nil; // FIXME } - (void) setTextAttributesForNil: (NSDictionary *) newAttributes { return; } - (NSDictionary *) textAttributesForNil { return nil; // FIXME } - (void) setTextAttributesForNotANumber: (NSDictionary *) newAttributes { return; // FIXME } - (NSDictionary *) textAttributesForNotANumber { return nil; // FIXME } - (void) setTextAttributesForPositiveInfinity: (NSDictionary *) newAttributes { return; // FIXME } - (NSDictionary *) textAttributesForPositiveInfinity { return nil; // FIXME } - (void) setTextAttributesForNegativeInfinity: (NSDictionary *) newAttributes { return; // FIXME } - (NSDictionary *) textAttributesForNegativeInfinity { return nil; // FIXME } - (void) setGroupingSeparator: (NSString *) string { [internal setSymbol: string forKey: UNUM_GROUPING_SEPARATOR_SYMBOL]; } - (NSString *) groupingSeparator { return [internal symbolForKey: UNUM_GROUPING_SEPARATOR_SYMBOL]; } - (void) setUsesGroupingSeparator: (BOOL)flag { #if GS_USE_ICU == 1 [internal setBool: flag forKey: UNUM_GROUPING_USED]; #else return; #endif } - (BOOL) usesGroupingSeparator { return [internal boolForKey: UNUM_GROUPING_USED]; } - (void) setAlwaysShowsDecimalSeparator: (BOOL)flag { #if GS_USE_ICU == 1 [internal setBool: flag forKey: UNUM_DECIMAL_ALWAYS_SHOWN]; #else return; #endif } - (BOOL) alwaysShowsDecimalSeparator { return [internal boolForKey: UNUM_DECIMAL_ALWAYS_SHOWN]; } - (void) setCurrencyDecimalSeparator: (NSString *) string { [internal setSymbol: string forKey: UNUM_MONETARY_SEPARATOR_SYMBOL]; } - (NSString *) currencyDecimalSeparator { return [internal symbolForKey: UNUM_MONETARY_SEPARATOR_SYMBOL]; } - (void) setGroupingSize: (NSUInteger) number { [internal setAttribute: number forKey: UNUM_GROUPING_SIZE]; } - (NSUInteger) groupingSize { #if GS_USE_ICU == 1 return (NSUInteger)[internal attributeForKey: UNUM_GROUPING_SIZE]; #else return 3; #endif } - (void) setSecondaryGroupingSize: (NSUInteger) number { [internal setAttribute: number forKey: UNUM_SECONDARY_GROUPING_SIZE]; } - (NSUInteger) secondaryGroupingSize { #if GS_USE_ICU == 1 return (NSUInteger)[internal attributeForKey: UNUM_SECONDARY_GROUPING_SIZE]; #else return 3; #endif } - (void) setPaddingCharacter: (NSString *) string { [internal setTextAttribute: string forKey: UNUM_PADDING_CHARACTER]; } - (NSString *) paddingCharacter { return [internal textAttributeForKey: UNUM_PADDING_CHARACTER]; } - (void) setPaddingPosition: (NSNumberFormatterPadPosition) position { [internal setAttribute: NSToICUPadPosition(position) forKey: UNUM_PADDING_POSITION]; } - (NSNumberFormatterPadPosition) paddingPosition { return ICUToNSPadPosition([internal attributeForKey: UNUM_PADDING_POSITION]); } - (void) setMinimumIntegerDigits: (NSUInteger) number { [internal setAttribute: number forKey: UNUM_MIN_INTEGER_DIGITS]; } - (NSUInteger) minimumIntegerDigits { return (NSUInteger)[internal attributeForKey: UNUM_MIN_INTEGER_DIGITS]; } - (void) setMinimumFractionDigits: (NSUInteger) number { [internal setAttribute: number forKey: UNUM_MIN_FRACTION_DIGITS]; } - (NSUInteger) minimumFractionDigits { return (NSUInteger)[internal attributeForKey: UNUM_MIN_FRACTION_DIGITS]; } - (void) setMaximumIntegerDigits: (NSUInteger) number { [internal setAttribute: number forKey: UNUM_MAX_INTEGER_DIGITS]; } - (NSUInteger) maximumIntegerDigits { return (NSUInteger)[internal attributeForKey: UNUM_MAX_INTEGER_DIGITS]; } - (void) setMaximumFractionDigits: (NSUInteger) number { [internal setAttribute: number forKey: UNUM_MAX_FRACTION_DIGITS]; } - (NSUInteger) maximumFractionDigits { return (NSUInteger)[internal attributeForKey: UNUM_MAX_FRACTION_DIGITS]; } - (BOOL) getObjectValue: (out id *) anObject forString: (NSString *) aString range: (NSRange *) rangep error: (out NSError **) error { #if GS_USE_ICU == 1 BOOL result; BOOL genDec = [self generatesDecimalNumbers]; NSUInteger inLen; int32_t parsePos = rangep->location; UChar inBuffer[BUFFER_SIZE]; UErrorCode err = U_ZERO_ERROR; inLen = [aString length]; if (inLen > BUFFER_SIZE) inLen = BUFFER_SIZE; [aString getCharacters: inBuffer range: NSMakeRange(0, inLen)]; if (genDec) // Generate decimal number? This should be the default. { #if 0 // FIXME: The unum_parseDecimal function is only available on ICU > 4.4 int32_t outLen; char outBuffer[BUFFER_SIZE]; outLen = unum_parseDecimal (internal->_formatter, inBuffer, inLen, &parsePos, outBuffer, BUFFER_SIZE-1, &err); if (U_SUCCESS(err)) { NSString *outStr = [NSString stringWithCString: outBuffer length: outLen]; *anObject = [NSDecimalNumber decimalNumberWithString: outStr]; result = YES; } else { if (error) *error = [NSError errorWithDomain: @"NSNumberFormatterParseError" code: err userInfo: nil]; *anObject = nil; *rangep = NSMakeRange (rangep->location, parsePos); result = NO; } #endif result = NO; } else // If not generating NSDecimalNumber use unum_parseDouble() { double output; output = unum_parseDouble (internal->_formatter, inBuffer, inLen, &parsePos, &err); if (U_SUCCESS(err)) { *anObject = [NSNumber numberWithDouble: output]; result = YES; } else { if (error) *error = [NSError errorWithDomain: @"NSNumberFormatterParseError" code: err userInfo: nil]; *anObject = nil; *rangep = NSMakeRange (rangep->location, parsePos); result = NO; } } return result; #else return NO; #endif } - (void) setUsesSignificantDigits: (BOOL)flag { #if GS_USE_ICU == 1 [internal setBool: flag forKey: UNUM_SIGNIFICANT_DIGITS_USED]; #else return; #endif } - (BOOL) usesSignificantDigits { return [internal boolForKey: UNUM_SIGNIFICANT_DIGITS_USED]; } - (void) setMinimumSignificantDigits: (NSUInteger) number { [internal setAttribute: number forKey: UNUM_MIN_SIGNIFICANT_DIGITS]; } - (NSUInteger) minimumSignificantDigits { return (NSUInteger)[internal attributeForKey: UNUM_MIN_SIGNIFICANT_DIGITS]; } - (void) setMaximumSignificantDigits: (NSUInteger) number { [internal setAttribute: number forKey: UNUM_MAX_SIGNIFICANT_DIGITS]; } - (NSUInteger) maximumSignificantDigits { return (NSUInteger)[internal attributeForKey: UNUM_MAX_SIGNIFICANT_DIGITS]; } - (void) setCurrencyGroupingSeparator: (NSString *) string { [internal setSymbol: string forKey: UNUM_MONETARY_GROUPING_SEPARATOR_SYMBOL]; } - (NSString *) currencyGroupingSeparator { return [internal symbolForKey: UNUM_MONETARY_GROUPING_SEPARATOR_SYMBOL]; } - (void) setLenient: (BOOL)flag { [internal setBool: flag forKey: UNUM_LENIENT_PARSE]; } - (BOOL) isLenient { return [internal boolForKey: UNUM_LENIENT_PARSE]; } - (void) setPartialStringValidationEnabled: (BOOL) enabled { return; } - (BOOL) isPartialStringValidationEnabled { return NO; } + (NSString *) localizedStringFromNumber: (NSNumber *) num numberStyle: (NSNumberFormatterStyle) localizationStyle { #if GS_USE_ICU == 1 NSNumberFormatter *fmt; NSString *result; fmt = [[NSNumberFormatter alloc] init]; [fmt setLocale: [NSLocale currentLocale]]; [fmt setNumberStyle: localizationStyle]; result = [fmt stringFromNumber: num]; RELEASE(fmt); return result; #else return nil; #endif } @end @implementation NSNumberFormatter (PrivateMethods) - (void) _resetUNumberFormat { #if GS_USE_ICU == 1 unichar buffer[BUFFER_SIZE]; NSUInteger length; UNumberFormatStyle style; UErrorCode err = U_ZERO_ERROR; const char *cLocaleId; int32_t idx; if (internal->_formatter) { unum_close(internal->_formatter); } cLocaleId = [[internal->_locale localeIdentifier] UTF8String]; style = NSToICUFormatStyle (internal->_style); internal->_formatter = unum_open (style, NULL, 0, cLocaleId, NULL, &err); if (U_FAILURE(err)) { internal->_formatter = NULL; } // Reset all properties for (idx = 0; idx < MAX_SYMBOLS; ++idx) { if (nil != internal->_symbols[idx]) { length = [internal->_symbols[idx] length]; if (length > BUFFER_SIZE) { length = BUFFER_SIZE; } [internal->_symbols[idx] getCharacters: buffer range: NSMakeRange (0, length)]; unum_setSymbol (internal->_formatter, idx, buffer, length, &err); } } for (idx = 0; idx < MAX_TEXTATTRIBUTES; ++idx) { if (nil != internal->_textAttributes[idx]) { length = [internal->_textAttributes[idx] length]; if (length > BUFFER_SIZE) { length = BUFFER_SIZE; } [internal->_textAttributes[idx] getCharacters: buffer range: NSMakeRange (0, length)]; unum_setTextAttribute (internal->_formatter, idx, buffer, length, &err); } } for (idx = 0; idx < MAX_ATTRIBUTES; ++idx) { if (internal->_attributes[idx] >= 0) { unum_setAttribute (internal->_formatter, idx, internal->_attributes[idx]); } } #else return; #endif } @end gnustep-base-1.29.0/Source/NSNumberMethods.h000066400000000000000000000007761435650067400206520ustar00rootroot00000000000000#define INTEGER_MACRO(encoding, type, name, ignored) \ - (type) name ## Value\ {\ return (type)VALUE;\ } #include "GSNumberTypes.h" - (BOOL) boolValue { return (VALUE == 0) ? NO : YES; } - (const char *) objCType { return @encode(__typeof__(VALUE)); } - (NSString*) descriptionWithLocale: (id)aLocale { return [[[NSString alloc] initWithFormat: FORMAT locale: aLocale, VALUE] autorelease]; } - (void) getValue: (void*)buffer { __typeof__(VALUE) *ptr = buffer; *ptr = VALUE; } #undef FORMAT gnustep-base-1.29.0/Source/NSObjCRuntime.m000066400000000000000000000106371435650067400202610ustar00rootroot00000000000000/** Implementation of ObjC runtime for GNUStep Copyright (C) 1995 Free Software Foundation, Inc. Written by: Andrew Kachites McCallum Date: Aug 1995 This file is part of the GNUstep Base Library. 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 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 USA. NSObjCRuntime class reference $Date$ $Revision$ */ #import "common.h" #if !defined (__GNU_LIBOBJC__) # include #endif #import "Foundation/NSException.h" /** * Returns a string object containing the name for * aProtocol. If aProtocol is 0, returns nil. */ GS_DECLARE NSString * NSStringFromProtocol(Protocol *aProtocol) { if (aProtocol != (Protocol*)0) return [NSString stringWithUTF8String: protocol_getName(aProtocol)]; return nil; } /** * Returns the protocol whose name is supplied in the * aProtocolName argument, or 0 if a nil string is supplied. */ GS_DECLARE Protocol * NSProtocolFromString(NSString *aProtocolName) { if (aProtocolName != nil) { int len = [aProtocolName length]; char buf[len+1]; [aProtocolName getCString: buf maxLength: len + 1 encoding: NSASCIIStringEncoding]; return GSProtocolFromName (buf); } return (Protocol*)0; } /** * Returns a string object containing the name for * aSelector. If aSelector is 0, returns nil. */ GS_DECLARE NSString * NSStringFromSelector(SEL aSelector) { if (aSelector != (SEL)0) return [NSString stringWithUTF8String: sel_getName(aSelector)]; return nil; } /** * Returns (creating if necessary) the selector whose name is supplied in the * aSelectorName argument, or 0 if a nil string is supplied. */ GS_DECLARE SEL NSSelectorFromString(NSString *aSelectorName) { if (aSelectorName != nil) { int len = [aSelectorName length]; char buf[len+1]; [aSelectorName getCString: buf maxLength: len + 1 encoding: NSASCIIStringEncoding]; return sel_registerName (buf); } return (SEL)0; } /** * Returns the class whose name is supplied in the * aClassName argument, or Nil if a nil string is supplied. * If no such class has been loaded, the function returns Nil. */ GS_DECLARE Class NSClassFromString(NSString *aClassName) { if (aClassName != nil) { int len = [aClassName length]; char buf[len+1]; [aClassName getCString: buf maxLength: len + 1 encoding: NSASCIIStringEncoding]; return objc_lookUpClass (buf); } return (Class)0; } /** * Returns an [NSString] object containing the class name for * aClass. If aClass is 0, returns nil. */ GS_DECLARE NSString * NSStringFromClass(Class aClass) { if (aClass != (Class)0) return [NSString stringWithUTF8String: (char*)class_getName(aClass)]; return nil; } /** * When provided with a C string containing encoded type information, * this method extracts size and alignment information for the specified * type into the buffers pointed to by sizep and alignp.
* If either sizep or alignp is a null pointer, the corresponding data is * not extracted.
* The function returns a pointer into the type information C string * immediately after the decoded information. */ GS_DECLARE const char * NSGetSizeAndAlignment(const char *typePtr, NSUInteger *sizep, NSUInteger *alignp) { if (typePtr != NULL) { /* Skip any offset, but don't call objc_skip_offset() as that's buggy. */ if (*typePtr == '+' || *typePtr == '-') { typePtr++; } while (isdigit(*typePtr)) { typePtr++; } typePtr = objc_skip_type_qualifiers (typePtr); if (sizep) { *sizep = objc_sizeof_type (typePtr); } if (alignp) { *alignp = objc_alignof_type (typePtr); } typePtr = objc_skip_typespec (typePtr); } return typePtr; } gnustep-base-1.29.0/Source/NSObject+NSComparisonMethods.m000066400000000000000000000043721435650067400232000ustar00rootroot00000000000000/** Implementation of NSObject+NSComparisonMethods for GNUStep Copyright (C) 2008 Free Software Foundation, Inc. Written by: Gregory Casamento Date: 2008 This file is part of the GNUstep Base Library. 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 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 USA. NSObject+NSComparisonMethods category reference $Date: 2008-11-26 04:20:34 -0500 (Wed, 26 Nov 2008) $ $Revision: 27135 $ */ #import "common.h" #import "Foundation/NSArray.h" @implementation NSObject (NSComparisonMethods) - (BOOL) doesContain: (id) object { if (object) { if ([self isKindOfClass: [NSArray class]]) { return [(NSArray *)self containsObject: object]; } } return NO; } - (BOOL) isCaseInsensitiveLike: (id) object { NSLog(@"%@ not implemented yet", NSStringFromSelector(_cmd)); return NO; } - (BOOL) isEqualTo: (id) object { return [self isEqual: object]; } - (BOOL) isGreaterThan: (id) object { return ([self compare: object] == NSOrderedDescending); } - (BOOL) isGreaterThanOrEqualTo: (id) object { return ([self compare: object] == NSOrderedDescending || [self compare: object] == NSOrderedSame); } - (BOOL) isLessThan: (id) object { return ([self compare: object] == NSOrderedAscending); } - (BOOL) isLessThanOrEqualTo: (id) object { return ([self compare: object] == NSOrderedAscending || [self compare: object] == NSOrderedSame); } - (BOOL) isLike: (NSString *)object { NSLog(@"%@ not implemented yet", NSStringFromSelector(_cmd)); return NO; } - (BOOL) isNotEqualTo: (id) object { return !([self isEqual: object]); } @end gnustep-base-1.29.0/Source/NSObject.m000066400000000000000000002151761435650067400173130ustar00rootroot00000000000000/** Implementation of NSObject for GNUStep Copyright (C) 1994-2017 Free Software Foundation, Inc. Written by: Andrew Kachites McCallum Date: August 1994 This file is part of the GNUstep Base Library. 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 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 USA. NSObject class reference $Date$ $Revision$ */ /* On some versions of mingw we need to work around bad function declarations * by defining them away and doing the declarations ourself later. */ #ifndef _WIN64 #define InterlockedIncrement BadInterlockedIncrement #define InterlockedDecrement BadInterlockedDecrement #endif #import "common.h" #include #import "Foundation/NSMethodSignature.h" #import "Foundation/NSInvocation.h" #import "Foundation/NSLock.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSArray.h" #import "Foundation/NSException.h" #import "Foundation/NSHashTable.h" #import "Foundation/NSPortCoder.h" #import "Foundation/NSDistantObject.h" #import "Foundation/NSThread.h" #import "Foundation/NSNotification.h" #import "Foundation/NSMapTable.h" #import "Foundation/NSUserDefaults.h" #import "GNUstepBase/GSLocale.h" #ifdef HAVE_LOCALE_H #include #endif #ifdef HAVE_MALLOC_H #include #endif #import "GSPThread.h" #if defined(HAVE_SYS_SIGNAL_H) # include #elif defined(HAVE_SIGNAL_H) # include #endif #if __GNUC__ >= 4 #if defined(__FreeBSD__) #include #endif #endif // __GNUC__ #define IN_NSOBJECT_M 1 #import "GSPrivate.h" #ifdef __GNUSTEP_RUNTIME__ #include #include #ifdef OBJC_CAP_ARC #include #endif #endif /* platforms which do not support weak */ #if defined (__WIN32) #define WEAK_ATTRIBUTE #else /* all platforms which support weak */ #define WEAK_ATTRIBUTE __attribute__((weak)) #endif /* When this is `YES', every call to release/autorelease, checks to make sure isn't being set up to release itself too many times. This does not need mutex protection. */ static BOOL double_release_check_enabled = NO; /* The Class responsible for handling autorelease's. This does not need mutex protection, since it is simply a pointer that gets read and set. */ static id autorelease_class = nil; static SEL autorelease_sel; static IMP autorelease_imp; static SEL finalize_sel; static IMP finalize_imp; static Class NSConstantStringClass; @class NSDataMalloc; @class NSMutableDataMalloc; GS_ROOT_CLASS @interface NSZombie { Class isa; } - (Class) class; - (void) forwardInvocation: (NSInvocation*)anInvocation; - (NSMethodSignature*) methodSignatureForSelector: (SEL)aSelector; @end @interface GSContentAccessingProxy : NSProxy { NSObject *object; } - (id) initWithObject: (id)anObject; @end /* allocationLock is needed when for protecting the map table of zombie * information and if atomic operations are not available. */ static gs_mutex_t allocationLock = GS_MUTEX_INIT_STATIC; BOOL NSZombieEnabled = NO; BOOL NSDeallocateZombies = NO; @class NSZombie; static Class zombieClass = Nil; static NSMapTable *zombieMap = 0; #ifndef OBJC_CAP_ARC static void GSMakeZombie(NSObject *o, Class c) { object_setClass(o, zombieClass); if (0 != zombieMap) { GS_MUTEX_LOCK(allocationLock); if (0 != zombieMap) { NSMapInsert(zombieMap, (void*)o, (void*)c); } GS_MUTEX_UNLOCK(allocationLock); } } #endif static void GSLogZombie(id o, SEL sel) { Class c = 0; if (0 != zombieMap) { GS_MUTEX_LOCK(allocationLock); if (0 != zombieMap) { c = NSMapGet(zombieMap, (void*)o); } GS_MUTEX_UNLOCK(allocationLock); } if (c == 0) { NSLog(@"*** -[??? %@]: message sent to deallocated instance %p", NSStringFromSelector(sel), o); } else { NSLog(@"*** -[%@ %@]: message sent to deallocated instance %p", c, NSStringFromSelector(sel), o); } if (GSPrivateEnvironmentFlag("CRASH_ON_ZOMBIE", NO) == YES) { abort(); } } /* * Reference count and memory management * Reference counts for object are stored * with the object. * The zone in which an object has been * allocated is stored with the object. */ /* Now, if we are on a platform where we know how to do atomic * read, increment, and decrement, then we define the GSATOMICREAD * macro and macros or functions to increment/decrement. * The presence of the GSATOMICREAD macro is used later to determine * whether to attempt atomic operations or to use locking for the * retain/release mechanism. * The GSAtomicIncrement() and GSAtomicDecrement() functions take a * pointer to a 32bit integer as an argument, increment/decrement the * value pointed to, and return the result. */ #ifdef GSATOMICREAD #undef GSATOMICREAD #endif /* Traditionally, GNUstep has been using a 32bit reference count in front * of the object. The automatic reference counting implementation in * libobjc2 uses an intptr_t instead, so NSObject will only be compatible * with ARC if either of the following apply: * * a) sizeof(intptr_t) == sizeof(int32_t) * b) we can provide atomic operations on pointer sized values, allowing * us to extend the refcount to intptr_t. */ #ifdef GS_ARC_COMPATIBLE #undef GS_ARC_COMPATIBLE #endif #if defined(__llvm__) || (defined(USE_ATOMIC_BUILTINS) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1))) /* Use the GCC atomic operations with recent GCC versions */ typedef intptr_t volatile *gsatomic_t; typedef intptr_t gsrefcount_t; #define GSATOMICREAD(X) (*(X)) #define GSAtomicIncrement(X) __sync_add_and_fetch(X, 1) #define GSAtomicDecrement(X) __sync_sub_and_fetch(X, 1) #define GS_ARC_COMPATIBLE 1 #elif defined(_WIN32) /* Set up atomic read, increment and decrement for mswindows */ typedef int32_t volatile *gsatomic_t; typedef int32_t gsrefcount_t; #ifndef _WIN64 #undef InterlockedIncrement #undef InterlockedDecrement LONG WINAPI InterlockedIncrement(LONG volatile *); LONG WINAPI InterlockedDecrement(LONG volatile *); #endif #define GSATOMICREAD(X) (*(X)) #define GSAtomicIncrement(X) InterlockedIncrement(X) #define GSAtomicDecrement(X) InterlockedDecrement(X) #elif defined(__linux__) && (defined(__i386__) || defined(__x86_64__)) /* Set up atomic read, increment and decrement for intel style linux */ typedef int32_t volatile *gsatomic_t; typedef int32_t gsrefcount_t; #define GSATOMICREAD(X) (*(X)) static __inline__ int32_t GSAtomicIncrement(gsatomic_t X) { register int32_t tmp; __asm__ __volatile__ ( "movl $1, %0\n" "lock xaddl %0, %1" :"=r" (tmp), "=m" (*X) :"r" (tmp), "m" (*X) :"memory" ); return tmp + 1; } static __inline__ int32_t GSAtomicDecrement(gsatomic_t X) { register int32_t tmp; __asm__ __volatile__ ( "movl $1, %0\n" "negl %0\n" "lock xaddl %0, %1" :"=r" (tmp), "=m" (*X) :"r" (tmp), "m" (*X) :"memory" ); return tmp - 1; } #elif defined(__PPC__) || defined(__POWERPC__) typedef int32_t volatile *gsatomic_t; typedef int32_t gsrefcount_t; #define GSATOMICREAD(X) (*(X)) static __inline__ int32_t GSAtomicIncrement(gsatomic_t X) { int32_t tmp; __asm__ __volatile__ ( "0:" "lwarx %0,0,%1 \n" "addic %0,%0,1 \n" "stwcx. %0,0,%1 \n" "bne- 0b \n" :"=&r" (tmp) :"r" (X) :"cc", "memory"); return tmp; } static __inline__ int32_t GSAtomicDecrement(gsatomic_t X) { int32_t tmp; __asm__ __volatile__ ( "0:" "lwarx %0,0,%1 \n" "addic %0,%0,-1 \n" "stwcx. %0,0,%1 \n" "bne- 0b \n" :"=&r" (tmp) :"r" (X) :"cc", "memory"); return tmp; } #elif defined(__m68k__) typedef int32_t volatile *gsatomic_t; typedef int32_t gsrefcount_t; #define GSATOMICREAD(X) (*(X)) static __inline__ int32_t GSAtomicIncrement(gsatomic_t X) { __asm__ __volatile__ ( "addq%.l %#1, %0" :"=m" (*X)); return *X; } static __inline__ int32_t GSAtomicDecrement(gsatomic_t X) { __asm__ __volatile__ ( "subq%.l %#1, %0" :"=m" (*X)); return *X; } #elif defined(__mips__) typedef int32_t volatile *gsatomic_t; typedef int32_t gsrefcount_t; #define GSATOMICREAD(X) (*(X)) static __inline__ int32_t GSAtomicIncrement(gsatomic_t X) { int32_t tmp; __asm__ __volatile__ ( #if !defined(__mips64) " .set mips2 \n" #endif "0: ll %0, %1 \n" " addiu %0, 1 \n" " sc %0, %1 \n" " beqz %0, 0b \n" :"=&r" (tmp), "=m" (*X)); return tmp; } static __inline__ int32_t GSAtomicDecrement(gsatomic_t X) { int32_t tmp; __asm__ __volatile__ ( #if !defined(__mips64) " .set mips2 \n" #endif "0: ll %0, %1 \n" " addiu %0, -1 \n" " sc %0, %1 \n" " beqz %0, 0b \n" :"=&r" (tmp), "=m" (*X)); return tmp; } #endif #if !defined(GSATOMICREAD) #include typedef int gsrefcount_t; // No atomics, use a simple integer /* Having just one allocationLock for all leads to lock contention * if there are lots of threads doing lots of retain/release calls. * To alleviate this, instead of a single * allocationLock for all objects, we divide the object space into * chunks, each with its own lock. The chunk is selected by shifting * off the low-order ALIGNBITS of the object's pointer (these bits * are presumably always zero) and take * the low-order LOCKBITS of the result to index into a table of locks. */ #define LOCKBITS 5 #define LOCKCOUNT (1<> ALIGNBITS) & LOCKMASK); return &allocationLocks[i]; } #endif #ifndef GS_ARC_COMPATIBLE /* * If we haven't previously declared that we can work in fast-ARC mode, * check whether a point is 32bit (4 bytes) wide, which also enables ARC * integration. */ # if __SIZEOF_POINTER__ == 4 # define GS_ARC_COMPATIBLE 1 # endif #endif #if defined(__GNUC__) && __GNUC__ < 4 #define __builtin_offsetof(s, f) (uintptr_t)(&(((s*)0)->f)) #endif #define alignof(type) __builtin_offsetof(struct { const char c; type member; }, member) /* * Define a structure to hold information that is held locally * (before the start) in each object. */ typedef struct obj_layout_unpadded { gsrefcount_t retained; } unp; #define UNP sizeof(unp) /* GCC provides a defined value for the largest alignment required on a * machine, and we must lay objects out to that alignment. * For compilers that don't define it, we try to pick a likely value. */ #ifndef __BIGGEST_ALIGNMENT__ #define __BIGGEST_ALIGNMENT__ (SIZEOF_VOIDP * 2) #endif /* * Now do the REAL version - using the other version to determine * what padding (if any) is required to get the alignment of the * structure correct. */ struct obj_layout { char padding[__BIGGEST_ALIGNMENT__ - ((UNP % __BIGGEST_ALIGNMENT__) ? (UNP % __BIGGEST_ALIGNMENT__) : __BIGGEST_ALIGNMENT__)]; gsrefcount_t retained; }; typedef struct obj_layout *obj; /* * These symbols are provided by newer versions of the GNUstep Objective-C * runtime. When linked against an older version, we will use our internal * versions. */ GS_IMPORT WEAK_ATTRIBUTE BOOL objc_release_fast_no_destroy_np(id anObject); GS_IMPORT WEAK_ATTRIBUTE void objc_release_fast_np(id anObject); GS_IMPORT WEAK_ATTRIBUTE size_t object_getRetainCount_np(id anObject); GS_IMPORT WEAK_ATTRIBUTE id objc_retain_fast_np(id anObject); static BOOL objc_release_fast_no_destroy_internal(id anObject) { if (double_release_check_enabled) { NSUInteger release_count; NSUInteger retain_count = [anObject retainCount]; release_count = [autorelease_class autoreleaseCountForObject: anObject]; if (release_count >= retain_count) [NSException raise: NSGenericException format: @"Release would release object too many times."]; } { #if defined(GSATOMICREAD) gsrefcount_t result; result = GSAtomicDecrement((gsatomic_t)&(((obj)anObject)[-1].retained)); if (result < 0) { if (result != -1) { [NSException raise: NSInternalInconsistencyException format: @"NSDecrementExtraRefCount() decremented too far"]; } /* The counter has become negative so it must have been zero. * We reset it and return YES ... in a correctly operating * process we know we can safely reset back to zero without * worrying about atomicity, since there can be no other * thread accessing the object (or its reference count would * have been greater than zero) */ (((obj)anObject)[-1].retained) = 0; # ifdef OBJC_CAP_ARC objc_delete_weak_refs(anObject); # endif return YES; } #else /* GSATOMICREAD */ pthread_mutex_t *theLock = GSAllocationLockForObject(anObject); pthread_mutex_lock(theLock); if (((obj)anObject)[-1].retained == 0) { # ifdef OBJC_CAP_ARC objc_delete_weak_refs(anObject); # endif pthread_mutex_unlock(theLock); return YES; } else { ((obj)anObject)[-1].retained--; pthread_mutex_unlock(theLock); return NO; } #endif /* GSATOMICREAD */ } return NO; } static BOOL release_fast_no_destroy(id anObject) { #ifdef __GNUSTEP_RUNTIME__ if (objc_release_fast_no_destroy_np) { return objc_release_fast_no_destroy_np(anObject); } else #endif { return objc_release_fast_no_destroy_internal(anObject); } } static void objc_release_fast_np_internal(id anObject) { if (release_fast_no_destroy(anObject)) { [anObject dealloc]; } } static void release_fast(id anObject) { #ifdef __GNUSTEP_RUNTIME__ if (objc_release_fast_np) { objc_release_fast_np(anObject); } else #endif { objc_release_fast_np_internal(anObject); } } /** * Examines the extra reference count for the object and, if non-zero * decrements it, otherwise leaves it unchanged.
* Returns a flag to say whether the count was zero * (and hence whether the extra reference count was decremented).
*/ inline BOOL NSDecrementExtraRefCountWasZero(id anObject) { return release_fast_no_destroy(anObject); } size_t object_getRetainCount_np_internal(id anObject) { return ((obj)anObject)[-1].retained + 1; } size_t getRetainCount(id anObject) { #ifdef __GNUSTEP_RUNTIME__ if (object_getRetainCount_np) { return object_getRetainCount_np(anObject); } else #endif { return object_getRetainCount_np_internal(anObject); } } /** * Return the extra reference count of anObject (a value in the range * from 0 to the maximum unsigned integer value minus one).
* The retain count for an object is this value plus one. */ inline NSUInteger NSExtraRefCount(id anObject) { return getRetainCount(anObject) - 1; } /** * Increments the extra reference count for anObject.
* The GNUstep version raises an exception if the reference count * would be incremented to too large a value.
* This is used by the [NSObject-retain] method. */ static id objc_retain_fast_np_internal(id anObject) { BOOL tooFar = NO; #if defined(GSATOMICREAD) /* I've seen comments saying that some platforms only support up to * 24 bits in atomic locking, so raise an exception if we try to * go beyond 0xfffffe. */ if (GSAtomicIncrement((gsatomic_t)&(((obj)anObject)[-1].retained)) > 0xfffffe) { tooFar = YES; } #else /* GSATOMICREAD */ pthread_mutex_t *theLock = GSAllocationLockForObject(anObject); pthread_mutex_lock(theLock); if (((obj)anObject)[-1].retained > 0xfffffe) { tooFar = YES; } else { ((obj)anObject)[-1].retained++; } pthread_mutex_unlock(theLock); #endif /* GSATOMICREAD */ if (YES == tooFar) { static NSHashTable *overrun = nil; /* We store this instance in a hash table so that we will only raise * an exception for it once (and can therefore expect to log the instance * as part of the exception derscription without recursion). * NB. The hash table does not retain the object, so the code in the * lock protected region below should be safe anyway. */ [gnustep_global_lock lock]; if (nil == overrun) { overrun = NSCreateHashTable(NSNonRetainedObjectHashCallBacks, 0); } if (0 == NSHashGet(overrun, anObject)) { NSHashInsert(overrun, anObject); } else { tooFar = NO; } [gnustep_global_lock lock]; if (YES == tooFar) { NSString *base; base = [NSString stringWithFormat: @"<%s: %p>", class_getName([anObject class]), anObject]; [NSException raise: NSInternalInconsistencyException format: @"NSIncrementExtraRefCount() asked to increment too far" @" for %@ - %@", base, anObject]; } } return anObject; } static id retain_fast(id anObject) { #ifdef __GNUSTEP_RUNTIME__ if (objc_retain_fast_np) { return objc_retain_fast_np(anObject); } else #endif { return objc_retain_fast_np_internal(anObject); } } /** * Increments the extra reference count for anObject.
* The GNUstep version raises an exception if the reference count * would be incremented to too large a value.
* This is used by the [NSObject-retain] method. */ inline void NSIncrementExtraRefCount(id anObject) { retain_fast(anObject); } #ifndef NDEBUG #define AADD(c, o) GSDebugAllocationAdd(c, o) #define AREM(c, o) GSDebugAllocationRemove(c, o) #else #define AADD(c, o) #define AREM(c, o) #endif #ifndef OBJC_CAP_ARC static SEL cxx_construct, cxx_destruct; /** * Calls the C++ constructors for this object, starting with the ones declared * in aClass. The compiler generates two methods on Objective-C++ classes that * static instances of C++ classes as ivars. These are -.cxx_construct and * -.cxx_destruct. The -.cxx_construct methods must be called in order from * the root class to all subclasses, to ensure that subclass ivars are * initialised after superclass ones. This must be done in reverse for * destruction. * * This function first calls itself recursively on the superclass, to get the * IMP for the constructor function in the superclass. It then compares the * construct method for this class with the one that's already been called, * and calls it if it's new. */ static IMP callCXXConstructors(Class aClass, id anObject) { IMP constructor = 0; if (class_respondsToSelector(aClass, cxx_construct)) { IMP calledConstructor = callCXXConstructors(class_getSuperclass(aClass), anObject); constructor = class_getMethodImplementation(aClass, cxx_construct); if (calledConstructor != constructor) { constructor(anObject, cxx_construct); } } return constructor; } #endif /* * Now do conditional compilation of memory allocation functions * depending on what information (if any) we are storing before * the start of each object. */ // FIXME rewrite object allocation to use class_createInstance when we // are using libobjc2. inline id NSAllocateObject(Class aClass, NSUInteger extraBytes, NSZone *zone) { id new; #ifdef OBJC_CAP_ARC if ((new = class_createInstance(aClass, extraBytes)) != nil) { AADD(aClass, new); } #else int size; NSCAssert((!class_isMetaClass(aClass)), @"Bad class for new object"); size = class_getInstanceSize(aClass) + extraBytes + sizeof(struct obj_layout); if (zone == 0) { zone = NSDefaultMallocZone(); } new = NSZoneMalloc(zone, size); if (new != nil) { memset (new, 0, size); new = (id)&((obj)new)[1]; object_setClass(new, aClass); AADD(aClass, new); } /* Don't bother doing this in a thread-safe way, because the cost of locking * will be a lot more than the cost of doing the same call in two threads. * The returned selector will persist and the runtime will ensure that both * calls return the same selector, so we don't need to bother doing it * ourselves. */ if (0 == cxx_construct) { cxx_construct = sel_registerName(".cxx_construct"); cxx_destruct = sel_registerName(".cxx_destruct"); } callCXXConstructors(aClass, new); #endif return new; } inline void NSDeallocateObject(id anObject) { Class aClass = object_getClass(anObject); if ((anObject != nil) && !class_isMetaClass(aClass)) { #ifndef OBJC_CAP_ARC obj o = &((obj)anObject)[-1]; NSZone *z = NSZoneFromPointer(o); #endif /* Call the default finalizer to handle C++ destructors. */ (*finalize_imp)(anObject, finalize_sel); AREM(aClass, (id)anObject); if (NSZombieEnabled == YES) { #ifdef OBJC_CAP_ARC if (0 != zombieMap) { GS_MUTEX_LOCK(allocationLock); if (0 != zombieMap) { NSMapInsert(zombieMap, (void*)anObject, (void*)aClass); } GS_MUTEX_UNLOCK(allocationLock); } if (NSDeallocateZombies == YES) { object_dispose(anObject); } else { object_setClass(anObject, zombieClass); } #else GSMakeZombie(anObject, aClass); if (NSDeallocateZombies == YES) { NSZoneFree(z, o); } #endif } else { #ifdef OBJC_CAP_ARC object_dispose(anObject); #else object_setClass((id)anObject, (Class)(void*)0xdeadface); NSZoneFree(z, o); #endif } } return; } BOOL NSShouldRetainWithZone (NSObject *anObject, NSZone *requestedZone) { return (!requestedZone || requestedZone == NSDefaultMallocZone() || [anObject zone] == requestedZone); } /** *

* NSObject is the root class (a root class is * a class with no superclass) of the GNUstep base library * class hierarchy, so all classes normally inherit from * NSObject. There is an exception though: * NSProxy (which is used for remote messaging) * does not inherit from NSObject. *

*

* Unless you are really sure of what you are doing, all * your own classes should inherit (directly or indirectly) * from NSObject (or in special cases from * NSProxy). NSObject provides * the basic common functionality shared by all GNUstep * classes and objects. *

*

* The essential methods which must be implemented by all * classes for their instances to be usable within GNUstep * are declared in a separate protocol, which is the * NSObject protocol. Both * NSObject and NSProxy conform to * this protocol, which means all objects in a GNUstep * application will conform to this protocol (btw, if you * don't find a method of NSObject you are * looking for in this documentation, make sure you also * look into the documentation for the NSObject * protocol). *

*

* Theoretically, in special cases you might need to * implement a new root class. If you do, you need to make * sure that your root class conforms (at least) to the * NSObject protocol, otherwise it will not * interact correctly with the GNUstep framework. Said * that, I must note that I have never seen a case in which * a new root class is needed. *

*

* NSObject is a root class, which implies that * instance methods of NSObject are treated in * a special way by the Objective-C runtime. This is an * exception to the normal way messaging works with class * and instance methods: if the Objective-C runtime can't * find a class method for a class object, as a last resort * it looks for an instance method of the root class with * the same name, and executes it if it finds it. This * means that instance methods of the root class (such as * NSObject) can be performed by class objects * which inherit from that root class ! This can only * happen if the class doesn't have a class method with the * same name, otherwise that method - of course - takes the * precedence. Because of this exception, * NSObject's instance methods are written in * such a way that they work both on NSObject's * instances and on class objects. *

*/ @implementation NSObject #if defined(GS_ARC_COMPATIBLE) - (void)_ARCCompliantRetainRelease {} #endif /** * Semi-private function in libobjc2 that initialises the classes used for * blocks. */ extern BOOL objc_create_block_classes_as_subclasses_of(Class super); #ifdef OBJC_CAP_ARC static id gs_weak_load(id obj) { return [obj retainCount] > 0 ? obj : nil; } #endif + (void) load { #ifdef OBJC_CAP_ARC _objc_weak_load = gs_weak_load; #endif objc_create_block_classes_as_subclasses_of(self); } + (void) initialize { if (self == [NSObject class]) { #ifdef _WIN32 /* Start of sockets so we can get host name and other info */ WORD wVersionRequested = MAKEWORD(2, 2); WSADATA wsaData; int wsaResult = WSAStartup(wVersionRequested, &wsaData); if (wsaResult != 0) { fprintf(stderr, "Error %d initializing Windows Sockets\n", wsaResult); } #else /* _WIN32 */ #ifdef SIGPIPE /* * If SIGPIPE is not handled or ignored, we will abort on any attempt * to write to a pipe/socket that has been closed by the other end! * We therefore need to ignore the signal if nothing else is already * handling it. */ #ifdef HAVE_SIGACTION { struct sigaction act; if (sigaction(SIGPIPE, 0, &act) == 0) { if (act.sa_handler == SIG_DFL) { // Not ignored or handled ... so we ignore it. act.sa_handler = SIG_IGN; if (sigaction(SIGPIPE, &act, 0) != 0) { fprintf(stderr, "Unable to ignore SIGPIPE\n"); } } } else { fprintf(stderr, "Unable to retrieve information about SIGPIPE\n"); } } #else /* HAVE_SIGACTION */ { void (*handler)(NSInteger); handler = signal(SIGPIPE, SIG_IGN); if (handler != SIG_DFL) { signal(SIGPIPE, handler); } } #endif /* HAVE_SIGACTION */ #endif /* SIGPIPE */ #endif /* _WIN32 */ finalize_sel = @selector(finalize); finalize_imp = class_getMethodImplementation(self, finalize_sel); #if defined(__FreeBSD__) && defined(__i386__) // Manipulate the FPU to add the exception mask. (Fixes SIGFPE // problems on *BSD) // Note this only works on x86 # if defined(FE_INVALID) fedisableexcept(FE_INVALID); # else { volatile short cw; __asm__ volatile ("fstcw (%0)" : : "g" (&cw)); cw |= 1; /* Mask 'invalid' exception */ __asm__ volatile ("fldcw (%0)" : : "g" (&cw)); } # endif #endif /* Initialize the locks for allocation when atomic * operations are not available. */ #if !defined(GSATOMICREAD) { NSUInteger i; for (i = 0; i < LOCKCOUNT; i++) { pthread_mutex_init(&allocationLocks[i], NULL); } } #endif /* Create the global lock. * NB. Ths is one of the first things we do ... setting up a new lock * must not call any other Objective-C classes and must not involve * any use of the autorelease system. */ gnustep_global_lock = [GSUntracedRecursiveLock new]; /* Behavior debugging ... enable with environment variable if needed. */ GSObjCBehaviorDebug(GSPrivateEnvironmentFlag("GNUSTEP_BEHAVIOR_DEBUG", GSObjCBehaviorDebug(-1))); /* See if we should cleanup at process exit. */ if (YES == GSPrivateEnvironmentFlag("GNUSTEP_SHOULD_CLEAN_UP", NO)) { [self setShouldCleanUp: YES]; [self registerAtExit: @selector(_atExit)]; } /* Set up the autorelease system ... we must do this before using any * other class whose +initialize might autorelease something. */ autorelease_class = [NSAutoreleasePool class]; autorelease_sel = @selector(addObject:); autorelease_imp = [autorelease_class methodForSelector: autorelease_sel]; /* Make sure the constant string class works. */ NSConstantStringClass = [NSString constantStringClass]; /* Now that the string class (and autorelease) is set up, we can set * the name of the lock to a string value safely. */ [gnustep_global_lock setName: @"gnustep_global_lock"]; /* Determine zombie management flags and set up a map to store * information about zombie objects. */ NSZombieEnabled = GSPrivateEnvironmentFlag("NSZombieEnabled", NO); NSDeallocateZombies = GSPrivateEnvironmentFlag("NSDeallocateZombies", NO); zombieMap = NSCreateMapTable(NSNonOwnedPointerMapKeyCallBacks, NSNonOwnedPointerMapValueCallBacks, 0); /* We need to cache the zombie class. * We can't call +class because NSZombie doesn't have that method. * We can't use NSClassFromString() because that would use an NSString * object, and that class hasn't been initialized yet ... */ zombieClass = objc_lookUpClass("NSZombie"); } return; } + (void) _atExit { NSMapTable *m = nil; GS_MUTEX_LOCK(allocationLock); m = zombieMap; zombieMap = nil; GS_MUTEX_UNLOCK(allocationLock); DESTROY(m); } /** * Allocates a new instance of the receiver from the default * zone, by invoking +allocWithZone: with * NSDefaultMallocZone() as the zone argument.
* Returns the created instance. */ + (id) alloc { return [self allocWithZone: NSDefaultMallocZone()]; } /** * This is the basic method to create a new instance. It * allocates a new instance of the receiver from the specified * memory zone. *

* Memory for an instance of the receiver is allocated; a * pointer to this newly created instance is returned. All * instance variables are set to 0. No initialization of the * instance is performed apart from setup to be an instance of * the correct class: it is your responsibility to initialize the * instance by calling an appropriate init * method. If you are not using ARC, it is * also your responsibility to make sure the returned * instance is destroyed when you finish using it, by calling * the release method to destroy the instance * directly, or by using autorelease and * autorelease pools. *

*

* You do not normally need to override this method in * subclasses, unless you are implementing a class which for * some reasons silently allocates instances of another class * (this is typically needed to implement class clusters and * similar design schemes). *

*

* If you have turned on debugging of object allocation (by * calling the GSDebugAllocationActive * function), this method will also update the various * debugging counts and monitors of allocated objects, which * you can access using the GSDebugAllocation... * functions. *

*/ + (id) allocWithZone: (NSZone*)z { return NSAllocateObject(self, 0, z); } /** * Returns the receiver. */ + (id) copyWithZone: (NSZone*)z { return self; } /** *

* This method is a short-hand for alloc followed by init, that is, *

*

* NSObject *object = [NSObject new]; *

* is exactly the same as *

* NSObject *object = [[NSObject alloc] init]; *

*

* This is a general convention: all new... * methods are supposed to return a newly allocated and * initialized instance, as would be generated by an * alloc method followed by a corresponding * init... method. Please note that if you are * not using ARC, this means that instances * generated by the new... methods are not * autoreleased, that is, you are responsible for releasing * (autoreleasing) the instances yourself. So when you use * new you typically do something like: *

*

* * NSMutableArray *array = AUTORELEASE ([NSMutableArray new]); * *

*

* You do not normally need to override new in * subclasses, because if you override init (and * optionally allocWithZone: if you really * need), new will automatically use your * subclass methods. *

*

* You might need instead to define new new... * methods specific to your subclass to match any * init... specific to your subclass. For * example, if your subclass defines an instance method *

*

* initWithName: *

*

* it might be handy for you to have a class method *

*

* newWithName: *

*

* which combines alloc and * initWithName:. You would implement it as follows: *

*

* * + (id) newWithName: (NSString *)aName * { * return [[self alloc] initWithName: aName]; * } * *

*/ + (id) new { return [[self alloc] init]; } /** * Returns the class of which the receiver is an instance.
* The default implementation returns the actual class that the * receiver is an instance of.
* NB. When NSZombie is enabled (see NSDebug.h) this is changed * to be the NSZombie class upon object deallocation. */ - (Class) class { return object_getClass(self); } /** * Returns the name of the class of the receiving object by using * the NSStringFromClass() function.
* This is a MacOS-X addition for apple scripting, which is also * generally useful. */ - (NSString*) className { return NSStringFromClass([self class]); } /** * Creates and returns a copy of the receiver by calling -copyWithZone: * passing NSDefaultMallocZone() */ - (id) copy { return [(id)self copyWithZone: NSDefaultMallocZone()]; } /** * Deallocates the receiver by calling NSDeallocateObject() with self * as the argument.
*

* You should normally call the superclass implementation of this method * when you override it in a subclass, or the memory occupied by your * object will not be released. *

*

* NSObject's implementation of this method * destroys the receiver, by returning the memory allocated * to the receiver to the system. After this method has been * called on an instance, you must not refer the instance in * any way, because it does not exist any longer. If you do, * it is a bug and your program might even crash with a * segmentation fault. *

*

* If you have turned on the debugging facilities for * instance allocation, NSObject's * implementation of this method will also update the various * counts and monitors of allocated instances (see the * GSDebugAllocation... functions for more * info). *

*

* Normally you are supposed to manage the memory taken by * objects by using the high level interface provided by the * retain, release and * autorelease methods (or better by the * corresponding macros RETAIN, * RELEASE and AUTORELEASE), and by * autorelease pools and such; whenever the * release/autorelease mechanism determines that an object is * no longer needed (which happens when its retain count * reaches 0), it will call the dealloc method * to actually deallocate the object. This means that normally, * you should not need to call dealloc directly as * the gnustep base library automatically calls it for you when * the retain count of an object reaches 0. *

*

* Because the dealloc method will be called * when an instance is being destroyed, if instances of your * subclass use objects or resources (as it happens for most * useful classes), you must override dealloc in * subclasses to release all objects and resources which are * used by the instance, otherwise these objects and * resources would be leaked. In the subclass * implementation, you should first release all your subclass * specific objects and resources, and then invoke super's * implementation (which will do the same, and so on up in * the class hierarchy to NSObject's * implementation, which finally destroys the object). Here * is an example of the implementation of * dealloc for a subclass whose instances have a * single instance variable name which needs to * be released when an instance is deallocated: *

*

* * - (void) dealloc * { * RELEASE (name); * [super dealloc]; * } * *

*

* dealloc might contain code to release not * only objects, but also other resources, such as open * files, network connections, raw memory allocated in other * ways, etc. *

*

* If you have allocated the memory using a non-standard mechanism, you * will not call the superclass (NSObject) implementation of the method * as you will need to handle the deallocation specially.
* In some circumstances, an object may wish to prevent itself from * being deallocated, it can do this simply be refraining from calling * the superclass implementation. *

*/ - (void) dealloc { NSDeallocateObject(self); } - (void) finalize { #ifndef OBJC_CAP_ARC Class destructorClass = Nil; IMP destructor = 0; /* * We're pretending to be the Objective-C runtime here, so we have to do some * unsafe things (i.e. access the class directly, and not via the * object_getClass() so that hidden classes get their destructors called. If * the runtime supports small objects (those embedded in a pointer), then we * must use object_getClass() for them, because they do not have an isa * pointer (but can not have a hidden class interposed). */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-objc-pointer-introspection" #pragma clang diagnostic ignored "-Wdeprecated-objc-isa-usage" #endif #ifdef OBJC_SMALL_OBJECT_MASK if (((NSUInteger)self & OBJC_SMALL_OBJECT_MASK) == 0) { destructorClass = isa; // Potentially hidden class } else { destructorClass = object_getClass(self); // Small object } #else destructorClass = isa; #endif #ifdef __clang__ #pragma clang diagnostic pop #endif /* C++ destructors must be called in the opposite order to their * creators, so start at the leaf class and then go up the tree until we * get to the root class. As a small optimisation, we don't bother * visiting any classes that don't have an implementation of this method * (including one inherited from a superclass). * * Care must be taken not to call inherited .cxx_destruct methods. */ while (class_respondsToSelector(destructorClass, cxx_destruct)) { IMP newDestructor; newDestructor = class_getMethodImplementation(destructorClass, cxx_destruct); destructorClass = class_getSuperclass(destructorClass); if (newDestructor != destructor) { newDestructor(self, cxx_destruct); destructor = newDestructor; } } return; #endif } /** * This method is an anachronism. Do not use it. */ - (id) free { [NSException raise: NSGenericException format: @"Use `dealloc' instead of `free' for %@.", self]; return nil; } /** * Initialises the receiver ... the NSObject implementation simply returns self. */ - (id) init { return self; } /** * Creates and returns a mutable copy of the receiver by calling * -mutableCopyWithZone: passing NSDefaultMallocZone(). */ - (id) mutableCopy { return [(id)self mutableCopyWithZone: NSDefaultMallocZone()]; } /** * Returns the super class from which the receiver was derived. */ + (Class) superclass { return class_getSuperclass(self); } /** * Returns the super class from which the receivers class was derived. */ - (Class) superclass { return class_getSuperclass(object_getClass(self)); } /** * Returns a flag to say if instances of the receiver class will * respond to the specified selector. This ignores situations * where a subclass implements -forwardInvocation: to respond to * selectors not normally handled ... in these cases the subclass * may override this method to handle it. *
If given a null selector, raises NSInvalidArgumentException when * in MacOS-X compatibility more, or returns NO otherwise. */ + (BOOL) instancesRespondToSelector: (SEL)aSelector { if (aSelector == 0) { if (GSPrivateDefaultsFlag(GSMacOSXCompatible)) { [NSException raise: NSInvalidArgumentException format: @"%@ null selector given", NSStringFromSelector(_cmd)]; } return NO; } if (class_respondsToSelector(self, aSelector)) { return YES; } if (class_isMetaClass(self)) { /* It seems convoluted to attempt to access the class from the metaclass just to call +resolveClassMethod: in this rare case. */ return NO; } else { return [self resolveInstanceMethod: aSelector]; } } /** * Returns a flag to say whether the receiving class conforms to aProtocol */ + (BOOL) conformsToProtocol: (Protocol*)aProtocol { #ifdef __GNU_LIBOBJC__ Class c; /* Iterate over the current class and all the superclasses. */ for (c = self; c != Nil; c = class_getSuperclass (c)) { if (class_conformsToProtocol(c, aProtocol)) { return YES; } } return NO; #else /* libobjc2 and ObjectiveC2/ have an implementation of class_conformsToProtocol() which automatically looks up the protocol in superclasses (unlike the Apple and GNU Objective-C runtime ones). */ return class_conformsToProtocol(self, aProtocol); #endif } /** * Returns a flag to say whether the class of the receiver conforms * to aProtocol. */ - (BOOL) conformsToProtocol: (Protocol*)aProtocol { return [[self class] conformsToProtocol: aProtocol]; } /** * Returns a pointer to the C function implementing the method used * to respond to messages with aSelector by instances of the receiving * class. *
Raises NSInvalidArgumentException if given a null selector. */ + (IMP) instanceMethodForSelector: (SEL)aSelector { if (aSelector == 0) [NSException raise: NSInvalidArgumentException format: @"%@ null selector given", NSStringFromSelector(_cmd)]; /* * Since 'self' is an class, class_getMethodImplementation() will get * the instance method. */ return class_getMethodImplementation((Class)self, aSelector); } /** * Returns a pointer to the C function implementing the method used * to respond to messages with aSelector. *
Raises NSInvalidArgumentException if given a null selector. */ - (IMP) methodForSelector: (SEL)aSelector { if (aSelector == 0) [NSException raise: NSInvalidArgumentException format: @"%@ null selector given", NSStringFromSelector(_cmd)]; /* The Apple runtime API would do: * return class_getMethodImplementation(object_getClass(self), aSelector); * but this cannot ask self for information about any method reached by * forwarding, so the returned forwarding function would ge a generic one * rather than one aware of hardware issues with returning structures * and floating points. We therefore prefer the GNU API which is able to * use forwarding callbacks to get better type information. */ return objc_msg_lookup(self, aSelector); } /** * Returns a pointer to the C function implementing the method used * to respond to messages with aSelector which are sent to instances * of the receiving class. *
Raises NSInvalidArgumentException if given a null selector. */ + (NSMethodSignature*) instanceMethodSignatureForSelector: (SEL)aSelector { struct objc_method *mth; if (aSelector == 0) [NSException raise: NSInvalidArgumentException format: @"%@ null selector given", NSStringFromSelector(_cmd)]; mth = GSGetMethod(self, aSelector, YES, YES); if (0 == mth) return nil; return [NSMethodSignature signatureWithObjCTypes: method_getTypeEncoding(mth)]; } /** * Returns the method signature describing how the receiver would handle * a message with aSelector. *
Returns nil if given a null selector. */ - (NSMethodSignature*) methodSignatureForSelector: (SEL)aSelector { const char *types = NULL; Class c; unsigned int count; Protocol **protocols; if (0 == aSelector) { return nil; } c = object_getClass(self); /* Do a fast lookup to see if the method is implemented at all. If it isn't, * we can give up without doing a very expensive linear search through every * method list in the class hierarchy. */ if (!class_respondsToSelector(c, aSelector)) { return nil; // Method not implemented } /* If there are protocols that this class conforms to, * the method may be listed in a protocol with more * detailed type information than in the class itself * and we must therefore use the information from the * protocol. * This is because protocols also carry information * used by the Distributed Objects system, which the * runtime does not maintain in classes. */ protocols = class_copyProtocolList(c, &count); if (NULL != protocols) { struct objc_method_description mth; int i; for (i = 0 ; i < count ; i++) { mth = GSProtocolGetMethodDescriptionRecursive(protocols[i], aSelector, YES, YES); if (NULL == mth.types) { // Search for class method mth = GSProtocolGetMethodDescriptionRecursive(protocols[i], aSelector, YES, NO); // FIXME: We should probably search optional methods here too. } if (NULL != mth.types) { break; } } free(protocols); } if (types == 0) { #ifdef __GNUSTEP_RUNTIME__ struct objc_slot *objc_get_slot(Class cls, SEL selector); struct objc_slot *slot = objc_get_slot(object_getClass(self), aSelector); types = slot->types; #else struct objc_method *mth; if (GSObjCIsInstance(self)) { mth = GSGetMethod(object_getClass(self), aSelector, YES, YES); } else { mth = GSGetMethod((Class)self, aSelector, NO, YES); } types = method_getTypeEncoding (mth); #endif } if (types == 0) { return nil; } return [NSMethodSignature signatureWithObjCTypes: types]; } /** * Returns a string describing the receiver. The default implementation * gives the class and memory location of the receiver. */ - (NSString*) description { return [NSString stringWithFormat: @"<%s: %p>", class_getName([self class]), self]; } /** * Returns a string describing the receiving class. The default implementation * gives the name of the class by calling NSStringFromClass(). */ + (NSString*) description { return NSStringFromClass(self); } /** * Sets up the ObjC runtime so that the receiver is used wherever code * calls for aClassObject to be used. */ + (void) poseAsClass: (Class)aClassObject { [NSException raise: NSInternalInconsistencyException format: @"Class posing is not supported"]; } /** * Raises an invalid argument exception providing information about * the receivers inability to handle aSelector. */ - (void) doesNotRecognizeSelector: (SEL)aSelector { [NSException raise: NSInvalidArgumentException format: @"%s(%s) does not recognize %s", GSClassNameFromObject(self), GSObjCIsInstance(self) ? "instance" : "class", aSelector ? sel_getName(aSelector) : "(null)"]; } /** * This method is called automatically to handle a message sent to * the receiver for which the receivers class has no method.
* The default implementation calls -doesNotRecognizeSelector: */ - (void) forwardInvocation: (NSInvocation*)anInvocation { id target = [self forwardingTargetForSelector: [anInvocation selector]]; if (nil != target) { [anInvocation invokeWithTarget: target]; return; } [self doesNotRecognizeSelector: [anInvocation selector]]; return; } /** * Called after the receiver has been created by decoding some sort * of archive. Returns self. Subclasses may override this to perform * some special initialisation upon being decoded. */ - (id) awakeAfterUsingCoder: (NSCoder*)aDecoder { return self; } // FIXME - should this be added (as in OS X) now that we have NSKeyedArchiver? // - (Class) classForKeyedArchiver // { // return [self classForArchiver]; // } /** * Override to substitute class when an instance is being archived by an * [NSArchiver]. Default implementation returns -classForCoder. */ - (Class) classForArchiver { return [self classForCoder]; } /** * Override to substitute class when an instance is being serialized by an * [NSCoder]. Default implementation returns [self class] (no * substitution). */ - (Class) classForCoder { return [self class]; } // FIXME - should this be added (as in OS X) now that we have NSKeyedArchiver? // - (id) replacementObjectForKeyedArchiver: (NSKeyedArchiver *)keyedArchiver // { // return [self replacementObjectForCoder: (NSArchiver *)keyedArchiver]; // } /** * Override to substitute another object for this instance when being archived * by given [NSArchiver]. Default implementation returns * -replacementObjectForCoder:. */ - (id) replacementObjectForArchiver: (NSArchiver*)anArchiver { return [self replacementObjectForCoder: (NSCoder*)anArchiver]; } /** * Override to substitute another object for this instance when being * serialized by given [NSCoder]. Default implementation returns * self. */ - (id) replacementObjectForCoder: (NSCoder*)anEncoder { return self; } /* NSObject protocol */ /** * Adds the receiver to the current autorelease pool, so that it will be * sent a -release message when the pool is destroyed.
* Returns the receiver.
* In GNUstep, the [NSObject+enableDoubleReleaseCheck:] method may be used * to turn on checking for retain/release errors in this method. */ - (id) autorelease { if (double_release_check_enabled) { NSUInteger release_count; NSUInteger retain_count = [self retainCount]; release_count = [autorelease_class autoreleaseCountForObject:self]; if (release_count > retain_count) [NSException raise: NSGenericException format: @"Autorelease would release object too many times.\n" @"%"PRIuPTR" release(s) versus %"PRIuPTR" retain(s)", release_count, retain_count]; } (*autorelease_imp)(autorelease_class, autorelease_sel, self); return self; } /** * Dummy method returning the receiver. */ + (id) autorelease { return self; } /** * Returns the receiver. */ + (Class) class { return self; } /** * Returns the hash of the receiver. Subclasses should ensure that their * implementations of this method obey the rule that if the -isEqual: method * returns YES for two instances of the class, the -hash method returns the * same value for both instances.
* The default implementation returns a value based on the address * of the instance. */ - (NSUInteger) hash { /* * malloc() must return pointers aligned to point to any data type */ #define MAXALIGN (__alignof__(_Complex long double)) static int shift = MAXALIGN==16 ? 4 : (MAXALIGN==8 ? 3 : 2); /* We shift left to lose any zero bits produced by the * alignment of the object in memory. */ return (NSUInteger)((uintptr_t)self >> shift); } /** * Tests anObject and the receiver for equality. The default implementation * considers two objects to be equal only if they are the same object * (ie occupy the same memory location).
* If a subclass overrides this method, it should also override the -hash * method so that if two objects are equal they both have the same hash. */ - (BOOL) isEqual: (id)anObject { return (self == anObject); } /** * Returns YES if aClass is the NSObject class */ + (BOOL) isKindOfClass: (Class)aClass { if (aClass == [NSObject class]) return YES; return NO; } /** * Returns YES if the class of the receiver is either the same as aClass * or is derived from (a subclass of) aClass. */ - (BOOL) isKindOfClass: (Class)aClass { Class class = object_getClass(self); return GSObjCIsKindOf(class, aClass); } /** * Returns YES if aClass is the same as the receiving class. */ + (BOOL) isMemberOfClass: (Class)aClass { return (self == aClass) ? YES : NO; } /** * Returns YES if the class of the receiver is aClass */ - (BOOL) isMemberOfClass: (Class)aClass { return ([self class] == aClass) ? YES : NO; } /** * Returns a flag to differentiate between 'true' objects, and objects * which are proxies for other objects (ie they forward messages to the * other objects).
* The default implementation returns NO. */ - (BOOL) isProxy { return NO; } /** * Returns YES if the receiver is aClass or a subclass of aClass. */ + (BOOL) isSubclassOfClass: (Class)aClass { return GSObjCIsKindOf(self, aClass); } /** * Causes the receiver to execute the method implementation corresponding * to aSelector and returns the result.
* The method must be one which takes no arguments and returns an object. *
Raises NSInvalidArgumentException if given a null selector. */ - (id) performSelector: (SEL)aSelector { IMP msg; if (aSelector == 0) [NSException raise: NSInvalidArgumentException format: @"%@ null selector given", NSStringFromSelector(_cmd)]; /* The Apple runtime API would do: * msg = class_getMethodImplementation(object_getClass(self), aSelector); * but this cannot ask self for information about any method reached by * forwarding, so the returned forwarding function would ge a generic one * rather than one aware of hardware issues with returning structures * and floating points. We therefore prefer the GNU API which is able to * use forwarding callbacks to get better type information. */ msg = objc_msg_lookup(self, aSelector); if (!msg) { [NSException raise: NSGenericException format: @"invalid selector '%s' passed to %s", sel_getName(aSelector), sel_getName(_cmd)]; return nil; } return (*msg)(self, aSelector); } /** * Causes the receiver to execute the method implementation corresponding * to aSelector and returns the result.
* The method must be one which takes one argument and returns an object. *
Raises NSInvalidArgumentException if given a null selector. */ - (id) performSelector: (SEL)aSelector withObject: (id)anObject { IMP msg; if (aSelector == 0) [NSException raise: NSInvalidArgumentException format: @"%@ null selector given", NSStringFromSelector(_cmd)]; /* The Apple runtime API would do: * msg = class_getMethodImplementation(object_getClass(self), aSelector); * but this cannot ask self for information about any method reached by * forwarding, so the returned forwarding function would be a generic one * rather than one aware of hardware issues with returning structures * and floating points. We therefore prefer the GNU API which is able to * use forwarding callbacks to get better type information. */ msg = objc_msg_lookup(self, aSelector); if (!msg) { [NSException raise: NSGenericException format: @"invalid selector '%s' passed to %s", sel_getName(aSelector), sel_getName(_cmd)]; return nil; } return (*msg)(self, aSelector, anObject); } /** * Causes the receiver to execute the method implementation corresponding * to aSelector and returns the result.
* The method must be one which takes two arguments and returns an object. *
Raises NSInvalidArgumentException if given a null selector. */ - (id) performSelector: (SEL)aSelector withObject: (id) object1 withObject: (id) object2 { IMP msg; if (aSelector == 0) [NSException raise: NSInvalidArgumentException format: @"%@ null selector given", NSStringFromSelector(_cmd)]; /* The Apple runtime API would do: * msg = class_getMethodImplementation(object_getClass(self), aSelector); * but this cannot ask self for information about any method reached by * forwarding, so the returned forwarding function would ge a generic one * rather than one aware of hardware issues with returning structures * and floating points. We therefore prefer the GNU API which is able to * use forwarding callbacks to get better type information. */ msg = objc_msg_lookup(self, aSelector); if (!msg) { [NSException raise: NSGenericException format: @"invalid selector '%s' passed to %s", sel_getName(aSelector), sel_getName(_cmd)]; return nil; } return (*msg)(self, aSelector, object1, object2); } /** * Decrements the retain count for the receiver if greater than zero, * otherwise calls the dealloc method instead.
* The default implementation calls the NSDecrementExtraRefCountWasZero() * function to test the extra reference count for the receiver (and * decrement it if non-zero) - if the extra reference count is zero then * the retain count is one, and the dealloc method is called.
* In GNUstep, the [NSObject+enableDoubleReleaseCheck:] method may be used * to turn on checking for ratain/release errors in this method. */ - (oneway void) release { release_fast(self); } /** * The class implementation of the release method is a dummy method * having no effect. It is present so that class objects can be stored * in containers (such as NSArray) which will send them retain and * release messages. */ + (oneway void) release { return; } /** * Returns a flag to say if the receiver will * respond to the specified selector. This ignores situations * where a subclass implements -forwardInvocation: to respond to * selectors not normally handled ... in these cases the subclass * may override this method to handle it. *
If given a null selector, raises NSInvalidArgumentException when * in MacOS-X compatibility more, or returns NO otherwise. */ - (BOOL) respondsToSelector: (SEL)aSelector { Class cls = object_getClass(self); if (aSelector == 0) { if (GSPrivateDefaultsFlag(GSMacOSXCompatible)) { [NSException raise: NSInvalidArgumentException format: @"%@ null selector given", NSStringFromSelector(_cmd)]; } return NO; } if (class_respondsToSelector(cls, aSelector)) { return YES; } if (class_isMetaClass(cls)) { return [(Class)self resolveClassMethod: aSelector]; } else { return [cls resolveInstanceMethod: aSelector]; } } /** * Increments the reference count and returns the receiver.
* The default implementation does this by calling NSIncrementExtraRefCount() */ - (id) retain { return retain_fast(self); } /** * The class implementation of the retain method is a dummy method * having no effect. It is present so that class objects can be stored * in containers (such as NSArray) which will send them retain and * release messages. */ + (id) retain { return self; } /** * Returns the reference count for the receiver. Each instance has an * implicit reference count of 1, and has an 'extra reference count' * returned by the NSExtraRefCount() function, so the value returned by * this method is always greater than zero.
* By convention, objects which should (or can) never be deallocated * return the maximum unsigned integer value. */ - (NSUInteger) retainCount { return getRetainCount(self); } /** * The class implementation of the retainCount method always returns * the maximum unsigned integer value, as classes can not be deallocated * the retain count mechanism is a dummy system for them. */ + (NSUInteger) retainCount { return UINT_MAX; } /** * Returns the receiver. */ - (id) self { return self; } /** * Returns the memory allocation zone in which the receiver is located. */ - (NSZone*) zone { return NSZoneFromPointer(self); } + (NSZone *) zone { return NSDefaultMallocZone(); } /** * Called to encode the instance variables of the receiver to aCoder.
* Subclasses should call the superclass method at the start of their * own implementation. */ - (void) encodeWithCoder: (NSCoder*)aCoder { return; } /** * Called to intialise instance variables of the receiver from aDecoder.
* Subclasses should call the superclass method at the start of their * own implementation. */ - (id) initWithCoder: (NSCoder*)aDecoder { return self; } + (BOOL) resolveClassMethod: (SEL)name { return NO; } + (BOOL) resolveInstanceMethod: (SEL)name { return NO; } /** * Sets the version number of the receiving class. Should be nonnegative. */ + (id) setVersion: (NSInteger)aVersion { if (aVersion < 0) [NSException raise: NSInvalidArgumentException format: @"%s +setVersion: may not set a negative version", GSClassNameFromObject(self)]; class_setVersion(self, aVersion); return self; } /** * Returns the version number of the receiving class. This will default to * a number assigned by the Objective C compiler if [NSObject -setVersion] has * not been called. */ + (NSInteger) version { return class_getVersion(self); } - (id) autoContentAccessingProxy { return AUTORELEASE([[GSContentAccessingProxy alloc] initWithObject: self]); } - (id) forwardingTargetForSelector:(SEL)aSelector { return nil; } @end /** * Methods for compatibility with the NEXTSTEP (pre-OpenStep) 'Object' class. */ @implementation NSObject (NEXTSTEP) /* NEXTSTEP Object class compatibility */ /** * Logs a message. Deprecated. Use NSLog() in new code. */ - (id) error: (const char *)aString, ... { #define FMT "error: %s (%s)\n%s\n" char fmt[(strlen((char*)FMT)+strlen((char*)GSClassNameFromObject(self)) +((aString!=NULL)?strlen((char*)aString):0)+8)]; va_list ap; snprintf(fmt, sizeof(fmt), FMT, GSClassNameFromObject(self), GSObjCIsInstance(self) ? "instance" : "class", (aString != NULL) ? aString : ""); va_start(ap, aString); vfprintf (stderr, fmt, ap); abort (); va_end(ap); #undef FMT return nil; } /* - (const char *) name { return GSClassNameFromObject(self); } */ - (BOOL) isKindOf: (Class)aClassObject { return [self isKindOfClass: aClassObject]; } - (BOOL) isMemberOf: (Class)aClassObject { return [self isMemberOfClass: aClassObject]; } + (BOOL) instancesRespondTo: (SEL)aSel { return [self instancesRespondToSelector: aSel]; } - (BOOL) respondsTo: (SEL)aSel { return [self respondsToSelector: aSel]; } + (BOOL) conformsTo: (Protocol*)aProtocol { return [self conformsToProtocol: aProtocol]; } - (BOOL) conformsTo: (Protocol*)aProtocol { return [self conformsToProtocol: aProtocol]; } + (IMP) instanceMethodFor: (SEL)aSel { return [self instanceMethodForSelector:aSel]; } - (IMP) methodFor: (SEL)aSel { return [self methodForSelector: aSel]; } + (id) poseAs: (Class)aClassObject { [self poseAsClass: aClassObject]; return self; } - (id) doesNotRecognize: (SEL)aSel { [NSException raise: NSGenericException format: @"%s(%s) does not recognize %s", GSClassNameFromObject(self), GSObjCIsInstance(self) ? "instance" : "class", aSel ? sel_getName(aSel) : "(null)"]; return nil; } - (id) perform: (SEL)sel with: (id)anObject { return [self performSelector: sel withObject: anObject]; } - (id) perform: (SEL)sel with: (id)anObject with: (id)anotherObject { return [self performSelector: sel withObject: anObject withObject: anotherObject]; } @end /** * Some non-standard extensions mainly needed for backwards compatibility * and internal utility reasons. */ @implementation NSObject (GNUstep) /** * Enables runtime checking of retain/release/autorelease operations.
*

Whenever either -autorelease or -release is called, the contents of any * autorelease pools will be checked to see if there are more outstanding * release operations than the objects retain count. In which case an * exception is raised to say that the object is released too many times. *

*

Beware, since this feature entails examining all active * autorelease pools every time an object is released or autoreleased, it * can cause a massive performance degradation ... it should only be enabled * for debugging. *

*

* When you are having memory allocation problems, it may make more sense * to look at the memory allocation debugging functions documented in * NSDebug.h, or use the NSZombie features. *

*/ + (void) enableDoubleReleaseCheck: (BOOL)enable { double_release_check_enabled = enable; } /** * The default (NSObject) implementation of this method simply calls * the -description method and discards the locale * information. */ - (NSString*) descriptionWithLocale: (id)aLocale { return [self description]; } + (NSString*) descriptionWithLocale: (id)aLocale { return [self description]; } /** * The default (NSObject) implementation of this method simply calls * the -descriptionWithLocale: method and discards the * level information. */ - (NSString*) descriptionWithLocale: (id)aLocale indent: (NSUInteger)level { return [self descriptionWithLocale: aLocale]; } + (NSString*) descriptionWithLocale: (id)aLocale indent: (NSUInteger)level { return [self descriptionWithLocale: aLocale]; } - (BOOL) _dealloc { return YES; } - (BOOL) isMetaClass { return NO; } - (BOOL) isClass { return class_isMetaClass(object_getClass(self)); } - (BOOL) isMemberOfClassNamed: (const char*)aClassName { return ((aClassName!=NULL) &&!strcmp(class_getName(object_getClass(self)), aClassName)); } + (struct objc_method_description *) descriptionForInstanceMethod: (SEL)aSel { if (aSel == 0) [NSException raise: NSInvalidArgumentException format: @"%@ null selector given", NSStringFromSelector(_cmd)]; return ((struct objc_method_description *) GSGetMethod(self, aSel, YES, YES)); } - (struct objc_method_description *) descriptionForMethod: (SEL)aSel { if (aSel == 0) [NSException raise: NSInvalidArgumentException format: @"%@ null selector given", NSStringFromSelector(_cmd)]; return ((struct objc_method_description *) GSGetMethod((GSObjCIsInstance(self) ? object_getClass(self) : (Class)self), aSel, GSObjCIsInstance(self), YES)); } + (NSInteger) streamVersion: (void*)aStream { GSOnceMLog(@"[NSObject+streamVersion:] is deprecated ... do not use"); return class_getVersion (self); } - (id) read: (void*)aStream { GSOnceMLog(@"[NSObject-read:] is deprecated ... do not use"); return self; } - (id) write: (void*)aStream { GSOnceMLog(@"[NSObject-write:] is deprecated ... do not use"); return self; } - (id) awake { GSOnceMLog(@"[NSObject-awake] is deprecated ... do not use"); return self; } @end @implementation NSZombie - (Class) class { return object_getClass(self); } - (Class) originalClass { Class c = Nil; if (0 != zombieMap) { GS_MUTEX_LOCK(allocationLock); if (0 != zombieMap) { c = NSMapGet(zombieMap, (void*)self); } GS_MUTEX_UNLOCK(allocationLock); } return c; } - (void) forwardInvocation: (NSInvocation*)anInvocation { NSUInteger size = [[anInvocation methodSignature] methodReturnLength]; unsigned char v[size]; memset(v, '\0', size); GSLogZombie(self, [anInvocation selector]); [anInvocation setReturnValue: (void*)v]; return; } - (NSMethodSignature*) methodSignatureForSelector: (SEL)aSelector { Class c; if (0 == aSelector) { return nil; } GS_MUTEX_LOCK(allocationLock); c = zombieMap ? NSMapGet(zombieMap, (void*)self) : Nil; GS_MUTEX_UNLOCK(allocationLock); return [c instanceMethodSignatureForSelector: aSelector]; } @end @implementation GSContentAccessingProxy - (void) dealloc { [object endContentAccess]; [super dealloc]; } - (void) finalize { [object endContentAccess]; } - (id) forwardingTargetForSelector: (SEL)aSelector { return object; } /* Support for legacy runtimes... */ - (void) forwardInvocation: (NSInvocation*)anInvocation { [anInvocation invokeWithTarget: object]; } - (id) initWithObject: (id)anObject { ASSIGN(object, anObject); [object beginContentAccess]; return self; } - (NSMethodSignature*) methodSignatureForSelector: (SEL)aSelector { return [object methodSignatureForSelector: aSelector]; } @end NSUInteger GSPrivateMemorySize(NSObject *self, NSHashTable *exclude) { if (0 == NSHashGet(exclude, self)) { NSHashInsert(exclude, self); return class_getInstanceSize(object_getClass(self)); } return 0; } @implementation NSObject (MemoryFootprint) + (NSUInteger) contentSizeOf: (NSObject*)obj excluding: (NSHashTable*)exclude { Class cls = object_getClass(obj); NSUInteger size = 0; while (cls != Nil) { unsigned count; Ivar *vars; if (0 != (vars = class_copyIvarList(cls, &count))) { while (count-- > 0) { const char *type = ivar_getTypeEncoding(vars[count]); type = GSSkipTypeQualifierAndLayoutInfo(type); if ('@' == *type) { NSObject *content = object_getIvar(obj, vars[count]); if (content != nil) { size += [content sizeInBytesExcluding: exclude]; } } } free(vars); } cls = class_getSuperclass(cls); } return size; } + (NSUInteger) sizeInBytes { return 0; } + (NSUInteger) sizeInBytesExcluding: (NSHashTable*)exclude { return 0; } + (NSUInteger) sizeOfContentExcluding: (NSHashTable*)exclude { return 0; } - (NSUInteger) sizeInBytes { NSUInteger bytes; NSHashTable *exclude; exclude = NSCreateHashTable(NSNonOwnedPointerHashCallBacks, 0); bytes = [self sizeInBytesExcluding: exclude]; NSFreeHashTable(exclude); return bytes; } - (NSUInteger) sizeInBytesExcluding: (NSHashTable*)exclude { if (0 == NSHashGet(exclude, self)) { NSUInteger size = [self sizeOfInstance]; NSHashInsert(exclude, self); if (size > 0) { size += [self sizeOfContentExcluding: exclude]; } return size; } return 0; } - (NSUInteger) sizeOfContentExcluding: (NSHashTable*)exclude { return 0; } - (NSUInteger) sizeOfInstance { NSUInteger size; #if GS_SIZEOF_VOIDP > 4 NSUInteger u = (NSUInteger)self; if (u & 0x07) { return 0; // Small object has no size } #endif #if HAVE_MALLOC_USABLE_SIZE size = malloc_usable_size((void*)self - sizeof(intptr_t)); #else size = class_getInstanceSize(object_getClass(self)); #endif return size; } @end gnustep-base-1.29.0/Source/NSObjectScripting.m000066400000000000000000000020051435650067400211570ustar00rootroot00000000000000/* Implementation of class NSObjectScripting Copyright (C) 2019 Free Software Foundation, Inc. By: heron Date: Fri Nov 1 00:25:37 EDT 2019 This file is part of the GNUstep Library. 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 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 USA. */ #include @implementation NSObjectScripting @end gnustep-base-1.29.0/Source/NSOperation.m000066400000000000000000000676471435650067400200550ustar00rootroot00000000000000/**Implementation for NSOperation for GNUStep Copyright (C) 2009,2010 Free Software Foundation, Inc. Written by: Gregory Casamento Written by: Richard Frith-Macdonald Date: 2009,2010 This file is part of the GNUstep Base Library. 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 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 USA. NSOperation class reference $Date: 2008-06-08 11:38:33 +0100 (Sun, 08 Jun 2008) $ $Revision: 26606 $ */ #import "common.h" #import "Foundation/NSLock.h" #define GS_NSOperation_IVARS \ NSRecursiveLock *lock; \ NSConditionLock *cond; \ NSOperationQueuePriority priority; \ double threadPriority; \ BOOL cancelled; \ BOOL concurrent; \ BOOL executing; \ BOOL finished; \ BOOL blocked; \ BOOL ready; \ NSMutableArray *dependencies; \ id completionBlock; #define GS_NSOperationQueue_IVARS \ NSRecursiveLock *lock; \ NSConditionLock *cond; \ NSMutableArray *operations; \ NSMutableArray *waiting; \ NSMutableArray *starting; \ NSString *name; \ BOOL suspended; \ NSInteger executing; \ NSInteger threadCount; \ NSInteger maxThreads; #import "Foundation/NSOperation.h" #import "Foundation/NSArray.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSException.h" #import "Foundation/NSKeyValueObserving.h" #import "Foundation/NSThread.h" #import "GNUstepBase/NSArray+GNUstepBase.h" #import "GSPrivate.h" #define GSInternal NSOperationInternal #include "GSInternal.h" GS_PRIVATE_INTERNAL(NSOperation) static void *isFinishedCtxt = (void*)"isFinished"; static void *isReadyCtxt = (void*)"isReady"; static void *queuePriorityCtxt = (void*)"queuePriority"; static NSArray *empty = nil; @interface NSOperation (Private) - (void) _finish; - (void) _updateReadyState; @end @implementation NSOperation + (BOOL) automaticallyNotifiesObserversForKey: (NSString*)theKey { /* Handle all KVO manually */ return NO; } + (void) initialize { empty = [NSArray new]; RELEASE([NSObject leakAt: &empty]); } - (void) addDependency: (NSOperation *)op { if (NO == [op isKindOfClass: [NSOperation class]]) { [NSException raise: NSInvalidArgumentException format: @"[%@-%@] dependency is not an NSOperation", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; } if (op == self) { [NSException raise: NSInvalidArgumentException format: @"[%@-%@] attempt to add dependency on self", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; } [internal->lock lock]; if (internal->dependencies == nil) { internal->dependencies = [[NSMutableArray alloc] initWithCapacity: 5]; } NS_DURING { if (NSNotFound == [internal->dependencies indexOfObjectIdenticalTo: op]) { [self willChangeValueForKey: @"dependencies"]; [internal->dependencies addObject: op]; /* We only need to watch for changes if it's possible for them to * happen and make a difference. */ if (NO == [op isFinished] && NO == [self isCancelled] && NO == [self isExecuting] && NO == [self isFinished]) { /* Can change readiness if we are neither cancelled nor * executing nor finished. So we need to observe for the * finish of the dependency. */ [op addObserver: self forKeyPath: @"isFinished" options: NSKeyValueObservingOptionNew context: isFinishedCtxt]; if (internal->ready == YES) { /* The new dependency stops us being ready ... * change state. */ [self willChangeValueForKey: @"isReady"]; internal->ready = NO; [self didChangeValueForKey: @"isReady"]; } } [self didChangeValueForKey: @"dependencies"]; } } NS_HANDLER { [internal->lock unlock]; NSLog(@"Problem adding dependency: %@", localException); return; } NS_ENDHANDLER [internal->lock unlock]; } - (void) cancel { if (NO == internal->cancelled && NO == [self isFinished]) { [internal->lock lock]; if (NO == internal->cancelled && NO == [self isFinished]) { NS_DURING { [self willChangeValueForKey: @"isCancelled"]; internal->cancelled = YES; if (NO == internal->ready) { [self willChangeValueForKey: @"isReady"]; internal->ready = YES; [self didChangeValueForKey: @"isReady"]; } [self didChangeValueForKey: @"isCancelled"]; } NS_HANDLER { [internal->lock unlock]; NSLog(@"Problem cancelling operation: %@", localException); return; } NS_ENDHANDLER } [internal->lock unlock]; } } - (GSOperationCompletionBlock) completionBlock { return (GSOperationCompletionBlock)internal->completionBlock; } - (void) dealloc { if (internal != nil) { NSOperation *op; if (!internal->finished) { [self removeObserver: self forKeyPath: @"isFinished"]; } while ((op = [internal->dependencies lastObject]) != nil) { [self removeDependency: op]; } RELEASE(internal->dependencies); RELEASE(internal->cond); RELEASE(internal->lock); RELEASE(internal->completionBlock); GS_DESTROY_INTERNAL(NSOperation); } [super dealloc]; } - (NSArray *) dependencies { NSArray *a; if (internal->dependencies == nil) { a = empty; // OSX return an empty array } else { [internal->lock lock]; a = [NSArray arrayWithArray: internal->dependencies]; [internal->lock unlock]; } return a; } - (id) init { if ((self = [super init]) != nil) { GS_CREATE_INTERNAL(NSOperation); internal->priority = NSOperationQueuePriorityNormal; internal->threadPriority = 0.5; internal->ready = YES; internal->lock = [NSRecursiveLock new]; [internal->lock setName: [NSString stringWithFormat: @"lock-for-opqueue-%p", self]]; internal->cond = [[NSConditionLock alloc] initWithCondition: 0]; [internal->cond setName: [NSString stringWithFormat: @"cond-for-opqueue-%p", self]]; [self addObserver: self forKeyPath: @"isFinished" options: NSKeyValueObservingOptionNew context: isFinishedCtxt]; } return self; } - (BOOL) isCancelled { return internal->cancelled; } - (BOOL) isExecuting { return internal->executing; } - (BOOL) isFinished { return internal->finished; } - (BOOL) isConcurrent { return internal->concurrent; } - (BOOL) isReady { return internal->ready; } - (void) main; { return; // OSX default implementation does nothing } - (void) observeValueForKeyPath: (NSString *)keyPath ofObject: (id)object change: (NSDictionary *)change context: (void *)context { NSOperation *op = object; if (NO == [op isFinished]) { return; } if (object == self) { [internal->lock lock]; /* We only observe isFinished changes, and we can remove self as an * observer once we know the operation has finished since it can never * become unfinished. */ [object removeObserver: self forKeyPath: @"isFinished"]; /* Concurrent operations: Call completion block and set internal finished * state so we don't try removing the observer again in -dealloc. */ if (YES == [self isConcurrent]) { internal->finished = YES; CALL_BLOCK_NO_ARGS( ((GSOperationCompletionBlock)internal->completionBlock)); } /* We have finished and need to unlock the condition lock so that * any waiting thread can continue. */ [internal->cond lock]; [internal->cond unlockWithCondition: 1]; [internal->lock unlock]; } else { /* Some dependency has finished ... */ [self _updateReadyState]; } } - (NSOperationQueuePriority) queuePriority { return internal->priority; } - (void) removeDependency: (NSOperation *)op { [internal->lock lock]; NS_DURING { if (NSNotFound != [internal->dependencies indexOfObjectIdenticalTo: op]) { [op removeObserver: self forKeyPath: @"isFinished"]; [self willChangeValueForKey: @"dependencies"]; [internal->dependencies removeObject: op]; if (NO == internal->ready) { /* The dependency may cause us to become ready ... */ [self _updateReadyState]; } [self didChangeValueForKey: @"dependencies"]; } } NS_HANDLER { [internal->lock unlock]; NSLog(@"Problem removing dependency: %@", localException); return; } NS_ENDHANDLER [internal->lock unlock]; } - (void) setCompletionBlock: (GSOperationCompletionBlock)aBlock { ASSIGNCOPY(internal->completionBlock, (id)aBlock); } - (void) setQueuePriority: (NSOperationQueuePriority)pri { if (pri <= NSOperationQueuePriorityVeryLow) pri = NSOperationQueuePriorityVeryLow; else if (pri <= NSOperationQueuePriorityLow) pri = NSOperationQueuePriorityLow; else if (pri < NSOperationQueuePriorityHigh) pri = NSOperationQueuePriorityNormal; else if (pri < NSOperationQueuePriorityVeryHigh) pri = NSOperationQueuePriorityHigh; else pri = NSOperationQueuePriorityVeryHigh; if (pri != internal->priority) { [internal->lock lock]; if (pri != internal->priority) { NS_DURING { [self willChangeValueForKey: @"queuePriority"]; internal->priority = pri; [self didChangeValueForKey: @"queuePriority"]; } NS_HANDLER { [internal->lock unlock]; NSLog(@"Problem setting priority: %@", localException); return; } NS_ENDHANDLER } [internal->lock unlock]; } } - (void) setThreadPriority: (double)pri { if (pri > 1) pri = 1; else if (pri < 0) pri = 0; internal->threadPriority = pri; } - (void) start { ENTER_POOL double prio = [NSThread threadPriority]; AUTORELEASE(RETAIN(self)); // Make sure we exist while running. [internal->lock lock]; NS_DURING { if (YES == [self isExecuting]) { [NSException raise: NSInvalidArgumentException format: @"[%@-%@] called on executing operation", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; } if (YES == [self isFinished]) { [NSException raise: NSInvalidArgumentException format: @"[%@-%@] called on finished operation", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; } if (NO == [self isReady]) { [NSException raise: NSInvalidArgumentException format: @"[%@-%@] called on operation which is not ready", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; } if (NO == internal->executing) { [self willChangeValueForKey: @"isExecuting"]; internal->executing = YES; [self didChangeValueForKey: @"isExecuting"]; } } NS_HANDLER { [internal->lock unlock]; [localException raise]; } NS_ENDHANDLER [internal->lock unlock]; NS_DURING { if (NO == [self isCancelled]) { [NSThread setThreadPriority: internal->threadPriority]; [self main]; } } NS_HANDLER { [NSThread setThreadPriority: prio]; [localException raise]; } NS_ENDHANDLER; [self _finish]; LEAVE_POOL } - (double) threadPriority { return internal->threadPriority; } - (void) waitUntilFinished { [internal->cond lockWhenCondition: 1]; // Wait for finish [internal->cond unlockWithCondition: 1]; // Signal any other watchers } @end @implementation NSOperation (Private) /* NB code calling this method must ensure that the receiver is retained * until after the method returns. */ - (void) _finish { [internal->lock lock]; if (NO == internal->finished) { if (YES == internal->executing) { [self willChangeValueForKey: @"isExecuting"]; [self willChangeValueForKey: @"isFinished"]; internal->executing = NO; internal->finished = YES; [self didChangeValueForKey: @"isFinished"]; [self didChangeValueForKey: @"isExecuting"]; } else { [self willChangeValueForKey: @"isFinished"]; internal->finished = YES; [self didChangeValueForKey: @"isFinished"]; } CALL_BLOCK_NO_ARGS( ((GSOperationCompletionBlock)internal->completionBlock)); } [internal->lock unlock]; } - (void) _updateReadyState { [internal->lock lock]; if (NO == internal->ready) { NSEnumerator *en; NSOperation *op; /* After a dependency has finished or was removed we need to check * to see if we are now ready. * This is protected by locks so that an update due to an observed * change in one thread won't interrupt anything in another thread. */ en = [internal->dependencies objectEnumerator]; while ((op = [en nextObject]) != nil) { if (NO == [op isFinished]) break; } if (op == nil) { [self willChangeValueForKey: @"isReady"]; internal->ready = YES; [self didChangeValueForKey: @"isReady"]; } } [internal->lock unlock]; } @end @implementation NSBlockOperation + (instancetype) blockOperationWithBlock: (GSBlockOperationBlock)block { NSBlockOperation *op = [[self alloc] init]; [op addExecutionBlock: block]; return AUTORELEASE(op); } - (void) addExecutionBlock: (GSBlockOperationBlock)block { id blockCopy = (id)Block_copy(block); [_executionBlocks addObject: blockCopy]; RELEASE(blockCopy); } - (void) dealloc { RELEASE(_executionBlocks); [super dealloc]; } - (NSArray *) executionBlocks { return _executionBlocks; } - (id) init { self = [super init]; if (self != nil) { _executionBlocks = [[NSMutableArray alloc] initWithCapacity: 1]; } return self; } - (void) main { NSEnumerator *en = [[self executionBlocks] objectEnumerator]; GSBlockOperationBlock theBlock; while ((theBlock = (GSBlockOperationBlock)[en nextObject]) != NULL) { CALL_NON_NULL_BLOCK_NO_ARGS(theBlock); } } @end #undef GSInternal #define GSInternal NSOperationQueueInternal #include "GSInternal.h" GS_PRIVATE_INTERNAL(NSOperationQueue) @interface NSOperationQueue (Private) - (void) _execute; - (void) _thread; - (void) observeValueForKeyPath: (NSString *)keyPath ofObject: (id)object change: (NSDictionary *)change context: (void *)context; @end static NSInteger maxConcurrent = 8; // Thread pool size static NSComparisonResult sortFunc(id o1, id o2, void *ctxt) { NSOperationQueuePriority p1 = [o1 queuePriority]; NSOperationQueuePriority p2 = [o2 queuePriority]; if (p1 < p2) return NSOrderedDescending; if (p1 > p2) return NSOrderedAscending; return NSOrderedSame; } static NSString *threadKey = @"NSOperationQueue"; static NSOperationQueue *mainQueue = nil; @implementation NSOperationQueue + (id) currentQueue { if ([NSThread isMainThread]) { return mainQueue; } return [[[NSThread currentThread] threadDictionary] objectForKey: threadKey]; } + (void) initialize { if (nil == mainQueue) { mainQueue = [self new]; } } + (id) mainQueue { return mainQueue; } - (void) addOperation: (NSOperation *)op { if (op == nil || NO == [op isKindOfClass: [NSOperation class]]) { [NSException raise: NSInvalidArgumentException format: @"[%@-%@] object is not an NSOperation", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; } [internal->lock lock]; if (NSNotFound == [internal->operations indexOfObjectIdenticalTo: op] && NO == [op isFinished]) { [op addObserver: self forKeyPath: @"isReady" options: NSKeyValueObservingOptionNew context: isReadyCtxt]; [self willChangeValueForKey: @"operations"]; [self willChangeValueForKey: @"operationCount"]; [internal->operations addObject: op]; [self didChangeValueForKey: @"operationCount"]; [self didChangeValueForKey: @"operations"]; if (YES == [op isReady]) { [self observeValueForKeyPath: @"isReady" ofObject: op change: nil context: isReadyCtxt]; } } [internal->lock unlock]; } - (void) addOperationWithBlock: (GSBlockOperationBlock)block { NSBlockOperation *bop = [NSBlockOperation blockOperationWithBlock: block]; [self addOperation: bop]; } - (void) addOperations: (NSArray *)ops waitUntilFinished: (BOOL)shouldWait { NSUInteger total; NSUInteger index; if (ops == nil || NO == [ops isKindOfClass: [NSArray class]]) { [NSException raise: NSInvalidArgumentException format: @"[%@-%@] object is not an NSArray", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; } total = [ops count]; if (total > 0) { BOOL invalidArg = NO; NSUInteger toAdd = total; GS_BEGINITEMBUF(buf, total, id) [ops getObjects: buf]; for (index = 0; index < total; index++) { NSOperation *op = buf[index]; if (NO == [op isKindOfClass: [NSOperation class]]) { invalidArg = YES; toAdd = 0; break; } if (YES == [op isFinished]) { buf[index] = nil; toAdd--; } } if (toAdd > 0) { [internal->lock lock]; [self willChangeValueForKey: @"operationCount"]; [self willChangeValueForKey: @"operations"]; for (index = 0; index < total; index++) { NSOperation *op = buf[index]; if (op == nil) { continue; // Not added } if (NSNotFound != [internal->operations indexOfObjectIdenticalTo: op]) { buf[index] = nil; // Not added toAdd--; continue; } [op addObserver: self forKeyPath: @"isReady" options: NSKeyValueObservingOptionNew context: isReadyCtxt]; [internal->operations addObject: op]; if (NO == [op isReady]) { buf[index] = nil; // Not yet ready } } [self didChangeValueForKey: @"operationCount"]; [self didChangeValueForKey: @"operations"]; for (index = 0; index < total; index++) { NSOperation *op = buf[index]; if (op != nil) { [self observeValueForKeyPath: @"isReady" ofObject: op change: nil context: isReadyCtxt]; } } [internal->lock unlock]; } GS_ENDITEMBUF() if (YES == invalidArg) { [NSException raise: NSInvalidArgumentException format: @"[%@-%@] object at index %"PRIuPTR" is not an NSOperation", NSStringFromClass([self class]), NSStringFromSelector(_cmd), index]; } } if (YES == shouldWait) { [self waitUntilAllOperationsAreFinished]; } } - (void) cancelAllOperations { [[self operations] makeObjectsPerformSelector: @selector(cancel)]; } - (void) dealloc { [self cancelAllOperations]; DESTROY(internal->operations); DESTROY(internal->starting); DESTROY(internal->waiting); DESTROY(internal->name); DESTROY(internal->cond); DESTROY(internal->lock); GS_DESTROY_INTERNAL(NSOperationQueue); [super dealloc]; } - (id) init { if ((self = [super init]) != nil) { GS_CREATE_INTERNAL(NSOperationQueue); internal->suspended = NO; internal->maxThreads = NSOperationQueueDefaultMaxConcurrentOperationCount; internal->operations = [NSMutableArray new]; internal->starting = [NSMutableArray new]; internal->waiting = [NSMutableArray new]; internal->lock = [NSRecursiveLock new]; [internal->lock setName: [NSString stringWithFormat: @"lock-for-op-%p", self]]; internal->cond = [[NSConditionLock alloc] initWithCondition: 0]; [internal->cond setName: [NSString stringWithFormat: @"cond-for-op-%p", self]]; } return self; } - (BOOL) isSuspended { return internal->suspended; } - (NSInteger) maxConcurrentOperationCount { return internal->maxThreads; } - (NSString*) name { NSString *s; [internal->lock lock]; if (internal->name == nil) { internal->name = [[NSString alloc] initWithFormat: @"NSOperation %p", self]; } s = RETAIN(internal->name); [internal->lock unlock]; return AUTORELEASE(s); } - (NSUInteger) operationCount { NSUInteger c; [internal->lock lock]; c = [internal->operations count]; [internal->lock unlock]; return c; } - (NSArray *) operations { NSArray *a; [internal->lock lock]; a = [NSArray arrayWithArray: internal->operations]; [internal->lock unlock]; return a; } - (void) setMaxConcurrentOperationCount: (NSInteger)cnt { if (cnt < 0 && cnt != NSOperationQueueDefaultMaxConcurrentOperationCount) { [NSException raise: NSInvalidArgumentException format: @"[%@-%@] cannot set negative (%"PRIdPTR") count", NSStringFromClass([self class]), NSStringFromSelector(_cmd), cnt]; } [internal->lock lock]; if (cnt != internal->maxThreads) { [self willChangeValueForKey: @"maxConcurrentOperationCount"]; internal->maxThreads = cnt; [self didChangeValueForKey: @"maxConcurrentOperationCount"]; } [internal->lock unlock]; [self _execute]; } - (void) setName: (NSString*)s { if (s == nil) s = @""; [internal->lock lock]; if (NO == [internal->name isEqual: s]) { [self willChangeValueForKey: @"name"]; RELEASE(internal->name); internal->name = [s copy]; [self didChangeValueForKey: @"name"]; } [internal->lock unlock]; } - (void) setSuspended: (BOOL)flag { [internal->lock lock]; if (flag != internal->suspended) { [self willChangeValueForKey: @"suspended"]; internal->suspended = flag; [self didChangeValueForKey: @"suspended"]; } [internal->lock unlock]; [self _execute]; } - (void) waitUntilAllOperationsAreFinished { NSOperation *op; [internal->lock lock]; while ((op = [internal->operations lastObject]) != nil) { RETAIN(op); [internal->lock unlock]; [op waitUntilFinished]; RELEASE(op); [internal->lock lock]; } [internal->lock unlock]; } @end @implementation NSOperationQueue (Private) - (void) observeValueForKeyPath: (NSString *)keyPath ofObject: (id)object change: (NSDictionary *)change context: (void *)context { /* We observe three properties in sequence ... * isReady (while we wait for an operation to be ready) * queuePriority (when priority of a ready operation may change) * isFinished (to see if an executing operation is over). */ if (context == isFinishedCtxt) { NSOperation *op = object; if (YES == [op isFinished]) { [internal->lock lock]; internal->executing--; [object removeObserver: self forKeyPath: @"isFinished"]; [internal->lock unlock]; [self willChangeValueForKey: @"operations"]; [self willChangeValueForKey: @"operationCount"]; [internal->lock lock]; [internal->operations removeObjectIdenticalTo: object]; [internal->lock unlock]; [self didChangeValueForKey: @"operationCount"]; [self didChangeValueForKey: @"operations"]; } } else if (context == queuePriorityCtxt || context == isReadyCtxt) { NSInteger pos; [internal->lock lock]; if (context == queuePriorityCtxt) { [internal->waiting removeObjectIdenticalTo: object]; } if (context == isReadyCtxt) { [object removeObserver: self forKeyPath: @"isReady"]; [object addObserver: self forKeyPath: @"queuePriority" options: NSKeyValueObservingOptionNew context: queuePriorityCtxt]; } pos = [internal->waiting insertionPosition: object usingFunction: sortFunc context: 0]; [internal->waiting insertObject: object atIndex: pos]; [internal->lock unlock]; } [self _execute]; } - (void) _thread { CREATE_AUTORELEASE_POOL(arp); [[[NSThread currentThread] threadDictionary] setObject: self forKey: threadKey]; for (;;) { NSOperation *op; NSDate *when; BOOL found; /* We use a pool for each operation in case releasing the operation * causes it to be deallocated, and the deallocation of the operation * autoreleases something which needs to be cleaned up. */ RECREATE_AUTORELEASE_POOL(arp); when = [[NSDate alloc] initWithTimeIntervalSinceNow: 5.0]; found = [internal->cond lockWhenCondition: 1 beforeDate: when]; RELEASE(when); if (NO == found) { break; // Idle for 5 seconds ... exit thread. } if ([internal->starting count] > 0) { op = RETAIN([internal->starting objectAtIndex: 0]); [internal->starting removeObjectAtIndex: 0]; } else { op = nil; } if ([internal->starting count] > 0) { // Signal any other idle threads, [internal->cond unlockWithCondition: 1]; } else { // There are no more operations starting. [internal->cond unlockWithCondition: 0]; } if (nil != op) { NS_DURING { ENTER_POOL [NSThread setThreadPriority: [op threadPriority]]; [op start]; LEAVE_POOL } NS_HANDLER { NSLog(@"Problem running operation %@ ... %@", op, localException); } NS_ENDHANDLER [op _finish]; RELEASE(op); } } [[[NSThread currentThread] threadDictionary] removeObjectForKey: threadKey]; [internal->lock lock]; internal->threadCount--; [internal->lock unlock]; DESTROY(arp); [NSThread exit]; } /* Check for operations which can be executed and start them. */ - (void) _execute { NSInteger max; [internal->lock lock]; max = [self maxConcurrentOperationCount]; if (NSOperationQueueDefaultMaxConcurrentOperationCount == max) { max = maxConcurrent; } NS_DURING while (NO == [self isSuspended] && max > internal->executing && [internal->waiting count] > 0) { NSOperation *op; /* Take the first operation from the queue and start it executing. * We set ourselves up as an observer for the operating finishing * and we keep track of the count of operations we have started, * but the actual startup is left to the NSOperation -start method. */ op = [internal->waiting objectAtIndex: 0]; [internal->waiting removeObjectAtIndex: 0]; [op removeObserver: self forKeyPath: @"queuePriority"]; [op addObserver: self forKeyPath: @"isFinished" options: NSKeyValueObservingOptionNew context: isFinishedCtxt]; internal->executing++; if (YES == [op isConcurrent]) { [op start]; } else { NSUInteger pending; [internal->cond lock]; pending = [internal->starting count]; [internal->starting addObject: op]; /* Create a new thread if all existing threads are busy and * we haven't reached the pool limit. */ if (0 == internal->threadCount || (pending > 0 && internal->threadCount < max)) { internal->threadCount++; NS_DURING { [NSThread detachNewThreadSelector: @selector(_thread) toTarget: self withObject: nil]; } NS_HANDLER { NSLog(@"Failed to create thread for %@: %@", self, localException); } NS_ENDHANDLER } /* Tell the thread pool that there is an operation to start. */ [internal->cond unlockWithCondition: 1]; } } NS_HANDLER { [internal->lock unlock]; [localException raise]; } NS_ENDHANDLER [internal->lock unlock]; } @end gnustep-base-1.29.0/Source/NSOrderedSet.m000066400000000000000000001224711435650067400201400ustar00rootroot00000000000000/** Implementation for NSOrderedSet, NSMutableOrderedSet for GNUStep Copyright (C) 2019 Free Software Foundation, Inc. Written by: Gregory John Casamento Created: May 17 2019 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #import "Foundation/NSArray.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSCoder.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSException.h" #import "Foundation/NSKeyedArchiver.h" #import "Foundation/NSKeyValueCoding.h" #import "Foundation/NSKeyValueObserving.h" #import "Foundation/NSLock.h" #import "Foundation/NSOrderedSet.h" #import "Foundation/NSPredicate.h" #import "Foundation/NSValue.h" #import #import "GSPrivate.h" #import "GSFastEnumeration.h" #import "GSDispatch.h" #import "GSSorting.h" @class GSOrderedSet; @interface GSOrderedSet : NSObject // Help the compiler @end @class GSMutableOrderedSet; @interface GSMutableOrderedSet : NSObject // Help the compiler @end @interface NSOrderedSet (Private) - (void) _raiseRangeExceptionWithIndex: (NSUInteger)index from: (SEL)sel; @end @implementation NSOrderedSet static Class NSOrderedSet_abstract_class; static Class NSMutableOrderedSet_abstract_class; static Class NSOrderedSet_concrete_class; static Class NSMutableOrderedSet_concrete_class; static SEL eqSel; static SEL oaiSel; static SEL remSel; + (id) allocWithZone: (NSZone*)z { if (self == NSOrderedSet_abstract_class) { return NSAllocateObject(NSOrderedSet_concrete_class, 0, z); } else { return NSAllocateObject(self, 0, z); } } + (void) initialize { if (self == [NSOrderedSet class]) { [self setVersion: 1]; eqSel = @selector(isEqual:); oaiSel = @selector(objectAtIndex:); remSel = @selector(removeObjectAtIndex:); NSOrderedSet_abstract_class = self; NSOrderedSet_concrete_class = [GSOrderedSet class]; [NSMutableSet class]; } } - (void) _raiseRangeExceptionWithIndex: (NSUInteger)index from: (SEL)sel { NSDictionary *info; NSException *exception; NSString *reason; NSUInteger count = [self count]; info = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithUnsignedInteger: index], @"Index", [NSNumber numberWithUnsignedInteger: count], @"Count", self, @"GSMutableSet", nil, nil]; reason = [NSString stringWithFormat: @"Index %"PRIuPTR" is out of range %lu (in '%@')", index, (unsigned long)count, NSStringFromSelector(sel)]; exception = [NSException exceptionWithName: NSRangeException reason: reason userInfo: info]; [exception raise]; } - (Class) classForCoder { return NSOrderedSet_abstract_class; } // NSCoding - (instancetype) initWithCoder: (NSCoder *)coder { if ([coder allowsKeyedCoding]) { id array; array = [(NSKeyedUnarchiver*)coder _decodeArrayOfObjectsForKey: @"NS.objects"]; if (array == nil) { unsigned i = 0; NSString *key; id val; array = [NSMutableArray arrayWithCapacity: 2]; key = [NSString stringWithFormat: @"NS.object.%u", i]; val = [(NSKeyedUnarchiver*)coder decodeObjectForKey: key]; while (val != nil) { [array addObject: val]; i++; key = [NSString stringWithFormat: @"NS.object.%u", i]; val = [(NSKeyedUnarchiver*)coder decodeObjectForKey: key]; } } self = [self initWithArray: array]; } else { unsigned count; [coder decodeValueOfObjCType: @encode(unsigned) at: &count]; if (count > 0) { unsigned i; GS_BEGINIDBUF(objs, count); for (i = 0; i < count; i++) { [coder decodeValueOfObjCType: @encode(id) at: &objs[i]]; } self = [self initWithObjects: objs count: count]; while (count-- > 0) { [objs[count] release]; } GS_ENDIDBUF(); } } return self; } - (void) encodeWithCoder: (NSCoder *)aCoder { if ([aCoder allowsKeyedCoding]) { if ([aCoder class] == [NSKeyedArchiver class]) { /* HACK ... MacOS-X seems to code differently if the coder is an * actual instance of NSKeyedArchiver */ NSArray *array = [self array]; [(NSKeyedArchiver*)aCoder _encodeArrayOfObjects: array forKey: @"NS.objects"]; } else { unsigned i = 0; NSEnumerator *e = [self objectEnumerator]; id o; while ((o = [e nextObject]) != nil) { NSString *key; key = [NSString stringWithFormat: @"NS.object.%u", i++]; [(NSKeyedArchiver*)aCoder encodeObject: o forKey: key]; } } } else { unsigned count = [self count]; NSEnumerator *e = [self objectEnumerator]; id o; [aCoder encodeValueOfObjCType: @encode(unsigned) at: &count]; while ((o = [e nextObject]) != nil) { [aCoder encodeValueOfObjCType: @encode(id) at: &o]; } } } - (id) copyWithZone: (NSZone*)zone { NSOrderedSet *copy = [NSOrderedSet_concrete_class allocWithZone: zone]; return [copy initWithOrderedSet: self copyItems: YES]; } - (id) mutableCopyWithZone: (NSZone*)zone { NSMutableOrderedSet *copy = [NSMutableOrderedSet_concrete_class allocWithZone: zone]; return [copy initWithOrderedSet: self copyItems: NO]; } // NSFastEnumeration - (NSUInteger) countByEnumeratingWithState: (NSFastEnumerationState *)state objects: (__unsafe_unretained id[])stackbuf count: (NSUInteger)len { NSInteger count; /* In a mutable subclass, the mutationsPtr should be set to point to a * value (unsigned long) which will be changed (incremented) whenever * the container is mutated (content added, removed, re-ordered). * This is cached in the caller at the start and compared at each * iteration. If it changes during the iteration then * objc_enumerationMutation() will be called, throwing an exception. * The abstract base class implementation points to a fixed value * (the enumeration state pointer should exist and be unchanged for as * long as the enumeration process runs), which is fine for enumerating * an immutable array. */ state->mutationsPtr = (unsigned long *)&state->mutationsPtr; count = MIN(len, [self count] - state->state); /* If a mutation has occurred then it's possible that we are being asked to * get objects from after the end of the array. Don't pass negative values * to memcpy. */ if (count > 0) { [self getObjects: stackbuf range: NSMakeRange(state->state, count)]; state->state += count; } else { count = 0; } state->itemsPtr = stackbuf; return count; } // class methods + (instancetype) orderedSet { return AUTORELEASE([[self allocWithZone: NSDefaultMallocZone()] init]); } + (instancetype) orderedSetWithArray: (NSArray *)objects { return AUTORELEASE([[self allocWithZone: NSDefaultMallocZone()] initWithArray: objects]); } + (instancetype) orderedSetWithArray: (NSArray *)objects range: (NSRange)range copyItems: (BOOL)flag { return AUTORELEASE([[self allocWithZone: NSDefaultMallocZone()] initWithArray: objects range: range copyItems: flag]); } + (instancetype) orderedSetWithObject: (id)anObject { return AUTORELEASE([[self allocWithZone: NSDefaultMallocZone()] initWithObject: anObject]); } + (instancetype) orderedSetWithObjects: (id)firstObject, ... { id set; GS_USEIDLIST(firstObject, set = [[self allocWithZone: NSDefaultMallocZone()] initWithObjects: __objects count: __count]); return AUTORELEASE(set); } + (instancetype) orderedSetWithObjects: (const id [])objects count: (NSUInteger) count { return AUTORELEASE([[self allocWithZone: NSDefaultMallocZone()] initWithObjects: objects count: count]); } + (instancetype) orderedSetWithOrderedSet: (NSOrderedSet *)aSet { return AUTORELEASE([[self allocWithZone: NSDefaultMallocZone()] initWithOrderedSet: aSet]); } + (instancetype) orderedSetWithSet: (NSSet *)aSet { return AUTORELEASE([[self allocWithZone: NSDefaultMallocZone()] initWithSet: aSet]); } + (instancetype) orderedSetWithSet: (NSSet *)aSet copyItems: (BOOL)flag { return AUTORELEASE([[self allocWithZone: NSDefaultMallocZone()] initWithSet: aSet copyItems: flag]); } // instance methods - (instancetype) initWithArray: (NSArray *)other { unsigned count = [other count]; if (count == 0) { return [self init]; } else { GS_BEGINIDBUF(objs, count); if ([other isProxy]) { unsigned i; for (i = 0; i < count; i++) { objs[i] = [other objectAtIndex: i]; } } else { [other getObjects: objs]; } self = [self initWithObjects: objs count: count]; GS_ENDIDBUF(); return self; } return nil; } - (instancetype) initWithArray: (NSArray *)other copyItems: (BOOL)flag { unsigned count = [other count]; unsigned j = count; if (count == 0) { return [self init]; } GS_BEGINIDBUF(objs, count); { unsigned i; for (i = 0; i < count; i++) { if (flag == NO) { objs[i] = [other objectAtIndex: i]; } else // copy the items. { objs[i] = [[other objectAtIndex: i] copy]; } } } self = [self initWithObjects: objs count: count]; if (flag == YES) { while(j--) { [objs[j] release]; } } GS_ENDIDBUF(); return self; } - (instancetype) initWithArray: (NSArray *)other range: (NSRange)range copyItems: (BOOL)flag { unsigned count = [other count]; unsigned i = 0, j = 0; if (count == 0) { return [self init]; } GS_BEGINIDBUF(objs, range.length); { unsigned loc = range.location; unsigned len = range.length; for (i = 0; i < count; i++) { if (i >= loc && j < len) { if (flag == YES) { objs[i] = [[other objectAtIndex: i] copy]; } else { objs[i] = [other objectAtIndex: i]; } j++; } if (j >= len) { break; } } } self = [self initWithObjects: objs count: count]; if (flag == YES) { while(j--) { [objs[j] release]; } } GS_ENDIDBUF(); return self; } - (instancetype) initWithObject: (id)obj { id objs[] = {obj}; self = [self initWithObjects: objs count: 1]; return self; } - (instancetype) initWithObjects: (id)firstObject, ... { GS_USEIDLIST(firstObject, self = [self initWithObjects: __objects count: __count]); return self; } /** * Initialize to contain (unique elements of) objects.
* Calls -init (which does nothing but maintain MacOS-X compatibility), * and needs to be re-implemented in subclasses in order to have all * other initialisers work. */ - (instancetype) initWithObjects: (const id [])objects // required override. count: (NSUInteger)count { [self subclassResponsibility: _cmd]; return nil; } - (instancetype) initWithOrderedSet: (NSOrderedSet *)aSet { return [self initWithOrderedSet: aSet copyItems: NO]; } - (instancetype) initWithOrderedSet: (NSOrderedSet *)other copyItems: (BOOL)flag { unsigned c = [other count]; id o, e = [other objectEnumerator]; unsigned i = 0; GS_BEGINIDBUF(os, c); while ((o = [e nextObject])) { if (flag) { os[i] = [o copy]; } else { os[i] = o; } i++; } self = [self initWithObjects: os count: c]; if (flag) { while (i--) { [os[i] release]; } } GS_ENDIDBUF(); return self; } - (instancetype) initWithOrderedSet: (NSOrderedSet *)other range: (NSRange)range copyItems: (BOOL)flag { unsigned c = [other count]; id o, e = [other objectEnumerator]; unsigned i = 0, j = 0; unsigned loc = range.location; unsigned len = range.length; GS_BEGINIDBUF(os, c); while ((o = [e nextObject])) { if (i >= loc && j < len) { if (flag) { os[i] = [o copy]; } else { os[i] = o; } j++; } i++; if (j >= len) { break; } } self = [self initWithObjects: os count: c]; if (flag) { while (i--) { [os[i] release]; } } GS_ENDIDBUF(); return self; } - (instancetype) initWithSet: (NSSet *)aSet { return [self initWithSet: aSet copyItems: NO]; } - (instancetype) initWithSet: (NSSet *)other copyItems: (BOOL)flag { unsigned c = [other count]; id o, e = [other objectEnumerator]; unsigned i = 0; GS_BEGINIDBUF(os, c); while ((o = [e nextObject])) { if (flag) { os[i] = [o copy]; } else { os[i] = o; } i++; } self = [self initWithObjects: os count: c]; if (flag) { while (i--) { [os[i] release]; } } GS_ENDIDBUF(); return self; } - (instancetype) init { return [self initWithObjects: NULL count:0]; } - (NSUInteger) count // required override { [self subclassResponsibility: _cmd]; return 0; } - (BOOL) containsObject: (id)anObject { NSUInteger i = [self indexOfObject: anObject]; if (i == NSNotFound) { return NO; } return YES; } - (void) enumerateObjectsAtIndexes: (NSIndexSet *)indexSet options: (NSEnumerationOptions)opts usingBlock: (GSEnumeratorBlock)aBlock { [[self objectsAtIndexes: indexSet] enumerateObjectsWithOptions: opts usingBlock: aBlock]; } - (void) enumerateObjectsUsingBlock: (GSEnumeratorBlock)aBlock { [self enumerateObjectsWithOptions: 0 usingBlock: aBlock]; } - (void) enumerateObjectsWithOptions: (NSEnumerationOptions)opts usingBlock: (GSEnumeratorBlock)aBlock { NSUInteger count = 0; BLOCK_SCOPE BOOL shouldStop = NO; BOOL isReverse = (opts & NSEnumerationReverse); id enumerator = self; /* If we are enumerating in reverse, use the reverse enumerator for fast * enumeration. */ if (isReverse) { enumerator = [self reverseObjectEnumerator]; count = ([self count] - 1); } { GS_DISPATCH_CREATE_QUEUE_AND_GROUP_FOR_ENUMERATION(enumQueue, opts) FOR_IN (id, obj, enumerator) GS_DISPATCH_SUBMIT_BLOCK(enumQueueGroup, enumQueue, if (shouldStop == NO) {, }, aBlock, obj, count, &shouldStop); if (isReverse) { count--; } else { count++; } if (shouldStop) { break; } END_FOR_IN(enumerator) GS_DISPATCH_TEARDOWN_QUEUE_AND_GROUP_FOR_ENUMERATION(enumQueue, opts) } } - (id) firstObject { NSUInteger count = [self count]; if (count == 0) { return nil; } return [self objectAtIndex: 0]; } - (id) lastObject { NSUInteger count = [self count]; if (count == 0) { return nil; } return [self objectAtIndex: count - 1]; } - (id) objectAtIndex: (NSUInteger)index // required override... { [self subclassResponsibility: _cmd]; return nil; } - (id) objectAtIndexedSubscript: (NSUInteger)index { return [self objectAtIndex: index]; } - (NSArray *) objectsAtIndexes: (NSIndexSet *)indexes { NSMutableArray *group = [NSMutableArray arrayWithCapacity: [indexes count]]; NSUInteger i = [indexes firstIndex]; while (i != NSNotFound) { [group addObject: [self objectAtIndex: i]]; i = [indexes indexGreaterThanIndex: i]; } return GS_IMMUTABLE(group); } - (NSUInteger) indexOfObject: (id)anObject { NSUInteger c = [self count]; if (c > 0 && anObject != nil) { NSUInteger i; IMP get = [self methodForSelector: oaiSel]; BOOL (*eq)(id, SEL, id) = (BOOL (*)(id, SEL, id))[anObject methodForSelector: eqSel]; for (i = 0; i < c; i++) if ((*eq)(anObject, eqSel, (*get)(self, oaiSel, i)) == YES) return i; } return NSNotFound; } - (NSUInteger) indexOfObject: (id)key inSortedRange: (NSRange)range options: (NSBinarySearchingOptions)options usingComparator: (NSComparator)comparator { if (range.length == 0) { return options & NSBinarySearchingInsertionIndex ? range.location : NSNotFound; } if (range.length == 1) { switch (CALL_NON_NULL_BLOCK(comparator, key, [self objectAtIndex: range.location])) { case NSOrderedSame: return range.location; case NSOrderedAscending: return options & NSBinarySearchingInsertionIndex ? range.location : NSNotFound; case NSOrderedDescending: return options & NSBinarySearchingInsertionIndex ? (range.location + 1) : NSNotFound; default: // Shouldn't happen return NSNotFound; } } else { NSUInteger index = NSNotFound; NSUInteger count = [self count]; NSRange range = NSMakeRange(0, [self count]); GS_BEGINIDBUF(objects, count); [self getObjects: objects range: range]; // We use the timsort galloping to find the insertion index: if (options & NSBinarySearchingLastEqual) { index = GSRightInsertionPointForKeyInSortedRange(key, objects, range, comparator); } else { // Left insertion is our default index = GSLeftInsertionPointForKeyInSortedRange(key, objects, range, comparator); } GS_ENDIDBUF() // If we were looking for the insertion point, we are done here if (options & NSBinarySearchingInsertionIndex) { return index; } /* Otherwise, we need need another equality check in order to * know whether we need return NSNotFound. */ if (options & NSBinarySearchingLastEqual) { /* For search from the right, the equal object would be * the one before the index, but only if it's not at the * very beginning of the range (though that might not * actually be possible, it's better to check nonetheless). */ if (index > range.location) { index--; } } if (index >= NSMaxRange(range)) { return NSNotFound; } /* * For a search from the left, we'd have the correct index anyways. Check * whether it's equal to the key and return NSNotFound otherwise */ return (NSOrderedSame == CALL_NON_NULL_BLOCK(comparator, key, [self objectAtIndex: index]) ? index : NSNotFound); } // Never reached return NSNotFound; } - (NSUInteger) indexOfObjectAtIndexes: (NSIndexSet *)indexSet options: (NSEnumerationOptions)opts passingTest: (GSPredicateBlock)predicate { return [[self array] indexOfObjectAtIndexes: indexSet options: opts passingTest: predicate]; } - (NSUInteger) indexOfObjectPassingTest: (GSPredicateBlock)predicate { return [self indexOfObjectWithOptions: 0 passingTest: predicate]; } - (NSUInteger) indexOfObjectWithOptions: (NSEnumerationOptions)opts passingTest: (GSPredicateBlock)predicate { /* TODO: Concurrency. */ id enumerator = self; BLOCK_SCOPE BOOL shouldStop = NO; NSUInteger count = 0; BLOCK_SCOPE NSUInteger index = NSNotFound; BLOCK_SCOPE NSLock *indexLock = nil; /* If we are enumerating in reverse, use the reverse enumerator for fast * enumeration. */ if (opts & NSEnumerationReverse) { enumerator = [self reverseObjectEnumerator]; } if (opts & NSEnumerationConcurrent) { indexLock = [NSLock new]; } { GS_DISPATCH_CREATE_QUEUE_AND_GROUP_FOR_ENUMERATION(enumQueue, opts) FOR_IN (id, obj, enumerator) # if __has_feature(blocks) && (GS_USE_LIBDISPATCH == 1) if (enumQueue != NULL) { dispatch_group_async(enumQueueGroup, enumQueue, ^(void){ if (shouldStop) { return; } if (predicate(obj, count, &shouldStop)) { // FIXME: atomic operation on the shouldStop variable would be nicer, // but we don't expose the GSAtomic* primitives anywhere. [indexLock lock]; index = count; // Cancel all other predicate evaluations: shouldStop = YES; [indexLock unlock]; } }); } else // call block directly # endif if (CALL_NON_NULL_BLOCK(predicate, obj, count, &shouldStop)) { index = count; shouldStop = YES; } if (shouldStop) { break; } count++; END_FOR_IN(enumerator) GS_DISPATCH_TEARDOWN_QUEUE_AND_GROUP_FOR_ENUMERATION(enumQueue, opts); } RELEASE(indexLock); return index; } - (NSIndexSet *) indexesOfObjectsAtIndexes: (NSIndexSet *)indexSet options: (NSEnumerationOptions)opts passingTest: (GSPredicateBlock)predicate { return [[self array] indexesOfObjectsAtIndexes: indexSet options: opts passingTest: predicate]; } - (NSIndexSet *) indexesOfObjectsPassingTest: (GSPredicateBlock)predicate { return [self indexesOfObjectsWithOptions: 0 passingTest: predicate]; } - (NSIndexSet *) indexesOfObjectsWithOptions: (NSEnumerationOptions)opts passingTest: (GSPredicateBlock)predicate { /* TODO: Concurrency. */ NSMutableIndexSet *set = [NSMutableIndexSet indexSet]; BLOCK_SCOPE BOOL shouldStop = NO; id enumerator = self; NSUInteger count = 0; BLOCK_SCOPE NSLock *setLock = nil; /* If we are enumerating in reverse, use the reverse enumerator for fast * enumeration. */ if (opts & NSEnumerationReverse) { enumerator = [self reverseObjectEnumerator]; } if (opts & NSEnumerationConcurrent) { setLock = [NSLock new]; } { GS_DISPATCH_CREATE_QUEUE_AND_GROUP_FOR_ENUMERATION(enumQueue, opts) FOR_IN (id, obj, enumerator) # if __has_feature(blocks) && (GS_USE_LIBDISPATCH == 1) if (enumQueue != NULL) { dispatch_group_async(enumQueueGroup, enumQueue, ^(void){ if (shouldStop) { return; } if (predicate(obj, count, &shouldStop)) { [setLock lock]; [set addIndex: count]; [setLock unlock]; } }); } else // call block directly # endif if (CALL_NON_NULL_BLOCK(predicate, obj, count, &shouldStop)) { /* TODO: It would be more efficient to collect an NSRange and only * pass it to the index set when CALL_NON_NULL_BLOCK returned NO. */ [set addIndex: count]; } if (shouldStop) { break; } count++; END_FOR_IN(enumerator) GS_DISPATCH_TEARDOWN_QUEUE_AND_GROUP_FOR_ENUMERATION(enumQueue, opts); } RELEASE(setLock); return set; } - (NSEnumerator *) objectEnumerator { [self subclassResponsibility: _cmd]; return nil; } - (NSEnumerator *) reverseObjectEnumerator { [self subclassResponsibility: _cmd]; return nil; } - (NSOrderedSet *) reversedOrderedSet { NSEnumerator *e = [self reverseObjectEnumerator]; NSMutableArray *a = [NSMutableArray arrayWithCapacity: [self count]]; id o = nil; // Build the reverse array... while ((o = [e nextObject]) != nil) { [a addObject: o]; } // Create and return reverse ordered set... return [NSOrderedSet orderedSetWithArray: a]; } - (void) getObjects: (__unsafe_unretained id[])aBuffer range: (NSRange)aRange { NSUInteger i, j = 0; NSUInteger c = [self count]; NSUInteger e = NSMaxRange(aRange); IMP get = [self methodForSelector: oaiSel]; GS_RANGE_CHECK(aRange, c); for (i = aRange.location; i < e; i++) { aBuffer[j++] = (*get)(self, oaiSel, i); } } // Key-Value Observing Support - (void) addObserver: (NSObject *)observer forKeyPath: (NSString *)keyPath options: (NSKeyValueObservingOptions)options context: (void *)context { [[NSException exceptionWithName: NSGenericException reason: @"NSOrderedSet does not support KVO" userInfo: nil] raise]; } - (void) removeObserver: (NSObject *)observer forKeyPath: (NSString *)keyPath { [[NSException exceptionWithName: NSGenericException reason: @"NSOrderedSet does not support KVO" userInfo: nil] raise]; } - (void) removeObserver: (NSObject *)observer forKeyPath: (NSString *)keyPath context: (void *)context { [[NSException exceptionWithName: NSGenericException reason: @"NSOrderedSet does not support KVO" userInfo: nil] raise]; } // Key value coding support - (void) setValue: (id)value forKey: (NSString*)key { id object; NSEnumerator *e = [self objectEnumerator]; while ((object = [e nextObject]) != nil) { [object setValue: value forKey: key]; } } - (id) valueForKey: (NSString*)key { NSEnumerator *e = [self objectEnumerator]; id object; NSMutableSet *results = [NSMutableSet setWithCapacity: [self count]]; while ((object = [e nextObject]) != nil) { id result = [object valueForKey: key]; if (result == nil) { continue; } [results addObject: result]; } return results; } // Comparing Sets - (BOOL) isEqualToOrderedSet: (NSOrderedSet *)aSet { if ([self count] == 0 && [aSet count] == 0) return YES; if (self == aSet) return YES; if ([self count] != [aSet count]) return NO; // if they are equal, then this set will be a subset of aSet. return [self isSubsetOfOrderedSet: aSet]; } - (BOOL) isEqual: (id)other { if ([other isKindOfClass: [NSOrderedSet class]]) { return [self isEqualToOrderedSet: other]; } return NO; } // Set operations - (BOOL) intersectsOrderedSet: (NSOrderedSet *)otherSet { id o; NSEnumerator *e; // -1. If this set is empty, this method should return NO. if ([self count] == 0) return NO; // 0. Loop for all members in otherSet e = [otherSet objectEnumerator]; while ((o = [e nextObject])) // 1. pick a member from otherSet. { if ([self containsObject: o]) // 2. check the member is in this set(self). return YES; } return NO; } - (BOOL) intersectsSet: (NSSet *)otherSet { id o = nil; NSEnumerator *e = nil; // -1. If this set is empty, this method should return NO. if ([self count] == 0) return NO; // 0. Loop for all members in otherSet e = [otherSet objectEnumerator]; while ((o = [e nextObject])) // 1. pick a member from otherSet. { if ([self containsObject: o]) // 2. check the member is in this set(self). return YES; } return NO; } - (BOOL) isSubsetOfOrderedSet: (NSOrderedSet *)otherSet { id so, oo; NSEnumerator *selfEnum = [self objectEnumerator]; NSEnumerator *otherEnum = [otherSet objectEnumerator]; NSUInteger l = [self count]; // -1. If this set is empty, this method should return YES. if (l == 0) { return YES; } // If count of set is more than otherSet it's not a subset if (l > [otherSet count]) { return NO; } so = [selfEnum nextObject]; // get first object in enum... while ((oo = [otherEnum nextObject]) != nil) { if ([oo isEqual: so]) // if object is equal advance { so = [selfEnum nextObject]; if (so == nil) { return YES; // if we are done with iterating self, then it's a subset. } } } return NO; } - (BOOL) isSubsetOfSet: (NSSet *)otherSet { id o, e; NSUInteger l = [self count]; // -1. If this set is empty, this method should return YES. if (l == 0) { return YES; } // If count of set is more than otherSet it's not a subset if (l > [otherSet count]) { return NO; } // 0. Loop for all members in self e = [self objectEnumerator]; while ((o = [e nextObject])) // 1. pick a member from self. { if ([otherSet containsObject: o] == NO) // 2. check the member is in otherset. { return NO; } } return YES; // if all members are in set. } // Creating a Sorted Array - (NSArray *) sortedArrayUsingDescriptors: (NSArray *)sortDescriptors { return [[self array] sortedArrayUsingDescriptors: sortDescriptors]; } - (NSArray *) sortedArrayUsingComparator: (NSComparator)comparator { return [self sortedArrayWithOptions: 0 usingComparator: comparator]; } - (NSArray *) sortedArrayWithOptions: (NSSortOptions)options usingComparator: (NSComparator)comparator { return [[self array] sortedArrayWithOptions: options usingComparator: comparator]; } // Filtering Ordered Sets - (NSOrderedSet *) filteredOrderedSetUsingPredicate: (NSPredicate *)predicate { NSMutableOrderedSet *result = nil; NSEnumerator *e = [self objectEnumerator]; id object = nil; result = [NSMutableOrderedSet orderedSetWithCapacity: [self count]]; while ((object = [e nextObject]) != nil) { if ([predicate evaluateWithObject: object] == YES) { [result addObject: object]; // passes filter } } return GS_IMMUTABLE(result); } // Describing a set - (NSString *) description { return [self descriptionWithLocale: nil]; } - (NSString *) descriptionWithLocale: (NSLocale *)locale { return [self descriptionWithLocale: locale indent: NO]; } - (NSString*) descriptionWithLocale: (NSLocale *)locale indent: (BOOL)flag { return [[self array] descriptionWithLocale: locale indent: flag]; } - (NSArray *) array { NSMutableArray *result = [NSMutableArray arrayWithCapacity: [self count]]; id enumerator = self; FOR_IN(id, o, enumerator) [result addObject: o]; END_FOR_IN(enumerator) return GS_IMMUTABLE(result); } - (NSSet *) set { NSMutableSet *result = [NSMutableSet setWithCapacity: [self count]]; id enumerator = self; FOR_IN(id, o, enumerator) [result addObject: o]; END_FOR_IN(enumerator) return GS_IMMUTABLE(result); } @end // Mutable Ordered Set @implementation NSMutableOrderedSet // Creating a Mutable Ordered Set + (void) initialize { if (self == [NSMutableOrderedSet class]) { NSMutableOrderedSet_abstract_class = self; NSMutableOrderedSet_concrete_class = [GSMutableOrderedSet class]; } } + (id) allocWithZone: (NSZone*)z { if (self == NSMutableOrderedSet_abstract_class) { return NSAllocateObject(NSMutableOrderedSet_concrete_class, 0, z); } else { return NSAllocateObject(self, 0, z); } } + (instancetype) orderedSetWithCapacity: (NSUInteger)capacity { return AUTORELEASE([[self allocWithZone: NSDefaultMallocZone()] initWithCapacity: capacity]); } - (Class) classForCoder { return NSMutableOrderedSet_abstract_class; } - (instancetype) initWithCapacity: (NSUInteger)capacity { self = [self init]; return self; } - (instancetype) init { self = [super init]; if (self == nil) { NSLog(@"Could not init class"); } return self; } - (void) addObject: (id)anObject { [self insertObject: anObject atIndex: [self count]]; } - (void) addObjects: (const id[])objects count: (NSUInteger)count { NSUInteger i = 0; for (i = 0; i < count; i++) { id obj = objects[i]; [self addObject: obj]; } } - (void) addObjectsFromArray: (NSArray *)otherArray { NSEnumerator *en = [otherArray objectEnumerator]; id obj = nil; while ((obj = [en nextObject]) != nil) { [self addObject: obj]; } } - (void) insertObject: (id)object atIndex: (NSUInteger)index // required override { [self subclassResponsibility: _cmd]; } - (void) setObject: (id)object atIndexedSubscript: (NSUInteger)index { if ([self count] == index) { [self addObject: object]; } else { [self replaceObjectAtIndex: index withObject: object]; } } - (void) insertObjects: (NSArray *)array atIndexes: (NSIndexSet *)indexes { NSUInteger index = [indexes firstIndex]; NSEnumerator *enumerator = [array objectEnumerator]; id object = [enumerator nextObject]; while (object != nil && index != NSNotFound) { [self insertObject: object atIndex: index]; object = [enumerator nextObject]; index = [indexes indexGreaterThanIndex: index]; } } - (void) removeObject: (id)anObject { NSUInteger index; if (anObject == nil) { NSWarnMLog(@"attempt to remove nil object"); return; } index = [self indexOfObject: anObject]; if (NSNotFound != index) { [self removeObjectAtIndex: index]; } } - (void) removeObjectAtIndex: (NSUInteger)index // required override { [self subclassResponsibility: _cmd]; } - (void) removeObjectsAtIndexes: (NSIndexSet *)indexes { NSUInteger count = [indexes count]; NSUInteger indexArray[count]; [indexes getIndexes: indexArray maxCount: count inIndexRange: NULL]; if (count > 0) { NSUInteger i; IMP rem = [self methodForSelector: remSel]; for (i = 0; i < count; i++) { NSUInteger idx = indexArray[i]; (*rem)(self, remSel, idx); } } } - (void) removeObjectsInArray: (NSArray *)otherArray { NSUInteger c = [otherArray count]; if (c > 0) { NSUInteger i; IMP get = [otherArray methodForSelector: oaiSel]; IMP rem = [self methodForSelector: @selector(removeObject:)]; for (i = 0; i < c; i++) (*rem)(self, @selector(removeObject:), (*get)(otherArray, oaiSel, i)); } } - (void) removeObjectsInRange: (NSRange)aRange { NSUInteger i; NSUInteger s = aRange.location; NSUInteger c = [self count]; i = aRange.location + aRange.length; if (c < i) { i = c; } if (i > s) { IMP rem = [self methodForSelector: remSel]; while (i-- > s) { (*rem)(self, remSel, i); } } } - (void) removeAllObjects { NSUInteger c = [self count]; if (c > 0) { while (c--) { [self removeObjectAtIndex: c]; } } } - (void) replaceObjectAtIndex: (NSUInteger)index withObject: (id)object { [self removeObjectAtIndex: index]; [self insertObject: object atIndex: index]; } - (void) replaceObjectsAtIndexes: (NSIndexSet *)indexes withObjects: (NSArray *)objects { NSUInteger count = [indexes count], i = 0; NSUInteger indexArray[count]; // Remove the objects [self removeObjectsAtIndexes: indexes]; // Get the indexes [indexes getIndexes: indexArray maxCount: count inIndexRange: NULL]; // Iterate over the indexes and replace the objs for (i = 0; i < count; i++) { id obj = [objects objectAtIndex: i]; NSUInteger indx = indexArray[i]; [self insertObject: obj atIndex: indx]; } } - (void) replaceObjectsInRange: (NSRange)aRange withObjects: (const id[])objects count: (NSUInteger)count { id o = nil; NSUInteger i = count; [self removeObjectsInRange: aRange]; while (i-- > 0) { o = objects[i]; [self insertObject: o atIndex: aRange.location]; } } - (void) setObject: (id)anObject atIndex: (NSUInteger)anIndex { if ([self count] == anIndex) { [self addObject: anObject]; } else { [self replaceObjectAtIndex: anIndex withObject: anObject]; } } - (void) moveObjectsAtIndexes: (NSIndexSet *)indexes toIndex: (NSUInteger)index { NSUInteger count = [indexes count]; NSUInteger i = count; NSUInteger indexArray[count]; NSMutableArray *tmpArray = [NSMutableArray arrayWithCapacity: count]; id o = nil; NSEnumerator *e = nil; [indexes getIndexes: indexArray maxCount: count inIndexRange: NULL]; // Build the temporary array.... while (i-- > 0) { NSUInteger index = indexArray[i]; id obj = [self objectAtIndex: index]; [tmpArray addObject: obj]; } // Remove the originals... for (i = 0; i < count; i++) { NSUInteger index = indexArray[i]; [self removeObjectAtIndex: index]; } // Move the objects e = [tmpArray objectEnumerator]; while ((o = [e nextObject]) != nil) { [self insertObject: o atIndex: index]; } } - (void) exchangeObjectAtIndex: (NSUInteger)index withObjectAtIndex: (NSUInteger)otherIndex { NSUInteger count = [self count]; if (index >= count) { [self _raiseRangeExceptionWithIndex: index from: _cmd]; } if (otherIndex >= count) { [self _raiseRangeExceptionWithIndex: otherIndex from: _cmd]; } if (index != otherIndex) { NSUInteger low, high; id obj1, obj2; if (index > otherIndex) { high = index; low = otherIndex; } else { high = otherIndex; low = index; } obj1 = [self objectAtIndex: low]; obj2 = [self objectAtIndex: high]; [self removeObjectAtIndex: high]; [self removeObjectAtIndex: low]; [self insertObject: obj2 atIndex: low]; [self insertObject: obj1 atIndex: high]; } } - (void) filterUsingPredicate: (NSPredicate *)predicate { unsigned count = [self count]; while (count-- > 0) { id object = [self objectAtIndex: count]; if ([predicate evaluateWithObject: object] == NO) { [self removeObjectAtIndex: count]; } } } - (void) sortUsingDescriptors: (NSArray *)descriptors { NSArray *result = [[self array] sortedArrayUsingDescriptors: descriptors]; [self removeAllObjects]; [self addObjectsFromArray: result]; } - (void) sortUsingComparator: (NSComparator)comparator { [self sortWithOptions: 0 usingComparator: comparator]; } - (void) sortWithOptions: (NSSortOptions)options usingComparator: (NSComparator)comparator { NSUInteger count = [self count]; [self sortRange: NSMakeRange(0, count) options: options usingComparator: comparator]; } - (void) sortRange: (NSRange)range options: (NSSortOptions)options usingComparator: (NSComparator)comparator { NSUInteger count = range.length; if ((1 < count) && (NULL != comparator)) { GS_BEGINIDBUF(objects, count); [self getObjects: objects range: range]; if (options & NSSortStable) { if (options & NSSortConcurrent) { GSSortStableConcurrent(objects, NSMakeRange(0, count), (id)comparator, GSComparisonTypeComparatorBlock, NULL); } else { GSSortStable(objects, NSMakeRange(0, count), (id)comparator, GSComparisonTypeComparatorBlock, NULL); } } else { if (options & NSSortConcurrent) { GSSortUnstableConcurrent(objects, NSMakeRange(0, count), (id)comparator, GSComparisonTypeComparatorBlock, NULL); } else { GSSortUnstable(objects, NSMakeRange(0, count), (id)comparator, GSComparisonTypeComparatorBlock, NULL); } } [self replaceObjectsInRange: range withObjects: objects count: count]; GS_ENDIDBUF(); } } - (void) intersectOrderedSet: (NSOrderedSet *)other { if (other != self) { id keys = [self objectEnumerator]; id key; while ((key = [keys nextObject])) { if ([other containsObject: key] == NO) { [self removeObject: key]; } } } } - (void) intersectSet: (NSSet *)other { id keys = [self objectEnumerator]; id key; while ((key = [keys nextObject])) { if ([other containsObject: key] == NO) { [self removeObject: key]; } } } - (void) minusOrderedSet: (NSOrderedSet *)other { if (other == self) { [self removeAllObjects]; } else { id keys = [other objectEnumerator]; id key; while ((key = [keys nextObject])) { [self removeObject: key]; } } } - (void) minusSet: (NSSet *)other { id keys = [other objectEnumerator]; id key; while ((key = [keys nextObject])) { [self removeObject: key]; } } - (void) unionOrderedSet: (NSOrderedSet *)other { if (other != self) { id keys = [other objectEnumerator]; id key; while ((key = [keys nextObject])) { [self addObject: key]; } } } - (void) unionSet: (NSSet *)other { id keys = [other objectEnumerator]; id key; while ((key = [keys nextObject])) { [self addObject: key]; } } // Needed only to satisfy compiler that NSCoding is implemented. - (instancetype) initWithCoder: (NSCoder *)coder { return [super initWithCoder: coder]; } @end gnustep-base-1.29.0/Source/NSOrthography.m000066400000000000000000000051421435650067400204010ustar00rootroot00000000000000/* Implementation of class NSOrthography Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory John Casamento Date: Tue Nov 5 03:43:39 EST 2019 This file is part of the GNUstep Library. 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 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 USA. */ #import "Foundation/NSArray.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSOrthography.h" #import "Foundation/NSString.h" @implementation NSOrthography - (instancetype) initWithDominantScript: (NSString *)script languageMap: (NSDictionary *)map { self = [super init]; if (self != nil) { ASSIGNCOPY(_dominantScript, script); ASSIGNCOPY(_languageMap, map); } return self; } - (oneway void) dealloc { RELEASE(_dominantScript); RELEASE(_languageMap); [super dealloc]; } - (NSString *) dominantScript { return _dominantScript; } - (NSDictionary *) languationMap { return _languageMap; } - (NSArray *) languagesForScript: (NSString *)script { return nil; } - (NSString *) dominantLanguageForScript: (NSString *)script { return nil; } - (NSString *) dominantLanguage { return nil; } - (NSArray *) allScripts { return nil; } - (NSArray *) allLanguages { return nil; } + (instancetype) defaultOrthographyForLanguage: (NSString *)language { return nil; } + (instancetype) orthographyWithDominantScript: (NSString *)script languageMap: (NSDictionary *)map { NSOrthography *result = [[NSOrthography alloc] initWithDominantScript: script languageMap: map]; AUTORELEASE(result); return result; } - (instancetype) initWithCoder: (NSCoder *)coder { return nil; } - (void) encodeWithCoder: (NSCoder *)coder { } - (instancetype) copyWithZone: (NSZone *)zone { return [[[self class] allocWithZone: zone] initWithDominantScript: _dominantScript languageMap: _languageMap]; } @end gnustep-base-1.29.0/Source/NSPage.m000066400000000000000000000115121435650067400167450ustar00rootroot00000000000000/** Implementation of page-related functions for GNUstep Copyright (C) 1996, 1997 Free Software Foundation, Inc. Written by: Andrew Kachites McCallum Created: May 1996 This file is part of the GNUstep Base Library. 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 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 USA. NSPage class reference $Date$ $Revision$ */ #import "common.h" #include #if __mach__ #include #endif #ifdef __CYGWIN__ #include #endif #ifdef _WIN32 #include static size_t getpagesize(void) { SYSTEM_INFO info; GetSystemInfo(&info); return info.dwPageSize; } #endif #ifdef __SOLARIS__ #define getpagesize() sysconf(_SC_PAGESIZE) #endif #ifdef __svr4__ #define getpagesize() sysconf(_SC_PAGESIZE) #endif #if __mach__ #define getpagesize vm_page_size #endif #ifdef __BEOS__ #include #define getpagesize() B_PAGE_SIZE #endif /* Cache the size of a memory page here, so we don't have to make the getpagesize() system call repeatedly. */ static NSUInteger ns_page_size = 0; /** * Return the number of bytes in a memory page. */ NSUInteger NSPageSize (void) { if (!ns_page_size) ns_page_size = getpagesize (); return ns_page_size; } /** * Return log base 2 of the number of bytes in a memory page. */ NSUInteger NSLogPageSize (void) { NSUInteger tmp_page_size = NSPageSize(); NSUInteger log = 0; while (tmp_page_size >>= 1) log++; return log; } /** * Round bytes down to the nearest multiple of the memory page size, * and return it. */ NSUInteger NSRoundDownToMultipleOfPageSize (NSUInteger bytes) { NSUInteger a = NSPageSize(); return (bytes / a) * a; } /** * Round bytes up to the nearest multiple of the memory page size, * and return it. */ NSUInteger NSRoundUpToMultipleOfPageSize (NSUInteger bytes) { NSUInteger a = NSPageSize(); return ((bytes % a) ? ((bytes / a + 1) * a) : bytes); } #if __linux__ #include #endif /** * Return the number of bytes of real (physical) memory available. */ NSUInteger NSRealMemoryAvailable () { #if __linux__ struct sysinfo info; if ((sysinfo(&info)) != 0) return 0; return info.freeram; #elif defined(_WIN32) MEMORYSTATUSEX memory; memory.dwLength = sizeof(memory); GlobalMemoryStatusEx(&memory); return memory.ullAvailPhys; #elif defined(__BEOS__) system_info info; if (get_system_info(&info) != B_OK) return 0; return (info.max_pages - info.used_pages) * B_PAGE_SIZE; #else fprintf (stderr, "NSRealMemoryAvailable() not implemented.\n"); return 0; #endif } /** * Allocate memory for this process and return a pointer to it (or a null * pointer on failure). The allocated memory is page aligned and the * actual size of memory allocated is a multiple of the page size. */ void * NSAllocateMemoryPages (NSUInteger bytes) { NSUInteger size = NSRoundUpToMultipleOfPageSize (bytes); void *where; #if defined(_WIN32) where = VirtualAlloc(NULL, size, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE); #elif __mach__ kern_return_t r; r = vm_allocate (mach_task_self(), &where, (vm_size_t) size, 1); if (r != KERN_SUCCESS) return NULL; return where; #elif HAVE_POSIX_MEMALIGN if (posix_memalign(&where, NSPageSize(), size) != 0) return NULL; #else where = valloc (size); if (where == NULL) return NULL; #endif memset (where, 0, bytes); return where; } /** * Deallocate memory which was previously allocated using the * NSAllocateMemoryPages() function.
* The bytes argument should be the same as the value passed * to the NSAllocateMemoryPages() function. */ void NSDeallocateMemoryPages (void *ptr, NSUInteger bytes) { #if defined(_WIN32) VirtualFree(ptr, 0, MEM_RELEASE); #elif __mach__ vm_deallocate (mach_task_self (), ptr, NSRoundUpToMultipleOfPageSize (bytes)); #else free (ptr); #endif } /** * Perform an efficient large scale copy of data from src to dest. * The value bytes specifies the length of the data copied. */ void NSCopyMemoryPages (const void *src, void *dest, NSUInteger bytes) { #if __mach__ kern_return_t r; r = vm_copy (mach_task_self(), src, bytes, dest); NSParameterAssert (r == KERN_SUCCESS); #else memcpy (dest, src, bytes); #endif } gnustep-base-1.29.0/Source/NSPathUtilities.m000066400000000000000000002317061435650067400206720ustar00rootroot00000000000000/* Implementation of filesystem & path-related functions for GNUstep Copyright (C) 1996-2016 Free Software Foundation, Inc. Written by: Andrew Kachites McCallum Created: May 1996 Rewrite by: Sheldon Gill Date: Jan 2004 Rewrites by: Richard Frith-Macdonald Date: 2004-2005 This file is part of the GNUstep Base Library. 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 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 USA. NSPathUtilities function reference $Date$ $Revision$ */ /** Path Utility Functions

Path utilities provides functions to dynamically discover paths for the platform the application is running on. This avoids the need for hard coding paths, making porting easier and also allowing for places to change without breaking applications. (why do this? Well imagine we're running GNUstep 1 and the new wonderful GNUstep 2 becomes available but we're not sure of it yet. You could install /GNUstep/System2/ and have applications use which ever System you wanted at the time...)

On unix systems, the paths are initialised by reading a configuration file. Something like "/etc/GNUstep/GNUstep.conf". This provides the basic information required by the library to establish all locations required.

See GNUstep File System Hierarchy document for more information and detailed descriptions.

*/ /* The following define is needed for Solaris get(pw/gr)(nam/uid)_r declartions which default to pre POSIX declaration. */ #define _POSIX_PTHREAD_SEMANTICS #import "common.h" #include "objc-load.h" #import "Foundation/NSPathUtilities.h" #import "Foundation/NSException.h" #import "Foundation/NSArray.h" #import "Foundation/NSBundle.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSFileManager.h" #import "Foundation/NSProcessInfo.h" #import "Foundation/NSValue.h" #import "Foundation/NSLock.h" #import "Foundation/NSUserDefaults.h" #import "GNUstepBase/NSString+GNUstepBase.h" #import "GSPrivate.h" #ifdef HAVE_PWD_H #include // for getpwnam_r() and getpwuid_r() #endif #include #include NSMutableDictionary* GNUstepConfig(NSDictionary *newConfig); void GNUstepUserConfig(NSMutableDictionary *config, NSString *userName); /* The global configuration file. The real value is read from config.h */ #ifndef GNUSTEP_TARGET_CONFIG_FILE # define GNUSTEP_TARGET_CONFIG_FILE "/etc/GNUstep/GNUstep.conf" #endif static NSString *gnustep_target_cpu = #ifdef GNUSTEP_TARGET_CPU @GNUSTEP_TARGET_CPU; #else nil; #endif static NSString *gnustep_target_os = #ifdef GNUSTEP_TARGET_OS @GNUSTEP_TARGET_OS; #else nil; #endif static NSString *library_combo = #ifdef LIBRARY_COMBO @LIBRARY_COMBO; #else nil; #endif static NSString *gnustep_is_flattened = #ifdef GNUSTEP_IS_FLATTENED @GNUSTEP_IS_FLATTENED; #else nil; #endif #if defined(_WIN32) #include #include /* * FIXME ... should check access properly if the file is on an NTFS volume. */ #define ATTRMASK 0700 #else #define ATTRMASK 0777 #endif #define MGR() [NSFileManager defaultManager] /* ------------------ */ /* Internal variables */ /* ------------------ */ static NSString *gnustepConfigPath = nil; static NSString *gnustepUserHome = nil; static NSString *gnustepUserID = nil; static NSString *gnustepUserName = nil; static NSString *gnustepUserDefaultsDir = nil; static NSString *theUserName = nil; /* The user's login name */ static NSString *theFullUserName = nil; /* The user's full login name */ static NSString *tempDir = nil; /* user's temporary directory */ /* The following list entirely describe our filesystem configuration. */ static NSString *gnustepMakefiles = nil; static NSString *gnustepSystemUsersDir = nil; static NSString *gnustepNetworkUsersDir = nil; static NSString *gnustepLocalUsersDir = nil; static NSString *gnustepSystemApps = nil; static NSString *gnustepSystemAdminApps = nil; static NSString *gnustepSystemWebApps = nil; static NSString *gnustepSystemTools = nil; static NSString *gnustepSystemAdminTools = nil; static NSString *gnustepSystemLibrary = nil; static NSString *gnustepSystemLibraries = nil; static NSString *gnustepSystemHeaders = nil; static NSString *gnustepSystemDocumentation = nil; static NSString *gnustepSystemDocumentationInfo = nil; static NSString *gnustepSystemDocumentationMan = nil; static NSString *gnustepNetworkApps = nil; static NSString *gnustepNetworkAdminApps = nil; static NSString *gnustepNetworkWebApps = nil; static NSString *gnustepNetworkTools = nil; static NSString *gnustepNetworkAdminTools = nil; static NSString *gnustepNetworkLibrary = nil; static NSString *gnustepNetworkLibraries = nil; static NSString *gnustepNetworkHeaders = nil; static NSString *gnustepNetworkDocumentation = nil; static NSString *gnustepNetworkDocumentationInfo = nil; static NSString *gnustepNetworkDocumentationMan = nil; static NSString *gnustepLocalApps = nil; static NSString *gnustepLocalAdminApps = nil; static NSString *gnustepLocalWebApps = nil; static NSString *gnustepLocalTools = nil; static NSString *gnustepLocalAdminTools = nil; static NSString *gnustepLocalLibrary = nil; static NSString *gnustepLocalLibraries = nil; static NSString *gnustepLocalHeaders = nil; static NSString *gnustepLocalDocumentation = nil; static NSString *gnustepLocalDocumentationInfo = nil; static NSString *gnustepLocalDocumentationMan = nil; static NSString *gnustepUserApps = nil; static NSString *gnustepUserAdminApps = nil; static NSString *gnustepUserWebApps = nil; static NSString *gnustepUserTools = nil; static NSString *gnustepUserAdminTools = nil; static NSString *gnustepUserLibrary = nil; static NSString *gnustepUserLibraries = nil; static NSString *gnustepUserHeaders = nil; static NSString *gnustepUserDocumentation = nil; static NSString *gnustepUserDocumentationInfo = nil; static NSString *gnustepUserDocumentationMan = nil; static NSString *gnustepDeveloperDir = nil; /* These are the same as the corresponding User variables, but * they hold the path before GNUSTEP_HOME is prepended. It's what * we read from config files. */ static NSString *gnustepUserDirApps = nil; static NSString *gnustepUserDirAdminApps = nil; static NSString *gnustepUserDirWebApps = nil; static NSString *gnustepUserDirTools = nil; static NSString *gnustepUserDirAdminTools = nil; static NSString *gnustepUserDirLibrary = nil; static NSString *gnustepUserDirLibraries = nil; static NSString *gnustepUserDirHeaders = nil; static NSString *gnustepUserDirDocumentation = nil; static NSString *gnustepUserDirDocumentationInfo = nil; static NSString *gnustepUserDirDocumentationMan = nil; static NSString *uninstalled = nil; static BOOL ParseConfigurationFile(NSString *name, NSMutableDictionary *dict, NSString *userName); static void InitialisePathUtilities(void); static void ShutdownPathUtilities(void); @interface GSPathUtilities : NSObject @end /* Conditionally assign an object from a dictionary to var * We don't need to retain val before releasing var, because we * can be sure that if var is val it is retained by the dictionary * as well as being retained when it was first placed in var. */ #define ASSIGN_IF_SET(var, dictionary, key) ({\ id val = [dictionary objectForKey: key];\ if (val != nil)\ {\ RELEASE(var);\ var = RETAIN(val);\ [dictionary removeObjectForKey: key];\ }\ }) /* Grab a path from the config file, making it relative to the config * file location if it is '.' or begins with './' or '../', and checking * that the result is an absolute path. */ #define ASSIGN_PATH(var, dictionary, key) ({\ id val = getPathConfig(dictionary, key);\ if (val != nil)\ {\ RELEASE(var);\ var = RETAIN(val);\ [dictionary removeObjectForKey: key];\ }\ }) /* Like ASSIGN_PATH(), but permits the result to be a relative path as that * is what we normally use (the path is within the user's home directory). */ #define ASSIGN_USER(var, dictionary, key) ({\ id val = [dictionary objectForKey: key];\ if (val != nil)\ {\ val = getPath(val);\ }\ if (val != nil)\ {\ RELEASE(var);\ var = RETAIN(val);\ [dictionary removeObjectForKey: key];\ }\ }) /* Conditionally assign lval to var only if var is nil lval must be casted because Clang disallows ObjC literals comparison */ #define TEST_ASSIGN(var, lval) ({\ if ((var == nil)&&((NSString *)lval != nil))\ {\ var = RETAIN(lval);\ }\ }) #define ASSIGN_DEFAULT_PATH(var, default) ({\ if (var == nil)\ {\ var = default; \ var = RETAIN(getPath(var)); \ }\ }) /* The user domain paths are normally located within the user's home directory, * but if they are specified as absolute paths they can be anywhere you like. * */ #define ASSIGN_USER_PATH(var, val) ({\ if (nil == var) \ {\ ASSIGN(var, ([val isAbsolutePath] ? substUser(val) : \ [gnustepUserHome stringByAppendingPathComponent: substUser(val)]));\ }\ }) /* For user domain paths, we allow '%u' as the username, '%i' as the userid, * and '%%' as a '%' in cases where it would otherwise be treated as a * username or userid. */ static NSString* substUser(NSString *str) { if (str != nil && [str rangeOfString: @"%"].length > 0) { NSMutableString *m = [[str mutableCopy] autorelease]; int l = [m length]; int i = 0; BOOL percent = NO; while (i < l) { unichar c = [m characterAtIndex: i]; if (YES == percent) { NSString *s; if (c == '%') { s = @"%"; // Escaped percent } else if (c == 'i') { s = gnustepUserID; // User ID } else if (c == 'u') { s = gnustepUserName; // User name } else { s = nil; // No substitution } if (s != nil) { int diff = [s length] - 2; [m replaceCharactersInRange: NSMakeRange(i-1, 2) withString: s]; l += diff; i += diff; } percent = NO; } else if (c == '%') { percent = YES; } i++; } str = m; } return str; } /* Get a full path string */ static inline NSString * getPath(NSString *path) { if ([path hasPrefix: @"./"] == YES) { path = [gnustepConfigPath stringByAppendingPathComponent: [path substringFromIndex: 2]]; path = [path stringByStandardizingPath]; } else if ([path hasPrefix: @"../"] == YES) { path = [gnustepConfigPath stringByAppendingPathComponent: path]; path = [path stringByStandardizingPath]; } return path; } /* Get a full path string from a dictionary */ static inline NSString * getPathConfig(NSDictionary *dict, NSString *key) { NSString *path; path = [dict objectForKey: key]; if (path != nil) { path = getPath(path); if ([path isAbsolutePath] == NO) { fprintf(stderr, "GNUstep configuration file entry '%s' ('%s') is not " "an absolute path.\nPlease fix your configuration file.\n", [key UTF8String], [[[dict objectForKey: key] description] UTF8String]); #if defined(_WIN32) if ([path length] > 2) { unichar buf[3]; [path getCharacters: buf range: NSMakeRange(0, 3)]; if ((buf[0] == '/' || buf[0] == '\\') && isalpha(buf[1]) && (buf[2] == '/' || buf[2] == '\\')) { path = [NSString stringWithFormat: @"%c:%@", (char)buf[1], [path substringFromIndex: 2]]; path = [path stringByReplacingString: @"/" withString: @"\\"]; fprintf(stderr, "I am guessing that you meant '%s'\n", [path UTF8String]); } } #endif } } return path; } static void ExtractValuesFromConfig(NSDictionary *config) { NSMutableDictionary *c = [config mutableCopy]; BOOL createLibraryPath; id extra; /* * Move values out of the dictionary and into variables for rapid reference. */ ASSIGN_IF_SET(gnustepUserDefaultsDir, c, @"GNUSTEP_USER_DEFAULTS_DIR"); ASSIGN_PATH(gnustepMakefiles, c, @"GNUSTEP_MAKEFILES"); ASSIGN_PATH(gnustepDeveloperDir, c, @"GNUSTEP_DEVELOPER_DIR"); ASSIGN_PATH(gnustepSystemUsersDir, c, @"GNUSTEP_SYSTEM_USERS_DIR"); ASSIGN_PATH(gnustepNetworkUsersDir, c, @"GNUSTEP_NETWORK_USERS_DIR"); ASSIGN_PATH(gnustepLocalUsersDir, c, @"GNUSTEP_LOCAL_USERS_DIR"); ASSIGN_PATH(gnustepSystemApps, c, @"GNUSTEP_SYSTEM_APPS"); ASSIGN_PATH(gnustepSystemAdminApps, c, @"GNUSTEP_SYSTEM_ADMIN_APPS"); ASSIGN_PATH(gnustepSystemWebApps, c, @"GNUSTEP_SYSTEM_WEB_APPS"); ASSIGN_PATH(gnustepSystemTools, c, @"GNUSTEP_SYSTEM_TOOLS"); ASSIGN_PATH(gnustepSystemAdminTools, c, @"GNUSTEP_SYSTEM_ADMIN_TOOLS"); ASSIGN_PATH(gnustepSystemLibrary, c, @"GNUSTEP_SYSTEM_LIBRARY"); ASSIGN_PATH(gnustepSystemLibraries, c, @"GNUSTEP_SYSTEM_LIBRARIES"); ASSIGN_PATH(gnustepSystemHeaders, c, @"GNUSTEP_SYSTEM_HEADERS"); ASSIGN_PATH(gnustepSystemDocumentation, c, @"GNUSTEP_SYSTEM_DOC"); ASSIGN_PATH(gnustepSystemDocumentationMan, c, @"GNUSTEP_SYSTEM_DOC_MAN"); ASSIGN_PATH(gnustepSystemDocumentationInfo, c, @"GNUSTEP_SYSTEM_DOC_INFO"); ASSIGN_PATH(gnustepNetworkApps, c, @"GNUSTEP_NETWORK_APPS"); ASSIGN_PATH(gnustepNetworkAdminApps, c, @"GNUSTEP_NETWORK_ADMIN_APPS"); ASSIGN_PATH(gnustepNetworkWebApps, c, @"GNUSTEP_NETWORK_WEB_APPS"); ASSIGN_PATH(gnustepNetworkTools, c, @"GNUSTEP_NETWORK_TOOLS"); ASSIGN_PATH(gnustepNetworkAdminTools, c, @"GNUSTEP_NETWORK_ADMIN_TOOLS"); ASSIGN_PATH(gnustepNetworkLibrary, c, @"GNUSTEP_NETWORK_LIBRARY"); ASSIGN_PATH(gnustepNetworkLibraries, c, @"GNUSTEP_NETWORK_LIBRARIES"); ASSIGN_PATH(gnustepNetworkHeaders, c, @"GNUSTEP_NETWORK_HEADERS"); ASSIGN_PATH(gnustepNetworkDocumentation, c, @"GNUSTEP_NETWORK_DOC"); ASSIGN_PATH(gnustepNetworkDocumentationMan, c, @"GNUSTEP_NETWORK_DOC_MAN"); ASSIGN_PATH(gnustepNetworkDocumentationInfo, c, @"GNUSTEP_NETWORK_DOC_INFO"); ASSIGN_PATH(gnustepLocalApps, c, @"GNUSTEP_LOCAL_APPS"); ASSIGN_PATH(gnustepLocalAdminApps, c, @"GNUSTEP_LOCAL_ADMIN_APPS"); ASSIGN_PATH(gnustepLocalWebApps, c, @"GNUSTEP_LOCAL_WEB_APPS"); ASSIGN_PATH(gnustepLocalTools, c, @"GNUSTEP_LOCAL_TOOLS"); ASSIGN_PATH(gnustepLocalAdminTools, c, @"GNUSTEP_LOCAL_ADMIN_TOOLS"); ASSIGN_PATH(gnustepLocalLibrary, c, @"GNUSTEP_LOCAL_LIBRARY"); ASSIGN_PATH(gnustepLocalLibraries, c, @"GNUSTEP_LOCAL_LIBRARIES"); ASSIGN_PATH(gnustepLocalHeaders, c, @"GNUSTEP_LOCAL_HEADERS"); ASSIGN_PATH(gnustepLocalDocumentation, c, @"GNUSTEP_LOCAL_DOC"); ASSIGN_PATH(gnustepLocalDocumentationMan, c, @"GNUSTEP_LOCAL_DOC_MAN"); ASSIGN_PATH(gnustepLocalDocumentationInfo, c, @"GNUSTEP_LOCAL_DOC_INFO"); ASSIGN_USER(gnustepUserDirApps, c, @"GNUSTEP_USER_DIR_APPS"); TEST_ASSIGN(gnustepUserDirApps, @GNUSTEP_TARGET_USER_DIR_APPS); ASSIGN_USER(gnustepUserDirAdminApps, c, @"GNUSTEP_USER_DIR_ADMIN_APPS"); TEST_ASSIGN(gnustepUserDirAdminApps, @GNUSTEP_TARGET_USER_DIR_ADMIN_APPS); ASSIGN_USER(gnustepUserDirWebApps, c, @"GNUSTEP_USER_DIR_WEB_APPS"); TEST_ASSIGN(gnustepUserDirWebApps, @GNUSTEP_TARGET_USER_DIR_WEB_APPS); ASSIGN_USER(gnustepUserDirTools, c, @"GNUSTEP_USER_DIR_TOOLS"); TEST_ASSIGN(gnustepUserDirTools, @GNUSTEP_TARGET_USER_DIR_TOOLS); ASSIGN_USER(gnustepUserDirAdminTools, c, @"GNUSTEP_USER_DIR_ADMIN_TOOLS"); TEST_ASSIGN(gnustepUserDirAdminTools, @GNUSTEP_TARGET_USER_DIR_ADMIN_TOOLS); ASSIGN_USER(gnustepUserDirLibrary, c, @"GNUSTEP_USER_DIR_LIBRARY"); TEST_ASSIGN(gnustepUserDirLibrary, @GNUSTEP_TARGET_USER_DIR_LIBRARY); ASSIGN_USER(gnustepUserDirLibraries, c, @"GNUSTEP_USER_DIR_LIBRARIES"); TEST_ASSIGN(gnustepUserDirLibraries, @GNUSTEP_TARGET_USER_DIR_LIBRARIES); ASSIGN_USER(gnustepUserDirHeaders, c, @"GNUSTEP_USER_DIR_HEADERS"); TEST_ASSIGN(gnustepUserDirHeaders, @GNUSTEP_TARGET_USER_DIR_HEADERS); ASSIGN_USER(gnustepUserDirDocumentation, c, @"GNUSTEP_USER_DIR_DOC"); TEST_ASSIGN(gnustepUserDirDocumentation, @GNUSTEP_TARGET_USER_DIR_DOC); ASSIGN_USER(gnustepUserDirDocumentationMan, c, @"GNUSTEP_USER_DIR_DOC_MAN"); TEST_ASSIGN(gnustepUserDirDocumentationMan, @GNUSTEP_TARGET_USER_DIR_DOC_MAN); ASSIGN_USER(gnustepUserDirDocumentationInfo, c, @"GNUSTEP_USER_DIR_DOC_INFO"); TEST_ASSIGN(gnustepUserDirDocumentationInfo, @GNUSTEP_TARGET_USER_DIR_DOC_INFO); /* * The GNUSTEP_EXTRA field may contain a list of extra keys which * we permit in the dictionary without generating a warning. */ extra = [c objectForKey: @"GNUSTEP_EXTRA"]; if (extra != nil) { NSEnumerator *enumerator; NSString *key; if ([extra isKindOfClass: [NSString class]] == YES) { extra = [extra componentsSeparatedByString: @","]; } enumerator = [extra objectEnumerator]; [c removeObjectForKey: @"GNUSTEP_EXTRA"]; while ((key = [enumerator nextObject]) != nil) { key = [key stringByTrimmingSpaces]; [c removeObjectForKey: key]; } } [c removeObjectForKey: @"GNUSTEP_SYSTEM_DEFAULTS_FILE"]; /* If GNUSTEP_CREATE_LIBRARY_PATH is YES then we should ensure that the * per-user directory and the Library subdirectory exist so resources * can safely be stored in them. */ createLibraryPath = [[c objectForKey: @"GNUSTEP_CREATE_LIBRARY_PATH"] boolValue]; [c removeObjectForKey: @"GNUSTEP_CREATE_LIBRARY_PATH"]; /* * Remove any other dictionary entries we have used. */ [c removeObjectForKey: @"GNUSTEP_USER_CONFIG_FILE"]; /* FIXME ... for the time being we just ignore obsolete keys */ [c removeObjectForKey: @"GNUSTEP_USER_ROOT"]; [c removeObjectForKey: @"GNUSTEP_LOCAL_ROOT"]; [c removeObjectForKey: @"GNUSTEP_SYSTEM_ROOT"]; [c removeObjectForKey: @"GNUSTEP_NETWORK_ROOT"]; [c removeObjectForKey: @"GNUSTEP_USER_DIR"]; if ([c count] > 0) { /* * The dictionary should be empty ... report problems */ fprintf(stderr, "Configuration contains unknown keys - %s\n" "Add them in the comma separated list GNUSTEP_EXTRA=... if required.\n", [[[c allKeys] description] UTF8String]); } DESTROY(c); /* * Set default locations for user files if necessary. */ if (gnustepUserDefaultsDir == nil) { ASSIGN(gnustepUserDefaultsDir, @GNUSTEP_TARGET_USER_DEFAULTS_DIR); } if (gnustepUserDirApps == nil) { ASSIGN(gnustepUserDirApps, @GNUSTEP_TARGET_USER_DIR_APPS); } if (gnustepUserDirTools == nil) { ASSIGN(gnustepUserDirTools, @GNUSTEP_TARGET_USER_DIR_TOOLS); } if (gnustepUserDirLibrary == nil) { ASSIGN(gnustepUserDirLibrary, @GNUSTEP_TARGET_USER_DIR_LIBRARY); } if (gnustepUserDirLibraries == nil) { ASSIGN(gnustepUserDirLibraries, @GNUSTEP_TARGET_USER_DIR_LIBRARIES); } if (gnustepUserDirHeaders == nil) { ASSIGN(gnustepUserDirHeaders, @GNUSTEP_TARGET_USER_DIR_HEADERS); } if (gnustepUserDirDocumentation == nil) { ASSIGN(gnustepUserDirDocumentation, @GNUSTEP_TARGET_USER_DIR_DOC); } if (gnustepUserDirDocumentationMan == nil) { ASSIGN(gnustepUserDirDocumentationMan, @GNUSTEP_TARGET_USER_DIR_DOC_MAN); } if (gnustepUserDirDocumentationInfo == nil) { ASSIGN(gnustepUserDirDocumentationInfo, @GNUSTEP_TARGET_USER_DIR_DOC_INFO); } /* * Set the GNUSTEP_USER_xxx variables from the user home and the * GNUSTEP_USER_DIR_xxx variables. */ ASSIGN_USER_PATH(gnustepUserApps, gnustepUserDirApps); ASSIGN_USER_PATH(gnustepUserAdminApps, gnustepUserDirAdminApps); ASSIGN_USER_PATH(gnustepUserWebApps, gnustepUserDirWebApps); ASSIGN_USER_PATH(gnustepUserTools, gnustepUserDirTools); ASSIGN_USER_PATH(gnustepUserAdminTools, gnustepUserDirAdminTools); ASSIGN_USER_PATH(gnustepUserLibrary, gnustepUserDirLibrary); ASSIGN_USER_PATH(gnustepUserLibraries, gnustepUserDirLibraries); ASSIGN_USER_PATH(gnustepUserHeaders, gnustepUserDirHeaders); ASSIGN_USER_PATH(gnustepUserDocumentation, gnustepUserDocumentation); ASSIGN_USER_PATH(gnustepUserDocumentationMan, gnustepUserDocumentationMan); ASSIGN_USER_PATH(gnustepUserDocumentationInfo, gnustepUserDocumentationInfo); /* * Try to ensure that essential user directories exist if we need to. */ if (YES == createLibraryPath) { NSFileManager *manager; NSString *path; NSDictionary *attr; BOOL flag; manager = [NSFileManager defaultManager]; attr = [NSDictionary dictionaryWithObject: [NSNumber numberWithInt: 0750] forKey: NSFilePosixPermissions]; // Make sure library directory exists (to store resources). path = gnustepUserLibrary; if ([manager fileExistsAtPath: path isDirectory: &flag] == NO || flag == NO) { [manager createDirectoryAtPath: path withIntermediateDirectories: YES attributes: attr error: NULL]; } } /* * Finally set default locations for the essential paths if required. */ ASSIGN_DEFAULT_PATH(gnustepSystemApps, @GNUSTEP_TARGET_SYSTEM_APPS); ASSIGN_DEFAULT_PATH(gnustepSystemAdminApps, @GNUSTEP_TARGET_SYSTEM_ADMIN_APPS); ASSIGN_DEFAULT_PATH(gnustepSystemWebApps, @GNUSTEP_TARGET_SYSTEM_WEB_APPS); ASSIGN_DEFAULT_PATH(gnustepSystemTools, @GNUSTEP_TARGET_SYSTEM_TOOLS); ASSIGN_DEFAULT_PATH(gnustepSystemAdminTools, @GNUSTEP_TARGET_SYSTEM_ADMIN_TOOLS); ASSIGN_DEFAULT_PATH(gnustepSystemLibrary, @GNUSTEP_TARGET_SYSTEM_LIBRARY); ASSIGN_DEFAULT_PATH(gnustepSystemLibraries, @GNUSTEP_TARGET_SYSTEM_LIBRARIES); ASSIGN_DEFAULT_PATH(gnustepSystemHeaders, @GNUSTEP_TARGET_SYSTEM_HEADERS); ASSIGN_DEFAULT_PATH(gnustepSystemDocumentation, @GNUSTEP_TARGET_SYSTEM_DOC); ASSIGN_DEFAULT_PATH(gnustepSystemDocumentationMan, @GNUSTEP_TARGET_SYSTEM_DOC_MAN); ASSIGN_DEFAULT_PATH(gnustepSystemDocumentationInfo, @GNUSTEP_TARGET_SYSTEM_DOC_INFO); ASSIGN_DEFAULT_PATH(gnustepNetworkApps, @GNUSTEP_TARGET_NETWORK_APPS); ASSIGN_DEFAULT_PATH(gnustepNetworkAdminApps, @GNUSTEP_TARGET_NETWORK_ADMIN_APPS); ASSIGN_DEFAULT_PATH(gnustepNetworkWebApps, @GNUSTEP_TARGET_NETWORK_WEB_APPS); ASSIGN_DEFAULT_PATH(gnustepNetworkTools, @GNUSTEP_TARGET_NETWORK_TOOLS); ASSIGN_DEFAULT_PATH(gnustepNetworkAdminTools, @GNUSTEP_TARGET_NETWORK_ADMIN_TOOLS); ASSIGN_DEFAULT_PATH(gnustepNetworkLibrary, @GNUSTEP_TARGET_NETWORK_LIBRARY); ASSIGN_DEFAULT_PATH(gnustepNetworkLibraries, @GNUSTEP_TARGET_NETWORK_LIBRARIES); ASSIGN_DEFAULT_PATH(gnustepNetworkHeaders, @GNUSTEP_TARGET_NETWORK_HEADERS); ASSIGN_DEFAULT_PATH(gnustepNetworkDocumentation, @GNUSTEP_TARGET_NETWORK_DOC); ASSIGN_DEFAULT_PATH(gnustepNetworkDocumentationMan, @GNUSTEP_TARGET_NETWORK_DOC_MAN); ASSIGN_DEFAULT_PATH(gnustepNetworkDocumentationInfo, @GNUSTEP_TARGET_NETWORK_DOC_INFO); ASSIGN_DEFAULT_PATH(gnustepLocalApps, @GNUSTEP_TARGET_LOCAL_APPS); ASSIGN_DEFAULT_PATH(gnustepLocalAdminApps, @GNUSTEP_TARGET_LOCAL_ADMIN_APPS); ASSIGN_DEFAULT_PATH(gnustepLocalWebApps, @GNUSTEP_TARGET_LOCAL_WEB_APPS); ASSIGN_DEFAULT_PATH(gnustepLocalTools, @GNUSTEP_TARGET_LOCAL_TOOLS); ASSIGN_DEFAULT_PATH(gnustepLocalAdminTools, @GNUSTEP_TARGET_LOCAL_ADMIN_TOOLS); ASSIGN_DEFAULT_PATH(gnustepLocalLibrary, @GNUSTEP_TARGET_LOCAL_LIBRARY); ASSIGN_DEFAULT_PATH(gnustepLocalLibraries, @GNUSTEP_TARGET_LOCAL_LIBRARIES); ASSIGN_DEFAULT_PATH(gnustepLocalHeaders, @GNUSTEP_TARGET_LOCAL_HEADERS); ASSIGN_DEFAULT_PATH(gnustepLocalDocumentation, @GNUSTEP_TARGET_LOCAL_DOC); ASSIGN_DEFAULT_PATH(gnustepLocalDocumentationMan, @GNUSTEP_TARGET_LOCAL_DOC_MAN); ASSIGN_DEFAULT_PATH(gnustepLocalDocumentationInfo, @GNUSTEP_TARGET_LOCAL_DOC_INFO); ASSIGN_DEFAULT_PATH(gnustepMakefiles, @GNUSTEP_TARGET_MAKEFILES); ASSIGN_DEFAULT_PATH(gnustepSystemUsersDir, @GNUSTEP_TARGET_SYSTEM_USERS_DIR); ASSIGN_DEFAULT_PATH(gnustepNetworkUsersDir, @GNUSTEP_TARGET_NETWORK_USERS_DIR); ASSIGN_DEFAULT_PATH(gnustepLocalUsersDir, @GNUSTEP_TARGET_LOCAL_USERS_DIR); } static void addDefaults(NSString *defs, NSMutableDictionary *conf) { if ([MGR() isReadableFileAtPath: defs] == YES) { NSDictionary *d; NSDictionary *attributes; attributes = [MGR() fileAttributesAtPath: defs traverseLink: YES]; if (([attributes filePosixPermissions] & (0022 & ATTRMASK)) != 0) { #if defined(_WIN32) fprintf(stderr, "\nThe file '%S' is writable by someone other than" " its owner (permissions 0%lo).\nIgnoring it.\n", [defs fileSystemRepresentation], (long)[attributes filePosixPermissions]); #else fprintf(stderr, "\nThe file '%s' is writable by someone other than" " its owner (permissions 0%lo).\nIgnoring it.\n", [defs fileSystemRepresentation], (long)[attributes filePosixPermissions]); #endif d = nil; } else { NSString *s; /* Here we load the string and convert to a property list * rather than using higher-level methods likely to raise * an exception or otherwise use the NSUserDefaults * system and cause recursion on error. */ s = [[NSString allocWithZone: NSDefaultMallocZone()] initWithContentsOfFile: defs]; if (nil == s) { d = nil; } else { NS_DURING { d = [s propertyList]; if (NO == [d isKindOfClass: [NSDictionary class]]) { d = nil; } } NS_HANDLER { d = nil; } NS_ENDHANDLER RELEASE(s); } if (nil == d) { #if defined(_WIN32) fprintf(stderr, "\nThe file '%S' is not parseable as a property list" " containing a dictionary.\nIgnoring it.\n", [defs fileSystemRepresentation]); #else fprintf(stderr, "\nThe file '%s' is not parseable as a property list" " containing a dictionary.\nIgnoring it.\n", [defs fileSystemRepresentation]); #endif } } if (d != nil) { NSEnumerator *enumerator; NSString *key; id extra; extra = [conf objectForKey: @"GNUSTEP_EXTRA"]; if ([extra isKindOfClass: [NSString class]]) { extra = [extra componentsSeparatedByString: @","]; } extra = [extra mutableCopy]; if (extra == nil) { extra = [NSMutableArray new]; } enumerator = [d keyEnumerator]; while ((key = [enumerator nextObject]) != nil) { if ([conf objectForKey: key] == nil) { [extra addObject: key]; } else { fprintf(stderr, "Value for key '%s' in '%s' replaces" " earlier setting.\n", [key UTF8String], [defs UTF8String]); } } [conf addEntriesFromDictionary: d]; if ([extra count] > 0) { NSArray *c = [extra copy]; [conf setObject: c forKey: @"GNUSTEP_EXTRA"]; RELEASE(c); } RELEASE(extra); } } } GS_DECLARE NSMutableDictionary* GNUstepConfig(NSDictionary *newConfig) { static NSDictionary *config = nil; static BOOL beenHere = NO; NSMutableDictionary *conf = nil; BOOL changedSystemConfig = NO; [gnustep_global_lock lock]; if (NO == beenHere) { beenHere = YES; [[NSObject leakAt: &config] release]; } if (config == nil || (newConfig != nil && [config isEqual: newConfig] == NO)) { NS_DURING { if (newConfig == nil) { NSString *file = nil; NSString *path; NSEnumerator *e; NSString *defs; BOOL fromEnvironment = YES; BOOL bareDirectory = NO; conf = [[NSMutableDictionary alloc] initWithCapacity: 32]; /* Now we source the configuration file if it exists */ #if !OPTION_NO_ENVIRONMENT file = [[[NSProcessInfo processInfo] environment] objectForKey: @"GNUSTEP_CONFIG_FILE"]; #endif if (file == nil) { fromEnvironment = NO; file = @GNUSTEP_TARGET_CONFIG_FILE; } /* * Is the file missing from the path ... if so we won't * be reading it. */ if ([file hasSuffix: @"/"] || [file hasSuffix: @"\\"]) { bareDirectory = YES; } /* * Special case ... if the config file location begins './' * or '../' then we determine it's actual path by working * relative to the gnustep-base library. */ if ([file hasPrefix: @"./"] == YES || [file hasPrefix: @"../"] == YES) { Class c = [NSProcessInfo class]; path = GSPrivateSymbolPath(c); // Remove library name from path path = [path stringByDeletingLastPathComponent]; if ([file hasPrefix: @"./"] == YES) { file = [file substringFromIndex: 2]; } // Join the two together file = [path stringByAppendingPathComponent: file]; } file = [file stringByStandardizingPath]; if ([file isAbsolutePath] == NO) { if (fromEnvironment == YES) { fprintf(stderr, "GNUSTEP_CONFIG_FILE value ('%s') is not" " an absolute path. Please fix the environment" " variable.\n", [file UTF8String]); } else { fprintf(stderr, "GNUSTEP_CONFIG_FILE value ('%s') is not" " an absolute path. Please rebuild GNUstep-base" " specifying a valid path to the config file.\n", [file UTF8String]); } #if defined(_WIN32) if ([file length] > 2) { unichar buf[3]; [file getCharacters: buf range: NSMakeRange(0, 3)]; if ((buf[0] == '/' || buf[0] == '\\') && isalpha(buf[1]) && (buf[2] == '/' || buf[2] == '\\')) { file = [NSString stringWithFormat: @"%c:%@", (char)buf[1], [file substringFromIndex: 2]]; file = [file stringByReplacingString: @"/" withString: @"\\"]; fprintf(stderr, "I am guessing that you meant '%s'\n", [file UTF8String]); } } #endif } if (bareDirectory == YES) { /* Set the directory name, but don't try to read file. */ gnustepConfigPath = RETAIN(file); } else { gnustepConfigPath = RETAIN([file stringByDeletingLastPathComponent]); ParseConfigurationFile(file, conf, nil); } /* Merge in any values from property lists in the * GlobalDefaults directory. */ path = [gnustepConfigPath stringByAppendingPathComponent: @"GlobalDefaults"]; e = [[MGR() directoryContentsAtPath: path] objectEnumerator]; while ((defs = [e nextObject]) != nil) { if ([[defs pathExtension] isEqualToString: @"plist"]) { defs = [path stringByAppendingPathComponent: defs]; addDefaults(defs, conf); } } /* And merge in value from GlobalDefaults.plist */ defs = [gnustepConfigPath stringByAppendingPathComponent: @"GlobalDefaults.plist"]; addDefaults(defs, conf); } else { conf = [newConfig mutableCopy]; } /* System admins may force the user and defaults paths by * setting GNUSTEP_USER_CONFIG_FILE to be an empty string. * If they simply don't define it at all, we assign a default. */ if ([conf objectForKey: @"GNUSTEP_USER_CONFIG_FILE"] == nil) { [conf setObject: @GNUSTEP_TARGET_USER_CONFIG_FILE forKey: @"GNUSTEP_USER_CONFIG_FILE"]; } if (config != nil) { changedSystemConfig = YES; } config = [conf copy]; DESTROY(conf); } NS_HANDLER { [gnustep_global_lock unlock]; config = nil; DESTROY(conf); [localException raise]; } NS_ENDHANDLER } [gnustep_global_lock unlock]; if (changedSystemConfig == YES) { /* * The main configuration was changed by passing in a dictionary to * this function, so we need to reset the path utilities system to use * any new values from the config. */ ShutdownPathUtilities(); InitialisePathUtilities(); } return AUTORELEASE([config mutableCopy]); } GS_DECLARE void GNUstepUserConfig(NSMutableDictionary *config, NSString *userName) { #ifdef HAVE_GETEUID if (userName != nil) { /* * A program which is running setuid cannot be trusted * to pick up user specific config, so we clear the userName * to force the system configuration to be returned rather * than a per-user config. */ if (getuid() != geteuid()) { userName = nil; } } #endif if (userName != nil) { NSString *file; NSString *home; NSString *path; file = RETAIN([config objectForKey: @"GNUSTEP_USER_CONFIG_FILE"]); if ([file length] > 0) { home = NSHomeDirectoryForUser(userName); path = [home stringByAppendingPathComponent: file]; ParseConfigurationFile(path, config, userName); } /* * We don't let the user config file override the GNUSTEP_USER_CONFIG_FILE * variable ... that would be silly/pointless. */ [config setObject: file forKey: @"GNUSTEP_USER_CONFIG_FILE"]; RELEASE(file); } } /* Initialise all things required by this module */ static void InitialisePathUtilities(void) { if (gnustepMakefiles != nil) { return; // Protect from multiple calls } /* Set up our root paths */ NS_DURING { NSMutableDictionary *config; static BOOL beenHere = NO; [gnustep_global_lock lock]; if (NO == beenHere) { beenHere = YES; if (YES == [NSObject shouldCleanUp]) { // Get path utilities shutdown called at process exit. [GSPathUtilities class]; } } ASSIGNCOPY(uninstalled, [[[NSProcessInfo processInfo] environment] objectForKey: @"GNUSTEP_UNINSTALLED_LIBRARY_DIRECTORY"]); gnustepUserName = [NSUserName() copy]; #if defined(_WIN32) { union { SID sid; char dummy[1024]; } s; LPTSTR str; GSNativeChar buf[1024]; GSNativeChar dom[1024]; SID_NAME_USE use; DWORD bsize = 1024; DWORD ssize = 1024; if (GetUserNameW(buf, &bsize) == 0 || buf[0] == '\0') { [NSException raise: NSInternalInconsistencyException format: @"Unable to determine current user name: %@", [NSError _last]]; } bsize = 1024; if (LookupAccountNameW(0, buf, &s.sid, &ssize, dom, &bsize, &use) == 0) { [NSException raise: NSInternalInconsistencyException format: @"Unable to determine current account: %@", [NSError _last]]; } if (ConvertSidToStringSid(&s.sid, &str) == 0) { [NSException raise: NSInternalInconsistencyException format: @"Unable to get current user ID string: %@", [NSError _last]]; } gnustepUserID = [[NSString alloc] initWithUTF8String: str]; } #else gnustepUserID = [[NSString alloc] initWithFormat: @"%ld", (long)getuid()]; #endif config = GNUstepConfig(nil); GNUstepUserConfig(config, gnustepUserName); gnustepUserHome = [NSHomeDirectoryForUser(gnustepUserName) copy]; ExtractValuesFromConfig(config); [gnustep_global_lock unlock]; } NS_HANDLER { /* unlock then re-raise the exception */ [gnustep_global_lock unlock]; [localException raise]; } NS_ENDHANDLER } /* * Close down and release all things allocated. */ static void ShutdownPathUtilities(void) { DESTROY(gnustepUserHome); DESTROY(gnustepUserID); DESTROY(gnustepUserName); DESTROY(gnustepUserDefaultsDir); DESTROY(gnustepMakefiles); DESTROY(gnustepSystemUsersDir); DESTROY(gnustepNetworkUsersDir); DESTROY(gnustepLocalUsersDir); DESTROY(gnustepSystemApps); DESTROY(gnustepSystemAdminApps); DESTROY(gnustepSystemWebApps); DESTROY(gnustepSystemTools); DESTROY(gnustepSystemAdminTools); DESTROY(gnustepSystemLibrary); DESTROY(gnustepSystemLibraries); DESTROY(gnustepSystemHeaders); DESTROY(gnustepSystemDocumentation); DESTROY(gnustepSystemDocumentationMan); DESTROY(gnustepSystemDocumentationInfo); DESTROY(gnustepNetworkApps); DESTROY(gnustepNetworkAdminApps); DESTROY(gnustepNetworkWebApps); DESTROY(gnustepNetworkTools); DESTROY(gnustepNetworkAdminTools); DESTROY(gnustepNetworkLibrary); DESTROY(gnustepNetworkLibraries); DESTROY(gnustepNetworkHeaders); DESTROY(gnustepNetworkDocumentation); DESTROY(gnustepNetworkDocumentationMan); DESTROY(gnustepNetworkDocumentationInfo); DESTROY(gnustepLocalApps); DESTROY(gnustepLocalAdminApps); DESTROY(gnustepLocalWebApps); DESTROY(gnustepLocalTools); DESTROY(gnustepLocalAdminTools); DESTROY(gnustepLocalLibrary); DESTROY(gnustepLocalLibraries); DESTROY(gnustepLocalHeaders); DESTROY(gnustepLocalDocumentation); DESTROY(gnustepLocalDocumentationMan); DESTROY(gnustepLocalDocumentationInfo); DESTROY(gnustepDeveloperDir); DESTROY(gnustepUserApps); DESTROY(gnustepUserAdminApps); DESTROY(gnustepUserWebApps); DESTROY(gnustepUserTools); DESTROY(gnustepUserAdminTools); DESTROY(gnustepUserLibrary); DESTROY(gnustepUserLibraries); DESTROY(gnustepUserHeaders); DESTROY(gnustepUserDocumentation); DESTROY(gnustepUserDocumentationMan); DESTROY(gnustepUserDocumentationInfo); DESTROY(tempDir); } /** * Reads a file and expects it to be in basic unix "conf" style format with * one key = value per line (the format a unix shell can 'source' in order * to define shell variables).
* This attempts to mimic the escape sequence and quoting conventions of * the standard bourne shell, so that a config file sourced by the make * package will produce the same results as one parsed by this function.
* Keys, by convention, consiste of uppercase letters, digits, * and underscores, and must not begin with a digit.
* A value may be any quoted string (or an unquoted string containing no * white space).
* Lines beginning with a hash '#' are deemed comment lines and ignored.
* The backslash character may be used as an escape character anywhere * in the file except within a singly quoted string * (where it is taken literally).
* A backslash followed immediately by a newline (except in a singly * quoted string) is removed completely along with the newline ... it * thus serves to join lines so that they are treated as a single line.
* NB. Since ms-windows uses backslash characters in paths, it is a good * idea to specify path values in the config file as singly quoted * strings to avoid having to double all occurrences of the backslash.
* Returns a dictionary of the (key,value) pairs.
* If the file does not exist, * the function makes no changes to dict and returns NO. */ static BOOL ParseConfigurationFile(NSString *fileName, NSMutableDictionary *dict, NSString *userName) { NSDictionary *attributes; NSString *file; unsigned l; unichar *src; unichar *dst; unichar *end; unichar *spos; unichar *dpos; BOOL newLine = YES; BOOL wantKey = YES; BOOL wantVal = NO; NSString *key = nil; if ([MGR() isReadableFileAtPath: fileName] == NO) { return NO; } attributes = [MGR() fileAttributesAtPath: fileName traverseLink: YES]; if (userName != nil) { NSString *fileOwner = [attributes fileOwnerAccountName]; if ([userName isEqual: fileOwner] == NO) { #if defined(_WIN32) fprintf(stderr, "The file '%S' is owned by '%s' but we expect it" " to be the personal config file of '%s'.\nIgnoring it.\n", [fileName fileSystemRepresentation], [fileOwner UTF8String], [userName UTF8String]); #else fprintf(stderr, "The file '%s' is owned by '%s' but we expect it" " to be the personal config file of '%s'.\nIgnoring it.\n", [fileName fileSystemRepresentation], [fileOwner UTF8String], [userName UTF8String]); #endif return NO; } } if (([attributes filePosixPermissions] & (0022 & ATTRMASK)) != 0) { #if defined(_WIN32) fprintf(stderr, "The file '%S' is writable by someone other than" " its owner (permissions 0%lo).\nIgnoring it.\n", [fileName fileSystemRepresentation], (long)[attributes filePosixPermissions]); #else fprintf(stderr, "The file '%s' is writable by someone other than" " its owner (permissions 0%lo).\nIgnoring it.\n", [fileName fileSystemRepresentation], (long)[attributes filePosixPermissions]); #endif return NO; } if (dict == nil) { [NSException raise: NSInvalidArgumentException format: @"No destination dictionary supplied"]; } file = [NSString stringWithContentsOfFile: fileName]; l = [file length]; src = (unichar*)NSZoneMalloc(NSDefaultMallocZone(), sizeof(unichar) * l); spos = src; end = src + l; dst = (unichar*)NSZoneMalloc(NSDefaultMallocZone(), sizeof(unichar) * l); dpos = dst; [file getCharacters: src]; while (spos < end) { /* * Step past any whitespace ... including blank lines */ while (spos < end) { if (*spos == '\\') { spos++; if (spos >= end) { break; // At end of file ... odd but not fatal } } if (*spos > ' ') { break; // OK ... found a non space character. } if (*spos == '\r' || *spos == '\n') { newLine = YES; } spos++; } /* * Handle any comments .. hash on a new line. */ if (newLine == YES) { if (wantVal == YES) { /* * On a newline ...so the last key had no value set. * Put an empty value in the dictionary. */ [dict setObject: @"" forKey: key]; DESTROY(key); wantVal = NO; } if (spos < end && *spos == '#') { // Got a comment ... ignore remainder of line. while (spos < end && *spos != '\n' && *spos != '\r') { spos++; } continue; // restart loop ... skip space at start of line } newLine = NO; wantKey = YES; } if (spos >= end) { break; // At end of file ... odd but not fatal } if (*spos == '=') { if (wantKey == NO) { wantVal = YES; } spos++; } else if (*spos == '\'') { spos++; while (spos < end) { if (*spos == '\'') { spos++; break; } *dpos++ = *spos++; } if (wantVal == YES) { NSString *val = [NSString alloc]; val = [val initWithCharacters: dst length: dpos - dst]; if (val != nil) { [dict setObject: val forKey: key]; DESTROY(key); DESTROY(val); wantVal = NO; } } dpos = dst; // reset output buffer } else if (*spos == '"') { spos++; while (spos < end) { BOOL escaped = NO; if (*spos == '\\') { spos++; if (spos >= end) { break; // Unexpected end of file } if (*spos == '\n') { spos++; continue; // escaped newline is removed. } if (*spos == '\r') { spos++; if (spos < end && *spos == '\n') { spos++; } continue; // escaped newline is removed. } escaped = YES; } if (*spos == '"' && escaped == NO) { spos++; break; } *dpos++ = *spos++; } if (wantVal == YES) { NSString *val = [NSString alloc]; val = [val initWithCharacters: dst length: dpos - dst]; if (val != nil) { [dict setObject: val forKey: key]; DESTROY(key); DESTROY(val); wantVal = NO; } } dpos = dst; // reset output buffer } else { while (spos < end) { if (*spos == '\\') { spos++; if (spos >= end) { break; // Unexpected end of file } if (*spos == '\n') { spos++; continue; // escaped newline is removed. } if (*spos == '\r') { spos++; if (spos < end && *spos == '\n') { spos++; } continue; // escaped newline is removed. } } if (isspace(*spos) || *spos == '=') { break; } *dpos++ = *spos++; } if (wantKey == YES) { key = [NSString alloc]; key = [key initWithCharacters: dst length: dpos - dst]; if (key != nil) { wantKey = NO; } } else if (wantVal == YES) { NSString *val = [NSString alloc]; val = [val initWithCharacters: dst length: dpos - dst]; if (val != nil) { [dict setObject: val forKey: key]; DESTROY(key); DESTROY(val); wantVal = NO; } } dpos = dst; // reset output buffer } } if (wantVal == YES) { [dict setObject: @"" forKey: key]; } DESTROY(key); NSZoneFree(NSDefaultMallocZone(), src); NSZoneFree(NSDefaultMallocZone(), dst); return YES; } /* See NSPathUtilities.h for description */ GS_DECLARE void GSSetUserName(NSString *aName) { NSCParameterAssert([aName length] > 0); /* * Do nothing if it's not a different user. */ if ([theUserName isEqualToString: aName]) { return; } /* * Release the memory */ [gnustep_global_lock lock]; ShutdownPathUtilities(); /* * Reset things as new user */ ASSIGN(theUserName, aName); DESTROY(theFullUserName); InitialisePathUtilities(); [NSUserDefaults resetStandardUserDefaults]; [gnustep_global_lock unlock]; } /** * Return the caller's login name as an NSString object.
* Under unix-like systems, the name associated with the current * effective user ID is used.
* Under ms-windows, the 'LOGNAME' environment is used, or if that fails, the * GetUserName() call is used to find the user name.
* Raises an exception on failure. */ /* NOTE FOR DEVELOPERS. * If you change the behavior of this method you must also change * user_home.c in the makefiles package to match. */ GS_DECLARE NSString * NSUserName(void) { #if defined(_WIN32) if (theUserName == nil) { /* Use the LOGNAME environment variable if set. */ theUserName = [[[NSProcessInfo processInfo] environment] objectForKey: @"LOGNAME"]; if ([theUserName length] > 0) { RETAIN(theUserName); } else { /* The GetUserName function returns the current user name */ GSNativeChar buf[1024]; DWORD n = 1024; if (GetUserNameW(buf, &n) != 0 && buf[0] != '\0') { theUserName = [[NSString alloc] initWithCharacters: buf length: wcslen(buf)]; } else { theUserName = nil; [NSException raise: NSInternalInconsistencyException format: @"Unable to determine current user name"]; } } } #else /* Set olduid to some invalid uid that we could never start off running as. */ static int olduid = -1; #ifdef HAVE_GETEUID int uid = geteuid(); #else int uid = getuid(); #endif /* HAVE_GETEUID */ if (theUserName == nil || uid != olduid) { const char *loginName = 0; char buf[BUFSIZ*10]; #if defined(HAVE_GETPWUID_R) struct passwd pwent; struct passwd *p; if (getpwuid_r(uid, &pwent, buf, sizeof(buf), &p) == 0) { loginName = pwent.pw_name; } #else #if defined(HAVE_GETPWUID) struct passwd *pwent; [gnustep_global_lock lock]; pwent = getpwuid (uid); strncpy(buf, pwent->pw_name, sizeof(buf) - 1); buf[sizeof(buf) - 1] = '\0'; [gnustep_global_lock unlock]; loginName = buf; #endif /* HAVE_GETPWUID */ #endif /* HAVE_GETPWUID_R */ olduid = uid; if (loginName) theUserName = [[NSString alloc] initWithCString: loginName]; else [NSException raise: NSInternalInconsistencyException format: @"Unable to determine current user name"]; } #endif return theUserName; } /** * Return the caller's home directory as an NSString object. * Calls NSHomeDirectoryForUser() to do this. */ GS_DECLARE NSString * NSHomeDirectory(void) { return NSHomeDirectoryForUser(NSUserName()); } /** * Returns loginName's home directory as an NSString object.
* On most systems this returns the directory specified in the system's * password file (ar at least whatever is returned by the standard * operating system API for retrieving password file records), * but on ms-windows this is determined by examining the * HOMEPATH and HOMEDRIVE environment variables or (if those don't make * sense) the USERPROFILE environment variable. */ /* NOTE FOR DEVELOPERS. * If you change the behavior of this method you must also change * user_home.c in the makefiles package to match. */ GS_DECLARE NSString * NSHomeDirectoryForUser(NSString *loginName) { NSString *s = nil; #ifdef __ANDROID__ s = [[NSProcessInfo processInfo] androidFilesDir]; #elif !defined(_WIN32) #if defined(HAVE_GETPWNAM_R) struct passwd pw; struct passwd *p; char buf[BUFSIZ*10]; if (getpwnam_r([loginName cString], &pw, buf, sizeof(buf), &p) == 0 && p != 0 && pw.pw_dir != 0 && pw.pw_dir[0] != '\0') { s = [NSString stringWithUTF8String: pw.pw_dir]; } #else #if defined(HAVE_GETPWNAM) struct passwd *pw; [gnustep_global_lock lock]; pw = getpwnam ([loginName cString]); if (pw != 0 && pw->pw_dir != 0 && pw->pw_dir[0] != '\0') { s = [NSString stringWithUTF8String: pw->pw_dir]; } [gnustep_global_lock unlock]; #endif #endif #else if ([loginName isEqual: NSUserName()] == YES) { NSDictionary *e = [[NSProcessInfo processInfo] environment]; /* * The environment variable HOMEPATH holds the home directory * for the user on Windows NT; * For OPENSTEP compatibility (and because USERPROFILE is usually * unusable because it contains spaces), we use HOMEPATH in * preference to USERPROFILE, except when MINGW has set HOMEPATH to '\' * which isn't very useful, so we prefer USERPROFILE in that case. */ s = [e objectForKey: @"HOMEPATH"]; if ([s isEqualToString:@"\\"] && [e objectForKey: @"USERPROFILE"] != nil) { s = [e objectForKey: @"USERPROFILE"]; } else if (s != nil && ([s length] < 2 || [s characterAtIndex: 1] != ':')) { s = [[e objectForKey: @"HOMEDRIVE"] stringByAppendingString: s]; } if (s == nil) { s = [e objectForKey: @"USERPROFILE"]; } if (s == nil) { ; // FIXME: Talk to the NET API and get the profile path } } else { s = nil; fprintf(stderr, "Trying to get home for '%s' when user is '%s'\n", [loginName UTF8String], [NSUserName() UTF8String]); fprintf(stderr, "Can't determine other user home directories in Win32.\n"); } if ([s length] == 0 && [loginName length] != 1) { s = nil; fprintf(stderr, "NSHomeDirectoryForUser(%s) failed.\n", [loginName UTF8String]); } if (nil != s) { s = [s stringByStandardizingPath]; } #endif return s; } GS_DECLARE NSString * NSFullUserName(void) { if (theFullUserName == nil) { NSString *userName = NSUserName(); #if defined(_WIN32) struct _USER_INFO_2 *userInfo; if (NetUserGetInfo(NULL, (const GSNativeChar*)[userName cStringUsingEncoding: NSUnicodeStringEncoding], 2, (LPBYTE*)&userInfo) == 0) { int length = wcslen(userInfo->usri2_full_name); if (length > 0) { userName = [NSString stringWithCharacters: userInfo->usri2_full_name length: length]; } } #else #ifdef HAVE_PWD_H #if defined(HAVE_GETPWNAM_R) #if defined(HAVE_PW_GECOS_IN_PASSWD) struct passwd pw; struct passwd *p; char buf[BUFSIZ*10]; if (getpwnam_r([userName cString], &pw, buf, sizeof(buf), &p) == 0) { if (*pw.pw_gecos) { userName = [NSString stringWithUTF8String: pw.pw_gecos]; } } #endif /* HAVE_PW_GECOS_IN_PASSWD */ #else #if defined(HAVE_GETPWNAM) #if defined(HAVE_PW_GECOS_IN_PASSWD) struct passwd *pw; [gnustep_global_lock lock]; pw = getpwnam([userName cString]); if (pw->pw_gecos) { userName = [NSString stringWithUTF8String: pw->pw_gecos]; } [gnustep_global_lock lock]; #endif /* HAVE_PW_GECOS_IN_PASSWD */ #endif /* HAVE_GETPWNAM */ #endif /* HAVE_GETPWNAM_R */ #endif /* HAVE_PWD_H */ #endif /* defined(__Win32__) else */ ASSIGN(theFullUserName, userName); } return theFullUserName; } /** * Return the path of the defaults directory for userName.
* This examines the GNUSTEP_USER_CONFIG_FILE for the specified user, * with settings in it over-riding those in the main GNUstep.conf. */ GS_DECLARE NSString * GSDefaultsRootForUser(NSString *userName) { NSString *defaultsDir; InitialisePathUtilities(); if ([userName length] == 0) { userName = NSUserName(); } if ([userName isEqual: NSUserName()]) { defaultsDir = gnustepUserDefaultsDir; } else { NSMutableDictionary *config; config = GNUstepConfig(nil); GNUstepUserConfig(config, userName); defaultsDir = [config objectForKey: @"GNUSTEP_USER_DEFAULTS_DIR"]; if (defaultsDir == nil) { defaultsDir = @GNUSTEP_TARGET_USER_DEFAULTS_DIR; } } #if defined(_WIN32) if ([defaultsDir rangeOfString: @":REGISTRY:"].length > 0) { return defaultsDir; // Just use windows registry. } #endif if (NO == [defaultsDir isAbsolutePath]) { NSString *home = NSHomeDirectoryForUser(userName); defaultsDir = [home stringByAppendingPathComponent: defaultsDir]; } return defaultsDir; } GS_DECLARE NSArray * NSStandardApplicationPaths(void) { return NSSearchPathForDirectoriesInDomains(NSAllApplicationsDirectory, NSAllDomainsMask, YES); } GS_DECLARE NSArray * NSStandardLibraryPaths(void) { return NSSearchPathForDirectoriesInDomains(NSAllLibrariesDirectory, NSAllDomainsMask, YES); } GS_DECLARE NSString * NSTemporaryDirectory(void) { NSFileManager *manager; NSString *tempDirName; NSString *baseTempDirName = nil; BOOL flag; #if !defined(_WIN32) NSDictionary *attr; int perm; int owner; #if !defined(__ANDROID__) int uid; #endif #endif #if defined(_WIN32) GSNativeChar buffer[1024]; if (GetTempPathW(1024, buffer)) { baseTempDirName = [NSString stringWithCharacters: buffer length: wcslen(buffer)]; // convert path to use forward slashes, which we use internally baseTempDirName = [baseTempDirName stringByReplacingString: @"\\" withString: @"/"]; } #elif defined(__ANDROID__) /* * Use subfolder of cache directory as temp dir on Android, as there * is no official temp dir prior to API level 26, and the cache dir * is at least auto-purged by the system if disk space is needed. * We also clean it up on launch in GSInitializeProcessAndroid(). */ NSString *cacheDir = [[NSProcessInfo processInfo] androidCacheDir]; if (cacheDir) { baseTempDirName = [cacheDir stringByAppendingPathComponent: @"tmp"]; } #endif /* * If the user has supplied a directory name in the TEMP or TMP * environment variable, attempt to use that unless we already * have a temporary directory specified. */ if (baseTempDirName == nil) { NSDictionary *env = [[NSProcessInfo processInfo] environment]; baseTempDirName = [env objectForKey: @"TEMP"]; if (baseTempDirName == nil) { baseTempDirName = [env objectForKey: @"TMP"]; if (baseTempDirName == nil) { #if defined(__CYGWIN__) #warning Basing temporary directory in /cygdrive/c; any reason? baseTempDirName = @"/cygdrive/c/"; #elif defined(_WIN32) baseTempDirName = @"C:\\"; #elif defined(__APPLE__) /* * Create temporary directory on /var/tmp since /tmp is * cleaned regularly on Darwin by default */ baseTempDirName = @"/var/tmp"; #else baseTempDirName = @"/tmp"; #endif } } } /* * Check that the base directory exists ... if it doesn't we can't * go any further. */ tempDirName = baseTempDirName; manager = [NSFileManager defaultManager]; if ([manager fileExistsAtPath: tempDirName isDirectory: &flag] == NO || flag == NO) { #ifdef __ANDROID__ /* * Create our own temp dir on Android. We can disregard attributes * since they are not supported. */ if ([manager createDirectoryAtPath: tempDirName withIntermediateDirectories: YES attributes: nil error: NULL] == NO) { NSWarnFLog(@"Attempt to create temporary directory (%@)" @" failed.", tempDirName); return nil; } #else NSWarnFLog(@"Temporary directory (%@) does not exist", tempDirName); return nil; #endif } // Mateu Batle: secure temporary directories don't work in MinGW // Ivan Vucica: there are also problems with Cygwin // probable cause: http://stackoverflow.com/q/9561759/39974 #if !defined(_WIN32) && !defined(__CYGWIN__) && !defined(__ANDROID__) /* * Check that we are the directory owner, and that we, and nobody else, * have access to it. If other people have access, try to create a secure * subdirectory. */ attr = [manager fileAttributesAtPath: tempDirName traverseLink: YES]; owner = [[attr objectForKey: NSFileOwnerAccountID] intValue]; perm = [[attr objectForKey: NSFilePosixPermissions] intValue]; perm = perm & 0777; #ifdef HAVE_GETEUID uid = geteuid(); #else uid = getuid(); #endif /* HAVE_GETEUID */ if ((perm != 0700 && perm != 0600) || owner != uid) { NSString *secure; NSNumber *p = [NSNumber numberWithInt: 0700]; attr = [NSDictionary dictionaryWithObject: p forKey: NSFilePosixPermissions]; /* * The name of the secure subdirectory reflects the user ID rather * than the user name, since it is possible to have an account with * lots of names on a unix system (ie multiple entries in the password * file but a single userid). The private directory is secure within * the account, not to a particular user name. */ secure = [NSString stringWithFormat: @"GNUstepSecure%d", uid]; tempDirName = [baseTempDirName stringByAppendingPathComponent: secure]; if ([manager fileExistsAtPath: tempDirName] == NO) { if ([manager createDirectoryAtPath: tempDirName withIntermediateDirectories: YES attributes: attr error: NULL] == NO) { NSWarnFLog(@"Attempt to create a secure temporary" @" directory (%@) failed.", tempDirName); return nil; } } else { [manager changeFileAttributes: attr atPath: tempDirName]; } /* * Check that the new directory is really secure. */ attr = [manager fileAttributesAtPath: tempDirName traverseLink: YES]; owner = [[attr objectForKey: NSFileOwnerAccountID] intValue]; perm = [[attr objectForKey: NSFilePosixPermissions] intValue]; perm = perm & 0777; if ((perm != 0700 && perm != 0600) || owner != uid) { NSWarnFLog(@"Attempt to create a secure temporary" @" directory (%@) failed.", tempDirName); return nil; } } #endif if ([manager isWritableFileAtPath: tempDirName] == NO) { NSWarnFLog(@"Temporary directory (%@) is not writable", tempDirName); return nil; } return tempDirName; } GS_DECLARE NSString * NSOpenStepRootDirectory(void) { NSString *root; #if defined(__CYGWIN__) root = @"/cygdrive/c/"; #elif defined(_WIN32) root = @"C:/"; #else root = @"/"; #endif return root; } #if defined(__MINGW__) /* The developer root under MinGW (where we have an MSYS environment set up) * is the point in the filesystem where we can reference make.exe via * msys/.../bin/. That is, it's the windows path at which msys is installed. */ static NSString* devroot(NSFileManager *manager, NSString *path) { NSString *tmp = @""; while (path && NO == [tmp isEqual: path]) { NSString *pb; NSString *msys; BOOL isDir; msys = [path stringByAppendingPathComponent: @"msys"]; if (YES == [manager fileExistsAtPath: msys isDirectory: &isDir] && YES == isDir) { NSEnumerator *e; NSString *file; e = [[manager directoryContentsAtPath: msys] objectEnumerator]; while (nil != (file = [e nextObject])) { if (isdigit([file characterAtIndex: 0])) { float v = atof([file UTF8String]); if (v <= 0) { continue; } file = [msys stringByAppendingPathComponent: file]; pb = [file stringByAppendingPathComponent: @"bin/make.exe"]; if ([manager isExecutableFileAtPath: pb]) { return path; } } } } tmp = path; path = [tmp stringByDeletingLastPathComponent]; } return nil; } #endif GS_DECLARE NSArray * NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory directoryKey, NSSearchPathDomainMask domainMask, BOOL expandTilde) { NSMutableArray *paths; NSString *path; unsigned i; unsigned count; InitialisePathUtilities(); NSCAssert(gnustepMakefiles!=nil,@"Path utilities without initialisation!"); paths = [NSMutableArray array]; /* * The order in which we return paths is important - user must come * first, followed by local, followed by network, followed by system. * The calling code can then loop on the returned paths, and stop as * soon as it finds something. So things in user automatically * override things in system etc. */ #define ADD_PATH(mask, base_dir, add_dir) \ if (domainMask & mask) \ { \ path = [base_dir stringByAppendingPathComponent: add_dir]; \ if ([path length] > 0 && [paths containsObject: path] == NO) \ [paths addObject: path]; \ } #define ADD_PLATFORM_PATH(mask, add_dir) \ if (domainMask & mask) \ { \ if ([add_dir length] > 0 && [paths containsObject: add_dir] == NO) \ [paths addObject: add_dir]; \ } switch (directoryKey) { case NSAllApplicationsDirectory: { ADD_PLATFORM_PATH(NSUserDomainMask, gnustepUserApps); ADD_PLATFORM_PATH(NSLocalDomainMask, gnustepLocalApps); ADD_PLATFORM_PATH(NSNetworkDomainMask, gnustepNetworkApps); ADD_PLATFORM_PATH(NSSystemDomainMask, gnustepSystemApps); ADD_PLATFORM_PATH(NSUserDomainMask, gnustepUserAdminApps); ADD_PLATFORM_PATH(NSLocalDomainMask, gnustepLocalAdminApps); ADD_PLATFORM_PATH(NSNetworkDomainMask, gnustepNetworkAdminApps); ADD_PLATFORM_PATH(NSSystemDomainMask, gnustepSystemAdminApps); } break; case NSApplicationDirectory: { ADD_PLATFORM_PATH(NSUserDomainMask, gnustepUserApps); ADD_PLATFORM_PATH(NSLocalDomainMask, gnustepLocalApps); ADD_PLATFORM_PATH(NSNetworkDomainMask, gnustepNetworkApps); ADD_PLATFORM_PATH(NSSystemDomainMask, gnustepSystemApps); } break; case NSDemoApplicationDirectory: { ADD_PLATFORM_PATH(NSUserDomainMask, gnustepUserApps); ADD_PLATFORM_PATH(NSLocalDomainMask, gnustepLocalApps); ADD_PLATFORM_PATH(NSNetworkDomainMask, gnustepNetworkApps); ADD_PLATFORM_PATH(NSSystemDomainMask, gnustepSystemApps); /* I imagine if ever wanted a separate Demo directory, the * only way for this to have some meaning across filesystems * would be as a subdirectory of Applications, as follows. */ /* ADD_PATH(NSUserDomainMask, gnustepUserApps, @"Demos"); ADD_PATH(NSLocalDomainMask, gnustepLocalApps, @"Demos"); ADD_PATH(NSNetworkDomainMask, gnustepNetworkApps, @"Demos"); ADD_PATH(NSSystemDomainMask, gnustepSystemApps, @"Demos"); */ } break; case NSCoreServicesDirectory: { ADD_PATH(NSSystemDomainMask, gnustepSystemLibrary, @"CoreServices"); } break; case NSDesktopDirectory: { ADD_PATH(NSUserDomainMask, gnustepUserHome, @"Desktop"); } break; case NSDeveloperApplicationDirectory: { /* Deprecated key ... for now just point to normal apps. */ ADD_PLATFORM_PATH(NSUserDomainMask, gnustepUserApps); ADD_PLATFORM_PATH(NSLocalDomainMask, gnustepLocalApps); ADD_PLATFORM_PATH(NSNetworkDomainMask, gnustepNetworkApps); ADD_PLATFORM_PATH(NSSystemDomainMask, gnustepSystemApps); } break; case NSAdminApplicationDirectory: { ADD_PLATFORM_PATH(NSUserDomainMask, gnustepUserAdminApps); ADD_PLATFORM_PATH(NSLocalDomainMask, gnustepLocalAdminApps); ADD_PLATFORM_PATH(NSNetworkDomainMask, gnustepNetworkAdminApps); ADD_PLATFORM_PATH(NSSystemDomainMask, gnustepSystemAdminApps); } break; case NSAllLibrariesDirectory: { ADD_PLATFORM_PATH(NSUserDomainMask, gnustepUserLibrary); ADD_PLATFORM_PATH(NSLocalDomainMask, gnustepLocalLibrary); ADD_PLATFORM_PATH(NSNetworkDomainMask, gnustepNetworkLibrary); ADD_PLATFORM_PATH(NSSystemDomainMask, gnustepSystemLibrary); } break; case NSLibraryDirectory: { /* We allow the environment to be used to specify the location of * the resources of uninstalled libraries so that we can run tests * on software prior to installation. */ ADD_PLATFORM_PATH(NSAllDomainsMask, uninstalled); ADD_PLATFORM_PATH(NSUserDomainMask, gnustepUserLibrary); ADD_PLATFORM_PATH(NSLocalDomainMask, gnustepLocalLibrary); ADD_PLATFORM_PATH(NSNetworkDomainMask, gnustepNetworkLibrary); ADD_PLATFORM_PATH(NSSystemDomainMask, gnustepSystemLibrary); } break; case NSDeveloperDirectory: { #if defined(__MINGW__) if (nil == gnustepDeveloperDir) { NSString *path = nil; NSString *bpath = nil; NSString *ipath = nil; NSString *mpath = nil; NSFileManager *mgr; mgr = [NSFileManager defaultManager]; /* See if we can find the developer root above the * system tools directory of the current running process. */ path = devroot(mgr, gnustepSystemTools); /* Failing that, try looking above the base library. */ if (nil == path) { NSBundle *baseBundle; baseBundle = [NSBundle bundleForLibrary: @"gnustep-base"]; bpath = [baseBundle bundlePath]; path = devroot(mgr, bpath); } /* If we havent found the developer area relative to the * hierarchy used by the current process, look for the * GNUstep package installation root in case we have the * developer environment installed from a package. */ if (nil == path) { HKEY regKey; BOOL found = NO; /* Open the key for the current user or local machine where * the installation path for the GNUstep package is stored. */ if (ERROR_SUCCESS == RegOpenKeyExW(HKEY_CURRENT_USER, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\GNUstep", 0, KEY_READ, ®Key)) { found = YES; } else { if (ERROR_SUCCESS == RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\GNUstep", 0, KEY_READ, ®Key)) { found = YES; } } if (found) { wchar_t buf[1024]; DWORD bufsize; DWORD type; bufsize = sizeof(buf); if (ERROR_SUCCESS == RegQueryValueExW(regKey, 0, 0, &type, (BYTE *)buf, &bufsize)) { ipath = [NSString stringWithCharacters: buf length: wcslen(buf)]; path = devroot(mgr, ipath); } RegCloseKey(regKey); } } if (nil == path) { mpath = [NSBundle _absolutePathOfExecutable: @"make.exe"]; if (nil != mpath) { path = devroot(mgr, mpath); } } ASSIGNCOPY(gnustepDeveloperDir, path); if (nil == gnustepDeveloperDir) { fprintf(stderr, "Failed to locate NSDeveloperDirectory" " by GNUstep configuration, installed GNUstep package," " or process PATH.\n"); } } #endif if (nil == gnustepDeveloperDir) { gnustepDeveloperDir = RETAIN(NSOpenStepRootDirectory()); } /* The Developer directory is deprecated on OSX, but for GNUstep * specific apps we return the root of the system containing the * development environment. On most systems, that's the root * directory, but on windows it can be anywhere the user has put it. * If not explicitly defined, or found relative to the hierarchy * of the running process, *with the GNUstep package installed it's * the location of the msys filesystem within the GNUstep package * installation. */ ADD_PLATFORM_PATH(NSUserDomainMask, gnustepDeveloperDir); ADD_PLATFORM_PATH(NSLocalDomainMask, gnustepDeveloperDir); ADD_PLATFORM_PATH(NSNetworkDomainMask, gnustepDeveloperDir); ADD_PLATFORM_PATH(NSSystemDomainMask, gnustepDeveloperDir); } break; case NSUserDirectory: { /* This is the directory in which user directories are located. * You can not have user directories in your own user directory, * so NSUserDomainMask will always return ''. */ ADD_PLATFORM_PATH(NSLocalDomainMask, gnustepLocalUsersDir); ADD_PLATFORM_PATH(NSNetworkDomainMask, gnustepNetworkUsersDir); ADD_PLATFORM_PATH(NSSystemDomainMask, gnustepSystemUsersDir); } break; case NSDocumentationDirectory: { ADD_PLATFORM_PATH(NSUserDomainMask, gnustepUserDocumentation); ADD_PLATFORM_PATH(NSLocalDomainMask, gnustepLocalDocumentation); ADD_PLATFORM_PATH(NSNetworkDomainMask, gnustepNetworkDocumentation); ADD_PLATFORM_PATH(NSSystemDomainMask, gnustepSystemDocumentation); } break; case NSDocumentDirectory: { /* this is relative to the user home and for the user domain only * verified on Macintosh * despite the name it is Documents and not Document.... */ ADD_PATH(NSUserDomainMask, gnustepUserHome, @"Documents"); } break; case NSDownloadsDirectory: { /* Be consistent with NSDocumentDirectory */ ADD_PATH(NSUserDomainMask, gnustepUserHome, @"Downloads"); } break; case NSMoviesDirectory: { /* Be consistent with NSDocumentDirectory */ ADD_PATH(NSUserDomainMask, gnustepUserHome, @"Videos"); } break; case NSMusicDirectory: { /* Be consistent with NSDocumentDirectory */ ADD_PATH(NSUserDomainMask, gnustepUserHome, @"Music"); } break; case NSPicturesDirectory: { /* Be consistent with NSDocumentDirectory */ ADD_PATH(NSUserDomainMask, gnustepUserHome, @"Images"); } break; case NSCachesDirectory: { #ifdef __ANDROID__ /* Use system-provided cache directory on Android */ ADD_PATH(NSUserDomainMask, [[NSProcessInfo processInfo] androidCacheDir], @""); #else /* Uff - at the moment the only place to put Caches seems to * be Library. Unfortunately under GNU/Linux Library will * end up in /usr/lib/GNUstep which could be mounted * read-only! */ ADD_PATH(NSUserDomainMask, gnustepUserLibrary, @"Caches"); #endif ADD_PATH(NSLocalDomainMask, gnustepLocalLibrary, @"Caches"); ADD_PATH(NSNetworkDomainMask, gnustepNetworkLibrary, @"Caches"); ADD_PATH(NSSystemDomainMask, gnustepSystemLibrary, @"Caches"); } break; case NSApplicationSupportDirectory: { ADD_PATH(NSUserDomainMask, gnustepUserLibrary, @"ApplicationSupport"); ADD_PATH(NSLocalDomainMask, gnustepLocalLibrary, @"ApplicationSupport"); ADD_PATH(NSNetworkDomainMask, gnustepNetworkLibrary, @"ApplicationSupport"); ADD_PATH(NSSystemDomainMask, gnustepSystemLibrary, @"ApplicationSupport"); } break; /* Now the GNUstep additions */ case GSFrameworksDirectory: { ADD_PATH(NSUserDomainMask, gnustepUserLibrary, @"Frameworks"); ADD_PATH(NSLocalDomainMask, gnustepLocalLibrary, @"Frameworks"); ADD_PATH(NSNetworkDomainMask, gnustepNetworkLibrary, @"Frameworks"); ADD_PATH(NSSystemDomainMask, gnustepSystemLibrary, @"Frameworks"); } break; case GSFontsDirectory: { ADD_PATH(NSUserDomainMask, gnustepUserLibrary, @"Fonts"); ADD_PATH(NSLocalDomainMask, gnustepLocalLibrary, @"Fonts"); ADD_PATH(NSNetworkDomainMask, gnustepNetworkLibrary, @"Fonts"); ADD_PATH(NSSystemDomainMask, gnustepSystemLibrary, @"Fonts"); } break; case GSLibrariesDirectory: { NSString *full = nil; NSString *part = nil; if ([gnustep_is_flattened boolValue] == NO && gnustep_target_cpu != nil && gnustep_target_os != nil) { part = [NSString stringWithFormat: @"%@-%@", gnustep_target_cpu, gnustep_target_os]; if (library_combo != nil) { full = [part stringByAppendingPathComponent: library_combo]; } } ADD_PLATFORM_PATH(NSUserDomainMask, gnustepUserLibraries); if (full) ADD_PATH(NSUserDomainMask, gnustepUserLibraries, full); if (part) ADD_PATH(NSUserDomainMask, gnustepUserLibraries, part); ADD_PLATFORM_PATH(NSLocalDomainMask, gnustepLocalLibraries); if (full) ADD_PATH(NSLocalDomainMask, gnustepLocalLibraries, full); if (part) ADD_PATH(NSLocalDomainMask, gnustepLocalLibraries, part); ADD_PLATFORM_PATH(NSNetworkDomainMask, gnustepNetworkLibraries); if (full) ADD_PATH(NSNetworkDomainMask, gnustepNetworkLibraries, full); if (part) ADD_PATH(NSNetworkDomainMask, gnustepNetworkLibraries, part); ADD_PLATFORM_PATH(NSSystemDomainMask, gnustepSystemLibraries); if (full) ADD_PATH(NSSystemDomainMask, gnustepSystemLibraries, full); if (part) ADD_PATH(NSSystemDomainMask, gnustepSystemLibraries, part); } break; case GSToolsDirectory: { NSString *full = nil; NSString *part = nil; if ([gnustep_is_flattened boolValue] == NO && gnustep_target_cpu != nil && gnustep_target_os != nil) { part = [NSString stringWithFormat: @"%@-%@", gnustep_target_cpu, gnustep_target_os]; if (library_combo != nil) { full = [part stringByAppendingPathComponent: library_combo]; } } ADD_PLATFORM_PATH(NSUserDomainMask, gnustepUserTools); if (full) ADD_PATH(NSUserDomainMask, gnustepUserTools, full); if (part) ADD_PATH(NSUserDomainMask, gnustepUserTools, part); ADD_PLATFORM_PATH(NSLocalDomainMask, gnustepLocalTools); if (full) ADD_PATH(NSLocalDomainMask, gnustepLocalTools, full); if (part) ADD_PATH(NSLocalDomainMask, gnustepLocalTools, part); ADD_PLATFORM_PATH(NSNetworkDomainMask, gnustepNetworkTools); if (full) ADD_PATH(NSNetworkDomainMask, gnustepNetworkTools, full); if (part) ADD_PATH(NSNetworkDomainMask, gnustepNetworkTools, part); ADD_PLATFORM_PATH(NSSystemDomainMask, gnustepSystemTools); if (full) ADD_PATH(NSSystemDomainMask, gnustepSystemTools, full); if (part) ADD_PATH(NSSystemDomainMask, gnustepSystemTools, part); } break; case GSAdminToolsDirectory: { NSString *full = nil; NSString *part = nil; if ([gnustep_is_flattened boolValue] == NO && gnustep_target_cpu != nil && gnustep_target_os != nil) { part = [NSString stringWithFormat: @"%@-%@", gnustep_target_cpu, gnustep_target_os]; if (library_combo != nil) { full = [part stringByAppendingPathComponent: library_combo]; } } ADD_PLATFORM_PATH(NSUserDomainMask, gnustepUserAdminTools); if (full) ADD_PATH(NSUserDomainMask, gnustepUserAdminTools, full); if (part) ADD_PATH(NSUserDomainMask, gnustepUserAdminTools, part); ADD_PLATFORM_PATH(NSLocalDomainMask, gnustepLocalAdminTools); if (full) ADD_PATH(NSLocalDomainMask, gnustepLocalAdminTools, full); if (part) ADD_PATH(NSLocalDomainMask, gnustepLocalAdminTools, part); ADD_PLATFORM_PATH(NSNetworkDomainMask, gnustepNetworkAdminTools); if (full) ADD_PATH(NSNetworkDomainMask, gnustepNetworkAdminTools, full); if (part) ADD_PATH(NSNetworkDomainMask, gnustepNetworkAdminTools, part); ADD_PLATFORM_PATH(NSSystemDomainMask, gnustepSystemAdminTools); if (full) ADD_PATH(NSSystemDomainMask, gnustepSystemAdminTools, full); if (part) ADD_PATH(NSSystemDomainMask, gnustepSystemAdminTools, part); } break; case GSWebApplicationsDirectory: { ADD_PLATFORM_PATH(NSUserDomainMask, gnustepUserWebApps); ADD_PLATFORM_PATH(NSLocalDomainMask, gnustepLocalWebApps); ADD_PLATFORM_PATH(NSNetworkDomainMask, gnustepNetworkWebApps); ADD_PLATFORM_PATH(NSSystemDomainMask, gnustepSystemWebApps); } break; } #undef ADD_PATH #undef ADD_PLATFORM_PATH count = [paths count]; for (i = 0; i < count; i++) { path = [paths objectAtIndex: i]; if (expandTilde == YES) { [paths replaceObjectAtIndex: i withObject: [path stringByExpandingTildeInPath]]; } else { [paths replaceObjectAtIndex: i withObject: [path stringByAbbreviatingWithTildeInPath]]; } } return paths; } @implementation GSPathUtilities + (void) atExit { ShutdownPathUtilities(); } + (void) initialize { [self registerAtExit]; } @end gnustep-base-1.29.0/Source/NSPersonNameComponents.m000066400000000000000000000122021435650067400222030ustar00rootroot00000000000000/* Definition of class NSPersonNameComponents Copyright (C) 2019 Free Software Foundation, Inc. Implemented by: Gregory Casamento Date: Sep 2019 This file is part of the GNUstep Library. 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 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 USA. */ #import "common.h" #import "Foundation/NSCoder.h" #import "Foundation/NSString.h" #import "Foundation/NSPersonNameComponents.h" @implementation NSPersonNameComponents - (instancetype) init { if((self = [super init]) != nil) { _namePrefix = nil; _givenName = nil; _middleName = nil; _familyName = nil; _nameSuffix = nil; _nickname = nil; _phoneticRepresentation = nil; } return self; } - (instancetype) initWithCoder: (NSCoder *)aCoder { if((self = [self init]) != nil) { if([aCoder allowsKeyedCoding]) { _namePrefix = [aCoder decodeObjectForKey: @"namePrefix"]; _givenName = [aCoder decodeObjectForKey: @"givenName"]; _middleName = [aCoder decodeObjectForKey: @"middleName"]; _familyName = [aCoder decodeObjectForKey: @"familyName"]; _nameSuffix = [aCoder decodeObjectForKey: @"nameSuffix"]; _nickname = [aCoder decodeObjectForKey: @"nickname"]; _phoneticRepresentation = [aCoder decodeObjectForKey: @"phoneticRepresentation"]; } else { _namePrefix = [aCoder decodeObject]; _givenName = [aCoder decodeObject]; _middleName = [aCoder decodeObject]; _familyName = [aCoder decodeObject]; _nameSuffix = [aCoder decodeObject]; _nickname = [aCoder decodeObject]; _phoneticRepresentation = [aCoder decodeObject]; } } return self; } - (void) encodeWithCoder: (NSCoder *)aCoder { if([aCoder allowsKeyedCoding]) { [aCoder encodeObject: _namePrefix forKey: @"namePrefix"]; [aCoder encodeObject: _givenName forKey: @"givenName"]; [aCoder encodeObject: _middleName forKey: @"middleName"]; [aCoder encodeObject: _familyName forKey: @"familyName"]; [aCoder encodeObject: _nameSuffix forKey: @"nameSuffix"]; [aCoder encodeObject: _nameSuffix forKey: @"nameSuffix"]; [aCoder encodeObject: _phoneticRepresentation forKey: @"phoneticRepresentation"]; } else { [aCoder encodeObject: _namePrefix]; [aCoder encodeObject: _givenName]; [aCoder encodeObject: _middleName]; [aCoder encodeObject: _familyName]; [aCoder encodeObject: _nameSuffix]; [aCoder encodeObject: _nameSuffix]; [aCoder encodeObject: _phoneticRepresentation]; } } - (instancetype) copyWithZone: (NSZone *)zone { NSPersonNameComponents *copy = [[NSPersonNameComponents allocWithZone: zone] init]; [copy setNamePrefix: [self namePrefix]]; [copy setGivenName: [self givenName]]; [copy setMiddleName: [self middleName]]; [copy setFamilyName: [self familyName]]; [copy setNameSuffix: [self nameSuffix]]; [copy setNickname: [self nickname]]; [copy setPhoneticRepresentation: [self phoneticRepresentation]]; return copy; } - (void) dealloc { RELEASE(_namePrefix); RELEASE(_givenName); RELEASE(_middleName); RELEASE(_familyName); RELEASE(_nameSuffix); RELEASE(_nickname); RELEASE(_phoneticRepresentation); [super dealloc]; } - (NSString *) namePrefix { return _namePrefix; } - (void) setNamePrefix: (NSString *)namePrefix { ASSIGNCOPY(_namePrefix, namePrefix); } - (NSString *) givenName { return _givenName; } - (void) setGivenName: (NSString *)givenName { ASSIGNCOPY(_givenName, givenName); } - (NSString *) middleName { return _middleName; } - (void) setMiddleName: (NSString *)middleName { ASSIGNCOPY(_middleName, middleName); } - (NSString *) familyName { return _familyName; } - (void) setFamilyName: (NSString *)familyName { ASSIGNCOPY(_familyName, familyName); } - (NSString *) nameSuffix { return _nameSuffix; } - (void) setNameSuffix: (NSString *)nameSuffix { ASSIGNCOPY(_nameSuffix, nameSuffix); } - (NSString *) nickname { return _nickname; } - (void) setNickname: (NSString *)nickname { ASSIGNCOPY(_nickname, nickname); } - (NSPersonNameComponents *) phoneticRepresentation { return _phoneticRepresentation; } - (void) setPhoneticRepresentation: (NSPersonNameComponents *)pr { ASSIGNCOPY(_phoneticRepresentation, pr); } @end gnustep-base-1.29.0/Source/NSPersonNameComponentsFormatter.m000066400000000000000000000165471435650067400241070ustar00rootroot00000000000000/* Definition of class NSPersonNameComponentsFormatter Copyright (C) 2019 Free Software Foundation, Inc. Implemented by: Gregory Casamento Date: Sep 2019 This file is part of the GNUstep Library. 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 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 USA. */ #import "Foundation/NSString.h" #import "Foundation/NSAttributedString.h" #import "Foundation/NSPersonNameComponents.h" #import "Foundation/NSPersonNameComponentsFormatter.h" @implementation NSPersonNameComponentsFormatter - (instancetype) init { self = [super init]; if(self != nil) { _phonetic = NO; _style = NSPersonNameComponentsFormatterStyleDefault; _nameOptions = 0L; } return self; } - (void) _setNameOptions: (NSPersonNameComponentsFormatterOptions)opts { _nameOptions = opts; } // Designated init... + (NSString *) localizedStringFromPersonNameComponents: (NSPersonNameComponents *)components style: (NSPersonNameComponentsFormatterStyle)nameFormatStyle options: (NSPersonNameComponentsFormatterOptions)nameOptions { NSPersonNameComponentsFormatter *fmt = [[NSPersonNameComponentsFormatter alloc] init]; [fmt setStyle: nameFormatStyle]; [fmt _setNameOptions: nameOptions]; return [fmt stringForObjectValue: components] ; } // Setters - (NSPersonNameComponentsFormatterStyle) style { return _style; } - (void) setStyle: (NSPersonNameComponentsFormatterStyle)style { _style = style; } - (BOOL) isPhonetic { return _phonetic; } - (void) setPhonetic: (BOOL)flag { _phonetic = flag; } // Convenience methods... - (NSString *) stringFromPersonNameComponents: (NSPersonNameComponents *)components { NSString *result = @""; switch (_style) { case NSPersonNameComponentsFormatterStyleDefault: case NSPersonNameComponentsFormatterStyleMedium: result = [result stringByAppendingString: [components givenName]]; result = [result stringByAppendingString: @" "]; result = [result stringByAppendingString: [components familyName]]; break; case NSPersonNameComponentsFormatterStyleShort: result = [result stringByAppendingString: [components givenName]]; break; case NSPersonNameComponentsFormatterStyleLong: result = [result stringByAppendingString: [components namePrefix]]; result = [result stringByAppendingString: @" "]; result = [result stringByAppendingString: [components givenName]]; result = [result stringByAppendingString: @" "]; result = [result stringByAppendingString: [components familyName]]; result = [result stringByAppendingString: @" "]; result = [result stringByAppendingString: [components nameSuffix]]; break; case NSPersonNameComponentsFormatterStyleAbbreviated: result = [result stringByAppendingString: [[components givenName] substringToIndex: 1]]; result = [result stringByAppendingString: [[components familyName] substringToIndex: 1]]; break; } return result; } - (NSAttributedString *) annotatedStringFromPersonNameComponents: (NSPersonNameComponents *)components { NSAttributedString *result = AUTORELEASE([[NSAttributedString alloc] initWithString: [self stringFromPersonNameComponents: components]]); return result; } - (NSPersonNameComponents *) personNameComponentsFromString: (NSString *)string { NSPersonNameComponents *pnc = AUTORELEASE([[NSPersonNameComponents alloc] init]); NSArray *nameArray = [string componentsSeparatedByString: @" "]; NSUInteger count = [nameArray count]; switch(count) { case 1: [pnc setNickname: [nameArray objectAtIndex: 0]]; break; case 2: [pnc setGivenName: [nameArray objectAtIndex: 0]]; [pnc setFamilyName: [nameArray objectAtIndex: 1]]; break; case 3: { NSString *first = [[nameArray objectAtIndex: 0] lowercaseString]; if([first isEqualToString: @"mr"] || [first isEqualToString: @"ms"] || [first isEqualToString: @"mrs"] || [first isEqualToString: @"dr"]) { [pnc setNamePrefix: [nameArray objectAtIndex: 0]]; [pnc setGivenName: [nameArray objectAtIndex: 1]]; [pnc setFamilyName: [nameArray objectAtIndex: 2]]; } else { [pnc setGivenName: [nameArray objectAtIndex: 0]]; [pnc setMiddleName: [nameArray objectAtIndex: 1]]; [pnc setFamilyName: [nameArray objectAtIndex: 2]]; } } break; case 4: { NSString *first = [[nameArray objectAtIndex: 0] lowercaseString]; if([first isEqualToString: @"mr."] || [first isEqualToString: @"ms."] || [first isEqualToString: @"mrs."] || [first isEqualToString: @"dr."]) { [pnc setNamePrefix: [nameArray objectAtIndex: 0]]; [pnc setGivenName: [nameArray objectAtIndex: 1]]; [pnc setMiddleName: [nameArray objectAtIndex: 2]]; [pnc setFamilyName: [nameArray objectAtIndex: 3]]; } else { [pnc setGivenName: [nameArray objectAtIndex: 0]]; [pnc setMiddleName: [nameArray objectAtIndex: 1]]; [pnc setFamilyName: [nameArray objectAtIndex: 2]]; [pnc setNameSuffix: [nameArray objectAtIndex: 3]]; } } break; case 5: { NSString *first = [[nameArray objectAtIndex: 0] lowercaseString]; if([first isEqualToString: @"mr."] || [first isEqualToString: @"ms."] || [first isEqualToString: @"mrs."] || [first isEqualToString: @"dr."]) { [pnc setNamePrefix: [nameArray objectAtIndex: 0]]; [pnc setGivenName: [nameArray objectAtIndex: 1]]; [pnc setMiddleName: [nameArray objectAtIndex: 2]]; [pnc setFamilyName: [nameArray objectAtIndex: 3]]; [pnc setNameSuffix: [nameArray objectAtIndex: 4]]; } } break; default: NSLog(@"Not sure how to parse %@", string); pnc = nil; break; } return pnc; } - (BOOL) getObjectValue: (id *)obj forString: (NSString *)string errorDescription: (NSString **)error { NSPersonNameComponents *pnc = [self personNameComponentsFromString: string]; if(pnc != nil) { *obj = pnc; *error = nil; } else { *obj = nil; *error = @"Could not parse string into NSPersonNameComponents object"; } return NO; } - (NSString *)stringForObjectValue: (id)obj { NSPersonNameComponents *pnc = (NSPersonNameComponents *)obj; return [self stringFromPersonNameComponents: pnc]; } @end gnustep-base-1.29.0/Source/NSPipe.m000066400000000000000000000060331435650067400167700ustar00rootroot00000000000000/** Implementation for NSPipe for GNUStep Copyright (C) 1997 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 1997 This file is part of the GNUstep Base Library. 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 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 USA. $Date$ $Revision$ */ #import "common.h" #define EXPOSE_NSPipe_IVARS 1 #import "Foundation/NSFileHandle.h" #import "GSPrivate.h" /** *

The NSPipe provides an encapsulation of the UNIX concept of pipe.
* With NSPipe, it is possible to redirect the standard input or * standard output. *

*

The file handles created by NSPipe are automatically closed when they * are no longer in use (ie when the NSPipe instance is deallocated), so you * don't need to close them explicitly. *

*/ @implementation NSPipe /** * Returns a newly allocated and initialized NSPipe object that has been * sent an autorelease message. */ + (id) pipe { return AUTORELEASE([[self alloc] init]); } - (void) dealloc { RELEASE(_readHandle); RELEASE(_writeHandle); [super dealloc]; } - (id) init { self = [super init]; if (self != nil) { #ifndef _WIN32 int p[2]; if (pipe(p) == 0) { _readHandle = [[NSFileHandle alloc] initWithFileDescriptor: p[0] closeOnDealloc: YES]; _writeHandle = [[NSFileHandle alloc] initWithFileDescriptor: p[1] closeOnDealloc: YES]; } else { NSLog(@"Failed to create pipe ... %@", [NSError _last]); DESTROY(self); } #else SECURITY_ATTRIBUTES saAttr; HANDLE readh, writeh; saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); saAttr.bInheritHandle = FALSE; saAttr.lpSecurityDescriptor = NULL; if (CreatePipe(&readh, &writeh, &saAttr, 0) != 0) { _readHandle = [[NSFileHandle alloc] initWithNativeHandle: readh closeOnDealloc: YES]; _writeHandle = [[NSFileHandle alloc] initWithNativeHandle: writeh closeOnDealloc: YES]; } else { NSLog(@"Failed to create pipe ... %@", [NSError _last]); DESTROY(self); } #endif } return self; } /** * Returns the file handle for reading from the pipe. */ - (NSFileHandle*) fileHandleForReading { return _readHandle; } /** * Returns the file handle for writing to the pipe. */ - (NSFileHandle*) fileHandleForWriting { return _writeHandle; } @end gnustep-base-1.29.0/Source/NSPointerArray.m000066400000000000000000000311371435650067400205150ustar00rootroot00000000000000/**Implementation for NSPointerArray for GNUStep Copyright (C) 2009 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 2009 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #import "Foundation/NSPointerArray.h" #import "GNUstepBase/GSObjCRuntime.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSException.h" #import "Foundation/NSValue.h" #import "Foundation/NSKeyedArchiver.h" #import "GSPrivate.h" #import "NSConcretePointerFunctions.h" static Class abstractClass = Nil; static Class concreteClass = Nil; @interface NSConcretePointerArray : NSPointerArray { PFInfo _pf; NSUInteger _count; void **_contents; unsigned _capacity; unsigned _grow_factor; } @end @implementation NSPointerArray + (id) allocWithZone: (NSZone*)z { if (abstractClass == self) { return NSAllocateObject(concreteClass, 0, z); } return [super allocWithZone: z]; } + (void) initialize { if (abstractClass == Nil) { abstractClass = [NSPointerArray class]; concreteClass = [NSConcretePointerArray class]; } } + (id) pointerArrayWithOptions: (NSPointerFunctionsOptions)options { return AUTORELEASE([[self alloc] initWithOptions: options]); } + (id) pointerArrayWithPointerFunctions: (NSPointerFunctions *)functions { return AUTORELEASE([[self alloc] initWithPointerFunctions: functions]); } + (id) strongObjectsPointerArray { return [self pointerArrayWithOptions: NSPointerFunctionsObjectPersonality | NSPointerFunctionsStrongMemory]; } + (id) weakObjectsPointerArray { return [self pointerArrayWithOptions: NSPointerFunctionsObjectPersonality | NSPointerFunctionsWeakMemory]; } - (void) compact { [self subclassResponsibility: _cmd]; } - (id) copyWithZone: (NSZone*)zone { [self subclassResponsibility: _cmd]; return nil; } - (NSUInteger) count { [self subclassResponsibility: _cmd]; return 0; } - (void) encodeWithCoder: (NSCoder*)aCoder { [self subclassResponsibility: _cmd]; } - (id) init { return [self initWithOptions: 0]; } - (id) initWithCoder: (NSCoder*)aCoder { [self subclassResponsibility: _cmd]; return nil; } - (id) initWithOptions: (NSPointerFunctionsOptions)options { NSPointerFunctions *functions; functions = [NSPointerFunctions pointerFunctionsWithOptions: options]; return [self initWithPointerFunctions: functions]; } - (id) initWithPointerFunctions: (NSPointerFunctions*)functions { [self subclassResponsibility: _cmd]; return nil; } - (BOOL) isEqual: (id)other { NSUInteger count; if (other == self) { return YES; } if ([other isKindOfClass: abstractClass] == NO) { return NO; } if ([other hash] != [self hash]) { return NO; } count = [self count]; while (count-- > 0) { // FIXME } return YES; } - (void) addPointer: (void*)pointer { [self insertPointer: pointer atIndex: [self count]]; } - (void) insertPointer: (void*)pointer atIndex: (NSUInteger)index { [self subclassResponsibility: _cmd]; } - (void*) pointerAtIndex: (NSUInteger)index { [self subclassResponsibility: _cmd]; return 0; } - (NSPointerFunctions*) pointerFunctions { [self subclassResponsibility: _cmd]; return nil; } - (void) removePointerAtIndex: (NSUInteger)index { [self subclassResponsibility: _cmd]; } - (void) replacePointerAtIndex: (NSUInteger)index withPointer: (void*)item { [self subclassResponsibility: _cmd]; } - (void) setCount: (NSUInteger)count { [self subclassResponsibility: _cmd]; } @end @implementation NSPointerArray (NSArrayConveniences) + (id) pointerArrayWithStrongObjects { return [self pointerArrayWithOptions: NSPointerFunctionsStrongMemory]; } + (id) pointerArrayWithWeakObjects { return [self pointerArrayWithOptions: NSPointerFunctionsZeroingWeakMemory]; } - (NSArray*) allObjects { [self subclassResponsibility: _cmd]; return nil; } @end @implementation NSConcretePointerArray - (void) _raiseRangeExceptionWithIndex: (NSUInteger)index from: (SEL)sel { NSDictionary *info; NSException *exception; NSString *reason; info = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithUnsignedInteger: index], @"Index", [NSNumber numberWithUnsignedInteger: _count], @"Count", self, @"Array", nil, nil]; reason = [NSString stringWithFormat: @"Index %"PRIuPTR" is out of range %"PRIuPTR" (in '%@')", index, _count, NSStringFromSelector(sel)]; exception = [NSException exceptionWithName: NSRangeException reason: reason userInfo: info]; [exception raise]; } - (NSArray*) allObjects { NSUInteger i; NSUInteger c = 0; for (i = 0; i < _count; i++) { if (pointerFunctionsRead(&_pf, &_contents[i]) != 0) { c++; } } if (0 == c) { return [NSArray array]; } else { GSMutableArray *a = [GSMutableArray arrayWithCapacity: c]; for (i = 0; i < _count; i++) { id obj = pointerFunctionsRead(&_pf, &_contents[i]); if (obj != 0) { [a addObject: obj]; } } return GS_IMMUTABLE(a); } } - (void) compact { NSUInteger insert = 0; NSUInteger i; // We can't use memmove here for __weak pointers, because that would omit the // required read barriers. We could use objc_memmoveCollectable() for strong // pointers, but we may as well use the same code path for everything for (i=0 ; i<_count ; i++) { id obj = pointerFunctionsRead(&_pf, &_contents[i]); // If this object is not nil, but at least one before it has been, then // move it back to the correct location. if (nil != obj && i != insert) { pointerFunctionsAssign(&_pf, &_contents[insert++], obj); } } _count = insert; } - (id) copyWithZone: (NSZone*)zone { NSConcretePointerArray *c; unsigned i; c = (NSConcretePointerArray*)NSCopyObject(self, 0, NSDefaultMallocZone()); c->_capacity = c->_count; c->_grow_factor = c->_capacity/2; c->_contents = NSZoneCalloc([self zone], _count, sizeof(id)); for (i = 0; i < _count; i++) { NSLog(@"Copying %d, %p", i, _contents[i]); pointerFunctionsAcquire(&_pf, &c->_contents[i], pointerFunctionsRead(&_pf, &_contents[i])); } return c; } - (NSUInteger) count { return _count; } - (void) dealloc { int i; [self finalize]; /* For weak memory, we must zero all of the elements, or the runtime will * keep pointers to them lying around. For strong memory, we must release * things or they will leak. */ for (i = 0; i < _count; i++) { pointerFunctionsAssign(&_pf, &_contents[i], 0); } if (_contents != 0) { NSZoneFree([self zone], _contents); } [super dealloc]; } - (void) encodeWithCoder: (NSCoder*)aCoder { /* FIXME ... how can we meaningfully encode the pointer functions??? */ [self notImplemented: _cmd]; if ([aCoder allowsKeyedCoding]) { [super encodeWithCoder: aCoder]; } else { /* For performace we encode directly ... must exactly match the * superclass implemenation. */ [aCoder encodeValueOfObjCType: @encode(NSUInteger) at: &_count]; if (_count > 0) { [aCoder encodeArrayOfObjCType: @encode(id) count: _count at: _contents]; } } } - (NSUInteger) hash { return _count; } - (id) initWithCoder: (NSCoder*)aCoder { /* FIXME ... how can we meaningfully encode the pointer functions??? */ [self notImplemented: _cmd]; if ([aCoder allowsKeyedCoding]) { self = [super initWithCoder: aCoder]; } else { /* for performance, we decode directly into memory rather than * using the superclass method. Must exactly match superclass. */ [aCoder decodeValueOfObjCType: @encode(NSUInteger) at: &_count]; if (_count > 0) { _contents = NSZoneCalloc([self zone], _count, sizeof(id)); if (_contents == 0) { [NSException raise: NSMallocException format: @"Unable to make array"]; } [aCoder decodeArrayOfObjCType: @encode(id) count: _count at: _contents]; } } return self; } - (id) initWithOptions: (NSPointerFunctionsOptions)options { NSConcretePointerFunctions *f; f = [[NSConcretePointerFunctions alloc] initWithOptions: options]; self = [self initWithPointerFunctions: f]; [f release]; return self; } - (id) initWithPointerFunctions: (NSPointerFunctions*)functions { if (![functions isKindOfClass: [NSConcretePointerFunctions class]]) { static NSConcretePointerFunctions *defaultFunctions = nil; if (defaultFunctions == nil) { defaultFunctions = [[NSConcretePointerFunctions alloc] initWithOptions: 0]; } functions = defaultFunctions; } memcpy(&_pf, &((NSConcretePointerFunctions*)functions)->_x, sizeof(_pf)); return self; } - (void) insertPointer: (void*)pointer atIndex: (NSUInteger)index { NSUInteger i; if (index > _count) { [self _raiseRangeExceptionWithIndex: index from: _cmd]; } i = _count; [self setCount: _count + 1]; while (i > index) { pointerFunctionsMove(&_pf, _contents+i, _contents + i-1); i--; } pointerFunctionsAcquire(&_pf, &_contents[index], pointer); } - (BOOL) isEqual: (id)other { NSUInteger count; if (other == self) { return YES; } if ([other isKindOfClass: abstractClass] == NO) { return NO; } if ([other hash] != [self hash]) { return NO; } count = [self count]; while (count-- > 0) { if (pointerFunctionsEqual(&_pf, pointerFunctionsRead(&_pf, &_contents[count]), [other pointerAtIndex: count]) == NO) return NO; } return YES; } - (void*) pointerAtIndex: (NSUInteger)index { if (index >= _count) { [self _raiseRangeExceptionWithIndex: index from: _cmd]; } return pointerFunctionsRead(&_pf, &_contents[index]); } - (NSPointerFunctions*) pointerFunctions { NSConcretePointerFunctions *pf = [NSConcretePointerFunctions new]; pf->_x = _pf; return [pf autorelease]; } - (void) removePointerAtIndex: (NSUInteger)index { if (index >= _count) { [self _raiseRangeExceptionWithIndex: index from: _cmd]; } pointerFunctionsRelinquish(&_pf, &_contents[index]); while (++index < _count) { pointerFunctionsMove(&_pf, &_contents[index-1], &_contents[index]); } [self setCount: _count - 1]; } - (void) replacePointerAtIndex: (NSUInteger)index withPointer: (void*)item { if (index >= _count) { [self _raiseRangeExceptionWithIndex: index from: _cmd]; } pointerFunctionsReplace(&_pf, &_contents[index], item); } - (void) setCount: (NSUInteger)count { if (count > _count) { _count = count; if (_count >= _capacity) { void **ptr; size_t size; size_t new_cap = _capacity; size_t new_gf = _grow_factor ? _grow_factor : 2; while (new_cap + new_gf < _count) { new_cap += new_gf; new_gf = new_cap/2; } size = (new_cap + new_gf)*sizeof(void*); new_cap += new_gf; new_gf = new_cap / 2; if (_contents == 0) { if (_pf.options & NSPointerFunctionsZeroingWeakMemory) { ptr = (void**)NSAllocateCollectable(size, 0); } else { ptr = (void**)NSAllocateCollectable(size, NSScannedOption); } } else { if (_pf.options & NSPointerFunctionsZeroingWeakMemory) { ptr = (void**)NSReallocateCollectable( _contents, size, 0); } else { ptr = (void**)NSReallocateCollectable( _contents, size, NSScannedOption); } } if (ptr == 0) { [NSException raise: NSMallocException format: @"Unable to grow array"]; } memset(ptr + _capacity, '\0', (new_cap - _capacity) * sizeof(void*)); _contents = ptr; _capacity = new_cap; _grow_factor = new_gf; } } else { while (count < _count) { _count--; pointerFunctionsRelinquish(&_pf, &_contents[_count]); } } } @end gnustep-base-1.29.0/Source/NSPointerFunctions.m000066400000000000000000000074631435650067400214140ustar00rootroot00000000000000/**Implementation for NSPointerFunctions for GNUStep Copyright (C) 2009 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 2009 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #import "NSConcretePointerFunctions.h" static Class abstractClass = Nil; static Class concreteClass = Nil; @implementation NSPointerFunctions + (id) allocWithZone: (NSZone*)zone { if (self == abstractClass) { return (id) NSAllocateObject(concreteClass, 0, zone); } return [super allocWithZone: zone]; } + (void) initialize { if (abstractClass == nil) { abstractClass = [NSPointerFunctions class]; concreteClass = [NSConcretePointerFunctions class]; } } + (id) pointerFunctionsWithOptions: (NSPointerFunctionsOptions)options { return AUTORELEASE([[self alloc] initWithOptions: options]); } - (id) copyWithZone: (NSZone*)zone { return NSCopyObject(self, 0, zone); } - (id) initWithOptions: (NSPointerFunctionsOptions)options { [self subclassResponsibility: _cmd]; return nil; } - (void* (*)(const void *item, NSUInteger (*size)(const void *item), BOOL shouldCopy)) acquireFunction { [self subclassResponsibility: _cmd]; return 0; } - (NSString *(*)(const void *item)) descriptionFunction { [self subclassResponsibility: _cmd]; return 0; } - (NSUInteger (*)(const void *item, NSUInteger (*size)(const void *item))) hashFunction { [self subclassResponsibility: _cmd]; return 0; } - (BOOL (*)(const void *item1, const void *item2, NSUInteger (*size)(const void *item))) isEqualFunction { [self subclassResponsibility: _cmd]; return 0; } - (void (*)(const void *item, NSUInteger (*size)(const void *item))) relinquishFunction { [self subclassResponsibility: _cmd]; return 0; } - (void) setAcquireFunction: (void* (*)(const void *item, NSUInteger (*size)(const void *item), BOOL shouldCopy))func { [self subclassResponsibility: _cmd]; } - (void) setDescriptionFunction: (NSString *(*)(const void *item))func { [self subclassResponsibility: _cmd]; } - (void) setHashFunction: (NSUInteger (*)(const void *item, NSUInteger (*size)(const void *item)))func { [self subclassResponsibility: _cmd]; } - (void) setIsEqualFunction: (BOOL (*)(const void *item1, const void *item2, NSUInteger (*size)(const void *item)))func { [self subclassResponsibility: _cmd]; } - (void) setRelinquishFunction: (void (*)(const void *item, NSUInteger (*size)(const void *item))) func { [self subclassResponsibility: _cmd]; } - (void) setSizeFunction: (NSUInteger (*)(const void *item))func { [self subclassResponsibility: _cmd]; } - (void) setUsesStrongWriteBarrier: (BOOL)flag { [self subclassResponsibility: _cmd]; } - (void) setUsesWeakReadAndWriteBarriers: (BOOL)flag { [self subclassResponsibility: _cmd]; } - (NSUInteger (*)(const void *item)) sizeFunction { [self subclassResponsibility: _cmd]; return 0; } - (BOOL) usesStrongWriteBarrier { [self subclassResponsibility: _cmd]; return 0; } - (BOOL) usesWeakReadAndWriteBarriers { [self subclassResponsibility: _cmd]; return 0; } @end gnustep-base-1.29.0/Source/NSPort.m000066400000000000000000000127761435650067400170320ustar00rootroot00000000000000/** Implementation of abstract superclass port for use with NSConnection Copyright (C) 1997, 1998 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: August 1997 This file is part of the GNUstep Base Library. 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 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 USA. NSPort class reference $Date$ $Revision$ */ #import "common.h" #define EXPOSE_NSPort_IVARS 1 #import "Foundation/NSException.h" #import "Foundation/NSNotification.h" #import "Foundation/NSNotificationQueue.h" #import "Foundation/NSPort.h" #import "Foundation/NSPortCoder.h" #import "Foundation/NSPortNameServer.h" #import "Foundation/NSRunLoop.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSUserDefaults.h" #import "GSPrivate.h" @class NSMessagePort; @implementation NSObject(NSPortDelegateMethods) - (void) handlePortMessage: (NSPortMessage*)aMessage { } @end @implementation NSPort static Class NSPort_abstract_class; static Class NSPort_concrete_class; + (id) allocWithZone: (NSZone*)aZone { if (self == NSPort_abstract_class) { return NSAllocateObject(NSPort_concrete_class, 0, aZone); } else { return NSAllocateObject(self, 0, aZone); } } + (void) initialize { if (self == [NSPort class]) { NSUserDefaults *defs; GSMakeWeakPointer(self, "delegate"); NSPort_abstract_class = self; NSPort_concrete_class = [NSMessagePort class]; defs = [NSUserDefaults standardUserDefaults]; if ([defs objectForKey: @"NSPortIsMessagePort"] != nil && [defs boolForKey: @"NSPortIsMessagePort"] == NO) { NSPort_concrete_class = [NSSocketPort class]; } } } + (NSPort*) port { if (self == NSPort_abstract_class) return AUTORELEASE([NSPort_concrete_class new]); else return AUTORELEASE([self new]); } + (NSPort*) portWithMachPort: (NSInteger)machPort { return AUTORELEASE([[self alloc] initWithMachPort: machPort]); } - (id) copyWithZone: (NSZone*)aZone { return RETAIN(self); } - (id) delegate { return _delegate; } - (void) encodeWithCoder: (NSCoder*)aCoder { [(NSPortCoder*)aCoder encodePortObject: self]; } - (id) init { self = [super init]; return self; } - (id) initWithCoder: (NSCoder*)aCoder { id obj = [(NSPortCoder*)aCoder decodePortObject]; if (obj != self) { DESTROY(self); self = RETAIN(obj); } return self; } - (id) initWithMachPort: (NSInteger)machPort { [self shouldNotImplement: _cmd]; return nil; } /* * subclasses should override this method and call [super invalidate] * in their versions of the method. */ - (void) invalidate { NSAutoreleasePool *arp = [NSAutoreleasePool new]; _is_valid = NO; [[NSNotificationCenter defaultCenter] postNotificationName: NSPortDidBecomeInvalidNotification object: self]; [arp drain]; } - (BOOL) isValid { return _is_valid; } - (NSInteger) machPort { [self shouldNotImplement: _cmd]; return 0; } - (id) retain { return [super retain]; } - (id) autorelease { return [super autorelease]; } - (oneway void) release { if (_is_valid && [self retainCount] == 1) { /* * If the port is about to have a final release deallocate it * we must invalidate it. * Bracket with retain/release pair to prevent recursion. */ [super retain]; [self invalidate]; [super release]; } [super release]; } - (void) setDelegate: (id) anObject { NSAssert(anObject == nil || [anObject respondsToSelector: @selector(handlePortMessage:)], NSInvalidArgumentException); _delegate = anObject; } - (void) addConnection: (NSConnection*)aConnection toRunLoop: (NSRunLoop*)aLoop forMode: (NSString*)aMode { [aLoop addPort: self forMode: aMode]; } - (void) removeConnection: (NSConnection*)aConnection fromRunLoop: (NSRunLoop*)aLoop forMode: (NSString*)aMode { [aLoop removePort: self forMode: aMode]; } - (NSUInteger) reservedSpaceLength { [self subclassResponsibility: _cmd]; return 0; } - (BOOL) sendBeforeDate: (NSDate*)when components: (NSMutableArray*)components from: (NSPort*)receivingPort reserved: (NSUInteger)length { return [self sendBeforeDate: when msgid: 0 components: components from: receivingPort reserved: length]; } - (BOOL) sendBeforeDate: (NSDate*)when msgid: (NSInteger)msgid components: (NSMutableArray*)components from: (NSPort*)receivingPort reserved: (NSUInteger)length { [self subclassResponsibility: _cmd]; return YES; } @end /* * This is a callback method used by the NSRunLoop class to determine which * descriptors to watch for the port. Subclasses override it. */ @implementation NSPort (GNUstep) - (void) getFds: (NSInteger*)fds count: (NSInteger*)count { *count = 0; } @end gnustep-base-1.29.0/Source/NSPortCoder.m000066400000000000000000001531671435650067400200070ustar00rootroot00000000000000/** Implementation of NSPortCoder object for remote messaging Copyright (C) 1997,2000 Free Software Foundation, Inc. This implementation for OPENSTEP conformance written by Richard Frith-Macdonald Created: August 1997, rewritten June 2000 based on original code - Copyright (C) 1994, 1995, 1996 Free Software Foundation, Inc. Written by: Andrew Kachites McCallum Created: July 1994 This file is part of the GNUstep Base Library. 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 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 USA. NSPortCoder class reference $Date$ $Revision$ */ #import "common.h" #if !defined (__GNU_LIBOBJC__) # include #endif #define EXPOSE_NSPortCoder_IVARS 1 #import "Foundation/NSException.h" #import "Foundation/NSByteOrder.h" #import "Foundation/NSCoder.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSData.h" #import "Foundation/NSPort.h" @class NSMutableDataMalloc; @interface NSMutableDataMalloc : NSObject // Help the compiler @end /* * Setup for inline operation of pointer map tables. */ #define GSI_MAP_KTYPES GSUNION_PTR | GSUNION_OBJ | GSUNION_CLS | GSUNION_NSINT #define GSI_MAP_VTYPES GSUNION_PTR | GSUNION_OBJ | GSUNION_CLS | GSUNION_NSINT #define GSI_MAP_RETAIN_KEY(M, X) #define GSI_MAP_RELEASE_KEY(M, X) #define GSI_MAP_RETAIN_VAL(M, X) #define GSI_MAP_RELEASE_VAL(M, X) #define GSI_MAP_HASH(M, X) ((X).nsu) #define GSI_MAP_EQUAL(M, X,Y) ((X).ptr == (Y).ptr) #define GSI_MAP_NOCLEAN 1 #include "GNUstepBase/GSIMap.h" /* * Setup for inline operation of arrays. */ #define GSI_ARRAY_NO_RETAIN 1 #define GSI_ARRAY_NO_RELEASE 1 #define GSI_ARRAY_TYPES GSUNION_OBJ|GSUNION_SEL|GSUNION_PTR #include "GNUstepBase/GSIArray.h" #define _IN_PORT_CODER_M #import "Foundation/NSPortCoder.h" #undef _IN_PORT_CODER_M #import "GNUstepBase/DistributedObjects.h" typedef unsigned char uchar; #define PREFIX "GNUstep DO archive" static SEL eSerSel; static SEL eTagSel; static SEL xRefSel; static SEL eObjSel; static SEL eValSel; static SEL dDesSel; static SEL dTagSel; static SEL dValSel; static const char* typeToName1(char type) { switch (type) { case _C_CLASS: return "class"; case _C_ID: return "object"; case _C_SEL: return "selector"; case _C_CHR: return "char"; case _C_UCHR: return "unsigned char"; case _C_SHT: return "short"; case _C_USHT: return "unsigned short"; case _C_INT: return "int"; case _C_UINT: return "unsigned int"; case _C_LNG: return "long"; case _C_ULNG: return "unsigned long"; case _C_LNG_LNG: return "long long"; case _C_ULNG_LNG: return "unsigned long long"; case _C_FLT: return "float"; case _C_DBL: return "double"; case _C_PTR: return "pointer"; case _C_CHARPTR: return "cstring"; case _C_ARY_B: return "array"; case _C_STRUCT_B: return "struct"; #if defined(_C_BOOL) && (!defined(__GNUC__) || __GNUC__ > 2) case _C_BOOL: return "_Bool"; #endif default: { static char buf1[32]; static char buf2[32]; static char *bufptr = buf1; if (bufptr == buf1) { bufptr = buf2; } else { bufptr = buf1; } snprintf(bufptr, 32, "unknown type info - 0x%x", type); return bufptr; } } } static const char* typeToName2(char type) { switch (type & _GSC_MASK) { case _GSC_CID: return "class (encoded as id)"; case _GSC_CLASS: return "class"; case _GSC_ID: return "object"; case _GSC_SEL: return "selector"; case _GSC_CHR: return "char"; case _GSC_UCHR: return "unsigned char"; case _GSC_SHT: return "short"; case _GSC_USHT: return "unsigned short"; case _GSC_INT: return "int"; case _GSC_UINT: return "unsigned int"; case _GSC_LNG: return "long"; case _GSC_ULNG: return "unsigned long"; case _GSC_LNG_LNG: return "long long"; case _GSC_ULNG_LNG: return "unsigned long long"; case _GSC_FLT: return "float"; case _GSC_DBL: return "double"; case _GSC_BOOL: return "_Bool"; case _GSC_PTR: return "pointer"; case _GSC_CHARPTR: return "cstring"; case _GSC_ARY_B: return "array"; case _GSC_STRUCT_B: return "struct"; default: { static char buf1[32]; static char buf2[32]; static char *bufptr = buf1; if (bufptr == buf1) { bufptr = buf2; } else { bufptr = buf1; } snprintf(bufptr, 32, "unknown type info - 0x%x", type); return bufptr; } } } /* * There are thirtyone possible basic types. We reserve a type of zero * to mean that no information is specified. The slots in this array * MUST correspond to the definitions in NSData.h */ static char type_map[32] = { 0, _C_CHR, _C_UCHR, _C_SHT, _C_USHT, _C_INT, _C_UINT, _C_LNG, _C_ULNG, #ifdef _C_LNG_LNG _C_LNG_LNG, _C_ULNG_LNG, #else 0, 0, #endif _C_FLT, _C_DBL, #if defined(_C_BOOL) && (!defined(__GNUC__) || __GNUC__ > 2) _C_BOOL, #else 0, #endif 0, 0, _C_ID, _C_CLASS, _C_SEL, _C_PTR, _C_CHARPTR, _C_ARY_B, _C_STRUCT_B, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; static inline void typeCheck(char t1, char t2) { if (type_map[(t2 & _GSC_MASK)] != t1) { /* * HACK ... allow int/long/longlong types to be used interchangably * as the ObjC compiler currently uses quadword (q/Q) encoding for * integer types on some 64bit systems, so the i/l/q/I/L/Q encodings * can vary. */ char c = type_map[(t2 & _GSC_MASK)]; if ((c == _C_INT || c == _C_LNG #ifdef _C_LNG_LNG || c == _C_LNG_LNG #endif ) && (t1 == _C_INT || t1 == _C_LNG #ifdef _C_LNG_LNG || t1 == _C_LNG_LNG #endif )) return; if ((c == _C_UINT || c == _C_ULNG #ifdef _C_LNG_LNG || c == _C_ULNG_LNG #endif ) && (t1 == _C_UINT || t1 == _C_ULNG #ifdef _C_LNG_LNG || t1 == _C_ULNG_LNG #endif )) return; /* HACK also allow float and double to be used interchangably as MacOS-X * intorduced CGFloat, which may be aither a float or a double. */ if ((c == _C_FLT || c == _C_DBL) && (t1 == _C_FLT || t1 == _C_DBL)) return; [NSException raise: NSInternalInconsistencyException format: @"expected %s and got %s", typeToName1(t1), typeToName2(t2)]; } } @interface GSClassInfo : NSObject { @public Class class; unsigned version; NSString *name; } + (id) newWithClass: (Class)c andVersion: (unsigned)v; - (NSString*) className; @end @implementation GSClassInfo + (id) newWithClass: (Class)c andVersion: (unsigned)v; { GSClassInfo *info; info = (GSClassInfo*)NSAllocateObject(self, 0, NSDefaultMallocZone()); if (info != nil) { info->class = c; info->version = v; } return info; } - (NSString*) className { if (name == nil) { name = RETAIN(NSStringFromClass(class)); } return name; } - (void) dealloc { TEST_RELEASE(name); NSDeallocateObject(self); GSNOSUPERDEALLOC; } @end @interface NSPortCoder (Headers) - (void) _deserializeHeaderAt: (unsigned*)pos version: (unsigned*)v classes: (unsigned*)c objects: (unsigned*)o pointers: (unsigned*)p; - (void) _serializeHeaderAt: (unsigned)pos version: (unsigned)v classes: (unsigned)c objects: (unsigned)o pointers: (unsigned)p; @end @implementation NSPortCoder static Class connectionClass; static Class mutableArrayClass; static Class mutableDataClass; static Class mutableDictionaryClass; static IMP _eSerImp; /* Method to serialize with. */ static IMP _eTagImp; /* Serialize a type tag. */ static IMP _xRefImp; /* Serialize a crossref. */ static unsigned encodingVersion; + (void) initialize { if (self == [NSPortCoder class]) { NSCoder *coder = [NSCoder new]; encodingVersion = [coder systemVersion]; [coder release]; connectionClass = [NSConnection class]; mutableArrayClass = [NSMutableArray class]; mutableDataClass = [NSMutableDataMalloc class]; eSerSel = @selector(serializeDataAt:ofObjCType:context:); eTagSel = @selector(serializeTypeTag:); xRefSel = @selector(serializeTypeTag:andCrossRef:); eObjSel = @selector(encodeObject:); eValSel = @selector(encodeValueOfObjCType:at:); dDesSel = @selector(deserializeDataAt:ofObjCType:atCursor:context:); dTagSel = @selector(deserializeTypeTag:andCrossRef:atCursor:); dValSel = @selector(decodeValueOfObjCType:at:); _eSerImp = [mutableDataClass instanceMethodForSelector: eSerSel]; _eTagImp = [mutableDataClass instanceMethodForSelector: eTagSel]; _xRefImp = [mutableDataClass instanceMethodForSelector: xRefSel]; mutableDictionaryClass = [NSMutableDictionary class]; } } + (NSPortCoder*) portCoderWithReceivePort: (NSPort*)recv sendPort: (NSPort*)send components: (NSArray*)comp { id coder; coder = [self allocWithZone: NSDefaultMallocZone()]; coder = [coder initWithReceivePort: recv sendPort: send components: comp]; IF_NO_ARC(AUTORELEASE(coder);) return coder; } - (NSConnection*) connection { return _conn; } - (void) dealloc { RELEASE(_dst); /* Decoders retain their output data object. */ RELEASE(_comp); RELEASE(_conn); RELEASE(_cInfo); if (_clsMap != 0) { GSIMapEmptyMap(_clsMap); GSIMapEmptyMap(_cIdMap); GSIMapEmptyMap(_uIdMap); GSIMapEmptyMap(_ptrMap); NSZoneFree(_clsMap->zone, (void*)_clsMap); } if (_clsAry != 0) { unsigned count = GSIArrayCount(_clsAry); // Zero'th item is nul while (count-- > 1) { RELEASE(GSIArrayItemAtIndex(_clsAry, count).obj); } GSIArrayClear(_clsAry); GSIArrayClear(_objAry); GSIArrayClear(_ptrAry); NSZoneFree(_clsAry->zone, (void*)_clsAry); } [super dealloc]; } - (void) decodeArrayOfObjCType: (const char*)type count: (NSUInteger)expected at: (void*)buf { NSUInteger i; NSUInteger offset = 0; uint32_t size = objc_sizeof_type(type); unsigned char info; NSUInteger count; (*_dTagImp)(_src, dTagSel, &info, 0, &_cursor); if (12402 == _version) { uint8_t c; /* Unpack variable length count. */ count = 0; for (;;) { if (count * 128 < count) { [NSException raise: NSInternalInconsistencyException format: @"overflow in array count"]; } count *= 128; (*_dDesImp)(_src, dDesSel, &c, @encode(uint8_t), &_cursor, nil); if (c & 128) { count += (c & 127); } else { count += c; break; } } } else { uint32_t c; (*_dDesImp)(_src, dDesSel, &c, @encode(uint32_t), &_cursor, nil); count = c; if (0xffffffff == c) { (*_dDesImp)(_src, dDesSel, &count, @encode(NSUInteger), &_cursor, nil); } } if (info != _GSC_ARY_B) { [NSException raise: NSInternalInconsistencyException format: @"expected array and got %s", typeToName2(info)]; } if (count != expected) { [NSException raise: NSInternalInconsistencyException format: @"expected array count %"PRIuPTR" and got %"PRIuPTR, expected, count]; } switch (*type) { case _C_ID: info = _GSC_NONE; break; case _C_CHR: info = _GSC_CHR; break; case _C_UCHR: info = _GSC_UCHR; break; case _C_SHT: info = _GSC_SHT; break; case _C_USHT: info = _GSC_USHT; break; case _C_INT: info = _GSC_INT; break; case _C_UINT: info = _GSC_UINT; break; case _C_LNG: info = _GSC_LNG; break; case _C_ULNG: info = _GSC_ULNG; break; #ifdef _C_LNG_LNG case _C_LNG_LNG: info = _GSC_LNG_LNG; break; case _C_ULNG_LNG: info = _GSC_ULNG_LNG; break; #endif case _C_FLT: info = _GSC_FLT; break; case _C_DBL: info = _GSC_DBL; break; #if defined(_C_BOOL) && (!defined(__GNUC__) || __GNUC__ > 2) case _C_BOOL: info = _GSC_BOOL; break; #endif default: info = _GSC_NONE; break; } if (info == _GSC_NONE) { for (i = 0; i < count; i++) { (*_dValImp)(self, dValSel, type, (char*)buf + offset); offset += size; } } else { unsigned char ainfo; (*_dTagImp)(_src, dTagSel, &ainfo, 0, &_cursor); if (info != (ainfo & _GSC_MASK)) { [NSException raise: NSInternalInconsistencyException format: @"expected %s and got %s", typeToName2(info), typeToName2(ainfo)]; } for (i = 0; i < count; i++) { (*_dDesImp)(_src, dDesSel, (char*)buf + offset, type, &_cursor, nil); offset += size; } } } - (NSData*) decodeDataObject { int pos; [self decodeValueOfObjCType: @encode(int) at: &pos]; if (pos >= 0) { return [_comp objectAtIndex: pos]; } else if (pos == -1) { return nil; } else if (pos == -2) { return [mutableDataClass data]; } else { [NSException raise: NSInternalInconsistencyException format: @"Bad tag (%d) decoding data object", pos]; return nil; } } - (NSPort*) decodePortObject { unsigned pos; [self decodeValueOfObjCType: @encode(unsigned) at: &pos]; return [_comp objectAtIndex: pos]; } static inline int scalarSize(char type) { switch (type) { case _C_SHT: case _C_USHT: return _GSC_S_SHT; case _C_INT: case _C_UINT: return _GSC_S_INT; case _C_LNG: case _C_ULNG: return _GSC_S_LNG; case _C_LNG_LNG: case _C_ULNG_LNG: return _GSC_S_LNG_LNG; default: [NSException raise: NSInvalidArgumentException format: @"scalarSize() called with non-scalar type"]; } return -1; } - (void) decodeValueOfObjCType: (const char*)type at: (void*)address { unsigned xref; unsigned char info; (*_dTagImp)(_src, dTagSel, &info, &xref, &_cursor); switch (info & _GSC_MASK) { case _GSC_ID: { id obj; typeCheck(*type, _GSC_ID); /* * Special case - a zero crossref value size is a nil pointer. */ if ((info & _GSC_SIZE) == 0) { obj = nil; } else { if (info & _GSC_XREF) { if (xref >= GSIArrayCount(_objAry)) { [NSException raise: NSInternalInconsistencyException format: @"object crossref missing - %d", xref]; } obj = GSIArrayItemAtIndex(_objAry, xref).obj; /* * If it's a cross-reference, we need to retain it in * order to give the appearance that it's actually a * new object. */ IF_NO_ARC(RETAIN(obj);) } else { Class c; id rep; if (xref != GSIArrayCount(_objAry)) { [NSException raise: NSInternalInconsistencyException format: @"extra object crossref - %d", xref]; } (*_dValImp)(self, dValSel, @encode(Class), &c); if (c == 0) { NSLog(@"[%s %s] decoded nil class", class_getName([self class]), sel_getName(_cmd)); } obj = [c allocWithZone: _zone]; GSIArrayAddItem(_objAry, (GSIArrayItem)obj); rep = [obj initWithCoder: self]; if (rep != obj) { obj = rep; GSIArraySetItemAtIndex(_objAry, (GSIArrayItem)obj, xref); } rep = [obj awakeAfterUsingCoder: self]; if (rep != obj) { obj = rep; GSIArraySetItemAtIndex(_objAry, (GSIArrayItem)obj, xref); } GS_CONSUMED(rep) } } *(id*)address = obj; return; } case _GSC_CID: { id obj; typeCheck(*type, _GSC_ID); /* * Special case - a zero crossref value size is a nil pointer. */ if ((info & _GSC_SIZE) == 0) { obj = nil; } else { if (info & _GSC_XREF) { if (xref >= GSIArrayCount(_objAry)) { [NSException raise: NSInternalInconsistencyException format: @"object crossref missing - %d", xref]; } obj = GSIArrayItemAtIndex(_objAry, xref).obj; /* * If it's a cross-reference, we need to retain it in * order to give the appearance that it's actually a * new object. */ IF_NO_ARC(RETAIN(obj);) } else { if (xref != GSIArrayCount(_objAry)) { [NSException raise: NSInternalInconsistencyException format: @"extra object crossref - %d", xref]; } (*_dValImp)(self, dValSel, @encode(Class), &obj); GSIArrayAddItem(_objAry, (GSIArrayItem)obj); } } *(id*)address = obj; return; } case _GSC_CLASS: { Class c; GSClassInfo *classInfo; Class dummy; if (*type != _C_ID) { typeCheck(*type, _GSC_CLASS); } /* * Special case - a zero crossref value size is a nil pointer. */ if ((info & _GSC_SIZE) == 0) { *(SEL*)address = 0; return; } if (info & _GSC_XREF) { if (xref >= GSIArrayCount(_clsAry)) { [NSException raise: NSInternalInconsistencyException format: @"class crossref missing - %d", xref]; } classInfo = (GSClassInfo*)GSIArrayItemAtIndex(_clsAry, xref).obj; *(Class*)address = classInfo->class; return; } while ((info & _GSC_MASK) == _GSC_CLASS) { unsigned cver; if (xref != GSIArrayCount(_clsAry)) { [NSException raise: NSInternalInconsistencyException format: @"extra class crossref - %d", xref]; } (*_dDesImp)(_src, dDesSel, &c, @encode(Class), &_cursor, nil); (*_dDesImp)(_src, dDesSel, &cver, @encode(unsigned), &_cursor, nil); if (c == 0) { NSLog(@"[%s %s] decoded nil class", class_getName([self class]), sel_getName(_cmd)); } classInfo = [GSClassInfo newWithClass: c andVersion: cver]; GSIArrayAddItem(_clsAry, (GSIArrayItem)((id)classInfo)); *(Class*)address = classInfo->class; /* * Point the address to a dummy location and read the * next tag - if it is another class, loop to get it. */ address = &dummy; (*_dTagImp)(_src, dTagSel, &info, &xref, &_cursor); GS_CONSUMED(classInfo) } if (info != _GSC_NONE) { [NSException raise: NSInternalInconsistencyException format: @"class list improperly terminated"]; } return; } case _GSC_SEL: { SEL sel; typeCheck(*type, _GSC_SEL); /* * Special case - a zero crossref value size is a nil pointer. */ if ((info & _GSC_SIZE) == 0) { *(SEL*)address = 0; return; } if (info & _GSC_XREF) { if (xref >= GSIArrayCount(_ptrAry)) { [NSException raise: NSInternalInconsistencyException format: @"sel crossref missing - %d", xref]; } sel = GSIArrayItemAtIndex(_ptrAry, xref).sel; } else { if (xref != GSIArrayCount(_ptrAry)) { [NSException raise: NSInternalInconsistencyException format: @"extra sel crossref - %d", xref]; } (*_dDesImp)(_src, dDesSel, &sel, @encode(SEL), &_cursor, nil); GSIArrayAddItem(_ptrAry, (GSIArrayItem)sel); } *(SEL*)address = sel; return; } case _GSC_ARY_B: { int count; typeCheck(*type, _GSC_ARY_B); count = atoi(++type); while (isdigit(*type)) { type++; } [self decodeArrayOfObjCType: type count: count at: address]; return; } case _GSC_STRUCT_B: { struct objc_struct_layout layout; typeCheck(*type, _GSC_STRUCT_B); objc_layout_structure (type, &layout); while (objc_layout_structure_next_member (&layout)) { unsigned offset; unsigned align; const char *ftype; objc_layout_structure_get_info (&layout, &offset, &align, &ftype); (*_dValImp)(self, dValSel, ftype, (char*)address + offset); } return; } case _GSC_PTR: { typeCheck(*type, _GSC_PTR); /* * Special case - a zero crossref value size is a nil pointer. */ if ((info & _GSC_SIZE) == 0) { *(void**)address = 0; return; } if (info & _GSC_XREF) { if (xref >= GSIArrayCount(_ptrAry)) { [NSException raise: NSInternalInconsistencyException format: @"ptr crossref missing - %d", xref]; } *(void**)address = GSIArrayItemAtIndex(_ptrAry, xref).ptr; } else { unsigned size; if (GSIArrayCount(_ptrAry) != xref) { [NSException raise: NSInternalInconsistencyException format: @"extra ptr crossref - %d", xref]; } /* * Allocate memory for object to be decoded into and * add it to the crossref map. */ size = objc_sizeof_type(++type); *(void**)address = GSAutoreleasedBuffer(size); GSIArrayAddItem(_ptrAry, (GSIArrayItem)*(void**)address); /* * Decode value and add memory to map for crossrefs. */ (*_dValImp)(self, dValSel, type, *(void**)address); } return; } case _GSC_CHARPTR: { typeCheck(*type, _GSC_CHARPTR); /* * Special case - a zero crossref value size is a nil pointer. */ if ((info & _GSC_SIZE) == 0) { *(char**)address = 0; return; } if (info & _GSC_XREF) { if (xref >= GSIArrayCount(_ptrAry)) { [NSException raise: NSInternalInconsistencyException format: @"string crossref missing - %d", xref]; } *(char**)address = GSIArrayItemAtIndex(_ptrAry, xref).str; } else { char *tmp; int len; if (xref != GSIArrayCount(_ptrAry)) { [NSException raise: NSInternalInconsistencyException format: @"extra string crossref - %d", xref]; } (*_dDesImp)(_src, dDesSel, &tmp, @encode(char*), &_cursor, nil); len = strlen(tmp); *(void**)address = GSAutoreleasedBuffer(len + 1); GSIArrayAddItem(_ptrAry, (GSIArrayItem)*(void**)address); memcpy(*(char**)address, tmp, len + 1); NSZoneFree(NSDefaultMallocZone(), tmp); } return; } case _GSC_CHR: case _GSC_UCHR: /* Encoding of chars is not consistant across platforms, so we loosen the type checking a little */ if (*type != type_map[_GSC_CHR] && *type != type_map[_GSC_UCHR]) { [NSException raise: NSInternalInconsistencyException format: @"expected %s and got %s", typeToName1(*type), typeToName2(info)]; } (*_dDesImp)(_src, dDesSel, address, type, &_cursor, nil); return; case _GSC_SHT: case _GSC_USHT: typeCheck(*type, info & _GSC_MASK); if ((info & _GSC_SIZE) == scalarSize(*type)) { (*_dDesImp)(_src, dDesSel, address, type, &_cursor, nil); return; } break; case _GSC_INT: case _GSC_UINT: typeCheck(*type, info & _GSC_MASK); if ((info & _GSC_SIZE) == scalarSize(*type)) { (*_dDesImp)(_src, dDesSel, address, type, &_cursor, nil); return; } break; case _GSC_LNG: case _GSC_ULNG: typeCheck(*type, info & _GSC_MASK); if ((info & _GSC_SIZE) == scalarSize(*type)) { (*_dDesImp)(_src, dDesSel, address, type, &_cursor, nil); return; } break; #ifdef _C_LNG_LNG case _GSC_LNG_LNG: case _GSC_ULNG_LNG: typeCheck(*type, info & _GSC_MASK); if ((info & _GSC_SIZE) == scalarSize(*type)) { (*_dDesImp)(_src, dDesSel, address, type, &_cursor, nil); return; } break; #endif case _GSC_FLT: typeCheck(*type, _GSC_FLT); if (*type == _C_FLT) { (*_dDesImp)(_src, dDesSel, address, type, &_cursor, nil); } else { float val; /* We found a float when expecting a double ... handle it. */ (*_dDesImp)(_src, dDesSel, &val, @encode(float), &_cursor, nil); *(double*)address = (double)val; } return; case _GSC_DBL: typeCheck(*type, _GSC_DBL); if (*type == _C_DBL) { (*_dDesImp)(_src, dDesSel, address, type, &_cursor, nil); } else { double val; /* We found a double when expecting a float ... handle it. */ (*_dDesImp)(_src, dDesSel, &val, @encode(double), &_cursor, nil); *(float*)address = (float)val; } return; #if __GNUC__ != 2 case _GSC_BOOL: if (*type != type_map[_GSC_BOOL]) { [NSException raise: NSInternalInconsistencyException format: @"expected %s and got %s", typeToName1(*type), typeToName2(info)]; } (*_dDesImp)(_src, dDesSel, address, type, &_cursor, nil); return; #endif default: [NSException raise: NSInternalInconsistencyException format: @"read unknown type info - %d", info]; } /* * We fall through to here only when we have to decode a value * whose natural size on this system is not the same as on the * machine on which the archive was created. */ { uint8_t size; /* * We fall through to here only when we have to decode a value * whose natural size on this system is not the same as on the * machine on which the archive was created. */ switch (*type) { case _C_SHT: case _C_USHT: size = sizeof(short); break; case _C_INT: case _C_UINT: size = sizeof(int); break; case _C_LNG: case _C_ULNG: size = sizeof(long); break; case _C_LNG_LNG: case _C_ULNG_LNG: size = sizeof(long long); break; default: size = 1; } /* * First, we read the data and convert it to the largest size * this system can support. */ if (*type == _C_SHT || *type == _C_INT || *type == _C_LNG || *type == _C_LNG_LNG) { int64_t big; switch (info & _GSC_SIZE) { case _GSC_I16: /* Encoded as 16-bit */ { int16_t val; (*_dDesImp)(_src, dDesSel, &val, @encode(int16_t), &_cursor, nil); big = val; break; } case _GSC_I32: /* Encoded as 32-bit */ { int32_t val; (*_dDesImp)(_src, dDesSel, &val, @encode(int32_t), &_cursor, nil); big = val; break; } case _GSC_I64: /* Encoded as 64-bit */ { (*_dDesImp)(_src, dDesSel, &big, @encode(int64_t), &_cursor, nil); break; } default: /* A 128-bit value */ { big = 0; [NSException raise: NSInternalInconsistencyException format: @"Archiving of 128bit integer not allowed"]; } } /* * Now we copy from the big value to the destination location. */ switch (size) { case 1: *(int8_t*)address = (int8_t)big; if (big > 127 || big < -128) { NSLog(@"Lost information converting decoded value to int8_t"); } return; case 2: *(int16_t*)address = (int16_t)big; if (big > 32767 || big < -32768) { NSLog(@"Lost information converting decoded value to int16_t"); } return; case 4: *(int32_t*)address = (int32_t)big; if (big > 2147483647 || big < -2147483648LL) { NSLog(@"Lost information converting decoded value to int32_t"); } return; case 8: *(int64_t*)address = big; return; default: [NSException raise: NSInternalInconsistencyException format: @"type/size information error"]; } } else { uint64_t big; switch (info & _GSC_SIZE) { case _GSC_I16: /* Encoded as 16-bit */ { uint16_t val; (*_dDesImp)(_src, dDesSel, &val, @encode(uint16_t), &_cursor, nil); big = val; break; } case _GSC_I32: /* Encoded as 32-bit */ { uint32_t val; (*_dDesImp)(_src, dDesSel, &val, @encode(uint32_t), &_cursor, nil); big = val; break; } case _GSC_I64: /* Encoded as 64-bit */ { (*_dDesImp)(_src, dDesSel, &big, @encode(uint64_t), &_cursor, nil); break; } default: /* A 128-bit value */ { big = 0; [NSException raise: NSInternalInconsistencyException format: @"Archiving of 128bit integer not allowed"]; } } /* * Now we copy from the big value to the destination location. */ switch (size) { case 1: if (big & ~0xffLL) { NSLog(@"Lost information converting decoded value to uint8_t"); } *(uint8_t*)address = (uint8_t)big; return; case 2: if (big & ~0xffffLL) { NSLog(@"Lost information converting decoded value to uint16_t"); } *(uint16_t*)address = (uint16_t)big; return; case 4: if (big & ~0xffffffffLL) { NSLog(@"Lost information converting decoded value to uint32_t"); } *(uint32_t*)address = (uint32_t)big; return; case 8: *(uint64_t*)address = big; return; default: [NSException raise: NSInternalInconsistencyException format: @"type/size information error"]; } } } } - (void) dispatch { /* * Get ready for re-use * Make sure that we don't retain the connection - or it might never be * released if it is keeping this coder in a cache. */ DESTROY(_conn); } - (void) encodeArrayOfObjCType: (const char*)type count: (NSUInteger)count at: (const void*)buf { NSUInteger i; uint32_t c = count; uint8_t bytes[20]; uint8_t *bytePtr = 0; uint8_t byteCount = 0; NSUInteger offset = 0; uint32_t size = objc_sizeof_type(type); uint32_t version = [self systemVersion]; uchar info; if (12402 == version) { NSUInteger tmp = count; bytes[sizeof(bytes) - ++byteCount] = (uint8_t)(tmp % 128); tmp /= 128; while (tmp > 0) { bytes[sizeof(bytes) - ++byteCount] = (uint8_t)(128 | (tmp % 128)); tmp /= 128; } bytePtr = &bytes[sizeof(bytes) - byteCount]; } else { /* We normally store the count as a 32bit integer ... but if it's * very big, we store 0xffffffff and then an additional 64bit value * containing the actual count. */ if (count >= 0xffffffff) { c = 0xffffffff; } else { c = count; } } switch (*type) { case _C_ID: info = _GSC_NONE; break; case _C_CHR: info = _GSC_CHR; break; case _C_UCHR: info = _GSC_UCHR; break; case _C_SHT: info = _GSC_SHT | _GSC_S_SHT; break; case _C_USHT: info = _GSC_USHT | _GSC_S_SHT; break; case _C_INT: info = _GSC_INT | _GSC_S_INT; break; case _C_UINT: info = _GSC_UINT | _GSC_S_INT; break; case _C_LNG: info = _GSC_LNG | _GSC_S_LNG; break; case _C_ULNG: info = _GSC_ULNG | _GSC_S_LNG; break; case _C_LNG_LNG: info = _GSC_LNG_LNG | _GSC_S_LNG_LNG; break; case _C_ULNG_LNG: info = _GSC_ULNG_LNG | _GSC_S_LNG_LNG; break; case _C_FLT: info = _GSC_FLT; break; case _C_DBL: info = _GSC_DBL; break; #if defined(_C_BOOL) && (!defined(__GNUC__) || __GNUC__ > 2) case _C_BOOL: info = _GSC_BOOL; break; #endif default: info = _GSC_NONE; break; } /* * Simple types can be serialized immediately, more complex ones * are dealt with by our [encodeValueOfObjCType:at:] method. */ if (info == _GSC_NONE) { if (_initialPass == NO) { (*_eTagImp)(_dst, eTagSel, _GSC_ARY_B); if (12402 == version) { for (i = 0; i < byteCount; i++) { (*_eSerImp) (_dst, eSerSel, bytePtr + i, @encode(uint8_t), nil); } } else { (*_eSerImp)(_dst, eSerSel, &c, @encode(uint32_t), nil); if (0xffffffff == c) { (*_eSerImp)(_dst, eSerSel, &count, @encode(NSUInteger), nil); } } } for (i = 0; i < count; i++) { (*_eValImp)(self, eValSel, type, (char*)buf + offset); offset += size; } } else if (_initialPass == NO) { (*_eTagImp)(_dst, eTagSel, _GSC_ARY_B); if (12402 == version) { for (i = 0; i < byteCount; i++) { (*_eSerImp)(_dst, eSerSel, bytePtr + i, @encode(uint8_t), nil); } } else { (*_eSerImp)(_dst, eSerSel, &c, @encode(unsigned), nil); if (0xffffffff == c) { (*_eSerImp)(_dst, eSerSel, &count, @encode(NSUInteger), nil); } } (*_eTagImp)(_dst, eTagSel, info); for (i = 0; i < count; i++) { (*_eSerImp)(_dst, eSerSel, (char*)buf + offset, type, nil); offset += size; } } } - (void) encodeBycopyObject: (id)anObj { BOOL oldBycopy = _is_by_copy; BOOL oldByref = _is_by_ref; _is_by_copy = YES; _is_by_ref = NO; (*_eObjImp)(self, eObjSel, anObj); _is_by_copy = oldBycopy; _is_by_ref = oldByref; } - (void) encodeByrefObject: (id)anObj { BOOL oldBycopy = _is_by_copy; BOOL oldByref = _is_by_ref; _is_by_copy = NO; _is_by_ref = YES; (*_eObjImp)(self, eObjSel, anObj); _is_by_copy = oldBycopy; _is_by_ref = oldByref; } - (void) encodeConditionalObject: (id)anObject { if (_encodingRoot == NO) { [NSException raise: NSInvalidArgumentException format: @"conditionally encoding without root object"]; return; } if (_initialPass) { GSIMapNode node; /* * Conditionally encoding 'nil' is a no-op. */ if (anObject == nil) { return; } /* * If we have already conditionally encoded this object, we can * ignore it this time. */ node = GSIMapNodeForKey(_cIdMap, (GSIMapKey)anObject); if (node != 0) { return; } /* * If we have unconditionally encoded this object, we can ignore * it now. */ node = GSIMapNodeForKey(_uIdMap, (GSIMapKey)anObject); if (node != 0) { return; } GSIMapAddPair(_cIdMap, (GSIMapKey)anObject, (GSIMapVal)(NSUInteger)0); } else if (anObject == nil) { (*_eObjImp)(self, eObjSel, nil); } else { GSIMapNode node; node = GSIMapNodeForKey(_cIdMap, (GSIMapKey)anObject); if (node != 0) { (*_eObjImp)(self, eObjSel, nil); } else { (*_eObjImp)(self, eObjSel, anObject); } } } /* * When asked to encode a data object, we add the object to the components * array, and simply record the array index, so the corresponding decode * method can tell which component to use. */ - (void) encodeDataObject: (NSData*)anObject { int pos; if (anObject == nil) { pos = -1; } else if ([anObject length] == 0) { pos = -2; } else { pos = (int)[_comp count]; [_comp addObject: anObject]; } [self encodeValueOfObjCType: @encode(int) at: &pos]; } - (void) encodeObject: (id)anObject { if (anObject == nil) { if (_initialPass == NO) { /* * Special case - encode a nil pointer as a crossref of zero. */ (*_eTagImp)(_dst, eTagSel, _GSC_ID | _GSC_XREF, _GSC_X_0); } } else { GSIMapNode node; /* * See if the object has already been encoded. */ node = GSIMapNodeForKey(_uIdMap, (GSIMapKey)anObject); if (_initialPass) { if (node == 0) { /* * Remove object from map of conditionally encoded objects * and add it to the map of unconditionay encoded ones. */ GSIMapRemoveKey(_cIdMap, (GSIMapKey)anObject); GSIMapAddPair(_uIdMap, (GSIMapKey)anObject, (GSIMapVal)(NSUInteger)0); [anObject encodeWithCoder: self]; } return; } if (node == 0 || node->value.nsu == 0) { Class cls; id obj; if (node == 0) { node = GSIMapAddPair(_uIdMap, (GSIMapKey)anObject, (GSIMapVal)(NSUInteger)++_xRefO); } else { node->value.nsu = ++_xRefO; } obj = [anObject replacementObjectForPortCoder: self]; if (GSObjCIsInstance(obj) == NO) { /* * If the object we have been given is actually a class, * we encode it as a special case. */ (*_xRefImp)(_dst, xRefSel, _GSC_CID, node->value.nsu); (*_eValImp)(self, eValSel, @encode(Class), &obj); } else { cls = [obj classForPortCoder]; (*_xRefImp)(_dst, xRefSel, _GSC_ID, node->value.nsu); (*_eValImp)(self, eValSel, @encode(Class), &cls); [obj encodeWithCoder: self]; } } else { (*_xRefImp)(_dst, xRefSel, _GSC_ID | _GSC_XREF, node->value.nsu); } } } /* * When asked to encode a port object, we add the object to the components * array, and simply record the array index, so the corresponding decode * method can tell which component to use. */ - (void) encodePortObject: (NSPort*)aPort { unsigned pos = [_comp count]; [_comp addObject: aPort]; [self encodeValueOfObjCType: @encode(unsigned) at: &pos]; } - (void) encodeRootObject: (id)rootObject { if (_encodingRoot) { [NSException raise: NSInvalidArgumentException format: @"encoding root object more than once"]; } _encodingRoot = YES; /* * First pass - find conditional objects. */ _initialPass = YES; (*_eObjImp)(self, eObjSel, rootObject); /* * Second pass - write archive. */ _initialPass = NO; (*_eObjImp)(self, eObjSel, rootObject); _encodingRoot = NO; } - (void) encodeValueOfObjCType: (const char*)type at: (const void*)buf { switch (*type) { case _C_ID: (*_eObjImp)(self, eObjSel, *(void**)buf); return; case _C_ARY_B: { int count = atoi(++type); while (isdigit(*type)) { type++; } if (_initialPass == NO) { (*_eTagImp)(_dst, eTagSel, _GSC_ARY_B); } [self encodeArrayOfObjCType: type count: count at: buf]; } return; case _C_STRUCT_B: { struct objc_struct_layout layout; if (_initialPass == NO) { (*_eTagImp)(_dst, eTagSel, _GSC_STRUCT_B); } objc_layout_structure (type, &layout); while (objc_layout_structure_next_member (&layout)) { unsigned offset; unsigned align; const char *ftype; objc_layout_structure_get_info (&layout, &offset, &align, &ftype); (*_eValImp)(self, eValSel, ftype, (char*)buf + offset); } } return; case _C_PTR: if (*(void**)buf == 0) { if (_initialPass == NO) { /* * Special case - a null pointer gets an xref of zero */ (*_eTagImp)(_dst, eTagSel, _GSC_PTR | _GSC_XREF | _GSC_X_0); } } else { GSIMapNode node; node = GSIMapNodeForKey(_ptrMap, (GSIMapKey)*(void**)buf); if (_initialPass == YES) { /* * First pass - add pointer to map and encode item pointed * to in case it is a conditionally encoded object. */ if (node == 0) { GSIMapAddPair(_ptrMap, (GSIMapKey)*(void**)buf, (GSIMapVal)(NSUInteger)0); type++; buf = *(char**)buf; (*_eValImp)(self, eValSel, type, buf); } } else if (node == 0 || node->value.nsu == 0) { /* * Second pass, unwritten pointer - write it. */ if (node == 0) { node = GSIMapAddPair(_ptrMap, (GSIMapKey)*(void**)buf, (GSIMapVal)(NSUInteger)++_xRefP); } else { node->value.nsu = ++_xRefP; } (*_xRefImp)(_dst, xRefSel, _GSC_PTR, node->value.nsu); type++; buf = *(char**)buf; (*_eValImp)(self, eValSel, type, buf); } else { /* * Second pass, write a cross-reference number. */ (*_xRefImp)(_dst, xRefSel, _GSC_PTR|_GSC_XREF, node->value.nsu); } } return; default: /* Types that can be ignored in first pass. */ if (_initialPass) { return; } break; } switch (*type) { case _C_CLASS: if (*(Class*)buf == 0) { /* * Special case - a null pointer gets an xref of zero */ (*_eTagImp)(_dst, eTagSel, _GSC_CLASS | _GSC_XREF | _GSC_X_0); } else { Class c = *(Class*)buf; GSIMapNode node; BOOL done = NO; node = GSIMapNodeForKey(_clsMap, (GSIMapKey)(void*)c); if (node != 0) { (*_xRefImp)(_dst, xRefSel, _GSC_CLASS | _GSC_XREF, node->value.nsu); return; } while (done == NO) { int tmp = class_getVersion(c); unsigned version = tmp; Class s = class_getSuperclass(c); if (tmp < 0) { [NSException raise: NSInternalInconsistencyException format: @"negative class version"]; } node = GSIMapAddPair(_clsMap, (GSIMapKey)(void*)c, (GSIMapVal)(NSUInteger)++_xRefC); /* * Encode tag and crossref number. */ (*_xRefImp)(_dst, xRefSel, _GSC_CLASS, node->value.nsu); /* * Encode class, and version. */ (*_eSerImp)(_dst, eSerSel, &c, @encode(Class), nil); (*_eSerImp)(_dst, eSerSel, &version, @encode(unsigned), nil); /* * If we have a super class that has not been encoded, * we must loop round to encode it here so that its * version information will be available when objects * of its subclasses are decoded and call * [super initWithCoder:ccc] */ if (s == c || s == 0 || GSIMapNodeForKey(_clsMap, (GSIMapKey)(void*)s) != 0) { done = YES; } else { c = s; } } /* * Encode an empty tag to terminate the list of classes. */ (*_eTagImp)(_dst, eTagSel, _GSC_NONE); } return; case _C_SEL: if (*(SEL*)buf == 0) { /* * Special case - a null pointer gets an xref of zero */ (*_eTagImp)(_dst, eTagSel, _GSC_SEL | _GSC_XREF | _GSC_X_0); } else { SEL s = *(SEL*)buf; GSIMapNode node = GSIMapNodeForKey(_ptrMap, (GSIMapKey)(void*)s); if (node == 0) { node = GSIMapAddPair(_ptrMap, (GSIMapKey)(void*)s, (GSIMapVal)(NSUInteger)++_xRefP); (*_xRefImp)(_dst, xRefSel, _GSC_SEL, node->value.nsu); /* * Encode selector. */ (*_eSerImp)(_dst, eSerSel, buf, @encode(SEL), nil); } else { (*_xRefImp)(_dst, xRefSel, _GSC_SEL|_GSC_XREF, node->value.nsu); } } return; case _C_CHARPTR: if (*(char**)buf == 0) { /* * Special case - a null pointer gets an xref of zero */ (*_eTagImp)(_dst, eTagSel, _GSC_CHARPTR | _GSC_XREF | _GSC_X_0); } else { GSIMapNode node; node = GSIMapNodeForKey(_ptrMap, (GSIMapKey)*(char**)buf); if (node == 0) { node = GSIMapAddPair(_ptrMap, (GSIMapKey)*(char**)buf, (GSIMapVal)(NSUInteger)++_xRefP); (*_xRefImp)(_dst, xRefSel, _GSC_CHARPTR, node->value.nsu); (*_eSerImp)(_dst, eSerSel, buf, type, nil); } else { (*_xRefImp)(_dst, xRefSel, _GSC_CHARPTR|_GSC_XREF, node->value.nsu); } } return; case _C_CHR: (*_eTagImp)(_dst, eTagSel, _GSC_CHR); (*_eSerImp)(_dst, eSerSel, (void*)buf, @encode(signed char), nil); return; case _C_UCHR: (*_eTagImp)(_dst, eTagSel, _GSC_UCHR); (*_eSerImp)(_dst, eSerSel, (void*)buf, @encode(unsigned char), nil); return; case _C_SHT: (*_eTagImp)(_dst, eTagSel, _GSC_SHT | _GSC_S_SHT); (*_eSerImp)(_dst, eSerSel, (void*)buf, @encode(short), nil); return; case _C_USHT: (*_eTagImp)(_dst, eTagSel, _GSC_USHT | _GSC_S_SHT); (*_eSerImp)(_dst, eSerSel, (void*)buf, @encode(unsigned short), nil); return; case _C_INT: (*_eTagImp)(_dst, eTagSel, _GSC_INT | _GSC_S_INT); (*_eSerImp)(_dst, eSerSel, (void*)buf, @encode(int), nil); return; case _C_UINT: (*_eTagImp)(_dst, eTagSel, _GSC_UINT | _GSC_S_INT); (*_eSerImp)(_dst, eSerSel, (void*)buf, @encode(unsigned int), nil); return; case _C_LNG: (*_eTagImp)(_dst, eTagSel, _GSC_LNG | _GSC_S_LNG); (*_eSerImp)(_dst, eSerSel, (void*)buf, @encode(long), nil); return; case _C_ULNG: (*_eTagImp)(_dst, eTagSel, _GSC_ULNG | _GSC_S_LNG); (*_eSerImp)(_dst, eSerSel, (void*)buf, @encode(unsigned long), nil); return; case _C_LNG_LNG: (*_eTagImp)(_dst, eTagSel, _GSC_LNG_LNG | _GSC_S_LNG_LNG); (*_eSerImp)(_dst, eSerSel, (void*)buf, @encode(long long), nil); return; case _C_ULNG_LNG: (*_eTagImp)(_dst, eTagSel, _GSC_ULNG_LNG | _GSC_S_LNG_LNG); (*_eSerImp)(_dst, eSerSel, (void*)buf, @encode(unsigned long long), nil); return; case _C_FLT: (*_eTagImp)(_dst, eTagSel, _GSC_FLT); (*_eSerImp)(_dst, eSerSel, (void*)buf, @encode(float), nil); return; case _C_DBL: (*_eTagImp)(_dst, eTagSel, _GSC_DBL); (*_eSerImp)(_dst, eSerSel, (void*)buf, @encode(double), nil); return; #if defined(_C_BOOL) && (!defined(__GNUC__) || __GNUC__ > 2) case _C_BOOL: (*_eTagImp)(_dst, eTagSel, _GSC_BOOL); (*_eSerImp)(_dst, eSerSel, (void*)buf, @encode(_Bool), nil); return; #endif case _C_VOID: [NSException raise: NSInvalidArgumentException format: @"can't encode void item"]; default: [NSException raise: NSInvalidArgumentException format: @"item with unknown type - %s", type]; } } - (id) initWithReceivePort: (NSPort*)recv sendPort: (NSPort*)send components: (NSArray*)comp { BOOL firstTime; _conn = RETAIN([connectionClass connectionWithReceivePort: recv sendPort: send]); if (_comp == nil) { firstTime = YES; _version = [super systemVersion]; _zone = NSDefaultMallocZone(); } else { NSAssert(recv == [_conn receivePort] && send == [_conn sendPort], NSInvalidArgumentException); /* * Re-initialising - destroy old components. */ firstTime = NO; } if (comp == nil) { NS_DURING { _encodingRoot = NO; _initialPass = NO; _xRefC = 0; _xRefO = 0; _xRefP = 0; _cursor = [send reservedSpaceLength]; if (firstTime == YES) { /* * Set up mutable data object to encode into - reserve space at * the start for use by the port when the encoded data is sent. * Make the data item the first component of the array. */ _comp = [mutableArrayClass new]; _dst = [mutableDataClass allocWithZone: _zone]; _dst = [_dst initWithLength: _cursor]; [_comp addObject: _dst]; /* * Cache method implementations for writing into data object etc */ _eObjImp = [self methodForSelector: eObjSel]; _eValImp = [self methodForSelector: eValSel]; /* * Set up map tables. */ _clsMap = (GSIMapTable)NSZoneMalloc(_zone, sizeof(GSIMapTable_t)*4); _cIdMap = &_clsMap[1]; _uIdMap = &_clsMap[2]; _ptrMap = &_clsMap[3]; GSIMapInitWithZoneAndCapacity(_clsMap, _zone, 100); GSIMapInitWithZoneAndCapacity(_cIdMap, _zone, 10); GSIMapInitWithZoneAndCapacity(_uIdMap, _zone, 200); GSIMapInitWithZoneAndCapacity(_ptrMap, _zone, 100); } else { /* * If re-initialising, we need to empty the old stuff. * NB. Our _dst object may have been removed from the _comp * array elsewhere, so we empty the _comp array and then re-add * _dst */ [_comp removeAllObjects]; [_comp addObject: _dst]; [_dst setLength: _cursor]; GSIMapCleanMap(_clsMap); GSIMapCleanMap(_cIdMap); GSIMapCleanMap(_uIdMap); GSIMapCleanMap(_ptrMap); } /* * Write dummy header */ [self _serializeHeaderAt: _cursor version: [self systemVersion] classes: 0 objects: 0 pointers: 0]; } NS_HANDLER { NSLog(@"Exception setting up port coder for encoding - %@", localException); DESTROY(self); } NS_ENDHANDLER } else { RELEASE(_comp); _comp = [comp mutableCopy]; NS_DURING { unsigned sizeC; unsigned sizeO; unsigned sizeP; if (firstTime == YES) { _dValImp = [self methodForSelector: dValSel]; } _src = [_comp objectAtIndex: 0]; _dDesImp = [_src methodForSelector: dDesSel]; _dTagImp = (void (*)(id, SEL, unsigned char*, unsigned*, unsigned*)) [_src methodForSelector: dTagSel]; /* * _cInfo is a dictionary of objects for keeping track of the * version numbers that the classes were encoded with. */ if (firstTime == NO) { [_cInfo removeAllObjects]; } /* * Read header including version and crossref table sizes. */ _cursor = 0; [self _deserializeHeaderAt: &_cursor version: &_version classes: &sizeC objects: &sizeO pointers: &sizeP]; if (_version > encodingVersion) { [NSException raise: NSInvalidArgumentException format: @"Message systemVersion (%u) not recognised", _version]; } /* * Allocate and initialise arrays to build crossref maps in. */ if (firstTime == YES) { _clsAry = NSZoneMalloc(_zone, sizeof(GSIArray_t)*3); _objAry = &_clsAry[1]; _ptrAry = &_clsAry[2]; GSIArrayInitWithZoneAndCapacity(_clsAry, _zone, sizeC); GSIArrayInitWithZoneAndCapacity(_objAry, _zone, sizeO); GSIArrayInitWithZoneAndCapacity(_ptrAry, _zone, sizeP); } else { unsigned count = GSIArrayCount(_clsAry); while (count-- > 0) { RELEASE(GSIArrayItemAtIndex(_clsAry, count).obj); } GSIArrayRemoveAllItems(_clsAry); GSIArrayRemoveAllItems(_objAry); GSIArrayRemoveAllItems(_ptrAry); } GSIArrayAddItem(_clsAry, (GSIArrayItem)(void*)0); GSIArrayAddItem(_objAry, (GSIArrayItem)(void*)0); GSIArrayAddItem(_ptrAry, (GSIArrayItem)(void*)0); } NS_HANDLER { NSLog(@"Exception setting up port coder for decoding - %@", localException); DESTROY(self); } NS_ENDHANDLER } return self; } - (BOOL) isBycopy { return _is_by_copy; } - (BOOL) isByref { return _is_by_ref; } - (NSZone*) objectZone { return _zone; } - (void) setObjectZone: (NSZone*)aZone { _zone = aZone; } - (unsigned) systemVersion { return _version; } - (NSInteger) versionForClassName: (NSString*)className { GSClassInfo *info = nil; NSInteger version = NSNotFound; unsigned count = GSIArrayCount(_clsAry); /* * Lazy ... we construct a dictionary of all the class information in * the request the first time that class version info is asked for. */ if (_cInfo == nil) { _cInfo = [[mutableDictionaryClass alloc] initWithCapacity: count]; } if ([_cInfo count] == 0) { // Zero'th item is nul while (count-- > 1) { info = GSIArrayItemAtIndex(_clsAry, count).obj; if (0 != info->class) { [_cInfo setObject: info forKey: NSStringFromClass(info->class)]; } } } info = [_cInfo objectForKey: className]; if (info != nil) { version = info->version; } return version; } @end @implementation NSPortCoder (Private) - (NSMutableArray*) _components { if (nil != _dst) { /* * Write sizes of crossref arrays to head of archive. */ [self _serializeHeaderAt: _cursor version: [self systemVersion] classes: _clsMap->nodeCount objects: _uIdMap->nodeCount pointers: _ptrMap->nodeCount]; } return _comp; } @end @implementation NSPortCoder (Headers) - (void) _deserializeHeaderAt: (unsigned*)pos version: (unsigned*)v classes: (unsigned*)c objects: (unsigned*)o pointers: (unsigned*)p { unsigned plen = strlen(PREFIX); unsigned size = plen+36; char header[size+1]; [_src getBytes: header range: NSMakeRange(*pos, size)]; *pos += size; header[size] = '\0'; if (strncmp(header, PREFIX, plen) != 0) { [NSException raise: NSInternalInconsistencyException format: @"Archive has wrong prefix"]; } if (sscanf(&header[plen], "%x:%x:%x:%x:", v, c, o, p) != 4) { [NSException raise: NSInternalInconsistencyException format: @"Archive has wrong prefix"]; } } - (void) _serializeHeaderAt: (unsigned)locationInData version: (unsigned)v classes: (unsigned)cc objects: (unsigned)oc pointers: (unsigned)pc { unsigned headerLength = strlen(PREFIX)+36; char header[headerLength+1]; unsigned dataLength = [_dst length]; snprintf(header, sizeof(header), "%s%08x:%08x:%08x:%08x:", PREFIX, v, cc, oc, pc); if (locationInData + headerLength <= dataLength) { [_dst replaceBytesInRange: NSMakeRange(locationInData, headerLength) withBytes: header]; } else if (locationInData == dataLength) { [_dst appendBytes: header length: headerLength]; } else { [NSException raise: NSInternalInconsistencyException format: @"serializeHeader:at: bad location"]; } } @end @implementation NSObject (NSPortCoder) /** * Override to substitute class when an instance is being serialized by an * [NSPortCoder]. Default implementation returns -classForCoder . */ - (Class) classForPortCoder { return [self classForCoder]; } /** * Returns the actual object to be encoded for sending over the * network on a Distributed Objects connection.
* The default implementation returns self if the receiver is being * sent bycopy and returns a proxy otherwise.
* Subclasses may override this method to change this behavior, * eg. to ensure that they are always copied. */ - (id) replacementObjectForPortCoder: (NSPortCoder*)aCoder { static Class proxyClass = 0; static IMP proxyImp = 0; if (proxyImp == 0) { proxyClass = [NSDistantObject class]; /* * Use class_getMethodImplementation() because NSDistantObject * doesn't implement methodForSelector: */ proxyImp = class_getMethodImplementation(object_getClass((id)proxyClass), @selector(proxyWithLocal:connection:)); } if ([aCoder isBycopy]) { return self; } else { return (*proxyImp)(proxyClass, @selector(proxyWithLocal:connection:), self, [aCoder connection]); } } @end gnustep-base-1.29.0/Source/NSPortMessage.m000066400000000000000000000054151435650067400203270ustar00rootroot00000000000000/** Implementation of NSPortMessage for GNUstep Copyright (C) 1998,2000 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: October 1998 This file is part of the GNUstep Base Library. 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 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 USA. NSPortMessage class reference $Date$ $Revision$ */ #import "common.h" #define EXPOSE_NSPortMessage_IVARS 1 #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSData.h" #import "Foundation/NSException.h" #import "Foundation/NSPortMessage.h" @implementation NSPortMessage - (void) dealloc { RELEASE(_recv); RELEASE(_send); RELEASE(_components); [super dealloc]; } - (NSString*) description { return [NSString stringWithFormat: @"NSPortMessage 0x%"PRIxPTR @" (Id %u)\n Send: %@\n Recv: %@\n Components -\n%@", (NSUInteger)self, _msgid, _send, _recv, _components]; } /* PortMessages MUST be initialised with ports and data. */ - (id) init { [self shouldNotImplement: _cmd]; return nil; } /* PortMessages MUST be initialised with ports and data. */ - (id) initWithMachMessage: (void*)buffer { [self shouldNotImplement: _cmd]; return nil; } /* This is the designated initialiser. */ - (id) initWithSendPort: (NSPort*)aPort receivePort: (NSPort*)anotherPort components: (NSArray*)items { self = [super init]; if (self != nil) { _msgid = 0; _send = RETAIN(aPort); _recv = RETAIN(anotherPort); _components = [[NSMutableArray allocWithZone: [self zone]] initWithArray: items]; } return self; } - (NSArray*) components { return AUTORELEASE([_components copy]); } - (unsigned) msgid { return _msgid; } - (NSPort*) receivePort { return _recv; } - (BOOL) sendBeforeDate: (NSDate*)when { return [_send sendBeforeDate: when msgid: _msgid components: _components from: _recv reserved: 0]; } - (NSPort*) sendPort { return _send; } - (void) setMsgid: (unsigned)anId { _msgid = anId; } @end @implementation NSPortMessage (Private) - (NSMutableArray*) _components { return _components; } @end gnustep-base-1.29.0/Source/NSPortNameServer.m000066400000000000000000000140461435650067400210120ustar00rootroot00000000000000/** Implementation of NSPortNameServer class for Distributed Objects Copyright (C) 1998,1999,2000 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: October 1998 This file is part of the GNUstep Base Library. 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 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 USA. NSPortNameServer class reference $Date$ $Revision$ */ #import "common.h" #import "Foundation/NSException.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSPort.h" #import "Foundation/NSPortNameServer.h" #import "Foundation/NSLock.h" #import "Foundation/NSUserDefaults.h" #import "GSPortPrivate.h" /** * The abstract port name server class. This defines an API for * working with port name servers ... objects used to manage access * to ports in the distributed objects system (see [NSConnection]). */ @implementation NSPortNameServer + (id) allocWithZone: (NSZone*)aZone { [NSException raise: NSGenericException format: @"attempt to create extra port name server"]; return nil; } + (void) initialize { if (self == [NSPortNameServer class]) { } } /** *

Returns the default port name server for the process.
* This is a nameserver for host-local connections private to the current * user. If you with to create public connections or connections to other * hosts, you must use [NSSocketPortNameServer+sharedInstance] instead. *

* This default behavior may be altered by setting the * NSPortIsMessagePort user default to NO, in which case * an [NSSocketPortNameServer] will be used as the default system name server * and you will have to use [NSMessagePortNameServer+sharedInstance] * for host-local, private connections. */ + (id) systemDefaultPortNameServer { static id nameServer = nil; if (nameServer == nil) { [gnustep_global_lock lock]; if (nameServer == nil) { NSUserDefaults *defs = [NSUserDefaults standardUserDefaults]; id o; if ([defs objectForKey: @"NSPortIsMessagePort"] != nil && [defs boolForKey: @"NSPortIsMessagePort"] == NO) { o = [NSSocketPortNameServer sharedInstance]; } else { o = [NSMessagePortNameServer sharedInstance]; } nameServer = RETAIN(o); } [gnustep_global_lock unlock]; } return nameServer; } - (void) dealloc { [NSException raise: NSGenericException format: @"attempt to deallocate default port name server"]; GSNOSUPERDEALLOC; } /** * Looks up the port with the specified name on the local host and * returns it or nil if no port is found with that name.
* Different nameservers have different namespaces appropriate to the * type of port they deal with, so failing to find a named port with one * nameserver does not guarantee that a port does with that name does * not exist.
* This is a convenience method calling -portForName:onHost: with a nil * host argument. */ - (NSPort*) portForName: (NSString*)name { return [self portForName: name onHost: nil]; } /** * Looks up the port with the specified name on host and returns it * or nil if no port is found with that name.
* Different nameservers have different namespaces appropriate to the * type of port they deal with, so failing to find a named port with one * nameserver does not guarantee that a port does with that name does * not exist. */ - (NSPort*) portForName: (NSString*)name onHost: (NSString*)host { [self subclassResponsibility: _cmd]; return nil; } /** * Registers port with the supplied name, so that other processes can * look it up to contact it. A port may be registered with more than * one name by making multiple calls to this method.
* Returns YES on success, NO otherwise.
* The common cause for failure is that another port is already registered * with the name. * Raises NSInvalidArgumentException if given bad arguments. */ - (BOOL) registerPort: (NSPort*)port forName: (NSString*)name { [self subclassResponsibility: _cmd]; return NO; } /** * Removes any port registration for the supplied name (whether * registered in the current process or another).
* The common cause for failure is that no port is registered * with the name.
* Raises NSInvalidArgumentException if given bad arguments. */ - (BOOL) removePortForName: (NSString*)name { [self subclassResponsibility: _cmd]; return NO; } @end /** * Some extensions to make cleaning up port names easier. */ @implementation NSPortNameServer (GNUstep) /** * Return all names that have been registered with the receiver for port. */ - (NSArray*) namesForPort: (NSPort*)port { [self subclassResponsibility: _cmd]; return nil; } /** * Remove all names registered with the receiver for port. * Probably inefficient ... subclasses might want to override this. */ - (BOOL) removePort: (NSPort*)port { NSEnumerator *e = [[self namesForPort: port] objectEnumerator]; NSString *n; BOOL removed = NO; while ((n = [e nextObject]) != nil) { if ([self removePort: port forName: n] == YES) { removed = YES; } } return removed; } /** * Remove the name if and only if it is registered with the receiver * for the given port. */ - (BOOL) removePort: (NSPort*)port forName: (NSString*)name { [self subclassResponsibility: _cmd]; return NO; } @end gnustep-base-1.29.0/Source/NSPredicate.m000066400000000000000000002162241435650067400200000ustar00rootroot00000000000000/* Interface for NSPredicate for GNUStep Copyright (C) 2005 Free Software Foundation, Inc. Written by: Dr. H. Nikolaus Schaller Created: 2005 Modifications: Fred Kiefer Date: May 2007 Modifications: Richard Frith-Macdoanld Date: June 2007 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #define EXPOSE_NSComparisonPredicate_IVARS 1 #define EXPOSE_NSCompoundPredicate_IVARS 1 #define EXPOSE_NSExpression_IVARS 1 #import "Foundation/NSComparisonPredicate.h" #import "Foundation/NSCompoundPredicate.h" #import "Foundation/NSExpression.h" #import "Foundation/NSPredicate.h" #import "Foundation/NSArray.h" #import "Foundation/NSDate.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSException.h" #import "Foundation/NSKeyValueCoding.h" #import "Foundation/NSNull.h" #import "Foundation/NSScanner.h" #import "Foundation/NSValue.h" #import "GSPrivate.h" // For pow() #include #if defined(HAVE_UNICODE_UREGEX_H) #include #elif defined(HAVE_ICU_H) #include #endif /* Object to represent the expression beign evaluated. */ static NSExpression *evaluatedObjectExpression = nil; extern void GSPropertyListMake(id,NSDictionary*,BOOL,BOOL,unsigned,id*); @interface GSPredicateScanner : NSScanner { NSEnumerator *_args; // Not retained. unsigned _retrieved; } - (id) initWithString: (NSString*)format args: (NSArray*)args; - (id) nextArg; - (BOOL) scanPredicateKeyword: (NSString *) key; - (NSPredicate *) parse; - (NSPredicate *) parsePredicate; - (NSPredicate *) parseAnd; - (NSPredicate *) parseNot; - (NSPredicate *) parseOr; - (NSPredicate *) parseComparison; - (NSExpression *) parseExpression; - (NSExpression *) parseFunctionalExpression; - (NSExpression *) parsePowerExpression; - (NSExpression *) parseMultiplicationExpression; - (NSExpression *) parseAdditionExpression; - (NSExpression *) parseBinaryExpression; - (NSExpression *) parseSimpleExpression; @end @interface GSTruePredicate : NSPredicate @end @interface GSFalsePredicate : NSPredicate @end @interface GSAndCompoundPredicate : NSCompoundPredicate @end @interface GSOrCompoundPredicate : NSCompoundPredicate @end @interface GSNotCompoundPredicate : NSCompoundPredicate @end @interface NSExpression (Private) - (id) _expressionWithSubstitutionVariables: (NSDictionary *)variables; @end @interface GSConstantValueExpression : NSExpression { @public id _obj; } @end @interface GSEvaluatedObjectExpression : NSExpression @end @interface GSVariableExpression : NSExpression { @public NSString *_variable; } @end @interface GSKeyPathExpression : NSExpression { @public NSString *_keyPath; } @end @interface GSKeyPathCompositionExpression : NSExpression { @public NSExpression *_left; NSExpression *_right; } @end @interface GSFunctionExpression : NSExpression { @public NSString *_function; NSArray *_args; unsigned int _argc; SEL _selector; NSString *_op; // Not retained; } @end #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) @interface GSBlockPredicate : NSPredicate { GSBlockPredicateBlock _block; } - (instancetype) initWithBlock: (GSBlockPredicateBlock)block; @end @interface GSBoundBlockPredicate : GSBlockPredicate { GS_GENERIC_CLASS(NSDictionary,NSString*,id)* _bindings; } - (instancetype) initWithBlock: (GSBlockPredicateBlock)block bindings: (GS_GENERIC_CLASS(NSDictionary,NSString*,id)*)bindings; @end #endif @implementation NSPredicate + (NSPredicate *) predicateWithFormat: (NSString *) format, ... { NSPredicate *p; va_list va; va_start(va, format); p = [self predicateWithFormat: format arguments: va]; va_end(va); return p; } + (NSPredicate *) predicateWithFormat: (NSString *)format argumentArray: (NSArray *)args { GSPredicateScanner *s; NSPredicate *p; s = [[GSPredicateScanner alloc] initWithString: format args: args]; p = [s parse]; RELEASE(s); return p; } + (NSPredicate *) predicateWithFormat: (NSString *)format arguments: (va_list)args { GSPredicateScanner *s; NSPredicate *p; const char *ptr = [format UTF8String]; NSMutableArray *arr = [NSMutableArray arrayWithCapacity: 10]; while (*ptr != 0) { char c = *ptr++; if (c == '%') { c = *ptr; switch (c) { case '%': ptr++; break; case 'K': case '@': ptr++; [arr addObject: va_arg(args, id)]; break; case 'c': ptr++; [arr addObject: [NSNumber numberWithChar: (char)va_arg(args, NSInteger)]]; break; case 'C': ptr++; [arr addObject: [NSNumber numberWithShort: (short)va_arg(args, NSInteger)]]; break; case 'd': case 'D': case 'i': ptr++; [arr addObject: [NSNumber numberWithInt: va_arg(args, int)]]; break; case 'o': case 'O': case 'u': case 'U': case 'x': case 'X': ptr++; [arr addObject: [NSNumber numberWithUnsignedInt: va_arg(args, unsigned)]]; break; case 'e': case 'E': case 'f': case 'g': case 'G': ptr++; [arr addObject: [NSNumber numberWithDouble: va_arg(args, double)]]; break; case 'h': ptr++; if (*ptr != 0) { c = *ptr; if (c == 'i') { [arr addObject: [NSNumber numberWithShort: (short)va_arg(args, NSInteger)]]; } if (c == 'u') { [arr addObject: [NSNumber numberWithUnsignedShort: (unsigned short)va_arg(args, NSInteger)]]; } } break; case 'q': ptr++; if (*ptr != 0) { c = *ptr; if (c == 'i') { [arr addObject: [NSNumber numberWithLongLong: va_arg(args, long long)]]; } if (c == 'u' || c == 'x' || c == 'X') { [arr addObject: [NSNumber numberWithUnsignedLongLong: va_arg(args, unsigned long long)]]; } } break; } } else if (c == '\'') { while (*ptr != 0) { if (*ptr++ == '\'') { break; } } } else if (c == '"') { while (*ptr != 0) { if (*ptr++ == '"') { break; } } } } s = [[GSPredicateScanner alloc] initWithString: format args: arr]; p = [s parse]; RELEASE(s); return p; } + (NSPredicate *) predicateWithValue: (BOOL)value { if (value) { return AUTORELEASE([GSTruePredicate new]); } else { return AUTORELEASE([GSFalsePredicate new]); } } // we don't ever instantiate NSPredicate - (id) copyWithZone: (NSZone *)z { return NSCopyObject(self, 0, z); } - (BOOL) evaluateWithObject: (id)object { [self subclassResponsibility: _cmd]; return NO; } - (NSString *) description { return [self predicateFormat]; } - (NSString *) predicateFormat { [self subclassResponsibility: _cmd]; return nil; } - (NSPredicate *) predicateWithSubstitutionVariables: (NSDictionary *)variables { return AUTORELEASE([self copy]); } #if OS_API_VERSION(MAC_OS_X_VERSION_10_5, GS_API_LATEST) - (BOOL) evaluateWithObject: (id)object substitutionVariables: (GS_GENERIC_CLASS(NSDictionary, NSString*, id)*)variables { return [[self predicateWithSubstitutionVariables: variables] evaluateWithObject: object]; } #endif - (Class) classForCoder { return [NSPredicate class]; } - (void) encodeWithCoder: (NSCoder *) coder; { // FIXME [self subclassResponsibility: _cmd]; } - (id) initWithCoder: (NSCoder *) coder; { // FIXME [self subclassResponsibility: _cmd]; return self; } #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) + (NSPredicate*)predicateWithBlock: (GSBlockPredicateBlock)block { return [[[GSBlockPredicate alloc] initWithBlock: block] autorelease]; } #endif @end @implementation GSTruePredicate - (id) copyWithZone: (NSZone *)z { return RETAIN(self); } - (BOOL) evaluateWithObject: (id)object { return YES; } - (NSString *) predicateFormat { return @"TRUEPREDICATE"; } @end @implementation GSFalsePredicate - (id) copyWithZone: (NSZone *)z { return RETAIN(self); } - (BOOL) evaluateWithObject: (id)object { return NO; } - (NSString *) predicateFormat { return @"FALSEPREDICATE"; } @end @implementation NSCompoundPredicate + (NSPredicate *) andPredicateWithSubpredicates: (NSArray *)list { return AUTORELEASE([[GSAndCompoundPredicate alloc] initWithType: NSAndPredicateType subpredicates: list]); } + (NSPredicate *) notPredicateWithSubpredicate: (NSPredicate *)predicate { NSArray *list; list = [NSArray arrayWithObject: predicate]; return AUTORELEASE([[GSNotCompoundPredicate alloc] initWithType: NSNotPredicateType subpredicates: list]); } + (NSPredicate *) orPredicateWithSubpredicates: (NSArray *)list { return AUTORELEASE([[GSOrCompoundPredicate alloc] initWithType: NSOrPredicateType subpredicates: list]); } - (NSCompoundPredicateType) compoundPredicateType { return _type; } - (id) initWithType: (NSCompoundPredicateType)type subpredicates: (NSArray *)list { if ((self = [super init]) != nil) { _type = type; ASSIGNCOPY(_subs, list); } return self; } - (void) dealloc { RELEASE(_subs); [super dealloc]; } - (id) copyWithZone: (NSZone *)z { return [[[self class] alloc] initWithType: _type subpredicates: _subs]; } - (NSArray *) subpredicates { return _subs; } - (NSPredicate *) predicateWithSubstitutionVariables: (NSDictionary *)variables { unsigned int count = [_subs count]; NSMutableArray *esubs = [NSMutableArray arrayWithCapacity: count]; unsigned int i; NSPredicate *p; for (i = 0; i < count; i++) { [esubs addObject: [[_subs objectAtIndex: i] predicateWithSubstitutionVariables: variables]]; } p = [[[self class] alloc] initWithType: _type subpredicates: esubs]; return AUTORELEASE(p); } - (Class) classForCoder { return [NSCompoundPredicate class]; } - (void) encodeWithCoder: (NSCoder *)coder { // FIXME [self subclassResponsibility: _cmd]; } - (id) initWithCoder: (NSCoder *)coder { // FIXME [self subclassResponsibility: _cmd]; return self; } @end @implementation GSAndCompoundPredicate - (BOOL) evaluateWithObject: (id) object { NSEnumerator *e = [_subs objectEnumerator]; NSPredicate *p; while ((p = [e nextObject]) != nil) { if ([p evaluateWithObject: object] == NO) { return NO; // any NO returns NO } } return YES; // all are true } - (NSString *) predicateFormat { NSString *fmt = @""; NSEnumerator *e = [_subs objectEnumerator]; NSPredicate *sub; unsigned cnt = 0; while ((sub = [e nextObject]) != nil) { // when to add ()? -> if sub is compound and of type "or" if (cnt == 0) { fmt = [sub predicateFormat]; // first } else { if (cnt == 1 && [[_subs objectAtIndex: 0] isKindOfClass: [NSCompoundPredicate class]] && [(NSCompoundPredicate *)[_subs objectAtIndex: 0] compoundPredicateType] == NSOrPredicateType) { // we need () around first OR on left side fmt = [NSString stringWithFormat: @"(%@)", fmt]; } if ([sub isKindOfClass: [NSCompoundPredicate class]] && [(NSCompoundPredicate *) sub compoundPredicateType] == NSOrPredicateType) { // we need () around right OR fmt = [NSString stringWithFormat: @"%@ AND (%@)", fmt, [sub predicateFormat]]; } else { fmt = [NSString stringWithFormat: @"%@ AND %@", fmt, [sub predicateFormat]]; } } cnt++; } return fmt; } @end @implementation GSOrCompoundPredicate - (BOOL) evaluateWithObject: (id)object { NSEnumerator *e = [_subs objectEnumerator]; NSPredicate *p; while ((p = [e nextObject]) != nil) { if ([p evaluateWithObject: object] == YES) { return YES; // any YES returns YES } } return NO; // none is true } - (NSString *) predicateFormat { NSString *fmt = @""; NSEnumerator *e = [_subs objectEnumerator]; NSPredicate *sub; while ((sub = [e nextObject]) != nil) { if ([fmt length] > 0) { fmt = [NSString stringWithFormat: @"%@ OR %@", fmt, [sub predicateFormat]]; } else { fmt = [sub predicateFormat]; // first } } return fmt; } @end @implementation GSNotCompoundPredicate - (BOOL) evaluateWithObject: (id)object { NSPredicate *sub = [_subs objectAtIndex: 0]; return ![sub evaluateWithObject: object]; } - (NSString *) predicateFormat { NSPredicate *sub = [_subs objectAtIndex: 0]; if ([sub isKindOfClass: [NSCompoundPredicate class]] && [(NSCompoundPredicate *)sub compoundPredicateType] != NSNotPredicateType) { return [NSString stringWithFormat: @"NOT(%@)", [sub predicateFormat]]; } return [NSString stringWithFormat: @"NOT %@", [sub predicateFormat]]; } @end @implementation NSComparisonPredicate + (NSPredicate *) predicateWithLeftExpression: (NSExpression *)left rightExpression: (NSExpression *)right customSelector: (SEL) sel { return AUTORELEASE([[self alloc] initWithLeftExpression: left rightExpression: right customSelector: sel]); } + (NSPredicate *) predicateWithLeftExpression: (NSExpression *)left rightExpression: (NSExpression *)right modifier: (NSComparisonPredicateModifier)modifier type: (NSPredicateOperatorType)type options: (NSUInteger)opts { return AUTORELEASE([[self alloc] initWithLeftExpression: left rightExpression: right modifier: modifier type: type options: opts]); } - (NSPredicate *) initWithLeftExpression: (NSExpression *)left rightExpression: (NSExpression *)right customSelector: (SEL)sel { if ((self = [super init]) != nil) { ASSIGN(_left, left); ASSIGN(_right, right); _selector = sel; _type = NSCustomSelectorPredicateOperatorType; } return self; } - (id) initWithLeftExpression: (NSExpression *)left rightExpression: (NSExpression *)right modifier: (NSComparisonPredicateModifier)modifier type: (NSPredicateOperatorType)type options: (NSUInteger)opts { if ((self = [super init]) != nil) { ASSIGN(_left, left); ASSIGN(_right, right); _modifier = modifier; _type = type; _options = opts; } return self; } - (void) dealloc; { RELEASE(_left); RELEASE(_right); [super dealloc]; } - (NSComparisonPredicateModifier) comparisonPredicateModifier { return _modifier; } - (SEL) customSelector { return _selector; } - (NSExpression *) leftExpression { return _left; } - (NSUInteger) options { return _options; } - (NSPredicateOperatorType) predicateOperatorType { return _type; } - (NSExpression *) rightExpression { return _right; } - (NSString *) predicateFormat { NSString *modi = @""; NSString *comp = @"?comparison?"; NSString *opt = @""; switch (_modifier) { case NSDirectPredicateModifier: break; case NSAnyPredicateModifier: modi = @"ANY "; break; case NSAllPredicateModifier: modi = @"ALL"; break; default: modi = @"?modifier?"; break; } switch (_type) { case NSLessThanPredicateOperatorType: comp = @"<"; break; case NSLessThanOrEqualToPredicateOperatorType: comp = @"<="; break; case NSGreaterThanPredicateOperatorType: comp = @">="; break; case NSGreaterThanOrEqualToPredicateOperatorType: comp = @">"; break; case NSEqualToPredicateOperatorType: comp = @"="; break; case NSNotEqualToPredicateOperatorType: comp = @"!="; break; case NSMatchesPredicateOperatorType: comp = @"MATCHES"; break; case NSLikePredicateOperatorType: comp = @"LIKE"; break; case NSBeginsWithPredicateOperatorType: comp = @"BEGINSWITH"; break; case NSEndsWithPredicateOperatorType: comp = @"ENDSWITH"; break; case NSInPredicateOperatorType: comp = @"IN"; break; case NSCustomSelectorPredicateOperatorType: comp = NSStringFromSelector(_selector); break; case NSContainsPredicateOperatorType: comp = @"CONTAINS"; break; case NSBetweenPredicateOperatorType: comp = @"BETWEEN"; break; } switch (_options) { case NSCaseInsensitivePredicateOption: opt = @"[c]"; break; case NSDiacriticInsensitivePredicateOption: opt = @"[d]"; break; case NSCaseInsensitivePredicateOption | NSDiacriticInsensitivePredicateOption: opt = @"[cd]"; break; default: //opt = @"[?options?]"; break; } return [NSString stringWithFormat: @"%@%@ %@%@ %@", modi, _left, comp, opt, _right]; } - (NSPredicate *) predicateWithSubstitutionVariables: (NSDictionary *)variables { NSExpression *left; NSExpression *right; left = [_left _expressionWithSubstitutionVariables: variables]; right = [_right _expressionWithSubstitutionVariables: variables]; if (_type == NSCustomSelectorPredicateOperatorType) { return [NSComparisonPredicate predicateWithLeftExpression: left rightExpression: right customSelector: _selector]; } else { return [NSComparisonPredicate predicateWithLeftExpression: left rightExpression: right modifier: _modifier type: _type options: _options]; } } #if GS_USE_ICU == 1 static BOOL GSICUStringMatchesRegex(NSString *string, NSString *regex, NSStringCompareOptions opts) { BOOL result = NO; UErrorCode error = 0; uint32_t flags = 0; NSUInteger stringLength = [string length]; NSUInteger regexLength = [regex length]; unichar *stringBuffer; unichar *regexBuffer; URegularExpression *icuregex = NULL; stringBuffer = malloc(stringLength * sizeof(unichar)); if (NULL == stringBuffer) { return NO; } regexBuffer = malloc(regexLength * sizeof(unichar)); if (NULL == regexBuffer) { free(stringBuffer); return NO; } [string getCharacters: stringBuffer range: NSMakeRange(0, stringLength)]; [regex getCharacters: regexBuffer range: NSMakeRange(0, regexLength)]; flags |= UREGEX_DOTALL; // . is supposed to recognize newlines if ((opts & NSCaseInsensitiveSearch) != 0) { flags |= UREGEX_CASE_INSENSITIVE; } icuregex = uregex_open(regexBuffer, regexLength, flags, NULL, &error); if (icuregex != NULL && U_SUCCESS(error)) { uregex_setText(icuregex, stringBuffer, stringLength, &error); result = uregex_matches(icuregex, 0, &error); } uregex_close(icuregex); free(stringBuffer); free(regexBuffer); return result; } #endif - (double) doubleValueFor: (id)value { if ([value isKindOfClass: [NSDate class]]) { return [(NSDate*)value timeIntervalSinceReferenceDate]; } else { return [value doubleValue]; } } - (BOOL) _evaluateLeftValue: (id)leftResult rightValue: (id)rightResult object: (id)object { unsigned compareOptions = 0; BOOL leftIsNil; BOOL rightIsNil; leftIsNil = (leftResult == nil || [leftResult isEqual: [NSNull null]]); rightIsNil = (rightResult == nil || [rightResult isEqual: [NSNull null]]); if (leftIsNil || rightIsNil) { if (leftIsNil == rightIsNil) { /* Both of the values are nil. * The result is YES if equality is requested. */ if (NSEqualToPredicateOperatorType == _type || NSLessThanOrEqualToPredicateOperatorType == _type || NSGreaterThanOrEqualToPredicateOperatorType == _type) { return YES; } } else if (NSNotEqualToPredicateOperatorType == _type) { /* One, but not both of the values are nil. * The result is YES if inequality is requested. */ return YES; } return NO; } // Change predicate options into string options. if (!(_options & NSDiacriticInsensitivePredicateOption)) { compareOptions |= NSLiteralSearch; } if (_options & NSCaseInsensitivePredicateOption) { compareOptions |= NSCaseInsensitiveSearch; } /* This is a very optimistic implementation, * hoping that the values are of the right type. */ switch (_type) { case NSLessThanPredicateOperatorType: { double ld = [self doubleValueFor: leftResult]; double rd = [self doubleValueFor: rightResult]; return (ld < rd) ? YES : NO; } case NSLessThanOrEqualToPredicateOperatorType: { double ld = [self doubleValueFor: leftResult]; double rd = [self doubleValueFor: rightResult]; return (ld <= rd) ? YES : NO; } case NSGreaterThanPredicateOperatorType: { double ld = [self doubleValueFor: leftResult]; double rd = [self doubleValueFor: rightResult]; return (ld > rd) ? YES : NO; } case NSGreaterThanOrEqualToPredicateOperatorType: { double ld = [self doubleValueFor: leftResult]; double rd = [self doubleValueFor: rightResult]; return (ld >= rd) ? YES : NO; } case NSEqualToPredicateOperatorType: return [leftResult isEqual: rightResult]; case NSNotEqualToPredicateOperatorType: return ![leftResult isEqual: rightResult]; case NSMatchesPredicateOperatorType: #if GS_USE_ICU == 1 return GSICUStringMatchesRegex(leftResult, rightResult, compareOptions); #else return [leftResult compare: rightResult options: compareOptions] == NSOrderedSame ? YES : NO; #endif case NSLikePredicateOperatorType: #if GS_USE_ICU == 1 { NSString *regex; /* The right hand is a pattern with '?' meaning match one character, * and '*' meaning match zero or more characters, so translate that * into a regex. */ regex = [rightResult stringByReplacingOccurrencesOfString: @"*" withString: @".*"]; regex = [regex stringByReplacingOccurrencesOfString: @"?" withString: @".?"]; regex = [NSString stringWithFormat: @"^%@$", regex]; return GSICUStringMatchesRegex(leftResult, regex, compareOptions); } #else return [leftResult compare: rightResult options: compareOptions] == NSOrderedSame ? YES : NO; #endif case NSBeginsWithPredicateOperatorType: { NSRange range; NSUInteger ll = [leftResult length]; NSUInteger rl = [rightResult length]; if (rl > ll) { return NO; } range = NSMakeRange(0, rl); return ([leftResult compare: rightResult options: compareOptions range: range] == NSOrderedSame ? YES : NO); } case NSEndsWithPredicateOperatorType: { NSRange range; NSUInteger ll = [leftResult length]; NSUInteger rl = [rightResult length]; if (ll < rl) { return NO; } range = NSMakeRange(ll - rl, rl); return ([leftResult compare: rightResult options: compareOptions range: range] == NSOrderedSame ? YES : NO); } case NSInPredicateOperatorType: /* Handle special case where rightResult is a collection * and leftResult an element of it. */ if (![rightResult isKindOfClass: [NSString class]]) { NSEnumerator *e; id value; if (![rightResult respondsToSelector: @selector(objectEnumerator)]) { [NSException raise: NSInvalidArgumentException format: @"The right hand side for an IN operator " @"must be a collection"]; } e = [rightResult objectEnumerator]; while ((value = [e nextObject])) { if ([value isEqual: leftResult]) return YES; } return NO; } return ([rightResult rangeOfString: leftResult options: compareOptions].location != NSNotFound ? YES : NO); case NSCustomSelectorPredicateOperatorType: { BOOL (*function)(id,SEL,id) = (BOOL (*)(id,SEL,id))[leftResult methodForSelector: _selector]; return function(leftResult, _selector, rightResult); } default: return NO; } } - (BOOL) evaluateWithObject: (id)object { id leftValue = [_left expressionValueWithObject: object context: nil]; id rightValue = [_right expressionValueWithObject: object context: nil]; if (_modifier == NSDirectPredicateModifier) { return [self _evaluateLeftValue: leftValue rightValue: rightValue object: object]; } else { BOOL result = (_modifier == NSAllPredicateModifier); NSEnumerator *e; id value; if (![leftValue respondsToSelector: @selector(objectEnumerator)]) { [NSException raise: NSInvalidArgumentException format: @"The left hand side for an ALL or ANY operator must be a collection"]; } e = [leftValue objectEnumerator]; while ((value = [e nextObject])) { BOOL eval = [self _evaluateLeftValue: value rightValue: rightValue object: object]; if (eval != result) return eval; } return result; } } - (id) copyWithZone: (NSZone *)z { NSComparisonPredicate *copy; copy = (NSComparisonPredicate *)NSCopyObject(self, 0, z); copy->_left = [_left copyWithZone: z]; copy->_right = [_right copyWithZone: z]; return copy; } - (Class) classForCoder { return [NSComparisonPredicate class]; } - (void) encodeWithCoder: (NSCoder *)coder { // FIXME [self subclassResponsibility: _cmd]; } - (id) initWithCoder: (NSCoder *)coder { // FIXME [self subclassResponsibility: _cmd]; return self; } @end @implementation NSExpression + (void) initialize { if (self == [NSExpression class] && nil == evaluatedObjectExpression) { evaluatedObjectExpression = [GSEvaluatedObjectExpression new]; } } + (NSExpression *) expressionForConstantValue: (id)obj { GSConstantValueExpression *e; e = [[GSConstantValueExpression alloc] initWithExpressionType: NSConstantValueExpressionType]; ASSIGN(e->_obj, obj); return AUTORELEASE(e); } + (NSExpression *) expressionForEvaluatedObject { return evaluatedObjectExpression; } + (NSExpression *) expressionForFunction: (NSString *)name arguments: (NSArray *)args { GSFunctionExpression *e; NSString *s; e = [[GSFunctionExpression alloc] initWithExpressionType: NSFunctionExpressionType]; s = [NSString stringWithFormat: @"_eval_%@:", name]; e->_selector = NSSelectorFromString(s); if (![e respondsToSelector: e->_selector]) { [NSException raise: NSInvalidArgumentException format: @"Unknown function implementation: %@", name]; } ASSIGN(e->_function, name); e->_argc = [args count]; ASSIGN(e->_args, args); if ([name isEqualToString: @"_add"]) e->_op = @"+"; else if ([name isEqualToString: @"_sub"]) e->_op = @"-"; else if ([name isEqualToString: @"_mul"]) e->_op = @"*"; else if ([name isEqualToString: @"_div"]) e->_op = @"/"; else if ([name isEqualToString: @"_pow"]) e->_op = @"**"; return AUTORELEASE(e); } + (NSExpression *) expressionForKeyPath: (NSString *)path { GSKeyPathExpression *e; if (![path isKindOfClass: [NSString class]]) { [NSException raise: NSInvalidArgumentException format: @"Keypath is not NSString: %@", path]; } e = [[GSKeyPathExpression alloc] initWithExpressionType: NSKeyPathExpressionType]; ASSIGN(e->_keyPath, path); return AUTORELEASE(e); } + (NSExpression *) expressionForKeyPathCompositionWithLeft: (NSExpression*)left right: (NSExpression*)right { GSKeyPathCompositionExpression *e; e = [[GSKeyPathCompositionExpression alloc] initWithExpressionType: NSKeyPathCompositionExpressionType]; ASSIGN(e->_left, left); ASSIGN(e->_right, right); return AUTORELEASE(e); } + (NSExpression *) expressionForVariable: (NSString *)string { GSVariableExpression *e; e = [[GSVariableExpression alloc] initWithExpressionType: NSVariableExpressionType]; ASSIGN(e->_variable, string); return AUTORELEASE(e); } - (id) initWithExpressionType: (NSExpressionType)type { if ((self = [super init]) != nil) { _type = type; } return self; } - (id) copyWithZone: (NSZone *)z { return NSCopyObject(self, 0, z); } - (NSArray *) arguments { [self subclassResponsibility: _cmd]; return nil; } - (id) constantValue { [self subclassResponsibility: _cmd]; return nil; } - (NSString *) description { [self subclassResponsibility: _cmd]; return nil; } - (NSExpressionType) expressionType { return _type; } - (id) expressionValueWithObject: (id)object context: (NSMutableDictionary *)context { [self subclassResponsibility: _cmd]; return nil; } - (NSString *) function { [self subclassResponsibility: _cmd]; return nil; } - (NSString *) keyPath { [self subclassResponsibility: _cmd]; return nil; } - (NSExpression *) operand { [self subclassResponsibility: _cmd]; return nil; } - (NSString *) variable { [self subclassResponsibility: _cmd]; return nil; } - (Class) classForCoder { return [NSExpression class]; } - (void) encodeWithCoder: (NSCoder *)coder { // FIXME [self subclassResponsibility: _cmd]; } - (id) initWithCoder: (NSCoder *)coder { // FIXME [self subclassResponsibility: _cmd]; return nil; } - (id) _expressionWithSubstitutionVariables: (NSDictionary *)variables { [self subclassResponsibility: _cmd]; return nil; } @end @implementation GSConstantValueExpression - (id) constantValue { return _obj; } - (NSString *) description { if ([_obj isKindOfClass: [NSString class]]) { NSMutableString *result = nil; /* Quote the result string as necessary. */ GSPropertyListMake(_obj, nil, NO, YES, 2, &result); return result; } else if ([_obj isKindOfClass: [NSDate class]]) { return [NSString stringWithFormat: @"CAST(%15.6f, \"NSDate\")", [(NSDate*)_obj timeIntervalSinceReferenceDate]]; } return [_obj description]; } - (id) expressionValueWithObject: (id)object context: (NSMutableDictionary *)context { if ([_obj isKindOfClass: [NSArray class]]) { NSUInteger count = [(NSArray*)_obj count]; NSMutableArray *tmp = [NSMutableArray arrayWithCapacity: count]; NSUInteger index = 0; while (index < count) { id e = [(NSArray*)_obj objectAtIndex: index++]; id o; /* Array index is not always a NSExpression object * (e.g. When specified as an argument instead of * an inline expression). */ if ([e isKindOfClass: [NSExpression class]]) { o = [e expressionValueWithObject: e context: context]; } else { o = e; } [tmp addObject: o]; } return tmp; } else { return _obj; } } - (void) dealloc { RELEASE(_obj); [super dealloc]; } - (id) copyWithZone: (NSZone*)zone { GSConstantValueExpression *copy; copy = (GSConstantValueExpression *)[super copyWithZone: zone]; copy->_obj = [_obj copyWithZone: zone]; return copy; } - (id) _expressionWithSubstitutionVariables: (NSDictionary *)variables { return self; } @end @implementation GSEvaluatedObjectExpression - (NSString *) description { return @"SELF"; } - (id) expressionValueWithObject: (id)object context: (NSMutableDictionary *)context { return object; } - (id) _expressionWithSubstitutionVariables: (NSDictionary *)variables { return self; } - (NSString *) keyPath { return @"SELF"; } @end @implementation GSVariableExpression - (NSString *) description { return [NSString stringWithFormat: @"$%@", _variable]; } - (id) expressionValueWithObject: (id)object context: (NSMutableDictionary *)context { return [context objectForKey: _variable]; } - (NSString *) variable { return _variable; } - (void) dealloc; { RELEASE(_variable); [super dealloc]; } - (id) copyWithZone: (NSZone*)zone { GSVariableExpression *copy; copy = (GSVariableExpression *)[super copyWithZone: zone]; copy->_variable = [_variable copyWithZone: zone]; return copy; } - (id) _expressionWithSubstitutionVariables: (NSDictionary *)variables { id result = [variables objectForKey: _variable]; if (result != nil) { return [NSExpression expressionForConstantValue: result]; } else { return self; } } @end @implementation GSKeyPathExpression - (NSString *) description { return _keyPath; } - (id) expressionValueWithObject: (id)object context: (NSMutableDictionary *)context { return [object valueForKeyPath: _keyPath]; } - (NSString *) keyPath { return _keyPath; } - (void) dealloc; { RELEASE(_keyPath); [super dealloc]; } - (id) copyWithZone: (NSZone*)zone { GSKeyPathExpression *copy; copy = (GSKeyPathExpression *)[super copyWithZone: zone]; copy->_keyPath = [_keyPath copyWithZone: zone]; return copy; } - (id) _expressionWithSubstitutionVariables: (NSDictionary *)variables { return self; } @end @implementation GSKeyPathCompositionExpression - (NSString *) description { return [NSString stringWithFormat: @"%@.%@", _left, _right]; } - (id) expressionValueWithObject: (id)object context: (NSMutableDictionary *)context { object = [_left expressionValueWithObject: object context: context]; return [_right expressionValueWithObject: object context: context]; } - (NSString *) keyPath { return nil; } - (void) dealloc { RELEASE(_left); RELEASE(_right); [super dealloc]; } - (id) copyWithZone: (NSZone*)zone { GSKeyPathCompositionExpression *copy; copy = (GSKeyPathCompositionExpression *)[super copyWithZone: zone]; copy->_left = [_left copyWithZone: zone]; copy->_right = [_right copyWithZone: zone]; return copy; } - (id) _expressionWithSubstitutionVariables: (NSDictionary*)variables { NSExpression *left; NSExpression *right; left = [_left _expressionWithSubstitutionVariables: variables]; right = [_right _expressionWithSubstitutionVariables: variables]; return [NSExpression expressionForKeyPathCompositionWithLeft: left right: right]; } @end @implementation GSFunctionExpression - (NSArray *) arguments { return _args; } - (NSString *) description { if (nil != _op && 1 == [_args count]) { GSFunctionExpression *a0 = [_args objectAtIndex: 0]; if (YES == [a0 isKindOfClass: [self class]] && nil != a0->_op) { return [NSString stringWithFormat: @"%@(%@)", _op, a0]; } return [NSString stringWithFormat: @"%@%@", _op, a0]; } if (nil != _op) { GSFunctionExpression *a0 = [_args objectAtIndex: 0]; GSFunctionExpression *a1 = [_args objectAtIndex: 1]; if (YES == [a0 isKindOfClass: [self class]] && nil != a0->_op) { if (YES == [a1 isKindOfClass: [self class]] && nil != a1->_op) { return [NSString stringWithFormat: @"(%@) %@ (%@)", a0, _op, a1]; } return [NSString stringWithFormat: @"(%@) %@ %@", a0, _op, a1]; } if (YES == [a1 isKindOfClass: [self class]] && nil != a1->_op) { return [NSString stringWithFormat: @"%@ %@ (%@)", a0, _op, a1]; } return [NSString stringWithFormat: @"%@ %@ %@", a0, _op, a1]; } return [NSString stringWithFormat: @"%@(%@)", [self function], _args]; } - (NSString *) function { return _function; } - (NSString *) keyPath { return nil; } - (id) expressionValueWithObject: (id)object context: (NSMutableDictionary *)context { // temporary space NSMutableArray *eargs = [NSMutableArray arrayWithCapacity: _argc]; unsigned int i; for (i = 0; i < _argc; i++) { [eargs addObject: [[_args objectAtIndex: i] expressionValueWithObject: object context: context]]; } // apply method selector return [self performSelector: _selector withObject: eargs]; } - (void) dealloc; { RELEASE(_args); RELEASE(_function); [super dealloc]; } - (id) copyWithZone: (NSZone*)zone { GSFunctionExpression *copy; copy = (GSFunctionExpression *)[super copyWithZone: zone]; copy->_function = [_function copyWithZone: zone]; copy->_args = [_args copyWithZone: zone]; return copy; } - (NSEnumerator*) _enum: (NSArray *)expressions { id o; /* Check to see if this is aggregating over a collection. */ if (1 == _argc && [(o = [expressions lastObject]) respondsToSelector: @selector(objectEnumerator)]) { return [o objectEnumerator]; } return [expressions objectEnumerator]; } - (id) _expressionWithSubstitutionVariables: (NSDictionary *)variables { NSMutableArray *args = [NSMutableArray arrayWithCapacity: _argc]; unsigned int i; for (i = 0; i < _argc; i++) { [args addObject: [[_args objectAtIndex: i] _expressionWithSubstitutionVariables: variables]]; } return [NSExpression expressionForFunction: _function arguments: args]; } - (id) _eval__chs: (NSArray *)expressions { return [NSNumber numberWithInt: -[[expressions objectAtIndex: 0] intValue]]; } - (id) _eval__first: (NSArray *)expressions { return [[expressions objectAtIndex: 0] objectAtIndex: 0]; } - (id) _eval__last: (NSArray *)expressions { return [[expressions objectAtIndex: 0] lastObject]; } - (id) _eval__index: (NSArray *)expressions { id left = [expressions objectAtIndex: 0]; id right = [expressions objectAtIndex: 1]; if ([left isKindOfClass: [NSDictionary class]]) { return [left objectForKey: right]; } else { // raises exception if invalid return [left objectAtIndex: [right unsignedIntValue]]; } } - (id) _eval__pow: (NSArray *)expressions { id left = [expressions objectAtIndex: 0]; id right = [expressions objectAtIndex: 1]; return [NSNumber numberWithDouble: pow([left doubleValue], [right doubleValue])]; } - (id) _eval__mul: (NSArray *)expressions { id left = [expressions objectAtIndex: 0]; id right = [expressions objectAtIndex: 1]; return [NSNumber numberWithDouble: [left doubleValue] * [right doubleValue]]; } - (id) _eval__div: (NSArray *)expressions { id left = [expressions objectAtIndex: 0]; id right = [expressions objectAtIndex: 1]; return [NSNumber numberWithDouble: [left doubleValue] / [right doubleValue]]; } - (id) _eval__add: (NSArray *)expressions { id left = [expressions objectAtIndex: 0]; id right = [expressions objectAtIndex: 1]; return [NSNumber numberWithDouble: [left doubleValue] + [right doubleValue]]; } - (id) _eval__sub: (NSArray *)expressions { id left = [expressions objectAtIndex: 0]; id right = [expressions objectAtIndex: 1]; return [NSNumber numberWithDouble: [left doubleValue] - [right doubleValue]]; } - (id) _eval_count: (NSArray *)expressions { NSAssert(_argc == 1, NSInternalInconsistencyException); return [NSNumber numberWithUnsignedInt: [[expressions objectAtIndex: 0] count]]; } - (id) _eval_avg: (NSArray *)expressions { NSEnumerator *e = [self _enum: expressions]; double sum = 0.0; unsigned count = 0; id o; while (nil != (o = [e nextObject])) { sum += [o doubleValue]; count++; } if (count == 0) { return [NSNumber numberWithDouble: 0.0]; } return [NSNumber numberWithDouble: sum / count]; } - (id) _eval_max: (NSArray *)expressions { NSEnumerator *e = [self _enum: expressions]; id o = [e nextObject]; double max = (nil == o) ? 0.0 : [o doubleValue]; double cur; while (nil != (o = [e nextObject])) { cur = [o doubleValue]; if (max < cur) { max = cur; } } return [NSNumber numberWithDouble: max]; } - (id) _eval_min: (NSArray *)expressions { NSEnumerator *e = [self _enum: expressions]; id o = [e nextObject]; double min = (nil == o ? 0.0 : [o doubleValue]); double cur; while (nil != (o = [e nextObject])) { cur = [o doubleValue]; if (min > cur) { min = cur; } } return [NSNumber numberWithDouble: min]; } - (id) _eval_sum: (NSArray *)expressions { NSEnumerator *e = [self _enum: expressions]; double sum = 0.0; id o; while (nil != (o = [e nextObject])) { sum += [o doubleValue]; } return [NSNumber numberWithDouble: sum]; } - (id) _eval_CAST: (NSArray *)expressions { id left = [expressions objectAtIndex: 0]; id right = [expressions objectAtIndex: 1]; if ([right isEqualToString: @"NSDate"]) { return [NSDate dateWithTimeIntervalSinceReferenceDate: [left doubleValue]]; } NSLog(@"Cast to unknown type %@", right); return nil; } // add arithmetic functions: average, median, mode, stddev, sqrt, log, ln, exp, floor, ceiling, abs, trunc, random, randomn, now @end @implementation NSArray (NSPredicate) - (NSArray *) filteredArrayUsingPredicate: (NSPredicate *)predicate { NSMutableArray *result; NSEnumerator *e = [self objectEnumerator]; id object; result = [NSMutableArray arrayWithCapacity: [self count]]; while ((object = [e nextObject]) != nil) { if ([predicate evaluateWithObject: object] == YES) { [result addObject: object]; // passes filter } } return GS_IMMUTABLE(result); } @end @implementation NSMutableArray (NSPredicate) - (void) filterUsingPredicate: (NSPredicate *)predicate { unsigned count = [self count]; while (count-- > 0) { id object = [self objectAtIndex: count]; if ([predicate evaluateWithObject: object] == NO) { [self removeObjectAtIndex: count]; } } } @end @implementation NSSet (NSPredicate) - (NSSet *) filteredSetUsingPredicate: (NSPredicate *)predicate { NSMutableSet *result; NSEnumerator *e = [self objectEnumerator]; id object; result = [NSMutableSet setWithCapacity: [self count]]; while ((object = [e nextObject]) != nil) { if ([predicate evaluateWithObject: object] == YES) { [result addObject: object]; // passes filter } } return GS_IMMUTABLE(result); } @end @implementation NSMutableSet (NSPredicate) - (void) filterUsingPredicate: (NSPredicate *)predicate { NSMutableSet *rejected; NSEnumerator *e = [self objectEnumerator]; id object; rejected = [NSMutableSet setWithCapacity: [self count]]; while ((object = [e nextObject]) != nil) { if ([predicate evaluateWithObject: object] == NO) { [rejected addObject: object]; } } [self minusSet: rejected]; } @end @implementation GSPredicateScanner - (id) initWithString: (NSString*)format args: (NSArray*)args { self = [super initWithString: format]; if (self != nil) { _args = [args objectEnumerator]; } return self; } - (id) nextArg { return [_args nextObject]; } - (BOOL) scanPredicateKeyword: (NSString *)key { // save to back up unsigned loc = [self scanLocation]; unichar c; [self setCaseSensitive: NO]; if (![self scanString: key intoString: NULL]) { // no match return NO; } if ([self isAtEnd]) { // ok return YES; } // Does the next character still belong to the token? c = [[self string] characterAtIndex: [self scanLocation]]; if (![[NSCharacterSet alphanumericCharacterSet] characterIsMember: c]) { // ok return YES; } // back up [self setScanLocation: loc]; // no match return NO; } - (NSPredicate *) parse { NSPredicate *r = nil; NS_DURING { r = [self parsePredicate]; } NS_HANDLER { NSLog(@"Parsing failed for %@ with %@", [self string], localException); [localException raise]; } NS_ENDHANDLER if (![self isAtEnd]) { [NSException raise: NSInvalidArgumentException format: @"Format string contains extra characters: \"%@\"", [self string]]; } return r; } - (NSPredicate *) parsePredicate { return [self parseAnd]; } - (NSPredicate *) parseAnd { NSPredicate *l = [self parseOr]; while ([self scanPredicateKeyword: @"AND"] || [self scanPredicateKeyword: @"&&"]) { NSPredicate *r = [self parseOr]; if ([r isKindOfClass: [NSCompoundPredicate class]] && [(NSCompoundPredicate *)r compoundPredicateType] == NSAndPredicateType) { NSCompoundPredicate *right = (NSCompoundPredicate*)r; // merge if ([l isKindOfClass: [NSCompoundPredicate class]] && [(NSCompoundPredicate *)l compoundPredicateType] == NSAndPredicateType) { NSCompoundPredicate *left; NSMutableArray *subs; left = (NSCompoundPredicate*)l; subs = [[left subpredicates] mutableCopy]; [subs addObjectsFromArray: [right subpredicates]]; l = [NSCompoundPredicate andPredicateWithSubpredicates: subs]; [subs release]; } else { NSMutableArray *subs; subs = [[right subpredicates] mutableCopy]; [subs insertObject: l atIndex: 0]; l = [NSCompoundPredicate andPredicateWithSubpredicates: subs]; [subs release]; } } else if ([l isKindOfClass: [NSCompoundPredicate class]] && [(NSCompoundPredicate *)l compoundPredicateType] == NSAndPredicateType) { NSCompoundPredicate *left; NSMutableArray *subs; left = (NSCompoundPredicate*)l; subs = [[left subpredicates] mutableCopy]; [subs addObject: r]; l = [NSCompoundPredicate andPredicateWithSubpredicates: subs]; [subs release]; } else { l = [NSCompoundPredicate andPredicateWithSubpredicates: [NSArray arrayWithObjects: l, r, nil]]; } } return l; } - (NSPredicate *) parseNot { if ([self scanString: @"(" intoString: NULL]) { NSPredicate *r = [self parsePredicate]; if (![self scanString: @")" intoString: NULL]) { [NSException raise: NSInvalidArgumentException format: @"Missing ) in compound predicate"]; } return r; } if ([self scanPredicateKeyword: @"NOT"] || [self scanPredicateKeyword: @"!"]) { // -> NOT NOT x or NOT (y) return [NSCompoundPredicate notPredicateWithSubpredicate: [self parseNot]]; } if ([self scanPredicateKeyword: @"TRUEPREDICATE"]) { return [NSPredicate predicateWithValue: YES]; } if ([self scanPredicateKeyword: @"FALSEPREDICATE"]) { return [NSPredicate predicateWithValue: NO]; } return [self parseComparison]; } - (NSPredicate *) parseOr { NSPredicate *l = [self parseNot]; while ([self scanPredicateKeyword: @"OR"] || [self scanPredicateKeyword: @"||"]) { NSPredicate *r = [self parseNot]; if ([r isKindOfClass: [NSCompoundPredicate class]] && [(NSCompoundPredicate *)r compoundPredicateType] == NSOrPredicateType) { NSCompoundPredicate *right = (NSCompoundPredicate*)r; // merge if ([l isKindOfClass: [NSCompoundPredicate class]] && [(NSCompoundPredicate *)l compoundPredicateType] == NSOrPredicateType) { NSCompoundPredicate *left = (NSCompoundPredicate*)l; NSMutableArray *subs; subs = [[left subpredicates] mutableCopy]; [subs addObjectsFromArray: [right subpredicates]]; l = [NSCompoundPredicate orPredicateWithSubpredicates: subs]; [subs release]; } else { NSMutableArray *subs; subs = [[right subpredicates] mutableCopy]; [subs insertObject: l atIndex: 0]; l = [NSCompoundPredicate orPredicateWithSubpredicates: subs]; [subs release]; } } else if ([l isKindOfClass: [NSCompoundPredicate class]] && [(NSCompoundPredicate *)l compoundPredicateType] == NSOrPredicateType) { NSCompoundPredicate *left = (NSCompoundPredicate*)l; NSMutableArray *subs; subs = [[left subpredicates] mutableCopy]; [subs addObject: r]; l = [NSCompoundPredicate orPredicateWithSubpredicates: subs]; [subs release]; } else { l = [NSCompoundPredicate orPredicateWithSubpredicates: [NSArray arrayWithObjects: l, r, nil]]; } } return l; } - (NSPredicate *) parseComparison { // there must always be a comparison NSComparisonPredicateModifier modifier = NSDirectPredicateModifier; NSPredicateOperatorType type = 0; unsigned opts = 0; NSExpression *left; NSExpression *right; NSPredicate *p; BOOL negate = NO; BOOL swap = NO; if ([self scanPredicateKeyword: @"ANY"]) { modifier = NSAnyPredicateModifier; } else if ([self scanPredicateKeyword: @"ALL"]) { modifier = NSAllPredicateModifier; } else if ([self scanPredicateKeyword: @"NONE"]) { modifier = NSAnyPredicateModifier; negate = YES; } else if ([self scanPredicateKeyword: @"SOME"]) { modifier = NSAllPredicateModifier; negate = YES; } left = [self parseExpression]; if ([self scanString: @"!=" intoString: NULL] || [self scanString: @"<>" intoString: NULL]) { type = NSNotEqualToPredicateOperatorType; } else if ([self scanString: @"<=" intoString: NULL] || [self scanString: @"=<" intoString: NULL]) { type = NSLessThanOrEqualToPredicateOperatorType; } else if ([self scanString: @">=" intoString: NULL] || [self scanString: @"=>" intoString: NULL]) { type = NSGreaterThanOrEqualToPredicateOperatorType; } else if ([self scanString: @"<" intoString: NULL]) { type = NSLessThanPredicateOperatorType; } else if ([self scanString: @">" intoString: NULL]) { type = NSGreaterThanPredicateOperatorType; } else if ([self scanString: @"==" intoString: NULL] || [self scanString: @"=" intoString: NULL]) { type = NSEqualToPredicateOperatorType; } else if ([self scanPredicateKeyword: @"MATCHES"]) { type = NSMatchesPredicateOperatorType; } else if ([self scanPredicateKeyword: @"LIKE"]) { type = NSLikePredicateOperatorType; } else if ([self scanPredicateKeyword: @"BEGINSWITH"]) { type = NSBeginsWithPredicateOperatorType; } else if ([self scanPredicateKeyword: @"ENDSWITH"]) { type = NSEndsWithPredicateOperatorType; } else if ([self scanPredicateKeyword: @"IN"]) { type = NSInPredicateOperatorType; } else if ([self scanPredicateKeyword: @"CONTAINS"]) { type = NSInPredicateOperatorType; swap = YES; } else if ([self scanPredicateKeyword: @"BETWEEN"]) { // Requires special handling to transfer into AND of // two normal comparison predicates NSExpression *exp = [self parseSimpleExpression]; NSArray *a = (NSArray *)[exp constantValue]; NSNumber *lower, *upper; NSExpression *lexp, *uexp; NSPredicate *lp, *up; if (![a isKindOfClass: [NSArray class]]) { [NSException raise: NSInvalidArgumentException format: @"BETWEEN operator requires array argument"]; } lower = [a objectAtIndex: 0]; upper = [a objectAtIndex: 1]; lexp = [NSExpression expressionForConstantValue: lower]; uexp = [NSExpression expressionForConstantValue: upper]; lp = [NSComparisonPredicate predicateWithLeftExpression: left rightExpression: lexp modifier: modifier type: NSGreaterThanPredicateOperatorType options: opts]; up = [NSComparisonPredicate predicateWithLeftExpression: left rightExpression: uexp modifier: modifier type: NSLessThanPredicateOperatorType options: opts]; return [NSCompoundPredicate andPredicateWithSubpredicates: [NSArray arrayWithObjects: lp, up, nil]]; } else { [NSException raise: NSInvalidArgumentException format: @"Invalid comparison predicate: %@", [[self string] substringFromIndex: [self scanLocation]]]; } if ([self scanString: @"[cd]" intoString: NULL]) { opts = NSCaseInsensitivePredicateOption | NSDiacriticInsensitivePredicateOption; } else if ([self scanString: @"[c]" intoString: NULL]) { opts = NSCaseInsensitivePredicateOption; } else if ([self scanString: @"[d]" intoString: NULL]) { opts = NSDiacriticInsensitivePredicateOption; } right = [self parseExpression]; if (swap == YES) { NSExpression *tmp = left; left = right; right = tmp; } p = [NSComparisonPredicate predicateWithLeftExpression: left rightExpression: right modifier: modifier type: type options: opts]; return negate ? [NSCompoundPredicate notPredicateWithSubpredicate: p] : p; } - (NSExpression *) parseExpression { // return [self parseAdditionExpression]; return [self parseBinaryExpression]; } - (NSExpression *) parseIdentifierExpression { static NSCharacterSet *_identifier; NSString *ident; // skip # as prefix if present (reserved words) (void)[self scanString: @"#" intoString: NULL]; if (!_identifier) { ASSIGN(_identifier, [NSCharacterSet characterSetWithCharactersInString: @"_$abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"]); } if (![self scanCharactersFromSet: _identifier intoString: &ident]) { [NSException raise: NSInvalidArgumentException format: @"Missing identifier: %@", [[self string] substringFromIndex: [self scanLocation]]]; } return [NSExpression expressionForKeyPath: ident]; } - (NSExpression *) parseSimpleExpression { unsigned location; double dbl; if ([self scanDouble: &dbl]) { return [NSExpression expressionForConstantValue: [NSNumber numberWithDouble: dbl]]; } // FIXME: handle integer, hex constants, 0x 0o 0b if ([self scanString: @"-" intoString: NULL]) { return [NSExpression expressionForFunction: @"_chs" arguments: [NSArray arrayWithObject: [self parseExpression]]]; } if ([self scanString: @"(" intoString: NULL]) { NSExpression *arg = [self parseExpression]; if (![self scanString: @")" intoString: NULL]) { [NSException raise: NSInvalidArgumentException format: @"Missing ) in expression"]; } return arg; } if ([self scanString: @"{" intoString: NULL]) { NSMutableArray *a = [NSMutableArray arrayWithCapacity: 10]; if ([self scanString: @"}" intoString: NULL]) { // empty return [NSExpression expressionForConstantValue: a]; } // first element [a addObject: [self parseExpression]]; while ([self scanString: @"," intoString: NULL]) { // more elements [a addObject: [self parseExpression]]; } if (![self scanString: @"}" intoString: NULL]) { [NSException raise: NSInvalidArgumentException format: @"Missing } in aggregate"]; } return [NSExpression expressionForConstantValue: a]; } if ([self scanPredicateKeyword: @"NULL"] || [self scanPredicateKeyword: @"NIL"]) { return [NSExpression expressionForConstantValue: [NSNull null]]; } if ([self scanPredicateKeyword: @"TRUE"] || [self scanPredicateKeyword: @"YES"]) { return [NSExpression expressionForConstantValue: [NSNumber numberWithBool: YES]]; } if ([self scanPredicateKeyword: @"FALSE"] || [self scanPredicateKeyword: @"NO"]) { return [NSExpression expressionForConstantValue: [NSNumber numberWithBool: NO]]; } if ([self scanPredicateKeyword: @"SELF"]) { return [NSExpression expressionForEvaluatedObject]; } if ([self scanString: @"$" intoString: NULL]) { // variable NSExpression *var = [self parseIdentifierExpression]; if (![var keyPath]) { [NSException raise: NSInvalidArgumentException format: @"Invalid variable identifier: %@", var]; } return [NSExpression expressionForVariable: [var keyPath]]; } location = [self scanLocation]; if ([self scanString: @"%" intoString: NULL]) { if ([self isAtEnd] == NO) { unichar c = [[self string] characterAtIndex: [self scanLocation]]; switch (c) { case '%': // '%%' is treated as '%' location = [self scanLocation]; break; case 'K': [self setScanLocation: [self scanLocation] + 1]; return [NSExpression expressionForKeyPath: [self nextArg]]; case '@': case 'c': case 'C': case 'd': case 'D': case 'i': case 'o': case 'O': case 'u': case 'U': case 'x': case 'X': case 'e': case 'E': case 'f': case 'g': case 'G': [self setScanLocation: [self scanLocation] + 1]; return [NSExpression expressionForConstantValue: [self nextArg]]; case 'h': (void)[self scanString: @"h" intoString: NULL]; if ([self isAtEnd] == NO) { c = [[self string] characterAtIndex: [self scanLocation]]; if (c == 'i' || c == 'u') { [self setScanLocation: [self scanLocation] + 1]; return [NSExpression expressionForConstantValue: [self nextArg]]; } } break; case 'q': (void)[self scanString: @"q" intoString: NULL]; if ([self isAtEnd] == NO) { c = [[self string] characterAtIndex: [self scanLocation]]; if (c == 'i' || c == 'u' || c == 'x' || c == 'X') { [self setScanLocation: [self scanLocation] + 1]; return [NSExpression expressionForConstantValue: [self nextArg]]; } } break; } } [self setScanLocation: location]; } if ([self scanString: @"\"" intoString: NULL]) { NSCharacterSet *skip = [self charactersToBeSkipped]; NSString *str = nil; [self setCharactersToBeSkipped: nil]; if ([self scanUpToString: @"\"" intoString: &str] == NO) { [self setCharactersToBeSkipped: skip]; [NSException raise: NSInvalidArgumentException format: @"Invalid double quoted literal at %u", location]; } [self setCharactersToBeSkipped: skip]; if (NO == [self scanString: @"\"" intoString: NULL]) { [NSException raise: NSInvalidArgumentException format: @"Unterminated double quoted literal at %u", location]; } return [NSExpression expressionForConstantValue: str]; } if ([self scanString: @"'" intoString: NULL]) { NSCharacterSet *skip = [self charactersToBeSkipped]; NSString *str = nil; [self setCharactersToBeSkipped: nil]; if ([self scanUpToString: @"'" intoString: &str] == NO) { [self setCharactersToBeSkipped: skip]; [NSException raise: NSInvalidArgumentException format: @"Invalid single quoted literal at %u", location]; } [self setCharactersToBeSkipped: skip]; if (NO == [self scanString: @"'" intoString: NULL]) { [NSException raise: NSInvalidArgumentException format: @"Unterminated single quoted literal at %u", location]; } return [NSExpression expressionForConstantValue: str]; } if ([self scanString: @"@" intoString: NULL]) { NSExpression *e = [self parseIdentifierExpression]; if (![e keyPath]) { [NSException raise: NSInvalidArgumentException format: @"Invalid keypath identifier: %@", e]; } // prefix with keypath return [NSExpression expressionForKeyPath: [NSString stringWithFormat: @"@%@", [e keyPath]]]; } return [self parseIdentifierExpression]; } - (NSExpression *) parseFunctionalExpression { NSExpression *left = [self parseSimpleExpression]; while (YES) { if ([self scanString: @"(" intoString: NULL]) { // function - this parser allows for (max)(a, b, c) to be properly // recognized and even (%K)(a, b, c) if %K evaluates to "max" NSMutableArray *args = [NSMutableArray arrayWithCapacity: 5]; if (![left keyPath]) { [NSException raise: NSInvalidArgumentException format: @"Invalid function identifier: %@", left]; } if (![self scanString: @")" intoString: NULL]) { // any arguments // first argument [args addObject: [self parseExpression]]; while ([self scanString: @"," intoString: NULL]) { // more arguments [args addObject: [self parseExpression]]; } if (![self scanString: @")" intoString: NULL]) { [NSException raise: NSInvalidArgumentException format: @"Missing ) in function arguments"]; } } left = [NSExpression expressionForFunction: [left keyPath] arguments: args]; } else if ([self scanString: @"[" intoString: NULL]) { // index expression if ([self scanPredicateKeyword: @"FIRST"]) { left = [NSExpression expressionForFunction: @"_first" arguments: [NSArray arrayWithObject: [self parseExpression]]]; } else if ([self scanPredicateKeyword: @"LAST"]) { left = [NSExpression expressionForFunction: @"_last" arguments: [NSArray arrayWithObject: [self parseExpression]]]; } else if ([self scanPredicateKeyword: @"SIZE"]) { left = [NSExpression expressionForFunction: @"count" arguments: [NSArray arrayWithObject: [self parseExpression]]]; } else { left = [NSExpression expressionForFunction: @"_index" arguments: [NSArray arrayWithObjects: left, [self parseExpression], nil]]; } if (![self scanString: @"]" intoString: NULL]) { [NSException raise: NSInvalidArgumentException format: @"Missing ] in index argument"]; } } else if ([self scanString: @"." intoString: NULL]) { // keypath - this parser allows for (a).(b.c) // to be properly recognized // and even %K.((%K)) if the first %K evaluates to "a" and the // second %K to "b.c" NSExpression *right; right = [self parseExpression]; if (evaluatedObjectExpression != left) { // if both are simple key expressions (identifiers) if ([left keyPath] && [right keyPath]) { // concatenate left = [NSExpression expressionForKeyPath: [NSString stringWithFormat: @"%@.%@", [left keyPath], [right keyPath]]]; } else { left = [NSExpression expressionForKeyPathCompositionWithLeft: left right: right]; } } else { left = [NSExpression expressionForKeyPath: [right keyPath]]; } } else { // done with suffixes return left; } } } - (NSExpression *) parsePowerExpression { NSExpression *left = [self parseFunctionalExpression]; while (YES) { NSExpression *right; if ([self scanString: @"**" intoString: NULL]) { right = [self parseFunctionalExpression]; left = [NSExpression expressionForFunction: @"_pow" arguments: [NSArray arrayWithObjects: left, right, nil]]; } else { return left; } } } - (NSExpression *) parseMultiplicationExpression { NSExpression *left = [self parsePowerExpression]; while (YES) { NSExpression *right; if ([self scanString: @"*" intoString: NULL]) { right = [self parsePowerExpression]; left = [NSExpression expressionForFunction: @"_mul" arguments: [NSArray arrayWithObjects: left, right, nil]]; } else if ([self scanString: @"/" intoString: NULL]) { right = [self parsePowerExpression]; left = [NSExpression expressionForFunction: @"_div" arguments: [NSArray arrayWithObjects: left, right, nil]]; } else { return left; } } } - (NSExpression *) parseAdditionExpression { NSExpression *left = [self parseMultiplicationExpression]; while (YES) { NSExpression *right; if ([self scanString: @"+" intoString: NULL]) { right = [self parseMultiplicationExpression]; left = [NSExpression expressionForFunction: @"_add" arguments: [NSArray arrayWithObjects: left, right, nil]]; } else if ([self scanString: @"-" intoString: NULL]) { right = [self parseMultiplicationExpression]; left = [NSExpression expressionForFunction: @"_sub" arguments: [NSArray arrayWithObjects: left, right, nil]]; } else { return left; } } } - (NSExpression *) parseBinaryExpression { NSExpression *left = [self parseAdditionExpression]; while (YES) { NSExpression *right; if ([self scanString: @":=" intoString: NULL]) // assignment { // check left to be a variable? right = [self parseAdditionExpression]; // FIXME } else { return left; } } } @end #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) @implementation GSBlockPredicate - (instancetype) initWithBlock: (GSBlockPredicateBlock)block { if (nil == (self = [super init])) { return nil; } _block = (GSBlockPredicateBlock)[(id)block retain]; return self; } - (instancetype) predicateWithSubstitutionVariables: (GS_GENERIC_CLASS(NSDictionary,NSString*,id)*)variables { return [[[GSBoundBlockPredicate alloc] initWithBlock: _block bindings: variables] autorelease]; } - (BOOL) evaluateWithObject: (id)object substitutionVariables: (GS_GENERIC_CLASS(NSDictionary, NSString*,id)*)variables { return CALL_NON_NULL_BLOCK(_block, object, variables); } - (BOOL) evaluateWithObject: (id)object { return [self evaluateWithObject: object substitutionVariables: nil]; } - (void) dealloc { [(id)_block release]; _block = NULL; [super dealloc]; } - (NSString*) predicateFormat { return [NSString stringWithFormat: @"BLOCKPREDICATE(%p)", (void*)_block]; } @end @implementation GSBoundBlockPredicate - (instancetype) initWithBlock: (GSBlockPredicateBlock)block bindings: (GS_GENERIC_CLASS(NSDictionary, NSString*,id)*)bindings { if (nil == (self = [super initWithBlock: block])) { return nil; } ASSIGN(_bindings, bindings); return self; } - (BOOL) evaluateWithObject: (id)object { return [self evaluateWithObject: object substitutionVariables: _bindings]; } - (void) dealloc { DESTROY(_bindings); [super dealloc]; } @end #endif gnustep-base-1.29.0/Source/NSProcessInfo.m000066400000000000000000001337771435650067400203450ustar00rootroot00000000000000/** Implementation for NSProcessInfo for GNUStep Copyright (C) 1995-2017 Free Software Foundation, Inc. Written by: Georg Tuparev Heidelberg, Germany Modified by: Richard Frith-Macdonald This file is part of the GNUstep Base Library. 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 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 USA. NSProcessInfo class reference $Date$ $Revision$ */ /************************************************************************* * File Name : NSProcessInfo.m * Date : 06-aug-1995 ************************************************************************* * Notes : * 1) The class functionality depends on the following UNIX functions and * global variables: gethostname(), getpid(), and environ. For all system * I had the opportunity to test them they are defined and have the same * behavior. The same is true for the meaning of argv[0] (process name). * 2) The global variable _gnu_sharedProcessInfoObject should NEVER be * deallocate during the process runtime. Therefore I implemented a * concrete NSProcessInfo subclass (_NSConcreteProcessInfo) with the only * purpose to override the autorelease, retain, and release methods. * To Do : * 1) To test the class on more platforms; * Bugs : Not known * Last update: 07-aug-2002 * History : 06-aug-1995 - Birth and the first beta version (v. 0.5); * 08-aug-1995 - V. 0.6 (tested on NS, SunOS, Solaris, OSF/1 * The use of the environ global var was changed to more * conventional env[] (main function) so now the class could be * used on SunOS and Solaris. [GT] ************************************************************************* * Acknowledgments: * - Adam Fedor, Andrew McCallum, and Paul Kunz for their help; * - To the NEXTSTEP/GNUStep community *************************************************************************/ #import "common.h" #include #ifdef HAVE_WINDOWS_H # include #endif #if defined(HAVE_SYS_SIGNAL_H) # include #elif defined(HAVE_SIGNAL_H) # include #endif #if defined(HAVE_SYS_FILE_H) # include #endif #if defined(HAVE_SYS_FCNTL_H) # include #elif defined(HAVE_FCNTL_H) # include #endif #ifdef HAVE_SYS_UTSNAME_H #include #endif #ifdef HAVE_KVM_ENV #include #if defined(HAVE_SYS_FCNTL_H) # include #elif defined(HAVE_FCNTL_H) # include #endif #include #endif /* HAVE_KVM_ENV */ #ifdef HAVE_SYS_SYSCTL_H #include #endif #if HAVE_PROCFS_H #define id _procfs_avoid_id_collision #include #undef id #endif #if defined(__APPLE__) && !GS_FAKE_MAIN #include #endif #import "Foundation/NSArray.h" #import "Foundation/NSSet.h" #import "Foundation/NSCharacterSet.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSDate.h" #import "Foundation/NSException.h" #import "Foundation/NSFileManager.h" #import "Foundation/NSProcessInfo.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSHost.h" #import "Foundation/NSLock.h" #import "GNUstepBase/NSProcessInfo+GNUstepBase.h" #import "GNUstepBase/NSString+GNUstepBase.h" #import "GSPrivate.h" /* This error message should be called only if the private main function * was not executed successfully. This may happen ONLY if another library * or kit defines its own main function (as gnustep-base does). */ #if GS_FAKE_MAIN #define _GNU_MISSING_MAIN_FUNCTION_CALL "\nGNUSTEP Internal Error:\n\ The private GNUstep function to establish the argv and environment\n\ variables was not called.\n\ Perhaps your program failed to #include or\n\ ?\n\ If that is not the problem, Please report the error to bug-gnustep@gnu.org.\n\n" #else #ifdef GS_PASS_ARGUMENTS #define _GNU_MISSING_MAIN_FUNCTION_CALL "\nGNUSTEP Error:\n\ A call to NSProcessInfo +initializeWithArguments:... must be made\n\ as the first ObjC statment in main. This function is used to \n\ establish the argv and environment variables.\n" #else #define _GNU_MISSING_MAIN_FUNCTION_CALL "\nGNUSTEP Internal Error:\n\ The private GNUstep function to establish the argv and environment\n\ variables was not called.\n\ \n\ Mismatched library versions between GNUstep Foundation (base) and AppKit\n\ (gui) is most often the cause of this message. Please be sure you\n\ are using known compatible versions and not a mismatched set. Generally,\n\ we recommend you use versions of base and gui which were released together.\n\ \n\ For more detailed assistance, please report the error to bug-gnustep@gnu.org.\n\n" #endif #endif @interface NSHost (NSProcessInfo) + (NSString*) _myHostName; @end /************************************************************************* *** _NSConcreteProcessInfo *************************************************************************/ @interface _NSConcreteProcessInfo: NSProcessInfo - (id) autorelease; - (oneway void) release; - (id) retain; @end @implementation _NSConcreteProcessInfo - (id) autorelease { return self; } - (oneway void) release { return; } - (id) retain { return self; } @end /************************************************************************* *** NSProcessInfo implementation *************************************************************************/ /** * Instances of this class encapsulate information on the current process. * For example, you can get the arguments, environment variables, host name, * or process name. There is only one instance per process, for obvious * reasons, and it may be obtained through the +processInfo method. */ @implementation NSProcessInfo /************************************************************************* *** Static global vars *************************************************************************/ // The lock to protect shared process resources. static NSRecursiveLock *procLock = nil; // The shared NSProcessInfo instance static NSProcessInfo *_gnu_sharedProcessInfoObject = nil; // Host name of the CPU executing the process static NSString *_gnu_hostName = nil; static char *_gnu_arg_zero = 0; // Current process name static NSString *_gnu_processName = nil; // Array of NSStrings (argv[1] .. argv[argc-1]) static NSArray *_gnu_arguments = nil; // Dictionary of environment vars and their values static NSDictionary *_gnu_environment = nil; // The operating system we are using. static unsigned int _operatingSystem = 0; static NSString *_operatingSystemName = nil; static NSString *_operatingSystemVersion = nil; // Flag to indicate that fallbackInitialisation was executed. static BOOL fallbackInitialisation = NO; static NSMutableSet *mySet = nil; #ifdef __ANDROID__ static jobject _androidContext = NULL; static NSString *_androidFilesDir = nil; static NSString *_androidCacheDir = nil; #endif /************************************************************************* *** Implementing the gnustep_base_user_main function *************************************************************************/ static void _gnu_process_args(int argc, char *argv[], char *env[]) { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSString *arg0 = nil; int i; if (_gnu_arg_zero != 0) { free(_gnu_arg_zero); } if (argv != 0 && argv[0] != 0) { int len; len = strlen(argv[0]) + 1; _gnu_arg_zero = (char*)malloc(len); memcpy(_gnu_arg_zero, argv[0], len); arg0 = [[NSString alloc] initWithCString: _gnu_arg_zero]; } else { #if defined(_WIN32) unichar *buffer; int buffer_size = 0; int needed_size = 0; int len; const char *tmp; while (needed_size == buffer_size) { buffer_size = buffer_size + 256; buffer = (unichar*)malloc(buffer_size * sizeof(unichar)); needed_size = GetModuleFileNameW(NULL, buffer, buffer_size); if (needed_size < buffer_size) { unsigned i; for (i = 0; i < needed_size; i++) { if (buffer[i] == 0) { break; } } arg0 = [[NSString alloc] initWithCharacters: buffer length: i]; } else { free(buffer); } } tmp = [arg0 cStringUsingEncoding: [NSString defaultCStringEncoding]]; len = strlen(tmp) + 1; _gnu_arg_zero = (char*)malloc(len); memcpy(_gnu_arg_zero, tmp, len); #else fprintf(stderr, "Error: for some reason, argv not properly set up " "during GNUstep base initialization\n"); abort(); #endif } /* Getting the process name */ IF_NO_ARC(RELEASE(_gnu_processName);) _gnu_processName = [arg0 lastPathComponent]; #if defined(_WIN32) /* On windows we remove any .exe extension for consistency with app names * under unix */ { NSString *e = [_gnu_processName pathExtension]; if (e != nil && [e caseInsensitiveCompare: @"EXE"] == NSOrderedSame) { _gnu_processName = [_gnu_processName stringByDeletingPathExtension]; } } #endif IF_NO_ARC(RETAIN(_gnu_processName);) /* Copy the argument list */ #if defined(_WIN32) { unichar **argvw = CommandLineToArgvW(GetCommandLineW(), &argc); NSString *str; id obj_argv[argc]; int added = 1; /* Copy the zero'th argument to the argument list */ obj_argv[0] = arg0; if (mySet == nil) mySet = [NSMutableSet new]; for (i = 1; i < argc; i++) { str = [NSString stringWithCharacters: argvw[i] length: wcslen(argvw[i])]; if ([str hasPrefix: @"--GNU-Debug="]) { [mySet addObject: [str substringFromIndex: 12]]; } else { obj_argv[added++] = str; } } IF_NO_ARC(RELEASE(_gnu_arguments);) _gnu_arguments = [[NSArray alloc] initWithObjects: obj_argv count: added]; RELEASE(arg0); } #else if (argv) { NSString *str; id obj_argv[argc]; int added = 1; NSStringEncoding enc = GSPrivateDefaultCStringEncoding(); /* Copy the zero'th argument to the argument list */ obj_argv[0] = arg0; if (mySet == nil) mySet = [NSMutableSet new]; for (i = 1; i < argc; i++) { str = [NSString stringWithCString: argv[i] encoding: enc]; if ([str hasPrefix: @"--GNU-Debug="]) [mySet addObject: [str substringFromIndex: 12]]; else obj_argv[added++] = str; } IF_NO_ARC(RELEASE(_gnu_arguments);) _gnu_arguments = [[NSArray alloc] initWithObjects: obj_argv count: added]; RELEASE(arg0); } #endif /* Copy the evironment list */ { NSMutableArray *keys = [NSMutableArray new]; NSMutableArray *values = [NSMutableArray new]; NSStringEncoding enc = GSPrivateDefaultCStringEncoding(); #if defined(_WIN32) if (fallbackInitialisation == NO) { unichar *base; base = GetEnvironmentStringsW(); if (base != 0) { const unichar *wenvp = base; while (*wenvp != 0) { const unichar *start = wenvp; NSString *key; NSString *val; start = wenvp; while (*wenvp != '=' && *wenvp != 0) { wenvp++; } if (*wenvp == '=') { key = [NSString stringWithCharacters: start length: wenvp - start]; wenvp++; start = wenvp; } else { break; // Bad format ... expected '=' } while (*wenvp != 0) { wenvp++; } val = [NSString stringWithCharacters: start length: wenvp - start]; wenvp++; // Skip past variable terminator [keys addObject: key]; [values addObject: val]; } FreeEnvironmentStringsW(base); env = 0; // Suppress standard code. } } #endif if (env != 0) { i = 0; while (env[i]) { int len = strlen(env[i]); char *cp = strchr(env[i], '='); if (len && cp) { char buf[len+2]; memcpy(buf, env[i], len + 1); cp = &buf[cp - env[i]]; *cp++ = '\0'; [keys addObject: [NSString stringWithCString: buf encoding: enc]]; [values addObject: [NSString stringWithCString: cp encoding: enc]]; } i++; } } IF_NO_ARC(RELEASE(_gnu_environment);) _gnu_environment = [[NSDictionary alloc] initWithObjects: values forKeys: keys]; IF_NO_ARC(RELEASE(keys);) IF_NO_ARC(RELEASE(values);) } [arp drain]; } #if !GS_FAKE_MAIN && ((defined(HAVE_PROCFS) || defined(HAVE_KVM_ENV) || defined(HAVE_PROCFS_PSINFO) || defined(__APPLE__)) && (defined(HAVE_LOAD_METHOD))) /* * We have to save program arguments and environment before main () is * executed, because main () could modify their values before we get a * chance to read them */ static int _gnu_noobjc_argc = 0; static char **_gnu_noobjc_argv = NULL; static char **_gnu_noobjc_env = NULL; /* * The +load method (an extension of the GNU compiler) is invoked * before main and +initialize (for this class) is executed. This is * guaranteed if +load contains only pure C code, as we have here. The * code in here either uses libkvm if available, or else procfs. */ + (void) load { #ifdef HAVE_KVM_ENV /* * Use the kvm library to open the kernel and read the environment and * arguments. As we are not running as root we cannot open the memory * device and thus we fake it using /dev/null. This is allowed under * FreeBSD, but may fail on other operating systems which check the * file type. The kvm calls used are those which are supposedly backward * compatible with Solaris rather than being FreeBSD specific */ kvm_t *kptr = NULL; struct kinfo_proc *proc_ptr = NULL; int nprocs, i, count; char **vectors; /* open the kernel */ kptr = kvm_open(NULL, "/dev/null", NULL, O_RDONLY, "NSProcessInfo"); if (!kptr) { fprintf(stderr, "Error: Your system appears to provide libkvm, but the kernel open fails\n"); fprintf(stderr, "Try to reconfigure gnustep-base with --enable-fake-main. to work\n"); fprintf(stderr, "around this problem."); abort(); } /* find the process */ proc_ptr = kvm_getprocs(kptr, KERN_PROC_PID, getpid(), &nprocs); if (!proc_ptr || (nprocs != 1)) { fprintf(stderr, "Error: libkvm cannot find the current process\n"); abort(); } /* get the environment vectors the normal way, since this always works. On FreeBSD, the only other way is via /proc, and in later versions /proc is not mounted. */ { extern char **environ; vectors = environ; if (!vectors) { fprintf(stderr, "Error: for some reason, environ == NULL " "during GNUstep base initialization\n" "Please check the linking process\n"); abort(); } } /* copy the environment strings */ for (count = 0; vectors[count]; count++) ; _gnu_noobjc_env = (char**)malloc(sizeof(char*) * (count + 1)); if (!_gnu_noobjc_env) goto malloc_error; for (i = 0; i < count; i++) { _gnu_noobjc_env[i] = (char *)strdup(vectors[i]); if (!_gnu_noobjc_env[i]) goto malloc_error; } _gnu_noobjc_env[i] = NULL; /* get the argument vectors */ vectors = kvm_getargv(kptr, proc_ptr, 0); if (!vectors) { fprintf(stderr, "Error: libkvm does not return arguments for the current process\n"); fprintf(stderr, "this may be due to a bug (undocumented feature) in libkvm\n"); fprintf(stderr, "which fails to get arguments unless /proc is mounted.\n"); fprintf(stderr, "If so, you can mount the /proc filesystem or reconfigure/build\n"); fprintf(stderr, "gnustep-base with --enable-fake-main as a workaround, and\n"); fprintf(stderr, "should report the bug to the maintainer of libkvm on your operating system.\n"); abort(); } /* copy the argument strings */ for (_gnu_noobjc_argc = 0; vectors[_gnu_noobjc_argc]; _gnu_noobjc_argc++) ; _gnu_noobjc_argv = (char**)malloc(sizeof(char*) * (_gnu_noobjc_argc + 1)); if (!_gnu_noobjc_argv) goto malloc_error; for (i = 0; i < _gnu_noobjc_argc; i++) { _gnu_noobjc_argv[i] = (char *)strdup(vectors[i]); if (!_gnu_noobjc_argv[i]) goto malloc_error; } _gnu_noobjc_argv[i] = NULL; return; #elif defined(HAVE_PROCFS_PSINFO) char *proc_file_name = NULL; FILE *ifp; psinfo_t pinfo; char **vectors; int i, count; // Read commandline proc_file_name = (char*)malloc(2048); snprintf(proc_file_name, 2048, "/proc/%d/psinfo", (int)getpid()); ifp = fopen(proc_file_name, "r"); if (ifp == NULL) { fprintf(stderr, "Error: Failed to open the process info file:%s\n", proc_file_name); abort(); } fread(&pinfo, sizeof(pinfo), 1, ifp); fclose(ifp); vectors = (char **)pinfo.pr_envp; if (!vectors) { fprintf(stderr, "Error: for some reason, environ == NULL " "during GNUstep base initialization\n" "Please check the linking process\n"); abort(); } /* copy the environment strings */ for (count = 0; vectors[count]; count++) ; _gnu_noobjc_env = (char**)malloc(sizeof(char*) * (count + 1)); if (!_gnu_noobjc_env) goto malloc_error; for (i = 0; i < count; i++) { _gnu_noobjc_env[i] = (char *)strdup(vectors[i]); if (!_gnu_noobjc_env[i]) goto malloc_error; } _gnu_noobjc_env[i] = NULL; /* get the argument vectors */ vectors = (char **)pinfo.pr_argv; if (!vectors) { fprintf(stderr, "Error: psinfo does not return arguments for the current process\n"); abort(); } /* copy the argument strings */ for (_gnu_noobjc_argc = 0; vectors[_gnu_noobjc_argc]; _gnu_noobjc_argc++) ; _gnu_noobjc_argv = (char**)malloc(sizeof(char*) * (_gnu_noobjc_argc + 1)); if (!_gnu_noobjc_argv) goto malloc_error; for (i = 0; i < _gnu_noobjc_argc; i++) { _gnu_noobjc_argv[i] = (char *)strdup(vectors[i]); if (!_gnu_noobjc_argv[i]) goto malloc_error; } _gnu_noobjc_argv[i] = NULL; return; #elif defined(__APPLE__) /* * Darwin/Mac OS X provides indirect access to command line arguments and * the environment with functions defined in the C runtime system. */ int i, n; int argc = *_NSGetArgc(); char **argv = *_NSGetArgv(); char **environ = *_NSGetEnviron(); /* copy environment */ n = 0; while (environ[n] != NULL) n++; _gnu_noobjc_env = (char **)malloc(sizeof(char *) * (n + 1)); if (_gnu_noobjc_env == NULL) goto malloc_error; for (i = 0; i < n; i++) { _gnu_noobjc_env[i] = (char *)strdup(environ[i]); if (_gnu_noobjc_env[i] == NULL) goto malloc_error; } _gnu_noobjc_env[i] = NULL; /* copy arguments */ _gnu_noobjc_argc = argc; _gnu_noobjc_argv = (char **)malloc(sizeof(char *) * (argc + 1)); if (_gnu_noobjc_argv == NULL) goto malloc_error; for (i = 0; i < argc; i++) { _gnu_noobjc_argv[i] = (char *)strdup(argv[i]); if (_gnu_noobjc_argv[i] == NULL) goto malloc_error; } _gnu_noobjc_argv[i] = NULL; return; #else /* !HAVE_KVM_ENV (i.e. HAVE_PROCFS). */ /* * Now we have the problem of reading program arguments and * environment. We take the environment from extern char **environ, and * the program arguments from the /proc filesystem. */ extern char **environ; char *proc_file_name = NULL; FILE *ifp; int c; int argument; int length; int position; int env_terms; BOOL stripTrailingNewline = NO; #ifdef HAVE_PROGRAM_INVOCATION_NAME extern char *program_invocation_name; #endif /* HAVE_PROGRAM_INVOCATION_NAME */ // Read environment /* NB: This should *never* happen if your compiler tools are sane. But, if you are playing with them, you could break them to the point you get here. :-) */ if (environ == NULL) { /* TODO: Try reading environment from /proc before aborting. */ fprintf(stderr, "Error: for some reason, environ == NULL " "during GNUstep base initialization\n" "Please check the linking process\n"); abort(); } c = 0; while (environ[c] != NULL) c++; env_terms = c; _gnu_noobjc_env = (char**)malloc(sizeof(char*) * (env_terms + 1)); if (_gnu_noobjc_env == NULL) goto malloc_error; for (c = 0; c < env_terms; c++) { _gnu_noobjc_env[c] = (char *)strdup(environ[c]); if (_gnu_noobjc_env[c] == NULL) goto malloc_error; } _gnu_noobjc_env[c] = NULL; // Read commandline proc_file_name = (char *)malloc(2048); snprintf(proc_file_name, 2048, "/proc/%d/cmdline", (int)getpid()); /* * We read the /proc file thrice. * First, to know how many arguments there are and allocate memory for them. * Second, to know how long each argument is, and allocate memory accordingly. * Third, to actually copy the arguments into memory. */ _gnu_noobjc_argc = 0; #ifdef HAVE_STRERROR errno = 0; #endif /* HAVE_STRERROR */ ifp = fopen(proc_file_name, "r"); if (ifp == NULL) goto proc_fs_error; while (1) { c = getc(ifp); if (c == 0) _gnu_noobjc_argc++; else if (c == EOF) break; } #if (CMDLINE_TERMINATED == 0) _gnu_noobjc_argc++; #endif fclose(ifp); /* * Now _gnu_noobcj_argc is the number of arguments; * allocate memory accordingly. */ _gnu_noobjc_argv = (char **)malloc((sizeof(char *)) * (_gnu_noobjc_argc + 1)); if (_gnu_noobjc_argv == NULL) goto malloc_error; ifp = fopen(proc_file_name,"r"); //freopen(proc_file_name, "r", ifp); if (ifp == NULL) { free(_gnu_noobjc_argv); goto proc_fs_error; } argument = 0; length = 0; while (argument < _gnu_noobjc_argc) { c = getc(ifp); length++; if ((c == EOF) || (c == 0)) // End of a parameter { _gnu_noobjc_argv[argument] = (char*)malloc((sizeof(char))*length); if (_gnu_noobjc_argv[argument] == NULL) goto malloc_error; argument++; length = 0; if (c == EOF) // End of command line { _gnu_noobjc_argc = argument; break; } } } fclose(ifp); ifp = fopen(proc_file_name,"r"); //freopen(proc_file_name, "r", ifp); if (ifp == NULL) { if (0 != _gnu_noobjc_argv) { for (c = 0; c < _gnu_noobjc_argc; c++) { free(_gnu_noobjc_argv[c]); } free(_gnu_noobjc_argv); } goto proc_fs_error; } argument = 0; position = 0; while (argument < _gnu_noobjc_argc) { c = getc(ifp); if ((c == EOF) || (c == 0)) // End of a parameter { if (argument == 0 && position > 0 && _gnu_noobjc_argv[argument][position-1] == '\n') { stripTrailingNewline = YES; } if (stripTrailingNewline == YES && position > 0 && _gnu_noobjc_argv[argument][position-1] == '\n') { position--; } _gnu_noobjc_argv[argument][position] = '\0'; argument++; if (c == EOF) // End of command line break; position = 0; continue; } _gnu_noobjc_argv[argument][position] = c; position++; } _gnu_noobjc_argv[argument] = NULL; fclose(ifp); free(proc_file_name); return; proc_fs_error: #ifdef HAVE_STRERROR /* Don't care about thread safety of strerror() here as this is only * called in the initial thread and there shouldn't be any other * threads at this point. */ fprintf(stderr, "Couldn't open file %s when starting gnustep-base; %s\n", proc_file_name, strerror(errno)); #else /* !HAVE_FUNCTION_STRERROR */ fprintf(stderr, "Couldn't open file %s when starting gnustep-base.\n", proc_file_name); #endif /* HAVE_FUNCTION_STRERROR */ fprintf(stderr, "Your gnustep-base library is compiled for a kernel supporting the /proc filesystem, but it can't access it.\n"); fprintf(stderr, "You should recompile or change your kernel.\n"); free(proc_file_name); #ifdef HAVE_PROGRAM_INVOCATION_NAME fprintf(stderr, "We try to go on anyway; but the program will ignore any argument which were passed to it.\n"); _gnu_noobjc_argc = 1; _gnu_noobjc_argv = malloc(sizeof(char *) * 2); if (_gnu_noobjc_argv == NULL) goto malloc_error; _gnu_noobjc_argv[0] = strdup(program_invocation_name); if (_gnu_noobjc_argv[0] == NULL) goto malloc_error; _gnu_noobjc_argv[1] = NULL; return; #else /* !HAVE_PROGRAM_INVOCATION_NAME */ /* * There is really little sense in going on here, because NSBundle * will anyway crash later if we just put something like "_Unknown_" * as the program name. */ abort(); #endif /* HAVE_PROGRAM_INVOCATION_NAME */ #endif /* !HAVE_KVM_ENV (e.g. HAVE_PROCFS) */ malloc_error: fprintf(stderr, "malloc() error when starting gnustep-base.\n"); fprintf(stderr, "Free some memory and then re-run the program.\n"); abort(); } static void _gnu_noobjc_free_vars(void) { char **p; p = _gnu_noobjc_argv; while (*p) { free(*p); p++; } free(_gnu_noobjc_argv); _gnu_noobjc_argv = 0; p = _gnu_noobjc_env; while (*p) { free(*p); p++; } free(_gnu_noobjc_env); _gnu_noobjc_env = 0; } + (void) initialize { if (nil == procLock) procLock = [NSRecursiveLock new]; if (self == [NSProcessInfo class] && !_gnu_processName && !_gnu_arguments && !_gnu_environment) { if (_gnu_noobjc_argv == 0 || _gnu_noobjc_env == 0) { fprintf(stderr, _GNU_MISSING_MAIN_FUNCTION_CALL); exit(1); } _gnu_process_args(_gnu_noobjc_argc, _gnu_noobjc_argv, _gnu_noobjc_env); _gnu_noobjc_free_vars(); } } #else /*! HAVE_PROCFS !HAVE_LOAD_METHOD !HAVE_KVM_ENV */ #ifdef _WIN32 /* For WindowsAPI Library, we know the global variables (argc, etc) */ + (void) initialize { if (nil == procLock) procLock = [NSRecursiveLock new]; if (self == [NSProcessInfo class] && !_gnu_processName && !_gnu_arguments && !_gnu_environment) { _gnu_process_args(__argc, __argv, _environ); } } #elif defined(__BEOS__) extern int __libc_argc; extern char **__libc_argv; + (void) initialize { if (nil == procLock) procLock = [NSRecursiveLock new]; if (self == [NSProcessInfo class] && !_gnu_processName && !_gnu_arguments && !_gnu_environment) { _gnu_process_args(__libc_argc, __libc_argv, environ); } } #else + (void) initialize { if (nil == procLock) procLock = [NSRecursiveLock new]; } #ifndef GS_PASS_ARGUMENTS #undef main /* The gnustep_base_user_main function is declared 'weak' so that the linker * should actually use the one compiled as the program's 'main' function. * The internal version gets called only if the program does not implement * the function (ie the prgram was compiled with the wrong version of * GSConfig.h included/imported). The other possible reason for the internal * function to be called would be a compiler/linker issue (eg 'weak' not * supported). */ int gnustep_base_user_main () __attribute__((weak)); int gnustep_base_user_main (int argc, char *argv[], char *env[]) { fprintf(stderr, "\nGNUSTEP Internal Error:\n" "The GNUstep function to establish the argv and environment variables could\n" "not find the main function of your program.\n" "Perhaps your program failed to #include or\n" " (or included/imported a different version of the\n" "header from the one supplied with this copy of the gnustep-base library)?\n" "If that is not the case, Please report the error to bug-gnustep@gnu.org.\n"); exit(1); } int main(int argc, char *argv[], char *env[]) { #ifdef NeXT_RUNTIME /* This memcpy has to be done before the first message is sent to any constant string object. See Apple Radar 2870817 */ memcpy(&_NSConstantStringClassReference, objc_getClass(STRINGIFY(NXConstantString)), sizeof(_NSConstantStringClassReference)); #endif _gnu_process_args(argc, argv, env); /* Call the user defined main function */ return gnustep_base_user_main(argc, argv, env); } #endif /* !GS_PASS_ARGUMENTS */ #endif /* _WIN32 */ #endif /* HAS_LOAD_METHOD && HAS_PROCFS */ + (NSProcessInfo *) processInfo { // Check if the main() function was successfully called // We can't use NSAssert, which calls NSLog, which calls NSProcessInfo... if (!(_gnu_processName && _gnu_arguments && _gnu_environment)) { fprintf(stderr, _GNU_MISSING_MAIN_FUNCTION_CALL); exit(1); } if (!_gnu_sharedProcessInfoObject) { _gnu_sharedProcessInfoObject = [[_NSConcreteProcessInfo alloc] init]; [procLock lock]; if (mySet != nil) { NSEnumerator *e = [mySet objectEnumerator]; NSMutableSet *s = [_gnu_sharedProcessInfoObject debugSet]; id o; while ((o = [e nextObject]) != nil) { [s addObject: o]; } [mySet release]; mySet = nil; } [procLock unlock]; } return _gnu_sharedProcessInfoObject; } + (BOOL) _exists: (int)pid { if (pid > 0) { #if defined(_WIN32) HANDLE h = OpenProcess(PROCESS_QUERY_INFORMATION,0,pid); if (h == NULL && GetLastError() != ERROR_ACCESS_DENIED) { return NO; } CloseHandle(h); #else if (kill(pid, 0) < 0 && errno == ESRCH) { return NO; } #endif return YES; } return NO; } - (NSArray *) arguments { return _gnu_arguments; } - (NSDictionary *) environment { return _gnu_environment; } - (NSString *) globallyUniqueString { static unsigned long counter = 0; unsigned long count; static NSString *host = nil; NSString *thost = nil; static int pid = 0; int tpid = 0; static unsigned long start; /* We obtain the host name and pid outside the locked region in case * the lookup is slow or indirectly calls this method fromm another * thread (as unlikely as that is ... some subclass/category could * do it). */ if (nil == host) { thost = [[self hostName] stringByReplacingString: @"." withString: @"_"]; tpid = [self processIdentifier]; } [procLock lock]; if (nil == host) { start = (unsigned long)GSPrivateTimeNow(); ASSIGN(host, thost); pid = tpid; } count = counter++; [procLock unlock]; // $$$ The format of the string is not specified by the OpenStep // specification. return [NSString stringWithFormat: @"%@_%x_%lx_%lx", host, pid, start, count]; } - (NSString *) hostName { if (!_gnu_hostName) { _gnu_hostName = [[NSHost _myHostName] copy]; } return _gnu_hostName; } static void determineOperatingSystem() { if (_operatingSystem == 0) { NSString *os = nil; BOOL parseOS = YES; #if defined(_WIN32) OSVERSIONINFOW osver; osver.dwOSVersionInfoSize = sizeof(osver); GetVersionExW (&osver); /* Hmm, we could use this to determine operating system version, but * that would not distinguish between mingw and cygwin, so we just * use the information from NSBundle and only get the version info * here. */ _operatingSystemVersion = [[NSString alloc] initWithFormat: @"%lu.%lu", osver.dwMajorVersion, osver.dwMinorVersion]; #else #if defined(HAVE_SYS_UTSNAME_H) struct utsname uts; /* The system supports uname, so we can use it rather than the * value determined at configure/compile time. * That's good if the binary is running on a system other than * the one it was built for (rare, but can happen). */ if (!(uname(&uts) < 0)) { os = [NSString stringWithCString: uts.sysname encoding: [NSString defaultCStringEncoding]]; os = [os lowercaseString]; /* Get the operating system version ... usually the version string * is pretty horrible, and the kernel release string actually * makes more sense. */ _operatingSystemVersion = [[NSString alloc] initWithCString: uts.release encoding: [NSString defaultCStringEncoding]]; /* Hack for sunos/solaris ... sunos version 5 is solaris */ if ([os isEqualToString: @"sunos"] == YES && [_operatingSystemVersion intValue] > 4) { os = @"solaris"; } } #endif /* HAVE_SYS_UTSNAME_H */ #endif /* _WIN32 */ if (_operatingSystemVersion == nil) { NSWarnFLog(@"Unable to determine system version, using 0.0"); _operatingSystemVersion = @"0.0"; } while (parseOS == YES) { NSString *fallback = [NSBundle _gnustep_target_os]; if (os == nil) { os = fallback; } parseOS = NO; if ([os hasPrefix: @"linux"] == YES) { _operatingSystemName = @"GSGNULinuxOperatingSystem"; _operatingSystem = GSGNULinuxOperatingSystem; } else if ([os hasPrefix: @"mingw"] == YES || [os isEqualToString: @"windows"] == YES) { _operatingSystemName = @"NSWindowsNTOperatingSystem"; _operatingSystem = NSWindowsNTOperatingSystem; } else if ([os isEqualToString: @"cygwin"] == YES) { _operatingSystemName = @"GSCygwinOperatingSystem"; _operatingSystem = GSCygwinOperatingSystem; } else if ([os hasPrefix: @"bsd"] == YES || [os hasPrefix: @"freebsd"] == YES || [os hasPrefix: @"netbsd"] == YES || [os hasPrefix: @"openbsd"] == YES) { _operatingSystemName = @"GSBSDOperatingSystem"; _operatingSystem = GSBSDOperatingSystem; } else if ([os hasPrefix: @"beos"] == YES) { _operatingSystemName = @"GSBeOperatingSystem"; _operatingSystem = GSBeOperatingSystem; } else if ([os hasPrefix: @"darwin"] == YES) { _operatingSystemName = @"NSMACHOperatingSystem"; _operatingSystem = NSMACHOperatingSystem; } else if ([os hasPrefix: @"solaris"] == YES) { _operatingSystemName = @"NSSolarisOperatingSystem"; _operatingSystem = NSSolarisOperatingSystem; } else if ([os hasPrefix: @"hpux"] == YES) { _operatingSystemName = @"NSHPUXOperatingSystem"; _operatingSystem = NSHPUXOperatingSystem; } else if ([os hasPrefix: @"sunos"] == YES) { _operatingSystemName = @"NSSunOSOperatingSystem"; _operatingSystem = NSSunOSOperatingSystem; } else if ([os hasPrefix: @"osf"] == YES) { _operatingSystemName = @"NSOSF1OperatingSystem"; _operatingSystem = NSOSF1OperatingSystem; } if (_operatingSystem == 0 && [os isEqual: fallback] == NO) { os = fallback; parseOS = YES; // Try again with fallback } } if (_operatingSystem == 0) { NSWarnFLog(@"Unable to determine O/S ... assuming GNU/Linux"); _operatingSystemName = @"GSGNULinuxOperatingSystem"; _operatingSystem = GSGNULinuxOperatingSystem; } } } - (NSUInteger) operatingSystem { if (_operatingSystem == 0) { determineOperatingSystem(); } return _operatingSystem; } - (NSString*) operatingSystemName { if (_operatingSystemName == 0) { determineOperatingSystem(); } return _operatingSystemName; } - (NSString *) operatingSystemVersionString { if (_operatingSystemVersion == nil) { determineOperatingSystem(); } return _operatingSystemVersion; } - (int) processIdentifier { int pid; #if defined(_WIN32) pid = (int)GetCurrentProcessId(); #else pid = (int)getpid(); #endif return pid; } - (NSString *) processName { return _gnu_processName; } - (void) setProcessName: (NSString *)newName { if (newName && [newName length]) { [_gnu_processName autorelease]; _gnu_processName = [newName copyWithZone: [self zone]]; } return; } - (NSUInteger) processorCount { static NSUInteger procCount = 0; static BOOL beenHere = NO; if (beenHere == NO) { #if defined(_WIN32) SYSTEM_INFO info; GetSystemInfo(&info); return info.dwNumberOfProcessors; #elif defined(_SC_NPROCESSORS_CONF) procCount = sysconf(_SC_NPROCESSORS_CONF); #elif defined(HAVE_SYSCTLBYNAME) int val; size_t len = sizeof(val); if (sysctlbyname("hw.ncpu", &val, &len, 0, 0) == 0) { procCount = val; } #elif defined(HAVE_PROCFS) NSFileManager *fileManager = [NSFileManager defaultManager]; if ([fileManager fileExistsAtPath: @"/proc/cpuinfo"]) { NSString *cpuInfo; NSArray *a; unsigned i; cpuInfo = [NSString stringWithContentsOfFile: @"/proc/cpuinfo"]; a = [cpuInfo componentsSeparatedByCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]]; // syntax is processor : # // count up each one for (i = 0; i < [a count]; ++i) { if ([[a objectAtIndex: i] isEqualToString: @"processor"]) { if (((i+1) < [a count]) && [[a objectAtIndex: i+1] isEqualToString: @":"]) { procCount++; } } } } #else #warning "no known way to determine number of processors on this system" #endif beenHere = YES; if (procCount == 0) { NSLog(@"Cannot determine processor count."); } } return procCount; } - (NSUInteger) activeProcessorCount { #if defined(_WIN32) SYSTEM_INFO info; int index; int count = 0; GetSystemInfo(&info); for (index = 0; index < 32; index++) { if (info.dwActiveProcessorMask & (1<)activity { // FIXME: unimplemented return; } - (void) performActivityWithOptions:(NSActivityOptions)options reason: (NSString *)reason usingBlock: (GSPerformActivityBlock)block { // FIXME: unimplemented return; } - (void) performExpiringActivityWithReason: (NSString *)reason usingBlock: (GSPerformExpiringActivityBlock)block { // FIXME: unimplemented return; } @end void GSInitializeProcess(int argc, char **argv, char **envp) { [NSProcessInfo class]; [procLock lock]; fallbackInitialisation = YES; _gnu_process_args(argc, argv, envp); [procLock unlock]; } #ifdef __ANDROID__ void GSInitializeProcessAndroid(JNIEnv *env, jobject context) { [NSProcessInfo class]; // create global reference to to prevent garbage collection _androidContext = (*env)->NewGlobalRef(env, context); // get package code path (path to APK) jclass cls = (*env)->GetObjectClass(env, context); jmethodID packageCodePathMethod = (*env)->GetMethodID(env, cls, "getPackageCodePath", "()Ljava/lang/String;"); jstring packageCodePathJava = (*env)->CallObjectMethod(env, context, packageCodePathMethod); const char *packageCodePath = (*env)->GetStringUTFChars(env, packageCodePathJava, NULL); // get package name jmethodID packageNameMethod = (*env)->GetMethodID(env, cls, "getPackageName", "()Ljava/lang/String;"); jstring packageNameJava = (*env)->CallObjectMethod(env, context, packageNameMethod); const char *packageName = (*env)->GetStringUTFChars(env, packageNameJava, NULL); // create fake executable path consisting of package code path (without .apk) // and package name as executable char *lastSlash = strrchr(packageCodePath, '/'); if (lastSlash == NULL) { lastSlash = (char *)packageCodePath + strlen(packageCodePath); } char *arg0; asprintf(&arg0, "%.*s/%s", (int)(lastSlash - packageCodePath), packageCodePath, packageName); (*env)->ReleaseStringUTFChars(env, packageCodePathJava, packageCodePath); (*env)->ReleaseStringUTFChars(env, packageNameJava, packageName); // initialize process [procLock lock]; fallbackInitialisation = YES; char *argv[] = { arg0, "-GSLogSyslog", "YES" // use syslog (available via logcat) instead of stdout/stderr (not available on Android) }; _gnu_process_args(sizeof(argv)/sizeof(char *), argv, NULL); [procLock unlock]; free(arg0); // get File class and path method jclass fileCls = (*env)->FindClass(env, "java/io/File"); jmethodID getAbsolutePathMethod = (*env)->GetMethodID(env, fileCls, "getAbsolutePath", "()Ljava/lang/String;"); // get Android files dir jmethodID filesDirMethod = (*env)->GetMethodID(env, cls, "getFilesDir", "()Ljava/io/File;"); jobject filesDirObj = (*env)->CallObjectMethod(env, context, filesDirMethod); jstring filesDirJava = (*env)->CallObjectMethod(env, filesDirObj, getAbsolutePathMethod); const jchar *filesDirUnichars = (*env)->GetStringChars(env, filesDirJava, NULL); jsize filesDirLength = (*env)->GetStringLength(env, filesDirJava); _androidFilesDir = [NSString stringWithCharacters:filesDirUnichars length:filesDirLength]; (*env)->ReleaseStringChars(env, filesDirJava, filesDirUnichars); // get Android cache dir jmethodID cacheDirMethod = (*env)->GetMethodID(env, cls, "getCacheDir", "()Ljava/io/File;"); jobject cacheDirObj = (*env)->CallObjectMethod(env, context, cacheDirMethod); jstring cacheDirJava = (*env)->CallObjectMethod(env, cacheDirObj, getAbsolutePathMethod); const jchar *cacheDirUnichars = (*env)->GetStringChars(env, cacheDirJava, NULL); jsize cacheDirLength = (*env)->GetStringLength(env, cacheDirJava); _androidCacheDir = [NSString stringWithCharacters:cacheDirUnichars length:cacheDirLength]; (*env)->ReleaseStringChars(env, cacheDirJava, cacheDirUnichars); // get asset manager and initialize NSBundle jmethodID assetManagerMethod = (*env)->GetMethodID(env, cls, "getAssets", "()Landroid/content/res/AssetManager;"); jstring assetManagerJava = (*env)->CallObjectMethod(env, context, assetManagerMethod); [NSBundle setJavaAssetManager:assetManagerJava withJNIEnv:env]; // clean up our NSTemporaryDirectory() if it exists NSString *tempDirName = [_androidCacheDir stringByAppendingPathComponent: @"tmp"]; [[NSFileManager defaultManager] removeItemAtPath:tempDirName error:NULL]; } #endif @implementation NSProcessInfo (GNUstep) + (void) initializeWithArguments: (char**)argv count: (int)argc environment: (char**)env { GSInitializeProcess(argc, argv, env); } - (BOOL) setLogFile: (NSString*)path { extern int _NSLogDescriptor; int desc; #if defined(_WIN32) desc = _wopen((wchar_t*)[path fileSystemRepresentation], O_RDWR|O_CREAT|O_APPEND, 0644); #else desc = open([path fileSystemRepresentation], O_RDWR|O_CREAT|O_APPEND, 0644); #endif if (desc >= 0) { if (_NSLogDescriptor >= 0 && _NSLogDescriptor != 2) { close(_NSLogDescriptor); } _NSLogDescriptor = desc; return YES; } return NO; } #ifdef __ANDROID__ - (jobject) androidContext { return _androidContext; } - (NSString *) androidFilesDir { return _androidFilesDir; } - (NSString *) androidCacheDir { return _androidCacheDir; } #endif @end BOOL GSPrivateEnvironmentFlag(const char *name, BOOL def) { const char *c = getenv(name); BOOL a = def; if (c != 0) { a = NO; if ((c[0] == 'y' || c[0] == 'Y') && (c[1] == 'e' || c[1] == 'E') && (c[2] == 's' || c[2] == 'S') && c[3] == 0) { a = YES; } else if ((c[0] == 't' || c[0] == 'T') && (c[1] == 'r' || c[1] == 'R') && (c[2] == 'u' || c[2] == 'U') && (c[3] == 'e' || c[3] == 'E') && c[4] == 0) { a = YES; } else if (isdigit(c[0]) && c[0] != '0') { a = YES; } } return a; } const char* GSPrivateArgZero() { if (_gnu_arg_zero == 0) return ""; else return _gnu_arg_zero; } gnustep-base-1.29.0/Source/NSProgress.m000066400000000000000000000252401435650067400177000ustar00rootroot00000000000000/* Definition of class NSProgress Copyright (C) 2019 Free Software Foundation, Inc. Written by: Gregory Casamento Date: July 2019 This file is part of the GNUstep Library. 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 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 USA. */ #define GS_NSProgress_IVARS \ NSProgressKind _kind; \ NSProgressFileOperationKind _fileOperationKind; \ NSURL *_fileUrl; \ BOOL _isFinished; \ BOOL _old; \ NSNumber *_estimatedTimeRemaining; \ NSNumber *_fileCompletedCount; \ NSNumber *_fileTotalCount; \ NSNumber *_throughput; \ int64_t _totalUnitCount; \ int64_t _completedUnitCount; \ double _fractionCompleted; \ NSMutableDictionary *_userInfo; \ BOOL _cancelled; \ BOOL _paused; \ BOOL _cancellable; \ BOOL _pausable; \ BOOL _indeterminate; \ BOOL _finished; \ GSProgressCancellationHandler _cancellationHandler; \ GSProgressPausingHandler _pausingHandler; \ NSProgressPublishingHandler _publishingHandler; \ NSProgressUnpublishingHandler _unpublishingHandler; \ GSProgressPendingUnitCountBlock _pendingUnitCountHandler; \ GSProgressResumingHandler _resumingHandler; \ NSString *_localizedDescription; \ NSString *_localizedAdditionalDescription; \ NSProgress *_parent; #define EXPOSE_NSProgress_IVARS #import #import #import #import #import #import #import #import #define GSInternal NSProgressInternal #include "GSInternal.h" GS_PRIVATE_INTERNAL(NSProgress) // NSProgress for current thread.... static NSProgress *__currentProgress = nil; static NSMutableDictionary *__subscribers = nil; @implementation NSProgress + (void) initialize { if (self == [NSProgress class]) { __subscribers = [[NSMutableDictionary alloc] initWithCapacity: 10]; } } // Creating progress objects... - (instancetype) initWithParent: (NSProgress *)parent userInfo: (NSDictionary *)userInfo { self = [super init]; if (self != nil) { GS_CREATE_INTERNAL(NSProgress); internal->_kind = nil; internal->_fileOperationKind = nil; internal->_fileUrl = nil; internal->_isFinished = NO; internal->_old = NO; internal->_estimatedTimeRemaining = nil; internal->_fileCompletedCount = nil; internal->_fileTotalCount = nil; internal->_throughput = nil; internal->_totalUnitCount = 0; internal->_completedUnitCount = 0; internal->_userInfo = RETAIN([userInfo mutableCopy]); internal->_cancelled = NO; internal->_cancellable = NO; internal->_paused = NO; internal->_pausable = NO; internal->_indeterminate = NO; internal->_finished = NO; internal->_localizedDescription = nil; internal->_localizedAdditionalDescription = nil; internal->_parent = parent; // this is a weak reference and not retained. } return self; } - (void) dealloc { RELEASE(internal->_fileOperationKind); RELEASE(internal->_kind); RELEASE(internal->_estimatedTimeRemaining); RELEASE(internal->_fileCompletedCount); RELEASE(internal->_fileTotalCount); RELEASE(internal->_throughput); RELEASE(internal->_userInfo); RELEASE(internal->_localizedDescription); RELEASE(internal->_localizedAdditionalDescription); [super dealloc]; } + (NSProgress *) discreteProgressWithTotalUnitCount: (int64_t)unitCount { NSProgress *p = [[NSProgress alloc] initWithParent: nil userInfo: [NSDictionary dictionary]]; [p setTotalUnitCount: unitCount]; return AUTORELEASE(p); } + (NSProgress *) progressWithTotalUnitCount: (int64_t)unitCount { NSProgress *p = [[NSProgress alloc] initWithParent: nil userInfo: [NSDictionary dictionary]]; [p setTotalUnitCount: unitCount]; return AUTORELEASE(p); } + (NSProgress *)progressWithTotalUnitCount: (int64_t)unitCount parent: (NSProgress *)parent pendingUnitCount: (int64_t)portionOfParentTotalUnitCount { NSProgress *p = [[NSProgress alloc] initWithParent: parent userInfo: [NSDictionary dictionary]]; [p setTotalUnitCount: portionOfParentTotalUnitCount]; return AUTORELEASE(p); } // Private methods - (void) _setParent: (NSProgress *)p { internal->_parent = p; // Not retained since this is defined in docs as a weak reference } - (NSProgress *) _parent { return internal->_parent; } // Current progress + (NSProgress *) currentProgress { return __currentProgress; } - (void) becomeCurrentWithPendingUnitCount: (int64_t)unitCount { [self setTotalUnitCount: unitCount]; __currentProgress = self; } - (void) addChild: (NSProgress *)child withPendingUnitCount: (int64_t)inUnitCount { [child _setParent: self]; [child setTotalUnitCount: inUnitCount]; } - (void) resignCurrent { int64_t completed = [__currentProgress completedUnitCount]; [__currentProgress setCompletedUnitCount: completed + [self totalUnitCount]]; } // Reporting progress - (int64_t) totalUnitCount { return internal->_totalUnitCount; } - (void) setTotalUnitCount: (int64_t)count { internal->_totalUnitCount = count; } - (int64_t) completedUnitCount { return internal->_completedUnitCount; } - (void) setCompletedUnitCount: (int64_t)count { internal->_completedUnitCount = count; [self willChangeValueForKey: @"fractionCompleted"]; internal->_fractionCompleted = (double)((double)internal->_completedUnitCount / (double)internal->_totalUnitCount); if(internal->_fractionCompleted >= 1) { [self willChangeValueForKey: @"finished"]; internal->_finished = YES; [self didChangeValueForKey: @"finished"]; } [self didChangeValueForKey: @"fractionCompleted"]; __currentProgress = nil; } - (NSString *) localizedDescription { return internal->_localizedDescription; } - (void) setLocalizedDescription: (NSString *)localDescription { ASSIGNCOPY(internal->_localizedDescription, localDescription); } - (NSString *) localizedAdditionalDescription { return internal->_localizedAdditionalDescription; } - (void) setLocalizedAdditionalDescription: (NSString *)localDescription { ASSIGNCOPY(internal->_localizedAdditionalDescription, localDescription); } // Observing progress - (double) fractionCompleted { return internal->_fractionCompleted; } // Controlling progress - (BOOL) isCancellable { return internal->_cancellable; } - (BOOL) isCancelled { return internal->_cancelled; } - (BOOL) cancelled { return internal->_cancelled; } - (void) cancel { [self willChangeValueForKey: @"cancelled"]; CALL_BLOCK_NO_ARGS(internal->_cancellationHandler); internal->_cancelled = YES; [self didChangeValueForKey: @"cancelled"]; } - (void) setCancellationHandler: (GSProgressCancellationHandler) handler { internal->_cancellationHandler = handler; } - (BOOL) isPausable { return internal->_pausable; } - (BOOL) isPaused { return internal->_paused; } - (void) pause { [self willChangeValueForKey: @"paused"]; CALL_BLOCK_NO_ARGS(internal->_pausingHandler); internal->_paused = YES; [self didChangeValueForKey: @"paused"]; } - (void) setPausingHandler: (GSProgressPausingHandler) handler { internal->_pausingHandler = handler; } - (void) resume { CALL_BLOCK_NO_ARGS(internal->_resumingHandler); } - (void) setResumingHandler: (GSProgressResumingHandler) handler { internal->_resumingHandler = handler; } // Progress Information - (BOOL) isIndeterminate { return internal->_indeterminate; } - (BOOL) indeterminate { return internal->_indeterminate; } - (void) setIndeterminate: (BOOL)flag { internal->_indeterminate = flag; } - (NSProgressKind) kind { return internal->_kind; } - (void) setKind: (NSProgressKind)k { ASSIGN(internal->_kind, k); } - (void)setUserInfoObject: (id)obj forKey: (NSProgressUserInfoKey)key { [internal->_userInfo setObject: obj forKey: key]; } - (GS_GENERIC_CLASS(NSDictionary,NSProgressUserInfoKey,id) *)userInfo { return AUTORELEASE([internal->_userInfo copy]); } // Instance property accessors... - (void) setFileOperationKind: (NSProgressFileOperationKind)k; { ASSIGN(internal->_fileOperationKind, k); } - (NSProgressFileOperationKind) fileOperationKind { return internal->_fileOperationKind; } - (void) setFileUrl: (NSURL *)u { ASSIGN(internal->_fileUrl, u); } - (NSURL*) fileUrl { return internal->_fileUrl; } - (BOOL) isFinished { return internal->_finished; } - (BOOL) finished { return internal->_finished; } - (BOOL) isOld { return internal->_old; } - (BOOL) old { return internal->_old; } - (void) setEstimatedTimeRemaining: (NSNumber *)n { ASSIGNCOPY(internal->_estimatedTimeRemaining, n); } - (NSNumber *) estimatedTimeRemaining { return internal->_estimatedTimeRemaining; } - (void) setFileCompletedCount: (NSNumber *)n { ASSIGNCOPY(internal->_fileCompletedCount, n); } - (NSNumber *) fileCompletedCount { return internal->_fileCompletedCount; } - (void) setFileTotalCount: (NSNumber *)n { ASSIGNCOPY(internal->_fileTotalCount, n); } - (NSNumber *) fileTotalCount { return internal->_fileTotalCount; } - (void) setThroughput: (NSNumber *)n { ASSIGNCOPY(internal->_throughput, n); } - (NSNumber *) throughtput { return internal->_throughput; } // Instance methods - (void) publish { CALL_BLOCK(internal->_publishingHandler, self); } - (void) unpublish { CALL_BLOCK_NO_ARGS(internal->_unpublishingHandler); } - (void) performAsCurrentWithPendingUnitCount: (int64_t)unitCount usingBlock: (GSProgressPendingUnitCountBlock)work { int64_t completed = [__currentProgress completedUnitCount]; // Do pending work... CALL_BLOCK_NO_ARGS(work); // Update completion count... [self setCompletedUnitCount: completed + unitCount]; } // Type methods + (id)addSubscriberForFileURL: (NSURL *)url withPublishingHandler: (NSProgressPublishingHandler)publishingHandler { // [__subscribers addObject: publishingHandler forObject: url]; return nil; } + (void) removeSubscriber: (id)subscriber { // [__subscribers removeObject: subscriber]; } @end gnustep-base-1.29.0/Source/NSPropertyList.m000066400000000000000000002664031435650067400205640ustar00rootroot00000000000000/** Interface for NSPropertyList for GNUstep Copyright (C) 2003,2004 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Fred Kiefer This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #import "GNUstepBase/GSMime.h" #import "Foundation/NSArray.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSByteOrder.h" #import "Foundation/NSCalendarDate.h" #import "Foundation/NSCharacterSet.h" #import "Foundation/NSData.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSError.h" #import "Foundation/NSException.h" #import "Foundation/NSHashTable.h" #import "Foundation/NSPropertyList.h" #import "Foundation/NSSerialization.h" #import "Foundation/NSStream.h" #import "Foundation/NSTimeZone.h" #import "Foundation/NSUserDefaults.h" #import "Foundation/NSValue.h" #import "Foundation/NSNull.h" #import "Foundation/NSXMLParser.h" #import "GNUstepBase/Unicode.h" #import "GNUstepBase/NSProcessInfo+GNUstepBase.h" #import "GNUstepBase/NSString+GNUstepBase.h" #import "GSPrivate.h" static id boolN = nil; static id boolY = nil; static const char *prefix = "\n" "\n" "\n"; @class GSSloppyXMLParser; #define inrange(ch,min,max) ((ch)>=(min) && (ch)<=(max)) #define char2num(ch) \ inrange(ch,'0','9') \ ? ((ch)-0x30) \ : (inrange(ch,'a','f') \ ? ((ch)-0x57) : ((ch)-0x37)) /* * Cache classes. */ static Class NSArrayClass; static Class NSDataClass; static Class NSDateClass; static Class NSDictionaryClass; static Class NSNumberClass; static Class NSStringClass; static Class NSMutableStringClass; static Class GSStringClass; static Class GSMutableStringClass; @class GSMutableDictionary; @interface GSMutableDictionary : NSObject // Help the compiler @end @interface GSXMLPListParser : NSObject { NSXMLParser *theParser; NSMutableString *value; NSMutableArray *stack; id key; BOOL inArray; BOOL inDictionary; BOOL inPCData; BOOL parsed; BOOL success; id plist; NSPropertyListMutabilityOptions opts; } - (id) initWithData: (NSData*)data mutability: (NSPropertyListMutabilityOptions)options; - (BOOL) parse; - (void) parser: (NSXMLParser *)parser foundCharacters: (NSString *)string; - (void) parser: (NSXMLParser *)parser didStartElement: (NSString *)elementName namespaceURI: (NSString *)namespaceURI qualifiedName: (NSString *)qualifiedName attributes: (NSDictionary *)attributeDict; - (void) parser: (NSXMLParser *)parser didEndElement: (NSString *)elementName namespaceURI: (NSString *)namespaceURI qualifiedName: (NSString *)qName; - (id) result; - (void) unescape; @end @interface GSSloppyXMLParser : NSXMLParser @end @implementation GSXMLPListParser - (void) dealloc { RELEASE(key); RELEASE(stack); RELEASE(plist); RELEASE(value); RELEASE(theParser); [super dealloc]; } - (id) initWithData: (NSData*)data mutability: (NSPropertyListMutabilityOptions)options { if ((self = [super init]) != nil) { theParser = [[GSSloppyXMLParser alloc] initWithData: data]; [theParser setDelegate: self]; opts = options; } return self; } - (void) parser: (NSXMLParser *)parser foundCharacters: (NSString *)string { if (YES == inPCData) { [value appendString: string]; } else { [value appendString: [string stringByTrimmingSpaces]]; } } - (void) parser: (NSXMLParser *)parser foundIgnorableWhitespace: (NSString *)string { if (YES == inPCData) { [value appendString: string]; } } - (void) parser: (NSXMLParser *)parser didStartElement: (NSString *)elementName namespaceURI: (NSString *)namespaceURI qualifiedName: (NSString *)qualifiedName attributes: (NSDictionary *)attributeDict { if ([elementName isEqualToString: @"dict"] == YES) { NSMutableDictionary *d; if (key == nil) { key = [[NSNull null] retain]; } [stack addObject: key]; DESTROY(key); d = [[NSMutableDictionary alloc] initWithCapacity: 10]; [stack addObject: d]; RELEASE(d); inDictionary = YES; inArray = NO; } else if ([elementName isEqualToString: @"array"] == YES) { NSMutableArray *a; if (key == nil) { key = [[NSNull null] retain]; } [stack addObject: key]; DESTROY(key); a = [[NSMutableArray alloc] initWithCapacity: 10]; [stack addObject: a]; RELEASE(a); inArray = YES; inDictionary = NO; } else if ([elementName isEqualToString: @"plist"] == NO) { inPCData = YES; } } - (void) parser: (NSXMLParser *)parser didEndElement: (NSString *)elementName namespaceURI: (NSString *)namespaceURI qualifiedName: (NSString *)qName { BOOL inContainer = NO; inPCData = NO; if ([elementName isEqualToString: @"dict"] == YES) { inContainer = YES; } else if ([elementName isEqualToString: @"array"] == YES) { inContainer = YES; } if (inContainer) { if (opts != NSPropertyListImmutable) { ASSIGN(plist, [stack lastObject]); } else { NSObject *o = [stack lastObject]; if ([o makeImmutable] == YES) { ASSIGN(plist, o); } else { ASSIGNCOPY(plist, o); } } [stack removeLastObject]; inArray = NO; inDictionary = NO; ASSIGN(key, [stack lastObject]); [stack removeLastObject]; if ((id)key == (id)[NSNull null]) { DESTROY(key); } if ([stack count] > 0) { id last; last = [stack lastObject]; if ([last isKindOfClass: NSArrayClass] == YES) { inArray = YES; } else if ([last isKindOfClass: NSDictionaryClass] == YES) { inDictionary = YES; } } } else if ([elementName isEqualToString: @"key"] == YES) { [self unescape]; ASSIGNCOPY(key, value); [value setString: @""]; return; } else if ([elementName isEqualToString: @"data"]) { NSData *d; d = [GSMimeDocument decodeBase64: [value dataUsingEncoding: NSASCIIStringEncoding]]; if (opts == NSPropertyListMutableContainersAndLeaves) { d = AUTORELEASE([d mutableCopy]); } ASSIGN(plist, d); if (d == nil) { [parser abortParsing]; return; } } else if ([elementName isEqualToString: @"date"]) { id result; if ([value hasSuffix: @"Z"] == YES && [value length] == 20) { result = [NSCalendarDate dateWithString: value calendarFormat: @"%Y-%m-%dT%H:%M:%SZ"]; } else { result = [NSCalendarDate dateWithString: value calendarFormat: @"%Y-%m-%d %H:%M:%S %z"]; } ASSIGN(plist, result); } else if ([elementName isEqualToString: @"string"]) { id o; [self unescape]; if (opts == NSPropertyListMutableContainersAndLeaves) { o = [value mutableCopy]; } else { o = [value copy]; } ASSIGN(plist, o); [o release]; } else if ([elementName isEqualToString: @"integer"]) { if ([value hasPrefix: @"-"]) { ASSIGN(plist, [NSNumber numberWithLongLong: [value longLongValue]]); } else { ASSIGN(plist, [NSNumber numberWithUnsignedLongLong: (unsigned long long)[value longLongValue]]); } } else if ([elementName isEqualToString: @"real"]) { ASSIGN(plist, [NSNumber numberWithDouble: strtod([value cString], NULL)]); } else if ([elementName isEqualToString: @"true"]) { ASSIGN(plist, boolY); } else if ([elementName isEqualToString: @"false"]) { ASSIGN(plist, boolN); } else if ([elementName isEqualToString: @"plist"]) { [value setString: @""]; return; } else // invalid tag { // NSLog(@"unrecognized tag <%@>", elementName); [parser abortParsing]; return; } if (inArray == YES) { [[stack lastObject] addObject: plist]; } else if (inDictionary == YES) { if (key == nil) { [parser abortParsing]; return; } [(NSMutableDictionary*)[stack lastObject] setObject: plist forKey: key]; DESTROY(key); } [value setString: @""]; } - (BOOL) parse { if (parsed == NO) { parsed = YES; stack = [[NSMutableArray alloc] initWithCapacity: 10]; value = [[NSMutableString alloc] initWithCapacity: 50]; success = [theParser parse]; } return success; } - (id) result { return plist; } - (void) unescape { id o; NSRange r; /* Convert any \Uxxxx sequences to unicode characters. */ r = NSMakeRange(0, [value length]); while (r.length >= 6) { r = [value rangeOfString: @"\\U" options: NSLiteralSearch range: r]; if (r.length == 2 && [value length] >= r.location + 6) { unichar c; unichar v; c = [value characterAtIndex: r.location + 2]; if (isxdigit(c)) { v = char2num(c); c = [value characterAtIndex: r.location + 3]; if (isxdigit(c)) { v <<= 4; v |= char2num(c); c = [value characterAtIndex: r.location + 4]; if (isxdigit(c)) { v <<= 4; v |= char2num(c); c = [value characterAtIndex: r.location + 5]; if (isxdigit(c)) { v <<= 4; v |= char2num(c); o = [NSString alloc]; o = [o initWithCharacters: &v length: 1]; r.length += 4; [value replaceCharactersInRange: r withString: o]; [o release]; r.location++; r.length = 0; } } } } r = NSMakeRange(NSMaxRange(r), [value length] - NSMaxRange(r)); } } } @end @interface GSBinaryPLParser : NSObject { NSPropertyListMutabilityOptions mutability; unsigned _length; const unsigned char *_bytes; NSData *data; unsigned offset_size; // Number of bytes per table entry unsigned index_size; // Number of bytes per table entry unsigned object_count; // Number of objects unsigned root_index; // Index of root object unsigned table_start; // Start address of object table NSHashTable *_stack; // The stack of objects we are currently parsing } - (id) initWithData: (NSData*)plData mutability: (NSPropertyListMutabilityOptions)m; - (id) rootObject; - (id) objectAtIndex: (NSUInteger)index; @end @interface GSBinaryPLGenerator : NSObject { NSMutableData *dest; NSMapTable *objectList; NSMutableArray *objectsToDoList; id root; // Number of bytes per object table index unsigned int index_size; // Number of bytes per object table entry unsigned int offset_size; unsigned int table_start; unsigned int table_size; unsigned int *table; } + (void) serializePropertyList: (id)aPropertyList intoData: (NSMutableData *)destination; - (id) initWithPropertyList: (id)aPropertyList intoData: (NSMutableData *)destination; - (void) generate; - (BOOL) storeObject: (id)object; - (void) cleanup; @end static Class plArray; static id (*plAdd)(id, SEL, id) = 0; static Class plDictionary; static id (*plSet)(id, SEL, id, id) = 0; /* Bitmap of 'quotable' characters ... those characters which must be * inside a quoted string if written to an old style property list. */ static const unsigned char quotables[32] = { '\xff', '\xff', '\xff', '\xff', '\x85', '\x13', '\x00', '\x78', '\x00', '\x00', '\x00', '\x38', '\x01', '\x00', '\x00', '\xa8', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', }; /* Bitmap of characters considered white space if in an old style property * list. This is the same as the set given by the isspace() function in the * POSIX locale, but (for cross-locale portability of property list files) * is fixed, rather than locale dependent. */ static const unsigned char whitespace[32] = { '\x00', '\x3f', '\x00', '\x00', '\x01', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', }; #define IS_BIT_SET(a,i) ((((a) & (1<<(i)))) > 0) #define GS_IS_QUOTABLE(X) IS_BIT_SET(quotables[(X)/8], (X) % 8) #define GS_IS_WHITESPACE(X) IS_BIT_SET(whitespace[(X)/8], (X) % 8) static NSCharacterSet *oldQuotables = nil; static NSCharacterSet *xmlQuotables = nil; typedef struct { const unsigned char *ptr; unsigned end; unsigned pos; unsigned lin; NSString *err; NSPropertyListMutabilityOptions opt; BOOL key; BOOL old; } pldata; /* * Property list parsing - skip whitespace keeping count of lines and * regarding objective-c style comments as whitespace. * Returns YES if there is any non-whitespace text remaining. */ static BOOL skipSpace(pldata *pld) { unsigned char c; while (pld->pos < pld->end) { c = pld->ptr[pld->pos]; if (GS_IS_WHITESPACE(c) == NO) { if (c == '/' && pld->pos < pld->end - 1) { /* * Check for comments beginning '/' followed by '/' or '*' */ if (pld->ptr[pld->pos + 1] == '/') { pld->pos += 2; while (pld->pos < pld->end) { c = pld->ptr[pld->pos]; if (c == '\n') { break; } pld->pos++; } if (pld->pos >= pld->end) { pld->err = @"reached end of string in comment"; return NO; } } else if (pld->ptr[pld->pos + 1] == '*') { pld->pos += 2; while (pld->pos < pld->end) { c = pld->ptr[pld->pos]; if (c == '\n') { pld->lin++; } else if (c == '*' && pld->pos < pld->end - 1 && pld->ptr[pld->pos+1] == '/') { pld->pos++; /* Skip past '*' */ break; } pld->pos++; } if (pld->pos >= pld->end) { pld->err = @"reached end of string in comment"; return NO; } } else { return YES; } } else { return YES; } } if (c == '\n') { pld->lin++; } pld->pos++; } pld->err = @"reached end of string"; return NO; } static inline id parseQuotedString(pldata* pld) { unsigned start = ++pld->pos; unsigned escaped = 0; unsigned shrink = 0; BOOL hex = NO; NSString *obj; while (pld->pos < pld->end) { unsigned char c = pld->ptr[pld->pos]; if (escaped) { if (escaped == 1 && c >= '0' && c <= '7') { escaped = 2; hex = NO; } else if (escaped == 1 && (c == 'u' || c == 'U')) { escaped = 2; hex = YES; } else if (escaped > 1) { if (hex && isxdigit(c)) { shrink++; escaped++; if (escaped == 6) { escaped = 0; } } else if (c >= '0' && c <= '7') { shrink++; escaped++; if (escaped == 4) { escaped = 0; } } else { pld->pos--; escaped = 0; } } else { escaped = 0; } } else { if (c == '\\') { escaped = 1; shrink++; } else if (c == '"') { break; } } if (c == '\n') pld->lin++; pld->pos++; } if (pld->pos >= pld->end) { pld->err = @"reached end of string while parsing quoted string"; return nil; } if (pld->pos - start - shrink == 0) { obj = @""; } else { unsigned length; unichar *chars; unichar *temp = NULL; unsigned int temp_length = 0; unsigned j; unsigned k; if (!GSToUnicode(&temp, &temp_length, &pld->ptr[start], pld->pos - start, NSUTF8StringEncoding, NSDefaultMallocZone(), 0)) { pld->err = @"invalid utf8 data while parsing quoted string"; return nil; } length = temp_length - shrink; chars = NSAllocateCollectable(sizeof(unichar) * length, 0); escaped = 0; hex = NO; for (j = 0, k = 0; j < temp_length; j++) { unichar c = temp[j]; if (escaped) { if (escaped == 1 && c >= '0' && c <= '7') { chars[k] = c - '0'; hex = NO; escaped++; } else if (escaped == 1 && (c == 'u' || c == 'U')) { chars[k] = 0; hex = YES; escaped++; } else if (escaped > 1) { if (hex && isxdigit(c)) { chars[k] <<= 4; chars[k] |= char2num(c); escaped++; if (escaped == 6) { escaped = 0; k++; } } else if (c >= '0' && c <= '7') { chars[k] <<= 3; chars[k] |= (c - '0'); escaped++; if (escaped == 4) { escaped = 0; k++; } } else { escaped = 0; j--; k++; } } else { escaped = 0; switch (c) { case 'a' : chars[k] = '\a'; break; case 'b' : chars[k] = '\b'; break; case 't' : chars[k] = '\t'; break; case 'r' : chars[k] = '\r'; break; case 'n' : chars[k] = '\n'; break; case 'v' : chars[k] = '\v'; break; case 'f' : chars[k] = '\f'; break; default : chars[k] = c; break; } k++; } } else { chars[k] = c; if (c == '\\') { escaped = 1; } else { k++; } } } NSZoneFree(NSDefaultMallocZone(), temp); length = k; if (pld->key == NO && pld->opt == NSPropertyListMutableContainersAndLeaves) { obj = [GSMutableString alloc]; obj = [obj initWithCharactersNoCopy: chars length: length freeWhenDone: YES]; } else { obj = [NSStringClass allocWithZone: NSDefaultMallocZone()]; obj = [obj initWithCharactersNoCopy: chars length: length freeWhenDone: YES]; } } pld->pos++; return obj; } static inline id parseUnquotedString(pldata *pld) { unsigned start = pld->pos; unsigned i; unsigned length; id obj; unichar *chars; while (pld->pos < pld->end) { if (GS_IS_QUOTABLE(pld->ptr[pld->pos]) == YES) break; pld->pos++; } length = pld->pos - start; chars = NSAllocateCollectable(sizeof(unichar) * length, 0); for (i = 0; i < length; i++) { chars[i] = pld->ptr[start + i]; } if (pld->key == NO && pld->opt == NSPropertyListMutableContainersAndLeaves) { obj = [GSMutableString alloc]; obj = [obj initWithCharactersNoCopy: chars length: length freeWhenDone: YES]; } else { obj = [NSStringClass allocWithZone: NSDefaultMallocZone()]; obj = [obj initWithCharactersNoCopy: chars length: length freeWhenDone: YES]; } return obj; } static id parsePlItem(pldata* pld) { id result = nil; BOOL start = (pld->pos == 0 ? YES : NO); if (skipSpace(pld) == NO) { return nil; } switch (pld->ptr[pld->pos]) { case '{': { NSMutableDictionary *dict; dict = [[plDictionary allocWithZone: NSDefaultMallocZone()] initWithCapacity: 0]; pld->pos++; while (skipSpace(pld) == YES && pld->ptr[pld->pos] != '}') { id key; id val; pld->key = YES; key = parsePlItem(pld); pld->key = NO; if (key == nil) { return nil; } if (skipSpace(pld) == NO) { RELEASE(key); RELEASE(dict); return nil; } if (pld->ptr[pld->pos] != '=') { pld->err = @"unexpected character (wanted '=')"; RELEASE(key); RELEASE(dict); return nil; } pld->pos++; val = parsePlItem(pld); if (val == nil) { RELEASE(key); RELEASE(dict); return nil; } if (skipSpace(pld) == NO) { RELEASE(key); RELEASE(val); RELEASE(dict); return nil; } if (pld->ptr[pld->pos] == ';') { pld->pos++; } else if (pld->ptr[pld->pos] == '}') { if (GSPrivateDefaultsFlag(GSMacOSXCompatible)) { pld->err = @"unexpected character '}' (wanted ';')"; RELEASE(key); RELEASE(val); RELEASE(dict); return nil; } else { NSWarnFLog( @"Missing semicolon in dictionary at line %d char %d", pld->lin + 1, pld->pos + 1); } } else { pld->err = @"unexpected character (wanted ';' or '}')"; RELEASE(key); RELEASE(val); RELEASE(dict); return nil; } (*plSet)(dict, @selector(setObject:forKey:), val, key); RELEASE(key); RELEASE(val); } if (pld->pos >= pld->end) { pld->err = @"unexpected end of string when parsing dictionary"; RELEASE(dict); return nil; } pld->pos++; result = dict; if (pld->opt == NSPropertyListImmutable) { result = GS_IMMUTABLE(result); } } break; case '(': { NSMutableArray *array; array = [[plArray allocWithZone: NSDefaultMallocZone()] initWithCapacity: 0]; pld->pos++; while (skipSpace(pld) == YES && pld->ptr[pld->pos] != ')') { id val; val = parsePlItem(pld); if (val == nil) { RELEASE(array); return nil; } if (skipSpace(pld) == NO) { RELEASE(val); RELEASE(array); return nil; } if (pld->ptr[pld->pos] == ',') { pld->pos++; } else if (pld->ptr[pld->pos] != ')') { pld->err = @"unexpected character (wanted ',' or ')')"; RELEASE(val); RELEASE(array); return nil; } (*plAdd)(array, @selector(addObject:), val); RELEASE(val); } if (pld->pos >= pld->end) { pld->err = @"unexpected end of string when parsing array"; RELEASE(array); return nil; } pld->pos++; result = array; if (pld->opt == NSPropertyListImmutable) { result = GS_IMMUTABLE(result); } } break; case '<': pld->pos++; if (pld->pos < pld->end && pld->ptr[pld->pos] == '*') { const unsigned char *ptr; unsigned min; unsigned len = 0; unsigned i; pld->old = NO; pld->pos++; min = pld->pos; ptr = &(pld->ptr[min]); while (pld->pos < pld->end && pld->ptr[pld->pos] != '>') { pld->pos++; } len = pld->pos - min; if (len > 1) { unsigned char type = *ptr++; len--; // Allow for quoted values. if (len > 2 && '"' == ptr[0] && '"' == ptr[len - 1]) { len -= 2; ptr++; } if (type == 'I') { char buf[len+1]; for (i = 0; i < len; i++) buf[i] = (char)ptr[i]; buf[len] = '\0'; if ('-' == buf[0]) { result = [[NSNumber alloc] initWithLongLong: atoll(buf)]; } else { result = [[NSNumber alloc] initWithUnsignedLongLong: strtoull(buf, NULL, 10)]; } } else if (type == 'B') { if (ptr[0] == 'Y') { result = [boolY retain]; } else if (ptr[0] == 'N') { result = [boolN retain]; } else { pld->err = @"bad value for bool"; return nil; } } else if (type == 'D') { unichar buf[len]; unsigned i; NSString *str; for (i = 0; i < len; i++) buf[i] = ptr[i]; str = [[NSString alloc] initWithCharacters: buf length: len]; result = [[NSCalendarDate alloc] initWithString: str calendarFormat: @"%Y-%m-%d %H:%M:%S %z"]; RELEASE(str); } else if (type == 'R') { char buf[len+1]; for (i = 0; i < len; i++) buf[i] = ptr[i]; buf[len] = '\0'; result = [[NSNumber alloc] initWithDouble: strtod(buf, NULL)]; } else { pld->err = @"unrecognized type code after '<*'"; return nil; } } else { pld->err = @"missing type code after '<*'"; return nil; } if (pld->pos >= pld->end) { pld->err = @"unexpected end of string when parsing data"; return nil; } if (pld->ptr[pld->pos] != '>') { pld->err = @"unexpected character (wanted '>')"; return nil; } pld->pos++; } else if (pld->pos < pld->end && pld->ptr[pld->pos] == '[') { const unsigned char *ptr; unsigned min; unsigned len; pld->old = NO; pld->pos++; min = pld->pos; ptr = &(pld->ptr[min]); while (pld->pos < pld->end && pld->ptr[pld->pos] != ']') { pld->pos++; } len = pld->pos - min; if (pld->pos >= pld->end) { pld->err = @"unexpected end of string when parsing data"; return nil; } pld->pos++; if (pld->pos >= pld->end) { pld->err = @"unexpected end of string when parsing ']>'"; return nil; } if (pld->ptr[pld->pos] != '>') { pld->err = @"unexpected character (wanted '>')"; return nil; } pld->pos++; if (0 == len) { if (pld->key == NO && pld->opt == NSPropertyListMutableContainersAndLeaves) { result = [NSMutableData new]; } else { result = [NSData new]; } } else { NSData *d; d = [[NSData alloc] initWithBytesNoCopy: (void*)ptr length: len freeWhenDone: NO]; NS_DURING { if (pld->key == NO && pld->opt == NSPropertyListMutableContainersAndLeaves) { result = [[NSMutableData alloc] initWithBase64EncodedData: d options: NSDataBase64DecodingIgnoreUnknownCharacters]; } else { result = [[NSData alloc] initWithBase64EncodedData: d options: NSDataBase64DecodingIgnoreUnknownCharacters]; } } NS_HANDLER { pld->err = @"invalid base64 data"; result = nil; } NS_ENDHANDLER RELEASE(d); } } else { unsigned max = pld->pos; unsigned char *buf; unsigned len = 0; while (max < pld->end && pld->ptr[max] != '>') { if (isxdigit(pld->ptr[max])) { len++; } max++; } if (max >= pld->end) { pld->err = @"unexpected end of string when parsing data"; return nil; } buf = NSZoneMalloc(NSDefaultMallocZone(), (len + 1) / 2); // We permit (but do not require) space before hex octets (void)skipSpace(pld); len = 0; while (pld->pos < max && isxdigit(pld->ptr[pld->pos]) && isxdigit(pld->ptr[pld->pos+1])) { unsigned char byte; byte = (char2num(pld->ptr[pld->pos])) << 4; pld->pos++; byte |= char2num(pld->ptr[pld->pos]); pld->pos++; buf[len++] = byte; // We permit (but do not require) space between/after hex octets (void)skipSpace(pld); } if (pld->ptr[pld->pos] != '>') { NSZoneFree(NSDefaultMallocZone(), buf); pld->err = @"unexpected character (wanted '>')"; return nil; } pld->pos++; if (pld->key == NO && pld->opt == NSPropertyListMutableContainersAndLeaves) { result = [[NSMutableData alloc] initWithBytesNoCopy: buf length: len freeWhenDone: YES]; } else { result = [[NSData alloc] initWithBytesNoCopy: buf length: len freeWhenDone: YES]; } } break; case '"': result = parseQuotedString(pld); break; default: result = parseUnquotedString(pld); break; } if (YES == start && result != nil && nil == pld->err) { if (skipSpace(pld) == YES) { pld->err = @"extra data after parsed string"; result = nil; // Not at end of string. } else { pld->err = nil; // end expcted } } return result; } id GSPropertyListFromStringsFormat(NSString *string) { NSMutableDictionary *dict; pldata _pld; pldata *pld = &_pld; NSData *d; /* * An empty string is a nil property list. */ if ([string length] == 0) { return nil; } d = [string dataUsingEncoding: NSUTF8StringEncoding]; NSCAssert(d, @"Couldn't get utf8 data from string."); _pld.ptr = (unsigned char*)[d bytes]; _pld.pos = 0; _pld.end = [d length]; _pld.err = nil; _pld.lin = 0; _pld.opt = NSPropertyListImmutable; _pld.key = NO; _pld.old = YES; // OpenStep style [NSPropertyListSerialization class]; // initialise dict = [[plDictionary allocWithZone: NSDefaultMallocZone()] initWithCapacity: 0]; while (skipSpace(pld) == YES) { id key; id val; if (pld->ptr[pld->pos] == '"') { key = parseQuotedString(pld); } else { key = parseUnquotedString(pld); } if (key == nil) { DESTROY(dict); break; } if (skipSpace(pld) == NO) { pld->err = @"incomplete final entry (no semicolon?)"; RELEASE(key); DESTROY(dict); break; } if (pld->ptr[pld->pos] == ';') { pld->pos++; (*plSet)(dict, @selector(setObject:forKey:), @"", key); RELEASE(key); } else if (pld->ptr[pld->pos] == '=') { pld->pos++; if (skipSpace(pld) == NO) { RELEASE(key); DESTROY(dict); break; } if (pld->ptr[pld->pos] == '"') { val = parseQuotedString(pld); } else { val = parseUnquotedString(pld); } if (val == nil) { RELEASE(key); DESTROY(dict); break; } if (skipSpace(pld) == NO) { pld->err = @"missing final semicolon"; RELEASE(key); RELEASE(val); DESTROY(dict); break; } (*plSet)(dict, @selector(setObject:forKey:), val, key); RELEASE(key); RELEASE(val); if (pld->ptr[pld->pos] == ';') { pld->pos++; } else { pld->err = @"unexpected character (wanted ';')"; DESTROY(dict); break; } } else { pld->err = @"unexpected character (wanted '=' or ';')"; RELEASE(key); DESTROY(dict); break; } } if (dict == nil && _pld.err != nil) { RELEASE(dict); [NSException raise: NSGenericException format: @"Parse failed at line %d (char %d) - %@", _pld.lin + 1, _pld.pos + 1, _pld.err]; } return AUTORELEASE(dict); } #include static void encodeBase64(NSData *source, NSMutableData *dest) { NSUInteger length = [source length]; if (length > 0) { NSUInteger base = [dest length]; NSUInteger destlen = 4 * ((length + 2) / 3); [dest setLength: base + destlen]; GSPrivateEncodeBase64((const uint8_t*)[source bytes], length, (uint8_t*)[dest mutableBytes] + base); } } /* * Output a string escaped for OpenStep style property lists. * The result is ascii data. */ static void PString(NSString *obj, NSMutableData *output) { unsigned length; if ((length = [obj length]) == 0) { [output appendBytes: "\"\"" length: 2]; } else if ([obj rangeOfCharacterFromSet: oldQuotables].length > 0 || [obj characterAtIndex: 0] == '/') { unichar *from; unichar *end; unsigned char *ptr; int base = [output length]; int len = 0; GS_BEGINITEMBUF(ustring, (length * sizeof(unichar)), unichar) end = &ustring[length]; [obj getCharacters: ustring]; for (from = ustring; from < end; from++) { switch (*from) { case '\t': case '\r': case '\n': len++; break; case '\a': case '\b': case '\v': case '\f': case '\\': case '"' : len += 2; break; default: if (*from < 128) { if (isprint(*from) || *from == ' ') { len++; } else { len += 4; } } else { len += 6; } break; } } [output setLength: base + len + 2]; ptr = [output mutableBytes] + base; *ptr++ = '"'; for (from = ustring; from < end; from++) { switch (*from) { case '\t': case '\r': case '\n': *ptr++ = *from; break; case '\a': *ptr++ = '\\'; *ptr++ = 'a'; break; case '\b': *ptr++ = '\\'; *ptr++ = 'b'; break; case '\v': *ptr++ = '\\'; *ptr++ = 'v'; break; case '\f': *ptr++ = '\\'; *ptr++ = 'f'; break; case '\\': *ptr++ = '\\'; *ptr++ = '\\'; break; case '"' : *ptr++ = '\\'; *ptr++ = '"'; break; default: if (*from < 128) { if (isprint(*from) || *from == ' ') { *ptr++ = *from; } else { unichar c = *from; *ptr++ = '\\'; ptr[2] = (c & 7) + '0'; c >>= 3; ptr[1] = (c & 7) + '0'; c >>= 3; ptr[0] = (c & 7) + '0'; ptr += 3; } } else { unichar c = *from; *ptr++ = '\\'; *ptr++ = 'U'; ptr[3] = (c & 15) > 9 ? (c & 15) + 55 : (c & 15) + 48; c >>= 4; ptr[2] = (c & 15) > 9 ? (c & 15) + 55 : (c & 15) + 48; c >>= 4; ptr[1] = (c & 15) > 9 ? (c & 15) + 55 : (c & 15) + 48; c >>= 4; ptr[0] = (c & 15) > 9 ? (c & 15) + 55 : (c & 15) + 48; ptr += 4; } break; } } *ptr = '"'; GS_ENDITEMBUF(); } else { NSData *d = [obj dataUsingEncoding: NSASCIIStringEncoding]; [output appendData: d]; } } /* * Output a string escaped for use in xml. * Result is utf8 data. */ static void XString(NSString* obj, NSMutableData *output) { static const char *hexdigits = "0123456789ABCDEF"; unsigned end; end = [obj length]; if (end == 0) { return; } if ([obj rangeOfCharacterFromSet: xmlQuotables].length > 0) { unichar *base; unichar *map; unichar c; unsigned len; unsigned rpos; unsigned wpos; BOOL osx; osx = GSPrivateDefaultsFlag(GSMacOSXCompatible); base = NSAllocateCollectable(sizeof(unichar) * end, 0); [obj getCharacters: base]; for (len = rpos = 0; rpos < end; rpos++) { c = base[rpos]; switch (c) { case '&': len += 5; break; case '<': case '>': len += 4; break; case '\'': case '"': len += 6; break; default: if ((c < 0x20 && (c != 0x09 && c != 0x0A && c != 0x0D)) || (c > 0xD7FF && c < 0xE000) || c > 0xFFFD) { if (osx) { len += 8; // Illegal in XML } else { len += 6; // Non-standard escape } } else { len++; } break; } } map = NSAllocateCollectable(sizeof(unichar) * len, 0); for (wpos = rpos = 0; rpos < end; rpos++) { c = base[rpos]; switch (c) { case '&': map[wpos++] = '&'; map[wpos++] = 'a'; map[wpos++] = 'm'; map[wpos++] = 'p'; map[wpos++] = ';'; break; case '<': map[wpos++] = '&'; map[wpos++] = 'l'; map[wpos++] = 't'; map[wpos++] = ';'; break; case '>': map[wpos++] = '&'; map[wpos++] = 'g'; map[wpos++] = 't'; map[wpos++] = ';'; break; case '\'': map[wpos++] = '&'; map[wpos++] = 'a'; map[wpos++] = 'p'; map[wpos++] = 'o'; map[wpos++] = 's'; map[wpos++] = ';'; break; case '"': map[wpos++] = '&'; map[wpos++] = 'q'; map[wpos++] = 'u'; map[wpos++] = 'o'; map[wpos++] = 't'; map[wpos++] = ';'; break; default: if ((c < 0x20 && (c != 0x09 && c != 0x0A && c != 0x0D)) || (c > 0xD7FF && c < 0xE000) || c > 0xFFFD) { if (osx) { /* Use XML style character entity references for * OSX compatibility, even though this is an * illegal character code and a standards complient * XML parser will barf when it tries to read it. * The OSX property list parser does not implement * the XML standard and accepts at least some * illegal characters. */ map[wpos++] = '&'; map[wpos++] = '#'; map[wpos++] = 'x'; map[wpos++] = hexdigits[(c>>12) & 0xf]; map[wpos++] = hexdigits[(c>>8) & 0xf]; map[wpos++] = hexdigits[(c>>4) & 0xf]; map[wpos++] = hexdigits[c & 0xf]; map[wpos++] = ';'; } else { /* We need to be able to encode characters in a * property list which are illegal in XML (even * when encoded as numeric entities with the * &#...; format. So we use the same \Uxxxx * format is in old style property lists. */ map[wpos++] = '\\'; map[wpos++] = 'U'; map[wpos++] = hexdigits[(c>>12) & 0xf]; map[wpos++] = hexdigits[(c>>8) & 0xf]; map[wpos++] = hexdigits[(c>>4) & 0xf]; map[wpos++] = hexdigits[c & 0xf]; } } else { map[wpos++] = c; } break; } } NSZoneFree(NSDefaultMallocZone(), base); obj = [[NSString alloc] initWithCharacters: map length: len]; NSZoneFree(NSDefaultMallocZone(), map); [output appendData: [obj dataUsingEncoding: NSUTF8StringEncoding]]; RELEASE(obj); } else { [output appendData: [obj dataUsingEncoding: NSUTF8StringEncoding]]; } } static const char *indentStrings[] = { "", " ", " ", " ", "\t", "\t ", "\t ", "\t ", "\t\t", "\t\t ", "\t\t ", "\t\t ", "\t\t\t", "\t\t\t ", "\t\t\t ", "\t\t\t ", "\t\t\t\t", "\t\t\t\t ", "\t\t\t\t ", "\t\t\t\t ", "\t\t\t\t\t", "\t\t\t\t\t ", "\t\t\t\t\t ", "\t\t\t\t\t ", "\t\t\t\t\t\t" }; /** * obj is the object to be written out
* loc is the locale for formatting (or nil to indicate no formatting)
* lev is the level of indentation to use
* step is the indentation step (0 == 0, 1 = 2, 2 = 4, 3 = 8)
* x is an indicator for xml or old/new openstep property list format
* dest is the output buffer. */ static void OAppend(id obj, NSDictionary *loc, unsigned lev, unsigned step, NSPropertyListFormat x, NSMutableData *dest) { if (step > 3) { step = 3; } if (NSStringClass == 0) { [NSPropertyListSerialization class]; // Force initialisation } if ([obj isKindOfClass: NSStringClass]) { if (x == NSPropertyListXMLFormat_v1_0) { [dest appendBytes: "" length: 8]; XString(obj, dest); [dest appendBytes: "\n" length: 10]; } else { PString(obj, dest); } } else if (obj == boolY) { if (x == NSPropertyListXMLFormat_v1_0) { [dest appendBytes: "\n" length: 8]; } else if (x == NSPropertyListGNUstepFormat) { [dest appendBytes: "<*BY>" length: 5]; } else { PString([obj description], dest); } } else if (obj == boolN) { if (x == NSPropertyListXMLFormat_v1_0) { [dest appendBytes: "\n" length: 9]; } else if (x == NSPropertyListGNUstepFormat) { [dest appendBytes: "<*BN>" length: 5]; } else { PString([obj description], dest); } } else if ([obj isKindOfClass: NSNumberClass]) { const char *t = [obj objCType]; if (strchr("cCsSiIlLqQ", *t) != 0) { if (x == NSPropertyListXMLFormat_v1_0) { [dest appendBytes: "" length: 9]; XString([obj stringValue], dest); [dest appendBytes: "\n" length: 11]; } else if (x == NSPropertyListGNUstepFormat) { [dest appendBytes: "<*I" length: 3]; [dest appendData: [[obj stringValue] dataUsingEncoding: NSASCIIStringEncoding]]; [dest appendBytes: ">" length: 1]; } else { PString([obj description], dest); } } else { if (x == NSPropertyListXMLFormat_v1_0) { [dest appendBytes: "" length: 6]; XString([obj stringValue], dest); [dest appendBytes: "\n" length: 8]; } else if (x == NSPropertyListGNUstepFormat) { [dest appendBytes: "<*R" length: 3]; [dest appendData: [[obj stringValue] dataUsingEncoding: NSASCIIStringEncoding]]; [dest appendBytes: ">" length: 1]; } else { PString([obj description], dest); } } } else if ([obj isKindOfClass: NSDataClass]) { if (NSPropertyListXMLFormat_v1_0 == x) { [dest appendBytes: "\n" length: 7]; encodeBase64(obj, dest); [dest appendBytes: "\n" length: 8]; } else if (NSPropertyListGNUstepFormat == x) { [dest appendBytes: "<[" length: 2]; encodeBase64(obj, dest); [dest appendBytes: "]>" length: 2]; } else { const unsigned char *src; unsigned char *dst; int length; int i; int j; src = [obj bytes]; length = [obj length]; #define num2char(num) ((num) < 0xa ? ((num)+'0') : ((num)+0x57)) j = [dest length]; [dest setLength: j + 2*length+(length > 4 ? (length-1)/4+2 : 2)]; dst = [dest mutableBytes]; dst[j++] = '<'; for (i = 0; i < length; i++, j++) { dst[j++] = num2char((src[i]>>4) & 0x0f); dst[j] = num2char(src[i] & 0x0f); if ((i & 3) == 3 && i < length-1) { /* if we've just finished a 32-bit int, print a space */ dst[++j] = ' '; } } dst[j] = '>'; } } else if ([obj isKindOfClass: NSDateClass]) { static NSTimeZone *z = nil; if (z == nil) { z = RETAIN([NSTimeZone timeZoneForSecondsFromGMT: 0]); } if (x == NSPropertyListXMLFormat_v1_0) { [dest appendBytes: "" length: 6]; obj = [obj descriptionWithCalendarFormat: @"%Y-%m-%dT%H:%M:%SZ" timeZone: z locale: nil]; obj = [obj dataUsingEncoding: NSASCIIStringEncoding]; [dest appendData: obj]; [dest appendBytes: "\n" length: 8]; } else if (x == NSPropertyListGNUstepFormat) { [dest appendBytes: "<*D" length: 3]; obj = [obj descriptionWithCalendarFormat: @"%Y-%m-%d %H:%M:%S %z" timeZone: z locale: nil]; obj = [obj dataUsingEncoding: NSASCIIStringEncoding]; [dest appendData: obj]; [dest appendBytes: ">" length: 1]; } else { PString([obj description], dest); } } else if ([obj isKindOfClass: NSArrayClass]) { const char *iBaseString; const char *iSizeString; unsigned level = lev; if (level*step < sizeof(indentStrings)/sizeof(id)) { iBaseString = indentStrings[level*step]; } else { iBaseString = indentStrings[sizeof(indentStrings)/sizeof(id)-1]; } level++; if (level*step < sizeof(indentStrings)/sizeof(id)) { iSizeString = indentStrings[level*step]; } else { iSizeString = indentStrings[sizeof(indentStrings)/sizeof(id)-1]; } if (x == NSPropertyListXMLFormat_v1_0) { NSEnumerator *e; [dest appendBytes: "\n" length: 8]; e = [obj objectEnumerator]; while ((obj = [e nextObject])) { [dest appendBytes: iSizeString length: strlen(iSizeString)]; OAppend(obj, loc, level, step, x, dest); } [dest appendBytes: iBaseString length: strlen(iBaseString)]; [dest appendBytes: "\n" length: 9]; } else { unsigned count = [obj count]; unsigned last = count - 1; NSString *plists[count]; unsigned i; if ([obj isProxy] == YES) { for (i = 0; i < count; i++) { plists[i] = [obj objectAtIndex: i]; } } else { [obj getObjects: plists]; } if (loc == nil) { [dest appendBytes: "(" length: 1]; for (i = 0; i < count; i++) { id item = plists[i]; OAppend(item, nil, 0, step, x, dest); if (i != last) { [dest appendBytes: ", " length: 2]; } } [dest appendBytes: ")" length: 1]; } else { [dest appendBytes: "(\n" length: 2]; for (i = 0; i < count; i++) { id item = plists[i]; [dest appendBytes: iSizeString length: strlen(iSizeString)]; OAppend(item, loc, level, step, x, dest); if (i == last) { [dest appendBytes: "\n" length: 1]; } else { [dest appendBytes: ",\n" length: 2]; } } [dest appendBytes: iBaseString length: strlen(iBaseString)]; [dest appendBytes: ")" length: 1]; } } } else if ([obj isKindOfClass: NSDictionaryClass]) { const char *iBaseString; const char *iSizeString; SEL objSel = @selector(objectForKey:); IMP myObj = [obj methodForSelector: objSel]; unsigned i; NSArray *keyArray = [obj allKeys]; unsigned numKeys = [keyArray count]; NSString *plists[numKeys]; NSString *keys[numKeys]; BOOL canCompare = YES; Class lastClass = 0; unsigned level = lev; BOOL isProxy = [obj isProxy]; if (level*step < sizeof(indentStrings)/sizeof(id)) { iBaseString = indentStrings[level*step]; } else { iBaseString = indentStrings[sizeof(indentStrings)/sizeof(id)-1]; } level++; if (level*step < sizeof(indentStrings)/sizeof(id)) { iSizeString = indentStrings[level*step]; } else { iSizeString = indentStrings[sizeof(indentStrings)/sizeof(id)-1]; } if (isProxy == YES) { for (i = 0; i < numKeys; i++) { keys[i] = [keyArray objectAtIndex: i]; plists[i] = [(NSDictionary*)obj objectForKey: keys[i]]; } } else { [keyArray getObjects: keys]; for (i = 0; i < numKeys; i++) { plists[i] = (*myObj)(obj, objSel, keys[i]); } } if (x == NSPropertyListXMLFormat_v1_0) { /* This format can only use strings as keys. */ for (i = 0; i < numKeys; i++) { if ([keys[i] isKindOfClass: NSStringClass] == NO) { [NSException raise: NSInvalidArgumentException format: @"Bad key (%@) in property list: '%@'", NSStringFromClass([keys[i] class]), keys[i]]; } } } else if (numKeys == 0) { canCompare = NO; } else { /* All keys must respond to -compare: for sorting. */ lastClass = NSStringClass; for (i = 0; i < numKeys; i++) { if (object_getClass(keys[i]) == lastClass) continue; if ([keys[i] isKindOfClass: NSStringClass] == NO) { canCompare = NO; break; } lastClass = object_getClass(keys[i]); } } if (canCompare == YES) { #define STRIDE_FACTOR 3 unsigned c,d, stride; BOOL found; NSComparisonResult (*comp)(id, SEL, id) = 0; unsigned int count = numKeys; #ifdef GSWARN BOOL badComparison = NO; #endif stride = 1; while (stride <= count) { stride = stride * STRIDE_FACTOR + 1; } lastClass = 0; while (stride > (STRIDE_FACTOR - 1)) { // loop to sort for each value of stride stride = stride / STRIDE_FACTOR; for (c = stride; c < count; c++) { found = NO; if (stride > c) { break; } d = c - stride; while (!found) { id a = keys[d + stride]; id b = keys[d]; Class x; NSComparisonResult r; x = object_getClass(a); if (x != lastClass) { lastClass = x; comp = (NSComparisonResult (*)(id, SEL, id)) [a methodForSelector: @selector(compare:)]; } r = (0 == comp) ? 0 : (*comp)(a, @selector(compare:), b); if (r < 0) { #ifdef GSWARN if (r != NSOrderedAscending) { badComparison = YES; } #endif /* Swap keys and values. */ keys[d + stride] = b; keys[d] = a; a = plists[d + stride]; b = plists[d]; plists[d + stride] = b; plists[d] = a; if (stride > d) { break; } d -= stride; } else { #ifdef GSWARN if (r != NSOrderedDescending && r != NSOrderedSame) { badComparison = YES; } #endif found = YES; } } } } #ifdef GSWARN if (badComparison == YES) { NSWarnFLog(@"Detected bad return value from comparison"); } #endif } if (x == NSPropertyListXMLFormat_v1_0) { [dest appendBytes: "\n" length: 7]; for (i = 0; i < numKeys; i++) { [dest appendBytes: iSizeString length: strlen(iSizeString)]; [dest appendBytes: "" length: 5]; XString(keys[i], dest); [dest appendBytes: "\n" length: 7]; [dest appendBytes: iSizeString length: strlen(iSizeString)]; OAppend(plists[i], loc, level, step, x, dest); } [dest appendBytes: iBaseString length: strlen(iBaseString)]; [dest appendBytes: "\n" length: 8]; } else if (loc == nil) { [dest appendBytes: "{" length: 1]; for (i = 0; i < numKeys; i++) { OAppend(keys[i], nil, 0, step, x, dest); [dest appendBytes: " = " length: 3]; OAppend(plists[i], nil, 0, step, x, dest); [dest appendBytes: "; " length: 2]; } [dest appendBytes: "}" length: 1]; } else { [dest appendBytes: "{\n" length: 2]; for (i = 0; i < numKeys; i++) { [dest appendBytes: iSizeString length: strlen(iSizeString)]; OAppend(keys[i], loc, level, step, x, dest); [dest appendBytes: " = " length: 3]; OAppend(plists[i], loc, level, step, x, dest); [dest appendBytes: ";\n" length: 2]; } [dest appendBytes: iBaseString length: strlen(iBaseString)]; [dest appendBytes: "}" length: 1]; } } else { if (nil == obj) { obj = @"(nil)"; } if (x == NSPropertyListXMLFormat_v1_0) { [dest appendBytes: "" length: 8]; XString([obj description], dest); [dest appendBytes: "" length: 9]; } else { PString([obj description], dest); } } } static inline NSError* create_error(int code, NSString* desc) { return [NSError errorWithDomain: @"NSPropertyListSerialization" code: code userInfo: [NSDictionary dictionaryWithObjectsAndKeys: desc, NSLocalizedDescriptionKey, nil]]; } @implementation NSPropertyListSerialization static BOOL classInitialized = NO; + (void) initialize { if (classInitialized == NO) { NSMutableCharacterSet *s; classInitialized = YES; NSStringClass = [NSString class]; NSMutableStringClass = [NSMutableString class]; NSDataClass = [NSData class]; NSDateClass = [NSDate class]; NSNumberClass = [NSNumber class]; NSArrayClass = [NSArray class]; NSDictionaryClass = [NSDictionary class]; GSStringClass = [GSString class]; GSMutableStringClass = [GSMutableString class]; plArray = [GSMutableArray class]; plAdd = (id (*)(id, SEL, id)) [plArray instanceMethodForSelector: @selector(addObject:)]; plDictionary = [GSMutableDictionary class]; plSet = (id (*)(id, SEL, id, id)) [plDictionary instanceMethodForSelector: @selector(setObject:forKey:)]; /* The '$', '.', '/' and '_' characters used to be OK to use in * property lists, but OSX now quotes them, so we follow suite. */ s = [NSMutableCharacterSet new]; [s addCharactersInString: @"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" @"abcdefghijklmnopqrstuvwxyz"]; [s invert]; oldQuotables = s; [[NSObject leakAt: &oldQuotables] release]; s = [NSMutableCharacterSet new]; [s addCharactersInString: @"&<>'\\\""]; [s addCharactersInRange: NSMakeRange(0x0001, 0x001f)]; [s removeCharactersInRange: NSMakeRange(0x0009, 0x0002)]; [s removeCharactersInRange: NSMakeRange(0x000D, 0x0001)]; [s addCharactersInRange: NSMakeRange(0xD800, 0x07FF)]; [s addCharactersInRange: NSMakeRange(0xFFFE, 0x0002)]; xmlQuotables = s; [[NSObject leakAt: &xmlQuotables] release]; boolN = [[NSNumber numberWithBool: NO] retain]; [[NSObject leakAt: &boolN] release]; boolY = [[NSNumber numberWithBool: YES] retain]; [[NSObject leakAt: &boolY] release]; } } + (NSData*) dataFromPropertyList: (id)aPropertyList format: (NSPropertyListFormat)aFormat errorDescription: (NSString**)anErrorString { NSError *error = nil; NSData *data = [self dataWithPropertyList: aPropertyList format: aFormat options: 0 error: &error]; if ((error != nil) && (anErrorString != NULL)) { *anErrorString = [error description]; } return data; } + (NSData *) dataWithPropertyList: (id)aPropertyList format: (NSPropertyListFormat)aFormat options: (NSPropertyListWriteOptions)anOption error: (out NSError**)error { NSMutableData *dest; NSDictionary *loc; int step = 2; if (nil == aPropertyList) { [NSException raise: NSInvalidArgumentException format: @"[%@ +%@]: nil property list", NSStringFromClass(self), NSStringFromSelector(_cmd)]; } loc = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]; dest = [NSMutableData dataWithCapacity: 1024]; if (aFormat == NSPropertyListXMLFormat_v1_0) { [dest appendBytes: prefix length: strlen(prefix)]; OAppend(aPropertyList, loc, 0, step, aFormat, dest); [dest appendBytes: "
" length: 8]; } else if (aFormat == NSPropertyListGNUstepBinaryFormat) { [NSSerializer serializePropertyList: aPropertyList intoData: dest]; } else if (aFormat == NSPropertyListBinaryFormat_v1_0) { [GSBinaryPLGenerator serializePropertyList: aPropertyList intoData: dest]; } else { OAppend(aPropertyList, loc, 0, step, aFormat, dest); } return dest; } /** *

Make obj into a plist in str, using the locale loc.

* *

If *str is nil, create a GSMutableString. * Otherwise *str must be a GSMutableString.

* *

Options:

    *
  • step is the indent level.
  • *
  • forDescription enables OpenStep formatting.
  • *
  • xml enables XML formatting.
  • *
*/ GS_DECLARE void GSPropertyListMake(id obj, NSDictionary *loc, BOOL xml, BOOL forDescription, unsigned step, id *str) { NSString *tmp; NSPropertyListFormat style; NSMutableData *dest; if (classInitialized == NO) { [NSPropertyListSerialization class]; } if (*str == nil) { *str = AUTORELEASE([GSMutableString new]); } else if (object_getClass(*str) != [GSMutableString class]) { [NSException raise: NSInvalidArgumentException format: @"Illegal object (%@) at argument 0", *str]; } if (forDescription) { style = NSPropertyListOpenStepFormat; } else if (xml == YES) { style = NSPropertyListXMLFormat_v1_0; } else if (GSPrivateDefaultsFlag(NSWriteOldStylePropertyLists) == YES) { style = NSPropertyListOpenStepFormat; } else { style = NSPropertyListGNUstepFormat; } dest = [NSMutableData dataWithCapacity: 1024]; if (style == NSPropertyListXMLFormat_v1_0) { [dest appendBytes: prefix length: strlen(prefix)]; OAppend(obj, loc, 0, step, style, dest); [dest appendBytes: "" length: 8]; } else { OAppend(obj, loc, 0, step, style, dest); } tmp = [[NSString alloc] initWithData: dest encoding: NSASCIIStringEncoding]; [*str appendString: tmp]; RELEASE(tmp); } + (BOOL) propertyList: (id)aPropertyList isValidForFormat: (NSPropertyListFormat)aFormat { // FIXME ... need to check properly. switch (aFormat) { case NSPropertyListGNUstepFormat: return YES; case NSPropertyListGNUstepBinaryFormat: return YES; case NSPropertyListOpenStepFormat: return YES; case NSPropertyListXMLFormat_v1_0: return YES; case NSPropertyListBinaryFormat_v1_0: return YES; default: [NSException raise: NSInvalidArgumentException format: @"[%@ +%@]: unsupported format", NSStringFromClass(self), NSStringFromSelector(_cmd)]; return NO; } } + (id) propertyListFromData: (NSData*)data mutabilityOption: (NSPropertyListMutabilityOptions)anOption format: (NSPropertyListFormat*)aFormat errorDescription: (NSString**)anErrorString { NSError *error = nil; id prop = [self propertyListWithData: data options: anOption format: aFormat error: &error]; if ((error != nil) && (anErrorString != NULL)) { *anErrorString = [error description]; } return prop; } + (id) propertyListWithData: (NSData*)data options: (NSPropertyListReadOptions)anOption format: (NSPropertyListFormat*)aFormat error: (out NSError**)error { NSPropertyListFormat format = 0; NSString *errorStr = nil; id result = nil; const unsigned char *bytes = 0; unsigned int length = 0; if (data == nil) { errorStr = @"nil data argument passed to method"; } else if ([data isKindOfClass: NSDataClass] == NO) { errorStr = @"non-NSData data argument passed to method"; } else if ([data length] == 0) { errorStr = @"empty data argument passed to method"; } else { bytes = [data bytes]; length = [data length]; if (length >= 8 && memcmp(bytes, "bplist00", 8) == 0) { format = NSPropertyListBinaryFormat_v1_0; } else if (bytes[0] == 0 || bytes[0] == 1) { format = NSPropertyListGNUstepBinaryFormat; } else { unsigned int index = 0; // Skip any leading white space. while (index < length && GS_IS_WHITESPACE(bytes[index]) == YES) { index++; } if (length - index > 2 && bytes[index] == '<' && bytes[index+1] == '?') { // It begins with ' 4) { unsigned saved = offset_size; DESTROY(self); // Bad format [NSException raise: NSGenericException format: @"Unknown offset size %d", saved]; } else if (index_size < 1 || index_size > 4) { unsigned saved = index_size; DESTROY(self); // Bad format [NSException raise: NSGenericException format: @"Unknown table size %d", saved]; } else if (table_start + object_count * offset_size > _length) { DESTROY(self); // Bad format [NSException raise: NSGenericException format: @"Table size larger than supplied data"]; } else if (root_index >= object_count) { DESTROY(self); // Bad format } else if (table_start > _length - 32) { DESTROY(self); // Bad format } else { ASSIGN(data, plData); _bytes = (const unsigned char*)[data bytes]; mutability = m; } } return self; } - (unsigned long) offsetForIndex: (unsigned)index { if (index >= object_count) { [NSException raise: NSRangeException format: @"Object table index out of bounds %d.", index]; return 0; /* Not reached */ } else { unsigned long offset; unsigned count; unsigned pos; /* An offset is stored in big-endian byte order, so we can simply * read it byte by byte. */ pos = table_start + index * offset_size; offset = _bytes[pos++]; for (count = 1; count < offset_size; count++) { offset = (offset << 8) + _bytes[pos++]; } return offset; } } - (unsigned) readObjectIndexAt: (unsigned*)counter { unsigned index; unsigned count; unsigned pos; NSAssert(0 != counter, NSInvalidArgumentException); pos = *counter; NSAssert(pos + index_size < _length, NSInvalidArgumentException); index = _bytes[pos++]; for (count = 1; count < index_size; count++) { index = (index << 8) + _bytes[pos++]; } *counter = pos; return index; } - (unsigned long) readCountAt: (unsigned*) counter { unsigned long count; unsigned pos; unsigned char c; NSAssert(0 != counter, NSInvalidArgumentException); pos = *counter; NSAssert(pos <= _length, NSInvalidArgumentException); c = _bytes[pos++]; if (c == 0x10) { NSAssert(pos + 1 < _length, NSInvalidArgumentException); count = _bytes[pos++]; *counter = pos; return count; } else if (c == 0x11) { NSAssert(pos + 2 < _length, NSInvalidArgumentException); count = _bytes[pos++]; count = (count << 8) + _bytes[pos++]; *counter = pos; return count; } // FIXME: Handling for 0x13 is wrong, but this value will only // show up for incorrect old GNUstep property lists. else if ((c == 0x12) || (c == 0x13)) { unsigned len = 4; NSAssert(pos + 4 < _length, NSInvalidArgumentException); count = _bytes[pos++]; while (--len > 0) { count = (count << 8) + _bytes[pos++]; } *counter = pos; return count; } else { //FIXME [NSException raise: NSGenericException format: @"Unknown count type %d", c]; return 0; } } - (id) rootObject { return [self objectAtIndex: root_index]; } - (BOOL)_pushObject: (NSUInteger)index { uintptr_t val; if (nil == _stack) { _stack = NSCreateHashTable(NSIntegerHashCallBacks, 5); } val = (index == 0) ? UINTPTR_MAX : (uintptr_t)(void*)index; // NSHashInsertIfAbsent() returns NULL on success return (NULL == NSHashInsertIfAbsent(_stack, (void*)val) ? YES : NO); } - (void)_popObject: (NSUInteger)index { if (_stack != nil) { uintptr_t val = (index == 0) ? UINTPTR_MAX : (uintptr_t)(void*)index; NSHashRemove(_stack, (void*)val); } } - (id) objectAtIndex: (NSUInteger)index { unsigned char next; unsigned counter = [self offsetForIndex: index]; id result = nil; [data getBytes: &next range: NSMakeRange(counter,1)]; //NSLog(@"read object %d at index %d type %d", index, counter, next); counter += 1; if (next == 0x08) { // NO result = boolN; } else if (next == 0x09) { // YES result = boolY; } else if ((next >= 0x10) && (next < 0x17)) { // integer number unsigned len = 1 << (next - 0x10); unsigned long long num = 0; unsigned i; unsigned char buffer[16]; if (len > sizeof(unsigned long long)) { [NSException raise: NSInvalidArgumentException format: @"Stored number too long (%d bytes) in property list", len]; } [data getBytes: buffer range: NSMakeRange(counter, len)]; for (i = 0; i < len; i++) { num = (num << 8) + buffer[i]; } result = [NSNumber numberWithLongLong: (long long)num]; } else if (next == 0x22) { // float number NSSwappedFloat in; [data getBytes: &in range: NSMakeRange(counter, sizeof(float))]; result = [NSNumber numberWithFloat: NSSwapBigFloatToHost(in)]; } else if (next == 0x23) { // double number NSSwappedDouble in; [data getBytes: &in range: NSMakeRange(counter, sizeof(double))]; result = [NSNumber numberWithDouble: NSSwapBigDoubleToHost(in)]; } else if (next == 0x33) { NSSwappedDouble in; // Date NSDate *date; [data getBytes: &in range: NSMakeRange(counter, sizeof(double))]; date = [NSDate dateWithTimeIntervalSinceReferenceDate: NSSwapBigDoubleToHost(in)]; result = date; } else if ((next >= 0x40) && (next < 0x4F)) { // short data unsigned len = next - 0x40; NSAssert(counter + len <= _length, NSInvalidArgumentException); if (mutability == NSPropertyListMutableContainersAndLeaves) { result = [NSMutableData dataWithBytes: _bytes + counter length: len]; } else { result = [NSData dataWithBytes: _bytes + counter length: len]; } } else if (next == 0x4F) { // long data unsigned long len; len = [self readCountAt: &counter]; NSAssert(counter + len <= _length, NSInvalidArgumentException); if (mutability == NSPropertyListMutableContainersAndLeaves) { result = [NSMutableData dataWithBytes: _bytes + counter length: len]; } else { result = [NSData dataWithBytes: _bytes + counter length: len]; } } else if ((next >= 0x50) && (next < 0x5F)) { NSString *s; // Short utf8 string unsigned len; if (mutability == NSPropertyListMutableContainersAndLeaves) { s = [NSMutableString alloc]; } else { s = [NSString alloc]; } len = next - 0x50; s = [s initWithBytes: _bytes + counter length: len encoding: NSUTF8StringEncoding]; result = [s autorelease]; } else if (next == 0x5F) { NSString *s; // Long utf8 string unsigned len; if (mutability == NSPropertyListMutableContainersAndLeaves) { s = [NSMutableString alloc]; } else { s = [NSString alloc]; } len = [self readCountAt: &counter]; s = [s initWithBytes: _bytes + counter length: len encoding: NSUTF8StringEncoding]; result = [s autorelease]; } else if ((next >= 0x60) && (next < 0x6F)) { NSString *s; // Short unicode string unsigned len; if (mutability == NSPropertyListMutableContainersAndLeaves) { s = [NSMutableString alloc]; } else { s = [NSString alloc]; } len = next - 0x60; s = [s initWithBytes: _bytes + counter length: len * sizeof(unichar) encoding: NSUTF16BigEndianStringEncoding]; result = [s autorelease]; } else if (next == 0x6F) { NSString *s; // Short unicode string unsigned long len; if (mutability == NSPropertyListMutableContainersAndLeaves) { s = [NSMutableString alloc]; } else { s = [NSString alloc]; } len = [self readCountAt: &counter]; s = [s initWithBytes: _bytes + counter length: len * sizeof(unichar) encoding: NSUTF16BigEndianStringEncoding]; result = [s autorelease]; } else if (next == 0x80) { unsigned char index; [data getBytes: &index range: NSMakeRange(counter,1)]; result = [NSDictionary dictionaryWithObject: [NSNumber numberWithInt: index] forKey: @"CF$UID"]; } else if (next == 0x81) { unsigned short index; [data getBytes: &index range: NSMakeRange(counter,2)]; index = NSSwapBigShortToHost(index); result = [NSDictionary dictionaryWithObject: [NSNumber numberWithInt: index] forKey: @"CF$UID"]; } else if ((next >= 0xA0) && (next < 0xAF)) { // short array unsigned len = next - 0xA0; unsigned i; id objects[len]; PUSH_OBJ(index); for (i = 0; i < len; i++) { int oid = [self readObjectIndexAt: &counter]; objects[i] = [self objectAtIndex: oid]; } POP_OBJ(index); if (mutability == NSPropertyListMutableContainersAndLeaves || mutability == NSPropertyListMutableContainers) { result = [NSMutableArray arrayWithObjects: objects count: len]; } else { result = [NSArray arrayWithObjects: objects count: len]; } } else if (next == 0xAF) { // big array unsigned long len; unsigned i; id *objects; len = [self readCountAt: &counter]; objects = NSAllocateCollectable(sizeof(id) * len, NSScannedOption); PUSH_OBJ(index); for (i = 0; i < len; i++) { int oid = [self readObjectIndexAt: &counter]; objects[i] = [self objectAtIndex: oid]; } POP_OBJ(index); if (mutability == NSPropertyListMutableContainersAndLeaves || mutability == NSPropertyListMutableContainers) { result = [NSMutableArray arrayWithObjects: objects count: len]; } else { result = [NSArray arrayWithObjects: objects count: len]; } NSZoneFree(NSDefaultMallocZone(), objects); } else if ((next >= 0xD0) && (next < 0xDF)) { // dictionary unsigned len = next - 0xD0; unsigned i; id keys[len]; id values[len]; PUSH_OBJ(index); for (i = 0; i < len; i++) { int oid = [self readObjectIndexAt: &counter]; keys[i] = [self objectAtIndex: oid]; } for (i = 0; i < len; i++) { int oid = [self readObjectIndexAt: &counter]; values[i] = [self objectAtIndex: oid]; } POP_OBJ(index); if (mutability == NSPropertyListMutableContainersAndLeaves || mutability == NSPropertyListMutableContainers) { result = [NSMutableDictionary dictionaryWithObjects: values forKeys: keys count: len]; } else { result = [NSDictionary dictionaryWithObjects: values forKeys: keys count: len]; } } else if (next == 0xDF) { // big dictionary unsigned long len; unsigned i; id *keys; id *values; len = [self readCountAt: &counter]; keys = NSAllocateCollectable(sizeof(id) * len * 2, NSScannedOption); values = keys + len; PUSH_OBJ(index); for (i = 0; i < len; i++) { int oid = [self readObjectIndexAt: &counter]; keys[i] = [self objectAtIndex: oid]; } for (i = 0; i < len; i++) { int oid = [self readObjectIndexAt: &counter]; values[i] = [self objectAtIndex: oid]; } POP_OBJ(index); if (mutability == NSPropertyListMutableContainersAndLeaves || mutability == NSPropertyListMutableContainers) { result = [NSMutableDictionary dictionaryWithObjects: values forKeys: keys count: len]; } else { result = [NSDictionary dictionaryWithObjects: values forKeys: keys count: len]; } NSZoneFree(NSDefaultMallocZone(), keys); } else { [NSException raise: NSGenericException format: @"Unknown control byte = %d", next]; } return result; } #undef PUSH_OBJ #undef POP_OBJ @end /* Test two items for equality ... both are objects. * If either is an NSNumber, we insist that they are the same class * so that numbers with the same numeric value but different classes * are not treated as the same number (that confuses OSXs decoding). */ static BOOL isEqualFunc(const void *item1, const void *item2, NSUInteger (*size)(const void *item)) { id o1 = (id)item1; id o2 = (id)item2; if ([o1 isKindOfClass: [NSNumber class]] || [o2 isKindOfClass: [NSNumber class]]) { if ([o1 class] != [o2 class]) { return NO; } } return [o1 isEqual: o2]; } @implementation GSBinaryPLGenerator + (void) serializePropertyList: (id)aPropertyList intoData: (NSMutableData *)destination { GSBinaryPLGenerator *gen; gen = [[GSBinaryPLGenerator alloc] initWithPropertyList: aPropertyList intoData: destination]; [gen generate]; RELEASE(gen); } - (id) initWithPropertyList: (id) aPropertyList intoData: (NSMutableData *)destination { ASSIGN(root, aPropertyList); ASSIGN(dest, destination); [dest setLength: 0]; return self; } - (void) dealloc { DESTROY(root); [self cleanup]; DESTROY(dest); [super dealloc]; } - (NSData*) data { return dest; } - (void) setup { NSPointerFunctions *k; NSPointerFunctions *v; [dest setLength: 0]; if (index_size == 1) { table_size = 256; } else if (index_size == 2) { table_size = 256 * 256; } else if (index_size == 3) { table_size = 256 * 256 * 256; } else if (index_size == 4) { table_size = UINT_MAX; } table = NSZoneMalloc(0, table_size * sizeof(int)); objectsToDoList = [[NSMutableArray alloc] init]; k = [NSPointerFunctions pointerFunctionsWithOptions: NSPointerFunctionsObjectPersonality]; [k setIsEqualFunction: isEqualFunc]; v = [NSPointerFunctions pointerFunctionsWithOptions: NSPointerFunctionsIntegerPersonality|NSPointerFunctionsOpaqueMemory]; objectList = [[NSMapTable alloc] initWithKeyPointerFunctions: k valuePointerFunctions: v capacity: 1000]; [objectsToDoList addObject: root]; [objectList setObject: (id)1 forKey: root]; } - (void) cleanup { DESTROY(objectsToDoList); DESTROY(objectList); if (table != NULL) { NSZoneFree(0, table); table = NULL; } } - (BOOL) writeObjects { id object; const char *prefix = "bplist00"; [dest appendBytes: prefix length: strlen(prefix)]; while ([objectsToDoList count] != 0) { object = [objectsToDoList objectAtIndex: 0]; if (NO == [self storeObject: object]) { return NO; } [objectsToDoList removeObjectAtIndex: 0]; } return YES; } - (BOOL) markOffset: (unsigned int) offset for: (id)object { int oid; oid = (NSInteger)[objectList objectForKey: object]; if (oid <= 0) { [NSException raise: NSGenericException format: @"Unknown object %@.", object]; } oid--; if (oid >= table_size) { return NO; } table[oid] = offset; return YES; } - (void) writeObjectTable { unsigned int size; unsigned int len; unsigned int i; unsigned char *buffer; unsigned int last_offset; table_start = [dest length]; // This is a bit too much, as the length // of the last object is added. last_offset = table_start; if (last_offset < 256) { offset_size = 1; } else if (last_offset < 256 * 256) { offset_size = 2; } else if (last_offset < 256 * 256 * 256) { offset_size = 3; } else { offset_size = 4; } len = [objectList count]; size = offset_size * len; buffer = NSZoneMalloc(0, size); if (offset_size == 1) { for (i = 0; i < len; i++) { unsigned char ci; ci = table[i]; buffer[i] = ci; } } else if (offset_size == 2) { for (i = 0; i < len; i++) { unsigned short si; si = table[i]; buffer[2 * i] = (si >> 8); buffer[2 * i + 1] = si % 256; } } else if (offset_size == 3) { for (i = 0; i < len; i++) { unsigned int si; si = table[i]; buffer[3 * i] = (si >> 16); buffer[3 * i + 1] = (si >> 8) % 256; buffer[3 * i + 2] = si % 256; } } else if (offset_size == 4) { for (i = 0; i < len; i++) { unsigned int si; si = table[i]; buffer[4 * i] = (si >> 24); buffer[4 * i + 1] = (si >> 16) % 256; buffer[4 * i + 2] = (si >> 8) % 256; buffer[4 * i + 3] = si % 256; } } [dest appendBytes: buffer length: size]; NSZoneFree(0, buffer); } - (void) writeMetaData { unsigned char meta[32]; unsigned int i; unsigned int len; for (i = 0; i < 32; i++) { meta[i] = 0; } meta[6] = offset_size; meta[7] = index_size; len = [objectList count]; meta[12] = (len >> 24); meta[13] = (len >> 16) % 256; meta[14] = (len >> 8) % 256; meta[15] = len % 256; // root index is always 0, no need to write it meta[28] = (table_start >> 24); meta[29] = (table_start >> 16) % 256; meta[30] = (table_start >> 8) % 256; meta[31] = table_start % 256; [dest appendBytes: meta length: 32]; } - (NSInteger) indexForObject: (id)object { NSInteger index; index = (NSInteger)[objectList objectForKey: object]; if (index <= 0) { index = [objectList count]; [objectList setObject: (id)(++index) forKey: object]; [objectsToDoList addObject: object]; } return index - 1; } - (void) storeIndex: (NSInteger)index { if (index_size == 1) { unsigned char oid; oid = index; [dest appendBytes: &oid length: 1]; } else if (index_size == 2) { unsigned short oid; oid = NSSwapHostShortToBig(index); [dest appendBytes: &oid length: 2]; } else if (index_size == 3) { unsigned char buffer[index_size]; int i; unsigned num = index; for (i = index_size - 1; i >= 0; i--) { buffer[i] = num & 0xFF; num >>= 8; } [dest appendBytes: buffer length: index_size]; } else if (index_size == 4) { unsigned int oid; oid = NSSwapHostIntToBig(index); [dest appendBytes: &oid length: 4]; } else { [NSException raise: NSGenericException format: @"Unknown table size %d", index_size]; } } - (void) storeCount: (unsigned int)count { unsigned char code; if (count < 256) { unsigned char c; code = 0x10; [dest appendBytes: &code length: 1]; c = count; [dest appendBytes: &c length: 1]; } else if (count < 256 * 256) { unsigned short c; code = 0x11; [dest appendBytes: &code length: 1]; c = count; c = NSSwapHostShortToBig(c); [dest appendBytes: &c length: 2]; } else { code = 0x12; [dest appendBytes: &code length: 1]; count = NSSwapHostIntToBig(count); [dest appendBytes: &count length: 4]; } } - (void) storeData: (NSData*) data { unsigned int len; unsigned char code; len = [data length]; if (len < 0x0F) { code = 0x40 + len; [dest appendBytes: &code length: 1]; [dest appendData: data]; } else { code = 0x4F; [dest appendBytes: &code length: 1]; [self storeCount: len]; [dest appendData: data]; } } - (void) storeString: (NSString*) string { unsigned int len; NSData *ascii; unsigned char code; len = [string length]; ascii = [string dataUsingEncoding: NSASCIIStringEncoding allowLossyConversion: NO]; if (ascii) { if (len < 0x0F) { code = 0x50 + len; [dest appendBytes: &code length: 1]; [dest appendData: ascii]; } else { code = 0x5F; [dest appendBytes: &code length: 1]; [self storeCount: len]; [dest appendData: ascii]; } } else { NSUInteger offset; unichar *buffer; if (len < 0x0F) { code = 0x60 + len; [dest appendBytes: &code length: 1]; } else { code = 0x6F; [dest appendBytes: &code length: 1]; [self storeCount: len]; } offset = [dest length]; [dest setLength: offset + sizeof(unichar)*len]; buffer = [dest mutableBytes] + offset; [string getCharacters: buffer]; #if !GS_WORDS_BIGENDIAN /* Always store in big-endian, so if machine is little-endian, * perform byte-swapping. */ { uint8_t *o = (uint8_t*)buffer; int i; for (i = 0; i < len; i++) { uint8_t c = *o++; o[-1] = *o; *o++ = c; } } #endif } } - (void) storeNumber: (NSNumber*) number { const char *type; unsigned char code; type = [number objCType]; switch (*type) { case 'c': case 'C': case 's': case 'S': case 'i': case 'I': case 'l': case 'L': case 'q': case 'Q': { unsigned long long val; val = [number unsignedLongLongValue]; // FIXME: We need a better way to determine boolean values! if ((val == 0) && ((*type == 'c') || (*type == 'C'))) { code = 0x08; [dest appendBytes: &code length: 1]; } else if ((val == 1) && ((*type == 'c') || (*type == 'C'))) { code = 0x09; [dest appendBytes: &code length: 1]; } else if (val < 256) { unsigned char cval; code = 0x10; [dest appendBytes: &code length: 1]; cval = (unsigned char) val; [dest appendBytes: &cval length: 1]; } else if (val < 256 * 256) { unsigned short sval; code = 0x11; [dest appendBytes: &code length: 1]; sval = NSSwapHostShortToBig([number unsignedShortValue]); [dest appendBytes: &sval length: 2]; } else if (val <= UINT_MAX) { unsigned int ival; code = 0x12; [dest appendBytes: &code length: 1]; ival = NSSwapHostIntToBig([number unsignedIntValue]); [dest appendBytes: &ival length: 4]; } else { unsigned long long lval; code = 0x13; [dest appendBytes: &code length: 1]; lval = NSSwapHostLongLongToBig([number unsignedLongLongValue]); [dest appendBytes: &lval length: 8]; } break; } case 'f': { NSSwappedFloat val = NSSwapHostFloatToBig([number floatValue]); code = 0x22; [dest appendBytes: &code length: 1]; [dest appendBytes: &val length: sizeof(float)]; break; } case 'd': { NSSwappedDouble val = NSSwapHostDoubleToBig([number doubleValue]); code = 0x23; [dest appendBytes: &code length: 1]; [dest appendBytes: &val length: sizeof(double)]; break; } default: [NSException raise: NSGenericException format: @"Attempt to store number with unknown ObjC type"]; } } - (void) storeDate: (NSDate*) date { unsigned char code; NSSwappedDouble out; code = 0x33; [dest appendBytes: &code length: 1]; out = NSSwapHostDoubleToBig([date timeIntervalSinceReferenceDate]); [dest appendBytes: &out length: sizeof(double)]; } - (void) storeArray: (NSArray*) array { unsigned char code; unsigned int len; unsigned int i; len = [array count]; if (len < 0x0F) { code = 0xA0 + len; [dest appendBytes: &code length: 1]; } else { code = 0xAF; [dest appendBytes: &code length: 1]; [self storeCount: len]; } for (i = 0; i < len; i++) { id obj; NSInteger oid; obj = [array objectAtIndex: i]; oid = [self indexForObject: obj]; [self storeIndex: oid]; } } - (void) storeDictionary: (NSDictionary*) dict { unsigned char code; NSNumber *num; unsigned int i; num = [dict objectForKey: @"CF$UID"]; if (num != nil) { // Special dictionary from keyed encoding unsigned int index; index = [num intValue]; if (index < 256) { unsigned char ci; code = 0x80; [dest appendBytes: &code length: 1]; ci = (unsigned char)index; [dest appendBytes: &ci length: 1]; } else { unsigned short si; code = 0x81; [dest appendBytes: &code length: 1]; si = NSSwapHostShortToBig((unsigned short)index); [dest appendBytes: &si length: 2]; } } else { unsigned int len = [dict count]; NSArray *keys = [dict allKeys]; NSMutableArray *objects = [NSMutableArray arrayWithCapacity: len]; id key; for (i = 0; i < len; i++) { key = [keys objectAtIndex: i]; [objects addObject: [dict objectForKey: key]]; } if (len < 0x0F) { code = 0xD0 + len; [dest appendBytes: &code length: 1]; } else { code = 0xDF; [dest appendBytes: &code length: 1]; [self storeCount: len]; } for (i = 0; i < len; i++) { id obj; NSInteger oid; obj = [keys objectAtIndex: i]; oid = [self indexForObject: obj]; [self storeIndex: oid]; } for (i = 0; i < len; i++) { id obj; NSInteger oid; obj = [objects objectAtIndex: i]; oid = [self indexForObject: obj]; [self storeIndex: oid]; } } } - (BOOL) storeObject: (id)object { if (NO == [self markOffset: [dest length] for: object]) { return NO; } if ([object isKindOfClass: NSStringClass]) { [self storeString: object]; } else if ([object isKindOfClass: NSDataClass]) { [self storeData: object]; } else if ([object isKindOfClass: NSNumberClass]) { [self storeNumber: object]; } else if ([object isKindOfClass: NSDateClass]) { [self storeDate: object]; } else if ([object isKindOfClass: NSArrayClass]) { [self storeArray: object]; } else if ([object isKindOfClass: NSDictionaryClass]) { [self storeDictionary: object]; } else { NSLog(@"Unknown object class %@", object); } return YES; } - (void) generate { BOOL done = NO; index_size = 1; while (!done && (index_size <= 4)) { NS_DURING { [self setup]; done = [self writeObjects]; } NS_HANDLER { } NS_ENDHANDLER if (NO == done) { [self cleanup]; index_size += 1; } } [self writeObjectTable]; [self writeMetaData]; } @end gnustep-base-1.29.0/Source/NSProtocolChecker.m000066400000000000000000000124031435650067400211570ustar00rootroot00000000000000/** Implementation of NSProtocolChecker for GNUStep Copyright (C) 1995 Free Software Foundation, Inc. Original by: Mike Kienenberger Date: Jun 1998 Written: Richard Frith-Macdonald Date: April 2004 This file is part of the GNUstep Base Library. 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 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 USA. NSProtocolChecker class reference $Date$ $Revision$ */ #import "common.h" #define EXPOSE_NSProtocolChecker_IVARS 1 #import "Foundation/NSProtocolChecker.h" #import "Foundation/NSException.h" #import "Foundation/NSInvocation.h" #import "Foundation/NSMethodSignature.h" #include /** * The NSProtocolChecker and NSProxy classes provide message filtering and * forwarding capabilities. If you wish to ensure at runtime that a given * object will only be sent messages in a certain protocol, you create an * NSProtocolChecker instance with the protocol and the object as * arguments- id versatileObject = [[ClassWithManyMethods alloc] init]; id narrowObject = [NSProtocolChecker protocolCheckerWithTarget: versatileObject protocol: @protocol(SomeSpecificProtocol)]; return narrowObject; * This is often used in conjunction with distributed objects to expose only a * subset of an objects methods to remote processes */ @implementation NSProtocolChecker /** * Allocates and initializes an NSProtocolChecker instance by calling * -initWithTarget:protocol:
* Autoreleases and returns the new instance. */ + (id) protocolCheckerWithTarget: (NSObject*)anObject protocol: (Protocol*)aProtocol { return AUTORELEASE([[NSProtocolChecker alloc] initWithTarget: anObject protocol: aProtocol]); } - (void) dealloc { DESTROY(_myTarget); [super dealloc]; } - (const char *) _protocolTypeForSelector: (SEL)aSel { struct objc_method_description desc; desc = GSProtocolGetMethodDescriptionRecursive(_myProtocol, aSel, YES, YES); if (desc.name == NULL && desc.types == NULL) { desc = GSProtocolGetMethodDescriptionRecursive(_myProtocol, aSel, YES, NO); } return desc.types; } /** * Forwards any message to the delegate if the method is declared in * the checker's protocol; otherwise raises an * NSInvalidArgumentException. */ - (void) forwardInvocation: (NSInvocation*)anInvocation { const char *type; if ([self _protocolTypeForSelector: [anInvocation selector]] == NULL) { if (GSObjCIsInstance(_myTarget)) { [NSException raise: NSInvalidArgumentException format: @"<%s -%@> not declared", protocol_getName(_myProtocol), NSStringFromSelector([anInvocation selector])]; } else { [NSException raise: NSInvalidArgumentException format: @"<%s +%@> not declared", protocol_getName(_myProtocol), NSStringFromSelector([anInvocation selector])]; } } [anInvocation invokeWithTarget: _myTarget]; /* * If the method returns 'self' (ie the target object) replace the * returned value with the protocol checker. */ type = [[anInvocation methodSignature] methodReturnType]; if (GSSelectorTypesMatch(type, @encode(id))) { id buf; [anInvocation getReturnValue: &buf]; if (buf == _myTarget) { buf = self; [anInvocation setReturnValue: &buf]; } } } - (id) init { self = [self initWithTarget: nil protocol: nil]; return self; } /** * Initializes a newly allocated NSProtocolChecker instance that will * forward any messages in the aProtocol protocol to anObject, its * delegate. Thus, the checker can be vended in lieu of anObject to * restrict the messages that can be sent to anObject. If any method * in the protocol returns anObject, the checker will replace the returned * value with itself rather than the target object.
* Returns the new instance. */ - (id) initWithTarget: (NSObject*)anObject protocol: (Protocol*)aProtocol { _myProtocol = aProtocol; ASSIGN(_myTarget, anObject); return self; } - (NSMethodSignature*) methodSignatureForSelector: (SEL)aSelector { if (_myProtocol != nil) { const char *types = [self _protocolTypeForSelector: aSelector]; if (types == NULL) { return nil; } return [NSMethodSignature signatureWithObjCTypes: types]; } return [super methodSignatureForSelector: aSelector]; } /** * Returns the protocol object the checker uses to verify whether a * given message should be forwarded to its delegate. */ - (Protocol*) protocol { return _myProtocol; } /** * Returns the target of the NSProtocolChecker. */ - (NSObject*) target { return _myTarget; } @end gnustep-base-1.29.0/Source/NSProxy.m000066400000000000000000000322151435650067400172150ustar00rootroot00000000000000/** Implementation for GNU Objective-C version of NSProxy Copyright (C) 1997 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: August 1997 This file is part of the GNUstep Base Library. 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 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 USA. NSProxy class reference $Date$ $Revision$ */ #import "common.h" #import "Foundation/NSInvocation.h" #import "Foundation/NSProxy.h" #import "Foundation/NSMethodSignature.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSException.h" #import "Foundation/NSHashTable.h" #import "Foundation/NSDistantObject.h" #import "Foundation/NSPortCoder.h" // Get objc_delete_weak_refs(), if it is present in the runtime. #ifdef __GNUSTEP_RUNTIME__ #include #ifdef OBJC_CAP_ARC #include #endif #endif @class NSDistantObject; /** *

The NSProxy class provides a basic implementation of a class whose * instances are used to stand in for other objects.
* The class provides the most basic methods of NSObject, and expects * messages for other methods to be forwarded to the real * object represented by the proxy. You must subclass NSProxy to * implement -forwardInvocation: to these real objects.

* *

Note that NSProxy is a different sort of class than others * in the GNUstep Base library in that it is the only example of a root class * besides [NSObject]. Thus, it implements the NSObject protocol * but is not a subclass of NSObject.

*/ @implementation NSProxy /** * Allocates and returns an NSProxy instance in the default zone. */ + (id) alloc { return [self allocWithZone: NSDefaultMallocZone()]; } /** * Allocates and returns an NSProxy instance in the specified zone z. */ + (id) allocWithZone: (NSZone*)z { NSProxy* ob = (NSProxy*) NSAllocateObject(self, 0, z); return ob; } /** * Returns the receiver. */ + (id) autorelease { return self; } /** * Returns the receiver. */ + (Class) class { return self; } /** * Returns a string describing the receiver. */ + (NSString*) description { return [NSString stringWithFormat: @"<%s>", GSClassNameFromObject(self)]; } + (IMP) instanceMethodForSelector: (SEL)aSelector { if (aSelector == 0) [NSException raise: NSInvalidArgumentException format: @"%@ null selector given", NSStringFromSelector(_cmd)]; /* * Since 'self' is an class, class_getMethodImplementation() will get * the instance method. */ return class_getMethodImplementation((Class)self, aSelector); } /** * Returns NO ... the NSProxy class cannot be an instance of any class. */ + (BOOL) isKindOfClass: (Class)aClass { return NO; } /** * Returns YES if aClass is identical to the receiver, NO otherwise. */ + (BOOL) isMemberOfClass: (Class)aClass { return(self == aClass); } /** * A dummy method ... */ + (void) load { /* Do nothing */ } - (IMP) methodForSelector: (SEL)aSelector { if (aSelector == 0) [NSException raise: NSInvalidArgumentException format: @"%@ null selector given", NSStringFromSelector(_cmd)]; return class_getMethodImplementation(object_getClass((id)self), aSelector); } /** * Returns the method signature for the specified selector. */ + (NSMethodSignature*) methodSignatureForSelector: (SEL)aSelector { struct objc_method *mth; if (0 == aSelector) { return nil; } mth = GSGetMethod(self, aSelector, NO, YES); if (mth != 0) { const char *types = method_getTypeEncoding(mth); if (types != 0) { return [NSMethodSignature signatureWithObjCTypes: types]; } } return nil; } /** * A dummy method to ensure that the class can safely be held in containers. */ + (oneway void) release { /* Do nothing */ } /** * Returns YES if the receiver responds to aSelector, NO otherwise. */ + (BOOL) respondsToSelector: (SEL)aSelector { if (class_respondsToSelector(object_getClass(self), aSelector)) return YES; else return NO; } /** * Returns the receiver. */ + (id) retain { return self; } /** * Returns the maximum unsigned integer value. */ + (NSUInteger) retainCount { return UINT_MAX; } /** * Returns the superclass of the receiver. */ + (Class) superclass { return class_getSuperclass(self); } /** * Adds the receiver to the current autorelease pool and returns self. */ - (id) autorelease { [NSAutoreleasePool addObject: self]; return self; } /** * Dummy method ... returns the receiver. */ - (id) awakeAfterUsingCoder: (NSCoder*)aDecoder { return self; } /** * Returns the class of the receiver. */ - (Class) class { return object_getClass(self); } /** * Calls the -forwardInvocation: method to determine if the 'real' object * referred to by the proxy conforms to aProtocol. Returns the result.
* NB. The default operation of -forwardInvocation: is to raise an exception. */ - (BOOL) conformsToProtocol: (Protocol*)aProtocol { NSMethodSignature *sig; NSInvocation *inv; BOOL ret; sig = [self methodSignatureForSelector: _cmd]; inv = [NSInvocation invocationWithMethodSignature: sig]; [inv setSelector: _cmd]; [inv setArgument: &aProtocol atIndex: 2]; [self forwardInvocation: inv]; [inv getReturnValue: &ret]; return ret; } /** * Frees the memory used by the receiver. */ - (void) dealloc { NSDeallocateObject((NSObject*)self); } /** * Returns a text description of the receiver. */ - (NSString*) description { return [NSString stringWithFormat: @"<%s %zx>", GSClassNameFromObject(self), (size_t)self]; } /** * Raises an NSInvalidArgumentException. */ - (void) forwardInvocation: (NSInvocation*)anInvocation { [NSException raise: NSInvalidArgumentException format: @"NSProxy should not implement '%s'", sel_getName(_cmd)]; } /** * Returns the address of the receiver ... so it can be stored in a dictionary. */ - (NSUInteger) hash { /* * Ideally we would shift left to lose any zero bits produced by the * alignment of the object in memory ... but that depends on the * processor architecture and the memory allocatiion implementation. * In the absence of detailed information, pick a reasonable value * assuming the object will be aligned to an eight byte boundary. */ return ((NSUInteger)(uintptr_t)self)>>3; } /** * Initialises the receiver and returns the resulting instance. */ - (id) init { [NSException raise: NSGenericException format: @"subclass %s should override %s", GSClassNameFromObject(self), sel_getName(_cmd)]; return self; } /** * Tests for pointer equality with anObject. */ - (BOOL) isEqual: (id)anObject { return (self == anObject); } /** * Calls the -forwardInvocation: method to determine if the 'real' object * referred to by the proxy is an instance of the specified class. * Returns the result.
* NB. The default operation of -forwardInvocation: is to raise an exception. */ - (BOOL) isKindOfClass: (Class)aClass { NSMethodSignature *sig; NSInvocation *inv; BOOL ret; sig = [self methodSignatureForSelector: _cmd]; inv = [NSInvocation invocationWithMethodSignature: sig]; [inv setSelector: _cmd]; [inv setArgument: &aClass atIndex: 2]; [self forwardInvocation: inv]; [inv getReturnValue: &ret]; return ret; } /** * Calls the -forwardInvocation: method to determine if the 'real' object * referred to by the proxy is an instance of the specified class. * Returns the result.
* NB. The default operation of -forwardInvocation: is to raise an exception. */ - (BOOL) isMemberOfClass: (Class)aClass { NSMethodSignature *sig; NSInvocation *inv; BOOL ret; sig = [self methodSignatureForSelector: _cmd]; inv = [NSInvocation invocationWithMethodSignature: sig]; [inv setSelector: _cmd]; [inv setArgument: &aClass atIndex: 2]; [self forwardInvocation: inv]; [inv getReturnValue: &ret]; return ret; } /** * Returns YES. */ - (BOOL) isProxy { return YES; } - (id) notImplemented: (SEL)aSel { [NSException raise: NSGenericException format: @"NSProxy notImplemented %s", sel_getName(aSel)]; return self; } /** * If we respond to the method directly, create and return a method * signature. Otherwise raise an exception. */ - (NSMethodSignature*) methodSignatureForSelector: (SEL)aSelector { struct objc_method *mth; if (0 == aSelector) { return nil; } mth = GSGetMethod(object_getClass(self), aSelector, YES, YES); if (mth != 0) { const char *types = method_getTypeEncoding(mth); if (types != 0) { return [NSMethodSignature signatureWithObjCTypes: types]; } } [NSException raise: NSInvalidArgumentException format: @"NSProxy should not implement 'methodSignatureForSelector:'"]; return nil; } - (id) performSelector: (SEL)aSelector { IMP msg = objc_msg_lookup(self, aSelector); if (!msg) { [NSException raise: NSGenericException format: @"invalid selector passed to %s", sel_getName(_cmd)]; return nil; } return (*msg)(self, aSelector); } - (id) performSelector: (SEL)aSelector withObject: (id)anObject { IMP msg = objc_msg_lookup(self, aSelector); if (!msg) { [NSException raise: NSGenericException format: @"invalid selector passed to %s", sel_getName(_cmd)]; return nil; } return (*msg)(self, aSelector, anObject); } - (id) performSelector: (SEL)aSelector withObject: (id)anObject withObject: (id)anotherObject { IMP msg = objc_msg_lookup(self, aSelector); if (!msg) { [NSException raise: NSGenericException format: @"invalid selector passed to %s", sel_getName(_cmd)]; return nil; } return (*msg)(self, aSelector, anObject, anotherObject); } /** * Decrement the retain count for the receiver ... deallocate if it would * become negative. */ - (oneway void) release { if (NSDecrementExtraRefCountWasZero(self)) { # ifdef OBJC_CAP_ARC objc_delete_weak_refs(self); # endif [self dealloc]; } } /** * Returns the actual object to be encoded for sending over the * network on a Distributed Objects connection. */ - (id) replacementObjectForPortCoder: (NSPortCoder*)aCoder { static Class proxyClass = 0; static IMP proxyImp = 0; if (proxyImp == 0) { proxyClass = [NSDistantObject class]; /* * use class_getMethodImplementation() because NSDistantObject * doesn't implement methodForSelector: */ proxyImp = class_getMethodImplementation(object_getClass((id)proxyClass), @selector(proxyWithLocal:connection:)); } return (*proxyImp)(proxyClass, @selector(proxyWithLocal:connection:), self, [aCoder connection]); } /** * If we respond to the method directly, return YES, otherwise * forward this request to the object we are acting as a proxy for. */ - (BOOL) respondsToSelector: (SEL)aSelector { if (aSelector == 0) { return NO; } if (class_respondsToSelector(object_getClass(self), aSelector)) { return YES; } else { NSMethodSignature *sig; NSInvocation *inv; BOOL ret; sig = [self methodSignatureForSelector: _cmd]; inv = [NSInvocation invocationWithMethodSignature: sig]; [inv setSelector: _cmd]; [inv setArgument: &aSelector atIndex: 2]; [self forwardInvocation: inv]; [inv getReturnValue: &ret]; return ret; } } /** * Increment the retain count for the receiver. */ - (id) retain { NSIncrementExtraRefCount(self); return self; } /** * Return the retain count for the receiver. */ - (NSUInteger) retainCount { return NSExtraRefCount(self) + 1; } /** * Returns the receiver. */ - (id) self { return self; } /** * Returns the superclass of the receiver's class. */ - (Class) superclass { return class_getSuperclass(object_getClass(self)); } + (NSUInteger) sizeInBytesExcluding: (NSHashTable*)exclude { return 0; } + (NSUInteger) sizeOfContentExcluding: (NSHashTable*)exclude { return 0; } + (NSUInteger) sizeOfInstance { return 0; } - (NSUInteger) sizeInBytesExcluding: (NSHashTable*)exclude { if (0 == NSHashGet(exclude, self)) { Class c = object_getClass(self); NSUInteger size = class_getInstanceSize(c); NSHashInsert(exclude, self); return size; } return 0; } - (NSUInteger) sizeOfContentExcluding: (NSHashTable*)exclude { return 0; } - (NSUInteger) sizeOfInstance { return class_getInstanceSize(object_getClass(self)); } /** * Returns the zone in which the receiver was allocated. */ - (NSZone*) zone { return NSZoneFromPointer(self); } @end gnustep-base-1.29.0/Source/NSRange.m000066400000000000000000000063741435650067400171370ustar00rootroot00000000000000/** NSRange - range functions * Copyright (C) 1993-2015 Free Software Foundation, Inc. * * Written by: Adam Fedor * Date: Mar 1995 * * This file is part of the GNUstep Base Library. * * 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 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 USA. NSRange class reference $Date$ $Revision$ */ #import "common.h" #define IN_NSRANGE_M 1 #import "Foundation/NSException.h" #import "Foundation/NSRange.h" #import "Foundation/NSScanner.h" @class NSString; static Class NSStringClass = 0; static Class NSScannerClass = 0; static SEL scanIntegerSel; static SEL scanStringSel; static SEL scannerSel; static BOOL (*scanIntegerImp)(NSScanner*, SEL, NSInteger*); static BOOL (*scanStringImp)(NSScanner*, SEL, NSString*, NSString**); static id (*scannerImp)(Class, SEL, NSString*); static inline void setupCache(void) { if (NSStringClass == 0) { NSStringClass = [NSString class]; NSScannerClass = [NSScanner class]; scanIntegerSel = @selector(scanInteger:); scanStringSel = @selector(scanString:intoString:); scannerSel = @selector(scannerWithString:); scanIntegerImp = (BOOL (*)(NSScanner*, SEL, NSInteger*)) [NSScannerClass instanceMethodForSelector: scanIntegerSel]; scanStringImp = (BOOL (*)(NSScanner*, SEL, NSString*, NSString**)) [NSScannerClass instanceMethodForSelector: scanStringSel]; scannerImp = (id (*)(Class, SEL, NSString*)) [NSScannerClass methodForSelector: scannerSel]; } } NSRange NSRangeFromString(NSString *aString) { NSScanner *scanner; NSRange range; setupCache(); scanner = (*scannerImp)(NSScannerClass, scannerSel, aString); if ((*scanStringImp)(scanner, scanStringSel, @"{", NULL) && (*scanStringImp)(scanner, scanStringSel, @"location", NULL) && (*scanStringImp)(scanner, scanStringSel, @"=", NULL) && (*scanIntegerImp)(scanner, scanIntegerSel, (NSInteger*)&range.location) && (*scanStringImp)(scanner, scanStringSel, @",", NULL) && (*scanStringImp)(scanner, scanStringSel, @"length", NULL) && (*scanStringImp)(scanner, scanStringSel, @"=", NULL) && (*scanIntegerImp)(scanner, scanIntegerSel, (NSInteger*)&range.length) && (*scanStringImp)(scanner, scanStringSel, @"}", NULL)) return range; else return NSMakeRange(0, 0); } NSString * NSStringFromRange(NSRange range) { setupCache(); return [NSStringClass stringWithFormat: @"{location=%"PRIuPTR", length=%"PRIuPTR"}", range.location, range.length]; } GS_EXPORT void _NSRangeExceptionRaise () { [NSException raise: NSRangeException format: @"Range location + length too great"]; } gnustep-base-1.29.0/Source/NSRegularExpression.m000066400000000000000000000733241435650067400215630ustar00rootroot00000000000000/** Implementation of NSRegularExpression for GNUStep Copyright (C) 2010 Free Software Foundation, Inc. This file is part of the GNUstep Base Library. 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 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 USA. $Date: 2010-09-18 16:09:58 +0100 (Sat, 18 Sep 2010) $ $Revision: 31371 $ */ #define EXPOSE_NSRegularExpression_IVARS 1 #import "common.h" #if GS_USE_ICU == 1 #if defined(HAVE_UNICODE_UREGEX_H) #include #elif defined(HAVE_ICU_H) #include #endif /* FIXME It would be nice to use autoconf for checking whether uregex_openUText * is defined. However the naive check using AC_CHECK_FUNCS(uregex_openUText) * won't work because libicu internally renames all entry points with some cpp * magic. */ #if U_ICU_VERSION_MAJOR_NUM > 4 || (U_ICU_VERSION_MAJOR_NUM == 4 && U_ICU_VERSION_MINOR_NUM >= 4) || defined(HAVE_ICU_H) #define HAVE_UREGEX_OPENUTEXT 1 #endif #define NSRegularExpressionWorks #define GSREGEXTYPE URegularExpression #import "GSICUString.h" #import "Foundation/NSRegularExpression.h" #import "Foundation/NSTextCheckingResult.h" #import "Foundation/NSArray.h" #import "Foundation/NSCoder.h" #import "Foundation/NSUserDefaults.h" #import "Foundation/NSNotification.h" /** * To be helpful, Apple decided to define a set of flags that mean exactly the * same thing as the URegexpFlags enum in libicu, but have different values. * This was completely stupid, but we probably have to live with it. We could * in theory use the libicu values directly (that would be sensible), but that * would break any code that didn't correctly use the symbolic constants. */ uint32_t NSRegularExpressionOptionsToURegexpFlags(NSRegularExpressionOptions opts) { uint32_t flags = 0; if (opts & NSRegularExpressionCaseInsensitive) { flags |= UREGEX_CASE_INSENSITIVE; } if (opts & NSRegularExpressionAllowCommentsAndWhitespace) { flags |= UREGEX_COMMENTS; } if (opts & NSRegularExpressionIgnoreMetacharacters) { flags |= UREGEX_LITERAL; } if (opts & NSRegularExpressionDotMatchesLineSeparators) { flags |= UREGEX_DOTALL; } if (opts & NSRegularExpressionAnchorsMatchLines) { flags |= UREGEX_MULTILINE; } if (opts & NSRegularExpressionUseUnixLineSeparators) { flags |= UREGEX_UNIX_LINES; } if (opts & NSRegularExpressionUseUnicodeWordBoundaries) { flags |= UREGEX_UWORD; } return flags; } @implementation NSRegularExpression + (NSRegularExpression*) regularExpressionWithPattern: (NSString*)aPattern options: (NSRegularExpressionOptions)opts error: (NSError**)e { return [[[self alloc] initWithPattern: aPattern options: opts error: e] autorelease]; } #if HAVE_UREGEX_OPENUTEXT - (id) initWithPattern: (NSString*)aPattern options: (NSRegularExpressionOptions)opts error: (NSError**)e { uint32_t flags = NSRegularExpressionOptionsToURegexpFlags(opts); UText p = UTEXT_INITIALIZER; UParseError pe = {0}; UErrorCode s = 0; #if !__has_feature(blocks) if ([self class] != [NSRegularExpression class]) { GSOnceMLog(@"Warning: NSRegularExpression was built by a compiler without blocks support. NSRegularExpression will deviate from the documented behaviour when subclassing and any code that subclasses NSRegularExpression may break in unexpected ways. If you must subclass NSRegularExpression, you are strongly recommended to use a compiler with blocks support."); } #endif UTextInitWithNSString(&p, aPattern); regex = uregex_openUText(&p, flags, &pe, &s); utext_close(&p); if (U_FAILURE(s)) { // FIXME: Do something sensible with the error parameter. [self release]; return nil; } options = opts; return self; } - (BOOL) isEqual: (id)obj { if ([obj isKindOfClass: [NSRegularExpression class]]) { if (self == obj) { return YES; } else if (options != ((NSRegularExpression*)obj)->options) { return NO; } else { UErrorCode myErr = 0; UErrorCode theirErr = 0; const UText *myText = uregex_patternUText(regex, &myErr); const UText *theirText = uregex_patternUText(((NSRegularExpression*)obj)->regex, &theirErr); if (U_FAILURE(myErr) != U_FAILURE(theirErr)) { return NO; } else if (U_FAILURE(myErr) && U_FAILURE(theirErr)) { return YES; } return utext_equals(myText, theirText); } } else { return [super isEqual: obj]; } } - (NSString*) pattern { UErrorCode s = 0; UText *t = uregex_patternUText(regex, &s); GSUTextString *str = NULL; if (U_FAILURE(s)) { return nil; } str = [GSUTextString new]; utext_clone(&str->txt, t, FALSE, TRUE, &s); return [str autorelease]; } #else - (id) initWithPattern: (NSString*)aPattern options: (NSRegularExpressionOptions)opts error: (NSError**)e { int32_t length = [aPattern length]; uint32_t flags = NSRegularExpressionOptionsToURegexpFlags(opts); UParseError pe = {0}; UErrorCode s = 0; TEMP_BUFFER(buffer, length); #if !__has_feature(blocks) if ([self class] != [NSRegularExpression class]) { GSOnceMLog(@"Warning: NSRegularExpression was built by a compiler without blocks support. NSRegularExpression will deviate from the documented behaviour when subclassing and any code that subclasses NSRegularExpression may break in unexpected ways. If you must subclass NSRegularExpression, you are strongly recommended to use a compiler with blocks support."); } #endif [aPattern getCharacters: buffer range: NSMakeRange(0, length)]; regex = uregex_open(buffer, length, flags, &pe, &s); if (U_FAILURE(s)) { // FIXME: Do something sensible with the error parameter. [self release]; return nil; } options = opts; return self; } - (BOOL) isEqual: (id)obj { if ([obj isKindOfClass: [NSRegularExpression class]]) { if (self == obj) { return YES; } else if (options != ((NSRegularExpression*)obj)->options) { return NO; } else { UErrorCode myErr = 0; UErrorCode theirErr = 0; int32_t myLen = 0; int32_t theirLen = 0; const UChar *myText = uregex_pattern(regex, &myLen, &myErr); const UChar *theirText = uregex_pattern( ((NSRegularExpression*)obj)->regex, &theirLen, &theirErr); if (U_FAILURE(myErr) != U_FAILURE(theirErr)) { return NO; } else if (U_FAILURE(myErr) && U_FAILURE(theirErr)) { return YES; } if (myLen != theirLen) { return NO; } return (0 == memcmp((const void*)myText, (const void*)theirText, myLen)); } } else { return [super isEqual: obj]; } } - (NSString*) pattern { UErrorCode s = 0; int32_t length; const unichar *pattern = uregex_pattern(regex, &length, &s); if (U_FAILURE(s)) { return nil; } return [NSString stringWithCharacters: pattern length: length]; } #endif - (NSUInteger) hash { return [[self pattern] hash] ^ options; } static UBool callback(const void *context, int32_t steps) { BOOL stop = NO; GSRegexBlock block = (GSRegexBlock)context; if (NULL == context) { return FALSE; } CALL_BLOCK(block, nil, NSMatchingProgress, &stop); return stop; } #define DEFAULT_WORK_LIMIT 1500 /** * The work limit specifies the number of iterations the matcher will do before * aborting an operation. This ensures that degenerate pattern/input * combinations don't send the application into what for all intents and * purposes seems like an infinite loop. */ static int32_t _workLimit = DEFAULT_WORK_LIMIT; + (void) _defaultsChanged: (NSNotification*)n { NSUserDefaults *defs = [NSUserDefaults standardUserDefaults]; id value = [defs objectForKey: @"GSRegularExpressionWorkLimit"]; int32_t newLimit = DEFAULT_WORK_LIMIT; if ([value respondsToSelector: @selector(intValue)]) { int32_t v = [value intValue]; if (v >= 0) { newLimit = v; } } _workLimit = newLimit; } + (void) initialize { if (self == [NSRegularExpression class]) { [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(_defaultsChanged:) name: NSUserDefaultsDidChangeNotification object: nil]; [self _defaultsChanged: nil]; } } /** * Sets up a libicu regex object for use. Note: the documentation states that * NSRegularExpression must be thread safe. To accomplish this, we store a * prototype URegularExpression in the object, and then clone it in each * method. This is required because URegularExpression, unlike * NSRegularExpression, is stateful, and sharing this state between threads * would break concurrent calls. */ #if HAVE_UREGEX_OPENUTEXT static URegularExpression * setupRegex(URegularExpression *regex, NSString *string, UText *txt, NSMatchingOptions options, NSRange range, GSRegexBlock block) { UErrorCode s = 0; URegularExpression *r = uregex_clone(regex, &s); if (options & NSMatchingReportProgress) { uregex_setMatchCallback(r, callback, block, &s); } UTextInitWithNSString(txt, string); uregex_setUText(r, txt, &s); uregex_setRegion(r, range.location, range.location+range.length, &s); if (options & NSMatchingWithoutAnchoringBounds) { uregex_useAnchoringBounds(r, FALSE, &s); } if (options & NSMatchingWithTransparentBounds) { uregex_useTransparentBounds(r, TRUE, &s); } uregex_setTimeLimit(r, _workLimit, &s); if (U_FAILURE(s)) { uregex_close(r); return NULL; } return r; } #else static URegularExpression * setupRegex(URegularExpression *regex, NSString *string, unichar *buffer, int32_t length, NSMatchingOptions options, NSRange range, GSRegexBlock block) { UErrorCode s = 0; URegularExpression *r = uregex_clone(regex, &s); [string getCharacters: buffer range: NSMakeRange(0, length)]; if (options & NSMatchingReportProgress) { uregex_setMatchCallback(r, callback, block, &s); } uregex_setText(r, buffer, length, &s); uregex_setRegion(r, range.location, range.location+range.length, &s); if (options & NSMatchingWithoutAnchoringBounds) { uregex_useAnchoringBounds(r, FALSE, &s); } if (options & NSMatchingWithTransparentBounds) { uregex_useTransparentBounds(r, TRUE, &s); } uregex_setTimeLimit(r, _workLimit, &s); if (U_FAILURE(s)) { uregex_close(r); return NULL; } return r; } #endif static uint32_t prepareResult(NSRegularExpression *regex, URegularExpression *r, NSRangePointer ranges, NSUInteger groups, UErrorCode *s) { uint32_t flags = 0; NSUInteger i = 0; for (i = 0; i < groups; i++) { NSInteger start = uregex_start(r, i, s); NSInteger end = uregex_end(r, i, s); // The ICU API defines -1 as not found. Convert to // NSNotFound if applicable. if (start == -1) { start = NSNotFound; } if (end == -1) { end = NSNotFound; } if (end < start) { flags |= NSMatchingInternalError; end = start = NSNotFound; } ranges[i] = NSMakeRange(start, end-start); } if (uregex_hitEnd(r, s)) { flags |= NSMatchingHitEnd; } if (uregex_requireEnd(r, s)) { flags |= NSMatchingRequiredEnd; } if (0 != *s) { flags |= NSMatchingInternalError; } return flags; } #if HAVE_UREGEX_OPENUTEXT - (void) enumerateMatchesInString: (NSString*)string options: (NSMatchingOptions)opts range: (NSRange)range usingBlock: (GSRegexBlock)block { UErrorCode s = 0; UText txt = UTEXT_INITIALIZER; BOOL stop = NO; URegularExpression *r = setupRegex(regex, string, &txt, opts, range, block); NSUInteger groups = [self numberOfCaptureGroups] + 1; NSRange ranges[groups]; // Should this throw some kind of exception? if (NULL == r) { return; } if (opts & NSMatchingAnchored) { if (uregex_lookingAt(r, -1, &s) && (0 == s)) { // FIXME: Factor all of this out into prepareResult() uint32_t flags; NSTextCheckingResult *result; flags = prepareResult(self, r, ranges, groups, &s); result = (flags & NSMatchingInternalError) ? nil : [NSTextCheckingResult regularExpressionCheckingResultWithRanges: ranges count: groups regularExpression: self]; CALL_BLOCK(block, result, flags, &stop); } } else { while (!stop && uregex_findNext(r, &s) && (0 == s)) { uint32_t flags; NSTextCheckingResult *result; flags = prepareResult(self, r, ranges, groups, &s); result = (flags & NSMatchingInternalError) ? nil : [NSTextCheckingResult regularExpressionCheckingResultWithRanges: ranges count: groups regularExpression: self]; CALL_BLOCK(block, result, flags, &stop); } } if (opts & NSMatchingCompleted) { CALL_BLOCK(block, nil, NSMatchingCompleted, &stop); } utext_close(&txt); uregex_close(r); } #else - (void) enumerateMatchesInString: (NSString*)string options: (NSMatchingOptions)opts range: (NSRange)range usingBlock: (GSRegexBlock)block { UErrorCode s = 0; BOOL stop = NO; int32_t length = [string length]; URegularExpression *r; NSUInteger groups = [self numberOfCaptureGroups] + 1; NSRange ranges[groups]; TEMP_BUFFER(buffer, length); r = setupRegex(regex, string, buffer, length, opts, range, block); // Should this throw some kind of exception? if (NULL == r) { return; } if (opts & NSMatchingAnchored) { if (uregex_lookingAt(r, -1, &s) && (0 == s)) { // FIXME: Factor all of this out into prepareResult() uint32_t flags; NSTextCheckingResult *result; flags = prepareResult(self, r, ranges, groups, &s); result = (flags & NSMatchingInternalError) ? nil : [NSTextCheckingResult regularExpressionCheckingResultWithRanges: ranges count: groups regularExpression: self]; CALL_BLOCK(block, result, flags, &stop); } } else { while (!stop && uregex_findNext(r, &s) && (0 == s)) { uint32_t flags; NSTextCheckingResult *result; flags = prepareResult(self, r, ranges, groups, &s); result = (flags & NSMatchingInternalError) ? nil : [NSTextCheckingResult regularExpressionCheckingResultWithRanges: ranges count: groups regularExpression: self]; CALL_BLOCK(block, result, flags, &stop); } } if (opts & NSMatchingCompleted) { CALL_BLOCK(block, nil, NSMatchingCompleted, &stop); } uregex_close(r); } #endif /* The remaining methods are all meant to be wrappers around the primitive * method that takes a block argument. Unfortunately, this is not really * possible when compiling with a compiler that doesn't support blocks. */ #if __has_feature(blocks) - (NSUInteger) numberOfMatchesInString: (NSString*)string options: (NSMatchingOptions)opts range: (NSRange)range { __block NSUInteger count = 0; opts &= ~NSMatchingReportProgress; opts &= ~NSMatchingReportCompletion; GSRegexBlock block = ^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { count++; }; [self enumerateMatchesInString: string options: opts range: range usingBlock: block]; return count; } - (NSTextCheckingResult*) firstMatchInString: (NSString*)string options: (NSMatchingOptions)opts range: (NSRange)range { __block NSTextCheckingResult *r = nil; opts &= ~NSMatchingReportProgress; opts &= ~NSMatchingReportCompletion; GSRegexBlock block = ^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { r = result; *stop = YES; }; [self enumerateMatchesInString: string options: opts range: range usingBlock: block]; return r; } - (NSArray*) matchesInString: (NSString*)string options:(NSMatchingOptions)opts range:(NSRange)range { NSMutableArray *array = [NSMutableArray array]; opts &= ~NSMatchingReportProgress; opts &= ~NSMatchingReportCompletion; GSRegexBlock block = ^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { [array addObject: result]; }; [self enumerateMatchesInString: string options: opts range: range usingBlock: block]; return array; } - (NSRange) rangeOfFirstMatchInString: (NSString*)string options: (NSMatchingOptions)opts range: (NSRange)range { __block NSRange r = {NSNotFound, 0}; opts &= ~NSMatchingReportProgress; opts &= ~NSMatchingReportCompletion; GSRegexBlock block = ^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { r = [result range]; *stop = YES; }; [self enumerateMatchesInString: string options: opts range: range usingBlock: block]; return r; } #else # ifdef __clang__ /* FIXME ... this is blocks specific, not clang specific */ # warning Your compiler does not support blocks. NSRegularExpression will deviate from the documented behaviour when subclassing and any code that subclasses NSRegularExpression may break in unexpected ways. If you must subclass NSRegularExpression, you may want to use a compiler with blocks support. # warning Your compiler would support blocks if you added -fblocks to your OBJCFLAGS # endif #if HAVE_UREGEX_OPENUTEXT #define FAKE_BLOCK_HACK(failRet, code) \ UErrorCode s = 0;\ UText txt = UTEXT_INITIALIZER;\ BOOL stop = NO;\ URegularExpression *r = setupRegex(regex, string, &txt, opts, range, 0);\ if (NULL == r) { return failRet; }\ if (opts & NSMatchingAnchored)\ {\ if (uregex_lookingAt(r, -1, &s) && (0==s))\ {\ code\ }\ }\ else\ {\ while (!stop && uregex_findNext(r, &s) && (s == 0))\ {\ code\ }\ }\ utext_close(&txt);\ uregex_close(r); #else #define FAKE_BLOCK_HACK(failRet, code) \ UErrorCode s = 0;\ BOOL stop = NO;\ uint32_t length = [string length];\ URegularExpression *r;\ TEMP_BUFFER(buffer, length);\ r = setupRegex(regex, string, buffer, length, opts, range, 0);\ if (NULL == r) { return failRet; }\ if (opts & NSMatchingAnchored)\ {\ if (uregex_lookingAt(r, -1, &s) && (0==s))\ {\ code\ }\ }\ else\ {\ while (!stop && uregex_findNext(r, &s) && (s == 0))\ {\ code\ }\ }\ uregex_close(r); #endif - (NSUInteger) numberOfMatchesInString: (NSString*)string options: (NSMatchingOptions)opts range: (NSRange)range { NSUInteger count = 0; FAKE_BLOCK_HACK(count, { count++; }); return count; } - (NSTextCheckingResult*) firstMatchInString: (NSString*)string options: (NSMatchingOptions)opts range: (NSRange)range { NSTextCheckingResult *result = nil; NSUInteger groups = [self numberOfCaptureGroups] + 1; NSRange ranges[groups]; FAKE_BLOCK_HACK(result, { uint32_t flags; flags = prepareResult(self, r, ranges, groups, &s); result = (flags & NSMatchingInternalError) ? nil : [NSTextCheckingResult regularExpressionCheckingResultWithRanges: ranges count: groups regularExpression: self]; stop = YES; }); return result; } - (NSArray*) matchesInString: (NSString*)string options: (NSMatchingOptions)opts range: (NSRange)range { NSMutableArray *array = [NSMutableArray array]; NSUInteger groups = [self numberOfCaptureGroups] + 1; NSRange ranges[groups]; FAKE_BLOCK_HACK(array, { NSTextCheckingResult *result = NULL; uint32_t flags; flags = prepareResult(self, r, ranges, groups, &s); result = (flags & NSMatchingInternalError) ? nil : [NSTextCheckingResult regularExpressionCheckingResultWithRanges: ranges count: groups regularExpression: self]; if (nil != result) { [array addObject: result]; } }); return array; } - (NSRange) rangeOfFirstMatchInString: (NSString*)string options: (NSMatchingOptions)opts range: (NSRange)range { NSRange result = {NSNotFound, 0}; FAKE_BLOCK_HACK(result, { prepareResult(self, r, &result, 1, &s); stop = YES; }); return result; } #endif #if HAVE_UREGEX_OPENUTEXT - (NSUInteger) replaceMatchesInString: (NSMutableString*)string options: (NSMatchingOptions)opts range: (NSRange)range withTemplate: (NSString*)template { // FIXME: We're computing a value that is most likely ignored in an // expensive way. NSInteger results = [self numberOfMatchesInString: string options: opts range: range]; UErrorCode s = 0; UText txt = UTEXT_INITIALIZER; UText replacement = UTEXT_INITIALIZER; GSUTextString *ret = [GSUTextString new]; URegularExpression *r = setupRegex(regex, string, &txt, opts, range, 0); UText *output = NULL; UTextInitWithNSString(&replacement, template); output = uregex_replaceAllUText(r, &replacement, NULL, &s); if (0 != s) { uregex_close(r); utext_close(&replacement); utext_close(&txt); DESTROY(ret); return 0; } utext_clone(&ret->txt, output, TRUE, TRUE, &s); [string setString: ret]; [ret release]; uregex_close(r); utext_close(&txt); utext_close(output); utext_close(&replacement); return results; } - (NSString*) stringByReplacingMatchesInString: (NSString*)string options: (NSMatchingOptions)opts range: (NSRange)range withTemplate: (NSString*)template { UErrorCode s = 0; UText txt = UTEXT_INITIALIZER; UText replacement = UTEXT_INITIALIZER; UText *output = NULL; GSUTextString *ret = [GSUTextString new]; URegularExpression *r = setupRegex(regex, string, &txt, opts, range, 0); UTextInitWithNSString(&replacement, template); output = uregex_replaceAllUText(r, &replacement, NULL, &s); if (0 != s) { uregex_close(r); utext_close(&replacement); utext_close(&txt); DESTROY(ret); return nil; } utext_clone(&ret->txt, output, TRUE, TRUE, &s); uregex_close(r); utext_close(&txt); utext_close(output); utext_close(&replacement); return AUTORELEASE(ret); } - (NSString*) replacementStringForResult: (NSTextCheckingResult*)result inString: (NSString*)string offset: (NSInteger)offset template: (NSString*)template { UErrorCode s = 0; UText txt = UTEXT_INITIALIZER; UText replacement = UTEXT_INITIALIZER; UText *output = NULL; GSUTextString *ret = [GSUTextString new]; NSRange range = [result range]; URegularExpression *r = setupRegex(regex, [string substringWithRange: range], &txt, 0, NSMakeRange(0, range.length), 0); UTextInitWithNSString(&replacement, template); output = uregex_replaceFirstUText(r, &replacement, NULL, &s); if (0 != s) { uregex_close(r); utext_close(&replacement); utext_close(&txt); DESTROY(ret); return nil; } utext_clone(&ret->txt, output, TRUE, TRUE, &s); uregex_close(r); utext_close(&txt); utext_close(output); utext_close(&replacement); return AUTORELEASE(ret); } #else - (NSUInteger) replaceMatchesInString: (NSMutableString*)string options: (NSMatchingOptions)opts range: (NSRange)range withTemplate: (NSString*)template { // FIXME: We're computing a value that is most likely ignored in an // expensive way. NSInteger results = [self numberOfMatchesInString: string options: opts range: range]; UErrorCode s = 0; uint32_t length = [string length]; uint32_t replLength = [template length]; unichar replacement[replLength]; int32_t outLength; unichar *output; NSString *out; URegularExpression *r; TEMP_BUFFER(buffer, length); r = setupRegex(regex, string, buffer, length, opts, range, 0); [template getCharacters: replacement range: NSMakeRange(0, replLength)]; outLength = uregex_replaceAll(r, replacement, replLength, NULL, 0, &s); s = 0; output = NSZoneMalloc(0, outLength * sizeof(unichar)); uregex_replaceAll(r, replacement, replLength, output, outLength, &s); out = [[NSString alloc] initWithCharactersNoCopy: output length: outLength freeWhenDone: YES]; [string setString: out]; RELEASE(out); return results; } - (NSString*) stringByReplacingMatchesInString: (NSString*)string options: (NSMatchingOptions)opts range: (NSRange)range withTemplate: (NSString*)template { UErrorCode s = 0; uint32_t length = [string length]; URegularExpression *r; uint32_t replLength = [template length]; unichar replacement[replLength]; int32_t outLength; unichar *output; TEMP_BUFFER(buffer, length); r = setupRegex(regex, string, buffer, length, opts, range, 0); [template getCharacters: replacement range: NSMakeRange(0, replLength)]; outLength = uregex_replaceAll(r, replacement, replLength, NULL, 0, &s); s = 0; output = NSZoneMalloc(0, outLength * sizeof(unichar)); uregex_replaceAll(r, replacement, replLength, output, outLength, &s); return AUTORELEASE([[NSString alloc] initWithCharactersNoCopy: output length: outLength freeWhenDone: YES]); } - (NSString*) replacementStringForResult: (NSTextCheckingResult*)result inString: (NSString*)string offset: (NSInteger)offset template: (NSString*)template { UErrorCode s = 0; NSRange range = [result range]; URegularExpression *r; uint32_t replLength = [template length]; unichar replacement[replLength]; int32_t outLength; unichar *output; TEMP_BUFFER(buffer, range.length); r = setupRegex(regex, [string substringWithRange: range], buffer, range.length, 0, NSMakeRange(0, range.length), 0); [template getCharacters: replacement range: NSMakeRange(0, replLength)]; outLength = uregex_replaceFirst(r, replacement, replLength, NULL, 0, &s); s = 0; output = NSZoneMalloc(0, outLength * sizeof(unichar)); uregex_replaceFirst(r, replacement, replLength, output, outLength, &s); return AUTORELEASE([[NSString alloc] initWithCharactersNoCopy: output length: outLength freeWhenDone: YES]); } #endif - (NSRegularExpressionOptions) options { return options; } - (NSUInteger) numberOfCaptureGroups { UErrorCode s = 0; return uregex_groupCount(regex, &s); } - (void) dealloc { uregex_close(regex); [super dealloc]; } - (void) encodeWithCoder: (NSCoder*)aCoder { if ([aCoder allowsKeyedCoding]) { [aCoder encodeInteger: options forKey: @"options"]; [aCoder encodeObject: [self pattern] forKey: @"pattern"]; } else { [aCoder encodeValueOfObjCType: @encode(NSRegularExpressionOptions) at: &options]; [aCoder encodeObject: [self pattern]]; } } - (id) initWithCoder: (NSCoder*)aCoder { NSString *pattern; if ([aCoder allowsKeyedCoding]) { options = [aCoder decodeIntegerForKey: @"options"]; pattern = [aCoder decodeObjectForKey: @"pattern"]; } else { [aCoder decodeValueOfObjCType: @encode(NSRegularExpressionOptions) at: &options]; pattern = [aCoder decodeObject]; } return [self initWithPattern: pattern options: options error: NULL]; } - (id) copyWithZone: (NSZone*)aZone { NSRegularExpressionOptions opts = options; UErrorCode s = 0; URegularExpression *r = uregex_clone(regex, &s); if (0 != s) { return nil; } self = [[self class] allocWithZone: aZone]; if (nil == self) { return nil; } options = opts; regex = r; return self; } @end #endif //GS_ICU == 1 #ifndef NSRegularExpressionWorks #import "Foundation/NSRegularExpression.h" #import "Foundation/NSZone.h" #import "Foundation/NSException.h" @implementation NSRegularExpression + (id)allocWithZone: (NSZone*)aZone { [NSException raise: NSInvalidArgumentException format: @"NSRegularExpression requires ICU 4.4 or later"]; return nil; } - (id) copyWithZone: (NSZone*)zone { return nil; } - (void) encodeWithCoder: (NSCoder*)aCoder { } - (id) initWithCoder: (NSCoder*)aCoder { return nil; } @end #endif gnustep-base-1.29.0/Source/NSRunLoop.m000066400000000000000000001177331435650067400175030ustar00rootroot00000000000000/** Implementation of object for waiting on several input sources NSRunLoop.m Copyright (C) 1996-1999 Free Software Foundation, Inc. Original by: Andrew Kachites McCallum Created: March 1996 OPENSTEP version by: Richard Frith-Macdonald Created: August 1997 This file is part of the GNUstep Base Library. 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 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 USA. NSRunLoop class reference $Date$ $Revision$ */ #import "common.h" #define EXPOSE_NSRunLoop_IVARS 1 #define EXPOSE_NSTimer_IVARS 1 #import "Foundation/NSMapTable.h" #import "Foundation/NSDate.h" #import "Foundation/NSValue.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSPort.h" #import "Foundation/NSTimer.h" #import "Foundation/NSNotification.h" #import "Foundation/NSNotificationQueue.h" #import "Foundation/NSRunLoop.h" #import "Foundation/NSStream.h" #import "Foundation/NSThread.h" #import "Foundation/NSInvocation.h" #import "GSRunLoopCtxt.h" #import "GSRunLoopWatcher.h" #import "GSStream.h" #import "GSPrivate.h" #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_SYS_TIME_H #include #endif #ifdef HAVE_POLL_F #include #endif #include #include #if GS_USE_LIBDISPATCH_RUNLOOP # define RL_INTEGRATE_DISPATCH 1 # ifdef HAVE_DISPATCH_H # include # elif HAVE_DISPATCH_PRIVATE_H # include # elif HAVE_DISPATCH_DISPATCH_H # include # endif #endif NSRunLoopMode const NSDefaultRunLoopMode = @"NSDefaultRunLoopMode"; NSRunLoopMode const NSRunLoopCommonModes = @"NSRunLoopCommonModes"; static NSDate *theFuture = nil; @interface NSObject (OptionalPortRunLoop) - (void) getFds: (NSInteger*)fds count: (NSInteger*)count; @end /* * The GSRunLoopPerformer class is used to hold information about * messages which are due to be sent to objects once each runloop * iteration has passed. */ @interface GSRunLoopPerformer: NSObject { @public SEL selector; id target; id argument; unsigned order; } - (void) fire; - (id) initWithSelector: (SEL)aSelector target: (id)target argument: (id)argument order: (NSUInteger)order; @end @implementation GSRunLoopPerformer - (void) dealloc { RELEASE(target); RELEASE(argument); [super dealloc]; } - (void) fire { NS_DURING { [target performSelector: selector withObject: argument]; } NS_HANDLER { NSLog(@"*** NSRunLoop ignoring exception '%@' (reason '%@') " @"raised during performSelector... with target %s(%s) " @"and selector '%s'", [localException name], [localException reason], GSClassNameFromObject(target), GSObjCIsInstance(target) ? "instance" : "class", sel_getName(selector)); } NS_ENDHANDLER } - (id) initWithSelector: (SEL)aSelector target: (id)aTarget argument: (id)anArgument order: (NSUInteger)theOrder { self = [super init]; if (self) { selector = aSelector; target = RETAIN(aTarget); argument = RETAIN(anArgument); order = theOrder; } return self; } @end @interface NSRunLoop (TimedPerformers) - (NSMutableArray*) _timedPerformers; @end @implementation NSRunLoop (TimedPerformers) - (NSMutableArray*) _timedPerformers { return _timedPerformers; } @end /* * The GSTimedPerformer class is used to hold information about * messages which are due to be sent to objects at a particular time. */ @interface GSTimedPerformer: NSObject { @public SEL selector; id target; id argument; NSTimer *timer; } - (void) fire; - (id) initWithSelector: (SEL)aSelector target: (id)target argument: (id)argument delay: (NSTimeInterval)delay; - (void) invalidate; @end @implementation GSTimedPerformer - (void) dealloc { [self finalize]; TEST_RELEASE(timer); RELEASE(target); RELEASE(argument); [super dealloc]; } - (void) fire { DESTROY(timer); [target performSelector: selector withObject: argument]; [[[NSRunLoop currentRunLoop] _timedPerformers] removeObjectIdenticalTo: self]; } - (void) finalize { [self invalidate]; } - (id) initWithSelector: (SEL)aSelector target: (id)aTarget argument: (id)anArgument delay: (NSTimeInterval)delay { self = [super init]; if (self != nil) { selector = aSelector; target = RETAIN(aTarget); argument = RETAIN(anArgument); timer = [[NSTimer allocWithZone: NSDefaultMallocZone()] initWithFireDate: nil interval: delay target: self selector: @selector(fire) userInfo: nil repeats: NO]; } return self; } - (void) invalidate { if (timer != nil) { [timer invalidate]; DESTROY(timer); } } @end /* * Setup for inline operation of arrays. */ #ifndef GSI_ARRAY_TYPES #define GSI_ARRAY_TYPES GSUNION_OBJ #define GSI_ARRAY_RELEASE(A, X) [(X).obj release] #define GSI_ARRAY_RETAIN(A, X) [(X).obj retain] #include "GNUstepBase/GSIArray.h" #endif static inline NSDate *timerDate(NSTimer *t) { return t->_date; } static inline BOOL timerInvalidated(NSTimer *t) { return t->_invalidated; } @implementation NSObject (TimedPerformers) /* * Cancels any perform operations set up for the specified target * in the current run loop. */ + (void) cancelPreviousPerformRequestsWithTarget: (id)target { NSMutableArray *perf = [[NSRunLoop currentRunLoop] _timedPerformers]; unsigned count = [perf count]; if (count > 0) { GSTimedPerformer *array[count]; IF_NO_ARC(RETAIN(target);) [perf getObjects: array]; while (count-- > 0) { GSTimedPerformer *p = array[count]; if (p->target == target) { [p invalidate]; [perf removeObjectAtIndex: count]; } } RELEASE(target); } } /* * Cancels any perform operations set up for the specified target * in the current loop, but only if the value of aSelector and argument * with which the performs were set up match those supplied.
* Matching of the argument may be either by pointer equality or by * use of the [NSObject-isEqual:] method. */ + (void) cancelPreviousPerformRequestsWithTarget: (id)target selector: (SEL)aSelector object: (id)arg { NSMutableArray *perf = [[NSRunLoop currentRunLoop] _timedPerformers]; unsigned count = [perf count]; if (count > 0) { GSTimedPerformer *array[count]; IF_NO_ARC(RETAIN(target);) IF_NO_ARC(RETAIN(arg);) [perf getObjects: array]; while (count-- > 0) { GSTimedPerformer *p = array[count]; if (p->target == target && sel_isEqual(p->selector, aSelector) && (p->argument == arg || [p->argument isEqual: arg])) { [p invalidate]; [perf removeObjectAtIndex: count]; } } RELEASE(arg); RELEASE(target); } } - (void) performSelector: (SEL)aSelector withObject: (id)argument afterDelay: (NSTimeInterval)seconds { NSRunLoop *loop = [NSRunLoop currentRunLoop]; GSTimedPerformer *item; item = [[GSTimedPerformer alloc] initWithSelector: aSelector target: self argument: argument delay: seconds]; [[loop _timedPerformers] addObject: item]; RELEASE(item); [loop addTimer: item->timer forMode: NSDefaultRunLoopMode]; } - (void) performSelector: (SEL)aSelector withObject: (id)argument afterDelay: (NSTimeInterval)seconds inModes: (NSArray*)modes { unsigned count = [modes count]; if (count > 0) { NSRunLoop *loop = [NSRunLoop currentRunLoop]; NSString *marray[count]; GSTimedPerformer *item; unsigned i; item = [[GSTimedPerformer alloc] initWithSelector: aSelector target: self argument: argument delay: seconds]; [[loop _timedPerformers] addObject: item]; RELEASE(item); if ([modes isProxy]) { for (i = 0; i < count; i++) { marray[i] = [modes objectAtIndex: i]; } } else { [modes getObjects: marray]; } for (i = 0; i < count; i++) { [loop addTimer: item->timer forMode: marray[i]]; } } } @end #ifdef RL_INTEGRATE_DISPATCH #pragma clang diagnostic push /* We have no declarations for libdispatch private functions, so we ignore * warnings here, knowing that we are using an undocumented feature which * may go away in later releases (in which case we will use another library) */ #pragma clang diagnostic ignored "-Wimplicit-function-declaration" @interface GSMainQueueDrainer : NSObject + (void*) mainQueueFileDescriptor; @end @implementation GSMainQueueDrainer + (void*) mainQueueFileDescriptor { #if HAVE_DISPATCH_GET_MAIN_QUEUE_HANDLE_NP return (void*)(uintptr_t)dispatch_get_main_queue_handle_np(); #elif HAVE__DISPATCH_GET_MAIN_QUEUE_HANDLE_4CF return (void*)(uintptr_t)_dispatch_get_main_queue_handle_4CF(); #else #error libdispatch missing main queue handle function #endif } - (void) receivedEvent: (void*)data type: (RunLoopEventType)type extra: (void*)extra forMode: (NSString*)mode { #if HAVE_DISPATCH_MAIN_QUEUE_DRAIN_NP dispatch_main_queue_drain_np(); #elif HAVE__DISPATCH_MAIN_QUEUE_CALLBACK_4CF _dispatch_main_queue_callback_4CF(NULL); #else #error libdispatch missing main queue callback function #endif } @end #pragma clang diagnostic pop #endif @interface NSRunLoop (Private) - (void) _addWatcher: (GSRunLoopWatcher*)item forMode: (NSString*)mode; - (BOOL) _checkPerformers: (GSRunLoopCtxt*)context; - (GSRunLoopWatcher*) _getWatcher: (void*)data type: (RunLoopEventType)type forMode: (NSString*)mode; - (id) _init; - (void) _removeWatcher: (void*)data type: (RunLoopEventType)type forMode: (NSString*)mode; @end @implementation NSRunLoop (Private) /* Add a watcher to the list for the specified mode. Keep the list in limit-date order. */ - (void) _addWatcher: (GSRunLoopWatcher*) item forMode: (NSString*)mode { GSRunLoopCtxt *context; GSIArray watchers; unsigned i; context = NSMapGet(_contextMap, mode); if (context == nil) { context = [[GSRunLoopCtxt alloc] initWithMode: mode extra: _extra]; NSMapInsert(_contextMap, context->mode, context); RELEASE(context); } watchers = context->watchers; GSIArrayAddItem(watchers, (GSIArrayItem)((id)item)); i = GSIArrayCount(watchers); if (i % 1000 == 0 && i > context->maxWatchers) { context->maxWatchers = i; NSLog(@"WARNING ... there are %u watchers scheduled in mode %@ of %@", i, mode, self); } } - (BOOL) _checkPerformers: (GSRunLoopCtxt*)context { BOOL found = NO; if (context != nil) { GSIArray performers = context->performers; unsigned count = GSIArrayCount(performers); if (count > 0) { NSAutoreleasePool *arp = [NSAutoreleasePool new]; GSRunLoopPerformer *array[count]; NSMapEnumerator enumerator; GSRunLoopCtxt *original; void *mode; unsigned i; found = YES; /* We have to remove the performers before firing, so we copy * the pointers without releasing the objects, and then set * the performers to be empty. The copied objects in 'array' * will be released later. */ for (i = 0; i < count; i++) { array[i] = GSIArrayItemAtIndex(performers, i).obj; } performers->count = 0; /* Remove the requests that we are about to fire from all modes. */ original = context; enumerator = NSEnumerateMapTable(_contextMap); while (NSNextMapEnumeratorPair(&enumerator, &mode, (void**)&context)) { if (context != nil && context != original) { GSIArray performers = context->performers; unsigned tmpCount = GSIArrayCount(performers); while (tmpCount--) { GSRunLoopPerformer *p; p = GSIArrayItemAtIndex(performers, tmpCount).obj; for (i = 0; i < count; i++) { if (p == array[i]) { GSIArrayRemoveItemAtIndex(performers, tmpCount); } } } } } NSEndMapTableEnumeration(&enumerator); /* Finally, fire the requests and release them. */ for (i = 0; i < count; i++) { [array[i] fire]; RELEASE(array[i]); IF_NO_ARC([arp emptyPool];) } [arp drain]; } } return found; } /** * Locates a runloop watcher matching the specified data and type in this * runloop. If the mode is nil, either the currentMode is used (if the * loop is running) or NSDefaultRunLoopMode is used. */ - (GSRunLoopWatcher*) _getWatcher: (void*)data type: (RunLoopEventType)type forMode: (NSString*)mode { GSRunLoopCtxt *context; if (mode == nil) { mode = [self currentMode]; if (mode == nil) { mode = NSDefaultRunLoopMode; } } context = NSMapGet(_contextMap, mode); if (context != nil) { GSIArray watchers = context->watchers; unsigned i = GSIArrayCount(watchers); while (i-- > 0) { GSRunLoopWatcher *info; info = GSIArrayItemAtIndex(watchers, i).obj; if (info->type == type && info->data == data) { return info; } } } return nil; } - (id) _init { self = [super init]; if (self != nil) { _contextStack = [NSMutableArray new]; _contextMap = NSCreateMapTable (NSNonRetainedObjectMapKeyCallBacks, NSObjectMapValueCallBacks, 0); _timedPerformers = [[NSMutableArray alloc] initWithCapacity: 8]; #ifdef HAVE_POLL_F _extra = NSZoneMalloc(NSDefaultMallocZone(), sizeof(pollextra)); memset(_extra, '\0', sizeof(pollextra)); #endif } return self; } /** * Removes a runloop watcher matching the specified data and type in this * runloop. If the mode is nil, either the currentMode is used (if the * loop is running) or NSDefaultRunLoopMode is used. */ - (void) _removeWatcher: (void*)data type: (RunLoopEventType)type forMode: (NSString*)mode { GSRunLoopCtxt *context; if (mode == nil) { mode = [self currentMode]; if (mode == nil) { mode = NSDefaultRunLoopMode; } } context = NSMapGet(_contextMap, mode); if (context != nil) { GSIArray watchers = context->watchers; unsigned i = GSIArrayCount(watchers); while (i-- > 0) { GSRunLoopWatcher *info; info = GSIArrayItemAtIndex(watchers, i).obj; if (info->type == type && info->data == data) { info->_invalidated = YES; GSIArrayRemoveItemAtIndex(watchers, i); } } } } @end @implementation NSRunLoop(GNUstepExtensions) - (void) addEvent: (void*)data type: (RunLoopEventType)type watcher: (id)watcher forMode: (NSString*)mode { GSRunLoopWatcher *info; if (mode == nil) { mode = [self currentMode]; if (mode == nil) { mode = NSDefaultRunLoopMode; } } info = [self _getWatcher: data type: type forMode: mode]; if (info != nil && (id)info->receiver == (id)watcher) { /* Increment usage count for this watcher. */ info->count++; } else { /* Remove any existing handler for another watcher. */ [self _removeWatcher: data type: type forMode: mode]; /* Create new object to hold information. */ info = [[GSRunLoopWatcher alloc] initWithType: type receiver: watcher data: data]; /* Add the object to the array for the mode. */ [self _addWatcher: info forMode: mode]; RELEASE(info); /* Now held in array. */ } } - (void) removeEvent: (void*)data type: (RunLoopEventType)type forMode: (NSString*)mode all: (BOOL)removeAll { if (mode == nil) { mode = [self currentMode]; if (mode == nil) { mode = NSDefaultRunLoopMode; } } if (removeAll) { [self _removeWatcher: data type: type forMode: mode]; } else { GSRunLoopWatcher *info; info = [self _getWatcher: data type: type forMode: mode]; if (info) { if (info->count == 0) { [self _removeWatcher: data type: type forMode: mode]; } else { info->count--; } } } } @end /** *

NSRunLoop instances handle various utility tasks that must * be performed repetitively in an application, such as processing input * events, listening for distributed objects communications, firing * [NSTimer]s, and sending notifications and other messages * asynchronously.

* *

There is one run loop per thread in an application, which * may always be obtained through the +currentRunLoop method * (you cannot use -init or +new), * however unless you are using the AppKit and the [NSApplication] class, the * run loop will not be started unless you explicitly send it a * -run message.

* *

At any given point, a run loop operates in a single mode, usually * NSDefaultRunLoopMode. Other options include * NSConnectionReplyMode, and certain modes used by the AppKit.

*/ @implementation NSRunLoop + (void) initialize { if (self == [NSRunLoop class]) { [self currentRunLoop]; theFuture = RETAIN([NSDate distantFuture]); RELEASE([NSObject leakAt: &theFuture]); } } + (NSRunLoop*) _runLoopForThread: (NSThread*) aThread { GSRunLoopThreadInfo *info = GSRunLoopInfoForThread(aThread); NSRunLoop *current = info->loop; if (nil == current) { current = info->loop = [[self alloc] _init]; /* If this is the main thread, set up a housekeeping timer. */ if (nil != current && [GSCurrentThread() isMainThread] == YES) { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSNotificationCenter *ctr; NSNotification *not; NSInvocation *inv; NSTimer *timer; SEL sel; ctr = [NSNotificationCenter defaultCenter]; not = [NSNotification notificationWithName: @"GSHousekeeping" object: nil userInfo: nil]; sel = @selector(postNotification:); inv = [NSInvocation invocationWithMethodSignature: [ctr methodSignatureForSelector: sel]]; [inv setTarget: ctr]; [inv setSelector: sel]; [inv setArgument: ¬ atIndex: 2]; [inv retainArguments]; timer = [[NSTimer alloc] initWithFireDate: nil interval: 30.0 target: inv selector: NULL userInfo: nil repeats: YES]; [current addTimer: timer forMode: NSDefaultRunLoopMode]; #ifdef RL_INTEGRATE_DISPATCH // We leak the queue drainer, because it's integral part of RL // operations GSMainQueueDrainer *drain = [NSObject leak: [[GSMainQueueDrainer new] autorelease]]; [current addEvent: [GSMainQueueDrainer mainQueueFileDescriptor] #ifdef _WIN32 type: ET_HANDLE #else type: ET_RDESC #endif watcher: drain forMode: NSDefaultRunLoopMode]; #endif [arp drain]; } } return current; } + (NSRunLoop*) currentRunLoop { return [self _runLoopForThread: nil]; } + (NSRunLoop*) mainRunLoop { return [self _runLoopForThread: [NSThread mainThread]]; } - (id) init { DESTROY(self); return nil; } - (void) dealloc { #ifdef HAVE_POLL_F if (_extra != 0) { pollextra *e = (pollextra*)_extra; if (e->index != 0) NSZoneFree(NSDefaultMallocZone(), e->index); NSZoneFree(NSDefaultMallocZone(), e); } #endif RELEASE(_contextStack); if (_contextMap != 0) { NSFreeMapTable(_contextMap); } RELEASE(_timedPerformers); [super dealloc]; } /** * Returns the current mode of this runloop. If the runloop is not running * then this method returns nil. */ - (NSString*) currentMode { return _currentMode; } /** * Adds a timer to the loop in the specified mode.
* Timers are removed automatically when they are invalid.
*/ - (void) addTimer: (NSTimer*)timer forMode: (NSString*)mode { GSRunLoopCtxt *context; GSIArray timers; unsigned i; if ([timer isKindOfClass: [NSTimer class]] == NO || [timer isProxy] == YES) { [NSException raise: NSInvalidArgumentException format: @"[%@-%@] not a valid timer", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; } if ([mode isKindOfClass: [NSString class]] == NO) { [NSException raise: NSInvalidArgumentException format: @"[%@-%@] not a valid mode", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; } NSDebugMLLog(@"NSRunLoop", @"add timer for %f in %@", [[timer fireDate] timeIntervalSinceReferenceDate], mode); context = NSMapGet(_contextMap, mode); if (context == nil) { context = [[GSRunLoopCtxt alloc] initWithMode: mode extra: _extra]; NSMapInsert(_contextMap, context->mode, context); RELEASE(context); } timers = context->timers; i = GSIArrayCount(timers); while (i-- > 0) { if (timer == GSIArrayItemAtIndex(timers, i).obj) { return; /* Timer already present */ } } /* * NB. A previous version of the timer code maintained an ordered * array on the theory that we could improve performance by only * checking the first few timers (up to the first one whose fire * date is in the future) each time -limitDateForMode: is called. * The problem with this was that it's possible for one timer to * be added in multiple modes (or to different run loops) and for * a repeated timer this could mean that the firing of the timer * in one mode/loop adjusts its date ... without changing the * ordering of the timers in the other modes/loops which contain * the timer. When the ordering of timers in an array was broken * we could get delays in processing timeouts, so we reverted to * simply having timers in an unordered array and checking them * all each time -limitDateForMode: is called. */ GSIArrayAddItem(timers, (GSIArrayItem)((id)timer)); i = GSIArrayCount(timers); if (i % 1000 == 0 && i > context->maxTimers) { context->maxTimers = i; NSLog(@"WARNING ... there are %u timers scheduled in mode %@ of %@", i, mode, self); } } /* Ensure that the fire date has been updated either by the timeout handler * updating it or by incrementing it ourselves.
* Return YES if it was updated, NO if it was invalidated. */ static BOOL updateTimer(NSTimer *t, NSDate *d, NSTimeInterval now) { if (timerInvalidated(t) == YES) { return NO; } if (timerDate(t) == d) { NSTimeInterval ti = [d timeIntervalSinceReferenceDate]; NSTimeInterval increment = [t timeInterval]; if (increment <= 0.0) { /* Should never get here ... unless a subclass is returning * a bad interval ... we return NO so that the timer gets * removed from the loop. */ NSLog(@"WARNING timer %@ had bad interval ... removed", t); return NO; } ti += increment; // Hopefully a single increment will do. if (ti < now) { NSTimeInterval add; /* Just incrementing the date was insufficient to bring it to * the current time, so we must have missed one or more fire * opportunities, or the fire date has been set on the timer. * If a fire date long ago has been set and the increment value * is really small, we might need to increment very many times * to get the new fire date. To avoid looping for ages, we * calculate the number of increments needed and do them in one * go. */ add = floor((now - ti) / increment); ti += (increment * add); if (ti < now) { ti += increment; } } RELEASE(t->_date); t->_date = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate: ti]; } return YES; } - (NSDate*) _limitDateForContext: (GSRunLoopCtxt *)context { NSDate *when = nil; NSAutoreleasePool *arp = [NSAutoreleasePool new]; GSIArray timers = context->timers; NSTimeInterval now; NSDate *earliest; NSDate *d; NSTimer *t; NSTimeInterval ti; NSTimeInterval ei; unsigned c; unsigned i; ei = 0.0; // Only needed to avoid compiler warning /* * Save current time so we don't keep redoing system call to * get it and so that we check timer fire dates against a known * value at the point when the method was called. * If we refetched the date after firing each timer, the time * taken in firing the timer could be large enough so we would * just keep firing the timer repeatedly and never return from * this method. */ now = GSPrivateTimeNow(); /* Fire the oldest/first valid timer whose fire date has passed * and fire it. * We fire timers in the order in which they were added to the * run loop rather than in date order. This prevents code * from blocking other timers by adding timers whose fire date * is some time in the past... we guarantee fair handling. */ c = GSIArrayCount(timers); for (i = 0; i < c; i++) { t = GSIArrayItemAtIndex(timers, i).obj; if (timerInvalidated(t) == NO) { d = timerDate(t); ti = [d timeIntervalSinceReferenceDate]; if (ti < now) { GSIArrayRemoveItemAtIndexNoRelease(timers, i); [t fire]; GSPrivateNotifyASAP(_currentMode); IF_NO_ARC([arp emptyPool];) if (updateTimer(t, d, now) == YES) { /* Updated ... replace in array. */ GSIArrayAddItemNoRetain(timers, (GSIArrayItem)((id)t)); } else { /* The timer was invalidated, so we can * release it as we aren't putting it back * in the array. */ RELEASE(t); } break; } } } /* Now, find the earliest remaining timer date while removing * any invalidated timers. We iterate from the end of the * array to minimise the amount of array alteration needed. */ earliest = nil; i = GSIArrayCount(timers); while (i-- > 0) { t = GSIArrayItemAtIndex(timers, i).obj; if (timerInvalidated(t) == YES) { GSIArrayRemoveItemAtIndex(timers, i); } else { d = timerDate(t); ti = [d timeIntervalSinceReferenceDate]; if (earliest == nil || ti < ei) { earliest = d; ei = ti; } } } [arp drain]; /* The earliest date of a valid timeout is retained in 'when' * and used as our limit date. */ if (earliest != nil) { when = AUTORELEASE(RETAIN(earliest)); } else { GSIArray watchers = context->watchers; unsigned i = GSIArrayCount(watchers); while (i-- > 0) { GSRunLoopWatcher *w = GSIArrayItemAtIndex(watchers, i).obj; if (w->_invalidated == YES) { GSIArrayRemoveItemAtIndex(watchers, i); } } if (GSIArrayCount(context->watchers) > 0) { when = theFuture; } } return when; } /** * Fires timers whose fire date has passed, and checks timers and limit dates * for input sources, determining the earliest time that any future timeout * becomes due. Returns that date/time.
* Returns distant future if the loop contains no timers, just input sources * without timeouts.
* Returns nil if the loop contains neither timers nor input sources. */ - (NSDate*) limitDateForMode: (NSString*)mode { GSRunLoopCtxt *context; NSDate *when = nil; context = NSMapGet(_contextMap, mode); if (context != nil) { NSString *savedMode = _currentMode; _currentMode = mode; NS_DURING { when = [self _limitDateForContext: context]; _currentMode = savedMode; } NS_HANDLER { _currentMode = savedMode; [localException raise]; } NS_ENDHANDLER NSDebugMLLog(@"NSRunLoop", @"limit date %f in %@", nil == when ? 0.0 : [when timeIntervalSinceReferenceDate], mode); } return when; } /** * Listen for events from input sources.
* If limit_date is nil or in the past, then don't wait; * just fire timers, poll inputs and return, otherwise block * (firing timers when they are due) until input is available * or until the earliest limit date has passed (whichever comes first).
* If the supplied mode is nil, uses NSDefaultRunLoopMode.
* If there are no input sources or timers in the mode, returns immediately. */ - (void) acceptInputForMode: (NSString*)mode beforeDate: (NSDate*)limit_date { GSRunLoopCtxt *context; NSTimeInterval ti = 0; int timeout_ms; NSString *savedMode = _currentMode; NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSAssert(mode, NSInvalidArgumentException); if (mode == nil) { mode = NSDefaultRunLoopMode; } context = NSMapGet(_contextMap, mode); if (nil == context) { return; } _currentMode = mode; [self _checkPerformers: context]; NS_DURING { BOOL done = NO; NSDate *when; while (NO == done) { [arp emptyPool]; when = [self _limitDateForContext: context]; if (nil == when) { NSDebugMLLog(@"NSRunLoop", @"no inputs or timers in mode %@", mode); GSPrivateNotifyASAP(_currentMode); GSPrivateNotifyIdle(_currentMode); /* Pause until the limit date or until we might have * a method to perform in this thread. */ [GSRunLoopCtxt awakenedBefore: nil]; [self _checkPerformers: context]; GSPrivateNotifyASAP(_currentMode); [_contextStack removeObjectIdenticalTo: context]; _currentMode = savedMode; [arp drain]; NS_VOIDRETURN; } else { if (nil == limit_date) { when = nil; } else { when = [when earlierDate: limit_date]; } } /* Find out how much time we should wait, and set SELECT_TIMEOUT. */ if (nil == when || (ti = [when timeIntervalSinceNow]) <= 0.0) { /* Don't wait at all. */ timeout_ms = 0; } else { /* Wait until the LIMIT_DATE. */ if (ti >= INT_MAX / 1000.0) { timeout_ms = INT_MAX; // Far future. } else { timeout_ms = (int)(ti * 1000.0); } } NSDebugMLLog(@"NSRunLoop", @"accept I/P before %d millisec from now in %@", timeout_ms, mode); if ([_contextStack indexOfObjectIdenticalTo: context] == NSNotFound) { [_contextStack addObject: context]; } done = [context pollUntil: timeout_ms within: _contextStack]; if (NO == done) { GSPrivateNotifyIdle(_currentMode); if (nil == limit_date || [limit_date timeIntervalSinceNow] <= 0.0) { done = YES; } } [self _checkPerformers: context]; GSPrivateNotifyASAP(_currentMode); [context endPoll]; /* Once a poll has been completed on a context, we can remove that * context from the stack even if it is actually polling at an outer * level of re-entrancy ... since the poll we have just done will * have handled any events that the outer levels would have wanted * to handle, and the polling for this context will be marked as * ended. */ [_contextStack removeObjectIdenticalTo: context]; } _currentMode = savedMode; } NS_HANDLER { _currentMode = savedMode; [context endPoll]; [_contextStack removeObjectIdenticalTo: context]; [localException raise]; } NS_ENDHANDLER NSDebugMLLog(@"NSRunLoop", @"accept I/P completed in %@", mode); [arp drain]; } - (BOOL) runMode: (NSString*)mode beforeDate: (NSDate*)date { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSString *savedMode = _currentMode; GSRunLoopCtxt *context; NSDate *d; NSAssert(mode != nil, NSInvalidArgumentException); /* Process any pending notifications. */ GSPrivateNotifyASAP(mode); /* And process any performers scheduled in the loop (eg something from * another thread. */ _currentMode = mode; context = NSMapGet(_contextMap, mode); [self _checkPerformers: context]; _currentMode = savedMode; /* Find out how long we can wait before first limit date. * If there are no input sources or timers, return immediately. */ d = [self limitDateForMode: mode]; if (nil == d) { [arp drain]; return NO; } /* Use the earlier of the two dates we have (nil date is like distant past). */ if (nil == date) { [self acceptInputForMode: mode beforeDate: nil]; } else { /* Retain the date in case the firing of a timer (or some other event) * releases it. */ d = [[d earlierDate: date] copy]; [self acceptInputForMode: mode beforeDate: d]; RELEASE(d); } [arp drain]; return YES; } /** * Runs the loop in NSDefaultRunLoopMode by repeated calls to * -runMode:beforeDate: while there are still input sources. Exits when no * more input sources remain. */ - (void) run { [self runUntilDate: theFuture]; } /** * Runs the loop in NSDefaultRunLoopMode by repeated calls to * -runMode:beforeDate: while there are still input sources. Exits when no * more input sources remain, or date is reached, whichever occurs first. */ - (void) runUntilDate: (NSDate*)date { BOOL mayDoMore = YES; /* Positive values are in the future. */ while (YES == mayDoMore) { mayDoMore = [self runMode: NSDefaultRunLoopMode beforeDate: date]; if (nil == date || [date timeIntervalSinceNow] <= 0.0) { mayDoMore = NO; } } } @end /** * OpenStep-compatibility methods for [NSRunLoop]. These methods are also * all in OS X. */ @implementation NSRunLoop (OPENSTEP) /** * Adds port to be monitored in given mode. */ - (void) addPort: (NSPort*)port forMode: (NSString*)mode { [self addEvent: (void*)port type: ET_RPORT watcher: (id)port forMode: (NSString*)mode]; } /** * Cancels any perform operations set up for the specified target * in the receiver. */ - (void) cancelPerformSelectorsWithTarget: (id) target { NSMapEnumerator enumerator; GSRunLoopCtxt *context; void *mode; enumerator = NSEnumerateMapTable(_contextMap); while (NSNextMapEnumeratorPair(&enumerator, &mode, (void**)&context)) { if (context != nil) { GSIArray performers = context->performers; unsigned count = GSIArrayCount(performers); while (count--) { GSRunLoopPerformer *p; p = GSIArrayItemAtIndex(performers, count).obj; if (p->target == target) { GSIArrayRemoveItemAtIndex(performers, count); } } } } NSEndMapTableEnumeration(&enumerator); } /** * Cancels any perform operations set up for the specified target * in the receiver, but only if the value of aSelector and argument * with which the performs were set up match those supplied.
* Matching of the argument may be either by pointer equality or by * use of the [NSObject-isEqual:] method. */ - (void) cancelPerformSelector: (SEL)aSelector target: (id) target argument: (id) argument { NSMapEnumerator enumerator; GSRunLoopCtxt *context; void *mode; enumerator = NSEnumerateMapTable(_contextMap); while (NSNextMapEnumeratorPair(&enumerator, &mode, (void**)&context)) { if (context != nil) { GSIArray performers = context->performers; unsigned count = GSIArrayCount(performers); while (count--) { GSRunLoopPerformer *p; p = GSIArrayItemAtIndex(performers, count).obj; if (p->target == target && sel_isEqual(p->selector, aSelector) && (p->argument == argument || [p->argument isEqual: argument])) { GSIArrayRemoveItemAtIndex(performers, count); } } } } NSEndMapTableEnumeration(&enumerator); } /** * Configure event processing for acting as a server process for distributed * objects. (In the current implementation this is a no-op.) */ - (void) configureAsServer { return; /* Nothing to do here */ } /** * Sets up sending of aSelector to target with argument.
* The selector is sent before the next runloop iteration (unless * cancelled before then) in any of the specified modes.
* The target and argument objects are retained.
* The order value is used to determine the order in which messages * are sent if multiple messages have been set up. Messages with a lower * order value are sent first.
* If the modes array is empty, this method has no effect. */ - (void) performSelector: (SEL)aSelector target: (id)target argument: (id)argument order: (NSUInteger)order modes: (NSArray*)modes { unsigned count = [modes count]; if (count > 0) { NSString *array[count]; GSRunLoopPerformer *item; item = [[GSRunLoopPerformer alloc] initWithSelector: aSelector target: target argument: argument order: order]; if ([modes isProxy]) { unsigned i; for (i = 0; i < count; i++) { array[i] = [modes objectAtIndex: i]; } } else { [modes getObjects: array]; } while (count-- > 0) { NSString *mode = array[count]; unsigned end; unsigned i; GSRunLoopCtxt *context; GSIArray performers; context = NSMapGet(_contextMap, mode); if (context == nil) { context = [[GSRunLoopCtxt alloc] initWithMode: mode extra: _extra]; NSMapInsert(_contextMap, context->mode, context); RELEASE(context); } performers = context->performers; end = GSIArrayCount(performers); for (i = 0; i < end; i++) { GSRunLoopPerformer *p; p = GSIArrayItemAtIndex(performers, i).obj; if (p->order > order) { GSIArrayInsertItem(performers, (GSIArrayItem)((id)item), i); break; } } if (i == end) { GSIArrayInsertItem(performers, (GSIArrayItem)((id)item), i); } i = GSIArrayCount(performers); if (i % 1000 == 0 && i > context->maxPerformers) { context->maxPerformers = i; if (sel_isEqual(aSelector, @selector(fire))) { NSLog(@"WARNING ... there are %u performers scheduled" @" in mode %@ of %@\n(Latest: fires %@)", i, mode, self, target); } else { NSLog(@"WARNING ... there are %u performers scheduled" @" in mode %@ of %@\n(Latest: [%@ %@])", i, mode, self, NSStringFromClass([target class]), NSStringFromSelector(aSelector)); } } } RELEASE(item); } } /** * Removes port to be monitored from given mode. * Ports are also removed if they are detected to be invalid. */ - (void) removePort: (NSPort*)port forMode: (NSString*)mode { [self removeEvent: (void*)port type: ET_RPORT forMode: mode all: NO]; } @end gnustep-base-1.29.0/Source/NSScanner.m000066400000000000000000001074101435650067400174650ustar00rootroot00000000000000/** Implemenation of NSScanner class Copyright (C) 1996,1999 Free Software Foundation, Inc. Author: Eric Norum Date: 1996 Rewrite/optimisation by: Richard Frith-Macdonald Date: 1998 This file is part of the GNUstep Objective-C Library. 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 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 USA. NSScanner class reference $Date$ $Revision$ */ #import "common.h" #if defined(HAVE_FLOAT_H) #include #endif #if !defined(LLONG_MAX) # if defined(__LONG_LONG_MAX__) # define LLONG_MAX __LONG_LONG_MAX__ # define LLONG_MIN (-LLONG_MAX-1) # define ULLONG_MAX (LLONG_MAX * 2ULL + 1) # else # error Neither LLONG_MAX nor __LONG_LONG_MAX__ found # endif #endif #if !defined(ULLONG_MAX) # define ULLONG_MAX (LLONG_MAX * 2ULL + 1) #endif #include #include /* FIXME: May go away once I figure out Unicode */ #define EXPOSE_NSScanner_IVARS 1 #import "GNUstepBase/Unicode.h" #import "Foundation/NSScanner.h" #import "Foundation/NSException.h" #import "Foundation/NSUserDefaults.h" #import "GSPThread.h" #import "GSPrivate.h" @class GSCString; @interface GSCString : NSObject // Help the compiler @end @class GSUnicodeString; @interface GSUnicodeString : NSObject // Help the compiler @end @class GSMutableString; @class GSPlaceholderString; @interface GSPlaceholderString : NSObject // Help the compiler @end static Class NSStringClass; static Class GSCStringClass; static Class GSUnicodeStringClass; static Class GSMutableStringClass; static Class GSPlaceholderStringClass; static id _holder; static NSString *_empty; static NSCharacterSet *defaultSkipSet; static SEL memSel; static NSStringEncoding internalEncoding = NSISOLatin1StringEncoding; /* Table of binary powers of 10 represented by bits in a byte. * Used to convert decimal integer exponents to doubles. */ static double powersOf10[] = { 1.0e1, 1.0e2, 1.0e4, 1.0e8, 1.0e16, 1.0e32, 1.0e64, 1.0e128, 1.0e256 }; static inline unichar myGetC(unsigned char c) { unsigned int size = 1; unichar u = 0; unichar *dst = &u; /* If this fails, u is zero (unchanged) ... return that rather * than raising an exception. */ (void)GSToUnicode(&dst, &size, &c, 1, internalEncoding, 0, 0); return u; } /* * Hack for direct access to internals of an concrete string object. */ typedef GSString *ivars; #define myLength() (((ivars)_string)->_count) #define myByte(I) (((ivars)_string)->_contents.c[I]) #define myUnichar(I) (((ivars)_string)->_contents.u[I]) #define myChar(I) myGetC((((ivars)_string)->_contents.c[I])) #define myCharacter(I) (_isUnicode ? myUnichar(I) : myChar(I)) /* Macro for getting character values when we do not care about values * outside the ASCII range (other than to know they are outside the range). */ #define mySevenBit(I) (_isUnicode ? myUnichar(I) : myByte(I)) /* * Scan characters to be skipped. * Return YES if there are more characters to be scanned. * Return NO if the end of the string is reached. * For internal use only. */ #define skipToNextField() ({\ while (_scanLocation < myLength() && _charactersToBeSkipped != nil \ && (*_skipImp)(_charactersToBeSkipped, memSel, myCharacter(_scanLocation)))\ _scanLocation++;\ (_scanLocation >= myLength()) ? NO : YES;\ }) /** *

* The NSScanner class cluster (currently a single class in * GNUstep) provides a mechanism to parse the contents of a string into * number and string values by making a sequence of scan operations to * step through the string retrieving successive items. *

*

* You can tell the scanner whether its scanning is supposed to be * case sensitive or not, and you can specify a set of characters * to be skipped before each scanning operation (by default, * whitespace and newlines). *

*/ @implementation NSScanner + (void) initialize { if (self == [NSScanner class]) { NSStringEncoding externalEncoding; memSel = @selector(characterIsMember:); defaultSkipSet = [NSCharacterSet whitespaceAndNewlineCharacterSet]; IF_NO_ARC(RETAIN(defaultSkipSet);) NSStringClass = [NSString class]; GSCStringClass = [GSCString class]; GSUnicodeStringClass = [GSUnicodeString class]; GSMutableStringClass = [GSMutableString class]; GSPlaceholderStringClass = [GSPlaceholderString class]; _holder = (id)NSAllocateObject(GSPlaceholderStringClass, 0, 0); _empty = [_holder initWithString: @""]; externalEncoding = [NSString defaultCStringEncoding]; if (GSPrivateIsByteEncoding(externalEncoding) == YES) { internalEncoding = externalEncoding; } } } /** * Create and return a scanner that scans aString.
* Uses -initWithString: and with no locale set. */ + (id) scannerWithString: (NSString *)aString { return AUTORELEASE([[self allocWithZone: NSDefaultMallocZone()] initWithString: aString]); } /** * Returns an NSScanner instance set up to scan aString * (using -initWithString: and with a locale set the default locale * (using -setLocale: */ + (id) localizedScannerWithString: (NSString*)aString { NSScanner *scanner = [self scannerWithString: aString]; if (scanner != nil) { NSDictionary *loc; loc = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]; [scanner setLocale: loc]; } return scanner; } - (void) _setString: (NSString*)aString { _scanLocation = 0; _isUnicode = NO; if (nil == aString) { aString = _empty; } if (aString != _string) { Class c = object_getClass(aString); DESTROY(_string); if (GSObjCIsKindOf(c, GSMutableStringClass) == YES) { _string = [_holder initWithString: aString]; } else if (GSObjCIsKindOf(c, GSUnicodeStringClass) == YES) { _string = RETAIN(aString); } else if (GSObjCIsKindOf(c, GSCStringClass) == YES) { _string = RETAIN(aString); } else if (GSObjCIsKindOf(c, NSStringClass) == YES) { _string = [_holder initWithString: aString]; } else { _string = [_holder initWithString: [aString description]]; } c = object_getClass(_string); if (GSObjCIsKindOf(c, GSUnicodeStringClass) == YES) { _isUnicode = YES; } } } /** Used by NSString/GSString to avoid creating/destroying a new scanner * every time we want to scan a double. * Since this is a private method, we trust that the caller supplies a * valid string argument. */ + (BOOL) _scanDouble: (double*)value from: (NSString*)str { static gs_mutex_t myLock = GS_MUTEX_INIT_STATIC; static NSScanner *doubleScanner = nil; BOOL ok = NO; GS_MUTEX_LOCK(myLock); if (nil == doubleScanner) { doubleScanner = [[self alloc] initWithString: _empty]; } [doubleScanner _setString: str]; ok = [doubleScanner scanDouble: value]; [doubleScanner _setString: _empty]; // Release scanned string GS_MUTEX_UNLOCK(myLock); return ok; } /** * Initialises the scanner to scan aString. The GNUstep * implementation may make an internal copy of the original * string - so it is not safe to assume that if you modify a * mutable string that you initialised a scanner with, the changes * will be visible to the scanner. *
* Returns the scanner object. */ - (id) initWithString: (NSString *)aString { if ((self = [super init]) != nil) { /* Ensure that we have a known string so we can access * its internals directly. */ if (aString == nil) { NSLog(@"Scanner initialised with nil string"); aString = _empty; } if ([aString isKindOfClass: NSStringClass] == NO) { NSLog(@"Scanner initialised with something not a string"); DESTROY(self); } else { [self _setString: aString]; [self setCharactersToBeSkipped: defaultSkipSet]; _decimal = '.'; } } return self; } /* * Deallocate a scanner and all its associated storage. */ - (void) dealloc { RELEASE(_string); TEST_RELEASE(_locale); RELEASE(_charactersToBeSkipped); [super dealloc]; } /** * Returns YES if no more characters remain to be scanned.
* Returns YES if all characters remaining to be scanned * are to be skipped.
* Returns NO if there are characters left to scan. */ - (BOOL) isAtEnd { unsigned int save__scanLocation; BOOL ret; if (_scanLocation >= myLength()) return YES; save__scanLocation = _scanLocation; ret = !skipToNextField(); _scanLocation = save__scanLocation; return ret; } /* * Internal version of scanInt: method. * Does the actual work for scanInt: except for the initial skip. * For internal use only. This method may move the scan location * even if a valid integer is not scanned. * Based on the strtol code from the GNU C library. A little simpler since * we deal only with base 10. * FIXME: I don't use the decimalDigitCharacterSet here since it * includes many more characters than the ASCII digits. I don't * know how to convert those other characters, so I ignore them * for now. For the same reason, I don't try to support all the * possible Unicode plus and minus characters. */ - (BOOL) _scanInt: (int*)value { unsigned int num = 0; const unsigned int limit = UINT_MAX / 10; BOOL negative = NO; BOOL overflow = NO; BOOL got_digits = NO; /* Check for sign */ if (_scanLocation < myLength()) { switch (myCharacter(_scanLocation)) { case '+': _scanLocation++; break; case '-': negative = YES; _scanLocation++; break; } } /* Process digits */ while (_scanLocation < myLength()) { unichar digit = myCharacter(_scanLocation); if ((digit < '0') || (digit > '9')) break; if (!overflow) { if (num >= limit) overflow = YES; else num = num * 10 + (digit - '0'); } _scanLocation++; got_digits = YES; } /* Save result */ if (!got_digits) return NO; if (value) { if (overflow || (num > (negative ? (NSUInteger)INT_MIN : (NSUInteger)INT_MAX))) *value = negative ? INT_MIN: INT_MAX; else if (negative) *value = -num; else *value = num; } return YES; } /** * After initial skipping (if any), this method scans a integer value, * placing it in intValue if that is not null. *
* Returns YES if anything is scanned, NO otherwise. *
* On overflow, INT_MAX or INT_MIN is put into intValue *
* Scans past any excess digits */ - (BOOL) scanInt: (int*)value { unsigned int saveScanLocation = _scanLocation; if (skipToNextField() && [self _scanInt: value]) return YES; _scanLocation = saveScanLocation; return NO; } /* Scan an unsigned long long of the given radix into value. * Internal version used by scanHexInt:, scanHexLongLong: etc. */ - (BOOL) scanUnsignedLongLong_: (unsigned long long int*)value radix: (NSUInteger)radix maximum: (unsigned long long)max gotDigits: (BOOL)gotDigits { unsigned long long int num = 0; unsigned long long int numLimit = max / radix; unsigned long long int digitLimit = max % radix; unsigned long long int digitValue = 0; BOOL overflow = NO; unsigned int saveScanLocation = _scanLocation; /* Process digits */ while (_scanLocation < myLength()) { unichar digit = myCharacter(_scanLocation); switch (digit) { case '0': digitValue = 0; break; case '1': digitValue = 1; break; case '2': digitValue = 2; break; case '3': digitValue = 3; break; case '4': digitValue = 4; break; case '5': digitValue = 5; break; case '6': digitValue = 6; break; case '7': digitValue = 7; break; case '8': digitValue = 8; break; case '9': digitValue = 9; break; case 'a': digitValue = 0xA; break; case 'b': digitValue = 0xB; break; case 'c': digitValue = 0xC; break; case 'd': digitValue = 0xD; break; case 'e': digitValue = 0xE; break; case 'f': digitValue = 0xF; break; case 'A': digitValue = 0xA; break; case 'B': digitValue = 0xB; break; case 'C': digitValue = 0xC; break; case 'D': digitValue = 0xD; break; case 'E': digitValue = 0xE; break; case 'F': digitValue = 0xF; break; default: digitValue = radix; break; } if (digitValue >= radix) { break; } if (!overflow) { if ((num > numLimit) || ((num == numLimit) && (digitValue > digitLimit))) { overflow = YES; } else { num = num * radix + digitValue; } } _scanLocation++; gotDigits = YES; } /* Save result */ if (!gotDigits) { _scanLocation = saveScanLocation; return NO; } if (value) { if (overflow) { *value = ULLONG_MAX; } else { *value = num; } } return YES; } /** * After initial skipping (if any), this method scans an unsigned * integer placing it in value if that is not null. * If the number begins with "0x" or "0X" it is treated as hexadecimal, * otherwise if the number begins with "0" it is treated as octal, * otherwise the number is treated as decimal. *
* Returns YES if anything is scanned, NO otherwise. *
* On overflow, UINT_MAX is put into value *
* Scans past any excess digits */ - (BOOL) scanRadixUnsignedInt: (unsigned int*)value { unsigned int radix; unsigned long long tmp; BOOL gotDigits = NO; unsigned int saveScanLocation = _scanLocation; /* Skip whitespace */ if (!skipToNextField()) { _scanLocation = saveScanLocation; return NO; } /* Check radix */ radix = 10; if ((_scanLocation < myLength()) && (myCharacter(_scanLocation) == '0')) { radix = 8; _scanLocation++; gotDigits = YES; if (_scanLocation < myLength()) { switch (myCharacter(_scanLocation)) { case 'x': case 'X': _scanLocation++; radix = 16; gotDigits = NO; break; } } } if ([self scanUnsignedLongLong_: &tmp radix: radix maximum: UINT_MAX gotDigits: gotDigits]) { if (tmp > UINT_MAX) { *value = UINT_MAX; } else { *value = (unsigned int)tmp; } return YES; } _scanLocation = saveScanLocation; return NO; } /** * After initial skipping (if any), this method scans an unsigned * long long integer placing it in value if that is not null. * If the number begins with "0x" or "0X" it is treated as hexadecimal, * otherwise if the number begins with "0" it is treated as octal, * otherwise the number is treated as decimal. *
* Returns YES if anything is scanned, NO otherwise. *
* On overflow, ULLONG_MAX is put into value *
* Scans past any excess digits */ - (BOOL) scanRadixUnsignedLongLong: (unsigned long long*)value { unsigned int radix; BOOL gotDigits = NO; unsigned int saveScanLocation = _scanLocation; /* Skip whitespace */ if (!skipToNextField()) { _scanLocation = saveScanLocation; return NO; } /* Check radix */ radix = 10; if ((_scanLocation < myLength()) && (myCharacter(_scanLocation) == '0')) { radix = 8; _scanLocation++; gotDigits = YES; if (_scanLocation < myLength()) { switch (myCharacter(_scanLocation)) { case 'x': case 'X': _scanLocation++; radix = 16; gotDigits = NO; break; } } } if ([self scanUnsignedLongLong_: value radix: radix maximum: ULLONG_MAX gotDigits: gotDigits]) { return YES; } _scanLocation = saveScanLocation; return NO; } /** * After initial skipping (if any), this method scans a hexadecimal * integer value (optionally prefixed by "0x" or "0X"), * placing it in intValue if that is not null. *
* Returns YES if anything is scanned, NO otherwise. *
* On overflow, INT_MAX or INT_MIN is put into intValue *
* Scans past any excess digits */ - (BOOL) scanHexInt: (unsigned int*)value { unsigned int saveScanLocation = _scanLocation; unsigned long long tmp; /* Skip whitespace */ if (!skipToNextField()) { _scanLocation = saveScanLocation; return NO; } if ((_scanLocation < myLength()) && (myCharacter(_scanLocation) == '0')) { _scanLocation++; if (_scanLocation < myLength()) { switch (myCharacter(_scanLocation)) { case 'x': case 'X': _scanLocation++; // Scan beyond the 0x prefix break; default: _scanLocation--; // Scan from the initial digit break; } } else { _scanLocation--; // Just scan the zero. } } if ([self scanUnsignedLongLong_: &tmp radix: 16 maximum: UINT_MAX gotDigits: NO]) { *value = (unsigned int)tmp; return YES; } _scanLocation = saveScanLocation; return NO; } /** * After initial skipping (if any), this method scans a long * decimal integer value placing it in longLongValue if that * is not null. *
* Returns YES if anything is scanned, NO otherwise. *
* On overflow, LLONG_MAX or LLONG_MIN is put into * longLongValue *
* Scans past any excess digits */ - (BOOL) scanLongLong: (long long *)value { unsigned long long num = 0; const unsigned long long limit = ULLONG_MAX / 10; BOOL negative = NO; BOOL overflow = NO; BOOL got_digits = NO; unsigned int saveScanLocation = _scanLocation; /* Skip whitespace */ if (!skipToNextField()) { _scanLocation = saveScanLocation; return NO; } /* Check for sign */ if (_scanLocation < myLength()) { switch (myCharacter(_scanLocation)) { case '+': _scanLocation++; break; case '-': negative = YES; _scanLocation++; break; } } /* Process digits */ while (_scanLocation < myLength()) { unichar digit = myCharacter(_scanLocation); if ((digit < '0') || (digit > '9')) break; if (!overflow) { if (num >= limit) overflow = YES; else num = num * 10 + (digit - '0'); } _scanLocation++; got_digits = YES; } /* Save result */ if (!got_digits) { _scanLocation = saveScanLocation; return NO; } if (value) { if (negative) { if (overflow || (num > (unsigned long long)LLONG_MIN)) *value = LLONG_MIN; else *value = -num; } else { if (overflow || (num > (unsigned long long)LLONG_MAX)) *value = LLONG_MAX; else *value = num; } } return YES; } /** * After initial skipping (if any), this method scans a hexadecimal * long long value (optionally prefixed by "0x" or "0X"), * placing it in longLongValue if that is not null. *
* Returns YES if anything is scanned, NO otherwise. *
* On overflow, ULLONG_MAX or ULLONG_MAX is put into longLongValue *
* Scans past any excess digits */ - (BOOL) scanHexLongLong: (unsigned long long*)value { unsigned int saveScanLocation = _scanLocation; /* Skip whitespace */ if (!skipToNextField()) { _scanLocation = saveScanLocation; return NO; } if ((_scanLocation < myLength()) && (myCharacter(_scanLocation) == '0')) { _scanLocation++; if (_scanLocation < myLength()) { switch (myCharacter(_scanLocation)) { case 'x': case 'X': _scanLocation++; // Scan beyond the 0x prefix break; default: _scanLocation--; // Scan from the initial digit break; } } else { _scanLocation--; // Just scan the zero. } } if ([self scanUnsignedLongLong_: value radix: 16 maximum: ULLONG_MAX gotDigits: NO]) { return YES; } _scanLocation = saveScanLocation; return NO; } /** * Not implemented. */ - (BOOL) scanDecimal: (NSDecimal*)value { [self notImplemented:_cmd]; /* FIXME */ return NO; } /** * After initial skipping (if any), this method scans a double value, * placing it in doubleValue if that is not null. * Returns YES if anything is scanned, NO otherwise. *
* On overflow, HUGE_VAL or - HUGE_VAL is put into doubleValue *
* On underflow, 0.0 is put into doubleValue *
* Scans past any excess digits */ - (BOOL) scanDouble: (double *)value { unichar c = 0; char mantissa[20]; char *ptr; double *d; double result; double e; int exponent = 0; BOOL negativeMantissa = NO; BOOL negativeExponent = NO; unsigned shift = 0; int mantissaLength; int dotPos = -1; int hi = 0; int lo = 0; BOOL mantissaDigit = NO; unsigned int saveScanLocation = _scanLocation; /* Skip whitespace */ if (!skipToNextField()) { _scanLocation = saveScanLocation; return NO; } /* Check for sign */ if (_scanLocation < myLength()) { switch (mySevenBit(_scanLocation)) { case '+': _scanLocation++; break; case '-': _scanLocation++; negativeMantissa = YES; break; } } if (_scanLocation >= myLength()) { _scanLocation = saveScanLocation; return NO; } /* Now we build up the mantissa digits. Leading zeros are ignored, but * those after the decimal point are counted in order to adjust the * exponent later. * Excess digits are also ignored ... a double can only handle up to 18 * digits of precision. */ for (mantissaLength = 0; _scanLocation < myLength(); _scanLocation++) { c = mySevenBit(_scanLocation); if (c < '0' || c > '9') { if (dotPos >= 0) { break; // Already found dot; must be end of mantissa } /* The decimal separator can in theory be outside the ascii range, * and if it is we must fetch the current unicode character in order * to perform the comparison. */ if (_decimal == c || (_decimal > 127 && _decimal == myCharacter(_scanLocation))) { dotPos = mantissaLength; } else { break; // Not a dot; must be end of mantissa } } else { mantissaDigit = YES; if (0 == mantissaLength && '0' == c) { if (dotPos >= 0) { shift++; // Leading zero after decimal place } } else if (mantissaLength < 19) { mantissa[mantissaLength++] = c; } } } if (NO == mantissaDigit) { _scanLocation = saveScanLocation; return NO; } if (mantissaLength > 18) { /* Mantissa too long ... ignore excess. */ mantissaLength = 18; } if (dotPos < 0) { dotPos = mantissaLength; } dotPos -= mantissaLength; /* Convert mantissa characters to a double value */ for (ptr = mantissa; mantissaLength > 9; mantissaLength -= 1) { c = *ptr; ptr += 1; hi = hi * 10 + (c - '0'); } for (; mantissaLength > 0; mantissaLength -= 1) { c = *ptr; ptr += 1; lo = lo * 10 + (c - '0'); } result = (1.0e9 * hi) + lo; /* Scan the exponent (if any) */ if (_scanLocation < myLength() && ((c = mySevenBit(_scanLocation)) == 'e' || c == 'E')) { unsigned saveExpLoc = _scanLocation; _scanLocation++; // Step past E/e if (_scanLocation >= myLength()) { _scanLocation = saveExpLoc; // No exponent } else { switch (mySevenBit(_scanLocation)) { case '+': _scanLocation++; break; case '-': _scanLocation++; negativeExponent = YES; break; } if (_scanLocation >= myLength() || (c = mySevenBit(_scanLocation)) < '0' || c > '9') { _scanLocation = saveExpLoc; // No exponent } else { exponent = c - '0'; _scanLocation++; while (_scanLocation < myLength() && (c = mySevenBit(_scanLocation)) >= '0' && c <= '9') { exponent = exponent * 10 + (c - '0'); _scanLocation++; } } } } /* Add in the amount to shift the exponent depending on the position * of the decimal point in the mantissa and check the adjusted sign * of the exponent. */ if (YES == negativeExponent) { exponent = dotPos - exponent; } else { exponent = dotPos + exponent; } exponent -= shift; if (exponent < 0) { negativeExponent = YES; exponent = -exponent; } else { negativeExponent = NO; } if (exponent > 511) { _scanLocation = saveScanLocation; return NO; // Maximum exponent exceeded } /* Convert the exponent to a double then apply it to the value from * the mantissa. */ e = 1.0; for (d = powersOf10; exponent != 0; exponent >>= 1, d += 1) { if (exponent & 1) { e *= *d; } } if (YES == negativeExponent) { result /= e; } else { result *= e; } if (0 != value) { if (YES == negativeMantissa) { *value = -result; } else { *value = result; } } return YES; } /** * After initial skipping (if any), this method scans a float value, * placing it in floatValue if that is not null. * Returns YES if anything is scanned, NO otherwise. *
* On overflow, HUGE_VAL or - HUGE_VAL is put into floatValue *
* On underflow, 0.0 is put into floatValue *
* Scans past any excess digits */ - (BOOL) scanFloat: (float*)value { double num; if (value == NULL) return [self scanDouble: NULL]; if ([self scanDouble: &num]) { *value = num; return YES; } return NO; } /** * After initial skipping (if any), this method scans any characters * from aSet, terminating when a character not in the set * is found.
* Returns YES if any character is scanned, NO otherwise.
* If value is not null, any character scanned are * stored in a string returned in this location. */ - (BOOL) scanCharactersFromSet: (NSCharacterSet *)aSet intoString: (NSString **)value { unsigned int saveScanLocation = _scanLocation; if (skipToNextField()) { unsigned int start; BOOL (*memImp)(NSCharacterSet*, SEL, unichar); if (aSet == _charactersToBeSkipped) memImp = _skipImp; else memImp = (BOOL (*)(NSCharacterSet*, SEL, unichar)) [aSet methodForSelector: memSel]; start = _scanLocation; if (_isUnicode) { while (_scanLocation < myLength()) { if ((*memImp)(aSet, memSel, myUnichar(_scanLocation)) == NO) break; _scanLocation++; } } else { while (_scanLocation < myLength()) { if ((*memImp)(aSet, memSel, myChar(_scanLocation)) == NO) break; _scanLocation++; } } if (_scanLocation != start) { if (value != 0) { NSRange range; range.location = start; range.length = _scanLocation - start; *value = [_string substringWithRange: range]; } return YES; } } _scanLocation = saveScanLocation; return NO; } /** * After initial skipping (if any), this method scans characters until * it finds one in set. The scanned characters are placed in * stringValue if that is not null. *
* Returns YES if anything is scanned, NO otherwise. */ - (BOOL) scanUpToCharactersFromSet: (NSCharacterSet *)aSet intoString: (NSString **)value { unsigned int saveScanLocation = _scanLocation; unsigned int start; BOOL (*memImp)(NSCharacterSet*, SEL, unichar); if (!skipToNextField()) return NO; if (aSet == _charactersToBeSkipped) memImp = _skipImp; else memImp = (BOOL (*)(NSCharacterSet*, SEL, unichar)) [aSet methodForSelector: memSel]; start = _scanLocation; if (_isUnicode) { while (_scanLocation < myLength()) { if ((*memImp)(aSet, memSel, myUnichar(_scanLocation)) == YES) break; _scanLocation++; } } else { while (_scanLocation < myLength()) { if ((*memImp)(aSet, memSel, myChar(_scanLocation)) == YES) break; _scanLocation++; } } if (_scanLocation == start) { _scanLocation = saveScanLocation; return NO; } if (value) { NSRange range; range.location = start; range.length = _scanLocation - start; *value = [_string substringWithRange: range]; } return YES; } /** * After initial skipping (if any), this method scans for string * and places the characters found in value if that is not null.
* Returns YES if anything is scanned, NO otherwise. */ - (BOOL) scanString: (NSString *)string intoString: (NSString **)value { NSRange range; unsigned int saveScanLocation = _scanLocation; if (skipToNextField() == NO) { return NO; } range.location = _scanLocation; range.length = [string length]; if (range.location + range.length > myLength()) return NO; range = [_string rangeOfString: string options: _caseSensitive ? 0 : NSCaseInsensitiveSearch range: range]; if (range.length == 0) { _scanLocation = saveScanLocation; return NO; } if (value) *value = [_string substringWithRange: range]; _scanLocation += range.length; return YES; } /** *

After initial skipping (if any), this method scans characters until * it finds string. The scanned characters are placed in * value if that is not null. If string is not found, all the characters * up to the end of the scanned string will be returned. *

* Returns YES if anything is scanned, NO otherwise.
*

NB. If the current scanner location points to a copy of string, or * points to skippable characters immediately before a copy of string * then this method returns NO since it finds no characters to store * in value before it finds string. *

*

To count the occurrences of string, this should be used in * conjunction with the -scanString:intoString: method. *

* * NSString *ch = @"["; * unsigned total = 0; * * [scanner scanUpToString: ch intoString: NULL]; * while ([scanner scanString: ch intoString: NULL] == YES) * { * total++; * [scanner scanUpToString: ch intoString: NULL]; * } * NSLog(@"total %d", total); * */ - (BOOL) scanUpToString: (NSString *)string intoString: (NSString **)value { NSRange range; NSRange found; unsigned int saveScanLocation = _scanLocation; if (skipToNextField() == NO) { return NO; } range.location = _scanLocation; range.length = myLength() - _scanLocation; found = [_string rangeOfString: string options: _caseSensitive ? 0 : NSCaseInsensitiveSearch range: range]; if (found.length) range.length = found.location - _scanLocation; if (range.length == 0) { _scanLocation = saveScanLocation; return NO; } if (value) *value = [_string substringWithRange: range]; _scanLocation += range.length; return YES; } /** * Returns the string being scanned. */ - (NSString *) string { return _string; } /** * Returns the current position that the scanner has reached in * scanning the string. This is the position at which the next scan * operation will begin. */ - (NSUInteger) scanLocation { return _scanLocation; } /** * This method sets the location in the scanned string at which the * next scan operation begins. * Raises an NSRangeException if index is beyond the end of the * scanned string. */ - (void) setScanLocation: (NSUInteger)anIndex { if (_scanLocation <= myLength()) _scanLocation = anIndex; else [NSException raise: NSRangeException format: @"Attempt to set scan location beyond end of string"]; } /** * If the scanner is set to be case-sensitive in its scanning of * the string (other than characters to be skipped), this method * returns YES, otherwise it returns NO. *
* The default is for a scanner to not be case sensitive. */ - (BOOL) caseSensitive { return _caseSensitive; } /** * Sets the case sensitivity of the scanner. *
* Case sensitivity governs matching of characters being scanned, * but does not effect the characters in the set to be skipped. *
* The default is for a scanner to not be case sensitive. */ - (void) setCaseSensitive: (BOOL)flag { _caseSensitive = flag; } /** * Returns a set of characters containing those characters that the * scanner ignores when starting any scan operation. Once a character * not in this set has been encountered during an operation, skipping * is finished, and any further characters from this set that are * found are scanned normally. *
* The default for this is the whitespaceAndNewlineCharacterSet. */ - (NSCharacterSet *) charactersToBeSkipped { return _charactersToBeSkipped; } /** * Sets the set of characters that the scanner will skip over at the * start of each scanning operation to be skipSet. * Skipping is performed by literal character matching - the case * sensitivity of the scanner does not effect it. * If this is set to nil, no skipping is done. *
* The default for this is the whitespaceAndNewlineCharacterSet. */ - (void) setCharactersToBeSkipped: (NSCharacterSet *)aSet { ASSIGNCOPY(_charactersToBeSkipped, aSet); _skipImp = (BOOL (*)(NSCharacterSet*, SEL, unichar)) [_charactersToBeSkipped methodForSelector: memSel]; } /** * Returns the locale set for the scanner, or nil if no locale has * been set. A scanner uses it's locale to alter the way it handles * scanning - it uses the NSDecimalSeparator value for scanning * numbers. */ - (NSDictionary *) locale { return _locale; } /** * This method sets the locale used by the scanner to aLocale. * The locale may be set to nil. */ - (void) setLocale: (NSDictionary *)localeDictionary { ASSIGN(_locale, localeDictionary); /* * Get decimal point character from locale if necessary. */ if (_locale == nil) { _decimal = '.'; } else { NSString *pointString; pointString = [_locale objectForKey: NSDecimalSeparator]; if ([pointString length] > 0) _decimal = [pointString characterAtIndex: 0]; else _decimal = '.'; } } /* * NSCopying protocol */ - (id) copyWithZone: (NSZone *)zone { NSScanner *n = [[self class] allocWithZone: zone]; n = [n initWithString: _string]; [n setCharactersToBeSkipped: _charactersToBeSkipped]; [n setLocale: _locale]; [n setScanLocation: _scanLocation]; [n setCaseSensitive: _caseSensitive]; return n; } - (BOOL) scanHexDouble: (double *)result { return NO; // FIXME } - (BOOL) scanHexFloat: (float *)result { return NO; // FIXME } - (BOOL) scanInteger: (NSInteger *)value { #if GS_SIZEOF_VOIDP == GS_SIZEOF_INT return [self scanInt: (int *)value]; #else return [self scanLongLong: (long long *)value]; #endif } @end gnustep-base-1.29.0/Source/NSScriptClassDescription.m000066400000000000000000000020631435650067400225300ustar00rootroot00000000000000 /* Implementation of class NSScriptClassDescription Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory John Casamento Date: Sep 2019 This file is part of the GNUstep Library. 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 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 USA. */ #include @implementation NSScriptClassDescription @end gnustep-base-1.29.0/Source/NSScriptCoercionHandler.m000066400000000000000000000020601435650067400223130ustar00rootroot00000000000000 /* Implementation of class NSScriptCoercionHandler Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory John Casamento Date: Sep 2019 This file is part of the GNUstep Library. 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 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 USA. */ #include @implementation NSScriptCoercionHandler @end gnustep-base-1.29.0/Source/NSScriptCommand.m000066400000000000000000000020301435650067400206270ustar00rootroot00000000000000 /* Implementation of class NSScriptCommand Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory John Casamento Date: Sep 2019 This file is part of the GNUstep Library. 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 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 USA. */ #include @implementation NSScriptCommand @end gnustep-base-1.29.0/Source/NSScriptCommandDescription.m000066400000000000000000000020711435650067400230400ustar00rootroot00000000000000 /* Implementation of class NSScriptCommandDescription Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory John Casamento Date: Sep 2019 This file is part of the GNUstep Library. 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 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 USA. */ #include @implementation NSScriptCommandDescription @end gnustep-base-1.29.0/Source/NSScriptExecutionContext.m000066400000000000000000000020631435650067400225670ustar00rootroot00000000000000 /* Implementation of class NSScriptExecutionContext Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory John Casamento Date: Sep 2019 This file is part of the GNUstep Library. 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 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 USA. */ #include @implementation NSScriptExecutionContext @end gnustep-base-1.29.0/Source/NSScriptKeyValueCoding.m000066400000000000000000000020551435650067400221310ustar00rootroot00000000000000 /* Implementation of class NSScriptKeyValueCoding Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory John Casamento Date: Sep 2019 This file is part of the GNUstep Library. 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 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 USA. */ #include @implementation NSScriptKeyValueCoding @end gnustep-base-1.29.0/Source/NSScriptObjectSpecifiers.m000066400000000000000000000020631435650067400225020ustar00rootroot00000000000000 /* Implementation of class NSScriptObjectSpecifiers Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory John Casamento Date: Sep 2019 This file is part of the GNUstep Library. 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 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 USA. */ #include @implementation NSScriptObjectSpecifiers @end gnustep-base-1.29.0/Source/NSScriptStandardSuiteCommands.m000066400000000000000000000021021435650067400235050ustar00rootroot00000000000000 /* Implementation of class NSScriptStandardSuiteCommands Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory John Casamento Date: Sep 2019 This file is part of the GNUstep Library. 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 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 USA. */ #include @implementation NSScriptStandardSuiteCommands @end gnustep-base-1.29.0/Source/NSScriptSuiteRegistry.m000066400000000000000000000020521435650067400220770ustar00rootroot00000000000000 /* Implementation of class NSScriptSuiteRegistry Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory John Casamento Date: Sep 2019 This file is part of the GNUstep Library. 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 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 USA. */ #include @implementation NSScriptSuiteRegistry @end gnustep-base-1.29.0/Source/NSSerializer.m000066400000000000000000000573011435650067400202100ustar00rootroot00000000000000/** Class for serialization in GNUStep Copyright (C) 1997 Free Software Foundation, Inc. Written by: Richard Frith-Macdoanld Date: August 1997 This file is part of the GNUstep Base Library. 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 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 USA. NSSerializer class reference $Date$ $Revision$ */ #import "common.h" #import "Foundation/NSData.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSArray.h" #import "Foundation/NSException.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSProxy.h" #import "Foundation/NSLock.h" #import "Foundation/NSSet.h" #import "Foundation/NSThread.h" #import "Foundation/NSNotification.h" #import "Foundation/NSNotificationQueue.h" #import "Foundation/NSValue.h" #import "GSPrivate.h" @class GSDictionary; @class GSMutableDictionary; @interface GSMutableDictionary : NSObject // Help the compiler @end @class NSDataMalloc; @interface NSDataMalloc : NSObject // Help the compiler @end /* * Setup for inline operation of string map tables. */ #define GSI_MAP_KTYPES GSUNION_OBJ #define GSI_MAP_VTYPES GSUNION_NSINT #define GSI_MAP_RETAIN_KEY(M, X) #define GSI_MAP_RELEASE_KEY(M, X) #define GSI_MAP_RETAIN_VAL(M, X) #define GSI_MAP_RELEASE_VAL(M, X) #define GSI_MAP_HASH(M, X) [(X).obj hash] #define GSI_MAP_EQUAL(M, X,Y) [(X).obj isEqualToString: (Y).obj] #define GSI_MAP_NOCLEAN 1 #include "GNUstepBase/GSIMap.h" /* * Setup for inline operation of string arrays. */ #define GSI_ARRAY_NO_RETAIN 1 #define GSI_ARRAY_NO_RELEASE 1 #define GSI_ARRAY_TYPES GSUNION_OBJ #include "GNUstepBase/GSIArray.h" /* * Define constants for data types and variables to hold them. */ #define ST_XREF 0 #define ST_CSTRING 1 #define ST_STRING 2 #define ST_ARRAY 3 #define ST_MARRAY 4 #define ST_DICT 5 #define ST_MDICT 6 #define ST_DATA 7 #define ST_DATE 8 #define ST_NUMBER 9 static char st_xref = (char)ST_XREF; static char st_cstring = (char)ST_CSTRING; static char st_string = (char)ST_STRING; static char st_array = (char)ST_ARRAY; static char st_marray = (char)ST_MARRAY; static char st_dict = (char)ST_DICT; static char st_mdict = (char)ST_MDICT; static char st_data = (char)ST_DATA; static char st_date = (char)ST_DATE; static char st_number = (char)ST_NUMBER; /* * Variables to cache class information. These are used to check how * an instance should be serialized. */ static Class ArrayClass = 0; static Class MutableArrayClass = 0; static Class DataClass = 0; static Class DateClass = 0; static Class DictionaryClass = 0; static Class MutableDictionaryClass = 0; static Class StringClass = 0; static Class NumberClass = 0; typedef struct { NSMutableData *data; void (*appImp)(NSData*,SEL,const void*,unsigned); void* (*datImp)(NSMutableData*,SEL); // Bytes pointer. unsigned int (*lenImp)(NSData*,SEL); // Length of data. void (*serImp)(NSMutableData*,SEL,int); // Serialize integer. void (*setImp)(NSMutableData*,SEL,unsigned); // Set length of data. unsigned count; // String counter. GSIMapTable_t map; // For uniquing. BOOL shouldUnique; // Do we do uniquing? } _NSSerializerInfo; static SEL appSel; static SEL datSel; static SEL lenSel; static SEL serSel; static SEL setSel; static void initSerializerInfo(_NSSerializerInfo* info, NSMutableData *d, BOOL u) { Class c; c = object_getClass(d); info->data = d; info->appImp = (void (*)(NSData*,SEL,const void*,unsigned)) class_getMethodImplementation(c, appSel); info->datImp = (void* (*)(NSMutableData*,SEL)) class_getMethodImplementation(c, datSel); info->lenImp = (unsigned int (*)(NSData*,SEL)) class_getMethodImplementation(c, lenSel); info->serImp = (void (*)(NSMutableData*,SEL,int)) class_getMethodImplementation(c, serSel); info->setImp = (void (*)(NSMutableData*,SEL,unsigned)) class_getMethodImplementation(c, setSel); info->shouldUnique = u; (*info->appImp)(d, appSel, &info->shouldUnique, 1); if (u) { GSIMapInitWithZoneAndCapacity(&info->map, NSDefaultMallocZone(), 16); info->count = 0; } } static void endSerializerInfo(_NSSerializerInfo* info) { if (info->shouldUnique) GSIMapEmptyMap(&info->map); } static void serializeToInfo(id object, _NSSerializerInfo* info) { Class c; if (object == nil || GSObjCIsInstance(object) == NO) { [NSException raise: NSInvalidArgumentException format: @"Class (%@) in property list - expected instance", [object description]]; } c = object_getClass(object); if (GSObjCIsKindOf(c, StringClass) /* We can only save it as a c-string if it only contains ASCII characters. Other characters might be decoded incorrectly when deserialized since the c-string encoding might be different then. */ && [object canBeConvertedToEncoding: NSASCIIStringEncoding]) { GSIMapNode node; if (info->shouldUnique) node = GSIMapNodeForKey(&info->map, (GSIMapKey)object); else node = 0; if (node == 0) { unsigned slen; unsigned dlen; slen = [object length] + 1; (*info->appImp)(info->data, appSel, &st_cstring, 1); (*info->serImp)(info->data, serSel, slen); dlen = (*info->lenImp)(info->data, lenSel); (*info->setImp)(info->data, setSel, dlen + slen); [object getCString: (*info->datImp)(info->data, datSel) + dlen maxLength: slen encoding: NSASCIIStringEncoding]; if (info->shouldUnique) GSIMapAddPair(&info->map, (GSIMapKey)object, (GSIMapVal)(NSUInteger)info->count++); } else { (*info->appImp)(info->data, appSel, &st_xref, 1); (*info->serImp)(info->data, serSel, node->value.nsu); } } else if (GSObjCIsKindOf(c, StringClass)) { GSIMapNode node; if (info->shouldUnique) node = GSIMapNodeForKey(&info->map, (GSIMapKey)object); else node = 0; if (node == 0) { unsigned slen; unsigned dlen; slen = [object length]; (*info->appImp)(info->data, appSel, &st_string, 1); (*info->serImp)(info->data, serSel, slen); dlen = (*info->lenImp)(info->data, lenSel); (*info->setImp)(info->data, setSel, dlen + slen*sizeof(unichar)); #if NEED_WORD_ALIGNMENT /* * When packing data, an item may not be aligned on a * word boundary, so we work with an aligned buffer * and use memcmpy() */ if ((dlen % __alignof__(uint32_t)) != 0) { unichar buffer[slen]; [object getCharacters: buffer]; memcpy((*info->datImp)(info->data, datSel) + dlen, buffer, slen*sizeof(unichar)); } else #endif [object getCharacters: (*info->datImp)(info->data, datSel) + dlen]; if (info->shouldUnique) GSIMapAddPair(&info->map, (GSIMapKey)object, (GSIMapVal)(NSUInteger)info->count++); } else { (*info->appImp)(info->data, appSel, &st_xref, 1); (*info->serImp)(info->data, serSel, node->value.nsu); } } else if (GSObjCIsKindOf(c, ArrayClass)) { unsigned int count; if ([object isKindOfClass: MutableArrayClass]) (*info->appImp)(info->data, appSel, &st_marray, 1); else (*info->appImp)(info->data, appSel, &st_array, 1); count = [object count]; (*info->serImp)(info->data, serSel, count); if (count) { id objects[count]; unsigned int i; if ([object isProxy]) { for (i = 0; i < count; i++) { objects[i] = [object objectAtIndex: i]; } } else { [object getObjects: objects]; } for (i = 0; i < count; i++) { serializeToInfo(objects[i], info); } } } else if (GSObjCIsKindOf(c, DictionaryClass)) { NSEnumerator *e = [object keyEnumerator]; id k; IMP nxtImp; IMP objImp; nxtImp = [e methodForSelector: @selector(nextObject)]; objImp = [object methodForSelector: @selector(objectForKey:)]; if ([object isKindOfClass: MutableDictionaryClass]) (*info->appImp)(info->data, appSel, &st_mdict, 1); else (*info->appImp)(info->data, appSel, &st_dict, 1); (*info->serImp)(info->data, serSel, [object count]); while ((k = (*nxtImp)(e, @selector(nextObject))) != nil) { id o = (*objImp)(object, @selector(objectForKey:), k); serializeToInfo(k, info); serializeToInfo(o, info); } } else if (GSObjCIsKindOf(c, DataClass)) { (*info->appImp)(info->data, appSel, &st_data, 1); (*info->serImp)(info->data, serSel, [object length]); (*info->appImp)(info->data, appSel, [object bytes], [object length]); } else if (GSObjCIsKindOf(c, DateClass)) { NSTimeInterval ti = [object timeIntervalSinceReferenceDate]; (*info->appImp)(info->data, appSel, &st_date, 1); [info->data serializeDataAt: &ti ofObjCType: @encode(NSTimeInterval) context: nil]; } else if (GSObjCIsKindOf(c, NumberClass)) { double d = [object doubleValue]; (*info->appImp)(info->data, appSel, &st_number, 1); [info->data serializeDataAt: &d ofObjCType: @encode(double) context: nil]; } else { [NSException raise: NSInvalidArgumentException format: @"Unknown class (%@) in property list", [c description]]; } } @implementation NSSerializer static BOOL shouldBeCompact = NO; + (void) initialize { if (self == [NSSerializer class]) { appSel = @selector(appendBytes:length:); datSel = @selector(mutableBytes); lenSel = @selector(length); serSel = @selector(serializeInt:); setSel = @selector(setLength:); ArrayClass = [NSArray class]; MutableArrayClass = [NSMutableArray class]; DataClass = [NSData class]; DateClass = [NSDate class]; NumberClass = [NSNumber class]; DictionaryClass = [NSDictionary class]; MutableDictionaryClass = [NSMutableDictionary class]; StringClass = [NSString class]; } } /** * Converts the supplied propertyList into a serialized representation * in the returned NSData object. */ + (NSData*) serializePropertyList: (id)propertyList { _NSSerializerInfo info; NSMutableData *d; NSAssert(propertyList != nil, NSInvalidArgumentException); d = [NSMutableData dataWithCapacity: 1024]; initSerializerInfo(&info, d, shouldBeCompact); serializeToInfo(propertyList, &info); endSerializerInfo(&info); return info.data; } /** * Converts the supplied propertyList into a serialized representation * stored in d. */ + (void) serializePropertyList: (id)propertyList intoData: (NSMutableData*)d { _NSSerializerInfo info; NSAssert(propertyList != nil, NSInvalidArgumentException); NSAssert(d != nil, NSInvalidArgumentException); initSerializerInfo(&info, d, shouldBeCompact); serializeToInfo(propertyList, &info); endSerializerInfo(&info); } @end @implementation NSSerializer (GNUstep) + (void) serializePropertyList: (id)propertyList intoData: (NSMutableData*)d compact: (BOOL)flag { _NSSerializerInfo info; NSAssert(propertyList != nil, NSInvalidArgumentException); NSAssert(d != nil, NSInvalidArgumentException); initSerializerInfo(&info, d, flag); serializeToInfo(propertyList, &info); endSerializerInfo(&info); } + (void) shouldBeCompact: (BOOL)flag { shouldBeCompact = flag; } @end static BOOL uniquing = NO; /* Make incoming strings unique */ /* * Variables to cache class information. These are used to create instances * when deserializing. */ static Class MACls = 0; /* Mutable Array */ static Class DCls = 0; /* Data */ static Class MDCls = 0; /* Mutable Dictionary */ typedef struct { NSData *data; unsigned *cursor; BOOL mutable; BOOL didUnique; void (*debImp)(); unsigned int (*deiImp)(); GSIArray_t array; } _NSDeserializerInfo; static SEL debSel; static SEL deiSel; static SEL dInitSel; static SEL maInitSel; static SEL mdInitSel; static SEL maAddSel; static SEL mdSetSel; static IMP dInitImp; static IMP maInitImp; static IMP mdInitImp; static IMP maAddImp; static IMP mdSetImp; static BOOL initDeserializerInfo(_NSDeserializerInfo* info, NSData *d, unsigned *c, BOOL m) { unsigned char u; info->data = d; info->cursor = c; info->mutable = m; info->debImp = (void (*)())[d methodForSelector: debSel]; info->deiImp = (unsigned int (*)())[d methodForSelector: deiSel]; (*info->debImp)(d, debSel, &u, 1, c); if (u == 0 || u == 1) { info->didUnique = u; // Old (current) format } else { if (u == 'G') { const unsigned char *b = [d bytes]; unsigned int l = [d length]; if (*c + 11 < l && memcmp(&b[*c-1], "GNUstepSer", 10) == 0) { *c += 9; (*info->debImp)(d, debSel, &u, 1, c); NSLog(@"Serialised data version %d not supported ..." @" try another version of GNUstep", u); return NO; } } NSLog(@"Bad serialised data"); return NO; } if (info->didUnique) { GSIArrayInitWithZoneAndCapacity(&info->array, NSDefaultMallocZone(), 16); } return YES; } static void endDeserializerInfo(_NSDeserializerInfo* info) { if (info->didUnique) { GSIArrayEmpty(&info->array); } } static id deserializeFromInfo(_NSDeserializerInfo* info) { char code; unsigned int size; (*info->debImp)(info->data, debSel, &code, 1, info->cursor); switch (code) { case ST_XREF: if (info->didUnique) { size = (*info->deiImp)(info->data, deiSel, info->cursor); if (size < GSIArrayCount(&info->array)) { return RETAIN(GSIArrayItemAtIndex(&info->array, size).obj); } else { [NSException raise: NSInvalidArgumentException format: @"Bad cross reference in property list"]; } } else { [NSException raise: NSInvalidArgumentException format: @"Unexpected cross reference in property list"]; } case ST_CSTRING: { NSString *s; char *b; size = (*info->deiImp)(info->data, deiSel, info->cursor); b = NSZoneMalloc(NSDefaultMallocZone(), size); (*info->debImp)(info->data, debSel, b, size, info->cursor); s = [[StringClass alloc] initWithBytesNoCopy: b length: size - 1 encoding: NSASCIIStringEncoding freeWhenDone: YES]; /* * If we are supposed to be doing uniquing of strings, handle it. */ if (uniquing == YES) { s = GSUnique(s); } /* * If uniquing was done on serialisation, store the string for * later reference. */ if (info->didUnique) { GSIArrayAddItem(&info->array, (GSIArrayItem)((id)s)); } GS_CONSUMED(s) return s; } case ST_STRING: { NSString *s; unichar *b; size = (*info->deiImp)(info->data, deiSel, info->cursor); b = NSZoneMalloc(NSDefaultMallocZone(), size*sizeof(unichar)); (*info->debImp)(info->data, debSel, b, size*sizeof(unichar), info->cursor); s = [[StringClass alloc] initWithBytesNoCopy: b length: size*sizeof(unichar) encoding: NSUnicodeStringEncoding freeWhenDone: YES]; /* * If we are supposed to be doing uniquing of strings, handle it. */ if (uniquing == YES) { s = GSUnique(s); } /* * If uniquing was done on serialisation, store the string for * later reference. */ if (info->didUnique) { GSIArrayAddItem(&info->array, (GSIArrayItem)((id)s)); } GS_CONSUMED(s) return s; } case ST_ARRAY: case ST_MARRAY: size = (*info->deiImp)(info->data, deiSel, info->cursor); { id a; a = NSAllocateObject(MACls, 0, NSDefaultMallocZone()); a = (*maInitImp)(a, maInitSel, size); if (a != nil) { unsigned i; for (i = 0; i < size; i++) { id o = deserializeFromInfo(info); if (o == nil) { RELEASE(a); return nil; } (*maAddImp)(a, maAddSel, o); RELEASE(o); } if (code != ST_MARRAY && info->mutable == NO) { a = GS_IMMUTABLE(a); } } return a; } case ST_DICT: case ST_MDICT: size = (*info->deiImp)(info->data, deiSel, info->cursor); { id d; d = NSAllocateObject(MDCls, 0, NSDefaultMallocZone()); d = (*mdInitImp)(d, mdInitSel, size); if (d != nil) { unsigned int i; for (i = 0; i < size; i++) { id k = deserializeFromInfo(info); if (k == nil) { RELEASE(d); return nil; } else { id o = deserializeFromInfo(info); if (o == nil) { RELEASE(k); RELEASE(d); return nil; } else { (*mdSetImp)(d, mdSetSel, o, k); /* * Since a dictionary copies its keys rather * than retaining them, we must autorelease * rather than simply releasing as the key may * be referred to by a cross-reference later. */ IF_NO_ARC(AUTORELEASE(k);) RELEASE(o); } } } if (code != ST_MDICT && info->mutable == NO) { d = GS_IMMUTABLE(d); } } return d; } case ST_DATA: { NSData *d; size = (*info->deiImp)(info->data, deiSel, info->cursor); d = (NSData*)NSAllocateObject(DCls, 0, NSDefaultMallocZone()); if (size > 0) { void *b = NSZoneMalloc(NSDefaultMallocZone(), size); (*info->debImp)(info->data, debSel, b, size, info->cursor); d = (*dInitImp)(d, dInitSel, b, size); } else { d = (*dInitImp)(d, dInitSel, 0, 0); } return d; } case ST_DATE: { NSTimeInterval ti; [info->data deserializeDataAt: &ti ofObjCType: @encode(NSTimeInterval) atCursor: info->cursor context: nil]; return [[NSDate alloc] initWithTimeIntervalSinceReferenceDate: ti]; } case ST_NUMBER: { double d; [info->data deserializeDataAt: &d ofObjCType: @encode(double) atCursor: info->cursor context: nil]; return [[NSNumber alloc] initWithDouble: d]; } default: break; } return nil; } @interface _NSDeserializerProxy : NSProxy { _NSDeserializerInfo info; id plist; } + (_NSDeserializerProxy*) proxyWithData: (NSData*)d atCursor: (unsigned int*)c mutable: (BOOL)m; @end @implementation _NSDeserializerProxy + (_NSDeserializerProxy*) proxyWithData: (NSData*)d atCursor: (unsigned int*)c mutable: (BOOL)m { _NSDeserializerProxy *proxy; proxy = (_NSDeserializerProxy*)NSAllocateObject(self,0,NSDefaultMallocZone()); if (initDeserializerInfo(&proxy->info, RETAIN(d), c, m) == YES) { return AUTORELEASE(proxy); } else { DESTROY(proxy); return nil; } } - (void) dealloc { RELEASE(info.data); endDeserializerInfo(&info); RELEASE(plist); [super dealloc]; } - (BOOL) isEqual: (id)other { if (other == self) return YES; else return [[self self] isEqual: other]; } - (id) self { if (plist == nil && info.data != nil) { plist = deserializeFromInfo(&info); RELEASE(info.data); info.data = nil; } return plist; } @end @implementation NSDeserializer + (void) initialize { if (self == [NSDeserializer class]) { debSel = @selector(deserializeBytes:length:atCursor:); deiSel = @selector(deserializeIntAtCursor:); dInitSel = @selector(initWithBytesNoCopy:length:); maInitSel = @selector(initWithCapacity:); mdInitSel = @selector(initWithCapacity:); maAddSel = @selector(addObject:); mdSetSel = @selector(setObject:forKey:); MACls = [GSMutableArray class]; DCls = [NSDataMalloc class]; MDCls = [GSMutableDictionary class]; dInitImp = [DCls instanceMethodForSelector: dInitSel]; maInitImp = [MACls instanceMethodForSelector: maInitSel]; mdInitImp = [MDCls instanceMethodForSelector: mdInitSel]; maAddImp = [MACls instanceMethodForSelector: maAddSel]; mdSetImp = [MDCls instanceMethodForSelector: mdSetSel]; StringClass = [NSString class]; } } /** *

Deserializes the property list stored in data at the offset specified * by the value pointed to by cursor. Upon completion the value in cursor * is updated to refer to a position immediately after the end of the * deserialized sequence. *

*

The flag is used to specify whether container objects in the * deserialized list should be instances of mutable or immutable classes. *

*/ + (id) deserializePropertyListFromData: (NSData*)data atCursor: (unsigned int*)cursor mutableContainers: (BOOL)flag { _NSDeserializerInfo info; id o; if (data == nil || [data isKindOfClass: [NSData class]] == NO) { return nil; } NSAssert(cursor != 0, NSInvalidArgumentException); if (initDeserializerInfo(&info, data, cursor, flag) == YES) { o = deserializeFromInfo(&info); endDeserializerInfo(&info); return AUTORELEASE(o); } else { return nil; } } /** *

Deserializes the property list stored in data to produce a single * property list object (dictionary, array, string, data, number or date). *

*

The flag is used to specify whether container objects in the * deserialized list should be instances of mutable or immutable classes. *

*/ + (id) deserializePropertyListFromData: (NSData*)data mutableContainers: (BOOL)flag { _NSDeserializerInfo info; unsigned int cursor = 0; id o; if (data == nil || [data isKindOfClass: [NSData class]] == NO) { return nil; } if (initDeserializerInfo(&info, data, &cursor, flag) == YES) { o = deserializeFromInfo(&info); endDeserializerInfo(&info); return AUTORELEASE(o); } else { return nil; } } /** *

Deserializes the property list stored in data at the offset specified * by the value pointed to by cursor. Upon completion the value in cursor * is updated to refer to a position immediately after the end of the * deserialized sequence. *

*

The flag is used to specify whether container objects in the * deserialized list should be instances of mutable or immutable classes. *

*

The length is used to determine whether lazy deserialization is done, * if the data is longer than this value, a proxy is returned rather than * the actual property list, and the real deserialization can be done * later. *

*/ + (id) deserializePropertyListLazilyFromData: (NSData*)data atCursor: (unsigned*)cursor length: (unsigned)length mutableContainers: (BOOL)flag { if (data == nil || [data isKindOfClass: [NSData class]] == NO) { return nil; } NSAssert(cursor != 0, NSInvalidArgumentException); if (length > [data length] - *cursor) { _NSDeserializerInfo info; id o; if (initDeserializerInfo(&info, data, cursor, flag) == YES) { o = deserializeFromInfo(&info); endDeserializerInfo(&info); return AUTORELEASE(o); } else { return nil; } } else { return [_NSDeserializerProxy proxyWithData: data atCursor: cursor mutable: flag]; } } @end @implementation NSDeserializer (GNUstep) /** * This method turns on/off uniquing of strings as they are * deserialized from data objects. The uniquing mechanism * employs the GNUstep-specific functions documented with * the NSCountedSet class. */ + (void) uniquing: (BOOL)flag { if (flag == YES) GSUniquing(YES); uniquing = flag; } @end gnustep-base-1.29.0/Source/NSSet.m000066400000000000000000000702601435650067400166310ustar00rootroot00000000000000/** NSSet - Set object to store key/value pairs Copyright (C) 1995, 1996, 1998 Free Software Foundation, Inc. Written by: Andrew Kachites McCallum Created: Sep 1995 This file is part of the GNUstep Base Library. 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 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 USA. NSSet class reference $Date$ $Revision$ */ #import "common.h" #import "Foundation/NSArray.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSSet.h" #import "Foundation/NSCoder.h" #import "Foundation/NSArray.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSKeyValueCoding.h" #import "Foundation/NSValue.h" #import "Foundation/NSException.h" // For private method _decodeArrayOfObjectsForKey: #import "Foundation/NSKeyedArchiver.h" #import "GSPrivate.h" #import "GSFastEnumeration.h" #import "GSDispatch.h" @class GSSet; @interface GSSet : NSObject // Help the compiler @end @class GSMutableSet; @interface GSMutableSet : NSObject // Help the compiler @end /** * NSSet maintains an unordered collection of unique objects * (according to [NSObject-isEqual:]). When a duplicate object is added * to the set, it replaces its old copy. */ @implementation NSSet static Class NSSet_abstract_class; static Class NSMutableSet_abstract_class; static Class NSSet_concrete_class; static Class NSMutableSet_concrete_class; + (id) allocWithZone: (NSZone*)z { if (self == NSSet_abstract_class) { return NSAllocateObject(NSSet_concrete_class, 0, z); } else { return NSAllocateObject(self, 0, z); } } + (void) initialize { if (self == [NSSet class]) { NSSet_abstract_class = self; NSSet_concrete_class = [GSSet class]; [NSMutableSet class]; } } /** * New autoreleased empty set. */ + (id) set { return AUTORELEASE([[self allocWithZone: NSDefaultMallocZone()] init]); } /** * New set containing (unique elements of) objects. */ + (id) setWithArray: (NSArray*)objects { return AUTORELEASE([[self allocWithZone: NSDefaultMallocZone()] initWithArray: objects]); } /** * New set containing single object anObject. */ + (id) setWithObject: anObject { return AUTORELEASE([[self allocWithZone: NSDefaultMallocZone()] initWithObjects: &anObject count: 1]); } /** * New set containing (unique elements of) objects. */ + (id) setWithObjects: (const id[])objects count: (NSUInteger)count { return AUTORELEASE([[self allocWithZone: NSDefaultMallocZone()] initWithObjects: objects count: count]); } /** * New set with objects in given nil-terminated list. */ + (id) setWithObjects: firstObject, ... { id set; GS_USEIDLIST(firstObject, set = [[self allocWithZone: NSDefaultMallocZone()] initWithObjects: __objects count: __count]); return AUTORELEASE(set); } /** * Copy constructor. */ + (id) setWithSet: (NSSet*)aSet { return AUTORELEASE([[self allocWithZone: NSDefaultMallocZone()] initWithSet: aSet]); } - (Class) classForCoder { return NSSet_abstract_class; } /** * Returns a new copy of the receiver.
* The default abstract implementation of a copy is to use the * -initWithSet:copyItems: method with the flag set to YES.
* Concrete subclasses generally simply retain and return the receiver. */ - (id) copyWithZone: (NSZone*)z { NSSet *copy = [NSSet_concrete_class allocWithZone: z]; return [copy initWithSet: self copyItems: YES]; } /** * Returns the number of objects stored in the set. */ - (NSUInteger) count { [self subclassResponsibility: _cmd]; return 0; } - (void) encodeWithCoder: (NSCoder*)aCoder { if ([aCoder allowsKeyedCoding]) { /* HACK ... MacOS-X seems to code differently if the coder is an * actual instance of NSKeyedArchiver */ if ([aCoder class] == [NSKeyedArchiver class]) { [(NSKeyedArchiver*)aCoder _encodeArrayOfObjects: [self allObjects] forKey: @"NS.objects"]; } else { unsigned i = 0; NSEnumerator *e = [self objectEnumerator]; id o; while ((o = [e nextObject]) != nil) { NSString *key; key = [NSString stringWithFormat: @"NS.object.%u", i++]; [(NSKeyedArchiver*)aCoder encodeObject: o forKey: key]; } } } else { unsigned count = [self count]; NSEnumerator *e = [self objectEnumerator]; id o; [aCoder encodeValueOfObjCType: @encode(unsigned) at: &count]; while ((o = [e nextObject]) != nil) { [aCoder encodeValueOfObjCType: @encode(id) at: &o]; } } } - (id) initWithCoder: (NSCoder*)aCoder { Class c; c = object_getClass(self); if (c == NSSet_abstract_class) { DESTROY(self); self = [NSSet_concrete_class allocWithZone: NSDefaultMallocZone()]; return [self initWithCoder: aCoder]; } else if (c == NSMutableSet_abstract_class) { DESTROY(self); self = [NSMutableSet_concrete_class allocWithZone: NSDefaultMallocZone()]; return [self initWithCoder: aCoder]; } if ([aCoder allowsKeyedCoding]) { id array; array = [(NSKeyedUnarchiver*)aCoder _decodeArrayOfObjectsForKey: @"NS.objects"]; if (array == nil) { unsigned i = 0; NSString *key; id val; array = [NSMutableArray arrayWithCapacity: 2]; key = [NSString stringWithFormat: @"NS.object.%u", i]; val = [(NSKeyedUnarchiver*)aCoder decodeObjectForKey: key]; while (val != nil) { [array addObject: val]; i++; key = [NSString stringWithFormat: @"NS.object.%u", i]; val = [(NSKeyedUnarchiver*)aCoder decodeObjectForKey: key]; } } self = [self initWithArray: array]; } else { unsigned count; [aCoder decodeValueOfObjCType: @encode(unsigned) at: &count]; if (count > 0) { unsigned i; GS_BEGINIDBUF(objs, count); for (i = 0; i < count; i++) { [aCoder decodeValueOfObjCType: @encode(id) at: &objs[i]]; } self = [self initWithObjects: objs count: count]; while (count-- > 0) { [objs[count] release]; } GS_ENDIDBUF(); } } return self; } /** *

In MacOS-X class clusters do not have designated initialisers, * and there is a general rule that -init is treated as the designated * initialiser of the class cluster, but that other intitialisers * may not work s expected an would need to be individually overridden * in any subclass. *

*

GNUstep tries to make it easier to subclass a class cluster, * by making class clusters follow the same convention as normal * classes, so the designated initialiser is the richest * initialiser. This means that all other initialisers call the * documented designated initialiser (which calls -init only for * MacOS-X compatibility), and anyone writing a subclass only needs * to override that one initialiser in order to have all the other * ones work. *

*

For MacOS-X compatibility, you may also need to override various * other initialisers. Exactly which ones, you will need to determine * by trial on a MacOS-X system ... and may vary between releases of * MacOS-X. So to be safe, on MacOS-X you probably need to re-implement * all the class cluster initialisers you might use in conjunction * with your subclass. *

*/ - (id) init { self = [super init]; return self; } /** * Initialize to contain (unique elements of) objects.
* Calls -init (which does nothing but maintain MacOS-X compatibility), * and needs to be re-implemented in subclasses in order to have all * other initialisers work. */ - (id) initWithObjects: (const id[])objects count: (NSUInteger)count { self = [self init]; return self; } /** * If anObject is in set, return it (the copy in the set). */ - (id) member: (id)anObject { return [self subclassResponsibility: _cmd]; return 0; } /** * Returns a new instance containing the same objects as * the receiver.
* The default implementation does this by calling the * -initWithSet:copyItems: method on a newly created object, * and passing it NO to tell it just to retain the items. */ - (id) mutableCopyWithZone: (NSZone*)z { NSMutableSet *copy = [NSMutableSet_concrete_class allocWithZone: z]; return [copy initWithSet: self copyItems: NO]; } /** * Return enumerator over objects in set. Order is undefined. */ - (NSEnumerator*) objectEnumerator { return [self subclassResponsibility: _cmd]; } /** * Initialize with (unique elements of) objects in given nil-terminated list. */ - (id) initWithObjects: firstObject, ... { GS_USEIDLIST(firstObject, self = [self initWithObjects: __objects count: __count]); return self; } /** * Initialises a newly allocated set by adding all the objects * in the supplied array to the set. */ - (id) initWithArray: (NSArray*)other { unsigned count = [other count]; if (count == 0) { return [self init]; } else { GS_BEGINIDBUF(objs, count); if ([other isProxy]) { unsigned i; for (i = 0; i < count; i++) { objs[i] = [other objectAtIndex: i]; } } else { [other getObjects: objs]; } self = [self initWithObjects: objs count: count]; GS_ENDIDBUF(); return self; } } /** * Initialises a newly allocated set by adding all the objects * in the supplied set. */ - (id) initWithSet: (NSSet*)other copyItems: (BOOL)flag { unsigned c = [other count]; id o, e = [other objectEnumerator]; unsigned i = 0; GS_BEGINIDBUF(os, c); while ((o = [e nextObject])) { if (flag) os[i] = [o copy]; else os[i] = o; i++; } self = [self initWithObjects: os count: c]; if (flag) { while (i--) { [os[i] release]; } } GS_ENDIDBUF(); return self; } /** * Initialize with same items as other (items not copied). */ - (id) initWithSet: (NSSet*)other { return [self initWithSet: other copyItems: NO]; } /** * Return array of all objects in set. Order is undefined. */ - (NSArray*) allObjects { id e = [self objectEnumerator]; unsigned i; unsigned c = [self count]; NSArray *result = nil; GS_BEGINIDBUF(k, c); for (i = 0; i < c; i++) { k[i] = [e nextObject]; } return AUTORELEASE([[NSArray allocWithZone: NSDefaultMallocZone()] initWithObjects: k count: c]); GS_ENDIDBUF(); return result; } /** * Return an arbitrary object from set, or nil if this is empty set. */ - (id) anyObject { if ([self count] == 0) return nil; else { id e = [self objectEnumerator]; return [e nextObject]; } } /** * Return whether set contains an object equal to this one according * to [NSObject-isEqual:]. */ - (BOOL) containsObject: (id)anObject { return (([self member: anObject]) ? YES : NO); } - (NSUInteger) hash { return [self count]; } /** * Send each object given message (with no arguments). * Identical to [-makeObjectsPerformSelector:]. */ - (void) makeObjectsPerform: (SEL)aSelector { id o, e = [self objectEnumerator]; while ((o = [e nextObject])) [o performSelector: aSelector]; } /** * Send each object given message (with no arguments). * Identical to [-makeObjectsPerform:]. */ - (void) makeObjectsPerformSelector: (SEL)aSelector { id o, e = [self objectEnumerator]; while ((o = [e nextObject])) [o performSelector: aSelector]; } /** * Send each object given message with given argument. * Identical to [-makeObjectsPerform:withObject:]. */ - (void) makeObjectsPerformSelector: (SEL)aSelector withObject: argument { id o, e = [self objectEnumerator]; while ((o = [e nextObject])) [o performSelector: aSelector withObject: argument]; } /** * Send each object given message with given argument. * Identical to [-makeObjectsPerformSelector:withObject:]. */ - (void) makeObjectsPerform: (SEL)aSelector withObject: argument { id o, e = [self objectEnumerator]; while ((o = [e nextObject])) [o performSelector: aSelector withObject: argument]; } /** * Return whether set intersection with otherSet is non-empty. */ - (BOOL) intersectsSet: (NSSet*) otherSet { id o = nil, e = nil; // -1. If this set is empty, this method should return NO. if ([self count] == 0) return NO; // 0. Loop for all members in otherSet e = [otherSet objectEnumerator]; while ((o = [e nextObject])) // 1. pick a member from otherSet. { if ([self member: o]) // 2. check the member is in this set(self). return YES; } return NO; } /** * Return whether subset of otherSet. */ - (BOOL) isSubsetOfSet: (NSSet*) otherSet { id o = nil, e = nil; // -1. members of this set(self) <= that of otherSet if ([self count] > [otherSet count]) return NO; // 0. Loop for all members in this set(self). e = [self objectEnumerator]; while ((o = [e nextObject])) { // 1. check the member is in the otherSet. if ([otherSet member: o]) { // 1.1 if true -> continue, try to check the next member. continue ; } else { // 1.2 if false -> return NO; return NO; } } // 2. return YES; all members in this set are also in the otherSet. return YES; } - (BOOL) isEqual: (id)other { if ([other isKindOfClass: [NSSet class]]) return [self isEqualToSet: other]; return NO; } - (NSUInteger)_countForObject: (id)object { return 1; } /** * Return whether each set is subset of the other. */ - (BOOL) isEqualToSet: (NSSet*)other { if ([self count] != [other count]) return NO; else { id o, e = [self objectEnumerator]; while ((o = [e nextObject])) { if (![other member: o]) { return NO; } else { if ([self _countForObject: o] != [other _countForObject: o]) { return NO; } } } } /* xxx Recheck this. */ return YES; } /** * Returns listing of objects in set. */ - (NSString*) description { return [self descriptionWithLocale: nil]; } /** * Returns listing of objects in set. */ - (NSString*) descriptionWithLocale: (id)locale { return [[self allObjects] descriptionWithLocale: locale]; } - (id) valueForKey: (NSString*)key { NSEnumerator *e = [self objectEnumerator]; id object = nil; NSMutableSet *results = [NSMutableSet setWithCapacity: [self count]]; while ((object = [e nextObject]) != nil) { id result = [object valueForKey: key]; if (result == nil) continue; [results addObject: result]; } return results; } - (id) valueForKeyPath: (NSString*)path { id result = (id) nil; if ([path hasPrefix: @"@"]) { NSRange r; r = [path rangeOfString: @"."]; if (r.length == 0) { if ([path isEqualToString: @"@count"] == YES) { result = [NSNumber numberWithUnsignedInteger: [self count]]; } else { result = [self valueForKey: path]; } } else { NSString *op = [path substringToIndex: r.location]; NSString *rem = [path substringFromIndex: NSMaxRange(r)]; unsigned count = [self count]; if ([op isEqualToString: @"@count"] == YES) { result = [NSNumber numberWithUnsignedInteger: count]; } else if ([op isEqualToString: @"@avg"] == YES) { double d = 0; if (count > 0) { NSEnumerator *e = [self objectEnumerator]; id o; while ((o = [e nextObject]) != nil) { d += [[o valueForKeyPath: rem] doubleValue]; } d /= count; } result = [NSNumber numberWithDouble: d]; } else if ([op isEqualToString: @"@max"] == YES) { if (count > 0) { NSEnumerator *e = [self objectEnumerator]; id o; while ((o = [e nextObject]) != nil) { o = [o valueForKeyPath: rem]; if (result == nil || [result compare: o] == NSOrderedAscending) { result = o; } } } } else if ([op isEqualToString: @"@min"] == YES) { if (count > 0) { NSEnumerator *e = [self objectEnumerator]; id o; while ((o = [e nextObject]) != nil) { o = [o valueForKeyPath: rem]; if (result == nil || [result compare: o] == NSOrderedDescending) { result = o; } } } } else if ([op isEqualToString: @"@sum"] == YES) { double d = 0; if (count > 0) { NSEnumerator *e = [self objectEnumerator]; id o; while ((o = [e nextObject]) != nil) { d += [[o valueForKeyPath: rem] doubleValue]; } } result = [NSNumber numberWithDouble: d]; } else if ([op isEqualToString: @"@distinctUnionOfArrays"] == YES) { if (count > 0) { NSEnumerator *e = [self objectEnumerator]; id o; result = [NSMutableSet set]; while ((o = [e nextObject]) != nil) { o = [o valueForKeyPath: rem]; [result addObjectsFromArray: o]; } result = [result allObjects]; } else { result = [NSArray array]; } } else if ([op isEqualToString: @"@distinctUnionOfObjects"] == YES) { if (count > 0) { NSEnumerator *e = [self objectEnumerator]; id o; result = [NSMutableSet set]; while ((o = [e nextObject]) != nil) { o = [o valueForKeyPath: rem]; [result addObject: o]; } result = [result allObjects]; } else { result = [NSArray array]; } } else if ([op isEqualToString: @"@distinctUnionOfSets"] == YES) { if (count > 0) { NSEnumerator *e = [self objectEnumerator]; id o; result = [NSMutableSet set]; while ((o = [e nextObject]) != nil) { o = [o valueForKeyPath: rem]; [result addObjectsFromArray: [o allObjects]]; } result = [result allObjects]; } else { result = [NSArray array]; } } else if ([op isEqualToString: @"@unionOfArrays"] == YES) { if (count > 0) { NSEnumerator *e = [self objectEnumerator]; id o; result = [GSMutableArray array]; while ((o = [e nextObject]) != nil) { o = [o valueForKeyPath: rem]; [result addObjectsFromArray: o]; } result = GS_IMMUTABLE(result); } else { result = [NSArray array]; } } else if ([op isEqualToString: @"@unionOfObjects"] == YES) { if (count > 0) { NSEnumerator *e = [self objectEnumerator]; id o; result = [GSMutableArray array]; while ((o = [e nextObject]) != nil) { o = [o valueForKeyPath: rem]; [result addObject: o]; } result = GS_IMMUTABLE(result); } else { result = [NSArray array]; } } else if ([op isEqualToString: @"@unionOfSets"] == YES) { if (count > 0) { NSEnumerator *e = [self objectEnumerator]; id o; result = [GSMutableArray array]; while ((o = [e nextObject]) != nil) { o = [o valueForKeyPath: rem]; [result addObjectsFromArray: [o allObjects]]; } result = GS_IMMUTABLE(result); } else { result = [NSArray array]; } } else { result = [super valueForKeyPath: path]; } } } else { result = [super valueForKeyPath: path]; } return result; } - (void) enumerateObjectsUsingBlock: (GSSetEnumeratorBlock)aBlock { [self enumerateObjectsWithOptions: 0 usingBlock: aBlock]; } - (void) enumerateObjectsWithOptions: (NSEnumerationOptions)opts usingBlock: (GSSetEnumeratorBlock)aBlock { BLOCK_SCOPE BOOL shouldStop = NO; id enumerator = self; GS_DISPATCH_CREATE_QUEUE_AND_GROUP_FOR_ENUMERATION(enumQueue, opts) FOR_IN (id, obj, enumerator) { GS_DISPATCH_SUBMIT_BLOCK(enumQueueGroup,enumQueue, if (shouldStop == NO) {, }, aBlock, obj, &shouldStop); if (shouldStop) { break; } } END_FOR_IN(enumerator) GS_DISPATCH_TEARDOWN_QUEUE_AND_GROUP_FOR_ENUMERATION(enumQueue, opts) } - (NSSet *) objectsPassingTest: (GSSetFilterBlock)aBlock { return [self objectsWithOptions: 0 passingTest: aBlock]; } - (NSSet *) objectsWithOptions: (NSEnumerationOptions)opts passingTest: (GSSetFilterBlock)aBlock { BOOL shouldStop = NO; id enumerator = self; NSMutableSet *resultSet; resultSet = [NSMutableSet setWithCapacity: [self count]]; FOR_IN (id, obj, enumerator) { BOOL include = CALL_NON_NULL_BLOCK(aBlock, obj, &shouldStop); if (include) { [resultSet addObject:obj]; } if (shouldStop) { break; } } END_FOR_IN(enumerator) return GS_IMMUTABLE(resultSet); } /** Return a set formed by adding anObject to the receiver. */ - (NSSet *) setByAddingObject: (id)anObject { NSMutableSet *m; NSSet *s; m = [self mutableCopy]; [m addObject: anObject]; s = [m copy]; [m release]; return [s autorelease]; } /** Return a set formed by adding the contents of other to the receiver. */ - (NSSet *) setByAddingObjectsFromArray: (NSArray *)other { NSMutableSet *m; NSSet *s; m = [self mutableCopy]; [m addObjectsFromArray: other]; s = [m copy]; [m release]; return [s autorelease]; } /** Return a set formed as a union of the receiver and other. */ - (NSSet *) setByAddingObjectsFromSet: (NSSet *)other { NSMutableSet *m; NSSet *s; m = [self mutableCopy]; [m unionSet: other]; s = [m copy]; [m release]; return [s autorelease]; } - (NSUInteger) countByEnumeratingWithState: (NSFastEnumerationState*)state objects: (id*)stackbuf count: (NSUInteger)len { [self subclassResponsibility: _cmd]; return 0; } @end /** * Mutable version of [NSSet]. */ @implementation NSMutableSet + (void) initialize { if (self == [NSMutableSet class]) { NSMutableSet_abstract_class = self; NSMutableSet_concrete_class = [GSMutableSet class]; } } /** * New autoreleased instance with given capacity. */ + (id) setWithCapacity: (NSUInteger)numItems { return AUTORELEASE([[self allocWithZone: NSDefaultMallocZone()] initWithCapacity: numItems]); } + (id) allocWithZone: (NSZone*)z { if (self == NSMutableSet_abstract_class) { return NSAllocateObject(NSMutableSet_concrete_class, 0, z); } else { return NSAllocateObject(self, 0, z); } } - (Class) classForCoder { return NSMutableSet_abstract_class; } /** * Initialises a newly allocated set to contain no objects but * to have space available to hold the specified number of items.
* Additions of items to a set initialised * with an appropriate capacity will be more efficient than addition * of items otherwise.
* Calls -init (which does nothing but maintain MacOS-X compatibility), * and needs to be re-implemented in subclasses in order to have all * other initialisers work. */ - (id) initWithCapacity: (NSUInteger)numItems { self = [self init]; return self; } /** * Adds anObject to the set.
* The object is retained by the set. */ - (void) addObject: (id)anObject { [self subclassResponsibility: _cmd]; } /** * Removes the anObject from the receiver. */ - (void) removeObject: (id)anObject { [self subclassResponsibility: _cmd]; } - (id) initWithObjects: (const id[])objects count: (NSUInteger)count { self = [self initWithCapacity: count]; if (self != nil) { while (count--) { [self addObject: objects[count]]; } } return self; } /** * Adds all the objects in the array to the receiver. */ - (void) addObjectsFromArray: (NSArray*)array { unsigned i, c = [array count]; for (i = 0; i < c; i++) { [self addObject: [array objectAtIndex: i]]; } } /** * Removes from the receiver all the objects it contains * which are not also in other. */ - (void) intersectSet: (NSSet*) other { if (other != self) { id keys = [self objectEnumerator]; id key; while ((key = [keys nextObject])) { if ([other containsObject: key] == NO) { [self removeObject: key]; } } } } /** * Removes from the receiver all the objects that are in * other. */ - (void) minusSet: (NSSet*) other { if (other == self) { [self removeAllObjects]; } else { id keys = [other objectEnumerator]; id key; while ((key = [keys nextObject])) { [self removeObject: key]; } } } /** * Removes all objects from the receiver. */ - (void) removeAllObjects { [self subclassResponsibility: _cmd]; } /** * Removes all objects from the receiver then adds the * objects from other. If the receiver is * other, the method has no effect. */ - (void) setSet: (NSSet*)other { if (other == self) { return; } if (other == nil) { NSWarnMLog(@"Setting mutable set to nil"); [self removeAllObjects]; } else { IF_NO_ARC([other retain];) // In case it's held by us [self removeAllObjects]; [self unionSet: other]; RELEASE(other); } } /** * Adds all the objects from other to the receiver. */ - (void) unionSet: (NSSet*) other { if (other != self) { id keys = [other objectEnumerator]; id key; while ((key = [keys nextObject])) { [self addObject: key]; } } } @end gnustep-base-1.29.0/Source/NSSocketPort.m000066400000000000000000002000471435650067400201710ustar00rootroot00000000000000/** Implementation of network port object based on TCP sockets Copyright (C) 2000 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Based on code by: Andrew Kachites McCallum This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #define EXPOSE_NSPort_IVARS 1 #define EXPOSE_NSSocketPort_IVARS 1 #import "GNUstepBase/GSLock.h" #import "GNUstepBase/GSTLS.h" #import "Foundation/NSArray.h" #import "Foundation/NSNotification.h" #import "Foundation/NSNotificationQueue.h" #import "Foundation/NSException.h" #import "Foundation/NSRunLoop.h" #import "Foundation/NSByteOrder.h" #import "Foundation/NSData.h" #import "Foundation/NSDate.h" #import "Foundation/NSHost.h" #import "Foundation/NSMapTable.h" #import "Foundation/NSPortMessage.h" #import "Foundation/NSPortNameServer.h" #import "Foundation/NSLock.h" #import "Foundation/NSHost.h" #import "Foundation/NSThread.h" #import "Foundation/NSConnection.h" #import "GSPortPrivate.h" #import "GSPrivate.h" #import "GSNetwork.h" #include #ifdef _WIN32 #ifdef close #undef close // also defined in common.h #endif #define close closesocket #define OPTLEN int #else #define OPTLEN socklen_t #include /* for MAXHOSTNAMELEN */ #include #include #include /* for inet_ntoa() */ #endif /* !_WIN32 */ #include /* for strchr() */ #if defined(HAVE_SYS_FCNTL_H) # include #elif defined(HAVE_FCNTL_H) # include #endif #ifdef HAVE_SYS_TIME_H # include #endif #ifdef _WIN32 #include #include #include static int socketError() { int e = WSAGetLastError(); switch (e) { case WSAEWOULDBLOCK: return EAGAIN; case WSAEINTR: return EINTR; default: return e; } } #else /* _WIN32 */ #include #include #include #if defined(HAVE_SYS_FILE_H) # include #endif /* * Stuff for setting the sockets into non-blocking mode. */ #if defined(__POSIX_SOURCE)\ || defined(__EXT_POSIX1_198808)\ || defined(O_NONBLOCK) #define NBLK_OPT O_NONBLOCK #else #define NBLK_OPT FNDELAY #endif #include #include #if !defined(SIOCGIFCONF) || defined(__CYGWIN__) #include #ifndef SIOCGIFCONF #include #endif #endif #if defined(__svr4__) # if defined(HAVE_SYS_STROPTS_H) # include # endif #endif #define SOCKET int #define SOCKET_ERROR -1 #define INVALID_SOCKET -1 static int socketError() { return errno; } #endif /* !_WIN32 */ /* * Largest chunk of data possible in DO */ static uint32_t maxDataLength = 32 * 1024 * 1024; /* Options for TLS encryption of connections */ static NSDictionary *tlsClientOptions; static NSDictionary *tlsServerOptions; static NSLock *tlsLock; #if 0 #define M_LOCK(X) {NSDebugMLLog(@"GSTcpHandleLock",@"lock %@ in %@",X,[NSThread currentThread]); [X lock];} #define M_UNLOCK(X) {NSDebugMLLog(@"GSTcpHandleLock",@"unlock %@ in %@",X,[NSThread currentThread]); [X unlock];} #else #define M_LOCK(X) {[X lock];} #define M_UNLOCK(X) {[X unlock];} #endif #define GS_CONNECTION_MSG 0 #define NETBLOCK 8192 #ifndef INADDR_NONE #define INADDR_NONE -1 #endif /* * Theory of operation * * */ /* Private interfaces */ /* * The GSPortItemType constant is used to identify the type of data in * each packet read. All data transmitted is in a packet, each packet * has an initial packet type and packet length. */ typedef enum { GSP_NONE, GSP_PORT, /* Simple port item. */ GSP_DATA, /* Simple data item. */ GSP_HEAD /* Port message header + initial data. */ } GSPortItemType; /* * The GSPortItemHeader structure defines the header for each item transmitted. * Its contents are transmitted in network byte order. */ typedef struct { uint32_t type; /* A GSPortItemType as a 4-byte number. */ uint32_t length; /* The length of the item (excluding header). */ } GSPortItemHeader; /* * The GSPortMsgHeader structure is at the start of any item of type GSP_HEAD. * Its contents are transmitted in network byte order. * Any additional data in the item is an NSData object. * NB. additional data counts as part of the same item. */ typedef struct { uint32_t mId; /* The ID for the message starting with this. */ uint32_t nItems; /* Number of items (including this one). */ } GSPortMsgHeader; typedef struct { uint16_t num; /* TCP port num */ char addr[0]; /* host address */ } GSPortInfo; /* * Here is how data is transmitted over a socket - * Initially the process making the connection sends an item of type * GSP_PORT to tell the remote end what port is connecting to it. * Therafter, all communication is via port messages. Each port message * consists of an item of type GSP_HEAD followed by zero or more items * of type GSP_PORT or GSP_DATA. The number of items in a port message * is encoded in the 'nItems' field of the header. */ typedef enum { GS_H_UNCON = 0, // Currently idle and unconnected. GS_H_TRYCON, // Trying connection (outgoing). GS_H_ACCEPT, // Making initial connection (incoming). GS_H_CONNECTED // Currently connected. } GSHandleState; @interface NSSocketPort (GSTcpHandle) - (NSDictionary*) clientOptionsForTLS; - (NSDictionary*) serverOptionsForTLS; @end @interface GSTcpHandle : NSObject { SOCKET desc; /* File descriptor for I/O. */ NSData *cData; /* Connection data. */ unsigned cLength; /* Connection data written. */ unsigned wItem; /* Index of item being written. */ NSMutableData *wData; /* Data object being written. */ unsigned wLength; /* Ammount written so far. */ NSMutableArray *wMsgs; /* Message in progress. */ NSMutableData *rData; /* Buffer for incoming data */ uint32_t rLength; /* Amount read so far. */ uint32_t rWant; /* Amount desired. */ NSMutableArray *rItems; /* Message in progress. */ GSPortItemType rType; /* Type of data being read. */ uint32_t rId; /* Id of incoming message. */ unsigned nItems; /* Number of items to be read. */ GSHandleState state; /* State of the handle. */ unsigned int addrNum; /* Address number within host. */ #ifdef _WIN32 WSAEVENT event; /* Win32 event associated to socket */ WSAEVENT eventTemp; /* Win32 event for asynchronous */ @public BOOL inReplyMode; /* Indicate when have addEvent self */ BOOL readyToSend; /* Indicate when send */ #endif @public NSRecursiveLock *myLock; /* Lock for this handle. */ BOOL caller; /* Did we connect to other end? */ BOOL valid; NSSocketPort *recvPort; NSSocketPort *sendPort; struct sockaddr sockAddr; /* Far end of connection. */ NSString *defaultAddress; #if defined(HAVE_GNUTLS) GSTLSSession *session; /* Session for encryption. */ #endif } + (GSTcpHandle*) handleWithDescriptor: (SOCKET)d; - (BOOL) connectToPort: (NSSocketPort*)aPort beforeDate: (NSDate*)when; - (int) descriptor; #if defined(_WIN32) - (int) eventHandle; #endif - (void) invalidate; - (BOOL) isValid; - (void) receivedEvent: (void*)data type: (RunLoopEventType)type extra: (void*)extra forMode: (NSString*)mode; - (void) receivedEventRead; - (void) receivedEventWrite; - (NSSocketPort*) recvPort; - (BOOL) sendMessage: (NSArray*)components beforeDate: (NSDate*)when; - (NSSocketPort*) sendPort; - (void) setState: (GSHandleState)s; - (GSHandleState) state; @end #if defined(HAVE_GNUTLS) /* Callback to allow the TLS code to pull data from the remote system. * If the operation fails, this sets the error number. */ static ssize_t GSTLSHandlePull(gnutls_transport_ptr_t handle, void *buffer, size_t len) { ssize_t result = 0; GSTcpHandle *tls = (GSTcpHandle*)handle; int descriptor = [tls descriptor]; result = recv(descriptor, buffer, len, 0); if (result < 0) { #if HAVE_GNUTLS_TRANSPORT_SET_ERRNO if (tls->session && tls->session->session) { int e = socketError(); // Get unix style EINTR/EAGAIN gnutls_transport_set_errno(tls->session->session, e); } #endif } return result; } /* Callback to allow the TLS code to push data to the remote system. * If the operation fails, this sets the error number. */ static ssize_t GSTLSHandlePush(gnutls_transport_ptr_t handle, const void *buffer, size_t len) { ssize_t result = 0; GSTcpHandle *tls = (GSTcpHandle*)handle; int descriptor = [tls descriptor]; result = send(descriptor, buffer, len, 0); if (result < 0) { #if HAVE_GNUTLS_TRANSPORT_SET_ERRNO if (tls->session && tls->session->session) { int e = socketError(); // Get unix style EINTR/EAGAIN gnutls_transport_set_errno(tls->session->session, e); } #endif } return result; } #endif /* * Utility functions for encoding and decoding ports. */ static NSSocketPort* decodePort(NSData *data, NSString *defaultAddress) { GSPortItemHeader *pih; GSPortInfo *pi; NSString *addr; uint16_t pnum; NSHost *host; unichar c; pih = (GSPortItemHeader*)[data bytes]; NSCAssert(GSSwapBigI32ToHost(pih->type) == GSP_PORT, NSInternalInconsistencyException); pi = (GSPortInfo*)&pih[1]; pnum = GSSwapBigI16ToHost(pi->num); if (strncmp(pi->addr, "VER", 3) == 0) { NSLog(@"Remote version of GNUstep at %s:%d is more recent than this one", pi->addr, pnum); return nil; } addr = [NSString stringWithUTF8String: pi->addr]; NSDebugFLLog(@"NSPort", @"Decoded port as '%@:%d'", addr, pnum); /* * Special case - the encoded port was on the host from which the * message was sent. */ if ([addr length] == 0) { addr = defaultAddress; } c = [addr characterAtIndex: 0]; if (c >= '0' && c <= '9') { host = [NSHost hostWithAddress: addr]; } else { host = [NSHost hostWithName: addr]; } return [NSSocketPort portWithNumber: pnum onHost: host forceAddress: nil listener: NO]; } static NSData* newDataWithEncodedPort(NSSocketPort *port) { GSPortItemHeader *pih; GSPortInfo *pi; NSMutableData *data; unsigned plen; NSString *addr; uint16_t pnum; pnum = [port portNumber]; addr = [port address]; if (addr == nil) { static NSHost *local = nil; /* * If the port is not forced to use a specific address ... * 1. see if it is on the local host, and if so, encode as "". * 2. see if it s a hostname and if so, use the name. * 3. pick one of the host addresses. * 4. use the localhost address. */ if (local == nil) { local = RETAIN([NSHost localHost]); } if ([[port host] isEqual: local] == YES) { addr = @""; } else if ((addr = [[port host] name]) == nil) { addr = [[port host] address]; if (addr == nil) { addr = @"127.0.0.1"; /* resign ourselves to this */ } } } plen = [addr cStringLength] + 3; data = [[NSMutableData alloc] initWithLength: sizeof(GSPortItemHeader)+plen]; pih = (GSPortItemHeader*)[data mutableBytes]; pih->type = GSSwapHostI32ToBig(GSP_PORT); pih->length = GSSwapHostI32ToBig(plen); pi = (GSPortInfo*)&pih[1]; pi->num = GSSwapHostI16ToBig(pnum); [addr getCString: pi->addr]; NSDebugFLLog(@"NSPort", @"Encoded port as '%@:%d'", addr, pnum); return data; } @implementation GSTcpHandle static Class mutableArrayClass; static Class mutableDataClass; static Class portMessageClass; static Class runLoopClass; + (id) allocWithZone: (NSZone*)zone { [NSException raise: NSGenericException format: @"attempt to alloc a GSTcpHandle!"]; return nil; } + (GSTcpHandle*) handleWithDescriptor: (SOCKET)d { GSTcpHandle *handle; #ifdef _WIN32 unsigned long dummy; #else int e; #endif /* _WIN32 */ #ifdef _WIN32 WSAEVENT ev; int rc; #endif if (d == INVALID_SOCKET) { NSLog(@"illegal descriptor (%lld) for Tcp Handle", (long long)d); return nil; } #ifdef _WIN32 dummy = 1; if (ioctlsocket(d, FIONBIO, &dummy) == SOCKET_ERROR) { NSLog(@"unable to set non-blocking mode on %lld - %@", (long long)d, [NSError _last]); return nil; } #else /* !_WIN32 */ if ((e = fcntl(d, F_GETFL, 0)) >= 0) { e |= NBLK_OPT; if (fcntl(d, F_SETFL, e) < 0) { NSLog(@"unable to set non-blocking mode on %d - %@", d, [NSError _last]); return nil; } } else { NSLog(@"unable to get non-blocking mode on %d - %@", d, [NSError _last]); return nil; } #endif handle = (GSTcpHandle*)NSAllocateObject(self, 0, NSDefaultMallocZone()); handle->desc = d; handle->wMsgs = [NSMutableArray new]; handle->myLock = [NSRecursiveLock new]; #if defined(_WIN32) ev = (WSAEVENT)CreateEvent(NULL,NO,NO,NULL); if (ev == WSA_INVALID_EVENT) { NSLog(@"Invalid Event - '%d'", WSAGetLastError()); return nil; } rc = WSAEventSelect(handle->desc, ev, FD_ALL_EVENTS); NSAssert(rc == 0, @"WSAEventSelect failed!"); handle->event = ev; handle->inReplyMode = NO; handle->readyToSend = YES; #endif handle->valid = YES; return AUTORELEASE(handle); } + (void) initialize { if (self == [GSTcpHandle class]) { tlsLock = [NSLock new]; [[NSObject leakAt: &tlsLock] release]; mutableArrayClass = [NSMutableArray class]; mutableDataClass = [NSMutableData class]; portMessageClass = [NSPortMessage class]; runLoopClass = [NSRunLoop class]; } } - (void) _add: (NSRunLoop*)l { #if defined(_WIN32) [l addEvent: (void*)(uintptr_t)event type: ET_HANDLE watcher: self forMode: NSConnectionReplyMode]; [l addEvent: (void*)(uintptr_t)event type: ET_HANDLE watcher: self forMode: NSDefaultRunLoopMode]; inReplyMode = YES; #else [l addEvent: (void*)(uintptr_t)desc type: ET_WDESC watcher: self forMode: NSConnectionReplyMode]; [l addEvent: (void*)(uintptr_t)desc type: ET_EDESC watcher: self forMode: NSConnectionReplyMode]; [l addEvent: (void*)(uintptr_t)desc type: ET_WDESC watcher: self forMode: NSDefaultRunLoopMode]; [l addEvent: (void*)(uintptr_t)desc type: ET_EDESC watcher: self forMode: NSDefaultRunLoopMode]; #endif } - (void) _rem: (NSRunLoop*)l { #if defined(_WIN32) [l removeEvent: (void*)(uintptr_t)event type: ET_HANDLE forMode: NSConnectionReplyMode all: NO]; [l removeEvent: (void*)(uintptr_t)event type: ET_HANDLE forMode: NSDefaultRunLoopMode all: NO]; inReplyMode = NO; #else [l removeEvent: (void*)(uintptr_t)desc type: ET_WDESC forMode: NSConnectionReplyMode all: NO]; [l removeEvent: (void*)(uintptr_t)desc type: ET_EDESC forMode: NSConnectionReplyMode all: NO]; [l removeEvent: (void*)(uintptr_t)desc type: ET_WDESC forMode: NSDefaultRunLoopMode all: NO]; [l removeEvent: (void*)(uintptr_t)desc type: ET_EDESC forMode: NSDefaultRunLoopMode all: NO]; #endif } - (BOOL) connectToPort: (NSSocketPort*)aPort beforeDate: (NSDate*)when { NSArray *addrs; BOOL gotAddr = NO; NSRunLoop *l; M_LOCK(myLock); NSDebugMLLog(@"GSTcpHandle", @"Connecting on %p before %@", self, when); if (state != GS_H_UNCON) { BOOL result; if (state == GS_H_CONNECTED) /* Already connected. */ { NSLog(@"attempting connect on connected handle"); result = YES; } else if (state == GS_H_ACCEPT) /* Impossible. */ { NSLog(@"attempting connect with accepting handle"); result = NO; } else /* Already connecting. */ { NSLog(@"attempting connect while connecting"); result = NO; } M_UNLOCK(myLock); return result; } if (recvPort == nil || aPort == nil) { NSLog(@"attempting connect with port(s) unset"); M_UNLOCK(myLock); return NO; /* impossible. */ } /* * Get an IP address to try to connect to. * If the port has a 'forced' address, just use that. Otherwise we try * each of the addresses for the host in turn. */ if ([aPort address] != nil) { addrs = [NSArray arrayWithObject: [aPort address]]; } else { addrs = [[aPort host] addresses]; } while (gotAddr == NO) { NSString *addr; if (addrNum >= [addrs count]) { NSLog(@"run out of addresses to try (tried %d) for port %@", addrNum, aPort); M_UNLOCK(myLock); return NO; } addr = [addrs objectAtIndex: addrNum++]; if (NO == GSPrivateSockaddrSetup(addr, [aPort portNumber], nil, nil, &sockAddr)) { NSLog(@"bad address - '%@'", addr); } else { gotAddr = YES; NSDebugMLLog(@"GSTcpHandle", @"Connecting to %@:%d using desc %lld", addr, [aPort portNumber], (long long)desc); } } if (connect(desc, (struct sockaddr*)&sockAddr, GSPrivateSockaddrLength(&sockAddr)) == SOCKET_ERROR) { if (!GSWOULDBLOCK) { NSLog(@"unable to make connection to %@ - %@", GSPrivateSockaddrName(&sockAddr), [NSError _last]); if (addrNum < [addrs count]) { BOOL result; result = [self connectToPort: aPort beforeDate: when]; M_UNLOCK(myLock); return result; } else { M_UNLOCK(myLock); return NO; /* Tried all addresses */ } } } state = GS_H_TRYCON; l = [NSRunLoop currentRunLoop]; [self _add: l]; while (valid == YES && state == GS_H_TRYCON && [when timeIntervalSinceNow] > 0) { M_UNLOCK(myLock); NS_DURING [l runMode: NSConnectionReplyMode beforeDate: when]; NS_HANDLER M_LOCK(myLock); [self _rem: l]; M_UNLOCK(myLock); [localException raise]; NS_ENDHANDLER M_LOCK(myLock); } [self _rem: l]; if (state == GS_H_TRYCON) { state = GS_H_UNCON; addrNum = 0; M_UNLOCK(myLock); return NO; /* Timed out */ } else if (state == GS_H_UNCON) { if (addrNum < [addrs count] && [when timeIntervalSinceNow] > 0) { BOOL result; /* * The connection attempt failed, but there are still IP addresses * that we haven't tried. */ result = [self connectToPort: aPort beforeDate: when]; M_UNLOCK(myLock); return result; } addrNum = 0; state = GS_H_UNCON; M_UNLOCK(myLock); return NO; /* connection failed */ } else { int status = 1; if (setsockopt(desc, SOL_SOCKET, SO_KEEPALIVE, (char*)&status, (OPTLEN)sizeof(status)) < 0) { NSLog(@"failed to turn on keepalive for connected socket %lld", (long long)desc); } addrNum = 0; caller = YES; [aPort addHandle: self forSend: YES]; M_UNLOCK(myLock); return YES; } } - (void) dealloc { [self finalize]; DESTROY(defaultAddress); DESTROY(cData); DESTROY(rData); DESTROY(rItems); DESTROY(wMsgs); DESTROY(myLock); [super dealloc]; } - (NSString*) description { return [NSString stringWithFormat: @"", self, (long long)desc, GSPrivateSockaddrName(&sockAddr)]; } - (int) descriptor { return desc; } #if defined(_WIN32) - (int) eventHandle { return (int) (size_t) event; } #endif - (void) finalize { [self invalidate]; #if defined(_WIN32) if (event != WSA_INVALID_EVENT) { WSACloseEvent(event); event = WSA_INVALID_EVENT; } #endif if (desc >= 0) { (void)close(desc); desc = -1; } } - (void) invalidate { if (valid == YES) { M_LOCK(myLock); if (valid == YES) { valid = NO; NSDebugMLLog(@"GSTcpHandle", @"invalidated %p", self); [[self recvPort] removeHandle: self]; [[self sendPort] removeHandle: self]; } M_UNLOCK(myLock); } #if defined(HAVE_GNUTLS) if (session) { [session disconnect: NO]; DESTROY(session); } #endif } - (BOOL) isValid { return valid; } - (NSSocketPort*) recvPort { if (recvPort == nil) return nil; else return recvPort; } - (void) receivedEventRead { #if defined(HAVE_GNUTLS) do { #endif unsigned want; void *bytes; int res; /* * Make sure we have a buffer big enough to hold all the data we are * expecting, or NETBLOCK bytes, whichever is greater. */ if (rData == nil) { rData = [[mutableDataClass alloc] initWithLength: NETBLOCK]; rWant = sizeof(GSPortItemHeader); rLength = 0; want = NETBLOCK; } else { want = [rData length]; if (want < rWant) { want = rWant; [rData setLength: want]; } if (want < NETBLOCK) { want = NETBLOCK; [rData setLength: want]; } } /* * Now try to fill the buffer with data. */ bytes = [rData mutableBytes]; #if defined(HAVE_GNUTLS) if (session) { if ([session handshake]) { if (![session active]) { NSDebugMLLog(@"GSTcpHandle", @"TLS handshake failed on %p - %@", self, [session problem]); [self invalidate]; return; } else { res = [session read: bytes + rLength length: want - rLength]; } } else { errno = EAGAIN; res = -1; } } else { res = recv(desc, bytes + rLength, want - rLength, 0); } #else res = recv(desc, bytes + rLength, want - rLength, 0); #endif if (res <= 0) { int e = socketError(); if (res == 0) { NSDebugMLLog(@"GSTcpHandle", @"read eof on %p", self); [self invalidate]; return; } else if (e != EINTR && e != EAGAIN) { NSDebugMLLog(@"GSTcpHandle", @"read failed - %@ on 0x%p", [NSError _last], self); [self invalidate]; return; } NSDebugMLLog(@"GSTcpHandle", @"read would block on %p", self); return; /* Interrupted - continue */ } NSDebugMLLog(@"GSTcpHandle", @"read %d bytes on %p", res, self); rLength += res; while (valid == YES && rLength >= rWant) { BOOL shouldDispatch = NO; switch (rType) { case GSP_NONE: { GSPortItemHeader *h; unsigned l; /* * We have read an item header - set up to read the * remainder of the item. */ h = (GSPortItemHeader*)bytes; rType = GSSwapBigI32ToHost(h->type); l = GSSwapBigI32ToHost(h->length); if (rType == GSP_PORT) { if (l > 128) { NSLog(@"%@ - unreasonable length (%u) for port", self, l); [self invalidate]; return; } /* * For a port, we leave the item header in the data * so that our decode function can check length info. */ rWant += l; } else if (rType == GSP_DATA) { if (l == 0) { NSData *d; /* * For a zero-length data chunk, we create an empty * data object and add it to the current message. */ rType = GSP_NONE; /* ready for a new item */ rLength -= rWant; if (rLength > 0) { memmove(bytes, bytes + rWant, rLength); } rWant = sizeof(GSPortItemHeader); d = [mutableDataClass new]; [rItems addObject: d]; RELEASE(d); if (nItems == [rItems count]) { shouldDispatch = YES; } } else { if (l > maxDataLength) { NSLog(@"%@ - unreasonable length (%u) for data", self, l); [self invalidate]; return; } /* * If not a port or zero length data, * we discard the data read so far and fill the * data object with the data item from the msg. */ rLength -= rWant; if (rLength > 0) { memmove(bytes, bytes + rWant, rLength); } rWant = l; } } else if (rType == GSP_HEAD) { if (l > maxDataLength) { NSLog(@"%@ - unreasonable length (%u) for data", self, l); [self invalidate]; return; } /* * If not a port or zero length data, * we discard the data read so far and fill the * data object with the data item from the msg. */ rLength -= rWant; if (rLength > 0) { memmove(bytes, bytes + rWant, rLength); } rWant = l; } else { NSLog(@"%@ - bad data received on port handle", self); [self invalidate]; return; } } break; case GSP_HEAD: { GSPortMsgHeader *h; rType = GSP_NONE; /* ready for a new item */ /* * We have read a message header - set up to read the * remainder of the message. */ h = (GSPortMsgHeader*)bytes; rId = GSSwapBigI32ToHost(h->mId); nItems = GSSwapBigI32ToHost(h->nItems); NSAssert(nItems >0, NSInternalInconsistencyException); rItems = [mutableArrayClass allocWithZone: NSDefaultMallocZone()]; rItems = [rItems initWithCapacity: nItems]; if (rWant > sizeof(GSPortMsgHeader)) { NSData *d; /* * The first data item of the message was included in * the header - so add it to the rItems array. */ rWant -= sizeof(GSPortMsgHeader); d = [mutableDataClass alloc]; d = [d initWithBytes: bytes + sizeof(GSPortMsgHeader) length: rWant]; [rItems addObject: d]; RELEASE(d); rWant += sizeof(GSPortMsgHeader); rLength -= rWant; if (rLength > 0) { memmove(bytes, bytes + rWant, rLength); } rWant = sizeof(GSPortItemHeader); if (nItems == 1) { shouldDispatch = YES; } } else { /* * want to read another item */ rLength -= rWant; if (rLength > 0) { memmove(bytes, bytes + rWant, rLength); } rWant = sizeof(GSPortItemHeader); } } break; case GSP_DATA: { NSData *d; rType = GSP_NONE; /* ready for a new item */ d = [mutableDataClass allocWithZone: NSDefaultMallocZone()]; d = [d initWithBytes: bytes length: rWant]; [rItems addObject: d]; RELEASE(d); rLength -= rWant; if (rLength > 0) { memmove(bytes, bytes + rWant, rLength); } rWant = sizeof(GSPortItemHeader); if (nItems == [rItems count]) { shouldDispatch = YES; } } break; case GSP_PORT: { NSSocketPort *p; rType = GSP_NONE; /* ready for a new item */ p = decodePort(rData, defaultAddress); if (p == nil) { NSLog(@"%@ - unable to decode remote port", self); [self invalidate]; return; } /* * Set up to read another item header. */ rLength -= rWant; if (rLength > 0) { memmove(bytes, bytes + rWant, rLength); } rWant = sizeof(GSPortItemHeader); if (state == GS_H_ACCEPT) { /* This is the initial port information on a new * connection - set up port relationships. */ state = GS_H_CONNECTED; [p addHandle: self forSend: YES]; NSDebugMLLog(@"GSTcpHandle", @"accepted connection from %@ on %p", p, self); } else { /* * This is a port within a port message - add * it to the message components. */ [rItems addObject: p]; if (nItems == [rItems count]) { shouldDispatch = YES; } } } break; } if (shouldDispatch == YES) { NSPortMessage *pm; NSSocketPort *rp = [self recvPort]; pm = [portMessageClass allocWithZone: NSDefaultMallocZone()]; pm = [pm initWithSendPort: [self sendPort] receivePort: rp components: rItems]; [pm setMsgid: rId]; rId = 0; DESTROY(rItems); NSDebugMLLog(@"GSTcpHandle", @"got message %@ on %p", pm, self); IF_NO_ARC(RETAIN(rp);) M_UNLOCK(myLock); NS_DURING { [rp handlePortMessage: pm]; } NS_HANDLER { M_LOCK(myLock); RELEASE(pm); RELEASE(rp); [localException raise]; } NS_ENDHANDLER M_LOCK(myLock); RELEASE(pm); RELEASE(rp); bytes = [rData mutableBytes]; } } #if defined(HAVE_GNUTLS) /* As long as there are bytes available in the TLS buffers we must act as * if the network connection is readable, otherwise we could have a hang * waiting for the run loop to signal more data when the TLS layer has * already read it. */ } while ([session pending]); #endif } - (void) receivedEventWrite { if (GS_H_TRYCON == state) /* Connection attempt. */ { int res = 0; if (nil == cData) { socklen_t len = sizeof(res); if (getsockopt(desc, SOL_SOCKET, SO_ERROR, (char*)&res, (OPTLEN*)&len) != 0) { state = GS_H_UNCON; NSLog(@"connect attempt failed - %@", [NSError _last]); } else if (res != 0) { state = GS_H_UNCON; NSLog(@"connect attempt failed - %@", [NSError _systemError: res]); } else { NSSocketPort *p = [self recvPort]; /* We have established a new network (TCP/IP) connection and the * first thing to do is send out port information (after setting * up a TLS session if necessary). */ ASSIGN(cData, newDataWithEncodedPort(p)); cLength = 0; #if defined(HAVE_GNUTLS) NSDictionary *opts = [p clientOptionsForTLS]; DESTROY(session); if (opts) { session = [[GSTLSSession alloc] initWithOptions: opts direction: YES // as client transport: self push: GSTLSHandlePush pull: GSTLSHandlePull]; NSDebugMLLog(@"GSTcpHandle", @"%@ is connecting using %@", self, session); } #endif } } if (GS_H_TRYCON == state) { unsigned l = [cData length]; const void *b = [cData bytes]; int len; #if defined(HAVE_GNUTLS) if (session) { if ([session handshake]) { if (![session active]) { DESTROY(cData); NSLog(@"connect TLS handshake failed on %p - %@", self, [session problem]); state = GS_H_UNCON; return; } len = [session write: b + cLength length: l - cLength]; } else { errno = EAGAIN; len = -1; } } else { len = send(desc, b + cLength, l - cLength, 0); } #else len = send(desc, b + cLength, l - cLength, 0); #endif if (len <= 0) { int e = socketError(); if (e != EINTR && e != EAGAIN) { DESTROY(cData); state = GS_H_UNCON; NSLog(@"connect write attempt failed - %@", [NSError _last]); return; } #if _WIN32 else { readyToSend = NO; } #endif /* !_WIN32 */ } else { cLength += len; if (cLength >= l) { DESTROY(cData); ASSIGN(defaultAddress, GSPrivateSockaddrHost(&sockAddr)); NSDebugMLLog(@"GSTcpHandle", @"connect wrote %d bytes on %p", len, self); state = GS_H_CONNECTED; } } } } else { int res; unsigned l; const void *b; if (wData == nil) { if ([wMsgs count] > 0) { NSArray *components = [wMsgs objectAtIndex: 0]; wData = [components objectAtIndex: wItem++]; wLength = 0; } else { // NSLog(@"No messages to write on %p.", self); return; } } b = [wData bytes]; l = [wData length]; #if defined(HAVE_GNUTLS) if (session) { if ([session handshake]) { if (![session active]) { NSLog(@"accept TLS handshake failed on %p - %@", self, [session problem]); [self invalidate]; return; } res = [session write: b + wLength length: l - wLength]; } else { errno = EAGAIN; res = -1; } } else { res = send(desc, b + wLength, l - wLength, 0); } #else res = send(desc, b + wLength, l - wLength, 0); #endif if (res < 0) { int e = socketError(); if (e != EINTR && e != EAGAIN) { NSLog(@"write attempt failed - %@", [NSError _last]); [self invalidate]; return; } #if _WIN32 else { readyToSend = NO; } #endif /* !_WIN32 */ } else { NSDebugMLLog(@"GSTcpHandle", @"wrote %d bytes on %p", res, self); wLength += res; if (wLength == l) { NSArray *components; /* * We have completed a data item so see what is * left of the message components. */ components = [wMsgs objectAtIndex: 0]; wLength = 0; if ([components count] > wItem) { /* * More to write - get next item. */ wData = [components objectAtIndex: wItem++]; } else { /* * message completed - remove from list. */ NSDebugMLLog(@"GSTcpHandle", @"completed %p on %p", components, self); wData = nil; wItem = 0; [wMsgs removeObjectAtIndex: 0]; } } } } } - (void) receivedEvent: (void*)data type: (RunLoopEventType)type extra: (void*)extra forMode: (NSString*)mode { #if defined(_WIN32) WSANETWORKEVENTS ocurredEvents; /* If we have been invalidated then we should ignore this event. */ if (NO == valid) { return; } if (INVALID_SOCKET == desc) { [self invalidate]; return; } M_LOCK(myLock); if (WSAEnumNetworkEvents(desc, event, &ocurredEvents)==SOCKET_ERROR) { NSLog(@"Error getting event type %d", WSAGetLastError()); abort(); } if (ocurredEvents.lNetworkEvents & FD_CONNECT) { [self receivedEventWrite]; GSPrivateNotifyASAP(mode); if (desc == INVALID_SOCKET) { M_UNLOCK(myLock); return; } ocurredEvents.lNetworkEvents ^= FD_CONNECT; } if (ocurredEvents.lNetworkEvents & FD_READ) { [self receivedEventRead]; GSPrivateNotifyASAP(mode); if (desc == INVALID_SOCKET) { M_UNLOCK(myLock); return; } ocurredEvents.lNetworkEvents ^= FD_READ; } if (ocurredEvents.lNetworkEvents & FD_OOB) { [self receivedEventRead]; GSPrivateNotifyASAP(mode); if (desc == INVALID_SOCKET) { M_UNLOCK(myLock); return; } ocurredEvents.lNetworkEvents ^= FD_OOB; } if (ocurredEvents.lNetworkEvents & FD_WRITE) { readyToSend = YES; [self receivedEventWrite]; GSPrivateNotifyASAP(mode); if (desc == INVALID_SOCKET) { M_UNLOCK(myLock); return; } ocurredEvents.lNetworkEvents ^= FD_WRITE; } if (ocurredEvents.lNetworkEvents & FD_CLOSE) { [self receivedEventRead]; GSPrivateNotifyASAP(mode); if (desc == INVALID_SOCKET) { M_UNLOCK(myLock); return; } ocurredEvents.lNetworkEvents ^= FD_CLOSE; } if (ocurredEvents.lNetworkEvents) { NSLog(@"Event not get %ld", ocurredEvents.lNetworkEvents); abort(); } M_UNLOCK(myLock); #else /* If we have been invalidated then we should ignore this event. */ if (NO == valid) { return; } if (desc < 0) { [self invalidate]; return; } M_LOCK(myLock); if (type != ET_WDESC) { [self receivedEventRead]; } else { [self receivedEventWrite]; } M_UNLOCK(myLock); #endif } - (BOOL) sendMessage: (NSArray*)components beforeDate: (NSDate*)when { NSRunLoop *l; BOOL sent = NO; NSAssert([components count] > 0, NSInternalInconsistencyException); NSDebugMLLog(@"GSTcpHandle", @"Sending message %p %@ on %p(%lld) before %@", components, components, self, (long long)desc, when); M_LOCK(myLock); [wMsgs addObject: components]; l = [runLoopClass currentRunLoop]; IF_NO_ARC(RETAIN(self);) [self _add: l]; while (valid == YES && [wMsgs indexOfObjectIdenticalTo: components] != NSNotFound && [when timeIntervalSinceNow] > 0) { M_UNLOCK(myLock); NS_DURING #if defined(_WIN32) if (readyToSend) { [self receivedEventWrite]; } else { [l runMode: NSConnectionReplyMode beforeDate: when]; } #else [l runMode: NSConnectionReplyMode beforeDate: when]; #endif NS_HANDLER M_LOCK(myLock); [self _rem: l]; M_UNLOCK(myLock); [localException raise]; NS_ENDHANDLER M_LOCK(myLock); } [self _rem: l]; if ([wMsgs indexOfObjectIdenticalTo: components] == NSNotFound) { sent = YES; } else { [wMsgs removeObjectIdenticalTo: components]; } M_UNLOCK(myLock); NSDebugMLLog(@"GSTcpHandle", @"Message send %p on %p status %d", components, self, sent); RELEASE(self); return sent; } - (NSSocketPort*) sendPort { if (sendPort == nil) return nil; else if (caller == YES) return sendPort; // We called, so port is not retained. else return sendPort; // Retained port. } - (void) setState: (GSHandleState)s { state = s; } - (GSHandleState) state { return state; } @end @interface NSSocketPort (RunLoop) - (void) receivedEvent: (void*)data type: (RunLoopEventType)type extra: (void*)extra forMode: (NSString*)mode; @end @implementation NSSocketPort static NSRecursiveLock *tcpPortLock = nil; static NSMapTable *tcpPortMap = 0; static Class tcpPortClass; + (void) initialize { if (self == [NSSocketPort class]) { tcpPortClass = self; tcpPortMap = NSCreateMapTable(NSIntegerMapKeyCallBacks, NSObjectMapValueCallBacks, 0); [[NSObject leakAt: &tcpPortMap] release]; tcpPortLock = [NSRecursiveLock new]; [[NSObject leakAt: &tcpPortLock] release]; } } + (id) new { return RETAIN([self portWithNumber: 0 onHost: nil forceAddress: nil listener: YES]); } /* * Look up an existing NSSocketPort given a host and number */ + (NSSocketPort*) existingPortWithNumber: (uint16_t)number onHost: (NSHost*)aHost { NSSocketPort *port = nil; NSMapTable *thePorts; M_LOCK(tcpPortLock); /* * Get the map table of ports with the specified number. */ thePorts = (NSMapTable*)NSMapGet(tcpPortMap, (void*)(uintptr_t)number); if (thePorts != 0) { port = (NSSocketPort*)NSMapGet(thePorts, (void*)aHost); IF_NO_ARC(AUTORELEASE(RETAIN(port));) } M_UNLOCK(tcpPortLock); return port; } /* * This is the preferred initialisation method for NSSocketPort * * 'number' should be a TCP/IP port number or may be zero for a port on * the local host. * 'aHost' should be the host for the port or may be nil for the local * host. * 'addr' is the IP address that MUST be used for this port - if it is nil * then, for the local host, the port uses ALL IP addresses, and for a * remote host, the port will use the first address that works. */ + (NSSocketPort*) portWithNumber: (uint16_t)number onHost: (NSHost*)aHost forceAddress: (NSString*)addr listener: (BOOL)shouldListen { socklen_t slen; NSSocketPort *port = nil; NSHost *thisHost = [NSHost localHost]; NSMapTable *thePorts; if (thisHost == nil) { NSLog(@"attempt to create port on host without networking set up!"); return nil; } if (aHost == nil) { aHost = thisHost; } if (addr != nil && [[aHost addresses] containsObject: addr] == NO) { NSLog(@"attempt to use address '%@' on host without that address", addr); return nil; } if (number == 0 && [thisHost isEqual: aHost] == NO) { NSLog(@"attempt to get port zero on remote host"); return nil; } M_LOCK(tcpPortLock); /* * First try to find a pre-existing port. */ thePorts = (NSMapTable*)NSMapGet(tcpPortMap, (void*)(uintptr_t)number); if (thePorts != 0) { port = (NSSocketPort*)NSMapGet(thePorts, (void*)aHost); } if (port == nil) { port = (NSSocketPort*)NSAllocateObject(self, 0, NSDefaultMallocZone()); port->listener = -1; port->host = RETAIN(aHost); port->address = [addr copy]; port->handles = NSCreateMapTable(NSIntegerMapKeyCallBacks, NSObjectMapValueCallBacks, 0); #if defined(_WIN32) port->eventListener = WSA_INVALID_EVENT; port->events = NSCreateMapTable(NSIntegerMapKeyCallBacks, NSIntegerMapValueCallBacks, 0); #endif port->myLock = [NSRecursiveLock new]; port->_is_valid = YES; [tlsLock lock]; [port setClientOptionsForTLS: tlsClientOptions]; [port setServerOptionsForTLS: tlsServerOptions]; [tlsLock unlock]; if (shouldListen == YES && [thisHost isEqual: aHost]) { #ifndef BROKEN_SO_REUSEADDR int reuse = 1; /* Should we re-use ports? */ #endif SOCKET desc; BOOL addrOk = YES; struct sockaddr sockaddr; /* * Creating a new port on the local host - so we must create a * listener socket to accept incoming connections. */ addrOk = GSPrivateSockaddrSetup(addr, number, nil, nil, &sockaddr); /* * Need size of buffer for getsockbyname() later. */ slen = sizeof(sockaddr); if (addrOk == NO) { NSLog(@"Bad address (%@) specified for listening port", addr); DESTROY(port); } else if ((desc = socket(sockaddr.sa_family, SOCK_STREAM, PF_UNSPEC)) == INVALID_SOCKET) { NSLog(@"unable to create socket - %@", [NSError _last]); DESTROY(port); } #ifndef BROKEN_SO_REUSEADDR /* * Under decent systems, SO_REUSEADDR means that the port can be * reused immediately that this porcess exits. Under some it means * that multiple processes can serve the same port simultaneously. * We don't want that broken behavior! */ else if (setsockopt(desc, SOL_SOCKET, SO_REUSEADDR, (char*)&reuse, (OPTLEN)sizeof(reuse)) < 0) { (void) close(desc); NSLog(@"unable to set reuse on socket - %@", [NSError _last]); DESTROY(port); } #endif else if (bind(desc, &sockaddr, GSPrivateSockaddrLength(&sockaddr)) == SOCKET_ERROR) { NSLog(@"unable to bind to port %@ - %@", GSPrivateSockaddrName(&sockaddr), [NSError _last]); (void) close(desc); DESTROY(port); } else if (listen(desc, GSBACKLOG) == SOCKET_ERROR) { NSLog(@"unable to listen on port - %@", [NSError _last]); (void) close(desc); DESTROY(port); } else if (getsockname(desc, (struct sockaddr*)&sockaddr, (OPTLEN*)&slen) == SOCKET_ERROR) { NSLog(@"unable to get socket name - %@", [NSError _last]); (void) close(desc); DESTROY(port); } else { #if defined(_WIN32) int rc; #endif /* * Set up the listening descriptor and the actual TCP port * number (which will have been set to a real port number when * we did the 'bind' call. */ port->listener = desc; port->portNum = GSPrivateSockaddrPort(&sockaddr); #if defined(_WIN32) port->eventListener = (WSAEVENT)CreateEvent(NULL,NO,NO,NULL); if (port->eventListener == WSA_INVALID_EVENT) { NSLog(@"Invalid Event - '%d'", WSAGetLastError()); abort(); } rc = WSAEventSelect(port->listener, port->eventListener, FD_ACCEPT); NSAssert(rc == 0, @"WSAEventSelect failed!"); #endif /* * Make sure we have the map table for this port. */ thePorts = (NSMapTable*)NSMapGet(tcpPortMap, (void*)(uintptr_t)port->portNum); if (thePorts == 0) { /* * No known ports with this port number - * create the map table to add the new port to. */ thePorts = NSCreateMapTable(NSObjectMapKeyCallBacks, NSNonOwnedPointerMapValueCallBacks, 0); NSMapInsert(tcpPortMap, (void*)(uintptr_t)port->portNum, (void*)thePorts); RELEASE(thePorts); } /* * Ok - now add the port for the host */ NSMapInsert(thePorts, (void*)aHost, (void*)port); NSDebugMLLog(@"NSPort", @"Created listening port: %@", port); } } else { /* * Make sure we have the map table for this port. */ port->portNum = number; thePorts = (NSMapTable*)NSMapGet(tcpPortMap, (void*)(uintptr_t)number); if (thePorts == 0) { /* * No known ports within this port number - * create the map table to add the new port to. */ thePorts = NSCreateMapTable(NSIntegerMapKeyCallBacks, NSNonOwnedPointerMapValueCallBacks, 0); NSMapInsert(tcpPortMap, (void*)(uintptr_t)number, (void*)thePorts); RELEASE(thePorts); } /* * Record the port by host. */ NSMapInsert(thePorts, (void*)aHost, (void*)port); NSDebugMLLog(@"NSPort", @"Created speaking port: %@", port); } } else { IF_NO_ARC(RETAIN(port);) NSDebugMLLog(@"NSPort", @"Using pre-existing port: %@", port); } IF_NO_ARC(AUTORELEASE(port);) M_UNLOCK(tcpPortLock); return port; } + (void) setClientOptionsForTLS: (NSDictionary*)options { if (options != tlsClientOptions) { [tlsLock lock]; ASSIGNCOPY(tlsClientOptions, options); [tlsLock unlock]; } } + (void) setServerOptionsForTLS: (NSDictionary*)options { if (options != tlsServerOptions) { [tlsLock lock]; ASSIGNCOPY(tlsServerOptions, options); [tlsLock unlock]; } } - (void) addHandle: (GSTcpHandle*)handle forSend: (BOOL)send { M_LOCK(myLock); if (send == YES) { if (handle->caller == YES) handle->sendPort = self; else ASSIGN(handle->sendPort, self); } else { handle->recvPort = self; } NSMapInsert(handles, (void*)(uintptr_t)[handle descriptor], (void*)handle); #if defined(_WIN32) NSMapInsert(events, (void*)(uintptr_t)[handle eventHandle], (void*)(uintptr_t)[handle descriptor]); #endif M_UNLOCK(myLock); } - (NSString*) address { return address; } - (NSDictionary*) clientOptionsForTLS { NSDictionary *opts; M_LOCK(myLock); opts = RETAIN(tlscopts); M_UNLOCK(myLock); return AUTORELEASE(opts); } - (id) conversation: (NSPort*)recvPort { NSMapEnumerator me; void *dummy; GSTcpHandle *handle = nil; M_LOCK(myLock); /* * Enumerate all our socket handles, and look for one with port. */ me = NSEnumerateMapTable(handles); while (NSNextMapEnumeratorPair(&me, &dummy, (void**)&handle)) { if ((NSPort*) [handle recvPort] == recvPort) { IF_NO_ARC(RETAIN(handle);) NSEndMapTableEnumeration(&me); M_UNLOCK(myLock); return AUTORELEASE(handle); } } NSEndMapTableEnumeration(&me); M_UNLOCK(myLock); return nil; } - (id) copyWithZone: (NSZone*)zone { return RETAIN(self); } - (void) dealloc { [self finalize]; [super dealloc]; } - (NSString*) description { NSString *desc; desc = [NSString stringWithFormat: @"<%s %p on IP %@,%d>", GSClassNameFromObject(self), self, ((address == nil) ? (id)@"any" : (id)address), portNum]; return desc; } - (void) finalize { NSDebugMLLog(@"NSPort", @"NSSocketPort %p finalized", self); M_LOCK(tcpPortLock); NSMapRemove(tcpPortMap, (void*)(uintptr_t)portNum); M_UNLOCK(tcpPortLock); [self invalidate]; if (handles != 0) { NSFreeMapTable(handles); handles = 0; } DESTROY(tlscopts); DESTROY(tlssopts); DESTROY(host); TEST_RELEASE(address); DESTROY(myLock); } /* * This is a callback method used by the NSRunLoop class to determine which * descriptors to watch for the port. */ #if defined(_WIN32) - (void) getFds: (NSInteger*)fds count: (NSInteger*)count { NSInteger limit = *count; NSInteger pos = 0; NSMapEnumerator me; void *event; SOCKET fd; GSTcpHandle *handle; id recvSelf; M_LOCK(myLock); *count = NSCountMapTable(events); /* * Put in our listening socket. */ if (eventListener != WSA_INVALID_EVENT) { (*count)++; if (pos < limit) { fds[pos++] = (uintptr_t)eventListener; } } /* * Enumerate all our socket handles, and put them in as long as they * are to be used for receiving. */ recvSelf = self; me = NSEnumerateMapTable(events); while (NSNextMapEnumeratorPair(&me, &event, (void**)&fd)) { handle = (GSTcpHandle*)NSMapGet(handles, (void*)(uintptr_t)fd); if (handle->recvPort == recvSelf && handle->inReplyMode == NO && pos < limit) { fds[pos++] = (uintptr_t)event; NSDebugMLLog(@"NSPort", @"Add event %p", event); } } NSEndMapTableEnumeration(&me); M_UNLOCK(myLock); } #else - (void) getFds: (NSInteger*)fds count: (NSInteger*)count { NSInteger limit = *count; NSInteger pos = 0; NSMapEnumerator me; void *sock; GSTcpHandle *handle; id recvSelf; M_LOCK(myLock); /* * Put in our listening socket. */ if (listener >= 0) { if (pos < limit) { fds[pos] = listener; } pos++; } /* * Enumerate all our socket handles, and put them in as long as they * are to be used for receiving. */ recvSelf = self; me = NSEnumerateMapTable(handles); while (NSNextMapEnumeratorPair(&me, &sock, (void**)&handle)) { if (handle->recvPort == recvSelf) { if (pos < limit) { fds[pos] = (int)(intptr_t)sock; } pos++; } } NSEndMapTableEnumeration(&me); M_UNLOCK(myLock); *count = pos; } #endif - (GSTcpHandle*) handleForPort: (NSSocketPort*)recvPort beforeDate: (NSDate*)when { NSMapEnumerator me; SOCKET sock; void *dummy; #ifndef BROKEN_SO_REUSEADDR int opt = 1; #endif GSTcpHandle *handle = nil; M_LOCK(myLock); /* * Enumerate all our socket handles, and look for one with port. */ me = NSEnumerateMapTable(handles); while (NSNextMapEnumeratorPair(&me, &dummy, (void**)&handle)) { if ([handle recvPort] == recvPort) { M_UNLOCK(myLock); NSEndMapTableEnumeration(&me); return handle; } } NSEndMapTableEnumeration(&me); /* * Not found ... create a new handle. */ handle = nil; if ((sock = socket(AF_INET, SOCK_STREAM, PF_UNSPEC)) == INVALID_SOCKET) { NSLog(@"unable to create socket - %@", [NSError _last]); } #ifndef BROKEN_SO_REUSEADDR /* * Under decent systems, SO_REUSEADDR means that the port can be reused * immediately that this process exits. Under some it means * that multiple processes can serve the same port simultaneously. * We don't want that broken behavior! */ else if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*)&opt, (OPTLEN)sizeof(opt)) < 0) { (void)close(sock); NSLog(@"unable to set reuse on socket - %@", [NSError _last]); } #endif else if ((handle = [GSTcpHandle handleWithDescriptor: sock]) == nil) { (void)close(sock); NSLog(@"unable to create GSTcpHandle - %@", [NSError _last]); } else { [recvPort addHandle: handle forSend: NO]; } M_UNLOCK(myLock); /* * If we succeeded in creating a new handle - connect to remote host. */ if (handle != nil) { if ([handle connectToPort: self beforeDate: when] == NO) { [handle invalidate]; handle = nil; } } return handle; } - (void) handlePortMessage: (NSPortMessage*)m { id d = [self delegate]; if (d == nil) { NSDebugMLLog(@"NSPort", @"%@", @"No delegate to handle incoming message"); return; } if ([d respondsToSelector: @selector(handlePortMessage:)] == NO) { NSDebugMLLog(@"NSPort", @"%@", @"delegate doesn't handle messages"); return; } [d handlePortMessage: m]; } - (NSUInteger) hash { return (unsigned)portNum; } - (NSHost*) host { return host; } - (id) init { DESTROY(self); self = [tcpPortClass new]; return self; } - (void) invalidate { if ([self isValid] == YES) { IF_NO_ARC(RETAIN(self);) M_LOCK(myLock); if ([self isValid] == YES) { NSMapTable *thePorts; NSArray *handleArray; unsigned i; M_LOCK(tcpPortLock); thePorts = NSMapGet(tcpPortMap, (void*)(uintptr_t)portNum); if (thePorts != 0) { NSMapRemove(thePorts, (void*)host); } M_UNLOCK(tcpPortLock); if (listener >= 0) { (void) close(listener); listener = -1; #if defined(_WIN32) WSACloseEvent(eventListener); eventListener = WSA_INVALID_EVENT; #endif } if (handles != 0) { handleArray = NSAllMapTableValues(handles); i = [handleArray count]; while (i-- > 0) { GSTcpHandle *handle = [handleArray objectAtIndex: i]; [handle invalidate]; } } #if defined(_WIN32) if (events != 0) { NSFreeMapTable(events); events = 0; } #endif [[NSSocketPortNameServer sharedInstance] removePort: self]; [super invalidate]; } M_UNLOCK(myLock); RELEASE(self); } } - (BOOL) isEqual: (id)anObject { if (anObject == self) { return YES; } if ([anObject class] == [self class]) { NSSocketPort *o = (NSSocketPort*)anObject; if (o->portNum == portNum && [o->host isEqual: host]) { return YES; } } return NO; } - (uint16_t) portNumber { return portNum; } - (void) receivedEvent: (void*)data type: (RunLoopEventType)type extra: (void*)extra forMode: (NSString*)mode { #if defined(_WIN32) WSAEVENT event = (WSAEVENT)extra; SOCKET desc; #else SOCKET desc = (SOCKET)(uintptr_t)extra; #endif GSTcpHandle *handle; NSDebugMLLog(@"NSPort", @"received %s event %p on %p", type == ET_RPORT ? "read" : "write", extra, self); #if defined(_WIN32) if (event == eventListener) #else if (desc == listener) #endif { struct sockaddr sockAddr; socklen_t size = sizeof(sockAddr); desc = accept(listener, (struct sockaddr*)&sockAddr, (OPTLEN*)&size); if (desc == INVALID_SOCKET) { NSDebugMLLog(@"NSPort", @"accept failed - handled in other thread?"); } else { int status = 1; if (setsockopt(desc, SOL_SOCKET, SO_KEEPALIVE, (char*)&status, (OPTLEN)sizeof(status)) < 0) { NSLog(@"failed to turn on keepalive for accepted socket %lld", (long long)desc); } #if defined(_WIN32) // reset associated event with new socket WSAEventSelect(desc, eventListener, 0); #endif /* * Create a handle for the socket and set it up so we are its * receiving port, and it's waiting to get the port name from * the other end. */ handle = [GSTcpHandle handleWithDescriptor: desc]; memcpy(&handle->sockAddr, &sockAddr, sizeof(sockAddr)); ASSIGN(handle->defaultAddress, GSPrivateSockaddrHost(&sockAddr)); [handle setState: GS_H_ACCEPT]; #if defined(HAVE_GNUTLS) NSDictionary *o; if ((o = [self serverOptionsForTLS]) != nil) { handle->session = [[GSTLSSession alloc] initWithOptions: o direction: NO // as server transport: handle push: GSTLSHandlePush pull: GSTLSHandlePull]; NSDebugMLLog(@"GSTcpHandle", @"%@ is accepting using %@", handle, handle->session); } #endif [self addHandle: handle forSend: NO]; } } else { M_LOCK(myLock); #if defined(_WIN32) desc = (SOCKET)NSMapGet(events, (void*)(uintptr_t)event); #endif handle = (GSTcpHandle*)NSMapGet(handles, (void*)(uintptr_t)desc); IF_NO_ARC(AUTORELEASE(RETAIN(handle));) M_UNLOCK(myLock); if (handle == nil) { const char *t; #if defined(_WIN32) if (type == ET_HANDLE) t = "winhandle"; #else if (type == ET_RDESC) t = "rdesc"; else if (type == ET_WDESC) t = "wdesc"; else if (type == ET_EDESC) t = "edesc"; #endif else if (type == ET_RPORT) t = "rport"; else t = "unknown"; NSLog(@"No handle for event %s on descriptor %lld", t, (long long)desc); } else { [handle receivedEvent: data type: type extra: extra forMode: mode]; } } } - (oneway void) release { M_LOCK(tcpPortLock); if (NSDecrementExtraRefCountWasZero(self)) { NSMapTable *thePorts; thePorts = NSMapGet(tcpPortMap, (void*)(uintptr_t)portNum); if (thePorts != 0) { NSMapRemove(thePorts, host); } M_UNLOCK(tcpPortLock); [self dealloc]; } else { M_UNLOCK(tcpPortLock); } } /* * This is called when a tcp/ip socket connection is broken. We remove the * connection handle from this port and, if this was the last handle to a * remote port, we invalidate the port. */ - (void) removeHandle: (GSTcpHandle*)handle { IF_NO_ARC(RETAIN(self);) M_LOCK(myLock); if ([handle sendPort] == self) { if (handle->caller != YES) { /* * This is a handle for a send port, and the handle was not formed * by calling the remote process, so this port object must have * been created to deal with an incoming connection and will have * been retained - we must therefore release this port since the * handle no longer uses it. */ IF_NO_ARC(RELEASE(self);) } handle->sendPort = nil; } if ([handle recvPort] == self) { handle->recvPort = nil; } NSMapRemove(handles, (void*)(uintptr_t)[handle descriptor]); #if defined(_WIN32) NSMapRemove(events, (void*)(uintptr_t)[handle eventHandle]); #endif if (((int) listener) < 0 && NSCountMapTable(handles) == 0) { [self invalidate]; } M_UNLOCK(myLock); RELEASE(self); } /* * This returns the amount of space that a port coder should reserve at the * start of its encoded data so that the NSSocketPort can insert header info * into the data. * The idea is that a message consisting of a single data item with space at * the start can be written directly without having to copy data to another * buffer etc. */ - (NSUInteger) reservedSpaceLength { return sizeof(GSPortItemHeader) + sizeof(GSPortMsgHeader); } - (BOOL) sendBeforeDate: (NSDate*)when msgid: (NSInteger)msgId components: (NSMutableArray*)components from: (NSPort*)receivingPort reserved: (NSUInteger)length { BOOL sent = NO; GSTcpHandle *h; unsigned rl; if ([self isValid] == NO) { return NO; } if ([components count] == 0) { NSLog(@"empty components sent"); return NO; } /* * If the reserved length in the first data object is wrong - we have to * fail, unless it's zero, in which case we can insert a data object for * the header. */ rl = [self reservedSpaceLength]; if (length != 0 && length != rl) { NSLog(@"bad reserved length - %"PRIuPTR, length); return NO; } if ([receivingPort isKindOfClass: tcpPortClass] == NO) { NSLog(@"woah there - receiving port is not the correct type"); return NO; } h = [self handleForPort: (NSSocketPort*)receivingPort beforeDate: when]; if (h != nil) { NSMutableData *header; unsigned hLength; unsigned l; GSPortItemHeader *pih; GSPortMsgHeader *pmh; unsigned c = [components count]; unsigned i; BOOL pack = YES; /* * Ok - ensure we have space to insert header info. */ if (length == 0 && rl != 0) { header = [[mutableDataClass alloc] initWithCapacity: NETBLOCK]; [header setLength: rl]; [components insertObject: header atIndex: 0]; RELEASE(header); } header = [components objectAtIndex: 0]; /* * The Item header contains the item type and the length of the * data in the item (excluding the item header itself). */ hLength = [header length]; l = hLength - sizeof(GSPortItemHeader); pih = (GSPortItemHeader*)[header mutableBytes]; pih->type = GSSwapHostI32ToBig(GSP_HEAD); pih->length = GSSwapHostI32ToBig(l); /* * The message header contains the message Id and the original count * of components in the message (excluding any extra component added * simply to hold the header). */ pmh = (GSPortMsgHeader*)&pih[1]; pmh->mId = GSSwapHostI32ToBig(msgId); pmh->nItems = GSSwapHostI32ToBig(c); /* * Now insert item header information as required. * Pack as many items into the initial data object as possible, up to * a maximum of NETBLOCK bytes. This is to try to get a single, * efficient write operation if possible. */ c = [components count]; for (i = 1; i < c; i++) { id o = [components objectAtIndex: i]; if ([o isKindOfClass: [NSData class]]) { GSPortItemHeader *pih; unsigned h = sizeof(GSPortItemHeader); unsigned l = [o length]; void *b; if (pack == YES && hLength + l + h <= NETBLOCK) { [header setLength: hLength + l + h]; b = [header mutableBytes]; b += hLength; #if NEED_WORD_ALIGNMENT /* * When packing data, an item may not be aligned on a * word boundary, so we work with an aligned buffer * and use memcmpy() */ if ((hLength % __alignof__(uint32_t)) != 0) { GSPortItemHeader itemHeader; pih = (GSPortItemHeader*)&itemHeader; pih->type = GSSwapHostI32ToBig(GSP_DATA); pih->length = GSSwapHostI32ToBig(l); memcpy(b, (void*)pih, h); } else { pih = (GSPortItemHeader*)b; pih->type = GSSwapHostI32ToBig(GSP_DATA); pih->length = GSSwapHostI32ToBig(l); } #else pih = (GSPortItemHeader*)b; pih->type = GSSwapHostI32ToBig(GSP_DATA); pih->length = GSSwapHostI32ToBig(l); #endif memcpy(b+h, [o bytes], l); [components removeObjectAtIndex: i--]; c--; hLength += l + h; } else { NSMutableData *d; pack = NO; d = [[NSMutableData alloc] initWithLength: l + h]; b = [d mutableBytes]; pih = (GSPortItemHeader*)b; memcpy(b+h, [o bytes], l); pih->type = GSSwapHostI32ToBig(GSP_DATA); pih->length = GSSwapHostI32ToBig(l); [components replaceObjectAtIndex: i withObject: d]; RELEASE(d); } } else if ([o isKindOfClass: tcpPortClass]) { NSData *d = newDataWithEncodedPort(o); unsigned dLength = [d length]; if (pack == YES && hLength + dLength <= NETBLOCK) { void *b; [header setLength: hLength + dLength]; b = [header mutableBytes]; b += hLength; hLength += dLength; memcpy(b, [d bytes], dLength); [components removeObjectAtIndex: i--]; c--; } else { pack = NO; [components replaceObjectAtIndex: i withObject: d]; } RELEASE(d); } } /* * Now send the message. */ sent = [h sendMessage: components beforeDate: when]; } return sent; } - (NSDictionary*) serverOptionsForTLS { NSDictionary *opts; M_LOCK(myLock); opts = RETAIN(tlssopts); M_UNLOCK(myLock); return AUTORELEASE(opts); } /** Sets the TLS options for network connections created by this port * acting as a network client. */ - (void) setClientOptionsForTLS: (NSDictionary*)options { M_LOCK(myLock); ASSIGNCOPY(tlscopts, options); M_UNLOCK(myLock); } /** Sets the TLS options for network connections created by this port * acting as a network server. */ - (void) setServerOptionsForTLS: (NSDictionary*)options { M_LOCK(myLock); ASSIGNCOPY(tlssopts, options); M_UNLOCK(myLock); } @end gnustep-base-1.29.0/Source/NSSocketPortNameServer.m000066400000000000000000000736221435650067400221700ustar00rootroot00000000000000/* Implementation of NSSocketPortNameServer class for Distributed Objects Copyright (C) 1998,1999,2000 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: October 1998 This file is part of the GNUstep Base Library. 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 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 USA. $Date$ $Revision$ */ /* defines to get system-v functions including inet_aton() * The first define is for old versions of glibc, the second for newer ones */ #define _SVID_SOURCE 1 #define _DEFAULT_SOURCE 1 #import "common.h" #define EXPOSE_NSSocketPortNameServer_IVARS 1 #import "Foundation/NSData.h" #import "Foundation/NSByteOrder.h" #import "Foundation/NSException.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSFileManager.h" #import "Foundation/NSLock.h" #import "Foundation/NSFileHandle.h" #import "Foundation/NSRunLoop.h" #import "Foundation/NSNotification.h" #import "Foundation/NSNotificationQueue.h" #import "Foundation/NSPort.h" #import "Foundation/NSMapTable.h" #import "Foundation/NSSet.h" #import "Foundation/NSHost.h" #import "Foundation/NSTask.h" #import "GNUstepBase/NSTask+GNUstepBase.h" #import "Foundation/NSDate.h" #import "Foundation/NSTimer.h" #import "Foundation/NSPathUtilities.h" #import "Foundation/NSPortNameServer.h" #import "GSPortPrivate.h" #ifdef _WIN32 #include #include #else #include #include #endif /* * Protocol definition stuff for talking to gdomap process. */ #include "../Tools/gdomap.h" #define stringify_it(X) #X #define make_gdomap_port(X) stringify_it(X) /* * to suppress warnings about using private methods. */ @class NSSocketPort; @interface NSSocketPort (Hack) + (NSSocketPort*) portWithNumber: (uint16_t)number onHost: (NSHost*)host forceAddress: (NSString*)addr listener: (BOOL)shouldListen; - (uint16_t) portNumber; @end /* * class-wide variables. */ static unsigned maxHandles = 4; static NSTimeInterval timeout = 20.0; static NSString *serverPort = @"gdomap"; static NSString *mode = @"NSPortServerLookupMode"; static NSArray *modes = nil; static NSRecursiveLock *serverLock = nil; static NSSocketPortNameServer *defaultServer = nil; static NSString *launchCmd = nil; static Class portClass = 0; typedef enum { GSPC_NONE, GSPC_LOPEN, GSPC_ROPEN, GSPC_RETRY, GSPC_WRITE, GSPC_READ1, GSPC_READ2, GSPC_FAIL, GSPC_DONE } GSPortComState; @interface GSPortCom : NSObject { gdo_req msg; unsigned expecting; NSMutableData *data; NSFileHandle *handle; GSPortComState state; struct in_addr addr; } - (struct in_addr) addr; - (void) close; - (NSData*) data; - (void) didConnect: (NSNotification*)notification; - (void) didRead: (NSNotification*)notification; - (void) didWrite: (NSNotification*)notification; - (void) fail; - (BOOL) isActive; - (void) open: (NSString*)host; - (void) setAddr: (struct in_addr)addr; - (GSPortComState) state; - (void) startListNameServers; - (void) startPortLookup: (NSString*)name onHost: (NSString*)addr; - (void) startPortRegistration: (uint32_t)portNumber withName: (NSString*)name; - (void) startPortUnregistration: (uint32_t)portNumber withName: (NSString*)name; @end @implementation GSPortCom - (struct in_addr) addr { return addr; } - (void) close { if (handle != nil) { NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; [nc removeObserver: self name: GSFileHandleConnectCompletionNotification object: handle]; [nc removeObserver: self name: NSFileHandleReadCompletionNotification object: handle]; [nc removeObserver: self name: GSFileHandleWriteCompletionNotification object: handle]; [handle closeFile]; DESTROY(handle); } } - (NSData*) data { return data; } - (void) dealloc { [self close]; TEST_RELEASE(data); [super dealloc]; } - (void) didConnect: (NSNotification*)notification { NSDictionary *userInfo = [notification userInfo]; NSString *e; e = [userInfo objectForKey: GSFileHandleNotificationError]; if (e != nil) { NSDebugMLLog(@"NSSocketPortNameServer", @"failed connect to gdomap on %@:%@ - %@", [[notification object] socketAddress], [[notification object] socketService], e); /* * Remove our file handle, then either retry or fail. */ [self close]; if (launchCmd == nil) { launchCmd = RETAIN([NSTask launchPathForTool: @"gdomap"]); } if (state == GSPC_LOPEN && launchCmd != nil) { NSRunLoop *loop = [NSRunLoop currentRunLoop]; NSTimer *timer; NSLog(@"NSSocketPortNameServer attempting to start gdomap on local host\n" @"This will take a few seconds.\n" @"Trying to launch gdomap from %@ or a machine/operating-system subdirectory.\n" #if !defined(GDOMAP_PORT_OVERRIDE) @"On systems other than mswindows, this will only work if the gdomap program\n" @"was installed setuid to root.\n" #endif @"It is recommended that you start up gdomap at login time or (better) when\n" @"your computer is started instead.", [launchCmd stringByDeletingLastPathComponent]); [NSTask launchedTaskWithLaunchPath: launchCmd arguments: nil]; timer = [NSTimer timerWithTimeInterval: 5.0 invocation: nil repeats: NO]; [loop addTimer: timer forMode: [loop currentMode]]; [loop runUntilDate: [NSDate dateWithTimeIntervalSinceNow: 5.0]]; NSDebugMLLog(@"NSSocketPortNameServer", @"retrying local connection to gdomap"); state = GSPC_RETRY; [self open: nil]; } else { [self fail]; } } else { [[NSNotificationCenter defaultCenter] removeObserver: self name: GSFileHandleConnectCompletionNotification object: handle]; /* * Now we have established a connection, we can write the request * to the name server. */ state = GSPC_WRITE; [handle writeInBackgroundAndNotify: data forModes: modes]; DESTROY(data); } } - (void) didRead: (NSNotification*)notification { NSDictionary *userInfo = [notification userInfo]; NSData *d; d = [userInfo objectForKey: NSFileHandleNotificationDataItem]; if (d == nil || [d length] == 0) { [self fail]; NSLog(@"NSSocketPortNameServer lost connection to gdomap on %@:%@", [[notification object] socketAddress], [[notification object] socketService]); } else { if (data == nil) { data = [d mutableCopy]; } else { [data appendData: d]; } if ([data length] < expecting) { /* * Not enough data read yet - go read some more. */ [handle readInBackgroundAndNotifyForModes: modes]; } else if (state == GSPC_READ1 && msg.rtype == GDO_SERVERS) { uint32_t numSvrs = GSSwapBigI32ToHost(*(uint32_t*)[data bytes]); if (numSvrs == 0) { [self fail]; NSLog(@"failed to get list of name servers on net"); } else { /* * Now read in the addresses of the servers. */ expecting += numSvrs * sizeof(struct in_addr); if ([data length] < expecting) { state = GSPC_READ2; [handle readInBackgroundAndNotifyForModes: modes]; } else { [[NSNotificationCenter defaultCenter] removeObserver: self name: NSFileHandleReadCompletionNotification object: handle]; state = GSPC_DONE; } } } else { [[NSNotificationCenter defaultCenter] removeObserver: self name: NSFileHandleReadCompletionNotification object: handle]; state = GSPC_DONE; } } } - (void) didWrite: (NSNotification*)notification { NSDictionary *userInfo = [notification userInfo]; NSString *e; e = [userInfo objectForKey: GSFileHandleNotificationError]; if (e != nil) { [self fail]; NSLog(@"NSSocketPortNameServer failed write to gdomap on %@:%@ - %@", [[notification object] socketAddress], [[notification object] socketService], e); } else { state = GSPC_READ1; data = [NSMutableData new]; expecting = 4; [handle readInBackgroundAndNotifyForModes: modes]; } } - (void) fail { [self close]; if (data != nil) { DESTROY(data); } msg.rtype = 0; state = GSPC_FAIL; } - (BOOL) isActive { if (handle == nil) return NO; if (state == GSPC_FAIL) return NO; if (state == GSPC_NONE) return NO; if (state == GSPC_DONE) return NO; return YES; } - (void) open: (NSString*)hostname { NSNotificationCenter *nc; NSAssert(state == GSPC_NONE || state == GSPC_RETRY, @"open in bad state"); if (state == GSPC_NONE) { state = GSPC_ROPEN; /* Assume we are connection to remote system */ if (hostname == nil || [hostname isEqual: @""]) { hostname = @"localhost"; state = GSPC_LOPEN; } else { NSHost *local = [NSHost localHost]; NSHost *host = [NSHost hostWithName: hostname]; if (host == nil) { host = [NSHost hostWithAddress: hostname]; } if ([local isEqual: host]) { state = GSPC_LOPEN; } else { NSHost *loopback = [NSHost hostWithAddress: @"127.0.0.1"]; if ([loopback isEqual: host]) { state = GSPC_LOPEN; } } } } NS_DURING { handle = [NSFileHandle fileHandleAsClientInBackgroundAtAddress: hostname service: serverPort protocol: @"tcp" forModes: modes]; } NS_HANDLER { NSLog(@"Exception looking up port for gdomap - %@", localException); if ([[localException name] isEqual: NSInvalidArgumentException]) { handle = nil; } else { [self fail]; } } NS_ENDHANDLER if (state == GSPC_FAIL) return; if (handle == nil) { if (state == GSPC_LOPEN) { NSLog(@"Failed to find gdomap port with name '%@',\nperhaps your " @"/etc/services file is not correctly set up?\n" @"Retrying with default (IANA allocated) port number 538", serverPort); NS_DURING { handle = [NSFileHandle fileHandleAsClientInBackgroundAtAddress: hostname service: @"538" protocol: @"tcp" forModes: modes]; } NS_HANDLER { NSLog(@"Exception creating handle for gdomap - %@", localException); [self fail]; } NS_ENDHANDLER if (handle) { RELEASE(serverPort); serverPort = @"538"; } } else { [self fail]; } } if (state == GSPC_FAIL) return; IF_NO_ARC(RETAIN(handle);) nc = [NSNotificationCenter defaultCenter]; [nc addObserver: self selector: @selector(didConnect:) name: GSFileHandleConnectCompletionNotification object: handle]; [nc addObserver: self selector: @selector(didRead:) name: NSFileHandleReadCompletionNotification object: handle]; [nc addObserver: self selector: @selector(didWrite:) name: GSFileHandleWriteCompletionNotification object: handle]; } - (void) setAddr: (struct in_addr)anAddr { addr = anAddr; } - (GSPortComState) state { return state; } - (void) startListNameServers { msg.rtype = GDO_SERVERS; /* Get a list of name servers. */ msg.ptype = GDO_TCP_GDO; /* Port is TCP port for GNU DO */ msg.nsize = 0; msg.port = 0; TEST_RELEASE(data); data = [NSMutableData dataWithBytes: (void*)&msg length: sizeof(msg)]; IF_NO_ARC(RETAIN(data);) [self open: nil]; } - (void) startPortLookup: (NSString*)name onHost: (NSString*)host { msg.rtype = GDO_LOOKUP; /* Find the named port. */ msg.ptype = GDO_TCP_GDO; /* Port is TCP port for GNU DO */ msg.port = 0; msg.nsize = [name cStringLength]; [name getCString: (char*)msg.name]; TEST_RELEASE(data); data = [NSMutableData dataWithBytes: (void*)&msg length: sizeof(msg)]; IF_NO_ARC(RETAIN(data);) [self open: host]; } - (void) startPortRegistration: (uint32_t)portNumber withName: (NSString*)name { msg.rtype = GDO_REGISTER; /* Register a port. */ msg.ptype = GDO_TCP_GDO; /* Port is TCP port for GNU DO */ msg.nsize = [name cStringLength]; [name getCString: (char*)msg.name]; msg.port = GSSwapHostI32ToBig(portNumber); TEST_RELEASE(data); data = [NSMutableData dataWithBytes: (void*)&msg length: sizeof(msg)]; IF_NO_ARC(RETAIN(data);) [self open: nil]; } - (void) startPortUnregistration: (uint32_t)portNumber withName: (NSString*)name { msg.rtype = GDO_UNREG; msg.ptype = GDO_TCP_GDO; if (name == nil) { msg.nsize = 0; } else { msg.nsize = [name cStringLength]; [name getCString: (char*)msg.name]; } msg.port = GSSwapHostI32ToBig(portNumber); TEST_RELEASE(data); data = [NSMutableData dataWithBytes: (void*)&msg length: sizeof(msg)]; IF_NO_ARC(RETAIN(data);) [self open: nil]; } @end /** * This is the nameserver handling ports used for distributed objects * communications (see [NSConnection]) between hosts.
* Use the [NSSocketPortNameServer+sharedInstance] method to get a * nameserver, rather than allocating and initialising one. */ @implementation NSSocketPortNameServer + (id) allocWithZone: (NSZone*)aZone { [NSException raise: NSGenericException format: @"attempt to create extra port name server"]; return nil; } + (void) initialize { if (self == [NSSocketPortNameServer class]) { serverLock = [NSRecursiveLock new]; [[NSObject leakAt: &serverLock] release]; modes = [[NSArray alloc] initWithObjects: &mode count: 1]; [[NSObject leakAt: &modes] release]; #ifdef GDOMAP_PORT_OVERRIDE serverPort = RETAIN([NSString stringWithUTF8String: make_gdomap_port(GDOMAP_PORT_OVERRIDE)]); [[NSObject leakAt: &serverPort] release]; #endif portClass = [NSSocketPort class]; } } /** * Returns the shared name server object for [NSSocketPort] objects. */ + (id) sharedInstance { if (defaultServer == nil) { NSSocketPortNameServer *s; [serverLock lock]; if (defaultServer) { [serverLock unlock]; return defaultServer; } s = (NSSocketPortNameServer*)NSAllocateObject(self, 0, NSDefaultMallocZone()); /* Use NSNonOwnedPointerMapKeyCallBacks for the ports used as keys * since we want as pointer test for equality as we may be doing * lookup while dealocating the port (in which case the -isEqual: * method could fail). */ s->_portMap = NSCreateMapTable(NSNonOwnedPointerMapKeyCallBacks, NSObjectMapValueCallBacks, 0); s->_nameMap = NSCreateMapTable(NSObjectMapKeyCallBacks, NSNonOwnedPointerMapValueCallBacks, 0); defaultServer = s; [serverLock unlock]; } return defaultServer; } - (void) dealloc { [NSException raise: NSGenericException format: @"attempt to deallocate default port name server"]; GSNOSUPERDEALLOC; } - (BOOL) _lookupName: (NSString*)name onHost: (NSString*)host intoAddress: (NSString**)addr andPort: (unsigned*)port { GSPortCom *com = nil; NSRunLoop *loop = [NSRunLoop currentRunLoop]; struct in_addr singleServer; struct in_addr *svrs = &singleServer; unsigned numSvrs = 1; unsigned count; unsigned len; NSMutableArray *array; NSDate *limit; *port = 0; if (name == nil) { [NSException raise: NSInvalidArgumentException format: @"attempt to lookup port with nil name"]; } len = [name cStringLength]; if (len == 0) { [NSException raise: NSInvalidArgumentException format: @"attempt to lookup port with no name"]; } if (len > GDO_NAME_MAX_LEN) { [NSException raise: NSInvalidArgumentException format: @"name of port is too long (max %d) bytes", GDO_NAME_MAX_LEN]; } limit = [NSDate dateWithTimeIntervalSinceNow: timeout]; /* * get one or more host addresses in network byte order. */ if (host == nil || [host isEqual: @""]) { /* * Query a single nameserver - on the local host. */ #ifndef HAVE_INET_ATON svrs->s_addr = inet_addr("127.0.0.1"); #else inet_aton("127.0.0.1", (struct in_addr *)&svrs->s_addr); #endif } else if ([host isEqual: @"*"]) { GSPortCom *com = [GSPortCom new]; [serverLock lock]; NS_DURING { NSData *dat; [com startListNameServers]; while ([limit timeIntervalSinceNow] > 0 && [com isActive] == YES) { [loop runMode: mode beforeDate: limit]; } [com close]; if ([com state] != GSPC_DONE) { [NSException raise: NSPortTimeoutException format: @"timed out listing name servers"]; } /* * Retain and autorelease the data item so the buffer won't disappear * when the 'com' object is destroyed. */ dat = AUTORELEASE(RETAIN([com data])); svrs = (struct in_addr*)([dat bytes] + 4); numSvrs = GSSwapBigI32ToHost(*(uint32_t*)[dat bytes]); if (numSvrs == 0) { [NSException raise: NSInternalInconsistencyException format: @"failed to get list of name servers"]; } RELEASE(com); } NS_HANDLER { /* * If we had a problem - unlock before continuing. */ RELEASE(com); [serverLock unlock]; NSDebugMLLog(@"NSSocketPortNameServer", @"%@", localException); return NO; } NS_ENDHANDLER [serverLock unlock]; } else { NSHost *h; /* * Query a single nameserver - on the specified host. */ numSvrs = 1; h = [NSHost hostWithName: host]; if (h) host = [h address]; #ifndef HAVE_INET_ATON svrs->s_addr = inet_addr([host cString]); #else inet_aton([host cString], (struct in_addr *)&svrs->s_addr); #endif } /* * Ok, 'svrs'now points to one or more internet addresses in network * byte order, and numSvrs tells us how many there are. */ array = [NSMutableArray arrayWithCapacity: maxHandles]; [serverLock lock]; NS_DURING { unsigned i; *port = 0; count = 0; do { /* * Make sure that all the array slots are full if possible */ while (count < numSvrs && [array count] < maxHandles) { NSString *addr; com = [GSPortCom new]; [array addObject: com]; RELEASE(com); [com setAddr: svrs[count]]; addr = [NSString stringWithUTF8String: (char*)inet_ntoa(svrs[count])]; [com startPortLookup: name onHost: addr]; count++; } /* * Handle I/O on the file handles. */ i = [array count]; if (i == 0) { break; /* No servers left to try! */ } [loop runMode: mode beforeDate: limit]; /* * Check for completed operations. */ while (*port == 0 && i-- > 0) { com = [array objectAtIndex: i]; if ([com isActive] == NO) { [com close]; if ([com state] == GSPC_DONE) { *port = GSSwapBigI32ToHost(*(uint32_t*)[[com data] bytes]); if (*port != 0) { singleServer = [com addr]; } } [array removeObjectAtIndex: i]; } } } while (*port == 0 && [limit timeIntervalSinceNow] > 0); /* * Make sure that any outstanding lookups are cancelled. */ i = [array count]; while (i-- > 0) { [[array objectAtIndex: i] fail]; [array removeObjectAtIndex: i]; } } NS_HANDLER { /* * If we had a problem - unlock before continuing. */ [serverLock unlock]; NSDebugMLLog(@"NSSocketPortNameServer", @"%@", localException); return NO; } NS_ENDHANDLER [serverLock unlock]; if (*port) { *addr = [NSString stringWithUTF8String: inet_ntoa(singleServer)]; return YES; } else { return NO; } } /** * Concrete implementation of [NSPortNameServer-portForName:onHost:]
* Looks up and returns a port with the specified name and host.
* If host is nil or an empty string, this performs a lookup for a * port on the current host.
* If host is an asterisk ('*') then the lookup returns the first * port found with the specified name on any machine on the local * network.
* Returns nil if no matching port could be found. */ - (NSPort*) portForName: (NSString*)name onHost: (NSString*)host { NSString *addr; unsigned portNum = 0; if ([self _lookupName: name onHost: host intoAddress: &addr andPort: &portNum] == YES) { if (portClass == [NSSocketPort class]) { NSHost *host; host = [NSHost hostWithAddress: addr]; return (NSPort*)[NSSocketPort portWithNumber: portNum onHost: host forceAddress: addr listener: NO]; } else { NSLog(@"Unknown port class (%@) set for new port!", portClass); return nil; } } else { return nil; } } /** * Concrete implementation of [NSPortNameServer-registerPort:forName:]
* Registers the port with the specified name such that it is available * on all the IP addresses of the host on which the process is running.
* Returns YES on success, NO on failure (eg the name is already in use * or there is a problem registering for some reason). */ - (BOOL) registerPort: (NSPort*)port forName: (NSString*)name { NSRunLoop *loop = [NSRunLoop currentRunLoop]; GSPortCom *com = nil; unsigned len; NSDate *limit; if (name == nil) { [NSException raise: NSInvalidArgumentException format: @"attempt to register port with nil name"]; } if (port == nil) { [NSException raise: NSInvalidArgumentException format: @"attempt to register nil port"]; } if ([port isKindOfClass: portClass] == NO) { [NSException raise: NSInvalidArgumentException format: @"attempt to register port of unexpected class (%@)", port]; } len = [name cStringLength]; if (len == 0) { [NSException raise: NSInvalidArgumentException format: @"attempt to register port with no name"]; } if (len > GDO_NAME_MAX_LEN) { [NSException raise: NSInvalidArgumentException format: @"name of port is too long (max %d) bytes", GDO_NAME_MAX_LEN]; } limit = [NSDate dateWithTimeIntervalSinceNow: timeout]; /* * Lock out other threads while doing I/O to gdomap */ [serverLock lock]; NS_DURING { NSMutableSet *known = NSMapGet(_portMap, port); /* * If there is no set of names for this port - create one. */ if (known == nil) { known = [NSMutableSet new]; NSMapInsert(_portMap, port, known); RELEASE(known); } /* * If this port has never been registered under any name, first * send an unregister message to gdomap to ensure that any old * names for the port (perhaps from a server that crashed without * unregistering its ports) are no longer around. */ if ([known count] == 0) { com = [GSPortCom new]; [com startPortUnregistration: [(NSSocketPort*)port portNumber] withName: nil]; while ([limit timeIntervalSinceNow] > 0 && [com isActive] == YES) { [loop runMode: mode beforeDate: limit]; } [com close]; if ([com state] != GSPC_DONE) { [NSException raise: NSPortTimeoutException format: @"timed out unregistering port"]; } DESTROY(com); } com = [GSPortCom new]; [com startPortRegistration: [(NSSocketPort*)port portNumber] withName: name]; while ([limit timeIntervalSinceNow] > 0 && [com isActive] == YES) { [loop runMode: mode beforeDate: limit]; } [com close]; if ([com state] != GSPC_DONE) { [NSException raise: NSPortTimeoutException format: @"timed out registering port %@", name]; } else { unsigned result; result = GSSwapBigI32ToHost(*(uint32_t*)[[com data] bytes]); if (result == 0) { unsigned int portNum; NSString *addr; BOOL found; NS_DURING { found = [self _lookupName: name onHost: @"" intoAddress: &addr andPort: &portNum]; } NS_HANDLER { found = NO; } NS_ENDHANDLER if (found == YES) { [NSException raise: NSGenericException format: @"Unable to register name '%@' for the port -\n%@\n" @"It appears that a process is already registered with this name at port\n" @"'%d' IP address %@\n" @"Perhaps this program ran before and was shut down without unregistering,\n" @"so another process may be running using the same network port. If this is\n" @"the case, you can use -\n" @"gdomap -U '%@'\n" @"to remove the registration so that you can attempt this operation again.", name, port, portNum, addr, name]; } else { [NSException raise: NSGenericException format: @"Unable to register name '%@' for the port -\n%@\n" @"Typically, this might mean that a process is already running with the name\n" @"'%@' ...\n" @"Try the command -\n" @" gdomap -M localhost -L '%@'\n" @"to find its network details.\n" @"Alternatively, it may have been shut down without unregistering, and\n" @"another process may be running using the same network port. If this is\n" @"the case, you can use -\n" @"gdomap -U '%@'\n" @"to remove the registration so that you can attempt this operation again.", name, port, name, name, name]; } } else { /* * Add this name to the set of names that the port * is known by and to the name map. */ [known addObject: name]; NSMapInsert(_nameMap, name, port); } } DESTROY(com); } NS_HANDLER { /* * If we had a problem - close and unlock before continuing. */ DESTROY(com); [serverLock unlock]; NSDebugMLLog(@"NSSocketPortNameServer", @"%@", localException); return NO; } NS_ENDHANDLER [serverLock unlock]; return YES; } /** * Concrete implementation of [NSPortNameServer-removePortForName:]
* Unregisters the specified name from any associated port on the * local host.
* Returns YES on success, NO on failure. */ - (BOOL) removePortForName: (NSString*)name { NSRunLoop *loop = [NSRunLoop currentRunLoop]; GSPortCom *com = nil; unsigned len; NSDate *limit = [NSDate dateWithTimeIntervalSinceNow: timeout]; BOOL val = NO; if (name == nil) { [NSException raise: NSInvalidArgumentException format: @"attempt to remove port with nil name"]; } len = [name cStringLength]; if (len == 0) { [NSException raise: NSInvalidArgumentException format: @"attempt to remove port with no name"]; } if (len > GDO_NAME_MAX_LEN) { [NSException raise: NSInvalidArgumentException format: @"name of port is too long (max %d) bytes", GDO_NAME_MAX_LEN]; } /* * Lock out other threads while doing I/O to gdomap */ [serverLock lock]; NS_DURING { com = [GSPortCom new]; [com startPortUnregistration: 0 withName: name]; while ([limit timeIntervalSinceNow] > 0 && [com isActive] == YES) { [loop runMode: mode beforeDate: limit]; } [com close]; if ([com state] != GSPC_DONE) { [NSException raise: NSPortTimeoutException format: @"timed out unregistering port"]; } else { NSPort *port; unsigned result; result = GSSwapBigI32ToHost(*(uint32_t*)[[com data] bytes]); if (result == 0) { NSLog(@"NSSocketPortNameServer unable to unregister '%@'", name); val = NO; } else { val = YES; } /* * Find the port that was registered for this name and * remove the mapping table entries. */ port = NSMapGet(_nameMap, name); if (port) { NSMutableSet *known; NSMapRemove(_nameMap, name); known = NSMapGet(_portMap, port); if (known) { [known removeObject: name]; if ([known count] == 0) { NSMapRemove(_portMap, port); } } } } RELEASE(com); } NS_HANDLER { /* * If we had a problem - unlock before continuing. */ RELEASE(com); NSDebugMLLog(@"NSSocketPortNameServer", @"%@", localException); val = NO; } NS_ENDHANDLER [serverLock unlock]; return val; } @end @implementation NSSocketPortNameServer (GNUstep) + (Class) setPortClass: (Class)c { Class old = portClass; portClass = c; return old; } /** * Return the names under which the port is currently registered by * this process. */ - (NSArray*) namesForPort: (NSPort*)port { NSArray *names; if (port == nil) { [NSException raise: NSInvalidArgumentException format: @"attempt to get names for nil port"]; } /* * Lock out other threads while grabbing port names. */ [serverLock lock]; names = [(NSSet*)NSMapGet(_portMap, port) allObjects]; [serverLock unlock]; return names; } /** * Remove all names for a particular port - used when a port is * invalidated. */ - (BOOL) removePort: (NSPort*)port { BOOL ok = YES; [serverLock lock]; NS_DURING { NSMutableSet *known = (NSMutableSet*)NSMapGet(_portMap, port); NSString *name; IF_NO_ARC(RETAIN(known);) while ((name = [known anyObject]) != nil) { if ([self removePortForName: name] == NO) { ok = NO; } } RELEASE(known); } NS_HANDLER { [serverLock unlock]; NSDebugMLLog(@"NSSocketPortNameServer", @"%@", localException); return NO; } NS_ENDHANDLER [serverLock unlock]; return ok; } /** * Remove name for port iff it is registered by this process. */ - (BOOL) removePort: (NSPort*)port forName: (NSString*)name { BOOL ok = YES; [serverLock lock]; NS_DURING { NSMutableSet *known = (NSMutableSet*)NSMapGet(_portMap, port); if ([known member: name] != nil) { if ([self removePortForName: name] == NO) { ok = NO; } } } NS_HANDLER { [serverLock unlock]; [localException raise]; } NS_ENDHANDLER [serverLock unlock]; return ok; } @end gnustep-base-1.29.0/Source/NSSortDescriptor.m000066400000000000000000000336241435650067400210670ustar00rootroot00000000000000/* Implementation for NSSortDescriptor for GNUStep Copyright (C) 2005-2011 Free Software Foundation, Inc. Written by: Saso Kiselkov Date: 2005 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #define EXPOSE_NSSortDescriptor_IVARS 1 #import "Foundation/NSSortDescriptor.h" #import "Foundation/NSCoder.h" #import "Foundation/NSException.h" #import "Foundation/NSKeyValueCoding.h" #import "Foundation/NSNotification.h" #import "Foundation/NSUserDefaults.h" #import "GNUstepBase/GSObjCRuntime.h" #import "GSPrivate.h" #import "GSSorting.h" static BOOL initialized = NO; #ifdef __clang__ #pragma clang diagnostic ignored "-Wreceiver-forward-class" #endif @interface GSTimSortPlaceHolder : NSObject + (void) setUnstable; @end @interface GSQuickSortPlaceHolder : NSObject + (void) setUnstable; @end @interface GSShellSortPlaceHolder : NSObject + (void) setUnstable; @end @implementation NSSortDescriptor + (void) defaultsChanged: (NSNotification*)n { NSUserDefaults *defs = (NSUserDefaults*)[n object]; NSString *algorithm; algorithm = [defs stringForKey: @"GSSortAlgorithm"]; if ([algorithm isEqual: @"QuickSort"]) { [GSQuickSortPlaceHolder setUnstable]; } else if ([algorithm isEqual: @"ShellSort"]) { [GSShellSortPlaceHolder setUnstable]; } else if ([algorithm isEqual: @"TimSort"]) { [GSTimSortPlaceHolder setUnstable]; } else { [GSTimSortPlaceHolder setUnstable]; if (nil != algorithm) { NSLog(@"GSSortAlgorithm default unknown value (%@)", algorithm); } } } + (void) initialize { if (NO == initialized) { NSNotificationCenter *nc; NSUserDefaults *defs; [GSTimSortPlaceHolder class]; // default stable sort nc = [NSNotificationCenter defaultCenter]; defs = [NSUserDefaults standardUserDefaults]; [nc addObserver: self selector: @selector(defaultsChanged:) name: NSUserDefaultsDidChangeNotification object: defs]; [self defaultsChanged: nil]; // set unstable sort initialized = YES; } } - (BOOL) ascending { return _ascending; } - (NSComparisonResult) compareObject: (id) object1 toObject: (id) object2 { NSComparisonResult result; id comparedKey1 = [object1 valueForKeyPath: _key]; id comparedKey2 = [object2 valueForKeyPath: _key]; if (_comparator == NULL) { result = (NSComparisonResult) [comparedKey1 performSelector: _selector withObject: comparedKey2]; } else { result = CALL_NON_NULL_BLOCK(((NSComparator)_comparator), comparedKey1, comparedKey2); } if (_ascending == NO) { if (result == NSOrderedAscending) { result = NSOrderedDescending; } else if (result == NSOrderedDescending) { result = NSOrderedAscending; } } return result; } - (id) copyWithZone: (NSZone*)zone { NSSortDescriptor *copy = nil; if (NSShouldRetainWithZone(self, zone)) { return RETAIN(self); } if (_comparator == NULL) { copy = [[NSSortDescriptor allocWithZone: zone] initWithKey: _key ascending: _ascending selector: _selector]; } else { copy = [[NSSortDescriptor allocWithZone: zone] initWithKey: _key ascending: _ascending comparator: _comparator]; } return copy; } - (void) dealloc { TEST_RELEASE(_key); TEST_RELEASE(_comparator); [super dealloc]; } - (NSUInteger) hash { const char *sel = sel_getName(_selector); return _ascending + GSPrivateHash(0, sel, strlen(sel)) + [_key hash]; } + (id) sortDescriptorWithKey: (NSString *)aKey ascending: (BOOL)ascending { return AUTORELEASE([[self alloc] initWithKey: aKey ascending: ascending]); } + (id) sortDescriptorWithKey: (NSString *)aKey ascending: (BOOL)ascending selector: (SEL)aSelector { return AUTORELEASE([[self alloc] initWithKey: aKey ascending: ascending selector: aSelector]); } + (id)sortDescriptorWithKey: (NSString *)key ascending: (BOOL)ascending comparator: (NSComparator)cmptr { return AUTORELEASE([[self alloc] initWithKey: key ascending: ascending comparator: cmptr]); } - (id) initWithKey: (NSString *) key ascending: (BOOL) ascending { return [self initWithKey: key ascending: ascending selector: NULL]; } - (id) initWithKey: (NSString *) key ascending: (BOOL) ascending comparator: (NSComparator) cmptr { if ([self init]) { if (key == nil) { [NSException raise: NSInvalidArgumentException format: @"%@", _(@"Passed nil key when initializing " @"an NSSortDescriptor.")]; } if (cmptr == NULL) { [NSException raise: NSInvalidArgumentException format: @"%@", _(@"Passed NULL comparator when initializing " @"an NSSortDescriptor.")]; } ASSIGN(_key, key); _ascending = ascending; ASSIGN(_comparator, (id)cmptr); return self; } else { return nil; } } - (id) initWithKey: (NSString *) key ascending: (BOOL) ascending selector: (SEL) selector { if ([self init]) { if (key == nil) { [NSException raise: NSInvalidArgumentException format: @"%@", _(@"Passed nil key when initializing " @"an NSSortDescriptor.")]; } if (selector == NULL) { selector = @selector(compare:); } ASSIGN(_key, key); _ascending = ascending; _selector = selector; return self; } else { return nil; } } - (BOOL) isEqual: (id)other { if (other == self) { return YES; } if ([other isKindOfClass: [NSSortDescriptor class]] == NO) { return NO; } if (((NSSortDescriptor*)other)->_ascending != _ascending) { return NO; } if (!sel_isEqual(((NSSortDescriptor*)other)->_selector, _selector)) { return NO; } return [((NSSortDescriptor*)other)->_key isEqualToString: _key]; } - (NSString *) key { return _key; } - (id) reversedSortDescriptor { return AUTORELEASE([[NSSortDescriptor alloc] initWithKey: _key ascending: !_ascending selector: _selector]); } - (SEL) selector { return _selector; } - (void) encodeWithCoder: (NSCoder *) coder { if ([coder allowsKeyedCoding]) { [coder encodeObject: _key forKey: @"NSKey"]; [coder encodeBool: _ascending forKey: @"NSAscending"]; [coder encodeObject: NSStringFromSelector(_selector) forKey: @"NSSelector"]; } else { [coder encodeObject: _key]; [coder encodeValueOfObjCType: @encode(BOOL) at: &_ascending]; [coder encodeValueOfObjCType: @encode(SEL) at: &_selector]; } } - (id) initWithCoder: (NSCoder *)decoder { if ((self = [super init]) != nil) { if ([decoder allowsKeyedCoding]) { ASSIGN(_key, [decoder decodeObjectForKey: @"NSKey"]); _ascending = [decoder decodeBoolForKey: @"NSAscending"]; _selector = NSSelectorFromString([decoder decodeObjectForKey: @"NSSelector"]); } else { ASSIGN(_key, [decoder decodeObject]); [decoder decodeValueOfObjCType: @encode(BOOL) at: &_ascending]; [decoder decodeValueOfObjCType: @encode(SEL) at: &_selector]; } } return self; } @end /* Symbols for the sorting functions, the actual algorithms fill these. */ void (*_GSSortUnstable)(id* buffer, NSRange range, id comparisonEntity, GSComparisonType cmprType, void *context) = NULL; void (*_GSSortStable)(id* buffer, NSRange range, id comparisonEntity, GSComparisonType cmprType, void *context) = NULL; void (*_GSSortUnstableConcurrent)(id* buffer, NSRange range, id comparisonEntity, GSComparisonType cmprType, void *context) = NULL; void (*_GSSortStableConcurrent)(id* buffer, NSRange range, id comparisonEntity, GSComparisonType cmprType, void *context) = NULL; // Sorting functions that select the adequate algorithms void GSSortUnstable(id* buffer, NSRange range, id descriptorOrComparator, GSComparisonType type, void* context) { if (NO == initialized) [NSSortDescriptor class]; if (NULL != _GSSortUnstable) { _GSSortUnstable(buffer, range, descriptorOrComparator, type, context); } else if (NULL != _GSSortStable) { _GSSortStable(buffer, range, descriptorOrComparator, type, context); } else { [NSException raise: @"NSInternalInconsistencyException" format: @"The GNUstep-base library was compiled without sorting support."]; } } void GSSortStable(id* buffer, NSRange range, id descriptorOrComparator, GSComparisonType type, void* context) { if (NO == initialized) [NSSortDescriptor class]; if (NULL != _GSSortStable) { _GSSortStable(buffer, range, descriptorOrComparator, type, context); } else { [NSException raise: @"NSInternalInconsistencyException" format: @"The GNUstep-base library was compiled without a" @" stable sorting algorithm."]; } } void GSSortStableConcurrent(id* buffer, NSRange range, id descriptorOrComparator, GSComparisonType type, void* context) { if (NO == initialized) [NSSortDescriptor class]; if (NULL != _GSSortStableConcurrent) { _GSSortStableConcurrent(buffer, range, descriptorOrComparator, type, context); } else { GSSortStable(buffer, range, descriptorOrComparator, type, context); } } void GSSortUnstableConcurrent(id* buffer, NSRange range, id descriptorOrComparator, GSComparisonType type, void* context) { if (NO == initialized) [NSSortDescriptor class]; if (NULL != _GSSortUnstableConcurrent) { _GSSortUnstableConcurrent(buffer, range, descriptorOrComparator, type, context); } else if (NULL != _GSSortStableConcurrent) { _GSSortStableConcurrent(buffer, range, descriptorOrComparator, type, context); } else { GSSortUnstable(buffer, range, descriptorOrComparator, type, context); } } @implementation NSArray (NSSortDescriptorSorting) - (NSArray *) sortedArrayUsingDescriptors: (NSArray *)sortDescriptors { NSMutableArray *sortedArray = [GSMutableArray arrayWithArray: self]; [sortedArray sortUsingDescriptors: sortDescriptors]; return GS_IMMUTABLE(sortedArray); } @end /* Sort the objects in range using the first descriptor and, if there * are more descriptors, recursively call the function to sort each range * of adhacent equal objects using the remaining descriptors. */ static void SortRange(id *objects, NSRange range, id *descriptors, NSUInteger numDescriptors) { NSSortDescriptor *sd = (NSSortDescriptor*)descriptors[0]; GSSortUnstable(objects, range, sd, GSComparisonTypeSortDescriptor, NULL); if (numDescriptors > 1) { NSUInteger start = range.location; NSUInteger finish = NSMaxRange(range); while (start < finish) { NSUInteger pos = start + 1; /* Find next range of adjacent objects. */ while (pos < finish && [sd compareObject: objects[start] toObject: objects[pos]] == NSOrderedSame) { pos++; } /* Sort the range using remaining descriptors. */ if (pos - start > 1) { SortRange(objects, NSMakeRange(start, pos - start), descriptors + 1, numDescriptors - 1); } start = pos; } } } @implementation NSMutableArray (NSSortDescriptorSorting) - (void) sortUsingDescriptors: (NSArray *)sortDescriptors { NSUInteger count = [self count]; NSUInteger numDescriptors = [sortDescriptors count]; if (count > 1 && numDescriptors > 0) { id descriptors[numDescriptors]; NSArray *a; GS_BEGINIDBUF(objects, count); [self getObjects: objects]; if ([sortDescriptors isProxy]) { NSUInteger i; for (i = 0; i < numDescriptors; i++) { descriptors[i] = [sortDescriptors objectAtIndex: i]; } } else { [sortDescriptors getObjects: descriptors]; } SortRange(objects, NSMakeRange(0, count), descriptors, numDescriptors); a = [[NSArray alloc] initWithObjects: objects count: count]; [self setArray: a]; RELEASE(a); GS_ENDIDBUF(); } } @end @implementation GSMutableArray (NSSortDescriptorSorting) - (void) sortUsingDescriptors: (NSArray *)sortDescriptors { NSUInteger dCount = [sortDescriptors count]; if (_count > 1 && dCount > 0) { GS_BEGINIDBUF(descriptors, dCount); if ([sortDescriptors isProxy]) { NSUInteger i; for (i = 0; i < dCount; i++) { descriptors[i] = [sortDescriptors objectAtIndex: i]; } } else { [sortDescriptors getObjects: descriptors]; } SortRange(_contents_array, NSMakeRange(0, _count), descriptors, dCount); GS_ENDIDBUF(); } } @end @implementation NSSet (NSSortDescriptorSorting) - (NSArray *) sortedArrayUsingDescriptors: (NSArray *)sortDescriptors { return [[self allObjects] sortedArrayUsingDescriptors: sortDescriptors]; } @end gnustep-base-1.29.0/Source/NSSpellServer.m000066400000000000000000000302751435650067400203460ustar00rootroot00000000000000/** NSSpellServer Class to allow a spell checker to be available to other apps. Copyright (C) 2001, 1996 Free Software Foundation, Inc. Author by: Gregory John Casamento Date: 2001 Author: Scott Christley Date: 1996 This file is part of the GNUstep Base Library. 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 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; see the file COPYING.LIB. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #import "common.h" #define EXPOSE_NSSpellServer_IVARS 1 #import "Foundation/NSSpellServer.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSRunLoop.h" #import "Foundation/NSFileManager.h" #import "Foundation/NSUserDefaults.h" #import "Foundation/NSPathUtilities.h" #import "Foundation/NSConnection.h" #import "Foundation/NSProcessInfo.h" #import "Foundation/NSException.h" #import "Foundation/NSSet.h" static NSConnection *spellServerConnection = nil; /* User dictionary location */ static NSString *GNU_UserDictionariesDir = @"Dictionaries"; // Function to create name for spell server.... GS_DECLARE NSString* GSSpellServerName(NSString *vendor, NSString *language) { NSString *serverName = nil; if (language == nil || vendor == nil) { return nil; } serverName = [[vendor stringByAppendingString: language] stringByAppendingString: @"SpellChecker"]; return serverName; } @implementation NSSpellServer // Class methods + (void) initialize { if (self == [NSSpellServer class]) { // Initial version [self setVersion: 1]; } } // Non-private Instance methods - (id) init { NSArray *userPreference; NSString *currentLanguage; userPreference = [[NSUserDefaults standardUserDefaults] stringArrayForKey: @"NSLanguages"]; currentLanguage = [userPreference objectAtIndex: 0]; if ((self = [super init]) != nil) { _delegate = nil; _ignoredWords = nil; ASSIGN(_userDictionaries, [NSMutableDictionary dictionary]); ASSIGN(_currentLanguage, currentLanguage); } return self; } // Cleanup when deallocated - (void) dealloc { RELEASE(_userDictionaries); RELEASE(_currentLanguage); [super dealloc]; } // Checking in Your Service /** * This method vends the spell server to the Distributed Objects system * so that it can be connected to by clients. */ - (BOOL) registerLanguage: (NSString *)language byVendor: (NSString *)vendor { NSString *serverName = GSSpellServerName(vendor, language); BOOL result = NO; if (serverName == nil) { return NO; } spellServerConnection = [[NSConnection alloc] init]; if (spellServerConnection) { [spellServerConnection setRootObject: self]; result = [spellServerConnection registerName: serverName]; } return result; } // Assigning a Delegate /** * Return the spell server delegate. */ - (id) delegate { return _delegate; } /** * This method is used to set the delegate of the spellserver. * When a spelling service is run the spell server is vended out * to DO. The spelling service must instantiate an instance of * this class and set itself to be the delegate. This allows * the service to respond to messages sent by the client. */ - (void) setDelegate: (id)anObject { /* FIXME - we should not retain the delegate ! */ IF_NO_ARC(RETAIN(anObject);) ASSIGN(_delegate, anObject); } // Running the Service /** * Initiate the run loop of this service. Once the spell server * object is vended, this method is called so that the server can * start responding to the messages sent by the client. These * messages are passed on to the NSSpellServer instance's delegate. */ - (void) run { // Start the runloop explicitly. [[NSRunLoop currentRunLoop] run]; } // Private method // Determine the path to the dictionary /** * Path to the dictionary for the specified language. */ - (NSString *) _pathToDictionary: (NSString *)currentLanguage { NSString *path = nil; NSString *user_gsroot = nil; user_gsroot = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject]; if (currentLanguage != nil) { NSString *dirPath = nil; NSFileManager *mgr = [NSFileManager defaultManager]; // Build the path and try to get the dictionary dirPath = [user_gsroot stringByAppendingPathComponent: GNU_UserDictionariesDir]; path = [dirPath stringByAppendingPathComponent: currentLanguage]; if (![mgr fileExistsAtPath: path ]) { if ([mgr fileExistsAtPath: dirPath]) { // The directory exists create the file. NSArray *emptyDict = [NSArray array]; if (![emptyDict writeToFile: path atomically: YES]) { NSLog(@"Failed to create %@",path); path = nil; } } else { // The directory does not exist create it. if ([mgr createDirectoryAtPath: dirPath withIntermediateDirectories: YES attributes: nil error: NULL]) { // Directory created. Now create the empty file. NSArray *emptyDict = [NSArray array]; if (![emptyDict writeToFile: path atomically: YES]) { NSLog(@"Failed to create %@",path); path = nil; } } else { NSLog(@"Failed to create %@",dirPath); path = nil; } } } } return path; } // Private method /** Open up dictionary stored in the user's directory. */ - (NSMutableSet *) _openUserDictionary: (NSString *)language { NSString *path = nil; NSMutableSet *words = nil; if ((words = [_userDictionaries objectForKey: language]) == nil) { if ((path = [self _pathToDictionary: language]) != nil) { NSArray *wordarray = [NSArray arrayWithContentsOfFile: path]; if (wordarray == nil) { NSLog(@"Unable to load user dictionary from path %@",path); } else { words = [NSMutableSet setWithArray: wordarray]; [_userDictionaries setObject: words forKey: language]; } } else { NSLog(@"Unable to find user dictionary at: %@", path); } } // successful in opening the desired dictionary.. return words; } // Checking User Dictionaries /** Check if word is in dict, flag determines if the search is case sensitive. */ - (BOOL) _isWord: (NSString *)word inDictionary: (NSSet *)dict caseSensitive: (BOOL)flag { BOOL result = NO; NSString *dictWord = nil; NSEnumerator *setEnumerator = nil; // Catch the odd cases before they start trouble later on... if (word == nil || dict == nil) { return NO; // avoid checking, if NIL. } if ([word length] == 0 || [dict count] == 0) { return NO; // avoid checking, if has no length. } // Check the dictionary for the word... setEnumerator = [dict objectEnumerator]; while ((dictWord = [setEnumerator nextObject]) && result == NO) { // If the case is important then uppercase both strings // and compare, otherwise do the comparison. if (flag == NO) { NSString *upperWord = [word uppercaseString]; NSString *upperDictWord = [dictWord uppercaseString]; result = [upperWord isEqualToString: upperDictWord]; } else { result = [word isEqualToString: dictWord]; } } return result; } // Checking User Dictionaries /** Checks to see if the word is in the user's dictionary. The user dictionary is a set of words learned by the spell service for that particular user combined with the set of ignored words in the current document. */ - (BOOL) isWordInUserDictionaries: (NSString *)word caseSensitive: (BOOL)flag { NSSet *userDict = [self _openUserDictionary: _currentLanguage]; BOOL result = NO; if (userDict) { result = [self _isWord: word inDictionary: userDict caseSensitive: flag]; } if (result == NO && _ignoredWords) { NSEnumerator *arrayEnumerator = [_ignoredWords objectEnumerator]; NSString *iword = nil; while ((iword = [arrayEnumerator nextObject]) && result == NO) { // If the case is important then uppercase both strings // and compare, otherwise do the comparison. if (flag == NO) { NSString *upperWord = [word uppercaseString]; NSString *upperIWord = [iword uppercaseString]; result = [upperWord isEqualToString: upperIWord]; } else { result = [word isEqualToString: iword]; } } } return result; } /** Save the dictionary stored in user's directory. */ - (BOOL) _saveUserDictionary: (NSString *)language { NSString *path = nil; if ((path = [self _pathToDictionary: language]) != nil) { NSMutableSet *set = [_userDictionaries objectForKey: language]; if (![[set allObjects] writeToFile: path atomically: YES]) { NSLog(@"Unable to save dictionary to path %@",path); return NO; } } else { NSLog(@"Unable to save dictionary at: %@", path); return NO; } // successful in saving the desired dictionary.. return YES; } /** Learn a new word and put it into the dictionary. */ - (BOOL) _learnWord: (NSString *)word inDictionary: (NSString *)language { NSMutableSet *set = [self _openUserDictionary: language]; [set addObject: word]; NS_DURING { [_delegate spellServer: self didLearnWord: word inLanguage: language]; } NS_HANDLER { NSLog(@"Call to delegate cause the following exception: %@", [localException reason]); } NS_ENDHANDLER return [self _saveUserDictionary: language]; } /** Forget a word and remove it from the dictionary. */ - (BOOL)_forgetWord: (NSString *)word inDictionary: (NSString *)language { NSMutableSet *set = [self _openUserDictionary: language]; [set removeObject: word]; NS_DURING { [_delegate spellServer: self didForgetWord: word inLanguage: language]; } NS_HANDLER { NSLog(@"Call to delegate caused following exception: %@", [localException reason]); } NS_ENDHANDLER return [self _saveUserDictionary: language]; } /** Find a misspelled word. */ - (NSRange) _findMisspelledWordInString: (NSString *)stringToCheck language: (NSString *)language ignoredWords: (NSArray *)ignoredWords wordCount: (int32_t *)wordCount countOnly: (BOOL)countOnly { NSRange r = NSMakeRange(0,0); // Forward to delegate NS_DURING { ASSIGN(_ignoredWords,ignoredWords); r = [_delegate spellServer: self findMisspelledWordInString: stringToCheck language: language wordCount: wordCount countOnly: countOnly]; _ignoredWords = nil; } NS_HANDLER { NSLog(@"Call to delegate caused the following exception: %@", [localException reason]); } NS_ENDHANDLER return r; } /** Suggest a correction for the word. */ - (NSArray *) _suggestGuessesForWord: (NSString *)word inLanguage: (NSString *)language { NSArray *words = nil; // Forward to delegate NS_DURING { words = [_delegate spellServer: self suggestGuessesForWord: word inLanguage: language]; } NS_HANDLER { NSLog(@"Call to delegate caused the following exception: %@", [localException reason]); } NS_ENDHANDLER return words; } - (NSArray *) spellServer: (NSSpellServer *)sender suggestCompletionsForPartialWordRange: (NSRange)range inString: (NSString *)string language: (NSString *)language { return nil; // FIXME } - (NSRange) spellServer: (NSSpellServer *)sender checkGrammarInString: (NSString *)stringToCheck language: (NSString *)language details: (NSArray **)details { return NSMakeRange(0, 0); // FIXME } @end gnustep-base-1.29.0/Source/NSString.m000066400000000000000000005321121435650067400173430ustar00rootroot00000000000000/** Implementation of GNUSTEP string class Copyright (C) 1995-2012 Free Software Foundation, Inc. Written by: Andrew Kachites McCallum Date: January 1995 Unicode implementation by Stevo Crvenkovski Date: February 1997 Optimisations by Richard Frith-Macdonald Date: October 1998 - 2000 This file is part of the GNUstep Base Library. 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 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 USA. NSString class reference $Date$ $Revision$ */ /* Caveats: Some implementations will need to be changed. Does not support all justification directives for `%@' in format strings on non-GNU-libc systems. */ /* Locales somewhat supported. Limited choice of default encodings. */ #define GS_UNSAFE_REGEX 1 #import "common.h" #include #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSCalendarDate.h" #import "Foundation/NSDecimal.h" #import "Foundation/NSArray.h" #import "Foundation/NSCharacterSet.h" #import "Foundation/NSException.h" #import "Foundation/NSValue.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSFileManager.h" #import "Foundation/NSPortCoder.h" #import "Foundation/NSPathUtilities.h" #import "Foundation/NSRange.h" #import "Foundation/NSRegularExpression.h" #import "Foundation/NSException.h" #import "Foundation/NSData.h" #import "Foundation/NSURL.h" #import "Foundation/NSMapTable.h" #import "Foundation/NSLocale.h" #import "Foundation/NSLock.h" #import "Foundation/NSNotification.h" #import "Foundation/NSScanner.h" #import "Foundation/NSUserDefaults.h" #import "Foundation/FoundationErrors.h" // For private method _decodePropertyListForKey: #import "Foundation/NSKeyedArchiver.h" #import "GNUstepBase/GSMime.h" #import "GNUstepBase/NSString+GNUstepBase.h" #import "GNUstepBase/NSMutableString+GNUstepBase.h" #import "GSPrivate.h" #import "GSPThread.h" #include #include #if defined(HAVE_SYS_FCNTL_H) # include #elif defined(HAVE_FCNTL_H) # include #endif #include #include #ifdef HAVE_MALLOC_H # ifndef __OpenBSD__ # include # endif #endif #ifdef HAVE_ALLOCA_H #include #endif #if defined(HAVE_UNICODE_UCOL_H) # include #endif #if defined(HAVE_UNICODE_UNORM2_H) # include #endif #if defined(HAVE_UNICODE_USTRING_H) # include #endif #if defined(HAVE_UNICODE_USEARCH_H) # include #endif #if defined(HAVE_ICU_H) # include #endif /* Create local inline versions of key functions for case-insensitive operations */ #import "Additions/unicode/caseconv.h" static inline unichar uni_toupper(unichar ch) { unichar result = gs_toupper_map[ch / 256][ch % 256]; return result ? result : ch; } static inline unichar uni_tolower(unichar ch) { unichar result = gs_tolower_map[ch / 256][ch % 256]; return result ? result : ch; } #import "GNUstepBase/Unicode.h" @interface NSScanner (Double) + (BOOL) _scanDouble: (double*)value from: (NSString*)str; @end @class GSString; @class GSMutableString; @class GSPlaceholderString; @interface GSPlaceholderString : NSString // Help the compiler @end @class GSMutableArray; @class GSMutableDictionary; /* * Cache classes and method implementations for speed. */ static Class NSDataClass; static Class NSStringClass; static Class NSMutableStringClass; static Class GSStringClass; static Class GSMutableStringClass; static Class GSPlaceholderStringClass; static GSPlaceholderString *defaultPlaceholderString; static NSMapTable *placeholderMap; static gs_mutex_t placeholderLock = GS_MUTEX_INIT_STATIC; static SEL cMemberSel = 0; static NSCharacterSet *nonBase = nil; static BOOL (*nonBaseImp)(id, SEL, unichar) = 0; /* Macro to return the receiver if it is already immutable, but an * autoreleased copy otherwise. Used where we have to return an * immutable string, but we don't want to change the parameter from * a mutable string to an immutable one. */ #define IMMUTABLE(S) AUTORELEASE([(S) copyWithZone: NSDefaultMallocZone()]) static inline BOOL isWhiteSpace(unichar c) { /* We can not use whitespaceAndNewlineCharacterSet here as this would lead * to a recursion, as this also reads in a property list. * * Copied whitespace and newline index set from NSCharacterSetData.h */ static const NSRange whitespace[] = {{9,5},{32,1},{133,1},{160,1},{5760,1},{8192,12},{8232,2},{8239,1},{8287,1},{12288,1}}; unsigned upper = sizeof(whitespace)/sizeof(*whitespace); unsigned lower = 0; unsigned pos; NSRange r; /* Binary search for a range containing the character to be checked */ for (pos = upper/2; upper != lower; pos = (upper+lower)/2) { r = whitespace[pos]; if (c < r.location) { upper = pos; } else if (c >= NSMaxRange(r)) { lower = pos + 1; } else { break; } } return (c >= r.location && c < NSMaxRange(r)) ? YES : NO; } #define GS_IS_WHITESPACE(X) isWhiteSpace(X) /* A non-spacing character is one which is part of a 'user-perceived character' * where the user perceived character consists of a base character followed * by a sequence of non-spacing characters. Non-spacing characters do not * exist in isolation. * eg. an accented 'a' might be represented as the 'a' followed by the accent. */ inline BOOL uni_isnonsp(unichar u) { /* Treating upper surrogates as non-spacing is a convenient solution * to a number of issues with UTF-16 */ if ((u >= 0xdc00) && (u <= 0xdfff)) return YES; return (*nonBaseImp)(nonBase, cMemberSel, u); } /* * Include sequence handling code with instructions to generate search * and compare functions for NSString objects. */ #define GSEQ_STRCOMP strCompNsNs #define GSEQ_STRRANGE strRangeNsNs #define GSEQ_O GSEQ_NS #define GSEQ_S GSEQ_NS #include "GSeq.h" /* * The path handling mode. */ static enum { PH_DO_THE_RIGHT_THING, PH_UNIX, PH_WINDOWS } pathHandling = PH_DO_THE_RIGHT_THING; /** * This function is intended to be called at startup (before anything else * which needs to use paths, such as reading config files and user defaults) * to allow a program to control the style of path handling required.
* Almost all programs should avoid using this.
* Changing the path handling mode is not thread-safe.
* If mode is "windows" this sets path handling to be windows specific,
* If mode is "unix" it sets path handling to be unix specific,
* Any other none-null string sets do-the-right-thing mode.
* The function returns a C String describing the old mode. */ GS_DECLARE const char* GSPathHandling(const char *mode) { int old = pathHandling; if (mode != 0) { if (strcasecmp(mode, "windows") == 0) { pathHandling = PH_WINDOWS; } else if (strcasecmp(mode, "unix") == 0) { pathHandling = PH_UNIX; } else { pathHandling = PH_DO_THE_RIGHT_THING; } } switch (old) { case PH_WINDOWS: return "windows"; case PH_UNIX: return "unix"; default: return "right"; } } #define GSPathHandlingRight() \ ((pathHandling == PH_DO_THE_RIGHT_THING) ? YES : NO) #define GSPathHandlingUnix() \ ((pathHandling == PH_UNIX) ? YES : NO) #define GSPathHandlingWindows() \ ((pathHandling == PH_WINDOWS) ? YES : NO) /* * The pathSeps character set is used for parsing paths ... it *must* * contain the '/' character, which is the internal path separator, * and *may* contain additiona system specific separators. * * We can't have a 'pathSeps' variable initialized in the +initialize * method because that would cause recursion. */ static NSCharacterSet* pathSeps(void) { static NSCharacterSet *wPathSeps = nil; static NSCharacterSet *uPathSeps = nil; static NSCharacterSet *rPathSeps = nil; if (GSPathHandlingRight()) { if (rPathSeps == nil) { GS_MUTEX_LOCK(placeholderLock); if (rPathSeps == nil) { rPathSeps = [NSCharacterSet characterSetWithCharactersInString: @"/\\"]; rPathSeps = [NSObject leakAt: &rPathSeps]; } GS_MUTEX_UNLOCK(placeholderLock); } return rPathSeps; } if (GSPathHandlingUnix()) { if (uPathSeps == nil) { GS_MUTEX_LOCK(placeholderLock); if (uPathSeps == nil) { uPathSeps = [NSCharacterSet characterSetWithCharactersInString: @"/"]; uPathSeps = [NSObject leakAt: &uPathSeps]; } GS_MUTEX_UNLOCK(placeholderLock); } return uPathSeps; } if (GSPathHandlingWindows()) { if (wPathSeps == nil) { GS_MUTEX_LOCK(placeholderLock); if (wPathSeps == nil) { wPathSeps = [NSCharacterSet characterSetWithCharactersInString: @"\\"]; wPathSeps = [NSObject leakAt: &wPathSeps]; } GS_MUTEX_UNLOCK(placeholderLock); } return wPathSeps; } pathHandling = PH_DO_THE_RIGHT_THING; return pathSeps(); } inline static BOOL pathSepMember(unichar c) { if (c == (unichar)'/') { if (GSPathHandlingWindows() == NO) { return YES; } } else if (c == (unichar)'\\') { if (GSPathHandlingUnix() == NO) { return YES; } } return NO; } /* For cross-platform portability we always use slash as the separator * when building paths ... unless specific windows path handling is * required. * This ensures that standardised paths and anything built by adding path * components to them use a consistent separator character anad can be * compared readily using standard string comparisons. */ inline static unichar pathSepChar() { if (GSPathHandlingWindows() == NO) { return '/'; } return '\\'; } /* * For cross-platform portability we always use slash as the separator * when building paths ... unless specific windows path handling is * required. */ inline static NSString* pathSepString() { if (GSPathHandlingWindows() == NO) { return @"/"; } return @"\\"; } /* * Find the end of 'root' sequence in a string. Characters before this * point in the string cannot be split into path components/extensions. * This usage of the term 'root' is slightly different from the usual in * that it includes the first part of any relative path. The more normal * usage of 'root' elsewhere is to indicate the first part of an absolute * path. * Possible roots are - * * '/' absolute root on unix * '' if entire path is empty string * 'C:/' absolute root for a drive on windows * 'C:' if entire path is 'C:' or 'C:relativepath' * '//host/share/' absolute root for a host and share on windows * '~/' home directory for user * '~' if entire path is '~' * '~username/' home directory for user * '~username' if entire path is '~username' * * Most roots are terminated in '/' (or '\') unless the root is the entire * path. The exception is for windows drive-relative paths, where the root * may be a drive letter followed by a colon, but there may still be path * components after the root with no path separator. * * The presence of any non-empty root indicates an absolute path except - * 1. A windows drive-relative path is not absolute unless the root * ends with a path separator, since the path part on the drive is relative. * 2. On windows, a root consisting of a single path separator indicates * a drive-relative path with no drive ... so the path is relative. */ static unsigned rootOf(NSString *s, unsigned l) { unsigned root = 0; if (l > 0) { unichar c = [s characterAtIndex: 0]; if (c == '~') { NSRange range = NSMakeRange(1, l-1); range = [s rangeOfCharacterFromSet: pathSeps() options: NSLiteralSearch range: range]; if (range.length == 0) { root = l; // ~ or ~name } else { root = NSMaxRange(range); // ~/... or ~name/... } } else { if (pathSepMember(c)) { root++; } if (GSPathHandlingUnix() == NO) { if (root == 0 && l > 1 && ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) && [s characterAtIndex: 1] == ':') { // Got a drive relative path ... see if it's absolute. root = 2; if (l > 2 && pathSepMember([s characterAtIndex: 2])) { root++; } } else if (root == 1 && l > 4 && pathSepMember([s characterAtIndex: 1])) { NSRange range = NSMakeRange(2, l-2); range = [s rangeOfCharacterFromSet: pathSeps() options: NSLiteralSearch range: range]; if (range.length > 0 && range.location > 2) { unsigned pos = NSMaxRange(range); // Found end of UNC host perhaps ... look for share if (pos < l) { range = NSMakeRange(pos, l - pos); range = [s rangeOfCharacterFromSet: pathSeps() options: NSLiteralSearch range: range]; if (range.length > 0) { /* * Found another slash ... but if it comes * immediately after the last one this can't * be a UNC path as it's '//host//' rather * than '//host/share' */ if (range.location > pos) { /* OK ... we have the '//host/share/' * format, so this is a valid UNC path. */ root = NSMaxRange(range); } } } } } } } } return root; } @implementation NSString // NSString itself is an abstract class which provides factory // methods to generate objects of unspecified subclasses. static NSStringEncoding _DefaultStringEncoding; static BOOL _ByteEncodingOk; static const unichar byteOrderMark = 0xFEFF; static const unichar byteOrderMarkSwapped = 0xFFFE; #ifdef HAVE_REGISTER_PRINTF_FUNCTION #include #include /* , with libc-5.3.9 thinks this flag PRINTF_ATSIGN_VA_LIST should be 0, but for me, with libc-5.0.9, it crashes. -mccallum Apparently GNU libc 2.xx needs this to be 0 also, along with Linux libc versions 5.2.xx and higher (including libc6, which is just GNU libc). -chung */ #if defined(_LINUX_C_LIB_VERSION_MINOR) \ && _LINUX_C_LIB_VERSION_MAJOR <= 5 \ && _LINUX_C_LIB_VERSION_MINOR < 2 #define PRINTF_ATSIGN_VA_LIST 1 #else #define PRINTF_ATSIGN_VA_LIST 0 #endif #if ! PRINTF_ATSIGN_VA_LIST static int arginfo_func (const struct printf_info *info, size_t n, int *argtypes #if defined(HAVE_REGISTER_PRINTF_SPECIFIER) , int *size #endif ) { *argtypes = PA_POINTER; return 1; } #endif /* !PRINTF_ATSIGN_VA_LIST */ static int handle_printf_atsign (FILE *stream, const struct printf_info *info, #if PRINTF_ATSIGN_VA_LIST va_list *ap_pointer) #elif defined(_LINUX_C_LIB_VERSION_MAJOR) \ && _LINUX_C_LIB_VERSION_MAJOR < 6 const void **const args) #else /* GNU libc needs the following. */ const void *const *args) #endif { #if ! PRINTF_ATSIGN_VA_LIST const void *ptr = *args; #endif id string_object; int len; /* xxx This implementation may not pay pay attention to as much of printf_info as it should. */ #if PRINTF_ATSIGN_VA_LIST string_object = va_arg (*ap_pointer, id); #else string_object = *((id*) ptr); #endif string_object = [string_object description]; #if HAVE_WIDE_PRINTF_FUNCTION if (info->wide) { if (sizeof(wchar_t) == 4) { unsigned length = [string_object length]; wchar_t buf[length + 1]; unsigned i; for (i = 0; i < length; i++) { buf[i] = [string_object characterAtIndex: i]; } buf[i] = 0; len = fwprintf(stream, L"%*ls", (info->left ? - info->width : info->width), buf); } else { len = fwprintf(stream, L"%*ls", (info->left ? - info->width : info->width), [string_object cStringUsingEncoding: NSUnicodeStringEncoding]); } } else #endif /* HAVE_WIDE_PRINTF_FUNCTION */ { len = fprintf(stream, "%*s", (info->left ? - info->width : info->width), [string_object lossyCString]); } return len; } #endif /* HAVE_REGISTER_PRINTF_FUNCTION */ static void register_printf_atsign () { #if defined(HAVE_REGISTER_PRINTF_SPECIFIER) if (register_printf_specifier ('@', handle_printf_atsign, #if PRINTF_ATSIGN_VA_LIST 0)) #else arginfo_func)) #endif [NSException raise: NSGenericException format: @"register printf handling of %%@ failed"]; #elif defined(HAVE_REGISTER_PRINTF_FUNCTION) if (register_printf_function ('@', handle_printf_atsign, #if PRINTF_ATSIGN_VA_LIST 0)) #else arginfo_func)) #endif [NSException raise: NSGenericException format: @"register printf handling of %%@ failed"]; #endif } #if GS_USE_ICU == 1 /** * Returns an ICU collator for the given locale and options, or returns * NULL if a collator couldn't be created or the GNUstep comparison code * should be used instead. */ static UCollator * GSICUCollatorOpen(NSStringCompareOptions mask, NSLocale *locale) { UErrorCode status = U_ZERO_ERROR; const char *localeCString; UCollator *coll; if (mask & NSLiteralSearch) { return NULL; } if (NO == [locale isKindOfClass: [NSLocale class]]) { if (nil == locale) { /* See comments below about the posix locale. * It's bad for case insensitive search, but needed for numeric */ if (mask & NSNumericSearch) { locale = [NSLocale systemLocale]; } else { /* A nil locale should trigger POSIX collation (i.e. 'A'-'Z' sort * before 'a'), and support for this was added in ICU 4.6 under the * locale name en_US_POSIX, but it doesn't fit our requirements * (e.g. 'e' and 'E' don't compare as equal with case insensitive * comparison.) - so return NULL to indicate that the GNUstep * comparison code should be used. */ return NULL; } } else { locale = [NSLocale currentLocale]; } } localeCString = [[locale localeIdentifier] UTF8String]; if (localeCString != NULL && strcmp("", localeCString) == 0) { localeCString = NULL; } coll = ucol_open(localeCString, &status); if (U_SUCCESS(status)) { if (mask & (NSCaseInsensitiveSearch | NSDiacriticInsensitiveSearch)) { ucol_setStrength(coll, UCOL_PRIMARY); } else if (mask & NSCaseInsensitiveSearch) { ucol_setStrength(coll, UCOL_SECONDARY); } else if (mask & NSDiacriticInsensitiveSearch) { ucol_setStrength(coll, UCOL_PRIMARY); ucol_setAttribute(coll, UCOL_CASE_LEVEL, UCOL_ON, &status); } if (mask & NSNumericSearch) { ucol_setAttribute(coll, UCOL_NUMERIC_COLLATION, UCOL_ON, &status); } if (U_SUCCESS(status)) { return coll; } } ucol_close(coll); return NULL; } #if defined(HAVE_UNICODE_UNORM2_H) || defined(HAVE_ICU_H) - (NSString *) _normalizedICUStringOfType: (const char*)normalization mode: (UNormalization2Mode)mode { UErrorCode err; const UNormalizer2 *normalizer; int32_t length; int32_t newLength; NSString *newString; length = (uint32_t)[self length]; if (0 == length) { return @""; // Simple case ... empty string } err = 0; normalizer = unorm2_getInstance(NULL, normalization, mode, &err); if (U_FAILURE(err)) { [NSException raise: NSCharacterConversionException format: @"libicu unorm2_getInstance() failed"]; } if (length < 200) { unichar src[length]; unichar dst[length*3]; /* For a short string, it's very efficient to just use on-stack * buffers for the libicu work, and then let the standard string * initialiser convert that to an inline string. */ [self getCharacters: (unichar *)src range: NSMakeRange(0, length)]; err = 0; newLength = unorm2_normalize(normalizer, (UChar*)src, length, (UChar*)dst, length*3, &err); if (U_FAILURE(err)) { [NSException raise: NSCharacterConversionException format: @"precompose/decompose failed"]; } newString = [[NSString alloc] initWithCharacters: dst length: newLength]; } else { unichar *src; unichar *dst; /* For longer strings, we copy the source into a buffer on the heap * for the libicu operation, determine the length needed for the * output buffer, then do the actual conversion to build the string. */ src = (unichar*)malloc(length * sizeof(unichar)); [self getCharacters: (unichar*)src range: NSMakeRange(0, length)]; err = 0; newLength = unorm2_normalize(normalizer, (UChar*)src, length, 0, 0, &err); if (U_BUFFER_OVERFLOW_ERROR != err) { free(src); [NSException raise: NSCharacterConversionException format: @"precompose/decompose length check failed"]; } dst = NSZoneMalloc(NSDefaultMallocZone(), newLength * sizeof(unichar)); err = 0; unorm2_normalize(normalizer, (UChar*)src, length, (UChar*)dst, newLength, &err); free(src); if (U_FAILURE(err)) { NSZoneFree(NSDefaultMallocZone(), dst); [NSException raise: NSCharacterConversionException format: @"precompose/decompose failed"]; } newString = [[NSString alloc] initWithCharactersNoCopy: dst length: newLength freeWhenDone: YES]; } return AUTORELEASE(newString); } #endif #endif + (void) atExit { DESTROY(placeholderMap); } + (void) initialize { /* * Flag required as we call this method explicitly from GSBuildStrings() * to ensure that NSString is initialised properly. */ static BOOL beenHere = NO; if (self == [NSString class] && beenHere == NO) { beenHere = YES; cMemberSel = @selector(characterIsMember:); caiSel = @selector(characterAtIndex:); gcrSel = @selector(getCharacters:range:); ranSel = @selector(rangeOfComposedCharacterSequenceAtIndex:); nonBase = [NSCharacterSet nonBaseCharacterSet]; nonBase = [NSObject leakAt: &nonBase]; nonBaseImp = (BOOL(*)(id,SEL,unichar))[nonBase methodForSelector: cMemberSel]; _DefaultStringEncoding = GSPrivateDefaultCStringEncoding(); _ByteEncodingOk = GSPrivateIsByteEncoding(_DefaultStringEncoding); NSStringClass = self; [self setVersion: 1]; NSMutableStringClass = [NSMutableString class]; NSDataClass = [NSData class]; GSPlaceholderStringClass = [GSPlaceholderString class]; GSStringClass = [GSString class]; GSMutableStringClass = [GSMutableString class]; /* * Set up infrastructure for placeholder strings. */ defaultPlaceholderString = (GSPlaceholderString*) [GSPlaceholderStringClass allocWithZone: NSDefaultMallocZone()]; placeholderMap = NSCreateMapTable(NSNonOwnedPointerMapKeyCallBacks, NSNonRetainedObjectMapValueCallBacks, 0); register_printf_atsign(); [self registerAtExit]; } } + (id) allocWithZone: (NSZone*)z { if (self == NSStringClass) { /* * For a constant string, we return a placeholder object that can * be converted to a real object when its initialisation method * is called. */ if (z == NSDefaultMallocZone() || z == 0) { /* * As a special case, we can return a placeholder for a string * in the default zone extremely efficiently. */ return defaultPlaceholderString; } else { id obj; /* * For anything other than the default zone, we need to * locate the correct placeholder in the (lock protected) * table of placeholders. */ GS_MUTEX_LOCK(placeholderLock); obj = (id)NSMapGet(placeholderMap, (void*)z); if (obj == nil) { /* * There is no placeholder object for this zone, so we * create a new one and use that. */ obj = (id)[GSPlaceholderStringClass allocWithZone: z]; NSMapInsert(placeholderMap, (void*)z, (void*)obj); } GS_MUTEX_UNLOCK(placeholderLock); return obj; } } else if ([self isKindOfClass: GSStringClass] == YES) { [NSException raise: NSInternalInconsistencyException format: @"Called +allocWithZone: on private string class"]; return nil; /* NOT REACHED */ } else { /* * For user provided strings, we simply allocate an object of * the given class. */ return NSAllocateObject (self, 0, z); } } /** * Return the class used to store constant strings (those ascii strings * placed in the source code using the @"this is a string" syntax).
* Use this method to obtain the constant string class rather than * using the obsolete name NXConstantString in your code ... * with more recent compiler versions the name of this class is variable * (and will automatically be changed by GNUstep to avoid conflicts * with the default implementation in the Objective-C runtime library). */ + (Class) constantStringClass { return [@"" class]; } /** * Create an empty string. */ + (id) string { return AUTORELEASE([[self allocWithZone: NSDefaultMallocZone()] init]); } /** * Create a copy of aString. */ + (id) stringWithString: (NSString*)aString { NSString *obj; if (NULL == aString) [NSException raise: NSInvalidArgumentException format: @"[NSString+stringWithString:]: NULL string"]; obj = [self allocWithZone: NSDefaultMallocZone()]; obj = [obj initWithString: aString]; return AUTORELEASE(obj); } /** * Create a string of unicode characters. */ + (id) stringWithCharacters: (const unichar*)chars length: (NSUInteger)length { NSString *obj; obj = [self allocWithZone: NSDefaultMallocZone()]; obj = [obj initWithCharacters: chars length: length]; return AUTORELEASE(obj); } /** * Create a string based on the given C (char[]) string, which should be * null-terminated and encoded in the default C string encoding. (Characters * will be converted to unicode representation internally.) */ + (id) stringWithCString: (const char*)byteString { NSString *obj; if (NULL == byteString) [NSException raise: NSInvalidArgumentException format: @"[NSString+stringWithCString:]: NULL cString"]; obj = [self allocWithZone: NSDefaultMallocZone()]; obj = [obj initWithCString: byteString]; return AUTORELEASE(obj); } /** * Create a string based on the given C (char[]) string, which should be * null-terminated and encoded in the specified C string encoding. * Characters may be converted to unicode representation internally. */ + (id) stringWithCString: (const char*)byteString encoding: (NSStringEncoding)encoding { NSString *obj; if (NULL == byteString) [NSException raise: NSInvalidArgumentException format: @"[NSString+stringWithCString:encoding:]: NULL cString"]; obj = [self allocWithZone: NSDefaultMallocZone()]; obj = [obj initWithCString: byteString encoding: encoding]; return AUTORELEASE(obj); } /** * Create a string based on the given C (char[]) string, which may contain * null bytes and should be encoded in the default C string encoding. * (Characters will be converted to unicode representation internally.) */ + (id) stringWithCString: (const char*)byteString length: (NSUInteger)length { NSString *obj; obj = [self allocWithZone: NSDefaultMallocZone()]; obj = [obj initWithCString: byteString length: length]; return AUTORELEASE(obj); } /** * Create a string based on the given UTF-8 string, null-terminated.
* Raises NSInvalidArgumentException if given NULL pointer. */ + (id) stringWithUTF8String: (const char *)bytes { NSString *obj; if (NULL == bytes) [NSException raise: NSInvalidArgumentException format: @"[NSString+stringWithUTF8String:]: NULL cString"]; if (self == NSStringClass) { obj = defaultPlaceholderString; } else { obj = [self allocWithZone: NSDefaultMallocZone()]; } obj = [obj initWithUTF8String: bytes]; return AUTORELEASE(obj); } /** * Load contents of file at path into a new string. Will interpret file as * containing direct unicode if it begins with the unicode byte order mark, * else converts to unicode using default C string encoding. */ + (id) stringWithContentsOfFile: (NSString *)path { NSString *obj; obj = [self allocWithZone: NSDefaultMallocZone()]; obj = [obj initWithContentsOfFile: path]; return AUTORELEASE(obj); } /** * Load contents of file at path into a new string using the * -initWithContentsOfFile:usedEncoding:error: method. */ + (id) stringWithContentsOfFile: (NSString *)path usedEncoding: (NSStringEncoding*)enc error: (NSError**)error { NSString *obj; obj = [self allocWithZone: NSDefaultMallocZone()]; obj = [obj initWithContentsOfFile: path usedEncoding: enc error: error]; return AUTORELEASE(obj); } /** * Load contents of file at path into a new string using the * -initWithContentsOfFile:encoding:error: method. */ + (id) stringWithContentsOfFile: (NSString*)path encoding: (NSStringEncoding)enc error: (NSError**)error { NSString *obj; obj = [self allocWithZone: NSDefaultMallocZone()]; obj = [obj initWithContentsOfFile: path encoding: enc error: error]; return AUTORELEASE(obj); } /** * Load contents of given URL into a new string. Will interpret contents as * containing direct unicode if it begins with the unicode byte order mark, * else converts to unicode using default C string encoding. */ + (id) stringWithContentsOfURL: (NSURL *)url { NSString *obj; obj = [self allocWithZone: NSDefaultMallocZone()]; obj = [obj initWithContentsOfURL: url]; return AUTORELEASE(obj); } + (id) stringWithContentsOfURL: (NSURL*)url usedEncoding: (NSStringEncoding*)enc error: (NSError**)error { NSString *obj; obj = [self allocWithZone: NSDefaultMallocZone()]; obj = [obj initWithContentsOfURL: url usedEncoding: enc error: error]; return AUTORELEASE(obj); } + (id) stringWithContentsOfURL: (NSURL*)url encoding: (NSStringEncoding)enc error: (NSError**)error { NSString *obj; obj = [self allocWithZone: NSDefaultMallocZone()]; obj = [obj initWithContentsOfURL: url encoding: enc error: error]; return AUTORELEASE(obj); } /** * Creates a new string using C printf-style formatting. First argument should * be a constant format string, like '@"float val = %f"', remaining * arguments should be the variables to print the values of, comma-separated. */ + (id) stringWithFormat: (NSString*)format,... { va_list ap; NSString *obj; if (NULL == format) [NSException raise: NSInvalidArgumentException format: @"[NSString+stringWithFormat:]: NULL format"]; va_start(ap, format); obj = [self allocWithZone: NSDefaultMallocZone()]; obj = [obj initWithFormat: format arguments: ap]; va_end(ap); return AUTORELEASE(obj); } /** *

In MacOS-X class clusters do not have designated initialisers, * and there is a general rule that -init is treated as the designated * initialiser of the class cluster, but that other intitialisers * may not work as expected and would need to be individually overridden * in any subclass. *

*

GNUstep tries to make it easier to subclass a class cluster, * by making class clusters follow the same convention as normal * classes, so the designated initialiser is the richest * initialiser. This means that all other initialisers call the * documented designated initialiser (which calls -init only for * MacOS-X compatibility), and anyone writing a subclass only needs * to override that one initialiser in order to have all the other * ones work. *

*

For MacOS-X compatibility, you may also need to override various * other initialisers. Exactly which ones, you will need to determine * by trial on a MacOS-X system ... and may vary between releases of * MacOS-X. So to be safe, on MacOS-X you probably need to re-implement * all the class cluster initialisers you might use in conjunction * with your subclass. *

*

NB. The GNUstep designated initialiser for the NSString class cluster * has changed to -initWithBytesNoCopy:length:encoding:freeWhenDone: * from -initWithCharactersNoCopy:length:freeWhenDone: and older code * subclassing NSString will need to be updated. *

*/ - (id) init { self = [super init]; return self; } /** * Initialises the receiver with a copy of the supplied length of bytes, * using the specified encoding.
* For NSUnicodeStringEncoding and NSUTF8String encoding, a Byte Order * Marker (if present at the start of the data) is removed automatically.
* If the data can not be interpreted using the encoding, the receiver * is released and nil is returned. */ - (id) initWithBytes: (const void*)bytes length: (NSUInteger)length encoding: (NSStringEncoding)encoding { if (length == 0) { return [self initWithBytesNoCopy: (void *)0 length: 0 encoding: encoding freeWhenDone: NO]; } else { void *buf; buf = NSZoneMalloc([self zone], length); memcpy(buf, bytes, length); return [self initWithBytesNoCopy: buf length: length encoding: encoding freeWhenDone: YES]; } } /** * Initialises the receiver with the supplied length of bytes, using the * specified encoding.
* For NSUnicodeStringEncoding and NSUTF8String encoding, a Byte Order * Marker (if present at the start of the data) is removed automatically.
* If the data is not in a format which can be used internally unmodified, * it is copied, otherwise it is used as is. If the data is not copied * the flag determines whether the string will free it when it is no longer * needed (ie whether the new NSString instance 'owns' the memory).
* In the case of non-owned memory, it is the caller's responsibility to * ensure that the data continues to exist and is not modified until the * receiver is deallocated.
* If the data can not be interpreted using the encoding, the receiver * is released and nil is returned. *

Note, this is the most basic initialiser for strings. * In the GNUstep implementation, your subclasses may override * this initialiser in order to have all other functionality.

*/ - (id) initWithBytesNoCopy: (void*)bytes length: (NSUInteger)length encoding: (NSStringEncoding)encoding freeWhenDone: (BOOL)flag { self = [self init]; return self; } /** *

Initialize with given unicode chars up to length, regardless of presence * of null bytes. Does not copy the string. If flag, frees its storage when * this instance is deallocated.

* See -initWithBytesNoCopy:length:encoding:freeWhenDone: for more details. */ - (id) initWithCharactersNoCopy: (unichar*)chars length: (NSUInteger)length freeWhenDone: (BOOL)flag { return [self initWithBytesNoCopy: chars length: length * sizeof(unichar) encoding: NSUnicodeStringEncoding freeWhenDone: flag]; } /** *

Initialize with given unicode chars up to length, regardless of presence * of null bytes. Copies the string and frees copy when deallocated.

*/ - (id) initWithCharacters: (const unichar*)chars length: (NSUInteger)length { return [self initWithBytes: chars length: length * sizeof(unichar) encoding: NSUnicodeStringEncoding]; } /** *

Initialize with given C string byteString up to length, regardless of * presence of null bytes. Characters converted to unicode based on the * default C encoding. Does not copy the string. If flag, frees its storage * when this instance is deallocated.

* See -initWithBytesNoCopy:length:encoding:freeWhenDone: for more details. */ - (id) initWithCStringNoCopy: (char*)byteString length: (NSUInteger)length freeWhenDone: (BOOL)flag { return [self initWithBytesNoCopy: byteString length: length encoding: _DefaultStringEncoding freeWhenDone: flag]; } /** *

Initialize with given C string byteString up to first nul byte. * Characters converted to unicode based on the specified C encoding. * Copies the string.

*/ - (id) initWithCString: (const char*)byteString encoding: (NSStringEncoding)encoding { if (NULL == byteString) [NSException raise: NSInvalidArgumentException format: @"[NSString-initWithCString:encoding:]: NULL cString"]; return [self initWithBytes: byteString length: strlen(byteString) encoding: encoding]; } /** *

Initialize with given C string byteString up to length, regardless of * presence of null bytes. Characters converted to unicode based on the * default C encoding. Copies the string.

*/ - (id) initWithCString: (const char*)byteString length: (NSUInteger)length { return [self initWithBytes: byteString length: length encoding: _DefaultStringEncoding]; } /** *

Initialize with given C string byteString, which should be * null-terminated. Characters are converted to unicode based on the default * C encoding. Copies the string.

*/ - (id) initWithCString: (const char*)byteString { if (NULL == byteString) [NSException raise: NSInvalidArgumentException format: @"[NSString-initWithCString:]: NULL cString"]; return [self initWithBytes: byteString length: strlen(byteString) encoding: _DefaultStringEncoding]; } /** * Initialize to be a copy of the given string. */ - (id) initWithString: (NSString*)string { unsigned length = [string length]; if (NULL == string) [NSException raise: NSInvalidArgumentException format: @"[NSString-initWithString:]: NULL string"]; if (length > 0) { unichar *s = NSZoneMalloc([self zone], sizeof(unichar)*length); [string getCharacters: s range: ((NSRange){0, length})]; self = [self initWithCharactersNoCopy: s length: length freeWhenDone: YES]; } else { self = [self initWithCharactersNoCopy: (unichar*)0 length: 0 freeWhenDone: NO]; } return self; } /** * Initialize based on given null-terminated UTF-8 string bytes. */ - (id) initWithUTF8String: (const char *)bytes { if (NULL == bytes) [NSException raise: NSInvalidArgumentException format: @"[NSString-initWithUTF8String:]: NULL cString"]; return [self initWithBytes: bytes length: strlen(bytes) encoding: NSUTF8StringEncoding]; } /** * Invokes -initWithFormat:locale:arguments: with a nil locale. */ - (id) initWithFormat: (NSString*)format,... { va_list ap; va_start(ap, format); self = [self initWithFormat: format locale: nil arguments: ap]; va_end(ap); return self; } /** * Invokes -initWithFormat:locale:arguments: */ - (id) initWithFormat: (NSString*)format locale: (NSDictionary*)locale, ... { va_list ap; va_start(ap, locale); self = [self initWithFormat: format locale: locale arguments: ap]; va_end(ap); return self; } /** * Invokes -initWithFormat:locale:arguments: with a nil locale. */ - (id) initWithFormat: (NSString*)format arguments: (va_list)argList { return [self initWithFormat: format locale: nil arguments: argList]; } /** * Initialises the string using the specified format and locale * to format the following arguments. */ - (id) initWithFormat: (NSString*)format locale: (NSDictionary*)locale arguments: (va_list)argList { unsigned char buf[2048]; GSStr f; unichar fbuf[1024]; unichar *fmt = fbuf; size_t len; if (NULL == format) [NSException raise: NSInvalidArgumentException format: @"[NSString-initWithFormat:locale:arguments:]: NULL format"]; /* * First we provide an array of unichar characters containing the * format string. For performance reasons we try to use an on-stack * buffer if the format string is small enough ... it almost always * will be. */ len = [format length]; if (len >= 1024) { fmt = NSZoneMalloc(NSDefaultMallocZone(), (len+1)*sizeof(unichar)); } [format getCharacters: fmt range: ((NSRange){0, len})]; fmt[len] = '\0'; /* * Now set up 'f' as a GSMutableString object whose initial buffer is * allocated on the stack. The GSPrivateFormat function can write into it. */ f = (GSStr)alloca(class_getInstanceSize(GSMutableStringClass)); object_setClass(f, GSMutableStringClass); f->_zone = NSDefaultMallocZone(); f->_contents.c = buf; f->_capacity = sizeof(buf); f->_count = 0; f->_flags.wide = 0; f->_flags.owned = 0; f->_flags.unused = 0; f->_flags.hash = 0; GSPrivateFormat(f, fmt, argList, locale); GSPrivateStrExternalize(f); if (fmt != fbuf) { NSZoneFree(NSDefaultMallocZone(), fmt); } /* * Don't use noCopy because f->_contents.u may be memory on the stack, * and even if it wasn't f->_capacity may be greater than f->_count so * we could be wasting quite a bit of space. Better to accept a * performance hit due to copying data (and allocating/deallocating * the temporary buffer) for large strings. For most strings, the * on-stack memory will have been used, so we will get better performance. */ if (f->_flags.wide == 1) { self = [self initWithCharacters: f->_contents.u length: f->_count]; } else { self = [self initWithCString: (char*)f->_contents.c length: f->_count]; } /* * If the string had to grow beyond the initial buffer size, we must * release any allocated memory. */ if (f->_flags.owned == 1) { NSZoneFree(f->_zone, f->_contents.c); } return self; } /** * Initialises the receiver with the supplied data, using the * specified encoding.
* For NSUnicodeStringEncoding and NSUTF8String encoding, a Byte Order * Marker (if present at the start of the data) is removed automatically.
* If the data can not be interpreted using the encoding, the receiver * is released and nil is returned. */ - (id) initWithData: (NSData*)data encoding: (NSStringEncoding)encoding { return [self initWithBytes: [data bytes] length: [data length] encoding: encoding]; } /** *

Initialises the receiver with the contents of the file at path. *

*

Invokes [NSData-initWithContentsOfFile:] to read the file, then * examines the data to infer its encoding type, and converts the * data to a string using -initWithData:encoding: *

*

The encoding to use is determined as follows ... if the data begins * with the 16-bit unicode Byte Order Marker, then it is assumed to be * unicode data in the appropriate ordering and converted as such.
* If it begins with a UTF8 representation of the BOM, the UTF8 encoding * is used.
* Otherwise, the default C String encoding is used. *

*

Releases the receiver and returns nil if the file could not be read * and converted to a string. *

*/ - (id) initWithContentsOfFile: (NSString*)path { NSStringEncoding enc = _DefaultStringEncoding; NSData *d; unsigned int len; const unsigned char *data_bytes; d = [[NSDataClass alloc] initWithContentsOfFile: path]; if (d == nil) { DESTROY(self); return nil; } len = [d length]; if (len == 0) { RELEASE(d); DESTROY(self); return @""; } data_bytes = [d bytes]; if ((data_bytes != NULL) && (len >= 2)) { const unichar *data_ucs2chars = (const unichar *)(void*) data_bytes; if ((data_ucs2chars[0] == byteOrderMark) || (data_ucs2chars[0] == byteOrderMarkSwapped)) { /* somebody set up us the BOM! */ enc = NSUnicodeStringEncoding; } else if (len >= 3 && data_bytes[0] == 0xEF && data_bytes[1] == 0xBB && data_bytes[2] == 0xBF) { enc = NSUTF8StringEncoding; } } self = [self initWithData: d encoding: enc]; RELEASE(d); if (self == nil) { NSWarnMLog(@"Contents of file '%@' are not string data using %@", path, [NSString localizedNameOfStringEncoding: enc]); } return self; } /** *

Initialises the receiver with the contents of the file at path. *

*

Invokes [NSData-initWithContentsOfFile:] to read the file, then * examines the data to infer its encoding type, and converts the * data to a string using -initWithData:encoding: *

*

The encoding to use is determined as follows ... if the data begins * with the 16-bit unicode Byte Order Marker, then it is assumed to be * unicode data in the appropriate ordering and converted as such.
* If it begins with a UTF8 representation of the BOM, the UTF8 encoding * is used.
* Otherwise, the default C String encoding is used. *

*

Releases the receiver and returns nil if the file could not be read * and converted to a string. *

*/ - (id) initWithContentsOfFile: (NSString*)path usedEncoding: (NSStringEncoding*)enc error: (NSError**)error { NSData *d; unsigned int len; const unsigned char *data_bytes; d = [[NSDataClass alloc] initWithContentsOfFile: path]; if (nil == d) { DESTROY(self); if (error != 0) { *error = [NSError errorWithDomain: NSCocoaErrorDomain code: NSFileReadUnknownError userInfo: nil]; } return nil; } *enc = _DefaultStringEncoding; len = [d length]; if (len == 0) { RELEASE(d); DESTROY(self); return @""; } data_bytes = [d bytes]; if ((data_bytes != NULL) && (len >= 2)) { const unichar *data_ucs2chars = (const unichar *)(void*) data_bytes; if ((data_ucs2chars[0] == byteOrderMark) || (data_ucs2chars[0] == byteOrderMarkSwapped)) { /* somebody set up us the BOM! */ *enc = NSUnicodeStringEncoding; } else if (len >= 3 && data_bytes[0] == 0xEF && data_bytes[1] == 0xBB && data_bytes[2] == 0xBF) { *enc = NSUTF8StringEncoding; } } self = [self initWithData: d encoding: *enc]; RELEASE(d); if (nil == self) { if (error != 0) { *error = [NSError errorWithDomain: NSCocoaErrorDomain code: NSFileReadCorruptFileError userInfo: nil]; } } return self; } - (id) initWithContentsOfFile: (NSString*)path encoding: (NSStringEncoding)enc error: (NSError**)error { NSData *d; unsigned int len; d = [[NSDataClass alloc] initWithContentsOfFile: path]; if (d == nil) { DESTROY(self); return nil; } len = [d length]; if (len == 0) { RELEASE(d); DESTROY(self); return @""; } self = [self initWithData: d encoding: enc]; RELEASE(d); if (self == nil) { if (error != 0) { *error = [NSError errorWithDomain: NSCocoaErrorDomain code: NSFileReadCorruptFileError userInfo: nil]; } } return self; } /** *

Initialises the receiver with the contents of the given URL. *

*

Invokes [NSData+dataWithContentsOfURL:] to read the contents, then * examines the data to infer its encoding type, and converts the * data to a string using -initWithData:encoding: *

*

The encoding to use is determined as follows ... if the data begins * with the 16-bit unicode Byte Order Marker, then it is assumed to be * unicode data in the appropriate ordering and converted as such.
* If it begins with a UTF8 representation of the BOM, the UTF8 encoding * is used.
* Otherwise, the default C String encoding is used. *

*

Releases the receiver and returns nil if the URL contents could not be * read and converted to a string. *

*/ - (id) initWithContentsOfURL: (NSURL*)url { NSStringEncoding enc = _DefaultStringEncoding; NSData *d = [NSDataClass dataWithContentsOfURL: url]; unsigned int len = [d length]; const unsigned char *data_bytes; if (d == nil) { NSWarnMLog(@"Contents of URL '%@' are not readable", url); DESTROY(self); return nil; } if (len == 0) { DESTROY(self); return @""; } data_bytes = [d bytes]; if ((data_bytes != NULL) && (len >= 2)) { const unichar *data_ucs2chars = (const unichar *)(void*) data_bytes; if ((data_ucs2chars[0] == byteOrderMark) || (data_ucs2chars[0] == byteOrderMarkSwapped)) { enc = NSUnicodeStringEncoding; } else if (len >= 3 && data_bytes[0] == 0xEF && data_bytes[1] == 0xBB && data_bytes[2] == 0xBF) { enc = NSUTF8StringEncoding; } } self = [self initWithData: d encoding: enc]; if (self == nil) { NSWarnMLog(@"Contents of URL '%@' are not string data using %@", url, [NSString localizedNameOfStringEncoding: enc]); } return self; } - (id) initWithContentsOfURL: (NSURL*)url usedEncoding: (NSStringEncoding*)enc error: (NSError**)error { NSData *d; unsigned int len; const unsigned char *data_bytes; d = [NSDataClass dataWithContentsOfURL: url]; if (d == nil) { DESTROY(self); return nil; } *enc = _DefaultStringEncoding; len = [d length]; if (len == 0) { DESTROY(self); return @""; } data_bytes = [d bytes]; if ((data_bytes != NULL) && (len >= 2)) { const unichar *data_ucs2chars = (const unichar *)(void*) data_bytes; if ((data_ucs2chars[0] == byteOrderMark) || (data_ucs2chars[0] == byteOrderMarkSwapped)) { /* somebody set up us the BOM! */ *enc = NSUnicodeStringEncoding; } else if (len >= 3 && data_bytes[0] == 0xEF && data_bytes[1] == 0xBB && data_bytes[2] == 0xBF) { *enc = NSUTF8StringEncoding; } } self = [self initWithData: d encoding: *enc]; if (self == nil) { if (error != 0) { *error = [NSError errorWithDomain: NSCocoaErrorDomain code: NSFileReadCorruptFileError userInfo: nil]; } } return self; } - (id) initWithContentsOfURL: (NSURL*)url encoding: (NSStringEncoding)enc error: (NSError**)error { NSData *d; unsigned int len; d = [NSDataClass dataWithContentsOfURL: url]; if (d == nil) { DESTROY(self); return nil; } len = [d length]; if (len == 0) { DESTROY(self); return @""; } self = [self initWithData: d encoding: enc]; if (self == nil) { if (error != 0) { *error = [NSError errorWithDomain: NSCocoaErrorDomain code: NSFileReadCorruptFileError userInfo: nil]; } } return self; } /** * Returns the number of Unicode characters in this string, including the * individual characters of composed character sequences, */ - (NSUInteger) length { [self subclassResponsibility: _cmd]; return 0; } // Accessing Characters /** * Returns unicode character at index. unichar is an unsigned * short. Thus, a 16-bit character is returned. */ - (unichar) characterAtIndex: (NSUInteger)index { [self subclassResponsibility: _cmd]; return (unichar)0; } - (NSString *) decomposedStringWithCompatibilityMapping { #if (GS_USE_ICU == 1) && (defined(HAVE_UNICODE_UNORM2_H) || defined(HAVE_ICU_H)) return [self _normalizedICUStringOfType: "nfkc" mode: UNORM2_DECOMPOSE]; #else return [self notImplemented: _cmd]; #endif } - (NSString *) decomposedStringWithCanonicalMapping { #if (GS_USE_ICU == 1) && (defined(HAVE_UNICODE_UNORM2_H) || defined(HAVE_ICU_H)) return [self _normalizedICUStringOfType: "nfc" mode: UNORM2_DECOMPOSE]; #else return [self notImplemented: _cmd]; #endif } /** * Returns this string as an array of 16-bit unichar (unsigned * short) values. buffer must be preallocated and should be capable of * holding -length shorts. */ // Inefficient. Should be overridden - (void) getCharacters: (unichar*)buffer { [self getCharacters: buffer range: ((NSRange){0, [self length]})]; return; } /** * Returns aRange of string as an array of 16-bit unichar * (unsigned short) values. buffer must be preallocated and should be capable * of holding a sufficient number of shorts. */ // Inefficient. Should be overridden - (void) getCharacters: (unichar*)buffer range: (NSRange)aRange { unsigned l = [self length]; unsigned i; unichar (*caiImp)(NSString*, SEL, NSUInteger); GS_RANGE_CHECK(aRange, l); caiImp = (unichar (*)(NSString*,SEL,NSUInteger)) [self methodForSelector: caiSel]; for (i = 0; i < aRange.length; i++) { buffer[i] = (*caiImp)(self, caiSel, aRange.location + i); } } - (NSString *) stringByAddingPercentEncodingWithAllowedCharacters: (NSCharacterSet *)aSet { NSData *data = [self dataUsingEncoding: NSUTF8StringEncoding]; NSString *s = nil; if (data != nil) { unsigned char *src = (unsigned char*)[data bytes]; unsigned int slen = [data length]; unsigned char *dst; unsigned int spos = 0; unsigned int dpos = 0; dst = (unsigned char*)NSZoneMalloc(NSDefaultMallocZone(), slen * 3); while (spos < slen) { unichar c = src[spos++]; unsigned int hi; unsigned int lo; /* If the character is in the allowed set *and* is in the * 7-bit ASCII range, it can be added unchanged. */ if (c < 128 && [aSet characterIsMember: c]) { dst[dpos++] = c; } else // if not, then encode it... { dst[dpos++] = '%'; hi = (c & 0xf0) >> 4; dst[dpos++] = (hi > 9) ? 'A' + hi - 10 : '0' + hi; lo = (c & 0x0f); dst[dpos++] = (lo > 9) ? 'A' + lo - 10 : '0' + lo; } } s = [[NSString alloc] initWithBytes: dst length: dpos encoding: NSASCIIStringEncoding]; NSZoneFree(NSDefaultMallocZone(), dst); IF_NO_ARC([s autorelease];) } return s; } - (NSString *) stringByRemovingPercentEncoding { NSData *data = [self dataUsingEncoding: NSUTF8StringEncoding]; const uint8_t *s = [data bytes]; NSUInteger length = [data length]; NSUInteger lastPercent = length - 3; char *o = (char *)NSZoneMalloc(NSDefaultMallocZone(), length + 1); char *next = o; NSUInteger index; NSString *result; for (index = 0; index < length; index++) { char c = s[index]; if ('%' == c && index <= lastPercent) { uint8_t hi = s[index+1]; uint8_t lo = s[index+2]; if (isxdigit(hi) && isxdigit(lo)) { index += 2; if (hi <= '9') { c = hi - '0'; } else if (hi <= 'F') { c = hi - 'A' + 10; } else { c = hi - 'a' + 10; } c <<= 4; if (lo <= '9') { c += lo - '0'; } else if (lo <= 'F') { c += lo - 'A' + 10; } else { c += lo - 'a' + 10; } } } *next++ = c; } *next = '\0'; result = [NSString stringWithUTF8String: o]; NSZoneFree(NSDefaultMallocZone(), o); return result; } /** * Constructs a new ASCII string which is a representation of the receiver * in which characters are escaped where necessary in order to produce a * version of the string legal for inclusion within a URL.
* The original string is converted to bytes using the specified encoding * and then those bytes are escaped unless they correspond to 'legal' * ASCII characters. The byte values escaped are any below 32 and any * above 126 as well as 32 (space), 34 ("), 35 (#), 37 (%), 60 (<), * 62 (>), 91 ([), 92 (\), 93 (]), 94 (^), 96 (~), 123 ({), 124 (|), * and 125 (}).
* Returns nil if the receiver cannot be represented using the specified * encoding.
* NB. This behavior is MacOS-X (4.2) compatible, and it should be noted * that it does not produce a string suitable for use as a field * value in a url-encoded form as it does not escape the * '+', '=' and '&' characters used in such forms. If you need to * add a string as a form field value (or name) you must add percent * escapes for those characters yourself. */ - (NSString*) stringByAddingPercentEscapesUsingEncoding: (NSStringEncoding)e { NSData *data = [self dataUsingEncoding: e]; NSString *s = nil; if (data != nil) { unsigned char *src = (unsigned char*)[data bytes]; unsigned int slen = [data length]; unsigned char *dst; unsigned int spos = 0; unsigned int dpos = 0; dst = (unsigned char*)NSZoneMalloc(NSDefaultMallocZone(), slen * 3); while (spos < slen) { unsigned char c = src[spos++]; unsigned int hi; unsigned int lo; if (c <= 32 || c > 126 || c == 34 || c == 35 || c == 37 || c == 60 || c == 62 || c == 91 || c == 92 || c == 93 || c == 94 || c == 96 || c == 123 || c == 124 || c == 125) { dst[dpos++] = '%'; hi = (c & 0xf0) >> 4; dst[dpos++] = (hi > 9) ? 'A' + hi - 10 : '0' + hi; lo = (c & 0x0f); dst[dpos++] = (lo > 9) ? 'A' + lo - 10 : '0' + lo; } else { dst[dpos++] = c; } } s = [[NSString alloc] initWithBytes: dst length: dpos encoding: NSASCIIStringEncoding]; NSZoneFree(NSDefaultMallocZone(), dst); IF_NO_ARC([s autorelease];) } return s; } /** * Constructs a new string consisting of this instance followed by the string * specified by format. */ - (NSString*) stringByAppendingFormat: (NSString*)format,... { va_list ap; id ret; va_start(ap, format); ret = [self stringByAppendingString: [NSString stringWithFormat: format arguments: ap]]; va_end(ap); return ret; } /** * Constructs a new string consisting of this instance followed by the aString. */ - (NSString*) stringByAppendingString: (NSString*)aString { unsigned len = [self length]; unsigned otherLength = [aString length]; NSZone *z = [self zone]; unichar *s = NSZoneMalloc(z, (len+otherLength)*sizeof(unichar)); NSString *tmp; [self getCharacters: s range: ((NSRange){0, len})]; [aString getCharacters: s + len range: ((NSRange){0, otherLength})]; tmp = [[NSStringClass allocWithZone: z] initWithCharactersNoCopy: s length: len + otherLength freeWhenDone: YES]; return AUTORELEASE(tmp); } // Dividing Strings into Substrings /** *

Returns an array of [NSString]s representing substrings of this string * that are separated by characters in the set (which must not be nil). * If there are no occurrences of separator, the whole string is * returned. If string begins or ends with separator, empty strings will * be returned for those positions.

*/ - (NSArray *) componentsSeparatedByCharactersInSet: (NSCharacterSet *)separator { NSRange search; NSRange complete; NSRange found; NSMutableArray *array; IF_NO_ARC(NSAutoreleasePool *pool; NSUInteger count;) if (separator == nil) [NSException raise: NSInvalidArgumentException format: @"separator is nil"]; array = [NSMutableArray array]; IF_NO_ARC(pool = [NSAutoreleasePool new]; count = 0;) search = NSMakeRange (0, [self length]); complete = search; found = [self rangeOfCharacterFromSet: separator]; while (found.length != 0) { NSRange current; current = NSMakeRange (search.location, found.location - search.location); [array addObject: [self substringWithRange: current]]; search = NSMakeRange (found.location + found.length, complete.length - found.location - found.length); found = [self rangeOfCharacterFromSet: separator options: 0 range: search]; IF_NO_ARC(if (0 == count % 200) [pool emptyPool];) } // Add the last search string range [array addObject: [self substringWithRange: search]]; IF_NO_ARC([pool release];) // FIXME: Need to make mutable array into non-mutable array? return array; } /** *

Returns an array of [NSString]s representing substrings of this string * that are separated by separator (which itself is never returned in the * array). If there are no occurrences of separator, the whole string is * returned. If string begins or ends with separator, empty strings will * be returned for those positions.

*

Note, use an [NSScanner] if you need more sophisticated parsing.

*/ - (NSArray*) componentsSeparatedByString: (NSString*)separator { NSRange search; NSRange complete; NSRange found; NSMutableArray *array = [NSMutableArray array]; search = NSMakeRange (0, [self length]); complete = search; found = [self rangeOfString: separator options: 0 range: search locale: nil]; while (found.length != 0) { NSRange current; current = NSMakeRange (search.location, found.location - search.location); [array addObject: [self substringWithRange: current]]; search = NSMakeRange (found.location + found.length, complete.length - found.location - found.length); found = [self rangeOfString: separator options: 0 range: search locale: nil]; } // Add the last search string range [array addObject: [self substringWithRange: search]]; // FIXME: Need to make mutable array into non-mutable array? return array; } - (NSString*) stringByReplacingOccurrencesOfString: (NSString*)replace withString: (NSString*)by options: (NSStringCompareOptions)opts range: (NSRange)searchRange { id copy; copy = [[[GSMutableStringClass allocWithZone: NSDefaultMallocZone()] initWithString: self] autorelease]; [copy replaceOccurrencesOfString: replace withString: by options: opts range: searchRange]; return GS_IMMUTABLE(copy); } - (NSString*) stringByReplacingOccurrencesOfString: (NSString*)replace withString: (NSString*)by { return [self stringByReplacingOccurrencesOfString: replace withString: by options: 0 range: NSMakeRange(0, [self length])]; } /** * Returns a new string where the substring in the given range is replaced by * the passed string. */ - (NSString*) stringByReplacingCharactersInRange: (NSRange)aRange withString: (NSString*)by { id copy; copy = [[[GSMutableStringClass allocWithZone: NSDefaultMallocZone()] initWithString: self] autorelease]; [copy replaceCharactersInRange: aRange withString: by]; return GS_IMMUTABLE(copy); } /** * Returns a substring of the receiver from character at the specified * index to the end of the string.
* So, supplying an index of 3 would return a substring consisting of * the entire string apart from the first three character (those would * be at index 0, 1, and 2).
* If the supplied index is greater than or equal to the length of the * receiver an exception is raised. */ - (NSString*) substringFromIndex: (NSUInteger)index { return [self substringWithRange: ((NSRange){index, [self length]-index})]; } /** * Returns a substring of the receiver from the start of the * string to (but not including) the specified index position.
* So, supplying an index of 3 would return a substring consisting of * the first three characters of the receiver.
* If the supplied index is greater than the length of the receiver * an exception is raised. */ - (NSString*) substringToIndex: (NSUInteger)index { return [self substringWithRange: ((NSRange){0,index})]; } /** * An obsolete name for -substringWithRange: ... deprecated. */ - (NSString*) substringFromRange: (NSRange)aRange { return [self substringWithRange: aRange]; } /** * Returns a substring of the receiver containing the characters * in aRange.
* If aRange specifies any character position not * present in the receiver, an exception is raised.
* If aRange has a length of zero, an empty string is returned. */ - (NSString*) substringWithRange: (NSRange)aRange { unichar *buf; id ret; unsigned len = [self length]; GS_RANGE_CHECK(aRange, len); if (aRange.length == 0) return @""; buf = NSZoneMalloc([self zone], sizeof(unichar)*aRange.length); [self getCharacters: buf range: aRange]; ret = [[NSStringClass allocWithZone: NSDefaultMallocZone()] initWithCharactersNoCopy: buf length: aRange.length freeWhenDone: YES]; return AUTORELEASE(ret); } // Finding Ranges of Characters and Substrings /** * Returns position of first character in this string that is in aSet. * Positions start at 0. If the character is a composed character sequence, * the range returned will contain the whole sequence, else just the character * itself. */ - (NSRange) rangeOfCharacterFromSet: (NSCharacterSet*)aSet { NSRange all = NSMakeRange(0, [self length]); return [self rangeOfCharacterFromSet: aSet options: 0 range: all]; } /** * Returns position of first character in this string that is in aSet. * Positions start at 0. If the character is a composed character sequence, * the range returned will contain the whole sequence, else just the character * itself. mask may contain NSCaseInsensitiveSearch, * NSLiteralSearch (don't consider alternate forms of composed * characters equal), or NSBackwardsSearch (search from end of * string). */ - (NSRange) rangeOfCharacterFromSet: (NSCharacterSet*)aSet options: (NSUInteger)mask { NSRange all = NSMakeRange(0, [self length]); return [self rangeOfCharacterFromSet: aSet options: mask range: all]; } /** * Returns position of first character in this string that is in aSet. * Positions start at 0. If the character is a composed character sequence, * the range returned will contain the whole sequence, else just the character * itself. mask may contain NSCaseInsensitiveSearch, * NSLiteralSearch (don't consider alternate forms of composed * characters equal), or NSBackwardsSearch (search from end of * string). Search only carried out within aRange. */ - (NSRange) rangeOfCharacterFromSet: (NSCharacterSet*)aSet options: (NSUInteger)mask range: (NSRange)aRange { unsigned int i; unsigned int start; unsigned int stop; int step; NSRange range; unichar (*cImp)(id, SEL, NSUInteger); BOOL (*mImp)(id, SEL, unichar); i = [self length]; GS_RANGE_CHECK(aRange, i); if ((mask & NSBackwardsSearch) == NSBackwardsSearch) { start = NSMaxRange(aRange)-1; stop = aRange.location-1; step = -1; } else { start = aRange.location; stop = NSMaxRange(aRange); step = 1; } range.location = NSNotFound; range.length = 0; cImp = (unichar(*)(id,SEL,NSUInteger)) [self methodForSelector: caiSel]; mImp = (BOOL(*)(id,SEL,unichar)) [aSet methodForSelector: cMemberSel]; for (i = start; i != stop; i += step) { unichar letter = (unichar)(*cImp)(self, caiSel, i); if ((*mImp)(aSet, cMemberSel, letter)) { range = NSMakeRange(i, 1); break; } } return range; } /** * Invokes -rangeOfString:options: with no options. */ - (NSRange) rangeOfString: (NSString*)string { NSRange all = NSMakeRange(0, [self length]); return [self rangeOfString: string options: 0 range: all locale: nil]; } /** * Invokes -rangeOfString:options:range: with the range set * set to the range of the whole of the receiver. */ - (NSRange) rangeOfString: (NSString*)string options: (NSUInteger)mask { NSRange all = NSMakeRange(0, [self length]); return [self rangeOfString: string options: mask range: all locale: nil]; } /** * Returns the range giving the location and length of the first * occurrence of aString within aRange. *
* If aString does not exist in the receiver (an empty * string is never considered to exist in the receiver), * the length of the returned range is zero. *
* If aString is nil, an exception is raised. *
* If any part of aRange lies outside the range of the * receiver, an exception is raised. *
* The options mask may contain the following options - * * NSCaseInsensitiveSearch * NSLiteralSearch * NSBackwardsSearch * NSAnchoredSearch * * The NSAnchoredSearch option means aString must occur at the * beginning (or end, if NSBackwardsSearch is also given) of the * string. Options should be OR'd together using '|'. */ - (NSRange) rangeOfString: (NSString *)aString options: (NSUInteger)mask range: (NSRange)aRange { return [self rangeOfString: aString options: mask range: aRange locale: nil]; } - (NSRange) rangeOfString: (NSString *)aString options: (NSStringCompareOptions)mask range: (NSRange)searchRange locale: (NSLocale *)locale { NSUInteger length = [self length]; NSUInteger countOther; GS_RANGE_CHECK(searchRange, length); if (aString == nil) [NSException raise: NSInvalidArgumentException format: @"range of nil"]; if ((mask & NSRegularExpressionSearch) == NSRegularExpressionSearch) { NSRange r = {NSNotFound, 0}; NSError *e = nil; NSUInteger options = 0; NSRegularExpression *regex = [NSRegularExpression alloc]; if ((mask & NSCaseInsensitiveSearch) == NSCaseInsensitiveSearch) { options |= NSRegularExpressionCaseInsensitive; } regex = [regex initWithPattern: aString options: options error: &e]; if (nil == e) { options = ((mask & NSAnchoredSearch) == NSAnchoredSearch) ? NSMatchingAnchored : 0; r = [regex rangeOfFirstMatchInString: self options: options range: searchRange]; } [regex release]; return r; } countOther = [aString length]; /* A zero length string is always found at the start of the given range. */ if (0 == countOther) { if ((mask & NSBackwardsSearch) == NSBackwardsSearch) { searchRange.location += searchRange.length; } searchRange.length = 0; return searchRange; } /* If the string to search for is a single codepoint which is not * decomposable to a sequence, then it can only match the identical * codepoint, so we can perform the much cheaper literal search. */ if (1 == countOther) { unichar u = [aString characterAtIndex: 0]; if ((mask & NSLiteralSearch) == NSLiteralSearch || uni_is_decomp(u)) { NSRange result; if (searchRange.length < countOther) { /* Range to search is smaller than string to look for. */ result = NSMakeRange(NSNotFound, 0); } else if ((mask & NSAnchoredSearch) == NSAnchoredSearch || searchRange.length == 1) { /* Range to search is a single character. */ if ((mask & NSBackwardsSearch) == NSBackwardsSearch) { searchRange.location = NSMaxRange(searchRange) - 1; } if ((mask & NSCaseInsensitiveSearch) == NSCaseInsensitiveSearch) { u = uni_toupper(u); if (uni_toupper([self characterAtIndex: searchRange.location]) == u) { result = searchRange; } else { result = NSMakeRange(NSNotFound, 0); } } else { if ([self characterAtIndex: searchRange.location] == u) { result = searchRange; } else { result = NSMakeRange(NSNotFound, 0); } } } else { NSUInteger pos; NSUInteger end; /* Range to search is bigger than string to look for. */ GS_BEGINITEMBUF2(charsSelf, (searchRange.length*sizeof(unichar)), unichar) [self getCharacters: charsSelf range: searchRange]; end = searchRange.length; if ((mask & NSCaseInsensitiveSearch) == NSCaseInsensitiveSearch) { u = uni_toupper(u); if ((mask & NSBackwardsSearch) == NSBackwardsSearch) { pos = end; while (pos-- > 0) { if (uni_toupper(charsSelf[pos]) == u) { break; } } } else { pos = 0; while (pos < end) { if (uni_toupper(charsSelf[pos]) == u) { break; } pos++; } } } else { if ((mask & NSBackwardsSearch) == NSBackwardsSearch) { pos = end; while (pos-- > 0) { if (charsSelf[pos] == u) { break; } } } else { pos = 0; while (pos < end) { if (charsSelf[pos] == u) { break; } pos++; } } } GS_ENDITEMBUF2() if (pos >= end) { result = NSMakeRange(NSNotFound, 0); } else { result = NSMakeRange(searchRange.location + pos, countOther); } } return result; } } if ((mask & NSLiteralSearch) == NSLiteralSearch) { NSRange result; BOOL insensitive; if ((mask & NSCaseInsensitiveSearch) == NSCaseInsensitiveSearch) { insensitive = YES; } else { insensitive = NO; } if (searchRange.length < countOther) { /* Range to search is smaller than string to look for. */ result = NSMakeRange(NSNotFound, 0); } else { GS_BEGINITEMBUF(charsOther, (countOther*sizeof(unichar)), unichar) [aString getCharacters: charsOther range: NSMakeRange(0, countOther)]; if (YES == insensitive) { NSUInteger index; /* Make the substring we are searching for be uppercase. */ for (index = 0; index < countOther; index++) { charsOther[index] = uni_toupper(charsOther[index]); } } if ((mask & NSAnchoredSearch) == NSAnchoredSearch || searchRange.length == countOther) { /* Range to search is same size as string to look for. */ GS_BEGINITEMBUF2(charsSelf, (countOther*sizeof(unichar)), unichar) if ((mask & NSBackwardsSearch) == NSBackwardsSearch) { searchRange.location = NSMaxRange(searchRange) - countOther; searchRange.length = countOther; } else { searchRange.length = countOther; } [self getCharacters: charsSelf range: searchRange]; if (YES == insensitive) { NSUInteger index; for (index = 0; index < countOther; index++) { if (uni_toupper(charsSelf[index]) != charsOther[index]) { break; } } if (index < countOther) { result = NSMakeRange(NSNotFound, 0); } else { result = searchRange; } } else { if (memcmp(&charsSelf[0], &charsOther[0], countOther * sizeof(unichar)) == 0) { result = searchRange; } else { result = NSMakeRange(NSNotFound, 0); } } GS_ENDITEMBUF2() } else { NSUInteger pos; NSUInteger end; end = searchRange.length - countOther + 1; if ((mask & NSBackwardsSearch) == NSBackwardsSearch) { pos = end; } else { pos = 0; } /* Range to search is bigger than string to look for. */ GS_BEGINITEMBUF2(charsSelf, (searchRange.length*sizeof(unichar)), unichar) [self getCharacters: charsSelf range: searchRange]; if (YES == insensitive) { NSUInteger count; NSUInteger index; /* Make things uppercase in the string being searched * Start with all but one of the characters in a substring * and we'll uppercase one more character each time we do * a comparison. */ index = pos; for (count = 1; count < countOther; count++) { charsSelf[index] = uni_toupper(charsSelf[index]); index++; } } if ((mask & NSBackwardsSearch) == NSBackwardsSearch) { if (YES == insensitive) { while (pos-- > 0) { charsSelf[pos] = uni_toupper(charsSelf[pos]); if (memcmp(&charsSelf[pos], charsOther, countOther * sizeof(unichar)) == 0) { break; } } } else { while (pos-- > 0) { if (memcmp(&charsSelf[pos], charsOther, countOther * sizeof(unichar)) == 0) { break; } } } } else { if (YES == insensitive) { while (pos < end) { charsSelf[pos + countOther - 1] = uni_toupper(charsSelf[pos + countOther - 1]); if (memcmp(&charsSelf[pos], charsOther, countOther * sizeof(unichar)) == 0) { break; } pos++; } } else { while (pos < end) { if (memcmp(&charsSelf[pos], charsOther, countOther * sizeof(unichar)) == 0) { break; } pos++; } } } if (pos >= end) { result = NSMakeRange(NSNotFound, 0); } else { result = NSMakeRange(searchRange.location + pos, countOther); } GS_ENDITEMBUF2() } GS_ENDITEMBUF() } return result; } #if GS_USE_ICU == 1 { UCollator *coll = GSICUCollatorOpen(mask, locale); if (NULL != coll) { NSRange result = NSMakeRange(NSNotFound, 0); UErrorCode status = U_ZERO_ERROR; NSUInteger countSelf = searchRange.length; UStringSearch *search = NULL; GS_BEGINITEMBUF(charsSelf, (countSelf * sizeof(unichar)), unichar) GS_BEGINITEMBUF2(charsOther, (countOther * sizeof(unichar)), unichar) // Copy to buffer [self getCharacters: charsSelf range: searchRange]; [aString getCharacters: charsOther range: NSMakeRange(0, countOther)]; search = usearch_openFromCollator(charsOther, countOther, charsSelf, countSelf, coll, NULL, &status); if (search != NULL && U_SUCCESS(status)) { int32_t matchLocation; int32_t matchLength; if ((mask & NSBackwardsSearch) == NSBackwardsSearch) { matchLocation = usearch_last(search, &status); } else { matchLocation = usearch_first(search, &status); } matchLength = usearch_getMatchedLength(search); if (matchLocation != USEARCH_DONE && matchLength != 0) { if ((mask & NSAnchoredSearch) == NSAnchoredSearch) { if ((mask & NSBackwardsSearch) == NSBackwardsSearch) { if (matchLocation + matchLength == NSMaxRange(searchRange)) { result = NSMakeRange(searchRange.location + matchLocation, matchLength); } } else { if (matchLocation == 0) { result = NSMakeRange(searchRange.location + matchLocation, matchLength); } } } else { result = NSMakeRange(searchRange.location + matchLocation, matchLength); } } } GS_ENDITEMBUF2() GS_ENDITEMBUF() usearch_close(search); ucol_close(coll); return result; } } #endif return strRangeNsNs(self, aString, mask, searchRange); } - (NSUInteger) indexOfString: (NSString *)substring { NSRange range = {0, [self length]}; range = [self rangeOfString: substring options: 0 range: range locale: nil]; return range.length ? range.location : NSNotFound; } - (NSUInteger) indexOfString: (NSString*)substring fromIndex: (NSUInteger)index { NSRange range = {index, [self length] - index}; range = [self rangeOfString: substring options: 0 range: range locale: nil]; return range.length ? range.location : NSNotFound; } // Determining Composed Character Sequences /** * Unicode utility method. If character at anIndex is part of a composed * character sequence anIndex (note indices start from 0), returns the full * range of this sequence. */ - (NSRange) rangeOfComposedCharacterSequenceAtIndex: (NSUInteger)anIndex { unsigned start; unsigned end; unsigned length = [self length]; unichar ch; unichar (*caiImp)(NSString*, SEL, NSUInteger); if (anIndex >= length) [NSException raise: NSRangeException format:@"Invalid location."]; caiImp = (unichar (*)(NSString*,SEL,NSUInteger)) [self methodForSelector: caiSel]; for (start = anIndex; start > 0; start--) { ch = (*caiImp)(self, caiSel, start); if (uni_isnonsp(ch) == NO) break; } for (end = start+1; end < length; end++) { ch = (*caiImp)(self, caiSel, end); if (uni_isnonsp(ch) == NO) break; } return NSMakeRange(start, end-start); } - (NSRange) rangeOfComposedCharacterSequencesForRange: (NSRange)range { NSRange startRange; startRange = [self rangeOfComposedCharacterSequenceAtIndex: range.location]; if (NSMaxRange(startRange) >= NSMaxRange(range)) { return startRange; } else { NSUInteger index; NSRange endRange; index = NSMaxRange(range) - 1; endRange = [self rangeOfComposedCharacterSequenceAtIndex: index]; return NSUnionRange(startRange, endRange); } } // Identifying and Comparing Strings /** *

Compares this instance with aString. Returns * NSOrderedAscending, NSOrderedDescending, or * NSOrderedSame, depending on whether this instance occurs * before or after string in lexical order, or is equal to it.

*/ - (NSComparisonResult) compare: (NSString*)aString { return [self compare: aString options: 0]; } /** *

Compares this instance with aString. mask may be either * NSCaseInsensitiveSearch or NSLiteralSearch. The * latter requests a literal byte-by-byte comparison, which is fastest but may * return inaccurate results in cases where two different composed character * sequences may be used to express the same character.

*/ - (NSComparisonResult) compare: (NSString*)aString options: (NSUInteger)mask { return [self compare: aString options: mask range: ((NSRange){0, [self length]})]; } /** *

Compares this instance with string. mask may be either * NSCaseInsensitiveSearch or NSLiteralSearch. The * latter requests a literal byte-by-byte comparison, which is fastest but may * return inaccurate results in cases where two different composed character * sequences may be used to express the same character. aRange refers * to this instance, and should be set to 0..length to compare the whole * string.

*/ // xxx Should implement full POSIX.2 collate - (NSComparisonResult) compare: (NSString*)aString options: (NSUInteger)mask range: (NSRange)aRange { return [self compare: aString options: mask range: aRange locale: nil]; } /** * Returns whether this string starts with aString. */ - (BOOL) hasPrefix: (NSString*)aString { NSRange range = NSMakeRange(0, [self length]); NSUInteger mask = NSLiteralSearch | NSAnchoredSearch; range = [self rangeOfString: aString options: mask range: range locale: nil]; return (range.length > 0) ? YES : NO; } /** * Returns whether this string ends with aString. */ - (BOOL) hasSuffix: (NSString*)aString { NSRange range = NSMakeRange(0, [self length]); NSUInteger mask = NSLiteralSearch | NSAnchoredSearch | NSBackwardsSearch; range = [self rangeOfString: aString options: mask range: range locale: nil]; return (range.length > 0) ? YES : NO; } /** * Returns whether the receiver and an anObject are equals as strings. * If anObject isn't an NSString, returns NO. */ - (BOOL) isEqual: (id)anObject { if (anObject == self) { return YES; } if (anObject != nil && [anObject isKindOfClass: NSStringClass]) { return [self isEqualToString: anObject]; } return NO; } /** * Returns whether this instance is equal as a string to aString. See also * -compare: and related methods. */ - (BOOL) isEqualToString: (NSString*)aString { if (aString == self) { return YES; } if (nil == aString || [self hash] != [aString hash]) { return NO; } if (strCompNsNs(self, aString, 0, (NSRange){0, [self length]}) == NSOrderedSame) { return YES; } return NO; } /** * Return 28-bit hash value (in 32-bit integer). The top few bits are used * for other purposes in a bitfield in the concrete string subclasses, so we * must not use the full unsigned integer. */ - (NSUInteger) hash { uint32_t ret = 0; int len = (int)[self length]; if (len > 0) { static const int buf_size = 64; unichar buf[buf_size]; int idx = 0; uint32_t s0 = 0; uint32_t s1 = 0; while (idx < len) { int l = MIN(len-idx, buf_size); [self getCharacters: buf range: NSMakeRange(idx,l)]; GSPrivateIncrementalHash(&s0, &s1, buf, l * sizeof(unichar)); idx += l; } ret = GSPrivateFinishHash(s0, s1, len * sizeof(unichar)); /* * The hash caching in our concrete string classes uses zero to denote * an empty cache value, so we MUST NOT return a hash of zero. */ ret &= 0x0fffffff; if (ret == 0) { ret = 0x0fffffff; } return ret; } else { return 0x0ffffffe; /* Hash for an empty string. */ } } // Getting a Shared Prefix /** * Returns the largest initial portion of this instance shared with aString. * mask may be either NSCaseInsensitiveSearch or * NSLiteralSearch. The latter requests a literal byte-by-byte * comparison, which is fastest but may return inaccurate results in cases * where two different composed character sequences may be used to express * the same character. */ - (NSString*) commonPrefixWithString: (NSString*)aString options: (NSUInteger)mask { if (mask & NSLiteralSearch) { int prefix_len = 0; unsigned length = [self length]; unsigned aLength = [aString length]; unichar *u; unichar a1[length+1]; unichar *s1 = a1; unichar a2[aLength+1]; unichar *s2 = a2; [self getCharacters: s1 range: ((NSRange){0, length})]; s1[length] = (unichar)0; [aString getCharacters: s2 range: ((NSRange){0, aLength})]; s2[aLength] = (unichar)0; u = s1; if (mask & NSCaseInsensitiveSearch) { while (*s1 && *s2 && (uni_tolower(*s1) == uni_tolower(*s2))) { s1++; s2++; prefix_len++; } } else { while (*s1 && *s2 && (*s1 == *s2)) { s1++; s2++; prefix_len++; } } return [NSStringClass stringWithCharacters: u length: prefix_len]; } else { unichar (*scImp)(NSString*, SEL, NSUInteger); unichar (*ocImp)(NSString*, SEL, NSUInteger); void (*sgImp)(NSString*, SEL, unichar*, NSRange) = 0; void (*ogImp)(NSString*, SEL, unichar*, NSRange) = 0; NSRange (*srImp)(NSString*, SEL, NSUInteger) = 0; NSRange (*orImp)(NSString*, SEL, NSUInteger) = 0; BOOL gotRangeImps = NO; BOOL gotFetchImps = NO; NSRange sRange; NSRange oRange; unsigned sLength = [self length]; unsigned oLength = [aString length]; unsigned sIndex = 0; unsigned oIndex = 0; if (!sLength) return IMMUTABLE(self); if (!oLength) return IMMUTABLE(aString); scImp = (unichar (*)(NSString*,SEL,NSUInteger)) [self methodForSelector: caiSel]; ocImp = (unichar (*)(NSString*,SEL,NSUInteger)) [aString methodForSelector: caiSel]; while ((sIndex < sLength) && (oIndex < oLength)) { unichar sc = (*scImp)(self, caiSel, sIndex); unichar oc = (*ocImp)(aString, caiSel, oIndex); if (sc == oc) { sIndex++; oIndex++; } else if ((mask & NSCaseInsensitiveSearch) && (uni_tolower(sc) == uni_tolower(oc))) { sIndex++; oIndex++; } else { if (gotRangeImps == NO) { gotRangeImps = YES; srImp=(NSRange (*)())[self methodForSelector: ranSel]; orImp=(NSRange (*)())[aString methodForSelector: ranSel]; } sRange = (*srImp)(self, ranSel, sIndex); oRange = (*orImp)(aString, ranSel, oIndex); if ((sRange.length < 2) || (oRange.length < 2)) return [self substringWithRange: NSMakeRange(0, sIndex)]; else { GSEQ_MAKE(sBuf, sSeq, sRange.length); GSEQ_MAKE(oBuf, oSeq, oRange.length); if (gotFetchImps == NO) { gotFetchImps = YES; sgImp=(void (*)())[self methodForSelector: gcrSel]; ogImp=(void (*)())[aString methodForSelector: gcrSel]; } (*sgImp)(self, gcrSel, sBuf, sRange); (*ogImp)(aString, gcrSel, oBuf, oRange); if (GSeq_compare(&sSeq, &oSeq) == NSOrderedSame) { sIndex += sRange.length; oIndex += oRange.length; } else if (mask & NSCaseInsensitiveSearch) { GSeq_lowercase(&sSeq); GSeq_lowercase(&oSeq); if (GSeq_compare(&sSeq, &oSeq) == NSOrderedSame) { sIndex += sRange.length; oIndex += oRange.length; } else return [self substringWithRange: NSMakeRange(0,sIndex)]; } else return [self substringWithRange: NSMakeRange(0,sIndex)]; } } } return [self substringWithRange: NSMakeRange(0, sIndex)]; } } /** * Determines the smallest range of lines containing aRange and returns * the information as a range.
* Calls -getLineStart:end:contentsEnd:forRange: to do the work. */ - (NSRange) lineRangeForRange: (NSRange)aRange { NSUInteger startIndex; NSUInteger lineEndIndex; [self getLineStart: &startIndex end: &lineEndIndex contentsEnd: NULL forRange: aRange]; return NSMakeRange(startIndex, lineEndIndex - startIndex); } - (void) _getStart: (NSUInteger*)startIndex end: (NSUInteger*)lineEndIndex contentsEnd: (NSUInteger*)contentsEndIndex forRange: (NSRange)aRange lineSep: (BOOL)flag { unichar thischar; unsigned start, end, len, termlen; unichar (*caiImp)(NSString*, SEL, NSUInteger); len = [self length]; GS_RANGE_CHECK(aRange, len); caiImp = (unichar (*)())[self methodForSelector: caiSel]; /* Place aRange.location at the beginning of a CR-LF sequence */ if (aRange.location > 0 && aRange.location < len && (*caiImp)(self, caiSel, aRange.location - 1) == (unichar)'\r' && (*caiImp)(self, caiSel, aRange.location) == (unichar)'\n') { aRange.location--; } start = aRange.location; if (startIndex) { if (start == 0) { *startIndex = 0; } else { start--; while (start > 0) { BOOL done = NO; thischar = (*caiImp)(self, caiSel, start); switch (thischar) { case (unichar)0x000A: case (unichar)0x000D: case (unichar)0x2029: done = YES; break; case (unichar)0x2028: if (flag) { done = YES; break; } default: start--; break; } if (done) break; } if (start == 0) { thischar = (*caiImp)(self, caiSel, start); switch (thischar) { case (unichar)0x000A: case (unichar)0x000D: case (unichar)0x2029: start++; break; case (unichar)0x2028: if (flag) { start++; break; } default: break; } } else { start++; } *startIndex = start; } } if (lineEndIndex || contentsEndIndex) { BOOL found = NO; end = aRange.location; if (aRange.length) { end += (aRange.length - 1); } while (end < len) { thischar = (*caiImp)(self, caiSel, end); switch (thischar) { case (unichar)0x000A: case (unichar)0x000D: case (unichar)0x2029: found = YES; break; case (unichar)0x2028: if (flag) { found = YES; break; } default: break; } end++; if (found) break; } termlen = 1; if (lineEndIndex) { if (end < len && ((*caiImp)(self, caiSel, end-1) == (unichar)0x000D) && ((*caiImp)(self, caiSel, end) == (unichar)0x000A)) { *lineEndIndex = ++end; termlen = 2; } else { *lineEndIndex = end; } } if (contentsEndIndex) { if (found) { *contentsEndIndex = end-termlen; } else { /* xxx OPENSTEP documentation does not say what to do if last line is not terminated. Assume this */ *contentsEndIndex = end; } } } } /** * Determines the smallest range of lines containing aRange and returns * the locations in that range.
* Lines are delimited by any of these character sequences, the longest * (CRLF) sequence preferred. * * U+000A (linefeed) * U+000D (carriage return) * U+2028 (Unicode line separator) * U+2029 (Unicode paragraph separator) * U+000D U+000A (CRLF) * * The index of the first character of the line at or before aRange is * returned in startIndex.
* The index of the first character of the next line after the line terminator * is returned in endIndex.
* The index of the last character before the line terminator is returned * contentsEndIndex.
* Raises an NSRangeException if the range is invalid, but permits the index * arguments to be null pointers (in which case no value is returned in that * argument). */ - (void) getLineStart: (NSUInteger *)startIndex end: (NSUInteger *)lineEndIndex contentsEnd: (NSUInteger *)contentsEndIndex forRange: (NSRange)aRange { [self _getStart: startIndex end: lineEndIndex contentsEnd: contentsEndIndex forRange: aRange lineSep: YES]; } - (void) getParagraphStart: (NSUInteger *)startIndex end: (NSUInteger *)parEndIndex contentsEnd: (NSUInteger *)contentsEndIndex forRange: (NSRange)range { [self _getStart: startIndex end: parEndIndex contentsEnd: contentsEndIndex forRange: range lineSep: NO]; } // Changing Case /** * Returns version of string in which each whitespace-delimited word * is capitalized (not every letter). Conversion to capitals is done in a * unicode-compliant manner but there may be exceptional cases where behavior * is not what is desired. */ // xxx There is more than this in word capitalization in Unicode, // but this will work in most cases - (NSString*) capitalizedString { unichar *s; unsigned count = 0; BOOL found = YES; unsigned len = [self length]; if (len == 0) return IMMUTABLE(self); s = NSZoneMalloc([self zone], sizeof(unichar)*len); [self getCharacters: s range: ((NSRange){0, len})]; while (count < len) { if (GS_IS_WHITESPACE(s[count])) { count++; found = YES; while (count < len && GS_IS_WHITESPACE(s[count])) { count++; } } if (count < len) { if (found) { s[count] = uni_toupper(s[count]); count++; } else { while (count < len && !GS_IS_WHITESPACE(s[count])) { s[count] = uni_tolower(s[count]); count++; } } } found = NO; } return AUTORELEASE([[NSString allocWithZone: NSDefaultMallocZone()] initWithCharactersNoCopy: s length: len freeWhenDone: YES]); } /** * Returns a copy of the receiver with all characters converted * to lowercase. */ - (NSString*) lowercaseString { static NSCharacterSet *uc = nil; unichar *s; unsigned count; NSRange start; unsigned len = [self length]; if (len == 0) { return IMMUTABLE(self); } if (uc == nil) { uc = RETAIN([NSCharacterSet uppercaseLetterCharacterSet]); } start = [self rangeOfCharacterFromSet: uc options: NSLiteralSearch range: ((NSRange){0, len})]; if (start.length == 0) { return IMMUTABLE(self); } s = NSZoneMalloc([self zone], sizeof(unichar)*len); [self getCharacters: s range: ((NSRange){0, len})]; for (count = start.location; count < len; count++) { s[count] = uni_tolower(s[count]); } return AUTORELEASE([[NSStringClass allocWithZone: NSDefaultMallocZone()] initWithCharactersNoCopy: s length: len freeWhenDone: YES]); } /** * Returns a copy of the receiver with all characters converted * to uppercase. */ - (NSString*) uppercaseString { static NSCharacterSet *lc = nil; unichar *s; unsigned count; NSRange start; unsigned len = [self length]; if (len == 0) { return IMMUTABLE(self); } if (lc == nil) { lc = RETAIN([NSCharacterSet lowercaseLetterCharacterSet]); } start = [self rangeOfCharacterFromSet: lc options: NSLiteralSearch range: ((NSRange){0, len})]; if (start.length == 0) { return IMMUTABLE(self); } s = NSZoneMalloc([self zone], sizeof(unichar)*len); [self getCharacters: s range: ((NSRange){0, len})]; for (count = start.location; count < len; count++) { s[count] = uni_toupper(s[count]); } return AUTORELEASE([[NSStringClass allocWithZone: NSDefaultMallocZone()] initWithCharactersNoCopy: s length: len freeWhenDone: YES]); } // Storing the String /** Returns self. */ - (NSString*) description { return self; } // Getting C Strings /** * Returns a pointer to a null terminated string of 16-bit unichar * The memory pointed to is not owned by the caller, so the * caller must copy its contents to keep it. */ - (const unichar*) unicharString { NSMutableData *data; unichar *uniStr; GSOnceMLog(@"deprecated ... use cStringUsingEncoding:"); data = [NSMutableData dataWithLength: ([self length] + 1) * sizeof(unichar)]; uniStr = (unichar*)[data mutableBytes]; if (uniStr != 0) { [self getCharacters: uniStr]; } return uniStr; } /** * Returns a pointer to a null terminated string of 8-bit characters in the * default encoding. The memory pointed to is not owned by the caller, so the * caller must copy its contents to keep it. Raises an * NSCharacterConversionException if loss of information would * occur during conversion. (See -canBeConvertedToEncoding: .) */ - (const char*) cString { NSData *d; NSMutableData *m; d = [self dataUsingEncoding: _DefaultStringEncoding allowLossyConversion: NO]; if (d == nil) { [NSException raise: NSCharacterConversionException format: @"unable to convert to cString"]; } m = [d mutableCopy]; [m appendBytes: "" length: 1]; IF_NO_ARC([m autorelease];) return (const char*)[m bytes]; } /** * Returns a pointer to a null terminated string of characters in the * specified encoding.
* NB. under GNUstep you can used this to obtain a nul terminated utf-16 * string (sixteen bit characters) as well as eight bit strings.
* The memory pointed to is not owned by the caller, so the * caller must copy its contents to keep it.
* Raises an NSCharacterConversionException if loss of * information would occur during conversion. */ - (const char*) cStringUsingEncoding: (NSStringEncoding)encoding { NSMutableData *m; if (NSUnicodeStringEncoding == encoding) { unichar *u; unsigned l; l = [self length]; m = [NSMutableData dataWithLength: (l + 1) * sizeof(unichar)]; u = (unichar*)[m mutableBytes]; [self getCharacters: u]; u[l] = 0; } else { NSData *d; d = [self dataUsingEncoding: encoding allowLossyConversion: NO]; if (d == nil) { [NSException raise: NSCharacterConversionException format: @"unable to convert to cString"]; } m = [[d mutableCopy] autorelease]; [m appendBytes: "" length: 1]; } return (const char*)[m bytes]; } /** * Returns the number of bytes needed to encode the receiver in the * specified encoding (without adding a nul character terminator).
* Returns 0 if the conversion is not possible. */ - (NSUInteger) lengthOfBytesUsingEncoding: (NSStringEncoding)encoding { NSData *d; d = [self dataUsingEncoding: encoding allowLossyConversion: NO]; return [d length]; } /** * Returns a size guaranteed to be large enough to encode the receiver in the * specified encoding (without adding a nul character terminator). This may * be larger than the actual number of bytes needed. */ - (NSUInteger) maximumLengthOfBytesUsingEncoding: (NSStringEncoding)encoding { if (encoding == NSUnicodeStringEncoding) return [self length] * 2; if (encoding == NSUTF8StringEncoding) return [self length] * 6; if (encoding == NSUTF7StringEncoding) return [self length] * 8; return [self length]; // Assume single byte/char } /** * Returns a C string converted using the default C string encoding, which may * result in information loss. The memory pointed to is not owned by the * caller, so the caller must copy its contents to keep it. */ - (const char*) lossyCString { NSData *d; NSMutableData *m; d = [self dataUsingEncoding: _DefaultStringEncoding allowLossyConversion: YES]; m = [d mutableCopy]; [m appendBytes: "" length: 1]; IF_NO_ARC([m autorelease];) return (const char*)[m bytes]; } /** * Returns null-terminated UTF-8 version of this unicode string. The char[] * memory comes from an autoreleased object, so it will eventually go out of * scope. */ - (const char *) UTF8String { NSData *d; NSMutableData *m; d = [self dataUsingEncoding: NSUTF8StringEncoding allowLossyConversion: NO]; m = [d mutableCopy]; [m appendBytes: "" length: 1]; IF_NO_ARC([m autorelease];) return (const char*)[m bytes]; } /** * Returns length of a version of this unicode string converted to bytes * using the default C string encoding. If the conversion would result in * information loss, the results are unpredictable. Check * -canBeConvertedToEncoding: first. */ - (NSUInteger) cStringLength { NSData *d; d = [self dataUsingEncoding: _DefaultStringEncoding allowLossyConversion: NO]; return [d length]; } /** * Deprecated ... do not use.
. * Use -getCString:maxLength:encoding: instead. */ - (void) getCString: (char*)buffer { [self getCString: buffer maxLength: NSMaximumStringLength range: ((NSRange){0, [self length]}) remainingRange: NULL]; } /** * Deprecated ... do not use.
. * Use -getCString:maxLength:encoding: instead. */ - (void) getCString: (char*)buffer maxLength: (NSUInteger)maxLength { [self getCString: buffer maxLength: maxLength range: ((NSRange){0, [self length]}) remainingRange: NULL]; } /** * Retrieve up to maxLength bytes from the receiver into the buffer.
* In GNUstep, this method implements the actual behavior of the MacOS-X * method rather than it's documented behavior ...
* The maxLength argument must be the size (in bytes) of the area of * memory pointed to by the buffer argument.
* Returns YES on success.
* Returns NO if maxLength is too small to hold the entire string * including a terminating nul character.
* If it returns NO, the terminating nul will not have been * written to the buffer.
* Raises an exception if the string can not be converted to the * specified encoding without loss of information.
* eg. If the receiver is @"hello" then the provided buffer must be * at least six bytes long and the value of maxLength must be at least * six if NSASCIIStringEncoding is requested, but they must be at least * twelve if NSUnicodeStringEncoding is requested. */ - (BOOL) getCString: (char*)buffer maxLength: (NSUInteger)maxLength encoding: (NSStringEncoding)encoding { if (0 == maxLength || 0 == buffer) return NO; if (encoding == NSUnicodeStringEncoding) { unsigned length = [self length]; if (maxLength > length * sizeof(unichar)) { unichar *ptr = (unichar*)(void*)buffer; maxLength = (maxLength - 1) / sizeof(unichar); [self getCharacters: ptr range: NSMakeRange(0, maxLength)]; ptr[maxLength] = 0; return YES; } return NO; } else { NSData *d = [self dataUsingEncoding: encoding]; unsigned length = [d length]; BOOL result = (length < maxLength) ? YES : NO; if (d == nil) { [NSException raise: NSCharacterConversionException format: @"Can't convert to C string."]; } if (length >= maxLength) { length = maxLength-1; } memcpy(buffer, [d bytes], length); buffer[length] = '\0'; return result; } } /** * Deprecated ... do not use.
. * Use -getCString:maxLength:encoding: instead. */ - (void) getCString: (char*)buffer maxLength: (NSUInteger)maxLength range: (NSRange)aRange remainingRange: (NSRange*)leftoverRange { NSString *s; /* As this is a deprecated method, keep things simple (but inefficient) * by copying the receiver to a new instance of a base library built-in * class, and use the implementation provided by that class. * We need an autorelease to avoid a memory leak if there is an exception. */ s = AUTORELEASE([(NSString*)defaultPlaceholderString initWithString: self]); [s getCString: buffer maxLength: maxLength range: aRange remainingRange: leftoverRange]; } // Getting Numeric Values - (BOOL) boolValue { unsigned length = [self length]; if (length > 0) { unsigned index; SEL sel = @selector(characterAtIndex:); unichar (*imp)() = (unichar (*)())[self methodForSelector: sel]; for (index = 0; index < length; index++) { unichar c = (*imp)(self, sel, index); if (c > 'y') { break; } if (strchr("123456789yYtT", c) != 0) { return YES; } if (!isspace(c) && c != '0' && c != '-' && c != '+') { break; } } } return NO; } /** * Returns the string's content as a decimal.
* Undocumented feature of Aplle Foundation. */ - (NSDecimal) decimalValue { NSDecimal result; NSDecimalFromString(&result, self, nil); return result; } /** * Returns the string's content as a double. Skips leading whitespace.
* Conversion is not localised (i.e. uses '.' as the decimal separator).
* Returns 0.0 on underflow or if the string does not contain a number. */ - (double) doubleValue { double d = 0.0; [NSScanner _scanDouble: &d from: self]; return d; } /** * Returns the string's content as a float. Skips leading whitespace.
* Conversion is not localised (i.e. uses '.' as the decimal separator).
* Returns 0.0 on underflow or if the string does not contain a number. */ - (float) floatValue { double d = 0.0; [NSScanner _scanDouble: &d from: self]; return (float)d; } /** *

Returns the string's content as an int.
* Current implementation uses a C runtime library function, which does not * detect conversion errors -- use with care!

*/ - (int) intValue { const char *ptr = [self UTF8String]; while (isspace(*ptr)) { ptr++; } if ('-' == *ptr) { return (int)atoi(ptr); } else { uint64_t v; v = strtoul(ptr, 0, 10); return (int)v; } } - (NSInteger) integerValue { const char *ptr = [self UTF8String]; while (isspace(*ptr)) { ptr++; } if ('-' == *ptr) { return (NSInteger)atoll(ptr); } else { uint64_t v; v = (uint64_t)strtoull(ptr, 0, 10); return (NSInteger)v; } } - (long long) longLongValue { const char *ptr = [self UTF8String]; while (isspace(*ptr)) { ptr++; } if ('-' == *ptr) { return atoll(ptr); } else { unsigned long long l; l = strtoull(ptr, 0, 10); return (long long)l; } } // Working With Encodings /** *

* Returns the encoding used for any method accepting a C string. * This value is determined automatically from the program's * environment and cannot be changed programmatically. *

*

* You should NOT override this method in an attempt to * change the encoding being used... it won't work. *

*

* In GNUstep, this encoding is determined by the initial value * of the GNUSTEP_STRING_ENCODING environment * variable. If this is not defined, * NSISOLatin1StringEncoding is assumed. *

*/ + (NSStringEncoding) defaultCStringEncoding { return _DefaultStringEncoding; } /** * Returns an array of all available string encodings, * terminated by a null value. */ + (NSStringEncoding*) availableStringEncodings { return GSPrivateAvailableEncodings(); } /** * Returns the localized name of the encoding specified. */ + (NSString*) localizedNameOfStringEncoding: (NSStringEncoding)encoding { id ourbundle; id ourname; /* Should be path to localizable.strings file. Until we have it, just make sure that bundle is initialized. */ ourbundle = [NSBundle bundleForLibrary: @"gnustep-base"]; ourname = GSPrivateEncodingName(encoding); return [ourbundle localizedStringForKey: ourname value: ourname table: nil]; } /** * Returns whether this string can be converted to the given string encoding * without information loss. */ - (BOOL) canBeConvertedToEncoding: (NSStringEncoding)encoding { id d = [self dataUsingEncoding: encoding allowLossyConversion: NO]; return d != nil ? YES : NO; } /** * Converts string to a byte array in the given encoding, returning nil if * this would result in information loss. */ - (NSData*) dataUsingEncoding: (NSStringEncoding)encoding { return [self dataUsingEncoding: encoding allowLossyConversion: NO]; } /** * Converts string to a byte array in the given encoding. If flag is NO, * nil would be returned if this would result in information loss. */ - (NSData*) dataUsingEncoding: (NSStringEncoding)encoding allowLossyConversion: (BOOL)flag { unsigned len = [self length]; NSData *d; if (NSUnicodeStringEncoding == encoding) { unichar *u; unsigned l; /* Fast path for Unicode (UTF16) without a specific byte order, * where we must prepend a byte order mark. * The case for UTF32 is handled in the slower branch. */ u = (unichar*)NSZoneMalloc(NSDefaultMallocZone(), (len + 1) * sizeof(unichar)); *u = byteOrderMark; [self getCharacters: u + 1]; l = GSUnicode(u, len, 0, 0); d = [NSDataClass dataWithBytesNoCopy: u length: (l + 1) * sizeof(unichar)]; } else { unichar buf[8192]; unichar *u = buf; unsigned int options; unsigned char *b = 0; unsigned int l = 0; /* Build a fake object on the stack and copy unicode characters * into its buffer from the receiver. * We can then use our concrete subclass implementation to do the * work of converting to the desired encoding. */ if (NSUTF32StringEncoding == encoding) { /* For UTF32 without byte order specified, we must include a * BOM at the start of the data. */ len++; if (len >= 4096) { u = NSZoneMalloc(NSDefaultMallocZone(), len * sizeof(unichar)); } *u = byteOrderMark; [self getCharacters: u+1]; } else { if (len >= 4096) { u = NSZoneMalloc(NSDefaultMallocZone(), len * sizeof(unichar)); } [self getCharacters: u]; } if (flag == NO) { options = GSUniStrict; } else { options = 0; } if (GSFromUnicode(&b, &l, u, len, encoding, NSDefaultMallocZone(), options) == YES) { d = [NSDataClass dataWithBytesNoCopy: b length: l]; } else { d = nil; } if (u != buf) { NSZoneFree(NSDefaultMallocZone(), u); } } return d; } /** * Returns the encoding with which this string can be converted without * information loss that would result in most efficient character access. */ - (NSStringEncoding) fastestEncoding { return NSUnicodeStringEncoding; } /** * Returns the smallest encoding with which this string can be converted * without information loss. */ - (NSStringEncoding) smallestEncoding { return NSUnicodeStringEncoding; } - (NSUInteger) completePathIntoString: (NSString**)outputName caseSensitive: (BOOL)flag matchesIntoArray: (NSArray**)outputArray filterTypes: (NSArray*)filterTypes { NSString *basePath = [self stringByDeletingLastPathComponent]; NSString *lastComp = [self lastPathComponent]; NSString *tmpPath; NSDirectoryEnumerator *e; NSMutableArray *op = nil; unsigned matchCount = 0; if (outputArray != 0) { op = (NSMutableArray*)[NSMutableArray array]; } if (outputName != NULL) { *outputName = nil; } if ([basePath length] == 0) { basePath = @"."; } e = [[NSFileManager defaultManager] enumeratorAtPath: basePath]; while (tmpPath = [e nextObject], tmpPath) { /* Prefix matching */ if (flag == YES) { /* Case sensitive */ if ([tmpPath hasPrefix: lastComp] == NO) { continue; } } else if ([[tmpPath uppercaseString] hasPrefix: [lastComp uppercaseString]] == NO) { continue; } /* Extensions filtering */ if (filterTypes && ([filterTypes containsObject: [tmpPath pathExtension]] == NO)) { continue; } /* Found a completion */ matchCount++; if (outputArray != NULL) { [op addObject: tmpPath]; } if ((outputName != NULL) && ((*outputName == nil) || (([*outputName length] < [tmpPath length])))) { *outputName = tmpPath; } } if (outputArray != NULL) { *outputArray = AUTORELEASE([op copy]); } return matchCount; } static NSFileManager *fm = nil; #if defined(_WIN32) - (const GSNativeChar*) fileSystemRepresentation { if (fm == nil) { fm = RETAIN([NSFileManager defaultManager]); } return [fm fileSystemRepresentationWithPath: self]; } - (BOOL) getFileSystemRepresentation: (GSNativeChar*)buffer maxLength: (NSUInteger)size { const unichar *ptr; unsigned i; if (size == 0) { return NO; } if (buffer == 0) { [NSException raise: NSInvalidArgumentException format: @"%@ given null pointer", NSStringFromSelector(_cmd)]; } ptr = [self fileSystemRepresentation]; for (i = 0; i < size; i++) { buffer[i] = ptr[i]; if (ptr[i] == 0) { break; } } if (i == size && ptr[i] != 0) { return NO; // Not at end. } return YES; } #else - (const GSNativeChar*) fileSystemRepresentation { if (fm == nil) { fm = RETAIN([NSFileManager defaultManager]); } return [fm fileSystemRepresentationWithPath: self]; } - (BOOL) getFileSystemRepresentation: (GSNativeChar*)buffer maxLength: (NSUInteger)size { const char* ptr; if (size == 0) { return NO; } if (buffer == 0) { [NSException raise: NSInvalidArgumentException format: @"%@ given null pointer", NSStringFromSelector(_cmd)]; } ptr = [self fileSystemRepresentation]; if (strlen(ptr) > size) { return NO; } strncpy(buffer, ptr, size); return YES; } #endif - (NSString*) lastPathComponent { unsigned int l = [self length]; NSRange range; unsigned int i; if (l == 0) { return @""; // self is empty } // Skip back over any trailing path separators, but not in to root. i = rootOf(self, l); while (l > i && pathSepMember([self characterAtIndex: l-1]) == YES) { l--; } // If only the root is left, return it. if (i == l) { /* * NB. tilde escapes should not have trailing separator in the * path component as they are not trreated as true roots. */ if ([self characterAtIndex: 0] == '~' && pathSepMember([self characterAtIndex: i-1]) == YES) { return [self substringToIndex: i-1]; } return [self substringToIndex: i]; } // Got more than root ... find last component. range = [self rangeOfCharacterFromSet: pathSeps() options: NSBackwardsSearch range: ((NSRange){i, l-i})]; if (range.length > 0) { // Found separator ... adjust to point to component. i = NSMaxRange(range); } return [self substringWithRange: ((NSRange){i, l-i})]; } - (NSRange) paragraphRangeForRange: (NSRange)range { NSUInteger startIndex; NSUInteger endIndex; [self getParagraphStart: &startIndex end: &endIndex contentsEnd: NULL forRange: range]; return NSMakeRange(startIndex, endIndex - startIndex); } - (NSString*) pathExtension { NSRange range; unsigned int l = [self length]; unsigned int root; if (l == 0) { return @""; } root = rootOf(self, l); /* * Step past trailing path separators. */ while (l > root && pathSepMember([self characterAtIndex: l-1]) == YES) { l--; } range = NSMakeRange(root, l-root); /* * Look for a dot in the path ... if there isn't one, or if it is * immediately after the root or a path separator, there is no extension. */ range = [self rangeOfString: @"." options: NSBackwardsSearch range: range locale: nil]; if (range.length > 0 && range.location > root && pathSepMember([self characterAtIndex: range.location-1]) == NO) { NSRange sepRange; /* * Found a dot, so we determine the range of the (possible) * path extension, then check to see if we have a path * separator within it ... if we have a path separator then * the dot is inside the last path component and there is * therefore no extension. */ range.location++; range.length = l - range.location; sepRange = [self rangeOfCharacterFromSet: pathSeps() options: NSBackwardsSearch range: range]; if (sepRange.length == 0) { return [self substringFromRange: range]; } } return @""; } - (NSString *) precomposedStringWithCompatibilityMapping { #if (GS_USE_ICU == 1) && (defined(HAVE_UNICODE_UNORM2_H) || defined(HAVE_ICU_H)) return [self _normalizedICUStringOfType: "nfkc" mode: UNORM2_COMPOSE]; #else return [self notImplemented: _cmd]; #endif } - (NSString *) precomposedStringWithCanonicalMapping { #if (GS_USE_ICU == 1) && (defined(HAVE_UNICODE_UNORM2_H) || defined(HAVE_ICU_H)) return [self _normalizedICUStringOfType: "nfc" mode: UNORM2_COMPOSE]; #else return [self notImplemented: _cmd]; #endif } - (NSString*) stringByAppendingPathComponent: (NSString*)aString { unsigned originalLength = [self length]; unsigned length = originalLength; unsigned aLength = [aString length]; unsigned root; unichar buf[length+aLength+1]; root = rootOf(aString, aLength); if (length == 0) { [aString getCharacters: buf range: ((NSRange){0, aLength})]; length = aLength; root = rootOf(aString, aLength); } else { /* If the 'component' has a leading path separator (or drive spec * in windows) then we need to find its length so we can strip it. */ if (root > 0) { unichar c = [aString characterAtIndex: 0]; if (c == '~') { root = 0; } else if (root > 1 && pathSepMember(c)) { int i; for (i = 1; i < root; i++) { c = [aString characterAtIndex: i]; if (!pathSepMember(c)) { break; } } root = i; } } [self getCharacters: buf range: ((NSRange){0, length})]; /* We strip back trailing path separators, and replace them with * a single one ... except in the case where we have a windows * drive specification, and the string being appended does not * have a path separator as a root. In that case we just want to * append to the drive specification directly, leaving a relative * path like c:foo */ if (length != 2 || buf[1] != ':' || GSPathHandlingUnix() == YES || buf[0] < 'A' || buf[0] > 'z' || (buf[0] > 'Z' && buf[0] < 'a') || (root > 0 && pathSepMember([aString characterAtIndex: root-1]))) { while (length > 0 && pathSepMember(buf[length-1]) == YES) { length--; } buf[length++] = pathSepChar(); } if ((aLength - root) > 0) { // appending .. discard root from aString [aString getCharacters: &buf[length] range: ((NSRange){root, aLength-root})]; length += aLength-root; } // Find length of root part of new path. root = rootOf(self, originalLength); } if (length > 0) { /* Trim trailing path separators as long as they are not part of * the root. */ aLength = length - 1; while (aLength > root && pathSepMember(buf[aLength]) == YES) { aLength--; length--; } /* Trim multi separator sequences outside root (root may contain an * initial // pair if it is a windows UNC path). */ if (length > 0) { while (aLength > root) { if (pathSepMember(buf[aLength]) == YES) { buf[aLength] = pathSepChar(); if (pathSepMember(buf[aLength-1]) == YES) { unsigned pos; buf[aLength-1] = pathSepChar(); for (pos = aLength+1; pos < length; pos++) { buf[pos-1] = buf[pos]; } length--; } } aLength--; } } } return [NSStringClass stringWithCharacters: buf length: length]; } - (NSString*) stringByAppendingPathExtension: (NSString*)aString { unsigned l = [self length]; unsigned originalLength = l; unsigned root; if (l == 0) { NSLog(@"[%@-%@] cannot append extension '%@' to empty string", NSStringFromClass([self class]), NSStringFromSelector(_cmd), aString); return @""; // Must have a file name to append extension. } root = rootOf(self, l); /* * Step past trailing path separators. */ while (l > root && pathSepMember([self characterAtIndex: l-1]) == YES) { l--; } if (root == l) { NSLog(@"[%@-%@] cannot append extension '%@' to path '%@'", NSStringFromClass([self class]), NSStringFromSelector(_cmd), aString, self); return IMMUTABLE(self); // Must have a file name to append extension. } /* MacOS-X prohibits an extension beginning with a path separator, * but this code extends that a little to prohibit any root except * one beginning with '~' from being used as an extension. */ root = rootOf(aString, [aString length]); if (root > 0 && [aString characterAtIndex: 0] != '~') { NSLog(@"[%@-%@] cannot append extension '%@' to path '%@'", NSStringFromClass([self class]), NSStringFromSelector(_cmd), aString, self); return IMMUTABLE(self); // Must have a file name to append extension. } if (originalLength != l) { NSRange range = NSMakeRange(0, l); return [[self substringFromRange: range] stringByAppendingFormat: @".%@", aString]; } return [self stringByAppendingFormat: @".%@", aString]; } - (NSString*) stringByDeletingLastPathComponent { unsigned int length; unsigned int root; unsigned int end; unsigned int i; end = length = [self length]; if (length == 0) { return @""; } i = root = rootOf(self, length); /* * Any root without a trailing path separator can be deleted * as it's either a relative path or a tilde expression. */ if (i == length && pathSepMember([self characterAtIndex: i-1]) == NO) { return @""; // Delete relative root } /* * Step past trailing path separators. */ while (end > i && pathSepMember([self characterAtIndex: end-1]) == YES) { end--; } /* * If all we have left is the root, return that root, except for the * special case of a tilde expression ... which may be deleted even * when it is followed by a separator. */ if (end == i) { if ([self characterAtIndex: 0] == '~') { return @""; // Tilde roots may be deleted. } return [self substringToIndex: i]; // Return root component. } else { NSString *result; unichar *to; unsigned o; unsigned lastComponent = root; GS_BEGINITEMBUF(from, (end * 2 * sizeof(unichar)), unichar) to = from + end; [self getCharacters: from range: NSMakeRange(0, end)]; for (o = 0; o < root; o++) { to[o] = from[o]; } for (i = root; i < end; i++) { if (pathSepMember(from[i])) { if (o > lastComponent) { to[o++] = from[i]; lastComponent = o; } } else { to[o++] = from[i]; } } if (lastComponent > root) { o = lastComponent - 1; } else { o = root; } result = [NSString stringWithCharacters: to length: o]; GS_ENDITEMBUF(); return result; } } - (NSString*) stringByDeletingPathExtension { NSRange range; NSRange r0; NSRange r1; NSString *substring; unsigned l = [self length]; unsigned root; if ((root = rootOf(self, l)) == l) { return IMMUTABLE(self); } /* * Skip past any trailing path separators... but not into root. */ while (l > root && pathSepMember([self characterAtIndex: l-1]) == YES) { l--; } range = NSMakeRange(root, l-root); /* * Locate path extension. */ r0 = [self rangeOfString: @"." options: NSBackwardsSearch range: range locale: nil]; /* * Locate a path separator. */ r1 = [self rangeOfCharacterFromSet: pathSeps() options: NSBackwardsSearch range: range]; /* * Assuming the extension separator was found in the last path * component, set the length of the substring we want. */ if (r0.length > 0 && r0.location > root && (r1.length == 0 || r1.location < r0.location)) { l = r0.location; } substring = [self substringToIndex: l]; return substring; } - (NSString*) stringByExpandingTildeInPath { NSString *homedir; NSRange firstSlashRange; unsigned length; if ((length = [self length]) == 0) { return IMMUTABLE(self); } if ([self characterAtIndex: 0] != 0x007E) { return IMMUTABLE(self); } /* FIXME ... should remove in future * Anything beginning '~@' is assumed to be a windows path specification * which can't be expanded. */ if (length > 1 && [self characterAtIndex: 1] == 0x0040) { return IMMUTABLE(self); } firstSlashRange = [self rangeOfCharacterFromSet: pathSeps() options: NSLiteralSearch range: ((NSRange){0, length})]; if (firstSlashRange.length == 0) { firstSlashRange.location = length; } /* FIXME ... should remove in future * Anything beginning '~' followed by a single letter is assumed * to be a windows drive specification. */ if (firstSlashRange.location == 2 && isalpha([self characterAtIndex: 1])) { return IMMUTABLE(self); } if (firstSlashRange.location != 1) { /* It is of the form `~username/blah/...' or '~username' */ int userNameLen; NSString *uname; if (firstSlashRange.length != 0) { userNameLen = firstSlashRange.location - 1; } else { /* It is actually of the form `~username' */ userNameLen = [self length] - 1; firstSlashRange.location = [self length]; } uname = [self substringWithRange: ((NSRange){1, userNameLen})]; homedir = NSHomeDirectoryForUser(uname); } else { /* It is of the form `~/blah/...' or is '~' */ homedir = NSHomeDirectory(); } if (homedir != nil) { if (firstSlashRange.location < length) { return [homedir stringByAppendingPathComponent: [self substringFromIndex: firstSlashRange.location]]; } else { return IMMUTABLE(homedir); } } else { return IMMUTABLE(self); } } - (NSString*) stringByAbbreviatingWithTildeInPath { NSString *homedir; if (YES == [self hasPrefix: @"~"]) { return IMMUTABLE(self); } homedir = NSHomeDirectory(); if (NO == [self hasPrefix: homedir]) { /* OSX compatibility ... we clean up the path to try to get a * home directory we can abbreviate. */ self = [self stringByStandardizingPath]; if (NO == [self hasPrefix: homedir]) { return IMMUTABLE(self); } } if ([self length] == [homedir length]) { return @"~"; } return [@"~" stringByAppendingPathComponent: [self substringFromIndex: [homedir length]]]; } /** * Returns a string formed by extending or truncating the receiver to * newLength characters. If the new string is larger, it is padded * by appending characters from padString (appending it as many times * as required). The first character from padString to be appended * is specified by padIndex.
*/ - (NSString*) stringByPaddingToLength: (NSUInteger)newLength withString: (NSString*)padString startingAtIndex: (NSUInteger)padIndex { unsigned length = [self length]; unsigned padLength; if (padString == nil || [padString isKindOfClass: [NSString class]] == NO) { [NSException raise: NSInvalidArgumentException format: @"%@ - Illegal pad string", NSStringFromSelector(_cmd)]; } padLength = [padString length]; if (padIndex >= padLength) { [NSException raise: NSRangeException format: @"%@ - pad index larger too big", NSStringFromSelector(_cmd)]; } if (newLength == length) { return IMMUTABLE(self); } else if (newLength < length) { return [self substringToIndex: newLength]; } else { length = newLength - length; // What we want to add. if (length <= (padLength - padIndex)) { NSRange r; r = NSMakeRange(padIndex, length); return [self stringByAppendingString: [padString substringWithRange: r]]; } else { NSMutableString *m = [self mutableCopy]; if (padIndex > 0) { NSRange r; r = NSMakeRange(padIndex, padLength - padIndex); [m appendString: [padString substringWithRange: r]]; length -= r.length; } /* * In case we have to append a small string lots of times, * we cache the method impllementation to do it. */ if (length >= padLength) { void (*appImp)(NSMutableString*, SEL, NSString*); SEL appSel; appSel = @selector(appendString:); appImp = (void (*)(NSMutableString*, SEL, NSString*)) [m methodForSelector: appSel]; while (length >= padLength) { (*appImp)(m, appSel, padString); length -= padLength; } } if (length > 0) { [m appendString: [padString substringWithRange: NSMakeRange(0, length)]]; } return AUTORELEASE(m); } } } /** * Returns a string created by replacing percent escape sequences in the * receiver assuming that the resulting data represents characters in * the specified encoding.
* Returns nil if the result is not a string in the specified encoding. */ - (NSString*) stringByReplacingPercentEscapesUsingEncoding: (NSStringEncoding)e { NSMutableData *d; NSString *s = nil; d = [[self dataUsingEncoding: NSASCIIStringEncoding] mutableCopy]; if (d != nil) { unsigned char *p = (unsigned char*)[d mutableBytes]; unsigned l = [d length]; unsigned i = 0; unsigned j = 0; while (i < l) { unsigned char t; if ((t = p[i++]) == '%') { unsigned char c; if (i >= l) { DESTROY(d); break; } t = p[i++]; if (isxdigit(t)) { if (t <= '9') { c = t - '0'; } else if (t <= 'F') { c = t - 'A' + 10; } else { c = t - 'a' + 10; } } else { DESTROY(d); break; } c <<= 4; if (i >= l) { DESTROY(d); break; } t = p[i++]; if (isxdigit(t)) { if (t <= '9') { c |= t - '0'; } else if (t <= 'F') { c |= t - 'A' + 10; } else { c |= t - 'a' + 10; } } else { DESTROY(d); break; } p[j++] = c; } else { p[j++] = t; } } [d setLength: j]; s = AUTORELEASE([[NSString alloc] initWithData: d encoding: e]); RELEASE(d); } return s; } - (NSString*) stringByResolvingSymlinksInPath { NSString *s = self; if (0 == [s length]) { return @""; } if ('~' == [s characterAtIndex: 0]) { s = [s stringByExpandingTildeInPath]; } #if defined(_WIN32) return IMMUTABLE(s); #else { #if defined(__GLIBC__) || defined(__FreeBSD__) #define GS_MAXSYMLINKS sysconf(_SC_SYMLOOP_MAX) #else #define GS_MAXSYMLINKS MAXSYMLINKS #endif #ifndef PATH_MAX #define PATH_MAX 1024 /* Don't use realpath unless we know we have the correct path size limit */ #ifdef HAVE_REALPATH #undef HAVE_REALPATH #endif #endif char newBuf[PATH_MAX]; #ifdef HAVE_REALPATH if (realpath([s fileSystemRepresentation], newBuf) == 0) return IMMUTABLE(s); #else char extra[PATH_MAX]; char *dest; const char *name = [s fileSystemRepresentation]; const char *start; const char *end; unsigned num_links = 0; if (name[0] != '/') { if (!getcwd(newBuf, PATH_MAX)) { return IMMUTABLE(s); /* Couldn't get directory. */ } dest = strchr(newBuf, '\0'); } else { newBuf[0] = '/'; dest = &newBuf[1]; } for (start = end = name; *start; start = end) { struct stat st; int n; int len; /* Elide repeated path separators */ while (*start == '/') { start++; } /* Locate end of path component */ end = start; while (*end && *end != '/') { end++; } len = end - start; if (len == 0) { break; /* End of path. */ } else if (len == 1 && *start == '.') { /* Elide '/./' sequence by ignoring it. */ } else if (len == 2 && strncmp(start, "..", len) == 0) { /* * Backup - if we are not at the root, remove the last component. */ if (dest > &newBuf[1]) { do { dest--; } while (dest[-1] != '/'); } } else { if (dest[-1] != '/') { *dest++ = '/'; } if (&dest[len] >= &newBuf[PATH_MAX]) { return IMMUTABLE(s); /* Resolved name too long. */ } memmove(dest, start, len); dest += len; *dest = '\0'; if (lstat(newBuf, &st) < 0) { return IMMUTABLE(s); /* Unable to stat file. */ } if (S_ISLNK(st.st_mode)) { char buf[PATH_MAX]; int l; if (++num_links > GS_MAXSYMLINKS) { return IMMUTABLE(s); /* Too many links. */ } n = readlink(newBuf, buf, PATH_MAX); if (n < 0) { return IMMUTABLE(s); /* Couldn't resolve. */ } buf[n] = '\0'; l = strlen(end); if ((n + l) >= PATH_MAX) { return IMMUTABLE(s); /* Path too long. */ } /* * Concatenate the resolved name with the string still to * be processed, and start using the result as input. */ memcpy(buf + n, end, l); n += l; buf[n] = '\0'; memcpy(extra, buf, n); extra[n] = '\0'; name = end = extra; if (buf[0] == '/') { /* * For an absolute link, we start at root again. */ dest = newBuf + 1; } else { /* * Backup - remove the last component. */ if (dest > newBuf + 1) { do { dest--; } while (dest[-1] != '/'); } } } else { num_links = 0; } } } if (dest > newBuf + 1 && dest[-1] == '/') { --dest; } *dest = '\0'; #endif if (strncmp(newBuf, "/private/", 9) == 0) { struct stat st; if (lstat(&newBuf[8], &st) == 0) { int l = strlen(newBuf) - 7; memmove(newBuf, &newBuf[8], l); } } return [[NSFileManager defaultManager] stringWithFileSystemRepresentation: newBuf length: strlen(newBuf)]; } #endif } - (NSString*) stringByStandardizingPath { NSMutableString *s; NSRange r; unichar (*caiImp)(NSString*, SEL, NSUInteger); unsigned int l = [self length]; unichar c; unsigned root; if (l == 0) { return @""; } c = [self characterAtIndex: 0]; if (c == '~') { s = AUTORELEASE([[self stringByExpandingTildeInPath] mutableCopy]); } else { s = AUTORELEASE([self mutableCopy]); } /* We must always use the standard path separator unless specifically set * to use the mswindows one. That ensures that standardised paths and * anything built by adding path components to them use a consistent * separator character anad can be compared readily using standard string * comparisons. */ if (GSPathHandlingWindows() == YES) { [s replaceString: @"/" withString: @"\\"]; } else { [s replaceString: @"\\" withString: @"/"]; } l = [s length]; root = rootOf(s, l); caiImp = (unichar (*)())[s methodForSelector: caiSel]; /* Remove any separators ('/') immediately after the trailing * separator in the root (if any). */ if (root > 0 && YES == pathSepMember((*caiImp)(s, caiSel, root-1))) { unsigned i; for (i = root; i < l; i++) { if (NO == pathSepMember((*caiImp)(s, caiSel, i))) { break; } } if (i > root) { r = (NSRange){root, i-root}; [s deleteCharactersInRange: r]; l -= r.length; } } /* Condense multiple separator ('/') sequences. */ r = (NSRange){root, l-root}; while ((r = [s rangeOfCharacterFromSet: pathSeps() options: 0 range: r]).length == 1) { while (NSMaxRange(r) < l && pathSepMember((*caiImp)(s, caiSel, NSMaxRange(r))) == YES) { r.length++; } r.location++; r.length--; if (r.length > 0) { [s deleteCharactersInRange: r]; l -= r.length; } r.length = l - r.location; } /* Remove trailing ('.') as long as it's preceeded by a path separator. * As a special case for OSX compatibility, we only remove the trailing * dot if it's not immediately after the root. */ if (l > root + 1 && (*caiImp)(s, caiSel, l-1) == '.' && pathSepMember((*caiImp)(s, caiSel, l-2)) == YES) { l--; [s deleteCharactersInRange: NSMakeRange(l, 1)]; } // Condense ('/./') sequences. r = (NSRange){root, l-root}; while ((r = [s rangeOfString: @"." options: 0 range: r locale: nil]).length == 1) { if (r.location > 0 && r.location < l - 1 && pathSepMember((*caiImp)(s, caiSel, r.location-1)) == YES && pathSepMember((*caiImp)(s, caiSel, r.location+1)) == YES) { r.length++; [s deleteCharactersInRange: r]; l -= r.length; } else { r.location++; } r.length = l - r.location; } // Strip trailing '/' if present. if (l > root && pathSepMember([s characterAtIndex: l - 1]) == YES) { r.length = 1; r.location = l - r.length; [s deleteCharactersInRange: r]; l -= r.length; } if ([s isAbsolutePath] == NO) { return s; } // Remove leading `/private' if present. if ([s hasPrefix: @"/private"]) { [s deleteCharactersInRange: ((NSRange){0,8})]; l -= 8; } /* * For absolute paths, we must * remove '/../' sequences and their matching parent directories. */ r = (NSRange){root, l-root}; while ((r = [s rangeOfString: @".." options: 0 range: r locale: nil]).length == 2) { if (r.location > 0 && pathSepMember((*caiImp)(s, caiSel, r.location-1)) == YES && (NSMaxRange(r) == l || pathSepMember((*caiImp)(s, caiSel, NSMaxRange(r))) == YES)) { BOOL atEnd = (NSMaxRange(r) == l) ? YES : NO; if (r.location > root) { NSRange r2; r.location--; r.length++; r2 = NSMakeRange(root, r.location-root); r = [s rangeOfCharacterFromSet: pathSeps() options: NSBackwardsSearch range: r2]; if (r.length == 0) { r = r2; // Location just after root r.length++; } else { r.length = NSMaxRange(r2) - r.location; r.location++; // Location Just after last separator } r.length += 2; // Add the `..' } if (NO == atEnd) { r.length++; // Add the '/' after the '..' } [s deleteCharactersInRange: r]; l -= r.length; } else { r.location++; } r.length = l - r.location; } return IMMUTABLE(s); } /** * Return a string formed by removing characters from the ends of the * receiver. Characters are removed only if they are in aSet.
* If the string consists entirely of characters in aSet, an empty * string is returned.
* The aSet argument must not be nil.
*/ - (NSString*) stringByTrimmingCharactersInSet: (NSCharacterSet*)aSet { unsigned length = [self length]; unsigned end = length; unsigned start = 0; if (aSet == nil) { [NSException raise: NSInvalidArgumentException format: @"%@ - nil character set argument", NSStringFromSelector(_cmd)]; } if (length > 0) { unichar (*caiImp)(NSString*, SEL, NSUInteger); BOOL (*mImp)(id, SEL, unichar); unichar letter; caiImp = (unichar (*)())[self methodForSelector: caiSel]; mImp = (BOOL(*)(id,SEL,unichar)) [aSet methodForSelector: cMemberSel]; while (end > 0) { letter = (*caiImp)(self, caiSel, end-1); if ((*mImp)(aSet, cMemberSel, letter) == NO) { break; } end--; } while (start < end) { letter = (*caiImp)(self, caiSel, start); if ((*mImp)(aSet, cMemberSel, letter) == NO) { break; } start++; } } if (start == 0 && end == length) { return IMMUTABLE(self); } if (start == end) { return @""; } return [self substringFromRange: NSMakeRange(start, end - start)]; } // private methods for Unicode level 3 implementation - (int) _baseLength { int blen = 0; unsigned len = [self length]; if (len > 0) { unsigned int count = 0; unichar (*caiImp)(NSString*, SEL, NSUInteger); caiImp = (unichar (*)())[self methodForSelector: caiSel]; while (count < len) { if (!uni_isnonsp((*caiImp)(self, caiSel, count++))) { blen++; } } } return blen; } + (NSString*) pathWithComponents: (NSArray*)components { NSString *s; unsigned c; unsigned i; c = [components count]; if (c == 0) { return @""; } s = [components objectAtIndex: 0]; if ([s length] == 0) { s = pathSepString(); } for (i = 1; i < c; i++) { s = [s stringByAppendingPathComponent: [components objectAtIndex: i]]; } return s; } - (BOOL) isAbsolutePath { unichar c; unsigned l = [self length]; unsigned root; if (l == 0) { return NO; // Empty string ... relative } c = [self characterAtIndex: 0]; if (c == (unichar)'~') { return YES; // Begins with tilde ... absolute } /* * Any string beginning with '/' is absolute ... except in windows mode * or on windows and not in unix mode. */ if (c == pathSepChar()) { #if defined(_WIN32) if (GSPathHandlingUnix() == YES) { return YES; } #else if (GSPathHandlingWindows() == NO) { return YES; } #endif } /* * Any root over two characters long must be a drive specification with a * slash (absolute) or a UNC path (always absolute). */ root = rootOf(self, l); if (root > 2) { return YES; // UNC or C:/ ... absolute } /* * What we have left are roots of the form 'C:' or '\' or a path * with no root, or a '/' (in windows mode only sence we already * handled a single slash in unix mode) ... * all these cases are relative paths. */ return NO; } - (NSArray*) pathComponents { NSMutableArray *a; NSArray *r; NSString *s = self; unsigned int l = [s length]; unsigned int root; unsigned int i; NSRange range; if (l == 0) { return [NSArray array]; } root = rootOf(s, l); a = [[NSMutableArray alloc] initWithCapacity: 8]; if (root > 0) { [a addObject: [s substringToIndex: root]]; } i = root; while (i < l) { range = [s rangeOfCharacterFromSet: pathSeps() options: NSLiteralSearch range: ((NSRange){i, l - i})]; if (range.length > 0) { if (range.location > i) { [a addObject: [s substringWithRange: NSMakeRange(i, range.location - i)]]; } i = NSMaxRange(range); } else { [a addObject: [s substringFromIndex: i]]; i = l; } } /* * If the path ended with a path separator which was not already * added as part of the root, add it as final component. */ if (l > root && pathSepMember([s characterAtIndex: l-1])) { [a addObject: pathSepString()]; } r = [a copy]; RELEASE(a); return AUTORELEASE(r); } - (NSArray*) stringsByAppendingPaths: (NSArray*)paths { NSMutableArray *a; NSArray *r; unsigned i, count = [paths count]; a = [[NSMutableArray allocWithZone: NSDefaultMallocZone()] initWithCapacity: count]; for (i = 0; i < count; i++) { NSString *s = [paths objectAtIndex: i]; s = [self stringByAppendingPathComponent: s]; [a addObject: s]; } r = [a copy]; RELEASE(a); return AUTORELEASE(r); } /** * Returns an autoreleased string with given format using the default locale. */ + (NSString*) localizedStringWithFormat: (NSString*) format, ... { va_list ap; id ret; va_start(ap, format); if (format == nil) { ret = nil; } else { ret = AUTORELEASE([[self allocWithZone: NSDefaultMallocZone()] initWithFormat: format locale: GSPrivateDefaultLocale() arguments: ap]); } va_end(ap); return ret; } /** * Compares this string with aString ignoring case. Convenience for * -compare:options:range: with the NSCaseInsensitiveSearch * option, in the default locale. */ - (NSComparisonResult) caseInsensitiveCompare: (NSString*)aString { if (aString == self) return NSOrderedSame; return [self compare: aString options: NSCaseInsensitiveSearch range: ((NSRange){0, [self length]})]; } /** *

Compares this instance with string. If locale is an NSLocale * instance and ICU is available, performs a comparison using the * ICU collator for that locale. If locale is an instance of a class * other than NSLocale, perform a comparison using +[NSLocale currentLocale]. * If locale is nil, or ICU is not available, use a POSIX-style * collation (for example, latin capital letters A-Z are ordered before * all of the lowercase letter, a-z.) *

*

mask may be NSLiteralSearch, which requests a literal * byte-by-byte * comparison, which is fastest but may return inaccurate results in cases * where two different composed character sequences may be used to express * the same character; NSCaseInsensitiveSearch, which ignores case * differences; NSDiacriticInsensitiveSearch * which ignores accent differences; * NSNumericSearch, which sorts groups of digits as numbers, * so "abc2" sorts before "abc100". *

*

compareRange refers to this instance, and should be set to 0..length * to compare the whole string. *

*

Returns NSOrderedAscending, NSOrderedDescending, * or NSOrderedSame, depending on whether this instance occurs * before or after string in lexical order, or is equal to it. *

*/ - (NSComparisonResult) compare: (NSString *)string options: (NSUInteger)mask range: (NSRange)compareRange locale: (id)locale { GS_RANGE_CHECK(compareRange, [self length]); if (nil == string) { [NSException raise: NSInvalidArgumentException format: @"compare with nil"]; } #if GS_USE_ICU == 1 { UCollator *coll = GSICUCollatorOpen(mask, locale); if (coll != NULL) { NSUInteger countSelf = compareRange.length; NSUInteger countOther = [string length]; unichar *charsSelf; unichar *charsOther; UCollationResult result; charsSelf = NSZoneMalloc(NSDefaultMallocZone(), countSelf * sizeof(unichar)); charsOther = NSZoneMalloc(NSDefaultMallocZone(), countOther * sizeof(unichar)); // Copy to buffer [self getCharacters: charsSelf range: compareRange]; [string getCharacters: charsOther range: NSMakeRange(0, countOther)]; result = ucol_strcoll(coll, charsSelf, countSelf, charsOther, countOther); NSZoneFree(NSDefaultMallocZone(), charsSelf); NSZoneFree(NSDefaultMallocZone(), charsOther); ucol_close(coll); switch (result) { case UCOL_EQUAL: return NSOrderedSame; case UCOL_GREATER: return NSOrderedDescending; case UCOL_LESS: return NSOrderedAscending; } } } #endif return strCompNsNs(self, string, mask, compareRange); } /** * Compares this instance with string, using +[NSLocale currentLocale]. */ - (NSComparisonResult) localizedCompare: (NSString *)string { return [self compare: string options: 0 range: NSMakeRange(0, [self length]) locale: [NSLocale currentLocale]]; } /** * Compares this instance with string, using +[NSLocale currentLocale], * ignoring case. */ - (NSComparisonResult) localizedCaseInsensitiveCompare: (NSString *)string { return [self compare: string options: NSCaseInsensitiveSearch range: NSMakeRange(0, [self length]) locale: [NSLocale currentLocale]]; } /** * Writes contents out to file at filename, using the default C string encoding * unless this would result in information loss, otherwise straight unicode. * The 'atomically' option if set will cause the contents to be * written to a temp file, which is then closed and renamed to filename. Thus, * an incomplete file at filename should never result. */ - (BOOL) writeToFile: (NSString*)filename atomically: (BOOL)useAuxiliaryFile { id d = [self dataUsingEncoding: _DefaultStringEncoding]; if (d == nil) { d = [self dataUsingEncoding: NSUnicodeStringEncoding]; } return [d writeToFile: filename atomically: useAuxiliaryFile]; } /** * Writes contents out to file at filename, using the default C string encoding * unless this would result in information loss, otherwise straight unicode. * The 'atomically' option if set will cause the contents to be * written to a temp file, which is then closed and renamed to filename. Thus, * an incomplete file at filename should never result.
* If there is a problem and error is not NULL, the cause of the problem is * returned in *error. */ - (BOOL) writeToFile: (NSString*)path atomically: (BOOL)atomically encoding: (NSStringEncoding)enc error: (NSError**)error { id d = [self dataUsingEncoding: enc]; if (d == nil) { if (error != 0) { *error = [NSError errorWithDomain: NSCocoaErrorDomain code: NSFileWriteInapplicableStringEncodingError userInfo: nil]; } return NO; } return [d writeToFile: path options: atomically ? NSDataWritingAtomic : 0 error: error]; } /** * Writes contents out to url, using the default C string encoding * unless this would result in information loss, otherwise straight unicode. * See [NSURLHandle-writeData:] on which URL types are supported. * The 'atomically' option is only heeded if the URL is a * file:// URL; see -writeToFile:atomically: .
* If there is a problem and error is not NULL, the cause of the problem is * returned in *error. */ - (BOOL) writeToURL: (NSURL*)url atomically: (BOOL)atomically encoding: (NSStringEncoding)enc error: (NSError**)error { id d = [self dataUsingEncoding: enc]; if (d == nil) { d = [self dataUsingEncoding: NSUnicodeStringEncoding]; } if (d == nil) { if (error != 0) { *error = [NSError errorWithDomain: NSCocoaErrorDomain code: NSFileWriteInapplicableStringEncodingError userInfo: nil]; } return NO; } return [d writeToURL: url options: atomically ? NSDataWritingAtomic : 0 error: error]; } /** * Writes contents out to url, using the default C string encoding * unless this would result in information loss, otherwise straight unicode. * See [NSURLHandle-writeData:] on which URL types are supported. * The 'atomically' option is only heeded if the URL is a * file:// URL; see -writeToFile:atomically: . */ - (BOOL) writeToURL: (NSURL*)url atomically: (BOOL)atomically { id d = [self dataUsingEncoding: _DefaultStringEncoding]; if (d == nil) { d = [self dataUsingEncoding: NSUnicodeStringEncoding]; } return [d writeToURL: url atomically: atomically]; } /* NSCopying Protocol */ - (id) copyWithZone: (NSZone*)zone { /* * Default implementation should not simply retain ... the string may * have been initialised with freeWhenDone==NO and not own its * characters ... so the code which created it may destroy the memory * when it has finished with the original string ... leaving the * copy with pointers to invalid data. So, we always copy in full. */ return [[NSStringClass allocWithZone: zone] initWithString: self]; } - (id) mutableCopyWithZone: (NSZone*)zone { return [[GSMutableStringClass allocWithZone: zone] initWithString: self]; } /* NSCoding Protocol */ - (void) encodeWithCoder: (NSCoder*)aCoder { if ([aCoder allowsKeyedCoding]) { [(NSKeyedArchiver*)aCoder _encodePropertyList: self forKey: @"NS.string"]; } else { unsigned count = [self length]; [aCoder encodeValueOfObjCType: @encode(unsigned) at: &count]; if (count > 0) { NSStringEncoding enc = NSUnicodeStringEncoding; unichar *chars; /* For backwards-compatibility, we always encode/decode 'NSStringEncoding' (which really is an 'unsigned int') as an 'int'. Due to a bug, GCC up to 4.5 always encode all enums as 'i' (int) regardless of the actual integer type required to store them; we need to be able to read/write archives compatible with GCC <= 4.5 so we explictly use 'int' to read/write these variables. */ [aCoder encodeValueOfObjCType: @encode(int) at: &enc]; chars = NSZoneMalloc(NSDefaultMallocZone(), count*sizeof(unichar)); [self getCharacters: chars range: ((NSRange){0, count})]; [aCoder encodeArrayOfObjCType: @encode(unichar) count: count at: chars]; NSZoneFree(NSDefaultMallocZone(), chars); } } } - (id) initWithCoder: (NSCoder*)aCoder { if ([aCoder allowsKeyedCoding]) { if ([aCoder containsValueForKey: @"NS.string"]) { NSString *string = nil; string = (NSString*)[(NSKeyedUnarchiver*)aCoder _decodePropertyListForKey: @"NS.string"]; self = [self initWithString: string]; } else if ([aCoder containsValueForKey: @"NS.bytes"]) { id bytes = [(NSKeyedUnarchiver*)aCoder decodeObjectForKey: @"NS.bytes"]; if ([bytes isKindOfClass: NSStringClass]) { self = [self initWithString: (NSString*)bytes]; } else { self = [self initWithData: (NSData*)bytes encoding: NSUTF8StringEncoding]; } } else { // empty string self = [self initWithString: @""]; } } else { unsigned count; [aCoder decodeValueOfObjCType: @encode(unsigned) at: &count]; if (count > 0) { NSStringEncoding enc; NSZone *zone; [aCoder decodeValueOfObjCType: @encode(int) at: &enc]; zone = [self zone]; if (enc == NSUnicodeStringEncoding) { unichar *chars; chars = NSZoneMalloc(zone, count*sizeof(unichar)); [aCoder decodeArrayOfObjCType: @encode(unichar) count: count at: chars]; self = [self initWithCharactersNoCopy: chars length: count freeWhenDone: YES]; } else { unsigned char *chars; chars = NSZoneMalloc(zone, count+1); [aCoder decodeArrayOfObjCType: @encode(unsigned char) count: count at: chars]; self = [self initWithBytesNoCopy: chars length: count encoding: enc freeWhenDone: YES]; } } else { self = [self initWithBytesNoCopy: (char *)"" length: 0 encoding: NSASCIIStringEncoding freeWhenDone: NO]; } } return self; } - (Class) classForCoder { return NSStringClass; } - (id) replacementObjectForPortCoder: (NSPortCoder*)aCoder { if ([aCoder isByref] == NO) return self; return [super replacementObjectForPortCoder: aCoder]; } /** *

Attempts to interpret the receiver as a property list * and returns the result. If the receiver does not contain a * string representation of a property list then the method * returns nil. *

*

Containers (arrays and dictionaries) are decoded as mutable * objects. *

*

There are three readable property list storage formats - * The binary format used by [NSSerializer] does not concern us here, * but there are two 'human readable' formats, the traditional * OpenStep format (which is extended in GNUstep) and the XML format. *

*

The [NSArray-descriptionWithLocale:indent:] and * [NSDictionary-descriptionWithLocale:indent:] methods * both generate strings containing traditional style property lists, * but [NSArray-writeToFile:atomically:] and * [NSDictionary-writeToFile:atomically:] generate either traditional or * XML style property lists depending on the value of the * GSMacOSXCompatible and NSWriteOldStylePropertyLists user defaults.
* If GSMacOSXCompatible is YES then XML property lists are * written unless NSWriteOldStylePropertyLists is also YES.
* By default GNUstep writes old style data and always supports reading of * either style. *

*

The traditional format is more compact and more easily readable by * people, but (without the GNUstep extensions) cannot represent date and * number objects (except as strings). The XML format is more verbose and * less readable, but can be fed into modern XML tools and thus used to * pass data to non-OpenStep applications more readily. *

*

The traditional format is strictly ascii encoded, with any unicode * characters represented by escape sequences. The XML format is encoded * as UTF8 data. *

*

Both the traditional format and the XML format permit comments to be * placed in property list documents. In traditional format the * comment notations used in Objective-C programming are supported, while * in XML format, the standard SGML comment sequences are used. *

*

See the documentation for [NSPropertyListSerialization] for more * information on what a property list is. *

*

If the string cannot be parsed as a normal property list format, * this method also tries to parse it as 'strings file' format (see the * -propertyListFromStringsFileFormat method). *

*/ - (id) propertyList { NSData *data; id result = nil; NSPropertyListFormat format; NSString *error = nil; if ([self length] == 0) { return nil; } data = [self dataUsingEncoding: NSUTF8StringEncoding]; NSAssert(data, @"Couldn't get utf8 data from string."); result = [NSPropertyListSerialization propertyListFromData: data mutabilityOption: NSPropertyListMutableContainers format: &format errorDescription: &error]; if (result == nil) { extern id GSPropertyListFromStringsFormat(NSString *string); NS_DURING { result = GSPropertyListFromStringsFormat(self); } NS_HANDLER { error = [NSString stringWithFormat: @"as property list {%@}, and as strings file {%@}", error, [localException reason]]; result = nil; } NS_ENDHANDLER if (result == nil) { [NSException raise: NSGenericException format: @"Parse failed - %@", error]; } } return result; } /** *

Reads a property list (see -propertyList) from a simplified * file format. This format is a traditional style property list file * containing a single dictionary, but with the leading '{' and trailing * '}' characters omitted. *

*

That is to say, the file contains only semicolon separated key/value * pairs (and optionally comments). As a convenience, it is possible to * omit the equals sign and the value, so an entry consists of a key string * followed by a semicolon. In this case, the value for that key is * assumed to be an empty string. *

* * // Strings file entries follow - * key1 = " a string value"; * key2; // This key has an empty string as a value. * "Another key" = "a longer string value for th third key"; * */ - (NSDictionary*) propertyListFromStringsFileFormat { extern id GSPropertyListFromStringsFormat(NSString *string); return GSPropertyListFromStringsFormat(self); } /** * Returns YES if the receiver contains string, otherwise, NO. */ - (BOOL) containsString: (NSString *)string { return [self rangeOfString: string].location != NSNotFound; } @end /** * This is the mutable form of the [NSString] class. */ @implementation NSMutableString + (id) allocWithZone: (NSZone*)z { if (self == NSMutableStringClass) { return NSAllocateObject(GSMutableStringClass, 0, z); } else { return NSAllocateObject(self, 0, z); } } // Creating Temporary Strings /** * Constructs an empty string. */ + (id) string { return AUTORELEASE([[GSMutableStringClass allocWithZone: NSDefaultMallocZone()] initWithCapacity: 0]); } /** * Constructs an empty string with initial buffer size of capacity. */ + (NSMutableString*) stringWithCapacity: (NSUInteger)capacity { return AUTORELEASE([[GSMutableStringClass allocWithZone: NSDefaultMallocZone()] initWithCapacity: capacity]); } /** * Create a string of unicode characters. */ // Inefficient implementation. + (id) stringWithCharacters: (const unichar*)characters length: (NSUInteger)length { return AUTORELEASE([[GSMutableStringClass allocWithZone: NSDefaultMallocZone()] initWithCharacters: characters length: length]); } /** * Load contents of file at path into a new string. Will interpret file as * containing direct unicode if it begins with the unicode byte order mark, * else converts to unicode using default C string encoding. */ + (id) stringWithContentsOfFile: (NSString *)path { return AUTORELEASE([[GSMutableStringClass allocWithZone: NSDefaultMallocZone()] initWithContentsOfFile: path]); } /** * Create a string based on the given C (char[]) string, which should be * null-terminated and encoded in the default C string encoding. (Characters * will be converted to unicode representation internally.) */ + (id) stringWithCString: (const char*)byteString { return AUTORELEASE([[GSMutableStringClass allocWithZone: NSDefaultMallocZone()] initWithCString: byteString]); } /** * Create a string based on the given C (char[]) string, which may contain * null bytes and should be encoded in the default C string encoding. * (Characters will be converted to unicode representation internally.) */ + (id) stringWithCString: (const char*)byteString length: (NSUInteger)length { return AUTORELEASE([[GSMutableStringClass allocWithZone: NSDefaultMallocZone()] initWithCString: byteString length: length]); } /** * Creates a new string using C printf-style formatting. First argument should * be a constant format string, like '@"float val = %f"', remaining * arguments should be the variables to print the values of, comma-separated. */ + (id) stringWithFormat: (NSString*)format, ... { id s; va_list ap; va_start(ap, format); s = [super stringWithFormat: format arguments: ap]; va_end(ap); return s; } /** * Constructs an empty string with initial buffer size of capacity.
* Calls -init (which does nothing but maintain MacOS-X compatibility), * and needs to be re-implemented in subclasses in order to have all * other initialisers work. */ - (id) initWithCapacity: (NSUInteger)capacity { self = [self init]; return self; } - (id) initWithCharactersNoCopy: (unichar*)chars length: (NSUInteger)length freeWhenDone: (BOOL)flag { if ((self = [self initWithCapacity: length]) != nil && length > 0) { NSString *tmp; tmp = [NSString allocWithZone: NSDefaultMallocZone()]; tmp = [tmp initWithCharactersNoCopy: chars length: length freeWhenDone: flag]; [self replaceCharactersInRange: NSMakeRange(0,0) withString: tmp]; RELEASE(tmp); } return self; } - (id) initWithCStringNoCopy: (char*)chars length: (NSUInteger)length freeWhenDone: (BOOL)flag { if ((self = [self initWithCapacity: length]) != nil && length > 0) { NSString *tmp; tmp = [NSString allocWithZone: NSDefaultMallocZone()]; tmp = [tmp initWithCStringNoCopy: chars length: length freeWhenDone: flag]; [self replaceCharactersInRange: NSMakeRange(0,0) withString: tmp]; RELEASE(tmp); } return self; } // Modify A String /** * Modifies this string by appending aString. */ - (void) appendString: (NSString*)aString { NSRange aRange; aRange.location = [self length]; aRange.length = 0; [self replaceCharactersInRange: aRange withString: aString]; } /** * Modifies this string by appending string described by given format. */ // Inefficient implementation. - (void) appendFormat: (NSString*)format, ... { va_list ap; id tmp; va_start(ap, format); tmp = [[NSStringClass allocWithZone: NSDefaultMallocZone()] initWithFormat: format arguments: ap]; va_end(ap); [self appendString: tmp]; RELEASE(tmp); } - (Class) classForCoder { return NSMutableStringClass; } /** * Modifies this instance by deleting specified range of characters. */ - (void) deleteCharactersInRange: (NSRange)range { [self replaceCharactersInRange: range withString: nil]; } /** * Modifies this instance by inserting aString at loc. */ - (void) insertString: (NSString*)aString atIndex: (NSUInteger)loc { NSRange range = {loc, 0}; [self replaceCharactersInRange: range withString: aString]; } /** * Modifies this instance by deleting characters in range and then inserting * aString at its beginning. */ - (void) replaceCharactersInRange: (NSRange)range withString: (NSString*)aString { [self subclassResponsibility: _cmd]; } /** * Replaces all occurrences of the replace string with the by string, * for those cases where the entire replace string lies within the * specified searchRange value.
* The value of opts determines the direction of the search is and * whether only leading/trailing occurrences (anchored search) of * replace are substituted.
* Raises NSInvalidArgumentException if either string argument is nil.
* Raises NSRangeException if part of searchRange is beyond the end * of the receiver. */ - (NSUInteger) replaceOccurrencesOfString: (NSString*)replace withString: (NSString*)by options: (NSUInteger)opts range: (NSRange)searchRange { NSRange range; unsigned int count = 0; GSRSFunc func; if ([replace isKindOfClass: NSStringClass] == NO) { [NSException raise: NSInvalidArgumentException format: @"%@ bad search string", NSStringFromSelector(_cmd)]; } if ([by isKindOfClass: NSStringClass] == NO) { [NSException raise: NSInvalidArgumentException format: @"%@ bad replace string", NSStringFromSelector(_cmd)]; } if (NSMaxRange(searchRange) > [self length]) { [NSException raise: NSInvalidArgumentException format: @"%@ bad search range", NSStringFromSelector(_cmd)]; } func = GSPrivateRangeOfString(self, replace); range = (*func)(self, replace, opts, searchRange); if (range.length > 0) { unsigned byLen = [by length]; SEL sel; void (*imp)(id, SEL, NSRange, NSString*); sel = @selector(replaceCharactersInRange:withString:); imp = (void(*)(id, SEL, NSRange, NSString*))[self methodForSelector: sel]; do { count++; (*imp)(self, sel, range, by); if ((opts & NSBackwardsSearch) == NSBackwardsSearch) { searchRange.length = range.location - searchRange.location; } else { unsigned int newEnd; newEnd = NSMaxRange(searchRange) + byLen - range.length; searchRange.location = range.location + byLen; searchRange.length = newEnd - searchRange.location; } /* We replaced something and now need to scan again. * As we modified the receiver, we must refresh the * method implementation for searching. */ func = GSPrivateRangeOfString(self, replace); range = (*func)(self, replace, opts, searchRange); } while (range.length > 0); } return count; } /** * Modifies this instance by replacing contents with those of aString. */ - (void) setString: (NSString*)aString { NSRange range = {0, [self length]}; [self replaceCharactersInRange: range withString: aString]; } @end gnustep-base-1.29.0/Source/NSTask.m000066400000000000000000001307671435650067400170110ustar00rootroot00000000000000/** Implementation for NSTask for GNUStep Copyright (C) 1998,1999 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 1998 This file is part of the GNUstep Base Library. 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 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 USA. NSTask class reference $Date$ $Revision$ */ #import "common.h" #define EXPOSE_NSTask_IVARS 1 #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSCharacterSet.h" #import "Foundation/NSData.h" #import "Foundation/NSDate.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSException.h" #import "Foundation/NSFileHandle.h" #import "Foundation/NSFileManager.h" #import "Foundation/NSMapTable.h" #import "Foundation/NSProcessInfo.h" #import "Foundation/NSRunLoop.h" #import "Foundation/NSLock.h" #import "Foundation/NSNotification.h" #import "Foundation/NSNotificationQueue.h" #import "Foundation/NSTask.h" #import "Foundation/NSThread.h" #import "Foundation/NSTimer.h" #import "Foundation/NSURL.h" #import "GNUstepBase/NSString+GNUstepBase.h" #import "GNUstepBase/NSTask+GNUstepBase.h" #import "GSPrivate.h" #include #if defined(__FreeBSD__) || defined(__OpenBSD__) #include #endif #ifdef HAVE_WINDOWS_H # include #endif #if defined(HAVE_SYS_SIGNAL_H) # include #elif defined(HAVE_SIGNAL_H) # include #endif #if defined(HAVE_SYS_FILE_H) # include #endif #if defined(HAVE_SYS_FCNTL_H) # include #elif defined(HAVE_FCNTL_H) # include #endif #ifdef HAVE_SYS_IOCTL_H #include #endif #ifdef HAVE_SYS_WAIT_H #include #endif #ifdef HAVE_SYS_PARAM_H #include #endif /* * If we are on a streams based system, we need to include stropts.h * for definitions needed to set up slave pseudo-terminal stream. */ #ifdef HAVE_SYS_STROPTS_H #include #endif /* * If we don't have NOFILE, default to 2048 open descriptors. */ #ifndef NOFILE #define NOFILE 2048 #endif static NSRecursiveLock *tasksLock = nil; static NSMapTable *activeTasks = 0; static BOOL hadChildSignal = NO; static void handleSignal(int sig) { hadChildSignal = YES; #ifndef _WIN32 signal(SIGCHLD, handleSignal); #endif } #ifdef _WIN32 /* We use exit code 10 to denote a process termination. * Windows does nt have an exit code to denote termination this way. */ #define WIN_SIGNALLED 10 @interface NSConcreteWindowsTask : NSTask { @public PROCESS_INFORMATION procInfo; HANDLE wThread; } @end #define NSConcreteTask NSConcreteWindowsTask #else @interface NSConcreteUnixTask : NSTask { char slave_name[32]; BOOL _usePseudoTerminal; } @end #define NSConcreteTask NSConcreteUnixTask static int pty_master(char* name, int len) { int master; /* * If we have grantpt(), assume we are using sysv-style pseudo-terminals, * otherwise assume bsd style. */ #ifdef HAVE_GRANTPT master = open("/dev/ptmx", O_RDWR); if (master >= 0) { const char *slave; grantpt(master); /* Change permission of slave. */ unlockpt(master); /* Unlock slave. */ slave = (const char*)ptsname(master); if (slave == 0 || strlen(slave) >= len) { close(master); master = -1; } else { strncpy(name, (char*)slave, len); } } else #endif { const char *groups = "pqrstuvwxyzPQRSTUVWXYZ"; master = -1; if (len > 10) { strncpy(name, "/dev/ptyXX", len); while (master < 0 && *groups != '\0') { int i; name[8] = *groups++; for (i = 0; i < 16; i++) { name[9] = "0123456789abcdef"[i]; master = open(name, O_RDWR); if (master >= 0) { name[5] = 't'; break; } } } } } return master; } static int pty_slave(const char* name) { int slave; slave = open(name, O_RDWR); #ifdef HAVE_SYS_STROPTS_H #ifdef HAVE_PTS_STREAM_MODULES if (slave >= 0 && isastream(slave)) { if (ioctl(slave, I_PUSH, "ptem") < 0) { perror("unable to push 'ptem' streams module"); } else if (ioctl(slave, I_PUSH, "ldterm") < 0) { perror("unable to push 'ldterm' streams module"); } } #endif #endif return slave; } #endif @interface NSTask (Private) - (NSString *) _fullLaunchPath; - (void) _collectChild; - (void) _notifyOfTermination; - (void) _terminatedChild: (int)status reason: (NSTaskTerminationReason)reason; @end /** * The NSTask class provides a mechanism to run separate tasks * under (limited) control of your program. */ @implementation NSTask + (id) allocWithZone: (NSZone*)zone { NSTask *task; if (self == [NSTask class]) task = (NSTask *)NSAllocateObject([NSConcreteTask class], 0, zone); else task = (NSTask *)NSAllocateObject(self, 0, zone); return task; } + (void) initialize { if (self == [NSTask class]) { [gnustep_global_lock lock]; if (tasksLock == nil) { tasksLock = [NSRecursiveLock new]; [[NSObject leakAt: &tasksLock] release]; /* The activeTasks map contains the NSTask objects corresponding * to running subtasks, and retains them until the subprocess * actually terminates. * The previous implementation stored non-retained objects and * the -finalize method removed them from the table, but this * caused a thread safety issue even though table access was * lock protected: * If thread t1 releases the task at the same time that the subtask * dies and is 'reaped' by t2, then there is a window such * that t1 can enter -dealloc while t2 is dealing with * subprocess termination notification. * So t1 completes deallocation while t2 performs * the notification, and then t2 tries to release the object... * t1: enter dealloc * t2: lookup task in activeTasks and retain/autorelease it * t2: create NSNotification (retaining task) * t2: post notification * t1: remove task from activeTasks * t1: release memory occupied by task object. * t2: complete notification ... attempt to release task object * but it's already deallocated. */ activeTasks = NSCreateMapTable(NSIntegerMapKeyCallBacks, NSObjectMapValueCallBacks, 0); [[NSObject leakAt: &activeTasks] release]; } [gnustep_global_lock unlock]; #ifndef _WIN32 signal(SIGCHLD, handleSignal); #endif } } /** * Creates and launches a task, returning an autoreleased task object. * Supplies the path to the executable and an array of argument. * The task inherits the parents environment and I/O. */ + (NSTask*) launchedTaskWithLaunchPath: (NSString*)path arguments: (NSArray*)args { NSTask* task = [NSTask new]; [task setLaunchPath: path]; [task setArguments: args]; [task launch]; return AUTORELEASE(task); } - (void) finalize { return; } - (void) dealloc { [self finalize]; RELEASE(_arguments); RELEASE(_environment); RELEASE(_launchPath); RELEASE(_currentDirectoryPath); RELEASE(_standardError); RELEASE(_standardInput); RELEASE(_standardOutput); RELEASE(_launchingThread); [super dealloc]; } /** * Returns the arguments set for the task. */ - (NSArray*) arguments { return _arguments; } /** * Returns the working directory set for the task. */ - (NSString*) currentDirectoryPath { if (_currentDirectoryPath == nil) { [self setCurrentDirectoryPath: [[NSFileManager defaultManager] currentDirectoryPath]]; } return _currentDirectoryPath; } /** * Returns the environment set for the task. */ - (NSDictionary*) environment { if (_environment == nil) { [self setEnvironment: [[NSProcessInfo processInfo] environment]]; } return _environment; } /** * Sends an interrupt signal to the receiver and any subtasks.
* If the task has not been launched, raises an * NSInvalidArgumentException.
* Has no effect on a task that has already terminated.
* This is rather like the terminate method, but the child * process may not choose to terminate in response to an interrupt. */ - (void) interrupt { if (_hasLaunched == NO) { [NSException raise: NSInvalidArgumentException format: @"NSTask - task has not yet launched"]; } if (_hasTerminated) { return; } #ifndef _WIN32 #ifdef HAVE_KILLPG killpg(_taskId, SIGINT); #else kill(-_taskId, SIGINT); #endif #endif } /** * Checks to see if the task is currently running. */ - (BOOL) isRunning { if (_hasLaunched == NO) { return NO; } if (_hasCollected == NO) { [self _collectChild]; } if (_hasTerminated == YES) { return NO; } return YES; } /** * Launches the task.
* Raises an NSInvalidArgumentException if the launch path is not * set or if the subtask cannot be started for some reason * (eg. the executable does not exist or the task has already been launched). * The actual launching is done in a concrete subclass; this method just * takes care of actions common to all subclasses. */ - (void) launch { NSError *e; if (NO == [self launchAndReturnError: &e]) { [NSException raise: NSInvalidArgumentException format: @"%@", e ? e : @"Unable to launch"]; } } /** * Returns the launch path set for the task. */ - (NSString*) launchPath { return _launchPath; } /** * Returns the number identifying the child process on this system. */ - (int) processIdentifier { return _taskId; } /** * Sends a cont signal to the receiver and any subtasks.
* If the task has not been launched, raises an * NSInvalidArgumentException.
*/ - (BOOL) resume { if (_hasLaunched == NO) { [NSException raise: NSInvalidArgumentException format: @"NSTask - task has not yet launched"]; } #ifndef _WIN32 #ifdef HAVE_KILLPG killpg(_taskId, SIGCONT); #else kill(-_taskId, SIGCONT); #endif #endif return YES; } /** * Sets an array of arguments to be supplied to the task when it * is launched. The default is an empty array. This method cannot * be used after a task is launched ... * it raises an NSInvalidArgumentException. */ - (void) setArguments: (NSArray*)args { if (_hasLaunched) { [NSException raise: NSInvalidArgumentException format: @"NSTask - task has been launched"]; } ASSIGN(_arguments, args); } /** * Sets the home directory in which the task is to be run. * The default is the parent processes directory. * This method cannot be used after a task is launched ... * it raises an NSInvalidArgumentException. */ - (void) setCurrentDirectoryPath: (NSString*)path { if (_hasLaunched) { [NSException raise: NSInvalidArgumentException format: @"NSTask - task has been launched"]; } ASSIGN(_currentDirectoryPath, path); } /** * Sets the environment variables for the task to be run. * The default is the parent processes environment. * This method cannot be used after a task is launched ... * it raises an NSInvalidArgumentException. */ - (void) setEnvironment: (NSDictionary*)env { if (_hasLaunched) { [NSException raise: NSInvalidArgumentException format: @"NSTask - task has been launched"]; } ASSIGN(_environment, env); } /** * Sets the path to the executable file to be run. * There is no default for this - you must set the launch path. * This method cannot be used after a task is launched ... * it raises an NSInvalidArgumentException. */ - (void) setLaunchPath: (NSString*)path { if (_hasLaunched) { [NSException raise: NSInvalidArgumentException format: @"NSTask - task has been launched"]; } ASSIGN(_launchPath, path); } /** * Sets the standard error stream for the task.
* This is normally a writable NSFileHandle object. * If this is an NSPipe, the write end of the pipe is * automatically closed on launching.
* The default behavior is to inherit the parent processes * stderr output.
* This method cannot be used after a task is launched ... * it raises an NSInvalidArgumentException. */ - (void) setStandardError: (id)hdl { if (_hasLaunched) { [NSException raise: NSInvalidArgumentException format: @"NSTask - task has been launched"]; } NSAssert(hdl != nil && ([hdl isKindOfClass: [NSFileHandle class]] || [hdl isKindOfClass: [NSPipe class]]), NSInvalidArgumentException); ASSIGN(_standardError, hdl); } /** * Sets the standard input stream for the task.
* This is normally a readable NSFileHandle object. * If this is an NSPipe, the read end of the pipe is * automatically closed on launching.
* The default behavior is to inherit the parent processes * stdin stream.
* This method cannot be used after a task is launched ... * it raises an NSInvalidArgumentException. */ - (void) setStandardInput: (id)hdl { if (_hasLaunched) { [NSException raise: NSInvalidArgumentException format: @"NSTask - task has been launched"]; } NSAssert(hdl != nil && ([hdl isKindOfClass: [NSFileHandle class]] || [hdl isKindOfClass: [NSPipe class]]), NSInvalidArgumentException); ASSIGN(_standardInput, hdl); } /** * Sets the standard output stream for the task.
* This is normally a writable NSFileHandle object. * If this is an NSPipe, the write end of the pipe is * automatically closed on launching.
* The default behavior is to inherit the parent processes * stdout stream.
* This method cannot be used after a task is launched ... * it raises an NSInvalidArgumentException. */ - (void) setStandardOutput: (id)hdl { if (_hasLaunched) { [NSException raise: NSInvalidArgumentException format: @"NSTask - task has been launched"]; } NSAssert(hdl != nil && ([hdl isKindOfClass: [NSFileHandle class]] || [hdl isKindOfClass: [NSPipe class]]), NSInvalidArgumentException); ASSIGN(_standardOutput, hdl); } /** * Returns the standard error stream for the task - an NSFileHandle * unless an NSPipe was passed to -setStandardError: */ - (id) standardError { if (_standardError == nil) { [self setStandardError: [NSFileHandle fileHandleWithStandardError]]; } return _standardError; } /** * Returns the standard input stream for the task - an NSFileHandle * unless an NSPipe was passed to -setStandardInput: */ - (id) standardInput { if (_standardInput == nil) { [self setStandardInput: [NSFileHandle fileHandleWithStandardInput]]; } return _standardInput; } /** * Returns the standard output stream for the task - an NSFileHandle * unless an NSPipe was passed to -setStandardOutput: */ - (id) standardOutput { if (_standardOutput == nil) { [self setStandardOutput: [NSFileHandle fileHandleWithStandardOutput]]; } return _standardOutput; } /** * Sends a stop signal to the receiver and any subtasks.
* If the task has not been launched, raises an * NSInvalidArgumentException.
*/ - (BOOL) suspend { if (_hasLaunched == NO) { [NSException raise: NSInvalidArgumentException format: @"NSTask - task has not yet launched"]; } #ifndef _WIN32 #ifdef HAVE_KILLPG killpg(_taskId, SIGSTOP); #else kill(-_taskId, SIGSTOP); #endif #endif return YES; } /** * Sends a terminate signal to the receiver and any subtasks.
* If the task has not been launched, raises an * NSInvalidArgumentException.
* Has no effect on a task that has already terminated.
* When a task terminates, either due to this method being called, * or normal termination, an NSTaskDidTerminateNotification is * posted. */ - (void) terminate { if (_hasLaunched == NO) { [NSException raise: NSInvalidArgumentException format: @"NSTask - task has not yet launched"]; } if (_hasTerminated) { return; } _hasTerminated = YES; #ifndef _WIN32 #ifdef HAVE_KILLPG killpg(_taskId, SIGTERM); #else kill(-_taskId, SIGTERM); #endif #endif } /** * Returns the termination reason of the task.
* If the task has not completed running, raises an * NSInvalidArgumentException. */ - (NSTaskTerminationReason) terminationReason { if (_hasLaunched == NO) { [NSException raise: NSInvalidArgumentException format: @"NSTask - task has not yet launched"]; } if (_hasCollected == NO) { [self _collectChild]; } if (_hasTerminated == NO) { [NSException raise: NSInvalidArgumentException format: @"NSTask - task has not yet terminated"]; } return _terminationReason; } /** * Returns the termination status of the task.
* If the task has not completed running, raises an * NSInvalidArgumentException. */ - (int) terminationStatus { if (_hasLaunched == NO) { [NSException raise: NSInvalidArgumentException format: @"NSTask - task has not yet launched"]; } if (_hasCollected == NO) { [self _collectChild]; } if (_hasTerminated == NO) { [NSException raise: NSInvalidArgumentException format: @"NSTask - task has not yet terminated"]; } return _terminationStatus; } /** * If the system supports it, this method sets the standard * input, output, and error streams to a pseudo-terminal so * that, when launched, the child task will act as if it was * running interactively on a terminal. The file handles * can then be used to communicate with the child.
* This method cannot be used after a task is launched ... * it raises an NSInvalidArgumentException.
* The standard input, output and error streams cannot be * changed after calling this method.
* The method returns YES on success, NO on failure. */ - (BOOL) usePseudoTerminal { return NO; } /** * Returns a validated launch path or nil.
* Allows for the GNUstep host/operating system, and library combination * subdirectories in a path, appending them as necessary to try to locate * the actual binary to be used.
* Checks that the binary file exists and is executable.
* Even tries searching the directories in the PATH environment variable * to locate a binary if the original launch path set was not absolute. */ - (NSString*) validatedLaunchPath { NSString *libs; NSString *target_dir; NSString *prog; NSString *lpath; NSString *base_path; NSString *arch_path; NSString *full_path; if (_launchPath == nil) { return nil; } libs = [NSBundle _library_combo]; target_dir = [NSBundle _gnustep_target_dir]; /* * Set lpath to the actual path to use for the executable. * First choice - base_path/architecture/library_combo/prog. * Second choice - base_path/architecture/prog. * Third choice - base_path/prog. * Otherwise - try using PATH environment variable if possible. */ prog = [_launchPath lastPathComponent]; base_path = [_launchPath stringByDeletingLastPathComponent]; if ([[base_path lastPathComponent] isEqualToString: libs] == YES) base_path = [base_path stringByDeletingLastPathComponent]; if (nil == target_dir) arch_path = base_path; else { if ([[base_path lastPathComponent] isEqualToString: target_dir] == YES) base_path = [base_path stringByDeletingLastPathComponent]; arch_path = [base_path stringByAppendingPathComponent: target_dir]; } full_path = [arch_path stringByAppendingPathComponent: libs]; lpath = [full_path stringByAppendingPathComponent: prog]; if (nil == (lpath = [NSTask executablePath: lpath])) { lpath = [arch_path stringByAppendingPathComponent: prog]; if (nil == (lpath = [NSTask executablePath: lpath])) { lpath = [base_path stringByAppendingPathComponent: prog]; if (nil == (lpath = [NSTask executablePath: lpath])) { /* * Last resort - if the launch path was simply a program name * get NSBundle to try using the PATH environment * variable to find the executable. */ if ([base_path isEqualToString: @""] == YES) { lpath = [NSBundle _absolutePathOfExecutable: prog]; } if (lpath != nil) { lpath = [NSTask executablePath: lpath]; } } } } if (lpath != nil) { /* Make sure we have a standardised absolute path to pass to execve() */ if ([lpath isAbsolutePath] == NO) { NSString *current; current = [[NSFileManager defaultManager] currentDirectoryPath]; lpath = [current stringByAppendingPathComponent: lpath]; } lpath = [lpath stringByStandardizingPath]; #if defined(_WIN32) if ([lpath rangeOfString: @"/"].length > 0) { lpath = [lpath stringByReplacingString: @"/" withString: @"\\"]; } #endif } return lpath; } /** * Suspends the current thread until the task terminates, by * waiting in NSRunLoop (NSDefaultRunLoopMode) for the task * termination.
* Returns immediately if the task is not running. */ - (void) waitUntilExit { ENTER_POOL NSRunLoop *loop = [NSRunLoop currentRunLoop]; NSTimer *timer = nil; NSDate *limit = nil; IF_NO_ARC([[self retain] autorelease];) while ([self isRunning]) { /* Poll at 0.1 second intervals. */ limit = [[NSDate alloc] initWithTimeIntervalSinceNow: 0.1]; if (timer == nil) { timer = [NSTimer scheduledTimerWithTimeInterval: 0.1 target: nil selector: @selector(class) userInfo: nil repeats: YES]; } [loop runMode: NSDefaultRunLoopMode beforeDate: limit]; DESTROY(limit); } [timer invalidate]; /* Run loop one last time (with limit date in past) so that any * notification about the task ending is sent immediately. */ limit = [NSDate dateWithTimeIntervalSinceNow: 0.0]; [loop runMode: NSDefaultRunLoopMode beforeDate: limit]; LEAVE_POOL } // macOS 10.13 methods... + (NSTask *) launchedTaskWithExecutableURL: (NSURL *)url arguments: (NSArray *)arguments error: (NSError **)error terminationHandler: (GSTaskTerminationHandler)terminationHandler { NSTask *task = [self launchedTaskWithLaunchPath: [url path] arguments: arguments]; task->_handler = terminationHandler; if (error) { *error = nil; } return task; } - (BOOL) launchAndReturnError: (NSError **)error { ASSIGN(_launchingThread, [NSThread currentThread]); return YES; } - (NSURL *) executableURL { return [NSURL URLWithString: [self launchPath]];; } - (void) setExecutableURL: (NSURL *)url { [self setLaunchPath: [url path]]; } - (NSURL *) currentDirectoryURL { return [NSURL URLWithString: [self currentDirectoryPath]]; } - (void) setCurrentDirectoryURL: (NSURL *)url { [self setCurrentDirectoryPath: [url path]]; } @end @implementation NSTask (Private) - (NSString *) _fullLaunchPath { NSString *val; if (_launchPath == nil) { [NSException raise: NSInvalidArgumentException format: @"NSTask - no launch path set"]; } val = [self validatedLaunchPath]; if (val == nil) { [NSException raise: NSInvalidArgumentException format: @"NSTask - launch path (%@) not valid", _launchPath]; } return val; } - (void) _collectChild { [self subclassResponsibility: _cmd]; } - (void) _notifyOfTermination { NSNotificationQueue *q; NSNotification *n; n = [NSNotification notificationWithName: NSTaskDidTerminateNotification object: self userInfo: nil]; q = [NSNotificationQueue defaultQueue]; [q enqueueNotification: n postingStyle: NSPostASAP coalesceMask: NSNotificationNoCoalescing forModes: nil]; if (_handler != nil) { CALL_BLOCK_NO_ARGS(_handler); } } - (void) _terminatedChild: (int)status reason: (NSTaskTerminationReason)reason { [tasksLock lock]; IF_NO_ARC([[self retain] autorelease];) NSMapRemove(activeTasks, (void*)(intptr_t)_taskId); [tasksLock unlock]; _terminationStatus = status; _terminationReason = reason; _hasCollected = YES; _hasTerminated = YES; if (_hasNotified == NO) { _hasNotified = YES; if (_launchingThread != [NSThread currentThread] && [_launchingThread isExecuting] == YES) { [self performSelector: @selector(_notifyOfTermination) onThread: _launchingThread withObject: nil waitUntilDone: NO]; } else { [self _notifyOfTermination]; } } } @end #ifdef _WIN32 @implementation NSConcreteWindowsTask BOOL GSPrivateCheckTasks() { BOOL found = NO; if (YES == hadChildSignal) { NSArray *a; unsigned c; hadChildSignal = NO; [tasksLock lock]; a = NSAllMapTableValues(activeTasks); [tasksLock unlock]; c = [a count]; while (c-- > 0) { NSConcreteWindowsTask *t = [a objectAtIndex: c]; DWORD eCode; if (GetExitCodeProcess(t->procInfo.hProcess, &eCode) != 0) { if (eCode != STILL_ACTIVE) { [t _terminatedChild: eCode reason: (WIN_SIGNALLED == eCode) ? NSTaskTerminationReasonUncaughtSignal : NSTaskTerminationReasonExit]; found = YES; } } } } return found; } - (void) finalize { [super finalize]; if (wThread != NULL) { CloseHandle(wThread); } if (procInfo.hProcess != NULL) { CloseHandle(procInfo.hProcess); } if (procInfo.hThread != NULL) { CloseHandle(procInfo.hThread); } } - (void) interrupt { } - (void) terminate { if (_hasLaunched == NO) { [NSException raise: NSInvalidArgumentException format: @"NSTask - task has not yet launched"]; } if (_hasTerminated) { return; } /* We use exit code 10 to denote a process termination. * Windows does nt have an exit code to denote termination this way. */ _hasTerminated = YES; TerminateProcess(procInfo.hProcess, WIN_SIGNALLED); } static NSString* endSlashesDoubledFromString(NSString *aString) { int i = [aString length] - 2; NSMutableString *returnString; if (![aString hasSuffix:@"\\"]) { return aString; } returnString = [NSMutableString stringWithFormat: @"%@\\", aString]; while ([aString characterAtIndex: i] == '\\' && i >= 0) { [returnString appendString:@"\\"]; i--; } return returnString; } static NSString* quotedFromString(NSString *aString) { NSString *resultString; NSMutableArray *components; int i; /* First split on "'s */ components = [NSMutableArray arrayWithArray: [aString componentsSeparatedByString: @"\""]]; /* Iterate over all but the last component and double slashes if needed */ i = [components count]; while (i-- > 0) { [components replaceObjectAtIndex: i withObject: endSlashesDoubledFromString([components objectAtIndex: i])]; } /* Join them again with \" as separator */ resultString = [components componentsJoinedByString: @"\\\""]; /* Put in in "'s if it contains spaces */ if ([resultString rangeOfCharacterFromSet: [NSCharacterSet whitespaceCharacterSet]].length > 0) { resultString = [NSString stringWithFormat: @"\"%@\"", resultString]; } return resultString; } /* Wait for child process completion. The task object is retained by the * current thread until it exits, but may be removed from the table of * active tasks by another thread, so we must check that it's still * active at intervals. */ - (void) _windowsTaskWatcher { void *taskId = (void*)(intptr_t)[self processIdentifier]; for (;;) { NSConcreteWindowsTask *task; /* Check that this task is still active. */ [tasksLock lock]; task = (NSConcreteWindowsTask*)NSMapGet(activeTasks, taskId); [tasksLock unlock]; if (task != self) { /* Task has been reaped by another thread ... so we can exit. */ [NSThread exit]; } /* Wait for up to 1 minute (60,000 milliseconds) to get a notification * of an event from the subprocess. */ if (WaitForSingleObject(procInfo.hProcess, (DWORD)60000) != WAIT_TIMEOUT) { /* The subprocess has terminated or failed in some way ... * Set flag so child task can be reaped, then exit since this * thread no longer needs to watch for events. */ handleSignal(0); [NSThread exit]; } /* Timed out ... repeat wait attempt. */ } } // 10.13 method... - (BOOL) launchAndReturnError: (NSError **)error { STARTUPINFOW start_info; NSString *lpath; NSString *arg; NSEnumerator *arg_enum; NSMutableString *args; wchar_t *w_args; int result; const wchar_t *wexecutable; LPVOID envp = 0; NSDictionary *env; NSMutableArray *toClose; NSFileHandle *hdl; HANDLE hIn; HANDLE hOut; HANDLE hErr; id last = nil; if (_hasLaunched) { if (error) { NSDictionary *info; info = [NSDictionary dictionaryWithObjectsAndKeys: @"task has already been launched", NSLocalizedDescriptionKey, nil]; *error = [NSError errorWithDomain: NSCocoaErrorDomain code: 0 userInfo: info]; } return NO; } [super launchAndReturnError: error]; lpath = [self _fullLaunchPath]; wexecutable = (const unichar*)[lpath fileSystemRepresentation]; args = [[NSMutableString alloc] initWithString: quotedFromString(lpath)]; arg_enum = [[self arguments] objectEnumerator]; while ((arg = [arg_enum nextObject])) { [args appendString: @" "]; [args appendString: quotedFromString(arg)]; } // NSLog(@"ARGS: '%@'", args); w_args = NSZoneMalloc(NSDefaultMallocZone(), sizeof(wchar_t) * ([args length] + 1)); [args getCharacters: (unichar*)w_args]; w_args[[args length]] = 0; env = [self environment]; if ([env count] > 0) { NSMutableData *data = [NSMutableData dataWithCapacity: 10240]; NSEnumerator *enumerator; NSString *key; unichar terminator = 0; NSAutoreleasePool *pool = [NSAutoreleasePool new]; // Win32 environment variables must be sorted by name enumerator = [[[env allKeys] sortedArrayUsingSelector: @selector(compare:)] objectEnumerator]; while ((key = [enumerator nextObject])) { NSString *value = [env objectForKey:key]; NSString *setting; unsigned l; NSRange r = NSMakeRange(0,0); unichar buffer[1024]; setting = [NSString stringWithFormat: @"%@=%@", key, value]; l = [setting length]; while (r.location < l) { r.length = l - r.location; if (r.length > 1024) { r.length = 1024; } [setting getCharacters: buffer range: r]; [data appendBytes: buffer length: (r.length)*sizeof(unichar)]; r.location += r.length; } [data appendBytes: &terminator length: 2]; // end of setting } [data appendBytes: &terminator length: 2]; // end of environment [pool drain]; envp = [data mutableBytes]; } memset (&start_info, 0, sizeof(start_info)); start_info.cb = sizeof(start_info); start_info.dwFlags |= STARTF_USESTDHANDLES; toClose = [NSMutableArray arrayWithCapacity: 3]; if (_standardInput == nil) { start_info.hStdInput = GetStdHandle(STD_INPUT_HANDLE); } else { hdl = [self standardInput]; if ([hdl isKindOfClass: [NSPipe class]]) { hdl = [(NSPipe*)hdl fileHandleForReading]; [toClose addObject: hdl]; } start_info.hStdInput = [hdl nativeHandle]; } hIn = start_info.hStdInput; if (_standardOutput == nil) { start_info.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE); } else { hdl = [self standardOutput]; if ([hdl isKindOfClass: [NSPipe class]]) { hdl = [(NSPipe*)hdl fileHandleForWriting]; [toClose addObject: hdl]; } start_info.hStdOutput = [hdl nativeHandle]; } hOut = start_info.hStdOutput; if (_standardError == nil) { start_info.hStdError = GetStdHandle(STD_ERROR_HANDLE); } else { hdl = [self standardError]; if ([hdl isKindOfClass: [NSPipe class]]) { hdl = [(NSPipe*)hdl fileHandleForWriting]; /* * If we have the same pipe twice we don't want to close it twice */ if ([toClose indexOfObjectIdenticalTo: hdl] == NSNotFound) { [toClose addObject: hdl]; } } start_info.hStdError = [hdl nativeHandle]; } hErr = start_info.hStdError; /* Tell the system not to show a window for the subtask. */ start_info.wShowWindow = SW_HIDE; start_info.dwFlags |= STARTF_USESHOWWINDOW; /* Make the handles inheritable only temporarily while launching the * child task. This section must be lock protected so we don't have * another thread trying to launch at the same time and get handles * inherited by the wrong threads. */ [tasksLock lock]; SetHandleInformation(hIn, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT); SetHandleInformation(hOut, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT); SetHandleInformation(hErr, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT); result = CreateProcessW(wexecutable, w_args, NULL, /* proc attrs */ NULL, /* thread attrs */ 1, /* inherit handles */ 0 /* We don't want a subtask to be run min a window since that would prevent * startup of background tasks. If a subtask wants a window, it should * create it itself. */ |CREATE_NO_WINDOW /* We don't set the DETACHED_PROCESS flag as it actually means that the * child task should get a new Console allocated ... and that means it * will pop up a console window ... which looks really bad. */ // |DETACHED_PROCESS |CREATE_UNICODE_ENVIRONMENT, envp, /* env block */ (const unichar*)[[self currentDirectoryPath] fileSystemRepresentation], &start_info, &procInfo); if (0 == result) { last = [NSError _last]; } NSZoneFree(NSDefaultMallocZone(), w_args); SetHandleInformation(hIn, HANDLE_FLAG_INHERIT, 0); SetHandleInformation(hOut, HANDLE_FLAG_INHERIT, 0); SetHandleInformation(hErr, HANDLE_FLAG_INHERIT, 0); [tasksLock unlock]; if (0 == result) { if (error) { *error = last; } return NO; } _taskId = procInfo.dwProcessId; _hasLaunched = YES; ASSIGN(_launchPath, lpath); // Actual path used. [tasksLock lock]; NSMapInsert(activeTasks, (void*)(intptr_t) _taskId, (void*)self); [tasksLock unlock]; /* * Create thread to watch for termination of process. */ [NSThread detachNewThreadSelector: @selector(_windowsTaskWatcher) toTarget: self withObject: nil]; /* * Close the ends of any pipes used by the child. */ while ([toClose count] > 0) { hdl = [toClose objectAtIndex: 0]; [hdl closeFile]; [toClose removeObjectAtIndex: 0]; } return YES; } - (void) _collectChild { if (_hasCollected == NO) { DWORD eCode; if (GetExitCodeProcess(procInfo.hProcess, &eCode) == 0) { NSLog(@"Error getting exit code for process %d", _taskId); } else if (eCode != STILL_ACTIVE) { [self _terminatedChild: eCode reason: (WIN_SIGNALLED == eCode) ? NSTaskTerminationReasonUncaughtSignal : NSTaskTerminationReasonExit]; } } } @end #else /* !_WIN32 */ @implementation NSConcreteUnixTask BOOL GSPrivateCheckTasks() { BOOL found = NO; if (YES == hadChildSignal) { int result; int status; hadChildSignal = NO; do { NSTask *t; errno = 0; result = waitpid(-1, &status, WNOHANG); if (result < 0) { #if defined(WAITDEBUG) [tasksLock lock]; t = (NSTask*)NSMapGet(activeTasks, (void*)(intptr_t)result); IF_NO_ARC([[t retain] autorelease];) [tasksLock unlock]; if (t != nil) { NSLog(@"waitpid result %d, error %@", result, [NSError _last]); } #endif } else if (result > 0) { [tasksLock lock]; t = (NSTask*)NSMapGet(activeTasks, (void*)(intptr_t)result); IF_NO_ARC([[t retain] autorelease];) [tasksLock unlock]; if (t != nil) { if (WIFEXITED(status)) { #if defined(WAITDEBUG) NSLog(@"waitpid %d, exit status = %d", result, status); #endif [t _terminatedChild: WEXITSTATUS(status) reason: NSTaskTerminationReasonExit]; found = YES; } else if (WIFSIGNALED(status)) { #if defined(WAITDEBUG) NSLog(@"waitpid %d, termination status = %d", result, status); #endif [t _terminatedChild: WTERMSIG(status) reason: NSTaskTerminationReasonUncaughtSignal]; found = YES; } else { NSLog(@"Warning ... task %d neither exited nor signalled", result); } } #if defined(WAITDEBUG) else { NSLog(@"Received signal for unknown child %d", result); } #endif } } while (result > 0); } return found; } // 10.13 method... - (BOOL) launchAndReturnError: (NSError **)error { NSMutableArray *toClose; NSString *lpath; int pid; const char *executable; const char *path; int idesc; int odesc; int edesc; NSDictionary *e = [self environment]; NSArray *k = [e allKeys]; NSArray *a = [self arguments]; int ec = [e count]; int ac = [a count]; const char *args[ac+2]; const char *envl[ec+1]; id hdl; int i; if (_hasLaunched) { if (error) { NSDictionary *info; info = [NSDictionary dictionaryWithObjectsAndKeys: @"task has already been launched", NSLocalizedDescriptionKey, nil]; *error = [NSError errorWithDomain: NSCocoaErrorDomain code: 0 userInfo: info]; } return NO; } [super launchAndReturnError: error]; lpath = [self _fullLaunchPath]; executable = [lpath fileSystemRepresentation]; args[0] = executable; for (i = 0; i < ac; i++) { args[i+1] = [[[a objectAtIndex: i] description] lossyCString]; } args[ac+1] = 0; for (i = 0; i < ec; i++) { NSString *s; id key = [k objectAtIndex: i]; id val = [e objectForKey: key]; if (val) { s = [NSString stringWithFormat: @"%@=%@", key, val]; } else { s = [NSString stringWithFormat: @"%@=", key]; } envl[i] = [s lossyCString]; } envl[ec] = 0; path = [[self currentDirectoryPath] fileSystemRepresentation]; toClose = [NSMutableArray arrayWithCapacity: 3]; hdl = [self standardInput]; if ([hdl isKindOfClass: [NSPipe class]]) { hdl = [(NSPipe*)hdl fileHandleForReading]; [toClose addObject: hdl]; } idesc = [hdl fileDescriptor]; hdl = [self standardOutput]; if ([hdl isKindOfClass: [NSPipe class]]) { hdl = [(NSPipe*)hdl fileHandleForWriting]; [toClose addObject: hdl]; } odesc = [hdl fileDescriptor]; hdl = [self standardError]; if ([hdl isKindOfClass: [NSPipe class]]) { hdl = [(NSPipe*)hdl fileHandleForWriting]; /* * If we have the same pipe twice we don't want to close it twice */ if ([toClose indexOfObjectIdenticalTo: hdl] == NSNotFound) { [toClose addObject: hdl]; } } edesc = [hdl fileDescriptor]; #ifdef __APPLE__ /* Use fork instead of vfork on Darwin because setsid() fails under * Darwin 7 (aka OS X 10.3) and later while the child is in the vfork. */ #define vfork fork #endif pid = vfork(); if (pid < 0) { if (error) { *error = [NSError _last]; } return NO; } if (pid == 0) { int i; /* Make sure the task gets default signal setup. */ for (i = 0; i < 32; i++) { signal(i, SIG_DFL); } /* Make sure task is session leader in it's own process group * and with no controlling terminal. * This allows us to use killpg() to put the task to sleep etc, * and have the signal effect forked children of the subtask. */ #if defined(HAVE_SETSID) setsid(); #else #if defined(HAVE_SETPGRP) #if defined(SETPGRP_VOID) setpgrp(); #else setpgrp(getpid(), getpid()); #endif #else #if defined(HAVE_SETPGID) #if defined(_WIN32) pid = (int)GetCurrentProcessId(), #else pid = (int)getpid(); #endif setpgid(pid, pid); #endif /* HAVE_SETPGID */ #endif /* HAVE_SETPGRP */ /* Detach from controlling terminal. */ #if defined(TIOCNOTTY) i = open("/dev/tty", O_RDWR); if (i >= 0) { (void)ioctl(i, TIOCNOTTY, 0); (void)close(i); } #endif /* TIOCNOTTY */ #endif /* HAVE_SETSID */ if (_usePseudoTerminal == YES) { int s; s = pty_slave(slave_name); if (s < 0) { exit(1); /* Failed to open slave! */ } /* Set up stdin, stdout and stderr by duplicating descriptor as * necessary and closing the original. */ if (dup2(s, 0) != 0) exit(1); if (dup2(s, 1) != 1) exit(1); if (dup2(s, 2) != 2) exit(1); if (s != 0 && s != 1 && s != 2) { (void)close(s); } } else { /* Set up stdin, stdout and stderr by duplicating descriptors as * necessary and closing the originals (to ensure we won't have a * pipe left with two write descriptors etc). */ if (idesc != 0) { if (dup2(idesc, 0) != 0) exit(1); } if (odesc != 1) { if (dup2(odesc, 1) != 1) exit(1); } if (edesc != 2) { if (dup2(edesc, 2) != 2) exit(1); } } /* * Close any extra descriptors. */ for (i = 3; i < NOFILE; i++) { (void) close(i); } (void)chdir(path); (void)execve(executable, (char**)args, (char**)envl); exit(-1); } else { _taskId = pid; _hasLaunched = YES; ASSIGN(_launchPath, lpath); // Actual path used. [tasksLock lock]; NSMapInsert(activeTasks, (void*)(intptr_t)_taskId, (void*)self); [tasksLock unlock]; /* * Close the ends of any pipes used by the child. */ while ([toClose count] > 0) { hdl = [toClose objectAtIndex: 0]; [hdl closeFile]; [toClose removeObjectAtIndex: 0]; } } return YES; } - (void) setStandardError: (id)hdl { if (_usePseudoTerminal == YES) { [NSException raise: NSInvalidArgumentException format: @"NSTask - set error for task on pseudo terminal"]; } [super setStandardError: hdl]; } - (void) setStandardInput: (id)hdl { if (_usePseudoTerminal == YES) { [NSException raise: NSInvalidArgumentException format: @"NSTask - set input for task on pseudo terminal"]; } [super setStandardInput: hdl]; } - (void) setStandardOutput: (id)hdl { if (_usePseudoTerminal == YES) { [NSException raise: NSInvalidArgumentException format: @"NSTask - set output for task on pseudo terminal"]; } [super setStandardOutput: hdl]; } - (void) _collectChild { if (_hasCollected == NO) { int result; int status; errno = 0; result = waitpid(_taskId, &status, WNOHANG); if (result > 0) { if (WIFEXITED(status)) { #if defined(WAITDEBUG) NSLog(@"waitpid %d, exit status = %d", result, status); #endif [self _terminatedChild: WEXITSTATUS(status) reason: NSTaskTerminationReasonExit]; } else if (WIFSIGNALED(status)) { #if defined(WAITDEBUG) NSLog(@"waitpid %d, termination status = %d", result, status); #endif [self _terminatedChild: WTERMSIG(status) reason: NSTaskTerminationReasonUncaughtSignal]; } else { NSLog(@"Warning ... task %d neither exited nor signalled", result); } } } } - (BOOL) usePseudoTerminal { int desc; int master; NSFileHandle *fh; if (_usePseudoTerminal == YES) { return YES; } master = pty_master(slave_name, sizeof(slave_name)); if (master < 0) { return NO; } fh = [[NSFileHandle alloc] initWithFileDescriptor: master closeOnDealloc: YES]; [self setStandardInput: fh]; RELEASE(fh); if ((desc = dup(master)) < 0) { return NO; } fh = [[NSFileHandle alloc] initWithFileDescriptor: desc closeOnDealloc: YES]; [self setStandardOutput: fh]; RELEASE(fh); if ((desc = dup(master)) < 0) { return NO; } fh = [[NSFileHandle alloc] initWithFileDescriptor: desc closeOnDealloc: YES]; [self setStandardError: fh]; RELEASE(fh); _usePseudoTerminal = YES; return YES; } @end #endif /* !_WIN32 */ gnustep-base-1.29.0/Source/NSTextCheckingResult.m000066400000000000000000000106501435650067400216520ustar00rootroot00000000000000/* Copyright (C) 2011 Free Software Foundation, Inc. This file is part of the GNUstep Library. 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 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 USA. */ #import "common.h" #import "Foundation/NSException.h" #import "Foundation/NSTextCheckingResult.h" #import "Foundation/NSRegularExpression.h" /** * Private class encapsulating a regular expression match. */ @interface GSRegularExpressionCheckingResult : NSTextCheckingResult { // TODO: This could be made more efficient by adding a variant that only // contained a single range. @public /** The number of ranges matched */ NSUInteger rangeCount; /** The array of ranges. */ NSRange *ranges; /** The regular expression object that generated this match. */ NSRegularExpression *regularExpression; } @end @implementation NSTextCheckingResult + (NSTextCheckingResult*) regularExpressionCheckingResultWithRanges: (NSRangePointer)ranges count: (NSUInteger)count regularExpression: (NSRegularExpression*)regularExpression { GSRegularExpressionCheckingResult *result = [GSRegularExpressionCheckingResult new]; result->rangeCount = count; result->ranges = calloc(sizeof(NSRange), count); memcpy(result->ranges, ranges, (sizeof(NSRange) * count)); ASSIGN(result->regularExpression, regularExpression); return [result autorelease]; } - (NSDictionary*) addressComponents { return nil; } - (NSDictionary*) components { return nil; } - (NSDate*) date { return nil; } - (NSTimeInterval) duration { return 0; } - (NSArray*) grammarDetails { return 0; } - (NSUInteger) numberOfRanges { return 1; } - (NSOrthography*) orthography { return nil; } - (NSString*) phoneNumber { return nil; } - (NSRange) range { [self subclassResponsibility: _cmd]; return NSMakeRange(NSNotFound, 0); } - (NSRegularExpression*) regularExpression { return nil; } - (NSString*) replacementString { return nil; } - (NSTextCheckingType) resultType { [self subclassResponsibility: _cmd]; return -1; } - (NSTimeZone*) timeZone { return nil; } - (NSURL*) URL { return nil; } - (NSRange) rangeAtIndex: (NSUInteger)idx { if (idx >= [self numberOfRanges]) { [NSException raise: NSInvalidArgumentException format: @"index %"PRIuPTR" out of range", idx]; } return [self range]; } - (NSTextCheckingResult *) resultByAdjustingRangesWithOffset: (NSInteger)offset { [self subclassResponsibility: _cmd]; return nil; } @end @implementation GSRegularExpressionCheckingResult - (void) dealloc { [regularExpression release]; free(ranges); [super dealloc]; } - (NSUInteger) numberOfRanges { return rangeCount; } - (NSRange) range { return ranges[0]; } - (NSRange) rangeAtIndex: (NSUInteger)idx { if (idx >= rangeCount) { [NSException raise: NSInvalidArgumentException format: @"index %"PRIuPTR" out of range", idx]; } return ranges[idx]; } - (NSRegularExpression*) regularExpression { return regularExpression; } - (NSTextCheckingType) resultType { return NSTextCheckingTypeRegularExpression; } - (NSTextCheckingResult*) resultByAdjustingRangesWithOffset: (NSInteger)offset { NSUInteger i; GSRegularExpressionCheckingResult *result = [[GSRegularExpressionCheckingResult new] autorelease]; result->rangeCount = rangeCount; result->ranges = calloc(sizeof(NSRange), rangeCount); for (i = 0; i < rangeCount; i++) { NSRange r = ranges[i]; if ((offset > 0 && NSNotFound - r.location <= offset) || (offset < 0 && r.location < -offset)) { [NSException raise: NSInvalidArgumentException format: @"Invalid offset %"PRIdPTR" for range: %@", offset, NSStringFromRange(r)]; } r.location += offset; result->ranges[i] = r; } ASSIGN(result->regularExpression, regularExpression); return result; } @end gnustep-base-1.29.0/Source/NSThread.m000066400000000000000000001733271435650067400173150ustar00rootroot00000000000000/** Control of executable units within a shared virtual memory space Copyright (C) 1996-2018 Free Software Foundation, Inc. Original Author: Scott Christley Rewritten by: Andrew Kachites McCallum Created: 1996 Rewritten by: Richard Frith-Macdonald to add optimisations features for faster thread access. Modified by: Nicola Pero to add GNUstep extensions allowing to interact with threads created by external libraries/code (eg, a Java Virtual Machine). This file is part of the GNUstep Objective-C Library. 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 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 USA. NSThread class reference $Date$ $Revision$ */ #import "common.h" #import "GSPThread.h" // Dummy implementatation // cleaner than IFDEF'ing the code everywhere #ifndef HAVE_PTHREAD_SPIN_LOCK typedef volatile int pthread_spinlock_t; int pthread_spin_init(pthread_spinlock_t *lock, int pshared) { #if DEBUG && !__has_builtin(__sync_bool_compare_and_swap) fprintf(stderr,"NSThread.m: Warning this platform does not support spin locks - init.\n"); #endif return 0; } int pthread_spin_lock(pthread_spinlock_t *lock) { #if __has_builtin(__sync_bool_compare_and_swap) int count = 0; // Set the spin lock value to 1 if it is 0. while(!__sync_bool_compare_and_swap(lock, 0, 1)) { count++; if (0 == count % 10) { // If it is already 1, let another thread play with the CPU for a // bit then try again. #if defined(_WIN32) Sleep(0); #else sleep(0); #endif } } #else #warning no spin_locks, using dummy versions #endif return 0; } int pthread_spin_unlock(pthread_spinlock_t *lock) { #if __has_builtin(__sync_bool_compare_and_swap) __sync_synchronize(); *lock = 0; #endif return 0; } int pthread_spin_destroy(pthread_spinlock_t *lock) { return 0; } #endif /* HAVE_PTHREAD_SPIN_LOCK */ /** Structure for holding lock information for a thread. */ typedef struct { pthread_spinlock_t spin; /* protect access to struct members */ NSHashTable *held; /* all locks/conditions held by thread */ id wait; /* the lock/condition we are waiting for */ } GSLockInfo; #define EXPOSE_NSThread_IVARS 1 #define GS_NSThread_IVARS \ gs_thread_id_t _pthreadID; \ NSUInteger _threadID; \ GSLockInfo _lockInfo #ifdef HAVE_NANOSLEEP # include #endif #ifdef HAVE_SYS_TIME_H # include #endif #ifdef HAVE_SYS_RESOURCE_H # include #endif #if defined(HAVE_SYS_FILE_H) # include #endif #if defined(HAVE_SYS_FCNTL_H) # include #elif defined(HAVE_FCNTL_H) # include #endif #if defined(__POSIX_SOURCE)\ || defined(__EXT_POSIX1_198808)\ || defined(O_NONBLOCK) #define NBLK_OPT O_NONBLOCK #else #define NBLK_OPT FNDELAY #endif #import "Foundation/NSException.h" #import "Foundation/NSHashTable.h" #import "Foundation/NSThread.h" #import "Foundation/NSLock.h" #import "Foundation/NSMapTable.h" #import "Foundation/NSNotification.h" #import "Foundation/NSNotificationQueue.h" #import "Foundation/NSRunLoop.h" #import "Foundation/NSConnection.h" #import "Foundation/NSInvocation.h" #import "Foundation/NSUserDefaults.h" #import "Foundation/NSValue.h" #import "GSPrivate.h" #import "GSRunLoopCtxt.h" #if defined(HAVE_PTHREAD_NP_H) # include #endif #if defined(HAVE_GETTID) # include # include # include #endif #define GSInternal NSThreadInternal #include "GSInternal.h" GS_PRIVATE_INTERNAL(NSThread) #define pthreadID (internal->_pthreadID) #define threadID (internal->_threadID) #define lockInfo (internal->_lockInfo) #if defined(HAVE_PTHREAD_MAIN_NP) # define IS_MAIN_PTHREAD (pthread_main_np() == 1) #elif defined(HAVE_GETTID) # define IS_MAIN_PTHREAD (getpid() == (pid_t)syscall(SYS_gettid)) #else # define IS_MAIN_PTHREAD (1) #endif /* Return the current thread ID as an unsigned long. * Ideally, we use the operating-system's notion of a thread ID so * that external process monitoring software will be using the same * value that we log. If we don't know the system's mechanism, we * use the address of the current NSThread object so that, even if * it makes no sense externally, it can still be used to show that * different threads generated different logs. */ NSUInteger GSPrivateThreadID() { #if defined(_WIN32) return (NSUInteger)GetCurrentThreadId(); #elif defined(HAVE_GETTID) return (NSUInteger)syscall(SYS_gettid); #elif defined(HAVE_PTHREAD_GETTHREADID_NP) return (NSUInteger)pthread_getthreadid_np(); #else return (NSUInteger)GSCurrentThread(); #endif } #if 0 /* * NSThread setName: method for windows. * FIXME ... This is code for the microsoft compiler; * how do we make it work for gcc/clang? */ #if defined(_WIN32) && defined(HAVE_WINDOWS_H) // Usage: SetThreadName (-1, "MainThread"); #include const DWORD MS_VC_EXCEPTION=0x406D1388; #pragma pack(push,8) typedef struct tagTHREADNAME_INFO { DWORD dwType; // Must be 0x1000. LPCSTR szName; // Pointer to name (in user addr space). DWORD dwThreadID; // Thread ID (-1=caller thread). DWORD dwFlags; // Reserved for future use, must be zero. } THREADNAME_INFO; #pragma pack(pop) static int SetThreadName(DWORD dwThreadID, const char *threadName) { THREADNAME_INFO info; int result; info.dwType = 0x1000; info.szName = threadName; info.dwThreadID = dwThreadID; info.dwFlags = 0; __try { RaiseException(MS_VC_EXCEPTION, 0, sizeof(info)/sizeof(ULONG_PTR), (ULONG_PTR*)&info); result = 0; } __except(EXCEPTION_EXECUTE_HANDLER) { result = -1; } } #define PTHREAD_SETNAME(a) SetThreadName(-1, a) #endif #endif #ifndef PTHREAD_SETNAME #define PTHREAD_SETNAME(a) -1 #endif @interface NSThread (Activation) - (void) _makeThreadCurrent; @end @interface NSAutoreleasePool (NSThread) + (void) _endThread: (NSThread*)thread; @end static Class threadClass = Nil; static NSNotificationCenter *nc = nil; static BOOL disableTraceLocks = NO; /** * This class performs a dual function ... *

* As a class, it is responsible for handling incoming events from * the main runloop on a special inputFd. This consumes any bytes * written to wake the main runloop.
* During initialisation, the default runloop is set up to watch * for data arriving on inputFd. *

*

* As instances, each instance retains perform receiver and argument * values as long as they are needed, and handles locking to support * methods which want to block until an action has been performed. *

*

* The initialize method of this class is called before any new threads * run. *

*/ @interface GSPerformHolder : NSObject { id receiver; id argument; SEL selector; NSConditionLock *lock; // Not retained. NSArray *modes; BOOL invalidated; @public NSException *exception; } + (GSPerformHolder*) newForReceiver: (id)r argument: (id)a selector: (SEL)s modes: (NSArray*)m lock: (NSConditionLock*)l; - (void) fire; - (void) invalidate; - (BOOL) isInvalidated; - (NSArray*) modes; @end /** * Sleep until the current date/time is the specified time interval * past the reference date/time.
* Implemented as a function taking an NSTimeInterval argument in order * to avoid objc messaging and object allocation/deallocation (NSDate) * overheads.
* Used to implement [NSThread+sleepUntilDate:] * If the date is in the past, this function simply allows other threads * (if any) to run. */ void GSSleepUntilIntervalSinceReferenceDate(NSTimeInterval when) { NSTimeInterval delay; // delay is always the number of seconds we still need to wait delay = when - GSPrivateTimeNow(); if (delay <= 0.0) { /* We don't need to wait, but since we are willing to wait at this * point, we should let other threads have preference over this one. */ GS_YIELD(); return; } #if defined(_WIN32) /* * Avoid integer overflow by breaking up long sleeps. */ while (delay > 30.0*60.0) { // sleep 30 minutes Sleep (30*60*1000); delay = when - GSPrivateTimeNow(); } /* Don't use nanosleep (even if available) on mingw ... it's reported no * to work with pthreads. * Sleeping may return early because of signals, so we need to re-calculate * the required delay and check to see if we need to sleep again. */ while (delay > 0) { #if defined(HAVE_USLEEP) /* On windows usleep() seems to perform a busy wait ... so we only * use it for short delays ... otherwise use the less accurate Sleep() */ if (delay > 0.1) { Sleep ((NSInteger)(delay*1000)); } else { usleep ((NSInteger)(delay*1000000)); } #else Sleep ((NSInteger)(delay*1000)); #endif /* HAVE_USLEEP */ delay = when - GSPrivateTimeNow(); } #else /* _WIN32 */ /* * Avoid integer overflow by breaking up long sleeps. */ while (delay > 30.0*60.0) { // sleep 30 minutes sleep(30*60); delay = when - GSPrivateTimeNow(); } #ifdef HAVE_NANOSLEEP if (delay > 0) { struct timespec request; struct timespec remainder; request.tv_sec = (time_t)delay; request.tv_nsec = (long)((delay - request.tv_sec) * 1000000000); remainder.tv_sec = 0; remainder.tv_nsec = 0; /* * With nanosleep, we can restart the sleep after a signal by using * the remainder information ... so we can be sure to sleep to the * desired limit without having to re-generate the delay needed. */ while (nanosleep(&request, &remainder) < 0 && (remainder.tv_sec > 0 || remainder.tv_nsec > 0)) { request.tv_sec = remainder.tv_sec; request.tv_nsec = remainder.tv_nsec; remainder.tv_sec = 0; remainder.tv_nsec = 0; } } #else /* HAVE_NANOSLEEP */ /* * sleeping may return early because of signals, so we need to re-calculate * the required delay and check to see if we need to sleep again. */ while (delay > 0) { #if defined(HAVE_USLEEP) usleep((NSInteger)(delay*1000000)); #else /* HAVE_USLEEP */ sleep((NSInteger)delay); #endif /* !HAVE_USLEEP */ delay = when - GSPrivateTimeNow(); } #endif /* !HAVE_NANOSLEEP */ #endif /* !_WIN32 */ } static NSArray * commonModes(void) { static NSArray *modes = nil; if (modes == nil) { [gnustep_global_lock lock]; if (modes == nil) { Class c = NSClassFromString(@"NSApplication"); SEL s = @selector(allRunLoopModes); if (c != 0 && [c respondsToSelector: s]) { modes = RETAIN([c performSelector: s]); } else { modes = [[NSArray alloc] initWithObjects: NSDefaultRunLoopMode, NSConnectionReplyMode, nil]; } } [gnustep_global_lock unlock]; } return modes; } /* * Flag indicating whether the objc runtime ever went multi-threaded. */ static BOOL entered_multi_threaded_state = NO; static NSThread *defaultThread; static BOOL keyInitialized = NO; static gs_thread_key_t thread_object_key; static NSHashTable *_activeBlocked = nil; static NSHashTable *_activeThreads = nil; static gs_mutex_t _activeLock = GS_MUTEX_INIT_STATIC; /** * pthread_t is an opaque type. It might be a scalar type or * some kind of struct depending on the implementation, so we * need to wrap it up in an NSValue object if we want to pass * it around. * This follows the CoreFoundation 'create rule' and returns an object with * a reference count of 1. */ static inline NSValue* NSValueCreateFromPthread(gs_thread_id_t thread) { return [[NSValue alloc] initWithBytes: &thread objCType: @encode(gs_thread_id_t)]; } /** * Conversely, we need to be able to retrieve the pthread_t * from an NSValue. */ static inline void _getPthreadFromNSValue(const void *value, gs_thread_id_t *thread_ptr) { const char *enc; NSCAssert(thread_ptr, @"No storage for thread reference"); # ifndef NS_BLOCK_ASSERTIONS enc = [(NSValue*)value objCType]; NSCAssert(enc != NULL && (0 == strcmp(@encode(gs_thread_id_t),enc)), @"Invalid NSValue container for thread reference"); # endif [(NSValue*)value getValue: (void*)thread_ptr]; } /** * This is the comparison function for boxed pthreads, as used by the * NSMapTable containing them. */ static BOOL _boxedPthreadIsEqual(NSMapTable *t, const void *boxed, const void *boxedOther) { gs_thread_id_t thread; gs_thread_id_t otherThread; _getPthreadFromNSValue(boxed, &thread); _getPthreadFromNSValue(boxedOther, &otherThread); #if GS_USE_WIN32_THREADS_AND_LOCKS return thread == otherThread; #else return pthread_equal(thread, otherThread); #endif } /** * Since pthread_t is opaque, we cannot make any assumption about how * to hash it. There are a few problems here: * 1. Functions to obtain the thread ID of an arbitrary thread * exist in the in the Win32 and some pthread APIs (GetThreadId() and * pthread_getunique_np(), respectively), but there is no protable solution * for this problem. * 2. Even where pthread_getunique_np() is available, it might have different * definitions, so it's not really robust to use it. * * For these reasons, we always return the same hash. That fulfills the API * contract for NSMapTable (key-hash equality as a necessary condition for key * equality), but makes things quite inefficient (linear search over all * elements), so we need to keep the table small. */ static NSUInteger _boxedPthreadHash(NSMapTable *t, const void *value) { return 0; } /** * Retain callback for boxed thread references. */ static void _boxedPthreadRetain(NSMapTable *t, const void *value) { RETAIN((NSValue*)value); } /** * Release callback for boxed thread references. */ static void _boxedPthreadRelease(NSMapTable *t, void *value) { RELEASE((NSValue*)value); } /** * Description callback for boxed thread references. */ static NSString *_boxedPthreadDescribe(NSMapTable *t, const void *value) { return [(NSValue*)value description]; } static const NSMapTableKeyCallBacks _boxedPthreadKeyCallBacks = { _boxedPthreadHash, _boxedPthreadIsEqual, _boxedPthreadRetain, _boxedPthreadRelease, _boxedPthreadDescribe, NULL }; /** * This map table maintains a list of all threads currently undergoing * cleanup. This is a required so that +currentThread can still find the * thred if called from within the late-cleanup function. */ static NSMapTable *_exitingThreads = nil; static gs_mutex_t _exitingThreadsLock = GS_MUTEX_INIT_STATIC; /** * Called before late cleanup is run and inserts the NSThread object into the * table that is used by GSCurrentThread to find the thread if it is called * during cleanup. The boxedThread variable contains a boxed reference to * the result of calling pthread_self(). */ static inline void _willLateUnregisterThread(NSValue *boxedThread, NSThread *specific) { GS_MUTEX_LOCK(_exitingThreadsLock); /* The map table is created lazily/late so that the NSThread * +initialize method can be called without causing other * classes to be initialized. * NB this locked section cannot be protected by an exception handler * because the exception handler stores information in the current * thread variables ... which causes recursion. */ if (nil == _exitingThreads) { _exitingThreads = NSCreateMapTable(_boxedPthreadKeyCallBacks, NSObjectMapValueCallBacks, 10); } NSMapInsert(_exitingThreads, (const void*)boxedThread, (const void*)specific); GS_MUTEX_UNLOCK(_exitingThreadsLock); } /** * Called after late cleanup has run. Will remove the current thread from * the lookup table again. The boxedThread variable contains a boxed reference * to the result of calling pthread_self(). */ static inline void _didLateUnregisterCurrentThread(NSValue *boxedThread) { /* NB this locked section cannot be protected by an exception handler * because the exception handler stores information in the current * thread variables ... which causes recursion. */ GS_MUTEX_LOCK(_exitingThreadsLock); if (nil != _exitingThreads) { NSMapRemove(_exitingThreads, (const void*)boxedThread); } GS_MUTEX_UNLOCK(_exitingThreadsLock); } /* * Forward declaration of the thread unregistration function */ static void unregisterActiveThread(NSThread *thread); /** * Pthread cleanup call. * * We should normally not get here ... because threads should exit properly * and clean up, so that this function doesn't get called. However if a * thread terminates for some reason without calling the exit method, we * we add it to a special lookup table that is used by GSCurrentThread() to * obtain the NSThread object. * We need to be a bit careful about this regarding object allocation because * we must not call into NSAutoreleasePool unless the NSThread object can still * be found using GSCurrentThread() */ static void GS_WINAPI exitedThread(void *thread) { if (thread != defaultThread) { NSValue *ref; if (0 == thread) { /* On some systems this is called with a null thread pointer, * so try to get the NSThread object for the current thread. */ thread = GS_THREAD_KEY_GET(thread_object_key); if (0 == thread) { return; // no thread info } } RETAIN((NSThread*)thread); ref = NSValueCreateFromPthread(GS_THREAD_ID_SELF()); _willLateUnregisterThread(ref, (NSThread*)thread); { CREATE_AUTORELEASE_POOL(arp); NS_DURING { unregisterActiveThread((NSThread*)thread); } NS_HANDLER { DESTROY(arp); _didLateUnregisterCurrentThread(ref); DESTROY(ref); RELEASE((NSThread*)thread); } NS_ENDHANDLER DESTROY(arp); } /* At this point threre shouldn't be any autoreleased objects lingering * around anymore. So we may remove the thread from the lookup table. */ _didLateUnregisterCurrentThread(ref); DESTROY(ref); RELEASE((NSThread*)thread); } } /** * These functions needed because sending messages to classes is a seriously * slow process with gcc and the gnu runtime. */ inline NSThread* GSCurrentThread(void) { NSThread *thr; if (NO == keyInitialized) { if (!GS_THREAD_KEY_INIT(thread_object_key, exitedThread)) { [NSException raise: NSInternalInconsistencyException format: @"Unable to create thread key!"]; } keyInitialized = YES; } thr = GS_THREAD_KEY_GET(thread_object_key); if (nil == thr) { NSValue *selfThread = NSValueCreateFromPthread(GS_THREAD_ID_SELF()); /* NB this locked section cannot be protected by an exception handler * because the exception handler stores information in the current * thread variables ... which causes recursion. */ if (nil != _exitingThreads) { GS_MUTEX_LOCK(_exitingThreadsLock); thr = NSMapGet(_exitingThreads, (const void*)selfThread); GS_MUTEX_UNLOCK(_exitingThreadsLock); } DESTROY(selfThread); if (nil == thr) { GSRegisterCurrentThread(); thr = GS_THREAD_KEY_GET(thread_object_key); if ((nil == defaultThread) && IS_MAIN_PTHREAD) { defaultThread = RETAIN(thr); } } assert(nil != thr && "No main thread"); } return thr; } NSMutableDictionary* GSDictionaryForThread(NSThread *t) { if (nil == t) { t = GSCurrentThread(); } return [t threadDictionary]; } /** * Fast access function for thread dictionary of current thread. */ NSMutableDictionary* GSCurrentThreadDictionary(void) { return GSDictionaryForThread(nil); } /* * Callback function to send notifications on becoming multi-threaded. */ static void gnustep_base_thread_callback(void) { static gs_mutex_t threadLock = GS_MUTEX_INIT_STATIC; /* * Protect this function with locking ... to avoid any possibility * of multiple threads registering with the system simultaneously, * and so that all NSWillBecomeMultiThreadedNotifications are sent * out before any second thread can interfere with anything. */ if (entered_multi_threaded_state == NO) { GS_MUTEX_LOCK(threadLock); if (entered_multi_threaded_state == NO) { /* * For apple compatibility ... and to make things easier for * code called indirectly within a will-become-multi-threaded * notification handler, we set the flag to say we are multi * threaded BEFORE sending the notifications. */ entered_multi_threaded_state = YES; /* * Enter pool after setting flag, because -[NSAutoreleasePool * allocWithZone:] calls GSCurrentThread(), which may end up * calling this function, which would cause a deadlock. */ ENTER_POOL NS_DURING { [GSPerformHolder class]; // Force initialization /* * Post a notification if this is the first new thread * to be created. * Won't work properly if threads are not all created * by this class, but it's better than nothing. */ if (nc == nil) { nc = RETAIN([NSNotificationCenter defaultCenter]); } #if !defined(HAVE_INITIALIZE) if (NO == [[NSUserDefaults standardUserDefaults] boolForKey: @"GSSilenceInitializeWarning"]) { NSLog(@"WARNING your program is becoming multi-threaded, but you are using an ObjectiveC runtime library which does not have a thread-safe implementation of the +initialize method. Please see README.initialize for more information."); } #endif [nc postNotificationName: NSWillBecomeMultiThreadedNotification object: nil userInfo: nil]; } NS_HANDLER { fprintf(stderr, "ALERT ... exception while becoming multi-threaded ... system may not be\n" "properly initialised.\n"); fflush(stderr); } NS_ENDHANDLER LEAVE_POOL } GS_MUTEX_UNLOCK(threadLock); } } @implementation NSThread (Activation) - (void) _makeThreadCurrent { /* NB. We must set up the pointer to the new NSThread instance from * pthread specific memory before we do anything which might need to * check what the current thread is (like getting the ID)! */ GS_THREAD_KEY_SET(thread_object_key, self); threadID = GSPrivateThreadID(); GS_MUTEX_LOCK(_activeLock); /* The hash table is created lazily/late so that the NSThread * +initialize method can be called without causing other * classes to be initialized. * NB this locked section cannot be protected by an exception handler * because the exception handler stores information in the current * thread variables ... which causes recursion. */ if (nil == _activeThreads) { _activeThreads = NSCreateHashTable( NSNonRetainedObjectHashCallBacks, 100); } NSHashInsert(_activeThreads, (const void*)self); GS_MUTEX_UNLOCK(_activeLock); } @end @implementation NSThread static void setThreadForCurrentThread(NSThread *t) { [t _makeThreadCurrent]; gnustep_base_thread_callback(); } static void unregisterActiveThread(NSThread *thread) { if (thread->_active == YES) { /* Let observers know this thread is exiting. */ ENTER_POOL if (nc == nil) { nc = RETAIN([NSNotificationCenter defaultCenter]); } [nc postNotificationName: NSThreadWillExitNotification object: thread userInfo: nil]; /* Set the thread to be finished *after* notification it will exit. * This is the order OSX 10.15.4 does it (May 2020). */ thread->_active = NO; thread->_finished = YES; [(GSRunLoopThreadInfo*)thread->_runLoopInfo invalidate]; LEAVE_POOL RELEASE(thread); GS_THREAD_KEY_SET(thread_object_key, nil); } } + (NSArray*) callStackReturnAddresses { GSStackTrace *stack; NSArray *addrs; stack = [GSStackTrace new]; [stack trace]; addrs = RETAIN([stack addresses]); RELEASE(stack); return AUTORELEASE(addrs); } + (BOOL) _createThreadForCurrentPthread { NSThread *t = GS_THREAD_KEY_GET(thread_object_key); if (t == nil) { t = [self new]; t->_active = YES; [t _makeThreadCurrent]; GS_CONSUMED(t); if (defaultThread != nil && t != defaultThread) { gnustep_base_thread_callback(); } return YES; } return NO; } + (NSThread*) currentThread { return GSCurrentThread(); } + (void) detachNewThreadSelector: (SEL)aSelector toTarget: (id)aTarget withObject: (id)anArgument { NSThread *thread; /* * Create the new thread. */ thread = [[NSThread alloc] initWithTarget: aTarget selector: aSelector object: anArgument]; [thread start]; RELEASE(thread); } + (void) exit { NSThread *t; t = GSCurrentThread(); if (t->_active == YES) { unregisterActiveThread(t); if (t == defaultThread || defaultThread == nil) { /* For the default thread, we exit the process. */ exit(0); } else { #if GS_USE_WIN32_THREADS_AND_LOCKS _endthread(); #else pthread_exit(NULL); #endif } } } /* * Class initialization */ + (void) initialize { if (self == [NSThread class]) { if (NO == keyInitialized) { if (!GS_THREAD_KEY_INIT(thread_object_key, exitedThread)) { [NSException raise: NSInternalInconsistencyException format: @"Unable to create thread key!"]; } keyInitialized = YES; } /* Ensure that the default thread exists. * It's safe to create a lock here (since [NSObject+initialize] * creates locks, and locks don't depend on any other class), * but we want to avoid initialising other classes while we are * initialising NSThread. */ threadClass = self; GSCurrentThread(); } } + (BOOL) isMainThread { return (GSCurrentThread() == defaultThread ? YES : NO); } + (BOOL) isMultiThreaded { return entered_multi_threaded_state; } + (NSThread*) mainThread { return defaultThread; } /** * Set the priority of the current thread. This is a value in the * range 0.0 (lowest) to 1.0 (highest) which is mapped to the underlying * system priorities. */ + (BOOL) setThreadPriority: (double)pri { #if GS_USE_WIN32_THREADS_AND_LOCKS // convert [0.0,1.0] priority to Windows defines int winPri; if (pri <= 0.0) { winPri = THREAD_PRIORITY_IDLE; } else if (pri <= 0.25) { winPri = THREAD_PRIORITY_LOWEST; } else if (pri < 0.5) { winPri = THREAD_PRIORITY_BELOW_NORMAL; } else if (pri >= 1.0) { winPri = THREAD_PRIORITY_TIME_CRITICAL; } else if (pri >= 0.75) { winPri = THREAD_PRIORITY_HIGHEST; } else if (pri > 0.5) { winPri = THREAD_PRIORITY_ABOVE_NORMAL; } else { winPri = THREAD_PRIORITY_NORMAL; } if (!SetThreadPriority(GetCurrentThread(), winPri)) { NSLog(@"Failed to set thread priority %d: %@", winPri, [NSError _last]); return NO; } return YES; #elif defined(_POSIX_THREAD_PRIORITY_SCHEDULING) && (_POSIX_THREAD_PRIORITY_SCHEDULING > 0) int res; int policy; struct sched_param param; // Clamp pri into the required range. if (pri > 1) { pri = 1; } if (pri < 0) { pri = 0; } res = pthread_getschedparam(pthread_self(), &policy, ¶m); if (res == 0) { int min = sched_get_priority_min(policy); int max = sched_get_priority_max(policy); if (min == max) { // priority not settable => fail silently return NO; } // Scale pri based on the range of the host system. pri = min + pri * (max - min); param.sched_priority = pri; res = pthread_setschedparam(pthread_self(), policy, ¶m); } if (res != 0) { NSLog(@"Failed to set thread priority %f: %d", pri, res); return NO; } return YES; #else return NO; #endif } + (void) sleepForTimeInterval: (NSTimeInterval)ti { GSSleepUntilIntervalSinceReferenceDate(GSPrivateTimeNow() + ti); } /** * Delaying a thread ... pause until the specified date. */ + (void) sleepUntilDate: (NSDate*)date { GSSleepUntilIntervalSinceReferenceDate([date timeIntervalSinceReferenceDate]); } /** * Return the priority of the current thread. */ + (double) threadPriority { double pri = 0; #if GS_USE_WIN32_THREADS_AND_LOCKS // convert [0.0,1.0] priority to Windows defines int winPri = GetThreadPriority(GetCurrentThread()); if (winPri == THREAD_PRIORITY_ERROR_RETURN) { NSLog(@"Failed to get thread priority: %@", [NSError _last]); return pri; } switch (winPri) { case THREAD_PRIORITY_IDLE: pri = 0.0; break; case THREAD_PRIORITY_LOWEST: pri = 0.2; break; case THREAD_PRIORITY_BELOW_NORMAL: pri = 0.4; break; case THREAD_PRIORITY_TIME_CRITICAL: pri = 1.0; break; case THREAD_PRIORITY_HIGHEST: pri = 0.8; break; case THREAD_PRIORITY_ABOVE_NORMAL: pri = 0.6; break; case THREAD_PRIORITY_NORMAL: pri = 0.5; break; default: NSLog(@"Unknown thread priority: %d", winPri); break; } #elif defined(_POSIX_THREAD_PRIORITY_SCHEDULING) && (_POSIX_THREAD_PRIORITY_SCHEDULING > 0) int res; int policy; struct sched_param param; res = pthread_getschedparam(pthread_self(), &policy, ¶m); if (res == 0) { int min = sched_get_priority_min(policy); int max = sched_get_priority_max(policy); if (min != max) /* avoid division by zero */ { pri = param.sched_priority; // Scale pri based on the range of the host system. pri = (pri - min) / (max - min); } } else { NSLog(@"Failed to get thread priority: %d", res); } #else #warning Your pthread implementation does not support thread priorities #endif return pri; } /* * Thread instance methods. */ - (void) cancel { _cancelled = YES; } - (void) dealloc { int retries = 0; if (_active == YES) { [NSException raise: NSInternalInconsistencyException format: @"Deallocating an active thread without [+exit]!"]; } DESTROY(_runLoopInfo); DESTROY(_thread_dictionary); DESTROY(_target); DESTROY(_arg); DESTROY(_name); if (_autorelease_vars.pool_cache != 0) { [NSAutoreleasePool _endThread: self]; } while ((_thread_dictionary != nil || _runLoopInfo != nil) && retries++ < 10) { /* Try again. */ DESTROY(_runLoopInfo); DESTROY(_thread_dictionary); if (_autorelease_vars.pool_cache != 0) { [NSAutoreleasePool _endThread: self]; } } if (_runLoopInfo != nil) { NSLog(@"Oops - leak - run loop is %@", _runLoopInfo); if (_autorelease_vars.pool_cache != 0) { [NSAutoreleasePool _endThread: self]; } } if (_thread_dictionary != nil) { NSLog(@"Oops - leak - thread dictionary is %@", _thread_dictionary); if (_autorelease_vars.pool_cache != 0) { [NSAutoreleasePool _endThread: self]; } } DESTROY(_gcontext); if (_activeThreads) { GS_MUTEX_LOCK(_activeLock); NSHashRemove(_activeThreads, self); GS_MUTEX_UNLOCK(_activeLock); } if (GS_EXISTS_INTERNAL) { pthread_spin_lock(&lockInfo.spin); DESTROY(lockInfo.held); lockInfo.wait = nil; pthread_spin_unlock(&lockInfo.spin); pthread_spin_destroy(&lockInfo.spin); if (internal != nil) { GS_DESTROY_INTERNAL(NSThread); } } [super dealloc]; } - (NSString*) description { return [NSString stringWithFormat: @"%@{name = %@, num = %"PRIuPTR"}", [super description], _name, threadID]; } - (id) init { GS_CREATE_INTERNAL(NSThread); pthread_spin_init(&lockInfo.spin, 0); lockInfo.held = NSCreateHashTable(NSNonOwnedPointerHashCallBacks, 10); init_autorelease_thread_vars(&_autorelease_vars); return self; } - (id) initWithTarget: (id)aTarget selector: (SEL)aSelector object: (id)anArgument { if (nil != (self = [self init])) { /* initialize our ivars. */ _selector = aSelector; _target = RETAIN(aTarget); _arg = RETAIN(anArgument); } return self; } - (BOOL) isCancelled { return _cancelled; } - (BOOL) isExecuting { return _active; } - (BOOL) isFinished { return _finished; } - (BOOL) isMainThread { return (self == defaultThread ? YES : NO); } - (void) main { if (_active == NO) { [NSException raise: NSInternalInconsistencyException format: @"[%@-%@] called on inactive thread", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; } [_target performSelector: _selector withObject: _arg]; } - (NSString*) name { return _name; } - (void) _setName: (NSString *)aName { if ([aName isKindOfClass: [NSString class]]) { int i; char buf[200]; if (YES == [aName getCString: buf maxLength: sizeof(buf) encoding: NSUTF8StringEncoding]) { i = strlen(buf); } else { /* Too much for buffer ... truncate on a character boundary. */ i = sizeof(buf) - 1; if (buf[i] & 0x80) { while (i > 0 && (buf[i] & 0x80)) { buf[i--] = '\0'; } } else { buf[i--] = '\0'; } } while (i > 0) { if (PTHREAD_SETNAME(buf) == ERANGE) { /* Name must be too long ... gnu/linux uses 15 characters */ if (i > 15) { i = 15; } else { i--; } /* too long a name ... truncate on a character boundary. */ if (buf[i] & 0x80) { while (i > 0 && (buf[i] & 0x80)) { buf[i--] = '\0'; } } else { buf[i--] = '\0'; } } else { break; // Success or some other error } } } } - (void) setName: (NSString*)aName { ASSIGN(_name, aName); #ifdef PTHREAD_SETNAME if (YES == _active) { [self performSelector: @selector(_setName:) onThread: self withObject: aName waitUntilDone: NO]; } #endif } - (void) setStackSize: (NSUInteger)stackSize { _stackSize = stackSize; } - (NSUInteger) stackSize { return _stackSize; } /** * Trampoline function called to launch the thread */ static #if GS_USE_WIN32_THREADS_AND_LOCKS void __cdecl #else void * #endif nsthreadLauncher(void *thread) { NSThread *t = (NSThread*)thread; setThreadForCurrentThread(t); /* * Let observers know a new thread is starting. */ if (nc == nil) { nc = RETAIN([NSNotificationCenter defaultCenter]); } [nc postNotificationName: NSThreadDidStartNotification object: t userInfo: nil]; [t _setName: [t name]]; [t main]; [NSThread exit]; // Not reached #if !GS_USE_WIN32_THREADS_AND_LOCKS return NULL; #endif } - (void) start { #if !GS_USE_WIN32_THREADS_AND_LOCKS pthread_attr_t attr; #endif if (_active == YES) { [NSException raise: NSInternalInconsistencyException format: @"[%@-%@] called on active thread", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; } if (_cancelled == YES) { [NSException raise: NSInternalInconsistencyException format: @"[%@-%@] called on cancelled thread", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; } if (_finished == YES) { [NSException raise: NSInternalInconsistencyException format: @"[%@-%@] called on finished thread", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; } /* Make sure the notification is posted BEFORE the new thread starts. */ gnustep_base_thread_callback(); /* The thread must persist until it finishes executing. */ RETAIN(self); /* Mark the thread as active while it's running. */ _active = YES; errno = 0; #if GS_USE_WIN32_THREADS_AND_LOCKS if (_beginthread(nsthreadLauncher, _stackSize, self) == -1) { DESTROY(self); [NSException raise: NSInternalInconsistencyException format: @"Unable to detach thread (last error %d)", errno]; } #else pthread_attr_init(&attr); /* Create this thread detached, because we never use the return state from * threads. */ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); /* Set the stack size when the thread is created. Unlike the old setrlimit * code, this actually works. */ if (_stackSize > 0) { pthread_attr_setstacksize(&attr, _stackSize); } if (pthread_create(&pthreadID, &attr, nsthreadLauncher, self)) { DESTROY(self); [NSException raise: NSInternalInconsistencyException format: @"Unable to detach thread (last error %@)", [NSError _last]]; } #endif } /** * Return the thread dictionary. This dictionary can be used to store * arbitrary thread specific data.
* NB. This cannot be autoreleased, since we cannot be sure that the * autorelease pool for the thread will continue to exist for the entire * life of the thread! */ - (NSMutableDictionary*) threadDictionary { if (_thread_dictionary == nil) { _thread_dictionary = [NSMutableDictionary new]; } return _thread_dictionary; } @end @implementation NSThread (GSLockInfo) static NSString * lockInfoErr(NSString *str) { if (disableTraceLocks) { return nil; } return str; } - (NSString *) mutexDrop: (id)mutex { if (GS_EXISTS_INTERNAL) { GSLockInfo *li = &lockInfo; int err; if (YES == disableTraceLocks) return nil; err = pthread_spin_lock(&li->spin); if (EDEADLK == err) return lockInfoErr(@"thread spin lock deadlocked"); if (EINVAL == err) return lockInfoErr(@"thread spin lock invalid"); if (mutex == li->wait) { /* The mutex was being waited for ... simply remove it. */ li->wait = nil; } else if (NSHashGet(li->held, (void*)mutex) == (void*)mutex) { GSStackTrace *stck = [mutex stack]; /* The mutex was being held ... if the recursion count was zero * we remove it (otherwise the count is decreased). */ if (stck->recursion-- == 0) { NSHashRemove(li->held, (void*)mutex); // fprintf(stderr, "%lu: Drop %p (final) %lu\n", (unsigned long)_threadID, mutex, [li->held count]); } else { // fprintf(stderr, "%lu: Drop %p (%lu) %lu\n", (unsigned long)threadID, mutex, (unsigned long)stck->recursion, [li->held count]); } } else { // fprintf(stderr, "%lu: Drop %p (bad) %lu\n", (unsigned long)threadID, mutex, [li->held count]); pthread_spin_unlock(&li->spin); return lockInfoErr( @"attempt to unlock mutex not locked by this thread"); } pthread_spin_unlock(&li->spin); return nil; } return lockInfoErr(@"thread not active"); } - (NSString *) mutexHold: (id)mutex { if (GS_EXISTS_INTERNAL) { GSLockInfo *li = &lockInfo; int err; if (YES == disableTraceLocks) return nil; err = pthread_spin_lock(&li->spin); if (EDEADLK == err) return lockInfoErr(@"thread spin lock deadlocked"); if (EINVAL == err) return lockInfoErr(@"thread spin lock invalid"); if (nil == mutex) { mutex = li->wait; if (nil == mutex) { pthread_spin_unlock(&li->spin); return lockInfoErr(@"attempt to hold nil mutex"); } } else if (nil != li->wait && mutex != li->wait) { pthread_spin_unlock(&li->spin); return lockInfoErr(@"attempt to hold mutex without waiting for it"); } if (NSHashGet(li->held, (void*)mutex) == NULL) { [[mutex stack] trace]; // Get current strack trace NSHashInsert(li->held, (void*)mutex); // fprintf(stderr, "%lu: Hold %p (initial) %lu\n", (unsigned long)threadID, mutex, [li->held count]); } else { GSStackTrace *stck = [mutex stack]; stck->recursion++; // fprintf(stderr, "%lu: Hold %p (%lu) %lu\n", (unsigned long)threadID, mutex, (unsigned long)stck->recursion, [li->held count]); } li->wait = nil; pthread_spin_unlock(&li->spin); return nil; } return lockInfoErr(@"thread not active"); } - (NSString *) mutexWait: (id)mutex { if (GS_EXISTS_INTERNAL) { NSMutableArray *dependencies; id want; BOOL done; GSLockInfo *li = &lockInfo; BOOL owned = NO; int err; if (YES == disableTraceLocks) return nil; err = pthread_spin_lock(&li->spin); if (EDEADLK == err) return lockInfoErr(@"thread spin lock deadlocked"); if (EINVAL == err) return lockInfoErr(@"thread spin lock invalid"); if (nil != li->wait) { NSString *msg = [NSString stringWithFormat: @ "trying to lock %@ when already trying to lock %@", mutex, li->wait]; pthread_spin_unlock(&li->spin); return lockInfoErr(msg); } li->wait = mutex; if (nil != NSHashGet(li->held, (const void*)mutex)) { owned = YES; } pthread_spin_unlock(&li->spin); // fprintf(stderr, "%lu: Wait %p\n", (unsigned long)_threadID, mutex); if (YES == owned && [mutex isKindOfClass: [NSRecursiveLock class]]) { return nil; // We can't deadlock on a recursive lock we own } /* While checking for deadlocks we don't want threads created/destroyed * So we hold the lock to prevent thread activity changes. * This also ensures that no more than one thread can be checking for * deadlocks at a time (no interference between checks). */ GS_MUTEX_LOCK(_activeLock); /* As we isolate dependencies (a thread holding the lock another thread * is waiting for) we disable locking in each thread and record the * thread in a hash table. Once we have determined all the dependencies * we can re-enable locking in each of the threads. */ if (nil == _activeBlocked) { _activeBlocked = NSCreateHashTable( NSNonRetainedObjectHashCallBacks, 100); } dependencies = nil; want = mutex; done = NO; while (NO == done) { NSHashEnumerator enumerator; NSThread *found = nil; BOOL foundWasLocked = NO; NSThread *th; /* Look for a thread which is holding the mutex we are currently * interested in. We are only interested in thread which are * themselves waiting for a lock (if they aren't waiting then * they can't be part of a deadlock dependency list). */ enumerator = NSEnumerateHashTable(_activeThreads); while ((th = NSNextHashEnumeratorItem(&enumerator)) != nil) { GSLockInfo *info = &GSIVar(th, _lockInfo); if (YES == th->_active && nil != info->wait) { BOOL wasLocked; GSStackTrace *stck; if (th == self || NULL != NSHashGet(_activeBlocked, (const void*)th)) { /* Don't lock ... this is the current thread or is * already in the set of blocked threads. */ wasLocked = YES; } else { pthread_spin_lock(&info->spin); wasLocked = NO; } if (nil != info->wait && nil != (stck = NSHashGet(info->held, (const void*)want))) { /* This thread holds the lock we are interested in and * is waiting for another lock. * We therefore record the details in the dependency list * and will go on to look for the thread this found one * depends on. */ found = th; foundWasLocked = wasLocked; want = info->wait; if (nil == dependencies) { dependencies = [NSMutableArray new]; } [dependencies addObject: found]; // thread [dependencies addObject: want]; // mutex /* NB. breaking out here holds the spin lock so that * the lock state of each dependency thread is * preserved (if we don't have a deadlock, we get a * consistent snapshot of the threads and their locks). * We therefore have to unlock the threads when done. */ break; } /* This thread did not hold the lock we are interested in, * so we can unlock it (if necessary) and check another. */ if (NO == wasLocked) { pthread_spin_unlock(&info->spin); } } } NSEndHashTableEnumeration(&enumerator); if (nil == found) { /* There is no thread blocked on the mutex we are checking, * so we can't have a deadlock. */ DESTROY(dependencies); done = YES; } else if (foundWasLocked) { /* The found thread is the current one or in the blocked set * so we have a deadlock. */ done = YES; } else { /* Record the found (and locked) thread and continue * to find the next dependency. */ NSHashInsert(_activeBlocked, (const void*)found); } } /* Ensure any locked threads are unlocked again. */ if (NSCountHashTable(_activeBlocked) > 0) { NSHashEnumerator enumerator; NSThread *th; enumerator = NSEnumerateHashTable(_activeThreads); while ((th = NSNextHashEnumeratorItem(&enumerator)) != nil) { GSLockInfo *info = &GSIVar(th, _lockInfo); pthread_spin_unlock(&info->spin); } NSEndHashTableEnumeration(&enumerator); NSResetHashTable(_activeBlocked); } /* Finished check ... re-enable thread activity changes. */ GS_MUTEX_UNLOCK(_activeLock); if (nil != dependencies) { GSStackTrace *stack; NSUInteger count; NSUInteger index = 0; NSMutableString *m; disableTraceLocks = YES; m = [NSMutableString stringWithCapacity: 1000]; stack = [GSStackTrace new]; [stack trace]; [m appendFormat: @"Deadlock on %@ at\n %@\n", mutex, [stack symbols]]; RELEASE(stack); count = [dependencies count]; while (index < count) { NSArray *symbols; NSThread *thread; NSUInteger frameCount; thread = [dependencies objectAtIndex: index++]; mutex = [dependencies objectAtIndex: index++]; symbols = [[mutex stack] symbols]; frameCount = [symbols count]; if (frameCount > 0) { NSUInteger i; [m appendFormat: @" depends on %@\n blocked by %@\n at\n", mutex, thread]; for (i = 0; i < frameCount; i++) { [m appendFormat: @" %@\n", [symbols objectAtIndex: i]]; } } else { [m appendFormat: @" depends on %@\n blocked by %@\n", mutex, thread]; } } DESTROY(dependencies); /* NB. Return m directly because we have turned off tracing to * avoid recursion, and don't want lockInfoErr() to stop the * error being ruturned. */ return m; } return nil; } return lockInfoErr(@"thread not active"); } @end @implementation GSRunLoopThreadInfo - (void) addPerformer: (id)performer { BOOL signalled = NO; [lock lock]; #if defined(_WIN32) if (INVALID_HANDLE_VALUE != event) { if (SetEvent(event) == 0) { NSLog(@"Set event failed - %@", [NSError _last]); } else { signalled = YES; } } #else { NSTimeInterval start = 0.0; /* The write could concievably fail if the pipe is full. * In that case we need to release the lock temporarily to allow the other * thread to consume data from the pipe. It's possible that the thread * and its runloop might stop during that ... so we need to check that * outputFd is still valid. */ while (outputFd >= 0 && NO == (signalled = (write(outputFd, "0", 1) == 1) ? YES : NO)) { NSTimeInterval now = [NSDate timeIntervalSinceReferenceDate]; if (0.0 == start) { start = now; } else if (now - start >= 1.0) { NSLog(@"Unable to signal %@ within a second; blocked?", self); break; } [lock unlock]; [lock lock]; } } #endif if (YES == signalled) { [performers addObject: performer]; } [lock unlock]; if (NO == signalled) { /* We failed to add the performer ... so we must invalidate it in * case there is code waiting for it to complete. */ [performer invalidate]; } } - (void) dealloc { [self invalidate]; DESTROY(lock); DESTROY(loop); [super dealloc]; } - (id) init { #ifdef _WIN32 if ((event = CreateEvent(NULL, TRUE, FALSE, NULL)) == INVALID_HANDLE_VALUE) { DESTROY(self); [NSException raise: NSInternalInconsistencyException format: @"Failed to create event to handle perform in thread"]; } #else int fd[2]; if (pipe(fd) == 0) { int e; inputFd = fd[0]; outputFd = fd[1]; if ((e = fcntl(inputFd, F_GETFL, 0)) >= 0) { e |= NBLK_OPT; if (fcntl(inputFd, F_SETFL, e) < 0) { [NSException raise: NSInternalInconsistencyException format: @"Failed to set non block flag for perform in thread"]; } } else { [NSException raise: NSInternalInconsistencyException format: @"Failed to get non block flag for perform in thread"]; } if ((e = fcntl(outputFd, F_GETFL, 0)) >= 0) { e |= NBLK_OPT; if (fcntl(outputFd, F_SETFL, e) < 0) { [NSException raise: NSInternalInconsistencyException format: @"Failed to set non block flag for perform in thread"]; } } else { [NSException raise: NSInternalInconsistencyException format: @"Failed to get non block flag for perform in thread"]; } } else { DESTROY(self); [NSException raise: NSInternalInconsistencyException format: @"Failed to create pipe to handle perform in thread"]; } #endif lock = [NSLock new]; performers = [NSMutableArray new]; return self; } - (void) invalidate { NSArray *p; [lock lock]; p = AUTORELEASE(performers); performers = nil; #ifdef _WIN32 if (event != INVALID_HANDLE_VALUE) { CloseHandle(event); event = INVALID_HANDLE_VALUE; } #else if (inputFd >= 0) { close(inputFd); inputFd = -1; } if (outputFd >= 0) { close(outputFd); outputFd = -1; } #endif [lock unlock]; [p makeObjectsPerformSelector: @selector(invalidate)]; } - (void) fire { NSArray *toDo; unsigned int i; unsigned int c; [lock lock]; #if defined(_WIN32) if (event != INVALID_HANDLE_VALUE) { if (ResetEvent(event) == 0) { NSLog(@"Reset event failed - %@", [NSError _last]); } } #else if (inputFd >= 0) { char buf[BUFSIZ]; /* We don't care how much we read. If there have been multiple * performers queued then there will be multiple bytes available, * but we always handle all available performers, so we can also * read all available bytes. * The descriptor is non-blocking ... so it's safe to ask for more * bytes than are available. */ while (read(inputFd, buf, sizeof(buf)) > 0) ; } #endif c = [performers count]; if (0 == c) { /* We deal with all available performers each time we fire, so * it's likely that we will fire when we have no performers left. * In that case we can skip the copying and emptying of the array. */ [lock unlock]; return; } toDo = [NSArray arrayWithArray: performers]; [performers removeAllObjects]; [lock unlock]; for (i = 0; i < c; i++) { GSPerformHolder *h = [toDo objectAtIndex: i]; [loop performSelector: @selector(fire) target: h argument: nil order: 0 modes: [h modes]]; } } @end GSRunLoopThreadInfo * GSRunLoopInfoForThread(NSThread *aThread) { GSRunLoopThreadInfo *info; if (aThread == nil) { aThread = GSCurrentThread(); } if (aThread->_runLoopInfo == nil) { [gnustep_global_lock lock]; if (aThread->_runLoopInfo == nil) { aThread->_runLoopInfo = [GSRunLoopThreadInfo new]; } [gnustep_global_lock unlock]; } info = aThread->_runLoopInfo; return info; } @implementation GSPerformHolder + (GSPerformHolder*) newForReceiver: (id)r argument: (id)a selector: (SEL)s modes: (NSArray*)m lock: (NSConditionLock*)l { GSPerformHolder *h; h = (GSPerformHolder*)NSAllocateObject(self, 0, NSDefaultMallocZone()); h->receiver = RETAIN(r); h->argument = RETAIN(a); h->selector = s; h->modes = RETAIN(m); h->lock = l; return h; } - (void) dealloc { DESTROY(exception); DESTROY(receiver); DESTROY(argument); DESTROY(modes); if (lock != nil) { [lock lock]; [lock unlockWithCondition: 1]; lock = nil; } NSDeallocateObject(self); GSNOSUPERDEALLOC; } - (NSString*) description { return [[super description] stringByAppendingFormat: @" [%s %s]", class_getName(object_getClass(receiver)), sel_getName(selector)]; } - (void) fire { GSRunLoopThreadInfo *threadInfo; if (receiver == nil) { return; // Already fired! } threadInfo = GSRunLoopInfoForThread(GSCurrentThread()); [threadInfo->loop cancelPerformSelectorsWithTarget: self]; NS_DURING { [receiver performSelector: selector withObject: argument]; } NS_HANDLER { ASSIGN(exception, localException); if (nil == lock) { NSLog(@"*** NSRunLoop ignoring exception '%@' (reason '%@') " @"raised during perform in other thread... with receiver %p (%s) " @"and selector '%s'", [localException name], [localException reason], receiver, class_getName(object_getClass(receiver)), sel_getName(selector)); } } NS_ENDHANDLER DESTROY(receiver); DESTROY(argument); DESTROY(modes); if (lock != nil) { NSConditionLock *l = lock; [lock lock]; lock = nil; [l unlockWithCondition: 1]; } } - (void) invalidate { if (invalidated == NO) { invalidated = YES; DESTROY(receiver); if (lock != nil) { NSConditionLock *l = lock; [lock lock]; lock = nil; [l unlockWithCondition: 1]; } } } - (BOOL) isInvalidated { return invalidated; } - (NSArray*) modes { return modes; } @end @implementation NSObject (NSThreadPerformAdditions) - (void) performSelectorOnMainThread: (SEL)aSelector withObject: (id)anObject waitUntilDone: (BOOL)aFlag modes: (NSArray*)anArray { /* It's possible that this method could be called before the NSThread * class is initialised, so we check and make sure it's initiailised * if necessary. */ if (defaultThread == nil) { [NSThread currentThread]; } [self performSelector: aSelector onThread: defaultThread withObject: anObject waitUntilDone: aFlag modes: anArray]; } - (void) performSelectorOnMainThread: (SEL)aSelector withObject: (id)anObject waitUntilDone: (BOOL)aFlag { [self performSelectorOnMainThread: aSelector withObject: anObject waitUntilDone: aFlag modes: commonModes()]; } - (void) performSelector: (SEL)aSelector onThread: (NSThread*)aThread withObject: (id)anObject waitUntilDone: (BOOL)aFlag modes: (NSArray*)anArray { GSRunLoopThreadInfo *info; NSThread *t; if ([anArray count] == 0) { return; } t = GSCurrentThread(); if (aThread == nil) { aThread = t; } info = GSRunLoopInfoForThread(aThread); if (t == aThread) { /* Perform in current thread. */ if (aFlag == YES || info->loop == nil) { /* Wait until done or no run loop. */ [self performSelector: aSelector withObject: anObject]; } else { /* Don't wait ... schedule operation in run loop. */ [info->loop performSelector: aSelector target: self argument: anObject order: 0 modes: anArray]; } } else { GSPerformHolder *h; NSConditionLock *l = nil; if ([aThread isFinished] == YES) { [NSException raise: NSInternalInconsistencyException format: @"perform [%@-%@] attempted on finished thread (%@)", NSStringFromClass([self class]), NSStringFromSelector(aSelector), aThread]; } if (aFlag == YES) { l = [[NSConditionLock alloc] init]; } h = [GSPerformHolder newForReceiver: self argument: anObject selector: aSelector modes: anArray lock: l]; [info addPerformer: h]; if (l != nil) { [l lockWhenCondition: 1]; [l unlock]; RELEASE(l); if ([h isInvalidated] == NO) { /* If we have an exception passed back from the remote thread, * re-raise it. */ if (nil != h->exception) { NSException *e = AUTORELEASE(RETAIN(h->exception)); RELEASE(h); [e raise]; } } } RELEASE(h); } } - (void) performSelector: (SEL)aSelector onThread: (NSThread*)aThread withObject: (id)anObject waitUntilDone: (BOOL)aFlag { [self performSelector: aSelector onThread: aThread withObject: anObject waitUntilDone: aFlag modes: commonModes()]; } - (void) performSelectorInBackground: (SEL)aSelector withObject: (id)anObject { [NSThread detachNewThreadSelector: aSelector toTarget: self withObject: anObject]; } @end /** *

* This function is provided to let threads started by some other * software library register themselves to be used with the * GNUstep system. All such threads should call this function * before attempting to use any GNUstep objects. *

*

* Returns YES if the thread can be registered, * NO if it is already registered. *

*

* Sends out a NSWillBecomeMultiThreadedNotification * if the process was not already multithreaded. *

*/ BOOL GSRegisterCurrentThread(void) { return [NSThread _createThreadForCurrentPthread]; } /** *

* This function is provided to let threads started by some other * software library unregister themselves from the GNUstep threading * system. *

*

* Calling this function causes a * NSThreadWillExitNotification * to be sent out, and destroys the GNUstep NSThread object * associated with the thread (like [NSThread+exit]) but does * not exit the underlying thread. *

*/ void GSUnregisterCurrentThread(void) { unregisterActiveThread(GSCurrentThread()); } gnustep-base-1.29.0/Source/NSTimeZone.m000066400000000000000000002372001435650067400176270ustar00rootroot00000000000000/** Time zone management. -*- Mode: ObjC -*- Copyright (C) 1997-20 11Free Software Foundation, Inc. Written by: Yoo C. Chung Date: June 1997 Rewrite large chunks by: Richard Frith-Macdonald Date: September 2002 This file is part of the GNUstep Base Library. 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 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 USA. NSTimeZone class reference $Date$ $Revision$ */ /* Use the system time zones if available. In other cases, use an implementation independent of the system, since POSIX functions for time zones are woefully inadequate for implementing NSTimeZone. Time zone names can be different from system to system, but usually the user has already set up his timezone independant of GNUstep, so we should respect that information. We do not use a dictionary for storing time zones, since such a dictionary would be VERY large (~500K). And we would have to use a complicated object determining whether we're using daylight savings time and such for every entry in the dictionary. (Though we will eventually have to change the implementation to prevent the year 2038 problem.) The local time zone can be specified (with the ones listed first having precedence) by: 1) the user defaults database 2) the GNUSTEP_TZ environment variable 3) the file LOCAL_TIME_FILE in _time_zone_path() Failing that, the time zone may be guessed from system dependent sources such as: the windows registry the /etc/timezone file the /etc/sysconfig/clock file TZDEFAULT defined in tzfile.h the TZ environment variable tzset() & tznam[]/daylight If all else faile, the fallback time zone (which is GMT/UTC) Any time zone must be a file name in ZONES_DIR. Files & File System Heirarchy info: =================================== Default place for the NSTimeZone directory is _time_zone_path(): {$(GNUSTEP_SYSTEM_LIBRARY)/Libraries/gnustep-base/Versions/???/Resources/TIME_ZONE_DIR) LOCAL_TIME_FILE is a text file with the name of the time zone file. ZONES_DIR is a sub-directory under TIME_ZONE_DIR (dir) ../System/Library/Libraries/gnustep-base/Versions/???/Resources/.. (dir) NSTimeZone (file) localtime {text; time zone eg Australia/Perth} (dir) zones Note that full zone info is required, especially the various "GMT" files which are created especially for OPENSTEP compatibility. Zone info comes from the Olson time database. FIXME?: use leap seconds? */ #import "common.h" #define EXPOSE_NSTimeZone_IVARS 1 #import "GNUstepBase/GSLock.h" #include #include #import "Foundation/NSArray.h" #import "Foundation/NSCoder.h" #import "Foundation/NSData.h" #import "Foundation/NSDate.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSException.h" #import "Foundation/NSFileManager.h" #import "Foundation/NSLock.h" #import "Foundation/NSProcessInfo.h" #import "Foundation/NSUserDefaults.h" #import "Foundation/NSMapTable.h" #import "Foundation/NSThread.h" #import "Foundation/NSNotification.h" #import "Foundation/NSPortCoder.h" #import "Foundation/NSTimeZone.h" #import "Foundation/NSByteOrder.h" #import "Foundation/NSLocale.h" #import "GNUstepBase/NSString+GNUstepBase.h" #import "GSPrivate.h" #import "GSPThread.h" /* In systems without POSIX time zone information we can use our own builtin * time zone data. */ #if defined(HAVE_UNICODE_UCAL_H) #define id id_ucal #include #undef id #elif defined(HAVE_ICU_H) #include #endif /* Key for local time zone in user defaults. */ #define LOCALDBKEY @"Local Time Zone" /* Directory that contains the time zone data. Expected in Resources directory for library bundle. */ #define TIME_ZONE_DIR @"NSTimeZones" /* Name of time zone abbreviation (plist) dictionary. */ #define ABBREV_DICT @"abbreviations" /* Name of time zone abbreviation map. It is a text file with each line comprised of the abbreviation, a whitespace, and the name. Neither the abbreviation nor the name can contain whitespace, and each line must not be longer than 80 characters. */ #define ABBREV_MAP @"abbreviations" /* File holding regions grouped by latitude. It is a text file with each line comprised of the latitude region, whitespace, and the name. Neither the abbreviation nor the name can contain whitespace, and each line must not be longer than 80 characters. */ #define REGIONS_FILE @"regions" /* Name of the file that contains the name of the local time zone. */ #define LOCAL_TIME_FILE @"localtime" /* Directory that contains the actual time zones. */ #define ZONES_DIR @"zones" /* Many systems have this file */ #define SYSTEM_TIME_FILE @"/etc/localtime" /* If TZDIR told us where the zoneinfo files are, don't append anything else */ #ifdef TZDIR #define POSIX_TZONES @"" #else #define POSIX_TZONES @"posix/" #endif #define BUFFER_SIZE 512 #define WEEK_MILLISECONDS (7.0*24.0*60.0*60.0*1000.0) /* Include public domain code (modified for use here) to parse standard * posix time zone files. */ #include "tzdb.h" #if GS_USE_ICU == 1 static inline int _NSToICUTZDisplayStyle(NSTimeZoneNameStyle style) { switch (style) { case NSTimeZoneNameStyleStandard: return UCAL_STANDARD; case NSTimeZoneNameStyleShortStandard: return UCAL_SHORT_STANDARD; case NSTimeZoneNameStyleDaylightSaving: return UCAL_DST; case NSTimeZoneNameStyleShortDaylightSaving: return UCAL_SHORT_DST; default: return -1; } } static inline UCalendar * ICUCalendarSetup (NSTimeZone *tz, NSLocale *locale) { NSString *tzStr; int32_t tzLen; const char *cLocale; UChar tzName[BUFFER_SIZE]; UCalendar *cal; UErrorCode err = U_ZERO_ERROR; tzStr = [tz name]; if ((tzLen = [tzStr length]) > BUFFER_SIZE) tzLen = BUFFER_SIZE; [tzStr getCharacters: tzName range: NSMakeRange(0, tzLen)]; cLocale = [[locale localeIdentifier] UTF8String]; cal = ucal_open(tzName, tzLen, cLocale, UCAL_TRADITIONAL, &err); if (U_FAILURE(err)) return NULL; return cal; } #endif /* Possible location of system time zone files */ static NSString *tzdir = nil; @class GSAbsTimeZone; @class GSTimeZoneDetail; @class GSAbsTimeZoneDetail; @class GSPlaceholderTimeZone; /* * Information for abstract placeholder class. */ static GSPlaceholderTimeZone *defaultPlaceholderTimeZone; static NSMapTable *placeholderMap; static GSAbsTimeZone *commonAbsolutes[145] = { 0 }; /* * Temporary structure for holding time zone details. * This is the format in the data object. */ struct ttinfo { char offset[4]; // Seconds east of UTC unsigned char isdst; // Daylight savings time? unsigned char abbr_idx; // Index into time zone abbreviations string } __attribute__((packed)); /* * And this is the structure used in the time zone instances. */ typedef struct { int32_t offset; BOOL isdst; unsigned char abbr_idx; char pad[2]; const char *abbreviation; } TypeInfo; @interface GSTimeZone : NSTimeZone { @public NSString *timeZoneName; NSData *timeZoneData; struct state *sp; } @end #if defined(_WIN32) @interface GSWindowsTimeZone : NSTimeZone { @public NSString *timeZoneName; NSString *daylightZoneName; NSString *timeZoneNameAbbr; NSString *daylightZoneNameAbbr; LONG Bias; LONG StandardBias; LONG DaylightBias; SYSTEMTIME StandardDate; SYSTEMTIME DaylightDate; } @end #endif static NSTimeZone *defaultTimeZone = nil; static NSTimeZone *localTimeZone = nil; static NSTimeZone *systemTimeZone = nil; /* Dictionary for time zones. Each time zone must have a unique name. */ static NSMutableDictionary *zoneDictionary; /* one-to-one abbreviation to time zone name dictionary. */ static NSMutableDictionary *abbreviationDictionary = nil; /* one-to-many abbreviation to time zone name dictionary. */ static NSMutableDictionary *abbreviationMap = nil; /* Lock for creating time zones. */ static gs_mutex_t zone_mutex; static Class NSTimeZoneClass; static Class GSPlaceholderTimeZoneClass; /* Return path to a TimeZone directory file */ static NSString *_time_zone_path(NSString *subpath, NSString *type) { NSBundle *gbundle; if (type == nil) type = @""; gbundle = [NSBundle bundleForClass: [NSObject class]]; return [gbundle pathForResource: subpath ofType: type inDirectory: TIME_ZONE_DIR]; } @interface GSPlaceholderTimeZone : NSTimeZone @end @interface GSAbsTimeZone : NSTimeZone { @public NSString *name; id detail; int offset; // Offset from UTC in seconds. } - (id) initWithOffset: (NSInteger)anOffset name: (NSString*)aName; @end @interface NSLocalTimeZone : NSTimeZone @end @interface GSTimeZoneDetail : NSTimeZoneDetail { NSTimeZone *timeZone; // Time zone which created this object. NSString *abbrev; // Abbreviation for time zone detail. int offset; // Offset from UTC in seconds. BOOL is_dst; // Is it daylight savings time? } - (id) initWithTimeZone: (NSTimeZone*)aZone withAbbrev: (NSString*)anAbbrev withOffset: (NSInteger)anOffset withDST: (BOOL)isDST; @end @interface GSAbsTimeZoneDetail : NSTimeZoneDetail { GSAbsTimeZone *zone; // Time zone which created this object. } - (id) initWithTimeZone: (GSAbsTimeZone*)aZone; @end /* Private methods for obtaining resource file names. */ @interface NSTimeZone (Private) + (NSString*) _getTimeZoneFile: (NSString*)name; + (void) _notified: (NSNotification*)n; @end @implementation GSPlaceholderTimeZone - (id) autorelease { NSWarnLog(@"-autorelease sent to uninitialised time zone"); return self; // placeholders never get released. } - (void) dealloc { GSNOSUPERDEALLOC; // placeholders never get deallocated. } - (id) initWithName: (NSString*)name data: (NSData*)data { NSTimeZone *zone; unsigned length = [name length]; if (length == 0) { NSLog(@"Disallowed null time zone name"); return nil; } if (length == 15 && [name isEqual: @"NSLocalTimeZone"]) { zone = RETAIN(localTimeZone); DESTROY(self); return (GSPlaceholderTimeZone*)zone; } /* * Return a cached time zone if possible. * NB. if data of cached zone does not match new data ... don't use cache */ GS_MUTEX_LOCK(zone_mutex); zone = [zoneDictionary objectForKey: name]; if (data != nil && [data isEqual: [zone data]] == NO) { zone = nil; } IF_NO_ARC(RETAIN(zone);) GS_MUTEX_UNLOCK(zone_mutex); if (zone == nil) { unichar c; int i; if ((length == 3 && ([name isEqualToString: @"GMT"] == YES || [name isEqualToString: @"UTC"] == YES || [name isEqualToString: @"UCT"] == YES)) || (length == 4 && ([name isEqualToString: @"GMT0"] == YES || [name isEqualToString: @"Zulu"] == YES)) || (length == 9 && [name isEqualToString: @"Universal"] == YES)) { // Synonyms for GMT zone = [[GSAbsTimeZone alloc] initWithOffset: 0 name: name]; } else if (length == 5 && [name hasPrefix: @"GMT"] == YES && ((c = [name characterAtIndex: 3]) == '+' || c == '-') && ((c = [name characterAtIndex: 4]) >= '0' && c <= '9')) { // GMT-9 to GMT+9 i = (c - '0') * 60 * 60; if ([name characterAtIndex: 3] == '-') { i = -i; } zone = [[GSAbsTimeZone alloc] initWithOffset: i name: name]; } else if (length == 6 && [name hasPrefix: @"GMT"] == YES && ((c = [name characterAtIndex: 3]) == '+' || c == '-') && ((c = [name characterAtIndex: 4]) == '0' || c == '1') && ((c = [name characterAtIndex: 5]) >= '0' && c <= '4')) { // GMT-14 to GMT-10 and GMT+10 to GMT+14 i = (c - '0') * 60 * 60; if ([name characterAtIndex: 4] == '1') { i += 60 * 60 * 10; } if ([name characterAtIndex: 3] == '-') { i = -i; } zone = [[GSAbsTimeZone alloc] initWithOffset: i name: name]; } else if (length == 8 && [name hasPrefix: @"GMT"] == YES && ((c = [name characterAtIndex: 3]) == '+' || c == '-')) { // GMT+NNNN and GMT-NNNN c = [name characterAtIndex: 4]; if (c >= '0' && c <= '9') { i = c - '0'; c = [name characterAtIndex: 5]; if (c >= '0' && c <= '9') { i = i * 10 + (c - '0'); c = [name characterAtIndex: 6]; if (c >= '0' && c <= '9') { i = i * 6 + (c - '0'); c = [name characterAtIndex: 7]; if (c >= '0' && c <= '9') { i = i * 10 + (c - '0'); i = i * 60; if ([name characterAtIndex: 3] == '-') { i = -i; } zone = [[GSAbsTimeZone alloc] initWithOffset: i name: nil]; } } } } } if (zone == nil && length > 19 && [name hasPrefix: @"NSAbsoluteTimeZone: "] == YES) { i = [[name substringFromIndex: 19] intValue]; zone = [[GSAbsTimeZone alloc] initWithOffset: i name: nil]; } if (zone == nil) { if (data == nil) { NSString *fileName; BOOL isDir; fileName = [NSTimeZoneClass _getTimeZoneFile: name]; if (fileName == nil || ![[NSFileManager defaultManager] fileExistsAtPath: fileName isDirectory: &isDir] || YES == isDir) { data = nil; } else { data = [NSData dataWithContentsOfFile: fileName]; } if (nil == data) #if defined(_WIN32) { zone = [[GSWindowsTimeZone alloc] initWithName: name data: 0]; DESTROY(self); return zone; } #else { return nil; } #endif } #if defined(_WIN32) if (!data) zone = [[GSWindowsTimeZone alloc] initWithName: name data: data]; else #endif zone = [[GSTimeZone alloc] initWithName: name data: data]; } } DESTROY(self); return (GSPlaceholderTimeZone*)zone; } - (oneway void) release { return; // placeholders never get released. } - (id) retain { return self; // placeholders never get retained. } @end @implementation NSLocalTimeZone - (NSString*) abbreviation { return [[NSTimeZoneClass defaultTimeZone] abbreviation]; } - (NSString*) abbreviationForDate: (NSDate*)aDate { return [[NSTimeZoneClass defaultTimeZone] abbreviationForDate: aDate]; } - (id) autorelease { return self; } - (id) copy { return self; } - (id) copyWithZone: (NSZone*)z { return self; } - (NSData*) data { return [[NSTimeZoneClass defaultTimeZone] data]; } - (void) encodeWithCoder: (NSCoder*)aCoder { [aCoder encodeObject: @"NSLocalTimeZone"]; } - (id) init { return self; } - (BOOL) isDaylightSavingTime { return [[NSTimeZoneClass defaultTimeZone] isDaylightSavingTime]; } - (BOOL) isDaylightSavingTimeForDate: (NSDate*)aDate { return [[NSTimeZoneClass defaultTimeZone] isDaylightSavingTimeForDate: aDate]; } - (NSString*) name { return [[NSTimeZoneClass defaultTimeZone] name]; } - (oneway void) release { } - (id) retain { return self; } - (NSInteger) secondsFromGMT { return [[NSTimeZoneClass defaultTimeZone] secondsFromGMT]; } - (NSInteger) secondsFromGMTForDate: (NSDate*)aDate { return [[NSTimeZoneClass defaultTimeZone] secondsFromGMTForDate: aDate]; } - (NSArray*) timeZoneDetailArray { return [[NSTimeZoneClass defaultTimeZone] timeZoneDetailArray]; } - (NSTimeZoneDetail*) timeZoneDetailForDate: (NSDate*)date { return [[NSTimeZoneClass defaultTimeZone] timeZoneDetailForDate: date]; } - (NSString*) timeZoneName { return [[NSTimeZoneClass defaultTimeZone] timeZoneName]; } @end @implementation GSAbsTimeZone static int uninitialisedOffset = 100000; static NSMapTable *absolutes = 0; + (void) initialize { if (self == [GSAbsTimeZone class]) { absolutes = NSCreateMapTable(NSIntegerMapKeyCallBacks, NSNonOwnedPointerMapValueCallBacks, 0); [[NSObject leakAt: (id*)&absolutes] release]; } } - (NSString*) abbreviationForDate: (NSDate*)aDate { return name; } - (void) dealloc { if (offset != uninitialisedOffset) { GS_MUTEX_LOCK(zone_mutex); NSMapRemove(absolutes, (void*)(uintptr_t)offset); GS_MUTEX_UNLOCK(zone_mutex); } RELEASE(name); RELEASE(detail); DEALLOC; } - (void) encodeWithCoder: (NSCoder*)aCoder { [aCoder encodeObject: name]; } - (id) initWithOffset: (NSInteger)anOffset name: (NSString*)aName { GSAbsTimeZone *z; int extra; int sign = anOffset >= 0 ? 1 : -1; /* * Set the uninitialised offset so that dealloc before full * initialisation won't remove the timezeone for offset 0 from cache. */ offset = uninitialisedOffset; /* * Round the offset to the nearest minute, (for MacOS-X compatibility) * and ensure it is no more than 18 hours. */ anOffset *= sign; extra = anOffset % 60; if (extra < 30) { anOffset -= extra; } else { anOffset += 60 - extra; } if (anOffset > 64800) { DESTROY(self); return nil; } anOffset *= sign; if (anOffset % 900 == 0) { z = commonAbsolutes[anOffset/900 + 72]; if (z != nil) { IF_NO_ARC(RETAIN(z);) DESTROY(self); return z; } } GS_MUTEX_LOCK(zone_mutex); z = (GSAbsTimeZone*)NSMapGet(absolutes, (void*)(uintptr_t)anOffset); if (z != nil) { IF_NO_ARC(RETAIN(z);) DESTROY(self); } else { if (aName == nil) { if (anOffset % 60 == 0) { char s = (anOffset >= 0) ? '+' : '-'; unsigned i = (anOffset >= 0) ? anOffset / 60 : -anOffset / 60; unsigned h = (i / 60) % 24; unsigned m = i % 60; char buf[9]; snprintf(buf, sizeof(buf), "GMT%c%02u%02u", s, h, m); name = [[NSString alloc] initWithUTF8String: buf]; } else { /* * Should never happen now we round to the minute * for MacOS-X compatibnility. */ name = [[NSString alloc] initWithFormat: @"NSAbsoluteTimeZone:%"PRIdPTR, anOffset]; } } else { name = [aName copy]; } detail = [[GSAbsTimeZoneDetail alloc] initWithTimeZone: self]; offset = anOffset; z = self; NSMapInsert(absolutes, (void*)(uintptr_t)anOffset, (void*)z); [zoneDictionary setObject: self forKey: (NSString*)name]; } if (anOffset % 900 == 0) { int index = anOffset/900 + 72; if (nil == commonAbsolutes[index]) { commonAbsolutes[index] = RETAIN(self); } } GS_MUTEX_UNLOCK(zone_mutex); return z; } - (BOOL) isDaylightSavingTimeZoneForDate: (NSDate*)aDate { return NO; } - (NSString*) name { return name; } - (NSInteger) secondsFromGMTForDate: (NSDate*)aDate { return offset; } - (NSArray*) timeZoneDetailArray { return [NSArray arrayWithObject: detail]; } - (NSTimeZoneDetail*) timeZoneDetailForDate: (NSDate*)date { return detail; } - (NSString*) timeZoneName { return name; } @end @implementation GSTimeZoneDetail - (void) dealloc { RELEASE(timeZone); DEALLOC } - (id) initWithCoder: (NSCoder*)aDecoder { [aDecoder decodeValueOfObjCType: @encode(id) at: &abbrev]; [aDecoder decodeValueOfObjCType: @encode(int) at: &offset]; [aDecoder decodeValueOfObjCType: @encode(BOOL) at: &is_dst]; return self; } - (id) initWithTimeZone: (NSTimeZone*)aZone withAbbrev: (NSString*)anAbbrev withOffset: (NSInteger)anOffset withDST: (BOOL)isDST { timeZone = RETAIN(aZone); abbrev = anAbbrev; // NB. Depend on this being retained in aZone offset = anOffset; is_dst = isDST; return self; } - (BOOL) isDaylightSavingTimeZone { return is_dst; } - (NSString*) name { return [timeZone name]; } - (NSString*) timeZoneAbbreviation { return abbrev; } - (NSArray*) timeZoneDetailArray { return [timeZone timeZoneDetailArray]; } - (NSTimeZoneDetail*) timeZoneDetailForDate: (NSDate*)date { return [timeZone timeZoneDetailForDate: date]; } - (NSInteger) timeZoneSecondsFromGMT { return offset; } - (NSInteger) timeZoneSecondsFromGMTForDate: (NSDate*)aDate { return offset; } @end @implementation GSAbsTimeZoneDetail - (NSString*) abbreviation { return zone->name; } - (NSString*) abbreviationForDate: (NSDate*)aDate { return zone->name; } - (void) dealloc { RELEASE(zone); DEALLOC } - (id) initWithTimeZone: (GSAbsTimeZone*)aZone { zone = RETAIN(aZone); return self; } - (BOOL) isDaylightSavingTimeZone { return NO; } - (BOOL) isDaylightSavingTimeZoneForDate: (NSDate*)aDate { return NO; } - (NSString*) name { return zone->name; } - (NSString*) timeZoneAbbreviation { return zone->name; } - (NSArray*) timeZoneDetailArray { return [zone timeZoneDetailArray]; } - (NSTimeZoneDetail*) timeZoneDetailForDate: (NSDate*)date { return self; } - (NSInteger) timeZoneSecondsFromGMT { return zone->offset; } - (NSInteger) timeZoneSecondsFromGMTForDate: (NSDate*)aDate { return zone->offset; } @end /** *

* The local time zone is obtained from, in order of preference:
* 1) the user defaults database: NSGlobalDomain "Local Time Zone"
* 2) the GNUSTEP_TZ environment variable
* 3) the file "localtime" in System/Library/Libraries/Resources/NSTimeZone
* 4) the TZ environment variable
* 5) The system zone settings (typically in /etc/localtime)
* 6) tzset and tznam on platforms which have it
* 7) Windows registry, on Win32 systems
* 8) or the fallback time zone (which is UTC)
*

*

If the GNUstep time zone datafiles become too out of date, one * can download an updated database from ftp://elsie.nci.nih.gov/pub/ * and compile it as specified in the README file in the * NSTimeZones directory. *

*

Time zone names in NSDates should be GMT, MET etc. not * Europe/Berlin, America/Washington etc. *

*

The problem with this is that various time zones may use the * same abbreviation (e.g. Australia/Brisbane and * America/New_York both use EST), and some time zones * may have different rules for daylight saving time even if the * abbreviation and offsets from UTC are the same. *

*

The problems with depending on the OS for providing time zone * info are that time zone names may vary * wildly between OSes (this could be a big problem when * archiving is used between different systems). *

*

Win32: Time zone names read from the registry are different * from other GNUstep installations. Be careful when moving data * between platforms in this case. *

*/ @implementation NSTimeZone /** * Returns a dictionary containing time zone abbreviations and their * corresponding time zone names. More than one time zone may be associated * with a single abbreviation. In this case, the dictionary contains only * one (usually the most common) time zone name for the abbreviation. */ + (NSDictionary*) abbreviationDictionary { if (abbreviationDictionary != nil) { return abbreviationDictionary; } GS_MUTEX_LOCK(zone_mutex); if (abbreviationDictionary == nil) { NSAutoreleasePool *pool = [NSAutoreleasePool new]; NSString *path; path = _time_zone_path (ABBREV_DICT, @"plist"); if (path != nil) { /* * Fast mechanism ... load prebuilt data from file so we don't * need to load in all time zones. */ abbreviationDictionary = RETAIN([[NSString stringWithContentsOfFile: path] propertyList]); } if (abbreviationDictionary == nil) { NSMutableDictionary *md; NSString *name; NSEnumerator *names; /* * Slow fallback ... load all time zones and generate * abbreviation dictionary from them. */ md = [[NSMutableDictionary alloc] init]; names = [[NSTimeZone knownTimeZoneNames] objectEnumerator]; while ((name = [names nextObject]) != nil) { NSTimeZone *zone; if ((zone = [NSTimeZone timeZoneWithName: name])) { NSEnumerator *details; NSTimeZoneDetail *detail; details = [[zone timeZoneDetailArray] objectEnumerator]; while ((detail = [details nextObject]) != nil) { [md setObject: name forKey: [detail timeZoneAbbreviation]]; } } } if ([md makeImmutable] == YES) { abbreviationDictionary = md; } else { abbreviationDictionary = [md copy]; RELEASE(md); } } [pool drain]; } GS_MUTEX_UNLOCK(zone_mutex); return abbreviationDictionary; } /** * Returns a dictionary that maps abbreviations to the array * containing all the time zone names that use the abbreviation. */ + (NSDictionary*) abbreviationMap { /* Instead of creating the abbreviation dictionary when the class is initialized, we create it when we first need it, since the dictionary can be potentially very large, considering that it's almost never used. */ if (abbreviationMap != nil) { return abbreviationMap; } GS_MUTEX_LOCK(zone_mutex); if (abbreviationMap == nil) { NSAutoreleasePool *pool = [NSAutoreleasePool new]; NSMutableDictionary *md; NSMutableArray *ma; NSString *the_name; NSString *the_abbrev; FILE *file; char abbrev[80]; char name[80]; NSString *path; /* * Read dictionary from file... fast mechanism because we don't have * to create all timezoneas and parse all their data files. */ md = [NSMutableDictionary dictionaryWithCapacity: 100]; path = _time_zone_path (ABBREV_MAP, nil); if (path != nil) { #if defined(_WIN32) unichar mode[3]; mode[0] = 'r'; mode[1] = 'b'; mode[2] = '\0'; file = _wfopen((const unichar*)[path fileSystemRepresentation], mode); #else file = fopen([path fileSystemRepresentation], "r"); #endif if (file == NULL) { GS_MUTEX_UNLOCK(zone_mutex); [NSException raise: NSInternalInconsistencyException format: @"Failed to open time zone abbreviation map."]; } while (fscanf(file, "%79s %79s", abbrev, name) == 2) { the_name = [[NSString alloc] initWithUTF8String: name]; the_abbrev = [[NSString alloc] initWithUTF8String: abbrev]; ma = [md objectForKey: the_abbrev]; if (ma == nil) { ma = [[NSMutableArray alloc] initWithCapacity: 1]; [md setObject: ma forKey: the_abbrev]; RELEASE(ma); } RELEASE(the_abbrev); if ([ma containsObject: the_name] == NO) { [ma addObject: the_name]; } RELEASE(the_name); } fclose(file); } else { NSString *name; NSEnumerator *names; /* * Slow fallback mechanism ... go through all time names * so we load all the time zone data and generate the info * we need from it. */ names = [[NSTimeZone knownTimeZoneNames] objectEnumerator]; while ((name = [names nextObject]) != nil) { NSTimeZone *zone; if ((zone = [NSTimeZone timeZoneWithName: name]) != nil) { NSEnumerator *details; NSTimeZoneDetail *detail; details = [[zone timeZoneDetailArray] objectEnumerator]; while ((detail = [details nextObject]) != nil) { the_abbrev = [detail timeZoneAbbreviation]; ma = [md objectForKey: the_abbrev]; if (ma == nil) { ma = [[NSMutableArray alloc] initWithCapacity: 1]; [md setObject: ma forKey: the_abbrev]; RELEASE(ma); } if ([ma containsObject: name] == NO) { [ma addObject: name]; } } } } } /* Special case: Add the system time zone if * it doesn't exist in the map */ the_abbrev = [systemTimeZone abbreviation]; ma = [md objectForKey: the_abbrev]; if (ma == nil) { ma = [NSMutableArray new]; [md setObject: ma forKey: the_abbrev]; RELEASE(ma); } the_name = [systemTimeZone timeZoneName]; if ([ma containsObject: the_name] == NO) { [ma addObject: the_name]; } if ([md makeImmutable] == YES) { abbreviationMap = RETAIN(md); } else { abbreviationMap = [md copy]; } [pool drain]; } GS_MUTEX_UNLOCK(zone_mutex); return abbreviationMap; } /** * Returns an array of all known time zone names. */ + (NSArray*) knownTimeZoneNames { static NSArray *namesArray = nil; /* We create the array only when we need it to reduce overhead. */ if (namesArray != nil) { return namesArray; } GS_MUTEX_LOCK(zone_mutex); if (namesArray == nil) { unsigned i; NSMutableArray *ma; NSArray *regionsArray; ma = [NSMutableArray new]; regionsArray = [self timeZoneArray]; for (i = 0; i < [regionsArray count]; i++) { NSArray *names = [regionsArray objectAtIndex: i]; [ma addObjectsFromArray: names]; } if ([ma makeImmutable] == YES) { namesArray = ma; } else { namesArray = [ma copy]; RELEASE(ma); } } GS_MUTEX_UNLOCK(zone_mutex); return namesArray; } + (id) allocWithZone: (NSZone*)z { if (self == NSTimeZoneClass) { /* * We return a placeholder object that can * be converted to a real object when its initialisation method * is called. */ if (z == NSDefaultMallocZone() || z == 0) { /* * As a special case, we can return a placeholder for a time zone * in the default zone extremely efficiently. */ return defaultPlaceholderTimeZone; } else { id obj; /* * For anything other than the default zone, we need to * locate the correct placeholder in the (lock protected) * table of placeholders. */ GS_MUTEX_LOCK(zone_mutex); obj = (id)NSMapGet(placeholderMap, (void*)z); if (obj == nil) { /* * There is no placeholder object for this zone, so we * create a new one and use that. */ obj = (id)NSAllocateObject(GSPlaceholderTimeZoneClass, 0, z); NSMapInsert(placeholderMap, (void*)z, (void*)obj); } GS_MUTEX_UNLOCK(zone_mutex); return obj; } } else { return NSAllocateObject(self, 0, z); } } /** * Return the default time zone for this process. */ + (NSTimeZone*) defaultTimeZone { NSTimeZone *zone; GS_MUTEX_LOCK(zone_mutex); if (defaultTimeZone == nil) { zone = [self systemTimeZone]; } else { zone = AUTORELEASE(RETAIN(defaultTimeZone)); } GS_MUTEX_UNLOCK(zone_mutex); return zone; } + (void) initialize { if (self == [NSTimeZone class]) { NSTimeZoneClass = self; GS_MUTEX_INIT_RECURSIVE(zone_mutex); GSPlaceholderTimeZoneClass = [GSPlaceholderTimeZone class]; zoneDictionary = [[NSMutableDictionary alloc] init]; [[NSObject leakAt: &zoneDictionary] release]; /* * Set up infrastructure for placeholder timezones. */ defaultPlaceholderTimeZone = (GSPlaceholderTimeZone*) NSAllocateObject(GSPlaceholderTimeZoneClass, 0, NSDefaultMallocZone()); [[NSObject leakAt: &defaultPlaceholderTimeZone] release]; placeholderMap = NSCreateMapTable(NSNonOwnedPointerMapKeyCallBacks, NSNonRetainedObjectMapValueCallBacks, 0); [[NSObject leakAt: (id*)&placeholderMap] release]; localTimeZone = [[NSLocalTimeZone alloc] init]; [[NSObject leakAt: (id*)&localTimeZone] release]; [[NSObject leakAt: (id*)&defaultTimeZone] release]; [[NSObject leakAt: (id*)&systemTimeZone] release]; [[NSObject leakAt: (id*)&abbreviationDictionary] release]; [[NSObject leakAt: (id*)&abbreviationMap] release]; [[NSObject leakAt: (id*)&absolutes] release]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(_notified:) name: NSUserDefaultsDidChangeNotification object: nil]; } } /** * Return a proxy to the default time zone for this process. */ + (NSTimeZone*) localTimeZone { return localTimeZone; } /** * Destroy the system time zone so that it will be recreated * next time it is used. */ + (void) resetSystemTimeZone { GS_MUTEX_LOCK(zone_mutex); DESTROY(systemTimeZone); GS_MUTEX_UNLOCK(zone_mutex); [[NSNotificationCenter defaultCenter] postNotificationName: NSSystemTimeZoneDidChangeNotification object: nil]; } /** * Set the default time zone to be used for this process. */ + (void) setDefaultTimeZone: (NSTimeZone*)aTimeZone { if (aTimeZone != defaultTimeZone) { /* * We can't make the localTimeZone the default since that would * cause recursion ... */ if (aTimeZone == localTimeZone) { aTimeZone = [self systemTimeZone]; } GS_MUTEX_LOCK(zone_mutex); ASSIGN(defaultTimeZone, aTimeZone); GS_MUTEX_UNLOCK(zone_mutex); } } /** * Returns the current system time zone for the process. */ + (NSTimeZone*) systemTimeZone { NSTimeZone *zone = nil; GS_MUTEX_LOCK(zone_mutex); if (systemTimeZone == nil) { NSFileManager *dflt = [NSFileManager defaultManager]; NSString *localZoneString = nil; NSString *localZoneSource = nil; /* * setup default value in case something goes wrong. */ systemTimeZone = RETAIN([NSTimeZoneClass timeZoneForSecondsFromGMT: 0]); /* * Try to get timezone from user defaults database */ localZoneSource = [NSString stringWithFormat: @"NSUserDefaults: '%@'", LOCALDBKEY]; localZoneString = [[NSUserDefaults standardUserDefaults] stringForKey: LOCALDBKEY]; /* * Try to get timezone from GNUSTEP_TZ environment variable. */ if (localZoneString == nil) { localZoneSource = _(@"environment variable: 'GNUSTEP_TZ'"); localZoneString = [[[NSProcessInfo processInfo] environment] objectForKey: @"GNUSTEP_TZ"]; } /* * Try to get timezone from LOCAL_TIME_FILE. */ if (localZoneString == nil) { NSString *f = _time_zone_path(LOCAL_TIME_FILE, nil); localZoneSource = [NSString stringWithFormat: @"file: '%@'", f]; if (f != nil) { localZoneString = [NSString stringWithContentsOfFile: f]; localZoneString = [localZoneString stringByTrimmingSpaces]; } } #if defined(_WIN32) /* * Try to get timezone from windows system call. */ { TIME_ZONE_INFORMATION tz; DWORD dst; wchar_t *tzName; #if defined(_MSC_VER) && defined(UCAL_H) // Get time zone name for US locale as expected by ICU method below LANGID origLangID = GetThreadUILanguage(); SetThreadUILanguage(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); dst = GetTimeZoneInformation(&tz); SetThreadUILanguage(origLangID); // Only tz.StandardName time zone conversions are supported, as // the Zone-Tzid table lacks all daylight time conversions: // e.g. 'W. Europe Daylight Time' <-> 'Europe/Berlin' is not listed. // // See: https://unicode-org.github.io/cldr-staging/charts/latest/supplemental/zone_tzid.html tzName = tz.StandardName; #else dst = GetTimeZoneInformation(&tz); if (dst == TIME_ZONE_ID_DAYLIGHT) tzName = tz.DaylightName; else tzName = tz.StandardName; #endif localZoneSource = @"function: 'GetTimeZoneInformation()'"; #if defined(_MSC_VER) && defined(UCAL_H) // Convert Windows timezone name to IANA identifier if (tzName) { UErrorCode status = U_ZERO_ERROR; UChar ianaTzName[128]; int32_t ianaTzNameLen = ucal_getTimeZoneIDForWindowsID(tzName, -1, NULL, ianaTzName, 128, &status); if (U_SUCCESS(status) && ianaTzNameLen > 0) { localZoneString = [NSString stringWithCharacters: ianaTzName length: ianaTzNameLen]; } else if (U_SUCCESS(status)) { // this happens when ICU has no mapping for the time zone NSLog(@"Unable to map timezone '%ls' to IANA format", tzName); } else { NSLog(@"Error converting timezone '%ls' to IANA format: %s", tzName, u_errorName(status)); } } #endif if (localZoneString == nil) { localZoneString = [NSString stringWithCharacters: tzName length: wcslen(tzName)]; } } #endif if (localZoneString == nil) { if (YES == [dflt isReadableFileAtPath: @"/etc/timezone"]) { NSString *s; s = [NSString stringWithContentsOfFile: @"/etc/timezone"]; s = [s stringByTrimmingSpaces]; if (0 != [s length]) { localZoneSource = _(@"/etc/timezone file"); localZoneString = s; } } } if (localZoneString == nil) { if (YES == [dflt isReadableFileAtPath: @"/etc/sysconfig/clock"]) { NSString *s; NSEnumerator *e; s = [NSString stringWithContentsOfFile: @"/etc/sysconfig/clock"]; e = [[s componentsSeparatedByString: @"\n"] objectEnumerator]; while (nil != (s = [e nextObject])) { s = [s stringByTrimmingSpaces]; // OpenSuse uses the non-standard key TIMEZONE if ([s hasPrefix: @"ZONE"] || [s hasPrefix: @"TIMEZONE"]) { if ([s hasPrefix: @"ZONE"]) s = [s substringFromIndex: 4]; else s = [s substringFromIndex: 8]; s = [s stringByTrimmingSpaces]; if ([s hasPrefix: @"="]) { s = [s substringFromIndex: 1]; s = [s stringByTrimmingSpaces]; if ([s hasPrefix: @"\""]) { s = [s substringFromIndex: 1]; } if ([s hasSuffix: @"\""]) { s = [s substringToIndex: [s length] - 1]; } s = [s stringByTrimmingSpaces]; if ([s length] > 0) { localZoneSource = _(@"/etc/sysconfig/clock file"); localZoneString = s; } } } } } } if (localZoneString == nil) { /* Get the zone name from the localtime file, assuming the file is a symlink to the time zone. Getting the actual data (which is easier) doesn't help, since we won't know the name itself. */ #if defined(HAVE_TZHEAD) && defined(TZDEFAULT) tzdir = RETAIN([NSString stringWithUTF8String: TZDIR]); localZoneString = [NSString stringWithUTF8String: TZDEFAULT]; localZoneSource = [NSString stringWithFormat: @"file (TZDEFAULT): '%@'", localZoneString]; localZoneString = [localZoneString stringByResolvingSymlinksInPath]; #else if ([dflt fileExistsAtPath: SYSTEM_TIME_FILE]) { localZoneString = SYSTEM_TIME_FILE; localZoneSource = [NSString stringWithFormat: @"file (SYSTEM_TIME_FILE): '%@'", localZoneString]; localZoneString = [localZoneString stringByResolvingSymlinksInPath]; /* Guess what tzdir is */ tzdir = [localZoneString stringByDeletingLastPathComponent]; while ([tzdir length] > 2 && [dflt fileExistsAtPath: [tzdir stringByAppendingPathComponent: @"GMT"]] == NO) { tzdir = [tzdir stringByDeletingLastPathComponent]; } if ([tzdir length] <= 2) { localZoneString = tzdir = nil; } else { [tzdir retain]; } } #endif if (localZoneString != nil && [localZoneString hasPrefix: tzdir]) { /* This must be the time zone name */ localZoneString = AUTORELEASE([localZoneString mutableCopy]); [(NSMutableString*)localZoneString deleteCharactersInRange: NSMakeRange(0, [tzdir length])]; while ([localZoneString hasPrefix: @"/"]) { [(NSMutableString*)localZoneString deleteCharactersInRange: NSMakeRange(0, 1)]; } } else { localZoneString = nil; } } /* Try to get timezone from standard unix environment variable. * This is often an ambiguous abbreviation :-( */ if (localZoneString == nil) { localZoneSource = _(@"environment variable: 'TZ'"); localZoneString = [[[NSProcessInfo processInfo] environment] objectForKey: @"TZ"]; } #if HAVE_TZSET && !defined(__FreeBSD__) && !defined(__OpenBSD__) /* * Try to get timezone from tzset and tzname/daylight. * If daylight is non-zero, then tzname[0] is only the name * the the zone for part of the year, so we can't use it as * the definitive zone. * * FreeBSD doesn't implement TZSet fully, so we can't use it there. * Apparently, OpenBSD neither. */ if (localZoneString == nil) { localZoneSource = @"function: 'tzset()/tzname'"; tzset(); if (NULL != tzname[0] && '\0' != *tzname[0] && 0 == daylight) localZoneString = [NSString stringWithUTF8String: tzname[0]]; } #endif if (localZoneString != nil) { NSDebugLLog (@"NSTimeZone", @"Using zone %@", localZoneString); zone = [defaultPlaceholderTimeZone initWithName: localZoneString]; if (zone == nil) { NSArray *possibleZoneNames; /* It is not guaranteed on some systems (e.g., Ubuntu) that SYSTEM_TIME_FILE is a symlink. This file is more probably a copy of a zoneinfo file. The above time zone detecting approach can lead to the situation when we can only know about the time zone abbreviation (localZoneString) and (for some time zone abbreviations) the corresponding list of possible time zone names (e.g. SAMT is valid for Pacific/Samoa, Pacific/Pago_Pago, Pacific/Apia, Asia/Samarkand, Europe/Samara, US/Samoa). In such a case the time zone can be selected from the list by comparing the content of SYSTEM_TIME_FILE and the content of zoneinfo files corresponding to the items of that list. */ possibleZoneNames = [[self abbreviationMap] objectForKey: localZoneString]; if (possibleZoneNames != nil) { NSEnumerator *en = [possibleZoneNames objectEnumerator]; NSString *zoneName; NSFileManager *dflt = [NSFileManager defaultManager]; while ((zoneName = [en nextObject]) != nil) { NSString *fileName = [self _getTimeZoneFile: zoneName]; if (fileName != nil && [dflt contentsEqualAtPath: fileName andPath: SYSTEM_TIME_FILE]) { zone = [[self timeZoneWithName: zoneName] retain]; if (zone != nil) { GSPrintf(stderr, @"\nIt seems that your operating system does not have a valid timezone name\n" @"configured and is using an abbreviation instead. By comparing timezone\n" @"file data it is has been possible to find the actual timezone used, but\n" @"doing that is a slow process.\n" @"\nYou can avoid slowness of this time zone detecting approach\n" @"by setting the environment variable TZ='%@'\n" @"Or You can override the timezone name by setting the '%@'\n" @"NSUserDefault via the 'defaults' command line utility, a Preferences\n" @"application, or some other utility.\n" @"eg \"defaults write NSGlobalDomain '%@' '%@'\"\n\n", zoneName, LOCALDBKEY, LOCALDBKEY, zoneName); break; } } } } } if (zone == nil) { if (zone == nil) { GSPrintf(stderr, @"\nUnable to create time zone for name: '%@'\n" @"(source '%@').\n", localZoneString, localZoneSource); } if ([localZoneSource hasPrefix: @"file"] || [localZoneSource hasPrefix: @"function"]) { GSPrintf(stderr, @"\nIt seems that your operating system does not have a valid timezone name\n" @"configured (it could be that some other software has set a, possibly\n" @"ambiguous, timezone abbreviation rather than a name) ... please correct\n" @"that or override by setting a timezone name (such as 'Europe/London'\n" @"or 'America/Chicago').\n"); } GSPrintf(stderr, @"\nYou can override the timezone name by setting the '%@'\n" @"NSUserDefault via the 'defaults' command line utility, a Preferences\n" @"application, or some other utility.\n" @"eg \"defaults write NSGlobalDomain '%@' 'Africa/Nairobi'\"\n" @"See '%@'\n" @"for the standard timezones such as 'GB-Eire' or 'America/Chicago'.\n", LOCALDBKEY, LOCALDBKEY, _time_zone_path (ZONES_DIR, nil)); zone = [[self timeZoneWithAbbreviation: localZoneString] retain]; if (zone != nil) { NSInteger s; char sign = '+'; s = [zone secondsFromGMT]; if (s < 0) { sign = '-'; s = -s; } GSPrintf(stderr, @"\nSucceeded in treating '%@' as a timezone abbreviation,\n" @"but abbreviations do not uniquely represent timezones, so this may\n" @"not have found the timezone you were expecting. The timezone found\n" @"was '%@' (currently UTC%c%02d%02d)\n\n", localZoneString, [zone name], sign, s/3600, (s/60)%60); } } } else { NSLog(@"No local time zone specified."); } /* * If local time zone fails to allocate, then allocate something * that is sure to succeed (unless we run out of memory, of * course). */ if (zone == nil) { NSLog(@"Using time zone with absolute offset 0."); zone = systemTimeZone; } ASSIGN(systemTimeZone, zone); } zone = AUTORELEASE(RETAIN(systemTimeZone)); GS_MUTEX_UNLOCK(zone_mutex); return zone; } /** * Returns an array of all the known regions.
* There are 24 elements, of course, one for each time zone. * Each element contains an array of NSStrings which are * the region names. */ + (NSArray*) timeZoneArray { static NSArray *regionsArray = nil; /* We create the array only when we need it to reduce overhead. */ if (regionsArray != nil) { return regionsArray; } GS_MUTEX_LOCK(zone_mutex); if (regionsArray == nil) { NSAutoreleasePool *pool = [NSAutoreleasePool new]; int index; int i; char name[80]; FILE *fp; NSMutableArray *temp_array[24]; NSString *path; for (i = 0; i < 24; i++) { temp_array[i] = [NSMutableArray array]; } path = _time_zone_path (REGIONS_FILE, nil); if (path != nil) { #if defined(_WIN32) unichar mode[3]; mode[0] = 'r'; mode[1] = 'b'; mode[2] = '\0'; fp = _wfopen((const unichar*)[path fileSystemRepresentation], mode); #else fp = fopen([path fileSystemRepresentation], "r"); #endif if (fp == NULL) { GS_MUTEX_UNLOCK(zone_mutex); [NSException raise: NSInternalInconsistencyException format: @"Failed to open time zone regions array file."]; } while (fscanf(fp, "%d %79s", &index, name) == 2) { if (index < 0) index = 0; else index %= 24; [temp_array[index] addObject: [NSString stringWithUTF8String: name]]; } fclose(fp); } else { NSString *zonedir = [NSTimeZone _getTimeZoneFile: @"WET"]; if (tzdir != nil) { NSFileManager *mgr = [NSFileManager defaultManager]; NSDirectoryEnumerator *enumerator; NSString *name; zonedir = [zonedir stringByDeletingLastPathComponent]; enumerator = [mgr enumeratorAtPath: zonedir]; while ((name = [enumerator nextObject]) != nil) { NSTimeZone *zone = nil; BOOL isDir; path = [zonedir stringByAppendingPathComponent: name]; if ([mgr fileExistsAtPath: path isDirectory: &isDir] && isDir == NO && [[path pathExtension] isEqual: @"tab"] == NO) { zone = [zoneDictionary objectForKey: name]; if (zone == nil) { NSData *data; data = [NSData dataWithContentsOfFile: path]; /* We should really make sure this is a real zone file and not something extra that happens to be in this directory, but initWithName:data: will do this anyway and log a message if not. */ zone = [[self alloc] initWithName: name data: data]; IF_NO_ARC([zone autorelease];) } if (zone != nil) { int offset; NSArray *details; NSTimeZoneDetail *detail; NSEnumerator *e; details = [zone timeZoneDetailArray]; e = [details objectEnumerator]; while ((detail = [e nextObject]) != nil) { if ([detail isDaylightSavingTime] == NO) { break; // Found a standard time } } if (detail == nil && [details count] > 0) { // If no standard time detail = [details objectAtIndex: 0]; } offset = [detail secondsFromGMT]; if (offset < 0) { offset = -offset; offset %= (60 * 60 * 24); if (offset > 0) { offset = -offset; offset += (60 * 60 * 24); } } else { offset %= (60 * 60 * 24); } offset /= (60 * 60); [temp_array[offset] addObject: name]; } } } } } regionsArray = [[NSArray alloc] initWithObjects: temp_array count: 24]; [pool drain]; } GS_MUTEX_UNLOCK(zone_mutex); return regionsArray; } /** * Return a timezone for the specified offset from GMT.
* The timezone returned does not use daylight savings time. * The actual timezone returned has an offset rounded to the nearest * minute.
* Time zones with an offset of more than +/- 18 hours are disallowed, * and nil is returned. */ + (NSTimeZone*) timeZoneForSecondsFromGMT: (NSInteger)seconds { NSTimeZone *zone; int sign = seconds >= 0 ? 1 : -1; int extra; /* * Round the offset to the nearest minute, (for MacOS-X compatibility) * and ensure it is no more than 18 hours. */ seconds *= sign; extra = seconds % 60; if (extra < 30) { seconds -= extra; } else { seconds += 60 - extra; } if (seconds > 64800) { return nil; } seconds *= sign; if (seconds % 900 == 0) { zone = commonAbsolutes[seconds/900 + 72]; } else { GS_MUTEX_LOCK(zone_mutex); zone = (NSTimeZone*)NSMapGet(absolutes, (void*)(uintptr_t)seconds); GS_MUTEX_UNLOCK(zone_mutex); } if (nil == zone) { zone = [[GSAbsTimeZone alloc] initWithOffset: seconds name: nil]; zone = AUTORELEASE(zone); } return zone; } /** * Returns a timezone for the specified abbreviation. The same abbreviations * are used in different regions so this isn't particularly useful.
* Calls NSTimeZone-abbreviation dictionary an so uses a lot of memory. */ + (NSTimeZone*) timeZoneWithAbbreviation: (NSString*)abbreviation { NSTimeZone *zone; NSString *name; name = [[self abbreviationDictionary] objectForKey: abbreviation]; if (name == nil) { zone = nil; } else { zone = [self timeZoneWithName: name data: nil]; } return zone; } /** * Returns a timezone for the specified name. */ + (NSTimeZone*) timeZoneWithName: (NSString*)aTimeZoneName { NSTimeZone *zone; zone = [defaultPlaceholderTimeZone initWithName: aTimeZoneName data: nil]; return AUTORELEASE(zone); } /** * Returns a timezone for aTimeZoneName, created from the supplied * time zone data. Data must be in TZ format as per the Olson database. */ + (NSTimeZone*) timeZoneWithName: (NSString*)name data: (NSData*)data { NSTimeZone *zone; zone = [defaultPlaceholderTimeZone initWithName: name data: data]; return AUTORELEASE(zone); } /** * Returns the abbreviation for this timezone now. * Invokes -abbreviationForDate: */ - (NSString*) abbreviation { return [self abbreviationForDate: [NSDate date]]; } /** * Returns the abbreviation for this timezone at aDate. This may differ * depending on whether daylight savings time is in effect or not. */ - (NSString*) abbreviationForDate: (NSDate*)aDate { NSTimeZoneDetail *detail; NSString *abbr; detail = [self timeZoneDetailForDate: aDate]; abbr = [detail timeZoneAbbreviation]; return abbr; } /** * Returns the Class for this object */ - (Class) classForCoder { return NSTimeZoneClass; } - (id) copyWithZone: (NSZone*)z { return RETAIN(self); } /** * Returns the data with which the receiver was initialised. */ - (NSData*) data { return nil; } /** * Returns the name of this object. */ - (NSString*) description { return [self name]; } - (void) encodeWithCoder: (NSCoder*)aCoder { [aCoder encodeObject: [self name]]; } - (NSUInteger) hash { return [[self name] hash]; } - (id) init { return [self initWithName: @"NSLocalTimeZone" data: nil]; } - (id) initWithCoder: (NSCoder*)aDecoder { NSString *name; name = [aDecoder decodeObject]; self = [self initWithName: name data: nil]; return self; } /** * Initialise a timezone with the supplied name. May return a cached * timezone object rather than the newly created one. */ - (id) initWithName: (NSString*)name { return [self initWithName: name data: nil]; } /** * Initialises a time zone object using the supplied data object.
* This method is intended for internal use by the NSTimeZone * class cluster. * Don't use it ... use -initWithName: instead. */ - (id) initWithName: (NSString*)name data: (NSData*)data { [self notImplemented: _cmd]; return nil; } /** * Returns a boolean indicating whether daylight savings time is in * effect now. Invokes -isDaylightSavingTimeForDate: */ - (BOOL) isDaylightSavingTime { return [self isDaylightSavingTimeForDate: [NSDate date]]; } /** * Returns a boolean indicating whether daylight savings time is in * effect for this time zone at aDate. */ - (BOOL) isDaylightSavingTimeForDate: (NSDate*)aDate { NSTimeZoneDetail *detail; BOOL isDST; detail = [self timeZoneDetailForDate: aDate]; isDST = [detail isDaylightSavingTimeZone]; return isDST; } - (BOOL) isEqual: (id)other { if (other == self) return YES; if ([other isKindOfClass: NSTimeZoneClass] == NO) return NO; return [self isEqualToTimeZone: other]; } /** * Returns YES if the time zones have the same name. */ - (BOOL) isEqualToTimeZone: (NSTimeZone*)aTimeZone { if (aTimeZone == self) return YES; if ([[self name] isEqual: [aTimeZone name]] == NO) return NO; if (([self data] == nil && [aTimeZone data] == nil) || [[self name] isEqual: [aTimeZone name]] == YES) return YES; return NO; } /** * Returns the name of the timezone */ - (NSString*) name { return [self subclassResponsibility: _cmd]; } - (id) replacementObjectForPortCoder: (NSPortCoder*)aCoder { if ([aCoder isByref] == NO) { return self; } return [super replacementObjectForPortCoder: aCoder]; } /** * Returns the number of seconds by which the receiver differs * from Greenwich Mean Time at the current date and time.
* Invokes -secondsFromGMTForDate: */ - (NSInteger) secondsFromGMT { return [self secondsFromGMTForDate: [NSDate date]]; } /** * Returns the number of seconds by which the receiver differs * from Greenwich Mean Time at the date aDate.
* If the time zone uses daylight savings time, the returned value * will vary at different times of year. */ - (NSInteger) secondsFromGMTForDate: (NSDate*)aDate { NSTimeZoneDetail *detail; int offset; detail = [self timeZoneDetailForDate: aDate]; offset = [detail timeZoneSecondsFromGMT]; return offset; } /** * DEPRECATED: see NSTimeZoneDetail */ - (NSArray*) timeZoneDetailArray { return [self subclassResponsibility: _cmd]; } /** * DEPRECATED: see NSTimeZoneDetail */ - (NSTimeZoneDetail*) timeZoneDetailForDate: (NSDate*)date { return [self subclassResponsibility: _cmd]; } /** * Returns the name of this timezone. */ - (NSString*) timeZoneName { return [self name]; } - (NSTimeInterval) daylightSavingTimeOffsetForDate: (NSDate *)aDate { #if GS_USE_ICU == 1 NSTimeInterval result; UCalendar *cal; UErrorCode err = U_ZERO_ERROR; cal = ICUCalendarSetup (self, nil); if (cal == NULL) return 0.0; ucal_setMillis (cal, ([aDate timeIntervalSince1970] * 1000.0), &err); result = (double)ucal_get (cal, UCAL_DST_OFFSET, &err) / 1000.0; if (U_FAILURE(err)) result = 0.0; ucal_close (cal); return result; #else return 0.0; // FIXME #endif } - (NSDate *) nextDaylightSavingTimeTransitionAfterDate: (NSDate *)aDate { #if GS_USE_ICU == 1 /* ICU doesn't provide transition information per se. * The canonical method of retrieving this piece of information is to * use binary search. */ int32_t originalOffset, currentOffset; UCalendar *cal; UErrorCode err = U_ZERO_ERROR; UDate currentTime; int i; NSDate* result = nil; cal = ICUCalendarSetup (self, nil); if (cal == NULL) return nil; currentTime = [aDate timeIntervalSince1970] * 1000.0; ucal_setMillis (cal, currentTime, &err); originalOffset = ucal_get (cal, UCAL_DST_OFFSET, &err); if (U_FAILURE(err)) return nil; /* First try to find the next transition by adding a week at a time */ /* Avoid ending in an infinite loop in case there is no transition at all */ for (i = 0; i < 53; i++) { /* Add a single week */ currentTime += WEEK_MILLISECONDS; ucal_setMillis (cal, currentTime, &err); if (U_FAILURE(err)) break; currentOffset = ucal_get (cal, UCAL_DST_OFFSET, &err); if (U_FAILURE(err)) break; if (currentOffset != originalOffset) { double interval = WEEK_MILLISECONDS / 2.0; /* Now use bisection to determine the exact moment */ while (interval >= 1.0) { ucal_setMillis (cal, currentTime - interval, &err); currentOffset = ucal_get (cal, UCAL_DST_OFFSET, &err); if (currentOffset != originalOffset) currentTime -= interval; /* it is in the lower half */ interval /= 2.0; } result = [NSDate dateWithTimeIntervalSince1970: floor(currentTime/1000.0)]; } } ucal_close (cal); return result; #else return nil; // FIXME; #endif } - (NSTimeInterval) daylightSavingTimeOffset { return [self daylightSavingTimeOffsetForDate: [NSDate date]]; } - (NSDate *) nextDaylightSavingTimeTransition { return [self nextDaylightSavingTimeTransitionAfterDate: [NSDate date]]; } - (NSString *) localizedName: (NSTimeZoneNameStyle)style locale: (NSLocale *)locale { #if GS_USE_ICU == 1 UChar *result; const char *cLocale; int32_t len; UCalendar *cal; UErrorCode err = U_ZERO_ERROR; cal = ICUCalendarSetup (self, locale); if (cal == NULL) return nil; cLocale = [[locale localeIdentifier] UTF8String]; result = NSZoneMalloc ([self zone], BUFFER_SIZE * sizeof(UChar)); len = ucal_getTimeZoneDisplayName (cal, _NSToICUTZDisplayStyle(style), cLocale, result, BUFFER_SIZE, &err); if (len > BUFFER_SIZE) { result = NSZoneRealloc ([self zone], result, len * sizeof(UChar)); ucal_getTimeZoneDisplayName (cal, _NSToICUTZDisplayStyle(style), cLocale, result, len, &err); } return AUTORELEASE([[NSString alloc] initWithCharactersNoCopy: result length: len freeWhenDone: YES]); #else return nil; // FIXME; #endif } @end /** * This class serves no useful purpose in GNUstep other than to provide * a backup mechanism for handling abbreviations where the precomputed * data files cannot be found. It is provided primarily for backward * compatibility with the OpenStep spec. It is missing entirely from MacOS-X. */ @implementation NSTimeZoneDetail - (NSString*) description { return [NSString stringWithFormat: @"%@(%@, %s%"PRIdPTR")", [self name], [self timeZoneAbbreviation], ([self isDaylightSavingTimeZone]? "IS_DST, ": ""), [self timeZoneSecondsFromGMT]]; } /** * DEPRECATED: Class is no longer used. */ - (BOOL) isDaylightSavingTimeZone { [self subclassResponsibility: _cmd]; return NO; } /** * DEPRECATED: Class is no longer used. */ - (NSString*) timeZoneAbbreviation { return [self subclassResponsibility: _cmd]; } /** * DEPRECATED: Class is no longer used. */ - (NSInteger) timeZoneSecondsFromGMT { [self subclassResponsibility: _cmd]; return 0; } @end @implementation NSTimeZone (Private) /** * Common locations for timezone info on unix systems. */ static NSString *zoneDirs[] = { #ifdef TZDIR @TZDIR, #endif @"/usr/share/zoneinfo", @"/usr/lib/zoneinfo", @"/usr/local/share/zoneinfo", @"/usr/local/lib/zoneinfo", @"/etc/zoneinfo", @"/usr/local/etc/zoneinfo" }; /** * Returns the path to the named zone info file. */ + (NSString*) _getTimeZoneFile: (NSString *)name { static BOOL beenHere = NO; NSString *dir = nil; BOOL isDir; if (beenHere == NO && tzdir == nil) { GS_MUTEX_LOCK(zone_mutex); if (beenHere == NO && tzdir == nil) { NSFileManager *mgr = [NSFileManager defaultManager]; NSString *zonedir = nil; unsigned i; for (i = 0; i < sizeof(zoneDirs)/sizeof(zoneDirs[0]); i++) { BOOL isDir; zonedir = [zoneDirs[i] stringByAppendingPathComponent: POSIX_TZONES]; if ([mgr fileExistsAtPath: zonedir isDirectory: &isDir] && isDir) { tzdir = RETAIN(zonedir); break; // use first one } } beenHere = YES; } GS_MUTEX_UNLOCK(zone_mutex); } /* Use the system zone info if possible, otherwise, use our installed info. */ if (tzdir && [[NSFileManager defaultManager] fileExistsAtPath: [tzdir stringByAppendingPathComponent: name] isDirectory: &isDir] == YES && isDir == NO) { dir = tzdir; } if (dir == nil) { dir = _time_zone_path (ZONES_DIR, nil); } return [dir stringByAppendingPathComponent: name]; } + (void) _notified: (NSNotification*)n { NSString *name; /* If the name of the system time zone has changed ... * get a new system time zone. */ name = [[NSUserDefaults standardUserDefaults] stringForKey: LOCALDBKEY]; if ([name length] > 0 && [name isEqual: [[self systemTimeZone] name]] == NO) { [self resetSystemTimeZone]; [self systemTimeZone]; } } @end #if defined(_WIN32) /* Timezone information data as stored in the registry */ typedef struct TZI_format { LONG Bias; LONG StandardBias; LONG DaylightBias; SYSTEMTIME StandardDate; SYSTEMTIME DaylightDate; } TZI; static inline unsigned int lastDayOfGregorianMonth(int month, int year) { switch (month) { case 2: if ((((year % 4) == 0) && ((year % 100) != 0)) || ((year % 400) == 0)) return 29; else return 28; case 4: case 6: case 9: case 11: return 30; default: return 31; } } /* IMPORT from NSCalendar date */ void GSBreakTime(NSTimeInterval when, NSInteger *year, NSInteger *month, NSInteger *day, NSInteger *hour, NSInteger *minute, NSInteger *second, NSInteger *mil); @implementation GSWindowsTimeZone - (NSString*) abbreviationForDate: (NSDate*)aDate { if ([self isDaylightSavingTimeForDate: aDate]) return daylightZoneNameAbbr; return timeZoneNameAbbr; } - (NSData*) data { return 0; } - (void) dealloc { RELEASE(timeZoneName); RELEASE(daylightZoneName); RELEASE(timeZoneNameAbbr); RELEASE(daylightZoneNameAbbr); DEALLOC } - (id) initWithName: (NSString*)name data: (NSData*)data { HKEY regDirKey; BOOL isNT = NO; BOOL regFound=NO; BOOL tzFound = NO; /* Open the key in the local machine hive where * the time zone data is stored. */ if (ERROR_SUCCESS == RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones", 0, KEY_READ, ®DirKey)) { isNT = YES; regFound = YES; } else { if (ERROR_SUCCESS == RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Time Zones", 0, KEY_READ, ®DirKey)) { regFound = YES; } } if (regFound) { /* Iterate over all subKeys in the registry to find the right one. Unfortunately name is a localized value. The keys in the registry are unlocalized names. */ wchar_t achKey[255]; // buffer for subkey name DWORD cbName; // size of name string wchar_t achClass[MAX_PATH] = L""; // buffer for class name DWORD cchClassName = MAX_PATH; // size of class string DWORD cSubKeys = 0; // number of subkeys DWORD cbMaxSubKey; // longest subkey size DWORD cchMaxClass; // longest class string DWORD cValues; // number of values for key DWORD cchMaxValue; // longest value name DWORD cbMaxValueData; // longest value data DWORD cbSecurityDescriptor; // size of security descriptor FILETIME ftLastWriteTime; // last write time DWORD i, retCode; /* Get the class name and the value count. */ retCode = RegQueryInfoKeyW( regDirKey, // key handle achClass, // buffer for class name &cchClassName, // size of class string NULL, // reserved &cSubKeys, // number of subkeys &cbMaxSubKey, // longest subkey size &cchMaxClass, // longest class string &cValues, // number of values for this key &cchMaxValue, // longest value name &cbMaxValueData, // longest value data &cbSecurityDescriptor, // security descriptor &ftLastWriteTime); // last write time if (cSubKeys && (retCode == ERROR_SUCCESS)) { unsigned wLen = [name length]; wchar_t *wName = malloc((wLen+1) * sizeof(wchar_t)); if (wName) { [name getCharacters: wName]; wName[wLen] = 0; for (i = 0; i < cSubKeys && !tzFound; i++) { cbName = 255; retCode = RegEnumKeyExW(regDirKey, i, achKey, &cbName, NULL, NULL, NULL, &ftLastWriteTime); if (retCode == ERROR_SUCCESS) { wchar_t keyBuffer[16384]; HKEY regKey; if (isNT) wcscpy(keyBuffer, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones\\"); else wcscpy(keyBuffer, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Time Zones\\"); wcscat(keyBuffer, achKey); if (ERROR_SUCCESS == RegOpenKeyExW(HKEY_LOCAL_MACHINE, keyBuffer, 0, KEY_READ, ®Key)) { wchar_t buf[256]; wchar_t standardName[256]; wchar_t daylightName[256]; DWORD bufsize; DWORD type; /* check standardname */ standardName[0] = L'\0'; bufsize = sizeof(buf); if (ERROR_SUCCESS == RegQueryValueExW(regKey, L"Std", 0, &type, (BYTE *)buf, &bufsize)) { wcscpy(standardName, buf); if (wcscmp(standardName, wName) == 0) tzFound = YES; } /* check daylightname */ daylightName[0] = L'\0'; bufsize = sizeof(buf); if (ERROR_SUCCESS == RegQueryValueExW(regKey, L"Dlt", 0, &type, (BYTE *)buf, &bufsize)) { wcscpy(daylightName, buf); if (wcscmp(daylightName, wName) == 0) tzFound = YES; } if (tzFound) { /* Read in the time zone data */ bufsize = sizeof(buf); if (ERROR_SUCCESS == RegQueryValueExW(regKey, L"TZI", 0, &type, (BYTE *)buf, &bufsize)) { TZI *tzi = (void*)buf; Bias = tzi->Bias; StandardBias = tzi->StandardBias; DaylightBias = tzi->DaylightBias; StandardDate = tzi->StandardDate; DaylightDate = tzi->DaylightDate; } /* Set the standard name for the time zone. */ if (wcslen(standardName)) { int a, b; ASSIGN(timeZoneName, [NSString stringWithCharacters: standardName length: wcslen(standardName)]); /* Abbr generated here is IMHO * a bit suspicous but I kept it */ for (a = 0, b = 0; standardName[a]; a++) { if (iswupper(standardName[a])) standardName[b++] = standardName[a]; } standardName[b] = L'\0'; ASSIGN(timeZoneNameAbbr, [NSString stringWithCharacters: standardName length: wcslen(standardName)]); } /* Set the daylight savings name * for the time zone. */ if (wcslen(daylightName)) { int a, b; ASSIGN(daylightZoneName, [NSString stringWithCharacters: daylightName length: wcslen(daylightName)]); /* Abbr generated here is IMHO * a bit suspicous but I kept it */ for (a = 0, b = 0; daylightName[a]; a++) { if (iswupper(daylightName[a])) daylightName[b++] = daylightName[a]; } daylightName[b] = L'\0'; ASSIGN(daylightZoneNameAbbr, [NSString stringWithCharacters: daylightName length: wcslen(daylightName)]); } } RegCloseKey(regKey); } } } free(wName); } } RegCloseKey(regDirKey); } if (NO == tzFound) { DESTROY(self); } return self; } - (BOOL) isDaylightSavingTimeForDate: (NSDate*)aDate { NSInteger year, month, day, hour, minute, second, mil; int dow; int daylightdate, count, maxdate; NSTimeInterval when; if (DaylightDate.wMonth == 0) return NO; when = [aDate timeIntervalSinceReferenceDate] - Bias*60; GSBreakTime(when, &year, &month, &day, &hour, &minute, &second, &mil); // Check north globe if (StandardDate.wMonth >= DaylightDate.wMonth) { // Before April or after October is Std if (month < DaylightDate.wMonth || month > StandardDate.wMonth) { return NO; } // After April and before October is DST if (month > DaylightDate.wMonth && month < StandardDate.wMonth) { return YES; } } else { /* check south globe * Before April or after October is DST */ if (month < StandardDate.wMonth || month > DaylightDate.wMonth) { return YES; } // After April and before October is Std if (month > StandardDate.wMonth && month < DaylightDate.wMonth) { return NO; } } dow = ((NSInteger)((when / 86400.0) + GREGORIAN_REFERENCE)) % 7; if (dow < 0) dow += 7; if (month == DaylightDate.wMonth /* April */) { daylightdate = day - dow + DaylightDate.wDayOfWeek; maxdate = lastDayOfGregorianMonth(DaylightDate.wMonth, year)-7; while (daylightdate > 7) daylightdate -= 7; if (daylightdate < 1) daylightdate += 7; count = DaylightDate.wDay; while (count > 1 && daylightdate < maxdate) { daylightdate += 7; count--; } if (day > daylightdate) return YES; if (day < daylightdate) return NO; if (hour > DaylightDate.wHour) return YES; if (hour < DaylightDate.wHour) return NO; if (minute > DaylightDate.wMinute) return YES; if (minute < DaylightDate.wMinute) return NO; if (second > DaylightDate.wSecond) return YES; if (second < DaylightDate.wSecond) return NO; if (mil >= DaylightDate.wMilliseconds) return YES; return NO; } if (month == StandardDate.wMonth /* October */) { daylightdate = day - dow + StandardDate.wDayOfWeek; maxdate = lastDayOfGregorianMonth(StandardDate.wMonth, year)-7; while (daylightdate > 7) daylightdate -= 7; if (daylightdate < 1) daylightdate += 7; count = StandardDate.wDay; while (count > 1 && daylightdate < maxdate) { daylightdate += 7; count--; } if (day > daylightdate) return NO; if (day < daylightdate) return YES; if (hour > StandardDate.wHour) return NO; if (hour < StandardDate.wHour) return YES; if (minute > StandardDate.wMinute) return NO; if (minute < StandardDate.wMinute) return YES; if (second > StandardDate.wSecond) return NO; if (second < StandardDate.wSecond) return YES; if (mil >= StandardDate.wMilliseconds) return NO; return YES; } return NO; // Never reached } - (NSString*) name { TIME_ZONE_INFORMATION tz; DWORD DST = GetTimeZoneInformation(&tz); if (DST == TIME_ZONE_ID_DAYLIGHT) { return daylightZoneName; } else { return timeZoneName; } } - (NSInteger) secondsFromGMTForDate: (NSDate*)aDate { if ([self isDaylightSavingTimeForDate: aDate]) return -Bias*60 - DaylightBias*60; return -Bias*60 - StandardBias*60; } - (NSArray*) timeZoneDetailArray { return [NSArray arrayWithObjects: [[[GSTimeZoneDetail alloc] initWithTimeZone: self withAbbrev: timeZoneNameAbbr withOffset: -Bias*60 - StandardBias*60 withDST: NO] autorelease], [[[GSTimeZoneDetail alloc] initWithTimeZone: self withAbbrev: daylightZoneNameAbbr withOffset: -Bias*60 - DaylightBias*60 withDST: YES] autorelease], 0]; } - (NSTimeZoneDetail*) timeZoneDetailForDate: (NSDate*)aDate { GSTimeZoneDetail *detail; int offset; BOOL isDST = [self isDaylightSavingTimeForDate: aDate]; NSString *abbr; if (isDST) { offset = -Bias*60 - DaylightBias*60; abbr = daylightZoneNameAbbr; } else { offset = -Bias*60 - StandardBias*60; abbr = timeZoneNameAbbr; } detail = [GSTimeZoneDetail alloc]; detail = [detail initWithTimeZone: self withAbbrev: abbr withOffset: offset withDST: isDST]; return detail; } - (NSString*) timeZoneName { return [self name]; } @end #endif // _WIN32 @implementation GSTimeZone static NSTimeZoneDetail* newDetailInZoneForType(GSTimeZone *zone, TypeInfo *type) { GSTimeZoneDetail *detail; NSString *abbr; abbr = [[NSString alloc] initWithUTF8String: type->abbreviation]; detail = [[GSTimeZoneDetail alloc] initWithTimeZone: zone withAbbrev: abbr withOffset: type->offset withDST: type->isdst]; RELEASE(abbr); return detail; } /** * Obtain TypeInfo from transisions or TZstring */ static TypeInfo getTypeInfo(NSTimeInterval since, GSTimeZone *zone) { int64_t when = (int64_t)since; gstm tm; TypeInfo type; if (localsub(zone->sp, &when, 0, &tm) == NULL) { memset(&type, '\0', sizeof(type)); } else { type.offset = tm.tm_gmtoff; type.isdst = tm.tm_isdst; type.abbr_idx = 0; type.abbreviation = tm.tm_zone; } return type; } - (NSString*) abbreviationForDate: (NSDate*)aDate { TypeInfo type = getTypeInfo([aDate timeIntervalSince1970], self); if (NULL == type.abbreviation) { return nil; } return [NSString stringWithUTF8String: type.abbreviation]; } - (NSData*) data { return timeZoneData; } - (void) dealloc { RELEASE(timeZoneName); RELEASE(timeZoneData); if (sp != 0) { free(sp); } DEALLOC } - (id) initWithName: (NSString*)name data: (NSData*)data { static NSString *fileException = @"GSTimeZoneFileException"; union local_storage *lsp; const char *zoneName; /* The placeholder class should have dealt with loading the data */ NSAssert([data isKindOfClass: [NSData class]], NSInvalidArgumentException); NSAssert([name isKindOfClass: [NSString class]], NSInvalidArgumentException); timeZoneName = [name copy]; timeZoneData = [data copy]; zoneName = [timeZoneName UTF8String]; sp = malloc(sizeof(*sp)); memset((char *)sp, '\0', sizeof(*sp)); NS_DURING { size_t nread; union input_buffer *up; lsp = malloc(sizeof(*lsp)); up = &lsp->u.u; nread = [data length]; if (nread > sizeof(up->buf)) { [NSException raise: fileException format: @"data too large"]; } [data getBytes: up->buf]; if (tzloadbody1(zoneName, sp, true, lsp, nread) != 0) { [NSException raise: fileException format: @"cannot load data"]; } free(lsp); lsp = NULL; scrub_abbrs(sp); } NS_HANDLER { if (lsp) { free(lsp); } DESTROY(self); NSLog(@"Unable to obtain time zone `%@'... %@", name, localException); if ([localException name] != fileException) { [localException raise]; } return nil; } NS_ENDHANDLER GS_MUTEX_LOCK(zone_mutex); [zoneDictionary setObject: self forKey: timeZoneName]; GS_MUTEX_UNLOCK(zone_mutex); return self; } - (BOOL) isDaylightSavingTimeForDate: (NSDate*)aDate { TypeInfo type = getTypeInfo([aDate timeIntervalSince1970], self); return type.isdst; } - (NSString*) name { return timeZoneName; } - (NSInteger) secondsFromGMTForDate: (NSDate*)aDate { TypeInfo type = getTypeInfo([aDate timeIntervalSince1970], self); return type.offset; } - (NSArray*) timeZoneDetailArray { NSTimeZoneDetail *details[sp->typecnt]; unsigned i; NSArray *array; for (i = 0; i < sp->typecnt; i++) { const struct _ttinfo *const ttisp = &sp->ttis[i]; const char *abbr = &sp->chars[ttisp->tt_desigidx]; TypeInfo type; type.offset = ttisp->tt_utoff; type.isdst = ttisp->tt_isdst; type.abbr_idx = ttisp->tt_desigidx; type.abbreviation = abbr; details[i] = newDetailInZoneForType(self, &type); } array = [NSArray arrayWithObjects: details count: sp->typecnt]; for (i = 0; i < sp->typecnt; i++) { RELEASE(details[i]); } return array; } - (NSTimeZoneDetail*) timeZoneDetailForDate: (NSDate*)aDate { TypeInfo type; NSTimeZoneDetail *detail; type = getTypeInfo([aDate timeIntervalSince1970], self); detail = newDetailInZoneForType(self, &type); return AUTORELEASE(detail); } - (NSString*) timeZoneName { return timeZoneName; } @end gnustep-base-1.29.0/Source/NSTimer.m000066400000000000000000000274431435650067400171630ustar00rootroot00000000000000/** Implementation of NSTimer for GNUstep Copyright (C) 1995, 1996, 1999 Free Software Foundation, Inc. Written by: Andrew Kachites McCallum Created: March 1996 Rewrite by: Richard Frith-Macdonald This file is part of the GNUstep Base Library. 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 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 USA. NSTimer class reference $Date$ $Revision$ */ #import "common.h" #define EXPOSE_NSTimer_IVARS 1 #import "Foundation/NSTimer.h" #import "Foundation/NSDate.h" #import "Foundation/NSException.h" #import "Foundation/NSRunLoop.h" #import "Foundation/NSInvocation.h" @class NSGDate; @interface NSGDate : NSObject // Help the compiler @end static Class NSDate_class; /** *

An NSTimer provides a way to send a message at some time in * the future, possibly repeating every time a fixed interval has passed. To * use a timer, you can either create one that will automatically be added to * the run loop in the current thread (using the -addTimer:forMode: method), * or you can create it without adding it then add it to an [NSRunLoop] * explicitly later. *

*

NB. You may not use -init or +new to create a timer, as the timer must * be properly initialised to send an action after some interval. *

*/ @implementation NSTimer + (void) initialize { if (self == [NSTimer class]) { NSDate_class = [NSGDate class]; } } - (NSString*) description { NSString *s = [super description]; if ([self isValid]) { if (_selector == 0) { return [NSString stringWithFormat: @"%@ at %@ invokes %@", s, [self fireDate], _target]; } else { return [NSString stringWithFormat: @"%@ at %@ sends %@ to (%@)", s, [self fireDate], NSStringFromSelector(_selector), _target]; } } else { return [NSString stringWithFormat: @"%@ (invalidated)", s]; } } /* For MacOS-X compatibility, this returns nil. */ - (id) init { DESTROY(self); return nil; } /** * Initialise the receive, a newly allocated NSTimer object.
* The ti argument specifies the time (in seconds) between the firing. * If it is less than or equal to 0.0 then a small interval is chosen * automatically.
* The fd argument specifies an initial fire date copied by the timer... * if it is not supplied (a nil object) then the ti argument is used to * create a start date relative to the current time.
* The f argument specifies whether the timer will fire repeatedly * or just once.
* If the selector argument is zero, then then object is an invocation * to be used when the timer fires. otherwise, the object is sent the * message specified by the selector and with the timer as an argument.
* The object and info arguments will be retained until the timer is * invalidated. */ - (id) initWithFireDate: (NSDate*)fd interval: (NSTimeInterval)ti target: (id)object selector: (SEL)selector userInfo: (id)info repeats: (BOOL)f { if (ti <= 0.0) { ti = 0.0001; } if (fd == nil) { _date = [[NSDate_class allocWithZone: NSDefaultMallocZone()] initWithTimeIntervalSinceNow: ti]; } else { _date = [fd copyWithZone: NSDefaultMallocZone()]; } _target = RETAIN(object); _selector = selector; _info = RETAIN(info); if (f == YES) { _repeats = YES; _interval = ti; } else { _repeats = NO; _interval = 0.0; } return self; } - (instancetype) initWithFireDate: (NSDate *)date interval: (NSTimeInterval)interval repeats: (BOOL)repeats block: (GSTimerBlock)block { ASSIGN(_block, (id)block); return [self initWithFireDate: date interval: interval target: nil selector: NULL userInfo: nil repeats: repeats]; } /** * Create a timer which will fire after ti seconds and, if f is YES, * every ti seconds thereafter. On firing, invocation will be performed.
* NB. To make the timer operate, you must add it to a run loop. */ + (NSTimer*) timerWithTimeInterval: (NSTimeInterval)ti invocation: (NSInvocation*)invocation repeats: (BOOL)f { return AUTORELEASE([[self alloc] initWithFireDate: nil interval: ti target: invocation selector: NULL userInfo: nil repeats: f]); } /** * Create a timer which will fire after ti seconds and, if f is YES, * every ti seconds thereafter. On firing, the target object will be * sent a message specified by selector and with the timer as its * argument.
* NB. To make the timer operate, you must add it to a run loop. */ + (NSTimer*) timerWithTimeInterval: (NSTimeInterval)ti target: (id)object selector: (SEL)selector userInfo: (id)info repeats: (BOOL)f { return AUTORELEASE([[self alloc] initWithFireDate: nil interval: ti target: object selector: selector userInfo: info repeats: f]); } + (NSTimer*) timerWithTimeInterval: (NSTimeInterval)ti repeats: (BOOL)f block: (GSTimerBlock)block { return AUTORELEASE([[self alloc] initWithFireDate: nil interval: ti repeats: f block: block]); } /** * Create a timer which will fire after ti seconds and, if f is YES, * every ti seconds thereafter. On firing, invocation will be performed.
* This timer will automatically be added to the current run loop and * will fire in the default run loop mode. */ + (NSTimer*) scheduledTimerWithTimeInterval: (NSTimeInterval)ti invocation: (NSInvocation*)invocation repeats: (BOOL)f { id t = [[self alloc] initWithFireDate: nil interval: ti target: invocation selector: NULL userInfo: nil repeats: f]; [[NSRunLoop currentRunLoop] addTimer: t forMode: NSDefaultRunLoopMode]; RELEASE(t); return t; } /** * Create a timer which will fire after ti seconds and, if f is YES, * every ti seconds thereafter. On firing, the target object will be * sent a message specified by selector and with the timer as its * argument.
* This timer will automatically be added to the current run loop and * will fire in the default run loop mode. */ + (NSTimer*) scheduledTimerWithTimeInterval: (NSTimeInterval)ti target: (id)object selector: (SEL)selector userInfo: (id)info repeats: (BOOL)f { id t = [[self alloc] initWithFireDate: nil interval: ti target: object selector: selector userInfo: info repeats: f]; [[NSRunLoop currentRunLoop] addTimer: t forMode: NSDefaultRunLoopMode]; RELEASE(t); return t; } + (NSTimer *) scheduledTimerWithTimeInterval: (NSTimeInterval)ti repeats: (BOOL)f block: (GSTimerBlock)block { id t = [[self alloc] initWithFireDate: nil interval: ti repeats: f block: block]; [[NSRunLoop currentRunLoop] addTimer: t forMode: NSDefaultRunLoopMode]; RELEASE(t); return t; } - (void) dealloc { if (_invalidated == NO) { [self invalidate]; } RELEASE(_date); [super dealloc]; } /** * Fires the timer ... either performs an invocation or sends a message * to a target object, depending on how the timer was set up.
* If the timer is not set to repeat, it is automatically invalidated.
* Exceptions raised during firing of the timer are caught and logged. */ - (void) fire { /* We check that we have not been invalidated before we fire. */ if (NO == _invalidated) { if ((id)_block != nil) { CALL_NON_NULL_BLOCK(_block, self); } else { id target; /* We retain the target so it won't be deallocated while we are using * it (if this timer gets invalidated while we are firing). */ target = RETAIN(_target); if (_selector == 0) { NS_DURING { [(NSInvocation*)target invoke]; } NS_HANDLER { NSLog(@"*** NSTimer ignoring exception '%@' (reason '%@') " @"raised during posting of timer with target %s(%s) " @"and selector '%@'", [localException name], [localException reason], GSClassNameFromObject(target), GSObjCIsInstance(target) ? "instance" : "class", NSStringFromSelector([target selector])); } NS_ENDHANDLER } else { NS_DURING { [target performSelector: _selector withObject: self]; } NS_HANDLER { NSLog(@"*** NSTimer ignoring exception '%@' (reason '%@') " @"raised during posting of timer with target %p and " @"selector '%@'", [localException name], [localException reason], target, NSStringFromSelector(_selector)); } NS_ENDHANDLER } RELEASE(target); } if (_repeats == NO) { [self invalidate]; } } } /** * Marks the timer as invalid, causing its target/invocation and user info * objects to be released.
* Invalidated timers are automatically removed from the run loop when it * detects them. */ - (void) invalidate { /* OPENSTEP allows this method to be called multiple times. */ _invalidated = YES; if (_target != nil) { DESTROY(_target); } if (_info != nil) { DESTROY(_info); } } /** * Checks to see if the timer has been invalidated. */ - (BOOL) isValid { if (_invalidated == NO) { return YES; } else { return NO; } } /** * Returns the date/time at which the timer is next due to fire. */ - (NSDate*) fireDate { return _date; } /** * Change the fire date for the receiver.
* NB. You should NOT use this method for a timer which has * been added to a run loop. The only time when it is safe to modify * the fire date of a timer in a run loop is for a repeating timer * when the timer is actually in the process of firing. */ - (void) setFireDate: (NSDate*)fireDate { ASSIGN(_date, fireDate); } /** * Returns the interval between firings, or zero if the timer * does not repeat. */ - (NSTimeInterval) timeInterval { return _interval; } /** * Returns the user info which was set for the timer when it was created, * or nil if none was set or the timer is invalid. */ - (id) userInfo { return _info; } /** * Compares timers based on the date at which they should next fire. */ - (NSComparisonResult) compare: (id)anotherTimer { if (anotherTimer == self) { return NSOrderedSame; } else if (anotherTimer == nil) { [NSException raise: NSInvalidArgumentException format: @"nil argument for compare:"]; } else { return [_date compare: ((NSTimer*)anotherTimer)->_date]; } return 0; } @end gnustep-base-1.29.0/Source/NSURL.m000066400000000000000000001765661435650067400165600ustar00rootroot00000000000000/** NSURL.m - Class NSURL Copyright (C) 1999 Free Software Foundation, Inc. Written by: Manuel Guesdon Date: Jan 1999 Rewrite by: Richard Frith-Macdonald Date: Jun 2002 Add'l by: Gregory John Casamento Date: Jan 2020 This file is part of the GNUstep Library. 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 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 USA. NSURL class reference $Date$ $Revision$ */ /* Note from Manuel Guesdon: * I've made some test to compare apple NSURL results and GNUstep NSURL results but as there this class is not very documented, some function may be incorrect * I've put 2 functions to make tests. You can add your own tests * Some functions are not implemented */ #define GS_NSURLQueryItem_IVARS \ NSString *_name; \ NSString *_value; #define GS_NSURLComponents_IVARS \ NSString *_string; \ NSString *_fragment; \ NSString *_host; \ NSString *_password; \ NSString *_path; \ NSNumber *_port; \ NSArray *_queryItems; \ NSString *_scheme; \ NSString *_user; \ NSRange _rangeOfFragment; \ NSRange _rangeOfHost; \ NSRange _rangeOfPassword; \ NSRange _rangeOfPath; \ NSRange _rangeOfPort; \ NSRange _rangeOfQuery; \ NSRange _rangeOfQueryItems; \ NSRange _rangeOfScheme; \ NSRange _rangeOfUser; \ BOOL _dirty; #import "common.h" #define EXPOSE_NSURL_IVARS 1 #import "Foundation/NSArray.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSCoder.h" #import "Foundation/NSData.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSError.h" #import "Foundation/NSException.h" #import "Foundation/NSFileManager.h" #import "Foundation/NSLock.h" #import "Foundation/NSMapTable.h" #import "Foundation/NSPortCoder.h" #import "Foundation/NSRunLoop.h" #import "Foundation/NSURL.h" #import "Foundation/NSURLHandle.h" #import "Foundation/NSValue.h" #import "Foundation/NSCharacterSet.h" #import "Foundation/NSString.h" #import "GNUstepBase/NSURL+GNUstepBase.h" @interface NSURL (GSPrivate) - (NSURL*) _URLBySettingPath: (NSString*)newPath; @end @implementation NSURL (GSPrivate) - (NSURL*) _URLBySettingPath: (NSString*)newPath { if ([self isFileURL]) { return [NSURL fileURLWithPath: newPath]; } else { NSURL *u; u = [[NSURL alloc] initWithScheme: [self scheme] user: [self user] password: [self password] host: [self host] port: [self port] fullPath: newPath parameterString: [self parameterString] query: [self query] fragment: [self fragment]]; return [u autorelease]; } } @end /* * Structure describing a URL. * All the char* fields may be NULL pointers, except path, which * is *always* non-null (though it may be an empty string). */ typedef struct { id absolute; // Cache absolute string or nil char *scheme; char *user; char *password; char *host; char *port; char *path; // May never be NULL char *parameters; char *query; char *fragment; BOOL pathIsAbsolute; BOOL emptyPath; BOOL hasNoPath; BOOL isGeneric; BOOL isFile; } parsedURL; #define myData ((parsedURL*)(self->_data)) #define baseData ((self->_baseURL == 0)?0:((parsedURL*)(self->_baseURL->_data))) static NSLock *clientsLock = nil; /* * Local utility functions. */ static char *buildURL(parsedURL *base, parsedURL *rel, BOOL standardize); static id clientForHandle(void *data, NSURLHandle *hdl); static char *findUp(char *str); static char *unescape(const char *from, char * to); /** * Build an absolute URL as a C string */ static char *buildURL(parsedURL *base, parsedURL *rel, BOOL standardize) { const char *rpath; char *buf; char *ptr; char *tmp; int l; unsigned int len = 1; if (NO == rel->hasNoPath) { len += 1; // trailing '/' to be added } if (rel->scheme != 0) { len += strlen(rel->scheme) + 3; // scheme:// } else if (YES == rel->isGeneric) { len += 2; // need '//' even if no scheme } if (rel->user != 0) { len += strlen(rel->user) + 1; // user...@ } if (rel->password != 0) { len += strlen(rel->password) + 1; // :password } if (rel->host != 0) { len += strlen(rel->host) + 1; // host.../ } if (rel->port != 0) { len += strlen(rel->port) + 1; // :port } if (rel->path != 0) { rpath = rel->path; } else { rpath = ""; } len += strlen(rpath) + 1; // path if (base != 0 && base->path != 0) { len += strlen(base->path) + 1; // path } if (rel->parameters != 0) { len += strlen(rel->parameters) + 1; // ;parameters } if (rel->query != 0) { len += strlen(rel->query) + 1; // ?query } if (rel->fragment != 0) { len += strlen(rel->fragment) + 1; // #fragment } ptr = buf = (char*)NSZoneMalloc(NSDefaultMallocZone(), len); if (rel->scheme != 0) { l = strlen(rel->scheme); memcpy(ptr, rel->scheme, l); ptr += l; *ptr++ = ':'; } if (rel->isGeneric == YES || rel->user != 0 || rel->password != 0 || rel->host != 0 || rel->port != 0) { *ptr++ = '/'; *ptr++ = '/'; if (rel->user != 0 || rel->password != 0) { if (rel->user != 0) { l = strlen(rel->user); memcpy(ptr, rel->user, l); ptr += l; } if (rel->password != 0) { *ptr++ = ':'; l = strlen(rel->password); memcpy(ptr, rel->password, l); ptr += l; } if (rel->host != 0 || rel->port != 0) { *ptr++ = '@'; } } if (rel->host != 0) { l = strlen(rel->host); memcpy(ptr, rel->host, l); ptr += l; } if (rel->port != 0) { *ptr++ = ':'; l = strlen(rel->port); memcpy(ptr, rel->port, l); ptr += l; } } /* * Now build path. */ tmp = ptr; if (rel->pathIsAbsolute == YES) { if (rel->hasNoPath == NO) { *tmp++ = '/'; } l = strlen(rpath); memcpy(tmp, rpath, l); tmp += l; } else if (base == 0) { l = strlen(rpath); memcpy(tmp, rpath, l); tmp += l; } else if (rpath[0] == 0) { if (base->hasNoPath == NO) { *tmp++ = '/'; } if (base->path) { l = strlen(base->path); memcpy(tmp, base->path, l); tmp += l; } } else { char *start = base->path; if (start != 0) { char *end = strrchr(start, '/'); if (end != 0) { *tmp++ = '/'; memcpy(tmp, start, end - start); tmp += (end - start); } } *tmp++ = '/'; l = strlen(rpath); memcpy(tmp, rpath, l); tmp += l; } *tmp = '\0'; if (standardize == YES) { /* * Compact '/./' to '/' and strip any trailing '/.' */ tmp = ptr; while (*tmp != '\0') { if (tmp[0] == '/' && tmp[1] == '.' && (tmp[2] == '/' || tmp[2] == '\0')) { /* * Ensure we don't remove the leading '/' */ if (tmp == ptr && tmp[2] == '\0') { tmp[1] = '\0'; } else { l = strlen(&tmp[2]) + 1; memmove(tmp, &tmp[2], l); } } else { tmp++; } } /* * Reduce any sequence of '/' characters to a single '/' */ tmp = ptr; while (*tmp != '\0') { if (tmp[0] == '/' && tmp[1] == '/') { l = strlen(&tmp[1]) + 1; memmove(tmp, &tmp[1], l); } else { tmp++; } } /* * Reduce any '/something/../' sequence to '/' and a trailing * "/something/.." to "" */ tmp = ptr; while ((tmp = findUp(tmp)) != 0) { char *next = &tmp[3]; while (tmp > ptr) { if (*--tmp == '/') { break; } } /* * Ensure we don't remove the leading '/' */ if (tmp == ptr && *next == '\0') { tmp[1] = '\0'; } else { l = strlen(next) + 1; memmove(tmp, next, l); } } /* * if we have an empty path, we standardize to a single slash. */ tmp = ptr; if (*tmp == '\0') { memcpy(tmp, "/", 2); } } ptr = &ptr[strlen(ptr)]; if (rel->parameters != 0) { *ptr++ = ';'; l = strlen(rel->parameters); memcpy(ptr, rel->parameters, l); ptr += l; } if (rel->query != 0) { *ptr++ = '?'; l = strlen(rel->query); memcpy(ptr, rel->query, l); ptr += l; } if (rel->fragment != 0) { *ptr++ = '#'; l = strlen(rel->fragment); memcpy(ptr, rel->fragment, l); ptr += l; } *ptr = '\0'; return buf; } static id clientForHandle(void *data, NSURLHandle *hdl) { id client = nil; if (data != 0) { [clientsLock lock]; client = RETAIN((id)NSMapGet((NSMapTable*)data, hdl)); [clientsLock unlock]; } return AUTORELEASE(client); } /** * Locate a '/../ or trailing '/..' */ static char *findUp(char *str) { while (*str != '\0') { if (str[0] == '/' && str[1] == '.' && str[2] == '.' && (str[3] == '/' || str[3] == '\0')) { return str; } str++; } return 0; } /* * Check a string to see if it contains only legal data characters * or percent escape sequences. */ static BOOL legal(const char *str, const char *extras) { const char *mark = "-_.!~*'()"; if (str != 0) { while (*str != 0) { if (*str == '%' && isxdigit(str[1]) && isxdigit(str[2])) { str += 3; } else if (isalnum(*str)) { str++; } else if (strchr(mark, *str) != 0) { str++; } else if (strchr(extras, *str) != 0) { str++; } else { return NO; } } } return YES; } /* * Convert percent escape sequences to individual characters. */ static char *unescape(const char *from, char * to) { while (*from != '\0') { if (*from == '%') { unsigned char c; from++; if (isxdigit(*from)) { if (*from <= '9') { c = *from - '0'; } else if (*from <= 'F') { c = *from - 'A' + 10; } else { c = *from - 'a' + 10; } from++; } else { c = 0; // Avoid compiler warning [NSException raise: NSGenericException format: @"Bad percent escape sequence in URL string"]; } c <<= 4; if (isxdigit(*from)) { if (*from <= '9') { c |= *from - '0'; } else if (*from <= 'F') { c |= *from - 'A' + 10; } else { c |= *from - 'a' + 10; } from++; *to++ = c; } else { [NSException raise: NSGenericException format: @"Bad percent escape sequence in URL string"]; } } else { *to++ = *from++; } } *to = '\0'; return to; } @implementation NSURL static NSCharacterSet *fileCharSet = nil; static NSUInteger urlAlign; + (id) fileURLWithPath: (NSString*)aPath { return AUTORELEASE([[NSURL alloc] initFileURLWithPath: aPath]); } + (id) fileURLWithPath: (NSString*)aPath isDirectory: (BOOL)isDir { return AUTORELEASE([[NSURL alloc] initFileURLWithPath: aPath isDirectory: isDir]); } + (id) fileURLWithPath: (NSString *)aPath isDirectory: (BOOL)isDir relativeToURL: (NSURL *)baseURL { return AUTORELEASE([[NSURL alloc] initFileURLWithPath: aPath isDirectory: isDir relativeToURL: baseURL]); } + (id)fileURLWithPath: (NSString *)aPath relativeToURL: (NSURL *)baseURL { return AUTORELEASE([[NSURL alloc] initFileURLWithPath: aPath relativeToURL: baseURL]); } + (id) fileURLWithPathComponents: (NSArray*)components { return [self fileURLWithPath: [NSString pathWithComponents: components]]; } + (void) initialize { if (clientsLock == nil) { NSGetSizeAndAlignment(@encode(parsedURL), NULL, &urlAlign); clientsLock = [NSLock new]; [[NSObject leakAt: &clientsLock] release]; ASSIGN(fileCharSet, [NSCharacterSet characterSetWithCharactersInString: @"!$&'()*+,-./0123456789:=@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"]); } } + (id) URLWithString: (NSString*)aUrlString { return AUTORELEASE([[NSURL alloc] initWithString: aUrlString]); } + (id) URLWithString: (NSString*)aUrlString relativeToURL: (NSURL*)aBaseUrl { return AUTORELEASE([[NSURL alloc] initWithString: aUrlString relativeToURL: aBaseUrl]); } + (id) URLByResolvingAliasFileAtURL: (NSURL*)url options: (NSURLBookmarkResolutionOptions)options error: (NSError**)error { // TODO: unimplemented return nil; } - (id) initFileURLWithPath: (NSString *)aPath { /* isDirectory flag will be overwritten if a directory exists. */ return [self initFileURLWithPath: aPath isDirectory: NO relativeToURL: nil]; } - (id) initFileURLWithPath: (NSString *)aPath isDirectory: (BOOL)isDir { return [self initFileURLWithPath: aPath isDirectory: isDir relativeToURL: nil]; } - (id) initFileURLWithPath: (NSString *)aPath relativeToURL: (NSURL *)baseURL { /* isDirectory flag will be overwritten if a directory exists. */ return [self initFileURLWithPath: aPath isDirectory: NO relativeToURL: baseURL]; } - (id) initFileURLWithPath: (NSString *)aPath isDirectory: (BOOL)isDir relativeToURL: (NSURL *)baseURL { NSFileManager *mgr = [NSFileManager defaultManager]; BOOL flag = NO; if (nil == aPath) { [NSException raise: NSInvalidArgumentException format: @"[%@ %@] nil string parameter", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; } if ([aPath isAbsolutePath] == NO) { if (baseURL) { /* Append aPath to baseURL */ aPath = [[baseURL relativePath] stringByAppendingPathComponent: aPath]; } else { aPath = [[mgr currentDirectoryPath] stringByAppendingPathComponent: aPath]; } } if ([mgr fileExistsAtPath: aPath isDirectory: &flag] == YES) { if ([aPath isAbsolutePath] == NO) { aPath = [aPath stringByStandardizingPath]; } isDir = flag; } if (isDir == YES && [aPath hasSuffix:@"/"] == NO) { aPath = [aPath stringByAppendingString: @"/"]; } return [self initWithScheme: NSURLFileScheme host: @"" path: aPath]; } - (id) initWithScheme: (NSString*)aScheme host: (NSString*)aHost path: (NSString*)aPath { NSRange r = NSMakeRange(NSNotFound, 0); NSString *auth = nil; NSString *aUrlString = [NSString alloc]; if ([aScheme isEqualToString: @"file"]) { aPath = [aPath stringByAddingPercentEncodingWithAllowedCharacters: fileCharSet]; } else { aPath = [aPath stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]; } r = [aHost rangeOfString: @"@"]; /* Allow for authentication (username:password) before actual host. */ if (r.length > 0) { auth = [aHost substringToIndex: r.location]; aHost = [aHost substringFromIndex: NSMaxRange(r)]; } /* Add square brackets around ipv6 address if necessary */ if ([[aHost componentsSeparatedByString: @":"] count] > 2 && [aHost hasPrefix: @"["] == NO) { aHost = [NSString stringWithFormat: @"[%@]", aHost]; } if (auth != nil) { aHost = [NSString stringWithFormat: @"%@@%@", auth, aHost]; } if ([aPath length] > 0) { /* * For MacOS-X compatibility, assume a path component with * a leading slash is intended to have that slash separating * the host from the path as specified in the RFC1738 */ if ([aPath hasPrefix: @"/"] == YES) { aUrlString = [aUrlString initWithFormat: @"%@://%@%@", aScheme, aHost, aPath]; } #if defined(_WIN32) /* On Windows file systems, an absolute file path can begin with * a drive letter. The first component in an absolute path * (e.g. C:) has to be enclosed by a leading slash. * * "file:///c:/path/to/file" */ else if ([aScheme isEqualToString: @"file"] && [aPath characterAtIndex:1] == ':') { aUrlString = [aUrlString initWithFormat: @"%@:///%@%@", aScheme, aHost, aPath]; } #endif else { aUrlString = [aUrlString initWithFormat: @"%@://%@/%@", aScheme, aHost, aPath]; } } else { aUrlString = [aUrlString initWithFormat: @"%@://%@/", aScheme, aHost]; } self = [self initWithString: aUrlString relativeToURL: nil]; RELEASE(aUrlString); return self; } - (id) initWithString: (NSString*)aUrlString { self = [self initWithString: aUrlString relativeToURL: nil]; return self; } - (id) initWithString: (NSString*)aUrlString relativeToURL: (NSURL*)aBaseUrl { /* RFC 2396 'reserved' characters ... * as modified by RFC2732 * static const char *reserved = ";/?:@&=+$,[]"; */ /* Same as reserved set but allow the hash character in a path too. */ static const char *filepath = ";/?:@&=+$,[]#"; if (nil == aUrlString) { RELEASE(self); return nil; // OSX behavior is to give up. } if ([aUrlString isKindOfClass: [NSString class]] == NO) { [NSException raise: NSInvalidArgumentException format: @"[%@ %@] bad string parameter", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; } if (aBaseUrl != nil && [aBaseUrl isKindOfClass: [NSURL class]] == NO) { [NSException raise: NSInvalidArgumentException format: @"[%@ %@] bad base URL parameter", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; } ASSIGNCOPY(_urlString, aUrlString); ASSIGN(_baseURL, [aBaseUrl absoluteURL]); NS_DURING { parsedURL *buf; parsedURL *base = baseData; unsigned size = [_urlString length]; char *end; char *start; char *ptr; BOOL usesFragments = YES; BOOL usesParameters = YES; BOOL usesQueries = YES; BOOL canBeGeneric = YES; size += sizeof(parsedURL) + urlAlign + 1; buf = _data = (parsedURL*)NSZoneMalloc(NSDefaultMallocZone(), size); memset(buf, '\0', size); start = end = ptr = (char*)&buf[1]; NS_DURING { [_urlString getCString: start maxLength: size encoding: NSASCIIStringEncoding]; } NS_HANDLER { /* OSX behavior when given non-ascii text is to return nil. */ RELEASE(self); return nil; } NS_ENDHANDLER /* * Parse the scheme if possible. */ ptr = start; if (isalpha(*ptr)) { ptr++; while (isalnum(*ptr) || *ptr == '+' || *ptr == '-' || *ptr == '.') { ptr++; } if (*ptr == ':') { buf->scheme = start; // Got scheme. *ptr = '\0'; // Terminate it. end = &ptr[1]; /* * Standardise uppercase to lower. */ while (--ptr > start) { if (isupper(*ptr)) { *ptr = tolower(*ptr); } } } } start = end; if (buf->scheme != 0 && base != 0 && 0 != strcmp(buf->scheme, base->scheme)) { /* The relative URL is of a different scheme to the base ... * so it's actually an absolute URL without a base. */ DESTROY(_baseURL); base = 0; } if (buf->scheme == 0 && base != 0) { buf->scheme = base->scheme; } /* * Set up scheme specific parsing options. */ if (buf->scheme != 0) { if (strcmp(buf->scheme, "file") == 0) { buf->isFile = YES; } else if (strcmp(buf->scheme, "data") == 0) { canBeGeneric = NO; DESTROY(_baseURL); base = 0; } else if (strcmp(buf->scheme, "mailto") == 0) { usesFragments = NO; usesParameters = NO; usesQueries = NO; } else if (strcmp(buf->scheme, "http") == 0 || strcmp(buf->scheme, "https") == 0) { buf->emptyPath = YES; } } if (canBeGeneric == YES) { /* * Parse the 'authority' * //user:password@host:port */ if (start[0] == '/' && start[1] == '/') { buf->isGeneric = YES; start = end = &end[2]; /* * Set 'end' to point to the start of the path, or just past * the 'authority' if there is no path. */ end = strchr(start, '/'); if (end == 0) { buf->hasNoPath = YES; end = &start[strlen(start)]; } else { *end++ = '\0'; } /* * Parser username:password part */ ptr = strchr(start, '@'); if (ptr != 0) { buf->user = start; *ptr++ = '\0'; start = ptr; if (legal(buf->user, ";:&=+$,") == NO) { [NSException raise: NSInvalidArgumentException format: @"[%@ %@](%@, %@) " @"illegal character in user/password part", NSStringFromClass([self class]), NSStringFromSelector(_cmd), aUrlString, aBaseUrl]; } ptr = strchr(buf->user, ':'); if (ptr != 0) { *ptr++ = '\0'; buf->password = ptr; } } /* * Parse host:port part */ buf->host = start; if (*start == '[') { ptr = strchr(buf->host, ']'); if (ptr == 0) { [NSException raise: NSInvalidArgumentException format: @"[%@ %@](%@, %@) " @"illegal ipv6 host address", NSStringFromClass([self class]), NSStringFromSelector(_cmd), aUrlString, aBaseUrl]; } else { ptr = start + 1; while (*ptr != ']') { if (*ptr != ':' && *ptr != '.' && !isxdigit(*ptr)) { [NSException raise: NSInvalidArgumentException format: @"[%@ %@](%@, %@) " @"illegal ipv6 host address", NSStringFromClass([self class]), NSStringFromSelector(_cmd), aUrlString, aBaseUrl]; } ptr++; } } ptr = strchr(ptr, ':'); } else { ptr = strchr(buf->host, ':'); } if (ptr != 0) { const char *str; *ptr++ = '\0'; buf->port = ptr; str = buf->port; while (*str != 0) { if (*str == '%' && isxdigit(str[1]) && isxdigit(str[2])) { unsigned char c; str++; if (*str <= '9') { c = *str - '0'; } else if (*str <= 'F') { c = *str - 'A' + 10; } else { c = *str - 'a' + 10; } c <<= 4; str++; if (*str <= '9') { c |= *str - '0'; } else if (*str <= 'F') { c |= *str - 'A' + 10; } else { c |= *str - 'a' + 10; } if (isdigit(c)) { str++; } else { [NSException raise: NSInvalidArgumentException format: @"[%@ %@](%@, %@) " @"illegal port part", NSStringFromClass([self class]), NSStringFromSelector(_cmd), aUrlString, aBaseUrl]; } } else if (isdigit(*str)) { str++; } else { [NSException raise: NSInvalidArgumentException format: @"[%@ %@](%@, %@) " @"illegal character in port part", NSStringFromClass([self class]), NSStringFromSelector(_cmd), aUrlString, aBaseUrl]; } } } start = end; /* Check for a legal host, unless it's an ipv6 address * (which would have been checked earlier). */ if (*buf->host != '[' && legal(buf->host, "-") == NO) { [NSException raise: NSInvalidArgumentException format: @"[%@ %@](%@, %@) " @"illegal character in host part", NSStringFromClass([self class]), NSStringFromSelector(_cmd), aUrlString, aBaseUrl]; } /* * If we have an authority component, * this must be an absolute URL */ buf->pathIsAbsolute = YES; base = 0; } else { if (base != 0) { buf->isGeneric = base->isGeneric; } if (*start == '/') { buf->pathIsAbsolute = YES; start++; } } if (usesFragments == YES) { /* * Strip fragment string from end of url. */ ptr = strchr(start, '#'); if (ptr != 0) { *ptr++ = '\0'; if (*ptr != 0) { buf->fragment = ptr; } } if (buf->fragment == 0 && base != 0) { buf->fragment = base->fragment; } if (legal(buf->fragment, filepath) == NO) { [NSException raise: NSInvalidArgumentException format: @"[%@ %@](%@, %@) " @"illegal character in fragment part", NSStringFromClass([self class]), NSStringFromSelector(_cmd), aUrlString, aBaseUrl]; } } if (usesQueries == YES) { /* * Strip query string from end of url. */ ptr = strchr(start, '?'); if (ptr != 0) { *ptr++ = '\0'; if (*ptr != 0) { buf->query = ptr; } } if (buf->query == 0 && base != 0) { buf->query = base->query; } if (legal(buf->query, filepath) == NO) { [NSException raise: NSInvalidArgumentException format: @"[%@ %@](%@, %@) " @"illegal character in query part", NSStringFromClass([self class]), NSStringFromSelector(_cmd), aUrlString, aBaseUrl]; } } if (usesParameters == YES) { /* * Strip parameters string from end of url. */ ptr = strchr(start, ';'); if (ptr != 0) { *ptr++ = '\0'; if (*ptr != 0) { buf->parameters = ptr; } } if (buf->parameters == 0 && base != 0) { buf->parameters = base->parameters; } if (legal(buf->parameters, filepath) == NO) { [NSException raise: NSInvalidArgumentException format: @"[%@ %@](%@, %@) " @"illegal character in parameters part", NSStringFromClass([self class]), NSStringFromSelector(_cmd), aUrlString, aBaseUrl]; } } if (buf->isFile == YES) { buf->user = 0; buf->password = 0; if (base != 0 && base->host != 0) { buf->host = base->host; } else if (buf->host != 0 && *buf->host == 0) { buf->host = 0; } buf->port = 0; buf->isGeneric = YES; } else if (base != 0 && buf->user == 0 && buf->password == 0 && buf->host == 0 && buf->port == 0) { buf->user = base->user; buf->password = base->password; buf->host = base->host; buf->port = base->port; } } /* * Store the path. */ buf->path = start; if (0 == base && '\0' == *buf->path && NO == buf->pathIsAbsolute) { buf->hasNoPath = YES; } if (legal(buf->path, filepath) == NO) { [NSException raise: NSInvalidArgumentException format: @"[%@ %@](%@, %@) " @"illegal character in path part", NSStringFromClass([self class]), NSStringFromSelector(_cmd), aUrlString, aBaseUrl]; } } NS_HANDLER { NSDebugLog(@"%@", localException); DESTROY(self); } NS_ENDHANDLER return self; } - (void) dealloc { if (_clients != 0) { NSFreeMapTable(_clients); _clients = 0; } if (_data != 0) { DESTROY(myData->absolute); NSZoneFree([self zone], _data); _data = 0; } DESTROY(_urlString); DESTROY(_baseURL); [super dealloc]; } - (id) copyWithZone: (NSZone*)zone { if (NSShouldRetainWithZone(self, zone) == NO) { return [[[self class] allocWithZone: zone] initWithString: _urlString relativeToURL: _baseURL]; } else { return RETAIN(self); } } - (NSString*) description { NSString *dscr = _urlString; if (_baseURL != nil) { dscr = [dscr stringByAppendingFormat: @" -- %@", _baseURL]; } return dscr; } - (void) encodeWithCoder: (NSCoder*)aCoder { if ([aCoder allowsKeyedCoding]) { [aCoder encodeObject: _baseURL forKey: @"NS.base"]; [aCoder encodeObject: _urlString forKey: @"NS.relative"]; } else { [aCoder encodeObject: _urlString]; [aCoder encodeObject: _baseURL]; } } - (NSUInteger) hash { return [[self absoluteString] hash]; } - (id) initWithCoder: (NSCoder*)aCoder { NSURL *base; NSString *rel; if ([aCoder allowsKeyedCoding]) { base = [aCoder decodeObjectForKey: @"NS.base"]; rel = [aCoder decodeObjectForKey: @"NS.relative"]; } else { rel = [aCoder decodeObject]; base = [aCoder decodeObject]; } if (nil == rel) { rel = @""; } self = [self initWithString: rel relativeToURL: base]; return self; } - (BOOL) isEqual: (id)other { if (other == nil || [other isKindOfClass: [NSURL class]] == NO) { return NO; } return [[self absoluteString] isEqualToString: [other absoluteString]]; } - (NSString*) absoluteString { NSString *absString = myData->absolute; if (absString == nil) { char *url = buildURL(baseData, myData, NO); unsigned len = strlen(url); absString = [[NSString alloc] initWithCStringNoCopy: url length: len freeWhenDone: YES]; myData->absolute = absString; } return absString; } - (NSURL*) absoluteURL { if (_baseURL == nil) { return self; } else { return [NSURL URLWithString: [self absoluteString]]; } } - (NSURL*) baseURL { return _baseURL; } - (BOOL) checkResourceIsReachableAndReturnError: (NSError **)error { NSString *errorStr = nil; if ([self isFileURL]) { NSFileManager *mgr = [NSFileManager defaultManager]; NSString *path = [self path]; if ([mgr fileExistsAtPath: path]) { if (![mgr isReadableFileAtPath: path]) { errorStr = @"File not readable"; } } else { errorStr = @"File does not exist"; } } else { errorStr = @"No file URL"; } if ((errorStr != nil) && (error != NULL)) { NSDictionary *info; info = [NSDictionary dictionaryWithObjectsAndKeys: errorStr, NSLocalizedDescriptionKey, nil]; *error = [NSError errorWithDomain: @"NSURLError" code: 0 userInfo: info]; } return nil == errorStr ? YES : NO; } - (NSString*) fragment { NSString *fragment = nil; if (myData->fragment != 0) { fragment = [NSString stringWithUTF8String: myData->fragment]; } return fragment; } - (char*) _path: (char*)buf withEscapes: (BOOL)withEscapes { char *ptr = buf; char *tmp = buf; int l; if (myData->pathIsAbsolute == YES) { if (myData->hasNoPath == NO) { *tmp++ = '/'; } if (myData->path != 0) { l = strlen(myData->path); memcpy(tmp, myData->path, l + 1); } } else if (nil == _baseURL) { if (myData->path != 0) { l = strlen(myData->path); memcpy(tmp, myData->path, l + 1); } } else if (0 == myData->path || 0 == *myData->path) { if (baseData->hasNoPath == NO) { *tmp++ = '/'; } if (baseData->path != 0) { l = strlen(baseData->path); memcpy(tmp, baseData->path, l + 1); } } else { char *start = baseData->path; char *end = (start == 0) ? 0 : strrchr(start, '/'); if (end != 0) { *tmp++ = '/'; strncpy(tmp, start, end - start); tmp += end - start; } *tmp++ = '/'; if (myData->path != 0) { l = strlen(myData->path); memcpy(tmp, myData->path, l + 1); } } if (!withEscapes) { unescape(buf, buf); } #if defined(_WIN32) /* On windows a file URL path may be of the form C:\xxx (ie we should * not insert the leading slash). * Also the vertical bar symbol may have been used instead of the * colon, so we need to convert that. */ if (myData->isFile == YES) { if (ptr[1] && isalpha(ptr[1])) { if (ptr[2] == ':' || ptr[2] == '|') { if (ptr[3] == '\0' || ptr[3] == '/' || ptr[3] == '\\') { ptr[2] = ':'; ptr++; } } } } #endif return ptr; } - (NSString*) host { NSString *host = nil; if (myData->host != 0) { char buf[strlen(myData->host)+1]; if (*myData->host == '[') { char *end = unescape(myData->host + 1, buf); if (end[-1] == ']') { end[-1] = '\0'; } } else { unescape(myData->host, buf); } host = [NSString stringWithUTF8String: buf]; } return host; } - (BOOL) isFileURL { return myData->isFile; } - (NSString*) lastPathComponent { return [[self path] lastPathComponent]; } - (BOOL) isFileReferenceURL { return NO; } - (NSURL *) fileReferenceURL { if ([self isFileURL]) { return self; } return nil; } - (NSURL *) filePathURL { if ([self isFileURL]) { return self; } return nil; } - (BOOL) getResourceValue: (id*)value forKey: (NSString *)key error: (NSError**)error { // TODO: unimplemented return NO; } - (void) loadResourceDataNotifyingClient: (id)client usingCache: (BOOL)shouldUseCache { NSURLHandle *handle = [self URLHandleUsingCache: shouldUseCache]; NSData *d; if (shouldUseCache == YES && (d = [handle availableResourceData]) != nil) { /* * We already have cached data we should use. */ if ([client respondsToSelector: @selector(URL:resourceDataDidBecomeAvailable:)]) { [client URL: self resourceDataDidBecomeAvailable: d]; } if ([client respondsToSelector: @selector(URLResourceDidFinishLoading:)]) { [client URLResourceDidFinishLoading: self]; } } else { if (client != nil) { [clientsLock lock]; if (_clients == 0) { _clients = NSCreateMapTable (NSObjectMapKeyCallBacks, NSNonRetainedObjectMapValueCallBacks, 0); } NSMapInsert((NSMapTable*)_clients, (void*)handle, (void*)client); [clientsLock unlock]; [handle addClient: self]; } /* * Kick off the load process. */ [handle loadInBackground]; } } - (NSString*) parameterString { NSString *parameters = nil; if (myData->parameters != 0) { parameters = [NSString stringWithUTF8String: myData->parameters]; } return parameters; } - (NSString*) password { NSString *password = nil; if (myData->password != 0) { char buf[strlen(myData->password)+1]; unescape(myData->password, buf); password = [NSString stringWithUTF8String: buf]; } return password; } - (NSString*) _pathWithEscapes: (BOOL)withEscapes { NSString *path = nil; if (YES == myData->isGeneric || 0 == myData->scheme) { unsigned int len = 3; if (_baseURL != nil) { if (baseData->path && *baseData->path) { len += strlen(baseData->path); } else if (baseData->hasNoPath == NO) { len++; } } if (myData->path && *myData->path) { len += strlen(myData->path); } else if (myData->hasNoPath == NO) { len++; } if (len > 3) { char buf[len]; char *ptr; char *tmp; ptr = [self _path: buf withEscapes: withEscapes]; /* Remove any trailing '/' from the path for MacOS-X compatibility. */ tmp = ptr + strlen(ptr) - 1; if (tmp > ptr && *tmp == '/') { *tmp = '\0'; } path = [NSString stringWithUTF8String: ptr]; } else if (YES == myData->emptyPath) { /* OSX seems to use an empty string for some schemes, * though it normally uses nil. */ path = @""; } } return path; } - (NSString*) path { return [self _pathWithEscapes: NO]; } - (NSArray*) pathComponents { return [[self path] pathComponents]; } - (NSString*) pathExtension { return [[self path] pathExtension]; } - (NSNumber*) port { NSNumber *port = nil; if (myData->port != 0) { char buf[strlen(myData->port)+1]; unescape(myData->port, buf); port = [NSNumber numberWithUnsignedShort: atol(buf)]; } return port; } - (id) propertyForKey: (NSString*)propertyKey { NSURLHandle *handle = [self URLHandleUsingCache: YES]; return [handle propertyForKey: propertyKey]; } - (NSString*) query { NSString *query = nil; if (myData->query != 0) { query = [NSString stringWithUTF8String: myData->query]; } return query; } - (NSString*) relativePath { if (nil == _baseURL) { return [self path]; } else { NSString *path = nil; if (myData->path != 0) { char buf[strlen(myData->path) + 1]; strcpy(buf, myData->path); unescape(buf, buf); path = [NSString stringWithUTF8String: buf]; } return path; } } - (NSString*) relativeString { return _urlString; } /* Encode bycopy unless explicitly requested otherwise. */ - (id) replacementObjectForPortCoder: (NSPortCoder*)aCoder { if ([aCoder isByref] == NO) return self; return [super replacementObjectForPortCoder: aCoder]; } - (NSData*) resourceDataUsingCache: (BOOL)shouldUseCache { NSURLHandle *handle = [self URLHandleUsingCache: YES]; NSData *data = nil; if ([handle status] == NSURLHandleLoadSucceeded) { data = [handle availableResourceData]; } if (shouldUseCache == NO || [handle status] != NSURLHandleLoadSucceeded) { data = [handle loadInForeground]; } if (nil == data) { data = [handle availableResourceData]; } return data; } - (NSString*) resourceSpecifier { if (YES == myData->isGeneric) { NSRange range = [_urlString rangeOfString: @"://"]; if (range.length > 0) { NSString *specifier; /* MacOSX compatibility - in the case where there is no * host in the URL, just return the path (without the "//"). * For all other cases we return the whole specifier. */ if (nil == [self host]) { specifier = [_urlString substringFromIndex: NSMaxRange(range)]; } else { specifier = [_urlString substringFromIndex: range.location+1]; } return specifier; } else { /* * Cope with URLs missing net_path info - :/... */ range = [_urlString rangeOfString: @":"]; if (range.length > 0) { return [_urlString substringFromIndex: range.location + 1]; } else { return _urlString; } } } else { return [NSString stringWithUTF8String: myData->path]; } } - (NSString*) scheme { NSString *scheme = nil; if (myData->scheme != 0) { scheme = [NSString stringWithUTF8String: myData->scheme]; } return scheme; } - (BOOL) setProperty: (id)property forKey: (NSString*)propertyKey { NSURLHandle *handle = [self URLHandleUsingCache: YES]; return [handle writeProperty: property forKey: propertyKey]; } - (BOOL) setResourceData: (NSData*)data { NSURLHandle *handle = [self URLHandleUsingCache: YES]; if (handle == nil) { return NO; } if ([handle writeData: data] == NO) { return NO; } if ([handle loadInForeground] == nil) { return NO; } return YES; } - (NSURL*) standardizedURL { char *url = buildURL(baseData, myData, YES); unsigned len = strlen(url); NSString *str; NSURL *tmp; str = [[NSString alloc] initWithCStringNoCopy: url length: len freeWhenDone: YES]; tmp = [NSURL URLWithString: str]; RELEASE(str); return tmp; } - (NSURLHandle*) URLHandleUsingCache: (BOOL)shouldUseCache { NSURLHandle *handle = nil; if (shouldUseCache) { handle = [NSURLHandle cachedHandleForURL: self]; } if (handle == nil) { Class c = [NSURLHandle URLHandleClassForURL: self]; if (c != 0) { handle = [[c alloc] initWithURL: self cached: shouldUseCache]; IF_NO_ARC([handle autorelease];) } } return handle; } - (NSString*) user { NSString *user = nil; if (myData->user != 0) { char buf[strlen(myData->user)+1]; unescape(myData->user, buf); user = [NSString stringWithUTF8String: buf]; } return user; } - (NSURL*) URLByAppendingPathComponent: (NSString*)pathComponent { return [self _URLBySettingPath: [[self path] stringByAppendingPathComponent: pathComponent]]; } - (NSURL*) URLByAppendingPathExtension: (NSString*)pathExtension { return [self _URLBySettingPath: [[self path] stringByAppendingPathExtension: pathExtension]]; } - (NSURL*) URLByDeletingLastPathComponent { return [self _URLBySettingPath: [[self path] stringByDeletingLastPathComponent]]; } - (NSURL*) URLByDeletingPathExtension { return [self _URLBySettingPath: [[self path] stringByDeletingPathExtension]]; } - (NSURL*) URLByResolvingSymlinksInPath { if ([self isFileURL]) { return [NSURL fileURLWithPath: [[self path] stringByResolvingSymlinksInPath]]; } return self; } - (NSURL*) URLByStandardizingPath { if ([self isFileURL]) { return [NSURL fileURLWithPath: [[self path] stringByStandardizingPath]]; } return self; } - (NSURL *) URLByAppendingPathComponent: (NSString *)pathComponent isDirectory: (BOOL)isDirectory { NSString *path = [[self path] stringByAppendingPathComponent: pathComponent]; if (isDirectory) { path = [path stringByAppendingString: @"/"]; } return [self _URLBySettingPath: path]; } - (void) URLHandle: (NSURLHandle*)sender resourceDataDidBecomeAvailable: (NSData*)newData { id c = clientForHandle(_clients, sender); if ([c respondsToSelector: @selector(URL:resourceDataDidBecomeAvailable:)]) { [c URL: self resourceDataDidBecomeAvailable: newData]; } } - (void) URLHandle: (NSURLHandle*)sender resourceDidFailLoadingWithReason: (NSString*)reason { id c = clientForHandle(_clients, sender); RETAIN(self); [sender removeClient: self]; if (c != nil) { [clientsLock lock]; NSMapRemove((NSMapTable*)_clients, (void*)sender); [clientsLock unlock]; if ([c respondsToSelector: @selector(URL:resourceDidFailLoadingWithReason:)]) { [c URL: self resourceDidFailLoadingWithReason: reason]; } } RELEASE(self); } - (void) URLHandleResourceDidBeginLoading: (NSURLHandle*)sender { } - (void) URLHandleResourceDidCancelLoading: (NSURLHandle*)sender { id c = clientForHandle(_clients, sender); RETAIN(self); [sender removeClient: self]; if (c != nil) { [clientsLock lock]; NSMapRemove((NSMapTable*)_clients, (void*)sender); [clientsLock unlock]; if ([c respondsToSelector: @selector(URLResourceDidCancelLoading:)]) { [c URLResourceDidCancelLoading: self]; } } RELEASE(self); } - (void) URLHandleResourceDidFinishLoading: (NSURLHandle*)sender { id c = clientForHandle(_clients, sender); RETAIN(self); [sender removeClient: self]; if (c != nil) { [clientsLock lock]; NSMapRemove((NSMapTable*)_clients, (void*)sender); [clientsLock unlock]; if ([c respondsToSelector: @selector(URLResourceDidFinishLoading:)]) { [c URLResourceDidFinishLoading: self]; } } RELEASE(self); } @end /** * An informal protocol to which clients may conform if they wish to be * notified of the progress in loading a URL for them. NSURL conforms to * this protocol but all methods are implemented as no-ops. See also * the [(NSURLHandleClient)] protocol. */ @implementation NSObject (NSURLClient) - (void) URL: (NSURL*)sender resourceDataDidBecomeAvailable: (NSData*)newBytes { } - (void) URL: (NSURL*)sender resourceDidFailLoadingWithReason: (NSString*)reason { } - (void) URLResourceDidCancelLoading: (NSURL*)sender { } - (void) URLResourceDidFinishLoading: (NSURL*)sender { } @end @implementation NSURL (GNUstepBase) - (NSString*) fullPath { NSString *path = nil; if (YES == myData->isGeneric || 0 == myData->scheme) { unsigned int len = 3; if (_baseURL != nil) { if (baseData->path && *baseData->path) { len += strlen(baseData->path); } else if (baseData->hasNoPath == NO) { len++; } } if (myData->path && *myData->path) { len += strlen(myData->path); } else if (myData->hasNoPath == NO) { len++; } if (len > 3) { char buf[len]; char *ptr; ptr = [self _path: buf withEscapes: NO]; path = [NSString stringWithUTF8String: ptr]; } } return path; } - (NSString*) pathWithEscapes { return [self _pathWithEscapes: YES]; } @end #define GSInternal NSURLQueryItemInternal #include "GSInternal.h" GS_PRIVATE_INTERNAL(NSURLQueryItem) @implementation NSURLQueryItem // Creating query items. + (instancetype)queryItemWithName: (NSString *)name value: (NSString *)value { NSURLQueryItem *newQueryItem = [[NSURLQueryItem alloc] initWithName: name value: value]; return AUTORELEASE(newQueryItem); } - (instancetype) init { self = [self initWithName: nil value: nil]; if (self != nil) { } return self; } - (instancetype) initWithName: (NSString *)name value: (NSString *)value { self = [super init]; if (self != nil) { GS_CREATE_INTERNAL(NSURLQueryItem); if (name) { ASSIGNCOPY(internal->_name, name); } else { /* OSX behaviour is to set an empty string for nil name property */ ASSIGN(internal->_name, @""); } ASSIGNCOPY(internal->_value, value); } return self; } - (void) dealloc { RELEASE(internal->_name); RELEASE(internal->_value); GS_DESTROY_INTERNAL(NSURLQueryItem); [super dealloc]; } // Reading a name and value from a query - (NSString *) name { return internal->_name; } - (NSString *) value { return internal->_value; } - (id) initWithCoder: (NSCoder *)acoder { if ((self = [super init]) != nil) { if ([acoder allowsKeyedCoding]) { internal->_name = [acoder decodeObjectForKey: @"NS.name"]; internal->_value = [acoder decodeObjectForKey: @"NS.value"]; } else { internal->_name = [acoder decodeObject]; internal->_value = [acoder decodeObject]; } } return self; } - (void) encodeWithCoder: (NSCoder *)acoder { if ([acoder allowsKeyedCoding]) { [acoder encodeObject: internal->_name forKey: @"NS.name"]; [acoder encodeObject: internal->_value forKey: @"NS.value"]; } else { [acoder encodeObject: internal->_name]; [acoder encodeObject: internal->_value]; } } - (id) copyWithZone: (NSZone *)zone { return [[[self class] allocWithZone: zone] initWithName: internal->_name value: internal->_value]; } @end #undef GSInternal #define GSInternal NSURLComponentsInternal #include "GSInternal.h" GS_PRIVATE_INTERNAL(NSURLComponents) @implementation NSURLComponents static NSCharacterSet *queryItemCharSet = nil; + (void) initialize { if (nil == queryItemCharSet) { ENTER_POOL NSMutableCharacterSet *m; m = [[NSCharacterSet URLQueryAllowedCharacterSet] mutableCopy]; /* Rationale: if a query item contained an ampersand we would not be * able to tell where one name/value pair ends and the next starts, * so we cannot permit that character in an item. Similarly, if a * query item contained an equals sign we would not be able to tell * where the name ends and the value starts, so we cannot permit that * character either. */ [m removeCharactersInString: @"&="]; queryItemCharSet = [m copy]; RELEASE(m); LEAVE_POOL } } // Creating URL components... + (instancetype) componentsWithString: (NSString *)urlString { return AUTORELEASE([[NSURLComponents alloc] initWithString: urlString]); } + (instancetype) componentsWithURL: (NSURL *)url resolvingAgainstBaseURL: (BOOL)resolve { return AUTORELEASE([[NSURLComponents alloc] initWithURL: url resolvingAgainstBaseURL: resolve]); } - (instancetype) init { self = [super init]; if (self != nil) { GS_CREATE_INTERNAL(NSURLComponents); internal->_rangeOfFragment = NSMakeRange(NSNotFound, 0); internal->_rangeOfHost = NSMakeRange(NSNotFound, 0); internal->_rangeOfPassword = NSMakeRange(NSNotFound, 0); internal->_rangeOfPath = NSMakeRange(NSNotFound, 0); internal->_rangeOfPort = NSMakeRange(NSNotFound, 0); internal->_rangeOfQuery = NSMakeRange(NSNotFound, 0); internal->_rangeOfScheme = NSMakeRange(NSNotFound, 0); internal->_rangeOfUser = NSMakeRange(NSNotFound, 0); } return self; } - (instancetype) initWithString: (NSString *)URLString { /* OSX behavior is to return nil for a string which cannot be * used to initialize valid NSURL object */ NSURL *url = [NSURL URLWithString: URLString]; if (url) { return [self initWithURL: url resolvingAgainstBaseURL: NO]; } else { return nil; } } - (instancetype) initWithURL: (NSURL *)url resolvingAgainstBaseURL: (BOOL)resolve { self = [self init]; if (self != nil) { NSURL *tempURL = url; if (resolve) { tempURL = [url absoluteURL]; } [self setURL: tempURL]; } return self; } - (void) dealloc { RELEASE(internal->_string); RELEASE(internal->_fragment); RELEASE(internal->_host); RELEASE(internal->_password); RELEASE(internal->_path); RELEASE(internal->_port); RELEASE(internal->_queryItems); RELEASE(internal->_scheme); RELEASE(internal->_user); GS_DESTROY_INTERNAL(NSURLComponents); [super dealloc]; } - (id) copyWithZone: (NSZone *)zone { return [[NSURLComponents allocWithZone: zone] initWithURL: [self URL] resolvingAgainstBaseURL: NO]; } // Regenerate URL when components are changed... - (void) _regenerateURL { NSMutableString *urlString; NSString *component; NSUInteger location; NSUInteger len; if (internal->_dirty == NO) { return; } urlString = [[NSMutableString alloc] initWithCapacity: 1000]; location = 0; // Build up the URL from components... if (internal->_scheme != nil) { component = [self scheme]; [urlString appendString: component]; len = [component length]; internal->_rangeOfScheme = NSMakeRange(location, len); [urlString appendString: @"://"]; location += len + 3; } else { internal->_rangeOfScheme = NSMakeRange(NSNotFound, 0); } if (internal->_user != nil) { if (internal->_password != nil) { component = [self percentEncodedUser]; len = [component length]; [urlString appendString: component]; internal->_rangeOfUser = NSMakeRange(location, len); [urlString appendString: @":"]; location += len + 1; component = [self percentEncodedPassword]; len = [component length]; [urlString appendString: component]; internal->_rangeOfUser = NSMakeRange(location, len); [urlString appendString: @"@"]; location += len + 1; } else { component = [self percentEncodedUser]; len = [component length]; [urlString appendString: component]; internal->_rangeOfUser = NSMakeRange(location, len); [urlString appendString: @"@"]; location += len + 1; } } if (internal->_host != nil) { component = [self percentEncodedHost]; len = [component length]; [urlString appendString: component]; internal->_rangeOfHost = NSMakeRange(location, len); location += len; } if (internal->_port != nil) { component = [[self port] stringValue]; len = [component length]; [urlString appendString: @":"]; location += 1; [urlString appendString: component]; internal->_rangeOfPort = NSMakeRange(location, len); location += len; } /* FIXME ... if the path is empty we still need a '/' do we not? */ if (internal->_path != nil) { component = [self percentEncodedPath]; len = [component length]; [urlString appendString: component]; internal->_rangeOfPath = NSMakeRange(location, len); location += len; } if ([internal->_queryItems count] > 0) { component = [self percentEncodedQuery]; len = [component length]; [urlString appendString: @"?"]; location += 1; [urlString appendString: component]; internal->_rangeOfQuery = NSMakeRange(location, len); location += len; } if (internal->_fragment != nil) { component = [self percentEncodedFragment]; len = [component length]; [urlString appendString: @"#"]; location += 1; [urlString appendString: component]; internal->_rangeOfFragment = NSMakeRange(location, len); location += len; } ASSIGNCOPY(internal->_string, urlString); RELEASE(urlString); internal->_dirty = NO; } // Getting the URL - (NSString *) string { [self _regenerateURL]; return internal->_string; } - (void) setString: (NSString *)urlString { NSURL *url = [NSURL URLWithString: urlString]; [self setURL: url]; } - (NSURL *) URL { return AUTORELEASE([[NSURL alloc] initWithScheme: [self scheme] user: [self user] password: [self password] host: [self host] port: [self port] fullPath: [self path] parameterString: nil query: [self percentEncodedQuery] fragment: [self fragment]]); } - (void) setURL: (NSURL *)url { // Set all the components... [self setScheme: [url scheme]]; [self setHost: [url host]]; [self setPort: [url port]]; [self setUser: [url user]]; [self setPassword: [url password]]; [self setPath: [url path]]; [self setPercentEncodedQuery:[url query]]; [self setFragment: [url fragment]]; } - (NSURL *) URLRelativeToURL: (NSURL *)baseURL { return nil; } // Accessing Components in Native Format - (NSString *) fragment { return internal->_fragment; } - (void) setFragment: (NSString *)fragment { ASSIGNCOPY(internal->_fragment, fragment); internal->_dirty = YES; } - (NSString *) host { return internal->_host; } - (void) setHost: (NSString *)host { ASSIGNCOPY(internal->_host, host); internal->_dirty = YES; } - (NSString *) password { return internal->_password; } - (void) setPassword: (NSString *)password { ASSIGNCOPY(internal->_password, password); internal->_dirty = YES; } - (NSString *) path { return internal->_path; } - (void) setPath: (NSString *)path { ASSIGNCOPY(internal->_path, path); internal->_dirty = YES; } - (NSNumber *) port { return internal->_port; } - (void) setPort: (NSNumber *)port { ASSIGNCOPY(internal->_port, port); internal->_dirty = YES; } - (NSString *) query { NSString *result = nil; if (internal->_queryItems != nil) { NSMutableString *query = nil; NSURLQueryItem *item = nil; NSEnumerator *en; en = [internal->_queryItems objectEnumerator]; while ((item = (NSURLQueryItem *)[en nextObject]) != nil) { NSString *name = [item name]; NSString *value = [item value]; if (nil == query) { query = [[NSMutableString alloc] initWithCapacity: 1000]; } else { [query appendString: @"&"]; } [query appendString: name]; if (value != nil) { [query appendString: @"="]; [query appendString: value]; } } if (nil == query) { result = @""; } else { result = AUTORELEASE([query copy]); RELEASE(query); } } return result; } - (void) _setQuery: (NSString *)query fromPercentEncodedString: (BOOL)encoded { /* Parse according to https://developer.apple.com/documentation/foundation/nsurlcomponents/1407752-queryitems?language=objc */ if (nil == query) { [self setQueryItems: nil]; } else if ([query length] == 0) { [self setQueryItems: [NSArray array]]; } else { NSMutableArray *result = [NSMutableArray arrayWithCapacity: 5]; NSArray *items = [query componentsSeparatedByString: @"&"]; NSEnumerator *en = [items objectEnumerator]; id item = nil; while ((item = [en nextObject]) != nil) { NSURLQueryItem *qitem; NSString *name; NSString *value; if ([item length] == 0) { name = @""; value = nil; } else { NSRange r = [item rangeOfString: @"="]; if (0 == r.length) { /* No '=' found in query item. */ name = item; value = nil; } else { name = [item substringToIndex: r.location]; value = [item substringFromIndex: NSMaxRange(r)]; } } if (encoded) { name = [name stringByRemovingPercentEncoding]; value = [value stringByRemovingPercentEncoding]; } qitem = [NSURLQueryItem queryItemWithName: name value: value]; [result addObject: qitem]; } [self setQueryItems: result]; } } - (void) setQuery: (NSString *)query { [self _setQuery: query fromPercentEncodedString: NO]; } - (NSArray *) queryItems { return AUTORELEASE(RETAIN(internal->_queryItems)); } - (void) setQueryItems: (NSArray *)queryItems { ASSIGNCOPY(internal->_queryItems, queryItems); internal->_dirty = YES; } - (NSString *) scheme { return internal->_scheme; } - (void) setScheme: (NSString *)scheme { ASSIGNCOPY(internal->_scheme, scheme); internal->_dirty = YES; } - (NSString *) user { return internal->_user; } - (void) setUser: (NSString *)user { ASSIGNCOPY(internal->_user, user); internal->_dirty = YES; } // Accessing Components in PercentEncoded Format - (NSString *) percentEncodedFragment { return [internal->_fragment stringByAddingPercentEncodingWithAllowedCharacters: [NSCharacterSet URLFragmentAllowedCharacterSet]]; } - (void) setPercentEncodedFragment: (NSString *)fragment { [self setFragment: [fragment stringByRemovingPercentEncoding]]; } - (NSString *) percentEncodedHost { return [internal->_host stringByAddingPercentEncodingWithAllowedCharacters: [NSCharacterSet URLHostAllowedCharacterSet]]; } - (void) setPercentEncodedHost: (NSString *)host { [self setHost: [host stringByRemovingPercentEncoding]]; } - (NSString *) percentEncodedPassword { return [internal->_password stringByAddingPercentEncodingWithAllowedCharacters: [NSCharacterSet URLPasswordAllowedCharacterSet]]; } - (void) setPercentEncodedPassword: (NSString *)password { [self setPassword: [password stringByRemovingPercentEncoding]]; } - (NSString *) percentEncodedPath { return [internal->_path stringByAddingPercentEncodingWithAllowedCharacters: [NSCharacterSet URLPathAllowedCharacterSet]]; } - (void) setPercentEncodedPath: (NSString *)path { [self setPath: [path stringByRemovingPercentEncoding]]; } - (NSString *) percentEncodedQuery { NSString *result = nil; if (internal->_queryItems != nil) { NSMutableString *query = nil; NSURLQueryItem *item = nil; NSEnumerator *en; en = [[self percentEncodedQueryItems] objectEnumerator]; while ((item = (NSURLQueryItem *)[en nextObject]) != nil) { NSString *name = [item name]; NSString *value = [item value]; if (nil == query) { query = [[NSMutableString alloc] initWithCapacity: 1000]; } else { [query appendString: @"&"]; } [query appendString: name]; if (value != nil) { [query appendString: @"="]; [query appendString: value]; } } if (nil == query) { result = @""; } else { result = AUTORELEASE([query copy]); RELEASE(query); } } return result; } - (void) setPercentEncodedQuery: (NSString *)query { [self _setQuery: query fromPercentEncodedString: YES]; } - (NSArray *) percentEncodedQueryItems { NSArray *result = nil; if (internal->_queryItems != nil) { NSMutableArray *items; NSEnumerator *en = [internal->_queryItems objectEnumerator]; NSURLQueryItem *i = nil; items = [[NSMutableArray alloc] initWithCapacity: [internal->_queryItems count]]; while ((i = [en nextObject]) != nil) { NSURLQueryItem *ni; NSString *name = [i name]; NSString *value = [i value]; name = [name stringByAddingPercentEncodingWithAllowedCharacters: queryItemCharSet]; value = [value stringByAddingPercentEncodingWithAllowedCharacters: queryItemCharSet]; ni = [NSURLQueryItem queryItemWithName: name value: value]; [items addObject: ni]; } result = AUTORELEASE([items copy]); RELEASE(items); } return result; } - (void) setPercentEncodedQueryItems: (NSArray *)queryItems { NSMutableArray *items = nil; if (queryItems != nil) { NSEnumerator *en = [queryItems objectEnumerator]; NSURLQueryItem *i = nil; items = [NSMutableArray arrayWithCapacity: [queryItems count]]; while ((i = [en nextObject]) != nil) { NSString *name; NSString *value; NSURLQueryItem *ni; name = [[i name] stringByRemovingPercentEncoding]; value = [[i value] stringByRemovingPercentEncoding]; ni = [NSURLQueryItem queryItemWithName: name value: value]; [items addObject: ni]; } } [self setQueryItems: items]; } - (NSString *) percentEncodedUser { return [internal->_user stringByAddingPercentEncodingWithAllowedCharacters: [NSCharacterSet URLUserAllowedCharacterSet]]; } - (void) setPercentEncodedUser: (NSString *)user { [self setUser: [user stringByRemovingPercentEncoding]]; } // Locating components of the URL string representation - (NSRange) rangeOfFragment { [self _regenerateURL]; return internal->_rangeOfFragment; } - (NSRange) rangeOfHost { [self _regenerateURL]; return internal->_rangeOfHost; } - (NSRange) rangeOfPassword { [self _regenerateURL]; return internal->_rangeOfPassword; } - (NSRange) rangeOfPath { [self _regenerateURL]; return internal->_rangeOfPath; } - (NSRange) rangeOfPort { [self _regenerateURL]; return internal->_rangeOfPort; } - (NSRange) rangeOfQuery { [self _regenerateURL]; return internal->_rangeOfQuery; } - (NSRange) rangeOfScheme { [self _regenerateURL]; return internal->_rangeOfScheme; } - (NSRange) rangeOfUser { [self _regenerateURL]; return internal->_rangeOfUser; } @end gnustep-base-1.29.0/Source/NSURLAuthenticationChallenge.m000066400000000000000000000066061435650067400232460ustar00rootroot00000000000000/* Implementation for NSURLAuthenticationChallenge for GNUstep Copyright (C) 2006 Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 2006 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #define EXPOSE_NSURLAuthenticationChallenge_IVARS 1 #import "GSURLPrivate.h" #import "Foundation/NSError.h" // Internal data storage typedef struct { NSURLProtectionSpace *space; NSURLCredential *credential; int previousFailureCount; NSURLResponse *response; NSError *error; id sender; } Internal; #define this ((Internal*)(self->_NSURLAuthenticationChallengeInternal)) @implementation NSURLAuthenticationChallenge + (id) allocWithZone: (NSZone*)z { NSURLAuthenticationChallenge *o = [super allocWithZone: z]; if (o != nil) { o->_NSURLAuthenticationChallengeInternal = NSZoneCalloc(z, 1, sizeof(Internal)); } return o; } - (void) dealloc { if (this != 0) { RELEASE(this->space); RELEASE(this->credential); RELEASE(this->response); RELEASE(this->error); RELEASE(this->sender); NSZoneFree([self zone], this); } [super dealloc]; } - (NSError *) error { return this->error; } - (NSURLResponse *) failureResponse { return this->response; } - (id) initWithAuthenticationChallenge: (NSURLAuthenticationChallenge *)challenge sender: (id)sender { return [self initWithProtectionSpace: [challenge protectionSpace] proposedCredential: [challenge proposedCredential] previousFailureCount: [challenge previousFailureCount] failureResponse: [challenge failureResponse] error: [challenge error] sender: sender]; } - (id) initWithProtectionSpace: (NSURLProtectionSpace *)space proposedCredential: (NSURLCredential *)credential previousFailureCount: (NSInteger)previousFailureCount failureResponse: (NSURLResponse *)response error: (NSError *)error sender: (id)sender { if ((self = [super init]) != nil) { this->space = [space copy]; this->credential = [credential copy]; this->response = [response copy]; this->error = [error copy]; this->sender = RETAIN(sender); this->previousFailureCount = previousFailureCount; } return self; } - (NSInteger) previousFailureCount { return this->previousFailureCount; } - (NSURLCredential *) proposedCredential { return this->credential; } - (NSURLProtectionSpace *) protectionSpace { return this->space; } - (id) sender { return this->sender; } @end gnustep-base-1.29.0/Source/NSURLCache.m000066400000000000000000000131531435650067400174620ustar00rootroot00000000000000/* Implementation for NSURLCache for GNUstep Copyright (C) 2006 Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 2006 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #if GS_HAVE_NSURLSESSION #import #endif #define EXPOSE_NSURLCache_IVARS 1 #import "GSURLPrivate.h" // FIXME ... locking and disk storage needed typedef struct { unsigned diskCapacity; unsigned memoryCapacity; unsigned diskUsage; unsigned memoryUsage; NSString *path; NSMutableDictionary *memory; } Internal; #define this ((Internal*)(self->_NSURLCacheInternal)) #define inst ((Internal*)(o->_NSURLCacheInternal)) static NSURLCache *shared = nil; @implementation NSURLCache + (id) allocWithZone: (NSZone*)z { NSURLCache *o = [super allocWithZone: z]; if (o != nil) { o->_NSURLCacheInternal = NSZoneCalloc(z, 1, sizeof(Internal)); } return o; } + (void) setSharedURLCache: (NSURLCache *)cache { [gnustep_global_lock lock]; ASSIGN(shared, cache); [gnustep_global_lock unlock]; } - (void) dealloc { if (this != 0) { RELEASE(this->memory); RELEASE(this->path); NSZoneFree([self zone], this); } [super dealloc]; } + (NSURLCache *) sharedURLCache { NSURLCache *c; [gnustep_global_lock lock]; if (shared == nil) { NSString *path = nil; // FIXME user-library-path/Caches/current-app-name shared = [[self alloc] initWithMemoryCapacity: 4 * 1024 * 1024 diskCapacity: 20 * 1024 * 1024 diskPath: path]; } c = RETAIN(shared); [gnustep_global_lock unlock]; return AUTORELEASE(c); } - (NSCachedURLResponse *) cachedResponseForRequest: (NSURLRequest *)request { // FIXME ... handle disk cache return [this->memory objectForKey: request]; } - (NSUInteger) currentDiskUsage { return this->diskUsage; } - (NSUInteger) currentMemoryUsage { return this->memoryUsage; } - (NSUInteger) diskCapacity { return this->diskCapacity; } - (id) initWithMemoryCapacity: (NSUInteger)memoryCapacity diskCapacity: (NSUInteger)diskCapacity diskPath: (NSString *)path { if ((self = [super init]) != nil) { this->diskUsage = 0; this->diskCapacity = diskCapacity; this->memoryUsage = 0; this->memoryCapacity = memoryCapacity; this->path = [path copy]; this->memory = [NSMutableDictionary new]; } return self; } - (NSUInteger) memoryCapacity { return this->memoryCapacity; } - (void) removeAllCachedResponses { // FIXME ... disk storage [this->memory removeAllObjects]; this->diskUsage = 0; this->memoryUsage = 0; } - (void) removeCachedResponseForRequest: (NSURLRequest *)request { NSCachedURLResponse *item = [self cachedResponseForRequest: request]; if (item != nil) { // FIXME ... disk storage this->memoryUsage -= [[item data] length]; [this->memory removeObjectForKey: request]; } } - (void) setDiskCapacity: (NSUInteger)diskCapacity { [self notImplemented: _cmd]; // FIXME } - (void) setMemoryCapacity: (NSUInteger)memoryCapacity { [self notImplemented: _cmd]; // FIXME } - (void) storeCachedResponse: (NSCachedURLResponse *)cachedResponse forRequest: (NSURLRequest *)request { switch ([cachedResponse storagePolicy]) { case NSURLCacheStorageAllowed: // FIXME ... maybe on disk? case NSURLCacheStorageAllowedInMemoryOnly: { unsigned size = [[cachedResponse data] length]; if (size < this->memoryCapacity) { NSCachedURLResponse *old; old = [this->memory objectForKey: request]; if (old != nil) { this->memoryUsage -= [[old data] length]; [this->memory removeObjectForKey: request]; } while (this->memoryUsage + size > this->memoryCapacity) { // FIXME ... should delete least recently used. [self removeCachedResponseForRequest: [[this->memory allKeys] lastObject]]; } [this->memory setObject: cachedResponse forKey: request]; this->memoryUsage += size; } } break; case NSURLCacheStorageNotAllowed: break; default: [NSException raise: NSInternalInconsistencyException format: @"storing cached response with bad policy (%d)", [cachedResponse storagePolicy]]; } } @end #if GS_HAVE_NSURLSESSION @implementation NSURLCache (NSURLSessionTaskAdditions) - (void) storeCachedResponse: (NSCachedURLResponse*)cachedResponse forDataTask: (NSURLSessionDataTask*)dataTask { [self storeCachedResponse: cachedResponse forRequest: [dataTask currentRequest]]; } - (NSCachedURLResponse*) cachedResponseForDataTask: (NSURLSessionDataTask*)dataTask { return [self cachedResponseForRequest: [dataTask currentRequest]]; } - (void) removeCachedResponseForDataTask: (NSURLSessionDataTask*)dataTask { [self removeCachedResponseForRequest: [dataTask currentRequest]]; } @end #endif gnustep-base-1.29.0/Source/NSURLConnection.m000066400000000000000000000305201435650067400205530ustar00rootroot00000000000000/* Implementation for NSURLConnection for GNUstep Copyright (C) 2006 Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 2006 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #define EXPOSE_NSURLConnection_IVARS 1 #import "Foundation/NSError.h" #import "Foundation/NSURLError.h" #import "Foundation/NSRunLoop.h" #import "GSURLPrivate.h" @interface _NSURLConnectionDataCollector : NSObject { NSURLConnection *_connection; // Not retained NSMutableData *_data; NSError *_error; NSURLResponse *_response; BOOL _done; } - (NSData*) data; - (BOOL) done; - (NSError*) error; - (NSURLResponse*) response; - (void) setConnection: (NSURLConnection *)c; @end @implementation _NSURLConnectionDataCollector - (void) dealloc { [_data release]; [_error release]; [_response release]; [super dealloc]; } - (BOOL) done { return _done; } - (NSData*) data { return _data; } - (id) init { if (nil != (self = [super init])) { _data = [NSMutableData new]; // Empty data unless we get an error } return self; } - (NSError*) error { return _error; } - (NSURLResponse*) response { return _response; } - (void) setConnection: (NSURLConnection*)c { _connection = c; // Not retained ... the connection retains us } - (void) connection: (NSURLConnection *)connection didFailWithError: (NSError *)error { ASSIGN(_error, error); DESTROY(_data); // On error, we make the data nil _done = YES; } - (void) connection: (NSURLConnection *)connection didReceiveResponse: (NSURLResponse*)response { ASSIGN(_response, response); } - (void) connectionDidFinishLoading: (NSURLConnection *)connection { _done = YES; } - (void) connection: (NSURLConnection *)connection didReceiveData: (NSData *)data { [_data appendData: data]; } @end typedef struct { NSMutableURLRequest *_request; NSURLProtocol *_protocol; id _delegate; BOOL _debug; } Internal; #define this ((Internal*)(self->_NSURLConnectionInternal)) #define inst ((Internal*)(o->_NSURLConnectionInternal)) @implementation NSURLConnection + (id) allocWithZone: (NSZone*)z { NSURLConnection *o = [super allocWithZone: z]; if (o != nil) { o->_NSURLConnectionInternal = NSZoneCalloc([self zone], 1, sizeof(Internal)); } return o; } + (BOOL) canHandleRequest: (NSURLRequest *)request { return ([NSURLProtocol _classToHandleRequest: request] != nil); } + (NSURLConnection *) connectionWithRequest: (NSURLRequest *)request delegate: (id)delegate { NSURLConnection *o = [self alloc]; o = [o initWithRequest: request delegate: delegate]; return AUTORELEASE(o); } - (void) start { [this->_protocol startLoading]; } - (void) cancel { [this->_protocol stopLoading]; DESTROY(this->_protocol); DESTROY(this->_delegate); } - (id) delegate { return this->_delegate; } - (void) scheduleInRunLoop: (NSRunLoop *)aRunLoop forMode: (NSRunLoopMode)mode { NSArray *modes = [NSArray arrayWithObject: mode]; [aRunLoop performSelector: @selector(start) target: self argument: nil order: 0 modes: modes]; } - (void) unscheduleFromRunLoop: (NSRunLoop *)aRunLoop forMode: (NSRunLoopMode)mode { [aRunLoop cancelPerformSelector: @selector(start) target: self argument: nil]; } - (void) dealloc { if (this != 0) { [self cancel]; DESTROY(this->_request); DESTROY(this->_delegate); NSZoneFree([self zone], this); _NSURLConnectionInternal = 0; } [super dealloc]; } - (void) finalize { if (this != 0) { [self cancel]; } } - (id) initWithRequest: (NSURLRequest *)request delegate: (id)delegate startImmediately: (BOOL)startImmediately { if ((self = [super init]) != nil) { this->_request = [request mutableCopyWithZone: [self zone]]; /* Enrich the request with the appropriate HTTP cookies, * if desired. */ if ([this->_request HTTPShouldHandleCookies] == YES) { NSArray *cookies; cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL: [this->_request URL]]; if ([cookies count] > 0) { NSDictionary *headers; NSEnumerator *enumerator; NSString *header; headers = [NSHTTPCookie requestHeaderFieldsWithCookies: cookies]; enumerator = [headers keyEnumerator]; while (nil != (header = [enumerator nextObject])) { [this->_request addValue: [headers valueForKey: header] forHTTPHeaderField: header]; } } } /* According to bug #35686, Cocoa has a bizarre deviation from the * convention that delegates are retained here. * For compatibility we retain the delegate and release it again * when the operation is over. */ this->_delegate = [delegate retain]; this->_protocol = [[NSURLProtocol alloc] initWithRequest: this->_request cachedResponse: nil client: (id)self]; if (startImmediately == YES) { [this->_protocol startLoading]; } this->_debug = GSDebugSet(@"NSURLConnection"); } return self; } - (id) initWithRequest: (NSURLRequest *)request delegate: (id)delegate { return [self initWithRequest: request delegate: delegate startImmediately: YES]; } @end @implementation NSObject (NSURLConnectionDelegate) - (void) connection: (NSURLConnection *)connection didCancelAuthenticationChallenge: (NSURLAuthenticationChallenge *)challenge { return; } - (void) connection: (NSURLConnection *)connection didFailWithError: (NSError *)error { return; } - (void) connectionDidFinishLoading: (NSURLConnection *)connection { return; } - (void) connection: (NSURLConnection *)connection didReceiveAuthenticationChallenge: (NSURLAuthenticationChallenge *)challenge { if ([challenge proposedCredential] == nil || [challenge previousFailureCount] > 0) { /* continue without a credential if there is no proposed credential * at all or if an authentication failure has already happened. */ [[challenge sender] continueWithoutCredentialForAuthenticationChallenge: challenge]; } } - (void) connection: (NSURLConnection *)connection didReceiveData: (NSData *)data { return; } - (void) connection: (NSURLConnection *)connection didReceiveResponse: (NSURLResponse *)response { return; } - (NSCachedURLResponse *) connection: (NSURLConnection *)connection willCacheResponse: (NSCachedURLResponse *)cachedResponse { return cachedResponse; } - (NSURLRequest *) connection: (NSURLConnection *)connection willSendRequest: (NSURLRequest *)request redirectResponse: (NSURLResponse *)response { return request; } @end @implementation NSURLConnection (NSURLConnectionSynchronousLoading) + (NSData *) sendSynchronousRequest: (NSURLRequest *)request returningResponse: (NSURLResponse **)response error: (NSError **)error { NSData *data = nil; if (0 != response) { *response = nil; } if (0 != error) { *error = nil; } if ([self canHandleRequest: request] == YES) { _NSURLConnectionDataCollector *collector; NSURLConnection *conn; collector = [_NSURLConnectionDataCollector new]; conn = [[self alloc] initWithRequest: request delegate: collector]; if (nil != conn) { NSRunLoop *loop; NSDate *limit; [collector setConnection: conn]; loop = [NSRunLoop currentRunLoop]; limit = [[NSDate alloc] initWithTimeIntervalSinceNow: [request timeoutInterval]]; while ([collector done] == NO && [limit timeIntervalSinceNow] > 0.0) { [loop runMode: NSDefaultRunLoopMode beforeDate: limit]; } [limit release]; if (NO == [collector done]) { data = nil; if (0 != response) { *response = nil; } if (0 != error) { *error = [NSError errorWithDomain: NSURLErrorDomain code: NSURLErrorTimedOut userInfo: nil]; } } else { data = [[[collector data] retain] autorelease]; if (0 != response) { *response = [[[collector response] retain] autorelease]; } if (0 != error) { *error = [[[collector error] retain] autorelease]; } } /* Cancel to prevent the NSURLProtocol instance retaining us. */ [conn cancel]; [conn release]; } [collector release]; } return data; } @end @implementation NSURLConnection (URLProtocolClient) - (void) URLProtocol: (NSURLProtocol *)protocol cachedResponseIsValid: (NSCachedURLResponse *)cachedResponse { return; } - (void) URLProtocol: (NSURLProtocol *)protocol didFailWithError: (NSError *)error { id o = this->_delegate; this->_delegate = nil; [o connection: self didFailWithError: error]; DESTROY(o); } - (void) URLProtocol: (NSURLProtocol *)protocol didLoadData: (NSData *)data { [this->_delegate connection: self didReceiveData: data]; } - (void) URLProtocol: (NSURLProtocol *)protocol didReceiveAuthenticationChallenge: (NSURLAuthenticationChallenge *)challenge { [this->_delegate connection: self didReceiveAuthenticationChallenge: challenge]; } - (void) URLProtocol: (NSURLProtocol *)protocol didReceiveResponse: (NSURLResponse *)response cacheStoragePolicy: (NSURLCacheStoragePolicy)policy { [this->_delegate connection: self didReceiveResponse: response]; if (policy == NSURLCacheStorageAllowed || policy == NSURLCacheStorageAllowedInMemoryOnly) { // FIXME ... cache response here? } } - (void) URLProtocol: (NSURLProtocol *)protocol wasRedirectedToRequest: (NSURLRequest *)request redirectResponse: (NSURLResponse *)redirectResponse { if (this->_debug) { NSLog(@"%@ tell delegate %@ about redirect to %@ as a result of %@", self, this->_delegate, request, redirectResponse); } request = [this->_delegate connection: self willSendRequest: request redirectResponse: redirectResponse]; if (this->_protocol == nil) { if (this->_debug) { NSLog(@"%@ delegate cancelled request", self); } /* Our protocol is nil, so we have been cancelled by the delegate. */ return; } if (request != nil) { if (this->_debug) { NSLog(@"%@ delegate allowed redirect to %@", self, request); } /* Follow the redirect ... stop the old load and start a new one. */ [this->_protocol stopLoading]; DESTROY(this->_protocol); ASSIGNCOPY(this->_request, request); this->_protocol = [[NSURLProtocol alloc] initWithRequest: this->_request cachedResponse: nil client: (id)self]; [this->_protocol startLoading]; } else if (this->_debug) { NSLog(@"%@ delegate cancelled redirect", self); } } - (void) URLProtocolDidFinishLoading: (NSURLProtocol *)protocol { id o = this->_delegate; this->_delegate = nil; [o connectionDidFinishLoading: self]; DESTROY(o); } - (void) URLProtocol: (NSURLProtocol *)protocol didCancelAuthenticationChallenge: (NSURLAuthenticationChallenge *)challenge { [this->_delegate connection: self didCancelAuthenticationChallenge: challenge]; } @end gnustep-base-1.29.0/Source/NSURLCredential.m000066400000000000000000000071361435650067400205350ustar00rootroot00000000000000/* Implementation for NSURLCredential for GNUstep Copyright (C) 2006 Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 2006 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #define EXPOSE_NSURLCredential_IVARS 1 #import "GSURLPrivate.h" // Internal data storage typedef struct { NSString *user; NSString *password; NSURLCredentialPersistence persistence; BOOL hasPassword; } Internal; #define this ((Internal*)(self->_NSURLCredentialInternal)) @implementation NSURLCredential + (id) allocWithZone: (NSZone*)z { NSURLCredential *o = [super allocWithZone: z]; if (o != nil) { o->_NSURLCredentialInternal = NSZoneCalloc(z, 1, sizeof(Internal)); } return o; } + (NSURLCredential *) credentialWithUser: (NSString *)user password: (NSString *)password persistence: (NSURLCredentialPersistence)persistence { NSURLCredential *o = [self alloc]; o = [o initWithUser: user password: password persistence: persistence]; return AUTORELEASE(o); } - (id) copyWithZone: (NSZone*)z { NSURLCredential *o; if (NSShouldRetainWithZone(self, z) == YES) { o = RETAIN(self); } else { o = [[self class] allocWithZone: z]; o = [o initWithUser: this->user password: this->password persistence: this->persistence]; } return o; } - (void) dealloc { if (this != 0) { RELEASE(this->user); RELEASE(this->password); NSZoneFree([self zone], this); } [super dealloc]; } - (BOOL) hasPassword { return this->hasPassword; } - (NSUInteger) hash { return [this->user hash]; } - (id) initWithUser: (NSString *)user password: (NSString *)password persistence: (NSURLCredentialPersistence)persistence { if (user == nil) { DESTROY(self); return nil; } if ((self = [super init]) != nil) { if (persistence == NSURLCredentialPersistenceSynchronizable) { persistence = NSURLCredentialPersistencePermanent; } this->user = [user copy]; this->password = [password copy]; this->persistence = persistence; this->hasPassword = (this->password == nil) ? NO : YES; if (persistence == NSURLCredentialPersistencePermanent) { // FIXME ... should check to see if we really have a password } } return self; } - (BOOL) isEqual: (id)other { if ((id)self == other) { return YES; } if ([other isKindOfClass: [NSURLCredential class]] == NO) { return NO; } return [[(NSURLCredential*)other user] isEqualToString: this->user] && [[(NSURLCredential*)other password] isEqualToString: this->password] && [(NSURLCredential*)other persistence] == this->persistence; } - (NSString *) password { return this->password; } - (NSURLCredentialPersistence) persistence { return this->persistence; } - (NSString *) user { return this->user; } @end gnustep-base-1.29.0/Source/NSURLCredentialStorage.m000066400000000000000000000135631435650067400220630ustar00rootroot00000000000000/* Implementation for NSURLCredentialStorage for GNUstep Copyright (C) 2006 Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 2006 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #define EXPOSE_NSURLCredentialStorage_IVARS 1 #import "GSURLPrivate.h" // Internal data storage typedef struct { NSMutableDictionary *credentials; NSMutableDictionary *defaults; } Internal; #define this ((Internal*)(self->_NSURLCredentialStorageInternal)) @implementation NSURLCredentialStorage static NSURLCredentialStorage *storage = nil; + (id) allocWithZone: (NSZone*)z { return RETAIN([self sharedCredentialStorage]); } + (NSURLCredentialStorage *) sharedCredentialStorage { if (storage == nil) { [gnustep_global_lock lock]; if (storage == nil) { NSURLCredentialStorage *o; o = (NSURLCredentialStorage*) NSAllocateObject(self, 0, NSDefaultMallocZone()); o->_NSURLCredentialStorageInternal = (Internal*) NSZoneCalloc(NSDefaultMallocZone(), 1, sizeof(Internal)); ((Internal*)(o->_NSURLCredentialStorageInternal))->credentials = [NSMutableDictionary new]; ((Internal*)(o->_NSURLCredentialStorageInternal))->defaults = [NSMutableDictionary new]; storage = o; } [gnustep_global_lock unlock]; } return storage; } - (NSDictionary *) allCredentials { NSMutableDictionary *all; NSEnumerator *enumerator; NSURLProtectionSpace *space; all = [NSMutableDictionary dictionaryWithCapacity: [this->credentials count]]; enumerator = [this->credentials keyEnumerator]; while ((space = [enumerator nextObject]) != nil) { NSDictionary *info = [[this->credentials objectForKey: space] copy]; [all setObject: info forKey: space]; RELEASE(info); } return all; } - (NSDictionary *) credentialsForProtectionSpace: (NSURLProtectionSpace *)space { return AUTORELEASE([[this->credentials objectForKey: space] copy]); } - (void) dealloc { [NSException raise: NSInternalInconsistencyException format: @"Attempt to deallocate credential storage"]; GSNOSUPERDEALLOC; } - (NSURLCredential *) defaultCredentialForProtectionSpace: (NSURLProtectionSpace *)space { return [this->defaults objectForKey: space]; } // Should never be called. - (id) init { DESTROY(self); return nil; } - (void) removeCredential: (NSURLCredential *)credential forProtectionSpace: (NSURLProtectionSpace *)space { if (credential == nil || ![credential isKindOfClass: [NSURLCredential class]]) { [NSException raise: NSInvalidArgumentException format: @"[%@-%@] nil or bad class for credential", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; } if (space == nil || ![space isKindOfClass: [NSURLProtectionSpace class]]) { [NSException raise: NSInvalidArgumentException format: @"[%@-%@] nil or bad class for space", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; } [[this->credentials objectForKey: space] removeObjectForKey: [credential user]]; } /** * Sets credential in the storage for the protection space specified.
* This replaces any old value with the same username. */ - (void) setCredential: (NSURLCredential *)credential forProtectionSpace: (NSURLProtectionSpace *)space { NSMutableDictionary *info; if (credential == nil || ![credential isKindOfClass: [NSURLCredential class]]) { [NSException raise: NSInvalidArgumentException format: @"[%@-%@] nil or bad class for credential", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; } if (space == nil || ![space isKindOfClass: [NSURLProtectionSpace class]]) { [NSException raise: NSInvalidArgumentException format: @"[%@-%@] nil or bad class for space", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; } info = [this->credentials objectForKey: space]; if (info == nil) { info = [NSMutableDictionary new]; [this->credentials setObject: info forKey: space]; RELEASE(info); } [info setObject: credential forKey: [credential user]]; } /** * Sets the default credential for the protection space. Also calls * -setCredential:forProtectionSpace: if the credential has not already * been set in space. */ - (void) setDefaultCredential: (NSURLCredential *)credential forProtectionSpace: (NSURLProtectionSpace *)space { if (credential == nil || ![credential isKindOfClass: [NSURLCredential class]]) { [NSException raise: NSInvalidArgumentException format: @"[%@-%@] nil or bad class for credential", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; } if (space == nil || ![space isKindOfClass: [NSURLProtectionSpace class]]) { [NSException raise: NSInvalidArgumentException format: @"[%@-%@] nil or bad class for space", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; } [this->defaults setObject: credential forKey: space]; if ([[this->credentials objectForKey: space] objectForKey: [credential user]] != credential) { [self setCredential: credential forProtectionSpace: space]; } } @end gnustep-base-1.29.0/Source/NSURLDownload.m000066400000000000000000000144761435650067400202370ustar00rootroot00000000000000/* Implementation for NSURLDownload for GNUstep Copyright (C) 2006 Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 2006 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #define EXPOSE_NSURLDownload_IVARS 1 #import "GSURLPrivate.h" @interface GSURLDownload : NSObject { @public NSURLDownload *_parent; // Not retained NSURLRequest *_request; NSURLProtocol *_protocol; NSData *_resumeData; NSString *_path; id _delegate; BOOL _deletesFileUponFailure; BOOL _allowOverwrite; } @end #define this ((GSURLDownload*)(self->_NSURLDownloadInternal)) #define inst ((GSURLDownload*)(o->_NSURLDownloadInternal)) @implementation NSURLDownload + (id) allocWithZone: (NSZone*)z { NSURLDownload *o = [super allocWithZone: z]; if (o != nil) { o->_NSURLDownloadInternal = NSAllocateObject([GSURLDownload class], 0, z); inst->_parent = o; } return o; } + (BOOL) canResumeDownloadDecodedWithEncodingMIMEType: (NSString *)MIMEType { return NO; // FIXME } - (void) dealloc { RELEASE(this); [super dealloc]; } - (void) cancel { [this->_protocol stopLoading]; DESTROY(this->_protocol); // FIXME } - (BOOL) deletesFileUponFailure { return this->_deletesFileUponFailure; } - (id) initWithRequest: (NSURLRequest *)request delegate: (id)delegate { NSData *resumeData = nil; // FIXME ... build resume data from request. return [self initWithResumeData: resumeData delegate: delegate path: nil]; } - (id) initWithResumeData: (NSData *)resumeData delegate: (id)delegate path: (NSString *)path { if ((self = [super init]) != nil) { this->_resumeData = [resumeData copy]; this->_delegate = [delegate retain]; this->_path = [path copy]; // FIXME ... start connection } return self; } - (NSURLRequest *) request { return this->_request; } - (NSData *) resumeData { return nil; // FIXME } - (void) setDeletesFileUponFailure: (BOOL)deletesFileUponFailure { this->_deletesFileUponFailure = deletesFileUponFailure; } - (void) setDestination: (NSString *)path allowOverwrite: (BOOL)allowOverwrite { ASSIGN(this->_path, path); this->_allowOverwrite = allowOverwrite; } @end @implementation NSObject (NSURLDownloadDelegate) - (void) downloadDidBegin: (NSURLDownload *)download { return; } - (void) downloadDidFinish: (NSURLDownload *)download { return; } - (void) download: (NSURLDownload *)download decideDestinationWithSuggestedFilename: (NSString *)filename { return; } - (void) download: (NSURLDownload *)download didCancelAuthenticationChallenge: (NSURLAuthenticationChallenge *)challenge { return; } - (void) download: (NSURLDownload *)download didCreateDestination: (NSString *)path { return; } - (void) download: (NSURLDownload *)download didFailWithError: (NSError *)error { return; } - (void) download: (NSURLDownload *)download didReceiveAuthenticationChallenge: (NSURLAuthenticationChallenge *)challenge { return; } - (void) download: (NSURLDownload *)download didReceiveDataOfLength: (NSUInteger)length { return; } - (void) download: (NSURLDownload *)download didReceiveResponse: (NSURLResponse *)response { return; } - (BOOL) download: (NSURLDownload *)download shouldDecodeSourceDataOfMIMEType: (NSString *)encodingType { return NO; } - (void) download: (NSURLDownload *)download willResumeWithResponse: (NSURLResponse *)response fromByte: (long long)startingByte { return; } - (NSURLRequest *) download: (NSURLDownload *)download willSendRequest: (NSURLRequest *)request redirectResponse: (NSURLResponse *)redirectResponse { return request; } @end @implementation GSURLDownload - (void) dealloc { RELEASE(_protocol); RELEASE(_resumeData); RELEASE(_request); RELEASE(_delegate); RELEASE(_path); [super dealloc]; } - (void) URLProtocol: (NSURLProtocol *)protocol cachedResponseIsValid: (NSCachedURLResponse *)cachedResponse { return; } - (void) URLProtocol: (NSURLProtocol *)protocol didFailWithError: (NSError *)error { [_delegate download: _parent didFailWithError: error]; } - (void) URLProtocol: (NSURLProtocol *)protocol didLoadData: (NSData *)data { return; } - (void) URLProtocol: (NSURLProtocol *)protocol didReceiveAuthenticationChallenge: (NSURLAuthenticationChallenge *)challenge { [_delegate download: _parent didReceiveAuthenticationChallenge: challenge]; } - (void) URLProtocol: (NSURLProtocol *)protocol didReceiveResponse: (NSURLResponse *)response cacheStoragePolicy: (NSURLCacheStoragePolicy)policy { [_delegate download: _parent didReceiveResponse: response]; if (policy == NSURLCacheStorageAllowed || policy == NSURLCacheStorageAllowedInMemoryOnly) { // FIXME ... cache response here } } - (void) URLProtocol: (NSURLProtocol *)protocol wasRedirectedToRequest: (NSURLRequest *)request redirectResponse: (NSURLResponse *)redirectResponse { request = [_delegate download: _parent willSendRequest: request redirectResponse: redirectResponse]; // If we have been cancelled, our protocol will be nil if (_protocol != nil) { if (request == nil) { [_delegate downloadDidFinish: _parent]; } else { DESTROY(_protocol); // FIXME start new request loading } } } - (void) URLProtocolDidFinishLoading: (NSURLProtocol *)protocol { [_delegate downloadDidFinish: _parent]; } - (void) URLProtocol: (NSURLProtocol *)protocol didCancelAuthenticationChallenge: (NSURLAuthenticationChallenge *)challenge { [_delegate download: _parent didCancelAuthenticationChallenge: challenge]; } @end gnustep-base-1.29.0/Source/NSURLHandle.m000066400000000000000000000455051435650067400176600ustar00rootroot00000000000000/** NSURLHandle.m - Class NSURLHandle Copyright (C) 1999 Free Software Foundation, Inc. Written by: Manuel Guesdon Date: Jan 1999 Rewrite by: Richard Frith-Macdonald Date: Sep 2000, June 2002 This file is part of the GNUstep Library. 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 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 USA. NSURLHandle class reference $Date$ $Revision$ */ #import "common.h" #define EXPOSE_NSURLHandle_IVARS 1 #import "GSURLPrivate.h" #import "Foundation/NSURLHandle.h" #import "Foundation/NSRunLoop.h" #import "Foundation/NSFileManager.h" @class GSFTPURLHandle; @interface GSFTPURLHandle : NSObject // Help the compiler @end @class GSHTTPURLHandle; @interface GSHTTPURLHandle : NSObject // Help the compiler @end @interface GSFileURLHandle : NSURLHandle { NSString *_path; NSMutableDictionary *_attributes; } @end /** *

* An NSURLHandle instance is used to manage the resource data * corresponding to an NSURL object. A single NSURLHandle can * be used to manage multiple NSURL objects as long as those * objects all refer to the same resource. *

*

* Different NSURLHandle subclasses are used to manage different * types of URL (usually based on the scheme of the URL), and you * can register new subclasses to extend (or replace) the * standard ones. *

*

* GNUstep comes with private subclasses to handle the common * URL schemes - *

* * * file: (local file I/O) * * * http: and https: (webserver) access. * * * ftp: (FTP server) access. * * */ @implementation NSURLHandle static NSLock *registryLock = nil; static NSMutableArray *registry = nil; static Class NSURLHandleClass = 0; /** * Return a handle for the specified URL from the cache if possible. * If the cache does not contain a matching handle, returns nil. */ + (NSURLHandle*) cachedHandleForURL: (NSURL*)url { /* * Each subclass is supposed to do its own caching, so we must * find the correct subclass and ask it for its cached handle. */ if (self == NSURLHandleClass) { Class c = [self URLHandleClassForURL: url]; if (c == self || c == 0) { return nil; } else { return [c cachedHandleForURL: url]; } } else { [self subclassResponsibility: _cmd]; return nil; } } /** * Implemented by subclasses to say which URLs they can handle. * This method is used to determine which subclasses can be used * to handle a particular URL. */ + (BOOL) canInitWithURL: (NSURL*)url { /* * The semi-abstract base class can't handle ANY scheme */ return NO; } + (void) initialize { if (self == [NSURLHandle class]) { NSURLHandleClass = self; registry = [NSMutableArray new]; [[NSObject leakAt: ®istry] release]; registryLock = [NSLock new]; [[NSObject leakAt: ®istryLock] release]; [self registerURLHandleClass: [GSFileURLHandle class]]; [self registerURLHandleClass: [GSFTPURLHandle class]]; [self registerURLHandleClass: [GSHTTPURLHandle class]]; } } /** * Used to register a subclass as being available to handle URLs. */ + (void) registerURLHandleClass: (Class)urlHandleSubclass { /* * Maintain a registry of classes that handle various schemes * Re-adding a class moves it to the end of the registry - so it will * be used in preference to any class added earlier. */ [registryLock lock]; NS_DURING { [registry removeObjectIdenticalTo: urlHandleSubclass]; [registry addObject: urlHandleSubclass]; } NS_HANDLER { [registryLock unlock]; [localException raise]; } NS_ENDHANDLER [registryLock unlock]; } /** * Returns the most recently registered NSURLHandle subclass that * responds to +canInitWithURL: with YES. * If there is no such subclass, returns nil. */ + (Class) URLHandleClassForURL: (NSURL*)url { unsigned count; Class c = 0; [registryLock lock]; NS_DURING { count = [registry count]; /* * Find a class to handle the URL, try most recently registered first. */ while (count-- > 0) { id found = [registry objectAtIndex: count]; if ([found canInitWithURL: url] == YES) { c = (Class)found; break; // Found it. } } } NS_HANDLER { [registryLock unlock]; [localException raise]; } NS_ENDHANDLER [registryLock unlock]; return c; } /** * Add a client object, making sure that it doesn't occur more than once.
* The client object will receive messages notifying it of events on the handle. */ - (void) addClient: (id )client { id o = client; IF_NO_ARC([o retain];) [_clients removeObjectIdenticalTo: o]; [_clients addObject: o]; IF_NO_ARC([o release];) } /** * Returns the resource data that is currently available for the * handle. This may be a partially loaded resource or may be * empty if no data has been loaded yet or the last load failed. */ - (NSData*) availableResourceData { return AUTORELEASE([_data copy]); } /** * This method should be called when a background load fails.
* The method passes the failure notification to the clients of * the handle - so subclasses should call super's implementation * at the end of their implementation of this method. */ - (void) backgroundLoadDidFailWithReason: (NSString*)reason { NSEnumerator *enumerator = [_clients objectEnumerator]; id client; _status = NSURLHandleLoadFailed; DESTROY(_data); ASSIGNCOPY(_failure, reason); while ((client = [enumerator nextObject]) != nil) { [client URLHandle: self resourceDidFailLoadingWithReason: _failure]; } } /** * This method is called by when a background load begins. * Subclasses should call super's implementation at * the end of their implementation of this method. */ - (void) beginLoadInBackground { _status = NSURLHandleLoadInProgress; DESTROY(_data); _data = [NSMutableData new]; [_clients makeObjectsPerformSelector: @selector(URLHandleResourceDidBeginLoading:) withObject: self]; } /** * This method should be called to cancel a load currently in * progress. The method calls -endLoadInBackground * Subclasses should call super's implementation at * the end of their implementation of this method. */ - (void) cancelLoadInBackground { IF_NO_ARC([self retain];) [_clients makeObjectsPerformSelector: @selector(URLHandleResourceDidCancelLoading:) withObject: self]; [self endLoadInBackground]; IF_NO_ARC(RELEASE(self);) } - (void) dealloc { RELEASE(_data); RELEASE(_failure); RELEASE(_clients); [super dealloc]; } /** * Method called by subclasses during process of loading a resource. * The base class maintains a copy of the data being read in and * accumulates separate parts of the data. */ - (void) didLoadBytes: (NSData*)newData loadComplete: (BOOL)loadComplete { NSEnumerator *enumerator; id client; /* * Let clients know we are starting loading (unless this has already been * done). */ if (_status != NSURLHandleLoadInProgress) { _status = NSURLHandleLoadInProgress; DESTROY(_data); _data = [NSMutableData new]; [_clients makeObjectsPerformSelector: @selector(URLHandleResourceDidBeginLoading:) withObject: self]; } /* * If we have been given nil data, there must have been a failure! */ if (newData == nil) { [self backgroundLoadDidFailWithReason: @"nil data"]; return; } /* * Let clients know we have read some data. */ enumerator = [_clients objectEnumerator]; while ((client = [enumerator nextObject]) != nil) { [client URLHandle: self resourceDataDidBecomeAvailable: newData]; } /* * Accumulate data in cache. */ [_data appendData: newData]; if (loadComplete == YES) { id tmp = _data; _data = [tmp copy]; RELEASE(tmp); /* * Let clients know we have finished loading. */ _status = NSURLHandleLoadSucceeded; [_clients makeObjectsPerformSelector: @selector(URLHandleResourceDidFinishLoading:) withObject: self]; } } /** * This method is called to stop any background loading process. * -cancelLoadInBackground uses this method to cancel loading. * Subclasses should call super's implementation at * the end of their implementation of this method. */ - (void) endLoadInBackground { _status = NSURLHandleNotLoaded; DESTROY(_data); } /** * Returns the failure reason for the last failure to load * the resource data. */ - (NSString*) failureReason { if (_status == NSURLHandleLoadFailed) return _failure; else return nil; } /** * Flushes any cached resource data. */ - (void) flushCachedData { DESTROY(_data); } - (id) init { return [self initWithURL: nil cached: NO]; } /** * Initialises a handle with the specified URL.
* The flag determines whether the handle will cache resource data * and respond to requests from equivalent URLs for the cached data. */ - (id) initWithURL: (NSURL*)url cached: (BOOL)cached { _status = NSURLHandleNotLoaded; _clients = [NSMutableArray new]; return self; } /** * Starts (or queues) loading of the handle's resource data * in the background (asynchronously).
* The default implementation uses loadInForeground - * if this method is not overridden, loadInForeground MUST be. */ - (void) loadInBackground { NSData *d; [self beginLoadInBackground]; d = [self loadInForeground]; if (d == nil) { [self backgroundLoadDidFailWithReason: @"foreground load returned nil"]; } else { [self didLoadBytes: d loadComplete: YES]; } } /** * Loads the handle's resource data in the foreground (synchronously).
* The default implementation starts a background load and waits for * it to complete - * if this method is not overridden, loadInBackground MUST be. */ - (NSData*) loadInForeground { NSRunLoop *loop = [NSRunLoop currentRunLoop]; [self loadInBackground]; while ([self status] == NSURLHandleLoadInProgress) { NSDate *limit; limit = [[NSDate alloc] initWithTimeIntervalSinceNow: 1.0]; [loop runMode: NSDefaultRunLoopMode beforeDate: limit]; RELEASE(limit); } return _data; } /** * Returns the property for the specified key, or nil if the * key does not exist. */ - (id) propertyForKey: (NSString*)propertyKey { [self subclassResponsibility: _cmd]; return nil; } /** * Returns the property for the specified key, but only if the * handle does not need to do any work to retrieve it. */ - (id) propertyForKeyIfAvailable: (NSString*)propertyKey { [self subclassResponsibility: _cmd]; return nil; } /** * Removes an object from them list of clients notified of * resource loading events by the URL handle. */ - (void) removeClient: (id )client { [_clients removeObjectIdenticalTo: client]; } /** * Returns the resource data belonging to the handle. * Calls -loadInForeground if necessary. *

* The GNUstep implementation treats an ftp: request for a * directory as a request to list the names of the directory contents. *

*/ - (NSData*) resourceData { NSData *d = nil; if (NSURLHandleLoadSucceeded == _status) { d = [self availableResourceData]; } if (nil == d && _status != NSURLHandleLoadSucceeded && _status != NSURLHandleLoadFailed) { if (_status == NSURLHandleLoadInProgress) { return nil; } else { d = [self loadInForeground]; if (d != nil) { ASSIGNCOPY(_data, d); } } } return d; } /* Private method ... subclasses override this to enable debug to be * turned off and on. */ - (int) setDebug: (int)aFlag { return 0; } - (void) setReturnAll: (BOOL)flag { return; } - (void) setURL: (NSURL*)newUrl { return; } /** * Returns the current status of the handle. */ - (NSURLHandleStatus) status { return _status; } /** *

* Writes resource data to the handle. Returns YES on success, * NO on failure. *

*

* The GNUstep implementation for file: writes the data * directly to the local filesystem, and the return status reflects * the result of that write operation. *

*

* The GNUstep implementation for http: and https: * sets the specified data as information to be POSTed to the URL next * time it is loaded - so the method always returns YES. *

*

* The GNUstep implementation for ftp: sets the specified data * as information to be written to the URL next time it is loaded - so * the method always returns YES. *

*/ - (BOOL) writeData: (NSData*)data { [self subclassResponsibility: _cmd]; return NO; } /** *

* Sets a property for handle. * Returns YES on success, NO on failure. *

*

* The GNUstep implementation sets the property as a header * to be sent the next time the URL is loaded, and recognizes * some special property keys which control the behavior of * the next load. *

*/ - (BOOL) writeProperty: (id)propertyValue forKey: (NSString*)propertyKey { [self subclassResponsibility: _cmd]; return NO; } @end /** *

* This is a PRIVATE subclass of NSURLHandle. * It is documented here in order to give you information about the * default behavior of an NSURLHandle created to deal with a URL * that has the FILE scheme. The name and/or other * implementation details of this class may be changed at any time. *

*

* A GSFileURLHandle instance is used to manage files on the local * file-system of your machine. *

*/ @implementation GSFileURLHandle static NSMutableDictionary *fileCache = nil; static NSLock *fileLock = nil; + (NSURLHandle*) cachedHandleForURL: (NSURL*)url { NSURLHandle *obj = nil; if ([url isFileURL] == YES) { NSString *path = [url path]; path = [path stringByStandardizingPath]; [fileLock lock]; NS_DURING { obj = [fileCache objectForKey: path]; IF_NO_ARC([[obj retain] autorelease];) } NS_HANDLER { [fileLock unlock]; [localException raise]; } NS_ENDHANDLER [fileLock unlock]; } return obj; } + (BOOL) canInitWithURL: (NSURL*)url { if ([url isFileURL] == YES) { return YES; } return NO; } + (void) initialize { fileCache = [NSMutableDictionary new]; [[NSObject leakAt: &fileCache] release]; fileLock = [NSLock new]; [[NSObject leakAt: &fileLock] release]; } - (NSData*) availableResourceData { if (_data != nil) { NSDictionary *dict; dict = [[NSFileManager defaultManager] fileAttributesAtPath: _path traverseLink: YES]; if (dict == nil) { // File no longer exists. DESTROY(_data); DESTROY(_attributes); } else { NSDate *original; NSDate *latest; original = [_attributes fileModificationDate]; latest = [dict fileModificationDate]; if ([latest earlierDate: original] != latest) { // File has been modified DESTROY(_data); DESTROY(_attributes); _status = NSURLHandleNotLoaded; } } } return [super availableResourceData]; } - (void) dealloc { RELEASE(_path); RELEASE(_attributes); [super dealloc]; } - (id) initWithURL: (NSURL*)url cached: (BOOL)cached { NSString *path; if ([url isFileURL] == NO) { NSLog(@"Attempt to init GSFileURLHandle with bad URL"); DESTROY(self); return nil; } path = [url path]; path = [path stringByStandardizingPath]; if (cached == YES) { id obj; [fileLock lock]; NS_DURING { obj = [fileCache objectForKey: path]; if (obj != nil) { DESTROY(self); IF_NO_ARC([obj retain];) } } NS_HANDLER { obj = nil; [fileLock unlock]; [localException raise]; } NS_ENDHANDLER [fileLock unlock]; if (obj != nil) { return obj; } } if ((self = [super initWithURL: url cached: cached]) != nil) { _path = [path copy]; if (cached == YES) { [fileLock lock]; NS_DURING { [fileCache setObject: self forKey: _path]; } NS_HANDLER { [fileLock unlock]; [localException raise]; } NS_ENDHANDLER [fileLock unlock]; } } return self; } - (NSData*) loadInForeground { NSData *d = [NSData dataWithContentsOfFile: _path]; NSDictionary *dict; dict = [[NSFileManager defaultManager] fileAttributesAtPath: _path traverseLink: YES]; RELEASE(_attributes); _attributes = [dict mutableCopy]; [self didLoadBytes: d loadComplete: YES]; return d; } /** * Gets file attribute information for the file represented by * the handle, using the same dictionary keys as the * NSFileManager class. */ - (id) propertyForKey: (NSString*)propertyKey { NSDictionary *dict; dict = [[NSFileManager defaultManager] fileAttributesAtPath: _path traverseLink: YES]; RELEASE(_attributes); _attributes = [dict mutableCopy]; return [_attributes objectForKey: propertyKey]; } - (id) propertyForKeyIfAvailable: (NSString*)propertyKey { return [_attributes objectForKey: propertyKey]; } - (int) setDebug: (int)flag { return 0; } - (void) setReturnAll: (BOOL)flag { return; } - (void) setURL: (NSURL*)newUrl { return; } /** * Writes the specified data as the contents of the file * represented by the handle. */ - (BOOL) writeData: (NSData*)data { if ([data writeToFile: _path atomically: YES] == YES) { ASSIGNCOPY(_data, data); return YES; } return NO; } /** * Changes the attributes of the file represented by this handle. * This method uses the same dictionary keys as the * NSFileManger class. */ - (BOOL) writeProperty: (id)propertyValue forKey: (NSString*)propertyKey { if ([self propertyForKey: propertyKey] == nil) { return NO; /* Not a valid file property key. */ } [_attributes setObject: propertyValue forKey: propertyKey]; return [[NSFileManager defaultManager] changeFileAttributes: _attributes atPath: _path]; } @end gnustep-base-1.29.0/Source/NSURLProtectionSpace.m000066400000000000000000000157141435650067400215660ustar00rootroot00000000000000/* Implementation for NSURLProtectionSpace for GNUstep Copyright (C) 2006 Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 2006 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #define EXPOSE_NSURLProtectionSpace_IVARS 1 #import "GSURLPrivate.h" #import "GNUstepBase/NSURL+GNUstepBase.h" // Internal data storage typedef struct { NSString *host; int port; NSString *protocol; NSString *realm; NSString *proxyType; // Not retained NSString *authenticationMethod; // Not retained BOOL isProxy; } Internal; #define this ((Internal*)(self->_NSURLProtectionSpaceInternal)) #define inst ((Internal*)(o->_NSURLProtectionSpaceInternal)) @implementation NSURLProtectionSpace + (id) allocWithZone: (NSZone*)z { NSURLProtectionSpace *o = [super allocWithZone: z]; if (o != nil) { o->_NSURLProtectionSpaceInternal = NSZoneCalloc(z, 1, sizeof(Internal)); } return o; } - (NSString *) authenticationMethod { return this->authenticationMethod; } - (id) copyWithZone: (NSZone*)z { if (NSShouldRetainWithZone(self, z) == YES) { return RETAIN(self); } else { NSURLProtectionSpace *o = [[self class] allocWithZone: z]; o = [o initWithHost: this->host port: this->port protocol: this->protocol realm: this->realm authenticationMethod: this->authenticationMethod]; if (o != nil) { inst->isProxy = this->isProxy; inst->proxyType = this->proxyType; } return o; } } - (void) dealloc { if (this != 0) { RELEASE(this->host); RELEASE(this->protocol); RELEASE(this->realm); NSZoneFree([self zone], this); } [super dealloc]; } - (NSUInteger) hash { return [[self host] hash] + [self port] + [[self realm] hash] + [[self protocol] hash] + (uintptr_t)this->proxyType + (uintptr_t)this->authenticationMethod; } - (NSString *) host { return this->host; } - (id) initWithHost: (NSString *)host port: (NSInteger)port protocol: (NSString *)protocol realm: (NSString *)realm authenticationMethod: (NSString *)authenticationMethod { if ((self = [super init]) != nil) { this->host = [host copy]; this->protocol = [protocol copy]; this->realm = [realm copy]; if ([authenticationMethod isEqualToString: NSURLAuthenticationMethodHTMLForm] == YES) { this->authenticationMethod = NSURLAuthenticationMethodHTMLForm; } else if ([authenticationMethod isEqualToString: NSURLAuthenticationMethodHTTPBasic] == YES) { this->authenticationMethod = NSURLAuthenticationMethodHTTPBasic; } else if ([authenticationMethod isEqualToString: NSURLAuthenticationMethodHTTPDigest] == YES) { this->authenticationMethod = NSURLAuthenticationMethodHTTPDigest; } else if ([authenticationMethod isEqualToString: NSURLAuthenticationMethodNTLM] == YES) { this->authenticationMethod = NSURLAuthenticationMethodNTLM; } else if ([authenticationMethod isEqualToString: NSURLAuthenticationMethodNegotiate] == YES) { this->authenticationMethod = NSURLAuthenticationMethodNegotiate; } else if ([authenticationMethod isEqualToString: NSURLAuthenticationMethodClientCertificate] == YES) { this->authenticationMethod = NSURLAuthenticationMethodClientCertificate; } else if ([authenticationMethod isEqualToString: NSURLAuthenticationMethodServerTrust] == YES) { this->authenticationMethod = NSURLAuthenticationMethodServerTrust; } else { this->authenticationMethod = NSURLAuthenticationMethodDefault; } this->port = port; this->proxyType = nil; this->isProxy = NO; } return self; } - (id) initWithProxyHost: (NSString *)host port: (NSInteger)port type: (NSString *)type realm: (NSString *)realm authenticationMethod: (NSString *)authenticationMethod { self = [self initWithHost: host port: port protocol: nil realm: realm authenticationMethod: authenticationMethod]; if (self != nil) { this->isProxy = YES; if ([type isEqualToString: NSURLProtectionSpaceFTPProxy] == YES) { this->proxyType = NSURLProtectionSpaceFTPProxy; } else if ([type isEqualToString: NSURLProtectionSpaceHTTPProxy] == YES) { this->proxyType = NSURLProtectionSpaceHTTPProxy; } else if ([type isEqualToString: NSURLProtectionSpaceHTTPSProxy] == YES) { this->proxyType = NSURLProtectionSpaceHTTPSProxy; } else if ([type isEqualToString: NSURLProtectionSpaceSOCKSProxy] == YES) { this->proxyType = NSURLProtectionSpaceSOCKSProxy; } else { DESTROY(self); // Bad proxy type. } } return self; } - (BOOL) isEqual: (id)other { if ((id)self == other) { return YES; } if ([other isKindOfClass: [NSURLProtectionSpace class]] == NO) { return NO; } else { NSURLProtectionSpace *o = (NSURLProtectionSpace*)other; if ([[self host] isEqual: [o host]] == NO) { return NO; } if ([[self realm] isEqual: [o realm]] == NO) { return NO; } if ([self port] != [o port]) { return NO; } if ([[self authenticationMethod] isEqual: [o authenticationMethod]] == NO) { return NO; } if ([self isProxy] == YES) { if ([o isProxy] == NO || [[self proxyType] isEqual: [o proxyType]] == NO) { return NO; } } else { if ([o isProxy] == YES || [[self protocol] isEqual: [o protocol]] == NO) { return NO; } } return YES; } } - (BOOL) isProxy { return this->isProxy; } - (NSInteger) port { return this->port; } - (NSString *) protocol { return this->protocol; } - (NSString *) proxyType { return this->proxyType; } - (NSString *) realm { return this->realm; } - (BOOL) receivesCredentialSecurely { if (this->authenticationMethod == NSURLAuthenticationMethodHTTPDigest) { return YES; } if (this->isProxy) { if (this->proxyType == NSURLProtectionSpaceHTTPSProxy) { return YES; } } else { if ([this->protocol isEqual: @"https"] == YES) { return YES; } } return NO; } - (NSArray *) distinguishedNames { return nil; } @end gnustep-base-1.29.0/Source/NSURLProtocol.m000066400000000000000000001547621435650067400202740ustar00rootroot00000000000000/* Implementation for NSURLProtocol for GNUstep Copyright (C) 2006 Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 2006 Parts (FTP and About in particular) based on later code by Nikolaus Schaller This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" //#define EXPOSE_NSURLProtocol_IVARS 1 #import "Foundation/NSError.h" #import "Foundation/NSHost.h" #import "Foundation/NSNotification.h" #import "Foundation/NSRunLoop.h" #import "Foundation/NSValue.h" #if GS_HAVE_NSURLSESSION #import "Foundation/NSURLSession.h" #else @class NSURLSessionTask; #endif #import "GSPrivate.h" #import "GSURLPrivate.h" #import "GNUstepBase/GSMime.h" #import "GNUstepBase/GSTLS.h" #import "GNUstepBase/NSData+GNUstepBase.h" #import "GNUstepBase/NSStream+GNUstepBase.h" #import "GNUstepBase/NSString+GNUstepBase.h" #import "GNUstepBase/NSURL+GNUstepBase.h" @interface GSMimeHeader (HTTPRequest) - (void) addToBuffer: (NSMutableData*)buf masking: (NSMutableData**)masked; @end /* Define to 1 for experimental (net yet working) compression support */ #ifdef USE_ZLIB # undef USE_ZLIB #endif #define USE_ZLIB 0 #if USE_ZLIB #if defined(HAVE_ZLIB_H) #include static void* zalloc(void *opaque, unsigned nitems, unsigned size) { return calloc(nitems, size); } static void zfree(void *opaque, void *mem) { free(mem); } #else # undef USE_ZLIB # define USE_ZLIB 0 #endif #endif @interface NSURLProtocol (Debug) - (NSString*) in; - (NSString*) out; @end static void debugRead(id handle, int len, const unsigned char *ptr) { int pos; uint8_t *hex; NSUInteger hl; hl = ((len + 2) / 3) * 4; hex = malloc(hl + 1); hex[hl] = '\0'; GSPrivateEncodeBase64(ptr, (NSUInteger)len, hex); for (pos = 0; pos < len; pos++) { if (0 == ptr[pos]) { NSData *data; char *esc; data = [[NSData alloc] initWithBytesNoCopy: (void*)ptr length: len freeWhenDone: NO]; esc = [data escapedRepresentation: 0]; NSLog(@"Read for %p %@ of %d bytes (escaped) - '%s'\n<[%s]>", handle, [handle in], len, esc, hex); free(esc); RELEASE(data); free(hex); return; } } NSLog(@"Read for %p %@ of %d bytes - '%*.*s'\n<[%s]>", handle, [handle in], len, len, len, ptr, hex); free(hex); } static void debugWrite(id handle, int len, const unsigned char *ptr) { int pos; uint8_t *hex; NSUInteger hl; hl = ((len + 2) / 3) * 4; hex = malloc(hl + 1); hex[hl] = '\0'; GSPrivateEncodeBase64(ptr, (NSUInteger)len, hex); for (pos = 0; pos < len; pos++) { if (0 == ptr[pos]) { NSData *data; char *esc; data = [[NSData alloc] initWithBytesNoCopy: (void*)ptr length: len freeWhenDone: NO]; esc = [data escapedRepresentation: 0]; NSLog(@"Write for %p %@ of %d bytes (escaped) - '%s'\n<[%s]>", handle, [handle out], len, esc, hex); free(esc); RELEASE(data); free(hex); return; } } NSLog(@"Write for %p %@ of %d bytes - '%*.*s'\n<[%s]>", handle, [handle out], len, len, len, ptr, hex); free(hex); } @interface GSSocketStreamPair : NSObject { NSInputStream *ip; NSOutputStream *op; NSHost *host; uint16_t port; NSDate *expires; BOOL ssl; } + (void) purge: (NSNotification*)n; - (void) cache: (NSDate*)when; - (void) close; - (NSDate*) expires; - (id) initWithHost: (NSHost*)h port: (uint16_t)p forSSL: (BOOL)s; - (NSInputStream*) inputStream; - (NSOutputStream*) outputStream; @end @implementation GSSocketStreamPair static NSMutableArray *pairCache = nil; static NSLock *pairLock = nil; + (void) initialize { if (pairCache == nil) { /* No use trying to use a dictionary ... NSHost objects all hash * to the same value. */ pairCache = [NSMutableArray new]; [[NSObject leakAt: &pairCache] release]; pairLock = [NSLock new]; [[NSObject leakAt: &pairLock] release]; /* Purge expired pairs at intervals. */ [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(purge:) name: @"GSHousekeeping" object: nil]; } } + (void) purge: (NSNotification*)n { NSDate *now = [NSDate date]; unsigned count; [pairLock lock]; count = [pairCache count]; while (count-- > 0) { GSSocketStreamPair *p = [pairCache objectAtIndex: count]; if ([[p expires] timeIntervalSinceDate: now] <= 0.0) { [pairCache removeObjectAtIndex: count]; } } [pairLock unlock]; } - (void) cache: (NSDate*)when { NSTimeInterval ti = [when timeIntervalSinceNow]; if (ti <= 0.0) { [self close]; return; } NSAssert(ip != nil, NSGenericException); if (ti > 120.0) { ASSIGN(expires, [NSDate dateWithTimeIntervalSinceNow: 120.0]); } else { ASSIGN(expires, when); } [pairLock lock]; [pairCache addObject: self]; [pairLock unlock]; } - (void) close { [ip setDelegate: nil]; [op setDelegate: nil]; [ip removeFromRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode]; [op removeFromRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode]; [ip close]; [op close]; DESTROY(ip); DESTROY(op); } - (void) dealloc { [self close]; DESTROY(host); DESTROY(expires); [super dealloc]; } - (NSDate*) expires { return expires; } - (id) init { DESTROY(self); return nil; } - (id) initWithHost: (NSHost*)h port: (uint16_t)p forSSL: (BOOL)s; { unsigned count; NSDate *now; now = [NSDate date]; [pairLock lock]; count = [pairCache count]; while (count-- > 0) { GSSocketStreamPair *pair = [pairCache objectAtIndex: count]; if ([pair->expires timeIntervalSinceDate: now] <= 0.0) { [pairCache removeObjectAtIndex: count]; } else if (pair->port == p && pair->ssl == s && [pair->host isEqual: h]) { /* Found a match ... remove from cache and return as self. */ DESTROY(self); self = [pair retain]; [pairCache removeObjectAtIndex: count]; [pairLock unlock]; return self; } } [pairLock unlock]; if ((self = [super init]) != nil) { [NSStream getStreamsToHost: host port: port inputStream: &ip outputStream: &op]; if (ip == nil || op == nil) { DESTROY(self); return nil; } ssl = s; port = p; host = [h retain]; [ip retain]; [op retain]; if (ssl == YES) { [ip setProperty: NSStreamSocketSecurityLevelNegotiatedSSL forKey: NSStreamSocketSecurityLevelKey]; [op setProperty: NSStreamSocketSecurityLevelNegotiatedSSL forKey: NSStreamSocketSecurityLevelKey]; } } return self; } - (NSInputStream*) inputStream { return ip; } - (NSOutputStream*) outputStream { return op; } @end @interface _NSAboutURLProtocol : NSURLProtocol @end @interface _NSFTPURLProtocol : NSURLProtocol @end @interface _NSFileURLProtocol : NSURLProtocol @end @interface _NSHTTPURLProtocol : NSURLProtocol { GSMimeParser *_parser; // Parser handling incoming data unsigned _parseOffset; // Bytes of body loaded in parser. float _version; // The HTTP version in use. int _statusCode; // The HTTP status code returned. NSInputStream *_body; // for sending the body unsigned _writeOffset; // Request bytes written so far NSData *_writeData; // Request data to write NSData *_masked; // Request masked data BOOL _complete; BOOL _debug; BOOL _isLoading; BOOL _shouldClose; NSURLAuthenticationChallenge *_challenge; NSURLCredential *_credential; NSHTTPURLResponse *_response; id _logDelegate; } @end @interface _NSHTTPSURLProtocol : _NSHTTPURLProtocol @end @interface _NSDataURLProtocol : NSURLProtocol @end static NSMutableArray *registered = nil; static NSLock *regLock = nil; static Class abstractClass = nil; static Class placeholderClass = nil; static NSURLProtocol *placeholder = nil; @interface NSURLProtocolPlaceholder : NSURLProtocol @end @implementation NSURLProtocolPlaceholder - (void) dealloc { if (self == placeholder) { [self retain]; return; } [super dealloc]; } - (oneway void) release { /* In a multi-threaded environment we could have two threads release the * class at the same time ... causing -dealloc to be called twice at the * same time, so that we can get an exception as we try to decrement the * retain count beyond zero. To avoid this we make the placeholder be a * subclass whose -retain method prevents us even calling -dealoc in any * normal circumstances. */ return; } @end @implementation NSURLProtocol #if GS_NONFRAGILE { @protected #else // Internal data storage typedef struct { #endif NSInputStream *input; NSOutputStream *output; NSCachedURLResponse *cachedResponse; id client; NSURLRequest *request; NSURLSessionTask *task; NSString *in; NSString *out; #if USE_ZLIB z_stream z; // context for decompress BOOL compressing; // are we compressing? BOOL decompressing; // are we decompressing? NSData *compressed; // only partially decompressed #endif #if GS_NONFRAGILE } #define this self #define inst o #else } Internal; #define this ((Internal*)(self->_NSURLProtocolInternal)) #define inst ((Internal*)(o->_NSURLProtocolInternal)) #endif + (id) allocWithZone: (NSZone*)z { NSURLProtocol *o; if ((self == abstractClass) && (z == 0 || z == NSDefaultMallocZone())) { /* Return a default placeholder instance to avoid the overhead of * creating and destroying instances of the abstract class. */ o = placeholder; } else { /* Create and return an instance of the concrete subclass. */ o = (NSURLProtocol*)NSAllocateObject(self, 0, z); } return o; } + (void) initialize { if (registered == nil) { abstractClass = [NSURLProtocol class]; placeholderClass = [NSURLProtocolPlaceholder class]; placeholder = (NSURLProtocol*)NSAllocateObject(placeholderClass, 0, NSDefaultMallocZone()); [[NSObject leakAt: &placeholder] release]; registered = [NSMutableArray new]; [[NSObject leakAt: ®istered] release]; regLock = [NSLock new]; [[NSObject leakAt: ®Lock] release]; [self registerClass: [_NSHTTPURLProtocol class]]; [self registerClass: [_NSHTTPSURLProtocol class]]; [self registerClass: [_NSFTPURLProtocol class]]; [self registerClass: [_NSFileURLProtocol class]]; [self registerClass: [_NSAboutURLProtocol class]]; [self registerClass: [_NSDataURLProtocol class]]; } } + (id) propertyForKey: (NSString *)key inRequest: (NSURLRequest *)request { return [request _propertyForKey: key]; } + (BOOL) registerClass: (Class)protocolClass { if ([protocolClass isSubclassOfClass: [NSURLProtocol class]] == YES) { [regLock lock]; [registered addObject: protocolClass]; [regLock unlock]; return YES; } return NO; } + (void) setProperty: (id)value forKey: (NSString *)key inRequest: (NSMutableURLRequest *)request { [request _setProperty: value forKey: key]; } + (void) unregisterClass: (Class)protocolClass { [regLock lock]; [registered removeObjectIdenticalTo: protocolClass]; [regLock unlock]; } - (NSCachedURLResponse *) cachedResponse { return this->cachedResponse; } - (id ) client { return this->client; } - (void) dealloc { if (this != 0) { if (this->input != nil) { [this->input setDelegate: nil]; [this->output setDelegate: nil]; [this->input removeFromRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode]; [this->output removeFromRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode]; [this->input close]; [this->output close]; DESTROY(this->input); DESTROY(this->output); DESTROY(this->in); DESTROY(this->out); } DESTROY(this->cachedResponse); DESTROY(this->request); #if GS_HAVE_NSURLSESSION DESTROY(this->task); #endif DESTROY(this->client); #if USE_ZLIB if (this->compressing == YES) { deflateEnd(&this->z); } else if (this->decompressing == YES) { inflateEnd(&this->z); } DESTROY(this->compressed); #endif #if !GS_NONFRAGILE NSZoneFree([self zone], this); _NSURLProtocolInternal = 0; #endif } [super dealloc]; } - (NSString*) description { return [NSString stringWithFormat:@"%@ %@", [super description], this ? (id)this->request : nil]; } - (id) init { if ((self = [super init]) != nil) { #if !GS_NONFRAGILE Class c = object_getClass(self); if (c != abstractClass && c != placeholderClass) { _NSURLProtocolInternal = NSZoneCalloc([self zone], 1, sizeof(Internal)); } #endif } return self; } - (id) initWithRequest: (NSURLRequest*)_request cachedResponse: (NSCachedURLResponse*)_cachedResponse client: (id )_client { Class c = object_getClass(self); if (c == abstractClass || c == placeholderClass) { unsigned count; DESTROY(self); [regLock lock]; count = [registered count]; while (count-- > 0) { Class proto = [registered objectAtIndex: count]; if ([proto canInitWithRequest: _request] == YES) { self = [proto alloc]; break; } } [regLock unlock]; return [self initWithRequest: _request cachedResponse: _cachedResponse client: _client]; } if ((self = [self init]) != nil) { this->request = [_request copy]; this->cachedResponse = RETAIN(_cachedResponse); if (nil == _client) { _client = [[self class] _ProtocolClient]; } this->client = RETAIN(_client); } return self; } - (instancetype) initWithTask: (NSURLSessionTask*)_task cachedResponse: (NSCachedURLResponse*)_cachedResponse client: (id)_client { #if GS_HAVE_NSURLSESSION if (nil != (self = [self initWithRequest: [_task currentRequest] cachedResponse: _cachedResponse client: _client])) { ASSIGN(this->task, _task); } #else DESTROY(self); #endif return self; } - (NSURLRequest *) request { return this->request; } - (NSURLSessionTask*) task { return this->task; } @end @implementation NSURLProtocol (Debug) - (NSString*) in { return (this) ? (this->in) : nil; } - (NSString*) out { return (this) ? (this->out) : nil; } @end @implementation NSURLProtocol (Private) + (Class) _classToHandleRequest:(NSURLRequest *)request { Class protoClass = nil; int count; [regLock lock]; count = [registered count]; while (count-- > 0) { Class proto = [registered objectAtIndex: count]; if ([proto canInitWithRequest: request] == YES) { protoClass = proto; break; } } [regLock unlock]; return protoClass; } /* Internal method to return a client to handle callbacks if the protocol * is initialised without one. */ + (id) _ProtocolClient { return nil; } @end @implementation NSURLProtocol (Subclassing) + (BOOL) canInitWithRequest: (NSURLRequest *)request { [self subclassResponsibility: _cmd]; return NO; } + (NSURLRequest *) canonicalRequestForRequest: (NSURLRequest *)request { return request; } + (BOOL) requestIsCacheEquivalent: (NSURLRequest *)a toRequest: (NSURLRequest *)b { a = [self canonicalRequestForRequest: a]; b = [self canonicalRequestForRequest: b]; return [a isEqual: b]; } - (void) startLoading { [self subclassResponsibility: _cmd]; } - (void) stopLoading { [self subclassResponsibility: _cmd]; } @end @implementation _NSHTTPURLProtocol + (BOOL) canInitWithRequest: (NSURLRequest*)request { return [[[request URL] scheme] isEqualToString: @"http"]; } + (NSURLRequest*) canonicalRequestForRequest: (NSURLRequest*)request { return request; } - (void) cancelAuthenticationChallenge: (NSURLAuthenticationChallenge*)c { if (c == _challenge) { DESTROY(_challenge); // We should cancel the download } } - (void) continueWithoutCredentialForAuthenticationChallenge: (NSURLAuthenticationChallenge*)c { if (c == _challenge) { DESTROY(_credential); // We download the challenge page } } - (void) dealloc { [_parser release]; // received headers [_body release]; // for sending the body [_response release]; [_credential release]; DESTROY(_writeData); DESTROY(_masked); [super dealloc]; } - (void) startLoading { static NSDictionary *methods = nil; _debug = GSDebugSet(@"NSURLProtocol"); if (YES == [this->request _debug]) { _debug = YES; } if (_debug) { _logDelegate = [this->request _debugLogDelegate]; } if (methods == nil) { methods = [[NSDictionary alloc] initWithObjectsAndKeys: self, @"HEAD", self, @"GET", self, @"POST", self, @"PUT", self, @"DELETE", self, @"TRACE", self, @"OPTIONS", self, @"CONNECT", nil]; } if ([methods objectForKey: [this->request HTTPMethod]] == nil) { NSLog(@"Invalid HTTP Method: %@", this->request); [self stopLoading]; [this->client URLProtocol: self didFailWithError: [NSError errorWithDomain: @"Invalid HTTP Method" code: 0 userInfo: nil]]; return; } if (_isLoading == YES) { NSLog(@"startLoading when load in progress"); return; } _statusCode = 0; /* No status returned yet. */ _isLoading = YES; _complete = NO; /* Perform a redirect if the path is empty. * As per MacOs-X documentation. */ if ([[[this->request URL] fullPath] length] == 0) { NSString *s = [[this->request URL] absoluteString]; NSURL *url; if ([s rangeOfString: @"?"].length > 0) { s = [s stringByReplacingString: @"?" withString: @"/?"]; } else if ([s rangeOfString: @"#"].length > 0) { s = [s stringByReplacingString: @"#" withString: @"/#"]; } else { s = [s stringByAppendingString: @"/"]; } url = [NSURL URLWithString: s]; if (url == nil) { NSError *e; e = [NSError errorWithDomain: @"Invalid redirect request" code: 0 userInfo: nil]; [self stopLoading]; [this->client URLProtocol: self didFailWithError: e]; } else { NSMutableURLRequest *r; r = [[this->request mutableCopy] autorelease]; [r setURL: url]; [this->client URLProtocol: self wasRedirectedToRequest: r redirectResponse: nil]; } if (NO == _isLoading) { return; // Loading cancelled } if (nil != this->input) { return; // Following redirection } // Fall through to continue original connect. } if (0 && this->cachedResponse) { } else { NSURL *url = [this->request URL]; NSHost *host = [NSHost hostWithName: [url host]]; int port = [[url port] intValue]; _parseOffset = 0; DESTROY(_parser); if (host == nil) { host = [NSHost hostWithAddress: [url host]]; // try dotted notation } if (host == nil) { host = [NSHost hostWithAddress: @"127.0.0.1"]; // final default } if (port == 0) { // default if not specified port = [[url scheme] isEqualToString: @"https"] ? 443 : 80; } [NSStream getStreamsToHost: host port: port inputStream: &this->input outputStream: &this->output]; if (!this->input || !this->output) { if (_debug == YES) { NSLog(@"%@ did not create streams for %@:%@", self, host, [url port]); } [self stopLoading]; [this->client URLProtocol: self didFailWithError: [NSError errorWithDomain: @"can't connect" code: 0 userInfo: [NSDictionary dictionaryWithObjectsAndKeys: url, @"NSErrorFailingURLKey", host, @"NSErrorFailingURLStringKey", @"can't find host", @"NSLocalizedDescription", nil]]]; return; } [this->input retain]; [this->output retain]; if ([[url scheme] isEqualToString: @"https"] == YES) { static NSArray *keys; NSUInteger count; [this->input setProperty: NSStreamSocketSecurityLevelNegotiatedSSL forKey: NSStreamSocketSecurityLevelKey]; [this->output setProperty: NSStreamSocketSecurityLevelNegotiatedSSL forKey: NSStreamSocketSecurityLevelKey]; if (nil == keys) { keys = [[NSArray alloc] initWithObjects: GSTLSCAFile, GSTLSCertificateFile, GSTLSCertificateKeyFile, GSTLSCertificateKeyPassword, GSTLSDebug, GSTLSIssuers, GSTLSOwners, GSTLSPriority, GSTLSRemoteHosts, GSTLSRevokeFile, GSTLSServerName, GSTLSVerify, nil]; } count = [keys count]; while (count-- > 0) { NSString *key = [keys objectAtIndex: count]; NSString *str = [this->request _propertyForKey: key]; if (nil != str) { [this->output setProperty: str forKey: key]; } } /* If there is no value set for the server name, and the host in the * URL is a domain name rather than an address, we use that. */ if (nil == [this->output propertyForKey: GSTLSServerName]) { NSString *host = [url host]; unichar c; c = [host length] == 0 ? 0 : [host characterAtIndex: 0]; if (c != 0 && c != ':' && !isdigit(c)) { [this->output setProperty: host forKey: GSTLSServerName]; } } if (_debug) [this->output setProperty: @"YES" forKey: GSTLSDebug]; } [this->input setDelegate: self]; [this->output setDelegate: self]; [this->input scheduleInRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode]; [this->output scheduleInRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode]; [this->input open]; [this->output open]; } } - (void) stopLoading { if (_debug == YES) { NSLog(@"%@ stopLoading", self); } _isLoading = NO; DESTROY(_writeData); DESTROY(_masked); if (this->input != nil) { [this->input setDelegate: nil]; [this->output setDelegate: nil]; [this->input removeFromRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode]; [this->output removeFromRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode]; [this->input close]; [this->output close]; DESTROY(this->input); DESTROY(this->output); } } - (void) _didLoad: (NSData*)d { [this->client URLProtocol: self didLoadData: d]; } - (void) _got: (NSStream*)stream { unsigned char buffer[BUFSIZ*64]; int readCount; NSError *e; NSData *d; BOOL wasInHeaders = NO; readCount = [(NSInputStream *)stream read: buffer maxLength: sizeof(buffer)]; if (readCount < 0) { if ([stream streamStatus] == NSStreamStatusError) { e = [stream streamError]; if (_debug) { NSLog(@"%@ receive error %@", self, e); } [self stopLoading]; [this->client URLProtocol: self didFailWithError: e]; } return; } if (_debug) { if (NO == [_logDelegate getBytes: buffer ofLength: readCount byHandle: self]) { debugRead(self, readCount, buffer); } } if (_parser == nil) { _parser = [GSMimeParser new]; [_parser setIsHttp]; } wasInHeaders = [_parser isInHeaders]; d = [NSData dataWithBytes: buffer length: readCount]; if ([_parser parse: d] == NO && (_complete = [_parser isComplete]) == NO) { if (_debug) { NSLog(@"%@ HTTP parse failure - %@", self, _parser); } e = [NSError errorWithDomain: @"parse error" code: 0 userInfo: nil]; [self stopLoading]; [this->client URLProtocol: self didFailWithError: e]; return; } else { BOOL isInHeaders = [_parser isInHeaders]; GSMimeDocument *document = [_parser mimeDocument]; unsigned bodyLength; _complete = [_parser isComplete]; if (YES == wasInHeaders && NO == isInHeaders) { GSMimeHeader *info; int len = -1; NSString *ct; NSString *st; NSString *s; info = [document headerNamed: @"http"]; _version = [[info value] floatValue]; if (_version < 1.1) { _shouldClose = YES; } else if ((s = [[document headerNamed: @"connection"] value]) != nil && [s caseInsensitiveCompare: @"close"] == NSOrderedSame) { _shouldClose = YES; } else { _shouldClose = NO; // Keep connection alive. } s = [info objectForKey: NSHTTPPropertyStatusCodeKey]; _statusCode = [s intValue]; s = [[document headerNamed: @"content-length"] value]; if ([s length] > 0) { len = [s intValue]; } s = [info objectForKey: NSHTTPPropertyStatusReasonKey]; /* Should use this? NSString *enc; enc = [[document headerNamed: @"content-transfer-encoding"] value]; if (enc == nil) { enc = [[document headerNamed: @"transfer-encoding"] value]; } */ info = [document headerNamed: @"content-type"]; ct = [document contentType]; st = [document contentSubtype]; if (ct && st) { ct = [ct stringByAppendingFormat: @"/%@", st]; } else { ct = nil; } _response = [[NSHTTPURLResponse alloc] initWithURL: [this->request URL] MIMEType: ct expectedContentLength: len textEncodingName: [info parameterForKey: @"charset"]]; [_response _setStatusCode: _statusCode text: s]; [document deleteHeaderNamed: @"http"]; [_response _setHeaders: [document allHeaders]]; if (_statusCode == 204 || _statusCode == 304) { _complete = YES; // No body expected. } else if (_complete == NO && [d length] == 0) { _complete = YES; // Had EOF ... terminate } if (_statusCode == 401) { /* This is an authentication challenge, so we keep reading * until the challenge is complete, then try to deal with it. */ } else if (_statusCode >= 300 && _statusCode < 400) { NSURL *url; NS_DURING s = [[document headerNamed: @"location"] value]; url = [NSURL URLWithString: s]; NS_HANDLER url = nil; NS_ENDHANDLER if (url == nil) { NSError *e; e = [NSError errorWithDomain: @"Invalid redirect request" code: 0 userInfo: nil]; [self stopLoading]; [this->client URLProtocol: self didFailWithError: e]; } else { NSMutableURLRequest *r; r = AUTORELEASE([this->request mutableCopy]); [r setURL: url]; [this->client URLProtocol: self wasRedirectedToRequest: r redirectResponse: _response]; } } else { NSURLCacheStoragePolicy policy; /* Get cookies from the response and accept them into * shared storage if policy permits */ if ([this->request HTTPShouldHandleCookies] == YES && [_response isKindOfClass: [NSHTTPURLResponse class]] == YES) { NSDictionary *hdrs; NSArray *cookies; NSURL *url; url = [_response URL]; hdrs = [_response allHeaderFields]; cookies = [NSHTTPCookie cookiesWithResponseHeaderFields: hdrs forURL: url]; [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookies: cookies forURL: url mainDocumentURL: [this->request mainDocumentURL]]; } /* Tell the client that we have a response and how * it should be cached. */ policy = [this->request cachePolicy]; if (policy == (NSURLCacheStoragePolicy)NSURLRequestUseProtocolCachePolicy) { if ([self isKindOfClass: [_NSHTTPSURLProtocol class]] == YES) { /* For HTTPS we should not allow caching unless the * request explicitly wants it. */ policy = NSURLCacheStorageNotAllowed; } else { /* For HTTP we allow caching unless the request * specifically denies it. */ policy = NSURLCacheStorageAllowed; } } [this->client URLProtocol: self didReceiveResponse: _response cacheStoragePolicy: policy]; } #if USE_ZLIB s = [[document headerNamed: @"content-encoding"] value]; if ([s isEqualToString: @"gzip"] || [s isEqualToString: @"x-gzip"]) { this->decompressing = YES; this->z.opaque = 0; this->z.zalloc = zalloc; this->z.zfree = zfree; this->z.next_in = 0; this->z.avail_in = 0; inflateInit2(&this->z, 1); // FIXME } #endif } if (_complete == YES) { if (_statusCode == 401) { NSURLProtectionSpace *space; NSString *hdr; NSURL *url; int failures = 0; /* This was an authentication challenge. */ hdr = [[document headerNamed: @"WWW-Authenticate"] value]; url = [this->request URL]; space = [GSHTTPAuthentication protectionSpaceForAuthentication: hdr requestURL: url]; DESTROY(_credential); if (space != nil) { /* Create credential from user and password * stored in the URL. * Returns nil if we have no username or password. */ _credential = [[NSURLCredential alloc] initWithUser: [url user] password: [url password] persistence: NSURLCredentialPersistenceForSession]; if (_credential == nil) { /* No credential from the URL, so we try using the * default credential for the protection space. */ ASSIGN(_credential, [[NSURLCredentialStorage sharedCredentialStorage] defaultCredentialForProtectionSpace: space]); } } if (_challenge != nil) { /* The failure count is incremented if we have just * tried a request in the same protection space. */ if (YES == [[_challenge protectionSpace] isEqual: space]) { failures = [_challenge previousFailureCount] + 1; } } else if ([this->request valueForHTTPHeaderField:@"Authorization"]) { /* Our request had an authorization header, so we should * count that as a failure or we wouldn't have been * challenged. */ failures = 1; } DESTROY(_challenge); _challenge = [[NSURLAuthenticationChallenge alloc] initWithProtectionSpace: space proposedCredential: _credential previousFailureCount: failures failureResponse: _response error: nil sender: self]; /* Allow the client to control the credential we send * or whether we actually send at all. */ [this->client URLProtocol: self didReceiveAuthenticationChallenge: _challenge]; if (_challenge == nil) { NSError *e; /* The client cancelled the authentication challenge * so we must cancel the download. */ e = [NSError errorWithDomain: @"Authentication cancelled" code: 0 userInfo: nil]; [self stopLoading]; [this->client URLProtocol: self didFailWithError: e]; } else { NSString *auth = nil; if (_credential != nil) { GSHTTPAuthentication *authentication; /* Get information about basic or * digest authentication. */ authentication = [GSHTTPAuthentication authenticationWithCredential: _credential inProtectionSpace: space]; /* Generate authentication header value for the * authentication type in the challenge. */ auth = [authentication authorizationForAuthentication: hdr method: [this->request HTTPMethod] path: [url fullPath]]; } if (auth == nil) { NSURLCacheStoragePolicy policy; /* We have no authentication credentials so we * treat this as a download of the challenge page. */ /* Tell the client that we have a response and how * it should be cached. */ policy = [this->request cachePolicy]; if (policy == (NSURLCacheStoragePolicy) NSURLRequestUseProtocolCachePolicy) { if ([self isKindOfClass: [_NSHTTPSURLProtocol class]]) { /* For HTTPS we should not allow caching unless * the request explicitly wants it. */ policy = NSURLCacheStorageNotAllowed; } else { /* For HTTP we allow caching unless the request * specifically denies it. */ policy = NSURLCacheStorageAllowed; } } [this->client URLProtocol: self didReceiveResponse: _response cacheStoragePolicy: policy]; /* Fall through to code providing page data. */ } else { NSMutableURLRequest *r; /* To answer the authentication challenge, * we must retry with a modified request and * with the cached response cleared. */ r = [this->request mutableCopy]; [r setValue: auth forHTTPHeaderField: @"Authorization"]; [self stopLoading]; RELEASE(this->request); this->request = r; DESTROY(this->cachedResponse); [self startLoading]; return; } } } [this->input removeFromRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode]; [this->output removeFromRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode]; if (_shouldClose == YES) { [this->input setDelegate: nil]; [this->output setDelegate: nil]; [this->input close]; [this->output close]; DESTROY(this->input); DESTROY(this->output); } /* * Tell superclass that we have successfully loaded the data * (as long as we haven't had the load terminated by the client). */ if (_isLoading == YES) { d = [_parser data]; bodyLength = [d length]; if (bodyLength > _parseOffset) { if (_parseOffset > 0) { d = [d subdataWithRange: NSMakeRange(_parseOffset, bodyLength - _parseOffset)]; } _parseOffset = bodyLength; [self _didLoad: d]; } /* Check again in case the client cancelled the load inside * the URLProtocol:didLoadData: callback. */ if (_isLoading == YES) { _isLoading = NO; [this->client URLProtocolDidFinishLoading: self]; } } } else if (_isLoading == YES && _statusCode != 401) { /* * Report partial data if possible. */ if ([_parser isInBody]) { d = [_parser data]; bodyLength = [d length]; if (bodyLength > _parseOffset) { if (_parseOffset > 0) { d = [d subdataWithRange: NSMakeRange(_parseOffset, [d length] - _parseOffset)]; } _parseOffset = bodyLength; [self _didLoad: d]; } } } if (_complete == NO && readCount == 0 && _isLoading == YES) { /* The read failed ... dropped, but parsing is not complete. * The request was sent, so we can't know whether it was * lost in the network or the remote end received it and * the response was lost. */ if (_debug) { NSLog(@"%@ HTTP response not received - %@", self, _parser); } [self stopLoading]; [this->client URLProtocol: self didFailWithError: [NSError errorWithDomain: @"receive incomplete" code: 0 userInfo: nil]]; } } } - (void) _put { BOOL sent = NO; while ((_writeData || _body) && [this->output hasSpaceAvailable]) { int written; // FIXME: should also send out relevant Cookies if (_writeData != nil) { const unsigned char *bytes = [_writeData bytes]; unsigned len = [_writeData length]; written = [this->output write: bytes + _writeOffset maxLength: len - _writeOffset]; if (written > 0) { if (_debug) { const unsigned char *b = [_masked bytes]; if (NULL == b) { b = bytes; } if (NO == [_logDelegate putBytes: b + _writeOffset ofLength: written byHandle: self]) { debugWrite(self, written, b + _writeOffset); } } _writeOffset += written; if (_writeOffset >= len) { DESTROY(_writeData); DESTROY(_masked); if (_body == nil) { _body = RETAIN([this->request HTTPBodyStream]); if (_body == nil) { NSData *d = [this->request HTTPBody]; if (d != nil) { _body = [NSInputStream alloc]; _body = [_body initWithData: d]; [_body open]; } else { sent = YES; } } } } } } else if (_body != nil) { if ([_body hasBytesAvailable]) { unsigned char buffer[BUFSIZ*64]; int len; len = [_body read: buffer maxLength: sizeof(buffer)]; if (len < 0) { if (_debug) { NSLog(@"%@ error reading from HTTPBody stream %@", self, [NSError _last]); } [self stopLoading]; [this->client URLProtocol: self didFailWithError: [NSError errorWithDomain: @"can't read body" code: 0 userInfo: nil]]; return; } else if (len > 0) { written = [this->output write: buffer maxLength: len]; if (written > 0) { if (_debug) { if (NO == [_logDelegate putBytes: buffer ofLength: written byHandle: self]) { debugWrite(self, written, buffer); } } len -= written; if (len > 0) { /* Couldn't write it all now, save and try * again later. */ _writeData = [[NSData alloc] initWithBytes: buffer + written length: len]; _writeOffset = 0; } else if (len == 0 && ![_body hasBytesAvailable]) { /* all _body's bytes are read and written * so we shouldn't wait for another * opportunity to close _body and set * the flag 'sent'. */ [_body close]; DESTROY(_body); sent = YES; } } else if ([this->output streamStatus] == NSStreamStatusWriting) { /* Couldn't write it all now, save and try * again later. */ _writeData = [[NSData alloc] initWithBytes: buffer length: len]; _writeOffset = 0; } } else { [_body close]; DESTROY(_body); sent = YES; } } else { [_body close]; DESTROY(_body); sent = YES; } } } if (sent) { if (_shouldClose) { if (_debug) { NSLog(@"%@ request sent ... closing", self); } [this->output setDelegate: nil]; [this->output removeFromRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode]; [this->output close]; DESTROY(this->output); } else if (_debug) { NSLog(@"%@ request sent", self); } } } - (void) stream: (NSStream*)stream handleEvent: (NSStreamEvent)event { /* Make sure no action triggered by anything else destroys us prematurely. */ IF_NO_ARC([[self retain] autorelease];) #if 0 NSLog(@"stream: %@ handleEvent: %x for: %@ (ip %p, op %p)", stream, event, self, this->input, this->output); #endif if (stream == this->input) { switch(event) { case NSStreamEventHasBytesAvailable: case NSStreamEventEndEncountered: [self _got: stream]; return; case NSStreamEventOpenCompleted: if (_debug) { NSLog(@"%@ HTTP input stream opened", self); } return; default: break; } } else if (stream == this->output) { switch (event) { case NSStreamEventOpenCompleted: { NSMutableData *m; NSMutableData *mm = nil; NSDictionary *d; NSEnumerator *e; NSString *s; NSURL *u; int l; NSData *bytes; if (_debug) { NSLog(@"%@ HTTP output stream opened", self); } this->in = [[NSString alloc] initWithFormat: @"(%@:%@ <-- %@:%@)", [stream propertyForKey: GSStreamLocalAddressKey], [stream propertyForKey: GSStreamLocalPortKey], [stream propertyForKey: GSStreamRemoteAddressKey], [stream propertyForKey: GSStreamRemotePortKey]]; this->out = [[NSString alloc] initWithFormat: @"(%@:%@ --> %@:%@)", [stream propertyForKey: GSStreamLocalAddressKey], [stream propertyForKey: GSStreamLocalPortKey], [stream propertyForKey: GSStreamRemoteAddressKey], [stream propertyForKey: GSStreamRemotePortKey]]; DESTROY(_writeData); DESTROY(_masked); _writeOffset = 0; if ([this->request HTTPBodyStream] == nil) { // Not streaming l = [[this->request HTTPBody] length]; _version = 1.1; } else { // Stream and close l = -1; _version = 1.0; _shouldClose = YES; } m = [[NSMutableData alloc] initWithCapacity: 1024]; /* The request line is of the form: * method /path?query HTTP/version * where the query part may be missing */ [m appendData: [[this->request HTTPMethod] dataUsingEncoding: NSASCIIStringEncoding]]; [m appendBytes: " " length: 1]; u = [this->request URL]; s = [[u fullPath] stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]; if ([s hasPrefix: @"/"] == NO) { [m appendBytes: "/" length: 1]; } [m appendData: [s dataUsingEncoding: NSASCIIStringEncoding]]; s = [u query]; if ([s length] > 0) { [m appendBytes: "?" length: 1]; [m appendData: [s dataUsingEncoding: NSASCIIStringEncoding]]; } s = [NSString stringWithFormat: @" HTTP/%0.1f\r\n", _version]; [m appendData: [s dataUsingEncoding: NSASCIIStringEncoding]]; d = [this->request allHTTPHeaderFields]; e = [d keyEnumerator]; while ((s = [e nextObject]) != nil) { GSMimeHeader *h; h = [[GSMimeHeader alloc] initWithName: s value: [d objectForKey: s] parameters: nil]; if (_debug || mm) { [h addToBuffer: m masking: &mm]; } else { [h addToBuffer: m masking: NULL]; } RELEASE(h); } /* Use valueForHTTPHeaderField: to check for content-type * header as that does a case insensitive comparison and * we therefore won't end up adding a second header by * accident because the two header names differ in case. */ if ([[this->request HTTPMethod] isEqual: @"POST"] && [this->request valueForHTTPHeaderField: @"Content-Type"] == nil) { /* On MacOSX, this is automatically added to POST methods */ static char *ct = "Content-Type: application/x-www-form-urlencoded\r\n"; [m appendBytes: ct length: strlen(ct)]; if (mm) { [mm appendBytes: ct length: strlen(ct)]; } } if ([this->request valueForHTTPHeaderField: @"Host"] == nil) { NSString *s = [u scheme]; id p = [u port]; id h = [u host]; if (h == nil) { h = @""; // Must send an empty host header } if (([s isEqualToString: @"http"] && [p intValue] == 80) || ([s isEqualToString: @"https"] && [p intValue] == 443)) { /* Some buggy systems object to the port being in * the Host header when it's the default (optional) * value. * To keep them happy let's omit it in those cases. */ p = nil; } if (nil == p) { s = [NSString stringWithFormat: @"Host: %@\r\n", h]; } else { s = [NSString stringWithFormat: @"Host: %@:%@\r\n", h, p]; } bytes = [s dataUsingEncoding: NSASCIIStringEncoding]; [m appendData: bytes]; if (mm) { [mm appendData: bytes]; } } if (l >= 0 && [this->request valueForHTTPHeaderField: @"Content-Length"] == nil) { s = [NSString stringWithFormat: @"Content-Length: %d\r\n", l]; bytes = [s dataUsingEncoding: NSASCIIStringEncoding]; [m appendData: bytes]; if (mm) { [mm appendData: bytes]; } } [m appendBytes: "\r\n" length: 2]; // End of headers if (mm) { [mm appendBytes: "\r\n" length: 2]; } _writeData = m; ASSIGN(_masked, mm); } // Fall through to do the write case NSStreamEventHasSpaceAvailable: [self _put]; return; default: break; } } else { NSLog(@"Unexpected event %"PRIuPTR " occurred on stream %@ not being used by %@", event, stream, self); } if (event == NSStreamEventErrorOccurred) { NSError *error = [[[stream streamError] retain] autorelease]; [self stopLoading]; [this->client URLProtocol: self didFailWithError: error]; } else { NSLog(@"Unexpected event %"PRIuPTR" ignored on stream %@ of %@", event, stream, self); } } - (void) useCredential: (NSURLCredential*)credential forAuthenticationChallenge: (NSURLAuthenticationChallenge*)challenge { if (challenge == _challenge) { ASSIGN(_credential, credential); } } @end @implementation _NSHTTPSURLProtocol + (BOOL) canInitWithRequest: (NSURLRequest*)request { return [[[request URL] scheme] isEqualToString: @"https"]; } @end @implementation _NSFTPURLProtocol + (BOOL) canInitWithRequest: (NSURLRequest*)request { return [[[request URL] scheme] isEqualToString: @"ftp"]; } + (NSURLRequest*) canonicalRequestForRequest: (NSURLRequest*)request { return request; } - (void) startLoading { if (this->cachedResponse) { // handle from cache } else { NSURL *url = [this->request URL]; NSHost *host = [NSHost hostWithName: [url host]]; if (host == nil) { host = [NSHost hostWithAddress: [url host]]; } [NSStream getStreamsToHost: host port: [[url port] intValue] inputStream: &this->input outputStream: &this->output]; if (this->input == nil || this->output == nil) { [this->client URLProtocol: self didFailWithError: [NSError errorWithDomain: @"can't connect" code: 0 userInfo: nil]]; return; } [this->input retain]; [this->output retain]; if ([[url scheme] isEqualToString: @"https"] == YES) { [this->input setProperty: NSStreamSocketSecurityLevelNegotiatedSSL forKey: NSStreamSocketSecurityLevelKey]; [this->output setProperty: NSStreamSocketSecurityLevelNegotiatedSSL forKey: NSStreamSocketSecurityLevelKey]; } [this->input setDelegate: self]; [this->output setDelegate: self]; [this->input scheduleInRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode]; [this->output scheduleInRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode]; // set socket options for ftps requests [this->input open]; [this->output open]; } } - (void) stopLoading { if (this->input) { [this->input setDelegate: nil]; [this->output setDelegate: nil]; [this->input removeFromRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode]; [this->output removeFromRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode]; [this->input close]; [this->output close]; DESTROY(this->input); DESTROY(this->output); } } - (void) stream: (NSStream *) stream handleEvent: (NSStreamEvent) event { if (stream == this->input) { switch(event) { case NSStreamEventHasBytesAvailable: { NSLog(@"FTP input stream has bytes available"); // implement FTP protocol // [this->client URLProtocol: self didLoadData: [NSData dataWithBytes: buffer length: len]]; // notify return; } case NSStreamEventEndEncountered: // can this occur in parallel to NSStreamEventHasBytesAvailable??? NSLog(@"FTP input stream did end"); [this->client URLProtocolDidFinishLoading: self]; return; case NSStreamEventOpenCompleted: // prepare to receive header NSLog(@"FTP input stream opened"); return; default: break; } } else if (stream == this->output) { NSLog(@"An event occurred on the output stream."); // if successfully opened, send out FTP request header } else { NSLog(@"Unexpected event %"PRIuPTR " occurred on stream %@ not being used by %@", event, stream, self); } if (event == NSStreamEventErrorOccurred) { NSLog(@"An error %@ occurred on stream %@ of %@", [stream streamError], stream, self); [self stopLoading]; [this->client URLProtocol: self didFailWithError: [stream streamError]]; } else { NSLog(@"Unexpected event %"PRIuPTR" ignored on stream %@ of %@", event, stream, self); } } @end @implementation _NSFileURLProtocol + (BOOL) canInitWithRequest: (NSURLRequest*)request { return [[[request URL] scheme] isEqualToString: @"file"]; } + (NSURLRequest*) canonicalRequestForRequest: (NSURLRequest*)request { return request; } - (void) startLoading { // check for GET/PUT/DELETE etc so that we can also write to a file NSData *data; NSURLResponse *r; data = [NSData dataWithContentsOfFile: [[this->request URL] path] /* options: error: - don't use that because it is based on self */]; if (data == nil) { [this->client URLProtocol: self didFailWithError: [NSError errorWithDomain: @"can't load file" code: 0 userInfo: [NSDictionary dictionaryWithObjectsAndKeys: [this->request URL], @"URL", [[this->request URL] path], @"path", nil]]]; return; } /* FIXME ... maybe should infer MIME type and encoding from extension or BOM */ r = [[NSURLResponse alloc] initWithURL: [this->request URL] MIMEType: @"text/html" expectedContentLength: [data length] textEncodingName: @"unknown"]; [this->client URLProtocol: self didReceiveResponse: r cacheStoragePolicy: NSURLRequestUseProtocolCachePolicy]; [this->client URLProtocol: self didLoadData: data]; [this->client URLProtocolDidFinishLoading: self]; RELEASE(r); } - (void) stopLoading { return; } @end @implementation _NSDataURLProtocol + (BOOL) canInitWithRequest: (NSURLRequest*)request { return [[[request URL] scheme] isEqualToString: @"data"]; } + (NSURLRequest*) canonicalRequestForRequest: (NSURLRequest*)request { return request; } - (void) startLoading { NSURLResponse *r; NSString *mime = @"text/plain"; NSString *encoding = @"US-ASCII"; NSData *data; NSString *spec = [[this->request URL] resourceSpecifier]; NSRange comma = [spec rangeOfString:@","]; NSEnumerator *types; NSString *type; BOOL base64 = NO; if (comma.location == NSNotFound) { NSDictionary *ui; NSError *error; ui = [NSDictionary dictionaryWithObjectsAndKeys: [this->request URL], @"URL", [[this->request URL] path], @"path", nil]; error = [NSError errorWithDomain: @"can't load data" code: 0 userInfo: ui]; [this->client URLProtocol: self didFailWithError: error]; return; } types = [[[spec substringToIndex: comma.location] componentsSeparatedByString: @";"] objectEnumerator]; while (nil != (type = [types nextObject])) { if ([type isEqualToString: @"base64"]) { base64 = YES; } else if ([type hasPrefix: @"charset="]) { encoding = [type substringFromIndex: 8]; } else if ([type length] > 0) { mime = type; } } spec = [spec substringFromIndex: comma.location + 1]; if (YES == base64) { data = [GSMimeDocument decodeBase64: [spec dataUsingEncoding: NSUTF8StringEncoding]]; } else { data = [[spec stringByReplacingPercentEscapesUsingEncoding: NSUTF8StringEncoding] dataUsingEncoding: NSUTF8StringEncoding]; } r = [[NSURLResponse alloc] initWithURL: [this->request URL] MIMEType: mime expectedContentLength: [data length] textEncodingName: encoding]; [this->client URLProtocol: self didReceiveResponse: r cacheStoragePolicy: NSURLRequestUseProtocolCachePolicy]; [this->client URLProtocol: self didLoadData: data]; [this->client URLProtocolDidFinishLoading: self]; RELEASE(r); } - (void) stopLoading { return; } @end @implementation _NSAboutURLProtocol + (BOOL) canInitWithRequest: (NSURLRequest*)request { return [[[request URL] scheme] isEqualToString: @"about"]; } + (NSURLRequest*) canonicalRequestForRequest: (NSURLRequest*)request { return request; } - (void) startLoading { NSURLResponse *r; NSData *data = [NSData data]; // no data // we could pass different content depending on the url path r = [[NSURLResponse alloc] initWithURL: [this->request URL] MIMEType: @"text/html" expectedContentLength: 0 textEncodingName: @"utf-8"]; [this->client URLProtocol: self didReceiveResponse: r cacheStoragePolicy: NSURLRequestUseProtocolCachePolicy]; [this->client URLProtocol: self didLoadData: data]; [this->client URLProtocolDidFinishLoading: self]; RELEASE(r); } - (void) stopLoading { return; } @end gnustep-base-1.29.0/Source/NSURLRequest.m000066400000000000000000000243471435650067400201160ustar00rootroot00000000000000/* Implementation for NSURLRequest for GNUstep Copyright (C) 2006 Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 2006 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #define EXPOSE_NSURLRequest_IVARS 1 #import "GSURLPrivate.h" #import "GSPrivate.h" #import "Foundation/NSCoder.h" // Internal data storage typedef struct { NSData *body; NSInputStream *bodyStream; NSString *method; NSMutableDictionary *headers; BOOL shouldHandleCookies; BOOL debug; id ioDelegate; NSURL *URL; NSURL *mainDocumentURL; NSURLRequestCachePolicy cachePolicy; NSTimeInterval timeoutInterval; NSMutableDictionary *properties; } Internal; /* Defines to get easy access to internals from mutable/immutable * versions of the class and from categories. */ #define this ((Internal*)(self->_NSURLRequestInternal)) #define inst ((Internal*)(((NSURLRequest*)o)->_NSURLRequestInternal)) @interface _GSMutableInsensitiveDictionary : NSMutableDictionary @end @implementation NSURLRequest + (id) allocWithZone: (NSZone*)z { NSURLRequest *o = [super allocWithZone: z]; if (o != nil) { o->_NSURLRequestInternal = NSZoneCalloc(z, 1, sizeof(Internal)); } return o; } + (instancetype) requestWithURL: (NSURL *)URL { return [self requestWithURL: URL cachePolicy: NSURLRequestUseProtocolCachePolicy timeoutInterval: 60.0]; } + (instancetype) requestWithURL: (NSURL *)URL cachePolicy: (NSURLRequestCachePolicy)cachePolicy timeoutInterval: (NSTimeInterval)timeoutInterval { NSURLRequest *o = [[self class] allocWithZone: NSDefaultMallocZone()]; o = [o initWithURL: URL cachePolicy: cachePolicy timeoutInterval: timeoutInterval]; return AUTORELEASE(o); } - (NSURLRequestCachePolicy) cachePolicy { return this->cachePolicy; } - (id) copyWithZone: (NSZone*)z { NSURLRequest *o; if (NSShouldRetainWithZone(self, z) == YES && [self isKindOfClass: [NSMutableURLRequest class]] == NO) { o = RETAIN(self); } else { o = [[self class] allocWithZone: z]; o = [o initWithURL: [self URL] cachePolicy: [self cachePolicy] timeoutInterval: [self timeoutInterval]]; if (o != nil) { inst->properties = [this->properties mutableCopy]; ASSIGN(inst->mainDocumentURL, this->mainDocumentURL); ASSIGN(inst->body, this->body); ASSIGN(inst->bodyStream, this->bodyStream); ASSIGN(inst->method, this->method); inst->shouldHandleCookies = this->shouldHandleCookies; inst->debug = this->debug; inst->ioDelegate = this->ioDelegate; inst->headers = [this->headers mutableCopy]; } } return o; } - (void) dealloc { if (this != 0) { RELEASE(this->body); RELEASE(this->bodyStream); RELEASE(this->method); RELEASE(this->URL); RELEASE(this->mainDocumentURL); RELEASE(this->properties); RELEASE(this->headers); NSZoneFree([self zone], this); } [super dealloc]; } - (NSString*) description { return [NSString stringWithFormat: @"<%@ %@>", NSStringFromClass([self class]), [[self URL] absoluteString]]; } - (void) encodeWithCoder: (NSCoder*)aCoder { // FIXME if ([aCoder allowsKeyedCoding]) { } else { } } - (id) initWithCoder: (NSCoder*)aCoder { // FIXME if ([aCoder allowsKeyedCoding]) { } else { } return self; } - (NSUInteger) hash { return [this->URL hash]; } - (id) init { return [self initWithURL: nil]; } - (instancetype) initWithURL: (NSURL *)URL { return [self initWithURL: URL cachePolicy: NSURLRequestUseProtocolCachePolicy timeoutInterval: 60.0]; } - (instancetype) initWithURL: (NSURL *)URL cachePolicy: (NSURLRequestCachePolicy)cachePolicy timeoutInterval: (NSTimeInterval)timeoutInterval { if ([URL isKindOfClass: [NSURL class]] == NO) { URL = nil; } if ((self = [super init]) != nil) { this->URL = RETAIN(URL); this->cachePolicy = cachePolicy; this->timeoutInterval = timeoutInterval; this->mainDocumentURL = nil; this->method = @"GET"; this->shouldHandleCookies = YES; } return self; } - (BOOL) isEqual: (id)o { if ([o isKindOfClass: [NSURLRequest class]] == NO) { return NO; } if (this->URL != inst->URL && [this->URL isEqual: inst->URL] == NO) { return NO; } if (this->mainDocumentURL != inst->mainDocumentURL && [this->mainDocumentURL isEqual: inst->mainDocumentURL] == NO) { return NO; } if (this->method != inst->method && [this->method isEqual: inst->method] == NO) { return NO; } if (this->body != inst->body && [this->body isEqual: inst->body] == NO) { return NO; } if (this->bodyStream != inst->bodyStream && [this->bodyStream isEqual: inst->bodyStream] == NO) { return NO; } if (this->properties != inst->properties && [this->properties isEqual: inst->properties] == NO) { return NO; } if (this->headers != inst->headers && [this->headers isEqual: inst->headers] == NO) { return NO; } return YES; } - (NSURL *) mainDocumentURL { return this->mainDocumentURL; } - (id) mutableCopyWithZone: (NSZone*)z { NSMutableURLRequest *o; o = [NSMutableURLRequest allocWithZone: z]; o = [o initWithURL: [self URL] cachePolicy: [self cachePolicy] timeoutInterval: [self timeoutInterval]]; if (o != nil) { [o setMainDocumentURL: this->mainDocumentURL]; inst->properties = [this->properties mutableCopy]; ASSIGN(inst->mainDocumentURL, this->mainDocumentURL); ASSIGN(inst->body, this->body); ASSIGN(inst->bodyStream, this->bodyStream); ASSIGN(inst->method, this->method); inst->shouldHandleCookies = this->shouldHandleCookies; inst->debug = this->debug; inst->headers = [this->headers mutableCopy]; } return o; } - (int) setDebug: (int)flag { int old = this->debug; this->debug = flag ? YES : NO; return old; } - (id) setDebugLogDelegate: (id)d { id old = this->ioDelegate; NSAssert(nil == d || [d conformsToProtocol: @protocol(GSLogDelegate)], NSInvalidArgumentException); this->ioDelegate = d; return old; } - (NSTimeInterval) timeoutInterval { return this->timeoutInterval; } - (NSURL *) URL { return this->URL; } @end @implementation NSMutableURLRequest - (void) setCachePolicy: (NSURLRequestCachePolicy)cachePolicy { this->cachePolicy = cachePolicy; } - (void) setMainDocumentURL: (NSURL *)URL { ASSIGN(this->mainDocumentURL, URL); } - (void) setTimeoutInterval: (NSTimeInterval)seconds { this->timeoutInterval = seconds; } - (void) setURL: (NSURL *)URL { ASSIGN(this->URL, URL); } @end @implementation NSURLRequest (NSHTTPURLRequest) - (NSDictionary *) allHTTPHeaderFields { NSDictionary *fields; if (this->headers == nil) { fields = [NSDictionary dictionary]; } else { fields = [NSDictionary dictionaryWithDictionary: this->headers]; } return fields; } - (NSData *) HTTPBody { return this->body; } - (NSInputStream *) HTTPBodyStream { return this->bodyStream; } - (NSString *) HTTPMethod { return this->method; } - (BOOL) HTTPShouldHandleCookies { return this->shouldHandleCookies; } - (NSString *) valueForHTTPHeaderField: (NSString *)field { return [this->headers objectForKey: field]; } @end @implementation NSMutableURLRequest (NSMutableHTTPURLRequest) - (void) addValue: (NSString *)value forHTTPHeaderField: (NSString *)field { NSString *old = [self valueForHTTPHeaderField: field]; if (old != nil) { value = [old stringByAppendingFormat: @",%@", value]; } [self setValue: value forHTTPHeaderField: field]; } - (void) setAllHTTPHeaderFields: (NSDictionary *)headerFields { NSEnumerator *enumerator = [headerFields keyEnumerator]; NSString *field; while ((field = [enumerator nextObject]) != nil) { id value = [headerFields objectForKey: field]; if ([value isKindOfClass: [NSString class]] == YES) { [self setValue: (NSString*)value forHTTPHeaderField: field]; } } } - (void) setHTTPBodyStream: (NSInputStream *)inputStream { DESTROY(this->body); ASSIGN(this->bodyStream, inputStream); } - (void) setHTTPBody: (NSData *)data { DESTROY(this->bodyStream); ASSIGNCOPY(this->body, data); } - (void) setHTTPMethod: (NSString *)method { /* NB. I checked MacOS-X 4.2, and this method actually lets you set any * copyable value (including non-string classes), but setting nil is * equivalent to resetting to the default value of 'GET' */ if (method == nil) { method = @"GET"; } ASSIGNCOPY(this->method, method); } - (void) setHTTPShouldHandleCookies: (BOOL)should { this->shouldHandleCookies = should; } - (void) setValue: (NSString *)value forHTTPHeaderField: (NSString *)field { if (this->headers == nil) { this->headers = [_GSMutableInsensitiveDictionary new]; } [this->headers setObject: value forKey: field]; } @end @implementation NSURLRequest (Private) - (BOOL) _debug { return this->debug; } - (id) _debugLogDelegate { return this->ioDelegate; } - (id) _propertyForKey: (NSString*)key { return [this->properties objectForKey: key]; } - (void) _setProperty: (id)value forKey: (NSString*)key { if (this->properties == nil) { this->properties = [NSMutableDictionary new]; [this->properties setObject: value forKey: key]; } } @end gnustep-base-1.29.0/Source/NSURLResponse.m000066400000000000000000000215571435650067400202640ustar00rootroot00000000000000/* Implementation for NSURLResponse for GNUstep Copyright (C) 2006 Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 2006 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #define EXPOSE_NSURLResponse_IVARS 1 #import "GSURLPrivate.h" #import "GSPrivate.h" #import "Foundation/NSCoder.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSScanner.h" #import "NSCallBacks.h" #import "GNUstepBase/GSMime.h" // Internal data storage typedef struct { long long expectedContentLength; NSURL *URL; NSString *MIMEType; NSString *textEncodingName; NSString *statusText; NSMutableDictionary *headers; /* _GSMutableInsensitiveDictionary */ int statusCode; } Internal; #define this ((Internal*)(self->_NSURLResponseInternal)) #define inst ((Internal*)(o->_NSURLResponseInternal)) @interface _GSMutableInsensitiveDictionary : NSMutableDictionary @end @implementation NSURLResponse (Private) - (void) _checkHeaders { if (NSURLResponseUnknownLength == this->expectedContentLength) { NSString *s= [self _valueForHTTPHeaderField: @"content-length"]; if ([s length] > 0) { this->expectedContentLength = [s intValue]; } } if (nil == this->MIMEType) { GSMimeHeader *c; GSMimeParser *p; NSScanner *s; NSString *v; v = [self _valueForHTTPHeaderField: @"content-type"]; if (v == nil) { v = @"text/plain"; // No content type given. } s = [NSScanner scannerWithString: v]; p = [GSMimeParser new]; c = AUTORELEASE([[GSMimeHeader alloc] initWithName: @"content-type" value: nil]); /* We just set the header body, so we know it will scan and don't need * to check the retrurn type. */ (void)[p scanHeaderBody: s into: c]; RELEASE(p); ASSIGNCOPY(this->MIMEType, [c value]); v = [c parameterForKey: @"charset"]; ASSIGNCOPY(this->textEncodingName, v); } } - (void) _setHeaders: (id)headers { NSEnumerator *e; NSString *v; if ([headers isKindOfClass: [NSDictionary class]] == YES) { NSString *k; e = [(NSDictionary*)headers keyEnumerator]; while ((k = [e nextObject]) != nil) { v = [(NSDictionary*)headers objectForKey: k]; [self _setValue: v forHTTPHeaderField: k]; } } else if ([headers isKindOfClass: [NSArray class]] == YES) { GSMimeHeader *h; /* Remove existing headers matching the ones we are setting. */ e = [(NSArray*)headers objectEnumerator]; while ((h = [e nextObject]) != nil) { NSString *n = [h namePreservingCase: YES]; [this->headers removeObjectForKey: n]; } /* Set new headers, joining values where we have multiple headers * with the same name. */ e = [(NSArray*)headers objectEnumerator]; while ((h = [e nextObject]) != nil) { NSString *n = [h namePreservingCase: YES]; NSString *o = [this->headers objectForKey: n]; NSString *v = [h fullValue]; if (nil != o) { n = [NSString stringWithFormat: @"%@, %@", o, n]; } [self _setValue: v forHTTPHeaderField: n]; } } [self _checkHeaders]; } - (void) _setStatusCode: (NSInteger)code text: (NSString*)text { this->statusCode = code; ASSIGNCOPY(this->statusText, text); } - (void) _setValue: (NSString *)value forHTTPHeaderField: (NSString *)field { if (this->headers == 0) { this->headers = [_GSMutableInsensitiveDictionary new]; } [this->headers setObject: value forKey: field]; } - (NSString *) _valueForHTTPHeaderField: (NSString *)field { return [this->headers objectForKey: field]; } @end @implementation NSURLResponse + (id) allocWithZone: (NSZone*)z { NSURLResponse *o = [super allocWithZone: z]; if (o != nil) { o->_NSURLResponseInternal = NSZoneCalloc(z, 1, sizeof(Internal)); } return o; } - (id) copyWithZone: (NSZone*)z { NSURLResponse *o; if (NSShouldRetainWithZone(self, z) == YES) { o = RETAIN(self); } else { o = [[self class] allocWithZone: z]; o = [o initWithURL: [self URL] MIMEType: [self MIMEType] expectedContentLength: [self expectedContentLength] textEncodingName: [self textEncodingName]]; if (o != nil) { ASSIGN(inst->statusText, this->statusText); inst->statusCode = this->statusCode; if (this->headers == 0) { inst->headers = 0; } else { inst->headers = [this->headers mutableCopy]; } } } return o; } - (void) dealloc { if (this != 0) { RELEASE(this->URL); RELEASE(this->MIMEType); RELEASE(this->textEncodingName); RELEASE(this->statusText); RELEASE(this->headers); NSZoneFree([self zone], this); } [super dealloc]; } - (NSString*) description { return [NSString stringWithFormat: @"%@ { URL: %@ } { Status Code: %d, Headers %@ }", [super description], this->URL, this->statusCode, this->headers]; } - (void) encodeWithCoder: (NSCoder*)aCoder { // FIXME if ([aCoder allowsKeyedCoding]) { } else { } } - (long long) expectedContentLength { return this->expectedContentLength; } - (id) initWithCoder: (NSCoder*)aCoder { // FIXME if ([aCoder allowsKeyedCoding]) { } else { } return self; } /** * Initialises the receiver with the URL, MIMEType, expected length and * text encoding name provided. */ - (id) initWithURL: (NSURL *)URL MIMEType: (NSString *)MIMEType expectedContentLength: (NSInteger)length textEncodingName: (NSString *)name { if ((self = [super init]) != nil) { ASSIGN(this->URL, URL); ASSIGNCOPY(this->MIMEType, MIMEType); ASSIGNCOPY(this->textEncodingName, name); this->expectedContentLength = length; } return self; } - (id) initWithURL: (NSURL*)URL statusCode: (NSInteger)statusCode HTTPVersion: (NSString*)HTTPVersion headerFields: (NSDictionary*)headerFields { self = [self initWithURL: URL MIMEType: nil expectedContentLength: NSURLResponseUnknownLength textEncodingName: nil]; if (nil != self) { this->statusCode = statusCode; this->headers = [headerFields copy]; [self _checkHeaders]; } return self; } - (NSString *) MIMEType { return this->MIMEType; } /** * Returns a suggested file name for storing the response data, with * suggested names being found in the following order:
* * content-disposition header * last path component of URL * host name from URL * 'unknown' * * If possible, an extension based on the MIME type of the response * is also appended.
* The result should always be a valid file name. */ - (NSString *) suggestedFilename { NSString *disp = [self _valueForHTTPHeaderField: @"content-disposition"]; NSString *name = nil; if (disp != nil) { GSMimeParser *p; GSMimeHeader *h; NSScanner *sc; // Try to get name from content disposition header. p = AUTORELEASE([GSMimeParser new]); h = [[GSMimeHeader alloc] initWithName: @"content-displosition" value: disp]; IF_NO_ARC([h autorelease];) sc = [NSScanner scannerWithString: [h value]]; if ([p scanHeaderBody: sc into: h] == YES) { name = [h parameterForKey: @"filename"]; name = [name stringByDeletingPathExtension]; } } if ([name length] == 0) { name = [[[self URL] absoluteString] lastPathComponent]; name = [name stringByDeletingPathExtension]; } if ([name length] == 0) { name = [[self URL] host]; } if ([name length] == 0) { name = @"unknown"; } // FIXME ... add type specific extension return name; } - (NSString *) textEncodingName { return this->textEncodingName; } - (NSURL *) URL { return this->URL; } @end @implementation NSHTTPURLResponse + (NSString *) localizedStringForStatusCode: (NSInteger)statusCode { // FIXME ... put real responses in here return [NSString stringWithFormat: @"%"PRIdPTR, statusCode]; } - (NSDictionary *) allHeaderFields { return AUTORELEASE([this->headers copy]); } - (NSInteger) statusCode { return this->statusCode; } @end gnustep-base-1.29.0/Source/NSURLSession.m000066400000000000000000001060551435650067400201060ustar00rootroot00000000000000#import "GSURLPrivate.h" #import #import "GSDispatch.h" #import "GSMultiHandle.h" #import "GSEasyHandle.h" #import "GSTaskRegistry.h" #import "GSHTTPURLProtocol.h" #import "GSURLSessionTaskBody.h" #import "Foundation/NSError.h" #import "Foundation/NSException.h" #import "Foundation/NSOperation.h" #import "Foundation/NSURLError.h" #import "Foundation/NSURLSession.h" #import "Foundation/NSURLRequest.h" #import "Foundation/NSValue.h" /* NSURLSession API implementation overview * * This implementation uses libcurl for the HTTP layer implementation. At a * high level, the [NSURLSession] keeps a curl *multi handle*, and each * [NSURLSessionTask] has an *easy handle*. This way these two APIs somewhat * have a 1-to-1 mapping. * * The [NSURLSessionTask] class is in charge of configuring its *easy handle* * and adding it to the owning session’s *multi handle*. Adding / removing * the handle effectively resumes / suspends the transfer. * * The [NSURLSessionTasks] class has subclasses, but this design puts all the * logic into the parent [NSURLSessionTask]. * * The session class uses the [GSTaskRegistry] to keep track of its tasks. * * The task class uses an GSInternalState type together with GSTransferState * to keep track of its state and each transfer’s state. * NB. a single task may do multiple transfers (e.g. as the result of a * redirect). * * The [NSURLSession] has a libdispatch *work queue*, and all internal work is * done on that queue, such that the code doesn't have to deal with thread * safety beyond that. All work inside a [NSURLSessionTask] will run on this * work queue, and so will code manipulating the session's *multi handle*. * * Delegate callbacks are, however, done on the passed in delegateQueue. * Any calls into this API need to switch onto the *work queue* as needed. * * Most of HTTP is defined in [RFC 2616](https://tools.ietf.org/html/rfc2616). * While libcurl handles many of these details, some are handled by this * NSURLSession implementation. */ @interface NSURLSession () - (dispatch_queue_t) workQueue; @end @interface NSURLSessionTask() - (instancetype) initWithSession: (NSURLSession*)session request: (NSURLRequest*)request taskIdentifier: (NSUInteger)identifier; - (void) getProtocolWithCompletion: (void (^)(NSURLProtocol* protocol))completion; - (void) setState: (NSURLSessionTaskState)state; - (void) invalidateProtocol; @end @interface NSURLSessionTask (URLProtocolClient) @end typedef NS_ENUM(NSUInteger, NSURLSessionTaskProtocolState) { NSURLSessionTaskProtocolStateToBeCreated = 0, NSURLSessionTaskProtocolStateAwaitingCacheReply = 1, NSURLSessionTaskProtocolStateExisting = 2, NSURLSessionTaskProtocolStateInvalidated = 3, }; static dispatch_queue_t _globalVarSyncQ = NULL; static int sessionCounter = 0; static int nextSessionIdentifier() { if (NULL == _globalVarSyncQ) { _globalVarSyncQ = dispatch_queue_create("org.gnustep.NSURLSession.GlobalVarSyncQ", DISPATCH_QUEUE_SERIAL); } dispatch_sync(_globalVarSyncQ, ^{ sessionCounter += 1; }); return sessionCounter; } @implementation NSURLSession { int _identifier; dispatch_queue_t _workQueue; NSUInteger _nextTaskIdentifier; BOOL _invalidated; GSTaskRegistry *_taskRegistry; } + (NSURLSession *) sessionWithConfiguration: (NSURLSessionConfiguration*)configuration delegate: (id )delegate delegateQueue: (NSOperationQueue*)queue { NSURLSession *session; session = [[NSURLSession alloc] initWithConfiguration: configuration delegate: delegate delegateQueue: queue]; return AUTORELEASE(session); } - (instancetype) initWithConfiguration: (NSURLSessionConfiguration*)configuration delegate: (id )delegate delegateQueue: (NSOperationQueue*)queue { if (nil != (self = [super init])) { char label[30]; _taskRegistry = [[GSTaskRegistry alloc] init]; #if defined(CURLSSLBACKEND_GNUTLS) curl_global_sslset(CURLSSLBACKEND_GNUTLS, NULL, NULL)l #endif curl_global_init(CURL_GLOBAL_SSL); _identifier = nextSessionIdentifier(); sprintf(label, "NSURLSession %d", _identifier); _workQueue = dispatch_queue_create(label, DISPATCH_QUEUE_SERIAL); if (nil != queue) { ASSIGN(_delegateQueue, queue); } else { _delegateQueue = [[NSOperationQueue alloc] init]; [_delegateQueue setMaxConcurrentOperationCount: 1]; } _delegate = delegate; ASSIGN(_configuration, configuration); _nextTaskIdentifier = 1; _invalidated = NO; _multiHandle = [[GSMultiHandle alloc] initWithConfiguration: configuration workQueue: _workQueue]; [NSURLProtocol registerClass: [GSHTTPURLProtocol class]]; } return self; } - (void) dealloc { DESTROY(_taskRegistry); DESTROY(_configuration); DESTROY(_delegateQueue); DESTROY(_multiHandle); [super dealloc]; } - (dispatch_queue_t) workQueue { return _workQueue; } - (NSOperationQueue*) delegateQueue { return _delegateQueue; } - (id ) delegate { return _delegate; } - (NSURLSessionConfiguration*) configuration { return _configuration; } - (NSString*) sessionDescription { return _sessionDescription; } - (void) setSessionDescription: (NSString*)sessionDescription { ASSIGN(_sessionDescription, sessionDescription); } - (void) finishTasksAndInvalidate { dispatch_async(_workQueue, ^{ _invalidated = YES; void (^invalidateSessionCallback)(void) = ^{ if (nil == _delegate) return; [self.delegateQueue addOperationWithBlock: ^{ if ([_delegate respondsToSelector: @selector(URLSession:didBecomeInvalidWithError:)]) { [_delegate URLSession: self didBecomeInvalidWithError: nil]; } _delegate = nil; }]; }; if (![_taskRegistry isEmpty]) { [_taskRegistry notifyOnTasksCompletion: invalidateSessionCallback]; } else { invalidateSessionCallback(); } }); } - (void) invalidateAndCancel { NSEnumerator *e; NSURLSessionTask *task; dispatch_sync(_workQueue, ^{ _invalidated = YES; }); e = [[_taskRegistry allTasks] objectEnumerator]; while (nil != (task = [e nextObject])) { [task cancel]; } dispatch_async(_workQueue, ^{ if (nil == _delegate) { return; } [_delegateQueue addOperationWithBlock: ^{ if ([_delegate respondsToSelector: @selector(URLSession:didBecomeInvalidWithError:)]) { [_delegate URLSession: self didBecomeInvalidWithError: nil]; } _delegate = nil; }]; }); } - (NSURLSessionDataTask*) dataTaskWithRequest: (NSURLRequest*)request { NSURLSessionDataTask *task; if (_invalidated) { return nil; } task = [[NSURLSessionDataTask alloc] initWithSession: self request: request taskIdentifier: _nextTaskIdentifier++]; [self addTask: task]; return AUTORELEASE(task); } - (NSURLSessionDataTask*) dataTaskWithURL: (NSURL*)url { NSMutableURLRequest *request; request = [NSMutableURLRequest requestWithURL: url]; [request setHTTPMethod: @"POST"]; return [self dataTaskWithRequest: request]; } - (NSURLSessionDownloadTask *) downloadTaskWithRequest: (NSURLRequest *)request { NSURLSessionDownloadTask *task; if (_invalidated) { return nil; } task = [[NSURLSessionDownloadTask alloc] initWithSession: self request: request taskIdentifier: _nextTaskIdentifier++]; [self addTask: task]; return AUTORELEASE(task); } - (NSURLSessionDownloadTask *) downloadTaskWithURL: (NSURL *)url { NSMutableURLRequest *request; request = [NSMutableURLRequest requestWithURL: url]; [request setHTTPMethod: @"GET"]; return [self downloadTaskWithRequest: request]; } - (void) addTask: (NSURLSessionTask*)task { [_taskRegistry addTask: task]; } - (void) removeTask: (NSURLSessionTask*)task { [_taskRegistry removeTask: task]; } @end @implementation _NSURLProtocolClient - (instancetype) init { if (nil != (self = [super init])) { _cachePolicy = NSURLCacheStorageNotAllowed; } return self; } - (void) dealloc { DESTROY(_cacheableData); DESTROY(_cacheableResponse); [super dealloc]; } - (void) URLProtocol: (NSURLProtocol *)protocol cachedResponseIsValid: (NSCachedURLResponse *)cachedResponse { } - (void) URLProtocol: (NSURLProtocol *)protocol didFailWithError: (NSError *)error { NSURLSessionTask *task = [protocol task]; NSAssert(nil != task, @"Missing task"); [self task: task didFailWithError: error]; } - (void) task: (NSURLSessionTask *)task didFailWithError: (NSError *)error { NSURLSession *session; NSOperationQueue *delegateQueue; id delegate; session = [task session]; NSAssert(nil != session, @"Missing session"); delegateQueue = [session delegateQueue]; delegate = [session delegate]; if (nil != delegate) { [delegateQueue addOperationWithBlock: ^{ if (NSURLSessionTaskStateCompleted == [task state]) { return; } if ([delegate respondsToSelector: @selector(URLSession:task:didCompleteWithError:)]) { [(id)delegate URLSession: session task: task didCompleteWithError: error]; } [task setState: NSURLSessionTaskStateCompleted]; dispatch_async([session workQueue], ^{ [session removeTask: task]; }); }]; } else { if (NSURLSessionTaskStateCompleted == [task state]) { return; } [task setState: NSURLSessionTaskStateCompleted]; dispatch_async([session workQueue], ^{ [session removeTask: task]; }); } [task invalidateProtocol]; } - (void) URLProtocol: (NSURLProtocol *)protocol didLoadData: (NSData *)data { NSURLSessionTask *task = [protocol task]; NSURLSession *session; NSOperationQueue *delegateQueue; id delegate; NSAssert(nil != task, @"Missing task"); session = [task session]; delegate = [session delegate]; delegateQueue = [session delegateQueue]; switch (_cachePolicy) { case NSURLCacheStorageAllowed: case NSURLCacheStorageAllowedInMemoryOnly: { if (nil != _cacheableData) { [_cacheableData addObject: data]; } break; } case NSURLCacheStorageNotAllowed: break; } if (nil != delegate && [task isKindOfClass: [NSURLSessionDataTask class]] && [delegate respondsToSelector: @selector(URLSession:dataTask:didReceiveData:)]) { [delegateQueue addOperationWithBlock: ^{ [(id)delegate URLSession: session dataTask: (NSURLSessionDataTask*)task didReceiveData: data]; }]; } } - (void) URLProtocol: (NSURLProtocol *)protocol didReceiveAuthenticationChallenge: (NSURLAuthenticationChallenge *)challenge { //FIXME } - (void) URLProtocol: (NSURLProtocol *)protocol didReceiveResponse: (NSURLResponse *)response cacheStoragePolicy: (NSURLCacheStoragePolicy)policy { NSURLSessionTask *task = [protocol task]; NSURLSession *session; NSAssert(nil != task, @"Missing task"); [task setResponse: response]; session = [task session]; if (![task isKindOfClass: [NSURLSessionDataTask class]]) { return; } _cachePolicy = policy; if (nil != [[session configuration] URLCache]) { switch (policy) { case NSURLCacheStorageAllowed: case NSURLCacheStorageAllowedInMemoryOnly: ASSIGN(_cacheableData, [NSMutableArray array]); ASSIGN(_cacheableResponse, response); break; case NSURLCacheStorageNotAllowed: break; } } id delegate = [session delegate]; if (nil != delegate) { [[session delegateQueue] addOperationWithBlock: ^{ if ([delegate respondsToSelector: @selector (URLSession:dataTask:didReceiveResponse:completionHandler:)]) { NSURLSessionDataTask *dataTask = (NSURLSessionDataTask*)task; [(id)delegate URLSession: session dataTask: dataTask didReceiveResponse: response completionHandler: ^(NSURLSessionResponseDisposition disposition) { NSLog(@"Ignoring disposition from completion handler."); }]; } }]; } } - (void) URLProtocol: (NSURLProtocol *)protocol wasRedirectedToRequest: (NSURLRequest *)request redirectResponse: (NSURLResponse *)redirectResponse { NSAssert(NO, @"The NSURLSession implementation doesn't currently handle redirects directly."); } - (NSURLProtectionSpace*) _protectionSpaceFrom: (NSHTTPURLResponse*)response { NSURLProtectionSpace *space = nil; NSString *auth; auth = [[response allHeaderFields] objectForKey: @"WWW-Authenticate"]; if (nil != auth) { NSURL *url = [response URL]; NSString *host = [url host]; NSNumber *port = [url port]; NSString *scheme = [url scheme]; NSRange range; NSString *realm; NSString *method; if (nil == host) host = @""; if (nil == port) port = [NSNumber numberWithInt: 80]; method = [[auth componentsSeparatedByString: @" "] firstObject]; range = [auth rangeOfString: @"realm="]; realm = range.length > 0 ? [auth substringFromIndex: NSMaxRange(range)] : @""; space = AUTORELEASE([[NSURLProtectionSpace alloc] initWithHost: host port: [port integerValue] protocol: scheme realm: realm authenticationMethod: method]); } return space; } - (void) URLProtocolDidFinishLoading: (NSURLProtocol *)protocol { NSURLSessionTask *task = [protocol task]; NSURLSession *session; NSHTTPURLResponse *urlResponse; NSURLCache *cache; NSOperationQueue *delegateQueue; id delegate; NSAssert(nil != task, @"Missing task"); session = [task session]; urlResponse = (NSHTTPURLResponse*)[task response]; if ([urlResponse statusCode] == 401) { NSURLProtectionSpace *space; if (nil != (space = [self _protectionSpaceFrom: urlResponse])) { } } delegate = [session delegate]; delegateQueue = [session delegateQueue]; if (nil != (cache = [[session configuration] URLCache]) && [task isKindOfClass: [NSURLSessionDataTask class]] && nil != _cacheableData && nil != _cacheableResponse) { NSCachedURLResponse *cacheable; NSMutableData *data; NSEnumerator *e; NSData *d; data = [NSMutableData data]; e = [_cacheableData objectEnumerator]; while (nil != (d = [e nextObject])) { [data appendData: d]; } cacheable = [[NSCachedURLResponse alloc] initWithResponse: urlResponse data: data userInfo: nil storagePolicy: _cachePolicy]; [cache storeCachedResponse: cacheable forDataTask: (NSURLSessionDataTask*)task]; RELEASE(cacheable); } if (nil != delegate) { // Send delegate with temporary fileURL if ([task isKindOfClass: [NSURLSessionDownloadTask class]] && [delegate respondsToSelector: @selector(URLSession:downloadTask:didFinishDownloadingToURL:)]) { id downloadDelegate; NSURLSessionDownloadTask *downloadTask; NSURL *fileURL; downloadDelegate = (id)delegate; downloadTask = (NSURLSessionDownloadTask *)task; fileURL = [NSURLProtocol propertyForKey: @"tempFileURL" inRequest: [protocol request]]; [delegateQueue addOperationWithBlock: ^{ [downloadDelegate URLSession: session downloadTask: downloadTask didFinishDownloadingToURL: fileURL]; }]; } [delegateQueue addOperationWithBlock: ^{ if (NSURLSessionTaskStateCompleted == [task state]) { return; } if ([delegate respondsToSelector: @selector(URLSession:task:didCompleteWithError:)]) { [(id)delegate URLSession: session task: task didCompleteWithError: nil]; } [task setState: NSURLSessionTaskStateCompleted]; dispatch_async([session workQueue], ^{ [session removeTask: task]; }); }]; } else { if (NSURLSessionTaskStateCompleted != [task state]) { [task setState: NSURLSessionTaskStateCompleted]; dispatch_async([session workQueue], ^{ [session removeTask: task]; }); } } [task invalidateProtocol]; } - (void) URLProtocol: (NSURLProtocol *)protocol didCancelAuthenticationChallenge: (NSURLAuthenticationChallenge *)challenge { //FIXME } @end @implementation NSURLSessionTask { NSURLSession *_session; NSLock *_protocolLock; NSURLSessionTaskProtocolState _protocolState; NSURLProtocol *_protocol; NSMutableArray *_protocolBag; Class _protocolClass; BOOL _hasTriggeredResume; } - (instancetype) initWithSession: (NSURLSession*)session request: (NSURLRequest*)request taskIdentifier: (NSUInteger)identifier { NSEnumerator *e; Class protocolClass; if (nil != (self = [super init])) { NSData *data; NSInputStream *stream; /* * Only retain the session once the -resume method is called * and release the session as the last thing done once the * task has completed. This avoids a retain loop causing * session and tasks to be leaked. */ _session = session; ASSIGN(_originalRequest, request); ASSIGN(_currentRequest, request); if ([(data = [request HTTPBody]) length] > 0) { _knownBody = [[GSURLSessionTaskBody alloc] initWithData: data]; } else if (nil != (stream = [request HTTPBodyStream])) { _knownBody = [[GSURLSessionTaskBody alloc] initWithInputStream: stream]; } _taskIdentifier = identifier; #if HAVE_DISPATCH_QUEUE_CREATE_WITH_TARGET _workQueue = dispatch_queue_create_with_target("org.gnustep.NSURLSessionTask.WorkQueue", DISPATCH_QUEUE_SERIAL, [session workQueue]); #else _workQueue = dispatch_queue_create("org.gnustep.NSURLSessionTask.WorkQueue", DISPATCH_QUEUE_SERIAL); dispatch_set_target_queue(_workQueue, [session workQueue]); #endif _state = NSURLSessionTaskStateSuspended; _suspendCount = 1; _protocolLock = [[NSLock alloc] init]; _protocolState = NSURLSessionTaskProtocolStateToBeCreated; _protocol = nil; _hasTriggeredResume = NO; e = [[[session configuration] protocolClasses] objectEnumerator]; while (nil != (protocolClass = [e nextObject])) { if ([protocolClass canInitWithRequest: request]) { _protocolClass = protocolClass; } } NSAssert(nil != _protocolClass, @"Unsupported protocol"); } return self; } - (void) dealloc { DESTROY(_originalRequest); DESTROY(_currentRequest); DESTROY(_response); DESTROY(_taskDescription); DESTROY(_error); DESTROY(_protocolLock); DESTROY(_protocol); DESTROY(_protocolBag); DESTROY(_knownBody); [super dealloc]; } - (NSURLSessionTaskState) updateTaskState { if (0 == _suspendCount) { _state = NSURLSessionTaskStateRunning; } else { _state = NSURLSessionTaskStateSuspended; } return _state; } - (NSUInteger) taskIdentifier { return _taskIdentifier; } - (NSURLRequest*) originalRequest { return _originalRequest; } - (NSURLRequest*) currentRequest { return _currentRequest; } - (NSURLResponse*) response { return _response; } - (void) setResponse: (NSURLResponse*)response { ASSIGN(_response, response); } - (int64_t) countOfBytesReceived { return _countOfBytesReceived; } - (int64_t) countOfBytesSent { return _countOfBytesSent; } - (int64_t) countOfBytesExpectedToSend { return _countOfBytesExpectedToSend; } - (int64_t) countOfBytesExpectedToReceive { return _countOfBytesExpectedToReceive; } - (NSString*) taskDescription { return _taskDescription; } - (void) setTaskDescription: (NSString*)taskDescription { ASSIGN(_taskDescription, taskDescription); } - (NSURLSessionTaskState) state { return _state; } - (NSError*) error { return _error; } - (BOOL) isSuspendedAfterResume { return _hasTriggeredResume && (_state == NSURLSessionTaskStateSuspended); } - (void) cancel { dispatch_sync(_workQueue, ^{ if (!(NSURLSessionTaskStateRunning == _state || NSURLSessionTaskStateSuspended == _state)) { return; } _state = NSURLSessionTaskStateCanceling; [self getProtocolWithCompletion: ^(NSURLProtocol *protocol) { dispatch_async(_workQueue, ^{ _error = [[NSError alloc] initWithDomain: NSURLErrorDomain code: NSURLErrorCancelled userInfo: nil]; if (nil != protocol) { id client; [protocol stopLoading]; if (nil != (client = [protocol client])) { [client URLProtocol: protocol didFailWithError: _error]; } } }); }]; }); } - (void) suspend { dispatch_sync(_workQueue, ^{ if (NSURLSessionTaskStateCanceling == _state || NSURLSessionTaskStateCompleted == _state) { return; } _suspendCount++; [self updateTaskState]; if (1 == _suspendCount) { [self getProtocolWithCompletion: ^(NSURLProtocol *protocol){ dispatch_async(_workQueue, ^{ if (nil != protocol) { [protocol stopLoading]; } }); }]; } }); } - (void) resume { /* * Properly retain the session to keep a reference * to the task. This ensures correct API behaviour. */ RETAIN(_session); dispatch_sync(_workQueue, ^{ if (NSURLSessionTaskStateCanceling == _state || NSURLSessionTaskStateCompleted == _state) { return; } if (_suspendCount > 0) { _suspendCount--; } [self updateTaskState]; if (0 == _suspendCount) { _hasTriggeredResume = YES; [self getProtocolWithCompletion: ^(NSURLProtocol* protocol) { dispatch_async(_workQueue, ^{ if (_suspendCount != 0 || NSURLSessionTaskStateCanceling == _state || NSURLSessionTaskStateCompleted == _state) { return; } if (nil != protocol) { [protocol startLoading]; } else if (nil == _error) { NSDictionary *userInfo; _NSURLProtocolClient *client; userInfo = [NSDictionary dictionaryWithObjectsAndKeys: [_originalRequest URL], NSURLErrorFailingURLErrorKey, [[_originalRequest URL] absoluteString], NSURLErrorFailingURLStringErrorKey, nil]; _error = [[NSError alloc] initWithDomain: NSURLErrorDomain code: NSURLErrorUnsupportedURL userInfo: userInfo]; client = AUTORELEASE([[_NSURLProtocolClient alloc] init]); [client task: self didFailWithError: _error]; } }); }]; } }); } - (id) copyWithZone: (NSZone*)zone { NSURLSessionTask *copy = [[[self class] alloc] init]; if (copy) { copy->_taskIdentifier = _taskIdentifier; copy->_originalRequest = [_originalRequest copyWithZone: zone]; copy->_currentRequest = [_currentRequest copyWithZone: zone]; copy->_response = [_response copyWithZone: zone]; copy->_countOfBytesReceived = _countOfBytesReceived; copy->_countOfBytesSent = _countOfBytesSent; copy->_countOfBytesExpectedToSend = _countOfBytesExpectedToSend; copy->_countOfBytesExpectedToReceive = _countOfBytesExpectedToReceive; copy->_taskDescription = [_taskDescription copyWithZone: zone]; copy->_state = _state; copy->_error = [_error copyWithZone: zone]; copy->_session = _session; copy->_workQueue = _workQueue; copy->_suspendCount = _suspendCount; copy->_protocolLock = [_protocolLock copy]; } return copy; } - (void) getProtocolWithCompletion: (void (^)(NSURLProtocol* protocol))completion { [_protocolLock lock]; switch (_protocolState) { case NSURLSessionTaskProtocolStateToBeCreated: { NSURLCache *cache; NSURLRequestCachePolicy cachePolicy; NSCachedURLResponse *cachedResponse; cache = [[_session configuration] URLCache]; cachePolicy = [[self currentRequest] cachePolicy]; if (nil != cache && [self isUsingLocalCacheWithPolicy: cachePolicy] && [self isKindOfClass: [NSURLSessionDataTask class]]) { ASSIGN(_protocolBag, [NSMutableArray array]); [_protocolBag addObject: completion]; _protocolState = NSURLSessionTaskProtocolStateAwaitingCacheReply; [_protocolLock unlock]; cachedResponse = [cache cachedResponseForDataTask: (NSURLSessionDataTask*)self]; _protocol = [[_protocolClass alloc] initWithTask: self cachedResponse: cachedResponse client: nil]; [self satisfyProtocolRequest]; } else { _protocol = [[_protocolClass alloc] initWithTask: self cachedResponse: nil client: nil]; _protocolState = NSURLSessionTaskProtocolStateExisting; [_protocolLock unlock]; completion(_protocol); } break; } case NSURLSessionTaskProtocolStateAwaitingCacheReply: { [_protocolBag addObject: completion]; [_protocolLock unlock]; break; } case NSURLSessionTaskProtocolStateExisting: { [_protocolLock unlock]; completion(_protocol); break; } case NSURLSessionTaskProtocolStateInvalidated: { [_protocolLock unlock]; completion(nil); break; } } } - (void) satisfyProtocolRequest { [_protocolLock lock]; switch (_protocolState) { case NSURLSessionTaskProtocolStateToBeCreated: { _protocolState = NSURLSessionTaskProtocolStateExisting; [_protocolLock unlock]; break; } case NSURLSessionTaskProtocolStateAwaitingCacheReply: { _protocolState = NSURLSessionTaskProtocolStateExisting; [_protocolLock unlock]; void (^callback)(NSURLProtocol*); for (int i = 0; i < [_protocolBag count]; i++) { callback = [_protocolBag objectAtIndex: i]; callback(_protocol); } DESTROY(_protocolBag); break; } case NSURLSessionTaskProtocolStateExisting: case NSURLSessionTaskProtocolStateInvalidated: { [_protocolLock unlock]; break; } } } - (BOOL) isUsingLocalCacheWithPolicy: (NSURLRequestCachePolicy)policy { switch (policy) { case NSURLRequestUseProtocolCachePolicy: return true; case NSURLRequestReloadIgnoringLocalCacheData: return false; case NSURLRequestReturnCacheDataElseLoad: return true; case NSURLRequestReturnCacheDataDontLoad: return true; case NSURLRequestReloadIgnoringLocalAndRemoteCacheData: case NSURLRequestReloadRevalidatingCacheData: return false; default: return false; } } - (NSURLSession*) session { return _session; } - (void) setState: (NSURLSessionTaskState)state { _state = state; } - (void) invalidateProtocol { [_protocolLock lock]; _protocolState = NSURLSessionTaskProtocolStateInvalidated; DESTROY(_protocol); /* * Release session at the end of the task * and not when -dealloc is called. */ DESTROY(_session); [_protocolLock unlock]; } @end @implementation NSURLSessionDataTask @end @implementation NSURLSessionUploadTask @end @implementation NSURLSessionDownloadTask @end @implementation NSURLSessionConfiguration static NSURLSessionConfiguration *def = nil; + (void) initialize { if (nil == def) { def = [NSURLSessionConfiguration new]; } } + (NSURLSessionConfiguration*) defaultSessionConfiguration { return AUTORELEASE([def copy]); } - (instancetype) init { if (nil != (self = [super init])) { _protocolClasses = [[NSArray alloc] initWithObjects: [GSHTTPURLProtocol class], nil]; _HTTPMaximumConnectionsPerHost = 1; _HTTPShouldUsePipelining = YES; _HTTPCookieAcceptPolicy = NSHTTPCookieAcceptPolicyNever; _HTTPCookieStorage = nil; _HTTPShouldSetCookies = NO; _HTTPAdditionalHeaders = nil; _HTTPMaximumConnectionLifetime = 0; // Zero or less means default } return self; } - (void) dealloc { DESTROY(_HTTPAdditionalHeaders); DESTROY(_HTTPCookieStorage); DESTROY(_protocolClasses); DESTROY(_URLCache); DESTROY(_URLCredentialStorage); [super dealloc]; } - (NSURLCache*) URLCache { return _URLCache; } - (void) setURLCache: (NSURLCache*)cache { ASSIGN(_URLCache, cache); } - (void) setURLCredentialStorage: (NSURLCredentialStorage*)storage { ASSIGN(_URLCredentialStorage, storage); } - (NSURLRequestCachePolicy) requestCachePolicy { return _requestCachePolicy; } - (void) setRequestCachePolicy: (NSURLRequestCachePolicy)policy { _requestCachePolicy = policy; } - (NSArray*) protocolClasses { return _protocolClasses; } - (NSInteger) HTTPMaximumConnectionsPerHost { return _HTTPMaximumConnectionsPerHost; } - (void) setHTTPMaximumConnectionsPerHost: (NSInteger)n { _HTTPMaximumConnectionsPerHost = n; } - (NSInteger) HTTPMaximumConnectionLifetime { return _HTTPMaximumConnectionLifetime; } - (void) setHTTPMaximumConnectionLifetime: (NSInteger)n { _HTTPMaximumConnectionLifetime = n; } - (BOOL) HTTPShouldUsePipelining { return _HTTPShouldUsePipelining; } - (void) setHTTPShouldUsePipelining: (BOOL)flag { _HTTPShouldUsePipelining = flag; } - (NSHTTPCookieAcceptPolicy) HTTPCookieAcceptPolicy { return _HTTPCookieAcceptPolicy; } - (void) setHTTPCookieAcceptPolicy: (NSHTTPCookieAcceptPolicy)policy { _HTTPCookieAcceptPolicy = policy; } - (NSHTTPCookieStorage*) HTTPCookieStorage { return _HTTPCookieStorage; } - (void) setHTTPCookieStorage: (NSHTTPCookieStorage*)storage { ASSIGN(_HTTPCookieStorage, storage); } - (BOOL) HTTPShouldSetCookies { return _HTTPShouldSetCookies; } - (void) setHTTPShouldSetCookies: (BOOL)flag { _HTTPShouldSetCookies = flag; } - (NSDictionary*) HTTPAdditionalHeaders { return _HTTPAdditionalHeaders; } - (void) setHTTPAdditionalHeaders: (NSDictionary*)headers { ASSIGN(_HTTPAdditionalHeaders, headers); } - (NSURLRequest*) configureRequest: (NSURLRequest*)request { return [self setCookiesOnRequest: request]; } - (NSURLRequest*) setCookiesOnRequest: (NSURLRequest*)request { NSMutableURLRequest *r = AUTORELEASE([request mutableCopy]); if (_HTTPShouldSetCookies) { if (nil != _HTTPCookieStorage && nil != [request URL]) { NSArray *cookies = [_HTTPCookieStorage cookiesForURL: [request URL]]; if (nil != cookies && [cookies count] > 0) { NSDictionary *cookiesHeaderFields; NSString *cookieValue; cookiesHeaderFields = [NSHTTPCookie requestHeaderFieldsWithCookies: cookies]; cookieValue = [cookiesHeaderFields objectForKey: @"Cookie"]; if (nil != cookieValue && [cookieValue length] > 0) { [r setValue: cookieValue forHTTPHeaderField: @"Cookie"]; } } } } return AUTORELEASE([r copy]); } - (NSURLCredentialStorage*) URLCredentialStorage { return _URLCredentialStorage; } - (id) copyWithZone: (NSZone*)zone { NSURLSessionConfiguration *copy = [[[self class] alloc] init]; if (copy) { copy->_URLCache = [_URLCache copy]; copy->_URLCredentialStorage = [_URLCredentialStorage copy]; copy->_protocolClasses = [_protocolClasses copyWithZone: zone]; copy->_HTTPMaximumConnectionsPerHost = _HTTPMaximumConnectionsPerHost; copy->_HTTPShouldUsePipelining = _HTTPShouldUsePipelining; copy->_HTTPCookieAcceptPolicy = _HTTPCookieAcceptPolicy; copy->_HTTPCookieStorage = [_HTTPCookieStorage copy]; copy->_HTTPShouldSetCookies = _HTTPShouldSetCookies; copy->_HTTPAdditionalHeaders = [_HTTPAdditionalHeaders copyWithZone: zone]; } return copy; } @end gnustep-base-1.29.0/Source/NSUUID.m000066400000000000000000000153611435650067400166450ustar00rootroot00000000000000/** NSUUID - Representation of universally unique identifiers. Copyright (C) 2013 Free Software Foundation, Inc. Written by: Graham Lee Created: November 2013 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #import "Foundation/NSCoder.h" #import "Foundation/NSUUID.h" #import "GNUstepBase/NSData+GNUstepBase.h" static int uuid_from_string(const char *string, unsigned char *uuid); static void string_from_uuid(const unsigned char *uuid, char *string); static int random_uuid(unsigned char *uuid); static const int kUUIDStringLength = 36; static const int kUnformattedUUIDStringLength = 32; static const int kUUIDByteCount = 16; /** * A representation of universally unique identifiers (UUIDs). */ @implementation NSUUID + (instancetype) UUID { id u; u = [[self alloc] init]; return AUTORELEASE(u); } - (instancetype) init { gsuuid_t localUUID; int result; result = random_uuid(localUUID); if (result != 0) { DESTROY(self); return nil; } return [self initWithUUIDBytes: localUUID]; } - (instancetype) initWithUUIDString: (NSString *)string { gsuuid_t localUUID; const char *cString; int parseResult; cString = [string cStringUsingEncoding: NSASCIIStringEncoding]; parseResult = uuid_from_string(cString, localUUID); if (parseResult != 0) { DESTROY(self); return nil; } return [self initWithUUIDBytes: localUUID]; } - (instancetype) initWithUUIDBytes: (gsuuid_t)bytes { if (nil != (self = [super init])) { memcpy(self->uuid, bytes, kUUIDByteCount); } return self; } - (NSString *) UUIDString { char uuidChars[kUUIDStringLength + 1]; NSString *string; string_from_uuid(uuid, uuidChars); string = [[NSString alloc] initWithCString: uuidChars encoding: NSASCIIStringEncoding]; return AUTORELEASE(string); } - (void) getUUIDBytes: (gsuuid_t)bytes { memcpy(bytes, uuid, kUUIDByteCount); } - (BOOL) isEqual: (NSUUID *)other { int comparison; if (![other isKindOfClass: [NSUUID class]]) { return NO; } comparison = memcmp(self->uuid, other->uuid, kUUIDByteCount); return (comparison == 0) ? YES : NO; } - (NSUInteger) hash { // more expensive than casting but that's not alignment-safe NSUInteger uintegerArray[kUUIDByteCount/sizeof(NSUInteger)]; NSUInteger hash = 0; int i; memcpy(uintegerArray, uuid, kUUIDByteCount); for (i = 0; i < kUUIDByteCount/sizeof(NSUInteger); i++) { hash ^= uintegerArray[i]; } return hash; } - (id) copyWithZone: (NSZone *)zone { return RETAIN(self); } static NSString *uuidKey = @"uuid"; - (void) encodeWithCoder: (NSCoder *)aCoder { if ([aCoder allowsKeyedCoding]) { [aCoder encodeBytes: uuid length: kUUIDByteCount forKey: uuidKey]; } else { [aCoder encodeBytes: uuid length: kUUIDByteCount]; } } - (id) initWithCoder: (NSCoder *)aDecoder { if (nil != (self = [super init])) { NSUInteger decodedLength = 0; const uint8_t *decodedUUID; if ([aDecoder allowsKeyedCoding]) { decodedUUID = [aDecoder decodeBytesForKey: uuidKey returnedLength: &decodedLength]; } else { decodedUUID = [aDecoder decodeBytesWithReturnedLength: &decodedLength]; } if (decodedLength == kUUIDByteCount) { memcpy(uuid, decodedUUID, kUUIDByteCount); } else { DESTROY(self); return nil; } } return self; } @end static int uuid_from_string(const char *string, unsigned char *uuid) { char unformatted[kUnformattedUUIDStringLength]; int i; if (NULL == string || strlen(string) != kUUIDStringLength) { return -1; } for (i = 0; i < kUUIDStringLength; i++) { char c = string[i]; if ((i == 8) || (i == 13) || (i == 18) || (i == 23)) { if (c != '-') { return -1; } } else { if (!isxdigit(c)) { return -1; } } } memcpy(unformatted, string, 8); memcpy(unformatted+8, string+9, 4); memcpy(unformatted+12, string+14, 4); memcpy(unformatted+16, string+19, 4); memcpy(unformatted+20, string+24, 12); for (i = 0; i < kUUIDByteCount; i++) { int hi = unformatted[2*i]; int lo = unformatted[2*i+1]; if (isdigit(hi)) { hi -= '0'; } else if (isupper(hi)) { hi = hi - 'A' + 10; } else { hi = hi - 'a' + 10; } if (isdigit(lo)) { lo -= '0'; } else if (isupper(lo)) { lo = lo - 'A' + 10; } else { lo = lo - 'a' + 10; } uuid[i] = (hi << 4) | lo; } return 0; } static void string_from_uuid(const unsigned char *uuid, char *string) { char unformatted[kUnformattedUUIDStringLength]; int i; for (i = 0; i < kUUIDByteCount; i++) { unsigned char byte = uuid[i]; char thisPair[3]; snprintf(thisPair, 3, "%02X", byte); memcpy(unformatted + 2*i, thisPair, 2); } memcpy(string, unformatted, 8); string[8] = '-'; memcpy(string + 9, unformatted + 8, 4); string[13] = '-'; memcpy(string + 14, unformatted + 12, 4); string[18] = '-'; memcpy(string + 19, unformatted + 16, 4); string[23] = '-'; memcpy(string + 24, unformatted + 20, 12); string[kUUIDStringLength] = '\0'; } static int random_uuid(unsigned char *uuid) { NSData *rnd; unsigned char timeByte; unsigned char sequenceByte; /* Only supporting Version 4 UUIDs (see RFC4122, section 4.4), * consistent with Apple. Other variants suffer from privacy * problems (and are more work...) */ rnd = [NSData dataWithRandomBytesOfLength: kUUIDByteCount]; if (nil == rnd) { return -1; } memcpy(uuid, [rnd bytes], kUUIDByteCount); /* as required by the RFC, bits 48-51 should contain 0b0100 (4) * and bits 64-65 should contain 0b01 (1) */ timeByte = uuid[6]; timeByte = (4 << 8) + (timeByte & 0x0f); uuid[7] = timeByte; sequenceByte = uuid[8]; sequenceByte = (1 << 6) + (sequenceByte & 0x3f); uuid[8] = sequenceByte; return 0; } gnustep-base-1.29.0/Source/NSUbiquitousKeyValueStore.m000066400000000000000000000155161435650067400227350ustar00rootroot00000000000000/** Interface for NSUbiquitousKeyValueStore Copyright (C) 2019 Free Software Foundation, Inc. Written by: Gregory John Casamento Created: July 3 2019 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSCoder.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSException.h" #import "Foundation/NSKeyedArchiver.h" #import #import #import #import #import #import #import static NSUbiquitousKeyValueStore *_sharedUbiquitousKeyValueStore = nil; @implementation NSUbiquitousKeyValueStore : NSObject // Getting the Shared Instance - (id) init { if ((self = [super init]) != nil) { } return self; } + (NSUbiquitousKeyValueStore *) defaultStore { if (_sharedUbiquitousKeyValueStore == nil) { NSString *storeClassName = [[NSUserDefaults standardUserDefaults] stringForKey: @"GSUbiquitousKeyValueStoreClass"]; Class klass = (storeClassName != nil) ? NSClassFromString(storeClassName) : NSClassFromString(@"GSSimpleUbiquitousKeyValueStore"); _sharedUbiquitousKeyValueStore = [[klass alloc] init]; if (_sharedUbiquitousKeyValueStore == nil) { NSLog(@"Cannot instantiate class shared key store"); } } return _sharedUbiquitousKeyValueStore; } // Getting Values // Returns the array associated with the specified key. - (NSArray *) arrayForKey: (NSString *)key { return (NSArray *)[self objectForKey: key]; } // Returns the Boolean value associated with the specified key. - (BOOL) boolForKey: (NSString *)key { return (BOOL)([[self objectForKey: key] boolValue] == 1); } // Returns the data object associated with the specified key. - (NSData*) dataForKey: (NSString *)key { return (NSData *)[self objectForKey: key]; } // Returns the dictionary object associated with the specified key. - (NSDictionary *) dictionaryForKey: (NSString *)key { return (NSDictionary *)[self objectForKey: key]; } // Returns the double value associated with the specified key. - (double) doubleForKey: (NSString *)key { return [[self objectForKey: key] doubleValue]; } // Returns the long long value associated with the specified key. - (long long) longLongForKey: (NSString *)key { return [[self objectForKey: key] longLongValue]; } // Returns the object associated with the specified key. - (id) objectForKey: (NSString *)key { [self subclassResponsibility: _cmd]; return nil; } // Returns the string associated with the specified key. - (NSString *) stringForKey: (NSString *)key { return (NSString *)[self objectForKey: key]; } // Setting Values // Sets an array object for the specified key in the key-value store. - (void) setArray: (NSArray *)array forKey: (NSString *)key { [self setObject: array forKey: key]; } // Sets a Boolean value for the specified key in the key-value store. - (void) setBool: (BOOL)flag forKey: (NSString *)key { NSNumber *num = [NSNumber numberWithBool: flag]; [self setObject: num forKey: key]; } // Sets a data object for the specified key in the key-value store. - (void) setData: (NSData *)data forKey: (NSString *)key { [self setObject: data forKey: key]; } // Sets a dictionary object for the specified key in the key-value store. - (void) setDictionary: (NSDictionary *)dict forKey: (NSString *)key { [self setObject: dict forKey: key]; } // Sets a double value for the specified key in the key-value store. - (void) setDouble: (double)val forKey: (NSString *)key { NSNumber *num = [NSNumber numberWithDouble: val]; [self setObject: num forKey: key]; } // Sets a long long value for the specified key in the key-value store. - (void) setLongLong: (long long)val forKey: (NSString *)key { NSNumber *num = [NSNumber numberWithLongLong: val]; [self setObject: num forKey: key]; } // Sets an object for the specified key in the key-value store. - (void) setObject: (id) obj forKey: (NSString *)key { [self subclassResponsibility: _cmd]; } // Sets a string object for the specified key in the key-value store. - (void) setString: (NSString *)string forKey: (NSString *)key { [self setObject: string forKey: key]; } // Explicitly Synchronizing In-Memory Key-Value Data to Disk // Explicitly synchronizes in-memory keys and values with those stored on disk. - (void) synchronize { [self subclassResponsibility: _cmd]; } // Removing Keys // Removes the value associated with the specified key from the key-value store. - (void) removeObjectForKey: (NSString *)key { [self subclassResponsibility: _cmd]; } // Retrieving the Current Keys and Values // A dictionary containing all of the key-value pairs in the key-value store. - (NSDictionary *) dictionaryRepresentation { [self subclassResponsibility: _cmd]; return nil; } @end @interface GSSimpleUbiquitousKeyValueStore : NSUbiquitousKeyValueStore { NSMutableDictionary *_dict; } @end @implementation GSSimpleUbiquitousKeyValueStore - (id) init { self = [super init]; if(self != nil) { _dict = [[NSMutableDictionary alloc] initWithCapacity: 10]; } return self; } // Returns the object associated with the specified key. - (id) objectForKey: (NSString *)key { return [_dict objectForKey: key]; } // Sets an object for the specified key in the key-value store. - (void) setObject: (id) obj forKey: (NSString *)key { [_dict setObject: obj forKey: key]; } // Explicitly Synchronizing In-Memory Key-Value Data to Disk // Explicitly synchronizes in-memory keys and values with those stored on disk. - (void) synchronize { } // Removing Keys // Removes the value associated with the specified key from the key-value store. - (void) removeObjectForKey: (NSString *)key { [_dict removeObjectForKey: key]; } // Retrieving the Current Keys and Values // A dictionary containing all of the key-value pairs in the key-value store. - (NSDictionary *) dictionaryRepresentation { return _dict; } @end @interface GSAWSUbiquitousKeyValueStore : NSUbiquitousKeyValueStore { } @end @implementation GSAWSUbiquitousKeyValueStore @end gnustep-base-1.29.0/Source/NSUnarchiver.m000066400000000000000000001265011435650067400202040ustar00rootroot00000000000000/** Implementation of NSUnarchiver for GNUstep Copyright (C) 1998 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: October 1998 This file is part of the GNUstep Base Library. 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 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 USA. NSUnarchiver class reference $Date$ $Revision$ */ #import "common.h" #if !defined (__GNU_LIBOBJC__) # include #endif #define EXPOSE_NSUnarchiver_IVARS 1 #import "Foundation/NSDictionary.h" #import "Foundation/NSException.h" #import "Foundation/NSByteOrder.h" /* * Setup for inline operation of arrays. */ #define GSI_ARRAY_NO_RETAIN 1 #define GSI_ARRAY_NO_RELEASE 1 #define GSI_ARRAY_TYPES GSUNION_OBJ|GSUNION_SEL|GSUNION_PTR #include "GNUstepBase/GSIArray.h" #define _IN_NSUNARCHIVER_M #import "Foundation/NSArchiver.h" #undef _IN_NSUNARCHIVER_M #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSCoder.h" #import "Foundation/NSData.h" #import "Foundation/NSArray.h" @class NSDataMalloc; @interface NSDataMalloc : NSObject // Help the compiler @end static const char* typeToName1(char type) { switch (type) { case _C_CLASS: return "class"; case _C_ID: return "object"; case _C_SEL: return "selector"; case _C_CHR: return "char"; case _C_UCHR: return "unsigned char"; case _C_SHT: return "short"; case _C_USHT: return "unsigned short"; case _C_INT: return "int"; case _C_UINT: return "unsigned int"; case _C_LNG: return "long"; case _C_ULNG: return "unsigned long"; case _C_LNG_LNG: return "long long"; case _C_ULNG_LNG: return "unsigned long long"; case _C_FLT: return "float"; case _C_DBL: return "double"; #if defined(_C_BOOL) && (!defined(__GNUC__) || __GNUC__ > 2) case _C_BOOL: return "_Bool"; #endif case _C_PTR: return "pointer"; case _C_CHARPTR: return "cstring"; case _C_ARY_B: return "array"; case _C_STRUCT_B: return "struct"; default: { static char buf1[32]; static char buf2[32]; static char *bufptr = buf1; if (bufptr == buf1) { bufptr = buf2; } else { bufptr = buf1; } snprintf(bufptr, 32, "unknown type info - 0x%x", type); return bufptr; } } } static const char* typeToName2(char type) { switch (type & _GSC_MASK) { case _GSC_CID: return "class (encoded as id)"; case _GSC_CLASS: return "class"; case _GSC_ID: return "object"; case _GSC_SEL: return "selector"; case _GSC_CHR: return "char"; case _GSC_UCHR: return "unsigned char"; case _GSC_SHT: return "short"; case _GSC_USHT: return "unsigned short"; case _GSC_INT: return "int"; case _GSC_UINT: return "unsigned int"; case _GSC_LNG: return "long"; case _GSC_ULNG: return "unsigned long"; case _GSC_LNG_LNG: return "long long"; case _GSC_ULNG_LNG: return "unsigned long long"; case _GSC_FLT: return "float"; case _GSC_DBL: return "double"; case _GSC_BOOL: return "_Bool"; case _GSC_PTR: return "pointer"; case _GSC_CHARPTR: return "cstring"; case _GSC_ARY_B: return "array"; case _GSC_STRUCT_B: return "struct"; default: { static char buf1[32]; static char buf2[32]; static char *bufptr = buf1; if (bufptr == buf1) { bufptr = buf2; } else { bufptr = buf1; } snprintf(bufptr, 32, "unknown type info - 0x%x", type); return bufptr; } } } /* * There are thirtyone possible basic types. We reserve a type of zero * to mean that no information is specified. The slots in this array * MUST correspond to the definitions in NSData.h */ static char type_map[32] = { 0, _C_CHR, _C_UCHR, _C_SHT, _C_USHT, _C_INT, _C_UINT, _C_LNG, _C_ULNG, _C_LNG_LNG, _C_ULNG_LNG, _C_FLT, _C_DBL, #if defined(_C_BOOL) && (!defined(__GNUC__) || __GNUC__ > 2) _C_BOOL, #else 0, #endif 0, 0, _C_ID, _C_CLASS, _C_SEL, _C_PTR, _C_CHARPTR, _C_ARY_B, _C_STRUCT_B, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; static inline BOOL typeCheck(char t1, char t2) { if (type_map[(t2 & _GSC_MASK)] != t1) { /* * HACK ... allow int/long/longlong types to be used interchangably * as the ObjC compiler currently uses quadword (q/Q) encoding for * integer types on some 64bit systems, so the i/l/q/I/L/Q encodings * can vary. */ char c = type_map[(t2 & _GSC_MASK)]; char s1; char s2; switch (t1) { case _C_SHT: s1 = _GSC_S_SHT; break; case _C_USHT: s1 = _GSC_S_SHT; break; case _C_INT: s1 = _GSC_S_INT; break; case _C_UINT: s1 = _GSC_S_INT; break; case _C_LNG: s1 = _GSC_S_LNG; break; case _C_ULNG: s1 = _GSC_S_LNG; break; case _C_LNG_LNG: s1 = _GSC_S_LNG_LNG; break; case _C_ULNG_LNG: s1 = _GSC_S_LNG_LNG; break; default: s1 = 0; } switch (t2) { case _C_SHT: s2 = _GSC_S_SHT; break; case _C_USHT: s2 = _GSC_S_SHT; break; case _C_INT: s2 = _GSC_S_INT; break; case _C_UINT: s2 = _GSC_S_INT; break; case _C_LNG: s2 = _GSC_S_LNG; break; case _C_ULNG: s2 = _GSC_S_LNG; break; case _C_LNG_LNG: s2 = _GSC_S_LNG_LNG; break; case _C_ULNG_LNG: s2 = _GSC_S_LNG_LNG; break; default: s2 = 0; } if ((c == _C_INT || c == _C_LNG || c == _C_LNG_LNG) && (t1 == _C_INT || t1 == _C_LNG || t1 == _C_LNG_LNG)) return s1 == s2 ? YES : NO; if ((c == _C_UINT || c == _C_ULNG || c == _C_ULNG_LNG) && (t1 == _C_UINT || t1 == _C_ULNG || t1 == _C_ULNG_LNG)) return s1 == s2 ? YES : NO; /* HACK also allow float and double to be used interchangably as MacOS-X * intorduced CGFloat, which may be aither a float or a double. */ if ((c == _C_FLT || c == _C_DBL) && (t1 == _C_FLT || t1 == _C_DBL)) return NO; [NSException raise: NSInternalInconsistencyException format: @"expected %s and got %s", typeToName1(t1), typeToName2(t2)]; } return YES; } #define PREFIX "GNUstep archive" static SEL desSel; static SEL tagSel; static SEL dValSel; @interface NSUnarchiverClassInfo : NSObject { @public NSString *original; NSString *name; Class class; } + (id) newWithName: (NSString*)n; - (void) mapToClass: (Class)c withName: (NSString*)name; @end @implementation NSUnarchiverClassInfo + (id) newWithName: (NSString*)n { NSUnarchiverClassInfo *info; info = (NSUnarchiverClassInfo*)NSAllocateObject(self,0,NSDefaultMallocZone()); if (info) { info->original = [n copyWithZone: NSDefaultMallocZone()]; } return info; } - (void) dealloc { RELEASE(original); if (name) { RELEASE(name); } NSDeallocateObject(self); GSNOSUPERDEALLOC; } - (void) mapToClass: (Class)c withName: (NSString*)n { ASSIGN(name, n); class = c; } @end /* * Dictionary used by NSUnarchiver class to keep track of * NSUnarchiverClassInfo objects used to map classes by name when * unarchiving. */ static NSMutableDictionary *clsDict; /* Class information */ @interface NSUnarchiverObjectInfo : NSUnarchiverClassInfo { @public NSInteger version; NSUnarchiverClassInfo *overrides; } @end static inline Class mapClassObject(NSUnarchiverObjectInfo *info) { if (info->overrides == nil) { info->overrides = [clsDict objectForKey: info->original]; } if (info->overrides) { return info->overrides->class; } else { return info->class; } } static inline NSString* mapClassName(NSUnarchiverObjectInfo *info) { if (info->overrides == nil) { info->overrides = [clsDict objectForKey: info->original]; } if (info->overrides) { return info->overrides->name; } else { return info->name; } } @implementation NSUnarchiverObjectInfo @end /** *

This class reconstructs objects from an archive.


* Re-using the archiver *

* The -resetUnarchiverWithData:atIndex: method lets you re-use * the archive to decode a new data object or, in conjunction * with the 'cursor' method (which reports the current decoding * position in the archive), decode a second archive that exists * in the data object after the first one. *

* Subclassing with different input format.

* NSUnarchiver normally reads directly from an [NSData] * object using the methods - * * -deserializeTypeTag:andCrossRef:atCursor: * * to decode type tags for data items, the tag is the * first byte of the character encoding string for the * data type (as provided by '@encode(xxx)'), possibly * with the top bit set to indicate that what follows is * a crossreference to an item already encoded.
* Also decode a crossreference number either to identify the * following item, or to refer to a previously encoded item. * Objects, Classes, Selectors, CStrings and Pointer items * have crossreference encoding, other types do not.
*
* [NSData-deserializeDataAt:ofObjCType:atCursor:context:] * * to decode all other information. * *
*

* NSUnarchiver normally uses other [NSData] methods to read * the archive header information from within the method: * [-deserializeHeaderAt:version:classes:objects:pointers:] * to read a fixed size header including archiver version * (obtained by [self systemVersion]) and crossreference * table sizes. *

*

* To subclass NSUnarchiver, you must implement your own * versions of the four methods above, and override the 'directDataAccess' * method to return NO so that the archiver knows to use your serialization * methods rather than those in the [NSData] object. *

*/ @implementation NSUnarchiver static Class NSDataMallocClass; static unsigned encodingVersion; + (void) initialize { if ([self class] == [NSUnarchiver class]) { NSArchiver *archiver = [NSArchiver new]; encodingVersion = [archiver systemVersion]; [archiver release]; desSel = @selector(deserializeDataAt:ofObjCType:atCursor:context:); tagSel = @selector(deserializeTypeTag:andCrossRef:atCursor:); dValSel = @selector(decodeValueOfObjCType:at:); clsDict = [[NSMutableDictionary alloc] initWithCapacity: 200]; NSDataMallocClass = [NSDataMalloc class]; } } /** * Creates an NSUnarchiver to read from anObject and returns result of sending * [NSCoder -decodeObject] to it. */ + (id) unarchiveObjectWithData: (NSData*)anObject { NSUnarchiver *unarchiver; id obj; unarchiver = [[self alloc] initForReadingWithData: anObject]; NS_DURING { obj = [unarchiver decodeObject]; } NS_HANDLER { obj = nil; RELEASE(unarchiver); [localException raise]; } NS_ENDHANDLER RELEASE(unarchiver); return obj; } /** * Creates an NSUnarchiver to read from path and returns result of sending * [NSCoder -decodeObject] to it. */ + (id) unarchiveObjectWithFile: (NSString*)path { NSData *d = [NSDataMallocClass dataWithContentsOfFile: path]; if (d != nil) { return [self unarchiveObjectWithData: d]; } return nil; } - (void) dealloc { RELEASE(data); RELEASE(objSave); RELEASE(objDict); if (clsMap) { NSZone *z = clsMap->zone; GSIArrayClear(clsMap); GSIArrayClear(objMap); GSIArrayClear(ptrMap); NSZoneFree(z, (void*)clsMap); } [super dealloc]; } /** * Set up to read objects from data buffer anObject. */ - (id) initForReadingWithData: (NSData*)anObject { if (anObject == nil) { [NSException raise: NSInvalidArgumentException format: @"nil data passed to initForReadingWithData:"]; } self = [super init]; if (self) { dValImp = [self methodForSelector: dValSel]; zone = [self zone]; /* * If we are not deserializing directly from the data object * then we cache our own deserialisation methods. */ if ([self directDataAccess] == NO) { src = self; /* Default object to handle serialisation */ desImp = [src methodForSelector: desSel]; tagImp = (void (*)(id, SEL, unsigned char*, unsigned*, unsigned*)) [src methodForSelector: tagSel]; } /* * objDict is a dictionary of objects for mapping classes of * one name to be those of another name! It also handles * keeping track of the version numbers that the classes were * encoded with. */ objDict = [[NSMutableDictionary allocWithZone: zone] initWithCapacity: 200]; /* * objSave is an array used purely to ensure that objects * we decode persist until the end of the decoding. */ objSave = [[NSMutableArray allocWithZone: zone] initWithCapacity: 200]; NS_DURING { [self resetUnarchiverWithData: anObject atIndex: 0]; } NS_HANDLER { DESTROY(self); [localException raise]; } NS_ENDHANDLER } return self; } - (void) decodeArrayOfObjCType: (const char*)type count: (NSUInteger)expected at: (void*)buf { NSUInteger i; NSUInteger offset = 0; unsigned int size = (unsigned int)objc_sizeof_type(type); unsigned char info; unsigned char ainfo; unsigned char amask; NSUInteger count; (*tagImp)(src, tagSel, &info, 0, &cursor); if ([self systemVersion] == 12402) { uint8_t c; /* Unpack variable length count. */ count = 0; for (;;) { if (count * 128 < count) { [NSException raise: NSInternalInconsistencyException format: @"overflow in array count"]; } count *= 128; (*desImp)(src, desSel, &c, @encode(uint8_t), &cursor, nil); if (c & 128) { count += (c & 127); } else { count += c; break; } } } else { uint32_t c; (*desImp)(src, desSel, &c, @encode(uint32_t), &cursor, nil); count = c; if (0xffffffff == c) { (*desImp)(src, desSel, &count, @encode(NSUInteger), &cursor, nil); } } if (info != _GSC_ARY_B) { [NSException raise: NSInternalInconsistencyException format: @"expected array and got %s", typeToName2(info)]; } if (count != expected) { [NSException raise: NSInternalInconsistencyException format: @"expected array count %"PRIuPTR" and got %"PRIuPTR"", expected, count]; } switch (*type) { case _C_ID: info = _GSC_NONE; break; case _C_CHR: info = _GSC_CHR; break; case _C_UCHR: info = _GSC_UCHR; break; case _C_SHT: info = _GSC_SHT; break; case _C_USHT: info = _GSC_USHT; break; case _C_INT: info = _GSC_INT; break; case _C_UINT: info = _GSC_UINT; break; case _C_LNG: info = _GSC_LNG; break; case _C_ULNG: info = _GSC_ULNG; break; case _C_LNG_LNG: info = _GSC_LNG_LNG; break; case _C_ULNG_LNG: info = _GSC_ULNG_LNG; break; case _C_FLT: info = _GSC_FLT; break; case _C_DBL: info = _GSC_DBL; break; #if defined(_C_BOOL) && (!defined(__GNUC__) || __GNUC__ > 2) case _C_BOOL: info = _GSC_BOOL; break; #endif default: info = _GSC_NONE; break; } if (info == _GSC_NONE) { for (i = 0; i < count; i++) { (*dValImp)(self, dValSel, type, (char*)buf + offset); offset += size; } return; } (*tagImp)(src, tagSel, &ainfo, 0, &cursor); amask = (ainfo & _GSC_MASK); /* If we have a perfect type match or we are coding a class as an ID, * we can just decode the array simply. */ if (info == amask) { for (i = 0; i < count; i++) { (*desImp)(src, desSel, (char*)buf + offset, type, &cursor, nil); offset += size; } return; } /* This will raise an exception if the types don't match at all. */ typeCheck(*type, ainfo); /* We fall through to here only when we have to decode a value * whose natural size on this system is not the same as on the * machine on which the archive was created. */ if (*type == _C_FLT) { for (i = 0; i < count; i++) { double d; (*desImp)(src, desSel, &d, @encode(double), &cursor, nil); *(float*)(buf + offset) = (float)d; offset += size; } } else if (*type == _C_DBL) { for (i = 0; i < count; i++) { float f; (*desImp)(src, desSel, &f, @encode(float), &cursor, nil); *(double*)(buf + offset) = (double)f; offset += size; } } else if (*type == _C_SHT || *type == _C_INT || *type == _C_LNG || *type == _C_LNG_LNG) { int64_t big; int64_t max; int64_t min; switch (size) { case 1: max = INT8_MAX; min = INT8_MIN; break; case 2: max = INT16_MAX; min = INT16_MAX; break; case 4: max = INT32_MAX; min = INT32_MIN; break; default: max = INT64_MAX; min = INT64_MIN; } for (i = 0; i < count; i++) { void *address = (void*)buf + offset; switch (ainfo & _GSC_SIZE) { case _GSC_I16: /* Encoded as 16-bit */ { int16_t val; (*desImp)(src, desSel, &val, @encode(int16_t), &cursor, nil); big = val; break; } case _GSC_I32: /* Encoded as 32-bit */ { int32_t val; (*desImp)(src, desSel, &val, @encode(int32_t), &cursor, nil); big = val; break; } case _GSC_I64: /* Encoded as 64-bit */ { (*desImp)(src, desSel, &big, @encode(int64_t), &cursor, nil); break; } default: [NSException raise: NSGenericException format: @"invalid size in archive"]; } /* * Now we copy from the big value to the destination location. */ switch (size) { case 1: *(int8_t*)address = (int8_t)big; break; case 2: *(int16_t*)address = (int16_t)big; break; case 4: *(int32_t*)address = (int32_t)big; break; default: *(int64_t*)address = big; } if (big < min || big > max) { NSLog(@"Lost information converting large decoded value"); } offset += size; } } else { uint64_t big; uint64_t max; switch (size) { case 1: max = UINT8_MAX; break; case 2: max = UINT16_MAX; break; case 4: max = UINT32_MAX; break; default: max = UINT64_MAX; } for (i = 0; i < count; i++) { void *address = (void*)buf + offset; switch (info & _GSC_SIZE) { case _GSC_I16: /* Encoded as 16-bit */ { uint16_t val; (*desImp)(src, desSel, &val, @encode(uint16_t), &cursor, nil); big = val; break; } case _GSC_I32: /* Encoded as 32-bit */ { uint32_t val; (*desImp)(src, desSel, &val, @encode(uint32_t), &cursor, nil); big = val; break; } case _GSC_I64: /* Encoded as 64-bit */ { (*desImp)(src, desSel, &big, @encode(uint64_t), &cursor, nil); break; } default: [NSException raise: NSGenericException format: @"invalid size in archive"]; } /* * Now we copy from the big value to the destination location. */ switch (size) { case 1: *(uint8_t*)address = (uint8_t)big; break; case 2: *(uint16_t*)address = (uint16_t)big; break; case 4: *(uint32_t*)address = (uint32_t)big; break; case 8: *(uint64_t*)address = big; } if (big > max) { NSLog(@"Lost information converting large decoded value"); } offset += size; } } } static inline int scalarSize(char type) { switch (type) { case _C_SHT: case _C_USHT: return _GSC_S_SHT; case _C_INT: case _C_UINT: return _GSC_S_INT; case _C_LNG: case _C_ULNG: return _GSC_S_LNG; case _C_LNG_LNG: case _C_ULNG_LNG: return _GSC_S_LNG_LNG; default: [NSException raise: NSInvalidArgumentException format: @"scalarSize() called with non-scalar type"]; } return -1; } - (void) decodeValueOfObjCType: (const char*)type at: (void*)address { unsigned xref; unsigned char info; (*tagImp)(src, tagSel, &info, &xref, &cursor); switch (info & _GSC_MASK) { case _GSC_ID: { id obj; typeCheck(*type, _GSC_ID); /* * Special case - a zero crossref value size is a nil pointer. */ if ((info & _GSC_SIZE) == 0) { obj = nil; } else { if (info & _GSC_XREF) { if (xref >= GSIArrayCount(objMap)) { [NSException raise: NSInternalInconsistencyException format: @"object crossref missing - %d", xref]; } obj = GSIArrayItemAtIndex(objMap, xref).obj; /* * If it's a cross-reference, we need to retain it in * order to give the appearance that it's actually a * new object. */ IF_NO_ARC(RETAIN(obj);) } else { Class c; id rep; if (xref != GSIArrayCount(objMap)) { [NSException raise: NSInternalInconsistencyException format: @"extra object crossref - %d", xref]; } (*dValImp)(self, dValSel, @encode(Class), &c); if (c == 0) { [NSException raise: NSInternalInconsistencyException format: @"decoded nil class"]; } obj = [c allocWithZone: zone]; GSIArrayAddItem(objMap, (GSIArrayItem)obj); rep = [obj initWithCoder: self]; if (rep != obj) { obj = rep; GSIArraySetItemAtIndex(objMap, (GSIArrayItem)obj, xref); } rep = [obj awakeAfterUsingCoder: self]; if (rep != obj) { obj = rep; GSIArraySetItemAtIndex(objMap, (GSIArrayItem)obj, xref); } /* * The objMap does not retain objects, so in order to * be sure that a decoded object is not deallocated by * anything before it is needed (because it is decoded * later as a cross reference) we store it in objSave. */ if (obj != nil) { [objSave addObject: obj]; } } } *(id*)address = obj; return; } case _GSC_CLASS: { Class c; NSUnarchiverObjectInfo *classInfo; Class dummy; if (*type != _C_ID) { typeCheck(*type, _GSC_CLASS); } /* * Special case - a zero crossref value size is a nil pointer. */ if ((info & _GSC_SIZE) == 0) { *(SEL*)address = 0; return; } if (info & _GSC_XREF) { if (xref >= GSIArrayCount(clsMap)) { [NSException raise: NSInternalInconsistencyException format: @"class crossref missing - %d", xref]; } classInfo = (NSUnarchiverObjectInfo*) GSIArrayItemAtIndex(clsMap, xref).obj; *(Class*)address = mapClassObject(classInfo); return; } while ((info & _GSC_MASK) == _GSC_CLASS) { unsigned cver; NSString *className; uint16_t nameLength; if (xref != GSIArrayCount(clsMap)) { [NSException raise: NSInternalInconsistencyException format: @"extra class crossref - %d", xref]; } /* * A class is encoded as a 16-bit length, a sequence of * characters providing its name, then a version number. */ (*desImp)(src, desSel, &nameLength, @encode(uint16_t), &cursor, nil); if (nameLength == 0) { className = nil; } else { char name[nameLength+1]; [src deserializeBytes: name length: nameLength atCursor: &cursor]; name[nameLength] = '\0'; className = [[NSString alloc] initWithUTF8String: name]; } (*desImp)(src, desSel, &cver, @encode(unsigned), &cursor, nil); if (className == 0) { NSLog(@"[%s %s] decoded nil class name", class_getName([self class]), sel_getName(_cmd)); className = @"_NSUnarchiverUnknownClass"; } classInfo = [objDict objectForKey: className]; if (nil == classInfo) { classInfo = [NSUnarchiverObjectInfo newWithName: className]; c = NSClassFromString(className); /* * Show a warning, if the class name that's being used to * build the class causes NSClassFromString to return nil. * This means that the class is unknown to the runtime. */ if (c == nil) { NSLog(@"Unable to find class named '%@'", className); } [classInfo mapToClass: c withName: className]; [objDict setObject: classInfo forKey: className]; RELEASE(classInfo); } RELEASE(className); classInfo->version = (NSInteger)cver; GSIArrayAddItem(clsMap, (GSIArrayItem)((id)classInfo)); *(Class*)address = mapClassObject(classInfo); /* * Point the address to a dummy location and read the * next tag - if it is another class, loop to get it. */ address = &dummy; (*tagImp)(src, tagSel, &info, &xref, &cursor); } if (info != _GSC_NONE) { [NSException raise: NSInternalInconsistencyException format: @"class list improperly terminated"]; } return; } case _GSC_SEL: { SEL sel; typeCheck(*type, _GSC_SEL); /* * Special case - a zero crossref value size is a nil pointer. */ if ((info & _GSC_SIZE) == 0) { *(SEL*)address = 0; return; } if (info & _GSC_XREF) { if (xref >= GSIArrayCount(ptrMap)) { [NSException raise: NSInternalInconsistencyException format: @"sel crossref missing - %d", xref]; } sel = GSIArrayItemAtIndex(ptrMap, xref).sel; } else { if (xref != GSIArrayCount(ptrMap)) { [NSException raise: NSInternalInconsistencyException format: @"extra sel crossref - %d", xref]; } (*desImp)(src, desSel, &sel, @encode(SEL), &cursor, nil); GSIArrayAddItem(ptrMap, (GSIArrayItem)sel); } *(SEL*)address = sel; return; } case _GSC_ARY_B: { int count; typeCheck(*type, _GSC_ARY_B); count = atoi(++type); while (isdigit(*type)) { type++; } [self decodeArrayOfObjCType: type count: count at: address]; return; } case _GSC_STRUCT_B: { struct objc_struct_layout layout; typeCheck(*type, _GSC_STRUCT_B); objc_layout_structure (type, &layout); while (objc_layout_structure_next_member (&layout)) { unsigned offset; unsigned align; const char *ftype; objc_layout_structure_get_info (&layout, &offset, &align, &ftype); (*dValImp)(self, dValSel, ftype, (char*)address + offset); } return; } case _GSC_PTR: { typeCheck(*type, _GSC_PTR); /* * Special case - a zero crossref value size is a nil pointer. */ if ((info & _GSC_SIZE) == 0) { *(void**)address = 0; return; } if (info & _GSC_XREF) { if (xref >= GSIArrayCount(ptrMap)) { [NSException raise: NSInternalInconsistencyException format: @"ptr crossref missing - %d", xref]; } *(void**)address = GSIArrayItemAtIndex(ptrMap, xref).ptr; } else { unsigned size; if (GSIArrayCount(ptrMap) != xref) { [NSException raise: NSInternalInconsistencyException format: @"extra ptr crossref - %d", xref]; } /* * Allocate memory for object to be decoded into and * add it to the crossref map. */ size = objc_sizeof_type(++type); *(void**)address = GSAutoreleasedBuffer(size); GSIArrayAddItem(ptrMap, (GSIArrayItem)*(void**)address); /* * Decode value and add memory to map for crossrefs. */ (*dValImp)(self, dValSel, type, *(void**)address); } return; } case _GSC_CHARPTR: { typeCheck(*type, _GSC_CHARPTR); /* * Special case - a zero crossref value size is a nil pointer. */ if ((info & _GSC_SIZE) == 0) { *(char**)address = 0; return; } if (info & _GSC_XREF) { if (xref >= GSIArrayCount(ptrMap)) { [NSException raise: NSInternalInconsistencyException format: @"string crossref missing - %d", xref]; } *(char**)address = GSIArrayItemAtIndex(ptrMap, xref).str; } else { if (xref != GSIArrayCount(ptrMap)) { [NSException raise: NSInternalInconsistencyException format: @"extra string crossref - %d", xref]; } (*desImp)(src, desSel, address, @encode(char*), &cursor, nil); GSIArrayAddItem(ptrMap, (GSIArrayItem)*(void**)address); } return; } case _GSC_CHR: case _GSC_UCHR: /* Encoding of chars is not consistant across platforms, so we loosen the type checking a little */ if (*type != type_map[_GSC_CHR] && *type != type_map[_GSC_UCHR]) { [NSException raise: NSInternalInconsistencyException format: @"expected %s and got %s", typeToName1(*type), typeToName2(info)]; } (*desImp)(src, desSel, address, type, &cursor, nil); return; case _GSC_SHT: case _GSC_USHT: if (YES == typeCheck(*type, info & _GSC_MASK) && (info & _GSC_SIZE) == scalarSize(*type)) { (*desImp)(src, desSel, address, type, &cursor, nil); return; } break; case _GSC_INT: case _GSC_UINT: if (YES == typeCheck(*type, info & _GSC_MASK) && (info & _GSC_SIZE) == scalarSize(*type)) { (*desImp)(src, desSel, address, type, &cursor, nil); return; } break; case _GSC_LNG: case _GSC_ULNG: if (YES == typeCheck(*type, info & _GSC_MASK) && (info & _GSC_SIZE) == scalarSize(*type)) { (*desImp)(src, desSel, address, type, &cursor, nil); return; } break; case _GSC_LNG_LNG: case _GSC_ULNG_LNG: if (YES == typeCheck(*type, info & _GSC_MASK) && (info & _GSC_SIZE) == scalarSize(*type)) { (*desImp)(src, desSel, address, type, &cursor, nil); return; } break; case _GSC_FLT: if (YES == typeCheck(*type, _GSC_FLT) && *type == _C_FLT) { (*desImp)(src, desSel, address, type, &cursor, nil); } else { float val; /* We found a float when expecting a double ... handle it. */ (*desImp)(src, desSel, &val, @encode(float), &cursor, nil); *(double*)address = (double)val; } return; case _GSC_DBL: if (YES == typeCheck(*type, _GSC_DBL) && *type == _C_DBL) { (*desImp)(src, desSel, address, type, &cursor, nil); } else { double val; /* We found a double when expecting a float ... handle it. */ (*desImp)(src, desSel, &val, @encode(double), &cursor, nil); *(float*)address = (float)val; } return; case _GSC_BOOL: if (*type != type_map[_GSC_BOOL]) { [NSException raise: NSInternalInconsistencyException format: @"expected %s and got %s", typeToName1(*type), typeToName2(info)]; } (*desImp)(src, desSel, address, type, &cursor, nil); return; default: [NSException raise: NSInternalInconsistencyException format: @"read unknown type info - %d", info]; } { uint8_t size; /* * We fall through to here only when we have to decode a value * whose natural size on this system is not the same as on the * machine on which the archive was created. */ switch (*type) { case _C_SHT: case _C_USHT: size = sizeof(short); break; case _C_INT: case _C_UINT: size = sizeof(int); break; case _C_LNG: case _C_ULNG: size = sizeof(long); break; case _C_LNG_LNG: case _C_ULNG_LNG: size = sizeof(long long); break; default: size = 1; } /* * First, we read the data and convert it to the largest size * this system can support. */ if (*type == _C_SHT || *type == _C_INT || *type == _C_LNG || *type == _C_LNG_LNG) { int64_t big; switch (info & _GSC_SIZE) { case _GSC_I16: /* Encoded as 16-bit */ { int16_t val; (*desImp)(src, desSel, &val, @encode(int16_t), &cursor, nil); big = val; break; } case _GSC_I32: /* Encoded as 32-bit */ { int32_t val; (*desImp)(src, desSel, &val, @encode(int32_t), &cursor, nil); big = val; break; } case _GSC_I64: /* Encoded as 64-bit */ { (*desImp)(src, desSel, &big, @encode(int64_t), &cursor, nil); break; } default: /* A 128-bit value */ { big = 0; [NSException raise: NSInternalInconsistencyException format: @"Archiving of 128bit integer not allowed"]; } } /* * Now we copy from the big value to the destination location. */ switch (size) { case 1: *(int8_t*)address = (int8_t)big; if (big > 127 || big < -128) { NSLog(@"Lost information converting decoded value to int8_t"); } return; case 2: *(int16_t*)address = (int16_t)big; if (big > 32767 || big < -32768) { NSLog(@"Lost information converting decoded value to int16_t"); } return; case 4: *(int32_t*)address = (int32_t)big; if (big > 2147483647 || big < -2147483648LL) { NSLog(@"Lost information converting decoded value to int32_t"); } return; case 8: *(int64_t*)address = big; return; default: [NSException raise: NSInternalInconsistencyException format: @"type/size information error"]; } } else { uint64_t big; switch (info & _GSC_SIZE) { case _GSC_I16: /* Encoded as 16-bit */ { uint16_t val; (*desImp)(src, desSel, &val, @encode(uint16_t), &cursor, nil); big = val; break; } case _GSC_I32: /* Encoded as 32-bit */ { uint32_t val; (*desImp)(src, desSel, &val, @encode(uint32_t), &cursor, nil); big = val; break; } case _GSC_I64: /* Encoded as 64-bit */ { (*desImp)(src, desSel, &big, @encode(uint64_t), &cursor, nil); break; } default: /* A 128-bit value */ { big = 0; [NSException raise: NSInternalInconsistencyException format: @"Archiving of 128bit integer not allowed"]; } } /* * Now we copy from the big value to the destination location. */ switch (size) { case 1: if (big & ~0xffLL) { NSLog(@"Lost information converting decoded value to uint8_t"); } *(uint8_t*)address = (uint8_t)big; return; case 2: if (big & ~0xffffLL) { NSLog(@"Lost information converting decoded value to uint16_t"); } *(uint16_t*)address = (uint16_t)big; return; case 4: if (big & ~0xffffffffLL) { NSLog(@"Lost information converting decoded value to uint32_t"); } *(uint32_t*)address = (uint32_t)big; return; case 8: *(uint64_t*)address = big; return; default: [NSException raise: NSInternalInconsistencyException format: @"type/size information error"]; } } } } - (NSData*) decodeDataObject { unsigned l; (*dValImp)(self, dValSel, @encode(unsigned int), &l); if (l) { unsigned char c; (*dValImp)(self, dValSel, @encode(unsigned char), &c); if (c == 0) { void *b; NSData *d; b = NSZoneMalloc(zone, l); [self decodeArrayOfObjCType: @encode(unsigned char) count: l at: b]; d = [[NSData allocWithZone: zone] initWithBytesNoCopy: b length: l]; IF_NO_ARC(AUTORELEASE(d);) return d; } else { [NSException raise: NSInternalInconsistencyException format: @"Decoding data object with unknown type"]; } } return [NSData data]; } /** * Returns whether have currently read through all of data buffer or file * this unarchiver was initialized with. */ - (BOOL) isAtEnd { return (cursor >= [data length]); } /** * Returns zone unarchived objects will be allocated from. */ - (NSZone*) objectZone { return zone; } /** * Sets zone unarchived objects will be allocated from. */ - (void) setObjectZone: (NSZone*)aZone { zone = aZone; } /** * Returns system version archive was encoded by. */ - (unsigned) systemVersion { return version; } /** * Returns class name unarchivers will use to instantiate encoded objects * when they report their class name as nameInArchive. */ + (NSString*) classNameDecodedForArchiveClassName: (NSString*)nameInArchive { NSUnarchiverClassInfo *info = [clsDict objectForKey: nameInArchive]; NSString *alias; if (info == nil) { return nil; } alias = info->name; if (alias) { return alias; } return nameInArchive; } /** * Sets class name unarchivers will use to instantiate encoded objects * when they report their class name as nameInArchive. This can be used * to support backwards compatibility across class name changes. */ + (void) decodeClassName: (NSString*)nameInArchive asClassName: (NSString*)trueName { Class c; c = objc_lookUpClass([trueName cString]); if (c == 0) { [NSException raise: NSInvalidArgumentException format: @"can't find class %@", trueName]; } else { NSUnarchiverClassInfo *info = [clsDict objectForKey: nameInArchive]; if (info == nil) { info = [NSUnarchiverClassInfo newWithName: nameInArchive]; [clsDict setObject: info forKey: nameInArchive]; RELEASE(info); } [info mapToClass: c withName: trueName]; } } /** * Returns class name this unarchiver uses to instantiate encoded objects * when they report their class name as nameInArchive. */ - (NSString*) classNameDecodedForArchiveClassName: (NSString*)nameInArchive { NSUnarchiverObjectInfo *info = [objDict objectForKey: nameInArchive]; NSString *alias; if (info == nil) { return nil; } alias = mapClassName(info); if (alias) { return alias; } return nameInArchive; } /** * Set class name this unarchiver uses to instantiate encoded objects * when they report their class name as nameInArchive. This can be used * to provide backward compatibility across class name changes. */ - (void) decodeClassName: (NSString*)nameInArchive asClassName: (NSString*)trueName { Class c; c = objc_lookUpClass([trueName cString]); if (c == 0) { [NSException raise: NSInvalidArgumentException format: @"can't find class %@", trueName]; } else { NSUnarchiverObjectInfo *info = [objDict objectForKey: nameInArchive]; if (info == nil) { info = [NSUnarchiverObjectInfo newWithName: nameInArchive]; [objDict setObject: info forKey: nameInArchive]; RELEASE(info); } [info mapToClass: c withName: trueName]; } } /** * Set unarchiver to replace anObject with replacement whenever it is * found decoded from the archive. */ - (void) replaceObject: (id)anObject withObject: (id)replacement { unsigned i; if (replacement == anObject) return; for (i = GSIArrayCount(objMap) - 1; i > 0; i--) { if (GSIArrayItemAtIndex(objMap, i).obj == anObject) { GSIArraySetItemAtIndex(objMap, (GSIArrayItem)replacement, i); return; } } [NSException raise: NSInvalidArgumentException format: @"object to be replaced does not exist"]; } - (NSInteger) versionForClassName: (NSString*)className { NSUnarchiverObjectInfo *info; info = [objDict objectForKey: className]; if (info == nil) { return (NSInteger)NSNotFound; } return info->version; } @end /** * Category for compatibility with old GNUstep encoding. */ @implementation NSUnarchiver (GNUstep) /** * Return current position within archive byte array. */ - (unsigned) cursor { return cursor; } /** * Prepare for reuse of the unarchiver to unpack a new archive, specified in * anObject, starting at pos. Reads archive header. */ - (void) resetUnarchiverWithData: (NSData*)anObject atIndex: (unsigned)pos { unsigned sizeC; unsigned sizeO; unsigned sizeP; if (anObject == nil) { [NSException raise: NSInvalidArgumentException format: @"nil passed to resetUnarchiverWithData:atIndex:"]; } if (data != anObject) { Class c; TEST_RELEASE(data); data = RETAIN(anObject); c = object_getClass(data); if (src != self) { src = data; if (c != dataClass) { /* * Cache methods for deserialising from the data object. */ desImp = [src methodForSelector: desSel]; tagImp = (void (*)(id, SEL, unsigned char*, unsigned*, unsigned*)) [src methodForSelector: tagSel]; } } dataClass = c; } /* * Read header including version and crossref table sizes. */ cursor = pos; [self deserializeHeaderAt: &cursor version: &version classes: &sizeC objects: &sizeO pointers: &sizeP]; if (version > encodingVersion) { [NSException raise: NSInvalidArgumentException format: @"Archive systemVersion (%u) not recognised", version]; } if (clsMap == 0) { /* * Allocate and initialise arrays to build crossref maps in. */ clsMap = NSZoneMalloc(zone, sizeof(GSIArray_t)*3); GSIArrayInitWithZoneAndCapacity(clsMap, zone, sizeC); GSIArrayAddItem(clsMap, (GSIArrayItem)(void*)0); objMap = &clsMap[1]; GSIArrayInitWithZoneAndCapacity(objMap, zone, sizeO); GSIArrayAddItem(objMap, (GSIArrayItem)(void*)0); ptrMap = &clsMap[2]; GSIArrayInitWithZoneAndCapacity(ptrMap, zone, sizeP); GSIArrayAddItem(ptrMap, (GSIArrayItem)(void*)0); } else { clsMap->count = 1; objMap->count = 1; ptrMap->count = 1; } [objDict removeAllObjects]; [objSave removeAllObjects]; } /** * Reads in header for GNUstep archive format. */ - (void) deserializeHeaderAt: (unsigned*)pos version: (unsigned*)v classes: (unsigned*)c objects: (unsigned*)o pointers: (unsigned*)p { unsigned plen = strlen(PREFIX); unsigned size = plen+36; char header[size+1]; [data getBytes: header range: NSMakeRange(*pos, size)]; *pos += size; header[size] = '\0'; if (strncmp(header, PREFIX, plen) != 0) { [NSException raise: NSInternalInconsistencyException format: @"Archive has wrong prefix"]; } if (sscanf(&header[plen], "%x:%x:%x:%x:", v, c, o, p) != 4) { [NSException raise: NSInternalInconsistencyException format: @"Archive has wrong prefix"]; } } /** * Returns YES. */ - (BOOL) directDataAccess { return YES; } @end gnustep-base-1.29.0/Source/NSUndoManager.m000066400000000000000000000712141435650067400202760ustar00rootroot00000000000000/** Implementation for NSUndoManager for GNUStep Copyright (C) 1998 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald This file is part of the GNUstep Base Library. 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 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 USA. NSUndoManager class reference $Date$ $Revision$ */ #import "common.h" #define EXPOSE_NSUndoManager_IVARS 1 #import "Foundation/NSArray.h" #import "Foundation/NSNotification.h" #import "Foundation/NSInvocation.h" #import "Foundation/NSException.h" #import "Foundation/NSRunLoop.h" #import "Foundation/NSUndoManager.h" /* * Private class for grouping undo/redo actions. */ @interface PrivateUndoGroup : NSObject { PrivateUndoGroup *parent; NSMutableArray *actions; NSString *actionName; } - (NSMutableArray*) actions; - (NSString*) actionName; - (void) addInvocation: (NSInvocation*)inv; - (id) initWithParent: (PrivateUndoGroup*)parent; - (void) orphan; - (PrivateUndoGroup*) parent; - (void) perform; - (BOOL) removeActionsForTarget: (id)target; - (void) setActionName: (NSString*)name; @end @implementation PrivateUndoGroup - (NSMutableArray*) actions { return actions; } - (NSString*) actionName { return actionName; } - (void) addInvocation: (NSInvocation*)inv { if (actions == nil) { actions = [[NSMutableArray alloc] initWithCapacity: 2]; } [actions addObject: inv]; } - (void) dealloc { RELEASE(actions); RELEASE(parent); RELEASE(actionName); [super dealloc]; } - (id) initWithParent: (PrivateUndoGroup*)p { self = [super init]; if (self) { parent = RETAIN(p); actions = nil; actionName = @""; } return self; } - (void) orphan { DESTROY(parent); } - (PrivateUndoGroup*) parent { return parent; } - (void) perform { if (actions != nil) { unsigned i = [actions count]; while (i-- > 0) { [[actions objectAtIndex: i] invoke]; } } } - (BOOL) removeActionsForTarget: (id)target { if (actions != nil) { unsigned i = [actions count]; while (i-- > 0) { NSInvocation *inv = [actions objectAtIndex: i]; if ([inv target] == target) { [actions removeObjectAtIndex: i]; } } if ([actions count] > 0) { return YES; } } return NO; } - (void) setActionName: (NSString *)name { ASSIGNCOPY(actionName,name); } @end /* * Private category for the method used to handle default grouping */ @interface NSUndoManager (Private) - (void) _begin; - (void) _loop: (id)arg; @end @implementation NSUndoManager (Private) /* This method is used to begin undo grouping internally. * It's necessary to have a different mechanism from the -beginUndoGrouping * because it seems that in MacOS X a call to -beginUndoGrouping when at the * top level will actually create two undo groups. */ - (void) _begin { PrivateUndoGroup *parent; parent = (PrivateUndoGroup*)_group; _group = [[PrivateUndoGroup alloc] initWithParent: parent]; if (_group == nil) { _group = parent; [NSException raise: NSInternalInconsistencyException format: @"beginUndoGrouping failed to greate group"]; } else { RELEASE(parent); if (_isUndoing == NO && _isRedoing == NO) [[NSNotificationCenter defaultCenter] postNotificationName: NSUndoManagerDidOpenUndoGroupNotification object: self]; } } - (void) _loop: (id)arg { if (_groupsByEvent && _group != nil) { [self endUndoGrouping]; } _runLoopGroupingPending = NO; } @end /** * NSUndoManager provides a general mechanism supporting implementation of * user action "undo" in applications. Essentially, it allows you to store * sequences of messages and receivers that need to be invoked to undo or * redo an action. The various methods in this class provide for grouping * of sets of actions, execution of undo or redo actions, and tuning behavior * parameters such as the size of the undo stack. Each application entity * with its own editing history (e.g., a document) should have its own undo * manager instance. Obtain an instance through a simple * [[NSUndoManager alloc] init] message. */ @implementation NSUndoManager /** * Starts a new grouping of undo actions which can be * atomically undone by an [-undo] invocation.
* This method posts an NSUndoManagerDidOpenUndoGroupNotification * upon creating the grouping.
* It first posts an NSUndoManagerCheckpointNotification * unless an undo is currently in progress.
* The order of these notifications is undefined, but the GNUstep * implementation currently mimics the observed order in MacOS X 10.5 */ - (void) beginUndoGrouping { /* It seems that MacOS X implicitly creates a top-level group if this * method is called when groupsByEvent is set and there is no existing * top level group. There is no checkpoint notification posted for the * implicit group creation. */ if (_group == nil && [self groupsByEvent]) { [self _begin]; // Start top level group } /* Post the checkpoint notification and THEN create the group. */ [[NSNotificationCenter defaultCenter] postNotificationName: NSUndoManagerCheckpointNotification object: self]; [self _begin]; // Start a new group } /** * Returns whether the receiver can service redo requests and * posts a NSUndoManagerCheckpointNotification. */ - (BOOL) canRedo { [[NSNotificationCenter defaultCenter] postNotificationName: NSUndoManagerCheckpointNotification object: self]; if ([_redoStack count] > 0) { return YES; } else { return NO; } } /** * Returns whether the receiver has any action groupings * on the stack to undo. It does not imply, that the * receiver is currently in a state to service an undo * request. Make sure [-endUndoGrouping] is invoked before * requesting either an [-undo] or an [-undoNestedGroup]. */ - (BOOL) canUndo { if ([_undoStack count] > 0) { return YES; } if (_group != nil && [[_group actions] count] > 0) { return YES; } return NO; } - (void) dealloc { [[NSRunLoop currentRunLoop] cancelPerformSelector: @selector(_loop:) target: self argument: nil]; RELEASE(_redoStack); RELEASE(_undoStack); RELEASE(_group); RELEASE(_modes); [super dealloc]; } /** * Disables the registration of operations with with either * [-registerUndoWithTarget:selector:object:] or * [-forwardInvocation:]. This method may be called multiple * times. Each will need to be paired to a call of * [-enableUndoRegistration] before registration is actually * reenabled. */ - (void) disableUndoRegistration { _disableCount++; } /** * Matches previous calls of to [-disableUndoRegistration]. * Only call this method to that end. Once all are matched, * the registration of [-registerUndoWithTarget:selector:object:] * and [-forwardInvocation:] are reenabled. If this method is * called without a matching -disableUndoRegistration, * it will raise an NSInternalInconsistencyException. */ - (void) enableUndoRegistration { if (_disableCount > 0) { _disableCount--; } else { [NSException raise: NSInternalInconsistencyException format: @"enableUndoRegistration without disable"]; } } /** * Matches previous calls of to [-beginUndoGrouping] and * puts the group on the undo stack. This method posts * an NSUndoManagerCheckpointNotification and * a NSUndoManagerWillCloseUndoGroupNotification. * If there was no matching call to -beginUndoGrouping, * this method will raise an NSInternalInconsistencyException. */ - (void) endUndoGrouping { PrivateUndoGroup *g; PrivateUndoGroup *p; if (_group == nil) { [NSException raise: NSInternalInconsistencyException format: @"endUndoGrouping without beginUndoGrouping"]; } [[NSNotificationCenter defaultCenter] postNotificationName: NSUndoManagerCheckpointNotification object: self]; if (_isUndoing == NO && _isRedoing == NO) [[NSNotificationCenter defaultCenter] postNotificationName: NSUndoManagerWillCloseUndoGroupNotification object: self]; g = (PrivateUndoGroup*)_group; p = RETAIN([g parent]); _group = p; [g orphan]; if (p == nil) { if (_isUndoing) { if (_levelsOfUndo > 0 && [_redoStack count] == _levelsOfUndo && [[g actions] count] > 0) { [_redoStack removeObjectAtIndex: 0]; } if (g != nil) { if ([[g actions] count] > 0) [_redoStack addObject: g]; } } else { if (_levelsOfUndo > 0 && [_undoStack count] == _levelsOfUndo && [[g actions] count] > 0) { [_undoStack removeObjectAtIndex: 0]; } if (g != nil) { if ([[g actions] count] > 0) [_undoStack addObject: g]; } } } else if ([g actions] != nil) { NSArray *a = [g actions]; unsigned i; for (i = 0; i < [a count]; i++) { [p addInvocation: [a objectAtIndex: i]]; } } RELEASE(g); } /** * Registers the invocation with the current undo grouping. * This method is part of the NSInvocation-based undo registration * as opposed to the simpler [-registerUndoWithTarget:selector:object:] * technique.
* You generally never invoke this method directly. * Instead invoke [-prepareWithInvocationTarget:] with the target of the * undo action and then invoke the targets method to undo the action * on the return value of -prepareWithInvocationTarget: * which actually is the undo manager. * The runtime will then fallback to -forwardInvocation: to do the actual * registration of the invocation. * The invocation will added to the current grouping.
* If the registrations have been disabled through [-disableUndoRegistration], * this method does nothing.
* Unless the receiver implicitly * groups operations by event, the this method must have been preceded * with a [-beginUndoGrouping] message. Otherwise it will raise an * NSInternalInconsistencyException.
* Unless this method is invoked as part of a [-undo] or [-undoNestedGroup] * processing, the redo stack is cleared.
* If the receiver [-groupsByEvent] and this is the first call to this * method since the last run loop processing, this method sets up * the receiver to process the [-endUndoGrouping] at the * end of the event loop. */ - (void) forwardInvocation: (NSInvocation*)anInvocation { if (_disableCount == 0) { if (_nextTarget == nil) { [NSException raise: NSInternalInconsistencyException format: @"forwardInvocation without preparation"]; } if (_group == nil) { if ([self groupsByEvent]) { [self _begin]; } else { [NSException raise: NSInternalInconsistencyException format: @"forwardInvocation without beginUndoGrouping"]; } } [anInvocation retainArgumentsIncludingTarget: NO]; [anInvocation setTarget: _nextTarget]; _nextTarget = nil; [_group addInvocation: anInvocation]; if (_isUndoing == NO && _isRedoing == NO && [_group actions] > 0) { [_redoStack removeAllObjects]; } if ((_runLoopGroupingPending == NO) && ([self groupsByEvent] == YES)) { [[NSRunLoop currentRunLoop] performSelector: @selector(_loop:) target: self argument: nil order: NSUndoCloseGroupingRunLoopOrdering modes: _modes]; _runLoopGroupingPending = YES; } } } /** * If the receiver was sent a [-prepareWithInvocationTarget:] and * the target's method hasn't been invoked on the receiver yet, this * method forwards the request to the target. * Otherwise or if the target didn't return a signature, the message * is sent to super. */ - (NSMethodSignature*) methodSignatureForSelector: (SEL)selector { NSMethodSignature *sig = nil; if (_nextTarget != nil) { sig = [_nextTarget methodSignatureForSelector: selector]; } if (sig == nil) { sig = [super methodSignatureForSelector: selector]; } return sig; } /** * Returns the current number of groupings. These are the current * groupings which can be nested, not the number of of groups on either * the undo or redo stack. */ - (NSInteger) groupingLevel { PrivateUndoGroup *g = (PrivateUndoGroup*)_group; int level = 0; while (g != nil) { level++; g = [g parent]; } return level; } /** * Returns whether the receiver currently groups undo * operations by events. When it does, so it implicitly * invokes [-beginUndoGrouping] upon registration of undo * operations and registers an internal call to insure * the invocation of [-endUndoGrouping] at the end of the * run loop. */ - (BOOL) groupsByEvent { return _groupsByEvent; } - (id) init { self = [super init]; if (self) { _redoStack = [[NSMutableArray alloc] initWithCapacity: 16]; _undoStack = [[NSMutableArray alloc] initWithCapacity: 16]; _groupsByEvent = YES; [self setRunLoopModes: [NSArray arrayWithObjects: NSDefaultRunLoopMode, nil]]; } return self; } /** * Returns whether the receiver is currently processing a redo. */ - (BOOL) isRedoing { return _isRedoing; } /** * Returns whether the receiver is currently processing an undo. */ - (BOOL) isUndoing { return _isUndoing; } /** * Returns whether the receiver will currently register undo operations. */ - (BOOL) isUndoRegistrationEnabled { if (_disableCount == 0) { return YES; } else { return NO; } } /** * Returns the maximum number of undo groupings the receiver will maintain. * The default value is 0 meaning the number is only limited by * memory availability. */ - (NSUInteger) levelsOfUndo { return _levelsOfUndo; } /** * Prepares the receiver to registers an invocation-based undo operation. * This method is part of the NSInvocation-based undo registration * as opposed to the simpler [-registerUndoWithTarget:selector:object:] * technique.
* You invoke this method with the target of the * undo action and then invoke the targets method to undo the action * on the return value of this invocation * which actually is the undo manager. * The runtime will then fallback to [-forwardInvocation:] to do the actual * registration of the invocation. */ - (id) prepareWithInvocationTarget: (id)target { _nextTarget = target; return self; } /** * Performs a redo of previous undo request by taking the top grouping * from the redo stack and invoking them. This method posts an * NSUndoManagerCheckpointNotification notification to allow the client * to process any pending changes before proceeding. If there are groupings * on the redo stack, the top object is popped off the stack and invoked * within a nested [-beginUndoGrouping]/[-endUndoGrouping]. During this * processing, the operations registered for undo are recorded on the undo * stack again.
*/ - (void) redo { NSString *name = nil; if (_isUndoing || _isRedoing) { [NSException raise: NSInternalInconsistencyException format: @"redo while undoing or redoing"]; } [[NSNotificationCenter defaultCenter] postNotificationName: NSUndoManagerCheckpointNotification object: self]; if ([_redoStack count] > 0) { PrivateUndoGroup *oldGroup; PrivateUndoGroup *groupToRedo; [[NSNotificationCenter defaultCenter] postNotificationName: NSUndoManagerWillRedoChangeNotification object: self]; groupToRedo = RETAIN([_redoStack lastObject]); [_redoStack removeLastObject]; name = [NSString stringWithString: [groupToRedo actionName]]; oldGroup = _group; _group = nil; _isRedoing = YES; [self _begin]; [groupToRedo perform]; RELEASE(groupToRedo); [self endUndoGrouping]; _isRedoing = NO; _group = oldGroup; [[_undoStack lastObject] setActionName: name]; [[NSNotificationCenter defaultCenter] postNotificationName: NSUndoManagerDidRedoChangeNotification object: self]; } } /** * If the receiver can perform a redo, this method returns * the action name previously associated with the top grouping with * [-setActionName:]. This name should identify the action to be redone. * If there are no items on the redo stack this method returns nil. * If no action name has been set, this method returns an empty string. */ - (NSString*) redoActionName { if ([self canRedo] == NO) { return nil; } return [[_redoStack lastObject] actionName]; } /** * Returns the full localized title of the actions to be displayed * as a menu item. This method first invokes [-redoActionName] and * passes it to [-redoMenuTitleForUndoActionName:] and returns the result. */ - (NSString*) redoMenuItemTitle { return [self redoMenuTitleForUndoActionName: [self redoActionName]]; } /** * Returns the localized title of the actions to be displayed * as a menu item identified by actionName, by appending a * localized command string like @"Redo <localized(actionName)>". */ - (NSString*) redoMenuTitleForUndoActionName: (NSString*)actionName { if (actionName) { if ([actionName isEqual: @""]) { return _(@"Redo"); } else { return [NSString stringWithFormat: @"%@ %@", _(@"Redo"), actionName]; } } return _(@"Redo"); } /** * Registers an undo operation. * This method is the simple target-action-based undo registration * as opposed to the sophisticated [-forwardInvocation:] * mechanism.
* You invoke this method with the target of the * undo action providing the selector which can perform the undo with * the provided object. The object is often a dictionary of the * identifying the attribute and their values before the change. The object * will be retained. The invocation will added to the current grouping.
* If the registrations have been disabled through [-disableUndoRegistration], * this method does nothing.
* Unless the receiver implicitly * groups operations by event, the this method must have been preceded * with a [-beginUndoGrouping] message. Otherwise it will raise an * NSInternalInconsistencyException.
* Unless this method is invoked as part of a [-undo] or [-undoNestedGroup] * processing, the redo stack is cleared.
* If the receiver [-groupsByEvent] and this is the first call to this * method since the last run loop processing, this method sets up * the receiver to process the [-endUndoGrouping] at the * end of the event loop. */ - (void) registerUndoWithTarget: (id)target selector: (SEL)aSelector object: (id)anObject { if (_disableCount == 0) { NSMethodSignature *sig; NSInvocation *inv; PrivateUndoGroup *g; if (_group == nil) { if ([self groupsByEvent]) { [self _begin]; } else { [NSException raise: NSInternalInconsistencyException format: @"registerUndo without beginUndoGrouping"]; } } g = _group; sig = [target methodSignatureForSelector: aSelector]; NSAssert2(sig,@"No methodSignatureForSelector:%@ for target of class %@", NSStringFromSelector(aSelector), [target class]); inv = [NSInvocation invocationWithMethodSignature: sig]; [inv retainArgumentsIncludingTarget: NO]; [inv setTarget: target]; [inv setSelector: aSelector]; [inv setArgument: &anObject atIndex: 2]; [g addInvocation: inv]; if (_isUndoing == NO && _isRedoing == NO) { [_redoStack removeAllObjects]; } if ((_runLoopGroupingPending == NO) && ([self groupsByEvent] == YES)) { [[NSRunLoop currentRunLoop] performSelector: @selector(_loop:) target: self argument: nil order: NSUndoCloseGroupingRunLoopOrdering modes: _modes]; _runLoopGroupingPending = YES; } } } /** * Removes all grouping stored in the receiver. This clears the both * the undo and the redo stacks. This method is if the sole client * of the undo manager will be unable to service any undo or redo events. * The client can call this method in its -dealloc method, unless the * undo manager has several clients, in which case * [-removeAllActionsWithTarget:] is more appropriate. */ - (void) removeAllActions { while (_group != nil) { [self endUndoGrouping]; } [_redoStack removeAllObjects]; [_undoStack removeAllObjects]; _isRedoing = NO; _isUndoing = NO; _disableCount = 0; } /** * Removes all actions recorded for the given target. This method is * is useful when a client of the undo manager will be unable to * service any undo or redo events. Clients should call this method * in their dealloc method, unless they are the sole client of the * undo manager in which case [-removeAllActions] is more appropriate. */ - (void) removeAllActionsWithTarget: (id)target { unsigned i; i = [_redoStack count]; while (i-- > 0) { PrivateUndoGroup *g; g = [_redoStack objectAtIndex: i]; if ([g removeActionsForTarget: target] == NO) { [_redoStack removeObjectAtIndex: i]; } } i = [_undoStack count]; while (i-- > 0) { PrivateUndoGroup *g; g = [_undoStack objectAtIndex: i]; if ([g removeActionsForTarget: target] == NO) { [_undoStack removeObjectAtIndex: i]; } } } /** * Returns the run loop modes in which the receiver registers * the [-endUndoGrouping] processing when it [-groupsByEvent]. */ - (NSArray*) runLoopModes { return _modes; } /** * Sets the name associated with the actions of the current group. * Typically you can call this method while registering the actions * for the current group. This name will be used to determine the * name in the [-undoMenuTitleForUndoActionName:] and * [-redoMenuTitleForUndoActionName:] names typically displayed * in the menu. */ - (void) setActionName: (NSString*)name { if ((name != nil) && (_group != nil)) { [_group setActionName: name]; } } /** * Sets whether the receiver should implicitly call [-beginUndoGrouping] when * necessary and register a call to invoke [-endUndoGrouping] at the end * of the current event loop. The grouping is turned on by default. */ - (void) setGroupsByEvent: (BOOL)flag { if (_groupsByEvent != flag) { _groupsByEvent = flag; } } /** * Sets the maximum number of groups in either the undo or redo stack. * Use this method to limit memory usage if you either expect very many * actions to be recorded or the recorded objects require a lot of memory. * When set to 0 the stack size is limited by the range of a unsigned int, * available memory. */ - (void) setLevelsOfUndo: (NSUInteger)num { _levelsOfUndo = num; if (num > 0) { while ([_undoStack count] > num) { [_undoStack removeObjectAtIndex: 0]; } while ([_redoStack count] > num) { [_redoStack removeObjectAtIndex: 0]; } } } /** * Sets the modes in which the receiver registers the calls * with the current run loop to invoke * [-endUndoGrouping] when it [-groupsByEvent]. This method * first cancels any pending registrations in the old modes and * registers the invocation in the new modes. */ - (void) setRunLoopModes: (NSArray*)newModes { if (_modes != newModes) { ASSIGN(_modes, newModes); if (_runLoopGroupingPending) { NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; [runLoop cancelPerformSelector: @selector(_loop:) target: self argument: nil]; [runLoop performSelector: @selector(_loop:) target: self argument: nil order: NSUndoCloseGroupingRunLoopOrdering modes: _modes]; } } } /** * This method performs an undo by invoking [-undoNestedGroup]. * If current group of the receiver is the top group this method first * calls [-endUndoGrouping]. This method may only be called on the top * level group, otherwise it will raise an NSInternalInconsistencyException. */ - (void) undo { if ([self groupingLevel] == 1) { [self endUndoGrouping]; } if (_group != nil) { [NSException raise: NSInternalInconsistencyException format: @"undo with nested groups"]; } [self undoNestedGroup]; } /** * If the receiver can perform an undo, this method returns * the action name previously associated with the top grouping with * [-setActionName:]. This name should identify the action to be undone. * If there are no items on the undo stack this method returns nil. * If no action name has been set, this method returns an empty string. */ - (NSString*) undoActionName { if ([self canUndo] == NO) { return nil; } if (_group != nil) { return [_group actionName]; } else { return [[_undoStack lastObject] actionName]; } } /** * Returns the full localized title of the actions to be displayed * as a menu item. This method first invokes [-undoActionName] and * passes it to [-undoMenuTitleForUndoActionName:] and returns the result. */ - (NSString*) undoMenuItemTitle { return [self undoMenuTitleForUndoActionName: [self undoActionName]]; } /** * Returns the localized title of the actions to be displayed * as a menu item identified by actionName, by appending a * localized command string like @"Undo <localized(actionName)>". */ - (NSString*) undoMenuTitleForUndoActionName: (NSString*)actionName { if (actionName) { if ([actionName isEqual: @""]) { return _(@"Undo"); } else { return [NSString stringWithFormat: @"%@ %@", _(@"Undo"), actionName]; } } return _(@"Undo"); } /** * Performs an undo by taking the top grouping * from the undo stack and invoking them. This method posts an * NSUndoManagerCheckpointNotification notification to allow the client * to process any pending changes before proceeding. If there are groupings * on the undo stack, the top object is popped off the stack and invoked * within a nested beginUndoGrouping/endUndoGrouping. During this * processing, the undo operations registered for undo are recorded on the redo * stack.
*/ - (void) undoNestedGroup { NSString *name = nil; PrivateUndoGroup *oldGroup; PrivateUndoGroup *groupToUndo; [[NSNotificationCenter defaultCenter] postNotificationName: NSUndoManagerCheckpointNotification object: self]; if (_group != nil) { [NSException raise: NSInternalInconsistencyException format: @"undoNestedGroup before endUndoGrouping"]; } if (_isUndoing || _isRedoing) { [NSException raise: NSInternalInconsistencyException format: @"undoNestedGroup while undoing or redoing"]; } if ([_undoStack count] == 0) { return; } [[NSNotificationCenter defaultCenter] postNotificationName: NSUndoManagerWillUndoChangeNotification object: self]; oldGroup = _group; _group = nil; _isUndoing = YES; if (oldGroup) { groupToUndo = oldGroup; oldGroup = RETAIN([oldGroup parent]); [groupToUndo orphan]; [_redoStack addObject: groupToUndo]; } else { groupToUndo = RETAIN([_undoStack lastObject]); [_undoStack removeLastObject]; } name = [NSString stringWithString: [groupToUndo actionName]]; [self _begin]; [groupToUndo perform]; RELEASE(groupToUndo); [self endUndoGrouping]; _isUndoing = NO; _group = oldGroup; [[_redoStack lastObject] setActionName: name]; [[NSNotificationCenter defaultCenter] postNotificationName: NSUndoManagerDidUndoChangeNotification object: self]; } @end /* * Category with auxiliary method to support coalescing undo actions * for typing events in NSTextView. However, the implementation is * not restricted to that purpose. */ @interface NSUndoManager(UndoCoalescing) - (BOOL) _canCoalesceUndoWithTarget: (id)target selector: (SEL)aSelector object: (id)anObject; @end @implementation NSUndoManager(UndoCoalescing) - (BOOL) _canCoalesceUndoWithTarget: (id)target selector: (SEL)aSelector object: (id)anObject { if (_isUndoing == NO && _isRedoing == NO && [_undoStack count] > 0) { int i; NSArray *a = [[_undoStack lastObject] actions]; for (i = 0; i < [a count]; i++) { NSInvocation *inv = [a objectAtIndex: i]; if ([inv target] == target && [inv selector] == aSelector) { id object; [inv getArgument: &object atIndex: 2]; if (object == anObject) return YES; } } } return NO; } @end gnustep-base-1.29.0/Source/NSUnit.m000066400000000000000000001344761435650067400170270ustar00rootroot00000000000000/* Implementation of class NSUnit Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory John Casamento Date: Mon Sep 30 15:58:21 EDT 2019 This file is part of the GNUstep Library. 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 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 USA. */ #import "Foundation/NSArchiver.h" #import "Foundation/NSKeyedArchiver.h" #import "Foundation/NSUnit.h" // Private methods... @interface NSDimension (Private) - (instancetype) initWithSymbol: (NSString *)symbol coefficient: (double)coefficient constant: (double)constant; @end // Abstract conversion... @implementation NSUnitConverter - (double) baseUnitValueFromValue: (double)value { return 0.0; } - (double) valueFromBaseUnitValue: (double)baseUnitValue { return 0.0; } @end // Linear conversion... @implementation NSUnitConverterLinear - (instancetype) initWithCoefficient: (double)coefficient { return [self initWithCoefficient: coefficient constant: 0.0]; } - (instancetype) initWithCoefficient: (double)coefficient constant: (double)constant { self = [super init]; if (self != nil) { _coefficient = coefficient; _constant = constant; } return self; } - (id) initWithCoder: (NSCoder *)coder { if ([coder allowsKeyedCoding]) { _coefficient = [coder decodeDoubleForKey: @"NS.coefficient"]; _constant = [coder decodeDoubleForKey: @"NS.constant"]; } else { [coder decodeValueOfObjCType: @encode(double) at: &_coefficient]; [coder decodeValueOfObjCType: @encode(double) at: &_constant]; } return self; } - (void) encodeWithCoder: (NSCoder *)coder { if([coder allowsKeyedCoding]) { [coder encodeDouble: _coefficient forKey: @"NS.coefficient"]; [coder encodeDouble: _constant forKey: @"NS.constant"]; } else { [coder encodeValueOfObjCType: @encode(double) at: &_coefficient]; [coder encodeValueOfObjCType: @encode(double) at: &_constant]; } } - (double) coefficient { return _coefficient; } - (double) constant { return _constant; } - (double) baseUnitValueFromValue: (double)value { return (_coefficient * value) + _constant; } - (double) valueFromBaseUnitValue: (double)baseUnitValue { return (baseUnitValue - _constant) / _coefficient; } @end // Abstract unit... @implementation NSUnit - (instancetype) init { return [self initWithSymbol: @""]; } - (instancetype) initWithSymbol: (NSString *)symbol { self = [super init]; if (self != nil) { ASSIGNCOPY(_symbol, symbol); } return self; } - (id) initWithCoder: (NSCoder *)coder { if ([coder allowsKeyedCoding]) { _symbol = [coder decodeObjectForKey: @"NS.symbol"]; } else { _symbol = [coder decodeObject]; } return self; } - (void) encodeWithCoder: (NSCoder *)coder { if ([coder allowsKeyedCoding]) { [coder encodeObject: _symbol forKey: @"NS.symbol"]; } else { [coder encodeObject: _symbol]; } } - (instancetype) copyWithZone: (NSZone *)zone { return [[NSUnit allocWithZone: zone] initWithSymbol: [self symbol]]; } - (NSString *) symbol { return _symbol; } @end // Dimension using units.... @implementation NSDimension - (NSUnitConverter *) converter { return _converter; } - (instancetype) initWithSymbol: (NSString *)symbol converter: (NSUnitConverter *) converter { self = [super initWithSymbol: symbol]; if (self != nil) { ASSIGN(_converter, converter); } return self; } - (instancetype) initWithSymbol: (NSString *)symbol coefficient: (double)coefficient constant: (double)constant { NSUnitConverterLinear *converter = [[NSUnitConverterLinear alloc] initWithCoefficient: coefficient constant: constant]; self = [self initWithSymbol: symbol converter: converter]; RELEASE(converter); return self; } + (instancetype) baseUnit { return nil; } - (id) initWithCoder: (NSCoder *)coder { self = [super initWithCoder: coder]; if ([coder allowsKeyedCoding]) { _converter = [coder decodeObjectForKey: @"NS.converter"]; } else { _symbol = [coder decodeObject]; } return self; } - (void) encodeWithCoder: (NSCoder *)coder { [super encodeWithCoder: coder]; if ([coder allowsKeyedCoding]) { [coder encodeObject: _converter forKey: @"NS.converter"]; } else { [coder encodeObject: _symbol]; } } @end // Predefined.... @implementation NSUnitAcceleration + (instancetype) baseUnit { return [self metersPerSecondSquared]; } // Base unit - metersPerSecondSquared + (NSUnitAcceleration *) metersPerSecondSquared { return AUTORELEASE([[NSUnitAcceleration alloc] initWithSymbol: @"m/s^2" coefficient: 1.0 constant: 0.0]); } + (NSUnitAcceleration *) gravity { return AUTORELEASE([[NSUnitAcceleration alloc] initWithSymbol: @"g" coefficient: 9.81 constant: 0]); } @end @implementation NSUnitAngle + (instancetype) baseUnit { return [self degrees]; } // Base unit - degrees + (NSUnitAngle *) degrees { return AUTORELEASE([[NSUnitAngle alloc] initWithSymbol: @"deg" coefficient: 1.0 constant: 0.0]); } + (NSUnitAngle *) arcMinutes { return AUTORELEASE([[NSUnitAngle alloc] initWithSymbol: @"'" coefficient: 0.016667 constant: 0.0]); } + (NSUnitAngle *) arcSeconds { return AUTORELEASE([[NSUnitAngle alloc] initWithSymbol: @"\"" coefficient: 0.00027778 constant: 0.0]); } + (NSUnitAngle *) radians { return AUTORELEASE([[NSUnitAngle alloc] initWithSymbol: @"rad" coefficient: 57.2958 constant: 0.0]); } + (NSUnitAngle *) gradians { return AUTORELEASE([[NSUnitAngle alloc] initWithSymbol: @"grad" coefficient: 0.9 constant: 0.0]); } + (NSUnitAngle *) revolutions { return AUTORELEASE([[NSUnitAngle alloc] initWithSymbol: @"rev" coefficient: 360.0 constant: 0.0]); } @end @implementation NSUnitArea + (instancetype) baseUnit { return [self squareMeters]; } // Base unit - squareMeters + (NSUnitArea *) squareMegameters { return AUTORELEASE([[NSUnitArea alloc] initWithSymbol: @"Mm^2" coefficient: 1e12 constant: 0.0]); } + (NSUnitArea *) squareKilometers { return AUTORELEASE([[NSUnitArea alloc] initWithSymbol: @"km^2" coefficient: 1000000.0 constant: 0.0]); } + (NSUnitArea *) squareMeters { return AUTORELEASE([[NSUnitArea alloc] initWithSymbol: @"m^2" coefficient: 1.0 constant: 0.0]); } + (NSUnitArea *) squareCentimeters { return AUTORELEASE([[NSUnitArea alloc] initWithSymbol: @"cm^2" coefficient: 0.0001 constant: 0.0]); } + (NSUnitArea *) squareMillimeters { return AUTORELEASE([[NSUnitArea alloc] initWithSymbol: @"mm^2" coefficient: 0.000001 constant: 0.0]); } + (NSUnitArea *) squareMicrometers { return AUTORELEASE([[NSUnitArea alloc] initWithSymbol: @"um^2" coefficient: 1e-12 constant: 0.0]); } + (NSUnitArea *) squareNanometers { return AUTORELEASE([[NSUnitArea alloc] initWithSymbol: @"nm^2" coefficient: 1e-18 constant: 0.0]); } + (NSUnitArea *) squareInches { return AUTORELEASE([[NSUnitArea alloc] initWithSymbol: @"in^2" coefficient: 0.00064516 constant: 0.0]); } + (NSUnitArea *) squareFeet { return AUTORELEASE([[NSUnitArea alloc] initWithSymbol: @"ft^2" coefficient: 0.092903 constant: 0.0]); } + (NSUnitArea *) squareYards { return AUTORELEASE([[NSUnitArea alloc] initWithSymbol: @"yd^2" coefficient: 0.836127 constant: 0.0]); } + (NSUnitArea *) squareMiles { return AUTORELEASE([[NSUnitArea alloc] initWithSymbol: @"mi^2" coefficient: 2.59e+6 constant: 0.0]); } + (NSUnitArea *) acres { return AUTORELEASE([[NSUnitArea alloc] initWithSymbol: @"acres" coefficient: 4046.86 constant: 0.0]); } + (NSUnitArea *) ares { return AUTORELEASE([[NSUnitArea alloc] initWithSymbol: @"ares" coefficient: 100.0 constant: 0.0]); } + (NSUnitArea *) hectares { return AUTORELEASE([[NSUnitArea alloc] initWithSymbol: @"hectares" coefficient: 10000.0 constant: 0.0]); } @end @implementation NSUnitConcentrationMass + (instancetype) baseUnit { return [self gramsPerLiter]; } // Base unit - gramsPerLiter + (NSUnitConcentrationMass *) gramsPerLiter { return AUTORELEASE([[NSUnitConcentrationMass alloc] initWithSymbol: @"g/L" coefficient: 1.0 constant: 0.0]); } + (NSUnitConcentrationMass *) milligramsPerDeciliter { return AUTORELEASE([[NSUnitConcentrationMass alloc] initWithSymbol: @"mg/dL" coefficient: 0.01 constant: 0.0]); } + (NSUnitConcentrationMass *) millimolesPerLiterWithGramsPerMole:(double)gramsPerMole { return AUTORELEASE([[NSUnitConcentrationMass alloc] initWithSymbol: @"mmol/L" coefficient: 18.0 * gramsPerMole constant: 0.0]); } @end @implementation NSUnitDispersion + (instancetype) baseUnit { return [self partsPerMillion]; } // Base unit - partsPerMillion + (NSUnitDispersion *) partsPerMillion { return AUTORELEASE([[NSUnitDispersion alloc] initWithSymbol: @"ppm" coefficient: 1.0 constant: 0.0]); } @end @implementation NSUnitDuration + (instancetype) baseUnit { return [self seconds]; } // Base unit - seconds + (NSUnitDuration *) seconds { return AUTORELEASE([[NSUnitDuration alloc] initWithSymbol: @"sec" coefficient: 1.0 constant: 0.0]); } + (NSUnitDuration *) minutes { return AUTORELEASE([[NSUnitDuration alloc] initWithSymbol: @"min" coefficient: 60.0 constant: 0.0]); } + (NSUnitDuration *) hours { return AUTORELEASE([[NSUnitDuration alloc] initWithSymbol: @"hr" coefficient: 3600.0 constant: 0.0]); } @end @implementation NSUnitElectricCharge + (instancetype) baseUnit { return [self coulombs]; } // Base unit - coulombs + (NSUnitElectricCharge *) coulombs { return AUTORELEASE([[NSUnitElectricCharge alloc] initWithSymbol: @"C" coefficient: 1.0 constant: 0.0]); } + (NSUnitElectricCharge *) megaampereHours { return AUTORELEASE([[NSUnitElectricCharge alloc] initWithSymbol: @"MAh" coefficient: 3.6e9 constant: 0.0]); } + (NSUnitElectricCharge *) kiloampereHours { return AUTORELEASE([[NSUnitElectricCharge alloc] initWithSymbol: @"kAh" coefficient: 3600000.0 constant: 0.0]); } + (NSUnitElectricCharge *) ampereHours { return AUTORELEASE([[NSUnitElectricCharge alloc] initWithSymbol: @"mAh" coefficient: 3600.0 constant: 0.0]); } + (NSUnitElectricCharge *) milliampereHours { return AUTORELEASE([[NSUnitElectricCharge alloc] initWithSymbol: @"hr" coefficient: 3.6 constant: 0.0]); } + (NSUnitElectricCharge *) microampereHours { return AUTORELEASE([[NSUnitElectricCharge alloc] initWithSymbol: @"uAh" coefficient: 0.0036 constant: 0.0]); } @end @implementation NSUnitElectricCurrent + (instancetype) baseUnit { return [self amperes]; } // Base unit - amperes + (NSUnitElectricCurrent *) megaamperes { return AUTORELEASE([[NSUnitElectricCurrent alloc] initWithSymbol: @"MA" coefficient: 1000000.0 constant: 0.0]); } + (NSUnitElectricCurrent *) kiloamperes { return AUTORELEASE([[NSUnitElectricCurrent alloc] initWithSymbol: @"kA" coefficient: 1000.0 constant: 0.0]); } + (NSUnitElectricCurrent *) amperes { return AUTORELEASE([[NSUnitElectricCurrent alloc] initWithSymbol: @"A" coefficient: 1.0 constant: 0.0]); } + (NSUnitElectricCurrent *) milliamperes { return AUTORELEASE([[NSUnitElectricCurrent alloc] initWithSymbol: @"mA" coefficient: 0.001 constant: 0.0]); } + (NSUnitElectricCurrent *) microamperes { return AUTORELEASE([[NSUnitElectricCurrent alloc] initWithSymbol: @"uA" coefficient: 0.000001 constant: 0.0]); } @end @implementation NSUnitElectricPotentialDifference + (instancetype) baseUnit { return [self volts]; } // Base unit - volts + (NSUnitElectricPotentialDifference *) megavolts { return AUTORELEASE([[NSUnitElectricPotentialDifference alloc] initWithSymbol: @"MV" coefficient: 1000000.0 constant: 0.0]); } + (NSUnitElectricPotentialDifference *) kilovolts { return AUTORELEASE([[NSUnitElectricPotentialDifference alloc] initWithSymbol: @"kV" coefficient: 1000.0 constant: 0.0]); } + (NSUnitElectricPotentialDifference *) volts { return AUTORELEASE([[NSUnitElectricPotentialDifference alloc] initWithSymbol: @"V" coefficient: 1.0 constant: 0.0]); } + (NSUnitElectricPotentialDifference *) millivolts { return AUTORELEASE([[NSUnitElectricPotentialDifference alloc] initWithSymbol: @"mV" coefficient: 0.001 constant: 0.0]); } + (NSUnitElectricPotentialDifference *) microvolts { return AUTORELEASE([[NSUnitElectricPotentialDifference alloc] initWithSymbol: @"uV" coefficient: 0.000001 constant: 0.0]); } @end @implementation NSUnitElectricResistance + (instancetype) baseUnit { return [self ohms]; } // Base unit - ohms + (NSUnitElectricResistance *) megaohms { return AUTORELEASE([[NSUnitElectricResistance alloc] initWithSymbol: @"MOhm" coefficient: 100000.0 constant: 0.0]); } + (NSUnitElectricResistance *) kiloohms { return AUTORELEASE([[NSUnitElectricResistance alloc] initWithSymbol: @"kOhm" coefficient: 1000.0 constant: 0.0]); } + (NSUnitElectricResistance *) ohms { return AUTORELEASE([[NSUnitElectricResistance alloc] initWithSymbol: @"Ohm" coefficient: 1.0 constant: 0.0]); } + (NSUnitElectricResistance *) milliohms { return AUTORELEASE([[NSUnitElectricResistance alloc] initWithSymbol: @"mOhm" coefficient: 0.001 constant: 0.0]); } + (NSUnitElectricResistance *) microohms { return AUTORELEASE([[NSUnitElectricResistance alloc] initWithSymbol: @"uOhm" coefficient: 0.000001 constant: 0.0]); } @end @implementation NSUnitEnergy + (instancetype) baseUnit { return [self joules]; } // Base unit - joules + (NSUnitEnergy *) kilojoules { return AUTORELEASE([[NSUnitEnergy alloc] initWithSymbol: @"kJ" coefficient: 1000.0 constant: 0.0]); } + (NSUnitEnergy *) joules { return AUTORELEASE([[NSUnitEnergy alloc] initWithSymbol: @"J" coefficient: 1.0 constant: 0.0]); } + (NSUnitEnergy *) kilocalories { return AUTORELEASE([[NSUnitEnergy alloc] initWithSymbol: @"kCal" coefficient: 4184.0 constant: 0.0]); } + (NSUnitEnergy *) calories { return AUTORELEASE([[NSUnitEnergy alloc] initWithSymbol: @"cal" coefficient: 4.184 constant: 0.0]); } + (NSUnitEnergy *) kilowattHours { return AUTORELEASE([[NSUnitEnergy alloc] initWithSymbol: @"kWh" coefficient: 3600000.0 constant: 0.0]); } @end @implementation NSUnitFrequency + (instancetype) baseUnit { return [self hertz]; } // Base unit - hertz + (NSUnitFrequency *) terahertz { return AUTORELEASE([[NSUnitFrequency alloc] initWithSymbol: @"thz" coefficient: 1e12 constant: 0.0]); } + (NSUnitFrequency *) gigahertz { return AUTORELEASE([[NSUnitFrequency alloc] initWithSymbol: @"ghz" coefficient: 1e9 constant: 0.0]); } + (NSUnitFrequency *) megahertz { return AUTORELEASE([[NSUnitFrequency alloc] initWithSymbol: @"GHz" coefficient: 1000000.0 constant: 0.0]); } + (NSUnitFrequency *) kilohertz { return AUTORELEASE([[NSUnitFrequency alloc] initWithSymbol: @"KHz" coefficient: 1000.0 constant: 0.0]); } + (NSUnitFrequency *) hertz { return AUTORELEASE([[NSUnitFrequency alloc] initWithSymbol: @"Hz" coefficient: 1.0 constant: 0.0]); } + (NSUnitFrequency *) millihertz { return AUTORELEASE([[NSUnitFrequency alloc] initWithSymbol: @"mHz" coefficient: 0.001 constant: 0.0]); } + (NSUnitFrequency *) microhertz { return AUTORELEASE([[NSUnitFrequency alloc] initWithSymbol: @"uHz" coefficient: 0.000001 constant: 0.0]); } + (NSUnitFrequency *) nanohertz { return AUTORELEASE([[NSUnitFrequency alloc] initWithSymbol: @"nHz" coefficient: 1e-9 constant: 0.0]); } @end @implementation NSUnitFuelEfficiency + (instancetype) baseUnit { return [self litersPer100Kilometers]; } // Base unit - litersPer100Kilometers + (NSUnitFuelEfficiency *) litersPer100Kilometers { return AUTORELEASE([[NSUnitFuelEfficiency alloc] initWithSymbol: @"L/100km" coefficient: 1.0 constant: 0.0]); } + (NSUnitFuelEfficiency *) milesPerImperialGallon { // FIXME return AUTORELEASE([[NSUnitFuelEfficiency alloc] initWithSymbol: @"mpg" coefficient: 0.0 constant: 0.0]); } + (NSUnitFuelEfficiency *) milesPerGallon { // FIXME return AUTORELEASE([[NSUnitFuelEfficiency alloc] initWithSymbol: @"mpg" coefficient: 0.0 constant: 0.0]); } @end @implementation NSUnitLength + (instancetype) baseUnit { return [self meters]; } // Base unit - meters + (NSUnitLength *) megameters { return AUTORELEASE([[NSUnitLength alloc] initWithSymbol: @"Mm" coefficient: 1000000.0 constant: 0.0]); } + (NSUnitLength *) kilometers { return AUTORELEASE([[NSUnitLength alloc] initWithSymbol: @"kM" coefficient: 1000.0 constant: 0.0]); } + (NSUnitLength *) hectometers { return AUTORELEASE([[NSUnitLength alloc] initWithSymbol: @"hm" coefficient: 100.0 constant: 0.0]); } + (NSUnitLength *) decameters { return AUTORELEASE([[NSUnitLength alloc] initWithSymbol: @"dam" coefficient: 10 constant: 0.0]); } + (NSUnitLength *) meters { return AUTORELEASE([[NSUnitLength alloc] initWithSymbol: @"meters" coefficient: 1.0 constant: 0.0]); } + (NSUnitLength *) decimeters { return AUTORELEASE([[NSUnitLength alloc] initWithSymbol: @"dm" coefficient: 0.1 constant: 0.0]); } + (NSUnitLength *) centimeters { return AUTORELEASE([[NSUnitLength alloc] initWithSymbol: @"cm" coefficient: 0.01 constant: 0.0]); } + (NSUnitLength *) millimeters { return AUTORELEASE([[NSUnitLength alloc] initWithSymbol: @"mm" coefficient: 0.001 constant: 0.0]); } + (NSUnitLength *) micrometers { return AUTORELEASE([[NSUnitLength alloc] initWithSymbol: @"um" coefficient: 0.000001 constant: 0.0]); } + (NSUnitLength *) nanometers { return AUTORELEASE([[NSUnitLength alloc] initWithSymbol: @"nm" coefficient: 1e-9 constant: 0.0]); } + (NSUnitLength *) picometers { return AUTORELEASE([[NSUnitLength alloc] initWithSymbol: @"pm" coefficient: 1e-12 constant: 0.0]); } + (NSUnitLength *) inches { return AUTORELEASE([[NSUnitLength alloc] initWithSymbol: @"in" coefficient: 0.254 constant: 0.0]); } + (NSUnitLength *) feet { return AUTORELEASE([[NSUnitLength alloc] initWithSymbol: @"ft" coefficient: 0.3048 constant: 0.0]); } + (NSUnitLength *) yards { return AUTORELEASE([[NSUnitLength alloc] initWithSymbol: @"yd" coefficient: 0.9144 constant: 0.0]); } + (NSUnitLength *) miles { return AUTORELEASE([[NSUnitLength alloc] initWithSymbol: @"mi" coefficient: 1609.34 constant: 0.0]); } + (NSUnitLength *) scandinavianMiles { return AUTORELEASE([[NSUnitLength alloc] initWithSymbol: @"smi" coefficient: 10000 constant: 0.0]); } + (NSUnitLength *) lightyears { return AUTORELEASE([[NSUnitLength alloc] initWithSymbol: @"ly" coefficient: 9.461e+15 constant: 0.0]); } + (NSUnitLength *) nauticalMiles { return AUTORELEASE([[NSUnitLength alloc] initWithSymbol: @"NM" coefficient: 1852.0 constant: 0.0]); } + (NSUnitLength *) fathoms { return AUTORELEASE([[NSUnitLength alloc] initWithSymbol: @"ftm" coefficient: 1.8288 constant: 0.0]); } + (NSUnitLength *) furlongs { return AUTORELEASE([[NSUnitLength alloc] initWithSymbol: @"fur" coefficient: 201.168 constant: 0.0]); } + (NSUnitLength *) astronomicalUnits { return AUTORELEASE([[NSUnitLength alloc] initWithSymbol: @"ua" coefficient: 1.496e+11 constant: 0.0]); } + (NSUnitLength *) parsecs { return AUTORELEASE([[NSUnitLength alloc] initWithSymbol: @"pc" coefficient: 3.086e+16 constant: 0.0]); } @end @implementation NSUnitIlluminance + (instancetype) baseUnit { return [self lux]; } // Base unit - lux + (NSUnitIlluminance *) lux { return AUTORELEASE([[NSUnitIlluminance alloc] initWithSymbol: @"lux" coefficient: 1.0 constant: 0.0]); } @end @implementation NSUnitMass + (instancetype) baseUnit { return [self kilograms]; } // Base unit - kilograms + (NSUnitMass *) kilograms { return AUTORELEASE([[NSUnitMass alloc] initWithSymbol: @"kg" coefficient: 1.0 constant: 0.0]); } + (NSUnitMass *) grams { return AUTORELEASE([[NSUnitMass alloc] initWithSymbol: @"g" coefficient: 0.001 constant: 0.0]); } + (NSUnitMass *) decigrams { return AUTORELEASE([[NSUnitMass alloc] initWithSymbol: @"dg" coefficient: 0.0001 constant: 0.0]); } + (NSUnitMass *) centigrams { return AUTORELEASE([[NSUnitMass alloc] initWithSymbol: @"cg" coefficient: 0.00001 constant: 0.0]); } + (NSUnitMass *) milligrams { return AUTORELEASE([[NSUnitMass alloc] initWithSymbol: @"mg" coefficient: 0.000001 constant: 0.0]); } + (NSUnitMass *) micrograms { return AUTORELEASE([[NSUnitMass alloc] initWithSymbol: @"ug" coefficient: 1e-9 constant: 0.0]); } + (NSUnitMass *) nanograms { return AUTORELEASE([[NSUnitMass alloc] initWithSymbol: @"ng" coefficient: 1e-12 constant: 0.0]); } + (NSUnitMass *) picograms { return AUTORELEASE([[NSUnitMass alloc] initWithSymbol: @"pg" coefficient: 1e-15 constant: 0.0]); } + (NSUnitMass *) ounces { return AUTORELEASE([[NSUnitMass alloc] initWithSymbol: @"oz" coefficient: 0.0283495 constant: 0.0]); } + (NSUnitMass *) pounds { return AUTORELEASE([[NSUnitMass alloc] initWithSymbol: @"lb" coefficient: 0.453592 constant: 0.0]); } + (NSUnitMass *) stones { return AUTORELEASE([[NSUnitMass alloc] initWithSymbol: @"st" coefficient: 6.35029 constant: 0.0]); } + (NSUnitMass *) metricTons { return AUTORELEASE([[NSUnitMass alloc] initWithSymbol: @"t" coefficient: 1000 constant: 0.0]); } + (NSUnitMass *) shortTons { return AUTORELEASE([[NSUnitMass alloc] initWithSymbol: @"ton" coefficient: 907.185 constant: 0.0]); } + (NSUnitMass *) carats { return AUTORELEASE([[NSUnitMass alloc] initWithSymbol: @"ct" coefficient: 0.0002 constant: 0.0]); } + (NSUnitMass *) ouncesTroy { return AUTORELEASE([[NSUnitMass alloc] initWithSymbol: @"oz t" coefficient: 0.03110348 constant: 0.0]); } + (NSUnitMass *) slugs { return AUTORELEASE([[NSUnitMass alloc] initWithSymbol: @"slug" coefficient: 14.5939 constant: 0.0]); } @end @implementation NSUnitPower + (instancetype) baseUnit { return [self watts]; } // Base unit - watts + (NSUnitPower *) terawatts { return AUTORELEASE([[NSUnitPower alloc] initWithSymbol: @"TW" coefficient: 1e12 constant: 0.0]); } + (NSUnitPower *) gigawatts { return AUTORELEASE([[NSUnitPower alloc] initWithSymbol: @"GW" coefficient: 1e9 constant: 0.0]); } + (NSUnitPower *) megawatts { return AUTORELEASE([[NSUnitPower alloc] initWithSymbol: @"MW" coefficient: 1000000.0 constant: 0.0]); } + (NSUnitPower *) kilowatts { return AUTORELEASE([[NSUnitPower alloc] initWithSymbol: @"kW" coefficient: 1000.0 constant: 0.0]); } + (NSUnitPower *) watts { return AUTORELEASE([[NSUnitPower alloc] initWithSymbol: @"W" coefficient: 1.0 constant: 0.0]); } + (NSUnitPower *) milliwatts { return AUTORELEASE([[NSUnitPower alloc] initWithSymbol: @"mW" coefficient: 0.001 constant: 0.0]); } + (NSUnitPower *) microwatts { return AUTORELEASE([[NSUnitPower alloc] initWithSymbol: @"uW" coefficient: 0.000001 constant: 0.0]); } + (NSUnitPower *) nanowatts { return AUTORELEASE([[NSUnitPower alloc] initWithSymbol: @"nW" coefficient: 1e-9 constant: 0.0]); } + (NSUnitPower *) picowatts { return AUTORELEASE([[NSUnitPower alloc] initWithSymbol: @"pW" coefficient: 1e-12 constant: 0.0]); } + (NSUnitPower *) femtowatts { return AUTORELEASE([[NSUnitPower alloc] initWithSymbol: @"fW" coefficient: 1e-15 constant: 0.0]); } + (NSUnitPower *) horsepower { return AUTORELEASE([[NSUnitPower alloc] initWithSymbol: @"hp" coefficient: 745.7 constant: 0.0]); } @end @implementation NSUnitPressure + (instancetype) baseUnit { return [self newtonsPerMetersSquared]; } // Base unit - newtonsPerMetersSquared (equivalent to 1 pascal) + (NSUnitPressure *) newtonsPerMetersSquared { return AUTORELEASE([[NSUnitPressure alloc] initWithSymbol: @"N/m^2" coefficient: 1.0 constant: 0.0]); } + (NSUnitPressure *) gigapascals { return AUTORELEASE([[NSUnitPressure alloc] initWithSymbol: @"GPa" coefficient: 1e9 constant: 0.0]); } + (NSUnitPressure *) megapascals { return AUTORELEASE([[NSUnitPressure alloc] initWithSymbol: @"MPa" coefficient: 1000000.0 constant: 0.0]); } + (NSUnitPressure *) kilopascals { return AUTORELEASE([[NSUnitPressure alloc] initWithSymbol: @"kPa" coefficient: 1000.0 constant: 0.0]); } + (NSUnitPressure *) hectopascals { return AUTORELEASE([[NSUnitPressure alloc] initWithSymbol: @"hPa" coefficient: 100.0 constant: 0.0]); } + (NSUnitPressure *) inchesOfMercury { return AUTORELEASE([[NSUnitPressure alloc] initWithSymbol: @"inHg" coefficient: 3386.0 constant: 0.0]); } + (NSUnitPressure *) bars { return AUTORELEASE([[NSUnitPressure alloc] initWithSymbol: @"bars" coefficient: 100000.0 constant: 0.0]); } + (NSUnitPressure *) millibars { return AUTORELEASE([[NSUnitPressure alloc] initWithSymbol: @"mbars" coefficient: 100.0 constant: 0.0]); } + (NSUnitPressure *) millimetersOfMercury { return AUTORELEASE([[NSUnitPressure alloc] initWithSymbol: @"mmHg" coefficient: 133.322 constant: 0.0]); } + (NSUnitPressure *) poundsForcePerSquareInch { return AUTORELEASE([[NSUnitPressure alloc] initWithSymbol: @"psi" coefficient: 6894.76 constant: 0.0]); } @end @implementation NSUnitSpeed + (instancetype) baseUnit { return [self metersPerSecond]; } // Base unit - metersPerSecond + (NSUnitSpeed *) metersPerSecond { return AUTORELEASE([[NSUnitSpeed alloc] initWithSymbol: @"m/s" coefficient: 1.0 constant: 0.0]); } + (NSUnitSpeed *) kilometersPerHour { return AUTORELEASE([[NSUnitSpeed alloc] initWithSymbol: @"km/h" coefficient: 0.277778 constant: 0.0]); } + (NSUnitSpeed *) milesPerHour { return AUTORELEASE([[NSUnitSpeed alloc] initWithSymbol: @"mph" coefficient: 0.44704 constant: 0.0]); } + (NSUnitSpeed *) knots { return AUTORELEASE([[NSUnitSpeed alloc] initWithSymbol: @"kn" coefficient: 0.51444 constant: 0.0]); } @end @implementation NSUnitTemperature + (instancetype) baseUnit { return [self kelvin]; } // Base unit - kelvin + (NSUnitTemperature *) kelvin { return AUTORELEASE([[NSUnitTemperature alloc] initWithSymbol: @"K" coefficient: 1.0 constant: 0.0]); } + (NSUnitTemperature *) celsius { return AUTORELEASE([[NSUnitTemperature alloc] initWithSymbol: @"C" coefficient: 1.0 constant: 273.15]); } + (NSUnitTemperature *) fahrenheit { return AUTORELEASE([[NSUnitTemperature alloc] initWithSymbol: @"F" coefficient: 0.55555555555556 constant: 255.37222222222427]); } @end @implementation NSUnitVolume + (instancetype) baseUnit { return [self liters]; } // Base unit - liters + (NSUnitVolume *) megaliters { return AUTORELEASE([[NSUnitVolume alloc] initWithSymbol: @"ML" coefficient: 1000000.0 constant: 0.0]); } + (NSUnitVolume *) kiloliters { return AUTORELEASE([[NSUnitVolume alloc] initWithSymbol: @"kL" coefficient: 1000.0 constant: 0.0]); } + (NSUnitVolume *) liters { return AUTORELEASE([[NSUnitVolume alloc] initWithSymbol: @"L" coefficient: 1.0 constant: 0.0]); } + (NSUnitVolume *) deciliters { return AUTORELEASE([[NSUnitVolume alloc] initWithSymbol: @"dL" coefficient: 0.1 constant: 0.0]); } + (NSUnitVolume *) centiliters { return AUTORELEASE([[NSUnitVolume alloc] initWithSymbol: @"cL" coefficient: 0.01 constant: 0.0]); } + (NSUnitVolume *) milliliters { return AUTORELEASE([[NSUnitVolume alloc] initWithSymbol: @"mL" coefficient: 0.001 constant: 0.0]); } + (NSUnitVolume *) cubicKilometers { return AUTORELEASE([[NSUnitVolume alloc] initWithSymbol: @"km^3" coefficient: 1e12 constant: 0.0]); } + (NSUnitVolume *) cubicMeters { return AUTORELEASE([[NSUnitVolume alloc] initWithSymbol: @"m^3" coefficient: 1000.0 constant: 0.0]); } + (NSUnitVolume *) cubicDecimeters { return AUTORELEASE([[NSUnitVolume alloc] initWithSymbol: @"dm^3" coefficient: 1.0 constant: 0.0]); } + (NSUnitVolume *) cubicCentimeters { return AUTORELEASE([[NSUnitVolume alloc] initWithSymbol: @"cm^3" coefficient: 0.0001 constant: 0.0]); } + (NSUnitVolume *) cubicMillimeters { return AUTORELEASE([[NSUnitVolume alloc] initWithSymbol: @"mm^3" coefficient: 0.000001 constant: 0.0]); } + (NSUnitVolume *) cubicInches { return AUTORELEASE([[NSUnitVolume alloc] initWithSymbol: @"in^3" coefficient: 0.0163871 constant: 0.0]); } + (NSUnitVolume *) cubicFeet { return AUTORELEASE([[NSUnitVolume alloc] initWithSymbol: @"ft^3" coefficient: 28.3168 constant: 0.0]); } + (NSUnitVolume *) cubicYards { return AUTORELEASE([[NSUnitVolume alloc] initWithSymbol: @"yd^3" coefficient: 764.555 constant: 0.0]); } + (NSUnitVolume *) cubicMiles { return AUTORELEASE([[NSUnitVolume alloc] initWithSymbol: @"mi^3" coefficient: 4.168e+12 constant: 0.0]); } + (NSUnitVolume *) acreFeet { return AUTORELEASE([[NSUnitVolume alloc] initWithSymbol: @"af" coefficient: 1.233e+6 constant: 0.0]); } + (NSUnitVolume *) bushels { return AUTORELEASE([[NSUnitVolume alloc] initWithSymbol: @"bsh" coefficient: 32.2391 constant: 0.0]); } + (NSUnitVolume *) teaspoons { return AUTORELEASE([[NSUnitVolume alloc] initWithSymbol: @"tsp" coefficient: 0.00492892 constant: 0.0]); } + (NSUnitVolume *) tablespoons { return AUTORELEASE([[NSUnitVolume alloc] initWithSymbol: @"tbsp" coefficient: 0.0147868 constant: 0.0]); } + (NSUnitVolume *) fluidOunces { return AUTORELEASE([[NSUnitVolume alloc] initWithSymbol: @"fl oz" coefficient: 0.295735 constant: 0.0]); } + (NSUnitVolume *) cups { return AUTORELEASE([[NSUnitVolume alloc] initWithSymbol: @"cups" coefficient: 0.24 constant: 0.0]); } + (NSUnitVolume *) pints { return AUTORELEASE([[NSUnitVolume alloc] initWithSymbol: @"pt" coefficient: 0.473176 constant: 0.0]); } + (NSUnitVolume *) quarts { return AUTORELEASE([[NSUnitVolume alloc] initWithSymbol: @"qt" coefficient: 0.946353 constant: 0.0]); } + (NSUnitVolume *) gallons { return AUTORELEASE([[NSUnitVolume alloc] initWithSymbol: @"gal" coefficient: 3.78541 constant: 0.0]); } + (NSUnitVolume *) imperialTeaspoons { return AUTORELEASE([[NSUnitVolume alloc] initWithSymbol: @"tsp" coefficient: 0.00591939 constant: 0.0]); } + (NSUnitVolume *) imperialTablespoons { return AUTORELEASE([[NSUnitVolume alloc] initWithSymbol: @"tbsp" coefficient: 0.0177582 constant: 0.0]); } + (NSUnitVolume *) imperialFluidOunces { return AUTORELEASE([[NSUnitVolume alloc] initWithSymbol: @"fl oz" coefficient: 0.0284131 constant: 0.0]); } + (NSUnitVolume *) imperialPints { return AUTORELEASE([[NSUnitVolume alloc] initWithSymbol: @"pt" coefficient: 0.568261 constant: 0.0]); } + (NSUnitVolume *) imperialQuarts { return AUTORELEASE([[NSUnitVolume alloc] initWithSymbol: @"qt" coefficient: 1.13652 constant: 0.0]); } + (NSUnitVolume *) imperialGallons { return AUTORELEASE([[NSUnitVolume alloc] initWithSymbol: @"gal" coefficient: 4.54609 constant: 0.0]); } + (NSUnitVolume *) metricCups { return AUTORELEASE([[NSUnitVolume alloc] initWithSymbol: @"metric cup" coefficient: 0.25 constant: 0.0]); } @end gnustep-base-1.29.0/Source/NSUserActivity.m000066400000000000000000000017741435650067400205350ustar00rootroot00000000000000/* Implementation of class NSUserActivity Copyright (C) 2019 Free Software Foundation, Inc. By: heron Date: Fri Nov 1 00:25:47 EDT 2019 This file is part of the GNUstep Library. 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 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 USA. */ #include @implementation NSUserActivity @end gnustep-base-1.29.0/Source/NSUserDefaults.m000066400000000000000000002174751435650067400205170ustar00rootroot00000000000000/** Implementation for NSUserDefaults for GNUstep Copyright (C) 1995-2016 Free Software Foundation, Inc. Written by: Georg Tuparev EMBL & Academia Naturalis, Heidelberg, Germany Modified by: Richard Frith-Macdonald This file is part of the GNUstep Base Library. 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 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 USA. NSUserDefaults class reference $Date$ $Revision$ */ #import "common.h" #define EXPOSE_NSUserDefaults_IVARS 1 #include #include #import "Foundation/NSUserDefaults.h" #import "Foundation/NSArchiver.h" #import "Foundation/NSArray.h" #import "Foundation/NSData.h" #import "Foundation/NSDate.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSDistributedLock.h" #import "Foundation/NSException.h" #import "Foundation/NSFileManager.h" #import "Foundation/NSLock.h" #import "Foundation/NSNotification.h" #import "Foundation/NSPathUtilities.h" #import "Foundation/NSProcessInfo.h" #import "Foundation/NSPropertyList.h" #import "Foundation/NSRunLoop.h" #import "Foundation/NSSet.h" #import "Foundation/NSThread.h" #import "Foundation/NSTimer.h" #import "Foundation/NSValue.h" #import "GNUstepBase/GSLocale.h" #import "GNUstepBase/GSLock.h" #import "GNUstepBase/NSProcessInfo+GNUstepBase.h" #import "GNUstepBase/NSString+GNUstepBase.h" #if defined(_WIN32) /* Fake interface to avoid compiler warnings */ @interface NSUserDefaultsWin32 : NSUserDefaults @end #endif #ifdef HAVE_LOCALE_H #include #endif #import "GSPrivate.h" /* Wait for access */ #define _MAX_COUNT 5 /* Max 10 sec. */ /************************************************************************* *** Class variables *************************************************************************/ static SEL nextObjectSel; static SEL objectForKeySel; static SEL addSel; static Class NSArrayClass; static Class NSDataClass; static Class NSDateClass; static Class NSDictionaryClass; static Class NSNumberClass; static Class NSMutableDictionaryClass; static Class NSStringClass; static NSString *GSPrimaryDomain = @"GSPrimaryDomain"; static NSString *defaultsFile = @".GNUstepDefaults"; static NSUserDefaults *sharedDefaults = nil; static NSDictionary *argumentsDictionary = nil; static NSString *processName = nil; static NSRecursiveLock *classLock = nil; static NSLock *syncLock = nil; /* Flag to say whether the sharedDefaults variable has been set up by a * call to the +standardUserDefaults method. If this is YES but the variable * is nil then there was a problem initialising the shared object and we * have no defaults available. */ static BOOL hasSharedDefaults = NO; /* Caching some default flag values. Until the standard defaults have * been loaded, these values are taken from the process arguments. */ static BOOL flags[GSUserDefaultMaxFlag] = { 0 }; /* An instance of the GSPersistentDomain class is used to encapsulate * a single persistent domain (represented as a property list file in * the defaults directory. * Instances are generally created without contents, and the contents * are lazily loaded from disk when the domain is needed (either because * it is in the defaults system search list, or because the method to * obtain a copy of the domain contents is called). */ @interface GSPersistentDomain : NSObject { NSString *name; NSString *path; NSUserDefaults *owner; NSMutableDictionary *contents; NSMutableSet *added; NSMutableSet *modified; NSMutableSet *removed; BOOL loaded; } - (NSDictionary*) contents; - (void) empty; - (id) initWithName: (NSString*)n owner: (NSUserDefaults*)o; - (NSString*) name; - (id) objectForKey: (NSString*)aKey; - (BOOL) setObject: (id)anObject forKey: (NSString*)aKey; - (BOOL) setContents: (NSDictionary*)domain; - (BOOL) synchronize; @end static NSString * lockPath(NSString *defaultsDatabase, BOOL verbose) { NSString *path; NSFileManager *mgr; unsigned desired; NSDictionary *attr; BOOL isDir; /* We use a subdirectory (.lck) of the defaults directory in which to * create/destroy the distributed lock used to ensure that defaults * are not simultanously updated by multiple processes. * The use of a subdirectory means that locking/unlocking the distributed * lock will not change the timestamp on the defaults database directory * itsself, so we can use that date to see if any defaults files have * been added or removed. */ path = defaultsDatabase; mgr = [NSFileManager defaultManager]; #if !(defined(S_IRUSR) && defined(S_IWUSR) && defined(S_IXUSR) \ && defined(S_IRGRP) && defined(S_IXGRP) \ && defined(S_IROTH) && defined(S_IXOTH)) desired = 0755; #else desired = (S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH); #endif attr = [NSDictionary dictionaryWithObjectsAndKeys: NSUserName(), NSFileOwnerAccountName, [NSNumberClass numberWithUnsignedLong: desired], NSFilePosixPermissions, nil]; if ([mgr fileExistsAtPath: path isDirectory: &isDir] == NO) { if ([mgr createDirectoryAtPath: path withIntermediateDirectories: YES attributes: attr error: NULL] == NO) { if (verbose) NSLog(@"Defaults path '%@' does not exist - failed to create it.", path); return nil; } else { if (verbose) NSLog(@"Defaults path '%@' did not exist - created it", path); isDir = YES; } } if (isDir == NO) { if (verbose) NSLog(@"ERROR - Defaults path '%@' is not a directory!", path); return nil; } path = [path stringByAppendingPathComponent: @".lck"]; if ([mgr fileExistsAtPath: path isDirectory: &isDir] == NO) { if ([mgr createDirectoryAtPath: path withIntermediateDirectories: YES attributes: attr error: NULL] == NO) { if (verbose) NSLog(@"Defaults path '%@' does not exist - failed to create it.", path); return nil; } else { if (verbose) NSLog(@"Defaults path '%@' did not exist - created it", path); isDir = YES; } } if (isDir == NO) { if (verbose) NSLog(@"ERROR - Defaults path '%@' is not a directory!", path); return nil; } path = [path stringByAppendingPathComponent: defaultsFile]; path = [path stringByAppendingPathExtension: @"lck"]; return path; } static void updateCache(NSUserDefaults *self) { if (self == sharedDefaults) { NSArray *debug; /** * If there is an array NSUserDefault called GNU-Debug, * we add its contents to the set of active debug levels. */ debug = [self arrayForKey: @"GNU-Debug"]; if (debug != nil) { unsigned c = [debug count]; NSMutableSet *s; s = [[NSProcessInfo processInfo] debugSet]; while (c-- > 0) { NSString *level = [debug objectAtIndex: c]; [s addObject: level]; } } /* NB the following flags are first set up, in the +initialize method. */ flags[GSMacOSXCompatible] = [self boolForKey: @"GSMacOSXCompatible"]; flags[GSOldStyleGeometry] = [self boolForKey: @"GSOldStyleGeometry"]; flags[GSLogSyslog] = [self boolForKey: @"GSLogSyslog"]; flags[GSLogThread] = [self boolForKey: @"GSLogThread"]; flags[GSLogOffset] = [self boolForKey: @"GSLogOffset"]; flags[NSWriteOldStylePropertyLists] = [self boolForKey: @"NSWriteOldStylePropertyLists"]; flags[GSExceptionStackTrace] = [self boolForKey: @"GSExceptionStackTrace"]; } } static void setPermissions(NSString *file) { NSFileManager *mgr = [NSFileManager defaultManager]; NSDictionary *attr; uint32_t desired; uint32_t attributes; attr = [mgr fileAttributesAtPath: file traverseLink: YES]; attributes = [attr filePosixPermissions]; #if !(defined(S_IRUSR) && defined(S_IWUSR)) desired = 0600; #else desired = (S_IRUSR|S_IWUSR); #endif if (attributes != desired) { NSMutableDictionary *enforced_attributes; NSNumber *permissions; enforced_attributes = [NSMutableDictionary dictionaryWithDictionary: [mgr fileAttributesAtPath: file traverseLink: YES]]; permissions = [NSNumberClass numberWithUnsignedLong: desired]; [enforced_attributes setObject: permissions forKey: NSFilePosixPermissions]; [mgr changeFileAttributes: enforced_attributes atPath: file]; } } static BOOL writeDictionary(NSDictionary *dict, NSString *file) { if ([file length] == 0) { NSLog(@"Defaults database filename is empty when writing"); } else if (nil == dict) { NSFileManager *mgr = [NSFileManager defaultManager]; return [mgr removeFileAtPath: file handler: nil]; } else { NSData *data; NSString *err; err = nil; data = [NSPropertyListSerialization dataFromPropertyList: dict format: NSPropertyListXMLFormat_v1_0 errorDescription: &err]; if (data == nil) { NSLog(@"Failed to serialize defaults database for writing: %@", err); } else if ([data writeToFile: file atomically: YES] == NO) { NSLog(@"Failed to write defaults database to file: %@", file); } else { setPermissions(file); return YES; } } return NO; } /** * Returns the list of languages retrieved from the operating system, in * decreasing order of preference. Returns an empty array if the information * could not be retrieved. */ static NSArray * systemLanguages() { NSMutableArray *names = [NSMutableArray arrayWithCapacity: 10]; // Add the languages listed in the LANGUAGE environment variable // (a non-POSIX GNU extension) { NSString *env = [[[NSProcessInfo processInfo] environment] objectForKey: @"LANGUAGE"]; if (env != nil && [env length] > 0) { NSArray *array = [env componentsSeparatedByString: @":"]; NSEnumerator *enumerator = [array objectEnumerator]; NSString *locale; while (nil != (locale = [enumerator nextObject])) { [names addObjectsFromArray: GSLanguagesFromLocale(locale)]; } } } // If LANGUAGES did not yield any languages, try LC_MESSAGES if ([names count] == 0) { NSString *locale = GSDefaultLanguageLocale(); if (locale != nil) { [names addObjectsFromArray: GSLanguagesFromLocale(locale)]; } } return names; } static NSMutableArray * newLanguages(NSArray *oldNames) { NSMutableArray *newNames; NSEnumerator *enumerator; NSString *language; newNames = [NSMutableArray arrayWithCapacity: 5]; if (oldNames == nil || [oldNames count] == 0) { oldNames = systemLanguages(); } // If the user default was not set, and the system languages couldn't // be retrieved, try the GNUstep environment variable LANGUAGES if (oldNames == nil || [oldNames count] == 0) { NSString *env; env = [[[NSProcessInfo processInfo] environment] objectForKey: @"LANGUAGES"]; if (env != nil) { oldNames = [env componentsSeparatedByString: @";"]; } } enumerator = [oldNames objectEnumerator]; while (nil != (language = [enumerator nextObject])) { language = [language stringByTrimmingSpaces]; if ([language length] > 0 && NO == [newNames containsObject: language]) { [newNames addObject: language]; } } /* Check if "English" is included. We do this to make sure all the * required language constants are set somewhere if they aren't set * in the default language. */ if (NO == [newNames containsObject: @"English"]) { [newNames addObject: @"English"]; } return newNames; } /************************************************************************* *** Private method definitions *************************************************************************/ @interface NSUserDefaults (Private) + (void) _createArgumentDictionary: (NSArray*)args; - (void) _changePersistentDomain: (NSString*)domainName; - (NSString*) _directory; - (BOOL) _lockDefaultsFile: (BOOL*)wasLocked; - (BOOL) _readDefaults; - (BOOL) _readOnly; - (void) _unlockDefaultsFile; @end /** *

* NSUserDefaults provides an interface to the defaults system, * which allows an application access to global and/or application * specific defaults set by the user. A particular instance of * NSUserDefaults, standardUserDefaults, is provided as a * convenience. Most of the information described below * pertains to the standardUserDefaults. It is unlikely * that you would want to instantiate your own userDefaults * object, since it would not be set up in the same way as the * standardUserDefaults. *

*

* Defaults are managed based on domains. Certain * domains, such as NSGlobalDomain, are * persistent. These domains have defaults that are stored * externally. Other domains are volatile. The defaults in * these domains remain in effect only during the existence of * the application and may in fact be different for * applications running at the same time. When asking for a * default value from standardUserDefaults, NSUserDefaults * looks through the various domains in a particular order. *

* * GSPrimaryDomain ... volatile * * Contains values set at runtime and intended to supercede any values * set in other domains. This should be used with great care since it * overrides values which may have been set explicitly by the user. * * NSArgumentDomain ... volatile * * Contains defaults read from the arguments provided * to the application at startup.
* Pairs of arguments are used for this, with the first argument in * each pair being the name of a default (with a hyphen prepended) * and the second argument of the pair being the value of the default.
* NB. In GNUstep special arguments of the form --GNU-Debug=... * are used to enable debugging. Despite beginning with a hyphen, these * are not treated as default keys. *
* Application (name of the current process) ... persistent * * Contains application specific defaults, such as window positions. * This is the domain used by the -setObject:forKey: method and is * the domain normally used when setting preferences for an application. * * NSGlobalDomain ... persistent * * Global defaults applicable to all applications. * * Language (name based on users's language) ... volatile * * Constants that help with localization to the users's * language. * * GSConfigDomain ... volatile * * Information retrieved from the GNUstep configuration system. * Usually the system wide and user specific GNUstep.conf files, * or from information compiled in when the base library was * built.
* In addition to this standard configuration information, this * domain contains all values from property lists store in the * GlobalDefaults subdirectory or from the GlobalDefaults.plist file * stored in the same directory as the system wide GNUstep.conf * file. *
* NSRegistrationDomain ... volatile * * Temporary defaults set up by the application. * *
*

* The NSLanguages default value is used to set up the * constants for localization. GNUstep will also look for the * LANGUAGES environment variable if it is not set * in the defaults system. If it exists, it consists of an * array of languages that the user prefers. At least one of * the languages should have a corresponding localization file * (typically located in the Languages directory * of the GNUstep resources). *

*

* As a special extension, on systems that support locales * (e.g. GNU/Linux and Solaris), GNUstep will use information * from the user specified locale, if the NSLanguages * default value is not found. Typically the locale is * specified in the environment with the LANG * environment variable. *

*

* The first change to a persistent domain after a -synchronize * will cause an NSUserDefaultsDidChangeNotification to be posted * (as will any change caused by reading new values from disk), * so your application can keep track of changes made to the * defaults by other software. *

*

* NB. The GNUstep implementation differs from the Apple one in * that it is thread-safe while Apple's (as of MacOS-X 10.1) is not. *

*/ @implementation NSUserDefaults: NSObject + (void) atExit { DESTROY(sharedDefaults); DESTROY(processName); DESTROY(argumentsDictionary); DESTROY(classLock); DESTROY(syncLock); } + (void) initialize { if (self == [NSUserDefaults class]) { ENTER_POOL NSEnumerator *enumerator; NSArray *args; NSString *key; nextObjectSel = @selector(nextObject); objectForKeySel = @selector(objectForKey:); addSel = @selector(addEntriesFromDictionary:); /* * Cache class info for more rapid testing of the types of defaults. */ NSArrayClass = [NSArray class]; NSDataClass = [NSData class]; NSDateClass = [NSDate class]; NSDictionaryClass = [NSDictionary class]; NSNumberClass = [NSNumber class]; NSMutableDictionaryClass = [NSMutableDictionary class]; NSStringClass = [NSString class]; argumentsDictionary = [NSDictionary new]; [self registerAtExit]; processName = [[[NSProcessInfo processInfo] processName] copy]; /* Initialise the defaults flags to take values from the * process arguments. These are otherwise set in updateCache() * We do this early on so that the boolean argument settings can * be used while parsing property list values of other args in * the +_createArgumentDictionary: method. */ args = [[NSProcessInfo processInfo] arguments]; enumerator = [[[NSProcessInfo processInfo] arguments] objectEnumerator]; [enumerator nextObject]; // Skip process name. while (nil != (key = [enumerator nextObject])) { if ([key hasPrefix: @"-"] == YES && [key isEqual: @"-"] == NO) { id val; /* Anything beginning with a '-' is a defaults key and we * must strip the '-' from it. */ key = [key substringFromIndex: 1]; while (nil != (val = [enumerator nextObject])) { if ([val hasPrefix: @"-"] == YES && [val isEqual: @"-"] == NO) { key = val; } else if ([key isEqualToString: @"GSMacOSXCompatible"]) { flags[GSMacOSXCompatible] = [val boolValue]; } else if ([key isEqualToString: @"GSOldStyleGeometry"]) { flags[GSOldStyleGeometry] = [val boolValue]; } else if ([key isEqualToString: @"GSLogSyslog"]) { flags[GSLogSyslog] = [val boolValue]; } else if ([key isEqualToString: @"GSLogThread"]) { flags[GSLogThread] = [val boolValue]; } else if ([key isEqualToString: @"GSLogOffset"]) { flags[GSLogOffset] = [val boolValue]; } else if ([key isEqual: @"NSWriteOldStylePropertyLists"]) { flags[NSWriteOldStylePropertyLists] = [val boolValue]; } else if ([key isEqual: @"GSExceptionStackTrace"]) { flags[GSExceptionStackTrace] = [val boolValue]; } } } } /* The classLock must be created after setting up the flags[] array, * so once it exists we know we can used them safely. */ classLock = [NSRecursiveLock new]; /* This lock protects locking the defaults file. */ syncLock = [NSLock new]; [self _createArgumentDictionary: args]; LEAVE_POOL } } + (void) resetStandardUserDefaults { NSDictionary *regDefs = nil; [classLock lock]; NS_DURING { if (nil != sharedDefaults) { /* Extract the registration domain from the old defaults. */ regDefs = AUTORELEASE(RETAIN([sharedDefaults->_tempDomains objectForKey: NSRegistrationDomain])); [sharedDefaults->_tempDomains removeObjectForKey: NSRegistrationDomain]; /* To ensure that we don't try to synchronise the old defaults to disk * after creating the new ones, remove as housekeeping notification * observer. */ [[NSNotificationCenter defaultCenter] removeObserver: sharedDefaults]; /* Ensure changes are written, and no changes left so we can't end up * writing old changes to the new defaults. */ [sharedDefaults synchronize]; DESTROY(sharedDefaults->_changedDomains); DESTROY(sharedDefaults); } hasSharedDefaults = NO; [classLock unlock]; } NS_HANDLER { [classLock unlock]; [localException raise]; } NS_ENDHANDLER if (nil != regDefs) { [self standardUserDefaults]; if (sharedDefaults != nil) { [sharedDefaults->_tempDomains setObject: regDefs forKey: NSRegistrationDomain]; } } } /* Create a locale dictionary when we have absolutely no information about the locale. This method should go away, since it will never be called in a properly installed system. */ + (NSDictionary *) _unlocalizedDefaults { NSDictionary *registrationDefaults; NSArray *ampm; NSArray *long_day; NSArray *long_month; NSArray *short_day; NSArray *short_month; NSArray *earlyt; NSArray *latert; NSArray *hour_names; NSArray *ymw_names; ampm = [NSArray arrayWithObjects: @"AM", @"PM", nil]; short_month = [NSArray arrayWithObjects: @"Jan", @"Feb", @"Mar", @"Apr", @"May", @"Jun", @"Jul", @"Aug", @"Sep", @"Oct", @"Nov", @"Dec", nil]; long_month = [NSArray arrayWithObjects: @"January", @"February", @"March", @"April", @"May", @"June", @"July", @"August", @"September", @"October", @"November", @"December", nil]; short_day = [NSArray arrayWithObjects: @"Sun", @"Mon", @"Tue", @"Wed", @"Thu", @"Fri", @"Sat", nil]; long_day = [NSArray arrayWithObjects: @"Sunday", @"Monday", @"Tuesday", @"Wednesday", @"Thursday", @"Friday", @"Saturday", nil]; earlyt = [NSArray arrayWithObjects: @"prior", @"last", @"past", @"ago", nil]; latert = [NSArray arrayWithObjects: @"next", nil]; ymw_names = [NSArray arrayWithObjects: @"year", @"month", @"week", nil]; hour_names = [NSArray arrayWithObjects: [NSArray arrayWithObjects: @"0", @"midnight", nil], [NSArray arrayWithObjects: @"12", @"noon", @"lunch", nil], [NSArray arrayWithObjects: @"10", @"morning", nil], [NSArray arrayWithObjects: @"14", @"afternoon", nil], [NSArray arrayWithObjects: @"19", @"dinner", nil], nil]; registrationDefaults = [NSDictionary dictionaryWithObjectsAndKeys: ampm, NSAMPMDesignation, long_month, NSMonthNameArray, long_day, NSWeekDayNameArray, short_month, NSShortMonthNameArray, short_day, NSShortWeekDayNameArray, @"DMYH", NSDateTimeOrdering, [NSArray arrayWithObject: @"tomorrow"], NSNextDayDesignations, [NSArray arrayWithObject: @"nextday"], NSNextNextDayDesignations, [NSArray arrayWithObject: @"yesterday"], NSPriorDayDesignations, [NSArray arrayWithObject: @"today"], NSThisDayDesignations, earlyt, NSEarlierTimeDesignations, latert, NSLaterTimeDesignations, hour_names, NSHourNameDesignations, ymw_names, NSYearMonthWeekDesignations, nil]; return registrationDefaults; } + (NSUserDefaults*) standardUserDefaults { NSUserDefaults *defs; BOOL added_lang; BOOL added_locale; BOOL setup; id lang; NSArray *nL; NSArray *uL; NSEnumerator *enumerator; /* If the shared instance is already available ... return it. */ [classLock lock]; defs = RETAIN(sharedDefaults); setup = hasSharedDefaults; [classLock unlock]; if (YES == setup) { return AUTORELEASE(defs); } NS_DURING { /* Create new NSUserDefaults (NOTE: Not added to the autorelease pool!) * NB. The following code avoids deadlocks by creating a minimally * initialised instance, locking that instance, locking the class-wide * lock, installing the instance as the new shared defaults, unlocking * the class wide lock, completing the setup of the instance, and then * unlocking the instance. This means we already have the shared * instance locked ourselves at the point when it first becomes * visible to other threads. */ #if defined(_WIN32) { NSString *path = GSDefaultsRootForUser(NSUserName()); NSRange r = [path rangeOfString: @":REGISTRY:"]; if (r.length > 0) { defs = [[NSUserDefaultsWin32 alloc] init]; } else { defs = [[self alloc] init]; } } #else defs = [[self alloc] init]; #endif /* Install the new defaults as the shared copy, but lock it so that * we can complete setup without other threads interfering. */ if (nil != defs) { [defs->_lock lock]; [classLock lock]; if (NO == hasSharedDefaults) { hasSharedDefaults = YES; ASSIGN(sharedDefaults, defs); } else { /* Already set up by another thread. */ [defs->_lock unlock]; DESTROY(defs); } [classLock unlock]; } if (nil == defs) { const unsigned retryCount = 100; const NSTimeInterval retryInterval = 0.1; unsigned i; for (i = 0; i < retryCount; i++) { [NSThread sleepForTimeInterval: retryInterval]; [classLock lock]; defs = RETAIN(sharedDefaults); setup = hasSharedDefaults; [classLock unlock]; if (YES == setup) { NS_VALRETURN(AUTORELEASE(defs)); } RELEASE(defs); } NSLog(@"WARNING - unable to create shared user defaults!\n"); NS_VALRETURN(nil); } /* * Set up search list (excluding language list, which we don't know yet) */ [defs->_searchList addObject: GSPrimaryDomain]; [defs->_searchList addObject: NSArgumentDomain]; [defs->_searchList addObject: processName]; [defs persistentDomainForName: processName]; [defs->_searchList addObject: NSGlobalDomain]; [defs persistentDomainForName: NSGlobalDomain]; [defs->_searchList addObject: GSConfigDomain]; [defs->_searchList addObject: NSRegistrationDomain]; /* Load persistent data into the new instance. */ [defs synchronize]; /* * Look up user languages list and insert language specific domains * into search list before NSRegistrationDomain */ uL = [defs stringArrayForKey: @"NSLanguages"]; nL = newLanguages(uL); if (NO == [uL isEqual: nL]) { [self setUserLanguages: nL]; } enumerator = [nL objectEnumerator]; while ((lang = [enumerator nextObject])) { unsigned index = [defs->_searchList count] - 1; [defs->_searchList insertObject: lang atIndex: index]; } /* Set up language constants */ /* We lookup gnustep-base resources manually here to prevent * bootstrap problems. NSBundle's lookup routines depend on having * NSUserDefaults already bootstrapped, but we're still * bootstrapping here! So we can't really use NSBundle without * incurring massive bootstrap complications (btw, most of the times * we're here as a consequence of [NSBundle +initialize] creating * the gnustep-base bundle! So trying to use the gnustep-base * bundle here wouldn't really work.). */ /* * We are looking for: * * GNUSTEP_LIBRARY/Libraries/gnustep-base/Versions//Resources/Languages/ * * We iterate over , and for each we iterate over GNUSTEP_LIBRARY. */ { /* These variables are reused for all languages so we set them up * once here and then reuse them. */ NSFileManager *fm = [NSFileManager defaultManager]; NSString *tail = [[[[[@"Libraries" stringByAppendingPathComponent: @"gnustep-base"] stringByAppendingPathComponent: @"Versions"] stringByAppendingPathComponent: OBJC_STRINGIFY(GNUSTEP_BASE_MAJOR_VERSION.GNUSTEP_BASE_MINOR_VERSION)] stringByAppendingPathComponent: @"Resources"] stringByAppendingPathComponent: @"Languages"]; NSArray *paths = NSSearchPathForDirectoriesInDomains (NSLibraryDirectory, NSAllDomainsMask, YES); added_lang = NO; added_locale = NO; enumerator = [nL objectEnumerator]; while ((lang = [enumerator nextObject])) { NSDictionary *dict = nil; NSString *path = nil; NSString *alt; NSEnumerator *pathEnumerator; /* The language name could be an ISO language identifier rather * than an OpenStep name (OSX has moved to using them), so we * try converting as an alternative key for lookup. */ alt = GSLanguageFromLocale(lang); pathEnumerator = [paths objectEnumerator]; while ((path = [pathEnumerator nextObject]) != nil) { path = [[path stringByAppendingPathComponent: tail] stringByAppendingPathComponent: lang]; if ([fm fileExistsAtPath: path]) { break; /* Path found! */ } if (nil != alt) { path = [[path stringByAppendingPathComponent: tail] stringByAppendingPathComponent: alt]; if ([fm fileExistsAtPath: path]) { break; /* Path found! */ } } } if (path != nil) { dict = [NSDictionary dictionaryWithContentsOfFile: path]; } if (dict != nil) { [defs setVolatileDomain: dict forName: lang]; added_lang = YES; } else if (added_locale == NO) { /* The resources for the language that we were looking for * were not found. If this was the currently set locale * in the C library, try to get the same information from * the C library. This would usually happen for the * language that was added to the list of languages * precisely because it is the currently set locale in the * C library. */ NSString *locale = GSDefaultLanguageLocale(); if (locale != nil) { NSString *i18n = GSLanguageFromLocale(locale); /* See if we can get the dictionary from i18n * functions. I don't think that the i18n routines * can handle more than one locale, so we don't try to * look 'lang' up but just get what we get and use it * if it matches 'lang' ... but tell me if I'm wrong * ... */ if ([lang isEqual: i18n] || [alt isEqualToString: i18n]) { /* We set added_locale to YES to avoid so that we * won't do this C library locale lookup again * later on. */ added_locale = YES; dict = GSDomainFromDefaultLocale (); if (dict != nil) { [defs setVolatileDomain: dict forName: lang]; /* We do not set added_lang to YES here * because we want the basic hardcoded defaults * to be used in that case. */ } } } } } } if (added_lang == NO) { /* No language information found ... probably because the base * library is being used 'standalone' without resources. * We need to use hard-coded defaults. */ /* FIXME - should we set this as volatile domain for English ? */ [defs registerDefaults: [self _unlocalizedDefaults]]; } updateCache(sharedDefaults); [defs->_lock unlock]; } NS_HANDLER { if (nil != defs) { [defs->_lock unlock]; RELEASE(defs); } [localException raise]; } NS_ENDHANDLER return AUTORELEASE(defs); } + (NSArray*) userLanguages { return [[self standardUserDefaults] stringArrayForKey: @"NSLanguages"]; } + (void) setUserLanguages: (NSArray*)languages { NSUserDefaults *defs; NSMutableDictionary *dict; defs = [self standardUserDefaults]; dict = [[defs volatileDomainForName: GSPrimaryDomain] mutableCopy]; if (languages == nil) // Remove the entry { [dict removeObjectForKey: @"NSLanguages"]; } else { if (nil == dict) { dict = [NSMutableDictionary new]; } languages = newLanguages(languages); [dict setObject: languages forKey: @"NSLanguages"]; } [defs removeVolatileDomainForName: GSPrimaryDomain]; [defs setVolatileDomain: dict forName: GSPrimaryDomain]; RELEASE(dict); } - (id) init { return [self initWithUser: NSUserName()]; } /* Deprecated method ... which shoudl be merged into - initWithUser: */ - (id) initWithContentsOfFile: (NSString*)path { NSFileManager *mgr = [NSFileManager defaultManager]; NSRange r; BOOL flag; self = [super init]; if (path == nil || [path isEqual: @""] == YES) { path = [GSDefaultsRootForUser(NSUserName()) stringByAppendingPathComponent: defaultsFile]; } r = [path rangeOfString: @":INTERNAL:"]; #if defined(_WIN32) if (r.length == 0) { r = [path rangeOfString: @":REGISTRY:"]; } #endif if (r.length == 0) { path = [path stringByStandardizingPath]; _defaultsDatabase = [[path stringByDeletingLastPathComponent] copy]; if (YES == [mgr fileExistsAtPath: _defaultsDatabase isDirectory: &flag] && YES == flag) { path = lockPath(_defaultsDatabase, NO); if (nil != path) { _fileLock = [[NSDistributedLock alloc] initWithPath: path]; } } } _lock = [NSRecursiveLock new]; if (YES == [self _readOnly]) { // Load read-only defaults. ASSIGN(_lastSync, [NSDateClass date]); [self _readDefaults]; } // Create an empty search list _searchList = [[NSMutableArray alloc] initWithCapacity: 10]; _persDomains = [[NSMutableDictionaryClass alloc] initWithCapacity: 10]; // Create volatile defaults and add the Argument and the Registration domains _tempDomains = [[NSMutableDictionaryClass alloc] initWithCapacity: 10]; [_tempDomains setObject: argumentsDictionary forKey: NSArgumentDomain]; [_tempDomains setObject: [NSMutableDictionaryClass dictionaryWithCapacity: 10] forKey: NSRegistrationDomain]; [_tempDomains setObject: GNUstepConfig(nil) forKey: GSConfigDomain]; updateCache(self); [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(synchronize) name: @"GSHousekeeping" object: nil]; return self; } - (id) initWithUser: (NSString*)userName { NSString *path; path = [GSDefaultsRootForUser(userName) stringByAppendingPathComponent: defaultsFile]; return [self initWithContentsOfFile: path]; } - (void) dealloc { [[NSNotificationCenter defaultCenter] removeObserver: self]; RELEASE(_lastSync); RELEASE(_searchList); RELEASE(_persDomains); RELEASE(_tempDomains); RELEASE(_changedDomains); RELEASE(_dictionaryRep); RELEASE(_fileLock); RELEASE(_lock); [super dealloc]; } - (NSString*) description { NSMutableString *desc = nil; [_lock lock]; NS_DURING { desc = [NSMutableString stringWithFormat: @"%@", [super description]]; [desc appendFormat: @" SearchList: %@", _searchList]; [desc appendFormat: @" Persistent: %@", _persDomains]; [desc appendFormat: @" Temporary: %@", _tempDomains]; [_lock unlock]; } NS_HANDLER { [_lock unlock]; [localException raise]; } NS_ENDHANDLER return desc; } - (void) addSuiteNamed: (NSString*)aName { NSUInteger index; if (aName == nil) { [NSException raise: NSInvalidArgumentException format: @"attempt to add suite with nil name"]; } [_lock lock]; NS_DURING { DESTROY(_dictionaryRep); [_searchList removeObject: aName]; index = [_searchList indexOfObject: processName]; index = (index == NSNotFound) ? 0 : (index + 1); aName = [aName copy]; [_searchList insertObject: aName atIndex: index]; // Ensure that any persistent domain with the specified name is loaded. [self persistentDomainForName: aName]; updateCache(self); [_lock unlock]; } NS_HANDLER { [_lock unlock]; [localException raise]; } NS_ENDHANDLER RELEASE(aName); } - (NSArray*) arrayForKey: (NSString*)defaultName { id obj = [self objectForKey: defaultName]; if (obj != nil && [obj isKindOfClass: NSArrayClass]) return obj; return nil; } - (BOOL) boolForKey: (NSString*)defaultName { id obj = [self objectForKey: defaultName]; if (obj != nil && ([obj isKindOfClass: NSStringClass] || [obj isKindOfClass: NSNumberClass])) { return [obj boolValue]; } return NO; } - (NSData*) dataForKey: (NSString*)defaultName { id obj = [self objectForKey: defaultName]; if (obj != nil && [obj isKindOfClass: NSDataClass]) return obj; return nil; } - (NSDictionary*) dictionaryForKey: (NSString*)defaultName { id obj = [self objectForKey: defaultName]; if (obj != nil && [obj isKindOfClass: NSDictionaryClass]) { return obj; } return nil; } - (double) doubleForKey: (NSString*)defaultName { id obj = [self objectForKey: defaultName]; if (obj != nil && ([obj isKindOfClass: NSStringClass] || [obj isKindOfClass: NSNumberClass])) { return [obj doubleValue]; } return 0.0; } - (float) floatForKey: (NSString*)defaultName { id obj = [self objectForKey: defaultName]; if (obj != nil && ([obj isKindOfClass: NSStringClass] || [obj isKindOfClass: NSNumberClass])) { return [obj floatValue]; } return 0.0; } - (NSInteger) integerForKey: (NSString*)defaultName { id obj = [self objectForKey: defaultName]; if (obj != nil && ([obj isKindOfClass: NSStringClass] || [obj isKindOfClass: NSNumberClass])) { return [obj integerValue]; } return 0; } - (id) objectForKey: (NSString*)defaultName { id object = nil; [_lock lock]; NS_DURING { NSUInteger count = [_searchList count]; IMP pImp; IMP tImp; NSUInteger index; GS_BEGINITEMBUF(items, count, NSObject*) pImp = [_persDomains methodForSelector: objectForKeySel]; tImp = [_tempDomains methodForSelector: objectForKeySel]; [_searchList getObjects: items]; for (index = 0; index < count; index++) { NSObject *dN = items[index]; GSPersistentDomain *pd; NSDictionary *td; pd = (*pImp)(_persDomains, objectForKeySel, dN); if (pd != nil && (object = [pd objectForKey: defaultName])) break; td = (*tImp)(_tempDomains, objectForKeySel, dN); if (td != nil && (object = [td objectForKey: defaultName])) break; } RETAIN(object); GS_ENDITEMBUF(); [_lock unlock]; } NS_HANDLER { [_lock unlock]; [localException raise]; } NS_ENDHANDLER return AUTORELEASE(object); } - (void) removeObjectForKey: (NSString*)defaultName { [_lock lock]; NS_DURING { GSPersistentDomain *pd = [_persDomains objectForKey: processName]; if (nil != pd) { if ([pd setObject: nil forKey: defaultName]) { [self _changePersistentDomain: processName]; } } [_lock unlock]; } NS_HANDLER { [_lock unlock]; [localException raise]; } NS_ENDHANDLER } - (void) setBool: (BOOL)value forKey: (NSString*)defaultName { NSNumber *n = [NSNumberClass numberWithBool: value]; [self setObject: n forKey: defaultName]; } - (void) setDouble: (double)value forKey: (NSString*)defaultName { NSNumber *n = [NSNumberClass numberWithDouble: value]; [self setObject: n forKey: defaultName]; } - (void) setFloat: (float)value forKey: (NSString*)defaultName { NSNumber *n = [NSNumberClass numberWithFloat: value]; [self setObject: n forKey: defaultName]; } - (void) setInteger: (NSInteger)value forKey: (NSString*)defaultName { NSNumber *n = [NSNumberClass numberWithInteger: value]; [self setObject: n forKey: defaultName]; } static BOOL isPlistObject(id o) { if ([o isKindOfClass: NSStringClass] == YES) { return YES; } if ([o isKindOfClass: NSDataClass] == YES) { return YES; } if ([o isKindOfClass: NSDateClass] == YES) { return YES; } if ([o isKindOfClass: NSNumberClass] == YES) { return YES; } if ([o isKindOfClass: NSArrayClass] == YES) { NSEnumerator *e = [o objectEnumerator]; id tmp; while ((tmp = [e nextObject]) != nil) { if (isPlistObject(tmp) == NO) { return NO; } } return YES; } if ([o isKindOfClass: NSDictionaryClass] == YES) { NSEnumerator *e = [o keyEnumerator]; id tmp; while ((tmp = [e nextObject]) != nil) { if (isPlistObject(tmp) == NO) { return NO; } tmp = [(NSDictionary*)o objectForKey: tmp]; if (isPlistObject(tmp) == NO) { return NO; } } return YES; } return NO; } - (void) setObject: (id)value forKey: (NSString*)defaultName { if (nil == value) { [self removeObjectForKey: defaultName]; return; } if ([defaultName isKindOfClass: [NSString class]] == NO || [defaultName length] == 0) { [NSException raise: NSInvalidArgumentException format: @"attempt to set object with bad key (%@)", defaultName]; } if (isPlistObject(value) == NO) { [NSException raise: NSInvalidArgumentException format: @"attempt to set non property list object (%@) for key (%@)", value, defaultName]; } value = [value copy]; [_lock lock]; NS_DURING { GSPersistentDomain *pd; pd = [_persDomains objectForKey: processName]; if (nil == pd) { pd = [[GSPersistentDomain alloc] initWithName: processName owner: self]; [_persDomains setObject: pd forKey: processName]; RELEASE(pd); } if ([pd setObject: value forKey: defaultName]) { [self _changePersistentDomain: processName]; } [_lock unlock]; } NS_HANDLER { [_lock unlock]; [localException raise]; } NS_ENDHANDLER RELEASE(value); } - (void) setValue: (id)value forKey: (NSString*)defaultName { [self setObject: value forKey: (NSString*)defaultName]; } - (NSArray*) stringArrayForKey: (NSString*)defaultName { id arr = [self arrayForKey: defaultName]; if (arr != nil) { NSEnumerator *enumerator = [arr objectEnumerator]; id obj; while ((obj = [enumerator nextObject])) { if ([obj isKindOfClass: NSStringClass] == NO) { return nil; } } return arr; } return nil; } - (NSString*) stringForKey: (NSString*)defaultName { id obj = [self objectForKey: defaultName]; if (obj != nil && [obj isKindOfClass: NSStringClass]) return obj; return nil; } - (NSArray*) searchList { NSArray *copy = nil; [_lock lock]; NS_DURING { copy = [_searchList copy]; [_lock unlock]; } NS_HANDLER { [_lock unlock]; [localException raise]; } NS_ENDHANDLER return AUTORELEASE(copy); } - (void) setSearchList: (NSArray*)newList { [_lock lock]; NS_DURING { if (NO == [_searchList isEqual: newList]) { NSEnumerator *e; NSString *n; DESTROY(_dictionaryRep); RELEASE(_searchList); _searchList = [newList mutableCopy]; /* Ensure that any domains we need are loaded. */ e = [_searchList objectEnumerator]; while (nil != (n = [e nextObject])) { [self persistentDomainForName: n]; } updateCache(self); } [_lock unlock]; } NS_HANDLER { [_lock unlock]; [localException raise]; } NS_ENDHANDLER } - (NSDictionary*) persistentDomainForName: (NSString*)domainName { NSDictionary *copy = nil; [_lock lock]; NS_DURING { GSPersistentDomain *pd; pd = [_persDomains objectForKey: domainName]; if (nil != pd) { copy = [[pd contents] copy]; } [_lock unlock]; } NS_HANDLER { [_lock unlock]; [localException raise]; } NS_ENDHANDLER return AUTORELEASE(copy); } - (NSArray*) persistentDomainNames { NSArray *keys = nil; [_lock lock]; NS_DURING { keys = [_persDomains allKeys]; [_lock unlock]; } NS_HANDLER { [_lock unlock]; [localException raise]; } NS_ENDHANDLER return keys; } - (void) removePersistentDomainForName: (NSString*)domainName { [_lock lock]; NS_DURING { GSPersistentDomain *pd; pd = [_persDomains objectForKey: domainName]; if (nil != pd) { [pd empty]; if (NO == [domainName isEqualToString: NSGlobalDomain]) { /* Remove the domain entirely. */ [_persDomains removeObjectForKey: domainName]; } [self _changePersistentDomain: domainName]; } [_lock unlock]; } NS_HANDLER { [_lock unlock]; [localException raise]; } NS_ENDHANDLER } - (void) setPersistentDomain: (NSDictionary*)domain forName: (NSString*)domainName { NSDictionary *dict; [_lock lock]; NS_DURING { GSPersistentDomain *pd; dict = [_tempDomains objectForKey: domainName]; if (dict != nil) { [NSException raise: NSInvalidArgumentException format: @"a volatile domain called %@ exists", domainName]; } pd = [_persDomains objectForKey: domainName]; if (nil == pd) { pd = [[GSPersistentDomain alloc] initWithName: domainName owner: self]; [_persDomains setObject: pd forKey: domainName]; RELEASE(pd); } [pd setContents: domain]; [self _changePersistentDomain: domainName]; [_lock unlock]; } NS_HANDLER { [_lock unlock]; [localException raise]; } NS_ENDHANDLER } - (id) valueForKey: (NSString*)aKey { return [self objectForKey: aKey]; } - (BOOL) wantToReadDefaultsSince: (NSDate*)lastSyncDate { NSFileManager *mgr; NSDictionary *attr; mgr = [NSFileManager defaultManager]; attr = [mgr fileAttributesAtPath: _defaultsDatabase traverseLink: YES]; if (lastSyncDate == nil) { return YES; } else { if (attr == nil) { return YES; } else { NSDate *mod; /* * If the database was modified since the last synchronisation * we need to read it. */ mod = [attr objectForKey: NSFileModificationDate]; if (mod != nil && [lastSyncDate laterDate: mod] != lastSyncDate) { return YES; } } } return NO; } - (BOOL) synchronize { NSDate *saved; BOOL isLocked = NO; BOOL wasLocked = NO; BOOL result = YES; BOOL haveChange = NO; [_lock lock]; saved = _lastSync; _lastSync = [NSDate new]; // Record timestamp of this sync. NS_DURING { /* If we haven't changed anything, we only need to synchronise if * the on-disk database has been changed by someone else. */ if (_changedDomains != nil || YES == [self wantToReadDefaultsSince: saved]) { /* If we want to write but are currently read-only, try to * create the path to make things writable. */ if (_changedDomains != nil && YES == [self _readOnly]) { NSString *path = lockPath(_defaultsDatabase, NO); if (nil != path) { _fileLock = [[NSDistributedLock alloc] initWithPath: path]; } } if ([self _lockDefaultsFile: &wasLocked] == NO) { result = NO; } else { NSEnumerator *enumerator; NSString *domainName; isLocked = YES; haveChange = [self _readDefaults]; if (YES == haveChange) { DESTROY(_dictionaryRep); } if (_changedDomains != nil) { haveChange = YES; if (NO == [self _readOnly]) { GSPersistentDomain *domain; NSFileManager *mgr; mgr = [NSFileManager defaultManager]; enumerator = [_changedDomains objectEnumerator]; DESTROY(_changedDomains); // Retained by enumerator. while ((domainName = [enumerator nextObject]) != nil) { domain = [_persDomains objectForKey: domainName]; if (domain != nil) // Domain was added or changed { [domain synchronize]; } else // Domain was removed { NSString *path; path = [[_defaultsDatabase stringByAppendingPathComponent: domainName] stringByAppendingPathExtension: @"plist"]; [mgr removeFileAtPath: path handler: nil]; } } } } if (YES == haveChange) { updateCache(self); } if (YES == isLocked && NO == wasLocked) { isLocked = NO; [self _unlockDefaultsFile]; } } } } NS_HANDLER { RELEASE(_lastSync); _lastSync = saved; if (YES == isLocked && NO == wasLocked) { isLocked = NO; [self _unlockDefaultsFile]; } [_lock unlock]; [localException raise]; } NS_ENDHANDLER if (YES == result) { RELEASE(saved); } else { RELEASE(_lastSync); _lastSync = saved; } // Check and if not existent add the Application and the Global domains if ([_persDomains objectForKey: processName] == nil) { GSPersistentDomain *pd; pd = [[GSPersistentDomain alloc] initWithName: processName owner: self]; [_persDomains setObject: pd forKey: processName]; RELEASE(pd); [self _changePersistentDomain: processName]; } if ([_persDomains objectForKey: NSGlobalDomain] == nil) { GSPersistentDomain *pd; pd = [[GSPersistentDomain alloc] initWithName: NSGlobalDomain owner: self]; [_persDomains setObject: pd forKey: NSGlobalDomain]; RELEASE(pd); [self _changePersistentDomain: NSGlobalDomain]; } [_lock unlock]; if (YES == haveChange) { [[NSNotificationCenter defaultCenter] postNotificationName: NSUserDefaultsDidChangeNotification object: self]; } return result; } - (void) removeVolatileDomainForName: (NSString*)domainName { [_lock lock]; NS_DURING { DESTROY(_dictionaryRep); [_tempDomains removeObjectForKey: domainName]; if ([_searchList containsObject: domainName]) { updateCache(self); } [_lock unlock]; } NS_HANDLER { [_lock unlock]; [localException raise]; } NS_ENDHANDLER } - (void) setVolatileDomain: (NSDictionary*)domain forName: (NSString*)domainName { id dict; [_lock lock]; NS_DURING { dict = [_persDomains objectForKey: domainName]; if (dict != nil) { [NSException raise: NSInvalidArgumentException format: @"a persistent domain called %@ exists", domainName]; } dict = [_tempDomains objectForKey: domainName]; if (dict != nil) { [NSException raise: NSInvalidArgumentException format: @"the volatile domain %@ already exists", domainName]; } DESTROY(_dictionaryRep); domain = [domain mutableCopy]; [_tempDomains setObject: domain forKey: domainName]; RELEASE(domain); if ([_searchList containsObject: domainName]) { updateCache(self); } [_lock unlock]; } NS_HANDLER { [_lock unlock]; [localException raise]; } NS_ENDHANDLER } - (NSDictionary*) volatileDomainForName: (NSString*)domainName { NSDictionary *copy = nil; [_lock lock]; NS_DURING { copy = [[_tempDomains objectForKey: domainName] copy]; [_lock unlock]; } NS_HANDLER { [_lock unlock]; [localException raise]; } NS_ENDHANDLER return AUTORELEASE(copy); } - (NSArray*) volatileDomainNames { NSArray *keys = nil; [_lock lock]; NS_DURING { keys = [_tempDomains allKeys]; [_lock unlock]; } NS_HANDLER { [_lock unlock]; [localException raise]; } NS_ENDHANDLER return keys; } - (NSDictionary*) dictionaryRepresentation { NSDictionary *rep; [_lock lock]; NS_DURING { if (_dictionaryRep == nil) { NSEnumerator *enumerator; NSMutableDictionary *dictRep; id obj; id dict; IMP nImp; IMP pImp; IMP tImp; IMP addImp; pImp = [_persDomains methodForSelector: objectForKeySel]; tImp = [_tempDomains methodForSelector: objectForKeySel]; enumerator = [_searchList reverseObjectEnumerator]; nImp = [enumerator methodForSelector: nextObjectSel]; dictRep = [NSMutableDictionaryClass alloc]; dictRep = [dictRep initWithCapacity: 512]; addImp = [dictRep methodForSelector: addSel]; while ((obj = (*nImp)(enumerator, nextObjectSel)) != nil) { GSPersistentDomain *pd; pd = (*pImp)(_persDomains, objectForKeySel, obj); if (nil != pd) { dict = [pd contents]; } else { dict = (*tImp)(_tempDomains, objectForKeySel, obj); } if (nil != dict) { (*addImp)(dictRep, addSel, dict); } } _dictionaryRep = GS_IMMUTABLE(dictRep); } rep = AUTORELEASE(RETAIN(_dictionaryRep)); [_lock unlock]; } NS_HANDLER { rep = nil; [_lock unlock]; [localException raise]; } NS_ENDHANDLER return rep; } - (void) registerDefaults: (NSDictionary*)newVals { NSMutableDictionary *regDefs; [_lock lock]; NS_DURING { regDefs = [_tempDomains objectForKey: NSRegistrationDomain]; if (regDefs == nil) { regDefs = [NSMutableDictionaryClass dictionaryWithCapacity: [newVals count]]; [_tempDomains setObject: regDefs forKey: NSRegistrationDomain]; } DESTROY(_dictionaryRep); [regDefs addEntriesFromDictionary: newVals]; updateCache(self); [_lock unlock]; } NS_HANDLER { [_lock unlock]; [localException raise]; } NS_ENDHANDLER } - (void) removeSuiteNamed: (NSString*)aName { if (aName == nil) { [NSException raise: NSInvalidArgumentException format: @"attempt to remove suite with nil name"]; } [_lock lock]; NS_DURING { DESTROY(_dictionaryRep); [_searchList removeObject: aName]; updateCache(self); [_lock unlock]; } NS_HANDLER { [_lock unlock]; [localException raise]; } NS_ENDHANDLER } @end BOOL GSPrivateDefaultsFlag(GSUserDefaultFlagType type) { if (nil == classLock) { /* The order of +initialise of NSUserDefaults is such that our * flags[] array is set up directly from the process arguments * before classLock is created, so once * that variable exists * this function may be used safely. */ [NSUserDefaults class]; if (NO == hasSharedDefaults) { [NSUserDefaults standardUserDefaults]; } } return flags[type]; } /* Slightly faster than * [[NSUserDefaults standardUserDefaults] dictionaryRepresentation] * Avoiding the autorelease of the standard defaults turns out to be * a modest but significant gain when making heavy use of methods which * need localisation. */ NSDictionary *GSPrivateDefaultLocale() { NSDictionary *locale = nil; NSUserDefaults *defs = nil; if (nil == classLock) { [NSUserDefaults standardUserDefaults]; } [classLock lock]; NS_DURING { if (sharedDefaults == nil) { [NSUserDefaults standardUserDefaults]; } ASSIGN(defs, sharedDefaults); [classLock unlock]; } NS_HANDLER { [classLock unlock]; [localException raise]; } NS_ENDHANDLER locale = [defs dictionaryRepresentation]; RELEASE(defs); return locale; } @implementation NSUserDefaults (Private) + (void) _createArgumentDictionary: (NSArray*)args { NSEnumerator *enumerator; NSMutableDictionary *argDict = nil; BOOL done; id key, val; [classLock lock]; NS_DURING { enumerator = [args objectEnumerator]; argDict = [NSMutableDictionaryClass dictionaryWithCapacity: 2]; [enumerator nextObject]; // Skip process name. done = ((key = [enumerator nextObject]) == nil) ? YES : NO; while (done == NO) { /* Any value with a leading '-' may be the name of a default * in the argument domain. * NB. Testing on OSX shows that this includes a single '-' * (where the key is an empty string), but GNUstep disallows * en empty string as a key (so it can be a value). */ if ([key hasPrefix: @"-"] == YES && [key isEqual: @"-"] == NO) { /* Strip the '-' before the defaults key, and get the * corresponding value (the next argument). */ key = [key substringFromIndex: 1]; val = [enumerator nextObject]; if (nil == val) { /* No more arguments and no value ... arg is not set. */ done = YES; continue; } else if ([val hasPrefix: @"-"] == YES && [val isEqual: @"-"] == NO) { /* Value is actually an argument key ... * current key is not used (behavior matches OSX). * NB. GNUstep allows a '-' as the value for a default, * but OSX does not. */ key = val; continue; } else { // Real parameter /* Parsing the argument as a property list is very delicate. We *MUST NOT* crash here just because a strange parameter (such as `(load "test.scm")`) is passed, otherwise the whole library is useless in a foreign environment. */ NSObject *plist_val; NS_DURING { NSData *data; data = [val dataUsingEncoding: NSUTF8StringEncoding]; plist_val = [NSPropertyListSerialization propertyListFromData: data mutabilityOption: NSPropertyListMutableContainers format: 0 errorDescription: 0]; if (nil == plist_val) { plist_val = val; } } NS_HANDLER { plist_val = val; } NS_ENDHANDLER /* Make sure we don't crash being caught adding nil to a dictionary. */ if (plist_val == nil) { plist_val = val; } [argDict setObject: plist_val forKey: key]; } } done = ((key = [enumerator nextObject]) == nil); } ASSIGNCOPY(argumentsDictionary, argDict); [classLock unlock]; } NS_HANDLER { [classLock unlock]; [localException raise]; } NS_ENDHANDLER } - (void) _changePersistentDomain: (NSString*)domainName { NSAssert(nil != domainName, NSInvalidArgumentException); [_lock lock]; NS_DURING { DESTROY(_dictionaryRep); if (_changedDomains == nil) { _changedDomains = [[NSMutableArray alloc] initWithObjects: &domainName count: 1]; } else if ([_changedDomains containsObject: domainName] == NO) { [_changedDomains addObject: domainName]; } if ([_searchList containsObject: domainName]) { updateCache(self); } [[NSNotificationCenter defaultCenter] postNotificationName: NSUserDefaultsDidChangeNotification object: self]; [_lock unlock]; } NS_HANDLER { [_lock unlock]; [localException raise]; } NS_ENDHANDLER } - (NSString*) _directory { return _defaultsDatabase; } static BOOL isLocked = NO; - (BOOL) _lockDefaultsFile: (BOOL*)wasLocked { [syncLock lock]; NS_DURING { *wasLocked = isLocked; if (NO == isLocked && _fileLock != nil) { NSDate *started = [NSDateClass date]; while ([_fileLock tryLock] == NO) { NSDate *lockDate; /* * In case we have tried and failed to break the lock, * we give up after a while ... 66 seconds should give * us three lock breaks if we do them at 20 second * intervals. */ if ([started timeIntervalSinceNow] < -66.0) { fprintf(stderr, "Failed to lock user defaults database" " even after breaking old locks!\n"); break; } ENTER_POOL /* If lockDate is nil, we should be able to lock again ... but we * wait a little anyway ... so that in the case of a locking * problem we do an idle wait rather than a busy one. */ if ((lockDate = [_fileLock lockDate]) != nil && [lockDate timeIntervalSinceNow] < -20.0) { NSLog(@"NSUserDefaults file lock at %@ is dated %@ ... break", _fileLock, lockDate); [_fileLock breakLock]; } else { [NSThread sleepForTimeInterval: 0.1]; } LEAVE_POOL; } isLocked = YES; } [syncLock unlock]; } NS_HANDLER { [syncLock unlock]; [localException raise]; } NS_ENDHANDLER return isLocked; } - (BOOL) _readDefaults { NSEnumerator *enumerator; NSString *domainName; BOOL haveChange = NO; enumerator = [[[NSFileManager defaultManager] directoryContentsAtPath: _defaultsDatabase] objectEnumerator]; while (nil != (domainName = [enumerator nextObject])) { if (NO == [[domainName pathExtension] isEqual: @"plist"]) { /* We only treat files with a .plist extension as being * defaults domain files. */ continue; } domainName = [domainName stringByDeletingPathExtension]; /* We may what to know what domains are being loaded. */ NSDebugMLog(@"domain name: %@", domainName); /* We only look at files which do not represent domains in the * _changedDomains list, since our internal information on the * domains in that list overrides anything on disk. */ if (NO == [_changedDomains containsObject: domainName]) { GSPersistentDomain *pd; pd = [_persDomains objectForKey: domainName]; if (nil == pd) { /* We had no record of this domain, so we create a new * instance for it and add it to the dictionary of all * persistent domains. */ pd = [GSPersistentDomain alloc]; pd = [pd initWithName: domainName owner: self]; [_persDomains setObject: pd forKey: domainName]; RELEASE(pd); haveChange = YES; } if (YES == [_searchList containsObject: domainName]) { /* This domain is in the search list ... so we must * synchronize to load the domain contents into memory * so a lookup will work. */ if (YES == [pd synchronize]) { haveChange = YES; } } } } return haveChange; } - (BOOL) _readOnly { return (nil == _fileLock) ? YES : NO; } - (void) _unlockDefaultsFile { [syncLock lock]; NS_DURING { if (YES == isLocked) { [_fileLock unlock]; } } NS_HANDLER { fprintf(stderr, "Warning ... someone broke our lock (%s) ... and may have" " interfered with updating defaults data in file.", [lockPath(_defaultsDatabase, NO) UTF8String]); } NS_ENDHANDLER isLocked = NO; [syncLock unlock]; } @end @implementation GSPersistentDomain - (NSDictionary*) contents { if (NO == loaded) { [self synchronize]; } return contents; } - (void) dealloc { DESTROY(added); DESTROY(removed); DESTROY(modified); DESTROY(contents); DESTROY(name); DESTROY(path); [super dealloc]; } - (void) empty { if (NO == loaded) { [self synchronize]; } if ([contents count] > 0) { NSEnumerator *e; NSString *k; e = [[contents allKeys] objectEnumerator]; while (nil != (k = [e nextObject])) { [self setObject: nil forKey: k]; } [self synchronize]; } } - (id) initWithName: (NSString*)n owner: (NSUserDefaults*)o { if (nil != (self = [super init])) { owner = o; // Not retained name = [n copy]; path = RETAIN([[[owner _directory] stringByAppendingPathComponent: name] stringByAppendingPathExtension: @"plist"]); contents = [NSMutableDictionary new]; added = [NSMutableSet new]; removed = [NSMutableSet new]; modified = [NSMutableSet new]; } return self; } - (NSString*) name { return name; } - (id) objectForKey: (NSString*)aKey { return [contents objectForKey: aKey]; } - (BOOL) setContents: (NSDictionary*)domain { BOOL changed = NO; if (NO == [contents isEqual: domain]) { NSEnumerator *e; NSString *k; e = [[contents allKeys] objectEnumerator]; while (nil != (k = [e nextObject])) { if ([domain objectForKey: k] == nil) { [self setObject: nil forKey: k]; } } e = [domain keyEnumerator]; while (nil != (k = [e nextObject])) { [self setObject: [domain objectForKey: k] forKey: k]; } changed = YES; } return changed; } - (BOOL) setObject: (id)anObject forKey: (NSString*)aKey { if (nil == anObject) { if (nil == [contents objectForKey: aKey]) { return NO; } if ([added member: aKey]) { [added removeObject: aKey]; } else if ([modified member: aKey]) { [modified removeObject: aKey]; [removed addObject: aKey]; } else { [removed addObject: aKey]; } [contents removeObjectForKey: aKey]; return YES; } else { id old = [contents objectForKey: aKey]; if ([anObject isEqual: old]) { return NO; } if ([removed member: aKey]) { [modified addObject: aKey]; [removed removeObject: aKey]; } else if (nil == [modified member: aKey] && nil == [added member: aKey]) { if (nil == old) { [added addObject: aKey]; } else { [modified addObject: aKey]; } } [contents setObject: anObject forKey: aKey]; return YES; } } - (BOOL) synchronize { BOOL isLocked = NO; BOOL wasLocked = NO; BOOL shouldLock = NO; BOOL defaultsChanged = NO; BOOL hasLocalChanges = NO; if ([removed count] || [added count] || [modified count]) { hasLocalChanges = YES; } if (YES == hasLocalChanges && NO == [owner _readOnly]) { shouldLock = YES; } if (YES == shouldLock && YES == [owner _lockDefaultsFile: &wasLocked]) { isLocked = YES; } NS_DURING { NSFileManager *mgr; NSMutableDictionary *disk; mgr = [NSFileManager defaultManager]; disk = nil; if (YES == [mgr isReadableFileAtPath: path]) { NSData *data; data = [NSData dataWithContentsOfFile: path]; if (nil != data) { id o; o = [NSPropertyListSerialization propertyListWithData: data options: NSPropertyListImmutable format: 0 error: 0]; if ([o isKindOfClass: [NSDictionary class]]) { disk = AUTORELEASE([o mutableCopy]); } } } if (nil == disk) { disk = [NSMutableDictionary dictionary]; } loaded = YES; if (NO == [contents isEqual: disk]) { defaultsChanged = YES; if (YES == hasLocalChanges) { NSEnumerator *e; NSString *k; e = [removed objectEnumerator]; while (nil != (k = [e nextObject])) { [disk removeObjectForKey: k]; } e = [added objectEnumerator]; while (nil != (k = [e nextObject])) { [disk setObject: [contents objectForKey: k] forKey: k]; } e = [modified objectEnumerator]; while (nil != (k = [e nextObject])) { [disk setObject: [contents objectForKey: k] forKey: k]; } } ASSIGN(contents, disk); } if (YES == hasLocalChanges) { BOOL written = NO; if (NO == [owner _readOnly]) { if (YES == isLocked) { if (0 == [contents count]) { /* Remove empty defaults dictionary. */ written = writeDictionary(nil, path); } else { /* Write dictionary to file. */ written = writeDictionary(contents, path); } } } if (YES == written) { [added removeAllObjects]; [removed removeAllObjects]; [modified removeAllObjects]; } } if (YES == isLocked && NO == wasLocked) { isLocked = NO; [owner _unlockDefaultsFile]; } } NS_HANDLER { fprintf(stderr, "problem synchronising defaults domain '%s': %s\n", [name UTF8String], [[localException description] UTF8String]); if (YES == isLocked && NO == wasLocked) { [owner _unlockDefaultsFile]; } } NS_ENDHANDLER return defaultsChanged; } @end gnustep-base-1.29.0/Source/NSUserNotification.m000066400000000000000000000171241435650067400213630ustar00rootroot00000000000000/* Implementation for NSUserNotification for GNUstep Copyright (C) 2014 Free Software Foundation, Inc. Written by: Marcus Mueller Date: 2014 This file is part of the GNUstep Base Library. 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 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 USA. */ #import #if __has_feature(objc_default_synthesize_properties) #define EXPOSE_NSUserNotification_IVARS 1 #define EXPOSE_NSUserNotificationCenter_IVARS 1 #import "GNUstepBase/NSObject+GNUstepBase.h" #import "Foundation/NSUserNotification.h" #import "Foundation/NSArray.h" #import "Foundation/NSBundle.h" #import "Foundation/NSCalendar.h" #import "Foundation/NSDate.h" #import "Foundation/NSString.h" #import "Foundation/NSTimeZone.h" @interface NSUserNotification () @property (readwrite) NSDate *actualDeliveryDate; @property (readwrite, getter=isPresented) BOOL presented; @property (readwrite, getter=isRemote) BOOL remote; @property (readwrite) NSUserNotificationActivationType activationType; @property (readwrite) NSAttributedString *response; @end @implementation NSUserNotification - (id) init { if (nil != (self = [super init])) { [self setHasActionButton: YES]; } return self; } - (void) dealloc { RELEASE(_uniqueId); [super dealloc]; } - (id) copyWithZone: (NSZone *)zone { return NSCopyObject(self, 0, zone); } - (NSString *) description { NSMutableString *d = [NSMutableString stringWithCapacity:80]; [d appendFormat: @"<%s:%p< {", object_getClassName(self), self]; [d appendFormat: @" title: \"%@\"", [self title]]; [d appendFormat: @" informativeText: \"%@\"", [self informativeText]]; [d appendFormat: @" actionButtonTitle: \"%@\"", [self actionButtonTitle]]; if ([self actualDeliveryDate]) { [d appendFormat: @" actualDeliveryDate: %@", [self actualDeliveryDate]]; [d appendFormat: @" presented: %s", [self isPresented] ? "YES" : "NO"]; } [d appendFormat: @" next delivery date: %@", [self deliveryDate]]; [d appendString: @" }"]; return d; } @end @interface NSUserNotificationCenter () @property (readwrite) NSArray *deliveredNotifications; @end @interface NSUserNotificationCenter (Private) + (Class) defaultUserNotificationCenterClass; + (void) setDefaultUserNotificationCenter: (NSUserNotificationCenter *)unc; - (NSUserNotification *) deliveredNotificationWithUniqueId: (id)uniqueId; - (NSDate *) nextDeliveryDateForNotification: (NSUserNotification *)un; @end @implementation NSUserNotificationCenter static NSUserNotificationCenter *defaultUserNotificationCenter = nil; + (Class) defaultUserNotificationCenterClass { NSBundle *bundle = [NSBundle bundleForClass: [self class]]; NSString *bundlePath = [bundle pathForResource: @"NSUserNotification" ofType: @"bundle" inDirectory: nil]; if (bundlePath) { bundle = [NSBundle bundleWithPath: bundlePath]; if (bundle) { return [bundle principalClass]; } } return self; } + (void) atExit { DESTROY(defaultUserNotificationCenter); } + (void) initialize { if ([NSUserNotificationCenter class] == self) { Class uncClass = [self defaultUserNotificationCenterClass]; defaultUserNotificationCenter = [[uncClass alloc] init]; [self registerAtExit]; } } + (void) setDefaultUserNotificationCenter: (NSUserNotificationCenter *)unc { ASSIGN(defaultUserNotificationCenter, unc); } + (NSUserNotificationCenter *) defaultUserNotificationCenter { return defaultUserNotificationCenter; } - (id) init { self = [super init]; if (self) { _scheduledNotifications = [[NSMutableArray alloc] init]; _deliveredNotifications = [[NSMutableArray alloc] init]; } return self; } - (void) dealloc { [NSObject cancelPreviousPerformRequestsWithTarget: self]; RELEASE(_scheduledNotifications); [self removeAllDeliveredNotifications]; RELEASE(_deliveredNotifications); [super dealloc]; } - (void) scheduleNotification: (NSUserNotification *)un { if (![un deliveryDate]) { [self deliverNotification: un]; return; } [_scheduledNotifications addObject: un]; NSTimeInterval delay = [[un deliveryDate] timeIntervalSinceNow]; [self performSelector: @selector(deliverNotification:) withObject: un afterDelay: delay]; } - (void) removeScheduledNotification: (NSUserNotification *)un { [NSObject cancelPreviousPerformRequestsWithTarget: self selector: @selector(deliverNotification:) object: un]; [_scheduledNotifications removeObject: un]; } - (void) _deliverNotification: (NSUserNotification *)un { [un setPresented: YES]; NSLog(@"NOTE: %@", un); } - (NSDate *) nextDeliveryDateForNotification: (NSUserNotification *)un { NSDateComponents *repeatInterval = [un deliveryRepeatInterval]; if (!repeatInterval) return nil; NSCalendar *cal = [[repeatInterval calendar] copy]; if (!cal) cal = [[NSCalendar currentCalendar] copy]; if ([repeatInterval timeZone]) [cal setTimeZone:[repeatInterval timeZone]]; if (![cal timeZone]) [cal setTimeZone:[NSTimeZone localTimeZone]]; NSDate *nextDeliveryDate = [cal dateByAddingComponents: repeatInterval toDate: [un actualDeliveryDate] options: 0]; RELEASE(cal); return nextDeliveryDate; } - (void) deliverNotification: (NSUserNotification *)un { [self removeScheduledNotification: un]; [self _deliverNotification: un]; NSDate *actualDeliveryDate = [un deliveryDate]; if (!actualDeliveryDate) actualDeliveryDate = [NSDate date]; [un setActualDeliveryDate: actualDeliveryDate]; [_deliveredNotifications addObject: un]; [un setDeliveryDate: [self nextDeliveryDateForNotification: un]]; if ([un deliveryDate]) [self scheduleNotification: un]; if ([self delegate] && [[self delegate] respondsToSelector: @selector(userNotificationCenter:didDeliverNotification:)]) { [[self delegate] userNotificationCenter: self didDeliverNotification: un]; } } - (void) _removeDeliveredNotification: (NSUserNotification *)un { } - (void) removeDeliveredNotification: (NSUserNotification *)un { [self _removeDeliveredNotification: un]; [_deliveredNotifications removeObject: un]; } - (void) removeAllDeliveredNotifications { NSUInteger i, count = [_deliveredNotifications count]; for (i = 0; i < count; i++) { NSUserNotification *un = [_deliveredNotifications objectAtIndex: i]; [self _removeDeliveredNotification:un]; } [_deliveredNotifications removeAllObjects]; } - (NSUserNotification *) deliveredNotificationWithUniqueId: (id)uniqueId { NSUInteger i, count = [_deliveredNotifications count]; for (i = 0; i < count; i++) { NSUserNotification *un = [_deliveredNotifications objectAtIndex: i]; if ([un->_uniqueId isEqual: uniqueId]) { return un; } } return nil; } @end #endif /* __has_feature(objc_default_synthesize_properties) */ gnustep-base-1.29.0/Source/NSUserScriptTask.m000066400000000000000000000020331435650067400210150ustar00rootroot00000000000000 /* Implementation of class NSUserScriptTask Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory John Casamento Date: Sep 2019 This file is part of the GNUstep Library. 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 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 USA. */ #include @implementation NSUserScriptTask @end gnustep-base-1.29.0/Source/NSValue.m000066400000000000000000000453721435650067400171600ustar00rootroot00000000000000/** NSValue.m - Object encapsulation for C types. Copyright (C) 1993, 1994, 1996, 1999 Free Software Foundation, Inc. Written by: Adam Fedor Date: Mar 1995 Updated by: Richard Frith-Macdonald Date: Jan 2001 This file is part of the GNUstep Base Library. 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 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 USA. NSValue class reference $Date$ $Revision$ */ #import "common.h" #import "Foundation/NSValue.h" #import "Foundation/NSCoder.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSException.h" #import "Foundation/NSMapTable.h" #import "Foundation/NSLock.h" #import "Foundation/NSData.h" @interface GSPlaceholderValue : NSValue @end @class GSValue; @interface GSValue : NSObject // Help the compiler @end @class GSNonretainedObjectValue; @interface GSNonretainedObjectValue : NSObject // Help the compiler @end @class GSPointValue; @interface GSPointValue : NSObject // Help the compiler @end @class GSPointerValue; @interface GSPointerValue : NSObject // Help the compiler @end @class GSRangeValue; @interface GSRangeValue : NSObject // Help the compiler @end @class GSRectValue; @interface GSRectValue : NSObject // Help the compiler @end @class GSSizeValue; @interface GSSizeValue : NSObject // Help the compiler @end @class NSDataStatic; // Needed for decoding. @interface NSDataStatic : NSData // Help the compiler @end static Class abstractClass; static Class concreteClass; static Class nonretainedObjectValueClass; static Class pointValueClass; static Class pointerValueClass; static Class rangeValueClass; static Class rectValueClass; static Class sizeValueClass; static Class GSPlaceholderValueClass; static GSPlaceholderValue *defaultPlaceholderValue; static NSMapTable *placeholderMap; static NSLock *placeholderLock; @implementation NSValue + (void) initialize { if (self == [NSValue class]) { abstractClass = self; [abstractClass setVersion: 3]; // Version 3 concreteClass = [GSValue class]; nonretainedObjectValueClass = [GSNonretainedObjectValue class]; pointValueClass = [GSPointValue class]; pointerValueClass = [GSPointerValue class]; rangeValueClass = [GSRangeValue class]; rectValueClass = [GSRectValue class]; sizeValueClass = [GSSizeValue class]; GSPlaceholderValueClass = [GSPlaceholderValue class]; /* * Set up infrastructure for placeholder values. */ defaultPlaceholderValue = (GSPlaceholderValue*) NSAllocateObject(GSPlaceholderValueClass, 0, NSDefaultMallocZone()); [[NSObject leakAt: (id*)&defaultPlaceholderValue] release]; placeholderMap = NSCreateMapTable(NSNonOwnedPointerMapKeyCallBacks, NSNonRetainedObjectMapValueCallBacks, 0); [[NSObject leakAt: (id*)&placeholderMap] release]; placeholderLock = [NSLock new]; [[NSObject leakAt: (id*)&placeholderLock] release]; } } + (id) allocWithZone: (NSZone*)z { if (self == abstractClass) { if (z == NSDefaultMallocZone() || z == 0) { /* * As a special case, we can return a placeholder for a value * in the default malloc zone extremely efficiently. */ return defaultPlaceholderValue; } else { id obj; /* * For anything other than the default zone, we need to * locate the correct placeholder in the (lock protected) * table of placeholders. */ [placeholderLock lock]; obj = (id)NSMapGet(placeholderMap, (void*)z); if (obj == nil) { /* * There is no placeholder object for this zone, so we * create a new one and use that. */ obj = (id)NSAllocateObject(GSPlaceholderValueClass, 0, z); NSMapInsert(placeholderMap, (void*)z, (void*)obj); } [placeholderLock unlock]; return obj; } } else { return NSAllocateObject(self, 0, z); } } // NSCopying - always a simple retain. - (id) copy { return RETAIN(self); } - (id) copyWithZone: (NSZone *)zone { return RETAIN(self); } /* Returns the concrete class associated with the type encoding */ + (Class) valueClassWithObjCType: (const char *)type { Class theClass = concreteClass; /* Let someone else deal with this error */ if (!type) return theClass; /* Try for an exact type match. */ if (strcmp(@encode(id), type) == 0) theClass = nonretainedObjectValueClass; else if (strcmp(@encode(NSPoint), type) == 0) theClass = pointValueClass; else if (strcmp(@encode(void *), type) == 0) theClass = pointerValueClass; else if (strcmp(@encode(NSRange), type) == 0) theClass = rangeValueClass; else if (strcmp(@encode(NSRect), type) == 0) theClass = rectValueClass; else if (strcmp(@encode(NSSize), type) == 0) theClass = sizeValueClass; /* Try for equivalent types match. */ else if (GSSelectorTypesMatch(@encode(id), type)) theClass = nonretainedObjectValueClass; else if (GSSelectorTypesMatch(@encode(NSPoint), type)) theClass = pointValueClass; else if (GSSelectorTypesMatch(@encode(void *), type)) theClass = pointerValueClass; else if (GSSelectorTypesMatch(@encode(NSRange), type)) theClass = rangeValueClass; else if (GSSelectorTypesMatch(@encode(NSRect), type)) theClass = rectValueClass; else if (GSSelectorTypesMatch(@encode(NSSize), type)) theClass = sizeValueClass; return theClass; } // Allocating and Initializing + (NSValue*) value: (const void *)value withObjCType: (const char *)type { Class theClass = [self valueClassWithObjCType: type]; NSValue *theObj; theObj = [theClass allocWithZone: NSDefaultMallocZone()]; theObj = [theObj initWithBytes: value objCType: type]; return AUTORELEASE(theObj); } + (NSValue*) valueWithBytes: (const void *)value objCType: (const char *)type { Class theClass = [self valueClassWithObjCType: type]; NSValue *theObj; theObj = [theClass allocWithZone: NSDefaultMallocZone()]; theObj = [theObj initWithBytes: value objCType: type]; return AUTORELEASE(theObj); } + (NSValue*) valueWithNonretainedObject: (id)anObject { NSValue *theObj; theObj = [nonretainedObjectValueClass allocWithZone: NSDefaultMallocZone()]; theObj = [theObj initWithBytes: &anObject objCType: @encode(id)]; return AUTORELEASE(theObj); } + (NSValue*) valueWithPoint: (NSPoint)point { NSValue *theObj; theObj = [pointValueClass allocWithZone: NSDefaultMallocZone()]; theObj = [theObj initWithBytes: &point objCType: @encode(NSPoint)]; return AUTORELEASE(theObj); } + (NSValue*) valueWithPointer: (const void *)pointer { NSValue *theObj; theObj = [pointerValueClass allocWithZone: NSDefaultMallocZone()]; theObj = [theObj initWithBytes: &pointer objCType: @encode(void*)]; return AUTORELEASE(theObj); } + (NSValue*) valueWithRange: (NSRange)range { NSValue *theObj; theObj = [rangeValueClass allocWithZone: NSDefaultMallocZone()]; theObj = [theObj initWithBytes: &range objCType: @encode(NSRange)]; return AUTORELEASE(theObj); } + (NSValue*) valueWithRect: (NSRect)rect { NSValue *theObj; theObj = [rectValueClass allocWithZone: NSDefaultMallocZone()]; theObj = [theObj initWithBytes: &rect objCType: @encode(NSRect)]; return AUTORELEASE(theObj); } + (NSValue*) valueWithSize: (NSSize)size { NSValue *theObj; theObj = [sizeValueClass allocWithZone: NSDefaultMallocZone()]; theObj = [theObj initWithBytes: &size objCType: @encode(NSSize)]; return AUTORELEASE(theObj); } + (NSValue*) valueFromString: (NSString *)string { NSDictionary *dict = [string propertyList]; if (dict == nil) return nil; if ([dict objectForKey: @"location"]) { NSRange range; range = NSMakeRange([[dict objectForKey: @"location"] intValue], [[dict objectForKey: @"length"] intValue]); return [abstractClass valueWithRange: range]; } else if ([dict objectForKey: @"width"] && [dict objectForKey: @"x"]) { NSRect rect; rect = NSMakeRect([[dict objectForKey: @"x"] floatValue], [[dict objectForKey: @"y"] floatValue], [[dict objectForKey: @"width"] floatValue], [[dict objectForKey: @"height"] floatValue]); return [abstractClass valueWithRect: rect]; } else if ([dict objectForKey: @"width"]) { NSSize size; size = NSMakeSize([[dict objectForKey: @"width"] floatValue], [[dict objectForKey: @"height"] floatValue]); return [abstractClass valueWithSize: size]; } else if ([dict objectForKey: @"x"]) { NSPoint point; point = NSMakePoint([[dict objectForKey: @"x"] floatValue], [[dict objectForKey: @"y"] floatValue]); return [abstractClass valueWithPoint: point]; } return nil; } - (id) initWithBytes: (const void*)data objCType: (const char*)type { [self subclassResponsibility: _cmd]; return nil; } // Accessing Data /* All the rest of these methods must be implemented by a subclass */ - (void) getValue: (void *)value { [self subclassResponsibility: _cmd]; } - (BOOL) isEqual: (id)other { if ([other isKindOfClass: [self class]]) { return [self isEqualToValue: other]; } return NO; } - (BOOL) isEqualToValue: (NSValue*)other { [self subclassResponsibility: _cmd]; return NO; } - (const char *) objCType { [self subclassResponsibility: _cmd]; return 0; } - (id) nonretainedObjectValue { [self subclassResponsibility: _cmd]; return 0; } - (void *) pointerValue { [self subclassResponsibility: _cmd]; return 0; } - (NSRange) rangeValue { [self subclassResponsibility: _cmd]; return NSMakeRange(0,0); } - (NSRect) rectValue { [self subclassResponsibility: _cmd]; return NSMakeRect(0,0,0,0); } - (NSSize) sizeValue { [self subclassResponsibility: _cmd]; return NSMakeSize(0,0); } - (NSPoint) pointValue { [self subclassResponsibility: _cmd]; return NSMakePoint(0,0); } - (Class) classForCoder { return abstractClass; } - (void) encodeWithCoder: (NSCoder *)coder { NSUInteger tsize; unsigned size; const char *data; const char *objctype = [self objCType]; NSMutableData *d; size = strlen(objctype)+1; [coder encodeValueOfObjCType: @encode(unsigned) at: &size]; [coder encodeArrayOfObjCType: @encode(signed char) count: size at: objctype]; if (strncmp("{_NSSize=", objctype, 9) == 0) { NSSize v = [self sizeValue]; [coder encodeValueOfObjCType: objctype at: &v]; return; } else if (strncmp("{_NSPoint=", objctype, 10) == 0) { NSPoint v = [self pointValue]; [coder encodeValueOfObjCType: objctype at: &v]; return; } else if (strncmp("{_NSRect=", objctype, 9) == 0) { NSRect v = [self rectValue]; [coder encodeValueOfObjCType: objctype at: &v]; return; } else if (strncmp("{_NSRange=", objctype, 10) == 0) { NSRange v = [self rangeValue]; [coder encodeValueOfObjCType: objctype at: &v]; return; } NSGetSizeAndAlignment(objctype, &tsize, NULL); data = (void *)NSZoneMalloc([self zone], tsize); [self getValue: (void*)data]; d = [NSMutableData new]; [d serializeDataAt: data ofObjCType: objctype context: nil]; size = [d length]; [coder encodeValueOfObjCType: @encode(unsigned) at: &size]; NSZoneFree(NSDefaultMallocZone(), (void*)data); data = [d bytes]; [coder encodeArrayOfObjCType: @encode(unsigned char) count: size at: data]; RELEASE(d); } - (id) initWithCoder: (NSCoder *)coder { char type[64]; const char *objctype; Class c; id o; NSUInteger tsize; unsigned size; int ver; [coder decodeValueOfObjCType: @encode(unsigned) at: &size]; /* * For almost all type encodings, we can use space on the stack, * but to handle exceptionally large ones (possibly some huge structs) * we have a strategy of allocating and deallocating heap space too. */ if (size <= 64) { objctype = type; } else { objctype = (void*)NSZoneMalloc(NSDefaultMallocZone(), size); } [coder decodeArrayOfObjCType: @encode(signed char) count: size at: (void*)objctype]; if (strncmp("{_NSSize=", objctype, 9) == 0) c = [abstractClass valueClassWithObjCType: @encode(NSSize)]; else if (strncmp("{_NSPoint=", objctype, 10) == 0) c = [abstractClass valueClassWithObjCType: @encode(NSPoint)]; else if (strncmp("{_NSRect=", objctype, 9) == 0) c = [abstractClass valueClassWithObjCType: @encode(NSRect)]; else if (strncmp("{_NSRange=", objctype, 10) == 0) c = [abstractClass valueClassWithObjCType: @encode(NSRange)]; else c = [abstractClass valueClassWithObjCType: objctype]; o = [c allocWithZone: [coder objectZone]]; ver = [coder versionForClassName: @"NSValue"]; if (ver > 2) { if (c == pointValueClass) { NSPoint v; [coder decodeValueOfObjCType: @encode(NSPoint) at: &v]; DESTROY(self); return [o initWithBytes: &v objCType: @encode(NSPoint)]; } else if (c == sizeValueClass) { NSSize v; [coder decodeValueOfObjCType: @encode(NSSize) at: &v]; DESTROY(self); return [o initWithBytes: &v objCType: @encode(NSSize)]; } else if (c == rangeValueClass) { NSRange v; [coder decodeValueOfObjCType: @encode(NSRange) at: &v]; DESTROY(self); return [o initWithBytes: &v objCType: @encode(NSRange)]; } else if (c == rectValueClass) { NSRect v; [coder decodeValueOfObjCType: @encode(NSRect) at: &v]; DESTROY(self); return [o initWithBytes: &v objCType: @encode(NSRect)]; } } if (ver < 2) { if (ver < 1) { if (c == pointValueClass) { NSPoint v; [coder decodeValueOfObjCType: @encode(NSPoint) at: &v]; o = [o initWithBytes: &v objCType: @encode(NSPoint)]; } else if (c == sizeValueClass) { NSSize v; [coder decodeValueOfObjCType: @encode(NSSize) at: &v]; o = [o initWithBytes: &v objCType: @encode(NSSize)]; } else if (c == rangeValueClass) { NSRange v; [coder decodeValueOfObjCType: @encode(NSRange) at: &v]; o = [o initWithBytes: &v objCType: @encode(NSRange)]; } else if (c == rectValueClass) { NSRect v; [coder decodeValueOfObjCType: @encode(NSRect) at: &v]; o = [o initWithBytes: &v objCType: @encode(NSRect)]; } else { unsigned char *data; [coder decodeValueOfObjCType: @encode(unsigned) at: &size]; data = (void *)NSZoneMalloc(NSDefaultMallocZone(), size); [coder decodeArrayOfObjCType: @encode(unsigned char) count: size at: (void*)data]; o = [o initWithBytes: data objCType: objctype]; NSZoneFree(NSDefaultMallocZone(), data); } } else { NSData *d; unsigned cursor = 0; /* * For performance, decode small values directly onto the stack, * For larger values we allocate and deallocate heap space. */ NSGetSizeAndAlignment(objctype, &tsize, NULL); if (tsize <= 64) { unsigned char data[tsize]; [coder decodeValueOfObjCType: @encode(id) at: &d]; [d deserializeDataAt: data ofObjCType: objctype atCursor: &cursor context: nil]; o = [o initWithBytes: data objCType: objctype]; RELEASE(d); } else { unsigned char *data; data = (void *)NSZoneMalloc(NSDefaultMallocZone(), tsize); [coder decodeValueOfObjCType: @encode(id) at: &d]; [d deserializeDataAt: data ofObjCType: objctype atCursor: &cursor context: nil]; o = [o initWithBytes: data objCType: objctype]; RELEASE(d); NSZoneFree(NSDefaultMallocZone(), data); } } } else { static NSData *d = nil; unsigned cursor = 0; if (d == nil) { d = [NSDataStatic allocWithZone: NSDefaultMallocZone()]; } /* * For performance, decode small values directly onto the stack, * For larger values we allocate and deallocate heap space. */ NSGetSizeAndAlignment(objctype, &tsize, NULL); if (tsize <= 64) { unsigned char data[tsize]; [coder decodeValueOfObjCType: @encode(unsigned) at: &size]; { unsigned char serialized[size]; [coder decodeArrayOfObjCType: @encode(unsigned char) count: size at: (void*)serialized]; d = [d initWithBytesNoCopy: (void*)serialized length: size freeWhenDone: NO]; [d deserializeDataAt: data ofObjCType: objctype atCursor: &cursor context: nil]; } o = [o initWithBytes: data objCType: objctype]; } else { void *data; data = (void *)NSZoneMalloc(NSDefaultMallocZone(), tsize); [coder decodeValueOfObjCType: @encode(unsigned) at: &size]; { void *serialized; serialized = (void *)NSZoneMalloc(NSDefaultMallocZone(), size); [coder decodeArrayOfObjCType: @encode(unsigned char) count: size at: serialized]; d = [d initWithBytesNoCopy: serialized length: size]; [d deserializeDataAt: data ofObjCType: objctype atCursor: &cursor context: nil]; NSZoneFree(NSDefaultMallocZone(), serialized); } o = [o initWithBytes: data objCType: objctype]; NSZoneFree(NSDefaultMallocZone(), data); } } if (objctype != type) { NSZoneFree(NSDefaultMallocZone(), (void*)objctype); } DESTROY(self); self = o; return self; } @end @implementation GSPlaceholderValue - (id) autorelease { NSWarnLog(@"-autorelease sent to uninitialised value"); return self; // placeholders never get released. } - (void) dealloc { GSNOSUPERDEALLOC; // placeholders never get deallocated. } - (void) getValue: (void*)data { [NSException raise: NSInternalInconsistencyException format: @"attempt to use uninitialised value"]; } - (id) initWithBytes: (const void*)data objCType: (const char*)type { Class c = [abstractClass valueClassWithObjCType: type]; self = (id)NSAllocateObject(c, 0, [self zone]); return [self initWithBytes: data objCType: type]; } - (const char*) objCType { [NSException raise: NSInternalInconsistencyException format: @"attempt to use uninitialised value"]; return 0; } - (oneway void) release { return; // placeholders never get released. } - (id) retain { return self; // placeholders never get retained. } @end gnustep-base-1.29.0/Source/NSValueTransformer.m000066400000000000000000000123611435650067400213730ustar00rootroot00000000000000/* Implementation for NSValueTransformer for GNUStep Copyright (C) 2006 Free Software Foundation, Inc. Written Dr. H. Nikolaus Schaller Created on Mon Mar 21 2005. Updated (thread safety) by Richard Frith-Macdonald This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #define EXPOSE_NSValueTransformer_IVARS 1 #import "Foundation/NSData.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSException.h" #import "Foundation/NSArchiver.h" #import "Foundation/NSValue.h" #import "Foundation/NSValueTransformer.h" #import "GNUstepBase/GSLock.h" @interface NSNegateBooleanTransformer : NSValueTransformer @end @interface NSIsNilTransformer : NSValueTransformer @end @interface NSIsNotNilTransformer : NSValueTransformer @end @interface NSUnarchiveFromDataTransformer : NSValueTransformer @end @implementation NSValueTransformer // non-abstract methods static NSMutableDictionary *registry = nil; static NSRecursiveLock *lock = nil; + (void) initialize { if (lock == nil) { NSValueTransformer *t; lock = [NSRecursiveLock new]; [[NSObject leakAt: &lock] release]; registry = [[NSMutableDictionary alloc] init]; [[NSObject leakAt: ®istry] release]; t = [NSNegateBooleanTransformer new]; [self setValueTransformer: t forName: NSNegateBooleanTransformerName]; RELEASE(t); t = [NSIsNilTransformer new]; [self setValueTransformer: t forName: NSIsNilTransformerName]; RELEASE(t); t = [NSIsNotNilTransformer new]; [self setValueTransformer: t forName: NSIsNotNilTransformerName]; RELEASE(t); t = [NSUnarchiveFromDataTransformer new]; [self setValueTransformer: t forName: NSUnarchiveFromDataTransformerName]; RELEASE(t); } } + (void) setValueTransformer: (NSValueTransformer *)transformer forName: (NSString *)name { [lock lock]; [registry setObject: transformer forKey: name]; [lock unlock]; } + (NSValueTransformer *) valueTransformerForName: (NSString *)name { NSValueTransformer *transformer; [lock lock]; transformer = [registry objectForKey: name]; IF_NO_ARC([transformer retain];) if (transformer == nil) { Class transformerClass = NSClassFromString(name); if (transformerClass != Nil && [transformerClass isSubclassOfClass: [NSValueTransformer class]]) { transformer = [[transformerClass alloc] init]; [registry setObject: transformer forKey: name]; } } [lock unlock]; return AUTORELEASE(transformer); } + (NSArray *) valueTransformerNames { NSArray *names; [lock lock]; names = [registry allKeys]; [lock unlock]; return names; } + (BOOL) allowsReverseTransformation { [self subclassResponsibility: _cmd]; return NO; } + (Class) transformedValueClass { return [self subclassResponsibility: _cmd]; } - (id) reverseTransformedValue: (id)value { if ([[self class] allowsReverseTransformation] == NO) { [NSException raise: NSGenericException format: @"[%@] is not reversible", NSStringFromClass([self class])]; } return [self transformedValue: value]; } - (id) transformedValue: (id)value { return [self subclassResponsibility: _cmd]; } @end // builtin transformers @implementation NSNegateBooleanTransformer + (BOOL) allowsReverseTransformation { return YES; } + (Class) transformedValueClass { return [NSNumber class]; } - (id) reverseTransformedValue: (id) value { return [NSNumber numberWithBool: [value boolValue] ? NO : YES]; } - (id) transformedValue: (id)value { return [NSNumber numberWithBool: [value boolValue] ? NO : YES]; } @end @implementation NSIsNilTransformer + (BOOL) allowsReverseTransformation { return NO; } + (Class) transformedValueClass { return [NSNumber class]; } - (id) transformedValue: (id)value { return [NSNumber numberWithBool: (value == nil) ? YES : NO]; } @end @implementation NSIsNotNilTransformer + (BOOL) allowsReverseTransformation { return NO; } + (Class) transformedValueClass { return [NSNumber class]; } - (id) transformedValue: (id)value { return [NSNumber numberWithBool: (value != nil) ? YES : NO]; } @end @implementation NSUnarchiveFromDataTransformer + (BOOL) allowsReverseTransformation { return YES; } + (Class) transformedValueClass { return [NSData class]; } - (id) reverseTransformedValue: (id)value { return [NSArchiver archivedDataWithRootObject: value]; } - (id) transformedValue: (id)value { return [NSUnarchiver unarchiveObjectWithData: value]; } @end gnustep-base-1.29.0/Source/NSXMLDTD.m000066400000000000000000000202751435650067400170730ustar00rootroot00000000000000/* Inmplementation for NSXMLDTD for GNUStep Copyright (C) 2008 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: September 2008 This file is part of the GNUstep Base Library. 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 3 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 USA. */ #import "common.h" #if defined(HAVE_LIBXML) #define GSInternal NSXMLDTDInternal #import "NSXMLPrivate.h" #import "GSInternal.h" GS_PRIVATE_INTERNAL(NSXMLDTD) @implementation NSXMLDTD + (NSXMLDTDNode*) predefinedEntityDeclarationForName: (NSString*)name { xmlEntityPtr node = xmlGetPredefinedEntity(XMLSTRING(name)); return (NSXMLDTDNode*)[self _objectForNode: (xmlNodePtr)node]; } - (void) dealloc { if (GS_EXISTS_INTERNAL) { } [super dealloc]; } - (void) addChild: (NSXMLNode*)child { [self insertChild: child atIndex: [self childCount]]; } - (NSXMLDTDNode*) attributeDeclarationForName: (NSString*)name elementName: (NSString*)elementName { xmlDtdPtr theNode = internal->node.dtd; xmlNodePtr children = NULL; const xmlChar *xmlName = XMLSTRING(name); const xmlChar *xmlElementName = XMLSTRING(elementName); if ((theNode == NULL) || (theNode->children == NULL)) { return nil; } for (children = theNode->children; children; children = children->next) { if (children->type == XML_ATTRIBUTE_DECL) { xmlAttributePtr attr = (xmlAttributePtr)children; if ((xmlStrcmp(attr->name, xmlName) == 0) && (xmlStrcmp(attr->elem, xmlElementName) == 0)) { return (NSXMLDTDNode*)[NSXMLNode _objectForNode: children]; } } } return nil; } - (NSXMLDTDNode*) elementDeclarationForName: (NSString*)name { xmlDtdPtr theNode = internal->node.dtd; xmlNodePtr children = NULL; const xmlChar *xmlName = XMLSTRING(name); if ((theNode == NULL) || (theNode->children == NULL)) { return nil; } for (children = theNode->children; children; children = children->next) { if (children->type == XML_ELEMENT_DECL) { xmlElementPtr elem = (xmlElementPtr)children; if (xmlStrcmp(elem->name, xmlName) == 0) { return (NSXMLDTDNode*)[NSXMLNode _objectForNode: children]; } } } return nil; } - (NSXMLDTDNode*) entityDeclarationForName: (NSString*)name { //xmlGetEntityFromDtd xmlDtdPtr theNode = internal->node.dtd; xmlNodePtr children = NULL; const xmlChar *xmlName = XMLSTRING(name); if ((theNode == NULL) || (theNode->children == NULL)) { return nil; } for (children = theNode->children; children; children = children->next) { if (children->type == XML_ENTITY_DECL) { xmlEntityPtr entity = (xmlEntityPtr)children; if (xmlStrcmp(entity->name, xmlName) == 0) { return (NSXMLDTDNode*)[NSXMLNode _objectForNode: children]; } } } return nil; } - (void) _createInternal { GS_CREATE_INTERNAL(NSXMLDTD); } - (id) init { return [self initWithKind: NSXMLDTDKind options: 0]; } - (id) initWithContentsOfURL: (NSURL*)url options: (NSUInteger)mask error: (NSError**)error { NSData *data; NSXMLDTD *doc; data = [NSData dataWithContentsOfURL: url]; doc = [self initWithData: data options: mask error: error]; [doc setURI: [url absoluteString]]; return doc; } - (id) initWithData: (NSData*)data options: (NSUInteger)mask error: (NSError**)error { NSXMLDocument *tempDoc = [[NSXMLDocument alloc] initWithData: data options: mask error: error]; if (tempDoc != nil) { NSArray *children = [tempDoc children]; NSEnumerator *enumerator = [children objectEnumerator]; NSXMLNode *child; self = [self initWithKind: NSXMLDTDKind options: mask]; while ((child = [enumerator nextObject]) != nil) { [child detach]; // detach from document. [self addChild: child]; } [tempDoc release]; } return self; } - (id) initWithKind: (NSXMLNodeKind)theKind options: (NSUInteger)theOptions { if (NSXMLDTDKind == theKind) { return [super initWithKind: theKind options: theOptions]; } else { [self release]; // This cast is here to keep clang quite that expects an init* method to // return an object of the same class, which is not true here. return (NSXMLDTD*)[[NSXMLNode alloc] initWithKind: theKind options: theOptions]; } } - (void) insertChild: (NSXMLNode*)child atIndex: (NSUInteger)index { NSXMLNodeKind theKind = [child kind]; NSUInteger childCount = [self childCount]; // Check to make sure this is a valid addition... NSAssert(nil != child, NSInvalidArgumentException); NSAssert(index <= childCount, NSInvalidArgumentException); NSAssert(nil == [child parent], NSInvalidArgumentException); NSAssert(NSXMLAttributeKind != theKind, NSInvalidArgumentException); NSAssert(NSXMLDTDKind != theKind, NSInvalidArgumentException); NSAssert(NSXMLDocumentKind != theKind, NSInvalidArgumentException); NSAssert(NSXMLElementKind != theKind, NSInvalidArgumentException); NSAssert(NSXMLInvalidKind != theKind, NSInvalidArgumentException); NSAssert(NSXMLNamespaceKind != theKind, NSInvalidArgumentException); NSAssert(NSXMLTextKind != theKind, NSInvalidArgumentException); [self _insertChild: child atIndex: index]; } - (void) insertChildren: (NSArray*)children atIndex: (NSUInteger)index { NSEnumerator *enumerator = [children objectEnumerator]; NSXMLNode *child; while ((child = [enumerator nextObject]) != nil) { [self insertChild: child atIndex: index++]; } } - (NSXMLDTDNode*) notationDeclarationForName: (NSString*)name { xmlDtdPtr theNode = internal->node.dtd; xmlNodePtr children = NULL; const xmlChar *xmlName = XMLSTRING(name); if ((theNode == NULL) || (theNode->children == NULL)) { return nil; } for (children = theNode->children; children; children = children->next) { if (children->type == XML_NOTATION_NODE) { if (xmlStrcmp(children->name, xmlName) == 0) { return (NSXMLDTDNode*)[NSXMLNode _objectForNode: children]; } } } return nil; } - (NSString*) publicID { xmlDtd *theNode = internal->node.dtd; return StringFromXMLStringPtr(theNode->ExternalID); } - (void) removeChildAtIndex: (NSUInteger)index { NSXMLNode *child; if (index >= [self childCount]) { [NSException raise: NSRangeException format: @"index too large"]; } child = [self childAtIndex: index]; [child detach]; } - (void) replaceChildAtIndex: (NSUInteger)index withNode: (NSXMLNode*)theNode { [self insertChild: theNode atIndex: index]; [self removeChildAtIndex: index + 1]; } - (void) setChildren: (NSArray*)children { NSUInteger count = [self childCount]; while (count-- > 0) { [self removeChildAtIndex: count]; } [self insertChildren: children atIndex: 0]; } - (void) setPublicID: (NSString*)publicID { xmlDtd *theNode = internal->node.dtd; theNode->ExternalID = XMLStringCopy(publicID); } - (void) setSystemID: (NSString*)systemID { xmlDtd *theNode = internal->node.dtd; theNode->SystemID = XMLStringCopy(systemID); } - (NSString*) systemID { xmlDtd *theNode = internal->node.dtd; return StringFromXMLStringPtr(theNode->SystemID); } @end #endif /* HAVE_LIBXML */ gnustep-base-1.29.0/Source/NSXMLDTDNode.m000066400000000000000000000063531435650067400177020ustar00rootroot00000000000000/* Implementation for NSXMLDTDNode for GNUStep Copyright (C) 2008 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: September 2008 This file is part of the GNUstep Base Library. 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 3 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 USA. */ #import "common.h" #if defined(HAVE_LIBXML) #define GSInternal NSXMLDTDNodeInternal #import "NSXMLPrivate.h" #import "GSInternal.h" GS_PRIVATE_INTERNAL(NSXMLDTDNode) @implementation NSXMLDTDNode - (void) dealloc { if (GS_EXISTS_INTERNAL) { } [super dealloc]; } - (NSXMLDTDNodeKind) DTDKind { return internal->DTDKind; } - (void) _createInternal { GS_CREATE_INTERNAL(NSXMLDTDNode); } - (id) initWithKind: (NSXMLNodeKind)theKind options: (NSUInteger)theOptions { if (NSXMLEntityDeclarationKind == theKind || NSXMLElementDeclarationKind == theKind || NSXMLNotationDeclarationKind == theKind) { return [super initWithKind: theKind options: theOptions]; } else { [self release]; // This cast is here to keep clang quite that expects an init* method to // return an object of the same class, which is not true here. return (NSXMLDTDNode*)[[NSXMLNode alloc] initWithKind: theKind options: theOptions]; } } - (id) initWithXMLString: (NSString*)string { NSXMLDTDNode *result = nil; NSError *error; NSXMLDocument *tempDoc = [[NSXMLDocument alloc] initWithXMLString: string options: 0 error: &error]; if (tempDoc != nil) { result = (NSXMLDTDNode*)RETAIN([tempDoc childAtIndex: 0]); [result detach]; // detach from document. } [tempDoc release]; [self release]; return result; } - (BOOL) isExternal { if ([self systemID]) { return YES; } return NO; } - (NSString*) notationName { return StringFromXMLStringPtr(internal->node.entity->name); } - (NSString*) publicID { return StringFromXMLStringPtr(internal->node.entity->ExternalID); } - (void) setDTDKind: (NSXMLDTDNodeKind)nodeKind { internal->DTDKind = nodeKind; } - (void) setNotationName: (NSString*)notationName { internal->node.entity->name = XMLSTRING(notationName); } - (void) setPublicID: (NSString*)publicID { internal->node.entity->ExternalID = XMLSTRING(publicID); } - (void) setSystemID: (NSString*)systemID { internal->node.entity->ExternalID = XMLSTRING(systemID); } - (NSString*) systemID { return StringFromXMLStringPtr(internal->node.entity->SystemID); } @end #endif /* HAVE_LIBXML */ gnustep-base-1.29.0/Source/NSXMLDocument.m000066400000000000000000000404331435650067400202340ustar00rootroot00000000000000/* Implementation for NSXMLDocument for GNUStep Copyright (C) 2008 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Written by: Gregory John Casamento Created/Modified: September 2008,2012 This file is part of the GNUstep Base Library. 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 3 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 USA. */ #import "common.h" #if defined(HAVE_LIBXML) #define GSInternal NSXMLDocumentInternal #import "NSXMLPrivate.h" #import "GSInternal.h" GS_PRIVATE_INTERNAL(NSXMLDocument) //#import #import "Foundation/NSError.h" @implementation NSXMLDocument + (Class) replacementClassForClass: (Class)cls { return cls; } - (void) dealloc { if (GS_EXISTS_INTERNAL) { [internal->MIMEType release]; } [super dealloc]; } - (NSString*) characterEncoding { if (internal->node.doc->encoding) return StringFromXMLStringPtr(internal->node.doc->encoding); else return nil; } - (NSXMLDocumentContentKind) documentContentKind { return internal->contentKind; } - (NSXMLDTD*) DTD { xmlDtdPtr dtd = xmlGetIntSubset(internal->node.doc); return (NSXMLDTD *)[NSXMLNode _objectForNode: (xmlNodePtr)dtd]; } - (void) _createInternal { GS_CREATE_INTERNAL(NSXMLDocument); } - (id) init { return [self initWithKind: NSXMLDocumentKind options: 0]; } - (id) initWithContentsOfURL: (NSURL*)url options: (NSUInteger)mask error: (NSError**)error { NSData *data; NSXMLDocument *doc; data = [NSData dataWithContentsOfURL: url]; doc = [self initWithData: data options: mask error: error]; [doc setURI: [url absoluteString]]; return doc; } - (id) initWithData: (NSData*)data options: (NSUInteger)mask error: (NSError**)error { // Check for nil data and throw an exception if (nil == data) { DESTROY(self); [NSException raise: NSInvalidArgumentException format: @"[NSXMLDocument-%@] nil argument", NSStringFromSelector(_cmd)]; } if (![data isKindOfClass: [NSData class]]) { DESTROY(self); [NSException raise: NSInvalidArgumentException format: @"[NSXMLDocument-%@] non data argument", NSStringFromSelector(_cmd)]; } if ((self = [self initWithKind: NSXMLDocumentKind options: 0]) != nil) { char *url = NULL; char *encoding = NULL; // "UTF8"; int xmlOptions = XML_PARSE_NOERROR; xmlDocPtr doc = NULL; if (!(mask & NSXMLNodePreserveWhitespace)) { xmlOptions |= XML_PARSE_NOBLANKS; //xmlKeepBlanksDefault(0); } if (mask & NSXMLNodeLoadExternalEntitiesNever) { xmlOptions |= XML_PARSE_NOENT; } if (!(mask & NSXMLNodeLoadExternalEntitiesAlways)) { xmlOptions |= XML_PARSE_NONET; } doc = xmlReadMemory([data bytes], [data length], url, encoding, xmlOptions); if (doc == NULL) { DESTROY(self); if (error != NULL) { *error = [NSError errorWithDomain: @"NSXMLErrorDomain" code: 0 userInfo: nil]; } return nil; } // Free old node xmlFreeDoc((xmlDocPtr)internal->node.doc); [self _setNode: doc]; if (mask & NSXMLDocumentValidate) { [self validateAndReturnError: error]; } } return self; } - (id) initWithKind: (NSXMLNodeKind)theKind options: (NSUInteger)theOptions { if (NSXMLDocumentKind == theKind) { return [super initWithKind: theKind options: theOptions]; } else { [self release]; // This cast is here to keep clang quite that expects an init* method to // return an object of the same class, which is not true here. return (NSXMLDocument*)[[NSXMLNode alloc] initWithKind: theKind options: theOptions]; } } - (id) initWithRootElement: (NSXMLElement*)element { self = [self initWithKind: NSXMLDocumentKind options: 0]; if (self != nil) { [self setRootElement: (NSXMLNode*)element]; } return self; } - (id) initWithXMLString: (NSString*)string options: (NSUInteger)mask error: (NSError**)error { if (nil == string) { DESTROY(self); [NSException raise: NSInvalidArgumentException format: @"[NSXMLDocument-%@] nil argument", NSStringFromSelector(_cmd)]; } if (NO == [string isKindOfClass: [NSString class]]) { DESTROY(self); [NSException raise: NSInvalidArgumentException format: @"[NSXMLDocument-%@] invalid argument", NSStringFromSelector(_cmd)]; } return [self initWithData: [string dataUsingEncoding: NSUTF8StringEncoding] options: mask error: error]; } - (BOOL) isStandalone { return (internal->node.doc->standalone == 1); } - (NSString*) MIMEType { return internal->MIMEType; } - (NSXMLElement*) rootElement { xmlNodePtr rootElem = xmlDocGetRootElement(internal->node.doc); return (NSXMLElement *)[NSXMLNode _objectForNode: rootElem]; } - (void) setCharacterEncoding: (NSString*)encoding { if (internal->node.doc->encoding != NULL) { xmlFree((xmlChar *)internal->node.doc->encoding); } internal->node.doc->encoding = XMLStringCopy(encoding); } - (void) setDocumentContentKind: (NSXMLDocumentContentKind)theContentKind { internal->contentKind = theContentKind; } - (void) setDTD: (NSXMLDTD*)documentTypeDeclaration { NSXMLDTD *old; NSAssert(documentTypeDeclaration != nil, NSInvalidArgumentException); // detach the old DTD, this also removes the corresponding child old = [self DTD]; [old detach]; internal->node.doc->intSubset = (xmlDtdPtr)[documentTypeDeclaration _node]; [self addChild: documentTypeDeclaration]; } - (void) setMIMEType: (NSString*)theMIMEType { ASSIGNCOPY(internal->MIMEType, theMIMEType); } - (void) setRootElement: (NSXMLNode*)root { if (root == nil) { return; } if ([root parent] != nil) { [NSException raise: NSInternalInconsistencyException format: @"%@ cannot be used as root of %@", root, self]; } // remove all sub nodes [self setChildren: nil]; // FIXME: Should we use addChild: here? xmlDocSetRootElement(internal->node.doc, [root _node]); // Do our subNode housekeeping... [self _addSubNode: root]; } - (void) setStandalone: (BOOL)standalone { internal->node.doc->standalone = standalone; } - (void) setURI: (NSString*)URI { xmlDocPtr theNode = internal->node.doc; if (theNode->URL != NULL) { xmlFree((xmlChar *)theNode->URL); } theNode->URL = XMLStringCopy(URI); } - (NSString*) URI { xmlDocPtr theNode = internal->node.doc; if (theNode->URL) { return StringFromXMLStringPtr(theNode->URL); } else { return nil; } } - (void) setVersion: (NSString*)version { if ([version isEqualToString: @"1.0"] || [version isEqualToString: @"1.1"]) { xmlDocPtr theNode = internal->node.doc; if (theNode->version != NULL) { xmlFree((xmlChar *)theNode->version); } theNode->version = XMLStringCopy(version); } else { [NSException raise: NSInvalidArgumentException format: @"Bad XML version (%@)", version]; } } - (NSString*) version { xmlDocPtr theNode = internal->node.doc; if (theNode->version) return StringFromXMLStringPtr(theNode->version); else return @"1.0"; } - (void) insertChild: (NSXMLNode*)child atIndex: (NSUInteger)index { NSXMLNodeKind theKind = [child kind]; NSUInteger childCount = [self childCount]; // Check to make sure this is a valid addition... NSAssert(nil != child, NSInvalidArgumentException); NSAssert(index <= childCount, NSInvalidArgumentException); NSAssert(nil == [child parent], NSInvalidArgumentException); NSAssert(NSXMLAttributeKind != theKind, NSInvalidArgumentException); NSAssert(NSXMLDTDKind != theKind, NSInvalidArgumentException); NSAssert(NSXMLDocumentKind != theKind, NSInvalidArgumentException); NSAssert(NSXMLElementDeclarationKind != theKind, NSInvalidArgumentException); NSAssert(NSXMLEntityDeclarationKind != theKind, NSInvalidArgumentException); NSAssert(NSXMLInvalidKind != theKind, NSInvalidArgumentException); NSAssert(NSXMLNamespaceKind != theKind, NSInvalidArgumentException); NSAssert(NSXMLNotationDeclarationKind != theKind, NSInvalidArgumentException); [self _insertChild: child atIndex: index]; } - (void) insertChildren: (NSArray*)children atIndex: (NSUInteger)index { NSEnumerator *enumerator = [children objectEnumerator]; NSXMLNode *child; while ((child = [enumerator nextObject]) != nil) { [self insertChild: child atIndex: index++]; } } - (void) removeChildAtIndex: (NSUInteger)index { NSXMLNode *child; if (index >= [self childCount]) { [NSException raise: NSRangeException format: @"index too large"]; } child = [self childAtIndex: index]; [child detach]; } - (void) setChildren: (NSArray*)children { NSUInteger count = [self childCount]; while (count-- > 0) { [self removeChildAtIndex: count]; } [self insertChildren: children atIndex: 0]; } - (void) addChild: (NSXMLNode*)child { [self insertChild: child atIndex: [self childCount]]; } - (void) replaceChildAtIndex: (NSUInteger)index withNode: (NSXMLNode*)theNode { [self insertChild: theNode atIndex: index]; [self removeChildAtIndex: index + 1]; } - (NSData*) XMLData { return [self XMLDataWithOptions: NSXMLNodeOptionsNone]; } - (NSData *) XMLDataWithOptions: (NSUInteger)theOptions { NSString *xmlString = [self XMLStringWithOptions: theOptions]; return [xmlString dataUsingEncoding: NSUTF8StringEncoding allowLossyConversion: NO]; } - (id) objectByApplyingXSLT: (NSData*)xslt arguments: (NSDictionary*)arguments error: (NSError**)error { #ifdef HAVE_LIBXSLT xmlChar **params = NULL; xmlDocPtr stylesheetDoc = xmlReadMemory([xslt bytes], [xslt length], NULL, NULL, XML_PARSE_NOERROR | XML_PARSE_NONET); xsltStylesheetPtr stylesheet = xsltParseStylesheetDoc(stylesheetDoc); xmlDocPtr resultDoc = NULL; // Iterate over the keys and put them into params... if (arguments != nil) { NSEnumerator *en = [arguments keyEnumerator]; NSString *key = nil; NSUInteger index = 0; int count = [[arguments allKeys] count]; params = NSZoneCalloc([self zone], ((count + 1) * 2), sizeof(xmlChar *)); while ((key = [en nextObject]) != nil) { params[index] = (xmlChar *)XMLSTRING(key); params[index + 1] = (xmlChar *)XMLSTRING([arguments objectForKey: key]); index += 2; } params[index] = NULL; params[index + 1] = NULL; } // Apply the stylesheet and get the result... resultDoc = xsltApplyStylesheet(stylesheet, internal->node.doc, (const char **)params); // Cleanup... xsltFreeStylesheet(stylesheet); xmlFreeDoc(stylesheetDoc); xsltCleanupGlobals(); xmlCleanupParser(); NSZoneFree([self zone], params); return [NSXMLNode _objectForNode: (xmlNodePtr)resultDoc]; #else /* HAVE_LIBXSLT */ return nil; #endif /* HAVE_LIBXSLT */ } - (id) objectByApplyingXSLTString: (NSString*)xslt arguments: (NSDictionary*)arguments error: (NSError**)error { NSData *data = [xslt dataUsingEncoding: NSUTF8StringEncoding]; NSXMLDocument *result = [self objectByApplyingXSLT: data arguments: arguments error: error]; return result; } - (id) objectByApplyingXSLTAtURL: (NSURL*)xsltURL arguments: (NSDictionary*)arguments error: (NSError**)error { NSData *data = [NSData dataWithContentsOfURL: xsltURL]; NSXMLDocument *result = [self objectByApplyingXSLT: data arguments: arguments error: error]; return result; } - (BOOL) validateAndReturnError: (NSError**)error { xmlValidCtxtPtr ctxt = xmlNewValidCtxt(); // FIXME: Should use xmlValidityErrorFunc and userData // to get the error BOOL result = (BOOL)(xmlValidateDocument(ctxt, internal->node.doc)); xmlFreeValidCtxt(ctxt); return result; } - (id) copyWithZone: (NSZone *)zone { NSXMLDocument *c = (NSXMLDocument*)[super copyWithZone: zone]; [c setMIMEType: [self MIMEType]]; // the intSubset is copied by libxml2 //[c setDTD: [self DTD]]; [c setDocumentContentKind: [self documentContentKind]]; return c; } - (BOOL) isEqual: (id)other { if (self == other) { return YES; } // FIXME return [[self rootElement] isEqual: [other rootElement]]; } @end #else /* HAVE_LIBXML */ #import "Foundation/NSXMLDocument.h" @implementation NSXMLDocument + (Class) replacementClassForClass: (Class)cls { return cls; } - (NSString*) characterEncoding { return nil; } - (NSXMLDocumentContentKind) documentContentKind { return 0; } - (NSXMLDTD*) DTD { return nil; } - (id) init { return [super init]; } - (id) initWithContentsOfURL: (NSURL*)url options: (NSUInteger)mask error: (NSError**)error { return [self init]; } - (id) initWithData: (NSData*)data options: (NSUInteger)mask error: (NSError**)error { return [self init]; } - (id) initWithKind: (NSXMLNodeKind)theKind options: (NSUInteger)theOptions { return [self init]; } - (id) initWithRootElement: (NSXMLElement*)element { return [self init]; } - (id) initWithXMLString: (NSString*)string options: (NSUInteger)mask error: (NSError**)error { return [self init]; } - (BOOL) isStandalone { return NO; } - (NSString*) MIMEType { return nil; } - (NSXMLElement*) rootElement { return nil; } - (void) setCharacterEncoding: (NSString*)encoding { } - (void) setDocumentContentKind: (NSXMLDocumentContentKind)theContentKind { } - (void) setDTD: (NSXMLDTD*)documentTypeDeclaration { } - (void) setMIMEType: (NSString*)theMIMEType { } - (void) setRootElement: (NSXMLNode*)root { } - (void) setStandalone: (BOOL)standalone { } - (void) setURI: (NSString*)URI { } - (NSString*) URI { return nil; } - (void) setVersion: (NSString*)version { } - (NSString*) version { return nil; } - (void) insertChild: (NSXMLNode*)child atIndex: (NSUInteger)index { } - (void) insertChildren: (NSArray*)children atIndex: (NSUInteger)index { } - (void) removeChildAtIndex: (NSUInteger)index { } - (void) setChildren: (NSArray*)children { } - (void) addChild: (NSXMLNode*)child { } - (void) replaceChildAtIndex: (NSUInteger)index withNode: (NSXMLNode*)theNode { } - (NSData*) XMLData { return nil; } - (NSData *) XMLDataWithOptions: (NSUInteger)theOptions { return nil; } - (id) objectByApplyingXSLT: (NSData*)xslt arguments: (NSDictionary*)arguments error: (NSError**)error { return nil; } - (id) objectByApplyingXSLTString: (NSString*)xslt arguments: (NSDictionary*)arguments error: (NSError**)error { return nil; } - (id) objectByApplyingXSLTAtURL: (NSURL*)xsltURL arguments: (NSDictionary*)arguments error: (NSError**)error { return nil; } - (BOOL) validateAndReturnError: (NSError**)error { return NO; } - (id) copyWithZone: (NSZone *)zone { return nil; } - (BOOL) isEqual: (id)other { return NO; } @end #endif /* HAVE_LIBXML */ gnustep-base-1.29.0/Source/NSXMLElement.m000066400000000000000000000510371435650067400200510ustar00rootroot00000000000000/* Implementation for NSXMLElement for GNUStep Copyright (C) 2008 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: September 2008 This file is part of the GNUstep Base Library. 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 3 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 USA. */ #import "common.h" #if defined(HAVE_LIBXML) #define GSInternal NSXMLElementInternal #import "NSXMLPrivate.h" #import "GSInternal.h" GS_PRIVATE_INTERNAL(NSXMLElement) extern void cleanup_namespaces(xmlNodePtr node, xmlNsPtr ns); extern void ensure_oldNs(xmlNodePtr node); @implementation NSXMLElement - (void) dealloc { if (GS_EXISTS_INTERNAL && internal != nil) { /* NSArray *subNodes = [internal->subNodes copy]; NSEnumerator *enumerator = [subNodes objectEnumerator]; NSXMLNode *subNode; while ((subNode = [enumerator nextObject]) != nil) { if ([subNode kind] == NSXMLNamespaceKind) { [self removeNamespaceForPrefix: [subNode name]]; } } */ } [super dealloc]; } - (void) _createInternal { GS_CREATE_INTERNAL(NSXMLElement); } - (id) init { return [self initWithKind: NSXMLElementKind options: 0]; } - (id) initWithKind: (NSXMLNodeKind)theKind options: (NSUInteger)theOptions { if (NSXMLElementKind == theKind) { return [super initWithKind: theKind options: theOptions]; } else { [self release]; // This cast is here to keep clang quite that expects an init* method to // return an object of the same class, which is not true here. return (NSXMLElement*)[[NSXMLNode alloc] initWithKind: theKind options: theOptions]; } } - (id) initWithName: (NSString*)name { return [self initWithName: name URI: nil]; } - (id) initWithName: (NSString*)name URI: (NSString*)URI { if ((self = [self initWithKind: NSXMLElementKind]) != nil) { [self setName: name]; // Without this check this could unset a namespace set via the name if (URI != nil) { [self setURI: URI]; } } return self; } - (id) initWithName: (NSString*)name stringValue: (NSString*)string { if ((self = [self initWithName: name URI: nil]) != nil) { NSXMLNode *t; t = [[NSXMLNode alloc] initWithKind: NSXMLTextKind]; [t setStringValue: string]; [self addChild: t]; [t release]; } return self; } - (id) initWithXMLString: (NSString*)string error: (NSError**)error { NSXMLElement *result = nil; NSXMLDocument *tempDoc = [[NSXMLDocument alloc] initWithXMLString: string options: 0 error: error]; if (tempDoc != nil) { result = RETAIN([tempDoc rootElement]); [result detach]; // detach from document. } [tempDoc release]; [self release]; return result; } - (id) objectValue { if (internal->objectValue == nil) { return @""; } return internal->objectValue; } - (NSArray*) elementsForName: (NSString*)name { NSString *prefix = [[self class] prefixForName: name]; if ((nil != prefix) && [prefix length] > 0) { NSXMLNode *ns = [self namespaceForPrefix: prefix]; if (nil != ns) { NSString *localName = [[self class] localNameForName: name]; // Namespace nodes have the URI as their stringValue return [self elementsForLocalName: localName URI: [ns stringValue]]; } } { NSMutableArray *results = [NSMutableArray arrayWithCapacity: 10]; xmlNodePtr cur = NULL; const xmlChar *xmlName = XMLSTRING(name); for (cur = internal->node.node->children; cur != NULL; cur = cur->next) { if (cur->type == XML_ELEMENT_NODE) { // no namespace or default namespace if ((xmlStrcmp(xmlName, cur->name) == 0) && ((cur->ns == NULL) || (cur->ns->prefix == NULL) || (xmlStrcmp(cur->ns->prefix, (const xmlChar*)"") == 0))) { NSXMLNode *theNode = [NSXMLNode _objectForNode: cur]; [results addObject: theNode]; } } } return results; } } - (NSArray*) elementsForLocalName: (NSString*)localName URI: (NSString*)URI { NSMutableArray *results = [NSMutableArray arrayWithCapacity: 10]; xmlNodePtr cur = NULL; const xmlChar *href = XMLSTRING(URI); const xmlChar *xmlName = XMLSTRING(localName); xmlNsPtr parentNS = xmlSearchNsByHref(internal->node.node->doc, internal->node.node, href); for (cur = internal->node.node->children; cur != NULL; cur = cur->next) { if (cur->type == XML_ELEMENT_NODE) { if (xmlStrcmp(xmlName, cur->name) == 0) { xmlNsPtr childNS = parentNS; if (cur->nsDef != NULL) { childNS = xmlSearchNsByHref(internal->node.node->doc, cur, href); } if (((childNS != NULL) && ((cur->ns == childNS) || ((cur->ns == NULL) && (xmlStrcmp(childNS->prefix, (const xmlChar*)"") == 0)))) || ((cur->ns != NULL) && (xmlStrcmp(cur->ns->href, href) == 0))) { NSXMLNode *theNode = [NSXMLNode _objectForNode: cur]; [results addObject: theNode]; } } } } return results; } - (void) addAttribute: (NSXMLNode*)attribute { xmlNodePtr theNode = internal->node.node; xmlAttrPtr attr = (xmlAttrPtr)[attribute _node]; xmlAttrPtr oldAttr; if (nil != [attribute parent]) { [NSException raise: NSInternalInconsistencyException format: @"Tried to add attribute to multiple parents."]; } if (attr->ns != NULL) { xmlNsPtr ns = attr->ns; xmlDocPtr tmp = attr->doc; BOOL resolved = NO; if (ns->href == NULL) { xmlNsPtr newNs = xmlSearchNs(theNode->doc, theNode, ns->prefix); if (newNs != NULL) { ns = newNs; attr->ns = ns; resolved = YES; } } else //if (ns->prefix == NULL) { xmlNsPtr newNs = xmlSearchNsByHref(theNode->doc, theNode, ns->href); if (newNs != NULL) { ns = newNs; attr->ns = ns; resolved = YES; } } if (!resolved && (tmp != NULL)) { xmlNsPtr cur = tmp->oldNs; xmlNsPtr last = NULL; xmlNsPtr oldNs1; // Need to transfer the namespace to the new tree // Unlink in old while (cur) { if (cur == ns) { if (last == NULL) { tmp->oldNs = NULL; } else { last->next = cur->next; } cur->next = NULL; break; } last = cur; cur = cur->next; } // Insert in new ensure_oldNs(theNode); oldNs1 = theNode->doc->oldNs; while (oldNs1) { if (oldNs1->next == NULL) { oldNs1->next = cur; break; } oldNs1 = oldNs1->next; } } #if LIBXML_VERSION >= 20620 xmlDOMWrapAdoptNode(NULL, attr->doc, (xmlNodePtr)attr, theNode->doc, theNode, 0); #else xmlSetTreeDoc((xmlNodePtr)attr, theNode->doc); #endif xmlFreeDoc(tmp); oldAttr = xmlHasNsProp(theNode, attr->name, ns->href); } else { oldAttr = xmlHasProp(theNode, attr->name); } if (NULL != oldAttr) { /* * As per Cocoa documentation, we only add the attribute if it's not * already set. xmlHasProp() also looks at the DTD for default attributes * and we need to make sure that we only bail out here on #FIXED * attributes. */ // Do not replace plain attributes. if (XML_ATTRIBUTE_NODE == oldAttr->type) { return; } else if (XML_ATTRIBUTE_DECL == oldAttr->type) { // If the attribute is from a DTD, do not replace it if it's #FIXED xmlAttributePtr attrDecl = (xmlAttributePtr)oldAttr; if (XML_ATTRIBUTE_FIXED == attrDecl->def) { return; } } } xmlAddChild(theNode, (xmlNodePtr)attr); [self _addSubNode: attribute]; } - (void) removeAttributeForName: (NSString*)name { NSXMLNode *attrNode = [self attributeForName: name]; [attrNode detach]; } - (void) setAttributes: (NSArray*)attributes { NSEnumerator *enumerator = [attributes objectEnumerator]; NSXMLNode *attribute; // FIXME: Remove all previous attributes while ((attribute = [enumerator nextObject]) != nil) { [self addAttribute: attribute]; } } - (void) setAttributesAsDictionary: (NSDictionary*)attributes { [self setAttributesWithDictionary: attributes]; } - (void) setAttributesWithDictionary: (NSDictionary*)attributes { NSEnumerator *en = [attributes keyEnumerator]; NSString *key; // FIXME: Remove all previous attributes while ((key = [en nextObject]) != nil) { NSString *val = [[attributes objectForKey: key] stringValue]; NSXMLNode *attribute = [NSXMLNode attributeWithName: key stringValue: val]; [self addAttribute: attribute]; } } - (NSArray*) attributes { NSMutableArray *attributes = [NSMutableArray array]; xmlNodePtr theNode = internal->node.node; xmlAttrPtr attributeNode = theNode->properties; while (attributeNode) { NSXMLNode *attribute; attribute = [NSXMLNode _objectForNode: (xmlNodePtr)attributeNode]; [attributes addObject: attribute]; attributeNode = attributeNode->next; } return attributes; } - (NSXMLNode*) attributeForName: (NSString*)name { NSString *prefix = [[self class] prefixForName: name]; if ((nil != prefix) && [prefix length] > 0) { NSXMLNode *ns = [self namespaceForPrefix: prefix]; if (nil != ns) { NSString *localName = [[self class] localNameForName: name]; // Namespace nodes have the URI as their stringValue return [self attributeForLocalName: localName URI: [ns stringValue]]; } } { NSXMLNode *result = nil; xmlNodePtr theNode = internal->node.node; xmlAttrPtr attributeNode = xmlHasProp(theNode, XMLSTRING(name)); if (NULL != attributeNode) { result = [NSXMLNode _objectForNode: (xmlNodePtr)attributeNode]; } return result; } } - (NSXMLNode*) attributeForLocalName: (NSString*)localName URI: (NSString*)URI { NSXMLNode *result = nil; xmlNodePtr theNode = internal->node.node; xmlAttrPtr attributeNode = xmlHasNsProp(theNode, XMLSTRING(localName), XMLSTRING(URI)); if (NULL != attributeNode) { result = [NSXMLNode _objectForNode: (xmlNodePtr)attributeNode]; } return result; } - (void) addNamespace: (NSXMLNode*)aNamespace { xmlNsPtr ns = xmlCopyNamespace((xmlNsPtr)[aNamespace _node]); xmlNodePtr theNode = internal->node.node; const xmlChar *prefix = ns->prefix; if (theNode->nsDef == NULL) { theNode->nsDef = ns; } else { xmlNsPtr cur = theNode->nsDef; xmlNsPtr last = NULL; while (cur != NULL) { if ((prefix != NULL) && (cur->prefix != NULL) && (xmlStrcmp(prefix, cur->prefix) == 0)) { break; } if (cur->next == NULL) { cur->next = ns; return; } last = cur; cur = cur->next; } // Found the same prefix if (cur->href == NULL) { // This was a fake namespace we added if (theNode->ns == cur) { theNode->ns = ns; } if (last == NULL) { theNode->nsDef = ns; } else { last->next = ns; } ns->next = cur->next; cur->next = NULL; } } // Are we setting a default namespace? if ((theNode->ns == NULL) && (xmlStrcmp(prefix, (const xmlChar*)"") == 0)) { theNode->ns = ns; } // Need to replace fake namespaces in subnodes cleanup_namespaces(theNode, ns); } - (void) removeNamespaceForPrefix: (NSString*)name { xmlNodePtr theNode = internal->node.node; if (theNode->nsDef != NULL) { xmlNsPtr cur = theNode->nsDef; xmlNsPtr last = NULL; const xmlChar *prefix = XMLSTRING(name); while (cur != NULL) { if ((cur->prefix != NULL) && (xmlStrcmp(prefix, cur->prefix) == 0)) { if (last == NULL) { internal->node.node->nsDef = cur->next; } else { last->next = cur->next; } cur->next = NULL; if (theNode->ns == cur) { theNode->ns = NULL; } xmlFreeNs(cur); return; } last = cur; cur = cur->next; } } } - (void) setNamespaces: (NSArray*)namespaces { NSEnumerator *en = [namespaces objectEnumerator]; NSXMLNode *namespace = nil; // Remove old namespaces xmlFreeNsList(internal->node.node->nsDef); internal->node.node->nsDef = NULL; // Add new ones while ((namespace = (NSXMLNode *)[en nextObject]) != nil) { [self addNamespace: namespace]; } } - (NSArray*) namespaces { // FIXME: Should we use xmlGetNsList()? NSMutableArray *result = nil; xmlNsPtr ns = internal->node.node->nsDef; if (ns) { xmlNsPtr cur = NULL; result = [NSMutableArray array]; for (cur = ns; cur != NULL; cur = cur->next) { [result addObject: [NSXMLNode _objectForNode: (xmlNodePtr)xmlCopyNamespace(cur)]]; } } return result; } - (NSXMLNode*) namespaceForPrefix: (NSString*)name { if (name != nil) { const xmlChar *prefix = XMLSTRING(name); xmlNodePtr theNode = internal->node.node; xmlNsPtr ns; ns = xmlSearchNs(theNode->doc, theNode, prefix); if ((ns == NULL) && ([name length] == 0)) { prefix = NULL; ns = xmlSearchNs(theNode->doc, theNode, prefix); } if (ns != NULL) { return [NSXMLNode _objectForNode: (xmlNodePtr)xmlCopyNamespace(ns)]; } } return nil; } - (NSXMLNode*) resolveNamespaceForName: (NSString*)name { NSString *prefix = [[self class] prefixForName: name]; // Return the default namespace for an empty prefix if (nil != prefix) { return [self namespaceForPrefix: prefix]; } return nil; } - (NSString*) resolvePrefixForNamespaceURI: (NSString*)namespaceURI { const xmlChar *uri = XMLSTRING(namespaceURI); xmlNsPtr ns = xmlSearchNsByHref(internal->node.node->doc, internal->node.node, uri); if (ns) { return StringFromXMLStringPtr(ns->prefix); } return nil; } - (void) insertChild: (NSXMLNode*)child atIndex: (NSUInteger)index { NSXMLNodeKind theKind = [child kind]; NSUInteger childCount = [self childCount]; // Check to make sure this is a valid addition... NSAssert(nil != child, NSInvalidArgumentException); NSAssert(index <= childCount, NSInvalidArgumentException); NSAssert(NSXMLAttributeKind != theKind, NSInvalidArgumentException); NSAssert(NSXMLDTDKind != theKind, NSInvalidArgumentException); NSAssert(NSXMLDocumentKind != theKind, NSInvalidArgumentException); NSAssert(NSXMLElementDeclarationKind != theKind, NSInvalidArgumentException); NSAssert(NSXMLEntityDeclarationKind != theKind, NSInvalidArgumentException); NSAssert(NSXMLInvalidKind != theKind, NSInvalidArgumentException); NSAssert(NSXMLNamespaceKind != theKind, NSInvalidArgumentException); NSAssert(NSXMLNotationDeclarationKind != theKind, NSInvalidArgumentException); /* On OSX we get NSInternalInconsistencyException if we try to add an element * which is already a child of some other parent. So presumably we shouldn't * be auto-removing... * * if (nil != [child parent]) * { * [child detach]; * } */ NSAssert(nil == [child parent], NSInternalInconsistencyException); [self _insertChild: child atIndex: index]; } - (void) insertChildren: (NSArray*)children atIndex: (NSUInteger)index { NSEnumerator *enumerator = [children objectEnumerator]; NSXMLNode *child; while ((child = [enumerator nextObject]) != nil) { [self insertChild: child atIndex: index++]; } } - (void) removeChildAtIndex: (NSUInteger)index { NSXMLNode *child; if (index >= [self childCount]) { [NSException raise: NSRangeException format: @"index too large"]; } child = [self childAtIndex: index]; [child detach]; } - (void) setChildren: (NSArray*)children { NSUInteger count = [self childCount]; while (count-- > 0) { [self removeChildAtIndex: count]; } [self insertChildren: children atIndex: 0]; } - (void) addChild: (NSXMLNode*)child { [self insertChild: child atIndex: [self childCount]]; } - (void) replaceChildAtIndex: (NSUInteger)index withNode: (NSXMLNode*)theNode { [self insertChild: theNode atIndex: index]; [self removeChildAtIndex: index + 1]; } static void joinTextNodes(xmlNodePtr nodeA, xmlNodePtr nodeB, NSMutableArray *nodesToDelete) { NSXMLNode *objA = (nodeA->_private); NSXMLNode *objB = (nodeB->_private); xmlTextMerge(nodeA, nodeB); // merge nodeB into nodeA if (objA != nil) // objA gets the merged node { if (objB != nil) // objB is now invalid { /* set it to be invalid and make sure it's not * pointing to a freed node */ [objB _invalidate]; [nodesToDelete addObject: objB]; } } else if (objB != nil) // there is no objA -- objB gets the merged node { [objB _setNode: nodeA]; // nodeA is the remaining (merged) node } } - (void) normalizeAdjacentTextNodesPreservingCDATA: (BOOL)preserve { NSEnumerator *subEnum = [internal->subNodes objectEnumerator]; NSXMLNode *subNode = nil; NSMutableArray *nodesToDelete = [NSMutableArray array]; while ((subNode = [subEnum nextObject])) { xmlNodePtr theNode = [subNode _node]; xmlNodePtr prev = theNode->prev; xmlNodePtr next = theNode->next; if (theNode->type == XML_ELEMENT_NODE) { [(NSXMLElement *)subNode normalizeAdjacentTextNodesPreservingCDATA:preserve]; } else if (theNode->type == XML_TEXT_NODE || (theNode->type == XML_CDATA_SECTION_NODE && !preserve)) { if (next && (next->type == XML_TEXT_NODE || (next->type == XML_CDATA_SECTION_NODE && !preserve))) { //combine node & node->next joinTextNodes(theNode, theNode->next, nodesToDelete); } if (prev && (prev->type == XML_TEXT_NODE || (prev->type == XML_CDATA_SECTION_NODE && !preserve))) { /* combine node->prev & node * join the text of both nodes * assign the joined text to the earlier of the two * nodes that has an ObjC object * unlink the other node * delete the other node's object (maybe add it to a * list of nodes to delete when we're done? -- * or just set its node to null, and then remove it * from our subNodes when we're done iterating it) * (or maybe we need to turn it into an NSInvalidNode too??) */ joinTextNodes(theNode->prev, theNode, nodesToDelete); } } } if ([nodesToDelete count] > 0) { subEnum = [nodesToDelete objectEnumerator]; while ((subNode = [subEnum nextObject])) { [self _removeSubNode: subNode]; } } } @end #endif /* HAVE_LIBXML */ gnustep-base-1.29.0/Source/NSXMLNode.m000066400000000000000000001473301435650067400173470ustar00rootroot00000000000000/* Implementation for NSXMLNode for GNUStep Copyright (C) 2008 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: September 2008 This file is part of the GNUstep Base Library. 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 3 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 USA. */ #import "common.h" #if defined(HAVE_LIBXML) #define GSInternal NSXMLNodeInternal #import "Foundation/NSCharacterSet.h" #import "NSXMLPrivate.h" #import "GSInternal.h" GS_PRIVATE_INTERNAL(NSXMLNode) void cleanup_namespaces(xmlNodePtr node, xmlNsPtr ns) { if ((node == NULL) || (ns == NULL)) return; if ((node->type == XML_ATTRIBUTE_NODE) || (node->type == XML_ELEMENT_NODE)) { xmlNsPtr ns1 = node->ns; if (ns1 == ns) { return; } // Either both the same or one NULL and the other the same if (ns1 != NULL && (((ns1->href == NULL) && (xmlStrcmp(ns1->prefix, ns->prefix) == 0)) || /* ((ns1->prefix == NULL) && (xmlStrcmp(ns1->href, ns->href) == 0)) || */ ((xmlStrcmp(ns1->prefix, ns->prefix) == 0) && (xmlStrcmp(ns1->href, ns->href) == 0)))) { //xmlFreeNs(ns1); xmlSetNs(node, ns); } cleanup_namespaces(node->children, ns); cleanup_namespaces(node->next, ns); if (node->type == XML_ELEMENT_NODE) { cleanup_namespaces((xmlNodePtr)node->properties, ns); } } } void ensure_oldNs(xmlNodePtr node) { if (node->doc == NULL) { // Create a private document for this node xmlDocPtr tmp = xmlNewDoc((xmlChar *)"1.0"); #if LIBXML_VERSION >= 20620 xmlDOMWrapAdoptNode(NULL, NULL, node, tmp, NULL, 0); #else xmlSetTreeDoc(node, tmp); #endif } if (node->doc->oldNs == NULL) { xmlNsPtr ns = (xmlNsPtr) xmlMalloc(sizeof(xmlNs)); memset(ns, 0, sizeof(xmlNs)); ns->type = XML_LOCAL_NAMESPACE; ns->href = xmlStrdup(XML_XML_NAMESPACE); ns->prefix = xmlStrdup((const xmlChar *)"xml"); node->doc->oldNs = ns; } } static int countAttributes(xmlNodePtr node) { int count = 0; xmlAttrPtr attr = node->properties; while (attr) { count++; attr = attr->next; } return count; } static BOOL isEqualAttr(const xmlAttrPtr attrA, const xmlAttrPtr attrB) { xmlChar *contentA; xmlChar *contentB; const xmlChar *nameA; const xmlChar *nameB; /* what has to be the same for two attributes to be equal -- * just their values?? */ if (attrB == attrA) { return YES; } if (attrA == NULL || attrB == NULL) { return NO; } nameA = attrA->name; nameB = attrB->name; if (xmlStrcmp(nameA, nameB) == 0) { // get the content... contentA = xmlNodeGetContent((const xmlNodePtr)attrA); contentB = xmlNodeGetContent((const xmlNodePtr)attrB); if (xmlStrcmp(contentA, contentB) == 0) { xmlFree(contentA); xmlFree(contentB); return YES; } xmlFree(contentA); xmlFree(contentB); return NO; } return NO; } static xmlAttrPtr findAttrWithName(xmlNodePtr node, const xmlChar* targetName) { xmlAttrPtr attr = node->properties; // find an attr in node with the given name, and return it, else NULL while ((attr != NULL) && xmlStrcmp(attr->name, targetName) != 0) { attr = attr->next; } return attr; } static BOOL isEqualAttributes(xmlNodePtr nodeA, xmlNodePtr nodeB) { xmlAttrPtr attrA = NULL; if (countAttributes(nodeA) != countAttributes(nodeB)) return NO; attrA = nodeA->properties; while (attrA) { xmlAttrPtr attrB = findAttrWithName(nodeB, attrA->name); if (!isEqualAttr(attrA, attrB)) { return NO; } attrA = attrA->next; } return YES; } static BOOL isEqualNode(xmlNodePtr nodeA, xmlNodePtr nodeB) { if (nodeA == nodeB) return YES; if (nodeA->type != nodeB->type) return NO; if (nodeA->type == XML_NAMESPACE_DECL) { xmlNsPtr nsA = (xmlNsPtr)nodeA; xmlNsPtr nsB = (xmlNsPtr)nodeB; if (xmlStrcmp(nsA->href, nsB->href) != 0) { return NO; } if (xmlStrcmp(nsA->prefix, nsB->prefix) != 0) { return NO; } return YES; } if (xmlStrcmp(nodeA->name, nodeB->name) != 0) return NO; if (nodeA->type == XML_ELEMENT_NODE) { xmlChar *contentA = NULL; xmlChar *contentB = NULL; if (!isEqualAttributes(nodeA, nodeB)) { return NO; } // Get the value of any text node underneath the current element. contentA = xmlNodeGetContent((const xmlNodePtr)nodeA); contentB = xmlNodeGetContent((const xmlNodePtr)nodeB); if (xmlStrcmp(contentA, contentB) != 0) { xmlFree(contentA); xmlFree(contentB); return NO; } xmlFree(contentA); xmlFree(contentB); } if (1) { xmlChar *contentA = NULL; xmlChar *contentB = NULL; // FIXME: Handle more node types if (!isEqualAttributes(nodeA, nodeB)) { return NO; } // Get the value of any text node underneath the current element. contentA = xmlNodeGetContent((const xmlNodePtr)nodeA); contentB = xmlNodeGetContent((const xmlNodePtr)nodeB); if (xmlStrcmp(contentA, contentB) != 0) { xmlFree(contentA); xmlFree(contentB); return NO; } xmlFree(contentA); xmlFree(contentB); } return YES; } static BOOL isEqualTree(xmlNodePtr nodeA, xmlNodePtr nodeB) { xmlNodePtr childA; xmlNodePtr childB; if (nodeA == nodeB) { return YES; } if (nodeA == NULL || nodeB == NULL) { return NO; } if (!isEqualNode(nodeA, nodeB)) { return NO; } if (nodeA->type == XML_NAMESPACE_DECL) { return YES; } // Check children childA = nodeA->children; childB = nodeB->children; while (isEqualTree(childA, childB)) { if (childA == NULL) { return YES; } else { childA = childA->next; childB = childB->next; } } return NO; } /* FIXME ... the libxml2 data structure representing a namespace has a * completely different layout from that of almost all other nodes, so * the generic xmlNode code won't work and we need to check the type * in every method we use! */ @implementation NSXMLNode (Private) - (void *) _node { return internal->node.node; } - (void) _setNode: (void *)_anode { DESTROY(internal->subNodes); internal->node.node = _anode; if (internal->node.node != NULL) { if (internal->node.node->type == XML_NAMESPACE_DECL) { ((xmlNsPtr)(internal->node.node))->_private = self; } else { internal->node.node->_private = self; } } } + (NSXMLNode *) _objectForNode: (xmlNodePtr)node { NSXMLNode *result = nil; if (node) { if (node->type == XML_NAMESPACE_DECL) { result = ((xmlNs *)node)->_private; } else { result = node->_private; } if (result == nil) { Class cls; NSXMLNodeKind kind; xmlElementType type = node->type; xmlDoc *docNode; NSXMLDocument *doc = nil; switch (type) { case XML_DOCUMENT_NODE: case XML_HTML_DOCUMENT_NODE: cls = [NSXMLDocument class]; kind = NSXMLDocumentKind; break; case XML_ELEMENT_NODE: cls = [NSXMLElement class]; kind = NSXMLElementKind; break; case XML_DTD_NODE: cls = [NSXMLDTD class]; kind = NSXMLDTDKind; break; case XML_ATTRIBUTE_DECL: cls = [NSXMLDTDNode class]; kind = NSXMLAttributeDeclarationKind; break; case XML_ELEMENT_DECL: cls = [NSXMLDTDNode class]; kind = NSXMLElementDeclarationKind; break; case XML_ENTITY_DECL: cls = [NSXMLDTDNode class]; kind = NSXMLEntityDeclarationKind; break; case XML_NOTATION_NODE: cls = [NSXMLDTDNode class]; kind = NSXMLNotationDeclarationKind; break; case XML_ATTRIBUTE_NODE: cls = [NSXMLNode class]; kind = NSXMLAttributeKind; break; case XML_CDATA_SECTION_NODE: cls = [NSXMLNode class]; kind = NSXMLTextKind; // FIXME: Should set option break; case XML_COMMENT_NODE: cls = [NSXMLNode class]; kind = NSXMLCommentKind; break; case XML_NAMESPACE_DECL: cls = [NSXMLNode class]; kind = NSXMLNamespaceKind; break; case XML_PI_NODE: cls = [NSXMLNode class]; kind = NSXMLProcessingInstructionKind; break; case XML_TEXT_NODE: cls = [NSXMLNode class]; kind = NSXMLTextKind; break; default: NSLog(@"ERROR: _objectForNode: called with a node of type %d", type); return nil; break; } if (node->type == XML_NAMESPACE_DECL) { docNode = NULL; } else { docNode = node->doc; } if ((docNode != NULL) && ((xmlNodePtr)docNode != node) && (NULL != docNode->children)) { doc = (NSXMLDocument*)[self _objectForNode: (xmlNodePtr)docNode]; if (doc != nil) { cls = [[doc class] replacementClassForClass: cls]; } } result = [[cls alloc] _initWithNode: node kind: kind]; AUTORELEASE(result); if (node->type == XML_NAMESPACE_DECL) { [doc _addSubNode: result]; } else { if (node->parent) { NSXMLNode *parent = [self _objectForNode: node->parent]; [parent _addSubNode: result]; } } } } return result; } - (void) _addSubNode: (NSXMLNode *)subNode { if (!internal->subNodes) internal->subNodes = [[NSMutableArray alloc] init]; if ([internal->subNodes indexOfObjectIdenticalTo: subNode] == NSNotFound) { [internal->subNodes addObject: subNode]; } } - (void) _removeSubNode: (NSXMLNode *)subNode { // retain temporarily so we can safely remove from our subNodes list first AUTORELEASE(RETAIN(subNode)); [internal->subNodes removeObjectIdenticalTo: subNode]; } - (void) _createInternal { GS_CREATE_INTERNAL(NSXMLNode); } - (id) _initWithNode: (xmlNodePtr)theNode kind: (NSXMLNodeKind)theKind { if ((self = [super init])) { [self _createInternal]; [self _setNode: theNode]; internal->kind = theKind; } return self; } - (xmlNodePtr) _childNodeAtIndex: (NSUInteger)index { NSUInteger count = 0; xmlNodePtr theNode = internal->node.node; xmlNodePtr children; if ((theNode->type == XML_NAMESPACE_DECL) || (theNode->type == XML_ATTRIBUTE_NODE)) { return NULL; } children = theNode->children; if (!children) return NULL; // the Cocoa docs say it returns nil if there are no children while (children != NULL && count++ < index) { children = children->next; } if (count < index) [NSException raise: NSRangeException format: @"child index too large"]; return children; } - (void) _insertChild: (NSXMLNode*)child atIndex: (NSUInteger)index { /* this private method provides the common insertion * implementation used by NSXMLElement and NSXMLDocument */ // Get all of the nodes... xmlNodePtr parentNode = internal->node.node; // we are the parent xmlNodePtr childNode = (xmlNodePtr)[child _node]; xmlNodePtr curNode = [self _childNodeAtIndex: index]; BOOL mergeTextNodes = NO; // is there a defined option for this? if (childNode->type == XML_NAMESPACE_DECL) { // FIXME return; } else { xmlDocPtr tmp = childNode->doc; if (tmp) { // Try to resolve half defined namespaces xmlNsPtr ns = tmp->oldNs; xmlNsPtr last = NULL; ensure_oldNs(parentNode); while (ns != NULL) { BOOL resolved = NO; if (ns->href == NULL) { xmlNsPtr ns1; ns1 = xmlSearchNs(parentNode->doc, parentNode, ns->prefix); if (ns1 != NULL) { cleanup_namespaces(childNode, ns1); resolved = YES; } } /* else if (ns->prefix == NULL) { xmlNsPtr ns1; ns1 = xmlSearchNsByHref(parentNode->doc, parentNode, ns->href); if (ns1 != NULL) { cleanup_namespaces(childNode, ns1); resolved = YES; } } */ if (!resolved) { xmlNsPtr cur = ns; xmlNsPtr oldNs1; // Need to transfer the namespace to the new tree // Unlink in old if (last == NULL) { tmp->oldNs = NULL; } else { last->next = ns->next; } ns = ns->next; cur->next = NULL; // Insert in new oldNs1 = parentNode->doc->oldNs; while (oldNs1) { if (oldNs1->next == NULL) { oldNs1->next = cur; break; } oldNs1 = oldNs1->next; } } else { last = ns; ns = ns->next; } } #if LIBXML_VERSION >= 20620 xmlDOMWrapAdoptNode(NULL, childNode->doc, childNode, parentNode->doc, parentNode, 0); #else xmlSetTreeDoc(childNode, parentNode->doc); #endif xmlFreeDoc(tmp); } } if (mergeTextNodes || ((childNode->type != XML_TEXT_NODE) && (parentNode->type != XML_TEXT_NODE))) { // this uses the built-in libxml functions which merge adjacent text nodes xmlNodePtr addedNode = NULL; if (curNode == NULL) { addedNode = xmlAddChild(parentNode, childNode); } else { addedNode = xmlAddPrevSibling(curNode, childNode); } if (addedNode != childNode) { if (addedNode != NULL) { // The node was freed while merging [child _invalidate]; } // Don't add as subnode return; } } else { /* here we avoid merging adjacent text nodes by linking * the new node in "by hand" */ childNode->parent = parentNode; xmlSetTreeDoc(childNode, parentNode->doc); if (curNode) { // insert childNode before an existing node curNode xmlNodePtr prevNode = curNode->prev; curNode->prev = childNode; childNode->next = curNode; if (prevNode) { childNode->prev = prevNode; prevNode->next = childNode; } else { /* in this case, this is the new "first child", * so update our parent to point to it */ parentNode->children = childNode; } } else { // not inserting before an existing node... add as new "last child" xmlNodePtr formerLastChild = parentNode->last; if (formerLastChild) { formerLastChild->next = childNode; childNode->prev = formerLastChild; parentNode->last = childNode; } else { // no former children -- this is the first parentNode->children = childNode; parentNode->last = childNode; } } } [self _addSubNode: child]; } - (void) _invalidate { internal->kind = NSXMLInvalidKind; [self _setNode: NULL]; } @end static void clearPrivatePointers(xmlNodePtr aNode) { if (!aNode) return; if (aNode->type == XML_NAMESPACE_DECL) { xmlNsPtr ns = (xmlNsPtr)aNode; ns->_private = NULL; clearPrivatePointers((xmlNodePtr)(ns->next)); return; } aNode->_private = NULL; clearPrivatePointers(aNode->children); clearPrivatePointers(aNode->next); if (aNode->type == XML_ELEMENT_NODE) { clearPrivatePointers((xmlNodePtr)(aNode->properties)); clearPrivatePointers((xmlNodePtr)(aNode->nsDef)); } if (aNode->type == XML_ELEMENT_DECL) { xmlElementPtr elem = (xmlElementPtr)aNode; clearPrivatePointers((xmlNodePtr)(elem->attributes)); } if (aNode->type == XML_DOCUMENT_NODE) { xmlDocPtr doc = (xmlDocPtr)aNode; clearPrivatePointers((xmlNodePtr)(doc->intSubset)); } // FIXME: Handle more node types } static NSArray * execute_xpath(xmlNodePtr node, NSString *xpath_exp, NSDictionary *constants, BOOL nodesOnly, NSError **error) { xmlDocPtr doc = node->doc; NSMutableArray *result = nil; const xmlChar* xpathExpr = XMLSTRING(xpath_exp); xmlXPathContextPtr xpathCtx = NULL; xmlXPathObjectPtr xpathObj = NULL; xmlNodePtr rootNode = NULL; if (error != NULL) { *error = NULL; } if (doc == NULL) { // FIXME: Create temporary document return nil; } assert(xpathExpr); /* Create xpath evaluation context */ xpathCtx = xmlXPathNewContext(doc); if (!xpathCtx) { NSLog(@"Error: unable to create new XPath context."); return nil; } // provide a context for relative paths xpathCtx->node = node; /* Register namespaces from root node (if any) */ rootNode = xmlDocGetRootElement(doc); if (rootNode != NULL) { xmlNsPtr ns = rootNode->nsDef; while (ns != NULL) { xmlXPathRegisterNs(xpathCtx, ns->prefix, ns->href); ns = ns->next; } } // Add constants if (constants != nil) { NSEnumerator *keyEnum = [constants keyEnumerator]; NSString *key; while ((key = [keyEnum nextObject]) != nil) { id obj = [constants objectForKey: key]; const xmlChar *name = XMLSTRING(key); // FIXME: Add more conversions if ([obj isKindOfClass: [NSString class]]) { xmlXPathObjectPtr value = xmlXPathNewString(XMLSTRING(obj)); xmlXPathRegisterVariable(xpathCtx, name, value); } } } /* Evaluate xpath expression */ xpathObj = xmlXPathEvalExpression(xpathExpr, xpathCtx); if (xpathObj == NULL) { NSLog(@"Error: unable to evaluate xpath expression \"%s\"", xpathExpr); xmlXPathFreeContext(xpathCtx); return nil; } /* results */ if (xpathObj->type == XPATH_NODESET) { xmlNodeSetPtr nodeset = NULL; nodeset = xpathObj->nodesetval; if (!xmlXPathNodeSetIsEmpty(nodeset)) { int i = 0; /* Collect results */ result = [NSMutableArray arrayWithCapacity: nodeset->nodeNr]; for (i = 0; i < nodeset->nodeNr; i++) { id obj = nil; xmlNodePtr cur = NULL; cur = nodeset->nodeTab[i]; obj = [NSXMLNode _objectForNode: cur]; if (obj) { [result addObject: obj]; } } } } else if (!nodesOnly) { switch (xpathObj->type) { case XPATH_STRING: result = [NSMutableArray arrayWithObject: StringFromXMLStringPtr(xpathObj->stringval)]; break; // FIXME: Handle other types default: break; } } /* Cleanup */ xmlXPathFreeObject(xpathObj); xmlXPathFreeContext(xpathCtx); return result; } @implementation NSXMLNode + (void) initialize { if (self == [NSXMLNode class]) { xmlCheckVersion(LIBXML_VERSION); // Protect against libxml2 not being correctly set up on Windows. // See: http://www.linuxquestions.org/questions/programming-9/%5Bsolved%5Dusing-libxml2-on-mingw-xmlfree-crashes-839802/ if (!xmlFree) { xmlMemGet(&xmlFree, &xmlMalloc, &xmlRealloc, NULL); } // Switch off default xmlKeepBlanksDefault(0); } } + (id) attributeWithName: (NSString*)name stringValue: (NSString*)stringValue { NSXMLNode *n; n = [[self alloc] initWithKind: NSXMLAttributeKind]; [n setStringValue: stringValue]; [n setName: name]; return AUTORELEASE(n); } + (id) attributeWithName: (NSString*)name URI: (NSString*)URI stringValue: (NSString*)stringValue { NSXMLNode *n; n = [[self alloc] initWithKind: NSXMLAttributeKind]; [n setURI: URI]; [n setStringValue: stringValue]; [n setName: name]; return AUTORELEASE(n); } + (id) commentWithStringValue: (NSString*)stringValue { NSXMLNode *n; n = [[self alloc] initWithKind: NSXMLCommentKind]; [n setStringValue: stringValue]; return AUTORELEASE(n); } + (id) DTDNodeWithXMLString: (NSString*)string { NSXMLNode *n; n = [[NSXMLDTDNode alloc] initWithXMLString: string]; return AUTORELEASE(n); } + (id) document { NSXMLNode *n; n = [[NSXMLDocument alloc] initWithKind: NSXMLDocumentKind]; return AUTORELEASE(n); } + (id) documentWithRootElement: (NSXMLElement*)element { NSXMLDocument *d; d = [[NSXMLDocument alloc] initWithRootElement: element]; return AUTORELEASE(d); } + (id) elementWithName: (NSString*)name { NSXMLNode *n; n = [[NSXMLElement alloc] initWithName: name]; return AUTORELEASE(n); } + (id) elementWithName: (NSString*)name children: (NSArray*)children attributes: (NSArray*)attributes { NSXMLElement *e = [self elementWithName: name]; [e insertChildren: children atIndex: 0]; [e setAttributes: attributes]; return e; } + (id) elementWithName: (NSString*)name URI: (NSString*)URI { NSXMLNode *n; n = [[NSXMLElement alloc] initWithName: name URI: URI]; return AUTORELEASE(n); } + (id) elementWithName: (NSString*)name stringValue: (NSString*)string { NSXMLElement *e; e = [[NSXMLElement alloc] initWithName: name stringValue: string]; return AUTORELEASE(e); } + (NSString*) localNameForName: (NSString*)name { const xmlChar *xmlName = XMLSTRING(name); xmlChar *prefix = NULL; xmlChar *localName; NSString *result = name; if (NULL == xmlName) return nil; localName = xmlSplitQName2(xmlName, &prefix); if (NULL != localName) { result = StringFromXMLStringPtr(localName); xmlFree(localName); xmlFree(prefix); } return result; } + (id) namespaceWithName: (NSString*)name stringValue: (NSString*)stringValue { NSXMLNode *n; n = [[self alloc] initWithKind: NSXMLNamespaceKind]; [n setName: name]; [n setStringValue: stringValue]; return AUTORELEASE(n); } + (NSXMLNode*) predefinedNamespaceForPrefix: (NSString*)name { // FIXME: We should cache these instances if ([name isEqualToString: @"xml"]) { return [self namespaceWithName: @"xml" stringValue: @"http: //www.w3.org/XML/1998/namespace"]; } if ([name isEqualToString: @"xs"]) { return [self namespaceWithName: @"xs" stringValue: @"http: //www.w3.org/2001/XMLSchema"]; } if ([name isEqualToString: @"xsi"]) { return [self namespaceWithName: @"xsi" stringValue: @"http: //www.w3.org/2001/XMLSchema-instance"]; } if ([name isEqualToString: @"fn"]) { return [self namespaceWithName: @"fn" stringValue: @"http: //www.w3.org/2003/11/xpath-functions"]; } if ([name isEqualToString: @"local"]) { return [self namespaceWithName: @"local" stringValue: @"http: //www.w3.org/2003/11/xpath-local-functions"]; } return nil; } + (NSString*) prefixForName: (NSString*)name { const xmlChar *xmlName = XMLSTRING(name); xmlChar *localName; xmlChar *prefix = NULL; NSString *result = @""; if (NULL == xmlName) { return result; } localName = xmlSplitQName2(xmlName, &prefix); if (NULL != prefix) { result = StringFromXMLStringPtr(prefix); xmlFree(localName); xmlFree(prefix); } return result; } + (id) processingInstructionWithName: (NSString*)name stringValue: (NSString*)stringValue { NSXMLNode *n; n = [[self alloc] initWithKind: NSXMLProcessingInstructionKind]; [n setStringValue: stringValue]; [n setName: name]; return AUTORELEASE(n); } + (id) textWithStringValue: (NSString*)stringValue { NSXMLNode *n; n = [[self alloc] initWithKind: NSXMLTextKind]; [n setStringValue: stringValue]; return AUTORELEASE(n); } - (NSString*) canonicalXMLStringPreservingComments: (BOOL)comments { // FIXME ... generate from libxml return [self XMLStringWithOptions: NSXMLNodePreserveWhitespace]; } - (NSXMLNode*) childAtIndex: (NSUInteger)index { xmlNodePtr childNode = [self _childNodeAtIndex: index]; return [NSXMLNode _objectForNode: childNode]; } - (NSUInteger) childCount { NSUInteger count = 0; xmlNodePtr children = NULL; xmlNodePtr theNode = internal->node.node; if (!theNode) { return 0; } if ((theNode->type == XML_NAMESPACE_DECL) || (theNode->type == XML_ATTRIBUTE_NODE)) { return 0; } for (children = theNode->children; children; children = children->next) { count++; } return count; } - (NSArray*) children { NSMutableArray *childrenArray = nil; if (NSXMLInvalidKind == internal->kind) { return nil; } else { xmlNodePtr children = NULL; xmlNodePtr theNode = internal->node.node; if ((theNode == NULL) || (theNode->type == XML_NAMESPACE_DECL) || (theNode->type == XML_ATTRIBUTE_NODE) || (theNode->children == NULL)) { return nil; } childrenArray = [NSMutableArray array]; for (children = theNode->children; children; children = children->next) { NSXMLNode *n = [NSXMLNode _objectForNode: children]; [childrenArray addObject: n]; } } return childrenArray; } - (id) copyWithZone: (NSZone*)zone { NSXMLNode *c = [[self class] allocWithZone: zone]; xmlNodePtr newNode = xmlCopyNode([self _node], 1); // make a deep copy clearPrivatePointers(newNode); c = [c _initWithNode: newNode kind: internal->kind]; GSIVar(c, options) = internal->options; if (nil != internal->objectValue) { /* Only copy the objectValue when externally set. The problem here are nodes created by parsing XML. There the stringValue may be set, but the objectValue isn't. This should rather be solved by creating a suitable objectValue, when the node gets instantiated. */ [c setObjectValue: internal->objectValue]; } [c setURI: [self URI]]; // [c setName: [self name]]; // [c setStringValue: [self stringValue]]; return c; } - (NSString*) description { /* OSX simply uses the XML string value of a node as its description. return [NSString stringWithFormat:@"<%@ %@ %d>%@", NSStringFromClass([self class]), [self name], [self kind], [self XMLString]]; */ return [self XMLString]; } - (void) dealloc { if (GS_EXISTS_INTERNAL) { xmlNodePtr theNode = internal->node.node; NSArray *theSubNodes = [internal->subNodes copy]; NSEnumerator *enumerator = [theSubNodes objectEnumerator]; NSXMLNode *subNode; while ((subNode = [enumerator nextObject]) != nil) { [subNode detach]; } RELEASE(theSubNodes); RELEASE(internal->objectValue); RELEASE(internal->subNodes); if (theNode) { if (theNode->type == XML_NAMESPACE_DECL) { ((xmlNsPtr)theNode)->_private = NULL; // FIXME: Not sure when to free the node here, // the same namespace node might be referenced // from other places. xmlFreeNode(theNode); } else { theNode->_private = NULL; if (theNode->parent == NULL) { // the top level node frees the entire tree if (theNode->type == XML_DOCUMENT_NODE) { xmlFreeDoc((xmlDocPtr)theNode); } else if (theNode->type == XML_ENTITY_DECL && ((xmlEntityPtr)theNode)->etype == XML_INTERNAL_PREDEFINED_ENTITY) { // Don't free internal entity nodes } else { xmlDocPtr tmp = theNode->doc; xmlFreeNode(theNode); // Free the private document we allocated in detach if (tmp) { xmlFreeDoc(tmp); } } } } } GS_DESTROY_INTERNAL(NSXMLNode); } [super dealloc]; } - (void) detach { xmlNodePtr theNode = internal->node.node; if (theNode) { NSXMLNode *parent = [self parent]; if (theNode->type == XML_NAMESPACE_DECL) { // FIXME } else { if (theNode->doc) { /* Create a private document and move the node over. * This is needed so that the strings of the nodes subtree * get stored in the dictionary of this new document. */ // FIXME: Should flag this doc so it wont get returned in // the method rootDocument xmlDocPtr tmp = xmlNewDoc((xmlChar *)"1.0"); #if LIBXML_VERSION >= 20620 xmlDOMWrapAdoptNode(NULL, theNode->doc, theNode, tmp, NULL, 0); #else xmlSetTreeDoc(theNode, tmp); #endif } else { // separate our node from its parent and siblings xmlUnlinkNode(theNode); } } if (parent) { [parent _removeSubNode: self]; } } } - (NSUInteger) hash { return [[self name] hash]; } - (NSUInteger) index { xmlNodePtr theNode = internal->node.node; int count = 0; if (theNode->type == XML_NAMESPACE_DECL) { return 0; } while ((theNode = theNode->prev)) { count++; // count our earlier sibling nodes } return count; } - (id) init { return [self initWithKind: NSXMLInvalidKind]; } - (id) initWithKind: (NSXMLNodeKind)theKind { return [self initWithKind: theKind options: 0]; } - (id) initWithKind: (NSXMLNodeKind)theKind options: (NSUInteger)theOptions { Class theSubclass = [NSXMLNode class]; void *theNode = NULL; /* * We find the correct subclass for specific node kinds: */ switch (theKind) { case NSXMLDocumentKind: theSubclass = [NSXMLDocument class]; break; case NSXMLInvalidKind: theSubclass = [NSXMLNode class]; break; case NSXMLElementKind: theSubclass = [NSXMLElement class]; break; case NSXMLDTDKind: theSubclass = [NSXMLDTD class]; break; case NSXMLElementDeclarationKind: case NSXMLEntityDeclarationKind: case NSXMLNotationDeclarationKind: theSubclass = [NSXMLDTDNode class]; break; case NSXMLNamespaceKind: theSubclass = [NSXMLNode class]; break; case NSXMLAttributeKind: case NSXMLCommentKind: case NSXMLProcessingInstructionKind: case NSXMLTextKind: break; case NSXMLAttributeDeclarationKind: RELEASE(self); return nil; default: theKind = NSXMLInvalidKind; theSubclass = [NSXMLNode class]; break; } /* * Check whether we are already initializing an instance of the given * subclass. If we are not, release ourselves and allocate a subclass * instance instead. */ if (NO == [self isKindOfClass: theSubclass]) { RELEASE(self); return [[theSubclass alloc] initWithKind: theKind options: theOptions]; } /* If we are initializing for the correct class, we can actually perform * initializations: */ switch (theKind) { case NSXMLDocumentKind: theNode = xmlNewDoc((xmlChar *)"1.0"); break; case NSXMLInvalidKind: case NSXMLElementKind: theNode = xmlNewNode(NULL,(xmlChar *)""); break; case NSXMLDTDKind: theNode = xmlNewDtd(NULL, (xmlChar *)"", (xmlChar *)"",(xmlChar *)""); break; case NSXMLElementDeclarationKind: { xmlElementPtr ret; ret = (xmlElementPtr) xmlMalloc(sizeof(xmlElement)); memset(ret, 0, sizeof(xmlElement)); ret->type = XML_ELEMENT_DECL; ret->name = xmlStrdup((xmlChar *)""); theNode = ret; break; } case NSXMLEntityDeclarationKind: #if LIBXML_VERSION >= 20700 theNode = xmlNewEntity(NULL, (xmlChar *)"", 0, (xmlChar *)"", (xmlChar *)"", (xmlChar *)""); #else { xmlEntityPtr ret; ret = (xmlEntityPtr) xmlMalloc(sizeof(xmlEntity)); memset(ret, 0, sizeof(xmlEntity)); ret->type = XML_ENTITY_DECL; ret->name = xmlStrdup((xmlChar *)""); ret->ExternalID = xmlStrdup((xmlChar *)""); ret->SystemID = xmlStrdup((xmlChar *)""); ret->content = xmlStrdup((xmlChar *)""); theNode = ret; } #endif break; case NSXMLNotationDeclarationKind: // FIXME theNode = xmlNewNode(NULL, (xmlChar *)""); break; case NSXMLProcessingInstructionKind: theNode = xmlNewPI((xmlChar *)"", (xmlChar *)""); break; case NSXMLCommentKind: theNode = xmlNewComment((xmlChar *)""); break; case NSXMLTextKind: theNode = xmlNewText((xmlChar *)""); break; case NSXMLNamespaceKind: theNode = xmlNewNs(NULL,(xmlChar *)"",(xmlChar *)""); break; case NSXMLAttributeKind: theNode = xmlNewProp(NULL,(xmlChar *)"",(xmlChar *)""); break; default: break; } if (nil == (self = [self _initWithNode: theNode kind: theKind])) { return nil; } internal->options = theOptions; return self; } - (BOOL) isEqual: (id)other { if ([self kind] != [other kind]) { return NO; } /* NSLog(@"self %@ other %@", self, other); NSLog(@"s sV '%@' oV '%@', other sV '%@' oV '%@'", [self stringValue], [self objectValue], [other stringValue], [other objectValue]); */ return isEqualTree(internal->node.node, (xmlNodePtr)[other _node]); } - (NSXMLNodeKind) kind { return internal->kind; } - (NSUInteger) level { NSXMLNode *parent = [self parent]; if (nil == parent) { return 0; } else { return [parent level] + 1; } } - (NSString*) localName { xmlNodePtr theNode = internal->node.node; if (NSXMLInvalidKind == internal->kind) { return nil; } if (theNode->type == XML_NAMESPACE_DECL) { return StringFromXMLStringPtr(((xmlNs *)theNode)->prefix); } else { return StringFromXMLStringPtr(theNode->name); } } - (NSString*) name { NSString *localName = [self localName]; if (nil != localName) { NSString *prefix = [self prefix]; if ((nil != prefix) && [prefix length] > 0) { return [NSString stringWithFormat: @"%@:%@", prefix, localName]; } } return localName; } - (NSXMLNode*) _nodeFollowingInNaturalDirection: (BOOL)forward { NSXMLNode *ancestor = self; NSXMLNode *candidate = nil; NSXMLNodeKind theKind; if (forward) { /* Node walking is a depth-first thingy. Hence, we consider children first: */ if (0 != [self childCount]) { candidate = [[self children] objectAtIndex: 0]; } } /* If there are no children, we move on to siblings: */ /* If there are no siblings left for the receiver, we recurse down to the root * of the tree until we find an ancestor with further siblings: */ while ((nil == candidate) && (nil != ancestor)) { if (forward) { candidate = [ancestor nextSibling]; } else { candidate = [ancestor previousSibling]; } ancestor = [ancestor parent]; } /* No children, no next siblings, no next siblings for any ancestor: We are * the last node */ if (nil == candidate) { return nil; } if (!forward) { /* Node walking is a depth-first thingy. Hence, we consider children first: */ while (0 != [candidate childCount]) { NSUInteger theIndex = [candidate childCount] - 1; candidate = [[candidate children] objectAtIndex: theIndex]; } } /* Sanity check: Namespace and attribute nodes are skipped: */ theKind = [candidate kind]; if ((NSXMLAttributeKind == theKind) || (NSXMLNamespaceKind == theKind)) { return [candidate _nodeFollowingInNaturalDirection: forward]; } return candidate; } - (NSXMLNode*) nextNode { return [self _nodeFollowingInNaturalDirection: YES]; } - (NSXMLNode*) nextSibling { xmlNodePtr theNode = internal->node.node; if (NULL == theNode) { return nil; } if (XML_NAMESPACE_DECL == theNode->type) { return nil; } return [NSXMLNode _objectForNode: theNode->next]; } - (id) objectValue { return internal->objectValue; } - (NSXMLNode*) parent { xmlNodePtr parent = NULL; xmlNodePtr theNode = internal->node.node; if (NULL == theNode) { return nil; } if (XML_NAMESPACE_DECL == theNode->type) { return nil; } parent = theNode->parent; return [NSXMLNode _objectForNode: parent]; } - (NSString*) prefix { xmlNodePtr theNode = internal->node.node; if (NULL == theNode) { return nil; } if (XML_NAMESPACE_DECL == theNode->type) { return @""; } if (XML_ELEMENT_NODE != theNode->type) { return @""; } if (theNode->ns == NULL) { return @""; } return StringFromXMLStringPtr(theNode->ns->prefix); } - (NSXMLNode*) previousNode { return [self _nodeFollowingInNaturalDirection: NO]; } - (NSXMLNode*) previousSibling { xmlNodePtr theNode = internal->node.node; if (NULL == theNode) { return nil; } if (XML_NAMESPACE_DECL == theNode->type) { return nil; } return [NSXMLNode _objectForNode: theNode->prev]; } - (NSXMLDocument*) rootDocument { xmlNodePtr theNode = internal->node.node; if (NULL == theNode) { return nil; } if (XML_NAMESPACE_DECL == theNode->type) { return nil; } if ((NULL == theNode->doc) || (NULL == theNode->doc->children)) { // This is a standalone node, we still may have a private document, // but we don't want to return this. return nil; } return (NSXMLDocument *)[NSXMLNode _objectForNode: (xmlNodePtr)(theNode->doc)]; } - (NSString*) stringValue { xmlNodePtr theNode = internal->node.node; xmlChar *content = xmlNodeGetContent(theNode); NSString *result = nil; if (NULL != content) { result = StringFromXMLStringPtr(content); xmlFree(content); } else { result = @""; } return result; } - (void) setObjectValue: (id)value { NSString *stringValue; // FIXME: Use correct formatter here stringValue = [value description]; [self setStringValue: stringValue]; ASSIGN(internal->objectValue, value); } - (void) setName: (NSString *)name { xmlNodePtr theNode = internal->node.node; if (NSXMLInvalidKind == internal->kind) { return; } if (theNode->type == XML_NAMESPACE_DECL) { xmlNsPtr ns = (xmlNsPtr)theNode; if (ns->prefix != NULL) { xmlFree((xmlChar *)ns->prefix); } ns->prefix = XMLStringCopy(name); } else { const xmlChar *xmlName = XMLSTRING(name); xmlChar *prefix = NULL; xmlChar *localName; if (NULL == xmlName) { xmlNodeSetName(theNode, (const xmlChar *)""); return; } localName = xmlSplitQName2(xmlName, &prefix); if (prefix != NULL) { if ((theNode->type == XML_ATTRIBUTE_NODE) || (theNode->type == XML_ELEMENT_NODE)) { if ((theNode->ns != NULL && theNode->ns->prefix == NULL)) { theNode->ns->prefix = xmlStrdup(prefix); } else { xmlNsPtr ns; // Set namespace ns = xmlSearchNs(theNode->doc, theNode, prefix); if (ns) { xmlSetNs(theNode, ns); } else { xmlNsPtr oldNs; ensure_oldNs(theNode); // Fake the name space and fix it later // This function is private, so re reimplemt it. //ns = xmlDOMWrapStoreNs(node->doc, NULL, prefix); oldNs = theNode->doc->oldNs; while (oldNs) { if (oldNs->prefix != NULL && xmlStrEqual(oldNs->prefix, prefix)) { ns = oldNs; break; } if (oldNs->next == NULL) { ns = xmlNewNs(NULL, NULL, prefix); oldNs->next = ns; break; } oldNs = oldNs->next; } xmlSetNs(theNode, ns); } } } xmlNodeSetName(theNode, localName); xmlFree(localName); xmlFree(prefix); } else { xmlNodeSetName(theNode, xmlName); } } } - (void) setStringValue: (NSString*)string { [self setStringValue: string resolvingEntities: NO]; } - (void) setStringValue: (NSString*)string resolvingEntities: (BOOL)resolve { xmlNodePtr theNode = internal->node.node; if (theNode->type == XML_NAMESPACE_DECL) { xmlNsPtr ns = (xmlNsPtr)theNode; if (ns->href != NULL) { xmlFree((xmlChar *)ns->href); } ns->href = XMLStringCopy(string); } else { // Remove all child nodes except attributes if (internal->subNodes) { NSArray *theSubNodes = [internal->subNodes copy]; NSEnumerator *enumerator = [theSubNodes objectEnumerator]; NSXMLNode *subNode; while ((subNode = [enumerator nextObject]) != nil) { if ([subNode kind] != NSXMLAttributeKind) { [subNode detach]; } } RELEASE(theSubNodes); } if (resolve == NO) { xmlNodeSetContent(theNode, XMLSTRING(string)); } else { // need to actually resolve entities... // is this the right functionality?? xmlEncodeSpecialChars() xmlChar *newstr = xmlEncodeEntitiesReentrant(theNode->doc, XMLSTRING(string)); xmlNodeSetContent(theNode, newstr); xmlMemFree(newstr); } } ASSIGN(internal->objectValue, string); } - (void) setURI: (NSString*)URI { xmlNodePtr theNode = internal->node.node; if (NSXMLInvalidKind == internal->kind) { return; } if ((theNode->type == XML_ATTRIBUTE_NODE) || (theNode->type == XML_ELEMENT_NODE)) { const xmlChar *uri = XMLSTRING(URI); xmlNsPtr ns; if (uri == NULL) { theNode->ns = NULL; return; } ns = xmlSearchNsByHref(theNode->doc, theNode, uri); if (ns == NULL) { if ((theNode->ns != NULL && theNode->ns->href == NULL)) { theNode->ns->href = xmlStrdup(uri); return; } /* if (theNode->type == XML_ELEMENT_NODE) { //ns = xmlNewNs(theNode, uri, (const xmlChar *)""); ns = xmlNewNs(theNode, uri, NULL); } else */ { xmlNsPtr oldNs; ensure_oldNs(theNode); // Fake the name space and fix it later // This function is private, so re reimplemt it. //ns = xmlDOMWrapStoreNs(node->doc, NULL, prefix); oldNs = theNode->doc->oldNs; while (oldNs) { if (oldNs->href != NULL && xmlStrEqual(oldNs->href, uri)) { ns = oldNs; break; } if (oldNs->next == NULL) { ns = xmlNewNs(NULL, uri, NULL); oldNs->next = ns; break; } oldNs = oldNs->next; } } } xmlSetNs(theNode, ns); } } - (NSString*) URI { xmlNodePtr theNode = internal->node.node; if (NSXMLInvalidKind == internal->kind) { return nil; } if ((theNode->type == XML_ATTRIBUTE_NODE) || (theNode->type == XML_ELEMENT_NODE)) { xmlNsPtr ns = theNode->ns; if ((ns != NULL) && (ns->href != NULL)) { return StringFromXMLStringPtr(ns->href); } } return nil; } - (NSString*) XMLString { return [self XMLStringWithOptions: NSXMLNodeOptionsNone]; } - (NSString*) XMLStringWithOptions: (NSUInteger)theOptions { NSString *string = nil; xmlBufferPtr buffer; int error = 0; int xmlOptions = 0; buffer = xmlBufferCreate(); if (buffer == NULL) { // FIXME: xmlGetLastError() return nil; } // XML_SAVE_XHTML XML_SAVE_AS_HTML XML_SAVE_NO_DECL XML_SAVE_NO_XHTML #if LIBXML_VERSION >= 20702 xmlOptions |= XML_SAVE_AS_XML; #endif #if LIBXML_VERSION >= 20708 if (theOptions & NSXMLNodePreserveWhitespace) { xmlOptions |= XML_SAVE_WSNONSIG; } #endif #if LIBXML_VERSION >= 20622 //NSXMLNodeExpandEmptyElement is the default if ((theOptions & NSXMLNodeCompactEmptyElement) == 0) { xmlOptions |= XML_SAVE_NO_EMPTY; } #endif #if LIBXML_VERSION >= 20617 if (theOptions & NSXMLNodePrettyPrint) { xmlOptions |= XML_SAVE_FORMAT; } #endif #if LIBXML_VERSION >= 20623 { xmlSaveCtxtPtr ctxt; ctxt = xmlSaveToBuffer(buffer, "utf-8", xmlOptions); xmlSaveTree(ctxt, internal->node.node); error = xmlSaveClose(ctxt); } #else { xmlDocPtr doc = NULL; if (internal->node.node->type != XML_NAMESPACE_DECL) { doc = internal->node.node->doc; } error = xmlNodeDump(buffer, doc, internal->node.node, 1, 1); } #endif if (-1 == error) { xmlBufferFree(buffer); return nil; } string = StringFromXMLString(buffer->content, buffer->use); xmlBufferFree(buffer); if ([self kind] == NSXMLTextKind) { return string; } else { return [string stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]]; } } - (NSString*) XPath { xmlNodePtr theNode = internal->node.node; return StringFromXMLStringPtr(xmlGetNodePath(theNode)); } - (NSArray*) nodesForXPath: (NSString*)anxpath error: (NSError**)error { xmlNodePtr theNode = internal->node.node; if (NSXMLInvalidKind == internal->kind) { return nil; } if (theNode->type == XML_NAMESPACE_DECL) { return nil; } return execute_xpath(theNode, anxpath, nil, YES, error); } - (NSArray*) objectsForXQuery: (NSString*)xquery constants: (NSDictionary*)constants error: (NSError**)error { return [self notImplemented: _cmd]; } - (NSArray*) objectsForXQuery: (NSString*)xquery error: (NSError**)error { return [self objectsForXQuery: xquery constants: nil error: error]; } @end #else #import "Foundation/NSException.h" #import "Foundation/NSXMLNode.h" @implementation NSXMLNode + (id) attributeWithName: (NSString*)name stringValue: (NSString*)stringValue { return nil; } + (id) attributeWithName: (NSString*)name URI: (NSString*)URI stringValue: (NSString*)stringValue { return nil; } + (id) commentWithStringValue: (NSString*)stringValue { return nil; } + (id) DTDNodeWithXMLString: (NSString*)string { return nil; } + (id) document { return nil; } + (id) documentWithRootElement: (NSXMLElement*)element { return nil; } + (id) elementWithName: (NSString*)name { return nil; } + (id) elementWithName: (NSString*)name children: (NSArray*)children attributes: (NSArray*)attributes { return nil; } + (id) elementWithName: (NSString*)name URI: (NSString*)URI { return nil; } + (id) elementWithName: (NSString*)name stringValue: (NSString*)string { return nil; } + (NSString*) localNameForName: (NSString*)name { return nil; } + (id) namespaceWithName: (NSString*)name stringValue: (NSString*)stringValue { return nil; } + (NSXMLNode*) predefinedNamespaceForPrefix: (NSString*)name { return nil; } + (NSString*) prefixForName: (NSString*)name { return nil; } + (id) processingInstructionWithName: (NSString*)name stringValue: (NSString*)stringValue { return nil; } + (id) textWithStringValue: (NSString*)stringValue { return nil; } - (NSString*) canonicalXMLStringPreservingComments: (BOOL)comments { return nil; } - (NSXMLNode*) childAtIndex: (NSUInteger)index { return nil; } - (NSUInteger) childCount { return 0; } - (NSArray*) children { return nil; } - (id) copyWithZone: (NSZone*)zone { return nil; } - (void) detach { } - (NSUInteger) index { return 0; } - (id) init { NSString *className = NSStringFromClass([self class]); DESTROY(self); [NSException raise: NSGenericException format: @"%@ - no libxml2 at configure time", className]; return nil; } - (id) initWithKind: (NSXMLNodeKind)theKind { return [self init]; } - (id) initWithKind: (NSXMLNodeKind)theKind options: (NSUInteger)theOptions { return [self init]; } - (NSXMLNodeKind) kind { return 0; } - (NSUInteger) level { return 0; } - (NSString*) localName { return nil; } - (NSString*) name { return nil; } - (NSXMLNode*) nextNode { return nil; } - (NSXMLNode*) nextSibling { return nil; } - (id) objectValue { return nil; } - (NSXMLNode*) parent { return nil; } - (NSString*) prefix { return nil; } - (NSXMLNode*) previousNode { return nil; } - (NSXMLNode*) previousSibling { return nil; } - (NSXMLDocument*) rootDocument { return nil; } - (NSString*) stringValue { return nil; } - (void) setObjectValue: (id)value { } - (void) setName: (NSString *)name { } - (void) setStringValue: (NSString*)string { } - (void) setStringValue: (NSString*)string resolvingEntities: (BOOL)resolve { } - (void) setURI: (NSString*)URI { } - (NSString*) URI { return nil; } - (NSString*) XMLString { return nil; } - (NSString*) XMLStringWithOptions: (NSUInteger)theOptions { return nil; } - (NSString*) XPath { return nil; } - (NSArray*) nodesForXPath: (NSString*)anxpath error: (NSError**)error { return nil; } - (NSArray*) objectsForXQuery: (NSString*)xquery constants: (NSDictionary*)constants error: (NSError**)error { return nil; } - (NSArray*) objectsForXQuery: (NSString*)xquery error: (NSError**)error { return nil; } @end #endif /* HAVE_LIBXML */ gnustep-base-1.29.0/Source/NSXMLParser.m000066400000000000000000001633661435650067400177250ustar00rootroot00000000000000/** Implementation for NSXMLParser for GNUStep Copyright (C) 2004 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: May 2004 SloppyParser additions based on code by Nikolaus Schaller This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #define EXPOSE_NSXMLParser_IVARS 1 #import "Foundation/NSArray.h" #import "Foundation/NSError.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSException.h" #import "Foundation/NSXMLParser.h" #import "Foundation/NSData.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSNull.h" #import "GNUstepBase/GSMime.h" @interface GSMimeDocument (internal) + (NSString*) charsetForXml: (NSData*)xml; @end static NSNull *null = nil; /* We always have the native (sloppy) parser, and can get that behavior * by using the GSSloppyXMLParser class. * With libxml2 we have a stricter parser (which will break on some OSX * property lists) available using GSStrictXMLParser. */ @interface GSSloppyXMLParser : NSXMLParser @end @implementation GSSloppyXMLParser @end @interface GSStrictXMLParser : NSXMLParser @end @implementation NSString (NSXMLParser) - (NSString *) _stringByExpandingXMLEntities { NSMutableString *t = [NSMutableString stringWithString: self]; [t replaceOccurrencesOfString: @"&" withString: @"&" options: 0 range: NSMakeRange(0, [t length])]; // must be first! [t replaceOccurrencesOfString: @"<" withString: @"<" options: 0 range: NSMakeRange(0, [t length])]; [t replaceOccurrencesOfString: @">" withString: @">" options: 0 range: NSMakeRange(0, [t length])]; [t replaceOccurrencesOfString: @"\"" withString: @""" options: 0 range: NSMakeRange(0, [t length])]; [t replaceOccurrencesOfString: @"'" withString: @"'" options: 0 range: NSMakeRange(0, [t length])]; return t; } @end static inline NSString * NewUTF8STR(const void *ptr, int len) { NSString *s; s = [[NSString alloc] initWithBytes: ptr length: len encoding: NSUTF8StringEncoding]; if (s == nil) NSLog(@"could not convert to UTF8 string! bytes=%p len=%d", ptr, len); return s; } @interface GSXMLParserIvars : NSObject { @public NSMutableArray *tagPath; // hierarchy of tags NSMutableArray *namespaces; NSMutableDictionary *defaults; NSData *data; NSError *error; const unsigned char *bytes; NSUInteger cp; // character position NSUInteger cend; // end of data int line; // current line (counts from 0) int column; // current column (counts from 0) BOOL abort; // abort parse loop BOOL ignorable; // whitespace is ignorable BOOL whitespace; // had only whitespace in current data BOOL shouldProcessNamespaces; BOOL shouldReportNamespacePrefixes; BOOL shouldResolveExternalEntities; BOOL acceptHTML; // be lazy with bad tag nesting BOOL hasStarted; BOOL hasElement; IMP didEndElement; IMP didEndMappingPrefix; IMP didStartElement; IMP didStartMappingPrefix; IMP foundCDATA; IMP foundCharacters; IMP foundComment; IMP foundIgnorable; } @end @implementation GSXMLParserIvars - (NSString*) description { return [[super description] stringByAppendingFormat: @" shouldProcessNamespaces: %d" @" shouldReportNamespacePrefixes: %d" @" shouldResolveExternalEntities: %d" @" acceptHTML: %d" @" hasStarted: %d" @" hasElement: %d", shouldProcessNamespaces, shouldReportNamespacePrefixes, shouldResolveExternalEntities, acceptHTML, hasStarted, hasElement]; } @end static SEL didEndElementSel = 0; static SEL didEndMappingPrefixSel; static SEL didStartElementSel; static SEL didStartMappingPrefixSel; static SEL foundCDATASel; static SEL foundCharactersSel; static SEL foundCommentSel; static SEL foundIgnorableSel; @interface NSXMLParser (Private) - (NSString *) _newQarg; @end @implementation NSXMLParser #define EXTRA_DEBUG 0 #define _parser (self->_parser) #define _handler (self->_handler) #define this ((GSXMLParserIvars*)_parser) #define _del ((id)_handler) static Class sloppy = Nil; static Class strict = Nil; + (id) allocWithZone: (NSZone*)z { if (self == [NSXMLParser class]) { #if defined(HAVE_LIBXML) return NSAllocateObject(strict, 0, z); #else return NSAllocateObject(sloppy, 0, z); #endif } return NSAllocateObject(self, 0, z); } + (void) initialize { sloppy = [GSSloppyXMLParser class]; strict = [GSStrictXMLParser class]; if (null == nil) { null = RETAIN([NSNull null]); RELEASE([NSObject leakAt: &null]); } if (didEndElementSel == 0) { didEndElementSel = @selector(parser:didEndElement:namespaceURI:qualifiedName:); didEndMappingPrefixSel = @selector(parser:didEndMappingPrefix:); didStartElementSel = @selector(parser:didStartElement:namespaceURI:qualifiedName:attributes:); didStartMappingPrefixSel = @selector(parser:didStartMappingPrefix:toURI:); foundCDATASel = @selector(parser:foundCDATA:); foundCharactersSel = @selector(parser:foundCharacters:); foundCommentSel = @selector(parser:foundComment:); foundIgnorableSel = @selector(parser:foundIgnorableWhitespace:); } } - (void) abortParsing { this->abort = YES; } - (NSInteger) columnNumber { return this->column; } - (void) dealloc { if (this != 0) { RELEASE(this->data); RELEASE(this->error); RELEASE(this->tagPath); RELEASE(this->namespaces); RELEASE(this->defaults); RELEASE(this); _parser = 0; _handler = 0; } [super dealloc]; } - (id) delegate { return _del; } - (id) initWithContentsOfURL: (NSURL *)anURL { return [self initWithData: [NSData dataWithContentsOfURL: anURL]]; } #define addr(x) (this->bytes + (x)) - (id) initWithData: (NSData *)data { if (data == nil) { DESTROY(self); } else { self = [super init]; if (self) { NSStringEncoding enc; _parser = [GSXMLParserIvars new]; /* Determine character encoding and convert to utf-8 if needed. */ enc = [GSMimeDocument encodingFromCharset: [GSMimeDocument charsetForXml: data]]; if (enc == NSUTF8StringEncoding || enc == NSASCIIStringEncoding || enc == GSUndefinedEncoding) { this->data = [data copy]; } else { NSString *tmp; tmp = [[NSString alloc] initWithData: data encoding: enc]; this->data = [[tmp dataUsingEncoding: NSUTF8StringEncoding] retain]; RELEASE(tmp); } this->tagPath = [[NSMutableArray alloc] init]; this->namespaces = [[NSMutableArray alloc] init]; this->bytes = [this->data bytes]; this->cp = 0; this->cend = [this->data length]; /* If the data contained utf-8 with a BOM, we must skip it. */ if ((this->cend - this->cp) > 2 && addr(this->cp)[0] == 0xef && addr(this->cp)[1] == 0xbb && addr(this->cp)[2] == 0xbf) { this->cp += 3; // Skip BOM } } } return self; } - (id) initWithStream: (NSInputStream*)stream { RELEASE(self); // FIXME return nil; } - (NSInteger) lineNumber { return this->line; } - (void) setDelegate: (id)delegate { if (_handler != delegate) { _handler = delegate; if ([_del respondsToSelector: didEndElementSel]) { this->didEndElement = [_del methodForSelector: didEndElementSel]; } else { this->didEndElement = 0; } if ([_del respondsToSelector: didEndMappingPrefixSel]) { this->didEndMappingPrefix = [_del methodForSelector: didEndMappingPrefixSel]; } else { this->didEndMappingPrefix = 0; } if ([_del respondsToSelector: didStartElementSel]) { this->didStartElement = [_del methodForSelector: didStartElementSel]; } else { this->didStartElement = 0; } if ([_del respondsToSelector: didStartMappingPrefixSel]) { this->didStartMappingPrefix = [_del methodForSelector: didStartMappingPrefixSel]; } else { this->didStartMappingPrefix = 0; } if ([_del respondsToSelector: foundCDATASel]) { this->foundCDATA = [_del methodForSelector: foundCDATASel]; } else { this->foundCDATA = 0; } if ([_del respondsToSelector: foundCharactersSel]) { this->foundCharacters = [_del methodForSelector: foundCharactersSel]; } else { this->foundCharacters = 0; } if ([_del respondsToSelector: foundCommentSel]) { this->foundComment = [_del methodForSelector: foundCommentSel]; } else { this->foundComment = 0; } if ([_del respondsToSelector: foundIgnorableSel]) { /* It seems OX reports ignorable whitespace as characters, * so we disable this ... FIXME can this really be right? */ #if 0 this->foundIgnorable = [_del methodForSelector: foundIgnorableSel]; #else this->foundIgnorable = 0; #endif } else { this->foundIgnorable = 0; } } } - (NSError *) parserError { return this->error; } - (NSArray *) _tagPath { return this->tagPath; } #define cget() (\ (this->cp < this->cend) \ ? (this->column++, *addr(this->cp++)) \ : -1) - (BOOL) _parseError: (NSString *)message code: (NSInteger)code { NSDictionary *info = nil; message = [NSString stringWithFormat: @"line %d, column %d ... %@", this->line, this->column, message]; #if EXTRA_DEBUG NSLog(@"XML parseError: %@", message); #endif RELEASE(this->error); if (message != nil) { info = [[NSDictionary alloc] initWithObjectsAndKeys: message, NSLocalizedFailureReasonErrorKey, nil]; } this->error = [[NSError alloc] initWithDomain: NSXMLParserErrorDomain code: code userInfo: info]; RELEASE(info); this->abort = YES; if ([_del respondsToSelector: @selector(parser:parseErrorOccurred:)]) [_del parser: self parseErrorOccurred: this->error]; return NO; } /* Go up the namespace stack looking for a mapping from p to * a URI. Return the first URI found (or an empty string if none is found). */ - (NSString*) _uriForPrefix: (NSString*)p { unsigned i = [this->namespaces count]; NSString *uri = nil; while (uri == nil && i-- > 0) { id o = [this->namespaces objectAtIndex: i]; if (o != (id)null) { uri = [(NSDictionary*)o objectForKey: p]; } } return (nil == uri) ? @"" : uri; } - (void) _closeLastTag { NSString *tag = [this->tagPath lastObject]; if (this->didEndElement != 0) { NSString *qualified = tag; NSString *uri = @""; if (this->shouldProcessNamespaces) { NSRange r; NSString *p = @""; r = [tag rangeOfString: @":" options: NSLiteralSearch]; if (r.length > 0) { p = [tag substringToIndex: r.location]; tag = [tag substringFromIndex: NSMaxRange(r)]; } uri = [self _uriForPrefix: p]; } (*this->didEndElement)(_del, didEndElementSel, self, tag, uri, qualified); } if (this->shouldReportNamespacePrefixes) { if (this->didEndMappingPrefix != 0) { id d = [this->namespaces lastObject]; if (d != (id)null) { NSEnumerator *e = [(NSDictionary*)d keyEnumerator]; NSString *k; while ((k = [e nextObject]) != nil) { (*this->didEndMappingPrefix)(_del, didEndMappingPrefixSel, self, k); } } } } [this->tagPath removeLastObject]; [this->namespaces removeLastObject]; } - (void) _processDeclaration { NSUInteger tp; NSString *decl; NSString *name; int c; if (NO == this->hasStarted) { #if EXTRA_DEBUG NSLog(@"parserDidStartDocument: "); #endif this->hasStarted = YES; if ([_del respondsToSelector: @selector(parserDidStartDocument:)]) { [_del parserDidStartDocument: self]; } } c = cget(); while (isspace(c)) { c = cget(); } tp = this->cp - 1; while (c != EOF && !isspace(c) && c != '>') { c = cget(); // scan name to delimiting character } decl = NewUTF8STR(addr(tp), this->cp - tp - 1); if (nil == decl) { [self _parseError: @"invalid character in declaraction" code: NSXMLParserInvalidCharacterError]; return; } #if EXTRA_DEBUG NSLog(@"decl=%@ - %02x %c", decl, c, isprint(c)?c: ' '); #endif while (isspace(c)) { c = cget(); } tp = this->cp - 1; while (c != EOF && !isspace(c) && c != '>') { c = cget(); // scan name to delimiting character } name = NewUTF8STR(addr(tp), this->cp - tp - 1); if (nil == name) { [self _parseError: @"invalid character in declaraction name" code: NSXMLParserInvalidCharacterError]; RELEASE(decl); return; } #if EXTRA_DEBUG NSLog(@"name=%@ - %02x %c", name, c, isprint(c)?c: ' '); #endif if ([decl isEqualToString: @"ATTLIST"]) { NSMutableDictionary *d; NSString *attr; NSString *type; NSString *def; #if EXTRA_DEBUG NSLog(@"_processDeclaration <%@%@ %@>", flag?@"/": @"", decl, name); #endif /* Get the dictionary of attribute defaults for this element. */ d = [this->defaults objectForKey: name]; if (nil == d) { if (nil == this->defaults) { this->defaults = [NSMutableDictionary new]; } d = [NSMutableDictionary new]; [this->defaults setObject: d forKey: name]; RELEASE(d); } while (c != EOF && c != '>') { while (isspace(c)) { c = cget(); } tp = this->cp - 1; while (c != EOF && !isspace(c) && c != '>') { c = cget(); // scan name to delimiting character } attr = NewUTF8STR(addr(tp), this->cp - tp - 1); if (nil == attr) { [self _parseError: @"invalid character in declaration attr" code: NSXMLParserInvalidCharacterError]; RELEASE(decl); RELEASE(name); return; } #if 1 || EXTRA_DEBUG NSLog(@"attr=%@ - %02x %c", attr, c, isprint(c)?c: ' '); #endif while (isspace(c)) { c = cget(); } tp = this->cp - 1; while (c != EOF && !isspace(c) && c != '>') { c = cget(); // scan name to delimiting character } type = NewUTF8STR(addr(tp), this->cp - tp - 1); if (nil == type) { [self _parseError: @"invalid character in declaration type" code: NSXMLParserInvalidCharacterError]; RELEASE(name); RELEASE(decl); RELEASE(attr); return; } #if 1 || EXTRA_DEBUG NSLog(@"type=%@ - %02x %c", type, c, isprint(c)?c: ' '); #endif /* OSX reports a CDATA type as an empty string. */ if ([type isEqualToString: @"CDATA"]) { RELEASE(type); type = @""; } while (isspace(c)) { c = cget(); } /* OSX reports a default as nil if it's not a quoted string. */ if (c == '#') { while (c != EOF && !isspace(c) && c != '>') { c = cget(); } def = nil; } else { def = [self _newQarg]; c = cget(); // get character behind qarg value } while (isspace(c)) { c = cget(); } /* Record default value (if any) for this attribute. */ if (nil != def) { [d setObject: def forKey: attr]; } if ([_del respondsToSelector: @selector(parser:foundAttributeDeclarationWithName:forElement:type:defaultValue:)]) { [_del parser: self foundAttributeDeclarationWithName: attr forElement: name type: type defaultValue: def]; } RELEASE(attr); RELEASE(type); RELEASE(def); } } else if ([decl isEqualToString: @"DOCTYPE"]) { #if EXTRA_DEBUG NSLog(@"_processDeclaration <%@%@ %@>", flag?@"/": @"", decl, name); #endif while (isspace(c)) { c = cget(); } while (c != EOF && c != '[' && c != '>') { c = cget(); } if (c == '[') { /* Got inline docuent declaration. Scan to ']' */ while (c != EOF && c != ']') { if (c == '<') { c = cget(); if (c == '!') { [self _processDeclaration]; c = cget(); } } else { c = cget(); } } /* Skip to trailing '>' in DOCTYPE declration. */ if (c == ']') { while (c != EOF && c != '>') { c = cget(); } } } } else if ([decl isEqualToString: @"ELEMENT"]) { #if EXTRA_DEBUG NSLog(@"_processDeclaration <%@%@ %@>", flag?@"/": @"", decl, name); #endif while (c != EOF && c != '>') { c = cget(); } if ([_del respondsToSelector: @selector(parser:foundElementDeclarationWithName:model:)]) { [_del parser: self foundElementDeclarationWithName: name model: @""]; } } else if ([decl isEqualToString: @"ENTITY"]) { #if EXTRA_DEBUG NSLog(@"_processDeclaration <%@%@ %@>", flag?@"/": @"", decl, name); #endif while (c != EOF && c != '>') { c = cget(); } } RELEASE(decl); RELEASE(name); } - (void) _processTag: (NSString *)tag isEnd: (BOOL)flag withAttributes: (NSDictionary *)attributes { if (this->acceptHTML) { tag = [tag lowercaseString]; // not case sensitive } if (!flag) { if (NO == this->hasStarted) { #if EXTRA_DEBUG NSLog(@"parserDidStartDocument: "); #endif this->hasStarted = YES; if ([_del respondsToSelector: @selector(parserDidStartDocument:)]) { [_del parserDidStartDocument: self]; } } if ([tag isEqualToString: @"?xml"]) { return; } else if ([tag hasPrefix: @"?"]) { #if EXTRA_DEBUG NSLog(@"_processTag <%@%@ %@>", flag?@"/": @"", tag, attributes); #endif // parser: foundProcessingInstructionWithTarget: data: return; } else { NSMutableDictionary *ns = nil; NSMutableDictionary *attr = nil; NSEnumerator *enumerator = [attributes keyEnumerator]; NSString *k; NSString *uri; NSString *qualified; this->hasElement = YES; while ((k = [enumerator nextObject]) != nil) { NSString *prefix = nil; if ([k isEqualToString: @"xmlns"] == YES) { prefix = @""; } else if ([k hasPrefix: @"xmlns:"] == YES) { prefix = [k substringFromIndex: 6]; } if (prefix != nil) { if (nil == ns) { ns = [NSMutableDictionary new]; if (this->shouldProcessNamespaces) { attr = [attributes mutableCopy]; } } uri = [attributes objectForKey: k]; [ns setObject: uri forKey: prefix]; if (attr != nil) { [attr removeObjectForKey: k]; } if (this->shouldReportNamespacePrefixes) { if (this->didStartMappingPrefix != 0) { (*this->didStartMappingPrefix)(_del, didStartMappingPrefixSel, self, prefix, uri); } } } } if ([attr count] > 0) { attributes = attr; } else if (nil == attributes) { attr = [NSMutableDictionary new]; attributes = attr; } [this->tagPath addObject: tag]; [this->namespaces addObject: ((ns == nil) ? (id)null : (id)ns)]; if (this->didStartElement != 0) { qualified = tag; if (this->shouldProcessNamespaces) { NSRange r; NSString *p = @""; r = [tag rangeOfString: @":" options: NSLiteralSearch]; if (r.length > 0) { p = [tag substringToIndex: r.location]; tag = [tag substringFromIndex: NSMaxRange(r)]; } uri = [self _uriForPrefix: p]; } else { uri = @""; } (*this->didStartElement)(_del, didStartElementSel, self, tag, uri, qualified, attributes); } TEST_RELEASE(ns); TEST_RELEASE(attr); } } else { // closing tag if (this->acceptHTML) { // lazily close any missing tags on stack while ([this->tagPath count] > 0 && ![[this->tagPath lastObject] isEqualToString: tag]) { [self _closeLastTag]; } if ([this->tagPath count] == 0) { return; // ignore closing tag without matching open... } } else if (![[this->tagPath lastObject] isEqualToString: tag]) { [self _parseError: [NSString stringWithFormat: @"tag nesting error ( expected, found)", [this->tagPath lastObject], tag] code: NSXMLParserNotWellBalancedError]; return; } [self _closeLastTag]; } } - (NSString*) _newEntity: (const unsigned char *)ep length: (int)len { NSString *entity; if (*ep == '#') { if (len < 8) { uint32_t val; char buf[8]; memcpy(buf, ep + 1, len - 1); buf[len - 1] = '\0'; // &#ddd; or &#xhh; if (sscanf(buf, "x%x;", &val) || sscanf(buf, "%d;", &val)) { // &#xhh; hex value or &ddd; decimal value if (val > 0xffff) { unichar buf[2]; /* Convert codepoint outside base plane to surrogate pair */ val -= 0x010000; buf[0] = (val / 0x400) + 0xd800; buf[1] = (val % 0x400) + 0xdc00; return [[NSString alloc] initWithCharacters: buf length: 2]; } else { unichar c = (unichar)val; return [[NSString alloc] initWithCharacters: &c length: 1]; } } } } else { // the five predefined entities if (len == 3 && strncmp((char *)ep, "amp", len) == 0) { return @"&"; } else if (len == 2 && strncmp((char *)ep, "lt", len) == 0) { return @"<"; } else if (len == 2 && strncmp((char *)ep, "gt", len) == 0) { return @">"; } else if (len == 4 && strncmp((char *)ep, "quot", len) == 0) { return @"\""; } else if (len == 4 && strncmp((char *)ep, "apos", len) == 0) { return @"'"; } } entity = NewUTF8STR(ep, len); if (nil == entity) { [self _parseError: @"invalid character in entity name" code: NSXMLParserInvalidCharacterError]; } if (this->shouldResolveExternalEntities) { #if 1 NSLog(@"NSXMLParser: unrecognized entity: &%@;", entity); #endif // entity=[entitiesTable objectForKey: entity]; // look up string in entity translation table if (nil == entity) { entity = @"&??;"; // unknown entity } } else { entity = @""; // not resolved } return entity; } - (BOOL) _parseEntity: (NSString**)result { int c; NSUInteger ep = this->cp; // should be position behind & int len; NSString *entity; if (0 == result) result = &entity; do { c = cget(); } while (c != EOF && c != '<' && c != ';'); if (c != ';') { // invalid sequence - end of file or missing ; before next tag return NO; } len = this->cp - ep - 1; *result = [self _newEntity: addr(ep) length: len]; if (&entity == result) { RELEASE(*result); // Won't be used } return YES; } - (NSString *) _newQarg { // get argument (might be quoted) NSUInteger ap = --this->cp; // argument start pointer int c = cget(); // refetch first character int len; BOOL containsEntity = NO; NSString *qs; #if EXTRA_DEBUG NSLog(@"_newQarg: %02x %c", c, isprint(c)?c: ' '); #endif if (c == '\"') { do { c = cget(); if (c == EOF) { return nil; // unterminated! } if ('&' == c) { containsEntity = YES; } } while (c != '\"'); len = this->cp - ap - 2; ap++; } else if (c == '\'') { do { c = cget(); if (c == EOF) { return nil; // unterminated! } if ('&' == c) { containsEntity = YES; } } while (c != '\''); len = this->cp - ap - 2; ap++; } else { /* strict XML requires quoting (?) if (!this->acceptHTML) ; */ while (!isspace(c) && c != '>' && c != '/' && c != '?' && c != '=' && c != EOF) { if ('&' == c) { containsEntity = YES; } c = cget(); } this->cp--; // go back to terminating character len = this->cp - ap; } if (YES == containsEntity) { NSString *seg; NSMutableString *m; const unsigned char *start = addr(ap); const unsigned char *end = start + len; const unsigned char *ptr = start; m = [[NSMutableString alloc] initWithCapacity: len]; while (ptr < end) { while (ptr < end && *ptr != '&') { ptr++; } if (ptr > start) { seg = NewUTF8STR(start, ptr - start); if (nil == seg) { RELEASE(m); [self _parseError: @"invalid character in quoted string" code: NSXMLParserInvalidCharacterError]; return nil; } [m appendString: seg]; RELEASE(seg); start = ptr; } else { while (ptr < end && *ptr != ';') { ptr++; } seg = [self _newEntity: start + 1 length: ptr - start - 1]; [m appendString: seg]; RELEASE(seg); if (ptr < end) { ptr++; // Step past trailing semicolon } start = ptr; } } return m; } qs = NewUTF8STR(addr(ap), len); if (nil == qs) { [self _parseError: @"invalid character in quoted string" code: NSXMLParserInvalidCharacterError]; return nil; } return qs; } - (BOOL) parse { // read XML (or HTML) file NSUInteger vp = this->cp; // value position int c; /* Start by accumulating ignorable whitespace. */ this->ignorable = YES; this->whitespace = YES; c = cget(); // get first character while (!this->abort) { #if EXTRA_DEBUG NSLog(@"_nextelement %02x %c", c, isprint(c)?c: ' '); #endif switch (c) { case '\r': this->column = 0; break; case '\n': this->line++; this->column = 0; break; case '<': /* Whitespace immediately before an element is always ignorable. */ this->ignorable = YES; /* Fall through to push out data */ case EOF: case '&': { /* push out any characters that have been collected so far */ if (this->cp - vp > 1) { NSUInteger p; NSString *s; p = this->cp - 1; if (YES == this->ignorable) { if (YES == this->whitespace) { p = vp; // all whitespace } else { /* step through trailing whitespace (if any) */ while (p > vp && isspace(addr(p)[-1])) { p--; } } } if (YES == this->hasElement) { if (p - vp > 0) { if (this->foundCharacters != 0) { s = NewUTF8STR(addr(vp), p - vp); if (nil == s) { [self _parseError: @"invalid character data" code: NSXMLParserInvalidCharacterError]; continue; } else { /* Process this data as characters */ (*this->foundCharacters)(_del, foundCharactersSel, self, s); RELEASE(s); } } } if (p < this->cp - 1) { if (this->foundIgnorable != 0) { s = NewUTF8STR(addr(p), this->cp - p - 1); if (nil == s) { [self _parseError: @"invalid whitespace data" code: NSXMLParserInvalidCharacterError]; } else { /* Process data as ignorable whitespace */ (*this->foundIgnorable)(_del, foundIgnorableSel, self, s); RELEASE(s); } } else if (this->foundCharacters != 0) { s = NewUTF8STR(addr(p), this->cp - p - 1); if (nil == s) { [self _parseError: @"invalid character data" code: NSXMLParserInvalidCharacterError]; } else { /* Process data as characters */ (*this->foundCharacters)(_del, foundCharactersSel, self, s); RELEASE(s); } } } } vp = this->cp; } } } switch (c) { default: if (YES == this->whitespace && !isspace(c)) { if (YES == this->ignorable && this->cp - vp > 1) { NSString *s; /* We have accumulated ignorable whitespace ... * push it out. */ if (this->foundIgnorable != 0) { s = NewUTF8STR(addr(vp), this->cp - vp - 1); if (nil == s) { [self _parseError: @"invalid whitespace data" code: NSXMLParserInvalidCharacterError]; } else { (*this->foundIgnorable)(_del, foundIgnorableSel, self, s); RELEASE(s); } } else if (this->foundCharacters != 0) { s = NewUTF8STR(addr(vp), this->cp - vp - 1); if (nil == s) { [self _parseError: @"invalid character data" code: NSXMLParserInvalidCharacterError]; } else { (*this->foundCharacters)(_del, foundCharactersSel, self, s); RELEASE(s); } } vp = this->cp - 1; } /* We have read non-space data, so whitespace is no longer * ignorable, and the buffer no longer contains only space. */ this->ignorable = NO; this->whitespace = NO; } c = cget(); // just collect until we push out (again) continue; case EOF: { if ([this->tagPath count] != 0) { if (!this->acceptHTML) { /* strict XML nesting error */ return [self _parseError: @"unexpected end of file" code: NSXMLParserNotWellBalancedError]; } while ([this->tagPath count] > 0) { // lazily close all open tags if (this->didEndElement != 0) { (*this->didEndElement)(_del, didEndElementSel, self, [this->tagPath lastObject], nil, nil); } [this->tagPath removeLastObject]; // pop from stack } } #if EXTRA_DEBUG NSLog(@"parserDidEndDocument: "); #endif if ([_del respondsToSelector: @selector(parserDidEndDocument:)]) { [_del parserDidEndDocument: self]; } return YES; } case '&': { NSString *entity; /* After any entity, whitespace is no longer ignorable, but * we will have an empty buffer to accumulate it. */ this->ignorable = NO; this->whitespace = YES; if ([self _parseEntity: &entity] == NO) { return [self _parseError: @"empty entity name" code: NSXMLParserEntityRefAtEOFError]; } if (this->foundCharacters != 0) { (*this->foundCharacters)(_del, foundCharactersSel, self, entity); } RELEASE(entity); vp = this->cp; // next value sequence starts here c = cget(); // first character behind ; continue; } case '<': { NSString *tag; NSMutableDictionary *attributes; NSString *arg; NSUInteger tp = this->cp; // tag position NSUInteger sp = tp - 1; // Open angle bracket /* After processing a tag, whitespace will be ignorable and * we can start accumulating it in our buffer. */ this->ignorable = YES; this->whitespace = YES; if (this->cp < this->cend-3 && strncmp((char *)addr(this->cp), "!--", 3) == 0) { /* start of comment skip all characters until "-->" */ this->cp += 3; tp = this->cp; while (this->cp < this->cend-3 && strncmp((char *)addr(this->cp), "-->", 3) != 0) { this->cp++; // search } if (this->foundComment != 0) { NSString *c = NewUTF8STR(addr(tp), this->cp - tp); if (nil == c) { [self _parseError: @"invalid comment data" code: NSXMLParserInvalidCharacterError]; } else { (*this->foundComment)(_del, foundCommentSel, self, c); RELEASE(c); } } this->cp += 3; // might go beyond cend ... ok vp = this->cp; // value might continue c = cget(); // get first character after comment continue; } if (this->cp < this->cend-8 && strncmp((char *)addr(this->cp), "![CDATA[", 8) == 0) { /* start of CDATA skip all characters until "]>" */ this->cp += 8; tp = this->cp; while (this->cp < this->cend-3 && strncmp((char *)addr(this->cp), "]]>", 3) != 0) { this->cp++; // search } if (this->foundCDATA != 0) { NSData *d; d = [[NSData alloc] initWithBytes: addr(tp) length: this->cp - tp]; (*this->foundCDATA)(_del, foundCDATASel, self, d); RELEASE(d); } this->cp += 3; // might go beyond cend ... ok vp = this->cp; // value might continue c = cget(); // get first character after CDATA continue; } c = cget(); // get first character of tag if (c == '/') { c = cget(); // closing tag should process this tag in a special * way so that e.g. is read * as a single tag! * to do this properly, we need a notion of comments * and quoted string constants... */ } else if (c == '!') { /* declaration cp; // prepare for next value c = cget(); // fetch next character continue; } while (c != EOF && !isspace(c) && c != '>' && c != '/' && c != '?') { c = cget(); // scan tag until we find a delimiting character } if (*addr(tp) == '/') { tag = NewUTF8STR(addr(tp + 1), this->cp - tp - 2); } else { tag = NewUTF8STR(addr(tp), this->cp - tp - 1); } if (nil == tag) { [self _parseError: @"invalid character in tag" code: NSXMLParserInvalidCharacterError]; } #if EXTRA_DEBUG NSLog(@"tag=%@ - %02x %c", tag, c, isprint(c)?c: ' '); #endif /* Create an attributes dictionary for this tag, * using default values if available. */ attributes = [[this->defaults objectForKey: tag] mutableCopy]; if (nil == attributes) { attributes = [[NSMutableDictionary alloc] initWithCapacity: 5]; } while (isspace(c)) { c = cget(); } while (c != EOF) { if (c == '/' && *addr(tp) != '/') { // appears to be a /> c = cget(); if (c != '>') { RELEASE(attributes); RELEASE(tag); return [self _parseError: @"" code: NSXMLParserGTRequiredError]; } [self _processTag: tag isEnd: NO withAttributes: attributes]; if (NO == this->abort) { [self _processTag: tag isEnd: YES withAttributes: nil]; } break; } if (c == '?' && *addr(tp) == '?') { // appears to be a ?> c = cget(); if (c != '>') { RELEASE(attributes); RELEASE(tag); return [self _parseError: @"" code: NSXMLParserGTRequiredError]; } /* If this is the preamble" code: NSXMLParserDocumentStartError]; } [self _processTag: tag isEnd: NO withAttributes: attributes]; // single break; // done } // this should also allow for line break and tab while (isspace(c)) { c = cget(); } if (c == '>') { if (NO == this->abort) { [self _processTag: tag isEnd: (*addr(tp) == '/') withAttributes: attributes]; } break; } /* get next argument (eats up to /, ?, >, =, space) */ arg = [self _newQarg]; #if EXTRA_DEBUG NSLog(@"arg=%@", arg); #endif if (!this->acceptHTML && [arg length] == 0) { RELEASE(arg); RELEASE(tag); RELEASE(attributes); return [self _parseError: @"empty attribute name" code: NSXMLParserAttributeNotStartedError]; } c = cget(); while (isspace(c)) { c = cget(); } if (c == '=') { NSString *val; // explicit assignment c = cget(); // skip = while (isspace(c)) { c = cget(); } val = [self _newQarg]; [attributes setObject: val forKey: arg]; RELEASE(val); c = cget(); // get character behind qarg value while (isspace(c)) { c = cget(); } } else // implicit { [attributes setObject: @"" forKey: arg]; } RELEASE(arg); } RELEASE(attributes); RELEASE(tag); vp = this->cp; // prepare for next value c = cget(); // skip > and fetch next character } } } return [self _parseError: @"aborted" code: NSXMLParserDelegateAbortedParseError]; } - (BOOL) acceptsHTML { return this->acceptHTML; } - (BOOL) shouldProcessNamespaces { return this->shouldProcessNamespaces; } - (BOOL) shouldReportNamespacePrefixes { return this->shouldReportNamespacePrefixes; } - (BOOL) shouldResolveExternalEntities { return this->shouldResolveExternalEntities; } - (void) setShouldProcessNamespaces: (BOOL)aFlag { this->shouldProcessNamespaces = aFlag; } - (void) setShouldReportNamespacePrefixes: (BOOL)aFlag { this->shouldReportNamespacePrefixes = aFlag; } - (void) setShouldResolveExternalEntities: (BOOL)aFlag { this->shouldResolveExternalEntities = aFlag; } - (void) _setAcceptHTML: (BOOL) flag { this->acceptHTML = flag; } - (NSString *) publicID { return [self notImplemented: _cmd]; } - (NSString *) systemID { return [self notImplemented: _cmd]; } @end @implementation NSObject (NSXMLParserDelegateEventAdditions) - (NSData*) parser: (NSXMLParser*)aParser resolveExternalEntityName: (NSString*)aName systemID: (NSString*)aSystemID { return nil; } - (void) parser: (NSXMLParser*)aParser didEndElement: (NSString*)anElementName namespaceURI: (NSString*)aNamespaceURI qualifiedName: (NSString*)aQualifierName { } - (void) parser: (NSXMLParser*)aParser didEndMappingPrefix: (NSString*)aPrefix { } - (void) parser: (NSXMLParser*)aParser didStartElement: (NSString*)anElementName namespaceURI: (NSString*)aNamespaceURI qualifiedName: (NSString*)aQualifierName attributes: (NSDictionary*)anAttributeDict { } - (void) parser: (NSXMLParser*)aParser didStartMappingPrefix: (NSString*)aPrefix toURI: (NSString*)aNamespaceURI { } - (void) parser: (NSXMLParser*)aParser foundAttributeDeclarationWithName: (NSString*)anAttributeName forElement: (NSString*)anElementName type: (NSString*)aType defaultValue: (NSString*)aDefaultValue { } - (void) parser: (NSXMLParser*)aParser foundCDATA: (NSData*)aBlock { } - (void) parser: (NSXMLParser*)aParser foundCharacters: (NSString*)aString { } - (void) parser: (NSXMLParser*)aParser foundComment: (NSString*)aComment { } - (void) parser: (NSXMLParser*)aParser foundElementDeclarationWithName: (NSString*)anElementName model: (NSString*)aModel { } - (void) parser: (NSXMLParser*)aParser foundExternalEntityDeclarationWithName: (NSString*)aName publicID: (NSString*)aPublicID systemID: (NSString*)aSystemID { } - (void) parser: (NSXMLParser*)aParser foundIgnorableWhitespace: (NSString*)aWhitespaceString { } - (void) parser: (NSXMLParser*)aParser foundInternalEntityDeclarationWithName: (NSString*)aName value: (NSString*)aValue { } - (void) parser: (NSXMLParser*)aParser foundNotationDeclarationWithName: (NSString*)aName publicID: (NSString*)aPublicID systemID: (NSString*)aSystemID { } - (void) parser: (NSXMLParser*)aParser foundProcessingInstructionWithTarget: (NSString*)aTarget data: (NSString*)aData { } - (void) parser: (NSXMLParser*)aParser foundUnparsedEntityDeclarationWithName: (NSString*)aName publicID: (NSString*)aPublicID systemID: (NSString*)aSystemID notationName: (NSString*)aNotationName { } - (void) parser: (NSXMLParser*)aParser parseErrorOccurred: (NSError*)anError { } - (void) parser: (NSXMLParser*)aParser validationErrorOccurred: (NSError*)anError { } - (void) parserDidEndDocument: (NSXMLParser*)aParser { } - (void) parserDidStartDocument: (NSXMLParser*)aParser { } @end #if defined(HAVE_LIBXML) #include @interface NSXMLSAXHandler : GSSAXHandler { @public id _delegate; // Not retained id _owner; // Not retained NSError *_lastError; BOOL _shouldProcessNamespaces; BOOL _shouldReportNamespacePrefixes; BOOL _shouldResolveExternalEntities; NSMutableArray *_namespaces; } - (void) _setOwner: (id)owner; @end @implementation NSXMLSAXHandler + (void) initialize { GSMakeWeakPointer(self, "_delegate"); GSMakeWeakPointer(self, "_owner"); } - (void) dealloc { DESTROY(_namespaces); DESTROY(_lastError); [super dealloc]; } - (id) init { if ((self = [super init]) != nil) { _namespaces = [NSMutableArray new]; } return self; } - (void) endDocument { [_delegate parserDidEndDocument: _owner]; } - (void) startDocument { [_delegate parserDidStartDocument: _owner]; } - (void) startElement: (NSString*)elementName prefix: (NSString*)prefix href: (NSString*)href attributes: (NSMutableDictionary*)elementAttributes namespaces: (NSMutableDictionary*)elementNamespaces { NSString *qName = elementName; if ([prefix length] > 0) { qName = [NSString stringWithFormat: @"%@:%@", prefix, qName]; } if (elementAttributes == nil) { elementAttributes = [NSMutableDictionary dictionary]; } if ([elementNamespaces count] > 0) { [_namespaces addObject: [elementNamespaces allKeys]]; if (_shouldReportNamespacePrefixes) { NSEnumerator *e = [elementNamespaces keyEnumerator]; NSString *k; while ((k = [e nextObject]) != nil) { NSString *v = [elementNamespaces objectForKey: k]; [_delegate parser: _owner didStartMappingPrefix: k toURI: v]; } } } else { [_namespaces addObject: null]; } if (_shouldProcessNamespaces) { [_delegate parser: _owner didStartElement: elementName namespaceURI: (nil == href) ? @"" : href qualifiedName: qName attributes: elementAttributes]; } else { /* When we are not handling namespaces specially, any namespaces * should appear as attributes of the element. */ if ([elementNamespaces count] > 0) { NSEnumerator *e = [elementNamespaces keyEnumerator]; NSString *k; while ((k = [e nextObject]) != nil) { NSString *v = [elementNamespaces objectForKey: k]; if ([k length] == 0) { [elementAttributes setObject: v forKey: @"xmlns"]; } else { k = [@"xmlns:" stringByAppendingString: k]; [elementAttributes setObject: v forKey: k]; } } } [_delegate parser: _owner didStartElement: qName namespaceURI: nil qualifiedName: nil attributes: elementAttributes]; } } - (void) endElement: (NSString*)elementName prefix: (NSString*)prefix href: (NSString*)href { NSString *qName = elementName; if ([prefix length] > 0) { qName = [NSString stringWithFormat: @"%@:%@", prefix, qName]; } if (_shouldProcessNamespaces) { [_delegate parser: _owner didEndElement: elementName namespaceURI: (nil == href) ? @"" : href qualifiedName: qName]; } else { [_delegate parser: _owner didEndElement: qName namespaceURI: nil qualifiedName: nil]; } if (_shouldReportNamespacePrefixes) { id o = [_namespaces lastObject]; if (o != (id)null) { NSEnumerator *e = [(NSArray*)o objectEnumerator]; NSString *k; while ((k = [e nextObject]) != nil) { [_delegate parser: _owner didEndMappingPrefix: k]; } } } [_namespaces removeLastObject]; } - (void) attribute: (NSString*) name value: (NSString*)value { // FIXME } - (void) characters: (NSString*)string { [_delegate parser: _owner foundCharacters: string]; } - (void) ignoreWhitespace: (NSString*) ch { [_delegate parser: _owner foundIgnorableWhitespace: ch]; } - (void) processInstruction: (NSString*)targetName data: (NSString*)PIdata { [_delegate parser: _owner foundProcessingInstructionWithTarget: targetName data: PIdata]; } - (void) comment: (NSString*) value { [_delegate parser: _owner foundComment: value]; } - (void) cdataBlock: (NSData*)value { [_delegate parser: _owner foundCDATA: value]; } /** * Called to return the filename from which an entity should be loaded. */ - (NSString*) loadEntity: (NSString*)publicId at: (NSString*)location { return nil; } /** * An old global namespace has been parsed. */ - (void) namespaceDecl: (NSString*)name href: (NSString*)href prefix: (NSString*)prefix { } - (void) notationDecl: (NSString*)name public: (NSString*)publicId system: (NSString*)systemId { [_delegate parser: _owner foundNotationDeclarationWithName: name publicID: publicId systemID: systemId]; } /** * An entity definition has been parsed. */ - (void) entityDecl: (NSString*)name type: (NSInteger)type public: (NSString*)publicId system: (NSString*)systemId content: (NSString*)content { } - (void) attributeDecl: (NSString*)nameElement name: (NSString*)name type: (NSInteger)type typeDefValue: (NSInteger)defType defaultValue: (NSString*)value { [_delegate parser: _owner foundAttributeDeclarationWithName: name forElement: nameElement type: @"" // FIXME defaultValue: value]; } - (void) elementDecl: (NSString*)name type: (NSInteger)type { [_delegate parser: _owner foundElementDeclarationWithName: name model: @""]; // FIXME } /** * What to do when an unparsed entity declaration is parsed. */ - (void) unparsedEntityDecl: (NSString*)name public: (NSString*)publicId system: (NSString*)systemId notationName: (NSString*)notation { } /** * Called when an entity reference is detected. */ - (void) reference: (NSString*) name { } /** * An old global namespace has been parsed. */ - (void) globalNamespace: (NSString*)name href: (NSString*)href prefix: (NSString*)prefix { } /** * Called when a warning message needs to be output. */ - (void) warning: (NSString*)e { GSPrintf(stderr, @"%@", e); } - (void) error: (NSString*)e { NSError *error; NSDictionary *d; d = [NSDictionary dictionaryWithObjectsAndKeys: e, NSLocalizedDescriptionKey, nil]; error = [NSError errorWithDomain: NSXMLParserErrorDomain code: 0 userInfo: d]; ASSIGN(_lastError, error); [_delegate parser: _owner parseErrorOccurred: error]; } - (void) fatalError: (NSString*)e { [self error: e]; } - (void) warning: (NSString*)e colNumber: (NSInteger)colNumber lineNumber: (NSInteger)lineNumber { e = [NSString stringWithFormat: @"at line: %d column: %d ... %@", (int)lineNumber, (int)colNumber, e]; [self warning: e]; } - (void) error: (NSString*)e colNumber: (NSInteger)colNumber lineNumber: (NSInteger)lineNumber { e = [NSString stringWithFormat: @"at line: %d column: %d ... %@", (int)lineNumber, (int)colNumber, e]; [self error: e]; } - (void) fatalError: (NSString*)e colNumber: (NSInteger)colNumber lineNumber: (NSInteger)lineNumber { e = [NSString stringWithFormat: @"at line: %d column: %d ... %@", (int)lineNumber, (int)colNumber, e]; [self fatalError: e]; } - (NSInteger) hasInternalSubset { return 0; } - (BOOL) internalSubset: (NSString*)name externalID: (NSString*)externalID systemID: (NSString*)systemID { return NO; } - (NSInteger) hasExternalSubset { return 0; } - (BOOL) externalSubset: (NSString*)name externalID: (NSString*)externalID systemID: (NSString*)systemID { return NO; } - (void*) getEntity: (NSString*)name { return 0; } - (void*) getParameterEntity: (NSString*)name { return 0; } - (void) _setOwner: (id)owner { _owner = owner; } @end @implementation GSStrictXMLParser + (void) initialize { if (null == nil) { null = RETAIN([NSNull null]); RELEASE([NSObject leakAt: &null]); } } #define myParser ((GSXMLParser*)_parser) #define myHandler ((NSXMLSAXHandler*)_handler) - (void) abortParsing { NSDictionary *d; NSString *e; NSError *error; e = @"Parsing aborted"; d = [NSDictionary dictionaryWithObjectsAndKeys: e, NSLocalizedDescriptionKey, nil]; error = [NSError errorWithDomain: NSXMLParserErrorDomain code: 0 userInfo: d]; ASSIGN(myHandler->_lastError, error); [myHandler->_delegate parser: myHandler->_owner parseErrorOccurred: error]; [myParser abortParsing]; } - (void) dealloc { DESTROY(_parser); DESTROY(_handler); [super dealloc]; } - (id) delegate { return myHandler->_delegate; } - (id) initWithContentsOfURL: (NSURL*)anURL { _handler = [NSXMLSAXHandler new]; [myHandler _setOwner: self]; _parser = [[GSXMLParser alloc] initWithSAXHandler: myHandler withContentsOfURL: anURL]; [(GSXMLParser*)_parser substituteEntities: YES]; return self; } - (id) initWithData: (NSData*)data { _handler = [NSXMLSAXHandler new]; [myHandler _setOwner: self]; _parser = [[GSXMLParser alloc] initWithSAXHandler: myHandler withData: data]; [(GSXMLParser*)_parser substituteEntities: YES]; return self; } - (id) initWithStream: (NSInputStream*)stream { _handler = [NSXMLSAXHandler new]; [myHandler _setOwner: self]; _parser = [[GSXMLParser alloc] initWithSAXHandler: myHandler withInputStream: stream]; [(GSXMLParser*)_parser substituteEntities: YES]; return self; } - (BOOL) parse { BOOL result; result = [[myHandler parser] parse]; return result; } - (NSError*) parserError { return (nil == myHandler) ? nil : myHandler->_lastError; } - (void) setDelegate: (id)delegate { myHandler->_delegate = delegate; } - (void) setShouldProcessNamespaces: (BOOL)aFlag { myHandler->_shouldProcessNamespaces = aFlag; } - (void) setShouldReportNamespacePrefixes: (BOOL)aFlag { myHandler->_shouldReportNamespacePrefixes = aFlag; } - (void) setShouldResolveExternalEntities: (BOOL)aFlag { myHandler->_shouldResolveExternalEntities = aFlag; } - (BOOL) shouldProcessNamespaces { return myHandler->_shouldProcessNamespaces; } - (BOOL) shouldReportNamespacePrefixes { return myHandler->_shouldReportNamespacePrefixes; } - (BOOL) shouldResolveExternalEntities { return myHandler->_shouldResolveExternalEntities; } - (NSInteger) columnNumber { return [myParser columnNumber]; } - (NSInteger) lineNumber { return [myParser lineNumber]; } - (NSString*) publicID { return [myParser publicID]; } - (NSString*) systemID { return [myParser systemID]; } @end #else @implementation GSStrictXMLParser @end #endif gnustep-base-1.29.0/Source/NSXMLPrivate.h000066400000000000000000000165561435650067400200740ustar00rootroot00000000000000/* Private header for libxml2 wrapping components Copyright (C) 2009 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: Februrary 2009 This file is part of the GNUstep Base Library. 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 3 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 USA. */ #ifndef _INCLUDED_NSXMLPRIVATE_H #define _INCLUDED_NSXMLPRIVATE_H #import "common.h" #ifdef HAVE_LIBXML /* Avoid problems on systems where the xml headers use 'id' */ #define id GSXMLID /* libxml headers */ #include #include #include #include #include #include #include #include #include #ifdef HAVE_LIBXSLT #include #include #include #include #endif /* HAVE_LIBXSLT */ #undef id #endif /* HAVE_LIBXML */ #define EXPOSE_NSXMLDTD_IVARS 1 #define EXPOSE_NSXMLDTDNode_IVARS 1 #define EXPOSE_NSXMLDocument_IVARS 1 #define EXPOSE_NSXMLElement_IVARS 1 #define EXPOSE_NSXMLNode_IVARS 1 /* * Macro to cast string to correct type for libxml2 */ #define XMLSTRING(X) ((const unsigned char*)[X UTF8String]) inline static unsigned char *XMLStringCopy(NSString *source) { char *xmlstr; unsigned int len; len = [source maximumLengthOfBytesUsingEncoding:NSUTF8StringEncoding] + 1; if (len == 0) return NULL; xmlstr = malloc(len); [source getCString:xmlstr maxLength:len encoding:NSUTF8StringEncoding]; return (unsigned char *)xmlstr; } inline static NSString* StringFromXMLStringPtr(const unsigned char *bytes) { NSString *str; unsigned int length; if (bytes == NULL) return @""; length = strlen((char *)bytes); str = [[NSString alloc] initWithBytes: bytes length: length encoding: NSUTF8StringEncoding]; return AUTORELEASE(str); } inline static NSString* StringFromXMLString(const unsigned char *bytes, unsigned length) { NSString *str; if (bytes == NULL) return @""; str = [[NSString alloc] initWithBytes: bytes length: length encoding: NSUTF8StringEncoding]; return AUTORELEASE(str); } #if defined(HAVE_LIBXML) #define GS_XMLNODETYPE \ union\ {\ xmlDoc *doc;\ xmlDtd *dtd;\ xmlEntity *entity;\ xmlNode *node;\ } #else #define GS_XMLNODETYPE void* #endif /* Instance variables for NSXMLNode. This macro needs to be defined before * the NSXMLNode.h header is imported and before GSInternal.h is imported. * * The 'kind' tells us what sort of node this is. * The 'node' points to the underlying libxml2 node structure. * The 'options' field is a bitmask of options for this node. * The 'objectValue' is the object value set for the node. * The 'subNodes' array is used to retain the objects pointed to by subnodes. * * When we create an Objective-C object for a node we also create objects * for all parents up to the root object. (Reusing existing once as we find * them in the _private points of parent nodes) * This adds the object to the subnode array of the parent object, retaining * the object in this process. * This means a document object will retain all the objects we have created * for its node tree, but we don't have to create all these objects at once. * When we remove an object from its parent we always call the detach method. * Here we unlink the libxml2 node and remove the object from its parent's * subnode array, This will release the object. * When an object gets deallocated it detaches all the subnodes, releasing * them in the process and then it frees the node. That way each object takes * care of freeing its own node, but nodes that don't have objects attached * to them will get freed when their parent object (e.g. the NSXMLDocument) * gets deallocated. * For namespace nodes special rules apply as they don't have a parent pointer. * * URI is probably not needed at all ... I'm not sure */ #define GS_NSXMLNode_IVARS \ NSUInteger kind; \ GS_XMLNODETYPE node; \ NSUInteger options; \ id objectValue; \ NSMutableArray *subNodes; /* When using the non-fragile ABI, the instance variables are exposed to the * compiler within the class declaration, so we don't need to incorporate * superclass variables into the subclass declaration. * But with the fragile ABI we need to allocate a single internal structure * containing the private variables for both the subclass and the superclass. */ #if GS_NONFRAGILE #define SUPERIVARS(X) #else #define SUPERIVARS(X) X #endif /* Instance variables for NSXMLDocument with/without the instance * variable 'inherited' from NSXMLNode. * This macro needs to be defined before the NSXMLDocument.h header * is imported and before GSInternal.h is imported. */ #define GS_NSXMLDocument_IVARS SUPERIVARS(GS_NSXMLNode_IVARS) \ NSString *MIMEType; \ NSInteger contentKind; \ /* Instance variables for NSXMLDTD with/without the instance * variable 'inherited' from NSXMLNode. * This macro needs to be defined before the NSXMLDTD.h header * is imported and before GSInternal.h is imported. */ #define GS_NSXMLDTD_IVARS SUPERIVARS(GS_NSXMLNode_IVARS) /* Instance variables for NSXMLDTDNode with/without the instance * variable 'inherited' from NSXMLNode. * This macro needs to be defined before the NSXMLDTDNode.h header * is imported and before GSInternal.h is imported. */ #define GS_NSXMLDTDNode_IVARS SUPERIVARS(GS_NSXMLNode_IVARS) \ NSUInteger DTDKind; \ /* Instance variables for NSXMLElement with/without the instance * variable 'inherited' from NSXMLNode. * This macro needs to be defined before the NSXMLElement.h header * is imported and before GSInternal.h is imported. */ #define GS_NSXMLElement_IVARS SUPERIVARS(GS_NSXMLNode_IVARS) #import "Foundation/NSArray.h" #import "Foundation/NSData.h" #import "Foundation/NSDebug.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSException.h" #import "Foundation/NSString.h" #import "Foundation/NSURL.h" #import "Foundation/NSXMLNode.h" #import "Foundation/NSXMLDocument.h" #import "Foundation/NSXMLDTDNode.h" #import "Foundation/NSXMLDTD.h" #import "Foundation/NSXMLElement.h" #ifdef HAVE_LIBXML // Private methods to manage libxml pointers... @interface NSXMLNode (Private) - (void *) _node; - (void) _setNode: (void *)_anode; + (NSXMLNode *) _objectForNode: (xmlNodePtr)node; - (void) _addSubNode: (NSXMLNode *)subNode; - (void) _removeSubNode: (NSXMLNode *)subNode; - (id) _initWithNode: (xmlNodePtr)node kind: (NSXMLNodeKind)kind; - (xmlNodePtr) _childNodeAtIndex: (NSUInteger)index; - (void) _insertChild: (NSXMLNode*)child atIndex: (NSUInteger)index; - (void) _invalidate; @end #endif /* HAVE_LIBXML */ #endif gnustep-base-1.29.0/Source/NSXPCConnection.m000066400000000000000000000124621435650067400205500ustar00rootroot00000000000000/* Implementation of class NSXPCConnection Copyright (C) 2019 Free Software Foundation, Inc. By: Gregory Casamento Date: Tue Nov 12 23:50:29 EST 2019 This file is part of the GNUstep Library. 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 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 USA. */ #import "Foundation/NSXPCConnection.h" #import "GNUstepBase/NSObject+GNUstepBase.h" @implementation NSXPCConnection - (instancetype) initWithServiceName:(NSString *)serviceName { return [self notImplemented: _cmd]; } - (NSString *) serviceName { return [self notImplemented: _cmd]; } - (void) setServiceName: (NSString *)serviceName { [self notImplemented: _cmd]; } - (instancetype) initWithMachServiceName: (NSString *)name options: (NSXPCConnectionOptions)options { return [self notImplemented: _cmd]; } - (instancetype) initWithListenerEndpoint: (NSXPCListenerEndpoint *)endpoint { return [self notImplemented: _cmd]; } - (NSXPCListenerEndpoint *) endpoint { return [self notImplemented: _cmd]; } - (void) setEndpoint: (NSXPCListenerEndpoint *) endpoint { [self notImplemented: _cmd]; } - (NSXPCInterface *) exportedInterface { return [self notImplemented: _cmd]; } - (void) setExportInterface: (NSXPCInterface *)exportedInterface { [self notImplemented: _cmd]; } - (NSXPCInterface *) remoteObjectInterface { return [self notImplemented: _cmd]; } - (void) setRemoteObjectInterface: (NSXPCInterface *)remoteObjectInterface { [self notImplemented: _cmd]; } - (id) remoteObjectProxy { return [self notImplemented: _cmd]; } - (void) setRemoteObjectProxy: (id)remoteObjectProxy { [self notImplemented: _cmd]; } - (id) remoteObjectProxyWithErrorHandler:(GSXPCProxyErrorHandler)handler { return [self notImplemented: _cmd]; } - (id) synchronousRemoteObjectProxyWithErrorHandler: (GSXPCProxyErrorHandler)handler { return [self notImplemented: _cmd]; } - (GSXPCInterruptionHandler) interruptionHandler { return NULL; } - (void) setInterruptionHandler: (GSXPCInterruptionHandler)handler { [self notImplemented: _cmd]; } - (GSXPCInvalidationHandler) invalidationHandler { return NULL; } - (void) setInvalidationHandler: (GSXPCInvalidationHandler)handler { [self notImplemented: _cmd]; } - (void) resume { [self notImplemented: _cmd]; } - (void) suspend { [self notImplemented: _cmd]; } - (void) invalidate { [self notImplemented: _cmd]; } - (NSUInteger) auditSessionIdentifier { return (NSUInteger)[self notImplemented: _cmd]; } - (pid_t) processIdentifier { return (pid_t)(uintptr_t)[self notImplemented: _cmd]; } - (uid_t) effectiveUserIdentifier { return (uid_t)(uintptr_t)[self notImplemented: _cmd]; } - (gid_t) effectiveGroupIdentifier { return (gid_t)(uintptr_t)[self notImplemented: _cmd]; } @end @implementation NSXPCListener + (NSXPCListener *) serviceListener { return [self notImplemented: _cmd]; } + (NSXPCListener *) anonymousListener { return [self notImplemented: _cmd]; } - (instancetype) initWithMachServiceName:(NSString *)name { return [self notImplemented: _cmd]; } - (id ) delegate { return [self notImplemented: _cmd]; } - (void) setDelegate: (id ) delegate { [self notImplemented: _cmd]; } - (NSXPCListenerEndpoint *) endpoint { return [self notImplemented: _cmd]; } - (void) setEndpoint: (NSXPCListenerEndpoint *)endpoint { [self notImplemented: _cmd]; } - (void) resume { [self notImplemented: _cmd]; } - (void) suspend { [self notImplemented: _cmd]; } - (void) invalidate { [self notImplemented: _cmd]; } @end @implementation NSXPCInterface + (NSXPCInterface *) interfaceWithProtocol: (Protocol *)protocol { return [self notImplemented: _cmd]; } - (Protocol *) protocol { return [self notImplemented: _cmd]; } - (void) setProtocol: (Protocol *)protocol { [self notImplemented: _cmd]; } - (void) setClasses: (NSSet *)classes forSelector: (SEL)sel argumentIndex: (NSUInteger)arg ofReply: (BOOL)ofReply { [self notImplemented: _cmd]; } - (NSSet *) classesForSelector: (SEL)sel argumentIndex: (NSUInteger)arg ofReply: (BOOL)ofReply { return [self notImplemented: _cmd]; } - (void) setInterface: (NSXPCInterface *)ifc forSelector: (SEL)sel argumentIndex: (NSUInteger)arg ofReply: (BOOL)ofReply { [self notImplemented: _cmd]; } - (NSXPCInterface *) interfaceForSelector: (SEL)sel argumentIndex: (NSUInteger)arg ofReply: (BOOL)ofReply { return [self notImplemented: _cmd]; } @end @implementation NSXPCListenerEndpoint - (instancetype) initWithCoder: (NSCoder *)coder { return [self notImplemented: _cmd]; } - (void) encodeWithCoder: (NSCoder *)coder { [self notImplemented: _cmd]; } @end gnustep-base-1.29.0/Source/NSZone.m000066400000000000000000001373461435650067400170220ustar00rootroot00000000000000/** Zone memory management. -*- Mode: ObjC -*- Copyright (C) 1997,1998 Free Software Foundation, Inc. Written by: Yoo C. Chung Date: January 1997 Rewrite by: Richard Frith-Macdonald This file is part of the GNUstep Base Library. 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 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 USA. NSZone class reference $Date$ $Revision$ */ /* Design goals: - Allocation and deallocation should be reasonably efficient. - We want to catch code that writes outside it's permitted area. */ /* Actual design: - The default zone uses malloc() and friends. We assume that they're thread safe and that they return NULL if we're out of memory (glibc malloc does this, what about other mallocs? FIXME). - The OpenStep spec says that when a zone is recycled, any memory in use is returned to the default zone. Since, in general, we have no control over the system malloc, we can't possibly do this. Instead, we move the recycled zone to a list of 'dead' zones, and as soon as all memory used in it is released, we destroy it and remove it from that list. In the meantime, we release any blocks of memory we can (ie those that don't contain unfreed chunks). - For freeable zones, a small linear buffer is used for deallocating and allocating. Anything that can't go into the buffer then uses a more general purpose segregated fit algorithm after flushing the buffer. - For memory chunks in freeable zones, the pointer to the chunk is preceded by the a chunk header which contains the size of the chunk (plus a couple of flags) and a pointer to the end of the memory requested. This adds 8 bytes for freeable zones, which is usually what we need for alignment purposes anyway (assuming we're on a 32 bit machine). The granularity for allocation of chunks is quite large - a chunk must be big enough to hold the chunk header plus a couple of pointers and an unsigned size value. The actual memory allocated will be the size of the chunk header plus the size of memory requested plus one (a guard byte), all rounded up to a multiple of the granularity. - For nonfreeable zones, worst-like fit is used. This is OK since we don't have to worry about memory fragmentation. */ /* Other information: - This uses some GCC specific extensions. But since the library is supposed to compile on GCC 2.7.2.1 (patched) or higher, and the only other Objective-C compiler I know of (other than NeXT's, which is based on GCC as far as I know) is the StepStone compiler, which I haven't the foggiest idea why anyone would prefer it to GCC ;), it should be OK. - These functions should be thread safe, but I haven't really tested them extensively in multithreaded cases. */ /* Define to turn off NSAssertions. */ #define NS_BLOCK_ASSERTIONS 1 #define IN_NSZONE_M 1 #import "common.h" #include #import "Foundation/NSException.h" #import "Foundation/NSLock.h" #import "GSPrivate.h" #import "GSPThread.h" static gs_mutex_t zoneLock = GS_MUTEX_INIT_STATIC; /** * Try to get more memory - the normal process has failed. * If we can't do anything, just return a null pointer. * Try to do some logging if possible. */ void * GSOutOfMemory(NSUInteger size, BOOL retry) { fprintf(stderr, "GSOutOfMemory ... wanting %"PRIuPTR" bytes.\n", size); return 0; } /* Default zone functions for default zone. */ static void* default_malloc (NSZone *zone, size_t size); static void* default_realloc (NSZone *zone, void *ptr, size_t size); static void default_free (NSZone *zone, void *ptr); static void default_recycle (NSZone *zone); static BOOL default_check (NSZone *zone); static BOOL default_lookup (NSZone *zone, void *ptr); static struct NSZoneStats default_stats (NSZone *zone); static void* default_malloc (NSZone *zone, size_t size) { void *mem; mem = malloc(size); if (mem != NULL) { return mem; } [NSException raise: NSMallocException format: @"Default zone has run out of memory"]; return 0; } static void* default_realloc (NSZone *zone, void *ptr, size_t size) { void *mem; mem = realloc(ptr, size); if (mem != NULL) { return mem; } [NSException raise: NSMallocException format: @"Default zone has run out of memory"]; return 0; } static void default_free (NSZone *zone, void *ptr) { free(ptr); } static void default_recycle (NSZone *zone) { /* Recycle the default zone? Thou hast got to be kiddin'. */ [NSException raise: NSGenericException format: @"Trying to recycle default zone"]; } static BOOL default_check (NSZone *zone) { /* We can't check memory managed by malloc(). */ [NSException raise: NSGenericException format: @"No checking for default zone"]; return NO; } static BOOL default_lookup (NSZone *zone, void *ptr) { /* Assume all memory is in default zone. */ return YES; } static struct NSZoneStats default_stats (NSZone *zone) { struct NSZoneStats dummy = {0,0,0,0,0}; /* We can't obtain statistics from the memory managed by malloc(). */ [NSException raise: NSGenericException format: @"No statistics for default zone"]; return dummy; } static NSZone default_zone = { default_malloc, default_realloc, default_free, default_recycle, default_check, default_lookup, default_stats, 0, @"default", 0 }; /* * For backward compatibility. */ NSZone *__nszone_private_hidden_default_zone = &default_zone; GS_DECLARE void NSSetZoneName (NSZone *zone, NSString *name) { if (!zone) zone = NSDefaultMallocZone(); GS_MUTEX_LOCK(zoneLock); name = [name copy]; if (zone->name != nil) [zone->name release]; zone->name = name; GS_MUTEX_UNLOCK(zoneLock); } GS_DECLARE NSString* NSZoneName (NSZone *zone) { if (!zone) zone = NSDefaultMallocZone(); return zone->name; } /* Alignment */ #ifdef ALIGN #undef ALIGN #endif #define ALIGN ((__alignof__(double) < 8) ? 8 : __alignof__(double)) #define MINGRAN 256 /* Minimum granularity. */ #define DEFBLOCK 16384 /* Default granularity. */ #define BUFFER 4 /* Buffer size. FIXME?: Is this a reasonable optimum. */ #define MAX_SEG 16 /* Segregated list size. */ #define FBSZ sizeof(ff_block) #define NBSZ sizeof(nf_chunk) /* Information bits in size. */ #define INUSE 0x01 /* Current chunk in use. */ #define PREVUSE 0x02 /* Previous chunk in use. */ #define LIVE 0x04 /* Bits to mask off to get size. */ #define SIZE_BITS (INUSE | PREVUSE | LIVE) #define NF_HEAD sizeof(nf_block) typedef struct _ffree_free_link ff_link; typedef struct _nfree_block_struct nf_block; typedef struct _ffree_block_struct ff_block; typedef struct _ffree_zone_struct ffree_zone; typedef struct _nfree_zone_struct nfree_zone; /* Header for blocks in nonfreeable zones. */ struct _nfree_block_unpadded { struct _nfree_block_struct *next; size_t size; // Size of block size_t top; // Position of next memory chunk to allocate }; #define NFBPAD sizeof(struct _nfree_block_unpadded) struct _nfree_block_struct { struct _nfree_block_struct *next; size_t size; // Size of block size_t top; // Position of next memory chunk to allocate char padding[ALIGN - ((NFBPAD % ALIGN) ? (NFBPAD % ALIGN) : ALIGN)]; }; struct _ffree_block_unpadded { size_t size; struct _ffree_block_struct *next; }; #define FFCPAD sizeof(struct _ffree_block_unpadded) /* Header for blocks and chunks in freeable zones. */ struct _ffree_block_struct { size_t size; struct _ffree_block_struct *next; char padding[ALIGN - ((FFCPAD % ALIGN) ? (FFCPAD % ALIGN) : ALIGN)]; }; struct _ffree_free_link_unpadded { size_t size; ff_link *prev; ff_link *next; size_t back; /* Back link at end of 'dead' block. */ }; #define FFDPAD sizeof(struct _ffree_free_link_unpadded) struct _ffree_free_link { size_t size; ff_link *prev; ff_link *next; size_t back; char padding[ALIGN - ((FFDPAD % ALIGN) ? (FFDPAD % ALIGN) : ALIGN)]; }; /* NSZone structure for freeable zones. */ struct _ffree_zone_struct { NSZone common; gs_mutex_t lock; ff_block *blocks; // Linked list of blocks ff_link *segheadlist[MAX_SEG]; // Segregated list, holds heads ff_link *segtaillist[MAX_SEG]; // Segregated list, holds tails size_t bufsize; // Buffer size size_t size_buf[BUFFER]; // Buffer holding sizes ff_block *ptr_buf[BUFFER]; // Buffer holding pointers to chunks }; /* Rounds up N to nearest multiple of BASE. */ static inline size_t roundupto (size_t n, size_t base) { size_t a = (n/base)*base; return (n-a)? (a+base): n; } /* * Minimum chunk size for freeable zones. * Need room for basic chunk header, next and prev pointers for * free-list, and a reverse pointer (size_t) to go at the end of the * chunk while it is waiting to be consolidated with other chunks. */ #define MINCHUNK sizeof(ff_link) #define CLTOSZ(n) ((n)*MINCHUNK) /* Converts classes to sizes. */ static inline void* chunkToPointer(ff_block *chunk) { return (void*)(&chunk[1]); } static inline ff_block* pointerToChunk(void* ptr) { return &(((ff_block*)ptr)[-1]); } static inline size_t chunkIsLive(ff_block* ptr) { return ptr->size & LIVE; } static inline size_t chunkIsInUse(ff_block* ptr) { return ptr->size & INUSE; } static inline size_t chunkIsPrevInUse(ff_block* ptr) { return ptr->size & PREVUSE; } static inline size_t chunkSize(ff_block* ptr) { return ptr->size & ~SIZE_BITS; } static inline size_t chunkClrLive(ff_block* ptr) { return ptr->size &= ~LIVE; } static inline void chunkClrPrevInUse(ff_block* ptr) { ptr->size &= ~PREVUSE; } static inline void chunkSetInUse(ff_block* ptr) { ptr->size |= INUSE; } static inline size_t chunkSetLive(ff_block* ptr) { return ptr->size |= LIVE; } static inline void chunkSetPrevInUse(ff_block* ptr) { ptr->size |= PREVUSE; } static inline void chunkSetSize(ff_block* ptr, size_t size) { ptr->size = size; } static inline ff_block* chunkNext(ff_block *ptr) { return (ff_block*) ((void*)ptr+chunkSize(ptr)); } static inline void chunkMakeLink(ff_block *ptr) { NSAssert(!chunkIsInUse(ptr), NSInternalInconsistencyException); NSAssert(!chunkIsLive(ptr), NSInternalInconsistencyException); (&(chunkNext(ptr)->size))[-1] = chunkSize(ptr); } static inline ff_block* chunkChop(ff_block *ptr, size_t size) { ff_block *remainder; size_t left = chunkSize(ptr)-size; NSAssert((chunkSize(ptr) % MINCHUNK) == 0, NSInternalInconsistencyException); NSAssert(chunkSize(ptr) > size, NSInternalInconsistencyException); remainder = (ff_block*)((void*)ptr+size); chunkSetSize(remainder, left | PREVUSE); chunkMakeLink(remainder); chunkSetSize(ptr, size | chunkIsPrevInUse(ptr) | INUSE); return remainder; } static inline ff_block* chunkPrev(ff_block *ptr) { size_t offset; ff_block *prev; NSAssert(!chunkIsPrevInUse(ptr), NSInternalInconsistencyException); offset = (&(ptr->size))[-1]; NSAssert(offset > 0 && (offset % MINCHUNK) == 0, NSInternalInconsistencyException); prev = (ff_block*)((void*)ptr-offset); NSAssert(chunkSize(prev) == offset, NSInternalInconsistencyException); NSAssert(!chunkIsInUse(prev), NSInternalInconsistencyException); return prev; } /* NSZone structure for nonfreeable zones. */ struct _nfree_zone_struct { NSZone common; gs_mutex_t lock; /* Linked list of blocks in decreasing order of free space, except maybe for the first block. */ nf_block *blocks; size_t use; }; /* Memory management functions for freeable zones. */ static void* fmalloc (NSZone *zone, size_t size); static void* frealloc (NSZone *zone, void *ptr, size_t size); static void ffree (NSZone *zone, void *ptr); static void frecycle (NSZone *zone); static BOOL fcheck (NSZone *zone); static BOOL flookup (NSZone *zone, void *ptr); static struct NSZoneStats fstats (NSZone *zone); static inline size_t segindex (size_t size); static ff_block* get_chunk (ffree_zone *zone, size_t size); static void take_chunk (ffree_zone *zone, ff_block *chunk); static void put_chunk (ffree_zone *zone, ff_block *chunk); static inline void add_buf (ffree_zone *zone, ff_block *chunk); static void flush_buf (ffree_zone *zone); /* Memory management functions for nonfreeable zones. */ static void* nmalloc (NSZone *zone, size_t size); static void nrecycle (NSZone *zone); static void* nrealloc (NSZone *zone, void *ptr, size_t size); static void nfree (NSZone *zone, void *ptr); static BOOL ncheck (NSZone *zone); static BOOL nlookup (NSZone *zone, void *ptr); static struct NSZoneStats nstats (NSZone *zone); /* Memory management functions for recycled zones. */ static void* rmalloc (NSZone *zone, size_t size); static void rrecycle (NSZone *zone); static void* rrealloc (NSZone *zone, void *ptr, size_t size); static void rffree (NSZone *zone, void *ptr); static void rnfree (NSZone *zone, void *ptr); /* * Lists of zones to be used to determine if a pointer is in a zone. */ static NSZone *zone_list = 0; static inline void destroy_zone(NSZone* zone) { if (zone) { if (zone_list == zone) { zone_list = zone->next; } else { NSZone *ptr = zone_list; while (ptr != NULL && ptr->next != zone) { ptr = ptr->next; } if (ptr) { ptr->next = zone->next; } } free((void*)zone); } } /* Search the buffer to see if there is any memory chunks large enough to satisfy request using first fit. If the memory chunk found has a size exactly equal to the one requested, remove it from the buffer and return it. If not, cut off a chunk that does match the size and return it. If there is no chunk large enough in the buffer, get a chunk from the general purpose allocator that uses segregated fit. Since a chunk in the buffer is not freed in the general purpose allocator, the headers are as if it is still in use. */ static void* fmalloc (NSZone *zone, size_t size) { size_t i = 0; size_t chunksize = roundupto(size+FBSZ+1, MINCHUNK); ffree_zone *zptr = (ffree_zone*)zone; size_t bufsize; size_t *size_buf = zptr->size_buf; ff_block **ptr_buf = zptr->ptr_buf; ff_block *chunkhead; void *result; GS_MUTEX_LOCK(zptr->lock); bufsize = zptr->bufsize; while ((i < bufsize) && (chunksize > size_buf[i])) i++; if (i < bufsize) /* Use memory chunk in buffer. */ { if (size_buf[i] == chunksize) /* Exact fit. */ { zptr->bufsize--; bufsize = zptr->bufsize; chunkhead = ptr_buf[i]; size_buf[i] = size_buf[bufsize]; ptr_buf[i] = ptr_buf[bufsize]; NSAssert(chunkIsInUse(chunkhead), NSInternalInconsistencyException); NSAssert((chunkSize(chunkhead) % MINCHUNK) == 0, NSInternalInconsistencyException); } else { /* * Break off chunk leaving remainder marked as in use since it * stays in this buffer rather than on a free-list. */ chunkhead = ptr_buf[i]; size_buf[i] -= chunksize; ptr_buf[i] = chunkChop(chunkhead, chunksize); chunkSetInUse(ptr_buf[i]); } } else /* Get memory from segregate fit allocator. */ { flush_buf(zptr); chunkhead = get_chunk(zptr, chunksize); if (chunkhead == NULL) { GS_MUTEX_UNLOCK(zptr->lock); if (zone->name != nil) [NSException raise: NSMallocException format: @"Zone %@ has run out of memory", zone->name]; else [NSException raise: NSMallocException format: @"Out of memory"]; } NSAssert(chunkIsInUse(chunkhead), NSInternalInconsistencyException); NSAssert(chunkIsPrevInUse(chunkNext(chunkhead)), NSInternalInconsistencyException); NSAssert((chunkSize(chunkhead) % MINCHUNK) == 0, NSInternalInconsistencyException); } chunkhead->next = (ff_block*)(chunkToPointer(chunkhead)+size); *((char*)chunkhead->next) = (char)42; chunkSetLive(chunkhead); result = chunkToPointer(chunkhead); GS_MUTEX_UNLOCK(zptr->lock); return result; } /* If PTR == NULL, then it's the same as ordinary memory allocation. If a smaller size than it originally had is requested, shrink the chunk. If a larger size is requested, check if there is enough space after it. If there isn't enough space, get a new chunk and move it there, releasing the original. The space before the chunk should also be checked, but I'll leave this to a later date. */ static void* frealloc (NSZone *zone, void *ptr, size_t size) { size_t realsize; size_t chunksize = roundupto(size+FBSZ+1, MINCHUNK); ffree_zone *zptr = (ffree_zone*)zone; ff_block *chunkhead, *slack; void *result; NSAssert(ptr == NULL || NSZoneFromPointer(ptr) == zone, NSInternalInconsistencyException); if (ptr == NULL) return fmalloc(zone, size); chunkhead = pointerToChunk(ptr); GS_MUTEX_LOCK(zptr->lock); realsize = chunkSize(chunkhead); NSAssert(chunkIsInUse(chunkhead), NSInternalInconsistencyException); NSAssert((realsize % MINCHUNK) == 0, NSInternalInconsistencyException); chunkClrLive(chunkhead); if (chunksize < realsize) { /* * Chop tail off existing memory chunk and tell the next chunk * after it that it is no longer in use. Then put it in the * buffer to be added to the free list later (we can't add it * immediately 'cos we might invalidate the rule that there * must not be two adjacent unused chunks). */ slack = chunkChop(chunkhead, chunksize); chunkSetInUse(slack); add_buf(zptr, slack); } else if (chunksize > realsize) { size_t nextsize; ff_block *nextchunk, *farchunk; nextchunk = chunkNext(chunkhead); nextsize = chunkSize(nextchunk); NSAssert((nextsize % MINCHUNK) == 0, NSInternalInconsistencyException); if (!chunkIsInUse(nextchunk) && (nextsize+realsize >= chunksize)) /* Expand to next chunk. */ { take_chunk(zptr, nextchunk); if (nextsize+realsize == chunksize) { farchunk = chunkNext(nextchunk); chunkSetPrevInUse(farchunk); } else { chunkSetSize(chunkhead, nextsize+realsize); slack = chunkChop(chunkhead, chunksize); put_chunk(zptr, slack); } chunkSetSize(chunkhead, chunksize | chunkIsPrevInUse(chunkhead) | INUSE); } else /* Get new chunk and copy. */ { ff_block *newchunk; newchunk = get_chunk(zptr, chunksize); if (newchunk == NULL) { GS_MUTEX_UNLOCK(zptr->lock); if (zone->name != nil) [NSException raise: NSMallocException format: @"Zone %@ has run out of memory", zone->name]; else [NSException raise: NSMallocException format: @"Out of memory"]; } memcpy((void*)(&newchunk[1]), (void*)(&chunkhead[1]), realsize-FBSZ); add_buf(zptr, chunkhead); chunkhead = newchunk; } } chunkhead->next = (ff_block*)(chunkToPointer(chunkhead)+size); *((char*)chunkhead->next) = (char)42; chunkSetLive(chunkhead); result = chunkToPointer(chunkhead); GS_MUTEX_UNLOCK(zptr->lock); return result; } /* Frees memory chunk by simply adding it to the buffer. */ static void ffree (NSZone *zone, void *ptr) { ff_block *chunk; NSAssert(NSZoneFromPointer(ptr) == zone, NSInternalInconsistencyException); GS_MUTEX_LOCK(((ffree_zone*)zone)->lock); chunk = pointerToChunk(ptr); if (chunkIsLive(chunk) == 0) [NSException raise: NSMallocException format: @"Attempt to free freed memory"]; NSAssert(*((char*)chunk->next) == (char)42, NSInternalInconsistencyException); add_buf((ffree_zone*)zone, chunk); GS_MUTEX_UNLOCK(((ffree_zone*)zone)->lock); } static BOOL frecycle1(NSZone *zone) { ffree_zone *zptr = (ffree_zone*)zone; ff_block *block; ff_block *nextblock; GS_MUTEX_LOCK(zptr->lock); flush_buf(zptr); block = zptr->blocks; while (block != NULL) { ff_block *tmp = &block[1]; nextblock = block->next; if (chunkIsInUse(tmp) == 0 && chunkNext(tmp) == chunkNext(block)) { if (zptr->blocks == block) zptr->blocks = block->next; else { tmp = zptr->blocks; while (tmp->next != block) tmp = tmp->next; tmp->next = block->next; } free((void*)block); } block = nextblock; } GS_MUTEX_UNLOCK(zptr->lock); if (zptr->blocks == 0) { GS_MUTEX_DESTROY(zptr->lock); return YES; } return NO; } /* Recycle the zone. */ static void frecycle (NSZone *zone) { GS_MUTEX_LOCK(zoneLock); if (zone->name != nil) { NSString *name = zone->name; zone->name = nil; [name release]; } if (frecycle1(zone) == YES) destroy_zone(zone); else { zone->malloc = rmalloc; zone->realloc = rrealloc; zone->free = rffree; zone->recycle = rrecycle; } GS_MUTEX_UNLOCK(zoneLock); } static void rffree (NSZone *zone, void *ptr) { ffree(zone, ptr); GS_MUTEX_LOCK(zoneLock); if (frecycle1(zone)) destroy_zone(zone); GS_MUTEX_UNLOCK(zoneLock); } /* Check integrity of a freeable zone. Doesn't have to be particularly efficient. */ static BOOL fcheck (NSZone *zone) { size_t i; ffree_zone *zptr = (ffree_zone*)zone; ff_block *block; GS_MUTEX_LOCK(zptr->lock); /* Check integrity of each block the zone owns. */ block = zptr->blocks; while (block != NULL) { ff_block *blockstart = &block[1]; ff_block *blockend = chunkNext(block); ff_block *nextchunk = blockstart; if (blockend->next != block) goto inconsistent; if (!chunkIsPrevInUse(blockstart)) goto inconsistent; while (nextchunk < blockend) { ff_block *chunk = nextchunk; size_t chunksize; chunksize = chunkSize(chunk); if ((chunksize % ALIGN) != 0) goto inconsistent; nextchunk = chunkNext(chunk); if (chunkIsInUse(chunk)) /* Check whether this is a valid used chunk. */ { if (!chunkIsPrevInUse(nextchunk)) goto inconsistent; if (chunkIsLive(chunk)) { if (chunk->next < &chunk[1] || chunk->next > nextchunk) goto inconsistent; if (*(char*)chunk->next != (char)42) goto inconsistent; } } else /* Check whether this is a valid free chunk. */ { if (chunkIsPrevInUse(nextchunk)) goto inconsistent; if (!chunkIsInUse(nextchunk)) goto inconsistent; if (chunkIsLive(chunk)) goto inconsistent; } if (chunk != blockstart && chunkIsPrevInUse(chunk) == 0) { ff_block *prev = chunkPrev(chunk); if (chunkNext(prev) != chunk) goto inconsistent; } } /* Check whether the block ends properly. */ if (nextchunk != blockend) goto inconsistent; if (chunkSize(blockend) != 0) goto inconsistent; if (chunkIsInUse(blockend) == 0) goto inconsistent; block = block->next; } /* Check the integrity of the segregated list. */ for (i = 0; i < MAX_SEG; i++) { ff_link *chunk = zptr->segheadlist[i]; while (chunk != NULL) { ff_link *nextchunk; nextchunk = chunk->next; /* Isn't this one ugly if statement? */ if (chunkIsInUse((ff_block*)chunk) || (segindex(chunkSize((ff_block*)chunk)) != i) || ((nextchunk != NULL) && (chunk != nextchunk->prev)) || ((nextchunk == NULL) && (chunk != zptr->segtaillist[i]))) goto inconsistent; chunk = nextchunk; } } /* Check the buffer. */ if (zptr->bufsize > BUFFER) goto inconsistent; for (i = 0; i < zptr->bufsize; i++) { ff_block *chunk = zptr->ptr_buf[i]; if ((zptr->size_buf[i] != chunkSize(chunk)) || !chunkIsInUse(chunk)) goto inconsistent; } GS_MUTEX_UNLOCK(zptr->lock); return YES; inconsistent: // Jump here if an inconsistency was found. GS_MUTEX_UNLOCK(zptr->lock); return NO; } static BOOL flookup (NSZone *zone, void *ptr) { ffree_zone *zptr = (ffree_zone*)zone; ff_block *block; BOOL found = NO; GS_MUTEX_LOCK(zptr->lock); for (block = zptr->blocks; block != NULL; block = block->next) { if (ptr >= (void*)block && ptr < (void*)chunkNext(block)) { found = YES; break; } } GS_MUTEX_UNLOCK(zptr->lock); return found; } /* Obtain statistics about the zone. Doesn't have to be particularly efficient. */ static struct NSZoneStats fstats (NSZone *zone) { size_t i; struct NSZoneStats stats; ffree_zone *zptr = (ffree_zone*)zone; ff_block *block; stats.bytes_total = 0; stats.chunks_used = 0; stats.bytes_used = 0; stats.chunks_free = 0; stats.bytes_free = 0; GS_MUTEX_LOCK(zptr->lock); block = zptr->blocks; /* Go through each block. */ while (block != NULL) { ff_block *blockend = chunkNext(block); ff_block *chunk = &block[1]; stats.bytes_total += chunkSize(block); while (chunk < blockend) { size_t chunksize = chunkSize(chunk); if (chunkIsInUse(chunk)) { stats.chunks_used++; stats.bytes_used += chunksize; } else { stats.chunks_free++; stats.bytes_free += chunksize; } chunk = chunkNext(chunk); } block = block->next; } /* Go through buffer. */ for (i = 0; i < zptr->bufsize; i++) { stats.chunks_used--; stats.chunks_free++; stats.bytes_used -= zptr->size_buf[i]; stats.bytes_free += zptr->size_buf[i]; } GS_MUTEX_UNLOCK(zptr->lock); /* Remove overhead. */ stats.bytes_used -= FBSZ*stats.chunks_used; return stats; } /* Calculate which segregation class a certain size should be in. FIXME: Optimize code and find a more optimum distribution. */ static inline size_t segindex (size_t size) { NSAssert(size%MINCHUNK == 0, NSInternalInconsistencyException); if (size < CLTOSZ(8)) return size/MINCHUNK; else if (size < CLTOSZ(16)) return 7; else if (size < CLTOSZ(32)) return 8; else if (size < CLTOSZ(64)) return 9; else if (size < CLTOSZ(128)) return 10; else if (size < CLTOSZ(256)) return 11; else if (size < CLTOSZ(512)) return 12; else if (size < CLTOSZ(1024)) return 13; else if (size < CLTOSZ(2048)) return 14; else return 15; } /* Look through the segregated list with first fit to find a memory chunk. If one is not found, get more memory. */ static ff_block* get_chunk (ffree_zone *zone, size_t size) { size_t class = segindex(size); ff_block *chunk; ff_link *link = zone->segheadlist[class]; NSAssert(size%MINCHUNK == 0, NSInternalInconsistencyException); while ((link != NULL) && (chunkSize((ff_block*)link) < size)) link = link->next; if (link == NULL) /* Get more memory. */ { class++; while ((class < MAX_SEG) && (zone->segheadlist[class] == NULL)) class++; if (class == MAX_SEG) /* Absolutely no memory in segregated list. */ { size_t blocksize; ff_block *block; blocksize = roundupto(size, zone->common.gran); block = malloc(blocksize+2*FBSZ); if (block == NULL) return NULL; /* * Set up the new block header and add to blocks list. */ block->size = blocksize+FBSZ; /* Point to block trailer. */ block->next = zone->blocks; zone->blocks = block; /* * Set up the block trailer. */ chunk = chunkNext(block); chunk->next = block; /* Point back to block head. */ /* * Now set up block contents. */ if (size < blocksize) { chunkSetSize(chunk, INUSE); /* Tailer size is zero. */ chunk = &block[1]; chunkSetSize(chunk, size | PREVUSE | INUSE); chunk = chunkNext(chunk); chunkSetSize(chunk, (block->size-FBSZ-size) | PREVUSE); put_chunk(zone, chunk); chunk = &block[1]; } else { chunkSetSize(chunk, PREVUSE | INUSE); chunk = &block[1]; chunkSetSize(chunk, size | PREVUSE | INUSE); } } else { ff_block *slack; NSAssert(class < MAX_SEG, NSInternalInconsistencyException); chunk = (ff_block*)zone->segheadlist[class]; NSAssert(!chunkIsInUse(chunk), NSInternalInconsistencyException); NSAssert(size < chunkSize(chunk), NSInternalInconsistencyException); NSAssert((chunkSize(chunk) % MINCHUNK) == 0, NSInternalInconsistencyException); take_chunk(zone, chunk); slack = chunkChop(chunk, size); put_chunk(zone, slack); } } else { size_t chunksize; chunk = (ff_block*)link; chunksize = chunkSize(chunk); NSAssert((chunksize % MINCHUNK) == 0, NSInternalInconsistencyException); NSAssert(!chunkIsInUse(chunk), NSInternalInconsistencyException); NSAssert(chunkIsPrevInUse(chunk), NSInternalInconsistencyException); NSAssert(chunkIsInUse(chunkNext(chunk)), NSInternalInconsistencyException); take_chunk(zone, chunk); if (chunksize > size) { ff_block *slack; slack = chunkChop(chunk, size); put_chunk(zone, slack); } else { ff_block *nextchunk = chunkNext(chunk); NSAssert(!chunkIsInUse(chunk), NSInternalInconsistencyException); NSAssert(!chunkIsPrevInUse(nextchunk), NSInternalInconsistencyException); NSAssert(chunksize == size, NSInternalInconsistencyException); chunkSetInUse(chunk); chunkSetPrevInUse(nextchunk); } } NSAssert(chunkIsInUse(chunk), NSInternalInconsistencyException); NSAssert(chunkIsPrevInUse(chunkNext(chunk)), NSInternalInconsistencyException); return chunk; } /* Take the given chunk out of the free list. No headers are set. */ static void take_chunk (ffree_zone *zone, ff_block *chunk) { size_t size = chunkSize(chunk); size_t class = segindex(size); ff_link *otherlink; ff_link *links = (ff_link*)chunk; NSAssert((size % MINCHUNK) == 0, NSInternalInconsistencyException); NSAssert(!chunkIsInUse(chunk), NSInternalInconsistencyException); if (links->prev == NULL) zone->segheadlist[class] = links->next; else { otherlink = links->prev; otherlink->next = links->next; } if (links->next == NULL) zone->segtaillist[class] = links->prev; else { otherlink = links->next; otherlink->prev = links->prev; } } /* * Add the given chunk to the segregated list. The header to the * chunk must be set appropriately, but the tailer is set here. * NB. The chunk must NOT be in use, and the adjacent chunks within * its memory block MUST be in use - the memory coalescing done in * flush_buf() depends on this rule. */ static void put_chunk (ffree_zone *zone, ff_block *chunk) { size_t size = chunkSize(chunk); size_t class = segindex(size); ff_link *links = (ff_link*)chunk; NSAssert((chunkSize(chunk) % MINCHUNK) == 0, NSInternalInconsistencyException); NSAssert(!chunkIsInUse(chunk), NSInternalInconsistencyException); NSAssert(chunkIsPrevInUse(chunk), NSInternalInconsistencyException); NSAssert(chunkIsInUse(chunkNext(chunk)), NSInternalInconsistencyException); chunkMakeLink(chunk); if (zone->segtaillist[class] == NULL) { NSAssert(zone->segheadlist[class] == NULL, NSInternalInconsistencyException); zone->segheadlist[class] = zone->segtaillist[class] = links; links->prev = links->next = NULL; } else { ff_link *prevlink = zone->segtaillist[class]; NSAssert(zone->segheadlist[class] != NULL, NSInternalInconsistencyException); links->next = NULL; links->prev = prevlink; prevlink->next = links; zone->segtaillist[class] = links; } } /* Add the given pointer to the buffer. If the buffer becomes full, flush it. The given pointer must always be one that points to used memory (i.e. chunks with headers that declare them as used). */ static inline void add_buf (ffree_zone *zone, ff_block *chunk) { size_t bufsize = zone->bufsize; NSAssert(bufsize < BUFFER, NSInternalInconsistencyException); NSAssert(chunkIsInUse(chunk), NSInternalInconsistencyException); NSAssert((chunkSize(chunk) % MINCHUNK) == 0, NSInternalInconsistencyException); NSAssert(chunkSize(chunk) >= MINCHUNK, NSInternalInconsistencyException); zone->bufsize++; zone->size_buf[bufsize] = chunkSize(chunk); zone->ptr_buf[bufsize] = chunk; chunkClrLive(chunk); if (bufsize == BUFFER-1) flush_buf(zone); } /* Flush buffers. All coalescing is done here. */ static void flush_buf (ffree_zone *zone) { size_t i, size; size_t bufsize = zone->bufsize; ff_block *chunk, *nextchunk; size_t *size_buf = zone->size_buf; ff_block **ptr_buf = zone->ptr_buf; NSAssert(bufsize <= BUFFER, NSInternalInconsistencyException); for (i = 0; i < bufsize; i++) { size = size_buf[i]; chunk = ptr_buf[i]; NSAssert(chunkSize(chunk) == size, NSInternalInconsistencyException); NSAssert(chunkIsInUse(chunk), NSInternalInconsistencyException); nextchunk = chunkNext(chunk); if (!chunkIsPrevInUse(chunk)) /* Coalesce with previous chunk. */ { chunk = chunkPrev(chunk); NSAssert(!chunkIsInUse(chunk), NSInternalInconsistencyException); NSAssert(chunkIsPrevInUse(chunk), NSInternalInconsistencyException); size += chunkSize(chunk); take_chunk(zone, chunk); } if (!chunkIsInUse(nextchunk)) /* Coalesce with next chunk. */ { size_t nextsize = chunkSize(nextchunk); NSAssert(chunkIsPrevInUse(nextchunk), NSInternalInconsistencyException); NSAssert((nextsize % MINCHUNK) == 0, NSInternalInconsistencyException); size += nextsize; take_chunk(zone, nextchunk); nextchunk = chunkNext(nextchunk); } chunkSetSize(chunk, size | PREVUSE); put_chunk(zone, chunk); chunkClrPrevInUse(nextchunk); NSAssert(chunkNext(chunk) == nextchunk, NSInternalInconsistencyException); NSAssert(chunkPrev(nextchunk) == chunk, NSInternalInconsistencyException); NSAssert((chunkSize(chunk) % MINCHUNK) == 0, NSInternalInconsistencyException); NSAssert(!chunkIsInUse(chunk), NSInternalInconsistencyException); NSAssert(chunkIsPrevInUse(chunk), NSInternalInconsistencyException); NSAssert(chunkIsInUse(nextchunk), NSInternalInconsistencyException); NSAssert(!chunkIsPrevInUse(nextchunk), NSInternalInconsistencyException); } zone->bufsize = 0; } /* If the first block in block list has enough space, use that space. Otherwise, sort the block list in decreasing free space order (only the first block needs to be put in its appropriate place since the rest of the list is already sorted). Then check if the first block has enough space for the request. If it does, use it. If it doesn't, get more memory from the default zone, since none of the other blocks in the block list could have enough memory. */ static void* nmalloc (NSZone *zone, size_t size) { nfree_zone *zptr = (nfree_zone*)zone; size_t chunksize = roundupto(size, ALIGN); size_t freesize; void *chunkhead; nf_block *block; size_t top; GS_MUTEX_LOCK(zptr->lock); block = zptr->blocks; top = block->top; freesize = block->size-top; if (freesize >= chunksize) { chunkhead = (void*)(block)+top; block->top += chunksize; } else { nf_block *preblock; /* First, get the block list in decreasing free size order. */ preblock = NULL; while ((block->next != NULL) && (freesize < block->next->size-block->next->top)) { preblock = block; block = block->next; } if (preblock != NULL) { preblock->next = zptr->blocks; zptr->blocks = zptr->blocks->next; preblock->next->next = block; } if (zptr->blocks->size-zptr->blocks->top < chunksize) /* Get new block. */ { size_t blocksize = roundupto(chunksize+NF_HEAD, zone->gran); block = malloc(blocksize); if (block == NULL) { GS_MUTEX_UNLOCK(zptr->lock); if (zone->name != nil) [NSException raise: NSMallocException format: @"Zone %@ has run out of memory", zone->name]; else [NSException raise: NSMallocException format: @"Out of memory"]; } block->next = zptr->blocks; block->size = blocksize; block->top = NF_HEAD; zptr->blocks = block; } chunkhead = (void*)block+block->top; block->top += chunksize; } zptr->use++; GS_MUTEX_UNLOCK(zptr->lock); return chunkhead; } /* Return the blocks to the default zone, then deallocate mutex, and then release zone name if it exists. */ static BOOL nrecycle1 (NSZone *zone) { nfree_zone *zptr = (nfree_zone*)zone; GS_MUTEX_LOCK(zptr->lock); if (zptr->use == 0) { nf_block *nextblock; nf_block *block = zptr->blocks; while (block != NULL) { nextblock = block->next; free(block); block = nextblock; } zptr->blocks = 0; } GS_MUTEX_UNLOCK(zptr->lock); if (zptr->blocks == 0) { GS_MUTEX_DESTROY(zptr->lock); return YES; } return NO; } /* Recycle the zone. */ static void nrecycle (NSZone *zone) { GS_MUTEX_LOCK(zoneLock); if (zone->name != nil) { NSString *name = zone->name; zone->name = nil; [name release]; } if (nrecycle1(zone) == YES) destroy_zone(zone); else { zone->malloc = rmalloc; zone->realloc = rrealloc; zone->free = rnfree; zone->recycle = rrecycle; } GS_MUTEX_UNLOCK(zoneLock); } static void* nrealloc (NSZone *zone, void *ptr, size_t size) { nfree_zone *zptr = (nfree_zone*)zone; void *tmp = nmalloc(zone, size); if (ptr != 0) { GS_MUTEX_LOCK(zptr->lock); if (tmp) { nf_block *block; size_t old = 0; for (block = zptr->blocks; block != NULL; block = block->next) { if (ptr >= (void*)block && ptr < ((void*)block)+block->size) { old = ((void*)block)+block->size - ptr; break; } } if (old > 0) { if (size < old) old = size; memcpy(tmp, ptr, old); } } zptr->use--; GS_MUTEX_UNLOCK(zptr->lock); } return tmp; } /* * The OpenStep spec says we don't release memory - but we have to do * some minimal bookkeeping so that, when the zone is recycled, we can * determine if all the allocated memory has been freed. Until it is * all freed, we can't actually destroy the zone! */ static void nfree (NSZone *zone, void *ptr) { nfree_zone *zptr = (nfree_zone*)zone; GS_MUTEX_LOCK(zptr->lock); zptr->use--; GS_MUTEX_UNLOCK(zptr->lock); } static void rnfree (NSZone *zone, void *ptr) { nfree_zone *zptr = (nfree_zone*)zone; nfree(zone, ptr); if (zptr->use == 0) { GS_MUTEX_LOCK(zoneLock); nrecycle1(zone); destroy_zone(zone); GS_MUTEX_UNLOCK(zoneLock); } } /* Check integrity of a nonfreeable zone. Doesn't have to particularly efficient. */ static BOOL ncheck (NSZone *zone) { nfree_zone *zptr = (nfree_zone*)zone; nf_block *block; GS_MUTEX_LOCK(zptr->lock); block = zptr->blocks; while (block != NULL) { if (block->size < block->top) { GS_MUTEX_UNLOCK(zptr->lock); return NO; } block = block->next; } /* FIXME: Do more checking? */ GS_MUTEX_UNLOCK(zptr->lock); return YES; } static BOOL nlookup (NSZone *zone, void *ptr) { nfree_zone *zptr = (nfree_zone*)zone; nf_block *block; BOOL found = NO; GS_MUTEX_LOCK(zptr->lock); for (block = zptr->blocks; block != NULL; block = block->next) { if (ptr >= (void*)block && ptr < ((void*)block)+block->size) { found = YES; break; } } GS_MUTEX_UNLOCK(zptr->lock); return found; } /* Return statistics for a nonfreeable zone. Doesn't have to particularly efficient. */ static struct NSZoneStats nstats (NSZone *zone) { struct NSZoneStats stats; nfree_zone *zptr = (nfree_zone*)zone; nf_block *block; stats.bytes_total = 0; stats.chunks_used = 0; stats.bytes_used = 0; stats.chunks_free = 0; stats.bytes_free = 0; GS_MUTEX_LOCK(zptr->lock); block = zptr->blocks; while (block != NULL) { size_t *chunk; stats.bytes_total += block->size; chunk = (void*)block+NF_HEAD; while ((void*)chunk < (void*)block+block->top) { stats.chunks_used++; stats.bytes_used += *chunk; chunk = (void*)chunk+(*chunk); } if (block->size != block->top) { stats.chunks_free++; stats.bytes_free += block->size-block->top; } block = block->next; } GS_MUTEX_UNLOCK(zptr->lock); return stats; } static void* rmalloc (NSZone *zone, size_t size) { [NSException raise: NSMallocException format: @"Attempt to malloc memory in recycled zone"]; return 0; } static void rrecycle (NSZone *zone) { [NSException raise: NSMallocException format: @"Attempt to recycle a recycled zone"]; } static void* rrealloc (NSZone *zone, void *ptr, size_t size) { [NSException raise: NSMallocException format: @"Attempt to realloc memory in recycled zone"]; return 0; } static void rnfree (NSZone *zone, void *ptr); GS_DECLARE NSZone* NSZoneFromPointer(void *ptr) { NSZone *zone; if (ptr == 0) return 0; if (zone_list == 0) return &default_zone; /* * See if we can find the zone in our list of all zones. */ GS_MUTEX_LOCK(zoneLock); for (zone = zone_list; zone != 0; zone = zone->next) { if ((zone->lookup)(zone, ptr) == YES) { break; } } GS_MUTEX_UNLOCK(zoneLock); return (zone == 0) ? &default_zone : zone; } GS_DECLARE NSZone* NSCreateZone (NSUInteger start, NSUInteger gran, BOOL canFree) { size_t i, startsize, granularity; NSZone *newZone; if (start > 0) startsize = roundupto(start, roundupto(MINGRAN, MINCHUNK)); else startsize = roundupto(MINGRAN, MINCHUNK); if (gran > 0) granularity = roundupto(gran, roundupto(MINGRAN, MINCHUNK)); else granularity = roundupto(MINGRAN, MINCHUNK); if (canFree) { ffree_zone *zone; ff_block *block; ff_block *chunk; ff_block *tailer; zone = malloc(sizeof(ffree_zone)); if (zone == NULL) [NSException raise: NSMallocException format: @"No memory to create zone"]; zone->common.malloc = fmalloc; zone->common.realloc = frealloc; zone->common.free = ffree; zone->common.recycle = frecycle; zone->common.check = fcheck; zone->common.lookup = flookup; zone->common.stats = fstats; zone->common.gran = granularity; zone->common.name = nil; GS_MUTEX_INIT_RECURSIVE(zone->lock); for (i = 0; i < MAX_SEG; i++) { zone->segheadlist[i] = NULL; zone->segtaillist[i] = NULL; } zone->bufsize = 0; zone->blocks = malloc(startsize + 2*FBSZ); if (zone->blocks == NULL) { GS_MUTEX_DESTROY(zone->lock); free(zone); [NSException raise: NSMallocException format: @"No memory to create zone"]; } /* * Set up block header. */ block = zone->blocks; block->next = NULL; /* Point to next block. */ block->size = startsize+FBSZ; /* Point to first chunk. */ /* * Set up block trailer. */ tailer = chunkNext(block); chunkSetSize(tailer, PREVUSE|INUSE); tailer->next = block; /* Point back to block start. */ /* * Set up the block as a single chunk and put it in the * buffer for quick allocation. */ chunk = &block[1]; chunkSetSize(chunk, (block->size-FBSZ) | PREVUSE|INUSE); add_buf(zone, chunk); newZone = (NSZone*)zone; } else { nf_block *block; nfree_zone *zone; zone = malloc(sizeof(nfree_zone)); if (zone == NULL) [NSException raise: NSMallocException format: @"No memory to create zone"]; zone->common.malloc = nmalloc; zone->common.realloc = nrealloc; zone->common.free = nfree; zone->common.recycle = nrecycle; zone->common.check = ncheck; zone->common.lookup = nlookup; zone->common.stats = nstats; zone->common.gran = granularity; zone->common.name = nil; GS_MUTEX_INIT_RECURSIVE(zone->lock); zone->blocks = malloc(startsize); zone->use = 0; if (zone->blocks == NULL) { GS_MUTEX_DESTROY(zone->lock); free(zone); [NSException raise: NSMallocException format: @"No memory to create zone"]; } block = zone->blocks; block->next = NULL; block->size = startsize; block->top = NF_HEAD; newZone = (NSZone*)zone; } GS_MUTEX_LOCK(zoneLock); newZone->next = zone_list; zone_list = newZone; GS_MUTEX_UNLOCK(zoneLock); return newZone; } GS_DECLARE void* NSZoneCalloc (NSZone *zone, NSUInteger elems, NSUInteger bytes) { void *mem; if (0 == zone || NSDefaultMallocZone() == zone) { mem = calloc(elems, bytes); if (mem != NULL) { return mem; } [NSException raise: NSMallocException format: @"Default zone has run out of memory"]; } return memset(NSZoneMalloc(zone, elems*bytes), 0, elems*bytes); } GS_DECLARE void* NSAllocateCollectable(NSUInteger size, NSUInteger options) { return NSZoneCalloc(NSDefaultMallocZone(), 1, size); } GS_DECLARE void* NSReallocateCollectable(void *ptr, NSUInteger size, NSUInteger options) { return NSZoneRealloc(0, ptr, size); } GS_DECLARE NSZone* NSDefaultMallocZone (void) { return &default_zone; } NSZone* GSAtomicMallocZone (void) { return &default_zone; } GS_DECLARE void GSMakeWeakPointer(Class theClass, const char *iVarName) { return; } GS_DECLARE BOOL GSAssignZeroingWeakPointer(void **destination, void *source) { if (destination == 0) { return NO; } *destination = source; return YES; } GS_DECLARE void* NSZoneMalloc (NSZone *zone, NSUInteger size) { if (!zone) zone = NSDefaultMallocZone(); return (zone->malloc)(zone, size); } GS_DECLARE void* NSZoneRealloc (NSZone *zone, void *ptr, NSUInteger size) { if (!zone) zone = NSDefaultMallocZone(); return (zone->realloc)(zone, ptr, size); } GS_DECLARE void NSRecycleZone (NSZone *zone) { if (!zone) zone = NSDefaultMallocZone(); (zone->recycle)(zone); } GS_DECLARE void NSZoneFree (NSZone *zone, void *ptr) { if (!zone) zone = NSDefaultMallocZone(); (zone->free)(zone, ptr); } BOOL NSZoneCheck (NSZone *zone) { if (!zone) zone = NSDefaultMallocZone(); return (zone->check)(zone); } struct NSZoneStats NSZoneStats (NSZone *zone) { if (!zone) zone = NSDefaultMallocZone(); return (zone->stats)(zone); } BOOL GSPrivateIsCollectable(const void *ptr) { return NO; } gnustep-base-1.29.0/Source/ObjectiveC2/000077500000000000000000000000001435650067400175515ustar00rootroot00000000000000gnustep-base-1.29.0/Source/ObjectiveC2/COPYING000066400000000000000000000020431435650067400206030ustar00rootroot00000000000000Copyright (c) 2009 David Chisnall Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. gnustep-base-1.29.0/Source/ObjectiveC2/GNUmakefile000066400000000000000000000031161435650067400216240ustar00rootroot00000000000000# # src makefile for the GNUstep Base Library # # Copyright (C) 2010 Free Software Foundation, Inc. # # Written by: Richard Frith-Macdonald # # This file is part of the GNUstep Base Library. # # 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 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 # Library General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free # Software Foundation, Inc., 51 Franklin Street, Fifth Floor, # Boston, MA 02111 USA. # PACKAGE_NAME = gnustep-base GNUSTEP_LOCAL_ADDITIONAL_MAKEFILES=../../base.make include $(GNUSTEP_MAKEFILES)/common.make include ../../config.mak SUBPROJECT_NAME = ObjectiveC2 ObjectiveC2_C_FILES = ObjectiveC2_OBJC_FILES = ifeq ($(OBJC2RUNTIME),0) ObjectiveC2_OBJC_FILES += \ properties.m ifneq ($(OBJCSYNC), 1) ObjectiveC2_OBJC_FILES += \ sync.m endif ObjectiveC2_C_FILES += caps.c runtime.c endif ifeq ($(HAVE_BLOCKS),0) ObjectiveC2_OBJC_FILES += \ blocks_runtime.m\ NSBlocks.m endif ifeq ($(CC), clang) ADDITIONAL_OBJCFLAGS = -fblocks endif -include Makefile.preamble include $(GNUSTEP_MAKEFILES)/subproject.make -include Makefile.postamble gnustep-base-1.29.0/Source/ObjectiveC2/Makefile.preamble000066400000000000000000000041261435650067400230020ustar00rootroot00000000000000# # Makefile.preamble # # Copyright (C) 2010 Free Software Foundation, Inc. # # Author: Scott Christley # # This file is part of the GNUstep Base Library. # # 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 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 # Library General Public License for more details. # # If you are interested in a warranty or support for this source code, # contact Scott Christley at scottc@net-community.com # # You should have received a copy of the GNU Lesser General Public # License along with this library; see the file COPYING.LIB. # If not, write to the Free Software Foundation, # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # Makefile.preamble # # Project specific makefile variables # # Do not put any Makefile rules in this file, instead they should # be put into Makefile.postamble. # # # Flags dealing with compiling and linking # # Additional flags to pass to the preprocessor ADDITIONAL_CPPFLAGS = $(DEFS) \ $(WARN_FLAGS) # Additional flags to pass to the Objective-C compiler #ADDITIONAL_OBJCFLAGS = ifeq ($(GNUSTEP_TARGET_OS),mingw32) ADDITIONAL_OBJCFLAGS += -DBUILD_libgnustep_base_DLL=1 else ifeq ($(GNUSTEP_TARGET_OS),mingw64) ADDITIONAL_OBJCFLAGS += -DBUILD_libgnustep_base_DLL=1 else ifeq ($(GNUSTEP_TARGET_OS),cygwin) ADDITIONAL_OBJCFLAGS += -DBUILD_libgnustep_base_DLL=1 else ifeq ($(GNUSTEP_TARGET_OS),windows) ADDITIONAL_OBJCFLAGS += -DBUILD_libgnustep_base_DLL=1 endif # Additional flags to pass to the C compiler ADDITIONAL_CFLAGS = # Additional include directories the compiler should search ADDITIONAL_INCLUDE_DIRS = -I../$(GNUSTEP_TARGET_DIR) -I../ -I../../Headers # Additional LDFLAGS to pass to the linker ADDITIONAL_LDFLAGS = gnustep-base-1.29.0/Source/ObjectiveC2/NSBlocks.m000066400000000000000000000045251435650067400214130ustar00rootroot00000000000000 #import #if defined (__GNU_LIBOBJC__) #warning Unable to build NSBlocks for this runtime. /* FIXME ... these let us link, but blocks will be broken. */ void *_NSConcreteStackBlock; BOOL objc_create_block_classes_as_subclasses_of(Class super) { return NO; } #else #import #import "ObjectiveC2/objc/runtime.h" #import "ObjectiveC2/objc/blocks_runtime.h" #include struct objc_class _NSConcreteGlobalBlock; struct objc_class _NSConcreteStackBlock; static struct objc_class _NSConcreteGlobalBlockMeta; static struct objc_class _NSConcreteStackBlockMeta; static struct objc_class _NSBlock; static struct objc_class _NSBlockMeta; void __objc_update_dispatch_table_for_class(Class); extern struct sarray *__objc_uninstalled_dtable; extern objc_mutex_t __objc_runtime_mutex; static void createNSBlockSubclass(Class superclass, Class newClass, Class metaClass, char *name) { // Initialize the metaclass metaClass->class_pointer = superclass->class_pointer; metaClass->super_class = superclass->class_pointer; metaClass->info = _CLS_META; metaClass->dtable = __objc_uninstalled_dtable; // Set up the new class newClass->class_pointer = metaClass; newClass->super_class = superclass; newClass->name = name; newClass->info = _CLS_CLASS; newClass->dtable = __objc_uninstalled_dtable; // Initialize the dispatch table for the class and metaclass. __objc_update_dispatch_table_for_class(metaClass); __objc_update_dispatch_table_for_class(newClass); CLS_SETINITIALIZED(metaClass); CLS_SETINITIALIZED(newClass); CLS_SETRESOLV(metaClass); CLS_SETRESOLV(newClass); // Add pointer from super class objc_mutex_lock(__objc_runtime_mutex); newClass->sibling_class = newClass->super_class->subclass_list; newClass->super_class->subclass_list = newClass; metaClass->sibling_class = metaClass->super_class->subclass_list; metaClass->super_class->subclass_list = metaClass; objc_mutex_unlock(__objc_runtime_mutex); } #define NEW_CLASS(super, sub) \ createNSBlockSubclass(super, &sub, &sub ## Meta, #sub) BOOL objc_create_block_classes_as_subclasses_of(Class super) { if (_NSBlock.super_class != NULL) { return NO; } NEW_CLASS(super, _NSBlock); NEW_CLASS(&_NSBlock, _NSConcreteStackBlock); NEW_CLASS(&_NSBlock, _NSConcreteGlobalBlock); return YES; } #endif /* defined (__GNU_LIBOBJC__) */ gnustep-base-1.29.0/Source/ObjectiveC2/README000066400000000000000000000005471435650067400204370ustar00rootroot00000000000000ObjectiveC2 framework implements the new Apple runtime APIs, introduced with OS X 10.5 on top of the GCC Objective-C runtime. Its use is now discouraged. This code has been merged into the GNUstep Objective-C-2.0 runtime, which can act as a drop-in replacement for GCC libobjc. You can find the code here: svn://svn.gna.org/svn/gnustep/libs/libobjc2/trunk gnustep-base-1.29.0/Source/ObjectiveC2/blocks_runtime.m000066400000000000000000000172731435650067400227610ustar00rootroot00000000000000/* * Copyright (c) 2009 Remy Demarest * Portions Copyright (c) 2009 David Chisnall * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation * files (the "Software"), to deal in the Software without * restriction, including without limitation the rights to use, * copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following * conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. */ #import "ObjectiveC2/objc/blocks_runtime.h" #import "ObjectiveC2/objc/runtime.h" #include #include #include #include /* Makes the compiler happy even without Foundation */ @interface Dummy - (id)retain; - (void)release; @end // Descriptor attributes enum { BLOCK_HAS_COPY_DISPOSE = (1 << 25), BLOCK_HAS_CTOR = (1 << 26), // helpers have C++ code BLOCK_IS_GLOBAL = (1 << 28), BLOCK_HAS_DESCRIPTOR = (1 << 29), // interim until complete world build is accomplished }; // _Block_object_assign() and _Block_object_dispose() flag helpers. enum { BLOCK_FIELD_IS_OBJECT = 3, // id, NSObject, __attribute__((NSObject)), block, ... BLOCK_FIELD_IS_BLOCK = 7, // a block variable BLOCK_FIELD_IS_BYREF = 8, // the on stack structure holding the __block variable BLOCK_FIELD_IS_WEAK = 16, // declared __weak BLOCK_BYREF_CALLER = 128, // called from byref copy/dispose helpers }; // Helper structure struct psy_block_literal { void *isa; // initialized to &_NSConcreteStackBlock or &_NSConcreteGlobalBlock int flags; int reserved; void (*invoke)(void *, ...); struct { unsigned long int reserved; // NULL unsigned long int size; // sizeof(struct Block_literal_1) // optional helper functions void (*copy_helper)(void *dst, void *src); void (*dispose_helper)(void *src); } *descriptor; const char *types; }; // Helper structure struct psy_block_byref_obj { void *isa; // uninitialized struct psy_block_byref_obj *forwarding; int flags; //refcount; int size; void (*byref_keep)(struct psy_block_byref_obj *dst, struct psy_block_byref_obj *src); void (*byref_dispose)(struct psy_block_byref_obj *); }; /* Certain field types require runtime assistance when being copied to the * heap. The following function is used to copy fields of types: blocks, * pointers to byref structures, and objects (including * __attribute__((NSObject)) pointers. BLOCK_FIELD_IS_WEAK is orthogonal to * the other choices which are mutually exclusive. Only in a Block copy helper * will one see BLOCK_FIELD_IS_BYREF. */ void _Block_object_assign(void *destAddr, void *object, const int flags) { //printf("Copying %x to %x with flags %x\n", object, destAddr, flags); // FIXME: Needs to be implemented if (flags & BLOCK_FIELD_IS_WEAK) { } else { if (flags & BLOCK_FIELD_IS_BYREF) { struct psy_block_byref_obj *src = object; struct psy_block_byref_obj **dst = destAddr; /* I followed Apple's specs saying byref's "flags" field should * represent the refcount but it still contains real flag, so this * is a little hack... */ if ((src->flags & ~BLOCK_HAS_COPY_DISPOSE) == 0) { *dst = malloc(src->size); memcpy(*dst, src, src->size); if (src->forwarding == src) { (*dst)->forwarding = *dst; } if (src->size >= sizeof(struct psy_block_byref_obj)) { src->byref_keep(*dst, src); } } else { *dst = src; } (*dst)->flags++; } else if ((flags & BLOCK_FIELD_IS_BLOCK) == BLOCK_FIELD_IS_BLOCK) { struct psy_block_literal *src = object; struct psy_block_literal **dst = destAddr; *dst = Block_copy(src); } else if ((flags & BLOCK_FIELD_IS_OBJECT) == BLOCK_FIELD_IS_OBJECT) { id src = object; id *dst = destAddr; *dst = [src retain]; } } } /* Similarly a compiler generated dispose helper needs to call back for each * field of the byref data structure. (Currently the implementation only packs * one field into the byref structure but in principle there could be more). * The same flags used in the copy helper should be used for each call * generated to this function: */ void _Block_object_dispose(void *object, const int flags) { // FIXME: Needs to be implemented if (flags & BLOCK_FIELD_IS_WEAK) { } else { if (flags & BLOCK_FIELD_IS_BYREF) { struct psy_block_byref_obj *src = object; src->flags--; if ((src->flags & ~BLOCK_HAS_COPY_DISPOSE) == 0) { if (src->size >= sizeof(struct psy_block_byref_obj)) src->byref_dispose(src); free(src); } } else if ((flags & ~BLOCK_BYREF_CALLER) == BLOCK_FIELD_IS_BLOCK) { struct psy_block_literal *src = object; Block_release(src); } else if ((flags & ~BLOCK_BYREF_CALLER) == BLOCK_FIELD_IS_OBJECT) { id src = object; [src release]; } } } struct StackBlockClass { void *isa; // initialized to &_NSConcreteStackBlock or &_NSConcreteGlobalBlock int flags; int reserved; void (*invoke)(void *, ...); struct { unsigned long int reserved; // NULL unsigned long int size; // sizeof(struct Block_literal_1) // optional helper functions void (*copy_helper)(void *dst, void *src); void (*dispose_helper)(void *src); } *descriptor; const char *types; }; /* Copy a block to the heap if it's still on the stack or * increments its retain count. */ void * _Block_copy(const void *src) { struct StackBlockClass *self = (struct StackBlockClass *)src; struct StackBlockClass *ret = self; extern const void _NSConcreteStackBlock; // If the block is Global, there's no need to copy it on the heap. if (self->isa == &_NSConcreteStackBlock && self->flags & BLOCK_HAS_DESCRIPTOR) { if (self->reserved == 0) { ret = malloc(self->descriptor->size); memcpy(ret, self, self->descriptor->size); if (self->flags & BLOCK_HAS_COPY_DISPOSE) self->descriptor->copy_helper(ret, self); memcpy(self, ret, self->descriptor->size); } ret->reserved++; } return ret; } // Release a block and frees the memory when the retain count hits zero. void _Block_release(const void *src) { struct StackBlockClass *self = (struct StackBlockClass *)src; extern const void _NSConcreteStackBlock; if (self->isa == &_NSConcreteStackBlock // A Global block doesn't need to be released && self->flags & BLOCK_HAS_DESCRIPTOR // Should always be true... && self->reserved > 0) // If false, then it's not allocated on the heap, we won't release auto memory ! { self->reserved--; if (self->reserved == 0) { if (self->flags & BLOCK_HAS_COPY_DISPOSE) self->descriptor->dispose_helper(self); free(self); } } } const char * _Block_get_types(const void *blk) { const struct psy_block_literal *block = blk; return block->types; } gnustep-base-1.29.0/Source/ObjectiveC2/caps.c000066400000000000000000000006171435650067400206470ustar00rootroot00000000000000#include "ObjectiveC2/objc/capabilities.h" /** * Bitmask of all of the capabilities compiled into this version of the * runtime. */ static const int caps = 0 | (1 << OBJC_CAP_EXCEPTIONS) | (1 << OBJC_CAP_SYNCRONIZE) | (1 << OBJC_CAP_PROPERTIES); int objc_test_capability(int x) { if (x >= 32) { return 0; } if (caps & (1 << x)) { return 1; } return 0; } gnustep-base-1.29.0/Source/ObjectiveC2/properties.m000066400000000000000000000032661435650067400221320ustar00rootroot00000000000000#import "Foundation/NSObject.h" #if !defined(_NATIVE_OBJC_EXCEPTIONS) /* If we don't have support for native exceptions then we can't use * @synchronized, so we use NSException and NSLock. * This is a horribly inefficient, but you probably shouldn't be using * the property functions anyway :-) */ #import "Foundation/NSException.h" #import "Foundation/NSLock.h" static NSRecursiveLock *propertyLock = nil; static inline NSRecursiveLock* pLock() { if (propertyLock == nil) { [gnustep_global_lock lock]; if (propertyLock == nil) { propertyLock = [NSRecursiveLock new]; } [gnustep_global_lock unlock]; } return propertyLock; } #define SYNCBEG(X) \ [pLock() lock]; \ NS_DURING #define SYNCEND() \ NS_HANDLER \ [pLock() unlock]; \ [localException raise]; \ NS_ENDHANDLER \ [pLock() unlock] #else #define SYNCBEG(X) @synchronized(X) { #define SYNCEND() } #endif id objc_getProperty(id obj, SEL _cmd, ptrdiff_t offset, BOOL isAtomic) { char *addr; id ret; if (isAtomic) { id result = nil; SYNCBEG(obj) result = objc_getProperty(obj, _cmd, offset, NO); SYNCEND(); return result; } addr = (char*)obj; addr += offset; ret = *(id*)addr; return [[ret retain] autorelease]; } void objc_setProperty(id obj, SEL _cmd, ptrdiff_t offset, id arg, BOOL isAtomic, BOOL isCopy) { char *addr; id old; if (isAtomic) { SYNCBEG(obj) objc_setProperty(obj, _cmd, offset, arg, NO, isCopy); SYNCEND(); return; } if (isCopy) { arg = [arg copy]; } else { arg = [arg retain]; } addr = (char*)obj; addr += offset; old = *(id*)addr; *(id*)addr = arg; [old release]; } gnustep-base-1.29.0/Source/ObjectiveC2/runtime.c000066400000000000000000000702211435650067400214020ustar00rootroot00000000000000#include "ObjectiveC2/objc/runtime.h" /* Make glibc export strdup() */ #if defined __GLIBC__ #define __USE_BSD 1 #endif #undef __objc_INCLUDE_GNU #undef __thread_INCLUDE_GNU #undef __objc_api_INCLUDE_GNU #undef __encoding_INCLUDE_GNU #define objc_object objc_object_gnu #define id object_ptr_gnu #define IMP objc_imp_gnu #define Method objc_method_gnu #define object_copy gnu_object_copy #define object_dispose gnu_object_dispose #define objc_super gnu_objc_super #define objc_msg_lookup gnu_objc_msg_lookup #define objc_msg_lookup_super gnu_objc_msg_lookup_super #define BOOL GNU_BOOL #define SEL GNU_SEL #define Protocol GNU_Protocol #define Class GNU_Class #undef YES #undef NO #undef Nil #undef nil #include #include #undef GNU_BOOL #include #undef Class #undef Protocol #undef SEL #undef objc_msg_lookup #undef objc_msg_lookup_super #undef objc_super #undef Method #undef IMP #undef id #undef objc_object // Reinstall definitions. #undef YES #undef NO #undef Nil #undef nil #define YES ((BOOL)1) #define NO ((BOOL)0) #define nil ((id)_OBJC_NULL_PTR) #define Nil ((Class)_OBJC_NULL_PTR) #include #include #include /** * Private runtime function for updating a dtable. */ void __objc_update_dispatch_table_for_class(Class); /** * Private runtime function for determining whether a class responds to a * selector. */ BOOL __objc_responds_to(id, SEL); /** * Runtime library constant for uninitialized dispatch table. */ extern struct sarray *__objc_uninstalled_dtable; /** * Mutex used to protect the ObjC runtime library data structures. */ extern objc_mutex_t __objc_runtime_mutex; /* objc_skip_argspec() is often buggy as it calls the buggy objc_skip_offset() * so we use a local version. */ static inline const char * skip_argspec(const char *types) { if (types && *types) { types = objc_skip_typespec(types); if (*types == '+') types++; while (isdigit(*types)) types++; } return types; } /** * Looks up the instance method in a specific class, without recursing into * superclasses. */ static Method class_getInstanceMethodNonrecursive(Class aClass, SEL aSelector) { if (Nil != aClass) { struct objc_method_list *methods; for (methods = aClass->methods; methods != NULL; methods = methods->method_next) { int i; for (i = 0; i < methods->method_count; i++) { Method_t method = &methods->method_list[i]; if (method->method_name->sel_id == aSelector->sel_id) { return method; } } } } return NULL; } static void objc_updateDtableForClassContainingMethod(Method m) { Class nextClass = Nil; void *state = NULL; SEL sel = method_getName(m); while (Nil != (nextClass = objc_next_class(&state))) { if (class_getInstanceMethodNonrecursive(nextClass, sel) == m) { __objc_update_dispatch_table_for_class(nextClass); return; } } } BOOL class_addIvar(Class cls, const char *name, size_t size, uint8_t alignment, const char *types) { struct objc_ivar_list *ivarlist; unsigned off; Ivar ivar; if (Nil == cls || CLS_ISRESOLV(cls) || CLS_ISMETA(cls)) { return NO; } if (class_getInstanceVariable(cls, name) != NULL) { return NO; } ivarlist = cls->ivars; if (NULL == ivarlist) { cls->ivars = malloc(sizeof(struct objc_ivar_list)); cls->ivars->ivar_count = 1; } else { ivarlist->ivar_count++; // objc_ivar_list contains one ivar. Others follow it. cls->ivars = realloc(ivarlist, sizeof(struct objc_ivar_list) + (ivarlist->ivar_count - 1) * sizeof(struct objc_ivar)); } ivar = &cls->ivars->ivar_list[cls->ivars->ivar_count - 1]; ivar->ivar_name = strdup(name); ivar->ivar_type = strdup(types); // Round up the offset of the ivar so it is correctly aligned. off = cls->instance_size >> alignment; if (off << alignment != cls->instance_size) { off++; } off = off << alignment; ivar->ivar_offset = off; // Increase the instance size to make space for this. cls->instance_size = ivar->ivar_offset + size; return YES; } BOOL class_addMethod(Class cls, SEL name, IMP imp, const char *types) { const char *methodName = sel_get_name(name); struct objc_method_list *methods; for (methods = cls->methods; methods != NULL; methods = methods->method_next) { int i; for (i = 0; i < methods->method_count; i++) { Method_t method = &methods->method_list[i]; if (strcmp(sel_get_name(method->method_name), methodName) == 0) { return NO; } } } methods = malloc(sizeof(struct objc_method_list)); methods->method_next = cls->methods; cls->methods = methods; methods->method_count = 1; methods->method_list[0].method_name = sel_register_typed_name(methodName, types); methods->method_list[0].method_types = strdup(types); methods->method_list[0].method_imp = (objc_imp_gnu) imp; if (CLS_ISRESOLV(cls)) { __objc_update_dispatch_table_for_class(cls); } return YES; } BOOL class_addProtocol(Class cls, Protocol * protocol) { struct objc_protocol_list *protocols; if (class_conformsToProtocol(cls, protocol)) { return NO; } protocols = cls->protocols; protocols = malloc(sizeof(struct objc_protocol_list)); if (protocols == NULL) { return NO; } protocols->next = cls->protocols; protocols->count = 1; protocols->list[0] = protocol; cls->protocols = protocols; return YES; } Ivar * class_copyIvarList(Class cls, unsigned int *outCount) { struct objc_ivar_list *ivarlist = cls->ivars; unsigned int count = 0; unsigned int index; Ivar *list; if (ivarlist != NULL) { count = ivarlist->ivar_count; } if (outCount != NULL) { *outCount = count; } if (count == 0) { return NULL; } list = malloc((count + 1) * sizeof(struct objc_ivar *)); list[count] = NULL; count = 0; for (index = 0; index < ivarlist->ivar_count; index++) { list[count++] = &ivarlist->ivar_list[index]; } return list; } Method * class_copyMethodList(Class cls, unsigned int *outCount) { unsigned int count = 0; Method *list; struct objc_method_list *methods; for (methods = cls->methods; methods != NULL; methods = methods->method_next) { count += methods->method_count; } if (outCount != NULL) { *outCount = count; } if (count == 0) { return NULL; } list = malloc((count + 1) * sizeof(struct objc_method *)); list[count] = NULL; count = 0; for (methods = cls->methods; methods != NULL; methods = methods->method_next) { unsigned int index; for (index = 0; index < methods->method_count; index++) { list[count++] = &methods->method_list[index]; } } return list; } Protocol ** class_copyProtocolList(Class cls, unsigned int *outCount) { struct objc_protocol_list *protocolList = cls->protocols; struct objc_protocol_list *list; unsigned int count = 0; Protocol **protocols; for (list = protocolList; list != NULL; list = list->next) { count += list->count; } if (outCount != NULL) { *outCount = count; } if (count == 0) { return NULL; } protocols = malloc((count + 1) * sizeof(Protocol *)); protocols[count] = NULL; count = 0; for (list = protocolList; list != NULL; list = list->next) { memcpy(&protocols[count], list->list, list->count * sizeof(Protocol *)); count += list->count; } return protocols; } id class_createInstance(Class cls, size_t extraBytes) { extern id NSAllocateObject(Class, uintptr_t, void*); return NSAllocateObject(cls, extraBytes, 0); } Method class_getInstanceMethod(Class aClass, SEL aSelector) { Method method = class_getInstanceMethodNonrecursive(aClass, aSelector); if (method == NULL) { // TODO: Check if this should be NULL or aClass Class superclass = class_getSuperclass(aClass); if (superclass == NULL) { return NULL; } return class_getInstanceMethod(superclass, aSelector); } return method; } Method class_getClassMethod(Class aClass, SEL aSelector) { if (Nil == aClass) { return NULL; } return class_getInstanceMethod(aClass->class_pointer, aSelector); } Ivar class_getClassVariable(Class cls, const char *name) { assert(0 && "Class variables not implemented"); return NULL; } size_t class_getInstanceSize(Class cls) { if (Nil == cls) { return 0; } return cls->instance_size; } Ivar class_getInstanceVariable(Class cls, const char *name) { if (Nil != cls && NULL != name) { while (cls != Nil) { struct objc_ivar_list *ivarlist = cls->ivars; if (ivarlist != NULL) { int i; for (i = 0; i < ivarlist->ivar_count; i++) { Ivar ivar = &ivarlist->ivar_list[i]; if (strcmp(ivar->ivar_name, name) == 0) { return ivar; } } } cls = class_getSuperclass(cls); } } return NULL; } void object_setIvar(id object, Ivar ivar, id value) { char *addr = (char*)object; addr += ivar_getOffset(ivar); *(id*)addr = value; } Ivar object_setInstanceVariable(id obj, const char *name, void *value) { Ivar ivar = class_getInstanceVariable(object_getClass(obj), name); object_setIvar(obj, ivar, value); return ivar; } id object_getIvar(id object, Ivar ivar) { return *(id*)(((char*)object) + ivar_getOffset(ivar)); } Ivar object_getInstanceVariable(id obj, const char *name, void **outValue) { Ivar ivar = class_getInstanceVariable(object_getClass(obj), name); if (NULL != outValue) { *outValue = object_getIvar(obj, ivar); } return ivar; } // The format of the char* is undocumented. This function is only ever used in // conjunction with class_setIvarLayout(). const char * class_getIvarLayout(Class cls) { if (Nil == cls) { return 0; } return (char *) cls->ivars; } /* For the next two functions ... * It would be nice to use objc_msg_lookup(), but we can't because that * requires an instance rather than a class as its argument. Trying to * pass the address of the class as if it was an instance won't work since * the instance variables will be missing and any forwarding callback used * by a proxy may try to use the instance variables and crash/fail in * interesting ways. */ IMP class_getMethodImplementation(Class cls, SEL name) { if (Nil == cls || 0 == name) { return 0; } return (IMP) get_imp(cls, name); } IMP class_getMethodImplementation_stret(Class cls, SEL name) { if (Nil == cls || 0 == name) { return 0; } return (IMP) get_imp(cls, name); } const char * class_getName(Class cls) { if (Nil == cls) { return "nil"; // This is what OSX does. } if (CLS_ISCLASS(cls) || CLS_ISMETA(cls)) { return cls->name; } return NULL; } void __objc_resolve_class_links(void); Class class_getSuperclass(Class cls) { if (Nil == cls) { return 0; } if (!CLS_ISRESOLV(cls)) { /* This class is not yet resolved ... so lookup superclass by name. * We need to allow for this case because we might doing a lookup in * a class which has not yet been registered with the runtime and * which might have ivars or methods added after this call (so we * mustn't resolve this class now). */ return (Class)objc_getClass((const char*)cls->super_class); } return cls->super_class; } int class_getVersion(Class cls) { if (Nil == cls) { return 0; } return class_get_version(cls); } const char * class_getWeakIvarLayout(Class cls) { assert(0 && "Weak ivars not supported"); return NULL; } BOOL class_isMetaClass(Class cls) { if (Nil == cls || !CLS_ISMETA(cls)) { return NO; } return YES; } IMP class_replaceMethod(Class cls, SEL name, IMP imp, const char *types) { Method method = class_getInstanceMethodNonrecursive(cls, name); if (method == NULL) { class_addMethod(cls, name, imp, types); return NULL; } else { IMP old = (IMP) method->method_imp; method->method_imp = (objc_imp_gnu) imp; if (CLS_ISRESOLV(cls)) { __objc_update_dispatch_table_for_class(cls); } return old; } } BOOL class_respondsToSelector(Class cls, SEL sel) { if (cls != 0 && sel != 0 && __objc_responds_to((id) & cls, sel) != 0) return YES; return NO; } void class_setIvarLayout(Class cls, const char *layout) { struct objc_ivar_list *list = (struct objc_ivar_list *) layout; size_t listsize = sizeof(struct objc_ivar_list) + sizeof(struct objc_ivar) * (list->ivar_count - 1); cls->ivars = malloc(listsize); memcpy(cls->ivars, list, listsize); } OBJC_DEPRECATED Class class_setSuperclass(Class cls, Class newSuper) { Class oldSuper = cls->super_class; cls->super_class = newSuper; return oldSuper; } void class_setVersion(Class theClass, int version) { class_set_version(theClass, version); } void class_setWeakIvarLayout(Class cls, const char *layout) { assert(0 && "Not implemented"); } const char * ivar_getName(Ivar ivar) { return ivar->ivar_name; } ptrdiff_t ivar_getOffset(Ivar ivar) { return ivar->ivar_offset; } const char * ivar_getTypeEncoding(Ivar ivar) { return ivar->ivar_type; } static size_t lengthOfTypeEncoding(const char *types) { const char *end = skip_argspec(types); size_t length; end--; while (isdigit(*end)) { end--; } length = end - types + 1; return length; } static char * copyTypeEncoding(const char *types) { size_t length = lengthOfTypeEncoding(types); char *copy = malloc(length + 1); memcpy(copy, types, length); copy[length] = '\0'; return copy; } static const char * findParameterStart(const char *types, unsigned int index) { unsigned int i; for (i = 0; i < index; i++) { types = skip_argspec(types); if ('\0' == *types) { return NULL; } } return types; } char * method_copyArgumentType(Method method, unsigned int index) { const char *types = findParameterStart(method->method_types, index); if (NULL == types) { return NULL; } return copyTypeEncoding(types); } char * method_copyReturnType(Method method) { return copyTypeEncoding(method->method_types); } void method_exchangeImplementations(Method m1, Method m2) { IMP tmp = (IMP) m1->method_imp; m1->method_imp = m2->method_imp; m2->method_imp = (objc_imp_gnu) tmp; objc_updateDtableForClassContainingMethod(m1); objc_updateDtableForClassContainingMethod(m2); } void method_getArgumentType(Method method, unsigned int index, char *dst, size_t dst_len) { const char *types; size_t length; types = findParameterStart(method->method_types, index); if (NULL == types) { strncpy(dst, "", dst_len); return; } length = lengthOfTypeEncoding(types); if (length < dst_len) { memcpy(dst, types, length); dst[length] = '\0'; } else { memcpy(dst, types, dst_len); } } IMP method_getImplementation(Method method) { return method ? (IMP) method->method_imp : (IMP) 0; } SEL method_getName(Method method) { return method ? method->method_name : (SEL) 0; } unsigned method_getNumberOfArguments(Method method) { if (0 == method) { return 0; } else { unsigned int count = 0; const char *types = method->method_types; while ('\0' != *types) { types = skip_argspec(types); count++; } return count - 1; } } void method_getReturnType(Method method, char *dst, size_t dst_len) { if (0 == method) { if (dst_len > 0) { dst[0] = '\0'; } } else { //TODO: Coped and pasted code. Factor it out. const char *types = method->method_types; size_t length = lengthOfTypeEncoding(types); if (length < dst_len) { memcpy(dst, types, length); dst[length] = '\0'; } else if (dst_len > 0) { memcpy(dst, types, dst_len); } } } const char * method_getTypeEncoding(Method method) { if (0 == method) { return 0; } return method->method_types; } IMP method_setImplementation(Method method, IMP imp) { if (0 == method) { return (IMP)0; } else { IMP old = (IMP) method->method_imp; method->method_imp = (objc_imp_gnu) old; objc_updateDtableForClassContainingMethod(method); return old; } } id objc_getClass(const char *name) { return (id) objc_get_class(name); } int objc_getClassList(Class * buffer, int bufferLen) { int count = 0; if (buffer == NULL) { void *state = NULL; while (Nil != objc_next_class(&state)) { count++; } } else { Class nextClass; void *state = NULL; while (Nil != (nextClass = objc_next_class(&state)) && bufferLen > 0) { count++; bufferLen--; *(buffer++) = nextClass; } } return count; } id objc_getMetaClass(const char *name) { Class cls = (Class) objc_getClass(name); return cls == Nil ? nil : (id) cls->class_pointer; } id objc_getRequiredClass(const char *name) { id cls = objc_getClass(name); if (nil == cls) { abort(); } return cls; } id objc_lookUpClass(const char *name) { // TODO: Check these are the right way around. return (id) objc_lookup_class(name); } static void freeMethodLists(Class aClass) { struct objc_method_list *methods = aClass->methods; struct objc_method_list *current; while (methods != NULL) { int i; for (i = 0; i < methods->method_count; i++) { free((void *) methods->method_list[i].method_types); } current = methods; methods = methods->method_next; free(current); } } static void freeIvarLists(Class aClass) { struct objc_ivar_list *ivarlist = aClass->ivars; int i; if (NULL == ivarlist) { return; } for (i = 0; i < ivarlist->ivar_count; i++) { Ivar ivar = &ivarlist->ivar_list[i]; free((void *) ivar->ivar_type); free((void *) ivar->ivar_name); } free(ivarlist); } /* * Removes a class from the subclass list found on its super class. * Must be called with the objc runtime mutex locked. */ static inline void safe_remove_from_subclass_list(Class cls) { Class sub = cls->super_class->subclass_list; if (sub == cls) { cls->super_class->subclass_list = cls->sibling_class; } else { while (sub != NULL) { if (sub->sibling_class == cls) { sub->sibling_class = cls->sibling_class; break; } sub = sub->sibling_class; } } } void objc_disposeClassPair(Class cls) { Class meta; if (cls == 0) { return; } meta = ((id) cls)->isa; if (objc_lookUpClass (class_getName (cls)) == (id)cls) { fprintf(stderr, "*** ERROR *** function objc_disposeClassPair() called " "on registered class pair '%s'\n", class_getName(cls)); return; /* The runtime provides no mechanism to remove a class. The following code essentially frees the memory used by a class without fully removing it ... which obviously tends to cause random crashes later on if anything tries to use the class or to traverse data structures containing the class. Indeed, it's hard to see how this function could ever be made to work (what if there are subclasses of the class being removed, or if there are instances of the class?) even with changes to the runtime. // Remove from the runtime system so nothing tries updating the dtable // while we are freeing the class. objc_mutex_lock(__objc_runtime_mutex); safe_remove_from_subclass_list(meta); safe_remove_from_subclass_list(cls); objc_mutex_unlock(__objc_runtime_mutex); */ } // Free the method and ivar lists. freeMethodLists(cls); freeMethodLists(meta); freeIvarLists(cls); // Free the class and metaclass free(meta); free(cls); } Class objc_allocateClassPair(Class superclass, const char *name, size_t extraBytes) { Class newClass; Class metaClass; // Check the class doesn't already exist. if (nil != objc_lookUpClass(name)) { return Nil; } newClass = calloc(1, sizeof(struct objc_class) + extraBytes); if (Nil == newClass) { return Nil; } // Create the metaclass metaClass = calloc(1, sizeof(struct objc_class)); // Initialize the metaclass metaClass->class_pointer = superclass->class_pointer->class_pointer; metaClass->super_class = superclass->class_pointer; metaClass->name = strdup(name); metaClass->info = _CLS_META; metaClass->dtable = __objc_uninstalled_dtable; metaClass->instance_size = sizeof(struct objc_class); // Set up the new class newClass->class_pointer = metaClass; // Set the superclass pointer to the name. The runtime will fix this when // the class links are resolved. newClass->super_class = (Class) superclass->name; newClass->name = strdup(name); newClass->info = _CLS_CLASS; newClass->dtable = __objc_uninstalled_dtable; newClass->instance_size = superclass->instance_size; return newClass; } Class objc_allocateMetaClass(Class superclass, size_t extraBytes) { Class metaClass = calloc(1, sizeof(struct objc_class) + extraBytes); // Initialize the metaclass metaClass->class_pointer = superclass->class_pointer->class_pointer; metaClass->super_class = superclass->class_pointer; metaClass->name = "hidden class"; //strdup(superclass->name); metaClass->info = _CLS_RESOLV | _CLS_INITIALIZED | _CLS_META; metaClass->dtable = __objc_uninstalled_dtable; metaClass->instance_size = sizeof(struct objc_class); return metaClass; } void * object_getIndexedIvars(id obj) { if (class_isMetaClass(obj->isa)) { return ((char *) obj) + sizeof(struct objc_class); } return ((char *) obj) + obj->isa->instance_size; } Class object_getClass(id obj) { if (nil != obj) { return obj->isa; } return Nil; } Class object_setClass(id obj, Class cls) { if (nil != obj) { Class oldClass = obj->isa; obj->isa = cls; return oldClass; } return Nil; } const char * object_getClassName(id obj) { return class_getName(object_getClass(obj)); } void __objc_add_class_to_hash(Class cls); void __objc_resolve_class_links(void); void objc_registerClassPair(Class cls) { Class metaClass; Class existing; if (Nil == cls) { fprintf(stderr, "*** ERROR *** function objc_registerClassPair() called " "on Nil class pair '%s'\n", class_getName(cls)); } existing = (Class)objc_lookUpClass (class_getName (cls)); if (existing == cls) { return; // Already registered } else if (Nil != existing) { fprintf(stderr, "*** ERROR *** function objc_registerClassPair() called " "for class pair with name ('%s') of existing class.\n", class_getName(cls)); return; } // Initialize the dispatch table for the class and metaclass. metaClass = cls->class_pointer; __objc_update_dispatch_table_for_class(metaClass); __objc_update_dispatch_table_for_class(cls); __objc_add_class_to_hash(cls); // Add pointer from super class __objc_resolve_class_links(); } /* static id objectNew(id cls) { static SEL newSel = NULL; IMP newIMP; if (NULL == newSel) { newSel = sel_get_uid("new"); } newIMP = (IMP) objc_msg_lookup((void *) cls, newSel); return newIMP((id) cls, newSel); } */ Protocol * objc_getProtocol(const char *name) { Protocol *p = NULL; Class cls; void *iterator = NULL; /* Protocols are not centrally registered in the GNU runtime. * So we just find the first match we can. */ while (p == NULL && (cls = objc_next_class(&iterator))) { struct objc_protocol_list *pcllist = cls->protocols; size_t i; while (p == NULL && pcllist != NULL) { for (i = 0; i < pcllist->count; i++) { if (strcmp(pcllist->list[i]->protocol_name, name) == 0) { p = (Protocol*)pcllist->list[i]; break; } } pcllist = pcllist->next; } } return p; } Protocol ** objc_copyProtocolList(unsigned int *count) { *count = 0; return NULL; } BOOL protocol_conformsToProtocol(Protocol *p1, Protocol *p2) { struct objc_protocol_list *list = p1->protocol_list; // A protocol trivially conforms to itself if (strcmp(p1->protocol_name, p2->protocol_name) == 0) { return YES; } for (list = p1->protocol_list; list != NULL; list = list->next) { int i; for (i = 0; i < list->count; i++) { if (strcmp(list->list[i]->protocol_name, p2->protocol_name) == 0) { return YES; } if (protocol_conformsToProtocol((Protocol*)list->list[i], p2)) { return YES; } } } return NO; } BOOL class_conformsToProtocol(Class cls, Protocol *protocol) { struct objc_protocol_list *protocols; while (cls) { for (protocols = cls->protocols; protocols != NULL; protocols = protocols->next) { int i; for (i = 0; i < protocols->count; i++) { Protocol *p1 = (Protocol*)protocols->list[i]; if (strcmp(p1->protocol_name, protocol->protocol_name) == 0) { return YES; } if (protocol_conformsToProtocol(p1, protocol)) { return YES; } } } cls = cls->super_class; } return NO; } struct objc_method_description_list { int count; struct objc_method_description list[1]; }; struct objc_method_description * protocol_copyMethodDescriptionList(Protocol *p, BOOL isRequiredMethod, BOOL isInstanceMethod, unsigned int *count) { struct objc_method_description *output = NULL; unsigned int outputCount = 0; struct objc_method_description_list *methods; if (isInstanceMethod) { methods = p->instance_methods; } else { methods = p->class_methods; } if (methods != NULL) { int i; outputCount = methods->count; output = malloc(outputCount * sizeof(struct objc_method_description)); for (i = 0; i < methods->count; i++) { output[i] = methods->list[i]; // HACK: the name field of the objc_method_description struct // is supposed to be a selector, but testing reveals it is a string output[i].name = sel_registerName((const char *) output[i].name); } } *count = outputCount; return output; } Protocol ** protocol_copyProtocolList(Protocol * p, unsigned int *count) { Protocol **output = NULL; unsigned int outputCount = 0; struct objc_protocol_list *list; for (list = p->protocol_list; list != NULL; list = list->next) { int i; for (i = 0; i < list->count; i++) { outputCount++; } } if (outputCount > 0) { output = malloc(outputCount * sizeof(Protocol *)); } for (list = p->protocol_list; list != NULL; list = list->next) { int i; for (i = 0; i < list->count; i++) { output[i] = (Protocol*)list->list[i]; } } *count = outputCount; return output; } const char * protocol_getName(Protocol * p) { if (NULL != p) { return p->protocol_name; } return NULL; } struct objc_method_description protocol_getMethodDescription(Protocol *p, SEL aSel, BOOL isRequiredMethod, BOOL isInstanceMethod) { struct objc_method_description output = {NULL, NULL}; if (p != NULL) { struct objc_method_description_list *methods; const char *name = sel_getName(aSel); int i; if (isInstanceMethod) { methods = p->instance_methods; } else { methods = p->class_methods; } if (methods != NULL) { for (i = 0; i < methods->count; i++) { if (!strcmp((char*)methods->list[i].name, name)) { output = methods->list[i]; // HACK: the name field of the objc_method_description struct // is supposed to be a selector, but testing reveals it is a string output.name = sel_registerName((const char *) output.name); break; } } } } return output; } BOOL protocol_isEqual(Protocol * p, Protocol * other) { if (NULL == p || NULL == other) { return NO; } if (p == other || 0 == strcmp(p->protocol_name, other->protocol_name)) { return YES; } return NO; } const char * sel_getName(SEL sel) { if (sel == 0) return ""; return sel_get_name(sel); } SEL sel_getUid(const char *selName) { return sel_registerName(selName); } BOOL sel_isEqual(SEL sel1, SEL sel2) { return sel_eq(sel1, sel2) ? YES : NO; } SEL sel_registerName(const char *selName) { if (selName == 0) return 0; return sel_register_name(selName); } gnustep-base-1.29.0/Source/ObjectiveC2/sync.m000066400000000000000000000114761435650067400207140ustar00rootroot00000000000000/* The implementation of synchronization primitives for Objective-C. Copyright (C) 2008 Free Software Foundation, Inc. Gregory Casamento This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #include #include "objc/objc.h" #include "objc/objc-api.h" #include "objc/thr.h" /* * Node structure... */ typedef struct lock_node { id obj; objc_mutex_t lock; struct lock_node *next; struct lock_node *prev; } lock_node_t; /* * Return types for the locks... */ typedef enum { OBJC_SYNC_SUCCESS = 0, OBJC_SYNC_NOT_OWNING_THREAD_ERROR = -1, OBJC_SYNC_TIMED_OUT = -2, OBJC_SYNC_NOT_INITIALIZED = -3 } sync_return_t; static lock_node_t *lock_list = NULL; static objc_mutex_t table_lock = NULL; /** * Initialize the table lock. */ static void sync_lock_init() { if (table_lock == NULL) { table_lock = objc_mutex_allocate(); } } /** * Find the node in the list. */ static lock_node_t* sync_find_node(id obj) { lock_node_t *current = lock_list; if (lock_list != NULL) { // iterate over the list looking for the end... while (current != NULL) { // if the current object is the one, breal and // return that node. if (current->obj == obj) { break; } // get the next one... current = current->next; } } return current; } /** * Add a node for the object, if one doesn't already exist. */ static lock_node_t* sync_add_node(id obj) { lock_node_t *current = NULL; // get the lock... sync_lock_init(); // if the list hasn't been initialized, initialize it. if (lock_list == NULL) { // instantiate the new node and set the list... lock_list = malloc(sizeof(lock_node_t)); // set the current node to the last in the list... current = lock_list; // set next and prev... current->prev = NULL; current->next = NULL; } else { lock_node_t *new_node = NULL; current = lock_list; // look for the end of the list. while (current->next) { current = current->next; } // instantiate the new node... new_node = malloc(sizeof(lock_node_t)); if (new_node != NULL) { // set next and prev... current->next = new_node; new_node->prev = current; new_node->next = NULL; // set the current node to the last in the list... current = new_node; } } if (current != NULL) { // add the object and it's lock current->obj = obj; current->lock = objc_mutex_allocate(); } return current; } /** * Add a lock for the object. */ int objc_sync_enter(id obj) { lock_node_t *node = NULL; int status = 0; // lock access to the table until we're done.... sync_lock_init(); objc_mutex_lock(table_lock); node = sync_find_node(obj); if (node == NULL) { node = sync_add_node(obj); if (node == NULL) { // unlock the table.... objc_mutex_unlock(table_lock); return OBJC_SYNC_NOT_INITIALIZED; } } // unlock the table.... objc_mutex_unlock(table_lock); status = objc_mutex_lock(node->lock); // if the status is more than one, then another thread // has this section locked, so we abort. A status of -1 // indicates that an error occurred. if (status > 1 || status == -1) { return OBJC_SYNC_NOT_OWNING_THREAD_ERROR; } return OBJC_SYNC_SUCCESS; } /** * Remove a lock for the object. */ int objc_sync_exit(id obj) { lock_node_t *node = NULL; int status = 0; // lock access to the table until we're done.... sync_lock_init(); objc_mutex_lock(table_lock); node = sync_find_node(obj); if (node == NULL) { // unlock the table.... objc_mutex_unlock(table_lock); return OBJC_SYNC_NOT_INITIALIZED; } status = objc_mutex_unlock(node->lock); // unlock the table.... objc_mutex_unlock(table_lock); // if the status is not zero, then we are not the sole // owner of this node. Also if -1 is returned, this indicates and error // condition. if (status > 0 || status == -1) { return OBJC_SYNC_NOT_OWNING_THREAD_ERROR; } return OBJC_SYNC_SUCCESS; } gnustep-base-1.29.0/Source/callframe.h000066400000000000000000000031061435650067400175510ustar00rootroot00000000000000/* callframe - Wrapper/Objective-C interface for ffcall function interface Copyright (C) 2000, Free Software Foundation, Inc. Written by: Adam Fedor Created: Nov 2000 This file is part of the GNUstep Base Library. 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 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 USA. */ #ifndef callframe_h_INCLUDE #define callframe_h_INCLUDE #include "Foundation/NSMethodSignature.h" #include "GNUstepBase/DistributedObjects.h" @class NSInvocation; typedef struct _callframe_t { int nargs; void *rtype; void **args; } callframe_t; extern callframe_t *callframe_from_signature (NSMethodSignature *info, void **retval); extern void callframe_set_arg(callframe_t *cframe, int index, void *buffer, int size); extern void callframe_get_arg(callframe_t *cframe, int index, void *buffer, int size); extern void *callframe_arg_addr(callframe_t *cframe, int index); #endif gnustep-base-1.29.0/Source/callframe.m000066400000000000000000000104461435650067400175630ustar00rootroot00000000000000/** callframe.m - Wrapper/Objective-C interface for ffcall function interface Copyright (C) 2000, Free Software Foundation, Inc. Written by: Adam Fedor Created: Nov 2000 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #ifdef HAVE_MALLOC_H #include #endif #ifdef HAVE_ALLOCA_H #include #endif #include "callframe.h" #import "Foundation/NSException.h" #import "Foundation/NSData.h" #import "GSInvocation.h" #if defined(ALPHA) || (defined(MIPS) && (_MIPS_SIM == _ABIN32)) typedef long long smallret_t; #else typedef int smallret_t; #endif callframe_t * callframe_from_signature (NSMethodSignature *info, void **retval) { unsigned size = sizeof(callframe_t); unsigned align = __alignof(double); unsigned offset = 0; unsigned numargs = [info numberOfArguments]; void *buf; int i; callframe_t *cframe; if (numargs > 0) { if (size % align != 0) { size += align - (size % align); } offset = size; size += numargs * sizeof(void*); if (size % align != 0) { size += (align - (size % align)); } for (i = 0; i < numargs; i++) { const char *type = [info getArgumentTypeAtIndex: i]; type = objc_skip_type_qualifiers (type); size += objc_sizeof_type (type); if (size % align != 0) { size += (align - size % align); } } } /* * If we need space allocated to store a return value, * make room for it at the end of the callframe so we * only need to do a single malloc. */ if (retval) { const char *type; unsigned full = size; unsigned pos; unsigned ret; type = [info methodReturnType]; type = objc_skip_type_qualifiers (type); if (full % align != 0) { full += (align - full % align); } if (full % 8 != 0) { full += (8 - full % 8); } pos = full; ret = MAX(objc_sizeof_type (type), sizeof(double)); /* The addition of a constant '8' is a fudge applied simply because * some return values write beynd the end of the memory if the buffer * is sized exactly ... don't know why. */ full += ret + 8; cframe = buf = NSZoneCalloc(NSDefaultMallocZone(), full, 1); if (cframe) { *retval = buf + pos; } } else { cframe = buf = NSZoneCalloc(NSDefaultMallocZone(), size, 1); } if (cframe) { cframe->nargs = numargs; cframe->args = buf + offset; offset += numargs * sizeof(void*); if (offset % align != 0) { offset += align - (offset % align); } for (i = 0; i < cframe->nargs; i++) { const char *type = [info getArgumentTypeAtIndex: i]; cframe->args[i] = buf + offset; type = objc_skip_type_qualifiers (type); offset += objc_sizeof_type (type); if (offset % align != 0) { offset += (align - offset % align); } } } return cframe; } void callframe_set_arg(callframe_t *cframe, int index, void *buffer, int size) { if (index < 0 || index >= cframe->nargs) return; memcpy(cframe->args[index], buffer, size); } void callframe_get_arg(callframe_t *cframe, int index, void *buffer, int size) { if (index < 0 || index >= cframe->nargs) return; memcpy(buffer, cframe->args[index], size); } void * callframe_arg_addr(callframe_t *cframe, int index) { if (index < 0 || index >= cframe->nargs) return NULL; return cframe->args[index]; } gnustep-base-1.29.0/Source/cifframe.h000066400000000000000000000037731435650067400174110ustar00rootroot00000000000000/* cifframe - Wrapper/Objective-C interface for ffi function interface Copyright (C) 1999, Free Software Foundation, Inc. Written by: Adam Fedor Created: Feb 2000 This file is part of the GNUstep Base Library. 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 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 02111 USA. */ #ifndef cifframe_h_INCLUDE #define cifframe_h_INCLUDE #include #if defined(_WIN32) /* * Avoid conflicts when other headers try to define UINT32 and UINT64 */ #if defined(UINT32) #undef UINT32 #endif #if defined(UINT64) #undef UINT64 #endif #endif #import "Foundation/NSMethodSignature.h" #import "GNUstepBase/DistributedObjects.h" #import "GSPrivate.h" typedef struct _cifframe_t { ffi_cif cif; int nargs; ffi_type **arg_types; void **values; } cifframe_t; @class NSMutableData; extern NSMutableData *cifframe_from_signature (NSMethodSignature *info); extern GSCodeBuffer* cifframe_closure (NSMethodSignature *sig, void (*func)()); extern void cifframe_set_arg(cifframe_t *cframe, int index, void *buffer, int size); extern void cifframe_get_arg(cifframe_t *cframe, int index, void *buffer, int size); extern void *cifframe_arg_addr(cifframe_t *cframe, int index); extern BOOL cifframe_decode_arg (const char *type, void* buffer); extern BOOL cifframe_encode_arg (const char *type, void* buffer); #endif gnustep-base-1.29.0/Source/cifframe.m000066400000000000000000000407651435650067400174200ustar00rootroot00000000000000/** cifframe.m - Wrapper/Objective-C interface for ffi function interface Copyright (C) 1999-2015 Free Software Foundation, Inc. Written by: Adam Fedor Date: Dec 1999, rewritten Apr 2002 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #if !defined (__GNU_LIBOBJC__) # include #endif #ifdef HAVE_MALLOC_H #if !defined(__OpenBSD__) #include #endif #endif #ifdef HAVE_ALLOCA_H #include #endif #include "cifframe.h" #import "Foundation/NSException.h" #import "Foundation/NSData.h" #import "GSInvocation.h" #import "GSPrivate.h" /* ffi defines types in a very odd way that doesn't map to the normal objective-c type (see ffi.h). Here we make up for that */ #if GS_SIZEOF_SHORT == 2 #define gsffi_type_ushort ffi_type_uint16 #define gsffi_type_sshort ffi_type_sint16 #elif GS_SIZEOF_SHORT == 4 #define gsffi_type_ushort ffi_type_uint32 #define gsffi_type_sshort ffi_type_sint32 #else #error FFI Sizeof SHORT case not handled #endif #if GS_SIZEOF_INT == 2 #define gsffi_type_uint ffi_type_uint16 #define gsffi_type_sint ffi_type_sint16 #elif GS_SIZEOF_INT == 4 #define gsffi_type_uint ffi_type_uint32 #define gsffi_type_sint ffi_type_sint32 #elif GS_SIZEOF_INT == 8 #define gsffi_type_uint ffi_type_uint64 #define gsffi_type_sint ffi_type_sint64 #else #error FFI Sizeof INT case not handled #endif #if GS_SIZEOF_LONG == 2 #define gsffi_type_ulong ffi_type_uint16 #define gsffi_type_slong ffi_type_sint16 #elif GS_SIZEOF_LONG == 4 #define gsffi_type_ulong ffi_type_uint32 #define gsffi_type_slong ffi_type_sint32 #elif GS_SIZEOF_LONG == 8 #define gsffi_type_ulong ffi_type_uint64 #define gsffi_type_slong ffi_type_sint64 #else #error FFI Sizeof LONG case not handled #endif #ifdef _C_LNG_LNG #if GS_SIZEOF_LONG_LONG == 8 #define gsffi_type_ulong_long ffi_type_uint64 #define gsffi_type_slong_long ffi_type_sint64 #else #error FFI Sizeof LONG LONG case not handled #endif #endif ffi_type *cifframe_type(const char *typePtr, const char **advance); /* Best guess at the space needed for a structure, since we don't know for sure until it's calculated in ffi_prep_cif, which is too late */ int cifframe_guess_struct_size(ffi_type *stype) { int i, size; unsigned align = __alignof(double); if (stype->elements == NULL) return stype->size; size = 0; i = 0; while (stype->elements[i]) { if (stype->elements[i]->elements) size += cifframe_guess_struct_size(stype->elements[i]); else size += stype->elements[i]->size; if (size % align != 0) { size += (align - size % align); } i++; } return size; } NSMutableData * cifframe_from_signature (NSMethodSignature *info) { unsigned size = sizeof(cifframe_t); unsigned align = __alignof(double); unsigned type_offset = 0; unsigned offset = 0; NSMutableData *result; void *buf; int i; int numargs = [info numberOfArguments]; ffi_type *rtype; ffi_type *arg_types[numargs]; cifframe_t *cframe; /* FIXME: in cifframe_type, return values/arguments that are structures have custom ffi_types with are allocated separately. We should allocate them in our cifframe so we don't leak memory. Or maybe we could cache structure types? */ rtype = cifframe_type([info methodReturnType], NULL); for (i = 0; i < numargs; i++) { arg_types[i] = cifframe_type([info getArgumentTypeAtIndex: i], NULL); } if (numargs > 0) { if (size % align != 0) { size += align - (size % align); } type_offset = size; /* Make room to copy the arg_types */ size += sizeof(ffi_type *) * numargs; if (size % align != 0) { size += align - (size % align); } offset = size; size += numargs * sizeof(void*); if (size % align != 0) { size += (align - (size % align)); } for (i = 0; i < numargs; i++) { if (arg_types[i]->elements) size += cifframe_guess_struct_size(arg_types[i]); else size += arg_types[i]->size; if (size % align != 0) { size += (align - size % align); } } } result = [NSMutableData dataWithCapacity: size]; [result setLength: size]; cframe = buf = [result mutableBytes]; if (cframe) { cframe->nargs = numargs; cframe->arg_types = buf + type_offset; memcpy(cframe->arg_types, arg_types, sizeof(ffi_type *) * numargs); cframe->values = buf + offset; if (ffi_prep_cif (&cframe->cif, FFI_DEFAULT_ABI, numargs, rtype, cframe->arg_types) != FFI_OK) { cframe = NULL; result = NULL; } else { /* Set values locations. This must be done after ffi_prep_cif so that any structure sizes get calculated first. */ offset += numargs * sizeof(void*); if (offset % align != 0) { offset += align - (offset % align); } for (i = 0; i < numargs; i++) { cframe->values[i] = buf + offset; offset += arg_types[i]->size; if (offset % align != 0) { offset += (align - offset % align); } } } } return result; } void cifframe_set_arg(cifframe_t *cframe, int index, void *buffer, int size) { if (index < 0 || index >= cframe->nargs) return; memcpy(cframe->values[index], buffer, size); } void cifframe_get_arg(cifframe_t *cframe, int index, void *buffer, int size) { if (index < 0 || index >= cframe->nargs) return; memcpy(buffer, cframe->values[index], size); } void * cifframe_arg_addr(cifframe_t *cframe, int index) { if (index < 0 || index >= cframe->nargs) return NULL; return cframe->values[index]; } /* * Get the ffi_type for this type */ ffi_type * cifframe_type(const char *typePtr, const char **advance) { static ffi_type stypeNSPoint = { 0 }; static ffi_type stypeNSRange = { 0 }; static ffi_type stypeNSRect = { 0 }; static ffi_type stypeNSSize = { 0 }; const char *type; ffi_type *ftype = 0; typePtr = objc_skip_type_qualifiers (typePtr); type = typePtr; /* * Scan for size and alignment information. */ switch (*typePtr++) { case _C_ID: ftype = &ffi_type_pointer; break; case _C_CLASS: ftype = &ffi_type_pointer; break; case _C_SEL: ftype = &ffi_type_pointer; break; case _C_CHR: ftype = &ffi_type_schar; break; case _C_UCHR: ftype = &ffi_type_uchar; break; case _C_SHT: ftype = &gsffi_type_sshort; break; case _C_USHT: ftype = &gsffi_type_ushort; break; case _C_INT: ftype = &gsffi_type_sint; break; case _C_UINT: ftype = &gsffi_type_uint; break; case _C_LNG: ftype = &gsffi_type_slong; break; case _C_ULNG: ftype = &gsffi_type_ulong; break; #ifdef _C_LNG_LNG case _C_LNG_LNG: ftype = &gsffi_type_slong_long; break; case _C_ULNG_LNG: ftype = &gsffi_type_ulong_long; break; #endif case _C_FLT: ftype = &ffi_type_float; break; case _C_DBL: ftype = &ffi_type_double; break; case _C_PTR: ftype = &ffi_type_pointer; if (*typePtr == '?') { typePtr++; } else { const char *adv; cifframe_type(typePtr, &adv); typePtr = adv; } break; case _C_ATOM: case _C_CHARPTR: ftype = &ffi_type_pointer; break; case _C_ARY_B: { const char *adv; ftype = &ffi_type_pointer; while (isdigit(*typePtr)) { typePtr++; } cifframe_type(typePtr, &adv); typePtr = adv; typePtr++; /* Skip end-of-array */ } break; case _C_STRUCT_B: { int types, maxtypes, size; ffi_type *local; const char *adv; unsigned align = __alignof(double); /* Standard structures can be handled using cached type information. Since the switch statement has already skipped the _C_STRUCT_B character, we must use typePtr-1 below to successfully match the type encoding with one of the standard type encodings. The same holds for skipping past the whole structure type's encoding with objc_skip_typespec. */ if (GSSelectorTypesMatch(typePtr - 1, @encode(NSRange))) { ftype = &stypeNSRange; if (ftype->type == 0) { static ffi_type *elems[3]; if (*@encode(NSUInteger) == _C_ULNG) { elems[0] = &gsffi_type_ulong; } #ifdef _C_LNG_LNG else if (*@encode(NSUInteger) == _C_ULNG_LNG) { elems[0] = &gsffi_type_ulong_long; } #endif else { elems[0] = &gsffi_type_uint; } elems[1] = elems[0]; elems[2] = 0; ftype->elements = elems; ftype->type = FFI_TYPE_STRUCT; } typePtr = objc_skip_typespec (typePtr - 1); break; } else if (GSSelectorTypesMatch(typePtr - 1, @encode(NSPoint))) { ftype = &stypeNSPoint; if (ftype->type == 0) { static ffi_type *elems[3]; if (*@encode(CGFloat) == _C_DBL) { elems[0] = &ffi_type_double; } else { elems[0] = &ffi_type_float; } elems[1] = elems[0]; elems[2] = 0; ftype->elements = elems; ftype->type = FFI_TYPE_STRUCT; } typePtr = objc_skip_typespec (typePtr - 1); break; } else if (GSSelectorTypesMatch(typePtr - 1, @encode(NSSize))) { ftype = &stypeNSSize; if (ftype->type == 0) { static ffi_type *elems[3]; if (*@encode(CGFloat) == _C_DBL) { elems[0] = &ffi_type_double; } else { elems[0] = &ffi_type_float; } elems[1] = elems[0]; elems[2] = 0; ftype->elements = elems; ftype->type = FFI_TYPE_STRUCT; } typePtr = objc_skip_typespec (typePtr - 1); break; } else if (GSSelectorTypesMatch(typePtr - 1, @encode(NSRect))) { ftype = &stypeNSRect; if (ftype->type == 0) { static ffi_type *elems[3]; /* An NSRect is an NSPoint and an NSSize, but those * two structures are actually identical. */ elems[0] = cifframe_type(@encode(NSSize), NULL); elems[1] = cifframe_type(@encode(NSPoint), NULL); elems[2] = 0; ftype->elements = elems; ftype->type = FFI_TYPE_STRUCT; } typePtr = objc_skip_typespec (typePtr - 1); break; } /* * Skip "=" stuff. */ while (*typePtr != _C_STRUCT_E) { if (*typePtr++ == '=') { break; } } types = 0; maxtypes = 4; size = sizeof(ffi_type); if (size % align != 0) { size += (align - (size % align)); } ftype = malloc(size + (maxtypes+1)*sizeof(ffi_type)); ftype->size = 0; ftype->alignment = 0; ftype->type = FFI_TYPE_STRUCT; ftype->elements = (void*)ftype + size; /* * Continue accumulating structure size. */ while (*typePtr != _C_STRUCT_E) { local = cifframe_type(typePtr, &adv); typePtr = adv; NSCAssert(typePtr, @"End of signature while parsing"); ftype->elements[types++] = local; if (types >= maxtypes) { maxtypes *=2; ftype = realloc(ftype, size + (maxtypes+1)*sizeof(ffi_type)); ftype->elements = (void*)ftype + size; } } ftype->elements[types] = NULL; typePtr++; /* Skip end-of-struct */ } break; case _C_UNION_B: { const char *adv; int max_align = 0; /* * Skip "=" stuff. */ while (*typePtr != _C_UNION_E) { if (*typePtr++ == '=') { break; } } ftype = NULL; while (*typePtr != _C_UNION_E) { ffi_type *local; int align = objc_alignof_type(typePtr); local = cifframe_type(typePtr, &adv); typePtr = adv; NSCAssert(typePtr, @"End of signature while parsing"); if (align > max_align) { if (ftype && ftype->type == FFI_TYPE_STRUCT && ftype != &stypeNSPoint && ftype != &stypeNSRange && ftype != &stypeNSRect && ftype != &stypeNSSize) { free(ftype); } ftype = local; max_align = align; } } typePtr++; /* Skip end-of-union */ } break; case _C_VOID: ftype = &ffi_type_void; break; #if defined(_C_BOOL) && (!defined(__GNUC__) || __GNUC__ > 2) case _C_BOOL: ftype = &ffi_type_uchar; break; #endif default: ftype = &ffi_type_void; NSCAssert(0, @"Unknown type in sig"); } /* Skip past any offset information, if there is any */ if (*type != _C_PTR || *type == '?') { if (*typePtr == '+') typePtr++; if (*typePtr == '-') typePtr++; while (isdigit(*typePtr)) typePtr++; } if (advance) *advance = typePtr; return ftype; } GSCodeBuffer* cifframe_closure (NSMethodSignature *sig, void (*cb)()) { NSMutableData *frame; cifframe_t *cframe; ffi_closure *cclosure; void *executable; GSCodeBuffer *memory; /* Construct the frame (stored in an NSMutableDate object) and sety it * in a new closure. */ frame = cifframe_from_signature(sig); cframe = [frame mutableBytes]; memory = [GSCodeBuffer memoryWithSize: sizeof(ffi_closure)]; [memory setFrame: frame]; cclosure = [memory buffer]; executable = [memory executable]; if (cframe == NULL || cclosure == NULL) { [NSException raise: NSMallocException format: @"Allocating closure"]; } #if HAVE_FFI_PREP_CLOSURE_LOC if (ffi_prep_closure_loc(cclosure, &(cframe->cif), cb, frame, executable) != FFI_OK) { [NSException raise: NSGenericException format: @"Preping closure"]; } #else executable = (void*)cclosure; if (ffi_prep_closure(cclosure, &(cframe->cif), cb, frame) != FFI_OK) { [NSException raise: NSGenericException format: @"Preping closure"]; } #endif [memory protect]; return memory; } /*-------------------------------------------------------------------------*/ /* Functions for handling sending and receiving messages accross a connection */ /* Some return types actually get coded differently. We need to convert back to the expected return type */ BOOL cifframe_decode_arg (const char *type, void* buffer) { type = objc_skip_type_qualifiers (type); switch (*type) { case _C_CHR: *(signed char*)buffer = (signed char)(*((ffi_sarg *)buffer)); break; case _C_UCHR: *(unsigned char*)buffer = (unsigned char)(*((ffi_arg *)buffer)); break; case _C_SHT: *(signed short*)buffer = (signed short)(*((ffi_sarg *)buffer)); break; case _C_USHT: *(unsigned short*)buffer = (unsigned short)(*((ffi_arg *)buffer)); break; case _C_INT: *(signed int*)buffer = (signed int)(*((ffi_sarg *)buffer)); break; case _C_UINT: *(unsigned int*)buffer = (unsigned int)(*((ffi_arg *)buffer)); break; case _C_LNG: if (sizeof(signed long) < sizeof(ffi_sarg)) *(signed long*)buffer = (signed long)(*((ffi_sarg *)buffer)); break; case _C_ULNG: if (sizeof(unsigned long) < sizeof(ffi_arg)) *(unsigned long*)buffer = (unsigned long)(*((ffi_arg *)buffer)); break; default: return NO; } return YES; } BOOL cifframe_encode_arg (const char *type, void* buffer) { type = objc_skip_type_qualifiers (type); switch (*type) { case _C_CHR: *(ffi_sarg *)buffer = (ffi_sarg)(*((signed char *)buffer)); break; case _C_UCHR: *(ffi_arg *)buffer = (ffi_arg)(*((unsigned char *)buffer)); break; case _C_SHT: *(ffi_sarg *)buffer = (ffi_sarg)(*((signed short *)buffer)); break; case _C_USHT: *(ffi_arg *)buffer = (ffi_arg)(*((unsigned short *)buffer)); break; case _C_INT: *(ffi_sarg *)buffer = (ffi_sarg)(*((signed int *)buffer)); break; case _C_UINT: *(ffi_arg *)buffer = (ffi_arg)(*((unsigned int *)buffer)); break; case _C_LNG: if (sizeof(signed long) < sizeof(ffi_sarg)) *(ffi_sarg *)buffer = (ffi_sarg)(*((signed long *)buffer)); break; case _C_ULNG: if (sizeof(unsigned long) < sizeof(ffi_arg)) *(ffi_arg *)buffer = (ffi_arg)(*((unsigned int *)buffer)); break; default: return NO; } return YES; } gnustep-base-1.29.0/Source/common.h000066400000000000000000000056251435650067400171230ustar00rootroot00000000000000/* Header file for all objective-c code in the base library. * This imports all the common headers in a consistent order such that * we can be sure only local headers are used rather than any which * might be from an earlier build. */ #ifndef COMMON_H #define COMMON_H #include "config.h" #if defined(HAVE_STRING_H) /* For POSIX strerror_r() and others */ #include #endif #if defined(HAVE_STRINGS_H) /* For strcasecmp() and others */ #include #endif #include /* If this is included in a file in the Additions subdirectory, and we are * building for use with the NeXT/Apple Foundation, then we need to import * the native headers in preference to any of our own. */ #if defined(NeXT_Foundation_LIBRARY) #import #endif #import "GNUstepBase/GSConfig.h" #import "GNUstepBase/GSVersionMacros.h" /* Set localisation macro for use within the base library itsself. */ #define GS_LOCALISATION_BUNDLE \ [NSBundle bundleForLibrary: @"gnustep-base" version: \ OBJC_STRINGIFY(GNUSTEP_BASE_MAJOR_VERSION.GNUSTEP_BASE_MINOR_VERSION)] #import "GNUstepBase/GNUstep.h" /* Foundation/NSObject.h imports and * so we import local versions first. */ #import "Foundation/NSZone.h" #import "Foundation/NSObjCRuntime.h" /* Almost all headers import so we import * "Foundation/NSObject.h" first, to ensure we have a local copy. */ #import "Foundation/NSObject.h" #import "GNUstepBase/NSObject+GNUstepBase.h" /* These headers are used in almost every file. */ #import "Foundation/NSString.h" #import "Foundation/NSDebug.h" /* These headers needed for string localisation ... hopefully we will * localise all the exceptions and debug/error messages in all the source * some day, so localisation needs ot be in the common header for all code. */ #import "Foundation/NSBundle.h" #import "GNUstepBase/NSBundle+GNUstepBase.h" /* We need to wrap unistd.h because it is used throughout the code and some * versions include __block as a variable name, and clang also defines that * and depends on the definition later ... so we resort to the fragile hack * of redefining according to the observed definition. */ #ifdef HAVE_UNISTD_H # ifdef __block # undef __block # define __block __gs_unistd_block # include # undef __block # define __block __attribute__((__blocks__(byref))) # else # define __block __gs_unistd_block # include # undef __block # endif #endif /* Redefine some functions/variables when using the MSVC ABI on Windows. */ #ifdef _MSC_VER # include # define strncasecmp _strnicmp # define strcasecmp _stricmp # define write(fd, buffer, count) _write(fd, buffer, count) # define close(fd) _close(fd) // time.h # define tzset _tzset # define tzname _tzname # define timezone _timezone # define daylight _daylight #endif #endif /* COMMON_H */ gnustep-base-1.29.0/Source/dld-load.h000066400000000000000000000112021435650067400172770ustar00rootroot00000000000000/* dld-load - Definitions and translations for dynamic loading with GNU dld. Copyright (C) 1995, Free Software Foundation. This program 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 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. BUGS: - object files loaded by dld must be loaded with 'ld -r' rather than 'gcc -nostdlib', because dld can't handle multiple symbols like multiple CTOR_LISTS. So here we construct our own CTOR list and return it when asked for (Ack! Pthet!). - __dld_construct_ctor_list may find a constructor that belongs to another module whose name is a super-string of the desired module name. */ #ifndef __dld_load_h_INCLUDE #define __dld_load_h_INCLUDE #include /* This is the GNU gcc name for the CTOR list */ #define CTOR_LIST "___CTOR_LIST__" /* The compiler generates a constructor function for each class. The function has the prefix given below. */ #define GLOBAL_PREFIX "_GLOBAL_$I$" /* Types defined appropriately for the dynamic linker */ typedef char* dl_handle_t; typedef unsigned long dl_symbol_t; static void **dld_ctor_list = 0; static void** __dld_construct_ctor_list(dl_handle_t module) { int i, ctors, length; length = 100; ctors = 1; if (dld_ctor_list) free(dld_ctor_list); dld_ctor_list = (void **) __objc_xmalloc(length * sizeof(void *)); /* Find all symbols with the GLOBAL_PREFIX prefix */ for (i=0; i < TABSIZE; i++) { struct glosym *sym_entry = _dld_symtab[i]; for (; sym_entry; sym_entry = sym_entry->link) { if (strstr(sym_entry->name, GLOBAL_PREFIX) && strstr(sym_entry->defined_by->filename, module)) { dld_ctor_list[ctors] = (void **)sym_entry->value; ctors++; if (ctors > length) { length *= 2; dld_ctor_list = (void **) __objc_xrealloc(dld_ctor_list, length * sizeof(void *)); } } } } dld_ctor_list[ctors] = (void **)0; dld_ctor_list[0] = (void **)(ctors - 1); return dld_ctor_list; } /* Do any initialization necessary. Return 0 on success (or if no initialization needed. */ static int __objc_dynamic_init(const char* exec_path) { return dld_init(exec_path); } /* Link in the module given by the name 'module'. Return a handle which can be used to get information about the loded code. */ static dl_handle_t __objc_dynamic_link(const char* module, int mode, const char* debug_file) { int error; int length = strlen(module); dl_handle_t handle; error = dld_link(module); if (error) return NULL; handle = (dl_handle_t)__objc_xmalloc (length + 1); strncpy(handle, module, length); handle[length] = '\0'; return handle; } /* Return the address of a symbol given by the name 'symbol' from the module * associated with 'handle' * This function is not always used, so we mark it as unused to avoid warnings. */ static dl_symbol_t __objc_dynamic_find_symbol(dl_handle_t handle, const char* symbol) __attribute__((unused)); static dl_symbol_t __objc_dynamic_find_symbol(dl_handle_t handle, const char* symbol) { if (strcmp(symbol, DLD_CTOR_LIST) == 0) { return (dl_symbol_t)__dld_construct_ctor_list(handle); } return dld_get_bare_symbol(symbol); } /* remove the code from memory associated with the module 'handle' */ static int __objc_dynamic_unlink(dl_handle_t handle) { int error; error = dld_unlink_by_file(handle, 0); free(handle); return error; } /* Print an error message (prefaced by 'error_string') relevant to the last error encountered */ static void __objc_dynamic_error(FILE *error_stream, const char *error_string) { /* dld won't print to error stream, sorry */ dld_perror(error_string); } /* Debugging: define these if they are available */ static int __objc_dynamic_undefined_symbol_count(void) { return dld_undefined_sym_count; } static char** __objc_dynamic_list_undefined_symbols(void) { return dld_list_undefined_sym(); } /* current dld version does not support an equivalent of dladdr() */ static char * __objc_dynamic_get_symbol_path(dl_handle_t handle, dl_symbol_t symbol) { return NULL; } #endif /* __dld_load_h_INCLUDE */ gnustep-base-1.29.0/Source/externs.m000066400000000000000000001103451435650067400173240ustar00rootroot00000000000000/** All of the external data Copyright (C) 1997 Free Software Foundation, Inc. Written by: Scott Christley Date: August 1997 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #import "Foundation/NSError.h" /* * NSConnection Notification Strings. */ GS_DECLARE NSString* const NSConnectionDidDieNotification = @"NSConnectionDidDieNotification"; GS_DECLARE NSString* const NSConnectionDidInitializeNotification = @"NSConnectionDidInitializeNotification"; /* * NSDistributedNotificationCenter types. */ GS_DECLARE NSString* const NSLocalNotificationCenterType = @"NSLocalNotificationCenterType"; GS_DECLARE NSString* const GSNetworkNotificationCenterType = @"GSNetworkNotificationCenterType"; GS_DECLARE NSString* const GSPublicNotificationCenterType = @"GSPublicNotificationCenterType"; /* * NSThread Notifications */ GS_DECLARE NSString* const NSWillBecomeMultiThreadedNotification = @"NSWillBecomeMultiThreadedNotification"; GS_DECLARE NSString* const NSThreadDidStartNotification = @"NSThreadDidStartNotification"; GS_DECLARE NSString* const NSThreadWillExitNotification = @"NSThreadWillExitNotification"; /* * Port Notifications */ GS_DECLARE NSString* const NSPortDidBecomeInvalidNotification = @"NSPortDidBecomeInvalidNotification"; /* NSTask notifications */ GS_DECLARE NSString* const NSTaskDidTerminateNotification = @"NSTaskDidTerminateNotification"; /* NSUndoManager notifications */ GS_DECLARE NSString* const NSUndoManagerCheckpointNotification = @"NSUndoManagerCheckpointNotification"; GS_DECLARE NSString* const NSUndoManagerDidOpenUndoGroupNotification = @"NSUndoManagerDidOpenUndoGroupNotification"; GS_DECLARE NSString* const NSUndoManagerDidRedoChangeNotification = @"NSUndoManagerDidRedoChangeNotification"; GS_DECLARE NSString* const NSUndoManagerDidUndoChangeNotification = @"NSUndoManagerDidUndoChangeNotification"; GS_DECLARE NSString* const NSUndoManagerWillCloseUndoGroupNotification = @"NSUndoManagerWillCloseUndoGroupNotification"; GS_DECLARE NSString* const NSUndoManagerWillRedoChangeNotification = @"NSUndoManagerWillRedoChangeNotification"; GS_DECLARE NSString* const NSUndoManagerWillUndoChangeNotification = @"NSUndoManagerWillUndoChangeNotification"; /* * NSUbiquitousKeyValueStore notifications */ GS_DECLARE NSString* const NSUbiquitousKeyValueStoreDidChangeExternallyNotification = @"NSUbiquitousKeyValueStoreDidChangeExternallyNotification"; GS_DECLARE NSString* const NSUbiquitousKeyValueStoreChangeReasonKey = @"NSUbiquitousKeyValueStoreChangeReasonKey"; /* NSURL constants */ GS_DECLARE NSString* const NSURLFileScheme = @"file"; #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) GS_DECLARE NSString* const NSURLNameKey = @"NSURLNameKey"; GS_DECLARE NSString* const NSURLLocalizedNameKey = @"NSURLLocalizedNameKey"; GS_DECLARE NSString* const NSURLIsRegularFileKey = @"NSURLIsRegularFileKey"; GS_DECLARE NSString* const NSURLIsDirectoryKey = @"NSURLIsDirectoryKey"; GS_DECLARE NSString* const NSURLIsSymbolicLinkKey = @"NSURLIsSymbolicLinkKey"; GS_DECLARE NSString* const NSURLIsVolumeKey = @"NSURLIsVolumeKey"; GS_DECLARE NSString* const NSURLIsPackageKey = @"NSURLIsPackageKey"; GS_DECLARE NSString* const NSURLIsSystemImmutableKey = @"NSURLIsSystemImmutableKey"; GS_DECLARE NSString* const NSURLIsUserImmutableKey = @"NSURLIsUserImmutableKey"; GS_DECLARE NSString* const NSURLIsHiddenKey = @"NSURLIsHiddenKey"; GS_DECLARE NSString* const NSURLHasHiddenExtensionKey = @"NSURLHasHiddenExtensionKey"; GS_DECLARE NSString* const NSURLCreationDateKey = @"NSURLCreationDateKey"; GS_DECLARE NSString* const NSURLContentAccessDateKey = @"NSURLContentAccessDateKey"; GS_DECLARE NSString* const NSURLContentModificationDateKey = @"NSURLContentModificationDateKey"; GS_DECLARE NSString* const NSURLAttributeModificationDateKey = @"NSURLAttributeModificationDateKey"; GS_DECLARE NSString* const NSURLLinkCountKey = @"NSURLLinkCountKey"; GS_DECLARE NSString* const NSURLParentDirectoryURLKey = @"NSURLParentDirectoryURLKey"; GS_DECLARE NSString* const NSURLVolumeURLKey = @"NSURLVolumeURLKey"; GS_DECLARE NSString* const NSURLTypeIdentifierKey = @"NSURLTypeIdentifierKey"; GS_DECLARE NSString* const NSURLLocalizedTypeDescriptionKey = @"NSURLLocalizedTypeDescriptionKey"; GS_DECLARE NSString* const NSURLLabelNumberKey = @"NSURLLabelNumberKey"; GS_DECLARE NSString* const NSURLLabelColorKey = @"NSURLLabelColorKey"; GS_DECLARE NSString* const NSURLLocalizedLabelKey = @"NSURLLocalizedLabelKey"; GS_DECLARE NSString* const NSURLEffectiveIconKey = @"NSURLEffectiveIconKey"; GS_DECLARE NSString* const NSURLCustomIconKey = @"NSURLCustomIconKey"; GS_DECLARE NSString* const NSURLFileSizeKey = @"NSURLFileSizeKey"; GS_DECLARE NSString* const NSURLFileAllocatedSizeKey = @"NSURLFileAllocatedSizeKey"; GS_DECLARE NSString* const NSURLIsAliasFileKey = @"NSURLIsAliasFileKey"; GS_DECLARE NSString* const NSURLVolumeLocalizedFormatDescriptionKey = @"NSURLVolumeLocalizedFormatDescriptionKey"; GS_DECLARE NSString* const NSURLVolumeTotalCapacityKey = @"NSURLVolumeTotalCapacityKey"; GS_DECLARE NSString* const NSURLVolumeAvailableCapacityKey = @"NSURLVolumeAvailableCapacityKey"; GS_DECLARE NSString* const NSURLVolumeResourceCountKey = @"NSURLVolumeResourceCountKey"; GS_DECLARE NSString* const NSURLVolumeSupportsPersistentIDsKey = @"NSURLVolumeSupportsPersistentIDsKey"; GS_DECLARE NSString* const NSURLVolumeSupportsSymbolicLinksKey = @"NSURLVolumeSupportsSymbolicLinksKey"; GS_DECLARE NSString* const NSURLVolumeSupportsHardLinksKey = @"NSURLVolumeSupportsHardLinksKey"; GS_DECLARE NSString* const NSURLVolumeSupportsJournalingKey = @"NSURLVolumeSupportsJournalingKey"; GS_DECLARE NSString* const NSURLVolumeIsJournalingKey = @"NSURLVolumeIsJournalingKey"; GS_DECLARE NSString* const NSURLVolumeSupportsSparseFilesKey = @"NSURLVolumeSupportsSparseFilesKey"; GS_DECLARE NSString* const NSURLVolumeSupportsZeroRunsKey = @"NSURLVolumeSupportsZeroRunsKey"; GS_DECLARE NSString* const NSURLVolumeSupportsCaseSensitiveNamesKey = @"NSURLVolumeSupportsCaseSensitiveNamesKey"; GS_DECLARE NSString* const NSURLVolumeSupportsCasePreservedNamesKey = @"NSURLVolumeSupportsCasePreservedNamesKey"; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_7, GS_API_LATEST) GS_DECLARE NSString* const NSURLFileResourceIdentifierKey = @"NSURLFileResourceIdentifierKey"; GS_DECLARE NSString* const NSURLVolumeIdentifierKey = @"NSURLVolumeIdentifierKey"; GS_DECLARE NSString* const NSURLPreferredIOBlockSizeKey = @"NSURLPreferredIOBlockSizeKey"; GS_DECLARE NSString* const NSURLIsReadableKey = @"NSURLIsReadableKey"; GS_DECLARE NSString* const NSURLIsWritableKey = @"NSURLIsWritableKey"; GS_DECLARE NSString* const NSURLIsExecutableKey = @"NSURLIsExecutableKey"; GS_DECLARE NSString* const NSURLFileSecurityKey = @"NSURLFileSecurityKey"; GS_DECLARE NSString* const NSURLIsMountTriggerKey = @"NSURLIsMountTriggerKey"; GS_DECLARE NSString* const NSURLFileResourceTypeKey = @"NSURLFileResourceTypeKey"; GS_DECLARE NSString* const NSURLTotalFileSizeKey = @"NSURLTotalFileSizeKey"; GS_DECLARE NSString* const NSURLTotalFileAllocatedSizeKey = @"NSURLTotalFileAllocatedSizeKey"; GS_DECLARE NSString* const NSURLVolumeSupportsRootDirectoryDatesKey = @"NSURLVolumeSupportsRootDirectoryDatesKey"; GS_DECLARE NSString* const NSURLVolumeSupportsVolumeSizesKey = @"NSURLVolumeSupportsVolumeSizesKey"; GS_DECLARE NSString* const NSURLVolumeSupportsRenamingKey = @"NSURLVolumeSupportsRenamingKey"; GS_DECLARE NSString* const NSURLVolumeSupportsAdvisoryFileLockingKey = @"NSURLVolumeSupportsAdvisoryFileLockingKey"; GS_DECLARE NSString* const NSURLVolumeSupportsExtendedSecurityKey = @"NSURLVolumeSupportsExtendedSecurityKey"; GS_DECLARE NSString* const NSURLVolumeIsBrowsableKey = @"NSURLVolumeIsBrowsableKey"; GS_DECLARE NSString* const NSURLVolumeMaximumFileSizeKey = @"NSURLVolumeMaximumFileSizeKey"; GS_DECLARE NSString* const NSURLVolumeIsEjectableKey = @"NSURLVolumeIsEjectableKey"; GS_DECLARE NSString* const NSURLVolumeIsRemovableKey = @"NSURLVolumeIsRemovableKey"; GS_DECLARE NSString* const NSURLVolumeIsInternalKey = @"NSURLVolumeIsInternalKey"; GS_DECLARE NSString* const NSURLVolumeIsAutomountedKey = @"NSURLVolumeIsAutomountedKey"; GS_DECLARE NSString* const NSURLVolumeIsLocalKey = @"NSURLVolumeIsLocalKey"; GS_DECLARE NSString* const NSURLVolumeIsReadOnlyKey = @"NSURLVolumeIsReadOnlyKey"; GS_DECLARE NSString* const NSURLVolumeCreationDateKey = @"NSURLVolumeCreationDateKey"; GS_DECLARE NSString* const NSURLVolumeURLForRemountingKey = @"NSURLVolumeURLForRemountingKey"; GS_DECLARE NSString* const NSURLVolumeUUIDStringKey = @"NSURLVolumeUUIDStringKey"; GS_DECLARE NSString* const NSURLVolumeNameKey = @"NSURLVolumeNameKey"; GS_DECLARE NSString* const NSURLVolumeLocalizedNameKey = @"NSURLVolumeLocalizedNameKey"; GS_DECLARE NSString* const NSURLIsUbiquitousItemKey = @"NSURLIsUbiquitousItemKey"; GS_DECLARE NSString* const NSURLUbiquitousItemHasUnresolvedConflictsKey = @"NSURLUbiquitousItemHasUnresolvedConflictsKey"; GS_DECLARE NSString* const NSURLUbiquitousItemIsDownloadingKey = @"NSURLUbiquitousItemIsDownloadingKey"; GS_DECLARE NSString* const NSURLUbiquitousItemIsUploadedKey = @"NSURLUbiquitousItemIsUploadedKey"; GS_DECLARE NSString* const NSURLUbiquitousItemIsUploadingKey = @"NSURLUbiquitousItemIsUploadingKey"; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_8, GS_API_LATEST) GS_DECLARE NSString* const NSURLIsExcludedFromBackupKey = @"NSURLIsExcludedFromBackupKey"; GS_DECLARE NSString* const NSURLPathKey = @"NSURLPathKey"; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_9, GS_API_LATEST) GS_DECLARE NSString* const NSURLTagNamesKey = @"NSURLTagNamesKey"; GS_DECLARE NSString* const NSURLUbiquitousItemDownloadingStatusKey = @"NSURLUbiquitousItemDownloadingStatusKey"; GS_DECLARE NSString* const NSURLUbiquitousItemDownloadingErrorKey = @"NSURLUbiquitousItemDownloadingErrorKey"; GS_DECLARE NSString* const NSURLUbiquitousItemUploadingErrorKey = @"NSURLUbiquitousItemUploadingErrorKey"; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_10, GS_API_LATEST) GS_DECLARE NSString* const NSURLGenerationIdentifierKey = @"NSURLGenerationIdentifierKey"; GS_DECLARE NSString* const NSURLDocumentIdentifierKey = @"NSURLDocumentIdentifierKey"; GS_DECLARE NSString* const NSURLAddedToDirectoryDateKey = @"NSURLAddedToDirectoryDateKey"; GS_DECLARE NSString* const NSURLQuarantinePropertiesKey = @"NSURLQuarantinePropertiesKey"; GS_DECLARE NSString* const NSThumbnail1024x1024SizeKey = @"NSThumbnail1024x1024SizeKey"; GS_DECLARE NSString* const NSURLUbiquitousItemDownloadRequestedKey = @"NSURLUbiquitousItemDownloadRequestedKey"; GS_DECLARE NSString* const NSURLUbiquitousItemContainerDisplayNameKey = @"NSURLUbiquitousItemContainerDisplayNameKey"; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_11, GS_API_LATEST) GS_DECLARE NSString* const NSURLIsApplicationKey = @"NSURLIsApplicationKey"; GS_DECLARE NSString* const NSURLApplicationIsScriptableKey = @"NSURLApplicationIsScriptableKey"; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_7, GS_API_LATEST) GS_DECLARE NSString* const NSURLFileResourceTypeNamedPipe = @"NSURLFileResourceTypeNamedPipe"; GS_DECLARE NSString* const NSURLFileResourceTypeCharacterSpecial = @"NSURLFileResourceTypeCharacterSpecial"; GS_DECLARE NSString* const NSURLFileResourceTypeDirectory = @"NSURLFileResourceTypeDirectory"; GS_DECLARE NSString* const NSURLFileResourceTypeBlockSpecial = @"NSURLFileResourceTypeBlockSpecial"; GS_DECLARE NSString* const NSURLFileResourceTypeRegular = @"NSURLFileResourceTypeRegular"; GS_DECLARE NSString* const NSURLFileResourceTypeSymbolicLink = @"NSURLFileResourceTypeSymbolicLink"; GS_DECLARE NSString* const NSURLFileResourceTypeSocket = @"NSURLFileResourceTypeSocket"; GS_DECLARE NSString* const NSURLFileResourceTypeUnknown = @"NSURLFileResourceTypeUnknown"; #endif /* NSURLError */ GS_DECLARE NSString* const NSURLErrorDomain = @"NSURLErrorDomain"; GS_DECLARE NSString* const NSErrorFailingURLStringKey = @"NSErrorFailingURLStringKey"; /** Possible values for Ubiquitous Item Downloading Key **/ #if OS_API_VERSION(MAC_OS_X_VERSION_10_9, GS_API_LATEST) GS_DECLARE NSString* const NSURLUbiquitousItemDownloadingStatusNotDownloaded = @"NSURLUbiquitousItemDownloadingStatusNotDownloaded"; GS_DECLARE NSString* const NSURLUbiquitousItemDownloadingStatusDownloaded = @"NSURLUbiquitousItemDownloadingStatusDownloaded"; GS_DECLARE NSString* const NSURLUbiquitousItemDownloadingStatusCurrent = @"NSURLUbiquitousItemDownloadingStatusCurrent"; #endif /* RunLoop modes */ GS_DECLARE NSString* const NSConnectionReplyMode = @"NSConnectionReplyMode"; /* NSValueTransformer constants */ GS_DECLARE NSString* const NSNegateBooleanTransformerName = @"NSNegateBoolean"; GS_DECLARE NSString* const NSIsNilTransformerName = @"NSIsNil"; GS_DECLARE NSString* const NSIsNotNilTransformerName = @"NSIsNotNil"; GS_DECLARE NSString* const NSUnarchiveFromDataTransformerName = @"NSUnarchiveFromData"; /* Standard domains */ GS_DECLARE NSString* const NSArgumentDomain = @"NSArgumentDomain"; GS_DECLARE NSString* const NSGlobalDomain = @"NSGlobalDomain"; GS_DECLARE NSString* const NSRegistrationDomain = @"NSRegistrationDomain"; GS_DECLARE NSString* const GSConfigDomain = @"GSConfigDomain"; /* Public notification */ GS_DECLARE NSString* const NSUserDefaultsDidChangeNotification = @"NSUserDefaultsDidChangeNotification"; /* Keys for language-dependent information */ GS_DECLARE NSString* const NSWeekDayNameArray = @"NSWeekDayNameArray"; GS_DECLARE NSString* const NSShortWeekDayNameArray = @"NSShortWeekDayNameArray"; GS_DECLARE NSString* const NSMonthNameArray = @"NSMonthNameArray"; GS_DECLARE NSString* const NSShortMonthNameArray = @"NSShortMonthNameArray"; GS_DECLARE NSString* const NSTimeFormatString = @"NSTimeFormatString"; GS_DECLARE NSString* const NSDateFormatString = @"NSDateFormatString"; GS_DECLARE NSString* const NSShortDateFormatString = @"NSShortDateFormatString"; GS_DECLARE NSString* const NSTimeDateFormatString = @"NSTimeDateFormatString"; GS_DECLARE NSString* const NSShortTimeDateFormatString = @"NSShortTimeDateFormatString"; GS_DECLARE NSString* const NSCurrencySymbol = @"NSCurrencySymbol"; GS_DECLARE NSString* const NSDecimalSeparator = @"NSDecimalSeparator"; GS_DECLARE NSString* const NSThousandsSeparator = @"NSThousandsSeparator"; GS_DECLARE NSString* const NSInternationalCurrencyString = @"NSInternationalCurrencyString"; GS_DECLARE NSString* const NSCurrencyString = @"NSCurrencyString"; GS_DECLARE NSString* const NSNegativeCurrencyFormatString = @"NSNegativeCurrencyFormatString"; GS_DECLARE NSString* const NSPositiveCurrencyFormatString = @"NSPositiveCurrencyFormatString"; GS_DECLARE NSString* const NSDecimalDigits = @"NSDecimalDigits"; GS_DECLARE NSString* const NSAMPMDesignation = @"NSAMPMDesignation"; GS_DECLARE NSString* const NSHourNameDesignations = @"NSHourNameDesignations"; GS_DECLARE NSString* const NSYearMonthWeekDesignations = @"NSYearMonthWeekDesignations"; GS_DECLARE NSString* const NSEarlierTimeDesignations = @"NSEarlierTimeDesignations"; GS_DECLARE NSString* const NSLaterTimeDesignations = @"NSLaterTimeDesignations"; GS_DECLARE NSString* const NSThisDayDesignations = @"NSThisDayDesignations"; GS_DECLARE NSString* const NSNextDayDesignations = @"NSNextDayDesignations"; GS_DECLARE NSString* const NSNextNextDayDesignations = @"NSNextNextDayDesignations"; GS_DECLARE NSString* const NSPriorDayDesignations = @"NSPriorDayDesignations"; GS_DECLARE NSString* const NSDateTimeOrdering = @"NSDateTimeOrdering"; /* These are in OPENSTEP 4.2 */ GS_DECLARE NSString* const NSLanguageCode = @"NSLanguageCode"; GS_DECLARE NSString* const NSLanguageName = @"NSLanguageName"; GS_DECLARE NSString* const NSFormalName = @"NSFormalName"; /* For GNUstep */ GS_DECLARE NSString* const GSLocale = @"GSLocale"; /* * Keys for the NSDictionary returned by [NSConnection -statistics] */ /* These in OPENSTEP 4.2 */ GS_DECLARE NSString* const NSConnectionRepliesReceived = @"NSConnectionRepliesReceived"; GS_DECLARE NSString* const NSConnectionRepliesSent = @"NSConnectionRepliesSent"; GS_DECLARE NSString* const NSConnectionRequestsReceived = @"NSConnectionRequestsReceived"; GS_DECLARE NSString* const NSConnectionRequestsSent = @"NSConnectionRequestsSent"; /* These Are GNUstep extras */ GS_DECLARE NSString* const NSConnectionLocalCount = @"NSConnectionLocalCount"; GS_DECLARE NSString* const NSConnectionProxyCount = @"NSConnectionProxyCount"; /* Class description notification */ GS_DECLARE NSString* const NSClassDescriptionNeededForClassNotification = @"NSClassDescriptionNeededForClassNotification"; /* NSArchiver */ GS_DECLARE NSString* const NSInconsistentArchiveException = @"NSInconsistentArchiveException"; /* NSBundle */ GS_DECLARE NSString* const NSBundleDidLoadNotification = @"NSBundleDidLoadNotification"; GS_DECLARE NSString* const NSShowNonLocalizedStrings = @"NSShowNonLocalizedStrings"; GS_DECLARE NSString* const NSLoadedClasses = @"NSLoadedClasses"; /* NSConnection */ GS_DECLARE NSString* const NSDestinationInvalidException = @"NSDestinationInvalidException"; GS_DECLARE NSString* const NSFailedAuthenticationException = @"NSFailedAuthenticationExceptions"; GS_DECLARE NSString* const NSObjectInaccessibleException = @"NSObjectInaccessibleException"; GS_DECLARE NSString* const NSObjectNotAvailableException = @"NSObjectNotAvailableException"; /* NSDate */ GS_DECLARE NSString* const NSSystemClockDidChangeNotification = @"NSSystemClockDidChangeNotification"; /* NSExtensionItem */ GS_DECLARE NSString* const NSExtensionItemAttributedTitleKey = @"NSExtensionItemAttributedTitleKey"; GS_DECLARE NSString* const NSExtensionItemAttributedContentTextKey = @"NSExtensionItemAttributedContentTextKey"; GS_DECLARE NSString* const NSExtensionItemAttachmentsKey = @"NSExtensionItemAttachmentsKey"; /* NSFileHandle */ GS_DECLARE NSString* const NSFileHandleNotificationDataItem = @"NSFileHandleNotificationDataItem"; GS_DECLARE NSString* const NSFileHandleNotificationFileHandleItem = @"NSFileHandleNotificationFileHandleItem"; GS_DECLARE NSString* const NSFileHandleNotificationMonitorModes = @"NSFileHandleNotificationMonitorModes"; GS_DECLARE NSString* const NSFileHandleConnectionAcceptedNotification = @"NSFileHandleConnectionAcceptedNotification"; GS_DECLARE NSString* const NSFileHandleDataAvailableNotification = @"NSFileHandleDataAvailableNotification"; GS_DECLARE NSString* const NSFileHandleReadCompletionNotification = @"NSFileHandleReadCompletionNotification"; GS_DECLARE NSString* const NSFileHandleReadToEndOfFileCompletionNotification = @"NSFileHandleReadToEndOfFileCompletionNotification"; GS_DECLARE NSString* const NSFileHandleOperationException = @"NSFileHandleOperationException"; /* NSFileHandle GNUstep additions */ GS_DECLARE NSString* const GSFileHandleConnectCompletionNotification = @"GSFileHandleConnectCompletionNotification"; GS_DECLARE NSString* const GSFileHandleWriteCompletionNotification = @"GSFileHandleWriteCompletionNotification"; GS_DECLARE NSString* const GSFileHandleNotificationError = @"GSFileHandleNotificationError"; /* NSFileHandle constants to control TLS/SSL (options) */ GS_DECLARE NSString* const GSTLSCAFile = @"GSTLSCAFile"; GS_DECLARE NSString* const GSTLSCertificateFile = @"GSTLSCertificateFile"; GS_DECLARE NSString* const GSTLSCertificateKeyFile = @"GSTLSCertificateKeyFile"; GS_DECLARE NSString* const GSTLSCertificateKeyPassword = @"GSTLSCertificateKeyPassword"; GS_DECLARE NSString* const GSTLSDebug = @"GSTLSDebug"; GS_DECLARE NSString* const GSTLSIssuers = @"GSTLSIssuers"; GS_DECLARE NSString* const GSTLSOwners = @"GSTLSOwners"; GS_DECLARE NSString* const GSTLSPriority = @"GSTLSPriority"; GS_DECLARE NSString* const GSTLSRemoteHosts = @"GSTLSRemoteHosts"; GS_DECLARE NSString* const GSTLSRevokeFile = @"GSTLSRevokeFile"; GS_DECLARE NSString* const GSTLSServerName = @"GSTLSServerName"; GS_DECLARE NSString* const GSTLSVerify = @"GSTLSVerify"; /* NSFileManager */ GS_DECLARE NSString* const NSFileAppendOnly = @"NSFileAppendOnly"; GS_DECLARE NSString* const NSFileCreationDate = @"NSFileCreationDate"; GS_DECLARE NSString* const NSFileDeviceIdentifier = @"NSFileDeviceIdentifier"; GS_DECLARE NSString* const NSFileExtensionHidden = @"NSFileExtensionHidden"; GS_DECLARE NSString* const NSFileGroupOwnerAccountID = @"NSFileGroupOwnerAccountID"; GS_DECLARE NSString* const NSFileGroupOwnerAccountName = @"NSFileGroupOwnerAccountName"; GS_DECLARE NSString* const NSFileHFSCreatorCode = @"NSFileHFSCreatorCode"; GS_DECLARE NSString* const NSFileHFSTypeCode = @"NSFileHFSTypeCode"; GS_DECLARE NSString* const NSFileImmutable = @"NSFileImmutable"; GS_DECLARE NSString* const NSFileModificationDate = @"NSFileModificationDate"; GS_DECLARE NSString* const NSFileOwnerAccountID = @"NSFileOwnerAccountID"; GS_DECLARE NSString* const NSFileOwnerAccountName = @"NSFileOwnerAccountName"; GS_DECLARE NSString* const NSFilePosixPermissions = @"NSFilePosixPermissions"; GS_DECLARE NSString* const NSFileReferenceCount = @"NSFileReferenceCount"; GS_DECLARE NSString* const NSFileSize = @"NSFileSize"; GS_DECLARE NSString* const NSFileSystemFileNumber = @"NSFileSystemFileNumber"; GS_DECLARE NSString* const NSFileSystemFreeNodes = @"NSFileSystemFreeNodes"; GS_DECLARE NSString* const NSFileSystemFreeSize = @"NSFileSystemFreeSize"; GS_DECLARE NSString* const NSFileSystemNodes = @"NSFileSystemNodes"; GS_DECLARE NSString* const NSFileSystemNumber = @"NSFileSystemNumber"; GS_DECLARE NSString* const NSFileSystemSize = @"NSFileSystemSize"; GS_DECLARE NSString* const NSFileType = @"NSFileType"; GS_DECLARE NSString* const NSFileTypeBlockSpecial = @"NSFileTypeBlockSpecial"; GS_DECLARE NSString* const NSFileTypeCharacterSpecial = @"NSFileTypeCharacterSpecial"; GS_DECLARE NSString* const NSFileTypeDirectory = @"NSFileTypeDirectory"; GS_DECLARE NSString* const NSFileTypeFifo = @"NSFileTypeFifo"; GS_DECLARE NSString* const NSFileTypeRegular = @"NSFileTypeRegular"; GS_DECLARE NSString* const NSFileTypeSocket = @"NSFileTypeSocket"; GS_DECLARE NSString* const NSFileTypeSymbolicLink = @"NSFileTypeSymbolicLink"; GS_DECLARE NSString* const NSFileTypeUnknown = @"NSFileTypeUnknown"; /* NSHTTPCookie */ GS_DECLARE NSString* const NSHTTPCookieComment = @"Comment"; GS_DECLARE NSString* const NSHTTPCookieCommentURL = @"CommentURL"; GS_DECLARE NSString* const NSHTTPCookieDiscard = @"Discard"; GS_DECLARE NSString* const NSHTTPCookieDomain = @"Domain"; GS_DECLARE NSString* const NSHTTPCookieExpires = @"Expires"; GS_DECLARE NSString* const NSHTTPCookieMaximumAge = @"MaximumAge"; GS_DECLARE NSString* const NSHTTPCookieName = @"Name"; GS_DECLARE NSString* const NSHTTPCookieOriginURL = @"OriginURL"; GS_DECLARE NSString* const NSHTTPCookiePath = @"Path"; GS_DECLARE NSString* const NSHTTPCookiePort = @"Port"; GS_DECLARE NSString* const NSHTTPCookieSecure = @"Secure"; GS_DECLARE NSString* const NSHTTPCookieValue = @"Value"; GS_DECLARE NSString* const NSHTTPCookieVersion = @"Version"; /* NSCookieStorage */ GS_DECLARE NSString* const NSHTTPCookieManagerAcceptPolicyChangedNotification = @"NSHTTPCookieManagerAcceptPolicyChangedNotification"; GS_DECLARE NSString* const NSHTTPCookieManagerCookiesChangedNotification = @"NSHTTPCookieManagerCookiesChangedNotification"; /* NSItemProvider */ GS_DECLARE NSString* const NSItemProviderPreferredImageSizeKey = @"NSItemProviderPreferredImageSizeKey"; GS_DECLARE NSString* const NSExtensionJavaScriptPreprocessingResultsKey = @"NSExtensionJavaScriptPreprocessingResultsKey"; GS_DECLARE NSString* const NSExtensionJavaScriptFinalizeArgumentKey = @"NSExtensionJavaScriptFinalizeArgumentKey"; GS_DECLARE NSString* const NSItemProviderErrorDomain = @"NSItemProviderErrorDomain"; /* NSKeyedArchiver */ GS_DECLARE NSString* const NSInvalidArchiveOperationException = @"NSInvalidArchiveOperationException"; /* NSKeyedUnarchiver */ GS_DECLARE NSString* const NSInvalidUnarchiveOperationException = @"NSInvalidUnarchiveOperationException"; /* NSKeyValueCoding * For backward compatibility NSUndefinedKeyException is actually the same * as the older NSUnknownKeyException */ GS_DECLARE NSString* const NSUnknownKeyException = @"NSUnknownKeyException"; GS_DECLARE NSString* const NSUndefinedKeyException = @"NSUnknownKeyException"; /* NSKeyValueObserving */ GS_DECLARE NSString* const NSKeyValueChangeIndexesKey = @"indexes"; GS_DECLARE NSString* const NSKeyValueChangeKindKey = @"kind"; GS_DECLARE NSString* const NSKeyValueChangeNewKey = @"new"; GS_DECLARE NSString* const NSKeyValueChangeOldKey = @"old"; GS_DECLARE NSString* const NSKeyValueChangeNotificationIsPriorKey = @"notificationIsPrior"; /* NSLocale */ GS_DECLARE NSString* const NSCurrentLocaleDidChangeNotification = @"NSCurrentLocaleDidChangeNotification"; /* NSLocale Component Keys */ GS_DECLARE NSString* const NSLocaleIdentifier = @"NSLocaleIdentifier"; GS_DECLARE NSString* const NSLocaleLanguageCode = @"NSLocaleLanguageCode"; GS_DECLARE NSString* const NSLocaleCountryCode = @"NSLocaleCountryCode"; GS_DECLARE NSString* const NSLocaleScriptCode = @"NSLocaleScriptCode"; GS_DECLARE NSString* const NSLocaleVariantCode = @"NSLocaleVariantCode"; GS_DECLARE NSString* const NSLocaleExemplarCharacterSet = @"NSLocaleExemplarCharacterSet"; GS_DECLARE NSString* const NSLocaleCalendarIdentifier = @"calendar"; GS_DECLARE NSString* const NSLocaleCalendar = @"NSLocaleCalendar"; GS_DECLARE NSString* const NSLocaleCollationIdentifier = @"collation"; GS_DECLARE NSString* const NSLocaleUsesMetricSystem = @"NSLocaleUsesMetricSystem"; GS_DECLARE NSString* const NSLocaleMeasurementSystem = @"NSLocaleMeasurementSystem"; GS_DECLARE NSString* const NSLocaleDecimalSeparator = @"NSLocaleDecimalSeparator"; GS_DECLARE NSString* const NSLocaleGroupingSeparator = @"NSLocaleGroupingSeparator"; GS_DECLARE NSString* const NSLocaleCurrencySymbol = @"NSLocaleCurrencySymbol"; GS_DECLARE NSString* const NSLocaleCurrencyCode = @"NSLocaleCurrencyCode"; GS_DECLARE NSString* const NSLocaleCollatorIdentifier = @"NSLocaleCollatorIdentifier"; GS_DECLARE NSString* const NSLocaleQuotationBeginDelimiterKey = @"NSLocaleQuotationBeginDelimiterKey"; GS_DECLARE NSString* const NSLocaleQuotationEndDelimiterKey = @"NSLocaleQuotationEndDelimiterKey"; GS_DECLARE NSString* const NSLocaleAlternateQuotationBeginDelimiterKey = @"NSLocaleAlternateQuotationBeginDelimiterKey"; GS_DECLARE NSString* const NSLocaleAlternateQuotationEndDelimiterKey = @"NSLocaleAlternateQuotationEndDelimiterKey"; /* NSLocale Calendar Keys */ GS_DECLARE NSString* const NSGregorianCalendar = @"gregorian"; GS_DECLARE NSString* const NSBuddhistCalendar = @"buddhist"; GS_DECLARE NSString* const NSChineseCalendar = @"chinese"; GS_DECLARE NSString* const NSHebrewCalendar = @"hebrew"; GS_DECLARE NSString* const NSIslamicCalendar = @"islamic"; GS_DECLARE NSString* const NSIslamicCivilCalendar = @"islamic-civil"; GS_DECLARE NSString* const NSJapaneseCalendar = @"japanese"; GS_DECLARE NSString* const NSRepublicOfChinaCalendar = @"roc"; GS_DECLARE NSString* const NSPersianCalendar = @"persian"; GS_DECLARE NSString* const NSIndianCalendar = @"indian"; GS_DECLARE NSString* const NSISO8601Calendar = @""; /* NSLocale New Calendar ID Keys */ GS_DECLARE NSString* const NSCalendarIdentifierGregorian = @"gregorian"; GS_DECLARE NSString* const NSCalendarIdentifierBuddhist = @"buddhist"; GS_DECLARE NSString* const NSCalendarIdentifierChinese = @"chinese"; GS_DECLARE NSString* const NSCalendarIdentifierCoptic = @"coptic"; GS_DECLARE NSString* const NSCalendarIdentifierEthiopicAmeteMihret = @"ethiopic-amete-mihret"; GS_DECLARE NSString* const NSCalendarIdentifierEthiopicAmeteAlem = @"ethiopic-amete-alem"; GS_DECLARE NSString* const NSCalendarIdentifierHebrew = @"hebrew"; GS_DECLARE NSString* const NSCalendarIdentifierISO8601 = @""; GS_DECLARE NSString* const NSCalendarIdentifierIndian = @"indian"; GS_DECLARE NSString* const NSCalendarIdentifierIslamic = @"islamic"; GS_DECLARE NSString* const NSCalendarIdentifierIslamicCivil = @"islamic-civil"; GS_DECLARE NSString* const NSCalendarIdentifierJapanese = @"japanese"; GS_DECLARE NSString* const NSCalendarIdentifierPersian = @"persian"; GS_DECLARE NSString* const NSCalendarIdentifierRepublicOfChina = @"roc"; GS_DECLARE NSString* const NSCalendarIdentifierIslamicTabular = @"islamic-tabular"; GS_DECLARE NSString* const NSCalendarIdentifierIslamicUmmAlQura = @"islamic-umm-al-qura"; /* NSMetadata */ GS_DECLARE NSString* const NSMetadataQueryUserHomeScope = @"NSMetadataQueryUserHomeScope"; GS_DECLARE NSString* const NSMetadataQueryLocalComputerScope = @"NSMetadataQueryLocalComputerScope"; GS_DECLARE NSString* const NSMetadataQueryNetworkScope = @"NSMetadataQueryNetworkScope"; GS_DECLARE NSString* const NSMetadataQueryUbiquitousDocumentsScope = @"NSMetadataQueryUbiquitousDocumentsScope"; GS_DECLARE NSString* const NSMetadataQueryUbiquitousDataScope = @"NSMetadataQueryUbiquitousDataScope"; GS_DECLARE NSString* const NSMetadataQueryDidFinishGatheringNotification = @"NSMetadataQueryDidFinishGatheringNotification"; GS_DECLARE NSString* const NSMetadataQueryDidStartGatheringNotification = @"NSMetadataQueryDidStartGatheringNotification"; GS_DECLARE NSString* const NSMetadataQueryDidUpdateNotification = @"NSMetadataQueryDidUpdateNotification"; GS_DECLARE NSString* const NSMetadataQueryGatheringProgressNotification = @"NSMetadataQueryGatheringProgressNotification"; /* NSNetServices */ GS_DECLARE NSString* const NSNetServicesErrorCode = @"NSNetServicesErrorCode"; GS_DECLARE NSString* const NSNetServicesErrorDomain = @"NSNetServicesErrorDomain"; /* NSPersonNameComponentsFormatter */ GS_DECLARE NSString* const NSPersonNameComponentKey = @"NSPersonNameComponentKey"; GS_DECLARE NSString* const NSPersonNameComponentGivenName = @"NSPersonNameComponentGivenName"; GS_DECLARE NSString* const NSPersonNameComponentFamilyName = @"NSPersonNameComponentFamilyName"; GS_DECLARE NSString* const NSPersonNameComponentMiddleName = @"NSPersonNameComponentMiddleName"; GS_DECLARE NSString* const NSPersonNameComponentPrefix = @"NSPersonNameComponentPrefix"; GS_DECLARE NSString* const NSPersonNameComponentSuffix = @"NSPersonNameComponentSuffix"; GS_DECLARE NSString* const NSPersonNameComponentNickname = @"NSPersonNameComponentNickname"; GS_DECLARE NSString* const NSPersonNameComponentDelimiter = @"NSPersonNameComponentDelimiter"; /* NSPort */ GS_DECLARE NSString* const NSInvalidReceivePortException = @"NSInvalidReceivePortException"; GS_DECLARE NSString* const NSInvalidSendPortException = @"NSInvalidSendPortException"; GS_DECLARE NSString* const NSPortReceiveException = @"NSPortReceiveException"; GS_DECLARE NSString* const NSPortSendException = @"NSPortSendException"; GS_DECLARE NSString* const NSPortTimeoutException = @"NSPortTimeoutException"; /* NSSpellServer */ GS_DECLARE NSString* const NSGrammarRange = @"NSGrammarRange"; GS_DECLARE NSString* const NSGrammarUserDescription = @"NSGrammarUserDescription"; GS_DECLARE NSString* const NSGrammarCorrections = @"NSGrammarCorrections"; /* NSTimeZone */ GS_DECLARE NSString* const NSSystemTimeZoneDidChangeNotification = @"NSSystemTimeZoneDidChangeNotification"; /* NSURLCredentialStorage */ GS_DECLARE NSString* const NSURLCredentialStorageChangedNotification = @"NSURLCredentialStorageChangedNotification"; /* NSURLHandle */ GS_DECLARE NSString* const NSHTTPPropertyStatusCodeKey = @"NSHTTPPropertyStatusCodeKey"; GS_DECLARE NSString* const NSHTTPPropertyStatusReasonKey = @"NSHTTPPropertyStatusReasonKey"; GS_DECLARE NSString* const NSHTTPPropertyServerHTTPVersionKey = @"NSHTTPPropertyServerHTTPVersionKey"; GS_DECLARE NSString* const NSHTTPPropertyRedirectionHeadersKey = @"NSHTTPPropertyRedirectionHeadersKey"; GS_DECLARE NSString* const NSHTTPPropertyErrorPageDataKey = @"NSHTTPPropertyErrorPageDataKey"; /* NSURLHandle GNUstep extras */ GS_DECLARE NSString* const GSHTTPPropertyMethodKey = @"GSHTTPPropertyMethodKey"; GS_DECLARE NSString* const GSHTTPPropertyLocalHostKey = @"GSHTTPPropertyLocalHostKey"; GS_DECLARE NSString* const GSHTTPPropertyProxyHostKey = @"GSHTTPPropertyProxyHostKey"; GS_DECLARE NSString* const GSHTTPPropertyProxyPortKey = @"GSHTTPPropertyProxyPortKey"; GS_DECLARE NSString* const GSHTTPPropertyCertificateFileKey = @"GSHTTPPropertyCertificateFileKey"; GS_DECLARE NSString* const GSHTTPPropertyKeyFileKey = @"GSHTTPPropertyKeyFileKey"; GS_DECLARE NSString* const GSHTTPPropertyPasswordKey = @"GSHTTPPropertyPasswordKey"; /* NSURLProtectionSpace */ GS_DECLARE NSString* const NSURLProtectionSpaceFTPProxy = @"ftp"; GS_DECLARE NSString* const NSURLProtectionSpaceHTTPProxy = @"http"; GS_DECLARE NSString* const NSURLProtectionSpaceHTTPSProxy = @"https"; GS_DECLARE NSString* const NSURLProtectionSpaceSOCKSProxy = @"SOCKS"; GS_DECLARE NSString* const NSURLAuthenticationMethodDefault = @"NSURLAuthenticationMethodDefault"; GS_DECLARE NSString* const NSURLAuthenticationMethodHTMLForm = @"NSURLAuthenticationMethodHTMLForm"; GS_DECLARE NSString* const NSURLAuthenticationMethodHTTPBasic = @"NSURLAuthenticationMethodHTTPBasic"; GS_DECLARE NSString* const NSURLAuthenticationMethodHTTPDigest = @"NSURLAuthenticationMethodHTTPDigest"; GS_DECLARE NSString* const NSURLAuthenticationMethodNTLM = @"NSURLAuthenticationMethodNTLM"; GS_DECLARE NSString* const NSURLAuthenticationMethodNegotiate = @"NSURLAuthenticationMethodNegotiate"; GS_DECLARE NSString* const NSURLAuthenticationMethodClientCertificate = @"NSURLAuthenticationMethodClientCertificate"; GS_DECLARE NSString* const NSURLAuthenticationMethodServerTrust = @"NSURLAuthenticationMethodServerTrust"; /* NSUserNotification */ GS_DECLARE NSString* const NSUserNotificationDefaultSoundName = @"NSUserNotificationDefaultSoundName"; /* NSStream+GNUstepBase */ GS_DECLARE NSString* const GSStreamLocalAddressKey = @"GSStreamLocalAddressKey"; GS_DECLARE NSString* const GSStreamLocalPortKey = @"GSStreamLocalPortKey"; GS_DECLARE NSString* const GSStreamRemoteAddressKey = @"GSStreamRemoteAddressKey"; GS_DECLARE NSString* const GSStreamRemotePortKey = @"GSStreamRemotePortKey"; /* NSError */ GS_DECLARE NSString* const NSFilePathErrorKey = @"NSFilePath"; GS_DECLARE NSString* const NSLocalizedDescriptionKey = @"NSLocalizedDescriptionKey"; GS_DECLARE NSString* const NSStringEncodingErrorKey = @"NSStringEncodingErrorKey"; GS_DECLARE NSString* const NSURLErrorKey = @"NSURLErrorKey"; GS_DECLARE NSString* const NSUnderlyingErrorKey = @"NSUnderlyingErrorKey"; GS_DECLARE NSString* const NSLocalizedFailureReasonErrorKey = @"NSLocalizedFailureReasonErrorKey"; GS_DECLARE NSString* const NSLocalizedRecoveryOptionsErrorKey = @"NSLocalizedRecoveryOptionsErrorKey"; GS_DECLARE NSString* const NSLocalizedRecoverySuggestionErrorKey = @"NSLocalizedRecoverySuggestionErrorKey"; GS_DECLARE NSString* const NSRecoveryAttempterErrorKey = @"NSRecoveryAttempterErrorKey"; GS_DECLARE NSString* const NSURLErrorFailingURLErrorKey = @"NSErrorFailingURLKey"; GS_DECLARE NSString* const NSURLErrorFailingURLStringErrorKey = @"NSErrorFailingURLStringKey"; GS_DECLARE NSErrorDomain const NSMACHErrorDomain = @"NSMACHErrorDomain"; GS_DECLARE NSErrorDomain const NSOSStatusErrorDomain = @"NSOSStatusErrorDomain"; GS_DECLARE NSErrorDomain const NSPOSIXErrorDomain = @"NSPOSIXErrorDomain"; GS_DECLARE NSErrorDomain const NSCocoaErrorDomain = @"NSCocoaErrorDomain"; /* NSExtensionContext */ GS_DECLARE NSString* const NSExtensionItemsAndErrorsKey = @"NSExtensionItemsAndErrorsKey"; GS_DECLARE NSString* const NSExtensionHostWillEnterForegroundNotification = @"NSExtensionHostWillEnterForegroundNotification"; GS_DECLARE NSString* const NSExtensionHostDidEnterBackgroundNotification = @"NSExtensionHostDidEnterBackgroundNotification"; GS_DECLARE NSString* const NSExtensionHostWillResignActiveNotification = @"NSExtensionHostWillResignActiveNotification"; GS_DECLARE NSString* const NSExtensionHostDidBecomeActiveNotification = @"NSExtensionHostDidBecomeActiveNotification"; /* NSInvocationOperation */ GS_DECLARE NSString* const NSInvocationOperationVoidResultException = @"NSInvocationOperationVoidResultException"; GS_DECLARE NSString* const NSInvocationOperationCancelledException = @"NSInvcationOperationCancelledException"; /* NSXMLParser */ GS_DECLARE NSString* const NSXMLParserErrorDomain = @"NSXMLParserErrorDomain"; /* For bug in gcc 3.1. See NSByteOrder.h */ void _gcc3_1_hack(void){} gnustep-base-1.29.0/Source/hpux-load.h000066400000000000000000000056171435650067400175350ustar00rootroot00000000000000/* hpux-load - Definitions and translations for dynamic loading with HP-UX Copyright (C) 1995, Free Software Foundation This program 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 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef __hpux_load_h_INCLUDE #define __hpux_load_h_INCLUDE #include /* This is the GNU name for the CTOR list */ #define CTOR_LIST "__CTOR_LIST__" /* link flags */ #define LINK_FLAGS (BIND_IMMEDIATE | BIND_VERBOSE) /* Types defined appropriately for the dynamic linker */ typedef shl_t dl_handle_t; typedef void* dl_symbol_t; /* Do any initialization necessary. Return 0 on success (or if no initialization needed. */ static int __objc_dynamic_init(const char* exec_path) { return 0; } /* Link in the module given by the name 'module'. Return a handle which can be used to get information about the loded code. */ static dl_handle_t __objc_dynamic_link(const char* module, int mode, const char* debug_file) { return (dl_handle_t)shl_load(module, LINK_FLAGS, 0L); } /* Return the address of a symbol given by the name 'symbol' from the module * associated with 'handle' * This function is not always used, so we mark it as unused to avoid warnings. */ static dl_symbol_t __objc_dynamic_find_symbol(dl_handle_t handle, const char* symbol) __attribute__((unused)); static dl_symbol_t __objc_dynamic_find_symbol(dl_handle_t handle, const char* symbol) { int ok; void *value; ok = shl_findsym(&handle, symbol, TYPE_UNDEFINED, value); if (ok != 0) value = 0; return value; } /* remove the code from memory associated with the module 'handle' */ static int __objc_dynamic_unlink(dl_handle_t handle) { return shl_unload(handle); } /* Print an error message (prefaced by 'error_string') relevant to the last error encountered */ static void __objc_dynamic_error(FILE *error_stream, const char *error_string) { fprintf(error_stream, "%s\n", error_string); } /* Debugging: define these if they are available */ static int __objc_dynamic_undefined_symbol_count(void) { return 0; } static char** __objc_dynamic_list_undefined_symbols(void) { return NULL; } // TODO: search for an hp-ux equivalent of dladdr() */ static char * __objc_dynamic_get_symbol_path(dl_handle_t handle, dl_symbol_t symbol) { return NULL; } #endif /* __hpux_load_h_INCLUDE */ gnustep-base-1.29.0/Source/inet_ntop.m000066400000000000000000000160301435650067400176270ustar00rootroot00000000000000/* from NetBSD: inet_pton.c,v 1.16 2000/02/07 18:51:02 itojun Exp */ /* Copyright (c) 1996 by Internet Software Consortium. * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ #import "common.h" #include #include #ifdef HAVE_SYS_PARAM_H #include #endif #include #import "GSPrivate.h" #import "GSNetwork.h" #if HAVE_SYS_SOCKET_H #include #endif #if HAVE_ARPA_NAMESER_H #include #endif #ifndef INT16SZ #define INT16SZ 2 /* for systems without 16-bit ints */ #endif #ifndef WSAAPI #define WSAAPI #endif /* * WARNING: Don't even consider trying to compile this on a system where * sizeof(int) < 4. sizeof(int) > 4 is fine; all the world's not a VAX. */ static const char *inet_ntop4(const u_char *src, char *dst, size_t size); static __attribute__((unused)) const char *inet_ntop6(const u_char *src, char *dst, size_t size); /* char * * inet_ntop(af, src, dst, size) * convert a network format address to presentation format. * return: * pointer to presentation format address (`dst'), or NULL (see errno). * author: * Paul Vixie, 1996. */ const char * WSAAPI inet_ntop(int af, const void *src, char *dst, size_t size) { switch (af) { case AF_INET: return (inet_ntop4(src, dst, size)); #ifdef INET6 case AF_INET6: return (inet_ntop6(src, dst, size)); #endif default: errno = EAFNOSUPPORT; return (NULL); } /* NOTREACHED */ } /* const char * * inet_ntop4(src, dst, size) * format an IPv4 address, more or less like inet_ntoa() * return: * `dst' (as a const) * notes: * (1) uses no statics * (2) takes a u_char* not an in_addr as input * author: * Paul Vixie, 1996. */ static const char * inet_ntop4(src, dst, size) const u_char *src; char *dst; size_t size; { static const char fmt[] = "%u.%u.%u.%u"; char tmp[sizeof "255.255.255.255"]; int l; l = snprintf(tmp, size, fmt, src[0], src[1], src[2], src[3]); if (l <= 0 || l >= size) { errno = ENOSPC; return (NULL); } strncpy(dst, tmp, size); dst[size-1] = '\0'; return (dst); } /* const char * * inet_ntop6(src, dst, size) * convert IPv6 binary address into presentation (printable) format * author: * Paul Vixie, 1996. */ static __attribute__((unused)) const char * inet_ntop6(src, dst, size) const u_char *src; char *dst; size_t size; { /* * Note that int32_t and int16_t need only be "at least" large enough * to contain a value of the specified size. On some systems, like * Crays, there is no such thing as an integer variable with 16 bits. * Keep this in mind if you think this function should have been coded * to use pointer overlays. All the world's not a VAX. */ char tmp[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"]; char *tp, *ep; struct { int base, len; } best, cur; u_int words[IN6ADDRSZ / INT16SZ]; int i; int advance; /* * Preprocess: * Copy the input (bytewise) array into a wordwise array. * Find the longest run of 0x00's in src[] for :: shorthanding. */ memset(words, '\0', sizeof words); for (i = 0; i < IN6ADDRSZ; i++) words[i / 2] |= (src[i] << ((1 - (i % 2)) << 3)); best.base = -1; cur.base = -1; for (i = 0; i < (IN6ADDRSZ / INT16SZ); i++) { if (words[i] == 0) { if (cur.base == -1) cur.base = i, cur.len = 1; else cur.len++; } else { if (cur.base != -1) { if (best.base == -1 || cur.len > best.len) best = cur; cur.base = -1; } } } if (cur.base != -1) { if (best.base == -1 || cur.len > best.len) best = cur; } if (best.base != -1 && best.len < 2) best.base = -1; /* * Format the result. */ tp = tmp; ep = tmp + sizeof(tmp); for (i = 0; i < (IN6ADDRSZ / INT16SZ) && tp < ep; i++) { /* Are we inside the best run of 0x00's? */ if (best.base != -1 && i >= best.base && i < (best.base + best.len)) { if (i == best.base) { if (tp + 1 >= ep) return (NULL); *tp++ = ':'; } continue; } /* Are we following an initial run of 0x00s or any real hex? */ if (i != 0) { if (tp + 1 >= ep) return (NULL); *tp++ = ':'; } /* Is this address an encapsulated IPv4? */ if (i == 6 && best.base == 0 && (best.len == 6 || (best.len == 5 && words[5] == 0xffff))) { if (!inet_ntop4(src+12, tp, (size_t)(ep - tp))) return (NULL); tp += strlen(tp); break; } advance = snprintf(tp, ep - tp, "%x", words[i]); if (advance <= 0 || advance >= ep - tp) return (NULL); tp += advance; } /* Was it a trailing run of 0x00's? */ if (best.base != -1 && (best.base + best.len) == (IN6ADDRSZ / INT16SZ)) { if (tp + 1 >= ep) return (NULL); *tp++ = ':'; } if (tp + 1 >= ep) return (NULL); *tp++ = '\0'; /* * Check for overflow, copy, and we're done. */ if ((size_t)(tp - tmp) > size) { errno = ENOSPC; return (NULL); } strncpy(dst, tmp, size); dst[size-1] = '\0'; return (dst); } gnustep-base-1.29.0/Source/inet_pton.m000066400000000000000000000156201435650067400176330ustar00rootroot00000000000000/* $Id: inet_pton.c,v 1.1.1.1 2002/10/26 04:25:59 lukem Exp $ */ /* from NetBSD: inet_pton.c,v 1.16 2000/02/07 18:51:02 itojun Exp */ /* Copyright (c) 1996 by Internet Software Consortium. * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ #include "config.h" #include #if defined(HAVE_INTTYPES_H) #include #elif defined(HAVE_STDINT_H) #include #endif #include #ifdef HAVE_SYS_PARAM_H #include #endif #import "GSPrivate.h" #import "GSNetwork.h" #if HAVE_SYS_SOCKET_H #include #endif #if HAVE_ARPA_NAMESER_H #include #endif #ifndef WSAAPI #define WSAAPI #endif /* * WARNING: Don't even consider trying to compile this on a system where * sizeof(int) < 4. sizeof(int) > 4 is fine; all the world's not a VAX. */ static int inet_pton4(const char *src, uint8_t *dst, int pton); #ifdef INET6 static int inet_pton6(const char *src, uint8_t *dst); #endif /* int * inet_pton(af, src, dst) * convert from presentation format (which usually means ASCII printable) * to network format (which is usually some kind of binary format). * return: * 1 if the address was valid for the specified address family * 0 if the address wasn't valid (`dst' is untouched in this case) * -1 if some other error occurred (`dst' is untouched in this case, too) * author: * Paul Vixie, 1996. */ int WSAAPI inet_pton(int af, const char *src, void *dst) { switch (af) { case AF_INET: return (inet_pton4(src, dst, 1)); #ifdef INET6 case AF_INET6: return (inet_pton6(src, dst)); #endif default: errno = EAFNOSUPPORT; return (-1); } /* NOTREACHED */ } /* int * inet_pton4(src, dst, pton) * when last arg is 0: inet_aton(). with hexadecimal, octal and shorthand. * when last arg is 1: inet_pton(). decimal dotted-quad only. * return: * 1 if `src' is a valid input, else 0. * notice: * does not touch `dst' unless it's returning 1. * author: * Paul Vixie, 1996. */ static int inet_pton4(const char *src, uint8_t *dst, int pton) { u_int val; u_int digit; int base, n; unsigned char c; u_int parts[4]; register u_int *pp = parts; c = *src; for (;;) { /* * Collect number up to ``.''. * Values are specified as for C: * 0x=hex, 0=octal, isdigit=decimal. */ if (!isdigit(c)) return (0); val = 0; base = 10; if (c == '0') { c = *++src; if (c == 'x' || c == 'X') base = 16, c = *++src; else if (isdigit(c) && c != '9') base = 8; } /* inet_pton() takes decimal only */ if (pton && base != 10) return (0); for (;;) { if (isdigit(c)) { digit = c - '0'; if (digit >= base) break; val = (val * base) + digit; c = *++src; } else if (base == 16 && isxdigit(c)) { digit = c + 10 - (islower(c) ? 'a' : 'A'); if (digit >= 16) break; val = (val << 4) | digit; c = *++src; } else break; } if (c == '.') { /* * Internet format: * a.b.c.d * a.b.c (with c treated as 16 bits) * a.b (with b treated as 24 bits) * a (with a treated as 32 bits) */ if (pp >= parts + 3) return (0); *pp++ = val; c = *++src; } else break; } /* * Check for trailing characters. */ if (c != '\0' && !isspace(c)) return (0); /* * Concoct the address according to * the number of parts specified. */ n = pp - parts + 1; /* inet_pton() takes dotted-quad only. it does not take shorthand. */ if (pton && n != 4) return (0); switch (n) { case 0: return (0); /* initial nondigit */ case 1: /* a -- 32 bits */ break; case 2: /* a.b -- 8.24 bits */ if (parts[0] > 0xff || val > 0xffffff) return (0); val |= parts[0] << 24; break; case 3: /* a.b.c -- 8.8.16 bits */ if ((parts[0] | parts[1]) > 0xff || val > 0xffff) return (0); val |= (parts[0] << 24) | (parts[1] << 16); break; case 4: /* a.b.c.d -- 8.8.8.8 bits */ if ((parts[0] | parts[1] | parts[2] | val) > 0xff) return (0); val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8); break; } if (dst) { val = htonl(val); memcpy(dst, &val, INADDRSZ); } return (1); } #ifdef INET6 /* int * inet_pton6(src, dst) * convert presentation level address to network order binary form. * return: * 1 if `src' is a valid [RFC1884 2.2] address, else 0. * notice: * (1) does not touch `dst' unless it's returning 1. * (2) :: in a full address is silently ignored. * credit: * inspired by Mark Andrews. * author: * Paul Vixie, 1996. */ static int inet_pton6(const char *src, uint8_t *dst) { static const char xdigits_l[] = "0123456789abcdef", xdigits_u[] = "0123456789ABCDEF"; uint8_t tmp[IN6ADDRSZ], *tp, *endp, *colonp; const char *xdigits, *curtok; int ch, saw_xdigit; u_int val; memset((tp = tmp), '\0', IN6ADDRSZ); endp = tp + IN6ADDRSZ; colonp = NULL; /* Leading :: requires some special handling. */ if (*src == ':') if (*++src != ':') return (0); curtok = src; saw_xdigit = 0; val = 0; while ((ch = *src++) != '\0') { const char *pch; if ((pch = strchr((xdigits = xdigits_l), ch)) == NULL) pch = strchr((xdigits = xdigits_u), ch); if (pch != NULL) { val <<= 4; val |= (pch - xdigits); if (val > 0xffff) return (0); saw_xdigit = 1; continue; } if (ch == ':') { curtok = src; if (!saw_xdigit) { if (colonp) return (0); colonp = tp; continue; } else if (*src == '\0') return (0); if (tp + INT16SZ > endp) return (0); *tp++ = (uint8_t) (val >> 8) & 0xff; *tp++ = (uint8_t) val & 0xff; saw_xdigit = 0; val = 0; continue; } if (ch == '.' && ((tp + INADDRSZ) <= endp) && inet_pton4(curtok, tp, 1) > 0) { tp += INADDRSZ; saw_xdigit = 0; break; /* '\0' was seen by inet_pton4(). */ } return (0); } if (saw_xdigit) { if (tp + INT16SZ > endp) return (0); *tp++ = (uint8_t) (val >> 8) & 0xff; *tp++ = (uint8_t) val & 0xff; } if (colonp != NULL) { /* * Since some memmove()'s erroneously fail to handle * overlapping regions, we'll do the shift by hand. */ const int n = tp - colonp; int i; if (tp == endp) return (0); for (i = 1; i <= n; i++) { endp[- i] = colonp[n - i]; colonp[n - i] = 0; } tp = endp; } if (tp != endp) return (0); memcpy(dst, tmp, IN6ADDRSZ); return (1); } #endif gnustep-base-1.29.0/Source/libgnustep-base-entry.m000066400000000000000000000036631435650067400220630ustar00rootroot00000000000000/** DLL entry routine Copyright (C) 1996, 1997 Free Software Foundation, Inc. Original Author: Scott Christley Created: 1996 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" #ifdef _MSC_VER #define WINBOOL WinBOOL #endif /* Only if using Microsoft's tools and libraries */ #ifdef __MS_WIN32__ WINBOOL WINAPI _CRT_INIT(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved); #endif /* __MS_WIN32__ */ // // DLL entry function for GNUstep Base Library // This function gets called everytime a process/thread attaches to DLL // WINBOOL WINAPI DllMain(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved) { switch(ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_PROCESS_DETACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: { #ifdef __MS_WIN32__ // CRT_INIT must be called on DLL/thread attach and detach, although // first on attach and last on detach. Since we don't do anything else // in this method we can just always call it. if (!_CRT_INIT(hInst, ul_reason_for_call, lpReserved)) { return FALSE; } #endif /* __MS_WIN32__ */ } break; } return TRUE; } gnustep-base-1.29.0/Source/null-load.h000066400000000000000000000050021435650067400175070ustar00rootroot00000000000000/* null-load - NULL dynamic loader. Doesn't do anything. Copyright (C) 1995, Free Software Foundation, Inc. This program 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 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef __null_load_h_INCLUDE #define __null_load_h_INCLUDE #define CTOR_LIST "" /* Types defined appropriately for the dynamic linker */ typedef void* dl_handle_t; typedef void* dl_symbol_t; /* Do any initialization necessary. Return 0 on success (or if no initialization needed. */ static int __objc_dynamic_init(const char* exec_path) { return -1; } /* Link in the module given by the name 'module'. Return a handle which can be used to get information about the loded code. */ static dl_handle_t __objc_dynamic_link(const char* module, int mode, const char* debug_file) { return 0; } /* Return the address of a symbol given by the name 'symbol' from the module * associated with 'handle' * This function is not always used, so we mark it as unused to avoid warnings. */ static dl_symbol_t __objc_dynamic_find_symbol(dl_handle_t handle, const char* symbol) __attribute__((unused)); static dl_symbol_t __objc_dynamic_find_symbol(dl_handle_t handle, const char* symbol) { return 0; } /* remove the code from memory associated with the module 'handle' */ static int __objc_dynamic_unlink(dl_handle_t handle) { return 0; } /* Print an error message (prefaced by 'error_string') relevant to the last error encountered */ static void __objc_dynamic_error(FILE *error_stream, const char *error_string) { fprintf(error_stream, "%s\n", error_string); } /* Debugging: define these if they are available */ static int __objc_dynamic_undefined_symbol_count(void) { return 0; } static char** __objc_dynamic_list_undefined_symbols(void) { return NULL; } static char * __objc_dynamic_get_symbol_path(dl_handle_t handle, dl_symbol_t symbol) { return NULL; } #endif /* __null_load_h_INCLUDE */ gnustep-base-1.29.0/Source/objc-load.h000066400000000000000000000025271435650067400174630ustar00rootroot00000000000000/* objc-load.h - Dynamically load in Obj-C modules (Classes, Categories) Copyright (C) 1993, 2002 Free Software Foundation, Inc. Author: Adam Fedor Date: 1993 This file is part of the GNUstep Objective-C Library. 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 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. If you are interested in a warranty or support for this source code, contact Scott Christley for more information. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110 USA. */ #ifndef __objc_load_h_INCLUDE #define __objc_load_h_INCLUDE #include #include #ifdef HAVE_DLADDR #define LINKER_GETSYMBOL 1 #else #define LINKER_GETSYMBOL 0 #endif #endif /* __objc_load_h_INCLUDE */ gnustep-base-1.29.0/Source/objc-load.m000066400000000000000000000174431435650067400174730ustar00rootroot00000000000000/* objc-load - Dynamically load in Obj-C modules (Classes, Categories) Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. Written by: Adam Fedor, Pedja Bogdanovich This file is part of the GNUstep Base Library. 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 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 USA. */ /* PS: Unloading modules is not implemented. */ #import "common.h" #include #if defined(NeXT_RUNTIME) # include #endif #ifdef __GNUSTEP_RUNTIME__ # include #endif #if defined(__CYGWIN__) # include #endif #include "objc-load.h" #import "Foundation/NSException.h" #import "GSPrivate.h" /* include the interface to the dynamic linker */ #include "dynamic-load.h" /* dynamic_loaded is YES if the dynamic loader was sucessfully initialized. */ static BOOL dynamic_loaded; /* Our current callback function */ static void (*_objc_load_load_callback)(Class, struct objc_category *) = 0; /* Check to see if there are any undefined symbols. Print them out. */ static int objc_check_undefineds(FILE *errorStream) { int count = __objc_dynamic_undefined_symbol_count(); if (count != 0) { int i; char **undefs; undefs = __objc_dynamic_list_undefined_symbols(); if (errorStream) { fprintf(errorStream, "Undefined symbols:\n"); } for (i = 0; i < count; i++) { if (errorStream) { fprintf(errorStream, " %s\n", undefs[i]); } } return 1; } return 0; } /* Initialize for dynamic loading */ static int objc_initialize_loading(FILE *errorStream) { NSString *path; #if defined(_WIN32) || defined(__CYGWIN__) const unichar *fsPath; #else const char *fsPath; #endif dynamic_loaded = NO; path = GSPrivateExecutablePath(); NSDebugFLLog(@"NSBundle", @"Debug (objc-load): initializing dynamic loader for %@", path); fsPath = [[path stringByDeletingLastPathComponent] fileSystemRepresentation]; if (__objc_dynamic_init(fsPath)) { if (errorStream) { __objc_dynamic_error(errorStream, "Error (objc-load): Cannot initialize dynamic linker"); } return 1; } else { dynamic_loaded = YES; } return 0; } /* A callback received from the Object initializer (_objc_exec_class). Do what we need to do and call our own callback. */ static void objc_load_callback(Class class, struct objc_category * category) { if (_objc_load_load_callback) { _objc_load_load_callback(class, category); } } #if defined(_WIN32) || defined(__CYGWIN__) #define FSCHAR unichar #else #define FSCHAR char #endif long GSPrivateLoadModule(NSString *filename, FILE *errorStream, void (*loadCallback)(Class, struct objc_category *), void **header, NSString *debugFilename) { #ifdef NeXT_RUNTIME int errcode; dynamic_loaded = YES; return objc_loadModule([filename fileSystemRepresentation], loadCallback, &errcode); #else dl_handle_t handle; void __objc_resolve_class_links(void); #if !defined(__ELF__) && !defined(CON_AUTOLOAD) typedef void (*void_fn)(); void_fn *ctor_list; int i; #endif if (!dynamic_loaded) { if (objc_initialize_loading(errorStream)) { return 1; } } _objc_load_load_callback = loadCallback; _objc_load_callback = objc_load_callback; /* Link in the object file */ NSDebugFLLog(@"NSBundle", @"Debug (objc-load): Linking file %@\n", filename); handle = __objc_dynamic_link((FSCHAR*)[filename fileSystemRepresentation], 1, (FSCHAR*)[debugFilename fileSystemRepresentation]); if (handle == 0) { if (errorStream) { __objc_dynamic_error(errorStream, "Error (objc-load)"); } _objc_load_load_callback = 0; _objc_load_callback = 0; return 1; } /* If there are any undefined symbols, we can't load the bundle */ if (objc_check_undefineds(errorStream)) { __objc_dynamic_unlink(handle); _objc_load_load_callback = 0; _objc_load_callback = 0; return 1; } #if !defined(__ELF__) && !defined(CON_AUTOLOAD) /* Get the constructor list and load in the objects */ ctor_list = (void_fn *)__objc_dynamic_find_symbol(handle, CTOR_LIST); if (!ctor_list) { if (errorStream) { fprintf(errorStream, "Error (objc-load): Cannot load objects (no CTOR list)\n"); } _objc_load_load_callback = 0; _objc_load_callback = 0; return 1; } NSDebugFLLog(@"NSBundle", @"Debug (objc-load): %d modules\n", (int)ctor_list[0]); for (i = 1; ctor_list[i]; i++) { NSDebugFLLog(@"NSBundle", @"Debug (objc-load): Invoking CTOR %p\n", ctor_list[i]); ctor_list[i](); } #endif /* not __ELF__ */ #if !defined(__GNUSTEP_RUNTIME__) && !defined(__GNU_LIBOBJC__) __objc_resolve_class_links(); /* fill in subclass_list and sibling_class */ #endif _objc_load_callback = 0; _objc_load_load_callback = 0; return 0; #endif /* not NeXT_RUNTIME */ } long GSPrivateUnloadModule(FILE *errorStream, void (*unloadCallback)(Class, struct objc_category *)) { if (!dynamic_loaded) { return 1; } if (errorStream) { fprintf(errorStream, "Warning: unloading modules not implemented\n"); } return 0; } #if defined(_WIN32) || defined(__CYGWIN__) // FIXME: We can probably get rid of this now - MinGW should include a working // dladdr() wrapping this function, so we no longer need a Windows-only code // path NSString * GSPrivateSymbolPath(Class theClass) { unichar buf[MAX_PATH]; NSString *s = nil; MEMORY_BASIC_INFORMATION memInfo; VirtualQueryEx(GetCurrentProcess(), theClass, &memInfo, sizeof(memInfo)); if (GetModuleFileNameW(memInfo.AllocationBase, buf, sizeof(buf))) { #ifdef __CYGWIN__ #warning Under Cygwin, we may want to use cygwin_conv_path() to get the unix path back? #endif s = [NSString stringWithCharacters: buf length: wcslen(buf)]; } return s; } #else NSString *GSPrivateSymbolPath(Class theClass) { #if LINKER_GETSYMBOL Dl_info info; /* This is correct: dladdr() does the opposite thing to all other UNIX * functions. * On success, return the results, otherwise fall back to use the * __objc_dynamic_get_symbol_path() function. */ if (0 != dladdr((void*)theClass, &info)) { return [NSString stringWithUTF8String: info.dli_fname]; } #endif if (theClass != nil) { const char *prefix #if __OBJC_GNUSTEP_RUNTIME_ABI__ >= 20 = "._OBJC_CLASS_"; #else = "__objc_class_name_"; #endif const char *ret; char buf[125]; char *p = buf; const char *className = class_getName(theClass); int len = strlen(className); int plen = strlen(prefix); if (len + plen + 1 > sizeof(buf)) { p = malloc(len + plen + 1); if (p == NULL) { fprintf(stderr, "Unable to allocate memory !!"); return nil; } } memcpy(p, prefix, plen); memcpy(&p[plen], className, len + 1); ret = __objc_dynamic_get_symbol_path(0, p); if (p != buf) { free(p); } if (ret) { return [NSString stringWithUTF8String: ret]; } } return nil; } #endif gnustep-base-1.29.0/Source/preface.m000066400000000000000000000021031435650067400172310ustar00rootroot00000000000000/* Support for general purpose definitions for libobjects. Copyright (C) 1993, 1994, 1996 Free Software Foundation, Inc. Written by: Andrew Kachites McCallum Created: May 1993 This file is part of the GNUstep Base Library. 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 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 USA. */ #import "common.h" const char *gnustep_base_version = STRINGIFY (GNUSTEP_BASE_VERSION); gnustep-base-1.29.0/Source/simple-load.h000066400000000000000000000073341435650067400200400ustar00rootroot00000000000000/* simple-load - Definitions and translations for dynamic loading with the simple dynamic liading library (dl). Copyright (C) 1995, Free Software Foundation This program 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 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. BUGS: - In SunOS 4.1, dlopen will only resolve references into the main module and not into other modules loaded earlier. dlopen will exit if there are undefined symbols. Later versions (e.g. 5.3) fix this with RTLD_GLOBAL. */ #ifndef __simple_load_h_INCLUDE #define __simple_load_h_INCLUDE #ifndef __USE_GNU #define __USE_GNU #endif #include /* This is the GNU name for the CTOR list */ #define CTOR_LIST "__CTOR_LIST__" #ifndef RTLD_GLOBAL #define RTLD_GLOBAL 0 #endif #ifndef RTLD_DEFAULT #define RTLD_DEFAULT 0 #endif /* Types defined appropriately for the dynamic linker */ typedef void* dl_handle_t; typedef void* dl_symbol_t; /* Do any initialization necessary. Return 0 on success (or if no initialization needed. */ static int __objc_dynamic_init(const char* exec_path) { return 0; } /* Link in the module given by the name 'module'. Return a handle which can be used to get information about the loded code. */ static dl_handle_t __objc_dynamic_link(const char* module, int mode, const char* debug_file) { #ifdef RTLD_NOLOAD /* * If we've got RTLD_NOLOAD, then ask the dynamic linker first to check if * the library is already loaded. If it is, then just return a handle to * it. If not, then load it again. */ void *handle = dlopen(module, RTLD_LAZY | RTLD_GLOBAL | RTLD_NOLOAD); if (NULL != handle) { return handle; } #endif return (dl_handle_t)dlopen(module, RTLD_LAZY | RTLD_GLOBAL); } /* Return the address of a symbol given by the name 'symbol' from the module * associated with 'handle' * This function is not always used, so we mark it as unused to avoid warnings. */ static dl_symbol_t __objc_dynamic_find_symbol(dl_handle_t handle, const char* symbol) __attribute__((unused)); static dl_symbol_t __objc_dynamic_find_symbol(dl_handle_t handle, const char* symbol) { return dlsym(handle, (char*)symbol); } /* remove the code from memory associated with the module 'handle' */ static int __objc_dynamic_unlink(dl_handle_t handle) { return dlclose(handle); } /* Print an error message (prefaced by 'error_string') relevant to the last error encountered */ static void __objc_dynamic_error(FILE *error_stream, const char *error_string) { fprintf(error_stream, "%s:%s\n", error_string, dlerror()); } /* Debugging: define these if they are available */ static int __objc_dynamic_undefined_symbol_count(void) { return 0; } static char** __objc_dynamic_list_undefined_symbols(void) { return NULL; } static inline const char * __objc_dynamic_get_symbol_path(dl_handle_t handle, dl_symbol_t symbol) { #ifdef HAVE_DLADDR dl_symbol_t sym; Dl_info info; if (handle == 0) handle = RTLD_DEFAULT; sym = dlsym(handle, symbol); if (!sym) return NULL; if (!dladdr(sym, &info)) return NULL; return info.dli_fname; #else return NULL; #endif } #endif /* __simple_load_h_INCLUDE */ gnustep-base-1.29.0/Source/tzdb.h000066400000000000000000001513371435650067400166000ustar00rootroot00000000000000/* ** The first part of this file is in the public domain, so clarified as of ** 1996-06-05 by Arthur David Olson (arthur_david_olson@nih.gov). */ /* ** This header is for use ONLY with the time conversion code. ** There is no guarantee that it will remain unchanged, ** or that it will remain at all. ** Do NOT copy it to any system include directory. ** Thank you! */ /* ** Information about time zone files. */ #ifndef TZDEFAULT #define TZDEFAULT "localtime" #endif /* !defined TZDEFAULT */ #ifndef TZDEFRULES #define TZDEFRULES "posixrules" #endif /* !defined TZDEFRULES */ /* ** Each file begins with. . . */ #define TZ_MAGIC "TZif" struct tzhead { char tzh_magic[4]; /* TZ_MAGIC */ char tzh_version[1]; /* \0 for 1, 2 or 3 */ char tzh_reserved[15]; /* reserved for future use */ char tzh_ttisutcnt[4]; /* coded number of trans. time flags */ char tzh_ttisstdcnt[4]; /* coded number of trans. time flags */ char tzh_leapcnt[4]; /* coded number of leap seconds */ char tzh_timecnt[4]; /* coded number of transition times */ char tzh_typecnt[4]; /* coded number of local time types */ char tzh_charcnt[4]; /* coded number of abbr. chars */ }; /* ** . . .followed by. . . ** ** tzh_timecnt (char [4])s coded transition times a la time(2) ** tzh_timecnt (unsigned char)s types of local time starting at above ** tzh_typecnt repetitions of ** one (char [4]) coded UTC offset in seconds ** one (unsigned char) used to set tm_isdst ** one (unsigned char) that's an abbreviation list index ** tzh_charcnt (char)s '\0'-terminated zone abbreviations ** tzh_leapcnt repetitions of ** one (char [4]) coded leap second transition times ** one (char [4]) total correction after above ** tzh_ttisstdcnt (char)s indexed by type; if TRUE, transition ** time is standard time, if FALSE, ** transition time is wall clock time ** if absent, transition times are ** assumed to be wall clock time ** tzh_ttisgmtcnt (char)s indexed by type; if TRUE, transition ** time is UTC, if FALSE, ** transition time is local time ** if absent, transition times are ** assumed to be local time */ /* ** In the current implementation, "tzset()" refuses to deal with files that ** exceed any of the limits below. */ #ifndef TZ_MAX_TIMES /* ** A value of 370 is enough to handle a bit more than a year's worth of ** solar time (corrected daily to the nearest second) or 138 years of ** Pacific Presidential Election time ** (where there are three time zone transitions every fourth year). ** This needs to be at least 2000 to cope with TZDB v2+ as likely ** dates go far further into the future than TZDB v1 */ #define TZ_MAX_TIMES 2000 #endif /* !defined TZ_MAX_TIMES */ #ifndef TZ_MAX_TYPES #ifndef NOSOLAR #define TZ_MAX_TYPES 256 /* Limited by what (unsigned char)'s can hold */ #endif /* !defined NOSOLAR */ #ifdef NOSOLAR /* ** Must be at least 14 for Europe/Riga as of Jan 12 1995, ** as noted by Earl Chew . */ #define TZ_MAX_TYPES 20 /* Maximum number of local time types */ #endif /* !defined NOSOLAR */ #endif /* !defined TZ_MAX_TYPES */ #ifndef TZ_MAX_CHARS #define TZ_MAX_CHARS 50 /* Maximum number of abbreviation characters */ /* (limited by what unsigned chars can hold) */ #endif /* !defined TZ_MAX_CHARS */ #ifndef TZ_MAX_LEAPS #define TZ_MAX_LEAPS 50 /* Maximum number of leap second corrections */ #endif /* !defined TZ_MAX_LEAPS */ #define SECSPERMIN 60 #define MINSPERHOUR 60 #define HOURSPERDAY 24 #define DAYSPERWEEK 7 #define DAYSPERNYEAR 365 #define DAYSPERLYEAR 366 #define SECSPERHOUR (SECSPERMIN * MINSPERHOUR) #define SECSPERDAY ((long) SECSPERHOUR * HOURSPERDAY) #define MONSPERYEAR 12 #define TM_SUNDAY 0 #define TM_MONDAY 1 #define TM_TUESDAY 2 #define TM_WEDNESDAY 3 #define TM_THURSDAY 4 #define TM_FRIDAY 5 #define TM_SATURDAY 6 #define TM_JANUARY 0 #define TM_FEBRUARY 1 #define TM_MARCH 2 #define TM_APRIL 3 #define TM_MAY 4 #define TM_JUNE 5 #define TM_JULY 6 #define TM_AUGUST 7 #define TM_SEPTEMBER 8 #define TM_OCTOBER 9 #define TM_NOVEMBER 10 #define TM_DECEMBER 11 #define TM_YEAR_BASE 1900 #define EPOCH_YEAR 1970 #define EPOCH_WDAY TM_THURSDAY /* ** Accurate only for the past couple of centuries; ** that will probably do. */ #define isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0)) #ifndef USG /* ** Use of the underscored variants may cause problems if you move your code to ** certain System-V-based systems; for maximum portability, use the ** underscore-free variants. The underscored variants are provided for ** backward compatibility only; they may disappear from future versions of ** this file. */ #define SECS_PER_MIN SECSPERMIN #define MINS_PER_HOUR MINSPERHOUR #define HOURS_PER_DAY HOURSPERDAY #define DAYS_PER_WEEK DAYSPERWEEK #define DAYS_PER_NYEAR DAYSPERNYEAR #define DAYS_PER_LYEAR DAYSPERLYEAR #define SECS_PER_HOUR SECSPERHOUR #define SECS_PER_DAY SECSPERDAY #define MONS_PER_YEAR MONSPERYEAR #endif /* !defined USG */ /* * The remainder of this file is derived from public-domain implementation * available from NetBSD's libc * src/lib/libc/time/private.h * src/lib/libc/time/localtime.c */ #ifndef __UNCONST #define __UNCONST(a) ((void *)(const void *)(a)) #endif #ifndef _DIAGASSERT #define _DIAGASSERT(e) #endif #ifndef TZDIR #define TZDIR "/usr/share/zoneinfo" #endif /* ** This file is in the public domain, so clarified as of ** 1996-06-05 by Arthur David Olson. */ /* ** This header is for use ONLY with the time conversion code. ** There is no guarantee that it will remain unchanged, ** or that it will remain at all. ** Do NOT copy it to any system include directory. ** Thank you! */ /* ** zdump has been made independent of the rest of the time ** conversion package to increase confidence in the verification it provides. ** You can use zdump to help in verifying other implementations. ** To do this, compile with -DUSE_LTZ=0 and link without the tz library. */ #ifndef USE_LTZ # define USE_LTZ 1 #endif /* This string was in the Factory zone through version 2016f. */ #define GRANDPARENTED "Local time zone must be set--see zic manual page" /* ** Defaults for preprocessor symbols. ** You can override these in your C compiler options, e.g. '-DHAVE_GETTEXT=1'. */ #if !defined HAVE_GENERIC && defined __has_extension # if __has_extension(c_generic_selections) # define HAVE_GENERIC 1 # else # define HAVE_GENERIC 0 # endif #endif /* _Generic is buggy in pre-4.9 GCC. */ #if !defined HAVE_GENERIC && defined __GNUC__ # define HAVE_GENERIC (4 < __GNUC__ + (9 <= __GNUC_MINOR__)) #endif #ifndef HAVE_GENERIC # define HAVE_GENERIC (201112 <= __STDC_VERSION__) #endif /* ** Nested includes */ #include #include /* for time_t */ #include #ifndef ENAMETOOLONG # define ENAMETOOLONG EINVAL #endif #ifndef ENOTSUP # define ENOTSUP EINVAL #endif #ifndef EOVERFLOW # define EOVERFLOW EINVAL #endif #if HAVE_UNISTD_H #include /* for R_OK, and other POSIX goodness */ #endif /* HAVE_UNISTD_H */ #ifndef R_OK #define R_OK 4 #endif /* !defined R_OK */ /* Unlike 's isdigit, this also works if c < 0 | c > UCHAR_MAX. */ #define is_digit(c) ((unsigned)(c) - '0' <= 9) #if HAVE_STDINT_H #include #endif /* !HAVE_STDINT_H */ #if HAVE_INTTYPES_H # include #endif /* Pre-C99 GCC compilers define __LONG_LONG_MAX__ instead of LLONG_MAX. */ #ifdef __LONG_LONG_MAX__ # ifndef LLONG_MAX # define LLONG_MAX __LONG_LONG_MAX__ # endif # ifndef LLONG_MIN # define LLONG_MIN (-1 - LLONG_MAX) # endif #endif #ifndef INT_FAST64_MAX # ifdef LLONG_MAX typedef long long int_fast64_t; # define INT_FAST64_MIN LLONG_MIN # define INT_FAST64_MAX LLONG_MAX # else # if LONG_MAX >> 31 < 0xffffffff Please use a compiler that supports a 64-bit integer type (or wider); you may need to compile with "-DHAVE_STDINT_H". # endif typedef long int_fast64_t; # define INT_FAST64_MIN LONG_MIN # define INT_FAST64_MAX LONG_MAX # endif #endif #ifndef INT_FAST32_MAX # if INT_MAX >> 31 == 0 typedef long int_fast32_t; # define INT_FAST32_MAX LONG_MAX # define INT_FAST32_MIN LONG_MIN # else typedef int int_fast32_t; # define INT_FAST32_MAX INT_MAX # define INT_FAST32_MIN INT_MIN # endif #endif #ifndef UINT_FAST64_MAX # if defined ULLONG_MAX || defined __LONG_LONG_MAX__ typedef unsigned long long uint_fast64_t; # else # if ULONG_MAX >> 31 >> 1 < 0xffffffff Please use a compiler that supports a 64-bit integer type (or wider); you may need to compile with "-DHAVE_STDINT_H". # endif typedef unsigned long uint_fast64_t; # endif #endif #ifndef INT32_MAX #define INT32_MAX 0x7fffffff #endif /* !defined INT32_MAX */ #ifndef INT32_MIN #define INT32_MIN (-1 - INT32_MAX) #endif /* !defined INT32_MIN */ #if 3 <= __GNUC__ # define ATTRIBUTE_CONST __attribute__ ((__const__)) # define ATTRIBUTE_MALLOC __attribute__ ((__malloc__)) # define ATTRIBUTE_PURE __attribute__ ((__pure__)) # define ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec)) #else # define ATTRIBUTE_CONST /* empty */ # define ATTRIBUTE_MALLOC /* empty */ # define ATTRIBUTE_PURE /* empty */ # define ATTRIBUTE_FORMAT(spec) /* empty */ #endif #if !defined _Noreturn && __STDC_VERSION__ < 201112 # if 2 < __GNUC__ + (8 <= __GNUC_MINOR__) # define _Noreturn __attribute__ ((__noreturn__)) # else # define _Noreturn # endif #endif #if __STDC_VERSION__ < 199901 && !defined restrict # define restrict /* empty */ #endif /* ** Workarounds for compilers/systems. */ #ifndef EPOCH_LOCAL # define EPOCH_LOCAL 0 #endif #ifndef EPOCH_OFFSET # define EPOCH_OFFSET 0 #endif #ifndef RESERVE_STD_EXT_IDS # define RESERVE_STD_EXT_IDS 0 #endif /* If standard C identifiers with external linkage (e.g., localtime) are reserved and are not already being renamed anyway, rename them as if compiling with '-Dtime_tz=time_t'. */ #if !defined time_tz && RESERVE_STD_EXT_IDS && USE_LTZ # define time_tz time_t #endif /* ** Compile with -Dtime_tz=T to build the tz package with a private ** time_t type equivalent to T rather than the system-supplied time_t. ** This debugging feature can test unusual design decisions ** (e.g., time_t wider than 'long', or unsigned time_t) even on ** typical platforms. */ #if defined time_tz || EPOCH_LOCAL || EPOCH_OFFSET != 0 # define TZ_TIME_T 1 #else # define TZ_TIME_T 0 #endif #if TZ_TIME_T typedef time_tz tz_time_t; #endif /* ** Finally, some convenience items. */ #define TYPE_BIT(type) (sizeof (type) * CHAR_BIT) #define TYPE_SIGNED(type) (/*CONSTCOND*/((type) -1) < 0) #define TWOS_COMPLEMENT(t) (/*CONSTCOND*/(t) ~ (t) 0 < 0) /* Max and min values of the integer type T, of which only the bottom B bits are used, and where the highest-order used bit is considered to be a sign bit if T is signed. */ #define MAXVAL(t, b) /*LINTED*/ \ ((t) (((t) 1 << ((b) - 1 - TYPE_SIGNED(t))) \ - 1 + ((t) 1 << ((b) - 1 - TYPE_SIGNED(t))))) #define MINVAL(t, b) \ ((t) (TYPE_SIGNED(t) ? - TWOS_COMPLEMENT(t) - MAXVAL(t, b) : 0)) /* The extreme time values, assuming no padding. */ #define TIME_T_MIN_NO_PADDING MINVAL(time_t, TYPE_BIT(time_t)) #define TIME_T_MAX_NO_PADDING MAXVAL(time_t, TYPE_BIT(time_t)) /* The extreme time values. These are macros, not constants, so that any portability problem occur only when compiling .c files that use the macros, which is safer for applications that need only zdump and zic. This implementation assumes no padding if time_t is signed and either the compiler lacks support for _Generic or time_t is not one of the standard signed integer types. */ #if HAVE_GENERIC # define TIME_T_MIN \ _Generic((time_t) 0, \ signed char: SCHAR_MIN, short: SHRT_MIN, \ int: INT_MIN, long: LONG_MIN, long long: LLONG_MIN, \ default: TIME_T_MIN_NO_PADDING) # define TIME_T_MAX \ (TYPE_SIGNED(time_t) \ ? _Generic((time_t) 0, \ signed char: SCHAR_MAX, short: SHRT_MAX, \ int: INT_MAX, long: LONG_MAX, long long: LLONG_MAX, \ default: TIME_T_MAX_NO_PADDING) \ : (time_t) -1) #else # define TIME_T_MIN TIME_T_MIN_NO_PADDING # define TIME_T_MAX TIME_T_MAX_NO_PADDING #endif /* ** 302 / 1000 is log10(2.0) rounded up. ** Subtract one for the sign bit if the type is signed; ** add one for integer division truncation; ** add one more for a minus sign if the type is signed. */ #define INT_STRLEN_MAXIMUM(type) \ ((TYPE_BIT(type) - TYPE_SIGNED(type)) * 302 / 1000 + \ 1 + TYPE_SIGNED(type)) /* ** INITIALIZE(x) */ #if defined(__GNUC__) || defined(__lint__) # define INITIALIZE(x) ((x) = 0) #else # define INITIALIZE(x) #endif /* Handy macros that are independent of tzfile implementation. */ #define YEARSPERREPEAT 400 /* years before a Gregorian repeat */ #define SECSPERMIN 60 #define MINSPERHOUR 60 #define HOURSPERDAY 24 #define DAYSPERWEEK 7 #define DAYSPERNYEAR 365 #define DAYSPERLYEAR 366 #define SECSPERHOUR (SECSPERMIN * MINSPERHOUR) #ifndef SECSPERDAY #define SECSPERDAY ((int_fast32_t) SECSPERHOUR * HOURSPERDAY) #endif #define MONSPERYEAR 12 #define TM_SUNDAY 0 #define TM_MONDAY 1 #define TM_TUESDAY 2 #define TM_WEDNESDAY 3 #define TM_THURSDAY 4 #define TM_FRIDAY 5 #define TM_SATURDAY 6 #define TM_JANUARY 0 #define TM_FEBRUARY 1 #define TM_MARCH 2 #define TM_APRIL 3 #define TM_MAY 4 #define TM_JUNE 5 #define TM_JULY 6 #define TM_AUGUST 7 #define TM_SEPTEMBER 8 #define TM_OCTOBER 9 #define TM_NOVEMBER 10 #define TM_DECEMBER 11 #define TM_YEAR_BASE 1900 #define EPOCH_YEAR 1970 #define EPOCH_WDAY TM_THURSDAY #define isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0)) /* ** Since everything in isleap is modulo 400 (or a factor of 400), we know that ** isleap(y) == isleap(y % 400) ** and so ** isleap(a + b) == isleap((a + b) % 400) ** or ** isleap(a + b) == isleap(a % 400 + b % 400) ** This is true even if % means modulo rather than Fortran remainder ** (which is allowed by C89 but not by C99 or later). ** We use this to avoid addition overflow problems. */ #define isleap_sum(a, b) isleap((a) % 400 + (b) % 400) /* ** The Gregorian year averages 365.2425 days, which is 31556952 seconds. */ #define AVGSECSPERYEAR 31556952L #define SECSPERREPEAT \ ((int_fast64_t) YEARSPERREPEAT * (int_fast64_t) AVGSECSPERYEAR) #define SECSPERREPEAT_BITS 34 /* ceil(log2(SECSPERREPEAT)) */ /* $NetBSD: localtime.c,v 1.123 2020/05/25 14:52:48 christos Exp $ */ /* Convert timestamp from time_t to struct tm. */ /* ** This file is in the public domain, so clarified as of ** 1996-06-05 by Arthur David Olson. */ /* ** Leap second handling from Bradley White. ** POSIX-style TZ environment variable handling from Guy Harris. */ #include /* ms-windows lacks ssize_t but has SSIZE_T */ #if defined(_MSC_VER) typedef SSIZE_T ssize_t; #endif #ifndef TZ_ABBR_MAX_LEN #define TZ_ABBR_MAX_LEN 16 #endif /* !defined TZ_ABBR_MAX_LEN */ #ifndef TZ_ABBR_CHAR_SET #define TZ_ABBR_CHAR_SET \ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 :+-._" #endif /* !defined TZ_ABBR_CHAR_SET */ #ifndef TZ_ABBR_ERR_CHAR #define TZ_ABBR_ERR_CHAR '_' #endif /* !defined TZ_ABBR_ERR_CHAR */ /* ** SunOS 4.1.1 headers lack O_BINARY. */ #ifdef O_BINARY #define OPEN_MODE (O_RDONLY | O_BINARY) #else #define OPEN_MODE (O_RDONLY) #endif /* !defined O_BINARY */ /* ** The DST rules to use if TZ has no rules and we can't load TZDEFRULES. ** Default to US rules as of 2017-05-07. ** POSIX does not specify the default DST rules; ** for historical reasons, US rules are a common default. */ #ifndef TZDEFRULESTRING #define TZDEFRULESTRING ",M3.2.0,M11.1.0" #endif struct _ttinfo { /* time type information */ int_fast32_t tt_utoff; /* UT offset in seconds */ BOOL tt_isdst; /* used to set tm_isdst */ int tt_desigidx; /* abbreviation list index */ BOOL tt_ttisstd; /* transition is std time */ BOOL tt_ttisut; /* transition is UT */ }; struct lsinfo { /* leap second information */ time_t ls_trans; /* transition time */ int_fast64_t ls_corr; /* correction to apply */ }; #define SMALLEST(a, b) (((a) < (b)) ? (a) : (b)) #define BIGGEST(a, b) (((a) > (b)) ? (a) : (b)) #ifdef TZNAME_MAX #define MY_TZNAME_MAX TZNAME_MAX #endif /* defined TZNAME_MAX */ #ifndef TZNAME_MAX #define MY_TZNAME_MAX 255 #endif /* !defined TZNAME_MAX */ /* BIGGEST(BIGGEST(TZ_MAX_CHARS + 1, sizeof "GMT"), (2 * (MY_TZNAME_MAX + 1))) */ #define TZ_MAX_CHARS_OR_NAMES 512 #define state __state struct state { int leapcnt; int timecnt; int typecnt; int charcnt; BOOL goback; BOOL goahead; time_t ats[TZ_MAX_TIMES]; unsigned char types[TZ_MAX_TIMES]; struct _ttinfo ttis[TZ_MAX_TYPES]; char chars[TZ_MAX_CHARS_OR_NAMES]; struct lsinfo lsis[TZ_MAX_LEAPS]; /* The time type to use for early times or if no transitions. It is always zero for recent tzdb releases. It might be nonzero for data from tzdb 2018e or earlier. */ int defaulttype; }; enum r_type { JULIAN_DAY, /* Jn = Julian day */ DAY_OF_YEAR, /* n = day of year */ MONTH_NTH_DAY_OF_WEEK /* Mm.n.d = month, week, day of week */ }; struct rule { enum r_type r_type; /* type of rule */ int r_day; /* day number of rule */ int r_week; /* week number of rule */ int r_mon; /* month number of rule */ int_fast32_t r_time; /* transition time of rule */ }; typedef struct { int tm_sec; /* Seconds (0-60) */ int tm_min; /* Minutes (0-59) */ int tm_hour; /* Hours (0-23) */ int tm_mday; /* Day of the month (1-31) */ int tm_mon; /* Month (0-11) */ int tm_year; /* Year - 1900 */ int tm_wday; /* Day of the week (0-6, Sunday = 0) */ int tm_yday; /* Day in the year (0-365, 1 Jan = 0) */ int tm_isdst; /* Daylight saving time */ int tm_gmtoff; /* Localtime offset from UTC */ const char *tm_zone; /* Timezone name */ } gstm; static BOOL increment_overflow(int *, int); static BOOL increment_overflow_time(time_t *, int_fast32_t); static int_fast64_t leapcorr(struct state const *, time_t); static gstm *timesub(time_t const *, int_fast32_t, struct state const *, gstm *); static BOOL typesequiv(struct state const *, int, int); static BOOL tzparse(char const *, struct state *, BOOL); /* Initialize *S to a value based on UTOFF, ISDST, and DESIGIDX. */ static void init_ttinfo(struct _ttinfo *s, int_fast32_t utoff, BOOL isdst, int desigidx) { s->tt_utoff = utoff; s->tt_isdst = isdst; s->tt_desigidx = desigidx; s->tt_ttisstd = false; s->tt_ttisut = false; } static int_fast32_t detzcode(const char *const codep) { int_fast32_t result; int i; int_fast32_t one = 1; int_fast32_t halfmaxval = one << (32 - 2); int_fast32_t maxval = halfmaxval - 1 + halfmaxval; int_fast32_t minval = -1 - maxval; result = codep[0] & 0x7f; for (i = 1; i < 4; ++i) result = (result << 8) | (codep[i] & 0xff); if (codep[0] & 0x80) { /* Do two's-complement negation even on non-two's-complement machines. If the result would be minval - 1, return minval. */ result -= !TWOS_COMPLEMENT(int_fast32_t) && result != 0; result += minval; } return result; } static int_fast64_t detzcode64(const char *const codep) { int_fast64_t result; int i; int_fast64_t one = 1; int_fast64_t halfmaxval = one << (64 - 2); int_fast64_t maxval = halfmaxval - 1 + halfmaxval; int_fast64_t minval = -TWOS_COMPLEMENT(int_fast64_t) - maxval; result = codep[0] & 0x7f; for (i = 1; i < 8; ++i) result = (result << 8) | (codep[i] & 0xff); if (codep[0] & 0x80) { /* Do two's-complement negation even on non-two's-complement machines. If the result would be minval - 1, return minval. */ result -= !TWOS_COMPLEMENT(int_fast64_t) && result != 0; result += minval; } return result; } static void scrub_abbrs(struct state *sp) { int i; /* ** First, replace bogus characters. */ for (i = 0; i < sp->charcnt; ++i) if (strchr(TZ_ABBR_CHAR_SET, sp->chars[i]) == NULL) sp->chars[i] = TZ_ABBR_ERR_CHAR; /* ** Second, truncate long abbreviations. */ for (i = 0; i < sp->typecnt; ++i) { const struct _ttinfo * const ttisp = &sp->ttis[i]; char *cp = &sp->chars[ttisp->tt_desigidx]; if (strlen(cp) > TZ_ABBR_MAX_LEN && strcmp(cp, GRANDPARENTED) != 0) *(cp + TZ_ABBR_MAX_LEN) = '\0'; } } static BOOL differ_by_repeat(const time_t t1, const time_t t0) { if (TYPE_BIT(time_t) - TYPE_SIGNED(time_t) < SECSPERREPEAT_BITS) return 0; return (int_fast64_t)t1 - (int_fast64_t)t0 == SECSPERREPEAT; } union input_buffer { /* The first part of the buffer, interpreted as a header. */ struct tzhead tzhead; /* The entire buffer. */ char buf[2 * sizeof(struct tzhead) + 2 * sizeof (struct state) + 4 * TZ_MAX_TIMES]; }; /* TZDIR with a trailing '/' rather than a trailing '\0'. */ static char const tzdirslash[sizeof TZDIR] = TZDIR "/"; /* Local storage needed for 'tzloadbody'. */ union local_storage { /* The results of analyzing the file's contents after it is opened. */ struct file_analysis { /* The input buffer. */ union input_buffer u; /* A temporary state used for parsing a TZ string in the file. */ struct state st; } u; /* The file name to be opened. */ char fullname[/*CONSTCOND*/BIGGEST(sizeof (struct file_analysis), sizeof tzdirslash + 1024)]; }; /* Load tz data from the file named NAME into *SP. Read extended format if DOEXTEND. Use *LSP for temporary storage. Return 0 on success, an errno value on failure. */ static int tzloadbody1(char const *name, struct state *sp, BOOL doextend, union local_storage *lsp, ssize_t nread) { int i; int stored; union input_buffer *up = &lsp->u.u; size_t tzheadsize = sizeof(struct tzhead); for (stored = 4; stored <= 8; stored *= 2) { int_fast32_t ttisstdcnt = detzcode(up->tzhead.tzh_ttisstdcnt); int_fast32_t ttisutcnt = detzcode(up->tzhead.tzh_ttisutcnt); int_fast64_t prevtr = 0; int_fast32_t prevcorr = 0; int_fast32_t leapcnt = detzcode(up->tzhead.tzh_leapcnt); int_fast32_t timecnt = detzcode(up->tzhead.tzh_timecnt); int_fast32_t typecnt = detzcode(up->tzhead.tzh_typecnt); int_fast32_t charcnt = detzcode(up->tzhead.tzh_charcnt); char const *p = up->buf + tzheadsize; /* Although tzfile(5) currently requires typecnt to be nonzero, support future formats that may allow zero typecnt in files that have a TZ string and no transitions. */ if (! (0 <= leapcnt && leapcnt < TZ_MAX_LEAPS && 0 <= typecnt && typecnt < TZ_MAX_TYPES && 0 <= timecnt && timecnt < TZ_MAX_TIMES && 0 <= charcnt && charcnt < TZ_MAX_CHARS && (ttisstdcnt == typecnt || ttisstdcnt == 0) && (ttisutcnt == typecnt || ttisutcnt == 0))) return EINVAL; if ((size_t)nread < (tzheadsize /* struct tzhead */ + timecnt * stored /* ats */ + timecnt /* types */ + typecnt * 6 /* _ttinfos */ + charcnt /* chars */ + leapcnt * (stored + 4) /* lsinfos */ + ttisstdcnt /* ttisstds */ + ttisutcnt)) /* ttisuts */ return EINVAL; sp->leapcnt = leapcnt; sp->timecnt = timecnt; sp->typecnt = typecnt; sp->charcnt = charcnt; /* Read transitions, discarding those out of time_t range. But pretend the last transition before TIME_T_MIN occurred at TIME_T_MIN. */ timecnt = 0; for (i = 0; i < sp->timecnt; ++i) { int_fast64_t at = stored == 4 ? detzcode(p) : detzcode64(p); sp->types[i] = at <= TIME_T_MAX; if (sp->types[i]) { time_t attime = ((TYPE_SIGNED(time_t) ? at < TIME_T_MIN : at < 0) ? TIME_T_MIN : (time_t)at); if (timecnt && attime <= sp->ats[timecnt - 1]) { if (attime < sp->ats[timecnt - 1]) return EINVAL; sp->types[i - 1] = 0; timecnt--; } sp->ats[timecnt++] = attime; } p += stored; } timecnt = 0; for (i = 0; i < sp->timecnt; ++i) { unsigned char typ = *p++; if (sp->typecnt <= typ) return EINVAL; if (sp->types[i]) sp->types[timecnt++] = typ; } sp->timecnt = timecnt; for (i = 0; i < sp->typecnt; ++i) { struct _ttinfo * ttisp; unsigned char isdst, desigidx; ttisp = &sp->ttis[i]; ttisp->tt_utoff = detzcode(p); p += 4; isdst = *p++; if (! (isdst < 2)) return EINVAL; ttisp->tt_isdst = isdst; desigidx = *p++; if (! (desigidx < sp->charcnt)) return EINVAL; ttisp->tt_desigidx = desigidx; } for (i = 0; i < sp->charcnt; ++i) sp->chars[i] = *p++; sp->chars[i] = '\0'; /* ensure '\0' at end */ /* Read leap seconds, discarding those out of time_t range. */ leapcnt = 0; for (i = 0; i < sp->leapcnt; ++i) { int_fast64_t tr = stored == 4 ? detzcode(p) : detzcode64(p); int_fast32_t corr = detzcode(p + stored); p += stored + 4; /* Leap seconds cannot occur before the Epoch. */ if (tr < 0) return EINVAL; if (tr <= TIME_T_MAX) { /* Leap seconds cannot occur more than once per UTC month, and UTC months are at least 28 days long (minus 1 second for a negative leap second). Each leap second's correction must differ from the previous one's by 1 second. */ if (tr - prevtr < 28 * SECSPERDAY - 1 || (corr != prevcorr - 1 && corr != prevcorr + 1)) return EINVAL; sp->lsis[leapcnt].ls_trans = (time_t)(prevtr = tr); sp->lsis[leapcnt].ls_corr = prevcorr = corr; leapcnt++; } } sp->leapcnt = leapcnt; for (i = 0; i < sp->typecnt; ++i) { struct _ttinfo * ttisp; ttisp = &sp->ttis[i]; if (ttisstdcnt == 0) ttisp->tt_ttisstd = false; else { if (*p != true && *p != false) return EINVAL; ttisp->tt_ttisstd = *p++; } } for (i = 0; i < sp->typecnt; ++i) { struct _ttinfo * ttisp; ttisp = &sp->ttis[i]; if (ttisutcnt == 0) ttisp->tt_ttisut = false; else { if (*p != true && *p != false) return EINVAL; ttisp->tt_ttisut = *p++; } } /* ** If this is an old file, we're done. */ if (up->tzhead.tzh_version[0] == '\0') break; nread -= p - up->buf; memmove(up->buf, p, (size_t)nread); } if (doextend && nread > 2 && up->buf[0] == '\n' && up->buf[nread - 1] == '\n' && sp->typecnt + 2 <= TZ_MAX_TYPES) { struct state *ts = &lsp->u.st; up->buf[nread - 1] = '\0'; if (tzparse(&up->buf[1], ts, false)) { /* Attempt to reuse existing abbreviations. Without this, America/Anchorage would be right on the edge after 2037 when TZ_MAX_CHARS is 50, as sp->charcnt equals 40 (for LMT AST AWT APT AHST AHDT YST AKDT AKST) and ts->charcnt equals 10 (for AKST AKDT). Reusing means sp->charcnt can stay 40 in this example. */ int gotabbr = 0; int charcnt = sp->charcnt; for (i = 0; i < ts->typecnt; i++) { char *tsabbr = ts->chars + ts->ttis[i].tt_desigidx; int j; for (j = 0; j < charcnt; j++) if (strcmp(sp->chars + j, tsabbr) == 0) { ts->ttis[i].tt_desigidx = j; gotabbr++; break; } if (! (j < charcnt)) { size_t tsabbrlen = strlen(tsabbr); if (j + tsabbrlen < TZ_MAX_CHARS) { strcpy(sp->chars + j, tsabbr); charcnt = (int_fast32_t)(j + tsabbrlen + 1); ts->ttis[i].tt_desigidx = j; gotabbr++; } } } if (gotabbr == ts->typecnt) { sp->charcnt = charcnt; /* Ignore any trailing, no-op transitions generated by zic as they don't help here and can run afoul of bugs in zic 2016j or earlier. */ while (1 < sp->timecnt && (sp->types[sp->timecnt - 1] == sp->types[sp->timecnt - 2])) sp->timecnt--; for (i = 0; i < ts->timecnt; i++) if (sp->timecnt == 0 || (sp->ats[sp->timecnt - 1] < ts->ats[i] + leapcorr(sp, ts->ats[i]))) break; while (i < ts->timecnt && sp->timecnt < TZ_MAX_TIMES) { sp->ats[sp->timecnt] = (time_t) (ts->ats[i] + leapcorr(sp, ts->ats[i])); sp->types[sp->timecnt] = (sp->typecnt + ts->types[i]); sp->timecnt++; i++; } for (i = 0; i < ts->typecnt; i++) sp->ttis[sp->typecnt++] = ts->ttis[i]; } } } if (sp->typecnt == 0) return EINVAL; if (sp->timecnt > 1) { for (i = 1; i < sp->timecnt; ++i) { if (typesequiv(sp, sp->types[i], sp->types[0])) { if (differ_by_repeat(sp->ats[i], sp->ats[0])) { sp->goback = true; break; } } } for (i = sp->timecnt - 2; i >= 0; --i) { if (typesequiv(sp, sp->types[sp->timecnt - 1], sp->types[i])) { if (differ_by_repeat(sp->ats[sp->timecnt - 1], sp->ats[i])) { sp->goahead = true; break; } } } } /* Infer sp->defaulttype from the data. Although this default type is always zero for data from recent tzdb releases, things are trickier for data from tzdb 2018e or earlier. The first set of heuristics work around bugs in 32-bit data generated by tzdb 2013c or earlier. The workaround is for zones like Australia/Macquarie where timestamps before the first transition have a time type that is not the earliest standard-time type. See: https://mm.icann.org/pipermail/tz/2013-May/019368.html */ /* ** If type 0 is unused in transitions, ** it's the type to use for early times. */ for (i = 0; i < sp->timecnt; ++i) if (sp->types[i] == 0) break; i = i < sp->timecnt ? -1 : 0; /* ** Absent the above, ** if there are transition times ** and the first transition is to a daylight time ** find the standard type less than and closest to ** the type of the first transition. */ if (i < 0 && sp->timecnt > 0 && sp->ttis[sp->types[0]].tt_isdst) { i = sp->types[0]; while (--i >= 0) if (!sp->ttis[i].tt_isdst) break; } /* The next heuristics are for data generated by tzdb 2018e or earlier, for zones like EST5EDT where the first transition is to DST. */ /* ** If no result yet, find the first standard type. ** If there is none, punt to type zero. */ if (i < 0) { i = 0; while (sp->ttis[i].tt_isdst) if (++i >= sp->typecnt) { i = 0; break; } } /* A simple 'sp->defaulttype = 0;' would suffice here if we didn't have to worry about 2018e-or-earlier data. Even simpler would be to remove the defaulttype member and just use 0 in its place. */ sp->defaulttype = i; return 0; } static int tzloadbody(char const *name, struct state *sp, BOOL doextend, union local_storage *lsp) { int fid; ssize_t nread; BOOL doaccess; union input_buffer *up = &lsp->u.u; size_t tzheadsize = sizeof(struct tzhead); sp->goback = sp->goahead = false; if (! name) { name = TZDEFAULT; if (! name) return EINVAL; } if (name[0] == ':') ++name; doaccess = name[0] == '/'; if (!doaccess) { char const *dot; size_t namelen = strlen(name); if (sizeof lsp->fullname - sizeof tzdirslash <= namelen) return ENAMETOOLONG; /* Create a string "TZDIR/NAME". Using sprintf here would pull in stdio (and would fail if the resulting string length exceeded INT_MAX!). */ memcpy(lsp->fullname, tzdirslash, sizeof tzdirslash); strcpy(lsp->fullname + sizeof tzdirslash, name); /* Set doaccess if NAME contains a ".." file name component, as such a name could read a file outside the TZDIR virtual subtree. */ for (dot = name; (dot = strchr(dot, '.')) != NULL; dot++) if ((dot == name || dot[-1] == '/') && dot[1] == '.' && (dot[2] == '/' || !dot[2])) { doaccess = true; break; } name = lsp->fullname; } if (doaccess && access(name, R_OK) != 0) return errno; fid = open(name, OPEN_MODE); if (fid < 0) return errno; nread = read(fid, up->buf, sizeof up->buf); if (nread < (ssize_t)tzheadsize) { int err = nread < 0 ? errno : EINVAL; close(fid); return err; } if (close(fid) < 0) return errno; return tzloadbody1(name, sp, doextend, lsp, nread); } /* Load tz data from the file named NAME into *SP. Read extended format if DOEXTEND. Return 0 on success, an errno value on failure. */ static int tzload(char const *name, struct state *sp, BOOL doextend) { union local_storage *lsp = malloc(sizeof *lsp); if (!lsp) { return errno; } else { int err = tzloadbody(name, sp, doextend, lsp); free(lsp); return err; } } static BOOL typesequiv(const struct state *sp, int a, int b) { BOOL result; if (sp == NULL || a < 0 || a >= sp->typecnt || b < 0 || b >= sp->typecnt) result = false; else { const struct _ttinfo * ap = &sp->ttis[a]; const struct _ttinfo * bp = &sp->ttis[b]; result = (ap->tt_utoff == bp->tt_utoff && ap->tt_isdst == bp->tt_isdst && ap->tt_ttisstd == bp->tt_ttisstd && ap->tt_ttisut == bp->tt_ttisut && (strcmp(&sp->chars[ap->tt_desigidx], &sp->chars[bp->tt_desigidx]) == 0)); } return result; } static const int mon_lengths[2][MONSPERYEAR] = { { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } }; static const int year_lengths[2] = { DAYSPERNYEAR, DAYSPERLYEAR }; /* ** Given a pointer into a timezone string, scan until a character that is not ** a valid character in a time zone abbreviation is found. ** Return a pointer to that character. */ static ATTRIBUTE_PURE const char * getzname(const char *strp) { char c; while ((c = *strp) != '\0' && !is_digit(c) && c != ',' && c != '-' && c != '+') ++strp; return strp; } /* ** Given a pointer into an extended timezone string, scan until the ending ** delimiter of the time zone abbreviation is located. ** Return a pointer to the delimiter. ** ** As with getzname above, the legal character set is actually quite ** restricted, with other characters producing undefined results. ** We don't do any checking here; checking is done later in common-case code. */ static ATTRIBUTE_PURE const char * getqzname(const char *strp, const int delim) { int c; while ((c = *strp) != '\0' && c != delim) ++strp; return strp; } /* ** Given a pointer into a timezone string, extract a number from that string. ** Check that the number is within a specified range; if it is not, return ** NULL. ** Otherwise, return a pointer to the first character not part of the number. */ static const char * getnum(const char *strp, int *const nump, const int min, const int max) { char c; int num; if (strp == NULL || !is_digit(c = *strp)) { errno = EINVAL; return NULL; } num = 0; do { num = num * 10 + (c - '0'); if (num > max) { errno = EOVERFLOW; return NULL; /* illegal value */ } c = *++strp; } while (is_digit(c)); if (num < min) { errno = EINVAL; return NULL; /* illegal value */ } *nump = num; return strp; } /* ** Given a pointer into a timezone string, extract a number of seconds, ** in hh[:mm[:ss]] form, from the string. ** If any error occurs, return NULL. ** Otherwise, return a pointer to the first character not part of the number ** of seconds. */ static const char * getsecs(const char *strp, int_fast32_t *const secsp) { int num; /* ** 'HOURSPERDAY * DAYSPERWEEK - 1' allows quasi-Posix rules like ** "M10.4.6/26", which does not conform to Posix, ** but which specifies the equivalent of ** "02:00 on the first Sunday on or after 23 Oct". */ strp = getnum(strp, &num, 0, HOURSPERDAY * DAYSPERWEEK - 1); if (strp == NULL) return NULL; *secsp = num * (int_fast32_t) SECSPERHOUR; if (*strp == ':') { ++strp; strp = getnum(strp, &num, 0, MINSPERHOUR - 1); if (strp == NULL) return NULL; *secsp += num * SECSPERMIN; if (*strp == ':') { ++strp; /* 'SECSPERMIN' allows for leap seconds. */ strp = getnum(strp, &num, 0, SECSPERMIN); if (strp == NULL) return NULL; *secsp += num; } } return strp; } /* ** Given a pointer into a timezone string, extract an offset, in ** [+-]hh[:mm[:ss]] form, from the string. ** If any error occurs, return NULL. ** Otherwise, return a pointer to the first character not part of the time. */ static const char * getoffset(const char *strp, int_fast32_t *const offsetp) { BOOL neg = false; if (*strp == '-') { neg = true; ++strp; } else if (*strp == '+') ++strp; strp = getsecs(strp, offsetp); if (strp == NULL) return NULL; /* illegal time */ if (neg) *offsetp = -*offsetp; return strp; } /* ** Given a pointer into a timezone string, extract a rule in the form ** date[/time]. See POSIX section 8 for the format of "date" and "time". ** If a valid rule is not found, return NULL. ** Otherwise, return a pointer to the first character not part of the rule. */ static const char * getrule(const char *strp, struct rule *const rulep) { if (*strp == 'J') { /* ** Julian day. */ rulep->r_type = JULIAN_DAY; ++strp; strp = getnum(strp, &rulep->r_day, 1, DAYSPERNYEAR); } else if (*strp == 'M') { /* ** Month, week, day. */ rulep->r_type = MONTH_NTH_DAY_OF_WEEK; ++strp; strp = getnum(strp, &rulep->r_mon, 1, MONSPERYEAR); if (strp == NULL) return NULL; if (*strp++ != '.') return NULL; strp = getnum(strp, &rulep->r_week, 1, 5); if (strp == NULL) return NULL; if (*strp++ != '.') return NULL; strp = getnum(strp, &rulep->r_day, 0, DAYSPERWEEK - 1); } else if (is_digit(*strp)) { /* ** Day of year. */ rulep->r_type = DAY_OF_YEAR; strp = getnum(strp, &rulep->r_day, 0, DAYSPERLYEAR - 1); } else return NULL; /* invalid format */ if (strp == NULL) return NULL; if (*strp == '/') { /* ** Time specified. */ ++strp; strp = getoffset(strp, &rulep->r_time); } else rulep->r_time = 2 * SECSPERHOUR; /* default = 2:00:00 */ return strp; } /* ** Given a year, a rule, and the offset from UT at the time that rule takes ** effect, calculate the year-relative time that rule takes effect. */ static int_fast32_t transtime(const int year, const struct rule *const rulep, const int_fast32_t offset) { BOOL leapyear; int_fast32_t value; int i; int d, m1, yy0, yy1, yy2, dow; INITIALIZE(value); leapyear = isleap(year); switch (rulep->r_type) { case JULIAN_DAY: /* ** Jn - Julian day, 1 == January 1, 60 == March 1 even in leap ** years. ** In non-leap years, or if the day number is 59 or less, just ** add SECSPERDAY times the day number-1 to the time of ** January 1, midnight, to get the day. */ value = (rulep->r_day - 1) * SECSPERDAY; if (leapyear && rulep->r_day >= 60) value += SECSPERDAY; break; case DAY_OF_YEAR: /* ** n - day of year. ** Just add SECSPERDAY times the day number to the time of ** January 1, midnight, to get the day. */ value = rulep->r_day * SECSPERDAY; break; case MONTH_NTH_DAY_OF_WEEK: /* ** Mm.n.d - nth "dth day" of month m. */ /* ** Use Zeller's Congruence to get day-of-week of first day of ** month. */ m1 = (rulep->r_mon + 9) % 12 + 1; yy0 = (rulep->r_mon <= 2) ? (year - 1) : year; yy1 = yy0 / 100; yy2 = yy0 % 100; dow = ((26 * m1 - 2) / 10 + 1 + yy2 + yy2 / 4 + yy1 / 4 - 2 * yy1) % 7; if (dow < 0) dow += DAYSPERWEEK; /* ** "dow" is the day-of-week of the first day of the month. Get ** the day-of-month (zero-origin) of the first "dow" day of the ** month. */ d = rulep->r_day - dow; if (d < 0) d += DAYSPERWEEK; for (i = 1; i < rulep->r_week; ++i) { if (d + DAYSPERWEEK >= mon_lengths[leapyear][rulep->r_mon - 1]) break; d += DAYSPERWEEK; } /* ** "d" is the day-of-month (zero-origin) of the day we want. */ value = d * SECSPERDAY; for (i = 0; i < rulep->r_mon - 1; ++i) value += mon_lengths[leapyear][i] * SECSPERDAY; break; } /* ** "value" is the year-relative time of 00:00:00 UT on the day in ** question. To get the year-relative time of the specified local ** time on that day, add the transition time and the current offset ** from UT. */ return value + rulep->r_time + offset; } /* ** Given a POSIX section 8-style TZ string, fill in the rule tables as ** appropriate. */ //#define DEB(X) fprintf(stderr, "tzparse %d\n", X); #define DEB(X) static BOOL tzparse(const char *name, struct state *sp, BOOL lastditch) { const char *stdname; const char *dstname; size_t stdlen; size_t dstlen; size_t charcnt; int_fast32_t stdoffset; int_fast32_t dstoffset; char *cp; BOOL load_ok; DEB(1) dstname = NULL; /* XXX gcc */ stdname = name; if (lastditch) { stdlen = sizeof "GMT" - 1; name += stdlen; stdoffset = 0; } else { if (*name == '<') { name++; stdname = name; name = getqzname(name, '>'); if (*name != '>') { DEB(2) return false; } stdlen = name - stdname; name++; } else { name = getzname(name); stdlen = name - stdname; } if (!stdlen) { DEB(3) return false; } name = getoffset(name, &stdoffset); if (name == NULL) { DEB(4) return false; } } charcnt = stdlen + 1; if (sizeof sp->chars < charcnt) { DEB(5) return false; } load_ok = tzload(TZDEFRULES, sp, false) == 0; if (!load_ok) sp->leapcnt = 0; /* so, we're off a little */ if (*name != '\0') { if (*name == '<') { dstname = ++name; name = getqzname(name, '>'); if (*name != '>') { DEB(6) return false; } dstlen = name - dstname; name++; } else { dstname = name; name = getzname(name); dstlen = name - dstname; /* length of DST abbr. */ } if (!dstlen) { DEB(7) return false; } charcnt += dstlen + 1; if (sizeof sp->chars < charcnt) { DEB(8) return false; } if (*name != '\0' && *name != ',' && *name != ';') { name = getoffset(name, &dstoffset); if (name == NULL) { DEB(9) return false; } } else dstoffset = stdoffset - SECSPERHOUR; if (*name == '\0' && !load_ok) name = TZDEFRULESTRING; if (*name == ',' || *name == ';') { struct rule start; struct rule end; int year; int yearlim; int timecnt; time_t janfirst; int_fast32_t janoffset = 0; int yearbeg; ++name; if ((name = getrule(name, &start)) == NULL) { DEB(10) return false; } if (*name++ != ',') { DEB(11) return false; } if ((name = getrule(name, &end)) == NULL) { DEB(12) return false; } if (*name != '\0') { DEB(13) return false; } sp->typecnt = 2; /* standard time and DST */ /* ** Two transitions per year, from EPOCH_YEAR forward. */ init_ttinfo(&sp->ttis[0], -stdoffset, false, 0); init_ttinfo(&sp->ttis[1], -dstoffset, true, (int)(stdlen + 1)); sp->defaulttype = 0; timecnt = 0; janfirst = 0; yearbeg = EPOCH_YEAR; do { int_fast32_t yearsecs = year_lengths[isleap(yearbeg - 1)] * SECSPERDAY; yearbeg--; if (increment_overflow_time(&janfirst, -yearsecs)) { janoffset = -yearsecs; break; } } while (EPOCH_YEAR - YEARSPERREPEAT / 2 < yearbeg); yearlim = yearbeg + YEARSPERREPEAT + 1; for (year = yearbeg; year < yearlim; year++) { int_fast32_t starttime = transtime(year, &start, stdoffset), endtime = transtime(year, &end, dstoffset); int_fast32_t yearsecs = (year_lengths[isleap(year)] * SECSPERDAY); BOOL reversed = endtime < starttime; if (reversed) { int_fast32_t swap = starttime; starttime = endtime; endtime = swap; } if (reversed || (starttime < endtime && (endtime - starttime < (yearsecs + (stdoffset - dstoffset))))) { if (TZ_MAX_TIMES - 2 < timecnt) break; sp->ats[timecnt] = janfirst; if (! increment_overflow_time (&sp->ats[timecnt], janoffset + starttime)) sp->types[timecnt++] = !reversed; sp->ats[timecnt] = janfirst; if (! increment_overflow_time (&sp->ats[timecnt], janoffset + endtime)) { sp->types[timecnt++] = reversed; yearlim = year + YEARSPERREPEAT + 1; } } if (increment_overflow_time (&janfirst, janoffset + yearsecs)) break; janoffset = 0; } sp->timecnt = timecnt; if (! timecnt) { sp->ttis[0] = sp->ttis[1]; sp->typecnt = 1; /* Perpetual DST. */ } else if (YEARSPERREPEAT < year - yearbeg) sp->goback = sp->goahead = true; } else { int_fast32_t theirstdoffset; int_fast32_t theirdstoffset; int_fast32_t theiroffset; BOOL isdst; int i; int j; if (*name != '\0') { DEB(14) return false; } /* ** Initial values of theirstdoffset and theirdstoffset. */ theirstdoffset = 0; for (i = 0; i < sp->timecnt; ++i) { j = sp->types[i]; if (!sp->ttis[j].tt_isdst) { theirstdoffset = - sp->ttis[j].tt_utoff; break; } } theirdstoffset = 0; for (i = 0; i < sp->timecnt; ++i) { j = sp->types[i]; if (sp->ttis[j].tt_isdst) { theirdstoffset = - sp->ttis[j].tt_utoff; break; } } /* ** Initially we're assumed to be in standard time. */ isdst = false; theiroffset = theirstdoffset; /* ** Now juggle transition times and types ** tracking offsets as you do. */ for (i = 0; i < sp->timecnt; ++i) { j = sp->types[i]; sp->types[i] = sp->ttis[j].tt_isdst; if (sp->ttis[j].tt_ttisut) { /* No adjustment to transition time */ } else { /* ** If daylight saving time is in ** effect, and the transition time was ** not specified as standard time, add ** the daylight saving time offset to ** the transition time; otherwise, add ** the standard time offset to the ** transition time. */ /* ** Transitions from DST to DDST ** will effectively disappear since ** POSIX provides for only one DST ** offset. */ if (isdst && !sp->ttis[j].tt_ttisstd) { sp->ats[i] += (time_t) (dstoffset - theirdstoffset); } else { sp->ats[i] += (time_t) (stdoffset - theirstdoffset); } } theiroffset = -sp->ttis[j].tt_utoff; if (sp->ttis[j].tt_isdst) theirstdoffset = theiroffset; else theirdstoffset = theiroffset; } /* ** Finally, fill in ttis. */ init_ttinfo(&sp->ttis[0], -stdoffset, false, 0); init_ttinfo(&sp->ttis[1], -dstoffset, true, (int)(stdlen + 1)); sp->typecnt = 2; sp->defaulttype = 0; } } else { dstlen = 0; sp->typecnt = 1; /* only standard time */ sp->timecnt = 0; init_ttinfo(&sp->ttis[0], -stdoffset, false, 0); init_ttinfo(&sp->ttis[1], 0, false, 0); sp->defaulttype = 0; } sp->charcnt = (int)charcnt; cp = sp->chars; (void) memcpy(cp, stdname, stdlen); cp += stdlen; *cp++ = '\0'; if (dstlen != 0) { (void) memcpy(cp, dstname, dstlen); *(cp + dstlen) = '\0'; } DEB(15); return true; } /* ** The easy way to behave "as if no library function calls" localtime ** is to not call it, so we drop its guts into "localsub", which can be ** freely called. (And no, the PANS doesn't require the above behavior, ** but it *is* desirable.) ** */ /*ARGSUSED*/ static gstm * localsub(struct state const *sp, time_t const *timep, int_fast32_t setname, gstm *const tmp) { const struct _ttinfo *ttisp; int i; gstm *result; const time_t t = *timep; if ((sp->goback && t < sp->ats[0]) || (sp->goahead && t > sp->ats[sp->timecnt - 1])) { time_t newt = t; time_t seconds; time_t years; if (t < sp->ats[0]) seconds = sp->ats[0] - t; else seconds = t - sp->ats[sp->timecnt - 1]; --seconds; years = (time_t)((seconds / SECSPERREPEAT + 1) * YEARSPERREPEAT); seconds = (time_t)(years * AVGSECSPERYEAR); if (t < sp->ats[0]) newt += seconds; else newt -= seconds; if (newt < sp->ats[0] || newt > sp->ats[sp->timecnt - 1]) { errno = EINVAL; return NULL; /* "cannot happen" */ } result = localsub(sp, &newt, setname, tmp); if (result) { int_fast64_t newy; newy = result->tm_year; if (t < sp->ats[0]) { newy -= years; } else { newy += years; } if (! (INT_MIN <= newy && newy <= INT_MAX)) { errno = EOVERFLOW; return NULL; } result->tm_year = (int)newy; } return result; } if (sp->timecnt == 0 || t < sp->ats[0]) { i = sp->defaulttype; } else { int lo = 1; int hi = sp->timecnt; while (lo < hi) { int mid = (lo + hi) / 2; if (t < sp->ats[mid]) { hi = mid; } else { lo = mid + 1; } } i = (int) sp->types[lo - 1]; } ttisp = &sp->ttis[i]; /* ** To get (wrong) behavior that's compatible with System V Release 2.0 ** you'd replace the statement below with ** t += ttisp->tt_utoff; ** timesub(&t, 0L, sp, tmp); */ result = timesub(&t, ttisp->tt_utoff, sp, tmp); if (result) { result->tm_isdst = ttisp->tt_isdst; result->tm_zone = __UNCONST(&sp->chars[ttisp->tt_desigidx]); } return result; } /* ** Return the number of leap years through the end of the given year ** where, to make the math easy, the answer for year zero is defined as zero. */ static int leaps_thru_end_of_nonneg(int y) { return y / 4 - y / 100 + y / 400; } static int ATTRIBUTE_PURE leaps_thru_end_of(const int y) { return (y < 0 ? -1 - leaps_thru_end_of_nonneg(-1 - y) : leaps_thru_end_of_nonneg(y)); } static gstm * timesub(const time_t *timep, int_fast32_t offset, const struct state *sp, gstm *tmp) { const struct lsinfo * lp; time_t tdays; int idays; /* unsigned would be so 2003 */ int_fast64_t rem; int y; const int * ip; int_fast64_t corr; int hit; int i; corr = 0; hit = false; i = (sp == NULL) ? 0 : sp->leapcnt; while (--i >= 0) { lp = &sp->lsis[i]; if (*timep >= lp->ls_trans) { corr = lp->ls_corr; hit = (*timep == lp->ls_trans && (i == 0 ? 0 : lp[-1].ls_corr) < corr); break; } } y = EPOCH_YEAR; tdays = (time_t)(*timep / SECSPERDAY); rem = *timep % SECSPERDAY; while (tdays < 0 || tdays >= year_lengths[isleap(y)]) { int newy; time_t tdelta; int idelta; int leapdays; tdelta = tdays / DAYSPERLYEAR; if (! ((! TYPE_SIGNED(time_t) || INT_MIN <= tdelta) && tdelta <= INT_MAX)) goto out_of_range; _DIAGASSERT(__type_fit(int, tdelta)); idelta = (int)tdelta; if (idelta == 0) idelta = (tdays < 0) ? -1 : 1; newy = y; if (increment_overflow(&newy, idelta)) goto out_of_range; leapdays = leaps_thru_end_of(newy - 1) - leaps_thru_end_of(y - 1); tdays -= ((time_t) newy - y) * DAYSPERNYEAR; tdays -= leapdays; y = newy; } /* ** Given the range, we can now fearlessly cast... */ idays = (int) tdays; rem += offset - corr; while (rem < 0) { rem += SECSPERDAY; --idays; } while (rem >= SECSPERDAY) { rem -= SECSPERDAY; ++idays; } while (idays < 0) { if (increment_overflow(&y, -1)) goto out_of_range; idays += year_lengths[isleap(y)]; } while (idays >= year_lengths[isleap(y)]) { idays -= year_lengths[isleap(y)]; if (increment_overflow(&y, 1)) goto out_of_range; } tmp->tm_year = y; if (increment_overflow(&tmp->tm_year, -TM_YEAR_BASE)) goto out_of_range; tmp->tm_yday = idays; /* ** The "extra" mods below avoid overflow problems. */ tmp->tm_wday = EPOCH_WDAY + ((y - EPOCH_YEAR) % DAYSPERWEEK) * (DAYSPERNYEAR % DAYSPERWEEK) + leaps_thru_end_of(y - 1) - leaps_thru_end_of(EPOCH_YEAR - 1) + idays; tmp->tm_wday %= DAYSPERWEEK; if (tmp->tm_wday < 0) tmp->tm_wday += DAYSPERWEEK; tmp->tm_hour = (int) (rem / SECSPERHOUR); rem %= SECSPERHOUR; tmp->tm_min = (int) (rem / SECSPERMIN); /* ** A positive leap second requires a special ** representation. This uses "... ??:59:60" et seq. */ tmp->tm_sec = (int) (rem % SECSPERMIN) + hit; ip = mon_lengths[isleap(y)]; for (tmp->tm_mon = 0; idays >= ip[tmp->tm_mon]; ++(tmp->tm_mon)) idays -= ip[tmp->tm_mon]; tmp->tm_mday = (int) (idays + 1); tmp->tm_isdst = 0; tmp->tm_gmtoff = offset; return tmp; out_of_range: errno = EOVERFLOW; return NULL; } #ifndef WRONG #define WRONG ((time_t)-1) #endif /* !defined WRONG */ /* ** Normalize logic courtesy Paul Eggert. */ static BOOL increment_overflow(int *ip, int j) { int const i = *ip; /* ** If i >= 0 there can only be overflow if i + j > INT_MAX ** or if j > INT_MAX - i; given i >= 0, INT_MAX - i cannot overflow. ** If i < 0 there can only be overflow if i + j < INT_MIN ** or if j < INT_MIN - i; given i < 0, INT_MIN - i cannot overflow. */ if ((i >= 0) ? (j > INT_MAX - i) : (j < INT_MIN - i)) return true; *ip += j; return false; } static BOOL increment_overflow_time(time_t *tp, int_fast32_t j) { /* ** This is like ** 'if (! (TIME_T_MIN <= *tp + j && *tp + j <= TIME_T_MAX)) ...', ** except that it does the right thing even if *tp + j would overflow. */ if (! (j < 0 ? (TYPE_SIGNED(time_t) ? TIME_T_MIN - j <= *tp : -1 - j < *tp) : *tp <= TIME_T_MAX - j)) return true; *tp += j; return false; } static int_fast64_t leapcorr(struct state const *sp, time_t t) { struct lsinfo const * lp; int i; i = sp->leapcnt; while (--i >= 0) { lp = &sp->lsis[i]; if (t >= lp->ls_trans) return lp->ls_corr; } return 0; } gnustep-base-1.29.0/Source/unix/000077500000000000000000000000001435650067400164355ustar00rootroot00000000000000gnustep-base-1.29.0/Source/unix/GNUmakefile000066400000000000000000000023761435650067400205170ustar00rootroot00000000000000# # src makefile for the GNUstep Base Library # # Copyright (C) 1997 Free Software Foundation, Inc. # # Written by: Scott Christley # # This file is part of the GNUstep Base Library. # # 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 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 # Library General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free # Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. # PACKAGE_NAME = gnustep-base GNUSTEP_LOCAL_ADDITIONAL_MAKEFILES=../../base.make include $(GNUSTEP_MAKEFILES)/common.make include ../../config.mak SUBPROJECT_NAME = unix unix_OBJC_FILES = \ GSRunLoopCtxt.m \ NSStream.m \ -include Makefile.preamble include $(GNUSTEP_MAKEFILES)/subproject.make -include Makefile.postamble gnustep-base-1.29.0/Source/unix/GSRunLoopCtxt.m000066400000000000000000000641471435650067400213220ustar00rootroot00000000000000/** * The GSRunLoopCtxt stores context information to handle polling for * events. This information is associated with a particular runloop * mode, and persists throughout the life of the runloop instance. * * NB. This class is private to NSRunLoop and must not be subclassed. */ #import "common.h" #import "Foundation/NSError.h" #import "Foundation/NSNotification.h" #import "Foundation/NSNotificationQueue.h" #import "Foundation/NSPort.h" #import "Foundation/NSStream.h" #import "../GSRunLoopCtxt.h" #import "../GSRunLoopWatcher.h" #import "../GSPrivate.h" #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_SYS_TIME_H #include #endif #ifdef HAVE_POLL_F #include #endif #define FDCOUNT 1024 static SEL wRelSel; static SEL wRetSel; static IMP wRelImp; static IMP wRetImp; static void wRelease(NSMapTable* t, void* w) { (*wRelImp)((id)w, wRelSel); } static void wRetain(NSMapTable* t, const void* w) { (*wRetImp)((id)w, wRetSel); } static const NSMapTableValueCallBacks WatcherMapValueCallBacks = { wRetain, wRelease, 0 }; @implementation GSRunLoopCtxt + (void) initialize { wRelSel = @selector(release); wRetSel = @selector(retain); wRelImp = [[GSRunLoopWatcher class] instanceMethodForSelector: wRelSel]; wRetImp = [[GSRunLoopWatcher class] instanceMethodForSelector: wRetSel]; } - (void) dealloc { RELEASE(mode); GSIArrayEmpty(performers); NSZoneFree(performers->zone, (void*)performers); GSIArrayEmpty(timers); NSZoneFree(timers->zone, (void*)timers); GSIArrayEmpty(watchers); NSZoneFree(watchers->zone, (void*)watchers); if (_efdMap != 0) { NSFreeMapTable(_efdMap); } if (_rfdMap != 0) { NSFreeMapTable(_rfdMap); } if (_wfdMap != 0) { NSFreeMapTable(_wfdMap); } GSIArrayEmpty(_trigger); NSZoneFree(_trigger->zone, (void*)_trigger); #ifdef HAVE_POLL_F if (pollfds != 0) { NSZoneFree(NSDefaultMallocZone(), pollfds); } #endif [super dealloc]; } /** * Remove any callback for the specified event which is set for an * uncompleted poll operation.
* This is called by nested event loops on contexts in outer loops * when they handle an event ... removing the event from the outer * loop ensures that it won't get handled twice, once by the inner * loop and once by the outer one. */ - (void) endEvent: (void*)data for: (GSRunLoopWatcher*)watcher { if (completed == NO) { unsigned i = GSIArrayCount(_trigger); while (i-- > 0) { GSIArrayItem item = GSIArrayItemAtIndex(_trigger, i); if (item.obj == (id)watcher) { GSIArrayRemoveItemAtIndex(_trigger, i); return; } } switch (watcher->type) { case ET_RPORT: case ET_RDESC: NSMapRemove(_rfdMap, data); break; case ET_WDESC: NSMapRemove(_wfdMap, data); break; case ET_EDESC: NSMapRemove(_efdMap, data); break; case ET_TRIGGER: // Already handled break; default: NSLog(@"Ending an event of unexpected type (%d)", watcher->type); break; } } } /** * Mark this poll context as having completed, so that if we are * executing a re-entrant poll, the enclosing poll operations * know they can stop what they are doing because an inner * operation has done the job. */ - (void) endPoll { completed = YES; } - (id) init { [NSException raise: NSInternalInconsistencyException format: @"-init may not be called for GSRunLoopCtxt"]; return nil; } - (id) initWithMode: (NSString*)theMode extra: (void*)e { self = [super init]; if (self != nil) { NSZone *z; mode = [theMode copy]; extra = e; z = [self zone]; performers = NSZoneMalloc(z, sizeof(GSIArray_t)); timers = NSZoneMalloc(z, sizeof(GSIArray_t)); watchers = NSZoneMalloc(z, sizeof(GSIArray_t)); _trigger = NSZoneMalloc(z, sizeof(GSIArray_t)); GSIArrayInitWithZoneAndCapacity(performers, z, 8); GSIArrayInitWithZoneAndCapacity(timers, z, 8); GSIArrayInitWithZoneAndCapacity(watchers, z, 8); GSIArrayInitWithZoneAndCapacity(_trigger, z, 8); _efdMap = NSCreateMapTable (NSIntegerMapKeyCallBacks, WatcherMapValueCallBacks, 0); _rfdMap = NSCreateMapTable (NSIntegerMapKeyCallBacks, WatcherMapValueCallBacks, 0); _wfdMap = NSCreateMapTable (NSIntegerMapKeyCallBacks, WatcherMapValueCallBacks, 0); } return self; } #ifdef HAVE_POLL_F static void setPollfd(int fd, int event, GSRunLoopCtxt *ctxt) { int index; struct pollfd *pollfds = ctxt->pollfds; pollextra *pe = (pollextra*)ctxt->extra; if (fd >= pe->limit) { int oldfd_limit = pe->limit; pe->limit = fd + 1; if (pe->index == 0) { pe->index = NSZoneMalloc(NSDefaultMallocZone(), pe->limit * sizeof(*(pe->index))); } else { pe->index = NSZoneRealloc(NSDefaultMallocZone(), pe->index, pe->limit * sizeof(*(pe->index))); } do { pe->index[oldfd_limit++] = -1; } while (oldfd_limit < pe->limit); } index = pe->index[fd]; if (index == -1) { if (ctxt->pollfds_count >= ctxt->pollfds_capacity) { ctxt->pollfds_capacity += 8; pollfds = NSZoneRealloc(NSDefaultMallocZone(), pollfds, ctxt->pollfds_capacity * sizeof (*pollfds)); ctxt->pollfds = pollfds; } index = ctxt->pollfds_count++; pe->index[fd] = index; pollfds[index].fd = fd; pollfds[index].events = 0; pollfds[index].revents = 0; } pollfds[index].events |= event; } /** * Perform a poll for the specified runloop context. * If the method has been called re-entrantly, the contexts stack * will list all the contexts with polls in progress * and this method must tell those outer contexts not to handle events * which are handled by this context. */ - (BOOL) pollUntil: (int)milliseconds within: (NSArray*)contexts { GSRunLoopThreadInfo *threadInfo = GSRunLoopInfoForThread(nil); int poll_return; int fdEnd; /* Number of descriptors being monitored. */ int fdIndex; int fdFinish; unsigned count; unsigned int i; BOOL immediate = NO; i = GSIArrayCount(watchers); /* * Get ready to listen to file descriptors. * The maps will not have been emptied by any previous call. */ NSResetMapTable(_efdMap); NSResetMapTable(_rfdMap); NSResetMapTable(_wfdMap); GSIArrayRemoveAllItems(_trigger); /* * Do the pre-listening set-up for the file descriptors of this mode. */ if (pollfds_capacity < i + 2) { pollfds_capacity = i + 2; if (pollfds == 0) { pollfds = NSZoneMalloc(NSDefaultMallocZone(), pollfds_capacity * sizeof(*pollfds)); } else { pollfds = NSZoneRealloc(NSDefaultMallocZone(), pollfds, pollfds_capacity * sizeof(*pollfds)); } } pollfds_count = 0; ((pollextra*)extra)->limit = 0; /* Watch for signals from other threads. */ setPollfd(threadInfo->inputFd, POLLIN, self); while (i-- > 0) { GSRunLoopWatcher *info; BOOL trigger; info = GSIArrayItemAtIndex(watchers, i).obj; if (info->_invalidated == YES) { GSIArrayRemoveItemAtIndex(watchers, i); } else if ([info runLoopShouldBlock: &trigger] == NO) { if (trigger == YES) { immediate = YES; GSIArrayAddItem(_trigger, (GSIArrayItem)(id)info); } } else { int fd; switch (info->type) { case ET_EDESC: fd = (int)(intptr_t)info->data; setPollfd(fd, POLLPRI, self); NSMapInsert(_efdMap, (void*)(intptr_t)fd, info); break; case ET_RDESC: fd = (int)(intptr_t)info->data; setPollfd(fd, POLLIN, self); NSMapInsert(_rfdMap, (void*)(intptr_t)fd, info); break; case ET_WDESC: fd = (int)(intptr_t)info->data; setPollfd(fd, POLLOUT, self); NSMapInsert(_wfdMap, (void*)(intptr_t)fd, info); break; case ET_TRIGGER: break; case ET_RPORT: { id port = info->receiver; NSInteger port_fd_size = FDCOUNT; NSInteger port_fd_count = FDCOUNT; NSInteger port_fd_buffer[FDCOUNT]; NSInteger *port_fd_array = port_fd_buffer; [port getFds: port_fd_array count: &port_fd_count]; while (port_fd_count > port_fd_size) { if (port_fd_array != port_fd_buffer) free(port_fd_array); port_fd_size = port_fd_count; port_fd_count = port_fd_size; port_fd_array = malloc(sizeof(NSInteger)*port_fd_size); [port getFds: port_fd_array count: &port_fd_count]; } NSDebugMLLog(@"NSRunLoop", @"listening to %"PRIdPTR" port handles\n", port_fd_count); while (port_fd_count--) { fd = port_fd_array[port_fd_count]; setPollfd(fd, POLLIN, self); NSMapInsert(_rfdMap, (void*)(intptr_t)fd, info); } if (port_fd_array != port_fd_buffer) free(port_fd_array); } break; } } } /* * If there are notifications in the 'idle' queue, we try an * instantaneous select so that, if there is no input pending, * we can service the queue. Similarly, if a task has completed, * we need to deliver its notifications. */ if (GSPrivateCheckTasks() || GSPrivateNotifyMore(mode) || immediate == YES) { milliseconds = 0; } #if 0 { unsigned int i; fprintf(stderr, "poll %d %d:", milliseconds, pollfds_count); for (i = 0; i < pollfds_count; i++) fprintf(stderr, " %d,%x", pollfds[i].fd, pollfds[i].events); fprintf(stderr, "\n"); } #endif poll_return = poll (pollfds, pollfds_count, milliseconds); #if 0 { unsigned int i; fprintf(stderr, "ret %d %d:", poll_return, pollfds_count); for (i = 0; i < pollfds_count; i++) fprintf(stderr, " %d,%x", pollfds[i].fd, pollfds[i].revents); fprintf(stderr, "\n"); } #endif NSDebugMLLog(@"NSRunLoop", @"poll returned %d\n", poll_return); if (poll_return < 0) { if (errno == EINTR) { GSPrivateCheckTasks(); poll_return = 0; } else if (errno == 0) { /* Some systems returns an errno == 0. Not sure why */ poll_return = 0; } else { /* Some exceptional condition happened. */ /* xxx We can do something with exception_fds, instead of aborting here. */ NSLog (@"poll() error in -acceptInputForMode:beforeDate: '%@'", [NSError _last]); abort (); } } /* * Trigger any watchers which are set up to for every runloop wait. */ count = GSIArrayCount(_trigger); while (count-- > 0) { GSRunLoopWatcher *watcher; watcher = (GSRunLoopWatcher*)GSIArrayItemAtIndex(_trigger, count).obj; if (watcher->_invalidated == NO) { i = [contexts count]; while (i-- > 0) { GSRunLoopCtxt *c = [contexts objectAtIndex: i]; if (c != self) { [c endEvent: (void*)watcher for: watcher]; } } /* * The watcher is still valid - so call its * receivers event handling method. */ [watcher->receiver receivedEvent: watcher->data type: watcher->type extra: watcher->data forMode: mode]; } GSPrivateNotifyASAP(mode); } /* * If the poll returned no descriptors with events, we have no more to do. */ if (poll_return == 0) { completed = YES; return NO; } /* * Look at all the file descriptors poll() says are ready for action; * notify the corresponding object for each of the ready fd's. * NB. It is possible for a watcher to be missing from the map - if * the event handler of a previous watcher has 'run' the loop again * before returning. * NB. Each time this loop is entered, the starting position (fairStart) * is incremented - this is to ensure a fair distribution over all * inputs where multiple inputs are in use. Note - fairStart can be * modified while we are in the loop (by recursive calls). */ fdEnd = pollfds_count; if (++fairStart >= fdEnd) { fairStart = 0; fdIndex = 0; fdFinish = 0; } else { fdIndex = fairStart; fdFinish = fairStart; } completed = NO; while (completed == NO) { if (pollfds[fdIndex].revents != 0) { int fd = pollfds[fdIndex].fd; GSRunLoopWatcher *watcher; BOOL found = NO; /* * The poll() call supports various error conditions - all * errors should be handled by any available handler. * The ET_EDSEC handler is the primary handler for exceptions * though it is more generally used to deal with out-of-band data. */ if (pollfds[fdIndex].revents & (POLLPRI|POLLERR|POLLHUP|POLLNVAL)) { watcher = (GSRunLoopWatcher*)NSMapGet(_efdMap, (void*)(intptr_t)fd); if (watcher != nil && watcher->_invalidated == NO) { i = [contexts count]; while (i-- > 0) { GSRunLoopCtxt *c = [contexts objectAtIndex: i]; if (c != self) { [c endEvent: (void*)(intptr_t)fd for: watcher]; } } /* * The watcher is still valid - so call its * receivers event handling method. */ [watcher->receiver receivedEvent: watcher->data type: watcher->type extra: (void*)(uintptr_t)fd forMode: mode]; } GSPrivateNotifyASAP(mode); if (completed == YES) { break; // A nested poll has done the job. } found = YES; } if (pollfds[fdIndex].revents & (POLLOUT|POLLERR|POLLHUP|POLLNVAL)) { watcher = (GSRunLoopWatcher*)NSMapGet(_wfdMap, (void*)(intptr_t)fd); if (watcher != nil && watcher->_invalidated == NO) { i = [contexts count]; while (i-- > 0) { GSRunLoopCtxt *c = [contexts objectAtIndex: i]; if (c != self) { [c endEvent: (void*)(intptr_t)fd for: watcher]; } } /* * The watcher is still valid - so call its * receivers event handling method. */ [watcher->receiver receivedEvent: watcher->data type: watcher->type extra: (void*)(uintptr_t)fd forMode: mode]; } GSPrivateNotifyASAP(mode); if (completed == YES) { break; // A nested poll has done the job. } found = YES; } if (pollfds[fdIndex].revents & (POLLIN|POLLERR|POLLHUP|POLLNVAL)) { if (fd == threadInfo->inputFd) { NSDebugMLLog(@"NSRunLoop", @"Fire perform on thread"); [threadInfo fire]; watcher = nil; } else { watcher = (GSRunLoopWatcher*) NSMapGet(_rfdMap, (void*)(intptr_t)fd); } if (watcher != nil && watcher->_invalidated == NO) { i = [contexts count]; while (i-- > 0) { GSRunLoopCtxt *c = [contexts objectAtIndex: i]; if (c != self) { [c endEvent: (void*)(intptr_t)fd for: watcher]; } } /* * The watcher is still valid - so call its * receivers event handling method. */ [watcher->receiver receivedEvent: watcher->data type: watcher->type extra: (void*)(uintptr_t)fd forMode: mode]; } GSPrivateNotifyASAP(mode); if (completed == YES) { break; // A nested poll has done the job. } found = YES; } if (found == YES && --poll_return == 0) { completed = YES; } } if (++fdIndex >= fdEnd) { fdIndex = 0; } if (fdIndex == fdFinish) { completed = YES; } } completed = YES; return YES; } + (BOOL) awakenedBefore: (NSDate*)when { GSRunLoopThreadInfo *threadInfo = GSRunLoopInfoForThread(nil); NSTimeInterval ti = (when == nil) ? 0.0 : [when timeIntervalSinceNow]; int milliseconds = (ti <= 0.0) ? 0 : (int)(ti*1000); struct pollfd pollfds; /* Watch for signals from other threads. */ pollfds.fd = threadInfo->inputFd; pollfds.events = POLLIN; pollfds.revents = 0; if (poll(&pollfds, 1, milliseconds) == 1) { NSDebugMLLog(@"NSRunLoop", @"Fire perform on thread"); [threadInfo fire]; return YES; } return NO; } #else - (BOOL) pollUntil: (int)milliseconds within: (NSArray*)contexts { GSRunLoopThreadInfo *threadInfo = GSRunLoopInfoForThread(nil); struct timeval timeout; void *select_timeout; int select_return; int fdIndex; int fdFinish; fd_set read_fds; // Mask for read-ready fds. fd_set exception_fds; // Mask for exception fds. fd_set write_fds; // Mask for write-ready fds. int fd; int fdEnd = -1; unsigned count; unsigned i; BOOL immediate = NO; i = GSIArrayCount(watchers); /* Find out how much time we should wait, and set SELECT_TIMEOUT. */ if (milliseconds == 0) { /* Don't wait at all. */ timeout.tv_sec = 0; timeout.tv_usec = 0; select_timeout = &timeout; } else if (milliseconds > 0) { timeout.tv_sec = milliseconds/1000; timeout.tv_usec = (milliseconds - 1000 * timeout.tv_sec) * 1000; select_timeout = &timeout; } else { timeout.tv_sec = -1; timeout.tv_usec = -1; select_timeout = NULL; } /* * Get ready to listen to file descriptors. * Initialize the set of FDS we'll pass to select(), and make sure we * have empty maps for keeping track of which watcher is associated * with which file descriptor. * The maps may not have been emptied if a previous call to this * method was terminated by an exception. */ memset(&exception_fds, '\0', sizeof(exception_fds)); memset(&read_fds, '\0', sizeof(read_fds)); memset(&write_fds, '\0', sizeof(write_fds)); NSResetMapTable(_efdMap); NSResetMapTable(_rfdMap); NSResetMapTable(_wfdMap); GSIArrayRemoveAllItems(_trigger); /* Watch for signals from other threads. */ fd = threadInfo->inputFd; if (fd > fdEnd) fdEnd = fd; FD_SET (fd, &read_fds); while (i-- > 0) { GSRunLoopWatcher *info; int fd; BOOL trigger; info = GSIArrayItemAtIndex(watchers, i).obj; if (info->_invalidated == YES) { GSIArrayRemoveItemAtIndex(watchers, i); } else if ([info runLoopShouldBlock: &trigger] == NO) { if (trigger == YES) { immediate = YES; GSIArrayAddItem(_trigger, (GSIArrayItem)(id)info); } } else { switch (info->type) { case ET_EDESC: fd = (int)(intptr_t)info->data; if (fd > fdEnd) fdEnd = fd; FD_SET (fd, &exception_fds); NSMapInsert(_efdMap, (void*)(intptr_t)fd, info); break; case ET_RDESC: fd = (int)(intptr_t)info->data; if (fd > fdEnd) fdEnd = fd; FD_SET (fd, &read_fds); NSMapInsert(_rfdMap, (void*)(intptr_t)fd, info); break; case ET_WDESC: fd = (int)(intptr_t)info->data; if (fd > fdEnd) fdEnd = fd; FD_SET (fd, &write_fds); NSMapInsert(_wfdMap, (void*)(intptr_t)fd, info); break; case ET_RPORT: { id port = info->receiver; NSInteger port_fd_size = FDCOUNT; NSInteger port_fd_count = FDCOUNT; NSInteger port_fd_buffer[FDCOUNT]; NSInteger *port_fd_array = port_fd_buffer; [port getFds: port_fd_array count: &port_fd_count]; while (port_fd_count > port_fd_size) { if (port_fd_array != port_fd_buffer) free(port_fd_array); port_fd_size = port_fd_count; port_fd_count = port_fd_size; port_fd_array = malloc(sizeof(NSInteger)*port_fd_size); [port getFds: port_fd_array count: &port_fd_count]; } NSDebugMLLog(@"NSRunLoop", @"listening to %d port sockets", port_fd_count); while (port_fd_count--) { fd = port_fd_array[port_fd_count]; if (fd > fdEnd) fdEnd = fd; FD_SET (fd, &read_fds); NSMapInsert(_rfdMap, (void*)(intptr_t)fd, info); } if (port_fd_array != port_fd_buffer) free(port_fd_array); } break; case ET_TRIGGER: break; } } } fdEnd++; /* * If there are notifications in the 'idle' queue, we try an * instantaneous select so that, if there is no input pending, * we can service the queue. Similarly, if a task has completed, * we need to deliver its notifications. */ if (GSPrivateCheckTasks() || GSPrivateNotifyMore(mode) || immediate == YES) { timeout.tv_sec = 0; timeout.tv_usec = 0; select_timeout = &timeout; } // NSDebugMLLog(@"NSRunLoop", @"select timeout %d,%d", timeout.tv_sec, timeout.tv_usec); select_return = select (fdEnd, &read_fds, &write_fds, &exception_fds, select_timeout); NSDebugMLLog(@"NSRunLoop", @"select returned %d", select_return); if (select_return < 0) { if (errno == EINTR) { GSPrivateCheckTasks(); select_return = 0; } else if (errno == 0) { /* Some systems return an errno == 0. Not sure why */ select_return = 0; } else { /* Some exceptional condition happened. */ /* xxx We can do something with exception_fds, instead of aborting here. */ NSLog (@"select() error in -acceptInputForMode:beforeDate: '%@'", [NSError _last]); abort (); } } /* * Trigger any watchers which are set up to for every runloop wait. */ count = GSIArrayCount(_trigger); while (count-- > 0) { GSRunLoopWatcher *watcher; watcher = (GSRunLoopWatcher*)GSIArrayItemAtIndex(_trigger, count).obj; if (watcher->_invalidated == NO) { i = [contexts count]; while (i-- > 0) { GSRunLoopCtxt *c = [contexts objectAtIndex: i]; if (c != self) { [c endEvent: (void*)watcher for: watcher]; } } /* * The watcher is still valid - so call its * receivers event handling method. */ [watcher->receiver receivedEvent: watcher->data type: watcher->type extra: watcher->data forMode: mode]; } GSPrivateNotifyASAP(mode); } /* * If the select returned no descriptors with events, we have no more to do. */ if (select_return == 0) { completed = YES; return NO; } /* * Look at all the file descriptors select() says are ready for action; * notify the corresponding object for each of the ready fd's. * NB. Each time this loop is entered, the starting position (fairStart) * is incremented - this is to ensure a fair distribution over all * inputs where multiple inputs are in use. Note - fairStart can be * modified while we are in the loop (by recursive calls). */ if (++fairStart >= fdEnd) { fairStart = 0; fdIndex = 0; fdFinish = 0; } else { fdIndex = fairStart; fdFinish = fairStart; } completed = NO; while (completed == NO) { BOOL found = NO; if (FD_ISSET (fdIndex, &exception_fds)) { GSRunLoopWatcher *watcher; watcher = (GSRunLoopWatcher*)NSMapGet(_efdMap, (void*)(intptr_t)fdIndex); if (watcher != nil && watcher->_invalidated == NO) { i = [contexts count]; while (i-- > 0) { GSRunLoopCtxt *c = [contexts objectAtIndex: i]; if (c != self) [c endEvent: (void*)(intptr_t)fdIndex for: watcher]; } /* * The watcher is still valid - so call its receivers * event handling method. */ [watcher->receiver receivedEvent: watcher->data type: watcher->type extra: (void*)(intptr_t)fdIndex forMode: mode]; } GSPrivateNotifyASAP(mode); if (completed == YES) { break; } found = YES; } if (FD_ISSET (fdIndex, &write_fds)) { GSRunLoopWatcher *watcher; watcher = (GSRunLoopWatcher*)NSMapGet(_wfdMap, (void*)(intptr_t)fdIndex); if (watcher != nil && watcher->_invalidated == NO) { i = [contexts count]; while (i-- > 0) { GSRunLoopCtxt *c = [contexts objectAtIndex: i]; if (c != self) [c endEvent: (void*)(intptr_t)fdIndex for: watcher]; } /* * The watcher is still valid - so call its receivers * event handling method. */ [watcher->receiver receivedEvent: watcher->data type: watcher->type extra: (void*)(intptr_t)fdIndex forMode: mode]; } GSPrivateNotifyASAP(mode); if (completed == YES) { break; } found = YES; } if (FD_ISSET (fdIndex, &read_fds)) { GSRunLoopWatcher *watcher; if (fdIndex == threadInfo->inputFd) { NSDebugMLLog(@"NSRunLoop", @"Fire perform on thread"); [threadInfo fire]; watcher = nil; } else { watcher = (GSRunLoopWatcher*) NSMapGet(_rfdMap, (void*)(intptr_t)fdIndex); } if (watcher != nil && watcher->_invalidated == NO) { i = [contexts count]; while (i-- > 0) { GSRunLoopCtxt *c = [contexts objectAtIndex: i]; if (c != self) [c endEvent: (void*)(intptr_t)fdIndex for: watcher]; } /* * The watcher is still valid - so call its receivers * event handling method. */ [watcher->receiver receivedEvent: watcher->data type: watcher->type extra: (void*)(intptr_t)fdIndex forMode: mode]; } GSPrivateNotifyASAP(mode); if (completed == YES) { break; } found = YES; } if (found == YES && --select_return == 0) { completed = YES; } if (++fdIndex >= fdEnd) { fdIndex = 0; } if (fdIndex == fdFinish) { completed = YES; } } completed = YES; return YES; } + (BOOL) awakenedBefore: (NSDate*)when { GSRunLoopThreadInfo *threadInfo = GSRunLoopInfoForThread(nil); NSTimeInterval ti = (when == nil) ? 0.0 : [when timeIntervalSinceNow]; int milliseconds = (ti <= 0.0) ? 0 : (int)(ti*1000); struct timeval timeout; fd_set read_fds; // Mask for read-ready fds. fd_set exception_fds; // Mask for exception fds. fd_set write_fds; // Mask for write-ready fds. memset(&exception_fds, '\0', sizeof(exception_fds)); memset(&read_fds, '\0', sizeof(read_fds)); memset(&write_fds, '\0', sizeof(write_fds)); timeout.tv_sec = milliseconds/1000; timeout.tv_usec = (milliseconds - 1000 * timeout.tv_sec) * 1000; FD_SET (threadInfo->inputFd, &read_fds); if (select (threadInfo->inputFd, &read_fds, &write_fds, &exception_fds, &timeout) > 0) { NSDebugMLLog(@"NSRunLoop", @"Fire perform on thread"); [threadInfo fire]; return YES; } return NO; } #endif @end gnustep-base-1.29.0/Source/unix/Makefile.preamble000066400000000000000000000042271435650067400216700ustar00rootroot00000000000000# # Makefile.preamble # # Copyright (C) 1997 Free Software Foundation, Inc. # # Author: Scott Christley # # This file is part of the GNUstep Base Library. # # 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 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 # Library General Public License for more details. # # If you are interested in a warranty or support for this source code, # contact Scott Christley at scottc@net-community.com # # You should have received a copy of the GNU Lesser General Public # License along with this library; see the file COPYING.LIB. # If not, write to the Free Software Foundation, # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # Makefile.preamble # # Project specific makefile variables # # Do not put any Makefile rules in this file, instead they should # be put into Makefile.postamble. # # # Flags dealing with compiling and linking # # Additional flags to pass to the preprocessor ADDITIONAL_CPPFLAGS = $(DEFS) \ $(WARN_FLAGS) # Additional flags to pass to the Objective-C compiler #ADDITIONAL_OBJCFLAGS = ifeq ($(GNUSTEP_TARGET_OS),mingw32) ADDITIONAL_OBJCFLAGS += -DBUILD_libgnustep_base_DLL=1 else ifeq ($(GNUSTEP_TARGET_OS),mingw64) ADDITIONAL_OBJCFLAGS += -DBUILD_libgnustep_base_DLL=1 else ifeq ($(GNUSTEP_TARGET_OS),cygwin) ADDITIONAL_OBJCFLAGS += -DBUILD_libgnustep_base_DLL=1 else ifeq ($(GNUSTEP_TARGET_OS),windows) ADDITIONAL_OBJCFLAGS += -DBUILD_libgnustep_base_DLL=1 endif # Additional flags to pass to the C compiler ADDITIONAL_CFLAGS = # Additional include directories the compiler should search ADDITIONAL_INCLUDE_DIRS = -I../$(GNUSTEP_TARGET_DIR) -I../ ifeq ($(FOUNDATION_LIB),gnu) ADDITIONAL_INCLUDE_DIRS += -I../../Headers endif # Additional LDFLAGS to pass to the linker ADDITIONAL_LDFLAGS = gnustep-base-1.29.0/Source/unix/NSStream.m000066400000000000000000000330231435650067400203100ustar00rootroot00000000000000/** Implementation for NSStream for GNUStep Copyright (C) 2006 Free Software Foundation, Inc. Written by: Derek Zhou Written by: Richard Frith-Macdonald Date: 2006 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #include "common.h" #include #include #if defined(HAVE_FCNTL_H) # include #elif defined(HAVE_SYS_FCNTL_H) # include #endif #ifdef __ANDROID__ # include #endif #import "Foundation/NSData.h" #import "Foundation/NSArray.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSRunLoop.h" #import "Foundation/NSException.h" #import "Foundation/NSError.h" #import "Foundation/NSValue.h" #import "Foundation/NSHost.h" #import "Foundation/NSByteOrder.h" #import "Foundation/NSURL.h" #import "GNUstepBase/NSObject+GNUstepBase.h" #import "../GSPrivate.h" #import "../GSStream.h" #import "../GSSocketStream.h" /** * The concrete subclass of NSInputStream that reads from a file */ @interface GSFileInputStream : GSInputStream { @private NSString *_path; #ifdef __ANDROID__ AAsset *_asset; #endif } @end @interface GSLocalInputStream : GSSocketInputStream /** * the designated initializer */ - (id) initToAddr: (NSString*)addr; @end /** * The concrete subclass of NSOutputStream that writes to a file */ @interface GSFileOutputStream : GSOutputStream { @private NSString *_path; BOOL _shouldAppend; } @end @interface GSLocalOutputStream : GSSocketOutputStream /** * the designated initializer */ - (id) initToAddr: (NSString*)addr; @end @interface GSLocalServerStream : GSSocketServerStream @end @implementation GSFileInputStream - (id) initWithFileAtPath: (NSString *)path { if ((self = [super init]) != nil) { ASSIGN(_path, path); } return self; } - (void) dealloc { if ([self _isOpened]) { [self close]; } DESTROY(_path); [super dealloc]; } - (NSInteger) read: (uint8_t *)buffer maxLength: (NSUInteger)len { int readLen; if (buffer == 0) { [NSException raise: NSInvalidArgumentException format: @"null pointer for buffer"]; } if (len == 0) { [NSException raise: NSInvalidArgumentException format: @"zero byte read write requested"]; } _events &= ~NSStreamEventHasBytesAvailable; if ([self streamStatus] == NSStreamStatusClosed) { return 0; } #ifdef __ANDROID__ if (_asset) { readLen = AAsset_read(_asset, buffer, len); } else #endif { readLen = read((intptr_t)_loopID, buffer, len); } if (readLen < 0 && errno != EAGAIN && errno != EINTR) { [self _recordError]; readLen = -1; } else if (readLen == 0) { [self _setStatus: NSStreamStatusAtEnd]; } return readLen; } - (BOOL) getBuffer: (uint8_t **)buffer length: (NSUInteger *)len { return NO; } - (BOOL) hasBytesAvailable { if ([self _isOpened] && [self streamStatus] != NSStreamStatusAtEnd) return YES; return NO; } - (id) propertyForKey: (NSString *)key { if ([key isEqualToString: NSStreamFileCurrentOffsetKey]) { off_t offset = 0; if ([self _isOpened]) { #ifdef __ANDROID__ if (_asset) { offset = AAsset_seek(_asset, 0, SEEK_CUR); } else #endif { offset = lseek((intptr_t)_loopID, 0, SEEK_CUR); } } return [NSNumber numberWithLong: offset]; } return [super propertyForKey: key]; } - (void) open { int fd; fd = open([_path fileSystemRepresentation], O_RDONLY|O_NONBLOCK); if (fd < 0) { #ifdef __ANDROID__ _asset = [NSBundle assetForPath:_path withMode:AASSET_MODE_STREAMING]; if (!_asset) #endif { [self _recordError]; return; } } _loopID = (void*)(intptr_t)fd; [super open]; } - (void) close { #ifdef __ANDROID__ if (_asset) { AAsset_close(_asset); } else #endif { int closeReturn = close((intptr_t)_loopID); if (closeReturn < 0) [self _recordError]; } [super close]; } - (void) _dispatch { if ([self streamStatus] == NSStreamStatusOpen) { [self _sendEvent: NSStreamEventHasBytesAvailable]; } else { NSLog(@"_dispatch with unexpected status %"PRIuPTR, [self streamStatus]); } } @end @implementation GSLocalInputStream - (id) initToAddr: (NSString*)addr { if ((self = [super init]) != nil) { if ([self _setSocketAddress: addr port: 0 family: AF_UNIX] == NO) { DESTROY(self); } } return self; } @end @implementation GSFileOutputStream - (id) initToFileAtPath: (NSString *)path append: (BOOL)shouldAppend { if ((self = [super init]) != nil) { ASSIGN(_path, path); // so that unopened access will fail _shouldAppend = shouldAppend; } return self; } - (void) dealloc { if ([self _isOpened]) { [self close]; } RELEASE(_path); [super dealloc]; } - (NSInteger) write: (const uint8_t *)buffer maxLength: (NSUInteger)len { int writeLen; if (buffer == 0) { [NSException raise: NSInvalidArgumentException format: @"null pointer for buffer"]; } if (len == 0) { [NSException raise: NSInvalidArgumentException format: @"zero byte length write requested"]; } _events &= ~NSStreamEventHasSpaceAvailable; if ([self streamStatus] == NSStreamStatusClosed) { return 0; } writeLen = write((intptr_t)_loopID, buffer, len); if (writeLen < 0 && errno != EAGAIN && errno != EINTR) [self _recordError]; return writeLen; } - (BOOL) hasSpaceAvailable { if ([self _isOpened]) return YES; return NO; } - (void) open { int fd; int flag = O_WRONLY | O_NONBLOCK | O_CREAT; mode_t mode = 0666; if (_shouldAppend) flag = flag | O_APPEND; else flag = flag | O_TRUNC; fd = open([_path fileSystemRepresentation], flag, mode); if (fd < 0) { // make an error [self _recordError]; return; } _loopID = (void*)(intptr_t)fd; [super open]; } - (void) close { int closeReturn = close((intptr_t)_loopID); if (closeReturn < 0) [self _recordError]; [super close]; } - (id) propertyForKey: (NSString *)key { if ([key isEqualToString: NSStreamFileCurrentOffsetKey]) { off_t offset = 0; if ([self _isOpened]) offset = lseek((intptr_t)_loopID, 0, SEEK_CUR); return [NSNumber numberWithLong: offset]; } return [super propertyForKey: key]; } - (void) _dispatch { if ([self streamStatus] == NSStreamStatusOpen) { [self _sendEvent: NSStreamEventHasSpaceAvailable]; } else { NSLog(@"_dispatch with unexpected status %"PRIuPTR, [self streamStatus]); } } @end @implementation GSLocalOutputStream - (id) initToAddr: (NSString*)addr { if ((self = [super init]) != nil) { if ([self _setSocketAddress: addr port: 0 family: AF_UNIX] == NO) { DESTROY(self); } } return self; } @end @implementation NSStream + (void) getStreamsToHost: (NSHost *)host port: (NSInteger)port inputStream: (NSInputStream **)inputStream outputStream: (NSOutputStream **)outputStream { NSString *address = host ? (id)[host address] : (id)@"127.0.0.1"; id ins = nil; id outs = nil; // try ipv4 first ins = AUTORELEASE([[GSInetInputStream alloc] initToAddr: address port: port]); outs = AUTORELEASE([[GSInetOutputStream alloc] initToAddr: address port: port]); if (!ins) { #if defined(PF_INET6) ins = AUTORELEASE([[GSInet6InputStream alloc] initToAddr: address port: port]); outs = AUTORELEASE([[GSInet6OutputStream alloc] initToAddr: address port: port]); #endif } if (inputStream) { [ins _setSibling: outs]; *inputStream = (NSInputStream*)ins; } if (outputStream) { [outs _setSibling: ins]; *outputStream = (NSOutputStream*)outs; } } + (void) getLocalStreamsToPath: (NSString *)path inputStream: (NSInputStream **)inputStream outputStream: (NSOutputStream **)outputStream { id ins = nil; id outs = nil; ins = AUTORELEASE([[GSLocalInputStream alloc] initToAddr: path]); outs = AUTORELEASE([[GSLocalOutputStream alloc] initToAddr: path]); if (inputStream) { [ins _setSibling: outs]; *inputStream = (NSInputStream*)ins; } if (outputStream) { [outs _setSibling: ins]; *outputStream = (NSOutputStream*)outs; } return; } + (void) pipeWithInputStream: (NSInputStream **)inputStream outputStream: (NSOutputStream **)outputStream { id ins = nil; id outs = nil; int fds[2]; int pipeReturn; // the type of the stream does not matter, since we are only using the fd ins = AUTORELEASE([GSLocalInputStream new]); outs = AUTORELEASE([GSLocalOutputStream new]); pipeReturn = pipe(fds); NSAssert(pipeReturn >= 0, @"Cannot open pipe"); [ins _setLoopID: (void*)(intptr_t)fds[0]]; [outs _setLoopID: (void*)(intptr_t)fds[1]]; // no need to connect [ins _setPassive: YES]; [outs _setPassive: YES]; if (inputStream) *inputStream = (NSInputStream*)ins; if (outputStream) *outputStream = (NSOutputStream*)outs; return; } - (void) close { [self subclassResponsibility: _cmd]; } - (void) open { [self subclassResponsibility: _cmd]; } - (void) setDelegate: (id)delegate { [self subclassResponsibility: _cmd]; } - (id) delegate { [self subclassResponsibility: _cmd]; return nil; } - (BOOL) setProperty: (id)property forKey: (NSString *)key { [self subclassResponsibility: _cmd]; return NO; } - (id) propertyForKey: (NSString *)key { [self subclassResponsibility: _cmd]; return nil; } - (void) scheduleInRunLoop: (NSRunLoop *)aRunLoop forMode: (NSString *)mode { [self subclassResponsibility: _cmd]; } - (void) removeFromRunLoop: (NSRunLoop *)aRunLoop forMode: (NSString *)mode; { [self subclassResponsibility: _cmd]; } - (NSError *) streamError { [self subclassResponsibility: _cmd]; return nil; } - (NSStreamStatus) streamStatus { [self subclassResponsibility: _cmd]; return 0; } @end @implementation NSInputStream + (id) inputStreamWithData: (NSData *)data { return AUTORELEASE([[GSDataInputStream alloc] initWithData: data]); } + (id) inputStreamWithFileAtPath: (NSString *)path { return AUTORELEASE([[GSFileInputStream alloc] initWithFileAtPath: path]); } + (id) inputStreamWithURL: (NSURL *)url { if ([url isFileURL]) { return [self inputStreamWithFileAtPath: [url path]]; } return [self inputStreamWithData: [url resourceDataUsingCache: YES]]; } - (BOOL) getBuffer: (uint8_t **)buffer length: (NSUInteger *)len { [self subclassResponsibility: _cmd]; return NO; } - (BOOL) hasBytesAvailable { [self subclassResponsibility: _cmd]; return NO; } - (id) initWithData: (NSData *)data { DESTROY(self); return [[GSDataInputStream alloc] initWithData: data]; } - (id) initWithFileAtPath: (NSString *)path { DESTROY(self); return [[GSFileInputStream alloc] initWithFileAtPath: path]; } - (id) initWithURL: (NSURL *)url { DESTROY(self); if ([url isFileURL]) { return [[GSFileInputStream alloc] initWithFileAtPath: [url path]]; } return [[GSDataInputStream alloc] initWithData: [url resourceDataUsingCache: YES]]; } - (NSInteger) read: (uint8_t *)buffer maxLength: (NSUInteger)len { [self subclassResponsibility: _cmd]; return -1; } @end @implementation NSOutputStream + (id) outputStreamToBuffer: (uint8_t *)buffer capacity: (NSUInteger)capacity { return AUTORELEASE([[GSBufferOutputStream alloc] initToBuffer: buffer capacity: capacity]); } + (id) outputStreamToFileAtPath: (NSString *)path append: (BOOL)shouldAppend { return AUTORELEASE([[GSFileOutputStream alloc] initToFileAtPath: path append: shouldAppend]); } + (id) outputStreamToMemory { return AUTORELEASE([[GSDataOutputStream alloc] init]); } - (BOOL) hasSpaceAvailable { [self subclassResponsibility: _cmd]; return NO; } - (id) initToBuffer: (uint8_t *)buffer capacity: (NSUInteger)capacity { DESTROY(self); return [[GSBufferOutputStream alloc] initToBuffer: buffer capacity: capacity]; } - (id) initToFileAtPath: (NSString *)path append: (BOOL)shouldAppend { DESTROY(self); return [[GSFileOutputStream alloc] initToFileAtPath: path append: shouldAppend]; } - (id) initToMemory { DESTROY(self); return [[GSDataOutputStream alloc] init]; } - (NSInteger) write: (const uint8_t *)buffer maxLength: (NSUInteger)len { [self subclassResponsibility: _cmd]; return -1; } @end @implementation GSLocalServerStream - (Class) _inputStreamClass { return [GSLocalInputStream class]; } - (Class) _outputStreamClass { return [GSLocalOutputStream class]; } - (id) initToAddr: (NSString*)addr { if ((self = [super init]) != nil) { if ([self _setSocketAddress: addr port: 0 family: AF_UNIX] == NO) { DESTROY(self); } } return self; } @end gnustep-base-1.29.0/Source/win32-def.top000066400000000000000000000020351435650067400176740ustar00rootroot00000000000000; ; libgnustep-base.def ; ; Exports for libgnustep-base DLL ; Specific to WIN32 operating systems ; ; Copyright (C) 2000 Free Software Foundation, Inc. ; ; Author: Adam Fedor ; Date: Jun 2000 ; ; This file is part of the GNUstep Base Library. ; ; 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 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 ; Library General Public License for more details. ; ; You should have received a copy of the GNU Lesser General Public ; License along with this library; if not, write to the Free ; Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. ; LIBRARY libgnustep-base EXPORTS gnustep-base-1.29.0/Source/win32-load.h000066400000000000000000000052501435650067400175040ustar00rootroot00000000000000/* win32-load - Definitions and translations for dynamic loading with the windows. Copyright (C) 1998, Free Software Foundation This program 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 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef __win32_load_h_INCLUDE #define __win32_load_h_INCLUDE #include /* This is the GNU name for the CTOR list */ #define CTOR_LIST "" /* Types defined appropriately for the dynamic linker */ typedef HINSTANCE dl_handle_t; typedef void* dl_symbol_t; /* Do any initialization necessary. Return 0 on success (or if no initialization needed. */ static int __objc_dynamic_init(const unichar* exec_path) { return 0; } /* Link in the module given by the name 'module'. Return a handle which can be used to get information about the loded code. */ static dl_handle_t __objc_dynamic_link(const unichar* module, int mode, const unichar* debug_file) { return LoadLibraryExW(module, 0, 0); } /* Return the address of a symbol given by the name 'symbol' from the module * associated with 'handle' * This function is not always used, so we mark it as unused to avoid warnings. */ static dl_symbol_t __objc_dynamic_find_symbol(dl_handle_t handle, const char* symbol) __attribute__((unused)); static dl_symbol_t __objc_dynamic_find_symbol(dl_handle_t handle, const char* symbol) { return NULL; } /* remove the code from memory associated with the module 'handle' */ static int __objc_dynamic_unlink(dl_handle_t handle) { return 0; } static char * __objc_dynamic_get_symbol_path(dl_handle_t handle, dl_symbol_t symbol) { return NULL; } /* Print an error message (prefaced by 'error_string') relevant to the last error encountered */ static void __objc_dynamic_error(FILE *error_stream, const char *error_string) { fprintf(error_stream, "%s:%ld\n", error_string, (long)GetLastError()); } /* Debugging: define these if they are available */ static int __objc_dynamic_undefined_symbol_count(void) { return 0; } static char** __objc_dynamic_list_undefined_symbols(void) { return NULL; } #endif /* __sunos_load_h_INCLUDE */ gnustep-base-1.29.0/Source/win32/000077500000000000000000000000001435650067400164145ustar00rootroot00000000000000gnustep-base-1.29.0/Source/win32/GNUmakefile000066400000000000000000000025251435650067400204720ustar00rootroot00000000000000# # src makefile for the GNUstep Base Library # # Copyright (C) 1997 Free Software Foundation, Inc. # # Written by: Scott Christley # # This file is part of the GNUstep Base Library. # # 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 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 # Library General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free # Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. # PACKAGE_NAME = gnustep-base GNUSTEP_LOCAL_ADDITIONAL_MAKEFILES=../../base.make include $(GNUSTEP_MAKEFILES)/common.make include ../../config.mak SUBPROJECT_NAME = win32 win32_OBJC_FILES =\ GSFileHandle.m \ GSRunLoopCtxt.m \ NSMessagePort.m \ NSMessagePortNameServer.m \ NSStream.m \ NSUserDefaults.m \ -include Makefile.preamble include $(GNUSTEP_MAKEFILES)/subproject.make -include Makefile.postamble gnustep-base-1.29.0/Source/win32/GSFileHandle.m000066400000000000000000001677771435650067400210500ustar00rootroot00000000000000/** Implementation for GSFileHandle for GNUStep Copyright (C) 1997-2002 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 1997, 2002 This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #include "common.h" #define EXPOSE_NSFileHandle_IVARS 1 #define EXPOSE_GSFileHandle_IVARS 1 #import "Foundation/NSObject.h" #import "Foundation/NSData.h" #import "Foundation/NSArray.h" #import "Foundation/NSString.h" #import "Foundation/NSFileHandle.h" #import "../GSFileHandle.h" #import "Foundation/NSException.h" #import "Foundation/NSRunLoop.h" #import "Foundation/NSNotification.h" #import "Foundation/NSHost.h" #import "Foundation/NSByteOrder.h" #import "Foundation/NSProcessInfo.h" #import "Foundation/NSUserDefaults.h" #import "Foundation/NSDebug.h" #import "../Tools/gdomap.h" #import "../GSPrivate.h" #import "../GSNetwork.h" #if defined(HAVE_SYS_FCNTL_H) # include #elif defined(HAVE_FCNTL_H) # include #endif #if defined(HAVE_SYS_FILE_H) # include #endif #include #include #include #include // S_ISREG is not defined in Windows headers #if !defined(S_ISREG) && defined(S_IFMT) && defined(S_IFREG) #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) #endif #ifndef O_BINARY #ifdef _O_BINARY #define O_BINARY _O_BINARY #else #define O_BINARY 0 #endif #endif #ifndef INADDR_NONE #define INADDR_NONE -1 #endif // Maximum data in single I/O operation #define NETBUF_SIZE 4096 #define READ_SIZE NETBUF_SIZE*10 static GSFileHandle *fh_stdin = nil; static GSFileHandle *fh_stdout = nil; static GSFileHandle *fh_stderr = nil; // Key to info dictionary for operation mode. static NSString* NotificationKey = @"NSFileHandleNotificationKey"; @interface GSFileHandle(private) - (void) receivedEventRead; - (void) receivedEventWrite; @end @implementation GSFileHandle /** * Encapsulates low level read operation to get data from the operating * system. */ - (NSInteger) read: (void*)buf length: (NSUInteger)len { #if USE_ZLIB if (gzDescriptor != 0) { len = gzread(gzDescriptor, buf, len); } else #endif if (isSocket) { len = recv((SOCKET)_get_osfhandle(descriptor), buf, len, 0); } else { DWORD readBytes = -1; if (ReadFile((HANDLE)_get_osfhandle(descriptor), buf, len, &readBytes, NULL)) { return readBytes; } else { DWORD err = GetLastError(); if (err == ERROR_BROKEN_PIPE || err == ERROR_HANDLE_EOF) { return readBytes; } return -1; } } return len; } /** * Encapsulates low level write operation to send data to the operating * system. */ - (NSInteger) write: (const void*)buf length: (NSUInteger)len { int result; #if USE_ZLIB if (gzDescriptor != 0) { result = gzwrite(gzDescriptor, (char*)buf, len); } else #endif if (isSocket) { result = send((SOCKET)_get_osfhandle(descriptor), buf, len, 0); } else { result = write(descriptor, buf, len); } return result; } static BOOL getAddr(NSString* name, NSString* svc, NSString* pcl, struct sockaddr_in *sin) { const char *proto = "tcp"; struct servent *sp; if (pcl) { proto = [pcl lossyCString]; } memset(sin, '\0', sizeof(*sin)); sin->sin_family = AF_INET; /* * If we were given a hostname, we use any address for that host. * Otherwise we expect the given name to be an address unless it is * a null (any address). */ if (name) { NSHost* host = [NSHost hostWithName: name]; if (host != nil) { name = [host address]; } #ifndef HAVE_INET_ATON sin->sin_addr.s_addr = inet_addr([name lossyCString]); if (sin->sin_addr.s_addr == INADDR_NONE) #else if (inet_aton([name lossyCString], &sin->sin_addr) == 0) #endif { return NO; } } else { sin->sin_addr.s_addr = GSSwapHostI32ToBig(INADDR_ANY); } if (svc == nil) { sin->sin_port = 0; return YES; } else if ((sp = getservbyname([svc lossyCString], proto)) == 0) { const char* ptr = [svc lossyCString]; int val = atoi(ptr); while (isdigit(*ptr)) { ptr++; } if (*ptr == '\0' && val <= 0xffff) { uint16_t v = val; sin->sin_port = GSSwapHostI16ToBig(v); return YES; } else if (strcmp(ptr, "gdomap") == 0) { uint16_t v; #ifdef GDOMAP_PORT_OVERRIDE v = GDOMAP_PORT_OVERRIDE; #else v = 538; // IANA allocated port #endif sin->sin_port = GSSwapHostI16ToBig(v); return YES; } else { return NO; } } else { sin->sin_port = sp->s_port; return YES; } } + (id) allocWithZone: (NSZone*)z { return NSAllocateObject ([self class], 0, z); } - (void) dealloc { if (self == fh_stdin) { RETAIN(self); [NSException raise: NSGenericException format: @"Attempt to deallocate standard input handle"]; } if (self == fh_stdout) { RETAIN(self); [NSException raise: NSGenericException format: @"Attempt to deallocate standard output handle"]; } if (self == fh_stderr) { RETAIN(self); [NSException raise: NSGenericException format: @"Attempt to deallocate standard error handle"]; } RELEASE(address); RELEASE(service); RELEASE(protocol); [self finalize]; RELEASE(readInfo); RELEASE(writeInfo); [super dealloc]; } - (void) finalize { if (self == fh_stdin) fh_stdin = nil; if (self == fh_stdout) fh_stdout = nil; if (self == fh_stderr) fh_stderr = nil; [self ignoreReadDescriptor]; [self ignoreWriteDescriptor]; #if USE_ZLIB /* * The gzDescriptor should always be closed when we have done with it. */ if (gzDescriptor != 0) { gzclose(gzDescriptor); } #endif if (descriptor != -1) { [self setNonBlocking: wasNonBlocking]; if (closeOnDealloc == YES) { if (isSocket) { closesocket((SOCKET)_get_osfhandle(descriptor)); WSACloseEvent(event); event = WSA_INVALID_EVENT; } else { close(descriptor); } descriptor = -1; } } } // Initializing a GSFileHandle Object - (id) init { return [self initWithNullDevice]; } /** * Initialise as a client socket connection ... do this by using * [-initAsClientInBackgroundAtAddress:service:protocol:forModes:] * and running the current run loop in NSDefaultRunLoopMode until * the connection attempt succeeds, fails, or times out. */ - (id) initAsClientAtAddress: (NSString*)a service: (NSString*)s protocol: (NSString*)p { self = [self initAsClientInBackgroundAtAddress: a service: s protocol: p forModes: nil]; if (self != nil) { NSRunLoop *loop; NSDate *limit; loop = [NSRunLoop currentRunLoop]; limit = [NSDate dateWithTimeIntervalSinceNow: 300]; while ([limit timeIntervalSinceNow] > 0 && (readInfo != nil || [writeInfo count] > 0)) { [loop runMode: NSDefaultRunLoopMode beforeDate: limit]; } if (readInfo != nil || [writeInfo count] > 0 || readOK == NO) { /* Must have timed out or failed */ DESTROY(self); } else { [self setNonBlocking: NO]; } } return self; } /* * States for socks connection negotiation */ NSString * const GSSOCKSConnect = @"GSSOCKSConnect"; NSString * const GSSOCKSSendAuth = @"GSSOCKSSendAuth"; NSString * const GSSOCKSRecvAuth = @"GSSOCKSRecvAuth"; NSString * const GSSOCKSSendConn = @"GSSOCKSSendConn"; NSString * const GSSOCKSRecvConn = @"GSSOCKSRecvConn"; NSString * const GSSOCKSRecvAddr = @"GSSOCKSRecvAddr"; - (void) _socksHandler: (NSNotification*)aNotification { NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; NSString *name = [aNotification name]; NSDictionary *info = (NSMutableDictionary*)[aNotification userInfo]; NSArray *modes; NSString *error; NSMutableDictionary *i = nil; NSNotification *n = nil; NSDebugMLLog(@"NSFileHandle", @"%@ SOCKS connection: %@", self, aNotification); [nc removeObserver: self name: name object: self]; modes = (NSArray*)[info objectForKey: NSFileHandleNotificationMonitorModes]; error = [info objectForKey: GSFileHandleNotificationError]; if (error == nil) { if (name == GSSOCKSConnect) { NSData *item; /* * Send an authorisation record to the SOCKS server. */ i = [info mutableCopy]; /* * Authorisation record is at least three bytes - * socks version (5) * authorisation method bytes to follow (1) * say we do no authorisation (0) */ item = [[NSData alloc] initWithBytes: "\5\1\0" length: 3]; [i setObject: item forKey: NSFileHandleNotificationDataItem]; RELEASE(item); [i setObject: GSSOCKSSendAuth forKey: NotificationKey]; [writeInfo addObject: i]; RELEASE(i); [nc addObserver: self selector: @selector(_socksHandler:) name: GSSOCKSSendAuth object: self]; [self watchWriteDescriptor]; } else if (name == GSSOCKSSendAuth) { NSMutableData *item; /* * We have written the authorisation record, so we * request a response from the SOCKS server. */ readMax = 2; readInfo = [info mutableCopy]; [readInfo setObject: GSSOCKSRecvAuth forKey: NotificationKey]; item = [[NSMutableData alloc] initWithCapacity: 0]; [readInfo setObject: item forKey: NSFileHandleNotificationDataItem]; RELEASE(item); [nc addObserver: self selector: @selector(_socksHandler:) name: GSSOCKSRecvAuth object: self]; [self watchReadDescriptorForModes: modes]; } else if (name == GSSOCKSRecvAuth) { NSData *response; const unsigned char *bytes; response = [info objectForKey: NSFileHandleNotificationDataItem]; bytes = (const unsigned char*)[response bytes]; if ([response length] != 2) { error = @"authorisation response from SOCKS was not two bytes"; } else if (bytes[0] != 5) { error = @"authorisation response from SOCKS had wrong version"; } else if (bytes[1] != 0) { error = @"authorisation response from SOCKS had wrong method"; } else { NSData *item; char buf[10]; const char *ptr; int p; /* * Send the address information to the SOCKS server. */ i = [info mutableCopy]; /* * Connect command is ten bytes - * socks version * connect command * reserved byte * address type * address 4 bytes (big endian) * port 2 bytes (big endian) */ buf[0] = 5; // Socks version number buf[1] = 1; // Connect command buf[2] = 0; // Reserved buf[3] = 1; // Address type (IPV4) ptr = [address lossyCString]; buf[4] = atoi(ptr); while (isdigit(*ptr)) ptr++; ptr++; buf[5] = atoi(ptr); while (isdigit(*ptr)) ptr++; ptr++; buf[6] = atoi(ptr); while (isdigit(*ptr)) ptr++; ptr++; buf[7] = atoi(ptr); p = [service intValue]; buf[8] = ((p & 0xff00) >> 8); buf[9] = (p & 0xff); item = [[NSData alloc] initWithBytes: buf length: 10]; [i setObject: item forKey: NSFileHandleNotificationDataItem]; RELEASE(item); [i setObject: GSSOCKSSendConn forKey: NotificationKey]; [writeInfo addObject: i]; RELEASE(i); [nc addObserver: self selector: @selector(_socksHandler:) name: GSSOCKSSendConn object: self]; [self watchWriteDescriptor]; } } else if (name == GSSOCKSSendConn) { NSMutableData *item; /* * We have written the connect command, so we * request a response from the SOCKS server. */ readMax = 4; readInfo = [info mutableCopy]; [readInfo setObject: GSSOCKSRecvConn forKey: NotificationKey]; item = [[NSMutableData alloc] initWithCapacity: 0]; [readInfo setObject: item forKey: NSFileHandleNotificationDataItem]; RELEASE(item); [nc addObserver: self selector: @selector(_socksHandler:) name: GSSOCKSRecvConn object: self]; [self watchReadDescriptorForModes: modes]; } else if (name == GSSOCKSRecvConn) { NSData *response; const unsigned char *bytes; unsigned len = 0; response = [info objectForKey: NSFileHandleNotificationDataItem]; bytes = (const unsigned char*)[response bytes]; if ([response length] != 4) { error = @"connect response from SOCKS had bad length"; } else if (bytes[0] != 5) { error = @"connect response from SOCKS had wrong version"; } else if (bytes[1] != 0) { switch (bytes[1]) { case 1: error = @"SOCKS server general failure"; break; case 2: error = @"SOCKS server says permission denied"; break; case 3: error = @"SOCKS server says network unreachable"; break; case 4: error = @"SOCKS server says host unreachable"; break; case 5: error = @"SOCKS server says connection refused"; break; case 6: error = @"SOCKS server says connection timed out"; break; case 7: error = @"SOCKS server says command not supported"; break; case 8: error = @"SOCKS server says address type not supported"; break; default: error = @"connect response from SOCKS was failure"; break; } } else if (bytes[3] == 1) { len = 4; // Fixed size (IPV4) address } else if (bytes[3] == 3) { len = 1 + bytes[4]; // Domain name with leading length } else if (bytes[3] == 4) { len = 16; // Fixed size (IPV6) address } else { error = @"SOCKS server returned unknown address type"; } if (error == nil) { NSMutableData *item; /* * We have received a success, so we must now consume the * address and port information the SOCKS server sends. */ readMax = len + 2; readInfo = [info mutableCopy]; [readInfo setObject: GSSOCKSRecvAddr forKey: NotificationKey]; item = [[NSMutableData alloc] initWithCapacity: 0]; [readInfo setObject: item forKey: NSFileHandleNotificationDataItem]; RELEASE(item); [nc addObserver: self selector: @selector(_socksHandler:) name: GSSOCKSRecvAddr object: self]; [self watchReadDescriptorForModes: modes]; } } else if (name == GSSOCKSRecvAddr) { /* * Success ... We read the address from the socks server so * the connection is now ready to go. */ name = GSFileHandleConnectCompletionNotification; i = [info mutableCopy]; [i setObject: name forKey: NotificationKey]; n = [NSNotification notificationWithName: name object: self userInfo: i]; RELEASE(i); } else { /* * Argh ... unexpected notification. */ error = @"unexpected notification during SOCKS connection"; } } /* * If 'error' is non-null, we set up a notification to tell people * the connection failed. */ if (error != nil) { NSDebugMLLog(@"NSFileHandle", @"%@ SOCKS error: %@", self, error); /* * An error in the initial connection ... notify observers * by re-posting the notification with a new name. */ name = GSFileHandleConnectCompletionNotification; i = [info mutableCopy]; [i setObject: name forKey: NotificationKey]; [i setObject: error forKey: GSFileHandleNotificationError]; n = [NSNotification notificationWithName: name object: self userInfo: i]; RELEASE(i); } /* * If a notification has been set up, we post it as the last thing we do. */ if (n != nil) { NSNotificationCenter *q; q = [NSNotificationCenter defaultCenter]; [q postNotification: n]; } } - (id) initAsClientInBackgroundAtAddress: (NSString*)a service: (NSString*)s protocol: (NSString*)p forModes: (NSArray*)modes { static NSString *esocks = nil; static NSString *dsocks = nil; static BOOL beenHere = NO; SOCKET net; struct sockaddr_in sin; struct sockaddr_in lsin; NSString *lhost = nil; NSString *shost = nil; NSString *sport = nil; int status; if (beenHere == NO) { NSUserDefaults *defs; beenHere = YES; defs = [NSUserDefaults standardUserDefaults]; dsocks = [[defs stringForKey: @"GSSOCKS"] copy]; if (dsocks == nil) { NSDictionary *env; env = [[NSProcessInfo processInfo] environment]; esocks = [env objectForKey: @"SOCKS5_SERVER"]; if (esocks == nil) { esocks = [env objectForKey: @"SOCKS_SERVER"]; } esocks = [esocks copy]; } } if (a == nil || [a isEqualToString: @""]) { a = @"localhost"; } if (s == nil) { NSLog(@"bad argument - service is nil"); DESTROY(self); return nil; } if ([p hasPrefix: @"bind-"] == YES) { NSRange r; lhost = [p substringFromIndex: 5]; r = [lhost rangeOfString: @":"]; if (r.length > 0) { p = [lhost substringFromIndex: NSMaxRange(r)]; lhost = [lhost substringToIndex: r.location]; } else { p = nil; } if (getAddr(lhost, p, @"tcp", &lsin) == NO) { NSLog(@"bad bind address specification"); DESTROY(self); return nil; } p = @"tcp"; } /** * A protocol fo the form 'socks-...' controls socks operation, * overriding defaults and environment variables.
* If it is just 'socks-' it turns off socks for this fiel handle.
* Otherwise, the following text must be the name of the socks server * (optionally followed by :port). */ if ([p hasPrefix: @"socks-"] == YES) { shost = [p substringFromIndex: 6]; p = @"tcp"; } else if (dsocks != nil) { shost = dsocks; // GSSOCKS user default } else { shost = esocks; // SOCKS_SERVER environment variable. } if (shost != nil && [shost length] > 0) { NSRange r; r = [shost rangeOfString: @":"]; if (r.length > 0) { sport = [shost substringFromIndex: NSMaxRange(r)]; shost = [shost substringToIndex: r.location]; } else { sport = @"1080"; } p = @"tcp"; } if (getAddr(a, s, p, &sin) == NO) { DESTROY(self); NSLog(@"bad address-service-protocol combination"); return nil; } // Store the address of the remote end. [self setAddr: (struct sockaddr *)&sin]; /* * Don't use SOCKS if we are contacting the local host. */ if (shost != nil) { NSHost *remote = [NSHost hostWithAddress: [self socketAddress]]; NSHost *local = [NSHost currentHost]; if ([remote isEqual: local] || [remote isEqual: [NSHost localHost]]) { shost = nil; } } if (shost != nil) { if (getAddr(shost, sport, p, &sin) == NO) { NSLog(@"bad SOCKS host-port combination"); DESTROY(self); return nil; } } if ((net = socket(AF_INET, SOCK_STREAM, PF_UNSPEC)) == INVALID_SOCKET) { NSLog(@"unable to create socket - %@", [NSError _last]); DESTROY(self); return nil; } /* * Enable tcp-level tracking of whether connection is alive. */ status = 1; setsockopt(net, SOL_SOCKET, SO_KEEPALIVE, (char *)&status, sizeof(status)); if (lhost != nil) { if (bind(net, (struct sockaddr *)&lsin, sizeof(lsin)) == SOCKET_ERROR) { NSLog(@"unable to bind to port %s:%d - %@", inet_ntoa(lsin.sin_addr), GSSwapBigI16ToHost(sin.sin_port), [NSError _last]); (void) closesocket(net); DESTROY(self); return nil; } } self = [self initWithNativeHandle: (void*)net closeOnDealloc: YES]; if (self) { NSMutableDictionary* info; isSocket = YES; [self setNonBlocking: YES]; if (connect(net, (struct sockaddr*)&sin, sizeof(sin)) == SOCKET_ERROR) { if (WSAGetLastError() != WSAEWOULDBLOCK) { NSLog(@"unable to make connection to %s:%d - %@", inet_ntoa(sin.sin_addr), GSSwapBigI16ToHost(sin.sin_port), [NSError _last]); DESTROY(self); return nil; } } info = [[NSMutableDictionary alloc] initWithCapacity: 4]; [info setObject: address forKey: NSFileHandleNotificationDataItem]; if (shost == nil) { [info setObject: GSFileHandleConnectCompletionNotification forKey: NotificationKey]; } else { NSNotificationCenter *nc; /* * If we are making a socks connection, register self as an * observer of notifications and ensure we will manage this. */ nc = [NSNotificationCenter defaultCenter]; [nc addObserver: self selector: @selector(_socksHandler:) name: GSSOCKSConnect object: self]; [info setObject: GSSOCKSConnect forKey: NotificationKey]; } if (modes) { [info setObject: modes forKey: NSFileHandleNotificationMonitorModes]; } [writeInfo addObject: info]; RELEASE(info); connectOK = YES; acceptOK = NO; readOK = NO; writeOK = NO; [self watchWriteDescriptor]; } return self; } - (id) initAsServerAtAddress: (NSString*)a service: (NSString*)s protocol: (NSString*)p { #ifndef BROKEN_SO_REUSEADDR int status = 1; #endif SOCKET net; struct sockaddr_in sin; int size = sizeof(sin); if (getAddr(a, s, p, &sin) == NO) { DESTROY(self); NSLog(@"bad address-service-protocol combination"); return nil; } if ((net = socket(AF_INET, SOCK_STREAM, PF_UNSPEC)) == INVALID_SOCKET) { NSLog(@"unable to create socket - %@", [NSError _last]); DESTROY(self); return nil; } #ifndef BROKEN_SO_REUSEADDR /* * Under decent systems, SO_REUSEADDR means that the port can be reused * immediately that this process exits. Under some it means * that multiple processes can serve the same port simultaneously. * We don't want that broken behavior! */ setsockopt(net, SOL_SOCKET, SO_REUSEADDR, (char *)&status, sizeof(status)); #endif if (bind(net, (struct sockaddr *)&sin, sizeof(sin)) == SOCKET_ERROR) { NSLog(@"unable to bind to port %s:%d - %@", inet_ntoa(sin.sin_addr), GSSwapBigI16ToHost(sin.sin_port), [NSError _last]); (void) closesocket(net); DESTROY(self); return nil; } if (listen(net, GSBACKLOG) == SOCKET_ERROR) { NSLog(@"unable to listen on port - %@", [NSError _last]); (void) closesocket(net); DESTROY(self); return nil; } if (getsockname(net, (struct sockaddr*)&sin, &size) == SOCKET_ERROR) { NSLog(@"unable to get socket name - %@", [NSError _last]); (void) closesocket(net); DESTROY(self); return nil; } self = [self initWithNativeHandle: (void*)net closeOnDealloc: YES]; if (self) { isSocket = YES; connectOK = NO; acceptOK = YES; readOK = NO; writeOK = NO; [self setAddr: (struct sockaddr *)&sin]; } return self; } - (id) initForReadingAtPath: (NSString*)path { int d = _wopen( (const GSNativeChar*)[path cStringUsingEncoding: NSUnicodeStringEncoding], O_RDONLY|O_BINARY); if (d < 0) { DESTROY(self); return nil; } else { self = [self initWithFileDescriptor: d closeOnDealloc: YES]; if (self) { connectOK = NO; acceptOK = NO; writeOK = NO; } return self; } } - (id) initForWritingAtPath: (NSString*)path { int d = _wopen( (const GSNativeChar*)[path cStringUsingEncoding: NSUnicodeStringEncoding], O_WRONLY|O_BINARY); if (d < 0) { DESTROY(self); return nil; } else { self = [self initWithFileDescriptor: d closeOnDealloc: YES]; if (self) { connectOK = NO; acceptOK = NO; readOK = NO; } return self; } } - (id) initForUpdatingAtPath: (NSString*)path { int d = _wopen( (const GSNativeChar*)[path cStringUsingEncoding: NSUnicodeStringEncoding], O_RDWR|O_BINARY); if (d < 0) { DESTROY(self); return nil; } else { self = [self initWithFileDescriptor: d closeOnDealloc: YES]; if (self != nil) { connectOK = NO; acceptOK = NO; } return self; } } - (id) initWithStandardError { if (fh_stderr != nil) { ASSIGN(self, fh_stderr); } else { self = [self initWithFileDescriptor: 2 closeOnDealloc: NO]; ASSIGN(fh_stderr, self); if (self) { readOK = NO; isStandardStream = YES; } } return self; } - (id) initWithStandardInput { if (fh_stdin != nil) { ASSIGN(self, fh_stdin); } else { self = [self initWithFileDescriptor: 0 closeOnDealloc: NO]; ASSIGN(fh_stdin, self); if (self) { writeOK = NO; isStandardStream = YES; isStandardInput = YES; } } return self; } - (id) initWithStandardOutput { if (fh_stdout != nil) { ASSIGN(self, fh_stdout); } else { self = [self initWithFileDescriptor: 1 closeOnDealloc: NO]; ASSIGN(fh_stdout, self); if (self) { readOK = NO; isStandardStream = YES; } } return self; } - (id) initWithNullDevice { int d = _open("NUL", O_RDWR|O_BINARY); if (d < 0) { DESTROY(self); return nil; } else { self = [self initWithFileDescriptor: d closeOnDealloc: YES]; if (self != nil) { connectOK = NO; acceptOK = NO; isNullDevice = YES; isStandardFile = YES; } return self; } } - (id) initWithFileDescriptor: (int)desc closeOnDealloc: (BOOL)flag { self = [super init]; if (self != nil) { struct _stat sbuf; HANDLE h = (HANDLE)_get_osfhandle(desc); if (_fstat(desc, &sbuf) != 0) { NSLog(@"unable to get status of descriptor %d - %@", desc, [NSError _last]); } else { if (S_ISREG(sbuf.st_mode)) { isStandardFile = YES; } else { isStandardFile = NO; } } if (isStandardFile == NO) { if (GetFileType(h) == FILE_TYPE_PIPE) { // If we can't get named pipe info, we assume this is a socket. if (GetNamedPipeInfo(h, 0, 0, 0, 0) == 0) { isSocket = YES; } } } isNonBlocking = 0; descriptor = desc; closeOnDealloc = flag; readInfo = nil; writeInfo = [NSMutableArray new]; readMax = 0; writePos = 0; readOK = YES; writeOK = YES; acceptOK = YES; connectOK = YES; if (isSocket) { event = CreateEvent(NULL, NO, NO, NULL); if (event == WSA_INVALID_EVENT) { NSLog(@"Invalid Event - '%d'", WSAGetLastError()); return nil; } WSAEventSelect((SOCKET)h, event, FD_ALL_EVENTS); } else { event = WSA_INVALID_EVENT; } } return self; } - (id) initWithNativeHandle: (void*)hdl { return [self initWithFileDescriptor: _open_osfhandle((SOCKET)hdl, 0) closeOnDealloc: NO]; } - (id) initWithNativeHandle: (void*)hdl closeOnDealloc: (BOOL)flag { return [self initWithFileDescriptor: _open_osfhandle((SOCKET)hdl, 0) closeOnDealloc: flag]; } - (void) checkAccept { if (acceptOK == NO) { [NSException raise: NSFileHandleOperationException format: @"accept not permitted in this file handle"]; } if (readInfo) { id operation = [readInfo objectForKey: NotificationKey]; if (operation == NSFileHandleConnectionAcceptedNotification) { [NSException raise: NSFileHandleOperationException format: @"accept already in progress"]; } else { [NSException raise: NSFileHandleOperationException format: @"read already in progress"]; } } } - (void) checkConnect { if (connectOK == NO) { [NSException raise: NSFileHandleOperationException format: @"connect not permitted in this file handle"]; } if ([writeInfo count] > 0) { NSDictionary *info = [writeInfo objectAtIndex: 0]; id operation = [info objectForKey: NotificationKey]; if (operation == GSFileHandleConnectCompletionNotification) { [NSException raise: NSFileHandleOperationException format: @"connect already in progress"]; } else { [NSException raise: NSFileHandleOperationException format: @"write already in progress"]; } } } - (void) checkRead { if (readOK == NO) { [NSException raise: NSFileHandleOperationException format: @"read not permitted on this file handle"]; } if (readInfo) { [self receivedEventRead]; } } - (void) checkWrite { if (writeOK == NO) { [NSException raise: NSFileHandleOperationException format: @"write not permitted in this file handle"]; } if ([writeInfo count] > 0) { NSDictionary *info = [writeInfo objectAtIndex: 0]; id operation = [info objectForKey: NotificationKey]; if (operation != GSFileHandleWriteCompletionNotification) { [NSException raise: NSFileHandleOperationException format: @"connect in progress"]; } } } // Returning file handles - (int) fileDescriptor { return descriptor; } - (void*) nativeHandle { return (void*)(SOCKET)_get_osfhandle(descriptor); } // Synchronous I/O operations - (NSData*) availableData { char buf[READ_SIZE]; NSMutableData* d; int len; [self checkRead]; d = [NSMutableData dataWithCapacity: 0]; if (isStandardFile) { if (isNonBlocking == YES) { [self setNonBlocking: NO]; } while ((len = [self read: buf length: sizeof(buf)]) > 0) { [d appendBytes: buf length: len]; } } else { if (isNonBlocking == NO) { [self setNonBlocking: YES]; } len = [self read: buf length: sizeof(buf)]; if (len <= 0) { if (WSAGetLastError()== WSAEINTR || WSAGetLastError()== WSAEWOULDBLOCK) { /* * Read would have blocked ... so try to get a single character * in non-blocking mode (to ensure we wait until data arrives) * and then try again. * This ensures that we block for *some* data as we should. */ [self setNonBlocking: NO]; len = [self read: buf length: 1]; [self setNonBlocking: YES]; if (len == 1) { len = [self read: &buf[1] length: sizeof(buf) - 1]; if (len <= 0) { len = 1; } else { len = len + 1; } } } } if (len > 0) { [d appendBytes: buf length: len]; } } if (len < 0) { [NSException raise: NSFileHandleOperationException format: @"unable to read from descriptor - %@", [NSError _last]]; } return d; } - (NSData*) readDataToEndOfFile { char buf[READ_SIZE]; NSMutableData* d; int len; [self checkRead]; if (isNonBlocking == YES) { [self setNonBlocking: NO]; } d = [NSMutableData dataWithCapacity: 0]; while ((len = [self read: buf length: sizeof(buf)]) > 0) { [d appendBytes: buf length: len]; } if (len < 0) { [NSException raise: NSFileHandleOperationException format: @"unable to read from descriptor - %@", [NSError _last]]; } return d; } - (NSData*) readDataOfLength: (unsigned)len { NSMutableData *d; int got; [self checkRead]; if (isNonBlocking == YES) { [self setNonBlocking: NO]; } if (len <= 65536) { char *buf; buf = NSZoneMalloc(NSDefaultMallocZone(), len); d = [NSMutableData dataWithBytesNoCopy: buf length: len]; got = [self read: [d mutableBytes] length: len]; if (got < 0) { [NSException raise: NSFileHandleOperationException format: @"unable to read from descriptor - %@", [NSError _last]]; } [d setLength: got]; } else { char buf[READ_SIZE]; d = [NSMutableData dataWithCapacity: 0]; do { int chunk = len > sizeof(buf) ? sizeof(buf) : len; got = [self read: buf length: chunk]; if (got > 0) { [d appendBytes: buf length: got]; len -= got; } else if (got < 0) { [NSException raise: NSFileHandleOperationException format: @"unable to read from descriptor - %@", [NSError _last]]; } } while (len > 0 && got > 0); } return d; } - (void) writeData: (NSData*)item { int rval = 0; const void* ptr = [item bytes]; unsigned int len = [item length]; unsigned int pos = 0; [self checkWrite]; if (isNonBlocking == YES) { [self setNonBlocking: NO]; } while (pos < len) { int toWrite = len - pos; if (toWrite > NETBUF_SIZE) { toWrite = NETBUF_SIZE; } rval = [self write: (char*)ptr+pos length: toWrite]; if (rval < 0) { if (WSAGetLastError()== WSAEINTR || WSAGetLastError()== WSAEWOULDBLOCK) { rval = 0; } else { break; } } pos += rval; } if (rval < 0) { [NSException raise: NSFileHandleOperationException format: @"unable to write to descriptor - %@", [NSError _last]]; } } // Asynchronous I/O operations - (void) acceptConnectionInBackgroundAndNotifyForModes: (NSArray*)modes { [self checkAccept]; readMax = 0; RELEASE(readInfo); readInfo = [[NSMutableDictionary alloc] initWithCapacity: 4]; [readInfo setObject: NSFileHandleConnectionAcceptedNotification forKey: NotificationKey]; [self watchReadDescriptorForModes: modes]; } - (void) readDataInBackgroundAndNotifyLength: (unsigned)len forModes: (NSArray*)modes { NSMutableData *d; [self checkRead]; if (len > 0x7fffffff) { [NSException raise: NSInvalidArgumentException format: @"length (%u) too large", len]; } readMax = len; RELEASE(readInfo); readInfo = [[NSMutableDictionary alloc] initWithCapacity: 4]; [readInfo setObject: NSFileHandleReadCompletionNotification forKey: NotificationKey]; d = [[NSMutableData alloc] initWithCapacity: readMax]; [readInfo setObject: d forKey: NSFileHandleNotificationDataItem]; RELEASE(d); [self watchReadDescriptorForModes: modes]; } - (void) readInBackgroundAndNotifyForModes: (NSArray*)modes { NSMutableData *d; [self checkRead]; readMax = -1; // Accept any quantity of data. RELEASE(readInfo); readInfo = [[NSMutableDictionary alloc] initWithCapacity: 4]; [readInfo setObject: NSFileHandleReadCompletionNotification forKey: NotificationKey]; d = [[NSMutableData alloc] initWithCapacity: 0]; [readInfo setObject: d forKey: NSFileHandleNotificationDataItem]; RELEASE(d); [self watchReadDescriptorForModes: modes]; } - (void) readToEndOfFileInBackgroundAndNotifyForModes: (NSArray*)modes { NSMutableData *d; [self checkRead]; readMax = 0; RELEASE(readInfo); readInfo = [[NSMutableDictionary alloc] initWithCapacity: 4]; [readInfo setObject: NSFileHandleReadToEndOfFileCompletionNotification forKey: NotificationKey]; d = [[NSMutableData alloc] initWithCapacity: 0]; [readInfo setObject: d forKey: NSFileHandleNotificationDataItem]; RELEASE(d); [self watchReadDescriptorForModes: modes]; } - (void) waitForDataInBackgroundAndNotifyForModes: (NSArray*)modes { [self checkRead]; readMax = 0; RELEASE(readInfo); readInfo = [[NSMutableDictionary alloc] initWithCapacity: 4]; [readInfo setObject: NSFileHandleDataAvailableNotification forKey: NotificationKey]; [readInfo setObject: [NSMutableData dataWithCapacity: 0] forKey: NSFileHandleNotificationDataItem]; [self watchReadDescriptorForModes: modes]; } // Seeking within a file - (unsigned long long) offsetInFile { off_t result = -1; if (isStandardFile && descriptor >= 0) { #if USE_ZLIB if (gzDescriptor != 0) { result = gzseek(gzDescriptor, 0, SEEK_CUR); } else #endif result = _lseek(descriptor, 0, SEEK_CUR); } if (result < 0) { [NSException raise: NSFileHandleOperationException format: @"failed to move to offset in file - %@", [NSError _last]]; } return (unsigned long long)result; } - (unsigned long long) seekToEndOfFile { off_t result = -1; if (isStandardFile && descriptor >= 0) { #if USE_ZLIB if (gzDescriptor != 0) { result = gzseek(gzDescriptor, 0, SEEK_END); } else #endif result = _lseek(descriptor, 0, SEEK_END); } if (result < 0) { [NSException raise: NSFileHandleOperationException format: @"failed to move to offset in file - %@", [NSError _last]]; } return (unsigned long long)result; } - (void) seekToFileOffset: (unsigned long long)pos { off_t result = -1; if (isStandardFile && descriptor >= 0) { #if USE_ZLIB if (gzDescriptor != 0) { result = gzseek(gzDescriptor, (off_t)pos, SEEK_SET); } else #endif result = _lseek(descriptor, (off_t)pos, SEEK_SET); } if (result < 0) { [NSException raise: NSFileHandleOperationException format: @"failed to move to offset in file - %@", [NSError _last]]; } } // Operations on file - (void) closeFile { if (descriptor < 0) { [NSException raise: NSFileHandleOperationException format: @"attempt to close closed file"]; } [self ignoreReadDescriptor]; [self ignoreWriteDescriptor]; [self setNonBlocking: wasNonBlocking]; #if USE_ZLIB if (gzDescriptor != 0) { gzclose(gzDescriptor); gzDescriptor = 0; } #endif if (isSocket) { (void)closesocket((SOCKET)_get_osfhandle(descriptor)); WSACloseEvent(event); event = WSA_INVALID_EVENT; } (void)close(descriptor); descriptor = -1; acceptOK = NO; connectOK = NO; readOK = NO; writeOK = NO; /* * Clear any pending operations on the file handle, sending * notifications if necessary. */ if (readInfo) { [readInfo setObject: @"File handle closed locally" forKey: GSFileHandleNotificationError]; [self postReadNotification]; } if ([writeInfo count]) { NSMutableDictionary *info = [writeInfo objectAtIndex: 0]; [info setObject: @"File handle closed locally" forKey: GSFileHandleNotificationError]; [self postWriteNotification]; [writeInfo removeAllObjects]; } } - (void) synchronizeFile { if (isStandardFile) { (void)_commit(descriptor); } } - (void) truncateFileAtOffset: (unsigned long long)pos { _chsize(descriptor, pos); [self seekToFileOffset: pos]; } - (void) writeInBackgroundAndNotify: (NSData*)item forModes: (NSArray*)modes { NSMutableDictionary *info; BOOL writeWasInProgress; [self checkWrite]; info = [[NSMutableDictionary alloc] initWithCapacity: 4]; [info setObject: item forKey: NSFileHandleNotificationDataItem]; [info setObject: GSFileHandleWriteCompletionNotification forKey: NotificationKey]; if (modes != nil) { [info setObject: modes forKey: NSFileHandleNotificationMonitorModes]; } writeWasInProgress = [writeInfo count] == 0 ? NO : YES; [writeInfo addObject: info]; RELEASE(info); /* On mswindows we receive a write trigger only when a write actually * completes, so if there is no write in progress, we trigger one. * Watching the descriptor too ensures that if a write can't complete * immediately, we will try to complete it when space becomes available. */ [self watchWriteDescriptor]; if (NO == writeWasInProgress) { [self receivedEventWrite]; } } - (void) writeInBackgroundAndNotify: (NSData*)item; { [self writeInBackgroundAndNotify: item forModes: nil]; } - (void) postReadNotification { NSMutableDictionary *info = readInfo; NSNotification *n; NSNotificationCenter *q; NSString *name; [self ignoreReadDescriptor]; readInfo = nil; readMax = 0; name = (NSString*)[info objectForKey: NotificationKey]; if (name == nil) { return; } n = [NSNotification notificationWithName: name object: self userInfo: info]; RELEASE(info); /* Retained by the notification. */ q = [NSNotificationCenter defaultCenter]; [q postNotification: n]; } - (void) postWriteNotification { NSMutableDictionary *info = [writeInfo objectAtIndex: 0]; NSNotificationCenter *q; NSNotification *n; NSString *name; [self ignoreWriteDescriptor]; name = (NSString*)[info objectForKey: NotificationKey]; n = [NSNotification notificationWithName: name object: self userInfo: info]; writePos = 0; [writeInfo removeObjectAtIndex: 0]; /* Retained by notification. */ q = [NSNotificationCenter defaultCenter]; [q postNotification: n]; if ((writeOK || connectOK) && [writeInfo count] > 0) { [self watchWriteDescriptor]; /* In case of queued writes. */ } } - (BOOL) readInProgress { if (readInfo) { return YES; } return NO; } - (BOOL) writeInProgress { if ([writeInfo count] > 0) { return YES; } return NO; } - (void) ignoreReadDescriptor { NSRunLoop *l; NSArray *modes; void *e; int t; if (descriptor < 0) { return; } l = [NSRunLoop currentRunLoop]; modes = nil; if (readInfo) { modes = (NSArray*)[readInfo objectForKey: NSFileHandleNotificationMonitorModes]; } if (event == WSA_INVALID_EVENT) { e = (void*)(uintptr_t)descriptor; t = ET_TRIGGER; NSDebugMLLog(@"NSFileHandle", @"Ignore read trigger for %p in %@", self, modes); } else { e = (void*)(uintptr_t)event; t = ET_HANDLE; NSDebugMLLog(@"NSFileHandle", @"Ignore read handle for %p in %@", self, modes); } if (modes && [modes count]) { unsigned int i; for (i = 0; i < [modes count]; i++) { [l removeEvent: e type: t forMode: [modes objectAtIndex: i] all: YES]; } } else { [l removeEvent: e type: t forMode: NSDefaultRunLoopMode all: YES]; } } - (void) ignoreWriteDescriptor { NSRunLoop *l; NSArray *modes; void *e; int t; if (descriptor < 0) { return; } l = [NSRunLoop currentRunLoop]; modes = nil; if ([writeInfo count] > 0) { NSMutableDictionary* info = [writeInfo objectAtIndex: 0]; modes=(NSArray*)[info objectForKey: NSFileHandleNotificationMonitorModes]; } if (event == WSA_INVALID_EVENT) { e = (void*)(uintptr_t)descriptor; t = ET_TRIGGER; NSDebugMLLog(@"NSFileHandle", @"Ignore write trigger for %p in %@", self, modes); } else { e = (void*)(uintptr_t)event; t = ET_HANDLE; NSDebugMLLog(@"NSFileHandle", @"Ignore write trigger for %p in %@", self, modes); } if (modes && [modes count]) { unsigned int i; for (i = 0; i < [modes count]; i++) { [l removeEvent: e type: t forMode: [modes objectAtIndex: i] all: YES]; } } else { [l removeEvent: e type: t forMode: NSDefaultRunLoopMode all: YES]; } } - (void) watchReadDescriptorForModes: (NSArray*)modes; { NSRunLoop *l; void *e; int t; if (descriptor < 0) { return; } l = [NSRunLoop currentRunLoop]; [self setNonBlocking: YES]; if (event == WSA_INVALID_EVENT) { e = (void*)(uintptr_t)descriptor; t = ET_TRIGGER; NSDebugMLLog(@"NSFileHandle", @"Watch read trigger for %p in %@", self, modes); } else { e = (void*)(uintptr_t)event; t = ET_HANDLE; NSDebugMLLog(@"NSFileHandle", @"Watch read handle for %p in %@", self, modes); } if (modes && [modes count]) { unsigned int i; for (i = 0; i < [modes count]; i++) { [l addEvent: e type: t watcher: self forMode: [modes objectAtIndex: i]]; } [readInfo setObject: modes forKey: NSFileHandleNotificationMonitorModes]; } else { [l addEvent: e type: t watcher: self forMode: NSDefaultRunLoopMode]; } } - (void) watchWriteDescriptor { if (descriptor < 0) { return; } if ([writeInfo count] > 0) { NSMutableDictionary *info = [writeInfo objectAtIndex: 0]; NSRunLoop *l = [NSRunLoop currentRunLoop]; NSArray *modes = nil; void *e; int t; modes = [info objectForKey: NSFileHandleNotificationMonitorModes]; [self setNonBlocking: YES]; if (event == WSA_INVALID_EVENT) { e = (void*)(uintptr_t)descriptor; t = ET_TRIGGER; NSDebugMLLog(@"NSFileHandle", @"Watch write trigger for %p in %@", self, modes); } else { e = (void*)(uintptr_t)event; t = ET_HANDLE; NSDebugMLLog(@"NSFileHandle", @"Watch write handle for %p in %@", self, modes); } if (modes && [modes count]) { unsigned int i; for (i = 0; i < [modes count]; i++) { [l addEvent: e type: t watcher: self forMode: [modes objectAtIndex: i]]; } } else { [l addEvent: e type: t watcher: self forMode: NSDefaultRunLoopMode]; } } else { NSDebugMLLog(@"NSFileHandle", @"Watch write no data for %p", self); } } - (void) receivedEventRead { NSString *operation; operation = [readInfo objectForKey: NotificationKey]; if (operation == NSFileHandleConnectionAcceptedNotification) { struct sockaddr_in buf; SOCKET desc; int blen = sizeof(buf); desc = accept((SOCKET)_get_osfhandle(descriptor), (struct sockaddr*)&buf, &blen); if (desc == INVALID_SOCKET) { NSString *s; s = [NSString stringWithFormat: @"Accept attempt failed - %@", [NSError _last]]; [readInfo setObject: s forKey: GSFileHandleNotificationError]; } else { // Accept attempt completed. GSFileHandle *h; struct sockaddr_in sin; int size = sizeof(sin); int status; /* * Enable tcp-level tracking of whether connection is alive. */ status = 1; setsockopt(desc, SOL_SOCKET, SO_KEEPALIVE, (char *)&status, sizeof(status)); h = [[[self class] alloc] initWithNativeHandle: (void*)desc closeOnDealloc: YES]; h->isSocket = YES; getpeername(desc, (struct sockaddr*)&sin, &size); [h setAddr: (struct sockaddr *)&sin]; [readInfo setObject: h forKey: NSFileHandleNotificationFileHandleItem]; RELEASE(h); } [self postReadNotification]; } else { HANDLE h; h = (HANDLE)_get_osfhandle(descriptor); /* Overlapped (asynchronous) I/O on a standard stream requires * a different interface to that of a pipe. * * Opening a standard stream ("CONIN$", "CONOUT$", "CONERR$") via * CreateFile() with the FILE_FLAG_OVERLAPPED flag has no effect * on the handle; the parameter dwFlagsAndAttributes is ignored when * creating a standard stream handle. * * A Windows standard stream is not an anonymous or named pipe and * PeekNamedPipe is therefore not supported. Instead, PeekConsoleInput * is used to "peek" into the standard stream. */ if (YES == isStandardInput && YES == isStandardStream) { /* Stores the number of input records read */ DWORD bytes = 0; /* PeekConsoleInput fails, if it returns a non-zero value. */ if (PeekConsoleInput(h, 0, 0, &bytes) == 0) { DWORD e = GetLastError(); NSString *s; s = [NSString stringWithFormat: @"Standard input peek problem: %lu - %@", e, [NSError _last]]; [readInfo setObject: s forKey: GSFileHandleNotificationError]; NSLog(@"%@", s); return; } else if (bytes == 0) { return; // No data available yet. } } else if (NO == isStandardInput && YES == isStandardStream) { NSString *s; s = @"Reading from stdout and stderr is not available."; [readInfo setObject: s forKey: GSFileHandleNotificationError]; NSLog(@"%@", s); return; } /* If this is not a socket or a standard file, we assume it's a pipe * and therefore we need to check to see if data really is available. */ else if (NO == isSocket && NO == isStandardFile) { DWORD bytes = 0; if (PeekNamedPipe(h, 0, 0, 0, &bytes, 0) == 0) { DWORD e = GetLastError(); if (e != ERROR_BROKEN_PIPE && e != ERROR_HANDLE_EOF) { NSString *s; s = [NSString stringWithFormat: @"pipe peek problem: %lu - %@", e, [NSError _last]]; [readInfo setObject: s forKey: GSFileHandleNotificationError]; NSLog(@"%@", s); return; } /* In the case of a broken pipe, we fall through so that a read * attempt is performed allowing higer level code to notice the * problem and deal with it. */ } else if (bytes == 0) { return; // No data available yet. } } if (operation == NSFileHandleDataAvailableNotification) { [self postReadNotification]; } else { NSMutableData *item; int length; int received = 0; char buf[READ_SIZE]; item = [readInfo objectForKey: NSFileHandleNotificationDataItem]; /* * We may have a maximum data size set... */ if (readMax > 0) { length = (unsigned int)readMax - [item length]; if (length > (int)sizeof(buf)) { length = sizeof(buf); } } else { length = sizeof(buf); } received = [self read: buf length: length]; if (received == 0) { // Read up to end of file. [self postReadNotification]; } else if (received < 0) { if (isSocket && (WSAGetLastError() != WSAEINTR && WSAGetLastError() != WSAEWOULDBLOCK)) { NSString *s; s = [NSString stringWithFormat: @"Read attempt failed - %@", [NSError _last]]; [readInfo setObject: s forKey: GSFileHandleNotificationError]; [self postReadNotification]; } else if (!isSocket && (GetLastError() != ERROR_NO_DATA)) { NSString *s; s = [NSString stringWithFormat: @"Read attempt failed - %@", [NSError _last]]; [readInfo setObject: s forKey: GSFileHandleNotificationError]; [self postReadNotification]; } } else { [item appendBytes: buf length: received]; if (readMax < 0 || (readMax > 0 && (int)[item length] == readMax)) { // Read a single chunk of data [self postReadNotification]; } } } } } - (void) receivedEventWrite { NSString *operation; NSMutableDictionary *info; if ([writeInfo count] == 0) { return; // Write already completed. } info = [writeInfo objectAtIndex: 0]; operation = [info objectForKey: NotificationKey]; if (operation == GSFileHandleConnectCompletionNotification || operation == GSSOCKSConnect) { // Connection attempt completed. int result; int rval; int len = sizeof(result); rval = getsockopt((SOCKET)_get_osfhandle(descriptor), SOL_SOCKET, SO_ERROR, (char*)&result, &len); if (rval != 0) { NSString *s; s = [NSString stringWithFormat: @"Connect attempt failed - %@", [NSError _last]]; [info setObject: s forKey: GSFileHandleNotificationError]; } else if (result != 0) { NSString *s; s = [NSString stringWithFormat: @"Connect attempt failed - %@", [NSError _systemError: result]]; [info setObject: s forKey: GSFileHandleNotificationError]; } else { readOK = YES; writeOK = YES; } connectOK = NO; NSDebugMLLog(@"NSFileHandle", @"Connection complete for %p: status: %d", self, connectOK); [self postWriteNotification]; } else { NSData *item; int length; const void *ptr; BOOL failed = NO; item = [info objectForKey: NSFileHandleNotificationDataItem]; length = [item length]; ptr = [item bytes]; while (writePos < length) { int written; int offset = writePos; int amount = length - offset; written = [self write: ((char*)ptr) + offset length: amount]; if (written <= 0) { if (WSAGetLastError()!= WSAEINTR && WSAGetLastError()!= WSAEWOULDBLOCK) { NSString *s; s = [NSString stringWithFormat: @"Write attempt failed - %@", [NSError _last]]; [info setObject: s forKey: GSFileHandleNotificationError]; failed = YES; } } else { writePos += written; } if (written <= 0) { break; } } NSDebugMLLog(@"NSFileHandle", @"Wrote up to %d bytes of %d for %p", writePos, length, self); if (YES == failed || writePos >= length) { // Write operation completed. [self postWriteNotification]; } } } - (void) receivedEvent: (void*)data type: (RunLoopEventType)type extra: (void*)extra forMode: (NSString*)mode { NSDebugMLLog(@"NSFileHandle", @"%@ event: %"PRIuPTR" type: %"PRIuPTR " extra: %"PRIuPTR" mode: %@", self, (uintptr_t)data, (uintptr_t)type, (uintptr_t)extra, mode); if (isNonBlocking == NO) { [self setNonBlocking: YES]; } if (isSocket == YES) { WSANETWORKEVENTS ocurredEvents; if (type != ET_HANDLE) { NSLog(@"Argh, TRIGGER on socket %"PRIuPTR" %"PRIuPTR " %@ with event %"PRIuPTR" desc %"PRIuPTR, (uintptr_t)data, (uintptr_t)extra, mode, (uintptr_t)event, (uintptr_t)descriptor); /* [[NSRunLoop currentRunLoop] removeEvent: data type: type forMode: mode all: YES]; */ } if (WSAEnumNetworkEvents((SOCKET)_get_osfhandle(descriptor), event, &ocurredEvents) == SOCKET_ERROR) { NSLog(@"Error getting event type %d", WSAGetLastError()); abort(); } if (ocurredEvents.lNetworkEvents & FD_CONNECT) { NSDebugMLLog(@"NSFileHandle", @"Connect on %p", extra); ocurredEvents.lNetworkEvents ^= FD_CONNECT; [self receivedEventWrite]; GSPrivateNotifyASAP(mode); } if (ocurredEvents.lNetworkEvents & FD_ACCEPT) { NSDebugMLLog(@"NSFileHandle", @"Accept on %p", extra); ocurredEvents.lNetworkEvents ^= FD_ACCEPT; [self receivedEventRead]; GSPrivateNotifyASAP(mode); } if (ocurredEvents.lNetworkEvents & FD_WRITE) { NSDebugMLLog(@"NSFileHandle", @"Write on %p", extra); ocurredEvents.lNetworkEvents ^= FD_WRITE; [self receivedEventWrite]; GSPrivateNotifyASAP(mode); } if (ocurredEvents.lNetworkEvents & FD_READ) { NSDebugMLLog(@"NSFileHandle", @"Read on %p", extra); ocurredEvents.lNetworkEvents ^= FD_READ; [self receivedEventRead]; GSPrivateNotifyASAP(mode); } if (ocurredEvents.lNetworkEvents & FD_OOB) { NSDebugMLLog(@"NSFileHandle", @"OOB on %p", extra); ocurredEvents.lNetworkEvents ^= FD_OOB; [self receivedEventRead]; GSPrivateNotifyASAP(mode); } if (ocurredEvents.lNetworkEvents & FD_CLOSE) { NSDebugMLLog(@"NSFileHandle", @"Close on %p", extra); ocurredEvents.lNetworkEvents ^= FD_CLOSE; if ([writeInfo count] > 0) { [self receivedEventWrite]; } else { [self receivedEventRead]; } GSPrivateNotifyASAP(mode); } if (ocurredEvents.lNetworkEvents) { NSLog(@"Event not get %ld", ocurredEvents.lNetworkEvents); abort(); } } else { if ([writeInfo count] > 0) { [self receivedEventWrite]; } else { [self receivedEventRead]; } GSPrivateNotifyASAP(mode); } } - (NSDate*) timedOutEvent: (void*)data type: (RunLoopEventType)type forMode: (NSString*)mode { return nil; /* Don't restart timed out events */ } - (void) setAddr: (struct sockaddr *)sin { struct sockaddr_in *s = (struct sockaddr_in *)sin; address = [[NSString alloc] initWithUTF8String: (char*)inet_ntoa(s->sin_addr)]; service = [[NSString alloc] initWithFormat: @"%d", (int)GSSwapBigI16ToHost(s->sin_port)]; protocol = @"tcp"; } - (void) setNonBlocking: (BOOL)flag { if (flag == isNonBlocking) { return; } if (descriptor < 0) { return; } else if (isStandardFile == YES) { return; } /* Invoking SetNamedPipeHandleState on a standard stream results in an * ERROR_INVALID_FUNCTION (1) error message. Proceed only if the * file descriptor is not a standard stream. */ else if (isStandardStream == YES) { return; } else if (isNonBlocking == flag) { return; } else { unsigned long dummy; if (isSocket != YES) { // Not a file and not a socket, must be a pipe DWORD mode; if (YES == flag) mode = PIPE_NOWAIT; else mode = PIPE_WAIT; if (SetNamedPipeHandleState((HANDLE)_get_osfhandle(descriptor), &mode, NULL, NULL)) { isNonBlocking = flag; } else { NSLog(@"unable to set pipe non-blocking mode to %s - %lu", (YES == flag ? "YES" : "NO"), GetLastError()); } return; } if (YES == flag) { WSAEventSelect((SOCKET)_get_osfhandle(descriptor), event, FD_ALL_EVENTS); dummy = 1; if (ioctlsocket((SOCKET)_get_osfhandle(descriptor), FIONBIO, &dummy) == SOCKET_ERROR) { NSLog(@"unable to set non-blocking mode to YES - %@", [NSError _last]); } else { isNonBlocking = flag; } } else { WSAEventSelect((SOCKET)_get_osfhandle(descriptor), event, 0); dummy = 0; if (ioctlsocket((SOCKET)_get_osfhandle(descriptor), FIONBIO, &dummy) == SOCKET_ERROR) { NSLog(@"unable to set blocking mode to NO - %@", [NSError _last]); } isNonBlocking = flag; } } } - (NSString*) socketAddress { return address; } - (NSString*) socketLocalAddress { NSString *str = nil; struct sockaddr_in sin; int size = sizeof(sin); if (getsockname((SOCKET)_get_osfhandle(descriptor), (struct sockaddr*)&sin, &size) == SOCKET_ERROR) { NSLog(@"unable to get socket name - %@", [NSError _last]); } else { str = [NSString stringWithUTF8String: (char*)inet_ntoa(sin.sin_addr)]; } return str; } - (NSString*) socketLocalService { NSString *str = nil; struct sockaddr_in sin; int size = sizeof(sin); if (getsockname((SOCKET)_get_osfhandle(descriptor), (struct sockaddr*)&sin, &size) == SOCKET_ERROR) { NSLog(@"unable to get socket name - %@", [NSError _last]); } else { str = [NSString stringWithFormat: @"%d", (int)GSSwapBigI16ToHost(sin.sin_port)]; } return str; } - (NSString*) socketProtocol { return protocol; } - (NSString*) socketService { return service; } - (BOOL) useCompression { #if USE_ZLIB int d; if (gzDescriptor != 0) { return YES; // Already open } if (descriptor < 0) { return NO; // No descriptor available. } if (readOK == YES && writeOK == YES) { return NO; // Can't both read and write. } d = dup(descriptor); if (d < 0) { return NO; // No descriptor available. } if (readOK == YES) { gzDescriptor = gzdopen(d, "rb"); } else { gzDescriptor = gzdopen(d, "wb"); } if (gzDescriptor == 0) { close(d); return NO; // Open attempt failed. } return YES; #endif return NO; } @end gnustep-base-1.29.0/Source/win32/GSRunLoopCtxt.m000066400000000000000000000365051435650067400212760ustar00rootroot00000000000000/** * The GSRunLoopCtxt stores context information to handle polling for * events. This information is associated with a particular runloop * mode, and persists throughout the life of the runloop instance. * * NB. This class is private to NSRunLoop and must not be subclassed. */ #import "common.h" #import "Foundation/NSError.h" #import "Foundation/NSNotification.h" #import "Foundation/NSNotificationQueue.h" #import "Foundation/NSPort.h" #import "Foundation/NSStream.h" #import "../GSRunLoopCtxt.h" #import "../GSRunLoopWatcher.h" #import "../GSPrivate.h" #define FDCOUNT 1024 static SEL wRelSel; static SEL wRetSel; static IMP wRelImp; static IMP wRetImp; static void wRelease(NSMapTable* t, void* w) { (*wRelImp)((id)w, wRelSel); } static void wRetain(NSMapTable* t, const void* w) { (*wRetImp)((id)w, wRetSel); } static const NSMapTableValueCallBacks WatcherMapValueCallBacks = { wRetain, wRelease, 0 }; @implementation GSRunLoopCtxt + (void) initialize { wRelSel = @selector(release); wRetSel = @selector(retain); wRelImp = [[GSRunLoopWatcher class] instanceMethodForSelector: wRelSel]; wRetImp = [[GSRunLoopWatcher class] instanceMethodForSelector: wRetSel]; } - (void) dealloc { RELEASE(mode); GSIArrayEmpty(performers); NSZoneFree(performers->zone, (void*)performers); GSIArrayEmpty(timers); NSZoneFree(timers->zone, (void*)timers); GSIArrayEmpty(watchers); NSZoneFree(watchers->zone, (void*)watchers); if (handleMap != 0) { NSFreeMapTable(handleMap); } if (winMsgMap != 0) { NSFreeMapTable(winMsgMap); } GSIArrayEmpty(_trigger); NSZoneFree(_trigger->zone, (void*)_trigger); [super dealloc]; } /** * Remove any callback for the specified event which is set for an * uncompleted poll operation.
* This is called by nested event loops on contexts in outer loops * when they handle an event ... removing the event from the outer * loop ensures that it won't get handled twice, once by the inner * loop and once by the outer one. */ - (void) endEvent: (void*)data for: (GSRunLoopWatcher*)watcher { if (completed == NO) { unsigned i = GSIArrayCount(_trigger); while (i-- > 0) { GSIArrayItem item = GSIArrayItemAtIndex(_trigger, i); if (item.obj == (id)watcher) { GSIArrayRemoveItemAtIndex(_trigger, i); } } switch (watcher->type) { case ET_RPORT: case ET_HANDLE: NSMapRemove(handleMap, data); break; case ET_WINMSG: NSMapRemove(winMsgMap, data); break; case ET_TRIGGER: // Already handled break; default: NSLog(@"Ending an event of unexpected type (%d)", watcher->type); break; } } } /** * Mark this poll context as having completed, so that if we are * executing a re-entrant poll, the enclosing poll operations * know they can stop what they are doing because an inner * operation has done the job. */ - (void) endPoll { completed = YES; } - (id) init { [NSException raise: NSInternalInconsistencyException format: @"-init may not be called for GSRunLoopCtxt"]; return nil; } - (id) initWithMode: (NSString*)theMode extra: (void*)e { self = [super init]; if (self != nil) { NSZone *z; mode = [theMode copy]; extra = e; z = [self zone]; performers = NSZoneMalloc(z, sizeof(GSIArray_t)); timers = NSZoneMalloc(z, sizeof(GSIArray_t)); watchers = NSZoneMalloc(z, sizeof(GSIArray_t)); _trigger = NSZoneMalloc(z, sizeof(GSIArray_t)); GSIArrayInitWithZoneAndCapacity(performers, z, 8); GSIArrayInitWithZoneAndCapacity(timers, z, 8); GSIArrayInitWithZoneAndCapacity(watchers, z, 8); GSIArrayInitWithZoneAndCapacity(_trigger, z, 8); handleMap = NSCreateMapTable(NSIntegerMapKeyCallBacks, WatcherMapValueCallBacks, 0); winMsgMap = NSCreateMapTable(NSIntegerMapKeyCallBacks, WatcherMapValueCallBacks, 0); } return self; } /* * If there is a generic watcher (watching hwnd == 0), * loop through all events, and send them to the correct * watcher (if there are any) and then process the rest right here. * Return a flag to say whether any messages were handled. */ - (BOOL) processAllWindowsMessages:(int)num_winMsgs within: (NSArray*)contexts { MSG msg; GSRunLoopWatcher *generic = nil; unsigned i; BOOL handled = NO; if (num_winMsgs > 0) { generic = NSMapGet(winMsgMap,0); } if (generic != nil && generic->_invalidated == NO) { while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) { if (num_winMsgs > 0) { HANDLE handle; GSRunLoopWatcher *watcher; handle = msg.hwnd; watcher = (GSRunLoopWatcher*)NSMapGet(winMsgMap, (void*)handle); if (watcher == nil || watcher->_invalidated == YES) { handle = 0; // Generic watcher = (GSRunLoopWatcher*)NSMapGet(winMsgMap, (void*)handle); } if (watcher != nil && watcher->_invalidated == NO) { i = [contexts count]; while (i-- > 0) { GSRunLoopCtxt *c = [contexts objectAtIndex: i]; if (c != self) { [c endEvent: (void*)handle for: watcher]; } } handled = YES; /* * The watcher is still valid - so call the * receiver's event handling method. */ [watcher->receiver receivedEvent: watcher->data type: watcher->type extra: (void*)&msg forMode: mode]; continue; } } TranslateMessage(&msg); DispatchMessage(&msg); } } else { if (num_winMsgs > 0) { unsigned num = num_winMsgs; NSMapEnumerator hEnum; HANDLE handle; GSRunLoopWatcher *watcher; hEnum = NSEnumerateMapTable(winMsgMap); while (NSNextMapEnumeratorPair(&hEnum, &handle, (void**)&watcher)) { if (watcher->_invalidated == NO) { while (PeekMessage(&msg, handle, 0, 0, PM_REMOVE)) { i = [contexts count]; while (i-- > 0) { GSRunLoopCtxt *c = [contexts objectAtIndex: i]; if (c != self) { [c endEvent: (void*)handle for: watcher]; } } handled = YES; [watcher->receiver receivedEvent: watcher->data type: watcher->type extra: (void*)&msg forMode: mode]; } } num--; } NSEndMapTableEnumeration(&hEnum); } } return handled; } - (BOOL) pollUntil: (int)milliseconds within: (NSArray*)contexts { GSRunLoopThreadInfo *threadInfo = GSRunLoopInfoForThread(nil); NSMapEnumerator hEnum; GSRunLoopWatcher *watcher; HANDLE handleArray[MAXIMUM_WAIT_OBJECTS-1]; int num_handles; int num_winMsgs; unsigned count; unsigned i; void *handle; int wait_timeout; DWORD wait_return; BOOL immediate = NO; BOOL existingMessages = NO; // Set timeout how much time should wait if (milliseconds >= 0) { wait_timeout = milliseconds; } else { wait_timeout = INFINITE; } NSResetMapTable(handleMap); NSResetMapTable(winMsgMap); GSIArrayRemoveAllItems(_trigger); i = GSIArrayCount(watchers); num_handles = 1; // One handle for signals from other threads num_winMsgs = 0; while (i-- > 0) { GSRunLoopWatcher *info; BOOL trigger; info = GSIArrayItemAtIndex(watchers, i).obj; if (info->_invalidated == YES) { GSIArrayRemoveItemAtIndex(watchers, i); } else if ([info runLoopShouldBlock: &trigger] == NO) { if (trigger == YES) { immediate = YES; GSIArrayAddItem(_trigger, (GSIArrayItem)(id)info); } } else { HANDLE handle; switch (info->type) { case ET_HANDLE: handle = (HANDLE)(size_t)info->data; NSMapInsert(handleMap, (void*)handle, info); num_handles++; break; case ET_RPORT: { id port = info->receiver; NSInteger port_hd_size = FDCOUNT; NSInteger port_hd_count = FDCOUNT; NSInteger port_hd_buffer[FDCOUNT]; NSInteger *port_hd_array = port_hd_buffer; [port getFds: port_hd_array count: &port_hd_count]; while (port_hd_count > port_hd_size) { if (port_hd_array != port_hd_buffer) free(port_hd_array); port_hd_size = port_hd_count; port_hd_count = port_hd_size; port_hd_array = malloc(sizeof(NSInteger)*port_hd_size); [port getFds: port_hd_array count: &port_hd_count]; } NSDebugMLLog(@"NSRunLoop", @"listening to %ld port handles", (long)port_hd_count); while (port_hd_count--) { NSMapInsert(handleMap, (void*)(size_t) port_hd_array[port_hd_count], info); num_handles++; } if (port_hd_array != port_hd_buffer) free(port_hd_array); } break; case ET_WINMSG: handle = (HANDLE)(size_t)info->data; NSMapInsert(winMsgMap, (void*)handle, info); num_winMsgs++; break; case ET_TRIGGER: break; } } } /* * If there are notifications in the 'idle' queue, we try an * instantaneous select so that, if there is no input pending, * we can service the queue. Similarly, if a task has completed, * we need to deliver its notifications. */ if (GSPrivateCheckTasks() || GSPrivateNotifyMore(mode) || immediate == YES) { wait_timeout = 0; } handleArray[0] = threadInfo->event; // Signal from other thread num_handles = NSCountMapTable(handleMap) + 1; if (num_handles >= MAXIMUM_WAIT_OBJECTS) { NSLog(@"Too many handles to wait for ... only using %d of %d", MAXIMUM_WAIT_OBJECTS-1, num_handles); num_handles = MAXIMUM_WAIT_OBJECTS-1; } count = num_handles - 1; // Count of handles excluding thread event if (count > 0) { i = 1 + (fairStart++ % count); hEnum = NSEnumerateMapTable(handleMap); while (count-- > 0 && NSNextMapEnumeratorPair(&hEnum, &handle, (void**)&watcher)) { if (i >= num_handles) { i = 1; } handleArray[i++] = (HANDLE)handle; } NSEndMapTableEnumeration(&hEnum); } completed = NO; /* Clear all the windows messages first before we wait, * since MsgWaitForMultipleObjects only signals on NEW messages */ if ([self processAllWindowsMessages: num_winMsgs within: contexts] == YES) { // Processed something ... no need to wait. wait_timeout = 0; num_winMsgs = 0; existingMessages = YES; } if (num_winMsgs > 0) { NSDebugMLLog(@"NSRunLoop", @"wait for messages and %d handles for %d milliseconds", num_handles, wait_timeout); /* * Wait for signalled events or window messages. */ wait_return = MsgWaitForMultipleObjects(num_handles, handleArray, NO, wait_timeout, QS_ALLINPUT); } else if (num_handles > 0) { NSDebugMLLog(@"NSRunLoop", @"wait for %d handles for %d milliseconds", num_handles, wait_timeout); /* * We are not interested in windows messages ... just wait for * signalled events. */ wait_return = WaitForMultipleObjects(num_handles, handleArray, NO, wait_timeout); } else { NSDebugMLLog(@"NSRunLoop", @"wait for %d milliseconds", wait_timeout); SleepEx(wait_timeout, TRUE); wait_return = WAIT_TIMEOUT; } // check wait errors if (WAIT_FAILED == wait_return || (wait_return >= WAIT_ABANDONED_0 && wait_return < WAIT_ABANDONED_0 + num_handles)) { int i; BOOL found = NO; NSDebugMLLog(@"NSRunLoop", @"WaitForMultipleObjects() error in " @"-pollUntil:within: %@", [NSError _last]); /* * Check each handle in turn until either we find one which has an * event signalled, or we find the one which caused the original * wait to fail ... so the callback routine for that handle can * deal with the problem. */ for (i = 0; i < num_handles; i++) { handleArray[0] = handleArray[i]; wait_return = WaitForMultipleObjects(1, handleArray, NO, 0); if (wait_return != WAIT_TIMEOUT) { wait_return = WAIT_OBJECT_0; found = YES; break; } } if (found == NO) { NSLog(@"WaitForMultipleObjects() error in " @"-pollUntil:within: %@", [NSError _last]); abort (); } } /* * Trigger any watchers which are set up to trigger for every runloop wait. */ count = GSIArrayCount(_trigger); completed = NO; while (count-- > 0) { GSRunLoopWatcher *watcher; watcher = (GSRunLoopWatcher*)GSIArrayItemAtIndex(_trigger, count).obj; if (watcher->_invalidated == NO) { NSDebugMLLog(@"NSRunLoop", @"trigger watcher %@", watcher); i = [contexts count]; while (i-- > 0) { GSRunLoopCtxt *c = [contexts objectAtIndex: i]; if (c != self) { [c endEvent: (void*)watcher for: watcher]; } } /* * The watcher is still valid - so call its * receivers event handling method. */ [watcher->receiver receivedEvent: watcher->data type: watcher->type extra: watcher->data forMode: mode]; } GSPrivateNotifyASAP(mode); } if (WAIT_TIMEOUT == wait_return) { // there is no event to handle if (existingMessages) { NSDebugMLLog(@"NSRunLoop", @"processed windows messages"); } else { NSDebugMLLog(@"NSRunLoop", @"timeout without events"); completed = YES; return NO; } } else if (WAIT_OBJECT_0 + num_handles == wait_return) { // one or more windows message NSDebugMLLog(@"NSRunLoop", @"processing windows messages"); [self processAllWindowsMessages: num_winMsgs within: contexts]; } else if ((i = wait_return - WAIT_OBJECT_0) >= 0 && i < num_handles) { /* Look the event that WaitForMultipleObjects() says is ready; * get the corresponding fd for that handle event and notify * the corresponding object for the ready fd. */ NSDebugMLLog(@"NSRunLoop", @"Handle signalled %d", i); handle = handleArray[i]; if (handle == threadInfo->event) { watcher = nil; NSDebugMLLog(@"NSRunLoop", @"Fire perform on thread"); [threadInfo fire]; } else { watcher = (GSRunLoopWatcher*)NSMapGet(handleMap, (void*)handle); NSDebugMLLog(@"NSRunLoop", @"Fire watcher %@", watcher); } if (watcher != nil && watcher->_invalidated == NO) { i = [contexts count]; while (i-- > 0) { GSRunLoopCtxt *c = [contexts objectAtIndex: i]; if (c != self) { [c endEvent: (void*)handle for: watcher]; } } /* * The watcher is still valid - so call its receivers * event handling method. */ [watcher->receiver receivedEvent: watcher->data type: watcher->type extra: (void*)handle forMode: mode]; } } else { NSDebugMLLog(@"NSRunLoop", @"unexpected result %lu", wait_return); GSPrivateNotifyASAP(mode); completed = NO; return NO; } GSPrivateNotifyASAP(mode); completed = YES; return YES; } + (BOOL) awakenedBefore: (NSDate*)when { GSRunLoopThreadInfo *threadInfo = GSRunLoopInfoForThread(nil); NSTimeInterval ti = (when == nil) ? 0.0 : [when timeIntervalSinceNow]; int milliseconds = (ti <= 0.0) ? 0 : (int)(ti*1000); HANDLE h = threadInfo->event; if (WaitForMultipleObjects(1, &h, NO, milliseconds) != WAIT_TIMEOUT) { NSDebugMLLog(@"NSRunLoop", @"Fire perform on thread"); [threadInfo fire]; return YES; } return NO; } @end gnustep-base-1.29.0/Source/win32/Makefile.preamble000066400000000000000000000042271435650067400216470ustar00rootroot00000000000000# # Makefile.preamble # # Copyright (C) 1997 Free Software Foundation, Inc. # # Author: Scott Christley # # This file is part of the GNUstep Base Library. # # 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 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 # Library General Public License for more details. # # If you are interested in a warranty or support for this source code, # contact Scott Christley at scottc@net-community.com # # You should have received a copy of the GNU Lesser General Public # License along with this library; see the file COPYING.LIB. # If not, write to the Free Software Foundation, # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # Makefile.preamble # # Project specific makefile variables # # Do not put any Makefile rules in this file, instead they should # be put into Makefile.postamble. # # # Flags dealing with compiling and linking # # Additional flags to pass to the preprocessor ADDITIONAL_CPPFLAGS = $(DEFS) \ $(WARN_FLAGS) # Additional flags to pass to the Objective-C compiler #ADDITIONAL_OBJCFLAGS = ifeq ($(GNUSTEP_TARGET_OS),mingw32) ADDITIONAL_OBJCFLAGS += -DBUILD_libgnustep_base_DLL=1 else ifeq ($(GNUSTEP_TARGET_OS),mingw64) ADDITIONAL_OBJCFLAGS += -DBUILD_libgnustep_base_DLL=1 else ifeq ($(GNUSTEP_TARGET_OS),cygwin) ADDITIONAL_OBJCFLAGS += -DBUILD_libgnustep_base_DLL=1 else ifeq ($(GNUSTEP_TARGET_OS),windows) ADDITIONAL_OBJCFLAGS += -DBUILD_libgnustep_base_DLL=1 endif # Additional flags to pass to the C compiler ADDITIONAL_CFLAGS = # Additional include directories the compiler should search ADDITIONAL_INCLUDE_DIRS = -I../$(GNUSTEP_TARGET_DIR) -I../ ifeq ($(FOUNDATION_LIB),gnu) ADDITIONAL_INCLUDE_DIRS += -I../../Headers endif # Additional LDFLAGS to pass to the linker ADDITIONAL_LDFLAGS = gnustep-base-1.29.0/Source/win32/NSMessagePort.m000066400000000000000000000705701435650067400212750ustar00rootroot00000000000000/** Implementation of network port object based on windows mailboxes Copyright (C) 2005 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #include "common.h" #define EXPOSE_NSPort_IVARS 1 #define EXPOSE_NSMessagePort_IVARS 1 #include "GNUstepBase/GSLock.h" #include "Foundation/NSArray.h" #include "Foundation/NSNotification.h" #include "Foundation/NSError.h" #include "Foundation/NSException.h" #include "Foundation/NSRunLoop.h" #include "Foundation/NSByteOrder.h" #include "Foundation/NSData.h" #include "Foundation/NSDate.h" #include "Foundation/NSMapTable.h" #include "Foundation/NSPortMessage.h" #include "Foundation/NSPortNameServer.h" #include "Foundation/NSLock.h" #include "Foundation/NSThread.h" #include "Foundation/NSConnection.h" #include "Foundation/NSDebug.h" #include "Foundation/NSPathUtilities.h" #include "Foundation/NSValue.h" #include "Foundation/NSFileManager.h" #include "Foundation/NSProcessInfo.h" #include "../GSPrivate.h" #include "../GSPortPrivate.h" #include #define UNISTR(X) \ ((const unichar*)[(X) cStringUsingEncoding: NSUnicodeStringEncoding]) #if 0 #define M_LOCK(X) {NSDebugMLLog(@"NSMessagePort",@"lock %@",X); [X lock];} #define M_UNLOCK(X) {NSDebugMLLog(@"NSMessagePort",@"unlock %@",X); [X unlock];} #else #define M_LOCK(X) {[X lock];} #define M_UNLOCK(X) {[X unlock];} #endif /* * The GSPortItemType constant is used to identify the type of data in * each packet read. All data transmitted is in a packet, each packet * has an initial packet type and packet length. */ typedef enum { GSP_ITEM, /* Expecting a port item header. */ GSP_PORT, /* Simple port item. */ GSP_DATA, /* Simple data item. */ GSP_HEAD /* Port message header + initial data. */ } GSPortItemType; /* * The GSPortItemHeader structure defines the header for each item transmitted. * Its contents are transmitted in network byte order. */ typedef struct { uint32_t type; /* A GSPortItemType as a 4-byte number. */ uint32_t length; /* The length of the item (excluding header). */ } GSPortItemHeader; /* * The GSPortMsgHeader structure is at the start of any item of type GSP_HEAD. * Its contents are transmitted in network byte order. * Any additional data in the item is an NSData object. * NB. additional data counts as part of the same item. */ typedef struct { uint32_t mId; /* The ID for the message starting with this. */ uint32_t nItems; /* Number of items (including this one). */ unsigned char version; unsigned char port[16]; } GSPortMsgHeader; typedef enum { RS_NONE, // Not started yet RS_MESG, // Waiting to be notified of a message arriving RS_SIZE, // Need to determine message size RS_DATA // Need to read message data } ReadState; typedef struct { NSString *name; NSRecursiveLock *lock; HANDLE rHandle; HANDLE wHandle; HANDLE rEvent; HANDLE wEvent; ReadState rState; OVERLAPPED rOv; OVERLAPPED wOv; DWORD rSize; DWORD wSize; NSMutableData *wData; /* Data object being written. */ DWORD wLength; /* Amount written so far. */ NSMutableArray *wMsgs; /* Message in progress. */ NSMutableData *rData; /* Buffer for incoming data */ DWORD rLength; /* Amount read so far. */ DWORD rWant; /* Amount desired. */ NSMutableArray *rMsgs; /* Messages in progress. */ } internal; #define PORT(X) ((internal*)((NSMessagePort*)X)->_internal) @implementation NSMessagePort static SECURITY_ATTRIBUTES security; static NSRecursiveLock *messagePortLock = nil; /* * Maps port name to NSMessagePort objects. */ static NSMapTable *ports = 0; static Class messagePortClass = 0; - (BOOL) _setupSendPort { internal *this = (internal*)self->_internal; BOOL result; M_LOCK(this->lock); if (this->wHandle == INVALID_HANDLE_VALUE) { NSString *path; path = [NSString stringWithFormat: @"\\\\.\\mailslot\\GNUstep\\NSMessagePort\\%@", this->name]; this->wHandle = CreateFileW( UNISTR(path), GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, &security, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, (HANDLE)0); if (this->wHandle == INVALID_HANDLE_VALUE) { NSDebugMLLog(@"NSMessagePort", @"unable to access mailslot '%@' for write - %@", [self name], [NSError _last]); result = NO; } else { this->wEvent = CreateEvent(NULL, FALSE, FALSE, NULL); this->wMsgs = [NSMutableArray new]; result = YES; } } else { result = YES; } M_UNLOCK(this->lock); return result; } + (void) initialize { if (self == [NSMessagePort class]) { messagePortClass = self; ports = NSCreateMapTable(NSNonRetainedObjectMapKeyCallBacks, NSNonOwnedPointerMapValueCallBacks, 0); [[NSObject leakAt: &ports] release]; messagePortLock = [GSLazyRecursiveLock new]; [[NSObject leakAt: &messagePortLock] release]; security.nLength = sizeof(SECURITY_ATTRIBUTES); security.lpSecurityDescriptor = 0; // Default security.bInheritHandle = FALSE; } } + (id) newWithName: (NSString*)name { NSMessagePort *p; M_LOCK(messagePortLock); p = RETAIN((NSMessagePort*)NSMapGet(ports, (void*)name)); if (p == nil) { p = [[self alloc] initWithName: name]; } M_UNLOCK(messagePortLock); return p; } - (void) addConnection: (NSConnection*)aConnection toRunLoop: (NSRunLoop*)aLoop forMode: (NSString*)aMode { NSDebugMLLog(@"NSMessagePort", @"%@ add to 0x%p in mode %@", self, aLoop, aMode); NSAssert(PORT(self)->rHandle != INVALID_HANDLE_VALUE, @"Attempt to listen on send port"); [aLoop addEvent: (void*)(uintptr_t)PORT(self)->rEvent type: ET_HANDLE watcher: (id)self forMode: aMode]; } - (id) copyWithZone: (NSZone*)zone { return RETAIN(self); } - (void) dealloc { [self finalize]; [super dealloc]; } - (NSString*) description { NSString *desc; desc = [NSString stringWithFormat: @"", self, PORT(self)->name]; return desc; } - (void) finalize { internal *this; NSDebugMLLog(@"NSMessagePort", @"NSMessagePort 0x%p finalized", self); [self invalidate]; this = PORT(self); if (this != 0) { DESTROY(this->name); DESTROY(this->rData); DESTROY(this->rMsgs); DESTROY(this->wMsgs); DESTROY(this->lock); NSZoneFree(NSDefaultMallocZone(), _internal); _internal = 0; } } - (id) conversation: (NSPort*)recvPort { return nil; } - (void) handlePortMessage: (NSPortMessage*)m { id d = [self delegate]; if (d == nil) { NSDebugMLLog(@"NSMessagePort", @"No delegate to handle incoming message"); return; } if ([d respondsToSelector: @selector(handlePortMessage:)] == NO) { NSDebugMLLog(@"NSMessagePort", @"delegate doesn't handle messages"); return; } NSDebugMLLog(@"NSMessagePort", @"%@ asking %@ to handle msg", self, d); [d handlePortMessage: m]; } - (NSUInteger) hash { return [PORT(self)->name hash]; } - (id) init { static unsigned sequence = 0; static int ident; internal *this; NSString *path; if (sequence == 0) { ident = [[NSProcessInfo processInfo] processIdentifier]; } M_LOCK(messagePortLock); _internal = NSZoneMalloc(NSDefaultMallocZone(), sizeof(internal)); memset(_internal, '\0', sizeof(internal)); this = PORT(self); self->_is_valid = YES; this->name = [[NSString alloc] initWithFormat: @"%08x%08x", ((unsigned)ident), sequence++]; this->lock = [GSLazyRecursiveLock new]; this->wHandle = INVALID_HANDLE_VALUE; this->wEvent = INVALID_HANDLE_VALUE; this->rState = RS_NONE; this->rEvent = CreateEvent(NULL, FALSE, FALSE, NULL); this->rData = [NSMutableData new]; this->rMsgs = [NSMutableArray new]; path = [NSString stringWithFormat: @"\\\\.\\mailslot\\GNUstep\\NSMessagePort\\%@", this->name]; this->rHandle = CreateMailslotW( UNISTR(path), 0, /* No max message size. */ MAILSLOT_WAIT_FOREVER, /* No read/write timeout. */ &security); if (this->rHandle == INVALID_HANDLE_VALUE) { NSLog(@"unable to create mailslot '%@' - %@", this->name, [NSError _last]); DESTROY(self); } else { NSMapInsert(ports, (void*)this->name, (void*)self); NSDebugMLLog(@"NSMessagePort", @"Created listening port: %@", self); /* * Simulate a read event to kick off the I/O for this handle. * If we can't start reading, we will be invalidated, and must * then destroy self. */ [self receivedEventRead]; if ([self isValid] == NO) { DESTROY(self); } } M_UNLOCK(messagePortLock); return self; } - (id) initWithName: (NSString*)name { NSMessagePort *p; BOOL found = NO; M_LOCK(messagePortLock); p = RETAIN((NSMessagePort*)NSMapGet(ports, (void*)name)); if (p == nil) { internal *this; _internal = NSZoneMalloc(NSDefaultMallocZone(), sizeof(internal)); memset(_internal, '\0', sizeof(internal)); this = PORT(self); self->_is_valid = YES; this->name = [name copy]; this->lock = [GSLazyRecursiveLock new]; this->rState = RS_NONE; this->rHandle = INVALID_HANDLE_VALUE; this->rEvent = INVALID_HANDLE_VALUE; this->wHandle = INVALID_HANDLE_VALUE; this->wEvent = INVALID_HANDLE_VALUE; } else { found = YES; DESTROY(self); self = p; } /* This is a 'speaking' port ... set it up for write operation * if necessary. * NB. This must be done (to create the mailbox) before the port * is added to the nameserver mapping ... or nother process might * try to access the mailbox before it exists. */ if ([self _setupSendPort] == NO) { DESTROY(self); } if (self != nil && found == NO) { /* This was newly created ... add to map so that it can be found. */ NSMapInsert(ports, (void*)[self name], (void*)self); NSDebugMLLog(@"NSMessagePort", @"Created speaking port: %@", self); } M_UNLOCK(messagePortLock); return self; } - (void) invalidate { RETAIN(self); if ([self isValid] == YES) { internal *this; this = PORT(self); M_LOCK(this->lock); if ([self isValid] == YES) { M_LOCK(messagePortLock); if (this->rHandle != INVALID_HANDLE_VALUE) { (void) CancelIo(this->rHandle); } if (this->wHandle != INVALID_HANDLE_VALUE) { (void) CancelIo(this->wHandle); } if (this->rEvent != INVALID_HANDLE_VALUE) { (void) CloseHandle(this->rEvent); this->rEvent = INVALID_HANDLE_VALUE; } if (this->wEvent != INVALID_HANDLE_VALUE) { (void) CloseHandle(this->wEvent); this->wEvent = INVALID_HANDLE_VALUE; } if (this->rHandle != INVALID_HANDLE_VALUE) { (void) CloseHandle(this->rHandle); this->rHandle = INVALID_HANDLE_VALUE; } if (this->wHandle != INVALID_HANDLE_VALUE) { (void) CloseHandle(this->wHandle); this->wHandle = INVALID_HANDLE_VALUE; } NSMapRemove(ports, (void*)this->name); M_UNLOCK(messagePortLock); [[NSMessagePortNameServer sharedInstance] removePort: self]; [super invalidate]; } M_UNLOCK(this->lock); } RELEASE(self); } - (BOOL) isEqual: (id)anObject { if (anObject == self) { return YES; } if ([anObject class] == [self class]) { NSMessagePort *o = (NSMessagePort*)anObject; return [PORT(o)->name isEqual: PORT(self)->name]; } return NO; } - (NSString*) name { return PORT(self)->name; } /* * Called when an event occurs on a listener port * ALSO called when the port is created, to start reading. */ - (void) receivedEventRead { internal *this = PORT(self); M_LOCK(this->lock); NSDebugMLLog(@"NSMessagePort", @"entered with rWant=%lu", this->rWant); if (this->rState == RS_MESG) { /* * Have we read something? */ if (GetOverlappedResult( this->rHandle, &this->rOv, &this->rSize, TRUE) == 0) { errno = GetLastError(); NSDebugMLLog(@"NSMessagePort", @"overlapped result=%d", errno); /* * Our overlapped read attempt should fail ... because mailslots * insist we read an entire message in one go, and we asked it * to read zero bytes. The error we are expecting is * ERROR_INSUFFICIENT_BUFFER ... indicating that there is a * message to be read ... so we can ask for its size and read it * synchronously. */ if (errno == ERROR_INSUFFICIENT_BUFFER) { this->rState = RS_SIZE; } else { NSLog(@"GetOverlappedResult failed ... %@", [NSError _last]); this->rState = RS_NONE; this->rLength = 0; } } else { NSLog(@"GetOverlappedResult success ... %lu", this->rSize); this->rState = RS_NONE; this->rLength = 0; } } if (this->rState == RS_SIZE) { if (GetMailslotInfo( this->rHandle, 0, &this->rWant, 0, 0) == 0) { NSLog(@"unable to get info from mailslot '%@' - %@", this->name, [NSError _last]); [self invalidate]; return; } else { this->rState = RS_DATA; NSDebugMLLog(@"NSMessagePort", @"mailslot size=%lu", this->rWant); [this->rData setLength: this->rWant]; if (ReadFile(this->rHandle, [this->rData mutableBytes], // Store results here this->rWant, &this->rSize, NULL) == 0) { NSLog(@"unable to read from mailslot '%@' - %@", this->name, [NSError _last]); [self invalidate]; return; } if (this->rSize != this->rWant) { NSLog(@"only read %lu of %lu bytes from mailslot '%@' - %@", this->rSize, this->rWant, this->name, [NSError _last]); [self invalidate]; return; } else { NSDebugMLLog(@"NSMessagePort", @"Read complete on %@", self); } this->rLength = this->rSize; this->rSize = 0; this->rState = RS_NONE; } } /* * Do next part only if we have completed a read. */ if (this->rLength > 0 && this->rLength == this->rWant) { unsigned char *buf = [this->rData mutableBytes]; GSPortItemType rType; GSPortItemHeader *pih; unsigned off = 0; unsigned len; unsigned rId = 0; unsigned nItems = 0; NSMessagePort *rPort = nil; NSMutableArray *rItems = nil; while (off + sizeof(GSPortItemHeader) <= this->rLength) { pih = (GSPortItemHeader*)(buf + off); off += sizeof(GSPortItemHeader); rType = GSSwapBigI32ToHost(pih->type); len = GSSwapBigI32ToHost(pih->length); if (len + off > this->rLength) { NSLog(@"%@ - unreasonable length (%u) for data", self, len); break; } if (rType != GSP_HEAD && rItems == nil) { NSLog(@"%@ - initial part of message had bad type", self); break; } if (rType == GSP_HEAD) { GSPortMsgHeader *pmh; NSString *n; NSMutableData *d; if (len < sizeof(GSPortMsgHeader)) { NSLog(@"%@ - bad length for header", self); break; } pmh = (GSPortMsgHeader*)(buf + off); off += sizeof(GSPortMsgHeader); len -= sizeof(GSPortMsgHeader); rId = GSSwapBigI32ToHost(pmh->mId); nItems = GSSwapBigI32ToHost(pmh->nItems); if (nItems == 0) { NSLog(@"%@ - unable to decode item count", self); break; } n = [[NSString alloc] initWithBytes: pmh->port length: 16 encoding: NSASCIIStringEncoding]; NSDebugFLLog(@"NSMessagePort", @"Decoded port as '%@'", n); rPort = [messagePortClass newWithName: n]; RELEASE(n); if (rPort == nil) { NSLog(@"%@ - unable to decode remote port", self); break; } rItems = [NSMutableArray alloc]; rItems = [rItems initWithCapacity: nItems]; d = [[NSMutableData alloc] initWithBytes: buf + off length: len]; [rItems addObject: d]; RELEASE(d); } else if (rType == GSP_DATA) { NSMutableData *d; d = [[NSMutableData alloc] initWithBytes: buf + off length: len]; [rItems addObject: d]; RELEASE(d); } else if (rType == GSP_PORT) { NSMessagePort *p; NSString *n; if (len != 16) { NSLog(@"%@ - bad length for port item", self); break; } n = [[NSString alloc] initWithBytes: buf + off length: 16 encoding: NSASCIIStringEncoding]; NSDebugFLLog(@"NSMessagePort", @"Decoded port as '%@'", n); p = [messagePortClass newWithName: n]; RELEASE(n); if (p == nil) { NSLog(@"%@ - unable to decode remote port", self); break; } [rItems addObject: p]; RELEASE(p); } off += len; if (nItems == [rItems count]) { NSPortMessage *pm; pm = [NSPortMessage allocWithZone: NSDefaultMallocZone()]; pm = [pm initWithSendPort: rPort receivePort: self components: rItems]; DESTROY(rPort); DESTROY(rItems); [pm setMsgid: rId]; [this->rMsgs addObject: pm]; RELEASE(pm); break; } } DESTROY(rPort); DESTROY(rItems); } /* * Got something ... is it all we want? If not, ask to read more. */ if ([self isValid] == YES && (this->rState == RS_NONE || this->rLength < this->rWant)) { int rc; this->rOv.Offset = 0; this->rOv.OffsetHigh = 0; this->rOv.hEvent = this->rEvent; if (this->rState == RS_NONE) { this->rLength = 0; this->rWant = 1; } if ([this->rData length] < (this->rWant - this->rLength)) { [this->rData setLength: this->rWant - this->rLength]; } rc = ReadFile(this->rHandle, [this->rData mutableBytes], // Store results here this->rWant - this->rLength, &this->rSize, &this->rOv); if (rc > 0) { NSDebugMLLog(@"NSMessagePort", @"Read immediate on %@", self); if (this->rState == RS_NONE) { this->rState = RS_SIZE; } SetEvent(this->rEvent); } else if ((errno = GetLastError()) == ERROR_IO_PENDING) { NSDebugMLLog(@"NSMessagePort", @"Read queued on %@", self); if (this->rState == RS_NONE) { this->rState = RS_MESG; } } else if (errno == ERROR_INSUFFICIENT_BUFFER) { NSDebugMLLog(@"NSMessagePort", @"Read retry on %@", self); if (this->rState == RS_NONE) { this->rState = RS_SIZE; } SetEvent(this->rEvent); } else { NSLog(@"unable to read from mailslot '%@' - %@", this->name, [NSError _last]); [self invalidate]; } } while ([this->rMsgs count] > 0) { NSPortMessage *pm; pm = RETAIN([this->rMsgs objectAtIndex: 0]); [this->rMsgs removeObjectAtIndex: 0]; NSDebugMLLog(@"NSMessagePort", @"got message %@ on 0x%p", pm, self); M_UNLOCK(this->lock); NS_DURING { [self handlePortMessage: pm]; } NS_HANDLER { M_LOCK(this->lock); RELEASE(pm); [localException raise]; } NS_ENDHANDLER M_LOCK(this->lock); RELEASE(pm); } M_UNLOCK(this->lock); } /* * Called when an event occurs on a speaker port * ALSO called when we start trying to write a new message and there * wasn't one in progress. */ - (void) receivedEventWrite { internal *this = PORT(self); M_LOCK(this->lock); if (this->wData != nil) { /* * Have we written something? */ if (GetOverlappedResult( this->wHandle, &this->wOv, &this->wSize, TRUE) == 0) { NSLog(@"GetOverlappedResult failed ... %@", [NSError _last]); } else { this->wLength += this->wSize; this->wSize = 0; } } again: /* * Handle start of next data item if we have completed one, * or if we are called without a write in progress. */ if (this->wData == nil || this->wLength == [this->wData length]) { if (this->wData != nil) { NSDebugMLLog(@"NSMessagePort", @"completed write on 0x%p", self); [this->wMsgs removeObjectIdenticalTo: this->wData]; this->wData = nil; } if ([this->wMsgs count] > 0) { this->wData = [this->wMsgs objectAtIndex: 0]; } this->wLength = 0; // Nothing written yet. } if (this->wData != nil) { int rc; this->wOv.Offset = 0; this->wOv.OffsetHigh = 0; this->wOv.hEvent = this->wEvent; rc = WriteFile(this->wHandle, [this->wData bytes], // Output from here [this->wData length] - this->wLength, &this->wSize, // Store number of bytes written &this->wOv); if (rc > 0) { NSDebugMLLog(@"NSMessagePort", @"Write of %lu performs %lu", (unsigned long)([this->wData length] - this->wLength), this->wSize); this->wLength += this->wSize; goto again; } else if ((errno = GetLastError()) != ERROR_IO_PENDING) { /* This is probably an end of file * eg. when the process at the other end has terminated. */ NSDebugMLLog(@"NSMessagePort", @"unable to write to mailslot '%@' - %@", this->name, [NSError _last]); [self invalidate]; } else { NSDebugMLLog(@"NSMessagePort", @"Write of %lu queued", (unsigned long)([this->wData length] - this->wLength)); } } M_UNLOCK(this->lock); } - (void) receivedEvent: (void*)data type: (RunLoopEventType)type extra: (void*)extra forMode: (NSString*)mode { RETAIN(self); if ([self isValid] == YES) { internal *this = PORT(self); NSDebugMLLog(@"NSMessagePort", @"got event on %@ in mode %@", self, mode); if (this->rEvent == (HANDLE)data) { [self receivedEventRead]; } else { [self receivedEventWrite]; } } else { NSDebugMLLog(@"NSMessagePort", @"got event on invalidated port 0x%p in mode %@", self, mode); } RELEASE(self); } - (void) removeConnection: (NSConnection*)aConnection fromRunLoop: (NSRunLoop*)aLoop forMode: (NSString*)aMode { NSDebugMLLog(@"NSMessagePort", @"%@ remove from 0x%p in mode %@", self, aLoop, aMode); [aLoop removeEvent: (void*)(uintptr_t)PORT(self)->rEvent type: ET_HANDLE forMode: aMode all: NO]; } /* * This returns the amount of space that a port coder should reserve at the * start of its encoded data so that the NSMessagePort can insert header info * into the data. * The idea is that a message consisting of a single data item with space at * the start can be written directly without having to copy data to another * buffer etc. */ - (NSUInteger) reservedSpaceLength { return sizeof(GSPortItemHeader) + sizeof(GSPortMsgHeader); } - (oneway void) release { /* We lock the port table while checking, to prevent * another thread from grabbing this port while we are * checking it. * If we are going to deallocate the object, we first remove * it from the table so that no other thread will find it * and try to use it while it is being deallocated. */ M_LOCK(messagePortLock); if (NSDecrementExtraRefCountWasZero(self)) { NSMapRemove(ports, (void*)[self name]); M_UNLOCK(messagePortLock); [self dealloc]; } else { M_UNLOCK(messagePortLock); } } - (BOOL) sendBeforeDate: (NSDate*)when msgid: (NSInteger)msgId components: (NSMutableArray*)components from: (NSPort*)receivingPort reserved: (NSUInteger)length { NSMutableData *h = nil; NSMutableData *first; BOOL sent = NO; unsigned c; unsigned i; internal *this; GSPortItemHeader *pih; GSPortMsgHeader *pmh; NSDebugMLLog(@"NSMessagePort", @"send message\n Send: %@\n Recv: %@\n Components -\n%@", self, receivingPort, components); if ([self isValid] == NO) { return NO; } this = PORT(self); if (PORT(self)->wHandle == INVALID_HANDLE_VALUE && [self _setupSendPort] == NO) { NSLog(@"Attempt to send through recv port"); } c = (unsigned)[components count]; if (c == 0) { NSLog(@"empty components sent"); return NO; } /* * If the reserved length in the first data object is wrong - we have to * fail. */ if (length != [self reservedSpaceLength]) { NSLog(@"bad reserved length - %lu", (unsigned long)length); return NO; } NSAssert([receivingPort isKindOfClass: messagePortClass] == YES, @"Receiving port is not the correct type"); NSAssert([receivingPort isValid] == YES, @"Receiving port is not valid"); NSAssert(PORT(receivingPort)->rHandle != INVALID_HANDLE_VALUE, @"Attempt to send to send port"); first = [components objectAtIndex: 0]; if (c == 1) { //h = RETAIN(first); h = [first mutableCopy]; } if (c > 1) { unsigned l = 0; id o; for (i = 1; i < c; i++) { o = [components objectAtIndex: i]; if ([o isKindOfClass: [NSData class]] == YES) { l += sizeof(GSPortItemHeader) + [o length]; } else { l += sizeof(GSPortItemHeader) + 16; // A port } } h = [[NSMutableData alloc] initWithCapacity: [first length] + l]; [h appendData: first]; for (i = 1; i < c; i++) { GSPortItemHeader ih; o = [components objectAtIndex: i]; if ([o isKindOfClass: [NSData class]] == YES) { ih.type = GSSwapHostI32ToBig(GSP_DATA); ih.length = GSSwapHostI32ToBig([o length]); [h appendBytes: &ih length: sizeof(ih)]; [h appendData: o]; } else { ih.type = GSSwapHostI32ToBig(GSP_PORT); ih.length = GSSwapHostI32ToBig(16); [h appendBytes: &ih length: sizeof(ih)]; [h appendBytes: [o UTF8String] length: 16]; } } } pih = (GSPortItemHeader*)[h mutableBytes]; pih->type = GSSwapHostI32ToBig(GSP_HEAD); pih->length = GSSwapHostI32ToBig([first length] - sizeof(GSPortItemHeader)); pmh = (GSPortMsgHeader*)&pih[1]; pmh->mId = GSSwapHostI32ToBig(msgId); pmh->nItems = GSSwapHostI32ToBig(c); pmh->version = 0; memcpy(pmh->port, [[(NSMessagePort*)receivingPort name] UTF8String], 16); /* * Now send the message. */ RETAIN(self); M_LOCK(this->lock); [this->wMsgs addObject: h]; if (this->wData == nil) { [self receivedEventWrite]; // Start async write. } if ([this->wMsgs indexOfObjectIdenticalTo: h] == NSNotFound) { sent = YES; // Write completed synchronously } else { NSRunLoop *loop = [NSRunLoop currentRunLoop]; [loop addEvent: (void*)(uintptr_t)this->wEvent type: ET_HANDLE watcher: (id)self forMode: NSConnectionReplyMode]; [loop addEvent: (void*)(uintptr_t)this->wEvent type: ET_HANDLE watcher: (id)self forMode: NSDefaultRunLoopMode]; while ([self isValid] == YES && [this->wMsgs indexOfObjectIdenticalTo: h] != NSNotFound && [when timeIntervalSinceNow] > 0) { M_UNLOCK(this->lock); NS_DURING [loop runMode: NSConnectionReplyMode beforeDate: when]; NS_HANDLER M_LOCK(this->lock); [loop removeEvent: (void*)(uintptr_t)this->wEvent type: ET_HANDLE forMode: NSConnectionReplyMode all: NO]; [loop removeEvent: (void*)(uintptr_t)this->wEvent type: ET_HANDLE forMode: NSDefaultRunLoopMode all: NO]; M_UNLOCK(this->lock); [localException raise]; NS_ENDHANDLER M_LOCK(this->lock); } [loop removeEvent: (void*)(uintptr_t)this->wEvent type: ET_HANDLE forMode: NSConnectionReplyMode all: NO]; [loop removeEvent: (void*)(uintptr_t)this->wEvent type: ET_HANDLE forMode: NSDefaultRunLoopMode all: NO]; if ([this->wMsgs indexOfObjectIdenticalTo: h] == NSNotFound) { sent = YES; } } M_UNLOCK(this->lock); RELEASE(h); RELEASE(self); return sent; } - (NSDate*) timedOutEvent: (void*)data type: (RunLoopEventType)type forMode: (NSString*)mode { return nil; } @end gnustep-base-1.29.0/Source/win32/NSMessagePortNameServer.m000066400000000000000000000253251435650067400232630ustar00rootroot00000000000000/* Implementation of message port subclass of NSPortNameServer Copyright (C) 2005 Free Software Foundation, Inc. This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. NSMessagePortNameServer class reference $Date$ $Revision$ */ #include "common.h" #include "Foundation/NSPortNameServer.h" #include "Foundation/NSAutoreleasePool.h" #include "Foundation/NSDebug.h" #include "Foundation/NSError.h" #include "Foundation/NSException.h" #include "Foundation/NSLock.h" #include "Foundation/NSMapTable.h" #include "Foundation/NSPathUtilities.h" #include "Foundation/NSPort.h" #include "Foundation/NSFileManager.h" #include "Foundation/NSValue.h" #include "Foundation/NSThread.h" #include "Foundation/NSUserDefaults.h" #include "GNUstepBase/GSMime.h" #include "../GSPrivate.h" #include "../GSPortPrivate.h" #define UNISTR(X) \ ((const unichar*)[(X) cStringUsingEncoding: NSUnicodeStringEncoding]) static NSRecursiveLock *serverLock = nil; static NSMessagePortNameServer *defaultServer = nil; static NSMapTable *portToNamesMap; static NSString *registry; static HKEY key; static SECURITY_ATTRIBUTES security; @interface NSMessagePortNameServer (private) + (NSString *) _query: (NSString *)name; + (NSString *) _translate: (NSString *)name; @end /** * Subclass of [NSPortNameServer] taking/returning instances of [NSMessagePort]. * Port removal functionality is not supported; if you want to cancel a service, * you have to destroy the port (invalidate the [NSMessagePort] given to * [NSPortNameServer-registerPort:forName:]). */ @implementation NSMessagePortNameServer - (void) atExit { NSMapEnumerator mEnum; NSMessagePort *port; NSString *name; mEnum = NSEnumerateMapTable(portToNamesMap); while (NSNextMapEnumeratorPair(&mEnum, (void *)&port, (void *)&name)) { [defaultServer removePort: port]; } NSEndMapTableEnumeration(&mEnum); DESTROY(portToNamesMap); DESTROY(serverLock); RegCloseKey(key); } + (void) initialize { if (self == [NSMessagePortNameServer class]) { int rc; serverLock = [NSRecursiveLock new]; portToNamesMap = NSCreateMapTable(NSNonRetainedObjectMapKeyCallBacks, NSObjectMapValueCallBacks, 0); [self registerAtExit]; security.nLength = sizeof(SECURITY_ATTRIBUTES); security.lpSecurityDescriptor = 0; // Default security.bInheritHandle = FALSE; registry = @"Software\\GNUstepNSMessagePort"; rc = RegCreateKeyExW( HKEY_CURRENT_USER, UNISTR(registry), 0, (LPWSTR) L"", REG_OPTION_VOLATILE, STANDARD_RIGHTS_WRITE|STANDARD_RIGHTS_READ|KEY_SET_VALUE |KEY_QUERY_VALUE|KEY_NOTIFY, &security, &key, NULL); if (rc == ERROR_SUCCESS) { rc = RegFlushKey(key); if (rc != ERROR_SUCCESS) { NSLog(@"Failed to flush registry HKEY_CURRENT_USER\\%@ (%x)", registry, rc); } } else { NSLog(@"Failed to create registry HKEY_CURRENT_USER\\%@ (%x)", registry, rc); } } } /** * Obtain single instance for this host. */ + (id) sharedInstance { if (defaultServer == nil) { [serverLock lock]; if (defaultServer == nil) { defaultServer = (NSMessagePortNameServer *)NSAllocateObject(self, 0, NSDefaultMallocZone()); } [serverLock unlock]; } return defaultServer; } + (NSString *) _query: (NSString *)name { NSString *mailslotName; NSString *translatedName; NSString *mailslotPath; unsigned char buf[1024]; unsigned char *ptr = buf; DWORD max = 1024; DWORD len = 1024; DWORD type; HANDLE h; int rc; translatedName = [[self class] _translate: name]; #if 1 /* FIXME ... wierd hack. * It appears that RegQueryValueExW does not always read from the registry, * but will in fact return cached results (even if you close and re-open the * registry key between the calls to RegQueryValueExW). This is a problem * if we look up a server which is not running, and then try to look it up * again when it is running, or if we have one address recorded but the server * has been restarted and is using a new address. * I couldn't find any mention of this behavior ... but accidentally discovered * that a call to OutputDebugStringW stops it ... presumably something in the * debug system invalidates whatever registry caching is being done. * Anyway, on my XP SP2 system, this next line is needed to fix things. * * You can test this by running a GNUstep application without starting * gdnc beforehand. If the bug is occurring, the app will try to start gdnc * then poll to connect to it, and after 5 seconds will abort because it * hasn't seen the gdnc port registered even though gdnc did start. * If the hack has fixed the bug, the app will just pause briefly during * startup (as it starts gdnc) and then continue when it finds the server * port. */ OutputDebugStringW(L""); #endif rc = RegQueryValueExW( key, UNISTR(translatedName), (LPDWORD)0, &type, (LPBYTE)ptr, &len); while (rc == ERROR_MORE_DATA) { if (ptr != buf) { free(ptr); } max += 1024; ptr = malloc(max); len = max; rc = RegQueryValueExW( key, UNISTR(translatedName), (LPDWORD)0, &type, (LPBYTE)ptr, &len); } if (rc != ERROR_SUCCESS) { if (ptr != buf) { free(ptr); } return nil; } mailslotName = [NSString stringWithUTF8String: (const char *) ptr]; if (ptr != buf) { free(ptr); } /* * See if we can open the port mailslot ... if not, the query returned * an old name, and we can remove it. */ mailslotPath = [NSString stringWithFormat: @"\\\\.\\mailslot\\GNUstep\\NSMessagePort\\%@", mailslotName]; h = CreateFileW( UNISTR(mailslotPath), GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, &security, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, (HANDLE)0); if (h == INVALID_HANDLE_VALUE) { NSDebugLLog(@"NSMessagePortNameServer", @"Failed to open mailslot (%@) for write on port named %@ - %@", mailslotPath, name, [NSError _last]); //RegDeleteValueW(key, UNISTR(n)); return nil; } else { CloseHandle(h); // OK return mailslotName; } } + (NSString *) _translate: (NSString *)name { NSData *data; /* * Make sure name is representable in the registry ... * assume base64 encoded strings are valid. */ data = [name dataUsingEncoding: NSUTF8StringEncoding]; data = [GSMimeDocument encodeBase64: data]; name = [[NSString alloc] initWithData: data encoding: NSASCIIStringEncoding]; AUTORELEASE(name); return name; } - (NSPort*) portForName: (NSString *)name { return [self portForName: name onHost: @""]; } - (NSPort*) portForName: (NSString *)name onHost: (NSString *)host { NSString *n; NSDebugLLog(@"NSMessagePortNameServer", @"portForName: %@ host: %@", name, host); if ([host length] != 0) { [NSException raise: NSInvalidArgumentException format: @"Attempt to contact a named host using a " @"message port name server. This name server can only be used " @"to contact processes owned by the same user on the local host " @"(host name must be an empty string). To contact processes " @"owned by other users or on other hosts you must use an instance " @"of the NSSocketPortNameServer class."]; } n = [[self class] _query: name]; if (n == nil) { NSDebugLLog(@"NSMessagePortNameServer", @"got no port for %@", name); return nil; } else { NSDebugLLog(@"NSMessagePortNameServer", @"got %@ for %@", n, name); return AUTORELEASE([NSMessagePort newWithName: n]); } } - (BOOL) registerPort: (NSPort *)port forName: (NSString *)name { NSMutableArray *a; NSString *n; int rc; const unsigned char *str; NSDebugLLog(@"NSMessagePortNameServer", @"register %@ as %@\n", port, name); if ([port isKindOfClass: [NSMessagePort class]] == NO) { [NSException raise: NSInvalidArgumentException format: @"Attempted to register a non-NSMessagePort (%@)", port]; return NO; } if ([[self class] _query: name] != nil) { NSDebugLLog(@"NSMessagePortNameServer", @"fail, is a live port"); return NO; } n = [[self class] _translate: name]; str = (const unsigned char *) [[(NSMessagePort*)port name] UTF8String]; rc = RegSetValueExW( key, UNISTR(n), 0, REG_BINARY, str, strlen((const char*) str)+1); NSDebugLLog(@"NSMessagePortNameServer", @"Set port '%s' for %@", str, n); if (rc == ERROR_SUCCESS) { rc = RegFlushKey(key); if (rc != ERROR_SUCCESS) { NSLog(@"Failed to flush registry HKEY_CURRENT_USER\\%@\\%@ (%x)", registry, n, rc); } } else { NSLog(@"Failed to insert HKEY_CURRENT_USER\\%@\\%@ (%x) %@", registry, n, rc, [NSError _last]); return NO; } [serverLock lock]; a = NSMapGet(portToNamesMap, port); if (a != nil) { a = [[NSMutableArray alloc] init]; NSMapInsert(portToNamesMap, port, a); RELEASE(a); } [a addObject: [name copy]]; [serverLock unlock]; return YES; } - (BOOL) removePortForName: (NSString *)name { NSString *n; NSDebugLLog(@"NSMessagePortNameServer", @"removePortForName: %@", name); n = [[self class] _translate: name]; (void)RegDeleteValueW(key, UNISTR(n)); return YES; } - (NSArray *) namesForPort: (NSPort *)port { NSMutableArray *a; [serverLock lock]; a = NSMapGet(portToNamesMap, port); a = [a copy]; [serverLock unlock]; return AUTORELEASE(a); } - (BOOL) removePort: (NSPort *)port { NSMutableArray *a; int i; NSDebugLLog(@"NSMessagePortNameServer", @"removePort: %@", port); [serverLock lock]; a = NSMapGet(portToNamesMap, port); for (i = 0; i < [a count]; i++) { [self removePort: port forName: [a objectAtIndex: i]]; } NSMapRemove(portToNamesMap, port); [serverLock unlock]; return YES; } - (BOOL) removePort: (NSPort*)port forName: (NSString*)name { NSDebugLLog(@"NSMessagePortNameServer", @"removePort: %@ forName: %@", port, name); if ([self portForName: name onHost: @""] == port) { return [self removePortForName: name]; } return NO; } @end gnustep-base-1.29.0/Source/win32/NSStream.m000066400000000000000000000741641435650067400203020ustar00rootroot00000000000000/** Implementation for NSStream for GNUStep Copyright (C) 2006 Free Software Foundation, Inc. Written by: Derek Zhou Written by: Richard Frith-Macdonald Date: 2006 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #include "common.h" #import "Foundation/NSData.h" #import "Foundation/NSArray.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSRunLoop.h" #import "Foundation/NSException.h" #import "Foundation/NSError.h" #import "Foundation/NSValue.h" #import "Foundation/NSHost.h" #import "Foundation/NSProcessInfo.h" #import "Foundation/NSByteOrder.h" #import "Foundation/NSURL.h" #import "GNUstepBase/NSObject+GNUstepBase.h" #import "../GSPrivate.h" #import "../GSStream.h" #import "../GSSocketStream.h" #define BUFFERSIZE (BUFSIZ*64) /** * The concrete subclass of NSInputStream that reads from a file */ @interface GSFileInputStream : GSInputStream { @private NSString *_path; } @end @class GSPipeOutputStream; /** * The concrete subclass of NSInputStream that reads from a pipe */ @interface GSPipeInputStream : GSInputStream { HANDLE handle; OVERLAPPED ov; uint8_t data[BUFFERSIZE]; unsigned offset; // Read pointer within buffer unsigned length; // Amount of data in buffer unsigned want; // Amount of data we want to read. DWORD size; // Number of bytes returned by read. GSPipeOutputStream *_sibling; BOOL hadEOF; } - (NSStreamStatus) _check; - (void) _queue; - (void) _setHandle: (HANDLE)h; - (void) _setSibling: (GSPipeOutputStream*)s; @end /** * The concrete subclass of NSOutputStream that writes to a file */ @interface GSFileOutputStream : GSOutputStream { @private NSString *_path; BOOL _shouldAppend; } @end /** * The concrete subclass of NSOutputStream that reads from a pipe */ @interface GSPipeOutputStream : GSOutputStream { HANDLE handle; OVERLAPPED ov; uint8_t data[BUFFERSIZE]; unsigned offset; unsigned want; DWORD size; GSPipeInputStream *_sibling; BOOL closing; BOOL writtenEOF; } - (NSStreamStatus) _check; - (void) _queue; - (void) _setHandle: (HANDLE)h; - (void) _setSibling: (GSPipeInputStream*)s; @end /** * The concrete subclass of NSServerStream that accepts named pipe connection */ @interface GSLocalServerStream : GSAbstractServerStream { NSString *path; HANDLE handle; OVERLAPPED ov; } @end @implementation GSFileInputStream - (void) close { if (_loopID != (void*)INVALID_HANDLE_VALUE) { if (CloseHandle((HANDLE)_loopID) == 0) { [self _recordError]; } } [super close]; _loopID = (void*)INVALID_HANDLE_VALUE; } - (void) dealloc { if ([self _isOpened]) { [self close]; } RELEASE(_path); [super dealloc]; } - (BOOL) getBuffer: (uint8_t **)buffer length: (NSUInteger *)len { return NO; } - (BOOL) hasBytesAvailable { if ([self _isOpened] && [self streamStatus] != NSStreamStatusAtEnd) return YES; return NO; } - (id) initWithFileAtPath: (NSString *)path { if ((self = [super init]) != nil) { ASSIGN(_path, path); } return self; } - (void) open { HANDLE h; h = (void*)CreateFileW([_path fileSystemRepresentation], GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0); if (h == INVALID_HANDLE_VALUE) { [self _recordError]; return; } [self _setLoopID: (void*)h]; [super open]; } - (id) propertyForKey: (NSString *)key { if ([key isEqualToString: NSStreamFileCurrentOffsetKey]) { DWORD offset = 0; if ([self _isOpened]) offset = SetFilePointer((HANDLE)_loopID, 0, 0, FILE_CURRENT); return [NSNumber numberWithLong: (long)offset]; } return [super propertyForKey: key]; } - (NSInteger) read: (uint8_t *)buffer maxLength: (NSUInteger)len { DWORD readLen; if (buffer == 0) { [NSException raise: NSInvalidArgumentException format: @"null pointer for buffer"]; } if (len == 0) { [NSException raise: NSInvalidArgumentException format: @"zero byte length read requested"]; } _events &= ~NSStreamEventHasBytesAvailable; if ([self streamStatus] == NSStreamStatusClosed) { return 0; } if (ReadFile((HANDLE)_loopID, buffer, len, &readLen, NULL) == 0) { [self _recordError]; return -1; } else if (readLen == 0) { [self _setStatus: NSStreamStatusAtEnd]; } return (NSInteger)readLen; } - (void) _dispatch { BOOL av = [self hasBytesAvailable]; NSStreamEvent myEvent = av ? NSStreamEventHasBytesAvailable : NSStreamEventEndEncountered; NSStreamStatus myStatus = av ? NSStreamStatusOpen : NSStreamStatusAtEnd; [self _setStatus: myStatus]; [self _sendEvent: myEvent]; } @end @implementation GSPipeInputStream - (void) close { length = offset = 0; if (_loopID != INVALID_HANDLE_VALUE) { CloseHandle((HANDLE)_loopID); } if (handle != INVALID_HANDLE_VALUE) { /* If we have an outstanding read in progess, we must cancel it * before closing the pipe. */ if (want > 0) { want = 0; CancelIo(handle); } /* We can only close the pipe if there is no sibling using it. */ if ([_sibling _isOpened] == NO) { if (DisconnectNamedPipe(handle) == 0) { if ((errno = GetLastError()) != ERROR_PIPE_NOT_CONNECTED) { [self _recordError]; } } if (CloseHandle(handle) == 0) { [self _recordError]; } } handle = INVALID_HANDLE_VALUE; } [super close]; _loopID = (void*)INVALID_HANDLE_VALUE; } - (void) dealloc { if ([self _isOpened]) { [self close]; } [_sibling _setSibling: nil]; _sibling = nil; [super dealloc]; } - (BOOL) getBuffer: (uint8_t **)buffer length: (NSUInteger *)len { if (offset < length) { *buffer = data + offset; *len = length - offset; } return NO; } - (id) init { if ((self = [super init]) != nil) { handle = INVALID_HANDLE_VALUE; _loopID = (void*)INVALID_HANDLE_VALUE; } return self; } - (void) open { if (_loopID == (void*)INVALID_HANDLE_VALUE) { _loopID = (void*)CreateEvent(NULL, FALSE, FALSE, NULL); } [super open]; [self _queue]; } - (NSStreamStatus) _check { // Must only be called when current status is NSStreamStatusReading. if (GetOverlappedResult(handle, &ov, &size, TRUE) == 0) { if ((errno = GetLastError()) == ERROR_HANDLE_EOF || errno == ERROR_PIPE_NOT_CONNECTED || errno == ERROR_BROKEN_PIPE) { /* * Got EOF, but we don't want to register it until a * -read:maxLength: is called. */ offset = length = want = 0; [self _setStatus: NSStreamStatusOpen]; hadEOF = YES; } else if (errno != ERROR_IO_PENDING) { /* * Got an error ... record it. */ want = 0; [self _recordError]; } } else if (size == 0) { length = want = 0; [self _setStatus: NSStreamStatusOpen]; hadEOF = YES; } else { /* * Read completed and some data was read. */ length = size; [self _setStatus: NSStreamStatusOpen]; } return [self streamStatus]; } - (void) _queue { if (hadEOF == NO && [self streamStatus] == NSStreamStatusOpen) { int rc; want = sizeof(data); ov.Offset = 0; ov.OffsetHigh = 0; ov.hEvent = (HANDLE)_loopID; rc = ReadFile(handle, data, want, &size, &ov); if (rc != 0) { // Read succeeded want = 0; length = size; if (length == 0) { hadEOF = YES; } } else if ((errno = GetLastError()) == ERROR_HANDLE_EOF || errno == ERROR_PIPE_NOT_CONNECTED || errno == ERROR_BROKEN_PIPE) { hadEOF = YES; } else if (errno != ERROR_IO_PENDING) { [self _recordError]; } else { [self _setStatus: NSStreamStatusReading]; } } } - (NSInteger) read: (uint8_t *)buffer maxLength: (NSUInteger)len { NSStreamStatus myStatus; if (buffer == 0) { [NSException raise: NSInvalidArgumentException format: @"null pointer for buffer"]; } if (len == 0) { [NSException raise: NSInvalidArgumentException format: @"zero byte length read requested"]; } _events &= ~NSStreamEventHasBytesAvailable; myStatus = [self streamStatus]; if (myStatus == NSStreamStatusReading) { myStatus = [self _check]; } if (myStatus == NSStreamStatusClosed) { return 0; } if (offset == length) { if (myStatus == NSStreamStatusError) { return -1; // Waiting for read. } if (myStatus == NSStreamStatusOpen) { /* * There is no buffered data and no read in progress, * so we must be at EOF. */ [self _setStatus: NSStreamStatusAtEnd]; } return 0; } /* * We already have data buffered ... return some or all of it. */ if (len > (length - offset)) { len = length - offset; } memcpy(buffer, data + offset, len); offset += len; if (offset == length) { length = 0; offset = 0; if (myStatus == NSStreamStatusOpen) { [self _queue]; // Queue another read } } return len; } - (void) _setHandle: (HANDLE)h { handle = h; } - (void) _setSibling: (GSPipeOutputStream*)s { _sibling = s; } - (void) _dispatch { NSStreamEvent myEvent; NSStreamStatus oldStatus = [self streamStatus]; NSStreamStatus myStatus = oldStatus; if (myStatus == NSStreamStatusReading || myStatus == NSStreamStatusOpening) { myStatus = [self _check]; } if (myStatus == NSStreamStatusAtEnd) { myEvent = NSStreamEventEndEncountered; } else if (myStatus == NSStreamStatusError) { myEvent = NSStreamEventErrorOccurred; } else if (oldStatus == NSStreamStatusOpening) { myEvent = NSStreamEventOpenCompleted; } else { myEvent = NSStreamEventHasBytesAvailable; } [self _sendEvent: myEvent]; } - (BOOL) runLoopShouldBlock: (BOOL*)trigger { NSStreamStatus myStatus = [self streamStatus]; if ([self _unhandledData] == YES || myStatus == NSStreamStatusError) { *trigger = NO; return NO; } *trigger = YES; if (myStatus == NSStreamStatusReading) { return YES; // Need to wait for I/O } return NO; // Need to signal for an event } @end @implementation GSFileOutputStream - (void) close { if (_loopID != (void*)INVALID_HANDLE_VALUE) { if (CloseHandle((HANDLE)_loopID) == 0) { [self _recordError]; } } [super close]; _loopID = (void*)INVALID_HANDLE_VALUE; } - (void) dealloc { if ([self _isOpened]) { [self close]; } RELEASE(_path); [super dealloc]; } - (id) initToFileAtPath: (NSString *)path append: (BOOL)shouldAppend { if ((self = [super init]) != nil) { ASSIGN(_path, path); _shouldAppend = shouldAppend; } return self; } - (void) open { HANDLE h; h = (void*)CreateFileW([_path fileSystemRepresentation], GENERIC_WRITE, FILE_SHARE_WRITE, 0, OPEN_ALWAYS, 0, 0); if (h == INVALID_HANDLE_VALUE) { [self _recordError]; return; } else if (_shouldAppend == NO) { if (SetEndOfFile(h) == 0) // Truncate to current file pointer (0) { [self _recordError]; CloseHandle(h); return; } } [self _setLoopID: (void*)h]; [super open]; } - (id) propertyForKey: (NSString *)key { if ([key isEqualToString: NSStreamFileCurrentOffsetKey]) { DWORD offset = 0; if ([self _isOpened]) offset = SetFilePointer((HANDLE)_loopID, 0, 0, FILE_CURRENT); return [NSNumber numberWithLong: (long)offset]; } return [super propertyForKey: key]; } - (NSInteger) write: (const uint8_t *)buffer maxLength: (NSUInteger)len { DWORD writeLen; if (buffer == 0) { [NSException raise: NSInvalidArgumentException format: @"null pointer for buffer"]; } if (len == 0) { [NSException raise: NSInvalidArgumentException format: @"zero byte length write requested"]; } _events &= ~NSStreamEventHasSpaceAvailable; if ([self streamStatus] == NSStreamStatusClosed) { return 0; } if (_shouldAppend == YES) { SetFilePointer((HANDLE)_loopID, 0, 0, FILE_END); } if (WriteFile((HANDLE)_loopID, buffer, len, &writeLen, NULL) == 0) { [self _recordError]; return -1; } return (NSInteger)writeLen; } - (void) _dispatch { BOOL av = [self hasSpaceAvailable]; NSStreamEvent myEvent = av ? NSStreamEventHasSpaceAvailable : NSStreamEventEndEncountered; [self _sendEvent: myEvent]; } @end @implementation GSPipeOutputStream - (void) close { /* If we have a write in progress, we must wait for it to complete, * so we just set a flag to close as soon as the write finishes. */ if ([self streamStatus] == NSStreamStatusWriting) { closing = YES; return; } /* Where we have a sibling, we can't close the pipe handle, so the * only way to tell the remote end we have finished is to write a * zero length packet to it. */ if ([_sibling _isOpened] == YES && writtenEOF == NO) { int rc; writtenEOF = YES; ov.Offset = 0; ov.OffsetHigh = 0; ov.hEvent = (HANDLE)_loopID; size = 0; rc = WriteFile(handle, "", 0, &size, &ov); if (rc == 0) { if ((errno = GetLastError()) == ERROR_IO_PENDING) { [self _setStatus: NSStreamStatusWriting]; return; // Wait for write to complete } [self _recordError]; // Failed to write EOF } } offset = want = 0; if (_loopID != INVALID_HANDLE_VALUE) { CloseHandle((HANDLE)_loopID); } if (handle != INVALID_HANDLE_VALUE) { if ([_sibling _isOpened] == NO) { if (DisconnectNamedPipe(handle) == 0) { if ((errno = GetLastError()) != ERROR_PIPE_NOT_CONNECTED) { [self _recordError]; } [self _recordError]; } if (CloseHandle(handle) == 0) { [self _recordError]; } } handle = INVALID_HANDLE_VALUE; } [super close]; _loopID = (void*)INVALID_HANDLE_VALUE; } - (void) dealloc { if ([self _isOpened]) { [self close]; } [_sibling _setSibling: nil]; _sibling = nil; [super dealloc]; } - (id) init { if ((self = [super init]) != nil) { handle = INVALID_HANDLE_VALUE; _loopID = (void*)INVALID_HANDLE_VALUE; } return self; } - (void) open { if (_loopID == (void*)INVALID_HANDLE_VALUE) { _loopID = (void*)CreateEvent(NULL, FALSE, FALSE, NULL); } [super open]; } - (void) _queue { NSStreamStatus myStatus = [self streamStatus]; if (myStatus == NSStreamStatusOpen) { while (offset < want) { int rc; ov.Offset = 0; ov.OffsetHigh = 0; ov.hEvent = (HANDLE)_loopID; size = 0; rc = WriteFile(handle, data + offset, want - offset, &size, &ov); if (rc != 0) { offset += size; if (offset == want) { offset = want = 0; } } else if ((errno = GetLastError()) == ERROR_IO_PENDING) { [self _setStatus: NSStreamStatusWriting]; break; } else { [self _recordError]; break; } } } } - (NSInteger) write: (const uint8_t *)buffer maxLength: (NSUInteger)len { NSStreamStatus myStatus = [self streamStatus]; if (buffer == 0) { [NSException raise: NSInvalidArgumentException format: @"null pointer for buffer"]; } if (len == 0) { [NSException raise: NSInvalidArgumentException format: @"zero byte length write requested"]; } _events &= ~NSStreamEventHasSpaceAvailable; if (myStatus == NSStreamStatusWriting) { myStatus = [self _check]; } if (myStatus == NSStreamStatusClosed) { return 0; } if ((myStatus != NSStreamStatusOpen && myStatus != NSStreamStatusWriting)) { return -1; } if (len > (sizeof(data) - offset)) { len = sizeof(data) - offset; } if (len > 0) { memcpy(data + offset, buffer, len); want = offset + len; [self _queue]; } return len; } - (NSStreamStatus) _check { // Must only be called when current status is NSStreamStatusWriting. if (GetOverlappedResult(handle, &ov, &size, TRUE) == 0) { errno = GetLastError(); if (errno != ERROR_IO_PENDING) { offset = 0; want = 0; [self _recordError]; } } else { [self _setStatus: NSStreamStatusOpen]; offset += size; if (offset < want) { [self _queue]; } else { offset = want = 0; } } if (closing == YES && [self streamStatus] != NSStreamStatusWriting) { [self close]; } return [self streamStatus]; } - (void) _setHandle: (HANDLE)h { handle = h; } - (void) _setSibling: (GSPipeInputStream*)s { _sibling = s; } - (void) _dispatch { NSStreamEvent myEvent; NSStreamStatus oldStatus = [self streamStatus]; NSStreamStatus myStatus = oldStatus; if (myStatus == NSStreamStatusWriting || myStatus == NSStreamStatusOpening) { myStatus = [self _check]; } if (myStatus == NSStreamStatusAtEnd) { myEvent = NSStreamEventEndEncountered; } else if (myStatus == NSStreamStatusError) { myEvent = NSStreamEventErrorOccurred; } else if (oldStatus == NSStreamStatusOpening) { myEvent = NSStreamEventOpenCompleted; } else { myEvent = NSStreamEventHasSpaceAvailable; } [self _sendEvent: myEvent]; } - (BOOL) runLoopShouldBlock: (BOOL*)trigger { NSStreamStatus myStatus = [self streamStatus]; if ([self _unhandledData] == YES || myStatus == NSStreamStatusError) { *trigger = NO; return NO; } *trigger = YES; if (myStatus == NSStreamStatusWriting) { return YES; } return NO; } @end @implementation NSStream + (void) getStreamsToHost: (NSHost *)host port: (NSInteger)port inputStream: (NSInputStream **)inputStream outputStream: (NSOutputStream **)outputStream { NSString *address = host ? (id)[host address] : (id)@"127.0.0.1"; GSSocketStream *ins = nil; GSSocketStream *outs = nil; int sock; ins = AUTORELEASE([[GSInetInputStream alloc] initToAddr: address port: port]); outs = AUTORELEASE([[GSInetOutputStream alloc] initToAddr: address port: port]); sock = socket(PF_INET, SOCK_STREAM, 0); /* * Windows only permits a single event to be associated with a socket * at any time, but the runloop system only allows an event handle to * be added to the loop once, and we have two streams. * So we create two events, one for each stream, so that we can have * both streams scheduled in the run loop, but we make sure that the * _dispatch method in each stream actually handles things for both * streams so that whichever stream gets signalled, the correct * actions are taken. */ NSAssert(sock != INVALID_SOCKET, @"Cannot open socket"); [ins _setSock: sock]; [outs _setSock: sock]; if (inputStream) { [ins _setSibling: outs]; *inputStream = (NSInputStream*)ins; } if (outputStream) { [outs _setSibling: ins]; *outputStream = (NSOutputStream*)outs; } return; } + (void) getLocalStreamsToPath: (NSString *)path inputStream: (NSInputStream **)inputStream outputStream: (NSOutputStream **)outputStream { const unichar *name; GSPipeInputStream *ins = nil; GSPipeOutputStream *outs = nil; SECURITY_ATTRIBUTES saAttr; HANDLE handle; if ([path length] == 0) { NSDebugMLog(@"address nil or empty"); goto done; } if ([path length] > 240) { NSDebugMLog(@"address (%@) too long", path); goto done; } if ([path rangeOfString: @"\\"].length > 0) { NSDebugMLog(@"illegal backslash in (%@)", path); goto done; } if ([path rangeOfString: @"/"].length > 0) { NSDebugMLog(@"illegal slash in (%@)", path); goto done; } /* * We allocate a new within the local pipe area */ name = [[@"\\\\.\\pipe\\GSLocal" stringByAppendingString: path] fileSystemRepresentation]; saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); saAttr.bInheritHandle = FALSE; saAttr.lpSecurityDescriptor = NULL; handle = CreateFileW(name, GENERIC_WRITE|GENERIC_READ, 0, &saAttr, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); if (handle == INVALID_HANDLE_VALUE) { [NSException raise: NSInternalInconsistencyException format: @"Unable to open named pipe '%@'... %@", path, [NSError _last]]; } // the type of the stream does not matter, since we are only using the fd ins = AUTORELEASE([GSPipeInputStream new]); outs = AUTORELEASE([GSPipeOutputStream new]); [ins _setHandle: handle]; [ins _setSibling: outs]; [outs _setHandle: handle]; [outs _setSibling: ins]; done: if (inputStream) { *inputStream = ins; } if (outputStream) { *outputStream = outs; } } + (void) pipeWithInputStream: (NSInputStream **)inputStream outputStream: (NSOutputStream **)outputStream { const unichar *name; GSPipeInputStream *ins = nil; GSPipeOutputStream *outs = nil; SECURITY_ATTRIBUTES saAttr; HANDLE readh; HANDLE writeh; HANDLE event; OVERLAPPED ov; int rc; saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); saAttr.bInheritHandle = FALSE; saAttr.lpSecurityDescriptor = NULL; /* * We have to use a named pipe since windows anonymous pipes do not * support asynchronous I/O! * We allocate a name known to be unique. */ name = [[@"\\\\.\\pipe\\" stringByAppendingString: [[NSProcessInfo processInfo] globallyUniqueString]] fileSystemRepresentation]; readh = CreateNamedPipeW(name, PIPE_ACCESS_INBOUND | FILE_FLAG_OVERLAPPED, PIPE_TYPE_BYTE, 1, BUFSIZ*64, BUFSIZ*64, 100000, &saAttr); NSAssert(readh != INVALID_HANDLE_VALUE, @"Cannot create pipe"); // Start async connect event = CreateEvent(NULL, NO, NO, NULL); ov.Offset = 0; ov.OffsetHigh = 0; ov.hEvent = event; ConnectNamedPipe(readh, &ov); writeh = CreateFileW(name, GENERIC_WRITE, 0, &saAttr, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); if (writeh == INVALID_HANDLE_VALUE) { CloseHandle(event); CloseHandle(readh); [NSException raise: NSInternalInconsistencyException format: @"Unable to create/open write pipe"]; } rc = WaitForSingleObject(event, 10); CloseHandle(event); if (rc != WAIT_OBJECT_0) { CloseHandle(readh); CloseHandle(writeh); [NSException raise: NSInternalInconsistencyException format: @"Unable to create/open read pipe"]; } // the type of the stream does not matter, since we are only using the fd ins = AUTORELEASE([GSPipeInputStream new]); outs = AUTORELEASE([GSPipeOutputStream new]); [ins _setHandle: readh]; [outs _setHandle: writeh]; if (inputStream) *inputStream = ins; if (outputStream) *outputStream = outs; } - (void) close { [self subclassResponsibility: _cmd]; } - (void) open { [self subclassResponsibility: _cmd]; } - (void) setDelegate: (id)delegate { [self subclassResponsibility: _cmd]; } - (id) delegate { [self subclassResponsibility: _cmd]; return nil; } - (BOOL) setProperty: (id)property forKey: (NSString *)key { [self subclassResponsibility: _cmd]; return NO; } - (id) propertyForKey: (NSString *)key { [self subclassResponsibility: _cmd]; return nil; } - (void) scheduleInRunLoop: (NSRunLoop *)aRunLoop forMode: (NSString *)mode { [self subclassResponsibility: _cmd]; } - (void) removeFromRunLoop: (NSRunLoop *)aRunLoop forMode: (NSString *)mode; { [self subclassResponsibility: _cmd]; } - (NSError *) streamError { [self subclassResponsibility: _cmd]; return nil; } - (NSStreamStatus) streamStatus { [self subclassResponsibility: _cmd]; return 0; } @end @implementation NSInputStream + (id) inputStreamWithData: (NSData *)data { return AUTORELEASE([[GSDataInputStream alloc] initWithData: data]); } + (id) inputStreamWithFileAtPath: (NSString *)path { return AUTORELEASE([[GSFileInputStream alloc] initWithFileAtPath: path]); } + (id) inputStreamWithURL: (NSURL *)url { if ([url isFileURL]) { return [self inputStreamWithFileAtPath: [url path]]; } return [self inputStreamWithData: [url resourceDataUsingCache: YES]]; } - (BOOL) getBuffer: (uint8_t **)buffer length: (NSUInteger *)len { [self subclassResponsibility: _cmd]; return NO; } - (BOOL) hasBytesAvailable { [self subclassResponsibility: _cmd]; return NO; } - (id) initWithData: (NSData *)data { DESTROY(self); return [[GSDataInputStream alloc] initWithData: data]; } - (id) initWithFileAtPath: (NSString *)path { DESTROY(self); return [[GSFileInputStream alloc] initWithFileAtPath: path]; } - (id) initWithURL: (NSURL *)url { DESTROY(self); if ([url isFileURL]) { return [[GSFileInputStream alloc] initWithFileAtPath: [url path]]; } return [[GSDataInputStream alloc] initWithData: [url resourceDataUsingCache: YES]]; } - (NSInteger) read: (uint8_t *)buffer maxLength: (NSUInteger)len { [self subclassResponsibility: _cmd]; return -1; } @end @implementation NSOutputStream + (id) outputStreamToMemory { return AUTORELEASE([[GSDataOutputStream alloc] init]); } + (id) outputStreamToBuffer: (uint8_t *)buffer capacity: (NSUInteger)capacity { return AUTORELEASE([[GSBufferOutputStream alloc] initToBuffer: buffer capacity: capacity]); } + (id) outputStreamToFileAtPath: (NSString *)path append: (BOOL)shouldAppend { return AUTORELEASE([[GSFileOutputStream alloc] initToFileAtPath: path append: shouldAppend]); } - (BOOL) hasSpaceAvailable { [self subclassResponsibility: _cmd]; return NO; } - (id) initToBuffer: (uint8_t *)buffer capacity: (NSUInteger)capacity { DESTROY(self); return [[GSBufferOutputStream alloc] initToBuffer: buffer capacity: capacity]; } - (id) initToFileAtPath: (NSString *)path append: (BOOL)shouldAppend { DESTROY(self); return [[GSFileOutputStream alloc] initToFileAtPath: path append: shouldAppend]; } - (id) initToMemory { DESTROY(self); return [[GSDataOutputStream alloc] init]; } - (NSInteger) write: (const uint8_t *)buffer maxLength: (NSUInteger)len { [self subclassResponsibility: _cmd]; return -1; } @end @implementation GSLocalServerStream - (id) init { DESTROY(self); return self; } - (id) initToAddr: (NSString*)addr { if ([addr length] == 0) { NSDebugMLog(@"address nil or empty"); DESTROY(self); } if ([addr length] > 246) { NSDebugMLog(@"address (%@) too long", addr); DESTROY(self); } if ([addr rangeOfString: @"\\"].length > 0) { NSDebugMLog(@"illegal backslash in (%@)", addr); DESTROY(self); } if ([addr rangeOfString: @"/"].length > 0) { NSDebugMLog(@"illegal slash in (%@)", addr); DESTROY(self); } if ((self = [super init]) != nil) { path = RETAIN([@"\\\\.\\pipe\\GSLocal" stringByAppendingString: addr]); _loopID = INVALID_HANDLE_VALUE; handle = INVALID_HANDLE_VALUE; } return self; } - (void) dealloc { if ([self _isOpened]) { [self close]; } RELEASE(path); [super dealloc]; } - (void) open { SECURITY_ATTRIBUTES saAttr; BOOL alreadyConnected = NO; NSAssert(handle == INVALID_HANDLE_VALUE, NSInternalInconsistencyException); saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); saAttr.bInheritHandle = FALSE; saAttr.lpSecurityDescriptor = NULL; handle = CreateNamedPipeW([path fileSystemRepresentation], PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, PIPE_TYPE_MESSAGE, PIPE_UNLIMITED_INSTANCES, BUFSIZ*64, BUFSIZ*64, 100000, &saAttr); if (handle == INVALID_HANDLE_VALUE) { [self _recordError]; return; } if ([self _loopID] == INVALID_HANDLE_VALUE) { /* No existing event to use ..,. create a new one. */ [self _setLoopID: CreateEvent(NULL, NO, NO, NULL)]; } ov.Offset = 0; ov.OffsetHigh = 0; ov.hEvent = [self _loopID]; if (ConnectNamedPipe(handle, &ov) == 0) { errno = GetLastError(); if (errno == ERROR_PIPE_CONNECTED) { alreadyConnected = YES; } else if (errno != ERROR_IO_PENDING) { [self _recordError]; return; } } if ([self _isOpened] == NO) { [super open]; } if (alreadyConnected == YES) { [self _setStatus: NSStreamStatusOpen]; } } - (void) close { if (_loopID != INVALID_HANDLE_VALUE) { CloseHandle((HANDLE)_loopID); } if (handle != INVALID_HANDLE_VALUE) { CancelIo(handle); if (CloseHandle(handle) == 0) { [self _recordError]; } handle = INVALID_HANDLE_VALUE; } [super close]; _loopID = INVALID_HANDLE_VALUE; } - (void) acceptWithInputStream: (NSInputStream **)inputStream outputStream: (NSOutputStream **)outputStream { GSPipeInputStream *ins = nil; GSPipeOutputStream *outs = nil; _events &= ~NSStreamEventHasBytesAvailable; // the type of the stream does not matter, since we are only using the fd ins = AUTORELEASE([GSPipeInputStream new]); outs = AUTORELEASE([GSPipeOutputStream new]); [ins _setHandle: handle]; [outs _setHandle: handle]; handle = INVALID_HANDLE_VALUE; [self open]; // Re-open to accept more if (inputStream) { [ins _setSibling: outs]; *inputStream = ins; } if (outputStream) { [outs _setSibling: ins]; *outputStream = outs; } } - (void) _dispatch { DWORD size; if (GetOverlappedResult(handle, &ov, &size, TRUE) == 0) { [self _recordError]; [self _sendEvent: NSStreamEventErrorOccurred]; } else { [self _setStatus: NSStreamStatusOpen]; [self _sendEvent: NSStreamEventHasBytesAvailable]; } } @end gnustep-base-1.29.0/Source/win32/NSUserDefaults.m000066400000000000000000000350541435650067400214500ustar00rootroot00000000000000#import "common.h" #import "Foundation/NSUserDefaults.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSException.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSArray.h" #import "Foundation/NSLock.h" #import "Foundation/NSFileManager.h" #import "Foundation/NSMapTable.h" #import "Foundation/NSPathUtilities.h" #import "Foundation/NSProcessInfo.h" #define UNISTR(X) \ ((const unichar*)[(X) cStringUsingEncoding: NSUnicodeStringEncoding]) extern void GSPropertyListMake(id,NSDictionary*,BOOL,BOOL,unsigned,id*); @interface NSUserDefaults (Private) - (id) initWithContentsOfFile: (NSString*)fielName; @end @interface NSUserDefaultsWin32 : NSUserDefaults { NSString *registryPrefix; NSMapTable *registryInfo; } @end @interface NSUserDefaults (Secrets) - (id) initWithContentsOfFile: (NSString*)aPath; - (BOOL) lockDefaultsFile: (BOOL*)wasLocked; - (void) unlockDefaultsFile; - (NSMutableDictionary*) readDefaults; - (BOOL) wantToReadDefaultsSince: (NSDate*)lastSyncDate; - (BOOL) writeDefaults: (NSDictionary*)defaults oldData: (NSDictionary*)oldData; @end struct NSUserDefaultsWin32_DomainInfo { HKEY userKey; HKEY systemKey; }; @implementation NSUserDefaultsWin32 - (void) dealloc { DESTROY(registryPrefix); if (registryInfo != 0) { NSMapEnumerator iter = NSEnumerateMapTable(registryInfo); NSString *domain; struct NSUserDefaultsWin32_DomainInfo *dinfo; while (NSNextMapEnumeratorPair(&iter, (void**)&domain, (void**)&dinfo)) { LONG rc; if (dinfo->userKey) { rc = RegCloseKey(dinfo->userKey); if (rc != ERROR_SUCCESS) { NSString *dPath; dPath = [registryPrefix stringByAppendingString: domain]; NSLog(@"Failed to close registry HKEY_CURRENT_USER\\%@ (%lx)", dPath, rc); } } if (dinfo->systemKey) { rc = RegCloseKey(dinfo->systemKey); if (rc != ERROR_SUCCESS) { NSString *dPath; dPath = [registryPrefix stringByAppendingString: domain]; NSLog(@"Failed to close registry HKEY_LOCAL_MACHINE\\%@ (%lx)", dPath, rc); } } } NSEndMapTableEnumeration(&iter); NSResetMapTable(registryInfo); NSFreeMapTable(registryInfo); registryInfo = 0; } [super dealloc]; } - (id) initWithUser: (NSString*)userName { NSString *path; NSRange r; NSAssert([userName isEqual: NSUserName()], @"NSUserDefaultsWin32 doesn't support reading/writing to users other than the current user."); path = GSDefaultsRootForUser(userName); r = [path rangeOfString: @":REGISTRY:"]; NSAssert(r.length > 0, @"NSUserDefaultsWin32 should only be used if defaults directory is :REGISTRY:"); path = [path substringFromIndex: NSMaxRange(r)]; if ([path length] == 0) { path = @"Software\\GNUstep\\"; } else if ([path hasSuffix: @"\\"] == NO) { path = [path stringByAppendingString: @"\\"]; } registryPrefix = RETAIN(path); self = [super initWithContentsOfFile: @":REGISTRY:"]; return self; } - (BOOL) lockDefaultsFile: (BOOL*)wasLocked { *wasLocked = NO; return YES; } - (NSMutableDictionary*) readDefaults { NSArray *allDomains; NSEnumerator *iter; NSString *persistentDomain; NSMutableDictionary *newDict = nil; allDomains = [self persistentDomainNames]; if ([allDomains count] == 0) { allDomains = [NSArray arrayWithObjects: [[NSProcessInfo processInfo] processName], NSGlobalDomain, nil]; } if (registryInfo == 0) { registryInfo = NSCreateMapTable(NSObjectMapKeyCallBacks, NSOwnedPointerMapValueCallBacks, [allDomains count]); } newDict = [NSMutableDictionary dictionary]; iter = [allDomains objectEnumerator]; while ((persistentDomain = [iter nextObject]) != nil) { NSMutableDictionary *domainDict; struct NSUserDefaultsWin32_DomainInfo *dinfo; NSString *dPath; LONG rc; dinfo = NSMapGet(registryInfo, persistentDomain); if (dinfo == 0) { dinfo = calloc(sizeof(struct NSUserDefaultsWin32_DomainInfo), 1); NSMapInsertKnownAbsent(registryInfo, persistentDomain, dinfo); } dPath = [registryPrefix stringByAppendingString: persistentDomain]; if (dinfo->userKey == 0) { rc = RegOpenKeyExW(HKEY_CURRENT_USER, UNISTR(dPath), 0, STANDARD_RIGHTS_WRITE|STANDARD_RIGHTS_READ |KEY_SET_VALUE|KEY_QUERY_VALUE, &(dinfo->userKey)); if (rc == ERROR_FILE_NOT_FOUND) { dinfo->userKey = 0; } else if (rc != ERROR_SUCCESS) { NSLog(@"Failed to open registry HKEY_CURRENT_USER\\%@ (%lx)", dPath, rc); return nil; } } if (dinfo->systemKey == 0) { rc = RegOpenKeyExW(HKEY_LOCAL_MACHINE, UNISTR(dPath), 0, STANDARD_RIGHTS_READ|KEY_QUERY_VALUE, &(dinfo->systemKey)); if (rc == ERROR_FILE_NOT_FOUND) { dinfo->systemKey = 0; } else if (rc != ERROR_SUCCESS) { NSLog(@"Failed to open registry HKEY_LOCAL_MACHINE\\%@ (%lx)", dPath, rc); return nil; } } domainDict = [newDict objectForKey: persistentDomain]; if (domainDict == nil) { domainDict = [NSMutableDictionary dictionary]; [newDict setObject: domainDict forKey: persistentDomain]; } if (dinfo->systemKey) { DWORD i = 0; unichar *name = malloc(200); unichar *data = malloc(1000); DWORD namelenbuf = 100, datalenbuf = 1000; DWORD type; do { DWORD namelen = namelenbuf, datalen = datalenbuf; rc = RegEnumValueW(dinfo->systemKey, i, name, &namelen, NULL, &type, (void*)data, &datalen); if (rc == ERROR_SUCCESS) { NS_DURING { id v; NSString *k; switch (type) { case REG_SZ: { int datacharlen = datalen / 2; if (datacharlen > 0 && data[datacharlen-1] == 0) datacharlen--; v = [NSString stringWithCharacters: data length: datacharlen]; } break; case REG_BINARY: { v = [NSString stringWithCString: (char*)data encoding: NSASCIIStringEncoding]; } break; default: NSLog(@"Bad registry type %lu for '%ls'", type, (const unichar *)name); v = 0; } v = [v propertyList]; if (v) { k = [NSString stringWithCharacters: name length: namelen]; [domainDict setObject: v forKey: k]; } } NS_HANDLER NSLog(@"Bad registry value for '%ls'", (const unichar *)name); NS_ENDHANDLER } else if (rc == ERROR_MORE_DATA) { if (namelen >= namelenbuf) { namelenbuf = namelen + 1; name = realloc(name, namelenbuf * sizeof(unichar)); } if (datalen >= datalenbuf) { datalenbuf = datalen + 1; data = realloc(data, datalenbuf); } continue; } else if (rc == ERROR_NO_MORE_ITEMS) { break; } else { NSLog(@"RegEnumValueW error %ld", rc); break; } i++; } while (rc == ERROR_SUCCESS || rc == ERROR_MORE_DATA); free(name); free(data); } if (dinfo->userKey) { DWORD i = 0; unichar *name = malloc(200); unichar *data = malloc(1000); DWORD namelenbuf = 100, datalenbuf = 1000; DWORD type; do { DWORD namelen = namelenbuf, datalen = datalenbuf; // RegEnumValueW returns the data as a wide string // but returns the length in bytes. // To add insult to injury, datalen includes the terminating // NULL character, unless there isn't enough room, in which // case it doesn't. rc = RegEnumValueW(dinfo->userKey, i, name, &namelen, NULL, &type, (void*)data, &datalen); if (rc == ERROR_SUCCESS) { NS_DURING { id v; NSString *k; switch (type) { case REG_SZ: { int datacharlen = datalen / 2; if (datacharlen > 0 && data[datacharlen-1] == 0) datacharlen--; v = [NSString stringWithCharacters: data length: datacharlen]; } break; case REG_BINARY: { v = [NSString stringWithCString: (char*)data encoding: NSASCIIStringEncoding]; } break; default: NSLog(@"Bad registry type %lu for '%ls'", type, (const unichar *)name); v = 0; } v = [v propertyList]; if (v) { k = [NSString stringWithCharacters: name length: namelen]; [domainDict setObject: v forKey: k]; } } NS_HANDLER NSLog(@"Bad registry value for '%ls'", (const unichar *)name); NS_ENDHANDLER } else if (rc == ERROR_MORE_DATA) { if (namelen >= namelenbuf) { namelenbuf = namelen + 1; name = realloc(name, namelenbuf * sizeof(unichar)); } if (datalen >= datalenbuf) { datalenbuf = datalen + 1; data = realloc(data, datalenbuf); } continue; } else if (rc == ERROR_NO_MORE_ITEMS) { break; } else { NSLog(@"RegEnumValueW error %ld", rc); break; } i++; } while (rc == ERROR_SUCCESS || rc == ERROR_MORE_DATA); free(name); free(data); } } return newDict; } - (void) unlockDefaultsFile { return; } - (BOOL) wantToReadDefaultsSince: (NSDate*)lastSyncDate { if (lastSyncDate != nil && registryInfo != 0) { // Detect changes in the registry NSMapEnumerator iter; NSString *domain; struct NSUserDefaultsWin32_DomainInfo *dinfo; iter = NSEnumerateMapTable(registryInfo); while (NSNextMapEnumeratorPair(&iter, (void**)&domain, (void**)&dinfo)) { ULARGE_INTEGER lasttime; LONG rc; NSTimeInterval ti; NSString *dPath; dPath = [registryPrefix stringByAppendingString: domain]; if (dinfo->userKey) { rc = RegQueryInfoKey(dinfo->userKey, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,NULL, NULL, (PFILETIME)&lasttime); if (rc != ERROR_SUCCESS) { NSString *dName = [@"HKEY_CURRENT_USER\\" stringByAppendingString: dPath]; NSLog(@"Failed to query modify time on registry %@ (%lx)", dName, rc); NSEndMapTableEnumeration(&iter); return YES; } ti = -12622780800.0 + lasttime.QuadPart / 10000000.0; if ([lastSyncDate timeIntervalSinceReferenceDate] < ti) { NSEndMapTableEnumeration(&iter); return YES; } } else { // If the key didn't exist, but now it does, we want to read it. rc = RegOpenKeyExW(HKEY_CURRENT_USER, UNISTR(dPath), 0, STANDARD_RIGHTS_WRITE|STANDARD_RIGHTS_READ |KEY_SET_VALUE|KEY_QUERY_VALUE, &(dinfo->userKey)); if (rc == ERROR_FILE_NOT_FOUND) { dinfo->userKey = 0; } else if (rc != ERROR_SUCCESS) { NSString *dName = [@"HKEY_CURRENT_USER\\" stringByAppendingString: dPath]; NSLog(@"Failed to open registry %@ (%lx)", dName, rc); } else { NSEndMapTableEnumeration(&iter); return YES; } } if (dinfo->systemKey) { rc = RegQueryInfoKey(dinfo->systemKey, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, (PFILETIME)&lasttime); if (rc != ERROR_SUCCESS) { NSLog(@"Failed to query time on HKEY_LOCAL_MACHINE\\%@ (%lx)", dPath, rc); NSEndMapTableEnumeration(&iter); return YES; } ti = -12622780800.0 + lasttime.QuadPart / 10000000.0; if ([lastSyncDate timeIntervalSinceReferenceDate] < ti) { NSEndMapTableEnumeration(&iter); return YES; } } else { // If the key didn't exist, but now it does, we want to read it. rc = RegOpenKeyExW(HKEY_LOCAL_MACHINE, UNISTR(dPath), 0, STANDARD_RIGHTS_READ|KEY_QUERY_VALUE, &(dinfo->systemKey)); if (rc == ERROR_FILE_NOT_FOUND) { dinfo->systemKey = 0; } else if (rc != ERROR_SUCCESS) { NSLog(@"Failed to open registry HKEY_LOCAL_MACHINE\\%@ (%lx)", dPath, rc); } else { NSEndMapTableEnumeration(&iter); return YES; } } } NSEndMapTableEnumeration(&iter); return NO; } return YES; } - (BOOL) writeDefaults: (NSDictionary*)defaults oldData: (NSDictionary*)oldData { NSEnumerator *iter; NSString *persistentDomain; if (registryInfo == 0) { registryInfo = NSCreateMapTable(NSObjectMapKeyCallBacks, NSOwnedPointerMapValueCallBacks, [defaults count]); } iter = [defaults keyEnumerator]; while ((persistentDomain = [iter nextObject]) != nil) { struct NSUserDefaultsWin32_DomainInfo *dinfo; NSDictionary *domainDict; NSDictionary *oldDomainDict; NSString *dPath; LONG rc; NSEnumerator *valIter; NSString *valName; dinfo = NSMapGet(registryInfo, persistentDomain); if (dinfo == 0) { dinfo = calloc(sizeof(struct NSUserDefaultsWin32_DomainInfo), 1); NSMapInsertKnownAbsent(registryInfo, persistentDomain, dinfo); } domainDict = [defaults objectForKey: persistentDomain]; oldDomainDict = [oldData objectForKey: persistentDomain]; dPath = [registryPrefix stringByAppendingString: persistentDomain]; if ([domainDict count] == 0) { continue; } if (dinfo->userKey == 0) { rc = RegCreateKeyExW(HKEY_CURRENT_USER, UNISTR(dPath), 0, (LPWSTR) L"", REG_OPTION_NON_VOLATILE, STANDARD_RIGHTS_WRITE|STANDARD_RIGHTS_READ|KEY_SET_VALUE |KEY_QUERY_VALUE, NULL, &(dinfo->userKey), NULL); if (rc != ERROR_SUCCESS) { NSLog(@"Failed to create registry HKEY_CURRENT_USER\\%@ (%lx)", dPath, rc); return NO; } } valIter = [domainDict keyEnumerator]; while ((valName = [valIter nextObject])) { id value = [domainDict objectForKey: valName]; id oldvalue = [oldDomainDict objectForKey: valName]; if (oldvalue == nil || [value isEqual: oldvalue] == NO) { NSString *result = nil; const unichar *ptr; GSPropertyListMake(value, nil, NO, NO, 0, &result); ptr = UNISTR(result); rc = RegSetValueExW(dinfo->userKey, UNISTR(valName), 0, REG_SZ, (void*)ptr, 2*(wcslen(ptr) + 1)); if (rc != ERROR_SUCCESS) { NSLog(@"Failed to insert HKEY_CURRENT_USER\\%@\\%@ (%lx)", dPath, valName, rc); return NO; } } } // Enumerate over the oldvalues and delete the deleted keys. valIter = [oldDomainDict keyEnumerator]; while ((valName = [valIter nextObject]) != nil) { if ([domainDict objectForKey: valName] == nil) { // Delete value from registry rc = RegDeleteValueW(dinfo->userKey, UNISTR(valName)); if (rc != ERROR_SUCCESS) { NSLog(@"Failed to delete HKEY_CURRENT_USER\\%@\\%@ (%lx)", dPath, valName, rc); return NO; } } } } return YES; } @end gnustep-base-1.29.0/Source/win32/dirent.h000066400000000000000000000545511435650067400200640ustar00rootroot00000000000000/* * Dirent interface for Microsoft Visual Studio * * Copyright (C) 1998-2019 Toni Ronkko * This file is part of dirent. Dirent may be freely distributed * under the MIT license. For all details and documentation, see * https://github.com/tronkko/dirent */ #ifndef DIRENT_H #define DIRENT_H /* Hide warnings about unreferenced local functions */ #if defined(__clang__) # pragma clang diagnostic ignored "-Wunused-function" #elif defined(_MSC_VER) # pragma warning(disable:4505) #elif defined(__GNUC__) # pragma GCC diagnostic ignored "-Wunused-function" #endif /* * Include windows.h without Windows Sockets 1.1 to prevent conflicts with * Windows Sockets 2.0. */ #ifndef WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN #endif #include #include #include #include #include #include #include #include #include #include #include /* Indicates that d_type field is available in dirent structure */ #define _DIRENT_HAVE_D_TYPE /* Indicates that d_namlen field is available in dirent structure */ #define _DIRENT_HAVE_D_NAMLEN /* Entries missing from MSVC 6.0 */ #if !defined(FILE_ATTRIBUTE_DEVICE) # define FILE_ATTRIBUTE_DEVICE 0x40 #endif /* File type and permission flags for stat(), general mask */ #if !defined(S_IFMT) # define S_IFMT _S_IFMT #endif /* Directory bit */ #if !defined(S_IFDIR) # define S_IFDIR _S_IFDIR #endif /* Character device bit */ #if !defined(S_IFCHR) # define S_IFCHR _S_IFCHR #endif /* Pipe bit */ #if !defined(S_IFFIFO) # define S_IFFIFO _S_IFFIFO #endif /* Regular file bit */ #if !defined(S_IFREG) # define S_IFREG _S_IFREG #endif /* Read permission */ #if !defined(S_IREAD) # define S_IREAD _S_IREAD #endif /* Write permission */ #if !defined(S_IWRITE) # define S_IWRITE _S_IWRITE #endif /* Execute permission */ #if !defined(S_IEXEC) # define S_IEXEC _S_IEXEC #endif /* Pipe */ #if !defined(S_IFIFO) # define S_IFIFO _S_IFIFO #endif /* Block device */ #if !defined(S_IFBLK) # define S_IFBLK 0 #endif /* Link */ #if !defined(S_IFLNK) # define S_IFLNK 0 #endif /* Socket */ #if !defined(S_IFSOCK) # define S_IFSOCK 0 #endif /* Read user permission */ #if !defined(S_IRUSR) # define S_IRUSR S_IREAD #endif /* Write user permission */ #if !defined(S_IWUSR) # define S_IWUSR S_IWRITE #endif /* Execute user permission */ #if !defined(S_IXUSR) # define S_IXUSR 0 #endif /* Read group permission */ #if !defined(S_IRGRP) # define S_IRGRP 0 #endif /* Write group permission */ #if !defined(S_IWGRP) # define S_IWGRP 0 #endif /* Execute group permission */ #if !defined(S_IXGRP) # define S_IXGRP 0 #endif /* Read others permission */ #if !defined(S_IROTH) # define S_IROTH 0 #endif /* Write others permission */ #if !defined(S_IWOTH) # define S_IWOTH 0 #endif /* Execute others permission */ #if !defined(S_IXOTH) # define S_IXOTH 0 #endif /* Maximum length of file name */ #if !defined(PATH_MAX) # define PATH_MAX MAX_PATH #endif #if !defined(FILENAME_MAX) # define FILENAME_MAX MAX_PATH #endif #if !defined(NAME_MAX) # define NAME_MAX FILENAME_MAX #endif /* File type flags for d_type */ #define DT_UNKNOWN 0 #define DT_REG S_IFREG #define DT_DIR S_IFDIR #define DT_FIFO S_IFIFO #define DT_SOCK S_IFSOCK #define DT_CHR S_IFCHR #define DT_BLK S_IFBLK #define DT_LNK S_IFLNK /* Macros for converting between st_mode and d_type */ #define IFTODT(mode) ((mode) & S_IFMT) #define DTTOIF(type) (type) /* * File type macros. Note that block devices, sockets and links cannot be * distinguished on Windows and the macros S_ISBLK, S_ISSOCK and S_ISLNK are * only defined for compatibility. These macros should always return false * on Windows. */ #if !defined(S_ISFIFO) # define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFIFO) #endif #if !defined(S_ISDIR) # define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) #endif #if !defined(S_ISREG) # define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG) #endif #if !defined(S_ISLNK) # define S_ISLNK(mode) (((mode) & S_IFMT) == S_IFLNK) #endif #if !defined(S_ISSOCK) # define S_ISSOCK(mode) (((mode) & S_IFMT) == S_IFSOCK) #endif #if !defined(S_ISCHR) # define S_ISCHR(mode) (((mode) & S_IFMT) == S_IFCHR) #endif #if !defined(S_ISBLK) # define S_ISBLK(mode) (((mode) & S_IFMT) == S_IFBLK) #endif /* Return the exact length of the file name without zero terminator */ #define _D_EXACT_NAMLEN(p) ((p)->d_namlen) /* Return the maximum size of a file name */ #define _D_ALLOC_NAMLEN(p) ((PATH_MAX)+1) #ifdef __cplusplus extern "C" { #endif /* Wide-character version */ struct _wdirent { /* Always zero */ long d_ino; /* File position within stream */ long d_off; /* Structure size */ unsigned short d_reclen; /* Length of name without \0 */ size_t d_namlen; /* File type */ int d_type; /* File name */ wchar_t d_name[PATH_MAX+1]; }; typedef struct _wdirent _wdirent; struct _WDIR { /* Current directory entry */ struct _wdirent ent; /* Private file data */ WIN32_FIND_DATAW data; /* True if data is valid */ int cached; /* Win32 search handle */ HANDLE handle; /* Initial directory name */ wchar_t *patt; }; typedef struct _WDIR _WDIR; /* Multi-byte character version */ struct dirent { /* Always zero */ long d_ino; /* File position within stream */ long d_off; /* Structure size */ unsigned short d_reclen; /* Length of name without \0 */ size_t d_namlen; /* File type */ int d_type; /* File name */ char d_name[PATH_MAX+1]; }; typedef struct dirent dirent; struct DIR { struct dirent ent; struct _WDIR *wdirp; }; typedef struct DIR DIR; /* Dirent functions */ static DIR *opendir(const char *dirname); static _WDIR *_wopendir(const wchar_t *dirname); static struct dirent *readdir(DIR *dirp); static struct _wdirent *_wreaddir(_WDIR *dirp); static int readdir_r( DIR *dirp, struct dirent *entry, struct dirent **result); static int _wreaddir_r( _WDIR *dirp, struct _wdirent *entry, struct _wdirent **result); static int closedir(DIR *dirp); static int _wclosedir(_WDIR *dirp); static void rewinddir(DIR* dirp); static void _wrewinddir(_WDIR* dirp); static int scandir(const char *dirname, struct dirent ***namelist, int (*filter)(const struct dirent*), int (*compare)(const struct dirent**, const struct dirent**)); static int alphasort(const struct dirent **a, const struct dirent **b); static int versionsort(const struct dirent **a, const struct dirent **b); static int strverscmp(const char *a, const char *b); /* For compatibility with Symbian */ #define wdirent _wdirent #define WDIR _WDIR #define wopendir _wopendir #define wreaddir _wreaddir #define wclosedir _wclosedir #define wrewinddir _wrewinddir /* Compatibility with older Microsoft compilers and non-Microsoft compilers */ #if !defined(_MSC_VER) || _MSC_VER < 1400 # define wcstombs_s dirent_wcstombs_s # define mbstowcs_s dirent_mbstowcs_s #endif /* Optimize dirent_set_errno() away on modern Microsoft compilers */ #if defined(_MSC_VER) && _MSC_VER >= 1400 # define dirent_set_errno _set_errno #endif /* Internal utility functions */ static WIN32_FIND_DATAW *dirent_first(_WDIR *dirp); static WIN32_FIND_DATAW *dirent_next(_WDIR *dirp); #if !defined(_MSC_VER) || _MSC_VER < 1400 static int dirent_mbstowcs_s( size_t *pReturnValue, wchar_t *wcstr, size_t sizeInWords, const char *mbstr, size_t count); #endif #if !defined(_MSC_VER) || _MSC_VER < 1400 static int dirent_wcstombs_s( size_t *pReturnValue, char *mbstr, size_t sizeInBytes, const wchar_t *wcstr, size_t count); #endif #if !defined(_MSC_VER) || _MSC_VER < 1400 static void dirent_set_errno(int error); #endif /* * Open directory stream DIRNAME for read and return a pointer to the * internal working area that is used to retrieve individual directory * entries. */ static _WDIR *_wopendir(const wchar_t *dirname) { wchar_t *p; /* Must have directory name */ if (dirname == NULL || dirname[0] == '\0') { dirent_set_errno(ENOENT); return NULL; } /* Allocate new _WDIR structure */ _WDIR *dirp = (_WDIR*) malloc(sizeof(struct _WDIR)); if (!dirp) return NULL; /* Reset _WDIR structure */ dirp->handle = INVALID_HANDLE_VALUE; dirp->patt = NULL; dirp->cached = 0; /* * Compute the length of full path plus zero terminator * * Note that on WinRT there's no way to convert relative paths * into absolute paths, so just assume it is an absolute path. */ #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) /* Desktop */ DWORD n = GetFullPathNameW(dirname, 0, NULL, NULL); #else /* WinRT */ size_t n = wcslen(dirname); #endif /* Allocate room for absolute directory name and search pattern */ dirp->patt = (wchar_t*) malloc(sizeof(wchar_t) * n + 16); if (dirp->patt == NULL) goto exit_closedir; /* * Convert relative directory name to an absolute one. This * allows rewinddir() to function correctly even when current * working directory is changed between opendir() and rewinddir(). * * Note that on WinRT there's no way to convert relative paths * into absolute paths, so just assume it is an absolute path. */ #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) /* Desktop */ n = GetFullPathNameW(dirname, n, dirp->patt, NULL); if (n <= 0) goto exit_closedir; #else /* WinRT */ wcsncpy_s(dirp->patt, n+1, dirname, n); #endif /* Append search pattern \* to the directory name */ p = dirp->patt + n; switch (p[-1]) { case '\\': case '/': case ':': /* Directory ends in path separator, e.g. c:\temp\ */ /*NOP*/; break; default: /* Directory name doesn't end in path separator */ *p++ = '\\'; } *p++ = '*'; *p = '\0'; /* Open directory stream and retrieve the first entry */ if (!dirent_first(dirp)) goto exit_closedir; /* Success */ return dirp; /* Failure */ exit_closedir: _wclosedir(dirp); return NULL; } /* * Read next directory entry. * * Returns pointer to static directory entry which may be overwritten by * subsequent calls to _wreaddir(). */ static struct _wdirent *_wreaddir(_WDIR *dirp) { /* * Read directory entry to buffer. We can safely ignore the return * value as entry will be set to NULL in case of error. */ struct _wdirent *entry; (void) _wreaddir_r(dirp, &dirp->ent, &entry); /* Return pointer to statically allocated directory entry */ return entry; } /* * Read next directory entry. * * Returns zero on success. If end of directory stream is reached, then sets * result to NULL and returns zero. */ static int _wreaddir_r( _WDIR *dirp, struct _wdirent *entry, struct _wdirent **result) { /* Read next directory entry */ WIN32_FIND_DATAW *datap = dirent_next(dirp); if (!datap) { /* Return NULL to indicate end of directory */ *result = NULL; return /*OK*/0; } /* * Copy file name as wide-character string. If the file name is too * long to fit in to the destination buffer, then truncate file name * to PATH_MAX characters and zero-terminate the buffer. */ size_t n = 0; while (n < PATH_MAX && datap->cFileName[n] != 0) { entry->d_name[n] = datap->cFileName[n]; n++; } entry->d_name[n] = 0; /* Length of file name excluding zero terminator */ entry->d_namlen = n; /* File type */ DWORD attr = datap->dwFileAttributes; if ((attr & FILE_ATTRIBUTE_DEVICE) != 0) entry->d_type = DT_CHR; else if ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) entry->d_type = DT_DIR; else entry->d_type = DT_REG; /* Reset dummy fields */ entry->d_ino = 0; entry->d_off = 0; entry->d_reclen = sizeof(struct _wdirent); /* Set result address */ *result = entry; return /*OK*/0; } /* * Close directory stream opened by opendir() function. This invalidates the * DIR structure as well as any directory entry read previously by * _wreaddir(). */ static int _wclosedir(_WDIR *dirp) { if (!dirp) { dirent_set_errno(EBADF); return /*failure*/-1; } /* Release search handle */ if (dirp->handle != INVALID_HANDLE_VALUE) FindClose(dirp->handle); /* Release search pattern */ free(dirp->patt); /* Release directory structure */ free(dirp); return /*success*/0; } /* * Rewind directory stream such that _wreaddir() returns the very first * file name again. */ static void _wrewinddir(_WDIR* dirp) { if (!dirp) return; /* Release existing search handle */ if (dirp->handle != INVALID_HANDLE_VALUE) FindClose(dirp->handle); /* Open new search handle */ dirent_first(dirp); } /* Get first directory entry */ static WIN32_FIND_DATAW *dirent_first(_WDIR *dirp) { if (!dirp) return NULL; /* Open directory and retrieve the first entry */ dirp->handle = FindFirstFileExW( dirp->patt, FindExInfoStandard, &dirp->data, FindExSearchNameMatch, NULL, 0); if (dirp->handle == INVALID_HANDLE_VALUE) goto error; /* A directory entry is now waiting in memory */ dirp->cached = 1; return &dirp->data; error: /* Failed to open directory: no directory entry in memory */ dirp->cached = 0; /* Set error code */ DWORD errorcode = GetLastError(); switch (errorcode) { case ERROR_ACCESS_DENIED: /* No read access to directory */ dirent_set_errno(EACCES); break; case ERROR_DIRECTORY: /* Directory name is invalid */ dirent_set_errno(ENOTDIR); break; case ERROR_PATH_NOT_FOUND: default: /* Cannot find the file */ dirent_set_errno(ENOENT); } return NULL; } /* Get next directory entry */ static WIN32_FIND_DATAW *dirent_next(_WDIR *dirp) { /* Is the next directory entry already in cache? */ if (dirp->cached) { /* Yes, a valid directory entry found in memory */ dirp->cached = 0; return &dirp->data; } /* No directory entry in cache */ if (dirp->handle == INVALID_HANDLE_VALUE) return NULL; /* Read the next directory entry from stream */ if (FindNextFileW(dirp->handle, &dirp->data) == FALSE) goto exit_close; /* Success */ return &dirp->data; /* Failure */ exit_close: FindClose(dirp->handle); dirp->handle = INVALID_HANDLE_VALUE; return NULL; } /* Open directory stream using plain old C-string */ static DIR *opendir(const char *dirname) { /* Must have directory name */ if (dirname == NULL || dirname[0] == '\0') { dirent_set_errno(ENOENT); return NULL; } /* Allocate memory for DIR structure */ struct DIR *dirp = (DIR*) malloc(sizeof(struct DIR)); if (!dirp) return NULL; /* Convert directory name to wide-character string */ wchar_t wname[PATH_MAX + 1]; size_t n; int error = mbstowcs_s(&n, wname, PATH_MAX + 1, dirname, PATH_MAX+1); if (error) goto exit_failure; /* Open directory stream using wide-character name */ dirp->wdirp = _wopendir(wname); if (!dirp->wdirp) goto exit_failure; /* Success */ return dirp; /* Failure */ exit_failure: free(dirp); return NULL; } /* Read next directory entry */ static struct dirent *readdir(DIR *dirp) { /* * Read directory entry to buffer. We can safely ignore the return * value as entry will be set to NULL in case of error. */ struct dirent *entry; (void) readdir_r(dirp, &dirp->ent, &entry); /* Return pointer to statically allocated directory entry */ return entry; } /* * Read next directory entry into called-allocated buffer. * * Returns zero on success. If the end of directory stream is reached, then * sets result to NULL and returns zero. */ static int readdir_r( DIR *dirp, struct dirent *entry, struct dirent **result) { /* Read next directory entry */ WIN32_FIND_DATAW *datap = dirent_next(dirp->wdirp); if (!datap) { /* No more directory entries */ *result = NULL; return /*OK*/0; } /* Attempt to convert file name to multi-byte string */ size_t n; int error = wcstombs_s( &n, entry->d_name, PATH_MAX + 1, datap->cFileName, PATH_MAX + 1); /* * If the file name cannot be represented by a multi-byte string, then * attempt to use old 8+3 file name. This allows the program to * access files although file names may seem unfamiliar to the user. * * Be ware that the code below cannot come up with a short file name * unless the file system provides one. At least VirtualBox shared * folders fail to do this. */ if (error && datap->cAlternateFileName[0] != '\0') { error = wcstombs_s( &n, entry->d_name, PATH_MAX + 1, datap->cAlternateFileName, PATH_MAX + 1); } if (!error) { /* Length of file name excluding zero terminator */ entry->d_namlen = n - 1; /* File attributes */ DWORD attr = datap->dwFileAttributes; if ((attr & FILE_ATTRIBUTE_DEVICE) != 0) entry->d_type = DT_CHR; else if ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) entry->d_type = DT_DIR; else entry->d_type = DT_REG; /* Reset dummy fields */ entry->d_ino = 0; entry->d_off = 0; entry->d_reclen = sizeof(struct dirent); } else { /* * Cannot convert file name to multi-byte string so construct * an erroneous directory entry and return that. Note that * we cannot return NULL as that would stop the processing * of directory entries completely. */ entry->d_name[0] = '?'; entry->d_name[1] = '\0'; entry->d_namlen = 1; entry->d_type = DT_UNKNOWN; entry->d_ino = 0; entry->d_off = -1; entry->d_reclen = 0; } /* Return pointer to directory entry */ *result = entry; return /*OK*/0; } /* Close directory stream */ static int closedir(DIR *dirp) { int ok; if (!dirp) goto exit_failure; /* Close wide-character directory stream */ ok = _wclosedir(dirp->wdirp); dirp->wdirp = NULL; /* Release multi-byte character version */ free(dirp); return ok; exit_failure: /* Invalid directory stream */ dirent_set_errno(EBADF); return /*failure*/-1; } /* Rewind directory stream to beginning */ static void rewinddir(DIR* dirp) { if (!dirp) return; /* Rewind wide-character string directory stream */ _wrewinddir(dirp->wdirp); } /* Scan directory for entries */ static int scandir( const char *dirname, struct dirent ***namelist, int (*filter)(const struct dirent*), int (*compare)(const struct dirent**, const struct dirent**)) { int result; /* Open directory stream */ DIR *dir = opendir(dirname); if (!dir) { /* Cannot open directory */ return /*Error*/ -1; } /* Read directory entries to memory */ struct dirent *tmp = NULL; struct dirent **files = NULL; size_t size = 0; size_t allocated = 0; while (1) { /* Allocate room for a temporary directory entry */ if (!tmp) { tmp = (struct dirent*) malloc(sizeof(struct dirent)); if (!tmp) goto exit_failure; } /* Read directory entry to temporary area */ struct dirent *entry; if (readdir_r(dir, tmp, &entry) != /*OK*/0) goto exit_failure; /* Stop if we already read the last directory entry */ if (entry == NULL) goto exit_success; /* Determine whether to include the entry in results */ if (filter && !filter(tmp)) continue; /* Enlarge pointer table to make room for another pointer */ if (size >= allocated) { /* Compute number of entries in the new table */ size_t num_entries = size * 2 + 16; /* Allocate new pointer table or enlarge existing */ void *p = realloc(files, sizeof(void*) * num_entries); if (!p) goto exit_failure; /* Got the memory */ files = (dirent**) p; allocated = num_entries; } /* Store the temporary entry to ptr table */ files[size++] = tmp; tmp = NULL; } exit_failure: /* Release allocated file entries */ for (size_t i = 0; i < size; i++) { free(files[i]); } /* Release the pointer table */ free(files); files = NULL; /* Exit with error code */ result = /*error*/ -1; goto exit_status; exit_success: /* Sort directory entries */ qsort(files, size, sizeof(void*), (int (*) (const void*, const void*)) compare); /* Pass pointer table to caller */ if (namelist) *namelist = files; /* Return the number of directory entries read */ result = (int) size; exit_status: /* Release temporary directory entry, if we had one */ free(tmp); /* Close directory stream */ closedir(dir); return result; } /* Alphabetical sorting */ static int alphasort(const struct dirent **a, const struct dirent **b) { return strcoll((*a)->d_name, (*b)->d_name); } /* Sort versions */ static int versionsort(const struct dirent **a, const struct dirent **b) { return strverscmp((*a)->d_name, (*b)->d_name); } /* Compare strings */ static int strverscmp(const char *a, const char *b) { size_t i = 0; size_t j; /* Find first difference */ while (a[i] == b[i]) { if (a[i] == '\0') { /* No difference */ return 0; } ++i; } /* Count backwards and find the leftmost digit */ j = i; while (j > 0 && isdigit(a[j-1])) { --j; } /* Determine mode of comparison */ if (a[j] == '0' || b[j] == '0') { /* Find the next non-zero digit */ while (a[j] == '0' && a[j] == b[j]) { j++; } /* String with more digits is smaller, e.g 002 < 01 */ if (isdigit(a[j])) { if (!isdigit(b[j])) { return -1; } } else if (isdigit(b[j])) { return 1; } } else if (isdigit(a[j]) && isdigit(b[j])) { /* Numeric comparison */ size_t k1 = j; size_t k2 = j; /* Compute number of digits in each string */ while (isdigit(a[k1])) { k1++; } while (isdigit(b[k2])) { k2++; } /* Number with more digits is bigger, e.g 999 < 1000 */ if (k1 < k2) return -1; else if (k1 > k2) return 1; } /* Alphabetical comparison */ return (int) ((unsigned char) a[i]) - ((unsigned char) b[i]); } /* Convert multi-byte string to wide character string */ #if !defined(_MSC_VER) || _MSC_VER < 1400 static int dirent_mbstowcs_s( size_t *pReturnValue, wchar_t *wcstr, size_t sizeInWords, const char *mbstr, size_t count) { /* Older Visual Studio or non-Microsoft compiler */ size_t n = mbstowcs(wcstr, mbstr, sizeInWords); if (wcstr && n >= count) return /*error*/ 1; /* Zero-terminate output buffer */ if (wcstr && sizeInWords) { if (n >= sizeInWords) n = sizeInWords - 1; wcstr[n] = 0; } /* Length of multi-byte string with zero terminator */ if (pReturnValue) { *pReturnValue = n + 1; } /* Success */ return 0; } #endif /* Convert wide-character string to multi-byte string */ #if !defined(_MSC_VER) || _MSC_VER < 1400 static int dirent_wcstombs_s( size_t *pReturnValue, char *mbstr, size_t sizeInBytes, const wchar_t *wcstr, size_t count) { /* Older Visual Studio or non-Microsoft compiler */ size_t n = wcstombs(mbstr, wcstr, sizeInBytes); if (mbstr && n >= count) return /*error*/1; /* Zero-terminate output buffer */ if (mbstr && sizeInBytes) { if (n >= sizeInBytes) { n = sizeInBytes - 1; } mbstr[n] = '\0'; } /* Length of resulting multi-bytes string WITH zero-terminator */ if (pReturnValue) { *pReturnValue = n + 1; } /* Success */ return 0; } #endif /* Set errno variable */ #if !defined(_MSC_VER) || _MSC_VER < 1400 static void dirent_set_errno(int error) { /* Non-Microsoft compiler or older Microsoft compiler */ errno = error; } #endif #ifdef __cplusplus } #endif #endif /*DIRENT_H*/ gnustep-base-1.29.0/Support/000077500000000000000000000000001435650067400156665ustar00rootroot00000000000000gnustep-base-1.29.0/Support/Foundation/000077500000000000000000000000001435650067400177745ustar00rootroot00000000000000gnustep-base-1.29.0/Support/Foundation/Foundation-Info.plist000066400000000000000000000017041435650067400240520ustar00rootroot00000000000000 CFBundleDevelopmentRegion English CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIconFile CFBundleIdentifier org.gnustep.${PRODUCT_NAME:rfc1034identifier} CFBundleInfoDictionaryVersion 6.0 CFBundleName ${PRODUCT_NAME} CFBundlePackageType FMWK CFBundleShortVersionString 1.0 CFBundleSignature ???? CFBundleVersion 1 NSHumanReadableCopyright Copyright © 2012 __MyCompanyName__. All rights reserved. NSPrincipalClass gnustep-base-1.29.0/Support/Foundation/Foundation-Prefix.pch000066400000000000000000000001421435650067400240260ustar00rootroot00000000000000// // Prefix header for all source files of the 'Foundation' target in the 'Foundation' project //gnustep-base-1.29.0/Tests/000077500000000000000000000000001435650067400153145ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/GNUmakefile000066400000000000000000000061041435650067400173670ustar00rootroot00000000000000# # Tests Makefile for GNUstep Base Library. # # Copyright (C) 2011 Free Software Foundation, Inc. # # Written by: Richard Frith-Macdonald # # This file is part of the GNUstep Base Library. # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public # License as published by the Free Software Foundation; either # version 2 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 # General Public License for more details. # # You should have received a copy of the GNU General Public # License along with this library; if not, write to the Free # Software Foundation, Inc., 51 Franklin Street, Fifth Floor, # Boston, MA 02111 USA # ifeq ($(GNUSTEP_MAKEFILES),) GNUSTEP_MAKEFILES := $(shell gnustep-config --variable=GNUSTEP_MAKEFILES 2>/dev/null) ifeq ($(GNUSTEP_MAKEFILES),) $(warning ) $(warning Unable to obtain GNUSTEP_MAKEFILES setting from gnustep-config!) $(warning Perhaps gnustep-make is not properly installed,) $(warning so gnustep-config is not in your PATH.) $(warning ) $(warning Your PATH is currently $(PATH)) $(warning ) endif endif ifeq ($(GNUSTEP_MAKEFILES),) $(error You need to set GNUSTEP_MAKEFILES before running this!) endif include $(GNUSTEP_MAKEFILES)/common.make TOP_DIR := $(shell dirname $(CURDIR)) # This message is also printed when you type 'make' top-level. It is # the last message printed (since 'Tests' is the last directory in # SUBPROJECTS top-level), which is good as it becomes a recommendation # to run 'make check' after 'make'. all:: @(echo If you want to run the gnustep-base testsuite, please type \'${MAKE} check\') # To run tests for a separate group please, use 'make check testobj=NSString' # or 'make check testobj=NSDate/general.m' to run an individual test file # # # 'make check' runs the testsuite (Objective-C tests only) # # Use 'make check GNUSTEP_TEST_OBJCXX=yes' to run both Objective-C # and Objective-C++ tests # check:: (\ GNUSTEP_LOCAL_ADDITIONAL_MAKEFILES="$(TOP_DIR)/base.make";\ ADDITIONAL_INCLUDE_DIRS="-I$(TOP_DIR)/Headers -I$(TOP_DIR)/Source/$(GNUSTEP_TARGET_DIR)";\ ADDITIONAL_LIB_DIRS="-L$(TOP_DIR)/Source/$(GNUSTEP_OBJ_DIR)";\ if [ "$(GNUSTEP_TARGET_OS)" != "windows" ]; then \ PATH="$(TOP_DIR)/Tools/$(GNUSTEP_OBJ_DIR):${PATH}";\ ADDITIONAL_LDFLAGS="-Wl,-rpath,$(TOP_DIR)/Source/$(GNUSTEP_OBJ_DIR)";\ LD_LIBRARY_PATH="$(TOP_DIR)/Source/$(GNUSTEP_OBJ_DIR):${LD_LIBRARY_PATH}";\ export PATH;\ export ADDITIONAL_LDFLAGS;\ export LD_LIBRARY_PATH;\ fi; \ export GNUSTEP_LOCAL_ADDITIONAL_MAKEFILES;\ export ADDITIONAL_INCLUDE_DIRS;\ export ADDITIONAL_LIB_DIRS;\ if [ "$(debug)" = "yes" ]; then \ gnustep-tests --debug 'base/$(testobj)';\ else \ gnustep-tests 'base/$(testobj)';\ fi; \ ) clean:: -gnustep-tests --clean # This makefile does nothing. include $(GNUSTEP_MAKEFILES)/rules.make gnustep-base-1.29.0/Tests/base/000077500000000000000000000000001435650067400162265ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/Functions/000077500000000000000000000000001435650067400201765ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/Functions/NSByteSwapping.m000066400000000000000000000030161435650067400232310ustar00rootroot00000000000000#import #import "Testing.h" #ifndef M_PI #define M_PI 3.14159265358979323846264338327950288 #endif int main() { NSAutoreleasePool *pool = [NSAutoreleasePool new]; float flt=M_PI; double dbl=M_PI; PASS(NSSwapShort(0x1234) == (unsigned short)0x3412, "NSSwapShort works"); if (sizeof(long) == 4) { PASS(NSSwapLong(0x12345678L) == 0x78563412UL, "NSSwapLong works"); } else if (sizeof(long) == 8) { PASS(NSSwapLongLong(0x123456789abcdef0LL) == 0xf0debc9a78563412LL, "NSSwapLongLong works"); } if (sizeof(long long) == 8) { PASS(NSSwapLongLong(0x123456789abcdef0LL) == 0xf0debc9a78563412LL, "NSSwapLongLong works"); } PASS(NSSwapBigFloatToHost(*((NSSwappedFloat *)&flt)) == ((NSHostByteOrder() == NS_LittleEndian) ? (float)-40331460896358400.0 : (float)M_PI), "NSSwapBigFloatToHost works"); PASS(NSSwapLittleFloatToHost(*((NSSwappedFloat *)&flt)) == ((NSHostByteOrder() == NS_BigEndian) ? (float)-40331460896358400.0 : (float)M_PI), "NSSwapLittleFloatToHost works"); PASS(NSSwapBigDoubleToHost(*((NSSwappedDouble *)&dbl)) == ((NSHostByteOrder() == NS_LittleEndian) ? 3.20737563067636581208678536384e-192 : M_PI), "NSSwapBigDoubleToHost works"); PASS(NSSwapLittleDoubleToHost(*((NSSwappedDouble *)&dbl)) == ((NSHostByteOrder() == NS_BigEndian) ? 3.20737563067636581208678536384e-192 : M_PI), "NSSwapLittleDoubleToHost wworks"); [pool release]; pool = nil; return 0; } gnustep-base-1.29.0/Tests/base/Functions/NSGeometry1.m000066400000000000000000000124541435650067400224770ustar00rootroot00000000000000/* NSGeometry tests */ #import #import "Testing.h" static BOOL MacOSXCompatibleGeometry() { NSUserDefaults *dflt = [NSUserDefaults standardUserDefaults]; if ([dflt boolForKey: @"GSOldStyleGeometry"] == YES) return NO; return [dflt boolForKey: @"GSMacOSXCompatible"]; } /* Test the string functions */ int geom_string() { #if defined(GNUSTEP_BASE_LIBRARY) NSUserDefaults *dflt = [NSUserDefaults standardUserDefaults]; BOOL compat_mode = MacOSXCompatibleGeometry(); #endif NSPoint p, p2; NSRect r, r2; NSSize s, s2; NSEdgeInsets ei; NSString *sp, *sr, *ss; p = NSMakePoint(23.45, -3.45); r = NSMakeRect(23.45, -3.45, 2044.3, 2033); s = NSMakeSize(0.5, 0.22); ei = NSEdgeInsetsMake(23.45, -3.45, 2044.3, 2033); PASS(NSEqualPoints(p, NSMakePoint(23.45, -3.45)), "identical points are equal"); if (sizeof(CGFloat) == sizeof(float)) { PASS(NSEqualPoints(p, NSMakePoint(23.450001, -3.45)), "near identical points are equal"); } else { PASS(NSEqualPoints(p, NSMakePoint(23.450000000000001, -3.45)), "near identical points are equal"); } PASS(!NSEqualPoints(p, NSMakePoint(23.4500019, -3.45)), "moderately similar points are not equal"); PASS(NSEqualSizes(s, NSMakeSize(0.5, 0.22)), "identical sizes are equal"); if (sizeof(CGFloat) == sizeof(float)) { PASS(NSEqualSizes(s, NSMakeSize(0.50000001, 0.22)), "near identical sizes are equal"); } else { PASS(NSEqualSizes(s, NSMakeSize(0.50000000000000001, 0.22)), "near identical sizes are equal"); } PASS(!NSEqualSizes(s, NSMakeSize(0.50000003, 0.22)), "moderately similar sizes are not equal"); PASS(NSEqualRects(r, NSMakeRect(23.45, -3.45, 2044.3, 2033)), "identical rects are equal"); if (sizeof(CGFloat) == sizeof(float)) { PASS(NSEqualRects(r, NSMakeRect(23.45, -3.45, 2044.3, 2033.00001)), "near identical rects are equal"); } else { PASS(NSEqualRects(r, NSMakeRect(23.45, -3.45, 2044.3, 2033.0000000000001)), "near identical rects are equal"); } PASS(!NSEqualRects(r, NSMakeRect(23.45, -3.45, 2044.3, 2033.0001)), "moderately similar rects are not equal"); PASS(NSIntersectsRect(r, NSMakeRect(23.45, -3.45, 2044.3, 2033)), "identical rects intersect"); PASS(!NSIntersectsRect(NSMakeRect(1,1,2,2), NSMakeRect(2,2,0,0)), "an empty rect does not intersect with one containing it"); PASS(!NSIntersectsRect(NSMakeRect(1,1,2,2), NSMakeRect(3,3,0,0)), "an empty rect does not intersect with one touching it"); PASS(!NSIntersectsRect(NSMakeRect(1,1,0,0), NSMakeRect(1,1,0,0)), "identical empty rects do not intersec"); PASS(NSEdgeInsetsEqual(ei, NSEdgeInsetsMake(23.45, -3.45, 2044.3, 2033)), "identical rects are equal"); if (sizeof(CGFloat) == sizeof(float)) { PASS(NSEdgeInsetsEqual(ei, NSEdgeInsetsMake(23.45, -3.45, 2044.3, 2033.00001)), "near identical rects are equal"); } else { PASS(NSEdgeInsetsEqual(ei, NSEdgeInsetsMake(23.45, -3.45, 2044.3, 2033.0000000000001)), "near identical rects are equal"); } PASS(!NSEdgeInsetsEqual(ei, NSEdgeInsetsMake(23.45, -3.45, 2044.3, 2033.0001)), "moderately similar rects are not equal"); #if defined(GNUSTEP_BASE_LIBRARY) if (compat_mode == YES) { [dflt setBool: NO forKey: @"GSMacOSXCompatible"]; [NSUserDefaults resetStandardUserDefaults]; } PASS((MacOSXCompatibleGeometry() == NO), "Not in MacOSX geometry compat mode"); sp = NSStringFromPoint(p); p2 = NSPointFromString(sp); PASS((EQ(p2.x, p.x) && EQ(p2.y, p.y)), "Can read output of NSStringFromPoint"); sr = NSStringFromRect(r); r2 = NSRectFromString(sr); PASS((EQ(r2.origin.x, r.origin.x) && EQ(r2.origin.y, r.origin.y) && EQ(r2.size.width, r.size.width) && EQ(r2.size.height, r.size.height)), "Can read output of NSStringFromRect"); ss = NSStringFromSize(s); s2 = NSSizeFromString(ss); PASS((EQ(s2.width, s.width) && EQ(s2.height, s.height)), "Can read output of NSStringFromSize"); if ([[NSFileManager defaultManager] isWritableFileAtPath: NSHomeDirectory()]) { dflt = [NSUserDefaults standardUserDefaults]; [dflt setBool: YES forKey: @"GSMacOSXCompatible"]; [NSUserDefaults resetStandardUserDefaults]; PASS((MacOSXCompatibleGeometry() == YES), "In MacOSX geometry compat mode"); } #endif sp = NSStringFromPoint(p); p2 = NSPointFromString(sp); PASS((EQ(p2.x, p.x) && EQ(p2.y, p.y)), "Can read output of NSStringFromPoint (MacOSX compat)"); sr = NSStringFromRect(r); r2 = NSRectFromString(sr); PASS((EQ(r2.origin.x, r.origin.x) && EQ(r2.origin.y, r.origin.y) && EQ(r2.size.width, r.size.width) && EQ(r2.size.height, r.size.height)), "Can read output of NSStringFromRect (MacOSX compat)"); ss = NSStringFromSize(s); s2 = NSSizeFromString(ss); PASS((EQ(s2.width, s.width) && EQ(s2.height, s.height)), "Can read output of NSStringFromSize (MacOSX compat)"); #if defined(GNUSTEP_BASE_LIBRARY) if (compat_mode != MacOSXCompatibleGeometry()) { [dflt setBool: NO forKey: @"GSMacOSXCompatible"]; } #endif return 0; } int main() { NSAutoreleasePool *pool = [NSAutoreleasePool new]; geom_string(); [pool release]; pool = nil; return 0; } gnustep-base-1.29.0/Tests/base/Functions/NSPathUtilities.m000066400000000000000000000031051435650067400234040ustar00rootroot00000000000000#import #import "Testing.h" int main() { NSAutoreleasePool *pool = [NSAutoreleasePool new]; id o; /* The path utilities provide information about the current user and * the current filesystem layout ... and are inherently system dependent * so we can't know if they are operating correctly. The best we can do * are trivial checks to see if their results look sane. */ NSLog(@"NSUserName() %@", o = NSUserName()); PASS([o length] > 0, "we can get a user name"); NSLog(@"NSFullUserName() %@", o = NSFullUserName()); PASS([o length] > 0, "we can get a full user name"); NSLog(@"NSHomeDirectory() %@", o = NSHomeDirectory()); PASS([o length] > 0, "we can get a home directory"); NSLog(@"NSTemporaryDirectory() %@", o = NSTemporaryDirectory()); PASS([o length] > 0, "we can get a temporary directory"); NSLog(@"NSOpenStepRootDirectory() %@", o = NSOpenStepRootDirectory()); PASS([o length] > 0, "we can get a root directory"); NSLog(@"NSHomeDirectoryForUser(@\"non-existent-user\") %@", o = NSHomeDirectoryForUser(@"non-existent-user")); PASS(nil == o, "home directory for non existent user is nil"); /* These functions have been removed in recent OSX but are retained in GNUstep */ #if defined(GNUSTEP_BASE_LIBRARY) NSLog(@"NSStandardApplicationPaths() %@", o = NSStandardApplicationPaths()); PASS([o count] > 0, "we have application paths"); NSLog(@"NSStandardLibraryPaths() %@", o = NSStandardLibraryPaths()); PASS([o count] > 0, "we have library paths"); #endif [pool release]; pool = nil; return 0; } gnustep-base-1.29.0/Tests/base/Functions/NSZone.m000066400000000000000000000043311435650067400215310ustar00rootroot00000000000000#import #import "Testing.h" int main() { NSAutoreleasePool *pool = [NSAutoreleasePool new]; NSZone *aZone; char *vp; void *ovp; aZone = NSDefaultMallocZone(); PASS((aZone != NULL), "NSDefaultMallocZone() returns something"); aZone = NSCreateZone(1024,1024,0); PASS((aZone != NULL), "NSCreateZone() works for an unfreeable zone"); aZone = NSCreateZone(1024,1024,1); PASS((aZone != NULL), "NSCreateZone() works for a normal zone"); if ([NSGarbageCollector defaultCollector] == nil) { NSSetZoneName(aZone, @"My Zone"); PASS(([NSZoneName(aZone) isEqual: @"My Zone"]), "NSZoneName() returns previously set string"); vp = NSZoneCalloc(aZone,17,12); memset(vp,1,17*12); NS_DURING { NSZoneFree(aZone,vp); PASS(1, "NSZoneFree() calloc'd buffer"); } NS_HANDLER PASS(0, "NSZoneFree() calloc'd buffer %s", [[localException name] UTF8String]); NS_ENDHANDLER NS_DURING NSZoneFree(aZone,vp); PASS(0, "NSZoneFree() free'd buffer throws exception"); NS_HANDLER PASS(1, "NSZoneFree() free'd buffer throws exception: %s", [[localException name] UTF8String]); NS_ENDHANDLER vp = NSZoneMalloc(aZone,2000); memset(vp,2,2000); NS_DURING { NSZoneFree(aZone,vp); PASS(1, "NSZoneFree() malloc'd buffer"); } NS_HANDLER PASS(0, "NSZoneFree() malloc'd buffer %s", [[localException name] UTF8String]); NS_ENDHANDLER ovp = NSZoneMalloc(aZone, 1000); vp = NSZoneRealloc(aZone, ovp, 2000); memset(vp,3,2000); NSZoneRealloc(aZone, vp, 1000); memset(vp,4,1000); NS_DURING NSZoneFree(aZone,vp); PASS(1,"NSZoneFree() releases memory held after realloc"); NS_HANDLER PASS(0,"NSZoneFree() releases memory held after realloc"); NS_ENDHANDLER PASS((NSZoneFromPointer(vp) == aZone), "NSZoneFromPointer() returns zone where memory came from"); NS_DURING [NSString allocWithZone:aZone]; NSRecycleZone(aZone); PASS(1,"NSRecycleZone seems to operate"); NS_HANDLER PASS(0,"NSRecycleZone seems to operate"); NS_ENDHANDLER } [pool release]; pool = nil; return 0; } gnustep-base-1.29.0/Tests/base/Functions/TestInfo000066400000000000000000000000001435650067400216420ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/Functions/class_hierarchy.m000066400000000000000000000046301435650067400235220ustar00rootroot00000000000000#import "Testing.h" #import // OS X doesn't seem to provide all of the runtime functions by default. #ifndef GNUSTEP # include #endif // Simple root class - test that the runtime does the right thing with new // roots @interface Bar { id isa; } @end @implementation Bar @end // Some simple classes that inherit from root classes in Foundation. Test that // they go in the right places in the runtime. @interface Foo : NSObject @end @implementation Foo @end @interface Foo2 : Foo @end @implementation Foo2 @end @interface Proxy : NSProxy @end @implementation Proxy @end @interface Proxy2 : Proxy @end @implementation Proxy2 @end /** * Tests a root class has its superclass and metaclass correctly configured */ void testRootClass(const char *clsName) { testHopeful = YES; START_SET("testRootClass") Class cls = objc_getClass(clsName); Class super = class_getSuperclass(cls); Class meta = object_getClass(cls); Class superMeta = class_getSuperclass(meta); Class metaMeta = object_getClass(meta); PASS(Nil == super, "superclass of root class is Nil"); PASS(metaMeta == meta, "root class's metaclass is also its metaclass's metaclass"); PASS(cls == superMeta, "Root class is its metaclass's superclass"); END_SET("testRootClass") } /** * Tests a non-root class and its metaclass are in the correct place in the * hierarchy. */ void testNonRootClass(const char *clsName) { testHopeful = YES; START_SET("testNonRootClass") Class cls = objc_getClass(clsName); Class super = class_getSuperclass(cls); Class meta = object_getClass(cls); Class superMeta = class_getSuperclass(meta); Class metaMeta = object_getClass(meta); Class metaSuper = object_getClass(super); Class root = super; Class rootMeta = Nil; do { rootMeta = object_getClass(root); root = class_getSuperclass(root); } while (root != Nil); PASS(Nil != super, "Non-root class has a superclass"); PASS(superMeta == metaSuper, "Metaclass's superclass is superclass's metaclass"); PASS(rootMeta == metaMeta, "Metaclass's metaclass is root class's metaclass"); END_SET("testNonRootClass") } int main(void) { testRootClass("NSObject"); testRootClass("NSProxy"); testRootClass("Bar"); testNonRootClass("Foo"); testNonRootClass("Foo2"); testNonRootClass("Proxy"); testNonRootClass("Proxy2"); return 0; } gnustep-base-1.29.0/Tests/base/Functions/clsCreate.m000066400000000000000000000012201435650067400222540ustar00rootroot00000000000000#import #import "Testing.h" static NSString *desc = @"[MyObject]"; static NSString * myObjectDescription(id self, SEL _cmd) { return desc; } int main(void) { id obj; Class cls; NSAutoreleasePool *pool; pool = [NSAutoreleasePool new]; cls = (Class)objc_allocateClassPair([NSObject class], "MyObject", 0); if (cls != Nil) { objc_registerClassPair(cls); class_addMethod(cls, @selector(description), (IMP)myObjectDescription, "@@:"); obj = [cls new]; pass([obj description] == desc, "New class's description method is called correctly"); [obj release]; } return 0; } gnustep-base-1.29.0/Tests/base/Functions/runtime.m000066400000000000000000000171251435650067400220450ustar00rootroot00000000000000#import "Testing.h" #import #import #import #import #import #import #include #if defined(GNUSTEP) #import #else #include #endif static int c1count = 0; static int c1initialize = 0; static int c1load = 0; @interface Class1 : NSObject { int ivar1; Class1 *ivar1obj; } - (const char *) sel1; @end @implementation Class1 + (void) initialize { if (self == [Class1 class]) c1initialize = ++c1count; } + (void) load { c1load = ++c1count; } - (const char *) sel1 { return ""; } @end @protocol SubProto - (const char *) sel2; @end @interface SubClass1 : Class1 { int ivar2; } - (const char *) sel2; @end @implementation SubClass1 - (const char *) sel2 { return ""; } @end @interface SubClass1 (Cat1) - (BOOL) catMethod; - (const char *) sel2; @end @implementation SubClass1 (Cat1) - (BOOL) catMethod { return YES; } - (const char *) sel2 { return "category sel2"; } @end int main(int argc, char *argv[]) { id obj; Class cls; Class meta; SEL sel; Ivar ivar; Ivar *ivars; unsigned int count; Method method; Method *methods; Protocol **protocols; NSUInteger s; NSUInteger a; const char *t0; const char *t1; const char *n; t0 = "1@1:@"; t1 = NSGetSizeAndAlignment(t0, &s, &a); PASS(t1 == &t0[2], "NSGetSizeAndAlignment() steps through id"); t1 = NSGetSizeAndAlignment(t1, &s, &a); PASS(t1 == &t0[4], "NSGetSizeAndAlignment() steps through sel"); PASS(NO == class_isMetaClass(Nil), "class_isMetaClass() returns NO for Nil"); PASS(Nil == class_getSuperclass(Nil), "class_getSuperclass() returns NO for Nil"); /* NB. the OSX documentation says that the function returns an empty string * when given a Nil argument, but the actual behavior on OSX 10.6 is to * return the string "nil" */ PASS_RUNS(n = class_getName(Nil), "class_getName() for Nil does not crash") PASS(n != 0 && strcmp(n, "nil") == 0, "class_getName() for Nil is nil"); PASS(0 == class_getInstanceVariable(Nil, 0), "class_getInstanceVariables() for Nil,0 is 0"); PASS(0 == class_getVersion(Nil), "class_getVersion() for Nil is 0"); obj = [NSObject new]; cls = [SubClass1 class]; PASS(c1initialize != 0, "+initialize was called"); PASS(c1load != 0, "+load was called"); PASS(c1initialize > c1load, "+load occurs before +initialize"); PASS(strcmp(class_getName(cls), "SubClass1") == 0, "class name works"); PASS(YES == class_respondsToSelector(cls, @selector(sel2)), "class_respondsToSelector() works for class method"); PASS(YES == class_respondsToSelector(cls, @selector(sel1)), "class_respondsToSelector() works for superclass method"); PASS(NO == class_respondsToSelector(cls, @selector(rangeOfString:)), "class_respondsToSelector() returns NO for unknown method"); PASS(NO == class_respondsToSelector(cls, 0), "class_respondsToSelector() returns NO for nul selector"); PASS(NO == class_respondsToSelector(0, @selector(sel1)), "class_respondsToSelector() returns NO for nul class"); meta = object_getClass(cls); PASS(class_isMetaClass(meta), "object_getClass() retrieves meta class"); PASS(strcmp(class_getName(meta), "SubClass1") == 0, "metaclass name works"); ivar = class_getInstanceVariable(cls, 0); PASS(ivar == 0, "class_getInstanceVariable() returns 0 for null name"); ivar = class_getInstanceVariable(cls, "bad name"); PASS(ivar == 0, "class_getInstanceVariable() returns 0 for non-existent"); ivar = class_getInstanceVariable(0, "ivar2"); PASS(ivar == 0, "class_getInstanceVariable() returns 0 for Nil class"); ivar = class_getInstanceVariable(cls, "ivar2"); PASS(ivar != 0, "class_getInstanceVariable() works"); ivar = class_getInstanceVariable(cls, "ivar1"); PASS(ivar != 0, "class_getInstanceVariable() works for superclass ivar"); ivar = class_getInstanceVariable(cls, "ivar1obj"); PASS(ivar != 0, "class_getInstanceVariable() works for superclass obj ivar"); methods = class_copyMethodList(cls, &count); PASS(count == 3, "SubClass1 has three methods"); PASS(methods[count] == 0, "method list is terminated"); method = methods[2]; sel = method_getName(method); PASS(sel_isEqual(sel, sel_getUid("sel2")), "last method is sel2"); PASS(method_getImplementation(method) != [cls instanceMethodForSelector: sel], "method 2 is the original, overridden by the category"); method = methods[0]; sel = method_getName(method); PASS(sel_isEqual(sel, sel_getUid("catMethod")) || sel_isEqual(sel, sel_getUid("sel2")), "method 0 has expected name"); if (sel_isEqual(sel, sel_getUid("catMethod"))) { method = methods[1]; sel = method_getName(method); PASS(sel_isEqual(sel, sel_getUid("sel2")), "method 1 has expected name"); PASS(method_getImplementation(method) == [cls instanceMethodForSelector: sel], "method 1 is the category method overriding original"); } else { PASS(method_getImplementation(method) == [cls instanceMethodForSelector: sel], "method 0 is the category method overriding original"); method = methods[1]; sel = method_getName(method); PASS(sel_isEqual(sel, sel_getUid("catMethod")), "method 1 has expected name"); } ivars = class_copyIvarList(cls, &count); PASS(count == 1, "SubClass1 has one ivar"); PASS(ivars[count] == 0, "ivar list is terminated"); PASS(strcmp(ivar_getName(ivars[0]), "ivar2") == 0, "ivar has correct name"); PASS(strcmp(ivar_getTypeEncoding(ivars[0]), @encode(int)) == 0, "ivar has correct type"); protocols = class_copyProtocolList(cls, &count); PASS(count == 1, "SubClass1 has one protocol"); PASS(protocols[count] == 0, "protocol list is terminated"); PASS(strcmp(protocol_getName(protocols[0]), "SubProto") == 0, "protocol has correct name"); cls = objc_allocateClassPair([NSString class], "runtime generated", 0); PASS(cls != Nil, "can allocate a class pair"); PASS(class_addIvar(cls, "iv1", 1, 6, "c") == YES, "able to add iVar 'iv1'"); PASS(class_addIvar(cls, "iv2", 1, 5, "c") == YES, "able to add iVar 'iv2'"); PASS(class_addIvar(cls, "iv3", 1, 4, "c") == YES, "able to add iVar 'iv3'"); PASS(class_addIvar(cls, "iv4", 1, 3, "c") == YES, "able to add iVar 'iv4'"); objc_registerClassPair (cls); ivar = class_getInstanceVariable(cls, "iv1"); PASS(ivar != 0, "iv1 exists"); PASS(ivar_getOffset(ivar) == 64, "iv1 offset is 64"); ivar = class_getInstanceVariable(cls, "iv2"); PASS(ivar != 0, "iv2 exists"); PASS(ivar_getOffset(ivar) == 96, "iv2 offset is 96"); ivar = class_getInstanceVariable(cls, "iv3"); PASS(ivar != 0, "iv3 exists"); PASS(ivar_getOffset(ivar) == 112, "iv3 offset is 112"); ivar = class_getInstanceVariable(cls, "iv4"); PASS(ivar != 0, "iv4 exists"); PASS(ivar_getOffset(ivar) == 120, "iv4 offset is 120"); /* NSObjCRuntime function tests. */ sel = NSSelectorFromString(nil); PASS(sel == 0, "NSSelectorFromString() returns 0 for nil string"); PASS(NSStringFromSelector(0) == nil, "NSStringFromSelector() returns nil for null selector"); sel = NSSelectorFromString(@"xxxyyy_odd_name_xxxyyy"); PASS(sel != 0, "NSSelectorFromString() creates for non-existent selector"); PASS([NSStringFromSelector(sel) isEqual: @"xxxyyy_odd_name_xxxyyy"], "NSStringFromSelector() works for existing selector"); return 0; } gnustep-base-1.29.0/Tests/base/GNUmakefile.postamble000066400000000000000000000013231435650067400222640ustar00rootroot00000000000000# # GNUmakefile.postamble for base tests # # Find all all subdirectories and run a clean in them independantly # after-clean:: $(ECHO_NOTHING)\ RUNDIR=`pwd`; \ TESTDIRS=`find . -type d`; \ for dir in $$TESTDIRS __done; do \ if [ $$dir != . -a -f $$dir/GNUmakefile ]; then \ echo Cleaning $$dir; cd $$dir; make clean; cd $$RUNDIR; \ fi \ done \ $(END_ECHO) after-distclean:: $(ECHO_NOTHING)\ RUNDIR=`pwd`; \ TESTDIRS=`find . -type d`; \ for dir in $$TESTDIRS __done; do \ if [ $$dir != . -a -f $$dir/GNUmakefile ]; then \ echo Cleaning $$dir; cd $$dir; make distclean; \ if [ \! -f IGNORE ]; then \ $(RM) GNUmakefile; \ fi; \ cd $$RUNDIR; \ fi \ done \ $(END_ECHO) gnustep-base-1.29.0/Tests/base/GNUmakefile.super000066400000000000000000000005461435650067400214420ustar00rootroot00000000000000 # This is here to force the test sourcecode to be treated as UTF-8 # irrespective of the locale the testsuite is being run in. That # allows any UTF-8 characters in the source to be handled correctly # by the compiler. Of course, all test files need to be written in # UTF-8 encoding for this to make sense. ADDITIONAL_OBJC_FLAGS+="-finput-charset=UTF-8" gnustep-base-1.29.0/Tests/base/GSMime/000077500000000000000000000000001435650067400173475ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/GSMime/HTTP1.dat000066400000000000000000000003251435650067400207010ustar00rootroot00000000000000HTTP/1.1 200 OK Date: Thu, 02 Oct 2008 17:07:20 GMT Server: Microsoft-IIS/6.0 MicrosoftOfficeWebServer: 5.0_Pub X-Powered-By: ASP.NET X-AspNet-Version: 2.0.50727 Cache-Control: private Content-Length: 0 gnustep-base-1.29.0/Tests/base/GSMime/HTTP2.dat000066400000000000000000000002601435650067400207000ustar00rootroot00000000000000HTTP/1.1 200 OK Content-Type: text/plain Transfer-Encoding: chunked 25 This is the data in the first chunk 1C and this is the second one 3 con 8 sequence 0 gnustep-base-1.29.0/Tests/base/GSMime/TestInfo000066400000000000000000000000001435650067400210130ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/GSMime/build.m000066400000000000000000000047541435650067400206360ustar00rootroot00000000000000#if defined(GNUSTEP_BASE_LIBRARY) #import #import #import "Testing.h" static int find(const char *buf, unsigned len, const char *str) { int l = strlen(str); int max = len - l; int i; for (i = 0; i < max; i++) { if (strncmp(buf + i, str, l) == 0) { return i; } } return -1; } int main(int argc,char **argv) { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSData *data = nil; NSString *string = nil; GSMimeDocument *doc = [[GSMimeDocument alloc] init]; NSMutableDictionary *par = [[NSMutableDictionary alloc] init]; [par setObject: @"my/type" forKey: @"type"]; [doc setContent: @"Hello\r\n"]; [doc setHeader: [[GSMimeHeader alloc] initWithName: @"content-type" value: @"text/plain" parameters: par]]; [doc setHeader: [[GSMimeHeader alloc] initWithName: @"content-transfer-encoding" value: @"binary" parameters: nil]]; data = [NSData dataWithContentsOfFile: @"mime8.dat"]; PASS([[doc rawMimeData] isEqual: data], "Can make a simple document"); string = @"ABCD credit card account − more information about Peach Pay."; [doc setHeader: [[GSMimeHeader alloc] initWithName: @"subject" value: string parameters: nil]]; data = [doc rawMimeData]; PASS(data != nil, "Can use non-ascii character in subject"); doc = [GSMimeParser documentFromData: data]; PASS_EQUAL([[doc headerNamed: @"subject"] value], string, "Can restore non-ascii character in subject"); data = [[GSMimeSerializer smtp7bitSerializer] encodeDocument: doc]; PASS(data != nil, "Can serialize with non-ascii character in subject"); doc = [GSMimeParser documentFromData: data]; PASS_EQUAL([[doc headerNamed: @"subject"] value], string, "Can restore non-ascii character in subject form serialized document"); [doc setHeader: [[GSMimeHeader alloc] initWithName: @"subject" value: @"€" parameters: nil]]; data = [doc rawMimeData]; const char *bytes = "MIME-Version: 1.0\r\n" "Content-Type: text/plain; type=\"my/type\"\r\n" "Subject: =?utf-8?B?4oKs?=\r\n\r\n"; PASS(find((char*)[data bytes], (unsigned)[data length], "?B?4oKs?=") > 0, "encodes utf-8 euro in subject"); [arp release]; arp = nil; return 0; } #else int main(int argc,char **argv) { return 0; } #endif gnustep-base-1.29.0/Tests/base/GSMime/general.m000066400000000000000000000247531435650067400211550ustar00rootroot00000000000000#if defined(GNUSTEP_BASE_LIBRARY) #import #import #import "Testing.h" @interface GSMimeHeader (Testing) + (NSUInteger) appendString: (NSString*)str to: (NSMutableData*)m at: (NSUInteger)offset fold: (NSUInteger)fold ok: (BOOL*)ok; @end static GSMimeDocument * parse(GSMimeParser **parserPointer, NSData *data) { GSMimeParser *parser; unsigned length = [data length]; unsigned index; if (0 == parserPointer) { parser = [[GSMimeParser new] autorelease]; } else { if (nil == *parserPointer) { *parserPointer = [[GSMimeParser new] autorelease]; } parser = *parserPointer; } for (index = 0; index < length-1; index++) { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSData *d; d = [data subdataWithRange: NSMakeRange(index, 1)]; if ([parser parse: d] == NO) { return [parser mimeDocument]; } [arp release]; } data = [data subdataWithRange: NSMakeRange(index, 1)]; if ([parser parse: data] == YES && NO == [parser isComplete]) { [parser parse: nil]; } return [parser mimeDocument]; } static GSMimeDocument * exact(GSMimeParser **parserPointer, NSData *data) { GSMimeParser *parser = nil; GSMimeDocument *doc; if (0 == parserPointer) { parserPointer = &parser; } doc = parse(parserPointer, data); if (nil != [parser excess]) { NSLog(@"Excess data in parser after parse completed"); doc = nil; } return doc; } int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSData *cr; NSData *data; NSData *orig; NSString *obj0; NSString *obj1; NSString *str; GSMimeParser *parser; GSMimeDocument *doc; GSMimeDocument *idoc; GSMimeHeader *hdr; BOOL oldStyleFolding; oldStyleFolding = [[NSUserDefaults standardUserDefaults] boolForKey: @"GSMimeOldStyleFolding"]; cr = [NSData dataWithBytes: "\r" length: 1]; hdr = [GSMimeHeader headerWithName: @"From" value: @"Maurizio Buratti is testing the lenght of the field so it doesn't create issues with email sending " parameters: nil]; data = [hdr rawMimeData]; PASS_EQUAL([data description], @"<46726f6d 3a204d61 7572697a 696f2042 75726174 74692069 73207465 7374696e 67207468 65206c65 6e676874 206f6620 74686520 6669656c 6420736f 20697420 646f6573 6e27740d 0a206372 65617465 20697373 75657320 77697468 20656d61 696c2073 656e6469 6e670d0a 203c656d 61696c74 65737469 6e674065 6d61696c 74657374 2d647261 676f6e74 65737432 2e627261 696e7374 6f726d2e 636f2e75 6b3e0d0a>", "encode long header ok"); data = [NSData dataWithBytes: "DQ==" length: 4]; PASS_EQUAL([GSMimeDocument decodeBase64: data], cr, "decodeBase64 works for padded data"); data = [NSData dataWithBytes: "DQ" length: 2]; PASS_EQUAL([GSMimeDocument decodeBase64: data], cr, "decodeBase64 works for unpadded data"); data = [NSData dataWithContentsOfFile: @"mime1.dat"]; idoc = exact(0, data); PASS_EQUAL([[[idoc content] objectAtIndex:0] content], @"a", "can parse one char base64 mime1.dat incrementally"); doc = [GSMimeParser documentFromData: data]; PASS_EQUAL([[[doc content] objectAtIndex:0] content], @"a", "can parse one char base64 mime1.dat in one go"); PASS_EQUAL(idoc, doc, "mime1.dat documents are the same"); parser = [GSMimeParser new]; data = [[data mutableCopy] autorelease]; [(NSMutableData*)data appendBytes: "\r\n\r\n" length: 4]; [parser parse: data]; doc = [parser mimeDocument]; PASS([[parser excess] length] == 5 || [[parser excess] length] == 6, "Can detect excess data in multipart"); [parser release]; data = [NSData dataWithContentsOfFile: @"mime2.dat"]; idoc = exact(0, data); PASS_EQUAL([idoc content], @"aa", "can parse two char base64 mime2.dat incrementally"); doc = [GSMimeParser documentFromData: data]; PASS_EQUAL([doc content], @"aa", "can parse two char base64 mime2.dat in one go"); PASS_EQUAL(idoc, doc, "mime2.dat documents are the same"); data = [NSData dataWithContentsOfFile: @"mime3.dat"]; idoc = exact(0, data); PASS(([[idoc content] isEqual: @"aaa"]), "can parse three char base64 mime3.dat incrementally"); doc = [GSMimeParser documentFromData: data]; PASS(([[doc content] isEqual: @"aaa"]), "can parse three char base64 mime3.dat in one go"); PASS([idoc isEqual: doc], "mime3.dat documents are the same"); data = [NSData dataWithContentsOfFile: @"mime4.dat"]; idoc = exact(0, data); obj0 = [[[idoc content] objectAtIndex:0] content]; obj1 = [[[idoc content] objectAtIndex:1] content]; PASS(([obj0 isEqual: @"hello\n"] && [obj1 isEqual: @"there\n"]) || ([obj0 isEqual: @"hello\r\n"] && [obj1 isEqual: @"there\r\n"]), "can parse multi-part text mime4.dat incrementally"); PASS(([[[[idoc content] objectAtIndex:0] contentFile] isEqual: @"a.a"]), "can extract content file name from mime4.dat (incrementally parsed)"); PASS(([[[[idoc content] objectAtIndex:0] contentType] isEqual: @"text"]), "can extract content type from mime4.dat (incrementally parsed)"); PASS(([[[[idoc content] objectAtIndex:0] contentSubtype] isEqual: @"plain"]), "can extract content sub type from mime4.dat (incrementally parsed)"); doc = [GSMimeParser documentFromData: data]; obj0 = [[[doc content] objectAtIndex:0] content]; obj1 = [[[doc content] objectAtIndex:1] content]; PASS(([obj0 isEqual: @"hello\n"] && [obj1 isEqual: @"there\n"]) || ([obj0 isEqual: @"hello\r\n"] && [obj1 isEqual: @"there\r\n"]), "can parse multi-part text mime4.dat in one go"); PASS(([[[[doc content] objectAtIndex:0] contentFile] isEqual: @"a.a"]), "can extract content file name from mime4.dat (parsed in one go)"); PASS(([[[[doc content] objectAtIndex:0] contentType] isEqual: @"text"]), "can extract content type from mime4.dat (parsed in one go)"); PASS(([[[[doc content] objectAtIndex:0] contentSubtype] isEqual: @"plain"]), "can extract content sub type from mime4.dat (parsed in one go)"); PASS([idoc isEqual: doc], "mime4.dat documents are the same"); data = [NSData dataWithContentsOfFile: @"mime5.dat"]; idoc = exact(0, data); PASS(([[idoc contentSubtype] isEqual: @"xml"]), "can parse http document mime5.dat incrementally"); doc = [GSMimeParser documentFromData: data]; PASS(([[doc contentSubtype] isEqual: @"xml"]), "can parse http document mime5.dat in one go"); PASS([idoc isEqual: doc], "mime5.dat documents are the same"); data = [NSData dataWithContentsOfFile: @"mime6.dat"]; idoc = exact(0, data); PASS(([[idoc content] count] == 3), "can parse multipart mixed mime6.dat incrementally"); doc = [GSMimeParser documentFromData: data]; PASS(([[doc content] count] == 3), "can parse multipart mixed mime6.dat in one go"); PASS([idoc isEqual: doc], "mime6.dat documents are the same"); data = [NSData dataWithContentsOfFile: @"mime7.dat"]; PASS(([[[[doc content] objectAtIndex:1] content] isEqual: data]), "mime6.dat binary data part matches mime7.dat"); data = [NSData dataWithContentsOfFile: @"mime9.dat"]; idoc = exact(0, data); if (YES == oldStyleFolding) { str = @"first second third"; } else { str = @"first\tsecond\tthird"; } PASS(([[[idoc headerNamed: @"Long"] value] isEqual: str]), "mime9.dat folded header unfolds correctly incrementally"); doc = [GSMimeParser documentFromData: data]; //NSLog(@"'%@'", [[doc headerNamed: @"Long"] value]); PASS(([[[doc headerNamed: @"Long"] value] isEqual: str]), "mime9.dat folded header unfolds correctly in one go"); PASS([idoc isEqual: doc], "mime9.dat documents are the same"); /* Test a document containing nested multipart documents */ data = [NSData dataWithContentsOfFile: @"mime10.dat"]; idoc = exact(0, data); doc = [GSMimeParser documentFromData: data]; PASS_EQUAL(idoc, doc, "mime10.dat documents are the same"); data = [idoc rawMimeData]; doc = [GSMimeParser documentFromData: data]; PASS_EQUAL(idoc, doc, "rawMimeData reproduces document"); /* Test parse of a document containing encoded words in header. * Use JavaMail encoded words (different format from those GSMime * produces). */ data = [NSData dataWithContentsOfFile: @"mime11.dat"]; idoc = exact(0, data); doc = [GSMimeParser documentFromData: data]; PASS_EQUAL(idoc, doc, "mime11.dat documents are the same"); NSData *oData = [doc rawMimeData: YES foldedAt: 78]; GSMimeDocument *oDoc = [GSMimeParser documentFromData: oData]; PASS_EQUAL(doc, oDoc, "mime11.dat (folded and quoted boundary header) equal after writing and re-parsing"); /* Test a document with adjacent encoded words in headers, as * produced by GSMime */ orig = [NSData dataWithContentsOfFile: @"mime12.dat"]; idoc = exact(0, orig); if (YES == oldStyleFolding) { str = @"Avant de partir, n'oubliez pas de préparer votre séjour à Paris"; } else { str = @"Avant de partir, n'oubliez pas de préparer votre\tséjour à Paris"; } doc = [GSMimeDocument documentWithContent: @"hello" type: @"text/plain" name: nil]; [doc setHeader: @"MIME-Version" value: @"1.0" parameters: nil]; [doc setHeader: @"Subject" value: str parameters: nil]; PASS_EQUAL(idoc, doc, "mime12.dat same as internally generated content"); doc = [GSMimeParser documentFromData: orig]; PASS_EQUAL(idoc, doc, "mime12.dat documents are the same"); data = [idoc rawMimeData]; doc = [GSMimeParser documentFromData: data]; PASS_EQUAL(idoc, doc, "rawMimeData reproduces document with 'Q' header"); // NSLog(@"Made\n%@\nOrig\n%@", data, orig); if (NO == oldStyleFolding) { [idoc setHeader: @"Subject" value: @"==répà==" parameters: nil]; data = [idoc rawMimeData]; // NSLog(@"Made\n%@", data); doc = [GSMimeParser documentFromData: data]; PASS_EQUAL(doc, idoc, "rawMimeData reproduces document with 'B' header"); /* Header where Euro character would cross folding boundary */ [idoc setHeader: @"Subject" value: @"Benefit from 6.1% APR rate 111111on los over €20,000" parameters: nil]; data = [idoc rawMimeData]; // NSLog(@"Made\n%@", data); doc = [GSMimeParser documentFromData: data]; PASS_EQUAL(doc, idoc, "rawMimeData reproduces document with long header"); } [arp release]; arp = nil; return 0; } #else int main(int argc,char **argv) { return 0; } #endif gnustep-base-1.29.0/Tests/base/GSMime/mime1.dat000066400000000000000000000003241435650067400210500ustar00rootroot00000000000000content-type: multipart/mixed; boundary=xxxx --xxxx content-transfer-encoding: base64 YQ== --xxxx content-transfer-encoding: 8bit Hello there --xxxx content-transfer-encoding: 7bit Testing again. --xxxx-- gnustep-base-1.29.0/Tests/base/GSMime/mime10.dat000066400000000000000000000227501435650067400211370ustar00rootroot00000000000000Date: Mon, 27 May 2002 09:41:03 +0100 Mime-Version: 1.0 (Apple Message framework v481) Content-Type: multipart/mixed; boundary=Apple-Mail-2--915493160 Subject: test From: Richard Frith-Macdonald To: Richard Frith-Macdonald Message-Id: <7A6B10F5-714D-11D6-9738-00306544502E@brainstorm.co.uk> X-Mailer: Apple Mail (2.481) X-SpamBouncer: 1.4 (10/07/01) X-SBClass: OK --Apple-Mail-2--915493160 Content-Disposition: attachment; filename=a.a Content-Transfer-Encoding: 7bit Content-Type: text/plain; x-unix-mode=0644; name="a.a" hello --Apple-Mail-2--915493160 Content-Disposition: attachment; filename=b.b Content-Transfer-Encoding: 7bit Content-Type: text/plain; x-unix-mode=0644; name="b.b" there --Apple-Mail-2--915493160 Content-Transfer-Encoding: 7bit Content-Type: multipart/mixed; boundary="e7paaJyQU/hlJOcvRPG4PgAAAAU=" --e7paaJyQU/hlJOcvRPG4PgAAAAU= Content-Type: application/smil; charset=us-ascii; name=mms.smil Content-Transfer-Encoding: 7bit --e7paaJyQU/hlJOcvRPG4PgAAAAU= Content-Type: image/gif; name=SME46224_1.gif Content-Transfer-Encoding: base64 R0lGODlhUABaAMQAAAAAAP///8zMzLKyspmZmQEjWGZmZlFSUgkVKOTk5Fmm3DMzMxROqCtPafT0 9Hp/ggY3hKnc8tzw+hZn5iEjJYewweb5/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAA AAAALAAAAABQAFoAAAX/YCCOZGmepqOurIO+cCzPAZvceI6zdO/HK5xgSCwad6qfshdMEAfQaJQg jRJvq6U25RAKpoTwY0wmh8NWAXKrVd2G4Ad6mHCJunDxGUqv29kzbk5fA3oDCT8JhWNUA31JgDCC hARyhyROUGd7jmqYi410kJElk1+VBAJ2Dl8PBgcHCwsUCLUUsgcGlnV3Aqh8WH+kk4VhqiJfr7MA zM3OzxS5qYg1oI7BpDV4p1TUvgbLz+LjzNEPlwGKltejW26UqcgE4Ajk9uQIB+fev2rtSu8WXXIw gN69g/gOxEvXz08bPMUGIHtwgALCe/XsUTAwwM4AS/6E0QhoTETBBRft/9WqdVAhtY9UQvoguXBA xZT4EDRokPHeAgIvQTocmalkAJs9D65cWqtAgwc8ASQdR+HBSwMxeQV681Hi0QMImYqtBeFBhQdM D1o1iZWdDJJebYZlWqDAyroFGCiIwGDsvbUB5nX7l6Io0KMGpopbirex3QIQ9vIdy5IqARcJGPmT 9KakAAMWczZ1TDqvAgl88VJWvKBjgM/nNqOASKXGA5SiEZSuCwECb7MBIvhuTFmcAQEiBB8SOYL2 YbnjGDfuzbs3A+unJVS4Przu6meX02nWWirTA+QJQEcfjbe3ewgMGEyYP0FBhQgRFMyPT111Wmet VdPWMeVx4wIBuD1z1/901slHX3zxmVWBAlHlNcF1ji1lHGauTCMSROe9lthi7EHmXnzzQbCSVKvp dmF33mnYDAISOTBPbB8qEsaBCc5Y4okOQsCiTg3E8l1eGPq3ojMGuPAZVrLVUJRE6Sk2mm8N7rfS AV6NkAABB2z52gIIwNefkknRWINy5OFRCSLQOXMlkPWhVQtyLxCwEnIC1PJiaUsyQ4CAsVFTAzdr huajbibC56ACtSwwgwBkHiACWvwBWhkzCyCSHpS80CbRZyS2lyWFCEjqJZgKmUCpmnrKxx1xdm0K AJU3LidlK3CCJSejjcI3H6QI4BkYUwcYalKqAWCqAHfd/cfMA9Xo44j/C10Uk5yizMx5Kk+WJlfL eUiFS0KYdirwLLQZ9pSPkwaAeqi2DjxQ6nuOqlvLoK/tO0KfCPA7wgBLqQvhmbVWVg+f8Q42ZToG KMjoeyjqd+elCFD7Wpgr8esLmfUgoN/BMEpLpSv7gMiwjws0gK+j9RE7QphUgpyqzSu1XAAACyjw AH/uxRjooJnpcq15fPoq1VMETKjuz/GpO0EtI9wpAMfMZlbLU+qqS2YDPkMbbaDU2qjPNOYhQumM C8gRgQRwR+B011SLMC6ZIIebQKpd912Lwe+124wBa0qjhhOVuDBAaCuVZd/bIiQQdwUXB4D1oFcH jHHfXX/tc+DEVSYp/0GGd6Yxwd1KxRsDDzz+NmoR8KSxnvl4WfuxnHctVX1At5sRBSZJcwjip2cU 8sTWtX4ffmipmkClJNxOAAC5q9sAz+sGrWQzwbdl+rJDAgtk6/ZVQLnmR9VyAHJ6hotW1zzppG/G zyKccDnVek+8k4x7C+EDMbNe5V6VMzzJQl/xk9/1esau7fGscPrzxVrWJh0gsc5vOTNUJfSBJ4K1 jicFIFOf5te6WTmQcF8SHldCdLXUIe9EAJwfU7pUAoDBr1Zksh4AwAa0sdWDWplRIdIg1q0FUQx+ 9RCg+g4jj3HlDio9U5dUAIcwlmDuFaAyz8lcaKp8EQt7XpNFzozkxP/qda11OTSYCb1zKxE1zB+I slHIWFQdmNlpDNVrAM6eAjYzes1nAFDehH5GHZYgpyBG84eONEZBIzYIVW3zo89CFkZJRpJvy8uP AgzQALscQHG5wJGbjkPEItYRPk+jZCrp9zS09LEeUcwd13iiLvPhR270IBpFEhmQc6zpV3XUCyB/ iEHORVKGZmwdWsiHR3WBgwKjwuJg5hUGk6DkeMEUJsjIJ0VW6uuMBate67DXw05Go1e68JCUFuGp iJkyWFEbw9YESL1J/k0BOLvnTlIJKR6a0F9BTGSotFgNd4kvedYjk1Raxk1aTlIhLKmHU/jmNZ30 0DsUOKQ0r9WcUzz/ADPupGMXhWlPbxozZF/Y2opU+rcGjksFYEqnru6AOI6A752NiprPoqJKcD4g AppLos8UuhJ/ag8BGRVRKN1C01Z8tAYhXVBOhRm/WnETkMjJ2N5E1jeocPOi+4JpLgaUo0LY9CgJ cuQjo9LJm3GzKflIV9/qw7ty2mUBGg2lOkkAIsBMr4jiy+kEuMaUhmooY3Slz4XEpouKnGysWWHO KMOTHh85hmLD2olu7CSVvmQskIHEz4QWK7an3GYtNomXHKLEV/NwxElKk2ow+0bLwoqsdQWwigXy QzLqNACLDNMrUwsjwRAdRVElMpVe5kYsVEntWSKzgHYICTqkBiig/wJlTnOydaOXGJQ02DEf/HoG la5xR5gP0J6ScDVWoWi3OUXBincBK1VU4udZAeyb2EAntFrUiFUyZe1sXMvExdGXMXqRG38gxGB8 NQpN0EwOLBrGjvfy1U0deomvxFKXBCvgZSCezva4VLj2RpYoHoWSk+x1YPsaYDe8gfGKQpRCEw93 K6dQ7TG+dM0hFcAA6upvcjWVqksIgCI2lslMiuIKjngDLSx7RaAA6ztb1ASLqo2shTmTYijdoSC2 oMAtLLKRSyhCPZSpyo7nMdYAD2UJtHFFLrrUBbUhiGc0HJjSpAIAhRyDIK9os3u3vJX4SkO7BTGW q3ylEHQQBMnxSv+nlofBFTYvgJQpiMEXPBG5j0w40utQ8jBoowxFAyTHn85yTESdjV2ZNVmETkGK YdFmSQPjza1uqlk7YQVllcesslhArRnBB1bnGr6toIIY3PvrecxC2KqVQygOR5hjN/VGcl4qa1nh 7GcLt9jYsPaAUR1sYWsZIsqYhfA6sQZxc/nVs7jFtPOQ7lskktrVdncpSK2MjWxCDOAotxDzre8T kKTJE25yoMtt70LFuuD7HkQxAp2LWJTb26B6OMS5IPFKpJvhtxCegDfOhDrn+OPBFjl5SA7nOMeL 1lm+xspZDudKV8IMWZk5zVsu8So8YufZEMQgDodroEeiBTwoeAgBAAA7 --e7paaJyQU/hlJOcvRPG4PgAAAAU= Content-Type: text/plain; charset=us-ascii; name=SME46224_2.txt Content-Transfer-Encoding: 7bit You won't be worried about what people think of you once you see how they flock around today. The mere fact that someone has questions and interest in what you're doing suggests that they admire you for who and what you are. --e7paaJyQU/hlJOcvRPG4PgAAAAU= Content-Transfer-Encoding: 7bit Content-Type: multipart/mixed; boundary="f7paaJyQU/hlJOcvRPG4PgAAAAU=" --f7paaJyQU/hlJOcvRPG4PgAAAAU= Content-Type: application/smil; charset=us-ascii; name=mms.smil Content-Transfer-Encoding: 7bit --f7paaJyQU/hlJOcvRPG4PgAAAAU= Content-Type: image/gif; name=SME46224_1.gif Content-Transfer-Encoding: base64 R0lGODlhUABaAMQAAAAAAP///8zMzLKyspmZmQEjWGZmZlFSUgkVKOTk5Fmm3DMzMxROqCtPafT0 9Hp/ggY3hKnc8tzw+hZn5iEjJYewweb5/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAA AAAALAAAAABQAFoAAAX/YCCOZGmepqOurIO+cCzPAZvceI6zdO/HK5xgSCwad6qfshdMEAfQaJQg jRJvq6U25RAKpoTwY0wmh8NWAXKrVd2G4Ad6mHCJunDxGUqv29kzbk5fA3oDCT8JhWNUA31JgDCC hARyhyROUGd7jmqYi410kJElk1+VBAJ2Dl8PBgcHCwsUCLUUsgcGlnV3Aqh8WH+kk4VhqiJfr7MA zM3OzxS5qYg1oI7BpDV4p1TUvgbLz+LjzNEPlwGKltejW26UqcgE4Ajk9uQIB+fev2rtSu8WXXIw gN69g/gOxEvXz08bPMUGIHtwgALCe/XsUTAwwM4AS/6E0QhoTETBBRft/9WqdVAhtY9UQvoguXBA xZT4EDRokPHeAgIvQTocmalkAJs9D65cWqtAgwc8ASQdR+HBSwMxeQV681Hi0QMImYqtBeFBhQdM D1o1iZWdDJJebYZlWqDAyroFGCiIwGDsvbUB5nX7l6Io0KMGpopbirex3QIQ9vIdy5IqARcJGPmT 9KakAAMWczZ1TDqvAgl88VJWvKBjgM/nNqOASKXGA5SiEZSuCwECb7MBIvhuTFmcAQEiBB8SOYL2 YbnjGDfuzbs3A+unJVS4Przu6meX02nWWirTA+QJQEcfjbe3ewgMGEyYP0FBhQgRFMyPT111Wmet VdPWMeVx4wIBuD1z1/901slHX3zxmVWBAlHlNcF1ji1lHGauTCMSROe9lthi7EHmXnzzQbCSVKvp dmF33mnYDAISOTBPbB8qEsaBCc5Y4okOQsCiTg3E8l1eGPq3ojMGuPAZVrLVUJRE6Sk2mm8N7rfS AV6NkAABB2z52gIIwNefkknRWINy5OFRCSLQOXMlkPWhVQtyLxCwEnIC1PJiaUsyQ4CAsVFTAzdr huajbibC56ACtSwwgwBkHiACWvwBWhkzCyCSHpS80CbRZyS2lyWFCEjqJZgKmUCpmnrKxx1xdm0K AJU3LidlK3CCJSejjcI3H6QI4BkYUwcYalKqAWCqAHfd/cfMA9Xo44j/C10Uk5yizMx5Kk+WJlfL eUiFS0KYdirwLLQZ9pSPkwaAeqi2DjxQ6nuOqlvLoK/tO0KfCPA7wgBLqQvhmbVWVg+f8Q42ZToG KMjoeyjqd+elCFD7Wpgr8esLmfUgoN/BMEpLpSv7gMiwjws0gK+j9RE7QphUgpyqzSu1XAAACyjw AH/uxRjooJnpcq15fPoq1VMETKjuz/GpO0EtI9wpAMfMZlbLU+qqS2YDPkMbbaDU2qjPNOYhQumM C8gRgQRwR+B011SLMC6ZIIebQKpd912Lwe+124wBa0qjhhOVuDBAaCuVZd/bIiQQdwUXB4D1oFcH jHHfXX/tc+DEVSYp/0GGd6Yxwd1KxRsDDzz+NmoR8KSxnvl4WfuxnHctVX1At5sRBSZJcwjip2cU 8sTWtX4ffmipmkClJNxOAAC5q9sAz+sGrWQzwbdl+rJDAgtk6/ZVQLnmR9VyAHJ6hotW1zzppG/G zyKccDnVek+8k4x7C+EDMbNe5V6VMzzJQl/xk9/1esau7fGscPrzxVrWJh0gsc5vOTNUJfSBJ4K1 jicFIFOf5te6WTmQcF8SHldCdLXUIe9EAJwfU7pUAoDBr1Zksh4AwAa0sdWDWplRIdIg1q0FUQx+ 9RCg+g4jj3HlDio9U5dUAIcwlmDuFaAyz8lcaKp8EQt7XpNFzozkxP/qda11OTSYCb1zKxE1zB+I slHIWFQdmNlpDNVrAM6eAjYzes1nAFDehH5GHZYgpyBG84eONEZBIzYIVW3zo89CFkZJRpJvy8uP AgzQALscQHG5wJGbjkPEItYRPk+jZCrp9zS09LEeUcwd13iiLvPhR270IBpFEhmQc6zpV3XUCyB/ iEHORVKGZmwdWsiHR3WBgwKjwuJg5hUGk6DkeMEUJsjIJ0VW6uuMBate67DXw05Go1e68JCUFuGp iJkyWFEbw9YESL1J/k0BOLvnTlIJKR6a0F9BTGSotFgNd4kvedYjk1Raxk1aTlIhLKmHU/jmNZ30 0DsUOKQ0r9WcUzz/ADPupGMXhWlPbxozZF/Y2opU+rcGjksFYEqnru6AOI6A752NiprPoqJKcD4g AppLos8UuhJ/ag8BGRVRKN1C01Z8tAYhXVBOhRm/WnETkMjJ2N5E1jeocPOi+4JpLgaUo0LY9CgJ cuQjo9LJm3GzKflIV9/qw7ty2mUBGg2lOkkAIsBMr4jiy+kEuMaUhmooY3Slz4XEpouKnGysWWHO KMOTHh85hmLD2olu7CSVvmQskIHEz4QWK7an3GYtNomXHKLEV/NwxElKk2ow+0bLwoqsdQWwigXy QzLqNACLDNMrUwsjwRAdRVElMpVe5kYsVEntWSKzgHYICTqkBiig/wJlTnOydaOXGJQ02DEf/HoG la5xR5gP0J6ScDVWoWi3OUXBincBK1VU4udZAeyb2EAntFrUiFUyZe1sXMvExdGXMXqRG38gxGB8 NQpN0EwOLBrGjvfy1U0deomvxFKXBCvgZSCezva4VLj2RpYoHoWSk+x1YPsaYDe8gfGKQpRCEw93 K6dQ7TG+dM0hFcAA6upvcjWVqksIgCI2lslMiuIKjngDLSx7RaAA6ztb1ASLqo2shTmTYijdoSC2 oMAtLLKRSyhCPZSpyo7nMdYAD2UJtHFFLrrUBbUhiGc0HJjSpAIAhRyDIK9os3u3vJX4SkO7BTGW q3ylEHQQBMnxSv+nlofBFTYvgJQpiMEXPBG5j0w40utQ8jBoowxFAyTHn85yTESdjV2ZNVmETkGK YdFmSQPjza1uqlk7YQVllcesslhArRnBB1bnGr6toIIY3PvrecxC2KqVQygOR5hjN/VGcl4qa1nh 7GcLt9jYsPaAUR1sYWsZIsqYhfA6sQZxc/nVs7jFtPOQ7lskktrVdncpSK2MjWxCDOAotxDzre8T kKTJE25yoMtt70LFuuD7HkQxAp2LWJTb26B6OMS5IPFKpJvhtxCegDfOhDrn+OPBFjl5SA7nOMeL 1lm+xspZDudKV8IMWZk5zVsu8So8YufZEMQgDodroEeiBTwoeAgBAAA7 --f7paaJyQU/hlJOcvRPG4PgAAAAU= Content-Type: text/plain; charset=us-ascii; name=SME46224_2.txt Content-Transfer-Encoding: 7bit You won't be worried about what people think of you once you see how they flock around today. The mere fact that someone has questions and interest in what you're doing suggests that they admire you for who and what you are. --f7paaJyQU/hlJOcvRPG4PgAAAAU=-- --e7paaJyQU/hlJOcvRPG4PgAAAAU=-- --Apple-Mail-2--915493160-- gnustep-base-1.29.0/Tests/base/GSMime/mime11.dat000066400000000000000000000044111435650067400211320ustar00rootroot00000000000000Message-Id: <804672.21391188475214.JavaMail.brains99@dragontest2.brainstorm.co.uk> Subject: =?UTF-8?Q?"Ne_manquez_pas_votre_vol_=C3=A0_destination_de_{depar?= =?UTF-8?Q?tureArrivalCity}_({departureArrivalAirportIATA})"_?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_Part_0_8192781.1391188386508" Content-Id: ------=_Part_0_8192781.1391188386508 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Content-Id: Please enter your text. ------=_Part_0_8192781.1391188386508 Content-Type: multipart/related; type="text/html"; boundary="----=_Part_1_18641875.1391188386512" Content-Id: ------=_Part_1_18641875.1391188386512 Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: 7bit Content-Id:

Please enter your text.

------=_Part_1_18641875.1391188386512 Content-Type: image/gif; name=image.gif Content-Transfer-Encoding: base64 Content-Id: Content-Disposition: attachment; filename=image.gif R0lGODlhHQAUAMQbAJmZZt3d2PzhIP7kIf3iIf/lIv/mIvHQGvXWHfncH+rFF/DOGua8FOS6FOnC FtqwEsqbDLCKDdajDJp0CqOZfmdQFEM0EHRiNHhnPKGWeplmAP///8zMzP///wAAAAAAACH/C05F VFNDQVBFMi4wAwEAAAAh+QQJHgAbACwAAAAAHQAUAAAF/+AmjmRpnmfHUVhVYRTXofQWUFX0LIoU VZRAzRS4TA6JZAKxYEwuQlIRWApUIAnBoFAYCBIHxy8qAkQUFXLHnCAUDHBDgQB2Ama2ikIx4Yw4 FQgCFoQWBoUWCAoPFX4bZnt9IxkTiB2WiBoZG4AKBw8XJBgPCQWIh4VgDRAYGxcPB2gXFCN6pYVx qQerFY8HBxETDRO0G7YDcckGAwkLvMYHAhUTZ70bo4JvygUCig8RrRi/R5/WGRFIbslzCRYMEhOb FQcILhUXoZwVDEhaXF7tHDyA0OiaAGoCBBywtiaCgwUIlBQSCO/ONQQXpk2gIsJKBAYKFvziweCB jzQdMS1MELAH5YgiEx40YMCggUkIGqCUAGCvmBQc1CT42BhkSIoVLV7EwGO0qdMNIQAAIfkECR4A GwAsAAAAAB0AFAAABf/gJo5kaZ5nx1FYVWEU153BVVE0VUXPokiRW8AEiCgqQ1Jtckg4E4gFY3JJ igIVhWLCUVYgCcGgUBgIEgdH0FrUckedYoJQMNgNBQJ6CphxsgcPFyR/CAIWiBYGiRYICg8VXRcP B0cXOCIZE4wdnIwaGRsABwcREw0TmBgPCQWMi4loDRAYGxUHAhUTRhUiWa2Jd7EHs70YpEyBvbYK CQN30AYDCQvFtgcILhUXgxurhnXRBQKODxG1GAK7AgIHyxkRTXTQeQkWDBIToRgINhMTN0T8YdBE DBkz9hw8gBBpQwAMEwRoQSIiTgQHCxA8SaQwX58RALRhurKDgYIFpHwqMHgAhCKKEkseNGDAoAFL CBqqvMyhK4IEIAApWNlZQgULFzBkEF3K1EQIADsAAAAAAAAAAAAAAAAAAAAAAAAAAA== ------=_Part_1_18641875.1391188386512-- ------=_Part_0_8192781.1391188386508-- gnustep-base-1.29.0/Tests/base/GSMime/mime12.dat000066400000000000000000000002731435650067400211350ustar00rootroot00000000000000MIME-Version: 1.0 Content-Type: text/plain Subject: Avant de partir, n'oubliez pas de =?iso-8859-1?b?cHLpcGFyZXI=?= votre =?iso-8859-1?b?c+lqb3Vy?==?iso-8859-1?b?IOA=?= Paris hellognustep-base-1.29.0/Tests/base/GSMime/mime2.dat000066400000000000000000000000501435650067400210450ustar00rootroot00000000000000content-transfer-encoding: base64 YWE= gnustep-base-1.29.0/Tests/base/GSMime/mime3.dat000066400000000000000000000000501435650067400210460ustar00rootroot00000000000000content-transfer-encoding: base64 YWFh gnustep-base-1.29.0/Tests/base/GSMime/mime4.dat000066400000000000000000000014251435650067400210560ustar00rootroot00000000000000Date: Mon, 27 May 2002 09:41:03 +0100 Mime-Version: 1.0 (Apple Message framework v481) Content-Type: multipart/mixed; boundary=Apple-Mail-2--915493160 Subject: test From: Richard Frith-Macdonald To: Richard Frith-Macdonald Message-Id: <7A6B10F5-714D-11D6-9738-00306544502E@brainstorm.co.uk> X-Mailer: Apple Mail (2.481) X-SpamBouncer: 1.4 (10/07/01) X-SBClass: OK --Apple-Mail-2--915493160 Content-Disposition: attachment; filename=a.a Content-Transfer-Encoding: 7bit Content-Type: text/plain; x-unix-mode=0644; name="a.a" hello --Apple-Mail-2--915493160 Content-Disposition: attachment; filename=b.b Content-Transfer-Encoding: 7bit Content-Type: text/plain; x-unix-mode=0644; name="b.b" there --Apple-Mail-2--915493160-- gnustep-base-1.29.0/Tests/base/GSMime/mime5.dat000066400000000000000000000103121435650067400210520ustar00rootroot00000000000000HTTP/1.0 200 OK Set-Cookie: WEBTRENDS_ID=213.86.45.65-35905744.29522136; expires=Fri, 31-Dec-2010 00:00:00 GMT; path=/ Server: Microsoft-IIS/4.0 Date: Mon, 21 Oct 2002 08:01:06 GMT Content-Length: 3956 Content-Type: text/xml Set-Cookie: ASPSESSIONIDGGQGQQDK=JJIMJBOCFKDOKHDJENONIFLG; path=/ Cache-Control: private X-Cache: MISS from pcproxy.uk1.brainstorm.co.uk Proxy-Connection: keep-alive gnustep-base-1.29.0/Tests/base/GSMime/mime6.dat000066400000000000000000000106771435650067400210710ustar00rootroot00000000000000MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Bsmil-Feed: VDataFeed X-Bsmil-Type: VDailyAries X-Bsmil-Subtype: X-Bsmil-Reference: 20021119 Content-Type: multipart/mixed; boundary="e7paaJyQU/hlJOcvRPG4PgAAAAU=" --e7paaJyQU/hlJOcvRPG4PgAAAAU= Content-Type: application/smil; charset=us-ascii; name=mms.smil Content-Transfer-Encoding: 7bit --e7paaJyQU/hlJOcvRPG4PgAAAAU= Content-Type: image/gif; name=SME46224_1.gif Content-Transfer-Encoding: base64 R0lGODlhUABaAMQAAAAAAP///8zMzLKyspmZmQEjWGZmZlFSUgkVKOTk5Fmm3DMzMxROqCtPafT0 9Hp/ggY3hKnc8tzw+hZn5iEjJYewweb5/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAA AAAALAAAAABQAFoAAAX/YCCOZGmepqOurIO+cCzPAZvceI6zdO/HK5xgSCwad6qfshdMEAfQaJQg jRJvq6U25RAKpoTwY0wmh8NWAXKrVd2G4Ad6mHCJunDxGUqv29kzbk5fA3oDCT8JhWNUA31JgDCC hARyhyROUGd7jmqYi410kJElk1+VBAJ2Dl8PBgcHCwsUCLUUsgcGlnV3Aqh8WH+kk4VhqiJfr7MA zM3OzxS5qYg1oI7BpDV4p1TUvgbLz+LjzNEPlwGKltejW26UqcgE4Ajk9uQIB+fev2rtSu8WXXIw gN69g/gOxEvXz08bPMUGIHtwgALCe/XsUTAwwM4AS/6E0QhoTETBBRft/9WqdVAhtY9UQvoguXBA xZT4EDRokPHeAgIvQTocmalkAJs9D65cWqtAgwc8ASQdR+HBSwMxeQV681Hi0QMImYqtBeFBhQdM D1o1iZWdDJJebYZlWqDAyroFGCiIwGDsvbUB5nX7l6Io0KMGpopbirex3QIQ9vIdy5IqARcJGPmT 9KakAAMWczZ1TDqvAgl88VJWvKBjgM/nNqOASKXGA5SiEZSuCwECb7MBIvhuTFmcAQEiBB8SOYL2 YbnjGDfuzbs3A+unJVS4Przu6meX02nWWirTA+QJQEcfjbe3ewgMGEyYP0FBhQgRFMyPT111Wmet VdPWMeVx4wIBuD1z1/901slHX3zxmVWBAlHlNcF1ji1lHGauTCMSROe9lthi7EHmXnzzQbCSVKvp dmF33mnYDAISOTBPbB8qEsaBCc5Y4okOQsCiTg3E8l1eGPq3ojMGuPAZVrLVUJRE6Sk2mm8N7rfS AV6NkAABB2z52gIIwNefkknRWINy5OFRCSLQOXMlkPWhVQtyLxCwEnIC1PJiaUsyQ4CAsVFTAzdr huajbibC56ACtSwwgwBkHiACWvwBWhkzCyCSHpS80CbRZyS2lyWFCEjqJZgKmUCpmnrKxx1xdm0K AJU3LidlK3CCJSejjcI3H6QI4BkYUwcYalKqAWCqAHfd/cfMA9Xo44j/C10Uk5yizMx5Kk+WJlfL eUiFS0KYdirwLLQZ9pSPkwaAeqi2DjxQ6nuOqlvLoK/tO0KfCPA7wgBLqQvhmbVWVg+f8Q42ZToG KMjoeyjqd+elCFD7Wpgr8esLmfUgoN/BMEpLpSv7gMiwjws0gK+j9RE7QphUgpyqzSu1XAAACyjw AH/uxRjooJnpcq15fPoq1VMETKjuz/GpO0EtI9wpAMfMZlbLU+qqS2YDPkMbbaDU2qjPNOYhQumM C8gRgQRwR+B011SLMC6ZIIebQKpd912Lwe+124wBa0qjhhOVuDBAaCuVZd/bIiQQdwUXB4D1oFcH jHHfXX/tc+DEVSYp/0GGd6Yxwd1KxRsDDzz+NmoR8KSxnvl4WfuxnHctVX1At5sRBSZJcwjip2cU 8sTWtX4ffmipmkClJNxOAAC5q9sAz+sGrWQzwbdl+rJDAgtk6/ZVQLnmR9VyAHJ6hotW1zzppG/G zyKccDnVek+8k4x7C+EDMbNe5V6VMzzJQl/xk9/1esau7fGscPrzxVrWJh0gsc5vOTNUJfSBJ4K1 jicFIFOf5te6WTmQcF8SHldCdLXUIe9EAJwfU7pUAoDBr1Zksh4AwAa0sdWDWplRIdIg1q0FUQx+ 9RCg+g4jj3HlDio9U5dUAIcwlmDuFaAyz8lcaKp8EQt7XpNFzozkxP/qda11OTSYCb1zKxE1zB+I slHIWFQdmNlpDNVrAM6eAjYzes1nAFDehH5GHZYgpyBG84eONEZBIzYIVW3zo89CFkZJRpJvy8uP AgzQALscQHG5wJGbjkPEItYRPk+jZCrp9zS09LEeUcwd13iiLvPhR270IBpFEhmQc6zpV3XUCyB/ iEHORVKGZmwdWsiHR3WBgwKjwuJg5hUGk6DkeMEUJsjIJ0VW6uuMBate67DXw05Go1e68JCUFuGp iJkyWFEbw9YESL1J/k0BOLvnTlIJKR6a0F9BTGSotFgNd4kvedYjk1Raxk1aTlIhLKmHU/jmNZ30 0DsUOKQ0r9WcUzz/ADPupGMXhWlPbxozZF/Y2opU+rcGjksFYEqnru6AOI6A752NiprPoqJKcD4g AppLos8UuhJ/ag8BGRVRKN1C01Z8tAYhXVBOhRm/WnETkMjJ2N5E1jeocPOi+4JpLgaUo0LY9CgJ cuQjo9LJm3GzKflIV9/qw7ty2mUBGg2lOkkAIsBMr4jiy+kEuMaUhmooY3Slz4XEpouKnGysWWHO KMOTHh85hmLD2olu7CSVvmQskIHEz4QWK7an3GYtNomXHKLEV/NwxElKk2ow+0bLwoqsdQWwigXy QzLqNACLDNMrUwsjwRAdRVElMpVe5kYsVEntWSKzgHYICTqkBiig/wJlTnOydaOXGJQ02DEf/HoG la5xR5gP0J6ScDVWoWi3OUXBincBK1VU4udZAeyb2EAntFrUiFUyZe1sXMvExdGXMXqRG38gxGB8 NQpN0EwOLBrGjvfy1U0deomvxFKXBCvgZSCezva4VLj2RpYoHoWSk+x1YPsaYDe8gfGKQpRCEw93 K6dQ7TG+dM0hFcAA6upvcjWVqksIgCI2lslMiuIKjngDLSx7RaAA6ztb1ASLqo2shTmTYijdoSC2 oMAtLLKRSyhCPZSpyo7nMdYAD2UJtHFFLrrUBbUhiGc0HJjSpAIAhRyDIK9os3u3vJX4SkO7BTGW q3ylEHQQBMnxSv+nlofBFTYvgJQpiMEXPBG5j0w40utQ8jBoowxFAyTHn85yTESdjV2ZNVmETkGK YdFmSQPjza1uqlk7YQVllcesslhArRnBB1bnGr6toIIY3PvrecxC2KqVQygOR5hjN/VGcl4qa1nh 7GcLt9jYsPaAUR1sYWsZIsqYhfA6sQZxc/nVs7jFtPOQ7lskktrVdncpSK2MjWxCDOAotxDzre8T kKTJE25yoMtt70LFuuD7HkQxAp2LWJTb26B6OMS5IPFKpJvhtxCegDfOhDrn+OPBFjl5SA7nOMeL 1lm+xspZDudKV8IMWZk5zVsu8So8YufZEMQgDodroEeiBTwoeAgBAAA7 --e7paaJyQU/hlJOcvRPG4PgAAAAU= Content-Type: text/plain; charset=us-ascii; name=SME46224_2.txt Content-Transfer-Encoding: 7bit You won't be worried about what people think of you once you see how they flock around today. The mere fact that someone has questions and interest in what you're doing suggests that they admire you for who and what you are. --e7paaJyQU/hlJOcvRPG4PgAAAAU=-- gnustep-base-1.29.0/Tests/base/GSMime/mime7.dat000066400000000000000000000046041435650067400210630ustar00rootroot00000000000000GIF89aPZÄÿÿÿÌÌ̲²²™™™#XfffQRR (äääY¦Ü333N¨+Oiôôôz‚7„©ÜòÜðúgæ!#%‡°Áæùý!ù,PZÿ` Ždiž¦£®¬ƒ¾p,Ï›Üx޳tïÇ+œ`H,wªŸ²LÐh” o«¥6å ¦„ðcL&‡ÃVr«U݆àz˜p‰ºpñJ¯ÛÙ3nN_z ? …cT}I€0‚„r‡$NPg{Žj˜‹t‘%“_•v_ µ²–uw¨|X¤“…aª"_¯³ÌÍÎϹ©ˆ5 ŽÁ¤5x§TÔ¾ËÏâãÌÑ—Š–×£[n”©ÈàäöäçÞ¿jíJï]r0€Þ½ƒøÄK×ÏO<Å {p€Â{õìQ00ÀÎKþ„ÑhLDÁíÿÕªuP!µTBú ¹p@Å”ø4hñÞ/A:™©d›=®\Z«@ƒ<$GáÁK1yzóQâÑ™Š­áA…LZ5‰• ’^m†eZ Àʺ(ˆÀ`ì½µæuû—¢(У¦Š[Š·±ÝöòË’* ù“ô¦¤s6uL:¯ |ñRV¼ c€Ïç6£€H¥Æ”¢”® o³"ønLYœ"9‚öa¹ã7îÍ»7ë§%T¸>¼îêg—ÓiÖZ*Óä @G··{ L˜?AA…ÌO]uZg­UÓÖ1åqã¸=s×ÿtÖÉG_|ñ™UQå5ÁuŽ-ef®L#Dç½–ØbìAæ^|óA°’T«évawÞiØ 90Ol*Æ ÎXâ‰BÀ¢N Äò]^ú·¢3¸ðV²ÕP”Dé)6šo î·Ò^lùÚÀן’IÑXƒräáQ "Ð9s%õ¡U r/°rÔòbiK2C€€±QS7k†æ£n&Âç µ,0ƒd ZüZ3 ’”¼Ð&Ñg$¶—%…Hê%˜ ™@©šzÊÇqvm •7.'e+p‚%'£Â7¤àSjRª`ªwÝýÇÌÕèãˆÿ ]“œ¢ÌÌy*O–&WËyH…KB˜v*ð,´ö”“€z¨¶Cm ÔÚ¨Ï4æ!BéŒ ÈpGàt×T‹0.™ ‡›@ª]÷]‹ÁïµÛŒkJ£†•¸0@h+•eßÛ"$w€õ WŒqß]ísàÄU&)ÿA†w¦1ÁÝJÅ<þ6j𤱞ùxYû±œw-U}@·›&Isâ§gòÄÖµ~~h©š@¥$ÜN¹«ÛÏë­d3Á·eú²C dëöU@¹æGÕrrz†‹V×<é¤oÆÏ"œp9ÕzO¼“Œ{ á1³^å^•3<ÉB_ñ“ßõzÆ®íñ¬púóÅZÖ& ±Îo93T%ô'‚µŽ' SŸæ×ºY9p_WBtµÔ!ïDœSºT€Á¯Vd²À´±ÕƒZ™Q!Ò Ö­Q ~õ ú#qå*=S—T‡0–`î 2ÏÉ\hª| {^“EÎŒäÄÿêu­u94˜ ½s+5̈²QÈXT˜Ùi ÕkΞ63zÍgPÞ„~F– § Fó‡Ž4FA#6Umó£ÏBFIF’oËË л@q¹À‘›ŽCÄ"Ö>O£d*é÷4´ô±QÌ×x¢.óáGnô Es¬éWuÔ ˆAÎER†flZȇGuƒ£Ââ`æ“ äxÁ&ÈÈ'EVê댫^ë°×ÃNF£Wºð”ᩈ™2XQÃÖH½IþM8»çNR )šÐ_ALd¨´X w‰/yÖ#“TZÆMZNR!,©‡Søæ5ôÐ;8¤4¯ÕœS<ÿ3î¤c…iOo3d_ØÚŠTú·ŽK`J§®î€8Ž€ïŠšÏ¢¢Jp> šK¢ÏºjQ(ÝBÓV|´!]PN…¿ZqÈÉØÞDÖ7¨pó¢û‚i.”£BØô( rä#£ÒÉ›q³)ùHWßêûrÚe ¥:I"ÀL¯ˆâË鏯”†j(ct¥Ï…Ħ‹Šœl¬YaÎ(Ó9†bÃÚ‰nì$•¾d,ÄÏ„+¶§Üf-6‰—¢ÄWópÄIJ“j0ûFËŠ¬u°ŠòC2ê4‹ Ó+S #ÁEQ%2•^æF,TIíY"³€v :¤( ÿeNs²u£—”4Ø1üz•®qG˜О’p5V¡h·9EÁŠw+UTâçYì›Ø@'´ZÔˆU2eíl\ËÄÅÑ—1z‘ Ä`|5 MÐL,ÆŽ÷òÕMz‰¯ÄR—+àe žÎö¸T¸öF–(…’“ìu`û`7¼ñŠB”Bw+§Pí1¾tÍ!Àêêor5•ªK€"6–ÉLŠâ Žx-,{E ë;[Ô‹ª¬…9“b(Ý¡ ¶ À-,²‘K(B=”©ÊŽç1Öe ´qE.ºÔµ!ˆg4˜Ò¤…ƒ ¯h³{·¼•øJC»1–«|¥tÉñJÿ§–‡Á6/€”)ˆÁ<¹L8ÒëPò0h£ E$ÇŸÎrLD]™5Y„NAŠaÑfIãÍ­nªY;ae•Ǭ²X@­ÁVç¾­ ‚ÜûëyÌBت•C(G˜c7õFr^*kYáìg ·ØØ°ö€Qlak"ʘ…ð:±qsùÕ³¸Å´óî[$’ÚÕvw)H­ŒlB à(·ó­ï¤Énr ËmïBźàûD1‹X”ÛÛ z8Ĺ ñJ¤›á·ž€7΄:çøãÁ9yHç8Ç‹ÖY¾ÆÊYçJW Y™9Í[.ñ* #import #import "Testing.h" int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; GSMimeParser *parser = [GSMimeParser mimeParser]; NSStringEncoding enc = [GSMimeDocument encodingFromCharset: @"utf-8"]; NSData *data; GSMimeDocument *doc = [[parser mimeDocument] retain]; GSMimeHeader *hdr; NSString *val; NSString *raw; PASS_EQUAL([GSMimeDocument encodeBase64String: @""], @"", "base64 encoding vector 1") PASS_EQUAL([GSMimeDocument encodeBase64String: @"f"], @"Zg==", "base64 encoding vector 2") PASS_EQUAL([GSMimeDocument encodeBase64String: @"fo"], @"Zm8=", "base64 encoding vector 3") PASS_EQUAL([GSMimeDocument encodeBase64String: @"foo"], @"Zm9v", "base64 encoding vector 4") PASS_EQUAL([GSMimeDocument encodeBase64String: @"foob"], @"Zm9vYg==", "base64 encoding vector 5") PASS_EQUAL([GSMimeDocument encodeBase64String: @"fooba"], @"Zm9vYmE=", "base64 encoding vector 6") PASS_EQUAL([GSMimeDocument encodeBase64String: @"foobar"], @"Zm9vYmFy", "base64 encoding vector 7") PASS_EQUAL([GSMimeDocument decodeBase64String: @""], @"", "base64 decoding vector 1") PASS_EQUAL([GSMimeDocument decodeBase64String: @"Zg=="], @"f", "base64 decoding vector 2") PASS_EQUAL([GSMimeDocument decodeBase64String: @"Zm8="], @"fo", "base64 decoding vector 3") PASS_EQUAL([GSMimeDocument decodeBase64String: @"Zm9v"], @"foo", "base64 decoding vector 4") PASS_EQUAL([GSMimeDocument decodeBase64String: @"Zm9vYg=="], @"foob", "base64 decoding vector 5") PASS_EQUAL([GSMimeDocument decodeBase64String: @"Zm9vYmE="], @"fooba", "base64 decoding vector 6") PASS_EQUAL([GSMimeDocument decodeBase64String: @"Zm9vYmFy"], @"foobar", "base64 decoding vector 7") data = [@"Content-type: application/xxx\r\n" dataUsingEncoding: enc]; PASS([parser parse:data] && [parser isInHeaders] && (doc != nil), "can parse one header"); PASS([doc contentType] == nil, "First Header not complete until next starts"); data = [@"Content-id: <" dataUsingEncoding:enc]; PASS([parser parse: data] && [parser isInHeaders], "Adding partial headers is ok"); PASS([[doc contentType] isEqual: @"application"] && [[doc contentSubtype] isEqual:@"xxx"],"Parsed first header as expected"); data = [@"hello>\r\n" dataUsingEncoding: enc]; PASS([parser parse: data] && [parser isInHeaders], "Completing partial header is ok"); PASS([doc contentID] == nil, "Partial header not complete until next starts"); data = [@"Folded\r\n : testing\r\n" dataUsingEncoding:enc]; PASS([parser parse:data] && [parser isInHeaders], "Folded header is ok"); PASS([@"" isEqual: [doc contentID]],"Parsed partial header as expected %s",[[doc contentID] UTF8String]); PASS([doc headerNamed: @"Folded"] == nil,"Folded header not complete until next starts"); data = [@"\r" dataUsingEncoding:enc]; PASS([parser parse:data] && [parser isInHeaders], "partial end-of-line is ok"); PASS([[[doc headerNamed:@"Folded"] value] isEqual: @"testing"],"Parsed folded header as expected %s",[[[doc headerNamed:@"Folded"] value] UTF8String]); data = [@"\n" dataUsingEncoding:enc]; PASS([parser parse:data] && ![parser isInHeaders], "completing end-of-line is ok"); doc = [GSMimeDocument documentWithContent:[@"\"\\UFE66???\"" propertyList] type:@"text/plain" name:nil]; [doc rawMimeData]; PASS([[[doc headerNamed:@"content-type"] parameterForKey:@"charset"] isEqual:@"utf-8"],"charset is inferred"); val = @"by mail.turbocat.net (Postfix, from userid 1002) id 90885422ECBF; Sat, 22 Dec 2007 15:40:10 +0100 (CET)"; if ([[NSUserDefaults standardUserDefaults] boolForKey: @"GSMimeOldStyleFolding"] == YES) { raw = @"Received: by mail.turbocat.net (Postfix, from userid 1002) id 90885422ECBF;\r\n\tSat, 22 Dec 2007 15:40:10 +0100 (CET)\r\n"; } else { raw = @"Received: by mail.turbocat.net (Postfix, from userid 1002) id 90885422ECBF;\r\n Sat, 22 Dec 2007 15:40:10 +0100 (CET)\r\n"; } hdr = [[GSMimeHeader alloc] initWithName: @"Received" value: val]; data = [hdr rawMimeDataPreservingCase: YES]; // NSLog(@"Header: '%*.*s'", [data length], [data length], [data bytes]); PASS([data isEqual: [raw dataUsingEncoding: NSASCIIStringEncoding]], "raw mime data for long header is OK"); data = [NSData dataWithContentsOfFile: @"HTTP1.dat"]; parser = [GSMimeParser mimeParser]; PASS ([parser parse: data] == NO, "can parse HTTP 200 reponse in one go"); PASS ([parser isComplete], "parse is complete"); data = [NSData dataWithContentsOfFile: @"HTTP2.dat"]; parser = [GSMimeParser mimeParser]; PASS ([parser parse: data] == NO, "can parse HTTP chunked in one go"); PASS ([parser isComplete], "parse is complete"); PASS ([parser isComplete], "parse is complete"); PASS_EQUAL([[parser mimeDocument] convertToText], @"This is the data in the first chunk\r\nand this is the second one\r\n" @"consequence", "content correct"); [arp release]; arp = nil; return 0; } #else int main(int argc,char **argv) { return 0; } #endif gnustep-base-1.29.0/Tests/base/GSMime/test02.m000066400000000000000000000426251435650067400206570ustar00rootroot00000000000000#if defined(GNUSTEP_BASE_LIBRARY) #import #import #import "Testing.h" int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; // Test charset conversions. PASS([GSMimeDocument encodingFromCharset: @"ansi_x3.4-1968"] == NSASCIIStringEncoding, "charset 'ansi_x3.4-1968' is NSASCIIStringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"ansi_x3.4-1986"] == NSASCIIStringEncoding, "charset 'ansi_x3.4-1986' is NSASCIIStringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"apple-roman"] == NSMacOSRomanStringEncoding, "charset 'apple-roman' is NSMacOSRomanStringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"ascii"] == NSASCIIStringEncoding, "charset 'ascii' is NSASCIIStringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"big5"] == NSBig5StringEncoding, "charset 'big5' is NSBig5StringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"cp367"] == NSASCIIStringEncoding, "charset 'cp367' is NSASCIIStringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"cp819"] == NSISOLatin1StringEncoding, "charset 'cp819' is NSISOLatin1StringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"csascii"] == NSASCIIStringEncoding, "charset 'csascii' is NSASCIIStringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"csisolatin1"] == NSISOLatin1StringEncoding, "charset 'csisolatin1' is NSISOLatin1StringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"gb2312.1980"] == NSChineseEUCStringEncoding, "charset 'gb2312.1980' is NSChineseEUCStringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"gsm0338"] == NSGSM0338StringEncoding, "charset 'gsm0338' is NSGSM0338StringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"ia5"] == NSASCIIStringEncoding, "charset 'ia5' is NSASCIIStringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"ibm367"] == NSASCIIStringEncoding, "charset 'ibm367' is NSASCIIStringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"ibm819"] == NSISOLatin1StringEncoding, "charset 'ibm819' is NSISOLatin1StringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"iso-10646-ucs-2"] == NSUnicodeStringEncoding, "charset 'iso-10646-ucs-2' is NSUnicodeStringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"iso10646-ucs-2"] == NSUnicodeStringEncoding, "charset 'iso10646-ucs-2' is NSUnicodeStringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"iso-8859-1"] == NSISOLatin1StringEncoding, "charset 'iso-8859-1' is NSISOLatin1StringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"iso8859-1"] == NSISOLatin1StringEncoding, "charset 'iso8859-1' is NSISOLatin1StringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"iso-8859-10"] == NSISOLatin6StringEncoding, "charset 'iso-8859-10' is NSISOLatin6StringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"iso8859-10"] == NSISOLatin6StringEncoding, "charset 'iso8859-10' is NSISOLatin6StringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"iso-8859-11"] == NSISOLatinThaiStringEncoding, "charset 'iso-8859-11' is NSISOLatinThaiStringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"iso8859-11"] == NSISOLatinThaiStringEncoding, "charset 'iso8859-11' is NSISOLatinThaiStringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"iso-8859-13"] == NSISOLatin7StringEncoding, "charset 'iso-8859-13' is NSISOLatin7StringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"iso8859-13"] == NSISOLatin7StringEncoding, "charset 'iso8859-13' is NSISOLatin7StringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"iso-8859-14"] == NSISOLatin8StringEncoding, "charset 'iso-8859-14' is NSISOLatin8StringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"iso8859-14"] == NSISOLatin8StringEncoding, "charset 'iso8859-14' is NSISOLatin8StringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"iso-8859-15"] == NSISOLatin9StringEncoding, "charset 'iso-8859-15' is NSISOLatin9StringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"iso8859-15"] == NSISOLatin9StringEncoding, "charset 'iso8859-15' is NSISOLatin9StringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"iso-8859-1:1987"] == NSISOLatin1StringEncoding, "charset 'iso-8859-1:1987' is NSISOLatin1StringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"iso8859-1:1987"] == NSISOLatin1StringEncoding, "charset 'iso8859-1:1987' is NSISOLatin1StringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"iso-8859-2"] == NSISOLatin2StringEncoding, "charset 'iso-8859-2' is NSISOLatin2StringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"iso8859-2"] == NSISOLatin2StringEncoding, "charset 'iso8859-2' is NSISOLatin2StringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"iso-8859-3"] == NSISOLatin3StringEncoding, "charset 'iso-8859-3' is NSISOLatin3StringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"iso8859-3"] == NSISOLatin3StringEncoding, "charset 'iso8859-3' is NSISOLatin3StringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"iso-8859-4"] == NSISOLatin4StringEncoding, "charset 'iso-8859-4' is NSISOLatin4StringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"iso8859-4"] == NSISOLatin4StringEncoding, "charset 'iso8859-4' is NSISOLatin4StringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"iso-8859-5"] == NSISOLatinCyrillicStringEncoding, "charset 'iso-8859-5' is NSISOLatinCyrillicStringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"iso8859-5"] == NSISOLatinCyrillicStringEncoding, "charset 'iso8859-5' is NSISOLatinCyrillicStringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"iso-8859-6"] == NSISOLatinArabicStringEncoding, "charset 'iso-8859-6' is NSISOLatinArabicStringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"iso8859-6"] == NSISOLatinArabicStringEncoding, "charset 'iso8859-6' is NSISOLatinArabicStringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"iso-8859-7"] == NSISOLatinGreekStringEncoding, "charset 'iso-8859-7' is NSISOLatinGreekStringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"iso8859-7"] == NSISOLatinGreekStringEncoding, "charset 'iso8859-7' is NSISOLatinGreekStringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"iso-8859-8"] == NSISOLatinHebrewStringEncoding, "charset 'iso-8859-8' is NSISOLatinHebrewStringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"iso8859-8"] == NSISOLatinHebrewStringEncoding, "charset 'iso8859-8' is NSISOLatinHebrewStringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"iso-8859-9"] == NSISOLatin5StringEncoding, "charset 'iso-8859-9' is NSISOLatin5StringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"iso8859-9"] == NSISOLatin5StringEncoding, "charset 'iso8859-9' is NSISOLatin5StringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"iso-ir-100"] == NSISOLatin1StringEncoding, "charset 'iso-ir-100' is NSISOLatin1StringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"iso-ir-6"] == NSASCIIStringEncoding, "charset 'iso-ir-6' is NSASCIIStringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"iso-10646-1"] == NSUnicodeStringEncoding, "charset 'iso-10646-1' is NSUnicodeStringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"iso10646-1"] == NSUnicodeStringEncoding, "charset 'iso10646-1' is NSUnicodeStringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"iso646-us"] == NSASCIIStringEncoding, "charset 'iso646-us' is NSASCIIStringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"iso_646.991-irv"] == NSASCIIStringEncoding, "charset 'iso_646.991-irv' is NSASCIIStringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"iso_646.irv:1991"] == NSASCIIStringEncoding, "charset 'iso_646.irv:1991' is NSASCIIStringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"iso_8859-1"] == NSISOLatin1StringEncoding, "charset 'iso_8859-1' is NSISOLatin1StringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"jisx0201.1976"] == NSShiftJISStringEncoding, "charset 'jisx0201.1976' is NSShiftJISStringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"koi8-r"] == NSKOI8RStringEncoding, "charset 'koi8-r' is NSKOI8RStringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"ksc5601.1987"] == NSKoreanEUCStringEncoding, "charset 'ksc5601.1987' is NSKoreanEUCStringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"ksc5601.1997"] == NSKoreanEUCStringEncoding, "charset 'ksc5601.1997' is NSKoreanEUCStringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"l1"] == NSISOLatin1StringEncoding, "charset 'l1' is NSISOLatin1StringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"latin1"] == NSISOLatin1StringEncoding, "charset 'latin1' is NSISOLatin1StringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"microsoft-cp1250"] == NSWindowsCP1250StringEncoding, "charset 'microsoft-cp1250' is NSWindowsCP1250StringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"microsoft-cp1251"] == NSWindowsCP1251StringEncoding, "charset 'microsoft-cp1251' is NSWindowsCP1251StringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"microsoft-cp1252"] == NSWindowsCP1252StringEncoding, "charset 'microsoft-cp1252' is NSWindowsCP1252StringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"microsoft-cp1253"] == NSWindowsCP1253StringEncoding, "charset 'microsoft-cp1253' is NSWindowsCP1253StringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"microsoft-cp1254"] == NSWindowsCP1254StringEncoding, "charset 'microsoft-cp1254' is NSWindowsCP1254StringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"microsoft-symbol"] == NSSymbolStringEncoding, "charset 'microsoft-symbol' is NSSymbolStringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"shift_JIS"] == NSShiftJISStringEncoding, "charset 'shift_JIS' is NSShiftJISStringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"us"] == NSASCIIStringEncoding, "charset 'us' is NSASCIIStringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"us-ascii"] == NSASCIIStringEncoding, "charset 'us-ascii' is NSASCIIStringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"utf-16"] == NSUnicodeStringEncoding, "charset 'utf-16' is NSUnicodeStringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"utf16"] == NSUnicodeStringEncoding, "charset 'utf16' is NSUnicodeStringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"utf-7"] == NSUTF7StringEncoding, "charset 'utf-7' is NSUTF7StringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"utf7"] == NSUTF7StringEncoding, "charset 'utf7' is NSUTF7StringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"utf-8"] == NSUTF8StringEncoding, "charset 'utf-8' is NSUTF8StringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"utf8"] == NSUTF8StringEncoding, "charset 'utf8' is NSUTF8StringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"windows-1250"] == NSWindowsCP1250StringEncoding, "charset 'windows-1250' is NSWindowsCP1250StringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"windows-1251"] == NSWindowsCP1251StringEncoding, "charset 'windows-1251' is NSWindowsCP1251StringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"windows-1252"] == NSWindowsCP1252StringEncoding, "charset 'windows-1252' is NSWindowsCP1252StringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"windows-1253"] == NSWindowsCP1253StringEncoding, "charset 'windows-1253' is NSWindowsCP1253StringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"windows-1254"] == NSWindowsCP1254StringEncoding, "charset 'windows-1254' is NSWindowsCP1254StringEncoding"); PASS([GSMimeDocument encodingFromCharset: @"windows-symbol"] == NSSymbolStringEncoding, "charset 'windows-symbol' is NSSymbolStringEncoding"); // Test canonical charset names. PASS([[GSMimeDocument charsetFromEncoding: NSASCIIStringEncoding] isEqualToString: @"us-ascii"], "NSASCIIStringEncoding canonical charset is us-ascii"); PASS([[GSMimeDocument charsetFromEncoding: NSBig5StringEncoding] isEqualToString: @"big5"], "NSBig5StringEncoding canonical charset is big5"); PASS([[GSMimeDocument charsetFromEncoding: NSChineseEUCStringEncoding] isEqualToString: @"gb2312.1980"], "NSChineseEUCStringEncoding canonical charset is gb2312.1980"); PASS([[GSMimeDocument charsetFromEncoding: NSGSM0338StringEncoding] isEqualToString: @"gsm0338"], "NSGSM0338StringEncoding canonical charset is gsm0338"); PASS([[GSMimeDocument charsetFromEncoding: NSISOLatinArabicStringEncoding] isEqualToString: @"iso-8859-6"], "NSISOLatinArabicStringEncoding canonical charset is iso-8859-6"); PASS([[GSMimeDocument charsetFromEncoding: NSISOLatinCyrillicStringEncoding] isEqualToString: @"iso-8859-5"], "NSISOLatinCyrillicStringEncoding canonical charset is iso-8859-5"); PASS([[GSMimeDocument charsetFromEncoding: NSISOLatinGreekStringEncoding] isEqualToString: @"iso-8859-7"], "NSISOLatinGreekStringEncoding canonical charset is iso-8859-7"); PASS([[GSMimeDocument charsetFromEncoding: NSISOLatinHebrewStringEncoding] isEqualToString: @"iso-8859-8"], "NSISOLatinHebrewStringEncoding canonical charset is iso-8859-8"); PASS([[GSMimeDocument charsetFromEncoding: NSISOLatin1StringEncoding] isEqualToString: @"iso-8859-1"], "NSISOLatin1StringEncoding canonical charset is iso-8859-1"); PASS([[GSMimeDocument charsetFromEncoding: NSISOLatin2StringEncoding] isEqualToString: @"iso-8859-2"], "NSISOLatin2StringEncoding canonical charset is iso-8859-2"); PASS([[GSMimeDocument charsetFromEncoding: NSISOLatin3StringEncoding] isEqualToString: @"iso-8859-3"], "NSISOLatin3StringEncoding canonical charset is iso-8859-3"); PASS([[GSMimeDocument charsetFromEncoding: NSISOLatin4StringEncoding] isEqualToString: @"iso-8859-4"], "NSISOLatin4StringEncoding canonical charset is iso-8859-4"); PASS([[GSMimeDocument charsetFromEncoding: NSISOLatin5StringEncoding] isEqualToString: @"iso-8859-9"], "NSISOLatin5StringEncoding canonical charset is iso-8859-9"); PASS([[GSMimeDocument charsetFromEncoding: NSISOLatin6StringEncoding] isEqualToString: @"iso-8859-10"], "NSISOLatin6StringEncoding canonical charset is iso-8859-10"); PASS([[GSMimeDocument charsetFromEncoding: NSISOLatin7StringEncoding] isEqualToString: @"iso-8859-13"], "NSISOLatin7StringEncoding canonical charset is iso-8859-13"); PASS([[GSMimeDocument charsetFromEncoding: NSISOLatin8StringEncoding] isEqualToString: @"iso-8859-14"], "NSISOLatin8StringEncoding canonical charset is iso-8859-14"); PASS([[GSMimeDocument charsetFromEncoding: NSISOLatin9StringEncoding] isEqualToString: @"iso-8859-15"], "NSISOLatin9StringEncoding canonical charset is iso-8859-15"); PASS([[GSMimeDocument charsetFromEncoding: NSISOLatinThaiStringEncoding] isEqualToString: @"iso-8859-11"], "NSISOLatinThaiStringEncoding canonical charset is iso-8859-11"); PASS([[GSMimeDocument charsetFromEncoding: NSKOI8RStringEncoding] isEqualToString: @"koi8-r"], "NSKOI8RStringEncoding canonical charset is koi8-r"); PASS([[GSMimeDocument charsetFromEncoding: NSKoreanEUCStringEncoding] isEqualToString: @"ksc5601.1987"], "NSKoreanEUCStringEncoding canonical charset is ksc5601.1987"); PASS([[GSMimeDocument charsetFromEncoding: NSMacOSRomanStringEncoding] isEqualToString: @"apple-roman"], "NSMacOSRomanStringEncoding canonical charset is apple-roman"); PASS([[GSMimeDocument charsetFromEncoding: NSShiftJISStringEncoding] isEqualToString: @"shift_JIS"], "NSShiftJISStringEncoding canonical charset is shift_JIS"); PASS([[GSMimeDocument charsetFromEncoding: NSUTF7StringEncoding] isEqualToString: @"utf-7"], "NSUTF7StringEncoding canonical charset is utf-7"); PASS([[GSMimeDocument charsetFromEncoding: NSUTF8StringEncoding] isEqualToString: @"utf-8"], "NSUTF8StringEncoding canonical charset is utf-8"); PASS([[GSMimeDocument charsetFromEncoding: NSUnicodeStringEncoding] isEqualToString: @"utf-16"], "NSUnicodeStringEncoding canonical charset is utf-16"); PASS([[GSMimeDocument charsetFromEncoding: NSWindowsCP1250StringEncoding] isEqualToString: @"windows-1250"], "NSWindowsCP1250StringEncoding canonical charset is windows-1250"); PASS([[GSMimeDocument charsetFromEncoding: NSWindowsCP1251StringEncoding] isEqualToString: @"windows-1251"], "NSWindowsCP1251StringEncoding canonical charset is windows-1251"); PASS([[GSMimeDocument charsetFromEncoding: NSWindowsCP1252StringEncoding] isEqualToString: @"windows-1252"], "NSWindowsCP1252StringEncoding canonical charset is windows-1252"); PASS([[GSMimeDocument charsetFromEncoding: NSWindowsCP1253StringEncoding] isEqualToString: @"windows-1253"], "NSWindowsCP1253StringEncoding canonical charset is windows-1253"); PASS([[GSMimeDocument charsetFromEncoding: NSWindowsCP1254StringEncoding] isEqualToString: @"windows-1254"], "NSWindowsCP1254StringEncoding canonical charset is windows-1254"); [arp release]; arp = nil; return 0; } #else int main(int argc,char **argv) { return 0; } #endif gnustep-base-1.29.0/Tests/base/GSMime/xml-charset.m000066400000000000000000000010471435650067400217560ustar00rootroot00000000000000#if defined(GNUSTEP_BASE_LIBRARY) #import #import #import "Testing.h" int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSString *xml = @""; NSString *charset = nil; PASS_RUNS(charset = [GSMimeDocument charsetForXml: xml], "Can determine charset of xml document."); PASS_EQUAL(@"UTF-8", charset, "Charset detected correctly"); DESTROY(arp); return 0; } #else int main(int argc,char **argv) { return 0; } #endif gnustep-base-1.29.0/Tests/base/GSTLS/000077500000000000000000000000001435650067400171225ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/GSTLS/TestInfo000066400000000000000000000000001435650067400205660ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/GSTLS/basic.m000066400000000000000000000031051435650067400203600ustar00rootroot00000000000000#import "ObjectTesting.h" #import "../../../Headers/GNUstepBase/config.h" #import "../../../Headers/Foundation/Foundation.h" #import "../../../Headers/GNUstepBase/GSTLS.h" int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; START_SET("TLS support") #if GS_USE_GNUTLS #ifndef HAVE_GNUTLS_X509_PRIVKEY_IMPORT2 testHopeful = YES; #endif GSTLSPrivateKey *k; GSTLSCertificateList *c; GSTLSCredentials *cred; NSDateFormatter *dateFormatter; NSDate *expiresAt; k = [GSTLSPrivateKey keyFromFile: @"test.key" withPassword: @"asdf"]; PASS(k != nil, "OpenSSL encrypted key can be loaded"); c = [GSTLSCertificateList listFromFile: @"test.crt"]; PASS(c != nil, "Certificate list can be loaded from a file"); PASS([c expiresAt: -1] == nil, "Return nil for invalid index"); PASS([c expiresAt: 2] == nil, "Return nil for invalid index"); expiresAt = [c expiresAt: 0]; dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat: @"yyyy-MM-dd HH:mm:ss zzz"]; /* Test guaranteed to fail on 32-bit architectures. */ #if __LP64__ PASS_EQUAL(expiresAt, [dateFormatter dateFromString: @"2118-12-14 15:35:11 +0000"], "Expiration date can be retrieved"); #endif [dateFormatter release]; PASS_EQUAL([c expiresAt], expiresAt, "Expiration for entire list is that of the single item"); cred = [GSTLSCredentials selfSigned: YES]; NSLog(@"%@", cred); PASS(cred != nil, "generates self signed certificate"); #else SKIP("TLS support disabled"); #endif END_SET("TLS support"); DESTROY(arp); return 0; } gnustep-base-1.29.0/Tests/base/GSTLS/test.crt000066400000000000000000000023041435650067400206120ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDWTCCAkGgAwIBAgIJAMJ2jmXj+OR0MA0GCSqGSIb3DQEBCwUAMEIxCzAJBgNV BAYTAlVLMQ8wDQYDVQQHDAZMb25kb24xEDAOBgNVBAoMB0dOVXN0ZXAxEDAOBgNV BAMMB0dOVXN0ZXAwIBcNMTkwMTA3MTUzNTExWhgPMjExODEyMTQxNTM1MTFaMEIx CzAJBgNVBAYTAlVLMQ8wDQYDVQQHDAZMb25kb24xEDAOBgNVBAoMB0dOVXN0ZXAx EDAOBgNVBAMMB0dOVXN0ZXAwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB AQCqu1ged59B24uPCWxnS8QJug9yumiT0A+FqP6OF08RIf+rUArbSin5WecIYr5K 8sQF2P4q/TlgkikEt2bVDX6+X7urn67Tu+L23Y8bPxR1eyZYxiOG2q8274vfVCat vPR0/uSydfK6TlxaNQbdePq+SV5dgpKujpVXzQlx0wdwseB9dYvITtifMdjCZPei Hnv1nD2kOMM+DPuWifgEjdnBhG5f9OzzjdtVfmkfc/ii0MnHLiynsA4vLWTZF6r7 Jl/iXwsi7bDG4yIWzBWcW/x/R11tjEdQVxqxC/o1wCvDnMdYYuA+MkY6DjfDUn4U E6Uv8SAW3BVSJP7zDSdY1DH5AgMBAAGjUDBOMB0GA1UdDgQWBBTXEZM6Zc9i55VU 4/RgT7fvHvqDBzAfBgNVHSMEGDAWgBTXEZM6Zc9i55VU4/RgT7fvHvqDBzAMBgNV HRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBdOmRj90oKY6FO1uS/shAEyaaz ReyqMO/nP6FDqLfgaFUWwgluJ7hT4PFDYachXUplXklozXJ6iivEojwqdXQPOL8a 6iQZjXt0VJwEdszURajaP20CVCPjwE6tjpIY6v7rKtualgfPzl7wzADwtQHQc6Fh 5oxvehwVoD9Ftjj3UCCs2jxhA5tDMyLb/quBTqdg4p4x/kzy+fTiCxdGKXITtbQv 2XO9XyQOmjnnmL6b7MKzQOYOOk6mLG8geuoEUycbLfPCrj+J4GFFZOYcYNOr0liK Jahpn0NfGH1+/5MXu3no72X0oX6wGb1LxYh/5Atz2h3AIRnfU0e7pw6azvAX -----END CERTIFICATE----- gnustep-base-1.29.0/Tests/base/GSTLS/test.key000066400000000000000000000033271435650067400206200ustar00rootroot00000000000000-----BEGIN RSA PRIVATE KEY----- Proc-Type: 4,ENCRYPTED DEK-Info: DES-EDE3-CBC,8654C1FD552B8094 UScC3AfYWIw8+QAbej05N+vVZilkYFCMaVYNeF1zPTjuV/7+fZPhDNbbhrOANVGT SyNe52QU8h2cl4LRChlKN9tt2VuGU5Y+LE95yr59LNw0LKk/vWEh63lNr3tHATie 52afa83NzFdFlJU3ki7z84tJxaBH0tjmTTArDARriA3aHS5R5apmsA+C3YoZUHsF La2S+h7pnhyd6tUKK52Anmw7I0gus3QGcM/t6cBXyo03tzzo863GP1eS9yXsmWtL u80s4Bn7PUz4JztcJhxzdpircDjUoH+VTM0jV07gTHwUWG9qW//z7czvjQq+tJvv HFCwflo4kOh/4s8B/48mdrtjjiYErBM9ZjAasB7HEuDT6CkvQFYwvEjcs895J6mr 7siCg0jkzcQGP/+58QRCH7Apuakuen/agD4geBt00QLAPWdQdzGctk1X/OOqPHpk Quh+8O8L7EAcio4J5A0dke+65OOls3kXdkWbmofpkqcEmSx3S2Ki33v5WJfHU8uT 1wA6/JVVvcMBIIVxZ12gg/994R1k8VqpJjQ/n6wEeCZ1t2quJ2VPvlppKmgKccSn nwKs9qjQRiXoltDj7KvQDg2LzjG2pR1lf8BA6tCaBmMwBHmevt59ZezSIOHcGkRE SAfrcKaAFO8MD/X0vyGcs8DvyK4TqVMHHCfBKlSJAnRqWZ1wym6Ez9Ak178uroJ5 M553NhWopy0KNoLUE60FXYyR0CbCDomlWB02FYiT1NNegEteSMInVKfzgfTnOOBw kNYy5FsBVgGLPL0rVGFKsBFmYoiJPetOMhdKC8OtblVEfJN91o0pm4ai7YCxdPWg xztDEFJEa9SdEaj9OCTYhTdWD8B8CjFZwxk17mE65an4Coc30QWYGTG05xHZCDX/ ZjZ4D4SLK+8R4MbKlRuP07hXfFIkIVELlmaJwoCk4A+aQd1l5ueyesdXOnAE3y66 O/H4U016RHUWspqkx964sO96qNABiN9X5MdsbWWbAS3nQ86U5ElNhIfzIc4IiBlA PDtulpfugH+ZbzyNC7sckGq5kSVWffx6BG3oYwFI2aXkDV8VJT+4LpYcjFr3cf1T DvHzmw3Y6USGqbI2zmm7xMHWY/Dnt5+vapOz7NMn7OSYx1gsfXPm1UNhUI6CXMBV IIZvwwT2fr+HAMYyH8ulFR2sl5vb/f0wspYKugerqD8N+c063K0v9WeDw+F1KsWb DHYSCI3HJO7N6g+7JKa8dzIM6Twt7o3qo4rKZqoMDSPPhDMhBE8lS8mr9PCn/3z6 cBFQfG1eMBOsT5OxFQree10dpiz1jeCM2NyeVPU8AqehOSNcltEBir75UlMXQTAw 9bY/0pNxE4FfyFi9JP5efZd50Gy6dIn6nxXbZMcMhnZ7rO8acsx/UQj/zj1JdziX ab9w64CmL4JFxdmAzGDuqmwERLwEqkub1z1U76cJYDwXTUkZFrDdImHMRejX88+b ZM3Jd476/6tHaBDDEr8nVCBnCwLG91hGVV9x0ZgQ8xe7mhjpI4kdNcDbYb9vzfHy YicfW74yc51+Bkvz/sa9CSsJULct4tG8IvROkTPKqYFg6Bhsy1ADCi9FzPlPbml/ -----END RSA PRIVATE KEY----- gnustep-base-1.29.0/Tests/base/GSXML/000077500000000000000000000000001435650067400171205ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/GSXML/TestInfo000066400000000000000000000000001435650067400205640ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/GSXML/basic.m000066400000000000000000000172131435650067400203630ustar00rootroot00000000000000#import #import "Testing.h" #if defined(GNUSTEP_BASE_LIBRARY) && (GS_USE_LIBXML == 1) #import #import #import "ObjectTesting.h" int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSFileManager *mgr; GSXMLParser *parser; GSXMLDocument *doc; GSXMLNamespace *namespace; NSMutableArray *iparams; NSMutableArray *oparams; GSXMLNode *node; GSXMLRPC *rpc; NSString *str; NSString *testPath; NSString *absolutePath; NSData *dat; TEST_FOR_CLASS(@"GSXMLDocument",[GSXMLDocument alloc], "GSXMLDocument +alloc returns a GSXMLDocument"); TEST_FOR_CLASS(@"GSXMLDocument",[GSXMLDocument documentWithVersion: @"1.0"], "GSXMLDocument +documentWithVersion: returns a GSXMLDocument"); TEST_FOR_CLASS(@"GSXMLNode",[GSXMLNode alloc], "GSXMLNode +alloc returns a GSXMLNode"); TEST_FOR_CLASS(@"GSXMLRPC",[GSXMLRPC alloc], "GSXMLRPC +alloc returns a GSXMLRPC instance"); NS_DURING node = [GSXMLNode new]; PASS(node == nil, "GSXMLNode +new returns nil"); NS_HANDLER PASS(node == nil, "GSXMLNode +new returns nil"); NS_ENDHANDLER TEST_FOR_CLASS(@"GSXMLNamespace",[GSXMLNamespace alloc], "GSXMLNamespace +alloc returns a GSXMLNamespace"); NS_DURING namespace = [GSXMLNamespace new]; PASS(namespace == nil, "GSXMLNamespace +new returns nil"); NS_HANDLER PASS(namespace == nil, "GSXMLNamespace +new returns nil"); NS_ENDHANDLER doc = [GSXMLDocument documentWithVersion: @"1.0"]; node = [doc makeNodeWithNamespace: nil name: @"nicola" content: nil]; PASS (node != nil,"Can create a document node"); [doc setRoot: node]; PASS([[doc root] isEqual: node],"Can set document node as root node"); [doc makeNodeWithNamespace: nil name: @"nicola" content: nil]; [node makeChildWithNamespace: nil name: @"paragraph" content: @"Hi this is some text"]; [node makeChildWithNamespace: nil name: @"paragraph" content: @"Hi this is even some more text"]; [doc setRoot: node]; PASS([[doc root] isEqual: node], "Can set a document node (with children) as root node"); namespace = [node makeNamespaceHref: @"http: //www.gnustep.org" prefix: @"gnustep"]; PASS(namespace != nil,"Can create a node namespace"); node = [doc makeNodeWithNamespace: namespace name: @"nicola" content: nil]; PASS([[node namespace] isEqual: namespace], "Can create a node with a namespace"); node = [doc makeNodeWithNamespace: namespace name: @"another" content: nil]; PASS([[node namespace] isEqual: namespace], "Can create a node with same namespace as another node"); PASS([[namespace prefix] isEqual: @"gnustep"], "A namespace remembers its prefix"); rpc = [(GSXMLRPC*)[GSXMLRPC alloc] initWithURL: @"http://localhost/"]; PASS(rpc != nil, "Can initialise an RPC instance"); iparams = [NSMutableArray array]; oparams = [NSMutableArray array]; dat = [rpc buildMethod: @"method" params: nil]; PASS(dat != nil, "Can build an empty method call (nil params)"); str = [rpc parseMethod: dat params: oparams]; PASS([str isEqual: @"method"] && [iparams isEqual: oparams], "Can parse an empty method call (nil params)"); dat = [rpc buildMethod: @"method" params: iparams]; PASS(dat != nil, "Can build an empty method call"); str = [rpc parseMethod: dat params: oparams]; PASS([str isEqual: @"method"] && [iparams isEqual: oparams], "Can parse an empty method call"); [iparams addObject: @"a string"]; dat = [rpc buildMethod: @"method" params: iparams]; PASS(dat != nil, "Can build a method call with a string"); str = [rpc parseMethod: dat params: oparams]; PASS([str isEqual: @"method"] && [iparams isEqual: oparams], "Can parse a method call with a string"); [rpc setCompact: YES]; str = [rpc buildMethodCall: @"method" params: iparams]; [rpc setCompact: NO]; str = [str stringByReplacingString: @"" withString: @""]; str = [str stringByReplacingString: @"" withString: @""]; str = [rpc parseMethod: [str dataUsingEncoding: NSUTF8StringEncoding] params: oparams]; PASS([str isEqual: @"method"] && [iparams isEqual: oparams], "Can parse a method call with a string without the element"); [iparams addObject: [NSNumber numberWithInt: 4]]; dat = [rpc buildMethod: @"method" params: iparams]; PASS(dat != nil, "Can build a method call with an integer"); str = [rpc parseMethod: dat params: oparams]; PASS([str isEqual: @"method"] && [iparams isEqual: oparams], "Can parse a method call with an integer"); [iparams addObject: [NSNumber numberWithFloat: 4.5]]; dat = [rpc buildMethod: @"method" params: iparams]; PASS(dat != nil, "Can build a method call with a float"); str = [rpc parseMethod: dat params: oparams]; PASS([str isEqual: @"method"] && [iparams isEqual: oparams], "Can parse a method call with a float"); [iparams addObject: [NSData dataWithBytes: "1234" length: 4]]; dat = [rpc buildMethod: @"method" params: iparams]; PASS(dat != nil, "Can build a method call with binary data"); str = [rpc parseMethod: dat params: oparams]; PASS([str isEqual: @"method"] && [iparams isEqual: oparams], "Can parse a method call with binary data"); [rpc setTimeZone: [NSTimeZone systemTimeZone]]; [iparams addObject: [NSDate date]]; dat = [rpc buildMethod: @"method" params: iparams]; PASS(dat != nil, "Can build a method call with a date"); str = [rpc parseMethod: dat params: oparams]; PASS([str isEqual: @"method"] && [[iparams description] isEqual: [oparams description]], "Can parse a method call with a date"); mgr = [NSFileManager defaultManager]; testPath = [[mgr currentDirectoryPath] stringByAppendingPathComponent: @"GNUmakefile"]; absolutePath = [[NSURL fileURLWithPath: testPath] absoluteString]; str = [NSString stringWithFormat: @"\n" @"\n" @"]>\n" @"&&foo;A", absolutePath]; parser = [GSXMLParser parserWithData: [str dataUsingEncoding: NSUTF8StringEncoding]]; [parser substituteEntities: YES]; [parser parse]; PASS_EQUAL([[[parser document] root] content], @"&A", "external entity is ignored") parser = [GSXMLParser parserWithData: [str dataUsingEncoding: NSUTF8StringEncoding]]; [parser substituteEntities: YES]; [parser resolveEntities: YES]; [parser parse]; str = [[[parser document] root] content]; PASS([str rangeOfString: @"MAKEFILES"].length > 0, "external entity is resolved") str = @"\n" @""; parser = [GSXMLParser parserWithData: [str dataUsingEncoding: NSUTF8StringEncoding]]; [parser substituteEntities: YES]; [parser resolveEntities: YES]; [parser doValidityChecking: YES]; PASS([parser parse] == NO, "empty plist is not valid") str = @"\n" @"xxx"; parser = [GSXMLParser parserWithData: [str dataUsingEncoding: NSUTF8StringEncoding]]; [parser substituteEntities: YES]; [parser resolveEntities: YES]; [parser doValidityChecking: YES]; PASS([parser parse] == YES, "plist containing string is valid") PASS_EQUAL([[[[[parser document] root] firstChild] firstChild] content], @"xxx", "root/plist/string is parsed") [arp release]; arp = nil; return 0; } #else int main(int argc,char **argv) { START_SET("GSXML") SKIP("GSXML support unavailable"); END_SET("GSXML") return 0; } #endif gnustep-base-1.29.0/Tests/base/GarbageCollection/000077500000000000000000000000001435650067400215725ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/GarbageCollection/TestInfo000066400000000000000000000000001435650067400232360ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/GarbageCollection/general.m000066400000000000000000000013131435650067400233630ustar00rootroot00000000000000#import #import "ObjectTesting.h" int main() { NSGarbageCollector *collector; NSZone *z; collector = [NSGarbageCollector defaultCollector]; if (collector == nil) return 0; START_SET("Garbage collection"); PASS([collector zone] == NSDefaultMallocZone(), "collector zone is default") PASS([[NSObject new] zone] == NSDefaultMallocZone(), "object zone is default") PASS((z = NSCreateZone(1024, 128, YES)) == NSDefaultMallocZone(), "created zone is default") PASS((z = NSCreateZone(1024, 128, YES)) == NSDefaultMallocZone(), "created zone is default") PASS_RUNS(NSRecycleZone(z), "zone recycling works") END_SET("Garbage collection"); return 0; } gnustep-base-1.29.0/Tests/base/GarbageCollection/notifications.m000066400000000000000000000025751435650067400246320ustar00rootroot00000000000000#import #import "ObjectTesting.h" @interface MyClass : NSObject + (unsigned) finalisationCounter; + (unsigned) notificationCounter; - (void) notified: (NSNotification*)n; @end @implementation MyClass static unsigned notificationCounter = 0; static unsigned finalisationCounter = 0; + (unsigned) finalisationCounter { return finalisationCounter; } + (unsigned) notificationCounter { return notificationCounter; } - (void) finalize { finalisationCounter++; } - (void) notified: (NSNotification*)n { notificationCounter++; } @end int main() { NSGarbageCollector *collector; NSNotificationCenter *center; MyClass *object; collector = [NSGarbageCollector defaultCollector]; if (collector == nil) return 0; START_SET("Garbage Collection"); center = [NSNotificationCenter defaultCenter]; object = [MyClass new]; [center addObserver: object selector: @selector(notified:) name: @"Notification" object: nil]; [center postNotificationName: @"Notification" object: nil]; PASS([MyClass notificationCounter] == 1, "simple notification works") object = nil; [collector collectExhaustively]; PASS([MyClass finalisationCounter] == 1, "finalisation done") [center postNotificationName: @"Notification" object: nil]; PASS([MyClass notificationCounter] == 1, "automatic removal works") END_SET("Garbage Collection"); return 0; } gnustep-base-1.29.0/Tests/base/GenericTests/000077500000000000000000000000001435650067400206255ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/GenericTests/GNUmakefile000066400000000000000000000002371435650067400227010ustar00rootroot00000000000000# # # include $(GNUSTEP_MAKEFILES)/common.make SUBPROJECT_NAME=generictests generictests_OBJC_FILES=generic.m include $(GNUSTEP_MAKEFILES)/subproject.make gnustep-base-1.29.0/Tests/base/GenericTests/generic.h000066400000000000000000000002701435650067400224110ustar00rootroot00000000000000 #import #import @interface NSObject(TestsAdditions) -(BOOL)testEquals: (id)anObject; -(BOOL)testForString; -(BOOL)testForClass; @end gnustep-base-1.29.0/Tests/base/GenericTests/generic.m000066400000000000000000000005541435650067400224230ustar00rootroot00000000000000#import "generic.h" @interface NSObject (PretendToBeNSString) - (NSUInteger)length; @end @implementation NSObject(TestAdditions) -(BOOL)testEquals:(id)anObject { return ([self isEqual:anObject] && [anObject isEqual:self]); } - (NSUInteger) length { return 0; } -(BOOL)testForString { return ([self isKindOfClass:[NSString class]] && [self length]); } @end gnustep-base-1.29.0/Tests/base/KVC/000077500000000000000000000000001435650067400166515ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/KVC/TestInfo000066400000000000000000000000001435650067400203150ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/KVC/array.m000066400000000000000000000041511435650067400201460ustar00rootroot00000000000000#import "ObjectTesting.h" #import @interface ArrayIVar : NSObject { NSArray *_testArray; } - (void) setTestArray: (NSArray*)array; - (NSArray*) testArray; @end @implementation ArrayIVar - (void) setTestArray: (NSArray*)array { [array retain]; [_testArray release]; _testArray = array; } - (NSArray*) testArray { return _testArray; } @end int main(int argc,char **argv) { NSAutoreleasePool *pool = [NSAutoreleasePool new]; volatile BOOL result = NO; NSDictionary *root; NSArray *array; NSArray *ivar; ArrayIVar *aiv; NSString *plist; array = [@"({value=10;},{value=12;})" propertyList]; plist = @"{displayGroup={allObjects=({detailArray=({value=4;},{value=2;});},{detailArray=({value=8;},{value=10;});});};}"; root = [plist propertyList]; result = [[array valueForKeyPath:@"@sum.value"] intValue] == 22; PASS(result, "-[NSArray valueForKeyPath: @\"@sum.value\"]"); result = [[array valueForKeyPath:@"@count.value"] intValue] == 2; PASS(result, "-[NSArray valueForKeyPath: @\"@count.value\"]"); result = [[array valueForKeyPath:@"@count"] intValue] == 2; PASS(result, "-[NSArray valueForKeyPath: @\"@count\"]"); aiv = [ArrayIVar new]; ivar = [NSArray arrayWithObjects: @"Joe", @"Foo", @"Bar", @"Cat", nil]; [aiv setTestArray: ivar]; PASS([aiv valueForKeyPath: @"testArray.@count"] == [ivar valueForKey: @"@count"], "valueForKey: matches valueForKeypath:"); /* Advanced KVC */ result = [[root valueForKeyPath:@"displayGroup.allObjects.@sum.detailArray.@avg.value"] intValue] == 12; PASS(result, "-[NSArray valueForKeyPath: @\"displayGroup.allObjects.@sum.detailArray.@avg.value\"]"); result = [[root valueForKeyPath:@"displayGroup.allObjects.@sum.detailArray.@count.value"] intValue] == 4; PASS(result, "-[NSArray valueForKeyPath: @\"displayGroup.allObjects.@sum.detailArray.@count.value\"]"); result = [[root valueForKeyPath:@"displayGroup.allObjects.@sum.detailArray.@count"] intValue] == 4; PASS(result, "-[NSArray valueForKeyPath: @\"displayGroup.allObjects.@sum.detailArray.@count\"]"); [pool release]; return (0); } gnustep-base-1.29.0/Tests/base/KVC/basic.m000066400000000000000000000133251435650067400201140ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import #import #import #import #import typedef struct { int i; char c; } myStruct; @interface TestClass : NSObject { NSString *name; NSDate *date; int num1; double num2; int num3; int num4; TestClass *child; myStruct s; bool b; } - (void) setNum3:(int) num; - (int) num3; - (void) _setNum4:(int) num; - (int) _num4; - (char) sc; - (int) si; - (myStruct) sv; - (void) setSv: (myStruct)v; @end @implementation TestClass - (id) init { s.i = 1; s.c = 2; return self; } - (void) setNum3:(int) num { num3 = num; if (num3 == 8) num3 = 7; } - (int) num3 { return num3; } - (void) _setNum4:(int) num { num4 = num; if (num4 == 8) num4 = 7; } - (int) _num4 { return num4; } - (char) sc { return s.c; } - (int) si { return s.i; } - (myStruct) sv { return s; } - (void) setSv: (myStruct)v { s = v; } @end @interface UndefinedKey : NSObject { int num1; NSString *string; } @end @implementation UndefinedKey - (void) dealloc { [string release]; [super dealloc]; } - (void) setValue:(id) value forUndefinedKey:(NSString *) key { if ([key isEqualToString: @"Lxcke"]) { [string release]; string = [value copy]; } } - (id) valueForUndefinedKey:(NSString *) key { if ([key isEqualToString: @"Lxcke"]) { return string; } return nil; } @end @interface UndefinedKey2 : NSObject { int num1; NSString *string; } @end @implementation UndefinedKey2 - (void) dealloc { [string release]; [super dealloc]; } - (void) handleTakeValue:(id) value forUnboundKey:(NSString *) key { if ([key isEqualToString: @"Lxcke"]) { [string release]; string = [value copy]; } } - (id) handleQueryWithUnboundKey:(NSString *) key { if ([key isEqualToString: @"Lxcke"]) { return string; } return nil; } @end int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSMutableString *m = [NSMutableString string]; TestClass *tester = [[[TestClass alloc] init] autorelease]; NSUInteger rc; NSValue *v; myStruct s; [m appendString: @"testing"]; [tester setValue:[[[TestClass alloc] init] autorelease] forKey: @"child"]; UndefinedKey *undefinedKey = [[[UndefinedKey alloc] init] autorelease]; UndefinedKey2 *undefinedKey2 = [[[UndefinedKey2 alloc] init] autorelease]; NSNumber *n = [NSNumber numberWithInt:8]; NSNumber *nb = [NSNumber numberWithBool:1]; NSNumber *adjustedN = [NSNumber numberWithInt:7]; NSNumber *n2 = [NSNumber numberWithDouble:87.999]; [tester setValue: @"tester" forKey: @"name"]; PASS([[tester valueForKey: @"name"] isEqualToString: @"tester"], "KVC works with strings"); rc = [m retainCount]; [tester setValue: m forKey: @"name"]; PASS([tester valueForKey: @"name"] == m, "KVC works with mutable string"); if (nil == [NSGarbageCollector defaultCollector]) { PASS(rc + 1 == [m retainCount], "KVC retains object values"); } [tester setValue:nb forKey: @"b"]; PASS([[tester valueForKey: @"b"] isEqualToNumber:nb], "KVC works with bool"); [tester setValue:n forKey: @"num1"]; PASS([[tester valueForKey: @"num1"] isEqualToNumber:n], "KVC works with ints"); [tester setValue:n2 forKey: @"num2"]; PASS([[tester valueForKey: @"num2"] isEqualToNumber:n2], "KVC works with doubles"); [tester setValue:n forKey: @"num3"]; PASS([[tester valueForKey: @"num3"] isEqualToNumber:adjustedN], "KVC works with setKey:"); [tester setValue:n forKey: @"num4"]; PASS([[tester valueForKey: @"num4"] isEqualToNumber:adjustedN], "KVC works with _setKey:"); v = [tester valueForKey: @"s"]; s.i = 0; s.c = 0; [v getValue: &s]; PASS(s.i == 1 && s.c == 2, "KVC valueForKey: works for a struct (direct)"); v = [tester valueForKey: @"sv"]; s.i = 0; s.c = 0; [v getValue: &s]; PASS(s.i == 1 && s.c == 2, "KVC valueForKey: works for a struct (getter)"); s.i = 3; s.c = 4; v = [NSValue valueWithBytes: &s objCType: @encode(myStruct)]; [tester setValue: v forKey: @"s"]; PASS([tester si] == s.i && [tester sc] == s.c, "KVC setValue:forKey: works for a struct (direct)"); s.i = 5; s.c = 6; v = [NSValue valueWithBytes: &s objCType: @encode(myStruct)]; [tester setValue: v forKey: @"sv"]; PASS([tester si] == s.i && [tester sc] == s.c, "KVC setValue:forKey: works for a struct (setter)"); [undefinedKey setValue: @"GNUstep" forKey: @"Lxcke"]; PASS([[undefinedKey valueForKey: @"Lxcke"] isEqualToString: @"GNUstep"], "KVC works with undefined keys"); [undefinedKey2 setValue: @"GNUstep" forKey: @"Lxcke"]; PASS([[undefinedKey2 valueForKey: @"Lxcke"] isEqualToString: @"GNUstep"], "KVC works with undefined keys (using deprecated methods) "); PASS_EXCEPTION( [tester setValue: @"" forKey: @"nonexistent"], NSUndefinedKeyException, "KVC properly throws @\"NSUnknownKeyException\""); PASS_EXCEPTION( [tester setValue: @"" forKey: @"nonexistent"], NSUndefinedKeyException, "KVC properly throws NSUndefinedKeyException"); PASS_EXCEPTION( [tester setValue: @"" forKeyPath: @"child.nonexistent"], @"NSUnknownKeyException", "KVC properly throws @\"NSUnknownKeyException\" with key paths"); PASS_EXCEPTION( [tester setValue: @"" forKeyPath: @"child.nonexistent"], NSUndefinedKeyException, "KVC properly throws NSUndefinedKeyException with key paths"); PASS(sel_getUid(0) == 0, "null string gives null selector"); PASS(sel_registerName(0) == 0, "register null string gives null selector"); PASS(strcmp(sel_getName(0) , "") == 0, "null selector name"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/KVC/mutable.m000066400000000000000000000156141435650067400204670ustar00rootroot00000000000000#import "ObjectTesting.h" #import typedef struct { int a; float b; char *c; } aStruct; @interface Observer : NSObject - (void) observeValueForKeyPath: (NSString *)keyPath ofObject: (id)object change: (NSDictionary *)change context: (void *)context; @end @implementation Observer - (void) observeValueForKeyPath: (NSString *)keyPath ofObject: (id)object change: (NSDictionary *)change context: (void *)context { NSLog(@"observeValueForKeyPath: %@\nofObject:%@\nchange:%@\ncontext:%p", keyPath, object, change, context); } @end @interface Lists : NSObject { NSMutableArray * cities; NSMutableArray * numbers; NSMutableArray * third; NSString *string; aStruct x; } - (int) a; - (float) b; - (const char*) c; @end @implementation Lists - (int) a { return x.a; } - (float) b { return x.b; } - (const char*) c { return x.c; } - (id) init { cities = [[NSMutableArray alloc] initWithObjects: @"Grand Rapids", @"Chicago", nil]; numbers = [[NSMutableArray alloc] initWithObjects: @"One", @"Ten", @"Three", @"Ninety", nil]; third = [[NSMutableArray alloc] initWithObjects: @"a", @"b", @"c", nil]; return self; } - (void) insertObject: (id)obj inNumbersAtIndex: (NSUInteger)index { if (![obj isEqualToString:@"NaN"]) { [numbers addObject:obj]; } } - (void) removeObjectFromNumbersAtIndex: (NSUInteger)index { if (![[numbers objectAtIndex:index] isEqualToString:@"One"]) [numbers removeObjectAtIndex:index]; } - (void) replaceObjectInNumbersAtIndex: (NSUInteger)index withObject: (id)obj { if (index == 1) obj = @"Two"; [numbers replaceObjectAtIndex:index withObject:obj]; } - (void) setCities: (NSArray *)other { [cities setArray:other]; } - (void) didChangeValueForKey: (NSString*)k { NSLog(@"%@ %@", NSStringFromSelector(_cmd), k); [super didChangeValueForKey: k]; } - (void) setX: (aStruct)s { x = s; } - (void) willChangeValueForKey: (NSString*)k { [super willChangeValueForKey: k]; NSLog(@"%@ %@", NSStringFromSelector(_cmd), k); } @end @interface Sets : NSObject { NSMutableSet * one; NSMutableSet * two; NSMutableSet * three; } @end @implementation Sets - (id)init { [super init]; one = [[NSMutableSet alloc] initWithObjects: @"one", @"two", @"eight", nil]; two = [[NSMutableSet alloc] initWithSet:one]; three = [[NSMutableSet alloc] initWithSet:one]; return self; } - (void) addOneObject: (id)anObject { if (![anObject isEqualToString:@"ten"]) [one addObject:anObject]; } - (void) removeOneObject: (id)anObject { if (![anObject isEqualToString:@"one"]) { [one removeObject:anObject]; } } - (void) setTwo: (NSMutableSet *)set { [two setSet:set]; } @end int main(void) { NSAutoreleasePool *arp = [NSAutoreleasePool new]; Lists *list = [[[Lists alloc] init] autorelease]; Observer *observer = [Observer new]; aStruct s = {1, 2, "3" }; id o; NSMutableArray * proxy; NSDictionary * temp; [list addObserver: observer forKeyPath: @"numbers" options: 15 context: 0]; [list addObserver: observer forKeyPath: @"string" options: 15 context: 0]; [list addObserver: observer forKeyPath: @"x" options: 15 context: 0]; [list setValue: @"x" forKey: @"string"]; proxy = [list mutableArrayValueForKey:@"numbers"]; PASS([proxy isKindOfClass:[NSMutableArray class]], "proxy is a kind of NSMutableArray") [proxy removeLastObject]; PASS_EXCEPTION([proxy addObject: @"NaN"];, NSRangeException,"bad removal causes range exception when observing") [proxy replaceObjectAtIndex: 1 withObject: @"Seven"]; [proxy addObject: @"Four"]; [proxy removeObject: @"One"]; o = [NSArray arrayWithObjects: @"One", @"Two", @"Three", @"Four", nil]; PASS([[list valueForKey: @"numbers"] isEqualToArray: o], "KVC mutableArrayValueForKey: proxy works with array proxy methods") proxy = [list mutableArrayValueForKey: @"cities"]; PASS([proxy isKindOfClass: [NSMutableArray class]], "proxy is a kind of NSMutableArray") [proxy addObject: @"Lima"]; o = [NSArray arrayWithObjects: @"Grand Rapids", @"Chicago", @"Lima", nil]; PASS([[list valueForKey: @"cities"] isEqualToArray: o], "KVC mutableArrayValueForKey: proxy works with set:") proxy = [list mutableArrayValueForKey: @"third"]; PASS([proxy isKindOfClass: [NSMutableArray class]], "proxy is a kind of NSMutableArray") PASS(proxy != [list valueForKey: @"third"], "KVC mutableArrayValueForKey: returns a proxy array for the ivar") PASS([[proxy objectAtIndex: 1] isEqualToString: @"b"], "This proxy works") temp = [NSDictionary dictionaryWithObject: list forKey: @"list"]; proxy = [temp mutableArrayValueForKeyPath: @"list.numbers"]; PASS([proxy isKindOfClass: NSClassFromString(@"NSKeyValueMutableArray")], "mutableArrayValueForKey: works") Sets * set = [[[Sets alloc] init] autorelease]; NSMutableSet * setProxy; setProxy = [set mutableSetValueForKey: @"one"]; PASS([setProxy isKindOfClass: [NSMutableSet class]], "proxy is a kind of NSMutableSet") [setProxy removeObject: @"one"]; [setProxy addObject: @"ten"]; [setProxy removeObject: @"eight"]; [setProxy addObject: @"three"]; o = [NSSet setWithObjects: @"one", @"two", @"three", nil]; PASS([setProxy isEqualToSet: o], "KVC mutableSetValueForKey: proxy uses methods") setProxy = [set mutableSetValueForKey: @"two"]; PASS([setProxy isKindOfClass: [NSMutableSet class]], "proxy is a kind of NSMutableSet") [setProxy addObject: @"seven"]; [setProxy minusSet: [NSSet setWithObject: @"eight"]]; o = [NSSet setWithObjects: @"one", @"two", @"seven", nil]; PASS([setProxy isEqualToSet: o], "KVC mutableSetValueForKey: proxy works with set:") setProxy = [set mutableSetValueForKey: @"three"]; PASS([setProxy isKindOfClass: [NSMutableSet class]], "proxy is kind of NSMutableSet") PASS(setProxy != [set valueForKey: @"three"], "KVC mutableSetValueForKey: returns a proxy set for the ivar") [setProxy addObject: @"seven"]; [setProxy removeObject: @"eight"]; o = [NSSet setWithObjects: @"one", @"two", @"seven", nil]; PASS([setProxy isEqualToSet: o], "this proxy works") temp = [NSDictionary dictionaryWithObject: set forKey: @"set"]; setProxy = [temp mutableSetValueForKeyPath: @"set.three"]; PASS([setProxy isKindOfClass: NSClassFromString(@"NSKeyValueMutableSet")], "mutableSetValueForKey: works") [list setX: s]; PASS([list a] == 1 && [list b] == 2.0 && strcmp([list c], "3") == 0, "able to set struct"); [list removeObserver: observer forKeyPath: @"numbers"]; [list removeObserver: observer forKeyPath: @"string"]; [list removeObserver: observer forKeyPath: @"x"]; [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/KVC/nil.m000066400000000000000000000025771435650067400176240ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import @interface DefaultNil : NSObject { int num; } @end @implementation DefaultNil - (id)init { num = 7; return self; } @end @interface DeprecatedNil : DefaultNil - (void)unableToSetNilForKey:(NSString *)key; @end @implementation DeprecatedNil - (void)unableToSetNilForKey:(NSString *)key { num = 0; } @end @interface SetNil : DefaultNil - (void)setNilValueForKey:(NSString *)key; @end @implementation SetNil - (void)setNilValueForKey:(NSString *)key { num = 0; } @end int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; DefaultNil * defaultNil = [DefaultNil new]; DeprecatedNil * deprecatedNil = [DeprecatedNil new]; SetNil * setNil = [SetNil new]; PASS_EXCEPTION([defaultNil setValue: nil forKey: @"num"], NSInvalidArgumentException, "KVC handles setting nil for a scalar") PASS_EXCEPTION([defaultNil takeValue: nil forKey: @"num"], NSInvalidArgumentException, "KVC handles setting nil for a scalar via takeValue:") [setNil setValue:nil forKey: @"num"]; PASS([[setNil valueForKey: @"num"] intValue] == 0, "KVC uses setNilValueForKey:") [deprecatedNil setValue:nil forKey: @"num"]; PASS([[deprecatedNil valueForKey: @"num"] intValue] == 0, "KVC uses deprecated unableToSetNilForKey:") [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/KVC/path.m000066400000000000000000000063051435650067400177670ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import #import #import #import @interface Tester : NSObject { int num1; double num2; id child; NSMutableDictionary * dict; } @end @implementation Tester @end @interface CustomKVC : NSObject { int num1; NSString * string; } @end @implementation CustomKVC - (void)dealloc { [string release]; [super dealloc]; } - (void)setValue:(id)value forKey:(NSString *)key { if ([key isEqualToString:@"num1"]) { num1 = [value intValue]; } else if ([key isEqualToString:@"Lücke"]) { [string release]; string = [value copy]; } } - (id)valueForKey:(NSString *)key { if ([key isEqualToString:@"num1"]) { return [NSNumber numberWithInt:num1]; } else if ([key isEqualToString:@"Lücke"]) { return string; } return nil; } @end @interface DeprecatedCustomKVC : NSObject { NSMutableDictionary * storage; } - (id)init; - (id)valueForKey:(NSString *)key; - (void)takeValue:(id)value forKey:(NSString *)key; @end @implementation DeprecatedCustomKVC - (id)init { self = [super init]; storage = [[NSMutableDictionary alloc] init]; return self; } - (id)valueForKey:(NSString *)key { if ([key isEqualToString:@"dict"]) { return storage; } return nil; } - (void)takeValue:(id)value forKey:(NSString *)key { if ([key isEqualToString:@"dict"]) { [storage release]; storage = [value retain]; } } @end int main(void) { NSAutoreleasePool * arp = [NSAutoreleasePool new]; NSString * string = @"GNUstep"; Tester * tester = [[[Tester alloc] init] autorelease]; [tester setValue:[NSMutableDictionary dictionary] forKey:@"dict"]; [tester setValue:[[[Tester alloc] init] autorelease] forKey:@"child"]; [tester setValue:[[CustomKVC new] autorelease] forKeyPath:@"child.child"]; DeprecatedCustomKVC * deprecated = [[[DeprecatedCustomKVC alloc] init] autorelease]; NSNumber * n = [NSNumber numberWithInt:8]; NSNumber * n2 = [NSNumber numberWithDouble:87.999]; [tester setValue:n2 forKeyPath:@"child.num2"]; PASS([[tester valueForKeyPath:@"child.num2"] isEqualToNumber:n2], "KVC works with simple paths"); [deprecated takeValue:[NSDictionary dictionaryWithObject:@"test" forKey:@"key"] forKey:@"dict"]; PASS_RUNS( [tester setValue:n forKeyPath:@"child.child.num1"], "KVC appears to work with key path"); PASS([[tester valueForKeyPath:@"child.child.num1"] isEqualToNumber:n], "KVC works with key paths"); NSLog(@"tester.child.child = %@", [tester valueForKeyPath: @"child.child"]); PASS_RUNS( [tester setValue:string forKeyPath:@"child.child.Lücke"], "KVC appears to work with a unicode key path"); PASS([[tester valueForKeyPath:@"child.child.Lücke"] isEqualToString:string], "KVC works with unicode path"); PASS_RUNS( [tester setValue:string forKeyPath:@"dict.Lücke"], "KVC appears to work with a unicode key path (test2)"); PASS([[tester valueForKeyPath:@"dict.Lücke"] isEqualToString:string], "KVC works with unicode path (test2)"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/NSAffineTransform/000077500000000000000000000000001435650067400215535ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSAffineTransform/TestInfo000066400000000000000000000000001435650067400232170ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSAffineTransform/basic.m000066400000000000000000000116341435650067400230170ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import #include static BOOL eq(double d1, double d2) { if (abs(d1 - d2) < 0.000001) return YES; return NO; } static BOOL is_equal_struct(NSAffineTransformStruct as, NSAffineTransformStruct bs) { if (eq(as.m11, bs.m11) && eq(as.m12, bs.m12) && eq(as.m21, bs.m21) && eq(as.m22, bs.m22) && eq(as.tX, bs.tX) && eq(as.tY, bs.tY)) return YES; return NO; } #if 0 static void print_matrix (const char *str, NSAffineTransformStruct MM) { printf("%s = %f %f %f %f %f %f\n", str, MM.m11, MM.m12, MM.m21, MM.m22, MM.tX, MM.tY); } #endif int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSAffineTransform *testObj; NSAffineTransformStruct flip = {1.0,0.0,0.0,-1.0,0.0,0.0}; NSMutableArray *testObjs = [NSMutableArray new]; NSAffineTransform *aa, *bb, *cc; NSAffineTransformStruct as = {2, 3, 4, 5, 10, 20}; NSAffineTransformStruct bs = {6, 7, 8, 9, 14, 15}; NSAffineTransformStruct cs; NSAffineTransformStruct answer1 = {36.000000, 41.000000, 64.000000, 73.000000, 234.000000, 265.000000}; NSAffineTransformStruct answer2 = {40.000000, 53.000000, 52.000000, 69.000000, 98.000000, 137.000000}; NSAffineTransformStruct answer3 = {6.000000, 9.000000, 8.000000, 10.000000, 10.000000, 20.000000}; NSAffineTransformStruct answer4 = {6.000000, 9.000000, 8.000000, 10.000000, 194.000000, 268.000000}; NSAffineTransformStruct answer5 = {2.172574, 3.215242, 3.908954, 4.864383, 10.000000, 20.000000}; NSAffineTransformStruct answer6 = {2.172574, 3.215242, 3.908954, 4.864383, 90.796249, 126.684265}; NSAffineTransformStruct answer7 = {1.651156, 2.443584, 1.329044, 1.653890, 90.796249, 126.684265}; NSPoint p; NSSize s; testObj = [NSAffineTransform new]; [testObjs addObject:testObj]; PASS(testObj != nil, "can create a new transfor"); test_NSObject(@"NSAffineTransform", testObjs); test_NSCoding(testObjs); test_keyed_NSCoding(testObjs); test_NSCopying(@"NSAffineTransform", @"NSAffineTransform", testObjs, NO, YES); testObj = [NSAffineTransform transform]; PASS(testObj != nil, "can create an autoreleased transform"); [testObj setTransformStruct: flip]; p = [testObj transformPoint: NSMakePoint(10,10)]; PASS(eq(p.x, 10) && eq(p.y, -10), "flip transform inverts point y"); s = [testObj transformSize: NSMakeSize(10,10)]; PASS(s.width == 10 && s.height == -10, "flip transform inverts size height"); p = [testObj transformPoint: p]; s = [testObj transformSize: s]; PASS(eq(p.x, 10) && eq(p.y, 10) && s.width == 10 && s.height == 10, "flip is reversible"); testObj = [NSAffineTransform transform]; [testObj translateXBy: 5.0 yBy: 6.0]; p = [testObj transformPoint: NSMakePoint(10,10)]; PASS(eq(p.x, 15.0) && eq(p.y, 16.0), "simple translate works"); [testObj translateXBy: 5.0 yBy: 4.0]; p = [testObj transformPoint: NSMakePoint(10,10)]; PASS(eq(p.x, 20.0) && eq(p.y, 20.0), "two simple translates work"); [testObj rotateByDegrees: 90.0]; p = [testObj transformPoint: NSMakePoint(10,10)]; PASS(eq(p.x, 0.0) && eq(p.y, 20.0), "translate and rotate works"); testObj = [NSAffineTransform transform]; [testObj rotateByDegrees: 90.0]; p = [testObj transformPoint: NSMakePoint(10,10)]; PASS(eq(p.x, -10.0) && eq(p.y, 10.0), "simple rotate works"); [testObj translateXBy: 5.0 yBy: 6.0]; p = [testObj transformPoint: NSMakePoint(10,10)]; PASS(eq(p.x, -16.0) && eq(p.y, 15.0), "rotate and translate works"); aa = [NSAffineTransform transform]; bb = [NSAffineTransform transform]; [aa setTransformStruct: as]; [bb setTransformStruct: bs]; /* Append matrix */ cc = [aa copy]; [cc appendTransform: bb]; cs = [cc transformStruct]; PASS((is_equal_struct(cs, answer1)), "appendTransform:") /* Prepend matrix */ cc = [aa copy]; [cc prependTransform: bb]; cs = [cc transformStruct]; PASS((is_equal_struct(cs, answer2)), "prependTransform:") /* scaling */ cc = [aa copy]; [cc scaleXBy: 3 yBy: 2]; cs = [cc transformStruct]; PASS((is_equal_struct(cs, answer3)), "scaleXBy:yBy:") //print_matrix ("Scale X A", cs); [cc translateXBy: 12 yBy: 14]; cs = [cc transformStruct]; PASS((is_equal_struct(cs, answer4)), "translateXBy:yBy:") //print_matrix ("Trans X Scale X A", cs); /* rotation */ cc = [aa copy]; [cc rotateByDegrees: 2.5]; cs = [cc transformStruct]; PASS((is_equal_struct(cs, answer5)), "rotateByDegrees") //print_matrix ("Rotate X A", cs); [cc translateXBy: 12 yBy: 14]; cs = [cc transformStruct]; PASS((is_equal_struct(cs, answer6)), "Translate X Rotate X A") //print_matrix ("Trans X Rotate X A", cs); /* multiple */ [cc scaleXBy: .76 yBy: .34]; cs = [cc transformStruct]; PASS((is_equal_struct(cs, answer7)), "Scale X Translate X Rotate X A") //print_matrix ("Scale X Trans X Rotate X A", cs); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSArchiver/000077500000000000000000000000001435650067400202325ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSArchiver/TestInfo000066400000000000000000000000001435650067400216760ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSArchiver/basic.m000066400000000000000000000006261435650067400214750ustar00rootroot00000000000000#import #import "ObjectTesting.h" int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; test_alloc(@"NSArchiver"); test_NSObject(@"NSArchiver",[NSArray arrayWithObject:[[NSArchiver alloc] init]]); test_alloc(@"NSUnarchiver"); test_NSObject(@"NSUnarchiver",[NSArray arrayWithObject:[[NSUnarchiver alloc] init]]); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSArchiver/create.m000066400000000000000000000017051435650067400216560ustar00rootroot00000000000000#import #import #import #import #import "Testing.h" #import "ObjectTesting.h" int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; id obj = [NSArchiver new]; NSMutableData *data1; PASS((obj != nil && [obj isKindOfClass:[NSArchiver class]] && [obj archiverData] != nil), "+new creates an empty NSArchiver"); [obj release]; obj = [NSArchiver alloc]; data1 = [NSMutableData dataWithLength: 0]; obj = [obj initForWritingWithMutableData: data1]; PASS((obj != nil && [obj isKindOfClass:[NSArchiver class]] && data1 == [obj archiverData]), "-initForWritingWithMutableData seems ok"); PASS_EXCEPTION([[NSUnarchiver alloc] initForReadingWithData:nil];, @"NSInvalidArgumentException", "Creating an NSUnarchiver with nil data throws an exception"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSArchiver/eszett1.plist000066400000000000000000000002141435650067400227030ustar00rootroot00000000000000bplist00Ô X$versionX$objectsY$archiverT$top† ¢U$nullaß_NSKeyedArchiverÑ Troot€#-27:@CUX] _gnustep-base-1.29.0/Tests/base/NSArchiver/eszett2.plist000066400000000000000000000002141435650067400227040ustar00rootroot00000000000000bplist00ÔX$objectsT$topX$versionY$archiver¢ Ñ † _NSKeyedArchiverU$nullaßTroot€(258=OUX] _gnustep-base-1.29.0/Tests/base/NSArchiver/general.m000066400000000000000000000027231435650067400220310ustar00rootroot00000000000000#import #import #import #import #import #import #import "Testing.h" #import "ObjectTesting.h" int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSString *val1, *val2, *val3; NSArray *vals1, *vals2; NSData *data1; NSArray *a; PASS_RUNS(val1 = [NSString stringWithCString:"Archiver.dat"]; val2 = [NSString stringWithCString:"A Goodbye"]; val3 = [NSString stringWithCString:"Testing all strings"]; vals1 = [[NSArray arrayWithObject:val1] arrayByAddingObject:val2]; vals2 = [vals1 arrayByAddingObject:val2];, "We can build basic strings and arrays for tests"); data1 = [NSArchiver archivedDataWithRootObject:vals2]; PASS((data1 != nil && [data1 length] != 0), "archivedDataWithRootObject: seems ok"); PASS([NSArchiver archiveRootObject:vals2 toFile:val1], "archiveRootObject:toFile: seems ok"); a = [NSUnarchiver unarchiveObjectWithData:data1]; PASS((a != nil && [a isKindOfClass:[NSArray class]] && [a isEqual:vals2]), "unarchiveObjectWithData: seems ok"); a = [NSUnarchiver unarchiveObjectWithFile:val1]; PASS((a != nil && [a isKindOfClass:[NSArray class]] && [a isEqual:vals2]), "unarchiveObjectWithFile: seems ok"); [[NSFileManager defaultManager] removeFileAtPath: val1 handler: nil]; [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSArchiver/stringEncoding.m000066400000000000000000000021021435650067400233600ustar00rootroot00000000000000#import #import "Testing.h" #import "ObjectTesting.h" int main(int argc, const char **argv) { NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; const unichar EszettChar = 0x00df; NSString *EszettStr = [[[NSString alloc] initWithCharacters: &EszettChar length: 1] autorelease]; { NSData *data = [NSKeyedArchiver archivedDataWithRootObject: EszettStr]; NSString *unarchivedString = [NSKeyedUnarchiver unarchiveObjectWithData: data]; PASS_EQUAL(unarchivedString, EszettStr, "'eszett' character roundtrip to binary plist seems to work."); } { NSString *plist1String = [NSKeyedUnarchiver unarchiveObjectWithFile: @"eszett1.plist"]; PASS_EQUAL(plist1String, EszettStr, "'eszett' character read from OSX binary plist"); } { NSString *plist2String = [NSKeyedUnarchiver unarchiveObjectWithFile: @"eszett2.plist"]; PASS_EQUAL(plist2String, EszettStr, "'eszett' character read from GNUstep binary plist"); } [pool release]; return 0; } gnustep-base-1.29.0/Tests/base/NSArray/000077500000000000000000000000001435650067400175455ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSArray/TestInfo000066400000000000000000000000001435650067400212110ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSArray/basic.m000066400000000000000000000034121435650067400210040ustar00rootroot00000000000000#import #import #import "ObjectTesting.h" int main() { NSArray *obj; NSMutableArray *testObjs = [[NSMutableArray alloc] init]; NSString *str; NSAutoreleasePool *arp = [NSAutoreleasePool new]; test_alloc(@"NSArray"); obj = [NSArray new]; PASS((obj != nil && [obj count] == 0),"can create an empty array"); str = @"hello"; [testObjs addObject: obj]; obj = [NSArray arrayWithObject:str]; PASS((obj != nil && [obj count] == 1), "can create an array with one element"); [testObjs addObject: obj]; test_NSObject(@"NSArray", testObjs); test_NSCoding(testObjs); test_keyed_NSCoding(testObjs); test_NSCopying(@"NSArray",@"NSMutableArray",testObjs,YES,NO); test_NSMutableCopying(@"NSArray",@"NSMutableArray",testObjs); obj = [NSArray arrayWithContentsOfFile: @"test.plist"]; PASS((obj != nil && [obj count] > 0),"can create an array from file"); #if 1 /* The apple foundation is arguably buggy in that it seems to create a * mutable array ... we currently copy that */ PASS([obj isKindOfClass: [NSMutableArray class]] == YES,"array mutable"); PASS_RUNS([(NSMutableArray*)obj addObject: @"x"],"can add to array"); #else PASS([obj isKindOfClass: [NSMutableArray class]] == NO,"array immutable"); #endif obj = [obj objectAtIndex: 0]; PASS([obj isKindOfClass: [NSMutableArray class]] == YES,"array mutable"); START_SET("NSArray subscripting") # ifndef __has_feature # define __has_feature(x) 0 # endif #if __has_feature(objc_subscripting) NSArray *a = @[ @"foo", @"bar" ]; PASS([@"foo" isEqualToString:a[0]], "Array subscripting works"); # else SKIP("No collection subscripting support in the compiler.") # endif END_SET("NSArray subscripting") [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSArray/blocks.m000066400000000000000000000103201435650067400211740ustar00rootroot00000000000000#import "Testing.h" #import #import #import #import #import #import #import static NSUInteger fooCount = 0; static NSUInteger lastIndex = NSNotFound; static BOOL reverse = NO; int main() { START_SET("NSArray Blocks") # ifndef __has_feature # define __has_feature(x) 0 # endif # if __has_feature(blocks) NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSLock *lock = [[[NSLock alloc] init] autorelease]; NSArray *array = [NSArray arrayWithObjects: @"foo", @"bar", @"foo", nil]; void(^enumBlock)(id,NSUInteger,BOOL*) = ^(id obj, NSUInteger index, BOOL *stop) { [lock lock]; if ([obj isEqual: @"foo"]) { fooCount++; } if (lastIndex == NSNotFound) { lastIndex = index; } else { lastIndex = reverse ? MIN(lastIndex, index) : MAX(lastIndex, index); } [lock unlock]; }; [array enumerateObjectsUsingBlock: enumBlock]; PASS((2 == fooCount) && (lastIndex == 2), "Can forward enumerate array using a block"); fooCount = 0; lastIndex = NSNotFound; [array enumerateObjectsWithOptions: NSEnumerationConcurrent usingBlock: enumBlock]; PASS((2 == fooCount) && (lastIndex == 2), "Can forward enumerate array concurrently using a block"); fooCount = 0; lastIndex = NSNotFound; reverse = YES; [array enumerateObjectsWithOptions: NSEnumerationReverse usingBlock: enumBlock]; PASS((0 == lastIndex), "Can enumerate array in reverse using a block"); reverse = NO; fooCount = 0; lastIndex = NSNotFound; enumBlock = ^(id obj, NSUInteger index, BOOL *stop){if ([obj isEqual: @"foo"]){ fooCount++;} else if ([obj isEqual: @"bar"]){ *stop=YES;}; lastIndex = index;}; [array enumerateObjectsUsingBlock: enumBlock]; PASS(((1 == fooCount) && (lastIndex == 1)), "Block can stop enumeration prematurely."); NSIndexSet *set = [array indexesOfObjectsPassingTest: ^(id obj, NSUInteger index, BOOL* stop){ if ([obj isEqual: @"foo"]) { return YES;} return NO;}]; PASS(((2 == [set count]) && (YES == [set containsIndex: 0]) && (YES == [set containsIndex: 2]) && (NO == [set containsIndex: 1])), "Can select object indices based on block predicate."); [arp release]; arp = nil; array = [NSArray arrayWithObjects:[NSNumber numberWithInteger:2], [NSNumber numberWithInteger:5], [NSNumber numberWithInteger:3], [NSNumber numberWithInteger:2], [NSNumber numberWithInteger:10], nil]; NSArray *sortedArray = [NSArray arrayWithObjects:[NSNumber numberWithInteger:2], [NSNumber numberWithInteger:2], [NSNumber numberWithInteger:3], [NSNumber numberWithInteger:5], [NSNumber numberWithInteger:10], nil]; PASS([sortedArray isEqualToArray:[array sortedArrayUsingComparator:^ NSComparisonResult (NSNumber *a, NSNumber *b) { return [a compare:b]; }]], "Can sort arrays with NSComparators."); PASS(0 == [sortedArray indexOfObject:[NSNumber numberWithInteger:2] inSortedRange:NSMakeRange(0, [sortedArray count]) options:NSBinarySearchingFirstEqual usingComparator:^ NSComparisonResult (NSNumber *a, NSNumber *b) { return [a compare:b]; }], "Can find index of first object in sorted array"); PASS(1 == [sortedArray indexOfObject:[NSNumber numberWithInteger:2] inSortedRange:NSMakeRange(0, [sortedArray count]) options:NSBinarySearchingLastEqual usingComparator:^ NSComparisonResult (NSNumber *a, NSNumber *b) { return [a compare:b]; }], "Can find index of first object in sorted array"); PASS(3 == [sortedArray indexOfObject:[NSNumber numberWithInteger:4] inSortedRange:NSMakeRange(0, [sortedArray count]) options:NSBinarySearchingInsertionIndex usingComparator:^ NSComparisonResult (NSNumber *a, NSNumber *b) { return [a compare:b]; }], "Can find insertion index in sorted array"); PASS(NSNotFound == [sortedArray indexOfObject:[NSNumber numberWithInteger:4] inSortedRange:NSMakeRange(0, [sortedArray count]) options:0 usingComparator:^ NSComparisonResult (NSNumber *a, NSNumber *b) { return [a compare:b]; }], "Can not find non existant object in sorted array"); # else SKIP("No Blocks support in the compiler.") # endif END_SET("NSArray Blocks") return 0; } gnustep-base-1.29.0/Tests/base/NSArray/create.m000066400000000000000000000025371435650067400211750ustar00rootroot00000000000000#import #import #import #import "ObjectTesting.h" int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; id val1,val2,val3; id ptrvals[3]; NSArray *obj, *old; val1 = @"Tom"; val2 = @"Petty"; val3 = @"doesn't want to live like a refugee"; ptrvals[0] = val1; ptrvals[1] = val2; ptrvals[2] = val3; obj = [NSArray new]; PASS((obj != nil && [obj isKindOfClass:[NSArray class]] && [obj count] == 0), "+new creates an empty array"); [obj release]; obj = [NSArray array]; PASS((obj != nil && [obj isKindOfClass:[NSArray class]] && [obj count] == 0), "+array creates an empty array"); PASS_EXCEPTION([NSArray arrayWithObject:nil];, @"NSInvalidArgumentException", "+arrayWithObject with nil argument throws exception"); obj = [NSArray arrayWithObject:val1]; PASS(obj != nil && [obj isKindOfClass:[NSArray class]] && [obj count] == 1, "+arrayWithObject: builds a minimal array"); obj = [NSArray arrayWithObjects:ptrvals count:3]; old = obj; PASS(obj != nil && [obj isKindOfClass:[NSArray class]] && [obj count] == 3, "+arrayWithObjects: builds an array"); obj = [NSArray arrayWithArray:old]; PASS(obj != nil && [old isEqual:obj], "+arrayWithArray: copies array"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSArray/general.m000066400000000000000000000074211435650067400213440ustar00rootroot00000000000000#import #import "ObjectTesting.h" int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; id val1,val2,val3,obj; NSArray *arr,*vals1,*vals2,*vals3; val1 = @"Hello"; val2 = @"A Goodbye"; val3 = @"Testing all strings"; vals1 = [[[NSArray arrayWithObject:val1] arrayByAddingObject:val2] retain]; vals2 = [[vals1 arrayByAddingObject:val2] retain]; vals3 = [[vals1 arrayByAddingObject:val3] retain]; obj = [NSArray new]; arr = obj; PASS(obj != nil && [obj isKindOfClass:[NSArray class]] && [obj count] == 0, "-count returns zero for an empty array"); PASS([arr hash] == 0, "-hash returns zero for an empty array"); PASS(vals3 != nil && [vals3 containsObject:val2], "-containsObject works"); PASS(vals3 != nil && [vals3 indexOfObject:@"A Goodbye"] == 1, "-indexOfObject: finds object"); PASS(vals3 != nil && [vals3 indexOfObjectIdenticalTo:val2], "-indexOfObjectIdenticalTo: finds identical object"); { NSEnumerator *e; id v1, v2, v3; e = [arr objectEnumerator]; v1 = [e nextObject]; v2 = [e nextObject]; PASS(e != nil && v1 == nil && v2 == nil, "-objectEnumerator: is ok for empty array"); e = [vals1 objectEnumerator]; v1 = [e nextObject]; v2 = [e nextObject]; v3 = [e nextObject]; PASS(v1 != nil && v2 != nil && v3 == nil && [vals1 containsObject:v1] && [vals1 containsObject:v2] && [v1 isEqual:val1] && [v2 isEqual: val2], "-objectEnumerator: enumerates the array"); } { obj = [arr description]; obj = [obj propertyList]; PASS(obj != nil && [obj isKindOfClass:[NSArray class]] && [obj count] == 0, "-description gives us a text property-list (empty array)"); obj = [arr description]; obj = [obj propertyList]; PASS(obj != nil && [obj isKindOfClass:[NSArray class]] && [obj isEqual:arr], "-description gives us a text property-list"); } PASS(vals1 != nil && [vals1 isKindOfClass: [NSArray class]] && [vals1 count] == 2, "-count returns two for an array with two objects"); PASS([vals1 hash] == 2, "-hash returns two for an array with two objects"); PASS([vals1 indexOfObject:nil] == NSNotFound, "-indexOfObject: gives NSNotFound for a nil object"); PASS([vals1 indexOfObject:val3] == NSNotFound, "-indexOfObject: gives NSNotFound for a object not in the array"); PASS([vals1 isEqualToArray:vals1], "Array is equal to itself using -isEqualToArray:"); PASS(![vals1 isEqualToArray:vals2],"Similar arrays are not equal using -isEqualToArray:"); { NSArray *a; NSRange r = NSMakeRange(0,2); a = [vals2 subarrayWithRange:r]; PASS(a != nil && [a isKindOfClass:[NSArray class]] && [a count] == 2 && [a objectAtIndex:0] == val1 && [a objectAtIndex:1] == val2, "-subarrayWithRange: seems ok"); r = NSMakeRange(1,2); PASS_EXCEPTION([arr subarrayWithRange:r];,@"NSRangeException","-subarrayWithRange with invalid range"); } { NSString *c = @"/"; NSString *s = @"Hello/A Goodbye"; NSString *a = [vals1 componentsJoinedByString: c]; PASS(a != nil && [a isKindOfClass:[NSString class]] && [a isEqual:s], "-componentsJoinedByString: seems ok"); } { NSArray *a = [vals1 sortedArrayUsingSelector:@selector(compare:)]; PASS(a != nil && [a isKindOfClass:[NSArray class]] && [a count] == 2 && [a objectAtIndex:0] == val2 && [a objectAtIndex:1] == val1, "-sortedArrayUsingSelector: seems ok"); } { NSMutableArray *unsorted = [NSMutableArray arrayWithContentsOfFile: @"random.plist"]; NSArray *expected = [NSArray arrayWithContentsOfFile: @"sorted.plist"]; [unsorted sortUsingSelector: @selector(compare:)]; PASS_EQUAL(unsorted, expected, "Sorting larger arrays works."); } [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSArray/random.plist000066400000000000000000000010631435650067400221020ustar00rootroot00000000000000( "ahTeiKio0a", "queeBiuja6", "aeFienge4a", "uDuw0TeYoo", "ix2HiZah1u", "iXoJoo7Iec", "iebeeY6ech", "uiNgu0EiX9", "Ya0ao7eich", "ahch5Edizu", "aoPh8en1wo", "IeZoo9gahN", "AG1PheeLie", "Gai9beiChu", "aireik7Eth", "aeN3Xoh1ae", "xahGh1Reif", "ov4YoreiFi", "es2aiJaesu", "eGhol6eifa", "ein9aeLies", "aiJahf8sha", "aip3Boophi", "haeyahV9iY", "Othee6Anga", "zeid5eey7I", "shok5Eevah", "Ohth6aWaey", "teV9aw2jae", "WeDeeRu5te", "Nu7eop1chu", "eeXaeDae5y", "OoChiez5ae", "ioSh5ooh2d", "aiMai5koox", "Hae0ohJa1e", "ahCh5Re1Ee", "Su2xuof9Ta", "loo1Leophe", "lie2iCuiho" ) gnustep-base-1.29.0/Tests/base/NSArray/sorted.plist000066400000000000000000000010611435650067400221200ustar00rootroot00000000000000("AG1PheeLie", "Gai9beiChu", "Hae0ohJa1e", "IeZoo9gahN", "Nu7eop1chu", "Ohth6aWaey", "OoChiez5ae", "Othee6Anga", "Su2xuof9Ta", "WeDeeRu5te", "Ya0ao7eich", "aeFienge4a", "aeN3Xoh1ae", "ahCh5Re1Ee", "ahTeiKio0a", "ahch5Edizu", "aiJahf8sha", "aiMai5koox", "aip3Boophi", "aireik7Eth", "aoPh8en1wo", "eGhol6eifa", "eeXaeDae5y", "ein9aeLies", "es2aiJaesu", "haeyahV9iY", "iXoJoo7Iec", "iebeeY6ech", "ioSh5ooh2d", "ix2HiZah1u", "lie2iCuiho", "loo1Leophe", "ov4YoreiFi", "queeBiuja6", "shok5Eevah", "teV9aw2jae", "uDuw0TeYoo", "uiNgu0EiX9", "xahGh1Reif", "zeid5eey7I") gnustep-base-1.29.0/Tests/base/NSArray/test.plist000066400000000000000000000000201435650067400215710ustar00rootroot00000000000000( (1, 2, 3) ) gnustep-base-1.29.0/Tests/base/NSAttributedString/000077500000000000000000000000001435650067400217655ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSAttributedString/TestInfo000066400000000000000000000000001435650067400234310ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSAttributedString/basic.m000066400000000000000000000011121435650067400232170ustar00rootroot00000000000000#import #import #import "ObjectTesting.h" int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSArray *arr = [NSArray arrayWithObject:[NSAttributedString new]]; test_alloc(@"NSAttributedString"); test_NSObject(@"NSAttributedString", arr); test_NSCoding(arr); test_keyed_NSCoding(arr); test_NSCopying(@"NSAttributedString",@"NSMutableAttributedString",arr,NO, NO); test_NSMutableCopying(@"NSAttributedString",@"NSMutableAttributedString",arr); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSAttributedString/test00.m000066400000000000000000000037441435650067400232720ustar00rootroot00000000000000#import #import #import #import "ObjectTesting.h" int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSAttributedString *s; NSString *key1, *val1, *str1; NSRange r = NSMakeRange(0,6); NSAttributedString *astr1, *astr2; NSDictionary *dict1; NSRange range = NSMakeRange(0,0); id obj; s = [[[NSAttributedString alloc] initWithString: @"string"] autorelease]; PASS_EQUAL([s string], @"string", "equality OK for string value"); PASS([s length] == 6, "length reported correctly"); PASS_EQUAL([s attributesAtIndex: 0 effectiveRange: NULL], [NSDictionary dictionary], "returnsempty attributes dictionary, not nil"); key1 = @"Helvetica 12-point"; val1 = @"NSFontAttributeName"; str1 = @"Attributed string test"; dict1 = [NSDictionary dictionaryWithObject:val1 forKey:key1]; astr1 = [[NSAttributedString alloc] initWithString: str1 attributes: dict1]; PASS(astr1 != nil && [astr1 isKindOfClass: [NSAttributedString class]] && [[astr1 string] isEqual: str1],"-initWithString:attributes: works"); obj = [astr1 attributesAtIndex: 0 effectiveRange: &range]; PASS(obj != nil && [obj isKindOfClass: [NSDictionary class]] && [obj count] == 1 && range.length != 0, "-attributesAtIndex:effectiveRange: works"); obj = [astr1 attribute: key1 atIndex: 0 effectiveRange: &range]; PASS(obj != nil && [obj isEqual: val1] && range.length != 0, "-attribute:atIndex:effectiveRange: works"); obj = [astr1 attributedSubstringFromRange: r]; PASS(obj != nil && [obj isKindOfClass: [NSAttributedString class]] && [obj length] == r.length,"-attributedSubstringFromRange works"); r = NSMakeRange(0,[astr1 length]); astr2 = [astr1 attributedSubstringFromRange: r]; PASS(astr2 != nil && [astr1 isEqualToAttributedString: astr2], "extract and compare using -isEqualToAttributedString works"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSAutoreleasePool/000077500000000000000000000000001435650067400215725ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSAutoreleasePool/TestInfo000066400000000000000000000000001435650067400232360ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSAutoreleasePool/autorelease_eh.m000066400000000000000000000024611435650067400247400ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import @interface TestClass : NSObject - (void)runTest; - (void)exceptionThrowingMethod; @end @implementation TestClass - (void)runTest { int c = 0; int i; for (i = 0; i < 10; i++) { NSAutoreleasePool *pool = [NSAutoreleasePool new]; NS_DURING [self exceptionThrowingMethod]; NS_HANDLER c++; NS_ENDHANDLER [pool release]; } PASS(c == 10, "Caught the correct number of exceptions without breaking the autorelease pool\n"); } - (void)exceptionThrowingMethod { NSAutoreleasePool *pool = [NSAutoreleasePool new]; [@"Hello" stringByAppendingString: @" something to create a autoreleased object"]; NSLog(@"Throwing an exception"); [[NSException exceptionWithName: @"MyFunException" reason: @"it was always meant to happen" userInfo: [NSDictionary dictionary]] raise]; [pool release]; // Obviously this doesn't get run, but the [NSAutorelease new] at the top causes the problem } @end int main(int argc, char** argv) { NSAutoreleasePool *pool = [NSAutoreleasePool new]; TestClass *testClass = [[TestClass new] autorelease]; [testClass runTest]; [pool release]; PASS(1, "Destroying pools in the wrong order didn't break anything..."); return 0; } gnustep-base-1.29.0/Tests/base/NSAutoreleasePool/basic.m000066400000000000000000000023411435650067400230310ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import static BOOL freed; @interface Test : NSObject @end @implementation Test - (void)dealloc { freed = YES; [super dealloc]; } @end int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSObject *o = [NSObject new]; unsigned c; unsigned i; [[o retain] autorelease]; RELEASE(arp); arp = [NSAutoreleasePool new]; c = [arp autoreleaseCount]; printf("Initial count %u\n", c); for (i = 0; i < 1000; i++) { [[o retain] autorelease]; } i = [arp autoreleaseCount]; printf("Final count %u\n", i); NSCAssert(arp == [NSAutoreleasePool currentPool], NSInternalInconsistencyException); PASS(1000 == i - c, "Autorelease count is correct"); PASS([arp autoreleaseCountForObject: o] == 1000, "Autorelease count for object is correct"); PASS([NSAutoreleasePool autoreleaseCountForObject: o] == 1000, "Autorelease count for object is correct"); PASS(freed == NO, "Object not prematurely freed"); [arp release]; arp = [NSAutoreleasePool new]; [o release]; PASS(freed == NO, "Object freed by autoreleasing"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/NSBlock/000077500000000000000000000000001435650067400175215ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSBlock/blockassign.m000066400000000000000000000015211435650067400221750ustar00rootroot00000000000000#import "Testing.h" #import int main (int argc, char **argv) { START_SET("NSBlock") #if __has_feature(blocks) BOOL (^hello)(void) = ^() { return YES; }; PASS(hello(), "Calling a block"); BOOL (^helloCopy)(void) = Block_copy(hello); Block_release(hello); PASS(helloCopy(), "Calling a copy of a block"); NSArray *blockArr = [NSArray arrayWithObject:helloCopy]; PASS([blockArr count] == 1, "Block used as object in an array"); void (^helloArr)(void) = [blockArr objectAtIndex:0]; PASS(helloCopy(), "Block successfully retrived from array"); Block_release(helloCopy); #elif defined(__clang__) SKIP("Your compiler supports blocks, but this support was disabled for some reason.") #else SKIP("Your compiler does not support blocks.") #endif END_SET("NSBlock") return 0; } gnustep-base-1.29.0/Tests/base/NSBundle/000077500000000000000000000000001435650067400177005ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSBundle/GNUmakefile.preamble000066400000000000000000000012471435650067400235440ustar00rootroot00000000000000 ADDITIONAL_INCLUDE_DIRS += -I../GenericTests/ -I../../.. ADDITIONAL_OBJCFLAGS += -Wall # OR operation to determine whether we are running on Windows, or MinGW. # Windows does not support the concept of a run-time search path. ifneq (,$(filter $(GNUSTEP_TARGET_OS),windows mingw32)) else resources2_LDFLAGS += -Wl,-rpath -Wl,$(CURDIR)/Resources/TestFramework.framework/Versions/Current/$(GNUSTEP_TARGET_LDIR) resources2_LIB_DIRS += -L./Resources/TestFramework.framework/$(GNUSTEP_TARGET_LDIR) resources2_TOOL_LIBS += -lTestFramework endif $(GNUSTEP_INSTANCE)_SUBPROJECTS = ../GenericTests SUBPROJECTS = ../GenericTests Resources include $(GNUSTEP_MAKEFILES)/aggregate.make gnustep-base-1.29.0/Tests/base/NSBundle/Resources/000077500000000000000000000000001435650067400216525ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSBundle/Resources/English.lproj/000077500000000000000000000000001435650067400243705ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSBundle/Resources/English.lproj/TextRes.txt000066400000000000000000000000211435650067400265200ustar00rootroot00000000000000English resource gnustep-base-1.29.0/Tests/base/NSBundle/Resources/French.lproj/000077500000000000000000000000001435650067400242045ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSBundle/Resources/French.lproj/TextRes.txt000066400000000000000000000000201435650067400263330ustar00rootroot00000000000000French resource gnustep-base-1.29.0/Tests/base/NSBundle/Resources/GNUmakefile000066400000000000000000000011751435650067400237300ustar00rootroot00000000000000 include $(GNUSTEP_MAKEFILES)/common.make NEEDS_GUI=no BUNDLE_NAME = TestBundle FRAMEWORK_NAME = TestFramework TestBundle_OBJC_FILES = TestBundle.m TestBundle_RESOURCE_FILES = NonLocalRes.txt TestBundle_LANGUAGES = English French de TestBundle_LOCALIZED_RESOURCE_FILES = TextRes.txt TestBundle_NEEDS_GUI = NO TestFramework_OBJC_FILES = TestFramework.m TestFramework_RESOURCE_FILES = NonLocalRes.txt TestFramework_LANGUAGES = English French de TestFramework_LOCALIZED_RESOURCE_FILES = TextRes.txt TestFramework_CURRENT_VERSION_NAME = 2 include $(GNUSTEP_MAKEFILES)/bundle.make include $(GNUSTEP_MAKEFILES)/framework.make check:: all gnustep-base-1.29.0/Tests/base/NSBundle/Resources/NonLocalRes.txt000066400000000000000000000000341435650067400245670ustar00rootroot00000000000000Non-localized Text resource gnustep-base-1.29.0/Tests/base/NSBundle/Resources/TestBundle.m000066400000000000000000000003161435650067400241010ustar00rootroot00000000000000#import #import @interface TestBundle : NSObject { } -(NSString *)test; @end @implementation TestBundle -(NSString *)test { return @"Something"; } @end gnustep-base-1.29.0/Tests/base/NSBundle/Resources/TestBundleInfo.plist000066400000000000000000000000671435650067400256170ustar00rootroot00000000000000{ CFBundleIdentifier = "Test Bundle Identifier 1"; } gnustep-base-1.29.0/Tests/base/NSBundle/Resources/TestFramework.m000066400000000000000000000003231435650067400246230ustar00rootroot00000000000000#import #import @interface TestFramework : NSObject { } -(NSString *)test; @end @implementation TestFramework -(NSString *)test { return @"Something"; } @end gnustep-base-1.29.0/Tests/base/NSBundle/Resources/de.lproj/000077500000000000000000000000001435650067400233675ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSBundle/Resources/de.lproj/TextRes.txt000066400000000000000000000000231435650067400255210ustar00rootroot00000000000000Deutsche Ressource gnustep-base-1.29.0/Tests/base/NSBundle/TestInfo000066400000000000000000000000001435650067400213440ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSBundle/basic.m000066400000000000000000000004711435650067400211410ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; test_alloc(@"NSBundle"); test_NSObject(@"NSBundle", [NSArray arrayWithObject:[NSBundle new]]); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSBundle/create.m000066400000000000000000000024371435650067400213270ustar00rootroot00000000000000#import #import #import #import "ObjectTesting.h" int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSString *path; NSBundle *bundle; path = [[[[NSFileManager defaultManager] currentDirectoryPath] stringByStandardizingPath] stringByAppendingPathComponent: @"Resources"]; PASS([NSBundle mainBundle] != nil, "+mainBundle returns non-nil if the tool has no bundle"); bundle = [NSBundle bundleWithPath: path]; TEST_FOR_CLASS(@"NSBundle", bundle, "+bundleWithPath returns a bundle"); TEST_STRING([bundle bundlePath],"a bundle has a path"); PASS([path isEqual:[bundle bundlePath]] && [[bundle bundlePath] isEqual: path], "bundlePath returns the correct path"); TEST_FOR_CLASS(@"NSDictionary",[bundle infoDictionary], "a bundle has an infoDictionary"); PASS([NSBundle bundleWithPath: [path stringByAppendingPathComponent: @"nonexistent"]] == nil, "+bundleWithPath returns nil for a non-existing path"); { NSArray *arr = [NSBundle allBundles]; PASS(arr != nil && [arr isKindOfClass: [NSArray class]] && [arr count] != 0, "+allBundles returns an array"); } [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSBundle/general.m000066400000000000000000000054531435650067400215020ustar00rootroot00000000000000#import "ObjectTesting.h" #import @interface TestClass : NSObject @end @implementation TestClass @end int main() { START_SET("NSBundle general") NSFileManager *fm; NSBundle *classBundle, *identifierBundle, *bundle; NSString *path, *exepath; fm = [NSFileManager defaultManager]; #if defined(GNUSTEP) START_SET("NSBundle GNUstep general") NSBundle *gnustepBundle; gnustepBundle = [NSBundle bundleForLibrary: @"gnustep-base"]; if (nil == gnustepBundle) SKIP("it looks like GNUstep-base is not yet installed") PASS(( [(gnustepBundle = [NSBundle bundleForLibrary: @"gnustep-base"]) isKindOfClass: [NSBundle class]]), "+bundleForLibrary: makes a bundle for us") PASS([gnustepBundle principalClass] == [NSObject class], "-principalClass returns NSObject for the +bundleForLibrary:gnustep-base"); PASS([[gnustepBundle classNamed: @"NSArray"] isEqual: [NSArray class]] && [[NSArray class] isEqual: [gnustepBundle classNamed: @"NSArray"]], "-classNamed returns the correct class"); TEST_STRING([gnustepBundle resourcePath],"-resourcePath returns a string"); [gnustepBundle setBundleVersion:42]; PASS([gnustepBundle bundleVersion] == 42, "we can set and get gnustep bundle version"); PASS([gnustepBundle load], "-load behaves properly on the gnustep bundle"); exepath = [gnustepBundle executablePath]; PASS([fm fileExistsAtPath: exepath], "-executablePath returns an executable path (gnustep bundle)"); END_SET("NSBundle GNUstep general") #endif classBundle = [NSBundle bundleForClass: [TestClass class]]; TEST_FOR_CLASS(@"NSBundle",classBundle, "+bundleForClass: makes a bundle for us"); NSLog(@"%@", [classBundle principalClass]); PASS([classBundle principalClass] == [TestClass class], "-principalClass returns TestClass for +bundleForClass:[TestClass class]"); PASS(classBundle == [NSBundle mainBundle], "-mainBundle is the same as +bundleForClass:[TestClass class]"); path = [[[fm currentDirectoryPath] stringByAppendingPathComponent:@"Resources"] stringByAppendingPathComponent: @"TestBundle.bundle"]; bundle = [NSBundle bundleWithPath: path]; PASS([bundle isKindOfClass:[NSBundle class]], "+bundleWithPath returns an NSBundle"); exepath = [bundle executablePath]; PASS([fm fileExistsAtPath: exepath], "-executablePath returns an executable path (real bundle)"); identifierBundle = [NSBundle bundleWithIdentifier: @"Test Bundle Identifier 1"]; PASS(identifierBundle == bundle, "+bundleWithIdentifier returns correct bundle"); identifierBundle = [NSBundle bundleWithIdentifier: @"Test Bundle Identifier 2"]; PASS(identifierBundle == nil, "+bundleWithIdentifier returns nil for non-existent identifier"); END_SET("NSBundle general") return 0; } gnustep-base-1.29.0/Tests/base/NSBundle/load/000077500000000000000000000000001435650067400206175ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSBundle/load/GNUmakefile.preamble000066400000000000000000000003241435650067400244560ustar00rootroot00000000000000 ADDITIONAL_OBJCFLAGS += -I../../GenericTests/ -I../../../.. -Wall $(GNUSTEP_INSTANCE)_SUBPROJECTS = ../../GenericTests SUBPROJECTS=../../GenericTests ../Resources include $(GNUSTEP_MAKEFILES)/aggregate.make gnustep-base-1.29.0/Tests/base/NSBundle/load/load.m000066400000000000000000000040601435650067400217140ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSString *path; NSBundle *bundle; Class aClass; id anObj; path = RETAIN([[[[[NSFileManager defaultManager] currentDirectoryPath] stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"Resources"] stringByAppendingPathComponent: @"TestBundle.bundle"]); bundle = RETAIN([NSBundle bundleWithPath: path]); pass([bundle isKindOfClass:[NSBundle class]], "+bundleWithPath returns a bundle"); pass([[bundle bundlePath] testForString],"the bundle has a path"); pass([path testEquals: [bundle bundlePath]], "bundlePath returns the correct path"); pass([[bundle resourcePath] testForString],"a bundle has a resource path"); pass([[bundle infoDictionary] isKindOfClass:[NSDictionary class]], "a bundle has an infoDictionary"); pass([bundle load],"bundle -load returns YES"); aClass = NSClassFromString(@"TestBundle"); pass(aClass != Nil,"-load actually loaded the class"); anObj = [aClass new]; pass(anObj != nil, "we can instantiate a loaded class"); pass([bundle principalClass] != nil, "-principalClass is not nil"); pass([[[bundle principalClass] description] testEquals:@"TestBundle"], "-principalClass works"); pass([[bundle principalClass] new] != nil, "we can instantiate -principalClass"); pass([[bundle classNamed:@"TestBundle"] testEquals:[bundle principalClass]], "-classNamed works"); pass([bundle testEquals: [NSBundle bundleForClass: NSClassFromString(@"TestBundle")]], "+bundleForClass works"); [bundle setBundleVersion:42]; pass([bundle bundleVersion] == 42, "we can set and get a bundle version"); pass([[NSBundle allBundles] containsObject:bundle], "+allBundles contains a bundle after we loaded it"); RELEASE(bundle); RELEASE(path); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSBundle/resources.m000066400000000000000000000073561435650067400221030ustar00rootroot00000000000000#import "Testing.h" #import "generic.h" #import #import #import #import #import int main() { START_SET("NSBundle resources") NSBundle *bundle; NSArray *arr; bundle = [NSBundle bundleWithPath: [[NSFileManager defaultManager] currentDirectoryPath]]; PASS([bundle isKindOfClass: [NSBundle class]], "+bundleWithPath returns anNSBundle"); arr = [bundle pathsForResourcesOfType: @"m" inDirectory: nil]; PASS([arr isKindOfClass: [NSArray class]] && [arr count], "-pathsForResourcesOfType: inDirectory: returns an array"); PASS([bundle pathForResource: @"hiwelf0-2" ofType: nil inDirectory: nil] == nil, "-pathForResource:ofType:inDirectory: works with nil args"); PASS([bundle pathForResource: @"hiwelf0-2" ofType: nil] == nil, "-pathForResource:ofType: works with nil type"); PASS([bundle pathForResource: nil ofType: @"tiff"] == nil, "-pathForResource:ofType: works with nil name"); PASS([bundle pathForResource: @"hiwelf0-2" ofType: @""] == nil, "-pathForResource:ofType: works with empty type"); PASS([bundle pathForResource: @"" ofType: @"tiff"] == nil, "-pathForResource:ofType: works with empty name"); PASS([[bundle resourcePath] testEquals: [[bundle bundlePath] stringByAppendingPathComponent: @"Resources"]], "-resourcePath returns the correct path"); END_SET("NSBundle resources") #if defined(GNUSTEP) START_SET("NSBundle GNUstep resources") NSBundle *gnustepBundle; NSArray *arr; gnustepBundle = [NSBundle bundleForLibrary: @"gnustep-base"]; if (nil == gnustepBundle) SKIP("it looks like GNUstep-base is not yet installed") PASS([[NSBundle pathForResource: @"abbreviations" ofType: @"plist" inDirectory: [[gnustepBundle bundlePath] stringByAppendingPathComponent: @"NSTimeZones"]] testForString], "+pathForResource:ofType:inDirectory: works"); PASS([[NSBundle pathForResource: @"abbreviations" ofType: @"plist" inDirectory: [[gnustepBundle bundlePath] stringByAppendingPathComponent: @"NSTimeZones"] withVersion: 0] testForString], "+pathForResource:ofType:inDirectory:withVersion: works"); arr = [gnustepBundle pathsForResourcesOfType: @"m" inDirectory: @"NSTimeZones"]; PASS(([arr isKindOfClass: [NSArray class]] && [arr count] > 0), "-pathsForResourcesOfType:inDirectory: returns an array"); PASS([[gnustepBundle pathForResource: @"abbreviations" ofType: @"plist" inDirectory: @"NSTimeZones"] testForString], "-pathForResource:ofType:inDirectory: finds a file"); PASS([gnustepBundle pathForResource: @"abbreviations" ofType: @"8nicola8" inDirectory: @"NSTimeZones"] == nil, "-pathForResource:ofType:inDirectory: doesn't find non-existing file"); PASS([gnustepBundle pathForResource: @"abbreviations" ofType: @"plist" inDirectory: @"NSTimeZones_dummy"] == nil, "-pathForResource:ofType:inDirectory: doesn't find files in" "a non-existing dir"); PASS([[gnustepBundle pathForResource: @"abbreviations" ofType: nil inDirectory: @"NSTimeZones"] testForString], "-pathForResource:ofType:inDirectory: with nil type finds a file"); PASS([gnustepBundle pathForResource: @"whasssdlkf" ofType: nil inDirectory: @"NSTimeZones"] == nil, "-pathForResource:ofType:inDirectory: with nil type doesn't find" "non-existing files"); PASS([[gnustepBundle pathForResource: @"NSTimeZones" ofType: nil] testForString], "-pathForResource:ofType: finds a file"); END_SET("NSBundle GNUstep resources") #endif return 0; } gnustep-base-1.29.0/Tests/base/NSBundle/resources2.m000066400000000000000000000107301435650067400221530ustar00rootroot00000000000000#import "Testing.h" #import #import #import #import #import #import @interface NSObject (TestMock) - (NSString*)test; @end @interface TestFramework: NSObject @end static void _testBundle(NSBundle* bundle, NSString* path, NSString* className) { NSArray *arr, *carr; NSString *localPath; PASS((bundle != nil), "bundle was found"); PASS((path != nil), "path of bundle was found"); arr = [bundle pathsForResourcesOfType: @"txt" inDirectory: nil]; PASS((arr && [arr count]), "-pathsForResourcesOfType:inDirectory: returns an array"); localPath = [path stringByAppendingPathComponent: @"Resources/NonLocalRes.txt"]; PASS([arr containsObject: localPath], "Returned array contains non-localized resource"); localPath = [path stringByAppendingPathComponent: @"Resources/English.lproj/TextRes.txt"]; PASS([arr containsObject: localPath], "Returned array contains localized resource"); /* --- [NSBundle +pathsForResourcesOfType:inDirectory:] --- */ carr = [NSBundle pathsForResourcesOfType: @"txt" inDirectory: path]; PASS([arr isEqual: carr], "+pathsForResourcesOfType:inDirectory: returns same array"); /* --- [NSBundle -pathsForResourcesOfType:inDirectory:forLocalization:] --- */ arr = [bundle pathsForResourcesOfType: @"txt" inDirectory: nil forLocalization: @"English"]; PASS((arr && [arr count]), "-pathsForResourcesOfType:inDirectory:forLocalization returns an array"); localPath = [path stringByAppendingPathComponent: @"Resources/NonLocalRes.txt"]; PASS([arr containsObject: localPath], "Returned array contains non-localized resource"); localPath = [path stringByAppendingPathComponent: @"Resources/English.lproj/TextRes.txt"]; PASS([arr containsObject: localPath], "Returned array contains localized resource"); /* --- [NSBundle -pathsForResourcesOfType:inDirectory:forLocalization:] --- */ arr = [bundle pathsForResourcesOfType: @"txt" inDirectory: nil forLocalization: @"en"]; PASS((arr && [arr count]), "-pathsForResources... returns an array for 'en'"); localPath = [path stringByAppendingPathComponent: @"Resources/NonLocalRes.txt"]; PASS([arr containsObject: localPath], "Returned array for 'en' contains non-localized resource"); localPath = [path stringByAppendingPathComponent: @"Resources/English.lproj/TextRes.txt"]; PASS([arr containsObject: localPath], "Returned array for 'en' contains localized resource"); /* --- [NSBundle -pathsForResourcesOfType:inDirectory:forLocalization:] --- */ arr = [bundle pathsForResourcesOfType: @"txt" inDirectory: nil forLocalization: @"German"]; PASS((arr && [arr count]), "-pathsForResources... returns an array for 'German'"); localPath = [path stringByAppendingPathComponent: @"Resources/NonLocalRes.txt"]; PASS([arr containsObject: localPath], "Returned array for 'German' contains non-localized resource"); localPath = [path stringByAppendingPathComponent: @"Resources/de.lproj/TextRes.txt"]; PASS([arr containsObject: localPath], "Returned array for 'German' contains localized resource"); Class clz = [bundle classNamed: className]; PASS(clz != nil, "Class can be loaded from bundle"); id obj = [clz new]; PASS(obj != nil, "Objects from bundle-loaded classes can be instantiated"); PASS_EQUAL([obj test], @"Something", "Correct method called"); [obj release]; } int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSString *path; NSBundle *bundle; START_SET("Bundle") path = [[[[[NSFileManager defaultManager] currentDirectoryPath] stringByStandardizingPath] stringByAppendingPathComponent: @"Resources"] stringByAppendingPathComponent: @"TestBundle.bundle"]; bundle = [NSBundle bundleWithPath: path]; _testBundle(bundle, path, @"TestBundle"); END_SET("Bundle") START_SET("Framework") #if defined(_WIN32) SKIP("Adding a run-time search path is not supported on Windows.") #else /* This method call is required to ensure that the linker does not decide to * elide the framework linkage. */ [TestFramework class]; bundle = [NSBundle bundleForClass: NSClassFromString(@"TestFramework")]; path = [bundle bundlePath]; _testBundle(bundle, path, @"TestFramework"); PASS(0 == [bundle bundleVersion], "bundleVersion is zero"); #endif END_SET("Framework"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSCache/000077500000000000000000000000001435650067400174725ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSCache/TestInfo000066400000000000000000000000001435650067400211360ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSCache/basic.m000066400000000000000000000006371435650067400207370ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSCache *testObj; testObj = [[NSCache new] autorelease]; [testObj setObject: @"hello" forKey: @"there"]; test_alloc(@"NSCache"); test_NSObject(@"NSCache", [NSArray arrayWithObject: testObj]); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSCache/cache.m000066400000000000000000000076601435650067400207240ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import @interface TestObject : NSObject { BOOL _discarded; } @end @implementation TestObject - (BOOL)beginContentAccess { return YES; } - (void)endContentAccess { } - (void)discardContentIfPossible { _discarded = YES; } - (BOOL)isContentDiscarded { return _discarded; } @end int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSCache *cache = [[NSCache new] autorelease]; [cache setName: @"Foo"]; PASS_EQUAL(@"Foo", [cache name], "Name can be set an accessed"); [cache setCountLimit: 2]; PASS(2 == [cache countLimit], "Count limit can be set and accessed"); [cache setTotalCostLimit: 3]; PASS(3 == [cache totalCostLimit], "Total cost limit can be set and accessed"); [cache setObject: @"bar" forKey: @"foo"]; PASS_EQUAL(@"bar", [cache objectForKey: @"foo"], "Cached object can be returned"); /* * NOTE: The following to test sets currently won't work. The only available * eviction strategy is to evict under the following conditions: * * - evictsObjectsWithDiscardedContent is set on the receiver * - the cached object implements NSDiscardableContent * - the content is actually discarded */ START_SET("count-based eviction") testHopeful = YES; /* Let's test count based eviction: We add two more items and expect the * first one (foo) to be removed because the count limit is two */ [cache setObject: @"baz" forKey: @"bar"]; NSUInteger i = 0; for (i = 0; i < 50; i++) { /* We need to heat this object in the cache so that the first one * becomes elligible for eviction */ [cache objectForKey: @"bar"]; } [cache setObject: @"frubble" forKey: @"baz"]; PASS_EQUAL(@"frubble", [cache objectForKey: @"baz"], "LRU object retained on count overflow"); PASS_EQUAL(@"baz", [cache objectForKey: @"bar"], "second object retained on count overflow"); PASS(nil == [cache objectForKey: @"foo"], "Oldest object evicted"); END_SET("count-based eviction") [cache removeAllObjects]; START_SET("cost-based eviction") testHopeful = YES; [cache setObject: @"bar" forKey: @"foo" cost: 2]; // This should push out the previous object because the cumulative cost (4) // exceeds the limit (3) [cache setObject: @"baz" forKey: @"bar" cost: 2]; PASS_EQUAL(@"baz", [cache objectForKey: @"bar"], "LRU object retained on cost overflow"); PASS(nil == [cache objectForKey: @"foo"], "Overflowing object evicted"); END_SET("cost-based eviction") [cache removeAllObjects]; START_SET("eviction of discardable content") cache = [[NSCache new] autorelease]; [cache setCountLimit: 1]; [cache setEvictsObjectsWithDiscardedContent: YES]; TestObject *a = [[TestObject new] autorelease]; TestObject *b = [[TestObject new] autorelease]; [cache setObject: a forKey: @"foo"]; [cache setObject: b forKey: @"bar"]; PASS_EQUAL(b, [cache objectForKey: @"bar"], "LRU object retained on count overflow"); PASS(nil == [cache objectForKey: @"foo"], "Overflowing object evicted on count overflow"); PASS([a isContentDiscarded], "Cache did call -discardContentIfPossible on cached object"); [cache removeAllObjects]; [cache setCountLimit: 0]; [cache setTotalCostLimit: 3]; a = [[TestObject new] autorelease]; b = [[TestObject new] autorelease]; [cache setObject: a forKey: @"foo" cost: 2]; [cache setObject: b forKey: @"bar" cost: 2]; PASS_EQUAL(b, [cache objectForKey: @"bar"], "LRU object retained on cost overflow"); PASS(nil == [cache objectForKey: @"foo"], "Overflowing object evicted on cost overflow"); PASS([a isContentDiscarded], "Cache did call -discardContentIfPossible on cached object"); END_SET("eviction of discardable content") [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSCalendar/000077500000000000000000000000001435650067400202005ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSCalendar/TestInfo000066400000000000000000000000001435650067400216440ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSCalendar/basic.m000066400000000000000000000034451435650067400214450ustar00rootroot00000000000000#import "Testing.h" #import "ObjectTesting.h" #import #if defined(GS_USE_ICU) #define NSCALENDAR_SUPPORTED GS_USE_ICU #else #define NSCALENDAR_SUPPORTED 1 /* Assume Apple support */ #endif int main() { START_SET("NSCalendar basic") if (!NSCALENDAR_SUPPORTED) SKIP("NSCalendar not supported\nThe ICU library was not available when GNUstep-base was built") id testObj = [NSCalendar currentCalendar]; test_NSObject(@"NSCalendar", [NSArray arrayWithObject: testObj]); #if __APPLE__ test_keyed_NSCoding([NSArray arrayWithObject: testObj]); #else test_NSCoding([NSArray arrayWithObject: testObj]); #endif test_NSCopying(@"NSCalendar", @"NSCalendar", [NSArray arrayWithObject: testObj], NO, NO); /* Test first weekday */ [testObj setFirstWeekday: 3]; PASS([testObj firstWeekday] == 3, "-firstWeekday returns the correct day"); [testObj setFirstWeekday: 1]; PASS([testObj firstWeekday] == 1, "-setFirstWeekday: works"); [testObj setFirstWeekday: 0]; PASS([testObj firstWeekday] == 0, "-setFirstWeekday: can set zero"); [testObj setFirstWeekday: 10]; PASS([testObj firstWeekday] == 10, "-setFirstWeekday: can set ten"); /* Test minimum days in first week */ [testObj setMinimumDaysInFirstWeek: 1]; PASS([testObj minimumDaysInFirstWeek] == 1, "-minimumDaysInFirstWeek returns the correct count"); [testObj setMinimumDaysInFirstWeek: 4]; PASS([testObj minimumDaysInFirstWeek] == 4, "-setMinimumDaysInFirstWeek: works"); [testObj setMinimumDaysInFirstWeek: 0]; PASS([testObj minimumDaysInFirstWeek] == 0, "-setMinimumDaysInFirstWeek: can set zero"); [testObj setMinimumDaysInFirstWeek: 10]; PASS([testObj minimumDaysInFirstWeek] == 10, "-setMinimumDaysInFirstWeek: can set ten"); END_SET("NSCalendar basic") return 0; } gnustep-base-1.29.0/Tests/base/NSCalendar/component-diff.m000066400000000000000000000037241435650067400232740ustar00rootroot00000000000000#import "Testing.h" #import "ObjectTesting.h" #import #import #import #import #include #if defined(GS_USE_ICU) #define NSCALENDAR_SUPPORTED GS_USE_ICU #else #define NSCALENDAR_SUPPORTED 1 /* Assume Apple support */ #endif int main() { NSDateComponents *comps; NSCalendar *cal; NSDate *date; NSDate *date2; START_SET("NSCalendar date component differences") if (!NSCALENDAR_SUPPORTED) SKIP("NSCalendar not supported\nThe ICU library was not available when GNUstep-base was built") cal = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar]; [cal setFirstWeekday: 1]; date = [NSDate dateWithString: @"2015-01-01 01:01:01 +0100"]; date2 = [NSDate dateWithString: @"2015-02-03 04:05:06 +0100"]; comps = [cal components: NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit fromDate: date toDate: date2 options: 0]; if (nil == comps) { SKIP("-components:fromDate:toDate:options: not implementaed. The ICU library was not available (or too old) when GNUstep-base was built") } PASS([comps year] == 0, "year difference correct"); PASS([comps month] == 1, "month difference correct"); PASS([comps day] == 2, "day difference correct"); PASS([comps hour] == 3, "hour difference correct"); PASS([comps minute] == 4, "minute difference correct"); PASS([comps second] == 5, "second difference correct"); comps = [cal components: NSDayCalendarUnit fromDate: date toDate: date2 options: 0]; PASS([comps month] == NSNotFound, "no month returned if not requested"); PASS([comps day] == 33, "day difference without larger unit correct"); RELEASE(cal); END_SET("NSCalendar date component differences") return 0; } gnustep-base-1.29.0/Tests/base/NSCalendar/create.m000066400000000000000000000016701435650067400216250ustar00rootroot00000000000000#import #import #import #import "ObjectTesting.h" #if defined(GS_USE_ICU) #define NSCALENDAR_SUPPORTED GS_USE_ICU #else #define NSCALENDAR_SUPPORTED 1 /* Assume Apple support */ #endif int main(void) { START_SET("NSCalendar create") NSCalendar *cal; if (!NSCALENDAR_SUPPORTED) SKIP("NSCalendar not supported\nThe ICU library was not available when GNUstep-base was built") cal = [NSCalendar currentCalendar]; PASS (cal != nil, "+currentCalendar returns non-nil"); TEST_FOR_CLASS(@"NSCalendar", cal, "+currentCalendar return a NSCalendar"); cal = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar]; PASS (cal != nil, "-initWithCalendarIdentifier: return non-nil"); TEST_FOR_CLASS(@"NSCalendar", cal, "-initWithCalendarIdentifier: return a NSCalendar"); RELEASE(cal); END_SET("NSCalendar create") return 0; } gnustep-base-1.29.0/Tests/base/NSCalendar/era.m000066400000000000000000000040241435650067400211250ustar00rootroot00000000000000#import "Testing.h" #import "ObjectTesting.h" #import #import #import #import #import #include #if defined(GS_USE_ICU) #define NSCALENDAR_SUPPORTED GS_USE_ICU #else #define NSCALENDAR_SUPPORTED 1 /* Assume Apple support */ #endif int main() { NSCalendar *cal; NSDate *date; NSDateFormatter *dateFormatter; NSInteger era = 0; NSInteger year = 0; NSInteger month = 0; NSInteger day = 0; NSInteger hour = 0; NSInteger min = 0; NSInteger sec = 0; NSInteger nano = 0; START_SET("NSCalendar getEra:year:month:day:fromDate and getHour:minute:second:nanosecond:fromDate tests"); /* Test getEra:year:month:day:fromDate: */ dateFormatter = [[NSDateFormatter alloc] init]; cal = [NSCalendar currentCalendar]; [cal setTimeZone:[NSTimeZone timeZoneWithName: @"America/New_York"]]; [dateFormatter setDateFormat: @"d MMM yyyy HH:mm:ss Z"]; date = [dateFormatter dateFromString:@"22 Nov 1969 08:15:00 Z"]; [cal getEra:&era year:&year month:&month day:&day fromDate:date]; PASS(era == 1, "getEra:year:month:day:fromDate: returns correct era"); PASS(year == 1969, "getEra:year:month:day:fromDate: returns correct year"); PASS(month == 11, "getEra:year:month:day:fromDate: returns correct month"); PASS(day == 22, "getEra:year:month:day:fromDate: returns correct day"); /* Test getHour:minute:second:nanosecond:fromDate: */ [cal getHour:&hour minute:&min second:&sec nanosecond:&nano fromDate:date]; PASS(hour == 3, "getHour:minute:second:nanosecond:fromDate: returns correct hour"); PASS(min == 15, "getHour:minute:second:nanosecond:fromDate: returns correct minute"); PASS(sec == 0, "getHour:minute:second:nanosecond:fromDate: returns correct second"); PASS(nano == 0, "getHour:minute:second:nanosecond:fromDate: returns correct nanosecond"); END_SET("NSCalendar getEra:year:month:day:fromDate and getHour:minute:second:nanosecond:fromDate tests"); return 0; } gnustep-base-1.29.0/Tests/base/NSCalendar/features-10-7.m000066400000000000000000000036471435650067400225700ustar00rootroot00000000000000#import "Testing.h" #import "ObjectTesting.h" #import #import #import #include #if defined(GS_USE_ICU) #define NSCALENDAR_SUPPORTED GS_USE_ICU #else #define NSCALENDAR_SUPPORTED 1 /* Assume Apple support */ #endif int main() { NSDateComponents *comps; NSCalendar *cal; NSDate *date; NSDate *date2; NSDate *date3; NSDate *date4; START_SET("NSCalendar 10.7 features") if (!NSCALENDAR_SUPPORTED) SKIP("NSCalendar not supported\nThe ICU library was not available when GNUstep-base was built") cal = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar]; [cal setFirstWeekday: 1]; [cal setMinimumDaysInFirstWeek: 4]; date = [NSDate dateWithString: @"2012-12-31 13:57:00 +0100"]; comps = [cal components: NSYearForWeekOfYearCalendarUnit | NSWeekOfYearCalendarUnit | NSWeekOfMonthCalendarUnit fromDate: date]; PASS([comps weekOfMonth] == 5, "-weekOfMonth returns the correct week"); PASS([comps weekOfYear] == 1, "-weekOfYear returns the correct week"); PASS([comps yearForWeekOfYear] == 2013, "-yearForWeekOfYear returns the correct year"); comps = [[NSDateComponents alloc] init]; [comps setCalendar: cal]; [comps setTimeZone: [NSTimeZone timeZoneForSecondsFromGMT: 3600]]; [comps setHour: 13]; [comps setMinute: 57]; [comps setDay: 31]; [comps setMonth: 12]; [comps setYear: 2012]; date2 = [comps date]; PASS_EQUAL(date, date2, "-[NSDateComponents date] returns the correct date"); date3 = [NSDate dateWithString: @"2012-12-31 13:57:00 +0200"]; [comps setTimeZone: [NSTimeZone timeZoneForSecondsFromGMT: 7200]]; date4 = [cal dateFromComponents: comps]; PASS_EQUAL(date3, date4, "-[NSCalendar dateFromComponents:] respects the time zone"); RELEASE(comps); RELEASE(cal); END_SET("NSCalendar 10.7 features") return 0; } gnustep-base-1.29.0/Tests/base/NSCalendarDate/000077500000000000000000000000001435650067400207765ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSCalendarDate/TestInfo000066400000000000000000000000001435650067400224420ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSCalendarDate/basic.m000066400000000000000000000007731435650067400222440ustar00rootroot00000000000000#import "Testing.h" #import "ObjectTesting.h" #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; id testObj = [NSCalendarDate new]; test_NSObject(@"NSCalendarDate", [NSArray arrayWithObject: testObj]); test_NSCoding([NSArray arrayWithObject: testObj]); test_NSCopying(@"NSCalendarDate", @"NSCalendarDate", [NSArray arrayWithObject: testObj], NO, NO); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSCalendarDate/test00.m000066400000000000000000000445701435650067400223050ustar00rootroot00000000000000#import "Testing.h" #import #import #import #import #import #import #include "./western.h" @interface NSCalendarDate(TestAdditions) -(BOOL) testDateValues: (int)y : (int)m : (int)d : (int)h : (int)i : (int)s; @end @implementation NSCalendarDate(TestAdditions) -(BOOL) testDateValues: (int)y : (int)m : (int)d : (int)h : (int)i : (int)s { return (y == [self yearOfCommonEra] && m == [self monthOfYear] && d == [self dayOfMonth] && h == [self hourOfDay] && i == [self minuteOfHour] && s == [self secondOfMinute]); } @end int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSString *val1, *val2; NSCalendarDate *date1, *date2; NSDictionary *locale; NSTimeZone *tz; val1 = @"1999-12-31 23:59:59"; val2 = @"%Y-%m-%d %H:%M:%S"; /* Y2K checks */ date1 = [NSCalendarDate calendarDate]; PASS(date1 != nil && [date1 isKindOfClass: [NSCalendarDate class]], "+calendarDate works"); date1 = [NSCalendarDate dateWithString: val1 calendarFormat: val2]; PASS(date1 != nil, "+dateWithString:calendarFormat: works"); locale = westernLocale(); date1 = [NSCalendarDate dateWithString: @"Fri Oct 27 08:41:14GMT 2000" calendarFormat: nil locale: locale]; PASS(date1 != nil, "+dateWithString:calendarFormat:locale: with nil format works"); date1 = [NSCalendarDate dateWithString: @"1999-12-31 23:59:" calendarFormat: val2 locale: locale]; PASS(date1 == nil, "+dateWithString:calendarFormat:locale: objects to missing seconds"); date1 = [NSCalendarDate dateWithString: @"1999-12-31 23::00" calendarFormat: val2 locale: locale]; PASS(date1 == nil, "+dateWithString:calendarFormat:locale: objects to missing minutes"); date1 = [NSCalendarDate dateWithString: @"1999-12-31 :00:00" calendarFormat: val2 locale: locale]; PASS(date1 == nil, "+dateWithString:calendarFormat:locale: objects to missing hours"); date1 = [NSCalendarDate dateWithString: @"1999-12-00 00:00:00" calendarFormat: val2 locale: locale]; PASS(date1 == nil, "+dateWithString:calendarFormat:locale: objects to zero day"); date1 = [NSCalendarDate dateWithString: @"1999-00-01 00:00:00" calendarFormat: val2 locale: locale]; PASS(date1 == nil, "+dateWithString:calendarFormat:locale: objects to zero month"); date1 = [NSCalendarDate dateWithString: @"1999-12-31 00:00:00" calendarFormat: @"%Y-%m-%d %H:%M:%S %Z" locale: locale]; PASS(date1 == nil, "+dateWithString:calendarFormat:locale: objects to missing timezone"); date1 = [NSCalendarDate dateWithString: @"1999-12-31 00:00:00 this_is_a_ridiculously_long_timezone_name_and_is_in_fact_designed_to_exceed_the_one_hundred_and_twenty_bytes_temporary_data_buffer_size_used_within_the_gnustep_base_method_which_parses_it" calendarFormat: @"%Y-%m-%d %H:%M:%S %Z" locale: locale]; PASS(date1 == nil, "+dateWithString:calendarFormat:locale: objects to long timezone"); date1 = [NSCalendarDate dateWithString: @"1999-12-31 00:00:00 GMT+0100" calendarFormat: @"%Y-%m-%d %H:%M:%S %Z" locale: locale]; PASS(date1 != nil, "+dateWithString:calendarFormat:locale: handles GMT+0100 timezone"); date1 = [NSCalendarDate dateWithString: @"1999-12-31 00:00:00 GMT-0100" calendarFormat: @"%Y-%m-%d %H:%M:%S %Z" locale: locale]; PASS(date1 != nil, "+dateWithString:calendarFormat:locale: handles GMT-0100 timezone"); date1 = [NSCalendarDate dateWithString: @"1970-01-01 00:00:00 GMT+1000" calendarFormat: @"%Y-%m-%d %H:%M:%S %Z" locale: locale]; [date1 setTimeZone: [NSTimeZone timeZoneWithName: @"GMT"]]; PASS_EQUAL([date1 description], @"1969-12-31 14:00:00 GMT+0000", "+dateWithString:calendarFormat:locale: handles GMT+1000 timezone"); date1 = [NSCalendarDate dateWithString: @"1999-12-31 00:00:00 Africa/Addis_Ababa" calendarFormat: @"%Y-%m-%d %H:%M:%S %Z" locale: locale]; PASS(date1 != nil, "+dateWithString:calendarFormat:locale: handles Africa/Addis_Ababa"); date1 = [NSCalendarDate dateWithString: @"1999-12-31 23:59:59" calendarFormat: val2 locale: locale]; PASS([date1 testDateValues: 1999 : 12 : 31 : 23 : 59 : 59], "date check with %s", [[date1 description] UTF8String]); date2 = [date1 dateByAddingYears: 0 months: 0 days: 0 hours: 0 minutes: 0 seconds: 1]; PASS([date2 testDateValues: 2000 : 01 : 01 : 00 : 00 : 00], "date check with %s", [[date2 description] UTF8String]); date2 = [date2 dateByAddingYears: 0 months: 0 days: 0 hours: 0 minutes: 0 seconds: 1]; PASS([date2 testDateValues: 2000 : 01 : 01 : 00 : 00 : 01], "date check with %s", [[date2 description] UTF8String]); date2 = [date2 dateByAddingYears: 0 months: 0 days: 0 hours: 1 minutes: 0 seconds: 0]; PASS([date2 testDateValues: 2000 : 01 : 01 : 01 : 00 : 01], "date check with %s", [[date2 description] UTF8String]); date2 = [date2 dateByAddingYears: 0 months: 0 days: 0 hours: -2 minutes: 0 seconds: 0]; PASS([date2 testDateValues: 1999 : 12 : 31 : 23 : 00 : 01], "date check with %s", [[date2 description] UTF8String]); /* Y2K is a leap year checks */ date2 = [NSCalendarDate dateWithString: @"2000-2-28 23:59:59" calendarFormat: val2 locale: locale]; PASS([date2 testDateValues: 2000 : 02 : 28 : 23 : 59 : 59], "date check with %s", [[date2 description] UTF8String]); date2 = [date2 dateByAddingYears: 0 months: 0 days: 0 hours: 0 minutes: 0 seconds: 1]; PASS([date2 testDateValues: 2000 : 02 : 29 : 00 : 00 : 00], "date check with %s", [[date2 description] UTF8String]); date2 = [date2 dateByAddingYears: 0 months: 0 days: 0 hours: 0 minutes: 0 seconds: 1]; PASS([date2 testDateValues: 2000 : 02 : 29 : 00 : 00 : 01], "date check with %s", [[date2 description] UTF8String]); date2 = [date2 dateByAddingYears: 0 months: 0 days: 0 hours: 1 minutes: 0 seconds: 0]; PASS([date2 testDateValues: 2000 : 02 : 29 : 01 : 00 : 01], "date check with %s", [[date2 description] UTF8String]); date2 = [date2 dateByAddingYears: 0 months: 0 days: 0 hours: -2 minutes: 0 seconds: 0]; PASS([date2 testDateValues: 2000 : 02 : 28 : 23 : 00 : 01], "date check with %s", [[date2 description] UTF8String]); date2 = [date2 dateByAddingYears: 0 months: 0 days: 0 hours: 5 minutes: 0 seconds: 0]; PASS([date2 testDateValues: 2000 : 02 : 29 : 04 : 00 : 01], "date check with %s", [[date2 description] UTF8String]); date2 = [date2 dateByAddingYears: 1 months: 0 days: 0 hours: 0 minutes: 0 seconds: 0]; PASS([date2 testDateValues: 2001 : 03 : 01 : 04 : 00 : 01], "date check with %s", [[date2 description] UTF8String]); date2 = [date2 dateByAddingYears: 0 months: 0 days: -1 hours: 0 minutes: 0 seconds: 0]; PASS([date2 testDateValues: 2001 : 02 : 28 : 04 : 00 : 01], "date check with %s", [[date2 description] UTF8String]); date2 = [date2 dateByAddingYears: 1 months: 0 days: 1 hours: 0 minutes: 0 seconds: 0]; PASS([date2 testDateValues: 2002 : 03 : 01 : 04 : 00 : 01], "date check with %s", [[date2 description] UTF8String]); /* 2004 is a year leap check */ date2 = [NSCalendarDate dateWithString: @"2004-2-28 23:59:59" calendarFormat: val2 locale: locale]; PASS([date2 testDateValues: 2004 : 02 : 28 : 23 : 59 : 59], "date check with %s", [[date2 description] UTF8String]); date2 = [date2 dateByAddingYears: 0 months: 0 days: 0 hours: 0 minutes: 0 seconds: 1]; PASS([date2 testDateValues: 2004 : 02 : 29 : 00 : 00 : 00], "date check with %s", [[date2 description] UTF8String]); date2 = [date2 dateByAddingYears: 0 months: 0 days: 0 hours: 0 minutes: 0 seconds: 1]; PASS([date2 testDateValues: 2004 : 02 : 29 : 00 : 00 : 01], "date check with %s", [[date2 description] UTF8String]); date2 = [date2 dateByAddingYears: 0 months: 0 days: 0 hours: 1 minutes: 0 seconds: 0]; PASS([date2 testDateValues: 2004 : 02 : 29 : 01 : 00 : 01], "date check with %s", [[date2 description] UTF8String]); date2 = [date2 dateByAddingYears: 0 months: 0 days: 0 hours: -2 minutes: 0 seconds: 0]; PASS([date2 testDateValues: 2004 : 02 : 28 : 23 : 00 : 01], "date check with %s", [[date2 description] UTF8String]); /* 2100 is not a leap year */ date2 = [NSCalendarDate dateWithString: @"2100-2-28 23:59:59" calendarFormat: val2 locale: locale]; PASS([date2 testDateValues: 2100 : 02 : 28 : 23 : 59 : 59], "date check with %s", [[date2 description] UTF8String]); date2 = [date2 dateByAddingYears: 0 months: 0 days: 0 hours: 0 minutes: 0 seconds: 1]; PASS([date2 testDateValues: 2100 : 03 : 01 : 00 : 00 : 00], "date check with %s", [[date2 description] UTF8String]); date2 = [date2 dateByAddingYears: 0 months: 0 days: 0 hours: 0 minutes: 0 seconds: 1]; PASS([date2 testDateValues: 2100 : 03 : 01 : 00 : 00 : 01], "date check with %s", [[date2 description] UTF8String]); date2 = [date2 dateByAddingYears: 0 months: 0 days: 0 hours: 1 minutes: 0 seconds: 0]; PASS([date2 testDateValues: 2100 : 03 : 01 : 01 : 00 : 01], "date check with %s", [[date2 description] UTF8String]); date2 = [date2 dateByAddingYears: 0 months: 0 days: 0 hours: -2 minutes: 0 seconds: 0]; PASS([date2 testDateValues: 2100 : 02 : 28 : 23 : 00 : 01], "date check with %s", [[date2 description] UTF8String]); /* daylight savings time checks */ [NSTimeZone setDefaultTimeZone: [NSTimeZone timeZoneWithName: @"GB"]]; date2 = [NSCalendarDate dateWithString: @"2002-3-31 00:30:00" calendarFormat: val2 locale: locale]; PASS([date2 testDateValues: 2002 : 03 : 31 : 00 : 30 : 00], "date check with %s", [[date2 description] UTF8String]); date2 = [date2 dateByAddingYears: 0 months: 0 days: 0 hours: 1 minutes: 0 seconds: 0]; PASS([date2 testDateValues: 2002 : 03 : 31 : 02 : 30 : 00], "date check with %s", [[date2 description] UTF8String]); date2 = [date2 dateByAddingYears: 0 months: 0 days: 0 hours: -1 minutes: 0 seconds: 0]; PASS([date2 testDateValues: 2002 : 03 : 31 : 00 : 30 : 00], "date check with %s", [[date2 description] UTF8String]); date2 = [date2 dateByAddingYears: 0 months: 0 days: 0 hours: 2 minutes: 0 seconds: 0]; PASS([date2 testDateValues: 2002 : 03 : 31 : 02 : 30 : 00], "date check with %s", [[date2 description] UTF8String]); date2 = [date2 dateByAddingYears: 0 months: 0 days: 0 hours: -1 minutes: 0 seconds: 0]; PASS([date2 testDateValues: 2002 : 03 : 31 : 00 : 30 : 00], "date check with %s", [[date2 description] UTF8String]); date2 = [date2 dateByAddingYears: 0 months: 0 days: 0 hours: -1 minutes: 0 seconds: 0]; PASS([date2 testDateValues: 2002 : 03 : 30 : 23 : 30 : 00], "date check with %s", [[date2 description] UTF8String]); /* End daylight savings checks */ /* Seconds calculation checks */ date2 = [NSCalendarDate dateWithString: @"2002-10-27 00:30:00" calendarFormat: val2 locale: locale]; PASS([date2 testDateValues: 2002 : 10 : 27 : 00 : 30 : 00], "date second calculation check with %s", [[date2 description] UTF8String]); date2 = [date2 dateByAddingYears: 0 months: 0 days: 0 hours: 0 minutes: 0 seconds: -1]; PASS([date2 testDateValues: 2002 : 10 : 27 : 00 : 29 : 59], "date second calculation check with %s", [[date2 description] UTF8String]); date2 = [date2 dateByAddingYears: 0 months: 0 days: 0 hours: 0 minutes: 0 seconds: 1]; PASS([date2 testDateValues: 2002 : 10 : 27 : 00 : 30 : 00], "date second calculation check with %s", [[date2 description] UTF8String]); date2 = [date2 dateByAddingYears: 0 months: 0 days: 0 hours: 0 minutes: 0 seconds: 2]; PASS([date2 testDateValues: 2002 : 10 : 27 : 00 : 30 : 02], "date second calculation check with %s", [[date2 description] UTF8String]); /* Minutes calculation checks */ date2 = [NSCalendarDate dateWithString: @"2002-10-27 00:30:00" calendarFormat: val2 locale: locale]; PASS([date2 testDateValues: 2002 : 10 : 27 : 00 : 30 : 00], "date minute calculation check with %s", [[date2 description] UTF8String]); date2 = [date2 dateByAddingYears: 0 months: 0 days: 0 hours: 0 minutes: -1 seconds: 0]; PASS([date2 testDateValues: 2002 : 10 : 27 : 00 : 29 : 00], "date minute calculation check with %s", [[date2 description] UTF8String]); date2 = [date2 dateByAddingYears: 0 months: 0 days: 0 hours: 0 minutes: 1 seconds: 0]; PASS([date2 testDateValues: 2002 : 10 : 27 : 00 : 30 : 00], "date minute calculation check with %s", [[date2 description] UTF8String]); date2 = [date2 dateByAddingYears: 0 months: 0 days: 0 hours: 0 minutes: 1 seconds: 0]; PASS([date2 testDateValues: 2002 : 10 : 27 : 00 : 31 : 00], "date minute calculation check with %s", [[date2 description] UTF8String]); /* Hour calculation checks */ date2 = [NSCalendarDate dateWithString: @"2002-10-27 00:30:00" calendarFormat: val2 locale: locale]; PASS([date2 testDateValues: 2002 : 10 : 27 : 00 : 30 : 00], "date hour calculation check with %s", [[date2 description] UTF8String]); date2 = [date2 dateByAddingYears: 0 months: 0 days: 0 hours: -1 minutes: 0 seconds: 0]; PASS([date2 testDateValues: 2002 : 10 : 26 : 23 : 30 : 00], "date hour calculation check with %s", [[date2 description] UTF8String]); date2 = [date2 dateByAddingYears: 0 months: 0 days: 0 hours: 1 minutes: 0 seconds: 0]; PASS([date2 testDateValues: 2002 : 10 : 27 : 00 : 30 : 00], "date hour calculation check with %s", [[date2 description] UTF8String]); date2 = [date2 dateByAddingYears: 0 months: 0 days: 0 hours: 2 minutes: 0 seconds: 0]; PASS([date2 testDateValues: 2002 : 10 : 27 : 02 : 30 : 00], "date hour calculation check with %s", [[date2 description] UTF8String]); /* Days calculation checks */ date2 = [NSCalendarDate dateWithString: @"2002-10-27 00:30:00" calendarFormat: val2 locale: locale]; PASS([date2 testDateValues: 2002 : 10 : 27 : 00 : 30 : 00], "date day calculation check with %s", [[date2 description] UTF8String]); date2 = [date2 dateByAddingYears: 0 months: 0 days: -1 hours: 0 minutes: 0 seconds: 0]; PASS([date2 testDateValues: 2002 : 10 : 26 : 00 : 30 : 00], "date day calculation check with %s", [[date2 description] UTF8String]); date2 = [date2 dateByAddingYears: 0 months: 0 days: 1 hours: 0 minutes: 0 seconds: 0]; PASS([date2 testDateValues: 2002 : 10 : 27 : 00 : 30 : 00], "date day calculation check with %s", [[date2 description] UTF8String]); date2 = [date2 dateByAddingYears: 0 months: 0 days: 2 hours: 0 minutes: 0 seconds: 0]; PASS([date2 testDateValues: 2002 : 10 : 29 : 00 : 30 : 00], "date day calculation check with %s", [[date2 description] UTF8String]); date2 = [NSCalendarDate dateWithString: @"2002-10-27 00:00:00" calendarFormat: val2 locale: locale]; PASS([date2 testDateValues: 2002 : 10 : 27 : 00 : 00 : 00], "date day calculation check with %s", [[date2 description] UTF8String]); date2 = [NSCalendarDate dateWithString: @"2002-10-26 24:00:00" calendarFormat: val2 locale: locale]; PASS([date2 testDateValues: 2002 : 10 : 27 : 00 : 00 : 00], "date day calculation check with 2002-10-26 24:00:00"); /* Months calculation checks */ date2 = [NSCalendarDate dateWithString: @"2002-10-27 00:30:00" calendarFormat: val2 locale: locale]; PASS([date2 testDateValues: 2002 : 10 : 27 : 00 : 30 : 00], "date month calculation check with %s", [[date2 description] UTF8String]); date2 = [date2 dateByAddingYears: 0 months: -1 days: 0 hours: 0 minutes: 0 seconds: 0]; PASS([date2 testDateValues: 2002 : 9 : 27 : 00 : 30 : 00], "date month calculation check with %s", [[date2 description] UTF8String]); date2 = [date2 dateByAddingYears: 0 months: 1 days: 0 hours: 0 minutes: 0 seconds: 0]; PASS([date2 testDateValues: 2002 : 10 : 27 : 00 : 30 : 00], "date month calculation check with %s", [[date2 description] UTF8String]); date2 = [date2 dateByAddingYears: 0 months: 2 days: 0 hours: 0 minutes: 0 seconds: 0]; PASS([date2 testDateValues: 2002 : 12 : 27 : 00 : 30 : 00], "date month calculation check with %s", [[date2 description] UTF8String]); /* Years calculation checks */ date2 = [NSCalendarDate dateWithString: @"2002-10-27 00:30:00" calendarFormat: val2 locale: locale]; PASS([date2 testDateValues: 2002 : 10 : 27 : 00 : 30 : 00], "date year calculation check with %s", [[date2 description] UTF8String]); date2 = [date2 dateByAddingYears: -1 months: 0 days: 0 hours: 0 minutes: 0 seconds: 0]; PASS([date2 testDateValues: 2001 : 10 : 27 : 00 : 30 : 00], "date year calculation check with %s", [[date2 description] UTF8String]); date2 = [date2 dateByAddingYears: 1 months: 0 days: 0 hours: 0 minutes: 0 seconds: 0]; PASS([date2 testDateValues: 2002 : 10 : 27 : 00 : 30 : 00], "date year calculation check with %s", [[date2 description] UTF8String]); date2 = [date2 dateByAddingYears: 2 months: 0 days: 0 hours: 0 minutes: 0 seconds: 0]; PASS([date2 testDateValues: 2004 : 10 : 27 : 00 : 30 : 00], "date year calculation check with %s", [[date2 description] UTF8String]); [NSTimeZone setDefaultTimeZone: [NSTimeZone timeZoneWithName: @"GMT"]]; tz = [NSTimeZone timeZoneWithName: @"GB"]; date2 = [NSCalendarDate dateWithYear: 2006 month: 10 day: 1 hour: 0 minute: 0 second: 0 timeZone: tz]; date2 = [date2 dateByAddingYears: 0 months: 1 days: 0 hours: 2 minutes: 10 seconds: 0]; PASS([date2 testDateValues: 2006 : 11 : 1 : 2 : 10 : 00], "date year calculation check with %s", [[date2 description] UTF8String]); PASS([[date2 timeZone] isEqual: tz], "date year calculation preserves timezone"); tz = [NSTimeZone timeZoneForSecondsFromGMT: 3600]; date2 = [NSCalendarDate dateWithYear: 2016 month: 1 day: 6 hour: 1 minute: 0 second: 0 timeZone: tz]; date2 = [date2 dateByAddingYears: 0 months: 0 days: 0 hours: 0 minutes: 0 seconds: -3600]; PASS([date2 testDateValues: 2016 : 1 : 6 : 00 : 00 : 00], "date year calculation check with %s", [[date2 description] UTF8String]); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSCalendarDate/test01.m000066400000000000000000000076571435650067400223130ustar00rootroot00000000000000#import "Testing.h" #import #import #import #import #include "./western.h" int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSTimeInterval time1, time2, time3, time4, time5, time6, time7, time8, time9; NSCalendarDate *date1; NSDictionary *locale; locale = westernLocale(); time1 = [[NSCalendarDate dateWithString: @"Nov 20 02 01:54:22" calendarFormat: @"%b %d %y %H:%M:%S" locale: locale] timeIntervalSinceReferenceDate]; time2 = [[NSCalendarDate dateWithString: @"Nov 20 02 02:54:22" calendarFormat: @"%b %d %y %H:%M:%S" locale: locale] timeIntervalSinceReferenceDate]; time3 = [[NSCalendarDate dateWithString: @"Nov 20 02 03:54:22" calendarFormat: @"%b %d %y %H:%M:%S" locale: locale] timeIntervalSinceReferenceDate]; time4 = [[NSCalendarDate dateWithString: @"Nov 20 02 04:54:22" calendarFormat: @"%b %d %y %H:%M:%S" locale: locale] timeIntervalSinceReferenceDate]; time5 = [[NSCalendarDate dateWithString: @"Nov 20 02 05:54:22" calendarFormat: @"%b %d %y %H:%M:%S" locale: locale] timeIntervalSinceReferenceDate]; time6 = [[NSCalendarDate dateWithString: @"Nov 20 02 06:54:22" calendarFormat: @"%b %d %y %H:%M:%S" locale: locale] timeIntervalSinceReferenceDate]; time7 = [[NSCalendarDate dateWithString: @"Nov 20 02 07:54:22" calendarFormat: @"%b %d %y %H:%M:%S" locale: locale] timeIntervalSinceReferenceDate]; time8 = [[NSCalendarDate dateWithString: @"Nov 20 02 08:54:22" calendarFormat: @"%b %d %y %H:%M:%S" locale: locale] timeIntervalSinceReferenceDate]; time9 = [[NSCalendarDate dateWithString: @"Nov 20 02 09:54:22" calendarFormat: @"%b %d %y %H:%M:%S" locale: locale] timeIntervalSinceReferenceDate]; PASS ((time1 < time2 && time2 < time3 && time3 < time4 && time4 < time5 && time5 < time6 && time6 < time7 && time7 < time8 && time8 < time9), "+dateWithString:calendarFormat: works if no time zone is specified"); date1 = [NSCalendarDate dateWithString: @"Nov 29 06 12:00am" calendarFormat: @"%b %d %y %H:%M%p" locale: locale]; PASS(date1 != nil && [date1 hourOfDay] == 0, "12:00am is midnight"); date1 = [NSCalendarDate dateWithString: @"Nov 29 06 12:00pm" calendarFormat: @"%b %d %y %H:%M%p" locale: locale]; PASS(date1 != nil && [date1 hourOfDay] == 12, "12:00pm is noon"); date1 = [NSCalendarDate dateWithString: @"Nov 29 06 01:25:38" calendarFormat: @"%b %d %y %H:%M:%S" locale: locale]; PASS([date1 timeIntervalSinceReferenceDate] + 1 == [[date1 addTimeInterval:1] timeIntervalSinceReferenceDate], "-addTimeInterval: works on a NSCalendarDate parsed with no timezone"); { NSString *fmt = @"%Y-%m-%d %H:%M:%S:%F"; NSString *fmt2 = @"%Y-%m-%e %H:%M:%S:%F"; NSString *dateString = @"2006-04-22 22:22:22:901"; NSString *dateString2 = @"2006-04-2 22:22:22:901"; NSCalendarDate *date = [NSCalendarDate dateWithString:dateString calendarFormat:fmt locale:locale]; NSCalendarDate *date2 = [NSCalendarDate dateWithString:dateString2 calendarFormat:fmt2 locale:locale]; NSLog(@"%@\n%@", dateString, [date descriptionWithCalendarFormat:fmt]); PASS([dateString isEqual: [date descriptionWithCalendarFormat:fmt]], "formatting milliseconds works"); PASS([dateString2 isEqual: [date2 descriptionWithCalendarFormat:fmt2]], "formatting with %%e works"); } [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSCalendarDate/test02.m000066400000000000000000000171651435650067400223070ustar00rootroot00000000000000#import "Testing.h" #import #import #import #import #import #include "./western.h" int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSMutableArray *tmpArray; NSMutableDictionary *myLocale; NSCalendarDate *myBirthday; NSCalendarDate *anotherDay; myLocale = westernLocale(); tmpArray = [NSMutableArray new]; [tmpArray addObject: @"Gen"]; [tmpArray addObject: @"Feb"]; [tmpArray addObject: @"Mar"]; [tmpArray addObject: @"Apr"]; [tmpArray addObject: @"Mag"]; [tmpArray addObject: @"Giu"]; [tmpArray addObject: @"Lug"]; [tmpArray addObject: @"Ago"]; [tmpArray addObject: @"Set"]; [tmpArray addObject: @"Ott"]; [tmpArray addObject: @"Nov"]; [tmpArray addObject: @"Dic"]; [myLocale setObject: tmpArray forKey: NSShortMonthNameArray]; ASSIGN(tmpArray,[NSMutableArray new]); [tmpArray addObject: @"Gennaio"]; [tmpArray addObject: @"Febbraio"]; [tmpArray addObject: @"Marzo"]; [tmpArray addObject: @"Aprile"]; [tmpArray addObject: @"Maggio"]; [tmpArray addObject: @"Giugno"]; [tmpArray addObject: @"Luglio"]; [tmpArray addObject: @"Agosto"]; [tmpArray addObject: @"Settembre"]; [tmpArray addObject: @"Ottobre"]; [tmpArray addObject: @"Novembre"]; [tmpArray addObject: @"Dicembre"]; [myLocale setObject: tmpArray forKey: NSMonthNameArray]; ASSIGN(tmpArray,[NSMutableArray new]); [tmpArray addObject: @"Dom"]; [tmpArray addObject: @"Lun"]; [tmpArray addObject: @"Mar"]; [tmpArray addObject: @"Mer"]; [tmpArray addObject: @"Gio"]; [tmpArray addObject: @"Ven"]; [tmpArray addObject: @"Sab"]; [myLocale setObject: tmpArray forKey: NSShortWeekDayNameArray]; ASSIGN(tmpArray,[NSMutableArray new]); [tmpArray addObject: @"Domencia"]; [tmpArray addObject: @"Lunedi"]; [tmpArray addObject: @"Martedi"]; [tmpArray addObject: @"Mercoledi"]; [tmpArray addObject: @"Giovedi"]; [tmpArray addObject: @"Venerdi"]; [tmpArray addObject: @"Sabato"]; [myLocale setObject: tmpArray forKey: NSWeekDayNameArray]; ASSIGN(tmpArray,[NSMutableArray new]); [tmpArray addObject: @"AM"]; [tmpArray addObject: @"PM"]; [myLocale setObject: tmpArray forKey: NSAMPMDesignation]; myBirthday = [NSCalendarDate dateWithYear: 1974 month: 11 day: 20 hour: 13 minute: 0 second: 0 timeZone: [NSTimeZone timeZoneWithName: @"MET"]]; anotherDay = [NSCalendarDate dateWithYear: 1974 month: 1 day: 2 hour: 3 minute: 0 second: 0 timeZone: [NSTimeZone timeZoneWithName: @"MET"]]; PASS([[myBirthday descriptionWithCalendarFormat: @"%%" locale: myLocale] isEqualToString: @"%"], "%% format works in description"); PASS([[myBirthday descriptionWithCalendarFormat: @"%a" locale: myLocale] isEqualToString: @"Mer"], "%%a format works in description"); PASS([[myBirthday descriptionWithCalendarFormat: @"%A" locale: myLocale] isEqualToString: @"Mercoledi"], "%%A format works in description"); PASS([[myBirthday descriptionWithCalendarFormat: @"%b" locale: myLocale] isEqualToString: @"Nov"], "%%b format works in description"); PASS([[myBirthday descriptionWithCalendarFormat: @"%B" locale: myLocale] isEqualToString: @"Novembre"], "%%B format works in description"); PASS([[myBirthday descriptionWithCalendarFormat: @"%d" locale: myLocale] isEqualToString: @"20"], "%%d format works in description"); PASS([[myBirthday descriptionWithCalendarFormat: @"%e" locale: myLocale] isEqualToString: @"20"], "%%e format works in description"); PASS([[anotherDay descriptionWithCalendarFormat: @"%e" locale: myLocale] isEqualToString: @"2"], "%%e format has no leading space with single digit"); PASS([[anotherDay descriptionWithCalendarFormat: @"%2e" locale: myLocale] isEqualToString: @" 2"], "%%2e format has leading space with single digit"); PASS([[myBirthday descriptionWithCalendarFormat: @"%F" locale: myLocale] isEqualToString: @"000"], "%%F format works in description"); PASS([[myBirthday descriptionWithCalendarFormat: @"%H" locale: myLocale] isEqualToString: @"13"], "%%H format works in description"); PASS([[myBirthday descriptionWithCalendarFormat: @"%I" locale: myLocale] isEqualToString: @"01"], "%%I format works in description"); PASS([[myBirthday descriptionWithCalendarFormat: @"%j" locale: myLocale] isEqualToString: @"324"], "%%j format works in description"); PASS([[myBirthday descriptionWithCalendarFormat: @"%m" locale: myLocale] isEqualToString: @"11"], "%%m format works in description"); PASS([[myBirthday descriptionWithCalendarFormat: @"%M" locale: myLocale] isEqualToString: @"00"], "%%M format works in description"); PASS([[myBirthday descriptionWithCalendarFormat: @"%p" locale: myLocale] isEqualToString: @"PM"], "%%p format works in description"); PASS([[myBirthday descriptionWithCalendarFormat: @"%S" locale: myLocale] isEqualToString: @"00"], "%%S format works in description"); PASS([[myBirthday descriptionWithCalendarFormat: @"%w" locale: myLocale] isEqualToString: @"3"], "%%w format works in description"); PASS([[myBirthday descriptionWithCalendarFormat: @"%y" locale: myLocale] isEqualToString: @"74"], "%%y format works in description"); PASS([[myBirthday descriptionWithCalendarFormat: @"%Y" locale: myLocale] isEqualToString: @"1974"], "%%Y format works in description"); PASS([[myBirthday descriptionWithCalendarFormat: @"%Z" locale: myLocale] isEqualToString: @"MET"], "%%Z format works in description"); PASS([[myBirthday descriptionWithCalendarFormat: @"%z" locale: myLocale] isEqualToString: @"+0100"], "%%z format works in description"); PASS([[myBirthday descriptionWithCalendarFormat: @"%d %m %Y" locale: myLocale] isEqualToString: @"20 11 1974"], "%%d %%m %%Y format works in description"); PASS([[myBirthday descriptionWithCalendarFormat: @"%d %B %y" locale: myLocale] isEqualToString: @"20 Novembre 74"], "%%d %%B %%Y format works in description"); PASS([[myBirthday descriptionWithCalendarFormat: @"%H:%M:%S" locale: myLocale] isEqualToString: @"13:00:00"], "%%H:%%M:%%S format works in description"); PASS([[myBirthday descriptionWithCalendarFormat: @"%H%%%M%%%S" locale: myLocale] isEqualToString: @"13%00%00"], "%%H%%%%%%M%%%%%%S format works in description"); PASS([[myBirthday descriptionWithCalendarFormat: @"%H:%M (%Z)" locale: myLocale] isEqualToString: @"13:00 (MET)"], "%%H%%M format works in description"); PASS([[myBirthday descriptionWithCalendarFormat: @"%R" locale: myLocale] isEqualToString: @"13:00"], "%%R format works in description"); PASS([[myBirthday descriptionWithCalendarFormat: @"%r" locale: myLocale] isEqualToString: @"01:00:00 PM"], "%%r format works in description"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSCalendarDate/test03.m000066400000000000000000000031531435650067400223000ustar00rootroot00000000000000/* * DateFormatTest.m - demonstrate [NSCalendarDate descriptionWithCalendarFormat] hanging behaviour with some values. * * Created on: Mar 15, 2016 */ #import #import "Testing.h" #define ONE_SECOND ((double)1 / (24*60*60)) static NSString * formattedDaysSince1970(double daysSince1970) { NSCalendarDate *calendarDate; NSTimeZone *tz; NSString *formattedDate; double secondsSinceReference; // Convert offset in "days from 1970" to offset in seconds // from Reference date (from 01-Jan-2001). secondsSinceReference = floor (daysSince1970 / ONE_SECOND - NSTimeIntervalSince1970 + 0.5); printf ("daysSince1970: %.18g. secondsSinceReference: %.18g.\n", daysSince1970, secondsSinceReference); calendarDate = [[NSCalendarDate alloc] initWithTimeIntervalSinceReferenceDate: secondsSinceReference]; tz = [NSTimeZone timeZoneWithName: @"GMT"]; [calendarDate setTimeZone: tz]; formattedDate = [calendarDate descriptionWithCalendarFormat: @"%d-%m-%Y"]; RELEASE(calendarDate); return formattedDate; } int main(void) { CREATE_AUTORELEASE_POOL(arp); if (sizeof(NSInteger) == 4) { PASS_EQUAL(formattedDaysSince1970(8640000000), @"02-01-4001", "format date for 8640000000"); PASS_EQUAL(formattedDaysSince1970(2147483651), @"02-01-4001", "format date for 2147483651"); } else { PASS_EQUAL(formattedDaysSince1970(8640000000), @"17-07-23657486", "format date for 8640000000"); PASS_EQUAL(formattedDaysSince1970(2147483651), @"15-07-5881580", "format date for 2147483651"); } DESTROY(arp); return 0; } gnustep-base-1.29.0/Tests/base/NSCalendarDate/western.h000066400000000000000000000047271435650067400226500ustar00rootroot00000000000000#import "Foundation/NSArray.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSString.h" #import "Foundation/NSUserDefaults.h" /* Function to return a standardised locale dictionary. */ static NSMutableDictionary * westernLocale() { NSArray *ampm; NSArray *long_day; NSArray *long_month; NSArray *short_day; NSArray *short_month; NSArray *earlyt; NSArray *latert; NSArray *hour_names; NSArray *ymw_names; ampm = [NSArray arrayWithObjects: @"AM", @"PM", nil]; short_month = [NSArray arrayWithObjects: @"Jan", @"Feb", @"Mar", @"Apr", @"May", @"Jun", @"Jul", @"Aug", @"Sep", @"Oct", @"Nov", @"Dec", nil]; long_month = [NSArray arrayWithObjects: @"January", @"February", @"March", @"April", @"May", @"June", @"July", @"August", @"September", @"October", @"November", @"December", nil]; short_day = [NSArray arrayWithObjects: @"Sun", @"Mon", @"Tue", @"Wed", @"Thu", @"Fri", @"Sat", nil]; long_day = [NSArray arrayWithObjects: @"Sunday", @"Monday", @"Tuesday", @"Wednesday", @"Thursday", @"Friday", @"Saturday", nil]; earlyt = [NSArray arrayWithObjects: @"prior", @"last", @"past", @"ago", nil]; latert = [NSArray arrayWithObjects: @"next", nil]; ymw_names = [NSArray arrayWithObjects: @"year", @"month", @"week", nil]; hour_names = [NSArray arrayWithObjects: [NSArray arrayWithObjects: @"0", @"midnight", nil], [NSArray arrayWithObjects: @"12", @"noon", @"lunch", nil], [NSArray arrayWithObjects: @"10", @"morning", nil], [NSArray arrayWithObjects: @"14", @"afternoon", nil], [NSArray arrayWithObjects: @"19", @"dinner", nil], nil]; return [NSMutableDictionary dictionaryWithObjectsAndKeys: ampm, NSAMPMDesignation, long_month, NSMonthNameArray, long_day, NSWeekDayNameArray, short_month, NSShortMonthNameArray, short_day, NSShortWeekDayNameArray, @"DMYH", NSDateTimeOrdering, [NSArray arrayWithObject: @"tomorrow"], NSNextDayDesignations, [NSArray arrayWithObject: @"nextday"], NSNextNextDayDesignations, [NSArray arrayWithObject: @"yesterday"], NSPriorDayDesignations, [NSArray arrayWithObject: @"today"], NSThisDayDesignations, earlyt, NSEarlierTimeDesignations, latert, NSLaterTimeDesignations, hour_names, NSHourNameDesignations, ymw_names, NSYearMonthWeekDesignations, nil]; } gnustep-base-1.29.0/Tests/base/NSCharacterSet/000077500000000000000000000000001435650067400210375ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSCharacterSet/TestInfo000066400000000000000000000000001435650067400225030ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSCharacterSet/basic.m000066400000000000000000000012311435650067400222730ustar00rootroot00000000000000#import "Testing.h" #import "ObjectTesting.h" #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; id testObj = [NSCharacterSet alphanumericCharacterSet]; test_alloc(@"NSCharacterSet"); test_NSObject(@"NSCharacterSet", [NSArray arrayWithObject:testObj]); test_NSCoding([NSArray arrayWithObject:testObj]); test_NSCopying(@"NSCharacterSet", @"NSMutableCharacterSet", [NSArray arrayWithObject:testObj], NO, NO); test_NSMutableCopying(@"NSCharacterSet",@"NSMutableCharacterSet", [NSArray arrayWithObject:testObj]); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSCharacterSet/class.m000066400000000000000000000057521435650067400223330ustar00rootroot00000000000000#import "Testing.h" #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSCharacterSet *theSet = nil; theSet = [NSCharacterSet alphanumericCharacterSet]; PASS(theSet != nil, "NSCharacterSet understands [+alphanumericCharacterSet]"); PASS([NSCharacterSet alphanumericCharacterSet] == theSet, "NSCharacterSet uniques alphanumericCharacterSet"); theSet = [NSCharacterSet controlCharacterSet]; PASS(theSet != nil,"NSCharacterSet understands [+controlCharacterSet]"); PASS([NSCharacterSet controlCharacterSet] == theSet, "NSCharacterSet uniques controlCharacterSet"); theSet = [NSCharacterSet decimalDigitCharacterSet]; PASS(theSet != nil,"NSCharacterSet understands [+decimalDigitCharacterSet]"); PASS([NSCharacterSet decimalDigitCharacterSet] == theSet, "NSCharacterSet uniques [+decimalDigitCharacterSet]"); theSet = [NSCharacterSet illegalCharacterSet]; PASS(theSet != nil,"NSCharacterSet understands [+illegalCharacterSet]"); PASS([NSCharacterSet illegalCharacterSet] == theSet, "NSCharacterSet uniques [+illegalCharacterSet]"); theSet = [NSCharacterSet letterCharacterSet]; PASS(theSet != nil,"NSCharacterSet understands [+letterCharacterSet]"); PASS([NSCharacterSet letterCharacterSet] == theSet, "NSCharacterSet uniques [+letterCharacterSet]"); theSet = [NSCharacterSet lowercaseLetterCharacterSet]; PASS(theSet != nil,"NSCharacterSet understands [+lowercaseLetterCharacterSet]"); PASS([NSCharacterSet lowercaseLetterCharacterSet] == theSet, "NSCharacterSet uniques [+lowercaseLetterCharacterSet]"); theSet = [NSCharacterSet nonBaseCharacterSet]; PASS(theSet != nil,"NSCharacterSet understands [+nonBaseCharacterSet]"); PASS([NSCharacterSet nonBaseCharacterSet] == theSet, "NSCharacterSet uniques [+nonBaseCharacterSet]"); theSet = [NSCharacterSet punctuationCharacterSet]; PASS(theSet != nil,"NSCharacterSet understands [+punctuationCharacterSet]"); PASS([NSCharacterSet punctuationCharacterSet] == theSet, "NSCharacterSet uniques [+punctuationCharacterSet]"); theSet = [NSCharacterSet uppercaseLetterCharacterSet]; PASS(theSet != nil,"NSCharacterSet understands [+uppercaseLetterCharacterSet]"); PASS([NSCharacterSet uppercaseLetterCharacterSet] == theSet, "NSCharacterSet uniques [+uppercaseLetterCharacterSet]"); theSet = [NSCharacterSet whitespaceAndNewlineCharacterSet]; PASS(theSet != nil,"NSCharacterSet understands [+whitespaceAndNewlineCharacterSet]"); PASS([NSCharacterSet whitespaceAndNewlineCharacterSet] == theSet, "NSCharacterSet uniques [+whitespaceAndNewlineCharacterSet]"); theSet = [NSCharacterSet whitespaceCharacterSet]; PASS(theSet != nil,"NSCharacterSet understands [+whitespaceCharacterSet]"); PASS([NSCharacterSet whitespaceCharacterSet] == theSet, "NSCharacterSet uniques [+whitespaceCharacterSet]"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSCharacterSet/general.m000066400000000000000000000143171435650067400226400ustar00rootroot00000000000000#import "Testing.h" #import #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSCharacterSet *theSet,*iSet; NSData *data1 = nil; unichar ch; theSet = [NSCharacterSet alphanumericCharacterSet]; PASS([theSet characterIsMember: 'A'] && [theSet characterIsMember: 'Z'] && [theSet characterIsMember: 'a'] && [theSet characterIsMember: 'z'] && [theSet characterIsMember: '9'] && [theSet characterIsMember: '0'] && ![theSet characterIsMember: '#'] && ![theSet characterIsMember: ' '] && ![theSet characterIsMember: '\n'], "Check some characters from alphanumericCharacterSet"); theSet = [NSCharacterSet lowercaseLetterCharacterSet]; PASS(![theSet characterIsMember: 'A'] && ![theSet characterIsMember: 'Z'] && [theSet characterIsMember: 'a'] && [theSet characterIsMember: 'z'] && ![theSet characterIsMember: '9'] && ![theSet characterIsMember: '0'] && ![theSet characterIsMember: '#'] && ![theSet characterIsMember: ' '] && ![theSet characterIsMember: '\n'], "Check some characters from lowercaseLetterCharacterSet"); theSet = [NSCharacterSet newlineCharacterSet]; PASS(![theSet characterIsMember: 'A'] && ![theSet characterIsMember: 'Z'] && ![theSet characterIsMember: 'a'] && ![theSet characterIsMember: 'z'] && ![theSet characterIsMember: '9'] && ![theSet characterIsMember: '0'] && ![theSet characterIsMember: '#'] && ![theSet characterIsMember: ' '] && [theSet characterIsMember: '\n'] && ![theSet characterIsMember: '\t'], "Check some characters from newlineCharacterSet"); theSet = [theSet invertedSet]; PASS([theSet characterIsMember: 'A'] && [theSet characterIsMember: 'Z'] && [theSet characterIsMember: 'a'] && [theSet characterIsMember: 'z'] && [theSet characterIsMember: '9'] && [theSet characterIsMember: '0'] && [theSet characterIsMember: '#'] && [theSet characterIsMember: ' '] && ![theSet characterIsMember: '\n'] && [theSet characterIsMember: '\t'] && [theSet characterIsMember: 0xf6], "Check some characters from inverted newlineCharacterSet"); theSet = [NSCharacterSet whitespaceAndNewlineCharacterSet]; PASS(![theSet characterIsMember: 'A'] && ![theSet characterIsMember: 'Z'] && ![theSet characterIsMember: 'a'] && ![theSet characterIsMember: 'z'] && ![theSet characterIsMember: '9'] && ![theSet characterIsMember: '0'] && ![theSet characterIsMember: '#'] && [theSet characterIsMember: ' '] && [theSet characterIsMember: '\n'] && [theSet characterIsMember: '\t'], "Check some characters from whitespaceAndNewlineCharacterSet"); PASS([theSet characterIsMember: 0x00A0], "a non-break-space is whitespace"); data1 = [theSet bitmapRepresentation]; PASS(data1 != nil && [data1 isKindOfClass: [NSData class]], "-bitmapRepresentation works"); iSet = [theSet invertedSet]; PASS([iSet characterIsMember: 'A'] && [iSet characterIsMember: 'Z'] && [iSet characterIsMember: 'a'] && [iSet characterIsMember: 'z'] && [iSet characterIsMember: '9'] && [iSet characterIsMember: '0'] && [iSet characterIsMember: '#'] && ![iSet characterIsMember: ' '] && ![iSet characterIsMember: '\n'] && ![iSet characterIsMember: '\t'], "-invertedSet works"); { NSCharacterSet *firstSet,*secondSet,*thirdSet,*fourthSet; firstSet = [NSCharacterSet decimalDigitCharacterSet]; secondSet = [NSCharacterSet decimalDigitCharacterSet]; thirdSet = nil; fourthSet = [NSMutableCharacterSet decimalDigitCharacterSet]; thirdSet = [[firstSet class] decimalDigitCharacterSet]; PASS (firstSet == secondSet && firstSet == thirdSet && firstSet != fourthSet, "Caching of standard sets"); } theSet = [NSCharacterSet characterSetWithCharactersInString:@"Not a set"]; PASS(theSet != nil && [theSet isKindOfClass: [NSCharacterSet class]], "Create custom set with characterSetWithCharactersInString:"); PASS([theSet characterIsMember: ' '] && [theSet characterIsMember: 'N'] && [theSet characterIsMember: 'o'] && ![theSet characterIsMember: 'A'] && ![theSet characterIsMember: '#'], "Check custom set"); theSet = [NSCharacterSet URLFragmentAllowedCharacterSet]; NSString *setString = @"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ?/:@-._~!$&'()*+,="; NSUInteger i = 0; BOOL p = YES; for(i = 0; i < [setString length]; i++) { char c = [setString characterAtIndex: i]; if([theSet characterIsMember: c] == NO) // , [msg cStringUsingEncoding: NSUTF8Encoding]); { NSLog(@"%c is not in set", c); PASS(NO,"URLFragmentAllowedCharacterSet char not found"); p = NO; } } if(!p) { PASS(YES, "URLFragmentAllowedCharacterSet passwed"); } /* PASS(//[theSet characterIsMember: 'A'] && //[theSet characterIsMember: 'Z'] && //[theSet characterIsMember: 'a'] && //[theSet characterIsMember: 'z'] && //[theSet characterIsMember: '9'] && // [theSet characterIsMember: '0'] && [theSet characterIsMember: '?'] && [theSet characterIsMember: '/ '] && [theSet characterIsMember: ':'] && [theSet characterIsMember: '@ '] && [theSet characterIsMember: '-'] && [theSet characterIsMember: '.'] && [theSet characterIsMember: '_'] && [theSet characterIsMember: '~'] && [theSet characterIsMember: '!'] && [theSet characterIsMember: '$ '] && [theSet characterIsMember: '&'] && // [theSet characterIsMember: '\''] && [theSet characterIsMember: '('] && [theSet characterIsMember: ')'] && [theSet characterIsMember: '*'] && [theSet characterIsMember: '+'] && [theSet characterIsMember: ','] && [theSet characterIsMember: ';'] && [theSet characterIsMember: '='], "Check some characters from URLFramgmentAllowedCharacterSet"); */ [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSCharacterSet/illegalCharacterSet.m000066400000000000000000000046771435650067400251350ustar00rootroot00000000000000#import "Testing.h" #import "ObjectTesting.h" #import int main (int argc, char**argv) { id pool = [NSAutoreleasePool new]; NSCharacterSet *illegal = [NSCharacterSet illegalCharacterSet]; NSCharacterSet *legal = [illegal invertedSet]; NSMutableData *data; NSString *s; unichar cp; PASS([illegal characterIsMember: 0xfffe], "0xfffe is illegal"); PASS(![legal characterIsMember: 0xfffe], "0xfffe is bnot legal"); PASS([illegal characterIsMember: 0xffff], "0xffff is illegal"); PASS(![legal characterIsMember: 0xffff], "0xffff is not legal"); PASS([illegal characterIsMember: 0xfdd0], "0xfdd0 is illegal"); PASS(![legal characterIsMember: 0xfdd0], "0xfdd0 is not legal"); PASS([illegal longCharacterIsMember: 0x0010fffe], "0x0010fffe is illegal"); PASS(![legal longCharacterIsMember: 0x0010fffe], "0x0010fffe is not legal"); // Null character PASS(![illegal characterIsMember: 0x0000], "0x0000 is not illegal"); PASS([legal characterIsMember: 0x0000], "0x0000 is legal"); // First half of surrogate pair PASS(![illegal characterIsMember: 0xd800], "0xd800 is not illegal"); PASS([legal characterIsMember: 0xd800], "0xd800 is legal"); // Second half of surrogate pair PASS(![illegal characterIsMember: 0xdc00], "0xdc00 is not illegal"); PASS([legal characterIsMember: 0xdc00], "0xdc00 is legal"); // Private use character in code plane 16 PASS([illegal longCharacterIsMember: 0x0010fffd], "0x0010fffd illegal"); PASS(![legal longCharacterIsMember: 0x0010fffd], "0x0010fffd is illegal"); // Entire UCS-2 set (UTF-16 surrogates start above 0xD800) // (still looking for official information on the range of UCS-2 code points, // i.e. whether UCS-4/UCS-2 are actually official code point sets // or whether they are just commonly used terms to differentiate // the full UCS code point set from it's UTF-16 encoding.) data = [NSMutableData dataWithCapacity: sizeof(cp) * 0xD800]; // Do not start with 0x0000 otherwise a leading BOM could misinterpreted. for (cp=0x0001;cp<0xFFFF;cp++) { /* Skip code points that are reserved for surrogate characters. */ if (cp == 0xD800) cp = 0xF900; if ([legal characterIsMember:cp]) { [data appendBytes: &cp length: sizeof(cp)]; } } s = [[NSString alloc] initWithData: data encoding: NSUnicodeStringEncoding]; PASS([s length],"legal UCS-2 set can be represented in an NSString."); [s release]; [pool release]; return (0); } gnustep-base-1.29.0/Tests/base/NSCharacterSet/whitespaceAndNewlineCharacterSet.m000066400000000000000000000015211435650067400276060ustar00rootroot00000000000000#import "Testing.h" #import "ObjectTesting.h" #import int main (int argc, char**argv) { id pool = [NSAutoreleasePool new]; NSCharacterSet *wsnl = [NSCharacterSet whitespaceAndNewlineCharacterSet]; PASS([wsnl characterIsMember: 0x000A], "newline 0x000A is wsnl") PASS([wsnl characterIsMember: 0x000D], "return 0x00D0 is wsnl") PASS([wsnl characterIsMember: 0x0020], "space 0x0020 is wsnl") PASS([wsnl characterIsMember: 0x200B], "zero-width-space 0x200B is wsnl") PASS([wsnl characterIsMember: 0x202F], "narrow-no-break-space 0x202F is wsnl") PASS([wsnl characterIsMember: 0x205F], "medium-mathematical-space 0x205F is wsnl") PASS([wsnl characterIsMember: 0x3000], "ideographic-space 0x202F is wsnl") PASS(![wsnl characterIsMember: 0x0030], "0x0030 is not wsnl") [pool release]; return (0); } gnustep-base-1.29.0/Tests/base/NSConnection/000077500000000000000000000000001435650067400205665ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSConnection/GNUmakefile.preamble000066400000000000000000000003061435650067400244250ustar00rootroot00000000000000 ADDITIONAL_OBJCFLAGS += -I../GenericTests/ -I../../.. -Wall $(GNUSTEP_INSTANCE)_SUBPROJECTS = ../GenericTests SUBPROJECTS= ../GenericTests Resources include $(GNUSTEP_MAKEFILES)/aggregate.make gnustep-base-1.29.0/Tests/base/NSConnection/Resources/000077500000000000000000000000001435650067400225405ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSConnection/Resources/Client.m000066400000000000000000000014201435650067400241310ustar00rootroot00000000000000#import #import @interface TestServer : NSObject { } - (int) doIt; @end int main() { ENTER_POOL NSSocketPortNameServer *ns = [NSSocketPortNameServer sharedInstance]; NSString *name = @"TestServer"; NSConnection *conn; NSDistantObject *proxy; TestServer *test; int result; [NSSocketPort setOptionsForTLS: [NSDictionary dictionaryWithObjectsAndKeys: @"9", GSTLSDebug, nil]]; conn = [NSConnection connectionWithRegisteredName: name host: @"" usingNameServer: ns]; proxy = [conn rootProxy]; test = (TestServer*)proxy; result = [test doIt]; printf("Result is %d\n", result); LEAVE_POOL exit(0); } @implementation TestServer - (int) doIt { return 42; } @end gnustep-base-1.29.0/Tests/base/NSConnection/Resources/Connection.m000066400000000000000000000026611435650067400250220ustar00rootroot00000000000000#include #include id myServer; @interface Tester : NSObject { } + (void) connectWithPorts: (NSArray*)portArray; + (void) setServer: (id)anObject; + (void) startup; - (int) doIt; @end @implementation Tester + (void) connectWithPorts: (NSArray*)portArray { NSAutoreleasePool *pool; NSConnection *serverConnection; Tester *serverObject; pool = [[NSAutoreleasePool alloc] init]; serverConnection = [NSConnection connectionWithReceivePort: [portArray objectAtIndex: 0] sendPort: [portArray objectAtIndex: 1]]; serverObject = [[self alloc] init]; [(id)[serverConnection rootProxy] setServer: serverObject]; [serverObject release]; [[NSRunLoop currentRunLoop] run]; [pool release]; [NSThread exit]; return; } + (void) setServer: (id)anObject { myServer = [anObject retain]; NSLog(@"Got %d", [myServer doIt]); } + (void) startup { NSPort *port1; NSPort *port2; NSArray *portArray; NSConnection *conn; port1 = [NSPort port]; port2 = [NSPort port]; conn = [[NSConnection alloc] initWithReceivePort: port1 sendPort: port2]; [conn setRootObject: self]; /* Ports switched here. */ portArray = [NSArray arrayWithObjects: port2, port1, nil]; [NSThread detachNewThreadSelector: @selector(connectWithPorts:) toTarget: self withObject: portArray]; return; } - (int) doIt { return 42; } @end gnustep-base-1.29.0/Tests/base/NSConnection/Resources/GNUmakefile000066400000000000000000000005541435650067400246160ustar00rootroot00000000000000include $(GNUSTEP_MAKEFILES)/common.make BUNDLE_NAME=TestConnection TestConnection_NEEDS_GUI = NO TestConnection_OBJC_FILES=Connection.m TEST_TOOL_NAME=Client Server Client_NEEDS_GUI = NO Client_OBJC_FILES=Client.m Server_NEEDS_GUI = NO Server_OBJC_FILES=Server.m include $(GNUSTEP_MAKEFILES)/bundle.make include $(GNUSTEP_MAKEFILES)/test-tool.make check:: all gnustep-base-1.29.0/Tests/base/NSConnection/Resources/Server.m000066400000000000000000000017331435650067400241700ustar00rootroot00000000000000#import #import @interface TestServer : NSObject { } - (int) doIt; @end int main() { ENTER_POOL NSSocketPortNameServer *ns = [NSSocketPortNameServer sharedInstance]; NSString *name = @"TestServer"; NSConnection *conn; NSPort *port; TestServer *test = AUTORELEASE([TestServer new]); port = [NSSocketPort port]; [(NSSocketPort*)port setOptionsForTLS: [NSDictionary dictionaryWithObjectsAndKeys: @"9", GSTLSDebug, nil]]; conn = [[NSConnection alloc] initWithReceivePort: port sendPort: nil]; [conn setRootObject: test]; if ([conn registerName: name withNameServer: ns] == NO) { NSPort *p = [ns portForName: name onHost: @""]; DESTROY(conn); NSLog(@"There is already a process: %@, on %@", name, p); return NO; } [[NSRunLoop currentRunLoop] run]; LEAVE_POOL exit(0); } @implementation TestServer - (int) doIt { return 42; } @end gnustep-base-1.29.0/Tests/base/NSConnection/TestInfo000066400000000000000000000000001435650067400222320ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSConnection/basic.m000066400000000000000000000010751435650067400220300ustar00rootroot00000000000000#import "Testing.h" #import "ObjectTesting.h" #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; id testObject = nil; test_alloc(@"NSConnection"); testObject = [NSConnection new]; test_NSObject(@"NSConnection",[NSArray arrayWithObject:testObject]); testObject = [NSConnection defaultConnection]; PASS(testObject != nil && [testObject isKindOfClass:[NSConnection class]], "NSConnection +defaultConnection works"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSConnection/connection.m000066400000000000000000000023161435650067400231050ustar00rootroot00000000000000#import "Testing.h" #import #import #import #import #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSBundle *bundle; NSString *bundlePath = [[NSFileManager defaultManager] currentDirectoryPath]; bundlePath = [bundlePath stringByAppendingPathComponent: @"Resources"]; bundlePath = [NSBundle pathForResource: @"TestConnection" ofType: @"bundle" inDirectory: bundlePath]; bundle = [NSBundle bundleWithPath: bundlePath]; PASS([bundle load],"We can load the test bundle"); { /* this should probably be rewritten to uh return a bool */ NS_DURING NSDate *date; NSRunLoop *run = [NSRunLoop currentRunLoop]; [NSClassFromString(@"Tester") performSelector: @selector(startup)]; date = [NSDate dateWithTimeIntervalSinceNow: 3.0]; [run runUntilDate: date]; PASS(1, "NSConnection can do a simple connection"); NS_HANDLER PASS(0, "NSConnection can do a simple connection"); NS_ENDHANDLER } [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSCountedSet/000077500000000000000000000000001435650067400205445ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSCountedSet/TestInfo000066400000000000000000000000001435650067400222100ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSCountedSet/basic.m000066400000000000000000000012151435650067400220020ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; id testObject = [NSCountedSet new]; test_alloc(@"NSCountedSet"); test_NSObject(@"NSCountedSet",[NSArray arrayWithObject:testObject]); test_NSCoding([NSArray arrayWithObject:testObject]); test_NSCopying(@"NSCountedSet", @"NSCountedSet", [NSArray arrayWithObject:testObject], NO, YES); test_NSMutableCopying(@"NSCountedSet", @"NSCountedSet", [NSArray arrayWithObject:testObject]); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSCountedSet/equality.m000066400000000000000000000017131435650067400225610ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSCountedSet *count1 = [NSCountedSet setWithObjects: @"1", @"1", nil]; NSCountedSet *count2 = [NSCountedSet setWithObjects: @"1", @"1", nil]; NSCountedSet *count3 = [NSCountedSet setWithObjects: @"1", nil]; NSSet *set = [NSSet setWithObjects: @"1", nil]; PASS([count1 isEqualToSet: count2], "Identical counted sets are equal"); PASS(![count1 isEqualToSet: count3], "Different counted sets are not equal"); PASS([count3 isEqualToSet: set], "Counted set is equal to plain set"); PASS([set isEqualToSet: count3], "Plain set is equal to counted set"); PASS(![count1 isEqualToSet: set], "Counted set with different counts is not equal to plain set"); PASS(![set isEqualToSet: count1], "Plain set is not equal to counted set with different counts"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSData/000077500000000000000000000000001435650067400173405ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSData/Lorum000066400000000000000000000471411435650067400203700ustar00rootroot00000000000000Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras id tempor risus. Praesent ultricies pretium lorem vitae semper. Curabitur eget nibh non arcu auctor ultrices in eget ante. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Cras nec convallis sem. Phasellus finibus nec lorem at aliquam. Aenean ac felis sed ex euismod hendrerit mollis vitae purus. Fusce lacinia convallis facilisis. Sed ligula arcu, dapibus a orci et, mollis dignissim est. Etiam nec odio eleifend, suscipit augue ut, sollicitudin lectus. Phasellus ut nunc quis ante eleifend egestas. Mauris suscipit dictum dolor, nec ultrices ipsum. Suspendisse fermentum consequat lectus eu mollis. Aliquam erat volutpat. Nam egestas justo nec mauris tincidunt tempor. Nullam nec dui condimentum, vehicula nunc ac, condimentum felis. Maecenas scelerisque nec nunc eget tempus. Donec fringilla porta nibh, eu bibendum magna porta quis. Sed et finibus nisi. Suspendisse risus quam, fringilla sit amet odio nec, egestas sagittis nulla. Phasellus nec ex eget justo lacinia laoreet ac ac arcu. Aliquam quis finibus urna, quis consequat erat. Donec tempus ante id justo vehicula commodo. Nulla non suscipit elit. Cras in interdum erat. Vestibulum malesuada urna eget metus rhoncus porttitor. Aenean et auctor mi, vel bibendum felis. Fusce mollis feugiat accumsan. Nullam lorem purus, finibus sed sapien eu, ultrices luctus nibh. Nam non lorem eget urna sagittis varius. Donec porttitor justo nibh, non lobortis nunc gravida a. Praesent maximus urna at libero tempor faucibus. Integer pharetra tortor vitae ipsum rhoncus rutrum. Aenean nec lobortis sem. Morbi consectetur nisl a neque pulvinar, sit amet venenatis tortor accumsan. Etiam a purus nec leo rutrum sagittis vitae et nisi. Phasellus consequat varius neque, vitae scelerisque diam auctor vitae. Praesent tincidunt lorem pulvinar dapibus tincidunt. Duis molestie metus eget tellus vehicula, non placerat massa rutrum. Etiam est ex, imperdiet et ultrices vitae, ullamcorper at magna. Suspendisse eros est, blandit ac lorem in, ornare ultricies ex. Donec volutpat metus sit amet nisl ultrices facilisis in sed tortor. Etiam sed ex semper, cursus mauris quis, volutpat justo. Suspendisse id orci mauris. Duis porta risus urna, a gravida leo elementum vel. Nulla facilisi. In ac elit tempus leo convallis pellentesque. Aliquam ut felis at nulla maximus mattis nec pretium orci. Curabitur nec sem lacus. Morbi tempus, eros vitae accumsan mollis, massa ex imperdiet lacus, et consectetur leo justo eu erat. Nunc euismod urna hendrerit felis gravida fringilla. Nunc tincidunt elementum diam. Maecenas nec eros sit amet dui luctus euismod eget eu mi. Nunc nunc urna, tempor pretium condimentum vitae, condimentum ut velit. Duis vitae quam fermentum, vulputate lacus eget, aliquet urna. Phasellus semper mi quis ultrices interdum. Vivamus consequat nunc ex. Vestibulum id finibus turpis. Phasellus non rhoncus libero. Aenean eu libero facilisis, lobortis urna quis, suscipit nibh. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vivamus sollicitudin posuere nunc accumsan fringilla. Donec congue sit amet velit non dignissim. Integer enim purus, lacinia ac venenatis ac, pellentesque eu lacus. Pellentesque vehicula varius ante non tristique. Etiam pulvinar eget dolor a sagittis. Proin eros massa, iaculis vitae mollis eleifend, vulputate a mi. Maecenas eget mi ut massa dignissim pellentesque. Praesent eget diam quis lorem sollicitudin venenatis. Donec libero leo, mollis in lacus imperdiet, ullamcorper porta leo. Nunc ac ante lorem. Nam placerat sem pretium metus rhoncus molestie. Nam ante arcu, tincidunt sit amet nibh viverra, facilisis malesuada justo. Phasellus tempor maximus risus, ac malesuada elit fermentum et. Phasellus non accumsan neque. Curabitur ac justo vel nulla finibus blandit et sed mauris. Morbi viverra, lorem non consectetur fermentum, lectus augue commodo mauris, eget cursus leo enim ut lorem. In imperdiet tincidunt sollicitudin. Nunc mattis euismod viverra. Donec eu suscipit velit, sed auctor risus. Duis nec orci ut turpis condimentum hendrerit. Phasellus maximus, nisi ut fermentum viverra, dui massa ornare enim, vel congue lorem leo in purus. Donec erat ex, facilisis vel odio vitae, fermentum vestibulum sem. Donec tristique et turpis et tincidunt. Nulla laoreet neque orci. Duis malesuada aliquam malesuada. Sed eget turpis sapien. Vestibulum dignissim nibh a purus ullamcorper mollis. Integer fringilla sem felis, sit amet gravida ex congue ac. Donec semper, lacus eget egestas fringilla, sapien diam pulvinar dui, a vestibulum est risus sed tellus. Quisque id ipsum orci. Etiam blandit suscipit eros, nec egestas est eleifend a. Fusce porttitor vel enim quis ultricies. Sed euismod nibh nulla, at pellentesque sem molestie ut. Morbi augue arcu, tempor vitae mi in, bibendum gravida neque. Morbi sed turpis ultricies nisl venenatis commodo ut ac velit. Proin lobortis, nisi ut lacinia venenatis, libero nisi convallis orci, et pulvinar leo nulla id justo. Nulla facilisi. Praesent auctor augue ac lorem venenatis malesuada. Suspendisse leo leo, commodo non elementum ut, lacinia a ligula. Aenean cursus id metus et cursus. Curabitur ullamcorper, massa ut congue facilisis, turpis lorem gravida ligula, at faucibus massa mauris non augue. Pellentesque a velit sed ipsum consectetur dapibus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nunc id lobortis enim. Mauris id augue turpis. Mauris aliquam molestie libero, id malesuada metus ullamcorper id. Duis eleifend lacus et ipsum semper, non imperdiet nibh venenatis. Aliquam in metus magna. Cras libero lorem, finibus sed tempus nec, sagittis non risus. Phasellus luctus commodo viverra. In nunc libero, auctor facilisis massa vel, accumsan convallis purus. Fusce congue, enim ut ullamcorper interdum, augue tellus elementum augue, ac congue lectus ligula ac ligula. Nulla consequat enim eget risus malesuada facilisis. Maecenas molestie nisi eu mi ultricies, ac molestie orci porttitor. Fusce imperdiet ex sem, sed gravida augue consectetur vel. Mauris non nunc id tortor hendrerit luctus. Integer ac tincidunt nunc. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum vel auctor mauris, nec accumsan augue. Etiam finibus aliquet neque. Maecenas lectus nisl, sagittis eget turpis in, interdum pretium leo. Duis tristique ante et lacus bibendum dignissim. Integer ac eros luctus, tempor justo vel, gravida mi. Nulla vel lorem tempor neque posuere pellentesque. Mauris pretium mollis nibh, nec consequat elit accumsan sit amet. Aliquam mauris dui, fringilla et finibus sit amet, condimentum eu odio. Duis finibus laoreet venenatis. Sed eu pellentesque nibh. Sed sit amet tristique risus, sit amet rutrum augue. Curabitur sodales mauris in felis porttitor, id egestas turpis cursus. Etiam porta nisl risus, quis gravida orci dapibus ut. Sed ultricies, enim id sagittis dictum, neque enim porta elit, ac iaculis ipsum elit sit amet massa. Phasellus eget turpis ut est suscipit semper sed sit amet enim. Nam et venenatis ligula. Ut vestibulum fringilla ligula, sit amet aliquam nisi fringilla luctus. Aliquam ultricies gravida nunc a eleifend. Sed rhoncus metus eu turpis molestie blandit. Nam vehicula accumsan ipsum eu volutpat. Suspendisse elementum condimentum ex et fringilla. Cras varius eros quis augue pellentesque egestas. In ex leo, ornare a ligula vel, ultricies feugiat erat. Donec egestas fermentum posuere. Cras et nisi ornare, mattis augue vel, placerat est. Duis ex ante, porta quis mi tempor, malesuada bibendum ligula. Phasellus sit amet diam et quam condimentum sagittis. Duis at maximus orci, molestie mollis augue. Nullam ac mauris eget odio luctus feugiat. Etiam a rutrum diam. Sed a magna elit. Nullam scelerisque, justo vitae congue efficitur, diam nulla lacinia ex, ultrices pretium urna dolor non augue. Mauris pulvinar vel libero eu scelerisque. Aenean nec lorem ut lacus viverra imperdiet vel at est. Vivamus ac viverra diam. Cras sed dictum ex. Morbi consectetur lobortis condimentum. Curabitur blandit nibh sem, mattis porttitor est tincidunt dignissim. Quisque vitae sapien tristique, pulvinar ipsum in, hendrerit sem. Pellentesque vel sapien eget ante porttitor scelerisque. Vivamus tempor condimentum luctus. Curabitur facilisis eros velit. Sed cursus laoreet posuere. Praesent luctus viverra pharetra. Suspendisse eu pretium sapien. Donec a tristique arcu, dignissim commodo enim. Maecenas mollis diam nec nisl tincidunt tincidunt. Suspendisse volutpat nulla vel luctus tristique. Pellentesque dignissim lectus erat, faucibus maximus enim imperdiet congue. Aenean sed est at diam aliquet dictum eu ac libero. Integer ornare ipsum quis mattis congue. Suspendisse aliquet velit eu nisi placerat tempus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Sed ut enim nibh. Sed auctor sapien dui, placerat ultrices tellus aliquet rhoncus. Aliquam aliquam erat et purus pulvinar, id finibus ex consequat. Phasellus rhoncus lacus magna, et tincidunt nibh tempor ac. Maecenas ut quam leo. Nunc pretium feugiat molestie. Donec quis tellus varius, rutrum ante at, porta nunc. Duis quis fringilla nibh. Nullam eget fringilla quam. Proin id pharetra dolor. Nunc consequat magna at nulla laoreet, et pellentesque nisl tincidunt. Fusce lacinia mauris quam, id consectetur urna molestie a. Ut nibh justo, pellentesque nec ornare quis, tincidunt vitae diam. Donec eget ex a metus placerat sodales. Donec at tempus sem, ut placerat nibh. Vestibulum vehicula neque lacus, nec malesuada velit egestas et. Praesent commodo orci mollis augue venenatis ultrices. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce imperdiet magna non molestie condimentum. Fusce a tellus felis. In euismod sit amet erat a ornare. Sed sem magna, iaculis at ultrices a, finibus non ipsum. Nullam eget blandit justo. Praesent viverra ex non gravida consequat. Proin tincidunt scelerisque orci, non eleifend urna feugiat at. Nunc viverra mauris ac ipsum consectetur convallis. Proin urna justo, mattis quis pulvinar at, consectetur in orci. Nunc aliquam id ipsum nec rhoncus. In aliquet sed mi ut vehicula. Etiam neque augue, vehicula at gravida non, rhoncus in est. Aliquam lacinia neque neque, nec consectetur purus pharetra ac. Sed nec venenatis purus. Quisque non felis purus. Proin semper posuere consequat. Mauris urna erat, varius sit amet porttitor dictum, pulvinar vel nisl. Vivamus posuere, metus sit amet euismod mollis, massa mi fringilla velit, et luctus nisl lectus nec sem. Proin ultricies, enim eget sollicitudin pharetra, dui tellus scelerisque justo, sagittis egestas augue quam tristique odio. Duis sodales congue lacus sit amet sagittis. Duis ante erat, sollicitudin vel vestibulum id, tincidunt eu lorem. Vestibulum eros felis, imperdiet ut interdum ut, gravida pulvinar elit. Donec id tincidunt leo, a dapibus purus. Fusce tempus hendrerit nibh, in venenatis tortor dignissim non. Donec rhoncus egestas urna, id eleifend dolor egestas non. In facilisis diam vitae sapien eleifend sollicitudin. Vivamus viverra sapien volutpat lacus finibus feugiat. Curabitur eget est pellentesque, porta dui nec, vestibulum velit. Morbi molestie erat eu arcu blandit, nec consectetur nibh consectetur. In vitae tortor in dui ultrices vulputate at non mauris. Suspendisse rutrum fermentum neque, gravida vulputate justo elementum ac. Quisque tincidunt blandit condimentum. Aliquam in enim urna. Aliquam laoreet ut odio sit amet sollicitudin. Etiam efficitur facilisis metus. Maecenas molestie dui quis maximus pharetra. Pellentesque id ligula mattis, tempus elit ut, vehicula dui. Fusce vel euismod nunc, eget luctus ipsum. Nunc sit amet lorem a tortor malesuada condimentum a ac sem. Phasellus mollis congue commodo. Maecenas mi quam, vehicula lobortis mattis ac, posuere in nunc. Curabitur tempor odio leo, at gravida nulla lobortis ut. Aliquam hendrerit, nisl vitae ornare sollicitudin, lacus nisl posuere urna, quis rutrum nibh lorem ullamcorper mi. Aenean lacinia orci ut pellentesque sodales. Donec molestie sapien ac lorem egestas, sit amet finibus justo feugiat. Donec vel quam odio. Cras iaculis, massa at molestie aliquet, arcu purus aliquam leo, vel semper orci lorem consequat ex. Ut lectus orci, gravida eget ullamcorper in, fringilla sed urna. Quisque massa leo, pretium sed auctor in, imperdiet eu nisl. Duis eleifend vestibulum ultricies. Mauris faucibus, elit at vulputate tincidunt, massa nibh fermentum neque, ut blandit diam enim sit amet nibh. Proin non venenatis erat. Etiam scelerisque risus at risus vestibulum, id tristique dui sagittis. Donec sit amet ante id magna ornare cursus. Curabitur quis est eleifend, maximus felis eget, porta sem. Mauris est nisi, rhoncus ut rutrum vitae, eleifend vitae felis. Mauris id turpis quis quam auctor sodales sit amet nec turpis. Fusce consectetur id enim et aliquet. Aenean est lacus, euismod ut turpis quis, fringilla interdum lacus. Proin mollis luctus orci. Etiam ac porttitor eros, id condimentum sem. Nam lectus eros, cursus eget molestie at, finibus vel justo. Donec laoreet massa sed nisl semper, vel euismod arcu volutpat. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Sed sed mi ullamcorper, viverra eros at, imperdiet nibh. Donec urna justo, laoreet in enim vitae, iaculis tempus leo. Nullam at augue tortor. Fusce quis fermentum tortor. Donec eget erat interdum, tempus augue non, ultrices odio. Integer maximus nulla ipsum. Cras eleifend magna at orci dignissim aliquet nec ac libero. Pellentesque accumsan orci at eros sagittis, eu efficitur nunc finibus. Donec ligula urna, dapibus ac aliquet et, dignissim at massa. Aenean nulla libero, interdum sed maximus nec, hendrerit imperdiet arcu. Morbi venenatis scelerisque pretium. Quisque in lectus sagittis, tempor elit eu, fringilla arcu. Nam malesuada leo id eleifend volutpat. Integer tincidunt auctor justo eget auctor. Phasellus accumsan tortor non purus aliquet, at sollicitudin lacus vestibulum. Donec id nunc sem. Morbi semper leo vitae libero lacinia accumsan. Proin condimentum finibus feugiat. Praesent purus mi, egestas non mauris sit amet, egestas cursus nisi. Morbi dui lectus, porttitor vitae libero ac, viverra posuere nunc. In sit amet est mauris. Nam dapibus augue eu nibh sagittis, sed pharetra tortor finibus. Nam ut sagittis ante. Nunc lectus felis, aliquet eu tortor eu, sodales rhoncus orci. Pellentesque semper nulla in massa pulvinar rutrum. Sed dui arcu, efficitur eget lacus sagittis, aliquet dictum tellus. Etiam ultrices velit quis ante fringilla lobortis. Cras lacinia ultricies augue vel scelerisque. Nam egestas velit nec ultrices tincidunt. Curabitur consectetur ut mi ut lacinia. Ut fermentum porttitor ex vulputate congue. Integer ac sem vitae nunc maximus varius. Nunc iaculis nec dui eu laoreet. Praesent sit amet consectetur felis, quis cursus arcu. Suspendisse iaculis nisl eu felis porttitor laoreet volutpat nec odio. Proin feugiat dui a eros tempor convallis. Mauris a augue tristique, maximus ex sed, efficitur libero. Donec ac lorem eget tortor fermentum cursus ac ut nisl. Aliquam nunc nibh, tincidunt quis libero sed, ultrices elementum risus. Suspendisse leo augue, tristique quis aliquet ut, finibus vitae erat. Pellentesque id orci nec turpis scelerisque dignissim. Nunc eu vulputate ante, eu iaculis felis. Cras nec nulla vitae ante mollis aliquam sed eget metus. Sed pellentesque quam orci, id bibendum ligula luctus at. Morbi facilisis dignissim nisl eget vehicula. Integer nunc ex, hendrerit semper quam ac, placerat volutpat nisi. Nunc rhoncus nisi ut arcu mollis sagittis. Etiam hendrerit arcu eu efficitur accumsan. Pellentesque eget facilisis nunc. Pellentesque interdum massa ultricies porttitor congue. Suspendisse purus sem, accumsan nec pulvinar nec, tincidunt in est. Maecenas consectetur, mauris in porttitor efficitur, ipsum sem tristique neque, quis aliquet nibh orci feugiat mauris. Aliquam efficitur iaculis eros in varius. Curabitur rutrum venenatis diam ut facilisis. Nulla vel vestibulum augue, vel commodo neque. Ut venenatis, diam congue malesuada eleifend, leo sem volutpat mauris, sit amet pretium magna ante ut risus. Duis arcu mi, tempus et dapibus et, pharetra vel massa. Maecenas at condimentum urna. Sed vestibulum interdum nunc id varius. Aenean id semper nulla. Proin suscipit blandit sem at dictum. Sed ac ligula quis nibh tincidunt pharetra. In placerat convallis nibh, eu efficitur turpis volutpat vel. Sed consectetur dignissim massa in tempus. In eleifend pulvinar est id interdum. Vivamus aliquam mollis velit ac porta. Phasellus odio quam, consequat vitae dignissim vitae, volutpat sed nulla. Quisque eu dolor a velit auctor eleifend in a justo. Nullam finibus faucibus ex pulvinar porttitor. Nullam vehicula magna eu egestas aliquet. Vestibulum sed ligula aliquam turpis iaculis accumsan. Pellentesque ullamcorper, dolor porttitor congue sollicitudin, arcu metus egestas ipsum, id varius felis quam id leo. Vivamus tincidunt mattis ligula, id commodo orci pellentesque id. Donec eget augue quis orci interdum ultrices. Nulla et vehicula turpis, et vulputate arcu. Aenean sed eleifend libero. Vestibulum faucibus est ut nisl egestas malesuada. Aliquam erat volutpat. Aliquam vulputate maximus metus, nec vehicula nibh volutpat et. Ut euismod ullamcorper diam id finibus. Pellentesque vulputate purus id lorem vulputate, ut vulputate dui aliquam. Etiam at luctus tortor. Sed pretium eu erat quis lobortis. Aenean finibus, arcu non facilisis semper, lorem magna consectetur libero, in hendrerit diam ligula eget felis. Aenean tristique sem nibh, et ultrices metus vestibulum non. Duis porta imperdiet commodo. Mauris porttitor nibh eu neque volutpat, a condimentum mi sodales. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Maecenas accumsan nisl eu augue convallis porta. Nullam at purus tincidunt libero commodo laoreet nec pellentesque risus. Cras id nisl convallis orci sodales ullamcorper imperdiet id urna. Maecenas imperdiet ligula tellus, in lacinia ligula tempor eu. Duis malesuada, mauris quis tincidunt facilisis, mi lectus aliquam ante, non vestibulum nulla mi dapibus mi. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris commodo neque nisi, iaculis volutpat sapien malesuada eu. Aliquam ac arcu sed mi congue pretium. Nullam in mi at velit mattis sodales. Nullam fermentum, leo sed egestas vestibulum, lectus risus rutrum lorem, sed fermentum lorem ex ut ante. Mauris lobortis turpis et aliquam mollis. In hac habitasse platea dictumst. Quisque risus nisl, iaculis nec volutpat vel, porta non augue. In hac habitasse platea dictumst. Praesent mollis ex sem, vel maximus ligula feugiat id. Donec bibendum egestas commodo. Suspendisse quis accumsan mi. Mauris facilisis ligula ut mauris vestibulum porta. Vestibulum purus justo, interdum vel nulla non, vestibulum porta lorem. In dignissim, elit eget scelerisque aliquam, augue arcu feugiat felis, vel laoreet massa nunc non leo. Aliquam erat volutpat. Nullam a metus nec augue iaculis auctor. Ut varius augue eget tortor pulvinar cursus. Quisque suscipit magna nec massa scelerisque ullamcorper. Sed bibendum ipsum at felis ornare viverra. Nam ornare augue id justo auctor, nec viverra nisl dapibus. Nullam dictum magna ac magna varius, eget cursus nulla tempor. Morbi urna nisl, dignissim id nibh eu, faucibus ullamcorper eros. Etiam interdum odio eu sem gravida, et condimentum tortor porta. Donec congue metus augue, a efficitur ipsum fringilla a. Cras ullamcorper felis nisi, ut ultricies ante venenatis et. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vestibulum egestas arcu convallis arcu pretium aliquam. Nullam efficitur sed elit ac porttitor. Nam fermentum gravida pharetra. Nunc euismod nullam. gnustep-base-1.29.0/Tests/base/NSData/TestInfo000066400000000000000000000000001435650067400210040ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSData/additions.m000066400000000000000000000041521435650067400214760ustar00rootroot00000000000000#import #import "Testing.h" #import "GNUstepBase/GSConfig.h" #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; START_SET("NSData Additions") #if USE_ZLIB NSData *data; NSData *ref; NSUInteger last; NSUInteger length; ref = [NSData dataWithContentsOfFile: @"Lorum"]; PASS(NO == [ref isGzipped], "Reference data is not gzipped"); data = [ref gzipped: 0]; PASS(YES == [data isGzipped], "We can gzip with compression 0"); length = [data length]; PASS(length > [ref length], "Compression 0 does not compress"); PASS_EQUAL([data gunzipped], ref, "gunzipped 0 matches reference"); data = [ref gzipped: 1]; length = [data length]; PASS(length < [ref length], "Compression 1 does compress"); last = length; PASS_EQUAL([data gunzipped], ref, "gunzipped 1 matches reference"); data = [ref gzipped: 3]; length = [data length]; PASS(length < last, "Compression 3 is smaller than 1"); last = length; PASS_EQUAL([data gunzipped], ref, "gunzipped 3 matches reference"); data = [ref gzipped: 5]; length = [data length]; PASS(length < last, "Compression 5 is smaller than 3"); last = length; PASS_EQUAL([data gunzipped], ref, "gunzipped 5 matches reference"); data = [ref gzipped: 9]; length = [data length]; PASS(length < last, "Compression 9 is smaller than 5"); last = length; PASS_EQUAL([data gunzipped], ref, "gunzipped 9 matches reference"); data = [NSData data]; PASS(NO == [data isGzipped], "An empty data is not gzipped"); data = [data gzipped: -1]; PASS(YES == [data isGzipped], "An empty can be gzipped"); data = [data gzipped: -1]; PASS(YES == [data isGzipped], "An empty can be gzipped twice"); data = [data gunzipped]; PASS(YES == [data isGzipped], "Partial gunzip is still gzipped"); data = [data gunzipped]; PASS(NO == [data isGzipped], "Complete gunzip is not gzipped"); PASS(0 == [data length], "Complete gunzip is empty"); #else SKIP("zlib support disabled"); #endif END_SET("NSData Additions") [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSData/base64.m000066400000000000000000000144621435650067400206110ustar00rootroot00000000000000#import #import "Testing.h" int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSData *data; NSData *ref; NSString *str1; NSString *str2; NSString *strEnc; PASS_EXCEPTION([[NSData alloc] initWithBase64EncodedString: nil options: 0], NSInvalidArgumentException, "nil argument causes exception"); data = [[NSData alloc] initWithBase64EncodedString: @"" options: 0]; ref = [NSData data]; PASS_EQUAL(data, ref, "base64 decoding vector 1") [data release]; data = [[NSData alloc] initWithBase64EncodedString: @"Zg==" options: 0]; ref = [NSData dataWithBytes: "f" length: 1]; PASS_EQUAL(data, ref, "base64 decoding vector 2") [data release]; data = [[NSData alloc] initWithBase64EncodedString: @"Zm8=" options: 0]; ref = [NSData dataWithBytes: "fo" length: 2]; PASS_EQUAL(data, ref, "base64 decoding vector 3") [data release]; data = [[NSData alloc] initWithBase64EncodedString: @"Zm9v" options: 0]; ref = [NSData dataWithBytes: "foo" length: 3]; PASS_EQUAL(data, ref, "base64 decoding vector 4") [data release]; data = [[NSData alloc] initWithBase64EncodedString: @"Zm9vYg==" options: 0]; ref = [NSData dataWithBytes: "foob" length: 4]; PASS_EQUAL(data, ref, "base64 decoding vector 5") [data release]; data = [[NSData alloc] initWithBase64EncodedString: @"Zm9vYmE=" options: 0]; ref = [NSData dataWithBytes: "fooba" length: 5]; PASS_EQUAL(data, ref, "base64 decoding vector 6") [data release]; data = [[NSData alloc] initWithBase64EncodedString: @"Zm9vYmE==" options: 0]; ref = [NSData dataWithBytes: "fooba" length: 5]; PASS_EQUAL(data, ref, "base64 decoding vector 6 with 1 extra padding") [data release]; data = [[NSData alloc] initWithBase64EncodedString: @"Zm9vYmE=====" options: 0]; ref = [NSData dataWithBytes: "fooba" length: 5]; PASS_EQUAL(data, ref, "base64 decoding vector 6 with 4 extra padding") [data release]; data = [[NSData alloc] initWithBase64EncodedString: @"Zm9vYmFy" options: 0]; ref = [NSData dataWithBytes: "foobar" length: 6]; PASS_EQUAL(data, ref, "base64 decoding vector 7") [data release]; data = [[NSData alloc] initWithBase64EncodedString: @"Zm9vYmFy=====" options: 0]; ref = [NSData dataWithBytes: "foobar\0" length: 7]; PASS_EQUAL(data, ref, "base64 decoding excess padding gives single nul byte") [data release]; data = [[NSData alloc] initWithBase64EncodedString: @"Zm9v YmFy" options: 0]; PASS_EQUAL(data, nil, "base64 decoding with space returns nil") [data release]; data = [[NSData alloc] initWithBase64EncodedString: @"Zm9v YmFy" options: NSDataBase64DecodingIgnoreUnknownCharacters]; ref = [NSData dataWithBytes: "foobar" length: 6]; PASS_EQUAL(data, ref, "base64 decoding vector 8") [data release]; str1 = @"In principio creavit Deus caelum et terram.\nTerra autem erat inanis et vacua, et tenebrae super faciem abyssi, et spiritus Dei ferebatur super aquas.\nDixitque Deus: \"Fiat lux\". Et facta est lux."; data = [str1 dataUsingEncoding: NSASCIIStringEncoding]; strEnc = [data base64EncodedStringWithOptions:0]; data = [[NSData alloc] initWithBase64EncodedString: strEnc options: 0]; str2 = [[NSString alloc] initWithData: data encoding: NSASCIIStringEncoding]; PASS_EQUAL(str1, str2, "Encode / Decode no lines") [str2 release]; str1 = @"In principio creavit Deus caelum et terram.\nTerra autem erat inanis et vacua, et tenebrae super faciem abyssi, et spiritus Dei ferebatur super aquas.\nDixitque Deus: \"Fiat lux\". Et facta est lux."; data = [str1 dataUsingEncoding: NSASCIIStringEncoding]; strEnc = [data base64EncodedStringWithOptions: (NSDataBase64Encoding64CharacterLineLength | NSDataBase64EncodingEndLineWithLineFeed)]; data = [[NSData alloc] initWithBase64EncodedString: strEnc options: NSDataBase64DecodingIgnoreUnknownCharacters]; str2 = [[NSString alloc] initWithData: data encoding: NSASCIIStringEncoding]; PASS_EQUAL(str1, str2, "Encode / Decode 64 - LF") [str2 release]; str1 = @"In principio creavit Deus caelum et terram.\nTerra autem erat inanis et vacua, et tenebrae super faciem abyssi, et spiritus Dei ferebatur super aquas.\nDixitque Deus: \"Fiat lux\". Et facta est lux."; data = [str1 dataUsingEncoding: NSASCIIStringEncoding]; strEnc = [data base64EncodedStringWithOptions: (NSDataBase64Encoding76CharacterLineLength | NSDataBase64EncodingEndLineWithLineFeed)]; data = [[NSData alloc] initWithBase64EncodedString: strEnc options: NSDataBase64DecodingIgnoreUnknownCharacters]; str2 = [[NSString alloc] initWithData: data encoding: NSASCIIStringEncoding]; PASS_EQUAL(str1, str2, "Encode / Decode 76 - LF") [str2 release]; str1 = @"In principio creavit Deus caelum et terram.\nTerra autem erat inanis et vacua, et tenebrae super faciem abyssi, et spiritus Dei ferebatur super aquas.\nDixitque Deus: \"Fiat lux\". Et facta est lux."; data = [str1 dataUsingEncoding: NSASCIIStringEncoding]; strEnc = [data base64EncodedStringWithOptions: (NSDataBase64Encoding64CharacterLineLength | NSDataBase64EncodingEndLineWithCarriageReturn)]; data = [[NSData alloc] initWithBase64EncodedString: strEnc options: NSDataBase64DecodingIgnoreUnknownCharacters]; str2 = [[NSString alloc] initWithData: data encoding: NSASCIIStringEncoding]; PASS_EQUAL(str1, str2, "Encode / Decode 64 - CR") [str2 release]; str1 = @"In principio creavit Deus caelum et terram.\nTerra autem erat inanis et vacua, et tenebrae super faciem abyssi, et spiritus Dei ferebatur super aquas.\nDixitque Deus: \"Fiat lux\". Et facta est lux."; data = [str1 dataUsingEncoding: NSASCIIStringEncoding]; strEnc = [data base64EncodedStringWithOptions: NSDataBase64Encoding64CharacterLineLength]; data = [[NSData alloc] initWithBase64EncodedString: strEnc options: NSDataBase64DecodingIgnoreUnknownCharacters]; str2 = [[NSString alloc] initWithData: data encoding: NSASCIIStringEncoding]; PASS_EQUAL(str1, str2, "Encode / Decode 64 - implicit CR LF") [str2 release]; data = [[NSData alloc] initWithBase64EncodedString: @"Yml0bWFya2V0cyB1c2VyIGluZGVudGl0eQ==\n" options: NSDataBase64DecodingIgnoreUnknownCharacters]; ref = [NSData dataWithBytes: "bitmarkets user indentity" length: 25]; PASS_EQUAL(data, ref, "base64 decoding Yml0bWFya2V0cyB1c2VyIGluZGVudGl0eQ==") [data release]; [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSData/basic.m000066400000000000000000000012561435650067400206030ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; id testObject = [NSData new]; test_alloc(@"NSData"); test_NSObject(@"NSData",[NSArray arrayWithObject:testObject]); test_NSCoding([NSArray arrayWithObject:testObject]); test_keyed_NSCoding([NSArray arrayWithObject:testObject]); test_NSCopying(@"NSData", @"NSMutableData", [NSArray arrayWithObject:testObject], NO, NO); test_NSMutableCopying(@"NSData", @"NSMutableData", [NSArray arrayWithObject:testObject]); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSData/general.m000066400000000000000000000117331435650067400211400ustar00rootroot00000000000000#import "Testing.h" #import "ObjectTesting.h" #import #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; char *str1,*str2; NSData *data1, *data2; NSMutableData *mutable; char *hold; str1 = "Test string for data classes"; str2 = (char *) malloc(sizeof("Test string for data classes not copied")); strcpy(str2,"Test string for data classes not copied"); mutable = [NSMutableData dataWithLength:100]; hold = [mutable mutableBytes]; /* hmpf is this correct */ data1 = [NSData dataWithBytes:str1 length:(strlen(str1) * sizeof(void*))]; PASS(data1 != nil && [data1 isKindOfClass:[NSData class]] && [data1 length] == (strlen(str1) * sizeof(void*)) && [data1 bytes] != str1 && strcmp(str1,[data1 bytes]) == 0, "+dataWithBytes:length: works"); data2 = [NSData dataWithBytesNoCopy:str2 length:(strlen(str2) * sizeof(void*))]; PASS(data2 != nil && [data2 isKindOfClass:[NSData class]] && [data2 length] == (strlen(str2) * sizeof(void*)) && [data2 bytes] == str2, "+dataWithBytesNoCopy:length: works"); data1 = [NSData dataWithBytes:nil length:0]; PASS(data1 != nil && [data1 isKindOfClass:[NSData class]] && [data1 length] == 0, "+dataWithBytes:length works with 0 length"); [data2 getBytes:hold range:NSMakeRange(2,6)]; PASS(strcmp(hold,"st str") == 0, "-getBytes:range works"); PASS_EXCEPTION([data2 getBytes:hold range:NSMakeRange(strlen(str2)*sizeof(void*),1)];, NSRangeException, "getBytes:range: with bad location"); PASS_EXCEPTION([data2 getBytes:hold range:NSMakeRange(1,(strlen(str2)*sizeof(void*)))];, NSRangeException, "getBytes:range: with bad length"); PASS_EXCEPTION([data2 subdataWithRange:NSMakeRange((strlen(str2)*sizeof(void*)),1)];, NSRangeException, "-subdataWithRange: with bad location"); PASS_EXCEPTION([data2 subdataWithRange:NSMakeRange(1,(strlen(str2)*sizeof(void*)))];, NSRangeException, "-subdataWithRange: with bad length"); data2 = [NSData dataWithBytesNoCopy:str1 length:(strlen(str1) * sizeof(void*)) freeWhenDone:NO]; PASS(data2 != nil && [data2 isKindOfClass:[NSData class]] && [data2 length] == (strlen(str1) * sizeof(void*)) && [data2 bytes] == str1, "+dataWithBytesNoCopy:length:freeWhenDone: works"); [arp release]; arp = nil; { BOOL didNotSegfault = YES; PASS(didNotSegfault, "+dataWithBytesNoCopy:length:freeWhenDone:NO doesn't free memory"); } START_SET("deallocator blocks") # ifndef __has_feature # define __has_feature(x) 0 # endif # if __has_feature(blocks) uint8_t stackBuf[4] = { 1, 2, 3, 5 }; __block NSUInteger called = 0; NSData *immutable = [[NSData alloc] initWithBytesNoCopy: stackBuf length: 4 deallocator: ^(void* bytes, NSUInteger length) { called++; }]; PASS([immutable length] == 4, "Length set"); PASS([immutable bytes] == stackBuf, "Bytes set"); PASS_RUNS([immutable release]; immutable = nil;, "No free() error with custom deallocator"); PASS(called == 1, "Deallocator block called"); uint8_t *buf = malloc(4 * sizeof(uint8_t)); NSMutableData *mutable = [[NSMutableData alloc] initWithBytesNoCopy: buf length: 4 deallocator: ^(void *bytes, NSUInteger len) { free(bytes); called++; } ]; PASS([mutable length] == 4, "Length set"); PASS([mutable bytes] == buf, "Bytes set"); PASS_RUNS([mutable release]; mutable = nil;, "No free() error with custom deallocator on mutable data"); PASS(called == 2, "Deallocator block called on -dealloc of mutable data"); buf = malloc(4 * sizeof(uint8_t)); mutable = [[NSMutableData alloc] initWithBytesNoCopy: buf length: 4 deallocator: ^(void *bytes, NSUInteger len) { free(bytes); called++; } ]; PASS_RUNS([mutable setCapacity: 10];, "Can set capactiy with custom deallocator on mutable data"); PASS(called == 3, "Deallocator block called on -setCapacity: of mutable data"); PASS_RUNS([mutable release]; mutable = nil;, "No free() error with custom deallocator on mutable data " "after capacity change"); PASS(called == 3, "Deallocator block not called on -dealloc of mutable data " "after its capacity has been changed"); # else SKIP("No Blocks support in the compiler.") # endif END_SET("deallocator blocks") return 0; } gnustep-base-1.29.0/Tests/base/NSData/search.m000066400000000000000000000050501435650067400207630ustar00rootroot00000000000000#import #import "Testing.h" static BOOL rangesEqual(NSRange r1, NSRange r2) { if (&r1 == &r2) return YES; if (r1.length == 0 && r2.length == 0) return YES; return (r1.length == r2.length && r1.location == r2.location); } static void dataRange(char *s0, char *s1, NSDataSearchOptions opts, NSRange range, NSRange want) { NSData *d0 = [NSData dataWithBytes:s0 length:strlen(s0)]; NSData *d1 = [NSData dataWithBytes:s1 length:strlen(s1)]; NSRange res = [d0 rangeOfData:d1 options:opts range:range]; PASS(rangesEqual(res,want), "NSData range for '%s' and '%s' is ok",s0,s1); } int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; /* Borrowed from NSString/test00.m */ dataRange("hello", "hello", NSDataSearchAnchored, NSMakeRange(0,5), NSMakeRange(0,5)); dataRange("hello", "hello", NSDataSearchAnchored | NSDataSearchBackwards, NSMakeRange(0,5), NSMakeRange(0,5)); dataRange("hello", "hElLo", 0, NSMakeRange(0,5), NSMakeRange(NSNotFound,0)); dataRange("hello", "hell", NSDataSearchAnchored, NSMakeRange(0,5), NSMakeRange(0,4)); dataRange("hello", "hell", NSDataSearchAnchored | NSDataSearchBackwards, NSMakeRange(0,4), NSMakeRange(0,4)); dataRange("hello", "ello", NSDataSearchAnchored, NSMakeRange(0,5), NSMakeRange(NSNotFound,0)); dataRange("hello", "hel", NSDataSearchBackwards, NSMakeRange(0,5), NSMakeRange(0,3)); dataRange("hello", "he", 0, NSMakeRange(0,5), NSMakeRange(0,2)); dataRange("hello", "h", 0, NSMakeRange(0,5), NSMakeRange(0,1)); dataRange("hello", "l", 0, NSMakeRange(0,5), NSMakeRange(2,1)); dataRange("hello", "l", NSDataSearchBackwards, NSMakeRange(0,5), NSMakeRange(3,1)); dataRange("hello", "", 0, NSMakeRange(0,5), NSMakeRange(0,0)); dataRange("hello", "el", 0, NSMakeRange(0,5), NSMakeRange(1,2)); dataRange("hello", "el", 0, NSMakeRange(0,2), NSMakeRange(0,0)); dataRange("hello", "el", 0, NSMakeRange(2,3), NSMakeRange(0,0)); dataRange("hello", "ell", 0, NSMakeRange(0,5), NSMakeRange(1,3)); dataRange("hello", "lo", 0, NSMakeRange(2,3), NSMakeRange(3,2)); dataRange("boaboaboa", "abo", 0, NSMakeRange(0,9), NSMakeRange(2,3)); dataRange("boaboaboa", "abo", NSDataSearchBackwards, NSMakeRange(0,9), NSMakeRange(5,3)); dataRange("", "", 0, NSMakeRange(0,0), NSMakeRange(0,0)); dataRange("x", "", 0, NSMakeRange(0,1), NSMakeRange(0,0)); dataRange("x", "", NSDataSearchBackwards, NSMakeRange(0,1), NSMakeRange(1,0)); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSDate/000077500000000000000000000000001435650067400173445ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSDate/TestInfo000066400000000000000000000000001435650067400210100ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSDate/basic.m000066400000000000000000000007631435650067400206110ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; id testObj = [NSDate new]; test_NSObject(@"NSDate",[NSArray arrayWithObject:[NSDate new]]); test_NSCoding([NSArray arrayWithObject:testObj]); test_keyed_NSCoding([NSArray arrayWithObject:testObj]); test_NSCopying(@"NSDate",@"NSDate",[NSArray arrayWithObject:testObj],NO,NO); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSDate/create.m000066400000000000000000000037051435650067400207720ustar00rootroot00000000000000#import "Testing.h" #import #import #import #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSString *val; NSDate *date1; NSCalendarDate *date2; val = @"2000-10-19 00:00:00 +0000"; date1 = [NSDate date]; PASS(date1 != nil && [date1 isKindOfClass:[NSDate class]], "+date works"); date1 = [NSDate dateWithString:val]; PASS(date1 != nil && [date1 isKindOfClass:[NSDate class]], "+dateWithString works"); date2 = [NSCalendarDate dateWithTimeIntervalSinceReferenceDate: [date1 timeIntervalSinceReferenceDate]]; PASS(date2 != nil && [date2 isKindOfClass:[NSDate class]], "+dateWithTimeIntervalSinceReferenceDate: works"); // Make sure we get day in correct zone. [date2 setTimeZone: [NSTimeZone timeZoneForSecondsFromGMT: 0]]; PASS([date2 dayOfMonth] == 19, "+dateWithString makes correct day"); PASS([date2 monthOfYear] == 10, "+dateWithString makes correct month"); PASS([date2 yearOfCommonEra] == 2000, "+dateWithString makes correct year"); date1 = [NSDate dateWithTimeIntervalSinceNow:0]; PASS(date1 != nil && [date1 isKindOfClass:[NSDate class]], "+dateWithTimeIntervalSinceNow: works"); date1 = [NSDate dateWithTimeIntervalSince1970:0]; PASS(date1 != nil && [date1 isKindOfClass:[NSDate class]], "+dateWithTimeIntervalSince1970: works"); date1 = [NSDate dateWithTimeIntervalSinceReferenceDate:0]; PASS(date1 != nil && [date1 isKindOfClass:[NSDate class]], "+dateWithTimeIntervalSinceReferenceDate: works"); date1 = [NSDate distantFuture]; PASS(date1 != nil && [date1 isKindOfClass:[NSDate class]], "+distantFuture works"); date1 = [NSDate distantPast]; PASS(date1 != nil && [date1 isKindOfClass:[NSDate class]], "+distantPast works"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSDate/general.m000066400000000000000000000015371435650067400211450ustar00rootroot00000000000000#import "Testing.h" #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSDate *cdate, *date1, *date2; NSComparisonResult comp; cdate = [NSDate date]; comp = [cdate compare: [NSDate distantFuture]]; PASS(comp == NSOrderedAscending, "+distantFuture is in the future"); comp = [cdate compare: [NSDate distantPast]]; PASS(comp == NSOrderedDescending, "+distantPast is in the past"); date1 = [NSDate dateWithTimeIntervalSinceNow:-600]; date2 = [cdate earlierDate: date1]; PASS(date1 == date2, "-earlierDate works"); date2 = [cdate laterDate: date1]; PASS(cdate == date2, "-laterDate works"); date2 = [date1 addTimeInterval:0]; PASS ([date1 isEqualToDate:date2], "-isEqualToDate works"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSDateFormatter/000077500000000000000000000000001435650067400212305ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSDateFormatter/TestInfo000066400000000000000000000000001435650067400226740ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSDateFormatter/general.m000066400000000000000000000074311435650067400230300ustar00rootroot00000000000000#import #import #import #import #import #import #import "Testing.h" #if defined(GS_USE_ICU) #define NSLOCALE_SUPPORTED GS_USE_ICU #else #define NSLOCALE_SUPPORTED 1 /* Assume Apple support */ #endif static NSDateComponents * timeFromString(NSString *s) { NSDateFormatter *dateFormatter; NSDate *date; NSCalendar *calendar; NSDateComponents *time; dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat: @"HH:mm:ss"]; date = [dateFormatter dateFromString: s]; calendar = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar]; time = [calendar components: (NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond) fromDate: date]; RELEASE(calendar); RELEASE(dateFormatter); return time; } int main(void) { NSDateFormatter *inFmt; NSDateFormatter *outFmt; NSDate *date; NSString *str; NSLocale *locale; NSCalendar *cal; unsigned int components; NSInteger year; START_SET("NSDateFormatter") if (!NSLOCALE_SUPPORTED) SKIP("NSLocale not supported\nThe ICU library was not available when GNUstep-base was built") [NSTimeZone setDefaultTimeZone: [NSTimeZone timeZoneWithName: @"GMT"]]; inFmt = [[NSDateFormatter alloc] init]; [inFmt setDateFormat: @"yyyy-MM-dd 'at' HH:mm"]; date = [inFmt dateFromString: @"2011-01-27 at 17:36"]; outFmt = [[NSDateFormatter alloc] init]; [outFmt setLocale: [[NSLocale alloc] initWithLocaleIdentifier: @"pt_BR"]]; [outFmt setDateFormat: @"HH:mm 'on' EEEE MMMM d"]; str = [outFmt stringFromDate: date]; PASS_EQUAL(str, @"17:36 on quinta-feira janeiro 27", "Output has the same format as Cocoa.") RELEASE(outFmt); RELEASE(inFmt); locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_GB"]; inFmt = [NSDateFormatter new]; [inFmt setDateStyle: NSDateFormatterShortStyle]; [inFmt setTimeStyle: NSDateFormatterNoStyle]; [inFmt setLocale: locale]; [inFmt setTimeZone: [NSTimeZone timeZoneWithName: @"GMT"]]; date = [inFmt dateFromString: @"15/06/1982"]; PASS_EQUAL([date description], @"1982-06-15 00:00:00 +0000", "GMT time zone is correctly accounted for."); [inFmt setTimeZone: [NSTimeZone timeZoneWithName: @"EST"]]; date = [inFmt dateFromString: @"15/06/1982"]; PASS_EQUAL([date description], @"1982-06-15 05:00:00 +0000", "EST time zone is correctly accounted for."); RELEASE(inFmt); cal = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar]; [cal setTimeZone: [NSTimeZone timeZoneWithName: @"CST"]]; [cal setLocale: locale]; components = NSYearCalendarUnit; year = [[cal components: components fromDate: date] year]; inFmt = [NSDateFormatter new]; [inFmt setLocale: locale]; [inFmt setDateStyle: NSDateFormatterLongStyle]; [inFmt setTimeStyle: NSDateFormatterNoStyle]; str = [inFmt stringFromDate: date]; PASS (year == 1982, "Year is 1982"); PASS_EQUAL(str, @"15 June 1982", "Date is formatted correctly."); RELEASE(cal); RELEASE(inFmt); str = [NSDateFormatter dateFormatFromTemplate: @"MMMdd" options: 0 locale: locale]; PASS_EQUAL(str, @"dd MMM", "Convert date format as Cocoa."); RELEASE(locale); NSDateComponents *d = timeFromString(@"23:24:25"); PASS(d != nil && [d hour] == 23 && [d minute] == 24 && [d second] == 25, "parsing 23:24:25 is OK") d = timeFromString(@"24:00:00"); PASS(d != nil && [d hour] == 0 && [d minute] == 0 && [d second] == 0, "parsing 24:00:00 gives zero hour, minute and second") END_SET("NSDateFormatter") return 0; } gnustep-base-1.29.0/Tests/base/NSDictionary/000077500000000000000000000000001435650067400205745ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSDictionary/TestInfo000066400000000000000000000000001435650067400222400ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSDictionary/basic.m000066400000000000000000000030001435650067400220240ustar00rootroot00000000000000#import "Testing.h" #import "ObjectTesting.h" #import #import #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSMutableArray *testObjs = [NSMutableArray new]; NSDictionary *obj; test_alloc(@"NSDictionary"); obj = [NSDictionary new]; [testObjs addObject:obj]; PASS(obj != nil && [obj isKindOfClass:[NSDictionary class]] && [obj count] == 0, "can create an empty dictionary"); obj = [NSDictionary dictionaryWithObject:@"Hello" forKey:@"Key"]; [testObjs addObject:obj]; PASS(obj != nil && [obj isKindOfClass:[NSDictionary class]] && [obj count] == 1, "can create a dictionary with one element"); test_NSObject(@"NSDictionary", testObjs); test_NSCoding(testObjs); test_keyed_NSCoding(testObjs); test_NSCopying(@"NSDictionary", @"NSMutableDictionary", testObjs, YES, NO); test_NSMutableCopying(@"NSDictionary", @"NSMutableDictionary", testObjs); START_SET("NSDictionary subscripting") # ifndef __has_feature # define __has_feature(x) 0 # endif #if __has_feature(objc_subscripting) NSDictionary *dictionary = @{@123 : @123.4 , @"date" : @"today" }; PASS([dictionary[@123] isEqual: @123.4], "Dictionary subscripting works"); # else SKIP("No dictionary subscripting support in the compiler.") # endif END_SET("NSDictionary subscripting") [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSDictionary/blocks.m000066400000000000000000000033401435650067400222270ustar00rootroot00000000000000#import "Testing.h" #import #import #import #import #import #import #import #import #import #import #if defined(GNUSTEP_BASE_LIBRARY) #import #endif static NSUInteger fooCount = 0; int main() { START_SET("NSDictionary Blocks") # ifndef __has_feature # define __has_feature(x) 0 # endif # if __has_feature(blocks) NSAutoreleasePool *arp = [NSAutoreleasePool new]; __block NSLock *fooLock = [NSLock new]; NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: @"foo", @"key1", @"bar", @"key2", @"foo", @"key3", nil]; void(^enumBlock)(id,id,BOOL*) = ^(id key, id obj, BOOL *stop){ if ([obj isEqual: @"foo"]){ [fooLock lock]; fooCount++; [fooLock unlock];}}; [dict enumerateKeysAndObjectsUsingBlock: enumBlock]; PASS((2 == fooCount), "Can enumerate dictionary using a block"); fooCount = 0; [dict enumerateKeysAndObjectsWithOptions: NSEnumerationConcurrent usingBlock: enumBlock]; PASS((2 == fooCount), "Can enumerate dictionary concurrently using a block"); NSSet *fooKeys = [dict keysOfEntriesPassingTest: ^(id key, id obj, BOOL *stop){ return [obj isEqual: @"foo"];}]; PASS((([fooKeys count] == 2) && ([fooKeys containsObject: @"key1"]) && ([fooKeys containsObject: @"key3"])) , "Can use blocks as predicates."); [fooLock release]; [arp release]; arp = nil; # else SKIP("No Blocks support in the compiler.") # endif END_SET("NSDictionary Blocks") return 0; } gnustep-base-1.29.0/Tests/base/NSDictionary/create.m000066400000000000000000000054611435650067400222230ustar00rootroot00000000000000#import "Testing.h" #import "ObjectTesting.h" #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSString *key1, *key2, *key3, *val1, *val2, *val3; NSArray *keys1, *keys2, *keys3, *vals1, *vals2, *vals3; NSDictionary *obj,*old; old = nil; key1 = @"Key1"; key2 = @"Key2"; key3 = @"Key3"; keys1 = [NSArray arrayWithObjects:key1, key2, nil]; keys2 = [NSArray arrayWithObjects:key1, key2, key3, nil]; /* duplicate keys */ keys3 = [NSArray arrayWithObjects:key1, key2, key2, nil]; val1 = @"Kidnapped"; val2 = @"tied up"; val3 = @"taken away and helf for ransom"; vals1 = [NSArray arrayWithObjects:val1, val2, nil]; /* duplicate values */ vals2 = [NSArray arrayWithObjects:val1, val2, val2, nil]; vals3 = [NSArray arrayWithObjects:val1, val2, val3, nil]; obj = [NSDictionary new]; PASS(obj != nil && [obj isKindOfClass:[NSDictionary class]] && [obj count] == 0, "+new creates an empty dictionary"); obj = [NSDictionary dictionary]; PASS(obj != nil && [obj isKindOfClass:[NSDictionary class]] && [obj count] == 0, "+dictionary creates an empty dictionary"); PASS_EXCEPTION([NSDictionary dictionaryWithObject:val1 forKey:nil];, NSInvalidArgumentException, "+dictionaryWithObject:forKey: with nil key"); PASS_EXCEPTION([NSDictionary dictionaryWithObject:nil forKey:key1];, NSInvalidArgumentException, "+dictionaryWithObject:forKey: with nil value"); obj = [NSDictionary dictionaryWithObject:val1 forKey:key1]; PASS(obj != nil && [obj isKindOfClass:[NSDictionary class]] && [obj count] == 1, "+dictionaryWithObject:forKey: builds minimal dictionary"); obj = [NSDictionary dictionaryWithObjects:vals1 forKeys:keys1]; PASS(obj != nil && [obj isKindOfClass:[NSDictionary class]] && [obj count] == 2, "+dictionaryWithObjects:forKeys: builds a dictionary"); PASS_EXCEPTION([NSDictionary dictionaryWithObjects:vals1 forKeys:keys2];, NSInvalidArgumentException, "+dictionaryWithObjects:forKeys: with arrays of different sizes"); obj = [NSDictionary dictionaryWithObjects:vals2 forKeys:keys2]; PASS(obj != nil && [obj isKindOfClass:[NSDictionary class]] && [obj count] == 3, "we can have multiple identical objects in a dictionary"); obj = [NSDictionary dictionaryWithObjects:vals3 forKeys:keys3]; PASS(obj != nil && [obj isKindOfClass:[NSDictionary class]] && [obj count] == 2, "we can't have multiple identical keys in a dictionary"); old = obj; obj = [NSDictionary dictionaryWithDictionary:old]; PASS(obj != nil && [obj isEqual: old], "+dictionaryWithDictionary: copies dictionary"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSDictionary/general.m000066400000000000000000000175601435650067400224000ustar00rootroot00000000000000#import "Testing.h" #import #import #import #import #import #import #import #import #if defined(GNUSTEP_BASE_LIBRARY) #import #endif int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSString *key1, *key2, *key3, *val1, *val2, *val3; NSArray *keys1, *keys2, *keys3, *keys4, *vals1, *vals2, *vals3, *vals4; id obj; NSDictionary *dict; id vals1Array[2] = { nil, nil }; id keys1Array[2] = { nil, nil }; key1 = @"Key1"; key2 = @"Key2"; key3 = @"Key3"; val1 = @"Hello"; val2 = @"Goodbye"; val3 = @"Testing"; keys1 = [NSArray arrayWithObjects:key1,key2,nil]; keys2 = [NSArray arrayWithObjects:key1,key2,key3,nil]; keys3 = [NSArray arrayWithObjects:key1,key2,key2,nil]; /* duplicate keys */ keys4 = [NSArray arrayWithObjects:key1,key2,nil]; vals1 = [NSArray arrayWithObjects:val1,val2,nil]; vals2 = [NSArray arrayWithObjects:val1,val2,val2,nil]; /* duplicate vals */ vals3 = [NSArray arrayWithObjects:val1,val2,val3,nil]; vals4 = [NSArray arrayWithObjects:val1, val2, val3, [NSDate date], [NSNumber numberWithInt:2], [NSData data], nil]; keys4 = [NSArray arrayWithObjects:key1, key2, key2, @"date", @"number", @"data",nil]; dict = [NSDictionary new]; PASS(dict != nil && [dict isKindOfClass:[NSDictionary class]] && [dict count] == 0, "-count returns zero for an empty dictionary"); PASS([dict hash] == 0, "-hash returns zero for an empty dictionary"); obj = [dict allKeys]; PASS(obj != nil && [obj isKindOfClass:[NSArray class]] && [obj count] == 0, "-allKeys gives an empty array for an empty dictionary"); obj = [dict allKeysForObject:nil]; PASS(obj == nil, "-allKeysForObject: gives nil for an empty dictionary"); obj = [dict allValues]; PASS(obj != nil && [obj isKindOfClass:[NSArray class]] && [obj count] == 0, "-allValues gives an empty array for an empty dictionary"); { id o1; id o2; o1 = [dict objectForKey:nil]; o2 = [dict objectForKey:key1]; PASS(o1 == nil && o2 == nil, "-objectForKey: gives nil for an empty dictionary"); } { NSEnumerator *e = [dict keyEnumerator]; id k1,k2; k1 = [e nextObject]; k2 = [e nextObject]; PASS(e != nil && k1 == nil && k2 == nil, "-keyEnumerator: is ok for empty dictionary"); } { NSEnumerator *e = [dict objectEnumerator]; id v1,v2; v1 = [e nextObject]; v2 = [e nextObject]; PASS(e != nil && v1 == nil && v2 == nil, "-objectEnumerator: is ok for empty dictionary"); } { NSString *notFound = @"notFound"; NSArray *a = [dict objectsForKeys:keys1 notFoundMarker:notFound]; PASS(a != nil && [a isKindOfClass:[NSArray class]] && [a count] == 2 && [a objectAtIndex:0] == notFound && [a objectAtIndex:1] == notFound, "-objectsForKeys:notFoundMarker: is ok for empty dictionary"); } obj = [dict description]; obj = [obj propertyList]; PASS(obj != nil && [obj isKindOfClass:[NSDictionary class]] && [obj count] == 0, "-description gives us a text property-list"); dict = [[NSDictionary dictionaryWithObjects:vals1 forKeys:keys1] retain]; PASS(dict != nil && [dict isKindOfClass:[NSDictionary class]] && [dict count] == 2, "-count returns two for an dictionary with two keys"); PASS([dict hash] == 2, "-hash returns two for a dictionary with two keys"); obj = [dict allKeys]; PASS(obj != nil && [obj isKindOfClass:[NSArray class]] && [obj count] == 2 && [obj containsObject:key1] && [obj containsObject:key1], "-allKeys gives the keys we put in the dictionary"); { NSArray *o1,*o2; o1 = [dict allKeysForObject:val1]; o2 = [dict allKeysForObject:val2]; PASS(o1 != nil && [o1 isKindOfClass:[NSArray class]] && [o1 count] == 1 && [o1 containsObject:key1] && o2 != nil && [o2 isKindOfClass:[NSArray class]] && [o2 count] == 1 && [o2 containsObject:key2], "-allKeysForObject: gives the key we expect"); } obj = [dict allValues]; PASS(obj != nil && [obj isKindOfClass:[NSArray class]] && [obj count] == 2 && [obj containsObject:val1] && [obj containsObject:val2], "-allValues gives the values we put in the dictionary"); PASS([dict objectForKey:nil] == nil,"-objectForKey: gives nil for a nil key"); PASS([dict objectForKey:key3] == nil, "-objectForKey: gives nil for a key not in the dictionary"); { id o1 = [dict objectForKey: key1]; id o2 = [dict objectForKey: key2]; PASS(o1 == val1 && o2 == val2, "-objectForKey: gives the objects we added for the keys"); } { NSEnumerator *e = [dict keyEnumerator]; id k1,k2,k3; k1 = [e nextObject]; k2 = [e nextObject]; k3 = [e nextObject]; PASS(k1 != nil && k2 != nil && k3 == nil && k1 != k2 && [keys1 containsObject:k1] && [keys1 containsObject:k2], "-keyEnumerator: enumerates the dictionary"); } { NSEnumerator *e = [dict objectEnumerator]; id v1,v2,v3; v1 = [e nextObject]; v2 = [e nextObject]; v3 = [e nextObject]; PASS(v1 != nil && v2 != nil && v3 == nil && v1 != v2 && [vals1 containsObject:v1] && [vals1 containsObject:v2], "-objectEnumerator: enumerates the dictionary"); } { NSString *notFound = @"notFound"; NSArray *a = [dict objectsForKeys:keys2 notFoundMarker:notFound]; PASS(a != nil && [a isKindOfClass:[NSArray class]] && [a count] == 3 && [a objectAtIndex:0] == val1 && [a objectAtIndex:1] == val2 && [a objectAtIndex:2] == notFound, "-objectsForKeys:notFoundMarker: is ok for dictionary"); } { NSArray *a = [dict keysSortedByValueUsingSelector:@selector(compare:)]; PASS(a != nil && [a isKindOfClass:[NSArray class]] && [a count] == 2 && [a objectAtIndex:0] == key2 && [a objectAtIndex:1] == key1, "-keysSortedByValueUsingSelector: seems ok"); } obj = [dict description]; obj = [obj propertyList]; PASS(obj != nil && [obj isKindOfClass:[NSDictionary class]] && [obj isEqual:dict], "-description gives us a text property-list"); [dict getObjects: &vals1Array andKeys: &keys1Array]; uint8_t found = 0; if (vals1Array[0] == val1 || vals1Array[1] == val1) { found |= 1; } if (vals1Array[0] == val2 || vals1Array[1] == val2) { found |= 1 << 1; } if (keys1Array[0] == key1 || keys1Array[1] == key1) { found |= 1 << 2; } if (keys1Array[0] == key2 || keys1Array[1] == key2) { found |= 1 << 3; } PASS(found == 0b1111, "-getObjects:andKeys: returns correct objects"); PASS_RUNS([dict getObjects: NULL andKeys: &keys1Array], "-getObjects:andKeys: can ignore objects"); PASS_RUNS([dict getObjects: &vals1Array andKeys: NULL], "-getObjects:andKeys: can ignore keys"); ASSIGN(dict,[NSDictionary dictionaryWithObjects:vals4 forKeys:keys4]); PASS(dict != nil, "we can create a dictionary with several keys"); #if defined(GNUSTEP_BASE_LIBRARY) obj = [NSSerializer serializePropertyList:dict]; obj = [NSDeserializer deserializePropertyListFromData:obj mutableContainers:YES]; PASS(obj != nil && [obj isKindOfClass:[NSDictionary class]] && [obj isEqual:dict], "data/number/data are ok in serialized property-list"); #endif NSArray *a = [NSArray array]; NSDictionary *d = [NSDictionary dictionaryWithObjectsAndKeys: @"val", a, @"val2", @"key2", nil]; PASS_EQUAL([d objectForKey: a], @"val", "array as dictionary key works") [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSDictionary/sort.m000066400000000000000000000031761435650067400217500ustar00rootroot00000000000000#import "Testing.h" #import "ObjectTesting.h" #import #import #import #import int main() { START_SET("NSDictionary Sorting") NSDictionary *d; NSArray *keysOrderedByKeyedValue; NSArray *values = [NSArray arrayWithObjects: [NSNumber numberWithFloat: 2.0], [NSNumber numberWithFloat: 1.0], [NSNumber numberWithFloat: 3.0], [NSNumber numberWithFloat: 4.0], nil]; NSArray *keys = [NSArray arrayWithObjects: @"shouldSortToSecond", @"shouldSortToFirst", @"shouldSortToThird", @"shouldSortToFourth", nil]; NSArray *expected = [NSArray arrayWithObjects: @"shouldSortToFirst", @"shouldSortToSecond", @"shouldSortToThird", @"shouldSortToFourth", nil]; d = [NSDictionary dictionaryWithObjects: values forKeys: keys]; keysOrderedByKeyedValue = [d keysSortedByValueUsingSelector: @selector(compare:)]; PASS([keysOrderedByKeyedValue isEqual: expected], "Can sort a dictionary's keys by its values using a selector"); # ifndef __has_feature # define __has_feature(x) 0 # endif # if __has_feature(blocks) d = [NSDictionary dictionaryWithObjects: values forKeys: keys]; keysOrderedByKeyedValue = [d keysSortedByValueUsingComparator: ^NSComparisonResult(id obj1, id obj2) { return [(NSNumber*)obj1 compare: (NSNumber*)obj2]; }]; PASS([keysOrderedByKeyedValue isEqual: expected], "Can sort a dictionary's keys by its values using a comparator"); # else SKIP("No Blocks support in the compiler.") # endif END_SET("NSDictionary Sorting") return 0; } gnustep-base-1.29.0/Tests/base/NSDistributedLock/000077500000000000000000000000001435650067400215625ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSDistributedLock/TestInfo000066400000000000000000000000001435650067400232260ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSDistributedLock/basic.m000066400000000000000000000015651435650067400230300ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import int main() { START_SET("basic") NSString *path; NSDistributedLock *lock1; NSDistributedLock *lock2; test_NSObject(@"NSDistributedLock", [NSArray arrayWithObject: [NSDistributedLock new]]); path = [[NSFileManager defaultManager] currentDirectoryPath]; path = [path stringByAppendingPathComponent: @"MyLock"]; lock1 = [NSDistributedLock lockWithPath: path]; lock2 = [NSDistributedLock lockWithPath: path]; PASS(lock1 != lock2, "locks with the same path differ"); PASS(YES == [lock1 tryLock], "we can lock the first lock"); PASS(NO == [lock2 tryLock], "the locks are exclusive"); [lock1 unlock]; PASS(YES == [lock2 tryLock], "unlocking first lock allows second lock"); [lock2 unlock]; END_SET("basic") return 0; } gnustep-base-1.29.0/Tests/base/NSException/000077500000000000000000000000001435650067400204255ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSException/TestInfo000066400000000000000000000000001435650067400220710ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSException/basic.m000066400000000000000000000047151435650067400216730ustar00rootroot00000000000000#import #import #import "ObjectTesting.h" static void handler(NSException *e) { PASS (YES == [[e reason] isEqual: @"Terminate"], "uncaught exceptionhandler called as expected"); abort(); } @interface MyClass : NSObject + (void) testAbc; @end @implementation MyClass + (void) testAbc { [NSException raise: NSGenericException format: @"In MyClass"]; } @end int main() { NSException *obj; NSMutableArray *testObjs = [[NSMutableArray alloc] init]; NSAutoreleasePool *arp = [NSAutoreleasePool new]; test_alloc_only(@"NSException"); obj = [NSException exceptionWithName: NSGenericException reason: nil userInfo: nil]; PASS((obj != nil), "can create an exception"); PASS(([[obj name] isEqualToString: NSGenericException]), "name works"); obj = [NSException exceptionWithName: NSGenericException reason: nil userInfo: nil]; [testObjs addObject: obj]; test_NSObject(@"NSException", testObjs); NS_DURING [MyClass testAbc]; NS_HANDLER { NSArray *addresses = [localException callStackReturnAddresses]; NSArray *a = [localException callStackSymbols]; NSEnumerator *e = [a objectEnumerator]; NSString *s = nil; PASS([addresses count] > 0, "call stack addresses is not empty"); PASS([addresses count] == [a count], "addresses and symbols match"); NSLog(@"Got %@", a); while ((s = [e nextObject]) != nil) if ([s rangeOfString: @"testAbc"].length > 0) break; testHopeful = YES; PASS(s != nil, "working callStackSymbols ... if this has failed it is probably due to a lack of support for objective-c method names (local symbols) in the backtrace_symbols() function of your libc. If so, you might lobby your operating system provider for a fix."); testHopeful = NO; } NS_ENDHANDLER PASS(NSGetUncaughtExceptionHandler() == 0, "default handler is null"); NSSetUncaughtExceptionHandler(handler); PASS(NSGetUncaughtExceptionHandler() == handler, "setting handler works"); fprintf(stderr, "We expect a single FAIL without any explanation as\n" "the test is terminated by an uncaught exception ...\n"); [NSException raise: NSGenericException format: @"Terminate"]; PASS(NO, "shouldn't get here ... exception should have terminated process"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSException/basic.m.abort000066400000000000000000000001031435650067400227640ustar00rootroot00000000000000# this file is a marker to say that the test is expected to abort. gnustep-base-1.29.0/Tests/base/NSException/mixedException.mm000066400000000000000000000026111435650067400237450ustar00rootroot00000000000000#import "Testing.h" #import #if defined(TESTDEV) #if !__has_feature(objc_nonfragile_abi) int main(void) { START_SET("String throwing") SKIP("Unified exception model not supported") END_SET("String throwing"); return 0; } #else /** * Tests throwing an exception with the C++ exception throwing mechanism and * catching it with the Objective-C exception handling mechanism. This * behaviour is required for compatibility with Apple's new exception model. * The converse should also work - throwing an object with @throw and catching * it with catch(). */ int main(void) { NSString *foo = @"foo"; id caught = nil; int final = 0; int wrongCatch = 0; @try { throw foo; } @catch(NSString *f) { caught = f; } @finally { final = 1; } PASS(caught == foo, "Unified exception model works correctly"); PASS(1==final, "@finally works in ObjC++"); final = 0; caught = nil; try { @throw foo; } catch (NSArray *a) { wrongCatch = 1; } catch (NSString *f) { caught = f; } catch(...) { final = 1; } PASS(0==final, "catchall not used to catch object"); PASS(0==wrongCatch, "Incorrect object catch not used to catch object"); PASS(caught == foo, "Unified exception model works correctly"); return 0; } #endif #else int main(void) { return 0; } #endif gnustep-base-1.29.0/Tests/base/NSException/sillySemantics.mm000066400000000000000000000032631435650067400237670ustar00rootroot00000000000000#import "Testing.h" #import #if defined(TESTDEV) #if !__has_feature(objc_nonfragile_abi) int main(void) { START_SET("String throwing") SKIP("Unified exception model not supported") END_SET("String throwing"); return 0; } #else #if __has_include() #include #endif NSObject *foo = @"foo"; id caughtObj = nil; id caughtStr = nil; int final = 0; void testThrow(void) { caughtObj = nil; caughtStr = nil; final = 0; try { throw foo; } catch (NSString *f) { caughtStr = f; } catch (NSObject *o) { caughtObj = o; } catch(...) { final = 1; } } /** * Tests whether C++ exception catching uses Objective-C semantics. * * This is a completely stupid thing to do, because it means that a C++ * language feature now doesn't behave like a C++ language feature, but Apple * did it so we have to do stupid things in the name of compatibility... */ int main(void) { testThrow(); PASS(0==final, "catchall not used to catch object"); PASS(caughtObj == nil, "Thrown string cast to NSObject matched NSObject (Apple mode)"); PASS(caughtStr == foo, "Thrown string cast to NSObject matched NSString (Apple mode)"); #ifdef OBJC_UNIFIED_EXCEPTION_MODEL // Turn off Apple compatibility mode and try again objc_set_apple_compatible_objcxx_exceptions(0); testThrow(); PASS(0==final, "catchall not used to catch object"); PASS(caughtObj == foo, "Thrown string cast to NSObject matched NSObject (sane mode)"); PASS(caughtStr == nil, "Thrown string cast to NSObject matched NSString (sane mode)"); #endif return 0; } #endif #else int main(void) { return 0; } #endif gnustep-base-1.29.0/Tests/base/NSException/skipCatchall.mm000066400000000000000000000025671435650067400233740ustar00rootroot00000000000000#import "Testing.h" #import #if defined(TESTDEV) #if !__has_feature(objc_nonfragile_abi) int main(void) { START_SET("Unified exception model") SKIP("Unified exception model not supported") END_SET("Unified exception model") return 0; } #else /** * Tests whether void* catches Objective-C objects thrown as exceptions. * According to John McCall at Apple, the correct behaviour is not to catch * them in void* (which makes sense - void* is effectively a restricted * catchall, and we don't want to be catching foreign exceptions there because * we don't know what to do with them). In fact, the current behaviour on OS X * (with g++, not tested with clang++) is not simply to not catch them, it is * also to crash with a segfault. Current behaviour with clang + libobjc2 is * to do the Right Thingâ„¢. */ int main(void) { NSString *foo = @"foo"; id caught = nil; int final = 0; int wrongCatch = 0; try { @throw foo; } catch (void *foo) { wrongCatch = 1; } catch (NSString *f) { caught = f; } catch(...) { final = 1; } PASS(0==final, "catchall not used to catch object"); PASS(0==wrongCatch, "Incorrect object catch not used to catch object"); PASS(caught == foo, "Unified exception model works correctly"); return 0; } #endif #else int main(void) { return 0; } #endif gnustep-base-1.29.0/Tests/base/NSException/throwstr.m000066400000000000000000000010131435650067400224720ustar00rootroot00000000000000#import "Testing.h" #import int main(void) { START_SET("String throwing") #if defined(BASE_NATIVE_OBJC_EXCEPTIONS) && BASE_NATIVE_OBJC_EXCEPTIONS == 1 id caught = nil; id thrown = @"thrown"; @try { @throw thrown; } @catch (id str) { caught = str; } PASS((caught == thrown), "Throwing an NSConstantString instance before the class is initialised"); #else SKIP("Native exceptions not supported") #endif END_SET("String throwing") return 0; } gnustep-base-1.29.0/Tests/base/NSFastEnumeration/000077500000000000000000000000001435650067400215735ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSFastEnumeration/TestInfo000066400000000000000000000000001435650067400232370ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSFastEnumeration/basic.m000066400000000000000000000053761435650067400230450ustar00rootroot00000000000000#import #import #import #import #import #import "ObjectTesting.h" #import "../../../Source/GSFastEnumeration.h" void fast_enumeration_mutation_add(id mutableCollection) { NSUInteger i = 0; FOR_IN(id, o, mutableCollection) if (i == [mutableCollection count]/2) { if ([mutableCollection isKindOfClass:[NSMutableDictionary class]]) { [mutableCollection setObject:@"boom" forKey:@"boom"]; } else { [mutableCollection addObject:@"boom"]; } } i++; END_FOR_IN(mutableCollection) } void fast_enumeration_mutation_remove(id mutableCollection) { NSUInteger i = 0; FOR_IN(id, o, mutableCollection) if (i == [mutableCollection count]/2) { if ([mutableCollection isKindOfClass:[NSMutableDictionary class]]) { [mutableCollection removeObjectForKey:o]; } else { [mutableCollection removeObject:o]; } } i++; END_FOR_IN(mutableCollection) } void test_fast_enumeration(id collection, NSArray *objects) { NSMutableArray *returnedObjects = [[NSMutableArray alloc] init]; FOR_IN(id, o, collection) [returnedObjects addObject:o]; END_FOR_IN(collection) if (!([collection isKindOfClass:[NSArray class]] || [collection isKindOfClass:[NSOrderedSet class]])) { [returnedObjects sortUsingSelector:@selector(compare:)]; } PASS_EQUAL(returnedObjects, objects, "fast enumeration returns all objects"); id mutableCollection = [collection mutableCopy]; PASS_EXCEPTION( fast_enumeration_mutation_add(mutableCollection), NSGenericException, "Fast enumeration mutation add properly calls @\"NSGenericException\""); PASS_EXCEPTION( fast_enumeration_mutation_remove(mutableCollection), NSGenericException, "Fast enumeration mutation remove properly calls @\"NSGenericException\""); [mutableCollection release]; } int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSMutableArray *objects = [NSMutableArray array]; int i; for (i = 0; i < 10000; i++) { [objects addObject:[NSString stringWithFormat:@"%.4d", i]]; } START_SET("NSArray") id array = [NSArray arrayWithArray:objects]; test_fast_enumeration(array, objects); END_SET("NSArray") START_SET("NSSet") id set = [NSSet setWithArray:objects]; test_fast_enumeration(set, objects); END_SET("NSSet") START_SET("NSOrderedSet") id orderedSet = [NSOrderedSet orderedSetWithArray:objects]; test_fast_enumeration(orderedSet, objects); END_SET("NSOrderedSet") START_SET("NSDictionary") id dict = [NSDictionary dictionaryWithObjects:objects forKeys:objects]; test_fast_enumeration(dict, objects); END_SET("NSDictionary") [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSFileHandle/000077500000000000000000000000001435650067400204625ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSFileHandle/TestInfo000066400000000000000000000000001435650067400221260ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSFileHandle/basic.m000066400000000000000000000022541435650067400217240ustar00rootroot00000000000000/* Copyright (C) 2005 Free Software Foundation, Inc. Written by: David Ayers Date: February 2005 This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #import "ObjectTesting.h" #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; test_NSObject(@"NSFileHandle", [NSArray arrayWithObject:[NSFileHandle fileHandleWithStandardInput]]); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSFileHandle/general.m000066400000000000000000000067011435650067400222610ustar00rootroot00000000000000/* Copyright (C) 2005 Free Software Foundation, Inc. Written by: David Ayers Date: February 2005 This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #import "Testing.h" #import "ObjectTesting.h" #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; /* We invert the order so that we really test the FD values when they are not opened in order. */ NSFileHandle *stdErrFH = [NSFileHandle fileHandleWithStandardError]; NSFileHandle *stdOutFH = [NSFileHandle fileHandleWithStandardOutput]; NSFileHandle *stdInFH = [NSFileHandle fileHandleWithStandardInput]; NSFileHandle *stdNullFH = [NSFileHandle fileHandleWithNullDevice]; NSFileHandle *t1FH, *t2FH; NSString *tPath = [NSString stringWithFormat:@"%@/%@",NSTemporaryDirectory(),[[NSProcessInfo processInfo]globallyUniqueString]]; NSData *t1Data = [tPath dataUsingEncoding:NSUTF8StringEncoding]; NSData *t2Data; PASS([stdInFH isKindOfClass:[NSFileHandle class]], "NSFileHandle understands +fileHandleWithStandardInput"); PASS([stdInFH fileDescriptor]==0, "NSFileHandle +fileHandleWithStandardInput has 0 as fileDescriptor"); PASS([stdOutFH isKindOfClass:[NSFileHandle class]], "NSFileHandle understands +fileHandleWithStandardOutput"); PASS([stdOutFH fileDescriptor]==1, "NSFileHandle +fileHandleWithStandardOutput has 1 as fileDescriptor"); PASS([stdErrFH isKindOfClass:[NSFileHandle class]], "NSFileHandle understands +fileHandleWithStandardError"); PASS([stdErrFH fileDescriptor]==2, "NSFileHandle +fileHandleWithStandardError has 2 as fileDescriptor"); PASS([stdNullFH isKindOfClass:[NSFileHandle class]], "NSFileHandle understands +fileHandleWithNullDevice"); t1FH = [[NSFileHandle alloc] initWithFileDescriptor: 0]; PASS([t1FH isKindOfClass:[NSFileHandle class]], "NSFileHandle understands -initWithFileDescriptor:"); t1FH = [NSFileHandle fileHandleForWritingAtPath: tPath]; PASS(t1FH == nil, "NSFileHandle +fileHandleForWritingAtPath: with non-existing file return nil"); [@"" writeToFile: tPath atomically: YES]; t1FH = [NSFileHandle fileHandleForWritingAtPath: tPath]; PASS([t1FH isKindOfClass:[NSFileHandle class]], "NSFileHandle understands +fileHandleForWritingAtPath:"); t2FH = [NSFileHandle fileHandleForReadingAtPath: tPath]; PASS([t2FH isKindOfClass:[NSFileHandle class]], "NSFileHandle understands +fileHandleForReadingAtPath:"); [t1FH writeData: t1Data]; t2Data = [t2FH availableData]; PASS([t1Data isEqual: t2Data], "NSFileHandle -writeData:/-availableData match"); [[NSFileManager defaultManager] removeFileAtPath: tPath handler: nil]; [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSFileHandle/singleton.m000066400000000000000000000012361435650067400226440ustar00rootroot00000000000000#import "ObjectTesting.h" #import id a,b,c; int main(void) { NSAutoreleasePool *p = [NSAutoreleasePool new]; NSFileHandle *a; NSFileHandle *b; NSFileHandle *c; START_SET("handle creation") a = [NSFileHandle fileHandleWithStandardInput]; b = [NSFileHandle fileHandleWithStandardOutput]; c = [NSFileHandle fileHandleWithStandardError]; END_SET("handle creation") PASS_EXCEPTION([a release], NSGenericException, "Cannot dealloc stdin"); PASS_EXCEPTION([b release], NSGenericException, "Cannot dealloc stdout"); PASS_EXCEPTION([c release], NSGenericException, "Cannot dealloc stderr"); [p drain]; return 0; } gnustep-base-1.29.0/Tests/base/NSFileHandle/socket.m000066400000000000000000000061521435650067400221340ustar00rootroot00000000000000#if defined(GNUSTEP_BASE_LIBRARY) /* Copyright (C) 2005 Free Software Foundation, Inc. Written by: David Ayers Date: November 2005 This file is part of the GNUstep Base Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #import "Testing.h" #import "ObjectTesting.h" #import #define GST_PORT @"32329" NSFileHandle *rFH = nil; @interface Handler : NSObject @end @implementation Handler - (id)init { if ((self = [super init])) { NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; [nc addObserver: self selector: @selector(connect:) name: NSFileHandleConnectionAcceptedNotification object: nil]; } return self; } - (void)connect:(NSNotification *)notif { NSDictionary *d = [notif userInfo]; NSLog(@"%@", notif); rFH = [[d objectForKey: NSFileHandleNotificationFileHandleItem] retain]; } @end int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; Handler *h; NSFileHandle *sFH; NSFileHandle *cFH; NSData *wData; NSData *rData; NSDate *limit; wData = [@"Socket Test" dataUsingEncoding:NSASCIIStringEncoding]; /* Note that the above data should be short enough to fit into the socket send buffer otherwise we risk being blocked in this single threaded process. */ h = [[Handler new] autorelease]; sFH = [NSFileHandle fileHandleAsServerAtAddress: @"127.0.0.1" service: GST_PORT protocol: @"tcp"]; PASS([sFH isKindOfClass:[NSFileHandle class]], "NSFileHandle understands +fileHandleAsServerAtAddress:"); [sFH acceptConnectionInBackgroundAndNotify]; cFH = [NSFileHandle fileHandleAsClientAtAddress: @"127.0.0.1" service: GST_PORT protocol: @"tcp"]; PASS([cFH isKindOfClass:[NSFileHandle class]], "NSFileHandle understands +fileHandleAsClientAtAddress:"); [cFH writeData: wData]; limit = [NSDate dateWithTimeIntervalSinceNow: 2.0]; while (nil == rFH && [limit timeIntervalSinceNow] > 0.0) { [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate: limit]; } PASS(rFH != nil, "NSFileHandle connection was made"); rData = [rFH availableData]; PASS([wData isEqual: rData], "NSFileHandle -writeData:/-availableData match with socket"); [arp release]; arp = nil; return 0; } #else int main() { return 0; } #endif gnustep-base-1.29.0/Tests/base/NSFileManager/000077500000000000000000000000001435650067400206415ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSFileManager/TestInfo000066400000000000000000000000001435650067400223050ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSFileManager/basic.m000066400000000000000000000005041435650067400220770ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; test_NSObject(@"NSFileManager", [NSArray arrayWithObject:[NSFileManager defaultManager]]); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSFileManager/general.m000066400000000000000000000353651435650067400224500ustar00rootroot00000000000000#import "Testing.h" #import "ObjectTesting.h" #import #import #import #import #import #import #import #import #ifdef EQ #undef EQ #endif #define EPSILON (FLT_EPSILON*100) #define EQ(x,y) ((x >= y - EPSILON) && (x <= y + EPSILON)) @interface MyHandler : NSObject { @public NSString *path; NSError *error; } - (BOOL) fileManager: (NSFileManager*)m shouldProceedAfterError: (NSError*)e; - (void) fileManager: (NSFileManager*)m willProcessPath: (NSString*)p; - (void) reset; @end @implementation MyHandler - (void) dealloc { [self reset]; [super dealloc]; } - (BOOL) fileManager: (NSFileManager*)m shouldProceedAfterError: (NSError*)e { ASSIGN(error, e); return NO; } - (void) fileManager: (NSFileManager*)m willProcessPath: (NSString*)p { ASSIGN(path, p); } - (void) reset { DESTROY(path); DESTROY(error); } @end int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSFileManager *mgr = [NSFileManager defaultManager]; NSString *dir = @"NSFileManagerTestDir"; MyHandler *handler = [MyHandler new]; NSDictionary *attr; NSString *dirInDir; NSString *str1,*str2; NSString *tmp; NSError *err; NSDictionary *errInfo; BOOL exists; BOOL isDir; dirInDir = [dir stringByAppendingPathComponent: @"WithinDirectory"]; PASS(mgr != nil && [mgr isKindOfClass: [NSFileManager class]], "NSFileManager understands +defaultManager"); /* remove test directory if it exists */ exists = [mgr fileExistsAtPath: dir isDirectory: &isDir]; if (exists) { [mgr removeFileAtPath: dir handler: handler]; } PASS([mgr fileAttributesAtPath: dir traverseLink: NO] == nil, "NSFileManager returns nil for attributes of non-existent file"); PASS([mgr createDirectoryAtPath: dir attributes: nil], "NSFileManager can create a directory"); PASS([mgr fileExistsAtPath: dir isDirectory: &isDir] && isDir == YES, "exists and is a directory"); PASS(NO == [mgr createDirectoryAtPath: dir attributes: nil], "-createDirectoryAtPath:attributes: fails for existing directory"); PASS(NO == [mgr createDirectoryAtPath: dir withIntermediateDirectories: NO attributes: nil error: 0], "-createDirectoryAtPath:withIntermediateDirectories:attributes:error:" " fails for existing directory if flag is NO"); PASS(YES == [mgr createDirectoryAtPath: dir withIntermediateDirectories: YES attributes: nil error: 0], "-createDirectoryAtPath:withIntermediateDirectories:attributes:error:" " succeeds for existing directory if flag is YES"); PASS([mgr fileAttributesAtPath: dir traverseLink: NO] != nil, "NSFileManager returns non-nil for attributes of existing file"); attr = [mgr fileAttributesAtPath: dir traverseLink: NO]; PASS(attr != nil, "NSFileManager returns non-nil for attributes of existing file"); PASS([NSUserName() isEqual: [attr fileOwnerAccountName]], "newly created file is owned by current user"); //NSLog(@"'%@', '%@'", NSUserName(), [attr fileOwnerAccountName]); err = (id)(void*)42; attr = [mgr attributesOfItemAtPath: dir error: &err]; PASS(attr != nil && err == (id)(void*)42, "[NSFileManager attributesOfItemAtPath:error:] returns non-nil for " "attributes and leaves error unchanged in the case of existing file"); attr = [mgr attributesOfItemAtPath: [dir stringByAppendingPathComponent: @"thispathMUSTNOTexistatyoursystem"] error: &err]; PASS(attr == nil && err != nil, "[NSFileManager attributesOfItemAtPath:error:] returns nil for " "attributes and non-nil for error in the case of non-existent file"); PASS([mgr changeCurrentDirectoryPath: dir], "NSFileManager can change directories"); { NSString *dir1 = [mgr currentDirectoryPath]; PASS(dir1 != nil && [[dir1 lastPathComponent] isEqualToString: dir], "NSFileManager can get current dir"); } str1 = @"A string"; PASS([mgr createFileAtPath: @"NSFMFile" contents: [str1 dataUsingEncoding: 1] attributes: nil], "NSFileManager creates a file"); PASS([mgr fileExistsAtPath: @"NSFMFile"],"-fileExistsAtPath: agrees"); { NSArray *a; a = [mgr contentsOfDirectoryAtPath: @"." error: 0]; PASS(1 == [a count] && [[a lastObject] isEqual: @"NSFMFile"], "-contentsOfDirectoryAtPath: agrees"); } { NSData *dat1 = [mgr contentsAtPath: @"NSFMFile"]; str2 = [[NSString alloc] initWithData: dat1 encoding: 1]; PASS([str1 isEqualToString: str2], "NSFileManager file contents match"); } [NSThread sleepForTimeInterval: 1.0]; // So date of file is clearly in past [handler reset]; PASS([mgr copyPath: @"NSFMFile" toPath: @"NSFMCopy" handler: handler], "NSFileManager copies a file"); PASS([mgr fileExistsAtPath: @"NSFMCopy"],"-fileExistsAtPath: agrees"); { NSData *dat1 = [mgr contentsAtPath: @"NSFMCopy"]; str2 = [[NSString alloc] initWithData: dat1 encoding: 1]; PASS([str1 isEqual: str2],"NSFileManager copied file contents match"); } NSDictionary *oa = [mgr fileAttributesAtPath: @"NSFMFile" traverseLink: NO]; NSDictionary *na = [mgr fileAttributesAtPath: @"NSFMCopy" traverseLink: NO]; NSTimeInterval ot, nt; ot = [[oa fileCreationDate] timeIntervalSinceReferenceDate]; nt = [[na fileCreationDate] timeIntervalSinceReferenceDate]; PASS(EQ(ot, nt), "copy creation date equals original") ot = [[oa fileModificationDate] timeIntervalSinceReferenceDate]; nt = [[na fileModificationDate] timeIntervalSinceReferenceDate]; PASS(EQ(ot, nt), "copy modification date equals original") { NSData *dat1 = [mgr contentsAtPath: @"NSFMFile"]; NSError *err; BOOL ok; ok = [dat1 writeToFile: @"NSFMFile" options: NSDataWritingAtomic error: &err]; PASS(ok, "can rewrite data file") if (NO == ok) NSLog(@"Problem: %@ with %@", err, dat1); na = [mgr fileAttributesAtPath: @"NSFMFile" traverseLink: NO]; NSLog(@"%@\n%@", oa, na); ot = [[oa fileCreationDate] timeIntervalSinceReferenceDate]; nt = [[na fileCreationDate] timeIntervalSinceReferenceDate]; PASS(!EQ(ot, nt), "rewritten file creation date changed") ot = [[oa fileModificationDate] timeIntervalSinceReferenceDate]; nt = [[na fileModificationDate] timeIntervalSinceReferenceDate]; PASS(!EQ(ot, nt), "rewritten file modification date changed") } PASS([mgr movePath: @"NSFMFile" toPath: @"NSFMMove" handler: handler], "NSFileManager moves a file"); PASS([mgr fileExistsAtPath: @"NSFMMove"], "NSFileManager move destination exists"); PASS(![mgr fileExistsAtPath: @"NSFMFile"], "NSFileManager move source doesn't exist"); { NSData *dat1 = [mgr contentsAtPath: @"NSFMMove"]; str2 = [[NSString alloc] initWithData: dat1 encoding: 1]; PASS([str1 isEqualToString: str2],"NSFileManager moved file contents match") } PASS(![mgr copyPath: @"NSFMFile" toPath: @"NSFMDestination" handler: handler], "NSFileManager does not copy nonexistent file") if ([[NSProcessInfo processInfo] operatingSystem] != NSWindowsNTOperatingSystem) { PASS([mgr createSymbolicLinkAtPath: @"NSFMLink" pathContent: @"NSFMMove"], "NSFileManager creates a symbolic link"); PASS([mgr fileExistsAtPath: @"NSFMLink"], "link exists"); PASS([mgr removeFileAtPath: @"NSFMLink" handler: handler], "NSFileManager removes a symbolic link"); PASS(![mgr fileExistsAtPath: @"NSFMLink"], "NSFileManager removed link doesn't exist"); PASS([mgr fileExistsAtPath: @"NSFMMove"], "NSFileManager removed link's target still exists"); } PASS([mgr removeFileAtPath: @"NSFMMove" handler: handler], "NSFileManager removes a file"); PASS(![mgr fileExistsAtPath: @"NSFMMove"], "NSFileManager removed file doesn't exist"); PASS([mgr isReadableFileAtPath: @"NSFMCopy"], "NSFileManager isReadableFileAtPath: works"); PASS([mgr isWritableFileAtPath: @"NSFMCopy"], "NSFileManager isWritableFileAtPath: works"); PASS([mgr isDeletableFileAtPath: @"NSFMCopy"], "NSFileManager isDeletableFileAtPath: works"); PASS(![mgr isExecutableFileAtPath: @"NSFMCopy"], "NSFileManager isExecutableFileAtPath: works"); PASS_EXCEPTION([mgr removeFileAtPath: @"." handler: handler];, NSInvalidArgumentException, "NSFileManager -removeFileAtPath: @\".\" throws exception"); PASS([mgr createDirectoryAtPath: @"subdir" attributes: nil], "NSFileManager can create a subdirectory"); PASS([mgr changeCurrentDirectoryPath: @"subdir"], "NSFileManager can move into subdir"); [mgr createDirectoryAtPath: @"sub1" attributes: nil]; [mgr createFileAtPath: @"sub1/x" contents: [@"hello" dataUsingEncoding: NSASCIIStringEncoding] attributes: nil], [mgr createDirectoryAtPath: @"sub2" attributes: nil]; [mgr createFileAtPath: @"sub2/x" contents: [@"hello" dataUsingEncoding: NSASCIIStringEncoding] attributes: nil]; PASS(YES == [mgr contentsEqualAtPath: @"sub1/x" andPath: @"sub2/x"], "directories containing identical files are equal"); [mgr removeFileAtPath: @"sub2/x" handler: handler], [mgr createFileAtPath: @"sub2/x" contents: [@"goodbye" dataUsingEncoding: NSASCIIStringEncoding] attributes: nil]; PASS(NO == [mgr contentsEqualAtPath: @"sub1/x" andPath: @"sub2/x"], "directories containing files with different content are not equal"); PASS(YES == [mgr removeFileAtPath: @"sub1" handler: handler], "sub1 removed"); PASS(YES == [mgr removeFileAtPath: @"sub2" handler: handler], "sub2 removed"); err = nil; PASS([mgr createDirectoryAtPath: dirInDir withIntermediateDirectories: NO attributes: nil error: &err] == NO, "NSFileManager refuses to create intermediate directories"); PASS(err != nil, "error value is set"); PASS_EQUAL([err domain], NSCocoaErrorDomain, "cocoa error domain"); PASS((errInfo = [err userInfo]) != nil, "error user info is set"); PASS([errInfo objectForKey: NSFilePathErrorKey] != nil, "error info has a path"); err = nil; PASS([mgr createDirectoryAtPath: dirInDir withIntermediateDirectories: YES attributes: nil error: &err] && err == nil, "NSFileManager can create intermediate directories"); PASS([mgr fileExistsAtPath: dirInDir isDirectory: &isDir] && isDir == YES, "NSFileManager create directory and intermediate directory"); tmp = [mgr currentDirectoryPath]; exists = [mgr fileExistsAtPath: tmp isDirectory: &isDir]; PASS(YES == exists && YES == isDir, "current directory exists"); tmp = [tmp stringByDeletingLastPathComponent]; exists = [mgr fileExistsAtPath: tmp isDirectory: &isDir]; PASS(YES == exists && YES == isDir, "parent directory exists"); tmp = [tmp stringByDeletingLastPathComponent]; exists = [mgr fileExistsAtPath: tmp isDirectory: &isDir]; PASS(YES == exists && YES == isDir, "parent of parent directory exists"); [mgr changeCurrentDirectoryPath: tmp]; exists = [mgr fileExistsAtPath: dir isDirectory: &isDir]; PASS(YES == exists && YES == isDir, "directory exists"); if (exists && isDir) { dir = [dir stringByStandardizingPath]; PASS([mgr removeFileAtPath: dir handler: handler], "removed directory"); PASS(![mgr fileExistsAtPath: dir], "directory no longer exists"); GSPrintf(stdout, @"%@\n", dir); GSPrintf(stderr, @"%@\n", dir); } err = nil; PASS([mgr createDirectoryAtURL: [NSURL fileURLWithPath:dirInDir] withIntermediateDirectories: NO attributes: nil error: &err] == NO && err != nil && [[err domain] isEqual: NSCocoaErrorDomain] && (errInfo = [err userInfo]) != nil && [errInfo objectForKey: NSFilePathErrorKey] != nil, "NSFileManager refuses to create intermediate directories on URL"); err = nil; PASS([mgr createDirectoryAtURL: [NSURL fileURLWithPath:dirInDir] withIntermediateDirectories: YES attributes: nil error: &err] && err == nil, "NSFileManager can create intermediate directories on URL"); PASS([mgr fileExistsAtPath: dirInDir isDirectory: &isDir] && isDir == YES, "NSFileManager create directory and intermediate directory on URL"); [mgr createDirectoryAtPath: @"sub1" withIntermediateDirectories: YES attributes: nil error: &err]; [mgr createDirectoryAtPath: @"sub2" withIntermediateDirectories: YES attributes: nil error: &err]; [mgr copyItemAtURL: [NSURL fileURLWithPath: @"sub1"] toURL: [NSURL fileURLWithPath: @"sub2/sub1"] error: &err]; PASS([mgr fileExistsAtPath: @"sub2/sub1" isDirectory: &isDir] && isDir == YES, "NSFileManager copy item at URL"); [mgr copyItemAtPath: @"sub2" toPath: @"sub1/sub2" error: &err]; PASS([mgr fileExistsAtPath: @"sub1/sub2/sub1" isDirectory: &isDir] && isDir == YES, "NSFileManager copy item at Path"); [mgr moveItemAtURL: [NSURL fileURLWithPath: @"sub2/sub1"] toURL: [NSURL fileURLWithPath: @"sub1/moved"] error: &err]; PASS([mgr fileExistsAtPath: @"sub1/moved" isDirectory: &isDir] && isDir == YES, "NSFileManager move item at URL"); [mgr moveItemAtPath:@"sub1/sub2" toPath:@"sub2/moved" error: &err]; PASS([mgr fileExistsAtPath: @"sub2/moved" isDirectory: &isDir] && isDir == YES, "NSFileManager move item at Path"); [mgr removeItemAtURL: [NSURL fileURLWithPath: @"sub1"] error: &err]; PASS([mgr fileExistsAtPath: @"sub1" isDirectory: &isDir] == NO, "NSFileManager remove item at URL"); [mgr removeItemAtPath: @"sub2" error: &err]; PASS([mgr fileExistsAtPath: @"sub2" isDirectory: &isDir] == NO, "NSFileManager remove item at Path"); PASS_EXCEPTION([mgr removeFileAtPath: @"." handler: handler];, NSInvalidArgumentException, "NSFileManager -removeFileAtPath: @\".\" throws exception"); PASS_EXCEPTION([mgr removeFileAtPath: @".." handler: handler];, NSInvalidArgumentException, "NSFileManager -removeFileAtPath: @\"..\" throws exception"); /* clean up */ [mgr changeCurrentDirectoryPath: [[[mgr currentDirectoryPath] stringByDeletingLastPathComponent] stringByDeletingLastPathComponent]]; exists = [mgr fileExistsAtPath: dir isDirectory: &isDir]; if (exists && isDir) { PASS([mgr removeFileAtPath: dir handler: handler], "NSFileManager removes a directory"); PASS(![mgr fileExistsAtPath: dir],"directory no longer exists"); } [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSFileManager/unrepresentable_filenames.m000066400000000000000000000017551435650067400262500ustar00rootroot00000000000000/* copyright 2004 Alexander Malmberg */ #import "Testing.h" #import #import #import #import int main(int argc, char **argv) { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSFileManager *fm = [NSFileManager defaultManager]; NSArray *files; int i; BOOL e, d; files = [fm directoryContentsAtPath: @"."]; printf("%lu files\n", (unsigned long)[files count]); for (i = 0; i < [files count]; i++) { int j; NSString *f = [files objectAtIndex: i]; e = [fm fileExistsAtPath: f isDirectory: &d]; printf("%5i: %i %i %s\n",i,e,d, [f lossyCString]); for (j = 0; j < [f length]; j++) printf(" %3i: %04x\n",j,[f characterAtIndex: j]); } /* const char *test="hallå.txt"; NSString *s=[NSString stringWithCString: test]; printf("s=%s\n", [s lossyCString]);*/ [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSHTTPCookie/000077500000000000000000000000001435650067400204005ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSHTTPCookie/TestInfo000066400000000000000000000000001435650067400220440ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSHTTPCookie/basic.m000066400000000000000000000060241435650067400216410ustar00rootroot00000000000000#import #import "Testing.h" #import "ObjectTesting.h" int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSDictionary *dict; NSArray *cookies; NSURL *url; NSHTTPCookie *cookie; TEST_FOR_CLASS(@"NSHTTPCookie", [NSHTTPCookie alloc], "NSHTTPCookie +alloc returns an NSHTTPCookie"); dict = [NSDictionary dictionaryWithObjectsAndKeys: @"myname", @"Name", @"myvalue", @"Value", @"/", @"Path", @".test.com", @"Domain", nil]; cookie = [NSHTTPCookie cookieWithProperties: dict]; TEST_FOR_CLASS(@"NSHTTPCookie", cookie, "NSHTTPCookie +cookieWithProperties: returns an NSHTTPCookie"); dict = [NSDictionary dictionaryWithObjectsAndKeys: @"myname", NSHTTPCookieName, @"myvalue", NSHTTPCookieValue, @"/mypath", NSHTTPCookiePath, @".test.com", NSHTTPCookieDomain, @"http://www.origin.org", NSHTTPCookieOriginURL, @"0", NSHTTPCookieVersion, @"FALSE", NSHTTPCookieDiscard, @"FALSE", NSHTTPCookieSecure, nil]; cookie = [NSHTTPCookie cookieWithProperties: dict]; TEST_FOR_CLASS(@"NSHTTPCookie", cookie, "NSHTTPCookie +cookieWithProperties: works with all constants"); dict = [NSDictionary dictionaryWithObjectsAndKeys: @"myname", @"Name", @"myvalue", @"Value", @".test.com", @"Domain", nil]; cookie = [NSHTTPCookie cookieWithProperties: dict]; PASS(cookie == nil, "cookie without path returns nil"); dict = [NSDictionary dictionaryWithObject: @"S=calendar=R7tjDKqNB5L8YTZSvf29Bg;Expires=Wed, 09-Mar-2011 23:00:35 GMT, " @"S=xxxxxxxx=R7tjDKqNB5L8YTZSvf29Bg;Expires=Thu, 10-Mar-2011 23:00:35 GMT" forKey: @"Set-Cookie"]; url = [NSURL URLWithString: @"http://www.google.com/calendar/feeds/default/"]; cookies= [NSHTTPCookie cookiesWithResponseHeaderFields: dict forURL: url]; TEST_FOR_CLASS(@"NSArray", cookies, "NSHTTPCookie +cookiesWithResponseHeaderFields: returns an NSArray"); PASS([cookies count ] == 2, "cookies array contains two cookies"); cookie = [cookies objectAtIndex: 0]; PASS([[cookie name] isEqual: @"S"], "NSHTTPCookie returns proper name"); PASS([[cookie value] isEqual: @"calendar=R7tjDKqNB5L8YTZSvf29Bg"], "NSHTTPCookie returns proper value"); PASS([[cookie domain] isEqual: [url host]], "NSHTTPCookie returns proper domain"); PASS(![cookie isSecure], "Cookie is not secure"); PASS(![cookie isHTTPOnly], "Cookie is not http only"); cookies = [cookies subarrayWithRange: NSMakeRange(0, 1)]; dict = [NSHTTPCookie requestHeaderFieldsWithCookies: cookies]; PASS_EQUAL([dict objectForKey: @"Cookie"], @"S=calendar=R7tjDKqNB5L8YTZSvf29Bg", "NSHTTPCookie can generate proper cookie"); dict = [NSDictionary dictionaryWithObject: @"SessionId=xxx;HttpOnly;Secure;" forKey: @"Set-Cookie"]; cookies= [NSHTTPCookie cookiesWithResponseHeaderFields: dict forURL: url]; cookie = [cookies objectAtIndex:0]; PASS([cookie isSecure], "NSHTTPCookie is secure"); PASS([cookie isHTTPOnly], "NSHTTPCookie is HTTPOnly"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSHashTable/000077500000000000000000000000001435650067400203225ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSHashTable/TestInfo000066400000000000000000000000001435650067400217660ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSHashTable/additions.m000066400000000000000000000012071435650067400224560ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSHashTable *obj = [[NSHashTable new] autorelease]; NSString *strA = @"a"; NSString *strB = @"b"; NSArray *a = [NSArray arrayWithObjects: strA, strB, strA, nil]; [obj addObjectsFromArray: a]; PASS([obj count] == 2, "-addObjectsFromArray: adds objects ignoring duplicates"); PASS([obj containsObject: strA] && [obj containsObject: strB], "Table contains correct objects"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSHashTable/basic.m000066400000000000000000000010771435650067400215660ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSHashTable *testObj; testObj = [[NSHashTable new] autorelease]; [testObj addObject: @"hello"]; test_alloc(@"NSHashTable"); test_NSObject(@"NSHashTable", [NSArray arrayWithObject: testObj]); test_NSCopying(@"NSHashTable",@"NSHashTable", [NSArray arrayWithObject: testObj], NO, YES); // test_NSCoding([NSArray arrayWithObject: testObj]); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSHashTable/create.m000066400000000000000000000014101435650067400217370ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSString *val1, *val2, *val3; NSHashTable *obj; id vals[3]; val1 = @"Hello"; val2 = @"Goodbye"; val3 = @"Testing"; vals[0] = val1; vals[1] = val2; vals[2] = val3; obj = [[NSHashTable new] autorelease]; PASS(obj != nil && [obj isKindOfClass:[NSHashTable class]] && [obj count] == 0, "+new creates an empty hash table"); [obj addObject: (void*)@"hello"]; PASS([obj count] == 1, "-addObject: increments count"); PASS_EXCEPTION([obj addObject: nil];, NSInvalidArgumentException, "-addObject: raises with nil"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSHashTable/general.m000066400000000000000000000002621435650067400221150ustar00rootroot00000000000000#import #import "ObjectTesting.h" int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSHashTable/weakObjects.m000066400000000000000000000015651435650067400227500ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import #if __has_include() #include #endif int main() { START_SET("NSHashTable weak objects") #ifdef OBJC_CAP_ARC if (!objc_test_capability(OBJC_CAP_ARC)) #endif { SKIP("ARC support unavailable") } NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSHashTable *hashTable = [NSHashTable weakObjectsHashTable]; NSAutoreleasePool *arp2 = [NSAutoreleasePool new]; id testObj = [[[NSObject alloc] init] autorelease]; [hashTable addObject:testObj]; PASS([[hashTable allObjects] count] == 1, "Table retains active weak reference"); [arp2 release]; arp2 = nil; PASS([[hashTable allObjects] count] == 0, "Table removes dead weak reference"); [arp release]; arp = nil; END_SET("NSHashTable weak objects") return 0; } gnustep-base-1.29.0/Tests/base/NSHost/000077500000000000000000000000001435650067400174045ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSHost/TestInfo000066400000000000000000000000001435650067400210500ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSHost/basic.m000066400000000000000000000005321435650067400206430ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; test_NSObject(@"NSHost",[NSArray arrayWithObject:[NSHost currentHost]]); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSHost/create.m000066400000000000000000000022301435650067400210220ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSHost *current; NSHost *localh; NSHost *tmp; current = [NSHost currentHost]; PASS(current != nil && [current isKindOfClass: [NSHost class]], "NSHost understands +currentHost"); #if defined(GNUSTEP_BASE_LIBRARY) localh = [NSHost localHost]; PASS(localh != nil && [localh isKindOfClass: [NSHost class]], "NSHost understands +localHost"); #else localh = current; #endif tmp = [NSHost hostWithName: @"::1"]; PASS([[tmp address] isEqual: @"::1"], "+hostWithName: works for IPV6 addr"); tmp = [NSHost hostWithName: [current name]]; PASS([tmp isEqualToHost: current], "NSHost understands +hostWithName:"); tmp = [NSHost hostWithAddress: [current address]]; PASS([tmp isEqualToHost: current], "NSHost understands +hostWithAddress:"); tmp = [NSHost hostWithName: @"127.0.0.1"]; PASS(tmp != nil && [tmp isEqualToHost: localh], "NSHost understands [+hostWithName: 127.0.0.1]"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSIndexPath/000077500000000000000000000000001435650067400203535ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSIndexPath/TestInfo000066400000000000000000000000001435650067400220170ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSIndexPath/general.m000066400000000000000000000051131435650067400221460ustar00rootroot00000000000000#import "Testing.h" #import "ObjectTesting.h" #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSIndexPath *index1; NSIndexPath *index2; NSUInteger i0[2]; NSUInteger i1[2]; i0[0] = i1[1] = 0; i0[1] = i1[0] = 1; index1 = [NSIndexPath indexPathWithIndex: 1]; PASS(index1 != nil && [index1 isKindOfClass:[NSIndexPath class]] && [index1 length] == 1 && [index1 indexAtPosition: 0] == 1, "+indexPathWithIndex: works"); index2 = [NSIndexPath indexPathWithIndex: 1]; PASS(index1 == index2, "index path gives a shared instance"); PASS([index1 indexAtPosition: 1] == NSNotFound, "indexAtPosition: with bad location gives NSNotFound"); index1 = [index1 indexPathByAddingIndex: 9]; PASS([index1 length] == 2 && [index1 indexAtPosition: 0] == 1 && [index1 indexAtPosition: 1] == 9, "indexPathByAddingIndex: works"); index1 = [index1 indexPathByRemovingLastIndex]; PASS([index1 length] == 1 && [index1 indexAtPosition: 0] == 1, "indexPathByRemovingLastIndex works"); index1 = [NSIndexPath indexPathWithIndexes: i0 length: 2]; PASS([index1 length] == 2 && [index1 indexAtPosition: 0] == i0[0] && [index1 indexAtPosition: 1] == i0[1], "indexPathWithindexes:length: works"); index2 = [NSIndexPath indexPathWithIndexes: i1 length: 2]; PASS([index1 length] == 2 && [index1 indexAtPosition: 0] == i0[0] && [index1 indexAtPosition: 1] == i0[1], "indexPathWithindexes:length: works for another path"); PASS([index1 isEqual: index2] == NO, "different index paths are not equal"); PASS([index1 compare: index2] == NSOrderedAscending, "comparison one way works"); PASS([index2 compare: index1] == NSOrderedDescending, "comparison the other way works"); index1 = [index1 indexPathByAddingIndex: 1]; PASS([index1 compare: index2] == NSOrderedAscending, "longer index1 comparison one way works"); PASS([index2 compare: index1] == NSOrderedDescending, "longer index1 comparison the other way works"); index1 = [index1 indexPathByRemovingLastIndex]; index2 = [index2 indexPathByAddingIndex: 1]; PASS([index1 compare: index2] == NSOrderedAscending, "longer index2 comparison one way works"); PASS([index2 compare: index1] == NSOrderedDescending, "longer index2 comparison the other way works"); [arp release]; arp = nil; { BOOL didNotSegfault = YES; PASS(didNotSegfault, "+indexPathWithIndex: doesn't mess up memory"); } return 0; } gnustep-base-1.29.0/Tests/base/NSInvocation/000077500000000000000000000000001435650067400206005ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSInvocation/GNUmakefile.preamble000066400000000000000000000003061435650067400244370ustar00rootroot00000000000000 ADDITIONAL_OBJCFLAGS += -I../GenericTests/ -I../../.. -Wall $(GNUSTEP_INSTANCE)_SUBPROJECTS = ../GenericTests SUBPROJECTS= ../GenericTests Resources include $(GNUSTEP_MAKEFILES)/aggregate.make gnustep-base-1.29.0/Tests/base/NSInvocation/InvokeProxyProtocol.h000066400000000000000000000020401435650067400247640ustar00rootroot00000000000000/* InvokeProxyProtocol.h - protocol for simple target and proxy classes Written By: Adam Fedor */ #import #import typedef struct { char c; int i; } smallStruct; typedef struct { int i; char *s; float f; } largeStruct; @protocol InvokeTarget - (char) loopChar: (char)v; - (double) loopDouble: (double)v; - (float) loopFloat: (float)v; - (int) loopInt: (int)v; - (largeStruct) loopLarge: (largeStruct)v; - (long) loopLong: (long)v; - (largeStruct) loopLargePtr: (largeStruct*)v; - (id) loopObject: (id)v; - (NSRect) loopRect: (NSRect)v; - (short) loopShort: (short)v; - (smallStruct) loopSmall: (smallStruct)v; - (smallStruct) loopSmallPtr: (smallStruct*)v; - (char*) loopString: (char*)v; - (char) retChar; - (double) retDouble; - (float) retFloat; - (int) retInt; - (largeStruct) retLarge; - (long) retLong; - (id) retObject; - (short) retShort; - (smallStruct) retSmall; - (char*) retString; @end @protocol InvokeProxy - (id) initWithTarget: (id)target; @end gnustep-base-1.29.0/Tests/base/NSInvocation/Resources/000077500000000000000000000000001435650067400225525ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSInvocation/Resources/GNUmakefile000066400000000000000000000003431435650067400246240ustar00rootroot00000000000000include $(GNUSTEP_MAKEFILES)/common.make BUNDLE_NAME=InvokeProxy InvokeProxy_OBJC_FILES=InvokeProxy.m InvokeProxy_NEEDS_GUI = NO include $(GNUSTEP_MAKEFILES)/bundle.make include $(GNUSTEP_MAKEFILES)/test-tool.make check:: all gnustep-base-1.29.0/Tests/base/NSInvocation/Resources/InvokeProxy.h000066400000000000000000000021031435650067400252140ustar00rootroot00000000000000/* InvokeProxy.h - Definitions for simple target and proxy classes Written By: Adam Fedor */ #include #include typedef struct { char c; int i; } smallStruct; typedef struct { int i; char *s; float f; } largeStruct; @interface InvokeTarget: NSObject - (char) loopChar: (char)v; - (double) loopDouble: (double)v; - (float) loopFloat: (float)v; - (int) loopInt: (int)v; - (largeStruct) loopLarge: (largeStruct)v; - (long) loopLong: (long)v; - (largeStruct) loopLargePtr: (largeStruct*)v; - (id) loopObject: (id)v; - (short) loopShort: (short)v; - (NSRect) loopRect: (NSRect)v; - (smallStruct) loopSmall: (smallStruct)v; - (smallStruct) loopSmallPtr: (smallStruct*)v; - (char*) loopString: (char*)v; - (char) retChar; - (double) retDouble; - (float) retFloat; - (int) retInt; - (largeStruct) retLarge; - (long) retLong; - (id) retObject; - (short) retShort; - (smallStruct) retSmall; - (char*) retString; @end @interface InvokeProxy : NSObject { id obj; } - (id) initWithTarget: (id)target; @end gnustep-base-1.29.0/Tests/base/NSInvocation/Resources/InvokeProxy.m000066400000000000000000000050241435650067400252260ustar00rootroot00000000000000/* InvokeProxy.h - Implementation of simple target and proxy classes Written By: Adam Fedor */ #include "InvokeProxy.h" #include #include #include #include //#include "GNUstepGuile/gstep_guile.h" @implementation InvokeTarget - (char) loopChar: (char)v { return v+1; } - (double) loopDouble: (double)v { return v+1.0; } - (float) loopFloat: (float)v { return v+1.0; } - (int) loopInt: (int)v { return v+1; } - (largeStruct) loopLarge: (largeStruct)v { v.i += 1; return v; } - (long) loopLong: (long)v { return v+1; } - (largeStruct) loopLargePtr: (largeStruct*)v { return *v; } - (id) loopObject: (id)v { return v; } - (short) loopShort: (short)v { return v+1; } - (smallStruct) loopSmall: (smallStruct)v { v.i += 1; return v; } - (NSRect) loopRect: (NSRect)v { return v; } - (smallStruct) loopSmallPtr: (smallStruct*)v { return *v; } - (char*) loopString: (char*)v { v[0] += 1; return v; } - (char) retChar { return (char)99; } - (double) retDouble { return 123.456; } - (float) retFloat { return 123.456; } - (int) retInt { return 123456; } - (largeStruct) retLarge { static largeStruct l = { 99, "largeStruct", 99.99 }; return l; } - (long) retLong { return 123456; } - (id) retObject { return self; } - (short) retShort { return 12345; } - (smallStruct) retSmall { static smallStruct s = { 11, 22 }; return s; } - (char*) retString { return "string"; } - (id) returnIdButThrowException { [NSException raise: @"AnException" format: @"Deliberately thrown"]; return @"This string should not be returned"; } @end @implementation InvokeProxy #if 0 + (void) load { /* Make sure these classes are defined within gstep-guile, so tests can find them */ #define CCLS(X) gh_define(#X, gstep_id2scm([X class], NO)) CCLS(InvokeTarget); CCLS(InvokeProxy); } #endif - (id) initWithTarget: (id)target { obj = target; return self; } - (void) forwardInvocation: (NSInvocation*)inv { #if 1 [inv invokeWithTarget: obj]; #else NSData *d = [NSArchiver archivedDataWithRootObject: inv]; NSInvocation *i = [NSUnarchiver unarchiveObjectWithData: d]; unsigned l; void *b; [i invokeWithTarget: obj]; d = [NSArchiver archivedDataWithRootObject: i]; i = [NSUnarchiver unarchiveObjectWithData: d]; l = [[i methodSignature] methodReturnLength]; b = (void *)malloc(l); [i getReturnValue: b]; [inv setReturnValue: b]; free(b); #endif } @end gnustep-base-1.29.0/Tests/base/NSInvocation/TestInfo000066400000000000000000000000001435650067400222440ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSInvocation/basic.m000066400000000000000000000007331435650067400220420ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSMethodSignature *testSig = [NSMethodSignature signatureWithObjCTypes:"@@::"]; NSInvocation *testObj = [NSInvocation invocationWithMethodSignature:testSig]; test_alloc(@"NSInvocation"); test_NSObject(@"NSInvocation", [NSArray arrayWithObject:testObj]); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSInvocation/general.m000066400000000000000000000140511435650067400223740ustar00rootroot00000000000000#import "Testing.h" #import #import #import #import #import #import #import #import #import #import #import "InvokeProxyProtocol.h" /* these macros should only be used in the scope of main */ #define TEST_INVOKE(selx) \ { \ NS_DURING \ NSMethodSignature *sig = nil; \ sig = [tar methodSignatureForSelector:selx]; \ inv = [NSInvocation invocationWithMethodSignature:sig]; \ [inv setSelector:selx]; \ [inv invokeWithTarget:tar]; \ PASS(1,"Invoke %s",[NSStringFromSelector(selx) UTF8String]); \ NS_HANDLER \ PASS(0,"Invoke %s",[NSStringFromSelector(selx) UTF8String]); \ [localException raise]; \ NS_ENDHANDLER \ } #define TEST_INVOKE_ARG(selx,argp) \ { \ NS_DURING \ NSMethodSignature *sig = nil; \ sig = [tar methodSignatureForSelector:selx]; \ inv = [NSInvocation invocationWithMethodSignature:sig]; \ [inv setSelector:selx]; \ [inv setArgument:argp atIndex:2]; \ [inv invokeWithTarget:tar]; \ PASS(1,"Invoke %s",[NSStringFromSelector(selx) UTF8String]); \ NS_HANDLER \ PASS(0,"Invoke %s",[NSStringFromSelector(selx) UTF8String]); \ [localException raise]; \ NS_ENDHANDLER \ } int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSInvocation *inv = nil; NSObject *tar; NSObject *pxy; char cret,carg; short sret,sarg; int iret,iarg; long lret,larg; float fret,farg; double dret,darg; NSRect rret, rarg, rprx; id oret,oarg; char *cpret,*cparg,*cparg2; smallStruct ssret,ssarg; largeStruct lsret,lsarg; Class tClass = Nil; Class pClass = Nil; NSString *bundlePath; NSBundle *bundle; bundlePath = [[[NSFileManager defaultManager] currentDirectoryPath] stringByAppendingPathComponent:@"Resources"]; bundlePath = [[NSBundle bundleWithPath:bundlePath] pathForResource:@"InvokeProxy" ofType:@"bundle"]; bundle = [NSBundle bundleWithPath:bundlePath]; PASS([bundle load], "loading resources from bundle"); tClass = NSClassFromString(@"InvokeTarget"); pClass = NSClassFromString(@"InvokeProxy"); tar = [tClass new]; pxy = [[pClass alloc] initWithTarget:tar]; TEST_INVOKE(@selector(retChar)); [inv getReturnValue:&cret]; PASS(cret == 99 && [pxy retChar] == 99, "Can return chars"); TEST_INVOKE(@selector(retShort)); [inv getReturnValue:&sret]; PASS(sret == 12345 && [pxy retShort] == 12345, "Can return short"); TEST_INVOKE(@selector(retInt)); [inv getReturnValue:&iret]; PASS(iret == 123456 && [pxy retInt] == 123456, "Can return int"); TEST_INVOKE(@selector(retLong)); [inv getReturnValue:&lret]; PASS(lret == 123456 && [pxy retLong] == 123456, "Can return long"); TEST_INVOKE(@selector(retFloat)); [inv getReturnValue:&fret]; PASS(fabs(123.456 - fret) <= 0.001 && fabs(123.456 - [pxy retFloat]) <= 0.001, "Can return float"); TEST_INVOKE(@selector(retDouble)); [inv getReturnValue:&dret]; PASS(fabs(123.456 - dret) <= 0.001 && fabs(123.456 - [pxy retDouble]) <= 0.001, "Can return double"); TEST_INVOKE(@selector(retObject)); [inv getReturnValue:&oret]; PASS(oret == tar && tar == [pxy retObject], "Can return object"); carg = 1; TEST_INVOKE_ARG(@selector(loopChar:),&carg); [inv getReturnValue:&cret]; PASS(cret == 2 && 2 == [pxy loopChar:carg], "Can send/return chars"); sarg = 1; TEST_INVOKE_ARG(@selector(loopShort:),&sarg); [inv getReturnValue:&sret]; PASS(sret == 2 && [pxy loopShort:sarg] == 2, "Can send/return shorts"); iarg = 1; TEST_INVOKE_ARG(@selector(loopInt:),&iarg); [inv getReturnValue:&iret]; PASS(iret == 2 && [pxy loopInt:iarg] == 2, "Can send/return ints"); larg = 1; TEST_INVOKE_ARG(@selector(loopLong:),&larg); [inv getReturnValue:&lret]; PASS(lret == 2 && [pxy loopLong:larg] == 2, "Can send/return longs"); farg = 1; TEST_INVOKE_ARG(@selector(loopFloat:),&farg); [inv getReturnValue:&fret]; PASS(fabs(2 - fret) <= 0.001 && fabs(2 - [pxy loopFloat:farg]) <= 0.001, "Can send/return floats"); darg = 1; TEST_INVOKE_ARG(@selector(loopDouble:),&darg); [inv getReturnValue:&dret]; PASS(fabs(2 - dret) <= 0.001 && fabs(2 - [pxy loopFloat:darg]) <= 0.001, "Can send/return double"); oarg = pxy; TEST_INVOKE_ARG(@selector(loopObject:),&oarg); [inv getReturnValue:&oret]; PASS(oret == pxy && [pxy loopObject:oarg] == pxy, "Can send/return objects"); /* unlinke the rest of these loopString: modifies its arg */ cparg = malloc(sizeof("Hello There")); strcpy(cparg,"Hello There"); cparg2 = malloc(sizeof("Hello There")); strcpy(cparg2,"Hello There"); TEST_INVOKE_ARG(@selector(loopString:),&cparg); [inv getReturnValue:&cpret]; PASS(strcmp(cpret,"Iello There") == 0 && strcmp([pxy loopString:cparg2],"Iello There") == 0, "Can send/return char *"); ssarg.c = 7; ssarg.i = 9; TEST_INVOKE_ARG(@selector(loopSmall:),&ssarg); [inv getReturnValue:&ssret]; PASS(ssret.c == 7 && ssret.i == 10, "Can send/return small structs"); lsarg.i = 8; lsarg.s = "Hello"; lsarg.f = 11.0; TEST_INVOKE_ARG(@selector(loopLarge:),&lsarg); [inv getReturnValue:&lsret]; PASS(lsret.i == 9 && strcmp(lsret.s, "Hello") == 0 && lsret.f == 11.0, "Can send/return large structs"); rarg = NSMakeRect(1,2,3,4); TEST_INVOKE_ARG(@selector(loopRect:),&rarg); [inv getReturnValue:&rret]; rprx = [pxy loopRect:rarg]; PASS(NSEqualRects(rret, rarg) && NSEqualRects(rprx, rarg), "Can send/return NSRect"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSInvocation/test01.m000066400000000000000000000073011435650067400220770ustar00rootroot00000000000000#import "Testing.h" #import "ObjectTesting.h" #import "InvokeProxyProtocol.h" #import #import #import #import #import #import #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSInvocation *inv = nil; NSObject *tar; NSMethodSignature *sig; id ret; Class tClass = Nil; NSString *bundlePath; NSBundle *bundle; int retc; bundlePath = [[[NSFileManager defaultManager] currentDirectoryPath] stringByAppendingPathComponent:@"Resources"]; bundlePath = [[NSBundle bundleWithPath:bundlePath] pathForResource:@"InvokeProxy" ofType:@"bundle"]; bundle = [NSBundle bundleWithPath:bundlePath]; PASS([bundle load], "loading resources from bundle"); tClass = NSClassFromString(@"InvokeTarget"); tar = [tClass new]; /* Test if the return value is retained. It is in the Apple OpenStep edition for Windows (YellowBox) matt: this doesn't seem like a valid test as PASS/fail will vary on platforms */ sig = [tar methodSignatureForSelector:@selector(retObject)]; inv = [NSInvocation invocationWithMethodSignature: sig]; retc = [[tar retObject] retainCount]; [inv setSelector:@selector(retObject)]; [inv invokeWithTarget:tar]; if (nil == [NSGarbageCollector defaultCollector]) { PASS(retc + 1 == [[tar retObject] retainCount], "Retain return value") } sig = [tar methodSignatureForSelector:@selector(loopObject:)]; inv = [NSInvocation invocationWithMethodSignature: sig]; retc = [tar retainCount]; [inv setSelector:@selector(loopObject:)]; [inv invokeWithTarget:tar]; [inv retainArguments]; [inv setArgument:&tar atIndex:2]; if (nil == [NSGarbageCollector defaultCollector]) { PASS(retc + 1 == [tar retainCount], "Will Retain arguments after -retainArguments") } sig = [tar methodSignatureForSelector:@selector(loopObject:)]; inv = [NSInvocation invocationWithMethodSignature: sig]; retc = [tar retainCount]; [inv setSelector:@selector(loopObject:)]; [inv invokeWithTarget:tar]; [inv setArgument:&tar atIndex:2]; PASS(retc == [tar retainCount], "default will not retain arguments"); sig = [tar methodSignatureForSelector:@selector(retObject)]; inv = [NSInvocation invocationWithMethodSignature: sig]; [inv setSelector:@selector(retObject)]; [inv invokeWithTarget:nil]; [inv getReturnValue:&ret]; PASS(ret == nil,"Check if nil target works"); sig = [tar methodSignatureForSelector:@selector(returnIdButThrowException)]; inv = [NSInvocation invocationWithMethodSignature: sig]; [inv setSelector:@selector(returnIdButThrowException)]; PASS_EXCEPTION([inv invokeWithTarget:tar];,@"AnException","Exception in invocation #1"); PASS_EXCEPTION([inv getReturnValue:&ret];,NSGenericException,"Exception getting return value #1"); /* same as above but with a successful call first */ sig = [tar methodSignatureForSelector:@selector(returnIdButThrowException)]; inv = [NSInvocation invocationWithMethodSignature: sig]; [inv setSelector:@selector(retObject)]; [inv invokeWithTarget:tar]; /* these two lines */ [inv getReturnValue:&ret]; [inv setSelector:@selector(returnIdButThrowException)]; PASS_EXCEPTION([inv invokeWithTarget:tar];,@"AnException","Exception in invocation #2"); PASS_EXCEPTION([inv getReturnValue:&ret];,NSGenericException,"Exception getting return value #2"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSInvocation/test02.m000066400000000000000000000006711435650067400221030ustar00rootroot00000000000000#import #import "Testing.h" static int called = 0; @interface NSMessageTest : NSObject @end @implementation NSMessageTest - (void) methodToCall { called++; } @end int main(void) { NSAutoreleasePool* pool = [NSAutoreleasePool new]; NSMessageTest* test = [NSMessageTest new]; [NS_MESSAGE(test, methodToCall) invoke]; PASS(called > 0, "NS_MESSAGE worked"); [pool release]; return 0; } gnustep-base-1.29.0/Tests/base/NSInvocationOperation/000077500000000000000000000000001435650067400224615ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSInvocationOperation/TestInfo000066400000000000000000000000001435650067400241250ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSInvocationOperation/basic.m000066400000000000000000000046551435650067400237320ustar00rootroot00000000000000#import #import #import #import #import #import "ObjectTesting.h" int main() { START_SET("NSInvocationOperation - basic") NSInvocationOperation *op; NSInvocation *inv1; NSInvocation *inv2; NSValue *val; NSInteger length; NSString *hello = @"hello"; NSString *uppercaseHello; NSOperationQueue *queue = [NSOperationQueue new]; op = [[NSInvocationOperation alloc] initWithTarget: hello selector: @selector(length) object: nil]; [queue addOperations: [NSArray arrayWithObject: op] waitUntilFinished: YES]; val = [op result]; [val getValue: &length]; PASS((length == 5), "Can invoke a selector on a target"); RELEASE(op); inv1 = [NSInvocation invocationWithMethodSignature: [hello methodSignatureForSelector: @selector(uppercaseString)]]; [inv1 setTarget: hello]; [inv1 setSelector: @selector(uppercaseString)]; op = [[NSInvocationOperation alloc] initWithInvocation: inv1]; inv2 = [op invocation]; PASS(([inv2 isEqual: inv1]), "Can recover an operation's invocation"); [queue addOperations: [NSArray arrayWithObject: op] waitUntilFinished: YES]; uppercaseHello = [op result]; PASS_EQUAL(uppercaseHello, @"HELLO", "Can schedule an NSInvocation"); RELEASE(op); op = [[NSInvocationOperation alloc] initWithTarget: hello selector: @selector(release) object: nil]; [queue addOperations: [NSArray arrayWithObject: op] waitUntilFinished: YES]; PASS_EXCEPTION(([op result]), NSInvocationOperationVoidResultException, "Can't get result of a void invocation"); RELEASE(op); op = [[NSInvocationOperation alloc] initWithTarget: hello selector: @selector(length) object: nil]; [op cancel]; [queue addOperations: [NSArray arrayWithObject: op] waitUntilFinished: YES]; PASS_EXCEPTION(([op result]), NSInvocationOperationCancelledException, "Can't get the result of a cancelled invocation"); RELEASE(op); op = [[NSInvocationOperation alloc] initWithTarget: hello selector: @selector(length) object: nil]; PASS(([op result] == nil), "Result is nil before the invocation has completed"); RELEASE(op); RELEASE(queue); END_SET("NSInvocationOperation - basic") return 0; } gnustep-base-1.29.0/Tests/base/NSJSONSerialization/000077500000000000000000000000001435650067400217765ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSJSONSerialization/TestInfo000066400000000000000000000000001435650067400234420ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSJSONSerialization/json.m000066400000000000000000000040001435650067400231170ustar00rootroot00000000000000#import #import "ObjectTesting.h" int main(void) { [NSAutoreleasePool new]; // Simple test JSON, used for all of the examples NSString *json = @"\ {\ \"Image\": {\ \"Width\": 800,\ \"Height\": 600,\ \"Title\": \"View from 15th Floor\",\ \"Thumbnail\": {\ \"Url\": \"http://www.example.com/image/481989943\",\ \"Height\": 125,\ \"Width\": \"100\"\ },\ },\ \"emptyString\":\"\",\"emptyArray\":[],\"emptyObject\":{},\ \"IDs\": [116, 943, 234, 38793],\ \"escapeTest\": \"\\\"\\u0001\"\ \"double\": 123.456789012254,\ }"; NSStringEncoding encs[] = {\ NSUTF8StringEncoding,\ NSUTF16LittleEndianStringEncoding,\ NSUTF16BigEndianStringEncoding,\ NSUTF32LittleEndianStringEncoding,\ NSUTF32BigEndianStringEncoding}; NSInputStream *is; NSData *data; id obj; int i; for (i = 0; i < (sizeof(encs) / sizeof(NSStringEncoding)); i++) { NSError *e; id tmp; data = [json dataUsingEncoding: encs[i]]; tmp = [NSJSONSerialization JSONObjectWithData: data options: 0 error: &e]; if (i > 0) { PASS([tmp isEqual: obj], "Decoding in different encodings give the same result"); } obj = tmp; } PASS([obj count] == 7, "Decoded dictionary had the right number of elements"); PASS([NSJSONSerialization isValidJSONObject: obj], "Can serialise deserialised JSON"); data = [NSJSONSerialization dataWithJSONObject: obj options: NSJSONWritingPrettyPrinted error: 0]; PASS_EQUAL([NSJSONSerialization JSONObjectWithData: data options: 0 error: 0], obj, "Round trip worked with pretty printing"); data = [NSJSONSerialization dataWithJSONObject: obj options: 0 error: 0]; PASS_EQUAL([NSJSONSerialization JSONObjectWithData: data options: 0 error: 0], obj, "Round trip worked with ugly printing"); is = [NSInputStream inputStreamWithData: data]; PASS_EQUAL([NSJSONSerialization JSONObjectWithStream: is options: 0 error: 0], obj, "Round trip worked through stream"); return 0; } gnustep-base-1.29.0/Tests/base/NSJSONSerialization/tests00.m000066400000000000000000000346211435650067400234640ustar00rootroot00000000000000// // Created by Larry Campbell on 12/12/08. // #import #import "ObjectTesting.h" @interface GnustepBaseTests : NSObject { unsigned _successes; unsigned _failures; } @end @implementation GnustepBaseTests - (BOOL) performTest: (NSString *)name { NSAutoreleasePool *pool = [NSAutoreleasePool new]; BOOL result; NSLog(@"Performing test %@", name); NS_DURING { [self performSelector: NSSelectorFromString(name)]; _successes++; result = YES; } NS_HANDLER { NSLog(@"Test %@ failed: %@", name, [localException reason]); _failures++; result = NO; } NS_ENDHANDLER [pool release]; return result; } - (unsigned) successes { return _successes; } - (unsigned) failures { return _failures; } @end @interface GnustepBaseTests(TheTests) @end @implementation GnustepBaseTests(TheTests) - (void) cr39118 { int x = 1999999999; NSString *s = @"1999999999"; NSAssert([s intValue] == x, @"intValue botch"); } // verify that distinct strings get distinct hashes even if strings are very long - (void) cr48439 { NSMutableSet *hashes = [NSMutableSet set]; NSArray *strings = [NSArray arrayWithObjects: @"", @"a", @"aa", @"123456789012345678901234567890123456789012345678901234567890123", @"123456789012345678901234567890123456789012345678901234567890123a", @"123456789012345678901234567890123456789012345678901234567890123b", @"123456789012345678901234567890123456789012345678901234567890123c", @"123456789012345678901234567890123456789012345678901234567890123d", @"1234567890123456789012345678901234567890123456789012345678901234", @"1234567890123456789012345678901234567890123456789012345678901234a", @"1234567890123456789012345678901234567890123456789012345678901234b", @"1234567890123456789012345678901234567890123456789012345678901234c", @"1234567890123456789012345678901234567890123456789012345678901234d", @"12345678901234567890123456789012345678901234567890123456789012345", @"12345678901234567890123456789012345678901234567890123456789012345a", @"12345678901234567890123456789012345678901234567890123456789012345b", @"12345678901234567890123456789012345678901234567890123456789012345c", @"12345678901234567890123456789012345678901234567890123456789012345d", @"123456789012345678901234567890123456789012345678901234567890123456789012345", @"123456789012345678901234567890123456789012345678901234567890123456789012345a", @"123456789012345678901234567890123456789012345678901234567890123456789012345b", @"123456789012345678901234567890123456789012345678901234567890123456789012345c", @"123456789012345678901234567890123456789012345678901234567890123456789012345d", nil]; NSString *s; NSEnumerator *e; e = [strings objectEnumerator]; while ((s = [e nextObject]) != nil) [hashes addObject:[NSNumber numberWithUnsignedInt:[s hash]]]; NSAssert([hashes count] == [strings count], @"hash botch"); } // this also covers CR 150661 - (void)cr153594 { NSDate *t1 = [NSDate date]; NSDate *t2; NSData *d; d = [NSKeyedArchiver archivedDataWithRootObject: t1]; t2 = [NSKeyedUnarchiver unarchiveObjectWithData: d]; NSAssert([t1 isEqual:t2], @"equality botch"); } - (void)cr1524466 { NSURL *u = [[[NSURL alloc] initWithScheme: @"http" host: @"1.2.3.4" path: @"/a?b;foo"] autorelease]; NSString *s = [[u absoluteURL] description]; NSAssert([s isEqual: @"http://1.2.3.4/a?b;foo"], @"NSURL encoding botch"); } - (void)cr2096767 { static struct { NSString *inputString; NSTimeInterval increment; NSString *expectedOutput; } tests[] = { { @"2006-04-22 22:22:22:901", 0.0, @"2006-04-22 22:22:22:901" }, // gnustep bug https://savannah.gnu.org/bugs/?func=detailitem&item_id=16426 { @"2006-04-22 22:22:22:999", 0.0, @"2006-04-22 22:22:22:999" }, { @"2006-04-22 22:22:22:999", 0.0005, @"2006-04-22 22:22:22:999" }, { @"2006-04-22 22:22:22:999", 0.0006, @"2006-04-22 22:22:22:999" }, { @"2006-04-22 22:22:22:999", 0.0007, @"2006-04-22 22:22:22:999" }, { @"2006-04-22 22:22:22:999", 0.0008, @"2006-04-22 22:22:22:999" }, { @"2006-04-22 22:22:22:999", 0.00089, @"2006-04-22 22:22:22:999" }, { @"2006-04-22 22:22:22:999", 0.000899, @"2006-04-22 22:22:22:999" }, { @"2006-04-22 22:22:22:999", 0.0008999, @"2006-04-22 22:22:22:999" }, { @"2006-04-22 22:22:22:999", 0.00089999, @"2006-04-22 22:22:23:000" }, { @"2006-04-22 22:22:22:999", 0.0009, @"2006-04-22 22:22:23:000" }, // CR https://bugzilla.akamai.com/show_bug.cgi?id=2096767 }; unsigned i; NSString *fmt = [NSString stringWithFormat: @"%%Y-%%m-%%d %%H:%%M:%%S:%%F"]; for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) { NSString *inputString = tests[i].inputString; NSString *expectedOutput = tests[i].expectedOutput; NSCalendarDate *d1 = [NSCalendarDate dateWithString:inputString calendarFormat:fmt]; NSCalendarDate *d2 = [[[NSCalendarDate alloc] initWithTimeInterval:tests[i].increment sinceDate:d1] autorelease]; NSString *result = [d2 descriptionWithCalendarFormat:fmt]; NSLog(@"input string: %@, increment: %.4f", inputString, tests[i].increment); NSLog(@"input date: %@", d1); NSLog(@"output date: %@", result); NSLog(@"expect: %@", expectedOutput); NSAssert([result isEqualToString:expectedOutput], @"mismatch"); } } - (void)cr2549370 { NSString *path = @"./json.data"; NSString *string = @"Hello garçon! ¡Ola! A little more coöperation please!"; NSMutableDictionary *dict = [NSMutableDictionary dictionary]; NSMutableArray *array = [NSMutableArray array]; NSData *d; NSInputStream *stream; [array addObject:[NSDictionary dictionaryWithObjectsAndKeys:string, @"nickname", nil]]; [dict setObject:array forKey: @"datacenters"]; d = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:0]; [d writeToFile:path atomically:NO]; stream = [NSInputStream inputStreamWithFileAtPath:path]; [stream open]; dict = [NSJSONSerialization JSONObjectWithStream:stream options:0 error:0]; dict = [[dict objectForKey: @"datacenters"] objectAtIndex:0]; [[NSFileManager defaultManager] removeFileAtPath: path handler: nil]; NSAssert(dict != nil, @"JSON returned nil"); NSAssert([string isEqualToString:[dict objectForKey: @"nickname"]], @"data mismatch"); } void checkstr(NSString *expected, NSString *got) { if ([expected caseInsensitiveCompare:got] != NSOrderedSame) { NSLog(@"expected %@", expected); NSLog(@" got %@", got); [NSException raise: @"error" format: @"test failed"]; } } // This is copied from servermonitor. We want to use the same quoting rules it does. // We use this only for the username and password; we assume the path/query/fragment // is already escaped. static NSString *percentQuoted(NSString *s) { NSMutableString *retval = [NSMutableString stringWithCapacity:[s length]]; const unsigned char *p = (const unsigned char *)[s UTF8String]; unsigned char c; const char *allowedNonalnumChars = "-_,.'~!$&*();"; while ((c = *p++) != '\0') { if (isalnum(c) || strchr(allowedNonalnumChars, c) != 0) { [retval appendFormat: @"%c", c]; } else { [retval appendFormat: @"%%%02x", c]; } } return retval; } - (void)urlTest { static NSString *schemes[] = { @"ftp", @"http", @"https" }; static NSString *hosts[] = { @"www.akamai.com", @"10.0.1.1", @"localhost" }; static NSString *usernames[] = { nil, @"username", @"foo", @"a_username" }; static NSString *passwords[] = { nil, @"password", @"M@nx2y#" }; // The path/query/fragment part here must be percent-quoted // as it would have to be if pasted into a curl command. struct { NSString *pqf; // path, query, fragment NSString *path; // expected path returned from NSURL (nil if same as pqf) } pqfs[] = { { @"/", nil }, { @"/foo/bar/zot", nil }, { @"/a%20dillar%20a%20dollar", nil }, { @"/foo:bar:zot", nil }, { @"/a?b;foo", @"/a" }, { @"/a%25b", nil }, { @"/MHcwdTBOMEwwSjAJBgUrDgMCGgUABBScDhI23ZEqCpe2zGqbkoJVvUaDTgQUf/ZMNigUrs0eN6/eWvJbw6CsK/4CEQCbL3Mm0kXS8q7t0jI7E5gdoiMwITAfBgkrBgEFBQcwAQIEEgQQi7kTQMz7QK60KI2PnRR3mg==", nil }, { @"/interface/6/?mode=rc3&outputType=json&url=http%3A%2F%2Fwww.ehow.com%2Fhow_2324118_take-care-paper-cut.html&category=Health&subCategory=Family%20Health&subSubCategory=General%20Family%20Health&pageLocations=PLATFORM_TL|0&flushPage=1", @"/interface/6" }, { @"/d/search/p/enom/xml/domain/multiset/v4/?url=http%3A%2F%2Fnuseek.com&Partner=enom_internal_d2r_derp&config=1234567890&affilData=ip%3d127.0.0.1%26ua%3dIE|6.0|WinNT%26ur%3d&maxListings=10&maxRT=20&maxRTL=20&maxWeb=4&serveUrl=http://parkingweb30/default.pk", @"/d/search/p/enom/xml/domain/multiset/v4" }, }; unsigned i, j, k, l, m; for (i = 0; i < sizeof(schemes)/sizeof(schemes[0]); i++) { NSString *scheme = schemes[i]; for (j = 0; j < sizeof(hosts)/sizeof(hosts[0]); j++) { NSString *host = hosts[j]; for (k = 0; k < sizeof(usernames)/sizeof(usernames[0]); k++) { NSString *username = usernames[k]; for (l = 0; l < sizeof(passwords)/sizeof(passwords[0]); l++) { NSString *password = passwords[l]; for (m = 0; m < sizeof(pqfs)/sizeof(pqfs[0]); m++) { NSMutableString *hostpart = [NSMutableString string]; NSString *pqf = pqfs[m].pqf; NSString *expectedPath = [(pqfs[m].path == nil ? pqf : pqfs[m].path) stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSString *urlstring; NSURL *url; expectedPath = [(pqfs[m].path == nil ? pqf : pqfs[m].path) stringByReplacingPercentEscapesUsingEncoding: NSUTF8StringEncoding]; if (username != nil) { if (password != nil) { [hostpart appendFormat: @"%@:%@@", percentQuoted(username), percentQuoted(password)]; } else { [hostpart appendFormat: @"%@@", percentQuoted(username)]; } } [hostpart appendString:host]; urlstring = [NSString stringWithFormat: @"%@://%@%@", scheme, hostpart, pqf]; url = [[[NSURL alloc] initWithString: urlstring] autorelease]; // work around Apple bug, which rejects // objects containing vertical bar (turns out // gnustep is bug-for-bug compatible here, // so no need to make this Apple-only) if (url == nil && [pqf rangeOfString: @"|"].length != 0) { NSMutableString *fixedObject = [[pqf mutableCopy] autorelease]; unsigned n; do { n = [fixedObject replaceOccurrencesOfString: @"|" withString: @"%7C" options:0 range:NSMakeRange(0, [fixedObject length])]; } while (n != 0); urlstring = [NSString stringWithFormat: @"%@://%@%@", scheme, hostpart, fixedObject]; url = [[[NSURL alloc] initWithString:urlstring] autorelease]; } NSAssert(url != nil, @"URL creation failed"); NSAssert([[url scheme] isEqual:schemes[i]], @"scheme botch"); NSAssert((username == nil) == ([url user] == nil), @"username existence botch"); if (username != nil) { NSAssert([[url user] isEqual:username], @"username botch"); NSAssert((password == nil) == ([url password] == nil), @"password existence botch"); if (password != nil) { NSString *urlpassword = [[url password] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSAssert([urlpassword isEqual:password], @"password botch"); } } checkstr(expectedPath, [url path]); checkstr(urlstring, [[url absoluteURL] description]); NSAssert([[url host] isEqual:host], @"host botch"); NSAssert([[url path] isEqual:expectedPath], @"path botch"); } } } } } } - (void)longLongOverflow { NSNumber *big = [NSNumber numberWithUnsignedLongLong: 0xffffffffffffffff]; NSNumber *sml = [NSNumber numberWithLongLong: 0xffffffffffffffff]; NSData *data = [NSJSONSerialization dataWithJSONObject: big options: 0 error: NULL]; NSString *string = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding]; NSAssert([string isEqualToString:@"18446744073709551615"], @"unsigned long long"); [string release]; data = [NSJSONSerialization dataWithJSONObject: sml options: 0 error: NULL]; string = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding]; NSAssert([string isEqualToString:@"-1"], @"signed long long"); [string release]; } @end int main(int argc, char *argv[]) { int status = 0; NSAutoreleasePool *pool = [NSAutoreleasePool new]; GnustepBaseTests *gtb = [GnustepBaseTests new]; PASS([gtb performTest: @"cr39118"], "cr39118"); PASS([gtb performTest: @"cr48439"], "cr48439"); PASS([gtb performTest: @"cr153594"], "cr153594"); PASS([gtb performTest: @"urlTest"], "urlTest"); PASS([gtb performTest: @"cr1524466"], "cr1524466"); PASS([gtb performTest: @"cr2096767"], "cr2096767"); PASS([gtb performTest: @"cr2549370"], "cr2549370"); PASS([gtb performTest: @"longLongOverflow"], "longLongOverflow"); [gtb release]; [pool release]; return status; } gnustep-base-1.29.0/Tests/base/NSKeyedArchiver/000077500000000000000000000000001435650067400212145ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSKeyedArchiver/TestInfo000066400000000000000000000000001435650067400226600ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSKeyedArchiver/basic.m000066400000000000000000000010741435650067400224550ustar00rootroot00000000000000#import #import "ObjectTesting.h" int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; test_alloc_only(@"NSKeyedArchiver"); test_NSObject(@"NSKeyedArchiver",[NSArray arrayWithObject:[[NSKeyedArchiver alloc] initForWritingWithMutableData: [NSMutableData data]]]); test_alloc_only(@"NSKeyedUnarchiver"); test_NSObject(@"NSKeyedUnarchiver",[NSArray arrayWithObject:[[NSKeyedUnarchiver alloc] initForReadingWithData: [NSKeyedArchiver archivedDataWithRootObject: [NSData data]]]]); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSKeyedArchiver/create.m000066400000000000000000000014031435650067400226330ustar00rootroot00000000000000#import #import #import #import #import "Testing.h" #import "ObjectTesting.h" int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; id obj; NSMutableData *data1; obj = [NSKeyedArchiver alloc]; data1 = [NSMutableData dataWithLength: 0]; obj = [obj initForWritingWithMutableData: data1]; PASS((obj != nil && [obj isKindOfClass:[NSKeyedArchiver class]]), "-initForWritingWithMutableData seems ok"); PASS_EXCEPTION([[NSUnarchiver alloc] initForReadingWithData:nil];, @"NSInvalidArgumentException", "Creating an NSUnarchiver with nil data throws an exception"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSKeyedArchiver/general.m000066400000000000000000000062171435650067400230150ustar00rootroot00000000000000#import #import #import #import #import #import #import #import #import #import "Testing.h" #import "ObjectTesting.h" int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSString *val1, *val2, *val3, *s; NSNumber *val4; NSArray *vals1, *vals2; NSData *data1; NSMutableData *data2; NSArray *a; NSURL *u; NSMutableSet *ms; NSKeyedArchiver *archiver = nil; NSKeyedUnarchiver *unarchiver = nil; u = [NSURL URLWithString: @"http://www.w3.org/"]; ms = [NSMutableSet set]; [ms addObject: u]; data2 = [NSMutableData new]; archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData: data2]; [archiver setOutputFormat: NSPropertyListXMLFormat_v1_0]; [archiver encodeObject: ms forKey: @"root"]; [archiver finishEncoding]; NSLog(@"%*.*s", (unsigned)[data2 length], (unsigned)[data2 length], [data2 bytes]); ms = [NSKeyedUnarchiver unarchiveObjectWithData: data2]; PASS([[[ms anyObject] absoluteString] isEqual: @"http://www.w3.org/"], "Can archive and restore a URL"); [archiver release]; [data2 release]; PASS_RUNS(val1 = [NSString stringWithCString:"Archiver.dat"]; val2 = [NSString stringWithCString:"A Goodbye"]; val3 = [NSString stringWithCString:"Testing all strings"]; val4 = [NSNumber numberWithUnsignedInt: 100]; vals1 = [[[NSArray arrayWithObject:val1] arrayByAddingObject:val2] arrayByAddingObject: val4]; vals2 = [vals1 arrayByAddingObject: val2];, "We can build basic strings and arrays for tests"); PASS([NSKeyedArchiver archiveRootObject:vals2 toFile:val1], "archiveRootObject:toFile: seems ok"); data1 = [NSKeyedArchiver archivedDataWithRootObject:vals2]; PASS((data1 != nil && [data1 length] != 0), "archivedDataWithRootObject: seems ok"); a = [NSKeyedUnarchiver unarchiveObjectWithData:data1]; NSLog(@"From data: original array %@, decoded array %@",vals2, a); PASS((a != nil && [a isKindOfClass:[NSArray class]] && [a isEqual:vals2]), "unarchiveObjectWithData: seems ok"); a = [NSKeyedUnarchiver unarchiveObjectWithFile:val1]; NSLog(@"From file: original array %@, decoded array %@",vals2, a); PASS((a != nil && [a isKindOfClass:[NSArray class]] && [a isEqual:vals2]), "unarchiveObjectWithFile: seems ok"); // encode data2 = [[NSMutableData alloc] initWithCapacity: 10240]; archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData: data2]; [archiver encodeObject: val3 forKey: @"string"]; [archiver finishEncoding]; // decode... unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData: data2]; s = [[unarchiver decodeObjectForKey: @"string"] retain]; PASS((s != nil && [s isKindOfClass:[NSString class]] && [s isEqual: val3]), "encodeObject:forKey: seems okay"); [data2 release]; NSLog(@"Original string: %@, unarchived string: %@",val3, s); [[NSFileManager defaultManager] removeFileAtPath: val1 handler: nil]; [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSLocale/000077500000000000000000000000001435650067400176665ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSLocale/TestInfo000066400000000000000000000000001435650067400213320ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSLocale/basic.m000066400000000000000000000012551435650067400211300ustar00rootroot00000000000000#import "Testing.h" #import "ObjectTesting.h" #import #if defined(GS_USE_ICU) #define NSLOCALE_SUPPORTED GS_USE_ICU #else #define NSLOCALE_SUPPORTED 1 /* Assume Apple support */ #endif int main() { START_SET("NSLocale") id testObj; if (!NSLOCALE_SUPPORTED) SKIP("NSLocale not supported\nThe ICU library was not available when GNUstep-base was built") testObj = [NSLocale currentLocale]; test_NSObject(@"NSLocale", [NSArray arrayWithObject: testObj]); test_keyed_NSCoding([NSArray arrayWithObject: testObj]); test_NSCopying(@"NSLocale", @"NSLocale", [NSArray arrayWithObject: testObj], NO, NO); END_SET("NSLocale") return 0; } gnustep-base-1.29.0/Tests/base/NSLocale/create.m000066400000000000000000000014401435650067400213060ustar00rootroot00000000000000#import #import #import "ObjectTesting.h" #if defined(GS_USE_ICU) #define NSLOCALE_SUPPORTED GS_USE_ICU #else #define NSLOCALE_SUPPORTED 1 /* Assume Apple support */ #endif int main(void) { START_SET("NSLocale") NSLocale *locale; if (!NSLOCALE_SUPPORTED) SKIP("NSLocale not supported\nThe ICU library was not available when GNUstep-base was built") locale = [NSLocale systemLocale]; PASS (locale != nil, "+systemLocale returns non-nil"); TEST_FOR_CLASS(@"NSLocale", locale, "+systemLocale return a NSLocale"); locale = [NSLocale currentLocale]; PASS (locale != nil, "+currentLocale return non-nil"); TEST_FOR_CLASS(@"NSLocale", locale, "+currentLocale return a NSLocale"); END_SET("NSLocale") return 0; } gnustep-base-1.29.0/Tests/base/NSLocale/general.m000066400000000000000000000137161435650067400214710ustar00rootroot00000000000000#import #import #import #import "ObjectTesting.h" #if defined(GS_USE_ICU) #define NSLOCALE_SUPPORTED GS_USE_ICU #else #define NSLOCALE_SUPPORTED 1 /* Assume Apple support */ #endif int main(void) { START_SET("NSLocale") NSLocale *locale; id o; unichar u; if (!NSLOCALE_SUPPORTED) SKIP("NSLocale not supported\nThe ICU library was not available when GNUstep-base was built") // These tests don't really work all that well. I need to come up with // something better. Most of the ones that fail are because nil is returned. testHopeful = YES; locale = [[NSLocale alloc] initWithLocaleIdentifier: @"es_ES_PREEURO"]; PASS_EQUAL([locale objectForKey: NSLocaleIdentifier], @"es_ES@currency=ESP", "NSLocaleIdentifier key returns 'es_ES@currency=ESP'"); PASS_EQUAL([locale objectForKey: NSLocaleLanguageCode], @"es", "NSLocaleLanguageCode key returns 'es'"); PASS_EQUAL([locale objectForKey: NSLocaleCountryCode], @"ES", "NSLocaleCountryCode key returns 'ES'"); PASS_EQUAL([locale objectForKey: NSLocaleScriptCode], nil, "NSLocaleScriptCode key returns nil"); PASS_EQUAL([locale objectForKey: NSLocaleVariantCode], nil, "NSLocaleVariantCode key returns nil"); PASS_EQUAL([locale objectForKey: NSLocaleCollationIdentifier], nil, "NSLocaleCollationIdentifier key returns nil"); TEST_FOR_CLASS(@"NSCharacterSet", [locale objectForKey: NSLocaleExemplarCharacterSet], "NSLocaleExemplarCharacterSet key returns a NSCharacterSet"); TEST_FOR_CLASS(@"NSCalendar", [locale objectForKey: NSLocaleCalendar], "NSLocaleCalendar key returns a NSCalendar"); o = [locale objectForKey: NSLocaleUsesMetricSystem]; TEST_FOR_CLASS(@"NSNumber", o, "NSLocaleUsesMetricSystem key returns a NSNumber"); PASS_EQUAL(o, [NSNumber numberWithBool: YES], "NSLocaleUsesMetricSystem key returns YES"); PASS_EQUAL([locale objectForKey: NSLocaleMeasurementSystem], @"Metric", "NSLocaleMeasurementSystem key returns 'Metric'"); PASS_EQUAL([locale objectForKey: NSLocaleDecimalSeparator], @",", "NSLocaleDecimalSeparator key returns ','"); u = 8359; PASS_EQUAL([locale objectForKey: NSLocaleCurrencySymbol], [NSString stringWithCharacters: &u length: 1], "NSLocaleCurrencySymbol key returns 'xx3'"); PASS_EQUAL([locale objectForKey: NSLocaleCurrencyCode], @"ESP", "NSLocaleCurrencyCode key returns 'ESP'"); PASS_EQUAL([locale objectForKey: NSLocaleCollatorIdentifier], @"es_ES@currency=ESP", "NSLocaleCollatorIdentifier for Spain"); PASS_EQUAL([locale objectForKey: NSLocaleGroupingSeparator], @".", "NSLocaleGroupingSeparator key returns '.'"); u = 8216; PASS_EQUAL([locale objectForKey: NSLocaleQuotationBeginDelimiterKey], [NSString stringWithCharacters: &u length: 1], "NSLocaleQuotationBeginDelimiterKey key works"); u = 8217; PASS_EQUAL([locale objectForKey: NSLocaleQuotationEndDelimiterKey], [NSString stringWithCharacters: &u length: 1], "NSLocaleQuotationEndDelimiterKey key returns 'xx6'"); u = 8220; PASS_EQUAL([locale objectForKey: NSLocaleAlternateQuotationBeginDelimiterKey], [NSString stringWithCharacters: &u length: 1], "NSLocaleAlternateQuotationBeginDelimiterKey key returns 'xx7'"); u = 8221; PASS_EQUAL([locale objectForKey: NSLocaleAlternateQuotationEndDelimiterKey], [NSString stringWithCharacters: &u length: 1], "NSLocaleAlternateQuotationEndDelimiterKey key returns 'xx8'"); testHopeful = NO; RELEASE(locale); locale = [[NSLocale alloc] initWithLocaleIdentifier: @"en_US"]; PASS_EQUAL([locale localeIdentifier], @"en_US", "'en_US' is stored as 'en_US'."); PASS_EQUAL([locale objectForKey: NSLocaleScriptCode], nil, "en_US does not have script code"); PASS_EQUAL([locale objectForKey: NSLocaleVariantCode], nil, "en_US does not have variant code"); PASS_EQUAL([locale objectForKey: NSLocaleCollationIdentifier], nil, "en_US does not have a collation identifier"); PASS ([[locale objectForKey: NSLocaleUsesMetricSystem] boolValue] == NO, "en_US does not use the metric system"); RELEASE(locale); locale = [[NSLocale alloc] initWithLocaleIdentifier: @"zh-Hant_TW"]; PASS_EQUAL([locale objectForKey: NSLocaleCountryCode], @"TW", "zh-Hant_TW country code is TW"); PASS_EQUAL([locale objectForKey: NSLocaleLanguageCode], @"zh", "zh-Hant_TW language code is zh"); PASS_EQUAL([locale localeIdentifier], @"zh_TW", "'zh-Hant_TW' is stored as 'zh_TW'"); PASS_EQUAL([locale objectForKey: NSLocaleScriptCode], nil, "zh-Hant_TW has no script code"); RELEASE(locale); locale = [[NSLocale alloc] initWithLocaleIdentifier: @"zh-Hans_CN"]; PASS_EQUAL([locale objectForKey: NSLocaleCountryCode], @"CN", "zh-Hans_CN country code is CN"); PASS_EQUAL([locale objectForKey: NSLocaleLanguageCode], @"zh", "zh-Hans_CN language code is zh"); PASS_EQUAL([locale localeIdentifier], @"zh_CN", "'zh-Hans_CN' is stored as 'zh_CN'"); PASS_EQUAL([locale objectForKey: NSLocaleScriptCode], nil, "zh-Hans_CN has no script code"); RELEASE(locale); PASS_EQUAL([NSLocale canonicalLocaleIdentifierFromString: nil], nil, "Canonical identifier for nil is nil"); PASS_EQUAL([NSLocale canonicalLocaleIdentifierFromString: @""], @"", "Canonical identifier for an empty string is an empty string"); PASS_EQUAL([NSLocale canonicalLocaleIdentifierFromString: @"some rubbish"], @"some rubbish", "Canonical identifier for 'some rubbish is 'some rubbish'"); /* Let's just hope the next two PASS. */ testHopeful = YES; PASS_EQUAL([NSLocale canonicalLocaleIdentifierFromString: @"AmericanEnglish"], @"americanenglish", "Canonical identifier for 'AmericanEnglish is americanenglish"); PASS_EQUAL([NSLocale canonicalLanguageIdentifierFromString: @"AmericanEnglish"], @"americanenglish", "Canonical language identifier for 'AmericanEnglish is americanenglish"); END_SET("NSLocale") return 0; } gnustep-base-1.29.0/Tests/base/NSLock/000077500000000000000000000000001435650067400173575ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSLock/GNUmakefile.preamble000066400000000000000000000001051435650067400232130ustar00rootroot00000000000000 SUBPROJECTS = Helpers include $(GNUSTEP_MAKEFILES)/aggregate.make gnustep-base-1.29.0/Tests/base/NSLock/Helpers/000077500000000000000000000000001435650067400207615ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSLock/Helpers/GNUmakefile000066400000000000000000000004661435650067400230410ustar00rootroot00000000000000 include $(GNUSTEP_MAKEFILES)/common.make TOOL_NAME = doubleNSLock doubleNSConditionLock NEEDS_GUI = NO doubleNSLock_OBJC_FILES = doubleNSLock.m doubleNSConditionLock_OBJC_FILES = doubleNSConditionLock.m -include GNUmakefile.preamble include $(GNUSTEP_MAKEFILES)/tool.make -include GNUmakefile.postamble gnustep-base-1.29.0/Tests/base/NSLock/Helpers/doubleNSConditionLock.m000066400000000000000000000016761435650067400253440ustar00rootroot00000000000000 #import #import #import #import #import @interface MyClass : NSObject + (void) run; @end @implementation MyClass + (void) run { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSConditionLock *lock = [NSConditionLock new]; [lock lock]; [lock lock]; [arp release]; } @end int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; /* We need the user defaults system set up to allow NSLog to query it * when logging the deadlock message, but if the main thread is * sleeping then it can't get set up. So we set it up before we * start the test. */ [NSUserDefaults standardUserDefaults]; [NSThread detachNewThreadSelector: @selector(run) toTarget: [MyClass class] withObject: nil]; [NSThread sleepForTimeInterval: 1.0]; NSLog(@"Done."); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/NSLock/Helpers/doubleNSLock.m000066400000000000000000000016531435650067400234700ustar00rootroot00000000000000 #import #import #import #import #import @interface MyClass : NSObject + (void) run; @end @implementation MyClass + (void) run { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSLock *lock = [NSLock new]; [lock lock]; [lock lock]; [arp release]; } @end int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; /* We need the user defaults system set up to allow NSLog to query it * when logging the deadlock message, but if the main thread is * sleeping then it can't get set up. So we set it up before we * start the test. */ [NSUserDefaults standardUserDefaults]; [NSThread detachNewThreadSelector: @selector(run) toTarget: [MyClass class] withObject: nil]; [NSThread sleepForTimeInterval: 1.0]; NSLog(@"Done."); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/NSLock/RecursiveLock.m000066400000000000000000000031531435650067400223170ustar00rootroot00000000000000#import #import "../../../Headers/GNUstepBase/config.h" #import "Testing.h" int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; BOOL ret; NSLock *lock = [NSRecursiveLock new]; ret = [lock tryLock]; if (ret) [lock unlock]; PASS(ret, "NSRecursiveLock with tryLock, then unlocking"); ret = [lock lockBeforeDate: [NSDate dateWithTimeIntervalSinceNow:1]]; if (ret) [lock unlock]; PASS(ret, "NSRecursiveLock lockBeforeDate: works"); ret = [lock tryLock]; if (ret) { ret = [lock lockBeforeDate: [NSDate dateWithTimeIntervalSinceNow:1]]; if (ret) { [lock unlock]; } [lock unlock]; } PASS(ret, "NSRecursiveLock lockBeforeDate: with NSRecursiveLock returns YES"); #if defined(GNUSTEP_BASE_LIBRARY) START_SET("mutex ownership extension") #if !defined(HAVE_PTHREAD_MUTEX_OWNER) SKIP("mutex ownership feature not available") #endif NS_DURING { testHopeful = YES; PASS([lock isLockedByCurrentThread] == NO, "NSRecursiveLock isLockedByCurrentThread returns NO when not locked"); [lock lock]; PASS([lock isLockedByCurrentThread] == YES, "NSRecursiveLock isLockedByCurrentThread returns YES when locked"); [lock unlock]; PASS([lock isLockedByCurrentThread] == NO, "NSRecursiveLock isLockedByCurrentThread returns NO when unlocked"); testHopeful = NO; } NS_HANDLER { NSLog(@"-isLockedByCurrentThread not supported"); } NS_ENDHANDLER END_SET("mutex ownership extension") #endif [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSLock/TestInfo000066400000000000000000000000001435650067400210230ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSLock/condlock.m000066400000000000000000000036071435650067400213370ustar00rootroot00000000000000#import #import "Testing.h" @interface Queue : NSObject { NSMutableArray *queue; NSConditionLock *lock; } - (void) enqueue: (id)object; - (id) dequeue; @end @implementation Queue - (id) init { if (nil == (self = [super init])) { return nil; } queue = [[NSMutableArray alloc] init]; lock = [[NSConditionLock alloc] initWithCondition: 0]; return self; } - (void) enqueue: (id)object { [lock lock]; [queue addObject: object]; [lock unlockWithCondition: 1]; } - (id) dequeue { id element; NSUInteger count; [lock lockWhenCondition: 1]; element = [[[queue objectAtIndex: 0] retain] autorelease]; [queue removeObjectAtIndex: 0]; count = [queue count]; if (count > 0) { [lock unlockWithCondition: 1]; } else { [lock unlockWithCondition: 0]; } return element; } @end NSMutableArray *received; @interface Consumer : NSObject @end @implementation Consumer - (void) consumeFromQueue: (Queue*)q { while (1) { id p = [NSAutoreleasePool new]; [received addObject: [q dequeue]]; [p release]; } } @end int main(void) { [NSAutoreleasePool new]; { Queue *q = [Queue new]; NSMutableArray *sent = [NSMutableArray new]; received = [NSMutableArray new]; unsigned int i; [NSThread detachNewThreadSelector: @selector(consumeFromQueue:) toTarget: [Consumer new] withObject: q]; for (i = 0; i < 10000; i++) { id obj = [NSNumber numberWithUnsignedInt: i]; [sent addObject: obj]; if (i % 10 == 0) { [NSThread sleepForTimeInterval: 0.0]; } if (i % 1000 == 0) { [NSThread sleepForTimeInterval: 1.0]; } [q enqueue: obj]; } [NSThread sleepForTimeInterval: 2.0]; PASS([sent isEqual: received], "Condition lock"); } return 0; } gnustep-base-1.29.0/Tests/base/NSLock/doubleLocking.m000066400000000000000000000056231435650067400223240ustar00rootroot00000000000000#import #import "Testing.h" #import "ObjectTesting.h" int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSFileManager *mgr; NSString *helpers; NSString *command; NSTask *task; NSPipe *ePipe; NSFileHandle *hdl; NSData *data; NSString *string; NSLock *lock = nil; unsigned count; mgr = [NSFileManager defaultManager]; helpers = [mgr currentDirectoryPath]; helpers = [helpers stringByAppendingPathComponent: @"Helpers"]; helpers = [helpers stringByAppendingPathComponent: @"obj"]; command = [helpers stringByAppendingPathComponent: @"doubleNSLock"]; task = [[NSTask alloc] init]; ePipe = [[NSPipe pipe] retain]; [task setLaunchPath: command]; [task setStandardError: ePipe]; hdl = [ePipe fileHandleForReading]; [task launch]; for (count = 0; count < 10 && [task isRunning]; count++) { [NSThread sleepForTimeInterval: 1.0]; } data = [hdl availableData]; NSLog(@"Data was %*.*s", [data length], [data length], [data bytes]); string = [NSString alloc]; string = [string initWithData: data encoding: NSISOLatin1StringEncoding]; PASS([string rangeOfString: @"deadlock"].length > 0, "NSLock reported deadlock as expected"); if (NO == testPassed) { PASS(count == 10, "NSLock seems to have deadlocked as expected") [task terminate]; } [task waitUntilExit]; command = [helpers stringByAppendingPathComponent: @"doubleNSConditionLock"]; task = [[NSTask alloc] init]; ePipe = [[NSPipe pipe] retain]; [task setLaunchPath: command]; [task setStandardError: ePipe]; hdl = [ePipe fileHandleForReading]; [task launch]; for (count = 0; count < 10 && [task isRunning]; count++) { [NSThread sleepForTimeInterval: 1.0]; } data = [hdl availableData]; NSLog(@"Data was %*.*s", [data length], [data length], [data bytes]); string = [NSString alloc]; string = [string initWithData: data encoding: NSISOLatin1StringEncoding]; PASS([string rangeOfString: @"deadlock"].length > 0, "NSConditionLock reported deadlock as expected"); if (NO == testPassed) { PASS(count == 10, "NSConditionLock seems to have deadlocked as expected") [task terminate]; } [task waitUntilExit]; ASSIGN(lock,[NSRecursiveLock new]); [lock lock]; [lock lock]; [lock unlock]; [lock unlock]; ASSIGN(lock,[NSLock new]); PASS([lock tryLock] == YES, "NSLock can tryLock"); PASS([lock tryLock] == NO, "NSLock says NO for recursive tryLock"); [lock unlock]; ASSIGN(lock,[NSConditionLock new]); PASS([lock tryLock] == YES, "NSConditionLock can tryLock"); PASS([lock tryLock] == NO, "NSConditionLock says NO for recursive tryLock"); [lock unlock]; ASSIGN(lock,[NSRecursiveLock new]); PASS([lock tryLock] == YES, "NSRecursiveLock can tryLock"); PASS([lock tryLock] == YES, "NSRecursiveLock says YES for recursive tryLock"); [lock unlock]; [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/NSLock/tryLock.m000066400000000000000000000041601435650067400211650ustar00rootroot00000000000000#import #import "Testing.h" int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; BOOL ret; id lock; lock = [NSLock new]; ret = [lock tryLock]; if (ret) [lock unlock]; PASS(ret, "NSLock with tryLock, then unlocking"); ASSIGN(lock,[NSLock new]); [lock tryLock]; ret = [lock tryLock]; if (ret) [lock unlock]; PASS(ret == NO, "Recursive try lock with NSLock should return NO"); ASSIGN(lock,[NSConditionLock new]); [lock lock]; ret = [lock tryLock]; if (ret) [lock unlock]; PASS(ret == NO, "Recursive try lock with NSConditionLock should return NO"); ret = [lock tryLockWhenCondition: 42]; if (ret) [lock unlock]; PASS(ret == NO, "Recursive tryLockWhenCondition: with NSConditionLock (1) should return NO"); [lock unlockWithCondition: 42]; [lock lock]; ret = [lock tryLockWhenCondition: 42]; if (ret) [lock unlock]; PASS(ret == NO, "Recursive tryLockWhenCondition: with NSConditionLock (2) should return NO"); ASSIGN(lock,[NSRecursiveLock new]); [lock tryLock]; ret = [lock tryLock]; if (ret) [lock unlock]; PASS(ret == YES, "Recursive try lock with NSRecursiveLock should return YES"); ASSIGN(lock,[NSLock new]); ret = [lock lockBeforeDate: [NSDate dateWithTimeIntervalSinceNow: 1]]; if (ret) [lock unlock]; PASS(ret, "NSLock lockBeforeDate: works"); ASSIGN(lock,[NSLock new]); [lock tryLock]; ret = [lock lockBeforeDate: [NSDate dateWithTimeIntervalSinceNow: 1]]; if (ret) [lock unlock]; PASS(ret == NO, "Recursive lockBeforeDate: with NSLock returns NO"); ASSIGN(lock,[NSConditionLock new]); [lock tryLock]; ret = [lock lockBeforeDate: [NSDate dateWithTimeIntervalSinceNow: 1]]; if (ret) [lock unlock]; PASS(ret == NO, "Recursive lockBeforeDate: with NSConditionLock returns NO"); ASSIGN(lock,[NSRecursiveLock new]); [lock tryLock]; ret = [lock lockBeforeDate: [NSDate dateWithTimeIntervalSinceNow: 1]]; if (ret) [lock unlock]; PASS(ret == YES, "Recursive lockBeforeDate: with NSRecursiveLock returns YES"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSMapTable/000077500000000000000000000000001435650067400201545ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSMapTable/TestInfo000066400000000000000000000000001435650067400216200ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSMapTable/basic.m000066400000000000000000000011111435650067400214050ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSMapTable *testObj; testObj = [[NSMapTable new] autorelease]; [testObj setObject: @"hello" forKey: @"there"]; test_alloc(@"NSMapTable"); test_NSObject(@"NSMapTable", [NSArray arrayWithObject: testObj]); test_NSCopying(@"NSMapTable",@"NSMapTable", [NSArray arrayWithObject: testObj], NO, YES); // test_NSCoding([NSArray arrayWithObject: testObj]); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSMapTable/create.m000066400000000000000000000016241435650067400216000ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSString *val1, *val2, *val3; NSMapTable *obj; id vals[3]; val1 = @"Hello"; val2 = @"Goodbye"; val3 = @"Testing"; vals[0] = val1; vals[1] = val2; vals[2] = val3; obj = [[NSMapTable new] autorelease]; PASS(obj != nil && [obj isKindOfClass:[NSMapTable class]] && [obj count] == 0, "+new creates an empty hash table"); [obj setObject: val1 forKey: @"Key1"]; PASS([obj count] == 1, "-setObject:forKey increments count"); [obj setObject: nil forKey: @"Key2"]; PASS([obj count] == 2, "-setObject:forKey: works with nil value"); PASS_EXCEPTION([obj setObject: val1 forKey: nil];, NSInvalidArgumentException, "-setObject:forKey: raises with nil key"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSMapTable/general.m000066400000000000000000000002621435650067400217470ustar00rootroot00000000000000#import #import "ObjectTesting.h" int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSMapTable/weakObjects.m000066400000000000000000000021471435650067400225770ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import #if __has_include() #include #endif int main() { START_SET("NSMapTable weak objects") #ifdef OBJC_CAP_ARC if (!objc_test_capability(OBJC_CAP_ARC)) #endif { SKIP("ARC support unavailable") } NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSMapTable *mapTable = [NSMapTable strongToWeakObjectsMapTable]; NSAutoreleasePool *arp2 = [NSAutoreleasePool new]; id testObj1 = [[[NSObject alloc] init] autorelease]; id testObj2 = [[[NSObject alloc] init] autorelease]; [mapTable setObject:testObj1 forKey:@"test"]; PASS([mapTable objectForKey:@"test"] == testObj1, "Table retains first active weak reference"); [mapTable setObject:testObj2 forKey:@"test"]; PASS([mapTable objectForKey:@"test"] == testObj2, "Table retains second active weak reference"); [arp2 release]; arp2 = nil; PASS([mapTable objectForKey:@"test"] == nil, "Table removes dead weak reference"); [arp release]; arp = nil; END_SET("NSMapTable weak objects") return 0; } gnustep-base-1.29.0/Tests/base/NSMethodSignature/000077500000000000000000000000001435650067400215715ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSMethodSignature/TestInfo000066400000000000000000000000001435650067400232350ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSMethodSignature/general.m000066400000000000000000000232031435650067400233640ustar00rootroot00000000000000#import "Testing.h" #import #import #import #import #import #import #if GNUSTEP #import #define SRV_NAME @"nsmethodsignaturetest" struct _MyLargeStruct { double first; double second; }; typedef struct _MyLargeStruct MyLargeStruct; struct _MySmallStruct { char first; }; typedef struct _MySmallStruct MySmallStruct; /*------------------------------------*/ @interface MyClass : NSObject -(void)void_void; -(id)id_void; -(char)char_void; -(unsigned char)uchar_void; -(signed char)schar_void; -(short)short_void; -(unsigned short)ushort_void; -(signed short)sshort_void; -(int)int_void; -(unsigned int)uint_void; -(signed int)sint_void; -(long)long_void; -(unsigned long)ulong_void; -(signed long)slong_void; -(float)float_void; -(double)double_void; -(MyLargeStruct)largeStruct_void; -(MySmallStruct)smallStruct_void; -(void)void_id:(id)_id; -(void)void_char:(char)_char; -(void)void_uchar:(unsigned char)_char; -(void)void_schar:(signed char)_char; -(void)void_short:(short)_short; -(void)void_ushort:(unsigned short)_short; -(void)void_sshort:(signed short)_short; -(void)void_int:(int)_int; -(void)void_uint:(unsigned int)_int; -(void)void_sint:(signed int)_int; -(void)void_long:(long)_long; -(void)void_ulong:(unsigned long)_long; -(void)void_slong:(signed long)_long; -(void)void_float:(float)_float; -(void)void_double:(double)_double; -(void)void_largeStruct:(MyLargeStruct)_str; -(void)void_smallStruct:(MySmallStruct)_str; -(void)void_float:(float)_float double:(double)_double; -(void)void_double:(double)_double float:(float)_float; -(MyLargeStruct)largeStruct_id:(id)_id char:(char)_char short:(short)_short int:(int)_int long:(long)_long float:(float)_float double:(double)_double largeStruct:(MyLargeStruct)_lstr smallStruct:(MySmallStruct)_sstr; -(MySmallStruct)smallStruct_id:(id)_id uchar:(unsigned char)_uchar ushort:(unsigned short)_ushort uint:(unsigned int)_uint ulong:(unsigned long)_ulong float:(float)_float double:(double)_double largeStruct:(MyLargeStruct)_lstr smallStruct:(MySmallStruct)_sstr; -(const char *)runtimeSignatureForSelector:(SEL)selector; @end @implementation MyClass -(void)void_void {} -(id)id_void { return 0; } -(char)char_void { return 0; } -(unsigned char)uchar_void { return 0; } -(signed char)schar_void { return 0; } -(short)short_void { return 0; } -(unsigned short)ushort_void { return 0; } -(signed short)sshort_void { return 0; } -(int)int_void { return 0; } -(unsigned int)uint_void { return 0; } -(signed int)sint_void { return 0; } -(long)long_void { return 0; } -(unsigned long)ulong_void { return 0; } -(signed long)slong_void { return 0; } -(float)float_void { return 0; } -(double)double_void { return 0; } -(MyLargeStruct)largeStruct_void { MyLargeStruct str; return str; } -(MySmallStruct)smallStruct_void { MySmallStruct str; return str; } -(void)void_id:(id)_id {} -(void)void_char:(char)_char {} -(void)void_uchar:(unsigned char)_char {} -(void)void_schar:(signed char)_char {} -(void)void_short:(short)_short {} -(void)void_ushort:(unsigned short)_short {} -(void)void_sshort:(signed short)_short {} -(void)void_int:(int)_int {} -(void)void_uint:(unsigned int)_int {} -(void)void_sint:(signed int)_int {} -(void)void_long:(long)_long {} -(void)void_ulong:(unsigned long)_long {} -(void)void_slong:(signed long)_long {} -(void)void_float:(float)_float {} -(void)void_double:(double)_double {} -(void)void_largeStruct:(MyLargeStruct)_str {} -(void)void_smallStruct:(MySmallStruct)_str {} -(void)void_float:(float)_float double:(double)_double {} -(void)void_double:(double)_double float:(float)_float {} -(MyLargeStruct)largeStruct_id:(id)_id char:(char)_char short:(short)_short int:(int)_int long:(long)_long float:(float)_float double:(double)_double largeStruct:(MyLargeStruct)_lstr smallStruct:(MySmallStruct)_sstr { return _lstr; } -(MySmallStruct)smallStruct_id:(id)_id uchar:(unsigned char)_uchar ushort:(unsigned short)_ushort uint:(unsigned int)_uint ulong:(unsigned long)_ulong float:(float)_float double:(double)_double largeStruct:(MyLargeStruct)_lstr smallStruct:(MySmallStruct)_sstr { return _sstr; } -(const char *)runtimeSignatureForSelector:(SEL)selector { GSMethod meth = GSGetMethod(object_getClass(self), selector, YES, YES); return method_getTypeEncoding (meth); } @end /*------------------------------------*/ /* This test is useful if the nsmethodsignatureserver is running which was compiled with either a different GNUstep-base version or a different version of gcc. It the server isn't found the test is skipped. */ void test_compare_server_signature(void) { id objct = [MyClass new]; id proxy = [NSConnection rootProxyForConnectionWithRegisteredName: SRV_NAME host: nil]; if (proxy) { const char *rmtSig; const char *lclSig; const char *msg; #define TEST_SEL(SELNAME) { \ BOOL ok; \ lclSig = [objct runtimeSignatureForSelector: @selector(SELNAME)]; \ rmtSig = [proxy runtimeSignatureForSelector: @selector(SELNAME)]; \ msg = [[NSString stringWithFormat: @"runtime: sel:%s\nlcl:%s\nrmt:%s", \ GSNameFromSelector(@selector(SELNAME)), lclSig, rmtSig] UTF8String]; \ ok = GSSelectorTypesMatch(lclSig, rmtSig); \ PASS(ok, "%s", msg) \ } TEST_SEL(void_void); TEST_SEL(id_void); TEST_SEL(char_void); TEST_SEL(uchar_void); TEST_SEL(schar_void); TEST_SEL(short_void); TEST_SEL(ushort_void); TEST_SEL(sshort_void); TEST_SEL(int_void); TEST_SEL(uint_void); TEST_SEL(sint_void); TEST_SEL(long_void); TEST_SEL(ulong_void); TEST_SEL(slong_void); TEST_SEL(float_void); TEST_SEL(double_void); TEST_SEL(largeStruct_void); TEST_SEL(smallStruct_void); TEST_SEL(void_id:); TEST_SEL(void_char:); TEST_SEL(void_uchar:); TEST_SEL(void_schar:); TEST_SEL(void_short:); TEST_SEL(void_ushort:); TEST_SEL(void_sshort:); TEST_SEL(void_int:); TEST_SEL(void_uint:); TEST_SEL(void_sint:); TEST_SEL(void_long:); TEST_SEL(void_ulong:); TEST_SEL(void_slong:); TEST_SEL(void_float:); TEST_SEL(void_double:); TEST_SEL(void_largeStruct:); TEST_SEL(void_smallStruct:); TEST_SEL(void_float:double:); TEST_SEL(void_double:float:); TEST_SEL(largeStruct_id:char:short:int:long:float:double:largeStruct:smallStruct:); TEST_SEL(smallStruct_id:uchar:ushort:uint:ulong:float:double:largeStruct:smallStruct:); } else { NSLog(@"Skipping test_compare_server_signature: proxy not found."); } } void test_GSSelectorTypesMatch(void) { const char *pairs[][2] = { {"@@::", "@12@0:4:8"}, {"@@::", "@12@+0:+4:+8"}, {"@@::", "@12@-0:-4:-8"}, {"@12@0:4:8", "@@::"}, {"@12@+0:+4:+8", "@@::"}, {"@12@-0:-4:-8", "@@::"}, {"@12@0:4:8", "@12@+0:+4:+8"}, {"@12@0:4:8", "@12@-0:-4:-8"}, {"@12@+0:+4:+8", "@12@0:4:8"}, {"@12@-0:-4:-8", "@12@0:4:8"}, {"@12@0:4:8", "@16@+4:+8:+12"}, {"@12@0:4:8", "@16@-4:-8:-12"}, {"@12@+0:+4:+8", "@16@4:8:12"}, {"@12@-0:-4:-8", "@16@4:8:12"}, /* NB Use of a backslash in a ? ? = sequence below is to prevent the sequence * from being interpreted as a trigraph by the compiler/preprocessor. */ {"{_MyLargeStruct2={_MyLargeStruct=dd}dd}@:", "{?\?={?\?=dd}dd}16@0:4"}, {"{_MyLargeStruct=dd}56@+8:+12@+16c+23s+26i+28l24f28d32{_MyLargeStruct=dd}40{_MySmallStruct=c}44", "{_MyLargeStruct=dd}46@+8:+12@+16c+17s+16i+20l+24f+28d24{_MyLargeStruct=dd}32{_MySmallStruct=c}45"}, {"{_MyLargeStruct=dd}56@+8:+12@+16c+23s+26i+28l24f28d32{_MyLargeStruct=dd}40{_MySmallStruct=c}44", "{?\?=dd}46@+8:+12@+16c+17s+16i+20l+24f+28d24{?\?=dd}32{?\?=c}45"}, {0, 0} }; unsigned int i = 0; while (pairs[i][0]) { const char *s; BOOL ok; s = [[NSString stringWithFormat: @"pair %d matches:\n%s\n%s", i, pairs[i][0], pairs[i][1]] UTF8String]; ok = GSSelectorTypesMatch(pairs[i][0], pairs[i][1]); PASS(ok, "%s", s) i++; } } void run_server(void) { id obj = [MyClass new]; NSConnection *conn = [NSConnection defaultConnection]; [conn setRootObject: obj]; if ([conn registerName: SRV_NAME] == NO) { NSLog(@"Failed to register name: " SRV_NAME ); abort(); } [[NSRunLoop currentRunLoop] run]; } #endif @interface SimpleClass : NSObject - (const char *) sel1; @end @implementation SimpleClass - (const char *) sel1 { return ""; } @end int main(int argc, char *argv[]) { NSAutoreleasePool *pool; pool = [[NSAutoreleasePool alloc] init]; const char *e; id o; id s; o = [SimpleClass new]; s = [o methodSignatureForSelector: @selector(sel1)]; e = @encode(const char*); PASS(strcmp(e, "r*") == 0, "@encode(const char*) makes 'r*' type encoding") PASS(strcmp([s methodReturnType], "r*") == 0, "sel1 return type is 'r*'") #if GNUSTEP if ([[[[NSProcessInfo processInfo] arguments] lastObject] isEqual: @"srv"]) { run_server(); abort(); } NS_DURING { test_compare_server_signature(); test_GSSelectorTypesMatch(); } NS_HANDLER { NSLog(@"MethodSignature Test Failed:"); NSLog(@"%@ %@ %@", [localException name], [localException reason], [localException userInfo]); } NS_ENDHANDLER #endif [pool release]; exit(0); } gnustep-base-1.29.0/Tests/base/NSMutableArray/000077500000000000000000000000001435650067400210575ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSMutableArray/TestInfo000066400000000000000000000000001435650067400225230ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSMutableArray/basic.m000066400000000000000000000023721435650067400223220ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSArray *testObj = [NSMutableArray arrayWithCapacity:1]; test_alloc(@"NSMutableArray"); test_NSObject(@"NSMutableArray", [NSArray arrayWithObject:testObj]); test_NSCoding([NSArray arrayWithObject:testObj]); test_keyed_NSCoding([NSArray arrayWithObject:testObj]); test_NSCopying(@"NSArray",@"NSMutableArray", [NSArray arrayWithObject:testObj], NO, NO); test_NSMutableCopying(@"NSArray",@"NSMutableArray", [NSArray arrayWithObject:testObj]); NSMutableString *str1, *str2; unichar chars[3]; chars[0] = '\"'; chars[1] = 1; str1 = [NSMutableString stringWithCharacters: chars length: 2]; [str1 replaceOccurrencesOfString: @"\"" withString: @"\\\"" options: 0 range: NSMakeRange(0, [str1 length])]; chars[0] = '\\'; chars[1] = '\"'; chars[2] = 1; str2 = [NSMutableString stringWithCharacters: chars length: 3]; NSLog(@"string 1 %@ string 2 %@", str1, str2); PASS([str1 isEqual: str2], "string occurrences replacement works"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSMutableArray/create.m000066400000000000000000000033701435650067400225030ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSString *val1, *val2, *val3; NSMutableArray *obj, *old; id vals[3]; val1 = @"Hello"; val2 = @"Goodbye"; val3 = @"Testing"; vals[0] = val1; vals[1] = val2; vals[2] = val3; obj = [NSMutableArray arrayWithCapacity:10]; PASS(obj != nil && [obj isKindOfClass:[NSMutableArray class]] && [obj count] == 0, "+arrayWithCapacity creates an empty mutable array"); obj = [NSMutableArray array]; PASS(obj != nil && [obj isKindOfClass:[NSMutableArray class]] && [obj count] == 0, "+array creates an empty mutable array"); PASS_EXCEPTION([NSMutableArray arrayWithObject:nil];, NSInvalidArgumentException, "+arrayWithObject: with nil object raises an exception"); obj = [NSMutableArray arrayWithObject:val1]; PASS(obj != nil && [obj isKindOfClass:[NSMutableArray class]] && [obj count] == 1, "+arrayWithObject: builds minimal array"); obj = [NSMutableArray arrayWithObjects:vals count:3]; PASS(obj != nil && [obj isKindOfClass:[NSMutableArray class]] && [obj count] == 3, "+arrayWithObjects:count: builds an array"); obj = [NSMutableArray arrayWithObjects:val1,val2,val3,nil]; PASS(obj != nil && [obj isKindOfClass:[NSMutableArray class]] && [obj count] == 3, "+arrayWithObjects: builds an array"); old = obj; obj = [NSMutableArray arrayWithArray:old]; PASS(obj != nil && [obj isKindOfClass:[NSMutableArray class]] && [obj isEqual:old], "+arrayWithArray: copies array"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSMutableArray/general.m000066400000000000000000000100371435650067400226530ustar00rootroot00000000000000#import #import "ObjectTesting.h" int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; id val1,val2,val3,obj; NSMutableArray *arr,*vals1,*vals2,*vals3; val1 = @"Hello"; val2 = @"A Goodbye"; val3 = @"Testing all strings"; vals1 = [[NSMutableArray arrayWithObject: val1] retain]; [vals1 addObject: val2]; vals2 = AUTORELEASE([vals1 mutableCopy]); [vals2 addObject: val2]; vals3 = AUTORELEASE([vals2 mutableCopy]); [vals3 addObject: val3]; obj = [NSMutableArray new]; arr = obj; PASS(obj != nil && [obj isKindOfClass:[NSMutableArray class]] && [obj count] == 0, "-count returns zero for an empty array"); PASS([arr hash] == 0, "-hash returns zero for an empty array"); PASS(vals3 != nil && [vals3 containsObject:val2], "-containsObject works"); PASS(vals3 != nil && [vals3 indexOfObject:@"A Goodbye"] == 1, "-indexOfObject: finds object"); PASS(vals3 != nil && [vals3 indexOfObjectIdenticalTo:val2], "-indexOfObjectIdenticalTo: finds identical object"); { NSEnumerator *e; id v1, v2, v3; e = [arr objectEnumerator]; v1 = [e nextObject]; v2 = [e nextObject]; PASS(e != nil && v1 == nil && v2 == nil, "-objectEnumerator: is ok for empty array"); e = [vals1 objectEnumerator]; v1 = [e nextObject]; v2 = [e nextObject]; v3 = [e nextObject]; PASS(v1 != nil && v2 != nil && v3 == nil && [vals1 containsObject:v1] && [vals1 containsObject:v2] && [v1 isEqual:val1] && [v2 isEqual: val2], "-objectEnumerator: enumerates the array"); } { obj = [arr description]; obj = [obj propertyList]; PASS(obj != nil && [obj isKindOfClass:[NSMutableArray class]] && [obj count] == 0, "-description gives us a text property-list (empty array)"); obj = [arr description]; obj = [obj propertyList]; PASS(obj != nil && [obj isKindOfClass:[NSMutableArray class]] && [obj isEqual:arr], "-description gives us a text property-list"); } PASS(vals1 != nil && [vals1 isKindOfClass: [NSMutableArray class]] && [vals1 count] == 2, "-count returns two for an array with two objects"); PASS([vals1 hash] == 2, "-hash returns two for an array with two objects"); PASS([vals1 indexOfObject:nil] == NSNotFound, "-indexOfObject: gives NSNotFound for a nil object"); PASS([vals1 indexOfObject:val3] == NSNotFound, "-indexOfObject: gives NSNotFound for a object not in the array"); PASS([vals1 isEqualToArray:vals1], "Array is equal to itself using -isEqualToArray:"); PASS(![vals1 isEqualToArray:vals2],"Similar arrays are not equal using -isEqualToArray:"); { NSArray *a; NSRange r = NSMakeRange(0,2); a = [vals2 subarrayWithRange:r]; PASS(a != nil && [a isKindOfClass:[NSArray class]] && [a count] == 2 && [a objectAtIndex:0] == val1 && [a objectAtIndex:1] == val2, "-subarrayWithRange: seems ok"); r = NSMakeRange(1,2); PASS_EXCEPTION([arr subarrayWithRange:r];,@"NSRangeException","-subarrayWithRange with invalid range"); } { NSString *c = @"/"; NSString *s = @"Hello/A Goodbye"; NSString *a = [vals1 componentsJoinedByString: c]; PASS(a != nil && [a isKindOfClass:[NSString class]] && [a isEqual:s], "-componentsJoinedByString: seems ok"); } { NSArray *a = [vals1 sortedArrayUsingSelector:@selector(compare:)]; PASS(a != nil && [a isKindOfClass:[NSArray class]] && [a count] == 2 && [a objectAtIndex:0] == val2 && [a objectAtIndex:1] == val1, "-sortedArrayUsingSelector: seems ok"); } { NSMutableArray *ma = [NSMutableArray new]; NSString *s[5] = { @"1",@"2",@"3",@"4",@"5" }; NSUInteger before; NSUInteger after; int i; for (i = 0; i < 5; i++) { [ma addObject: s[i]]; } before = [ma count]; [ma removeObjectsInArray: ma]; after = [ma count]; [ma release]; PASS(5 == before && 0 == after, "-removeObjectsInArray: works for self") } [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSMutableAttributedString/000077500000000000000000000000001435650067400232775ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSMutableAttributedString/TestInfo000066400000000000000000000000001435650067400247430ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSMutableAttributedString/basic.m000066400000000000000000000011371435650067400245400ustar00rootroot00000000000000#import #import #import "ObjectTesting.h" int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSArray *arr = [NSArray arrayWithObject:[NSMutableAttributedString new]]; test_alloc(@"NSMutableAttributedString"); test_NSObject(@"NSMutableAttributedString", arr); test_NSCoding(arr); test_keyed_NSCoding(arr); test_NSCopying(@"NSAttributedString",@"NSMutableAttributedString",arr,NO, NO); test_NSMutableCopying(@"NSAttributedString",@"NSMutableAttributedString",arr); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSMutableAttributedString/test00.m000066400000000000000000000402671435650067400246050ustar00rootroot00000000000000#import "Testing.h" #import #import @interface NSMutableAttributedString(evil) -(void) _sanity; @end #if !defined(GNUSTEP_BASE_LIBRARY) @implementation NSMutableAttributedString(evil) - (void) _sanity { } @end #endif @interface NSColor : NSObject + (id) redColor; + (id) blueColor; @end @implementation NSColor + (id) redColor; { return [[self new] autorelease]; } + (id) blueColor; { return [[self new] autorelease]; } @end NSString *NSForegroundColorAttributeName = @"NSForegroundColorAttributeName"; @interface NSMutableAttributedString (TestingAdditions) -(BOOL)checkAttributes: (NSDictionary *)attr location: (int)location; -(BOOL)checkAttributes: (NSDictionary *)attr range: (NSRange)range; @end @implementation NSMutableAttributedString (TestingAdditions) -(BOOL) checkAttributes: (NSDictionary *)attr location: (int)loc { return [[self attributesAtIndex:loc effectiveRange:NULL] isEqual:attr]; } -(BOOL) checkAttributes: (NSDictionary *)attr range: (NSRange)range { NSRange aRange = range; while (aRange.length > 0) { BOOL attrEqual; attrEqual= [[self attributesAtIndex: aRange.location + (aRange.length - 1) effectiveRange: NULL] isEqual: attr]; if (attrEqual == NO) return NO; aRange.length -= 1; } return YES; } @end int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSMutableAttributedString *attrStr; NSString *baseString = @"0123456789"; NSDictionary *red, *gray, *blue; NSMutableAttributedString *s; s = [[[NSMutableAttributedString alloc] initWithString: @"string"] autorelease]; [s _sanity]; PASS_EQUAL([s string], @"string", "equality OK for string value"); PASS([s length] == 6, "length reported correctly"); PASS_EQUAL([s attributesAtIndex: 0 effectiveRange: NULL], [NSDictionary dictionary], "empty range has empty attributes dictionary"); [s setAttributes: [NSDictionary dictionaryWithObjectsAndKeys: [NSColor redColor], NSForegroundColorAttributeName, nil] range: NSMakeRange(0, 3)]; [s _sanity]; PASS([[s attributesAtIndex: 0 effectiveRange: NULL] count] == 1, "newly set attribute dictionary contains one attribute"); PASS([[s attributesAtIndex: 3 effectiveRange: NULL] count] == 0, "attribute dictionary at 3 contains no attributes"); [s setAttributes: [NSDictionary dictionaryWithObjectsAndKeys: [NSColor blueColor], NSForegroundColorAttributeName, nil] range: NSMakeRange(3, 3)]; [s _sanity]; PASS([[s attributesAtIndex: 0 effectiveRange: NULL] count] == 1, "attribute count at 0 unchanged"); PASS([[s attributesAtIndex: 3 effectiveRange: NULL] count] == 1, "new attribute count is 1"); red = [NSDictionary dictionaryWithObject:@"Red" forKey:@"Color"]; gray = [NSDictionary dictionaryWithObject:@"Gray" forKey:@"Color"]; blue = [NSDictionary dictionaryWithObject:@"Blue" forKey:@"Color"]; attrStr = [[NSMutableAttributedString alloc] initWithString:baseString attributes:red]; [attrStr _sanity]; PASS([[attrStr string] isEqual:baseString] && [attrStr checkAttributes:red range:NSMakeRange(0,10)], "-initWithString:attributes: works"); [attrStr setAttributes:blue range:NSMakeRange(0,10)]; [attrStr _sanity]; PASS([attrStr checkAttributes:blue range:NSMakeRange(0,10)], "-setAttributes:range: works for the whole string"); ASSIGN(attrStr,[[NSMutableAttributedString alloc] initWithString:baseString attributes:red]); [attrStr _sanity]; [attrStr setAttributes:blue range:NSMakeRange(0,5)]; [attrStr _sanity]; PASS([attrStr checkAttributes:blue range:NSMakeRange(0,5)] && [attrStr checkAttributes:red range:NSMakeRange(5,5)], "-setAttributes:range: works for the first half of the string"); ASSIGN(attrStr,[[NSMutableAttributedString alloc] initWithString:baseString attributes:red]); [attrStr _sanity]; [attrStr setAttributes:blue range:NSMakeRange(3,5)]; [attrStr _sanity]; PASS([attrStr checkAttributes:red range:NSMakeRange(0,3)] && [attrStr checkAttributes:blue range:NSMakeRange(3,5)] && [attrStr checkAttributes:red range:NSMakeRange(8,2)], "-setAttributes:range: works for the middle of the string"); [attrStr setAttributes:blue range:NSMakeRange(4,3)]; [attrStr _sanity]; PASS([attrStr checkAttributes:red range:NSMakeRange(0,3)] && [attrStr checkAttributes:blue range:NSMakeRange(3,5)] && [attrStr checkAttributes:red range:NSMakeRange(8,2)], "-setAttributes:range: works for same attributes in middle of string"); ASSIGN(attrStr,[[NSMutableAttributedString alloc] initWithString:baseString attributes:red]); [attrStr _sanity]; [attrStr setAttributes:blue range:NSMakeRange(5,5)]; [attrStr _sanity]; PASS([attrStr checkAttributes:red range:NSMakeRange(0,5)] && [attrStr checkAttributes:blue range:NSMakeRange(5,5)], "-setAttributes:range: works for the last half of the string"); ASSIGN(attrStr,[[NSMutableAttributedString alloc] initWithString:baseString attributes:red]); [attrStr _sanity]; [attrStr setAttributes:blue range:NSMakeRange(0,3)]; [attrStr _sanity]; [attrStr setAttributes:red range:NSMakeRange(3,4)]; [attrStr _sanity]; [attrStr setAttributes:gray range:NSMakeRange(7,3)]; [attrStr _sanity]; PASS([attrStr checkAttributes:blue range:NSMakeRange(0,3)] && [attrStr checkAttributes:red range:NSMakeRange(3,4)] && [attrStr checkAttributes:gray range:NSMakeRange(7,3)], "-setAttributes:range: works in three parts of the string"); ASSIGN(attrStr,[[NSMutableAttributedString alloc] initWithString:baseString attributes:red]); [attrStr _sanity]; [attrStr setAttributes:blue range:NSMakeRange(0,5)]; [attrStr _sanity]; [attrStr setAttributes:red range:NSMakeRange(3,5)]; [attrStr _sanity]; [attrStr setAttributes:gray range:NSMakeRange(4,5)]; [attrStr _sanity]; PASS([attrStr checkAttributes:blue range:NSMakeRange(0,3)] && [attrStr checkAttributes:red range:NSMakeRange(3,1)] && [attrStr checkAttributes:gray range:NSMakeRange(4,5)] && [attrStr checkAttributes:red range:NSMakeRange(9,1)], "-setAttributes:range: works with overlapping"); ASSIGN(attrStr,[[NSMutableAttributedString alloc] initWithString:baseString attributes:red]); [attrStr _sanity]; [attrStr setAttributes:blue range:NSMakeRange(1,2)]; [attrStr _sanity]; [attrStr setAttributes:blue range:NSMakeRange(4,2)]; [attrStr _sanity]; [attrStr setAttributes:blue range:NSMakeRange(7,2)]; [attrStr _sanity]; [attrStr setAttributes:gray range:NSMakeRange(2,6)]; [attrStr _sanity]; PASS([attrStr checkAttributes:red range:NSMakeRange(0,1)] && [attrStr checkAttributes:blue range:NSMakeRange(1,1)] && [attrStr checkAttributes:gray range:NSMakeRange(2,6)] && [attrStr checkAttributes:blue range:NSMakeRange(8,1)] && [attrStr checkAttributes:red range:NSMakeRange(9,1)], "-setAttributes:range: works with overlapping (2)"); ASSIGN(attrStr,[[NSMutableAttributedString alloc] initWithString:baseString attributes:red]); [attrStr _sanity]; [attrStr setAttributes:blue range:NSMakeRange(2,5)]; [attrStr _sanity]; [attrStr setAttributes:gray range:NSMakeRange(2,5)]; [attrStr _sanity]; PASS([attrStr checkAttributes:red range:NSMakeRange(0,2)] && [attrStr checkAttributes:gray range:NSMakeRange(2,5)] && [attrStr checkAttributes:red range:NSMakeRange(7,3)], "-setAttributes:range: works with replacing"); ASSIGN(attrStr,[[NSMutableAttributedString alloc] initWithString:baseString attributes:red]); [attrStr _sanity]; [attrStr setAttributes:blue range:NSMakeRange(1,8)]; [attrStr _sanity]; [attrStr setAttributes:red range:NSMakeRange(2,6)]; [attrStr _sanity]; [attrStr setAttributes:gray range:NSMakeRange(3,4)]; [attrStr _sanity]; PASS([attrStr checkAttributes:red range:NSMakeRange(0,1)] && [attrStr checkAttributes:blue range:NSMakeRange(1,1)] && [attrStr checkAttributes:red range:NSMakeRange(2,1)] && [attrStr checkAttributes:gray range:NSMakeRange(3,4)] && [attrStr checkAttributes:red range:NSMakeRange(7,1)] && [attrStr checkAttributes:blue range:NSMakeRange(8,1)] && [attrStr checkAttributes:red range:NSMakeRange(9,1)], "-setAttributes:range: works with chinese boxes"); ASSIGN(attrStr,[[NSMutableAttributedString alloc] initWithString:baseString attributes:red]); [attrStr _sanity]; [attrStr setAttributes:blue range:NSMakeRange(1,3)]; [attrStr _sanity]; [attrStr setAttributes:gray range:NSMakeRange(1,4)]; [attrStr _sanity]; PASS([attrStr checkAttributes:red range:NSMakeRange(0,1)] && [attrStr checkAttributes:gray range:NSMakeRange(1,4)] && [attrStr checkAttributes:red range:NSMakeRange(5,5)], "-setAttributes:range: works with extending at the end (diff color)"); ASSIGN(attrStr,[[NSMutableAttributedString alloc] initWithString:baseString attributes:red]); [attrStr _sanity]; [attrStr setAttributes:gray range:NSMakeRange(1,3)]; [attrStr _sanity]; [attrStr setAttributes:gray range:NSMakeRange(1,4)]; [attrStr _sanity]; PASS([attrStr checkAttributes:red range:NSMakeRange(0,1)] && [attrStr checkAttributes:gray range:NSMakeRange(1,4)] && [attrStr checkAttributes:red range:NSMakeRange(5,5)], "-setAttributes:range: works with extending at the end (diff color)"); ASSIGN(attrStr,[[NSMutableAttributedString alloc] initWithString:baseString attributes:red]); [attrStr _sanity]; [attrStr setAttributes:blue range:NSMakeRange(2,3)]; [attrStr _sanity]; [attrStr setAttributes:gray range:NSMakeRange(1,4)]; [attrStr _sanity]; PASS([attrStr checkAttributes:red range:NSMakeRange(0,1)] && [attrStr checkAttributes:gray range:NSMakeRange(1,4)] && [attrStr checkAttributes:red range:NSMakeRange(5,5)], "-setAttributes:range: works with extending at the beginning (diff color)"); ASSIGN(attrStr,[[NSMutableAttributedString alloc] initWithString:baseString attributes:red]); [attrStr _sanity]; [attrStr setAttributes:gray range:NSMakeRange(2,3)]; [attrStr _sanity]; [attrStr setAttributes:gray range:NSMakeRange(1,4)]; [attrStr _sanity]; PASS([attrStr checkAttributes:red range:NSMakeRange(0,1)] && [attrStr checkAttributes:gray range:NSMakeRange(1,4)] && [attrStr checkAttributes:red range:NSMakeRange(5,5)], "-setAttributes:range: works with extending at the beginning (same color)"); ASSIGN(attrStr,[[NSMutableAttributedString alloc] initWithString:baseString attributes:red]); [attrStr _sanity]; [attrStr setAttributes:blue range:NSMakeRange(1,3)]; [attrStr _sanity]; [attrStr setAttributes:gray range:NSMakeRange(2,2)]; [attrStr _sanity]; PASS([attrStr checkAttributes:red range:NSMakeRange(0,1)] && [attrStr checkAttributes:blue range:NSMakeRange(1,1)] && [attrStr checkAttributes:gray range:NSMakeRange(2,2)] && [attrStr checkAttributes:red range:NSMakeRange(4,6)], "-setAttributes:range: works with subset at the end (diff color)"); ASSIGN(attrStr,[[NSMutableAttributedString alloc] initWithString:baseString attributes:red]); [attrStr _sanity]; [attrStr setAttributes:gray range:NSMakeRange(1,3)]; [attrStr _sanity]; [attrStr setAttributes:gray range:NSMakeRange(2,2)]; [attrStr _sanity]; PASS([attrStr checkAttributes:red range:NSMakeRange(0,1)] && [attrStr checkAttributes:gray range:NSMakeRange(1,3)] && [attrStr checkAttributes:red range:NSMakeRange(4,6)], "-setAttributes:range: works with subset at the end (same color)"); ASSIGN(attrStr,[[NSMutableAttributedString alloc] initWithString:baseString attributes:red]); [attrStr _sanity]; [attrStr setAttributes:blue range:NSMakeRange(2,3)]; [attrStr _sanity]; [attrStr setAttributes:gray range:NSMakeRange(2,2)]; [attrStr _sanity]; PASS([attrStr checkAttributes:red range:NSMakeRange(0,2)] && [attrStr checkAttributes:gray range:NSMakeRange(2,2)] && [attrStr checkAttributes:blue range:NSMakeRange(4,1)] && [attrStr checkAttributes:red range:NSMakeRange(5,5)], "-setAttributes:range: works with subset at the beginning (diff color)"); ASSIGN(attrStr,[[NSMutableAttributedString alloc] initWithString:baseString attributes:red]); [attrStr _sanity]; [attrStr setAttributes:gray range:NSMakeRange(2,3)]; [attrStr _sanity]; [attrStr setAttributes:gray range:NSMakeRange(2,2)]; [attrStr _sanity]; PASS([attrStr checkAttributes:red range:NSMakeRange(0,2)] && [attrStr checkAttributes:gray range:NSMakeRange(2,3)] && [attrStr checkAttributes:red range:NSMakeRange(5,5)], "-setAttributes:range: works with subset at the beginning (same color)"); ASSIGN(attrStr,[[NSMutableAttributedString alloc] initWithString:baseString attributes:red]); [attrStr _sanity]; [attrStr setAttributes:gray range:NSMakeRange(2,1)]; [attrStr _sanity]; [attrStr setAttributes:gray range:NSMakeRange(4,1)]; [attrStr _sanity]; [attrStr setAttributes:blue range:NSMakeRange(1,5)]; [attrStr _sanity]; PASS([attrStr checkAttributes:red range:NSMakeRange(0,1)] && [attrStr checkAttributes:blue range:NSMakeRange(1,5)] && [attrStr checkAttributes:red range:NSMakeRange(6,4)], "-setAttributes:range: works with subsets (diff color)"); ASSIGN(attrStr,[[NSMutableAttributedString alloc] initWithString:baseString attributes:red]); [attrStr _sanity]; [attrStr setAttributes:blue range:NSMakeRange(2,1)]; [attrStr _sanity]; [attrStr setAttributes:blue range:NSMakeRange(4,1)]; [attrStr _sanity]; [attrStr setAttributes:blue range:NSMakeRange(1,5)]; [attrStr _sanity]; PASS([attrStr checkAttributes:red range:NSMakeRange(0,1)] && [attrStr checkAttributes:blue range:NSMakeRange(1,5)] && [attrStr checkAttributes:red range:NSMakeRange(6,4)], "-setAttributes:range: works with subsets (same color)"); ASSIGN(attrStr,[[NSMutableAttributedString alloc] initWithString:baseString attributes:red]); [attrStr _sanity]; [attrStr setAttributes:blue range:NSMakeRange(2,1)]; [attrStr _sanity]; [attrStr setAttributes:blue range:NSMakeRange(4,1)]; [attrStr _sanity]; [attrStr setAttributes:blue range:NSMakeRange(7,2)]; [attrStr _sanity]; [attrStr setAttributes:red range:NSMakeRange(3,2)]; [attrStr _sanity]; [attrStr setAttributes:gray range:NSMakeRange(0,10)]; [attrStr _sanity]; PASS([attrStr checkAttributes:gray range:NSMakeRange(0,10)], "-setAttributes:range: works with setting attributes for the whole string"); ASSIGN(attrStr,[[NSMutableAttributedString alloc] initWithString:baseString attributes:red]); [attrStr _sanity]; [attrStr setAttributes:blue range:NSMakeRange(0,1)]; [attrStr _sanity]; [attrStr setAttributes:blue range:NSMakeRange(1,1)]; [attrStr _sanity]; [attrStr setAttributes:blue range:NSMakeRange(2,1)]; [attrStr _sanity]; PASS([attrStr checkAttributes:blue range:NSMakeRange(0,3)] && [attrStr checkAttributes:red range:NSMakeRange(3,7)], "-setAttributes:range: works with nearby attributes"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSMutableAttributedString/test01.m000066400000000000000000000133521435650067400246010ustar00rootroot00000000000000#import "Testing.h" #import #import /* get rid of compiler warnings */ @interface NSMutableAttributedString(evil) -(void) _sanity; @end #if !defined(GNUSTEP_BASE_LIBRARY) @implementation NSMutableAttributedString(evil) - (void) _sanity { } @end #endif @interface NSMutableAttributedString (TestingAdditions) -(BOOL)checkAttributes:(NSDictionary *)attr location:(int)location; -(BOOL)checkAttributes:(NSDictionary *)attr range:(NSRange)range; @end @implementation NSMutableAttributedString (TestingAdditions) -(BOOL)checkAttributes:(NSDictionary *)attr location:(int)loc { return [[self attributesAtIndex:loc effectiveRange:NULL] isEqual:attr]; } -(BOOL)checkAttributes:(NSDictionary *)attr range:(NSRange)range { NSRange aRange = range; while (aRange.length > 0) { BOOL attrEqual; attrEqual= [[self attributesAtIndex:aRange.location + (aRange.length - 1) effectiveRange:NULL] isEqual:attr]; if (attrEqual == NO) return NO; aRange.length -= 1; } return YES; } @end int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSMutableAttributedString *as; NSString *base1 = @"base-1"; NSString *base2 = @"base-2"; NSDictionary *attrE, *attr1, *attr2; int start,length,index; [[[NSMutableAttributedString new] autorelease] _sanity]; as = [[NSMutableAttributedString alloc] initWithString:base1 attributes:nil]; [as replaceCharactersInRange:NSMakeRange(2,2) withString:@""]; [as _sanity]; PASS([[as string] isEqual:@"ba-1"], "-replaceCharactersInRange: withString: works with zero length string"); as = [[NSMutableAttributedString alloc] initWithString:base1 attributes:nil]; [as replaceCharactersInRange:NSMakeRange(2,2) withString:base2]; [as _sanity]; PASS([[as string] isEqual:@"babase-2-1"], "-replaceCharactersInRange:withString: works in middle of string"); as = [[NSMutableAttributedString alloc] initWithString:base1 attributes:nil]; [as replaceCharactersInRange:NSMakeRange(6,0) withString:base2]; [as _sanity]; PASS([[as string] isEqual:@"base-1base-2"], "-replaceCharactersInRange:withString: works at end of string works"); as = [[NSMutableAttributedString alloc] initWithString:base1 attributes:nil]; [as replaceCharactersInRange:NSMakeRange(0,0) withString:base2]; [as _sanity]; PASS([[as string] isEqual:@"base-2base-1"], "-replaceCharactersInRange:withString: works at start of string works"); attrE = [NSDictionary dictionary]; attr1 = [NSDictionary dictionaryWithObject:@"a" forKey:@"1"]; attr2 = [NSDictionary dictionaryWithObject:@"b" forKey:@"2"]; as = [[NSMutableAttributedString alloc] initWithString:base1 attributes:attr1]; [as setAttributes:attr2 range:NSMakeRange(2,4)]; [as replaceCharactersInRange:NSMakeRange(0,6) withString:@""]; [as replaceCharactersInRange:NSMakeRange(0,0) withString:@"aa"]; [as replaceCharactersInRange:NSMakeRange(2,0) withString:@"bb"]; [as _sanity]; PASS([as checkAttributes:attrE range:NSMakeRange(0,4)], "-replaceCharactersInRange:withString: keeps attributes if entire string is replaced"); as = [[NSMutableAttributedString alloc] initWithString:base1 attributes:attr1]; [as replaceCharactersInRange:NSMakeRange(0,6) withString:base2]; [as _sanity]; PASS([[as string] isEqual:base2] && [as checkAttributes:attr1 range:NSMakeRange(0,6)], "-replaceCharactersInRange:withString: keeps attributes if entire string is replaced"); for (start=0;start != 9; start++) { for (length = 0; (length + start) != 9; length++) { BOOL removeAll,replaceAll; NSDictionary *aBegin,*aEnd; as = [[NSMutableAttributedString alloc] initWithString:@"aabbccdd" attributes:attr2]; removeAll = (start == 0 && length == 8); [as setAttributes:attr1 range:NSMakeRange(2,2)]; [as setAttributes:attrE range:NSMakeRange(4,2)]; if (removeAll) { aBegin = attrE; aEnd = attrE; } else { aBegin = [as attributesAtIndex: (start == 0) ? length : 0 effectiveRange:NULL]; aEnd = [as attributesAtIndex: ((start + length) == 8) ? (start - 1) : 8 effectiveRange:NULL]; [as replaceCharactersInRange:NSMakeRange(start, length) withString:@""]; [as _sanity]; PASS([[as string] length] == (8 - length) && [as checkAttributes:aBegin location:0] && [as checkAttributes:aEnd location: (8 - length)], "attribute/(replaceCharacters... with zero length string) interaction _sanity checks %i %i",start, length); } as = [[NSMutableAttributedString alloc] initWithString:@"aabbccdd" attributes:attr2]; replaceAll = (start == 0 && length == 8); [as setAttributes:attr1 range:NSMakeRange(2,2)]; [as setAttributes:attrE range:NSMakeRange(4,2)]; if (length == 0 && start == 0) index = 0; else if (length == 0) index = (start - 1); else index = start; aBegin = [as attributesAtIndex:index effectiveRange:NULL]; [as replaceCharactersInRange:NSMakeRange(start,length) withString:@"foo"]; [as _sanity]; PASS([[as string] length] == (11 - length) && [as checkAttributes:aBegin range:NSMakeRange(start,3)], "attribute/replaceCharacters... interaction _sanity checks %i %i",start,length); } } [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSMutableCharacterSet/000077500000000000000000000000001435650067400223515ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSMutableCharacterSet/TestInfo000066400000000000000000000000001435650067400240150ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSMutableCharacterSet/basic.m000066400000000000000000000012521435650067400236100ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; id testObj = [NSMutableCharacterSet new]; test_alloc(@"NSMutableCharacterSet"); test_NSObject(@"NSMutableCharacterSet",[NSArray arrayWithObject:testObj]); test_NSCoding([NSArray arrayWithObject:testObj]); test_NSCopying(@"NSCharacterSet", @"NSMutableCharacterSet", [NSArray arrayWithObject:testObj], NO, NO); test_NSMutableCopying(@"NSCharacterSet", @"NSMutableCharacterSet", [NSArray arrayWithObject:testObj]); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSMutableCharacterSet/test00.m000066400000000000000000000021001435650067400236370ustar00rootroot00000000000000#import "Testing.h" #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSMutableCharacterSet *testMutableNamedSet, *testMutableNamedSet1, *testMutableNamedSet2; NSCharacterSet *testNamedSet; testMutableNamedSet = [NSMutableCharacterSet letterCharacterSet]; testNamedSet = [NSCharacterSet letterCharacterSet]; [testMutableNamedSet invert]; PASS([testMutableNamedSet characterIsMember:[@"." characterAtIndex:0]] && ![testNamedSet characterIsMember:[@"." characterAtIndex:0]], "Insure defaults set accessors return the correct class"); testMutableNamedSet1 = [NSMutableCharacterSet letterCharacterSet]; testMutableNamedSet2 = [NSMutableCharacterSet letterCharacterSet]; [testMutableNamedSet1 invert]; PASS([testMutableNamedSet1 characterIsMember:[@"." characterAtIndex:0]] && ![testMutableNamedSet2 characterIsMember:[@"." characterAtIndex:0]], "Test whether we always get a clean mutable set"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSMutableData/000077500000000000000000000000001435650067400206525ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSMutableData/TestInfo000066400000000000000000000000001435650067400223160ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSMutableData/basic.m000066400000000000000000000011771435650067400221170ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; id testObject = [NSMutableData new]; test_alloc(@"NSMutableData"); test_NSObject(@"NSData",[NSArray arrayWithObject:testObject]); test_NSCoding([NSArray arrayWithObject:testObject]); test_NSCopying(@"NSData", @"NSMutableData", [NSArray arrayWithObject:testObject], NO, NO); test_NSMutableCopying(@"NSData", @"NSMutableData", [NSArray arrayWithObject:testObject]); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSMutableData/general.m000066400000000000000000000033541435650067400224520ustar00rootroot00000000000000#import "Testing.h" #import "ObjectTesting.h" #import #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; char *str1,*str2,*tmp; NSData *data1; NSMutableData *mutable; unsigned char *hold; str1 = "Test string for data classes"; str2 = (char *) malloc(sizeof("insert")); strcpy(str2,"insert"); mutable = [NSMutableData dataWithLength:100]; hold = [mutable mutableBytes]; /* hmpf is this correct */ data1 = [NSData dataWithBytes:str1 length:(strlen(str1) * sizeof(void*))]; PASS(data1 != nil && [data1 isKindOfClass:[NSData class]] && [data1 length] == (strlen(str1) * sizeof(void*)) && [data1 bytes] != str1 && strcmp(str1,[data1 bytes]) == 0, "+dataWithBytes:length: works"); mutable = [NSMutableData data]; PASS(mutable != nil && [mutable isKindOfClass:[NSMutableData class]] && [mutable length] == 0, "+data creates empty mutable data"); [mutable setData:data1]; PASS(mutable != nil && [mutable length] == (strlen(str1) * sizeof(void*)), "-setData: works"); [mutable replaceBytesInRange:NSMakeRange(22,6) withBytes:str2]; tmp = (char *)malloc([mutable length]); [mutable getBytes:tmp range:NSMakeRange(22,6)]; tmp[6] = '\0'; PASS(mutable != nil && strcmp(tmp,str2) == 0, "-replaceBytesInRange:withBytes suceeds"); free(tmp); PASS_EXCEPTION([mutable replaceBytesInRange:NSMakeRange([mutable length]+1,6) withBytes:str2];, NSRangeException,"-replaceBytesInRange:withBytes out of range raises exception"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSMutableDictionary/000077500000000000000000000000001435650067400221065ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSMutableDictionary/TestInfo000066400000000000000000000000001435650067400235520ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSMutableDictionary/basic.m000066400000000000000000000013321435650067400233440ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSMutableDictionary *testObj; testObj = [NSMutableDictionary new]; test_NSObject(@"NSMutableDictionary", [NSArray arrayWithObject:testObj]); test_NSCoding([NSArray arrayWithObject:testObj]); test_keyed_NSCoding([NSArray arrayWithObject:testObj]); test_NSCopying(@"NSDictionary",@"NSMutableDictionary", [NSArray arrayWithObject:testObj], NO, NO); test_NSMutableCopying(@"NSDictionary",@"NSMutableDictionary", [NSArray arrayWithObject:testObj]); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSMutableDictionary/general.m000066400000000000000000000146201435650067400237040ustar00rootroot00000000000000#import "Testing.h" #import #import #import #import #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSString *key1, *key2, *key3, *val1, *val2, *val3; NSArray *keys1, *keys2, *keys3, *vals1, *vals2, *vals3; id obj; NSMutableDictionary *dict; key1 = @"Key1"; key2 = @"Key2"; key3 = @"Key3"; val1 = @"Hello"; val2 = @"Goodbye"; val3 = @"Testing"; keys1 = [NSArray arrayWithObjects:key1,key2,nil]; keys2 = [NSArray arrayWithObjects:key1,key2,key3,nil]; keys3 = [NSArray arrayWithObjects:key1,key2,key2,nil]; /* duplicate keys */ vals1 = [NSArray arrayWithObjects:val1,val2,nil]; vals2 = [NSArray arrayWithObjects:val1,val2,val2,nil]; /* duplicate vals */ vals3 = [NSArray arrayWithObjects:val1,val2,val3,nil]; dict = [NSMutableDictionary new]; PASS(dict != nil && [dict isKindOfClass:[NSMutableDictionary class]] && [dict count] == 0, "-count returns zero for an empty dictionary"); PASS([dict hash] == 0, "-hash returns zero for an empty dictionary"); obj = [dict allKeys]; PASS(obj != nil && [obj isKindOfClass:[NSArray class]] && [obj count] == 0, "-allKeys gives an empty array for an empty dictionary"); obj = [dict allKeysForObject:nil]; PASS(obj == nil, "-allKeysForObject: gives nil for an empty dictionary"); obj = [dict allValues]; PASS(obj != nil && [obj isKindOfClass:[NSArray class]] && [obj count] == 0, "-allValues gives an empty array for an empty dictionary"); { id o1; id o2; o1 = [dict objectForKey:nil]; o2 = [dict objectForKey:key1]; PASS(o1 == nil && o2 == nil, "-objectForKey: gives nil for an empty dictionary"); } { NSEnumerator *e = [dict keyEnumerator]; id k1,k2; k1 = [e nextObject]; k2 = [e nextObject]; PASS(e != nil && k1 == nil && k2 == nil, "-keyEnumerator: is ok for empty dictionary"); } { NSEnumerator *e = [dict objectEnumerator]; id v1,v2; v1 = [e nextObject]; v2 = [e nextObject]; PASS(e != nil && v1 == nil && v2 == nil, "-objectEnumerator: is ok for empty dictionary"); } { NSString *notFound = @"notFound"; NSArray *a = [dict objectsForKeys:keys1 notFoundMarker:notFound]; PASS(a != nil && [a isKindOfClass:[NSArray class]] && [a count] == 2 && [a objectAtIndex:0] == notFound && [a objectAtIndex:1] == notFound, "-objectsForKeys:notFoundMarker: is ok for empty dictionary"); } obj = [dict description]; obj = [obj propertyList]; PASS(obj != nil && [obj isKindOfClass:[NSDictionary class]] && [obj count] == 0, "-description gives us a text property-list"); dict = [[NSMutableDictionary dictionaryWithObjects:vals1 forKeys:keys1] retain]; PASS(dict != nil && [dict isKindOfClass:[NSMutableDictionary class]] && [dict count] == 2, "-count returns two for an dictionary with two keys"); PASS([dict hash] == 2, "-hash returns two for a dictionary with two keys"); obj = [dict allKeys]; PASS(obj != nil && [obj isKindOfClass:[NSArray class]] && [obj count] == 2 && [obj containsObject:key1] && [obj containsObject:key1], "-allKeys gives the keys we put in the dictionary"); { NSArray *o1,*o2; o1 = [dict allKeysForObject:val1]; o2 = [dict allKeysForObject:val2]; PASS(o1 != nil && [o1 isKindOfClass:[NSArray class]] && [o1 count] == 1 && [o1 containsObject:key1] && o2 != nil && [o2 isKindOfClass:[NSArray class]] && [o2 count] == 1 && [o2 containsObject:key2], "-allKeysForObject: gives the key we expect"); } obj = [dict allValues]; PASS(obj != nil && [obj isKindOfClass:[NSArray class]] && [obj count] == 2 && [obj containsObject:val1] && [obj containsObject:val2], "-allValues gives the values we put in the dictionary"); PASS([dict objectForKey:nil] == nil,"-objectForKey: gives nil for a nil key"); PASS([dict objectForKey:key3] == nil, "-objectForKey: gives nil for a key not in the dictionary"); { id o1 = [dict objectForKey: key1]; id o2 = [dict objectForKey: key2]; PASS(o1 == val1 && o2 == val2, "-objectForKey: gives the objects we added for the keys"); } { NSEnumerator *e = [dict keyEnumerator]; id k1,k2,k3; k1 = [e nextObject]; k2 = [e nextObject]; k3 = [e nextObject]; PASS(k1 != nil && k2 != nil && k3 == nil && k1 != k2 && [keys1 containsObject:k1] && [keys1 containsObject:k2], "-keyEnumerator: enumerates the dictionary"); } { NSEnumerator *e = [dict objectEnumerator]; id v1,v2,v3; v1 = [e nextObject]; v2 = [e nextObject]; v3 = [e nextObject]; PASS(v1 != nil && v2 != nil && v3 == nil && v1 != v2 && [vals1 containsObject:v1] && [vals1 containsObject:v2], "-objectEnumerator: enumerates the dictionary"); } { NSString *notFound = @"notFound"; NSArray *a = [dict objectsForKeys:keys2 notFoundMarker:notFound]; PASS(a != nil && [a isKindOfClass:[NSArray class]] && [a count] == 3 && [a objectAtIndex:0] == val1 && [a objectAtIndex:1] == val2 && [a objectAtIndex:2] == notFound, "-objectsForKeys:notFoundMarker: is ok for dictionary"); } { NSArray *a = [dict keysSortedByValueUsingSelector:@selector(compare:)]; PASS(a != nil && [a isKindOfClass:[NSArray class]] && [a count] == 2 && [a objectAtIndex:0] == key2 && [a objectAtIndex:1] == key1, "-keysSortedByValueUsingSelector: seems ok"); } obj = [dict description]; obj = [obj propertyList]; PASS(obj != nil && [obj isKindOfClass:[NSDictionary class]] && [obj isEqual:dict], "-description gives us a text property-list"); dict = [NSMutableDictionary new]; [dict setObject:@"hello" forKey:@"world"]; PASS(dict != nil && [dict isKindOfClass:[NSMutableDictionary class]] && [[dict objectForKey:@"world"] isEqual:@"hello"], "-setObject:forKey: is ok"); [dict setValue:@"hello" forKey:@"Lücke"]; PASS([[dict valueForKey:@"Lücke"] isEqualToString:@"hello"], "unicode keys work with setValue:forKey:"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSMutableIndexSet/000077500000000000000000000000001435650067400215245ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSMutableIndexSet/TestInfo000066400000000000000000000000001435650067400231700ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSMutableIndexSet/blocks.m000066400000000000000000000054061435650067400231640ustar00rootroot00000000000000#include #include #import #include int main() { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSMutableIndexSet *set = [NSMutableIndexSet indexSetWithIndexesInRange: NSMakeRange(1,5)]; [set addIndex:20]; [set addIndex:25]; START_SET("NSIndexSet Blocks") # ifndef __has_feature # define __has_feature(x) 0 # endif # if __has_feature(blocks) NSMutableIndexSet *referenceSet = nil; __block NSMutableIndexSet *newSet = [NSMutableIndexSet indexSet]; __block BOOL didContainWrongIndex = NO; __block NSUInteger lastIndex = NSNotFound; NSLock *setLock = [NSLock new]; void(^enumBlock)(NSUInteger,BOOL*) = ^(NSUInteger idx, BOOL*shouldStop){ [setLock lock]; lastIndex = idx; [newSet addIndex: idx]; [setLock unlock]; }; // Test forward enumeration: [set enumerateIndexesUsingBlock: enumBlock]; PASS((YES == [set isEqual: newSet]), "Can enumerate all indices in an index set using a block"); PASS((25 == lastIndex), "Forward enumeration stops at the last index"); newSet = [NSMutableIndexSet indexSet]; didContainWrongIndex = NO; lastIndex = NSNotFound; // Test reverse enumeration: [set enumerateIndexesWithOptions: NSEnumerationReverse usingBlock: enumBlock]; PASS((YES == [set isEqual: newSet]), "Can reverse enumerate all indices in an index set using a block"); PASS((1 == lastIndex), "Reverse enumeration stops at the first index"); referenceSet = [NSMutableIndexSet indexSetWithIndexesInRange: (NSMakeRange(4,2))]; [referenceSet addIndex: 20]; newSet = [NSMutableIndexSet indexSet]; didContainWrongIndex = NO; lastIndex = NSNotFound; // Test subrange enumeration: [set enumerateIndexesInRange: NSMakeRange(4,20) options: 0 usingBlock: enumBlock]; PASS((YES == [referenceSet isEqual: newSet]), "Can enumerate subranges of an index set"); PASS((20 == lastIndex), "Subrange enumeration stops at the correct index"); newSet = [NSMutableIndexSet indexSet]; lastIndex = NSNotFound; referenceSet = [NSMutableIndexSet indexSetWithIndexesInRange: NSMakeRange(1,5)]; [referenceSet addIndex: 20]; enumBlock = ^(NSUInteger idx, BOOL*shouldStop){ [setLock lock]; [newSet addIndex: idx]; [setLock unlock]; if (20 == idx) { *shouldStop = YES; } }; // Test premature termination of enumeration: [set enumerateIndexesUsingBlock: enumBlock]; PASS((YES == [referenceSet isEqual: newSet]), "block can prematurely terminate enumeration"); [setLock release]; # else SKIP("No Blocks support in the compiler.") # endif END_SET("NSIndexSet Blocks") [pool release]; return 0; } gnustep-base-1.29.0/Tests/base/NSMutableIndexSet/test0.m000066400000000000000000000013421435650067400227410ustar00rootroot00000000000000#include #include #include int main() { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSMutableIndexSet *set = [[NSMutableIndexSet alloc] init]; [set addIndex:1]; [set addIndex:2]; [set addIndex:1]; PASS([set containsIndex:2], "contains index 2"); PASS([set containsIndex:1], "contains index 1"); [set removeIndex:1]; PASS(![set containsIndex:1], "removed index 1"); [set removeIndex:2]; PASS(![set containsIndex:2], "removed index 2"); [set addIndex:0]; [set addIndex:2]; [set shiftIndexesStartingAtIndex:2 by:-1]; PASS([set containsIndexesInRange:NSMakeRange(0,2)], "contains range"); [pool release]; return 0; } gnustep-base-1.29.0/Tests/base/NSMutableIndexSet/test1.m000066400000000000000000000026561435650067400227530ustar00rootroot00000000000000#import #import #import #include int main() { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSMutableData *m = [NSMutableData dataWithCapacity: 1024]; NSPropertyListFormat aFormat; NSString *aString; id pl; NSKeyedArchiver *a; NSKeyedUnarchiver *u; NSMutableIndexSet *original; NSIndexSet *decoded; a = [[NSKeyedArchiver alloc] initForWritingWithMutableData: m]; [a setOutputFormat: NSPropertyListXMLFormat_v1_0]; original = [NSMutableIndexSet indexSetWithIndexesInRange: NSMakeRange(2,3)]; [original addIndex: 7]; [original addIndex: 557]; [original addIndex: 947]; [a encodeObject: original forKey: @"outer1"]; [a finishEncoding]; pl = [NSPropertyListSerialization propertyListFromData: m mutabilityOption: 0 format: &aFormat errorDescription: &aString]; pl = [(NSDictionary*)[[(NSDictionary*)pl objectForKey: @"$objects"] objectAtIndex: 2] objectForKey: @"NS.data"]; // FIXME ... maybe check encoded data format [a release]; u = [[NSKeyedUnarchiver alloc] initForReadingWithData: m]; decoded = [u decodeObjectForKey: @"outer1"]; PASS([decoded isEqual: original], "decoded value equals encoded"); [u release]; [pool release]; return 0; } gnustep-base-1.29.0/Tests/base/NSMutableSet/000077500000000000000000000000001435650067400205345ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSMutableSet/TestInfo000066400000000000000000000000001435650067400222000ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSMutableSet/basic.m000066400000000000000000000011141435650067400217700ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSMutableSet *testObj = [NSMutableSet new]; test_NSObject(@"NSMutableSet", [NSArray arrayWithObject:testObj]); test_NSCoding([NSArray arrayWithObject:testObj]); test_NSCopying(@"NSSet",@"NSMutableSet", [NSArray arrayWithObject:testObj],NO,NO); test_NSMutableCopying(@"NSSet",@"NSMutableSet", [NSArray arrayWithObject:testObj]); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSMutableSet/general.m000066400000000000000000000036171435650067400223360ustar00rootroot00000000000000#import #import "ObjectTesting.h" int main() { START_SET("mutable set general") id val1, val2, val3, val4, obj; NSMutableSet *vals1, *vals2, *vals3, *vals4; val1 = @"Hello"; val2 = @"A Goodbye"; val3 = @"Testing all strings"; val4 = @"Another"; vals1 = [NSMutableSet setWithObject: val1]; vals2 = [vals1 setByAddingObject: val2]; vals3 = [vals1 setByAddingObject: val3]; vals4 = [NSMutableSet setWithObject: val4]; obj = [NSMutableSet set]; PASS([obj isKindOfClass: [NSMutableSet class]] && [obj count] == 0, "-count returns zero for an empty set"); PASS([obj hash] == 0, "-hash returns zero for an empty set"); PASS(YES == [vals2 containsObject: val2], "-containsObject: works"); PASS(nil != [vals2 member: @"A Goodbye"], "-member: finds present object"); PASS(nil == [vals2 member: @"not there"], "-member: doesn't find missing"); [obj unionSet: vals1]; PASS_EQUAL(obj, vals1, "union of empty set with non-empty equals non-empty"); PASS(1 == [obj count], "union contains one object"); [obj unionSet: vals2]; PASS(2 == [obj count], "union adds another object to set"); PASS(NO == [obj intersectsSet: [NSSet set]], "no intersection with empty"); PASS(YES == [obj intersectsSet: vals3], "test for intersection"); PASS(NO == [obj intersectsSet: vals4], "test for non-intersection"); PASS(NO == [obj isSubsetOfSet: [NSSet set]], "not subset of empty"); PASS(NO == [obj isSubsetOfSet: vals1], "test non subset"); PASS(YES == [vals1 isSubsetOfSet: obj], "test subset"); [obj intersectSet: vals3]; PASS_EQUAL([obj anyObject], val1, "intersection removes an object"); [obj intersectSet: [NSSet set]]; PASS(0 == [obj count], "intersect with empty set empties receiver"); [obj addObject: val1]; [obj intersectSet: nil]; PASS(0 == [obj count], "intersect with nil empties receiver"); END_SET("mutable set general") return 0; } gnustep-base-1.29.0/Tests/base/NSMutableString/000077500000000000000000000000001435650067400212475ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSMutableString/GNUmakefile.preamble000066400000000000000000000000531435650067400251050ustar00rootroot00000000000000ADDITIONAL_INCLUDE_DIRS += -I../NSString gnustep-base-1.29.0/Tests/base/NSMutableString/NSMutableString_string.m000066400000000000000000000004701435650067400260350ustar00rootroot00000000000000/* copyright 2004 Alexander Malmberg Test that -base's cluster of NSMutableString classes are valid NSString classes. */ #import "../NSString/NSString_tests.h" #import int main(int argc,char **argv) { TestNSStringClass([NSMutableString class]); return 0; } gnustep-base-1.29.0/Tests/base/NSMutableString/TestInfo000066400000000000000000000000001435650067400227130ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSMutableString/basic.m000066400000000000000000000133041435650067400225070ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import @interface CustomString : NSString { unichar *characters; NSUInteger length; } @end @implementation CustomString - (id) initWithBytesNoCopy: (void *)c length: (NSUInteger)l encoding: (NSStringEncoding)encoding freeWhenDone: (BOOL)freeWhenDone { if (l > 0) { if (encoding == NSUnicodeStringEncoding) { characters = malloc(l); memcpy(characters, c, l); } else { NSString *s; s = [[NSString alloc] initWithBytesNoCopy: c length: l encoding: encoding freeWhenDone: freeWhenDone]; if (s == nil) return nil; l = [s length] * sizeof(unichar); characters = malloc(l); [s getCharacters: characters]; [s release]; } } length = l / sizeof(unichar); return self; } - (void) dealloc { if (characters) { free(characters); characters = NULL; } [super dealloc]; } - (NSUInteger) length { return length; } - (unichar) characterAtIndex: (NSUInteger)index { return characters[index]; } @end int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; unichar u0 = 'a'; unichar u1 = 0xfe66; NSMutableString *testObj,*base,*ext,*want, *str1, *str2; unichar chars[3]; test_alloc(@"NSMutableString"); testObj = [[NSMutableString alloc] initWithCString:"Hello\n"]; test_NSCoding([NSArray arrayWithObject:testObj]); test_keyed_NSCoding([NSArray arrayWithObject:testObj]); test_NSCopying(@"NSString",@"NSMutableString", [NSArray arrayWithObject:testObj],NO,NO); test_NSMutableCopying(@"NSString",@"NSMutableString", [NSArray arrayWithObject:testObj]); base = [[NSMutableString alloc] initWithCString:"hello"]; ext = [@"\"\\UFE66???\"" propertyList]; want = [@"\"hello\\UFE66???\"" propertyList]; [base appendString:ext]; PASS([base length] == 9 && [ext length] == 4 && [want length] == 9 && [base isEqual:want], "We can append a unicode string to a C string"); PASS([[[NSMutableString alloc] initWithCharacters: &u0 length: 1] isKindOfClass: [NSMutableString class]], "initWithCharacters:length: creates mutable string for ascii"); PASS([[[NSMutableString alloc] initWithCharacters: &u1 length: 1] isKindOfClass: [NSMutableString class]], "initWithCharacters:length: creates mutable string for unicode"); PASS_RUNS([[NSMutableString stringWithString: @"foo"] appendString: @"bar"];, "can append to string from NSMutableString +stringWithString:"); testObj = [@"hello" mutableCopy]; [testObj replaceCharactersInRange: NSMakeRange(1,1) withString: @"a"]; PASS([testObj isEqual: @"hallo"], "replaceCharactersInRange:withString: works in middle of string"); [testObj replaceCharactersInRange: NSMakeRange(4,1) withString: @"y"]; PASS([testObj isEqual: @"hally"], "replaceCharactersInRange:withString: works at end of string"); [testObj setString: @"hello"]; [testObj replaceCharactersInRange: NSMakeRange(1,1) withString: [CustomString stringWithCString: "a"]]; PASS([testObj isEqual: @"hallo"], "custom string replacement works in middle of string"); [testObj replaceCharactersInRange: NSMakeRange(4,1) withString: [CustomString stringWithCString: "y"]]; PASS([testObj isEqual: @"hally"], "custom string replacement works at end of string"); chars[0] = '\"'; chars[1] = 1; str1 = [NSMutableString stringWithCharacters: chars length: 2]; [str1 replaceOccurrencesOfString: @"\"" withString: @"\\\"" options: 0 range: NSMakeRange(0, [str1 length])]; chars[0] = '\\'; chars[1] = '\"'; chars[2] = 1; str2 = [NSMutableString stringWithCharacters: chars length: 3]; NSLog(@"string 1 %@ string 2 %@", str1, str2); PASS([str1 isEqual: str2], "string occurrences replacement works"); [str1 setString: @"{Message} one"]; [str1 replaceOccurrencesOfString: @"{Message}" withString: @"The quick brown fox" options: NSLiteralSearch range: NSMakeRange(0, [str1 length])]; PASS_EQUAL(str1, @"The quick brown fox one", "replace at start of string") [str1 setString: @"two {Message}"]; [str1 replaceOccurrencesOfString: @"{Message}" withString: @"The quick brown fox" options: NSLiteralSearch range: NSMakeRange(0, [str1 length])]; PASS_EQUAL(str1, @"two The quick brown fox", "replace at end of string") [str1 setString: @"{Message}"]; [str1 replaceOccurrencesOfString: @"{Message}" withString: @"The quick brown fox" options: NSLiteralSearch range: NSMakeRange(0, [str1 length])]; PASS_EQUAL(str1, @"The quick brown fox", "replace entire string works") /* Test for normalisation of combining characters. The literal here has * a space combined with multiple repeated combining-tilde characters, * and that needs to match a single space plus combining tilde. */ { NSString *text; NSString *find; NSString *str; NSRange r; unichar u; text = [NSString stringWithUTF8String: "Text Message ̃̃̃̃̃̃̃̃̃̃̃̃̃̃̃̃̃̃̃̃̃̃̃̃̃̃̃̃̃̃̃̃̃̃̃̃̃̃̃̃̃̃̃̃̃̃̃̃̃̃̃̃̃̃"]; find = [NSString stringWithUTF8String: " ̃"]; r = [text rangeOfString: find]; PASS(12 == r.location, "find combining-tilde") str = [text stringByReplacingOccurrencesOfString: find withString: @""]; PASS_EQUAL(str, @"Text Message", "remove combining-tilde") } [testObj release]; [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSNotification/000077500000000000000000000000001435650067400211155ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSNotification/TestInfo000066400000000000000000000000001435650067400225610ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSNotification/basic.m000066400000000000000000000033121435650067400223530ustar00rootroot00000000000000#import #import #import "ObjectTesting.h" @implementation NSNotification (Testing) - (BOOL) isEqualForTestcase: (id)other { if (NO == [other isKindOfClass: [NSNotification class]]) return NO; if ([self name] != [other name] && NO == [[self name] isEqual: [other name]]) return NO; if ([self object] != [other object] && NO == [[self object] isEqual: [other object]]) return NO; if ([self userInfo] != [other userInfo] && NO == [[self userInfo] isEqual: [other userInfo]]) return NO; return YES; } @end int main() { NSNotification *obj; NSMutableArray *testObjs = [[NSMutableArray alloc] init]; NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSDictionary *info = [NSDictionary dictionaryWithObjectsAndKeys: @"obj", @"key", nil]; NSNotification *o1 = [NSNotification notificationWithName: @"hello" object: @"there" userInfo: info]; NSNotification *o2 = [NSNotification notificationWithName: @"hello" object: @"there" userInfo: info]; PASS([o1 hash] == [o2 hash], "equal notification hashes") PASS_EQUAL(o1, o2, "equal notifications") test_alloc(@"NSNotification"); obj = [NSNotification new]; [testObjs addObject: obj]; test_NSObject(@"NSNotification", testObjs); test_NSCoding(testObjs); test_keyed_NSCoding(testObjs); test_NSCopying(@"NSNotification",@"NSNotification",testObjs,NO,NO); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSNotification/dynamic.m000066400000000000000000000014241435650067400227200ustar00rootroot00000000000000#import #include #import "ObjectTesting.h" static BOOL notifiedCurrent = NO; @interface Toggle : NSObject @end @implementation Toggle - (void) foo: (NSNotification*)n { notifiedCurrent = NO; } - (void) bar: (NSNotification*)n { notifiedCurrent = YES; } @end int main(void) { NSNotificationCenter *nc; id t = [Toggle new]; [NSAutoreleasePool new]; nc = [NSNotificationCenter new]; [nc addObserver: t selector: @selector(foo:) name: nil object: nil]; class_replaceMethod([Toggle class], @selector(foo:), class_getMethodImplementation([Toggle class], @selector(bar:)), "v@:@"); [nc postNotificationName: @"foo" object: t]; [t release]; PASS(YES == notifiedCurrent, "implementation not cached"); return 0; } gnustep-base-1.29.0/Tests/base/NSNotification/general.m000066400000000000000000000063121435650067400227120ustar00rootroot00000000000000 #define FAKE_PROXY 1 #import #import "ObjectTesting.h" static int notificationCounter = 0; // Real object @interface RealObject : NSObject - (void) test: (NSNotification *)aNotification; @end @implementation RealObject - (void) test: (NSNotification *)aNotification { notificationCounter++; } @end // Proxy object @interface ProxyObject : NSObject { RealObject *realObject; } - (id) initWithRealObject: (RealObject *)anObject; @end @interface ProxyObject(ForwardedMethods) - (void) test: (NSNotification *)aNotification; @end @implementation ProxyObject - (id) initWithRealObject: (RealObject *)anObject { if ((self = [super init]) != nil) { realObject = [anObject retain]; } return self; } - (void) dealloc { [realObject release]; [super dealloc]; } - (BOOL) respondsToSelector: (SEL)aSelector { return [super respondsToSelector: aSelector] || sel_isEqual(aSelector, @selector(test:)); } - (NSMethodSignature *) methodSignatureForSelector: (SEL)aSelector { NSMethodSignature *methodSignature; if ([super respondsToSelector: aSelector]) { methodSignature = [super methodSignatureForSelector: aSelector]; } else if (sel_isEqual(aSelector, @selector(test:))) { methodSignature = [realObject methodSignatureForSelector: aSelector]; } else { methodSignature = nil; } return methodSignature; } - (void) forwardInvocation: (NSInvocation *)anInvocation { if (sel_isEqual([anInvocation selector], @selector(test:))) { [anInvocation invokeWithTarget: realObject]; } else { [super forwardInvocation: anInvocation]; } } @end // Test program int main(int argc, char **argv) { NSAutoreleasePool *pool = [NSAutoreleasePool new]; NSObject *testObject = [[[NSObject alloc] init] autorelease]; NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; NSNotification *aNotification = [NSNotification notificationWithName: @"TestNotification" object: testObject]; // Create the real object and its proxy RealObject *real = [[[RealObject alloc] init] autorelease]; ProxyObject *proxy = [[[ProxyObject alloc] initWithRealObject: real] autorelease]; // Make the proxy object an observer for the sample notification // NB It is important (for the test) to perform this with a local // autorelease pool. { NSAutoreleasePool *pool = [NSAutoreleasePool new]; NSLog(@"Adding proxy observer"); [nc addObserver: proxy selector: @selector(test:) name: @"TestNotification" object: testObject]; [nc postNotification: aNotification]; PASS(1 == notificationCounter, "notification via proxy works immediately") [pool release]; } // Post the notification // NB It is not important that this code is performed with a // local autorelease pool { NSAutoreleasePool *pool = [NSAutoreleasePool new]; [nc postNotification: aNotification]; PASS(2 == notificationCounter, "notification via proxy works after pool") [pool release]; } [nc postNotification: aNotification]; PASS(3 == notificationCounter, "notification via proxy works repeatedly") [nc removeObserver: proxy]; [pool release]; return 0; } gnustep-base-1.29.0/Tests/base/NSNumber/000077500000000000000000000000001435650067400177175ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSNumber/TestInfo000066400000000000000000000000001435650067400213630ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSNumber/basic.m000066400000000000000000000022701435650067400211570ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSNumber *testObj; test_alloc_only(@"NSNumber"); testObj = [NSNumber numberWithInt: 5]; test_NSObject(@"NSNumber", [NSArray arrayWithObject:testObj]); test_NSCoding([NSArray arrayWithObject:testObj]); test_NSCopying(@"NSNumber", @"NSNumber", [NSArray arrayWithObject:testObj],YES,NO); { // For more paranoid testing, you can change this to int or long long. short i = 0; int increment = 1; while (i >= 0) { NSNumber *n = [[NSNumber alloc] initWithInt: i]; PASS(i == [n intValue], "int -> NSNumber -> int is identity operation for %d", i); [n release]; i += increment; if (i > 100) { increment++; } } i = -1; increment = 1; while (i <= 0) { NSNumber *n = [[NSNumber alloc] initWithInt: i]; PASS(i == [n intValue], "int -> NSNumber -> int is identity operation for %d", i); [n release]; i -= increment; if (i < -100) { increment++; } } } [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSNumber/test00.m000066400000000000000000000160311435650067400212150ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import #import #import #include #include #if !defined(LLONG_MAX) # if defined(__LONG_LONG_MAX__) # define LLONG_MAX __LONG_LONG_MAX__ # define LLONG_MIN (-LLONG_MAX-1) # define ULLONG_MAX (LLONG_MAX * 2ULL + 1) # else # error Neither LLONG_MAX nor __LONG_LONG_MAX__ found # endif #endif int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSNumber *val1, *val2, *val3; NSArray *a; id o; double d; val1 = [NSNumber numberWithBool:YES]; PASS(val1 != nil, "We can create a boolean (YES)") val2 = [NSNumber numberWithBool:NO]; PASS(val2 != nil, "We can create a boolean (NO)") PASS(![val1 isEqual:val2], "A boolean YES is not a NO") PASS(![val2 isEqual:val1], "A boolean NO is not a YES") PASS([val1 isEqual:[NSNumber numberWithBool:YES]], "A boolean YES is a YES") PASS([val2 isEqual:[NSNumber numberWithBool:NO]], "A boolean NO is a NO") val1 = [NSNumber numberWithChar: 99]; PASS(val1 != nil, "We can create a char number") val1 = [NSNumber numberWithChar: -1]; PASS(val1 != nil, "We can create a signed char number") val2 = [NSNumber numberWithUnsignedChar: 255]; PASS(val2 != nil, "We can create an unsigned char number") PASS(![val1 isEqual: val2], "A -1 signed char is not a 255 unsigned char") PASS([val1 isEqual: [NSNumber numberWithChar: 255]], "A -1 signed char is a 255 signed char") val1 = [NSNumber numberWithChar: -100]; PASS([val1 isEqual: [NSNumber numberWithShort: -100]], "A -100 signed char is a -100 signed short") PASS([val1 isEqual: [NSNumber numberWithInt: -100]], "A -100 signed char is a -100 signed int") PASS([val1 isEqual: [NSNumber numberWithLong: -100]], "A -100 signed char is a -100 signed long") PASS([val1 isEqual: [NSNumber numberWithLongLong: -100]], "A -100 signed char is a -100 signed long long") PASS([val1 isEqual: [NSNumber numberWithFloat: -100.0]], "A -100 signed char is a -100 signed float") PASS([val1 isEqual: [NSNumber numberWithDouble: -100.0]], "A -100 signed char is a -100 signed double") PASS([val1 isEqual: [NSNumber numberWithInteger: -100]], "A -100 signed char is a -100 NSInteger") PASS([val1 shortValue] == (signed short)-100, "A -100 signed char is a -100 signed short") PASS([val1 intValue] == (signed int)-100, "A -100 signed char is a -100 signed int") PASS([val1 longValue] == (signed long)-100, "A -100 signed char is a -100 signed long") PASS([val1 longLongValue] == (signed long long)-100, "A -100 signed char is a -100 signed long long") PASS([val1 floatValue] == (float)-100.0, "A -100 signed char is a -100 signed float") PASS([val1 doubleValue] == (double)-100.0, "A -100 signed char is a -100 signed double") PASS([val1 integerValue] == (NSInteger)-100, "A -100 signed char is a -100 NSInteger") PASS([val1 boolValue] == YES, "A -100 signed char is a YES BOOL") val1 = [NSNumber numberWithInt: 127]; val2 = [NSNumber numberWithInt: 128]; PASS([val2 compare: val1] == NSOrderedDescending, "integer numbers - 127 < 128") PASS([val1 compare: val2] == NSOrderedAscending, "integer numbers - 128 > 127") val1 = [NSNumber numberWithChar: 100]; val2 = [NSNumber numberWithChar: 200]; val3 = [NSNumber numberWithInt: 200]; PASS(![val2 isEqual: val3], "A 200 signed char is not a 200 int") PASS([val2 compare: val1] == NSOrderedAscending, "signed char numbers - 200 < 100") PASS([val1 compare: val2] == NSOrderedDescending, "signed char numbers - 100 > 200") PASS(5 == (NSUInteger)[[NSNumber numberWithUnsignedInteger: 5] pointerValue], "pointerValue works") val1 = [NSDecimalNumber numberWithInt: 200]; PASS(200 == [val1 intValue], "NSDecimalNumber numberWithInt: works") val1 = [NSDecimalNumber decimalNumberWithString: @"200"]; PASS(200.0 == [val1 floatValue], "NSDecimalNumber floatValue works") PASS(200.0 == [val1 doubleValue], "NSDecimalNumber doubleValue works") PASS(YES == [val1 boolValue], "NSDecimalNumber boolValue works") PASS((signed char)200 == [val1 charValue], "NSDecimalNumber charValue works") PASS(200 == [val1 intValue], "NSDecimalNumber intValue works") PASS(200 == [val1 integerValue], "NSDecimalNumber integerValue works") PASS(200 == [val1 longValue], "NSDecimalNumber longValue works") PASS(200 == [val1 longLongValue], "NSDecimalNumber longLongValue works") PASS(200 == [val1 shortValue], "NSDecimalNumber shortValue works") PASS(200 == [val1 unsignedCharValue], "NSDecimalNumber unsignedCharValue works") PASS(200 == [val1 unsignedIntValue], "NSDecimalNumber unsignedIntValue works") PASS(200 == [val1 unsignedIntegerValue], "NSDecimalNumber unsignedIntegerValue works") PASS(200 == [val1 unsignedLongValue], "NSDecimalNumber unsignedLongValue works") PASS(200 == [val1 unsignedLongLongValue], "NSDecimalNumber unsignedLongLongValue works") PASS(200 == [val1 unsignedShortValue], "NSDecimalNumber unsignedShortValue works") val1 = [[NSNumber alloc] initWithLongLong: LLONG_MIN]; val2 = [[NSNumber alloc] initWithUnsignedLongLong: (unsigned long long)LLONG_MAX + 1]; PASS([val1 compare: val2] == NSOrderedAscending, "comparison of min signed with max unsigned works") a = [NSArray arrayWithObjects: [NSNumber numberWithUnsignedLongLong: ULLONG_MAX], [NSNumber numberWithInt: -2], [NSNumber numberWithFloat: 300.057], [NSNumber numberWithInt: 1], [NSNumber numberWithDouble: 200.0123], [NSNumber numberWithLongLong: LLONG_MIN], nil]; a = [a sortedArrayUsingSelector: @selector(compare:)]; PASS([[a objectAtIndex: 0] longLongValue] == LLONG_MIN && [[a objectAtIndex: 1] longLongValue] == -2 && [[a objectAtIndex: 2] longLongValue] == 1 && [[a objectAtIndex: 3] longLongValue] == 200 && [[a objectAtIndex: 4] longLongValue] == 300 && [[a objectAtIndex: 5] unsignedLongLongValue] == ULLONG_MAX, "sorted numbers are correctly ordered"); #if defined(GNUSTEP_BASE_LIBRARY) PASS([[NSPropertyListSerialization propertyListFromData: [NSPropertyListSerialization dataFromPropertyList: [NSNumber numberWithInt: -10] format: NSPropertyListGNUstepFormat errorDescription: 0] mutabilityOption: NSPropertyListImmutable format: 0 errorDescription: 0] intValue] == -10, "store negative integer in property list works") PASS((d = [[NSPropertyListSerialization propertyListFromData: [NSPropertyListSerialization dataFromPropertyList: [NSNumber numberWithDouble: -1.2] format: NSPropertyListGNUstepFormat errorDescription: 0] mutabilityOption: NSPropertyListImmutable format: 0 errorDescription: 0] doubleValue]) > -1.21 && d < -1.19, "store negative double in property list works") #endif o = [NSDecimalNumber numberWithDouble: 66.66]; PASS([o isKindOfClass: [NSDecimalNumber class]], "+numberWith... subclass") [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSNumber/test01.m000066400000000000000000000101221435650067400212110ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import #import #import #include #include #if !defined(LLONG_MAX) # if defined(__LONG_LONG_MAX__) # define LLONG_MAX __LONG_LONG_MAX__ # define LLONG_MIN (-LLONG_MAX-1) # define ULLONG_MAX (LLONG_MAX * 2ULL + 1) # else # error Neither LLONG_MAX nor __LONG_LONG_MAX__ found # endif #endif int main() { START_SET("NSNumber") NSNumber *n; START_SET("not-a-number checks") NSNumber *nan = [NSDecimalNumber notANumber]; PASS(YES == [nan isEqualToNumber: nan], "NaN is equal to NaN"); n = [NSNumber numberWithInt: 2]; PASS(NO == [n isEqualToNumber: nan], "2 is not equal to NaN"); PASS([n compare: nan] == NSOrderedDescending, "2 is greater than NaN") PASS([nan compare: n] == NSOrderedAscending, "NaN is less than 2") n = [NSNumber numberWithUnsignedLongLong: 2]; PASS(NO == [n isEqualToNumber: nan], "2LL is not equal to NaN"); PASS([n compare: nan] == NSOrderedDescending, "2LL is greater than NaN") PASS([nan compare: n] == NSOrderedAscending, "NaN is less than 2LL") n = [NSNumber numberWithFloat: 2.0]; PASS(NO == [n isEqualToNumber: nan], "2.0 is not equal to NaN"); PASS([n compare: nan] == NSOrderedDescending, "2.0 is greater than NaN") PASS([nan compare: n] == NSOrderedAscending, "NaN is less than 2.0") n = [NSNumber numberWithDouble: 2.0]; PASS(NO == [n isEqualToNumber: nan], "2.0dd is not equal to NaN"); PASS([n compare: nan] == NSOrderedDescending, "2.0dd is greater than NaN") PASS([nan compare: n] == NSOrderedAscending, "NaN is less than 2.0dd") n = [NSNumber numberWithFloat: 0.0]; PASS(NO == [n isEqualToNumber: nan], "0.0 is not equal to NaN"); PASS([n compare: nan] == NSOrderedDescending, "0.0 greater than NaN") PASS([nan compare: n] == NSOrderedAscending, "NaN less than 0.0") n = [NSNumber numberWithFloat: -1.01]; PASS(NO == [n isEqualToNumber: nan], "-1.01 is not equal to NaN"); PASS([n compare: nan] == NSOrderedAscending, "-1.01 less than NaN") PASS([nan compare: n] == NSOrderedAscending, "NaN less than -1.01") END_SET("not-a-number checks") START_SET("zero checks") NSNumber *zero = [NSDecimalNumber zero]; PASS(YES == [zero isEqualToNumber: zero], "zero is equal to zero"); n = [NSNumber numberWithInt: 2]; PASS(NO == [n isEqualToNumber: zero], "2 is not equal to zero"); PASS([n compare: zero] == NSOrderedDescending, "2 is greater than zero") PASS([zero compare: n] == NSOrderedAscending, "zero is less than 2") n = [NSNumber numberWithUnsignedLongLong: 2]; PASS(NO == [n isEqualToNumber: zero], "2LL is not equal to zero"); PASS([n compare: zero] == NSOrderedDescending, "2LL is greater than zero") PASS([zero compare: n] == NSOrderedAscending, "zero is less than 2LL") n = [NSNumber numberWithFloat: 2.0]; PASS(NO == [n isEqualToNumber: zero], "2.0 is not equal to zero"); PASS([n compare: zero] == NSOrderedDescending, "2.0 is greater than zero") PASS([zero compare: n] == NSOrderedAscending, "zero is less than 2.0") n = [NSNumber numberWithDouble: 2.0]; PASS(NO == [n isEqualToNumber: zero], "2.0dd is not equal to zero"); PASS([n compare: zero] == NSOrderedDescending, "2.0dd is greater than zero") PASS([zero compare: n] == NSOrderedAscending, "zero is less than 2.0dd") n = [NSNumber numberWithFloat: 0.0]; PASS([n isEqualToNumber: zero], "0.0 is equal to zero"); PASS([n compare: zero] == NSOrderedSame, "0.0 is zero") PASS([zero compare: n] == NSOrderedSame, "zero is 0.0") n = [NSNumber numberWithFloat: -1.01]; PASS(NO == [n isEqualToNumber: zero], "-1.01 is not equal to zero"); PASS([n compare: zero] == NSOrderedAscending, "-1.01 less than zero") PASS([zero compare: n] == NSOrderedDescending, "zero greater than -1.01") END_SET("zero checks") END_SET("NSNumber") return 0; } gnustep-base-1.29.0/Tests/base/NSNumber/test02.m000066400000000000000000000056351435650067400212270ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import #import #import #import #include #include int main() { START_SET("NSDecimalNumber") NSDecimalNumberHandler *handler; NSDecimalNumber *n1; NSDecimalNumber *n2; NSString *s1; NSString *s2; NSLocale *locale; locale = [NSLocale systemLocale]; handler = [NSDecimalNumberHandler alloc]; handler = [[handler initWithRoundingMode: NSRoundPlain scale: 2 raiseOnExactness: NO raiseOnOverflow: NO raiseOnUnderflow: NO raiseOnDivideByZero: NO] autorelease]; s1 = [NSString stringWithFormat: @"%0.2f", 0.009]; n1 = [NSDecimalNumber decimalNumberWithString: @"0.009" locale: locale]; n2 = [n1 decimalNumberByRoundingAccordingToBehavior: handler]; s2 = [n2 descriptionWithLocale: locale]; PASS_EQUAL(s2, s1, "rounding 0.009"); s1 = [NSString stringWithFormat: @"%0.2f", 0.019]; n1 = [NSDecimalNumber decimalNumberWithString: @"0.019" locale: locale]; n2 = [n1 decimalNumberByRoundingAccordingToBehavior: handler]; s2 = [n2 descriptionWithLocale: locale]; PASS_EQUAL(s2, s1, "rounding 0.019"); handler = [NSDecimalNumberHandler alloc]; handler = [[handler initWithRoundingMode: NSRoundPlain scale: 3 raiseOnExactness: NO raiseOnOverflow: NO raiseOnUnderflow: NO raiseOnDivideByZero: NO] autorelease]; s1 = [NSString stringWithFormat: @"%0.3f", 0.0009]; n1 = [NSDecimalNumber decimalNumberWithString: @"0.0009" locale: locale]; n2 = [n1 decimalNumberByRoundingAccordingToBehavior: handler]; s2 = [n2 descriptionWithLocale: locale]; PASS_EQUAL(s2, s1, "rounding 0.0009"); s1 = [NSString stringWithFormat: @"%0.3f", 0.0019]; n1 = [NSDecimalNumber decimalNumberWithString: @"0.0019" locale: locale]; /* Try working with NSDecimal directly */ { NSDecimal result; NSDecimal d1 = [n1 decimalValue]; NSString *s2; NSLog(@"NSDecimal before rounding %g", NSDecimalDouble(&d1)); NSDecimalRound(&result, &d1, [handler scale], [handler roundingMode]); NSLog(@"NSDecimal after rounding %g", NSDecimalDouble(&result)); s2 = NSDecimalString(&result, nil); PASS_EQUAL(s2, s1, "NSDecimal rounding 0.0019 to 0.02"); n2 = [NSDecimalNumber decimalNumberWithDecimal: result]; } s2 = [n2 descriptionWithLocale: locale]; PASS_EQUAL(s2, s1, "NSDecimalNumber rounding 0.0019"); END_SET("NSDecimalNumber") return 0; } gnustep-base-1.29.0/Tests/base/NSNumberFormatter/000077500000000000000000000000001435650067400216035ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSNumberFormatter/TestInfo000066400000000000000000000000001435650067400232470ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSNumberFormatter/basic.m000066400000000000000000000051161435650067400230450ustar00rootroot00000000000000#import #import "Testing.h" #import "ObjectTesting.h" int main() { START_SET("basic") NSNumberFormatter *fmt; NSNumber *num; NSString *error; [NSNumberFormatter setDefaultFormatterBehavior: NSNumberFormatterBehavior10_0]; TEST_FOR_CLASS(@"NSNumberFormatter",[NSNumberFormatter alloc], "+[NSNumberFormatter alloc] returns a NSNumberFormatter"); fmt = [[[NSNumberFormatter alloc] init] autorelease]; num = [[[NSNumber alloc] initWithFloat: 1234.567] autorelease]; PASS_EQUAL([fmt stringForObjectValue: num], @"1,234.57", "default format same as Cocoa") num = [[[NSNumber alloc] initWithFloat: 1.01] autorelease]; PASS_EQUAL([fmt stringFromNumber: num], @"1.01", "Handle leading zeroes in fractional part: 1.01") num = [[[NSNumber alloc] initWithFloat: 1.1] autorelease]; PASS_EQUAL([fmt stringFromNumber: num], @"1.1", "Handle leading zeroes in fractional part: 1.1") [fmt setAllowsFloats: NO]; num = [[[NSNumber alloc] initWithFloat: 1234.567] autorelease]; PASS_EQUAL([fmt stringForObjectValue: num], @"1,234.57", "-setAllowsFloats: does not effect rounding") PASS(NO == [fmt getObjectValue: &num forString: @"1234.567" errorDescription: 0], "float input is disallowed") testHopeful = YES; [fmt getObjectValue: &num forString: @"1234.567" errorDescription: &error]; PASS_EQUAL(error, @"Floating Point not allowed", "allowsFloat error") testHopeful = NO; [fmt setFormat: @"__000000"]; num = [[[NSNumber alloc] initWithFloat: 1234.432] autorelease]; PASS_EQUAL([fmt stringForObjectValue: num], @" 001234", "numeric and space padding OK") [fmt setFormat: @"000"]; num = [[[NSNumber alloc] initWithInt: 10] autorelease]; PASS_EQUAL([fmt stringForObjectValue: num], @"010", "numeric padding OK") [fmt setAllowsFloats: YES]; num = [[[NSNumber alloc] initWithFloat: 1234.56] autorelease]; [fmt setPositiveFormat: @"$####.##c"]; [fmt setNegativeFormat: @"-$(####.##)"]; PASS_EQUAL([fmt stringForObjectValue: num], @"$1234.56c", "prefix and suffix used properly") num = [[[NSNumber alloc] initWithFloat: -1234.56] autorelease]; PASS_EQUAL([fmt stringForObjectValue: num], @"-$(1234.56)", "negativeFormat used for -ve number") PASS_EQUAL([fmt stringForObjectValue: [NSDecimalNumber notANumber]], @"NaN", "notANumber special case") [fmt setFormat: @"0"]; PASS_EQUAL([fmt stringForObjectValue: num], @"-1235", "format string of length 1") END_SET("basic") return 0; } gnustep-base-1.29.0/Tests/base/NSNumberFormatter/basic10_4.m000066400000000000000000000146341435650067400234360ustar00rootroot00000000000000#import #import "Testing.h" #import "ObjectTesting.h" #if defined(GS_USE_ICU) #define NSLOCALE_SUPPORTED GS_USE_ICU #else #define NSLOCALE_SUPPORTED 1 /* Assume Apple support */ #endif int main() { NSNumberFormatter *fmt; NSNumber *num; NSString *str; START_SET("NSNumberFormatter") PASS(NSNumberFormatterBehavior10_4 == [NSNumberFormatter defaultFormatterBehavior], "default behavior is NSNumberFormatterBehavior10_4") [NSNumberFormatter setDefaultFormatterBehavior: NSNumberFormatterBehavior10_0]; PASS(NSNumberFormatterBehavior10_0 == [NSNumberFormatter defaultFormatterBehavior], "default behavior can be changed to NSNumberFormatterBehavior10_0") [NSNumberFormatter setDefaultFormatterBehavior: NSNumberFormatterBehaviorDefault]; PASS(NSNumberFormatterBehavior10_4 == [NSNumberFormatter defaultFormatterBehavior], "NSNumberFormatterBehaviorDefault gives NSNumberFormatterBehavior10_4") [NSNumberFormatter setDefaultFormatterBehavior: NSNumberFormatterBehavior10_0]; [NSNumberFormatter setDefaultFormatterBehavior: 1234]; PASS(1234 == [NSNumberFormatter defaultFormatterBehavior], "unknown behavior is accepted") [NSNumberFormatter setDefaultFormatterBehavior: NSNumberFormatterBehavior10_4]; PASS(NSNumberFormatterBehavior10_4 == [NSNumberFormatter defaultFormatterBehavior], "default behavior can be changed to NSNumberFormatterBehavior10_4") fmt = [[[NSNumberFormatter alloc] init] autorelease]; PASS(NSNumberFormatterBehavior10_4 == [fmt formatterBehavior], "a new formatter gets the current default behavior") [fmt setFormatterBehavior: NSNumberFormatterBehaviorDefault]; PASS(NSNumberFormatterBehaviorDefault == [fmt formatterBehavior], "a new formatter can have the default behavior set") /* It is not guaranteed by ICU that UNUM_NAN_SYMBOL is "NaN". * On Windows, NaN has a negative signum and returns "-NaN". */ testHopeful = YES; str = [fmt stringFromNumber: [NSDecimalNumber notANumber]]; PASS_EQUAL(str, @"NaN", "notANumber special case") testHopeful = NO; START_SET("NSLocale") NSLocale *sys; NSLocale *en; const unichar uspc[1] = {0x00a0}; NSString *spc = [NSString stringWithCharacters: uspc length: 1]; if (!NSLOCALE_SUPPORTED) SKIP("NSLocale not supported\nThe ICU library was not available when GNUstep-base was built") sys = [NSLocale systemLocale]; [fmt setLocale: sys]; PASS([fmt getObjectValue: &num forString: @"0.00" errorDescription: 0] && num != nil, "formatting suceeded") if (testPassed) { PASS(NO == [num isEqual: [NSDecimalNumber notANumber]], "is not equal to NaN") PASS(YES == [num isEqual: [NSDecimalNumber zero]], "is equal to zero") } num = [[[NSNumber alloc] initWithFloat: 1234.567] autorelease]; str = [fmt stringFromNumber: num]; PASS_EQUAL(str, @"1235", "default 10.4 format same as Cocoa") en = [[[NSLocale alloc] initWithLocaleIdentifier: @"en"] autorelease]; PASS_EQUAL([en localeIdentifier], @"en", "have locale 'en'"); [fmt setLocale: en]; [fmt setPaddingCharacter: @"+"]; PASS_EQUAL([fmt paddingCharacter], @"+", "padding character se to '+'") [fmt setPaddingCharacter: @"*"]; // Subsequent tests use '*' [fmt setMaximumFractionDigits: 2]; str = [fmt stringFromNumber: num]; PASS_EQUAL(str, @"1234.57", "round up for fractional part >0.5") num = [[[NSNumber alloc] initWithFloat: 1234.432] autorelease]; str = [fmt stringFromNumber: num]; PASS_EQUAL(str, @"1234.43", "round down for fractional part <0.5") num = [[[NSNumber alloc] initWithFloat: -1234.43] autorelease]; [fmt setMaximumFractionDigits: 1]; [fmt setMinusSign: @"_"]; PASS_EQUAL([fmt stringFromNumber: num], @"_1234.4", "minus sign assigned correctly"); [fmt setPercentSymbol: @"##"]; [fmt setNumberStyle: NSNumberFormatterPercentStyle]; testHopeful = YES; PASS_EQUAL([fmt stringFromNumber: num], @"_123,443##", "Negative percentage correct"); testHopeful = NO; num = [[[NSNumber alloc] initWithFloat: 1234.432] autorelease]; [fmt setNumberStyle: NSNumberFormatterNoStyle]; [fmt setMaximumFractionDigits: 0]; [fmt setFormatWidth: 6]; str = [fmt stringFromNumber: num]; PASS([str isEqual: @"**1234"] || [str isEqual: @" 1234"], "format width set correctly"); [fmt setPositivePrefix: @"+"]; str = [fmt stringFromNumber: num]; PASS([str isEqual: @"*+1234"] || [str isEqual: @" +1234"], "positive prefix set correctly"); [fmt setPaddingCharacter: @"0"]; str = [fmt stringFromNumber: num]; PASS_EQUAL(str, @"0+1234", "default padding position is before prefix"); [fmt setPaddingPosition: NSNumberFormatterPadAfterPrefix]; str = [fmt stringFromNumber: num]; PASS_EQUAL(str, @"+01234", "numeric and space padding OK") num = [[[NSNumber alloc] initWithFloat: 1234.56] autorelease]; [fmt setNumberStyle: NSNumberFormatterCurrencyStyle]; [fmt setLocale: [[NSLocale alloc] initWithLocaleIdentifier: @"pt_BR"]]; testHopeful = YES; PASS_EQUAL([fmt stringFromNumber: num], @"+1.235", "currency style does not include currency string"); testHopeful = NO; [fmt setPositivePrefix: @"+"]; PASS_EQUAL([fmt stringFromNumber: num], @"+1.235", "positive prefix is set correctly for currency style"); [fmt setPositiveSuffix: @"c"]; PASS_EQUAL([fmt stringFromNumber: num], @"+1.235c", "prefix and suffix used properly"); num = [[[NSNumber alloc] initWithFloat: -1234.56] autorelease]; str = [fmt stringFromNumber: num]; PASS(([str isEqual: @"(R$1.235)"] || [str isEqual: @"_R$1.235"] || [str isEqual: [NSString stringWithFormat: @"_R$%@%@", spc, @"1.235"]]), "negativeFormat used for -ve number"); [fmt setNumberStyle: NSNumberFormatterNoStyle]; [fmt setMinusSign: @"_"]; testHopeful = YES; PASS_EQUAL([fmt stringFromNumber: num], @"_01235", "format string of length 1") testHopeful = NO; END_SET("NSLocale") END_SET("NSNumberFormatter") return 0; } gnustep-base-1.29.0/Tests/base/NSObject/000077500000000000000000000000001435650067400176755ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSObject/TestInfo000066400000000000000000000000001435650067400213410ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSObject/basic.m000066400000000000000000000007061435650067400211370ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; test_alloc(@"NSObject"); test_NSObject(@"NSObject", [NSArray arrayWithObject:[[NSObject new] autorelease]]); PASS([[[NSObject new] autorelease] methodSignatureForSelector: 0] == nil, "a null selector proiduces a nil method signature"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSObject/initialize.m000066400000000000000000000133251435650067400222200ustar00rootroot00000000000000#import #import #import #include #import "Testing.h" #if defined(SIGALRM) #include #endif @interface Init0 : NSObject @end @interface Init1 : Init0 @end @interface SlowInit0 @end @interface SlowInit1 : SlowInit0 + (void) doNothing; @end @interface SlowInit2 + (void) doNothing; @end @interface Mutual1 : NSObject @end @interface Mutual2 : NSObject @end static NSCondition *l; static volatile int init0, init1, init2, init3; static int initCount = 0; @implementation Init0 + (void) initialize { initCount++; } @end @implementation Init1 @end @implementation SlowInit0 + (void) initialize { init0 = 1; } @end @implementation SlowInit1 /** * Called from main thread. */ + (void) initialize { PASS(init0 == 1, "Superclass +initialize called before subclass"); // Spin until we've entered the second +initialize method while (init2 == 0) {} // Wake up the other thread [l signal]; [l unlock]; // Trigger the [SlowInit2 doNothing]; init1 = 1; } + (void) doNothing {} @end @implementation SlowInit2 /** * Called from the second thread. */ + (void) initialize { init2++; // Sleep until the main thread is ready for us [l lock]; /* If the runtime is doing the wrong thing and this is called twice, then * there will be no signal. We don't want to deadlock, so make sure that * this times out after a short while. */ [l waitUntilDate: [NSDate dateWithTimeIntervalSinceNow: 1.5]]; [l unlock]; [NSThread sleepForTimeInterval: 1]; PASS(init1 == 0, "First initialize method did not finish too early"); init3++; } static volatile int finished = 2; + (void) doNothing { PASS(init2 == 1, "+initialize called exactly once"); PASS(init3 == 1, "+initialize completed before another method started"); finished--; } @end @interface Trampoline : NSObject + (void) launch: (id)ignored; @end @implementation Trampoline /** * Launch the second thread. NSThread retains its arguments in the main * thread, we need to ensure that nothing triggers the second +initialize * method until we're in the second thread. */ + (void) launch: (id)ignored { [NSAutoreleasePool new]; [SlowInit2 doNothing]; } @end static int mutual = 0; @implementation Mutual1 + (void) initialize { [NSThread sleepForTimeInterval: 0.5]; [Mutual2 class]; mutual++; } @end @implementation Mutual2 + (void) initialize { [NSThread sleepForTimeInterval: 0.5]; [Mutual1 class]; mutual++; } @end @interface NSObject (Mutual) + (void) mutual1: (id)ignored; + (void) mutual2: (id)ignored; @end @implementation NSObject (Mutual) + (void) mutual1: (id)ignored { [Mutual1 class]; } + (void) mutual2: (id)ignored { [Mutual2 class]; } @end static void mutualinit(int sig) { /* Generate a dashed hope for mutuality testing. */ testHopeful = YES; PASS(0, "+initialize mutually dependent methods work"); exit(0); } static void concurrency(int sig) { /* Generate a dashed hope for concurrency testing. */ testHopeful = YES; PASS(0, "+initialize runs concurrently"); exit(0); } /** * Test the behaviour of +initialize. * It's an undocumented (but nice) feature that the Apple runtime lets * both of the +initialize methods run concurrently, however the first * one will block implicitly until the second one has completed. */ int main(void) { NSDate *when; [NSAutoreleasePool new]; START_SET("+initialize") /* Make sure we have initalised all the classes necessary for the test * framework to record a test ... by passing one. */ PASS(1, "initialize test starts"); #if defined(SIGALRM) /* End in a signal if the concurrency test deadlocks. */ signal(SIGALRM, mutualinit); alarm(5); #else SKIP("+initialize runs concurrently. No SIGALRM present, this means we cannot stop the test on deadlock."); #endif /* Make sure that classes whose +initialise methods call each other * can operate safely. */ [NSThread detachNewThreadSelector: @selector(mutual1:) toTarget: [NSObject class] withObject: nil]; [NSThread detachNewThreadSelector: @selector(mutual2:) toTarget: [NSObject class] withObject: nil]; when = [NSDate dateWithTimeIntervalSinceNow: 10.0]; while (mutual < 2 && [when timeIntervalSinceNow] > 0.0) { [NSThread sleepForTimeInterval: 0.1]; } #if defined(SIGALRM) signal(SIGALRM, SIG_IGN); #endif PASS(2 == mutual, "mutually dependent +initialize is thread-safe"); /* Make sure that when a class without its own +initialise is first used, * the inherited +initialize is called instead. * This is a traditional feature of the Apple runtime, which was 'improved' * by the GNU runtime (which actually checks to see if +initialize is * implemented before trying to call it). Good software should not depend * on either behavior ... which means all good software should protext its * +initialize code so that being called multiple times is OK. * New GNU/GNUstep runtimes adopt the old Apple behavior purely for * consistency. */ [Init1 class]; testHopeful = YES; PASS(2 == initCount, "inherited +initialize is called automatically"); testHopeful = NO; #if defined(SIGALRM) /* End in a signal if the concurrency test deadlocks. */ signal(SIGALRM, concurrency); alarm(5); #else SKIP("+initialize runs concurrently. No SIGALRM present, this means we cannot stop the test on deadlock."); #endif l = [NSCondition new]; [l lock]; [NSThread detachNewThreadSelector: @selector(launch:) toTarget: [Trampoline class] withObject: nil]; [NSThread sleepForTimeInterval: 0.5]; [SlowInit1 doNothing]; [l lock]; [l unlock]; while (finished) { [NSThread sleepForTimeInterval: 0.01]; } END_SET("+initialize") return 0; } gnustep-base-1.29.0/Tests/base/NSObject/objc++.mm000066400000000000000000000027521435650067400213010ustar00rootroot00000000000000#import "Testing.h" #import #if defined(TESTDEV) static int A_init; static int B_init; static int A_destroyed; static int B_destroyed; class A { int b; public: A() : b(12) { PASS(0 == A_init, "Constructor only called once"); PASS(0 == B_init, "a constructor called before b constructor "); A_init = 1; }; ~A() { PASS(0 == A_destroyed, "Destructor only called once"); PASS(1 == B_destroyed, "b destructor called before a destructor"); A_destroyed = 1; }; }; class A1 { int b; public: A1() : b(12) { PASS(1 == A_init, "a constructor called before b constructor "); B_init = 1; }; ~A1() { PASS(0 == A_destroyed, "b destructor called before a destructor"); B_destroyed = 1; }; }; @interface B : NSObject { A a; } @end @interface C : B { A1 b; } @end @implementation B - (id) init { PASS(1 == A_init, "a constructor called before -init"); PASS(1 == B_init, "b constructor called before -init"); PASS(0 == A_destroyed, "a destructor not called before -init"); PASS(0 == B_destroyed, "b destructor not called before -init"); return self; } @end @implementation C @end int main(void) { // Make sure constructors / destructors are called even without -init [[C alloc] release]; // Reset state A_init = B_init = A_destroyed = B_destroyed = 0; // Check init is called in the middle [[C new] release]; return 0; } #else int main(void) { return 0; } #endif gnustep-base-1.29.0/Tests/base/NSObject/test00.m000066400000000000000000000004501435650067400211710ustar00rootroot00000000000000#import "Testing.h" #import #import #import int main() { Class theClass = NSClassFromString(@"NSObject"); PASS(theClass == [NSObject class], "'NSObject' %s","uses +class to return self"); return 0; } gnustep-base-1.29.0/Tests/base/NSObject/test01.m000066400000000000000000000040461435650067400211770ustar00rootroot00000000000000#import "Testing.h" #import #import #import #if defined(GNUSTEP_BASE_LIBRARY) @interface NSObject (ISCLASS) // This method doesn't exist on Cocoa - (BOOL) isClass; @end @interface MyEvilClass : NSObject { Class class; const char *name; long version; unsigned long info; /* not sure which of these is correct */ Class class_; const char *name_; long version_; unsigned long info_; } -(void)setInfo:(unsigned long)info; @end @implementation MyEvilClass -(void)setInfo:(unsigned long)theInfo { info = theInfo; } @end #endif int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; id evilObject; #if defined(GNUSTEP_BASE_LIBRARY) PASS([NSObject isClass] && [NSString isClass] && [NSArray isClass], "-isClass returns YES on a Class"); PASS((![[[NSObject new] autorelease] isClass] && ![[NSString stringWithCString:"foo"] isClass] && ![[[NSArray new] autorelease] isClass]), "-isClass returns NO on an instance"); evilObject = [MyEvilClass new]; [evilObject setInfo:1]; PASS(![evilObject isClass], "-isClass returns NO on an instance (special test for broken libobjc)"); #endif PASS(([[[NSObject new] autorelease] isKindOfClass:[NSObject class]] && [[[NSString new] autorelease] isKindOfClass:[NSString class]] && ![[[NSObject new] autorelease] isKindOfClass:[NSString class]] && [[[NSString new] autorelease] isKindOfClass:[NSObject class]] && ![[[NSString new] autorelease] isKindOfClass:[NSArray class]] && [[[NSMutableString new] autorelease] isKindOfClass:[NSString class]]), "-isKindOfClass: works"); /* should return YES if receiver and argument are both NSObject */ PASS([NSObject isKindOfClass:[NSObject class]] && ![NSString isKindOfClass:[NSString class]] && ![NSObject isKindOfClass:[NSString class]] && [NSString isKindOfClass:[NSObject class]], "+isKindOfClass: works"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSObject/test02.m000066400000000000000000000027331435650067400212010ustar00rootroot00000000000000#import "Testing.h" #import #import /* Nicola Pero, Tue Dec 18 17:54:53 GMT 2001 */ @protocol DoingNothing - (void) doNothing; @end @protocol DoingNothingCategory - (void) doNothingCategory; @end @interface NicolaTest : NSObject { } @end @implementation NicolaTest - (void) doNothing { return; } @end @interface NicolaTest (Category) @end @implementation NicolaTest (Category) - (void) doNothingCategory { return; } @end int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS([NicolaTest conformsToProtocol:@protocol(DoingNothing)], "+conformsToProtocol returns YES on an implemented protocol"); PASS([NicolaTest conformsToProtocol:@protocol(DoingNothingCategory)], "+conformsToProtocol returns YES on a protocol implemented in a category"); PASS(![NicolaTest conformsToProtocol:@protocol(NSCoding)], "+conformsToProtocol returns NO on an unimplemented protocol"); PASS([[NicolaTest new] conformsToProtocol:@protocol(DoingNothing)], "-conformsToProtocol returns YES on an implemented protocol"); PASS([[NicolaTest new] conformsToProtocol:@protocol(DoingNothingCategory)], "-conformsToProtocol returns YES on a protocol implemented in a category"); PASS(![[NicolaTest new] conformsToProtocol:@protocol(NSCoding)], "-conformsToProtocol returns NO on an unimplemented protocol"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSObject/test03.m000066400000000000000000000023241435650067400211760ustar00rootroot00000000000000#import "Testing.h" #import #import #import /* Only do associated objects test if they are supported by the runtime. */ #if OBJC2RUNTIME && defined(OBJC_ASSOCIATION_RETAIN) static BOOL AssociatedObjectDeallocCalled = NO; static const char* objc_setAssociatedObjectKey = "objc_setAssociatedObjectKey"; @interface associatedObjectTestAssociatedObject : NSObject @end @implementation associatedObjectTestAssociatedObject - (void) dealloc { AssociatedObjectDeallocCalled = YES; [super dealloc]; } @end @interface associatedObjectTestAllocatedObject : NSObject @end @implementation associatedObjectTestAllocatedObject @end int main() { associatedObjectTestAllocatedObject* object = [associatedObjectTestAllocatedObject new]; associatedObjectTestAssociatedObject *info = [associatedObjectTestAssociatedObject new]; objc_setAssociatedObject(object, &objc_setAssociatedObjectKey, info, OBJC_ASSOCIATION_RETAIN); [info release]; [object release]; PASS(AssociatedObjectDeallocCalled == YES, "'objc_setAssociatedObject' was released"); return 0; } #else int main() { return 0; // Nothing to test } #endif gnustep-base-1.29.0/Tests/base/NSOperation/000077500000000000000000000000001435650067400204275ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSOperation/TestInfo000066400000000000000000000000001435650067400220730ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSOperation/basic.m000066400000000000000000000117021435650067400216670ustar00rootroot00000000000000#import #import #import #import "ObjectTesting.h" # ifndef __has_feature # define __has_feature(x) 0 # endif static BOOL blockDidRun = NO; int main() { id obj1; id obj2; NSMutableArray *testObjs = [[NSMutableArray alloc] init]; NSAutoreleasePool *arp = [NSAutoreleasePool new]; test_alloc(@"NSOperation"); obj1 = [NSOperation new]; PASS((obj1 != nil), "can create an operation"); [testObjs addObject: obj1]; test_NSObject(@"NSOperation", testObjs); PASS(([obj1 isReady] == YES), "operation is ready"); PASS(([obj1 isConcurrent] == NO), "operation is not concurrent"); PASS(([obj1 isCancelled] == NO), "operation is not cancelled"); PASS(([obj1 isExecuting] == NO), "operation is not executing"); PASS(([obj1 isFinished] == NO), "operation is not finished"); PASS(([[obj1 dependencies] isEqual: [NSArray array]]), "operation has no dependencies"); PASS(([obj1 queuePriority] == NSOperationQueuePriorityNormal), "operation has normal priority"); [obj1 setQueuePriority: 10000]; PASS(([obj1 queuePriority] == NSOperationQueuePriorityVeryHigh), "operation has very high priority"); obj2 = [NSOperation new]; [obj2 addDependency: obj1]; PASS(([[obj2 dependencies] isEqual: testObjs]), "operation has added dependency"); PASS(([obj2 isReady] == NO), "operation with dependency is not ready"); [obj1 cancel]; PASS(([[obj2 dependencies] isEqual: testObjs]), "cancelled dependency continues"); PASS(([obj1 isCancelled] == YES), "operation is cancelled"); PASS(([[obj2 dependencies] isEqual: testObjs]), "cancelled dependency continues"); PASS(([obj2 isReady] == NO), "operation with cancelled dependency not ready"); [obj2 removeDependency: obj1]; PASS(([[obj2 dependencies] isEqual: [NSArray array]]), "dependency removal works"); PASS(([obj2 isReady] == YES), "operation without dependency is ready"); [obj1 release]; obj1 = [NSOperation new]; [testObjs replaceObjectAtIndex: 0 withObject: obj1]; [obj2 addDependency: obj1]; # if __has_feature(blocks) [obj1 setCompletionBlock: ^(void){blockDidRun = YES;}]; # endif [obj1 start]; [NSThread sleepForTimeInterval: 1.0]; PASS(([obj1 isFinished] == YES), "operation is finished"); PASS(([obj1 isReady] == YES), "a finished operation is ready"); # if __has_feature(blocks) PASS(YES == blockDidRun, "completion block is executed"); # endif PASS(([[obj2 dependencies] isEqual: testObjs]), "finished dependency continues"); PASS(([obj2 isReady] == YES), "operation with finished dependency is ready"); [obj2 removeDependency: obj1]; [obj1 release]; obj1 = [NSOperation new]; [testObjs replaceObjectAtIndex: 0 withObject: obj1]; [obj2 addDependency: obj1]; [obj2 cancel]; PASS(([obj2 isReady] == YES), "a cancelled object is ready even with a dependency"); [obj2 start]; PASS(([obj2 isFinished] == YES), "a cancelled object can finish"); PASS_EXCEPTION([obj2 start];, NSInvalidArgumentException, "NSOperation cannot be started twice"); PASS(([obj2 waitUntilFinished], YES), "wait returns at once"); test_alloc(@"NSOperationQueue"); obj1 = [NSOperationQueue new]; PASS((obj1 != nil), "can create an operation queue"); [testObjs removeAllObjects]; [testObjs addObject: obj1]; test_NSObject(@"NSOperationQueue", testObjs); PASS(([obj1 isSuspended] == NO), "not suspended by default"); [obj1 setSuspended: YES]; PASS(([obj1 isSuspended] == YES), "set suspended yes"); [obj1 setSuspended: NO]; PASS(([obj1 isSuspended] == NO), "set suspended no"); PASS(([[obj1 name] length] > 0), "name has a default"); [obj1 setName: @"mine"]; PASS(([[obj1 name] isEqual: @"mine"] == YES), "set name OK"); [obj1 setName: nil]; PASS(([[obj1 name] isEqual: @""]), "setting null name gives empty string"); PASS(([obj1 maxConcurrentOperationCount] == NSOperationQueueDefaultMaxConcurrentOperationCount), "max concurrent set by default"); [obj1 setMaxConcurrentOperationCount: 1]; PASS(([obj1 maxConcurrentOperationCount] == 1), "max concurrent set to one"); [obj1 setMaxConcurrentOperationCount: 0]; PASS(([obj1 maxConcurrentOperationCount] == 0), "max concurrent set to zero"); [obj1 setMaxConcurrentOperationCount: 1000000]; PASS(([obj1 maxConcurrentOperationCount] == 1000000), "max concurrent set to a million"); [obj1 setMaxConcurrentOperationCount: NSOperationQueueDefaultMaxConcurrentOperationCount]; PASS(([obj1 maxConcurrentOperationCount] == NSOperationQueueDefaultMaxConcurrentOperationCount), "max concurrent set to default"); PASS_EXCEPTION([obj1 setMaxConcurrentOperationCount: -1000000];, NSInvalidArgumentException, "NSOperationQueue cannot be given negative count"); obj2 = [NSOperation new]; [obj1 addOperation: obj2]; [NSThread sleepForTimeInterval: 1.0]; PASS(([obj2 isFinished] == YES), "queue ran operation"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSOperation/concurrent.m000066400000000000000000000102251435650067400227670ustar00rootroot00000000000000#import #import #import #import #import #import #import #import "ObjectTesting.h" // concurrent operation @interface MyOperation : NSOperation { int calculation; BOOL executing; BOOL finished; } - (void) completeOperation; @end @implementation MyOperation - (id) initWithValue: (int)aVal { self = [super init]; if (self) { calculation = aVal; executing = NO; finished = NO; } return self; } - (BOOL) isConcurrent { return YES; } - (BOOL) isExecuting { return executing; } - (BOOL) isFinished { return finished; } - (int) getCalculation { return calculation; } - (void) main { NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; [self beginOperation]; // Do the main work of the operation here. calculation = 2 * calculation; [self completeOperation]; [pool release]; } - (void) start { NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; // Always check for cancellation before launching the task. if ([self isCancelled]) { // Must move the operation to the finished state if it is canceled. [self willChangeValueForKey: @"isFinished"]; finished = YES; [self didChangeValueForKey: @"isFinished"]; return; } // As the operation is not canceled, begin executing the task. [NSThread detachNewThreadSelector: @selector(main) toTarget: self withObject: nil]; [pool release]; } - (void) beginOperation { // Also trigger KVO notification for isFinished to ensure its handled // correctly if operation is not yet finished [self willChangeValueForKey: @"isFinished"]; [self willChangeValueForKey: @"isExecuting"]; executing = YES; finished = NO; [self didChangeValueForKey: @"isExecuting"]; [self didChangeValueForKey: @"isFinished"]; } - (void) completeOperation { [self willChangeValueForKey: @"isFinished"]; [self willChangeValueForKey: @"isExecuting"]; executing = NO; finished = YES; [self didChangeValueForKey: @"isExecuting"]; [self didChangeValueForKey: @"isFinished"]; } @end int main() { id obj; NSOperationQueue *q; int i; NSMutableArray *a; # if __has_feature(blocks) __block BOOL blockDidRun = NO; #endif START_SET("concurrent operations") // single concurrent operation obj = [[MyOperation alloc] initWithValue: 1]; # if __has_feature(blocks) [obj setCompletionBlock: ^(void){blockDidRun = YES;}]; # endif q = [NSOperationQueue new]; [q addOperation: obj]; [q waitUntilAllOperationsAreFinished]; PASS(([obj isFinished] == YES), "operation ran"); PASS(([obj isExecuting] == NO), "operation is not executing"); # if __has_feature(blocks) PASS(blockDidRun == YES, "completion block is executed"); # endif PASS(([obj getCalculation] == 2), "operation was performed"); [obj release]; // multiple concurrent operations [q setMaxConcurrentOperationCount: 10]; a = [NSMutableArray array]; for (i = 0; i < 5; ++i) { obj = [[MyOperation alloc] initWithValue: i]; [a addObject: obj]; [q addOperation: obj]; } [q waitUntilAllOperationsAreFinished]; PASS(([obj isFinished] == YES), "operation ran"); PASS(([obj isExecuting] == NO), "operation is not executing"); for (i = 0; i < 5; ++i) { obj = [a objectAtIndex: i]; PASS(([obj getCalculation] == (2*i)), "operation was performed"); } // multiple concurrent operations [q setMaxConcurrentOperationCount: 5]; a = [NSMutableArray array]; for (i = 0; i < 10; ++i) { obj = [[MyOperation alloc] initWithValue: i]; [a addObject: obj]; [obj release]; } [q addOperations: a waitUntilFinished: YES]; PASS(([obj isFinished] == YES), "operation ran"); PASS(([obj isExecuting] == NO), "operation is not executing"); for (i = 0; i < 10; ++i) { obj = [a objectAtIndex: i]; PASS(([obj getCalculation] == (2*i)), "operation was performed"); } END_SET("concurrent operations") return 0; } gnustep-base-1.29.0/Tests/base/NSOperation/threads.m000066400000000000000000000206131435650067400222410ustar00rootroot00000000000000#import #import #import #import #import #import #import "ObjectTesting.h" @interface ThreadCounter : NSObject { unsigned count; } - (unsigned) count; - (void) increment: (NSNotification*)n; - (void) reset; @end @implementation ThreadCounter - (unsigned) count { return count; } - (void) dealloc { [[NSNotificationCenter defaultCenter] removeObserver: self]; [super dealloc]; } - (void) increment: (NSNotification*)n { count++; } - (id) init { [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(increment:) name: NSThreadWillExitNotification object: nil]; return self; } - (void) reset { count = 0; } @end @interface OpFlag : NSOperation { NSOperationQueue *queue; NSThread *thread; BOOL flag; } - (void) main; - (NSOperationQueue*) queue; - (BOOL) ran; - (NSThread*) thread; @end @implementation OpFlag - (void) main { flag = YES; queue = [NSOperationQueue currentQueue]; thread = [NSThread currentThread]; } - (NSOperationQueue*) queue { return queue; } - (BOOL) ran { return flag; } - (NSThread*) thread { return thread; } - (void) release { // NSLog(@"Will release %@ at %@", self, [NSThread callStackSymbols]); [super release]; } - (id) retain { // NSLog(@"Will retain %@ at %@", self, [NSThread callStackSymbols]); return [super retain]; } @end @interface OpExit : OpFlag @end @implementation OpExit - (void) main { [super main]; [NSThread exit]; } @end @interface OpRaise : OpFlag @end @implementation OpRaise - (void) main { [super main]; [NSException raise: NSGenericException format: @"done"]; } @end @interface OpOrder : NSOperation @end @implementation OpOrder static NSLock *lock = nil; static NSMutableArray *list = nil; + (void) initialize { lock = [NSLock new]; list = [NSMutableArray new]; } - (void) main { [lock lock]; [list addObject: self]; [lock unlock]; } @end int main() { ThreadCounter *cnt; int tries; id old; id obj; NSMutableArray *a; NSOperationQueue *q; NSAutoreleasePool *arp = [NSAutoreleasePool new]; cnt = [ThreadCounter new]; PASS((cnt != nil && [cnt count] == 0), "counter was set up"); // Check that operation runs in current thread. obj = [OpFlag new]; [obj start]; PASS(([obj ran] == YES), "operation ran"); PASS(([obj thread] == [NSThread currentThread]), "operation ran in this thread"); PASS(([obj queue] == [NSOperationQueue mainQueue]), "operation ran in main queue"); [obj release]; // Check that monitoring of another thread works. obj = [OpFlag new]; [NSThread detachNewThreadSelector: @selector(start) toTarget: obj withObject: nil]; [NSThread sleepForTimeInterval: 0.1]; PASS(([obj isFinished] == YES), "operation finished"); PASS(([obj ran] == YES), "operation ran"); PASS(([obj thread] != [NSThread currentThread]), "operation ran in other thread"); [obj release]; // Check that exit from thread in -main causes operation tracking to fail. obj = [OpExit new]; [NSThread detachNewThreadSelector: @selector(start) toTarget: obj withObject: nil]; [NSThread sleepForTimeInterval: 0.1]; PASS(([obj isFinished] == NO), "operation exited"); PASS(([obj ran] == YES), "operation ran"); PASS(([obj thread] != [NSThread currentThread]), "operation ran in other thread"); PASS(([obj isExecuting] == YES), "operation seems to be running"); [obj release]; // Check that raising exception in -main causes operation tracking to fail. obj = [OpRaise new]; PASS_EXCEPTION([obj start];, NSGenericException, "NSOperation exceptions propogate from main"); PASS(([obj isFinished] == NO), "operation failed to finish"); PASS(([obj ran] == YES), "operation ran"); PASS(([obj thread] == [NSThread currentThread]), "operation ran in this thread"); PASS(([obj isExecuting] == YES), "operation seems to be running"); [obj release]; obj = [OpFlag new]; [obj start]; PASS(([obj ran] == YES), "operation ran"); PASS(([obj thread] == [NSThread currentThread]), "operation ran in this thread"); [obj release]; obj = [OpFlag new]; q = [NSOperationQueue new]; PASS(q != [NSOperationQueue mainQueue], "my queue is not main queue"); PASS(q != [NSOperationQueue currentQueue], "my queue is not current queue"); [cnt reset]; [q addOperation: obj]; [q waitUntilAllOperationsAreFinished]; PASS(([obj ran] == YES), "operation ran"); PASS(([obj thread] != [NSThread currentThread]), "operation ran in other thread"); PASS(([obj queue] == q), "operation ran in my queue"); PASS(([cnt count] == 0), "thread did not exit immediately"); [obj release]; /* Observed behavior on OSX 10.6 is that the thread exits after five seconds * and the base library copies that 5 second lifetime... but who knows what * that might change to in future? */ [NSThread sleepForTimeInterval: 5.0]; /* Allow some extra time in case the machine is slow etc. */ for (tries = 0; [cnt count] == 0 && tries < 50; tries++) { [NSThread sleepForTimeInterval: 0.1]; } PASS(([cnt count] == 1), "thread exit occurs withing ten seconds"); PASS(([NSOperationQueue currentQueue] == [NSOperationQueue mainQueue]), "current queue outside -main is main queue"); PASS(([NSOperationQueue mainQueue] != nil), "main queue is not nil"); obj = [OpFlag new]; [q addOperation: obj]; [q waitUntilAllOperationsAreFinished]; PASS(([obj isFinished] == YES), "main queue runs an operation"); PASS(([obj thread] != [NSThread currentThread]), "operation ran in other thread"); [q setSuspended: YES]; obj = [OpFlag new]; [q addOperation: obj]; [NSThread sleepForTimeInterval: 0.1]; PASS(([obj isFinished] == NO), "suspend works"); [q setSuspended: NO]; [q waitUntilAllOperationsAreFinished]; PASS(([obj isFinished] == YES), "unsuspend works"); [obj release]; [q setMaxConcurrentOperationCount: 0]; obj = [OpFlag new]; [q addOperation: obj]; [NSThread sleepForTimeInterval: 0.1]; PASS(([obj isFinished] == NO), "max operation count of zero suspends queue"); [q setMaxConcurrentOperationCount: 1]; [q waitUntilAllOperationsAreFinished]; PASS(([obj isFinished] == YES), "resetting max operation queue sarts it"); [obj release]; a = [NSMutableArray array]; [q setSuspended: YES]; obj = [OpOrder new]; [a addObject: obj]; [obj release]; obj = [OpOrder new]; [a addObject: obj]; [obj release]; obj = [OpOrder new]; [a addObject: obj]; [obj release]; [q setSuspended: NO]; [q addOperations: a waitUntilFinished: YES]; PASS(([list isEqual: a]), "operations ran in order of addition"); [list removeAllObjects]; [a removeAllObjects]; [q setSuspended: YES]; obj = [OpOrder new]; [obj setQueuePriority: NSOperationQueuePriorityHigh]; [a addObject: obj]; [q addOperation: obj]; [obj release]; obj = [OpOrder new]; [a addObject: obj]; [q addOperation: obj]; [obj release]; obj = [OpOrder new]; [obj setQueuePriority: NSOperationQueuePriorityLow]; [a addObject: obj]; [q addOperation: obj]; [obj release]; obj = [a objectAtIndex: 1]; [obj setQueuePriority: NSOperationQueuePriorityVeryLow]; [a addObject: obj]; [a removeObjectAtIndex: 1]; [q setSuspended: NO]; [q waitUntilAllOperationsAreFinished]; PASS(([list isEqual: a]), "operations ran in order of priority"); [list removeAllObjects]; [a removeAllObjects]; [q setSuspended: YES]; old = [OpOrder new]; [a addObject: old]; [old release]; [old setQueuePriority: NSOperationQueuePriorityLow]; obj = [OpOrder new]; [a addObject: obj]; [obj release]; [old addDependency: obj]; obj = [OpOrder new]; [a addObject: obj]; [obj release]; [obj setQueuePriority: NSOperationQueuePriorityHigh]; [obj addDependency: old]; [q setSuspended: NO]; [q addOperations: a waitUntilFinished: YES]; PASS(([list objectAtIndex: 0] == [a objectAtIndex: 1] && [list objectAtIndex: 1] == [a objectAtIndex: 0]), "operations ran in order of dependency"); PASS(1 == [[old dependencies] count], "dependencies not removed when done") [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSOrderedSet/000077500000000000000000000000001435650067400205275ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSOrderedSet/TestInfo000066400000000000000000000000001435650067400221730ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSOrderedSet/basic.m000066400000000000000000000271671435650067400220030ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import static NSString *stringData = @"" @"" @"" @"" @" $archiver" @" NSKeyedArchiver" @" $objects" @" " @" $null" @" " @" $class" @" " @" CF$UID" @" 14" @" " @" NS.object.0" @" " @" CF$UID" @" 2" @" " @" NS.object.1" @" " @" CF$UID" @" 3" @" " @" NS.object.10" @" " @" CF$UID" @" 12" @" " @" NS.object.11" @" " @" CF$UID" @" 13" @" " @" NS.object.2" @" " @" CF$UID" @" 4" @" " @" NS.object.3" @" " @" CF$UID" @" 5" @" " @" NS.object.4" @" " @" CF$UID" @" 6" @" " @" NS.object.5" @" " @" CF$UID" @" 7" @" " @" NS.object.6" @" " @" CF$UID" @" 8" @" " @" NS.object.7" @" " @" CF$UID" @" 9" @" " @" NS.object.8" @" " @" CF$UID" @" 10" @" " @" NS.object.9" @" " @" CF$UID" @" 11" @" " @" " @" Now" @" is" @" the" @" time" @" for" @" all" @" Horrible" @" men" @" to" @" Flee From" @" the aid" @" of their country" @" " @" $classes" @" " @" NSMutableOrderedSet" @" NSOrderedSet" @" NSObject" @" " @" $classname" @" NSMutableOrderedSet" @" " @" " @" $top" @" " @" root" @" " @" CF$UID" @" 1" @" " @" " @" $version" @" 100000" @"" @""; int main() { START_SET("NSOrderedSet base") NSOrderedSet *testObj, *testObj2; NSMutableOrderedSet *mutableTest1, *mutableTest2; NSMutableArray *testObjs = [NSMutableArray new]; NSData *data = [stringData dataUsingEncoding: NSUTF8StringEncoding]; NSMutableSet *testSet; testObj = [NSOrderedSet new]; [testObjs addObject: testObj]; PASS(testObj != nil && [testObj count] == 0, "can create an empty ordered set"); testObj = [NSOrderedSet orderedSetWithObject: @"Hello"]; [testObjs addObject: testObj]; PASS(testObj != nil && [testObj count] == 1, "can create an ordered set with one element"); id objs[] = {@"Hello", @"Hello1"}; testObj = [NSOrderedSet orderedSetWithObjects: objs count: 2]; [testObjs addObject: testObj]; PASS(testObj != nil && [testObj count] == 2, "can create an ordered set with multi element"); id objs1[] = {@"Hello", @"Hello"}; testObj = [NSOrderedSet orderedSetWithObjects: objs1 count: 2]; [testObjs addObject: testObj]; PASS(testObj != nil && [testObj count] == 1, "cannot create an ordered set with multiple like elements"); NSMutableArray *arr = [NSMutableArray array]; [arr addObject: @"Hello"]; [arr addObject: @"World"]; testObj = [NSOrderedSet orderedSetWithArray: arr]; [testObjs addObject: testObj]; PASS(testObj != nil && [testObj count] == 2, "Is able to initialize with array"); id objs3[] = {@"Hello"}; id objc4[] = {@"World"}; testObj = [NSOrderedSet orderedSetWithObjects: objs3 count: 1]; [testObjs addObject: testObj]; testObj2 = [NSOrderedSet orderedSetWithObjects: objc4 count: 1]; [testObjs addObject: testObj2]; BOOL result = [testObj intersectsOrderedSet: testObj2]; PASS(result == NO, "Sets do not intersect!"); id objs5[] = {@"Hello"}; id objc6[] = {@"Hello"}; testObj = [NSOrderedSet orderedSetWithObjects: objs5 count: 1]; [testObjs addObject: testObj]; testObj2 = [NSOrderedSet orderedSetWithObjects: objc6 count: 1]; [testObjs addObject: testObj2]; BOOL result1 = [testObj intersectsOrderedSet: testObj2]; PASS(result1 == YES, "Sets do intersect!"); id o1 = @"Hello"; id o2 = @"World"; mutableTest1 = [NSMutableOrderedSet orderedSet]; [mutableTest1 addObject: o1]; [testObjs addObject: mutableTest1]; mutableTest2 = [NSMutableOrderedSet orderedSet]; [mutableTest2 addObject: o2]; [testObjs addObject: mutableTest2]; [mutableTest1 unionOrderedSet: mutableTest2]; PASS(mutableTest1 != nil && mutableTest2 != nil && [mutableTest1 count] == 2, "mutableSets union properly"); id o3 = @"Hello"; id o4 = @"World"; mutableTest1 = [NSMutableOrderedSet orderedSet]; [mutableTest1 addObject: o3]; [testObjs addObject: mutableTest1]; mutableTest2 = [NSMutableOrderedSet orderedSet]; [mutableTest2 addObject: o4]; [testObjs addObject: mutableTest2]; [mutableTest1 intersectOrderedSet: mutableTest2]; PASS(mutableTest1 != nil && mutableTest2 != nil && [mutableTest1 count] == 0, "mutableSets do not intersect"); id o5 = @"Hello"; id o6 = @"Hello"; mutableTest1 = [NSMutableOrderedSet orderedSet]; [mutableTest1 addObject: o5]; [testObjs addObject: mutableTest1]; mutableTest2 = [NSMutableOrderedSet orderedSet]; [mutableTest2 addObject: o6]; [testObjs addObject: mutableTest2]; [mutableTest1 intersectOrderedSet: mutableTest2]; PASS(mutableTest1 != nil && mutableTest2 != nil && [mutableTest1 count] == 1, "mutableSets do intersect"); id o7 = @"Hello"; id o8 = @"World"; mutableTest1 = [NSMutableOrderedSet orderedSet]; [mutableTest1 addObject: o7]; [mutableTest1 addObject: o8]; [testObjs addObject: mutableTest1]; mutableTest2 = [NSMutableOrderedSet orderedSet]; [mutableTest2 addObject: o7]; [testObjs addObject: mutableTest2]; BOOL isSubset = [mutableTest2 isSubsetOfOrderedSet: mutableTest1]; PASS(isSubset, "mutableTest2 is subset of mutableTest1"); testSet = [NSMutableSet set]; [testSet addObject: o7]; [testSet addObject: o8]; isSubset = [mutableTest2 isSubsetOfSet: testSet]; PASS(isSubset, "mutableTest2 is subset of testSet"); id o9 = @"Hello"; id o10 = @"World"; id o11 = @"Ready"; mutableTest1 = [NSMutableOrderedSet orderedSet]; [mutableTest1 addObject: o9]; [testObjs addObject: mutableTest1]; mutableTest2 = [NSMutableOrderedSet orderedSet]; [mutableTest2 addObject: o10]; [mutableTest2 addObject: o9]; [testObjs addObject: mutableTest2]; isSubset = [mutableTest2 isSubsetOfOrderedSet: mutableTest1]; PASS(isSubset == NO, "mutableTest2 is not subset of mutableTest1"); testSet = [NSMutableSet set]; [testSet addObject: o9]; isSubset = [mutableTest2 isSubsetOfSet: testSet]; PASS(isSubset == NO, "mutableTest2 is not subset of testSet"); o9 = @"Hello"; o10 = @"World"; o11 = @"Ready"; id o12 = @"ToGo"; mutableTest1 = [NSMutableOrderedSet orderedSet]; [mutableTest1 addObject: o9]; [mutableTest1 addObject: o10]; [mutableTest1 addObject: o12]; [mutableTest1 addObject: o11]; [testObjs addObject: mutableTest1]; mutableTest2 = [NSMutableOrderedSet orderedSet]; [mutableTest2 addObject: o9]; [mutableTest2 addObject: o10]; [testObjs addObject: mutableTest2]; isSubset = [mutableTest2 isSubsetOfOrderedSet: mutableTest1]; PASS(isSubset, "mutableTest2 is subset of mutableTest1"); testSet = [NSMutableSet set]; [testSet addObject: o9]; [testSet addObject: o10]; [testSet addObject: o12]; [testSet addObject: o11]; isSubset = [mutableTest2 isSubsetOfSet: testSet]; PASS(isSubset, "mutableTest2 is subset of testSet"); o9 = @"Hello"; o10 = @"World"; o11 = @"Ready"; o12 = @"ToGo"; mutableTest1 = [NSMutableOrderedSet orderedSet]; [mutableTest1 addObject: o9]; [mutableTest1 addObject: o10]; [mutableTest1 addObject: o12]; [mutableTest1 addObject: o11]; [testObjs addObject: mutableTest1]; PASS([mutableTest1 isEqual: mutableTest1], "mutableTest1 is equal to itself"); o9 = @"Hello"; o10 = @"World"; o11 = @"Ready"; o12 = @"ToGo"; NSMutableOrderedSet *mutableTest3 = [NSMutableOrderedSet orderedSet]; [mutableTest3 addObject: o9]; [mutableTest3 addObject: o10]; [mutableTest3 addObject: o12]; [mutableTest3 addObject: o11]; [mutableTest3 insertObject: @"Hello" atIndex: 2]; [testObjs addObject: mutableTest3]; PASS([mutableTest3 isEqual: mutableTest1] == YES, "Insert at index does not replace existing object"); NSMutableOrderedSet *mutableTest4 = [NSMutableOrderedSet orderedSet]; [mutableTest4 addObject: @"Now"]; [mutableTest4 addObject: @"is"]; [mutableTest4 addObject: @"the"]; [mutableTest4 addObject: @"time"]; [mutableTest4 addObject: @"for"]; [mutableTest4 addObject: @"all"]; [mutableTest4 addObject: @"Good"]; [mutableTest4 addObject: @"men"]; [mutableTest4 addObject: @"to"]; [mutableTest4 addObject: @"come"]; [mutableTest4 addObject: @"to the aid"]; [mutableTest4 addObject: @"of their country"]; [mutableTest4 moveObjectsAtIndexes: [NSIndexSet indexSetWithIndex: 3] toIndex: 10]; [testObjs addObject: mutableTest4]; PASS([[mutableTest4 objectAtIndex: 10] isEqual: @"time"] == YES, "Move to index moves to correct index"); NSMutableOrderedSet *mutableTest5 = [NSMutableOrderedSet orderedSet]; [mutableTest5 addObject: @"Now"]; [mutableTest5 addObject: @"is"]; [mutableTest5 addObject: @"the"]; [mutableTest5 exchangeObjectAtIndex: 0 withObjectAtIndex: 2]; [testObjs addObject: mutableTest5]; PASS([[mutableTest5 objectAtIndex: 0] isEqual: @"the"] == YES && [[mutableTest5 objectAtIndex: 2] isEqual: @"Now"] == YES, "Exchanges indexes properly"); //NSLog(@"RESULT: %@",mutableTest4); mutableTest4 = [NSMutableOrderedSet orderedSet]; [mutableTest4 addObject: @"Now"]; [mutableTest4 addObject: @"is"]; [mutableTest4 addObject: @"the"]; [mutableTest4 addObject: @"time"]; [mutableTest4 addObject: @"for"]; [mutableTest4 addObject: @"all"]; [mutableTest4 addObject: @"Good"]; [mutableTest4 addObject: @"men"]; [mutableTest4 addObject: @"to"]; [mutableTest4 addObject: @"come to"]; [mutableTest4 addObject: @"the aid"]; [mutableTest4 addObject: @"of their country"]; NSMutableIndexSet *is = [NSMutableIndexSet indexSetWithIndex: 6]; [is addIndex: 9]; NSMutableArray *array = [NSMutableArray arrayWithObjects: @"Horrible", @"Flee From", nil]; [mutableTest4 replaceObjectsAtIndexes: is withObjects: array]; [testObjs addObject: mutableTest4]; PASS([[mutableTest4 objectAtIndex: 9] isEqual: @"Flee From"] == YES, "replaceObjectsAtIndexes: adds to correct indexes"); id uobj = [NSKeyedUnarchiver unarchiveObjectWithData: data]; PASS((uobj != nil && [uobj isKindOfClass: [NSMutableOrderedSet class]] && [uobj containsObject: @"Now"]), "Object unarchives correctly from macOS archive") test_NSObject(@"NSOrderedSet", testObjs); test_NSCoding(testObjs); test_NSCopying(@"NSOrderedSet", @"NSMutableOrderedSet", testObjs, YES, NO); test_NSMutableCopying(@"NSOrderedSet", @"NSMutableOrderedSet", testObjs); END_SET("NSOrderedSet base") return 0; } gnustep-base-1.29.0/Tests/base/NSOrderedSet/blocks.m000066400000000000000000000063011435650067400221620ustar00rootroot00000000000000#import "Testing.h" #import #import #import #import #import #import static NSUInteger fooCount = 0; static NSUInteger lastIndex = NSNotFound; int main() { START_SET("NSOrderedSet Blocks") # ifndef __has_feature # define __has_feature(x) 0 # endif # if __has_feature(blocks) NSAutoreleasePool *arp = [NSAutoreleasePool new]; // Code for test here... NSMutableOrderedSet *mutableTest4 = [NSMutableOrderedSet orderedSet]; [mutableTest4 addObject:@"Now"]; [mutableTest4 addObject:@"is"]; [mutableTest4 addObject:@"the"]; [mutableTest4 addObject:@"time"]; [mutableTest4 addObject:@"for"]; [mutableTest4 addObject:@"all"]; [mutableTest4 addObject:@"Good"]; [mutableTest4 addObject:@"men"]; [mutableTest4 addObject:@"to"]; [mutableTest4 addObject:@"come to"]; [mutableTest4 addObject:@"the aid"]; [mutableTest4 addObject:@"of their country"]; NSMutableIndexSet *is = [NSMutableIndexSet indexSetWithIndex:6]; [is addIndex: 9]; NSMutableArray *array = [NSMutableArray arrayWithObjects:@"Horrible", @"Flee From", nil]; [mutableTest4 replaceObjectsAtIndexes: is withObjects: array]; NSUInteger index = [mutableTest4 indexOfObjectPassingTest:^BOOL(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { return [obj isEqualToString:@"Horrible"]; }]; // NSLog(@"Index = %d", index); PASS(index == 6, "Found correct index using indexOfObjectPassingTest:"); NSIndexSet *indexes = [mutableTest4 indexesOfObjectsPassingTest: ^BOOL(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { return [obj isEqualToString:@"Horrible"] || [obj isEqualToString: @"Flee From"]; }]; PASS([indexes containsIndex: 6] && [indexes containsIndex: 9], "Returns correct indexes"); indexes = [mutableTest4 indexesOfObjectsWithOptions:0 passingTest:^BOOL(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { return [obj isEqualToString:@"Horrible"] || [obj isEqualToString:@"Flee From"]; }]; NSLog(@"indexes = %@",indexes); PASS([indexes containsIndex:6] && [indexes containsIndex:9], "indexesOfObjectsWithOptions:passingTest: returns correct indexes"); index = [mutableTest4 indexOfObjectAtIndexes:[NSIndexSet indexSetWithIndex: 6] options:0 passingTest:^BOOL(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { return [obj isEqualToString:@"Horrible"]; }]; PASS(index == 6, "indexOfObjectAtIndexes:... Returns correct index"); NSMutableIndexSet *iset = [NSMutableIndexSet indexSetWithIndex: 6]; [iset addIndex: 9]; indexes = [mutableTest4 indexesOfObjectsAtIndexes: iset options:0 passingTest:^BOOL(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { return [obj isEqualToString:@"Horrible"] || [obj isEqualToString:@"Flee From"]; }]; NSLog(@"indexes = %@",indexes); PASS([indexes containsIndex:6] && [indexes containsIndex:9], "indexesOfObjectsAtIndexes... returns correct indexes"); # else SKIP("No Blocks support in the compiler.") # endif END_SET("NSOrderedSet Blocks") return 0; } gnustep-base-1.29.0/Tests/base/NSPersonNameComponentsFormatter/000077500000000000000000000000001435650067400244705ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSPersonNameComponentsFormatter/TestInfo000066400000000000000000000000001435650067400261340ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSPersonNameComponentsFormatter/basic.m000066400000000000000000000045061435650067400257340ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import int main() { START_SET("NSPersonNameComponentsFormatter base"); NSPersonNameComponents *pnc = [[NSPersonNameComponents alloc] init]; [pnc setGivenName: @"Gregory"]; [pnc setMiddleName: @"John"]; [pnc setFamilyName: @"Casamento"]; [pnc setNameSuffix: @"PhD"]; [pnc setNamePrefix: @"Dr."]; NSPersonNameComponentsFormatter *fmt = [[NSPersonNameComponentsFormatter alloc] init]; NSPersonNameComponents *pnc2 = [fmt personNameComponentsFromString: @"Dr. Gregory John Casamento PhD"]; PASS([[pnc givenName] isEqualToString: [pnc2 givenName]], "First name matches"); PASS([[pnc middleName] isEqualToString: [pnc2 middleName]], "Middle name matches"); PASS([[pnc familyName] isEqualToString: [pnc2 familyName]], "Family name matches"); PASS([[pnc nameSuffix] isEqualToString: [pnc2 nameSuffix]], "Suffix name matches"); PASS([[pnc namePrefix] isEqualToString: [pnc2 namePrefix]], "Prefix name matches"); fmt = [[NSPersonNameComponentsFormatter alloc] init]; pnc2 = [fmt personNameComponentsFromString: @"Gregory John Casamento PhD"]; PASS([[pnc givenName] isEqualToString: [pnc2 givenName]], "First name matches"); PASS([[pnc middleName] isEqualToString: [pnc2 middleName]], "Middle name matches"); PASS([[pnc familyName] isEqualToString: [pnc2 familyName]], "Family name matches"); PASS([[pnc nameSuffix] isEqualToString: [pnc2 nameSuffix]], "Suffix name matches"); fmt = [[NSPersonNameComponentsFormatter alloc] init]; pnc2 = [fmt personNameComponentsFromString: @"Gregory John Casamento"]; PASS([[pnc givenName] isEqualToString: [pnc2 givenName]], "First name matches"); PASS([[pnc middleName] isEqualToString: [pnc2 middleName]], "Middle name matches"); PASS([[pnc familyName] isEqualToString: [pnc2 familyName]], "Family name matches"); END_SET("NSPersonNameComponentsFormatter base"); return 0; } gnustep-base-1.29.0/Tests/base/NSPointerArray/000077500000000000000000000000001435650067400211065ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSPointerArray/TestInfo000066400000000000000000000000001435650067400225520ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSPointerArray/basic.m000066400000000000000000000011331435650067400223430ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSPointerArray *testObj; testObj = [[NSPointerArray new] autorelease]; [testObj addPointer: @"hello"]; test_alloc(@"NSPointerArray"); test_NSObject(@"NSPointerArray", [NSArray arrayWithObject: testObj]); test_NSCopying(@"NSPointerArray",@"NSPointerArray", [NSArray arrayWithObject: testObj], NO, YES); // test_NSCoding([NSArray arrayWithObject: testObj]); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSPointerArray/create.m000066400000000000000000000024121435650067400225260ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSMutableString *ms; NSString *val1, *val2, *val3; NSPointerArray *obj, *old; NSUInteger rc; id vals[3]; val1 = @"Hello"; val2 = @"Goodbye"; val3 = @"Testing"; vals[0] = val1; vals[1] = val2; vals[2] = val3; obj = [[NSPointerArray new] autorelease]; PASS(obj != nil && [obj isKindOfClass:[NSPointerArray class]] && [obj count] == 0, "+new creates an empty pointer array"); [obj addPointer: (void*)@"hello"]; PASS([obj count] == 1, "+addPointer: increments count"); [obj addPointer: nil]; PASS([obj count] == 2, "+addPointer: works with nil"); [obj insertPointer: (void*)vals[0] atIndex: 0]; [obj insertPointer: (void*)vals[1] atIndex: 0]; [obj insertPointer: (void*)vals[2] atIndex: 0]; PASS([obj count] == 5 && [obj pointerAtIndex: 2] == (void*)vals[0], "+insertPointer:atIndex: works"); obj = [NSPointerArray pointerArrayWithWeakObjects]; ms = [@"hello" mutableCopy]; rc = [ms retainCount]; [obj addPointer: ms]; PASS(rc == [ms retainCount], "array with weak references doesn't retain"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSPointerArray/general.m000066400000000000000000000002621435650067400227010ustar00rootroot00000000000000#import #import "ObjectTesting.h" int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSPredicate/000077500000000000000000000000001435650067400203675ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSPredicate/TestInfo000066400000000000000000000000001435650067400220330ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSPredicate/basic.m000066400000000000000000000234341435650067400216340ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import #import #import #import #import #import void testKVC(NSDictionary *dict) { PASS([@"A Title" isEqual: [dict valueForKey: @"title"]], "valueForKeyPath: with string"); PASS([@"A Title" isEqual: [dict valueForKeyPath: @"title"]], "valueForKeyPath: with string"); PASS([@"John" isEqual: [dict valueForKeyPath: @"Record1.Name"]], "valueForKeyPath: with string"); PASS(30 == [[dict valueForKeyPath: @"Record2.Age"] intValue], "valueForKeyPath: with int"); } void testContains(NSDictionary *dict) { NSPredicate *p; p = [NSPredicate predicateWithFormat: @"%@ CONTAINS %@", @"AABBBAA", @"BBB"]; PASS([p evaluateWithObject: dict], "%%@ CONTAINS %%@"); p = [NSPredicate predicateWithFormat: @"%@ IN %@", @"BBB", @"AABBBAA"]; PASS([p evaluateWithObject: dict], "%%@ IN %%@"); } void testString(NSDictionary *dict) { NSPredicate *p; p = [NSPredicate predicateWithFormat: @"%K == %@", @"Record1.Name", @"John"]; PASS([p evaluateWithObject: dict], "%%K == %%@"); p = [NSPredicate predicateWithFormat: @"%K MATCHES[c] %@", @"Record1.Name", @"john"]; PASS([p evaluateWithObject: dict], "%%K MATCHES[c] %%@"); p = [NSPredicate predicateWithFormat: @"%K BEGINSWITH %@", @"Record1.Name", @"Jo"]; PASS([p evaluateWithObject: dict], "%%K BEGINSWITH %%@"); p = [NSPredicate predicateWithFormat: @"(%K == %@) AND (%K == %@)", @"Record1.Name", @"John", @"Record2.Name", @"Mary"]; PASS([p evaluateWithObject: dict], "(%%K == %%@) AND (%%K == %%@)"); NSMutableArray *strings = [NSMutableArray arrayWithObjects: @"a", @"aa", @"aaa", @"aaaa", nil]; NSArray *expect = [NSMutableArray arrayWithObjects: @"aaa", @"aaaa", nil]; p = [NSPredicate predicateWithFormat: @"self beginswith 'aaa'"]; [strings filterUsingPredicate: p]; PASS_EQUAL(strings, expect, "filter using BEGINSWITH") } void testInteger(NSDictionary *dict) { NSPredicate *p; p = [NSPredicate predicateWithFormat: @"%K == %d", @"Record1.Age", 34]; PASS([p evaluateWithObject: dict], "%%K == %%d"); p = [NSPredicate predicateWithFormat: @"%K = %@", @"Record1.Age", [NSNumber numberWithInt: 34]]; PASS([p evaluateWithObject: dict], "%%K = %%@"); p = [NSPredicate predicateWithFormat: @"%K == %@", @"Record1.Age", [NSNumber numberWithInt: 34]]; PASS([p evaluateWithObject: dict], "%%K == %%@"); p = [NSPredicate predicateWithFormat: @"%K < %d", @"Record1.Age", 40]; PASS([p evaluateWithObject: dict], "%%K < %%d"); p = [NSPredicate predicateWithFormat: @"%K < %@", @"Record1.Age", [NSNumber numberWithInt: 40]]; PASS([p evaluateWithObject: dict], "%%K < %%@"); p = [NSPredicate predicateWithFormat: @"%K <= %@", @"Record1.Age", [NSNumber numberWithInt: 40]]; PASS([p evaluateWithObject: dict], "%%K <= %%@"); p = [NSPredicate predicateWithFormat: @"%K <= %@", @"Record1.Age", [NSNumber numberWithInt: 34]]; PASS([p evaluateWithObject: dict], "%%K <= %%@"); p = [NSPredicate predicateWithFormat: @"%K > %@", @"Record1.Age", [NSNumber numberWithInt: 20]]; PASS([p evaluateWithObject: dict], "%%K > %%@"); p = [NSPredicate predicateWithFormat: @"%K >= %@", @"Record1.Age", [NSNumber numberWithInt: 34]]; PASS([p evaluateWithObject: dict], "%%K >= %%@"); p = [NSPredicate predicateWithFormat: @"%K >= %@", @"Record1.Age", [NSNumber numberWithInt: 20]]; PASS([p evaluateWithObject: dict], "%%K >= %%@"); p = [NSPredicate predicateWithFormat: @"%K != %@", @"Record1.Age", [NSNumber numberWithInt: 20]]; PASS([p evaluateWithObject: dict], "%%K != %%@"); p = [NSPredicate predicateWithFormat: @"%K <> %@", @"Record1.Age", [NSNumber numberWithInt: 20]]; PASS([p evaluateWithObject: dict], "%%K <> %%@"); p = [NSPredicate predicateWithFormat: @"%K BETWEEN %@", @"Record1.Age", [NSArray arrayWithObjects: [NSNumber numberWithInt: 20], [NSNumber numberWithInt: 40], nil]]; PASS([p evaluateWithObject: dict], "%%K BETWEEN %%@"); p = [NSPredicate predicateWithFormat: @"(%K == %d) OR (%K == %d)", @"Record1.Age", 34, @"Record2.Age", 34]; PASS([p evaluateWithObject: dict], "(%%K == %%d) OR (%%K == %%d)"); } void testFloat(NSDictionary *dict) { NSPredicate *p; p = [NSPredicate predicateWithFormat: @"%K < %f", @"Record1.Age", 40.5]; PASS([p evaluateWithObject: dict], "%%K < %%f"); p = [NSPredicate predicateWithFormat: @"%f > %K", 40.5, @"Record1.Age"]; PASS([p evaluateWithObject: dict], "%%f > %%K"); } void testAttregate(NSDictionary *dict) { NSPredicate *p; p = [NSPredicate predicateWithFormat: @"%@ IN %K", @"Kid1", @"Record1.Children"]; PASS([p evaluateWithObject: dict], "%%@ IN %%K"); p = [NSPredicate predicateWithFormat: @"Any %K == %@", @"Record2.Children", @"Girl1"]; PASS([p evaluateWithObject: dict], "Any %%K == %%@"); } void testBlock(NSDictionary* dict) { START_SET("Block predicates"); # if __has_feature(blocks) NSPredicate *p = nil; NSPredicate *p2 = nil; NSDictionary *v = [NSDictionary dictionaryWithObjectsAndKeys: @"Record2", @"Key", nil]; p = [NSPredicate predicateWithBlock: ^BOOL(id obj, NSDictionary *bindings) { NSString *key = [bindings objectForKey: @"Key"]; if (nil == key) { key = @"Record1"; } NSString *value = [[obj objectForKey: key] objectForKey: @"Name"]; return [value isEqualToString: @"John"]; }]; PASS([p evaluateWithObject: dict], "BLOCKPREDICATE() without bindings"); PASS(![p evaluateWithObject: dict substitutionVariables: v], "BLOCKPREDICATE() with bound variables"); p2 = [p predicateWithSubstitutionVariables: [NSDictionary dictionaryWithObjectsAndKeys: @"Record2", @"Key", nil]]; PASS(p2 != nil, "BLOCKPREDICATE() instantiated from template"); # ifdef APPLE /* The next test is known to be fail on OS X, so mark it as hopeful there. * cf. rdar://25059737 */ testHopeful = YES; # endif PASS(![p2 evaluateWithObject: dict], "BLOCKPREDICATE() with bound variables in separate object"); # ifdef APPLE testHopeful = NO; # endif # else SKIP("No blocks support in the compiler."); # endif END_SET("Block predicates"); } int main() { NSArray *filtered; NSArray *pitches; NSArray *expect; NSArray *a; NSMutableDictionary *dict; NSPredicate *p; NSDictionary *d; START_SET("basic") dict = [[NSMutableDictionary alloc] init]; [dict setObject: @"A Title" forKey: @"title"]; d = [NSDictionary dictionaryWithObjectsAndKeys: @"John", @"Name", [NSNumber numberWithInt: 34], @"Age", [NSArray arrayWithObjects: @"Kid1", @"Kid2", nil], @"Children", nil]; [dict setObject: d forKey: @"Record1"]; d = [NSDictionary dictionaryWithObjectsAndKeys: @"Mary", @"Name", [NSNumber numberWithInt: 30], @"Age", [NSArray arrayWithObjects: @"Kid1", @"Girl1", nil], @"Children", nil]; [dict setObject: d forKey: @"Record2"]; testKVC(dict); testContains(dict); testString(dict); testInteger(dict); testFloat(dict); testAttregate(dict); testBlock(dict); [dict release]; pitches = [NSArray arrayWithObjects: @"Do", @"Re", @"Mi", @"Fa", @"So", @"La", nil]; expect = [NSArray arrayWithObjects: @"Do", nil]; filtered = [pitches filteredArrayUsingPredicate: [NSPredicate predicateWithFormat: @"SELF == 'Do'"]]; PASS([filtered isEqual: expect], "filter with SELF"); filtered = [pitches filteredArrayUsingPredicate: [NSPredicate predicateWithFormat: @"description == 'Do'"]]; PASS([filtered isEqual: expect], "filter with description"); filtered = [pitches filteredArrayUsingPredicate: [NSPredicate predicateWithFormat: @"SELF == '%@'", @"Do"]]; PASS([filtered isEqual: [NSArray array]], "filter with format"); PASS([NSExpression expressionForEvaluatedObject] == [NSExpression expressionForEvaluatedObject], "expressionForEvaluatedObject is unique"); p = [NSPredicate predicateWithFormat: @"SELF == 'aaa'"]; PASS([p evaluateWithObject: @"aaa"], "SELF equality works"); d = [NSDictionary dictionaryWithObjectsAndKeys: @"2", @"foo", nil]; p = [NSPredicate predicateWithFormat: @"SELF.foo <= 2"]; PASS([p evaluateWithObject: d], "SELF.foo <= 2"); p = [NSPredicate predicateWithFormat: @"%K like %@+$b+$c", @"$single", @"b\""]; PASS_EQUAL([p predicateFormat], @"$single LIKE (\"b\\\"\" + $b) + $c", "predicate created with format has the format is preserved"); #if 0 if ([p respondsToSelector: @selector(subpredicates)]) NSLog(@"subpredicates=%@", [(NSCompoundPredicate *)p subpredicates]); if ([p respondsToSelector: @selector(leftExpression)]) NSLog(@"left=%@", [(NSComparisonPredicate *)p leftExpression]); if ([p respondsToSelector: @selector(rightExpression)]) NSLog(@"right=%@", [(NSComparisonPredicate *)p rightExpression]); #endif p = [p predicateWithSubstitutionVariables: [NSDictionary dictionaryWithObjectsAndKeys: @"val_for_single_string", @"single", // why %K does not make a variable @"val_for_$b", @"b", @"val_for_$c", @"c", nil]]; PASS_EQUAL([p predicateFormat], @"$single LIKE (\"b\\\"\" + \"val_for_$b\") + \"val_for_$c\"", "Predicate created by substitution has the expected format"); a = [NSArray arrayWithObjects: [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt: 1], @"a", nil], [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt: 2], @"a", nil], nil]; p = [NSPredicate predicateWithFormat: @"sum(a) == 3"]; PASS([p evaluateWithObject: a], "aggregate sum works"); p = [NSPredicate predicateWithFormat: @"self IN %@", [NSArray arrayWithObject:@"yes"]]; a = [[NSArray arrayWithObjects:@"yes", @"no", nil] filteredArrayUsingPredicate: p]; PASS_EQUAL([a description], @"(yes)", "predicate created with format can filter an array") END_SET("basic") return 0; } gnustep-base-1.29.0/Tests/base/NSProcessInfo/000077500000000000000000000000001435650067400207215ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSProcessInfo/TestInfo000066400000000000000000000000001435650067400223650ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSProcessInfo/basic.m000066400000000000000000000005601435650067400221610ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSProcessInfo *pi; test_alloc(@"NSProcessInfo"); pi = [NSProcessInfo processInfo]; test_NSObject(@"NSProcessInfo", [NSArray arrayWithObject:pi]); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSProcessInfo/general.m000066400000000000000000000032251435650067400225160ustar00rootroot00000000000000#import "Testing.h" #import #import #import #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSProcessInfo *info = [NSProcessInfo processInfo]; id obj; unsigned int val; PASS(info != nil, "NSProcessInfo understands [+processInfo]"); obj = [info arguments]; PASS((info != nil && [obj isKindOfClass:[NSArray class]] && [obj count] != 0), "NSProcessInfo has arguments"); obj = [info environment]; PASS((obj != nil && [obj isKindOfClass:[NSDictionary class]]), "NSProcessInfo has environment"); obj = [info processName]; PASS((obj != nil && [obj isKindOfClass:[NSString class]] && [obj length] > 0), "-processName is non-nil"); obj = [info globallyUniqueString]; PASS((obj != nil && [obj isKindOfClass:[NSString class]] && [obj length] > 0), "-globallyUniqueString works"); obj = [info operatingSystemName]; PASS((obj != nil && [obj isKindOfClass:[NSString class]] && [obj length] > 0), "-operatingSystemName works"); NSLog(@"operatingSystemName %@", obj); val = [info operatingSystem]; PASS(val != 0, "-operatingSystem works"); testHopeful = YES; val = [info systemUptime]; NSLog(@"systemUptime %lu", val); PASS(val != 0, "-systemUptime works"); testHopeful = NO; obj = [info hostName]; PASS((obj != nil && [obj isKindOfClass:[NSString class]] && [obj length] > 0), "-hostName works"); NSLog(@"hostName %@", obj); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSProgress/000077500000000000000000000000001435650067400202735ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSProgress/TestInfo000066400000000000000000000000001435650067400217370ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSProgress/basic.m000066400000000000000000000041341435650067400215340ustar00rootroot00000000000000#import #import #import #import "ObjectTesting.h" int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSMutableDictionary *dict = [NSMutableDictionary dictionary]; [dict setObject:@"value" forKey:@"key"]; NSProgress *progress = [[NSProgress alloc] initWithParent: nil userInfo: dict]; PASS(progress != nil, "[NSProgress initWithParent:userInfo:] returns instance"); PASS_EQUAL([progress userInfo], dict, "[NSProgress userInfo] returns correct user info"); [progress setUserInfoObject:@"new value" forKey:@"key"]; PASS_EQUAL([[progress userInfo] objectForKey:@"key"], @"new value", "[NSProgress setUserInfoObject:forKey:] updates user info"); progress = [NSProgress discreteProgressWithTotalUnitCount:100]; PASS(progress != nil, "[NSProgress discreteProgressWithTotalUnitCount:] returns instance"); progress = [NSProgress progressWithTotalUnitCount:100]; PASS(progress != nil, "[NSProgress progressWithTotalUnitCount:] returns instance"); progress = [NSProgress progressWithTotalUnitCount:100 parent:progress pendingUnitCount:50]; PASS(progress != nil, "[NSProgress progressWithTotalUnitCount:] returns instance"); [progress becomeCurrentWithPendingUnitCount:50]; NSProgress *currentProgress = [NSProgress currentProgress]; PASS(currentProgress == progress, "Correct progress object associated with current thread"); NSProgress *new_progress = [NSProgress progressWithTotalUnitCount:100 parent:progress pendingUnitCount:50]; [new_progress addChild:[[NSProgress alloc] initWithParent: nil userInfo: nil] withPendingUnitCount:50]; [currentProgress resignCurrent]; PASS([NSProgress currentProgress] == nil, "Current progress is nil after resign current"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSProxy/000077500000000000000000000000001435650067400176105ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSProxy/TestInfo000066400000000000000000000000001435650067400212540ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSProxy/basic.m000066400000000000000000000024441435650067400210530ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import #if __has_include() #include #endif int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; char *prefix = "Class 'NSProxy'"; Class theClass = Nil; id obj0; id obj1; NSZone *testZone = NSCreateZone(1024,1024,1); theClass = [NSProxy class]; PASS(theClass != Nil, "%s exists",prefix); obj0 = [NSProxy alloc]; PASS(obj0 != nil, "%s has working alloc",prefix); PASS_EXCEPTION([obj0 isKindOfClass:theClass];, NSInvalidArgumentException, "NSProxy -isKindOfClass raises exception"); PASS_EXCEPTION([obj0 isMemberOfClass:theClass];, NSInvalidArgumentException, "NSProxy -isKindOfClass raises exception"); obj1 = [NSProxy allocWithZone:testZone]; PASS(obj1 != nil, "%s has working allocWithZone:",prefix); #ifndef OBJC_CAP_ARC PASS(NSZoneFromPointer(obj1) == testZone, "%s uses zone for alloc",prefix); PASS([obj1 zone] == testZone, "%s -zone works",prefix); #endif PASS([obj1 hash] != 0, "%s has working -hash",prefix); PASS([obj1 isEqual:obj1] == YES, "%s has working -isEqual:",prefix); PASS([obj1 class] == theClass, "%s has working -class",prefix); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSProxy/test00.m000066400000000000000000000073261435650067400211150ustar00rootroot00000000000000#import "Testing.h" #import #import #import #import @interface MyString : NSString { id _remote; } @end @interface MyProxy : NSProxy { id _remote; } @end @implementation MyString - (id) init { _remote = nil; return self; } - (void) dealloc { [_remote release]; DEALLOC } - (unichar) characterAtIndex: (NSUInteger)i { return [_remote characterAtIndex: i]; } - (NSUInteger) length { return [_remote length]; } - (void) setRemote:(id)remote { ASSIGN(_remote,remote); } - (id) remote { return _remote; } @end @implementation MyProxy - (id) init { _remote = nil; return self; } - (void) dealloc { [_remote release]; DEALLOC } - (NSUInteger) hash { if (_remote) return [_remote hash]; else return [super hash]; } - (BOOL) isEqual: (id)other { if (_remote) return [_remote isEqual: other]; else return [super isEqual: other]; } - (void) setRemote:(id)remote { ASSIGN(_remote,remote); } - (NSString *) description { return [_remote description]; } - (id) remote { return _remote; } - (NSMethodSignature *) methodSignatureForSelector:(SEL)aSelector { NSMethodSignature *sig = [_remote methodSignatureForSelector:aSelector]; if (sig == nil) sig = [self methodSignatureForSelector:aSelector]; return sig; } - (void) forwardInvocation:(NSInvocation *)inv { [inv setTarget:_remote]; [inv invoke]; } @end int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; char *prefix = "The class 'NSProxy' "; Class theClass = NSClassFromString(@"NSProxy"); id obj = nil; id rem = @"Remote"; id sub = nil; PASS(theClass == [NSProxy class], "uses +class to return self"); PASS([[NSProxy alloc] isProxy] == YES, "%s implements -isProxy to return YES",prefix); PASS([[NSProxy alloc] description] != nil, "%s implements -description",prefix); obj = [[MyProxy alloc] init]; PASS(obj != nil, "Can create a MyProxy instance"); PASS([obj isEqual: obj], "proxy isEqual: to self without remote"); [obj setRemote: rem]; PASS([obj remote] == rem, "Can set the remote object for the proxy"); sub = [[MyString alloc] init]; PASS(sub != nil, "Can create a MyString instance"); [sub setRemote: rem]; PASS([sub remote] == rem, "Can set the remote object for the subclass"); PASS([obj length] == [rem length], "Get the length of the remote object"); PASS([sub length] == [rem length], "Get the length of the subclass object"); PASS([obj isEqual: rem], "proxy isEqual: to remote"); PASS([obj isEqual: sub], "proxy isEqual: to subclass"); PASS([sub isEqual: rem], "subclass isEqual: to remote"); PASS([sub isEqual: obj], "subclass isEqual: to proxy"); PASS([rem isEqual: obj], "remote isEqual: to proxy"); PASS([rem isEqual: sub], "remote isEqual: to subclass"); PASS([obj isEqualToString: rem], "proxy isEqualToString: to remote"); PASS([obj isEqualToString: sub], "proxy isEqualToString: to subclass"); PASS([sub isEqualToString: rem], "subclass isEqualToString: to remote"); PASS([sub isEqualToString: obj], "subclass isEqualToString: to proxy"); PASS([rem isEqualToString: obj], "remote isEqualToString: to proxy"); PASS([rem isEqualToString: sub], "remote isEqualToString: to subclass"); PASS([obj compare: rem] == NSOrderedSame, "proxy compare: remote"); PASS([obj compare: sub] == NSOrderedSame, "proxy compare: subclass"); PASS([sub compare: rem] == NSOrderedSame, "subclass compare: remote"); PASS([sub compare: obj] == NSOrderedSame, "subclass compare: proxy"); PASS([rem compare: obj] == NSOrderedSame, "remote compare: proxy"); PASS([rem compare: sub] == NSOrderedSame, "remote compare: subclass"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSProxy/test01.m000066400000000000000000000166061435650067400211170ustar00rootroot00000000000000#define _GNU_SOURCE #define _ISOC99_SOURCE #import #import "Testing.h" #include typedef struct _GSFinePoint GSFinePoint; struct _GSFinePoint { double x; double y; }; GSFinePoint GSMakeFinePoint(double x, double y) { GSFinePoint point; point.x = x; point.y = y; return point; } BOOL GSEqualFinePoints(GSFinePoint aPoint, GSFinePoint bPoint) { return ((aPoint.x == bPoint.x) && (aPoint.y == bPoint.y)) ? YES : NO; } typedef struct _GSBitField GSBitField; struct _GSBitField { unsigned int first:1; unsigned int unused:1; unsigned int second:1; }; GSBitField GSMakeBitField(BOOL first, BOOL second) { GSBitField field; field.first = first; field.second = second; return field; } BOOL GSEqualBitFields(GSBitField aField, GSBitField bField) { return ((aField.first == bField.first) && (aField.second == bField.second)) ? YES : NO; } NSDecimal GSMakeDecimal(unsigned long long mantissa, short exponent, BOOL negative) { NSDecimalNumber *d; NSDecimal dec; d = [NSDecimalNumber decimalNumberWithMantissa: mantissa exponent: exponent isNegative: negative]; dec = [d decimalValue]; return dec; } NSDecimal GSDecimalMultiply(NSDecimal left,NSDecimal right) { NSDecimal dec; NSDecimalMultiply(&dec,&left,&right,NSRoundPlain); return dec; } BOOL GSDecimalCompare(NSDecimal left,NSDecimal right) { return NSDecimalCompare(&left,&right); } @interface TypeTester : NSObject { } -(void)voidPvoid; -(signed char)sCharPsChar:(signed char)v; -(unsigned char)uCharPuChar:(unsigned char)v; -(short)shortPshort:(short)v; -(unsigned short)uShortPuShort:(unsigned short)v; -(int)intPint:(int)v; -(unsigned int)uIntPuInt:(unsigned int)v; -(long)longPlong:(long)v; -(unsigned long)uLongPuLong:(unsigned long)v; -(long long)longlongPlonglong:(long long)v; -(unsigned long long)ulonglongPulonglong:(unsigned long long)v; -(float)floatPfloat:(float)v; -(double)doublePdouble:(double)v; -(long double)longdoublePlongdouble:(long double)v; -(id)idPid:(id)v; -(NSStringEncoding)enumPenum:(NSStringEncoding)v; -(NSRange)rangePrange:(NSRange)v; -(NSPoint)pointPpoint:(NSPoint)v; -(NSDecimal)decimalPdecimal:(NSDecimal)v; -(GSFinePoint)finePointPfinePoint:(GSFinePoint)v; -(GSBitField)bitFieldPbitField:(GSBitField)v; @end @implementation TypeTester -(void)voidPvoid {} -(signed char)sCharPsChar:(signed char)v { return v - 1; } -(unsigned char)uCharPuChar:(unsigned char)v { return v - 1; } -(short)shortPshort:(short)v { return v - 1; } -(unsigned short)uShortPuShort:(unsigned short)v { return v - 1; } -(int)intPint:(int)v { return v - 1; } -(unsigned int)uIntPuInt:(unsigned int)v { return v - 1; } -(long)longPlong:(long)v { return v - 1; } -(unsigned long)uLongPuLong:(unsigned long)v { return v - 1; } -(long long)longlongPlonglong:(long long)v { return v - 1; } -(unsigned long long)ulonglongPulonglong:(unsigned long long)v { return v - 1; } -(float)floatPfloat:(float)v { return v - 1.0; } -(double)doublePdouble:(double)v { return v - 1.0; } -(long double)longdoublePlongdouble:(long double)v { return v - 1.0; } -(id)idPid:(id)v { return v == [NSProcessInfo processInfo] ? [NSNull null] : nil; } -(NSStringEncoding)enumPenum:(NSStringEncoding)v { return v == NSSymbolStringEncoding ? NSNEXTSTEPStringEncoding : 0; } -(NSRange)rangePrange:(NSRange)v { return NSMakeRange(v.length,v.location); } -(NSPoint)pointPpoint:(NSPoint)v { return NSMakePoint(v.y,v.x); } -(NSDecimal)decimalPdecimal:(NSDecimal)v { return GSDecimalMultiply(v,v); } -(GSFinePoint)finePointPfinePoint:(GSFinePoint)v { return GSMakeFinePoint((double)v.y,(double)v.x); } -(GSBitField)bitFieldPbitField:(GSBitField)v { return GSMakeBitField(v.second,v.first); } @end @interface MyProxy : NSProxy { id _remote; } @end @implementation MyProxy -(id) init { _remote = nil; return self; } - (void) dealloc { [_remote release]; DEALLOC } -(void) setRemote:(id)remote { ASSIGN(_remote,remote); } -(NSString *) description { return [_remote description]; } -(id) remote { return _remote; } - (NSMethodSignature *) methodSignatureForSelector:(SEL)aSelector { NSMethodSignature *sig = [_remote methodSignatureForSelector:aSelector]; if (sig == nil) sig = [self methodSignatureForSelector:aSelector]; return sig; } - (void) forwardInvocation:(NSInvocation *)inv { [inv setTarget:_remote]; [inv invoke]; } @end int main(int argc, char *argv[]) { NSAutoreleasePool *arp = [NSAutoreleasePool new]; id obj = nil; id rem = [TypeTester new]; GSFinePoint f0; GSFinePoint f1; NSPoint p0; NSPoint p1; NSRange r0; NSRange r1; obj = [[MyProxy alloc] init]; [obj setRemote:rem]; [obj voidPvoid]; //shoudn't raise PASS([obj sCharPsChar: 128] == 127, "Proxy signed char") PASS([obj uCharPuChar: 255] == 254, "Proxy unsigned char") PASS([obj shortPshort: SHRT_MAX] == (SHRT_MAX - 1), "Proxy signed short") PASS([obj uShortPuShort: USHRT_MAX] == (USHRT_MAX - 1), "Proxy unsigned short"); PASS([obj intPint: INT_MAX] == (INT_MAX - 1), "Proxy signed int") PASS([obj uIntPuInt: UINT_MAX] == (UINT_MAX - 1U), "Proxy unsigned int") PASS([obj longPlong: LONG_MAX] == (LONG_MAX - 1L), "Proxy signed long") PASS([obj uLongPuLong: ULONG_MAX] == (ULONG_MAX - 1UL), "Proxy unsigned long") pass([obj longlongPlonglong: LLONG_MAX] == (LLONG_MAX - 1LL), "Proxy signed long long"); PASS([obj ulonglongPulonglong: ULLONG_MAX] == (ULLONG_MAX - 1ULL), "Proxy unsigned long long") pass([obj floatPfloat: (float)3.14] == ((float)3.14 - (float)1.0), "Proxy float"); pass([obj doublePdouble: (double)3.14] == ((double)3.14 - (double)1.0), "Proxy double"); PASS([obj idPid: [NSProcessInfo processInfo]] == [NSNull null], "Proxy id") PASS([obj enumPenum: NSSymbolStringEncoding] == NSNEXTSTEPStringEncoding, "Proxy enum") r0 = [obj rangePrange: NSMakeRange(243,437)]; r1 = NSMakeRange(437,243); PASS(NSEqualRanges(r0, r1), "Proxy NSRange") p0 = [obj pointPpoint: NSMakePoint(243.0F,437.0F)]; p1 = NSMakePoint(437.0F,243.0F); PASS(NSEqualPoints(p0, p1), "Proxy NSPoint") f0 = [obj finePointPfinePoint: GSMakeFinePoint(243.0L,437.0L)]; f1 = GSMakeFinePoint(437.0L,243.0L); PASS(GSEqualFinePoints(f0, f1), "Proxy GSFinePoint") #if 0 /* These next two are disabled because they test passing structures as * parameters, a feature which has never worked and which maybe doesn't * need to. * We should enable these tests if/when the capability is ever implemented. */ BOOL ok; ok = GSDecimalCompare([obj decimalPdecimal: GSMakeDecimal(321,7,YES)], GSDecimalMultiply(GSMakeDecimal(321,7,YES),GSMakeDecimal(321,7,YES)))==0; PASS(ok, "Proxy NSDecimal") #endif #if 0 /* Disabled since this currently causes segfaults. Yet this feature is hardly ever used. Note also: file:///usr/share/doc/libffi-dev/html/Missing-Features.html#Missing-Features: libffi is missing a few features. We welcome patches to add support for these. * There is no support for calling varargs functions. This may work on some platforms, depending on how the ABI is defined, but it is not reliable. * There is no support for bit fields in structures. * The closure API is * The raw†API is undocumented. */ PASS(GSEqualBitFields([obj bitFieldPbitField: GSMakeBitField(0,1)],GSMakeBitField(1,0)), "Proxy GSBitField") #endif [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSRegularExpression/000077500000000000000000000000001435650067400221505ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSRegularExpression/TestInfo000066400000000000000000000000001435650067400236140ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSRegularExpression/basic.m000066400000000000000000000152561435650067400234200ustar00rootroot00000000000000 #import "ObjectTesting.h" #import #import #import #import #import #import #import #import #import @interface DegeneratePatternTest : NSObject { NSRegularExpression *expression; NSString* input; } @end @implementation DegeneratePatternTest - (instancetype) init { if (nil == (self = [super init])) { return nil; } expression = [[NSRegularExpression alloc] initWithPattern: @"^(([a-z])+.)+[A-Z]([a-z])+$" options: 0 error: NULL]; ASSIGN(input, @"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!"); return self; } - (void) runTest: (id)obj { NSAutoreleasePool *pool = [NSAutoreleasePool new]; [expression matchesInString: input options: 0 range: NSMakeRange(0, [input length])]; DESTROY(pool); } - (void) dealloc { DESTROY(expression); DESTROY(input); [super dealloc]; } @end int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; START_SET("NSRegularExpression") #if !(__APPLE__ || GS_USE_ICU) SKIP("NSRegularExpression not built\nThe ICU library was not available when GNUstep-base was built") #else # ifdef GNUSTEP // Ensure that a deterministic limit is set up for this process NSUserDefaults *dflts = [NSUserDefaults standardUserDefaults]; NSDictionary *domain = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt: 1500], @"GSRegularExpressionWorkLimit", nil]; [dflts setVolatileDomain: domain forName: @"GSTestDomain"]; # endif id testObj = [[NSRegularExpression alloc] initWithPattern: @"^a" options: 0 error: NULL]; test_NSObject(@"NSRegularExpression", [NSArray arrayWithObject: [[NSRegularExpression alloc] initWithPattern: @"^a" options: 0 error: NULL]]); test_NSCopying(@"NSRegularExpression",@"NSRegularExpression", [NSArray arrayWithObject:testObj],NO,NO); NSAutoreleasePool *iPool = [NSAutoreleasePool new]; { PASS_EQUAL([testObj pattern], @"^a", "Correct pattern returned"); } DESTROY(iPool); /* Regression test: We had a double-free bug on retrieving pattern, * which is also the reason for wrapping the previous one in an ARP */ PASS_RUNS([testObj pattern], "Calling -pattern twice runs"); // The pattern does not include a capture group $1, so this should return // nil; NSString *replacement = @"should be unset on return"; replacement = [testObj stringByReplacingMatchesInString: @"ab" options: 0 range: NSMakeRange(0,2) withTemplate: @"$1c"]; PASS(replacement == nil, "Replacement: returns nil on capture group error"); replacement = [testObj stringByReplacingMatchesInString: @"ab" options: 0 range: NSMakeRange(0, 2) withTemplate: @"c"]; PASS_EQUAL(replacement, @"cb", "Replacement correct"); NSString *replMut = [NSMutableString stringWithString: @"ab"]; [testObj replaceMatchesInString: replMut options: 0 range: NSMakeRange(0,2) withTemplate: @"$1c"]; PASS_EQUAL(replMut, @"ab", "Mutable replacement: Incorrect template does not change string"); replMut = [NSMutableString stringWithString: @"ab"]; [testObj replaceMatchesInString: replMut options: 0 range: NSMakeRange(0,2) withTemplate: @"c"]; PASS_EQUAL(replMut, @"cb", "Mutable replacement: Correct replacement for template"); NSTextCheckingResult *r = [testObj firstMatchInString: @"ab" options: 0 range: NSMakeRange(0,2)]; PASS(r, "Found NSTextCheckingResult"); replacement = @"should be unset on return"; replacement = [testObj replacementStringForResult: r inString: @"ab" offset: 0 template: @"$1c"]; PASS(replacement == nil, "Custom replacement: returns nil on capture group error"); replacement = nil; replacement = [testObj replacementStringForResult: r inString: @"ab" offset: 0 template: @"c"]; PASS_EQUAL(replacement, @"c", "Custom replacement: Returns correct replacement"); NSRegularExpression *testObj2 = [[NSRegularExpression alloc] initWithPattern: @"bc" options: 0 error: NULL]; r = [testObj2 firstMatchInString: @"abcdeabcde" options: 0 range: NSMakeRange(5, 5)]; PASS(r != nil && NSEqualRanges([r range], NSMakeRange(6, 2)), "Restricting the range for firstMatchInString: works"); /* To test whether we correctly bail out of processing degenerate patterns, * we spin up a new thread and evaluate an expression there. The expectation * is that the thread should terminate within a few seconds. * * NOTE: Since we cannot terminate the thread in case of a failure, this * test should be run last. */ DegeneratePatternTest *test = [DegeneratePatternTest new]; NSThread *thread = [[NSThread alloc] initWithTarget: test selector: @selector(runTest:) object: nil]; [thread start]; [thread setName: @"PatternTestRunner"]; NSDate *started = [NSDate date]; NSRunLoop *rl = [NSRunLoop currentRunLoop]; /* We spin the runloop for a bit while we wait for the other thread to bail * out */ while ([thread isExecuting] && abs([started timeIntervalSinceNow] < 10.0f)) { [rl runMode: NSDefaultRunLoopMode beforeDate: [NSDate dateWithTimeIntervalSinceNow: 0.01]]; } PASS(NO == [thread isExecuting], "Faulty regular expression terminated"); #endif END_SET("NSRegularExpression") [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSRunLoop/000077500000000000000000000000001435650067400200655ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSRunLoop/GNUmakefile.preamble000066400000000000000000000001541435650067400237250ustar00rootroot00000000000000include ../../../config.mak ifeq ($(GNUSTEP_BASE_HAVE_LIBDISPATCH),1) dispatch_TOOL_LIBS = -ldispatch endif gnustep-base-1.29.0/Tests/base/NSRunLoop/TestInfo000066400000000000000000000000001435650067400215310ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSRunLoop/basic.m000066400000000000000000000013031435650067400213210ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; id testObj; PASS([NSRunLoop new] == nil, "run loop initialises to nil"); testObj = [NSRunLoop currentRunLoop]; test_NSObject(@"NSRunLoop", [NSArray arrayWithObject:testObj]); PASS([NSTimer new] == nil, "timer initialises to nil"); ASSIGN(testObj, [[NSTimer alloc] initWithFireDate: 0 interval: 0 target: [NSObject class] selector: @selector(description) userInfo: nil repeats: NO]); test_NSObject(@"NSTimer", [NSArray arrayWithObject:testObj]); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSRunLoop/dispatch.m000066400000000000000000000055461435650067400220540ustar00rootroot00000000000000#import "ObjectTesting.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSThread.h" #import "Foundation/NSTimer.h" #import "Foundation/NSRunLoop.h" #import "GNUstepBase/GSConfig.h" const NSTimeInterval kDelay = 0.01; #if GS_USE_LIBDISPATCH_RUNLOOP && __has_feature(blocks) # define DISPATCH_RL_INTEGRATION 1 # if __has_include() # include # else # include # endif #endif /** * This is a simple counter object that gets incremented from a different * thread, but by using dispatch_async() to put the actual increment operation * onto the main queue. */ @interface Counter : NSObject { NSUInteger counter; } - (void)increment; - (NSUInteger)counter; @end /** * This is the object running in the other thread. It's purpose is to dispatch * five increments to the main queue and then exit. */ @interface Queuer : NSObject - (void)worker: (Counter*)counter; - (void)run; - (void)timeout: (NSTimer*)t; @end @implementation Counter - (void)increment { counter++; } - (NSUInteger)counter { return counter; } @end @implementation Queuer - (void)worker: (Counter*)counter { NSUInteger i = 0; NSAutoreleasePool *pool = [NSAutoreleasePool new]; for (i = 0; i < 5; i++) { # ifdef DISPATCH_RL_INTEGRATION dispatch_async(dispatch_get_main_queue(), ^ { [counter increment]; }); # endif NSDate *d = [NSDate dateWithTimeIntervalSinceNow: kDelay]; while ([d timeIntervalSinceNow] > 0) { [[NSRunLoop currentRunLoop] runUntilDate: d]; } } [pool release]; } - (void)timeout: (NSTimer*)t { PASS(NO, "Timeout while trying to run blocks on main thread"); } - (void) run { NSDate *until = [NSDate dateWithTimeIntervalSinceNow: 1.0]; Counter *c = [Counter new]; [NSTimer scheduledTimerWithTimeInterval: 1.0 target: self selector: @selector(timeout:) userInfo: nil repeats: YES]; [NSThread detachNewThreadSelector: @selector(worker:) toTarget: self withObject: c]; while ([until timeIntervalSinceNow] > 0) { NSDate *tick = [NSDate dateWithTimeIntervalSinceNow: kDelay * 2]; [[NSRunLoop currentRunLoop] runUntilDate: tick]; if ([c counter] == 5) { break; } } PASS([c counter] == 5, "Dispatch blocks execute on main queue"); } @end int main(int argc, char *argv[]) { NSAutoreleasePool *pool = [NSAutoreleasePool new]; START_SET("NSRunLoop libdispatch integration") # ifndef DISPATCH_RL_INTEGRATION SKIP("No libdispatch, no blocks support or no runloop integration hooks in libdispatch") # else [[[Queuer new] autorelease] run]; # endif END_SET("NSRunLoop libdispatch integration") [pool release]; return 0; } gnustep-base-1.29.0/Tests/base/NSRunLoop/general.m000066400000000000000000000070071435650067400216640ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import #import #import #import static unsigned counter = 0; @interface MyClass : NSObject - (void) incrementCounter; @end @implementation MyClass - (void) incrementCounter { counter = counter + 1; NSLog(@"Counter is %u", counter); } @end int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSString *customMode = @"CustomRunLoopMode"; MyClass *dummy = [MyClass new]; NSMethodSignature *sig; NSInvocation *inv; NSTimer *dly; NSTimer *tim; NSRunLoop *run; NSDate *date; NSTimeInterval ti; sig = [dummy methodSignatureForSelector: @selector(incrementCounter)]; inv = [NSInvocation invocationWithMethodSignature: sig]; [inv setSelector: @selector(incrementCounter)]; [inv setTarget: dummy]; /* Ensure the runloop has an 'input source' for events. */ dly = [NSTimer scheduledTimerWithTimeInterval: 120.0 invocation: inv repeats: NO]; run = [NSRunLoop currentRunLoop]; PASS(run != nil, "NSRunLoop understands [+currentRunLoop]"); PASS([run currentMode] == nil, "-currentMode returns nil"); ti = [NSDate timeIntervalSinceReferenceDate]; PASS_RUNS(date = [NSDate dateWithTimeIntervalSinceNow: 1.0]; [run runUntilDate: date];, "-runUntilDate: works"); ti = [NSDate timeIntervalSinceReferenceDate] - ti; PASS(ti >= 1.0 && ti < 1.5, "-runUntilDate: takes the correct time"); ti = [NSDate timeIntervalSinceReferenceDate]; PASS_RUNS([run runUntilDate: [NSDate distantPast]];, "-runUntilDate: works for distant past"); ti = [NSDate timeIntervalSinceReferenceDate] - ti; PASS(ti < 0.2, "-runUntilDate: takes very short time"); ti = [NSDate timeIntervalSinceReferenceDate]; PASS_RUNS([run runUntilDate: nil];, "-runUntilDate: works for nil date"); ti = [NSDate timeIntervalSinceReferenceDate] - ti; PASS(ti < 0.2, "-runUntilDate: for nil date takes very short time"); ti = [NSDate timeIntervalSinceReferenceDate]; PASS_RUNS([run runMode: NSDefaultRunLoopMode beforeDate: nil];, "-runMode:beforeDate: works for nil date"); ti = [NSDate timeIntervalSinceReferenceDate] - ti; PASS(ti < 0.2, "-runMode:beforentilDate: for nil date takes very short time"); tim = [NSTimer scheduledTimerWithTimeInterval: 0.005 invocation: inv repeats: NO]; [NSThread sleepForTimeInterval: 0.01]; [run runUntilDate: [NSDate distantPast]]; PASS(1 == counter, "-runUntilDate: for distant past fires timer"); [dly invalidate]; /* We run in a custom mode to ensure there are no other timers or * input sources. */ tim = [NSTimer timerWithTimeInterval: 2.0 invocation: inv repeats: NO]; [run addTimer: tim forMode: customMode]; ti = [NSDate timeIntervalSinceReferenceDate]; PASS_RUNS(date = [NSDate dateWithTimeIntervalSinceNow: 5.0]; [run acceptInputForMode: customMode beforeDate: date];, "-acceptInputForMode:beforeDate: works with a timer"); ti = [NSDate timeIntervalSinceReferenceDate] - ti; PASS(ti >= 2.0 && ti < 2.5, "-acceptInputForMode:beforeDate: takes the correct time"); PASS(2 == counter, "-acceptInputForMode:beforeDate: fires timer"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSRunLoop/performers.m000066400000000000000000000067231435650067400224370ustar00rootroot00000000000000#import "Testing.h" #import #import #import #import #import #import #import int main() { START_SET("NSRunLoop performers") NSRunLoop *run; NSDate *date; NSMutableString *str; NSFileHandle *fh = [NSFileHandle fileHandleWithStandardInput]; NSTimeInterval delay = 0.1; [fh retain]; [fh readInBackgroundAndNotify]; run = [NSRunLoop currentRunLoop]; /* A run loop with no input sources does nothing when you tell it to run. Thus, we need to provide at least one input source ... */ str = [[NSMutableString alloc] init]; [run performSelector: @selector(appendString:) target: str argument: @"foo" order: 0 modes: [NSArray arrayWithObject: NSDefaultRunLoopMode]]; date = [NSDate dateWithTimeIntervalSinceNow: delay]; [run runUntilDate: date]; PASS([str isEqual: @"foo"], "-performSelector:target:argument:order:modes: works for one performer"); str = [[NSMutableString alloc] init]; [run performSelector: @selector(appendString:) target: str argument: @"foo" order: 0 modes: [NSArray arrayWithObject: NSDefaultRunLoopMode]]; date = [NSDate dateWithTimeIntervalSinceNow: delay]; [run runUntilDate: date]; [run runUntilDate: date]; if ([str isEqual: @""]) SKIP("it looks like stdin is redirected") PASS([str isEqual: @"foo"], "-performSelector:target:argument:order:modes: only sends the message once"); str = [[NSMutableString alloc] init]; [run performSelector: @selector(appendString:) target: str argument: @"bar" order: 11 modes: [NSArray arrayWithObject: NSDefaultRunLoopMode]]; [run performSelector: @selector(appendString:) target: str argument: @"foo" order: 10 modes: [NSArray arrayWithObject: NSDefaultRunLoopMode]]; date = [NSDate dateWithTimeIntervalSinceNow: delay]; [run runUntilDate: date]; PASS([str isEqual: @"foobar"], "-performSelector:target:argument:order:modes: orders performers correctly"); str = [[NSMutableString alloc] init]; [run performSelector: @selector(appendString:) target: str argument: @"foo" order: 10 modes: [NSArray arrayWithObject: NSDefaultRunLoopMode]]; [run performSelector: @selector(appendString:) target: str argument: @"bar" order: 11 modes: [NSArray arrayWithObject: NSDefaultRunLoopMode]]; [run performSelector: @selector(appendString:) target: str argument: @"zot" order: 11 modes: [NSArray arrayWithObject: NSDefaultRunLoopMode]]; [run cancelPerformSelector: @selector(appendString:) target: str argument: @"bar"]; date = [NSDate dateWithTimeIntervalSinceNow: delay]; [run runUntilDate: date]; PASS([str isEqual: @"foozot"], "-cancelPerformSelector:target:argument: works"); str = [[NSMutableString alloc] init]; [run performSelector: @selector(appendString:) target: str argument: @"foo" order: 10 modes: [NSArray arrayWithObject: NSDefaultRunLoopMode]]; [run performSelector: @selector(appendString:) target: str argument: @"zot" order: 11 modes: [NSArray arrayWithObject: NSDefaultRunLoopMode]]; [run cancelPerformSelectorsWithTarget: str]; date = [NSDate dateWithTimeIntervalSinceNow: delay]; [run runUntilDate: date]; PASS([str isEqualToString: @""], "-cancelPerformSelectorsWithTarget: works %s",[str UTF8String]); [fh closeFile]; [fh release]; END_SET("NSRunLoop performers") return 0; } gnustep-base-1.29.0/Tests/base/NSRunLoop/thread.m000066400000000000000000000142101435650067400215100ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import #import #import #import #import #import @interface ThreadTest : NSObject { char acceptEmptyBlocks; char acceptTimerBlocks; char blockForEmpty; char blockForInput; char blockForTimer; char limitForEmpty; char limitForInput; char limitForTimer; char moreForEmpty; char moreForInput; char moreForTimer; char performed; } - (void) notified: (NSNotification*)n; - (void) timeout: (NSTimer*)t; - (void) thread1: (id)o; @end @implementation ThreadTest - (void) notified: (NSNotification*)n { NSLog(@"Notified: %@", n); } - (void) timeout: (NSTimer*)t { } - (void) thread1: (id)o { NSAutoreleasePool *pool = [NSAutoreleasePool new]; NSNotificationCenter *nc; NSRunLoop *loop; NSFileHandle *fh; NSTimer *timer; NSDate *end; NSDate *start; nc = [NSNotificationCenter defaultCenter]; loop = [NSRunLoop currentRunLoop]; end = [loop limitDateForMode: NSDefaultRunLoopMode]; if (end == nil) limitForEmpty = 'N'; else limitForEmpty = 'Y'; end = [NSDate dateWithTimeIntervalSinceNow: 0.2]; start = [NSDate date]; if ([loop runMode: NSDefaultRunLoopMode beforeDate: end] == YES) moreForEmpty = 'Y'; else moreForEmpty = 'N'; if (fabs([start timeIntervalSinceNow]) < 0.01) blockForEmpty = 'N'; else blockForEmpty = 'Y'; end = [NSDate dateWithTimeIntervalSinceNow: 0.2]; start = [NSDate date]; [loop acceptInputForMode: NSDefaultRunLoopMode beforeDate: end]; if (fabs([start timeIntervalSinceNow]) < 0.01) acceptEmptyBlocks = 'N'; else acceptEmptyBlocks = 'Y'; timer = [NSTimer timerWithTimeInterval: 2.0 target: self selector: @selector(timeout:) userInfo: nil repeats: NO]; [loop addTimer: timer forMode: NSDefaultRunLoopMode]; end = [loop limitDateForMode: NSDefaultRunLoopMode]; if (fabs([end timeIntervalSinceDate: [timer fireDate]]) < 0.01) limitForTimer = 'Y'; else limitForTimer = 'N'; end = [NSDate dateWithTimeIntervalSinceNow: 0.2]; start = [NSDate date]; if ([loop runMode: NSDefaultRunLoopMode beforeDate: end] == YES) moreForTimer = 'Y'; else moreForTimer = 'N'; if (fabs([start timeIntervalSinceNow]) < 0.01) blockForTimer = 'N'; else blockForTimer = 'Y'; end = [NSDate dateWithTimeIntervalSinceNow: 0.2]; start = [NSDate date]; [loop acceptInputForMode: NSDefaultRunLoopMode beforeDate: end]; if (fabs([start timeIntervalSinceNow]) < 0.01) acceptTimerBlocks = 'N'; else acceptTimerBlocks = 'Y'; [timer invalidate]; fh = [[NSPipe pipe] fileHandleForReading]; [nc addObserver: self selector:@selector(notified:) name: nil object:fh]; [fh readInBackgroundAndNotify]; end = [loop limitDateForMode: NSDefaultRunLoopMode]; if ([end isEqual: [NSDate distantFuture]] == YES) limitForInput = 'Y'; else limitForInput = 'N'; end = [NSDate dateWithTimeIntervalSinceNow: 0.2]; start = [NSDate date]; if ([loop runMode: NSDefaultRunLoopMode beforeDate: end] == YES) moreForInput = 'Y'; else moreForInput = 'N'; [timer invalidate]; if (fabs([start timeIntervalSinceNow]) < 0.01) blockForInput = 'N'; else blockForInput = 'Y'; [nc removeObserver: self]; [pool release]; } - (void) thread2: (id)o { NSAutoreleasePool *pool = [NSAutoreleasePool new]; NSRunLoop *loop; NSDate *end; loop = [NSRunLoop currentRunLoop]; [NSTimer scheduledTimerWithTimeInterval: 2.0 target: self selector: @selector(timeout:) userInfo: nil repeats: NO]; end = [NSDate dateWithTimeIntervalSinceNow: 2.0]; while ([end timeIntervalSinceNow] > 0) { [loop runUntilDate: end]; } [pool release]; } - (void) threadEvent: (id)ignored { performed = 'Y'; } - (void) run { NSDate *until = [NSDate dateWithTimeIntervalSinceNow: 5.0]; NSThread *t; [NSTimer scheduledTimerWithTimeInterval: 5.0 target: self selector: @selector(timeout:) userInfo: nil repeats: YES]; [NSThread detachNewThreadSelector: @selector(thread1:) toTarget: self withObject: nil]; t = [[NSThread alloc] initWithTarget: self selector: @selector(thread2:) object: nil]; [t start]; [self performSelector: @selector(threadEvent:) onThread: t withObject: nil waitUntilDone: NO]; while ([until timeIntervalSinceNow] > 0) { [[NSRunLoop currentRunLoop] runUntilDate: until]; } PASS(acceptEmptyBlocks == 'N', "Accept with no inputs or timers will exit"); PASS(acceptTimerBlocks == 'Y', "Accept with timers will not exit"); PASS(blockForEmpty == 'N', "A loop with no inputs or timers will exit"); PASS(blockForInput == 'Y', "A loop with an input source will block"); PASS(blockForTimer == 'Y', "A loop with a timer will block"); PASS(limitForEmpty == 'N', "A loop with no inputs or timers has no limit"); PASS(limitForInput == 'Y', "A loop with an input source has distant future"); PASS(limitForTimer == 'Y', "A loop with a timer has timer fire date"); PASS(moreForEmpty == 'N', "A loop with no inputs or timers has no more"); PASS(moreForInput == 'Y', "A loop with an input source has more"); PASS(moreForTimer == 'Y', "A loop with a timer has more"); PASS(performed == 'Y', "Methods will be performed in a loop without inputs"); } @end int main(int argc, char *argv[]) { NSAutoreleasePool *pool = [NSAutoreleasePool new]; [[[ThreadTest new] autorelease] run]; [pool release]; return 0; } gnustep-base-1.29.0/Tests/base/NSScanner/000077500000000000000000000000001435650067400200605ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSScanner/TestInfo000066400000000000000000000000001435650067400215240ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSScanner/test00.m000066400000000000000000000035351435650067400213630ustar00rootroot00000000000000#import "Testing.h" #import #import #import #import #import static BOOL scanAWord(NSScanner *theScanner, NSCharacterSet *cSet) { BOOL ret = ([theScanner scanUpToCharactersFromSet:cSet intoString:NULL] && [theScanner scanCharactersFromSet:cSet intoString:NULL]); return ret; } static BOOL scanThreeWords(NSString *string,NSCharacterSet *separators) { NSScanner *scanner = [NSScanner scannerWithString:string]; /* so it doesn't skip the whitespace */ [scanner setCharactersToBeSkipped:[NSCharacterSet characterSetWithCharactersInString:@""]]; return ((scanAWord(scanner,separators) && ![scanner isAtEnd] && scanAWord(scanner,separators) && ![scanner isAtEnd] && scanAWord(scanner,separators) && [scanner isAtEnd])); } int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSString *str = nil; id charSet = nil; charSet = [NSCharacterSet whitespaceAndNewlineCharacterSet]; str = [NSString stringWithCString:"one\ntwo\nthree\n"]; PASS(scanThreeWords(str,charSet), "scanning three words separated by newlines"); str = @"one two three "; PASS(scanThreeWords(str,charSet), "scanning three words separated by spaces"); str = @"one\ttwo\tthree\t"; PASS(scanThreeWords(str,charSet), "scanning three words separated by tabs"); str = @"one \ntwo \nthree \n"; PASS(scanThreeWords(str,charSet), "scanning three words separated by newlines and spaces"); charSet = [charSet mutableCopy]; [charSet addCharactersInString:@";"]; str = @"one ;two ;three ;"; PASS(scanThreeWords(str,charSet), "scanning three words separated by spaces and semi-colons"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSScanner/test01.m000066400000000000000000000156731435650067400213720ustar00rootroot00000000000000#import "Testing.h" #import #import #import #import #import #import static BOOL scanInt(int value, int *retp) { NSString *str = [[NSNumber numberWithInt: value] description]; NSScanner *scn = [NSScanner scannerWithString: str]; return ([scn scanInt: retp] && value == *retp); } /* this didn't seem to be used in any of the NSScanner guile tests so this function is untested. static BOOL scanIntOverflow(int value, int *retp) { NSString *str = [[NSNumber numberWithFloat: value] description]; NSScanner *scn = [NSScanner scannerWithString: str]; int intmax = 2147483647; int intmin = (0 - (intmax - 1)); return ([scn scanInt: retp] && (0 > value) ? (intmin == *retp) : (intmax == *retp)); } */ #if defined(GNUSTEP_BASE_LIBRARY) static BOOL scanRadixUnsigned(NSString *str, int expectValue, unsigned int expectedValue, int expectedScanLoc, unsigned *retp) { NSScanner *scn = [NSScanner scannerWithString: str]; [scn scanRadixUnsignedInt: retp]; return ((expectValue == 1) ? (expectedValue == *retp) : YES && expectedScanLoc == [scn scanLocation]); } static BOOL scanRadixUnsignedLongLong(NSString *str, int expectValue, unsigned int expectedValue, int expectedScanLoc, unsigned long long *retp) { NSScanner *scn = [NSScanner scannerWithString: str]; [scn scanRadixUnsignedLongLong: retp]; return ((expectValue == 1) ? (expectedValue == *retp) : YES && expectedScanLoc == [scn scanLocation]); } #endif static BOOL scanHex(NSString *str, int expectValue, unsigned int expectedValue, int expectedScanLoc, unsigned *retp) { NSScanner *scn = [NSScanner scannerWithString: str]; [scn scanHexInt: retp]; return ((expectValue == 1) ? (expectedValue == *retp) : YES && expectedScanLoc == [scn scanLocation]); } static BOOL scanHexLongLong(NSString *str, int expectValue, unsigned long long expectedValue, int expectedScanLoc, unsigned long long *retp) { NSScanner *scn = [NSScanner scannerWithString: str]; [scn scanHexLongLong: retp]; return ((expectValue == 1) ? (expectedValue == *retp) : YES && expectedScanLoc == [scn scanLocation]); } static BOOL scanDouble(NSString *str, double expectedValue, double *retp) { NSScanner *scn = [NSScanner scannerWithString: str]; [scn scanDouble: retp]; return ((0.00000000001 >= fabs(expectedValue - *retp)) && [str length] == [scn scanLocation]); } int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; long long lret; int ret; double dret; int intmax = 2147483647; int intmin = (0 - (intmax - 1)); NSScanner *scn; float flt; NSString *em; PASS(scanInt((intmax - 20),&ret), "NSScanner large ints"); PASS(scanInt((intmin + 20),&ret), "NSScanner small ints"); scn = [NSScanner scannerWithString:@"1234F00"]; PASS(([scn scanInt:&ret] && ([scn scanLocation] == 4)), "NSScanner non-digits terminate scan"); scn = [NSScanner scannerWithString:@"junk"]; PASS((![scn scanInt:&ret] && ([scn scanLocation] == 0)), "NSScanner non-digits terminate scan"); scn = [NSScanner scannerWithString:@"junk"]; PASS(![scn scanInt:&ret] && ([scn scanLocation] == 0), "NSScanner non-digits dont consume characters to be skipped"); #if defined(GNUSTEP_BASE_LIBRARY) PASS(scanRadixUnsigned(@"1234FOO", 1, 1234, 4, (unsigned*)&ret) && scanRadixUnsigned(@"01234FOO", 1, 01234, 5, (unsigned*)&ret) && scanRadixUnsigned(@"0x1234FOO", 1, 0x1234F, 7, (unsigned*)&ret) && scanRadixUnsigned(@"0X1234FOO", 1, 0x1234F, 7, (unsigned*)&ret) && scanRadixUnsigned(@"012348FOO", 1, 01234, 5, (unsigned*)&ret), "NSScanner radiux unsigned (non-digits terminate scan)"); PASS(scanRadixUnsignedLongLong( @"1234FOO", 1, 1234, 4, (unsigned long long*)&lret) && scanRadixUnsignedLongLong( @"01234FOO", 1, 01234, 5, (unsigned long long*)&lret) && scanRadixUnsignedLongLong( @"0x1234FOO", 1, 0x1234F, 7, (unsigned long long*)&lret) && scanRadixUnsignedLongLong( @"0X1234FOO", 1, 0x1234F, 7, (unsigned long long*)&lret) && scanRadixUnsignedLongLong( @"012348FOO", 1, 01234, 5, (unsigned long long*)&lret), "NSScanner radiux unsigned (non-digits terminate scan)"); PASS(scanRadixUnsigned(@"FOO", 0, 0, 0, (unsigned*)&ret) && scanRadixUnsigned(@" FOO", 0, 0, 0, (unsigned*)&ret) && scanRadixUnsigned(@" 0x ", 0, 0, 0, (unsigned*)&ret), "NSScanner radiux unsigned (non-digits dont move scan)"); #endif PASS(scanHex(@"1234FOO", 1, 0x1234F, 5, (unsigned*)&ret) && scanHex(@"01234FOO", 1, 0x1234F, 6, (unsigned*)&ret), "NSScanner hex (non-digits terminate scan)"); PASS(scanHexLongLong(@"1234FOO", 1, 0x1234F, 5, (unsigned long long*)&lret) && scanHexLongLong(@"01234FOO", 1, 0x1234F, 6, (unsigned long long*)&lret), "NSScanner hex long long (non-digits terminate scan)"); /* dbl1 = 123.456; dbl2 = 123.45678901234567890123456789012345678901234567; dbl3 = 1.23456789; */ PASS(scanDouble(@"123.456",123.456,&dret) && scanDouble(@"123.45678901234567890123456789012345678901234567", 123.45678901234567890123456789012345678901234567,&dret) && scanDouble(@"0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000123456789e+100", 1.23456789, &dret), "NSScanner scans doubles"); PASS(scanDouble(@"1e0", 1, &dret) && scanDouble(@"1e1", 10, &dret) && scanDouble(@"1e+1", 10, &dret) && scanDouble(@"1e+10", 1e10, &dret) && scanDouble(@"1e-1", 1e-1, &dret) && scanDouble(@"1e-10", 1e-10, &dret), "NSScanner scans double with exponents"); scn = [NSScanner scannerWithString: @"1.0e+2m"]; flt = 0.0; em = @""; [scn scanFloat: &flt]; [scn scanString: @"m" intoString: &em]; PASS(flt == 1e+2f, "flt = 1e+2"); PASS_EQUAL(em, @"m", "e is part of exponent"); PASS([scn scanLocation] == 7u, "all scanned"); PASS([scn isAtEnd], "is at end"); scn = [NSScanner scannerWithString: @"1.0em"]; flt = 0.0; em = @""; [scn scanFloat: &flt]; [scn scanString: @"em" intoString: &em]; PASS(flt == 1.0f, "flt = 1.0"); PASS_EQUAL(em, @"em", "em is not part of exponent"); PASS([scn scanLocation] == 5u, "all scanned"); PASS([scn isAtEnd], "is at end"); scn = [NSScanner scannerWithString: @"0.0"]; flt = 1.0; [scn scanFloat: &flt]; PASS(flt == 0.0, "flt = 0.0"); PASS([scn isAtEnd], "is at end"); double r, g, b; NSScanner *scanner; BOOL ok = NO; scanner = [NSScanner scannerWithString: @"0 0 0"]; PASS([scanner scanDouble: &r] && [scanner scanDouble: &g] && [scanner scanDouble: &b] && [scanner isAtEnd] && 0.0 == r && 0.0 == g && 0.0 == b, "scan three space separated zeros as doubles") [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSSet/000077500000000000000000000000001435650067400172225ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSSet/TestInfo000066400000000000000000000000001435650067400206660ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSSet/basic.m000066400000000000000000000014521435650067400204630ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSSet *testObj; NSMutableArray *testObjs = [NSMutableArray new]; testObj = [NSSet new]; [testObjs addObject:testObj]; PASS(testObj != nil && [testObj count] == 0, "can create an empty set"); testObj = [NSSet setWithObject:@"Hello"]; [testObjs addObject:testObj]; PASS(testObj != nil && [testObj count] == 1, "can create a set with one element"); test_NSObject(@"NSSet", testObjs); test_NSCoding(testObjs); test_keyed_NSCoding(testObjs); test_NSCopying(@"NSSet", @"NSMutableSet", testObjs, YES, NO); test_NSMutableCopying(@"NSSet", @"NSMutableSet", testObjs); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSSortDescriptor/000077500000000000000000000000001435650067400214555ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSSortDescriptor/TestInfo000066400000000000000000000000001435650067400231210ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSSortDescriptor/basic.m000066400000000000000000000042561435650067400227230ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSArray *array; NSSortDescriptor *s1; NSSortDescriptor *s2; NSSortDescriptor *s3; NSSortDescriptor *s4; NSDictionary *d1; NSDictionary *d2; NSDictionary *d3; NSDictionary *d4; NSArray *a1; NSArray *a2; NSArray *a3; s1 = [[NSSortDescriptor alloc] initWithKey: @"name" ascending: YES]; PASS(s1 != nil, "can create a sort descriptor"); array = [NSArray arrayWithObject: s1]; test_NSObject(@"NSSortDescriptor", array); test_NSCoding(array); test_keyed_NSCoding(array); test_NSCopying(@"NSSortDescriptor", @"NSSortDescriptor", array, NO, NO); s2 = [[NSSortDescriptor alloc] initWithKey: @"name" ascending: YES]; s3 = [[NSSortDescriptor alloc] initWithKey: @"other" ascending: YES]; s4 = [[NSSortDescriptor alloc] initWithKey: @"other" ascending: NO]; PASS([s1 hash] == [s2 hash], "hash for similar descriptors is the same"); PASS([s1 isEqual: s2], "similar descriptors are equal"); PASS(![s1 isEqual: s3], "different keyed descriptors are not equal"); PASS(![s3 isEqual: s4], "different ordered descriptors are not equal"); d1 = [NSDictionary dictionaryWithObjectsAndKeys: @"1", @"name", @"1", @"other", nil]; d2 = [NSDictionary dictionaryWithObjectsAndKeys: @"1", @"name", @"2", @"other", nil]; d3 = [NSDictionary dictionaryWithObjectsAndKeys: @"2", @"name", @"1", @"other", nil]; d4 = [NSDictionary dictionaryWithObjectsAndKeys: @"2", @"name", @"2", @"other", nil]; PASS([s3 compareObject: d3 toObject: d4] == NSOrderedAscending, "basic comparison works for ascending descriptor"); PASS([s4 compareObject: d3 toObject: d4] == NSOrderedDescending, "basic comparison works for descending descriptor"); array = [NSArray arrayWithObjects: s3, s1, nil]; a1 = [NSArray arrayWithObjects: d1, d2, d3, d4, nil]; a2 = [NSArray arrayWithObjects: d1, d3, d2, d4, nil]; a3 = [a1 sortedArrayUsingDescriptors: array]; PASS([a2 isEqual: a3], "simple multilevel sort works"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSStream/000077500000000000000000000000001435650067400177225ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSStream/TestInfo000066400000000000000000000000001435650067400213660ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSStream/basic.m000066400000000000000000000007311435650067400211620ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSInputStream *t1; NSOutputStream *t2; NSArray *a; NSHost *host = [NSHost hostWithName:@"localhost"]; [NSStream getStreamsToHost:host port:80 inputStream:&t1 outputStream:&t2]; a = [NSArray arrayWithObjects:t1, t2, nil]; test_NSObject(@"NSStream", a); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSStream/memandfile.m000066400000000000000000000031361435650067400222040ustar00rootroot00000000000000/** * This test tests synchronized copying between mem and file */ #import "ObjectTesting.h" #import #import static void copyStream(NSInputStream *input, NSOutputStream *output) { uint8_t buffer[4096]; [input open]; [output open]; while([input hasBytesAvailable]) { int len = [input read:buffer maxLength:4096]; uint8_t *p = buffer; while(len>0) { int written = [output write:p maxLength:len]; p = p + written; len = len - written; } } [input close]; [output close]; } int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; // first test, file to memory copy NSString *path = @"memandfile.m"; NSData *goldData = [NSData dataWithContentsOfFile:path]; NSInputStream *input = [NSInputStream inputStreamWithFileAtPath:path]; NSOutputStream *output = [NSOutputStream outputStreamToMemory]; copyStream(input, output); NSData *answer = [output propertyForKey:NSStreamDataWrittenToMemoryStreamKey]; PASS([goldData isEqualToData:answer], "file to memory copy ok"); // second test, memory to file copy NSString *pathO = @"temp"; NSInputStream *input2 = [NSInputStream inputStreamWithData:goldData]; NSOutputStream *output2 = [NSOutputStream outputStreamToFileAtPath:pathO append:NO]; copyStream(input2, output2); NSData *answer2 = [NSData dataWithContentsOfFile:pathO]; PASS([goldData isEqualToData:answer2], "memory to file copy ok"); [[NSFileManager defaultManager] removeFileAtPath: pathO handler: nil]; [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSStream/memandfile_2.m000066400000000000000000000107721435650067400224310ustar00rootroot00000000000000/** * This test tests asynchronized copying between mem and file using a runloop */ #import "ObjectTesting.h" #import #import static NSOutputStream *defaultOutput = nil; static NSInputStream *defaultInput = nil; @interface Listener1 : NSObject @end @interface Listener2 : NSObject @end @implementation Listener1 - (void)stream: (NSStream *)theStream handleEvent: (NSStreamEvent)streamEvent { static uint8_t buffer[4096]; switch (streamEvent) { case NSStreamEventHasBytesAvailable: { int len = [(NSInputStream*)theStream read: buffer maxLength: 4096]; uint8_t *p = buffer; if (len==0) { [theStream close]; [theStream removeFromRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode]; } else { while(len>0) { int written = [defaultOutput write: p maxLength: len]; p = p + written; len = len - written; } } break; } case NSStreamEventEndEncountered: { [theStream close]; [theStream removeFromRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode]; break; } default: { NSAssert1(1, @"Error! code is %ld", (long int)[[theStream streamError] code]); break; } } } @end @implementation Listener2 - (void)stream: (NSStream *)theStream handleEvent: (NSStreamEvent)streamEvent { static uint8_t *p; static uint8_t buffer[4096]; static int len = 0; switch (streamEvent) { case NSStreamEventHasSpaceAvailable: { if (len==0) { len = [defaultInput read: buffer maxLength: 4096]; p = buffer; } if (len==0) { [theStream close]; [theStream removeFromRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode]; } else { int written = [(NSOutputStream*)theStream write: p maxLength: len]; p = p + written; len = len - written; } break; } case NSStreamEventEndEncountered: { [theStream close]; [theStream removeFromRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode]; break; } default: { NSAssert1(1, @"Error! code is %ld", (long int)[[theStream streamError] code]); break; } } } @end int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSRunLoop *rl = [NSRunLoop currentRunLoop]; NSData *answer = nil; NSDate *end; // first test, file to memory copy NSString *path = @"memandfile.m"; NSData *goldData = [NSData dataWithContentsOfFile: path]; NSInputStream *input = [NSInputStream inputStreamWithFileAtPath: path]; NSOutputStream *output = [NSOutputStream outputStreamToMemory]; Listener1 *l1 = [[Listener1 new] autorelease]; [input setDelegate: l1]; [input scheduleInRunLoop: rl forMode: NSDefaultRunLoopMode]; [input open]; [output open]; defaultOutput = output; end = [NSDate dateWithTimeIntervalSinceNow: 1.0]; while (NO == [goldData isEqualToData: answer] && [end timeIntervalSinceNow] > 0.0) { [rl runMode: NSDefaultRunLoopMode beforeDate: end]; answer = [output propertyForKey: NSStreamDataWrittenToMemoryStreamKey]; } answer = [output propertyForKey: NSStreamDataWrittenToMemoryStreamKey]; PASS([goldData isEqualToData: answer], "file to memory copy ok"); // second test, memory to file copy NSString *pathO = @"temp"; NSInputStream *input2 = [NSInputStream inputStreamWithData: goldData]; NSOutputStream *output2 = [NSOutputStream outputStreamToFileAtPath: pathO append: NO]; Listener1 *l2 = [[Listener2 new] autorelease]; [output2 setDelegate: l2]; [output2 scheduleInRunLoop: rl forMode: NSDefaultRunLoopMode]; [input2 open]; [output2 open]; defaultInput = input2; end = [NSDate dateWithTimeIntervalSinceNow: 1.0]; NSData *answer2 = nil; while (NO == [goldData isEqualToData: answer2] && [end timeIntervalSinceNow] > 0.0) { [rl runMode: NSDefaultRunLoopMode beforeDate: end]; answer2 = [NSData dataWithContentsOfFile: pathO]; } answer2 = [NSData dataWithContentsOfFile: pathO]; PASS([goldData isEqualToData: answer2], "memory to file copy ok"); [[NSFileManager defaultManager] removeFileAtPath: pathO handler: nil]; [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/NSStream/pipe.m000066400000000000000000000051121435650067400210340ustar00rootroot00000000000000#if defined(GNUSTEP_BASE_LIBRARY) /** * This test tests a pipe using NSStream */ #import "ObjectTesting.h" #import #import static NSOutputStream *defaultOutput = nil; static NSInputStream *defaultInput = nil; static NSData *goldData; static NSMutableData *testData; @interface Listener : NSObject @end @implementation Listener - (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent { static uint8_t buffer[4096]; static int writePointer=0; switch (streamEvent) { case NSStreamEventHasSpaceAvailable: { NSAssert(theStream==defaultOutput, @"Wrong stream for writing"); if (writePointer<[goldData length]) { int writeReturn = [defaultOutput write:[goldData bytes]+writePointer maxLength:[goldData length]-writePointer]; writePointer += writeReturn; } else [defaultOutput close]; break; } case NSStreamEventHasBytesAvailable: { int readSize; NSAssert(theStream==defaultInput, @"Wrong stream for reading"); readSize = [defaultInput read:buffer maxLength:4096]; NSAssert(readSize>=0, @"read error"); if (readSize==0) [defaultInput close]; else [testData appendBytes:buffer length:readSize]; break; } case NSStreamEventErrorOccurred: { NSAssert1(1, @"Error! code is %ld", (long int)[[theStream streamError] code]); break; } default: break; } } @end int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSRunLoop *rl = [NSRunLoop currentRunLoop]; Listener *li = [[Listener new] autorelease]; NSString *path = @"pipe.m"; NSDate *end; [NSStream pipeWithInputStream:&defaultInput outputStream:&defaultOutput]; goldData = [NSData dataWithContentsOfFile:path]; testData = [NSMutableData dataWithCapacity:4096]; [defaultInput setDelegate:li]; [defaultOutput setDelegate:li]; [defaultInput scheduleInRunLoop:rl forMode:NSDefaultRunLoopMode]; [defaultOutput scheduleInRunLoop:rl forMode:NSDefaultRunLoopMode]; [defaultInput open]; [defaultOutput open]; end = [NSDate dateWithTimeIntervalSinceNow: 0.5]; while (NO == [goldData isEqualToData:testData] && [end timeIntervalSinceNow] > 0.0) { [rl runMode: NSDefaultRunLoopMode beforeDate: end]; } PASS([goldData isEqualToData:testData], "Local pipe"); [arp release]; return 0; } #else int main() { return 0; } #endif gnustep-base-1.29.0/Tests/base/NSStream/socket.m000066400000000000000000000121431435650067400213710ustar00rootroot00000000000000/** * This test tests basic client side socket */ #import "ObjectTesting.h" #import #import #if defined(GS_USE_GNUTLS) #define SSL_SUPPORTED GS_USE_GNUTLS #else #define SSL_SUPPORTED 1 /* Assume Apple supports it */ #endif static NSOutputStream *defaultOutput = nil; static NSInputStream *defaultInput = nil; static int byteCount = 0; static const uint8_t *rawstring = (const uint8_t*)"GET / HTTP/1.0\r\n\r\n"; static BOOL done = NO; @interface Listener : NSObject @end @implementation Listener - (void)stream: (NSStream *)theStream handleEvent: (NSStreamEvent)streamEvent { static uint8_t buffer[4096]; static BOOL doneWrite = NO; int readSize; NSLog(@"Got %ld on %p", (long int)streamEvent, theStream); switch (streamEvent) { case NSStreamEventOpenCompleted: { if (theStream == defaultOutput) { doneWrite = NO; } break; } case NSStreamEventHasSpaceAvailable: { NSAssert(theStream==defaultOutput, @"Wrong stream for reading"); if (doneWrite == NO) { // there may be a problem so that write is not complete. // However, since this is so short it is pretty much always ok. NSLog(@"Written request"); doneWrite = YES; [defaultOutput write: rawstring maxLength: strlen((char*)rawstring)]; } /* else { [defaultOutput close]; [defaultOutput removeFromRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode]; NSLog(@"Closed %p", defaultOutput); } */ break; } case NSStreamEventHasBytesAvailable: { NSAssert(theStream==defaultInput, @"Wrong stream for reading"); readSize = [defaultInput read: buffer maxLength: 4096]; if (readSize < 0) { // it is possible that readSize<0 but not an Error. // For example would block NSLog(@"%@", [defaultInput streamError]); NSAssert([defaultInput streamError]==nil, @"read error"); } if (readSize == 0) { [defaultInput close]; [defaultInput removeFromRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode]; NSLog(@"Closed %p", defaultInput); } else { byteCount += readSize; NSLog(@"Read %d: %*.*s", readSize, readSize, readSize, buffer); } break; } case NSStreamEventEndEncountered: { [theStream close]; [theStream removeFromRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode]; NSLog(@"Close %p", theStream); done = YES; break; } default: { NSAssert1(1, @"Error! code is %ld", (long int)[[theStream streamError] code]); break; } } } int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSRunLoop *rl; NSHost *host; Listener *li; NSDate *d; rl = [NSRunLoop currentRunLoop]; host = [NSHost hostWithName: @"www.google.com"]; //host = [NSHost hostWithName: @"localhost"]; #if 1 li = [[Listener new] autorelease]; [NSStream getStreamsToHost: host port: 80 inputStream: &defaultInput outputStream: &defaultOutput]; [defaultInput setDelegate: li]; [defaultOutput setDelegate: li]; [defaultInput scheduleInRunLoop: rl forMode: NSDefaultRunLoopMode]; [defaultOutput scheduleInRunLoop: rl forMode: NSDefaultRunLoopMode]; [defaultInput open]; [defaultOutput open]; d = [NSDate dateWithTimeIntervalSinceNow: 30]; while (done == NO && [d timeIntervalSinceNow] > 0.0) { [rl runMode: NSDefaultRunLoopMode beforeDate: d]; } // I cannot verify the content at www.google.com, // so as long as it has something, that is PASSing PASS(byteCount>0, "read www.google.com"); [defaultInput setDelegate: nil]; [defaultOutput setDelegate: nil]; #endif START_SET("NSStream SSL") if (!SSL_SUPPORTED) SKIP("NSStream SSL functions not supported\nThe GNU TLS library was not provided when GNUstep-base was configured/built.") done = NO; byteCount = 0; defaultInput = nil; defaultOutput = nil; li = [[Listener new] autorelease]; [NSStream getStreamsToHost: host port: 443 inputStream: &defaultInput outputStream: &defaultOutput]; [defaultInput setDelegate: li]; [defaultOutput setDelegate: li]; [defaultInput scheduleInRunLoop: rl forMode: NSDefaultRunLoopMode]; [defaultOutput scheduleInRunLoop: rl forMode: NSDefaultRunLoopMode]; [defaultInput setProperty: NSStreamSocketSecurityLevelNegotiatedSSL forKey: NSStreamSocketSecurityLevelKey]; [defaultOutput setProperty: NSStreamSocketSecurityLevelNegotiatedSSL forKey: NSStreamSocketSecurityLevelKey]; [defaultInput open]; [defaultOutput open]; d = [NSDate dateWithTimeIntervalSinceNow: 30]; while (done == NO && [d timeIntervalSinceNow] > 0.0) { [rl runMode: NSDefaultRunLoopMode beforeDate: d]; } PASS(byteCount>0, "read www.google.com https"); [defaultInput setDelegate: nil]; [defaultOutput setDelegate: nil]; END_SET("NSStream SSL") [arp release]; return 0; } @end gnustep-base-1.29.0/Tests/base/NSStream/socket_cs.m000066400000000000000000000355341435650067400220670ustar00rootroot00000000000000#if defined(GNUSTEP_BASE_LIBRARY) /** * This test tests client and server socket */ #import "ObjectTesting.h" #import #import static GSServerStream *serverStream; static NSOutputStream *serverOutput = nil; static NSOutputStream *clientOutput = nil; static NSInputStream *serverInput = nil; static NSInputStream *clientInput = nil; static NSData *goldData; static NSMutableData *testData; static NSString *prefix = @""; static NSString * eventString(NSStream *stream, NSStreamEvent event) { switch (event) { case NSStreamEventOpenCompleted: return @"open completed"; case NSStreamEventHasSpaceAvailable: return @"space available"; case NSStreamEventHasBytesAvailable: return @"bytes available"; case NSStreamEventEndEncountered: return @"end encountered"; case NSStreamEventErrorOccurred: return [NSString stringWithFormat: @"error %ld (%@)", (long int)[[stream streamError] code], [stream streamError]]; default: return [NSString stringWithFormat: @"unknown event %ld", (long int)event]; } } @interface ClientListener : NSObject { uint8_t buffer[4096]; int writePointer; } @end @implementation ClientListener - (void)stream: (NSStream *)theStream handleEvent: (NSStreamEvent)streamEvent { NSLog(@"%@ Client %p %@", prefix, theStream, eventString(theStream, streamEvent)); switch (streamEvent) { case NSStreamEventOpenCompleted: { if (theStream==clientOutput) { NSLog(@"%@ Client %p set write pointer to zero", prefix, theStream); writePointer = 0; } break; } case NSStreamEventHasSpaceAvailable: { NSAssert(theStream==clientOutput, @"Wrong stream for writing"); if (writePointer < [goldData length]) { int writeReturn; writeReturn = [clientOutput write: [goldData bytes]+writePointer maxLength: [goldData length]-writePointer]; NSLog(@"%@ Client %p wrote %d", prefix, theStream, writeReturn); if (writeReturn < 0) NSLog(@"%@ Error ... %@", prefix, [theStream streamError]); writePointer += writeReturn; } else { writePointer = 0; [theStream close]; [theStream removeFromRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode]; NSLog(@"%@ Client close %p", prefix, theStream); } break; } case NSStreamEventHasBytesAvailable: { int readSize; NSAssert(theStream==clientInput, @"Wrong stream for reading"); readSize = [clientInput read: buffer maxLength: 4096]; NSLog(@"%@ Client %p read %d", prefix, theStream, readSize); if (readSize < 0) { NSLog(@"%@ Error ... %@", prefix, [theStream streamError]); // it is possible that readSize<0 but not an Error. // For example would block } else if (readSize == 0) { [theStream close]; [theStream removeFromRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode]; NSLog(@"%@ Client close %p", prefix, theStream); } else { [testData appendBytes: buffer length: readSize]; } break; } case NSStreamEventEndEncountered: { [theStream setDelegate: nil]; [theStream close]; [theStream removeFromRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode]; break; } case NSStreamEventErrorOccurred: { break; } default: break; } } @end @interface ServerListener : NSObject { uint8_t buffer[4096]; int readSize; int writeSize; BOOL readable; BOOL writable; } @end @implementation ServerListener - (void)stream: (NSStream *)theStream handleEvent: (NSStreamEvent)streamEvent { NSLog(@"%@ Server %p %@", prefix, theStream, eventString(theStream, streamEvent)); switch (streamEvent) { case NSStreamEventHasBytesAvailable: { if (theStream==serverStream) { NSAssert(serverInput==nil, @"accept twice"); NSLog(@"%@ Server %p accepting incoming connection", prefix, theStream); [serverStream acceptWithInputStream: &serverInput outputStream: &serverOutput]; if (nil == serverInput) // it is ok to accept nothing { NSLog(@"%@ Server %p accept failed (no connection)", prefix, theStream); } else { NSRunLoop *rl = [NSRunLoop currentRunLoop]; [serverInput scheduleInRunLoop: rl forMode: NSDefaultRunLoopMode]; [serverOutput scheduleInRunLoop: rl forMode: NSDefaultRunLoopMode]; NSLog(@"%@ Server input stream is %p", prefix, serverInput); NSLog(@"%@ Server output stream is %p", prefix, serverOutput); RETAIN(serverInput); RETAIN(serverOutput); [serverInput setDelegate: self]; [serverOutput setDelegate: self]; [serverInput open]; [serverOutput open]; [serverInput scheduleInRunLoop: rl forMode: NSDefaultRunLoopMode]; [serverOutput scheduleInRunLoop: rl forMode: NSDefaultRunLoopMode]; readSize = 0; writeSize = 0; [serverStream setDelegate: nil]; [serverStream close]; [serverStream removeFromRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode]; } } if (theStream == serverInput) { readable = YES; } break; } case NSStreamEventHasSpaceAvailable: { NSAssert(theStream==serverOutput, @"Wrong stream for writing"); writable = YES; break; } case NSStreamEventEndEncountered: { [theStream setDelegate: nil]; [theStream close]; [theStream removeFromRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode]; NSLog(@"%@ Server close %p", prefix, theStream); if (theStream == serverInput && writeSize == readSize) { [serverOutput setDelegate: nil]; [serverOutput close]; [serverOutput removeFromRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode]; NSLog(@"%@ Server output close %p", prefix, serverOutput); } break; } case NSStreamEventErrorOccurred: break; default: break; } while ((readable == YES && writeSize == readSize) || (writable == YES && writeSize < readSize)) { if (readable == YES && writeSize == readSize) { readSize = [serverInput read: buffer maxLength: 4096]; readable = NO; NSLog(@"%@ Server %p read %d", prefix, serverInput, readSize); writeSize = 0; if (readSize == 0) { [serverInput setDelegate: nil]; [serverInput close]; [serverInput removeFromRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode]; NSLog(@"%@ Server input close %p", prefix, serverInput); [serverOutput setDelegate: nil]; [serverOutput close]; [serverOutput removeFromRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode]; NSLog(@"%@ Server output close %p", prefix, serverOutput); } else if (readSize < 0) { NSLog(@"%@ Error ... %@", prefix, [clientInput streamError]); readSize = 0; } } if (writable == YES && writeSize < readSize) { int writeReturn = [serverOutput write: buffer+writeSize maxLength: readSize-writeSize]; NSLog(@"%@ Server %p wrote %d", prefix, serverOutput, writeReturn); writable = NO; if (writeReturn == 0) { [serverOutput setDelegate: nil]; [serverOutput close]; [serverOutput removeFromRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode]; NSLog(@"%@ Server close %p", prefix, serverOutput); [serverInput setDelegate: nil]; [serverInput close]; [serverInput removeFromRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode]; NSLog(@"%@ Server input close %p", prefix, serverInput); } else if (writeReturn > 0) { writeSize += writeReturn; } else if (writeReturn < 0) { NSLog(@"%@ Error ... %@", prefix, [serverOutput streamError]); } /* If we have finished writing and there is no more data coming, * we can close the output stream. */ if (writeSize == readSize && [serverInput streamStatus] == NSStreamStatusClosed) { [serverOutput setDelegate: nil]; [serverOutput close]; [serverOutput removeFromRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode]; NSLog(@"%@ Server output close %p", prefix, serverOutput); } } } } @end int main() { CREATE_AUTORELEASE_POOL(arp); NSRunLoop *rl = [NSRunLoop currentRunLoop]; NSHost *host = [NSHost hostWithAddress: @"127.0.0.1"]; ServerListener *sli; ClientListener *cli; NSString *path = @"socket_cs.m"; NSString *socketPath = @"test-socket"; NSDate *end; [[NSFileManager defaultManager] removeFileAtPath: socketPath handler: nil]; NSLog(@"sending and receiving on %@: %@", host, [host address]); goldData = [NSData dataWithContentsOfFile: path]; testData = [NSMutableData dataWithCapacity: 4096]; { CREATE_AUTORELEASE_POOL(inner); prefix = @"Test1"; [testData setLength: 0]; sli = AUTORELEASE([ServerListener new]); cli = AUTORELEASE([ClientListener new]); serverStream = [GSServerStream serverStreamToAddr: [host address] port: 1234]; [serverStream setDelegate: sli]; [serverStream scheduleInRunLoop: rl forMode: NSDefaultRunLoopMode]; [serverStream open]; [NSStream getStreamsToHost: host port: 1234 inputStream: &clientInput outputStream: &clientOutput]; NSLog(@"%@ Client input stream is %p", prefix, clientInput); NSLog(@"%@ Client output stream is %p", prefix, clientOutput); [clientInput setDelegate: cli]; [clientOutput setDelegate: cli]; [clientInput scheduleInRunLoop: rl forMode: NSDefaultRunLoopMode]; [clientOutput scheduleInRunLoop: rl forMode: NSDefaultRunLoopMode]; [clientInput open]; [clientOutput open]; end = [NSDate dateWithTimeIntervalSinceNow: 5]; while (NO == [goldData isEqualToData: testData] && [end timeIntervalSinceNow] > 0.0) { [rl runMode: NSDefaultRunLoopMode beforeDate: end]; } PASS([goldData isEqualToData: testData], "Local tcp"); if ([end timeIntervalSinceNow] < 0.0) NSLog(@"%@ timed out.\n", prefix); [clientInput setDelegate: nil]; [clientOutput setDelegate: nil]; DESTROY(serverInput); DESTROY(serverOutput); RELEASE(inner); } { CREATE_AUTORELEASE_POOL(inner); prefix = @"Test2"; [testData setLength: 0]; sli = AUTORELEASE([ServerListener new]); cli = AUTORELEASE([ClientListener new]); serverStream = [GSServerStream serverStreamToAddr: [host address] port: 1234]; [serverStream setDelegate: sli]; [serverStream open]; [serverStream scheduleInRunLoop: rl forMode: NSDefaultRunLoopMode]; [NSStream getStreamsToHost: host port: 1234 inputStream: &clientInput outputStream: &clientOutput]; NSLog(@"%@ Client input stream is %p", prefix, clientInput); NSLog(@"%@ Client output stream is %p", prefix, clientOutput); [clientInput setDelegate: cli]; [clientOutput setDelegate: cli]; [clientInput open]; [clientOutput open]; [clientInput scheduleInRunLoop: rl forMode: NSDefaultRunLoopMode]; [clientOutput scheduleInRunLoop: rl forMode: NSDefaultRunLoopMode]; end = [NSDate dateWithTimeIntervalSinceNow: 5]; while (NO == [goldData isEqualToData: testData] && [end timeIntervalSinceNow] > 0.0) { [rl runMode: NSDefaultRunLoopMode beforeDate: end]; } PASS([goldData isEqualToData: testData], "Local tcp (blocking open)"); if ([end timeIntervalSinceNow] < 0.0) NSLog(@"%@ timed out.\n", prefix); [clientInput setDelegate: nil]; [clientOutput setDelegate: nil]; DESTROY(serverInput); DESTROY(serverOutput); RELEASE(inner); } { CREATE_AUTORELEASE_POOL(inner); prefix = @"Test3"; [testData setLength: 0]; sli = AUTORELEASE([ServerListener new]); cli = AUTORELEASE([ClientListener new]); serverStream = [GSServerStream serverStreamToAddr: socketPath]; [serverStream setDelegate: sli]; [serverStream scheduleInRunLoop: rl forMode: NSDefaultRunLoopMode]; [serverStream open]; [NSStream getLocalStreamsToPath: socketPath inputStream: &clientInput outputStream: &clientOutput]; NSLog(@"%@ Client input stream is %p", prefix, clientInput); NSLog(@"%@ Client output stream is %p", prefix, clientOutput); [clientInput setDelegate: cli]; [clientOutput setDelegate: cli]; [clientInput scheduleInRunLoop: rl forMode: NSDefaultRunLoopMode]; [clientOutput scheduleInRunLoop: rl forMode: NSDefaultRunLoopMode]; [clientInput open]; [clientOutput open]; end = [NSDate dateWithTimeIntervalSinceNow: 5]; while (NO == [goldData isEqualToData: testData] && [end timeIntervalSinceNow] > 0.0) { [rl runMode: NSDefaultRunLoopMode beforeDate: end]; } PASS([goldData isEqualToData: testData], "Local socket"); if ([end timeIntervalSinceNow] < 0.0) NSLog(@"%@ timed out.\n", prefix); [clientInput setDelegate: nil]; [clientOutput setDelegate: nil]; DESTROY(serverInput); DESTROY(serverOutput); RELEASE(inner); } { CREATE_AUTORELEASE_POOL(inner); prefix = @"Test4"; [testData setLength: 0]; sli = AUTORELEASE([ServerListener new]); cli = AUTORELEASE([ClientListener new]); [[NSFileManager defaultManager] removeFileAtPath: socketPath handler: nil]; serverStream = [GSServerStream serverStreamToAddr: socketPath]; [serverStream setDelegate: sli]; [serverStream open]; [serverStream scheduleInRunLoop: rl forMode: NSDefaultRunLoopMode]; [NSStream getLocalStreamsToPath: socketPath inputStream: &clientInput outputStream: &clientOutput]; NSLog(@"%@ Client input stream is %p", prefix, clientInput); NSLog(@"%@ Client output stream is %p", prefix, clientOutput); [clientInput setDelegate: cli]; [clientOutput setDelegate: cli]; [clientInput open]; [clientOutput open]; [clientInput scheduleInRunLoop: rl forMode: NSDefaultRunLoopMode]; [clientOutput scheduleInRunLoop: rl forMode: NSDefaultRunLoopMode]; end = [NSDate dateWithTimeIntervalSinceNow: 5]; while (NO == [goldData isEqualToData: testData] && [end timeIntervalSinceNow] > 0.0) { [rl runMode: NSDefaultRunLoopMode beforeDate: end]; } PASS([goldData isEqualToData: testData], "Local socket (blocking open)"); if ([end timeIntervalSinceNow] < 0.0) NSLog(@"%@ timed out.\n", prefix); [clientInput setDelegate: nil]; [clientOutput setDelegate: nil]; DESTROY(serverInput); DESTROY(serverOutput); RELEASE(inner); } [[NSFileManager defaultManager] removeFileAtPath: socketPath handler: nil]; RELEASE(arp); return 0; } #else int main() { return 0; } #endif gnustep-base-1.29.0/Tests/base/NSString/000077500000000000000000000000001435650067400177355ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSString/NSString_base.m000066400000000000000000000005431435650067400226160ustar00rootroot00000000000000/* copyright 2004 Alexander Malmberg Test -base's cluster of NSString classes. This tests the optimized implementations of many NSString methods in GSString and its subclasses. */ #import "NSString_tests.h" #import int main(int argc,char **argv) { TestNSStringClass([NSString class]); return 0; } gnustep-base-1.29.0/Tests/base/NSString/NSString_custom.m000066400000000000000000000043061435650067400232170ustar00rootroot00000000000000/* copyright 2004 Alexander Malmberg Test that a minimal custom subclass works. This tests the generic implementations of the NSString methods in NSString itself. */ #import "NSString_tests.h" #import @interface CustomString : NSString { unichar *characters; NSUInteger length; } @end @implementation CustomString - initWithBytes: (void *)c length: (NSUInteger)l encoding: (NSStringEncoding)encoding { if (l > 0) { if (encoding == NSUnicodeStringEncoding) { characters = malloc(l); memcpy(characters, c, l); } else { NSString *s; s = [[NSString alloc] initWithBytes: c length: l encoding: encoding]; if (s == nil) return nil; l = [s length] * sizeof(unichar); characters = malloc(l); [s getCharacters: characters]; [s release]; } } length = l / sizeof(unichar); return self; } - initWithBytesNoCopy: (void *)c length: (NSUInteger)l encoding: (NSStringEncoding)encoding freeWhenDone: (BOOL)freeWhenDone { if (l > 0) { if (encoding == NSUnicodeStringEncoding) { characters = malloc(l); memcpy(characters, c, l); } else { NSString *s; s = [[NSString alloc] initWithBytesNoCopy: c length: l encoding: encoding freeWhenDone: freeWhenDone]; if (s == nil) return nil; l = [s length] * sizeof(unichar); characters = malloc(l); [s getCharacters: characters]; [s release]; } } length = l / sizeof(unichar); return self; } - initWithCharactersNoCopy: (void *)c length: (NSUInteger)l freeWhenDone: (BOOL)flag { return [self initWithBytesNoCopy: c length: l*sizeof(unichar) encoding: NSUnicodeStringEncoding freeWhenDone: flag]; } - (void) dealloc { if (characters) { free(characters); characters = NULL; } [super dealloc]; } - (NSUInteger) length { return length; } - (unichar) characterAtIndex: (NSUInteger)index { return characters[index]; } @end int main(int argc,char **argv) { TestNSStringClass([CustomString class]); return 0; } gnustep-base-1.29.0/Tests/base/NSString/NSString_tests.h000066400000000000000000000232231435650067400230410ustar00rootroot00000000000000/* copyright 2004 Alexander Malmberg portions: copyright (C) 2003 Free Software Foundation, Inc. Author: Alexander Malmberg Test whether a class is a working concrete subclass of NSString. This file should be included _once_ in a test that wants to test a particular class. */ #import "Testing.h" #import #import #import #import /* This is the main entry point to this file. Call it with a class that's supposed to be a concrete NSString subclass. */ void TestNSStringClass(Class stringClass); /* Solaris, in particular, can't handle a NULL string in a printf statement */ #define FORMAT_STRING(str) ((str) ? str : "NULL") #define IS_VALID_OBJECT(obj) (object_getClass((id)obj) != zombieClass) Class stringClass; /* Basic sanity test. */ BOOL test_initWithCString(void) { NSString *test1 = [[stringClass alloc] initWithCString: "ascii"]; NSString *sanity = @"ascii"; if (!test1) return NO; if (![sanity isEqualToString: test1]) return NO; if (![test1 isEqualToString: sanity]) return NO; if (![test1 isEqual: sanity]) return NO; return YES; } /* Test encoding and decoding in various character encodings. */ void test_encodings_helper(NSStringEncoding encoding, unsigned char *bytes, int bytes_length, unichar *characters, int characters_length) { NSData *encodedData = nil; NSString *decodedString = nil; NSData *referenceData = nil; NSString *referenceString = nil; NSStringEncoding *encodings; const char *enc; encodings = [NSString availableStringEncodings]; if (0 != encodings) { while (*encodings != 0 && *encodings != encoding) { encodings++; } } PASS(encodings != 0 && encoding == *encodings, "String encoding %d is supported", encoding); if (NO == testPassed) { return; } enc = [[NSString localizedNameOfStringEncoding: encoding] UTF8String]; referenceString = [[stringClass alloc] initWithCharacters: characters length: characters_length]; referenceData = [[NSData alloc] initWithBytes: bytes length: bytes_length]; PASS(nil != (decodedString = [[stringClass alloc] initWithData: referenceData encoding: encoding]), "can instantiate string from %s", enc); if (YES == testPassed) { PASS_EQUAL(decodedString, referenceString, "new %s string matches reference", enc); } PASS_EQUAL((encodedData = [referenceString dataUsingEncoding: encoding]), referenceData, "data using encoding %s matches reference data", enc); DESTROY(decodedString); DESTROY(referenceData); DESTROY(referenceString); } void test_encoding(void) { { NSData *d = [[NSData alloc] initWithBytes: "foo" length: 3]; NSString *s = [[stringClass alloc] initWithData: d encoding: 0]; PASS(s == nil, "-initWithData:encoding: gives nil for invalid encodings") DESTROY(d); } test_encodings_helper(NSASCIIStringEncoding, (unsigned char[]){65, 66, 67}, 3, (unichar[]){65, 66, 67}, 3); test_encodings_helper(NSUTF8StringEncoding, (unsigned char[]){65, 66, 67}, 3, (unichar[]){65, 66, 67}, 3); test_encodings_helper(NSUTF8StringEncoding, (unsigned char[]){0xc3, 0xa5, 0xc3, 0xa4, 0xc3, 0xb6, 0xd7, 0xa9, 0xd7, 0x9c, 0xd7, 0x95, 0xd7, 0x9d}, 14, (unichar[]){0xe5, 0xe4, 0xf6, 0x5e9, 0x5dc, 0x5d5, 0x5dd}, 7); /* Codepoint U+2F801 CJK Compatiblity Ideograph */ test_encodings_helper(NSUTF8StringEncoding, (unsigned char[]){0xf0, 0xaf, 0xa0, 0x81}, 4, (unichar[]){0xd87e, 0xdc01}, 2); #if defined(GNUSTEP_BASE_LIBRARY) test_encodings_helper(NSISOLatinHebrewStringEncoding, (unsigned char[]){0xf9, 0xec, 0xe5, 0xed}, 4, (unichar[]){0x5e9, 0x5dc, 0x5d5, 0x5dd}, 4); #endif test_encodings_helper(NSISOLatin1StringEncoding, (unsigned char[]){116, 101, 115, 116, 45, 229, 228, 246}, 8, (unichar[]){116, 101, 115, 116, 45, 229, 228, 246}, 8); test_encodings_helper(NSUTF8StringEncoding, (unsigned char[]){0xe0, 0xb8, 0xa0, 0xe0, 0xb8, 0xb2, 0xe0, 0xb8, 0xa9, 0xe0, 0xb8, 0xb2, 0xe0, 0xb9, 0x84, 0xe0, 0xb8, 0x97, 0xe0, 0xb8, 0xa2}, 21, (unichar[]){0xe20, 0xe32, 0xe29, 0xe32, 0xe44, 0xe17, 0xe22}, 7); /* ; (test-data-string ; '(#xc0 #xd2 #xc9 #xd2 #xe4 #xb7 #xc2) 59 ; iso-8859-11, not yet implemented ; '(#xe20 #xe32 #xe29 ; #xe32 #xe44 #xe17 ; #xe22) #t #t) */ #if defined(GNUSTEP_BASE_LIBRARY) test_encodings_helper(NSBig5StringEncoding, (unsigned char[]){0x41, 0x42, 0x43, 0x20, 0xa7, 0x41, 0xa6, 0x6e, 0x21}, 9, (unichar[]){0x41, 0x42, 0x43, 0x20, 0x4f60, 0x597d, 0x21}, 7); #endif } BOOL test_getCString_maxLength_range_remainingRange(void) { NS_DURING unsigned char *referenceBytes; int referenceBytesLength; NSString *referenceString; unsigned char buffer[16]; NSRange remainingRange; int i, j; BOOL ok = YES; switch ([NSString defaultCStringEncoding]) { case NSUTF8StringEncoding: referenceBytes =(unsigned char []){0x41, 0xc3, 0xa5, 0x42}; referenceBytesLength = 4; referenceString = [stringClass stringWithCharacters: (unichar []){0x41, 0xe5, 0x42} length: 3]; break; default: printf("Have no reference string for c-string encoding %i," " skipping test.\n", [NSString defaultCStringEncoding]); NS_VALUERETURN(YES, BOOL); } for (i = 0; i < referenceBytesLength; i++) { [referenceString getCString: buffer maxLength: i range: NSMakeRange(0, [referenceString length]) remainingRange: &remainingRange]; for (j = 0; j <= i ; j++) if (buffer[j] == 0 || buffer[j] != referenceBytes[j]) break; if (buffer[j]!= 0) { PASS(0, "-getCString: maxLength: %i range: remainingRange: failed", i); ok = NO; } } NS_VALUERETURN(ok, BOOL); NS_HANDLER printf("%s\n", POBJECT(localException)); return NO; NS_ENDHANDLER } void test_return_self_optimizations(void) { NSAutoreleasePool *arp; NSString *string, *returnValue; Class zombieClass = NSClassFromString(@"NSZombie"); arp = [NSAutoreleasePool new]; string = [[stringClass alloc] initWithCharacters: NULL length: 0]; returnValue = [string lowercaseString]; [string release]; PASS((IS_VALID_OBJECT(returnValue) && [@"" isEqual: returnValue]), "-lowercaseString returns a valid instance"); DESTROY(arp); arp = [NSAutoreleasePool new]; string = [[stringClass alloc] initWithCharacters: NULL length: 0]; returnValue = [string uppercaseString]; [string release]; PASS((IS_VALID_OBJECT(returnValue) && [@"" isEqual: returnValue]), "-uppercaseString returns a valid instance"); DESTROY(arp); arp = [NSAutoreleasePool new]; string = [[stringClass alloc] initWithCharacters: NULL length: 0]; returnValue = [string capitalizedString]; RELEASE(string); PASS((IS_VALID_OBJECT(returnValue) && [@"" isEqual: returnValue]), "-capitalizedString returns a valid instance"); DESTROY(arp); ENTER_POOL string = [[stringClass alloc] initWithCString: "helvetica" length: 9]; returnValue = [string capitalizedString]; RELEASE(string); PASS_EQUAL(returnValue, @"Helvetica", "-capitalizedString for helvetica") LEAVE_POOL ENTER_POOL string = [[stringClass alloc] initWithCString: "HeLveTica" length: 9]; returnValue = [string capitalizedString]; RELEASE(string); PASS_EQUAL(returnValue, @"Helvetica", "-capitalizedString for HeLveTica") LEAVE_POOL ENTER_POOL string = [[stringClass alloc] initWithCString: "HELVETICA" length: 9]; returnValue = [string capitalizedString]; RELEASE(string); PASS_EQUAL(returnValue, @"Helvetica", "-capitalizedString for HELVETICA") LEAVE_POOL ENTER_POOL string = [[stringClass alloc] initWithCString: "HeLLO worLd" length: 11]; returnValue = [string capitalizedString]; RELEASE(string); PASS_EQUAL(returnValue, @"Hello World", "-capitalizedString for HeLLO worLd") LEAVE_POOL arp = [NSAutoreleasePool new]; string = [[stringClass alloc] initWithCharacters: NULL length: 0]; returnValue = [string description]; PASS((IS_VALID_OBJECT(returnValue) && [@"" isEqual: returnValue]), "-description returns a valid instance"); [string release]; DESTROY(arp); arp = [NSAutoreleasePool new]; string = [[stringClass alloc] initWithCharacters: NULL length: 0]; returnValue = [string stringByExpandingTildeInPath]; [string release]; PASS([@"" isEqual: returnValue], "-stringByExpandingTildeInPath returns a valid instance (1)"); DESTROY(arp); arp = [NSAutoreleasePool new]; string = [[stringClass alloc] initWithCharacters: (unichar[]){0x41} length: 1]; returnValue = [string stringByExpandingTildeInPath]; [string release]; PASS((IS_VALID_OBJECT(returnValue) && [@"A" isEqual: returnValue]), "-stringByExpandingTildeInPath returns a valid instance (2)"); DESTROY(arp); arp = [NSAutoreleasePool new]; string = [[stringClass alloc] initWithCharacters: (unichar[]){0x41} length: 1]; returnValue = [string stringByAbbreviatingWithTildeInPath]; [string release]; PASS((IS_VALID_OBJECT(returnValue) && [@"A" isEqual: returnValue]), "-stringByAbbreviatingWithTildeInPath returns a valid instance"); DESTROY(arp); /* TODO: -stringByPaddingToLength:... -stringByResolvingSymlinksInPath -stringByTrimmingCharactersInSet: */ } void TestNSStringClass(Class aStringClass) { NSAutoreleasePool *arp = [NSAutoreleasePool new]; stringClass = aStringClass; PASS(test_initWithCString(), "-initWithCString: works"); test_encoding(); PASS(test_getCString_maxLength_range_remainingRange(), "-getCString:maxLength:range:remainingRange: works"); test_return_self_optimizations(); [arp release]; arp = nil; } gnustep-base-1.29.0/Tests/base/NSString/NSString_zero_hash.m000066400000000000000000000012621435650067400236650ustar00rootroot00000000000000/* copyright 2004 Alexander Malmberg */ #import "Testing.h" #import int main(int argc, char **argv) { NSString *s = @"!)9\" ;"; unsigned int h; /* Generate a (hopefully ASCII printable) string with a given hash. h = 0x50000000; while (h > 0) { int a,b; a = h/33; b = h%33; if (a) while (b < 32) a--, b += 33; printf("%10i = %10i * 33 + %3i '%c'\n",h,a,b,b); h = a; }*/ h = [s hash]; PASS(h != 0, "[NSConstantString hash] does not return 0"); s = [[NSString alloc] initWithString: s]; h = [s hash]; PASS(h != 0, "[NSString hash] does not return 0"); return 0; } gnustep-base-1.29.0/Tests/base/NSString/TestInfo000066400000000000000000000000001435650067400214010ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSString/basic.m000066400000000000000000000144241435650067400212010ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import static NSString* makeFormattedString(NSString *theFormat, ...) { NSString *aString; va_list args; va_start(args, theFormat); aString = [[NSString alloc] initWithFormat: theFormat arguments: args]; va_end(args); return AUTORELEASE(aString); } int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; uint8_t bytes[256]; unichar u0 = 'a'; unichar u1 = 0xfe66; int i = 256; char buf[32]; NSString *s; NSString *testObj = [NSString stringWithCString: "Hello\n"]; while (i-- > 0) { bytes[i] = (uint8_t)i; } test_alloc(@"NSString"); test_NSObject(@"NSString",[NSArray arrayWithObject:testObj]); test_NSCoding([NSArray arrayWithObject:testObj]); test_keyed_NSCoding([NSArray arrayWithObject:testObj]); test_NSCopying(@"NSString", @"NSMutableString", [NSArray arrayWithObject:testObj], NO, NO); test_NSMutableCopying(@"NSString", @"NSMutableString", [NSArray arrayWithObject:testObj]); /* Test non-ASCII strings. */ testObj = [@"\"\\U00C4\\U00DF\"" propertyList]; test_NSMutableCopying(@"NSString", @"NSMutableString", [NSArray arrayWithObject:testObj]); PASS([(s = [[NSString alloc] initWithCharacters: &u0 length: 1]) isKindOfClass: [NSString class]] && ![s isKindOfClass: [NSMutableString class]], "[NSString initWithCharacters:length:] creates immutable string for ascii"); PASS([(s = [[NSMutableString alloc] initWithCharacters: &u0 length: 1]) isKindOfClass: [NSString class]] && [s isKindOfClass: [NSMutableString class]], "[NSMutableString initWithCharacters:length:] creates mutable string for ascii"); PASS([(s = [[NSString alloc] initWithCharacters: &u1 length: 1]) isKindOfClass: [NSString class]] && ![s isKindOfClass: [NSMutableString class]], "[NSString initWithCharacters:length:] creates immutable string for unicode"); PASS([(s = [[NSMutableString alloc] initWithCharacters: &u1 length: 1]) isKindOfClass: [NSString class]] && [s isKindOfClass: [NSMutableString class]], "[NSMutableString initWithCharacters:length:] creates mutable string for unicode"); PASS_EXCEPTION([[NSString alloc] initWithString: nil];, NSInvalidArgumentException, "NSString -initWithString: does not allow nil argument"); PASS([@"he" getCString: buf maxLength: 2 encoding: NSASCIIStringEncoding]==NO, "buffer exact length fails"); PASS([@"hell" getCString: buf maxLength: 5 encoding: NSASCIIStringEncoding], "buffer length+1 works"); PASS(strcmp(buf, "hell") == 0, "getCString:maxLength:encoding"); PASS([(s = [[NSString alloc] initWithBytes: bytes length: 256 encoding: NSISOLatin1StringEncoding]) isKindOfClass: [NSString class]] && [s length] == 256, "can create latin1 string with 256 values"); PASS([(s = [[NSString alloc] initWithBytes: bytes length: 128 encoding: NSASCIIStringEncoding]) isKindOfClass: [NSString class]] && [s length] == 128, "can create ascii string with 128 values"); PASS(nil == [[NSString alloc] initWithBytes: bytes length: 256 encoding: NSASCIIStringEncoding], "reject 8bit characters in ascii"); s = [[NSString alloc] initWithBytes: bytes length: 256 encoding: NSISOLatin1StringEncoding]; s = [[NSString alloc] initWithData: [s dataUsingEncoding: NSNonLossyASCIIStringEncoding] encoding: NSASCIIStringEncoding]; PASS_EQUAL(s, @"\\000\\001\\002\\003\\004\\005\\006\\007\\010\t\n\\013\\014\r\\016\\017\\020\\021\\022\\023\\024\\025\\026\\027\\030\\031\\032\\033\\034\\035\\036\\037 !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\\177\\200\\201\\202\\203\\204\\205\\206\\207\\210\\211\\212\\213\\214\\215\\216\\217\\220\\221\\222\\223\\224\\225\\226\\227\\230\\231\\232\\233\\234\\235\\236\\237\\240\\241\\242\\243\\244\\245\\246\\247\\250\\251\\252\\253\\254\\255\\256\\257\\260\\261\\262\\263\\264\\265\\266\\267\\270\\271\\272\\273\\274\\275\\276\\277\\300\\301\\302\\303\\304\\305\\306\\307\\310\\311\\312\\313\\314\\315\\316\\317\\320\\321\\322\\323\\324\\325\\326\\327\\330\\331\\332\\333\\334\\335\\336\\337\\340\\341\\342\\343\\344\\345\\346\\347\\350\\351\\352\\353\\354\\355\\356\\357\\360\\361\\362\\363\\364\\365\\366\\367\\370\\371\\372\\373\\374\\375\\376\\377", "latin1 in lossy encoding"); NSLog(@"%lu '%s'", [s length], [s UTF8String]); RELEASE(s); s = [[NSString alloc] initWithData: [@"€" dataUsingEncoding: NSNonLossyASCIIStringEncoding] encoding: NSASCIIStringEncoding]; PASS_EQUAL(s, @"\\u20ac", "euro in lossy encoding"); RELEASE(s); s = [[NSString alloc] initWithBytes: "\\" length: 1 encoding: NSNonLossyASCIIStringEncoding]; PASS(nil == s, "lossy single backslash is invalid"); s = [[NSString alloc] initWithBytes: "\\r" length: 2 encoding: NSNonLossyASCIIStringEncoding]; PASS(nil == s, "lossy backslash-r is invalid"); s = [[NSString alloc] initWithBytes: "\\\\" length: 2 encoding: NSNonLossyASCIIStringEncoding]; PASS_EQUAL(s, @"\\", "lossy backslash-backslash is backslash"); RELEASE(s); s = [[NSString alloc] initWithBytes: "\\101" length: 4 encoding: NSNonLossyASCIIStringEncoding]; PASS_EQUAL(s, @"A", "lossy backslassh-101 is A"); RELEASE(s); s = [[NSString alloc] initWithBytes: "\\u20ac" length: 6 encoding: NSNonLossyASCIIStringEncoding]; PASS_EQUAL(s, @"€", "lossy backslassh-u20ac is a euro"); RELEASE(s); s = makeFormattedString(@"%d.%d%s", 10, 20, "hello"); PASS_EQUAL(s, @"10.20hello", "simple intWithFormat: works"); PASS([@"" isEqual: nil] == NO, "an empty string is not null"); PASS([@"" isEqualToString: nil] == NO, "an empty string is not null"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSString/bom.m000066400000000000000000000065311435650067400206750ustar00rootroot00000000000000/* Copyright (C) 2006 Free SoftwareFoundation, Inc. Written by: David Ayers Date: March 2006 This file is part of the GNUstep Base Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ /* Testing of Various Byte Order Markers. */ #import "Testing.h" #import int main(int argc, char **argv) { NSAutoreleasePool *pool = [NSAutoreleasePool new]; NSString *file=@"utf8bom.txt"; NSString *contents; NSData *data; contents = [NSString stringWithContentsOfFile: file]; PASS([contents hasPrefix: @"This"], "stringWithContentsOfFile: UTF-8 BOM"); data = [NSData dataWithContentsOfFile: file]; contents = [[[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding] autorelease]; PASS([contents hasPrefix: @"This"], "initWithData:encoding: UTF-8 BOM"); data = [@"a" dataUsingEncoding: NSUTF8StringEncoding]; PASS([data length] == 1, "utf8 no bom") data = [@"a" dataUsingEncoding: NSUnicodeStringEncoding]; PASS([data length] == 4, "unicode has bom") data = [@"a" dataUsingEncoding: NSUTF16BigEndianStringEncoding]; PASS([data length] == 2, "utf16 big endian no bom") data = [@"a" dataUsingEncoding: NSUTF16LittleEndianStringEncoding]; PASS([data length] == 2, "utf16 little endian no bom") data = [@"a" dataUsingEncoding: NSUTF16StringEncoding]; PASS([data length] == 4, "utf16 has bom") data = [@"a" dataUsingEncoding: NSUTF32BigEndianStringEncoding]; PASS([data length] == 4, "utf32 big endian no bom") data = [@"a" dataUsingEncoding: NSUTF32LittleEndianStringEncoding]; PASS([data length] == 4, "utf32 little endian no bom") data = [@"a" dataUsingEncoding: NSUTF32StringEncoding]; PASS([data length] == 8, "utf32 has bom") data = [@"" dataUsingEncoding: NSUTF8StringEncoding]; PASS([data length] == 0, "utf8 empty no bom") data = [@"" dataUsingEncoding: NSUnicodeStringEncoding]; PASS([data length] == 2, "unicode empty has bom") data = [@"" dataUsingEncoding: NSUTF16BigEndianStringEncoding]; PASS([data length] == 0, "utf16 big endian empty no bom") data = [@"" dataUsingEncoding: NSUTF16LittleEndianStringEncoding]; PASS([data length] == 0, "utf16 little endian empty no bom") data = [@"" dataUsingEncoding: NSUTF16StringEncoding]; PASS([data length] == 2, "utf16 empty has bom") data = [@"" dataUsingEncoding: NSUTF32BigEndianStringEncoding]; PASS([data length] == 0, "utf32 big endian empty no bom") data = [@"" dataUsingEncoding: NSUTF32LittleEndianStringEncoding]; PASS([data length] == 0, "utf32 little endian empty no bom") data = [@"" dataUsingEncoding: NSUTF32StringEncoding]; PASS([data length] == 4, "utf32 empty has bom") [pool release]; return 0; } gnustep-base-1.29.0/Tests/base/NSString/boolValue.m000066400000000000000000000031741435650067400220500ustar00rootroot00000000000000/* copyright 2008 David Ayers Tests that boolValue of certain strings return the correct value. */ #import "Testing.h" #import #import int main(int argc, char **argv) { NSString *constantStringY[]={ @"y",@"Y",@"t",@"T",@"1",@"9", @"-y",@"-Y",@"-t",@"-T",@"-1",@"-9", @"Yes",@"YES",@"yes" }; NSString *constantStringN[]={ @"n",@"N",@"f",@"F",@"0",@"00", @"-n",@"-N",@"-f",@"-F",@"-0",@"-00", @"No",@"NO",@"no", @"0.0",@"0,0", @"0.1",@"0,1" }; NSString *normalString; NSMutableString *mutableString; unsigned i; [NSAutoreleasePool new]; for (i=0;i<(sizeof(constantStringY)/sizeof(constantStringY[0]));i++) { PASS([constantStringY[i] boolValue] == YES, "constant:%s == YES", [constantStringY[i] lossyCString]); PASS([constantStringN[i] boolValue] == NO, "constant:%s == NO", [constantStringN[i] lossyCString]); normalString = [NSString stringWithString:constantStringY[i]]; PASS([normalString boolValue] == YES, "normal:%s == YES", [normalString lossyCString]); normalString = [NSString stringWithString:constantStringN[i]]; PASS([normalString boolValue] == NO, "normal:%s == NO", [normalString lossyCString]); mutableString = (id)[NSMutableString stringWithString:constantStringY[i]]; PASS([mutableString boolValue] == YES, "mutable:%s == YES", [mutableString lossyCString]); mutableString = (id)[NSMutableString stringWithString:constantStringN[i]]; PASS([mutableString boolValue] == NO, "mutable:%s == NO", [mutableString lossyCString]); } return 0; } gnustep-base-1.29.0/Tests/base/NSString/locale.m000066400000000000000000000237341435650067400213630ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import #import #if defined(GS_USE_ICU) #define NSLOCALE_SUPPORTED GS_USE_ICU #else #define NSLOCALE_SUPPORTED 1 /* Assume Apple support */ #endif static void testBasic(void) { NSComparisonResult compRes; NSRange range; range = [@"ababa" rangeOfString: @"b" options: 0 range: NSMakeRange(2, 3) locale: [[[NSLocale alloc] initWithLocaleIdentifier: @"en_US"] autorelease]]; PASS(NSEqualRanges(NSMakeRange(3,1), range), "expected {3,1}, got {%d, %d}", (int)range.location, (int)range.length); compRes = [@"hello" compare: @"Hello"]; PASS(compRes == NSOrderedDescending, "expected 1 got %d", (int)compRes); compRes = [@"H" compare: @"i"]; PASS(compRes == NSOrderedAscending, "expected -1 got %d", (int)compRes); compRes = [@"h" compare: @"H"]; PASS(compRes == NSOrderedDescending, "expected 1 got %d", (int)compRes); compRes = [@"hello" compare: @"Hello" options: 0 range: NSMakeRange(0, 5) locale: nil]; PASS(compRes == NSOrderedDescending, "expected 1 got %d", (int)compRes); compRes = [@"h" compare: @"H" options: 0 range: NSMakeRange(0, 1) locale: nil]; PASS(compRes == NSOrderedDescending, "expected 1 got %d", (int)compRes); compRes = [@"hello" compare: @"H" options: 0 range: NSMakeRange(0, 1) locale: nil]; PASS(compRes == NSOrderedDescending, "expected 1 got %d", (int)compRes); compRes = [@"a" compare: @"Z"]; PASS(compRes == NSOrderedDescending, "expected 1 got %d", (int)compRes); compRes = [@"z" compare: @"A"]; PASS(compRes == NSOrderedDescending, "expected 1 got %d", (int)compRes); compRes = [@"a" localizedCompare: @"Z"]; PASS(compRes == NSOrderedAscending, "expected -1 got %d", (int)compRes); compRes = [@"z" localizedCompare: @"A"]; PASS(compRes == NSOrderedDescending, "expected 1 got %d", (int)compRes); // These two may be considered implementation details { BOOL wasHopeful = testHopeful; testHopeful = YES; compRes = [@"hello" compare: @"Hello" options: 0 range: NSMakeRange(0, 5) locale: [[[NSLocale alloc] initWithLocaleIdentifier: @"en_US_POSIX"] autorelease]]; PASS(compRes == NSOrderedDescending, "expected 1 got %d", (int)compRes); compRes = [@"hello" compare: @"Hello" options: 0 range: NSMakeRange(0, 5) locale: [NSLocale systemLocale]]; PASS(compRes == NSOrderedAscending, "expected -1 got %d", (int)compRes); testHopeful = wasHopeful; } compRes = [@"hello" compare: @"Hello" options: 0 range: NSMakeRange(0, 5) locale: [[[NSLocale alloc] initWithLocaleIdentifier: @"en_US"] autorelease]]; PASS(compRes == NSOrderedAscending, "expected -1 got %d", (int)compRes); compRes = [@"hello" localizedCompare: @"Hello"]; PASS(compRes == NSOrderedAscending, "expected -1 got %d", (int)compRes); compRes = [@"H" localizedCompare: @"i"]; PASS(compRes == NSOrderedAscending, "expected -1 got %d", (int)compRes); } static void testEszett(void) { NSComparisonResult compRes; NSRange range; const unichar EszettChar = 0x00df; NSString *EszettStr = [[[NSString alloc] initWithCharacters: &EszettChar length: 1] autorelease]; NSString *EszettPrefixStr = [EszettStr stringByAppendingString: @"abcdef"]; NSString *EszettSuffixStr = [@"abcdef" stringByAppendingString: EszettStr]; NSString *EszettPrefixSuffixStr = [NSString stringWithFormat: @"%@abcdef%@", EszettStr, EszettStr]; // test compare: compRes = [EszettStr compare: @"Ss" options: NSCaseInsensitiveSearch range: NSMakeRange(0, 1)]; PASS(compRes == 0, "Ss compares equal to Eszett character with" " NSCaseInsensitiveSearch. got %d", (int)compRes); compRes = [EszettStr compare: @"S" options: 0 range: NSMakeRange(0, 1)]; PASS(compRes == 1, "Eszett compare: S is NSOrderedDescending. got %d", (int)compRes); compRes = [EszettStr compare: @"s" options: 0 range: NSMakeRange(0, 1)]; PASS(compRes == 1, "Eszett compare: s is NSOrderedDescending. got %d", (int)compRes); // test rangeOfString: range = [EszettPrefixStr rangeOfString: @"sS" options: NSCaseInsensitiveSearch range: NSMakeRange(0, 7)]; PASS(NSEqualRanges(range, NSMakeRange(0, 1)), "with NSCaseInsensitiveSearch range of sS" " in abcdef is {0,1}. got {%d,%d}", (int)range.location, (int)range.length); range = [EszettPrefixStr rangeOfString: @"sS" options: 0 range: NSMakeRange(0, 7)]; PASS(NSEqualRanges(range, NSMakeRange(NSNotFound, 0)), "without NSCaseInsensitiveSearch, " "range of sS in abcdef is {NSNotFound, 0}. got {%d,%d}", (int)range.location, (int)range.length); range = [EszettPrefixStr rangeOfString: @"sS" options: NSCaseInsensitiveSearch | NSAnchoredSearch | NSBackwardsSearch range: NSMakeRange(0, 7)]; PASS(NSEqualRanges(range, NSMakeRange(NSNotFound, 0)), "for anchored backwards search, " "range of sS in abcdef is {NSNotFound, 0}. got {%d,%d}", (int)range.location, (int)range.length); range = [EszettPrefixStr rangeOfString: @"sS" options: NSCaseInsensitiveSearch | NSAnchoredSearch range: NSMakeRange(0, 7)]; PASS(NSEqualRanges(range, NSMakeRange(0, 1)), "for anchored forwards search, " "range of sS in abcdef is {0, 1}. got {%d,%d}", (int)range.location, (int)range.length); range = [EszettSuffixStr rangeOfString: @"sS" options: NSCaseInsensitiveSearch | NSAnchoredSearch | NSBackwardsSearch range: NSMakeRange(0, 7)]; PASS(NSEqualRanges(range, NSMakeRange(6, 1)), "for anchored backwards search, " "range of sS in abcdef is {6, 1}. got {%d,%d}", (int)range.location, (int)range.length); range = [EszettPrefixSuffixStr rangeOfString: @"sS" options: NSCaseInsensitiveSearch range: NSMakeRange(0, 8)]; PASS(NSEqualRanges(range, NSMakeRange(0, 1)), "for forward search, " "range of sS in abcdef is {0, 1}. got {%d,%d}", (int)range.location, (int)range.length); range = [EszettPrefixSuffixStr rangeOfString: @"sS" options: NSCaseInsensitiveSearch | NSBackwardsSearch range: NSMakeRange(0, 8)]; PASS(NSEqualRanges(range, NSMakeRange(7, 1)), "for backward search, " "range of sS in abcdef is {7, 1}. got {%d,%d}", (int)range.location, (int)range.length); } static void testLithuanian(void) { // "in Lithuanian, "y" is sorted between "i" and "k"." // -- http://userguide.icu-project.org/collation NSComparisonResult compRes; compRes = [@"y" compare: @"k" options: 0 range: NSMakeRange(0,1) locale: nil]; PASS(compRes == NSOrderedDescending, "y>k in nil locale. comparison result: %d", (int)compRes); compRes = [@"y" compare: @"k" options: 0 range: NSMakeRange(0,1) locale: [[[NSLocale alloc] initWithLocaleIdentifier: @"lt"] autorelease]]; PASS(compRes == NSOrderedAscending, "y int main(int argc, char **argv) { NSString *str; unichar u; unichar u2[2]; u = (unichar)0xfdd0; str = [[NSString alloc] initWithCharacters: &u length: 1]; PASS([str length] == 1, "fdd0 codepoint is permitted in string"); PASS([str characterAtIndex: 0] == 0xfdd0, "fdd0 is returned properly"); [str release]; u = (unichar)0xfdef; str = [[NSString alloc] initWithCharacters: &u length: 1]; PASS([str length] == 1, "fdef codepoint is permitted in string"); PASS([str characterAtIndex: 0] == 0xfdef, "fdef is returned properly"); [str release]; u = (unichar)0xfffd; str = [[NSString alloc] initWithCharacters: &u length: 1]; PASS([str length] == 1, "fffd codepoint is permitted in string"); PASS([str characterAtIndex: 0] == 0xfffd, "fffd is returned properly"); [str release]; /* eth, so that we don't have the BOM as the first character (it would be * removed) */ u2[0] = (unichar)0x00f0; /* BOM as second non-character codepoint should be allowed */ u2[1] = (unichar)0xfffe; str = [[NSString alloc] initWithCharacters: u2 length: 2]; PASS([str length] == 2, "fffe codepoint is permitted in string"); PASS([str characterAtIndex: 1] == 0xfffe, "fffe is returned properly"); [str release]; u = (unichar)0xffff; str = [[NSString alloc] initWithCharacters: &u length: 1]; PASS([str length] == 1, "ffff codepoint is permitted in string"); PASS([str characterAtIndex: 0] == 0xffff, "ffff is returned properly"); [str release]; return 0; } gnustep-base-1.29.0/Tests/base/NSString/nuls_in_strings.m000066400000000000000000000015451435650067400233400ustar00rootroot00000000000000/* copyright 2004 Alexander Malmberg Tests that nul characters are handled correctly in strings and string constants. */ #import "Testing.h" #import int main(int argc, char **argv) { NSString *constantString=@"a\0b"; NSString *normalString; unichar characters[3]={'a',0,'b'}; NSRange r; normalString = [[NSString alloc] initWithCharacters: characters length: 3]; PASS([constantString length] == 3, "nuls in constant strings"); PASS([normalString length] == 3, "nuls in non-constant strings"); PASS([constantString hash] == [normalString hash], "hashes match"); PASS([normalString isEqual: constantString] && [constantString isEqual: normalString], "compare as equal"); r = [normalString rangeOfString: @"\0"]; PASS(1 == r.length && 1 == r.location, "find nul in string"); return 0; } gnustep-base-1.29.0/Tests/base/NSString/order.m000066400000000000000000000035441435650067400212340ustar00rootroot00000000000000/* Copyright (C) 2008 Free SoftwareFoundation, Inc. */ /* Testing of Various Byte Order conversion. */ #import "Testing.h" #import int main(int argc, char **argv) { NSAutoreleasePool *pool = [NSAutoreleasePool new]; NSString *s1 = @"A"; NSString *s2; NSData *d; const uint8_t *b; d = [s1 dataUsingEncoding: NSUTF16BigEndianStringEncoding]; b = [d bytes]; PASS([d length] > 1 && b[0] == 0 && b[1] == 65, "UTF-16 BE OK"); if (testPassed) { s2 = [[NSString alloc] initWithBytes: b length: 2 encoding: NSUTF16BigEndianStringEncoding]; PASS([s1 isEqual: s2], "UTF-16 BE reverse OK"); [s2 release]; } d = [s1 dataUsingEncoding: NSUTF16LittleEndianStringEncoding]; b = [d bytes]; PASS([d length] > 1 && b[0] == 65 && b[1] == 0, "UTF-16 LE OK"); if (testPassed) { s2 = [[NSString alloc] initWithBytes: b length: 2 encoding: NSUTF16LittleEndianStringEncoding]; PASS([s1 isEqual: s2], "UTF-16 LE reverse OK"); [s2 release]; } d = [s1 dataUsingEncoding: NSUTF32BigEndianStringEncoding]; b = [d bytes]; PASS([d length] > 3 && b[0] == 0 && b[1] == 0 && b[2] == 0 && b[3] == 65, "UTF-32 BE OK"); if (testPassed) { s2 = [[NSString alloc] initWithBytes: b length: 4 encoding: NSUTF32BigEndianStringEncoding]; PASS([s1 isEqual: s2], "UTF-32 BE reverse OK"); [s2 release]; } d = [s1 dataUsingEncoding: NSUTF32LittleEndianStringEncoding]; b = [d bytes]; PASS([d length] > 3 && b[0] == 65 && b[1] == 0 && b[2] == 0 && b[3] == 0, "UTF-32 LE OK"); if (testPassed) { s2 = [[NSString alloc] initWithBytes: b length: 4 encoding: NSUTF32LittleEndianStringEncoding]; PASS([s1 isEqual: s2], "UTF-32 LE reverse OK"); [s2 release]; } [pool release]; return 0; } gnustep-base-1.29.0/Tests/base/NSString/pairs.m000066400000000000000000000031541435650067400212340ustar00rootroot00000000000000#import #import #import "ObjectTesting.h" int main(void) { [NSAutoreleasePool new]; START_SET("NSString + surrogate pairs") NSString *smiley; NSMutableString *mutable; const uint8_t *utf8; smiley = @"😀"; PASS([smiley length] == 2, "Smiley is a pair of characters") PASS([smiley characterAtIndex: 0] == 0xD83D, "Smiley first is 0xD83D") PASS([smiley characterAtIndex: 1] == 0xDE00, "Smiley second is 0xDE00") utf8 = (const uint8_t *)[smiley UTF8String]; PASS(strlen(utf8) == 4, "Smiley UTF8 length correct") PASS(0xF0 == utf8[0], "Smiley UTF8 first byte OK") PASS(0x9F == utf8[1], "Smiley UTF8 second byte OK") PASS(0x98 == utf8[2], "Smiley UTF8 third byte OK") PASS(0x80 == utf8[3], "Smiley UTF8 fourth byte OK") PASS([smiley canBeConvertedToEncoding: NSISOLatin1StringEncoding] == NO, "smiley cannot be converted to ISO Latin-1 encoding") mutable = AUTORELEASE([smiley mutableCopy]); PASS([mutable length] == 2, "Smiley copy is a pair of characters") PASS([mutable characterAtIndex: 0] == 0xD83D, "Smiley copy first is 0xD83D") PASS([mutable characterAtIndex: 1] == 0xDE00, "Smiley copy second is 0xDE00") utf8 = (const uint8_t *)[mutable UTF8String]; PASS(strlen(utf8) == 4, "Smiley copy UTF8 length correct") PASS(0xF0 == utf8[0], "Smiley copy UTF8 first byte OK") PASS(0x9F == utf8[1], "Smiley copy UTF8 second byte OK") PASS(0x98 == utf8[2], "Smiley copy UTF8 third byte OK") PASS(0x80 == utf8[3], "Smiley copy UTF8 fourth byte OK") END_SET("NSString + surrogate pairs") return 0; } gnustep-base-1.29.0/Tests/base/NSString/regex.m000066400000000000000000000026621435650067400212330ustar00rootroot00000000000000#import #import #import "ObjectTesting.h" int main(void) { [NSAutoreleasePool new]; START_SET("NSString + regex") #if !(__APPLE__ || GS_USE_ICU) SKIP("NSRegularExpression not built, please install libicu") #else NSRegularExpression *expr; NSString *regex; NSString *source; NSInteger index; NSRange r; source = @"abcdddddd e f g"; regex = @"abcd*"; r = [source rangeOfString: regex options: NSRegularExpressionSearch]; PASS(r.length == 9, "Correct length for regex, expected 9 got %d", (int)r.length); regex = @"aBcD*"; r = [source rangeOfString: regex options: (NSRegularExpressionSearch | NSCaseInsensitiveSearch)]; PASS(r.length == 9, "Correct length for regex, expected 9 got %d", (int)r.length); source = @"h1. Real Acme\n\n||{noborder}{left}Item||{right}Price||\n|Testproduct|{right}2 x $59.50|\n| |{right}net amount: $100.00|\n| |{right}total amount: $119.00|\n\n\nh2. Thanks for your purchase!\n\n\n"; expr = [NSRegularExpression regularExpressionWithPattern: @"h[123]\\. " options: NSRegularExpressionCaseInsensitive error: NULL]; index = 33; NSLog(@"%@", [expr firstMatchInString: source options: NSMatchingAnchored range: NSMakeRange(index, [source length] - index - 1)]); #endif END_SET("NSString + regex") return 0; } gnustep-base-1.29.0/Tests/base/NSString/test00.m000066400000000000000000000470321435650067400212400ustar00rootroot00000000000000#import "Testing.h" #import "ObjectTesting.h" #import #import #import #ifdef GNUSTEP_BASE_LIBRARY @interface NSString (Test) - (NSString*) _unicodeString; @end #endif static BOOL rangesEqual(NSRange r1, NSRange r2) { if (&r1 == &r2) return YES; if (r1.length == 0 && r2.length == 0) return YES; return (r1.length == r2.length && r1.location == r2.location); } static void strCompare (char *s0, char *s1, NSComparisonResult ci, NSComparisonResult cs, NSComparisonResult lci, NSComparisonResult lcs, NSRange ra) { NSString *cs0, *cs1, *us0, *us1; /* cstrings and unicode strings */ NSMutableData *d; unichar *b; int l; int opts; char *txt,*type; NSComparisonResult want, res; cs0 = nil; cs1 = nil; us0 = nil; us1 = nil; PASS_RUNS(cs0 = [NSString stringWithCString: s0]; l = [cs0 length]; d = [NSMutableData dataWithLength: (l * 2)]; b = [d mutableBytes]; [cs0 getCharacters: b]; us0 = [NSString stringWithCharacters: b length: l]; cs1 = [NSString stringWithCString: s1]; l = [cs1 length]; d = [NSMutableData dataWithLength: (l * 2)]; b = [d mutableBytes]; [cs1 getCharacters: b]; us1 = [NSString stringWithCharacters: b length: l];, "create strings for compare is ok"); opts = NSCaseInsensitiveSearch; type = "case insensitive comparison for"; switch (ci) { case NSOrderedAscending: txt = "NSOrderedAscending"; break; case NSOrderedDescending: txt = "NSOrderedDescending"; break; case NSOrderedSame: txt = "NSOrderedSame"; break; default: txt = ""; } want = ci; res = [cs0 compare: cs1 options: opts range: ra]; PASS(res == want, "CCString %s '%s' and '%s' %s ", type, s0, s1, txt); res = [us0 compare: us1 options: opts range: ra]; PASS(res == want, "UUString %s '%s' and '%s' %s ", type, s0, s1, txt); res = [us0 compare: cs1 options: opts range: ra]; PASS(res == want, "UCString %s '%s' and '%s' %s ", type, s0, s1, txt); res = [cs0 compare: us1 options: opts range: ra]; PASS(res == want, "CUString %s '%s' and '%s' %s ", type, s0, s1, txt); opts = 0; type = "case sensitive comparison for"; switch (cs) { case NSOrderedAscending: txt = "NSOrderedAscending"; break; case NSOrderedDescending: txt = "NSOrderedDescending"; break; case NSOrderedSame: txt = "NSOrderedSame"; break; } want = cs; res = [cs0 compare: cs1 options: opts range: ra]; PASS(res == want, "CCString %s '%s' and '%s' %s ", type, s0, s1, txt); res = [us0 compare: us1 options: opts range: ra]; PASS(res == want, "UUString %s '%s' and '%s' %s ", type, s0, s1, txt); res = [us0 compare: cs1 options: opts range: ra]; PASS(res == want, "UCString %s '%s' and '%s' %s ", type, s0, s1, txt); res = [cs0 compare: us1 options: opts range: ra]; PASS(res == want, "CUString %s '%s' and '%s' %s ", type, s0, s1, txt); opts = NSCaseInsensitiveSearch | NSLiteralSearch; type = "case insensitive literal comparison for"; switch (lci) { case NSOrderedAscending: txt = "NSOrderedAscending"; break; case NSOrderedDescending: txt = "NSOrderedDescending"; break; case NSOrderedSame: txt = "NSOrderedSame"; break; } want = lci; res = [cs0 compare: cs1 options: opts range: ra]; PASS(res == want, "CCString %s '%s' and '%s' %s ", type, s0, s1, txt); res = [us0 compare: us1 options: opts range: ra]; PASS(res == want, "UUString %s '%s' and '%s' %s ", type, s0, s1, txt); res = [us0 compare: cs1 options: opts range: ra]; PASS(res == want, "UCString %s '%s' and '%s' %s ", type, s0, s1, txt); res = [cs0 compare: us1 options: opts range: ra]; PASS(res == want, "CUString %s '%s' and '%s' %s ", type, s0, s1, txt); opts = NSLiteralSearch; type = "case sensitive literal comparison for"; switch (lcs) { case NSOrderedAscending: txt = "NSOrderedAscending"; break; case NSOrderedDescending: txt = "NSOrderedDescending"; break; case NSOrderedSame: txt = "NSOrderedSame"; break; } want = lcs; res = [cs0 compare: cs1 options: opts range: ra]; PASS(res == want, "CCString %s '%s' and '%s' %s ", type, s0, s1, txt); res = [us0 compare: us1 options: opts range: ra]; PASS(res == want, "UUString %s '%s' and '%s' %s ", type, s0, s1, txt); res = [us0 compare: cs1 options: opts range: ra]; PASS(res == want, "UCString %s '%s' and '%s' %s ", type, s0, s1, txt); res = [cs0 compare: us1 options: opts range: ra]; PASS(res == want, "CUString %s '%s' and '%s' %s ", type, s0, s1, txt); } static void strRange(char *s0, char *s1, unsigned int opts, NSRange range, NSRange want) { NSString *cs0, *cs1, *us0, *us1 = nil; /* cstrings and unicode strings */ NSMutableData *d; unichar *b; int l; NSRange res; cs0 = nil; cs1 = nil; us0 = nil; us1 = nil; #ifdef GNUSTEP_BASE_LIBRARY /* The _unicodeString method is a private/hidden method the strings in the * base library provide to return an autorelease copy of themselves which * is guaranteed to use a 16bit internal character representation and be a * subclass of GSUnicodeString. */ PASS_RUNS(cs0 = [NSString stringWithCString: s0]; us0 = [cs0 _unicodeString]; cs1 = [NSString stringWithCString: s1]; us1 = [cs1 _unicodeString];, "create strings for range is ok"); #else PASS_RUNS(cs0 = [NSString stringWithCString: s0]; l = [cs0 length]; d = [NSMutableData dataWithLength: (l * 2)]; b = [d mutableBytes]; [cs0 getCharacters: b]; us0 = [NSString stringWithCharacters: b length: l]; cs1 = [NSString stringWithCString: s1]; l = [cs1 length]; d = [NSMutableData dataWithLength: (l * 2)]; b = [d mutableBytes]; [cs1 getCharacters: b]; us1 = [NSString stringWithCharacters: b length: l];, "create strings for range is ok"); #endif res = [cs0 rangeOfString: cs1 options: opts range: range]; PASS(rangesEqual(res,want), "CCString range for '%s' and '%s' is ok",s0,s1); res = [us0 rangeOfString: us1 options: opts range: range]; PASS(rangesEqual(res,want), "UUString range for '%s' and '%s' is ok",s0,s1); res = [us0 rangeOfString: cs1 options: opts range: range]; PASS(rangesEqual(res,want), "UCString range for '%s' and '%s' is ok",s0,s1); res = [cs0 rangeOfString: us1 options: opts range: range]; PASS(rangesEqual(res,want), "CUString range for '%s' and '%s' is ok",s0,s1); } static void strRangeFromSet(char *s, NSCharacterSet *c, unsigned int o, NSRange range, NSRange want) { NSString *cs0, *cs1, *us0, *us1 = nil; /* cstrings and unicode strings */ NSMutableData *d; unichar *b; int l; NSRange res; cs0 = nil; cs1 = nil; us0 = nil; us1 = nil; PASS_RUNS(cs0 = [NSString stringWithCString: s]; l = [cs0 length]; d = [NSMutableData dataWithLength: (l * 2)]; b = [d mutableBytes]; [cs0 getCharacters: b]; us0 = [NSString stringWithCharacters: b length: l]; cs1 = [NSMutableString stringWithCString: s]; l = [cs1 length]; d = [NSMutableData dataWithLength: (l * 2)]; b = [d mutableBytes]; [cs1 getCharacters: b]; us1 = [NSMutableString stringWithCharacters: b length: l];, "create strings for range"); res = [cs0 rangeOfCharacterFromSet: c options: o range: range]; PASS(rangesEqual(res,want), "CString range for '%s' is ok",s); res = [us0 rangeOfCharacterFromSet: c options: o range: range]; PASS(rangesEqual(res,want), "UString range for '%s' is ok",s); res = [cs1 rangeOfCharacterFromSet: c options: o range: range]; PASS(rangesEqual(res,want), "MCString range for '%s' is ok",s); res = [us1 rangeOfCharacterFromSet: c options: o range: range]; PASS(rangesEqual(res,want), "MUString range for '%s' is ok",s); } static void testLineRange(char *s, NSRange range, NSRange want) { NSRange res; NSString *cs0; int l; cs0 = [NSString stringWithCString: s]; l = [cs0 length]; res = [cs0 lineRangeForRange: range]; PASS(rangesEqual(res,want), "lineRangeForRange: with '%s' is ok",s); } int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSString *str; NSString *sub; const char *ptr; char buf[10]; str = @"a"; while ([str length] < 30000) { str = [str stringByAppendingString: str]; } if (0 == [str length] % 2) { str = [str stringByAppendingString: @"x"]; } ptr = [str cStringUsingEncoding: NSASCIIStringEncoding]; PASS_EXCEPTION([NSString stringWithUTF8String: 0], NSInvalidArgumentException, "stringWithUTF8String raises for NULL"); PASS_EXCEPTION([NSString stringWithCString: 0 encoding: NSASCIIStringEncoding], NSInvalidArgumentException, "initWithCString raises for NULL"); PASS_EXCEPTION([@"Hello" substringWithRange: NSMakeRange(6,4)];, NSRangeException, "NSString extracting substring with range beyond end of string"); PASS_EXCEPTION([@"Hello" compare: @"Hello" options: NSLiteralSearch range: NSMakeRange(4,3)];, NSRangeException, "NSString comparison with range beyond end of string"); PASS_EQUAL([@"a\"b" description], @"a\"b", "the description of a string is itsself"); strCompare("hello", "hello", NSOrderedSame, NSOrderedSame, NSOrderedSame, NSOrderedSame,NSMakeRange(0,5)); strCompare("", "",NSOrderedSame, NSOrderedSame, NSOrderedSame, NSOrderedSame, NSMakeRange(0,0)); strCompare("hello", "Hello", NSOrderedSame, NSOrderedDescending, NSOrderedSame, NSOrderedDescending,NSMakeRange(0,5)); strCompare("Hello", "hello", NSOrderedSame, NSOrderedAscending, NSOrderedSame, NSOrderedAscending, NSMakeRange(0,5)); strCompare("abc", "ab", NSOrderedDescending, NSOrderedDescending, NSOrderedDescending, NSOrderedDescending, NSMakeRange(0,3)); strCompare("ab", "abc", NSOrderedAscending, NSOrderedAscending, NSOrderedAscending, NSOrderedAscending, NSMakeRange(0,2)); strCompare("", "a", NSOrderedAscending, NSOrderedAscending, NSOrderedAscending, NSOrderedAscending, NSMakeRange(0,0)); strCompare("a", "", NSOrderedDescending, NSOrderedDescending, NSOrderedDescending, NSOrderedDescending, NSMakeRange(0,1)); strCompare("a", "", NSOrderedSame, NSOrderedSame, NSOrderedSame, NSOrderedSame, NSMakeRange(0,0)); strCompare("Location", "LoCaTiOn", NSOrderedSame, NSOrderedDescending, NSOrderedSame, NSOrderedDescending, NSMakeRange(0,8)); strCompare("1234567890_!@$%^&*()QWERTYUIOP{}ASDFGHJKL:;'ZXCVBNM,./<>?", "1234567890_!@$%^&*()qwertyuiop{}asdfghjkl:;'zxcvbnm,./<>?", NSOrderedSame, NSOrderedAscending, NSOrderedSame, NSOrderedAscending, NSMakeRange(0,57)); strCompare("1234567890_!@$%^&*()QWERTYUIOP{}ASDFGHJKL:;'ZXCVBNM,./<>?", "1234567890_!@$%^&*()qwertyuiop{}asdfghjkl:;'zxcvbnm,./<>", NSOrderedSame, NSOrderedAscending, NSOrderedSame, NSOrderedAscending, NSMakeRange(0,56)); strCompare("1234567890_!@$%^&*()QWERTYUIOP{}ASDFGHJKL:;'ZXCVBNM,./<>?", "1234567890_!@$%^&*()qwertyuiop{}asdfghjkl:;'zxcvbnm,./<>?", NSOrderedAscending, NSOrderedAscending, NSOrderedAscending, NSOrderedAscending, NSMakeRange(0,56)); strCompare("abcdefg", "ABCDEFG", NSOrderedSame, NSOrderedDescending, NSOrderedSame, NSOrderedDescending, NSMakeRange(0, 7)); strCompare("abcdefg", "CDE", NSOrderedSame, NSOrderedDescending, NSOrderedSame, NSOrderedDescending, NSMakeRange(2,3)); strCompare("abcdefg", "CDEF", NSOrderedAscending, NSOrderedDescending, NSOrderedAscending, NSOrderedDescending, NSMakeRange(2,3)); strRange("hello", "hello", NSAnchoredSearch, NSMakeRange(0,5), NSMakeRange(0,5)); strRange("hello", "hello", NSAnchoredSearch | NSBackwardsSearch, NSMakeRange(0,5), NSMakeRange(0,5)); strRange("hello", "hElLo", NSLiteralSearch, NSMakeRange(0,5), NSMakeRange(NSNotFound,0)); strRange("hello", "hElLo", NSCaseInsensitiveSearch, NSMakeRange(0,5), NSMakeRange(0,5)); strRange("hello", "hell", NSAnchoredSearch, NSMakeRange(0,5), NSMakeRange(0,4)); strRange("hello", "hel", NSBackwardsSearch, NSMakeRange(0,5), NSMakeRange(0,3)); strRange("hello", "he", NSLiteralSearch, NSMakeRange(0,5), NSMakeRange(0,2)); strRange("hello", "h", NSLiteralSearch, NSMakeRange(0,5), NSMakeRange(0,1)); strRange("hello", "l", NSLiteralSearch, NSMakeRange(0,5), NSMakeRange(2,1)); strRange("hello", "l", NSLiteralSearch | NSBackwardsSearch, NSMakeRange(0,5), NSMakeRange(3,1)); strRange("hello", "", NSLiteralSearch, NSMakeRange(0,5), NSMakeRange(0,0)); strRange("hello", "el", NSLiteralSearch, NSMakeRange(0,5), NSMakeRange(1,2)); strRange("hello", "el", NSLiteralSearch, NSMakeRange(0,2), NSMakeRange(0,0)); strRange("hello", "el", NSLiteralSearch, NSMakeRange(2,3), NSMakeRange(0,0)); strRange("hello", "ell", NSLiteralSearch, NSMakeRange(0,5), NSMakeRange(1,3)); strRange("hello", "o", NSLiteralSearch, NSMakeRange(0,5), NSMakeRange(4,1)); strRange("hello", "lo", NSLiteralSearch, NSMakeRange(2,3), NSMakeRange(3,2)); strRange("boaboaboa", "abo", NSLiteralSearch, NSMakeRange(0,9), NSMakeRange(2,3)); strRange("boaboaboa", "abo", NSBackwardsSearch, NSMakeRange(0,9), NSMakeRange(5,3)); strRange("boaboaboa", "ABO", NSCaseInsensitiveSearch, NSMakeRange(0,9), NSMakeRange(2,3)); strRange("boaboaboa", "abo", NSCaseInsensitiveSearch | NSBackwardsSearch, NSMakeRange(0,9), NSMakeRange(5,3)); strRange("", "", NSLiteralSearch, NSMakeRange(0,0), NSMakeRange(0,0)); strRange("x", "", NSLiteralSearch, NSMakeRange(0,1), NSMakeRange(0,0)); strRange("x", "", NSLiteralSearch|NSBackwardsSearch, NSMakeRange(0,1), NSMakeRange(1,0)); strRangeFromSet("boaboaboa", [NSCharacterSet alphanumericCharacterSet], NSCaseInsensitiveSearch | NSBackwardsSearch, NSMakeRange(0,9), NSMakeRange(8,1)); strRangeFromSet("boaboaboa", [NSCharacterSet alphanumericCharacterSet], NSCaseInsensitiveSearch | NSBackwardsSearch, NSMakeRange(2,6), NSMakeRange(7,1)); strRangeFromSet("boaboaboa", [NSCharacterSet whitespaceCharacterSet], NSCaseInsensitiveSearch | NSBackwardsSearch, NSMakeRange(0,9), NSMakeRange(NSNotFound,0)); strRangeFromSet("boaboaboa", [NSCharacterSet whitespaceCharacterSet], NSCaseInsensitiveSearch | NSBackwardsSearch, NSMakeRange(2,6), NSMakeRange(NSNotFound,0)); strRangeFromSet("bo boaboa", [NSCharacterSet whitespaceCharacterSet], NSCaseInsensitiveSearch | NSBackwardsSearch, NSMakeRange(0,9), NSMakeRange(2,1)); strRangeFromSet("bo boaboa", [NSCharacterSet whitespaceCharacterSet], NSCaseInsensitiveSearch | NSBackwardsSearch, NSMakeRange(2,6), NSMakeRange(2,1)); testLineRange("This is a line of text\n", NSMakeRange(10, 10), NSMakeRange(0, 23)); testLineRange("This is a line of text\r\n", NSMakeRange(10, 10), NSMakeRange(0, 24)); testLineRange("This is a line of text\r\r", NSMakeRange(10, 10), NSMakeRange(0, 23)); PASS([@"1.2e3" doubleValue] == 1.2e3, "Simple double conversion works"); PASS([@"4.5E6" floatValue] == 4.5e6, "Simple float conversion works"); strcpy(buf, "xxaaaxx"); str = [[NSString alloc] initWithBytesNoCopy: buf length: 7 encoding: NSASCIIStringEncoding freeWhenDone: NO]; sub = [str substringWithRange: NSMakeRange(2, 3)]; strcpy(buf, "xxbbbxx"); PASS_EQUAL(str, @"xxbbbxx", "a no-copy string uses the buffer"); [str release]; PASS_EQUAL(sub, @"aaa", "a substring uses its own buffer"); PASS(YES == [@"hello" hasPrefix: @"hel"], "hello has hel as a prefix"); PASS(NO == [@"hello" hasPrefix: @"Hel"], "hello does not have Hel as a prefix"); PASS(NO == [@"hello" hasPrefix: @""], "hello does not have an empty string as a prefix"); PASS(YES == [@"hello" hasSuffix: @"llo"], "hello has llo as a suffix"); PASS(NO == [@"hello" hasSuffix: @"lLo"], "hello does not have lLo as a suffix"); PASS(NO == [@"hello" hasSuffix: @""], "hello does not have an empty string as a suffix"); { NSString *indianLong = @"দনà§à¦¯à¦¬à¦¾à¦¦ ১হà§à¦¯"; NSString *indianShort = @"হà§à¦¯à¦¾à¦"; NSString *ls = [indianLong stringByAppendingString: indianShort]; NSString *sl = [indianShort stringByAppendingString: indianLong]; NSString *lsl = [ls stringByAppendingString: indianLong]; NSRange res; int i, j; res = [indianLong rangeOfString: indianLong options: 0]; PASS(0 == res.location, "unicode whole string match") res = [indianLong rangeOfString: indianShort options: 0]; PASS(NSNotFound == res.location, "unicode not found simple") res = [indianLong rangeOfString: indianShort options: NSCaseInsensitiveSearch]; PASS(NSNotFound == res.location, "unicode not found insensitive") res = [indianLong rangeOfString: indianShort options: NSBackwardsSearch]; PASS(NSNotFound == res.location, "unicode not found backwards") res = [indianLong rangeOfString: indianShort options: NSCaseInsensitiveSearch|NSBackwardsSearch]; PASS(NSNotFound == res.location, "unicode not found backwards insensitive") for (i = 0; i < [indianLong length]; i++) { unichar buf1[5]; unichar buf2[5]; NSRange r1; NSRange r2; PASS([ls characterAtIndex: i] == [indianLong characterAtIndex: i], "Characters match"); r1 = [ls rangeOfComposedCharacterSequenceAtIndex: i]; r2 = [indianLong rangeOfComposedCharacterSequenceAtIndex: i]; PASS(r1.location == r2.location, "Composed characters start at the same place"); PASS(r1.length == r2.length, "Composed characters have the same lengths"); assert(r1.length < 5); [ls getCharacters: buf1 range: r1]; [indianLong getCharacters: buf2 range: r2]; for (j = 0; j < r1.length; j++) { PASS(buf1[j] == buf2[j], "Characters match when accessed by range"); } } res = [ls rangeOfString: indianLong options: 0]; PASS(0 == res.location, "unicode found at start simple") res = [ls rangeOfString: indianLong options: NSCaseInsensitiveSearch]; PASS(0 == res.location, "unicode found at start insensitive") res = [ls rangeOfString: indianLong options: NSBackwardsSearch]; PASS(0 == res.location, "unicode found at start backwards") res = [ls rangeOfString: indianLong options: NSCaseInsensitiveSearch|NSBackwardsSearch]; PASS(0 == res.location, "unicode found at start backwards insensitive") res = [sl rangeOfString: indianLong options: 0]; PASS([sl length] == NSMaxRange(res), "unicode found at end simple") res = [sl rangeOfString: indianLong options: NSCaseInsensitiveSearch]; PASS([sl length] == NSMaxRange(res), "unicode found at end insensitive") res = [sl rangeOfString: indianLong options: NSBackwardsSearch]; PASS([sl length] == NSMaxRange(res), "unicode found at end backwards") res = [sl rangeOfString: indianLong options: NSCaseInsensitiveSearch|NSBackwardsSearch]; PASS([sl length] == NSMaxRange(res), "unicode found at end backwards insensitive") res = [lsl rangeOfString: indianShort options: 0]; PASS([indianLong length] == res.location, "unicode found in middle simple") res = [lsl rangeOfString: indianShort options: NSCaseInsensitiveSearch]; PASS([indianLong length] == res.location, "unicode found in middle insensitive") res = [lsl rangeOfString: indianShort options: NSBackwardsSearch]; PASS([indianLong length] == res.location, "unicode found in middle backwards") res = [lsl rangeOfString: indianShort options: NSCaseInsensitiveSearch|NSBackwardsSearch]; PASS([indianLong length] == res.location, "unicode found in middle backwards insensitive") } [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSString/test01.m000066400000000000000000000102001435650067400212240ustar00rootroot00000000000000#import "Testing.h" #import #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS([[@"" pathComponents] count] == 0, "pathComponents ''"); PASS([[@"usr" pathComponents] count] == 1, "pathComponents 'usr'"); PASS([[@"usr/" pathComponents] count] == 2, "pathComponents 'usr/'"); PASS([[@"usr/bin" pathComponents] count] == 2, "pathComponents 'usr/bin'"); PASS([[@"usr//bin" pathComponents] count] == 2, "pathComponents 'usr//bin'"); PASS([[@"usr///bin" pathComponents] count] == 2, "pathComponents 'usr///bin'"); PASS([[@"/" pathComponents] count] == 1, "pathComponents '/'"); PASS([[@"/usr" pathComponents] count] == 2, "pathComponents '/usr'"); PASS([[@"/usr/" pathComponents] count] == 3, "pathComponents '/usr/'"); PASS([[@"/usr/bin" pathComponents] count] == 3, "pathComponents '/usr/bin'"); PASS([[@"/usr//bin" pathComponents] count] == 3, "pathComponents '/usr//bin'"); PASS([[@"/usr///bin" pathComponents] count] == 3, "pathComponents '/usr///bin'"); PASS([[@"" stringByAppendingPathComponent:@""] isEqual:@""], "'' stringByAppendingPathComponent: ''"); PASS([[@"" stringByAppendingPathComponent:@"usr"] isEqual:@"usr"], "'' stringByAppendingPathComponent: 'usr'"); PASS([[@"" stringByAppendingPathComponent:@"usr/"] isEqual:@"usr"], "'' stringByAppendingPathComponent: 'usr/'"); PASS([[@"" stringByAppendingPathComponent:@"/usr"] isEqual:@"/usr"], "'' stringByAppendingPathComponent: '/usr'"); PASS([[@"" stringByAppendingPathComponent:@"/usr/"] isEqual:@"/usr"], "'' stringByAppendingPathComponent: '/usr/'"); PASS([[@"/" stringByAppendingPathComponent:@""] isEqual:@"/"], "'/' stringByAppendingPathComponent: ''"); PASS([[@"/" stringByAppendingPathComponent:@"usr"] isEqual:@"/usr"], "'/' stringByAppendingPathComponent: 'usr'"); PASS([[@"/" stringByAppendingPathComponent:@"usr/"] isEqual:@"/usr"], "'/' stringByAppendingPathComponent: 'usr/'"); PASS([[@"/" stringByAppendingPathComponent:@"/usr"] isEqual:@"/usr"], "'/' stringByAppendingPathComponent: '/usr'"); PASS([[@"/" stringByAppendingPathComponent:@"/usr/"] isEqual:@"/usr"], "'/' stringByAppendingPathComponent: '/usr/'"); PASS([[@"usr" stringByAppendingPathComponent:@""] isEqual:@"usr"], "'usr' stringByAppendingPathComponent: ''"); PASS([[@"usr" stringByAppendingPathComponent:@"bin"] isEqual:@"usr/bin"], "'usr' stringByAppendingPathComponent: 'bin'"); PASS([[@"usr" stringByAppendingPathComponent:@"bin/"] isEqual:@"usr/bin"], "'usr' stringByAppendingPathComponent: 'bin/'"); PASS([[@"usr" stringByAppendingPathComponent:@"/bin"] isEqual:@"usr/bin"], "'usr' stringByAppendingPathComponent: '/bin'"); PASS([[@"usr" stringByAppendingPathComponent:@"/bin/"] isEqual:@"usr/bin"], "'usr' stringByAppendingPathComponent: '/bin/'"); PASS([[@"/usr" stringByAppendingPathComponent:@""] isEqual:@"/usr"], "'/usr' stringByAppendingPathComponent: ''"); PASS([[@"/usr" stringByAppendingPathComponent:@"bin"] isEqual:@"/usr/bin"], "'/usr' stringByAppendingPathComponent: 'bin'"); PASS([[@"/usr" stringByAppendingPathComponent:@"bin/"] isEqual:@"/usr/bin"], "'/usr' stringByAppendingPathComponent: 'bin/'"); PASS([[@"/usr" stringByAppendingPathComponent:@"/bin"] isEqual:@"/usr/bin"], "'/usr' stringByAppendingPathComponent: '/bin'"); PASS([[@"/usr" stringByAppendingPathComponent:@"/bin/"] isEqual:@"/usr/bin"], "'/usr' stringByAppendingPathComponent: '/bin/'"); PASS([[@"/usr/" stringByAppendingPathComponent:@""] isEqual:@"/usr"], "'/usr/' stringByAppendingPathComponent: ''"); PASS([[@"/usr/" stringByAppendingPathComponent:@"bin"] isEqual:@"/usr/bin"], "'/usr/' stringByAppendingPathComponent: 'bin'"); PASS([[@"/usr/" stringByAppendingPathComponent:@"bin/"] isEqual:@"/usr/bin"], "'/usr/' stringByAppendingPathComponent: 'bin/'"); PASS([[@"/usr/" stringByAppendingPathComponent:@"/bin/"] isEqual:@"/usr/bin"], "'/usr/' stringByAppendingPathComponent: '/bin/'"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSString/test02.m000066400000000000000000000366321435650067400212460ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import #import #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSArray *result; char *testPath = NULL; char *resultPath = NULL; NSLog(@"Developer: %@", NSSearchPathForDirectoriesInDomains(NSDeveloperDirectory, NSAllDomainsMask, YES)); PASS([[[@"home" pathComponents] objectAtIndex:0] isEqual: @"home"], "[@\"home\" pathComponents] == @\"home\"]"); result = [@"/home" pathComponents]; PASS([[result objectAtIndex:0] isEqual: @"/"] && [[result objectAtIndex:1] isEqual: @"home"], "[@\"/home\" pathComponents] == (@\"/\", @\"home\"])"); result = [@"/home/" pathComponents]; PASS([[result objectAtIndex:0] isEqual: @"/"] && [[result objectAtIndex:1] isEqual: @"home"] && [[result objectAtIndex:2] isEqual: @"/"], "[@\"/home\" pathComponents] == (@\"/\", @\"home\",\"/\")]"); result = [@"/home/nicola" pathComponents]; PASS([[result objectAtIndex:0] isEqual: @"/"] && [[result objectAtIndex:1] isEqual: @"home"] && [[result objectAtIndex:2] isEqual: @"nicola"], "[@\"/home/nicola\" pathComponents] == (@\"/\", @\"home\",\"nicola\")]"); result = [@"//home//nicola" pathComponents]; PASS([[result objectAtIndex:0] isEqual: @"/"] && [[result objectAtIndex:1] isEqual: @"home"] && [[result objectAtIndex:2] isEqual: @"nicola"], "[@\"//home//nicola\" pathComponents] == (@\"/\", @\"home\",\"nicola\")]"); PASS([[@"home/nicola.jpg" pathExtension] isEqual: @"jpg"], "[@\"home/nicola.jpg\" pathExtension] == @\"jpg\""); PASS([[@"/home/nicola.jpg" pathExtension] isEqual: @"jpg"], "[@\"/home/nicola.jpg\\\" pathExtension] == @\"jpg\""); PASS([[@"home/nicola" pathExtension] isEqual: @""], "[@\"home/nicola\" pathExtension] == @\"\""); PASS([[@"home/nicola/" pathExtension] isEqual: @""], "[@\"home/nicola\" pathExtension] == @\"\""); PASS([[@"/home/nicola..jpg" pathExtension] isEqual: @"jpg"], "[@\"/home/nicola..jpg\" pathExtension] == @\"jpg\""); PASS([[@"/home/nicola.jpg/" pathExtension] isEqual: @"jpg"], "[@\"/home/nicola.jpg/\" pathExtension] == @\"jpg\""); PASS([[@"/home/nicola.jpg/extra" pathExtension] isEqual: @""], "[@\"/home/nicola.jpg/extra\" pathExtension] == @\"\""); PASS([[@"/home/nicola./" pathExtension] isEqual: @""], "[@\"/home/nicola./\" pathExtension] == @\"\""); PASS_EQUAL([@"/home" stringByAppendingPathComponent: @"/"], @"/home", "'/home' stringByAppendingPathComponent: '/' == '/home'"); PASS([[@"/home" stringByAppendingPathComponent: @"nicola.jpg"] isEqual: @"/home/nicola.jpg"], "'/home' stringByAppendingPathComponent: 'nicola.jpg' == '/home/nicola.jpg'"); PASS([[@"/home/" stringByAppendingPathComponent: @"nicola.jpg"] isEqual: @"/home/nicola.jpg"], "'/home/' stringByAppendingPathComponent: 'nicola.jpg' == '/home/nicola.jpg'"); PASS([[@"/" stringByAppendingPathComponent: @"nicola.jpg"] isEqual: @"/nicola.jpg"], "'/' stringByAppendingPathComponent: 'nicola.jpg' == '/nicola.jpg'"); PASS([[@"" stringByAppendingPathComponent: @"nicola.jpg"] isEqual: @"nicola.jpg"], "'' stringByAppendingPathComponent: 'nicola.jpg' == 'nicola.jpg'"); PASS([[@"/home/nicola.jpg" stringByAppendingPathExtension: @"jpg"] isEqual: @"/home/nicola.jpg.jpg"], "'/home/nicola.jpg' stringByAppendingPathExtension:'jpg' == '/home/nicola.jpg.jpg'"); PASS([[@"/home/nicola." stringByAppendingPathExtension: @"jpg"] isEqual: @"/home/nicola..jpg"], "'/home/nicola.' stringByAppendingPathExtension:'jpg' == '/home/nicola..jpg'"); /* in the guile version of this test the description was different than the test i've updated it for the description to be the same as the test not sure which is correct but the test PASSes */ PASS([[@"/home/nicola/" stringByAppendingPathExtension: @"jpg"] isEqual: @"/home/nicola.jpg"], "'/home/nicola/' stringByAppendingPathExtension:'jpg' == '/home/nicola.jpg'"); PASS([[@"nicola" stringByAppendingPathExtension: @"jpg"] isEqual: @"nicola.jpg"], "'nicola' stringByAppendingPathExtension:'jpg' == 'nicola.jpg'"); PASS([[@"nicola" stringByAppendingPathExtension: @"jpg"] isEqual: @"nicola.jpg"], "'nicola' stringByAppendingPathExtension:'jpg' == 'nicola.jpg'"); /* string by deleting last path component tests */ PASS([[@"/home/nicola.jpg" stringByDeletingLastPathComponent] isEqual: @"/home"], "'/home/nicola.jpg' stringByDeletingLastPathComponent == '/home'"); PASS([[@"/home/nicola/" stringByDeletingLastPathComponent] isEqual: @"/home"], "'/home/nicola/' stringByDeletingLastPathComponent == '/home'"); PASS([[@"/home/nicola" stringByDeletingLastPathComponent] isEqual: @"/home"], "'/home/nicola' stringByDeletingLastPathComponent == '/'"); PASS([[@"/home/" stringByDeletingLastPathComponent] isEqual: @"/"], "'/home/' stringByDeletingLastPathComponent == '/'"); PASS([[@"/home" stringByDeletingLastPathComponent] isEqual: @"/"], "'/home' stringByDeletingLastPathComponent == '/'"); PASS([[@"/" stringByDeletingLastPathComponent] isEqual: @"/"], "'/' stringByDeletingLastPathComponent == '/'"); PASS([[@"hello" stringByDeletingLastPathComponent] isEqual: @""], "'hello' stringByDeletingLastPathComponent == ''"); PASS_EQUAL([@"/hello/there/.." stringByDeletingLastPathComponent], @"/hello/there", "'/hello/there/..' stringByDeletingLastPathComponent == '/hello/there'"); PASS_EQUAL([@"/hello/there/." stringByDeletingLastPathComponent], @"/hello/there", "'/hello/there/.' stringByDeletingLastPathComponent == '/hello/there'"); PASS_EQUAL([@"/hello/../there" stringByDeletingLastPathComponent], @"/hello/..", "'/hello/../there' stringByDeletingLastPathComponent == '/hello/..'"); PASS_EQUAL([@"/hello//../there" stringByDeletingLastPathComponent], @"/hello/..", "'/hello//../there' stringByDeletingLastPathComponent == '/hello/..'"); /* Check behavior for UNC absolute and relative paths. */ #ifdef GNUSTEP_BASE_LIBRARY GSPathHandling("gnustep"); // UNC PASS_EQUAL([@"//host/share/file.jpg" stringByDeletingLastPathComponent], @"//host/share/", "'//host/file.jpg' stringByDeletingLastPathComponent == '//host/'"); // UNC PASS_EQUAL([@"//host/share/" stringByDeletingLastPathComponent], @"//host/share/", "'//host/share/' stringByDeletingLastPathComponent == '//host/share/'"); // Not UNC PASS_EQUAL([@"///host/share/" stringByDeletingLastPathComponent], @"/host", "'///host/share/' stringByDeletingLastPathComponent == '/host'"); // Not UNC PASS_EQUAL([@"//host/share" stringByDeletingLastPathComponent], @"/host", "'//host/share' stringByDeletingLastPathComponent == '/host'"); // Not UNC PASS_EQUAL([@"//dir/" stringByDeletingLastPathComponent], @"/", "'//dir/' stringByDeletingLastPathComponent == '/'"); GSPathHandling("unix"); #endif /* Check behavior when UNC paths are not supported. */ PASS([[@"//host/share/file.jpg" stringByDeletingLastPathComponent] isEqual: @"/host/share"], "'//host/file.jpg' stringByDeletingLastPathComponent == '/host/share'"); PASS([[@"//host/share/" stringByDeletingLastPathComponent] isEqual: @"/host"], "'//host/share/' stringByDeletingLastPathComponent == '/host'"); PASS([[@"//host/share" stringByDeletingLastPathComponent] isEqual: @"/host"], "'//host/share' stringByDeletingLastPathComponent == '/host'"); PASS([[@"//dir/" stringByDeletingLastPathComponent] isEqual: @"/"], "'//dir/' stringByDeletingLastPathComponent == '/'"); #ifdef GNUSTEP_BASE_LIBRARY GSPathHandling("gnustep"); #endif /* delete path extension tests */ PASS([[@"/home/nicola.jpg" stringByDeletingPathExtension] isEqual: @"/home/nicola"], "'/home/nicola.jpg' stringByDeletingPathExtension == '/home/nicola'"); PASS([[@"/home/" stringByDeletingPathExtension] isEqual: @"/home"], "'/home/' stringByDeletingPathExtension == '/home'"); PASS([[@"nicola.jpg" stringByDeletingPathExtension] isEqual: @"nicola"], "'nicola.jpg' stringByDeletingPathExtension == 'nicola'"); PASS([[@"nicola..jpg" stringByDeletingPathExtension] isEqual: @"nicola."], "'nicola..jpg' stringByDeletingPathExtension == 'nicola.'"); PASS([[@".jpg" stringByDeletingPathExtension] isEqual: @".jpg"], "'.jpg' stringByDeletingPathExtension == '.jpg'"); PASS([[@"/" stringByDeletingPathExtension] isEqual: @"/"], "'/' stringByDeletingPathExtension == '/'"); /* stringByExpandingTildeInPath tests */ PASS([[@"/home/nicola/nil" stringByExpandingTildeInPath] isEqual: @"/home/nicola/nil"], "'/home/nicola/nil' stringByExpandingTildeInPath: == '/home/nicola/nil'"); PASS(![[@"~/nil" stringByExpandingTildeInPath] isEqual: @"~/nil"], "'~/nil' stringByExpandingTildeInPath: != '~/nil'"); #if defined(_WIN32) { NSString *s = [@"~" stringByAppendingString: NSUserName()]; PASS(![[s stringByExpandingTildeInPath] isEqual: s], "'~user' stringByExpandingTildeInPath: != '~user'"); } #else PASS(![[@"~root" stringByExpandingTildeInPath] isEqual: @"~root"], "'~root' stringByExpandingTildeInPath: != '~root'"); #endif #ifdef GNUSTEP_BASE_LIBRARY GSPathHandling("windows"); PASS_EQUAL([@"\\\\home\\user\\" stringByStandardizingPath], @"\\\\home\\user\\", "\\\\home\\user\\ stringByStandardizingPath == \\\\home\\user\\"); PASS_EQUAL([@"c:\\." stringByStandardizingPath], @"c:\\.", "'c:\\.' stringByStandardizingPath == 'c:\\.'"); PASS_EQUAL([@"c:\\..." stringByStandardizingPath], @"c:\\...", "'c:\\...' stringByStandardizingPath == 'c:\\...'"); PASS([@"c:\\home" isAbsolutePath] == YES, "'c:\\home' isAbsolutePath == YES"); GSPathHandling("right"); PASS_EQUAL([@"//home/user/" stringByStandardizingPath], @"//home/user/", "//home/user/ stringByStandardizingPath == //home/user/"); PASS_EQUAL([@"c:/." stringByStandardizingPath], @"c:/.", "'c:/.' stringByStandardizingPath == 'c:/.'"); PASS_EQUAL([@"c:/..." stringByStandardizingPath], @"c:/...", "'c:/...' stringByStandardizingPath == 'c:/...'"); PASS([@"c:/home" isAbsolutePath] == YES, "'c:/home' isAbsolutePath == YES"); PASS([@"//host/share/" isAbsolutePath] == YES, "'//host/share/' isAbsolutePath == YES"); #endif PASS_EQUAL([@"/home//user/" stringByStandardizingPath], @"/home/user", "/home//user/ stringByStandardizingPath == /home/user"); PASS_EQUAL([@"//home/user" stringByStandardizingPath], @"/home/user", "//home/user stringByStandardizingPath == /home/user"); PASS_EQUAL([@"///home/user" stringByStandardizingPath], @"/home/user", "///home/user stringByStandardizingPath == /home/user"); PASS_EQUAL([@"/home/./user" stringByStandardizingPath], @"/home/user", "/home/./user stringByStandardizingPath == /home/user"); PASS_EQUAL([@"/home/user/." stringByStandardizingPath], @"/home/user", "/home/user/. stringByStandardizingPath == /home/user"); PASS_EQUAL([@"/home/.//././user" stringByStandardizingPath], @"/home/user", "/home/.//././user stringByStandardizingPath == /home/user"); #if defined(GNUSTEP_BASE_LIBRARY) GSPathHandling("unix"); #endif PASS_EQUAL([@"/home/../nicola" stringByStandardizingPath], @"/nicola", "/home/../nicola stringByStandardizingPath == /nicola"); PASS_EQUAL([@"/here/and/there/../../nicola" stringByStandardizingPath], @"/here/nicola", "/here/and/there/../../nicola stringByStandardizingPath == /here/nicola"); PASS_EQUAL([@"/here/../../nicola" stringByStandardizingPath], @"/nicola", "/here/../../nicola stringByStandardizingPath == /nicola"); PASS_EQUAL([@"home/../nicola" stringByStandardizingPath], @"home/../nicola", "home/../nicola stringByStandardizingPath == home/../nicola"); PASS_EQUAL([@"a/b/../c" stringByStandardizingPath], @"a/b/../c", "a/b/../c stringByStandardizingPath == a/b/../c"); NSFileManager *fm = [NSFileManager defaultManager]; NSString *cwd = [fm currentDirectoryPath]; NSString *tmpdir = NSTemporaryDirectory(); NSString *tmpdst = [tmpdir stringByAppendingPathComponent: @"bar"]; NSString *tmpsrc = [tmpdir stringByAppendingPathComponent: @"foo"]; /* On OSX the relative path in this test cannot be resolved, * while on other systems the symbolic link is resolved as expected. * The documentation for OSX says that the link is not necessarily * resolvable when it is relative, so this test is allowed to be dashed. */ [fm createDirectoryAtPath: tmpdst attributes: nil]; [fm createSymbolicLinkAtPath: tmpsrc pathContent: @"bar"]; [fm changeCurrentDirectoryPath: tmpdir]; testHopeful = YES; NSString *expanded = [@"foo" stringByResolvingSymlinksInPath]; PASS_EQUAL(expanded, tmpdst, "foo->bar relative symlink is expanded by stringByResolvingSymlinksInPath") testHopeful = NO; if (!testPassed) { PASS_EQUAL(expanded, @"foo", "foo->bar relative symlink expansion failure returns original") } [fm changeCurrentDirectoryPath: cwd]; [fm removeFileAtPath: tmpsrc handler: nil]; [fm createSymbolicLinkAtPath: tmpsrc pathContent: tmpdst]; #if !defined(_WIN32) PASS_EQUAL([tmpsrc stringByStandardizingPath], tmpsrc, "foo->bar symlink not expanded by stringByStandardizingPath") PASS_EQUAL([tmpsrc stringByResolvingSymlinksInPath], tmpdst, "foo->bar absolute symlink expanded by stringByResolvingSymlinksInPath") [fm changeCurrentDirectoryPath: tmpdir]; PASS_EQUAL([@"foo" stringByResolvingSymlinksInPath], tmpdst, "foo->bar relative symlink expanded by stringByResolvingSymlinksInPath") #endif if (NSHomeDirectory() != nil) { PASS(NO == [[@"~" stringByResolvingSymlinksInPath] isEqual: @"~"], "tilde is expanded by stringByResolvingSymlinksInPath") } [fm changeCurrentDirectoryPath: cwd]; [fm removeFileAtPath: tmpdst handler: nil]; [fm removeFileAtPath: tmpsrc handler: nil]; PASS_EQUAL([@"/.." stringByStandardizingPath], @"/", "/.. stringByStandardizingPath == /"); PASS_EQUAL([@"/." stringByStandardizingPath], @"/.", "/. stringByStandardizingPath == /. (OSX special case)"); #if defined(GNUSTEP_BASE_LIBRARY) GSPathHandling("gnustep"); #endif result = [NSArray arrayWithObjects: @"nicola",@"core",nil]; result = [@"home" stringsByAppendingPaths:result]; PASS([result count] == 2 && [[result objectAtIndex:0] isEqual: @"home/nicola"] && [[result objectAtIndex:1] isEqual: @"home/core"], "stringsByAppendingPaths works"); PASS([@"home" isAbsolutePath] == NO, "'home' isAbsolutePath == NO"); #if defined(_WIN32) PASS([@"/home" isAbsolutePath] == NO, "'/home' isAbsolutePath == NO"); PASS([@"//host/share" isAbsolutePath] == NO, "'//host/share' isAbsolutePath == NO"); #else PASS([@"/home" isAbsolutePath] == YES, "'/home' isAbsolutePath == YES"); PASS([@"//host/share" isAbsolutePath] == YES, "'//host/share' isAbsolutePath == YES"); #endif result = [NSArray arrayWithObjects: @"nicola",@"core",nil]; PASS([[NSString pathWithComponents:result] isEqual: @"nicola/core"], "+pathWithComponents works for relative path"); result = [NSArray arrayWithObjects: @"/", @"nicola", @"core", nil]; PASS([[NSString pathWithComponents:result] isEqual: @"/nicola/core"], "+pathWithComponents works works for absolute path"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSString/test03.m000066400000000000000000000066261435650067400212470ustar00rootroot00000000000000#import "Testing.h" #import #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSCharacterSet *ws = [NSCharacterSet whitespaceAndNewlineCharacterSet]; PASS([[@"" stringByTrimmingLeadSpaces] isEqual:@""], "'' stringByTrimmingLeadSpaces == ''"); PASS([[@"home" stringByTrimmingLeadSpaces] isEqual:@"home"], "'home' stringByTrimmingLeadSpaces == 'home'"); PASS([[@" hello" stringByTrimmingLeadSpaces] isEqual:@"hello"], "' hello' stringByTrimmingLeadSpaces == 'hello'"); PASS([[@"\thello" stringByTrimmingLeadSpaces] isEqual:@"hello"], "'\\thello' stringByTrimmingLeadSpaces == 'hello'"); PASS([[@"\nhello" stringByTrimmingLeadSpaces] isEqual:@"hello"], "'\\nhello' stringByTrimmingLeadSpaces == 'hello'"); PASS([[@"" stringByTrimmingTailSpaces] isEqual:@""], "'' stringByTrimmingTailSpaces == ''"); PASS([[@"home" stringByTrimmingTailSpaces] isEqual:@"home"], "'home' stringByTrimmingTailSpaces == 'home'"); PASS([[@"hello " stringByTrimmingTailSpaces] isEqual:@"hello"], "'hello ' stringByTrimmingTailSpaces == 'hello'"); PASS([[@"hello\t" stringByTrimmingTailSpaces] isEqual:@"hello"], "'hello\\t' stringByTrimmingTailSpaces == 'hello'"); PASS([[@"hello\n" stringByTrimmingTailSpaces] isEqual:@"hello"], "'hello\\n' stringByTrimmingTailSpaces == 'hello'"); PASS([[@"" stringByTrimmingSpaces] isEqual:@""], "'' stringByTrimmingSpaces == ''"); PASS([[@"home" stringByTrimmingSpaces] isEqual:@"home"], "'home' stringByTrimmingSpaces == 'home'"); PASS([[@" hello" stringByTrimmingSpaces] isEqual:@"hello"], "' hello' stringByTrimmingSpaces == 'hello'"); PASS([[@"\thello" stringByTrimmingSpaces] isEqual:@"hello"], "'\\thello' stringByTrimmingSpaces == 'hello'"); PASS([[@"\nhello" stringByTrimmingSpaces] isEqual:@"hello"], "'\\nhello' stringByTrimmingSpaces == 'hello'"); PASS([[@"home" stringByTrimmingCharactersInSet:ws] isEqual: @"home"], "'home' stringByTrimmingCharactersInSet == 'home'"); PASS([[@"hello\n" stringByTrimmingCharactersInSet:ws] isEqual: @"hello"], "'hello\\n' stringByTrimmingCharactersInSet == 'hello'"); PASS([[@"\nhello" stringByTrimmingCharactersInSet:ws] isEqual: @"hello"], "'\\nhello' stringByTrimmingCharactersInSet == 'hello'"); PASS([[@"\nhello\n" stringByTrimmingCharactersInSet:ws] isEqual: @"hello"], "'\nhello\n' stringByTrimmingCharactersInSet == 'hello'"); PASS([[@"\n \n" stringByTrimmingCharactersInSet:ws] isEqual: @""], "'\\n \\n' stringByTrimmingCharactersInSet == ''"); PASS([[@"hello" stringByPaddingToLength:3 withString:@"." startingAtIndex:0] isEqual:@"hel"], "'hello' stringByPaddingToLength:3 withString:'.' startingAtIndex:0 == 'hel'"); PASS([[@"hello" stringByPaddingToLength:8 withString:@"." startingAtIndex:0] isEqual:@"hello..."], "'hello' stringByPaddingToLength:8 withString:'.' startingAtIndex:0 == 'hello...'"); PASS([[@"hello" stringByPaddingToLength:8 withString:@"xy" startingAtIndex:1] isEqual:@"helloyxy"], "'hello' stringByPaddingToLength:8 withString:'xy' startingAtIndex:0 == 'helloyxy'"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSString/test04.m000066400000000000000000000006711435650067400212420ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSString *theString; unichar theUniChar[1] = {0xdd00}; theString = [NSString stringWithCharacters:theUniChar length:1]; NS_DURING PASS(theString == nil, "bad unichar"); NS_HANDLER PASS(1,"bar"); NS_ENDHANDLER [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSString/test05.m000066400000000000000000000014671435650067400212470ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSString *theString; unichar theUniChar[1] = {0xe5}; theString = [NSString stringWithCharacters:theUniChar length:1]; PASS([theString isEqual:[[NSString alloc] initWithCString: [theString cStringUsingEncoding: NSISOLatin1StringEncoding] encoding: NSISOLatin1StringEncoding]],"foo"); NS_DURING PASS([theString isEqual:[[NSString alloc] initWithCString: [theString cString]]],"foo"); NS_HANDLER PASS(1,"bar"); NS_ENDHANDLER NS_DURING PASS([theString isEqual:[[NSMutableString alloc] initWithCString: [theString cString]]],"foo2"); NS_HANDLER PASS(1,"bar2"); NS_ENDHANDLER [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSString/test06.m000066400000000000000000002031551435650067400212460ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; char c[4]; unsigned i; NSString *s; NSString *e; c[1] = 0; c[0] = 0; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%00"], "character 0 is escaped"); [s release]; c[0] = 1; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%01"], "character 1 is escaped"); [s release]; c[0] = 2; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%02"], "character 2 is escaped"); [s release]; c[0] = 3; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%03"], "character 3 is escaped"); [s release]; c[0] = 4; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%04"], "character 4 is escaped"); [s release]; c[0] = 5; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%05"], "character 5 is escaped"); [s release]; c[0] = 6; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%06"], "character 6 is escaped"); [s release]; c[0] = 7; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%07"], "character 7 is escaped"); [s release]; c[0] = 8; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%08"], "character 8 is escaped"); [s release]; c[0] = 9; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%09"], "character 9 is escaped"); [s release]; c[0] = 10; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%0A"], "character 10 is escaped"); [s release]; c[0] = 11; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%0B"], "character 11 is escaped"); [s release]; c[0] = 12; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%0C"], "character 12 is escaped"); [s release]; c[0] = 13; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%0D"], "character 13 is escaped"); [s release]; c[0] = 14; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%0E"], "character 14 is escaped"); [s release]; c[0] = 15; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%0F"], "character 15 is escaped"); [s release]; c[0] = 16; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%10"], "character 16 is escaped"); [s release]; c[0] = 17; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%11"], "character 17 is escaped"); [s release]; c[0] = 18; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%12"], "character 18 is escaped"); [s release]; c[0] = 19; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%13"], "character 19 is escaped"); [s release]; c[0] = 20; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%14"], "character 20 is escaped"); [s release]; c[0] = 21; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%15"], "character 21 is escaped"); [s release]; c[0] = 22; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%16"], "character 22 is escaped"); [s release]; c[0] = 23; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%17"], "character 23 is escaped"); [s release]; c[0] = 24; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%18"], "character 24 is escaped"); [s release]; c[0] = 25; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%19"], "character 25 is escaped"); [s release]; c[0] = 26; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%1A"], "character 26 is escaped"); [s release]; c[0] = 27; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%1B"], "character 27 is escaped"); [s release]; c[0] = 28; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%1C"], "character 28 is escaped"); [s release]; c[0] = 29; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%1D"], "character 29 is escaped"); [s release]; c[0] = 30; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%1E"], "character 30 is escaped"); [s release]; c[0] = 31; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%1F"], "character 31 is escaped"); [s release]; c[0] = 32; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%20"], "character 32 is escaped"); [s release]; c[0] = 33; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 33 is not escaped"); [s release]; c[0] = 34; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%22"], "character 34 is escaped"); [s release]; c[0] = 35; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%23"], "character 35 is escaped"); [s release]; c[0] = 36; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 36 is not escaped"); [s release]; c[0] = 37; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%25"], "character 37 is escaped"); [s release]; c[0] = 38; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 38 is not escaped"); [s release]; c[0] = 39; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 39 is not escaped"); [s release]; c[0] = 40; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 40 is not escaped"); [s release]; c[0] = 41; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 41 is not escaped"); [s release]; c[0] = 42; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 42 is not escaped"); [s release]; c[0] = 43; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 43 is not escaped"); [s release]; c[0] = 44; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 44 is not escaped"); [s release]; c[0] = 45; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 45 is not escaped"); [s release]; c[0] = 46; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 46 is not escaped"); [s release]; c[0] = 47; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 47 is not escaped"); [s release]; c[0] = 48; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 48 is not escaped"); [s release]; c[0] = 49; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 49 is not escaped"); [s release]; c[0] = 50; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 50 is not escaped"); [s release]; c[0] = 51; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 51 is not escaped"); [s release]; c[0] = 52; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 52 is not escaped"); [s release]; c[0] = 53; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 53 is not escaped"); [s release]; c[0] = 54; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 54 is not escaped"); [s release]; c[0] = 55; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 55 is not escaped"); [s release]; c[0] = 56; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 56 is not escaped"); [s release]; c[0] = 57; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 57 is not escaped"); [s release]; c[0] = 58; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 58 is not escaped"); [s release]; c[0] = 59; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 59 is not escaped"); [s release]; c[0] = 60; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%3C"], "character 60 is escaped"); [s release]; c[0] = 61; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 61 is not escaped"); [s release]; c[0] = 62; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%3E"], "character 62 is escaped"); [s release]; c[0] = 63; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 63 is not escaped"); [s release]; c[0] = 64; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 64 is not escaped"); [s release]; c[0] = 65; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 65 is not escaped"); [s release]; c[0] = 66; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 66 is not escaped"); [s release]; c[0] = 67; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 67 is not escaped"); [s release]; c[0] = 68; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 68 is not escaped"); [s release]; c[0] = 69; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 69 is not escaped"); [s release]; c[0] = 70; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 70 is not escaped"); [s release]; c[0] = 71; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 71 is not escaped"); [s release]; c[0] = 72; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 72 is not escaped"); [s release]; c[0] = 73; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 73 is not escaped"); [s release]; c[0] = 74; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 74 is not escaped"); [s release]; c[0] = 75; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 75 is not escaped"); [s release]; c[0] = 76; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 76 is not escaped"); [s release]; c[0] = 77; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 77 is not escaped"); [s release]; c[0] = 78; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 78 is not escaped"); [s release]; c[0] = 79; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 79 is not escaped"); [s release]; c[0] = 80; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 80 is not escaped"); [s release]; c[0] = 81; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 81 is not escaped"); [s release]; c[0] = 82; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 82 is not escaped"); [s release]; c[0] = 83; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 83 is not escaped"); [s release]; c[0] = 84; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 84 is not escaped"); [s release]; c[0] = 85; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 85 is not escaped"); [s release]; c[0] = 86; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 86 is not escaped"); [s release]; c[0] = 87; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 87 is not escaped"); [s release]; c[0] = 88; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 88 is not escaped"); [s release]; c[0] = 89; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 89 is not escaped"); [s release]; c[0] = 90; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 90 is not escaped"); [s release]; c[0] = 91; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%5B"], "character 91 is escaped"); [s release]; c[0] = 92; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%5C"], "character 92 is escaped"); [s release]; c[0] = 93; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%5D"], "character 93 is escaped"); [s release]; c[0] = 94; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%5E"], "character 94 is escaped"); [s release]; c[0] = 95; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 95 is not escaped"); [s release]; c[0] = 96; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%60"], "character 96 is escaped"); [s release]; c[0] = 97; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 97 is not escaped"); [s release]; c[0] = 98; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 98 is not escaped"); [s release]; c[0] = 99; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 99 is not escaped"); [s release]; c[0] = 100; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 100 is not escaped"); [s release]; c[0] = 101; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 101 is not escaped"); [s release]; c[0] = 102; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 102 is not escaped"); [s release]; c[0] = 103; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 103 is not escaped"); [s release]; c[0] = 104; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 104 is not escaped"); [s release]; c[0] = 105; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 105 is not escaped"); [s release]; c[0] = 106; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 106 is not escaped"); [s release]; c[0] = 107; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 107 is not escaped"); [s release]; c[0] = 108; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 108 is not escaped"); [s release]; c[0] = 109; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 109 is not escaped"); [s release]; c[0] = 110; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 110 is not escaped"); [s release]; c[0] = 111; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 111 is not escaped"); [s release]; c[0] = 112; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 112 is not escaped"); [s release]; c[0] = 113; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 113 is not escaped"); [s release]; c[0] = 114; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 114 is not escaped"); [s release]; c[0] = 115; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 115 is not escaped"); [s release]; c[0] = 116; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 116 is not escaped"); [s release]; c[0] = 117; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 117 is not escaped"); [s release]; c[0] = 118; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 118 is not escaped"); [s release]; c[0] = 119; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 119 is not escaped"); [s release]; c[0] = 120; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 120 is not escaped"); [s release]; c[0] = 121; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 121 is not escaped"); [s release]; c[0] = 122; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 122 is not escaped"); [s release]; c[0] = 123; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%7B"], "character 123 is escaped"); [s release]; c[0] = 124; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%7C"], "character 124 is escaped"); [s release]; c[0] = 125; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%7D"], "character 125 is escaped"); [s release]; c[0] = 126; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: s], "character 126 is not escaped"); [s release]; c[0] = 127; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%7F"], "character 127 is escaped"); [s release]; c[0] = 128; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%80"], "character 128 is escaped"); [s release]; c[0] = 129; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%81"], "character 129 is escaped"); [s release]; c[0] = 130; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%82"], "character 130 is escaped"); [s release]; c[0] = 131; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%83"], "character 131 is escaped"); [s release]; c[0] = 132; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%84"], "character 132 is escaped"); [s release]; c[0] = 133; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%85"], "character 133 is escaped"); [s release]; c[0] = 134; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%86"], "character 134 is escaped"); [s release]; c[0] = 135; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%87"], "character 135 is escaped"); [s release]; c[0] = 136; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%88"], "character 136 is escaped"); [s release]; c[0] = 137; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%89"], "character 137 is escaped"); [s release]; c[0] = 138; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%8A"], "character 138 is escaped"); [s release]; c[0] = 139; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%8B"], "character 139 is escaped"); [s release]; c[0] = 140; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%8C"], "character 140 is escaped"); [s release]; c[0] = 141; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%8D"], "character 141 is escaped"); [s release]; c[0] = 142; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%8E"], "character 142 is escaped"); [s release]; c[0] = 143; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%8F"], "character 143 is escaped"); [s release]; c[0] = 144; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%90"], "character 144 is escaped"); [s release]; c[0] = 145; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%91"], "character 145 is escaped"); [s release]; c[0] = 146; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%92"], "character 146 is escaped"); [s release]; c[0] = 147; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%93"], "character 147 is escaped"); [s release]; c[0] = 148; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%94"], "character 148 is escaped"); [s release]; c[0] = 149; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%95"], "character 149 is escaped"); [s release]; c[0] = 150; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%96"], "character 150 is escaped"); [s release]; c[0] = 151; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%97"], "character 151 is escaped"); [s release]; c[0] = 152; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%98"], "character 152 is escaped"); [s release]; c[0] = 153; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%99"], "character 153 is escaped"); [s release]; c[0] = 154; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%9A"], "character 154 is escaped"); [s release]; c[0] = 155; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%9B"], "character 155 is escaped"); [s release]; c[0] = 156; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%9C"], "character 156 is escaped"); [s release]; c[0] = 157; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%9D"], "character 157 is escaped"); [s release]; c[0] = 158; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%9E"], "character 158 is escaped"); [s release]; c[0] = 159; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%9F"], "character 159 is escaped"); [s release]; c[0] = 160; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%A0"], "character 160 is escaped"); [s release]; c[0] = 161; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%A1"], "character 161 is escaped"); [s release]; c[0] = 162; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%A2"], "character 162 is escaped"); [s release]; c[0] = 163; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%A3"], "character 163 is escaped"); [s release]; c[0] = 164; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%A4"], "character 164 is escaped"); [s release]; c[0] = 165; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%A5"], "character 165 is escaped"); [s release]; c[0] = 166; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%A6"], "character 166 is escaped"); [s release]; c[0] = 167; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%A7"], "character 167 is escaped"); [s release]; c[0] = 168; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%A8"], "character 168 is escaped"); [s release]; c[0] = 169; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%A9"], "character 169 is escaped"); [s release]; c[0] = 170; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%AA"], "character 170 is escaped"); [s release]; c[0] = 171; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%AB"], "character 171 is escaped"); [s release]; c[0] = 172; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%AC"], "character 172 is escaped"); [s release]; c[0] = 173; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%AD"], "character 173 is escaped"); [s release]; c[0] = 174; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%AE"], "character 174 is escaped"); [s release]; c[0] = 175; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%AF"], "character 175 is escaped"); [s release]; c[0] = 176; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%B0"], "character 176 is escaped"); [s release]; c[0] = 177; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%B1"], "character 177 is escaped"); [s release]; c[0] = 178; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%B2"], "character 178 is escaped"); [s release]; c[0] = 179; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%B3"], "character 179 is escaped"); [s release]; c[0] = 180; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%B4"], "character 180 is escaped"); [s release]; c[0] = 181; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%B5"], "character 181 is escaped"); [s release]; c[0] = 182; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%B6"], "character 182 is escaped"); [s release]; c[0] = 183; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%B7"], "character 183 is escaped"); [s release]; c[0] = 184; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%B8"], "character 184 is escaped"); [s release]; c[0] = 185; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%B9"], "character 185 is escaped"); [s release]; c[0] = 186; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%BA"], "character 186 is escaped"); [s release]; c[0] = 187; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%BB"], "character 187 is escaped"); [s release]; c[0] = 188; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%BC"], "character 188 is escaped"); [s release]; c[0] = 189; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%BD"], "character 189 is escaped"); [s release]; c[0] = 190; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%BE"], "character 190 is escaped"); [s release]; c[0] = 191; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%BF"], "character 191 is escaped"); [s release]; c[0] = 192; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%C0"], "character 192 is escaped"); [s release]; c[0] = 193; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%C1"], "character 193 is escaped"); [s release]; c[0] = 194; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%C2"], "character 194 is escaped"); [s release]; c[0] = 195; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%C3"], "character 195 is escaped"); [s release]; c[0] = 196; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%C4"], "character 196 is escaped"); [s release]; c[0] = 197; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%C5"], "character 197 is escaped"); [s release]; c[0] = 198; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%C6"], "character 198 is escaped"); [s release]; c[0] = 199; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%C7"], "character 199 is escaped"); [s release]; c[0] = 200; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%C8"], "character 200 is escaped"); [s release]; c[0] = 201; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%C9"], "character 201 is escaped"); [s release]; c[0] = 202; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%CA"], "character 202 is escaped"); [s release]; c[0] = 203; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%CB"], "character 203 is escaped"); [s release]; c[0] = 204; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%CC"], "character 204 is escaped"); [s release]; c[0] = 205; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%CD"], "character 205 is escaped"); [s release]; c[0] = 206; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%CE"], "character 206 is escaped"); [s release]; c[0] = 207; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%CF"], "character 207 is escaped"); [s release]; c[0] = 208; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%D0"], "character 208 is escaped"); [s release]; c[0] = 209; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%D1"], "character 209 is escaped"); [s release]; c[0] = 210; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%D2"], "character 210 is escaped"); [s release]; c[0] = 211; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%D3"], "character 211 is escaped"); [s release]; c[0] = 212; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%D4"], "character 212 is escaped"); [s release]; c[0] = 213; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%D5"], "character 213 is escaped"); [s release]; c[0] = 214; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%D6"], "character 214 is escaped"); [s release]; c[0] = 215; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%D7"], "character 215 is escaped"); [s release]; c[0] = 216; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%D8"], "character 216 is escaped"); [s release]; c[0] = 217; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%D9"], "character 217 is escaped"); [s release]; c[0] = 218; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%DA"], "character 218 is escaped"); [s release]; c[0] = 219; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%DB"], "character 219 is escaped"); [s release]; c[0] = 220; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%DC"], "character 220 is escaped"); [s release]; c[0] = 221; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%DD"], "character 221 is escaped"); [s release]; c[0] = 222; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%DE"], "character 222 is escaped"); [s release]; c[0] = 223; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%DF"], "character 223 is escaped"); [s release]; c[0] = 224; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%E0"], "character 224 is escaped"); [s release]; c[0] = 225; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%E1"], "character 225 is escaped"); [s release]; c[0] = 226; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%E2"], "character 226 is escaped"); [s release]; c[0] = 227; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%E3"], "character 227 is escaped"); [s release]; c[0] = 228; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%E4"], "character 228 is escaped"); [s release]; c[0] = 229; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%E5"], "character 229 is escaped"); [s release]; c[0] = 230; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%E6"], "character 230 is escaped"); [s release]; c[0] = 231; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%E7"], "character 231 is escaped"); [s release]; c[0] = 232; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%E8"], "character 232 is escaped"); [s release]; c[0] = 233; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%E9"], "character 233 is escaped"); [s release]; c[0] = 234; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%EA"], "character 234 is escaped"); [s release]; c[0] = 235; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%EB"], "character 235 is escaped"); [s release]; c[0] = 236; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%EC"], "character 236 is escaped"); [s release]; c[0] = 237; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%ED"], "character 237 is escaped"); [s release]; c[0] = 238; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%EE"], "character 238 is escaped"); [s release]; c[0] = 239; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%EF"], "character 239 is escaped"); [s release]; c[0] = 240; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%F0"], "character 240 is escaped"); [s release]; c[0] = 241; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%F1"], "character 241 is escaped"); [s release]; c[0] = 242; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%F2"], "character 242 is escaped"); [s release]; c[0] = 243; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%F3"], "character 243 is escaped"); [s release]; c[0] = 244; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%F4"], "character 244 is escaped"); [s release]; c[0] = 245; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%F5"], "character 245 is escaped"); [s release]; c[0] = 246; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%F6"], "character 246 is escaped"); [s release]; c[0] = 247; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%F7"], "character 247 is escaped"); [s release]; c[0] = 248; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%F8"], "character 248 is escaped"); [s release]; c[0] = 249; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%F9"], "character 249 is escaped"); [s release]; c[0] = 250; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%FA"], "character 250 is escaped"); [s release]; c[0] = 251; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%FB"], "character 251 is escaped"); [s release]; c[0] = 252; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%FC"], "character 252 is escaped"); [s release]; c[0] = 253; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%FD"], "character 253 is escaped"); [s release]; c[0] = 254; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%FE"], "character 254 is escaped"); [s release]; c[0] = 255; s = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; e = [s stringByAddingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; PASS([e isEqual: @"%FF"], "character 255 is escaped"); [s release]; for (i = 0; i < 256; i++) { NSString *escaped; NSString *unescaped; NSString *reference; c[0] = i; reference = [[NSString alloc] initWithBytes: c length: 1 encoding: NSISOLatin1StringEncoding]; sprintf(c, "%%%02x", i); escaped = [[NSString alloc] initWithBytes: c length: 3 encoding: NSASCIIStringEncoding]; unescaped = [escaped stringByReplacingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; [escaped release]; PASS_EQUAL(unescaped, reference, "unescapes '%s'", c); sprintf(c, "%%%02X", i); escaped = [[NSString alloc] initWithBytes: c length: 3 encoding: NSASCIIStringEncoding]; unescaped = [escaped stringByReplacingPercentEscapesUsingEncoding: NSISOLatin1StringEncoding]; [escaped release]; PASS_EQUAL(unescaped, reference, "unescapes '%s'", c); [reference release]; } [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSString/test07.m000066400000000000000000000040431435650067400212420ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; unichar u = 0x00a3; // Pound sign NSString *s; double d; PASS([@"12" intValue] == 12, "simple intValue works"); PASS([@"-12" intValue] == -12, "negative intValue works"); PASS([@"+12" intValue] == 12, "positive intValue works"); PASS([@"1.6" intValue] == 1, "intValue ignores trailing data"); PASS([@" 12" intValue] == 12, "intValue with leading space works"); d = [@"1.2" doubleValue]; PASS(d > 1.199999 && d < 1.200001, "simple doubleValue works"); PASS([@"1.9" doubleValue] == 90 / 100.0 + 1.0, "precise doubleValue works"); d = [@"-1.2" doubleValue]; PASS(d < -1.199999 && d > -1.200001, "negative doubleValue works"); d = [@"+1.2" doubleValue]; PASS(d > 1.199999 && d < 1.200001, "positive doubleValue works"); d = [@"+1.2 x" doubleValue]; PASS(d > 1.199999 && d < 1.200001, "doubleValue ignores trailing data"); d = [@" 1.2" doubleValue]; PASS(d > 1.199999 && d < 1.200001, "doubleValue with leading space works"); s = @"50.6468746467461646"; sscanf([s UTF8String], "%lg", &d); PASS(EQ([s doubleValue], d), "50.6468746467461646 -doubleValue OK"); s = @"50.64687464674616461"; sscanf([s UTF8String], "%lg", &d); PASS(EQ([s doubleValue], d), "50.64687464674616461 -doubleValue OK"); s = @"0.646874646746164616898211"; sscanf([s UTF8String], "%lg", &d); PASS(EQ([s doubleValue], d), "0.646874646746164616898211 -doubleValue OK"); s = @"502.646874646746164"; sscanf([s UTF8String], "%lg", &d); PASS(EQ([s doubleValue], d), "502.646874646746164 -doubleValue OK"); s = @"502.6468746467461646"; sscanf([s UTF8String], "%lg", &d); PASS(EQ([s doubleValue], d), "502.6468746467461646 -doubleValue OK"); s = [NSString stringWithCharacters: &u length: 1]; PASS_EQUAL(s, @"£", "UTF-8 string literal matches 16bit unicode string"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSString/test08.m000066400000000000000000000031661435650067400212500ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import @interface NSString (NumericSort) - (NSComparisonResult)numericCompare: (NSString *)s; @end @implementation NSString (NumericSort) - (NSComparisonResult)numericCompare: (NSString *)s { return [self compare: s options: NSNumericSearch]; } @end int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSArray *a1, *a2; NSArray *a; NSString *s1, *s2; s1 = @"1"; s2 = @"2"; PASS([s1 compare: s2 options: NSNumericSearch] == NSOrderedAscending, "1 is less than 2"); s1 = @"1"; s2 = @"10"; PASS([s1 compare: s2 options: NSNumericSearch] == NSOrderedAscending, "1 is less than 10"); s1 = @"1"; s2 = @"11"; PASS([s1 compare: s2 options: NSNumericSearch] == NSOrderedAscending, "1 is less than 11"); s1 = @"11"; s2 = @"1"; PASS([s1 compare: s2 options: NSNumericSearch] == NSOrderedDescending, "11 is greater than 1"); s1 = @"11"; s2 = @"2"; PASS([s1 compare: s2 options: NSNumericSearch] == NSOrderedDescending, "11 is greater than 2"); a1 = [[NSArray alloc] initWithObjects: @"2", @"1", @"10", @"11", @"20", @"3", nil]; a = [[NSArray alloc] initWithObjects: @"1", @"10", @"11", @"2", @"20", @"3", nil]; a2 = [a1 sortedArrayUsingSelector: @selector(compare:)]; PASS_EQUAL(a2, a, "text sort"); a = [[NSArray alloc] initWithObjects: @"1", @"2", @"3", @"10", @"11", @"20", nil]; a2 = [a1 sortedArrayUsingSelector: @selector(numericCompare:)]; PASS_EQUAL(a2, a, "numeric sort"); [pool drain]; return 0; } gnustep-base-1.29.0/Tests/base/NSString/test09.m000066400000000000000000000115301435650067400212430ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import #import void testEncodeDecode(NSString* encoded, NSString* decoded, NSCharacterSet* charset, NSString* description){ NSString* encodeTest = [decoded stringByAddingPercentEncodingWithAllowedCharacters:charset]; NSString* decodeTest = [encoded stringByRemovingPercentEncoding]; const char* encodeMsg = [[NSString stringWithFormat:@"Percent-Encode: %@", description] UTF8String]; const char* decodeMsg = [[NSString stringWithFormat:@"Percent-Decode: %@", description] UTF8String]; PASS_EQUAL(encodeTest, encoded, "%s", encodeMsg); PASS_EQUAL(decodeTest, decoded, "%s", decodeMsg); } int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSString *urlDecodedString = @"Only alphabetic characters should be allowed and not encoded. !@#$%^&*()_+-="; NSString *urlEncodedString = @"Only%20alphabetic%20characters%20should%20be%20allowed%20and%20not%20encoded%2E%20%21%40%23%24%25%5E%26%2A%28%29%5F%2B%2D%3D"; testEncodeDecode(urlEncodedString, urlDecodedString, [NSCharacterSet alphanumericCharacterSet], @"Skip alphanumericCharacterSet 01"); urlDecodedString = @"https://www.microsoft.com/en-us/!@#$%^&*()_"; urlEncodedString = @"https://www.microsoft.com/en-us/!@%23$%25%5E&*()_"; testEncodeDecode(urlEncodedString, urlDecodedString, [NSCharacterSet URLFragmentAllowedCharacterSet], @"Skip URLFragmentAllowedCharacterSet 02"); urlDecodedString = @"All alphabetic characters should be encoded. Symbols should not be: !@#$%^&*()_+-="; urlEncodedString = @"%41%6C%6C %61%6C%70%68%61%62%65%74%69%63 %63%68%61%72%61%63%74%65%72%73 %73%68%6F%75%6C%64 %62%65 " @"%65%6E%63%6F%64%65%64. %53%79%6D%62%6F%6C%73 %73%68%6F%75%6C%64 %6E%6F%74 %62%65: !@#$%^&*()_+-="; testEncodeDecode(urlEncodedString, urlDecodedString, [[NSCharacterSet alphanumericCharacterSet] invertedSet], @"Skip not alphanumericCharacterSet 03"); urlDecodedString = @"Here are some Emojis: \U0001F601 \U0001F602 \U0001F638 Emojis done."; // Multibyte encoded characters urlEncodedString = @"Here%20are%20some%20Emojis:%20%F0%9F%98%81%20%F0%9F%98%82%20%F0%9F%98%B8%20Emojis%20done."; testEncodeDecode(urlEncodedString, urlDecodedString, [NSCharacterSet URLFragmentAllowedCharacterSet], @"Skip URLFragmentAllowedCharacterSet 04"); urlDecodedString = @"\1"; urlEncodedString = @"%01"; testEncodeDecode(urlEncodedString, urlDecodedString, [NSCharacterSet alphanumericCharacterSet], @"Skip URLFragmentAllowedCharacterSet 05"); urlDecodedString = @"£"; urlEncodedString = @"%C2%A3"; testEncodeDecode(urlEncodedString, urlDecodedString, [NSCharacterSet alphanumericCharacterSet], @"Two-byte character 06"); urlDecodedString = @"€"; urlEncodedString = @"%E2%82%AC"; testEncodeDecode(urlEncodedString, urlDecodedString, [NSCharacterSet alphanumericCharacterSet], @"Three-byte character 07"); urlDecodedString = @"ðˆ"; urlEncodedString = @"%F0%90%8D%88"; testEncodeDecode(urlEncodedString, urlDecodedString, [NSCharacterSet alphanumericCharacterSet], @"Four-byte character 08"); //check full string encoding and decoding urlDecodedString = @"0123456789 AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz _-~`!#$%&'()*+,/:;=?@[]™…©®£ƒ‰¥§"; urlEncodedString = @"%30%31%32%33%34%35%36%37%38%39%20%41%61%42%62%43%63%44%64%45%65%46%66%47%67%48%68%49%69%4A%6A%4B%6B%4C%6C%4D%6D%4E%6E%4F%6F%50%70%51%71%52%72%53%73%54%74%55%75%56%76%57%77%58%78%59%79%5A%7A%20%5F%2D%7E%60%21%23%24%25%26%27%28%29%2A%2B%2C%2F%3A%3B%3D%3F%40%5B%5D%E2%84%A2%E2%80%A6%C2%A9%C2%AE%C2%A3%C6%92%E2%80%B0%C2%A5%C2%A7"; testEncodeDecode(urlEncodedString, urlDecodedString, [[NSCharacterSet characterSetWithCharactersInString:urlDecodedString] invertedSet], @"All characters in string 09"); //check decoding of string with an unencoded part at the beginning NSString* asIsString = @"0123456789 AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz _-~`!#$&'()*+,/:;=?@[]™…©®£ƒ‰¥§"; urlDecodedString = [asIsString stringByAppendingString:urlDecodedString]; urlEncodedString = [asIsString stringByAppendingString:urlEncodedString]; PASS_EQUAL([urlEncodedString stringByRemovingPercentEncoding], urlDecodedString, "Percent-encoded string decoding 10"); //check decoding of string with the encoded part in the middle urlDecodedString = [urlDecodedString stringByAppendingString:asIsString]; urlEncodedString = [urlEncodedString stringByAppendingString:asIsString]; PASS_EQUAL([urlEncodedString stringByRemovingPercentEncoding], urlDecodedString, "Percent-encoded string decoding 11"); [pool drain]; return 0; } gnustep-base-1.29.0/Tests/base/NSString/tilde.m000066400000000000000000000053741435650067400212250ustar00rootroot00000000000000#import "Testing.h" #import #import #import int main() { START_SET("tilde") NSString *home = NSHomeDirectory(); NSString *tmp; PASS_EQUAL([home stringByAbbreviatingWithTildeInPath], @"~", "home directory becomes tilde"); tmp = [home stringByAppendingPathComponent: @"Documents"]; PASS_EQUAL([tmp stringByAbbreviatingWithTildeInPath], @"~/Documents", "the Documents subdirectory becomes ~/Documents"); tmp = [home stringByAppendingString: @"/Documents"]; PASS_EQUAL([tmp stringByAbbreviatingWithTildeInPath], @"~/Documents", "trailing slash removed"); tmp = [home stringByAppendingString: @"//Documents///"]; PASS_EQUAL([tmp stringByAbbreviatingWithTildeInPath], @"~/Documents", "multiple slashes removed"); tmp = [home stringByAppendingString: @"/Documents//.."]; PASS_EQUAL([tmp stringByAbbreviatingWithTildeInPath], @"~/Documents/..", "upper directory reference retained"); tmp = [home stringByAppendingString: @"/Documents/./.."]; PASS_EQUAL([tmp stringByAbbreviatingWithTildeInPath], @"~/Documents/./..", "dot directory reference retained"); #if defined(_WIN32) SKIP("multiple slashes can't be removed on Windows") #else /* This test can't work on windows, because the home directory of a * user doesn't start with a slash... don't run it on _WIN32 */ tmp = [NSString stringWithFormat: @"////%@//Documents///", home]; PASS_EQUAL([tmp stringByAbbreviatingWithTildeInPath], @"~/Documents", "multiple slashes removed"); #endif PASS_EQUAL([@"//////Documents///" stringByAbbreviatingWithTildeInPath], @"/Documents", "multiple slashes removed without tilde replacement"); PASS_EQUAL([@".//////Documents///" stringByAbbreviatingWithTildeInPath], @"./Documents", "multiple slashes removed without tilde replacement"); END_SET("tilde") START_SET("tilde abbreviation for other home") #if defined(_WIN32) SKIP("tilde abbreviation test not implemented on Windows") #else NSString *home = NSHomeDirectory(); NSString *tmp; /* The idea here is to use a home directory for a user other than the * current one. We pick root as a user which will exist on most systems. * If the current user is root then this will not work, so we skip the * test in that case. */ tmp = NSHomeDirectoryForUser(@"root"); if (0 == [tmp length]) { SKIP("can't determine root's home directory for tilde test") } if (YES == [tmp isEqual: home]) { SKIP("home directory of current user is root's home") } PASS_EQUAL([tmp stringByAbbreviatingWithTildeInPath], tmp, "tilde does nothing for root's home"); #endif END_SET("tilde abbreviation for other home") return 0; } gnustep-base-1.29.0/Tests/base/NSString/unichar_const.m000066400000000000000000000040661435650067400227600ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSString *a = @"a"; NSString *alpha = @"α"; // @"\u03b1"; NSString *rightarrow = @"→"; // @"\u2192"; NSString *smiley = @"😀"; // @"\U0001f600"; PASS([a length] == 1, "'a' is one character.") PASS([alpha length] == 1, "alpha is one character.") PASS([rightarrow length] == 1, "rightarrow is one character.") PASS([smiley length] == 2, "smiley is a surrogate pair.") PASS(strcmp([a UTF8String], "a") == 0, "UTF8 encoding for 'a'.") PASS(strcmp([alpha UTF8String], "\xce\xb1") == 0, "UTF8 encoding for alpha.") PASS(strcmp([rightarrow UTF8String], "\xe2\x86\x92") == 0, "UTF8 encoding for rightarrow.") PASS(strcmp([smiley UTF8String], "\xf0\x9f\x98\x80") == 0, "UTF8 encoding for smiley.") PASS([a canBeConvertedToEncoding: NSISOLatin1StringEncoding] == YES, "'a' can be converted to ISO Latin-1 encoding.") PASS([alpha canBeConvertedToEncoding: NSISOLatin1StringEncoding] == NO, "alpha cannot be converted to ISO Latin-1 encoding.") PASS([rightarrow canBeConvertedToEncoding: NSISOLatin1StringEncoding] == NO, "rightarrow cannot be converted to ISO Latin-1 encoding.") PASS([smiley canBeConvertedToEncoding: NSISOLatin1StringEncoding] == NO, "smiley cannot be converted to ISO Latin-1 encoding.") NSMutableString *mutable; mutable = [NSMutableString string]; [mutable setString: a]; PASS_EQUAL(mutable, a, "assigning 'a' to a mutable string works.") mutable = [NSMutableString string]; [mutable setString: alpha]; PASS_EQUAL(mutable, alpha, "assigning alpha to a mutable string works.") mutable = [NSMutableString string]; [mutable setString: rightarrow]; PASS_EQUAL(mutable, rightarrow, "assigning rightarrow to a mutable string works.") mutable = [NSMutableString string]; [mutable setString: smiley]; PASS_EQUAL(mutable, smiley, "assigning smiley to a mutable string works.") [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/NSString/unichar_format.m000066400000000000000000000023071435650067400231160ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSString *narrow = @"aaaa"; // fits in a single byte NSString *wide = @"a\u20AC\u20ACa"; // Euro signs, requires UTF-16 storage NSString *narrowNarrowFormat = [NSString stringWithFormat: @"a%@a", narrow]; NSString *narrowWideFormat = [NSString stringWithFormat: @"a%@a", wide]; NSString *wideNarrowFormat = [NSString stringWithFormat: @"\u20AC%@\u20ac", narrow]; NSString *wideWideFormat = [NSString stringWithFormat: @"\u20AC%@\u20ac", wide]; PASS_EQUAL(narrowNarrowFormat, @"aaaaaa", "Formatting byte-width string into a byte-width string works."); PASS_EQUAL(narrowWideFormat, @"aa\u20AC\u20ACaa", "Formatting a 16 bit wide string into a byte-width string works."); PASS_EQUAL(wideNarrowFormat, @"\u20ACaaaa\u20AC", "Formatting a byte-width string into a 16 bit wide string works."); PASS_EQUAL(wideWideFormat, @"\u20ACa\u20AC\u20ACa\u20AC", "Formatting a 16 bit wide string into a 16 bit wide string works."); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSString/utf8.m000066400000000000000000000026351435650067400210070ustar00rootroot00000000000000#import #import #import "ObjectTesting.h" int main(void) { [NSAutoreleasePool new]; START_SET("NSString + utf8") NSString *exp; NSString *str; uint16_t uni[2]; uint8_t buf[8]; buf[0] = 0xc0; buf[1] = 0x00; str = [NSString stringWithUTF8String: buf]; PASS_EQUAL(str, nil, "bare 0xc0 is illegal") buf[0] = 0xc0; buf[1] = 0x80; buf[2] = 0x00; str = [NSString stringWithUTF8String: buf]; PASS_EQUAL(str, nil, "non-minimal sequence is illegal") buf[0] = 0xed; buf[1] = 0xa0; buf[2] = 0x80; str = [NSString stringWithUTF8String: buf]; PASS_EQUAL(str, nil, "lone high surrogate pair char is illegal") buf[0] = 0xed; buf[1] = 0xb0; buf[2] = 0x80; str = [NSString stringWithUTF8String: buf]; PASS_EQUAL(str, nil, "lone low surrogate pair char is illegal") buf[0] = 0xf4; buf[1] = 0x90; buf[2] = 0x80; buf[3] = 0x80; buf[4] = 0x00; str = [NSString stringWithUTF8String: buf]; PASS_EQUAL(str, nil, "character too large is illegal") uni[0] = 0xdbff; uni[1] = 0xdfff; exp = [[NSString alloc] initWithCharacters: uni length: 2]; buf[0] = 0xf4; buf[1] = 0x8f; buf[2] = 0xbf; buf[3] = 0xbf; buf[4] = 0x00; str = [NSString stringWithUTF8String: buf]; PASS_EQUAL(str, exp, "maximum unicode character ok") END_SET("NSString + utf8") return 0; } gnustep-base-1.29.0/Tests/base/NSString/utf8bom.txt000066400000000000000000000001311435650067400220550ustar00rootroot00000000000000This file contains a UTF-8 BOM: EF BB BF http://en.wikipedia.org/wiki/Byte_Order_Mark gnustep-base-1.29.0/Tests/base/NSTask/000077500000000000000000000000001435650067400173715ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSTask/GNUmakefile.preamble000066400000000000000000000001051435650067400232250ustar00rootroot00000000000000 SUBPROJECTS = Helpers include $(GNUSTEP_MAKEFILES)/aggregate.make gnustep-base-1.29.0/Tests/base/NSTask/Helpers/000077500000000000000000000000001435650067400207735ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSTask/Helpers/GNUmakefile000066400000000000000000000006151435650067400230470ustar00rootroot00000000000000 include $(GNUSTEP_MAKEFILES)/common.make TOOL_NAME = NSZombie processgroup testcat testecho testsleep NEEDS_GUI = NO NSZombie_OBJC_FILES = NSZombie.m processgroup_OBJC_FILES = processgroup.m testcat_C_FILES = testcat.c testecho_OBJC_FILES = testecho.m testsleep_OBJC_FILES = testsleep.m -include GNUmakefile.preamble include $(GNUSTEP_MAKEFILES)/tool.make -include GNUmakefile.postamble gnustep-base-1.29.0/Tests/base/NSTask/Helpers/NSZombie.m000066400000000000000000000004111435650067400226330ustar00rootroot00000000000000#import #import int main() { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSObject *anObject = [NSObject new]; [anObject release]; [anObject release]; [pool release]; return 0; } gnustep-base-1.29.0/Tests/base/NSTask/Helpers/processgroup.m000066400000000000000000000020031435650067400236770ustar00rootroot00000000000000#include #if !defined(_WIN32) #include #include #include #endif /* Test that the process group has been changed (not the same as that of our * parent) and that we have been detached from any controlling terminal. */ int main(int argc, char **argv) { int i = 0; NSAutoreleasePool *arp = [NSAutoreleasePool new]; #if !defined(_WIN32) /* printf("argc %d\n", argc); for (i = 0; i < argc; i++) printf("argv[%d] %s\n", i, argv[i]); printf("getpgrp %d\n", getpgrp()); printf("getsid %d\n", getsid(0)); printf("result of open of /dev/tty is %d\n", open("/dev/tty", O_WRONLY)); */ if (atoi(argv[1]) == getpgrp()) i = 1; /* pgrp not set properly */ else if (open("/dev/tty", O_WRONLY) >= 0) i = 2; /* not detached from tty */ else i = 0; /* OK */ #endif /* __MINGW32__ */ [arp release]; return i; } gnustep-base-1.29.0/Tests/base/NSTask/Helpers/testcat.c000066400000000000000000000003451435650067400226100ustar00rootroot00000000000000#include /* Just cat the GNUmakefle */ int main(int argc, char **argv) { FILE *f = fopen("GNUmakefile", "rb"); int c; while ((c = fgetc(f)) != EOF) putchar(c); fclose(f); fflush(stdout); return 0; } gnustep-base-1.29.0/Tests/base/NSTask/Helpers/testecho.m000066400000000000000000000006411435650067400227700ustar00rootroot00000000000000#import int main(int argc, char **argv) { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSArray *args = [[NSProcessInfo processInfo] arguments]; unsigned c = [args count]; int i; for (i = 0; i < c; i++) { GSPrintf(stdout, @"%s%@", (i == 0 ? "" : " "), [args objectAtIndex: i]); } GSPrintf(stdout, @"\n"); fflush(stdout); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/NSTask/Helpers/testsleep.m000066400000000000000000000004701435650067400231620ustar00rootroot00000000000000#import int main(int argc, char **argv) { NSAutoreleasePool *arp = [NSAutoreleasePool new]; GSPrintf(stdout, @"Child starting\n"); fflush(stdout); [NSThread sleepForTimeInterval: 10.0]; GSPrintf(stdout, @"Child exiting\n"); fflush(stdout); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/NSTask/TestInfo000066400000000000000000000000001435650067400210350ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSTask/basic.m000066400000000000000000000004641435650067400206340ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSArray *testObj = [NSTask new]; test_NSObject(@"NSTask", [NSArray arrayWithObject:testObj]); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSTask/general.m000066400000000000000000000036161435650067400211720ustar00rootroot00000000000000#import #import #import #import #import #import "ObjectTesting.h" int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSFileManager *mgr; NSString *helpers; NSString *testecho; NSString *testcat; NSArray *args; id task; id info; id env; id pth1; id pth2; BOOL yes; /* Windows MSVC adds the '.exe' suffix to executables */ #if defined(_MSC_VER) testecho = @"testecho.exe"; testcat = @"testcat.exe"; #else testecho = @"testecho"; testcat = @"testcat"; #endif info = [NSProcessInfo processInfo]; env = [[info environment] mutableCopy]; yes = YES; PASS(info != nil && [info isKindOfClass: [NSProcessInfo class]] && env != nil && [env isKindOfClass: [NSMutableDictionary class]] && yes == YES, "We can build some objects for task tests"); mgr = [NSFileManager defaultManager]; helpers = [mgr currentDirectoryPath]; helpers = [helpers stringByAppendingPathComponent: @"Helpers"]; helpers = [helpers stringByAppendingPathComponent: @"obj"]; pth1 = [helpers stringByAppendingPathComponent: testcat]; pth2 = [helpers stringByAppendingPathComponent: testecho]; /* Try some tasks. Make sure the program we use is common between Unix and Windows (and others?) */ task = [NSTask launchedTaskWithLaunchPath: pth1 arguments: [NSArray array]]; [task waitUntilExit]; PASS(YES, "launchedTaskWithLaunchPath:arguments: works"); task = [NSTask new]; args = [NSArray arrayWithObjects: @"xxx", @"yyy", nil]; [task setEnvironment: env]; [task setLaunchPath: pth2]; [task setArguments: args]; [task launch]; [task waitUntilExit]; PASS([task terminationReason] == NSTaskTerminationReasonExit, "termination reason for normal exit works"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSTask/launch.m000066400000000000000000000051571435650067400210310ustar00rootroot00000000000000#import #import #import #import #import #import "ObjectTesting.h" #if !defined(_WIN32) #include #endif int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSTask *task; NSPipe *outPipe; NSFileManager *mgr; NSString *helpers; NSString *testecho; NSString *testcat; NSString *processgroup; NSFileHandle *outHandle; NSData *data = nil; /* Windows MSVC adds the '.exe' suffix to executables */ #if defined(_MSC_VER) testecho = @"testecho.exe"; testcat = @"testcat.exe"; processgroup = @"processgroup.exe"; #else testecho = @"testecho"; testcat = @"testcat"; processgroup = @"processgroup"; #endif mgr = [NSFileManager defaultManager]; helpers = [mgr currentDirectoryPath]; helpers = [helpers stringByAppendingPathComponent: @"Helpers"]; helpers = [helpers stringByAppendingPathComponent: @"obj"]; task = [[NSTask alloc] init]; outPipe = [[NSPipe pipe] retain]; [task setLaunchPath: [helpers stringByAppendingPathComponent: testcat]]; [task setArguments: [NSArray arrayWithObjects: nil]]; [task setStandardOutput: outPipe]; outHandle = [outPipe fileHandleForReading]; [task launch]; PASS([task standardOutput] == outPipe, "standardOutput returns pipe"); data = [outHandle readDataToEndOfFile]; PASS([data length] > 0, "was able to read data from subtask"); NSLog(@"Data was %*.*s", [data length], [data length], [data bytes]); [task terminate]; task = [[NSTask alloc] init]; outPipe = [[NSPipe pipe] retain]; [task setLaunchPath: [helpers stringByAppendingPathComponent: testecho]]; [task setArguments: [NSArray arrayWithObjects: @"Hello", @"there", nil]]; [task setStandardOutput: outPipe]; outHandle = [outPipe fileHandleForReading]; [task launch]; data = [outHandle readDataToEndOfFile]; PASS([data length] > 0, "was able to read data from subtask"); NSLog(@"Data was %*.*s", [data length], [data length], [data bytes]); [task terminate]; PASS_EXCEPTION([task launch];, @"NSInvalidArgumentException", "raised exception on failed launch") [outPipe release]; [task release]; #if !defined(_WIN32) task = [[NSTask alloc] init]; [task setLaunchPath: [helpers stringByAppendingPathComponent: processgroup]]; [task setArguments: [NSArray arrayWithObjects: [NSString stringWithFormat: @"%d", getpgrp()], nil]]; [task launch]; [task waitUntilExit]; PASS([task terminationStatus] == 0, "subtask changes process group"); [task release]; #endif [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/NSTask/notify.m000066400000000000000000000075521435650067400210700ustar00rootroot00000000000000#import #import #import #import #import #import #import #import "ObjectTesting.h" @interface TaskHandler : NSObject { NSString *path; } @end @implementation TaskHandler static BOOL taskTerminationNotificationReceived; - (void) setLaunchPath: (NSString*)s { ASSIGNCOPY(path, s); } - (void) taskDidTerminate: (NSNotification *)notification { NSLog(@"Received NSTaskDidTerminateNotification %@", notification); taskTerminationNotificationReceived = YES; } - (void) testNSTaskNotifications { NSDate *deadline; NSString *testsleep; NSString *testecho; BOOL earlyTermination = NO; /* Windows MSVC adds the '.exe' suffix to executables */ #if defined(_MSC_VER) testecho = @"testecho.exe"; testsleep = @"testsleep.exe"; #else testecho = @"testecho"; testsleep = @"testsleep"; #endif for (;;) { NSTask *task = [NSTask new]; taskTerminationNotificationReceived = NO; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(taskDidTerminate:) name: NSTaskDidTerminateNotification object: task]; if (earlyTermination) { BOOL terminated = NO; [task setLaunchPath: [path stringByAppendingPathComponent: testsleep]]; [task launch]; NSLog(@"Launched pid %d", [task processIdentifier]); NSLog(@"Running run loop for 5 seconds"); deadline = [NSDate dateWithTimeIntervalSinceNow:5.0]; while ([deadline timeIntervalSinceNow] > 0.0 && !taskTerminationNotificationReceived) { [[NSRunLoop currentRunLoop] runUntilDate: [NSDate dateWithTimeIntervalSinceNow: 1.0]]; if (NO == terminated) { NSLog(@"Run loop finished, calling -[NSTask terminate]"); [task terminate]; NSLog(@"Terminate returned, waiting for termination"); terminated = YES; } } [task waitUntilExit]; PASS([task terminationReason] == NSTaskTerminationReasonUncaughtSignal, "termination reason for signal exit works"); } else { [task setLaunchPath: [path stringByAppendingPathComponent: testecho]]; [task launch]; NSLog(@"Launched pid %d", [task processIdentifier]); NSLog(@"Running run loop for 15 seconds"); deadline = [NSDate dateWithTimeIntervalSinceNow: 15.0]; while ([deadline timeIntervalSinceNow] > 0.0 && !taskTerminationNotificationReceived) { [[NSRunLoop currentRunLoop] runUntilDate: [NSDate dateWithTimeIntervalSinceNow: 1.0]]; } PASS([task terminationReason] == NSTaskTerminationReasonExit, "termination reason for normal exit works"); } [task release]; NSAssert(taskTerminationNotificationReceived, @"termination notification not received"); [[NSNotificationCenter defaultCenter] removeObserver: self name: NSTaskDidTerminateNotification object: nil]; if (earlyTermination) break; earlyTermination = YES; } } @end int main() { TaskHandler *h; NSFileManager *mgr; NSString *helpers; START_SET("notify"); mgr = [NSFileManager defaultManager]; helpers = [mgr currentDirectoryPath]; helpers = [helpers stringByAppendingPathComponent: @"Helpers"]; helpers = [helpers stringByAppendingPathComponent: @"obj"]; h = [TaskHandler new]; [h setLaunchPath: helpers]; [h testNSTaskNotifications]; [h release]; END_SET("notify"); return 0; } gnustep-base-1.29.0/Tests/base/NSTask/zombie.m000066400000000000000000000030201435650067400210270ustar00rootroot00000000000000#import #import #import #import #import #import #import "ObjectTesting.h" int main() { NSTask *task; NSPipe *outPipe; NSFileManager *mgr; NSString *helpers; NSFileHandle *outHandle; NSAutoreleasePool *arp; NSMutableDictionary *env; NSData *data = nil; NSString *str; arp = [[NSAutoreleasePool alloc] init]; mgr = [NSFileManager defaultManager]; helpers = [mgr currentDirectoryPath]; helpers = [helpers stringByAppendingPathComponent: @"Helpers"]; helpers = [helpers stringByAppendingPathComponent: @"obj"]; env = [[[NSProcessInfo processInfo] environment] mutableCopy]; [env setObject: @"YES" forKey: @"NSZombieEnabled"]; task = [[NSTask alloc] init]; outPipe = [[NSPipe pipe] retain]; [task setLaunchPath: [helpers stringByAppendingPathComponent: @"NSZombie"]]; [task setArguments: [NSArray arrayWithObjects: nil]]; [task setStandardError: outPipe]; [task setEnvironment: env]; outHandle = [outPipe fileHandleForReading]; [task launch]; data = [outHandle readDataToEndOfFile]; NSLog(@"Data was %*.*s", [data length], [data length], [data bytes]); str = [[NSString alloc] initWithData: data encoding: NSISOLatin1StringEncoding]; PASS(str != nil && [str rangeOfString: @"sent to deallocated"].length > 0, "was able to read zombie message from subtask"); [task terminate]; [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/NSThread/000077500000000000000000000000001435650067400176765ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSThread/GNUmakefile.preamble000066400000000000000000000002711435650067400235360ustar00rootroot00000000000000 ifneq ($(GNUSTEP_TARGET_OS), mingw32) ifneq ($(GNUSTEP_TARGET_OS), mingw64) ifneq ($(GNUSTEP_TARGET_OS), windows) ADDITIONAL_TOOL_LIBS += -lpthread endif endif endif gnustep-base-1.29.0/Tests/base/NSThread/TestInfo000066400000000000000000000000001435650067400213420ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSThread/late_unregister.m000066400000000000000000000065761435650067400232660ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import #import #if defined(_WIN32) #include #else #include #endif @interface ThreadExpectation : NSObject { NSCondition *condition; NSThread *origThread; BOOL done; BOOL deallocated; } - (void) onThreadExit: (NSNotification*)n; - (BOOL) isDone; @end @implementation ThreadExpectation - (id) init { if (nil == (self = [super init])) { return nil; } condition = [NSCondition new]; return self; } - (void) inThread: (NSThread*)thread { NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; /* We explicitly don't retain this so that we can check that it actually says * alive until the notification is sent. That check is implicit since * PASS_EQUAL in the -onThreadExit method will throw or crash if that isn't * the case. */ origThread = thread; [nc addObserver: self selector: @selector(onThreadExit:) name: NSThreadWillExitNotification object: thread]; } - (void) onThreadExit: (NSNotification*)thr { NSThread *current = [NSThread currentThread]; NSThread *passed = [thr object]; PASS_EQUAL(passed, origThread, "NSThreadWillExitNotification passes expected thread") PASS_EQUAL(origThread, current, "Correct thread reference can be obtained on exit") PASS([passed isExecuting], "exiting thread is still executing at point of notification") PASS(![passed isFinished], "exiting thread is not finished at point of notification") [[NSNotificationCenter defaultCenter] removeObserver: self]; origThread = nil; [condition lock]; done = YES; [condition broadcast]; [condition unlock]; } - (BOOL) isDone { return done; } - (void) waitUntilDate: (NSDate*)date { [condition waitUntilDate: date]; } - (void) lock { [condition lock]; } - (void) unlock { [condition unlock]; } - (void) dealloc { DESTROY(condition); [super dealloc]; } @end #if defined(_WIN32) void __cdecl #else void * #endif thread(void *expectation) { [(ThreadExpectation*)expectation inThread: [NSThread currentThread]]; #if !defined(_WIN32) return NULL; #endif } /** * This test checks whether we can still obtain a reference to the NSThread * object of a thread that is in the process of exiting without an explicit * call to [NSThread exit]. To do this, we pass an expectation object to * a thread created purely using the pthreads API. We then wait on a condition * until the thread exits and posts the NSThreadWillExitNotification. If that * does not happen within 5 seconds, we flag the test as failed. */ int main(void) { NSAutoreleasePool *arp = [NSAutoreleasePool new]; ThreadExpectation *expectation = [ThreadExpectation new]; #if defined(_WIN32) _beginthread(thread, 0, expectation); #else pthread_t thr; pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); pthread_create(&thr, &attr, thread, expectation); #endif NSDate *start = [NSDate date]; [expectation lock]; while (![expectation isDone] && [start timeIntervalSinceNow] > -5.0f) { [expectation waitUntilDate: [NSDate dateWithTimeIntervalSinceNow: 0.5f]]; } PASS([expectation isDone], "Notification for thread exit was sent"); [expectation unlock]; DESTROY(expectation); DESTROY(arp); return 0; } gnustep-base-1.29.0/Tests/base/NSThread/lazy_thread.m000066400000000000000000000036151435650067400223670ustar00rootroot00000000000000#import "ObjectTesting.h" #import #if defined(_WIN32) #include #else #include #endif static NSThread *threadResult = nil; #if defined(_WIN32) unsigned int __stdcall #else void * #endif thread(void *ignored) { threadResult = [NSThread currentThread]; return 0; } int main(void) { NSAutoreleasePool *arp = [NSAutoreleasePool new]; #if defined(_WIN32) HANDLE thr; thr = (HANDLE)_beginthreadex(NULL, 0, thread, NULL, 0, NULL); WaitForSingleObject(thr, INFINITE); CloseHandle(thr); #else pthread_t thr; pthread_create(&thr, NULL, thread, NULL); pthread_join(thr, NULL); #endif PASS(threadResult != 0, "NSThread lazily created from native thread"); testHopeful = YES; PASS((threadResult != 0) && (threadResult != [NSThread mainThread]), "Spawned thread is not main thread"); #if defined(_WIN32) thr = (HANDLE)_beginthreadex(NULL, 0, thread, NULL, 0, NULL); WaitForSingleObject(thr, INFINITE); CloseHandle(thr); #else pthread_create(&thr, NULL, thread, NULL); pthread_join(thr, NULL); #endif PASS(threadResult != 0, "NSThread lazily created from native thread"); PASS((threadResult != 0) && (threadResult != [NSThread mainThread]), "Spawned thread is not main thread"); NSThread *t = [NSThread currentThread]; [t setName: @"xxxtestxxx"]; NSLog(@"Thread description is '%@'", t); NSRange r = [[t description] rangeOfString: @"name = xxxtestxxx"]; PASS(r.length > 0, "thread description contains name"); PASS([NSThread threadPriority] == 0.5, "default thread priority is 0.5"); PASS([NSThread setThreadPriority:0.8], "change thread priority to 0.8"); PASS([NSThread threadPriority] == 0.8, "thread priority was changed to 0.8"); PASS([NSThread setThreadPriority:0.2], "change thread priority to 0.2"); PASS([NSThread threadPriority] == 0.2, "thread priority was changed to 0.2"); DESTROY(arp); return 0; } gnustep-base-1.29.0/Tests/base/NSTimeZone/000077500000000000000000000000001435650067400202215ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSTimeZone/ParisV1-noMagic.tzdb000066400000000000000000000021001435650067400237370ustar00rootroot00000000000000 ¸ ‘`PO›Gxð›ÕÚ𜼑p¾÷pž‰þpŸžÙp `¥ð¡~»p¢.ð£zLð¤5ð¥^#p¦%5ð§'›ð¨X&p©}ð©î4pªç_ð«×Pð¬ÇAð­É§ð®§#ð¯ Op°‡ð±‰kð²p"p³rˆp´PpµI/ð¶/æp·2Lp¸Èp¸ÿ¹p¹ïªpºÖ`ð»ØÆð¼È·ð½¸¨ð¾Ÿ_p¿˜ŠðÀšððÁxlðÂh]ðÃXNðÄ?pÅ80ðÆ:–ðÇX¬pÇÚ  ÈjäpÌçKÍ©΢CÏ’4ÐOáàЉñðÑrÒN@ »G «8 *ýp ¤c‹„Et6d'TMD3ú#ëÜÍó¾ã¯Ó Ñ¼½¬®œŸŒ| lr!\c"LT#†A?›@f#A„9BFCdD%çECýFÉG#ßGîæIÁIÎÈJã£K®ªLÌ¿MŽŒN¬¡OnnPŒƒQWŠRleS7lTLGUNV,)V÷0XFX×Yõ(Z¶ô[Õ \ ]´ì^ó_”Î`_Õa}êb?·c]Ìd™e=®fµggè—hýriÈyjÝTk¨[lÆqmˆ=n¦Sohp†5qQ<rfs1tEùuv/vðâx÷xÐÄyîÙz°¦{λ|™Â}®~y¤Ž  1        PMTWESTWETCETCESTWEDSTgnustep-base-1.29.0/Tests/base/NSTimeZone/ParisV1.tzdb000066400000000000000000000020721435650067400223740ustar00rootroot00000000000000TZif · ‘`P‹›Gxð›×,pœ¼‘pÀHðž‰þpŸ *ð `¥ð¡€ ð¢.ð£zLð¤5ð¥^#p¦%5ð§'›ð¨X&p©}ð©î4pªç_ð«×Pð¬ÇAð­É§ð®§#ð¯ Op°‡ð±‰kð²p"p³rˆp´PpµI/ð¶/æp·2Lp¸Èp¸ÿ¹p¹ïªpºÖ`ð»ØÆð¼È·ð½¸¨ð¾Ÿ_p¿˜ŠðÀšððÁxlðÂh]ðÃXNðÄ?pÅ80ðÆ:–ðÇX¬pÇÚ  Èl'àÌçKÍ©΢CÏ’4ÐOáàЉñðÑrÒN@ »9 «ð ¤c‹„Et6d'TMD3ú#ëÜÍó¾ã¯Ó Ñ¼½¬®œŸŒ| lr!\c"LT#†A?›@f#A„9BFCdD%çECýFÉG#ßGîæIÁIÎÈJã£K®ªLÌ¿MŽŒN¬¡OnnPŒƒQWŠRleS7lTLGUNV,)V÷0XFX×Yõ(Z¶ô[Õ \ ]´ì^ó_”Î`_Õa}êb?·c]Ìd™e=®fµggè—hýriÈyjÝTk¨[lÆqmˆ=n¦Sohp†5qQ<rfs1tEùuv/vðâx÷xÐÄyîÙz°¦{λ|™Â}®~y¤Ž  1         PMTWESTWETCETCESTWEMTgnustep-base-1.29.0/Tests/base/NSTimeZone/ParisV2-missingHeader.tzdb000066400000000000000000000056011435650067400251560ustar00rootroot00000000000000TZif2 · ‘`P‹›Gxð›×,pœ¼‘pÀHðž‰þpŸ *ð `¥ð¡€ ð¢.ð£zLð¤5ð¥^#p¦%5ð§'›ð¨X&p©}ð©î4pªç_ð«×Pð¬ÇAð­É§ð®§#ð¯ Op°‡ð±‰kð²p"p³rˆp´PpµI/ð¶/æp·2Lp¸Èp¸ÿ¹p¹ïªpºÖ`ð»ØÆð¼È·ð½¸¨ð¾Ÿ_p¿˜ŠðÀšððÁxlðÂh]ðÃXNðÄ?pÅ80ðÆ:–ðÇX¬pÇÚ  Èl'àÌçKÍ©΢CÏ’4ÐOáàЉñðÑrÒN@ »9 «ð ¤c‹„Et6d'TMD3ú#ëÜÍó¾ã¯Ó Ñ¼½¬®œŸŒ| lr!\c"LT#†A?›@f#A„9BFCdD%çECýFÉG#ßGîæIÁIÎÈJã£K®ªLÌ¿MŽŒN¬¡OnnPŒƒQWŠRleS7lTLGUNV,)V÷0XFX×Yõ(Z¶ô[Õ \ ]´ì^ó_”Î`_Õa}êb?·c]Ìd™e=®fµggè—hýriÈyjÝTk¨[lÆqmˆ=n¦Sohp†5qQ<rfs1tEùuv/vðâx÷xÐÄyîÙz°¦{λ|™Â}®~y¤Ž  1         PMTWESTWETCETCESTWEMTTZif2 ¸ ÿÿÿÿkÈJ‹ÿÿÿÿ‘`P‹ÿÿÿÿ›Gxðÿÿÿÿ›×,pÿÿÿÿœ¼‘pÿÿÿÿÀHðÿÿÿÿž‰þpÿÿÿÿŸ *ðÿÿÿÿ `¥ðÿÿÿÿ¡€ ðÿÿÿÿ¢.ðÿÿÿÿ£zLðÿÿÿÿ¤5ðÿÿÿÿ¥^#pÿÿÿÿ¦%5ðÿÿÿÿ§'›ðÿÿÿÿ¨X&pÿÿÿÿ©}ðÿÿÿÿ©î4pÿÿÿÿªç_ðÿÿÿÿ«×Pðÿÿÿÿ¬ÇAðÿÿÿÿ­É§ðÿÿÿÿ®§#ðÿÿÿÿ¯ Opÿÿÿÿ°‡ðÿÿÿÿ±‰kðÿÿÿÿ²p"pÿÿÿÿ³rˆpÿÿÿÿ´PpÿÿÿÿµI/ðÿÿÿÿ¶/æpÿÿÿÿ·2Lpÿÿÿÿ¸Èpÿÿÿÿ¸ÿ¹pÿÿÿÿ¹ïªpÿÿÿÿºÖ`ðÿÿÿÿ»ØÆðÿÿÿÿ¼È·ðÿÿÿÿ½¸¨ðÿÿÿÿ¾Ÿ_pÿÿÿÿ¿˜ŠðÿÿÿÿÀšððÿÿÿÿÁxlðÿÿÿÿÂh]ðÿÿÿÿÃXNðÿÿÿÿÄ?pÿÿÿÿÅ80ðÿÿÿÿÆ:–ðÿÿÿÿÇX¬pÿÿÿÿÇÚ  ÿÿÿÿÈl'àÿÿÿÿÌçKÿÿÿÿÍ©ÿÿÿÿ΢CÿÿÿÿÏ’4ÿÿÿÿÐOáàÿÿÿÿЉñðÿÿÿÿÑrÿÿÿÿÒN@ »9 «ð ¤c‹„Et6d'TMD3ú#ëÜÍó¾ã¯Ó Ñ¼½¬®œŸŒ| lr!\c"LT#†A?›@f#A„9BFCdD%çECýFÉG#ßGîæIÁIÎÈJã£K®ªLÌ¿MŽŒN¬¡OnnPŒƒQWŠRleS7lTLGUNV,)V÷0XFX×Yõ(Z¶ô[Õ \ ]´ì^ó_”Î`_Õa}êb?·c]Ìd™e=®fµggè—hýriÈyjÝTk¨[lÆqmˆ=n¦Sohp†5qQ<rfs1tEùuv/vðâx÷xÐÄyîÙz°¦{λ|™Â}®~y¤Ž   11      LMTPMTWESTWETCETCESTWEMT CET-1CEST,M3.5.0,M10.5.0/3 gnustep-base-1.29.0/Tests/base/NSTimeZone/ParisV2.tzdb000066400000000000000000000021211435650067400223700ustar00rootroot00000000000000TZif2TZif2eÿÿÿÿkÈJ‹ÿÿÿÿ‘`P‹ÿÿÿÿ›Gxðÿÿÿÿ›×,pÿÿÿÿœ¼‘pÿÿÿÿÀHðÿÿÿÿž‰þpÿÿÿÿŸ *ðÿÿÿÿ `¥ðÿÿÿÿ¡€ ðÿÿÿÿ¢.ðÿÿÿÿ£zLðÿÿÿÿ¤5ðÿÿÿÿ¥^#pÿÿÿÿ¦%5ðÿÿÿÿ§'›ðÿÿÿÿ¨X&pÿÿÿÿ©}ðÿÿÿÿ©î4pÿÿÿÿªç_ðÿÿÿÿ«×Pðÿÿÿÿ¬ÇAðÿÿÿÿ­É§ðÿÿÿÿ®§#ðÿÿÿÿ¯ Opÿÿÿÿ°‡ðÿÿÿÿ±‰kðÿÿÿÿ²p"pÿÿÿÿ³rˆpÿÿÿÿ´PpÿÿÿÿµI/ðÿÿÿÿ¶/æpÿÿÿÿ·2Lpÿÿÿÿ¸Èpÿÿÿÿ¸ÿ¹pÿÿÿÿ¹ïªpÿÿÿÿºÖ`ðÿÿÿÿ»ØÆðÿÿÿÿ¼È·ðÿÿÿÿ½¸¨ðÿÿÿÿ¾Ÿ_pÿÿÿÿ¿˜ŠðÿÿÿÿÀšððÿÿÿÿÁxlðÿÿÿÿÂh]ðÿÿÿÿÃXNðÿÿÿÿÄ?pÿÿÿÿÅ80ðÿÿÿÿÆ:–ðÿÿÿÿÇX¬pÿÿÿÿÇÚ  ÿÿÿÿÈl'àÿÿÿÿÌçKÿÿÿÿÍ©ÿÿÿÿ΢CÿÿÿÿÏ’4ÿÿÿÿÐOáàÿÿÿÿЉñðÿÿÿÿÑrÿÿÿÿÒN@ »9 «ð ¤c‹„Et6d'TMD3ú#ëÜÍó¾ã¯Ó Ñ¼½¬®œŸŒ| lr!\c"LT# #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSArray *testObj = [NSTimeZone defaultTimeZone]; test_NSObject(@"NSTimeZone", [NSArray arrayWithObject:testObj]); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSTimeZone/create.m000066400000000000000000000024451435650067400216470ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; id current; id localh; current = [NSTimeZone defaultTimeZone]; PASS(current != nil && [current isKindOfClass: [NSTimeZone class]], "+defaultTimeZone works"); current = [NSTimeZone localTimeZone]; PASS(current != nil && [current isKindOfClass: [NSTimeZone class]], "+localTimeZone works"); current = [NSTimeZone systemTimeZone]; PASS(current != nil && [current isKindOfClass: [NSTimeZone class]], "+systemTimeZone works"); current = [NSTimeZone timeZoneForSecondsFromGMT: 900]; PASS(current != nil && [current isKindOfClass: [NSTimeZone class]], "+timeZoneForSecondsFromGMT works"); current = [NSTimeZone timeZoneForSecondsFromGMT: 90000]; PASS(current == nil, "+timeZoneForSecondsFromGMT fails for bad offset"); current = [NSTimeZone timeZoneWithAbbreviation: @"MST"]; PASS(current != nil && [current isKindOfClass: [NSTimeZone class]], "+timeZoneWithAbbreviation works"); current = [NSTimeZone timeZoneWithName: @"GB"]; PASS(current != nil && [current isKindOfClass: [NSTimeZone class]], "+timeZoneWithName works"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSTimeZone/localtime.m000066400000000000000000000065201435650067400223530ustar00rootroot00000000000000#import "ObjectTesting.h" #include #define PREFIX "./" static void testTZDB(NSString *fileName, const char *message, bool beyond2038) { NSTimeZone *timeZone; NSDate *date; NSData *tzdata; /* Test using TZDB file known as being v1 */ tzdata = [NSData dataWithContentsOfFile: fileName]; PASS(tzdata != nil && [tzdata isKindOfClass: [NSData class]] && [tzdata length] > 0, "Loading user-supplied %s works", message); timeZone = [NSTimeZone timeZoneWithName: fileName data: tzdata]; PASS(timeZone != nil && [timeZone isKindOfClass: [NSTimeZone class]], "+timeZoneWithName data works"); /* Before last transition in TZDB v2+ file */ date = [NSDate dateWithString: @"1981-01-16 23:59:59 -0100"]; PASS([timeZone secondsFromGMTForDate: date] == 3600, "pre-1996 standard time offset vs UTC found for user-supplied %s", message); date = [NSDate dateWithString: @"1981-08-16 23:59:59 -0200"]; PASS([timeZone secondsFromGMTForDate: date] == 7200, "pre-1996 DST time offset vs UTC found for user-supplied %s", message); /* After last transition in TZDB v2+ file */ date = [NSDate dateWithString: @"2021-01-16 23:59:59 -0100"]; PASS([timeZone secondsFromGMTForDate: date] == 3600, "post-1996 standard time offset vs UTC found for user-supplied %s", message); date = [NSDate dateWithString: @"2021-08-16 23:59:59 -0200"]; PASS([timeZone secondsFromGMTForDate: date] == 7200, "post-1996 DST time offset vs UTC found for user-supplied %s", message); /* After 32bit value seconds-since-1970 using TZDB v2+ file */ if (beyond2038) { date = [NSDate dateWithString: @"2039-01-16 23:59:59 -0200"]; PASS([timeZone secondsFromGMTForDate: date] == 3600, "post-2038 standard time offset vs UTC found for user-supplied %s", message); } return; } int main(void) { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSTimeZone *timeZone; NSDate *date; timeZone = [NSTimeZone timeZoneWithName: @"Europe/Paris"]; PASS(timeZone != nil && [timeZone isKindOfClass: [NSTimeZone class]], "+timeZoneWithName works"); /* Before last transition in TZDB v2+ file */ date = [NSDate dateWithString: @"1981-01-16 23:59:59 -0100"]; PASS([timeZone secondsFromGMTForDate: date] == 3600, "pre-1996 standard time offset vs UTC found for System Europe/Paris"); date = [NSDate dateWithString: @"1981-08-16 23:59:59 -0200"]; PASS([timeZone secondsFromGMTForDate: date] == 7200, "pre-1996 DST time offset vs UTC found for System Europe/Paris"); /* After last transition in TZDB v2+ file */ date = [NSDate dateWithString: @"2021-01-16 23:59:59 -0100"]; PASS([timeZone secondsFromGMTForDate: date] == 3600, "post-1996 standard time offset vs UTC found for System Europe/Paris"); date = [NSDate dateWithString: @"2021-08-16 23:59:59 -0200"]; PASS([timeZone secondsFromGMTForDate: date] == 7200, "post-1996 DST time offset vs UTC found for System Europe/Paris"); testTZDB(@ PREFIX "ParisV1.tzdb", "Europe/Paris TZDB v1", false); testTZDB(@ PREFIX "ParisV2.tzdb", "Europe/Paris TZDB v2", true); testTZDB(@ PREFIX "ParisV1-noMagic.tzdb", "buggy Europe/Paris TZDB v1 without magic", false); testTZDB(@ PREFIX "ParisV2-missingHeader.tzdb", "buggy Europe/Paris TZDB v2 without v2 header", true); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSTimeZone/use.m000066400000000000000000000110661435650067400211770ustar00rootroot00000000000000#import "ObjectTesting.h" #import #if defined(GS_USE_ICU) #define NSLOCALE_SUPPORTED GS_USE_ICU #else #define NSLOCALE_SUPPORTED 1 /* Assume Apple support */ #endif int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSLocale *locale; NSString *str; NSDate *date; id current; id localh = [NSTimeZone defaultTimeZone]; int offset = [localh secondsFromGMT]; current = [NSTimeZone timeZoneForSecondsFromGMT: 900]; PASS(current != nil && [current isKindOfClass: [NSTimeZone class]] && [current secondsFromGMT] == 900, "+timeZoneForSecondsFromGMT works"); current = [NSTimeZone timeZoneForSecondsFromGMT: -45]; PASS(current != nil && [current isKindOfClass: [NSTimeZone class]] && [current secondsFromGMT] == -60, "+timeZoneForSecondsFromGMT rounds to minute"); current = [NSTimeZone timeZoneForSecondsFromGMT: 7260]; PASS(current != nil && [current isKindOfClass: [NSTimeZone class]] && [[current name] isEqual: @"GMT+0201"], "+timeZoneForSecondsFromGMT has correct name"); current = [NSTimeZone timeZoneForSecondsFromGMT: -3600]; PASS(current != nil && [current isKindOfClass: [NSTimeZone class]] && [[current abbreviation] isEqual: @"GMT-0100"], "+timeZoneForSecondsFromGMT has correct abbreviation"); current = [NSTimeZone timeZoneForSecondsFromGMT: -3600]; PASS(current != nil && [current isKindOfClass: [NSTimeZone class]] && [current isDaylightSavingTime] == NO, "+timeZoneForSecondsFromGMT has DST NO"); current = [NSTimeZone timeZoneForSecondsFromGMT: offset]; [NSTimeZone setDefaultTimeZone: current]; current = [NSTimeZone localTimeZone]; PASS(current != nil && [current isKindOfClass: [NSTimeZone class]] && [current secondsFromGMT] == offset && [current isDaylightSavingTime] == NO, "can set default time zone"); START_SET("NSLocale") if (!NSLOCALE_SUPPORTED) SKIP("NSLocale not supported\nThe ICU library was not available when GNUstep-base was built") current = [NSTimeZone timeZoneWithName: @"Europe/Brussels"]; date = [current nextDaylightSavingTimeTransitionAfterDate: [NSDate dateWithString: @"2013-06-08 20:00:00 +0200"]]; PASS_EQUAL(date, [NSDate dateWithString: @"2013-10-27 03:00:00 +0200"], "can calculate next DST transition"); locale = [[NSLocale alloc] initWithLocaleIdentifier: @"en_GB"]; current = [NSTimeZone timeZoneWithName: @"Europe/Brussels"]; PASS_EQUAL( [current localizedName: NSTimeZoneNameStyleStandard locale: locale], @"Central European Standard Time", "Correctly localizes Europe/Brussels standard time zone name") PASS_EQUAL( [current localizedName: NSTimeZoneNameStyleDaylightSaving locale: locale], @"Central European Summer Time", "Correctly localizes Europe/Brussels DST time zone name") PASS_EQUAL( [current localizedName: NSTimeZoneNameStyleShortStandard locale: locale], @"CET", "Correctly localizes Europe/Brussels short time zone name") PASS_EQUAL( [current localizedName: NSTimeZoneNameStyleShortDaylightSaving locale: locale], @"CEST", "Correctly localizes Europe/Brussels short DST time zone name") current = [NSTimeZone timeZoneWithName: @"America/Sao_Paulo"]; PASS_EQUAL( [current localizedName: NSTimeZoneNameStyleStandard locale: locale], @"Brasilia Standard Time", "Correctly localizes America/Sao_Paulo standard time zone name") PASS_EQUAL( [current localizedName: NSTimeZoneNameStyleDaylightSaving locale: locale], @"Brasilia Summer Time", "Correctly localizes America/Sao_Paulo DST time zone name") testHopeful = YES; PASS_EQUAL( [current localizedName: NSTimeZoneNameStyleShortStandard locale: locale], @"GMT-3", "Correctly localizes America/Sao_Paulo short time zone name") PASS_EQUAL( [current localizedName: NSTimeZoneNameStyleShortDaylightSaving locale: locale], @"GMT-3", "Correctly localizes America/Sao_Paulo short DST time zone name") testHopeful = NO; RELEASE(locale); date = [NSDate dateWithTimeIntervalSince1970: 1.0]; PASS ([current daylightSavingTimeOffsetForDate: date] == 0.0, "Returns correct Daylight Saving offset.") date = [NSDate dateWithTimeIntervalSince1970: 1297308214.0]; PASS ([current daylightSavingTimeOffsetForDate: date] == 3600.0, "Returns correct Daylight Saving offset.") date = [NSDate date]; PASS ([current daylightSavingTimeOffset] == [current daylightSavingTimeOffsetForDate: date], "Returns correct Daylight Saving offset.") END_SET("NSLocale") [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSURL/000077500000000000000000000000001435650067400171315ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSURL/Chunked.dat000066400000000000000000000002601435650067400212020ustar00rootroot00000000000000HTTP/1.1 200 OK Content-Type: text/plain Transfer-Encoding: chunked 25 This is the data in the first chunk 1C and this is the second one 3 con 8 sequence 0 gnustep-base-1.29.0/Tests/base/NSURL/GNUmakefile.preamble000066400000000000000000000001751435650067400227740ustar00rootroot00000000000000 SUBPROJECTS = Helpers include $(GNUSTEP_MAKEFILES)/aggregate.make after-clean:: rm -f SimpleResponse.dat KAResponse.dat gnustep-base-1.29.0/Tests/base/NSURL/Helpers/000077500000000000000000000000001435650067400205335ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSURL/Helpers/GNUmakefile000066400000000000000000000004531435650067400226070ustar00rootroot00000000000000 include $(GNUSTEP_MAKEFILES)/common.make TOOL_NAME = capture respond keepalive NEEDS_GUI = NO capture_OBJC_FILES = capture.m respond_OBJC_FILES = respond.m keepalive_OBJC_FILES = keepalive.m -include GNUmakefile.preamble include $(GNUSTEP_MAKEFILES)/tool.make -include GNUmakefile.postamble gnustep-base-1.29.0/Tests/base/NSURL/Helpers/Launch.h000066400000000000000000000037221435650067400221220ustar00rootroot00000000000000/* Code to start up a helper and wait for it to confirm it's ready to proceed * The helper must write someting to stdout to indicate its readiness. */ #if GNUSTEP @interface HelperListener : NSObject { @public BOOL done; BOOL active; } - (void) helperRead: (NSNotification*)n; @end @implementation HelperListener - (void) helperRead: (NSNotification*)n { NSDictionary *u = [n userInfo]; NSData *d; d = [u objectForKey: NSFileHandleNotificationDataItem]; if ([d length] > 0) { active = YES; } done = YES; } @end @implementation NSTask (TestHelper) + (NSTask*) launchedHelperWithLaunchPath: (NSString*)_path arguments: (NSArray*)_args timeout: (NSTimeInterval)_wait { NSTask *t = [NSTask new]; ENTER_POOL NSNotificationCenter *c = [NSNotificationCenter defaultCenter]; NSPipe *p = [NSPipe pipe]; NSFileHandle *h = [p fileHandleForReading]; HelperListener *l = AUTORELEASE([HelperListener new]); NSDate *d; if (_wait <= 0.0) { _wait = 5.0; } d = [NSDate dateWithTimeIntervalSinceNow: _wait]; [t setLaunchPath: _path]; [t setArguments: _args]; [t setStandardOutput: p]; [t launch]; [c addObserver: l selector: @selector(helperRead:) name: NSFileHandleReadCompletionNotification object: h]; [h readInBackgroundAndNotify]; while (NO == l->done && [d timeIntervalSinceNow] > 0.0) { [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate: d]; } [c removeObserver: l name: NSFileHandleReadCompletionNotification object: h]; [h closeFile]; if (NO == l->done) { NSLog(@"Helper task %@ failed to start up in time.", _path); [t terminate]; [t waitUntilExit]; t = nil; } else if (NO == l->active) { NSLog(@"Helper task %@ failed to start (and ended).", _path); [t terminate]; [t waitUntilExit]; t = nil; } LEAVE_POOL return AUTORELEASE(t); } @end #endif /* GNUSTEP */ gnustep-base-1.29.0/Tests/base/NSURL/Helpers/capture.m000066400000000000000000000147421435650067400223640ustar00rootroot00000000000000#if GNUSTEP #include @interface TestClass : NSObject { NSOutputStream *op; NSInputStream *ip; NSMutableData *capture; unsigned written; BOOL readable; BOOL writable; BOOL isSecure; /* whether to use a secure TLS/SSL connection */ BOOL doRespond; /* the request is read */ BOOL done; /* the response is written */ NSString *file; /* the file to write the captured request */ } - (id) initWithSecure:(BOOL)flag; - (int) runTest; @end @implementation TestClass - (void) dealloc { RELEASE(capture); RELEASE(op); RELEASE(ip); DESTROY(file); [super dealloc]; } - (id) initWithSecure:(BOOL)flag { if ((self = [super init]) != nil) { isSecure = flag; capture = [NSMutableData new]; doRespond = NO; done = NO; file = nil; } return self; } - (id) init { return [self initWithSecure: NO]; } - (int) runTest { NSUserDefaults *defs = [NSUserDefaults standardUserDefaults]; NSRunLoop *rl = [NSRunLoop currentRunLoop]; NSHost *host = [NSHost hostWithName: @"localhost"]; NSStream *serverStream; int port = [[defs stringForKey: @"Port"] intValue]; isSecure = [[defs stringForKey: @"Secure"] boolValue]; if (port == 0) port = 1234; file = [defs stringForKey: @"FileName"]; RETAIN(file); if (file == nil) file = @"Capture.dat"; serverStream = [GSServerStream serverStreamToAddr: [host address] port: port]; if (serverStream == nil) { NSLog(@"Failed to create server stream"); return 1; } if (isSecure) { [serverStream setProperty: NSStreamSocketSecurityLevelTLSv1 forKey: NSStreamSocketSecurityLevelKey]; [serverStream setProperty: @"testCert.pem" forKey: GSTLSCertificateFile]; [serverStream setProperty: @"testKey.pem" forKey: GSTLSCertificateKeyFile]; } [serverStream setDelegate: self]; [serverStream scheduleInRunLoop: rl forMode: NSDefaultRunLoopMode]; [serverStream open]; /* Tell main test program we are ready to handle a request */ [[NSFileHandle fileHandleWithStandardOutput] writeData: [@"Ready" dataUsingEncoding: NSASCIIStringEncoding]]; while (!done) { [rl runUntilDate: [NSDate dateWithTimeIntervalSinceNow: 0.1]]; } return 0; } - (void) stream: (NSStream *)theStream handleEvent: (NSStreamEvent)streamEvent { NSRunLoop *rl = [NSRunLoop currentRunLoop]; NSString *resp = @"HTTP/1.0 204 Empty success response\r\n\r\n"; // NSLog(@"Event %p %d", theStream, streamEvent); switch (streamEvent) { case NSStreamEventHasBytesAvailable: { if (ip == nil) { [(GSServerStream*)theStream acceptWithInputStream: &ip outputStream: &op]; if (ip) // it is ok to accept nothing { RETAIN(ip); RETAIN(op); [ip scheduleInRunLoop: rl forMode: NSDefaultRunLoopMode]; [op scheduleInRunLoop: rl forMode: NSDefaultRunLoopMode]; [ip setDelegate: self]; [op setDelegate: self]; [ip open]; [op open]; [theStream close]; [theStream removeFromRunLoop: rl forMode: NSDefaultRunLoopMode]; } } if (theStream == ip) { NSRange r1; NSRange r2; NSString *headers; NSString *tmp1; NSString *tmp2; NSUInteger contentLength; readable = YES; while (readable == YES) { unsigned char buffer[BUFSIZ]; int readSize; readSize = [ip read: buffer maxLength: sizeof(buffer)]; if (readSize <= 0) { readable = NO; } else { [capture appendBytes: buffer length: readSize]; } } // the following chunk ensures that the captured data are written only // when all request's bytes are read... it waits for full headers and // reads the Content-Length's value then waits for the number of bytes // equal to that value is read tmp1 = [[NSString alloc] initWithData: capture encoding: NSUTF8StringEncoding]; // whether the headers are read if ((r1 = [tmp1 rangeOfString: @"\r\n\r\n"]).location != NSNotFound) { headers = [tmp1 substringToIndex: r1.location + 2]; if ((r2 = [[headers lowercaseString] rangeOfString: @"content-length:"]).location != NSNotFound) { tmp2 = [headers substringFromIndex: r2.location + r2.length]; // content-length: if ((r2 = [tmp2 rangeOfString: @"\r\n"]).location != NSNotFound) { // full line with content-length is present tmp2 = [tmp2 substringToIndex: r2.location]; // number of content's bytes contentLength = [tmp2 intValue]; if (r1.location + 4 + contentLength == [capture length]) // Did we get headers + body? { // full request is read so write it if ([capture writeToFile: file atomically: YES] == NO) { NSLog(@"Unable to write captured data to '%@'", file); } doRespond = YES; // allows to write the response theStream = op; } } } } DESTROY(tmp1); } if (!doRespond) break; } case NSStreamEventHasSpaceAvailable: { if (doRespond) { // if we have read all request's bytes NSData *data; NSAssert(theStream == op, @"Wrong stream for writing"); writable = YES; data = [resp dataUsingEncoding: NSASCIIStringEncoding]; while (writable == YES && written < [data length]) { int result = [op write: [data bytes] + written maxLength: [data length] - written]; if (result <= 0) { writable = NO; } else { written += result; } } if (written == [data length]) { [ip close]; [ip removeFromRunLoop: rl forMode: NSDefaultRunLoopMode]; [op close]; [op removeFromRunLoop: rl forMode: NSDefaultRunLoopMode]; done = YES; } } break; } case NSStreamEventEndEncountered: { [theStream close]; [theStream removeFromRunLoop: rl forMode: NSDefaultRunLoopMode]; NSLog(@"Server close %p", theStream); break; } case NSStreamEventErrorOccurred: { int code = [[theStream streamError] code]; [theStream close]; [theStream removeFromRunLoop: rl forMode: NSDefaultRunLoopMode]; NSAssert1(1, @"Error! code is %d", code); break; } default: break; } } @end int main(int argc, char **argv) { int result; NSAutoreleasePool *arp = [NSAutoreleasePool new]; result = [[[[TestClass alloc] init] autorelease] runTest]; RELEASE(arp); return result; } #else int main() { return 0; } #endif gnustep-base-1.29.0/Tests/base/NSURL/Helpers/keepalive.m000066400000000000000000000151751435650067400226670ustar00rootroot00000000000000#if GNUSTEP #include @interface TestClass : NSObject { NSData *bodyData; unsigned accum; unsigned count; unsigned closeFrequency; NSArray *headers; NSInputStream *inStream; NSOutputStream *outStream; } - (int) runTest; @end @implementation TestClass - (void)dealloc { [headers release]; [bodyData release]; [inStream release]; [outStream release]; [super dealloc]; } - (id) init { return self; } - (int)runTest { NSUserDefaults *defs = [NSUserDefaults standardUserDefaults]; NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; NSString *file, *lengthHeader; NSHost *host = [NSHost hostWithName: @"localhost"]; NSStream *serverStream; int port = [[defs stringForKey: @"Port"] intValue]; int lifetime = [[defs stringForKey: @"Lifetime"] intValue]; if (0 == port) port = 4322; if (0 == lifetime) lifetime = 30; accum = 0; closeFrequency = [[defs stringForKey: @"CloseFreq"] intValue]; count = [[defs stringForKey: @"Count"] intValue]; if (0 >= count) count=1; file = [defs stringForKey: @"FileName"]; if (nil == file) file = @"ResponseBody.dat"; bodyData = [[NSData alloc] initWithContentsOfFile: file]; if (nil == bodyData) { NSLog(@"Unable to load data from '%@'",file); return 1; } if (YES == [defs boolForKey: @"FileHdrs"]) { headers = nil; // Already in the file } else { lengthHeader = [NSString stringWithFormat: @"Content-Length: %u\r\n", (unsigned)[bodyData length]]; headers = [[NSArray alloc] initWithObjects: @"HTTP/1.1 200 OK\r\n", @"Content-type: text/plain\r\n", lengthHeader, nil]; } serverStream = [GSServerStream serverStreamToAddr: [host address] port: port]; if (nil == serverStream) { NSLog(@"Could not create server stream"); return 1; } [serverStream setDelegate: self]; [serverStream scheduleInRunLoop: runLoop forMode: NSDefaultRunLoopMode]; [serverStream open]; /* Tell main test program we are ready to handle a request */ [[NSFileHandle fileHandleWithStandardOutput] writeData: [@"Ready" dataUsingEncoding: NSASCIIStringEncoding]]; // only run for a fixed time anyway [runLoop runUntilDate: [NSDate dateWithTimeIntervalSinceNow: lifetime]]; return 0; } // delegate method for NSStream - (void) stream: (NSStream *)theStream handleEvent: (NSStreamEvent)streamEvent { NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; switch (streamEvent) { case NSStreamEventHasBytesAvailable: { if (theStream != inStream) { if (inStream != nil) { [inStream close]; [inStream removeFromRunLoop: runLoop forMode: NSDefaultRunLoopMode]; inStream = nil; } if (outStream != nil) { [outStream close]; [outStream removeFromRunLoop: runLoop forMode: NSDefaultRunLoopMode]; outStream = nil; } if (accum == count) { [theStream close]; [theStream removeFromRunLoop: runLoop forMode: NSDefaultRunLoopMode]; break; } [(GSServerStream*)theStream acceptWithInputStream: &inStream outputStream: &outStream]; if (inStream) { RETAIN(inStream); RETAIN(outStream); [inStream scheduleInRunLoop: runLoop forMode: NSDefaultRunLoopMode]; [inStream setDelegate: self]; [inStream open]; } else { NSLog(@"Accept returned nothing"); } } else { unsigned char buffer[BUFSIZ]; (void)[inStream read: buffer maxLength: BUFSIZ]; // make outStream available for writing [outStream scheduleInRunLoop: runLoop forMode: NSDefaultRunLoopMode]; [outStream setDelegate: self]; [outStream open]; } break; } case NSStreamEventHasSpaceAvailable: { NSAssert(theStream == outStream, @"Wrong stream for writing"); NSMutableData *payload = [[[NSMutableData alloc] init] autorelease]; NSMutableArray *headerArray = [[headers mutableCopy] autorelease]; NSEnumerator *headerEnumeration; id header; BOOL closeConnection = NO; int written; accum++; if ((0 != closeFrequency) && (0 == accum % closeFrequency)) { closeConnection = YES; [headerArray addObject: @"Connection: close\r\n"]; } headerEnumeration = [headerArray objectEnumerator]; if (nil != headerEnumeration) { while ((header = [headerEnumeration nextObject])) [payload appendData: [header dataUsingEncoding: NSASCIIStringEncoding]]; [payload appendData: [@"\n" dataUsingEncoding: NSASCIIStringEncoding]]; } [payload appendData: bodyData]; // provide the reply written = [outStream write: [payload bytes] maxLength: [payload length]]; if (written <= 0) { // something seriously wrong.... closeConnection = YES; NSLog(@"Unable to write the payload!"); } // remove from runloop, so we have to wait for another request [outStream removeFromRunLoop: runLoop forMode: NSDefaultRunLoopMode]; if (closeConnection) { [outStream close]; outStream = nil; if (nil != inStream) { [inStream close]; [inStream removeFromRunLoop: runLoop forMode: NSDefaultRunLoopMode]; inStream = nil; } } break; } case NSStreamEventEndEncountered: { NSAssert(inStream == theStream || outStream == theStream, NSInternalInconsistencyException); [theStream close]; [theStream removeFromRunLoop: runLoop forMode: NSDefaultRunLoopMode]; if (theStream == inStream) inStream = nil; if (theStream == outStream) outStream = nil; break; } case NSStreamEventErrorOccurred: { NSError *err = [theStream streamError]; int code = [err code]; NSLog(@"Received error %@ (%d) on stream %p", err, code, theStream); [theStream close]; [theStream removeFromRunLoop: runLoop forMode: NSDefaultRunLoopMode]; if (theStream == inStream) inStream = nil; if (theStream == outStream) outStream = nil; break; } case NSStreamEventOpenCompleted: break; default: NSLog(@"Unknown event %u on stream %p", (unsigned)streamEvent, theStream); break; } } @end int main(int argc, char **argv) { int result; NSAutoreleasePool *arp = [[NSAutoreleasePool alloc] init]; result = [[[[TestClass alloc] init] autorelease] runTest]; [arp release]; return result; } #else int main() { return 0; } #endif gnustep-base-1.29.0/Tests/base/NSURL/Helpers/respond.m000066400000000000000000000146741435650067400223770ustar00rootroot00000000000000#if GNUSTEP #include @interface TestClass : NSObject { NSOutputStream *op; NSInputStream *ip; NSData *content; unsigned written; BOOL readable; BOOL writable; unsigned writeLen; unsigned count; double pause; } - (int) runTest; @end @implementation TestClass - (void) dealloc { RELEASE(content); RELEASE(op); RELEASE(ip); [super dealloc]; } - (id) init { return self; } - (int) runTest { NSUserDefaults *defs = [NSUserDefaults standardUserDefaults]; NSRunLoop *rl = [NSRunLoop currentRunLoop]; NSHost *host = [NSHost hostWithName: @"localhost"]; NSStream *serverStream; NSString *file; int port = [[defs stringForKey: @"Port"] intValue]; if (port == 0) port = 1234; count = [[defs stringForKey: @"Count"] intValue]; if (count <= 0) count = 1; pause = [defs floatForKey: @"Pause"]; file = [defs stringForKey: @"FileName"]; if (file == nil) file = @"Respond.dat"; content = [[NSData alloc] initWithContentsOfFile: file]; if (content == nil) { NSLog(@"Unable to load data from '%@'", file); return 1; } if ([defs boolForKey: @"Shrink"] == YES) { writeLen = [content length]; } else { writeLen = 0; } serverStream = [GSServerStream serverStreamToAddr: [host address] port: port]; if (serverStream == nil) { NSLog(@"Failed to create server stream"); return 1; } [serverStream setDelegate: self]; [serverStream scheduleInRunLoop: rl forMode: NSDefaultRunLoopMode]; [serverStream open]; /* Tell main test program we are ready to handle a request */ [[NSFileHandle fileHandleWithStandardOutput] writeData: [@"Ready" dataUsingEncoding: NSASCIIStringEncoding]]; /* Run for up to 5 minutes to allow slow/large tests to complete. */ [rl runUntilDate: [NSDate dateWithTimeIntervalSinceNow: 300]]; return 0; } - (void) stream: (NSStream *)theStream handleEvent: (NSStreamEvent)streamEvent { NSRunLoop *rl = [NSRunLoop currentRunLoop]; NSLog(@"Server %p %u", theStream, (unsigned)streamEvent); switch (streamEvent) { case NSStreamEventHasBytesAvailable: { if (theStream != ip) { if (ip != nil) { [ip close]; [ip removeFromRunLoop: rl forMode: NSDefaultRunLoopMode]; ip = nil; } if (op != nil) { [op close]; [op removeFromRunLoop: rl forMode: NSDefaultRunLoopMode]; op = nil; } [(GSServerStream*)theStream acceptWithInputStream: &ip outputStream: &op]; if (ip) // it is ok to accept nothing { written = 0; // Nothing written yet on this connection. RETAIN(ip); RETAIN(op); [ip scheduleInRunLoop: rl forMode: NSDefaultRunLoopMode]; [op scheduleInRunLoop: rl forMode: NSDefaultRunLoopMode]; [ip setDelegate: self]; [op setDelegate: self]; [ip open]; [op open]; NSLog(@"Accept %d", count); if (count > 0) { count--; } if (count == 0) { /* * Handled enough requests ... close down */ [theStream close]; [theStream removeFromRunLoop: rl forMode: NSDefaultRunLoopMode]; } if (writeLen > 0 && [[NSUserDefaults standardUserDefaults] boolForKey: @"Shrink"] == YES) { /* Want to write in slightly smaller chunks for each * connection so that the remote end can check that * it handles different chunk sizes properly. */ writeLen--; } } else { NSLog(@"Accept returned nothing"); } } else if (theStream == ip) { readable = YES; while (readable == YES) { unsigned char buffer[BUFSIZ]; int readSize; readSize = [ip read: buffer maxLength: sizeof(buffer)]; if (readSize <= 0) { readable = NO; } } } break; } case NSStreamEventHasSpaceAvailable: { NSAssert(theStream == op, @"Wrong stream for writing"); writable = YES; while (writable == YES && written < [content length]) { int length = [content length] - written; /* If we have a write length limit set, don't try to write * more than that in one chunk. */ if (writeLen > 0 && length > writeLen) { length = writeLen; } /* We now pause for the time (in sec) specified. Even if * the time is zero or less we still have a small pause, to try to * coerce the OS into separating the write events. */ if (pause <= 0) { [NSThread sleepUntilDate: [NSDate dateWithTimeIntervalSinceNow: 0.00001]]; } else { [NSThread sleepUntilDate: [NSDate dateWithTimeIntervalSinceNow: pause]]; } length = [op write: [content bytes] + written maxLength: length]; if (length <= 0) { writable = NO; } else { written += length; } } if (written == [content length]) { [op close]; [op removeFromRunLoop: rl forMode: NSDefaultRunLoopMode]; op = nil; if (ip != nil) { [ip close]; [ip removeFromRunLoop: rl forMode: NSDefaultRunLoopMode]; ip = nil; NSLog(@"Done reading %d", count+1); } NSLog(@"Done writing %d", count+1); } break; } case NSStreamEventEndEncountered: { NSAssert(ip == theStream || op == theStream, NSInternalInconsistencyException); [theStream close]; [theStream removeFromRunLoop: rl forMode: NSDefaultRunLoopMode]; if (theStream == ip) ip = nil; if (theStream == op) op = nil; NSLog(@"Server close %p", theStream); break; } case NSStreamEventErrorOccurred: { int code = [[theStream streamError] code]; NSLog(@"Error on %p code is %d", theStream, code); [theStream close]; [theStream removeFromRunLoop: rl forMode: NSDefaultRunLoopMode]; if (theStream == ip) ip = nil; if (theStream == op) op = nil; break; } case NSStreamEventOpenCompleted: break; default: NSLog(@"Unexpected event %u on %p", (unsigned)streamEvent, theStream); break; } } @end int main(int argc, char **argv) { int result; NSAutoreleasePool *arp = [NSAutoreleasePool new]; result = [[[[TestClass alloc] init] autorelease] runTest]; RELEASE(arp); return result; } #else int main() { return 0; } #endif gnustep-base-1.29.0/Tests/base/NSURL/TestInfo000066400000000000000000000000001435650067400205750ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSURL/basic.m000066400000000000000000000366261435650067400204050ustar00rootroot00000000000000#import #import "Testing.h" #import "ObjectTesting.h" #if GNUSTEP extern const char *GSPathHandling(const char *); #endif int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSURL *url; NSURL *rel; NSData *data; NSString *str; NSNumber *num; unsigned i; unichar bad[] = {'h', 't', 't', 'p', ':', '/', '/', 'w', 'w', 'w', '.', 'w', '3', '.', 'o', 'r', 'g', '/', 0x200B}; unichar u = 163; unichar buf[256]; TEST_FOR_CLASS(@"NSURL", [NSURL alloc], "NSURL +alloc returns an NSURL"); TEST_FOR_CLASS(@"NSURL", [NSURL fileURLWithPath: @"."], "NSURL +fileURLWithPath: returns an NSURL"); TEST_FOR_CLASS(@"NSURL", [NSURL URLWithString: @"http://httpbin.org/"], "NSURL +URLWithString: returns an NSURL"); url = [NSURL URLWithString: nil]; PASS(nil == url, "A nil string result in nil URL"); str = [NSString stringWithCharacters: bad length: sizeof(bad)/sizeof(*bad)]; url = [NSURL URLWithString: str]; PASS(nil == url, "Bad characters result in nil URL"); str = [NSString stringWithCharacters: &u length: 1]; url = [NSURL fileURLWithPath: str]; str = [[[NSFileManager defaultManager] currentDirectoryPath] stringByAppendingPathComponent: str]; PASS([[url path] isEqual: str], "Can put a pound sign in a file URL"); str = [url scheme]; PASS([str isEqual: @"file"], "Scheme of file URL is file"); url = [NSURL URLWithString: @"http://httpbin.org/"]; data = [url resourceDataUsingCache: NO]; PASS(data != nil, "Can load a page from httpbin.org"); num = [url propertyForKey: NSHTTPPropertyStatusCodeKey]; PASS([num isKindOfClass: [NSNumber class]] && [num intValue] == 200, "Status of load is 200 for httpbin.org"); url = [NSURL URLWithString:@"this isn't a URL"]; PASS(url == nil, "URL with 'this isn't a URL' returns nil"); url = [NSURL URLWithString: @"http://httpbin.org/silly-file-name"]; data = [url resourceDataUsingCache: NO]; num = [url propertyForKey: NSHTTPPropertyStatusCodeKey]; PASS_EQUAL(num, [NSNumber numberWithInt: 404], "Status of load is 404 for httpbin.org/silly-file-name"); str = [url scheme]; PASS([str isEqual: @"http"], "Scheme of http://httpbin.org/silly-file-name is http"); str = [url host]; PASS([str isEqual: @"httpbin.org"], "Host of http://httpbin.org/silly-file-name is httpbin.org"); str = [url path]; PASS([str isEqual: @"/silly-file-name"], "Path of http://httpbin.org/silly-file-name is /silly-file-name"); PASS([[url resourceSpecifier] isEqual: @"//httpbin.org/silly-file-name"], "resourceSpecifier of http://httpbin.org/silly-file-name is //httpbin.org/silly-file-name"); url = [NSURL URLWithString: @"http://httpbin.org/silly-file-path/"]; PASS_EQUAL([url path], @"/silly-file-path", "Path of http://httpbin.org/silly-file-path/ is /silly-file-path"); PASS_EQUAL([url resourceSpecifier], @"//httpbin.org/silly-file-path/", "resourceSpecifier of http://httpbin.org/silly-file-path/ is //httpbin.org/silly-file-path/"); PASS_EQUAL([url absoluteString], @"http://httpbin.org/silly-file-path/", "Abs of http://httpbin.org/silly-file-path/ is correct"); url = [NSURL URLWithString: @"http://httpbin.org"]; PASS_EQUAL([url scheme], @"http", "Scheme of http://httpbin.org is http"); PASS_EQUAL([url host], @"httpbin.org", "Host of http://httpbin.org is httpbin.org"); PASS_EQUAL([url path], @"", "Path of http://httpbin.org is empty"); PASS_EQUAL([url resourceSpecifier], @"//httpbin.org", "resourceSpecifier of http://httpbin.org is //httpbin.org"); url = [url URLByAppendingPathComponent: @"example_path"]; PASS_EQUAL([url description], @"http://httpbin.org/example_path", "Append of component to pathless http URL works"); #if defined(_WIN32) url = [NSURL fileURLWithPath: @"C:\\WINDOWS"]; str = [url path]; PASS_EQUAL(str, @"C:\\WINDOWS", "Path of file URL C:\\WINDOWS is C:\\WINDOWS"); PASS_EQUAL([url description], @"file:///C:%5CWINDOWS/", "File URL C:\\WINDOWS is file:///C:%%5CWINDOWS/"); PASS_EQUAL([url resourceSpecifier], @"/C:%5CWINDOWS/", "resourceSpecifier of C:\\WINDOWS is /C:%5CWINDOWS/"); #else url = [NSURL fileURLWithPath: @"/usr"]; str = [url path]; PASS_EQUAL(str, @"/usr", "Path of file URL /usr is /usr"); PASS_EQUAL([url description], @"file:///usr/", "File URL /usr is file:///usr/"); PASS_EQUAL([url resourceSpecifier], @"/usr/", "resourceSpecifier of /usr is /usr/"); #endif PASS_EXCEPTION([[NSURL alloc] initFileURLWithPath: nil isDirectory: YES], NSInvalidArgumentException, "nil is an invalid argument for -initFileURLWithPath:isDirectory:"); PASS_EXCEPTION([[NSURL alloc] initFileURLWithPath: nil], NSInvalidArgumentException, "nil is an invalid argument for -initFileURLWithPath:"); PASS_EXCEPTION([NSURL fileURLWithPath: nil], NSInvalidArgumentException, "nil is an invalid argument for +fileURLWithPath:"); url = [NSURL URLWithString: @"file:///usr"]; PASS_EQUAL([url resourceSpecifier], @"/usr", "resourceSpecifier of file:///usr is /usr"); url = [NSURL URLWithString: @"http://here.and.there/testing/one.html"]; rel = [NSURL URLWithString: @"https://here.and.there/aaa/bbb/ccc/" relativeToURL: url]; PASS_EQUAL([rel absoluteString], @"https://here.and.there/aaa/bbb/ccc/", "Absolute URL relative to URL works"); url = [NSURL URLWithString: @"http://here.and.there/testing/one.html"]; rel = [NSURL URLWithString: @"aaa/bbb/ccc/" relativeToURL: url]; PASS_EQUAL([rel absoluteString], @"http://here.and.there/testing/aaa/bbb/ccc/", "Simple relative URL absoluteString works"); PASS_EQUAL([rel path], @"/testing/aaa/bbb/ccc", "Simple relative URL path works"); #if GNUSTEP PASS_EQUAL([rel fullPath], @"/testing/aaa/bbb/ccc/", "Simple relative URL fullPath works"); #endif url = [NSURL URLWithString: @"http://1.2.3.4/a?b;foo"]; PASS_EQUAL([url absoluteString], @"http://1.2.3.4/a?b;foo", "query and params not escaped"); url = [[[NSURL alloc] initWithScheme: @"http" host: @"1.2.3.4" path: @"/a?b;foo"] autorelease]; PASS_EQUAL([url absoluteString], @"http://1.2.3.4/a?b;foo", "query and params not escaped"); url = [NSURL URLWithString: @"http://here.and.there/testing/one.html"]; rel = [NSURL URLWithString: @"/aaa/bbb/ccc/" relativeToURL: url]; PASS([[rel absoluteString] isEqual: @"http://here.and.there/aaa/bbb/ccc/"], "Root relative URL absoluteString works"); PASS([[rel path] isEqual: @"/aaa/bbb/ccc"], "Root relative URL path works"); #if GNUSTEP PASS([[rel fullPath] isEqual: @"/aaa/bbb/ccc/"], "Root relative URL fullPath works"); #endif url = [NSURL URLWithString: @"/aaa/bbb/ccc/"]; PASS([[url absoluteString] isEqual: @"/aaa/bbb/ccc/"], "absolute root URL absoluteString works"); PASS([[url path] isEqual: @"/aaa/bbb/ccc"], "absolute root URL path works"); #if GNUSTEP PASS([[url fullPath] isEqual: @"/aaa/bbb/ccc/"], "absolute root URL fullPath works"); #endif url = [NSURL URLWithString: @"aaa/bbb/ccc/"]; PASS([[url absoluteString] isEqual: @"aaa/bbb/ccc/"], "absolute URL absoluteString works"); PASS([[url path] isEqual: @"aaa/bbb/ccc"], "absolute URL path works"); #if GNUSTEP PASS([[url fullPath] isEqual: @"aaa/bbb/ccc/"], "absolute URL fullPath works"); #endif url = [NSURL URLWithString: @"http://127.0.0.1/"]; PASS([[url absoluteString] isEqual: @"http://127.0.0.1/"], "absolute http URL absoluteString works"); PASS([[url path] isEqual: @"/"], "absolute http URL path works"); #if GNUSTEP PASS([[url fullPath] isEqual: @"/"], "absolute http URL fullPath works"); #endif url = [NSURL URLWithString: @"http://127.0.0.1/ hello"]; PASS(url == nil, "space is illegal"); url = [NSURL URLWithString: @""]; PASS([[url absoluteString] isEqual: @""], "empty string gives empty URL"); PASS([url path] == nil, "empty string gives nil path"); PASS([url scheme] == nil, "empty string gives nil scheme"); url = [NSURL URLWithString: @"/%65"]; PASS_EQUAL([url path], @"/e", "escapes are decoded in path"); url = [NSURL URLWithString: @"/%3D"]; PASS_EQUAL([url path], @"/=", "uppercase percent escape for '=' in path"); url = [NSURL URLWithString: @"/%3d"]; PASS_EQUAL([url path], @"/=", "lowercase percent escape for '=' in path"); url = [NSURL URLWithString: @"aaa%20ccc/"]; PASS([[url absoluteString] isEqual: @"aaa%20ccc/"], "absolute URL absoluteString works with encoded space"); PASS([[url path] isEqual: @"aaa ccc"], "absolute URL path decodes space"); url = [NSURL URLWithString: @"/?aaa%20ccc"]; PASS([[url query] isEqual: @"aaa%20ccc"], "escapes are not decoded in query"); url = [NSURL URLWithString: @"/#aaa%20ccc"]; PASS([[url fragment] isEqual: @"aaa%20ccc"], "escapes are not decoded in fragment"); url = [NSURL URLWithString: @"/tmp/xxx"]; PASS([[url path] isEqual: @"/tmp/xxx"] && [url scheme] == nil, "a simple path becomes a simple URL"); url = [NSURL URLWithString: @"filename"]; PASS([[url path] isEqual: @"filename"] && [url scheme] == nil, "a simple file name becomes a simple URL"); url = [NSURL URLWithString: @"file://localhost/System/Library/" @"Documentation/Developer/Gui/Reference/index.html"]; str = @"NSApplication.html"; rel = [NSURL URLWithString: str relativeToURL: url]; //NSLog(@"with link %@, obtained URL: %@ String: %@", str, rel, [rel absoluteString]); PASS([[rel absoluteString] isEqual: @"file://localhost/System/Library/Documentation/Developer/Gui/Reference/NSApplication.html"], "Adding a relative file URL works"); str = @"NSApplication.html#class$NSApplication"; rel = [NSURL URLWithString: str relativeToURL: url]; //NSLog(@"with link %@, obtained URL: %@ String: %@", str, rel, [rel absoluteString]); PASS([[rel absoluteString] isEqual: @"file://localhost/System/Library/Documentation/Developer/Gui/Reference/NSApplication.html#class$NSApplication"], "Adding relative file URL with fragment works"); #if defined(_WIN32) GSPathHandling("unix"); #endif buf[0] = '/'; for (i = 1; i < 256; i++) { buf[i] = i; } str = [NSString stringWithCharacters: buf length: 256]; url = [NSURL fileURLWithPath: str]; NSLog(@"path quoting %@", [url absoluteString]); PASS_EQUAL([url absoluteString], @"file:///%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F%20!%22%23$%25&'()*+,-./0123456789:%3B%3C=%3E%3F@ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D~%7F%C2%80%C2%81%C2%82%C2%83%C2%84%C2%85%C2%86%C2%87%C2%88%C2%89%C2%8A%C2%8B%C2%8C%C2%8D%C2%8E%C2%8F%C2%90%C2%91%C2%92%C2%93%C2%94%C2%95%C2%96%C2%97%C2%98%C2%99%C2%9A%C2%9B%C2%9C%C2%9D%C2%9E%C2%9F%C2%A0%C2%A1%C2%A2%C2%A3%C2%A4%C2%A5%C2%A6%C2%A7%C2%A8%C2%A9%C2%AA%C2%AB%C2%AC%C2%AD%C2%AE%C2%AF%C2%B0%C2%B1%C2%B2%C2%B3%C2%B4%C2%B5%C2%B6%C2%B7%C2%B8%C2%B9%C2%BA%C2%BB%C2%BC%C2%BD%C2%BE%C2%BF%C3%80%C3%81%C3%82%C3%83%C3%84%C3%85%C3%86%C3%87%C3%88%C3%89%C3%8A%C3%8B%C3%8C%C3%8D%C3%8E%C3%8F%C3%90%C3%91%C3%92%C3%93%C3%94%C3%95%C3%96%C3%97%C3%98%C3%99%C3%9A%C3%9B%C3%9C%C3%9D%C3%9E%C3%9F%C3%A0%C3%A1%C3%A2%C3%A3%C3%A4%C3%A5%C3%A6%C3%A7%C3%A8%C3%A9%C3%AA%C3%AB%C3%AC%C3%AD%C3%AE%C3%AF%C3%B0%C3%B1%C3%B2%C3%B3%C3%B4%C3%B5%C3%B6%C3%B7%C3%B8%C3%B9%C3%BA%C3%BB%C3%BC%C3%BD%C3%BE%C3%BF", "path quoting"); /* Test +fileURLWithPath: for messy/complex path */ url = [NSURL fileURLWithPath: @"/this#is a Path with % + = & < > ?"]; PASS_EQUAL([url path], @"/this#is a Path with % + = & < > ?", "complex -path"); PASS_EQUAL([url fragment], nil, "complex -fragment"); PASS_EQUAL([url parameterString], nil, "complex -parameterString"); PASS_EQUAL([url query], nil, "complex -query"); PASS_EQUAL([url absoluteString], @"file:///this%23is%20a%20Path%20with%20%25%20+%20=%20&%20%3C%20%3E%20%3F", "complex -absoluteString"); PASS_EQUAL([url relativeString], @"file:///this%23is%20a%20Path%20with%20%25%20+%20=%20&%20%3C%20%3E%20%3F", "complex -relativeString"); PASS_EQUAL([url description], @"file:///this%23is%20a%20Path%20with%20%25%20+%20=%20&%20%3C%20%3E%20%3F", "complex -description"); #if defined(_WIN32) GSPathHandling("right"); #endif /* Test +URLWithString: for file URL with a messy/complex path */ url = [NSURL URLWithString: @"file:///pathtofile;parameters?query#anchor"]; PASS(nil == [url host], "host"); PASS(nil == [url user], "user"); PASS(nil == [url password], "password"); PASS_EQUAL([url resourceSpecifier], @"/pathtofile;parameters?query#anchor", "resourceSpecifier"); PASS_EQUAL([url path], @"/pathtofile", "path"); PASS_EQUAL([url query], @"query", "query"); PASS_EQUAL([url parameterString], @"parameters", "parameterString"); PASS_EQUAL([url fragment], @"anchor", "fragment"); PASS_EQUAL([url absoluteString], @"file:///pathtofile;parameters?query#anchor", "absoluteString"); PASS_EQUAL([url relativePath], @"/pathtofile", "relativePath"); PASS_EQUAL([url description], @"file:///pathtofile;parameters?query#anchor", "description"); url = [NSURL URLWithString: @"file:///pathtofile; parameters? query #anchor"]; // can't initialize with spaces (must be %20) PASS(nil == url, "url with spaces"); url = [NSURL URLWithString: @"file:///pathtofile;%20parameters?%20query%20#anchor"]; PASS(nil != url, "url without spaces"); str = [[NSFileManager defaultManager] currentDirectoryPath]; str = [str stringByAppendingPathComponent: @"basic.m"]; url = [NSURL fileURLWithPath: str]; PASS([url resourceDataUsingCache: NO] != nil, "can load file URL"); str = [str stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]; str = [NSString stringWithFormat: @"file://localhost/%@#anchor", str]; url = [NSURL URLWithString: str]; PASS([url resourceDataUsingCache: NO] != nil, "can load file URL with anchor"); url = [NSURL URLWithString: @"data:,a23"]; PASS_EQUAL([url scheme], @"data", "can get scheme of data URL"); PASS_EQUAL([url path], nil, "path of data URL is nil"); PASS_EQUAL([url host], nil, "host of data URL is nil"); PASS_EQUAL([url resourceSpecifier], @",a23", "resourceSpecifier of data URL"); PASS_EQUAL([url absoluteString], @"data:,a23", "can get string of data URL"); url = [NSURL URLWithString: @"data:,%2A"]; PASS_EQUAL([url resourceSpecifier], @",%2A", "resourceSpecifier escape OK"); url = [NSURL URLWithString: @"http://here.and.there/testing/one.html"]; rel = [NSURL URLWithString: @"data:,$2A" relativeToURL: url]; PASS_EQUAL([rel absoluteString], @"data:,$2A", "relative data URL works"); PASS_EQUAL([rel baseURL], nil, "Base URL of relative data URL is nil"); ///NSURLQueryItem //OSX behavior is to return query item with an empty string name NSURLQueryItem* item = [[NSURLQueryItem alloc] init]; PASS_EQUAL(item.name, @"", "NSURLQueryItem.name should not be nil"); PASS_EQUAL(item.value, nil, "NSURLQueryItem.value should be nil"); //OSX behavior is to return query item with an empty string name item = [[NSURLQueryItem alloc] initWithName:nil value:nil]; PASS_EQUAL(item.name, @"", "NSURLQueryItem.name should not be nil"); PASS_EQUAL(item.value, nil, "NSURLQueryItem.value should be nil"); item = [[NSURLQueryItem alloc] initWithName:@"myName" value:@"myValue"]; PASS_EQUAL(item.name, @"myName", "NSURLQueryItem.name should not be nil"); PASS_EQUAL(item.value, @"myValue", "NSURLQueryItem.value should not be nil"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSURL/charsets.m000066400000000000000000000035241435650067400211270ustar00rootroot00000000000000#import #import "Testing.h" #import "ObjectTesting.h" int main() { START_SET("URL character sets") NSMutableString *m = [NSMutableString string]; NSDictionary *sets; NSEnumerator *enumerator; NSString *key; sets = [NSDictionary dictionaryWithObjectsAndKeys: @"!$&'()*+,-./0123456789:;=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~", @"URLFragmentAllowedCharacterSet", @"!$&'()*+,-.0123456789:;=ABCDEFGHIJKLMNOPQRSTUVWXYZ[]_abcdefghijklmnopqrstuvwxyz~", @"URLHostAllowedCharacterSet", @"!$&'()*+,-.0123456789;=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~", @"URLPasswordAllowedCharacterSet", @"!$&'()*+,-./0123456789:=@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~", @"URLPathAllowedCharacterSet", @"!$&'()*+,-./0123456789:;=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~", @"URLQueryAllowedCharacterSet", @"!$&'()*+,-.0123456789;=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~", @"URLUserAllowedCharacterSet", nil]; enumerator = [sets keyEnumerator]; while (nil != (key = [enumerator nextObject])) { NSString *expect = [sets objectForKey: key]; const char *name = [key UTF8String]; NSCharacterSet *set; unichar c; set = (NSCharacterSet*)[[NSCharacterSet class] performSelector: NSSelectorFromString(key)]; [m setString: @""]; for (c = 0; c < 128; c++) { if ([set characterIsMember: c]) { NSString *s; s = [[NSString alloc] initWithCharacters: &c length: 1]; [m appendString: s]; RELEASE(s); } } PASS_EQUAL(m, expect, "%s as string", name) } END_SET("URL character sets") return 0; } gnustep-base-1.29.0/Tests/base/NSURL/components.m000066400000000000000000000101371435650067400214760ustar00rootroot00000000000000#import #import "Testing.h" #import "ObjectTesting.h" int main() { NSURLComponents *components = nil; START_SET("components"); components = [NSURLComponents componentsWithURL: [NSURL URLWithString: @"https://user:password@some.host.com"] resolvingAgainstBaseURL: NO]; [components setQueryItems: [NSArray arrayWithObjects: [NSURLQueryItem queryItemWithName: @"lang" value: @"en"], [NSURLQueryItem queryItemWithName: @"response_type" value: @"code"], [NSURLQueryItem queryItemWithName: @"uri" value: [[NSURL URLWithString: @"https://some.url.com/path?param1=one¶m2=two"] absoluteString]], nil]]; // URL PASS_EQUAL([components string], @"https://user:password@some.host.com?lang=en&response_type=code" @"&uri=https://some.url.com/path?param1%3Done%26param2%3Dtwo", "URL string is correct") // encoded... PASS_EQUAL([components percentEncodedQuery], @"lang=en&response_type=code&uri=https://some.url.com/path" @"?param1%3Done%26param2%3Dtwo", "percentEncodedQuery is correct") PASS_EQUAL([components percentEncodedHost], @"some.host.com", "percentEncodedHost is correct") PASS_EQUAL([components percentEncodedUser], @"user", "percentEncodedUser is correct") PASS_EQUAL([components percentEncodedPassword], @"password", "percentEncodedPassword is correct") // unencoded... PASS_EQUAL([components query], @"lang=en&response_type=code&uri=https://some.url.com/path?" @"param1=one¶m2=two", "query is correct") PASS_EQUAL([components host], @"some.host.com", "host is correct") PASS_EQUAL([components user], @"user", "user is correct") PASS_EQUAL([components password], @"password", "password is correct") [components setQuery: nil]; PASS_EQUAL([components query], nil, "set query to nil") PASS_EQUAL([components percentEncodedQuery], nil, "percent encoded query is nil") PASS_EQUAL([components queryItems], nil, "query items is nil") PASS_EQUAL([components percentEncodedQueryItems], nil, "percent encoded query items is nil") [components setQuery: @""]; NSArray *emptyArray = [NSArray array]; PASS_EQUAL([components query], @"", "set query to empty") PASS_EQUAL([components percentEncodedQuery], @"", "percent encoded query is empty") PASS_EQUAL([components queryItems], emptyArray, "query items is empty") PASS_EQUAL([components percentEncodedQueryItems], emptyArray, "percent encoded query items is empty") [components setQuery: @"&"]; PASS_EQUAL([components query], @"&", "set query to ampersand") PASS_EQUAL([components percentEncodedQuery], @"&", "percent encoded ampersand query is still ampersand") [components setPercentEncodedQuery: @"%26"]; PASS_EQUAL([components query], @"&", "set query to item containing ampersand") PASS_EQUAL([components percentEncodedQuery], @"%26", "percent encoded query item encodes ampersand") //NSURLQueryItem percent encoding/decoding test NSString* urlString = @"http://domain/?%D0%90%D0%B0%D0%91%D0%B1=%D0%90%D0%B0%D0%91%D0%B1"; NSString* cyrillicStr = @"\U00000410\U00000430\U00000411\U00000431"; NSURLComponents* components = [NSURLComponents componentsWithString:urlString]; NSURLQueryItem* item = [[components queryItems] lastObject]; PASS_EQUAL(item.name, cyrillicStr, "Should return decoded query item name from url"); PASS_EQUAL(item.value, cyrillicStr, "Should return decoded query item value from url"); item = [NSURLQueryItem queryItemWithName:cyrillicStr value:cyrillicStr]; [components setQueryItems:[NSArray arrayWithObject:item]]; PASS_EQUAL([components string], urlString, "Encoded url string from unencoded item"); PASS_EQUAL([components URL], [NSURL URLWithString:urlString], "Encoded url query part from unencoded item"); NSString* invalidUrlString = @"\U00000410\U00000430\U00000411\U00000431"; PASS_EQUAL([NSURL URLWithString:invalidUrlString], nil, "nil NSURL from invalid string") PASS_EQUAL([NSURLComponents componentsWithString:invalidUrlString], nil, "nil NSComponents from invalid string") END_SET("components") return 0; } gnustep-base-1.29.0/Tests/base/NSURL/mystep.m000066400000000000000000000140341435650067400206320ustar00rootroot00000000000000#import #import "Testing.h" #import "ObjectTesting.h" int main() { START_SET("test1") NSURL *url; url = [NSURL URLWithString: @"scheme://user:password@host.domain.org:888/path/absfile.htm"]; url = [NSURL URLWithString: @"file%20name.htm;param1;param2?something=other&andmore=more#fragments" relativeToURL: url]; PASS_EQUAL([url description], @"file%20name.htm;param1;param2?something=other&andmore=more#fragments -- scheme://user:password@host.domain.org:888/path/absfile.htm", "description ok"); PASS_EQUAL([url absoluteString], @"scheme://user:password@host.domain.org:888/path/file%20name.htm;param1;param2?something=other&andmore=more#fragments", "absolute string ok"); PASS_EQUAL([[url absoluteURL] description], @"scheme://user:password@host.domain.org:888/path/file%20name.htm;param1;param2?something=other&andmore=more#fragments", "absolute url description ok"); PASS_EQUAL([[url baseURL] description], @"scheme://user:password@host.domain.org:888/path/absfile.htm", "base url description ok"); PASS_EQUAL([url fragment], @"fragments", "fragment ok"); PASS_EQUAL([url host], @"host.domain.org", "host ok"); PASS (NO == [url isFileURL], "is not a file url"); PASS_EQUAL([url parameterString], @"param1;param2", "parameter string ok"); PASS_EQUAL([url password], @"password", "password ok"); PASS_EQUAL([url path], @"/path/file name.htm", "path ok"); PASS_EQUAL([url port], [NSNumber numberWithInt:888], "port ok"); PASS_EQUAL([url query], @"something=other&andmore=more", "query ok"); PASS_EQUAL([url relativePath], @"file name.htm", "relativePath ok"); PASS_EQUAL([url relativeString], @"file%20name.htm;param1;param2?something=other&andmore=more#fragments", "relativeString ok"); PASS_EQUAL([url resourceSpecifier], @"file%20name.htm;param1;param2?something=other&andmore=more#fragments", "resourceSpecifier ok"); PASS_EQUAL([url scheme], @"scheme", "scheme ok"); PASS_EQUAL([[url standardizedURL] absoluteString], @"scheme://user:password@host.domain.org:888/path/file%20name.htm;param1;param2?something=other&andmore=more#fragments", "standardizedURL ok"); PASS_EQUAL([url user], @"user", "user ok"); END_SET("test1") START_SET("test2") NSURL *url = [NSURL URLWithString: @"data:,A%20brief%20note"]; PASS_EQUAL([url scheme], @"data", "test data"); PASS_EQUAL([url absoluteString], @"data:,A%20brief%20note", "data absolute string ok"); END_SET("test2") START_SET("test3") NSURL *url = [NSURL URLWithString: @"data:image/gif;base64,R0lGODdhMAAwAPAAAAAAAP///ywAAAAAMAAwAAAC8IyPqcvt3wCcDkiLc7C0qwyGHhSWpjQu5yqmCYsapyuvUUlvONmOZtfzgFzByTB10QgxOR0TqBQejhRNzOfkVJ+5YiUqrXF5Y5lKh/DeuNcP5yLWGsEbtLiOSpa/TPg7JpJHxyendzWTBfX0cxOnKPjgBzi4diinWGdkF8kjdfnycQZXZeYGejmJlZeGl9i2icVqaNVailT6F5iJ90m6mvuTS4OK05M0vDk0Q4XUtwvKOzrcd3iq9uisF81M1OIcR7lEewwcLp7tuNNkM3uNna3F2JQFo97Vriy/Xl4/f1cf5VWzXyym7PHhhx4dbgYKAAA7"]; PASS_EQUAL([url scheme], @"data", "longer base64 data url ok"); END_SET("test3") START_SET("test4") NSURL *url = [NSURL URLWithString: @"data:,A%20brief%20note" relativeToURL: [NSURL URLWithString: @"data:other"]]; PASS_EQUAL([url scheme], @"data", "relative data url ok"); PASS_EQUAL([url absoluteString], @"data:,A%20brief%20note", "data absoluteString"); END_SET("test4") START_SET("test4b") NSURL *url = [NSURL URLWithString: @"data:,A%20brief%20note" relativeToURL: [NSURL URLWithString: @"file://localhost/"]]; PASS_EQUAL([url absoluteString], @"data:,A%20brief%20note", "data absoluteString"); END_SET("test4b") START_SET("test5") #ifdef _WIN32 GSPathHandling("unix"); #endif NSURL *url = [NSURL fileURLWithPath: @"/this#is a Path with % < > ?"]; PASS_EQUAL([url scheme], @"file", "scheme"); PASS([url host] == nil, "host"); PASS(nil == [url user], "user"); PASS(nil == [url password], "password"); PASS_EQUAL([url resourceSpecifier], @"/this%23is%20a%20Path%20with%20%25%20%3C%20%3E%20%3F", "resourceSpecifier"); PASS_EQUAL([url path], @"/this#is a Path with % < > ?", "path"); PASS(nil == [url query], "query"); PASS(nil == [url parameterString], "parameterString"); PASS(nil == [url fragment], "fragment"); PASS_EQUAL([url absoluteString], @"file:///this%23is%20a%20Path%20with%20%25%20%3C%20%3E%20%3F", "absoluteString"); PASS_EQUAL([url relativePath], @"/this#is a Path with % < > ?", "relativePath"); PASS_EQUAL([url description], @"file:///this%23is%20a%20Path%20with%20%25%20%3C%20%3E%20%3F", "description"); END_SET("test5") START_SET("test5b") NSURL *url = [NSURL URLWithString: @"file:///pathtofile;parameters?query#anchor"]; PASS([url isFileURL], "file url"); PASS_EQUAL([url scheme], @"file", "file scheme"); PASS(nil == [url host], "host"); PASS(nil == [url user], "user"); PASS(nil == [url password], "password"); PASS_EQUAL([url resourceSpecifier], @"/pathtofile;parameters?query#anchor", "resourceSpecifier"); PASS_EQUAL([url path], @"/pathtofile", "path"); PASS_EQUAL([url query], @"query", "query"); PASS_EQUAL([url parameterString], @"parameters", "parameterString"); PASS_EQUAL([url fragment], @"anchor", "fragment"); PASS_EQUAL([url absoluteString], @"file:///pathtofile;parameters?query#anchor", "absoluteString"); PASS_EQUAL([url relativePath], @"/pathtofile", "relativePath"); PASS_EQUAL([url description], @"file:///pathtofile;parameters?query#anchor", "description"); END_SET("test5b") START_SET("test5c") // can't initialize with spaces (must be %20) NSURL *url = [NSURL URLWithString: @"file:///pathtofile; parameters? query #anchor"]; PASS(nil == url, "spaces not allowed in file url built with string"); END_SET("test5c") START_SET("test5d") NSURL *url = [NSURL URLWithString: @"file:///pathtofile;%20parameters?%20query%20#anchor"]; PASS(nil != url, "url"); END_SET("test5d") START_SET("test6") // empty string is invalid - should return nils NSURL *url = [NSURL URLWithString: @""]; PASS(nil == [url path], "empty string gives nil"); END_SET("test6") return 0; } gnustep-base-1.29.0/Tests/base/NSURL/test00.m000066400000000000000000000156061435650067400204360ustar00rootroot00000000000000#import #import "Testing.h" #import "ObjectTesting.h" #import "Helpers/Launch.h" int main() { #if GNUSTEP ENTER_POOL unsigned i, j; NSTimeInterval wake = 10.0; NSURL *url; NSURL *u; NSData *data; NSMutableData *resp; NSData *cont; NSString *str; NSMutableString *m; NSTask *t; NSString *helpers; NSString *respond; NSString *keepalive; helpers = [[NSFileManager defaultManager] currentDirectoryPath]; helpers = [helpers stringByAppendingPathComponent: @"Helpers"]; helpers = [helpers stringByAppendingPathComponent: @"obj"]; keepalive = [helpers stringByAppendingPathComponent: @"keepalive"]; respond = [helpers stringByAppendingPathComponent: @"respond"]; /* The following test cases depend on the keepalive and response * HTTP servers. Both servers use the GSInetServerStream * class which is completely broken on Windows. * * See: https://github.com/gnustep/libs-base/issues/266 * * We will mark the test cases as hopeful on Windows. */ #if defined(_WIN32) NSLog(@"Marking local web server tests as hopeful because GSInetServerStream is broken on Windows"); testHopeful = YES; #endif START_SET("-resourceDataUsingCache") const char *lit = "This is the data in the first chunk\r\n" "and this is the second one\r\n" "consequence"; t = [NSTask launchedHelperWithLaunchPath: keepalive arguments: [NSArray arrayWithObjects: @"-FileName", @"Chunked.dat", @"-FileHdrs", @"YES", // Headers are in file @"-Port", @"1234", @"-Count", @"1", nil] timeout: wake]; NEED(testPassed = (t != nil)) cont = [NSData dataWithBytes: lit length: strlen(lit)]; u = [NSURL URLWithString: @"http://localhost:1234/chunked"]; // Talk to server. data = [u resourceDataUsingCache: NO]; // Get status code str = [u propertyForKey: NSHTTPPropertyStatusCodeKey]; PASS_EQUAL(data, cont, "NSURL chunked test OK"); // Wait for server termination [t terminate]; [t waitUntilExit]; END_SET("-resourceDataUsingCache") START_SET("-sendSynchronousRequest:returningResponse:error:") NSURLRequest *request; NSHTTPURLResponse *response; NSError *error; const char *lit = "This is the data in the first chunk\r\n" "and this is the second one\r\n" "consequence"; t = [NSTask launchedHelperWithLaunchPath: keepalive arguments: [NSArray arrayWithObjects: @"-FileName", @"Chunked.dat", @"-FileHdrs", @"YES", // Headers are in file @"-Port", @"1234", @"-Count", @"1", nil] timeout: wake]; NEED(testPassed = (t != nil)) cont = [NSData dataWithBytes: lit length: strlen(lit)]; u = [NSURL URLWithString: @"http://localhost:1234/chunked"]; request = [NSURLRequest requestWithURL: u]; response = nil; data = [NSURLConnection sendSynchronousRequest: request returningResponse: &response error: &error]; // Get status code PASS(response != nil && [response statusCode] > 0, "NSURLConnection synchronous load returns a response"); PASS([data isEqual: cont], "NSURLConnection chunked test OK"); // Wait for server termination [t terminate]; [t waitUntilExit]; END_SET("-sendSynchronousRequest:returningResponse:error:") url = [NSURL URLWithString: @"http://localhost:1234/"]; START_SET("Shrink") /* Ask the 'respond' helper to send back a response containing * 'hello' and to shrink the write buffer size it uses on each * request. We do as many requests as the total response size * so that on the last one, the 'respond' program writes data * a byte at a time. * This tests that the URL loading code can handle a request * that arrives fragmented rather than in a single read. */ m = [NSMutableString stringWithCapacity: 2048]; for (i = 0; i < 128; i++) { [m appendFormat: @"Hello %d\r\n", i]; } cont = [m dataUsingEncoding: NSASCIIStringEncoding]; resp = AUTORELEASE([[@"HTTP/1.0 200\r\n\r\n" dataUsingEncoding: NSASCIIStringEncoding] mutableCopy]); [resp appendData: cont]; [resp writeToFile: @"SimpleResponse.dat" atomically: YES]; str = [NSString stringWithFormat: @"%lu", (unsigned long)[resp length]]; t = [NSTask launchedHelperWithLaunchPath: respond arguments: [NSArray arrayWithObjects: @"-FileName", @"SimpleResponse.dat", @"-Shrink", @"YES", @"-Count", str, nil] timeout: wake]; NEED(testPassed = (t != nil)) i = [resp length]; while (i-- > 0) { NSAutoreleasePool *pool = [NSAutoreleasePool new]; char buf[128]; /* Just to test caching of url handles, we use eighteen * different URLs (we know the cache size is 16) to ensure * that loads work when handles are flushed from the cache. */ u = [NSURL URLWithString: [NSString stringWithFormat: @"http://localhost:1234/%d", i % 18]]; // Talk to server. data = [u resourceDataUsingCache: NO]; // Get status code str = [u propertyForKey: NSHTTPPropertyStatusCodeKey]; sprintf(buf, "respond test %d OK", i); PASS([data isEqual: cont], "%s", buf) [pool release]; } // Wait for server termination [t terminate]; [t waitUntilExit]; END_SET("Shrink") /* Now build a response which pretends to be an HTTP1.1 server and should * support connection keepalive ... so we can test that the keeplive code * correctly handles the case where the remote end drops the connection. */ cont = [@"hello" dataUsingEncoding: NSASCIIStringEncoding]; resp = AUTORELEASE([[@"HTTP/1.1 200\r\nContent-Length: 5\r\n\r\n" dataUsingEncoding: NSASCIIStringEncoding] mutableCopy]); [resp appendData: cont]; [resp writeToFile: @"SimpleResponse.dat" atomically: YES]; str = [NSString stringWithFormat: @"%lu", (unsigned long)[resp length]]; for (j = 0; j < 13 ; j += 4) { NSString *delay = [NSString stringWithFormat: @"%u", j]; NSString *name = [NSString stringWithFormat: @"Keepalive drop %u", j]; START_SET([name UTF8String]) t = [NSTask launchedHelperWithLaunchPath: respond arguments: [NSArray arrayWithObjects: @"-FileName", @"SimpleResponse.dat", @"-Count", @"2", @"-Pause", delay, nil] timeout: wake]; NEED(testPassed = (t != nil)) for (i = 0; i < 2; i++) { NSAutoreleasePool *pool = [NSAutoreleasePool new]; char buf[128]; // Talk to server. data = [url resourceDataUsingCache: NO]; // Get status code str = [url propertyForKey: NSHTTPPropertyStatusCodeKey]; sprintf(buf, "respond with keepalive %d (pause %d) OK", i, j); PASS([data isEqual: cont], "%s", buf) [pool release]; /* Allow remote end time to close socket. */ [NSThread sleepUntilDate: [NSDate dateWithTimeIntervalSinceNow: 0.1]]; } /* Kill helper task and wait for it to finish */ [t terminate]; [t waitUntilExit]; END_SET([name UTF8String]) } LEAVE_POOL #if defined(_WIN32) testHopeful = NO; #endif #endif return 0; } gnustep-base-1.29.0/Tests/base/NSURL/test01.m000066400000000000000000000042551435650067400204350ustar00rootroot00000000000000#import #import "Testing.h" #import "ObjectTesting.h" #import "Helpers/Launch.h" int main() { #if GNUSTEP ENTER_POOL unsigned i; NSURL *url; NSData *data; NSData *resp; NSString *str; NSTimeInterval wake = 10.0; NSMutableString *m; NSTask *t; NSString *helpers; NSString *keepalive; helpers = [[NSFileManager defaultManager] currentDirectoryPath]; helpers = [helpers stringByAppendingPathComponent: @"Helpers"]; helpers = [helpers stringByAppendingPathComponent: @"obj"]; keepalive = [helpers stringByAppendingPathComponent: @"keepalive"]; /* The following test cases depend on the keepalive * HTTP server. This server uses the GSInetServerStream * class which is completely broken on Windows. * * See: https://github.com/gnustep/libs-base/issues/266 * * We will mark the test cases as hopeful on Windows. */ #if defined(_WIN32) NSLog(@"Marking local web server tests as hopeful because GSInetServerStream is broken on Windows"); testHopeful = YES; #endif START_SET("Keepalive") url = [NSURL URLWithString: @"http://localhost:4322/"]; m = [NSMutableString stringWithCapacity: 2048]; for (i = 0; i < 128; i++) { [m appendFormat: @"Hello %d\r\n", i]; } resp = [m dataUsingEncoding: NSASCIIStringEncoding]; [resp writeToFile: @"KAResponse.dat" atomically: YES]; t = [NSTask launchedHelperWithLaunchPath: keepalive arguments: [NSArray arrayWithObjects: @"-FileName", @"KAResponse.dat", @"-CloseFreq", @"3", @"-Count", @"10", nil] timeout: wake]; NEED(testPassed = (t != nil)) for (i = 0; i < 10; i++) { /*we just get the response every time. It should be the *same every time, even though the headers change and *sometimes the connection gets dropped */ char buf[BUFSIZ]; data = [url resourceDataUsingCache: NO]; str = [url propertyForKey: NSHTTPPropertyStatusCodeKey]; sprintf(buf, "keep-alive test %d OK",i); PASS([data isEqual:resp], "%s", buf) } [t terminate]; [t waitUntilExit]; END_SET("Keepalive") LEAVE_POOL #if defined(_WIN32) testHopeful = NO; #endif #endif return 0; } gnustep-base-1.29.0/Tests/base/NSURL/test02.m000066400000000000000000000100041435650067400204230ustar00rootroot00000000000000#import #import "Testing.h" #import "ObjectTesting.h" #import "Helpers/Launch.h" int main() { #if GNUSTEP ENTER_POOL unsigned i; NSURL *url; NSMutableString *m; NSData *data; NSString *str; NSTask *t; NSTimeInterval wake = 10.0; NSString *helpers; NSString *capture; NSMutableURLRequest *request; NSHTTPURLResponse *response = nil; NSError *error = nil; NSFileManager *fm; NSRange r; NSString *file = @"Capture.dat"; fm = [NSFileManager defaultManager]; helpers = [fm currentDirectoryPath]; helpers = [helpers stringByAppendingPathComponent: @"Helpers"]; helpers = [helpers stringByAppendingPathComponent: @"obj"]; capture = [helpers stringByAppendingPathComponent: @"capture"]; /* The following test cases depend on the capture * HTTP server. The server uses the GSInetServerStream * class which is completely broken on Windows. * * See: https://github.com/gnustep/libs-base/issues/266 * * We will mark the test cases as hopeful on Windows. */ #if defined(_WIN32) NSLog(@"Marking local web server tests as hopeful because GSInetServerStream is broken on Windows"); testHopeful = YES; #endif m = [NSMutableString stringWithCapacity: 2048]; for (i = 0; i < 128; i++) { [m appendFormat: @"Hello %d\r\n", i]; } START_SET("Capture") t = [NSTask launchedHelperWithLaunchPath: capture arguments: [NSArray arrayWithObjects: nil] timeout: wake]; NEED(testPassed = (t != nil)) // remove the captured data from a possible previous run [fm removeItemAtPath: file error: NULL]; // making a POST request url = [NSURL URLWithString: @"http://localhost:1234/"]; request = [NSMutableURLRequest requestWithURL: url]; data = [m dataUsingEncoding: NSUTF8StringEncoding]; [request setHTTPBody: data]; [request setHTTPMethod: @"POST"]; // sending the request [NSURLConnection sendSynchronousRequest: request returningResponse: &response error: &error]; // analyzing the response PASS(response != nil && [response statusCode] == 204, "NSURLConnection synchronous load returns a response"); data = [NSData dataWithContentsOfFile: file]; str = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding]; r = [str rangeOfString: m]; PASS(r.location != NSNotFound, "NSURLConnection capture test OK"); // Wait for server termination [t terminate]; [t waitUntilExit]; DESTROY(str); response = nil; error = nil; END_SET("Capture") START_SET("Secure") // the same but with secure connection (HTTPS) t = [NSTask launchedHelperWithLaunchPath: capture arguments: [NSArray arrayWithObjects: @"-Secure", @"YES", nil] timeout: wake]; NEED(testPassed = (t != nil)) // Pause to allow server subtask to set up. [NSThread sleepUntilDate: [NSDate dateWithTimeIntervalSinceNow: 0.5]]; // remove the captured data from a possible previous run [fm removeItemAtPath: file error: NULL]; // making a POST request url = [NSURL URLWithString: @"https://localhost:1234/"]; request = [NSMutableURLRequest requestWithURL: url]; data = [m dataUsingEncoding: NSUTF8StringEncoding]; [request setHTTPBody: data]; [request setHTTPMethod: @"POST"]; // sending the request [NSURLConnection sendSynchronousRequest: request returningResponse: &response error: &error]; // sending the request PASS(response != nil && [response statusCode] == 204, "NSURLConnection synchronous load returns a response"); data = [NSData dataWithContentsOfFile: file]; str = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding]; r = [str rangeOfString: m]; PASS(r.location != NSNotFound, "NSURLConnection capture test OK"); // Wait for server termination [t terminate]; [t waitUntilExit]; DESTROY(str); END_SET("Secure") LEAVE_POOL #if defined(_WIN32) testHopeful = NO; #endif #endif return 0; } gnustep-base-1.29.0/Tests/base/NSURL/testCert.pem000066400000000000000000000054161435650067400214370ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIID6TCCAtGgAwIBAgIJAP02s2/x3i8ZMA0GCSqGSIb3DQEBCwUAMIGKMQswCQYD VQQGEwJYWDEOMAwGA1UECAwFV29ybGQxEDAOBgNVBAcMB0dOVXN0ZXAxITAfBgNV BAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDESMBAGA1UEAwwJbG9jYWxob3N0 MSIwIAYJKoZIhvcNAQkBFhNnbnVzdGVwLWRldkBnbnUub3JnMB4XDTE0MDgwNzEx MTIxN1oXDTI0MDgwNDExMTIxN1owgYoxCzAJBgNVBAYTAlhYMQ4wDAYDVQQIDAVX b3JsZDEQMA4GA1UEBwwHR05Vc3RlcDEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0 cyBQdHkgTHRkMRIwEAYDVQQDDAlsb2NhbGhvc3QxIjAgBgkqhkiG9w0BCQEWE2du dXN0ZXAtZGV2QGdudS5vcmcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB AQDxFVEHh137hyl0juYvbXuAOUIXRSVwk92mAGJIIn0g0Dm6KIAJW1EGR5LeHY3L vrkxEAvGxb7Ypqtg1F4OcwoZE/1Y0xKjHBnqtMJcw7DgN9F1dIkQ9HxHkYPiHzTF d7floomsjyt0BcqAqE1Qf0ahsnveq9E6KTIYRTZ91RGHQrAW4KBxFM30ieHYQYdn 2vDgH/8wyLjwQ+89P5SrBJdt+eKHPjHvjs1WZe0i660hvLa19l/DQ5ZxlV5LJ6tZ yjvr+OjT9tE86r9n34vk+ZZBCQwvzZ+dHwLpufz3VgPap54bCCLY21BZj15nqITN k+8XJz+aavFe3zdMvT9cGiZNAgMBAAGjUDBOMB0GA1UdDgQWBBRB6fstnCsIvg3r 9f3EmiZhLS867TAfBgNVHSMEGDAWgBRB6fstnCsIvg3r9f3EmiZhLS867TAMBgNV HRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQC0fy/lWgBZRTXfAUOfZp5sWJcQ mQKQiPfXYxiUALq6iI1SyQq90kJ1DyLEGJJ9HEaP3s3jyFQgLXoi1J/8qyOESUDy ogC8nIod6vfA9g8eWcFeOEd6YnNWykPjGCqA/mzrzN3abFkERap8ivx4RWVYX9bP ZNhJVxcoqVCjtFmIh6ATNG/0+xfxax4U4GitcHNYD0Ij+qdXqNJHym67uVponLYE SnxxF3lZ6FzB51SyKtJF5j4/fEeyDXR8Uy3zJdrb6mhSUJNX5RYcrdiR9RflrfGy qYOXFtWmFv/+w/OaqugXQfx9By8uI49U9BG8Q7xSsZSXmoEuMGYt+UwE7UP+ -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIID6TCCAtGgAwIBAgIJAP02s2/x3i8ZMA0GCSqGSIb3DQEBCwUAMIGKMQswCQYD VQQGEwJYWDEOMAwGA1UECAwFV29ybGQxEDAOBgNVBAcMB0dOVXN0ZXAxITAfBgNV BAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDESMBAGA1UEAwwJbG9jYWxob3N0 MSIwIAYJKoZIhvcNAQkBFhNnbnVzdGVwLWRldkBnbnUub3JnMB4XDTE0MDgwNzEx MTIxN1oXDTI0MDgwNDExMTIxN1owgYoxCzAJBgNVBAYTAlhYMQ4wDAYDVQQIDAVX b3JsZDEQMA4GA1UEBwwHR05Vc3RlcDEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0 cyBQdHkgTHRkMRIwEAYDVQQDDAlsb2NhbGhvc3QxIjAgBgkqhkiG9w0BCQEWE2du dXN0ZXAtZGV2QGdudS5vcmcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB AQDxFVEHh137hyl0juYvbXuAOUIXRSVwk92mAGJIIn0g0Dm6KIAJW1EGR5LeHY3L vrkxEAvGxb7Ypqtg1F4OcwoZE/1Y0xKjHBnqtMJcw7DgN9F1dIkQ9HxHkYPiHzTF d7floomsjyt0BcqAqE1Qf0ahsnveq9E6KTIYRTZ91RGHQrAW4KBxFM30ieHYQYdn 2vDgH/8wyLjwQ+89P5SrBJdt+eKHPjHvjs1WZe0i660hvLa19l/DQ5ZxlV5LJ6tZ yjvr+OjT9tE86r9n34vk+ZZBCQwvzZ+dHwLpufz3VgPap54bCCLY21BZj15nqITN k+8XJz+aavFe3zdMvT9cGiZNAgMBAAGjUDBOMB0GA1UdDgQWBBRB6fstnCsIvg3r 9f3EmiZhLS867TAfBgNVHSMEGDAWgBRB6fstnCsIvg3r9f3EmiZhLS867TAMBgNV HRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQC0fy/lWgBZRTXfAUOfZp5sWJcQ mQKQiPfXYxiUALq6iI1SyQq90kJ1DyLEGJJ9HEaP3s3jyFQgLXoi1J/8qyOESUDy ogC8nIod6vfA9g8eWcFeOEd6YnNWykPjGCqA/mzrzN3abFkERap8ivx4RWVYX9bP ZNhJVxcoqVCjtFmIh6ATNG/0+xfxax4U4GitcHNYD0Ij+qdXqNJHym67uVponLYE SnxxF3lZ6FzB51SyKtJF5j4/fEeyDXR8Uy3zJdrb6mhSUJNX5RYcrdiR9RflrfGy qYOXFtWmFv/+w/OaqugXQfx9By8uI49U9BG8Q7xSsZSXmoEuMGYt+UwE7UP+ -----END CERTIFICATE----- gnustep-base-1.29.0/Tests/base/NSURL/testKey.pem000066400000000000000000000064361435650067400212750ustar00rootroot00000000000000-----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEA8RVRB4dd+4cpdI7mL217gDlCF0UlcJPdpgBiSCJ9INA5uiiA CVtRBkeS3h2Ny765MRALxsW+2KarYNReDnMKGRP9WNMSoxwZ6rTCXMOw4DfRdXSJ EPR8R5GD4h80xXe35aKJrI8rdAXKgKhNUH9GobJ73qvROikyGEU2fdURh0KwFuCg cRTN9Inh2EGHZ9rw4B//MMi48EPvPT+UqwSXbfnihz4x747NVmXtIuutIby2tfZf w0OWcZVeSyerWco76/jo0/bRPOq/Z9+L5PmWQQkML82fnR8C6bn891YD2qeeGwgi 2NtQWY9eZ6iEzZPvFyc/mmrxXt83TL0/XBomTQIDAQABAoIBAAZmlnwor+oZsJQT pzDjK0BAROzxPQk8I8pggDuCDuhsHtw+bwfQkNol1FRpXHZoXepbjrR8U5DU+//a I5UmoMIBsdxF3lzORjHhErf7yhpp4PnJWkpE83fC+Ulroq8LeqpyIk2ej3zJGpNH 5KWae3mXj4pd7XQp29ahH80/dvOsWGZyYOXqh7jO6UdXfhPHKIhLN6wd9nzmRy44 PLFcQYo/nTM19ackz9joovyGPy87BGsj3+rALRXd+GMPVtRFFPMtm6PnSTsMsoDg HEsm76CygnmL7/ywIXSVY/rfomm73SV9FgFalkUSpNWdLqiXiLICVTKC2P1ZUCdg eL/A59ECgYEA/nfw/9Vh86LVQ6Vqfp9W/pAut9ik8SecqodOptBSVV2YBYcfBejL dqksW3LaARabGMJh1z5tHfIw+buF7tl8OIy+TNYRNdrUlsNpI7lWVCVp5F4Znr3c a7GsGE82/XA3eiEZhUfaQeCctOMXoPnZO32mdDal3rYYQ7yKMvAO8gsCgYEA8ojA pK80FURe+kM0Zd/ftTAzMkGJNWnKkSSqd+sI7iCwzd9KAX3d+EM4/vqguMXzw+MP FMkXOv4PUP0iV1XyBt1hn+OSdfax4mD9ALOyJoCHvLPsRjlIv7iEsD2oi84mJ07v 3fFuku+xDrPwMBJgeIWjC2ml9J3YYrB5ppPRmAcCgYEA+64/Y5l1ttW/XpeVm8UW 8tJCEr2obYfDMPqAtQZn2FyohhcdfOfBjQxHfe87ZUYpgjSHNq9clvi6rdVl41Wh wgCaGz7CaOSVzMNbEuU1WCZk9GSJrHKWNsHUt3pppgK+LAHezu7BFNUFyPauoR1c WLWu01RVe8/Yce5hNX4vGf8CgYEA5w7pmPthfzFX2szTyopyMcftvl85PK3A0m5A CWbdZx+10Sx88Nbc9Xv1fNWA8QeFqIVVBNRfUVBhfyLp6JJ0tZ2LOCwyiDeyWJ1V 66lGe+/PYTN4UZ6ZdC1yHAVh4W9QYfqOAr/UPCAman96wBGB3tBR+Ll55YXLdJn0 C4KgF1kCgYAHjE0j82DF+6sKw+ggUcMgLM0z6HcYE975T/c4KNqb11Mu2+38CQvY pvlzOgQxzbjq59reek3gRtj3u0UCaXzTnIvgLl+sC0/l4f4qEVwcEcnMiJyUAIsR VR7Mw874clbF8TK8tLlcgCipmDmWxFlrgxOPs1ikcObvTOR/oxacUQ== -----END RSA PRIVATE KEY----- -----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEA8RVRB4dd+4cpdI7mL217gDlCF0UlcJPdpgBiSCJ9INA5uiiA CVtRBkeS3h2Ny765MRALxsW+2KarYNReDnMKGRP9WNMSoxwZ6rTCXMOw4DfRdXSJ EPR8R5GD4h80xXe35aKJrI8rdAXKgKhNUH9GobJ73qvROikyGEU2fdURh0KwFuCg cRTN9Inh2EGHZ9rw4B//MMi48EPvPT+UqwSXbfnihz4x747NVmXtIuutIby2tfZf w0OWcZVeSyerWco76/jo0/bRPOq/Z9+L5PmWQQkML82fnR8C6bn891YD2qeeGwgi 2NtQWY9eZ6iEzZPvFyc/mmrxXt83TL0/XBomTQIDAQABAoIBAAZmlnwor+oZsJQT pzDjK0BAROzxPQk8I8pggDuCDuhsHtw+bwfQkNol1FRpXHZoXepbjrR8U5DU+//a I5UmoMIBsdxF3lzORjHhErf7yhpp4PnJWkpE83fC+Ulroq8LeqpyIk2ej3zJGpNH 5KWae3mXj4pd7XQp29ahH80/dvOsWGZyYOXqh7jO6UdXfhPHKIhLN6wd9nzmRy44 PLFcQYo/nTM19ackz9joovyGPy87BGsj3+rALRXd+GMPVtRFFPMtm6PnSTsMsoDg HEsm76CygnmL7/ywIXSVY/rfomm73SV9FgFalkUSpNWdLqiXiLICVTKC2P1ZUCdg eL/A59ECgYEA/nfw/9Vh86LVQ6Vqfp9W/pAut9ik8SecqodOptBSVV2YBYcfBejL dqksW3LaARabGMJh1z5tHfIw+buF7tl8OIy+TNYRNdrUlsNpI7lWVCVp5F4Znr3c a7GsGE82/XA3eiEZhUfaQeCctOMXoPnZO32mdDal3rYYQ7yKMvAO8gsCgYEA8ojA pK80FURe+kM0Zd/ftTAzMkGJNWnKkSSqd+sI7iCwzd9KAX3d+EM4/vqguMXzw+MP FMkXOv4PUP0iV1XyBt1hn+OSdfax4mD9ALOyJoCHvLPsRjlIv7iEsD2oi84mJ07v 3fFuku+xDrPwMBJgeIWjC2ml9J3YYrB5ppPRmAcCgYEA+64/Y5l1ttW/XpeVm8UW 8tJCEr2obYfDMPqAtQZn2FyohhcdfOfBjQxHfe87ZUYpgjSHNq9clvi6rdVl41Wh wgCaGz7CaOSVzMNbEuU1WCZk9GSJrHKWNsHUt3pppgK+LAHezu7BFNUFyPauoR1c WLWu01RVe8/Yce5hNX4vGf8CgYEA5w7pmPthfzFX2szTyopyMcftvl85PK3A0m5A CWbdZx+10Sx88Nbc9Xv1fNWA8QeFqIVVBNRfUVBhfyLp6JJ0tZ2LOCwyiDeyWJ1V 66lGe+/PYTN4UZ6ZdC1yHAVh4W9QYfqOAr/UPCAman96wBGB3tBR+Ll55YXLdJn0 C4KgF1kCgYAHjE0j82DF+6sKw+ggUcMgLM0z6HcYE975T/c4KNqb11Mu2+38CQvY pvlzOgQxzbjq59reek3gRtj3u0UCaXzTnIvgLl+sC0/l4f4qEVwcEcnMiJyUAIsR VR7Mw874clbF8TK8tLlcgCipmDmWxFlrgxOPs1ikcObvTOR/oxacUQ== -----END RSA PRIVATE KEY----- gnustep-base-1.29.0/Tests/base/NSURLConnection/000077500000000000000000000000001435650067400211515ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSURLConnection/GNUmakefile.preamble000066400000000000000000000001051435650067400250050ustar00rootroot00000000000000 SUBPROJECTS = Helpers include $(GNUSTEP_MAKEFILES)/aggregate.make gnustep-base-1.29.0/Tests/base/NSURLConnection/Helpers/000077500000000000000000000000001435650067400225535ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSURLConnection/Helpers/GNUmakefile000066400000000000000000000011161435650067400246240ustar00rootroot00000000000000include $(GNUSTEP_MAKEFILES)/common.make BUNDLE_NAME = TestConnection NEEDS_GUI=NO TestConnection_OBJC_FILES = TestCase.m SimpleWebServer.m TestWebServer.m NSURLConnectionTest.m RequestHandler.m #TestConnection_OBJC_LIBS += -lWebServer -lPerformance TestConnection_RESOURCE_FILES += testKey.pem testCert.pem TestConnection_PRINCIPAL_CLASS = NSURLConnectionTest TOOL_NAME = testTestWebServer testTestWebServer_OBJC_FILES += testTestWebServer.m -include GNUmakefile.preamble include $(GNUSTEP_MAKEFILES)/bundle.make include $(GNUSTEP_MAKEFILES)/tool.make -include GNUmakefile.postamble gnustep-base-1.29.0/Tests/base/NSURLConnection/Helpers/NSURLConnectionTest.h000066400000000000000000000231271435650067400265140ustar00rootroot00000000000000/** -*- objc -*- * * Author: Sergei Golovin * * The class is intended to test the class NSURLConnection. It is designed to start * a TestWebServer instance and make NSURLConnection to it getting TestWebServerDelegate's * and NSURLConnection's callbacks. As TestCase's child it has two flag sets, the actual * one and the reference one (See TestCase.h). It sets/unsets flags of the actual set on * the execution path at the 'checkpoints' listed below as macros. * * The method -[isSuccess] is called when the NSURLConnection finishes (fails). It makes * a comparison between the two flag sets. The result signifies a success/failure of the * test. * * The test case which the NSURLConnectionTest implements by default is connecting * to the http://localhost:1234/ whith the HTTP method 'GET'. You can change variable * parts of process by supplying a custom dictionary to the method -[setUpTest:] * before the test case is started by a call of the -[startTest:]. The use pattern: * -------------------------------------------------------------------------- * #import "NSURLConnectionTest.h" * #import "Testing.h" * * NSURLConnectionTest *testCase = [NSURLConnectionTest new]; * // the extra dictionary with test cases's parameters * NSDictionary *d = [NSDictionary dictionaryWithObjectsAndKeys: * @"/somepath", @"Path", * @"POST", @"Method", * @"https", @"Protocol", * nil]; * [testCase setUpTest: d]; * [testCase startTest: d]; * PASS([testCase isSuccess], "a diagnostic message about the test"); * [testCase tearDownTest: d]; * DESTROY(testCase); * -------------------------------------------------------------------------- * * The method -[setUpTest:] recognises the following variable parts (supplied as key-value * pairs): * * 'Instance' * 'AuxInstance' - holds an already running main/auxilliary TestWebServer instance. * If nil the class will run one main instance of TestWebServer * and no auxilliary one. The key 'IsAuxilliary' with the value 'YES' * should be supplied to run an own auxilliary instance. * Useful to run several tests consequently. The test won't stop * on its own the supplied instance(s). It leaves the calling code * to make the decision. The auxilliary instance 'AuxInstance' is * used in tests on redirecting where two web servers are needed. * Default: nil * 'IsAuxilliary' - whether the NSURLConnectionTest should run it's own auxilliary * TestWebServer instance. You must supply YES as a value to run it. * It will be run with the same parameters (address/protocol/detached) * as the main one except of the port which is assigned from the value * of the key 'AuxPort'. * Default: NO * 'IsDetached' - whether to run the own(and auxilliary) instance in the detached mode * (the instance will be run within a detached thread). * Default: NO * 'Address' - the address of the remote side. * Default: localhost * 'Port' - the port of the remote side. * Default: 1234 * 'AuxPort' - the port of the auxilliary remote side (where the connection * to be redirected). * Default: 1235 * 'Protocol' - the network protocol (supports currently http, https). * Default: http * 'Path' - the path of the URL. * Default: '/' * 'RedirectPath' - the path where request should be redirected in corresponding tests. * Default: '/' * 'StatusCode' - the status code expected from the remote side if the test * is successful. * Default: 204 * 'RedirectCode' - the status code expected from the remote side on the connection's first * stage in a test with redirect. * Default: 301 * 'Method' - the request's method. * Default: GET * 'Payload' - the request's payload. It can be of NSString or of NSData class. * The class produces NSData from NSString using NSUTF8StringEncoding. * Default: nil * 'Content' - the expected content. It can be of NSString or of NSData class. * The class produces NSData from NSString using NSUTF8StringEncoding. * Default: nil * 'ReferenceFlags' - the dictionary to correct the guessed reference flag set. * Default: nil * The class tries to infer the reference flag set from * the test request. If that guessed (default) set is wrong then this * dictionary allows to correct it. * The class recognises the following keys: * * 'SENTREQUEST' * 'AUTHORIZED' * 'NOTAUTHORIZED' * 'GOTUNAUTHORIZED' * 'GOTREQUEST' * 'SENTRESPONSE' * 'GOTRESPONSE' * 'GOTCONTENT' * 'GOTFINISH' * 'GOTFAIL' * 'GOTREDIRECT' * * the 'YES' as a value means the corresponding reference flag * must be set, otherwise 'NO' means it must not be set. * * The NSURLConnectionTest can raise it's verbosity level by the method call -[setDebug: YES]. * In this case whole connection session will be showed in the log. * */ #import "TestWebServer.h" #import "TestCase.h" /* the test's checkpoint list */ /* the request has been sent by the client and reaches the server */ #define SENTREQUEST 1 /* the client's request has been authorized */ #define AUTHORIZED 2 /* the client's request hasn't been authorized */ #define NOTAUTHORIZED 4 /* the client has got Unauthorized response */ #define GOTUNAUTHORIZED 8 /* the server has got a right request */ #define GOTREQUEST 16 /* the server is ready to send the response */ #define SENTRESPONSE 32 /* the client has got the response from the server with valid headers/properties */ #define GOTRESPONSE 64 /* the client has got the expected content from the server's response */ #define GOTCONTENT 128 /* the test's execution has reached client's -[connectionDidFinishLoading:] */ #define GOTFINISH 256 /* the test's execution has reached client's -[connection:didFailWithError:] */ #define GOTFAIL 512 /* the test's execution has reached client's -[connection:willSendRequest:redirectResponse:]*/ #define GOTREDIRECT 1024 /* the end of the test's checkpoint list */ @interface NSURLConnectionTest : TestCase { /* the main TestWebServer instance */ TestWebServer *_server; /* tha auxilliary TestWebServer instance needed in tests on redirecting */ TestWebServer *_auxServer; /* the custom request (made by the instance or supplied externally) */ NSURLRequest *_request; /* the redirect request (made by the instance) */ NSURLRequest *_redirectRequest; /* the data accumulator for the received response's content */ NSMutableData *_received; /* the expected status code */ NSUInteger _expectedStatusCode; /* the expected redirect status code of the connection's first stage * in tests with redirect... the resulting (on the second stage) * expected status code is stored in the ivar _expectedStatusCode */ NSUInteger _redirectStatusCode; /* the expected response's content */ NSData *_expectedContent; /* the connection */ NSURLConnection *_conn; /* to store the error supplied with the -[connection:didFailWithError:] */ NSError *_error; } /** * Returns a TestWebServer-like class used by this test case class. A descendant can * return more advanced implementation of TestWebServer's functionality. */ + (Class)testWebServerClass; + (void)initialize; - (id)init; /* See the super's description */ - (void)setUpTest:(id)extra; - (void)startTest:(id)extra; - (void)tearDownTest:(id)extra; /** * The only difference from the super's one is issuing of a diagnostic message * if the test is failed. */ - (BOOL)isSuccess; /** * Issues log messages describing the actual and reference flag sets' states. */ - (void)logFlags; /** * Returns the error stored by the -[connection:didFailWithError:]. */ - (NSError *)error; /* NSURLConnectionDelegate */ - (NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse; - (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge; - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response; - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data; - (void)connectionDidFinishLoading:(NSURLConnection *)connection; - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error; /* end of NSURLConnectionDelegate */ @end /* NSURLConnectionTest */ gnustep-base-1.29.0/Tests/base/NSURLConnection/Helpers/NSURLConnectionTest.m000066400000000000000000000452601435650067400265230ustar00rootroot00000000000000/* * Author: Sergei Golovin */ #import "NSURLConnectionTest.h" /* the runloop's time slice */ #define TIMING 0.1 /* the max duration of a test */ #define MAXDURATION 3.0 @interface NSURLConnectionTest (Private) /** * The method tries to guess the request which the test case should make. * It recognizes as an argument an NSDictionary with custom variable parts * of connecting process (see the class's description). It also can be supplied * with the exact request which must be made during test execution. * The result of the method is stored in the ivar _request. */ - (void)_makeRequest:(id)extra; /** * The method analyzes the ivar _request and tries to guess the execution path * inferring from it the reference flag set. If there is a deviation from the guessed * execution path the caller can supply NSDictionary as the argument 'extra' with * the key 'ReferenceFlags' is set to have a custom NSDictionary as a value explicitly * setting the particular flags (see the class's description). */ - (void)_makeReferenceFlags:(id)extra; @end /* NSURLConnectionTest (Private) */ @implementation NSURLConnectionTest + (Class) testWebServerClass { return [TestWebServer class]; } /* The flag map connects flags's string names with flags... used to log actions */ static NSMapTable *_flagMap = nil; + (void)initialize { if (nil == _flagMap) { _flagMap = NSCreateMapTable(NSObjectMapKeyCallBacks, NSIntegerMapValueCallBacks, 0); NSMapInsert(_flagMap, @"SENTREQUEST", (void *)1); NSMapInsert(_flagMap, @"AUTHORIZED", (void *)2); NSMapInsert(_flagMap, @"NOTAUTHORIZED", (void *)4); NSMapInsert(_flagMap, @"GOTUNAUTHORIZED", (void *)8); NSMapInsert(_flagMap, @"GOTREQUEST", (void *)16); NSMapInsert(_flagMap, @"SENTRESPONSE", (void *)32); NSMapInsert(_flagMap, @"GOTRESPONSE", (void *)64); NSMapInsert(_flagMap, @"GOTCONTENT", (void *)128); NSMapInsert(_flagMap, @"GOTFINISH", (void *)256); NSMapInsert(_flagMap, @"GOTFAIL", (void *)512); NSMapInsert(_flagMap, @"GOTREDIRECT", (void *)1024); } } - (id)init { if ((self = [super init]) != nil) { _conn = nil; _error = nil; _server = nil; _auxServer = nil; _received = nil; _request = nil; _redirectRequest = nil; _expectedStatusCode = 204; _expectedContent = nil; } return self; } // super's -[dealloc] calls the -[tearDownTest:] // so place clearing there - (void)setUpTest:(id)extra { [super setUpTest: extra]; [self _makeRequest: extra]; [self _makeReferenceFlags: extra]; _received = [NSMutableData new]; } - (void)startTest:(id)extra { CREATE_AUTORELEASE_POOL(arp); NSTimeInterval duration = 0.0; if (YES == _debug) { NSLog(@"%@: started with request:\n%@", self, _request); [self logFlags]; NSMutableSet *s = [[NSProcessInfo processInfo] debugSet]; [s addObject: @"NSURLConnection"]; [s addObject: @"NSURLProtocol"]; [s addObject: @"NSStream"]; [s addObject: @"NSRunLoop"]; } _conn = [[NSURLConnection alloc] initWithRequest: _request delegate: self]; while (!_done && !_failed) { [[NSRunLoop currentRunLoop] runUntilDate: [NSDate dateWithTimeIntervalSinceNow: TIMING]]; duration += TIMING; if (duration >= MAXDURATION) { _failed = YES; } } if (YES == _debug) { NSLog(@"%@: stopped with request:\n%@", self, _request); [self logFlags]; } DESTROY(arp); } - (void)tearDownTest:(id)extra { BOOL isToStop = YES; // whether to stop the main TestWebServer instance BOOL isToStopAux = YES; // whether to stop the auxilliary TestWebServer instance if ([_extra isKindOfClass: [NSDictionary class]]) { NSDictionary *d = _extra; isToStop = ([d objectForKey: @"Instance"] == nil); isToStopAux = ([d objectForKey: @"AuxInstance"] == nil && [[d objectForKey: @"IsAuxilliary"] isEqualToString: @"YES"]); } if (isToStop) { if (nil != _server) { [_server stop]; } } if (isToStopAux) { if (nil != _auxServer) { [_auxServer stop]; } } DESTROY(_server); DESTROY(_auxServer); DESTROY(_received); DESTROY(_request); DESTROY(_redirectRequest); DESTROY(_expectedContent); [_conn cancel]; DESTROY(_conn); DESTROY(_error); [super tearDownTest: extra]; } - (BOOL)isSuccess { BOOL ret = [super isSuccess]; if (!ret) { /* log the flags that differ */ NSString *key; NSUInteger flag; NSMapEnumerator en = NSEnumerateMapTable(_flagMap); while (NSNextMapEnumeratorPair(&en, (void **)&key, (void **)&flag)) { if ([self isReferenceFlagSet: flag] != [self isFlagSet: flag]) { NSLog(@"ERR: %@", key); } } NSEndMapTableEnumeration(&en); if (_failed) { NSLog(@"FAILED for unknown reason possibly not related to the test (e.g. a timer has expired)"); } } return ret; } - (void)logFlags { NSString *value; NSString *key; NSUInteger flag; NSMapEnumerator en = NSEnumerateMapTable(_flagMap); while (NSNextMapEnumeratorPair(&en, (void **)&key, (void **)&flag)) { if ([self isFlagSet: flag]) { value = @"YES"; } else { value = @"NO"; } NSLog(@"ACTUAL: %@ -> %@", key, value); if ([self isReferenceFlagSet: flag]) { value = @"YES"; } else { value = @"NO"; } NSLog(@"REFERENCE: %@ -> %@", key, value); } NSEndMapTableEnumeration(&en); } - (NSError*) error { return _error; } /* TestWebServerDelegate */ - (void)handler:(id)handler gotRequest:(GSMimeDocument *)request with:(TestWebServer *)server { NSString *method = [_request HTTPMethod]; NSData *content = [request convertToData]; [self setFlags: SENTREQUEST]; if (YES == _debug) { NSLog(@"%@: set SENTREQUEST (-[%@])", self, NSStringFromSelector(_cmd)); } // TODO: more comparisons of _request and request if ([method isEqualToString: @"POST"] || [method isEqualToString: @"PUT"]) { if ([content isEqualToData: [_request HTTPBody]]) { [self setFlags: GOTREQUEST]; if (YES == _debug) { NSLog(@"%@: set GOTREQUEST (-[%@])", self, NSStringFromSelector(_cmd)); } } } else { [self setFlags: GOTREQUEST]; if (YES == _debug) { NSLog(@"%@: set GOTREQUEST (-[%@])", self, NSStringFromSelector(_cmd)); } } } - (void)handler:(id)handler willSendUnauthorized:(GSMimeDocument *)response with:(TestWebServer *)server { [self setFlags: NOTAUTHORIZED]; if (YES == _debug) { NSLog(@"%@: set NOTAUTHORIZED (-[%@])", self, NSStringFromSelector(_cmd)); } } - (void)handler:(id)handler gotAuthorized:(GSMimeDocument *)request with:(TestWebServer *)server { [self setFlags: AUTHORIZED]; if (YES == _debug) { NSLog(@"%@: set AUTHORIZED (-[%@])", self, NSStringFromSelector(_cmd)); } } - (void)handler:(id)handler willSend:(GSMimeDocument *)response with:(TestWebServer *)server { [self setFlags: SENTRESPONSE]; if (YES == _debug) { NSLog(@"%@: set SENTRESPONSE (-[%@])", self, NSStringFromSelector(_cmd)); } } - (void)timeoutExceededByHandler:(id)handler { _failed = YES; } /* end of TestWebServerDelegate */ /* NSURLConnectionDelegate */ - (NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse { if ([redirectResponse isKindOfClass: [NSHTTPURLResponse class]]) { if ([(NSHTTPURLResponse *)redirectResponse statusCode] == _redirectStatusCode) { [self setFlags: GOTREDIRECT]; if (YES == _debug) { NSLog(@"%@: set GOTREDIRECT (-[%@])", self, NSStringFromSelector(_cmd)); } } } else { [self setFlags: GOTREDIRECT]; if (YES == _debug) { NSLog(@"%@: set GOTREDIRECT (-[%@])", self, NSStringFromSelector(_cmd)); } } return _redirectRequest; } - (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge { [self setFlags: GOTUNAUTHORIZED]; if (YES == _debug) { NSLog(@"%@: set GOTUNAUTHORIZED (-[%@])", self, NSStringFromSelector(_cmd)); } if ([challenge previousFailureCount] == 0) { NSURLCredential *cred; // TODO: _auxServer? NSString *login = [_server login]; NSString *password = [_server password]; if (nil == login) { if ([_extra isKindOfClass: [NSDictionary class]]) { login = [(NSDictionary *)_extra objectForKey: @"Login"]; } } if (nil == password) { if ([_extra isKindOfClass: [NSDictionary class]]) { password = [(NSDictionary *)_extra objectForKey: @"Password"]; } } cred = [NSURLCredential credentialWithUser: login password: password persistence: NSURLCredentialPersistenceNone]; [[challenge sender] useCredential: cred forAuthenticationChallenge: challenge]; } else { [[challenge sender] cancelAuthenticationChallenge: challenge]; } } - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { if (YES == _debug) { if ([response isKindOfClass: [NSHTTPURLResponse class]]) { NSLog(@"%@: received response (-[%@]):\nStatus Code: %i", self, NSStringFromSelector(_cmd), (int)[(NSHTTPURLResponse *)response statusCode]); } } if ([response isKindOfClass: [NSHTTPURLResponse class]]) { if ([(NSHTTPURLResponse *)response statusCode] == _expectedStatusCode) { [self setFlags: GOTRESPONSE]; if (YES == _debug) { NSLog(@"%@: set GOTRESPONSE (-[%@])", self, NSStringFromSelector(_cmd)); } } } else { [self setFlags: GOTRESPONSE]; if (YES == _debug) { NSLog(@"%@: set GOTRESPONSE (-[%@])", self, NSStringFromSelector(_cmd)); } } } - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { [_received appendData: data]; if (YES == _debug) { NSLog(@"%@: received data '%@' (-[%@])", self, data, NSStringFromSelector(_cmd)); } } - (void)connectionDidFinishLoading:(NSURLConnection *)connection { if (nil != _expectedContent && [_received isEqualToData: _expectedContent]) { [self setFlags: GOTCONTENT]; if (YES == _debug) { NSLog(@"%@: set GOTCONTENT (-[%@])", self, NSStringFromSelector(_cmd)); } } [self setFlags: GOTFINISH]; if (YES == _debug) { NSLog(@"%@: set GOTFINISH (-[%@])", self, NSStringFromSelector(_cmd)); } _done = YES; } - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { ASSIGN(_error, error); /* if ((nil != _expectedContent && [_received isEqualToData: _expectedContent]) || (nil == _expectedContent && [_received length] == 0)) { [self setFlags: GOTCONTENT]; } */ [self setFlags: GOTFAIL]; if (YES == _debug) { NSLog(@"%@: set GOTFAIL (-[%@])", self, NSStringFromSelector(_cmd)); NSLog(@"%@: error %@", self, error); } _done = YES; } /* end of NSURLConnectionDelegate */ @end /* NSURLConnectionTest */ @implementation NSURLConnectionTest (Private) - (void)_makeRequest:(id)extra { BOOL isOwnServer = YES; BOOL isOwnAuxServer = NO; NSString *tmp; BOOL isDetached = NO; TestWebServer *instance = nil; TestWebServer *auxInstance = nil; NSString *protocol = nil; NSString *address = nil; NSString *auxPort = nil; NSString *port = nil; // NSString *login = nil; // NSString *password = nil; NSString *path = nil; NSString *redirectPath = nil; NSString *statusCode = nil; NSString *redirectCode = nil; NSString *method = nil; id payload = nil; id content = nil; NSURL *url; NSDictionary *d = nil; if ([extra isKindOfClass: [NSDictionary class]]) { d = extra; instance = [d objectForKey: @"Instance"]; if (nil != instance) { NSString *value; protocol = [instance isSecure] ? @"https" : @"http"; if ((value = [d objectForKey: @"Protocol"]) == nil || ![[value lowercaseString] isEqualToString: protocol]) { d = [d mutableCopy]; [(NSMutableDictionary *)d setObject: protocol forKey: @"Protocol"]; [d autorelease]; } address = [instance address]; port = [instance port]; ASSIGN(_server, instance); [_server setDelegate: self]; [_server setDebug: _debug]; isOwnServer = NO; } else { protocol = [[d objectForKey: @"Protocol"] lowercaseString]; address = [d objectForKey: @"Address"]; port = [d objectForKey: @"Port"]; } auxInstance = [d objectForKey: @"AuxInstance"]; if (nil != auxInstance) { auxPort = [auxInstance port]; ASSIGN(_auxServer, auxInstance); [_auxServer setDelegate: self]; [_auxServer setDebug: _debug]; isOwnAuxServer = NO; } if (isOwnServer) { if ((tmp = [d objectForKey: @"IsDetached"]) != nil) { if ([tmp isEqualToString: @"YES"]) { isDetached = YES; } else { isDetached = NO; } } } isOwnAuxServer = [[d objectForKey: @"IsAuxilliary"] isEqualToString: @"YES"] && nil == _auxServer; if (isOwnAuxServer) { auxPort = [d objectForKey: @"AuxPort"]; } path = [d objectForKey: @"Path"]; if (isOwnAuxServer || nil != _auxServer) { redirectPath = [d objectForKey: @"RedirectPath"]; } statusCode = [d objectForKey: @"StatusCode"]; // TODO: conditions? redirectCode = [d objectForKey: @"RedirectCode"]; method = [d objectForKey: @"Method"]; payload = [d objectForKey: @"Payload"]; content = [d objectForKey: @"Content"]; } // Is extra NSDictionary? else if ([extra isKindOfClass: [NSURLRequest class]]) { ASSIGN(_request, extra); } if (nil == _request) { if (nil == protocol) { protocol = @"http"; } if (nil == address) { address = @"localhost"; } if (nil == port) { port = @"1234"; } if (nil == auxPort) { auxPort = @"1235"; } if (nil == path) { path = @"/"; } if ((isOwnAuxServer || nil != _auxServer) && nil == redirectPath) { redirectPath = path; } if (nil != redirectPath && nil == redirectCode) { _redirectStatusCode = 301; } if (nil == statusCode) { _expectedStatusCode = 204; } else { _expectedStatusCode = [statusCode intValue]; if (_expectedStatusCode == 0) { [NSException raise: NSInvalidArgumentException format: @"Invalid expected 'StatusCode' supplied %@", statusCode]; } } if (nil == redirectCode) { _redirectStatusCode = 301; } else { _redirectStatusCode = [redirectCode intValue]; if (_redirectStatusCode == 0) { [NSException raise: NSInvalidArgumentException format: @"Invalid expected 'RedirectCode' supplied %@", redirectCode]; } } if (nil == method) { method = @"GET"; } if (![path hasPrefix: @"/"]) { // path MUST begin with '/' path = [@"/" stringByAppendingString: path]; } if (![redirectPath hasPrefix: @"/"]) { // path MUST begin with '/' redirectPath = [@"/" stringByAppendingString: redirectPath]; } url = [NSURL URLWithString: [NSString stringWithFormat: @"%@://%@:%@%@", protocol, address, auxPort, redirectPath]]; _redirectRequest = [NSMutableURLRequest requestWithURL: url]; RETAIN(_redirectRequest); url = [NSURL URLWithString: [NSString stringWithFormat: @"%@://%@:%@%@", protocol, address, port, path]]; _request = [NSMutableURLRequest requestWithURL: url]; RETAIN(_request); [(NSMutableURLRequest *)_request setHTTPMethod: method]; if (nil != payload) { if ([payload isKindOfClass: [NSString class]]) { payload = [payload dataUsingEncoding: NSUTF8StringEncoding]; } if (![payload isKindOfClass: [NSData class]]) { [NSException raise: NSInvalidArgumentException format: @"invalid payload"]; } [(NSMutableURLRequest *)_request setHTTPBody: payload]; } if (nil != content) { if ([content isKindOfClass: [NSString class]]) { content = [content dataUsingEncoding: NSUTF8StringEncoding]; } if (![content isKindOfClass: [NSData class]]) { [NSException raise: NSInvalidArgumentException format: @"invalid content"]; } ASSIGN(_expectedContent, content); } if (nil != _expectedContent && nil == statusCode) { _expectedStatusCode = 200; } } if (isOwnServer) { _server = [[TestWebServer alloc] initWithAddress: address port: port mode: isDetached extra: d]; [_server setDebug: _debug]; [_server setDelegate: self]; [_server start: d]; } if (isOwnAuxServer) { _auxServer = [[TestWebServer alloc] initWithAddress: address port: auxPort mode: isDetached extra: d]; [_auxServer setDebug: _debug]; [_auxServer setDelegate: self]; [_auxServer start: d]; } } - (void)_makeReferenceFlags:(id)extra { // trying to guess the execution path // and to infer the reference flag set if (nil != _request) { // default reference set [self setReferenceFlags: SENTREQUEST]; [self setReferenceFlags: NOTAUTHORIZED]; [self setReferenceFlags: AUTHORIZED]; [self setReferenceFlags: GOTUNAUTHORIZED]; [self setReferenceFlags: GOTREQUEST]; [self setReferenceFlags: SENTRESPONSE]; [self setReferenceFlags: GOTRESPONSE]; if (nil != _expectedContent) { [self setReferenceFlags: GOTCONTENT]; } [self setReferenceFlags: GOTFINISH]; } else { [NSException raise: NSInvalidArgumentException format: @"no request"]; } if ([extra isKindOfClass: [NSDictionary class]]) { // make correction in the reference flag set NSDictionary *d = extra; if ((d = [d objectForKey: @"ReferenceFlags"]) != nil) { NSEnumerator *en = [d keyEnumerator]; NSString *key; NSString *value; SEL sel; while ((key = [en nextObject]) != nil) { value = [d objectForKey: key]; NSString *originalKey = nil; NSUInteger flag = NORESULTS; // NSUInteger flag = (NSUInteger)NSMapGet(_flagMap, key); if (NSMapMember(_flagMap, key, (void **)&originalKey, (void **)&flag)) { if ([value isEqualToString: @"YES"]) { sel = @selector(setReferenceFlags:); } else { sel = @selector(unsetReferenceFlags:); } [self performSelector: sel withObject: (void *)flag]; } else { [NSException raise: NSInternalInconsistencyException format: @"flag codes corrupted (key %@)", key]; } } } } } @end /* NSURLConnectionTest (Private) */ gnustep-base-1.29.0/Tests/base/NSURLConnection/Helpers/README000066400000000000000000000022131435650067400234310ustar00rootroot00000000000000The directory contains classes useful in testing of web-clients. They are written mainly with the necessity to test the class NSURLConnection in mind. TestCase NSURLConnectionTest is a child of TestCase and represents a test of NSURLConnection. It starts a main instance and (if needed) an auxillary instance of TestWebServer (or uses externally supplied ones). Then it makes a custom request to check various functionality of NSURLConnection. TestWebServer maintains it's own instance of SimpleWebServer and implements SimpleWebServer delegate's protocol to dispatch any request to a corresponding handler. It can call it's delegate during proceeding of requests. RequestHandler TestHandler and it's descendants handle requests (dispatched by TestWebServer) and produces a custom response. It also calls it's delegate (using TestWebServer delegate's protocol) during request handling. SimpleWebServer The own implementation of a web server. The key protocols important for understanding are TestProgress (TestCase.h) and TestWebServerDelegate (TestWebServer.h). Alternatively the file NSURLConnectionTest.h briefly describes the whole picture. gnustep-base-1.29.0/Tests/base/NSURLConnection/Helpers/RequestHandler.h000066400000000000000000000205131435650067400256530ustar00rootroot00000000000000/** -*- objc -*- * * Author: Sergei Golovin * */ /* * TODO: there is lack of session handling */ #import "TestWebServer.h" /** * The protocol RequestHandler describes how a request receiver should interact * with a request handler. */ @protocol RequestHandler /** * Does all job needed to prepare for request handling. Returns YES if * the handler still can proceed the supplied request later. * The reason this method was introduced is possible session * handling in the future. */ - (BOOL)prehandleRequest:(GSMimeDocument *)request response:(GSMimeDocument *)response for:(TestWebServer *)server; /** * Makes a custom response. Returns YES if the handler has recognized * it is it's responsibility to handle the request. */ - (BOOL) handleRequest:(GSMimeDocument *)request response:(GSMimeDocument *)response for:(TestWebServer *)server; /** * Does all job needed to be done after request handling. Returns NO * if the handler has discovered some inconsistency after handling. * The reason this method was introduced is possible session * handling in the future. */ - (BOOL)posthandleRequest:(GSMimeDocument *)request response:(GSMimeDocument *)response for:(TestWebServer *)server; @end /* RequestHandler */ /** * The abstract class TestHandler. Custom handlers must be derived from it. * The class implements the protocol RequestHandler's methods that are called * by an instance of TestWebServer. The protocol's method -[handleRequest:response:for:] * produces a custom response. It also calls it's delegate's callback methods of * the protocol TestWebServerDelegate (if implemented) during proceeding of a request. * * On use of the -[handleRequest:response:for:] * --------------------------------------------- * * The TestHandler's implementation of the -[handleRequest:response:for:] checks * whether the supplied request is authorized. It returns YES if no processing is * required (by a child) so the response must be returned intact. If the method * returns NO then the child MAY process the request on it's own. If the request is * authorized the method also sets the flag _isAuthorized to YES. * * Child's implementation MUST call this super's one as in the following * example code: * ------------------------------------------------------------------------ * - (BOOL) handleRequest: (GSMimeDocument*)request * response: (GSMimeDocument*)response * for: (TestWebServer *)server * { * BOOL ret = [super handleRequest: request response: response for: server]; * if(NO == ret) * { * // process on it's own with possible checking _isAuthorized if needed * ... * _done = YES; * ret = YES; * } * * return ret; * } * ------------------------------------------------------------------------ * * The method recognizes the case when the request's path contains '/withoutauth'. * In this case no authorization is required and the method -[handleRequest:response:for:] * just returns NO and sets the flag _isAuthorized to YES. * */ @interface TestHandler : NSObject { /* the debug mode switch */ BOOL _debug; /* the handler's delegate... NOT RETAINED */ id _delegate; /* the flag signifies the handler has got an authorized request */ BOOL _isAuthorized; /* the login for basic authentication */ NSString *_login; /* the password for basic authentication */ NSString *_password; /* the flag for successful handling... can be used in the -[posthandleRequest:response:for:] */ BOOL _done; } - (id)init; - (void)dealloc; /* getters */ /* end of getters */ /* setters */ /** * Switches the debug mode on/off. */ - (void)setDebug:(BOOL)flag; /** * Sets the delegate implementing TestWebServerDelegate protocol. */ - (void)setDelegate:(id)delegate; /** * Sets the login for requests with authorization. */ - (void)setLogin:(NSString *)login; /** * Sets the password for requests with authorization. */ - (void)setPassword:(NSString *)password; /* end of setters */ @end /* TestHandler */ /* The handler collection */ /** * The handler returns the status code 200 for any request. * The response's content is 'OK'. The status line is the default one * returned by the TestWebServer. The header 'Content-Type' is set to 'plain/text'. */ @interface Handler200 : TestHandler { } @end /* Handler200 */ /** * The handler returns the status code 204 for any request. * The response's content is empty. The status line is 'HTTP/1.1 204 No Content'. */ @interface Handler204 : TestHandler { } @end /* Handler204 */ /** * The handler returns the status code 301 for any request. * The response's content is an html page like 'Redirect to '. * The status line is 'HTTP/1.1 301 Moved permanently'. It also sets * the response's header 'Location' to the custom URL stored by the * ivar _URLString. If the -[setURLString:] wasn't called with a proper URL * string before the first request arrives then the handler will raise * NSInternalInconsistencyException. */ @interface Handler301 : TestHandler { NSString *_URLString; } - (void)dealloc; /** * Sets the URL to which the handler should redirect. */ - (void)setURLString:(NSString *)URLString; @end /* Handler301 */ /** * The handler returns unconditionally the status code 400 for any request. * The response's content is 'You have issued a request with invalid data'. * The status line is 'HTTP/1.1 400 Bad Request'. */ @interface Handler400 : TestHandler { } @end /* Handler400 */ /** * The handler returns unconditionally the status code 401 for any request. * The response's content is 'Invalid login or password'. * The status line is 'HTTP/1.1 401 Unauthorized'. It also sets the response's * header 'WWW-Authenticate' to the value "Basic realm='TestSuit'". */ @interface Handler401 : TestHandler { } @end /* Handler401 */ /** * The handler returns unconditionally the status code 402 for any request. * The response's content is 'Check your balance'. * The status line is 'HTTP/1.1 402 Payment required'. */ @interface Handler402 : TestHandler { } @end /* Handler402 */ /** * The handler returns unconditionally the status code 404 for any request. * The response's content is 'The resource you are trying to access is not found'. * The status line is 'HTTP/1.1 404 Not found'. */ @interface Handler404 : TestHandler { } @end /* Handler404 */ /** * The handler returns unconditionally the status code 405 for any request. * The response's content is 'You can't do that'. * The status line is 'HTTP/1.1 405 Method not allowed'. */ @interface Handler405 : TestHandler { } @end /* Handler405 */ /** * The handler returns unconditionally the status code 409 for any request. * The response's content is 'The resource you are trying to access is busy'. * The status line is 'HTTP/1.1 409 Conflict'. */ @interface Handler409 : TestHandler { } @end /* Handler409 */ /** * The handler returns unconditionally the status code 500 for any request. * The response's content is 'System error'. * The status line is 'HTTP/1.1 500 Internal Server Error'. */ @interface Handler500 : TestHandler { } @end /* Handler500 */ /** * The handler returns unconditionally the status code 505 for any request. * The response's content is 'There is network protocol inconsistency'. * The status line is 'HTTP/1.1 505 Network Protocol Error'. */ @interface Handler505 : TestHandler { } @end /* Handler505 */ /** * The handler returns unconditionally the status code 507 for any request. * The response's content is 'Insufficient storage'. * The status line is 'HTTP/1.1 507 Insufficient storage'. */ @interface Handler507 : TestHandler { } @end /* Handler507 */ /** * The handler returns the index page with a list of possible URLs for any request. * The URLs are constructed from the base URL stored by the ivar _URLString. If * the -[setURLString:] wasn't called with a proper URL string before the first * request arrives then the handler will raise NSInternalInconsistencyException. */ @interface HandlerIndex : TestHandler { NSString *_URLString; } - (void)dealloc; /** * Sets the URL to which the handler should redirect. */ - (void)setURLString:(NSString *)URLString; @end /* HandlerIndex */ /* The end of the handler collection */ gnustep-base-1.29.0/Tests/base/NSURLConnection/Helpers/RequestHandler.m000066400000000000000000000347301435650067400256660ustar00rootroot00000000000000/** -*- objc -*- * * Author: Sergei Golovin * */ #import "RequestHandler.h" #import "TestWebServer.h" /** * The abstract class TestHandler. All custom handlers must be derived from it. */ @implementation TestHandler - (id)init { if((self = [super init]) != nil) { _debug = NO; _delegate = nil; _isAuthorized = NO; } return self; } - (void)dealloc { _delegate = nil; [super dealloc]; } /* getters */ /* end of getters */ /* setters */ - (void)setDebug:(BOOL)flag { _debug = flag; } - (void)setDelegate:(id)delegate { _delegate = delegate; } - (void)setLogin:(NSString *)login { ASSIGN(_login, login); } - (void)setPassword:(NSString *)password { ASSIGN(_password, password); } /* end of setters */ /* RequestHandler */ - (BOOL)prehandleRequest:(GSMimeDocument *)request response:(GSMimeDocument *)response for:(TestWebServer *)server { _isAuthorized = NO; // TODO: move to something like -[reset] _done = NO; return YES; } - (BOOL) handleRequest: (GSMimeDocument*)request response: (GSMimeDocument*)response for: (TestWebServer*)server { NSString *auth; NSString *path; BOOL ret = NO; if(YES == _debug) { NSLog(@"%@: BEGIN\n%@", self, request); } if(nil != _delegate && [_delegate respondsToSelector: @selector(handler:gotRequest:with:)]) { [_delegate handler: self gotRequest: request with: server]; } // analyze what the client wants path = [[request headerNamed:@"x-http-path"] value]; if([path rangeOfString: @"withoutauth"].location == NSNotFound) { auth = [[request headerNamed: @"Authorization"] value]; if(!auth) // not authorized { [response setHeader: @"http" value: @"HTTP/1.1 401 Unauthorized" parameters: nil]; [response setHeader: @"WWW-Authenticate" value: @"Basic realm='TestSuit'" parameters: nil]; [response setContent: @"Please give login and password"]; if(nil != _delegate && [_delegate respondsToSelector: @selector(handler:willSendUnauthorized:with:)]) { [_delegate handler: self willSendUnauthorized: response with: server]; } if(YES == _debug) { NSLog(@"%@: about to send Unauthorized\n%@", self, response); } return YES; } else // the auth header is set { NSArray *credentials; credentials = [auth componentsSeparatedByString: @" "]; if([[credentials objectAtIndex:0] isEqualToString: @"Basic"]) { credentials = [[GSMimeDocument decodeBase64String: [credentials objectAtIndex:1]] componentsSeparatedByString: @":"]; if([[credentials objectAtIndex:0] isEqualToString: _login] && [[credentials objectAtIndex:1] isEqualToString: _password]) { if(YES == _debug) { NSLog(@"%@: got valid credentials", self); } if(nil != _delegate && [_delegate respondsToSelector: @selector(handler:gotAuthorized:with:)]) { [_delegate handler: self gotAuthorized: request with: server]; } // sets the flag _isAuthorized = YES; } } else { [response setHeader: @"http" value: @"HTTP/1.1 401 Unauthorized" parameters: nil]; [response setHeader: @"WWW-Authenticate" value: @"Basic realm='TestSuit'" parameters: nil]; [response setContent: @"Try another login or password"]; if(nil != _delegate && [_delegate respondsToSelector: @selector(handler:willSendUnauthorized:with:)]) { [_delegate handler: self willSendUnauthorized: response with: server]; } if(YES == _debug) { NSLog(@"%@: about to send Unauthorized\n%@", self, response); } return YES; } } } // ! withoutauth else { // just sets the flag _isAuthorized = YES; } return ret; } - (BOOL)posthandleRequest:(GSMimeDocument *)request response:(GSMimeDocument *)response for:(TestWebServer *)server { BOOL ret = NO; if(YES == _done && nil != _delegate && [_delegate respondsToSelector: @selector(handler:willSend:with:)]) { [_delegate handler: self willSend: response with: server]; ret = YES; } // TODO: may be to move at another place? if(YES == _debug) { NSLog(@"%@: about to send\n%@", self, response); } return ret; } /* end of RequestHandler */ @end /* TestHandler */ @implementation Handler200 - (BOOL) handleRequest: (GSMimeDocument*)request response: (GSMimeDocument*)response for: (TestWebServer*)server { BOOL ret = [super handleRequest: request response: response for: server]; if(NO == ret) { BOOL isToSetResponse = (nil == [response content]) || ([[response content] length] == 0); if(isToSetResponse) { [response setContent: @"OK"]; } [response setHeader: @"HTTP" value: @"HTTP/1.1 200 OK" parameters:nil]; [response setHeader: @"content-type" value: @"plain/text" parameters: nil]; _done = YES; ret = YES; } return ret; } @end /* Handler200 */ @implementation Handler204 - (BOOL) handleRequest: (GSMimeDocument*)request response: (GSMimeDocument*)response for: (TestWebServer*)server { BOOL ret = [super handleRequest: request response: response for: server]; if(NO == ret) { [response setContent: @""]; [response setHeader: @"HTTP" value: @"HTTP/1.1 204 No Content" parameters:nil]; _done = YES; ret = YES; } return ret; } @end /* Handler204 */ @implementation Handler301 - (void)dealloc { DESTROY(_URLString); [super dealloc]; } - (void)setURLString:(NSString *)URLString { ASSIGN(_URLString, URLString); } - (BOOL) handleRequest: (GSMimeDocument*)request response: (GSMimeDocument*)response for: (TestWebServer*)server { BOOL ret = [super handleRequest: request response: response for: server]; if(NO == ret) { if(nil != _URLString) { BOOL isToSetResponse = (nil == [response content]) || ([[response content] length] == 0); [response setHeader: @"HTTP" value: @"HTTP/1.1 301 Moved Permanently" parameters: nil]; [response setHeader: @"Location" value: _URLString parameters: nil]; if(isToSetResponse) { NSString *method = [[request headerNamed: @"x-http-method"] value]; if(![method isEqualToString: @"HEAD"]) { NSString *note = [NSString stringWithFormat: @"Redirect to ", _URLString]; [response setContent: note]; } } } else { [NSException raise: NSInternalInconsistencyException format: @"%@: URL isn't set", self]; } _done = YES; ret = YES; } return ret; } @end /* Handler301 */ @implementation Handler400 - (BOOL) handleRequest: (GSMimeDocument*)request response: (GSMimeDocument*)response for: (TestWebServer*)server { BOOL ret = [super handleRequest: request response: response for: server]; if(NO == ret) { BOOL isToSetResponse = (nil == [response content]) || ([[response content] length] == 0); if(isToSetResponse) { [response setContent: @"You have issued a request with invalid data"]; } [response setHeader:@"HTTP" value:@"HTTP/1.1 400 Bad Request" parameters:nil]; _done = YES; ret = YES; } return ret; } @end /* Handler400 */ @implementation Handler401 - (BOOL) handleRequest: (GSMimeDocument*)request response: (GSMimeDocument*)response for: (TestWebServer*)server { BOOL ret = [super handleRequest: request response: response for: server]; if(NO == ret) { BOOL isToSetResponse = (nil == [response content]) || ([[response content] length] == 0); [response setHeader:@"HTTP" value: @"HTTP/1.1 401 Unauthorized" parameters:nil]; [response setHeader:@"WWW-Authenticate" value: @"Basic realm='TestSuit'" parameters:nil]; if(isToSetResponse) { [response setContent: @"Invalid login or password"]; } _done = YES; ret = YES; } return ret; } @end /* Handler401 */ @implementation Handler402 - (BOOL) handleRequest: (GSMimeDocument*)request response: (GSMimeDocument*)response for: (TestWebServer*)server { BOOL ret = [super handleRequest: request response: response for: server]; if(NO == ret) { BOOL isToSetResponse = (nil == [response content]) || ([[response content] length] == 0); [response setHeader:@"HTTP" value:@"HTTP/1.1 402 Payment required" parameters:nil]; if(isToSetResponse) { [response setContent: @"Check your balance"]; } _done = YES; ret = YES; } return ret; } @end /* Handler402 */ @implementation Handler404 - (BOOL) handleRequest: (GSMimeDocument*)request response: (GSMimeDocument*)response for: (TestWebServer*)server { BOOL ret = [super handleRequest: request response: response for: server]; if(NO == ret) { BOOL isToSetResponse = (nil == [response content]) || ([[response content] length] == 0); [response setHeader:@"HTTP" value:@"HTTP/1.1 404 Not found" parameters:nil]; if(isToSetResponse) { [response setContent: @"The resource you are trying to access is not found"]; } _done = YES; ret = YES; } return ret; } @end /* Handler404 */ @implementation Handler405 - (BOOL) handleRequest: (GSMimeDocument*)request response: (GSMimeDocument*)response for: (TestWebServer*)server { BOOL ret = [super handleRequest: request response: response for: server]; if(NO == ret) { BOOL isToSetResponse = (nil == [response content]) || ([[response content] length] == 0); [response setHeader:@"HTTP" value:@"HTTP/1.1 405 Method not allowed" parameters:nil]; if(isToSetResponse) { [response setContent: @"You can't do that"]; } _done = YES; ret = YES; } return ret; } @end /* Handler405 */ @implementation Handler409 - (BOOL) handleRequest: (GSMimeDocument*)request response: (GSMimeDocument*)response for: (TestWebServer*)server { BOOL ret = [super handleRequest: request response: response for: server]; if(NO == ret) { BOOL isToSetResponse = (nil == [response content]) || ([[response content] length] == 0); [response setHeader:@"HTTP" value:@"HTTP/1.1 409 Conflict" parameters:nil]; if(isToSetResponse) { [response setContent: @"The resource you are trying to access is busy"]; } _done = YES; ret = YES; } return ret; } @end /* Handler409 */ @implementation Handler500 - (BOOL) handleRequest: (GSMimeDocument*)request response: (GSMimeDocument*)response for: (TestWebServer*)server { BOOL ret = [super handleRequest: request response: response for: server]; if(NO == ret) { BOOL isToSetResponse = (nil == [response content]) || ([[response content] length] == 0); [response setHeader:@"HTTP" value:@"HTTP/1.1 500 Internal Server Error" parameters:nil]; if(isToSetResponse) { [response setContent: @"System error"]; } _done = YES; ret = YES; } return ret; } @end /* Handler500 */ @implementation Handler505 - (BOOL) handleRequest: (GSMimeDocument*)request response: (GSMimeDocument*)response for: (TestWebServer*)server { BOOL ret = [super handleRequest: request response: response for: server]; if(NO == ret) { BOOL isToSetResponse = (nil == [response content]) || ([[response content] length] == 0); [response setHeader:@"HTTP" value:@"HTTP/1.1 505 Network Protocol Error" parameters:nil]; if(isToSetResponse) { [response setContent: @"There is network protocol inconsistency"]; } _done = YES; ret = YES; } return ret; } @end /* Handler505 */ @implementation Handler507 - (BOOL) handleRequest: (GSMimeDocument*)request response: (GSMimeDocument*)response for: (TestWebServer*)server { BOOL ret = [super handleRequest: request response: response for: server]; if(NO == ret) { BOOL isToSetResponse = (nil == [response content]) || ([[response content] length] == 0); [response setHeader:@"HTTP" value: @"HTTP/1.1 507 Insufficient storage" parameters:nil]; if(isToSetResponse) { [response setContent: @"Insufficient storage"]; } _done = YES; ret = YES; } return ret; } @end /* Handler507 */ @implementation HandlerIndex - (void)dealloc { DESTROY(_URLString); [super dealloc]; } - (void)setURLString:(NSString *)URLString { ASSIGN(_URLString, URLString); } - (BOOL) handleRequest: (GSMimeDocument*)request response: (GSMimeDocument*)response for: (TestWebServer*)server { BOOL ret = [super handleRequest: request response: response for: server]; if(NO == ret) { if(nil != _URLString) { BOOL isToSetResponse = (nil == [response content]) || ([[response content] length] == 0); if(isToSetResponse) { NSString *pattern = @"\ This page
\ Without authentication
\ 301
\ 400
\ 401
\ 402
\ 404
\ 405
\ 409
\ 500
\ 505
\ 507
\ "; NSString *index = [NSString stringWithFormat: pattern, _URLString, @"index", _URLString, @"withoutauth", _URLString, @"301", _URLString, @"400", _URLString, @"401", _URLString, @"402", _URLString, @"404", _URLString, @"405", _URLString, @"409", _URLString, @"500", _URLString, @"505", _URLString, @"507"]; [response setContent: index]; [response setHeader: @"content-type" value: @"text/html" parameters: nil]; [response setHeader: @"HTTP" value: @"HTTP/1.1 200 OK" parameters:nil]; } } else { [NSException raise: NSInternalInconsistencyException format: @"%@: URL isn't set", self]; } _done = YES; ret = YES; } return ret; } @end /* HandlerIndex */ gnustep-base-1.29.0/Tests/base/NSURLConnection/Helpers/SimpleWebServer.h000066400000000000000000000102631435650067400260040ustar00rootroot00000000000000/** -*- objc -*- * * Author: Sergei Golovin * */ #import #import /** * Implements a simple web server with delegate interaction which mimic of * the WebServer's delegate protocol. * * The SimpleWebServer class currently has many limitations (deficiencies). * The following is a list of most important ones: * - supports only one connection simultaneously. * - doesn't support any transfer-content-encoding (more precisely it uses * only 'identity' transfer-content-encoding that is without any modification * of the content/message); * - the class uses UTF8 by default. It expects a request and produces responses * in that encoding; * - it expects an explicit request for closing of the connection (that is * the request's header 'Connection' must be 'close') or implicitly does it * if no 'Connection' has been supplied; * - doesn't support pipelining of requests; * * Use the -[setDebug: YES] to raise verbosity. */ @interface SimpleWebServer : NSObject { /* holds the GSServerStream accepting incoming connections */ GSServerStream *_serverStream; /* the delegate ... NOT RETAINED... * see below the protocol SimpleWebServerDelegate */ id _delegate; /* the debug mode */ BOOL _debug; /* the address to bind with */ NSString *_address; /* the port to listen to */ NSString *_port; /* SSL configuration and options */ NSDictionary *_secure; /* The following web-server code is derived/stolen from NSURL/Helpers/capture.m */ /* the stream to send */ NSOutputStream *_op; /* the stream to receive */ NSInputStream *_ip; /* the collector of received bytes from a client */ NSMutableData *_capture; /* the number of sent bytes to a client */ unsigned _written; /* the flag indicating the instance is collecting bytes from a client */ BOOL _readable; /* the flag indicating the instance is sending bytes to a client */ BOOL _writable; /* whether to use a secure TLS/SSL connection */ BOOL _isSecure; /* the request is read */ BOOL _doRespond; /* the response is written */ BOOL _done; /* end of the stolen */ /* wether the output stream is ready to write */ BOOL _canRespond; /* holds the current request */ GSMimeDocument *_request; /* holds the current response */ GSMimeDocument *_response; } - (void)dealloc; /* getters */ /** * Returns the string of the port number if the instance is accepting * connections (is started). Otherwise returns nil. */ - (NSString *)port; /* end of getters */ /* setters */ /** * Starts the simple web server listening on the supplied address and port. * The dictionary 'dict' is supplied with additional configuration parameters. * connections. The dictionary's keys are: * CertificateFile * the path to a certificate (if the web server should wait for HTTPS) * KeyFile * the path to a key (if the web server should wait for HTTPS) */ - (BOOL)setAddress:(NSString *)address port:(NSString *)port secure:(NSDictionary *)dict; /** * Sets the debug mode. */ - (void)setDebug:(BOOL)flag; /** * Sets the delegate responding to the selector -[processRequest:response:]. */ - (void)setDelegate:(id)delegate; /* end of setters */ /** * Commands the web server to stop listening. */ - (void)stop; /* The method is derived/stolen from NSURL/Helpers/capture.m */ - (void) stream: (NSStream *)theStream handleEvent: (NSStreamEvent)streamEvent; @end /* SimpleWebServer */ @protocol SimpleWebServerDelegate /** * An implementor gets the supplied request for processing and * modifies the supplied response which the supplied SimpleWebServer * server should send back to it's peer if the return value is set * to YES. Otherwise SimpleWebServer sends the predetermined response * (TODO). */ - (BOOL)processRequest:(GSMimeDocument *)request response:(GSMimeDocument *)response for:(SimpleWebServer *)server; @end /* SimpleWebServerDelegate */ gnustep-base-1.29.0/Tests/base/NSURLConnection/Helpers/SimpleWebServer.m000066400000000000000000000350571435650067400260210ustar00rootroot00000000000000/* * Author: Sergei Golovin */ #import "SimpleWebServer.h" /* the time step for the runloop */ #define TIMING 0.1 @interface SimpleWebServer (Private) /** * Starts a listening (server) stream. */ - (void)_openServerStream; /** * Stops the listening (server) stream. */ - (void)_closeServerStream; /** * Reset to prepare for the next request-response cycle. */ - (void)_resetCycle; /** * Opens the input _ip and output _op streams, schedules them * on the current runloop. Requires the _ip and _op are not nil. */ - (void)_openIOStreams; /** * Closes the input _ip and output _op streams, unschedules them * on the current runloop and clears that ivars. */ - (void)_closeIOStreams; /** * Tries to recognise if the request's bytes have been read (HTTP message's * headers and body) and if so then it proceeds the request and produces * a response. If the response is ready it returns YES. */ - (BOOL)_tryCaptured; @end /* SimpleWebServer (Private) */ @implementation SimpleWebServer - (void)dealloc { _delegate = nil; DESTROY(_capture); DESTROY(_request); DESTROY(_response); [self _closeIOStreams]; [self _closeServerStream]; DESTROY(_address); DESTROY(_port); DESTROY(_secure); [super dealloc]; } - (id)init { if ((self = [super init]) != nil) { _debug = NO; _delegate = nil; _doRespond = NO; _done = NO; _canRespond = NO; _ip = nil; _op = nil; } return self; } /* getters */ - (NSString *)port { NSStream *s = _serverStream; if (nil == s) s = _ip; if (nil == s) s = _op; if (nil == s) return nil; return [s streamStatus] == NSStreamStatusOpen ? _port : nil; } /* end of getters */ /* setters */ - (BOOL)setAddress:(NSString *)address port:(NSString *)port secure:(NSDictionary *)dict { BOOL ret = NO; if (nil == _serverStream) { ASSIGN(_address, address); ASSIGN(_port, port); ASSIGN(_secure, dict); [self _openServerStream]; if (nil != _serverStream) { ret = YES; } } else { NSLog(@"%@: already started '%@' on '%@'", self, _serverStream, [NSThread currentThread]); } return ret; } - (void)setDebug:(BOOL)flag { _debug = flag; } - (void)setDelegate:(id)delegate { _delegate = delegate; } /* end of setters */ - (void)stop { NSRunLoop *rl = [NSRunLoop currentRunLoop];; if (nil != _serverStream) { [self _closeServerStream]; DESTROY(_address); DESTROY(_port); DESTROY(_secure); } [self _closeIOStreams]; // give a time slice to free all resources [rl runUntilDate: [NSDate dateWithTimeIntervalSinceNow: TIMING]]; } /* GSStream's delegate */ /* The method is derived/stolen from NSURL/Helpers/capture.m */ - (void) stream: (NSStream *)theStream handleEvent: (NSStreamEvent)streamEvent { NSRunLoop *rl = [NSRunLoop currentRunLoop]; // NSLog(@"Event %p %d", theStream, streamEvent); switch (streamEvent) { case NSStreamEventHasBytesAvailable: { if (_ip == nil) { [self _resetCycle]; [(GSServerStream*)_serverStream acceptWithInputStream: &_ip outputStream: &_op]; if (_ip) // it is ok to accept nothing { RETAIN(_ip); RETAIN(_op); [self _openIOStreams]; [self _closeServerStream]; } } if (theStream == _ip) { _readable = YES; while (_readable == YES) { unsigned char buffer[BUFSIZ]; int readSize; readSize = [_ip read: buffer maxLength: sizeof(buffer)]; if (readSize <= 0) { _readable = NO; } else { [_capture appendBytes: buffer length: readSize]; } } _doRespond = [self _tryCaptured]; if (_doRespond) { // reset the output stream to trigger polling [_op write: NULL maxLength: 0]; if (YES == _debug) { NSLog(@"%@: about to send response\n%@", self, _response); } } } break; } case NSStreamEventHasSpaceAvailable: { if (_doRespond && _canRespond) { NSMutableData *data; NSString *status; NSData *statusData; char *crlf = "\r\n"; id content; NSData *contentData = nil; NSUInteger cLength = 0; // content-length NSString *connection; BOOL close = YES; NSAssert(theStream == _op, @"Wrong stream for writing"); _writable = YES; // adding the 'Connection' to the response connection = [[_request headerNamed: @"Connection"] value]; if (nil == connection) { connection = [[_request headerNamed: @"connection"] value]; } // if the client didn't supply the header 'Connection' or // explicitly stated to close the current connection close = (nil == connection || [[connection lowercaseString] isEqualToString: @"close"]); // adding the 'Content-Length' to the response content = [_response content]; if ([content isKindOfClass: [NSString class]]) { contentData = [(NSString *)content dataUsingEncoding: NSUTF8StringEncoding]; } else if ([content isKindOfClass: [NSData class]]) { contentData = (NSData *)content; } else { // yet unsupported } if (nil != content) { cLength = [contentData length]; if (cLength > 0) { NSString *l; l = [NSString stringWithFormat: @"%u", (unsigned)cLength]; [_response setHeader: @"Content-Length" value: l parameters: nil]; } } if (cLength == 0) { [_response setHeader: @"Content-Length" value: @"0" parameters: nil]; } // adding the status line status = [[_response headerNamed: @"http"] value]; if (nil == status) { status = [[_response headerNamed: @"HTTP"] value]; } if (nil == status) { status = [[_response headerNamed: @"Http"] value]; } statusData = [status dataUsingEncoding: NSUTF8StringEncoding]; data = [NSMutableData dataWithData: statusData]; [_response deleteHeaderNamed: @"http"]; [data appendBytes: crlf length: 2]; // actual sending [data appendData: [_response rawMimeData]]; while (_writable == YES && _written < [data length]) { int result = [_op write: [data bytes] + _written maxLength: [data length] - _written]; if (result <= 0) { _writable = NO; } else { _written += result; } } if (_written == [data length]) { if (close) { // if the client didn't supply the header 'Connection' or explicitly stated // to close the current connection [self _closeIOStreams]; [self _openServerStream]; } // ready for another request-response cycle [self _resetCycle]; } } _canRespond = YES; break; } case NSStreamEventEndEncountered: { if (theStream == _ip || theStream == _op) { [self _closeIOStreams]; [self _resetCycle]; [self _openServerStream]; } else { [theStream close]; [theStream removeFromRunLoop: rl forMode: NSDefaultRunLoopMode]; } break; } case NSStreamEventErrorOccurred: { int code = [[theStream streamError] code]; if (theStream == _ip || theStream == _op) { [self _closeIOStreams]; [self _resetCycle]; [self _openServerStream]; } else { [theStream close]; [theStream removeFromRunLoop: rl forMode: NSDefaultRunLoopMode]; } NSAssert1(1, @"Error! code is %d", code); break; } default: break; } } /* end of GSStream's delegate */ @end /* SimpleWebServer */ @implementation SimpleWebServer (Private) - (void)_openServerStream { NSString *certFile = nil; NSString *keyFile = nil; NSRunLoop *rl; if (nil == _serverStream) { rl = [NSRunLoop currentRunLoop]; _serverStream = [GSServerStream serverStreamToAddr: _address port: [_port intValue]]; RETAIN(_serverStream); if (_serverStream == nil) { NSLog(@"Failed to create server stream (address: %@, port: %@)", _address, _port); return; } if (nil != _secure && (certFile = [_secure objectForKey: @"CertificateFile"]) != nil && (keyFile = [_secure objectForKey: @"KeyFile"]) != nil) { _isSecure = YES; [_serverStream setProperty: NSStreamSocketSecurityLevelTLSv1 forKey: NSStreamSocketSecurityLevelKey]; [_serverStream setProperty: certFile forKey: GSTLSCertificateFile]; [_serverStream setProperty: keyFile forKey: GSTLSCertificateKeyFile]; } _capture = [NSMutableData new]; [_serverStream setDelegate: self]; [_serverStream scheduleInRunLoop: rl forMode: NSDefaultRunLoopMode]; [_serverStream open]; if (YES == _debug) { NSLog(@"%@: started '%@' on '%@'", self, _serverStream, [NSThread currentThread]); } } else { NSLog(@"%@: already started '%@' on '%@'", self, _serverStream, [NSThread currentThread]); } } - (void)_closeServerStream { NSRunLoop *rl; if (nil != _serverStream) { rl = [NSRunLoop currentRunLoop]; [_serverStream close]; [_serverStream removeFromRunLoop: rl forMode: NSDefaultRunLoopMode]; if (YES == _debug) { NSLog(@"%@: stopped server stream %@", self, _serverStream); } DESTROY(_serverStream); } } - (void)_resetCycle { _written = 0; _doRespond = NO; _done = NO; _canRespond = NO; [_capture setLength: 0]; } - (void)_openIOStreams { NSRunLoop *rl; if (_ip != nil && _op != nil) { rl = [NSRunLoop currentRunLoop]; [_ip scheduleInRunLoop: rl forMode: NSDefaultRunLoopMode]; [_op scheduleInRunLoop: rl forMode: NSDefaultRunLoopMode]; [_ip setDelegate: self]; [_op setDelegate: self]; [_ip open]; [_op open]; } else { [NSException raise: NSInternalInconsistencyException format: @"%@: IO streams not properly initialized", self]; } } - (void)_closeIOStreams { NSRunLoop *rl; if (nil != _ip || nil != _op) { rl = [NSRunLoop currentRunLoop]; [_ip close]; [_ip removeFromRunLoop: rl forMode: NSDefaultRunLoopMode]; [_op close]; [_op removeFromRunLoop: rl forMode: NSDefaultRunLoopMode]; DESTROY(_ip); DESTROY(_op); } } - (BOOL)_tryCaptured { BOOL ret = NO; NSRange r1; NSRange r2; NSString *headers; NSString *tmp1; NSString *tmp2; NSUInteger contentLength = 0; // the following chunk ensures that the captured data are written only // when all request's bytes are read... it waits for full headers and // reads the Content-Length's value then waits for the number of bytes // equal to that value is read tmp1 = [[NSString alloc] initWithData: _capture encoding: NSUTF8StringEncoding]; // whether the headers are read if ((r1 = [tmp1 rangeOfString: @"\r\n\r\n"]).location != NSNotFound) { headers = [tmp1 substringToIndex: r1.location + 2]; if ((r2 = [[headers lowercaseString] rangeOfString: @"content-length:"]).location != NSNotFound) { tmp2 = [headers substringFromIndex: r2.location + r2.length]; // content-length: if ((r2 = [tmp2 rangeOfString: @"\r\n"]).location != NSNotFound) { // full line with content-length is present tmp2 = [tmp2 substringToIndex: r2.location]; // number of content's bytes contentLength = [tmp2 intValue]; } } else { contentLength = 0; // no header 'content-length' } if (r1.location + 4 + contentLength == [_capture length]) // Did we get headers + body? { // The request has been received NSString *method = @""; NSString *query = @""; NSString *version = @""; NSString *scheme = _isSecure ? @"https" : @"http"; NSString *path = @""; NSData *data; // TODO: currently no checks r2 = [headers rangeOfString: @"\r\n"]; while (r2.location == 0) { // ignore an empty line before the request line headers = [headers substringFromIndex: 2]; r2 = [headers rangeOfString: @"\r\n"]; } // the request line has been caught tmp2 = [tmp1 substringFromIndex: r2.location + 2]; // whole request without the first line data = [tmp2 dataUsingEncoding: NSUTF8StringEncoding]; _request = [GSMimeParser documentFromData: data]; RETAIN(_request); // x-http-... tmp2 = [headers substringToIndex: r2.location]; // the request line tmp2 = [tmp2 stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceCharacterSet]]; // find the method r2 = [tmp2 rangeOfString: @" "]; method = [[tmp2 substringToIndex: r2.location] uppercaseString]; tmp2 = [[tmp2 substringFromIndex: r2.location + 1] stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceCharacterSet]]; r2 = [tmp2 rangeOfString: @"?"]; // path?query if (r2.location != NSNotFound) { // path?query path = [tmp2 substringToIndex: r2.location]; tmp2 = [tmp2 substringFromIndex: r2.location + 1]; // without '?' r2 = [tmp2 rangeOfString: @" "]; query = [tmp2 substringToIndex: r2.location]; } else { // only path r2 = [tmp2 rangeOfString: @" "]; path = [tmp2 substringToIndex: r2.location]; } tmp2 = [[tmp2 substringFromIndex: r2.location + 1] stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceCharacterSet]]; // tmp2 == 'HTTP/' version = [tmp2 substringFromIndex: 5]; [_request setHeader: @"x-http-method" value: method parameters: nil]; [_request setHeader: @"x-http-path" value: path parameters: nil]; [_request setHeader: @"x-http-query" value: query parameters: nil]; [_request setHeader: @"x-http-scheme" value: scheme parameters: nil]; [_request setHeader: @"x-http-version" value: version parameters: nil]; if (YES == _debug) { NSLog(@"%@: got request\n%@", self, _request); } _response = [GSMimeDocument new]; if (nil != _delegate && [_delegate respondsToSelector: @selector(processRequest:response:for:)]) { ret = [_delegate processRequest: _request response: _response for: self]; } if (!ret) { DESTROY(_response); _response = [GSMimeDocument new]; [_response setHeader: @"HTTP" value: @"HTTP/1.1 204 No Content" parameters: nil]; [_response setHeader: @"Content-Length" value: @"0" parameters: nil]; ret = YES; } } } DESTROY(tmp1); return ret; } @end /* SimpleWebServer (Private) */ gnustep-base-1.29.0/Tests/base/NSURLConnection/Helpers/TestCase.h000066400000000000000000000067501435650067400244470ustar00rootroot00000000000000/* -*- objc -*- * * Author: Sergei Golovin */ #import /* the initial (reset) state of any flag set */ #define NORESULTS 0 /** * A class representing some test case and implementing * the protocol TestProgress allows descendants to have two sets * of flags: the reference one and the actual one. * The reference flag set is what the class's instance's * state supposed to be if the test was successfull. * The actual flag set is the current state of the class's * instance during execution of the test. * Both can be used in conjuction to decide about test's * success or fail by checking at the end of the test * whether the sets are identical. */ @protocol TestProgress /** * Resets the actual flags to the pristine state (NORESULTS). */ - (void)resetFlags; /** * Sets the actual flags defined by the supplied mask. */ - (void)setFlags:(NSUInteger)mask; /** * Unset the actual flags defined by the supplied mask. */ - (void)unsetFlags:(NSUInteger)mask; /** * Returns YES if the actual flags defined by the supplied mask are * set. */ - (BOOL)isFlagSet:(NSUInteger)mask; /** * Resets the reference flags to the pristine state (NORESULTS). */ - (void)resetReferenceFlags; /** * Stores the supplied mask as the reference flags state. * The actual flags state equal to the reference one signifies * a success. */ - (void)setReferenceFlags:(NSUInteger)mask; /** * Unset the reference flags defined by the supplied mask. */ - (void)unsetReferenceFlags:(NSUInteger)mask; /** * Returns YES if the reference flags defined by the supplied mask are * set. */ - (BOOL)isReferenceFlagSet:(NSUInteger)mask; /** * Returns YES if all conditions are met (by default if the actual flag set * is equal to the reference flag set). */ - (BOOL)isSuccess; @end /* TestProgress */ /** * The abstract class representing a test case and implementing * the protocol TestProgress. */ @interface TestCase : NSObject { /* the flags indicating test progress (the actual one) */ NSUInteger _flags; /* the reference flag set signifying the test's successful state */ NSUInteger _refFlags; /* the particular flag indicating a failure not related to the test */ BOOL _failed; /* the particular flag signifying the test has been done */ BOOL _done; /* keeps the extra which can likely be of NSDictionary class in which case * it's keys hold parameters of the test */ id _extra; /* the debug mode flag */ BOOL _debug; } - (id)init; /** * A descendant class can place in the own implementation of the method * some preliminary code needed to conduct the test case. The argument * 'extra' is for future enhancements. The extra is only retained within * the method for descendants (the abstarct class doesn't do anything * with this argument). * So descendant's implementation MUST call the super's one. */ - (void)setUpTest:(id)extra; /** * A descendant class should place the code conducting the test in * the own implementation of the method. The argument 'extra' is for * future enhancements. */ - (void)startTest:(id)extra; /** * A descendant class can place in the own implementation of the method * some cleaning code. The argument 'extra' is for future enhancements. * Descendant's implementation MUST call the super's one. */ - (void)tearDownTest:(id)extra; /** * Raises the verbosity level if supplied with YES. */ - (void)setDebug:(BOOL)flag; @end /* TestCase */ gnustep-base-1.29.0/Tests/base/NSURLConnection/Helpers/TestCase.m000066400000000000000000000025771435650067400244570ustar00rootroot00000000000000/* * Author: Sergei Golovin */ #import "TestCase.h" @implementation TestCase - (id) init { if ((self = [super init]) != nil) { [self resetFlags]; [self setReferenceFlags: NORESULTS]; _failed = NO; _done = NO; } return self; } - (void) dealloc { [self tearDownTest: _extra]; [super dealloc]; } /* TestProgress */ - (void) resetFlags { _flags = NORESULTS; } - (void) setFlags:(NSUInteger)mask { _flags = _flags | mask; } - (void) unsetFlags:(NSUInteger)mask { _flags = _flags & ~mask; } - (BOOL) isFlagSet:(NSUInteger)mask { return ((_flags & mask) == mask); } - (void) resetReferenceFlags { _refFlags = NORESULTS; } - (void) setReferenceFlags:(NSUInteger)mask { _refFlags = _refFlags | mask; } - (void) unsetReferenceFlags:(NSUInteger)mask { _refFlags = _refFlags & ~mask; } - (BOOL) isReferenceFlagSet:(NSUInteger)mask { return ((_refFlags & mask) == mask); } - (BOOL) isSuccess { if(!_failed && (_flags == _refFlags)) { return YES; } return NO; } /* end of TestProgress */ - (void)setUpTest:(id)extra { [self resetFlags]; [self resetReferenceFlags]; _failed = NO; _done = NO; ASSIGN(_extra, extra); } - (void)startTest:(id)extra { // does nothing } - (void)tearDownTest:(id)extra { DESTROY(_extra); } - (void)setDebug:(BOOL)flag { _debug = flag; } @end /* TestCase */ gnustep-base-1.29.0/Tests/base/NSURLConnection/Helpers/TestWebServer.h000066400000000000000000000223171435650067400254750ustar00rootroot00000000000000 /** -*- objc -*- * * Author: Sergei Golovin * * TestWebServer is intended to be used in the tests where a web service is * needed. The class's instance is instantiated with the method * -[initWithAddress:port:mode:extra] and then started with the call -[start:]. * When started the TestWebServer starts in it's turn a SimpleWebServer instance * in the same thread unless it is initialized with the argument 'mode' set to * 'YES' to run it in a detached thread. * * It is designed to call the delegate's callbacks (if implemented) of * the TestWebServerDelegate protocol for every request made to * the SimpleWebServer's assigned address on the SimpleWebServer's assigned port * (by default localhost and 1234 respectively). However it currently doesn't * handle any request on it's own. Instead the class uses a collection of * handlers. Every handler makes a custom response. So the TestWebServer only * has to dispatch a request to a corresponding handler and then to send back * the handler's response to the SimpleWebServer instance. See RequestHandler * for more information. * * TestWebServer can be supplied with additional parameters via the argument * 'extra' of the initializer -[initWithAddress:port:mode:extra]. * See that method's description for the currently supported key-value pairs. * * The pattern of use: * ---------------------------------------------------------------------------- * NSDictionary *extra = [NSDictionary dictionaryWithObjectsAndKeys: * @"https", @"Protocol", * nil]; * TestWebServer *server = [[TestWebServer alloc] initWithAddress: @"localhost" * port: @"1234" * mode: NO * extra: extra]; * ADelegateClass *del = [ADelegateClass new]; * [server setDelegate: del]; * [server start: extra]; * .... * * .... * [server stop]; * DESTROY(server); * DESTROY(del); * ---------------------------------------------------------------------------- * * * The TestWebServer can response to the following resource paths: * * /index * displays the page with all supported resources * /withoutauth/ * if it is a part of the request's URL then the TestWebServer * will NOT check authentication/authorization of the client. * * /204/ * /301/ * /400/ * /401/ * /402/ * /404/ * /405/ * /409/ * /500/ * /505/ * /507/ * a try to access to this resources will lead the TestWebServer * to produce one of the pre-defined responses with the status code * is equal to the corresponding number. * The pre-defined responses are: * 204 "" (empty string) * 301 "Redirect to " * Returns in the header 'Location' a new which by default * has the same protocol, address but the port is incremented by * 1 (e.g. http://localhost:1235/ with other parameters set to * their default values). * 400 "You have issued a request with invalid data" * 401 "Invalid login or password" * 403 "Check your balance" * 404 "The resource you are trying to access is not found" * 405 "You can't do that" * 409 "The resource you are trying to access is busy" * 500 "System error" * 505 "There is network protocol inconsistency" * 507 "Insufficient storage" * * If you want more verbosity call the method -[setDebug: YES]. * */ #import "SimpleWebServer.h" #import @class RequestHandler; @interface TestWebServer : NSObject { /* the debug mode flag */ BOOL _debug; /* the IP address to attach to... see DEFAULTADDRESS at the beginning * of the implementaion */ NSString *_address; /* the port to listen on... see DEFAULTPORT in the beginning * of the implementaion */ NSString *_port; /* whether the TestWebServer listens for HTTPS requests */ BOOL _isSecure; /* the login for basic authentication */ NSString *_login; /* the password for basic authentication */ NSString *_password; /* holds the extra argument which is for a future use... * Currently it is expected to be a dictionary with predetermined * keys ( see the description of -[initWithAddress:port:mode:extra:]) */ id _extra; /* the flag used as a trigger to stop the detached thread */ BOOL _threadToQuit; /* holds the SimpleWebServer accepting incoming connections */ SimpleWebServer *_server; /* holds the detached thread the SimpleWebServer is running on... * nil if it runs in the same thread as the calling code */ NSThread *_serverThread; /* the delegate ... NOT RETAINED... * see below the protocol TestWebServerDelegate */ id _delegate; /* the lock used for synchronization between threads mainly * to wait for the SimpleWebServer is started/stopped... * the condition list: * READY - the initial condition * STARTED - the SimpleWebServer has been started; * STOPPED - the SimpleWebServer has been stopped; */ NSConditionLock *_lock; /* the traversal map used to pick a right handler from the request's path */ NSMutableDictionary *_traversalMap; } /** * Initializes the intance with default parameters. */ - (id)init; /** * Initializes an instance with it's SimpleWebServer accepting connection on * the specified address and port. The mode decides whether to run * the SimpleWebServer on the detached thread (NO means it won't be detached). * The argument extra is for future enhancement and could be of the class * NSDictionary whose key-value pairs set various parameters. * The current code supports the following extra keys: * 'Login' - the login for basic authentication * 'Password' - the password for basic authentication * 'Protocol' - 'http' means waiting for HTTP requests * 'https' - for HTTPS requests */ - (id)initWithAddress:(NSString *)address port:(NSString *)port mode:(BOOL)detached extra:(id)extra; - (void)dealloc; /** * Starts the SimpleWebServer accepting incoming connections. * The supplied argument is for future enhancement and currently has no meaning. * It isn't retained by the method. */ - (void)start:(id)extra; /** * Stops the SimpleWebServer. The instance ceases to accept incoming connections. */ - (void)stop; /* SimpleWebServerDelegate */ /** * The main job of request-response cycle is done here. The method is called * when all request's bytes are read. It must be supplied with the incoming * request and the response document which is about to be sent back to the web * client. The handling code within the method would change the supplied response. */ - (BOOL) processRequest:(GSMimeDocument *)request response:(GSMimeDocument *)response for:(SimpleWebServer *)server; /* end of SimpleWebServerDelegate */ /* getters */ /** * Returns the address which SimpleWebServer is bound to. */ - (NSString *)address; /** * Returns the port which the SimpleWebServer listens on. */ - (NSString *)port; /** * Returns the login for basic authentication. */ - (NSString *)login; /** * Returns the password for basic authentication. */ - (NSString *)password; /** * Returns YES if the instance waits for HTTPS requests. */ - (BOOL)isSecure; /* end of getters */ /* setters */ /** * Sets the delegate implementing TestWebServerDelegate protocol. * The argument isn't retained by the method. */ - (void)setDelegate:(id)delegate; /** * Sets the debug mode (more verbose). */ - (void)setDebug:(BOOL)mode; /* end of setters */ @end /* TestWebServer */ /** * The protocol's methods are called during processing of a request. */ @protocol TestWebServerDelegate /** * Called by the handler when it has got the supplied request * from the supplied TestWebServer instance. */ - (void)handler:(id)handler gotRequest:(GSMimeDocument *)request with:(TestWebServer *)server; /** * Called by the handler when it is going to send the response * on an unauthorized request (an invalid request or no credentials are supplied) * via the supplied TestWebServer. */ - (void)handler:(id)handler willSendUnauthorized:(GSMimeDocument *)response with:(TestWebServer *)server; /** * Called by the handler when it has got the supplied request * with valid credentials from the supplied TestWebServer instance. */ - (void)handler:(id)handler gotAuthorized:(GSMimeDocument *)request with:(TestWebServer *)server; /** * Called by the handler when it is going to send the response * on any request except an unauthorized one via the supplied TestWebServer. */ - (void)handler:(id)handler willSend:(GSMimeDocument *)response with:(TestWebServer *)server; /** * Called when the timeout is exceeded. */ - (void)timeoutExceededByHandler:(id)handler; @end /* TestWebServerDelegate */ gnustep-base-1.29.0/Tests/base/NSURLConnection/Helpers/TestWebServer.m000066400000000000000000000245541435650067400255070ustar00rootroot00000000000000/* * Author: Sergei Golovin */ #import "TestWebServer.h" #import "RequestHandler.h" @interface TestWebServer (Private) /** * Starts the detached thread. It is the entry point of the thread. */ - (void)_startDetached:(id)extra; /** * Starts the SimpleWebServer. */ - (void)_startHTTPServer:(id)extra; /** * Stops the SimpleWebServer. */ - (void)_stopHTTPServer; @end /* default 'constants' */ #define DEFAULTADDRESS @"localhost" #define DEFAULTPORT @"1234" #define DEFAULTMODE NO #define DEFAULTLOGIN @"login" #define DEFAULTPASSWORD @"password" /* lock's conditions */ #define READY 0 /* the initial condition */ #define STARTED 1 /* the SimpleWebServer has been started */ #define STOPPED 2 /* the SimpleWebServer has been stopped */ /* the time step for the runloop */ #define TIMING 0.1 /* the maximum duration of running of the SimpleWebServer instance after which the server must be shut down */ #define MAXDURATION 3.0 @implementation TestWebServer - (id) init { return [self initWithAddress: DEFAULTADDRESS port: DEFAULTPORT mode: DEFAULTMODE extra: nil]; } - (id)initWithAddress:(NSString *)address port:(NSString *)port mode:(BOOL)detached extra:(id)extra { if ((self = [super init]) != nil) { _debug = NO; _address = [[NSHost hostWithName: address] address]; RETAIN(_address); ASSIGN(_port, port); ASSIGN(_extra, extra); _password = nil; _login = nil; _isSecure = NO; if ([extra isKindOfClass: [NSDictionary class]]) { NSDictionary *d = extra; NSString *proto; if ((_password = [d objectForKey: @"Password"]) != nil) { RETAIN(_password); } if ((_login = [d objectForKey: @"Login"]) != nil) { RETAIN(_login); } if ((proto = [d objectForKey: @"Protocol"]) != nil && [[proto lowercaseString] isEqualToString: @"https"]) { _isSecure = YES; } } if (nil == _login) { _login = DEFAULTLOGIN; RETAIN(_login); } if (nil == _password) { _password = DEFAULTPASSWORD; RETAIN(_password); } _traversalMap = [[NSMutableDictionary alloc] initWithObjectsAndKeys: [Handler200 class], @"200", [Handler204 class], @"204", [Handler301 class], @"301", [Handler400 class], @"400", [Handler401 class], @"401", [Handler402 class], @"402", [Handler404 class], @"404", [Handler405 class], @"405", [Handler409 class], @"409", [Handler500 class], @"500", [Handler505 class], @"505", [Handler507 class], @"507", [HandlerIndex class], @"index", nil]; _lock = [[NSConditionLock alloc] initWithCondition: READY]; _threadToQuit = NO; if (detached) { _serverThread = [[NSThread alloc] initWithTarget: self selector: @selector(_startDetached:) object: extra]; } else { _serverThread = nil; } } return self; } - (void)dealloc { DESTROY(_lock); DESTROY(_address); DESTROY(_port); DESTROY(_extra); DESTROY(_login); DESTROY(_password); _delegate = nil; DESTROY(_traversalMap); [super dealloc]; } - (void) start: (id)extra { if ([_server port] != nil) { if (_debug) { NSWarnMLog(@"SimpleWebServer already started"); } return; } if (nil != _serverThread) { if (_debug) NSLog(@"Waiting for startup"); if (![_serverThread isExecuting]) { NSTimeInterval duration = 0.0; [_serverThread start]; // wait for the SimpleWebServer is started while (![_lock tryLockWhenCondition: STARTED] && duration < MAXDURATION) { [[NSRunLoop currentRunLoop] runUntilDate: [NSDate dateWithTimeIntervalSinceNow: TIMING]]; duration += TIMING; } [_lock unlock]; if (duration >= MAXDURATION && nil != _delegate && [_delegate respondsToSelector: @selector(timeoutExceededByHandler:)]) { [_delegate timeoutExceededByHandler: self]; [self stop]; } } else { NSWarnMLog(@"the detached thread is already started"); } } else { [self _startHTTPServer: extra]; } } - (void) stop { if ([_server port] == nil) { if (YES == _debug) { NSWarnMLog(@"SimpleWebServer already stopped"); } return; } if (nil != _serverThread) { if ([_serverThread isExecuting]) { NSTimeInterval duration = 0.0; _threadToQuit = YES; // this makes the detached thread quiting from it's runloop // wait for the SimpleWebServer is stopped while(![_lock tryLockWhenCondition: STOPPED] && duration < MAXDURATION) { [[NSRunLoop currentRunLoop] runUntilDate: [NSDate dateWithTimeIntervalSinceNow: TIMING]]; duration += TIMING; } [_lock unlockWithCondition: READY]; if (duration >= MAXDURATION && nil != _delegate && [_delegate respondsToSelector: @selector(timeoutExceededByHandler:)]) { [_delegate timeoutExceededByHandler: self]; } } } else { [self _stopHTTPServer]; } } - (BOOL) processRequest:(GSMimeDocument *)request response:(GSMimeDocument *)response for:(SimpleWebServer *)server { NSString *path; NSString *component; NSEnumerator *en; BOOL ret = NO; id handler; // analyze the path to infer what the client wants path = [[request headerNamed:@"x-http-path"] value]; // traverse over the path to search the right handler en = [[path pathComponents] objectEnumerator]; while((component = [en nextObject]) != nil) { if ((handler = [_traversalMap objectForKey: component]) != nil) { // the handler has been found break; // while } } if (nil == component) { // no component found... default 204 component = @"204"; handler = [_traversalMap objectForKey: component]; } if (handler == [handler class]) { // it is a Class not an instance... instantiate and substitute // instead of the Class Class cls = (Class)handler; handler = [[cls alloc] init]; [_traversalMap setObject: handler forKey: component]; } // set the handler [handler setDelegate: _delegate]; [handler setLogin: _login]; [handler setPassword: _password]; if ([handler respondsToSelector: @selector(setURLString:)]) { if ([handler isKindOfClass: [HandlerIndex class]]) { NSString *urlString = [NSString stringWithFormat: @"%@://%@:%@/", _isSecure ? @"https" : @"http", _address, _port]; [(HandlerIndex *)handler setURLString: urlString]; } else if ([handler isKindOfClass: [Handler301 class]]) { // by default http://localhost:1235/ NSString *port = [NSString stringWithFormat: @"%u", [_port intValue] + 1]; // the TestWebServer's port + 1 NSString *urlString = [NSString stringWithFormat: @"%@://%@:%@/", _isSecure ? @"https" : @"http", _address, port]; [(Handler301 *)handler setURLString: urlString]; } } // TODO: add session-related conditions here [handler prehandleRequest: request response: response for: self]; // the main job ret = [handler handleRequest: request response: response for: self]; // TODO: analyze 'ret'... if NO a default handler must be called // TODO: add session-related conditions here [handler posthandleRequest: request response: response for: self]; return ret; } /* end of SimpleWebServer delegate */ /* getters */ - (NSString *)address { return _address; } - (NSString *)port { return _port; } - (NSString *)login { return _login; } - (NSString *)password { return _password; } - (BOOL)isSecure { return _isSecure; } /* end of getters */ /* setters */ - (void)setDelegate:(id)delegate { _delegate = delegate; } - (void)setDebug:(BOOL)mode { _debug = mode; } /* end of setters */ @end /* TestWebServer */ @implementation TestWebServer (Private) - (void) _startHTTPServer: (id)extra { NSString *certPath; NSString *keyPath; NSDictionary *secure = nil; BOOL status; _server = [SimpleWebServer new]; [_server setDebug: _debug]; [_server setDelegate: self]; if (_isSecure) { NSHost *h = [NSHost hostWithAddress: _address]; NSHost *l = [NSHost hostWithName: @"localhost"]; if ([h isEqual: l]) { certPath = [[NSBundle bundleForClass: [self class]] pathForResource: @"testCert" ofType: @"pem"]; keyPath = [[NSBundle bundleForClass: [self class]] pathForResource: @"testKey" ofType: @"pem"]; secure = [NSDictionary dictionaryWithObjectsAndKeys: certPath, @"CertificateFile", keyPath, @"KeyFile", nil]; } else { [NSException raise: NSInternalInconsistencyException format: @"The server hasn't run. Address %@ is not localhost (%@)", _address, l]; // NOTE: generate corresponding certificates for any address differing // from localhost } } if (_debug) { NSLog(@"Starting web server with address %@, port %@ %@", _address, _port, secure ? @" with TLS" : @""); } status = [_server setAddress: _address port: _port secure: secure]; if (!status) { [NSException raise: NSInternalInconsistencyException format: @"The server hasn't run. Perhaps the port %@ is invalid", DEFAULTPORT]; } } - (void)_stopHTTPServer { if (nil != _server && [_server port] != nil) { [_server stop]; // shut down the server if (YES == _debug) { NSLog(@"%@: stopped SimpleWebServer %@", self, _server); } DESTROY(_server); } } - (void)_startDetached:(id)extra { CREATE_AUTORELEASE_POOL(arp); NSTimeInterval duration = 0.0; [_lock lockWhenCondition: READY]; [self _startHTTPServer: extra]; [_lock unlockWithCondition: STARTED]; if (YES == _debug) { NSLog(@"%@: enter into runloop in detached thread %@", self, [NSThread currentThread]); } while(!_threadToQuit && duration < MAXDURATION) { [[NSRunLoop currentRunLoop] runUntilDate: [NSDate dateWithTimeIntervalSinceNow: TIMING]]; duration += TIMING; } if (YES == _debug) { NSLog(@"%@: exit from runloop in detached thread %@", self, [NSThread currentThread]); } if (duration >= MAXDURATION && nil != _delegate && [_delegate respondsToSelector: @selector(timeoutExceededByHandler:)]) { [_delegate timeoutExceededByHandler: self]; } [_lock lockWhenCondition: STARTED]; [self _stopHTTPServer]; [_lock unlockWithCondition: STOPPED]; DESTROY(arp); } @end /* TestWebServer (Private) */ gnustep-base-1.29.0/Tests/base/NSURLConnection/Helpers/testCert.pem000066400000000000000000000026071435650067400250600ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIID6TCCAtGgAwIBAgIJAP02s2/x3i8ZMA0GCSqGSIb3DQEBCwUAMIGKMQswCQYD VQQGEwJYWDEOMAwGA1UECAwFV29ybGQxEDAOBgNVBAcMB0dOVXN0ZXAxITAfBgNV BAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDESMBAGA1UEAwwJbG9jYWxob3N0 MSIwIAYJKoZIhvcNAQkBFhNnbnVzdGVwLWRldkBnbnUub3JnMB4XDTE0MDgwNzEx MTIxN1oXDTI0MDgwNDExMTIxN1owgYoxCzAJBgNVBAYTAlhYMQ4wDAYDVQQIDAVX b3JsZDEQMA4GA1UEBwwHR05Vc3RlcDEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0 cyBQdHkgTHRkMRIwEAYDVQQDDAlsb2NhbGhvc3QxIjAgBgkqhkiG9w0BCQEWE2du dXN0ZXAtZGV2QGdudS5vcmcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB AQDxFVEHh137hyl0juYvbXuAOUIXRSVwk92mAGJIIn0g0Dm6KIAJW1EGR5LeHY3L vrkxEAvGxb7Ypqtg1F4OcwoZE/1Y0xKjHBnqtMJcw7DgN9F1dIkQ9HxHkYPiHzTF d7floomsjyt0BcqAqE1Qf0ahsnveq9E6KTIYRTZ91RGHQrAW4KBxFM30ieHYQYdn 2vDgH/8wyLjwQ+89P5SrBJdt+eKHPjHvjs1WZe0i660hvLa19l/DQ5ZxlV5LJ6tZ yjvr+OjT9tE86r9n34vk+ZZBCQwvzZ+dHwLpufz3VgPap54bCCLY21BZj15nqITN k+8XJz+aavFe3zdMvT9cGiZNAgMBAAGjUDBOMB0GA1UdDgQWBBRB6fstnCsIvg3r 9f3EmiZhLS867TAfBgNVHSMEGDAWgBRB6fstnCsIvg3r9f3EmiZhLS867TAMBgNV HRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQC0fy/lWgBZRTXfAUOfZp5sWJcQ mQKQiPfXYxiUALq6iI1SyQq90kJ1DyLEGJJ9HEaP3s3jyFQgLXoi1J/8qyOESUDy ogC8nIod6vfA9g8eWcFeOEd6YnNWykPjGCqA/mzrzN3abFkERap8ivx4RWVYX9bP ZNhJVxcoqVCjtFmIh6ATNG/0+xfxax4U4GitcHNYD0Ij+qdXqNJHym67uVponLYE SnxxF3lZ6FzB51SyKtJF5j4/fEeyDXR8Uy3zJdrb6mhSUJNX5RYcrdiR9RflrfGy qYOXFtWmFv/+w/OaqugXQfx9By8uI49U9BG8Q7xSsZSXmoEuMGYt+UwE7UP+ -----END CERTIFICATE----- gnustep-base-1.29.0/Tests/base/NSURLConnection/Helpers/testKey.pem000066400000000000000000000032171435650067400247110ustar00rootroot00000000000000-----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEA8RVRB4dd+4cpdI7mL217gDlCF0UlcJPdpgBiSCJ9INA5uiiA CVtRBkeS3h2Ny765MRALxsW+2KarYNReDnMKGRP9WNMSoxwZ6rTCXMOw4DfRdXSJ EPR8R5GD4h80xXe35aKJrI8rdAXKgKhNUH9GobJ73qvROikyGEU2fdURh0KwFuCg cRTN9Inh2EGHZ9rw4B//MMi48EPvPT+UqwSXbfnihz4x747NVmXtIuutIby2tfZf w0OWcZVeSyerWco76/jo0/bRPOq/Z9+L5PmWQQkML82fnR8C6bn891YD2qeeGwgi 2NtQWY9eZ6iEzZPvFyc/mmrxXt83TL0/XBomTQIDAQABAoIBAAZmlnwor+oZsJQT pzDjK0BAROzxPQk8I8pggDuCDuhsHtw+bwfQkNol1FRpXHZoXepbjrR8U5DU+//a I5UmoMIBsdxF3lzORjHhErf7yhpp4PnJWkpE83fC+Ulroq8LeqpyIk2ej3zJGpNH 5KWae3mXj4pd7XQp29ahH80/dvOsWGZyYOXqh7jO6UdXfhPHKIhLN6wd9nzmRy44 PLFcQYo/nTM19ackz9joovyGPy87BGsj3+rALRXd+GMPVtRFFPMtm6PnSTsMsoDg HEsm76CygnmL7/ywIXSVY/rfomm73SV9FgFalkUSpNWdLqiXiLICVTKC2P1ZUCdg eL/A59ECgYEA/nfw/9Vh86LVQ6Vqfp9W/pAut9ik8SecqodOptBSVV2YBYcfBejL dqksW3LaARabGMJh1z5tHfIw+buF7tl8OIy+TNYRNdrUlsNpI7lWVCVp5F4Znr3c a7GsGE82/XA3eiEZhUfaQeCctOMXoPnZO32mdDal3rYYQ7yKMvAO8gsCgYEA8ojA pK80FURe+kM0Zd/ftTAzMkGJNWnKkSSqd+sI7iCwzd9KAX3d+EM4/vqguMXzw+MP FMkXOv4PUP0iV1XyBt1hn+OSdfax4mD9ALOyJoCHvLPsRjlIv7iEsD2oi84mJ07v 3fFuku+xDrPwMBJgeIWjC2ml9J3YYrB5ppPRmAcCgYEA+64/Y5l1ttW/XpeVm8UW 8tJCEr2obYfDMPqAtQZn2FyohhcdfOfBjQxHfe87ZUYpgjSHNq9clvi6rdVl41Wh wgCaGz7CaOSVzMNbEuU1WCZk9GSJrHKWNsHUt3pppgK+LAHezu7BFNUFyPauoR1c WLWu01RVe8/Yce5hNX4vGf8CgYEA5w7pmPthfzFX2szTyopyMcftvl85PK3A0m5A CWbdZx+10Sx88Nbc9Xv1fNWA8QeFqIVVBNRfUVBhfyLp6JJ0tZ2LOCwyiDeyWJ1V 66lGe+/PYTN4UZ6ZdC1yHAVh4W9QYfqOAr/UPCAman96wBGB3tBR+Ll55YXLdJn0 C4KgF1kCgYAHjE0j82DF+6sKw+ggUcMgLM0z6HcYE975T/c4KNqb11Mu2+38CQvY pvlzOgQxzbjq59reek3gRtj3u0UCaXzTnIvgLl+sC0/l4f4qEVwcEcnMiJyUAIsR VR7Mw874clbF8TK8tLlcgCipmDmWxFlrgxOPs1ikcObvTOR/oxacUQ== -----END RSA PRIVATE KEY----- gnustep-base-1.29.0/Tests/base/NSURLConnection/Helpers/testTestWebServer.m000066400000000000000000000060061435650067400263770ustar00rootroot00000000000000/** * * Author: Sergei Golovin * * Runs two TestWebServer instances to check how the class TestWebServer * behaves. Visit http://localhost:1234/index to see all supported resources. * * If you visit the main TestWebServer instance with the following command: * * wget -O - --user=login --password=password http://localhost:1234/301 2>&1 * * you should get a session log like this: * * --2014-08-13 12:08:01-- http://localhost:1234/301 * Resolving 127.0.0.1 (localhost)... 127.0.0.1 * Connecting to 127.0.0.1 (localhost)|127.0.0.1|:1234... connected. * HTTP request sent, awaiting response... 401 Unauthorized * Reusing existing connection to 127.0.0.1:1234. * HTTP request sent, awaiting response... 301 Moved Permanently * Location: http://127.0.0.1:1235/ [following] * --2014-08-13 12:08:01-- http://127.0.0.1:1235/ * Connecting to 127.0.0.1:1235... connected. * HTTP request sent, awaiting response... 401 Unauthorized * Reusing existing connection to 127.0.0.1:1235. * HTTP request sent, awaiting response... 204 No Content * Length: 0 * Saving to: ‘STDOUT’ * * 0K 0.00 =0s * * 2014-08-13 12:08:01 (0.00 B/s) - written to stdout [0/0] * */ #import #import "TestWebServer.h" #import "NSURLConnectionTest.h" #define TIMING 0.1 int main(int argc, char **argv, char **env) { CREATE_AUTORELEASE_POOL(arp); NSFileManager *fm; NSBundle *bundle; BOOL loaded; NSString *helperPath; fm = [NSFileManager defaultManager]; helperPath = [[fm currentDirectoryPath] stringByAppendingString: @"/TestConnection.bundle"]; bundle = [NSBundle bundleWithPath: helperPath]; loaded = [bundle load]; if (loaded) { TestWebServer *server1; TestWebServer *server2; Class testClass; BOOL debug = YES; NSDictionary *d; testClass = [bundle principalClass]; // NSURLConnectionTest d = [NSDictionary dictionaryWithObjectsAndKeys: // @"https", @"Protocol", nil]; server1 = [[[testClass testWebServerClass] alloc] initWithAddress: @"localhost" port: @"1234" mode: NO extra: d]; [server1 setDebug: debug]; [server1 start: d]; // localhost:1234 HTTP server2 = [[[testClass testWebServerClass] alloc] initWithAddress: @"localhost" port: @"1235" mode: NO extra: d]; [server2 setDebug: debug]; [server2 start: d]; // localhost:1235 HTTP while (YES) { [[NSRunLoop currentRunLoop] runUntilDate: [NSDate dateWithTimeIntervalSinceNow: TIMING]]; } // [server1 stop]; // DESTROY(server1); // [server2 stop]; // DESTROY(server2); } else { [NSException raise: NSInternalInconsistencyException format: @"can't load bundle TestConnection"]; } DESTROY(arp); return 0; } gnustep-base-1.29.0/Tests/base/NSURLConnection/TestInfo000066400000000000000000000000001435650067400226150ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSURLConnection/basic.m000066400000000000000000000050161435650067400224120ustar00rootroot00000000000000#import #import "Testing.h" #import "ObjectTesting.h" int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSMutableURLRequest *mutable; NSURLConnection *connection; NSURLResponse *response; NSURLRequest *request; NSError *error; NSData *data; NSURL *httpURL; NSString *path; httpURL = [NSURL URLWithString: @"http://www.gnustep.org"]; TEST_FOR_CLASS(@"NSURLConnection", [NSURLConnection alloc], "NSURLConnection +alloc returns an NSURLConnection"); mutable = [NSMutableURLRequest requestWithURL: httpURL]; PASS([NSURLConnection canHandleRequest: mutable], "NSURLConnection can handle an valid HTTP request (GET)"); [mutable setHTTPMethod: @"WRONGMETHOD"]; PASS([NSURLConnection canHandleRequest: mutable], "NSURLConnection can handle an invalid HTTP request (WRONGMETHOD)"); [mutable setHTTPMethod: @"GET"]; connection = [NSURLConnection connectionWithRequest: mutable delegate: nil]; PASS(connection != nil, "NSURLConnection +connectionWithRequest: delegate: with nil as delegate returns a instance"); response = nil; #if defined(_WIN32) testHopeful = YES; #endif data = [NSURLConnection sendSynchronousRequest: mutable returningResponse: &response error: &error]; PASS(data != nil && [data length] > 0, "NSURLConnection synchronously load data from an http URL"); PASS(response != nil && [(NSHTTPURLResponse*)response statusCode] > 0, "NSURLConnection synchronous load returns a response"); #if defined(_WIN32) testHopeful = NO; #endif path = [[NSFileManager defaultManager] currentDirectoryPath]; path = [path stringByAppendingPathComponent: @"basic.m"]; [mutable setURL: [NSURL fileURLWithPath: path]]; data = [NSURLConnection sendSynchronousRequest: mutable returningResponse: &response error: &error]; PASS(data != nil && [data length] > 0, "NSURLConnection synchronously load data from a local file"); request = [NSURLRequest requestWithURL: [NSURL URLWithString:@"https://www.google.com/"]]; response = nil; error = nil; data = [NSURLConnection sendSynchronousRequest: request returningResponse: &response error: &error]; PASS(nil == error, "https://www.google.com/ does not return an error") PASS(nil != data, "https://www.google.com/ returns data") [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSURLConnection/test01.m000066400000000000000000000050561435650067400224550ustar00rootroot00000000000000/** * The test makes connections to not-listening services. * One for HTTP and one for HTTPS. * The NSURLConnection delegate is supposed to catch an * error in that two cases and sets it's ivars accordingly. */ #import #import "Testing.h" @interface Delegate : NSObject { BOOL _done; NSError *_error; } - (void) reset; - (NSError *) error; - (BOOL) done; - (void) connection: (NSURLConnection *)connection didFailWithError: (NSError *)error; @end @implementation Delegate - (void) reset { _done = NO; _error = nil; } - (NSError *) error { return _error; } - (BOOL) done { return _done; } - (void) connection: (NSURLConnection *)connection didFailWithError: (NSError *)error { _error = error; _done = YES; } @end int main(int argc, char **argv, char **env) { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSTimeInterval timing; NSTimeInterval duration; NSString *urlString; NSURLRequest *req; Delegate *del; /* The following test cases depend on the GSInetServerStream * class which is completely broken on Windows. * * See: https://github.com/gnustep/libs-base/issues/266 * * We will mark the test cases as hopeful on Windows. */ #if defined(_WIN32) NSLog(@"Marking local web server tests as hopeful because GSInetServerStream is broken on Windows"); testHopeful = YES; #endif duration = 0.0; timing = 0.1; urlString = @"http://localhost:19750"; req = [NSURLRequest requestWithURL: [NSURL URLWithString: urlString]]; del = [[Delegate new] autorelease]; [NSURLConnection connectionWithRequest: req delegate: del]; while (![del done] && duration < 3.0) { [[NSRunLoop currentRunLoop] runUntilDate: [NSDate dateWithTimeIntervalSinceNow: timing]]; duration += timing; } PASS([del done], "http test completes"); PASS([del done] && nil != [del error], "connection to dead(not-listening) HTTP service"); [del reset]; duration = 0.0; urlString = @"https://localhost:19750"; req = [NSURLRequest requestWithURL: [NSURL URLWithString: urlString]]; [NSURLConnection connectionWithRequest: req delegate: del]; while (![del done] && duration < 3.0) { [[NSRunLoop currentRunLoop] runUntilDate: [NSDate dateWithTimeIntervalSinceNow: timing]]; duration += timing; } PASS([del done], "https test completes"); PASS([del done] && nil != [del error], "connection to dead(not-listening) HTTPS service"); [del reset]; [arp release]; arp = nil; #if defined(_WIN32) testHopeful = NO; #endif return 0; } gnustep-base-1.29.0/Tests/base/NSURLConnection/test02.m000066400000000000000000000123051435650067400224510ustar00rootroot00000000000000/** * Tests for HTTP. */ #import #import "Helpers/NSURLConnectionTest.h" #import "Helpers/TestWebServer.h" #import int main(int argc, char **argv, char **env) { CREATE_AUTORELEASE_POOL(arp); NSFileManager *fm; NSBundle *bundle; BOOL loaded; NSString *helperPath; // load the test suite's classes fm = [NSFileManager defaultManager]; helperPath = [[fm currentDirectoryPath] stringByAppendingString: @"/Helpers/TestConnection.bundle"]; bundle = [NSBundle bundleWithPath: helperPath]; loaded = [bundle load]; if(loaded) { NSDictionary *d; Class testClass; NSDictionary *refs; TestWebServer *server; NSURLConnectionTest *testCase; BOOL debug = NO; /* The following test cases depend on the GSInetServerStream * class which is completely broken on Windows. * * See: https://github.com/gnustep/libs-base/issues/266 * * We will mark the test cases as hopeful on Windows. */ #if defined(_WIN32) NSLog(@"Marking local web server tests as hopeful because GSInetServerStream is broken on Windows"); testHopeful = YES; #endif testClass = [bundle principalClass]; // NSURLConnectionTest // create a shared TestWebServer instance for performance server = [[testClass testWebServerClass] new]; [server setDebug: debug]; [server start: nil]; // localhost:1234 HTTP /* * Simple GET via HTTP with empty response's body and * the response's status code 204 (by default) */ testCase = [testClass new]; [testCase setDebug: debug]; // the extra dictionary with test case's parameters d = [NSDictionary dictionaryWithObjectsAndKeys: server, @"Instance", // we use the shared TestWebServer instance nil]; [testCase setUpTest: d]; [testCase startTest: d]; PASS([testCase isSuccess], "GET http://localhost:1234/"); [testCase tearDownTest: d]; DESTROY(testCase); /* * Simple GET via HTTP with the response's status code 400 and * non-empty response's body */ testCase = [testClass new]; [testCase setDebug: debug]; // the extra dictionary with test case's parameters d = [NSDictionary dictionaryWithObjectsAndKeys: server, @"Instance", // we use the shared TestWebServer instance @"400", @"Path", // request the handler responding with 400 @"400", @"StatusCode", // the expected status code @"You have issued a request with invalid data", @"Content", // the expected response's body nil]; [testCase setUpTest: d]; [testCase startTest: d]; PASS([testCase isSuccess], "response 400 .... GET http://localhost:1234/400"); [testCase tearDownTest: d]; DESTROY(testCase); /* * Simple POST via HTTP with the response's status code 400 and * non-empty response's body */ testCase = [testClass new]; [testCase setDebug: debug]; // the extra dictionary with test case's parameters d = [NSDictionary dictionaryWithObjectsAndKeys: server, @"Instance", // we use the shared TestWebServer instance @"400", @"Path", // request the handler responding with 400 @"400", @"StatusCode", // the expected status code @"You have issued a request with invalid data", @"Content", // the expected response's body @"Some payload", @"Payload", // the custom payload @"POST", @"Method", // use POST nil]; [testCase setUpTest: d]; [testCase startTest: d]; PASS([testCase isSuccess], "payload... response 400 .... POST http://localhost:1234/400"); [testCase tearDownTest: d]; DESTROY(testCase); /* * Tests redirecting... it uses an auxilliary TestWebServer instance and proceeds * in two stages. The first one is to get the status code 301 and go to the URL * given in the response's header 'Location'. The second stage is a simple GET on * the given URL with the status code 204 and empty response's body. */ testCase = [testClass new]; [testCase setDebug: debug]; // the reference set difference (from the default reference set) we expect refs = [NSDictionary dictionaryWithObjectsAndKeys: @"YES", @"GOTREDIRECT", nil]; // the extra dictionary with test case's parameters d = [NSDictionary dictionaryWithObjectsAndKeys: server, @"Instance", // we use the shared TestWebServer instance @"/301", @"Path", // request the handler responding with a redirect @"/", @"RedirectPath", // the URL's path of redirecting @"YES", @"IsAuxilliary", // start an auxilliary TestWebServer instance refs, @"ReferenceFlags", // the expected reference set difference nil]; [testCase setUpTest: d]; [testCase startTest: d]; PASS([testCase isSuccess], "redirecting... GET http://localhost:1234/301"); [testCase tearDownTest: d]; DESTROY(testCase); // cleaning [server stop]; DESTROY(server); } else { // no classes no tests [NSException raise: NSInternalInconsistencyException format: @"can't load bundle TestConnection"]; } #if defined(_WIN32) testHopeful = NO; #endif DESTROY(arp); return 0; } gnustep-base-1.29.0/Tests/base/NSURLConnection/test03.m000066400000000000000000000131741435650067400224570ustar00rootroot00000000000000/** * Tests for HTTPS * (must be the same as test02.m except for the use of HTTPS). */ #import #import "Helpers/NSURLConnectionTest.h" #import "Helpers/TestWebServer.h" #import int main(int argc, char **argv, char **env) { CREATE_AUTORELEASE_POOL(arp); NSFileManager *fm; NSBundle *bundle; BOOL loaded; NSString *helperPath; /* The following test cases depend on the GSInetServerStream * class which is completely broken on Windows. * * See: https://github.com/gnustep/libs-base/issues/266 * * We will mark the test cases as hopeful on Windows. */ #if defined(_WIN32) NSLog(@"Marking local web server tests as hopeful because GSInetServerStream is broken on Windows"); testHopeful = YES; #endif // load the test suite's classes fm = [NSFileManager defaultManager]; helperPath = [[fm currentDirectoryPath] stringByAppendingString: @"/Helpers/TestConnection.bundle"]; bundle = [NSBundle bundleWithPath: helperPath]; loaded = [bundle load]; if (loaded) { NSDictionary *d; Class testClass; NSDictionary *refs; TestWebServer *server; NSURLConnectionTest *testCase; BOOL debug = NO; testClass = [bundle principalClass]; // NSURLConnectionTest // the extra dictionary commanding to use HTTPS d = [NSDictionary dictionaryWithObjectsAndKeys: @"HTTPS", @"Protocol", nil]; // create a shared TestWebServer instance for performance server = [[[testClass testWebServerClass] alloc] initWithAddress: @"localhost" port: @"1234" mode: NO extra: d]; [server setDebug: debug]; [server start: d]; // localhost:1234 HTTPS /* * Simple GET via HTTPS with empty response's body and * the response's status code 204 (by default) */ testCase = [testClass new]; [testCase setDebug: debug]; // the extra dictionary with test case's parameters d = [NSDictionary dictionaryWithObjectsAndKeys: server, @"Instance", // we use the shared TestWebServer instance nil]; [testCase setUpTest: d]; [testCase startTest: d]; PASS([testCase isSuccess], "HTTPS... GET https://localhost:1234/"); [testCase tearDownTest: d]; DESTROY(testCase); /* * Simple GET via HTTPS with the response's status code 400 and * non-empty response's body */ testCase = [testClass new]; [testCase setDebug: debug]; // the extra dictionary with test case's parameters d = [NSDictionary dictionaryWithObjectsAndKeys: server, @"Instance", // we use the shared TestWebServer instance @"400", @"Path", // request the handler responding with 400 @"400", @"StatusCode", // the expected status code @"You have issued a request with invalid data", @"Content", nil]; [testCase setUpTest: d]; [testCase startTest: d]; PASS([testCase isSuccess], "HTTPS... response 400 .... GET https://localhost:1234/400"); [testCase tearDownTest: d]; DESTROY(testCase); /* * Simple POST via HTTPS with the response's status code 400 and * non-empty response's body */ testCase = [testClass new]; [testCase setDebug: debug]; // the extra dictionary with test case's parameters d = [NSDictionary dictionaryWithObjectsAndKeys: server, @"Instance", // we use the shared TestWebServer instance @"400", @"Path", // request the handler responding with 400 @"400", @"StatusCode", // the expected status code @"You have issued a request with invalid data", @"Content", @"Some payload", @"Payload", // the custom payload @"POST", @"Method", // use POST nil]; [testCase setUpTest: d]; [testCase startTest: d]; PASS([testCase isSuccess], "HTTPS... payload... response 400 .... POST https://localhost:1234/400"); [testCase tearDownTest: d]; DESTROY(testCase); /* * Tests redirecting... it uses an auxilliary TestWebServer instance and proceeds * in two stages. The first one is to get the status code 301 and go to the URL * given in the response's header 'Location'. The second stage is a simple GET on * the given URL with the status code 204 and empty response's body. */ testCase = [testClass new]; [testCase setDebug: debug]; // the reference set difference (from the default reference set) we expect refs = [NSDictionary dictionaryWithObjectsAndKeys: @"YES", @"GOTREDIRECT", nil]; // the extra dictionary with test case's parameters d = [NSDictionary dictionaryWithObjectsAndKeys: server, @"Instance", // we use the shared TestWebServer instance @"/301", @"Path", // request the handler responding with a redirect @"/", @"RedirectPath", // the URL's path of redirecting @"YES", @"IsAuxilliary", // start an auxilliary TestWebServer instance refs, @"ReferenceFlags", // the expected reference set difference nil]; [testCase setUpTest: d]; [testCase startTest: d]; PASS([testCase isSuccess], "HTTPS... redirecting... GET https://localhost:1234/301"); [testCase tearDownTest: d]; DESTROY(testCase); // cleaning [server stop]; DESTROY(server); } else { // no classes no tests [NSException raise: NSInternalInconsistencyException format: @"can't load bundle TestConnection"]; } DESTROY(arp); #if defined(_WIN32) testHopeful = NO; #endif return 0; } gnustep-base-1.29.0/Tests/base/NSURLConnection/test04.m000066400000000000000000000163401435650067400224560ustar00rootroot00000000000000/** * Tests for HTTP without authorization. */ #import #import "Helpers/NSURLConnectionTest.h" #import "Helpers/TestWebServer.h" #import int main(int argc, char **argv, char **env) { CREATE_AUTORELEASE_POOL(arp); NSFileManager *fm; NSBundle *bundle; BOOL loaded; NSString *helperPath; /* The following test cases depend on the GSInetServerStream * class which is completely broken on Windows. * * See: https://github.com/gnustep/libs-base/issues/266 * * We will mark the test cases as hopeful on Windows. */ #if defined(_WIN32) NSLog(@"Marking local web server tests as hopeful because GSInetServerStream is broken on Windows"); testHopeful = YES; #endif // load the test suite's classes fm = [NSFileManager defaultManager]; helperPath = [[fm currentDirectoryPath] stringByAppendingString: @"/Helpers/TestConnection.bundle"]; bundle = [NSBundle bundleWithPath: helperPath]; loaded = [bundle load]; if(loaded) { NSDictionary *d; Class testClass; NSDictionary *refs; TestWebServer *server; NSURLConnectionTest *testCase; BOOL debug = NO; testClass = [bundle principalClass]; // NSURLConnectionTest // create a shared TestWebServer instance for performance server = [[testClass testWebServerClass] new]; [server setDebug: debug]; [server start: nil]; // localhost:1234 HTTP /* * Simple GET via HTTP without authorization with empty response's body and * the response's status code 204 (by default) */ testCase = [testClass new]; [testCase setDebug: debug]; // the reference set difference (from the default reference set) we expect // the flags must not be set because we request a path with no authorization // See NSURLConnectionTest.h for details (the key words are 'TestCase' and 'ReferenceFlags') refs = [NSDictionary dictionaryWithObjectsAndKeys: @"NO", @"GOTUNAUTHORIZED", @"NO", @"AUTHORIZED", @"NO", @"NOTAUTHORIZED", nil]; // the extra dictionary with test case's parameters d = [NSDictionary dictionaryWithObjectsAndKeys: server, @"Instance", // we use the shared TestWebServer instance @"/withoutauth", @"Path", // the path commands to use no authorization refs, @"ReferenceFlags", // the expected reference set difference nil]; [testCase setUpTest: d]; [testCase startTest: d]; PASS([testCase isSuccess], "no auth... GET http://localhost:1234/withoutauth"); [testCase tearDownTest: d]; DESTROY(testCase); /* * Simple GET via HTTP without authorization with the response's status code 400 * and non-empty response's body */ testCase = [testClass new]; [testCase setDebug: debug]; // the reference set difference (from the default reference set) we expect // the flags must not be set because we request a path with no authorization // See NSURLConnectionTest.h for details (the key words are 'TestCase' and 'ReferenceFlags') refs = [NSDictionary dictionaryWithObjectsAndKeys: @"NO", @"GOTUNAUTHORIZED", @"NO", @"AUTHORIZED", @"NO", @"NOTAUTHORIZED", nil]; // the extra dictionary with test case's parameters d = [NSDictionary dictionaryWithObjectsAndKeys: server, @"Instance", // we use the shared TestWebServer instance @"400/withoutauth", @"Path", // request the handler responding with 400 @"400", @"StatusCode", // the expected status code @"You have issued a request with invalid data", @"Content", // the expected response's body refs, @"ReferenceFlags", // the expected reference set difference nil]; [testCase setUpTest: d]; [testCase startTest: d]; PASS([testCase isSuccess], "no auth... response 400 .... GET http://localhost:1234/400/withoutauth"); [testCase tearDownTest: d]; DESTROY(testCase); /* * Simple POST via HTTP with the response's status code 400 and * non-empty response's body */ testCase = [testClass new]; [testCase setDebug: debug]; // the reference set difference (from the default reference set) we expect // the flags must not be set because we request a path with no authorization // See NSURLConnectionTest.h for details (the key words are 'TestCase' and 'ReferenceFlags') refs = [NSDictionary dictionaryWithObjectsAndKeys: @"NO", @"GOTUNAUTHORIZED", @"NO", @"AUTHORIZED", @"NO", @"NOTAUTHORIZED", nil]; // the extra dictionary with test case's parameters d = [NSDictionary dictionaryWithObjectsAndKeys: server, @"Instance", // we use the shared TestWebServer instance @"400/withoutauth", @"Path", // request the handler responding with 400 @"400", @"StatusCode", // the expected status code @"You have issued a request with invalid data", @"Content", // the expected response's body @"Some payload", @"Payload", // the custom payload @"POST", @"Method", // use POST refs, @"ReferenceFlags", // the expected reference set difference nil]; [testCase setUpTest: d]; [testCase startTest: d]; PASS([testCase isSuccess], "no auth... payload... response 400 .... POST http://localhost:1234/400/withoutauth"); [testCase tearDownTest: d]; DESTROY(testCase); /* * Tests redirecting... it uses an auxilliary TestWebServer instance and proceeds * in two stages. The first one is to get the status code 301 and go to the URL * given in the response's header 'Location'. The second stage is a simple GET on * the given URL with the status code 204 and empty response's body. */ testCase = [testClass new]; [testCase setDebug: debug]; // the reference set difference (from the default reference set) we expect // the flags must not be set because we request a path with no authorization // See NSURLConnectionTest.h for details (the key words are 'TestCase' and 'ReferenceFlags') refs = [NSDictionary dictionaryWithObjectsAndKeys: @"NO", @"GOTUNAUTHORIZED", @"NO", @"AUTHORIZED", @"NO", @"NOTAUTHORIZED", @"YES", @"GOTREDIRECT", nil]; // the extra dictionary with test case's parameters d = [NSDictionary dictionaryWithObjectsAndKeys: server, @"Instance", // we use the shared TestWebServer instance @"/301/withoutauth", @"Path", // request the handler responding with a redirect @"/withoutauth", @"RedirectPath", // the URL's path of redirecting @"YES", @"IsAuxilliary", // start an auxilliary TestWebServer instance refs, @"ReferenceFlags", // the expected reference set difference nil]; [testCase setUpTest: d]; [testCase startTest: d]; PASS([testCase isSuccess], "no auth... redirecting... GET http://localhost:1234/301/withoutauth"); [testCase tearDownTest: d]; DESTROY(testCase); // cleaning [server stop]; DESTROY(server); } else { // no classes no tests [NSException raise: NSInternalInconsistencyException format: @"can't load bundle TestConnection"]; } #if defined(_WIN32) testHopeful = NO; #endif DESTROY(arp); return 0; } gnustep-base-1.29.0/Tests/base/NSURLConnection/test05.m000066400000000000000000000166671435650067400224730ustar00rootroot00000000000000/** * Tests for HTTPS without authorization. * (must be the same as test04.m except for the use of HTTPS). */ #import #import "Helpers/NSURLConnectionTest.h" #import "Helpers/TestWebServer.h" #import int main(int argc, char **argv, char **env) { CREATE_AUTORELEASE_POOL(arp); NSFileManager *fm; NSBundle *bundle; BOOL loaded; NSString *helperPath; /* The following test cases depend on the GSInetServerStream * class which is completely broken on Windows. * * See: https://github.com/gnustep/libs-base/issues/266 * * We will mark the test cases as hopeful on Windows. */ #if defined(_WIN32) NSLog(@"Marking local web server tests as hopeful because GSInetServerStream is broken on Windows"); testHopeful = YES; #endif // load the test suite's classes fm = [NSFileManager defaultManager]; helperPath = [[fm currentDirectoryPath] stringByAppendingString: @"/Helpers/TestConnection.bundle"]; bundle = [NSBundle bundleWithPath: helperPath]; loaded = [bundle load]; if (loaded) { NSDictionary *d; Class testClass; NSDictionary *refs; TestWebServer *server; NSURLConnectionTest *testCase; BOOL debug = NO; testClass = [bundle principalClass]; // NSURLConnectionTest // the extra dictionary commanding to use HTTPS d = [NSDictionary dictionaryWithObjectsAndKeys: @"HTTPS", @"Protocol", nil]; // create a shared TestWebServer instance for performance server = [[[testClass testWebServerClass] alloc] initWithAddress: @"localhost" port: @"1234" mode: NO extra: d]; [server setDebug: debug]; [server start: d]; // localhost:1234 HTTPS /* Simple GET via HTTPS without authorization with empty response's * body and the response's status code 204 (by default) */ testCase = [testClass new]; [testCase setDebug: debug]; /* the reference set difference (from the default reference set) * we expect the flags must not be set because we request a path * with no authorization See NSURLConnectionTest.h for details * (the key words are 'TestCase' and 'ReferenceFlags') */ refs = [NSDictionary dictionaryWithObjectsAndKeys: @"NO", @"GOTUNAUTHORIZED", @"NO", @"AUTHORIZED", @"NO", @"NOTAUTHORIZED", nil]; // the extra dictionary with test case's parameters d = [NSDictionary dictionaryWithObjectsAndKeys: server, @"Instance", // we use the shared TestWebServer instance @"/withoutauth", @"Path", // the path commands to use no authorization refs, @"ReferenceFlags", // the expected reference set difference nil]; [testCase setUpTest: d]; [testCase startTest: d]; PASS([testCase isSuccess], "HTTPS... no auth...GET https://localhost:1234/withoutauth"); [testCase tearDownTest: d]; DESTROY(testCase); /* Simple GET via HTTPS without authorization with the response's * status code 400 and non-empty response's body */ testCase = [testClass new]; [testCase setDebug: debug]; /* the reference set difference (from the default reference set) * we expect the flags must not be set because we request a path * with no authorization. See NSURLConnectionTest.h for details * (the key words are 'TestCase' and 'ReferenceFlags') */ refs = [NSDictionary dictionaryWithObjectsAndKeys: @"NO", @"GOTUNAUTHORIZED", @"NO", @"AUTHORIZED", @"NO", @"NOTAUTHORIZED", nil]; // the extra dictionary with test case's parameters d = [NSDictionary dictionaryWithObjectsAndKeys: server, @"Instance", // we use the shared TestWebServer instance @"400/withoutauth", @"Path", // request the handler responding with 400 @"400", @"StatusCode", // the expected status code @"You have issued a request with invalid data", @"Content", // the expected response's body refs, @"ReferenceFlags", // the expected reference set difference nil]; [testCase setUpTest: d]; [testCase startTest: d]; PASS([testCase isSuccess], "HTTPS... no auth... response 400... GET https://localhost:1234/400/withoutauth"); [testCase tearDownTest: d]; DESTROY(testCase); /* * Simple POST via HTTPS with the response's status code 400 and * non-empty response's body */ testCase = [testClass new]; [testCase setDebug: debug]; /* the reference set difference (from the default reference set) * we expect the flags must not be set because we request a path * with no authorization. See NSURLConnectionTest.h for details * (the key words are 'TestCase' and 'ReferenceFlags') */ refs = [NSDictionary dictionaryWithObjectsAndKeys: @"NO", @"GOTUNAUTHORIZED", @"NO", @"AUTHORIZED", @"NO", @"NOTAUTHORIZED", nil]; // the extra dictionary with test case's parameters d = [NSDictionary dictionaryWithObjectsAndKeys: server, @"Instance", // we use the shared TestWebServer instance @"400/withoutauth", @"Path", // request the handler responding with 400 @"400", @"StatusCode", // the expected status code @"You have issued a request with invalid data", @"Content", // expected @"Some payload", @"Payload", // the custom payload @"POST", @"Method", // use POST refs, @"ReferenceFlags", // the expected reference set difference nil]; [testCase setUpTest: d]; [testCase startTest: d]; PASS([testCase isSuccess], "HTTPS... no auth... payload... response 400 .... POST https://localhost:1234/400/withoutauth"); [testCase tearDownTest: d]; DESTROY(testCase); /* Tests redirecting... it uses an auxilliary TestWebServer instance * and proceeds in two stages. The first one is to get the status * code 301 and go to the URL given in the response's header 'Location'. * The second stage is a simple GET on the given URL with the status * code 204 and empty response's body. */ testCase = [testClass new]; [testCase setDebug: debug]; /* the reference set difference (from the default reference set) * we expect the flags must not be set because we request a path * with no authorization. See NSURLConnectionTest.h for details * (the key words are 'TestCase' and 'ReferenceFlags') */ refs = [NSDictionary dictionaryWithObjectsAndKeys: @"NO", @"GOTUNAUTHORIZED", @"NO", @"AUTHORIZED", @"NO", @"NOTAUTHORIZED", @"YES", @"GOTREDIRECT", nil]; /* the extra dictionary with test case's parameters */ d = [NSDictionary dictionaryWithObjectsAndKeys: server, @"Instance", // we use the shared TestWebServer instance @"/301/withoutauth", @"Path", // request a redirect @"/withoutauth", @"RedirectPath", // the URL's path of redirecting @"YES", @"IsAuxilliary", // start an auxilliary TestWebServer instance refs, @"ReferenceFlags", // the expected reference set difference nil]; [testCase setUpTest: d]; [testCase startTest: d]; PASS([testCase isSuccess], "HTTPS... no auth... redirecting... GET https://localhost:1234/301/withoutauth"); [testCase tearDownTest: d]; DESTROY(testCase); // cleaning [server stop]; DESTROY(server); } else { // no classes no tests [NSException raise: NSInternalInconsistencyException format: @"can't load bundle TestConnection"]; } #if defined(_WIN32) testHopeful = NO; #endif DESTROY(arp); return 0; } gnustep-base-1.29.0/Tests/base/NSURLConnection/test06.m000066400000000000000000000046031435650067400224570ustar00rootroot00000000000000/** * Tests for HTTP synchronous requests. */ #import #import "Helpers/NSURLConnectionTest.h" #import "Helpers/TestWebServer.h" #import int main(int argc, char **argv, char **env) { CREATE_AUTORELEASE_POOL(arp); NSFileManager *fm; NSBundle *bundle; BOOL loaded; NSString *helperPath; /* The following test cases depend on the GSInetServerStream * class which is completely broken on Windows. * * See: https://github.com/gnustep/libs-base/issues/266 * * We will mark the test cases as hopeful on Windows. */ #if defined(_WIN32) NSLog(@"Marking local web server tests as hopeful because GSInetServerStream is broken on Windows"); testHopeful = YES; #endif // load the test suite's classes fm = [NSFileManager defaultManager]; helperPath = [[fm currentDirectoryPath] stringByAppendingString: @"/Helpers/TestConnection.bundle"]; bundle = [NSBundle bundleWithPath: helperPath]; loaded = [bundle load]; if (loaded) { Class testClass; TestWebServer *server; BOOL debug = NO; NSURL *url; NSError *error = nil; NSURLRequest *request; NSURLResponse *response = nil; NSData *data; testClass = [bundle principalClass]; // NSURLConnectionTest // create a shared TestWebServer instance for performance // by default it requires the basic authentication with the pair // login:password server = [[testClass testWebServerClass] new]; [server setDebug: debug]; [server start: nil]; // localhost:1234 HTTP /* * Simple GET via HTTP with some response's body and * the response's status code 200 */ url = [NSURL URLWithString: @"http://login:password@localhost:1234/index"]; request = [NSURLRequest requestWithURL: url]; data = [NSURLConnection sendSynchronousRequest: request returningResponse: &response error: &error]; PASS(nil != data && [(NSHTTPURLResponse*)response statusCode] == 200, "NSURLConnection synchronous load with authentication returns a response"); // cleaning [server stop]; DESTROY(server); } else { // no classes no tests [NSException raise: NSInternalInconsistencyException format: @"can't load bundle TestConnection"]; } #if defined(_WIN32) testHopeful = NO; #endif DESTROY(arp); return 0; } gnustep-base-1.29.0/Tests/base/NSURLConnection/test07.m000066400000000000000000000070731435650067400224640ustar00rootroot00000000000000/** * Tests for HTTPS without authorization (big request) */ #import #import "Helpers/NSURLConnectionTest.h" #import "Helpers/TestWebServer.h" #import int main(int argc, char **argv, char **env) { CREATE_AUTORELEASE_POOL(arp); NSFileManager *fm; NSBundle *bundle; BOOL loaded; NSString *helperPath; /* The following test cases depend on the GSInetServerStream * class which is completely broken on Windows. * * See: https://github.com/gnustep/libs-base/issues/266 * * We will mark the test cases as hopeful on Windows. */ #if defined(_WIN32) NSLog(@"Marking local web server tests as hopeful because GSInetServerStream is broken on Windows"); testHopeful = YES; #endif // load the test suite's classes fm = [NSFileManager defaultManager]; helperPath = [[fm currentDirectoryPath] stringByAppendingString: @"/Helpers/TestConnection.bundle"]; bundle = [NSBundle bundleWithPath: helperPath]; loaded = [bundle load]; if (loaded) { NSDictionary *d; Class testClass; NSDictionary *refs; TestWebServer *server; NSMutableString *payload; NSURLConnectionTest *testCase; BOOL debug = NO; int i; testClass = [bundle principalClass]; // NSURLConnectionTest // the extra dictionary commanding to use HTTPS d = [NSDictionary dictionaryWithObjectsAndKeys: @"HTTPS", @"Protocol", nil]; // create a shared TestWebServer instance for performance server = [[[testClass testWebServerClass] alloc] initWithAddress: @"localhost" port: @"1234" mode: NO extra: d]; [server setDebug: debug]; [server start: d]; // localhost:1234 HTTPS /* Simple POST via HTTPS with the response's status code 400 and * non-empty response's body */ testCase = [testClass new]; [testCase setDebug: debug]; /* the reference set difference (from the default reference set) * we expect the flags must not be set because we request a path * with no authorization. See NSURLConnectionTest.h for details * (the key words are 'TestCase' and 'ReferenceFlags') */ refs = [NSDictionary dictionaryWithObjectsAndKeys: @"NO", @"GOTUNAUTHORIZED", @"NO", @"AUTHORIZED", @"NO", @"NOTAUTHORIZED", nil]; // the extra dictionary with test case's parameters payload = [NSMutableString stringWithCapacity: 1024 * 128]; for (i = 0; i < 2000; i++) { [payload appendFormat: @"%09daaaaaaaaaabbbbbbbbbbcccccccccccdddddddddd\n", i * 50]; } d = [NSDictionary dictionaryWithObjectsAndKeys: server, @"Instance", // we use the shared TestWebServer instance @"400/withoutauth", @"Path", // request the handler responding with 400 @"400", @"StatusCode", // the expected status code @"You have issued a request with invalid data", @"Content", // expected payload, @"Payload", // the custom payload @"POST", @"Method", // use POST refs, @"ReferenceFlags", // the expected reference set difference nil]; [testCase setUpTest: d]; [testCase startTest: d]; PASS([testCase isSuccess], "HTTPS... big payload... response 400 .... POST https://localhost:1234/400/withoutauth"); [testCase tearDownTest: d]; DESTROY(testCase); // cleaning [server stop]; DESTROY(server); } else { // no classes no tests [NSException raise: NSInternalInconsistencyException format: @"can't load bundle TestConnection"]; } #if defined(_WIN32) testHopeful = NO; #endif DESTROY(arp); return 0; } gnustep-base-1.29.0/Tests/base/NSURLHandle/000077500000000000000000000000001435650067400202455ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSURLHandle/GNUmakefile.preamble000066400000000000000000000001051435650067400241010ustar00rootroot00000000000000 SUBPROJECTS = Helpers include $(GNUSTEP_MAKEFILES)/aggregate.make gnustep-base-1.29.0/Tests/base/NSURLHandle/Helpers/000077500000000000000000000000001435650067400216475ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSURLHandle/Helpers/GNUmakefile000066400000000000000000000003441435650067400237220ustar00rootroot00000000000000 include $(GNUSTEP_MAKEFILES)/common.make TOOL_NAME = StatusServer NEEDS_GUI = NO StatusServer_OBJC_FILES = StatusServer.m -include GNUmakefile.preamble include $(GNUSTEP_MAKEFILES)/tool.make -include GNUmakefile.postamble gnustep-base-1.29.0/Tests/base/NSURLHandle/Helpers/StatusServer.m000066400000000000000000000222501435650067400245000ustar00rootroot00000000000000#import #if GNUSTEP #define PORT_LISTEN 1234 #define LOCATION200 @"http://localhost:1234/200" @interface StatusServer : NSObject { NSInputStream *ip; NSOutputStream *op; NSDictionary *responses; NSDictionary *headers; NSDictionary *commonHeaders; NSString *body; NSMutableData *request; } - (int) runTest; @end @implementation StatusServer - (id)init { if ((self = [super init])) { body = @"Hello\r\n"; unsigned bodyLength = [body length]; NSString *bl = [[NSNumber numberWithInt: bodyLength] stringValue]; NSString *date = [[NSCalendarDate date] description]; // set up the dictionaries of responses and headers commonHeaders = [NSDictionary dictionaryWithObjectsAndKeys: @"close", @"Connection", @"GNUstep test harness", @"Server", @"text/plain", @"Content-Type", date, @"Date", nil]; [commonHeaders retain]; responses = [NSDictionary dictionaryWithObjectsAndKeys: @"HTTP/1.1 200 OK", @"200", @"HTTP/1.1 201 Created", @"201", @"HTTP/1.1 204 No Content", @"204", @"HTTP/1.1 301 Moved Permanently", @"301", @"HTTP/1.1 302 Found", @"302", @"HTTP/1.1 303 See Other", @"303", @"HTTP/1.1 307 Temporary Redirect", @"307", @"HTTP/1.1 400 Bad Request", @"400", @"HTTP/1.1 401 Unauthorized", @"401", @"HTTP/1.1 403 Forbidden", @"403", @"HTTP/1.1 404 Not Found", @"404", @"HTTP/1.1 416 Requested Range Not Satisfiable", @"416", @"HTTP/1.1 500 Internal Server Error", @"500", @"HTTP/1.1 501 Not Implemented", @"501", nil]; [responses retain]; NSDictionary *header200 = [NSDictionary dictionaryWithObjectsAndKeys: bl, @"Content-Length", nil]; //we can use this Location: header in header201 for the 30x, too NSDictionary *header201 = [NSDictionary dictionaryWithObjectsAndKeys: LOCATION200, @"Location", nil]; NSDictionary *header401 = [NSDictionary dictionaryWithObjectsAndKeys: @"Basic realm=\"GNUstep\"", @"WWW-Authenticate", nil]; headers = [NSDictionary dictionaryWithObjectsAndKeys: header200, @"200", header201, @"201", header201, @"301", header201, @"302", header201, @"303", header201, @"307", header401, @"401", nil]; [headers retain]; ip = nil; op = nil; request = nil; } return self; } - (void)dealloc { [headers release]; [commonHeaders release]; [responses release]; if (nil != ip) { [ip release]; } if (nil != op) { [op release]; } if (nil != request) { [request release]; } [super dealloc]; } - (int)runTest { NSUserDefaults *defs = [NSUserDefaults standardUserDefaults]; NSRunLoop *rl = [NSRunLoop currentRunLoop]; NSHost *host = [NSHost hostWithName: @"localhost"]; NSStream *serverStream; unsigned port = [[defs stringForKey: @"Port"] intValue]; if (0 == port) port = PORT_LISTEN; serverStream = [GSServerStream serverStreamToAddr: [host address] port: port]; if (nil == serverStream) { NSLog(@"Failed to create server stream"); return 1; } [serverStream setDelegate: self]; [serverStream scheduleInRunLoop: rl forMode: NSDefaultRunLoopMode]; [serverStream open]; /* Tell main test program we are ready to handle a request */ [[NSFileHandle fileHandleWithStandardOutput] writeData: [@"Ready" dataUsingEncoding: NSASCIIStringEncoding]]; // run for one minute, then quit [rl runUntilDate: [NSDate dateWithTimeIntervalSinceNow: 60]]; return 0; } - (void) stream: (NSStream *)theStream handleEvent: (NSStreamEvent) streamEvent { NSRunLoop *rl = [NSRunLoop currentRunLoop]; switch (streamEvent) { case NSStreamEventHasBytesAvailable: { if (theStream != ip) { if (ip != nil) { [ip close]; [ip removeFromRunLoop: rl forMode: NSDefaultRunLoopMode]; ip = nil; } if (op != nil) { [op close]; [op removeFromRunLoop: rl forMode: NSDefaultRunLoopMode]; op = nil; } [(GSServerStream *)theStream acceptWithInputStream: &ip outputStream: &op]; if (ip) { RETAIN(ip); RETAIN(op); [ip scheduleInRunLoop: rl forMode: NSDefaultRunLoopMode]; [ip setDelegate: self]; [op setDelegate: self]; [ip open]; } else { NSLog(@"Received nothing from accept"); } } else if (theStream == ip) { uint8_t buf[1024]; unsigned len; BOOL done = NO; if (nil != request) { [request release]; } request = [[NSMutableData alloc] initWithCapacity: sizeof(buf)]; len = [ip read: buf maxLength: sizeof(buf)]; if (len > 0) { const char *bytes; [request appendBytes: buf length: len]; len = [request length]; bytes = (const char*)[request bytes]; if (len > 3 && memcmp(bytes+len-4, "\r\n\r\n", 4) == 0) { done = YES; } } else { done = YES; // EOF or error } if (done == YES) { [op open]; [op scheduleInRunLoop: rl forMode: NSDefaultRunLoopMode]; [ip close]; [ip removeFromRunLoop: rl forMode: NSDefaultRunLoopMode]; ip = nil; } } break; } case NSStreamEventHasSpaceAvailable: { NSString *wholeReq, *req, *retCode, *hdr; NSMutableData *response; NSArray *components; NSDictionary *specificHeaders; NSEnumerator *en; int statusCode; NSAssert(op == theStream, NSInternalInconsistencyException); if (nil == request) { NSLog(@"Attempt to send response without a request"); return; } wholeReq = [[[NSString alloc] initWithData: request encoding: NSASCIIStringEncoding] autorelease]; response = [[[NSMutableData alloc] init] autorelease]; components = [wholeReq componentsSeparatedByString: @"\r\n"]; // the actual request is the first line req = [components objectAtIndex: 0]; if ([req rangeOfString: @"GET"].location == NSNotFound && [req rangeOfString: @"HEAD"].location == NSNotFound) { retCode = @"501"; // HTTP 501: Not Implemented } else { retCode = [[req componentsSeparatedByString: @" "] objectAtIndex: 1]; // trim the leading slash retCode = [[retCode pathComponents] objectAtIndex: 1]; } if ([responses objectForKey: retCode] == nil) { retCode = @"404"; // HTTP 404: Not Found } // build the response [response appendBytes: [[responses objectForKey: retCode] cString] length: [[responses objectForKey: retCode] length]]; [response appendBytes: "\r\n" length: 2]; en = [commonHeaders keyEnumerator]; while ((hdr = [en nextObject]) != nil) { [response appendBytes: [hdr cString] length: [hdr length]]; [response appendBytes: ": " length: 2]; hdr = [commonHeaders objectForKey: hdr]; [response appendBytes: [hdr cString] length: [hdr length]]; [response appendBytes: "\r\n" length: 2]; } specificHeaders = [headers objectForKey: retCode]; if (specificHeaders != nil) { en = [specificHeaders keyEnumerator]; while ((hdr = [en nextObject]) != nil) { [response appendBytes: [hdr cString] length: [hdr length]]; [response appendBytes: ": " length: 2]; hdr = [specificHeaders objectForKey: hdr]; [response appendBytes: [hdr cString] length: [hdr length]]; [response appendBytes: "\r\n" length: 2]; } } [response appendBytes: "\r\n" length: 2]; //do we need to add the body part? if([req rangeOfString: @"HEAD"].location == NSNotFound) { statusCode = [retCode intValue]; switch (statusCode) { case 200: case 400: case 401: case 403: case 404: case 500: case 501: [response appendBytes: [body cString] length: [body length]]; break; default: break; } } // send this response and close the stream [op write: [response bytes] maxLength: [response length]]; [op close]; [op removeFromRunLoop: rl forMode: NSDefaultRunLoopMode]; op = nil; break; } case NSStreamEventEndEncountered: { [theStream close]; [theStream removeFromRunLoop: rl forMode: NSDefaultRunLoopMode]; if (theStream == ip) ip = nil; if (theStream == op) op = nil; break; } case NSStreamEventErrorOccurred: { int code = [[theStream streamError] code]; NSLog(@"Error %d on stream %p", code, theStream); [theStream close]; [theStream removeFromRunLoop: rl forMode: NSDefaultRunLoopMode]; if (theStream == ip) ip = nil; if (theStream == op) op = nil; break; } case NSStreamEventOpenCompleted: break; default: NSLog (@"Event %d on stream %p unknown", streamEvent, theStream); break; } } @end int main (int argc, char **argv) { int result; NSAutoreleasePool *arp = [NSAutoreleasePool new]; result = [[[[StatusServer alloc] init] autorelease] runTest]; [arp release]; arp = nil; return result; } #else int main (int argc, char **argv) { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSLog(@"StatesServer not implemented on non-GNUstep systems"); [arp release]; arp = nil; return 0; } #endif gnustep-base-1.29.0/Tests/base/NSURLHandle/TestInfo000066400000000000000000000000001435650067400217110ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSURLHandle/basic.m000066400000000000000000000026411435650067400215070ustar00rootroot00000000000000#import #import "Testing.h" #import "ObjectTesting.h" @interface DummyHandle : NSURLHandle @end @implementation DummyHandle @end int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; Class cls; NSURL *httpURL, *foobarURL; id handle1, handle2; httpURL = [NSURL URLWithString: @"http://www.gnustep.org"]; foobarURL = [NSURL URLWithString: @"foobar://localhost/madeupscheme"]; TEST_FOR_CLASS(@"NSURLHandle", [NSURLHandle alloc], "NSURLHandle +alloc returns an NSURLHandle"); PASS_EXCEPTION([DummyHandle cachedHandleForURL: httpURL];, NSInvalidArgumentException, "NSURLHandle subclass must implement +cachedHandleForURL:"); cls = [NSURLHandle URLHandleClassForURL: httpURL]; PASS([cls canInitWithURL: httpURL] == YES, "Appropriate subclass found for +URLHandleClassForURL:"); handle1 = [[cls alloc] initWithURL: httpURL cached: YES]; handle2 = [NSURLHandle cachedHandleForURL: httpURL]; PASS(handle2 != nil, "Available handle returned from cache"); [handle1 autorelease]; [cls autorelease]; #if !defined(GNUSTEP_BASE_LIBRARY) PASS(NO, "URLHandleClassForURL: seems to hang on MacOS-X when given an unknown URL scheme ... you may want to check to see if it has been fixed"); #else cls = [NSURLHandle URLHandleClassForURL: foobarURL]; PASS(cls == Nil, "Nil class returned for unknown URL scheme"); #endif [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSURLHandle/test00.m000066400000000000000000000110441435650067400215420ustar00rootroot00000000000000#import #import "Testing.h" #import "ObjectTesting.h" /* this test collection examines the behaviour of the * NSURLHandleClient protocol. * Graham J Lee */ typedef enum _URLHandleClientStatus { URLHandleClientNormal = 0, URLHandleClientDataDidBecomeAvailable, URLHandleClientDidFailLoadingWithReason, URLHandleClientDidBeginLoading, URLHandleClientDidCancelLoading, URLHandleClientDidFinishLoading } URLHandleClientStatus; @interface TestObject : NSObject { @protected URLHandleClientStatus _status; NSData *_receivedData; } - (int) runTest; - (URLHandleClientStatus) status; - (void) setStatus: (URLHandleClientStatus)newStatus; - (void) URLHandle: (NSURLHandle *)sender resourceDataDidBecomeAvailable: (NSData *)newBytes; - (void) URLHandle: (NSURLHandle *)sender resourceDidFailLoadingWithReason: (NSString *)reason; - (void) URLHandleResourceDidBeginLoading: (NSURLHandle *)sender; - (void) URLHandleResourceDidCancelLoading: (NSURLHandle *)sender; - (void) URLHandleResourceDidFinishLoading: (NSURLHandle *)sender; @end @implementation TestObject - (id) init { if ((self = [super init])) { _status = URLHandleClientNormal; _receivedData = nil; } return self; } - (void) dealloc { if (_receivedData) { [_receivedData release]; } [super dealloc]; } - (URLHandleClientStatus) status { return _status; } - (void) setStatus: (URLHandleClientStatus)newStatus { _status = newStatus; } - (void) URLHandle: (NSURLHandle *)sender resourceDataDidBecomeAvailable: (NSData *)newBytes { [self setStatus: URLHandleClientDataDidBecomeAvailable]; if (_receivedData) { [_receivedData release]; } _receivedData = [newBytes retain]; } - (void) URLHandle: (NSURLHandle *)sender resourceDidFailLoadingWithReason: (NSString *)reason { [self setStatus: URLHandleClientDidFailLoadingWithReason]; NSLog(@"Load failed: further tests may fail. Reason: %@", reason); } - (void) URLHandleResourceDidBeginLoading: (NSURLHandle *)sender { [self setStatus: URLHandleClientDidBeginLoading]; } - (void) URLHandleResourceDidCancelLoading: (NSURLHandle *)sender { [self setStatus: URLHandleClientDidCancelLoading]; } - (void) URLHandleResourceDidFinishLoading: (NSURLHandle *)sender { [self setStatus: URLHandleClientDidFinishLoading]; } - (int)runTest { id handle; NSURL *url; Class cls; url = [NSURL URLWithString: @"https://www.w3.org/"]; cls = [NSURLHandle URLHandleClassForURL: url]; handle = [[cls alloc] initWithURL: url cached: NO]; [handle addClient: self]; [self setStatus: URLHandleClientNormal]; [handle beginLoadInBackground]; [handle cancelLoadInBackground]; PASS([self status] == URLHandleClientDidCancelLoading, "URLHandleClientDidCancelLoading called"); [handle release]; handle = [[cls alloc] initWithURL: url cached: NO]; [handle addClient: self]; /* Don't get client messages in the foreground, so load in * background and wait a bit */ [handle writeProperty: @"POST" forKey: GSHTTPPropertyMethodKey]; NSData *d = [@"1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ" dataUsingEncoding: NSUTF8StringEncoding]; NSMutableData *m = AUTORELEASE([d mutableCopy]); while ([m length] < 64 * 1024) { [m appendData: d]; } [handle writeData: m]; [handle setReturnAll: YES]; [handle loadInBackground]; PASS([self status] == URLHandleClientDidBeginLoading, "URLHandleClientDidBeginLoading called"); NSDate *limit = [NSDate dateWithTimeIntervalSinceNow: 5.0]; while ([limit timeIntervalSinceNow] > 0.0 && [self status] != URLHandleClientDidFinishLoading) { [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate: limit]; } PASS([self status] == URLHandleClientDidFinishLoading, "URLHandleClientDidFinishLoading called"); NSLog(@"Data %@", [handle availableResourceData]); [handle release]; return 0; } @end int main(int argc, char **argv) { int status; /* The following test cases depend on the GSInetServerStream * class which is completely broken on Windows. * * See: https://github.com/gnustep/libs-base/issues/266 * * We will mark the test cases as hopeful on Windows. */ #if defined(_WIN32) NSLog(@"Marking local web server tests as hopeful because GSInetServerStream is broken on Windows"); testHopeful = YES; #endif NSAutoreleasePool *arp = [NSAutoreleasePool new]; status = [[[[TestObject alloc] init] autorelease] runTest]; [arp release]; arp = nil; #if defined(_WIN32) testHopeful = NO; #endif return status; } gnustep-base-1.29.0/Tests/base/NSURLHandle/test01.m000066400000000000000000000051041435650067400215430ustar00rootroot00000000000000#import #import "Testing.h" #import "ObjectTesting.h" #import "../NSURL/Helpers/Launch.h" /* This test collection examines the responses when a variety of HTTP * status codes are returned by the server. Relies on the * StatusServer helper tool. * * Graham J Lee < leeg@thaesofereode.info > */ int main(int argc, char **argv) { NSAutoreleasePool *arp = [NSAutoreleasePool new] ; NSString *helpers; NSString *statusServer; NSURL *url; NSURLHandle *handle; NSTask *t; Class cls; NSData *resp; NSData *rxd; /* The following test cases depend on the GSInetServerStream * class which is completely broken on Windows. * * See: https://github.com/gnustep/libs-base/issues/266 * * We will mark the test cases as hopeful on Windows. */ #if defined(_WIN32) NSLog(@"Marking local web server tests as hopeful because GSInetServerStream is broken on Windows"); testHopeful = YES; #endif url = [NSURL URLWithString: @"http://localhost:1234/200"]; cls = [NSURLHandle URLHandleClassForURL: url]; resp = [NSData dataWithBytes: "Hello\r\n" length: 7]; helpers = [[NSFileManager defaultManager] currentDirectoryPath]; helpers = [helpers stringByAppendingPathComponent: @"Helpers"]; helpers = [helpers stringByAppendingPathComponent: @"obj"]; statusServer = [helpers stringByAppendingPathComponent: @"StatusServer"]; t = [NSTask launchedHelperWithLaunchPath: statusServer arguments: nil timeout: 10.0]; if (t != nil) { // try some different requests handle = [[[cls alloc] initWithURL: url cached: NO] autorelease]; rxd = [handle loadInForeground]; PASS([rxd isEqual: resp], "Got the correct data from a 200 - status load") ; PASS([handle status] == NSURLHandleLoadSucceeded, "200 - status: Handle load succeeded") ; url = [NSURL URLWithString: @"http://localhost:1234/401"]; handle = [[[cls alloc] initWithURL: url cached: NO] autorelease]; rxd = [handle loadInForeground]; PASS([handle status] == NSURLHandleNotLoaded, "401 - status: Handle load not loaded (unanswered auth challenge)"); url = [NSURL URLWithString: @"http://localhost:1234/404"]; handle = [[[cls alloc] initWithURL: url cached: NO] autorelease]; rxd = [handle loadInForeground]; PASS([handle status] == NSURLHandleNotLoaded, "404 - status: Handle load not loaded (resource not found)"); [t terminate]; [t waitUntilExit]; } [arp release]; arp = nil ; #if defined(_WIN32) testHopeful = NO; #endif return 0; } gnustep-base-1.29.0/Tests/base/NSURLProtocol/000077500000000000000000000000001435650067400206535ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSURLProtocol/TestInfo000066400000000000000000000000001435650067400223170ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSURLProtocol/basic.m000066400000000000000000000024301435650067400221110ustar00rootroot00000000000000#import #import "Testing.h" #import "ObjectTesting.h" int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSMutableURLRequest *mutable, *copy; NSURLRequest *canon; NSURL *httpURL; httpURL = [NSURL URLWithString: @"http://www.gnustep.org"]; TEST_FOR_CLASS(@"NSURLProtocol", [NSURLProtocol alloc], "NSURLProtocol +alloc returns an NSURLProtocol"); mutable = [[NSMutableURLRequest requestWithURL: httpURL] retain]; PASS_EXCEPTION([NSURLProtocol canInitWithRequest: mutable], nil, "NSURLProtocol +canInitWithRequest throws an exeception (subclasses should be used)"); canon = [NSURLProtocol canonicalRequestForRequest: mutable]; TEST_FOR_CLASS(@"NSURLRequest", canon, "NSURLProtocol +canonicalRequestForRequest: returns an NSURLProtocol"); copy = [mutable copy]; PASS([NSURLProtocol requestIsCacheEquivalent: mutable toRequest: copy], "NSURLProtocol +requestIsCacheEquivalent:toRequest returns YES with a request and its copy"); [copy setHTTPMethod: @"POST"]; PASS([NSURLProtocol requestIsCacheEquivalent: mutable toRequest: copy] == NO, "NSURLProtocol +requestIsCacheEquivalent:toRequest returns NO after a method change"); [copy release]; [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSURLRequest/000077500000000000000000000000001435650067400205025ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSURLRequest/TestInfo000066400000000000000000000000001435650067400221460ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSURLRequest/basic.m000066400000000000000000000043751435650067400217520ustar00rootroot00000000000000#import #import "Testing.h" #import "ObjectTesting.h" int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSURLRequest *request; NSMutableURLRequest *mutable; NSURL *httpURL, *foobarURL; httpURL = [NSURL URLWithString: @"http://www.gnustep.org"]; foobarURL = [NSURL URLWithString: @"foobar://localhost/madeupscheme"]; TEST_FOR_CLASS(@"NSURLRequest", [NSURLRequest alloc], "NSURLRequest +alloc returns an NSURLRequest"); request = [NSURLRequest requestWithURL: httpURL]; PASS(request != nil, "NSURLRequest +requestWithURL returns a request from a valid URL"); PASS_EQUAL([[request URL] absoluteString], [httpURL absoluteString], "Request URL is equal to the URL used for creation"); PASS_EQUAL([request HTTPMethod], @"GET", "Request is initialized with a GET method"); request = [NSURLRequest requestWithURL: foobarURL]; PASS(request != nil, "NSURLRequest +requestWithURL returns a request from an invalid URL (unknown scheme)"); mutable = [request mutableCopy]; PASS(mutable != nil && [mutable isKindOfClass:[NSMutableURLRequest class]], "NSURLRequest -mutableCopy returns a mutable request"); [mutable setHTTPMethod: @"POST"]; PASS_EQUAL([mutable HTTPMethod], @"POST", "Can setHTTPMethod of a mutable request (POST)"); [mutable setHTTPMethod: @"NONHTTPMETHOD"]; PASS_EQUAL([mutable HTTPMethod], @"NONHTTPMETHOD", "Can setHTTPMethod of a mutable request (non existant NONHTTPMETHOD)"); [mutable addValue: @"value1" forHTTPHeaderField: @"gnustep"]; PASS_EQUAL([mutable valueForHTTPHeaderField: @"gnustep"], @"value1", "Can set and get a value for an HTTP header field"); [mutable addValue: @"value2" forHTTPHeaderField: @"gnustep"]; PASS_EQUAL([mutable valueForHTTPHeaderField: @"gnustep"], (@"value1,value2"), "Handle multiple values for an HTTP header field"); [mutable release]; mutable = [NSMutableURLRequest new]; PASS(mutable != nil && [mutable isKindOfClass:[NSMutableURLRequest class]], "NSURLRequest +new returns a mutable request"); PASS_EQUAL([mutable URL], nil, "nil URL from empty request"); PASS_EQUAL([mutable HTTPMethod], @"GET", "GET method from empty request"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSURLSession/000077500000000000000000000000001435650067400204755ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSURLSession/GNUmakefile.preamble000066400000000000000000000001301435650067400243270ustar00rootroot00000000000000 SUBPROJECTS = ../NSURLConnection/Helpers include $(GNUSTEP_MAKEFILES)/aggregate.make gnustep-base-1.29.0/Tests/base/NSURLSession/TestInfo000066400000000000000000000000001435650067400221410ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSURLSession/delegate.g000066400000000000000000000047351435650067400224300ustar00rootroot00000000000000#import #import "Testing.h" #import "ObjectTesting.h" @interface MyDelegate : NSObject { BOOL _finished; NSMutableArray *_order; NSURLResponse *_response; NSData *_taskData; NSString *_taskText; NSError *_taskError; NSURL *_taskLocation; } - (BOOL) finished; - (void) reset; @end @implementation MyDelegate - (void) dealloc { [self reset]; [super dealloc]; } - (BOOL) finished { return _finished; } - (id) init { if (nil != (self = [super init])) { _order = [NSMutableArray new]; } return self; } - (NSMutableArray*) order { return _order; } - (void) reset { DESTROY(_order); DESTROY(_response); DESTROY(_taskData); DESTROY(_taskError); DESTROY(_taskText); DESTROY(_taskLocation); _finished = NO; } - (NSURLResponse*) response { return _response; } - (NSData*) taskData { return _taskData; } - (NSError*) taskError { return _taskError; } - (NSString*) taskText { return _taskText; } - (NSURL*) taskLocation { return _taskLocation; } - (void) URLSession: (NSURLSession*)session dataTask: (NSURLSessionDataTask*)dataTask didReceiveResponse: (NSURLResponse*)response completionHandler: (void (^)(NSURLSessionResponseDisposition disposition))completionHandler { [_order addObject: NSStringFromSelector(_cmd)]; ASSIGN(_response, response); completionHandler(NSURLSessionResponseAllow); } - (void) URLSession: (NSURLSession*)session dataTask: (NSURLSessionDataTask*)dataTask didReceiveData: (NSData*)data { [_order addObject: NSStringFromSelector(_cmd)]; NSString *text; ASSIGN(_taskData, data); text = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding]; if (nil != text) { ASSIGN(_taskText, text); } RELEASE(text); } /* NSURLSessionDownloadDelegate */ - (void) URLSession: (NSURLSession *)session downloadTask: (NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL: (NSURL *)location { ASSIGN(_taskLocation, location); } - (void) URLSession: (NSURLSession*)session task: (NSURLSessionTask*)task didCompleteWithError: (NSError*)error { [_order addObject: NSStringFromSelector(_cmd)]; _finished = YES; if (error == nil) { NSLog(@"Download is Successful"); } else { NSLog(@"Error %@", [error userInfo]); } ASSIGN(_taskError, error); } @end gnustep-base-1.29.0/Tests/base/NSURLSession/gdbinit000066400000000000000000000034021435650067400220370ustar00rootroot00000000000000def print_ivar set $adr = malloc(1000) call strcpy(($adr),($arg1)) call GSObjCPrint(($arg0),($adr)) call free($adr) end def print_ivars if ((($arg0)->isa->info & 0x01) || (($arg0)->isa->info == 2816)) # arg0 is a pointer to an object set $cls = ($arg0)->isa else if (($arg0)->isa->info & 0x02) # arg0 is a pointer to a class set $cls = ($arg0) else # arg0 is something else set $cls = 0 end end while (($cls) != 0) set $ivars = ($cls)->ivars if (($ivars) != 0) set $i = 0 while ($i < ($ivars)->count) output ($ivars)->ivar_list[$i] echo \n set $i = $i + 1 end end set $cls = ($cls)->super_class end end def pivi print *(int *)((char *)($arg0) + ($arg1))) end def pivl print *(long *)((char *)($arg0) + ($arg1))) end def pivp print *(void *)((char *)($arg0) + ($arg1))) end def pivo po *((id *)((char *)($arg0) + ($arg1))) end document print_ivars Recursively print the instance varibles of the object or a class given as first (and only) argument. end document pivi Print the value of the an instance variable as an int. The first argument is the pointer to the object and the second the offset of the instance variable. end document pivl Print the value of the an instance variable as a long. The first argument is the pointer to the object and the second the offset of the instance variable. end document pivp Print the value of the an instance variable as a pointer (to void). The first argument is the pointer to the object and the second the offset of the instance variable. end document pivo Ask an instance variable to print itself (using po). The first argument is the pointer to the object and the second the offset of the instance variable. end gnustep-base-1.29.0/Tests/base/NSURLSession/test01.m000066400000000000000000000070141435650067400217750ustar00rootroot00000000000000#import #import "Testing.h" #import "ObjectTesting.h" #if GS_HAVE_NSURLSESSION @interface MyDelegate : NSObject { @public BOOL responseCompletion; BOOL didComplete; NSString *taskText; NSError *taskError; } @end @implementation MyDelegate - (void) dealloc { RELEASE(taskText); RELEASE(taskError); [super dealloc]; } - (void) URLSession: (NSURLSession*)session dataTask: (NSURLSessionDataTask*)dataTask didReceiveResponse: (NSURLResponse*)response completionHandler: (void (^)(NSURLSessionResponseDisposition disposition))completionHandler { responseCompletion = YES; if (NO == didComplete) { NSLog(@"### handler 1 before didComplete..."); } else { NSLog(@"### handler 1 after didComplete..."); } completionHandler(NSURLSessionResponseAllow); } - (void) URLSession: (NSURLSession*)session dataTask: (NSURLSessionDataTask*)dataTask didReceiveData: (NSData*)data { NSString *text; text = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding]; if (nil == text) { NSLog(@"Received non-utf8 %@", data); } else { ASSIGN(taskText, text); NSLog(@"Received String %@", text); } RELEASE(text); } - (void) URLSession: (NSURLSession*)session task: (NSURLSessionTask*)task didCompleteWithError: (NSError*)error { if (error == nil) { NSLog(@"Download is Succesfull"); } else { NSLog(@"Error %@", [error userInfo]); } didComplete = YES; ASSIGN(taskError, error); } @end #endif int main() { START_SET("NSURLSession test01") #if !GS_HAVE_NSURLSESSION SKIP("library built without NSURLSession support") #else NSURLSessionConfiguration *defaultConfigObject; NSURLSession *defaultSession; NSURLSessionDataTask *dataTask; NSMutableURLRequest *urlRequest; NSURL *url; NSOperationQueue *mainQueue; NSString *params; MyDelegate *object; object = AUTORELEASE([MyDelegate new]); mainQueue = [NSOperationQueue mainQueue]; defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration]; defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: object delegateQueue: mainQueue]; url = [NSURL URLWithString: @"http://localhost:12345/not-here"]; urlRequest = [NSMutableURLRequest requestWithURL: url]; [urlRequest setHTTPMethod: @"POST"]; params = @"name=Ravi&loc=India&age=31&submit=true"; [urlRequest setHTTPBody: [params dataUsingEncoding: NSUTF8StringEncoding]]; if ([urlRequest respondsToSelector: @selector(setDebug:)]) { [urlRequest setDebug: YES]; } dataTask = [defaultSession dataTaskWithRequest: urlRequest]; [dataTask resume]; NSDate *limit = [NSDate dateWithTimeIntervalSinceNow: 60.0]; while (object->didComplete == NO && [limit timeIntervalSinceNow] > 0.0) { ENTER_POOL NSDate *when = [NSDate dateWithTimeIntervalSinceNow: 0.1]; [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate: when]; LEAVE_POOL } PASS(YES == object->didComplete, "request completed") PASS([object->taskError code] == NSURLErrorCannotConnectToHost, "unable to connect to host") #endif END_SET("NSURLSession test01") return 0; } gnustep-base-1.29.0/Tests/base/NSURLSession/test02.m000066400000000000000000000062441435650067400220020ustar00rootroot00000000000000#import #import "Testing.h" #import "ObjectTesting.h" #import "../NSURLConnection/Helpers/TestWebServer.h" #if GS_HAVE_NSURLSESSION #import "delegate.g" #endif int main() { START_SET("NSURLSession http") #if !GS_HAVE_NSURLSESSION SKIP("library built without NSURLSession support") #else NSFileManager *fm; NSBundle *bundle; NSString *helperPath; // load the test suite's classes fm = [NSFileManager defaultManager]; helperPath = [[fm currentDirectoryPath] stringByAppendingPathComponent: @"../NSURLConnection/Helpers/TestConnection.bundle"]; bundle = [NSBundle bundleWithPath: helperPath]; NSCAssert([bundle load], NSInternalInconsistencyException); TestWebServer *server; Class c; BOOL debug = YES; // create a shared TestWebServer instance for performance c = [bundle principalClass]; server = [[c testWebServerClass] new]; NSCAssert(server != nil, NSInternalInconsistencyException); [server setDebug: debug]; [server start: nil]; // localhost:1234 HTTP NSURLSessionConfiguration *configuration; NSURLSession *defaultSession; NSURLSessionDataTask *dataTask; NSMutableURLRequest *urlRequest; NSURL *url; NSOperationQueue *mainQueue; NSString *params; MyDelegate *object; configuration = [[NSURLSessionConfiguration alloc] init]; [configuration setHTTPShouldUsePipelining: YES]; testHopeful=YES; PASS_RUNS([configuration setHTTPMaximumConnectionLifetime: 42];, "-setHTTPMaximumConnectionLifetime: support available in CURL") testHopeful=NO; [configuration setHTTPMaximumConnectionsPerHost: 1]; [configuration setRequestCachePolicy: NSURLCacheStorageNotAllowed]; object = AUTORELEASE([MyDelegate new]); mainQueue = [NSOperationQueue mainQueue]; defaultSession = [NSURLSession sessionWithConfiguration: configuration delegate: object delegateQueue: mainQueue]; RELEASE(configuration); url = [NSURL URLWithString: @"http://localhost:1234/xxx"]; params = @"dummy=true"; urlRequest = [NSMutableURLRequest requestWithURL: url]; [urlRequest setHTTPMethod: @"POST"]; [urlRequest setHTTPBody: [params dataUsingEncoding: NSUTF8StringEncoding]]; if ([urlRequest respondsToSelector: @selector(setDebug:)]) { [urlRequest setDebug: YES]; } dataTask = [defaultSession dataTaskWithRequest: urlRequest]; [dataTask resume]; NSDate *limit = [NSDate dateWithTimeIntervalSinceNow: 60.0]; while ([object finished] == NO && [limit timeIntervalSinceNow] > 0.0) { ENTER_POOL NSDate *when = [NSDate dateWithTimeIntervalSinceNow: 0.1]; [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate: when]; LEAVE_POOL } PASS(YES == [object finished], "request completed") PASS_EQUAL([object taskError], nil, "request did not error") NSString *expect = @"Please give login and password"; PASS_EQUAL([object taskText], expect, "request returned text") #endif END_SET("NSURLSession http") return 0; } gnustep-base-1.29.0/Tests/base/NSURLSession/test03.m000066400000000000000000000056621435650067400220060ustar00rootroot00000000000000#import #import "Testing.h" #import "ObjectTesting.h" #import "../NSURLConnection/Helpers/TestWebServer.h" #if GS_HAVE_NSURLSESSION #import "delegate.g" #endif int main() { START_SET("NSURLSession test03") #if !GS_HAVE_NSURLSESSION SKIP("library built without NSURLSession support") #else NSFileManager *fm; NSBundle *bundle; NSString *helperPath; // load the test suite's classes fm = [NSFileManager defaultManager]; helperPath = [[fm currentDirectoryPath] stringByAppendingPathComponent: @"../NSURLConnection/Helpers/TestConnection.bundle"]; bundle = [NSBundle bundleWithPath: helperPath]; NSCAssert([bundle load], NSInternalInconsistencyException); TestWebServer *server; Class c; BOOL debug = YES; // create a shared TestWebServer instance for performance c = [bundle principalClass]; server = [[c testWebServerClass] new]; NSCAssert(server != nil, NSInternalInconsistencyException); [server setDebug: debug]; [server start: nil]; // localhost:1234 HTTP NSURLSessionConfiguration *configuration; NSURLSession *defaultSession; NSURLSessionDownloadTask *downloadTask; NSMutableURLRequest *urlRequest; NSURL *url; NSOperationQueue *mainQueue; MyDelegate *object; NSString *content; configuration = [[NSURLSessionConfiguration alloc] init]; object = AUTORELEASE([MyDelegate new]); mainQueue = [NSOperationQueue mainQueue]; defaultSession = [NSURLSession sessionWithConfiguration: configuration delegate: object delegateQueue: mainQueue]; RELEASE(configuration); url = [NSURL URLWithString: @"http://localhost:1234/index"]; urlRequest = [NSMutableURLRequest requestWithURL: url]; if ([urlRequest respondsToSelector: @selector(setDebug:)]) { [urlRequest setDebug: YES]; } downloadTask = [defaultSession downloadTaskWithRequest: urlRequest]; [downloadTask resume]; NSDate *limit = [NSDate dateWithTimeIntervalSinceNow: 60.0]; while ([object finished] == NO && [limit timeIntervalSinceNow] > 0.0) { ENTER_POOL NSDate *when = [NSDate dateWithTimeIntervalSinceNow: 0.1]; [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate: when]; LEAVE_POOL } PASS(YES == [object finished], "request completed") PASS_EQUAL([object taskError], nil, "request did not error") /* Get content from file */ content = [NSString stringWithContentsOfFile: [[object taskLocation] path] encoding: NSUTF8StringEncoding error:nil]; NSString *expect = @"Please give login and password"; PASS_EQUAL(content, expect, "request returned text") #endif END_SET("NSURLSession test03") return 0; } gnustep-base-1.29.0/Tests/base/NSUUID/000077500000000000000000000000001435650067400172355ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSUUID/TestInfo000066400000000000000000000000001435650067400207010ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSUUID/basic.m000066400000000000000000000040371435650067400205000ustar00rootroot00000000000000#include #include #include #include "Testing.h" #include "ObjectTesting.h" int main(int argc, char **argv) { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSUUID *uuid1, *uuid2; NSString *uuidString = @"2139CD2E-15E6-4C37-84DA-1E18EEBFAB4A"; unsigned char uuidBytes[16] = { 0x80, 0x1f, 0x3a, 0x01, 0x95, 0x7c, 0x45, 0x0f, 0xaf, 0xf2, 0x1b, 0xe9, 0x59, 0xf5, 0x89, 0x54 }; TEST_FOR_CLASS(@"NSUUID", [NSUUID alloc], "+[NSUUID alloc] returns a NSUUID"); TEST_FOR_CLASS(@"NSUUID", [NSUUID UUID], "+[NSUUID UUID] returns a UUID"); uuid1 = [[NSUUID alloc] initWithUUIDString: nil]; PASS(uuid1 == nil, "Don't create a UUID from a nil string"); uuid1 = [[NSUUID alloc] initWithUUIDString: @"test"]; PASS(uuid1 == nil, "Don't create a UUID from an invalid string"); uuid1 = [[NSUUID alloc] initWithUUIDString: uuidString]; PASS(uuid1 != nil, "Create a UUID from a valid string"); PASS_EQUAL([uuid1 UUIDString], uuidString, "Derive a stable UUID string value"); uuid2 = [[NSUUID alloc] initWithUUIDString: uuidString]; PASS_EQUAL(uuid1, uuid2, "UUIDs representing the same value are considered equal"); PASS([uuid1 hash] == [uuid2 hash], "Equal objects have equal hashes"); DESTROY(uuid2); uuid2 = [[NSUUID alloc] initWithUUIDBytes: uuidBytes]; PASS(![uuid1 isEqual: uuid2], "UUIDs representing different values should not be considered equal"); uuid_t otherBytes = {0}; [uuid2 getUUIDBytes: otherBytes]; int comparison = memcmp(uuidBytes, otherBytes, 16); PASS(comparison == 0, "Get a stable value for the UUID bytes"); DESTROY(uuid2); uuid2 = [uuid1 copy]; PASS_EQUAL(uuid1, uuid2, "-[NSUUID copy] returns an identical object"); DESTROY(uuid2); NSData *coded = [NSKeyedArchiver archivedDataWithRootObject: uuid1]; uuid2 = [NSKeyedUnarchiver unarchiveObjectWithData: coded]; PASS_EQUAL(uuid1, uuid2, "UUID survives a round-trip through archiver"); DESTROY(uuid1); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSUbiquitousKeyValueStore/000077500000000000000000000000001435650067400233235ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSUbiquitousKeyValueStore/TestInfo000066400000000000000000000000001435650067400247670ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSUbiquitousKeyValueStore/basic.m000066400000000000000000000027561435650067400245740ustar00rootroot00000000000000#import "ObjectTesting.h" #import int main() { START_SET("NSUbiquitousKeyValueStore base"); NSUbiquitousKeyValueStore *kvStore = [NSUbiquitousKeyValueStore defaultStore]; [kvStore setObject:@"Hello" forKey:@"World"]; id obj = [kvStore objectForKey:@"World"]; PASS([obj isEqualToString:@"Hello"], "Returned proper value"); [kvStore setString:@"Hello" forKey:@"World2"]; obj = [kvStore objectForKey:@"World2"]; PASS([obj isEqualToString:@"Hello"], "Returned proper value"); [kvStore setArray: [NSArray arrayWithObject:@"Hello"] forKey:@"World3"]; obj = [kvStore arrayForKey:@"World3"]; PASS([obj isEqual:[NSArray arrayWithObject:@"Hello"] ], "Returned proper value"); [kvStore setDictionary:[NSDictionary dictionaryWithObject:@"Hello" forKey:@"World4"] forKey:@"World5"]; obj = [kvStore dictionaryForKey:@"World5"]; PASS([obj isEqual:[NSDictionary dictionaryWithObject:@"Hello" forKey:@"World4"]], "Returned proper value"); [kvStore setData:[NSData dataWithBytes:"hello" length:5] forKey:@"World6"]; obj = [kvStore dataForKey:@"World6"]; PASS([obj isEqual:[NSData dataWithBytes:"hello" length:5]], "Returned proper value"); [kvStore setDictionary:[NSDictionary dictionaryWithObject:@"Hello" forKey:@"World4"] forKey:@"World5"]; obj = [kvStore objectForKey:@"World5"]; PASS([obj isEqual:[NSDictionary dictionaryWithObject:@"Hello" forKey:@"World4"]], "Returned proper value"); END_SET("NSUbiquitousKeyValueStore base"); return 0; } gnustep-base-1.29.0/Tests/base/NSUndoManager/000077500000000000000000000000001435650067400206675ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSUndoManager/NSUndoManager_basic.m000066400000000000000000000167351435650067400246630ustar00rootroot00000000000000#import "Testing.h" #import "ObjectTesting.h" #import #import #import #import static NSUndoManager *um; BOOL sane; BOOL isUndoing; BOOL isRedoing; static void checkSanity() { sane = ([um isUndoing] == isUndoing && [um isRedoing] == isRedoing); if (sane == NO) { fprintf(stderr, "FAIL: basic sanity tests\n"); } } @interface Foo : NSObject { NSString *_foo; int _number; } @end @implementation Foo - (id) init { self = [super init]; um = [NSUndoManager new]; return self; } - (void) setFooReg:(id)newFoo { NSLog(@"setFooReg: %@", newFoo); checkSanity(); [um registerUndoWithTarget:self selector:@selector(setFooReg:) object:_foo]; ASSIGN(_foo,newFoo); } - (void) setFooPrep:(id)newFoo { checkSanity(); [[um prepareWithInvocationTarget:self] setFooPrep:_foo]; ASSIGN(_foo,newFoo); } - (id) fooUndo { isUndoing = YES; isRedoing = NO; [um undo]; return _foo; } - (id) fooRedo { isUndoing = NO; isRedoing = YES; [um redo]; return _foo; } - (NSString *)foo { return _foo; } - (int) numUndo { isUndoing = YES; isRedoing = NO; [um undo]; return _number; } - (int) numRedo { isUndoing = NO; isRedoing = YES; [um redo]; return _number; } - (void) setNumber:(int)newNum { checkSanity(); [[um prepareWithInvocationTarget:self] setNumber:_number]; _number = newNum; } - (int) number { return _number; } @end int main() { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; id obj = [Foo new]; id one, two, three, four, five, six, seven, eight; id bar; int rc; one = @"one"; two = @"two"; three = @"three"; four = @"four"; five = @"five"; six = @"six"; seven = @"seven"; eight = @"eight"; PASS([um levelsOfUndo] == 0, "initial levels of undo is zero"); PASS([um groupingLevel] == 0, "initial grouping level is zero"); PASS([um isUndoRegistrationEnabled] == YES, "undo registration is enabled"); PASS([um groupsByEvent] == YES, " groups by event enabled"); PASS([um isUndoing] == NO, "undoing not in progress"); PASS([um isRedoing] == NO, "redoing not in progress"); [um setGroupsByEvent: NO]; [um beginUndoGrouping]; isUndoing = NO; isRedoing = NO; [obj setFooReg:one]; [um endUndoGrouping]; PASS(([obj fooUndo] == nil && sane), "registerWithUndoTarget:selector:object single level undo"); PASS(([obj fooRedo] == one && sane), "registerWithUndoTarget:selector:object single level redo"); [um beginUndoGrouping]; isUndoing = NO; isRedoing = NO; [obj setFooReg:two]; [um endUndoGrouping]; PASS([obj foo] == two && sane, "set two"); [um beginUndoGrouping]; [obj setFooReg:three]; [um endUndoGrouping]; PASS([obj foo] == three && sane, "set three"); PASS(([obj fooUndo] == two && sane && [obj fooUndo] == one && sane && [obj fooUndo] == nil && sane), "registerWithUndoTarget:selector:object multi level undo"); PASS(([obj fooRedo] == one && sane && [obj fooRedo] == two && sane && [obj fooRedo] == three && sane), "registerWithUndoTarget:selector:object multi level redo"); [um beginUndoGrouping]; isUndoing = NO; isRedoing = NO; [obj setFooPrep:four]; [um endUndoGrouping]; [um beginUndoGrouping]; [obj setFooPrep:five]; [um endUndoGrouping]; PASS(([obj fooUndo] == four && sane), "prepareWithInvocationTarget single level undo"); PASS(([obj fooRedo] == five && sane), "prepareWithInvocationTarget single level redo"); [um beginUndoGrouping]; isUndoing = NO; isRedoing = NO; [obj setFooPrep:six]; [um endUndoGrouping]; PASS(([obj fooUndo] == five && sane && [obj fooUndo] == four && sane), "prepareWithInvocationTarget multi level undo"); PASS(([obj fooRedo] == five && sane && [obj fooRedo] == six && sane), "prepareWithInvocationTarget multi level redo"); PASS(([obj fooUndo] == five && sane && [obj fooUndo] == four && sane && [obj fooUndo] == three && sane && [obj fooUndo] == two && sane && [obj fooUndo] == one && sane && [obj fooUndo] == nil && sane), "mixing prepare... and register... in undo stack"); PASS(([obj fooRedo] == one && sane && [obj fooRedo] == two && sane && [obj fooRedo] == three && sane && [obj fooRedo] == four && sane && [obj fooRedo] == five && sane && [obj fooRedo] == six && sane), "mixing prepare... and register... in redo stack"); [um beginUndoGrouping]; isUndoing = NO; isRedoing = NO; [obj setNumber:1]; [um endUndoGrouping]; PASS(([obj numUndo] == 0), "single level undo with int argument"); PASS(([obj numRedo] == 1), "single level redo with int argument"); [um beginUndoGrouping]; isUndoing = NO; isRedoing = NO; [obj setNumber:2]; [um endUndoGrouping]; [um beginUndoGrouping]; isUndoing = NO; isRedoing = NO; [obj setNumber:3]; [um endUndoGrouping]; PASS(([obj numUndo] == 2 && sane && [obj numUndo] == 1 && sane && [obj numUndo] == 0 && sane), "multi level undo with int argument"); PASS(([obj numRedo] == 1 && sane && [obj numRedo] == 2 && sane && [obj numRedo] == 3 && sane), "multi level redo with int argument"); [um beginUndoGrouping]; isUndoing = NO; isRedoing = NO; [obj setNumber:7]; [obj setFooPrep:seven]; [um endUndoGrouping]; [um beginUndoGrouping]; isUndoing = NO; isRedoing = NO; [obj setNumber:8]; [obj setFooReg:eight]; [um endUndoGrouping]; isRedoing = NO; isUndoing = YES; [um undo]; PASS(([obj number] == 7 && sane && [obj foo] == seven && sane), "undo grouping works with undo"); isUndoing = NO; isRedoing = YES; [um redo]; PASS(([obj number] == 8 && sane && [obj foo] == eight && sane), "undo grouping works with redo"); DESTROY(um); um = [[NSUndoManager alloc] init]; [um setGroupsByEvent: NO]; [um setLevelsOfUndo: 2]; PASS(([um levelsOfUndo] == 2), "setLevelsOfUndo: is sane."); one = @"one"; two = @"two"; three = @"three"; four = @"four"; [um beginUndoGrouping]; isUndoing = NO; isRedoing = NO; [obj setFooPrep:one]; [um endUndoGrouping]; [um beginUndoGrouping]; isUndoing = NO; isRedoing = NO; [obj setFooPrep:two]; [um endUndoGrouping]; [um beginUndoGrouping]; isUndoing = NO; isRedoing = NO; [obj setFooPrep:three]; [um endUndoGrouping]; [um beginUndoGrouping]; isUndoing = NO; isRedoing = NO; [obj setFooPrep:four]; [um endUndoGrouping]; PASS(([obj fooUndo] == three && sane && [obj fooUndo] == two && sane && [obj fooUndo] == two && sane), "levels of undo really works with undo."); PASS(([obj fooRedo] == three && sane && [obj fooRedo] == four && sane && [obj fooRedo] == four && sane), "levels of undo really works with redo."); bar = [[NSObject alloc] init]; rc = [bar retainCount]; PASS_EXCEPTION([um registerUndoWithTarget:obj selector:@selector(setFooReg:) object:nil], nil, "can't register undo outside any group"); [um beginUndoGrouping]; [um registerUndoWithTarget:obj selector:@selector(setFooReg:) object:bar]; [um endUndoGrouping]; PASS(([bar retainCount] == (rc + 1)),"registerUndoWithTarget:selector:object: retains its argument object"); isRedoing = NO; isUndoing = YES; [um undo]; /* setFooReg: should cause a retain. */ [pool release]; pool = [NSAutoreleasePool new]; PASS((rc+1== [bar retainCount]),"-undo causes NSUndoManager to release its argument object"); [pool release]; pool = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSUndoManager/NSUndoManager_notifications.m000066400000000000000000000124651435650067400264470ustar00rootroot00000000000000#import "Testing.h" #import #import #import #import static NSUndoManager *um; unsigned openGroupCount; unsigned groupingLevels[32] = {0}; unsigned checkPointCounter = 0; BOOL shouldBeUndoing; BOOL shouldBeRedoing; BOOL checkPoint; BOOL openUndoGroup; BOOL willdidUndo; BOOL willdidRedo; BOOL closeUndoGroup; BOOL gotCheckPoint; BOOL gotOpenUndoGroup; BOOL gotDidUndo; BOOL gotWillUndo; BOOL gotDidRedo; BOOL gotWillRedo; BOOL gotCloseUndoGroup; @interface Foo : NSObject { NSString *_foo; int _number; } @end @implementation Foo - (id) init { NSNotificationCenter *nc; self = [super init]; um = [NSUndoManager new]; nc = [NSNotificationCenter defaultCenter]; [nc addObserver:self selector:@selector(checkPoint:) name:NSUndoManagerCheckpointNotification object:um]; [nc addObserver:self selector:@selector(openUndoGroup:) name:NSUndoManagerDidOpenUndoGroupNotification object:um]; [nc addObserver:self selector:@selector(didUndo:) name:NSUndoManagerDidUndoChangeNotification object:um]; [nc addObserver:self selector:@selector(willUndo:) name:NSUndoManagerWillUndoChangeNotification object:um]; [nc addObserver:self selector:@selector(didRedo:) name:NSUndoManagerDidRedoChangeNotification object:um]; [nc addObserver:self selector:@selector(willRedo:) name:NSUndoManagerWillRedoChangeNotification object:um]; [nc addObserver:self selector:@selector(closeUndoGroup:) name:NSUndoManagerWillCloseUndoGroupNotification object:um]; return self; } - (void) checkPoint:(NSNotification *)notif { NSLog(@"%@ %d", notif, [um groupingLevel]); if (checkPointCounter #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSUserDefaults *defs = [NSUserDefaults new]; test_NSObject(@"NSUserDefaults", [NSArray arrayWithObject: defs]); defs = [NSUserDefaults standardUserDefaults]; [defs setDouble: (double)42.42 forKey: @"aDouble"]; PASS(EQ((double)42.42, [defs doubleForKey: @"aDouble"]), "can store double"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSUserDefaults/general.m000066400000000000000000000050621435650067400226730ustar00rootroot00000000000000#import #import #import #import #import #import "ObjectTesting.h" @interface Observer : NSObject { unsigned count; } - (NSString*) count; - (void) notified: (NSNotification*)n; @end @implementation Observer - (NSString*) count { return [NSString stringWithFormat: @"%u", count]; } - (void) notified: (NSNotification*)n { count++; } @end int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; Observer *obs = [[Observer new] autorelease]; NSUserDefaults *defs; defs = [NSUserDefaults standardUserDefaults]; PASS(defs != nil && [defs isKindOfClass: [NSUserDefaults class]], "NSUserDefaults understands +standardUserDefaults"); [[NSNotificationCenter defaultCenter] addObserver: obs selector: @selector(notified:) name: NSUserDefaultsDidChangeNotification object: nil]; [defs setBool: YES forKey: @"Test Suite Bool"]; PASS([defs boolForKey: @"Test Suite Bool"], "NSUserDefaults can set/get a BOOL"); PASS([[defs objectForKey: @"Test Suite Bool"] isKindOfClass:[NSNumber class]], "NSUserDefaults returns NSNumber for a BOOL"); PASS_EQUAL([obs count], @"1", "setting a boolean causes notification"); [defs setInteger: 34 forKey: @"Test Suite Int"]; PASS([defs integerForKey: @"Test Suite Int"] == 34, "NSUserDefaults can set/get an int"); PASS([[defs objectForKey: @"Test Suite Int"] isKindOfClass:[NSNumber class]], "NSUserDefaults returns NSNumber for an int"); PASS_EQUAL([obs count], @"2", "setting an integer causes notification"); [defs setObject: @"SetString" forKey: @"Test Suite Str"]; PASS([[defs stringForKey: @"Test Suite Str"] isEqual: @"SetString"], "NSUserDefaults can set/get a string"); PASS([[defs objectForKey: @"Test Suite Str"] isKindOfClass:[NSString class]], "NSUserDefaults returns NSString for a string"); PASS_EQUAL([obs count], @"3", "setting a string causes notification"); [defs removeObjectForKey: @"Test Suite Bool"]; PASS(nil == [defs objectForKey: @"Test Suite Bool"], "NSUserDefaults can use -removeObjectForKey: to remove a bool"); PASS_EQUAL([obs count], @"4", "removing a key causes notification"); [defs setObject: nil forKey: @"Test Suite Int"]; PASS(nil == [defs objectForKey: @"Test Suite Int"], "NSUserDefaults can use -setObject:forKey: to remove an int"); PASS_EQUAL([obs count], @"5", "setting nil object causes notification"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSValue/000077500000000000000000000000001435650067400175435ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSValue/basic.m000066400000000000000000000015001435650067400207760ustar00rootroot00000000000000#import #import "Testing.h" #import "ObjectTesting.h" int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSValue *testObj; test_alloc_only(@"NSValue"); int val = 5; int out; testObj = [NSValue valueWithBytes: &val objCType: @encode(int)]; [testObj getValue: &out]; PASS_EQUAL(val, out, "NSValue -getValue returned the same integer"); NSRange range_val = NSMakeRange(1, 1); NSRange range_out; testObj = [NSValue valueWithBytes: &range_val objCType: @encode(NSRange)]; [testObj getValue: &range_out]; PASS(NSEqualRanges(range_val, range_out), "NSValue -getValue returned the same NSRange"); range_out = [testObj rangeValue]; PASS(NSEqualRanges(range_val, range_out), "NSValue -rangeValue returned the same NSRange"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSValueTransformer/000077500000000000000000000000001435650067400217665ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSValueTransformer/TestInfo000066400000000000000000000000001435650067400234320ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSValueTransformer/basic.m000066400000000000000000000050451435650067400232310ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import #import @interface YesTransformer : NSValueTransformer @end @implementation YesTransformer + (BOOL) allowsReverseTransformation { return NO; } + (Class) transformedValueClass { return [NSNumber class]; } - (id) transformedValue: (id)value { return [NSNumber numberWithBool: YES]; } @end @interface NestedTransformer : NSValueTransformer { NSValueTransformer *_backingTransformer; } @end @implementation NestedTransformer - (id) init { if (self = [super init]) { _backingTransformer = RETAIN([NSValueTransformer valueTransformerForName: NSStringFromClass([YesTransformer class])]); } return self; } - (void) dealloc { RELEASE(_backingTransformer); DEALLOC } + (BOOL) allowsReverseTransformation { return NO; } + (Class) transformedValueClass { return [YesTransformer transformedValueClass]; } - (id) transformedValue: (id)value { return [_backingTransformer transformedValue: value]; } @end int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSValueTransformer *transformer; transformer = [NSValueTransformer valueTransformerForName:NSNegateBooleanTransformerName]; PASS([[transformer transformedValue:[NSNumber numberWithBool:NO]] boolValue] == YES && [[transformer transformedValue:[NSNumber numberWithBool:YES]] boolValue] == NO, "NSNegateBooleanTransformer transforms correctly"); PASS([[transformer reverseTransformedValue:[NSNumber numberWithBool:NO]] boolValue] == YES && [[transformer reverseTransformedValue:[NSNumber numberWithBool:YES]] boolValue] == NO, "NSNegateBooleanTransformer reverse transforms correctly"); transformer = [NSValueTransformer valueTransformerForName:NSIsNilTransformerName]; PASS([[transformer transformedValue:nil] boolValue] == YES && [[transformer transformedValue:@""] boolValue] == NO, "NSIsNilTransformer transforms correctly"); transformer = [NSValueTransformer valueTransformerForName:NSIsNotNilTransformerName]; PASS([[transformer transformedValue:@""] boolValue] == YES && [[transformer transformedValue:nil] boolValue] == NO, "NSIsNotNilTransformer transforms correctly"); transformer = [NSValueTransformer valueTransformerForName:NSStringFromClass([NestedTransformer class])]; PASS([[transformer transformedValue:nil] boolValue] == YES && [[transformer transformedValue:@""] boolValue] == YES, "Custom transformer transforms correctly"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSXMLDocument/000077500000000000000000000000001435650067400206265ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSXMLDocument/TestInfo000066400000000000000000000000001435650067400222720ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSXMLDocument/basic.m000066400000000000000000000070771435650067400221000ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import #import #import "GNUstepBase/GSConfig.h" int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; START_SET("NSXMLDocument") #if !GS_USE_LIBXML SKIP("library built without libxml2") #else NSArray *nodes = nil; NSXMLDocument *node; NSXMLDocument *node2; NSXMLElement *elem; NSString *documentXML = @"" @"" @" " @" Everyday Italian" @" Giada De Laurentiis" @" 2005" @" 30.00" @" " @" " @" Harry Potter" @" J K. Rowling" @" 2005" @" 29.99" @" " @" " @" XQuery Kick Start" @" James McGovern" @" Per Bothner" @" Kurt Cagle" @" James Linn" @" Vaidyanathan Nagarajan" @" 2003" @" 49.99" @" " @" " @" Learning XML" @" Erik T. Ray" @" 2003" @" 39.95" @" " @""; node = [NSXMLDocument alloc]; PASS_EXCEPTION([node initWithData: nil options: 0 error: 0], NSInvalidArgumentException, "Cannot initialise an XML document with nil data"); node = [NSXMLDocument alloc]; PASS_EXCEPTION([node initWithData: (NSData*)@"bad" options: 0 error: 0], NSInvalidArgumentException, "Cannot initialise an XML document with bad data class"); node = [[NSXMLDocument alloc] init]; test_alloc(@"NSXMLDocument"); test_NSObject(@"NSXMLDocument", [NSArray arrayWithObject: node]); elem = [[NSXMLElement alloc] initWithName: @"elem1"]; [node addChild: elem]; PASS_EQUAL([[node children] lastObject], elem, "can add elem to doc"); [elem release]; elem = [[NSXMLElement alloc] initWithName: @"root"]; [node setRootElement: elem]; PASS_EQUAL([[node children] lastObject], elem, "can set elem as root"); PASS([[node children] count] == 1, "set root removes other children"); PASS_RUNS([node setRootElement: nil], "setting a nil root is ignored"); PASS_EQUAL([node rootElement], elem, "root element remains"); node = [[NSXMLDocument alloc] initWithXMLString:documentXML options:0 error:NULL]; elem = [node rootElement]; PASS(node != nil, "document was initialized from a string"); PASS_EQUAL([node rootElement], elem, "root element is correct"); PASS_EQUAL([elem name],@"bookstore", "root element is bookstore"); nodes = [node nodesForXPath:@"/bookstore/book" error:NULL]; PASS([nodes count] == 4, "Xpath function returns the correct number of elements (4)"); elem = [nodes objectAtIndex: 0]; PASS_EQUAL([elem class],[NSXMLElement class], "first node in Xpath result is an element"); PASS([[elem name] isEqualToString: @"book"], "Got the correct elements from XPath query"); node2 = [[NSXMLDocument alloc] initWithXMLString:documentXML options:0 error:NULL]; PASS([node isEqual: node2], "Equal documents are equivalent"); #endif END_SET("NSXMLDocument") [arp release]; arp = nil; // [elem release]; // [node release]; return 0; } gnustep-base-1.29.0/Tests/base/NSXMLDocument/cdata.m000066400000000000000000000021361435650067400220620ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import #import #import "GNUstepBase/GSConfig.h" int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; START_SET("NSXMLDocument CDATA") #if !GS_USE_LIBXML SKIP("library built without libxml2") #else NSString *docString = @""; NSData *data = [docString dataUsingEncoding: NSUTF8StringEncoding]; NSError *outError = nil; NSXMLDocument *document = [[[NSXMLDocument alloc] initWithData: data options: (NSXMLNodePreserveCDATA | NSXMLNodePreserveWhitespace) error: &outError] autorelease]; NSXMLElement *rootElement = [document rootElement]; NSXMLNode *childNode = [rootElement childAtIndex: 0]; NSString *cData = [childNode stringValue]; PASS_EQUAL(cData, @"How to read this text ?", "CDATA element is correct"); #endif END_SET("NSXMLDocument CDATA") [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSXMLElement/000077500000000000000000000000001435650067400204415ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSXMLElement/TestInfo000066400000000000000000000000001435650067400221050ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSXMLElement/attributes.m000066400000000000000000000031761435650067400230140ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import #import #import "GNUstepBase/GSConfig.h" int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; START_SET("NSXMLElement attributes") #if !GS_USE_LIBXML SKIP("library built without libxml2") #else NSXMLElement *root1; NSXMLElement *root2; NSXMLNode *attr1; NSXMLNode *attr2; NSXMLNode *attrSameNameAsAttr1; root1 = [[NSXMLElement alloc] initWithName: @"root1"]; root2 = [[NSXMLElement alloc] initWithName: @"root2"]; attr1 = [NSXMLNode attributeWithName: @"attr1" stringValue: @"foo"]; attr2 = [NSXMLNode attributeWithName: @"attr2" stringValue: @"foo"]; attrSameNameAsAttr1 = [NSXMLNode attributeWithName: @"attr1" stringValue: @"foo"]; PASS_RUNS([root1 addAttribute: attr1], "may add attributes"); [root1 addAttribute: attr2]; PASS_EQUAL([root1 attributeForName: @"attr1"], attr1, "element returns attribute by name"); PASS_RUNS([root1 removeAttributeForName: @"attr2"], "removing attributes by name works"); PASS_EQUAL([root1 attributeForName: @"attr2"], nil, "attribute is nil after removal"); [root1 addAttribute: attrSameNameAsAttr1]; PASS_EQUAL([root1 attributeForName: @"attr1"], attr1, "may not overwrite pre-existing attributes"); PASS_EXCEPTION([root2 addAttribute: attr1], NSInternalInconsistencyException, "cannot add attributes to multiple parents"); [root1 release]; [root2 release]; #endif END_SET("NSXMLElement attributes") [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSXMLElement/basic.m000066400000000000000000000064201435650067400217020ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import #import "GNUstepBase/GSConfig.h" int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; START_SET("NSXMLElement") #if !GS_USE_LIBXML SKIP("library built without libxml2") #else NSXMLElement *node; NSXMLElement *other; NSXMLElement *xml; NSXMLNode *attr; NSArray *instances; node = [[NSXMLElement alloc] initWithName: @"node"]; xml = [[NSXMLElement alloc] initWithXMLString: @"" error: NULL]; other = [NSXMLNode elementWithName: @"other" children: nil attributes: nil]; instances = [NSArray arrayWithObjects: node, other, xml, nil]; test_alloc(@"NSXMLElement"); test_NSObject(@"NSXMLElement", instances); test_NSCopying(@"NSXMLElement", @"NSXMLElement", instances, NO, YES); other = [[NSXMLElement alloc] initWithName: @"other"]; PASS(NO == [other isEqual: node], "differently named elements are not equal"); [other setName: @"node"]; PASS_EQUAL([other name], @"node", "setting name of element works"); PASS([other isEqual: node], "elements with same name are equal"); [other release]; PASS(NSXMLElementKind == [node kind], "element node kind is correct"); PASS(0 == [node level], "element node level is zero"); PASS_EQUAL([node URI], nil, "element node URI is nil"); PASS_EQUAL([node objectValue], @"", "element node object value is empty"); PASS_EQUAL([node stringValue], @"", "element node string value is empty"); PASS_EQUAL([node children], nil, "element node children is nil"); [node setURI: @"URI"]; PASS_EQUAL([node URI], @"URI", "setting URI on element node works"); [node setObjectValue: @"anObject"]; PASS_EQUAL([node objectValue], @"anObject", "setting object value on element node works"); [node setObjectValue: nil]; PASS_EQUAL([node objectValue], @"", "setting nil object value on element node gives empty string"); [node setStringValue: @"aString"]; PASS_EQUAL([node stringValue], @"aString", "setting string value on element node works"); [node setStringValue: nil]; PASS_EQUAL([node stringValue], @"", "setting nil string value on element node gives empty string"); [node release]; // Equality tests. node = [[NSXMLNode alloc] initWithKind: NSXMLElementKind]; other = [[NSXMLNode alloc] initWithKind: NSXMLElementKind]; [other setName: @"test"]; [node setName: @"test"]; PASS([node isEqual: other], "Elements with the same name are equal"); attr = [NSXMLNode attributeWithName: @"key" stringValue: @"value"]; [node addAttribute:attr]; PASS(![node isEqual: other], "Elements with different attributes are NOT equal"); attr = [NSXMLNode attributeWithName: @"key" stringValue: @"value"]; [other addAttribute:attr]; PASS([node isEqual: other], "Elements with the same attributes are equal"); [other setStringValue: @"value"]; PASS(![node isEqual: other], "Elements with different values are NOT equal"); [node setStringValue: @"value"]; PASS([node isEqual: other], "Elements with same values are equal"); [node release]; [other release]; #endif END_SET("NSXMLElement") [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSXMLElement/children.m000066400000000000000000000117061435650067400224140ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import #import #import "GNUstepBase/GSConfig.h" int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; START_SET("NSXMLElement children") #if !GS_USE_LIBXML SKIP("library built without libxml2") #else NSXMLElement *root1; NSXMLElement *root2; NSXMLElement *child1; NSXMLElement *child2; root1 = [[NSXMLElement alloc] initWithName: @"root1"]; root2 = [[NSXMLElement alloc] initWithName: @"root2"]; child1 = [[NSXMLElement alloc] initWithName: @"child1"]; child2 = [[NSXMLElement alloc] initWithName: @"child2"]; /* In OSX (snow leopard) an attempt to add a child beyond the legal range * actally causes the data structures to be corrupted so that subsequent * operations go horribly wrong ... so we can['t run these tests. * PASS_EXCEPTION([root1 insertChild: child1 atIndex: 1], NSRangeException, "may not add a child at a bad index"); PASS(0 == [[root1 children] count], "parent has no child after failed insert"); PASS(nil == [child1 parent], "child has no parent after failed insert"); PASS_RUNS([child1 detach], "May detach"); */ PASS_RUNS([root1 insertChild: child2 atIndex: 0], "may add a child at index 0"); PASS(1 == [[root1 children] count], "parent has a child after insertion"); PASS_EQUAL([child2 parent], root1, "child has correct parent"); PASS_RUNS([root1 removeChildAtIndex: 0], "removing child works"); PASS_EQUAL([root1 children], nil, "children is nil after removal"); PASS_EQUAL([child2 parent], nil, "child has no parent"); PASS_RUNS([root1 insertChild: child2 atIndex: 0], "may reinsert a child at index 0"); PASS_RUNS([root1 insertChild: child1 atIndex: 0], "may add a child at index 0"); PASS(2 == [[root1 children] count], "parent has a child after insertion"); PASS_EXCEPTION([root2 insertChild: child1 atIndex: 0], NSInternalInconsistencyException, "cannot add a child if it has a parent"); { NSXMLNode *c; c = [[[NSXMLNode alloc] initWithKind: NSXMLElementKind] autorelease]; PASS_RUNS([root1 insertChild: c atIndex: 0], "may add NSXMLElementKind child"); c = [[[NSXMLNode alloc] initWithKind: NSXMLProcessingInstructionKind] autorelease]; PASS_RUNS([root1 insertChild: c atIndex: 0], "may add NSXMLProcessingInstructionKind child"); c = [[[NSXMLNode alloc] initWithKind: NSXMLTextKind] autorelease]; PASS_RUNS([root1 insertChild: c atIndex: 0], "may add NSXMLTextKind child"); c = [[[NSXMLNode alloc] initWithKind: NSXMLCommentKind] autorelease]; PASS_RUNS([root1 insertChild: c atIndex: 0], "may add NSXMLCommentKind child"); /* Removed based on test run on Cocoa. c = [[[NSXMLNode alloc] initWithKind: NSXMLAttributeDeclarationKind] autorelease]; PASS_RUNS([root1 insertChild: c atIndex: 0], "may add NSXMLAttributeDeclarationKind child"); */ c = [[[NSXMLNode alloc] initWithKind: NSXMLEntityDeclarationKind] autorelease]; PASS_EXCEPTION([root1 insertChild: c atIndex: 0], nil, "may not add NSXMLEntityDeclarationKind child"); c = [[[NSXMLNode alloc] initWithKind: NSXMLElementDeclarationKind] autorelease]; PASS_EXCEPTION([root1 insertChild: c atIndex: 0], nil, "may not add NSXMLElementDeclarationKind child"); c = [[[NSXMLNode alloc] initWithKind: NSXMLNotationDeclarationKind] autorelease]; PASS_EXCEPTION([root1 insertChild: c atIndex: 0], nil, "may not add NSXMLNotationDeclarationKind child"); c = [[[NSXMLNode alloc] initWithKind: NSXMLInvalidKind] autorelease]; PASS_EXCEPTION([root1 insertChild: c atIndex: 0], nil, "may not add NSXMLInvalidKind child"); c = [[[NSXMLNode alloc] initWithKind: NSXMLDocumentKind] autorelease]; PASS_EXCEPTION([root1 insertChild: c atIndex: 0], nil, "may not add NSXMLDocumentKind child"); c = [[[NSXMLNode alloc] initWithKind: NSXMLDTDKind] autorelease]; PASS_EXCEPTION([root1 insertChild: c atIndex: 0], nil, "may not add NSXMLDTDKind child"); c = [[[NSXMLNode alloc] initWithKind: NSXMLNamespaceKind] autorelease]; PASS_EXCEPTION([root1 insertChild: c atIndex: 0], nil, "may not add NSXMLNamespaceKind child"); c = [[[NSXMLNode alloc] initWithKind: NSXMLAttributeKind] autorelease]; PASS_EXCEPTION([root1 insertChild: c atIndex: 0], nil, "may not add NSXMLAttributeKind child"); } PASS(1 == [child1 level], "child element node level is one"); PASS_RUNS([root1 setChildren: nil], "may set a nil array of children"); PASS(0 == [[root1 children] count], "setting nil children works"); PASS_EXCEPTION([root1 removeChildAtIndex: 100], NSRangeException, "removing child from invalid index raises"); [root1 release]; [root2 release]; [child1 release]; [child2 release]; #endif END_SET("NSXMLElement children") [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSXMLElement/transfer.m000066400000000000000000000027441435650067400224520ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import #import #import "GNUstepBase/GSConfig.h" /* int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSXMLElement *elem1 = [[NSXMLElement alloc] initWithXMLString: @"6" error: NULL]; NSXMLElement *elem2 = [[NSXMLElement alloc] initWithXMLString: @"7" error: NULL]; NSXMLElement *copy1 = [elem1 copy]; NSXMLElement *copy2 = [elem2 copy]; [copy1 setStringValue: @"7"]; PASS_EQUAL(copy1, copy2, "equal after setStringValue:"); [arp drain]; arp = nil; return 0; } */ int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; START_SET("NSXMLElement transfer") #if !GS_USE_LIBXML SKIP("library built without libxml2") #else NSXMLDocument *doc; NSXMLElement *elem; NSXMLNode *child; NSString *simpleXML = @"6"; doc = [[NSXMLDocument alloc] initWithXMLString: simpleXML options: 0 error: NULL]; PASS(doc != nil, "document was initialized from a string"); // detach the root element from its document elem = [doc rootElement]; // PASS_EQUAL([elem XMLString], simpleXML, "root element is correct"); [elem detach]; // now, simply accessing the text node child of the element leads to a CRASH // when releasing the document child = [elem childAtIndex: 0]; [doc release]; #endif END_SET("NSXMLElement transfer") [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSXMLNode/000077500000000000000000000000001435650067400177355ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSXMLNode/TestInfo000066400000000000000000000000001435650067400214010ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSXMLNode/basic.m000066400000000000000000000112151435650067400211740ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import #import #import "GNUstepBase/GSConfig.h" int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; START_SET("NSXMLNode") #if !GS_USE_LIBXML SKIP("library built without libxml2") #else NSXMLNode *node; NSXMLNode *other; NSXMLNode *text; NSXMLNode *pi; NSXMLNode *comment; NSXMLNode *ns; NSXMLNode *attr; NSNumber *number; NSArray *instances; test_alloc(@"NSXMLNode"); node = [[NSXMLNode alloc] initWithKind: NSXMLInvalidKind]; other = [[NSXMLNode alloc] initWithKind: NSXMLElementKind]; // We need to set the name, otherwise isEqual: wont work. [other setName: @"test"]; text = [NSXMLNode textWithStringValue: @"Text node"]; pi = [NSXMLNode processingInstructionWithName: @"PI name" stringValue: @"PI string"]; ns = [NSXMLNode namespaceWithName: @"name space name" stringValue: @"name space string"]; comment = [NSXMLNode commentWithStringValue: @"Comment node"]; attr = [NSXMLNode attributeWithName: @"key" stringValue: @"value"]; instances = [NSArray arrayWithObjects: node, other, text, pi, ns, comment, attr, nil]; test_NSObject(@"NSXMLNode", instances); test_NSCopying(@"NSXMLNode", @"NSXMLNode", instances, NO, YES); PASS(NO == [other isEqual: node], "different node kinds are not equal"); [other release]; other = [[NSXMLNode alloc] initWithKind: NSXMLInvalidKind]; PASS([other isEqual: node], "invalid nodes are equal"); // Tests on invalid node PASS(NSXMLInvalidKind == [node kind], "invalid node kind is correct"); PASS(0 == [node level], "invalid node level is zero"); PASS_EQUAL([node name], nil, "invalid node name is nil"); PASS_EQUAL([node URI], nil, "invalid node URI is nil"); PASS_EQUAL([node objectValue], nil, "invalid node object value is nil"); PASS_EQUAL([node stringValue], @"", "invalid node string value is empty"); PASS_EQUAL([node children], nil, "invalid node children is nil"); [node setName: @"name"]; PASS_EQUAL([node name], nil, "setting name on invalid node gives a nil name"); [node setURI: @"URI"]; PASS_EQUAL([node URI], nil, "setting URI on invalid node gives a nil URI"); [node setObjectValue: @"anObject"]; PASS_EQUAL([node objectValue], @"anObject", "setting object value on invalid node works"); [node setObjectValue: nil]; PASS([node childCount] == 0, "No child after setting object value"); // Per documentation on NSXMLNode setObjectValue/objectValue, // On 10.6 this returns nil not @"" PASS_EQUAL([node objectValue], nil, "setting nil object value on invalid node works"); PASS_EQUAL([node stringValue], @"", "setting nil object value on invalid node gives empty string"); number = [NSNumber numberWithInt: 12]; [node setObjectValue: number]; PASS_EQUAL([node objectValue], number, "setting object value on invalid node works"); testHopeful = YES; PASS_EQUAL([node stringValue], @"1,2E1", "setting object value on invalid node sets string value"); testHopeful = NO; [node setObjectValue: nil]; [node setStringValue: @"aString"]; PASS_EQUAL([node stringValue], @"aString", "setting string value on invalid node works"); PASS_EQUAL([node objectValue], @"aString", "setting string value on invalid node sets object value"); [node setStringValue: nil]; PASS_EQUAL([node stringValue], @"", "setting nil string value on invalid node gives empty string"); PASS_EQUAL([node objectValue], nil, "setting nil string value on invalid node sets object value to nil"); [node release]; [other release]; // Tests on attribute node attr = [NSXMLNode attributeWithName: @"key" stringValue: @"value"]; PASS(NSXMLAttributeKind == [attr kind], "attr node kind is correct"); PASS(0 == [attr level], "attr node level is zero"); PASS_EQUAL([attr name], @"key", "name on attr node works"); PASS_EQUAL([attr URI], nil, "attr node URI is nil"); PASS_EQUAL([attr objectValue], @"value", "attr node object value works"); PASS_EQUAL([attr stringValue], @"value", "string value on attr node works"); // In libxml2 the value is on a child node, but we don't report that PASS_EQUAL([attr children], nil, "attr node children is nil"); PASS([attr childCount] == 0, "No child on attr node"); [attr setName: @"name"]; PASS_EQUAL([attr name], @"name", "setting name on attr node works"); [attr setStringValue: @"aString"]; PASS_EQUAL([attr stringValue], @"aString", "setting string value on attr node works"); #endif END_SET("NSXMLNode") [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/NSXMLNode/children.m000066400000000000000000000037531435650067400217130ustar00rootroot00000000000000#import "Testing.h" #import #import #import #import #import "GNUstepBase/GSConfig.h" int main() { START_SET("NSXMLNode - handling children") #if !GS_USE_LIBXML SKIP("library built without libxml2") #else NS_DURING { NSXMLElement *node = [[NSXMLElement alloc] initWithKind: NSXMLElementKind]; NSXMLDocument *docA = nil; NSXMLDocument *docB = nil; NSXMLNode *attr; [node setName: @"name"]; attr = [NSXMLNode attributeWithName: @"key" stringValue: @"value"]; [node addAttribute: attr]; PASS(node == [attr parent], "Attr parent is set to node"); PASS_EXCEPTION([node addAttribute: attr], NSInternalInconsistencyException, "Cannot add attribute twice"); [node release]; PASS(nil == [attr parent], "Attr parent is set to nil"); node = [[NSXMLElement alloc] initWithKind: NSXMLElementKind]; [node setName: @"name"]; [node addAttribute: attr]; docA = [[NSXMLDocument alloc] initWithRootElement: node]; PASS(docA == [node parent], "Parent is set to docA"); // NSLog(@"Here..."); [node detach]; PASS((docB = [[NSXMLDocument alloc] initWithRootElement: node]), "Detached children can be reattached."); [docA release]; // NSLog(@"Here... again"); PASS(docB == [node parent], "Parent is set to docB"); [docB release]; PASS(nil == [node parent], "Parent is set to nil"); docA = [[NSXMLDocument alloc] initWithRootElement: node]; // NSLog(@"Yet again"); PASS_EXCEPTION(docB = [[NSXMLDocument alloc] initWithRootElement: node], NSInternalInconsistencyException, "Reusing a child throws an exception"); // NSLog(@"Last time"); [node release]; //[docA release]; } NS_HANDLER { PASS (0 == 1, "NSXML child handling working."); // I don't think this is valid... commenting out for now. } NS_ENDHANDLER #endif END_SET("NSXMLNode - handling children") return 0; } gnustep-base-1.29.0/Tests/base/NSXMLNode/description.m000066400000000000000000000047551435650067400224510ustar00rootroot00000000000000#import "Testing.h" /* * Author: Riccardo Mottola * Created: 2012-07-27 14:37:14 +0000 by multix */ #import #import "GNUstepBase/GSConfig.h" int main(int argc, const char *argv[]) { NSString *filePath; NSString *xmlDocStr; NSXMLDocument *xmlDoc; NSXMLElement *rootElement; NSError *error; unsigned i; START_SET("NSXMLNode - descriptions") #if !GS_USE_LIBXML SKIP("library built without libxml2") #else xmlDocStr = @" DF247309-57F8-4CDB-8711-6E9DB69BCE74FOX/EDI2012-06-26T17:00:00.71717:00 10FakeField10012012-06-26T14:45:08.673ZFakeUserNormaleFakeName Campaign.Name Campagna ENPCliente.Cap37053"; xmlDoc = [[NSXMLDocument alloc] initWithXMLString:xmlDocStr options:0 error:error]; //NSLog(@"%@", xmlDoc); rootElement = [xmlDoc rootElement]; PASS(0 == [[rootElement attributes] count], "root has no attributes"); PASS_EQUAL( [[[rootElement namespaces] objectAtIndex: 0] description], @"xmlns:env=\"http://myurl/mypath/envelope\"", "namespace description"); PASS_EQUAL( [[[rootElement children] objectAtIndex: 0] description], @"DF247309-57F8-4CDB-8711-6E9DB69BCE74FOX/EDI2012-06-26T17:00:00.71717:0010FakeField10012012-06-26T14:45:08.673ZFakeUserNormaleFakeNameCampaign.NameCampagna ENPCliente.Cap37053", "child description"); #endif END_SET("NSXMLNode - descriptions") return 0; } gnustep-base-1.29.0/Tests/base/NSXMLNode/kinds.m000066400000000000000000000031251435650067400212240ustar00rootroot00000000000000#import "Testing.h" #import #import #import #import #import #import #import "GNUstepBase/GSConfig.h" #define NODE_KIND_HAS_CLASS(node, kind, theClass) \ do \ { \ node = [[NSXMLNode alloc] initWithKind: kind]; \ PASS([node isKindOfClass: [theClass class]], "Initializing with " #kind " produces instances of " #theClass "."); \ [node release]; \ node = nil; \ } while (0) int main() { START_SET("NSXMLNode -initWithKind: initializer") #if !GS_USE_LIBXML SKIP("library built without libxml2") #else NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSXMLNode *node; NS_DURING { NODE_KIND_HAS_CLASS(node, NSXMLDocumentKind, NSXMLDocument); NODE_KIND_HAS_CLASS(node, NSXMLElementKind, NSXMLElement); NODE_KIND_HAS_CLASS(node, NSXMLDTDKind, NSXMLDTD); NODE_KIND_HAS_CLASS(node, NSXMLEntityDeclarationKind, NSXMLDTDNode); NODE_KIND_HAS_CLASS(node, NSXMLElementDeclarationKind, NSXMLDTDNode); NODE_KIND_HAS_CLASS(node, NSXMLNotationDeclarationKind, NSXMLDTDNode); node = [[NSXMLNode alloc] initWithKind: NSXMLAttributeDeclarationKind]; PASS (NO == [node isKindOfClass: [NSXMLDTDNode class]], "Does not instantiate NSXMLAttributeDeclarations through -initWithKind:"); [node release]; } NS_HANDLER { PASS(YES == NO, "NSXMLNode kinds working"); } NS_ENDHANDLER [arp release]; arp = nil; #endif END_SET("NSXMLNode -initWithKind: initializer") return 0; } gnustep-base-1.29.0/Tests/base/NSXMLNode/namespaces.m000066400000000000000000000172521435650067400222410ustar00rootroot00000000000000// Based on code with the following copyright: /* Copyright (c) 2008 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #import "Testing.h" #import #import #import #import #import #import "GNUstepBase/GSConfig.h" NSString *kGDataNamespaceGData = @"http://schemas.google.com/g/2005"; NSString *kGDataNamespaceBatch = @"http://schemas.google.com/gdata/batch"; NSString *kGDataNamespaceAtom = @"http://www.w3.org/2005/Atom"; NSString *kGDataNamespaceOpenSearch = @"http://a9.com/-/spec/opensearchrss/1.0/"; NSString *kGDataNamespaceAtomPrefix = @"atom"; int main() { START_SET("NSXMLNode namespace handling") #if !GS_USE_LIBXML SKIP("library built without libxml2") #else NSAutoreleasePool *arp = [NSAutoreleasePool new]; // create elements and attributes // create with URI and local name NSXMLNode *attr1 = [NSXMLNode attributeWithName: @"foo" URI: kGDataNamespaceGData stringValue: @"baz"]; NSXMLElement *child1 = [NSXMLNode elementWithName: @"chyld" URI: kGDataNamespaceGData]; [child1 setStringValue: @"fuzz"]; // create with URI and prefix NSXMLNode *attr2 = [NSXMLNode attributeWithName: @"openSearch:foo" stringValue: @"baz2"]; NSXMLElement *child2 = [NSXMLNode elementWithName: @"openSearch:chyld"]; [child2 setStringValue: @"fuzz2"]; // create with unqualified local name NSXMLElement *child3 = [NSXMLNode elementWithName: @"chyld"]; [child3 setStringValue: @"fuzz3"]; // create with a missing namespace URI that we'll never actually add, // so we can test searches based on our faked use of {uri}: as // a prefix for the local name NSXMLNode *attr4 = [NSXMLNode attributeWithName: @"zorgbot" URI: kGDataNamespaceBatch stringValue: @"gollyfum"]; NSXMLElement *child4 = [NSXMLNode elementWithName: @"zorgtree" URI: kGDataNamespaceBatch]; [child4 setStringValue: @"gollyfoo"]; // create an element with a local namespace not defined in the parent level NSString *lonerURI = @"http://loner.ns"; NSXMLElement *child5 = [NSXMLNode elementWithName: @"ln:loner" URI: lonerURI]; NSXMLNode *ns5 = [NSXMLNode namespaceWithName: @"ln" stringValue: lonerURI]; [child5 addNamespace: ns5]; // add these to a parent element, along with namespaces NSXMLElement *parent = [NSXMLNode elementWithName: @"dad"]; [parent setStringValue: @"buzz"]; // atom is the default namespace NSXMLNode *nsAtom = [NSXMLNode namespaceWithName: @"" stringValue: kGDataNamespaceAtom]; [parent addNamespace: nsAtom]; NSXMLNode *nsGD = [NSXMLNode namespaceWithName: @"gd" stringValue: kGDataNamespaceGData]; [parent addNamespace: nsGD]; NSXMLNode *nsOpenSearch = [NSXMLNode namespaceWithName: @"openSearch" stringValue: kGDataNamespaceOpenSearch]; [parent addNamespace: nsOpenSearch]; [parent addChild: child1]; [parent addAttribute: attr1]; [parent addChild: child2]; [parent addAttribute: attr2]; [parent addChild: child3]; [parent addChild: child4]; [parent addAttribute: attr4]; [parent addChild: child5]; // search for attr1 and child1 by qualified name, since they were // created by URI NSXMLNode *attr1Found = [parent attributeForName: @"gd:foo"]; PASS_EQUAL([attr1Found stringValue], @"baz", "attribute gd:foo"); NSArray *elements = [parent elementsForName: @"gd:chyld"]; PASS((int)[elements count] == 1, "getting gd:chyld"); if ([elements count] > 0) { NSXMLNode *child1Found = [elements objectAtIndex: 0]; PASS_EQUAL([child1Found stringValue], @"fuzz", "child gd:chyld"); } // search for attr2 and child2 by local name and URI, since they were // created by qualified names NSXMLNode *attr2Found = [parent attributeForLocalName: @"foo" URI: kGDataNamespaceOpenSearch]; PASS_EQUAL([attr2Found stringValue], @"baz2", "attribute openSearch:foo"); NSArray *elements2 = [parent elementsForLocalName: @"chyld" URI: kGDataNamespaceOpenSearch]; PASS((int)[elements2 count] == 1, "getting openSearch:chyld"); if ([elements2 count] > 0) { NSXMLNode *child2Found = [elements2 objectAtIndex: 0]; PASS_EQUAL([child2Found stringValue], @"fuzz2", "child openSearch:chyld"); } // search for child3 by local name NSArray *elements3 = [parent elementsForName: @"chyld"]; PASS((int)[elements3 count] == 1, "getting chyld"); if ([elements3 count] > 0) { NSXMLNode *child3Found = [elements3 objectAtIndex: 0]; PASS_EQUAL([child3Found stringValue], @"fuzz3", "child chyld"); } // search for child3 by URI NSArray *elements3a = [parent elementsForLocalName: @"chyld" URI: kGDataNamespaceAtom]; PASS((int)[elements3a count] == 1, "getting chyld (URI"); if ([elements3a count] > 0) { NSXMLNode *child3aFound = [elements3 objectAtIndex: 0]; PASS_EQUAL([child3aFound stringValue], @"fuzz3", "child chyld"); } // search for attr4 and child4 by local name and URI, since they were // created by URI and never bound to a prefix by a namespace declaration NSXMLNode *attr4Found = [parent attributeForLocalName: @"zorgbot" URI: kGDataNamespaceBatch]; PASS_EQUAL([attr4Found stringValue], @"gollyfum", "in test batch zorgbot"); NSArray *elements4 = [parent elementsForLocalName: @"zorgtree" URI: kGDataNamespaceBatch]; PASS((int)[elements4 count] == 1, "getting batch zorgtree"); if ([elements4 count] > 0) { NSXMLNode *child4Found = [elements4 objectAtIndex: 0]; PASS_EQUAL([child4Found stringValue], @"gollyfoo", "in test batch zorgtree"); } // search for child 5 by local name and URI, since it has a locally-defined // namespace NSArray *elements5 = [parent elementsForLocalName: @"loner" URI: lonerURI]; PASS((int)[elements5 count] == 1, "getting loner"); // test output NSString *expectedXML = @"" "buzzfuzzfuzz2" "fuzz3gollyfoo" ""; NSString *actualXML = [parent XMLString]; testHopeful = YES; PASS_EQUAL(actualXML, expectedXML, "unexpected xml output"); testHopeful = NO; [arp drain]; arp = nil; #endif END_SET("NSXMLNode namespace handling") return 0; } gnustep-base-1.29.0/Tests/base/NSXMLParser/000077500000000000000000000000001435650067400203045ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSXMLParser/ParseData/000077500000000000000000000000001435650067400221505ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSXMLParser/ParseData/internal-document.result000066400000000000000000000045301435650067400270420ustar00rootroot00000000000000parserDidStartDocument: parser:foundElementDeclarationWithName:model: cTree parser:foundAttributeDeclarationWithName:forElement:type:defaultValue: version cTree 1.0 parser:foundElementDeclarationWithName:model: function parser:foundAttributeDeclarationWithName:forElement:type:defaultValue: name function (null) parser:foundAttributeDeclarationWithName:forElement:type:defaultValue: srcLoc function (null) parser:foundElementDeclarationWithName:model: argument parser:foundElementDeclarationWithName:model: result parser:didStartElement:namespaceURI:qualifiedName:attributes: cTree cTree { version = "1.0"; } parser:didStartElement:namespaceURI:qualifiedName:attributes: function function { name = ".main.dbl"; srcLoc = "line 1.32"; } parser:didStartElement:namespaceURI:qualifiedName:attributes: argument argument { } .main.sqrparser:didEndElement:namespaceURI:qualifiedName: argument argument parser:didStartElement:namespaceURI:qualifiedName:attributes: argument argument { } 3parser:didEndElement:namespaceURI:qualifiedName: argument argument parser:didStartElement:namespaceURI:qualifiedName:attributes: result result { } 12parser:didEndElement:namespaceURI:qualifiedName: result result parser:didStartElement:namespaceURI:qualifiedName:attributes: function function { name = ".main.sqr"; srcLoc = "line 1.17"; } parser:didStartElement:namespaceURI:qualifiedName:attributes: argument argument { } 3parser:didEndElement:namespaceURI:qualifiedName: argument argument parser:didStartElement:namespaceURI:qualifiedName:attributes: result result { } 6parser:didEndElement:namespaceURI:qualifiedName: result result parser:didEndElement:namespaceURI:qualifiedName: function function parser:didStartElement:namespaceURI:qualifiedName:attributes: function function { name = ".main.sqr"; srcLoc = "line 1.17"; } parser:didStartElement:namespaceURI:qualifiedName:attributes: argument argument { } 6parser:didEndElement:namespaceURI:qualifiedName: argument argument parser:didStartElement:namespaceURI:qualifiedName:attributes: result result { } 12parser:didEndElement:namespaceURI:qualifiedName: result result parser:didEndElement:namespaceURI:qualifiedName: function function parser:didEndElement:namespaceURI:qualifiedName: function function parser:didEndElement:namespaceURI:qualifiedName: cTree cTree parserDidEndDocument: gnustep-base-1.29.0/Tests/base/NSXMLParser/ParseData/internal-document.xml000066400000000000000000000011701435650067400263210ustar00rootroot00000000000000 ]> .main.sqr 3 12 3 6 6 12 gnustep-base-1.29.0/Tests/base/NSXMLParser/ParseData/namespaced-attributes.result000066400000000000000000000004671435650067400277030ustar00rootroot00000000000000parserDidStartDocument: parser:didStartMappingPrefix:toURI: gs http://gnustep.org/example# parser:didStartElement:namespaceURI:qualifiedName:attributes: node node { "gs:attr" = foo; } content parser:didEndElement:namespaceURI:qualifiedName: node node parser:didEndMappingPrefix: gs parserDidEndDocument: gnustep-base-1.29.0/Tests/base/NSXMLParser/ParseData/namespaced-attributes.xml000066400000000000000000000001441435650067400271550ustar00rootroot00000000000000 content gnustep-base-1.29.0/Tests/base/NSXMLParser/ParseData/quoted-entities.result000066400000000000000000000003241435650067400265320ustar00rootroot00000000000000parserDidStartDocument: parser:didStartElement:namespaceURI:qualifiedName:attributes: node node { attr = "-\"+&"; } content parser:didEndElement:namespaceURI:qualifiedName: node node parserDidEndDocument: gnustep-base-1.29.0/Tests/base/NSXMLParser/ParseData/quoted-entities.xml000066400000000000000000000001041435650067400260100ustar00rootroot00000000000000 content gnustep-base-1.29.0/Tests/base/NSXMLParser/TestInfo000066400000000000000000000000001435650067400217500ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/NSXMLParser/basic.m000066400000000000000000000014521435650067400215450ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSXMLParser *parser; Class c = NSClassFromString(@"GSSloppyXMLParser"); parser = [c new]; test_alloc(@"GSSloppyXMLParser"); test_NSObject(@"GSSloppyXMLParser", [NSArray arrayWithObject: parser]); parser = [NSXMLParser new]; test_alloc(@"NSXMLParser"); test_NSObject(@"NSXMLParser", [NSArray arrayWithObject: parser]); [arp release]; arp = nil; /* Don't release the parser ... it appears that on OSX there is a bug in * NSXMLParser such that deallocation crashes if the -self method has been * called on it (which is something the NSObject test does). [parser release]; */ return 0; } gnustep-base-1.29.0/Tests/base/NSXMLParser/parse.m000066400000000000000000000317261435650067400216050ustar00rootroot00000000000000#import "ObjectTesting.h" #import #import #import #import #import #import #include @interface Handler : NSObject { NSMutableString *s; } - (void)parserDidStartDocument: (NSXMLParser *)parser; - (void)parserDidEndDocument: (NSXMLParser *)parser; - (void)parser: (NSXMLParser *)parser foundNotationDeclarationWithName: (NSString *)name publicID: (NSString *)publicID systemID: (NSString *)systemID; - (void)parser: (NSXMLParser *)parser foundUnparsedEntityDeclarationWithName: (NSString *)name publicID: (NSString *)publicID systemID: (NSString *)systemID notationName: (NSString *)notationName; - (void)parser: (NSXMLParser *)parser foundAttributeDeclarationWithName: (NSString *)attributeName forElement: (NSString *)elementName type: (NSString *)type defaultValue: (NSString *)defaultValue; - (void)parser: (NSXMLParser *)parser foundElementDeclarationWithName: (NSString *)elementName model: (NSString *)model; - (void)parser: (NSXMLParser *)parser foundInternalEntityDeclarationWithName: (NSString *)name value: (NSString *)value; - (void)parser: (NSXMLParser *)parser foundExternalEntityDeclarationWithName: (NSString *)name publicID: (NSString *)publicID systemID: (NSString *)systemID; - (void)parser: (NSXMLParser *)parser didStartElement: (NSString *)elementName namespaceURI: (NSString *)namespaceURI qualifiedName: (NSString *)qName attributes: (NSDictionary *)attributeDict; - (void)parser: (NSXMLParser *)parser didEndElement: (NSString *)elementName namespaceURI: (NSString *)namespaceURI qualifiedName: (NSString *)qName; - (void)parser: (NSXMLParser *)parser didStartMappingPrefix: (NSString *)prefix toURI: (NSString *)namespaceURI; - (void)parser: (NSXMLParser *)parser didEndMappingPrefix: (NSString *)prefix; - (void)parser: (NSXMLParser *)parser foundCharacters: (NSString *)string; - (void)parser: (NSXMLParser *)parser foundIgnorableWhitespace: (NSString *)whitespaceString; - (void)parser: (NSXMLParser *)parser foundProcessingInstructionWithTarget: (NSString *)target data: (NSString *)data; - (void)parser: (NSXMLParser *)parser foundComment: (NSString *)comment; - (void)parser: (NSXMLParser *)parser foundCDATA: (NSData *)CDATABlock; - (NSData *)parser: (NSXMLParser *)parser resolveExternalEntityName: (NSString *)name systemID: (NSString *)systemID; - (void)parser: (NSXMLParser *)parser parseErrorOccurred: (NSError *)parseError; - (void)parser: (NSXMLParser *)parser validationErrorOccurred: (NSError *)validationError; @end @implementation Handler - (void) dealloc { [s release]; [super dealloc]; } - (NSString*) description { return s; } - (id) init { s = [NSMutableString new]; return self; } - (void) parserDidStartDocument: (NSXMLParser *)parser { [s appendFormat: @"%@\n", NSStringFromSelector(_cmd)]; } - (void) parserDidEndDocument: (NSXMLParser *)parser { [s appendFormat: @"%@\n", NSStringFromSelector(_cmd)]; } - (void) parser: (NSXMLParser *)parser foundNotationDeclarationWithName: (NSString *)name publicID: (NSString *)publicID systemID: (NSString *)systemID { [s appendFormat: @"%@ %@ %@ %@\n", NSStringFromSelector(_cmd), name, publicID, systemID]; } - (void) parser: (NSXMLParser *)parser foundUnparsedEntityDeclarationWithName: (NSString *)name publicID: (NSString *)publicID systemID: (NSString *)systemID notationName: (NSString *)notationName { [s appendFormat: @"%@ %@ %@ %@ %@\n", NSStringFromSelector(_cmd), name, publicID, systemID, notationName]; } - (void) parser: (NSXMLParser *)parser foundAttributeDeclarationWithName: (NSString *)attributeName forElement: (NSString *)elementName type: (NSString *)type defaultValue: (NSString *)defaultValue { [s appendFormat: @"%@ %@ %@ %@ %@\n", NSStringFromSelector(_cmd), attributeName, elementName, type, defaultValue]; } - (void) parser: (NSXMLParser *)parser foundElementDeclarationWithName: (NSString *)elementName model: (NSString *)model { [s appendFormat: @"%@ %@ %@\n", NSStringFromSelector(_cmd), elementName, model]; } - (void) parser: (NSXMLParser *)parser foundInternalEntityDeclarationWithName: (NSString *)name value: (NSString *)value { [s appendFormat: @"%@ %@ %@\n", NSStringFromSelector(_cmd), name, value]; } - (void) parser: (NSXMLParser *)parser foundExternalEntityDeclarationWithName: (NSString *)name publicID: (NSString *)publicID systemID: (NSString *)systemID { [s appendFormat: @"%@ %@ %@ %@\n", NSStringFromSelector(_cmd), name, publicID, systemID]; } - (void) parser: (NSXMLParser *)parser didStartElement: (NSString *)elementName namespaceURI: (NSString *)namespaceURI qualifiedName: (NSString *)qName attributes: (NSDictionary *)attributeDict { static NSDictionary *locale = nil; NSString *d; if (nil == locale) { locale = [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] retain]; } d = [attributeDict descriptionWithLocale: locale]; [s appendFormat: @"%@ %@ %@ %@ %@\n", NSStringFromSelector(_cmd), elementName, namespaceURI, qName, d]; } - (void) parser: (NSXMLParser *)parser didEndElement: (NSString *)elementName namespaceURI: (NSString *)namespaceURI qualifiedName: (NSString *)qName { [s appendFormat: @"%@ %@ %@ %@\n", NSStringFromSelector(_cmd), elementName, namespaceURI, qName]; } - (void) parser: (NSXMLParser *)parser didStartMappingPrefix: (NSString *)prefix toURI: (NSString *)namespaceURI { [s appendFormat: @"%@ %@ %@\n", NSStringFromSelector(_cmd), prefix, namespaceURI]; } - (void) parser: (NSXMLParser *)parser didEndMappingPrefix: (NSString *)prefix { [s appendFormat: @"%@ %@\n", NSStringFromSelector(_cmd), prefix]; } - (void) parser: (NSXMLParser *)parser foundCharacters: (NSString *)string { [s appendString: string]; } - (void) parser: (NSXMLParser *)parser foundIgnorableWhitespace: (NSString *)whitespaceString { [s appendFormat: @"%@ %@\n", NSStringFromSelector(_cmd), whitespaceString]; } - (void) parser: (NSXMLParser *)parser foundProcessingInstructionWithTarget: (NSString *)target data: (NSString *)data { [s appendFormat: @"%@ %@ %@\n", NSStringFromSelector(_cmd), target, data]; } - (void) parser: (NSXMLParser *)parser foundComment: (NSString *)comment { [s appendFormat: @"%@ %@\n", NSStringFromSelector(_cmd), comment]; } - (void) parser: (NSXMLParser *)parser foundCDATA: (NSData *)CDATABlock { [s appendFormat: @"%@ %@\n", NSStringFromSelector(_cmd), CDATABlock]; } - (NSData *) parser: (NSXMLParser *)parser resolveExternalEntityName: (NSString *)name systemID: (NSString *)systemID { [s appendFormat: @"%@ %@ %@\n", NSStringFromSelector(_cmd), name, systemID]; return nil; } - (void) parser: (NSXMLParser *)parser parseErrorOccurred: (NSError *)parseError { [s appendFormat: @"%@ %@ at %ld on %ld\n", NSStringFromSelector(_cmd), parseError, (long)[parser columnNumber], (long)[parser lineNumber]]; } - (void) parser: (NSXMLParser *)parser validationErrorOccurred: (NSError *)validationError { [s appendFormat: @"%@ %@ at %ld on %ld\n", NSStringFromSelector(_cmd), validationError, (long)[parser columnNumber], (long)[parser lineNumber]]; } - (void) reset { [s setString: @""]; } @end /* Use these booleans to control parsing behavior. */ static BOOL setShouldProcessNamespaces = YES; static BOOL setShouldReportNamespacePrefixes = YES; static BOOL setShouldResolveExternalEntities = NO; static BOOL testParser(NSXMLParser *parser, NSString *expect) { NSString *convertWin; NSString *desc; NSString *descWin; Handler *handler; [parser setShouldProcessNamespaces: setShouldProcessNamespaces]; [parser setShouldReportNamespacePrefixes: setShouldReportNamespacePrefixes]; [parser setShouldResolveExternalEntities: setShouldResolveExternalEntities]; handler = [[Handler new] autorelease]; [parser setDelegate: handler]; if (NO == [parser parse]) { NSLog(@"Parsing failed: %@ at %ld on %ld with %@", [parser parserError], (long)[parser columnNumber], (long)[parser lineNumber], [handler description]); return NO; } else { /* Replace CRLF from result files with LF */ convertWin = [expect stringByReplacingOccurrencesOfString: @"\r" withString: @""]; desc = [handler description]; descWin = [desc stringByReplacingOccurrencesOfString: @"\r" withString: @""]; if (NO == [desc isEqual: expect] && NO == [descWin isEqual: convertWin]) { NSLog(@"######## Expected:\n%@\n######## Parsed:\n%@\n########\n", expect, [handler description]); return NO; } } return YES; } static BOOL testParseData(NSData *xml, NSString *expect, BOOL strict) { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSXMLParser *parser; Class c = NSClassFromString(@"GSSloppyXMLParser"); BOOL result; if (strict) c = Nil; if (Nil == c) c = [NSXMLParser class]; parser = [[c alloc] initWithData: xml]; result = testParser(parser, expect); [arp release]; return result; } static BOOL testParseCString(const char *xmlBytes, NSString *expect, BOOL strict) { NSData *xml; xml = [NSData dataWithBytes: xmlBytes length: strlen(xmlBytes)]; return testParseData(xml, expect, strict); } static BOOL testParseStream(NSInputStream *stream, NSString *expect, BOOL strict) { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSXMLParser *parser; Class c = NSClassFromString(@"GSSloppyXMLParser"); BOOL result; if (strict) c = Nil; if (Nil == c) c = [NSXMLParser class]; parser = [[c alloc] initWithStream: stream]; result = testParser(parser, expect); [arp release]; return result; } int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSFileManager *mgr = [NSFileManager defaultManager]; NSDirectoryEnumerator *dir; NSString *str; NSString *xmlName; const char *x1 = ""; const char *x1e = ""; NSString *e1 = @"parserDidStartDocument:\nparser:didStartElement:namespaceURI:qualifiedName:attributes: test test {\n x = 1;\n}\nparser:didEndElement:namespaceURI:qualifiedName: test test\nparserDidEndDocument:\n"; PASS((testParseCString(x1, e1, YES)), "simple document 1 (strict)") PASS((testParseCString(x1, e1, NO)), "simple document 1 (sloppy)") PASS((testParseCString(x1e, e1, YES)), "simple document 1 (strict) without header") PASS((testParseCString(x1e, e1, NO)), "simple document 1 (sloppy) without header") /* Now perform any tests using .xml and .result pairs of files in * the ParseData subdirectory. */ dir = [mgr enumeratorAtPath: @"ParseData"]; while ((xmlName = [dir nextObject]) != nil) { if ([[xmlName pathExtension] isEqualToString: @"xml"]) { NSString *xmlPath; NSData *xmlData; NSString *result; NSInputStream *stream; xmlPath = [@"ParseData" stringByAppendingPathComponent: xmlName]; str = [xmlPath stringByDeletingPathExtension]; str = [str stringByAppendingPathExtension: @"result"]; xmlData = [NSData dataWithContentsOfFile: xmlPath]; result = [NSString stringWithContentsOfFile: str]; PASS((testParseData(xmlData, result, YES)), "parse data (strict): %s", [xmlName UTF8String]) result = [NSString stringWithContentsOfFile: str]; PASS((testParseData(xmlData, result, NO)), "parse data (sloppy): %s", [xmlName UTF8String]) stream = [NSInputStream inputStreamWithFileAtPath:xmlPath]; PASS((testParseStream(stream, result, YES)), "parse stream (strict): %s", [xmlName UTF8String]) testHopeful = YES; // Stream parse not yet supported stream = [NSInputStream inputStreamWithFileAtPath:xmlPath]; PASS((testParseStream(stream, result, NO)), "parse stream (sloppy): %s", [xmlName UTF8String]) testHopeful = NO; } } { NSString *exp; NSString *mgrPath; NSString *absolutePath; NSData *dat; exp = @"parserDidStartDocument:\n\ parser:didStartElement:namespaceURI:qualifiedName:attributes: file file {\n}\n\ &Aparser:didEndElement:namespaceURI:qualifiedName: file file\n\ parserDidEndDocument:\n\ "; mgrPath = [[mgr currentDirectoryPath] stringByAppendingPathComponent: @"GNUmakefile"]; absolutePath = [[NSURL fileURLWithPath: mgrPath] absoluteString]; str = [NSString stringWithFormat: @"\n" @"]>\n" @"&&foo;A", absolutePath]; dat = [str dataUsingEncoding: NSUTF8StringEncoding]; PASS((testParseData(dat, exp, YES)), "external entity (strict)") PASS((testParseData(dat, exp, YES)), "external entity (sloppy)") } [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/PropertyLists/000077500000000000000000000000001435650067400210715ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/PropertyLists/TestInfo000066400000000000000000000000001435650067400225350ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/PropertyLists/cyclic.plist000066400000000000000000000000631435650067400234130ustar00rootroot00000000000000bplist00¡¡SYES gnustep-base-1.29.0/Tests/base/PropertyLists/non_ascii.m000066400000000000000000000015361435650067400232160ustar00rootroot00000000000000/* copyright 2004 Alexander Malmberg */ #import #import #import "Testing.h" int main(int argc, char **argv) { id plist; NSAutoreleasePool *arp = [NSAutoreleasePool new]; plist=[[NSString stringWithContentsOfFile: @"non_ascii_utf8.plist"] propertyList]; PASS(plist!=nil, "utf8 plist works"); plist=[[NSString stringWithContentsOfFile: @"non_ascii_utf16.plist"] propertyList]; PASS(plist!=nil, "utf16 plist works"); plist=[[NSString stringWithContentsOfFile: @"non_ascii_utf8.strings"] propertyListFromStringsFileFormat]; PASS(plist!=nil, "utf8 strings file works"); plist=[[NSString stringWithContentsOfFile: @"non_ascii_utf16.strings"] propertyListFromStringsFileFormat]; PASS(plist!=nil, "utf16 strings file works"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/PropertyLists/non_ascii_utf16.plist000066400000000000000000000003021435650067400251300ustar00rootroot00000000000000þÿ/* Comment åäö. */ { ascii = ascii; "NågotMindreAscii" = foo; "Quoted non-ascii åäö" = "åäö"; } gnustep-base-1.29.0/Tests/base/PropertyLists/non_ascii_utf16.strings000066400000000000000000000002741435650067400254760ustar00rootroot00000000000000þÿ/* Comment åäö. */ ascii = ascii; "NågotMindreAscii" = foo; "Quoted non-ascii åäö" = "åäö"; gnustep-base-1.29.0/Tests/base/PropertyLists/non_ascii_utf8.plist000066400000000000000000000002011435650067400250470ustar00rootroot00000000000000/* Comment åäö. */ { ascii = ascii; "NÃ¥gotMindreAscii" = foo; "Quoted non-ascii åäö" = "åäö"; } gnustep-base-1.29.0/Tests/base/PropertyLists/non_ascii_utf8.strings000066400000000000000000000001761435650067400254200ustar00rootroot00000000000000/* Comment åäö. */ ascii = ascii; "NÃ¥gotMindreAscii" = foo; "Quoted non-ascii åäö" = "åäö"; gnustep-base-1.29.0/Tests/base/PropertyLists/props000066400000000000000000013516641435650067400221770ustar00rootroot00000000000000bplist00Ô^VersionMapping^SyncLastModseq_SyncLastSynchronisationDateXMessagesß0  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – — ˜ ™ š › œ ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – — ˜ ™ š › œ ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – — ˜ ™ š › œ ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – — ˜ ™ š › œ ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – — ˜ ™ š › œ ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOPQRSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNTUVWNNNNNNNNNNNNNNNNNNNq#AÔ Iš†¶ß"XYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – — ˜ ™ š › œ ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ!!!!!!!!!! ! ! ! ! !!!!!!!!!!!!!!!!!!! !!!"!#!$!%!&!'!(!)!*!+!,!-!.!/!0!1!2!3!4!5!6!7!8!9!:!;!!?!@!A!B!C!D!E!F!G!H!I!J!K!L!M!N!O!P!Q!R!S!T!U!V!W!X!Y!Z![!\!]!^!_!`!a!b!c!d!e!f!g!h!i!j!k!l!m!n!o!p!q!r!s!t!u!v!w!x!y!z!{!|!}!~!!€!!‚!ƒ!„!…!†!‡!ˆ!‰!Š!‹!Œ!!Ž!!!‘!’!“!”!•!–!—!˜!™!š!›!œ!!ž!Ÿ! !¡!¢!£!¤!¥!¦!§!¨!©!ª!«!¬!­!®!¯!°!±!²!³!´!µ!¶!·!¸!¹!º!»!¼!½!¾!¿!À!Á!Â!Ã!Ä!Å!Æ!Ç!È!É!Ê!Ë!Ì!Í!Î!Ï!Ð!Ñ!Ò!Ó!Ô!Õ!Ö!×!Ø!Ù!Ú!Û!Ü!Ý!Þ!ß!à!á!â!ã!ä!å!æ!ç!è!é!ê!ë!ì!í!î!ï!ð!ñ!ò!ó!ô!õ!ö!÷!ø!ù!ú!û!ü!ý!þ!ÿ"""""""""" " " " " """"""""""""""""""" "!"""#"$"%"&"'"(")"*"+","-"."/"0"1"2"3"4"5"6"7"8"9":";"<"=">"?"@"A"B"C"D"E"F"G"H"I"J"K"L"M"N"O"P"Q"R"S"T"U"V"W"X"Y"Z"["\"]"^"_"`"a"b"c"d"e"f"g"h"i"j"k"l"m"n"o"p"q"r"s"t"u"v"w"x"y"z"{"|"}"~""€""‚"ƒ"„"…"†"‡"ˆ"‰"Š"‹"Œ""Ž"""‘"’"“"”"•"–"—"˜"™"š"›"œ""ž"Ÿ" "¡"¢"£"¤"¥"¦"§"¨"©"ª"«"¬"­"®"¯"°"±"²"³"´"µ"¶"·"¸"¹"º"»"¼"½"¾"¿"À"Á"Â"Ã"Ä"Å"Æ"Ç"È"É"Ê"Ë"Ì"Í"Î"Ï"Ð"Ñ"Ò"Ó"Ô"Õ"Ö"×"Ø"Ù"Ú"Û"Ü"Ý"Þ"ß"à"á"â"ã"ä"å"æ"ç"è"é"ê"ë"ì"í"î"ï"ð"ñ"ò"ó"ô"õ"ö"÷"ø"ù"ú"û"ü"ý"þ"ÿ########## # # # # ################### #!#"###$#%#&#'#(#)#*#+#,#-#.#/#0#1#2#3#4#5#6#7#8#9#:#;#<#=#>#?#@#A#B#C#D#E#F#G#H#I#J#K#L#M#N#O#P#Q#R#S#T#U#V#W#X#Y#Z#[#\#]#^#_#`#a#b#c#d#e#f#g#h#i#j#k#l#m#n#o#p#q#r#s#t#u#v#w#x#y#z#{#|#}#~##€##‚#ƒ#„#…#†#‡#ˆ#‰#Š#‹#Œ##Ž###‘#’#“#”#•#–#—#˜#™#š#›#œ##ž#Ÿ# #¡#¢#£#¤#¥#¦#§#¨#©#ª#«#¬#­#®#¯#°#±#²#³#´#µ#¶#·#¸#¹#º#»#¼#½#¾#¿#À#Á#Â#Ã#Ä#Å#Æ#Ç#È#É#Ê#Ë#Ì#Í#Î#Ï#Ð#Ñ#Ò#Ó#Ô#Õ#Ö#×#Ø#Ù#Ú#Û#Ü#Ý#Þ#ß#à#á#â#ã#ä#å#æ#ç#è#é#ê#ë#ì#í#î#ï#ð#ñ#ò#ó#ô#õ#ö#÷#ø#ù#ú#û#ü#ý#þ#ÿ$$$$$$$$$$ $ $ $ $ $$$$$$$$$$$$$$$$$$$ $!$"$#$$$%$&$'$($)$*$+$,$-$.$/$0$1$2$3$4$5$6$7$8$9$:$;$<$=$>$?$@$A$B$C$D$E$F$G$H$I$J$K$L$M$N$O$P$Q$R$S$T$U$V$W$X$Y$Z$[$\$]$^$_$`$a$b$c$d$e$f$g$h$i$j$k$l$m$n$o$p$q$r$s$t$u$v$w$x$y$z${$|$}$~$$€$$‚$ƒ$„$…$†$‡$ˆ$‰$Š$‹$Œ$$Ž$$$‘$’$“$”$•$–$—$˜$™$š$›$œ$$ž$Ÿ$ $¡$¢$£$¤$¥$¦$§$¨$©$ª$«$¬$­$®$¯$°$±$²$³$´$µ$¶$·$¸$¹$º$»$¼$½$¾$¿$À$Á$Â$Ã$Ä$Å$Æ$Ç$È$É$Ê$Ë$Ì$Í$Î$Ï$Ð$Ñ$Ò$Ó$Ô$Õ$Ö$×$Ø$Ù$Ú$Û$Ü$Ý$Þ$ß$à$á$â$ã$ä$å$æ$ç$è$é$ê$ë$ì$í$î$ï$ð$ñ$ò$ó$ô$õ$ö$÷$ø$ù$ú$û$ü$ý$þ$ÿ%%%%%%%%%% % % % % %%%%%%%%%%%%%%%%%%% %!%"%#%$%%%&%'%(%)%*%+%,%-%.%/%0%1%2%3%4%5%6%7%8%9%:%;%<%=%>%?%@%A%B%C%D%E%F%G%H%I%J%K%L%M%N%O%P%Q%R%S%T%U%V%W%X%Y%Z%[%\%]%^%_%`%a%b%c%d%e%f%g%h%i%j%k%l%m%n%o%p%q%r%s%t%u%v%w%x%y%z%{%|%}%~%%€%%‚%ƒ%„%…%†%‡%ˆ%‰%Š%‹%Œ%%Ž%%%‘%’%“%”%•%–%—%˜%™%š%›%œ%%ž%Ÿ% %¡%¢%£%¤%¥%¦%§%¨%©%ª%«%¬%­%®%¯%°%±%²%³%´%µ%¶%·%¸%¹%º%»%¼%½%¾%¿%À%Á%Â%Ã%Ä%Å%Æ%Ç%È%É%Ê%Ë%Ì%Í%Î%Ï%Ð%Ñ%Ò%Ó%Ô%Õ%Ö%×%Ø%Ù%Ú%Û%Ü%Ý%Þ%ß%à%á%â%ã%ä%å%æ%ç%è%é%ê%ë%ì%í%î%ï%ð%ñ%ò%ó%ô%õ%ö%÷%ø%ù%ú%û%ü%ý%þ%ÿ&&&&&&&&&& & & & & &&&&&&&&&&&&&&&&&&& &!&"&#&$&%&&&'&(&)&*&+&,&-&.&/&0&1&2&3&4&5&6&7&8&9&:&;&<&=&>&?&@&A&B&C&D&E&F&G&H&I&J&K&L&M&N&O&P&Q&R&S&T&U&V&W&X&Y&Z&[&\&]&^&_&`&a&b&c&d&e&f&g&h&i&j&k&l&m&n&o&p&q&r&s&t&u&v&w&x&y&z&{&|&}&~&&€&&‚&ƒ&„&…&†&‡&ˆ&‰&Š&‹&Œ&&Ž&&&‘&’&“&”&•&–&—&˜&™&š&›&œ&&ž&Ÿ& &¡&¢&£&¤&¥&¦&§&¨&©&ª&«&¬&­&®&¯&°&±&²&³&´&µ&¶&·&¸&¹&º&»&¼&½&¾&¿&À&Á&Â&Ã&Ä&Å&Æ&Ç&È&É&Ê&Ë&Ì&Í&Î&Ï&Ð&Ñ&Ò&Ó&Ô&Õ&Ö&×&Ø&Ù&Ú&Û&Ü&Ý&Þ&ß&à&á&â&ã&ä&å&æ&ç&è&é&ê&ë&ì&í&î&ï&ð&ñ&ò&ó&ô&õ&ö&÷&ø&ù&ú&û&ü&ý&þ&ÿ'''''''''' ' ' ' ' ''''''''''''''''''' '!'"'#'$'%'&'''(')'*'+','-'.'/'0'1'2'3'4'5'6'7'8'9':';'<'='>'?'@'A'B'C'D'E'F'G'H'I'J'K'L'M'N'O'P'Q'R'S'T'U'V'W'X'Y'Z'['\']'^'_'`'a'b'c'd'e'f'g'h'i'j'k'l'm'n'o'p'q'r's't'u'v'w'x'y'z'{'|'}'~''€''‚'ƒ'„'…'†'‡'ˆ'‰'Š'‹'Œ''Ž'''‘'’'“'”'•'–'—'˜'™'š'›'œ''ž'Ÿ' '¡'¢'£'¤'¥'¦'§'¨'©'ª'«'¬'­'®'¯'°'±'²'³'´'µ'¶'·'¸'¹'º'»'¼'½'¾'¿'À'Á'Â'Ã'Ä'Å'Æ'Ç'È'É'Ê'Ë'Ì'Í'Î'Ï'Ð'Ñ'Ò'Ó'Ô'Õ'Ö'×'Ø'Ù'Ú'Û'Ü'Ý'Þ'ß'à'á'â'ã'ä'å'æ'ç'è'é'ê'ë'ì'í'î'ï'ð'ñ'ò'ó'ô'õ'ö'÷'ø'ù'ú'û'ü'ý'þ'ÿ(((((((((( ( ( ( ( ((((((((((((((((((( (!("(#($(%(&('((()(*(+(,(-(.(/(0(1(2(3(4(5(6(7(8(9(:(;(<(=(>(?(@(A(B(C(D(E(F(G(H(I(J(K(L(M(N(O(P(Q(R(S(T(U(V(W(X(Y(Z([(\(](^(_(`(a(b(c(d(e(f(g(h(i(j(k(l(m(n(o(p(q(r(s(t(u(v(w(x(y(z({(|(}(~((€((‚(ƒ(„(…(†(‡(ˆ(‰(Š(‹(Œ((Ž(((‘(’(“(”(•(–(—(˜(™(š(›(œ((ž(Ÿ( (¡(¢(£(¤(¥(¦(§(¨(©(ª(«(¬(­(®(¯(°(±(²(³(´(µ(¶(·(¸(¹(º(»(¼(½(¾(¿(À(Á(Â(Ã(Ä(Å(Æ(Ç(È(É(Ê(Ë(Ì(Í(Î(Ï(Ð(Ñ(Ò(Ó(Ô(Õ(Ö(×(Ø(Ù(Ú(Û(Ü(Ý(Þ(ß(à(á(â(ã(ä(å(æ(ç(è(é(ê(ë(ì(í(î(ï(ð(ñ(ò(ó(ô(õ(ö(÷(ø(ù(ú(û(ü(ý(þ(ÿ)))))))))) ) ) ) ) ))))))))))))))))))) )!)")#)$)%)&)')()))*)+),)-).)/)0)1)2)3)4)5)6)7)8)9):);)<)=)>)?)@)A)B)C)D)E)F)G)H)I)J)K)L)M)N)O)P)Q)R)S)T)U)V)W)X)Y)Z)[)\)])^)_)`)a)b)c)d)e)f)g)h)i)j)k)l)m)n)o)p)q)r)s)t)u)v)w)x)y)z){)|)})~))€))‚)ƒ)„)…)†)‡)ˆ)‰)Š)‹)Œ))Ž)))‘)’)“)”)•)–)—)˜)™)š)›)œ))ž)Ÿ) )¡)¢)£)¤)¥)¦)§)¨)©)ª)«)¬)­)®)¯)°)±)²)³)´)µ)¶)·)¸)¹)º)»)¼)½)¾)¿)À)Á)Â)Ã)Ä)Å)Æ)Ç)È)É)Ê)Ë)Ì)Í)Î)Ï)Ð)Ñ)Ò)Ó)Ô)Õ)Ö)×)Ø)Ù)Ú)Û)Ü)Ý)Þ)ß)à)á)â)ã)ä)å)æ)ç)è)é)ê)ë)ì)í)î)ï)ð)ñ)ò)ó)ô)õ)ö)÷)ø)ù)ú)û)ü)ý)þ)ÿ********** * * * * ******************* *!*"*#*$*%*&*'*(*)***+*,*-*.*/*0*1*2*3*4*5*6*7*8*9*:*;*<*=*>*?*@*A*B*C*D*E*F*G*H*I*J*K*L*M*N*O*P*Q*R*S*T*U*V*W*X*Y*Z*[*\*]*^*_*`*a*b*c*d*e*f*g*h*i*j*k*l*m*n*o*p*q*r*s*t*u*v*w*x*y*z*{*|*}*~**€**‚*ƒ*„*…*†*‡*ˆ*‰*Š*‹*Œ**Ž***‘*’*“*”*•*–*—*˜*™*š*›*œ**ž*Ÿ* *¡*¢*£*¤*¥*¦*§*¨*©*ª*«*¬*­*®*¯*°*±*²*³*´*µ*¶*·*¸*¹*º*»*¼*½*¾*¿*À*Á*Â*Ã*Ä*Å*Æ*Ç*È*É*Ê*Ë*Ì*Í*Î*Ï*Ð*Ñ*Ò*Ó*Ô*Õ*Ö*×*Ø*Ù*Ú*Û*Ü*Ý*Þ*ß*à*á*â*ã*ä*å*æ*ç*è*é*ê*ë*ì*í*î*ï*ð*ñ*ò*ó*ô*õ*ö*÷*ø*ù*ú*û*ü*ý*þ*ÿ++++++++++ + + + + +++++++++++++++++++ +!+"+#+$+%+&+'+(+)+*+++,+-+.+/+0+1+2+3+4+5+6+7+8+9+:+;+<+=+>+?+@+A+B+C+D+E+F+G+H+I+J+K+L+M+N+O+P+Q+R+S+T+U+V+W+X+Y+Z+[+\+]+^+_+`+a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+r+s+t+u+v+w+x+y+z+{+|+}+~++€++‚+ƒ+„+…+†+‡+ˆ+‰+Š+‹+Œ++Ž+++‘+’+“+”+•+–+—+˜+™+š+›+œ++ž+Ÿ+ +¡+¢+£+¤+¥+¦+§+¨+©+ª+«+¬+­+®+¯+°+±+²+³+´+µ+¶+·+¸+¹+º+»+¼+½+¾+¿+À+Á+Â+Ã+Ä+Å+Æ+Ç+È+É+Ê+Ë+Ì+Í+Î+Ï+Ð+Ñ+Ò+Ó+Ô+Õ+Ö+×+Ø+Ù+Ú+Û+Ü+Ý+Þ+ß+à+á+â+ã+ä+å+æ+ç+è+é+ê+ë+ì+í+î+ï+ð+ñ+ò+ó+ô+õ+ö+÷+ø+ù+ú+û+ü+ý+þ+ÿ,,,,,,,,,, , , , , ,,,,,,,,,,,,,,,,,,, ,!,",#,$,%,&,',(,),*,+,,,-,.,/,0,1,2,3,4,5,6,7,8,9,:,;,<,=,>,?,@,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,[,\,],^,_,`,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,{,|,},~,,€,,‚,ƒ,„,…,†,‡,ˆ,‰,Š,‹,Œ,,Ž,,,‘,’,“,”,•,–,—,˜,™,š,›,œ,,ž,Ÿ, ,¡,¢,£,¤,¥,¦,§,¨,©,ª,«,¬,­,®,¯,°,±,²,³,´,µ,¶,·,¸,¹,º,»,¼,½,¾,¿,À,Á,Â,Ã,Ä,Å,Æ,Ç,È,É,Ê,Ë,Ì,Í,Î,Ï,Ð,Ñ,Ò,Ó,Ô,Õ,Ö,×,Ø,Ù,Ú,Û,Ü,Ý,Þ,ß,à,á,â,ã,ä,å,æ,ç,è,é,ê,ë,ì,í,î,ï,ð,ñ,ò,ó,ô,õ,ö,÷,ø,ù,ú,û,ü,ý,þ,ÿ---------- - - - - ------------------- -!-"-#-$-%-&-'-(-)-*-+-,---.-/-0-1-2-3-4-5-6-7-8-9-:-;-<-=->-?-@-A-B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z-[-\-]-^-_-`-a-b-c-d-e-f-g-h-i-j-k-l-m-n-o-p-q-r-s-t-u-v-w-x-y-z-{-|-}-~--€--‚-ƒ-„-…-†-‡-ˆ-‰-Š-‹-Œ--Ž---‘-’-“-”-•-–-—-˜-™-š-›-œ--ž-Ÿ- -¡-¢-£-¤-¥-¦-§-¨-©-ª-«-¬-­-®-¯-°-±-²-³-´-µ-¶-·-¸-¹-º-»-¼-½-¾-¿-À-Á-Â-Ã-Ä-Å-Æ-Ç-È-É-Ê-Ë-Ì-Í-Î-Ï-Ð-Ñ-Ò-Ó-Ô-Õ-Ö-×-Ø-Ù-Ú-Û-Ü-Ý-Þ-ß-à-á-â-ã-ä-å-æ-ç-è-é-ê-ë-ì-í-î-ï-ð-ñ-ò-ó-ô-õ-ö-÷-ø-ù-ú-û-ü-ý-þ-ÿ.......... . . . . ................... .!.".#.$.%.&.'.(.).*.+.,.-.../.0.1.2.3.4.5.6.7.8.9.:.;.<.=.>.?.@.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.[.\.].^._.`.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.{.|.}.~..€..‚.ƒ.„.….†.‡.ˆ.‰.Š.‹.Œ..Ž...‘.’.“.”.•.–.—.˜.™.š.›.œ..ž.Ÿ. .¡.¢.£.¤.¥.¦.§.¨.©.ª.«.¬.­.®.¯.°.±.².³.´.µ.¶.·.¸.¹.º.».¼.½.¾.¿.À.Á.Â.Ã.Ä.Å.Æ.Ç.È.É.Ê.Ë.Ì.Í.Î.Ï.Ð.Ñ.Ò.Ó.Ô.Õ.Ö.×.Ø.Ù.Ú.Û.Ü.Ý.Þ.ß.à.á.â.ã.ä.å.æ.ç.è.é.ê.ë.ì.í.î.ï.ð.ñ.ò.ó.ô.õ.ö.÷.ø.ù.ú.û.ü.ý.þ.ÿ////////// / / / / /////////////////// /!/"/#/$/%/&/'/(/)/*/+/,/-/.///0/1/2/3/4/5/6/7/8/9/:/;//?/@/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/[/\/]/^/_/`/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/{/|/}/~//€//‚/ƒ/„/…/†/‡/ˆ/‰/Š/‹/Œ//Ž///‘/’/“/”/•/–/—/˜/™/š/›/œ//ž/Ÿ/ /¡/¢/£/¤/¥/¦/§/¨/©/ª/«/¬/­/®/¯/°/±/²/³/´/µ/¶/·/¸/¹/º/»/¼/½/¾/¿/À/Á/Â/Ã/Ä/Å/Æ/Ç/È/É/Ê/Ë/Ì/Í/Î/Ï/Ð/Ñ/Ò/Ó/Ô/Õ/Ö/×/Ø/Ù/Ú/Û/Ü/Ý/Þ/ß/à/á/â/ã/ä/å/æ/ç/è/é/ê/ë/ì/í/î/ï/ð/ñ/ò/ó/ô/õ/ö/÷/ø/ù/ú/û/ü/ý/þ/ÿ0000000000 0 0 0 0 0000000000000000000 0!0"0#0$0%0&0'0(0)0*0+0,0-0.0/000102030405060708090:0;0<0=0>0?0@0A0B0C0D0E0F0G0H0I0J0K0L0M0N0O0P0Q0R0S0T0U0V0W0X0Y0Z0[0\0]0^0_0`0a0b0c0d0e0f0g0h0i0j0k0l0m0n0o0p0q0r0s0t0u0v0w0x0y0z0{0|0}0~00€00‚0ƒ0„0…0†0‡0ˆ0‰0Š0‹0Œ00Ž000‘0’0“0”0•0–0—0˜0™0š0›0œ00ž0Ÿ0 0¡0¢0£0¤0¥0¦0§0¨0©0ª0«0¬0­0®0¯0°0±0²0³0´0µ0¶0·0¸0¹0º0»0¼0½0¾0¿0À0Á0Â0Ã0Ä0Å0Æ0Ç0È0É0Ê0Ë0Ì0Í0Î0Ï0Ð0Ñ0Ò0Ó0Ô0Õ0Ö0×0Ø0Ù0Ú0Û0Ü0Ý0Þ0ß0à0á0â0ã0ä0å0æ0ç0è0é0ê0ë0ì0í0î0ï0ð0ñ0ò0ó0ô0õ0ö0÷0ø0ù0ú0û0ü0ý0þ0ÿ1111111111 1 1 1 1 1111111111111111111 1!1"1#1$1%1&1'1(1)1*1+1,1-1.1/101112131415161718191:1;1<1=1>1?1@1A1B1C1D1E1F1G1H1I1J1K1L1M1N1O1P1Q1R1S1T1U1V1W1X1Y1Z1[1\1]1^1_1`1a1b1c1d1e1f1g1h1i1j1k1l1m1n1o1p1q1r1s1t1u1v1w1x1y1z1{1|1}1~11€11‚1ƒ1„1…1†1‡1ˆ1‰1Š1‹1Œ11Ž111‘1’1“1”1•1–1—1˜1™1š1›1œ11ž1Ÿ1 1¡1¢1£1¤1¥1¦1§1¨1©1ª1«1¬1­1®1¯1°1±1²1³1´1µ1¶1·1¸1¹1º1»1¼1½1¾1¿1À1Á1Â1Ã1Ä1Å1Æ1Ç1È1É1Ê1Ë1Ì1Í1Î1Ï1Ð1Ñ1Ò1Ó1Ô1Õ1Ö1×1Ø1Ù1Ú1Û1Ü1Ý1Þ1ß1à1á1â1ã1ä1å1æ1ç1è1é1ê1ë1ì1í1î1ï1ð1ñ1ò1ó1ô1õ1ö1÷1ø1ù1ú1û1ü1ý1þ1ÿ2222222222 2 2 2 2 2222222222222222222 2!2"2#2$2%2&2'2(2)2*2+2,2-2.2/202122232425262728292:2;2<2=2>2?2@2A2B2C2D2E2F2G2H2I2J2K2L2M2N2O2P2Q2R2S2T2U2V2W2X2Y2Z2[2\2]2^2_2`2a2b2c2d2e2f2g2h2i2j2k2l2m2n2o2p2q2r2s2t2u2v2w2x2y2z2{2|2}2~22€22‚2ƒ2„2…2†2‡2ˆ2‰2Š2‹2Œ22Ž222‘2’2“2”2•2–2—2˜2™2š2›2œ22ž2Ÿ2 2¡2¢2£2¤2¥2¦2§2¨2©2ª2«2¬2­2®2¯2°2±2²2³2´2µ2¶2·2¸2¹2º2»2¼2½2¾2¿2À2Á2Â2Ã2Ä2Å2Æ2Ç2È2É2Ê2Ë2Ì2Í2Î2Ï2Ð2Ñ2Ò2Ó2Ô2Õ2Ö2×2Ø2Ù2Ú2Û2Ü2Ý2Þ2ß2à2á2â2ã2ä2å2æ2ç2è2é2ê2ë2ì2í2î2ï2ð2ñ2ò2ó2ô2õ2ö2÷2ø2ù2ú2û2ü2ý2þ2ÿ3333333333 3 3 3 3 3333333333333333333 3!3"3#3$3%3&3'3(3)3*3+3,3-3.3/303132333435363738393:3;3<3=3>3?3@3A3B3C3D3E3F3G3H3I3J3K3L3M3N3O3P3Q3R3S3T3U3V3W3X3Y3Z3[3\3]3^3_3`3a3b3c3d3e3f3g3h3i3j3k3l3m3n3o3p3q3r3s3t3u3v3w3x3y3z3{3|3}3~33€33‚3ƒ3„3…3†3‡3ˆ3‰3Š3‹3Œ33Ž333‘3’3“3”3•3–3—3˜3™3š3›3œ33ž3Ÿ3 3¡3¢3£3¤3¥3¦3§3¨3©3ª3«3¬3­3®3¯3°3±3²3³3´3µ3¶3·3¸3¹3º3»3¼3½3¾3¿3À3Á3Â3Ã3Ä3Å3Æ3Ç3È3É3Ê3Ë3Ì3Í3Î3Ï3Ð3Ñ3Ò3Ó3Ô3Õ3Ö3×3Ø3Ù3Ú3Û3Ü3Ý3Þ3ß3à3á3â3ã3ä3å3æ3ç3è3é3ê3ë3ì3í3î3ï3ð3ñ3ò3ó3ô3õ3ö3÷3ø3ù3ú3û3ü3ý3þ3ÿ4444444444 4 4 4 4 4444444444444444444 4!4"4#4$4%4&4'4(4)4*4+4,4-4.4/404142434445464748494:4;4<4=4>4?4@4A4B4C4D4E4F4G4H4I4J4K4L4M4N4O4P4Q4R4S4T4U4V4W4X4Y4Z4[4\4]4^4_4`4a4b4c4d4e4f4g4h4i4j4k4l4m4n4o4p4q4r4s4t4u4v4w4x4y4z4{4|4}4~44€44‚4ƒ4„4…4†4‡4ˆ4‰4Š4‹4Œ44Ž444‘4’4“4”4•4–4—4˜4™4š4›4œ44ž4Ÿ4 4¡4¢4£4¤4¥4¦4§4¨4©4ª4«4¬4­4®4¯4°4±4²4³4´4µ4¶4·4¸4¹4º4»4¼4½4¾4¿4À4Á4Â4Ã4Ä4Å4Æ4Ç4È4É4Ê4Ë4Ì4Í4Î4Ï4Ð4Ñ4Ò4Ó4Ô4Õ4Ö4×4Ø4Ù4Ú4Û4Ü4Ý4Þ4ß4à4á4â4ã4ä4å4æ4ç4è4é4ê4ë4ì4í4î4ï4ð4ñ4ò4ó4ô4õ4ö4÷4ø4ù4ú4û4ü4ý4þ4ÿ5555555555 5 5 5 5 5555555555555555555 5!5"5#5$5%5&5'5(5)5*5+5,5-5.5/505152535455565758595:5;5<5=5>5?5@5A5B5C5D5E5F5G5H5I5J5K5L5M5N5O5P5Q5R5S5T5U5V5W5X5Y5Z5[5\5]5^5_5`5a5b5c5d5e5f5g5h5i5j5k5l5m5n5o5p5q5r5s5t5u5v5w5x5y5z5{5|5}5~55€55‚5ƒ5„5…5†5‡5ˆ5‰5Š5‹5Œ55Ž555‘5’5“5”5•5–5—5˜5™5š5›5œ55ž5Ÿ5 5¡5¢5£5¤5¥5¦5§5¨5©5ª5«5¬5­5®5¯5°5±5²5³5´5µ5¶5·5¸5¹5º5»5¼5½5¾5¿5À5Á5Â5Ã5Ä5Å5Æ5Ç5È5É5Ê5Ë5Ì5Í5Î5Ï5Ð5Ñ5Ò5Ó5Ô5Õ5Ö5×5Ø5Ù5Ú5Û5Ü5Ý5Þ5ß5à5á5â5ã5ä5å5æ5ç5è5é5ê5ë5ì5í5î5ï5ð5ñ5ò5ó5ô5õ5ö5÷5ø5ù5ú5û5ü5ý5þ5ÿ6666666666 6 6 6 6 6666666666666666666 6!6"6#6$6%6&6'6(6)6*6+6,6-6.6/606162636465666768696:6;6<6=6>6?6@6A6B6C6D6E6F6G6H6I6J6K6L6M6N6O6P6Q6R6S6T6U6V6W6X6Y6Z6[6\6]6^6_6`6a6b6c6d6e6f6g6h6i6j6k6l6m6n6o6p6q6r6s6t6u6v6w6x6y6z6{6|6}6~66€66‚6ƒ6„6…6†6‡6ˆ6‰6Š6‹6Œ66Ž666‘6’6“6”6•6–6—6˜6™6š6›6œ66ž6Ÿ6 6¡6¢6£6¤6¥6¦6§6¨6©6ª6«6¬6­6®6¯6°6±6²6³6´6µ6¶6·6¸6¹6º6»6¼6½6¾6¿6À6Á6Â6Ã6Ä6Å6Æ6Ç6È6É6Ê6Ë6Ì6Í6Î6Ï6Ð6Ñ6Ò6Ó6Ô6Õ6Ö6×6Ø6Ù6Ú6Û6Ü6Ý6Þ6ß6à6á6â6ã6ä6å6æ6ç6è6é6ê6ë6ì6í6î6ï6ð6ñ6ò6ó6ô6õ6ö6÷6ø6ù6ú6û6ü6ý6þ6ÿ7777777777 7 7 7 7 7777777777777777777 7!7"7#7$7%7&7'7(7)7*7+7,7-7.7/707172737475767778797:7;7<7=7>7?7@7A7B7C7D7E7F7G7H7I7J7K7L7M7N7O7P7Q7R7S7T7U7V7W7X7Y7Z7[7\7]7^7_7`7a7b7c7d7e7f7g7h7i7j7k7l7m7n7o7p7q7r7s7t7u7v7w7x7y7z7{7|7}7~77€77‚7ƒ7„7…7†7‡7ˆ7‰7Š7‹7Œ77Ž777‘7’7“7”7•7–7—7˜7™7š7›7œ77ž7Ÿ7 7¡7¢7£7¤7¥7¦7§7¨7©7ª7«7¬7­7®7¯7°7±7²7³7´7µ7¶7·7¸7¹7º7»7¼7½7¾7¿7À7Á7Â7Ã7Ä7Å7Æ7Ç7È7É7Ê7Ë7Ì7Í7Î7Ï7Ð7Ñ7Ò7Ó7Ô7Õ7Ö7×7Ø7Ù7Ú7Û7Ü7Ý7Þ7ß7à7á7â7ã7ä7å7æ7ç7è7é7ê7ë7ì7í7î7ï7ð7ñ7ò7ó7ô7õ7ö7÷7ø7ù7ú7û7ü7ý7þ7ÿ8888888888 8 8 8 8 8888888888888888888 8!8"8#8$8%8&8'8(8)8*8+8,8-8.8/808182838485868788898:8;8<8=8>8?8@8A8B8C8D8E8F8G8H8I8J8K8L8M8N8O8P8Q8R8S8T8U8V8W8X8Y8Z8[8\8]8^8_8`8a8b8c8d8e8f8g8h8i8j8k8l8m8n8o8p8q8r8s8t8u8v8w8x8y8z8{8|8}8~88€88‚8ƒ8„8…8†8‡8ˆ8‰8Š8‹8Œ88Ž888‘8’8“8”8•8–8—8˜8™8š8›8œ88ž8Ÿ8 8¡8¢8£8¤8¥8¦8§8¨8©8ª8«8¬8­8®8¯8°8±8²8³8´8µ8¶8·8¸8¹8º8»8¼8½8¾8¿8À8Á8Â8Ã8Ä8Å8Æ8Ç8È8É8Ê8Ë8Ì8Í8Î8Ï8Ð8Ñ8Ò8Ó8Ô8Õ8Ö8×8Ø8Ù8Ú8Û8Ü8Ý8Þ8ß8à8á8â8ã8ä8å8æ8ç8è8é8ê8ë8ì8í8î8ï8ð8ñ8ò8ó8ô8õ8ö8÷8ø8ù8ú8û8ü8ý8þ8ÿ9999999999 9 9 9 9 9999999999999999999 9!9"9#9$9%9&9'9(9)9*9+9,9-9.9/909192939495969798999:9;9<9=9>9?9@9A9B9C9D9E9F9G9H9I9J9K9L9M9N9O9P9Q9R9S9T9U9V9W9X9Y9Z9[9\9]9^9_9`9a9b9c9d9e9f9g9h9i9j9k9l9m9n9o9p9q9r9s9t9u9v9w9x9y9z9{9|9}9~99€99‚9ƒ9„9…9†9‡9ˆ9‰9Š9‹9Œ99Ž999‘9’9“9”9•9–9—9˜9™9š9›'&çæåäãâáàßÞÝÜÛÚÙØ×ÖÕÔÓÒÑÐÏÎÍÌËÊÉÈÇÆÅÄÃÂÁÀ¿¾½¼»º¹¸·¶µ´³²±°¯®­¬«ª©¨§¦¥¤£¢¡ Ÿžœ›š™˜—–•”“’‘ŽŒ‹Š‰ˆ‡†…„ƒ‚€~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!      ÿþýüûúùø÷öõôóòñðïîíìëêéèçæåäãâáàßÞÝÜÛÚÙØ×ÖÕÔÓÒÑÐÏÎÍÌËÊÉÈÇÆÅÄÃÂÁÀ¿¾½¼»º¹¸·¶µ´³²±°¯®­¬«ª©¨§¦¥¤£¢¡ Ÿžœ›š™˜—–•”“’‘ŽŒ‹Š‰ˆ‡†…„ƒ‚€~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!      ÿþýüûúùø÷öõôóòñðïîíìëêéèçæåäãâáàßÞÝÜÛÚÙØ×ÖÕÔÓÒÑÐÏÎÍÌËÊÉÈÇÆÅÄÃÂÁÀ¿¾½¼»º¹¸·¶µ´³²±°¯®­¬«ª©¨§¦¥¤£¢¡ Ÿžœ›š™˜—–•”“’‘ŽŒ‹Š‰ˆ‡†…„ƒ‚€~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!      ÿþýüûúùø÷öõôóòñðïîíìëêéèçæåäãâáàßÞÝÜÛÚÙØ×ÖÕÔÓÒÑÐÏÎÍÌËÊÉÈÇÆÅÄÃÂÁÀ¿¾½¼»º¹¸·¶µ´³²±°¯®­¬«ª©¨§¦¥¤£¢¡ Ÿžœ›š™˜—–•”“’‘ŽŒ‹Š‰ˆ‡†…„ƒ‚€~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!      ÿþýüûúùø÷öõôóòñðïîíìëêéèçæåäãâáàßÞÝÜÛÚÙØ×ÖÕÔÓÒÑÐÏÎÍÌËÊÉÈÇÆÅÄÃÂÁÀ¿¾½¼»º¹¸·¶µ´³²±°¯®­¬«ª©¨§¦¥¤£¢¡ Ÿžœ›š™˜—–•”“’‘ŽŒ‹Š‰ˆ‡†…„ƒ‚€~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!      ÿþýüûúùø÷öõôóòñðïîíìëêéèçæåäãâáàßÞÝÜÛÚÙØ×ÖÕÔÓÒÑÐÏÎÍÌËÊÉÈÇÆÅÄÃÂÁÀ¿¾½¼»º¹¸·¶µ´³²±°¯®­¬«ª©¨§¦¥¤£¢¡ Ÿžœ›š™˜—–•”“’‘ŽŒ‹Š‰ˆ‡†…„ƒ‚€~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=                       ÿþýüûúùø÷öõôóòñðïîíìëêéèçæåäãâáàßÞÝÜÛÚÙØ×ÖÕÔÓÒÑÐÏÎÍÌËÊÉÈÇÆÅÄÃÂÁÀ¿¾½¼»º¹¸·¶µ´³²±°¯®­¬«ª©¨§¦¥¤£¢¡ Ÿžœ›š™˜—–•”“’‘ŽŒ‹Š‰ˆ‡†…„ƒ‚€~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!      ÿþýüûúùø÷öõôóòñðïîíìëêéèçæåäãâáàßÞÝÜÛÚÙØ×ÖÕÔÓÒÑÐÏÎÍÌËÊÉÈÇÆÅÄÃÂÁÀ¿¾½¼»º¹¸·¶µ´³²±°¯®­¬«ª©¨§¦¥¤£¢¡ Ÿžœ›š™˜—–•”“’‘ŽŒ‹Š‰ˆ‡†…„ƒ‚€~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!      ÿþýüûúùø÷öõôóòñðïîíìëêéèçæåäãâáàßÞÝÜÛÚÙØ×ÖÕÔÓÒÑÐÏÎÍÌËÊÉÈÇÆÅÄÃÂÁÀ¿¾½¼»º¹¸·¶µ´³²±°¯®­¬«ª©¨§¦¥¤£¢¡ Ÿžœ›š™˜—–•”“’‘ŽŒ‹Š‰ˆ‡†…„ƒ‚€~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!      ÿþýüûúùø÷öõôóòñðïîíìëêôóòñðïîíìëêéèçæåäãâáàßÞÝÜÛÚÙØ×ÖÕÔÓÒÑÐÏÎÍÌËÊÉÈÇÆÅÄÃÂÁÀ¿¾½¼»º¹¸·¶µ´³²±°¯®­¬«ª©¨§¦¥¤£¢¡ Ÿžœ›š™˜—–•”“’‘ŽŒ‹Š‰ˆ‡†…„ƒ‚€~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!      ÿþýüûúùø÷öõôóòñðïîíìëêéèçæåäãâáàßÞÝÜÛÚÙØ×ÖÕÔÓÒÑÐÏÎÍÌËÊÉÈÇÆÅÄÃÂÁÀ¿¾½üûúùø÷öõôóòñðïîíìëêéèçæåäãâáàßÞÝÜÛÚÙØ×ÖÕÔÓÒÑÐÏÎÍÌËÊÉÈÇÆÅÄÃÂÁÀ¿¾½¼»º¹¸·¶µ´³²±°¯®­¬«ª©¨§¦¥¤£¢¡ Ÿžœ›š™˜—–•”“’‘ŽŒ‹Š‰ˆ<;:9876543210/.-,+*)('&%$#"! ôóòñðïîíìëêéèçæåäãâ×ÖÕÔÓÒÌËÊÇÆÈÉÍÎÏÐÑØÙÚÛÜÝÞßàáõö÷øùúûüýþÿ     =>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼õö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèé         ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  €  ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ  Ž   ‘ ’ “ ” • – — ˜ ™ š › œ  ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á  à Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ                                 ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  €  ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ  Ž   ‘ ’ “ ” • – — ˜ ™ š › œ  ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á  à Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ                                 ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  €  ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ  Ž   ‘ ’ “ ” • – — ˜ ™ š › œ  ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á  à Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ                                 ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  €  ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ  Ž   ‘ ’ “ ” • – — ˜ ™ š › œ  ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á  à Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ                                 ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  €  ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ  Ž   ‘ ’ “ ” • – — ˜ ™ š › œ  ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á  à Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ       !"#$%&'()*+,-./0123456789:;< !     pkjihgfed;:9876520/-,+)$%'lmno‡ø˜MÉOÙ¥ÉPÙ¦ÉQ‡ý‡þ˜S¸þˆ¨ªˆ¨«ˆ¹¨¬ Ù¬¹¹ÉZ¨°¨±Ù²¹¹ ˜`Ùµ¨¸Ù¹Éd˜e¹˜f¨¼˜h¨½¹¹¨¿ÙÀ˜m˜nÙÊÉw¨Ï¨Ð¨Ô¨Õɘƒ¹/ˆ1¹0ˆ2˜‡Ùܹ3¹4¨à¹8¹:˜¹;¹<É’É“¨éÉ”˜–É–ˆD¹DÉš¹EÙðÉ›¹FÉœˆH¹G¨ò¹HÉžˆJ¹IÉŸ¹JÉ ˜¤¨ùɦˆUˆX˜­©ˆ[˜°©˜±©Úˆ^˜³© É´© © © É·© ɹˆeɺˆfÉ»©ɼÚ©˜¿Ú©˜Å˜Æ©˜È©˜É©Éɘʩ Ú"©#ˆzˆ©)ÉÔ¹‚¹ƒ¹„˜Úˆˆ¹‡ˆ‰¹ˆˆŠ¹‰ˆ‹Ú5ˆÚ9Ú:˜æÚ;˜ç©<Ú<ˆ“©=É蹓˜é¹”¹•É숙˜ñ¹©H©Iˆ ©Jˆ¡©Kˆ¢©LÚMˆ¤¹£ÚOÉúÉý¹¨˜þÚS¹¬¹®¹·ˆ¹¹¸ÚgÊ©hÚhÚiʈÀ¹ÀˆÂˆÃ¹Ã¹Ä™¹Ç¹È¹É©tˆËÚuÊ ÚvˆÍÚy™'¹Ò™(¹Ó™)Ê)™+©ƒÚ…¹ÛÊ2Ê3Ê4ˆà™5Ê5ˆáÊ6¹áÊ7¹â™8©Ê:©ÚÊ;¹æ™<Ê<¹è©“¹ê™@Ê@ˆì¹ì™D©™™E¹ñ©¹õÊKÊMÊNÊOÊP¹ýÊS¹þÊTÊUÊV©¬ÊWÚ­ÊXººÚ¯™[Ê[™\©±™]©²º™_Ê_‰ º Ê`‰ Ú·Ú¸º©¹Êd‰ºÊgºÊh©¾ºÊkºÊnºÚĉÚÅ©ÆÊq©ÇÊs‰Êuº ÊxÊy™}©Ò‰)º)ʺ*Ê€‰,º1º2ÚÝʈº4™‰9©æ™’‰>º>™•º@‰CºB™˜©í‰EÊš©òÚòÊžºI©õºLºNºOÚûºQ©üºS©ÿÛºV™­Ê®ʯ™°º[ʱ‰]Ê´™µ‰aʶºb™¸‰d™º™»Û‰gÛ™½‰iºi‰kª™ÁºlºoÊÆºqºr‰uºvª"Êͪ#™Ïª$ª%‰|ª&ÊѺ|Û'º}ª(º~ÊÔÛ*ÊÕÛ+‰„Û.Û1ÊÜÛ2ÊÝ™ÞÛ4™àÊ຋Êä™åÛ:™æÊ扒™ç‰•™ëÊ뉗‰˜™î‰šÊ‰¡º¢™øªMÛO™û‰§º§™ýªSº©ÛTÊÿº«šÛVº­ÛYº°º²š‰´‰¶š Û`‰·Ûa‰¹º¹ÛdªeÛešš‰¿šªi‰Àº¿šÛjššºÄšËªs‰ÊÛuºËºÌª{‰ÑÛ{ª}ºÔš*ªš+š,ªÛË,º×ª‚š.ºÙš/ª„Û„ºÚª…ª‡ºÝš3ªˆË3š4ªŠª‹ªŒºâºã‰åۺ窒ºéš?Û”Ë@ËAšBºîËDºïÛšËEºðÛ›ºñÛËH‰÷ºøª£ª¤šPª¦Û¦ËQª§‰þ‰ÿËU»»Û­ª°Š»ª³Û³šaª¶ª·Û·ª¸»»Ëo»»ŠËs»ÛÉ»švËvËw»"»#ÛÏ»%»&»'Š)Ë~»)Š*ÛÔ»*»+Š,Û׊.».Š/ÛÙ»/ÛÚ»1Š2šˆÛÝš‰ˉŠ5ÛàÛá»9Š:Ëˑ˓»>Ûëš—ªíËšÛò»HÛóË ÛöÛ÷Ûøˤ»QŠS»TË«»VË­»XÜË®ŠZ˰Š\˱»\Š]»]š³š´Š`»`« Šb»b«Šg˽»j»m»n»oŠp»pܚǫ»r«"ŠyšÐ«%šÑ«&Š|»}šÖÜ.Ü/ІÜ2«4Ëàšá»ŒËãÜ9ËäË廫;Ëæ«<Ëç»’«=šé«?»—«B»˜šî«CËî«DŠššñËò«H»žŠŸËôŠ »¡š÷«L»¢«MÜM»£«N»¤šú«Ošû«PËû»¦»§ЍŠ©«TŠª«UÌ«WÌ›Н»¯аÌ›«[»±вÌÜ]ÌÌ Ü_Ì Üa› Ì «cŠºÌÌ«gÌ«hŠÁŠÂÜlÌŠÄÜnŠÅ̻ŊÆÌ̻ȫsÌ› ›"«w«xÌ#«yÌ$›%»ÐŠÑÜ{Ì&«|Ì'»ÒÌ)«ŠÕ›+«€ŠÖ›,«»×›-ŠØŠÙÌ.Ì/›0Ì0Ì1›3«ˆÌ4›5Ì5›6Ì6›9›:Ü»å›;ÜÌ<›=»è›>Šé»é»êÜ–»ìÜ—«˜›D«™Ü™›E«šÜš»ð»ñŠòÜœÌG«ŸÜŸ›K« «¡›M«¢«¤«¥«¦Ü«ܬ«¯ܰÌ\ܳÌ^¼ Ì_›`›aÌb›cܸÌc«¹‹¼›g‹Ìg«¾Ìi‹›kÜÁ¼«ÂÌm›o›r‹ÜÉ«ËÜË›x›y›zÜϼ%›{›|›}ÜÒ¼(›~›ÜÔ›€ÜÕ›ÜÖÜ×›ƒÜØÜÚ›†¼2¼3¼5¼6¼7¼9¼:››‘‹=Ì’‹>¼>›—¼C›™‹D«ï‹E¼E¼FÜñ¼G«ò«ó‹I«ôÌ¡¼LÌ¢«øÌ£¼N̤«ú›¦¼Q̧›¨¼R̨Ì©¼T̪›«¼U¬¼W¼Y¬¬›²¬Ý ¬ ›¹›À›Á›Â¼l›ÇÌȼu›Ì‹w¼z¼{ÌÑÝ'ÌÒ¼}Ý(¼~ÌÔ¼›×‹ƒÝ.‹…¼„¬0¼…¼†¼‡‹Ý7‹ŽÝ:Ìç¬=¬@Ìë¼–ÝBÝC¼œÝHÌóÝJÝL¬P¼¥›ü‹§¼¦¬R¼§¼¨¬T¼©œÍÝWÍÝ[œÍœ¬]Í‹´œ ¬_Í Í œ ¬bÝc¬d‹ºÝdͬeÝe¬gÝgÍ‹¿‹À¼Á¼ÂÝmÝoÍͼƼÇͼȼɼÊÍ ¼ËÍ"¼Íœ$¼ÎÝyÍ$Ýz¬{Ý{Í&Ý|¬~Í)Í*œ+¼×Ý„Í/œ0‹Û¼ÚÍ0œ1Í1‹ÞÍ3‹ßÍ4œ5‹àÍ5œ6‹á‹â‹ã¼âÍ8Í9Í:¼æÍ>‹ê‹ë¼îݙݜ‹óÝžœJÝ ‹÷Ý¡‹ùݤÍO¬¦‹üœR¬§¬¨ݨÍSœT¬©Ý©œU¬ªÍUŒÍV¬¬Œ¬¯½¬±ݱݳ¬´Í_Œ Ía¬·½ ½ݺÍeÍgÍh¬¾ݾÍiŒÍnŒ½¬ÅÍpÍqÍr¬ÉÍuÍv¬ÍÍx¬ÎÍyÍzÝÐÝѬԬլ×Í‚œƒÍ„ÝÞ½4Í‹½6Ýáͬã½8ÍŽŒ:½9ͽ:Í͕͖͙͑͗͛͘½FÍœ½GÍÍŸ¬öÍ¡½LŒOÝùͤ½OÝúÍ¥Ýûͧ¬ýͨ¬þ½S¬ÿͪ½UÍ«ŒWͬ½Wœ®½X½Yœ°½ZͰͳÍ´͵Ͷ͸½dœÁœÂÞÍÂŒo½nŒpŒs½rœÉ­ÍÊœÌÞ$ÍÏŒ~œÔŒ­*Œ€Þ*­+Œ‚½‚½ƒŒ…ÍÚ½…½†­2ÍݽˆÍὌ­8½½ŽŒœæ­;½‘ÍçÍ錕œìŒ—Œ™Œšœð­FÍñ­HŒŸ½žŒ Œ¡Œ¢½¢½¤Íú­P½¥½¦½§Íý­UέX­Y½®Î­\­]½²Þ]­_½´­`Î ­aÎ ÎέkÎÎÞmÞnÎÎÎέt ­uÞu­vÞv­w#Î$Î%Þ|Î'­})ŒÕÎ*,Œ×­‚Î-Î.Î/Î1Î2Î4ÞŠÎ5­‹­ŒŒãÎ8Î9ŒåÎ:Î;Î<­’Î>­”Î?­–Œì½ë­—½îÞšF½ñ½ó½ôÞ¡Þ¢½ø­¤­¥½þ­ª­«¾XÎX¾Þ°­±¾ ÞµÞ¶¾ Þ¸Þºi­¾¾Þ¿ÞÁm¾­Ä¾ÞĭžÞÅÞÆÎqsÞÈÎt­ÊÎw­Î­ÏÞϭЭÑÞÑÞÒÎ}¾(ÞÓÞÕ΀,¾,΂­Ø¾-/¾.ÞÙ¾/ÞÚ¾1¾3ÞÞ5Þß­à79:?ÞêΕ–Þë—BÞì­í¾B­î¾CÞî­ï¾DÞï¾EÞðG¾FΜÞò­ó¾IK¾J­ö¢£¾M¤¥­úÞúQÞû§R¨SÞýª­ÿ®­®®®®®[®®ßε¾acß ¾c®¾dß¾eßiß¾j®¾k¾nßr¾sË® w¾vxÎzÐ{ÎÐѾ{}ß(ß)Õ€ß+ß,Î×ƒÎØÎÛ®2¾‡ÎÝß3ß4®6¾‹®7ã®8ŽÎæ”Îé®?¾”ÎêìÎìí¾˜®Eñ®FÎñ®G®IÎôßJÎõö¾ ßKÎö¾¢Îø¤¥ßP¾§ßR«¾ªßUßV­ßYÏ®[±¾°ß[®\¾±®]®^´ž ß^ž ß_ž ß`¸¾·ßbÏ ¾¸ÏÏžÏßfßg®hßi®j¾¿ßj®kϾÁßl¾ÂÄ¾ÃÆ¾ÅǾÇËßv¾Îž$Ï$®z¾Ïß{®|¾Ñ¾Ò¾Ó¾Ô¾Öž,¾×ž.Ï2Ï3¾âž<®’¾ížCߘß™žEßš®›ÏFòßœóžIßžžJžKß ®¢®£®¤ߦß§žUÏVžW߬®­¿žYŽ®°ž\¿ž]ß²ß³Ž Ï_®µßµ®¶Ž ža¿ ¿ÏeŽžgŽß¾®¿Ž¿žkŽ®ÃÏn¿žo®ÅŽžpÏp¿߯ŽßÇÏrßÈ¿ßÊÏu¿ ßËÏvŽ"¿!ßÌÏwŽ$ßÎÏyŽ%¿$žzßϮЎ&ž{ßÐŽ'¿&ßÑ¿'¿)ßÔßÖÏž‚ß׿-ߨßÙ®ÚŽ0¿0φ¿2Ž4Ž5Ž6ž‹¿6Ï®äŽ<Ž=Ž>Ï“®êϕϖϘ®îÏšŽFŽGßñ®ò®õ¿JŽN¿MßùϤ¿O¿Qž§®ý¿UÏ«ŽX¿WÏ­¯à¯¿Y¯à¯Ž\à'¯Ž^¿]àŽ_¿`¯ ¿a¿c¿d'¯¿fϾ¿iààààààà'%¿rààÏÉÏʯ '+à%¯*à0¯1žÜ¿ˆ¿Š¯7žä¿¿¯<Ž’¿‘¿’Ž”¿”'H¿•¯B¿—¯CÏî'L'M¯FŽœÏò'PŽŸ¿¡¯M¯N¿£žùަàPÏû'Y¿¦'Z¯SŽ©¿¨žþŽª¿ªŸŸÐŽ­Ð¯Yޝ'b¯Z'c¯[ޱ'dà]Ð޵¯`¯a¿¶àaޏ޹Ð'm¯eŽ»Ð¯fÐ'oàiŽÀ¿¿Ð's¯k¿Â¯n¿ÃÐ'wŸ'x¿Å¯q¿Æ¿ÇÐàsЯtŽÊŽË'ŽÍ'‚'ƒ¿Ð¿Ñ¿Ò¿ÓÐ+'‹ŽÙŽÚ¿ÙŽÜŸ1Ÿ2ŽÞŽàŽáÐ6¯Ž¿ãŽåŽæ¯“¯”¿ëÐAà—¿íà›ÐFŸGÐGÐH¯ ŸL࡯¢ÐMŽù'¬ŸOÐRÀà­À¯±ÀÐ]Ÿ^'¼Ð_'½ ÐaŸbŸd¯º¯»'ÄÐg¯½Ðh¯¾'ǯ¿ÐjÀàÁÐl'ÊÀ¯ÃÀÐo¯ÅàÆŸrÐs Ÿu¯ËŸv'ÕŸ{Ð{Ð|'Ú¯Ò¯Ô*¯Õ'ÞЂ¯Ù¯Ú¯Þ¯ß7À6'ëÀ9¯åÀ:'ï='òAÀ@Ÿ–'ôŸ—ÀB'öÀCŸ™¯ïКŸ›Л¯ñ'ú¯òK(((Ц¯üЧ(¯ýŸ©Щ¯ÿ°Ы°Ю°°À[À\Ÿ²в°À^Ÿ´° À`Ÿ·° ÀcйÀd°°(ÀlÀn(#°ÀpÐÆ($ÐÇÀrŸÈÐÉ('ÐËw(*Ðΰ$ŸÐá%ÐÐ(2(3á+‚(5°-á-ÐØ(6á.°/À‡Ÿß(=ŸäÐä‘°<’á<á?–á@áB(LÐïÐñáG(QŸôáIáJ(S(V¥¦(YŸü(Z([°S(\(]Ñ(_ ÑѠѰ](e  Ñ á_Ñ (hÑ °a  Ñ À¸À¹ (lÀºÑÀ»(oÑÑÀÂám°n(wÀÅÉÊ(|Ñáu(~°w(°xΠ#(€áy(‚°{á} )(†á~ÕÖ(ˆ°‚ذƒ(‹°…Û°‡ÀÝÑ3(‘ 5áŠ(“(” 8°Ž :(—Ñ;ÀæÀç =°“Àè(œÑ?Ñ@(ž°— BÀí( ï(¡áš(£ó°žÑL(ª(«ú(¬û Pü(®þ°©ÿ(±á«°¬á¬°­(µÁá¯Á(¼Ñ_(½Á °»Á(Äá¼á½á¾áÃ(̰ưÇÑrÁ(ÑáÊáÌáÍáÎÑyáѰ×0(âáÚ(ã234(çáß6áàыь9ÑŽ°å;(íѰæ(îÁ<(ïÑ“°é(ñ°ê@°ì(ôÑ—ј(÷(øÁFÑœ°ò(ýLÑ¡°÷M(ÿÑ£ѤÑ¥°ûѦáü)áþVWÁV) Ѭ±X) Ñ­Y) Ñ®) Ѱ±Á\Ѳ±Á^)± ѵÁ`Áaâ Ñ·ѸÁc ¹âÁd º)ÁeÑ»Ѽ±Ág ½ѽâ±ÁikÁjÑÀl ÁÑÁÁlÁnâqÁp)#Áq)$âÁtv)(Áv)*±#Áx)+z),Áz)-ÑÐ})/ÑÒ)1±*ÁÁ€â+ÑÙ±/Á„)7â/±0Á…)8)9â1ÑÜâ4Ñß±5â5ÑàÁ‹Ñá ââ7ÑâÑã±9â9Ñä±: åâ:Ñå’“”—âA)JÑí™)K)MÁ›)PŸÁž ô)RÑõÁ âKâLÁ¢âM±PÑû)Y¨Á§)ZªÑÿ«)]±VâV®¡¡±[Á²Ò±_)h±a·Á¶âa±b±cÁ¸±dºâd±e½¾)pÒÃ)uÅ)wÒ±pÁÅ)xÒ±zÁÐÒ&Ò'ÁÓÕÁÔÁÖÁס-)ŠÙÁØÒ.ÁÙÁÚÁÛÒ2Þ±‰)‘±ŠÒ6±Œ)”Ò8⎱¡:æÁå¡;Ò;çÁæâ‘Ò<èÁ籓)›â“±•â–â—ÒCÁî±›Áñâœ)¦öÒKÒM±£Áù)¬ÒOÒT)²‘)³‘)´ÒX±®)¶Â)¹â± )¾)¿Òb‘±¹±º‘Â)ÂÂ)ÅÒhÂÒj)ÉâÃÒn±ÄâıÆâÉ¡uÂ!±Í‘#¡x)ÕÒxâбÑÂ'Ò}Â)Â*)ÝÒ‘-¡‚â×Â-Â.¡†±ÜâÝâÞ±ß¡Š¡Œ¡‘9Â8¡Ž‘<‘=Â<Ò’âé‘@±íâí¡™âïÂE¡›âò¡ž‘J¡Ÿâôâõ±ö)þâö¡£âø‘O±úâûâüâý±þ¡©âþÒ©âÿ²*Ò«²ÂXÂZãÒ±Â^¡´*² Âb¡º*²²¡¾**ãÂl¡Â²* ¡Ä*!²*"²*#ã²*$²‘s‘tÒɲ*'² ²!Âvã!²"ÂwÒͲ#²$²%Âz²&²(ã(Â~ã)²*‘€Â¡Õ²+¡×¡Ø*5²/²0ã1²2ˆ¡Þ²3²4‘‹Š²5Òà²6Œ²;Òæ*D²<¡è²=ã=²?ã@‘—²A‘˜²BãB‘™˜²CãCãF‘‘žÒôÒõ‘¡ãKÒöãL*WãO²PÒü§ãSÒþãV¢ãW*`ãX*a‘°°‘²²\‘´*fã^Ó ²_¢ ²`¢ ²a²bÓ ‘¹²cÓ‘ºãd²eãeÓ‘¼ãfÓ‘½½ãhãjÓãkãlãm*wãoÂÆÓÓÂÉ*|ÓÂÊÓ Ó!ÂÍ¢#ãzã|ã}Ó*ã€ã‚ãƒÂÙ¢2ã‡ãˆã‰²‹²ŒÂâÓ;Ó<Ó>Ó?Âê*Âëã™ÓDÂïÓI¢JÓJ¢M‘ù‘ú¢P²¨¢VÃÃÃ*·ã°ÃÃÃà ¢_à ¢`*½¢cÃÃÃãÀ¢mÃÃÃÃÃ"Ã%²ÑÃ(Ã*Ã+Ã,Ã.²ÚÓ‡*åÃ4²áÃ7*ê²ãÃ9²ä’<*îãæ’=Ã<’>ãèÓ“*ñ’A’B*ô’E’FÃEÃF²ñ’H²ò’I²óÃJ¢ ãöÓ¡ÃLã÷ãø’O²ù²ú²û’R¢§ãü¢¨²þãþãÿ’VÃU¢«+äÓ«¢¬ä+ Ó­ÃYÓ¯äÓ°äÓ²’`Ó¶¢¸’d’eÃf’i¢¾³Ó¿Ãjä’l¢ÁÓÁÃm’oÃo’qÓÆ¢É’vÃu³ ÓË+)³!Ãw+*Ã{+.ä&Ã|ä'Ã~³)Ãä*À¢ÖÓÖ³,Ó×ÂÓÙÓÚ’†³0ä0ÓÛä1ÓÜ’ˆÓÝ’‰¢Þ’ŠÉ’‹Êä5’Œ¢â’ŽÃŽ’’³<ÓçÃ’Óä>Ô’–ä@سC’šÙ’œ³FóH¢ô’¡³LäL³MäMãäNÓú’¦Ã¥³P³Q³R¢þäSÓþÓÿ³U’­£’®í’°ï’±³[’²ÔóÔ ô³_+h³`ä`Ô ’·äaÔ ’¸³b³cùÔú³eÔüäg+qÔ³kÔÔÃãÔäoäpÔär’ÉÔäuäwÔ"äxäyäzä{+…Ô(³~Ô)+‡³€Ô+䃒ÜÔ2Ô3Ãߣ5+“’âää‘Ô<ä’ä“Ô>³”ä•Ô@£AÔA’ïÔD’ñ£F£GäœÔGÃò³Ãó£IäžÔI£JäŸÔJä £LÔMÃøÔNÃù³¤ÔO³§£VÄ䬣Xä®ÔYÄ£\Ô\Ô]Ô^Ô_“ “£cij»ÄÄäÀ+ÉäÁ“£mäÂäijÅÄ䯣r+ÏäÇ+Уt+ÑäÉÄ +ÓäÌÔw“#äÍ£y+Ö³Î+×£{äУ}+ÚÔ}äÓ+ܳÔÔ³ÕÔ“-³×+â³ÚäÚÔ…+ãäÛäÜ£‰“5äá“8£Ô+ëäã“:³åÔ³æäæ“=£’äç“>äè“?³êäë“B³íäíäîÄE+ø³ðäðÔ›³ñäñ£Ô³ôÔŸÄKä÷Ô¢äøÔ£³ùÔ¤£¦Ô¨´åÄW£­Ô­£¯Ô¯“[£°Ô°Ä[£±´åÔ²Ä_ÔµÔ¶Äb´,Ôº,Ô»£¼Ô¼,åÄhÄkåÔÃÄnÔÄÄo£ÅÔÅÔÆÔÇ“s´“vÄuå “wå!ÔÌÔÍÄxå#£Ï´$Äzå&,/ÔÒÄ}ÔÓÔÔÄ€´+ÔÖÄ‚´.ÔÙ´0å0,9,:å3£ßå5£âÔâÔãÄŽ´9“´:ÔåÔæÔç´=å>Ôé“•,J´B,KåCåD£ñÄœ£ò,O£óÔó“ŸåI£÷åLÔ÷ÔøÔù£ú,W´O“¦£û´PÔü´R£þĪ,^¤¤,`,a“°¤,b´Z“±¤Õ“²,e´]¤ Õ ,g,h´`“·åaÕ Õ ĸ¤´c“ºĹ´dÕÄ»,n´fÕ¤´håh“¿¤“ÀåjÕ“Á““Ãåm,v¤,x´pÕ¤,z“ʤ",´wåx,Õ$Õ&´}Õ),‡å,ˆÕ,Õ-ÄØ,‹Õ.Õ/Õ0“ÜÄÛå†Õ1“ÝÄÜÕ3Õ4ÄßÕ5勤7Õ7åÕ8¤9,—Õ:Õ;å‘“èÄèå“ÄéÕ?,Õ@ÕA¤B,Ÿå˜ÕCÕDÄñÕHÕI¤Jå ¤L,©Äø,«´£ÕNå¤Äû¤QÄü¤S¤T“ÿÄÿ¤V´«”´­”¤YÅ´¯ÅÅ ¤_,¼Å ´µ,¾´·å¸,Á´¹”ÅŤf,ô»Å”å¼Å”å½Õh”¤j´¿”å¿”åÀ¤m,Ê”åÂåÃÕn,ÌåÄÕoåÅ,Î,Ï´ÇÕr´È”Õs´ÉÕu¤vÕw”#Õx”$Õ|¤~´ÓÅ),ÝÕ€”/”0åÚ´Û”1”2åÜ”4´ß”5åߤ‹,è´à”6åà´á”7åá´â¤Ž´å¤‘´æ´ç¤“,ñÕ”¤•´ë¤—Õ˜Õ™¤š´ð¤´ò,ûÅI,ü´ô”Lå÷åøåûÕ¦åü”S- ÅXæ”[”^Å^”_Õ·-µ-”f”hÕ½Åh-”i-”j¤Àµ¤Áµµ”m¤Ã”nÅn¤Å”p¤ÆµÅq¤Çææ¤Êµ!”wæ!¤Î-+”yæ#”zæ$æ%Å{æ'æ(ÕÔÕÕ¤ÖÕÖÅæ,Õ׿--6µ/æ0æ3ÕÞ¤ßæ4æ5æ6-?-@µ8”ŽÅŽ””¤è-G”•-H”–Å–-I-J”˜-K-LÕï¤ñÕñ¤ô-QÕô¤õ¤ö¤ù¤ü¤ý-Z-]ÖÖÖ-i”»ÖžÅ¿¥¥µn-y”ÇÅǔȥ-{¥-|”ʵu”˵v”Ì”ÍÅÍ¥#”ÎÅÎ-µyÅÏ¥%ÅÐÅÒÅÓµ~¥*”Ö¥,¥-Ö-¥.ÅÙµ„Ö/¥0¥3¥6µ‹Åá¥9¥:Åæ¥<µ’Ö=¥?Ö@-žÖAÖBÅí¥Cµ˜-¡ÅñÅò¥JµŸÅõ”öµ¡”÷¥M”øÅøµ£µ¥¥Qµ¦Åü-¯µ¨Åþ•Æ-³ÆÆµ®•Æ¥[µ°Ö\Ƶ´¥`µµÆ -¾µ¶• µ·Öbµ¸ÖcÆ-Áµ¹Æµºµ»Öfµ¼ÖgÆÖhµ¾•Öiµ¿-ÉÆ-Ê-ËÖo¥pÖpÖr-еȵ˥x¥z•%Öz-Ù¥}-Ú•(¥~-ÛµÓÆ)¥€Ö¥‚µ×¥„µÙÆ/Æ2¥ˆ•4Æ4¥Š-祋-饕8ÖÖŽÆ9¥Æ;Ö‘Æ<¥’Ö’Æ=•>Æ>¥•Æ@Ö—Ö˜¥™ÆFÆHÆJµöÆM¥£ÆN..ÆRµþÆTµÿ. •W¥­•XÆX¶ÆZ•\¥²•]•^.•_•`Æ`¶ ¥·•b•c¶•d•e¥»¶•h¥¿•j¥ÀÆjÖÀ¥Á•lÆl¥ÄÆo•q¥ÇÆq¥ÈÖÈ¥Ë¥ÌÆx¥Ï¥Ð•|Æ{¶'•~Æ~ÖÔ¥ÕÆ¥Ö.4.5•ƒÆ‚¥Ù•„ÖÙƆÖÜƇÖÝ•‰•ŠÆ‹ÖᕎÆÖã¶:ÆÖåÖæ•’Æ‘¶=Æ’Æ“¶?¶AÖí¶C¶D•›.N¶F•œÖò¥ô• ¶K¶NÖùÖú¥ûÆ¥ÖûƦ¥þ•­×•¯×.b.c×Ƴ× × × •·ƶ•¸•º×Æ»ƽƾ.r.s.t•Â.u.w¶o•Å.y¶qÆÆÆÇ×!.€ÆÍ¦(.…¦)¦*¦,¶ÆÖ×,.жƒ•Ú×0×2ÆÝ.‘ÆÞ•àÆß×5¶‹•áÆà×6•â•ã×8.–¶ŽÆã¦:.—¶•å×<×=.›.•ì•ð¦F¶›Æð.¤.¥×H¦I×I.¨¶ ¶¡•÷.ª•ø.«Æù×O.­¦Q.®•ü×QÆü•þ¶©Æÿ¶«–×X¶®Ç¶°Ç.¹Ç×]×_– – ¶·– ×b¶¸×c×e¦f×g¦h¶À.É.ʶæq.϶Ȗ×s¦t×t¦w.ֶϦ{¦|–'×|¶Ò–*¶Ö¶×¶Ø¶Ú–0–1–3Ç4¶áÇ6Ç7¶ãÇ8Ç9.í¶åÇ:¶æÇ<Ç=Ç?Ç@¦—¦˜ÇC.÷ÇE¦–HÇI–P×§ת–V–W/ ·–X–Y–ZÇ\׸Çc¦º/··–g–iÇh¦¿Çi¦À–k¦ÃÇm×÷×Ä·×ŦƦǦȦÉÇs·–u–vÇvÇx·$–zÇy–{Ç{¦Ó/2·+Ç€/4–‚/5·-Ç‚ǃ¦Ú·//8Ç…/9dž¦Ý/:¦Þlj/>·6Ç‹×áÇŒ×âÇÇŽ/DÇ‘·>Ç”/I·C×ï·F–·H–žÇž¦õ– –¡·LÇ¡×÷·M×ø¦ù–¤×ù–¥/X×ü/[Ǩ·T·U/_§/`Ç­/a/b·Z/c/d·\§·_–µ·`·a–·Ƕ·b–¸§§Ø§–½–¾§·iاؖÄÇç·o§Çŧ–È/{–Ê–ËØ!–ÍØ#–ÏØ$/‚–ÐØ%/„/‡·–Ֆר,Çר-·ƒÇØÇÙØ//–Û/Ž–Ü/–ÝØ2/–Þ–áÇà/•·Ø8Ø9Ø:·§>§?–ê/§D§E/¢–ð–òØG–ó§I§J–õØJ/¨· –ö·¥§Q·§§T/±·©/²—ØU·«§W·¬—ØW—È·®È·°È§]·²Ø^§_·´§`È §a/¿È §d·º§f·»ÈÈ·¾—Øi·¿·ÀØkØlØn/Ì/Íȧs—Øs§t— †Í—"—$—%È$§{†ÑÈ&§}†Ó—(È(†Õ†Ö·Õ§/ÞÈ+/ß—-È-È.§…†ÛÈ0È1§ˆ/å—3—4—5È4È5ØŒ§Ž/ë—9§ØØ/î†ç/ï—=†é/ñ†ê/ò§–/ó§—†í§˜§™/ö—D/÷/ø†ñÈEØ›Ø/ûÈIØŸ/ÿØ£—OؤØ¥—SبتØ­¸Ø®0 ÈY—[ÈZÈ[‡§³0‡ 0¸ ص0È`ض‡ §¸§¹¸0¸Ø»0¸ؼ—h§¾0‡§¿‡—jØ¿—kØÁ0§Ã§ÄØÅ0#¸0&‡§Ê‡ ØË‡"ØÌ‡#‡$‡%—zÈy§Ð‡&Èz‡'‡)È}¸)ȧÙ07¸0È…ØÛ¸1¸2ØÝȈ‡6§â¸7ÈŒ0AÈŽØäȧæ0C§ç¸<Øç§è¸=—“È’¸>¸?—•Øë0IÈ–0JȘÈ™¸F§ò0O¸I0R¸J0S0U‡N‡O‡PØû‡R¸RØý‡TØþ0\‡WȬ0a—¯Ù¨Ù¨ ¨ ‡`È´Ù 0j¸b—ºÙ0m—»0n‡g¸f—¼È»Ù‡hȼÙ‡i¸h—¿¸jÙ‡l—ÁÙ0t—Â0u—ÇoÈøoÈĨهq‡r¨ÈǨ0{¨Ù¨0}¨ 0~¸vÈˇx0‚0ƒ‡|‡}ÈÑÈÔ¸€—ÖÈÕ¨+¸Ù,¸ƒ¨.¨/ÈÚ¨0ÈÛ0Ù3—ßÈÞ0’—à—á¨70•Èâ0–—ä¨9Ù9Èä¨;Èæ¨<0›¸“Èè¨>¨@0ž¸–Èë—íÈì—îÙCÈðÈñÈòÙHÙJÈõ—öÙKÙL¸¢ÙMÈø¸£‡¥ÙOÈúÙPÈû¸§Èý¸¨Èþɇ¯¨Z¸´É ‡¶‡·É˜‡»¸º¸»‡½˜Éɇ¿¸¾É‡À¸¿¸ÀÙk‡Â‡Ã¸Ã¸Ä˜¸Å‡Ç¨qɇȸÇɸȇʘÙtÉ"¸ÍÉ&‡Ò¸ÑÙ~Ù¸ÕÉ+¸ÖÉ-¸ØÉ.¸Ù¸ÚÉ0¸ÜÙ‡‡ÞÙ‰É4‡àÉ5¸àÉ6ÙÙŽ‡åÉ:‡æ˜;¸æ˜<‡è‡é‡êÙ”˜@É@˜A‡îÉC‡ï˜D‡ðÉEÙ›‡ò‡ó˜IÙžÉJÔ9œ99ž9Ÿ ÿ9 N9¡Ô9œ99ž9Ÿ z9¢N9£Ô9œ99ž9Ÿ›9¤N9¥Ô9œ99ž9ŸA9¦N9§Ô9œ99ž9Ÿš9¨N9©Ô9œ99ž9Ÿ@9ªN9«Ô9œ99ž9Ÿ™9¬N9­Ô9œ99ž9Ÿ 9®N9¯Ô9œ99ž9Ÿ 9°N9±Ô9œ99ž9Ÿ {9²N9³Ô9œ99ž9ŸÄ9´N9µÔ9œ99ž9Ÿ 9¶N9·Ô9œ99ž9Ÿ9¸N9¹Ô9œ99ž9Ÿ 9ºN9»Ô9œ99ž9Ÿ9¼N9½Ô9œ99ž9Ÿ 9¾N9¿Ô9œ99ž9ŸÅ9ÀN9ÁÔ9œ99ž9Ÿ9ÂN9ÃÔ9œ99ž9Ÿ Ù9ÄQ9ÅÔ9œ99ž9Ÿ?9ÆN9ÇÔ9œ99ž9ŸÆ9ÈN9ÉÔ9œ99ž9ŸÇ9ÊN9ËÔ9œ99ž9Ÿ˜9ÌN9ÍÔ9œ99ž9Ÿ9ÎN9ÏÔ9œ99ž9Ÿ Ø9ÐP9ÑÔ9œ99ž9Ÿÿ9ÒN9ÓÔ9œ99ž9Ÿ Ú9ÔR9ÕÔ9œ99ž9Ÿ Û9ÖS9×Ô9œ99ž9Ÿ>9ØN9ÙÔ9œ99ž9ŸÈ9ÚN9ÛÔ9œ99ž9Ÿ ×9ÜO9ÝÔ9œ99ž9ŸÉ9ÞN9ßÔ9œ99ž9Ÿ |9àN9áÔ9œ99ž9Ÿ=9âN9ãÔ9œ99ž9Ÿþ9äN9åÔ9œ99ž9Ÿ<9æN9çÔ9œ99ž9Ÿ—9èN9éÔ9œ99ž9Ÿ }9êN9ëÔ9œ99ž9ŸÊ9ìN9íÔ9œ99ž9Ÿ ~9îN9ïÔ9œ99ž9Ÿý9ðN9ñÔ9œ99ž9Ÿ 9òN9óÔ9œ99ž9Ÿü9ôN9õÔ9œ99ž9ŸË9öN9÷Ô9œ99ž9ŸÌ9øN9ùÔ9œ99ž9Ÿû9úN9ûÔ9œ99ž9Ÿ;9üN9ýÔ9œ99ž9Ÿ €9þN9ÿÔ9œ99ž9Ÿ :N:Ô9œ99ž9Ÿ::N:Ô9œ99ž9Ÿ–:N:Ô9œ99ž9Ÿú:N:Ô9œ99ž9Ÿù:N: Ô9œ99ž9Ÿø: N: Ô9œ99ž9Ÿ÷: N: Ô9œ99ž9Ÿ•:N:Ô9œ99ž9Ÿ ‚:N:Ô9œ99ž9ŸÍ:N:Ô9œ99ž9Ÿ :N:Ô9œ99ž9ŸÎ:N:Ô9œ99ž9Ÿ :N:Ô9œ99ž9Ÿ ƒ:N:Ô9œ99ž9Ÿ9:N:Ô9œ99ž9ŸÏ:N:Ô9œ99ž9ŸÐ: N:!Ô9œ99ž9Ÿö:"N:#Ô9œ99ž9ŸÑ:$N:%Ô9œ99ž9ŸÒ:&N:'Ô9œ99ž9Ÿ „:(N:)Ô9œ99ž9ŸÓ:*N:+Ô9œ99ž9ŸÔ:,N:-Ô9œ99ž9Ÿ”:.N:/Ô9œ99ž9Ÿ“:0N:1Ô9œ99ž9Ÿõ:2N:3Ô9œ99ž9Ÿ’:4N:5Ô9œ99ž9Ÿ …:6N:7Ô9œ99ž9Ÿ‘:8N:9Ô9œ99ž9Ÿ ::N:;Ô9œ99ž9ŸÕ:<N:=Ô9œ99ž9Ÿ:>N:?Ô9œ99ž9ŸÖ:@N:AÔ9œ99ž9Ÿ8:BN:CÔ9œ99ž9Ÿ:DN:EÔ9œ99ž9Ÿ×:FN:GÔ9œ99ž9ŸŽ:HN:IÔ9œ99ž9Ÿ :JN:KÔ9œ99ž9ŸØ:LN:MÔ9œ99ž9Ÿô:NN:OÔ9œ99ž9ŸÙ:PN:QÔ9œ99ž9Ÿ:RN:SÔ9œ99ž9Ÿ :TN:UÔ9œ99ž9ŸÚ:VN:WÔ9œ99ž9ŸŒ:XN:YÔ9œ99ž9ŸÛ:ZN:[Ô9œ99ž9Ÿ‹:\N:]Ô9œ99ž9Ÿ †:^N:_Ô9œ99ž9Ÿó:`N:aÔ9œ99ž9ŸŠ:bN:cÔ9œ99ž9Ÿ :dN:eÔ9œ99ž9Ÿ :fN:gÔ9œ99ž9Ÿ ‡:hN:iÔ9œ99ž9Ÿò:jN:kÔ9œ99ž9Ÿ :lN:mÔ9œ99ž9Ÿ ˆ:nN:oÔ9œ99ž9Ÿñ:pN:qÔ9œ99ž9Ÿ ‰:rN:sÔ9œ99ž9Ÿð:tN:uÔ9œ99ž9Ÿ7:vN:wÔ9œ99ž9Ÿ :xN:yÔ9œ99ž9Ÿ Š:zN:{Ô9œ99ž9Ÿï:|N:}Ô9œ99ž9Ÿ‰:~N:Ô9œ99ž9Ÿî:€N:Ô9œ99ž9Ÿí:‚N:ƒÔ9œ99ž9Ÿì:„N:…Ô9œ99ž9Ÿˆ:†N:‡Ô9œ99ž9Ÿë:ˆN:‰Ô9œ99ž9Ÿ‡:ŠN:‹Ô9œ99ž9Ÿ :ŒN:Ô9œ99ž9Ÿ†:ŽN:Ô9œ99ž9Ÿ :N:‘Ô9œ99ž9Ÿ…:’N:“Ô9œ99ž9Ÿê:”N:•Ô9œ99ž9Ÿ„:–N:—Ô9œ99ž9Ÿ6:˜N:™Ô9œ99ž9Ÿé:šN:›Ô9œ99ž9Ÿ ‹:œN:Ô9œ99ž9Ÿ5:žN:ŸÔ9œ99ž9Ÿè: N:¡Ô9œ99ž9Ÿ Œ:¢N:£Ô9œ99ž9Ÿ :¤N:¥Ô9œ99ž9Ÿç:¦N:§Ô9œ99ž9Ÿ Ž:¨N:©Ô9œ99ž9Ÿæ:ªN:«Ô9œ99ž9Ÿ :¬N:­Ô9œ99ž9Ÿå:®N:¯Ô9œ99ž9Ÿƒ:°N:±Ô9œ99ž9Ÿ :²N:³Ô9œ99ž9Ÿä:´N:µÔ9œ99ž9Ÿ4:¶N:·Ô9œ99ž9Ÿã:¸N:¹Ô9œ99ž9Ÿ :ºN:»Ô9œ99ž9Ÿ :¼N:½Ô9œ99ž9Ÿâ:¾N:¿Ô9œ99ž9Ÿ‚:ÀN:ÁÔ9œ99ž9ŸÜ:ÂN:ÃÔ9œ99ž9ŸÝ:ÄN:ÅÔ9œ99ž9ŸÞ:ÆN:ÇÔ9œ99ž9Ÿ ‘:ÈN:ÉÔ9œ99ž9Ÿ :ÊN:ËÔ9œ99ž9Ÿß:ÌN:ÍÔ9œ99ž9Ÿ :ÎN:ÏÔ9œ99ž9Ÿà:ÐN:ÑÔ9œ99ž9Ÿ :ÒN:ÓÔ9œ99ž9Ÿá:ÔN:ÕÔ9œ99ž9Ÿ :ÖN:×Ô9œ99ž9Ÿ3:ØN:ÙÔ9œ99ž9Ÿ :ÚN:ÛÔ9œ99ž9Ÿ2:ÜN:ÝÔ9œ99ž9Ÿ1:ÞN:ßÔ9œ99ž9Ÿ ’:àN:áÔ9œ99ž9Ÿ0:âN:ãÔ9œ99ž9Ÿ “:äN:åÔ9œ99ž9Ÿá:æN:çÔ9œ99ž9Ÿ/:èN:éÔ9œ99ž9Ÿ :êN:ëÔ9œ99ž9Ÿà:ìN:íÔ9œ99ž9Ÿ:îN:ïÔ9œ99ž9Ÿâ:ðN:ñÔ9œ99ž9Ÿ ”:òN:óÔ9œ99ž9Ÿã:ôN:õÔ9œ99ž9Ÿä:öN:÷Ô9œ99ž9Ÿ€:øN:ùÔ9œ99ž9Ÿ :úN:ûÔ9œ99ž9Ÿ •:üN:ýÔ9œ99ž9Ÿå:þN:ÿÔ9œ99ž9Ÿß;N;Ô9œ99ž9ŸÞ;N;Ô9œ99ž9Ÿ ;N;Ô9œ99ž9ŸÝ;N;Ô9œ99ž9Ÿ ;N; Ô9œ99ž9ŸÜ; N; Ô9œ99ž9Ÿ ; N; Ô9œ99ž9ŸÛ;N;Ô9œ99ž9Ÿ.;N;Ô9œ99ž9Ÿ ;N;Ô9œ99ž9Ÿæ;N;Ô9œ99ž9Ÿ-;N;Ô9œ99ž9Ÿ;N;Ô9œ99ž9Ÿ~;N;Ô9œ99ž9Ÿç;N;Ô9œ99ž9Ÿ –;N;Ô9œ99ž9Ÿ,; N;!Ô9œ99ž9Ÿè;"N;#Ô9œ99ž9Ÿ5;$N;%Ô9œ99ž9Ÿé;&N;'Ô9œ99ž9Ÿ ;(N;)Ô9œ99ž9Ÿê;*N;+Ô9œ99ž9Ÿ+;,N;-Ô9œ99ž9Ÿ};.N;/Ô9œ99ž9ŸÚ;0N;1Ô9œ99ž9Ÿ*;2N;3Ô9œ99ž9Ÿ);4N;5Ô9œ99ž9Ÿ|;6N;7Ô9œ99ž9Ÿ ;8N;9Ô9œ99ž9Ÿë;:N;;Ô9œ99ž9Ÿ ;<N;=Ô9œ99ž9Ÿ ;>N;?Ô9œ99ž9Ÿì;@N;AÔ9œ99ž9Ÿí;BN;CÔ9œ99ž9Ÿ —;DN;EÔ9œ99ž9Ÿî;FN;GÔ9œ99ž9Ÿï;HN;IÔ9œ99ž9Ÿð;JN;KÔ9œ99ž9ŸÙ;LN;MÔ9œ99ž9Ÿ ;NN;OÔ9œ99ž9Ÿ(;PN;QÔ9œ99ž9Ÿ{;RN;SÔ9œ99ž9Ÿ';TN;UÔ9œ99ž9Ÿ ;VN;WÔ9œ99ž9Ÿ&;XN;YÔ9œ99ž9Ÿ ˜;ZN;[Ô9œ99ž9Ÿñ;\N;]Ô9œ99ž9Ÿ ™;^N;_Ô9œ99ž9Ÿò;`N;aÔ9œ99ž9Ÿ š;bN;cÔ9œ99ž9Ÿz;dN;eÔ9œ99ž9Ÿ ›;fN;gÔ9œ99ž9ŸØ;hN;iÔ9œ99ž9Ÿ%;jN;kÔ9œ99ž9Ÿó;lN;mÔ9œ99ž9Ÿ;n>;oÔ9œ99ž9Ÿx;pN;qÔ9œ99ž9Ÿw;rN;sÔ9œ99ž9Ÿ ;tN;uÔ9œ99ž9Ÿ œ;vN;wÔ9œ99ž9Ÿv;xN;yÔ9œ99ž9Ÿ ;zN;{Ô9œ99ž9Ÿu;|N;}Ô9œ99ž9Ÿô;~N;Ô9œ99ž9Ÿt;€N;Ô9œ99ž9Ÿõ;‚N;ƒÔ9œ99ž9Ÿ ;„N;…Ô9œ99ž9Ÿ×;†N;‡Ô9œ99ž9Ÿs;ˆN;‰Ô9œ99ž9ŸÖ;ŠN;‹Ô9œ99ž9Ÿ$;ŒN;Ô9œ99ž9Ÿr;ŽN;Ô9œ99ž9Ÿö;N;‘Ô9œ99ž9Ÿ ž;’N;“Ô9œ99ž9Ÿq;”N;•Ô9œ99ž9Ÿ÷;–N;—Ô9œ99ž9ŸÕ;˜N;™Ô9œ99ž9Ÿø;šN;›Ô9œ99ž9Ÿ Ÿ;œN;Ô9œ99ž9Ÿp;žN;ŸÔ9œ99ž9Ÿ ; N;¡Ô9œ99ž9Ÿù;¢N;£Ô9œ99ž9Ÿ  ;¤N;¥Ô9œ99ž9ŸÔ;¦N;§Ô9œ99ž9Ÿ ¡;¨N;©Ô9œ99ž9Ÿú;ªN;«Ô9œ99ž9ŸÓ;¬N;­Ô9œ99ž9Ÿû;®N;¯Ô9œ99ž9Ÿo;°N;±Ô9œ99ž9Ÿn;²N;³Ô9œ99ž9Ÿm;´N;µÔ9œ99ž9Ÿl;¶N;·Ô9œ99ž9Ÿk;¸N;¹Ô9œ99ž9Ÿü;ºN;»Ô9œ99ž9Ÿj;¼N;½Ô9œ99ž9Ÿý;¾N;¿Ô9œ99ž9Ÿi;ÀN;ÁÔ9œ99ž9Ÿh;ÂN;ÃÔ9œ99ž9Ÿg;ÄN;ÅÔ9œ99ž9ŸÒ;ÆN;ÇÔ9œ99ž9Ÿf;ÈN;ÉÔ9œ99ž9Ÿ#;ÊN;ËÔ9œ99ž9Ÿe;ÌN;ÍÔ9œ99ž9Ÿþ;ÎN;ÏÔ9œ99ž9Ÿÿ;ÐN;ÑÔ9œ99ž9Ÿ";ÒN;ÓÔ9œ99ž9Ÿ ¢;ÔN;ÕÔ9œ99ž9Ÿd;ÖN;×Ô9œ99ž9Ÿ £;ØN;ÙÔ9œ99ž9ŸÑ;ÚN;ÛÔ9œ99ž9Ÿ ¤;ÜN;ÝÔ9œ99ž9ŸÐ;ÞN;ßÔ9œ99ž9Ÿ;àN;áÔ9œ99ž9Ÿ ¥;âN;ãÔ9œ99ž9Ÿc;äN;åÔ9œ99ž9Ÿ ;æN;çÔ9œ99ž9Ÿ;èN;éÔ9œ99ž9Ÿb;êN;ëÔ9œ99ž9Ÿ ;ìN;íÔ9œ99ž9Ÿ!;îN;ïÔ9œ99ž9Ÿ ;ðN;ñÔ9œ99ž9Ÿ;òN;óÔ9œ99ž9ŸÏ;ôN;õÔ9œ99ž9Ÿa;öN;÷Ô9œ99ž9Ÿ ;øN;ùÔ9œ99ž9Ÿ;úN;ûÔ9œ99ž9Ÿ`;üN;ýÔ9œ99ž9Ÿ;þN;ÿÔ9œ99ž9Ÿ_<N<Ô9œ99ž9Ÿ,<N<Ô9œ99ž9Ÿ<N<Ô9œ99ž9Ÿ^<N<Ô9œ99ž9Ÿ<N< Ô9œ99ž9Ÿ]< N< Ô9œ99ž9Ÿ< N< Ô9œ99ž9Ÿ<N<Ô9œ99ž9Ÿ ÿ<N<Ô9œ99ž9Ÿ<N<Ô9œ99ž9ŸÎ<N<Ô9œ99ž9Ÿ\<N<Ô9œ99ž9ŸÍ<N<Ô9œ99ž9Ÿ[<N<Ô9œ99ž9Ÿ þ<N<Ô9œ99ž9ŸZ<N<Ô9œ99ž9Ÿ< NNN=?Ô9œ99ž9Ÿ å=@N=AÔ9œ99ž9Ÿ À=BN=CÔ9œ99ž9Ÿ =DN=EÔ9œ99ž9Ÿ ä=FN=GÔ9œ99ž9Ÿ =HN=IÔ9œ99ž9Ÿ ã=JN=KÔ9œ99ž9Ÿ+=LN=MÔ9œ99ž9Ÿ =NN=OÔ9œ99ž9Ÿ¼=PN=QÔ9œ99ž9Ÿ=RN=SÔ9œ99ž9Ÿ Á=TN=UÔ9œ99ž9Ÿ Â=VN=WÔ9œ99ž9Ÿ â=XN=YÔ9œ99ž9Ÿ Ã=ZN=[Ô9œ99ž9Ÿ»=\N=]Ô9œ99ž9Ÿ á=^N=_Ô9œ99ž9Ÿ,=`N=aÔ9œ99ž9Ÿ Ä=bN=cÔ9œ99ž9Ÿ=dN=eÔ9œ99ž9Ÿ Å=fN=gÔ9œ99ž9Ÿ Æ=hN=iÔ9œ99ž9Ÿ-=jN=kÔ9œ99ž9Ÿ Ç=lN=mÔ9œ99ž9Ÿ@=nN=oÔ9œ99ž9Ÿº=pN=qÔ9œ99ž9Ÿ à=rN=sÔ9œ99ž9Ÿ=tN=uÔ9œ99ž9Ÿ.=vN=wÔ9œ99ž9Ÿ/=xN=yÔ9œ99ž9Ÿ¹=zN={Ô9œ99ž9Ÿ ß=|N=}Ô9œ99ž9Ÿ=~N=Ô9œ99ž9Ÿ¸=€N=Ô9œ99ž9Ÿ0=‚N=ƒÔ9œ99ž9Ÿ È=„N=…Ô9œ99ž9Ÿ·=†N=‡Ô9œ99ž9Ÿ É=ˆN=‰Ô9œ99ž9Ÿ Ê=ŠN=‹Ô9œ99ž9Ÿ¶=ŒN=Ô9œ99ž9Ÿ=ŽN=Ô9œ99ž9Ÿ?=N=‘Ô9œ99ž9Ÿ1=’N=“Ô9œ99ž9Ÿµ=”N=•Ô9œ99ž9Ÿ Ë=–N=—Ô9œ99ž9Ÿ2=˜N=™Ô9œ99ž9Ÿ Ì=šN=›Ô9œ99ž9Ÿ´=œN=Ô9œ99ž9Ÿ=žN=ŸÔ9œ99ž9Ÿ3= N=¡Ô9œ99ž9Ÿ³=¢N=£Ô9œ99ž9Ÿ²=¤N=¥Ô9œ99ž9Ÿ4=¦N=§Ô9œ99ž9Ÿ Í=¨N=©Ô9œ99ž9Ÿ±=ªN=«Ô9œ99ž9Ÿ>=¬N=­Ô9œ99ž9Ÿ Î=®N=¯Ô9œ99ž9Ÿ°=°N=±Ô9œ99ž9Ÿ¯=²N=³Ô9œ99ž9Ÿ®=´N=µÔ9œ99ž9Ÿ5=¶N=·Ô9œ99ž9Ÿ6=¸N=¹Ô9œ99ž9Ÿ Þ=ºN=»Ô9œ99ž9Ÿ=¼N=½Ô9œ99ž9Ÿ7=¾N=¿Ô9œ99ž9Ÿ­=ÀN=ÁÔ9œ99ž9Ÿ8=ÂN=ÃÔ9œ99ž9Ÿ Ï=ÄN=ÅÔ9œ99ž9Ÿ=ÆN=ÇÔ9œ99ž9Ÿ==ÈN=ÉÔ9œ99ž9Ÿ<=ÊN=ËÔ9œ99ž9Ÿ Ð=ÌN=ÍÔ9œ99ž9Ÿ9=ÎN=ÏÔ9œ99ž9Ÿ;=ÐN=ÑÔ9œ99ž9Ÿ:=ÒN=ÓÔ9œ99ž9Ÿ=ÔN=ÕÔ9œ99ž9Ÿ:=ÖN=×Ô9œ99ž9Ÿ;=ØN=ÙÔ9œ99ž9Ÿÿ=ÚN=ÛÔ9œ99ž9Ÿ<=ÜN=ÝÔ9œ99ž9Ÿþ=ÞN=ßÔ9œ99ž9Ÿ9=àN=áÔ9œ99ž9Ÿ Ý=âN=ãÔ9œ99ž9Ÿ==äN=åÔ9œ99ž9Ÿ¬=æN=çÔ9œ99ž9Ÿ«=èN=éÔ9œ99ž9Ÿ Ñ=êN=ëÔ9œ99ž9Ÿª=ìN=íÔ9œ99ž9Ÿý=îN=ïÔ9œ99ž9Ÿ8=ðN=ñÔ9œ99ž9Ÿ©=òN=óÔ9œ99ž9Ÿ Ü=ôN=õÔ9œ99ž9Ÿ Û=öN=÷Ô9œ99ž9Ÿ7=øN=ùÔ9œ99ž9Ÿ>=úN=ûÔ9œ99ž9Ÿ?=üN=ýÔ9œ99ž9Ÿü=þN=ÿÔ9œ99ž9Ÿ¨>N>Ô9œ99ž9Ÿ Ú>N>Ô9œ99ž9Ÿ@>N>Ô9œ99ž9Ÿ§>N>Ô9œ99ž9Ÿû>N> Ô9œ99ž9Ÿ Ò> N> Ô9œ99ž9Ÿ¦> N> Ô9œ99ž9Ÿ¥>N>Ô9œ99ž9Ÿú>N>Ô9œ99ž9Ÿ¤>N>Ô9œ99ž9ŸA>N>Ô9œ99ž9ŸB>N>Ô9œ99ž9Ÿ6>N>Ô9œ99ž9ŸC>N>Ô9œ99ž9ŸD>N>Ô9œ99ž9Ÿ Ù>N>Ô9œ99ž9Ÿ5> N>!Ô9œ99ž9ŸE>"N>#Ô9œ99ž9Ÿù>$N>%Ô9œ99ž9ŸF>&N>'Ô9œ99ž9Ÿ Ó>(N>)Ô9œ99ž9Ÿ4>*N>+Ô9œ99ž9Ÿ3>,N>-Ô9œ99ž9ŸG>.N>/Ô9œ99ž9ŸH>0N>1Ô9œ99ž9Ÿ'>2N>3Ô9œ99ž9ŸI>4N>5Ô9œ99ž9ŸJ>6N>7Ô9œ99ž9ŸK>8N>9Ô9œ99ž9Ÿ Ø>:N>;Ô9œ99ž9Ÿ2><N>=Ô9œ99ž9ŸL>>N>?Ô9œ99ž9Ÿ ×>@N>AÔ9œ99ž9Ÿø>BN>CÔ9œ99ž9ŸM>DN>EÔ9œ99ž9ŸN>FN>GÔ9œ99ž9Ÿ/>HN>IÔ9œ99ž9Ÿ÷>JN>KÔ9œ99ž9Ÿ Ö>LN>MÔ9œ99ž9ŸO>NN>OÔ9œ99ž9Ÿ Õ>PN>QÔ9œ99ž9Ÿö>RN>SÔ9œ99ž9ŸP>TN>UÔ9œ99ž9Ÿõ>VN>WÔ9œ99ž9ŸQ>XN>YÔ9œ99ž9Ÿ Ô>ZN>[Ô9œ99ž9Ÿ Ô>\N>]Ô9œ99ž9Ÿô>^N>_Ô9œ99ž9Ÿ Õ>`N>aÔ9œ99ž9Ÿ1>bN>cÔ9œ99ž9Ÿ Ó>dN>eÔ9œ99ž9Ÿó>fN>gÔ9œ99ž9Ÿò>hN>iÔ9œ99ž9ŸR>jN>kÔ9œ99ž9Ÿ Ò>lN>mÔ9œ99ž9Ÿ0>nN>oÔ9œ99ž9Ÿ/>pN>qÔ9œ99ž9Ÿ.>rN>sÔ9œ99ž9ŸS>tN>uÔ9œ99ž9Ÿñ>vN>wÔ9œ99ž9Ÿ Ö>xN>yÔ9œ99ž9Ÿ£>zN>{Ô9œ99ž9Ÿ->|N>}Ô9œ99ž9Ÿð>~N>Ô9œ99ž9ŸT>€N>Ô9œ99ž9Ÿï>‚N>ƒÔ9œ99ž9Ÿ,>„N>…Ô9œ99ž9Ÿî>†N>‡Ô9œ99ž9Ÿí>ˆN>‰Ô9œ99ž9Ÿì>ŠN>‹Ô9œ99ž9Ÿ+>ŒN>Ô9œ99ž9ŸU>ŽN>Ô9œ99ž9Ÿ Ñ>N>‘Ô9œ99ž9ŸV>’N>“Ô9œ99ž9Ÿ*>”N>•Ô9œ99ž9ŸW>–N>—Ô9œ99ž9Ÿ)>˜N>™Ô9œ99ž9ŸX>šN>›Ô9œ99ž9Ÿë>œN>Ô9œ99ž9Ÿ(>žN>ŸÔ9œ99ž9Ÿ Ð> N>¡Ô9œ99ž9Ÿ'>¢N>£Ô9œ99ž9Ÿ Ï>¤N>¥Ô9œ99ž9Ÿ&>¦N>§Ô9œ99ž9ŸY>¨N>©Ô9œ99ž9Ÿ Î>ªN>«Ô9œ99ž9ŸZ>¬N>­Ô9œ99ž9Ÿ ×>®N>¯Ô9œ99ž9Ÿ Ø>°N>±Ô9œ99ž9Ÿ Í>²N>³Ô9œ99ž9Ÿ[>´N>µÔ9œ99ž9Ÿ¢>¶N>·Ô9œ99ž9Ÿ Ì>¸N>¹Ô9œ99ž9Ÿ\>ºN>»Ô9œ99ž9Ÿ¡>¼N>½Ô9œ99ž9Ÿ Ë>¾N>¿Ô9œ99ž9Ÿ%>ÀN>ÁÔ9œ99ž9Ÿ]>ÂN>ÃÔ9œ99ž9Ÿ^>ÄN>ÅÔ9œ99ž9Ÿ_>ÆN>ÇÔ9œ99ž9Ÿ`>ÈN>ÉÔ9œ99ž9Ÿ Ê>ÊN>ËÔ9œ99ž9Ÿa>ÌN>ÍÔ9œ99ž9Ÿê>ÎN>ÏÔ9œ99ž9Ÿ Ù>ÐN>ÑÔ9œ99ž9Ÿ >ÒN>ÓÔ9œ99ž9Ÿb>ÔN>ÕÔ9œ99ž9ŸŸ>ÖN>×Ô9œ99ž9Ÿ É>ØN>ÙÔ9œ99ž9Ÿ Ú>ÚN>ÛÔ9œ99ž9Ÿž>ÜN>ÝÔ9œ99ž9Ÿ Û>ÞN>ßÔ9œ99ž9Ÿ>àN>áÔ9œ99ž9Ÿ È>âN>ãÔ9œ99ž9Ÿc>äN>åÔ9œ99ž9Ÿ Ü>æN>çÔ9œ99ž9Ÿé>èN>éÔ9œ99ž9Ÿè>êN>ëÔ9œ99ž9Ÿ Ç>ìN>íÔ9œ99ž9Ÿç>îN>ïÔ9œ99ž9Ÿœ>ðN>ñÔ9œ99ž9Ÿ$>òN>óÔ9œ99ž9Ÿ Ý>ôN>õÔ9œ99ž9Ÿd>öN>÷Ô9œ99ž9Ÿ#>øN>ùÔ9œ99ž9Ÿæ>úN>ûÔ9œ99ž9Ÿ">üN>ýÔ9œ99ž9Ÿ!>þN>ÿÔ9œ99ž9Ÿe?N?Ô9œ99ž9Ÿ›?N?Ô9œ99ž9Ÿ ?N?Ô9œ99ž9Ÿš?N?Ô9œ99ž9Ÿ?N? Ô9œ99ž9Ÿf? N? Ô9œ99ž9Ÿ™? N? Ô9œ99ž9Ÿ Þ?N?Ô9œ99ž9Ÿ˜?N?Ô9œ99ž9Ÿg?N?Ô9œ99ž9Ÿ—?N?Ô9œ99ž9Ÿh?N?Ô9œ99ž9Ÿ ß?N?Ô9œ99ž9Ÿ–?N?Ô9œ99ž9Ÿ?N?Ô9œ99ž9Ÿ•?N?Ô9œ99ž9Ÿ Æ? N?!Ô9œ99ž9Ÿ à?"N?#Ô9œ99ž9Ÿ?$N?%Ô9œ99ž9Ÿ”?&N?'Ô9œ99ž9Ÿi?(N?)Ô9œ99ž9Ÿ Å?*N?+Ô9œ99ž9Ÿ?,N?-Ô9œ99ž9Ÿ Ä?.N?/Ô9œ99ž9Ÿj?0N?1Ô9œ99ž9Ÿ á?2N?3Ô9œ99ž9Ÿ“?4N?5Ô9œ99ž9Ÿk?6N?7Ô9œ99ž9Ÿ’?8N?9Ô9œ99ž9Ÿå?:N?;Ô9œ99ž9Ÿl?<N?=Ô9œ99ž9Ÿ‘?>N??Ô9œ99ž9Ÿm?@N?AÔ9œ99ž9Ÿ â?BN?CÔ9œ99ž9Ÿ?DN?EÔ9œ99ž9Ÿ ã?FN?GÔ9œ99ž9Ÿ?HN?IÔ9œ99ž9Ÿ?JN?KÔ9œ99ž9Ÿn?LN?MÔ9œ99ž9Ÿo?NN?OÔ9œ99ž9Ÿ Ã?PN?QÔ9œ99ž9Ÿ Â?RN?SÔ9œ99ž9ŸŽ?TN?UÔ9œ99ž9Ÿ Á?VN?WÔ9œ99ž9Ÿ?XN?YÔ9œ99ž9Ÿ?ZN?[Ô9œ99ž9ŸŒ?\N?]Ô9œ99ž9Ÿ?^N?_Ô9œ99ž9Ÿ ä?`N?aÔ9œ99ž9Ÿ À?bN?cÔ9œ99ž9Ÿp?dN?eÔ9œ99ž9Ÿ ¿?fN?gÔ9œ99ž9Ÿ?hN?iÔ9œ99ž9Ÿ å?jN?kÔ9œ99ž9Ÿ‹?lN?mÔ9œ99ž9Ÿq?nN?oÔ9œ99ž9Ÿ ¾?pN?qÔ9œ99ž9Ÿ?rN?sÔ9œ99ž9Ÿä?tN?uÔ9œ99ž9Ÿ?vN?wÔ9œ99ž9Ÿ?xN?yÔ9œ99ž9Ÿã?zN?{Ô9œ99ž9Ÿ?|N?}Ô9œ99ž9Ÿâ?~N?Ô9œ99ž9Ÿ æ?€N?Ô9œ99ž9Ÿ?‚N?ƒÔ9œ99ž9ŸŠ?„N?…Ô9œ99ž9Ÿ ½?†N?‡Ô9œ99ž9Ÿ?ˆN?‰Ô9œ99ž9Ÿ?ŠN?‹Ô9œ99ž9Ÿ‰?ŒN?Ô9œ99ž9Ÿ?ŽN?Ô9œ99ž9Ÿˆ?N?‘Ô9œ99ž9Ÿ ¼?’N?“Ô9œ99ž9Ÿ »?”N?•Ô9œ99ž9Ÿá?–N?—Ô9œ99ž9Ÿ?˜N?™Ô9œ99ž9Ÿ º?šN?›Ô9œ99ž9Ÿà?œN?Ô9œ99ž9Ÿ ¹?žN?ŸÔ9œ99ž9Ÿ? N?¡Ô9œ99ž9Ÿr?¢N?£Ô9œ99ž9Ÿ ¸?¤N?¥Ô9œ99ž9Ÿ ?¦N?§Ô9œ99ž9Ÿ ?¨N?©Ô9œ99ž9Ÿs?ªN?«Ô9œ99ž9Ÿ‡?¬N?­Ô9œ99ž9Ÿ ?®N?¯Ô9œ99ž9Ÿ ç?°N?±Ô9œ99ž9Ÿ?²M?³Ô9œ99ž9Ÿ†?´N?µÔ9œ99ž9Ÿ…?¶N?·Ô9œ99ž9Ÿ ?¸N?¹Ô9œ99ž9Ÿ„?ºN?»Ô9œ99ž9Ÿ ?¼N?½Ô9œ99ž9Ÿ é?¾N?¿Ô9œ99ž9Ÿt?ÀN?ÁÔ9œ99ž9Ÿ ·?ÂN?ÃÔ9œ99ž9Ÿß?ÄN?ÅÔ9œ99ž9Ÿ?ÆN?ÇÔ9œ99ž9Ÿƒ?ÈN?ÉÔ9œ99ž9Ÿ?ÊN?ËÔ9œ99ž9Ÿu?ÌN?ÍÔ9œ99ž9Ÿ?ÎN?ÏÔ9œ99ž9Ÿ‚?ÐN?ÑÔ9œ99ž9Ÿ ¶?ÒN?ÓÔ9œ99ž9Ÿ?ÔL?ÕÔ9œ99ž9Ÿ?ÖN?×Ô9œ99ž9Ÿ µ?ØN?ÙÔ9œ99ž9Ÿ ë?ÚN?ÛÔ9œ99ž9Ÿ€?ÜN?ÝÔ9œ99ž9Ÿv?ÞN?ßÔ9œ99ž9Ÿ ì?àN?áÔ9œ99ž9Ÿ ´?âN?ãÔ9œ99ž9Ÿ ³?äN?åÔ9œ99ž9Ÿ?æN?çÔ9œ99ž9Ÿ?èN?éÔ9œ99ž9Ÿ í?êN?ëÔ9œ99ž9Ÿ?ìN?íÔ9œ99ž9Ÿ?îN?ïÔ9œ99ž9Ÿ î?ðN?ñÔ9œ99ž9Ÿ?òN?óÔ9œ99ž9Ÿ?ôN?õÔ9œ99ž9Ÿ ï?öN?÷Ô9œ99ž9Ÿ?øN?ùÔ9œ99ž9Ÿ ð?úN?ûÔ9œ99ž9Ÿÿ?üN?ýÔ9œ99ž9Ÿ ñ?þN?ÿÔ9œ99ž9Ÿ ò@N@Ô9œ99ž9ŸÞ@N@Ô9œ99ž9Ÿw@N@Ô9œ99ž9Ÿ ó@N@Ô9œ99ž9ŸÝ@N@ Ô9œ99ž9Ÿþ@ N@ Ô9œ99ž9Ÿ ô@ N@ Ô9œ99ž9Ÿx@N@Ô9œ99ž9Ÿ õ@N@Ô9œ99ž9Ÿ ²@N@Ô9œ99ž9Ÿy@N@Ô9œ99ž9Ÿz@N@Ô9œ99ž9ŸÜ@N@Ô9œ99ž9Ÿ{@N@Ô9œ99ž9ŸÛ@N@Ô9œ99ž9Ÿ~@N@Ô9œ99ž9Ÿ ö@ N@!Ô9œ99ž9Ÿ}@"N@#Ô9œ99ž9ŸÚ@$N@%Ô9œ99ž9Ÿ ÷@&N@'Ô9œ99ž9Ÿ|@(N@)Ô9œ99ž9ŸÙ@*N@+Ô9œ99ž9Ÿ|@,N@-Ô9œ99ž9Ÿ}@.N@/Ô9œ99ž9Ÿ ±@0N@1Ô9œ99ž9ŸØ@2N@3Ô9œ99ž9Ÿý@4N@5Ô9œ99ž9Ÿ{@6N@7Ô9œ99ž9Ÿ×@8N@9Ô9œ99ž9Ÿ ø@:N@;Ô9œ99ž9Ÿz@<N@=Ô9œ99ž9Ÿy@>N@?Ô9œ99ž9Ÿ ù@@N@AÔ9œ99ž9Ÿx@BN@CÔ9œ99ž9Ÿw@DN@EÔ9œ99ž9Ÿv@FN@GÔ9œ99ž9Ÿu@HN@IÔ9œ99ž9ŸÖ@JN@KÔ9œ99ž9ŸÕ@LN@MÔ9œ99ž9Ÿt@NN@OÔ9œ99ž9ŸÔ@PN@QÔ9œ99ž9Ÿü@RN@SÔ9œ99ž9ŸÓ@TN@UÔ9œ99ž9Ÿû@VN@WÔ9œ99ž9Ÿ~@XN@YÔ9œ99ž9Ÿú@ZN@[Ô9œ99ž9Ÿ ú@\N@]Ô9œ99ž9Ÿ û@^N@_Ô9œ99ž9Ÿù@`N@aÔ9œ99ž9Ÿ ü@bN@cÔ9œ99ž9ŸÒ@dN@eÔ9œ99ž9Ÿø@fN@gÔ9œ99ž9Ÿs@hN@iÔ9œ99ž9Ÿ °@jN@kÔ9œ99ž9Ÿ@lN@mÔ9œ99ž9Ÿ ý@nN@oÔ9œ99ž9Ÿ ¯@pN@qÔ9œ99ž9Ÿ÷@rN@sÔ9œ99ž9Ÿr@tN@uÔ9œ99ž9Ÿö@vN@wÔ9œ99ž9Ÿ ®@xN@yÔ9œ99ž9Ÿ þ@zN@{Ô9œ99ž9ŸÑ@|N@}Ô9œ99ž9Ÿ€@~N@Ô9œ99ž9Ÿq@€N@Ô9œ99ž9Ÿ*@‚N@ƒÔ9œ99ž9Ÿ ÿ@„N@…Ô9œ99ž9Ÿ@†N@‡Ô9œ99ž9Ÿ ­@ˆN@‰Ô9œ99ž9ŸÐ@ŠN@‹Ô9œ99ž9Ÿp@ŒN@Ô9œ99ž9ŸÏ@ŽN@Ô9œ99ž9Ÿ@N@‘Ô9œ99ž9Ÿâ@’N@“Ô9œ99ž9Ÿá@”N@•Ô9œ99ž9ŸÎ@–N@—Ô9œ99ž9Ÿ@˜N@™Ô9œ99ž9Ÿà@šN@›Ô9œ99ž9Ÿß@œN@Ô9œ99ž9ŸÞ@žN@ŸÔ9œ99ž9ŸÍ@ N@¡Ô9œ99ž9Ÿ‚@¢N@£Ô9œ99ž9ŸÝ@¤N@¥Ô9œ99ž9ŸÜ@¦N@§Ô9œ99ž9ŸÌ@¨N@©Ô9œ99ž9ŸÛ@ªN@«Ô9œ99ž9ŸË@¬N@­Ô9œ99ž9ŸÚ@®N@¯Ô9œ99ž9ŸÊ@°N@±Ô9œ99ž9ŸÉ@²N@³Ô9œ99ž9ŸÙ@´N@µÔ9œ99ž9ŸÈ@¶N@·Ô9œ99ž9ŸÇ@¸N@¹Ô9œ99ž9ŸØ@ºN@»Ô9œ99ž9Ÿƒ@¼N@½Ô9œ99ž9Ÿ„@¾N@¿Ô9œ99ž9Ÿ…@ÀN@ÁÔ9œ99ž9Ÿ†@ÂN@ÃÔ9œ99ž9Ÿ‡@ÄN@ÅÔ9œ99ž9Ÿˆ@ÆN@ÇÔ9œ99ž9Ÿ‰@ÈN@ÉÔ9œ99ž9Ÿ×@ÊN@ËÔ9œ99ž9ŸÖ@ÌN@ÍÔ9œ99ž9Ÿ ¬@ÎN@ÏÔ9œ99ž9Ÿõ@ÐN@ÑÔ9œ99ž9Ÿ «@ÒN@ÓÔ9œ99ž9ŸŠ@ÔN@ÕÔ9œ99ž9ŸÕ@ÖN@×Ô9œ99ž9Ÿ‹@ØN@ÙÔ9œ99ž9ŸÔ@ÚN@ÛÔ9œ99ž9Ÿ ª@ÜN@ÝÔ9œ99ž9Ÿo@ÞN@ßÔ9œ99ž9Ÿ ©@àN@áÔ9œ99ž9ŸŒ@âN@ãÔ9œ99ž9Ÿ@äN@åÔ9œ99ž9ŸÆ@æN@çÔ9œ99ž9ŸŽ@èN@éÔ9œ99ž9Ÿn@êN@ëÔ9œ99ž9Ÿm@ìN@íÔ9œ99ž9Ÿ ¨@îN@ïÔ9œ99ž9Ÿl@ðN@ñÔ9œ99ž9Ÿô@òN@óÔ9œ99ž9Ÿ@ôN@õÔ9œ99ž9Ÿó@öN@÷Ô9œ99ž9Ÿk@øN@ùÔ9œ99ž9Ÿò@úN@ûÔ9œ99ž9Ÿ@üN@ýÔ9œ99ž9Ÿñ@þN@ÿÔ9œ99ž9ŸjANAÔ9œ99ž9ŸÓANAÔ9œ99ž9Ÿ‘ANAÔ9œ99ž9ŸðANAÔ9œ99ž9ŸÒANA Ô9œ99ž9Ÿ’A NA Ô9œ99ž9ŸïA NA Ô9œ99ž9ŸîANAÔ9œ99ž9Ÿ“ANAÔ9œ99ž9ŸíANAÔ9œ99ž9ŸÑANAÔ9œ99ž9Ÿ”ANAÔ9œ99ž9ŸiANAÔ9œ99ž9Ÿ•ANAÔ9œ99ž9Ÿ–ANAÔ9œ99ž9ŸhANAÔ9œ99ž9ŸgA NA!Ô9œ99ž9ŸÐA"NA#Ô9œ99ž9ŸfA$NA%Ô9œ99ž9ŸÅA&NA'Ô9œ99ž9ŸeA(NA)Ô9œ99ž9ŸÏA*NA+Ô9œ99ž9ŸÎA,NA-Ô9œ99ž9ŸÍA.NA/Ô9œ99ž9Ÿ.A0NA1Ô9œ99ž9Ÿ—A2NA3Ô9œ99ž9ŸÌA4NA5Ô9œ99ž9ŸìA6NA7Ô9œ99ž9Ÿ˜A8NA9Ô9œ99ž9ŸËA:NA;Ô9œ99ž9Ÿ §A<NA=Ô9œ99ž9Ÿ™A>NA?Ô9œ99ž9ŸšA@NAAÔ9œ99ž9ŸëABNACÔ9œ99ž9ŸÄADNAEÔ9œ99ž9ŸêAFNAGÔ9œ99ž9Ÿ›AHNAIÔ9œ99ž9ŸÃAJNAKÔ9œ99ž9ŸœALNAMÔ9œ99ž9ŸéANNAOÔ9œ99ž9ŸAPNAQÔ9œ99ž9ŸÊARNASÔ9œ99ž9Ÿ ¦ATNAUÔ9œ99ž9ŸÂAVNAWÔ9œ99ž9Ÿ ¥AXNAYÔ9œ99ž9ŸžAZNA[Ô9œ99ž9ŸdA\NA]Ô9œ99ž9ŸŸA^NA_Ô9œ99ž9Ÿ A`NAaÔ9œ99ž9Ÿ¡AbNAcÔ9œ99ž9Ÿ ¤AdNAeÔ9œ99ž9ŸÁAfNAgÔ9œ99ž9Ÿ £AhNAiÔ9œ99ž9ŸÀAjNAkÔ9œ99ž9ŸèAlNAmÔ9œ99ž9ŸcAnNAoÔ9œ99ž9ŸbApNAqÔ9œ99ž9ŸçArNAsÔ9œ99ž9Ÿ¢AtNAuÔ9œ99ž9Ÿ¿AvNAwÔ9œ99ž9Ÿ¾AxNAyÔ9œ99ž9Ÿ£AzNA{Ô9œ99ž9Ÿ½A|NA}Ô9œ99ž9ŸæA~NAÔ9œ99ž9Ÿ¼A€NAÔ9œ99ž9Ÿ»A‚NAƒÔ9œ99ž9ŸaA„NA…Ô9œ99ž9Ÿ¤A†NA‡Ô9œ99ž9ŸÉAˆNA‰Ô9œ99ž9Ÿ ¢AŠNA‹Ô9œ99ž9Ÿ¥AŒNAÔ9œ99ž9Ÿ`AŽNAÔ9œ99ž9Ÿ¦ANA‘Ô9œ99ž9Ÿ§A’NA“Ô9œ99ž9Ÿ_A”NA•Ô9œ99ž9Ÿ¨A–NA—Ô9œ99ž9ŸÈA˜NA™Ô9œ99ž9ŸåAšNA›Ô9œ99ž9ŸºAœNAÔ9œ99ž9ŸäAžNAŸÔ9œ99ž9Ÿ¹A NA¡Ô9œ99ž9ŸÇA¢NA£Ô9œ99ž9ŸãA¤NA¥Ô9œ99ž9ŸÆA¦NA§Ô9œ99ž9Ÿ^A¨NA©Ô9œ99ž9ŸâAªNA«Ô9œ99ž9Ÿ ¡A¬NA­Ô9œ99ž9ŸÅA®NA¯Ô9œ99ž9Ÿ]A°NA±Ô9œ99ž9ŸáA²NA³Ô9œ99ž9ŸàA´NAµÔ9œ99ž9ŸÄA¶NA·Ô9œ99ž9Ÿ\A¸NA¹Ô9œ99ž9Ÿ¸AºNA»Ô9œ99ž9Ÿ[A¼NA½Ô9œ99ž9Ÿ  A¾NA¿Ô9œ99ž9Ÿ·AÀNAÁÔ9œ99ž9ŸßAÂNAÃÔ9œ99ž9ŸZAÄNAÅÔ9œ99ž9Ÿ¶AÆNAÇÔ9œ99ž9ŸYAÈNAÉÔ9œ99ž9ŸµAÊNAËÔ9œ99ž9ŸÞAÌNAÍÔ9œ99ž9Ÿ ŸAÎNAÏÔ9œ99ž9Ÿ žAÐNAÑÔ9œ99ž9Ÿ©AÒNAÓÔ9œ99ž9ŸªAÔNAÕÔ9œ99ž9Ÿ´AÖNA×Ô9œ99ž9Ÿ³AØNAÙÔ9œ99ž9ŸÝAÚNAÛÔ9œ99ž9ŸÜAÜNAÝÔ9œ99ž9Ÿ«AÞNAßÔ9œ99ž9Ÿ¬AàNAáÔ9œ99ž9ŸÛAâNAãÔ9œ99ž9Ÿ­AäNAåÔ9œ99ž9Ÿ®AæNAçÔ9œ99ž9Ÿ¯AèNAéÔ9œ99ž9ŸÚAêNAëÔ9œ99ž9Ÿ°AìNAíÔ9œ99ž9ŸÙAîNAïÔ9œ99ž9Ÿ±AðNAñÔ9œ99ž9ŸÃAòNAóÔ9œ99ž9Ÿ²AôNAõÔ9œ99ž9Ÿ²AöNA÷Ô9œ99ž9ŸØAøNAùÔ9œ99ž9Ÿ±AúNAûÔ9œ99ž9ŸXAüNAýÔ9œ99ž9Ÿ°AþNAÿÔ9œ99ž9Ÿ×BNBÔ9œ99ž9Ÿ¯BNBÔ9œ99ž9ŸWBNBÔ9œ99ž9ŸÖBNBÔ9œ99ž9ŸÕBNB Ô9œ99ž9ŸÂB NB Ô9œ99ž9Ÿ³B NB Ô9œ99ž9Ÿ®BNBÔ9œ99ž9ŸÔBNBÔ9œ99ž9ŸÁBNBÔ9œ99ž9Ÿ BNBÔ9œ99ž9Ÿ´BNBÔ9œ99ž9ŸÓBNBÔ9œ99ž9ŸÀBNBÔ9œ99ž9ŸÒBNBÔ9œ99ž9Ÿ œBNBÔ9œ99ž9ŸÑB NB!Ô9œ99ž9Ÿ ›B"NB#Ô9œ99ž9ŸÐB$NB%Ô9œ99ž9Ÿ¿B&NB'Ô9œ99ž9Ÿ šB(NB)Ô9œ99ž9ŸÏB*NB+Ô9œ99ž9Ÿ¾B,NB-Ô9œ99ž9Ÿ ™B.NB/Ô9œ99ž9Ÿ ˜B0NB1Ô9œ99ž9Ÿ —B2NB3Ô9œ99ž9ŸµB4NB5Ô9œ99ž9ŸÎB6NB7Ô9œ99ž9ŸÍB8NB9Ô9œ99ž9ŸÌB:NB;Ô9œ99ž9Ÿ¶B<NB=Ô9œ99ž9ŸËB>NB?Ô9œ99ž9Ÿ –B@NBAÔ9œ99ž9Ÿ •BBNBCÔ9œ99ž9Ÿ·BDNBEÔ9œ99ž9Ÿ­BFNBGÔ9œ99ž9Ÿ¬BHNBIÔ9œ99ž9Ÿ ”BJNBKÔ9œ99ž9Ÿ«BLNBMÔ9œ99ž9Ÿ½BNNBOÔ9œ99ž9ŸªBPNBQÔ9œ99ž9Ÿ “BRNBSÔ9œ99ž9Ÿ©BTNBUÔ9œ99ž9Ÿ ’BVNBWÔ9œ99ž9Ÿ¨BXNBYÔ9œ99ž9ŸÊBZNB[Ô9œ99ž9ŸVB\NB]Ô9œ99ž9Ÿ ‘B^NB_Ô9œ99ž9Ÿ¼B`NBaÔ9œ99ž9ŸUBbNBcÔ9œ99ž9ŸTBdNBeÔ9œ99ž9Ÿ§BfNBgÔ9œ99ž9ŸÉBhNBiÔ9œ99ž9Ÿ»BjNBkÔ9œ99ž9ŸSBlNBmÔ9œ99ž9Ÿ¦BnNBoÔ9œ99ž9ŸºBpNBqÔ9œ99ž9ŸRBrNBsÔ9œ99ž9ŸÈBtNBuÔ9œ99ž9Ÿ BvNBwÔ9œ99ž9ŸÇBxNByÔ9œ99ž9ŸQBzNB{Ô9œ99ž9Ÿ B|NB}Ô9œ99ž9ŸPB~NBÔ9œ99ž9Ÿ¸B€NBÔ9œ99ž9ŸOB‚NBƒÔ9œ99ž9Ÿ¥B„NB…Ô9œ99ž9Ÿ¤B†NB‡Ô9œ99ž9ŸNBˆNB‰Ô9œ99ž9ŸÆBŠNB‹Ô9œ99ž9Ÿ ŽBŒNBÔ9œ99ž9ŸÅBŽNBÔ9œ99ž9ŸMBNB‘Ô9œ99ž9Ÿ¹B’NB“Ô9œ99ž9ŸºB”NB•Ô9œ99ž9Ÿ£B–NB—Ô9œ99ž9ŸÄB˜NB™Ô9œ99ž9ŸÃBšNB›Ô9œ99ž9ŸÂBœNBÔ9œ99ž9ŸLBžNBŸÔ9œ99ž9Ÿ¢B NB¡Ô9œ99ž9ŸÁB¢NB£Ô9œ99ž9Ÿ B¤NB¥Ô9œ99ž9ŸÀB¦NB§Ô9œ99ž9Ÿ ŒB¨NB©Ô9œ99ž9Ÿ»BªNB«Ô9œ99ž9ŸKB¬NB­Ô9œ99ž9Ÿ¿B®NB¯Ô9œ99ž9Ÿ¾B°NB±Ô9œ99ž9Ÿ½B²NB³Ô9œ99ž9ŸJB´NBµÔ9œ99ž9Ÿ¼B¶NB·Ô9œ99ž9Ÿ»B¸NB¹Ô9œ99ž9ŸIBºNB»Ô9œ99ž9ŸºB¼NB½Ô9œ99ž9ŸHB¾NB¿Ô9œ99ž9Ÿ¹BÀNBÁÔ9œ99ž9Ÿ¸BÂNBÃÔ9œ99ž9Ÿ¡BÄNBÅÔ9œ99ž9Ÿ BÆNBÇÔ9œ99ž9ŸGBÈNBÉÔ9œ99ž9ŸFBÊNBËÔ9œ99ž9ŸEBÌNBÍÔ9œ99ž9Ÿ·BÎNBÏÔ9œ99ž9Ÿ¹BÐNBÑÔ9œ99ž9Ÿ¶BÒNBÓÔ9œ99ž9ŸŸBÔNBÕÔ9œ99ž9Ÿ¼BÖNB×Ô9œ99ž9ŸµBØNBÙÔ9œ99ž9Ÿ½BÚNBÛÔ9œ99ž9ŸžBÜNBÝÔ9œ99ž9Ÿ´BÞNBßÔ9œ99ž9ŸDBàNBáÔ9œ99ž9Ÿ¾BâNBãÔ9œ99ž9Ÿ³BäNBåÔ9œ99ž9Ÿ ‹BæNBçÔ9œ99ž9Ÿ¿BèNBéÔ9œ99ž9Ÿ²BêNBëÔ9œ99ž9ŸÀBìNBíÔ9œ99ž9Ÿ±BîNBïÔ9œ99ž9Ÿ°BðNBñÔ9œ99ž9Ÿ¯BòNBóÔ9œ99ž9Ÿ®BôNBõÔ9œ99ž9Ÿ­BöNB÷Ô9œ99ž9Ÿ¬BøNBùÔ9œ99ž9Ÿ«BúNBûÔ9œ99ž9ŸªBüNBýÔ9œ99ž9ŸÁBþNBÿÔ9œ99ž9Ÿ©CNCÔ9œ99ž9ŸÂCNCÔ9œ99ž9Ÿ¨CNCÔ9œ99ž9Ÿ§CNCÔ9œ99ž9ŸCCNC Ô9œ99ž9Ÿ¦C NC Ô9œ99ž9ŸÃC NC Ô9œ99ž9Ÿ ŠCNCÔ9œ99ž9ŸCNCÔ9œ99ž9Ÿ¥CNCÔ9œ99ž9ŸÄCNCÔ9œ99ž9ŸœCNCÔ9œ99ž9Ÿ¤CNCÔ9œ99ž9Ÿ›CNCÔ9œ99ž9Ÿ£CNCÔ9œ99ž9ŸBCNCÔ9œ99ž9Ÿ¢C NC!Ô9œ99ž9ŸAC"NC#Ô9œ99ž9ŸÅC$NC%Ô9œ99ž9Ÿ@C&NC'Ô9œ99ž9Ÿ¡C(NC)Ô9œ99ž9ŸÆC*NC+Ô9œ99ž9Ÿ C,NC-Ô9œ99ž9Ÿ ‰C.NC/Ô9œ99ž9ŸŸC0NC1Ô9œ99ž9ŸÇC2NC3Ô9œ99ž9Ÿ¸C4NC5Ô9œ99ž9ŸÈC6NC7Ô9œ99ž9ŸÉC8NC9Ô9œ99ž9Ÿ·C:NC;Ô9œ99ž9ŸÊC<NC=Ô9œ99ž9ŸžC>NC?Ô9œ99ž9ŸC@NCAÔ9œ99ž9ŸœCBNCCÔ9œ99ž9Ÿ›CDNCEÔ9œ99ž9ŸšCFNCGÔ9œ99ž9Ÿ™CHNCIÔ9œ99ž9ŸËCJNCKÔ9œ99ž9Ÿ¶CLNCMÔ9œ99ž9ŸµCNNCOÔ9œ99ž9ŸšCPNCQÔ9œ99ž9Ÿ˜CRNCSÔ9œ99ž9Ÿ ˆCTNCUÔ9œ99ž9ŸÌCVNCWÔ9œ99ž9Ÿ ‡CXNCYÔ9œ99ž9Ÿ †CZNC[Ô9œ99ž9ŸÍC\NC]Ô9œ99ž9Ÿ´C^NC_Ô9œ99ž9Ÿ?C`NCaÔ9œ99ž9Ÿ—CbNCcÔ9œ99ž9Ÿ³CdNCeÔ9œ99ž9Ÿ™CfNCgÔ9œ99ž9Ÿ–ChNCiÔ9œ99ž9Ÿ …CjNCkÔ9œ99ž9Ÿ²ClNCmÔ9œ99ž9Ÿ „CnNCoÔ9œ99ž9Ÿ>CpNCqÔ9œ99ž9Ÿ ƒCrNCsÔ9œ99ž9Ÿ˜CtNCuÔ9œ99ž9Ÿ=CvNCwÔ9œ99ž9Ÿ ‚CxNCyÔ9œ99ž9ŸÎCzNC{Ô9œ99ž9ŸÏC|NC}Ô9œ99ž9Ÿ C~NCÔ9œ99ž9Ÿ•C€NCÔ9œ99ž9ŸÐC‚NCƒÔ9œ99ž9ŸÑC„NC…Ô9œ99ž9ŸND?Ô9œ99ž9Ÿ uD@NDAÔ9œ99ž9ŸvDBNDCÔ9œ99ž9ŸuDDNDEÔ9œ99ž9Ÿ tDFNDGÔ9œ99ž9ŸtDHNDIÔ9œ99ž9ŸsDJNDKÔ9œ99ž9ŸrDLNDMÔ9œ99ž9Ÿ%DNNDOÔ9œ99ž9ŸqDPNDQÔ9œ99ž9Ÿ$DRNDSÔ9œ99ž9ŸpDTNDUÔ9œ99ž9Ÿ#DVNDWÔ9œ99ž9Ÿ sDXNDYÔ9œ99ž9ŸàDZND[Ô9œ99ž9Ÿ"D\ND]Ô9œ99ž9ŸáD^ND_Ô9œ99ž9ŸD`NDaÔ9œ99ž9Ÿ©DbNDcÔ9œ99ž9ŸâDdNDeÔ9œ99ž9ŸãDfNDgÔ9œ99ž9ŸäDhNDiÔ9œ99ž9ŸDjNDkÔ9œ99ž9ŸŽDlNDmÔ9œ99ž9ŸåDnNDoÔ9œ99ž9Ÿ!DpNDqÔ9œ99ž9Ÿ DrNDsÔ9œ99ž9ŸæDtNDuÔ9œ99ž9ŸDvNDwÔ9œ99ž9ŸDxNDyÔ9œ99ž9Ÿ rDzND{Ô9œ99ž9ŸçD|ND}Ô9œ99ž9Ÿ¨D~NDÔ9œ99ž9ŸoD€NDÔ9œ99ž9Ÿ qD‚NDƒÔ9œ99ž9Ÿ6D„ND…Ô9œ99ž9Ÿ pD†ND‡Ô9œ99ž9Ÿ oDˆND‰Ô9œ99ž9ŸDŠND‹Ô9œ99ž9ŸDŒNDÔ9œ99ž9ŸèDŽNDÔ9œ99ž9Ÿ nDND‘Ô9œ99ž9ŸŒD’ND“Ô9œ99ž9Ÿ‹D”ND•Ô9œ99ž9ŸéD–ND—Ô9œ99ž9ŸŠD˜ND™Ô9œ99ž9Ÿ mDšND›Ô9œ99ž9Ÿ‰DœNDÔ9œ99ž9Ÿ§DžNDŸÔ9œ99ž9ŸD ND¡Ô9œ99ž9ŸêD¢ND£Ô9œ99ž9ŸˆD¤ND¥Ô9œ99ž9Ÿ‡D¦ND§Ô9œ99ž9Ÿ¦D¨ND©Ô9œ99ž9ŸëDªND«Ô9œ99ž9ŸD¬ND­Ô9œ99ž9ŸìD®ND¯Ô9œ99ž9Ÿ†D°ND±Ô9œ99ž9ŸD²ND³Ô9œ99ž9ŸíD´NDµÔ9œ99ž9Ÿ…D¶ND·Ô9œ99ž9Ÿ„D¸ND¹Ô9œ99ž9ŸnDºND»Ô9œ99ž9Ÿ¥D¼ND½Ô9œ99ž9ŸƒD¾ND¿Ô9œ99ž9ŸmDÀNDÁÔ9œ99ž9ŸDÂNDÃÔ9œ99ž9ŸlDÄNDÅÔ9œ99ž9ŸDÆNDÇÔ9œ99ž9ŸDÈNDÉÔ9œ99ž9Ÿ‚DÊNDËÔ9œ99ž9ŸDÌNDÍÔ9œ99ž9ŸDÎNDÏÔ9œ99ž9ŸDÐNDÑÔ9œ99ž9Ÿ€DÒNDÓÔ9œ99ž9ŸkDÔNDÕÔ9œ99ž9ŸîDÖND×Ô9œ99ž9ŸDØNDÙÔ9œ99ž9Ÿ~DÚNDÛÔ9œ99ž9ŸjDÜNDÝÔ9œ99ž9Ÿ lDÞNDßÔ9œ99ž9ŸïDàNDáÔ9œ99ž9ŸiDâNDãÔ9œ99ž9ŸDäNDåÔ9œ99ž9ŸðDæNDçÔ9œ99ž9Ÿ kDèNDéÔ9œ99ž9ŸñDêNDëÔ9œ99ž9Ÿ}DìNDíÔ9œ99ž9ŸòDîNDïÔ9œ99ž9Ÿ|DðNDñÔ9œ99ž9ŸóDòNDóÔ9œ99ž9ŸôDôNDõÔ9œ99ž9Ÿ{DöND÷Ô9œ99ž9Ÿ jDøNDùÔ9œ99ž9ŸzDúNDûÔ9œ99ž9ŸDüNDýÔ9œ99ž9Ÿ iDþNDÿÔ9œ99ž9Ÿ hENEÔ9œ99ž9Ÿ¤ENEÔ9œ99ž9Ÿ gENEÔ9œ99ž9Ÿ fENEÔ9œ99ž9ŸyENE Ô9œ99ž9ŸhE NE Ô9œ99ž9Ÿ£E NE Ô9œ99ž9ŸxENEÔ9œ99ž9Ÿ¢ENEÔ9œ99ž9Ÿ eENEÔ9œ99ž9ŸwENEÔ9œ99ž9ŸENEÔ9œ99ž9ŸõENEÔ9œ99ž9ŸENEÔ9œ99ž9ŸöENEÔ9œ99ž9ŸvENEÔ9œ99ž9ŸE NE!Ô9œ99ž9Ÿ÷E"NE#Ô9œ99ž9ŸuE$NE%Ô9œ99ž9ŸøE&NE'Ô9œ99ž9ŸtE(NE)Ô9œ99ž9Ÿ dE*NE+Ô9œ99ž9ŸùE,NE-Ô9œ99ž9ŸgE.NE/Ô9œ99ž9ŸsE0NE1Ô9œ99ž9ŸE2NE3Ô9œ99ž9ŸúE4NE5Ô9œ99ž9Ÿ cE6NE7Ô9œ99ž9ŸûE8NE9Ô9œ99ž9ŸE:NE;Ô9œ99ž9Ÿ¡E<NE=Ô9œ99ž9Ÿ E>NE?Ô9œ99ž9ŸüE@NEAÔ9œ99ž9ŸŸEBNECÔ9œ99ž9ŸžEDNEEÔ9œ99ž9Ÿ EFNEGÔ9œ99ž9ŸrEHNEIÔ9œ99ž9Ÿ bEJNEKÔ9œ99ž9ŸqELNEMÔ9œ99ž9ŸENNEOÔ9œ99ž9Ÿ aEPNEQÔ9œ99ž9ŸœERNESÔ9œ99ž9Ÿ `ETNEUÔ9œ99ž9ŸpEVNEWÔ9œ99ž9Ÿ›EXNEYÔ9œ99ž9Ÿ EZNE[Ô9œ99ž9Ÿ E\NE]Ô9œ99ž9ŸšE^NE_Ô9œ99ž9Ÿ E`NEaÔ9œ99ž9Ÿ™EbNEcÔ9œ99ž9Ÿ EdNEeÔ9œ99ž9ŸEfNEgÔ9œ99ž9ŸEhNEiÔ9œ99ž9Ÿ _EjNEkÔ9œ99ž9ŸElNEmÔ9œ99ž9ŸEnNEoÔ9œ99ž9ŸoEpNEqÔ9œ99ž9ŸfErNEsÔ9œ99ž9ŸýEtNEuÔ9œ99ž9Ÿ ^EvNEwÔ9œ99ž9ŸnExNEyÔ9œ99ž9ŸþEzNE{Ô9œ99ž9ŸE|NE}Ô9œ99ž9ŸÿE~NEÔ9œ99ž9ŸmE€NEÔ9œ99ž9ŸE‚NEƒÔ9œ99ž9ŸlE„NE…Ô9œ99ž9Ÿ ]E†NE‡Ô9œ99ž9ŸkEˆNE‰Ô9œ99ž9ŸEŠNE‹Ô9œ99ž9ŸEŒNEÔ9œ99ž9ŸEŽNEÔ9œ99ž9ŸENE‘Ô9œ99ž9ŸjE’NE“Ô9œ99ž9Ÿ \E”NE•Ô9œ99ž9ŸE–NE—Ô9œ99ž9Ÿ˜E˜NE™Ô9œ99ž9ŸEšNE›Ô9œ99ž9Ÿ [EœNEÔ9œ99ž9ŸEžNEŸÔ9œ99ž9Ÿ ZE NE¡Ô9œ99ž9Ÿ—E¢NE£Ô9œ99ž9Ÿ YE¤NE¥Ô9œ99ž9Ÿ–E¦NE§Ô9œ99ž9Ÿ XE¨NE©Ô9œ99ž9ŸeEªNE«Ô9œ99ž9Ÿ•E¬NE­Ô9œ99ž9ŸE®NE¯Ô9œ99ž9Ÿ WE°NE±Ô9œ99ž9ŸiE²NE³Ô9œ99ž9ŸhE´NEµÔ9œ99ž9Ÿ”E¶NE·Ô9œ99ž9Ÿ VE¸NE¹Ô9œ99ž9ŸgEºNE»Ô9œ99ž9ŸfE¼NE½Ô9œ99ž9ŸdE¾NE¿Ô9œ99ž9Ÿ UEÀNEÁÔ9œ99ž9ŸcEÂNEÃÔ9œ99ž9ŸbEÄNEÅÔ9œ99ž9ŸEÆNEÇÔ9œ99ž9ŸEÈNEÉÔ9œ99ž9ŸaEÊNEËÔ9œ99ž9ŸeEÌNEÍÔ9œ99ž9ŸdEÎNEÏÔ9œ99ž9ŸEÐNEÑÔ9œ99ž9ŸEÒNEÓÔ9œ99ž9ŸÿEÔNEÕÔ9œ99ž9Ÿ“EÖNE×Ô9œ99ž9ŸþEØNEÙÔ9œ99ž9Ÿ TEÚNEÛÔ9œ99ž9Ÿ`EÜNEÝÔ9œ99ž9Ÿ SEÞNEßÔ9œ99ž9Ÿ_EàNEáÔ9œ99ž9ŸýEâNEãÔ9œ99ž9Ÿ EäNEåÔ9œ99ž9Ÿ^EæNEçÔ9œ99ž9Ÿ’EèNEéÔ9œ99ž9Ÿ]EêNEëÔ9œ99ž9Ÿ‘EìNEíÔ9œ99ž9Ÿ EîNEïÔ9œ99ž9ŸüEðNEñÔ9œ99ž9ŸEòNEóÔ9œ99ž9ŸûEôNEõÔ9œ99ž9Ÿ\EöNE÷Ô9œ99ž9ŸúEøNEùÔ9œ99ž9ŸùEúNEûÔ9œ99ž9Ÿ[EüNEýÔ9œ99ž9ŸcEþNEÿÔ9œ99ž9ŸZFNFÔ9œ99ž9ŸFNFÔ9œ99ž9Ÿ FNFÔ9œ99ž9ŸbFNFÔ9œ99ž9ŸYFNF Ô9œ99ž9Ÿ F NF Ô9œ99ž9ŸXF NF Ô9œ99ž9Ÿ RFNFÔ9œ99ž9Ÿ QFNFÔ9œ99ž9ŸaFNFÔ9œ99ž9Ÿ FNFÔ9œ99ž9Ÿ`FNFÔ9œ99ž9Ÿ PFNFÔ9œ99ž9ŸFNFÔ9œ99ž9Ÿ_FNFÔ9œ99ž9Ÿ^FNFÔ9œ99ž9Ÿ OF NF!Ô9œ99ž9Ÿ]F"NF#Ô9œ99ž9ŸWF$NF%Ô9œ99ž9ŸøF&NF'Ô9œ99ž9Ÿ NF(NF)Ô9œ99ž9ŸF*NF+Ô9œ99ž9Ÿ\F,NF-Ô9œ99ž9Ÿ÷F.NF/Ô9œ99ž9ŸF0NF1Ô9œ99ž9ŸöF2NF3Ô9œ99ž9ŸõF4NF5Ô9œ99ž9Ÿ MF6NF7Ô9œ99ž9ŸŽF8NF9Ô9œ99ž9Ÿ[F:NF;Ô9œ99ž9ŸF<NF=Ô9œ99ž9ŸZF>NF?Ô9œ99ž9ŸŒF@NFAÔ9œ99ž9Ÿ èFBNFCÔ9œ99ž9Ÿ LFDNFEÔ9œ99ž9ŸFFNFGÔ9œ99ž9ŸXFHNFIÔ9œ99ž9ŸVFJNFKÔ9œ99ž9ŸFLNFMÔ9œ99ž9ŸUFNNFOÔ9œ99ž9ŸTFPNFQÔ9œ99ž9Ÿ‹FRNFSÔ9œ99ž9ŸSFTNFUÔ9œ99ž9Ÿ êFVNFWÔ9œ99ž9ŸVFXNFYÔ9œ99ž9ŸôFZNF[Ô9œ99ž9ŸUF\NF]Ô9œ99ž9ŸóF^NF_Ô9œ99ž9ŸF`NFaÔ9œ99ž9ŸTFbNFcÔ9œ99ž9ŸòFdNFeÔ9œ99ž9ŸRFfNFgÔ9œ99ž9ŸFhNFiÔ9œ99ž9ŸSFjNFkÔ9œ99ž9ŸFlNFmÔ9œ99ž9Ÿ KFnNFoÔ9œ99ž9ŸFpNFqÔ9œ99ž9Ÿ JFrNFsÔ9œ99ž9ŸFtNFuÔ9œ99ž9Ÿ IFvNFwÔ9œ99ž9ŸFxNFyÔ9œ99ž9Ÿ HFzNF{Ô9œ99ž9ŸRF|NF}Ô9œ99ž9ŸF~NFÔ9œ99ž9ŸŠF€NFÔ9œ99ž9ŸQF‚NFƒÔ9œ99ž9ŸñF„NF…Ô9œ99ž9ŸF†NF‡Ô9œ99ž9ŸQFˆNF‰Ô9œ99ž9ŸðFŠNF‹Ô9œ99ž9ŸFŒNFÔ9œ99ž9ŸFŽNFÔ9œ99ž9ŸFNF‘Ô9œ99ž9ŸF’NF“Ô9œ99ž9ŸF”NF•Ô9œ99ž9Ÿ‰F–NF—Ô9œ99ž9Ÿ F˜NF™Ô9œ99ž9ŸˆFšNF›Ô9œ99ž9ŸPFœNFÔ9œ99ž9ŸOFžNFŸÔ9œ99ž9Ÿ!F NF¡Ô9œ99ž9Ÿ‡F¢NF£Ô9œ99ž9ŸïF¤NF¥Ô9œ99ž9Ÿ"F¦NF§Ô9œ99ž9Ÿ†F¨NF©Ô9œ99ž9ŸPFªNF«Ô9œ99ž9ŸOF¬NF­Ô9œ99ž9Ÿ…F®NF¯Ô9œ99ž9ŸNF°NF±Ô9œ99ž9ŸîF²NF³Ô9œ99ž9ŸNF´NFµÔ9œ99ž9Ÿ GF¶NF·Ô9œ99ž9ŸMF¸NF¹Ô9œ99ž9Ÿ FFºNF»Ô9œ99ž9Ÿ„F¼NF½Ô9œ99ž9ŸLF¾NF¿Ô9œ99ž9ŸƒFÀNFÁÔ9œ99ž9Ÿ‚FÂNFÃÔ9œ99ž9ŸKFÄNFÅÔ9œ99ž9ŸíFÆNFÇÔ9œ99ž9ŸìFÈNFÉÔ9œ99ž9ŸëFÊNFËÔ9œ99ž9ŸJFÌNFÍÔ9œ99ž9ŸIFÎNFÏÔ9œ99ž9ŸFÐNFÑÔ9œ99ž9ŸMFÒNFÓÔ9œ99ž9Ÿ€FÔNFÕÔ9œ99ž9ŸHFÖNF×Ô9œ99ž9ŸêFØNFÙÔ9œ99ž9Ÿ#FÚNFÛÔ9œ99ž9ŸFÜNFÝÔ9œ99ž9Ÿ EFÞNFßÔ9œ99ž9ŸéFàNFáÔ9œ99ž9Ÿ~FâNFãÔ9œ99ž9Ÿ$FäNFåÔ9œ99ž9Ÿ}FæNFçÔ9œ99ž9ŸGFèNFéÔ9œ99ž9ŸFFêNFëÔ9œ99ž9Ÿ DFìNFíÔ9œ99ž9ŸLFîNFïÔ9œ99ž9ŸèFðNFñÔ9œ99ž9ŸEFòNFóÔ9œ99ž9ŸçFôNFõÔ9œ99ž9Ÿ CFöNF÷Ô9œ99ž9Ÿ|FøNFùÔ9œ99ž9Ÿ%FúNFûÔ9œ99ž9Ÿ&FüNFýÔ9œ99ž9ŸKFþNFÿÔ9œ99ž9Ÿ BGNGÔ9œ99ž9Ÿ{GNGÔ9œ99ž9Ÿ AGNGÔ9œ99ž9ŸDGNGÔ9œ99ž9ŸæGNG Ô9œ99ž9Ÿ @G NG Ô9œ99ž9Ÿ'G NG Ô9œ99ž9ŸzGNGÔ9œ99ž9Ÿ ?GNGÔ9œ99ž9ŸåGNGÔ9œ99ž9ŸJGNGÔ9œ99ž9Ÿ(GNGÔ9œ99ž9ŸyGNGÔ9œ99ž9ŸäGNGÔ9œ99ž9Ÿ >GNGÔ9œ99ž9ŸxGNGÔ9œ99ž9ŸIG NG!Ô9œ99ž9Ÿ)G"NG#Ô9œ99ž9ŸCG$NG%Ô9œ99ž9Ÿ =G&NG'Ô9œ99ž9ŸBG(NG)Ô9œ99ž9ŸHG*NG+Ô9œ99ž9ŸAG,NG-Ô9œ99ž9Ÿ*G.NG/Ô9œ99ž9Ÿ@G0NG1Ô9œ99ž9ŸGG2NG3Ô9œ99ž9Ÿ+G4NG5Ô9œ99ž9Ÿ?G6NG7Ô9œ99ž9ŸFG8NG9Ô9œ99ž9Ÿ G>NG?Ô9œ99ž9ŸEG@NGAÔ9œ99ž9Ÿ ;GBNGCÔ9œ99ž9Ÿ=GDNGEÔ9œ99ž9ŸDGFNGGÔ9œ99ž9Ÿ :GHNGIÔ9œ99ž9Ÿ-GJNGKÔ9œ99ž9ŸwGLNGMÔ9œ99ž9ŸG–NG—Ô9œ99ž9Ÿ=G˜NG™Ô9œ99ž9ŸßGšNG›Ô9œ99ž9ŸGæNGçÔ9œ99ž9Ÿ?GèNGéÔ9œ99ž9Ÿ@GêNGëÔ9œ99ž9Ÿ ÕGìNGíÔ9œ99ž9ŸÕGîNGïÔ9œ99ž9ŸAGðNGñÔ9œ99ž9Ÿ8GòNGóÔ9œ99ž9ŸBGôNGõÔ9œ99ž9Ÿ.GöNG÷Ô9œ99ž9Ÿ-GøNGùÔ9œ99ž9Ÿ,GúNGûÔ9œ99ž9Ÿ+GüNGýÔ9œ99ž9Ÿ*GþNGÿÔ9œ99ž9Ÿ)HNHÔ9œ99ž9Ÿ(HNHÔ9œ99ž9Ÿ ÜHNHÔ9œ99ž9ŸCHNHÔ9œ99ž9Ÿ'HNH Ô9œ99ž9Ÿ&H NH Ô9œ99ž9Ÿ7H NH Ô9œ99ž9Ÿ6HNHÔ9œ99ž9ŸÔHNHÔ9œ99ž9Ÿ ÝHNHÔ9œ99ž9Ÿ%HNHÔ9œ99ž9ŸÓHNHÔ9œ99ž9Ÿ$HNHÔ9œ99ž9ŸÒHNHÔ9œ99ž9ŸrHNHÔ9œ99ž9ŸDHNHÔ9œ99ž9ŸEH NH!Ô9œ99ž9ŸÑH"NH#Ô9œ99ž9ŸqH$NH%Ô9œ99ž9ŸFH&NH'Ô9œ99ž9ŸGH(NH)Ô9œ99ž9ŸÐH*NH+Ô9œ99ž9Ÿ )H,NH-Ô9œ99ž9ŸHH.NH/Ô9œ99ž9ŸIH0NH1Ô9œ99ž9Ÿ (H2NH3Ô9œ99ž9ŸJH4NH5Ô9œ99ž9Ÿ ÞH6NH7Ô9œ99ž9ŸKH8NH9Ô9œ99ž9Ÿ+H:NH;Ô9œ99ž9ŸLH<NH=Ô9œ99ž9ŸÏH>NH?Ô9œ99ž9Ÿ5H@NHAÔ9œ99ž9Ÿ ßHBNHCÔ9œ99ž9Ÿ àHDNHEÔ9œ99ž9ŸÎHFNHGÔ9œ99ž9Ÿ 'HHNHIÔ9œ99ž9Ÿ4HJNHKÔ9œ99ž9Ÿ ÔHLNHMÔ9œ99ž9Ÿ &HNNHOÔ9œ99ž9ŸMHPNHQÔ9œ99ž9ŸÍHRNHSÔ9œ99ž9ŸÌHTNHUÔ9œ99ž9ŸNHVNHWÔ9œ99ž9ŸpHXNHYÔ9œ99ž9Ÿ %HZNH[Ô9œ99ž9Ÿ#H\NH]Ô9œ99ž9Ÿ3H^NH_Ô9œ99ž9Ÿ ÓH`NHaÔ9œ99ž9ŸOHbNHcÔ9œ99ž9Ÿ ÒHdNHeÔ9œ99ž9ŸËHfNHgÔ9œ99ž9Ÿ $HhNHiÔ9œ99ž9ŸPHjNHkÔ9œ99ž9ŸoHlNHmÔ9œ99ž9Ÿ #HnNHoÔ9œ99ž9ŸQHpNHqÔ9œ99ž9ŸnHrNHsÔ9œ99ž9ŸmHtNHuÔ9œ99ž9Ÿ2HvNHwÔ9œ99ž9Ÿ "HxNHyÔ9œ99ž9Ÿ1HzNH{Ô9œ99ž9ŸÊH|NH}Ô9œ99ž9Ÿ !H~NHÔ9œ99ž9Ÿ%H€WHÔ9œ99ž9ŸÉH‚NHƒÔ9Ÿ99ž9œH„H…9 Ô9œ99ž9ŸÈH†NH‡Ô9œ99ž9Ÿ HˆNH‰Ô9Ÿ99ž9œHŠH‹ Ô9œ99ž9Ÿ"HŒNHÔ9œ99ž9Ÿ0HŽNHÔ9œ99ž9Ÿ HNH‘Ô9œ99ž9ŸÇH’NH“Ô9œ99ž9ŸÆH”NH•Ô9œ99ž9ŸRH–NH—Ô9œ99ž9Ÿ!H˜NH™Ô9œ99ž9Ÿ HšNH›Ô9œ99ž9Ÿ HœNHÔ9œ99ž9Ÿ/HžNHŸÔ9œ99ž9Ÿ áH NH¡Ô9œ99ž9ŸÅH¢NH£Ô9œ99ž9Ÿ H¤NH¥Ô9œ99ž9Ÿ.H¦NH§Ô9œ99ž9ŸÄH¨NH©Ô9œ99ž9Ÿ-HªNH«Ô9œ99ž9Ÿ âH¬NH­Ô9œ99ž9Ÿ H®NH¯Ô9œ99ž9Ÿ H°NH±Ô9œ99ž9ŸSH²NH³Ô9œ99ž9Ÿ,H´NHµÔ9œ99ž9Ÿ ãH¶NH·Ô9œ99ž9ŸÃH¸NH¹Ô9œ99ž9ŸTHºNH»Ô9œ99ž9ŸÂH¼NH½Ô9œ99ž9ŸUH¾NH¿Ô9œ99ž9Ÿ+HÀNHÁÔ9œ99ž9Ÿ äHÂNHÃÔ9œ99ž9ŸlHÄNHÅÔ9œ99ž9Ÿ åHÆNHÇÔ9œ99ž9ŸVHÈNHÉÔ9œ99ž9ŸÁHÊNHËÔ9œ99ž9ŸWHÌNHÍÔ9œ99ž9ŸXHÎNHÏÔ9œ99ž9Ÿ*HÐNHÑÔ9œ99ž9ŸHÒNHÓÔ9œ99ž9Ÿ)HÔNHÕÔ9œ99ž9ŸÀHÖNH×Ô9œ99ž9Ÿ HØNHÙÔ9œ99ž9Ÿ HÚNHÛÔ9œ99ž9Ÿ æHÜNHÝÔ9œ99ž9Ÿ HÞNHßÔ9œ99ž9Ÿ çHàNHáÔ9œ99ž9Ÿ èHâNHãÔ9œ99ž9ŸYHäNHåÔ9œ99ž9ŸZHæNHçÔ9œ99ž9Ÿ[HèNHéÔ9œ99ž9Ÿ\HêNHëÔ9œ99ž9Ÿ(HìNHíÔ9œ99ž9Ÿ éHîNHïÔ9œ99ž9Ÿ HðNHñÔ9œ99ž9Ÿ HòNHóÔ9œ99ž9Ÿ]HôNHõÔ9œ99ž9Ÿ HöNH÷Ô9œ99ž9ŸkHøNHùÔ9œ99ž9ŸjHúNHûÔ9œ99ž9Ÿ HüNHýÔ9œ99ž9Ÿ HþNHÿÔ9œ99ž9Ÿ INIÔ9œ99ž9Ÿ'INIÔ9œ99ž9Ÿ¿INIÔ9œ99ž9Ÿ^INIÔ9œ99ž9Ÿ INI Ô9œ99ž9Ÿ I NI Ô9œ99ž9Ÿ¾I NI Ô9œ99ž9Ÿ½INIÔ9œ99ž9Ÿ_INIÔ9œ99ž9Ÿ&INIÔ9œ99ž9ŸINIÔ9œ99ž9Ÿ`INIÔ9œ99ž9ŸINIÔ9œ99ž9Ÿ%INIÔ9œ99ž9ŸiINIÔ9œ99ž9Ÿ$INIÔ9œ99ž9Ÿ#I NI!Ô9œ99ž9Ÿ¼I"NI#Ô9œ99ž9ŸhI$NI%Ô9œ99ž9ŸI&NI'Ô9œ99ž9Ÿ»I(NI)Ô9œ99ž9Ÿ"I*NI+Ô9œ99ž9Ÿ I,NI-Ô9œ99ž9Ÿ êI.NI/Ô9œ99ž9ŸgI0NI1Ô9œ99ž9Ÿ!I2NI3Ô9œ99ž9ŸaI4NI5Ô9œ99ž9Ÿ I6NI7Ô9œ99ž9ŸI8NI9Ô9œ99ž9ŸbI:NI;Ô9œ99ž9ŸºI<NI=Ô9œ99ž9ŸcI>NI?Ô9œ99ž9Ÿ I@NIAÔ9œ99ž9ŸfIBNICÔ9œ99ž9Ÿ ÎIDNIEÔ9œ99ž9ŸIFNIGÔ9œ99ž9Ÿ ÍIHNIIÔ9œ99ž9Ÿ IJNIKÔ9œ99ž9ŸILNIMÔ9œ99ž9ŸeINNIOÔ9œ99ž9Ÿ IPNIQÔ9œ99ž9ŸdIRNISÔ9œ99ž9Ÿ¹ITNIUÔ9œ99ž9ŸIVNIWÔ9œ99ž9Ÿ IXNIYÔ9œ99ž9Ÿ ÌIZNI[Ô9œ99ž9Ÿ I\NI]Ô9œ99ž9ŸI^NI_Ô9œ99ž9ŸI`NIaÔ9œ99ž9Ÿ IbNIcÔ9œ99ž9ŸIdNIeÔ9œ99ž9ŸIfNIgÔ9œ99ž9Ÿ ËIhNIiÔ9œ99ž9ŸIjNIkÔ9œ99ž9ŸIlNImÔ9œ99ž9Ÿ InNIoÔ9œ99ž9ŸdIpNIqÔ9œ99ž9ŸIrNIsÔ9œ99ž9ŸItNIuÔ9œ99ž9Ÿ ÊIvNIwÔ9œ99ž9Ÿ IxNIyÔ9œ99ž9ŸeIzNI{Ô9œ99ž9ŸI|NI}Ô9œ99ž9ŸfI~NIÔ9œ99ž9ŸI€NIÔ9œ99ž9ŸI‚NIƒÔ9œ99ž9ŸI„NI…Ô9œ99ž9ŸcI†NI‡Ô9œ99ž9ŸIˆNI‰Ô9œ99ž9Ÿ IŠNI‹Ô9œ99ž9Ÿ IŒNIÔ9œ99ž9ŸbIŽNIÔ9œ99ž9ŸINI‘Ô9œ99ž9ŸaI’NI“Ô9œ99ž9Ÿ ÉI”NI•Ô9œ99ž9Ÿ`I–NI—Ô9œ99ž9ŸI˜NI™Ô9œ99ž9ŸIšNI›Ô9œ99ž9Ÿ ÈIœNIÔ9œ99ž9Ÿ IžNIŸÔ9œ99ž9Ÿ I NI¡Ô9œ99ž9Ÿ I¢NI£Ô9œ99ž9Ÿ I¤NI¥Ô9œ99ž9Ÿ ÇI¦NI§Ô9œ99ž9ŸI¨NI©Ô9œ99ž9Ÿ IªNI«Ô9œ99ž9Ÿ I¬NI­Ô9œ99ž9ŸI®NI¯Ô9œ99ž9ŸI°NI±Ô9œ99ž9Ÿ I²NI³Ô9œ99ž9ŸgI´NIµÔ9œ99ž9Ÿ ÆI¶NI·Ô9œ99ž9ŸhI¸NI¹Ô9œ99ž9ŸIºNI»Ô9œ99ž9ŸiI¼NI½Ô9œ99ž9Ÿ ÅI¾NI¿Ô9œ99ž9Ÿ IÀNIÁÔ9œ99ž9Ÿ ÄIÂNIÃÔ9œ99ž9Ÿ IÄNIÅÔ9œ99ž9ŸjIÆNIÇÔ9œ99ž9Ÿ_IÈNIÉÔ9œ99ž9Ÿ ÃIÊNIËÔ9œ99ž9Ÿ^IÌNIÍÔ9œ99ž9ŸkIÎNIÏÔ9œ99ž9Ÿ ÂIÐNIÑÔ9œ99ž9ŸlIÒNIÓÔ9œ99ž9Ÿ]IÔNIÕÔ9œ99ž9ŸIÖNI×Ô9œ99ž9ŸIØNIÙÔ9œ99ž9Ÿ\IÚNIÛÔ9œ99ž9ŸIÜNIÝÔ9œ99ž9ŸIÞNIßÔ9œ99ž9Ÿ ÁIàNIáÔ9œ99ž9ŸIâNIãÔ9œ99ž9Ÿ IäNIåÔ9œ99ž9Ÿ ÀIæNIçÔ9œ99ž9Ÿ ¿IèNIéÔ9œ99ž9Ÿ ¾IêNIëÔ9œ99ž9ŸIìNIíÔ9œ99ž9ŸIîNIïÔ9œ99ž9ŸIðNIñÔ9œ99ž9Ÿ ½IòNIóÔ9œ99ž9ŸIôNIõÔ9œ99ž9Ÿ[IöNI÷Ô9œ99ž9ŸIøNIùÔ9œ99ž9ŸIúNIûÔ9œ99ž9ŸIüNIýÔ9œ99ž9ŸIþNIÿÔ9œ99ž9ŸJNJÔ9œ99ž9ŸJNJÔ9œ99ž9ŸJNJÔ9œ99ž9ŸJNJÔ9œ99ž9ŸmJNJ Ô9œ99ž9ŸnJ NJ Ô9œ99ž9ŸZJ NJ Ô9œ99ž9Ÿ JNJÔ9œ99ž9ŸJNJÔ9œ99ž9ŸoJNJÔ9œ99ž9ŸYJNJÔ9œ99ž9ŸJNJÔ9œ99ž9ŸpJNJÔ9œ99ž9ŸXJNJÔ9œ99ž9ŸJNJÔ9œ99ž9ŸqJNJÔ9œ99ž9Ÿ J NJ!Ô9œ99ž9ŸrJ"NJ#Ô9œ99ž9ŸJ$NJ%Ô9œ99ž9ŸJ&NJ'Ô9œ99ž9Ÿ ¼J(NJ)Ô9œ99ž9ŸsJ*NJ+Ô9œ99ž9ŸtJ,NJ-Ô9œ99ž9Ÿ ëJ.NJ/Ô9œ99ž9Ÿ J0NJ1Ô9œ99ž9ŸuJ2NJ3Ô9œ99ž9Ÿ J4NJ5Ô9œ99ž9Ÿ ìJ6NJ7Ô9œ99ž9Ÿ J8NJ9Ô9œ99ž9ŸvJ:NJ;Ô9œ99ž9ŸWJ<NJ=Ô9œ99ž9Ÿ J>NJ?Ô9œ99ž9Ÿ íJ@NJAÔ9œ99ž9ŸJBNJCÔ9œ99ž9ŸÿJDNJEÔ9œ99ž9Ÿ îJFNJGÔ9œ99ž9ŸJHNJIÔ9œ99ž9Ÿ!JJNJKÔ9œ99ž9ŸVJLNJMÔ9œ99ž9ŸJNNJOÔ9œ99ž9ŸJPNJQÔ9œ99ž9Ÿ ïJRNJSÔ9œ99ž9Ÿ ðJTNJUÔ9œ99ž9ŸJVNJWÔ9œ99ž9ŸþJXNJYÔ9œ99ž9Ÿ ñJZNJ[Ô9œ99ž9Ÿ"J\NJ]Ô9œ99ž9ŸJ^NJ_Ô9œ99ž9ŸJ`NJaÔ9œ99ž9Ÿ òJbNJcÔ9œ99ž9ŸJdNJeÔ9œ99ž9Ÿ#JfNJgÔ9œ99ž9ŸwJhNJiÔ9œ99ž9ŸUJjNJkÔ9œ99ž9Ÿ óJlNJmÔ9œ99ž9ŸTJnNJoÔ9œ99ž9ŸJpNJqÔ9œ99ž9ŸýJrNJsÔ9œ99ž9Ÿ$JtNJuÔ9œ99ž9ŸüJvNJwÔ9œ99ž9ŸJxNJyÔ9œ99ž9ŸJzNJ{Ô9œ99ž9ŸûJ|NJ}Ô9œ99ž9ŸJ~NJÔ9œ99ž9ŸJ€NJÔ9œ99ž9Ÿ ôJ‚NJƒÔ9œ99ž9ŸJ„NJ…Ô9œ99ž9ŸJ†NJ‡Ô9œ99ž9ŸJˆNJ‰Ô9œ99ž9Ÿ õJŠNJ‹Ô9œ99ž9ŸSJŒNJÔ9œ99ž9ŸJŽNJÔ9œ99ž9ŸJNJ‘Ô9œ99ž9Ÿ0J’NJ“Ô9œ99ž9Ÿ öJ”NJ•Ô9œ99ž9ŸúJ–NJ—Ô9œ99ž9ŸùJ˜NJ™Ô9œ99ž9Ÿ ÷JšNJ›Ô9œ99ž9ŸRJœNJÔ9œ99ž9Ÿ øJžNJŸÔ9œ99ž9Ÿ ùJ NJ¡Ô9œ99ž9Ÿ%J¢NJ£Ô9œ99ž9Ÿ úJ¤NJ¥Ô9œ99ž9Ÿ ûJ¦NJ§Ô9œ99ž9ŸJ¨NJ©Ô9œ99ž9Ÿ üJªNJ«Ô9œ99ž9ŸQJ¬NJ­Ô9œ99ž9ŸJ®NJ¯Ô9œ99ž9ŸÿJ°NJ±Ô9œ99ž9ŸPJ²NJ³Ô9œ99ž9ŸþJ´NJµÔ9œ99ž9Ÿ&J¶NJ·Ô9œ99ž9Ÿ ýJ¸NJ¹Ô9œ99ž9ŸOJºNJ»Ô9œ99ž9ŸýJ¼NJ½Ô9œ99ž9Ÿ J¾NJ¿Ô9œ99ž9ŸüJÀNJÁÔ9œ99ž9Ÿ þJÂNJÃÔ9œ99ž9ŸûJÄNJÅÔ9œ99ž9Ÿ'JÆNJÇÔ9œ99ž9ŸNJÈNJÉÔ9œ99ž9ŸúJÊNJËÔ9œ99ž9ŸxJÌNJÍÔ9œ99ž9ŸyJÎNJÏÔ9œ99ž9ŸMJÐNJÑÔ9œ99ž9Ÿ ÿJÒNJÓÔ9œ99ž9ŸzJÔNJÕÔ9œ99ž9ŸùJÖNJ×Ô9œ99ž9Ÿ{JØNJÙÔ9œ99ž9Ÿ JÚNJÛÔ9œ99ž9ŸøJÜNJÝÔ9œ99ž9Ÿ÷JÞNJßÔ9œ99ž9Ÿ|JàNJáÔ9œ99ž9Ÿ JâNJãÔ9œ99ž9Ÿ(JäNJåÔ9œ99ž9Ÿ JæNJçÔ9œ99ž9Ÿ}JèNJéÔ9œ99ž9ŸøJêNJëÔ9œ99ž9Ÿ÷JìNJíÔ9œ99ž9Ÿ JîNJïÔ9œ99ž9Ÿ)JðNJñÔ9œ99ž9Ÿ JòNJóÔ9œ99ž9Ÿ JôNJõÔ9œ99ž9Ÿ)JöNJ÷Ô9œ99ž9Ÿ JøNJùÔ9œ99ž9Ÿ*JúNJûÔ9œ99ž9ŸöJüNJýÔ9œ99ž9ŸLJþNJÿÔ9œ99ž9Ÿ »KNKÔ9œ99ž9Ÿ KNKÔ9œ99ž9Ÿ ºKNKÔ9œ99ž9Ÿ+KNKÔ9œ99ž9Ÿ KNK Ô9œ99ž9ŸKK NK Ô9œ99ž9Ÿ ¹K NK Ô9œ99ž9ŸKNKÔ9œ99ž9ŸõKNKÔ9œ99ž9ŸôKNKÔ9œ99ž9Ÿ ¸KNKÔ9œ99ž9Ÿ,KNKÔ9œ99ž9ŸóKNKÔ9œ99ž9Ÿ-KNKÔ9œ99ž9Ÿ ·KNKÔ9œ99ž9Ÿ.KNKÔ9œ99ž9ŸòK NK!Ô9œ99ž9Ÿ/K"NK#Ô9œ99ž9Ÿ~K$NK%Ô9œ99ž9ŸöK&NK'Ô9œ99ž9Ÿ ¶K(NK)Ô9œ99ž9ŸJK*NK+Ô9œ99ž9ŸK,NK-Ô9œ99ž9Ÿ µK.NK/Ô9œ99ž9Ÿ ´K0NK1Ô9œ99ž9ŸIK2NK3Ô9œ99ž9Ÿ0K4NK5Ô9œ99ž9ŸHK6NK7Ô9œ99ž9Ÿ ³K8NK9Ô9œ99ž9ŸõK:NK;Ô9œ99ž9ŸK<NK=Ô9œ99ž9Ÿ€K>NK?Ô9œ99ž9ŸGK@NKAÔ9œ99ž9Ÿ1KBNKCÔ9œ99ž9ŸKDNKEÔ9œ99ž9Ÿ ²KFNKGÔ9œ99ž9ŸôKHNKIÔ9œ99ž9ŸóKJNKKÔ9œ99ž9Ÿ ±KLNKMÔ9œ99ž9Ÿ2KNNKOÔ9œ99ž9ŸFKPNKQÔ9œ99ž9Ÿ‚KRNKSÔ9œ99ž9Ÿ °KTNKUÔ9œ99ž9ŸñKVNKWÔ9œ99ž9Ÿ ¯KXNKYÔ9œ99ž9ŸKZNK[Ô9œ99ž9Ÿ ®K\NK]Ô9œ99ž9ŸðK^NK_Ô9œ99ž9Ÿ3K`NKaÔ9œ99ž9ŸòKbNKcÔ9œ99ž9Ÿ ­KdNKeÔ9œ99ž9Ÿ ¬KfNKgÔ9œ99ž9ŸïKhNKiÔ9œ99ž9Ÿ «KjNKkÔ9œ99ž9ŸîKlNKmÔ9œ99ž9ŸEKnNKoÔ9œ99ž9ŸíKpNKqÔ9œ99ž9Ÿ ªKrNKsÔ9œ99ž9ŸìKtNKuÔ9œ99ž9Ÿ4KvNKwÔ9œ99ž9ŸëKxNKyÔ9œ99ž9Ÿ ©KzNK{Ô9œ99ž9ŸêK|NK}Ô9œ99ž9ŸK~NKÔ9œ99ž9Ÿ5K€NKÔ9œ99ž9ŸK‚NKƒÔ9œ99ž9Ÿ6K„NK…Ô9œ99ž9Ÿ ¨K†NK‡Ô9œ99ž9ŸƒKˆNK‰Ô9œ99ž9ŸKŠNK‹Ô9œ99ž9Ÿ„KŒNKÔ9œ99ž9Ÿ §KŽNKÔ9œ99ž9ŸñKNK‘Ô9œ99ž9Ÿ ¦K’NK“Ô9œ99ž9Ÿ…K”NK•Ô9œ99ž9ŸéK–NK—Ô9œ99ž9ŸèK˜NK™Ô9œ99ž9Ÿ7KšNK›Ô9œ99ž9Ÿ†KœNKÔ9œ99ž9Ÿ ¥KžNKŸÔ9œ99ž9ŸK NK¡Ô9œ99ž9ŸK¢NK£Ô9œ99ž9ŸçK¤NK¥Ô9œ99ž9ŸK¦NK§Ô9œ99ž9ŸÿK¨NK©Ô9œ99ž9Ÿ ¤KªNK«Ô9œ99ž9Ÿ8K¬NK­Ô9œ99ž9Ÿ9K®NK¯Ô9œ99ž9ŸðK°NK±Ô9œ99ž9Ÿ‡K²NK³Ô9œ99ž9Ÿ £K´NKµÔ9œ99ž9ŸþK¶NK·Ô9œ99ž9ŸýK¸NK¹Ô9œ99ž9ŸüKºNK»Ô9œ99ž9ŸûK¼NK½Ô9œ99ž9ŸïK¾NK¿Ô9œ99ž9ŸúKÀNKÁÔ9œ99ž9Ÿ:KÂNKÃÔ9œ99ž9ŸæKÄNKÅÔ9œ99ž9Ÿ ¢KÆNKÇÔ9œ99ž9Ÿ&KÈNKÉÔ9œ99ž9Ÿ ¡KÊNKËÔ9œ99ž9ŸåKÌNKÍÔ9œ99ž9ŸäKÎNKÏÔ9œ99ž9ŸãKÐNKÑÔ9œ99ž9Ÿ  KÒNKÓÔ9œ99ž9ŸùKÔNKÕÔ9œ99ž9Ÿ KÖNK×Ô9œ99ž9ŸøKØNKÙÔ9œ99ž9ŸîKÚNKÛÔ9œ99ž9ŸíKÜNKÝÔ9œ99ž9Ÿ KÞNKßÔ9œ99ž9ŸìKàNKáÔ9œ99ž9Ÿ;KâNKãÔ9œ99ž9Ÿ KäNKåÔ9œ99ž9Ÿ ŸKæNKçÔ9œ99ž9ŸëKèNKéÔ9œ99ž9ŸKøNKùÔ9œ99ž9Ÿ KúNKûÔ9œ99ž9Ÿ?KüNKýÔ9œ99ž9Ÿ ›KþNKÿÔ9œ99ž9ŸéLNLÔ9œ99ž9ŸèLNLÔ9œ99ž9Ÿ šLNLÔ9œ99ž9Ÿ ™LNLÔ9œ99ž9Ÿ‰LNL Ô9œ99ž9ŸçL NL Ô9œ99ž9Ÿ@L NL Ô9œ99ž9Ÿ ˜LNLÔ9œ99ž9Ÿ LNLÔ9œ99ž9ŸæLNLÔ9œ99ž9ŸALNLÔ9œ99ž9Ÿ LNLÔ9œ99ž9Ÿ —LNLÔ9œ99ž9ŸåLNLÔ9œ99ž9ŸäLNLÔ9œ99ž9ŸãLNLÔ9œ99ž9ŸBL NL!Ô9œ99ž9ŸâL"NL#Ô9œ99ž9Ÿ÷L$NL%Ô9œ99ž9Ÿ –L&NL'Ô9œ99ž9ŸöL(NL)Ô9œ99ž9Ÿ L*NL+Ô9œ99ž9Ÿ L,NL-Ô9œ99ž9ŸŠL.NL/Ô9œ99ž9Ÿ •L0NL1Ô9œ99ž9ŸáL2NL3Ô9œ99ž9ŸCL4NL5Ô9œ99ž9Ÿ L6NL7Ô9œ99ž9Ÿ ”L8NL9Ô9œ99ž9ŸàL:NL;Ô9œ99ž9Ÿ L<NL=Ô9œ99ž9Ÿ “L>NL?Ô9œ99ž9ŸßL@NLAÔ9œ99ž9Ÿ ’LBNLCÔ9œ99ž9ŸÞLDNLEÔ9œ99ž9ŸDLFNLGÔ9œ99ž9Ÿ‹LHNLIÔ9œ99ž9ŸÝLJNLKÔ9œ99ž9ŸELLNLMÔ9œ99ž9ŸŒLNNLOÔ9œ99ž9Ÿ ‘LPNLQÔ9œ99ž9ŸFLRNLSÔ9œ99ž9ŸÜLTNLUÔ9œ99ž9ŸLVNLWÔ9œ99ž9ŸŽLXNLYÔ9œ99ž9ŸõLZNL[Ô9œ99ž9ŸÛL\NL]Ô9œ99ž9ŸÚL^NL_Ô9œ99ž9ŸL`NLaÔ9œ99ž9ŸDLbNLcÔ9œ99ž9ŸôLdNLeÔ9œ99ž9ŸLfNLgÔ9œ99ž9ŸCLhNLiÔ9œ99ž9Ÿ LjNLkÔ9œ99ž9Ÿ‘LlNLmÔ9œ99ž9ŸÙLnNLoÔ9œ99ž9ŸØLpNLqÔ9œ99ž9ŸGLrNLsÔ9œ99ž9Ÿ’LtNLuÔ9œ99ž9ŸBLvNLwÔ9œ99ž9Ÿ×LxNLyÔ9œ99ž9ŸóLzNL{Ô9œ99ž9ŸHL|NL}Ô9œ99ž9Ÿ“L~NLÔ9œ99ž9Ÿ L€NLÔ9œ99ž9Ÿ”L‚NLƒÔ9œ99ž9ŸÖL„NL…Ô9œ99ž9Ÿ2L†NL‡Ô9œ99ž9ŸALˆNL‰Ô9œ99ž9ŸÕLŠNL‹Ô9œ99ž9Ÿ•LŒNLÔ9œ99ž9Ÿ–LŽNLÔ9œ99ž9ŸòLNL‘Ô9œ99ž9Ÿ L’NL“Ô9œ99ž9Ÿ—L”NL•Ô9œ99ž9Ÿ L–NL—Ô9œ99ž9Ÿ˜L˜NL™Ô9œ99ž9Ÿ LšNL›Ô9œ99ž9ŸñLœNLÔ9œ99ž9Ÿ™LžNLŸÔ9œ99ž9Ÿ L NL¡Ô9œ99ž9Ÿ L¢NL£Ô9œ99ž9ŸšL¤NL¥Ô9œ99ž9Ÿ L¦NL§Ô9œ99ž9ŸIL¨NL©Ô9œ99ž9Ÿ›LªNL«Ô9œ99ž9Ÿ L¬NL­Ô9œ99ž9Ÿ L®NL¯Ô9œ99ž9Ÿ L°NL±Ô9œ99ž9ŸœL²NL³Ô9œ99ž9Ÿ L´NLµÔ9œ99ž9ŸÔL¶NL·Ô9œ99ž9Ÿ L¸NL¹Ô9œ99ž9Ÿ LºNL»Ô9œ99ž9ŸÓL¼NL½Ô9œ99ž9Ÿ L¾NL¿Ô9œ99ž9ŸJLÀNLÁÔ9œ99ž9ŸLÂNLÃÔ9œ99ž9ŸžLÄNLÅÔ9œ99ž9ŸðLÆNLÇÔ9œ99ž9ŸÒLÈNLÉÔ9œ99ž9ŸKLÊNLËÔ9œ99ž9ŸŸLÌNLÍÔ9œ99ž9Ÿ LÎNLÏÔ9œ99ž9ŸïLÐNLÑÔ9œ99ž9ŸLLÒNLÓÔ9œ99ž9Ÿ LÔNLÕÔ9œ99ž9Ÿ LÖNL×Ô9œ99ž9Ÿ LØNLÙÔ9œ99ž9ŸîLÚNLÛÔ9œ99ž9ŸÑLÜNLÝÔ9œ99ž9ŸíLÞNLßÔ9œ99ž9ŸÐLàNLáÔ9œ99ž9ŸMLâNLãÔ9œ99ž9ŸìLäNLåÔ9œ99ž9ŸÏLæNLçÔ9œ99ž9Ÿ¡LèNLéÔ9œ99ž9ŸÎLêNLëÔ9œ99ž9Ÿ@LìNLíÔ9œ99ž9ŸëLîNLïÔ9œ99ž9ŸÍLðNLñÔ9œ99ž9ŸÌLòNLóÔ9œ99ž9ŸNLôNLõÔ9œ99ž9ŸêLöNL÷Ô9œ99ž9ŸËLøNLùÔ9œ99ž9ŸOLúNLûÔ9œ99ž9Ÿ?LüNLýÔ9œ99ž9ŸéLþNLÿÔ9œ99ž9ŸÊMNMÔ9œ99ž9Ÿ MNMÔ9œ99ž9Ÿ MNMÔ9œ99ž9Ÿ MNMÔ9œ99ž9Ÿ !MNM Ô9œ99ž9ŸèM NM Ô9œ99ž9Ÿ M NM Ô9œ99ž9ŸÉMNMÔ9œ99ž9Ÿ "MNMÔ9œ99ž9Ÿ MNMÔ9œ99ž9Ÿ MNMÔ9œ99ž9Ÿ¢MNMÔ9œ99ž9Ÿ MNMÔ9œ99ž9Ÿ #MNMÔ9œ99ž9Ÿ£MNMÔ9œ99ž9Ÿ>MNMÔ9œ99ž9Ÿ M NM!Ô9œ99ž9ŸÈM"NM#Ô9œ99ž9Ÿ¤M$NM%Ô9œ99ž9ŸçM&NM'Ô9œ99ž9ŸæM(NM)Ô9œ99ž9Ÿ¥M*NM+Ô9œ99ž9ŸåM,NM-Ô9œ99ž9ŸPM.NM/Ô9œ99ž9ŸÇM0NM1Ô9œ99ž9Ÿ M2NM3Ô9œ99ž9Ÿ $M4NM5Ô9œ99ž9Ÿ¦M6NM7Ô9œ99ž9Ÿ M8NM9Ô9œ99ž9Ÿ %M:NM;Ô9œ99ž9ŸÆM<NM=Ô9œ99ž9Ÿ &M>NM?Ô9œ99ž9Ÿ M@NMAÔ9œ99ž9ŸQMBNMCÔ9œ99ž9ŸäMDNMEÔ9œ99ž9Ÿ 'MFNMGÔ9œ99ž9Ÿ=MHNMIÔ9œ99ž9ŸNN?Ô9œ99ž9Ÿ¿N@NNAÔ9œ99ž9ŸhNBNNCÔ9œ99ž9Ÿ 9NDNNEÔ9œ99ž9Ÿ7NFNNGÔ9œ99ž9Ÿ -NHNNIÔ9œ99ž9Ÿ¯NJNNKÔ9œ99ž9Ÿ×NLNNMÔ9œ99ž9ŸiNNNNOÔ9œ99ž9ŸÀNPNNQÔ9œ99ž9Ÿ®NRNNSÔ9œ99ž9ŸÁNTNNUÔ9œ99ž9ŸÂNVNNWÔ9œ99ž9Ÿ .NXNNYÔ9œ99ž9Ÿ­NZNN[Ô9œ99ž9Ÿ :N\NN]Ô9œ99ž9Ÿ6N^NN_Ô9œ99ž9ŸÖN`NNaÔ9œ99ž9ŸÃNbNNcÔ9œ99ž9ŸÄNdNNeÔ9œ99ž9Ÿ5NfNNgÔ9œ99ž9ŸjNhNNiÔ9œ99ž9ŸÕNjNNkÔ9œ99ž9ŸÔNlNNmÔ9œ99ž9ŸkNnNNoÔ9œ99ž9Ÿ4NpNNqÔ9œ99ž9Ÿ3NrNNsÔ9œ99ž9Ÿ2NtNNuÔ9œ99ž9Ÿ ;NvNNwÔ9œ99ž9ŸÅNxNNyÔ9œ99ž9Ÿ1NzNN{Ô9œ99ž9Ÿ N†NN‡Ô9œ99ž9ŸlNˆNN‰Ô9œ99ž9ŸÒNŠNN‹Ô9œ99ž9Ÿ0NŒNNÔ9œ99ž9ŸÑNŽNNÔ9œ99ž9ŸÇNNN‘Ô9œ99ž9Ÿ/N’NN“Ô9œ99ž9ŸÐN”NN•Ô9œ99ž9Ÿ.N–NN—Ô9œ99ž9Ÿ ?N˜NN™Ô9œ99ž9Ÿ-NšNN›Ô9œ99ž9ŸÏNœNNÔ9œ99ž9ŸÎNžNNŸÔ9œ99ž9ŸmN NN¡Ô9œ99ž9Ÿ /N¢NN£Ô9œ99ž9ŸÍN¤NN¥Ô9œ99ž9Ÿ,N¦NN§Ô9œ99ž9ŸÌN¨NN©Ô9œ99ž9Ÿ @NªNN«Ô9œ99ž9ŸnN¬NN­Ô9œ99ž9ŸËN®NN¯Ô9œ99ž9ŸÊN°NN±Ô9œ99ž9ŸÉN²NN³Ô9œ99ž9ŸoN´NNµÔ9œ99ž9Ÿ+N¶NN·Ô9œ99ž9ŸÈN¸NN¹Ô9œ99ž9Ÿ«NºNN»Ô9œ99ž9ŸÇN¼NN½Ô9œ99ž9ŸpN¾NN¿Ô9œ99ž9Ÿ 0NÀNNÁÔ9œ99ž9ŸªNÂNNÃÔ9œ99ž9ŸqNÄNNÅÔ9œ99ž9ŸÈNÆNNÇÔ9œ99ž9ŸÉNÈNNÉÔ9œ99ž9ŸÆNÊNNËÔ9œ99ž9Ÿ©NÌNNÍÔ9œ99ž9ŸÊNÎNNÏÔ9œ99ž9Ÿ*NÐNNÑÔ9œ99ž9Ÿ 1NÒNNÓÔ9œ99ž9ŸrNÔNNÕÔ9œ99ž9ŸËNÖNN×Ô9œ99ž9Ÿ)NØNNÙÔ9œ99ž9Ÿ 2NÚNNÛÔ9œ99ž9ŸsNÜNNÝÔ9œ99ž9ŸtNÞNNßÔ9œ99ž9Ÿ(NàNNáÔ9œ99ž9Ÿ 3NâNNãÔ9œ99ž9Ÿ 4NäNNåÔ9œ99ž9ŸÅNæNNçÔ9œ99ž9ŸÌNèNNéÔ9œ99ž9Ÿ'NêNNëÔ9œ99ž9ŸuNìNNíÔ9œ99ž9Ÿ 5NîNNïÔ9œ99ž9Ÿ&NðNNñÔ9œ99ž9Ÿ 6NòNNóÔ9œ99ž9ŸvNôNNõÔ9œ99ž9Ÿ 7NöNN÷Ô9œ99ž9ŸwNøNNùÔ9œ99ž9Ÿ 8NúNNûÔ9œ99ž9ŸÄNüNNýÔ9œ99ž9ŸxNþNNÿÔ9œ99ž9Ÿ 9ONOÔ9œ99ž9ŸyONOÔ9œ99ž9Ÿ AONOÔ9œ99ž9Ÿ BONOÔ9œ99ž9Ÿ¨ONO Ô9œ99ž9ŸzO NO Ô9œ99ž9Ÿ :O NO Ô9œ99ž9Ÿ{ONOÔ9œ99ž9Ÿ|ONOÔ9œ99ž9ŸÍONOÔ9œ99ž9ŸÃONOÔ9œ99ž9Ÿ}ONOÔ9œ99ž9ŸÎONOÔ9œ99ž9Ÿ§ONOÔ9œ99ž9Ÿ~ONOÔ9œ99ž9ŸONOÔ9œ99ž9Ÿ€O NO!Ô9œ99ž9ŸÏO"NO#Ô9œ99ž9ŸO$NO%Ô9œ99ž9Ÿ‚O&NO'Ô9œ99ž9ŸÂO(NO)Ô9œ99ž9ŸÐO*NO+Ô9œ99ž9ŸÁO,NO-Ô9œ99ž9ŸƒO.NO/Ô9œ99ž9Ÿ CO0NO1Ô9œ99ž9ŸÑO2NO3Ô9œ99ž9Ÿ%O4NO5Ô9œ99ž9Ÿ„O6NO7Ô9œ99ž9Ÿ$O8NO9Ô9œ99ž9Ÿ#O:NO;Ô9œ99ž9Ÿ ;O<NO=Ô9œ99ž9Ÿ…O>NO?Ô9œ99ž9Ÿ†O@NOAÔ9œ99ž9ŸÀOBNOCÔ9œ99ž9Ÿ‡ODNOEÔ9œ99ž9ŸÒOFNOGÔ9œ99ž9Ÿ"OHNOIÔ9œ99ž9ŸˆOJNOKÔ9œ99ž9Ÿ‰OLNOMÔ9œ99ž9Ÿ DONNOOÔ9œ99ž9ŸÓOPNOQÔ9œ99ž9ŸŠORNOSÔ9œ99ž9Ÿ¦OTNOUÔ9œ99ž9Ÿ‹OVNOWÔ9œ99ž9ŸÔOXNOYÔ9œ99ž9ŸÕOZNO[Ô9œ99ž9ŸŒO\NO]Ô9œ99ž9Ÿ¥O^NO_Ô9œ99ž9Ÿ O¦NO§Ô9œ99ž9ŸO¨FO©Ô9œ99ž9Ÿ ?OªNO«Ô9œ99ž9Ÿ KO¬NO­Ô9œ99ž9ŸØO®NO¯Ô9œ99ž9Ÿ LO°NO±Ô9œ99ž9Ÿ”O²NO³Ô9œ99ž9Ÿ MO´NOµÔ9œ99ž9Ÿ @O¶NO·Ô9œ99ž9Ÿ³O¸NO¹Ô9œ99ž9ŸŸOºNO»Ô9œ99ž9Ÿ•O¼NO½Ô9œ99ž9ŸO¾NO¿Ô9œ99ž9Ÿ–OÀNOÁÔ9œ99ž9ŸOÂNOÃÔ9œ99ž9Ÿ—OÄNOÅÔ9œ99ž9Ÿ˜OÆNOÇÔ9œ99ž9ŸžOÈNOÉÔ9œ99ž9Ÿ NOÊNOËÔ9œ99ž9Ÿ™OÌNOÍÔ9œ99ž9ŸOÎNOÏÔ9œ99ž9Ÿ OOÐNOÑÔ9œ99ž9ŸOÒEOÓÔ9œ99ž9ŸšOÔNOÕÔ9œ99ž9ŸOÖDO×Ô9œ99ž9ŸœOØNOÙÔ9œ99ž9Ÿ POÚNOÛÔ9œ99ž9ŸOÜCOÝÔ9œ99ž9Ÿ›OÞNOßÔ9œ99ž9Ÿ QOàNOáÔ9œ99ž9ŸÙOâNOãÔ9œ99ž9ŸOäBOåÔ9œ99ž9Ÿ®OæNOçÔ9œ99ž9ŸšOèNOéÔ9œ99ž9Ÿ­OêNOëÔ9œ99ž9Ÿ¬OìNOíÔ9œ99ž9Ÿ«OîNOïÔ9œ99ž9Ÿ AOðNOñÔ9œ99ž9ŸªOòNOóÔ9œ99ž9ŸÚOôNOõÔ9œ99ž9Ÿ™OöNO÷Ô9œ99ž9Ÿ˜OøNOùÔ9œ99ž9ŸÛOúNOûÔ9œ99ž9Ÿ BOüNOýÔ9œ99ž9Ÿ—OþNOÿÔ9œ99ž9ŸÜPNPÔ9œ99ž9Ÿ–PNPÔ9œ99ž9Ÿ•PNPÔ9œ99ž9ŸÝPNPÔ9œ99ž9ŸPNP Ô9œ99ž9Ÿ©P NP Ô9œ99ž9Ÿ¨P NP Ô9œ99ž9Ÿ§PNPÔ9œ99ž9Ÿ”PNPÔ9œ99ž9Ÿ¦PNPÔ9œ99ž9Ÿ¥PNPÔ9œ99ž9Ÿ¤PNPÔ9œ99ž9ŸÞPNPÔ9œ99ž9ŸPNPÔ9œ99ž9Ÿ£PNPÔ9œ99ž9Ÿ¢PNPÔ9œ99ž9Ÿ¡P NP!Ô9œ99ž9Ÿ›P"NP#Ô9œ99ž9ŸœP$NP%Ô9œ99ž9ŸßP&NP'Ô9œ99ž9Ÿ“P(NP)Ô9œ99ž9Ÿ’P*NP+Ô9œ99ž9Ÿ‘P,NP-Ô9œ99ž9ŸP.NP/Ô9œ99ž9ŸàP0NP1Ô9œ99ž9Ÿ CP2NP3Ô9œ99ž9ŸáP4NP5Ô9œ99ž9Ÿ P6NP7Ô9œ99ž9ŸP8NP9Ô9œ99ž9ŸâP:NP;Ô9œ99ž9ŸŽP<NP=Ô9œ99ž9ŸP>NP?Ô9œ99ž9ŸP@NPAÔ9œ99ž9ŸPBNPCÔ9œ99ž9Ÿ RPDNPEÔ9œ99ž9Ÿ SPFNPGÔ9œ99ž9ŸPHNPIÔ9œ99ž9ŸPJNPKÔ9œ99ž9ŸPLNPMÔ9œ99ž9ŸãPNNPOÔ9œ99ž9ŸäPPNPQÔ9œ99ž9ŸåPRNPSÔ9œ99ž9Ÿ DPTNPUÔ9œ99ž9ŸŸPVNPWÔ9œ99ž9ŸæPXNPYÔ9œ99ž9Ÿ7PZNP[Ô9œ99ž9ŸçP\NP]Ô9œ99ž9ŸèP^NP_Ô9œ99ž9ŸP`NPaÔ9œ99ž9ŸéPbNPcÔ9œ99ž9ŸPdNPeÔ9œ99ž9Ÿ EPfNPgÔ9œ99ž9ŸPhNPiÔ9œ99ž9ŸêPjNPkÔ9œ99ž9ŸëPlNPmÔ9œ99ž9ŸìPnNPoÔ9œ99ž9ŸžPpNPqÔ9œ99ž9ŸPrNPsÔ9œ99ž9ŸíPtNPuÔ9œ99ž9ŸîPvNPwÔ9œ99ž9ŸïPxNPyÔ9œ99ž9ŸðPzNP{Ô9œ99ž9ŸñP|NP}Ô9œ99ž9ŸòP~NPÔ9œ99ž9ŸžP€NPÔ9œ99ž9ŸóP‚NPƒÔ9œ99ž9ŸôP„NP…Ô9œ99ž9ŸõP†NP‡Ô9œ99ž9ŸöPˆNP‰Ô9œ99ž9Ÿ÷PŠNP‹Ô9œ99ž9ŸŸPŒNPÔ9œ99ž9ŸŒPŽNPÔ9œ99ž9Ÿ FPNP‘Ô9œ99ž9ŸøP’NP“Ô9œ99ž9Ÿ P”NP•Ô9œ99ž9ŸùP–NP—Ô9œ99ž9Ÿ GP˜NP™Ô9œ99ž9Ÿ¡PšNP›Ô9œ99ž9ŸúPœNPÔ9œ99ž9Ÿ¢PžNPŸÔ9œ99ž9Ÿ TP NP¡Ô9œ99ž9Ÿ HP¢NP£Ô9œ99ž9ŸP¤NP¥Ô9œ99ž9Ÿ UP¦NP§Ô9œ99ž9ŸûP¨NP©Ô9œ99ž9Ÿ VPªNP«Ô9œ99ž9ŸœP¬NP­Ô9œ99ž9Ÿ‹P®NP¯Ô9œ99ž9Ÿ IP°NP±Ô9œ99ž9Ÿ WP²NP³Ô9œ99ž9Ÿ XP´NPµÔ9œ99ž9Ÿ JP¶NP·Ô9œ99ž9Ÿ YP¸NP¹Ô9œ99ž9Ÿ ZPºNP»Ô9œ99ž9ŸüP¼NP½Ô9œ99ž9ŸýP¾NP¿Ô9œ99ž9Ÿ£PÀNPÁÔ9œ99ž9Ÿ [PÂNPÃÔ9œ99ž9Ÿ¤PÄNPÅÔ9œ99ž9Ÿ \PÆNPÇÔ9œ99ž9Ÿ¥PÈNPÉÔ9œ99ž9ŸþPÊNPËÔ9œ99ž9ŸPÌNPÍÔ9œ99ž9Ÿ›PÎNPÏÔ9œ99ž9ŸŠPÐNPÑÔ9œ99ž9ŸÿPÒNPÓÔ9œ99ž9ŸšPÔNPÕÔ9œ99ž9Ÿ™PÖNP×Ô9œ99ž9Ÿ ]PØNPÙÔ9œ99ž9Ÿ¦PÚNPÛÔ9œ99ž9Ÿ§PÜNPÝÔ9œ99ž9Ÿ¨PÞNPßÔ9œ99ž9Ÿ ^PàNPáÔ9œ99ž9ŸPâNPãÔ9œ99ž9Ÿ˜PäNPåÔ9œ99ž9ŸPæNPçÔ9œ99ž9Ÿ©PèNPéÔ9œ99ž9Ÿ—PêNPëÔ9œ99ž9Ÿ–PìNPíÔ9œ99ž9Ÿ _PîNPïÔ9œ99ž9ŸPðNPñÔ9œ99ž9ŸPòNPóÔ9œ99ž9Ÿ KPôNPõÔ9œ99ž9Ÿ•PöNP÷Ô9œ99ž9Ÿ‰PøNPùÔ9œ99ž9ŸPúNPûÔ9œ99ž9Ÿ”PüNPýÔ9œ99ž9Ÿ LPþNPÿÔ9œ99ž9ŸˆQNQÔ9œ99ž9ŸQNQÔ9œ99ž9Ÿ‡QNQÔ9œ99ž9Ÿ“QNQÔ9œ99ž9Ÿ†QNQ Ô9œ99ž9Ÿ’Q NQ Ô9œ99ž9Ÿ…Q NQ Ô9œ99ž9Ÿ `QNQÔ9œ99ž9Ÿ„QNQÔ9œ99ž9ŸQNQÔ9œ99ž9Ÿ aQNQÔ9œ99ž9Ÿ bQNQÔ9œ99ž9ŸQNQÔ9œ99ž9Ÿ cQNQÔ9œ99ž9Ÿ QNQÔ9œ99ž9ŸªQNQÔ9œ99ž9ŸƒQ NQ!Ô9œ99ž9ŸQ"NQ#Ô9œ99ž9Ÿ‘Q$NQ%Ô9œ99ž9Ÿ dQ&NQ'Ô9œ99ž9Ÿ Q(NQ)Ô9œ99ž9Ÿ‚Q*NQ+Ô9œ99ž9ŸQ,NQ-Ô9œ99ž9Ÿ eQ.NQ/Ô9œ99ž9ŸQ0NQ1Ô9œ99ž9Ÿ fQ2NQ3Ô9œ99ž9ŸQ4NQ5Ô9œ99ž9Ÿ Q6NQ7Ô9œ99ž9Ÿ gQ8NQ9Ô9œ99ž9ŸQ:NQ;Ô9œ99ž9Ÿ«Q<NQ=Ô9œ99ž9Ÿ€Q>NQ?Ô9œ99ž9Ÿ MQ@NQAÔ9œ99ž9Ÿ¬QBNQCÔ9œ99ž9ŸQDNQEÔ9œ99ž9Ÿ NQFNQGÔ9œ99ž9ŸQHNQIÔ9œ99ž9Ÿ OQJNQKÔ9œ99ž9ŸQLNQMÔ9œ99ž9Ÿ QNNQOÔ9œ99ž9ŸQPNQQÔ9œ99ž9Ÿ QRNQSÔ9œ99ž9Ÿ­QTNQUÔ9œ99ž9Ÿ QVNQWÔ9œ99ž9ŸŽQXNQYÔ9œ99ž9Ÿ QZNQ[Ô9œ99ž9Ÿ Q\NQ]Ô9œ99ž9ŸQ^NQ_Ô9œ99ž9Ÿ®Q`NQaÔ9œ99ž9Ÿ~QbNQcÔ9œ99ž9Ÿ QdNQeÔ9œ99ž9Ÿ}QfNQgÔ9œ99ž9Ÿ|QhNQiÔ9œ99ž9Ÿ hQjNQkÔ9œ99ž9Ÿ¯QlNQmÔ9œ99ž9ŸQnNQoÔ9œ99ž9Ÿ{QpNQqÔ9œ99ž9ŸŒQrNQsÔ9œ99ž9ŸzQtNQuÔ9œ99ž9Ÿ iQvNQwÔ9œ99ž9ŸyQxNQyÔ9œ99ž9Ÿ jQzNQ{Ô9œ99ž9Ÿ Q|NQ}Ô9œ99ž9Ÿ kQ~NQÔ9œ99ž9ŸQ€NQÔ9œ99ž9Ÿ lQ‚NQƒÔ9œ99ž9ŸQ„NQ…Ô9œ99ž9Ÿ‹Q†NQ‡Ô9œ99ž9Ÿ mQˆNQ‰Ô9œ99ž9ŸQŠNQ‹Ô9œ99ž9Ÿ nQŒNQÔ9œ99ž9ŸQŽNQÔ9œ99ž9Ÿ oQNQ‘Ô9œ99ž9Ÿ°Q’NQ“Ô9œ99ž9ŸxQ”NQ•Ô9œ99ž9ŸQ–NQ—Ô9œ99ž9ŸQ˜NQ™Ô9œ99ž9ŸŠQšNQ›Ô9œ99ž9ŸQœNQÔ9œ99ž9Ÿ pQžNQŸÔ9œ99ž9Ÿ‰Q NQ¡Ô9œ99ž9ŸQ¢NQ£Ô9œ99ž9Ÿ±Q¤NQ¥Ô9œ99ž9Ÿ qQ¦NQ§Ô9œ99ž9ŸQ¨NQ©Ô9œ99ž9Ÿ rQªNQ«Ô9œ99ž9Ÿ²Q¬NQ­Ô9œ99ž9ŸQ®NQ¯Ô9œ99ž9Ÿ³Q°NQ±Ô9œ99ž9ŸQ²NQ³Ô9œ99ž9Ÿ sQ´NQµÔ9œ99ž9Ÿ´Q¶NQ·Ô9œ99ž9ŸˆQ¸NQ¹Ô9œ99ž9ŸµQºNQ»Ô9œ99ž9Ÿ‡Q¼NQ½Ô9œ99ž9ŸQ¾NQ¿Ô9œ99ž9Ÿ†QÀNQÁÔ9œ99ž9ŸwQÂNQÃÔ9œ99ž9Ÿ tQÄNQÅÔ9œ99ž9ŸQÆNQÇÔ9œ99ž9Ÿ¶QÈNQÉÔ9œ99ž9Ÿ·QÊNQËÔ9œ99ž9Ÿ¸QÌNQÍÔ9œ99ž9ŸQÎNQÏÔ9œ99ž9Ÿ…QÐNQÑÔ9œ99ž9ŸvQÒNQÓÔ9œ99ž9ŸuQÔNQÕÔ9œ99ž9Ÿ¹QÖNQ×Ô9œ99ž9Ÿ uQØNQÙÔ9œ99ž9ŸQÚNQÛÔ9œ99ž9Ÿ vQÜNQÝÔ9œ99ž9ŸQÞNQßÔ9œ99ž9Ÿ wQàNQáÔ9œ99ž9ŸQâNQãÔ9œ99ž9Ÿ xQäNQåÔ9œ99ž9ŸºQæNQçÔ9œ99ž9Ÿ yQèNQéÔ9œ99ž9ŸtQêNQëÔ9œ99ž9ŸQìNQíÔ9œ99ž9ŸsQîNQïÔ9œ99ž9ŸQðNQñÔ9œ99ž9Ÿ»QòNQóÔ9œ99ž9Ÿ ŽQôNQõÔ9œ99ž9Ÿ¼QöNQ÷Ô9œ99ž9Ÿ„QøNQùÔ9œ99ž9ŸrQúNQûÔ9œ99ž9Ÿ zQüNQýÔ9œ99ž9ŸƒQþNQÿÔ9œ99ž9ŸqRNRÔ9œ99ž9Ÿ {RNRÔ9œ99ž9Ÿ½RNRÔ9œ99ž9Ÿ¾RNRÔ9œ99ž9ŸRNR Ô9œ99ž9ŸpR NR Ô9œ99ž9ŸR NR Ô9œ99ž9Ÿ¿RNRÔ9œ99ž9ŸoRNRÔ9œ99ž9ŸRNRÔ9œ99ž9Ÿ‚RNRÔ9œ99ž9Ÿ RNRÔ9œ99ž9ŸnRNRÔ9œ99ž9ŸÀRNRÔ9œ99ž9ŸmRNRÔ9œ99ž9ŸlRNRÔ9œ99ž9Ÿ R NR!Ô9œ99ž9ŸR"NR#Ô9œ99ž9ŸkR$NR%Ô9œ99ž9ŸR&NR'Ô9œ99ž9Ÿ€R(NR)Ô9œ99ž9ŸjR*NR+Ô9œ99ž9ŸR,NR-Ô9œ99ž9Ÿ |R.NR/Ô9œ99ž9ŸiR0NR1Ô9œ99ž9Ÿ~R2NR3Ô9œ99ž9Ÿ}R4NR5Ô9œ99ž9ŸhR6NR7Ô9œ99ž9Ÿ|R8NR9Ô9œ99ž9Ÿ{R:NR;Ô9œ99ž9ŸzR<NR=Ô9œ99ž9ŸyR>NR?Ô9œ99ž9Ÿ ŒR@NRAÔ9œ99ž9ŸgRBNRCÔ9œ99ž9ŸÁRDNREÔ9œ99ž9ŸfRFNRGÔ9œ99ž9Ÿ ‹RHNRIÔ9œ99ž9ŸÂRJNRKÔ9œ99ž9ŸeRLNRMÔ9œ99ž9ŸxRNNROÔ9œ99ž9Ÿ }RPNRQÔ9œ99ž9ŸdRRNRSÔ9œ99ž9ŸcRTNRUÔ9œ99ž9Ÿ!RVNRWÔ9œ99ž9ŸRXNRYÔ9œ99ž9Ÿ ŠRZNR[Ô9œ99ž9Ÿ ~R\NR]Ô9œ99ž9ŸwR^NR_Ô9œ99ž9ŸvR`NRaÔ9œ99ž9ŸbRbNRcÔ9œ99ž9ŸuRdNReÔ9œ99ž9ŸtRfNRgÔ9œ99ž9ŸaRhNRiÔ9œ99ž9ŸÃRjNRkÔ9œ99ž9ŸsRlNRmÔ9œ99ž9Ÿ`RnNRoÔ9œ99ž9ŸRpNRqÔ9œ99ž9Ÿ_RrNRsÔ9œ99ž9Ÿ RtNRuÔ9œ99ž9Ÿ^RvNRwÔ9œ99ž9Ÿ €RxNRyÔ9œ99ž9ŸRzNR{Ô9œ99ž9ŸR|NR}Ô9œ99ž9ŸrR~NRÔ9œ99ž9Ÿ]R€NRÔ9œ99ž9Ÿ"R‚NRƒÔ9œ99ž9ŸÄR„NR…Ô9œ99ž9Ÿ#R†NR‡Ô9œ99ž9ŸÿRˆNR‰Ô9œ99ž9ŸqRŠNR‹Ô9œ99ž9Ÿ\RŒNRÔ9œ99ž9ŸþRŽNRÔ9œ99ž9ŸpRNR‘Ô9œ99ž9Ÿ[R’NR“Ô9œ99ž9ŸoR”NR•Ô9œ99ž9ŸýR–NR—Ô9œ99ž9ŸZR˜NR™Ô9œ99ž9Ÿ$RšNR›Ô9œ99ž9ŸYRœNRÔ9œ99ž9Ÿ%RžNRŸÔ9œ99ž9ŸÅR NR¡Ô9œ99ž9ŸXR¢NR£Ô9œ99ž9ŸÆR¤NR¥Ô9œ99ž9ŸüR¦NR§Ô9œ99ž9Ÿ&R¨NR©Ô9œ99ž9ŸnRªNR«Ô9œ99ž9ŸûR¬NR­Ô9œ99ž9ŸmR®NR¯Ô9œ99ž9ŸWR°NR±Ô9œ99ž9Ÿ'R²NR³Ô9œ99ž9ŸúR´NRµÔ9œ99ž9ŸVR¶NR·Ô9œ99ž9ŸUR¸NR¹Ô9œ99ž9ŸTRºNR»Ô9œ99ž9ŸSR¼NR½Ô9œ99ž9Ÿ R¾NR¿Ô9œ99ž9Ÿ ‚RÀNRÁÔ9œ99ž9ŸùRÂNRÃÔ9œ99ž9Ÿ(RÄNRÅÔ9œ99ž9ŸÇRÆNRÇÔ9œ99ž9Ÿ)RÈNRÉÔ9œ99ž9Ÿ*RÊNRËÔ9œ99ž9ŸlRÌNRÍÔ9œ99ž9Ÿ ‰RÎNRÏÔ9œ99ž9ŸkRÐNRÑÔ9œ99ž9Ÿ ƒRÒNRÓÔ9œ99ž9ŸøRÔNRÕÔ9œ99ž9ŸjRÖNR×Ô9œ99ž9ŸiRØNRÙÔ9œ99ž9ŸÈRÚNRÛÔ9œ99ž9Ÿ+RÜNRÝÔ9œ99ž9ŸáRÞNRßÔ9œ99ž9Ÿ÷RàNRáÔ9œ99ž9Ÿ ˆRâNRãÔ9œ99ž9ŸgRäNRåÔ9œ99ž9Ÿ ‡RæNRçÔ9œ99ž9ŸöRèNRéÔ9œ99ž9Ÿ †RêNRëÔ9œ99ž9ŸßRìNRíÔ9œ99ž9Ÿ,RîNRïÔ9œ99ž9Ÿ …RðNRñÔ9œ99ž9ŸeRòNRóÔ9œ99ž9ŸRRôNRõÔ9œ99ž9Ÿ „RöNR÷Ô9œ99ž9ŸdRøNRùÔ9œ99ž9ŸõRúNRûÔ9œ99ž9Ÿ „RüNRýÔ9œ99ž9ŸÉRþNRÿÔ9œ99ž9Ÿ ƒSNSÔ9œ99ž9ŸôSNSÔ9œ99ž9ŸcSNSÔ9œ99ž9ŸóSNSÔ9œ99ž9Ÿ ‚SNS Ô9œ99ž9ŸQS NS Ô9œ99ž9ŸbS NS Ô9œ99ž9Ÿ SNSÔ9œ99ž9ŸÊSNSÔ9œ99ž9ŸPSNSÔ9œ99ž9ŸËSNSÔ9œ99ž9ŸOSNSÔ9œ99ž9Ÿ …SNSÔ9œ99ž9ŸÌSNSÔ9œ99ž9Ÿ €SNSÔ9œ99ž9ŸÍSNSÔ9œ99ž9ŸaS NS!Ô9œ99ž9ŸNS"NS#Ô9œ99ž9Ÿ S$NS%Ô9œ99ž9Ÿ`S&NS'Ô9œ99ž9Ÿ_S(NS)Ô9œ99ž9ŸòS*NS+Ô9œ99ž9Ÿ †S,NS-Ô9œ99ž9Ÿ^S.NS/Ô9œ99ž9Ÿ ‡S0NS1Ô9œ99ž9ŸñS2NS3Ô9œ99ž9ŸMS4NS5Ô9œ99ž9Ÿ ~S6NS7Ô9œ99ž9Ÿ]S8NS9Ô9œ99ž9Ÿ ˆS:NS;Ô9œ99ž9ŸÎS<NS=Ô9œ99ž9ŸLS>NS?Ô9œ99ž9ŸÏS@NSAÔ9œ99ž9Ÿ\SBNSCÔ9œ99ž9Ÿ ‰SDNSEÔ9œ99ž9ŸðSFNSGÔ9œ99ž9Ÿ[SHNSIÔ9œ99ž9Ÿ ŠSJNSKÔ9œ99ž9ŸZSLNSMÔ9œ99ž9Ÿ ‹SNNSOÔ9œ99ž9ŸÐSPNSQÔ9œ99ž9ŸYSRNSSÔ9œ99ž9Ÿ ŒSTNSUÔ9œ99ž9ŸÑSVNSWÔ9œ99ž9ŸXSXNSYÔ9œ99ž9ŸWSZNS[Ô9œ99ž9Ÿ-S\NS]Ô9œ99ž9Ÿ }S^NS_Ô9œ99ž9ŸÒS`NSaÔ9œ99ž9ŸVSbNScÔ9œ99ž9ŸKSdNSeÔ9œ99ž9ŸÓSfNSgÔ9œ99ž9ŸUShNSiÔ9œ99ž9ŸïSjNSkÔ9œ99ž9ŸJSlNSmÔ9œ99ž9ŸÔSnNSoÔ9œ99ž9ŸISpNSqÔ9œ99ž9Ÿ.SrNSsÔ9œ99ž9ŸTStNSuÔ9œ99ž9ŸHSvNSwÔ9œ99ž9ŸSSxNSyÔ9œ99ž9ŸGSzNS{Ô9œ99ž9ŸÕS|NS}Ô9œ99ž9ŸFS~NSÔ9œ99ž9ŸîS€NSÔ9œ99ž9ŸES‚NSƒÔ9œ99ž9ŸÖS„NS…Ô9œ99ž9ŸRS†NS‡Ô9œ99ž9Ÿ/SˆNS‰Ô9œ99ž9ŸíSŠNS‹Ô9œ99ž9ŸDSŒNSÔ9œ99ž9ŸìSŽNSÔ9œ99ž9ŸCSNS‘Ô9œ99ž9Ÿ S’NS“Ô9œ99ž9ŸëS”NS•Ô9œ99ž9ŸBS–NS—Ô9œ99ž9Ÿ0S˜NS™Ô9œ99ž9ŸêSšNS›Ô9œ99ž9Ÿ×SœNSÔ9œ99ž9ŸQSžNSŸÔ9œ99ž9Ÿ"S TS¡Ô9œ99ž9Ÿ1S¢NS£Ô9œ99ž9Ÿ#S¤US¥Ô9œ99ž9Ÿ?S¦NS§Ô9œ99ž9Ÿ2S¨NS©Ô9œ99ž9ŸØSªNS«Ô9œ99ž9Ÿ |S¬NS­Ô9œ99ž9Ÿ>S®NS¯Ô9œ99ž9Ÿ {S°NS±Ô9œ99ž9Ÿ=S²NS³Ô9œ99ž9ŸéS´NSµÔ9œ99ž9ŸT<NT=Ô9œ99ž9ŸãT>NT?Ô9œ99ž9Ÿ tT@NTAÔ9œ99ž9ŸâTBNTCÔ9œ99ž9Ÿ)TDNTEÔ9œ99ž9Ÿ “TFNTGÔ9œ99ž9ŸDTHNTIÔ9œ99ž9ŸáTJNTKÔ9œ99ž9ŸCTLNTMÔ9œ99ž9Ÿ(TNNTOÔ9œ99ž9Ÿ'TPNTQÔ9œ99ž9Ÿ&TRNTSÔ9œ99ž9ŸàTTNTUÔ9œ99ž9Ÿ sTVNTWÔ9œ99ž9ŸâTXNTYÔ9œ99ž9Ÿ ”TZNT[Ô9œ99ž9ŸßT\NT]Ô9œ99ž9ŸãT^NT_Ô9œ99ž9Ÿ%T`NTaÔ9œ99ž9ŸäTbNTcÔ9œ99ž9ŸÞTdNTeÔ9œ99ž9Ÿ?TfNTgÔ9œ99ž9Ÿ rThNTiÔ9œ99ž9ŸÝTjNTkÔ9œ99ž9ŸÜTlNTmÔ9œ99ž9Ÿ qTnNToÔ9œ99ž9Ÿ pTpNTqÔ9œ99ž9Ÿ •TrNTsÔ9œ99ž9ŸÛTtNTuÔ9œ99ž9Ÿ oTvNTwÔ9œ99ž9ŸåTxNTyÔ9œ99ž9Ÿ –TzNT{Ô9œ99ž9ŸÚT|NT}Ô9œ99ž9Ÿ$T~NTÔ9œ99ž9Ÿ —T€NTÔ9œ99ž9Ÿ nT‚NTƒÔ9œ99ž9ŸæT„NT…Ô9œ99ž9ŸÙT†NT‡Ô9œ99ž9Ÿ#TˆNT‰Ô9œ99ž9Ÿ mTŠNT‹Ô9œ99ž9Ÿ lTŒNTÔ9œ99ž9ŸçTŽNTÔ9œ99ž9Ÿ ˜TNT‘Ô9œ99ž9ŸBT’NT“Ô9œ99ž9Ÿ"T”NT•Ô9œ99ž9Ÿ!T–NT—Ô9œ99ž9Ÿ@T˜NT™Ô9œ99ž9ŸØTšNT›Ô9œ99ž9ŸèTœNTÔ9œ99ž9Ÿ ™TžNTŸÔ9œ99ž9ŸAT NT¡Ô9œ99ž9ŸéT¢NT£Ô9œ99ž9Ÿ T¤NT¥Ô9œ99ž9ŸBT¦NT§Ô9œ99ž9Ÿ kT¨NT©Ô9œ99ž9Ÿ4TªNT«Ô9œ99ž9ŸT¬NT­Ô9œ99ž9Ÿ×T®NT¯Ô9œ99ž9ŸêT°NT±Ô9œ99ž9ŸAT²NT³Ô9œ99ž9Ÿ šT´NTµÔ9œ99ž9ŸÖT¶NT·Ô9œ99ž9Ÿ ›T¸NT¹Ô9œ99ž9ŸhTºNT»Ô9œ99ž9ŸT¼NT½Ô9œ99ž9Ÿ œT¾NT¿Ô9œ99ž9Ÿ TÀNTÁÔ9œ99ž9Ÿ žTÂNTÃÔ9œ99ž9Ÿ?TÄNTÅÔ9œ99ž9Ÿ jTÆNTÇÔ9œ99ž9ŸÕTÈNTÉÔ9œ99ž9Ÿ iTÊNTËÔ9œ99ž9ŸëTÌNTÍÔ9œ99ž9ŸTÎNTÏÔ9œ99ž9ŸÔTÐNTÑÔ9œ99ž9Ÿ hTÒNTÓÔ9œ99ž9Ÿ ŸTÔNTÕÔ9œ99ž9ŸÓTÖNT×Ô9œ99ž9Ÿ gTØNTÙÔ9œ99ž9ŸìTÚNTÛÔ9œ99ž9ŸfTÜNTÝÔ9œ99ž9Ÿ fTÞNTßÔ9œ99ž9ŸTàNTáÔ9œ99ž9ŸTâNTãÔ9œ99ž9ŸíTäNTåÔ9œ99ž9ŸTæNTçÔ9œ99ž9Ÿ eTèNTéÔ9œ99ž9Ÿ¶TêNTëÔ9œ99ž9Ÿ dTìNTíÔ9œ99ž9ŸTîNTïÔ9œ99ž9ŸTðNTñÔ9œ99ž9ŸCTòNTóÔ9œ99ž9Ÿ cTôNTõÔ9œ99ž9ŸTöNT÷Ô9œ99ž9ŸTøNTùÔ9œ99ž9ŸTúNTûÔ9œ99ž9Ÿ  TüNTýÔ9œ99ž9ŸDTþNTÿÔ9œ99ž9ŸµUNUÔ9œ99ž9ŸUNUÔ9œ99ž9Ÿ ¡UNUÔ9œ99ž9ŸEUNUÔ9œ99ž9ŸUNU Ô9œ99ž9ŸU NU Ô9œ99ž9ŸFU NU Ô9œ99ž9ŸUNUÔ9œ99ž9Ÿ´UNUÔ9œ99ž9ŸÒUNUÔ9œ99ž9ŸUNUÔ9œ99ž9Ÿ:UNUÔ9œ99ž9ŸUNUÔ9œ99ž9ŸÑUNUÔ9œ99ž9Ÿ bUNUÔ9œ99ž9ŸUNUÔ9œ99ž9Ÿ U NU!Ô9œ99ž9Ÿ²U"NU#Ô9œ99ž9Ÿ ¢U$NU%Ô9œ99ž9ŸGU&NU'Ô9œ99ž9Ÿ±U(NU)Ô9œ99ž9ŸHU*NU+Ô9œ99ž9Ÿ U,NU-Ô9œ99ž9Ÿ aU.NU/Ô9œ99ž9Ÿ U0NU1Ô9œ99ž9Ÿ U2NU3Ô9œ99ž9ŸÐU4NU5Ô9œ99ž9Ÿ `U6NU7Ô9œ99ž9Ÿ°U8NU9Ô9œ99ž9Ÿ U:NU;Ô9œ99ž9ŸU<NU=Ô9œ99ž9ŸIU>NU?Ô9œ99ž9ŸU@NUAÔ9œ99ž9ŸUBNUCÔ9œ99ž9ŸÏUDNUEÔ9œ99ž9Ÿ¯UFNUGÔ9œ99ž9ŸÎUHNUIÔ9œ99ž9Ÿ _UJNUKÔ9œ99ž9ŸJULNUMÔ9œ99ž9Ÿ ^UNNUOÔ9œ99ž9ŸîUPNUQÔ9œ99ž9ŸURNUSÔ9œ99ž9Ÿ5UTNUUÔ9œ99ž9ŸKUVNUWÔ9œ99ž9Ÿ-UXNUYÔ9œ99ž9ŸLUZNU[Ô9œ99ž9ŸÍU\NU]Ô9œ99ž9ŸÌU^NU_Ô9œ99ž9Ÿ £U`NUaÔ9œ99ž9ŸMUbNUcÔ9œ99ž9ŸËUdNUeÔ9œ99ž9ŸïUfNUgÔ9œ99ž9Ÿ ¤UhNUiÔ9œ99ž9ŸðUjNUkÔ9œ99ž9Ÿ ¥UlNUmÔ9œ99ž9ŸÊUnNUoÔ9œ99ž9ŸNUpNUqÔ9œ99ž9ŸñUrNUsÔ9œ99ž9ŸOUtNUuÔ9œ99ž9ŸPUvNUwÔ9œ99ž9ŸÉUxNUyÔ9œ99ž9Ÿ ]UzNU{Ô9œ99ž9ŸQU|NU}Ô9œ99ž9ŸòU~NUÔ9œ99ž9Ÿ \U€NUÔ9œ99ž9ŸóU‚NUƒÔ9œ99ž9Ÿ4U„NU…Ô9œ99ž9Ÿ [U†NU‡Ô9œ99ž9ŸôUˆNU‰Ô9œ99ž9Ÿ ¦UŠNU‹Ô9œ99ž9ŸRUŒNUÔ9œ99ž9ŸSUŽNUÔ9œ99ž9ŸÈUNU‘Ô9œ99ž9Ÿ ZU’NU“Ô9œ99ž9ŸõU”NU•Ô9œ99ž9ŸTU–NU—Ô9œ99ž9Ÿ §U˜NU™Ô9œ99ž9Ÿ3UšNU›Ô9œ99ž9ŸUUœNUÔ9œ99ž9Ÿ ¨UžNUŸÔ9œ99ž9Ÿ2U NU¡Ô9œ99ž9ŸU¢NU£Ô9œ99ž9Ÿ ©U¤NU¥Ô9œ99ž9ŸÇU¦NU§Ô9œ99ž9ŸöU¨NU©Ô9œ99ž9Ÿ ªUªNU«Ô9œ99ž9Ÿ1U¬NU­Ô9œ99ž9Ÿ «U®NU¯Ô9œ99ž9Ÿ=U°NU±Ô9œ99ž9ŸÆU²NU³Ô9œ99ž9Ÿ YU´NUµÔ9œ99ž9Ÿ ¬U¶NU·Ô9œ99ž9ŸNV?Ô9œ99ž9Ÿ ¸V@NVAÔ9œ99ž9Ÿ&VBNVCÔ9œ99ž9Ÿ%VDNVEÔ9œ99ž9Ÿ$VFNVGÔ9œ99ž9Ÿ(VHNVIÔ9œ99ž9Ÿ0VJNVKÔ9œ99ž9Ÿ ¹VLNVMÔ9œ99ž9Ÿ PVNNVOÔ9œ99ž9ŸXVPNVQÔ9œ99ž9Ÿ/VRNVSÔ9œ99ž9Ÿ ºVTNVUÔ9œ99ž9Ÿ »VVNVWÔ9œ99ž9ŸYVXNVYÔ9œ99ž9Ÿ ¼VZNV[Ô9œ99ž9Ÿ÷V\NV]Ô9œ99ž9Ÿ OV^NV_Ô9œ99ž9ŸV`NVaÔ9œ99ž9Ÿ NVbNVcÔ9œ99ž9Ÿ ½VdNVeÔ9œ99ž9Ÿ ¾VfNVgÔ9œ99ž9ŸöVhNViÔ9œ99ž9ŸZVjNVkÔ9œ99ž9Ÿ MVlNVmÔ9œ99ž9Ÿ ¿VnNVoÔ9œ99ž9Ÿ LVpNVqÔ9œ99ž9Ÿ ÀVrNVsÔ9œ99ž9Ÿ»VtNVuÔ9œ99ž9ŸVvNVwÔ9œ99ž9ŸºVxNVyÔ9œ99ž9Ÿ VzNV{Ô9œ99ž9Ÿ V|NV}Ô9œ99ž9Ÿ ÁV~NVÔ9œ99ž9Ÿ¹V€NVÔ9œ99ž9Ÿ ÂV‚NVƒÔ9œ99ž9Ÿ[V„NV…Ô9œ99ž9Ÿ¸V†NV‡Ô9œ99ž9Ÿ ÃVˆNV‰Ô9œ99ž9Ÿ·VŠNV‹Ô9œ99ž9Ÿ VŒNVÔ9œ99ž9Ÿ\VŽNVÔ9œ99ž9Ÿ¶VNV‘Ô9œ99ž9Ÿ.V’NV“Ô9œ99ž9Ÿ V”NV•Ô9œ99ž9ŸµV–NV—Ô9œ99ž9Ÿ V˜NV™Ô9œ99ž9Ÿ ÄVšNV›Ô9œ99ž9Ÿ,VœNVÔ9œ99ž9Ÿ´VžNVŸÔ9œ99ž9Ÿ KV NV¡Ô9œ99ž9Ÿ ÅV¢NV£Ô9œ99ž9Ÿ+V¤NV¥Ô9œ99ž9Ÿ ÆV¦NV§Ô9œ99ž9Ÿ*V¨NV©Ô9œ99ž9Ÿ)VªNV«Ô9œ99ž9Ÿ]V¬NV­Ô9œ99ž9Ÿ#V®NV¯Ô9œ99ž9Ÿ"V°NV±Ô9œ99ž9ŸõV²NV³Ô9œ99ž9ŸôV´NVµÔ9œ99ž9Ÿ³V¶NV·Ô9œ99ž9ŸóV¸NV¹Ô9œ99ž9Ÿ^VºNV»Ô9œ99ž9Ÿ!V¼NV½Ô9œ99ž9ŸòV¾NV¿Ô9œ99ž9Ÿ@VÀNVÁÔ9œ99ž9Ÿ JVÂNVÃÔ9œ99ž9Ÿ VÄNVÅÔ9œ99ž9ŸVÆNVÇÔ9œ99ž9Ÿ>VÈNVÉÔ9œ99ž9ŸñVÊNVËÔ9œ99ž9Ÿ²VÌNVÍÔ9œ99ž9ŸVÎIVÏÔ9œ99ž9ŸVÐHVÑÔ9œ99ž9ŸVÒGVÓÔ9œ99ž9Ÿ IVÔNVÕÔ9œ99ž9Ÿ HVÖNV×Ô9œ99ž9ŸVØNVÙÔ9œ99ž9Ÿ ÇVÚNVÛÔ9œ99ž9Ÿ_VÜNVÝÔ9œ99ž9Ÿ ÈVÞNVßÔ9œ99ž9Ÿ ÉVàNVáÔ9œ99ž9Ÿ±VâNVãÔ9œ99ž9Ÿ GVäNVåÔ9œ99ž9Ÿ ÊVæNVçÔ9œ99ž9Ÿ FVèNVéÔ9œ99ž9Ÿ ËVêNVëÔ9œ99ž9Ÿ`VìNVíÔ9œ99ž9Ÿ EVîNVïÔ9œ99ž9Ÿ DVðNVñÔ9œ99ž9Ÿ ÌVòNVóÔ9œ99ž9Ÿ CVôNVõÔ9œ99ž9Ÿ BVöNV÷Ô9œ99ž9ŸðVøNVùÔ9œ99ž9Ÿ°VúNVûÔ9œ99ž9ŸïVüNVýÔ9œ99ž9Ÿ¯VþNVÿÔ9œ99ž9Ÿ AWNWÔ9œ99ž9ŸîWNWÔ9œ99ž9Ÿ®WNWÔ9œ99ž9Ÿ­WNWÔ9œ99ž9Ÿ¬WNW Ô9œ99ž9Ÿ«W NW Ô9œ99ž9ŸªW NW Ô9œ99ž9Ÿ @WNWÔ9œ99ž9Ÿ ?WNWÔ9œ99ž9ŸíWNWÔ9œ99ž9ŸìWNWÔ9œ99ž9ŸëWNWÔ9œ99ž9Ÿ >WNWÔ9œ99ž9Ÿ ÍWNWÔ9œ99ž9ŸêWNWÔ9œ99ž9ŸaWNWÔ9œ99ž9ŸbW NW!Ô9œ99ž9Ÿ©W"NW#Ô9œ99ž9Ÿ¨W$NW%Ô9œ99ž9ŸW&NW'Ô9œ99ž9Ÿ =W(NW)Ô9œ99ž9Ÿ ÎW*NW+Ô9œ99ž9ŸcW,NW-Ô9œ99ž9Ÿ ÏW.NW/Ô9œ99ž9Ÿ§W0NW1Ô9œ99ž9Ÿ NW?Ô9œ99ž9Ÿ ÒW@NWAÔ9œ99ž9Ÿ ÓWBNWCÔ9œ99ž9ŸdWDNWEÔ9œ99ž9Ÿ¥WFNWGÔ9œ99ž9Ÿ ÔWHNWIÔ9œ99ž9ŸeWJNWKÔ9œ99ž9Ÿ :WLNWMÔ9œ99ž9ŸWNNWOÔ9œ99ž9ŸfWPNWQÔ9œ99ž9Ÿ¤WRNWSÔ9œ99ž9ŸgWTNWUÔ9œ99ž9ŸhWVNWWÔ9œ99ž9ŸiWXNWYÔ9œ99ž9ŸWZNW[Ô9œ99ž9Ÿ£W\NW]Ô9œ99ž9Ÿ ÕW^NW_Ô9œ99ž9Ÿ¢W`NWaÔ9œ99ž9Ÿ¡WbNWcÔ9œ99ž9ŸéWdNWeÔ9œ99ž9Ÿ WfNWgÔ9œ99ž9ŸjWhNWiÔ9œ99ž9ŸWjNWkÔ9œ99ž9ŸèWlNWmÔ9œ99ž9ŸŸWnNWoÔ9œ99ž9ŸžWpNWqÔ9œ99ž9ŸWrNWsÔ9œ99ž9ŸWtNWuÔ9œ99ž9ŸkWvNWwÔ9œ99ž9ŸœWxNWyÔ9œ99ž9Ÿ›WzNW{Ô9œ99ž9ŸlW|NW}Ô9œ99ž9ŸšW~NWÔ9œ99ž9ŸW€NWÔ9œ99ž9ŸçW‚NWƒÔ9œ99ž9Ÿ™W„NW…Ô9œ99ž9ŸæW†NW‡Ô9œ99ž9Ÿ 9WˆNW‰Ô9œ99ž9ŸåWŠNW‹Ô9œ99ž9ŸäWŒNWÔ9œ99ž9ŸmWŽNWÔ9œ99ž9Ÿ˜WNW‘Ô9œ99ž9ŸW’NW“Ô9œ99ž9Ÿ 8W”NW•Ô9œ99ž9ŸnW–NW—Ô9œ99ž9ŸoW˜NW™Ô9œ99ž9Ÿ—WšNW›Ô9œ99ž9ŸWœNWÔ9œ99ž9ŸpWžNWŸÔ9œ99ž9Ÿ ÖW NW¡Ô9œ99ž9ŸW¢NW£Ô9œ99ž9Ÿ ×W¤NW¥Ô9œ99ž9Ÿ–W¦NW§Ô9œ99ž9Ÿ ØW¨NW©Ô9œ99ž9ŸqWªNW«Ô9œ99ž9ŸW¬NW­Ô9œ99ž9ŸW®NW¯Ô9œ99ž9Ÿ•W°NW±Ô9œ99ž9ŸW²NW³Ô9œ99ž9ŸrW´NWµÔ9œ99ž9Ÿ 7W¶NW·Ô9œ99ž9ŸW¸NW¹Ô9œ99ž9ŸsWºNW»Ô9œ99ž9Ÿ ÙW¼NW½Ô9œ99ž9ŸtW¾NW¿Ô9œ99ž9Ÿ 6WÀNWÁÔ9œ99ž9ŸuWÂNWÃÔ9œ99ž9ŸvWÄNWÅÔ9œ99ž9ŸWÆNWÇÔ9œ99ž9Ÿ ÚWÈNWÉÔ9œ99ž9ŸwWÊNWËÔ9œ99ž9Ÿ”WÌNWÍÔ9œ99ž9ŸWÎNWÏÔ9œ99ž9ŸãWÐNWÑÔ9œ99ž9ŸxWÒNWÓÔ9œ99ž9Ÿ WÔNWÕÔ9œ99ž9Ÿ“WÖNW×Ô9œ99ž9Ÿ!WØNWÙÔ9œ99ž9ŸyWÚNWÛÔ9œ99ž9Ÿ 5WÜNWÝÔ9œ99ž9Ÿ"WÞNWßÔ9œ99ž9Ÿ ÛWàNWáÔ9œ99ž9Ÿ#WâNWãÔ9œ99ž9ŸâWäNWåÔ9œ99ž9Ÿ$WæNWçÔ9œ99ž9ŸáWèNWéÔ9œ99ž9ŸzWêNWëÔ9œ99ž9Ÿ 4WìNWíÔ9œ99ž9Ÿ%WîNWïÔ9œ99ž9Ÿ{WðNWñÔ9œ99ž9Ÿ&WòNWóÔ9œ99ž9Ÿ'WôNWõÔ9œ99ž9ŸàWöNW÷Ô9œ99ž9Ÿ(WøNWùÔ9œ99ž9ŸßWúNWûÔ9œ99ž9Ÿ|WüNWýÔ9œ99ž9ŸÞWþNWÿÔ9œ99ž9Ÿ)XNXÔ9œ99ž9Ÿ ÜXNXÔ9œ99ž9ŸÝXNXÔ9œ99ž9Ÿ*XNXÔ9œ99ž9Ÿ 3XNX Ô9œ99ž9Ÿ}X NX Ô9œ99ž9Ÿ 2X NX Ô9œ99ž9Ÿ 1XNXÔ9œ99ž9ŸÜXNXÔ9œ99ž9Ÿ’XNXÔ9œ99ž9ŸÛXNXÔ9œ99ž9ŸÚXNXÔ9œ99ž9Ÿ 0XNXÔ9œ99ž9Ÿ+XNXÔ9œ99ž9Ÿ,XNXÔ9œ99ž9Ÿ‘XNXÔ9œ99ž9ŸX NX!Ô9œ99ž9Ÿ ÝX"NX#Ô9œ99ž9ŸÙX$NX%Ô9œ99ž9Ÿ /X&NX'Ô9œ99ž9ŸX(NX)Ô9œ99ž9Ÿ .X*NX+Ô9œ99ž9Ÿ ÞX,NX-Ô9œ99ž9ŸŽX.NX/Ô9œ99ž9Ÿ -X0NX1Ô9œ99ž9Ÿ-X2NX3Ô9œ99ž9Ÿ~X4NX5Ô9œ99ž9ŸX6NX7Ô9œ99ž9ŸØX8NX9Ô9œ99ž9ŸŒX:NX;Ô9œ99ž9Ÿ.X<NX=Ô9œ99ž9Ÿ‹X>NX?Ô9œ99ž9Ÿ/X@NXAÔ9œ99ž9ŸXBNXCÔ9œ99ž9Ÿ€XDNXEÔ9œ99ž9ŸŠXFNXGÔ9œ99ž9Ÿ ßXHNXIÔ9œ99ž9ŸXJNXKÔ9œ99ž9Ÿ‰XLNXMÔ9œ99ž9Ÿ ,XNNXOÔ9œ99ž9ŸˆXPNXQÔ9œ99ž9Ÿ +XRNXSÔ9œ99ž9Ÿ‡XTNXUÔ9œ99ž9Ÿ àXVNXWÔ9œ99ž9Ÿ×XXNXYÔ9œ99ž9ŸÖXZNX[Ô9œ99ž9Ÿ‚X\NX]Ô9œ99ž9Ÿ†X^NX_Ô9œ99ž9ŸƒX`NXaÔ9œ99ž9ŸÕXbNXcÔ9œ99ž9Ÿ„XdNXeÔ9œ99ž9Ÿ…XfNXgÔ9œ99ž9ŸÔXhNXiÔ9œ99ž9Ÿ…XjNXkÔ9œ99ž9Ÿ áXlNXmÔ9œ99ž9Ÿ†XnNXoÔ9œ99ž9Ÿ„XpNXqÔ9œ99ž9Ÿ‡XrNXsÔ9œ99ž9ŸÓXtNXuÔ9œ99ž9ŸÒXvNXwÔ9œ99ž9ŸƒXxNXyÔ9œ99ž9ŸˆXzNX{Ô9œ99ž9Ÿ‰X|NX}Ô9œ99ž9ŸŠX~NXÔ9œ99ž9Ÿ0X€NXÔ9œ99ž9Ÿ‹X‚NXƒÔ9œ99ž9Ÿ‚X„NX…Ô9œ99ž9ŸŒX†NX‡Ô9œ99ž9Ÿ *XˆNX‰Ô9œ99ž9Ÿ )XŠNX‹Ô9œ99ž9ŸXŒNXÔ9œ99ž9Ÿ1XŽNXÔ9œ99ž9ŸŽXNX‘Ô9œ99ž9Ÿ2X’NX“Ô9œ99ž9Ÿ (X”NX•Ô9œ99ž9Ÿ âX–NX—Ô9œ99ž9ŸX˜NX™Ô9œ99ž9Ÿ ãXšNX›Ô9œ99ž9ŸXœNXÔ9œ99ž9Ÿ3XžNXŸÔ9œ99ž9ŸX NX¡Ô9œ99ž9Ÿ äX¢NX£Ô9œ99ž9Ÿ€X¤NX¥Ô9œ99ž9Ÿ åX¦NX§Ô9œ99ž9Ÿ æX¨NX©Ô9œ99ž9Ÿ 'XªNX«Ô9œ99ž9Ÿ çX¬NX­Ô9œ99ž9Ÿ èX®NX¯Ô9œ99ž9Ÿ‘X°NX±Ô9œ99ž9Ÿ4X²NX³Ô9œ99ž9ŸX´NXµÔ9œ99ž9Ÿ éX¶NX·Ô9œ99ž9Ÿ êX¸NX¹Ô9œ99ž9Ÿ5XºNX»Ô9œ99ž9Ÿ ëX¼NX½Ô9œ99ž9Ÿ ìX¾NX¿Ô9œ99ž9Ÿ~XÀNXÁÔ9œ99ž9Ÿ6XÂNXÃÔ9œ99ž9Ÿ íXÄNXÅÔ9œ99ž9Ÿ}XÆNXÇÔ9œ99ž9Ÿ îXÈNXÉÔ9œ99ž9Ÿ|XÊNXËÔ9œ99ž9Ÿ’XÌNXÍÔ9œ99ž9ŸÑXÎNXÏÔ9œ99ž9Ÿ{XÐNXÑÔ9œ99ž9Ÿ ïXÒNXÓÔ9œ99ž9Ÿ“XÔNXÕÔ9œ99ž9ŸzXÖNX×Ô9œ99ž9Ÿ”XØNXÙÔ9œ99ž9Ÿ ðXÚNXÛÔ9œ99ž9ŸyXÜNXÝÔ9œ99ž9Ÿ•XÞNXßÔ9œ99ž9ŸxXàNXáÔ9œ99ž9ŸÐXâNXãÔ9œ99ž9ŸwXäNXåÔ9œ99ž9ŸvXæNXçÔ9œ99ž9Ÿ–XèNXéÔ9œ99ž9ŸuXêNXëÔ9œ99ž9ŸtXìNXíÔ9œ99ž9Ÿ ñXîNXïÔ9œ99ž9Ÿ—XðNXñÔ9œ99ž9Ÿ7XòNXóÔ9œ99ž9Ÿ òXôNXõÔ9œ99ž9Ÿ˜XöNX÷Ô9œ99ž9ŸÏXøNXùÔ9œ99ž9ŸsXúNXûÔ9œ99ž9Ÿ™XüNXýÔ9œ99ž9ŸrXþNXÿÔ9œ99ž9Ÿ &YNYÔ9œ99ž9Ÿ %YNYÔ9œ99ž9Ÿ óYNYÔ9œ99ž9ŸšYNYÔ9œ99ž9ŸqYNY Ô9œ99ž9Ÿ ôY NY Ô9œ99ž9ŸÎY NY Ô9œ99ž9Ÿ›YNYÔ9œ99ž9ŸÍYNYÔ9œ99ž9ŸœYNYÔ9œ99ž9ŸÌYNYÔ9œ99ž9Ÿ õYNYÔ9œ99ž9Ÿ öYNYÔ9œ99ž9ŸYNYÔ9œ99ž9ŸËYNYÔ9œ99ž9Ÿ ÷YNYÔ9œ99ž9ŸžY NY!Ô9œ99ž9ŸÊY"NY#Ô9œ99ž9Ÿ8Y$NY%Ô9œ99ž9ŸŸY&NY'Ô9œ99ž9ŸÉY(NY)Ô9œ99ž9ŸÈY*NY+Ô9œ99ž9Ÿ øY,NY-Ô9œ99ž9Ÿ Y.NY/Ô9œ99ž9Ÿ9Y0NY1Ô9œ99ž9Ÿ¡Y2NY3Ô9œ99ž9Ÿ¢Y4NY5Ô9œ99ž9Ÿ:Y6NY7Ô9œ99ž9Ÿ;Y8NY9Ô9œ99ž9ŸÇY:NY;Ô9œ99ž9ŸNY?Ô9œ99ž9Ÿ ùY@NYAÔ9œ99ž9Ÿ $YBNYCÔ9œ99ž9Ÿ>YDNYEÔ9œ99ž9Ÿ úYFNYGÔ9œ99ž9ŸÆYHNYIÔ9œ99ž9ŸpYJNYKÔ9œ99ž9ŸYLAYMÔ9œ99ž9Ÿ?YNNYOÔ9œ99ž9Ÿ@YPNYQÔ9œ99ž9ŸÅYRNYSÔ9œ99ž9ŸÄYTNYUÔ9œ99ž9ŸoYVNYWÔ9œ99ž9Ÿ£YXNYYÔ9œ99ž9ŸÃYZNY[Ô9œ99ž9Ÿ¤Y\NY]Ô9œ99ž9ŸnY^NY_Ô9œ99ž9ŸY`@YaÔ9œ99ž9ŸÂYbNYcÔ9œ99ž9ŸYd?YeÔ9œ99ž9ŸÁYfNYgÔ9œ99ž9Ÿ #YhNYiÔ9œ99ž9Ÿ "YjNYkÔ9œ99ž9ŸÀYlNYmÔ9œ99ž9Ÿ¥YnNYoÔ9œ99ž9Ÿ¿YpNYqÔ9œ99ž9Ÿ¾YrNYsÔ9œ99ž9Ÿ½YtNYuÔ9œ99ž9Ÿ þYvNYwÔ9œ99ž9Ÿ¦YxNYyÔ9œ99ž9Ÿ ÿYzNY{Ô9œ99ž9Ÿ Y|NY}Ô9œ99ž9Ÿ¼Y~NYÔ9œ99ž9Ÿ§Y€NYÔ9œ99ž9Ÿ¨Y‚NYƒÔ9œ99ž9Ÿ©Y„NY…Ô9œ99ž9Ÿ !Y†NY‡Ô9œ99ž9Ÿ YˆNY‰Ô9œ99ž9Ÿ YŠNY‹Ô9œ99ž9Ÿ YŒNYÔ9œ99ž9Ÿ YŽNYÔ9œ99ž9Ÿ YNY‘Ô9œ99ž9ŸAY’NY“Ô9œ99ž9Ÿ Y”NY•Ô9œ99ž9Ÿ Y–NY—Ô9œ99ž9ŸBY˜NY™Ô9œ99ž9ŸªYšNY›Ô9œ99ž9Ÿ«YœNYÔ9œ99ž9Ÿ»YžNYŸÔ9œ99ž9Ÿ Y NY¡Ô9œ99ž9Ÿ¬Y¢NY£Ô9œ99ž9ŸmY¤NY¥Ô9œ99ž9Ÿ Y¦NY§Ô9œ99ž9ŸlY¨NY©Ô9œ99ž9ŸkYªNY«Ô9œ99ž9ŸjY¬NY­Ô9œ99ž9ŸCY®NY¯Ô9œ99ž9Ÿ­Y°NY±Ô9œ99ž9ŸºY²NY³Ô9œ99ž9Ÿ PY´NYµÔ9œ99ž9ŸDY¶NY·Ô9œ99ž9Ÿ Y¸NY¹Ô9œ99ž9Ÿ¹YºNY»Ô9œ99ž9Ÿ¸Y¼NY½Ô9œ99ž9Ÿ®Y¾NY¿Ô9œ99ž9Ÿ QYÀNYÁÔ9œ99ž9Ÿ¯YÂNYÃÔ9œ99ž9Ÿ YÄNYÅÔ9œ99ž9Ÿ°YÆNYÇÔ9œ99ž9Ÿ·YÈNYÉÔ9œ99ž9ŸEYÊNYËÔ9œ99ž9Ÿ YÌNYÍÔ9œ99ž9Ÿ±YÎNYÏÔ9œ99ž9Ÿ¶YÐNYÑÔ9œ99ž9Ÿ YÒNYÓÔ9œ99ž9Ÿ YÔNYÕÔ9œ99ž9ŸµYÖNY×Ô9œ99ž9Ÿ RYØNYÙÔ9œ99ž9ŸFYÚNYÛÔ9œ99ž9Ÿ²YÜNYÝÔ9œ99ž9ŸiYÞNYßÔ9œ99ž9Ÿ1YàNYáÔ9œ99ž9ŸGYâNYãÔ9œ99ž9Ÿ YäNYåÔ9œ99ž9Ÿ´YæNYçÔ9œ99ž9Ÿ³YèNYéÔ9œ99ž9Ÿ SYêNYëÔ9œ99ž9Ÿ TYìNYíÔ9œ99ž9Ÿ YîNYïÔ9œ99ž9Ÿ YðNYñÔ9œ99ž9ŸhYòNYóÔ9œ99ž9ŸHYôNYõÔ9œ99ž9Ÿ³YöNY÷Ô9œ99ž9Ÿ UYøNYùÔ9œ99ž9Ÿ VYúNYûÔ9œ99ž9Ÿ²YüNYýÔ9œ99ž9ŸgYþNYÿÔ9œ99ž9Ÿ±ZNZÔ9œ99ž9Ÿ WZNZÔ9œ99ž9ŸIZNZÔ9œ99ž9ŸJZNZÔ9œ99ž9Ÿ ZNZ Ô9œ99ž9Ÿ XZ NZ Ô9œ99ž9Ÿ Z NZ Ô9œ99ž9Ÿ YZNZÔ9œ99ž9Ÿ´ZNZÔ9œ99ž9Ÿ°ZNZÔ9œ99ž9Ÿ ZZNZÔ9œ99ž9ŸfZNZÔ9œ99ž9Ÿ [ZNZÔ9œ99ž9Ÿ ZNZÔ9œ99ž9Ÿ¯ZNZÔ9œ99ž9ŸµZNZÔ9œ99ž9Ÿ Z NZ!Ô9œ99ž9ŸKZ"NZ#Ô9œ99ž9Ÿ¶Z$NZ%Ô9œ99ž9ŸLZ&NZ'Ô9œ99ž9Ÿ Z(NZ)Ô9œ99ž9Ÿ®Z*NZ+Ô9œ99ž9ŸMZ,NZ-Ô9œ99ž9Ÿ·Z.NZ/Ô9œ99ž9ŸNZ0NZ1Ô9œ99ž9Ÿ¸Z2NZ3Ô9œ99ž9Ÿ \Z4NZ5Ô9œ99ž9Ÿ¹Z6NZ7Ô9œ99ž9Ÿ­Z8NZ9Ô9œ99ž9Ÿ¬Z:NZ;Ô9œ99ž9Ÿ Z<NZ=Ô9œ99ž9Ÿ Z>NZ?Ô9œ99ž9ŸOZ@NZAÔ9œ99ž9Ÿ ZBNZCÔ9œ99ž9Ÿ«ZDNZEÔ9œ99ž9ŸPZFNZGÔ9œ99ž9ŸªZHNZIÔ9œ99ž9Ÿ©ZJNZKÔ9œ99ž9ŸeZLNZMÔ9œ99ž9Ÿ¨ZNNZOÔ9œ99ž9ŸdZPNZQÔ9œ99ž9ŸQZRNZSÔ9œ99ž9Ÿ ]ZTNZUÔ9œ99ž9Ÿ ^ZVNZWÔ9œ99ž9ŸRZXNZYÔ9œ99ž9ŸcZZNZ[Ô9œ99ž9Ÿ _Z\NZ]Ô9œ99ž9ŸSZ^NZ_Ô9œ99ž9Ÿ Z`NZaÔ9œ99ž9Ÿ§ZbNZcÔ9œ99ž9ŸbZdNZeÔ9œ99ž9Ÿ¦ZfNZgÔ9œ99ž9ŸaZhNZiÔ9œ99ž9Ÿ `ZjNZkÔ9œ99ž9ŸTZlNZmÔ9œ99ž9Ÿ`ZnNZoÔ9œ99ž9Ÿ_ZpNZqÔ9œ99ž9Ÿ ZrNZsÔ9œ99ž9Ÿ¥ZtNZuÔ9œ99ž9ŸUZvNZwÔ9œ99ž9Ÿ ZxNZyÔ9œ99ž9ŸVZzNZ{Ô9œ99ž9ŸWZ|NZ}Ô9œ99ž9ŸXZ~NZÔ9œ99ž9ŸYZ€NZÔ9œ99ž9Ÿ Z‚NZƒÔ9œ99ž9Ÿ Z„NZ…Ô9œ99ž9Ÿ Z†NZ‡Ô9œ99ž9ŸºZˆNZ‰Ô9œ99ž9ŸZZŠNZ‹Ô9œ99ž9Ÿ»ZŒNZÔ9œ99ž9Ÿ¼ZŽNZÔ9œ99ž9Ÿ[ZNZ‘Ô9œ99ž9Ÿ½Z’NZ“Ô9œ99ž9Ÿ¾Z”NZ•Ô9œ99ž9Ÿ aZ–NZ—Ô9œ99ž9Ÿ\Z˜NZ™Ô9œ99ž9Ÿ¿ZšNZ›Ô9œ99ž9Ÿ]ZœNZÔ9œ99ž9ŸÀZžNZŸÔ9œ99ž9ŸÁZ NZ¡Ô9œ99ž9ŸÂZ¢NZ£Ô9œ99ž9ŸÃZ¤NZ¥Ô9œ99ž9Ÿ^Z¦NZ§Ô9œ99ž9Ÿ]Z¨NZ©Ô9œ99ž9ŸÄZªNZ«Ô9œ99ž9Ÿ bZ¬NZ­Ô9œ99ž9ŸÅZ®NZ¯Ô9œ99ž9Ÿ\Z°NZ±Ô9œ99ž9Ÿ3Z²NZ³Ô9œ99ž9ŸÆZ´NZµÔ9œ99ž9Ÿ Z¶NZ·Ô9œ99ž9Ÿ¤Z¸NZ¹Ô9œ99ž9Ÿ£ZºNZ»Ô9œ99ž9Ÿ Z¼NZ½Ô9œ99ž9Ÿ Z¾NZ¿Ô9œ99ž9Ÿ cZÀNZÁÔ9œ99ž9Ÿ^ZÂNZÃÔ9œ99ž9Ÿ ZÄNZÅÔ9œ99ž9Ÿ ZÆNZÇÔ9œ99ž9Ÿ ZÈNZÉÔ9œ99ž9ŸÇZÊNZËÔ9œ99ž9Ÿ¢ZÌNZÍÔ9œ99ž9ŸÈZÎNZÏÔ9œ99ž9Ÿ[ZÐNZÑÔ9œ99ž9Ÿ dZÒNZÓÔ9œ99ž9Ÿ_ZÔNZÕÔ9œ99ž9Ÿ`ZÖNZ×Ô9œ99ž9Ÿ ZØNZÙÔ9œ99ž9Ÿ ZÚNZÛÔ9œ99ž9ŸÉZÜNZÝÔ9œ99ž9ŸZZÞNZßÔ9œ99ž9ŸÊZàNZáÔ9œ99ž9ŸYZâNZãÔ9œ99ž9Ÿ !ZäNZåÔ9œ99ž9ŸXZæNZçÔ9œ99ž9ŸËZèNZéÔ9œ99ž9Ÿ¡ZêNZëÔ9œ99ž9ŸaZìNZíÔ9œ99ž9Ÿ ZîNZïÔ9œ99ž9ŸbZðNZñÔ9œ99ž9ŸŸZòNZóÔ9œ99ž9ŸWZôNZõÔ9œ99ž9ŸVZöNZ÷Ô9œ99ž9ŸUZøNZùÔ9œ99ž9ŸTZúNZûÔ9œ99ž9ŸÌZüNZýÔ9œ99ž9ŸcZþNZÿÔ9œ99ž9Ÿ "[N[Ô9œ99ž9Ÿ #[N[Ô9œ99ž9ŸÍ[N[Ô9œ99ž9ŸÎ[N[Ô9œ99ž9Ÿd[N[ Ô9œ99ž9Ÿ $[ N[ Ô9œ99ž9ŸÏ[ N[ Ô9œ99ž9Ÿ %[N[Ô9œ99ž9ŸÐ[N[Ô9œ99ž9ŸS[N[Ô9œ99ž9Ÿ e[N[Ô9œ99ž9Ÿe[N[Ô9œ99ž9ŸÑ[N[Ô9œ99ž9Ÿ f[N[Ô9œ99ž9Ÿ &[N[Ô9œ99ž9Ÿ g[N[Ô9œ99ž9Ÿf[ N[!Ô9œ99ž9ŸÒ["N[#Ô9œ99ž9ŸÓ[$N[%Ô9œ99ž9ŸR[&N['Ô9œ99ž9Ÿg[(N[)Ô9œ99ž9Ÿ h[*N[+Ô9œ99ž9ŸÔ[,N[-Ô9œ99ž9Ÿ i[.N[/Ô9œ99ž9ŸÕ[0N[1Ô9œ99ž9ŸQ[2N[3Ô9œ99ž9Ÿ j[4N[5Ô9œ99ž9ŸP[6N[7Ô9œ99ž9ŸÖ[8N[9Ô9œ99ž9Ÿ k[:N[;Ô9œ99ž9Ÿh[<N[=Ô9œ99ž9Ÿ×[>N[?Ô9œ99ž9Ÿž[@N[AÔ9œ99ž9ŸØ[BN[CÔ9œ99ž9Ÿ[DN[EÔ9œ99ž9ŸÙ[FN[GÔ9œ99ž9ŸÚ[HN[IÔ9œ99ž9Ÿ l[JN[KÔ9œ99ž9ŸÛ[LN[MÔ9œ99ž9Ÿi[NN[OÔ9œ99ž9ŸÜ[PN[QÔ9œ99ž9Ÿ m[RN[SÔ9œ99ž9Ÿj[TN[UÔ9œ99ž9Ÿœ[VN[WÔ9œ99ž9Ÿk[XN[YÔ9œ99ž9Ÿ '[ZN[[Ô9œ99ž9Ÿl[\N[]Ô9œ99ž9Ÿ ([^N[_Ô9œ99ž9ŸÝ[`N[aÔ9œ99ž9ŸO[bN[cÔ9œ99ž9Ÿ )[dN[eÔ9œ99ž9Ÿ *[fN[gÔ9œ99ž9Ÿm[hN[iÔ9œ99ž9ŸÞ[jN[kÔ9œ99ž9Ÿ›[lN[mÔ9œ99ž9Ÿn[nN[oÔ9œ99ž9Ÿš[pN[qÔ9œ99ž9ŸN[rN[sÔ9œ99ž9Ÿ +[tN[uÔ9œ99ž9Ÿ™[vN[wÔ9œ99ž9Ÿ ,[xN[yÔ9œ99ž9Ÿ n[zN[{Ô9œ99ž9Ÿ˜[|N[}Ô9œ99ž9Ÿ o[~N[Ô9œ99ž9Ÿß[€N[Ô9œ99ž9Ÿo[‚N[ƒÔ9œ99ž9Ÿp[„N[…Ô9œ99ž9Ÿ p[†N[‡Ô9œ99ž9ŸM[ˆN[‰Ô9œ99ž9Ÿ q[ŠN[‹Ô9œ99ž9Ÿà[ŒN[Ô9œ99ž9Ÿ r[ŽN[Ô9œ99ž9Ÿ s[N[‘Ô9œ99ž9Ÿq[’N[“Ô9œ99ž9Ÿ t[”N[•Ô9œ99ž9Ÿ u[–N[—Ô9œ99ž9Ÿr[˜N[™Ô9œ99ž9ŸL[šN[›Ô9œ99ž9Ÿs[œN[Ô9œ99ž9Ÿ -[žN[ŸÔ9œ99ž9Ÿt[ N[¡Ô9œ99ž9Ÿu[¢N[£Ô9œ99ž9Ÿ .[¤N[¥Ô9œ99ž9Ÿá[¦N[§Ô9œ99ž9Ÿv[¨N[©Ô9œ99ž9Ÿ /[ªN[«Ô9œ99ž9ŸK[¬N[­Ô9œ99ž9ŸJ[®N[¯Ô9œ99ž9Ÿ—[°N[±Ô9œ99ž9ŸI[²N[³Ô9œ99ž9Ÿ 0[´N[µÔ9œ99ž9Ÿ 1[¶N[·Ô9œ99ž9ŸH[¸N[¹Ô9œ99ž9Ÿw[ºN[»Ô9œ99ž9Ÿ–[¼N[½Ô9œ99ž9ŸG[¾N[¿Ô9œ99ž9Ÿ•[ÀN[ÁÔ9œ99ž9Ÿ 2[ÂN[ÃÔ9œ99ž9Ÿâ[ÄN[ÅÔ9œ99ž9ŸF[ÆN[ÇÔ9œ99ž9Ÿx[ÈN[ÉÔ9œ99ž9ŸE[ÊN[ËÔ9œ99ž9Ÿã[ÌN[ÍÔ9œ99ž9ŸD[ÎN[ÏÔ9œ99ž9Ÿ 3[ÐN[ÑÔ9œ99ž9Ÿ v[ÒN[ÓÔ9œ99ž9Ÿ 4[ÔN[ÕÔ9œ99ž9Ÿ 5[ÖN[×Ô9œ99ž9Ÿ”[ØN[ÙÔ9œ99ž9Ÿ 6[ÚN[ÛÔ9œ99ž9Ÿ“[ÜN[ÝÔ9œ99ž9Ÿ 7[ÞN[ßÔ9œ99ž9Ÿ’[àN[áÔ9œ99ž9Ÿ w[âN[ãÔ9œ99ž9Ÿ 8[äN[åÔ9œ99ž9Ÿ‘[æN[çÔ9œ99ž9Ÿ x[èN[éÔ9œ99ž9Ÿ y[êN[ëÔ9œ99ž9Ÿy[ìN[íÔ9œ99ž9Ÿ 9[îN[ïÔ9œ99ž9Ÿ :[ðN[ñÔ9œ99ž9Ÿ[òN[óÔ9œ99ž9Ÿä[ôN[õÔ9œ99ž9Ÿ[öN[÷Ô9œ99ž9Ÿz[øN[ùÔ9œ99ž9Ÿå[úN[ûÔ9œ99ž9Ÿ8[üN[ýÔ9œ99ž9ŸŽ[þN[ÿÔ9œ99ž9Ÿ z\N\Ô9œ99ž9Ÿ ;\N\Ô9œ99ž9Ÿ {\N\Ô9œ99ž9Ÿ <\N\Ô9œ99ž9Ÿ |\N\ Ô9œ99ž9Ÿ =\ N\ Ô9œ99ž9Ÿ\ N\ Ô9œ99ž9Ÿ }\N\Ô9œ99ž9Ÿ >\N\Ô9œ99ž9Ÿ ?\N\Ô9œ99ž9Ÿæ\N\Ô9œ99ž9Ÿ ~\N\Ô9œ99ž9Ÿ{\N\Ô9œ99ž9ŸŒ\N\Ô9œ99ž9Ÿ‹\N\Ô9œ99ž9ŸŠ\N\Ô9œ99ž9Ÿ|\ N\!Ô9œ99ž9ŸC\"N\#Ô9œ99ž9ŸB\$N\%Ô9œ99ž9Ÿ @\&N\'Ô9œ99ž9Ÿ \(N\)Ô9œ99ž9ŸA\*N\+Ô9œ99ž9Ÿ@\,N\-Ô9œ99ž9Ÿ €\.N\/Ô9œ99ž9Ÿ A\0N\1Ô9œ99ž9Ÿ B\2N\3Ô9œ99ž9Ÿ‰\4N\5Ô9œ99ž9Ÿ C\6N\7Ô9œ99ž9Ÿ?\8N\9Ô9œ99ž9Ÿ>\:N\;Ô9œ99ž9Ÿ D\<N\=Ô9œ99ž9Ÿˆ\>N\?Ô9œ99ž9Ÿ \@N\AÔ9œ99ž9Ÿ}\BN\CÔ9œ99ž9Ÿ E\DN\EÔ9œ99ž9Ÿ~\FN\GÔ9œ99ž9Ÿ=\HN\IÔ9œ99ž9Ÿ\JN\KÔ9œ99ž9Ÿ<\LN\MÔ9œ99ž9Ÿ ‚\NN\OÔ9œ99ž9Ÿ€\PN\QÔ9œ99ž9Ÿ ƒ\RN\SÔ9œ99ž9Ÿ F\TN\UÔ9œ99ž9Ÿ‡\VN\WÔ9œ99ž9Ÿ\XN\YÔ9œ99ž9Ÿ;\ZN\[Ô9œ99ž9Ÿ‚\\N\]Ô9œ99ž9Ÿ G\^N\_Ô9œ99ž9Ÿ†\`N\aÔ9œ99ž9Ÿ H\bN\cÔ9œ99ž9Ÿç\dN\eÔ9œ99ž9Ÿƒ\fN\gÔ9œ99ž9Ÿè\hN\iÔ9œ99ž9Ÿ„\jN\kÔ9œ99ž9Ÿé\lN\mÔ9œ99ž9Ÿ:\nN\oÔ9œ99ž9Ÿ…\pN\qÔ9œ99ž9Ÿ…\rN\sÔ9œ99ž9Ÿ9\tN\uÔ9œ99ž9Ÿ†\vN\wÔ9œ99ž9Ÿ8\xN\yÔ9œ99ž9Ÿê\zN\{Ô9œ99ž9Ÿ7\|N\}Ô9œ99ž9Ÿ „\~N\Ô9œ99ž9Ÿë\€N\Ô9œ99ž9Ÿ6\‚N\ƒÔ9œ99ž9Ÿ‡\„N\…Ô9œ99ž9Ÿ5\†N\‡Ô9œ99ž9Ÿˆ\ˆN\‰Ô9œ99ž9Ÿì\ŠN\‹Ô9œ99ž9Ÿí\ŒN\Ô9œ99ž9Ÿ‰\ŽN\Ô9œ99ž9Ÿ I\N\‘Ô9œ99ž9Ÿ„\’N\“Ô9œ99ž9ŸŠ\”N\•Ô9œ99ž9Ÿ‹\–N\—Ô9œ99ž9Ÿƒ\˜N\™Ô9œ99ž9Ÿ‚\šN\›Ô9œ99ž9Ÿ\œN\Ô9œ99ž9Ÿ …\žN\ŸÔ9œ99ž9Ÿ †\ N\¡Ô9œ99ž9Ÿî\¢N\£Ô9œ99ž9Ÿ4\¤N\¥Ô9œ99ž9Ÿ J\¦N\§Ô9œ99ž9Ÿ€\¨N\©Ô9œ99ž9Ÿ3\ªN\«Ô9œ99ž9Ÿ K\¬N\­Ô9œ99ž9Ÿ º\®N\¯Ô9œ99ž9Ÿ L\°N\±Ô9œ99ž9Ÿ M\²N\³Ô9œ99ž9Ÿ N\´N\µÔ9œ99ž9Ÿï\¶N\·Ô9œ99ž9Ÿ2\¸N\¹Ô9œ99ž9Ÿ »\ºN\»Ô9œ99ž9Ÿð\¼N\½Ô9œ99ž9Ÿ1\¾N\¿Ô9œ99ž9Ÿ ¼\ÀN\ÁÔ9œ99ž9Ÿ O\ÂN\ÃÔ9œ99ž9Ÿñ\ÄN\ÅÔ9œ99ž9Ÿ ½\ÆN\ÇÔ9œ99ž9Ÿ ¾\ÈN\ÉÔ9œ99ž9ŸŒ\ÊN\ËÔ9œ99ž9Ÿ0\ÌN\ÍÔ9œ99ž9Ÿ ‡\ÎN\ÏÔ9œ99ž9Ÿò\ÐN\ÑÔ9œ99ž9Ÿ ˆ\ÒN\ÓÔ9œ99ž9Ÿ P\ÔN\ÕÔ9œ99ž9Ÿó\ÖN\×Ô9œ99ž9Ÿô\ØN\ÙÔ9œ99ž9Ÿ/\ÚN\ÛÔ9œ99ž9Ÿ ¿\ÜN\ÝÔ9œ99ž9Ÿõ\ÞN\ßÔ9œ99ž9Ÿö\àN\áÔ9œ99ž9Ÿ.\âN\ãÔ9œ99ž9Ÿ ‰\äN\åÔ9œ99ž9Ÿ Q\æN\çÔ9œ99ž9Ÿ R\èN\éÔ9œ99ž9Ÿ S\êN\ëÔ9œ99ž9Ÿ÷\ìN\íÔ9œ99ž9Ÿø\îN\ïÔ9œ99ž9Ÿ\ðN\ñÔ9œ99ž9Ÿ-\òN\óÔ9œ99ž9Ÿ Š\ôN\õÔ9œ99ž9Ÿ T\öN\÷Ô9œ99ž9Ÿ,\øN\ùÔ9œ99ž9Ÿ~\úN\ûÔ9œ99ž9Ÿ}\üN\ýÔ9œ99ž9Ÿ ‹\þN\ÿÔ9œ99ž9Ÿ À]N]Ô9œ99ž9Ÿ Œ]N]Ô9œ99ž9Ÿ U]N]Ô9œ99ž9Ÿ Á]N]Ô9œ99ž9Ÿ ]N] Ô9œ99ž9Ÿ Â] N] Ô9œ99ž9Ÿ Ž] N] Ô9œ99ž9Ÿ+]N]Ô9œ99ž9Ÿ ]N]Ô9œ99ž9Ÿ*]N]Ô9œ99ž9Ÿ Ã]N]Ô9œ99ž9Ÿ)]N]Ô9œ99ž9Ÿ(]N]Ô9œ99ž9Ÿ ]N]Ô9œ99ž9Ÿ V]N]Ô9œ99ž9Ÿ ‘]N]Ô9œ99ž9Ÿ ’] N]!Ô9œ99ž9Ÿ Ä]"N]#Ô9œ99ž9Ÿù]$N]%Ô9œ99ž9Ÿ|]&N]'Ô9œ99ž9Ÿ{](N])Ô9œ99ž9Ÿ “]*N]+Ô9œ99ž9Ÿú],N]-Ô9œ99ž9Ÿz].N]/Ô9œ99ž9Ÿ ”]0N]1Ô9œ99ž9Ÿy]2N]3Ô9œ99ž9Ÿ W]4N]5Ô9œ99ž9Ÿx]6N]7Ô9œ99ž9Ÿw]8N]9Ô9œ99ž9Ÿ X]:N];Ô9œ99ž9Ÿv]<N]=Ô9œ99ž9Ÿu]>N]?Ô9œ99ž9Ÿt]@N]AÔ9œ99ž9Ÿ]BN]CÔ9œ99ž9Ÿs]DN]EÔ9œ99ž9Ÿ •]FN]GÔ9œ99ž9Ÿû]HN]IÔ9œ99ž9Ÿ Y]JN]KÔ9œ99ž9Ÿü]LN]MÔ9œ99ž9Ÿý]NN]OÔ9œ99ž9Ÿ Å]PN]QÔ9œ99ž9Ÿ']RN]SÔ9œ99ž9Ÿ –]TN]UÔ9œ99ž9Ÿ Æ]VN]WÔ9œ99ž9Ÿ —]XN]YÔ9œ99ž9ŸŽ]ZN][Ô9œ99ž9Ÿr]\N]]Ô9œ99ž9Ÿ ˜]^N]_Ô9œ99ž9Ÿþ]`N]aÔ9œ99ž9Ÿq]bN]cÔ9œ99ž9Ÿ Ç]dN]eÔ9œ99ž9Ÿ&]fN]gÔ9œ99ž9Ÿ%]hN]iÔ9œ99ž9Ÿ]jN]kÔ9œ99ž9Ÿ ™]lN]mÔ9œ99ž9Ÿ]nN]oÔ9œ99ž9Ÿp]pN]qÔ9œ99ž9Ÿ š]rN]sÔ9œ99ž9Ÿ‘]tN]uÔ9œ99ž9Ÿo]vN]wÔ9œ99ž9Ÿ Z]xN]yÔ9œ99ž9Ÿ$]zN]{Ô9œ99ž9Ÿ ›]|N]}Ô9œ99ž9Ÿ È]~N]Ô9œ99ž9Ÿ#]€N]Ô9œ99ž9Ÿ É]‚N]ƒÔ9œ99ž9Ÿ []„N]…Ô9œ99ž9Ÿn]†N]‡Ô9œ99ž9Ÿ \]ˆN]‰Ô9œ99ž9Ÿm]ŠN]‹Ô9œ99ž9Ÿ œ]ŒN]Ô9œ99ž9Ÿ"]ŽN]Ô9œ99ž9Ÿ!]N]‘Ô9œ99ž9Ÿl]’N]“Ô9œ99ž9Ÿ ]”N]•Ô9œ99ž9Ÿ’]–N]—Ô9œ99ž9Ÿ ž]˜N]™Ô9œ99ž9Ÿ Ê]šN]›Ô9œ99ž9Ÿ ]œN]Ô9œ99ž9Ÿ Ë]žN]ŸÔ9œ99ž9Ÿk] N]¡Ô9œ99ž9Ÿ Ì]¢N]£Ô9œ99ž9Ÿj]¤N]¥Ô9œ99ž9Ÿ Í]¦N]§Ô9œ99ž9Ÿ Î]¨N]©Ô9œ99ž9Ÿ Ï]ªN]«Ô9œ99ž9Ÿ ]]¬N]­Ô9œ99ž9Ÿÿ]®N]¯Ô9œ99ž9Ÿ]°N]±Ô9œ99ž9Ÿ Ð]²N]³Ô9œ99ž9Ÿ]´N]µÔ9œ99ž9Ÿ Ñ]¶N]·Ô9œ99ž9Ÿ Ò]¸N]¹Ô9œ99ž9Ÿ]ºN]»Ô9œ99ž9Ÿ“]¼N]½Ô9œ99ž9Ÿ]¾N]¿Ô9œ99ž9Ÿ]ÀN]ÁÔ9œ99ž9Ÿ Ÿ]ÂN]ÃÔ9œ99ž9Ÿ”]ÄN]ÅÔ9œ99ž9Ÿ]ÆN]ÇÔ9œ99ž9Ÿi]ÈN]ÉÔ9œ99ž9Ÿ•]ÊN]ËÔ9œ99ž9Ÿ–]ÌN]ÍÔ9œ99ž9Ÿh]ÎN]ÏÔ9œ99ž9Ÿ]ÐN]ÑÔ9œ99ž9Ÿ Ó]ÒN]ÓÔ9œ99ž9Ÿ]ÔN]ÕÔ9œ99ž9Ÿ—]ÖN]×Ô9œ99ž9Ÿ]ØN]ÙÔ9œ99ž9Ÿ  ]ÚN]ÛÔ9œ99ž9Ÿ]ÜN]ÝÔ9œ99ž9Ÿg]ÞN]ßÔ9œ99ž9Ÿ]àN]áÔ9œ99ž9Ÿ]âN]ãÔ9œ99ž9Ÿ ¡]äN]åÔ9œ99ž9Ÿ]æN]çÔ9œ99ž9Ÿ˜]èN]éÔ9œ99ž9Ÿf]êN]ëÔ9œ99ž9Ÿ]ìN]íÔ9œ99ž9Ÿ™]îN]ïÔ9œ99ž9Ÿ ^]ðN]ñÔ9œ99ž9Ÿ]òN]óÔ9œ99ž9Ÿš]ôN]õÔ9œ99ž9Ÿ›]öN]÷Ô9œ99ž9Ÿ _]øN]ùÔ9œ99ž9Ÿe]úN]ûÔ9œ99ž9Ÿ ¢]üN]ýÔ9œ99ž9Ÿ ]þN]ÿÔ9œ99ž9Ÿ £^N^Ô9œ99ž9Ÿ ^N^Ô9œ99ž9Ÿ ^N^Ô9œ99ž9Ÿœ^N^Ô9œ99ž9Ÿ^N^ Ô9œ99ž9Ÿ ¤^ N^ Ô9œ99ž9Ÿ^ N^ Ô9œ99ž9Ÿ ¥^N^Ô9œ99ž9Ÿž^N^Ô9œ99ž9Ÿ ¦^N^Ô9œ99ž9Ÿ §^N^Ô9œ99ž9Ÿ Ô^N^Ô9œ99ž9Ÿ Õ^N^Ô9œ99ž9Ÿ Ö^N^Ô9œ99ž9Ÿd^N^Ô9œ99ž9Ÿ ×^N^Ô9œ99ž9ŸŸ^ N^!Ô9œ99ž9Ÿc^"N^#Ô9œ99ž9Ÿ Ø^$N^%Ô9œ99ž9Ÿb^&N^'Ô9œ99ž9Ÿ ¨^(N^)Ô9œ99ž9Ÿ Ù^*N^+Ô9œ99ž9Ÿ ^,N^-Ô9œ99ž9Ÿ ©^.N^/Ô9œ99ž9Ÿ `^0N^1Ô9œ99ž9Ÿa^2N^3Ô9œ99ž9Ÿ^4N^5Ô9œ99ž9Ÿ`^6N^7Ô9œ99ž9Ÿ^8N^9Ô9œ99ž9Ÿ^:N^;Ô9œ99ž9Ÿ Ú^<N^=Ô9œ99ž9Ÿ ^>N^?Ô9œ99ž9Ÿ_^@N^AÔ9œ99ž9Ÿ ª^BN^CÔ9œ99ž9Ÿ ^DN^EÔ9œ99ž9Ÿ a^FN^GÔ9œ99ž9Ÿ^^HN^IÔ9œ99ž9Ÿ «^JN^KÔ9œ99ž9Ÿ b^LN^MÔ9œ99ž9Ÿ ¬^NN^OÔ9œ99ž9Ÿ Û^PN^QÔ9œ99ž9Ÿ¡^RN^SÔ9œ99ž9Ÿ c^TN^UÔ9œ99ž9Ÿ^VN^WÔ9œ99ž9Ÿ]^XN^YÔ9œ99ž9Ÿ Ü^ZN^[Ô9œ99ž9Ÿ^\N^]Ô9œ99ž9Ÿ\^^N^_Ô9œ99ž9Ÿ Ý^`N^aÔ9œ99ž9Ÿ¢^bN^cÔ9œ99ž9Ÿ d^dN^eÔ9œ99ž9Ÿ£^fN^gÔ9œ99ž9Ÿ[^hN^iÔ9œ99ž9Ÿ Þ^jN^kÔ9œ99ž9Ÿ e^lN^mÔ9œ99ž9ŸZ^nN^oÔ9œ99ž9Ÿ ­^pN^qÔ9œ99ž9Ÿ f^rN^sÔ9œ99ž9Ÿ ®^tN^uÔ9œ99ž9Ÿ g^vN^wÔ9œ99ž9Ÿ ß^xN^yÔ9œ99ž9Ÿ^zN^{Ô9œ99ž9Ÿ¤^|N^}Ô9œ99ž9Ÿ^~N^Ô9œ99ž9Ÿ^€N^Ô9œ99ž9ŸY^‚N^ƒÔ9œ99ž9Ÿ à^„N^…Ô9œ99ž9Ÿ á^†N^‡Ô9œ99ž9Ÿ^ˆN^‰Ô9œ99ž9Ÿ^ŠN^‹Ô9œ99ž9Ÿ^ŒN^Ô9œ99ž9Ÿ ¯^ŽN^Ô9œ99ž9Ÿ^N^‘Ô9œ99ž9ŸX^’N^“Ô9œ99ž9Ÿ^”N^•Ô9œ99ž9Ÿ °^–N^—Ô9œ99ž9Ÿ^˜N^™Ô9œ99ž9Ÿ ±^šN^›Ô9œ99ž9Ÿ¥^œN^Ô9œ99ž9Ÿ^žN^ŸÔ9œ99ž9Ÿ â^ N^¡Ô9œ99ž9Ÿ ²^¢N^£Ô9œ99ž9Ÿ ³^¤N^¥Ô9œ99ž9Ÿ ã^¦N^§Ô9œ99ž9Ÿ ä^¨N^©Ô9œ99ž9Ÿ^ªN^«Ô9œ99ž9Ÿ^¬N^­Ô9œ99ž9Ÿ¦^®N^¯Ô9œ99ž9Ÿ h^°N^±Ô9œ99ž9Ÿ^²N^³Ô9œ99ž9Ÿ^´N^µÔ9œ99ž9Ÿ§^¶N^·Ô9œ99ž9ŸW^¸N^¹Ô9œ99ž9Ÿ¨^ºN^»Ô9œ99ž9Ÿ^¼N^½Ô9œ99ž9Ÿ ^¾N^¿Ô9œ99ž9Ÿ^ÀN^ÁÔ9œ99ž9Ÿ ^ÂN^ÃÔ9œ99ž9Ÿ^ÄN^ÅÔ9œ99ž9Ÿ ´^ÆN^ÇÔ9œ99ž9ŸV^ÈN^ÉÔ9œ99ž9Ÿ i^ÊN^ËÔ9œ99ž9Ÿ^ÌN^ÍÔ9œ99ž9Ÿ µ^ÎN^ÏÔ9œ99ž9Ÿ j^ÐN^ÑÔ9œ99ž9Ÿ k^ÒN^ÓÔ9œ99ž9Ÿ ^ÔN^ÕÔ9œ99ž9Ÿ ¶^ÖN^×Ô9œ99ž9Ÿ^ØN^ÙÔ9œ99ž9Ÿ ·^ÚN^ÛÔ9œ99ž9Ÿ l^ÜN^ÝÔ9œ99ž9Ÿ ^ÞN^ßÔ9œ99ž9ŸU^àN^áÔ9œ99ž9Ÿ^âN^ãÔ9œ99ž9Ÿ ^äN^åÔ9œ99ž9Ÿ^æN^çÔ9œ99ž9Ÿ^èN^éÔ9œ99ž9Ÿ ¸^êN^ëÔ9œ99ž9Ÿ©^ìN^íÔ9œ99ž9Ÿ^îN^ïÔ9œ99ž9Ÿ^ðN^ñÔ9œ99ž9Ÿ^òN^óÔ9œ99ž9Ÿ ¹^ôN^õÔ9œ99ž9Ÿª^öN^÷Ô9œ99ž9Ÿ^øN^ùÔ9œ99ž9Ÿ m^úN^ûÔ9œ99ž9Ÿ^üN^ýÔ9œ99ž9Ÿ n^þN^ÿÔ9œ99ž9ŸT_N_Ô9œ99ž9Ÿ _N_Ô9œ99ž9Ÿ!_N_Ô9œ99ž9Ÿ¸_N_Ô9œ99ž9ŸS_N_ Ô9œ99ž9ŸR_ N_ Ô9œ99ž9Ÿ·_ N_ Ô9œ99ž9Ÿ o_N_Ô9œ99ž9ŸQ_N_Ô9œ99ž9ŸP_N_Ô9œ99ž9Ÿ«_N_Ô9œ99ž9ŸO_N_Ô9œ99ž9Ÿ¶_N_Ô9œ99ž9Ÿ¬_N_Ô9œ99ž9Ÿ å_N_Ô9œ99ž9ŸN_N_Ô9œ99ž9Ÿµ_ N_!Ô9œ99ž9ŸM_"N_#Ô9œ99ž9Ÿ´_$N_%Ô9œ99ž9Ÿ­_&N_'Ô9œ99ž9Ÿ³_(N_)Ô9œ99ž9Ÿ®_*N_+Ô9œ99ž9Ÿ²_,N_-Ô9œ99ž9Ÿ±_.N_/Ô9œ99ž9Ÿ æ_0N_1Ô9œ99ž9Ÿ_2N_3Ô9œ99ž9Ÿ¯_4N_5Ô9œ99ž9Ÿ°_6N_7Ô9œ99ž9Ÿ ç_8N_9Ô9œ99ž9Ÿ è_:N_;Ô9œ99ž9Ÿ¯_<N_=Ô9œ99ž9Ÿ p_>N_?Ô9œ99ž9Ÿ é_@N_AÔ9œ99ž9Ÿ°_BN_CÔ9œ99ž9Ÿ±_DN_EÔ9œ99ž9Ÿ ê_FN_GÔ9œ99ž9Ÿ q_HN_IÔ9œ99ž9Ÿ®_JN_KÔ9œ99ž9Ÿ­_LN_MÔ9œ99ž9Ÿ ë_NN_OÔ9œ99ž9Ÿ²_PN_QÔ9œ99ž9Ÿ¬_RN_SÔ9œ99ž9Ÿ ì_TN_UÔ9œ99ž9Ÿ³_VN_WÔ9œ99ž9Ÿ´_XN_YÔ9œ99ž9ŸL_ZN_[Ô9œ99ž9Ÿ í_\N_]Ô9œ99ž9Ÿ î_^N__Ô9œ99ž9Ÿµ_`N_aÔ9œ99ž9Ÿ¶_bN_cÔ9œ99ž9Ÿ r_dN_eÔ9œ99ž9Ÿ·_fN_gÔ9œ99ž9Ÿ ï_hN_iÔ9œ99ž9Ÿ_jN_kÔ9œ99ž9Ÿ«_lN_mÔ9œ99ž9Ÿ ð_nN_oÔ9œ99ž9Ÿ¸_pN_qÔ9œ99ž9Ÿª_rN_sÔ9œ99ž9Ÿ¹_tN_uÔ9œ99ž9Ÿ ñ_vN_wÔ9œ99ž9Ÿ s_xN_yÔ9œ99ž9ŸK_zN_{Ô9œ99ž9Ÿ©_|N_}Ô9œ99ž9Ÿº_~N_Ô9œ99ž9Ÿ¨_€N_Ô9œ99ž9Ÿ ò_‚N_ƒÔ9œ99ž9Ÿ»_„N_…Ô9œ99ž9ŸJ_†N_‡Ô9œ99ž9ŸI_ˆN_‰Ô9œ99ž9Ÿ¼_ŠN_‹Ô9œ99ž9Ÿ§_ŒN_Ô9œ99ž9Ÿ½_ŽN_Ô9œ99ž9Ÿ¦_N_‘Ô9œ99ž9Ÿ¾_’N_“Ô9œ99ž9Ÿ¥_”N_•Ô9œ99ž9Ÿ¿_–N_—Ô9œ99ž9ŸÀ_˜N_™Ô9œ99ž9Ÿ¤_šN_›Ô9œ99ž9ŸÁ_œN_Ô9œ99ž9ŸH_žN_ŸÔ9œ99ž9Ÿ ó_ N_¡Ô9œ99ž9ŸG_¢N_£Ô9œ99ž9Ÿ£_¤N_¥Ô9œ99ž9Ÿ ô_¦N_§Ô9œ99ž9Ÿ¢_¨N_©Ô9œ99ž9ŸÂ_ªN_«Ô9œ99ž9Ÿ¡_¬N_­Ô9œ99ž9ŸF_®N_¯Ô9œ99ž9ŸE_°N_±Ô9œ99ž9Ÿ õ_²N_³Ô9œ99ž9Ÿ _´N_µÔ9œ99ž9Ÿ ö_¶N_·Ô9œ99ž9Ÿ t_¸N_¹Ô9œ99ž9ŸÃ_ºN_»Ô9œ99ž9Ÿ u_¼N_½Ô9œ99ž9Ÿ ÷_¾N_¿Ô9œ99ž9Ÿ ø_ÀN_ÁÔ9œ99ž9Ÿ ù_ÂN_ÃÔ9œ99ž9ŸD_ÄN_ÅÔ9œ99ž9Ÿ v_ÆN_ÇÔ9œ99ž9ŸŸ_ÈN_ÉÔ9œ99ž9Ÿ w_ÊN_ËÔ9œ99ž9Ÿ ú_ÌN_ÍÔ9œ99ž9Ÿž_ÎN_ÏÔ9œ99ž9Ÿ û_ÐN_ÑÔ9œ99ž9Ÿ x_ÒN_ÓÔ9œ99ž9Ÿ ü_ÔN_ÕÔ9œ99ž9Ÿ_ÖN_×Ô9œ99ž9ŸC_ØN_ÙÔ9œ99ž9Ÿ ý_ÚN_ÛÔ9œ99ž9Ÿ þ_ÜN_ÝÔ9œ99ž9Ÿ y_ÞN_ßÔ9œ99ž9ŸB_àN_áÔ9œ99ž9Ÿœ_âN_ãWversionYChangeKeyVmodseq_PredecessorChangeListÒ_ä_å_æ_çÑ_ç_æÒ_ä_å_è_çÑ_ç_èÒ_ä_å_é_çÑ_ç_éÒ_ä_å_ê_çÑ_ç_êÒ_ä_å_ë_çÑ_ç_ëÒ_ä_å_ì_çÑ_ç_ìÒ_ä_å_í_çÑ_ç_íÒ_ä_å_î_çÑ_ç_îÒ_ä_å_ï_çÑ_ç_ïÒ_ä_å_ð_çÑ_ç_ðÒ_ä_å_ñ_çÑ_ç_ñÒ_ä_å_ò_çÑ_ç_òÒ_ä_å_ó_çÑ_ç_óÒ_ä_å_ô_çÑ_ç_ôÒ_ä_å_õ_çÑ_ç_õÒ_ä_å_ö_çÑ_ç_öÒ_ä_å_÷_çÑ_ç_÷Ò_ä_å_ø_çÑ_ç_øÒ_ä_å_ù_çÑ_ç_ùÒ_ä_å_ú_çÑ_ç_úÒ_ä_å_û_çÑ_ç_ûÒ_ä_å_ü_çÑ_ç_üÒ_ä_å_ý_çÑ_ç_ýÒ_ä_å_þ_çÑ_ç_þÒ_ä_å_ÿ_çÑ_ç_ÿÒ_ä_å`_çÑ_ç`Ò_ä_å`_çÑ_ç`Ò_ä_å`_çÑ_ç`Ò_ä_å`_çÑ_ç`Ò_ä_å`_çÑ_ç`Ò_ä_å`_çÑ_ç`Ò_ä_å`_çÑ_ç`Ò_ä_å`_çÑ_ç`Ò_ä_å`_çÑ_ç`Ò_ä_å` _çÑ_ç` Ò_ä_å` _çÑ_ç` Ò_ä_å` _çÑ_ç` Ò_ä_å` _çÑ_ç` Ò_ä_å` _çÑ_ç` Ò_ä_å`_çÑ_ç`Ò_ä_å`_çÑ_ç`Ò_ä_å`_çÑ_ç`Ò_ä_å`_çÑ_ç`Ò_ä_å`_çÑ_ç`Ò_ä_å`_çÑ_ç`Ò_ä_å`_çÑ_ç`Ò_ä_å`_çÑ_ç`Ò_ä_å`_çÑ_ç`Ò_ä_å`_çÑ_ç`Ò_ä_å`_çÑ_ç`Ò_ä_å`_çÑ_ç`Ò_ä_å`_çÑ_ç`Ò_ä_å`_çÑ_ç`Ò_ä_å`_çÑ_ç`Ò_ä_å`_çÑ_ç`Ò_ä_å`_çÑ_ç`Ò_ä_å`_çÑ_ç`Ò_ä_å` _çÑ_ç` Ò_ä_å`!_çÑ_ç`!Ò_ä_å`"_çÑ_ç`"Ò_ä_å`#_çÑ_ç`#Ò_ä_å`$_çÑ_ç`$Ò_ä_å`%_çÑ_ç`%Ò_ä_å`&_çÑ_ç`&Ò_ä_å`'_çÑ_ç`'Ò_ä_å`(_çÑ_ç`(Ò_ä_å`)_çÑ_ç`)Ò_ä_å`*_çÑ_ç`*Ò_ä_å`+_çÑ_ç`+Ò_ä_å`,_çÑ_ç`,Ò_ä_å`-_çÑ_ç`-Ò_ä_å`._çÑ_ç`.Ò_ä_å`/_çÑ_ç`/Ò_ä_å`0_çÑ_ç`0Ò_ä_å`1_çÑ_ç`1Ò_ä_å`2_çÑ_ç`2Ò_ä_å`3_çÑ_ç`3Ò_ä_å`4_çÑ_ç`4Ò_ä_å`5_çÑ_ç`5Ò_ä_å`6_çÑ_ç`6Ò_ä_å`7_çÑ_ç`7Ò_ä_å`8_çÑ_ç`8Ò_ä_å`9_çÑ_ç`9Ò_ä_å`:_çÑ_ç`:Ò_ä_å`;_çÑ_ç`;Ò_ä_å`<_çÑ_ç`<Ò_ä_å`=_çÑ_ç`=Ò_ä_å`>_çÑ_ç`>Ò_ä_å`?_çÑ_ç`?Ò_ä_å`@_çÑ_ç`@Ò_ä_å`A_çÑ_ç`AÒ_ä_å`B_çÑ_ç`BÒ_ä_å`C_çÑ_ç`CÒ_ä_å`D_çÑ_ç`DÒ_ä_å`E_çÑ_ç`EÒ_ä_å`F_çÑ_ç`FÒ_ä_å`G_çÑ_ç`GÒ_ä_å`H_çÑ_ç`HÒ_ä_å`I_çÑ_ç`IÒ_ä_å`J_çÑ_ç`JÒ_ä_å`K_çÑ_ç`KÒ_ä_å`L_çÑ_ç`LÒ_ä_å`M_çÑ_ç`MÒ_ä_å`N_çÑ_ç`NÒ_ä_å`O_çÑ_ç`OÒ_ä_å`P_çÑ_ç`PÒ_ä_å`Q_çÑ_ç`QÒ_ä_å`R_çÑ_ç`RÒ_ä_å`S_çÑ_ç`SÒ_ä_å`T_çÑ_ç`TÒ_ä_å`U_çÑ_ç`UÒ_ä_å`V_çÑ_ç`VÒ_ä_å`W_çÑ_ç`WÒ_ä_å`X_çÑ_ç`XÒ_ä_å`Y_çÑ_ç`YÒ_ä_å`Z_çÑ_ç`ZÒ_ä_å`[_çÑ_ç`[Ò_ä_å`\_çÑ_ç`\Ò_ä_å`]_çÑ_ç`]Ò_ä_å`^_çÑ_ç`^Ò_ä_å`__çÑ_ç`_Ò_ä_å``_çÑ_ç``Ò_ä_å`a_çÑ_ç`aÒ_ä_å`b_çÑ_ç`bÒ_ä_å`c_çÑ_ç`cÒ_ä_å`d_çÑ_ç`dÒ_ä_å`e_çÑ_ç`eÒ_ä_å`f_çÑ_ç`fÒ_ä_å`g_çÑ_ç`gÒ_ä_å`h_çÑ_ç`hÒ_ä_å`i_çÑ_ç`iÒ_ä_å`j_çÑ_ç`jÒ_ä_å`k_çÑ_ç`kÒ_ä_å`l_çÑ_ç`lÒ_ä_å`m_çÑ_ç`mÒ_ä_å`n_çÑ_ç`nÒ_ä_å`o_çÑ_ç`oÒ_ä_å`p_çÑ_ç`pÒ_ä_å`q_çÑ_ç`qÒ_ä_å`r_çÑ_ç`rÒ_ä_å`s_çÑ_ç`sÒ_ä_å`t_çÑ_ç`tÒ_ä_å`u_çÑ_ç`uÒ_ä_å`v_çÑ_ç`vÒ_ä_å`w_çÑ_ç`wÒ_ä_å`x_çÑ_ç`xÒ_ä_å`y_çÑ_ç`yÒ_ä_å`z_çÑ_ç`zÒ_ä_å`{_çÑ_ç`{Ò_ä_å`|_çÑ_ç`|Ò_ä_å`}_çÑ_ç`}Ò_ä_å`~_çÑ_ç`~Ò_ä_å`_çÑ_ç`Ò_ä_å`€_çÑ_ç`€Ò_ä_å`_çÑ_ç`Ò_ä_å`‚_çÑ_ç`‚Ò_ä_å`ƒ_çÑ_ç`ƒÒ_ä_å`„_çÑ_ç`„Ò_ä_å`…_çÑ_ç`…Ò_ä_å`†_çÑ_ç`†Ò_ä_å`‡_çÑ_ç`‡Ò_ä_å`ˆ_çÑ_ç`ˆÒ_ä_å`‰_çÑ_ç`‰Ò_ä_å`Š_çÑ_ç`ŠÒ_ä_å`‹_çÑ_ç`‹Ò_ä_å`Œ_çÑ_ç`ŒÒ_ä_å`_çÑ_ç`Ò_ä_å`Ž_çÑ_ç`ŽÒ_ä_å`_çÑ_ç`Ò_ä_å`_çÑ_ç`Ò_ä_å`‘_çÑ_ç`‘Ò_ä_å`’_çÑ_ç`’Ò_ä_å`“_çÑ_ç`“Ò_ä_å`”_çÑ_ç`”Ò_ä_å`•_çÑ_ç`•Ò_ä_å`–_çÑ_ç`–Ò_ä_å`—_çÑ_ç`—Ò_ä_å`˜_çÑ_ç`˜Ò_ä_å`™_çÑ_ç`™Ò_ä_å`š_çÑ_ç`šÒ_ä_å`›_çÑ_ç`›Ò_ä_å`œ_çÑ_ç`œÒ_ä_å`_çÑ_ç`Ò_ä_å`ž_çÑ_ç`žÒ_ä_å`Ÿ_çÑ_ç`ŸÒ_ä_å` _çÑ_ç` Ò_ä_å`¡_çÑ_ç`¡Ò_ä_å`¢_çÑ_ç`¢Ò_ä_å`£_çÑ_ç`£Ò_ä_å`¤_çÑ_ç`¤Ò_ä_å`¥_çÑ_ç`¥Ò_ä_å`¦_çÑ_ç`¦Ò_ä_å`§_çÑ_ç`§Ò_ä_å`¨_çÑ_ç`¨Ò_ä_å`©_çÑ_ç`©Ò_ä_å`ª_çÑ_ç`ªÒ_ä_å`«_çÑ_ç`«Ò_ä_å`¬_çÑ_ç`¬Ò_ä_å`­_çÑ_ç`­Ò_ä_å`®_çÑ_ç`®Ò_ä_å`¯_çÑ_ç`¯Ò_ä_å`°_çÑ_ç`°Ò_ä_å`±_çÑ_ç`±Ò_ä_å`²_çÑ_ç`²Ò_ä_å`³_çÑ_ç`³Ò_ä_å`´_çÑ_ç`´Ò_ä_å`µ_çÑ_ç`µÒ_ä_å`¶_çÑ_ç`¶Ò_ä_å`·_çÑ_ç`·Ò_ä_å`¸_çÑ_ç`¸Ò_ä_å`¹_çÑ_ç`¹Ò_ä_å`º_çÑ_ç`ºÒ_ä_å`»_çÑ_ç`»Ò_ä_å`¼_çÑ_ç`¼Ò_ä_å`½_çÑ_ç`½Ò_ä_å`¾_çÑ_ç`¾Ò_ä_å`¿_çÑ_ç`¿Ò_ä_å`À_çÑ_ç`ÀÒ_ä_å`Á_çÑ_ç`ÁÒ_ä_å`Â_çÑ_ç`ÂÒ_ä_å`Ã_çÑ_ç`ÃÒ_ä_å`Ä_çÑ_ç`ÄÒ_ä_å`Å_çÑ_ç`ÅÒ_ä_å`Æ_çÑ_ç`ÆÒ_ä_å`Ç_çÑ_ç`ÇÒ_ä_å`È_çÑ_ç`ÈÒ_ä_å`É_çÑ_ç`ÉÒ_ä_å`Ê_çÑ_ç`ÊÒ_ä_å`Ë_çÑ_ç`ËÒ_ä_å`Ì_çÑ_ç`ÌÒ_ä_å`Í_çÑ_ç`ÍÒ_ä_å`Î_çÑ_ç`ÎÒ_ä_å`Ï_çÑ_ç`ÏÒ_ä_å`Ð_çÑ_ç`ÐÒ_ä_å`Ñ_çÑ_ç`ÑÒ_ä_å`Ò_çÑ_ç`ÒÒ_ä_å`Ó_çÑ_ç`ÓÒ_ä_å`Ô_çÑ_ç`ÔÒ_ä_å`Õ_çÑ_ç`ÕÒ_ä_å`Ö_çÑ_ç`ÖÒ_ä_å`×_çÑ_ç`×Ò_ä_å`Ø_çÑ_ç`ØÒ_ä_å`Ù_çÑ_ç`ÙÒ_ä_å`Ú_çÑ_ç`ÚÒ_ä_å`Û_çÑ_ç`ÛÒ_ä_å`Ü_çÑ_ç`ÜÒ_ä_å`Ý_çÑ_ç`ÝÒ_ä_å`Þ_çÑ_ç`ÞÒ_ä_å`ß_çÑ_ç`ßÒ_ä_å`à_çÑ_ç`àÒ_ä_å`á_çÑ_ç`áÒ_ä_å`â_çÑ_ç`âÒ_ä_å`ã_çÑ_ç`ãÒ_ä_å`ä_çÑ_ç`äÒ_ä_å`å_çÑ_ç`åÒ_ä_å`æ_çÑ_ç`æÒ_ä_å`ç_çÑ_ç`çÒ_ä_å`è_çÑ_ç`èÒ_ä_å`é_çÑ_ç`éÒ_ä_å`ê_çÑ_ç`êÒ_ä_å`ë_çÑ_ç`ëÒ_ä_å`ì_çÑ_ç`ìÒ_ä_å`í_çÑ_ç`íÒ_ä_å`î_çÑ_ç`îÒ_ä_å`ï_çÑ_ç`ïÒ_ä_å`ð_çÑ_ç`ðÒ_ä_å`ñ_çÑ_ç`ñÒ_ä_å`ò_çÑ_ç`òÒ_ä_å`ó_çÑ_ç`óÒ_ä_å`ô_çÑ_ç`ôÒ_ä_å`õ_çÑ_ç`õÒ_ä_å`ö_çÑ_ç`öÒ_ä_å`÷_çÑ_ç`÷Ò_ä_å`ø_çÑ_ç`øÒ_ä_å`ù_çÑ_ç`ùÒ_ä_å`ú_çÑ_ç`úÒ_ä_å`û_çÑ_ç`ûÒ_ä_å`ü_çÑ_ç`üÒ_ä_å`ý_çÑ_ç`ýÒ_ä_å`þ_çÑ_ç`þÒ_ä_å`ÿ_çÑ_ç`ÿÒ_ä_åa_çÑ_çaÒ_ä_åa_çÑ_çaÒ_ä_åa_çÑ_çaÒ_ä_åa_çÑ_çaÒ_ä_åa_çÑ_çaÒ_ä_åa_çÑ_çaÒ_ä_åa_çÑ_çaÒ_ä_åa_çÑ_çaÒ_ä_åa_çÑ_çaÒ_ä_åa _çÑ_ça Ò_ä_åa _çÑ_ça Ò_ä_åa _çÑ_ça Ò_ä_åa _çÑ_ça Ò_ä_åa _çÑ_ça Ò_ä_åa_çÑ_çaÒ_ä_åa_çÑ_çaÒ_ä_åa_çÑ_çaÒ_ä_åa_çÑ_çaÒ_ä_åa_çÑ_çaÒ_ä_åa_çÑ_çaÒ_ä_åa_çÑ_çaÒ_ä_åa_çÑ_çaÒ_ä_åa_çÑ_çaÒ_ä_åa_çÑ_çaÒ_ä_åa_çÑ_çaÒ_ä_åa_çÑ_çaÒ_ä_åa_çÑ_çaÒ_ä_åa_çÑ_çaÒ_ä_åa_çÑ_çaÒ_ä_åa_çÑ_çaÒ_ä_åa_çÑ_çaÒ_ä_åa_çÑ_çaÒ_ä_åa _çÑ_ça Ò_ä_åa!_çÑ_ça!Ò_ä_åa"_çÑ_ça"Ò_ä_åa#_çÑ_ça#Ò_ä_åa$_çÑ_ça$Ò_ä_åa%_çÑ_ça%Ò_ä_åa&_çÑ_ça&Ò_ä_åa'_çÑ_ça'Ò_ä_åa(_çÑ_ça(Ò_ä_åa)_çÑ_ça)Ò_ä_åa*_çÑ_ça*Ò_ä_åa+_çÑ_ça+Ò_ä_åa,_çÑ_ça,Ò_ä_åa-_çÑ_ça-Ò_ä_åa._çÑ_ça.Ò_ä_åa/_çÑ_ça/Ò_ä_åa0_çÑ_ça0Ò_ä_åa1_çÑ_ça1Ò_ä_åa2_çÑ_ça2Ò_ä_åa3_çÑ_ça3Ò_ä_åa4_çÑ_ça4Ò_ä_åa5_çÑ_ça5Ò_ä_åa6_çÑ_ça6Ò_ä_åa7_çÑ_ça7Ò_ä_åa8_çÑ_ça8Ò_ä_åa9_çÑ_ça9Ò_ä_åa:_çÑ_ça:Ò_ä_åa;_çÑ_ça;Ò_ä_åa<_çÑ_ça<Ò_ä_åa=_çÑ_ça=Ò_ä_åa>_çÑ_ça>Ò_ä_åa?_çÑ_ça?Ò_ä_åa@_çÑ_ça@Ò_ä_åaA_çÑ_çaAÒ_ä_åaB_çÑ_çaBÒ_ä_åaC_çÑ_çaCÒ_ä_åaD_çÑ_çaDÒ_ä_åaE_çÑ_çaEÒ_ä_åaF_çÑ_çaFÒ_ä_åaG_çÑ_çaGÒ_ä_åaH_çÑ_çaHÒ_ä_åaI_çÑ_çaIÒ_ä_åaJ_çÑ_çaJÒ_ä_åaK_çÑ_çaKÒ_ä_åaL_çÑ_çaLÒ_ä_åaM_çÑ_çaMÒ_ä_åaN_çÑ_çaNÒ_ä_åaO_çÑ_çaOÒ_ä_åaP_çÑ_çaPÒ_ä_åaQ_çÑ_çaQÒ_ä_åaR_çÑ_çaRÒ_ä_åaS_çÑ_çaSÒ_ä_åaT_çÑ_çaTÒ_ä_åaU_çÑ_çaUÒ_ä_åaV_çÑ_çaVÒ_ä_åaW_çÑ_çaWÒ_ä_åaX_çÑ_çaXÒ_ä_åaY_çÑ_çaYÒ_ä_åaZ_çÑ_çaZÒ_ä_åa[_çÑ_ça[Ò_ä_åa\_çÑ_ça\Ò_ä_åa]_çÑ_ça]Ò_ä_åa^_çÑ_ça^Ò_ä_åa__çÑ_ça_Ò_ä_åa`_çÑ_ça`Ò_ä_åaa_çÑ_çaaÒ_ä_åab_çÑ_çabÒ_ä_åac_çÑ_çacÒ_ä_åad_çÑ_çadÒ_ä_åae_çÑ_çaeÒ_ä_åaf_çÑ_çafÒ_ä_åag_çÑ_çagÒ_ä_åah_çÑ_çahÒ_ä_åai_çÑ_çaiÒ_ä_åaj_çÑ_çajÒ_ä_åak_çÑ_çakÒ_ä_åal_çÑ_çalÒ_ä_åam_çÑ_çamÒ_ä_åan_çÑ_çanÒ_ä_åao_çÑ_çaoÒ_ä_åap_çÑ_çapÒ_ä_åaq_çÑ_çaqÒ_ä_åar_çÑ_çarÒ_ä_åas_çÑ_çasÒ_ä_åat_çÑ_çatÒ_ä_åau_çÑ_çauÒ_ä_åav_çÑ_çavÒ_ä_åaw_çÑ_çawÒ_ä_åax_çÑ_çaxÒ_ä_åay_çÑ_çayÒ_ä_åaz_çÑ_çazÒ_ä_åa{_çÑ_ça{Ò_ä_åa|_çÑ_ça|Ò_ä_åa}_çÑ_ça}Ò_ä_åa~_çÑ_ça~Ò_ä_åa_çÑ_çaÒ_ä_åa€_çÑ_ça€Ò_ä_åa_çÑ_çaÒ_ä_åa‚_çÑ_ça‚Ò_ä_åaƒ_çÑ_çaƒÒ_ä_åa„_çÑ_ça„Ò_ä_åa…_çÑ_ça…Ò_ä_åa†_çÑ_ça†Ò_ä_åa‡_çÑ_ça‡Ò_ä_åaˆ_çÑ_çaˆÒ_ä_åa‰_çÑ_ça‰Ò_ä_åaŠ_çÑ_çaŠÒ_ä_åa‹_çÑ_ça‹Ò_ä_åaŒ_çÑ_çaŒÒ_ä_åa_çÑ_çaÒ_ä_åaŽ_çÑ_çaŽÒ_ä_åa_çÑ_çaÒ_ä_åa_çÑ_çaÒ_ä_åa‘_çÑ_ça‘Ò_ä_åa’_çÑ_ça’Ò_ä_åa“_çÑ_ça“Ò_ä_åa”_çÑ_ça”Ò_ä_åa•_çÑ_ça•Ò_ä_åa–_çÑ_ça–Ò_ä_åa—_çÑ_ça—Ò_ä_åa˜_çÑ_ça˜Ò_ä_åa™_çÑ_ça™Ò_ä_åaš_çÑ_çašÒ_ä_åa›_çÑ_ça›Ò_ä_åaœ_çÑ_çaœÒ_ä_åa_çÑ_çaÒ_ä_åaž_çÑ_çažÒ_ä_åaŸ_çÑ_çaŸÒ_ä_åa _çÑ_ça Ò_ä_åa¡_çÑ_ça¡Ò_ä_åa¢_çÑ_ça¢Ò_ä_åa£_çÑ_ça£Ò_ä_åa¤_çÑ_ça¤Ò_ä_åa¥_çÑ_ça¥Ò_ä_åa¦_çÑ_ça¦Ò_ä_åa§_çÑ_ça§Ò_ä_åa¨_çÑ_ça¨Ò_ä_åa©_çÑ_ça©Ò_ä_åaª_çÑ_çaªÒ_ä_åa«_çÑ_ça«Ò_ä_åa¬_çÑ_ça¬Ò_ä_åa­_çÑ_ça­Ò_ä_åa®_çÑ_ça®Ò_ä_åa¯_çÑ_ça¯Ò_ä_åa°_çÑ_ça°Ò_ä_åa±_çÑ_ça±Ò_ä_åa²_çÑ_ça²Ò_ä_åa³_çÑ_ça³Ò_ä_åa´_çÑ_ça´Ò_ä_åaµ_çÑ_çaµÒ_ä_åa¶_çÑ_ça¶Ò_ä_åa·_çÑ_ça·Ò_ä_åa¸_çÑ_ça¸Ò_ä_åa¹_çÑ_ça¹Ò_ä_åaº_çÑ_çaºÒ_ä_åa»_çÑ_ça»Ò_ä_åa¼_çÑ_ça¼Ò_ä_åa½_çÑ_ça½Ò_ä_åa¾_çÑ_ça¾Ò_ä_åa¿_çÑ_ça¿Ò_ä_åaÀ_çÑ_çaÀÒ_ä_åaÁ_çÑ_çaÁÒ_ä_åaÂ_çÑ_çaÂÒ_ä_åaÃ_çÑ_çaÃÒ_ä_åaÄ_çÑ_çaÄÒ_ä_åaÅ_çÑ_çaÅÒ_ä_åaÆ_çÑ_çaÆÒ_ä_åaÇ_çÑ_çaÇÒ_ä_åaÈ_çÑ_çaÈÒ_ä_åaÉ_çÑ_çaÉÒ_ä_åaÊ_çÑ_çaÊÒ_ä_åaË_çÑ_çaËÒ_ä_åaÌ_çÑ_çaÌÒ_ä_åaÍ_çÑ_çaÍÒ_ä_åaÎ_çÑ_çaÎÒ_ä_åaÏ_çÑ_çaÏÒ_ä_åaÐ_çÑ_çaÐÒ_ä_åaÑ_çÑ_çaÑÒ_ä_åaÒ_çÑ_çaÒÒ_ä_åaÓ_çÑ_çaÓÒ_ä_åaÔ_çÑ_çaÔÒ_ä_åaÕ_çÑ_çaÕÒ_ä_åaÖ_çÑ_çaÖÒ_ä_åa×_çÑ_ça×Ò_ä_åaØ_çÑ_çaØÒ_ä_åaÙ_çÑ_çaÙÒ_ä_åaÚ_çÑ_çaÚÒ_ä_åaÛ_çÑ_çaÛÒ_ä_åaÜ_çÑ_çaÜÒ_ä_åaÝ_çÑ_çaÝÒ_ä_åaÞ_çÑ_çaÞÒ_ä_åaß_çÑ_çaßÒ_ä_åaà_çÑ_çaàÒ_ä_åaá_çÑ_çaáÒ_ä_åaâ_çÑ_çaâÒ_ä_åaã_çÑ_çaãÒ_ä_åaä_çÑ_çaäÒ_ä_åaå_çÑ_çaåÒ_ä_åaæ_çÑ_çaæÒ_ä_åaç_çÑ_çaçÒ_ä_åaè_çÑ_çaèÒ_ä_åaé_çÑ_çaéÒ_ä_åaê_çÑ_çaêÒ_ä_åaë_çÑ_çaëÒ_ä_åaì_çÑ_çaìÒ_ä_åaí_çÑ_çaíÒ_ä_åaî_çÑ_çaîÒ_ä_åaï_çÑ_çaïÒ_ä_åað_çÑ_çaðÒ_ä_åañ_çÑ_çañÒ_ä_åaò_çÑ_çaòÒ_ä_åaó_çÑ_çaóÒ_ä_åaô_çÑ_çaôÒ_ä_åaõ_çÑ_çaõÒ_ä_åaö_çÑ_çaöÒ_ä_åa÷_çÑ_ça÷Ò_ä_åaø_çÑ_çaøÒ_ä_åaù_çÑ_çaùÒ_ä_åaú_çÑ_çaúÒ_ä_åaû_çÑ_çaûÒ_ä_åaü_çÑ_çaüÒ_ä_åaý_çÑ_çaýÒ_ä_åaþ_çÑ_çaþÒ_ä_åaÿ_çÑ_çaÿÒ_ä_åb_çÑ_çbÒ_ä_åb_çÑ_çbÒ_ä_åb_çÑ_çbÒ_ä_åb_çÑ_çbÒ_ä_åb_çÑ_çbÒ_ä_åb_çÑ_çbÒ_ä_åb_çÑ_çbÒ_ä_åb_çÑ_çbÒ_ä_åb_çÑ_çbÒ_ä_åb _çÑ_çb Ò_ä_åb _çÑ_çb Ò_ä_åb _çÑ_çb Ò_ä_åb _çÑ_çb Ò_ä_åb _çÑ_çb Ò_ä_åb_çÑ_çbÒ_ä_åb_çÑ_çbÒ_ä_åb_çÑ_çbÒ_ä_åb_çÑ_çbÒ_ä_åb_çÑ_çbÒ_ä_åb_çÑ_çbÒ_ä_åb_çÑ_çbÒ_ä_åb_çÑ_çbÒ_ä_åb_çÑ_çbÒ_ä_åb_çÑ_çbÒ_ä_åb_çÑ_çbÒ_ä_åb_çÑ_çbÒ_ä_åb_çÑ_çbÒ_ä_åb_çÑ_çbÒ_ä_åb_çÑ_çbÒ_ä_åb_çÑ_çbÒ_ä_åb_çÑ_çbÒ_ä_åb_çÑ_çbÒ_ä_åb _çÑ_çb Ò_ä_åb!_çÑ_çb!Ò_ä_åb"_çÑ_çb"Ò_ä_åb#_çÑ_çb#Ò_ä_åb$_çÑ_çb$Ò_ä_åb%_çÑ_çb%Ò_ä_åb&_çÑ_çb&Ò_ä_åb'_çÑ_çb'Ò_ä_åb(_çÑ_çb(Ò_ä_åb)_çÑ_çb)Ò_ä_åb*_çÑ_çb*Ò_ä_åb+_çÑ_çb+Ò_ä_åb,_çÑ_çb,Ò_ä_åb-_çÑ_çb-Ò_ä_åb._çÑ_çb.Ò_ä_åb/_çÑ_çb/Ò_ä_åb0_çÑ_çb0Ò_ä_åb1_çÑ_çb1Ò_ä_åb2_çÑ_çb2Ò_ä_åb3_çÑ_çb3Ò_ä_åb4_çÑ_çb4Ò_ä_åb5_çÑ_çb5Ò_ä_åb6_çÑ_çb6Ò_ä_åb7_çÑ_çb7Ò_ä_åb8_çÑ_çb8Ò_ä_åb9_çÑ_çb9Ò_ä_åb:_çÑ_çb:Ò_ä_åb;_çÑ_çb;Ò_ä_åb<_çÑ_çb<Ò_ä_åb=_çÑ_çb=Ò_ä_åb>_çÑ_çb>Ò_ä_åb?_çÑ_çb?Ò_ä_åb@_çÑ_çb@Ò_ä_åbA_çÑ_çbAÒ_ä_åbB_çÑ_çbBÒ_ä_åbC_çÑ_çbCÒ_ä_åbD_çÑ_çbDÒ_ä_åbE_çÑ_çbEÒ_ä_åbF_çÑ_çbFÒ_ä_åbG_çÑ_çbGÒ_ä_åbH_çÑ_çbHÒ_ä_åbI_çÑ_çbIÒ_ä_åbJ_çÑ_çbJÒ_ä_åbK_çÑ_çbKÒ_ä_åbL_çÑ_çbLÒ_ä_åbM_çÑ_çbMÒ_ä_åbN_çÑ_çbNÒ_ä_åbO_çÑ_çbOÒ_ä_åbP_çÑ_çbPÒ_ä_åbQ_çÑ_çbQÒ_ä_åbR_çÑ_çbRÒ_ä_åbS_çÑ_çbSÒ_ä_åbT_çÑ_çbTÒ_ä_åbU_çÑ_çbUÒ_ä_åbV_çÑ_çbVÒ_ä_åbW_çÑ_çbWÒ_ä_åbX_çÑ_çbXÒ_ä_åbY_çÑ_çbYÒ_ä_åbZ_çÑ_çbZÒ_ä_åb[_çÑ_çb[Ò_ä_åb\_çÑ_çb\Ò_ä_åb]_çÑ_çb]Ò_ä_åb^_çÑ_çb^Ò_ä_åb__çÑ_çb_Ò_ä_åb`_çÑ_çb`Ò_ä_åba_çÑ_çbaÒ_ä_åbb_çÑ_çbbÒ_ä_åbc_çÑ_çbcÒ_ä_åbd_çÑ_çbdÒ_ä_åbe_çÑ_çbeÒ_ä_åbf_çÑ_çbfÒ_ä_åbg_çÑ_çbgÒ_ä_åbh_çÑ_çbhÒ_ä_åbi_çÑ_çbiÒ_ä_åbj_çÑ_çbjÒ_ä_åbk_çÑ_çbkÒ_ä_åbl_çÑ_çblÒ_ä_åbm_çÑ_çbmÒ_ä_åbn_çÑ_çbnÒ_ä_åbo_çÑ_çboÒ_ä_åbp_çÑ_çbpÒ_ä_åbq_çÑ_çbqÒ_ä_åbr_çÑ_çbrÒ_ä_åbs_çÑ_çbsÒ_ä_åbt_çÑ_çbtÒ_ä_åbu_çÑ_çbuÒ_ä_åbv_çÑ_çbvÒ_ä_åbw_çÑ_çbwÒ_ä_åbx_çÑ_çbxÒ_ä_åby_çÑ_çbyÒ_ä_åbz_çÑ_çbzÒ_ä_åb{_çÑ_çb{Ò_ä_åb|_çÑ_çb|Ò_ä_åb}_çÑ_çb}Ò_ä_åb~_çÑ_çb~Ò_ä_åb_çÑ_çbÒ_ä_åb€_çÑ_çb€Ò_ä_åb_çÑ_çbÒ_ä_åb‚_çÑ_çb‚Ò_ä_åbƒ_çÑ_çbƒÒ_ä_åb„_çÑ_çb„Ò_ä_åb…_çÑ_çb…Ò_ä_åb†_çÑ_çb†Ò_ä_åb‡_çÑ_çb‡Ò_ä_åbˆ_çÑ_çbˆÒ_ä_åb‰_çÑ_çb‰Ò_ä_åbŠ_çÑ_çbŠÒ_ä_åb‹_çÑ_çb‹Ò_ä_åbŒ_çÑ_çbŒÒ_ä_åb_çÑ_çbÒ_ä_åbŽ_çÑ_çbŽÒ_ä_åb_çÑ_çbÒ_ä_åb_çÑ_çbÒ_ä_åb‘_çÑ_çb‘Ò_ä_åb’_çÑ_çb’Ò_ä_åb“_çÑ_çb“Ò_ä_åb”_çÑ_çb”Ò_ä_åb•_çÑ_çb•Ò_ä_åb–_çÑ_çb–Ò_ä_åb—_çÑ_çb—Ò_ä_åb˜_çÑ_çb˜Ò_ä_åb™_çÑ_çb™Ò_ä_åbš_çÑ_çbšÒ_ä_åb›_çÑ_çb›Ò_ä_åbœ_çÑ_çbœÒ_ä_åb_çÑ_çbÒ_ä_åbž_çÑ_çbžÒ_ä_åbŸ_çÑ_çbŸÒ_ä_åb _çÑ_çb Ò_ä_åb¡_çÑ_çb¡Ò_ä_åb¢_çÑ_çb¢Ò_ä_åb£_çÑ_çb£Ò_ä_åb¤_çÑ_çb¤Ò_ä_åb¥_çÑ_çb¥Ò_ä_åb¦_çÑ_çb¦Ò_ä_åb§_çÑ_çb§Ò_ä_åb¨_çÑ_çb¨Ò_ä_åb©_çÑ_çb©Ò_ä_åbª_çÑ_çbªÒ_ä_åb«_çÑ_çb«Ò_ä_åb¬_çÑ_çb¬Ò_ä_åb­_çÑ_çb­Ò_ä_åb®_çÑ_çb®Ò_ä_åb¯_çÑ_çb¯Ò_ä_åb°_çÑ_çb°Ò_ä_åb±_çÑ_çb±Ò_ä_åb²_çÑ_çb²Ò_ä_åb³_çÑ_çb³Ò_ä_åb´_çÑ_çb´Ò_ä_åbµ_çÑ_çbµÒ_ä_åb¶_çÑ_çb¶Ò_ä_åb·_çÑ_çb·Ò_ä_åb¸_çÑ_çb¸Ò_ä_åb¹_çÑ_çb¹Ò_ä_åbº_çÑ_çbºÒ_ä_åb»_çÑ_çb»Ò_ä_åb¼_çÑ_çb¼Ò_ä_åb½_çÑ_çb½Ò_ä_åb¾_çÑ_çb¾Ò_ä_åb¿_çÑ_çb¿Ò_ä_åbÀ_çÑ_çbÀÒ_ä_åbÁ_çÑ_çbÁÒ_ä_åbÂ_çÑ_çbÂÒ_ä_åbÃ_çÑ_çbÃÒ_ä_åbÄ_çÑ_çbÄÒ_ä_åbÅ_çÑ_çbÅÒ_ä_åbÆ_çÑ_çbÆÒ_ä_åbÇ_çÑ_çbÇÒ_ä_åbÈ_çÑ_çbÈÒ_ä_åbÉ_çÑ_çbÉÒ_ä_åbÊ_çÑ_çbÊÒ_ä_åbË_çÑ_çbËÒ_ä_åbÌ_çÑ_çbÌÒ_ä_åbÍ_çÑ_çbÍÒ_ä_åbÎ_çÑ_çbÎÒ_ä_åbÏ_çÑ_çbÏÒ_ä_åbÐ_çÑ_çbÐÒ_ä_åbÑ_çÑ_çbÑÒ_ä_åbÒ_çÑ_çbÒÒ_ä_åbÓ_çÑ_çbÓÒ_ä_åbÔ_çÑ_çbÔÒ_ä_åbÕ_çÑ_çbÕÒ_ä_åbÖ_çÑ_çbÖÒ_ä_åb×_çÑ_çb×Ò_ä_åbØ_çÑ_çbØÒ_ä_åbÙ_çÑ_çbÙÒ_ä_åbÚ_çÑ_çbÚÒ_ä_åbÛ_çÑ_çbÛÒ_ä_åbÜ_çÑ_çbÜÒ_ä_åbÝ_çÑ_çbÝÒ_ä_åbÞ_çÑ_çbÞÒ_ä_åbß_çÑ_çbßÒ_ä_åbà_çÑ_çbàÒ_ä_åbá_çÑ_çbáÒ_ä_åbâ_çÑ_çbâÒ_ä_åbã_çÑ_çbãÒ_ä_åbä_çÑ_çbäÒ_ä_åbå_çÑ_çbåÒ_ä_åbæ_çÑ_çbæÒ_ä_åbç_çÑ_çbçÒ_ä_åbè_çÑ_çbèÒ_ä_åbé_çÑ_çbéÒ_ä_åbê_çÑ_çbêÒ_ä_åbë_çÑ_çbëÒ_ä_åbì_çÑ_çbìÒ_ä_åbí_çÑ_çbíÒ_ä_åbî_çÑ_çbîÒ_ä_åbï_çÑ_çbïÒ_ä_åbð_çÑ_çbðÒ_ä_åbñ_çÑ_çbñÒ_ä_åbò_çÑ_çbòÒ_ä_åbó_çÑ_çbóÒ_ä_åbô_çÑ_çbôÒ_ä_åbõ_çÑ_çbõÒ_ä_åbö_çÑ_çböÒ_ä_åb÷_çÑ_çb÷Ò_ä_åbø_çÑ_çbøÒ_ä_åbù_çÑ_çbùÒ_ä_åbú_çÑ_çbúÒ_ä_åbû_çÑ_çbûÒ_ä_åbü_çÑ_çbüÒ_ä_åbý_çÑ_çbýÒ_ä_åbþ_çÑ_çbþÒ_ä_åbÿ_çÑ_çbÿÒ_ä_åc_çÑ_çcÒ_ä_åc_çÑ_çcÒ_ä_åc_çÑ_çcÒ_ä_åc_çÑ_çcÒ_ä_åc_çÑ_çcÒ_ä_åc_çÑ_çcÒ_ä_åc_çÑ_çcÒ_ä_åc_çÑ_çcÒ_ä_åc_çÑ_çcÒ_ä_åc _çÑ_çc Ò_ä_åc _çÑ_çc Ò_ä_åc _çÑ_çc Ò_ä_åc _çÑ_çc Ò_ä_åc _çÑ_çc Ò_ä_åc_çÑ_çcÒ_ä_åc_çÑ_çcÒ_ä_åc_çÑ_çcÒ_ä_åc_çÑ_çcÒ_ä_åc_çÑ_çcÒ_ä_åc_çÑ_çcÒ_ä_åc_çÑ_çcÒ_ä_åc_çÑ_çcÒ_ä_åc_çÑ_çcÒ_ä_åc_çÑ_çcÒ_ä_åc_çÑ_çcÒ_ä_åc_çÑ_çcÒ_ä_åc_çÑ_çcÒ_ä_åc_çÑ_çcÒ_ä_åc_çÑ_çcÒ_ä_åc_çÑ_çcÒ_ä_åc_çÑ_çcÒ_ä_åc_çÑ_çcÒ_ä_åc _çÑ_çc Ò_ä_åc!_çÑ_çc!Ò_ä_åc"_çÑ_çc"Ò_ä_åc#_çÑ_çc#Ò_ä_åc$_çÑ_çc$Ò_ä_åc%_çÑ_çc%Ò_ä_åc&_çÑ_çc&Ò_ä_åc'_çÑ_çc'Ò_ä_åc(_çÑ_çc(Ò_ä_åc)_çÑ_çc)Ò_ä_åc*_çÑ_çc*Ò_ä_åc+_çÑ_çc+Ò_ä_åc,_çÑ_çc,Ò_ä_åc-_çÑ_çc-Ò_ä_åc._çÑ_çc.Ò_ä_åc/_çÑ_çc/Ò_ä_åc0_çÑ_çc0Ò_ä_åc1_çÑ_çc1Ò_ä_åc2_çÑ_çc2Ò_ä_åc3_çÑ_çc3Ò_ä_åc4_çÑ_çc4Ò_ä_åc5_çÑ_çc5Ò_ä_åc6_çÑ_çc6Ò_ä_åc7_çÑ_çc7Ò_ä_åc8_çÑ_çc8Ò_ä_åc9_çÑ_çc9Ò_ä_åc:_çÑ_çc:Ò_ä_åc;_çÑ_çc;Ò_ä_åc<_çÑ_çc<Ò_ä_åc=_çÑ_çc=Ò_ä_åc>_çÑ_çc>Ò_ä_åc?_çÑ_çc?Ò_ä_åc@_çÑ_çc@Ò_ä_åcA_çÑ_çcAÒ_ä_åcB_çÑ_çcBÒ_ä_åcC_çÑ_çcCÒ_ä_åcD_çÑ_çcDÒ_ä_åcE_çÑ_çcEÒ_ä_åcF_çÑ_çcFÒ_ä_åcG_çÑ_çcGÒ_ä_åcH_çÑ_çcHÒ_ä_åcI_çÑ_çcIÒ_ä_åcJ_çÑ_çcJÒ_ä_åcK_çÑ_çcKÒ_ä_åcL_çÑ_çcLÒ_ä_åcM_çÑ_çcMÒ_ä_åcN_çÑ_çcNÒ_ä_åcO_çÑ_çcOÒ_ä_åcP_çÑ_çcPÒ_ä_åcQ_çÑ_çcQÒ_ä_åcR_çÑ_çcRÒ_ä_åcS_çÑ_çcSÒ_ä_åcT_çÑ_çcTÒ_ä_åcU_çÑ_çcUÒ_ä_åcV_çÑ_çcVÒ_ä_åcW_çÑ_çcWÒ_ä_åcX_çÑ_çcXÒ_ä_åcY_çÑ_çcYÒ_ä_åcZ_çÑ_çcZÒ_ä_åc[_çÑ_çc[Ò_ä_åc\_çÑ_çc\Ò_ä_åc]_çÑ_çc]Ò_ä_åc^_çÑ_çc^Ò_ä_åc__çÑ_çc_Ò_ä_åc`_çÑ_çc`Ò_ä_åca_çÑ_çcaÒ_ä_åcb_çÑ_çcbÒ_ä_åcc_çÑ_çccÒ_ä_åcd_çÑ_çcdÒ_ä_åce_çÑ_çceÒ_ä_åcf_çÑ_çcfÒ_ä_åcg_çÑ_çcgÒ_ä_åch_çÑ_çchÒ_ä_åci_çÑ_çciÒ_ä_åcj_çÑ_çcjÒ_ä_åck_çÑ_çckÒ_ä_åcl_çÑ_çclÒ_ä_åcm_çÑ_çcmÒ_ä_åcn_çÑ_çcnÒ_ä_åco_çÑ_çcoÒ_ä_åcp_çÑ_çcpÒ_ä_åcq_çÑ_çcqÒ_ä_åcr_çÑ_çcrÒ_ä_åcs_çÑ_çcsÒ_ä_åct_çÑ_çctÒ_ä_åcu_çÑ_çcuÒ_ä_åcv_çÑ_çcvÒ_ä_åcw_çÑ_çcwÒ_ä_åcx_çÑ_çcxÒ_ä_åcy_çÑ_çcyÒ_ä_åcz_çÑ_çczÒ_ä_åc{_çÑ_çc{Ò_ä_åc|_çÑ_çc|Ò_ä_åc}_çÑ_çc}Ò_ä_åc~_çÑ_çc~Ò_ä_åc_çÑ_çcÒ_ä_åc€_çÑ_çc€Ò_ä_åc_çÑ_çcÒ_ä_åc‚_çÑ_çc‚Ò_ä_åcƒ_çÑ_çcƒÒ_ä_åc„_çÑ_çc„Ò_ä_åc…_çÑ_çc…Ò_ä_åc†_çÑ_çc†Ò_ä_åc‡_çÑ_çc‡Ò_ä_åcˆ_çÑ_çcˆÒ_ä_åc‰_çÑ_çc‰Ò_ä_åcŠ_çÑ_çcŠÒ_ä_åc‹_çÑ_çc‹Ò_ä_åcŒ_çÑ_çcŒÒ_ä_åc_çÑ_çcÒ_ä_åcŽ_çÑ_çcŽÒ_ä_åc_çÑ_çcÒ_ä_åc_çÑ_çcÒ_ä_åc‘_çÑ_çc‘Ò_ä_åc’_çÑ_çc’Ò_ä_åc“_çÑ_çc“Ò_ä_åc”_çÑ_çc”Ò_ä_åc•_çÑ_çc•Ò_ä_åc–_çÑ_çc–Ò_ä_åc—_çÑ_çc—Ò_ä_åc˜_çÑ_çc˜Ò_ä_åc™_çÑ_çc™Ò_ä_åcš_çÑ_çcšÒ_ä_åc›_çÑ_çc›Ò_ä_åcœ_çÑ_çcœÒ_ä_åc_çÑ_çcÒ_ä_åcž_çÑ_çcžÒ_ä_åcŸ_çÑ_çcŸÒ_ä_åc _çÑ_çc Ò_ä_åc¡_çÑ_çc¡Ò_ä_åc¢_çÑ_çc¢Ò_ä_åc£_çÑ_çc£Ò_ä_åc¤_çÑ_çc¤Ò_ä_åc¥_çÑ_çc¥Ò_ä_åc¦_çÑ_çc¦Ò_ä_åc§_çÑ_çc§Ò_ä_åc¨_çÑ_çc¨Ò_ä_åc©_çÑ_çc©Ò_ä_åcª_çÑ_çcªÒ_ä_åc«_çÑ_çc«Ò_ä_åc¬_çÑ_çc¬Ò_ä_åc­_çÑ_çc­Ò_ä_åc®_çÑ_çc®Ò_ä_åc¯_çÑ_çc¯Ò_ä_åc°_çÑ_çc°Ò_ä_åc±_çÑ_çc±Ò_ä_åc²_çÑ_çc²Ò_ä_åc³_çÑ_çc³Ò_ä_åc´_çÑ_çc´Ò_ä_åcµ_çÑ_çcµÒ_ä_åc¶_çÑ_çc¶Ò_ä_åc·_çÑ_çc·Ò_ä_åc¸_çÑ_çc¸Ò_ä_åc¹_çÑ_çc¹Ò_ä_åcº_çÑ_çcºÒ_ä_åc»_çÑ_çc»Ò_ä_åc¼_çÑ_çc¼Ò_ä_åc½_çÑ_çc½Ò_ä_åc¾_çÑ_çc¾Ò_ä_åc¿_çÑ_çc¿Ò_ä_åcÀ_çÑ_çcÀÒ_ä_åcÁ_çÑ_çcÁÒ_ä_åcÂ_çÑ_çcÂÒ_ä_åcÃ_çÑ_çcÃÒ_ä_åcÄ_çÑ_çcÄÒ_ä_åcÅ_çÑ_çcÅÒ_ä_åcÆ_çÑ_çcÆÒ_ä_åcÇ_çÑ_çcÇÒ_ä_åcÈ_çÑ_çcÈÒ_ä_åcÉ_çÑ_çcÉÒ_ä_åcÊ_çÑ_çcÊÒ_ä_åcË_çÑ_çcËÒ_ä_åcÌ_çÑ_çcÌÒ_ä_åcÍ_çÑ_çcÍÒ_ä_åcÎ_çÑ_çcÎÒ_ä_åcÏ_çÑ_çcÏÒ_ä_åcÐ_çÑ_çcÐÒ_ä_åcÑ_çÑ_çcÑÒ_ä_åcÒ_çÑ_çcÒÒ_ä_åcÓ_çÑ_çcÓÒ_ä_åcÔ_çÑ_çcÔÒ_ä_åcÕ_çÑ_çcÕÒ_ä_åcÖ_çÑ_çcÖÒ_ä_åc×_çÑ_çc×Ò_ä_åcØ_çÑ_çcØÒ_ä_åcÙ_çÑ_çcÙÒ_ä_åcÚ_çÑ_çcÚÒ_ä_åcÛ_çÑ_çcÛÒ_ä_åcÜ_çÑ_çcÜÒ_ä_åcÝ_çÑ_çcÝÒ_ä_åcÞ_çÑ_çcÞÒ_ä_åcß_çÑ_çcßÒ_ä_åcà_çÑ_çcàÒ_ä_åcá_çÑ_çcáÒ_ä_åcâ_çÑ_çcâÒ_ä_åcã_çÑ_çcãÒ_ä_åcä_çÑ_çcäÒ_ä_åcå_çÑ_çcåÒ_ä_åcæ_çÑ_çcæÒ_ä_åcç_çÑ_çcçÒ_ä_åcè_çÑ_çcèÒ_ä_åcé_çÑ_çcéÒ_ä_åcê_çÑ_çcêÒ_ä_åcë_çÑ_çcëÒ_ä_åcì_çÑ_çcìÒ_ä_åcí_çÑ_çcíÒ_ä_åcî_çÑ_çcîÒ_ä_åcï_çÑ_çcïÒ_ä_åcð_çÑ_çcðÒ_ä_åcñ_çÑ_çcñÒ_ä_åcò_çÑ_çcòÒ_ä_åcó_çÑ_çcóÒ_ä_åcô_çÑ_çcôÒ_ä_åcõ_çÑ_çcõÒ_ä_åcö_çÑ_çcöÒ_ä_åc÷_çÑ_çc÷Ò_ä_åcø_çÑ_çcøÒ_ä_åcù_çÑ_çcùÒ_ä_åcú_çÑ_çcúÒ_ä_åcû_çÑ_çcûÒ_ä_åcü_çÑ_çcüÒ_ä_åcý_çÑ_çcýÒ_ä_åcþ_çÑ_çcþÒ_ä_åcÿ_çÑ_çcÿÒ_ä_åd_çÑ_çdÒ_ä_åd_çÑ_çdÒ_ä_åd_çÑ_çdÒ_ä_åd_çÑ_çdÒ_ä_åd_çÑ_çdÒ_ä_åd_çÑ_çdÒ_ä_åd_çÑ_çdÒ_ä_åd_çÑ_çdÒ_ä_åd_çÑ_çdÒ_ä_åd _çÑ_çd Ò_ä_åd _çÑ_çd Ò_ä_åd _çÑ_çd Ò_ä_åd _çÑ_çd Ò_ä_åd _çÑ_çd Ò_ä_åd_çÑ_çdÒ_ä_åd_çÑ_çdÒ_ä_åd_çÑ_çdÒ_ä_åd_çÑ_çdÒ_ä_åd_çÑ_çdÒ_ä_åd_çÑ_çdÒ_ä_åd_çÑ_çdÒ_ä_åd_çÑ_çdÒ_ä_åd_çÑ_çdÒ_ä_åd_çÑ_çdÒ_ä_åd_çÑ_çdÒ_ä_åd_çÑ_çdÒ_ä_åd_çÑ_çdÒ_ä_åd_çÑ_çdÒ_ä_åd_çÑ_çdÒ_ä_åd_çÑ_çdÒ_ä_åd_çÑ_çdÒ_ä_åd_çÑ_çdÒ_ä_åd _çÑ_çd Ò_ä_åd!_çÑ_çd!Ò_ä_åd"_çÑ_çd"Ò_ä_åd#_çÑ_çd#Ò_ä_åd$_çÑ_çd$Ò_ä_åd%_çÑ_çd%Ò_ä_åd&_çÑ_çd&Ò_ä_åd'_çÑ_çd'Ò_ä_åd(_çÑ_çd(Ò_ä_åd)_çÑ_çd)Ò_ä_åd*_çÑ_çd*Ò_ä_åd+_çÑ_çd+Ò_ä_åd,_çÑ_çd,Ò_ä_åd-_çÑ_çd-Ò_ä_åd._çÑ_çd.Ò_ä_åd/_çÑ_çd/Ò_ä_åd0_çÑ_çd0Ò_ä_åd1_çÑ_çd1Ò_ä_åd2_çÑ_çd2Ò_ä_åd3_çÑ_çd3Ò_ä_åd4_çÑ_çd4Ò_ä_åd5_çÑ_çd5Ò_ä_åd6_çÑ_çd6Ò_ä_åd7_çÑ_çd7Ò_ä_åd8_çÑ_çd8Ò_ä_åd9_çÑ_çd9Ò_ä_åd:_çÑ_çd:Ò_ä_åd;_çÑ_çd;Ò_ä_åd<_çÑ_çd<Ò_ä_åd=_çÑ_çd=Ò_ä_åd>_çÑ_çd>Ò_ä_åd?_çÑ_çd?Ò_ä_åd@_çÑ_çd@Ò_ä_ådA_çÑ_çdAÒ_ä_ådB_çÑ_çdBÒ_ä_ådC_çÑ_çdCÒ_ä_ådD_çÑ_çdDÒ_ä_ådE_çÑ_çdEÒ_ä_ådF_çÑ_çdFÒ_ä_ådG_çÑ_çdGÒ_ä_ådH_çÑ_çdHÒ_ä_ådI_çÑ_çdIÒ_ä_ådJ_çÑ_çdJÒ_ä_ådK_çÑ_çdKÒ_ä_ådL_çÑ_çdLÒ_ä_ådM_çÑ_çdMÒ_ä_ådN_çÑ_çdNÒ_ä_ådO_çÑ_çdOÒ_ä_ådP_çÑ_çdPÒ_ä_ådQ_çÑ_çdQÒ_ä_ådR_çÑ_çdRÒ_ä_ådS_çÑ_çdSÒ_ä_ådT_çÑ_çdTÒ_ä_ådU_çÑ_çdUÒ_ä_ådV_çÑ_çdVÒ_ä_ådW_çÑ_çdWÒ_ä_ådX_çÑ_çdXÒ_ä_ådY_çÑ_çdYÒ_ä_ådZ_çÑ_çdZÒ_ä_åd[_çÑ_çd[Ò_ä_åd\_çÑ_çd\Ò_ä_åd]_çÑ_çd]Ò_ä_åd^_çÑ_çd^Ò_ä_åd__çÑ_çd_Ò_ä_åd`_çÑ_çd`Ò_ä_åda_çÑ_çdaÒ_ä_ådb_çÑ_çdbÒ_ä_ådc_çÑ_çdcÒ_ä_ådd_çÑ_çddÒ_ä_åde_çÑ_çdeÒ_ä_ådf_çÑ_çdfÒ_ä_ådg_çÑ_çdgÒ_ä_ådh_çÑ_çdhÒ_ä_ådi_çÑ_çdiÒ_ä_ådj_çÑ_çdjÒ_ä_ådk_çÑ_çdkÒ_ä_ådl_çÑ_çdlÒ_ä_ådm_çÑ_çdmÒ_ä_ådn_çÑ_çdnÒ_ä_ådo_çÑ_çdoÒ_ä_ådp_çÑ_çdpÒ_ä_ådq_çÑ_çdqÒ_ä_ådr_çÑ_çdrÒ_ä_åds_çÑ_çdsÒ_ä_ådt_çÑ_çdtÒ_ä_ådu_çÑ_çduÒ_ä_ådv_çÑ_çdvÒ_ä_ådw_çÑ_çdwÒ_ä_ådx_çÑ_çdxÒ_ä_ådy_çÑ_çdyÒ_ä_ådz_çÑ_çdzÒ_ä_åd{_çÑ_çd{Ò_ä_åd|_çÑ_çd|Ò_ä_åd}_çÑ_çd}Ò_ä_åd~_çÑ_çd~Ò_ä_åd_çÑ_çdÒ_ä_åd€_çÑ_çd€Ò_ä_åd_çÑ_çdÒ_ä_åd‚_çÑ_çd‚Ò_ä_ådƒ_çÑ_çdƒÒ_ä_åd„_çÑ_çd„Ò_ä_åd…_çÑ_çd…Ò_ä_åd†_çÑ_çd†Ò_ä_åd‡_çÑ_çd‡Ò_ä_ådˆ_çÑ_çdˆÒ_ä_åd‰_çÑ_çd‰Ò_ä_ådŠ_çÑ_çdŠÒ_ä_åd‹_çÑ_çd‹Ò_ä_ådŒ_çÑ_çdŒÒ_ä_åd_çÑ_çdÒ_ä_ådŽ_çÑ_çdŽÒ_ä_åd_çÑ_çdÒ_ä_åd_çÑ_çdÒ_ä_åd‘_çÑ_çd‘Ò_ä_åd’_çÑ_çd’Ò_ä_åd“_çÑ_çd“Ò_ä_åd”_çÑ_çd”Ò_ä_åd•_çÑ_çd•Ò_ä_åd–_çÑ_çd–Ò_ä_åd—_çÑ_çd—Ò_ä_åd˜_çÑ_çd˜Ò_ä_åd™_çÑ_çd™Ò_ä_ådš_çÑ_çdšÒ_ä_åd›_çÑ_çd›Ò_ä_ådœ_çÑ_çdœÒ_ä_åd_çÑ_çdÒ_ä_ådž_çÑ_çdžÒ_ä_ådŸ_çÑ_çdŸÒ_ä_åd _çÑ_çd Ò_ä_åd¡_çÑ_çd¡Ò_ä_åd¢_çÑ_çd¢Ò_ä_åd£_çÑ_çd£Ò_ä_åd¤_çÑ_çd¤Ò_ä_åd¥_çÑ_çd¥Ò_ä_åd¦_çÑ_çd¦Ò_ä_åd§_çÑ_çd§Ò_ä_åd¨_çÑ_çd¨Ò_ä_åd©_çÑ_çd©Ò_ä_ådª_çÑ_çdªÒ_ä_åd«_çÑ_çd«Ò_ä_åd¬_çÑ_çd¬Ò_ä_åd­_çÑ_çd­Ò_ä_åd®_çÑ_çd®Ò_ä_åd¯_çÑ_çd¯Ò_ä_åd°_çÑ_çd°Ò_ä_åd±_çÑ_çd±Ò_ä_åd²_çÑ_çd²Ò_ä_åd³_çÑ_çd³Ò_ä_åd´_çÑ_çd´Ò_ä_ådµ_çÑ_çdµÒ_ä_åd¶_çÑ_çd¶Ò_ä_åd·_çÑ_çd·Ò_ä_åd¸_çÑ_çd¸Ò_ä_åd¹_çÑ_çd¹Ò_ä_ådº_çÑ_çdºÒ_ä_åd»_çÑ_çd»Ò_ä_åd¼_çÑ_çd¼Ò_ä_åd½_çÑ_çd½Ò_ä_åd¾_çÑ_çd¾Ò_ä_åd¿_çÑ_çd¿Ò_ä_ådÀ_çÑ_çdÀÒ_ä_ådÁ_çÑ_çdÁÒ_ä_ådÂ_çÑ_çdÂÒ_ä_ådÃ_çÑ_çdÃÒ_ä_ådÄ_çÑ_çdÄÒ_ä_ådÅ_çÑ_çdÅÒ_ä_ådÆ_çÑ_çdÆÒ_ä_ådÇ_çÑ_çdÇÒ_ä_ådÈ_çÑ_çdÈÒ_ä_ådÉ_çÑ_çdÉÒ_ä_ådÊ_çÑ_çdÊÒ_ä_ådË_çÑ_çdËÒ_ä_ådÌ_çÑ_çdÌÒ_ä_ådÍ_çÑ_çdÍÒ_ä_ådÎ_çÑ_çdÎÒ_ä_ådÏ_çÑ_çdÏÒ_ä_ådÐ_çÑ_çdÐÒ_ä_ådÑ_çÑ_çdÑÒ_ä_ådÒ_çÑ_çdÒÒ_ä_ådÓ_çÑ_çdÓÒ_ä_ådÔ_çÑ_çdÔÒ_ä_ådÕ_çÑ_çdÕÒ_ä_ådÖ_çÑ_çdÖÒ_ä_åd×_çÑ_çd×Ò_ä_ådØ_çÑ_çdØÒ_ä_ådÙ_çÑ_çdÙÒ_ä_ådÚ_çÑ_çdÚÒ_ä_ådÛ_çÑ_çdÛÒ_ä_ådÜ_çÑ_çdÜÒ_ä_ådÝ_çÑ_çdÝÒ_ä_ådÞ_çÑ_çdÞÒ_ä_ådß_çÑ_çdßÒ_ä_ådà_çÑ_çdàÒ_ä_ådá_çÑ_çdáÒ_ä_ådâ_çÑ_çdâÒ_ä_ådã_çÑ_çdãÒ_ä_ådä_çÑ_çdäÒ_ä_ådå_çÑ_çdåÒ_ä_ådæ_çÑ_çdæÒ_ä_ådç_çÑ_çdçÒ_ä_ådè_çÑ_çdèÒ_ä_ådé_çÑ_çdéÒ_ä_ådê_çÑ_çdêÒ_ä_ådë_çÑ_çdëÒ_ä_ådì_çÑ_çdìÒ_ä_ådí_çÑ_çdíÒ_ä_ådî_çÑ_çdîÒ_ä_ådï_çÑ_çdïÒ_ä_ådð_çÑ_çdðÒ_ä_ådñ_çÑ_çdñÒ_ä_ådò_çÑ_çdòÒ_ä_ådó_çÑ_çdóÒ_ä_ådô_çÑ_çdôÒ_ä_ådõ_çÑ_çdõÒ_ä_ådö_çÑ_çdöÒ_ä_åd÷_çÑ_çd÷Ò_ä_ådø_çÑ_çdøÒ_ä_ådù_çÑ_çdùÒ_ä_ådú_çÑ_çdúÒ_ä_ådû_çÑ_çdûÒ_ä_ådü_çÑ_çdüÒ_ä_ådý_çÑ_çdýÒ_ä_ådþ_çÑ_çdþÒ_ä_ådÿ_çÑ_çdÿÒ_ä_åe_çÑ_çeÒ_ä_åe_çÑ_çeÒ_ä_åe_çÑ_çeÒ_ä_åe_çÑ_çeÒ_ä_åe_çÑ_çeÒ_ä_åe_çÑ_çeÒ_ä_åe_çÑ_çeÒ_ä_åe_çÑ_çeÒ_ä_åe_çÑ_çeÒ_ä_åe _çÑ_çe Ò_ä_åe _çÑ_çe Ò_ä_åe _çÑ_çe Ò_ä_åe _çÑ_çe Ò_ä_åe _çÑ_çe Ò_ä_åe_çÑ_çeÒ_ä_åe_çÑ_çeÒ_ä_åe_çÑ_çeÒ_ä_åe_çÑ_çeÒ_ä_åe_çÑ_çeÒ_ä_åe_çÑ_çeÒ_ä_åe_çÑ_çeÒ_ä_åe_çÑ_çeÒ_ä_åe_çÑ_çeÒ_ä_åe_çÑ_çeÒ_ä_åe_çÑ_çeÒ_ä_åe_çÑ_çeÒ_ä_åe_çÑ_çeÒ_ä_åe_çÑ_çeÒ_ä_åe_çÑ_çeÒ_ä_åe_çÑ_çeÒ_ä_åe_çÑ_çeÒ_ä_åe_çÑ_çeÒ_ä_åe _çÑ_çe Ò_ä_åe!_çÑ_çe!Ò_ä_åe"_çÑ_çe"Ò_ä_åe#_çÑ_çe#Ò_ä_åe$_çÑ_çe$Ò_ä_åe%_çÑ_çe%Ò_ä_åe&_çÑ_çe&Ò_ä_åe'_çÑ_çe'Ò_ä_åe(_çÑ_çe(Ò_ä_åe)_çÑ_çe)Ò_ä_åe*_çÑ_çe*Ò_ä_åe+_çÑ_çe+Ò_ä_åe,_çÑ_çe,Ò_ä_åe-_çÑ_çe-Ò_ä_åe._çÑ_çe.Ò_ä_åe/_çÑ_çe/Ò_ä_åe0_çÑ_çe0Ò_ä_åe1_çÑ_çe1Ò_ä_åe2_çÑ_çe2Ò_ä_åe3_çÑ_çe3Ò_ä_åe4_çÑ_çe4Ò_ä_åe5_çÑ_çe5Ò_ä_åe6_çÑ_çe6Ò_ä_åe7_çÑ_çe7Ò_ä_åe8_çÑ_çe8Ò_ä_åe9_çÑ_çe9Ò_ä_åe:_çÑ_çe:Ò_ä_åe;_çÑ_çe;Ò_ä_åe<_çÑ_çe<Ò_ä_åe=_çÑ_çe=Ò_ä_åe>_çÑ_çe>Ò_ä_åe?_çÑ_çe?Ò_ä_åe@_çÑ_çe@Ò_ä_åeA_çÑ_çeAÒ_ä_åeB_çÑ_çeBÒ_ä_åeC_çÑ_çeCÒ_ä_åeD_çÑ_çeDÒ_ä_åeE_çÑ_çeEÒ_ä_åeF_çÑ_çeFÒ_ä_åeG_çÑ_çeGÒ_ä_åeH_çÑ_çeHÒ_ä_åeI_çÑ_çeIÒ_ä_åeJ_çÑ_çeJÒ_ä_åeK_çÑ_çeKÒ_ä_åeL_çÑ_çeLÒ_ä_åeM_çÑ_çeMÒ_ä_åeN_çÑ_çeNÒ_ä_åeO_çÑ_çeOÒ_ä_åeP_çÑ_çePÒ_ä_åeQ_çÑ_çeQÒ_ä_åeR_çÑ_çeRÒ_ä_åeS_çÑ_çeSÒ_ä_åeT_çÑ_çeTÒ_ä_åeU_çÑ_çeUÒ_ä_åeV_çÑ_çeVÒ_ä_åeW_çÑ_çeWÒ_ä_åeX_çÑ_çeXÒ_ä_åeY_çÑ_çeYÒ_ä_åeZ_çÑ_çeZÒ_ä_åe[_çÑ_çe[Ò_ä_åe\_çÑ_çe\Ò_ä_åe]_çÑ_çe]Ò_ä_åe^_çÑ_çe^Ò_ä_åe__çÑ_çe_Ò_ä_åe`_çÑ_çe`Ò_ä_åea_çÑ_çeaÒ_ä_åeb_çÑ_çebÒ_ä_åec_çÑ_çecÒ_ä_åed_çÑ_çedÒ_ä_åee_çÑ_çeeÒ_ä_åef_çÑ_çefÒ_ä_åeg_çÑ_çegÒ_ä_åeh_çÑ_çehÒ_ä_åei_çÑ_çeiÒ_ä_åej_çÑ_çejÒ_ä_åek_çÑ_çekÒ_ä_åel_çÑ_çelÒ_ä_åem_çÑ_çemÒ_ä_åen_çÑ_çenÒ_ä_åeo_çÑ_çeoÒ_ä_åep_çÑ_çepÒ_ä_åeq_çÑ_çeqÒ_ä_åer_çÑ_çerÒ_ä_åes_çÑ_çesÒ_ä_ået_çÑ_çetÒ_ä_åeu_çÑ_çeuÒ_ä_åev_çÑ_çevÒ_ä_åew_çÑ_çewÒ_ä_åex_çÑ_çexÒ_ä_åey_çÑ_çeyÒ_ä_åez_çÑ_çezÒ_ä_åe{_çÑ_çe{Ò_ä_åe|_çÑ_çe|Ò_ä_åe}_çÑ_çe}Ò_ä_åe~_çÑ_çe~Ò_ä_åe_çÑ_çeÒ_ä_åe€_çÑ_çe€Ò_ä_åe_çÑ_çeÒ_ä_åe‚_çÑ_çe‚Ò_ä_åeƒ_çÑ_çeƒÒ_ä_åe„_çÑ_çe„Ò_ä_åe…_çÑ_çe…Ò_ä_åe†_çÑ_çe†Ò_ä_åe‡_çÑ_çe‡Ò_ä_åeˆ_çÑ_çeˆÒ_ä_åe‰_çÑ_çe‰Ò_ä_åeŠ_çÑ_çeŠÒ_ä_åe‹_çÑ_çe‹Ò_ä_åeŒ_çÑ_çeŒÒ_ä_åe_çÑ_çeÒ_ä_åeŽ_çÑ_çeŽÒ_ä_åe_çÑ_çeÒ_ä_åe_çÑ_çeÒ_ä_åe‘_çÑ_çe‘Ò_ä_åe’_çÑ_çe’Ò_ä_åe“_çÑ_çe“Ò_ä_åe”_çÑ_çe”Ò_ä_åe•_çÑ_çe•Ò_ä_åe–_çÑ_çe–Ò_ä_åe—_çÑ_çe—Ò_ä_åe˜_çÑ_çe˜Ò_ä_åe™_çÑ_çe™Ò_ä_åeš_çÑ_çešÒ_ä_åe›_çÑ_çe›Ò_ä_åeœ_çÑ_çeœÒ_ä_åe_çÑ_çeÒ_ä_åež_çÑ_çežÒ_ä_åeŸ_çÑ_çeŸÒ_ä_åe _çÑ_çe Ò_ä_åe¡_çÑ_çe¡Ò_ä_åe¢_çÑ_çe¢Ò_ä_åe£_çÑ_çe£Ò_ä_åe¤_çÑ_çe¤Ò_ä_åe¥_çÑ_çe¥Ò_ä_åe¦_çÑ_çe¦Ò_ä_åe§_çÑ_çe§Ò_ä_åe¨_çÑ_çe¨Ò_ä_åe©_çÑ_çe©Ò_ä_åeª_çÑ_çeªÒ_ä_åe«_çÑ_çe«Ò_ä_åe¬_çÑ_çe¬Ò_ä_åe­_çÑ_çe­Ò_ä_åe®_çÑ_çe®Ò_ä_åe¯_çÑ_çe¯Ò_ä_åe°_çÑ_çe°Ò_ä_åe±_çÑ_çe±Ò_ä_åe²_çÑ_çe²Ò_ä_åe³_çÑ_çe³Ò_ä_åe´_çÑ_çe´Ò_ä_åeµ_çÑ_çeµÒ_ä_åe¶_çÑ_çe¶Ò_ä_åe·_çÑ_çe·Ò_ä_åe¸_çÑ_çe¸Ò_ä_åe¹_çÑ_çe¹Ò_ä_åeº_çÑ_çeºÒ_ä_åe»_çÑ_çe»Ò_ä_åe¼_çÑ_çe¼Ò_ä_åe½_çÑ_çe½Ò_ä_åe¾_çÑ_çe¾Ò_ä_åe¿_çÑ_çe¿Ò_ä_åeÀ_çÑ_çeÀÒ_ä_åeÁ_çÑ_çeÁÒ_ä_åeÂ_çÑ_çeÂÒ_ä_åeÃ_çÑ_çeÃÒ_ä_åeÄ_çÑ_çeÄÒ_ä_åeÅ_çÑ_çeÅÒ_ä_åeÆ_çÑ_çeÆÒ_ä_åeÇ_çÑ_çeÇÒ_ä_åeÈ_çÑ_çeÈÒ_ä_åeÉ_çÑ_çeÉÒ_ä_åeÊ_çÑ_çeÊÒ_ä_åeË_çÑ_çeËÒ_ä_åeÌ_çÑ_çeÌÒ_ä_åeÍ_çÑ_çeÍÒ_ä_åeÎ_çÑ_çeÎÒ_ä_åeÏ_çÑ_çeÏÒ_ä_åeÐ_çÑ_çeÐÒ_ä_åeÑ_çÑ_çeÑÒ_ä_åeÒ_çÑ_çeÒÒ_ä_åeÓ_çÑ_çeÓÒ_ä_åeÔ_çÑ_çeÔÒ_ä_åeÕ_çÑ_çeÕÒ_ä_åeÖ_çÑ_çeÖÒ_ä_åe×_çÑ_çe×Ò_ä_åeØ_çÑ_çeØÒ_ä_åeÙ_çÑ_çeÙÒ_ä_åeÚ_çÑ_çeÚÒ_ä_åeÛ_çÑ_çeÛÒ_ä_åeÜ_çÑ_çeÜÒ_ä_åeÝ_çÑ_çeÝÒ_ä_åeÞ_çÑ_çeÞÒ_ä_åeß_çÑ_çeßÒ_ä_åeà_çÑ_çeàÒ_ä_åeá_çÑ_çeáÒ_ä_åeâ_çÑ_çeâÒ_ä_åeã_çÑ_çeãÒ_ä_åeä_çÑ_çeäÒ_ä_åeå_çÑ_çeåÒ_ä_åeæ_çÑ_çeæÒ_ä_åeç_çÑ_çeçÒ_ä_åeè_çÑ_çeèÒ_ä_åeé_çÑ_çeéÒ_ä_åeê_çÑ_çeêÒ_ä_åeë_çÑ_çeëÒ_ä_åeì_çÑ_çeìÒ_ä_åeí_çÑ_çeíÒ_ä_åeî_çÑ_çeîÒ_ä_åeï_çÑ_çeïÒ_ä_åeð_çÑ_çeðÒ_ä_åeñ_çÑ_çeñÒ_ä_åeò_çÑ_çeòÒ_ä_åeó_çÑ_çeóÒ_ä_åeô_çÑ_çeôÒ_ä_åeõ_çÑ_çeõÒ_ä_åeö_çÑ_çeöÒ_ä_åe÷_çÑ_çe÷Ò_ä_åeø_çÑ_çeøÒ_ä_åeù_çÑ_çeùÒ_ä_åeú_çÑ_çeúÒ_ä_åeû_çÑ_çeûÒ_ä_åeü_çÑ_çeüÒ_ä_åeý_çÑ_çeýÒ_ä_åeþ_çÑ_çeþÒ_ä_åeÿ_çÑ_çeÿÒ_ä_åf_çÑ_çfÒ_ä_åf_çÑ_çfÒ_ä_åf_çÑ_çfÒ_ä_åf_çÑ_çfÒ_ä_åf_çÑ_çfÒ_ä_åf_çÑ_çfÒ_ä_åf_çÑ_çfÒ_ä_åf_çÑ_çfÒ_ä_åf_çÑ_çfÒ_ä_åf _çÑ_çf Ò_ä_åf _çÑ_çf Ò_ä_åf _çÑ_çf Ò_ä_åf _çÑ_çf Ò_ä_åf _çÑ_çf Ò_ä_åf_çÑ_çfÒ_ä_åf_çÑ_çfÒ_ä_åf_çÑ_çfÒ_ä_åf_çÑ_çfÒ_ä_åf_çÑ_çfÒ_ä_åf_çÑ_çfÒ_ä_åf_çÑ_çfÒ_ä_åf_çÑ_çfÒ_ä_åf_çÑ_çfÒ_ä_åf_çÑ_çfÒ_ä_åf_çÑ_çfÒ_ä_åf_çÑ_çfÒ_ä_åf_çÑ_çfÒ_ä_åf_çÑ_çfÒ_ä_åf_çÑ_çfÒ_ä_åf_çÑ_çfÒ_ä_åf_çÑ_çfÒ_ä_åf_çÑ_çfÒ_ä_åf _çÑ_çf Ò_ä_åf!_çÑ_çf!Ò_ä_åf"_çÑ_çf"Ò_ä_åf#_çÑ_çf#Ò_ä_åf$_çÑ_çf$Ò_ä_åf%_çÑ_çf%Ò_ä_åf&_çÑ_çf&Ò_ä_åf'_çÑ_çf'Ò_ä_åf(_çÑ_çf(Ò_ä_åf)_çÑ_çf)Ò_ä_åf*_çÑ_çf*Ò_ä_åf+_çÑ_çf+Ò_ä_åf,_çÑ_çf,Ò_ä_åf-_çÑ_çf-Ò_ä_åf._çÑ_çf.Ò_ä_åf/_çÑ_çf/Ò_ä_åf0_çÑ_çf0Ò_ä_åf1_çÑ_çf1Ò_ä_åf2_çÑ_çf2Ò_ä_åf3_çÑ_çf3Ò_ä_åf4_çÑ_çf4Ò_ä_åf5_çÑ_çf5Ò_ä_åf6_çÑ_çf6Ò_ä_åf7_çÑ_çf7Ò_ä_åf8_çÑ_çf8Ò_ä_åf9_çÑ_çf9Ò_ä_åf:_çÑ_çf:Ò_ä_åf;_çÑ_çf;Ò_ä_åf<_çÑ_çf<Ò_ä_åf=_çÑ_çf=Ò_ä_åf>_çÑ_çf>Ò_ä_åf?_çÑ_çf?Ò_ä_åf@_çÑ_çf@Ò_ä_åfA_çÑ_çfAÒ_ä_åfB_çÑ_çfBÒ_ä_åfC_çÑ_çfCÒ_ä_åfD_çÑ_çfDÒ_ä_åfE_çÑ_çfEÒ_ä_åfF_çÑ_çfFÒ_ä_åfG_çÑ_çfGÒ_ä_åfH_çÑ_çfHÒ_ä_åfI_çÑ_çfIÒ_ä_åfJ_çÑ_çfJÒ_ä_åfK_çÑ_çfKÒ_ä_åfL_çÑ_çfLÒ_ä_åfM_çÑ_çfMÒ_ä_åfN_çÑ_çfNÒ_ä_åfO_çÑ_çfOÒ_ä_åfP_çÑ_çfPÒ_ä_åfQ_çÑ_çfQÒ_ä_åfR_çÑ_çfRÒ_ä_åfS_çÑ_çfSÒ_ä_åfT_çÑ_çfTÒ_ä_åfU_çÑ_çfUÒ_ä_åfV_çÑ_çfVÒ_ä_åfW_çÑ_çfWÒ_ä_åfX_çÑ_çfXÒ_ä_åfY_çÑ_çfYÒ_ä_åfZ_çÑ_çfZÒ_ä_åf[_çÑ_çf[Ò_ä_åf\_çÑ_çf\Ò_ä_åf]_çÑ_çf]Ò_ä_åf^_çÑ_çf^Ò_ä_åf__çÑ_çf_Ò_ä_åf`_çÑ_çf`Ò_ä_åfa_çÑ_çfaÒ_ä_åfb_çÑ_çfbÒ_ä_åfc_çÑ_çfcÒ_ä_åfd_çÑ_çfdÒ_ä_åfe_çÑ_çfeÒ_ä_åff_çÑ_çffÒ_ä_åfg_çÑ_çfgÒ_ä_åfh_çÑ_çfhÒ_ä_åfi_çÑ_çfiÒ_ä_åfj_çÑ_çfjÒ_ä_åfk_çÑ_çfkÒ_ä_åfl_çÑ_çflÒ_ä_åfm_çÑ_çfmÒ_ä_åfn_çÑ_çfnÒ_ä_åfo_çÑ_çfoÒ_ä_åfp_çÑ_çfpÒ_ä_åfq_çÑ_çfqÒ_ä_åfr_çÑ_çfrÒ_ä_åfs_çÑ_çfsÒ_ä_åft_çÑ_çftÒ_ä_åfu_çÑ_çfuÒ_ä_åfv_çÑ_çfvÒ_ä_åfw_çÑ_çfwÒ_ä_åfx_çÑ_çfxÒ_ä_åfy_çÑ_çfyÒ_ä_åfz_çÑ_çfzÒ_ä_åf{_çÑ_çf{Ò_ä_åf|_çÑ_çf|Ò_ä_åf}_çÑ_çf}Ò_ä_åf~_çÑ_çf~Ò_ä_åf_çÑ_çfÒ_ä_åf€_çÑ_çf€Ò_ä_åf_çÑ_çfÒ_ä_åf‚_çÑ_çf‚Ò_ä_åfƒ_çÑ_çfƒÒ_ä_åf„_çÑ_çf„Ò_ä_åf…_çÑ_çf…Ò_ä_åf†_çÑ_çf†Ò_ä_åf‡_çÑ_çf‡Ò_ä_åfˆ_çÑ_çfˆÒ_ä_åf‰_çÑ_çf‰Ò_ä_åfŠ_çÑ_çfŠÒ_ä_åf‹_çÑ_çf‹Ò_ä_åfŒ_çÑ_çfŒÒ_ä_åf_çÑ_çfÒ_ä_åfŽ_çÑ_çfŽÒ_ä_åf_çÑ_çfÒ_ä_åf_çÑ_çfÒ_ä_åf‘_çÑ_çf‘Ò_ä_åf’_çÑ_çf’Ò_ä_åf“_çÑ_çf“Ò_ä_åf”_çÑ_çf”Ò_ä_åf•_çÑ_çf•Ò_ä_åf–_çÑ_çf–Ò_ä_åf—_çÑ_çf—Ò_ä_åf˜_çÑ_çf˜Ò_ä_åf™_çÑ_çf™Ò_ä_åfš_çÑ_çfšÒ_ä_åf›_çÑ_çf›Ò_ä_åfœ_çÑ_çfœÒ_ä_åf_çÑ_çfÒ_ä_åfž_çÑ_çfžÒ_ä_åfŸ_çÑ_çfŸÒ_ä_åf _çÑ_çf Ò_ä_åf¡_çÑ_çf¡Ò_ä_åf¢_çÑ_çf¢Ò_ä_åf£_çÑ_çf£Ò_ä_åf¤_çÑ_çf¤Ò_ä_åf¥_çÑ_çf¥Ò_ä_åf¦_çÑ_çf¦Ò_ä_åf§_çÑ_çf§Ò_ä_åf¨_çÑ_çf¨Ò_ä_åf©_çÑ_çf©Ò_ä_åfª_çÑ_çfªÒ_ä_åf«_çÑ_çf«Ò_ä_åf¬_çÑ_çf¬Ò_ä_åf­_çÑ_çf­Ò_ä_åf®_çÑ_çf®Ò_ä_åf¯_çÑ_çf¯Ò_ä_åf°_çÑ_çf°Ò_ä_åf±_çÑ_çf±Ò_ä_åf²_çÑ_çf²Ò_ä_åf³_çÑ_çf³Ò_ä_åf´_çÑ_çf´Ò_ä_åfµ_çÑ_çfµÒ_ä_åf¶_çÑ_çf¶Ò_ä_åf·_çÑ_çf·Ò_ä_åf¸_çÑ_çf¸Ò_ä_åf¹_çÑ_çf¹Ò_ä_åfº_çÑ_çfºÒ_ä_åf»_çÑ_çf»Ò_ä_åf¼_çÑ_çf¼Ò_ä_åf½_çÑ_çf½Ò_ä_åf¾_çÑ_çf¾Ò_ä_åf¿_çÑ_çf¿Ò_ä_åfÀ_çÑ_çfÀÒ_ä_åfÁ_çÑ_çfÁÒ_ä_åfÂ_çÑ_çfÂÒ_ä_åfÃ_çÑ_çfÃÒ_ä_åfÄ_çÑ_çfÄÒ_ä_åfÅ_çÑ_çfÅÒ_ä_åfÆ_çÑ_çfÆÒ_ä_åfÇ_çÑ_çfÇÒ_ä_åfÈ_çÑ_çfÈÒ_ä_åfÉ_çÑ_çfÉÒ_ä_åfÊ_çÑ_çfÊÒ_ä_åfË_çÑ_çfËÒ_ä_åfÌ_çÑ_çfÌÒ_ä_åfÍ_çÑ_çfÍÒ_ä_åfÎ_çÑ_çfÎÒ_ä_åfÏ_çÑ_çfÏÒ_ä_åfÐ_çÑ_çfÐÒ_ä_åfÑ_çÑ_çfÑÒ_ä_åfÒ_çÑ_çfÒÒ_ä_åfÓ_çÑ_çfÓÒ_ä_åfÔ_çÑ_çfÔÒ_ä_åfÕ_çÑ_çfÕÒ_ä_åfÖ_çÑ_çfÖÒ_ä_åf×_çÑ_çf×Ò_ä_åfØ_çÑ_çfØÒ_ä_åfÙ_çÑ_çfÙÒ_ä_åfÚ_çÑ_çfÚÒ_ä_åfÛ_çÑ_çfÛÒ_ä_åfÜ_çÑ_çfÜÒ_ä_åfÝ_çÑ_çfÝÒ_ä_åfÞ_çÑ_çfÞÒ_ä_åfß_çÑ_çfßÒ_ä_åfà_çÑ_çfàÒ_ä_åfá_çÑ_çfáÒ_ä_åfâ_çÑ_çfâÒ_ä_åfã_çÑ_çfãÒ_ä_åfä_çÑ_çfäÒ_ä_åfå_çÑ_çfåÒ_ä_åfæ_çÑ_çfæÒ_ä_åfç_çÑ_çfçÒ_ä_åfè_çÑ_çfèÒ_ä_åfé_çÑ_çféÒ_ä_åfê_çÑ_çfêÒ_ä_åfë_çÑ_çfëÒ_ä_åfì_çÑ_çfìÒ_ä_åfí_çÑ_çfíÒ_ä_åfî_çÑ_çfîÒ_ä_åfï_çÑ_çfïÒ_ä_åfð_çÑ_çfðÒ_ä_åfñ_çÑ_çfñÒ_ä_åfò_çÑ_çfòÒ_ä_åfó_çÑ_çfóÒ_ä_åfô_çÑ_çfôÒ_ä_åfõ_çÑ_çfõÒ_ä_åfö_çÑ_çföÒ_ä_åf÷_çÑ_çf÷Ò_ä_åfø_çÑ_çføÒ_ä_åfù_çÑ_çfùÒ_ä_åfú_çÑ_çfúÒ_ä_åfû_çÑ_çfûÒ_ä_åfü_çÑ_çfüÒ_ä_åfý_çÑ_çfýÒ_ä_åfþ_çÑ_çfþÒ_ä_åfÿ_çÑ_çfÿÒ_ä_åg_çÑ_çgÒ_ä_åg_çÑ_çgÒ_ä_åg_çÑ_çgÒ_ä_åg_çÑ_çgÒ_ä_åg_çÑ_çgÒ_ä_åg_çÑ_çgÒ_ä_åg_çÑ_çgÒ_ä_åg_çÑ_çgÒ_ä_åg_çÑ_çgÒ_ä_åg _çÑ_çg Ò_ä_åg _çÑ_çg Ò_ä_åg _çÑ_çg Ò_ä_åg _çÑ_çg Ò_ä_åg _çÑ_çg Ò_ä_åg_çÑ_çgÒ_ä_åg_çÑ_çgÒ_ä_åg_çÑ_çgÒ_ä_åg_çÑ_çgÒ_ä_åg_çÑ_çgÒ_ä_åg_çÑ_çgÒ_ä_åg_çÑ_çgÒ_ä_åg_çÑ_çgÒ_ä_åg_çÑ_çgÒ_ä_åg_çÑ_çgÒ_ä_åg_çÑ_çgÒ_ä_åg_çÑ_çgÒ_ä_åg_çÑ_çgÒ_ä_åg_çÑ_çgÒ_ä_åg_çÑ_çgÒ_ä_åg_çÑ_çgÒ_ä_åg_çÑ_çgÒ_ä_åg_çÑ_çgÒ_ä_åg _çÑ_çg Ò_ä_åg!_çÑ_çg!Ò_ä_åg"_çÑ_çg"Ò_ä_åg#_çÑ_çg#Ò_ä_åg$_çÑ_çg$Ò_ä_åg%_çÑ_çg%Ò_ä_åg&_çÑ_çg&Ò_ä_åg'_çÑ_çg'Ò_ä_åg(_çÑ_çg(Ò_ä_åg)_çÑ_çg)Ò_ä_åg*_çÑ_çg*Ò_ä_åg+_çÑ_çg+Ò_ä_åg,_çÑ_çg,Ò_ä_åg-_çÑ_çg-Ò_ä_åg._çÑ_çg.Ò_ä_åg/_çÑ_çg/Ò_ä_åg0_çÑ_çg0Ò_ä_åg1_çÑ_çg1Ò_ä_åg2_çÑ_çg2Ò_ä_åg3_çÑ_çg3Ò_ä_åg4_çÑ_çg4Ò_ä_åg5_çÑ_çg5Ò_ä_åg6_çÑ_çg6Ò_ä_åg7_çÑ_çg7Ò_ä_åg8_çÑ_çg8Ò_ä_åg9_çÑ_çg9Ò_ä_åg:_çÑ_çg:Ò_ä_åg;_çÑ_çg;Ò_ä_åg<_çÑ_çg<Ò_ä_åg=_çÑ_çg=Ò_ä_åg>_çÑ_çg>Ò_ä_åg?_çÑ_çg?Ò_ä_åg@_çÑ_çg@Ò_ä_ågA_çÑ_çgAÒ_ä_ågB_çÑ_çgBÒ_ä_ågC_çÑ_çgCÒ_ä_ågD_çÑ_çgDÒ_ä_ågE_çÑ_çgEÒ_ä_ågF_çÑ_çgFÒ_ä_ågG_çÑ_çgGÒ_ä_ågH_çÑ_çgHÒ_ä_ågI_çÑ_çgIÒ_ä_ågJ_çÑ_çgJÒ_ä_ågK_çÑ_çgKÒ_ä_ågL_çÑ_çgLÒ_ä_ågM_çÑ_çgMÒ_ä_ågN_çÑ_çgNÒ_ä_ågO_çÑ_çgOÒ_ä_ågP_çÑ_çgPÒ_ä_ågQ_çÑ_çgQÒ_ä_ågR_çÑ_çgRÒ_ä_ågS_çÑ_çgSÒ_ä_ågT_çÑ_çgTÒ_ä_ågU_çÑ_çgUÒ_ä_ågV_çÑ_çgVÒ_ä_ågW_çÑ_çgWÒ_ä_ågX_çÑ_çgXÑ_çgYÒ_ä_ågY_çÒ_ä_ågZ_çÑ_çgZÒ_ä_åg[_çÑ_çg[Ñ_çg\Ò_ä_åg\_çÒ_ä_åg]_çÑ_çg]Ò_ä_åg^_çÑ_çg^Ò_ä_åg__çÑ_çg_Ò_ä_åg`_çÑ_çg`Ò_ä_åga_çÑ_çgaÒ_ä_ågb_çÑ_çgbÒ_ä_ågc_çÑ_çgcÒ_ä_ågd_çÑ_çgdÒ_ä_åge_çÑ_çgeÒ_ä_ågf_çÑ_çgfÒ_ä_ågg_çÑ_çggÒ_ä_ågh_çÑ_çghÒ_ä_ågi_çÑ_çgiÒ_ä_ågj_çÑ_çgjÒ_ä_ågk_çÑ_çgkÒ_ä_ågl_çÑ_çglÒ_ä_ågm_çÑ_çgmÒ_ä_ågn_çÑ_çgnÒ_ä_ågo_çÑ_çgoÒ_ä_ågp_çÑ_çgpÒ_ä_ågq_çÑ_çgqÒ_ä_ågr_çÑ_çgrÒ_ä_ågs_çÑ_çgsÒ_ä_ågt_çÑ_çgtÒ_ä_ågu_çÑ_çguÒ_ä_ågv_çÑ_çgvÒ_ä_ågw_çÑ_çgwÒ_ä_ågx_çÑ_çgxÒ_ä_ågy_çÑ_çgyÒ_ä_ågz_çÑ_çgzÒ_ä_åg{_çÑ_çg{Ò_ä_åg|_çÑ_çg|Ò_ä_åg}_çÑ_çg}Ò_ä_åg~_çÑ_çg~Ò_ä_åg_çÑ_çgÒ_ä_åg€_çÑ_çg€Ò_ä_åg_çÑ_çgÒ_ä_åg‚_çÑ_çg‚Ò_ä_ågƒ_çÑ_çgƒÒ_ä_åg„_çÑ_çg„Ò_ä_åg…_çÑ_çg…Ò_ä_åg†_çÑ_çg†Ò_ä_åg‡_çÑ_çg‡Ò_ä_ågˆ_çÑ_çgˆÒ_ä_åg‰_çÑ_çg‰Ò_ä_ågŠ_çÑ_çgŠÒ_ä_åg‹_çÑ_çg‹Ò_ä_ågŒ_çÑ_çgŒÒ_ä_åg_çÑ_çgÒ_ä_ågŽ_çÑ_çgŽÒ_ä_åg_çÑ_çgÒ_ä_åg_çÑ_çgÒ_ä_åg‘_çÑ_çg‘Ò_ä_åg’_çÑ_çg’Ò_ä_åg“_çÑ_çg“Ò_ä_åg”_çÑ_çg”Ò_ä_åg•_çÑ_çg•Ò_ä_åg–_çÑ_çg–Ò_ä_åg—_çÑ_çg—Ò_ä_åg˜_çÑ_çg˜Ò_ä_åg™_çÑ_çg™Ò_ä_ågš_çÑ_çgšÒ_ä_åg›_çÑ_çg›Ò_ä_ågœ_çÑ_çgœÒ_ä_åg_çÑ_çgÒ_ä_ågž_çÑ_çgžÒ_ä_ågŸ_çÑ_çgŸÒ_ä_åg _çÑ_çg Ò_ä_åg¡_çÑ_çg¡Ò_ä_åg¢_çÑ_çg¢Ò_ä_åg£_çÑ_çg£Ò_ä_åg¤_çÑ_çg¤Ò_ä_åg¥_çÑ_çg¥Ò_ä_åg¦_çÑ_çg¦Ò_ä_åg§_çÑ_çg§Ò_ä_åg¨_çÑ_çg¨Ò_ä_åg©_çÑ_çg©Ò_ä_ågª_çÑ_çgªÒ_ä_åg«_çÑ_çg«Ò_ä_åg¬_çÑ_çg¬Ò_ä_åg­_çÑ_çg­Ò_ä_åg®_çÑ_çg®Ò_ä_åg¯_çÑ_çg¯Ò_ä_åg°_çÑ_çg°Ò_ä_åg±_çÑ_çg±Ò_ä_åg²_çÑ_çg²Ò_ä_åg³_çÑ_çg³Ò_ä_åg´_çÑ_çg´Ò_ä_ågµ_çÑ_çgµÒ_ä_åg¶_çÑ_çg¶Ò_ä_åg·_çÑ_çg·Ò_ä_åg¸_çÑ_çg¸Ò_ä_åg¹_çÑ_çg¹Ò_ä_ågº_çÑ_çgºÒ_ä_åg»_çÑ_çg»Ò_ä_åg¼_çÑ_çg¼Ò_ä_åg½_çÑ_çg½Ò_ä_åg¾_çÑ_çg¾Ò_ä_åg¿_çÑ_çg¿Ò_ä_ågÀ_çÑ_çgÀÒ_ä_ågÁ_çÑ_çgÁÒ_ä_ågÂ_çÑ_çgÂÒ_ä_ågÃ_çÑ_çgÃÒ_ä_ågÄ_çÑ_çgÄÒ_ä_ågÅ_çÑ_çgÅÒ_ä_ågÆ_çÑ_çgÆÒ_ä_ågÇ_çÑ_çgÇÒ_ä_ågÈ_çÑ_çgÈÒ_ä_ågÉ_çÑ_çgÉÒ_ä_ågÊ_çÑ_çgÊÒ_ä_ågË_çÑ_çgËÒ_ä_ågÌ_çÑ_çgÌÒ_ä_ågÍ_çÑ_çgÍÒ_ä_ågÎ_çÑ_çgÎÒ_ä_ågÏ_çÑ_çgÏÒ_ä_ågÐ_çÑ_çgÐÒ_ä_ågÑ_çÑ_çgÑÒ_ä_ågÒ_çÑ_çgÒÒ_ä_ågÓ_çÑ_çgÓÒ_ä_ågÔ_çÑ_çgÔÒ_ä_ågÕ_çÑ_çgÕÒ_ä_ågÖ_çÑ_çgÖÒ_ä_åg×_çÑ_çg×Ò_ä_ågØ_çÑ_çgØÒ_ä_ågÙ_çÑ_çgÙÒ_ä_ågÚ_çÑ_çgÚÒ_ä_ågÛ_çÑ_çgÛÒ_ä_ågÜ_çÑ_çgÜÒ_ä_ågÝ_çÑ_çgÝÒ_ä_ågÞ_çÑ_çgÞÒ_ä_ågß_çÑ_çgßÒ_ä_ågà_çÑ_çgàÒ_ä_ågá_çÑ_çgáÒ_ä_ågâ_çÑ_çgâÒ_ä_ågã_çÑ_çgãÒ_ä_ågä_çÑ_çgäÒ_ä_ågå_çÑ_çgåÒ_ä_ågæ_çÑ_çgæÒ_ä_ågç_çÑ_çgçÒ_ä_ågè_çÑ_çgèÒ_ä_ågé_çÑ_çgéÒ_ä_ågê_çÑ_çgêÒ_ä_ågë_çÑ_çgëÒ_ä_ågì_çÑ_çgìÒ_ä_ågí_çÑ_çgíÒ_ä_ågî_çÑ_çgîÒ_ä_ågï_çÑ_çgïÒ_ä_ågð_çÑ_çgðÒ_ä_ågñ_çÑ_çgñÒ_ä_ågò_çÑ_çgòÒ_ä_ågó_çÑ_çgóÒ_ä_ågô_çÑ_çgôÒ_ä_ågõ_çÑ_çgõÒ_ä_ågö_çÑ_çgöÒ_ä_åg÷_çÑ_çg÷Ò_ä_ågø_çÑ_çgøÒ_ä_ågù_çÑ_çgùÒ_ä_ågú_çÑ_çgúÒ_ä_ågû_çÑ_çgûÒ_ä_ågü_çÑ_çgüÒ_ä_ågý_çÑ_çgýÒ_ä_ågþ_çÑ_çgþÒ_ä_ågÿ_çÑ_çgÿÒ_ä_åh_çÑ_çhÒ_ä_åh_çÑ_çhÒ_ä_åh_çÑ_çhÒ_ä_åh_çÑ_çhÒ_ä_åh_çÑ_çhÒ_ä_åh_çÑ_çhÒ_ä_åh_çÑ_çhÒ_ä_åh_çÑ_çhÒ_ä_åh_çÑ_çhÒ_ä_åh _çÑ_çh Ò_ä_åh _çÑ_çh Ò_ä_åh _çÑ_çh Ò_ä_åh _çÑ_çh Ò_ä_åh _çÑ_çh Ò_ä_åh_çÑ_çhÒ_ä_åh_çÑ_çhÒ_ä_åh_çÑ_çhÒ_ä_åh_çÑ_çhÒ_ä_åh_çÑ_çhÒ_ä_åh_çÑ_çhÒ_ä_åh_çÑ_çhÒ_ä_åh_çÑ_çhÒ_ä_åh_çÑ_çhÒ_ä_åh_çÑ_çhÒ_ä_åh_çÑ_çhÒ_ä_åh_çÑ_çhÒ_ä_åh_çÑ_çhÒ_ä_åh_çÑ_çhÒ_ä_åh_çÑ_çhÒ_ä_åh_çÑ_çhÒ_ä_åh_çÑ_çhÒ_ä_åh_çÑ_çhÒ_ä_åh _çÑ_çh Ò_ä_åh!_çÑ_çh!Ò_ä_åh"_çÑ_çh"Ò_ä_åh#_çÑ_çh#Ò_ä_åh$_çÑ_çh$Ò_ä_åh%_çÑ_çh%Ò_ä_åh&_çÑ_çh&Ò_ä_åh'_çÑ_çh'Ò_ä_åh(_çÑ_çh(Ò_ä_åh)_çÑ_çh)Ò_ä_åh*_çÑ_çh*Ò_ä_åh+_çÑ_çh+Ò_ä_åh,_çÑ_çh,Ò_ä_åh-_çÑ_çh-Ò_ä_åh._çÑ_çh.Ò_ä_åh/_çÑ_çh/Ò_ä_åh0_çÑ_çh0Ò_ä_åh1_çÑ_çh1Ò_ä_åh2_çÑ_çh2Ò_ä_åh3_çÑ_çh3Ò_ä_åh4_çÑ_çh4Ò_ä_åh5_çÑ_çh5Ò_ä_åh6_çÑ_çh6Ò_ä_åh7_çÑ_çh7Ò_ä_åh8_çÑ_çh8Ò_ä_åh9_çÑ_çh9Ò_ä_åh:_çÑ_çh:Ò_ä_åh;_çÑ_çh;Ò_ä_åh<_çÑ_çh<Ò_ä_åh=_çÑ_çh=Ò_ä_åh>_çÑ_çh>Ò_ä_åh?_çÑ_çh?Ò_ä_åh@_çÑ_çh@Ò_ä_åhA_çÑ_çhAÒ_ä_åhB_çÑ_çhBÒ_ä_åhC_çÑ_çhCÒ_ä_åhD_çÑ_çhDÒ_ä_åhE_çÑ_çhEÒ_ä_åhF_çÑ_çhFÒ_ä_åhG_çÑ_çhGÒ_ä_åhH_çÑ_çhHÒ_ä_åhI_çÑ_çhIÒ_ä_åhJ_çÑ_çhJÒ_ä_åhK_çÑ_çhKÒ_ä_åhL_çÑ_çhLÒ_ä_åhM_çÑ_çhMÒ_ä_åhN_çÑ_çhNÒ_ä_åhO_çÑ_çhOÒ_ä_åhP_çÑ_çhPÒ_ä_åhQ_çÑ_çhQÒ_ä_åhR_çÑ_çhRÒ_ä_åhS_çÑ_çhSÒ_ä_åhT_çÑ_çhTÒ_ä_åhU_çÑ_çhUÒ_ä_åhV_çÑ_çhVÒ_ä_åhW_çÑ_çhWÒ_ä_åhX_çÑ_çhXÒ_ä_åhY_çÑ_çhYÒ_ä_åhZ_çÑ_çhZÒ_ä_åh[_çÑ_çh[Ò_ä_åh\_çÑ_çh\Ò_ä_åh]_çÑ_çh]Ò_ä_åh^_çÑ_çh^Ò_ä_åh__çÑ_çh_Ò_ä_åh`_çÑ_çh`Ò_ä_åha_çÑ_çhaÒ_ä_åhb_çÑ_çhbÒ_ä_åhc_çÑ_çhcÒ_ä_åhd_çÑ_çhdÒ_ä_åhe_çÑ_çheÒ_ä_åhf_çÑ_çhfÒ_ä_åhg_çÑ_çhgÒ_ä_åhh_çÑ_çhhÒ_ä_åhi_çÑ_çhiÒ_ä_åhj_çÑ_çhjÒ_ä_åhk_çÑ_çhkÒ_ä_åhl_çÑ_çhlÒ_ä_åhm_çÑ_çhmÒ_ä_åhn_çÑ_çhnÒ_ä_åho_çÑ_çhoÒ_ä_åhp_çÑ_çhpÒ_ä_åhq_çÑ_çhqÒ_ä_åhr_çÑ_çhrÒ_ä_åhs_çÑ_çhsÒ_ä_åht_çÑ_çhtÒ_ä_åhu_çÑ_çhuÒ_ä_åhv_çÑ_çhvÒ_ä_åhw_çÑ_çhwÒ_ä_åhx_çÑ_çhxÒ_ä_åhy_çÑ_çhyÒ_ä_åhz_çÑ_çhzÒ_ä_åh{_çÑ_çh{Ò_ä_åh|_çÑ_çh|Ò_ä_åh}_çÑ_çh}Ò_ä_åh~_çÑ_çh~Ò_ä_åh_çÑ_çhÒ_ä_åh€_çÑ_çh€Ò_ä_åh_çÑ_çhÒ_ä_åh‚_çÑ_çh‚Ò_ä_åhƒ_çÑ_çhƒÒ_ä_åh„_çÑ_çh„Ò_ä_åh…_çÑ_çh…Ò_ä_åh†_çÑ_çh†Ò_ä_åh‡_çÑ_çh‡Ò_ä_åhˆ_çÑ_çhˆÒ_ä_åh‰_çÑ_çh‰Ò_ä_åhŠ_çÑ_çhŠÒ_ä_åh‹_çÑ_çh‹Ò_ä_åhŒ_çÑ_çhŒÒ_ä_åh_çÑ_çhÒ_ä_åhŽ_çÑ_çhŽÒ_ä_åh_çÑ_çhÒ_ä_åh_çÑ_çhÒ_ä_åh‘_çÑ_çh‘Ò_ä_åh’_çÑ_çh’Ò_ä_åh“_çÑ_çh“Ò_ä_åh”_çÑ_çh”Ò_ä_åh•_çÑ_çh•Ò_ä_åh–_çÑ_çh–Ò_ä_åh—_çÑ_çh—Ò_ä_åh˜_çÑ_çh˜Ò_ä_åh™_çÑ_çh™Ò_ä_åhš_çÑ_çhšÒ_ä_åh›_çÑ_çh›Ò_ä_åhœ_çÑ_çhœÒ_ä_åh_çÑ_çhÒ_ä_åhž_çÑ_çhžÒ_ä_åhŸ_çÑ_çhŸÒ_ä_åh _çÑ_çh Ò_ä_åh¡_çÑ_çh¡Ò_ä_åh¢_çÑ_çh¢Ò_ä_åh£_çÑ_çh£Ò_ä_åh¤_çÑ_çh¤Ò_ä_åh¥_çÑ_çh¥Ò_ä_åh¦_çÑ_çh¦Ò_ä_åh§_çÑ_çh§Ò_ä_åh¨_çÑ_çh¨Ò_ä_åh©_çÑ_çh©Ò_ä_åhª_çÑ_çhªÒ_ä_åh«_çÑ_çh«Ò_ä_åh¬_çÑ_çh¬Ò_ä_åh­_çÑ_çh­Ò_ä_åh®_çÑ_çh®Ò_ä_åh¯_çÑ_çh¯Ò_ä_åh°_çÑ_çh°Ò_ä_åh±_çÑ_çh±Ò_ä_åh²_çÑ_çh²Ò_ä_åh³_çÑ_çh³Ò_ä_åh´_çÑ_çh´Ò_ä_åhµ_çÑ_çhµÒ_ä_åh¶_çÑ_çh¶Ò_ä_åh·_çÑ_çh·Ò_ä_åh¸_çÑ_çh¸Ò_ä_åh¹_çÑ_çh¹Ò_ä_åhº_çÑ_çhºÒ_ä_åh»_çÑ_çh»Ò_ä_åh¼_çÑ_çh¼Ò_ä_åh½_çÑ_çh½Ò_ä_åh¾_çÑ_çh¾Ò_ä_åh¿_çÑ_çh¿Ò_ä_åhÀ_çÑ_çhÀÒ_ä_åhÁ_çÑ_çhÁÒ_ä_åhÂ_çÑ_çhÂÒ_ä_åhÃ_çÑ_çhÃÒ_ä_åhÄ_çÑ_çhÄÒ_ä_åhÅ_çÑ_çhÅÒ_ä_åhÆ_çÑ_çhÆÒ_ä_åhÇ_çÑ_çhÇÒ_ä_åhÈ_çÑ_çhÈÒ_ä_åhÉ_çÑ_çhÉÒ_ä_åhÊ_çÑ_çhÊÒ_ä_åhË_çÑ_çhËÒ_ä_åhÌ_çÑ_çhÌÒ_ä_åhÍ_çÑ_çhÍÒ_ä_åhÎ_çÑ_çhÎÒ_ä_åhÏ_çÑ_çhÏÒ_ä_åhÐ_çÑ_çhÐÒ_ä_åhÑ_çÑ_çhÑÒ_ä_åhÒ_çÑ_çhÒÒ_ä_åhÓ_çÑ_çhÓÒ_ä_åhÔ_çÑ_çhÔÒ_ä_åhÕ_çÑ_çhÕÒ_ä_åhÖ_çÑ_çhÖÒ_ä_åh×_çÑ_çh×Ò_ä_åhØ_çÑ_çhØÒ_ä_åhÙ_çÑ_çhÙÒ_ä_åhÚ_çÑ_çhÚÒ_ä_åhÛ_çÑ_çhÛÒ_ä_åhÜ_çÑ_çhÜÒ_ä_åhÝ_çÑ_çhÝÒ_ä_åhÞ_çÑ_çhÞÒ_ä_åhß_çÑ_çhßÒ_ä_åhà_çÑ_çhàÒ_ä_åhá_çÑ_çháÒ_ä_åhâ_çÑ_çhâÒ_ä_åhã_çÑ_çhãÒ_ä_åhä_çÑ_çhäÒ_ä_åhå_çÑ_çhåÒ_ä_åhæ_çÑ_çhæÒ_ä_åhç_çÑ_çhçÒ_ä_åhè_çÑ_çhèÒ_ä_åhé_çÑ_çhéÒ_ä_åhê_çÑ_çhêÒ_ä_åhë_çÑ_çhëÒ_ä_åhì_çÑ_çhìÒ_ä_åhí_çÑ_çhíÒ_ä_åhî_çÑ_çhîÒ_ä_åhï_çÑ_çhïÒ_ä_åhð_çÑ_çhðÒ_ä_åhñ_çÑ_çhñÒ_ä_åhò_çÑ_çhòÒ_ä_åhó_çÑ_çhóÒ_ä_åhô_çÑ_çhôÒ_ä_åhõ_çÑ_çhõÒ_ä_åhö_çÑ_çhöÒ_ä_åh÷_çÑ_çh÷Ò_ä_åhø_çÑ_çhøÒ_ä_åhù_çÑ_çhùÒ_ä_åhú_çÑ_çhúÒ_ä_åhû_çÑ_çhûÒ_ä_åhü_çÑ_çhüÒ_ä_åhý_çÑ_çhýÒ_ä_åhþ_çÑ_çhþÒ_ä_åhÿ_çÑ_çhÿÒ_ä_åi_çÑ_çiÒ_ä_åi_çÑ_çiÒ_ä_åi_çÑ_çiÒ_ä_åi_çÑ_çiÒ_ä_åi_çÑ_çiÒ_ä_åi_çÑ_çiÒ_ä_åi_çÑ_çiÒ_ä_åi_çÑ_çiÒ_ä_åi_çÑ_çiÒ_ä_åi _çÑ_çi Ò_ä_åi _çÑ_çi Ò_ä_åi _çÑ_çi Ò_ä_åi _çÑ_çi Ò_ä_åi _çÑ_çi Ò_ä_åi_çÑ_çiÒ_ä_åi_çÑ_çiÒ_ä_åi_çÑ_çiÒ_ä_åi_çÑ_çiÒ_ä_åi_çÑ_çiÒ_ä_åi_çÑ_çiÒ_ä_åi_çÑ_çiÒ_ä_åi_çÑ_çiÒ_ä_åi_çÑ_çiÒ_ä_åi_çÑ_çiÒ_ä_åi_çÑ_çiÒ_ä_åi_çÑ_çiÒ_ä_åi_çÑ_çiÒ_ä_åi_çÑ_çiÒ_ä_åi_çÑ_çiÒ_ä_åi_çÑ_çiÒ_ä_åi_çÑ_çiÒ_ä_åi_çÑ_çiÒ_ä_åi _çÑ_çi Ò_ä_åi!_çÑ_çi!Ò_ä_åi"_çÑ_çi"Ò_ä_åi#_çÑ_çi#Ò_ä_åi$_çÑ_çi$Ò_ä_åi%_çÑ_çi%Ò_ä_åi&_çÑ_çi&Ò_ä_åi'_çÑ_çi'Ò_ä_åi(_çÑ_çi(Ò_ä_åi)_çÑ_çi)Ò_ä_åi*_çÑ_çi*Ò_ä_åi+_çÑ_çi+Ò_ä_åi,_çÑ_çi,Ò_ä_åi-_çÑ_çi-Ò_ä_åi._çÑ_çi.Ò_ä_åi/_çÑ_çi/Ò_ä_åi0_çÑ_çi0Ò_ä_åi1_çÑ_çi1Ò_ä_åi2_çÑ_çi2Ò_ä_åi3_çÑ_çi3Ò_ä_åi4_çÑ_çi4Ò_ä_åi5_çÑ_çi5Ò_ä_åi6_çÑ_çi6Ò_ä_åi7_çÑ_çi7Ò_ä_åi8_çÑ_çi8Ò_ä_åi9_çÑ_çi9Ò_ä_åi:_çÑ_çi:Ò_ä_åi;_çÑ_çi;Ò_ä_åi<_çÑ_çi<Ò_ä_åi=_çÑ_çi=Ò_ä_åi>_çÑ_çi>Ò_ä_åi?_çÑ_çi?Ò_ä_åi@_çÑ_çi@Ò_ä_åiA_çÑ_çiAÒ_ä_åiB_çÑ_çiBÒ_ä_åiC_çÑ_çiCÒ_ä_åiD_çÑ_çiDÒ_ä_åiE_çÑ_çiEÒ_ä_åiF_çÑ_çiFÒ_ä_åiG_çÑ_çiGÒ_ä_åiH_çÑ_çiHÒ_ä_åiI_çÑ_çiIÒ_ä_åiJ_çÑ_çiJÒ_ä_åiK_çÑ_çiKÒ_ä_åiL_çÑ_çiLÒ_ä_åiM_çÑ_çiMÒ_ä_åiN_çÑ_çiNÒ_ä_åiO_çÑ_çiOÒ_ä_åiP_çÑ_çiPÒ_ä_åiQ_çÑ_çiQÒ_ä_åiR_çÑ_çiRÒ_ä_åiS_çÑ_çiSÒ_ä_åiT_çÑ_çiTÒ_ä_åiU_çÑ_çiUÒ_ä_åiV_çÑ_çiVÒ_ä_åiW_çÑ_çiWÒ_ä_åiX_çÑ_çiXÒ_ä_åiY_çÑ_çiYÒ_ä_åiZ_çÑ_çiZÒ_ä_åi[_çÑ_çi[Ò_ä_åi\_çÑ_çi\Ò_ä_åi]_çÑ_çi]Ò_ä_åi^_çÑ_çi^Ò_ä_åi__çÑ_çi_Ò_ä_åi`_çÑ_çi`Ò_ä_åia_çÑ_çiaÒ_ä_åib_çÑ_çibÒ_ä_åic_çÑ_çicÒ_ä_åid_çÑ_çidÒ_ä_åie_çÑ_çieÒ_ä_åif_çÑ_çifÒ_ä_åig_çÑ_çigÒ_ä_åih_çÑ_çihÒ_ä_åii_çÑ_çiiÒ_ä_åij_çÑ_çijÒ_ä_åik_çÑ_çikÒ_ä_åil_çÑ_çilÒ_ä_åim_çÑ_çimÒ_ä_åin_çÑ_çinÒ_ä_åio_çÑ_çioÒ_ä_åip_çÑ_çipÒ_ä_åiq_çÑ_çiqÒ_ä_åir_çÑ_çirÒ_ä_åis_çÑ_çisÒ_ä_åit_çÑ_çitÒ_ä_åiu_çÑ_çiuÒ_ä_åiv_çÑ_çivÒ_ä_åiw_çÑ_çiwÒ_ä_åix_çÑ_çixÒ_ä_åiy_çÑ_çiyÒ_ä_åiz_çÑ_çizÒ_ä_åi{_çÑ_çi{Ò_ä_åi|_çÑ_çi|Ò_ä_åi}_çÑ_çi}Ò_ä_åi~_çÑ_çi~Ò_ä_åi_çÑ_çiÒ_ä_åi€_çÑ_çi€Ò_ä_åi_çÑ_çiÒ_ä_åi‚_çÑ_çi‚Ò_ä_åiƒ_çÑ_çiƒÒ_ä_åi„_çÑ_çi„Ò_ä_åi…_çÑ_çi…Ò_ä_åi†_çÑ_çi†Ò_ä_åi‡_çÑ_çi‡Ò_ä_åiˆ_çÑ_çiˆÒ_ä_åi‰_çÑ_çi‰Ò_ä_åiŠ_çÑ_çiŠÒ_ä_åi‹_çÑ_çi‹Ò_ä_åiŒ_çÑ_çiŒÒ_ä_åi_çÑ_çiÒ_ä_åiŽ_çÑ_çiŽÒ_ä_åi_çÑ_çiÒ_ä_åi_çÑ_çiÒ_ä_åi‘_çÑ_çi‘Ò_ä_åi’_çÑ_çi’Ò_ä_åi“_çÑ_çi“Ò_ä_åi”_çÑ_çi”Ò_ä_åi•_çÑ_çi•Ò_ä_åi–_çÑ_çi–Ò_ä_åi—_çÑ_çi—Ò_ä_åi˜_çÑ_çi˜Ò_ä_åi™_çÑ_çi™Ò_ä_åiš_çÑ_çišÒ_ä_åi›_çÑ_çi›Ò_ä_åiœ_çÑ_çiœÒ_ä_åi_çÑ_çiÒ_ä_åiž_çÑ_çižÒ_ä_åiŸ_çÑ_çiŸÒ_ä_åi _çÑ_çi Ò_ä_åi¡_çÑ_çi¡Ò_ä_åi¢_çÑ_çi¢Ò_ä_åi£_çÑ_çi£Ò_ä_åi¤_çÑ_çi¤Ò_ä_åi¥_çÑ_çi¥Ò_ä_åi¦_çÑ_çi¦Ò_ä_åi§_çÑ_çi§Ò_ä_åi¨_çÑ_çi¨Ò_ä_åi©_çÑ_çi©Ò_ä_åiª_çÑ_çiªÒ_ä_åi«_çÑ_çi«Ò_ä_åi¬_çÑ_çi¬Ò_ä_åi­_çÑ_çi­Ò_ä_åi®_çÑ_çi®Ò_ä_åi¯_çÑ_çi¯Ò_ä_åi°_çÑ_çi°Ò_ä_åi±_çÑ_çi±Ò_ä_åi²_çÑ_çi²Ò_ä_åi³_çÑ_çi³Ò_ä_åi´_çÑ_çi´Ò_ä_åiµ_çÑ_çiµÒ_ä_åi¶_çÑ_çi¶Ò_ä_åi·_çÑ_çi·Ò_ä_åi¸_çÑ_çi¸Ò_ä_åi¹_çÑ_çi¹Ò_ä_åiº_çÑ_çiºÒ_ä_åi»_çÑ_çi»Ò_ä_åi¼_çÑ_çi¼Ò_ä_åi½_çÑ_çi½Ò_ä_åi¾_çÑ_çi¾Ò_ä_åi¿_çÑ_çi¿Ò_ä_åiÀ_çÑ_çiÀÒ_ä_åiÁ_çÑ_çiÁÒ_ä_åiÂ_çÑ_çiÂÒ_ä_åiÃ_çÑ_çiÃÒ_ä_åiÄ_çÑ_çiÄÒ_ä_åiÅ_çÑ_çiÅÒ_ä_åiÆ_çÑ_çiÆÒ_ä_åiÇ_çÑ_çiÇÒ_ä_åiÈ_çÑ_çiÈÒ_ä_åiÉ_çÑ_çiÉÒ_ä_åiÊ_çÑ_çiÊÒ_ä_åiË_çÑ_çiËÒ_ä_åiÌ_çÑ_çiÌÒ_ä_åiÍ_çÑ_çiÍÒ_ä_åiÎ_çÑ_çiÎÒ_ä_åiÏ_çÑ_çiÏÒ_ä_åiÐ_çÑ_çiÐÒ_ä_åiÑ_çÑ_çiÑÒ_ä_åiÒ_çÑ_çiÒÒ_ä_åiÓ_çÑ_çiÓÒ_ä_åiÔ_çÑ_çiÔÒ_ä_åiÕ_çÑ_çiÕÒ_ä_åiÖ_çÑ_çiÖÒ_ä_åi×_çÑ_çi×Ò_ä_åiØ_çÑ_çiØÒ_ä_åiÙ_çÑ_çiÙÒ_ä_åiÚ_çÑ_çiÚÒ_ä_åiÛ_çÑ_çiÛÒ_ä_åiÜ_çÑ_çiÜÒ_ä_åiÝ_çÑ_çiÝÒ_ä_åiÞ_çÑ_çiÞÒ_ä_åiß_çÑ_çißÒ_ä_åià_çÑ_çiàÒ_ä_åiá_çÑ_çiáÒ_ä_åiâ_çÑ_çiâÒ_ä_åiã_çÑ_çiãÒ_ä_åiä_çÑ_çiäÒ_ä_åiå_çÑ_çiåÒ_ä_åiæ_çÑ_çiæÒ_ä_åiç_çÑ_çiçÒ_ä_åiè_çÑ_çièÒ_ä_åié_çÑ_çiéÒ_ä_åiê_çÑ_çiêÒ_ä_åië_çÑ_çiëÒ_ä_åiì_çÑ_çiìÒ_ä_åií_çÑ_çiíÒ_ä_åiî_çÑ_çiîÒ_ä_åiï_çÑ_çiïÒ_ä_åið_çÑ_çiðÒ_ä_åiñ_çÑ_çiñÒ_ä_åiò_çÑ_çiòÒ_ä_åió_çÑ_çióÒ_ä_åiô_çÑ_çiôÒ_ä_åiõ_çÑ_çiõÒ_ä_åiö_çÑ_çiöÒ_ä_åi÷_çÑ_çi÷Ò_ä_åiø_çÑ_çiøÒ_ä_åiù_çÑ_çiùÒ_ä_åiú_çÑ_çiúÒ_ä_åiû_çÑ_çiûÒ_ä_åiü_çÑ_çiüÒ_ä_åiý_çÑ_çiýÒ_ä_åiþ_çÑ_çiþÒ_ä_åiÿ_çÑ_çiÿÒ_ä_åj_çÑ_çjÒ_ä_åj_çÑ_çjÒ_ä_åj_çÑ_çjÒ_ä_åj_çÑ_çjÒ_ä_åj_çÑ_çjÒ_ä_åj_çÑ_çjÒ_ä_åj_çÑ_çjÒ_ä_åj_çÑ_çjÒ_ä_åj_çÑ_çjÒ_ä_åj _çÑ_çj Ò_ä_åj _çÑ_çj Ò_ä_åj _çÑ_çj Ò_ä_åj _çÑ_çj Ò_ä_åj _çÑ_çj Ò_ä_åj_çÑ_çjÒ_ä_åj_çÑ_çjÒ_ä_åj_çÑ_çjÒ_ä_åj_çÑ_çjÒ_ä_åj_çÑ_çjÒ_ä_åj_çÑ_çjÒ_ä_åj_çÑ_çjÒ_ä_åj_çÑ_çjÒ_ä_åj_çÑ_çjÒ_ä_åj_çÑ_çjÒ_ä_åj_çÑ_çjÒ_ä_åj_çÑ_çjÒ_ä_åj_çÑ_çjÒ_ä_åj_çÑ_çjÒ_ä_åj_çÑ_çjÒ_ä_åj_çÑ_çjÒ_ä_åj_çÑ_çjÒ_ä_åj_çÑ_çjÒ_ä_åj _çÑ_çj Ò_ä_åj!_çÑ_çj!Ò_ä_åj"_çÑ_çj"Ò_ä_åj#_çÑ_çj#Ò_ä_åj$_çÑ_çj$Ò_ä_åj%_çÑ_çj%Ò_ä_åj&_çÑ_çj&Ò_ä_åj'_çÑ_çj'Ò_ä_åj(_çÑ_çj(Ò_ä_åj)_çÑ_çj)Ò_ä_åj*_çÑ_çj*Ò_ä_åj+_çÑ_çj+Ò_ä_åj,_çÑ_çj,Ò_ä_åj-_çÑ_çj-Ò_ä_åj._çÑ_çj.Ò_ä_åj/_çÑ_çj/Ò_ä_åj0_çÑ_çj0Ò_ä_åj1_çÑ_çj1Ò_ä_åj2_çÑ_çj2Ò_ä_åj3_çÑ_çj3Ò_ä_åj4_çÑ_çj4Ò_ä_åj5_çÑ_çj5Ò_ä_åj6_çÑ_çj6Ò_ä_åj7_çÑ_çj7Ò_ä_åj8_çÑ_çj8Ò_ä_åj9_çÑ_çj9Ò_ä_åj:_çÑ_çj:Ò_ä_åj;_çÑ_çj;Ò_ä_åj<_çÑ_çj<Ò_ä_åj=_çÑ_çj=Ò_ä_åj>_çÑ_çj>Ò_ä_åj?_çÑ_çj?Ò_ä_åj@_çÑ_çj@Ò_ä_åjA_çÑ_çjAÒ_ä_åjB_çÑ_çjBÒ_ä_åjC_çÑ_çjCÒ_ä_åjD_çÑ_çjDÒ_ä_åjE_çÑ_çjEÒ_ä_åjF_çÑ_çjFÒ_ä_åjG_çÑ_çjGÒ_ä_åjH_çÑ_çjHÒ_ä_åjI_çÑ_çjIÒ_ä_åjJ_çÑ_çjJÒ_ä_åjK_çÑ_çjKÒ_ä_åjL_çÑ_çjLÒ_ä_åjM_çÑ_çjMÒ_ä_åjN_çÑ_çjNÒ_ä_åjO_çÑ_çjOÒ_ä_åjP_çÑ_çjPÒ_ä_åjQ_çÑ_çjQÒ_ä_åjR_çÑ_çjRÒ_ä_åjS_çÑ_çjSÒ_ä_åjT_çÑ_çjTÒ_ä_åjU_çÑ_çjUÒ_ä_åjV_çÑ_çjVÒ_ä_åjW_çÑ_çjWÒ_ä_åjX_çÑ_çjXÒ_ä_åjY_çÑ_çjYÒ_ä_åjZ_çÑ_çjZÒ_ä_åj[_çÑ_çj[Ò_ä_åj\_çÑ_çj\Ò_ä_åj]_çÑ_çj]Ò_ä_åj^_çÑ_çj^Ò_ä_åj__çÑ_çj_Ò_ä_åj`_çÑ_çj`Ò_ä_åja_çÑ_çjaÒ_ä_åjb_çÑ_çjbÒ_ä_åjc_çÑ_çjcÒ_ä_åjd_çÑ_çjdÒ_ä_åje_çÑ_çjeÒ_ä_åjf_çÑ_çjfÒ_ä_åjg_çÑ_çjgÒ_ä_åjh_çÑ_çjhÒ_ä_åji_çÑ_çjiÒ_ä_åjj_çÑ_çjjÒ_ä_åjk_çÑ_çjkÒ_ä_åjl_çÑ_çjlÒ_ä_åjm_çÑ_çjmÒ_ä_åjn_çÑ_çjnÒ_ä_åjo_çÑ_çjoÒ_ä_åjp_çÑ_çjpÒ_ä_åjq_çÑ_çjqÒ_ä_åjr_çÑ_çjrÒ_ä_åjs_çÑ_çjsÒ_ä_åjt_çÑ_çjtÒ_ä_åju_çÑ_çjuÒ_ä_åjv_çÑ_çjvÒ_ä_åjw_çÑ_çjwÒ_ä_åjx_çÑ_çjxÒ_ä_åjy_çÑ_çjyÒ_ä_åjz_çÑ_çjzÒ_ä_åj{_çÑ_çj{Ò_ä_åj|_çÑ_çj|Ò_ä_åj}_çÑ_çj}Ò_ä_åj~_çÑ_çj~Ò_ä_åj_çÑ_çjÒ_ä_åj€_çÑ_çj€Ò_ä_åj_çÑ_çjÒ_ä_åj‚_çÑ_çj‚Ò_ä_åjƒ_çÑ_çjƒÒ_ä_åj„_çÑ_çj„Ò_ä_åj…_çÑ_çj…Ò_ä_åj†_çÑ_çj†Ò_ä_åj‡_çÑ_çj‡Ò_ä_åjˆ_çÑ_çjˆÒ_ä_åj‰_çÑ_çj‰Ò_ä_åjŠ_çÑ_çjŠÒ_ä_åj‹_çÑ_çj‹Ò_ä_åjŒ_çÑ_çjŒÒ_ä_åj_çÑ_çjÒ_ä_åjŽ_çÑ_çjŽÒ_ä_åj_çÑ_çjÒ_ä_åj_çÑ_çjÒ_ä_åj‘_çÑ_çj‘Ò_ä_åj’_çÑ_çj’Ò_ä_åj“_çÑ_çj“Ò_ä_åj”_çÑ_çj”Ò_ä_åj•_çÑ_çj•Ò_ä_åj–_çÑ_çj–Ò_ä_åj—_çÑ_çj—Ò_ä_åj˜_çÑ_çj˜Ò_ä_åj™_çÑ_çj™Ò_ä_åjš_çÑ_çjšÒ_ä_åj›_çÑ_çj›Ò_ä_åjœ_çÑ_çjœÒ_ä_åj_çÑ_çjÒ_ä_åjž_çÑ_çjžÒ_ä_åjŸ_çÑ_çjŸÒ_ä_åj _çÑ_çj Ò_ä_åj¡_çÑ_çj¡Ò_ä_åj¢_çÑ_çj¢Ò_ä_åj£_çÑ_çj£Ò_ä_åj¤_çÑ_çj¤Ò_ä_åj¥_çÑ_çj¥Ò_ä_åj¦_çÑ_çj¦Ò_ä_åj§_çÑ_çj§Ò_ä_åj¨_çÑ_çj¨Ò_ä_åj©_çÑ_çj©Ò_ä_åjª_çÑ_çjªÒ_ä_åj«_çÑ_çj«Ò_ä_åj¬_çÑ_çj¬Ò_ä_åj­_çÑ_çj­Ò_ä_åj®_çÑ_çj®Ò_ä_åj¯_çÑ_çj¯Ò_ä_åj°_çÑ_çj°Ò_ä_åj±_çÑ_çj±Ò_ä_åj²_çÑ_çj²Ò_ä_åj³_çÑ_çj³Ò_ä_åj´_çÑ_çj´Ò_ä_åjµ_çÑ_çjµÒ_ä_åj¶_çÑ_çj¶Ò_ä_åj·_çÑ_çj·Ò_ä_åj¸_çÑ_çj¸Ò_ä_åj¹_çÑ_çj¹Ò_ä_åjº_çÑ_çjºÒ_ä_åj»_çÑ_çj»Ò_ä_åj¼_çÑ_çj¼Ò_ä_åj½_çÑ_çj½Ò_ä_åj¾_çÑ_çj¾Ò_ä_åj¿_çÑ_çj¿Ò_ä_åjÀ_çÑ_çjÀÒ_ä_åjÁ_çÑ_çjÁÒ_ä_åjÂ_çÑ_çjÂÒ_ä_åjÃ_çÑ_çjÃÒ_ä_åjÄ_çÑ_çjÄÒ_ä_åjÅ_çÑ_çjÅÒ_ä_åjÆ_çÑ_çjÆÒ_ä_åjÇ_çÑ_çjÇÒ_ä_åjÈ_çÑ_çjÈÒ_ä_åjÉ_çÑ_çjÉÒ_ä_åjÊ_çÑ_çjÊÒ_ä_åjË_çÑ_çjËÒ_ä_åjÌ_çÑ_çjÌÒ_ä_åjÍ_çÑ_çjÍÒ_ä_åjÎ_çÑ_çjÎÒ_ä_åjÏ_çÑ_çjÏÒ_ä_åjÐ_çÑ_çjÐÒ_ä_åjÑ_çÑ_çjÑÒ_ä_åjÒ_çÑ_çjÒÒ_ä_åjÓ_çÑ_çjÓÒ_ä_åjÔ_çÑ_çjÔÒ_ä_åjÕ_çÑ_çjÕÒ_ä_åjÖ_çÑ_çjÖÒ_ä_åj×_çÑ_çj×Ò_ä_åjØ_çÑ_çjØÒ_ä_åjÙ_çÑ_çjÙÒ_ä_åjÚ_çÑ_çjÚÒ_ä_åjÛ_çÑ_çjÛÒ_ä_åjÜ_çÑ_çjÜÒ_ä_åjÝ_çÑ_çjÝÒ_ä_åjÞ_çÑ_çjÞÒ_ä_åjß_çÑ_çjßÒ_ä_åjà_çÑ_çjàÒ_ä_åjá_çÑ_çjáÒ_ä_åjâ_çÑ_çjâÒ_ä_åjã_çÑ_çjãÒ_ä_åjä_çÑ_çjäÒ_ä_åjå_çÑ_çjåÒ_ä_åjæ_çÑ_çjæÒ_ä_åjç_çÑ_çjçÒ_ä_åjè_çÑ_çjèÒ_ä_åjé_çÑ_çjéÒ_ä_åjê_çÑ_çjêÒ_ä_åjë_çÑ_çjëÒ_ä_åjì_çÑ_çjìÒ_ä_åjí_çÑ_çjíÒ_ä_åjî_çÑ_çjîÒ_ä_åjï_çÑ_çjïÒ_ä_åjð_çÑ_çjðÒ_ä_åjñ_çÑ_çjñÒ_ä_åjò_çÑ_çjòÒ_ä_åjó_çÑ_çjóÒ_ä_åjô_çÑ_çjôÒ_ä_åjõ_çÑ_çjõÒ_ä_åjö_çÑ_çjöÒ_ä_åj÷_çÑ_çj÷Ò_ä_åjø_çÑ_çjøÒ_ä_åjù_çÑ_çjùÒ_ä_åjú_çÑ_çjúÒ_ä_åjû_çÑ_çjûÒ_ä_åjü_çÑ_çjüÒ_ä_åjý_çÑ_çjýÒ_ä_åjþ_çÑ_çjþÒ_ä_åjÿ_çÑ_çjÿÒ_ä_åk_çÑ_çkÒ_ä_åk_çÑ_çkÒ_ä_åk_çÑ_çkÒ_ä_åk_çÑ_çkÒ_ä_åk_çÑ_çkÒ_ä_åk_çÑ_çkÒ_ä_åk_çÑ_çkÒ_ä_åk_çÑ_çkÒ_ä_åk_çÑ_çkÒ_ä_åk _çÑ_çk Ò_ä_åk _çÑ_çk Ò_ä_åk _çÑ_çk Ò_ä_åk _çÑ_çk Ò_ä_åk _çÑ_çk Ò_ä_åk_çÑ_çkÒ_ä_åk_çÑ_çkÒ_ä_åk_çÑ_çkÒ_ä_åk_çÑ_çkÒ_ä_åk_çÑ_çkÒ_ä_åk_çÑ_çkÒ_ä_åk_çÑ_çkÒ_ä_åk_çÑ_çkÒ_ä_åk_çÑ_çkÒ_ä_åk_çÑ_çkÒ_ä_åk_çÑ_çkÒ_ä_åk_çÑ_çkÒ_ä_åk_çÑ_çkÒ_ä_åk_çÑ_çkÒ_ä_åk_çÑ_çkÒ_ä_åk_çÑ_çkÒ_ä_åk_çÑ_çkÒ_ä_åk_çÑ_çkÒ_ä_åk _çÑ_çk Ò_ä_åk!_çÑ_çk!Ò_ä_åk"_çÑ_çk"Ò_ä_åk#_çÑ_çk#Ò_ä_åk$_çÑ_çk$Ò_ä_åk%_çÑ_çk%Ò_ä_åk&_çÑ_çk&Ò_ä_åk'_çÑ_çk'Ò_ä_åk(_çÑ_çk(Ò_ä_åk)_çÑ_çk)Ò_ä_åk*_çÑ_çk*Ò_ä_åk+_çÑ_çk+Ò_ä_åk,_çÑ_çk,Ò_ä_åk-_çÑ_çk-Ò_ä_åk._çÑ_çk.Ò_ä_åk/_çÑ_çk/Ò_ä_åk0_çÑ_çk0Ò_ä_åk1_çÑ_çk1Ò_ä_åk2_çÑ_çk2Ò_ä_åk3_çÑ_çk3Ò_ä_åk4_çÑ_çk4Ò_ä_åk5_çÑ_çk5Ò_ä_åk6_çÑ_çk6Ò_ä_åk7_çÑ_çk7Ò_ä_åk8_çÑ_çk8Ò_ä_åk9_çÑ_çk9Ò_ä_åk:_çÑ_çk:Ò_ä_åk;_çÑ_çk;Ò_ä_åk<_çÑ_çk<Ò_ä_åk=_çÑ_çk=Ò_ä_åk>_çÑ_çk>Ò_ä_åk?_çÑ_çk?Ò_ä_åk@_çÑ_çk@Ò_ä_åkA_çÑ_çkAÒ_ä_åkB_çÑ_çkBÒ_ä_åkC_çÑ_çkCÒ_ä_åkD_çÑ_çkDÒ_ä_åkE_çÑ_çkEÒ_ä_åkF_çÑ_çkFÒ_ä_åkG_çÑ_çkGÒ_ä_åkH_çÑ_çkHÒ_ä_åkI_çÑ_çkIÒ_ä_åkJ_çÑ_çkJÒ_ä_åkK_çÑ_çkKÒ_ä_åkL_çÑ_çkLÒ_ä_åkM_çÑ_çkMÒ_ä_åkN_çÑ_çkNÒ_ä_åkO_çÑ_çkOÒ_ä_åkP_çÑ_çkPÒ_ä_åkQ_çÑ_çkQÒ_ä_åkR_çÑ_çkRÒ_ä_åkS_çÑ_çkSÒ_ä_åkT_çÑ_çkTÒ_ä_åkU_çÑ_çkUÒ_ä_åkV_çÑ_çkVÒ_ä_åkW_çÑ_çkWÒ_ä_åkX_çÑ_çkXÒ_ä_åkY_çÑ_çkYÒ_ä_åkZ_çÑ_çkZÒ_ä_åk[_çÑ_çk[Ò_ä_åk\_çÑ_çk\Ò_ä_åk]_çÑ_çk]Ò_ä_åk^_çÑ_çk^Ò_ä_åk__çÑ_çk_Ò_ä_åk`_çÑ_çk`Ò_ä_åka_çÑ_çkaÒ_ä_åkb_çÑ_çkbÒ_ä_åkc_çÑ_çkcÒ_ä_åkd_çÑ_çkdÒ_ä_åke_çÑ_çkeÒ_ä_åkf_çÑ_çkfÒ_ä_åkg_çÑ_çkgÒ_ä_åkh_çÑ_çkhÒ_ä_åki_çÑ_çkiÒ_ä_åkj_çÑ_çkjÒ_ä_åkk_çÑ_çkkÒ_ä_åkl_çÑ_çklÒ_ä_åkm_çÑ_çkmÒ_ä_åkn_çÑ_çknÒ_ä_åko_çÑ_çkoÒ_ä_åkp_çÑ_çkpÒ_ä_åkq_çÑ_çkqÒ_ä_åkr_çÑ_çkrÒ_ä_åks_çÑ_çksÒ_ä_åkt_çÑ_çktÒ_ä_åku_çÑ_çkuÒ_ä_åkv_çÑ_çkvÒ_ä_åkw_çÑ_çkwÒ_ä_åkx_çÑ_çkxÒ_ä_åky_çÑ_çkyÒ_ä_åkz_çÑ_çkzÒ_ä_åk{_çÑ_çk{Ò_ä_åk|_çÑ_çk|Ò_ä_åk}_çÑ_çk}Ò_ä_åk~_çÑ_çk~Ò_ä_åk_çÑ_çkÒ_ä_åk€_çÑ_çk€Ò_ä_åk_çÑ_çkÒ_ä_åk‚_çÑ_çk‚Ò_ä_åkƒ_çÑ_çkƒÒ_ä_åk„_çÑ_çk„Ò_ä_åk…_çÑ_çk…Ò_ä_åk†_çÑ_çk†Ò_ä_åk‡_çÑ_çk‡Ò_ä_åkˆ_çÑ_çkˆÒ_ä_åk‰_çÑ_çk‰Ò_ä_åkŠ_çÑ_çkŠÒ_ä_åk‹_çÑ_çk‹Ò_ä_åkŒ_çÑ_çkŒÒ_ä_åk_çÑ_çkÒ_ä_åkŽ_çÑ_çkŽÒ_ä_åk_çÑ_çkÒ_ä_åk_çÑ_çkÒ_ä_åk‘_çÑ_çk‘Ò_ä_åk’_çÑ_çk’Ò_ä_åk“_çÑ_çk“Ò_ä_åk”_çÑ_çk”Ò_ä_åk•_çÑ_çk•Ò_ä_åk–_çÑ_çk–Ò_ä_åk—_çÑ_çk—Ò_ä_åk˜_çÑ_çk˜Ò_ä_åk™_çÑ_çk™Ò_ä_åkš_çÑ_çkšÒ_ä_åk›_çÑ_çk›Ò_ä_åkœ_çÑ_çkœÒ_ä_åk_çÑ_çkÒ_ä_åkž_çÑ_çkžÒ_ä_åkŸ_çÑ_çkŸÒ_ä_åk _çÑ_çk Ò_ä_åk¡_çÑ_çk¡Ò_ä_åk¢_çÑ_çk¢Ò_ä_åk£_çÑ_çk£Ò_ä_åk¤_çÑ_çk¤Ò_ä_åk¥_çÑ_çk¥Ò_ä_åk¦_çÑ_çk¦Ò_ä_åk§_çÑ_çk§Ò_ä_åk¨_çÑ_çk¨Ò_ä_åk©_çÑ_çk©Ò_ä_åkª_çÑ_çkªÒ_ä_åk«_çÑ_çk«Ò_ä_åk¬_çÑ_çk¬Ò_ä_åk­_çÑ_çk­Ò_ä_åk®_çÑ_çk®Ò_ä_åk¯_çÑ_çk¯Ò_ä_åk°_çÑ_çk°Ò_ä_åk±_çÑ_çk±Ò_ä_åk²_çÑ_çk²Ò_ä_åk³_çÑ_çk³Ò_ä_åk´_çÑ_çk´Ò_ä_åkµ_çÑ_çkµÒ_ä_åk¶_çÑ_çk¶Ò_ä_åk·_çÑ_çk·Ò_ä_åk¸_çÑ_çk¸Ò_ä_åk¹_çÑ_çk¹Ò_ä_åkº_çÑ_çkºÒ_ä_åk»_çÑ_çk»Ò_ä_åk¼_çÑ_çk¼Ò_ä_åk½_çÑ_çk½Ò_ä_åk¾_çÑ_çk¾Ò_ä_åk¿_çÑ_çk¿Ò_ä_åkÀ_çÑ_çkÀÒ_ä_åkÁ_çÑ_çkÁÒ_ä_åkÂ_çÑ_çkÂÒ_ä_åkÃ_çÑ_çkÃÒ_ä_åkÄ_çÑ_çkÄÒ_ä_åkÅ_çÑ_çkÅÒ_ä_åkÆ_çÑ_çkÆÒ_ä_åkÇ_çÑ_çkÇÒ_ä_åkÈ_çÑ_çkÈÒ_ä_åkÉ_çÑ_çkÉÒ_ä_åkÊ_çÑ_çkÊÒ_ä_åkË_çÑ_çkËÒ_ä_åkÌ_çÑ_çkÌÒ_ä_åkÍ_çÑ_çkÍÒ_ä_åkÎ_çÑ_çkÎÒ_ä_åkÏ_çÑ_çkÏÒ_ä_åkÐ_çÑ_çkÐÒ_ä_åkÑ_çÑ_çkÑÒ_ä_åkÒ_çÑ_çkÒÒ_ä_åkÓ_çÑ_çkÓÒ_ä_åkÔ_çÑ_çkÔÒ_ä_åkÕ_çÑ_çkÕÒ_ä_åkÖ_çÑ_çkÖÒ_ä_åk×_çÑ_çk×Ò_ä_åkØ_çÑ_çkØÒ_ä_åkÙ_çÑ_çkÙÒ_ä_åkÚ_çÑ_çkÚÒ_ä_åkÛ_çÑ_çkÛÒ_ä_åkÜ_çÑ_çkÜÒ_ä_åkÝ_çÑ_çkÝÒ_ä_åkÞ_çÑ_çkÞÒ_ä_åkß_çÑ_çkßÒ_ä_åkà_çÑ_çkàÒ_ä_åká_çÑ_çkáÒ_ä_åkâ_çÑ_çkâÒ_ä_åkã_çÑ_çkãÒ_ä_åkä_çÑ_çkäÒ_ä_åkå_çÑ_çkåÒ_ä_åkæ_çÑ_çkæÒ_ä_åkç_çÑ_çkçÒ_ä_åkè_çÑ_çkèÒ_ä_åké_çÑ_çkéÒ_ä_åkê_çÑ_çkêÒ_ä_åkë_çÑ_çkëÒ_ä_åkì_çÑ_çkìÒ_ä_åkí_çÑ_çkíÒ_ä_åkî_çÑ_çkîÒ_ä_åkï_çÑ_çkïÒ_ä_åkð_çÑ_çkðÒ_ä_åkñ_çÑ_çkñÒ_ä_åkò_çÑ_çkòÒ_ä_åkó_çÑ_çkóÒ_ä_åkô_çÑ_çkôÒ_ä_åkõ_çÑ_çkõÒ_ä_åkö_çÑ_çköÒ_ä_åk÷_çÑ_çk÷Ò_ä_åkø_çÑ_çkøÒ_ä_åkù_çÑ_çkùÒ_ä_åkú_çÑ_çkúÒ_ä_åkû_çÑ_çkûÒ_ä_åkü_çÑ_çküÒ_ä_åký_çÑ_çkýÒ_ä_åkþ_çÑ_çkþÒ_ä_åkÿ_çÑ_çkÿÒ_ä_ål_çÑ_çlÒ_ä_ål_çÑ_çlÒ_ä_ål_çÑ_çlÒ_ä_ål_çÑ_çlÒ_ä_ål_çÑ_çlÒ_ä_ål_çÑ_çlÒ_ä_ål_çÑ_çlÒ_ä_ål_çÑ_çlÒ_ä_ål_çÑ_çlÒ_ä_ål _çÑ_çl Ò_ä_ål _çÑ_çl Ò_ä_ål _çÑ_çl Ò_ä_ål _çÑ_çl Ò_ä_ål _çÑ_çl Ò_ä_ål_çÑ_çlÒ_ä_ål_çÑ_çlÒ_ä_ål_çÑ_çlÒ_ä_ål_çÑ_çlÒ_ä_ål_çÑ_çlÒ_ä_ål_çÑ_çlÒ_ä_ål_çÑ_çlÒ_ä_ål_çÑ_çlÒ_ä_ål_çÑ_çlÒ_ä_ål_çÑ_çlÒ_ä_ål_çÑ_çlÒ_ä_ål_çÑ_çlÒ_ä_ål_çÑ_çlÒ_ä_ål_çÑ_çlÒ_ä_ål_çÑ_çlÒ_ä_ål_çÑ_çlÒ_ä_ål_çÑ_çlÒ_ä_ål_çÑ_çlÒ_ä_ål _çÑ_çl Ò_ä_ål!_çÑ_çl!Ò_ä_ål"_çÑ_çl"Ò_ä_ål#_çÑ_çl#Ò_ä_ål$_çÑ_çl$Ò_ä_ål%_çÑ_çl%Ò_ä_ål&_çÑ_çl&Ò_ä_ål'_çÑ_çl'Ò_ä_ål(_çÑ_çl(Ò_ä_ål)_çÑ_çl)Ò_ä_ål*_çÑ_çl*Ò_ä_ål+_çÑ_çl+Ò_ä_ål,_çÑ_çl,Ò_ä_ål-_çÑ_çl-Ò_ä_ål._çÑ_çl.Ò_ä_ål/_çÑ_çl/Ò_ä_ål0_çÑ_çl0Ò_ä_ål1_çÑ_çl1Ò_ä_ål2_çÑ_çl2Ò_ä_ål3_çÑ_çl3Ò_ä_ål4_çÑ_çl4Ò_ä_ål5_çÑ_çl5Ò_ä_ål6_çÑ_çl6Ò_ä_ål7_çÑ_çl7Ò_ä_ål8_çÑ_çl8Ò_ä_ål9_çÑ_çl9Ò_ä_ål:_çÑ_çl:Ò_ä_ål;_çÑ_çl;Ò_ä_ål<_çÑ_çl<Ò_ä_ål=_çÑ_çl=Ò_ä_ål>_çÑ_çl>Ò_ä_ål?_çÑ_çl?Ò_ä_ål@_çÑ_çl@Ò_ä_ålA_çÑ_çlAÒ_ä_ålB_çÑ_çlBÒ_ä_ålC_çÑ_çlCÒ_ä_ålD_çÑ_çlDÒ_ä_ålE_çÑ_çlEÒ_ä_ålF_çÑ_çlFÒ_ä_ålG_çÑ_çlGÒ_ä_ålH_çÑ_çlHÒ_ä_ålI_çÑ_çlIÒ_ä_ålJ_çÑ_çlJÒ_ä_ålK_çÑ_çlKÒ_ä_ålL_çÑ_çlLÒ_ä_ålM_çÑ_çlMÒ_ä_ålN_çÑ_çlNÒ_ä_ålO_çÑ_çlOÒ_ä_ålP_çÑ_çlPÒ_ä_ålQ_çÑ_çlQÒ_ä_ålR_çÑ_çlRÒ_ä_ålS_çÑ_çlSÒ_ä_ålT_çÑ_çlTÒ_ä_ålU_çÑ_çlUÒ_ä_ålV_çÑ_çlVÒ_ä_ålW_çÑ_çlWÒ_ä_ålX_çÑ_çlXÒ_ä_ålY_çÑ_çlYÒ_ä_ålZ_çÑ_çlZÒ_ä_ål[_çÑ_çl[Ò_ä_ål\_çÑ_çl\Ò_ä_ål]_çÑ_çl]Ò_ä_ål^_çÑ_çl^Ò_ä_ål__çÑ_çl_Ò_ä_ål`_çÑ_çl`Ò_ä_åla_çÑ_çlaÒ_ä_ålb_çÑ_çlbÒ_ä_ålc_çÑ_çlcÒ_ä_åld_çÑ_çldÒ_ä_åle_çÑ_çleÒ_ä_ålf_çÑ_çlfÒ_ä_ålg_çÑ_çlgÒ_ä_ålh_çÑ_çlhÒ_ä_åli_çÑ_çliÒ_ä_ålj_çÑ_çljÒ_ä_ålk_çÑ_çlkÒ_ä_åll_çÑ_çllÒ_ä_ålm_çÑ_çlmÒ_ä_åln_çÑ_çlnÒ_ä_ålo_çÑ_çloÒ_ä_ålp_çÑ_çlpÒ_ä_ålq_çÑ_çlqÒ_ä_ålr_çÑ_çlrÒ_ä_åls_çÑ_çlsÒ_ä_ålt_çÑ_çltÒ_ä_ålu_çÑ_çluÒ_ä_ålv_çÑ_çlvÒ_ä_ålw_çÑ_çlwÒ_ä_ålx_çÑ_çlxÒ_ä_åly_çÑ_çlyÒ_ä_ålz_çÑ_çlzÒ_ä_ål{_çÑ_çl{Ò_ä_ål|_çÑ_çl|Ò_ä_ål}_çÑ_çl}Ò_ä_ål~_çÑ_çl~Ò_ä_ål_çÑ_çlÒ_ä_ål€_çÑ_çl€Ò_ä_ål_çÑ_çlÒ_ä_ål‚_çÑ_çl‚Ò_ä_ålƒ_çÑ_çlƒÒ_ä_ål„_çÑ_çl„Ò_ä_ål…_çÑ_çl…Ò_ä_ål†_çÑ_çl†Ò_ä_ål‡_çÑ_çl‡Ò_ä_ålˆ_çÑ_çlˆÒ_ä_ål‰_çÑ_çl‰Ò_ä_ålŠ_çÑ_çlŠÒ_ä_ål‹_çÑ_çl‹Ò_ä_ålŒ_çÑ_çlŒÒ_ä_ål_çÑ_çlÒ_ä_ålŽ_çÑ_çlŽÒ_ä_ål_çÑ_çlÒ_ä_ål_çÑ_çlÒ_ä_ål‘_çÑ_çl‘Ò_ä_ål’_çÑ_çl’Ò_ä_ål“_çÑ_çl“Ò_ä_ål”_çÑ_çl”Ò_ä_ål•_çÑ_çl•Ò_ä_ål–_çÑ_çl–Ò_ä_ål—_çÑ_çl—Ò_ä_ål˜_çÑ_çl˜Ò_ä_ål™_çÑ_çl™Ò_ä_ålš_çÑ_çlšÒ_ä_ål›_çÑ_çl›Ò_ä_ålœ_çÑ_çlœÒ_ä_ål_çÑ_çlÒ_ä_ålž_çÑ_çlžÒ_ä_ålŸ_çÑ_çlŸÒ_ä_ål _çÑ_çl Ò_ä_ål¡_çÑ_çl¡Ò_ä_ål¢_çÑ_çl¢Ò_ä_ål£_çÑ_çl£Ò_ä_ål¤_çÑ_çl¤Ò_ä_ål¥_çÑ_çl¥Ò_ä_ål¦_çÑ_çl¦Ò_ä_ål§_çÑ_çl§Ò_ä_ål¨_çÑ_çl¨Ò_ä_ål©_çÑ_çl©Ò_ä_ålª_çÑ_çlªÒ_ä_ål«_çÑ_çl«Ò_ä_ål¬_çÑ_çl¬Ò_ä_ål­_çÑ_çl­Ò_ä_ål®_çÑ_çl®Ò_ä_ål¯_çÑ_çl¯Ò_ä_ål°_çÑ_çl°Ò_ä_ål±_çÑ_çl±Ò_ä_ål²_çÑ_çl²Ò_ä_ål³_çÑ_çl³Ò_ä_ål´_çÑ_çl´Ò_ä_ålµ_çÑ_çlµÒ_ä_ål¶_çÑ_çl¶Ò_ä_ål·_çÑ_çl·Ò_ä_ål¸_çÑ_çl¸Ò_ä_ål¹_çÑ_çl¹Ò_ä_ålº_çÑ_çlºÒ_ä_ål»_çÑ_çl»Ò_ä_ål¼_çÑ_çl¼Ò_ä_ål½_çÑ_çl½Ò_ä_ål¾_çÑ_çl¾Ò_ä_ål¿_çÑ_çl¿Ò_ä_ålÀ_çÑ_çlÀÒ_ä_ålÁ_çÑ_çlÁÒ_ä_ålÂ_çÑ_çlÂÒ_ä_ålÃ_çÑ_çlÃÒ_ä_ålÄ_çÑ_çlÄÒ_ä_ålÅ_çÑ_çlÅÒ_ä_ålÆ_çÑ_çlÆÒ_ä_ålÇ_çÑ_çlÇÒ_ä_ålÈ_çÑ_çlÈÒ_ä_ålÉ_çÑ_çlÉÒ_ä_ålÊ_çÑ_çlÊÒ_ä_ålË_çÑ_çlËÒ_ä_ålÌ_çÑ_çlÌÒ_ä_ålÍ_çÑ_çlÍÒ_ä_ålÎ_çÑ_çlÎÒ_ä_ålÏ_çÑ_çlÏÒ_ä_ålÐ_çÑ_çlÐÒ_ä_ålÑ_çÑ_çlÑÒ_ä_ålÒ_çÑ_çlÒÒ_ä_ålÓ_çÑ_çlÓÒ_ä_ålÔ_çÑ_çlÔÒ_ä_ålÕ_çÑ_çlÕÒ_ä_ålÖ_çÑ_çlÖÒ_ä_ål×_çÑ_çl×Ò_ä_ålØ_çÑ_çlØÒ_ä_ålÙ_çÑ_çlÙÒ_ä_ålÚ_çÑ_çlÚÒ_ä_ålÛ_çÑ_çlÛÒ_ä_ålÜ_çÑ_çlÜÒ_ä_ålÝ_çÑ_çlÝÒ_ä_ålÞ_çÑ_çlÞÒ_ä_ålß_çÑ_çlßÒ_ä_ålà_çÑ_çlàÒ_ä_ålá_çÑ_çláÒ_ä_ålâ_çÑ_çlâÒ_ä_ålã_çÑ_çlãÒ_ä_ålä_çÑ_çläÒ_ä_ålå_çÑ_çlåÒ_ä_ålæ_çÑ_çlæÒ_ä_ålç_çÑ_çlçÒ_ä_ålè_çÑ_çlèÒ_ä_ålé_çÑ_çléÒ_ä_ålê_çÑ_çlêÒ_ä_ålë_çÑ_çlëÒ_ä_ålì_çÑ_çlìÒ_ä_ålí_çÑ_çlíÒ_ä_ålî_çÑ_çlîÒ_ä_ålï_çÑ_çlïÒ_ä_ålð_çÑ_çlðÒ_ä_ålñ_çÑ_çlñÒ_ä_ålò_çÑ_çlòÒ_ä_åló_çÑ_çlóÒ_ä_ålô_çÑ_çlôÒ_ä_ålõ_çÑ_çlõÒ_ä_ålö_çÑ_çlöÒ_ä_ål÷_çÑ_çl÷Ò_ä_ålø_çÑ_çløÒ_ä_ålù_çÑ_çlùÒ_ä_ålú_çÑ_çlúÒ_ä_ålû_çÑ_çlûÒ_ä_ålü_çÑ_çlüÒ_ä_ålý_çÑ_çlýÒ_ä_ålþ_çÑ_çlþÒ_ä_ålÿ_çÑ_çlÿÒ_ä_åm_çÑ_çmÒ_ä_åm_çÑ_çmÒ_ä_åm_çÑ_çmÒ_ä_åm_çÑ_çmÒ_ä_åm_çÑ_çmÒ_ä_åm_çÑ_çmÒ_ä_åm_çÑ_çmÒ_ä_åm_çÑ_çmÒ_ä_åm_çÑ_çmÒ_ä_åm _çÑ_çm Ò_ä_åm _çÑ_çm Ò_ä_åm _çÑ_çm Ò_ä_åm _çÑ_çm Ò_ä_åm _çÑ_çm Ò_ä_åm_çÑ_çmÒ_ä_åm_çÑ_çmÒ_ä_åm_çÑ_çmÒ_ä_åm_çÑ_çmÒ_ä_åm_çÑ_çmÒ_ä_åm_çÑ_çmÒ_ä_åm_çÑ_çmÒ_ä_åm_çÑ_çmÒ_ä_åm_çÑ_çmÒ_ä_åm_çÑ_çmÒ_ä_åm_çÑ_çmÒ_ä_åm_çÑ_çmÒ_ä_åm_çÑ_çmÒ_ä_åm_çÑ_çmÒ_ä_åm_çÑ_çmÒ_ä_åm_çÑ_çmÒ_ä_åm_çÑ_çmÒ_ä_åm_çÑ_çmÒ_ä_åm _çÑ_çm Ò_ä_åm!_çÑ_çm!Ò_ä_åm"_çÑ_çm"Ò_ä_åm#_çÑ_çm#Ò_ä_åm$_çÑ_çm$Ò_ä_åm%_çÑ_çm%Ò_ä_åm&_çÑ_çm&Ò_ä_åm'_çÑ_çm'Ò_ä_åm(_çÑ_çm(Ò_ä_åm)_çÑ_çm)Ò_ä_åm*_çÑ_çm*Ò_ä_åm+_çÑ_çm+Ò_ä_åm,_çÑ_çm,Ò_ä_åm-_çÑ_çm-Ò_ä_åm._çÑ_çm.Ò_ä_åm/_çÑ_çm/Ò_ä_åm0_çÑ_çm0Ò_ä_åm1_çÑ_çm1Ò_ä_åm2_çÑ_çm2Ò_ä_åm3_çÑ_çm3Ò_ä_åm4_çÑ_çm4Ò_ä_åm5_çÑ_çm5Ò_ä_åm6_çÑ_çm6Ò_ä_åm7_çÑ_çm7Ò_ä_åm8_çÑ_çm8Ò_ä_åm9_çÑ_çm9Ò_ä_åm:_çÑ_çm:Ò_ä_åm;_çÑ_çm;Ò_ä_åm<_çÑ_çm<Ò_ä_åm=_çÑ_çm=Ò_ä_åm>_çÑ_çm>Ò_ä_åm?_çÑ_çm?Ò_ä_åm@_çÑ_çm@Ò_ä_åmA_çÑ_çmAÒ_ä_åmB_çÑ_çmBÒ_ä_åmC_çÑ_çmCÒ_ä_åmD_çÑ_çmDÒ_ä_åmE_çÑ_çmEÒ_ä_åmF_çÑ_çmFÒ_ä_åmG_çÑ_çmGÒ_ä_åmH_çÑ_çmHÒ_ä_åmI_çÑ_çmIÒ_ä_åmJ_çÑ_çmJÒ_ä_åmK_çÑ_çmKÒ_ä_åmL_çÑ_çmLÒ_ä_åmM_çÑ_çmMÒ_ä_åmN_çÑ_çmNÒ_ä_åmO_çÑ_çmOÒ_ä_åmP_çÑ_çmPÒ_ä_åmQ_çÑ_çmQÒ_ä_åmR_çÑ_çmRÒ_ä_åmS_çÑ_çmSÒ_ä_åmT_çÑ_çmTÒ_ä_åmU_çÑ_çmUÒ_ä_åmV_çÑ_çmVÒ_ä_åmW_çÑ_çmWÒ_ä_åmX_çÑ_çmXÒ_ä_åmY_çÑ_çmYÒ_ä_åmZ_çÑ_çmZÒ_ä_åm[_çÑ_çm[Ò_ä_åm\_çÑ_çm\Ò_ä_åm]_çÑ_çm]Ò_ä_åm^_çÑ_çm^Ò_ä_åm__çÑ_çm_Ò_ä_åm`_çÑ_çm`Ò_ä_åma_çÑ_çmaÒ_ä_åmb_çÑ_çmbÒ_ä_åmc_çÑ_çmcÒ_ä_åmd_çÑ_çmdÒ_ä_åme_çÑ_çmeÒ_ä_åmf_çÑ_çmfÒ_ä_åmg_çÑ_çmgÒ_ä_åmh_çÑ_çmhÒ_ä_åmi_çÑ_çmiÒ_ä_åmj_çÑ_çmjÒ_ä_åmk_çÑ_çmkÒ_ä_åml_çÑ_çmlÒ_ä_åmm_çÑ_çmmÒ_ä_åmn_çÑ_çmnÒ_ä_åmo_çÑ_çmoÒ_ä_åmp_çÑ_çmpÒ_ä_åmq_çÑ_çmqÒ_ä_åmr_çÑ_çmrÒ_ä_åms_çÑ_çmsÒ_ä_åmt_çÑ_çmtÒ_ä_åmu_çÑ_çmuÒ_ä_åmv_çÑ_çmvÒ_ä_åmw_çÑ_çmwÒ_ä_åmx_çÑ_çmxÒ_ä_åmy_çÑ_çmyÒ_ä_åmz_çÑ_çmzÒ_ä_åm{_çÑ_çm{Ò_ä_åm|_çÑ_çm|Ò_ä_åm}_çÑ_çm}Ò_ä_åm~_çÑ_çm~Ò_ä_åm_çÑ_çmÒ_ä_åm€_çÑ_çm€Ò_ä_åm_çÑ_çmÒ_ä_åm‚_çÑ_çm‚Ò_ä_åmƒ_çÑ_çmƒÒ_ä_åm„_çÑ_çm„Ò_ä_åm…_çÑ_çm…Ò_ä_åm†_çÑ_çm†Ò_ä_åm‡_çÑ_çm‡Ò_ä_åmˆ_çÑ_çmˆÒ_ä_åm‰_çÑ_çm‰Ò_ä_åmŠ_çÑ_çmŠÒ_ä_åm‹_çÑ_çm‹Ò_ä_åmŒ_çÑ_çmŒÒ_ä_åm_çÑ_çmÒ_ä_åmŽ_çÑ_çmŽÒ_ä_åm_çÑ_çmÒ_ä_åm_çÑ_çmÒ_ä_åm‘_çÑ_çm‘Ò_ä_åm’_çÑ_çm’Ò_ä_åm“_çÑ_çm“Ò_ä_åm”_çÑ_çm”Ò_ä_åm•_çÑ_çm•Ò_ä_åm–_çÑ_çm–Ò_ä_åm—_çÑ_çm—Ò_ä_åm˜_çÑ_çm˜Ò_ä_åm™_çÑ_çm™Ò_ä_åmš_çÑ_çmšÒ_ä_åm›_çÑ_çm›Ò_ä_åmœ_çÑ_çmœÒ_ä_åm_çÑ_çmÒ_ä_åmž_çÑ_çmžÒ_ä_åmŸ_çÑ_çmŸÒ_ä_åm _çÑ_çm Ò_ä_åm¡_çÑ_çm¡Ò_ä_åm¢_çÑ_çm¢Ò_ä_åm£_çÑ_çm£Ò_ä_åm¤_çÑ_çm¤Ò_ä_åm¥_çÑ_çm¥Ò_ä_åm¦_çÑ_çm¦Ò_ä_åm§_çÑ_çm§Ò_ä_åm¨_çÑ_çm¨Ò_ä_åm©_çÑ_çm©Ò_ä_åmª_çÑ_çmªÒ_ä_åm«_çÑ_çm«Ò_ä_åm¬_çÑ_çm¬Ò_ä_åm­_çÑ_çm­Ò_ä_åm®_çÑ_çm®Ò_ä_åm¯_çÑ_çm¯Ò_ä_åm°_çÑ_çm°Ò_ä_åm±_çÑ_çm±Ò_ä_åm²_çÑ_çm²Ò_ä_åm³_çÑ_çm³Ò_ä_åm´_çÑ_çm´Ò_ä_åmµ_çÑ_çmµÒ_ä_åm¶_çÑ_çm¶Ò_ä_åm·_çÑ_çm·Ò_ä_åm¸_çÑ_çm¸Ò_ä_åm¹_çÑ_çm¹Ò_ä_åmº_çÑ_çmºÒ_ä_åm»_çÑ_çm»Ò_ä_åm¼_çÑ_çm¼Ò_ä_åm½_çÑ_çm½Ò_ä_åm¾_çÑ_çm¾Ò_ä_åm¿_çÑ_çm¿Ò_ä_åmÀ_çÑ_çmÀÒ_ä_åmÁ_çÑ_çmÁÒ_ä_åmÂ_çÑ_çmÂÒ_ä_åmÃ_çÑ_çmÃÒ_ä_åmÄ_çÑ_çmÄÒ_ä_åmÅ_çÑ_çmÅÒ_ä_åmÆ_çÑ_çmÆÒ_ä_åmÇ_çÑ_çmÇÒ_ä_åmÈ_çÑ_çmÈÒ_ä_åmÉ_çÑ_çmÉÒ_ä_åmÊ_çÑ_çmÊÒ_ä_åmË_çÑ_çmËÒ_ä_åmÌ_çÑ_çmÌÒ_ä_åmÍ_çÑ_çmÍÒ_ä_åmÎ_çÑ_çmÎÒ_ä_åmÏ_çÑ_çmÏÒ_ä_åmÐ_çÑ_çmÐÒ_ä_åmÑ_çÑ_çmÑÒ_ä_åmÒ_çÑ_çmÒÒ_ä_åmÓ_çÑ_çmÓÒ_ä_åmÔ_çÑ_çmÔÒ_ä_åmÕ_çÑ_çmÕÒ_ä_åmÖ_çÑ_çmÖÒ_ä_åm×_çÑ_çm×Ò_ä_åmØ_çÑ_çmØÒ_ä_åmÙ_çÑ_çmÙÒ_ä_åmÚ_çÑ_çmÚÒ_ä_åmÛ_çÑ_çmÛÒ_ä_åmÜ_çÑ_çmÜÒ_ä_åmÝ_çÑ_çmÝÒ_ä_åmÞ_çÑ_çmÞÒ_ä_åmß_çÑ_çmßÒ_ä_åmà_çÑ_çmàÒ_ä_åmá_çÑ_çmáÒ_ä_åmâ_çÑ_çmâÒ_ä_åmã_çÑ_çmãÒ_ä_åmä_çÑ_çmäÒ_ä_åmå_çÑ_çmåÒ_ä_åmæ_çÑ_çmæÒ_ä_åmç_çÑ_çmçÒ_ä_åmè_çÑ_çmèÒ_ä_åmé_çÑ_çméÒ_ä_åmê_çÑ_çmêÒ_ä_åmë_çÑ_çmëÒ_ä_åmì_çÑ_çmìÒ_ä_åmí_çÑ_çmíÒ_ä_åmî_çÑ_çmîÒ_ä_åmï_çÑ_çmïÒ_ä_åmð_çÑ_çmðÒ_ä_åmñ_çÑ_çmñÒ_ä_åmò_çÑ_çmòÒ_ä_åmó_çÑ_çmóÒ_ä_åmô_çÑ_çmôÒ_ä_åmõ_çÑ_çmõÒ_ä_åmö_çÑ_çmöÒ_ä_åm÷_çÑ_çm÷Ò_ä_åmø_çÑ_çmøÒ_ä_åmù_çÑ_çmùÒ_ä_åmú_çÑ_çmúÒ_ä_åmû_çÑ_çmûÒ_ä_åmü_çÑ_çmüÒ_ä_åmý_çÑ_çmýÒ_ä_åmþ_çÑ_çmþÒ_ä_åmÿ_çÑ_çmÿÒ_ä_ån_çÑ_çnÒ_ä_ån_çÑ_çnÒ_ä_ån_çÑ_çnÒ_ä_ån_çÑ_çnÒ_ä_ån_çÑ_çnÒ_ä_ån_çÑ_çnÒ_ä_ån_çÑ_çnÒ_ä_ån_çÑ_çnÒ_ä_ån_çÑ_çnÒ_ä_ån _çÑ_çn Ò_ä_ån _çÑ_çn Ò_ä_ån _çÑ_çn Ò_ä_ån _çÑ_çn Ò_ä_ån _çÑ_çn Ò_ä_ån_çÑ_çnÒ_ä_ån_çÑ_çnÒ_ä_ån_çÑ_çnÒ_ä_ån_çÑ_çnÒ_ä_ån_çÑ_çnÒ_ä_ån_çÑ_çnÒ_ä_ån_çÑ_çnÒ_ä_ån_çÑ_çnÒ_ä_ån_çÑ_çnÒ_ä_ån_çÑ_çnÒ_ä_ån_çÑ_çnÒ_ä_ån_çÑ_çnÒ_ä_ån_çÑ_çnÒ_ä_ån_çÑ_çnÒ_ä_ån_çÑ_çnÒ_ä_ån_çÑ_çnÒ_ä_ån_çÑ_çnÒ_ä_ån_çÑ_çnÒ_ä_ån _çÑ_çn Ò_ä_ån!_çÑ_çn!Ò_ä_ån"_çÑ_çn"Ò_ä_ån#_çÑ_çn#Ò_ä_ån$_çÑ_çn$Ò_ä_ån%_çÑ_çn%Ò_ä_ån&_çÑ_çn&Ò_ä_ån'_çÑ_çn'Ò_ä_ån(_çÑ_çn(Ò_ä_ån)_çÑ_çn)Ò_ä_ån*_çÑ_çn*Ò_ä_ån+_çÑ_çn+Ò_ä_ån,_çÑ_çn,Ò_ä_ån-_çÑ_çn-Ò_ä_ån._çÑ_çn.Ò_ä_ån/_çÑ_çn/Ò_ä_ån0_çÑ_çn0Ò_ä_ån1_çÑ_çn1Ò_ä_ån2_çÑ_çn2Ò_ä_ån3_çÑ_çn3Ò_ä_ån4_çÑ_çn4Ò_ä_ån5_çÑ_çn5Ò_ä_ån6_çÑ_çn6Ò_ä_ån7_çÑ_çn7Ò_ä_ån8_çÑ_çn8Ò_ä_ån9_çÑ_çn9Ò_ä_ån:_çÑ_çn:Ò_ä_ån;_çÑ_çn;Ò_ä_ån<_çÑ_çn<Ò_ä_ån=_çÑ_çn=Ò_ä_ån>_çÑ_çn>Ò_ä_ån?_çÑ_çn?Ò_ä_ån@_çÑ_çn@Ò_ä_ånA_çÑ_çnAÒ_ä_ånB_çÑ_çnBÒ_ä_ånC_çÑ_çnCÒ_ä_ånD_çÑ_çnDÒ_ä_ånE_çÑ_çnEÒ_ä_ånF_çÑ_çnFÒ_ä_ånG_çÑ_çnGÒ_ä_ånH_çÑ_çnHÒ_ä_ånI_çÑ_çnIÒ_ä_ånJ_çÑ_çnJÒ_ä_ånK_çÑ_çnKÒ_ä_ånL_çÑ_çnLÒ_ä_ånM_çÑ_çnMÒ_ä_ånN_çÑ_çnNÒ_ä_ånO_çÑ_çnOÒ_ä_ånP_çÑ_çnPÒ_ä_ånQ_çÑ_çnQÒ_ä_ånR_çÑ_çnRÒ_ä_ånS_çÑ_çnSÒ_ä_ånT_çÑ_çnTÒ_ä_ånU_çÑ_çnUÒ_ä_ånV_çÑ_çnVÒ_ä_ånW_çÑ_çnWÒ_ä_ånX_çÑ_çnXÒ_ä_ånY_çÑ_çnYÒ_ä_ånZ_çÑ_çnZÒ_ä_ån[_çÑ_çn[Ò_ä_ån\_çÑ_çn\Ò_ä_ån]_çÑ_çn]Ò_ä_ån^_çÑ_çn^Ò_ä_ån__çÑ_çn_Ò_ä_ån`_çÑ_çn`Ò_ä_åna_çÑ_çnaÒ_ä_ånb_çÑ_çnbÒ_ä_ånc_çÑ_çncÒ_ä_ånd_çÑ_çndÒ_ä_åne_çÑ_çneÒ_ä_ånf_çÑ_çnfÒ_ä_ång_çÑ_çngÒ_ä_ånh_çÑ_çnhÒ_ä_åni_çÑ_çniÒ_ä_ånj_çÑ_çnjÒ_ä_ånk_çÑ_çnkÒ_ä_ånl_çÑ_çnlÒ_ä_ånm_çÑ_çnmÒ_ä_ånn_çÑ_çnnÒ_ä_åno_çÑ_çnoÒ_ä_ånp_çÑ_çnpÒ_ä_ånq_çÑ_çnqÒ_ä_ånr_çÑ_çnrÒ_ä_åns_çÑ_çnsÒ_ä_ånt_çÑ_çntÒ_ä_ånu_çÑ_çnuÒ_ä_ånv_çÑ_çnvÒ_ä_ånw_çÑ_çnwÒ_ä_ånx_çÑ_çnxÒ_ä_åny_çÑ_çnyÒ_ä_ånz_çÑ_çnzÒ_ä_ån{_çÑ_çn{Ò_ä_ån|_çÑ_çn|Ò_ä_ån}_çÑ_çn}Ò_ä_ån~_çÑ_çn~Ò_ä_ån_çÑ_çnÒ_ä_ån€_çÑ_çn€Ò_ä_ån_çÑ_çnÒ_ä_ån‚_çÑ_çn‚Ò_ä_ånƒ_çÑ_çnƒÒ_ä_ån„_çÑ_çn„Ò_ä_ån…_çÑ_çn…Ò_ä_ån†_çÑ_çn†Ò_ä_ån‡_çÑ_çn‡Ò_ä_ånˆ_çÑ_çnˆÒ_ä_ån‰_çÑ_çn‰Ò_ä_ånŠ_çÑ_çnŠÒ_ä_ån‹_çÑ_çn‹Ò_ä_ånŒ_çÑ_çnŒÒ_ä_ån_çÑ_çnÒ_ä_ånŽ_çÑ_çnŽÒ_ä_ån_çÑ_çnÒ_ä_ån_çÑ_çnÒ_ä_ån‘_çÑ_çn‘Ò_ä_ån’_çÑ_çn’Ò_ä_ån“_çÑ_çn“Ò_ä_ån”_çÑ_çn”Ò_ä_ån•_çÑ_çn•Ò_ä_ån–_çÑ_çn–Ò_ä_ån—_çÑ_çn—Ò_ä_ån˜_çÑ_çn˜Ò_ä_ån™_çÑ_çn™Ò_ä_ånš_çÑ_çnšÒ_ä_ån›_çÑ_çn›Ò_ä_ånœ_çÑ_çnœÒ_ä_ån_çÑ_çnÒ_ä_ånž_çÑ_çnžÒ_ä_ånŸ_çÑ_çnŸÒ_ä_ån _çÑ_çn Ò_ä_ån¡_çÑ_çn¡Ò_ä_ån¢_çÑ_çn¢Ò_ä_ån£_çÑ_çn£Ò_ä_ån¤_çÑ_çn¤Ò_ä_ån¥_çÑ_çn¥Ò_ä_ån¦_çÑ_çn¦Ò_ä_ån§_çÑ_çn§Ò_ä_ån¨_çÑ_çn¨Ò_ä_ån©_çÑ_çn©Ò_ä_ånª_çÑ_çnªÒ_ä_ån«_çÑ_çn«Ò_ä_ån¬_çÑ_çn¬Ò_ä_ån­_çÑ_çn­Ò_ä_ån®_çÑ_çn®Ò_ä_ån¯_çÑ_çn¯Ò_ä_ån°_çÑ_çn°Ò_ä_ån±_çÑ_çn±Ò_ä_ån²_çÑ_çn²Ò_ä_ån³_çÑ_çn³Ò_ä_ån´_çÑ_çn´Ò_ä_ånµ_çÑ_çnµÒ_ä_ån¶_çÑ_çn¶Ò_ä_ån·_çÑ_çn·Ò_ä_ån¸_çÑ_çn¸Ò_ä_ån¹_çÑ_çn¹Ò_ä_ånº_çÑ_çnºÒ_ä_ån»_çÑ_çn»Ò_ä_ån¼_çÑ_çn¼Ò_ä_ån½_çÑ_çn½Ò_ä_ån¾_çÑ_çn¾Ò_ä_ån¿_çÑ_çn¿Ò_ä_ånÀ_çÑ_çnÀÒ_ä_ånÁ_çÑ_çnÁÒ_ä_ånÂ_çÑ_çnÂÒ_ä_ånÃ_çÑ_çnÃÒ_ä_ånÄ_çÑ_çnÄÒ_ä_ånÅ_çÑ_çnÅÒ_ä_ånÆ_çÑ_çnÆÒ_ä_ånÇ_çÑ_çnÇÒ_ä_ånÈ_çÑ_çnÈÒ_ä_ånÉ_çÑ_çnÉÒ_ä_ånÊ_çÑ_çnÊÒ_ä_ånË_çÑ_çnËÒ_ä_ånÌ_çÑ_çnÌÒ_ä_ånÍ_çÑ_çnÍÒ_ä_ånÎ_çÑ_çnÎÒ_ä_ånÏ_çÑ_çnÏÒ_ä_ånÐ_çÑ_çnÐÒ_ä_ånÑ_çÑ_çnÑÒ_ä_ånÒ_çÑ_çnÒÒ_ä_ånÓ_çÑ_çnÓÒ_ä_ånÔ_çÑ_çnÔÒ_ä_ånÕ_çÑ_çnÕÒ_ä_ånÖ_çÑ_çnÖÒ_ä_ån×_çÑ_çn×Ò_ä_ånØ_çÑ_çnØÒ_ä_ånÙ_çÑ_çnÙÒ_ä_ånÚ_çÑ_çnÚÒ_ä_ånÛ_çÑ_çnÛÒ_ä_ånÜ_çÑ_çnÜÒ_ä_ånÝ_çÑ_çnÝÒ_ä_ånÞ_çÑ_çnÞÒ_ä_ånß_çÑ_çnßÒ_ä_ånà_çÑ_çnàÒ_ä_åná_çÑ_çnáÒ_ä_ånâ_çÑ_çnâÒ_ä_ånã_çÑ_çnãÒ_ä_ånä_çÑ_çnäÒ_ä_ånå_çÑ_çnåÒ_ä_ånæ_çÑ_çnæÒ_ä_ånç_çÑ_çnçÒ_ä_ånè_çÑ_çnèÒ_ä_åné_çÑ_çnéÒ_ä_ånê_çÑ_çnêÒ_ä_ånë_çÑ_çnëÒ_ä_ånì_çÑ_çnìÒ_ä_åní_çÑ_çníÒ_ä_ånî_çÑ_çnîÒ_ä_ånï_çÑ_çnïÒ_ä_ånð_çÑ_çnðÒ_ä_ånñ_çÑ_çnñÒ_ä_ånò_çÑ_çnòÒ_ä_ånó_çÑ_çnóÒ_ä_ånô_çÑ_çnôÒ_ä_ånõ_çÑ_çnõÒ_ä_ånö_çÑ_çnöÒ_ä_ån÷_çÑ_çn÷Ò_ä_ånø_çÑ_çnøÒ_ä_ånù_çÑ_çnùÒ_ä_ånú_çÑ_çnúÒ_ä_ånû_çÑ_çnûÒ_ä_ånü_çÑ_çnüÒ_ä_åný_çÑ_çnýÒ_ä_ånþ_çÑ_çnþÒ_ä_ånÿ_çÑ_çnÿÒ_ä_åo_çÑ_çoÒ_ä_åo_çÑ_çoÒ_ä_åo_çÑ_çoÒ_ä_åo_çÑ_çoÒ_ä_åo_çÑ_çoÒ_ä_åo_çÑ_çoÒ_ä_åo_çÑ_çoÒ_ä_åo_çÑ_çoÒ_ä_åo_çÑ_çoÒ_ä_åo _çÑ_ço Ò_ä_åo _çÑ_ço Ò_ä_åo _çÑ_ço Ò_ä_åo _çÑ_ço Ò_ä_åo _çÑ_ço Ò_ä_åo_çÑ_çoÒ_ä_åo_çÑ_çoÒ_ä_åo_çÑ_çoÒ_ä_åo_çÑ_çoÒ_ä_åo_çÑ_çoÒ_ä_åo_çÑ_çoÒ_ä_åo_çÑ_çoÒ_ä_åo_çÑ_çoÒ_ä_åo_çÑ_çoÒ_ä_åo_çÑ_çoÒ_ä_åo_çÑ_çoÒ_ä_åo_çÑ_çoÒ_ä_åo_çÑ_çoÒ_ä_åo_çÑ_çoÒ_ä_åo_çÑ_çoÒ_ä_åo_çÑ_çoÒ_ä_åo_çÑ_çoÒ_ä_åo_çÑ_çoÒ_ä_åo _çÑ_ço Ò_ä_åo!_çÑ_ço!Ò_ä_åo"_çÑ_ço"Ò_ä_åo#_çÑ_ço#Ò_ä_åo$_çÑ_ço$Ò_ä_åo%_çÑ_ço%Ò_ä_åo&_çÑ_ço&Ò_ä_åo'_çÑ_ço'Ò_ä_åo(_çÑ_ço(Ò_ä_åo)_çÑ_ço)Ò_ä_åo*_çÑ_ço*Ò_ä_åo+_çÑ_ço+Ò_ä_åo,_çÑ_ço,Ò_ä_åo-_çÑ_ço-Ò_ä_åo._çÑ_ço.Ò_ä_åo/_çÑ_ço/Ò_ä_åo0_çÑ_ço0Ò_ä_åo1_çÑ_ço1Ò_ä_åo2_çÑ_ço2Ò_ä_åo3_çÑ_ço3Ò_ä_åo4_çÑ_ço4Ò_ä_åo5_çÑ_ço5Ò_ä_åo6_çÑ_ço6Ò_ä_åo7_çÑ_ço7Ò_ä_åo8_çÑ_ço8Ò_ä_åo9_çÑ_ço9Ò_ä_åo:_çÑ_ço:Ò_ä_åo;_çÑ_ço;Ò_ä_åo<_çÑ_ço<Ò_ä_åo=_çÑ_ço=Ò_ä_åo>_çÑ_ço>Ò_ä_åo?_çÑ_ço?Ò_ä_åo@_çÑ_ço@Ò_ä_åoA_çÑ_çoAÒ_ä_åoB_çÑ_çoBÒ_ä_åoC_çÑ_çoCÒ_ä_åoD_çÑ_çoDÒ_ä_åoE_çÑ_çoEÒ_ä_åoF_çÑ_çoFÒ_ä_åoG_çÑ_çoGÒ_ä_åoH_çÑ_çoHÒ_ä_åoI_çÑ_çoIÒ_ä_åoJ_çÑ_çoJÒ_ä_åoK_çÑ_çoKÒ_ä_åoL_çÑ_çoLÒ_ä_åoM_çÑ_çoMÒ_ä_åoN_çÑ_çoNÒ_ä_åoO_çÑ_çoOÒ_ä_åoP_çÑ_çoPÒ_ä_åoQ_çÑ_çoQÒ_ä_åoR_çÑ_çoRÒ_ä_åoS_çÑ_çoSÒ_ä_åoT_çÑ_çoTÒ_ä_åoU_çÑ_çoUÒ_ä_åoV_çÑ_çoVÒ_ä_åoW_çÑ_çoWÒ_ä_åoX_çÑ_çoXÒ_ä_åoY_çÑ_çoYÒ_ä_åoZ_çÑ_çoZÒ_ä_åo[_çÑ_ço[Ò_ä_åo\_çÑ_ço\Ò_ä_åo]_çÑ_ço]Ò_ä_åo^_çÑ_ço^Ò_ä_åo__çÑ_ço_Ò_ä_åo`_çÑ_ço`Ò_ä_åoa_çÑ_çoaÒ_ä_åob_çÑ_çobÒ_ä_åoc_çÑ_çocÒ_ä_åod_çÑ_çodÒ_ä_åoe_çÑ_çoeÒ_ä_åof_çÑ_çofÒ_ä_åog_çÑ_çogÒ_ä_åoh_çÑ_çohÒ_ä_åoi_çÑ_çoiÒ_ä_åoj_çÑ_çojÒ_ä_åok_çÑ_çokÒ_ä_åol_çÑ_çolÒ_ä_åom_çÑ_çomÒ_ä_åon_çÑ_çonÒ_ä_åoo_çÑ_çooÒ_ä_åop_çÑ_çopÒ_ä_åoq_çÑ_çoqÒ_ä_åor_çÑ_çorÒ_ä_åos_çÑ_çosÒ_ä_åot_çÑ_çotÒ_ä_åou_çÑ_çouÒ_ä_åov_çÑ_çovÒ_ä_åow_çÑ_çowÒ_ä_åox_çÑ_çoxÒ_ä_åoy_çÑ_çoyÒ_ä_åoz_çÑ_çozÒ_ä_åo{_çÑ_ço{Ò_ä_åo|_çÑ_ço|Ò_ä_åo}_çÑ_ço}Ò_ä_åo~_çÑ_ço~Ò_ä_åo_çÑ_çoÒ_ä_åo€_çÑ_ço€Ò_ä_åo_çÑ_çoÒ_ä_åo‚_çÑ_ço‚Ò_ä_åoƒ_çÑ_çoƒÒ_ä_åo„_çÑ_ço„Ò_ä_åo…_çÑ_ço…Ò_ä_åo†_çÑ_ço†Ò_ä_åo‡_çÑ_ço‡Ò_ä_åoˆ_çÑ_çoˆÒ_ä_åo‰_çÑ_ço‰Ò_ä_åoŠ_çÑ_çoŠÒ_ä_åo‹_çÑ_ço‹Ò_ä_åoŒ_çÑ_çoŒÒ_ä_åo_çÑ_çoÒ_ä_åoŽ_çÑ_çoŽÒ_ä_åo_çÑ_çoÒ_ä_åo_çÑ_çoÒ_ä_åo‘_çÑ_ço‘Ò_ä_åo’_çÑ_ço’Ò_ä_åo“_çÑ_ço“Ò_ä_åo”_çÑ_ço”Ò_ä_åo•_çÑ_ço•Ò_ä_åo–_çÑ_ço–Ò_ä_åo—_çÑ_ço—Ò_ä_åo˜_çÑ_ço˜Ò_ä_åo™_çÑ_ço™Ò_ä_åoš_çÑ_çošÒ_ä_åo›_çÑ_ço›Ò_ä_åoœ_çÑ_çoœÒ_ä_åo_çÑ_çoÒ_ä_åož_çÑ_çožÒ_ä_åoŸ_çÑ_çoŸÒ_ä_åo _çÑ_ço Ò_ä_åo¡_çÑ_ço¡Ò_ä_åo¢_çÑ_ço¢Ò_ä_åo£_çÑ_ço£Ò_ä_åo¤_çÑ_ço¤Ò_ä_åo¥_çÑ_ço¥Ò_ä_åo¦_çÑ_ço¦Ò_ä_åo§_çÑ_ço§Ò_ä_åo¨_çÑ_ço¨Ò_ä_åo©_çÑ_ço©Ò_ä_åoª_çÑ_çoªÒ_ä_åo«_çÑ_ço«Ò_ä_åo¬_çÑ_ço¬Ò_ä_åo­_çÑ_ço­Ò_ä_åo®_çÑ_ço®Ò_ä_åo¯_çÑ_ço¯Ò_ä_åo°_çÑ_ço°Ò_ä_åo±_çÑ_ço±Ò_ä_åo²_çÑ_ço²Ò_ä_åo³_çÑ_ço³Ò_ä_åo´_çÑ_ço´Ò_ä_åoµ_çÑ_çoµÒ_ä_åo¶_çÑ_ço¶Ò_ä_åo·_çÑ_ço·Ò_ä_åo¸_çÑ_ço¸Ò_ä_åo¹_çÑ_ço¹Ò_ä_åoº_çÑ_çoºÒ_ä_åo»_çÑ_ço»Ò_ä_åo¼_çÑ_ço¼Ò_ä_åo½_çÑ_ço½Ò_ä_åo¾_çÑ_ço¾Ò_ä_åo¿_çÑ_ço¿Ò_ä_åoÀ_çÑ_çoÀÒ_ä_åoÁ_çÑ_çoÁÒ_ä_åoÂ_çÑ_çoÂÒ_ä_åoÃ_çÑ_çoÃÒ_ä_åoÄ_çÑ_çoÄÒ_ä_åoÅ_çÑ_çoÅÒ_ä_åoÆ_çÑ_çoÆÒ_ä_åoÇ_çÑ_çoÇÒ_ä_åoÈ_çÑ_çoÈÒ_ä_åoÉ_çÑ_çoÉÒ_ä_åoÊ_çÑ_çoÊÒ_ä_åoË_çÑ_çoËÒ_ä_åoÌ_çÑ_çoÌÒ_ä_åoÍ_çÑ_çoÍÒ_ä_åoÎ_çÑ_çoÎÒ_ä_åoÏ_çÑ_çoÏÒ_ä_åoÐ_çÑ_çoÐÒ_ä_åoÑ_çÑ_çoÑÒ_ä_åoÒ_çÑ_çoÒÒ_ä_åoÓ_çÑ_çoÓÒ_ä_åoÔ_çÑ_çoÔÒ_ä_åoÕ_çÑ_çoÕÒ_ä_åoÖ_çÑ_çoÖÒ_ä_åo×_çÑ_ço×Ò_ä_åoØ_çÑ_çoØÒ_ä_åoÙ_çÑ_çoÙÒ_ä_åoÚ_çÑ_çoÚÒ_ä_åoÛ_çÑ_çoÛÒ_ä_åoÜ_çÑ_çoÜÒ_ä_åoÝ_çÑ_çoÝÒ_ä_åoÞ_çÑ_çoÞÒ_ä_åoß_çÑ_çoßÒ_ä_åoà_çÑ_çoàÒ_ä_åoá_çÑ_çoáÒ_ä_åoâ_çÑ_çoâÒ_ä_åoã_çÑ_çoãÒ_ä_åoä_çÑ_çoäÒ_ä_åoå_çÑ_çoåÒ_ä_åoæ_çÑ_çoæÒ_ä_åoç_çÑ_çoçÒ_ä_åoè_çÑ_çoèÒ_ä_åoé_çÑ_çoéÒ_ä_åoê_çÑ_çoêÒ_ä_åoë_çÑ_çoëÒ_ä_åoì_çÑ_çoìÒ_ä_åoí_çÑ_çoíÒ_ä_åoî_çÑ_çoîÒ_ä_åoï_çÑ_çoïÒ_ä_åoð_çÑ_çoðÒ_ä_åoñ_çÑ_çoñÒ_ä_åoò_çÑ_çoòÒ_ä_åoó_çÑ_çoóÒ_ä_åoô_çÑ_çoôÒ_ä_åoõ_çÑ_çoõÒ_ä_åoö_çÑ_çoöÒ_ä_åo÷_çÑ_ço÷Ò_ä_åoø_çÑ_çoøÒ_ä_åoù_çÑ_çoùÒ_ä_åoú_çÑ_çoúÒ_ä_åoû_çÑ_çoûÒ_ä_åoü_çÑ_çoüÒ_ä_åoý_çÑ_çoýÒ_ä_åoþ_çÑ_çoþÒ_ä_åoÿ_çÑ_çoÿÒ_ä_åp_çÑ_çpÒ_ä_åp_çÑ_çpÒ_ä_åp_çÑ_çpÒ_ä_åp_çÑ_çpÒ_ä_åp_çÑ_çpÒ_ä_åp_çÑ_çpÒ_ä_åp_çÑ_çpÒ_ä_åp_çÑ_çpÒ_ä_åp_çÑ_çpÒ_ä_åp _çÑ_çp Ò_ä_åp _çÑ_çp Ò_ä_åp _çÑ_çp Ò_ä_åp _çÑ_çp Ò_ä_åp _çÑ_çp Ò_ä_åp_çÑ_çpÒ_ä_åp_çÑ_çpÒ_ä_åp_çÑ_çpÒ_ä_åp_çÑ_çpÒ_ä_åp_çÑ_çpÒ_ä_åp_çÑ_çpÒ_ä_åp_çÑ_çpÒ_ä_åp_çÑ_çpÒ_ä_åp_çÑ_çpÒ_ä_åp_çÑ_çpÒ_ä_åp_çÑ_çpÒ_ä_åp_çÑ_çpÒ_ä_åp_çÑ_çpÒ_ä_åp_çÑ_çpÒ_ä_åp_çÑ_çpÒ_ä_åp_çÑ_çpÒ_ä_åp_çÑ_çpÒ_ä_åp_çÑ_çpÒ_ä_åp _çÑ_çp Ò_ä_åp!_çÑ_çp!Ò_ä_åp"_çÑ_çp"Ò_ä_åp#_çÑ_çp#Ò_ä_åp$_çÑ_çp$Ò_ä_åp%_çÑ_çp%Ò_ä_åp&_çÑ_çp&Ò_ä_åp'_çÑ_çp'Ò_ä_åp(_çÑ_çp(Ò_ä_åp)_çÑ_çp)Ò_ä_åp*_çÑ_çp*Ò_ä_åp+_çÑ_çp+Ò_ä_åp,_çÑ_çp,Ò_ä_åp-_çÑ_çp-Ò_ä_åp._çÑ_çp.Ò_ä_åp/_çÑ_çp/Ò_ä_åp0_çÑ_çp0Ò_ä_åp1_çÑ_çp1Ò_ä_åp2_çÑ_çp2Ò_ä_åp3_çÑ_çp3Ò_ä_åp4_çÑ_çp4Ò_ä_åp5_çÑ_çp5Ò_ä_åp6_çÑ_çp6Ò_ä_åp7_çÑ_çp7Ò_ä_åp8_çÑ_çp8Ò_ä_åp9_çÑ_çp9Ò_ä_åp:_çÑ_çp:Ò_ä_åp;_çÑ_çp;Ò_ä_åp<_çÑ_çp<Ò_ä_åp=_çÑ_çp=Ò_ä_åp>_çÑ_çp>Ò_ä_åp?_çÑ_çp?Ò_ä_åp@_çÑ_çp@Ò_ä_åpA_çÑ_çpAÒ_ä_åpB_çÑ_çpBÒ_ä_åpC_çÑ_çpCÒ_ä_åpD_çÑ_çpDÒ_ä_åpE_çÑ_çpEÒ_ä_åpF_çÑ_çpFÒ_ä_åpG_çÑ_çpGÒ_ä_åpH_çÑ_çpHÒ_ä_åpI_çÑ_çpIÒ_ä_åpJ_çÑ_çpJÒ_ä_åpK_çÑ_çpKÒ_ä_åpL_çÑ_çpLÒ_ä_åpM_çÑ_çpMÒ_ä_åpN_çÑ_çpNÒ_ä_åpO_çÑ_çpOÒ_ä_åpP_çÑ_çpPÒ_ä_åpQ_çÑ_çpQÒ_ä_åpR_çÑ_çpRÒ_ä_åpS_çÑ_çpSÒ_ä_åpT_çÑ_çpTÒ_ä_åpU_çÑ_çpUÒ_ä_åpV_çÑ_çpVÒ_ä_åpW_çÑ_çpWÒ_ä_åpX_çÑ_çpXÒ_ä_åpY_çÑ_çpYÒ_ä_åpZ_çÑ_çpZÒ_ä_åp[_çÑ_çp[Ò_ä_åp\_çÑ_çp\Ò_ä_åp]_çÑ_çp]Ò_ä_åp^_çÑ_çp^Ò_ä_åp__çÑ_çp_Ò_ä_åp`_çÑ_çp`Ò_ä_åpa_çÑ_çpaÒ_ä_åpb_çÑ_çpbÒ_ä_åpc_çÑ_çpcÒ_ä_åpd_çÑ_çpdÒ_ä_åpe_çÑ_çpeÒ_ä_åpf_çÑ_çpfÒ_ä_åpg_çÑ_çpgÒ_ä_åph_çÑ_çphÒ_ä_åpi_çÑ_çpiÒ_ä_åpj_çÑ_çpjÒ_ä_åpk_çÑ_çpkÒ_ä_åpl_çÑ_çplÒ_ä_åpm_çÑ_çpmÒ_ä_åpn_çÑ_çpnÒ_ä_åpo_çÑ_çpoÒ_ä_åpp_çÑ_çppÒ_ä_åpq_çÑ_çpqÒ_ä_åpr_çÑ_çprÒ_ä_åps_çÑ_çpsÒ_ä_åpt_çÑ_çptÒ_ä_åpu_çÑ_çpuÒ_ä_åpv_çÑ_çpvÒ_ä_åpw_çÑ_çpwÒ_ä_åpx_çÑ_çpxÒ_ä_åpy_çÑ_çpyÒ_ä_åpz_çÑ_çpzÒ_ä_åp{_çÑ_çp{Ò_ä_åp|_çÑ_çp|Ò_ä_åp}_çÑ_çp}Ò_ä_åp~_çÑ_çp~Ò_ä_åp_çÑ_çpÒ_ä_åp€_çÑ_çp€Ò_ä_åp_çÑ_çpÒ_ä_åp‚_çÑ_çp‚Ò_ä_åpƒ_çÑ_çpƒÒ_ä_åp„_çÑ_çp„Ò_ä_åp…_çÑ_çp…Ò_ä_åp†_çÑ_çp†Ò_ä_åp‡_çÑ_çp‡Ò_ä_åpˆ_çÑ_çpˆÒ_ä_åp‰_çÑ_çp‰Ò_ä_åpŠ_çÑ_çpŠÒ_ä_åp‹_çÑ_çp‹Ò_ä_åpŒ_çÑ_çpŒÒ_ä_åp_çÑ_çpÒ_ä_åpŽ_çÑ_çpŽÒ_ä_åp_çÑ_çpÒ_ä_åp_çÑ_çpÒ_ä_åp‘_çÑ_çp‘Ò_ä_åp’_çÑ_çp’Ò_ä_åp“_çÑ_çp“Ò_ä_åp”_çÑ_çp”Ò_ä_åp•_çÑ_çp•Ò_ä_åp–_çÑ_çp–Ò_ä_åp—_çÑ_çp—Ò_ä_åp˜_çÑ_çp˜Ò_ä_åp™_çÑ_çp™Ò_ä_åpš_çÑ_çpšÒ_ä_åp›_çÑ_çp›Ò_ä_åpœ_çÑ_çpœÒ_ä_åp_çÑ_çpÒ_ä_åpž_çÑ_çpžÒ_ä_åpŸ_çÑ_çpŸÒ_ä_åp _çÑ_çp Ò_ä_åp¡_çÑ_çp¡Ò_ä_åp¢_çÑ_çp¢Ò_ä_åp£_çÑ_çp£Ò_ä_åp¤_çÑ_çp¤Ò_ä_åp¥_çÑ_çp¥Ò_ä_åp¦_çÑ_çp¦Ò_ä_åp§_çÑ_çp§Ò_ä_åp¨_çÑ_çp¨Ò_ä_åp©_çÑ_çp©Ò_ä_åpª_çÑ_çpªÒ_ä_åp«_çÑ_çp«Ò_ä_åp¬_çÑ_çp¬Ò_ä_åp­_çÑ_çp­Ò_ä_åp®_çÑ_çp®Ò_ä_åp¯_çÑ_çp¯Ò_ä_åp°_çÑ_çp°Ò_ä_åp±_çÑ_çp±Ò_ä_åp²_çÑ_çp²Ò_ä_åp³_çÑ_çp³Ò_ä_åp´_çÑ_çp´Ò_ä_åpµ_çÑ_çpµÒ_ä_åp¶_çÑ_çp¶Ò_ä_åp·_çÑ_çp·Ò_ä_åp¸_çÑ_çp¸Ò_ä_åp¹_çÑ_çp¹Ò_ä_åpº_çÑ_çpºÒ_ä_åp»_çÑ_çp»Ò_ä_åp¼_çÑ_çp¼Ò_ä_åp½_çÑ_çp½Ò_ä_åp¾_çÑ_çp¾Ò_ä_åp¿_çÑ_çp¿Ò_ä_åpÀ_çÑ_çpÀÒ_ä_åpÁ_çÑ_çpÁÒ_ä_åpÂ_çÑ_çpÂÒ_ä_åpÃ_çÑ_çpÃÒ_ä_åpÄ_çÑ_çpÄÒ_ä_åpÅ_çÑ_çpÅÒ_ä_åpÆ_çÑ_çpÆÒ_ä_åpÇ_çÑ_çpÇÒ_ä_åpÈ_çÑ_çpÈÒ_ä_åpÉ_çÑ_çpÉÒ_ä_åpÊ_çÑ_çpÊÒ_ä_åpË_çÑ_çpËÒ_ä_åpÌ_çÑ_çpÌÒ_ä_åpÍ_çÑ_çpÍÒ_ä_åpÎ_çÑ_çpÎÒ_ä_åpÏ_çÑ_çpÏÒ_ä_åpÐ_çÑ_çpÐÒ_ä_åpÑ_çÑ_çpÑÒ_ä_åpÒ_çÑ_çpÒÒ_ä_åpÓ_çÑ_çpÓÒ_ä_åpÔ_çÑ_çpÔÒ_ä_åpÕ_çÑ_çpÕÒ_ä_åpÖ_çÑ_çpÖÒ_ä_åp×_çÑ_çp×Ò_ä_åpØ_çÑ_çpØÒ_ä_åpÙ_çÑ_çpÙÒ_ä_åpÚ_çÑ_çpÚÒ_ä_åpÛ_çÑ_çpÛÒ_ä_åpÜ_çÑ_çpÜÒ_ä_åpÝ_çÑ_çpÝÒ_ä_åpÞ_çÑ_çpÞÒ_ä_åpß_çÑ_çpßÒ_ä_åpà_çÑ_çpàÒ_ä_åpá_çÑ_çpáÒ_ä_åpâ_çÑ_çpâÒ_ä_åpã_çÑ_çpãÒ_ä_åpä_çÑ_çpäÒ_ä_åpå_çÑ_çpåÒ_ä_åpæ_çÑ_çpæÒ_ä_åpç_çÑ_çpçÒ_ä_åpè_çÑ_çpèÒ_ä_åpé_çÑ_çpéÒ_ä_åpê_çÑ_çpêÒ_ä_åpë_çÑ_çpëÒ_ä_åpì_çÑ_çpìÒ_ä_åpí_çÑ_çpíÒ_ä_åpî_çÑ_çpîÒ_ä_åpï_çÑ_çpïÒ_ä_åpð_çÑ_çpðÒ_ä_åpñ_çÑ_çpñÒ_ä_åpò_çÑ_çpòÒ_ä_åpó_çÑ_çpóÒ_ä_åpô_çÑ_çpôÒ_ä_åpõ_çÑ_çpõÒ_ä_åpö_çÑ_çpöÒ_ä_åp÷_çÑ_çp÷Ò_ä_åpø_çÑ_çpøÒ_ä_åpù_çÑ_çpùÒ_ä_åpú_çÑ_çpúÒ_ä_åpû_çÑ_çpûÒ_ä_åpü_çÑ_çpüÒ_ä_åpý_çÑ_çpýÒ_ä_åpþ_çÑ_çpþÒ_ä_åpÿ_çÑ_çpÿÒ_ä_åq_çÑ_çqÒ_ä_åq_çÑ_çqÒ_ä_åq_çÑ_çqÒ_ä_åq_çÑ_çqÒ_ä_åq_çÑ_çqÒ_ä_åq_çÑ_çqÒ_ä_åq_çÑ_çqÒ_ä_åq_çÑ_çqÒ_ä_åq_çÑ_çqÒ_ä_åq _çÑ_çq Ò_ä_åq _çÑ_çq Ò_ä_åq _çÑ_çq Ò_ä_åq _çÑ_çq Ò_ä_åq _çÑ_çq Ò_ä_åq_çÑ_çqÒ_ä_åq_çÑ_çqÒ_ä_åq_çÑ_çqÒ_ä_åq_çÑ_çqÒ_ä_åq_çÑ_çqÒ_ä_åq_çÑ_çqÒ_ä_åq_çÑ_çqÒ_ä_åq_çÑ_çqÒ_ä_åq_çÑ_çqÒ_ä_åq_çÑ_çqÒ_ä_åq_çÑ_çqÒ_ä_åq_çÑ_çqÒ_ä_åq_çÑ_çqÒ_ä_åq_çÑ_çqÒ_ä_åq_çÑ_çqÒ_ä_åq_çÑ_çqÒ_ä_åq_çÑ_çqÒ_ä_åq_çÑ_çqÒ_ä_åq _çÑ_çq Ò_ä_åq!_çÑ_çq!Ò_ä_åq"_çÑ_çq"Ò_ä_åq#_çÑ_çq#Ò_ä_åq$_çÑ_çq$Ò_ä_åq%_çÑ_çq%Ò_ä_åq&_çÑ_çq&Ò_ä_åq'_çÑ_çq'Ò_ä_åq(_çÑ_çq(Ò_ä_åq)_çÑ_çq)Ò_ä_åq*_çÑ_çq*Ò_ä_åq+_çÑ_çq+Ò_ä_åq,_çÑ_çq,Ò_ä_åq-_çÑ_çq-Ò_ä_åq._çÑ_çq.Ò_ä_åq/_çÑ_çq/Ò_ä_åq0_çÑ_çq0Ò_ä_åq1_çÑ_çq1Ò_ä_åq2_çÑ_çq2Ò_ä_åq3_çÑ_çq3Ò_ä_åq4_çÑ_çq4Ò_ä_åq5_çÑ_çq5Ò_ä_åq6_çÑ_çq6Ò_ä_åq7_çÑ_çq7Ò_ä_åq8_çÑ_çq8Ò_ä_åq9_çÑ_çq9Ò_ä_åq:_çÑ_çq:Ò_ä_åq;_çÑ_çq;Ò_ä_åq<_çÑ_çq<Ò_ä_åq=_çÑ_çq=Ò_ä_åq>_çÑ_çq>Ò_ä_åq?_çÑ_çq?Ò_ä_åq@_çÑ_çq@Ò_ä_åqA_çÑ_çqAÒ_ä_åqB_çÑ_çqBÒ_ä_åqC_çÑ_çqCÒ_ä_åqD_çÑ_çqDÒ_ä_åqE_çÑ_çqEÒ_ä_åqF_çÑ_çqFÒ_ä_åqG_çÑ_çqGÒ_ä_åqH_çÑ_çqHÒ_ä_åqI_çÑ_çqIÒ_ä_åqJ_çÑ_çqJÒ_ä_åqK_çÑ_çqKÒ_ä_åqL_çÑ_çqLÒ_ä_åqM_çÑ_çqMÒ_ä_åqN_çÑ_çqNÒ_ä_åqO_çÑ_çqOÒ_ä_åqP_çÑ_çqPÒ_ä_åqQ_çÑ_çqQÒ_ä_åqR_çÑ_çqRÒ_ä_åqS_çÑ_çqSÒ_ä_åqT_çÑ_çqTÒ_ä_åqU_çÑ_çqUÒ_ä_åqV_çÑ_çqVÒ_ä_åqW_çÑ_çqWÒ_ä_åqX_çÑ_çqXÒ_ä_åqY_çÑ_çqYÒ_ä_åqZ_çÑ_çqZÒ_ä_åq[_çÑ_çq[Ò_ä_åq\_çÑ_çq\Ò_ä_åq]_çÑ_çq]Ò_ä_åq^_çÑ_çq^Ò_ä_åq__çÑ_çq_Ò_ä_åq`_çÑ_çq`Ò_ä_åqa_çÑ_çqaÒ_ä_åqb_çÑ_çqbÒ_ä_åqc_çÑ_çqcÒ_ä_åqd_çÑ_çqdÒ_ä_åqe_çÑ_çqeÒ_ä_åqf_çÑ_çqfÒ_ä_åqg_çÑ_çqgÒ_ä_åqh_çÑ_çqhÒ_ä_åqi_çÑ_çqiÒ_ä_åqj_çÑ_çqjÒ_ä_åqk_çÑ_çqkÒ_ä_åql_çÑ_çqlÒ_ä_åqm_çÑ_çqmÒ_ä_åqn_çÑ_çqnÒ_ä_åqo_çÑ_çqoÒ_ä_åqp_çÑ_çqpÒ_ä_åqq_çÑ_çqqÒ_ä_åqr_çÑ_çqrÒ_ä_åqs_çÑ_çqsÒ_ä_åqt_çÑ_çqtÒ_ä_åqu_çÑ_çquÒ_ä_åqv_çÑ_çqvÒ_ä_åqw_çÑ_çqwÒ_ä_åqx_çÑ_çqxÒ_ä_åqy_çÑ_çqyÒ_ä_åqz_çÑ_çqzÒ_ä_åq{_çÑ_çq{Ò_ä_åq|_çÑ_çq|Ò_ä_åq}_çÑ_çq}Ò_ä_åq~_çÑ_çq~Ò_ä_åq_çÑ_çqÒ_ä_åq€_çÑ_çq€Ò_ä_åq_çÑ_çqÒ_ä_åq‚_çÑ_çq‚Ò_ä_åqƒ_çÑ_çqƒÒ_ä_åq„_çÑ_çq„Ò_ä_åq…_çÑ_çq…Ò_ä_åq†_çÑ_çq†Ò_ä_åq‡_çÑ_çq‡Ò_ä_åqˆ_çÑ_çqˆÒ_ä_åq‰_çÑ_çq‰Ò_ä_åqŠ_çÑ_çqŠÒ_ä_åq‹_çÑ_çq‹Ò_ä_åqŒ_çÑ_çqŒÒ_ä_åq_çÑ_çqÒ_ä_åqŽ_çÑ_çqŽÒ_ä_åq_çÑ_çqÒ_ä_åq_çÑ_çqÒ_ä_åq‘_çÑ_çq‘Ò_ä_åq’_çÑ_çq’Ò_ä_åq“_çÑ_çq“Ò_ä_åq”_çÑ_çq”Ò_ä_åq•_çÑ_çq•Ò_ä_åq–_çÑ_çq–Ò_ä_åq—_çÑ_çq—Ò_ä_åq˜_çÑ_çq˜Ò_ä_åq™_çÑ_çq™Ò_ä_åqš_çÑ_çqšÒ_ä_åq›_çÑ_çq›Ò_ä_åqœ_çÑ_çqœÒ_ä_åq_çÑ_çqÒ_ä_åqž_çÑ_çqžÒ_ä_åqŸ_çÑ_çqŸÒ_ä_åq _çÑ_çq Ò_ä_åq¡_çÑ_çq¡Ò_ä_åq¢_çÑ_çq¢Ò_ä_åq£_çÑ_çq£Ò_ä_åq¤_çÑ_çq¤Ò_ä_åq¥_çÑ_çq¥Ò_ä_åq¦_çÑ_çq¦Ò_ä_åq§_çÑ_çq§Ò_ä_åq¨_çÑ_çq¨Ò_ä_åq©_çÑ_çq©Ò_ä_åqª_çÑ_çqªÒ_ä_åq«_çÑ_çq«Ò_ä_åq¬_çÑ_çq¬Ò_ä_åq­_çÑ_çq­Ò_ä_åq®_çÑ_çq®Ò_ä_åq¯_çÑ_çq¯Ò_ä_åq°_çÑ_çq°Ò_ä_åq±_çÑ_çq±Ò_ä_åq²_çÑ_çq²Ò_ä_åq³_çÑ_çq³Ò_ä_åq´_çÑ_çq´Ò_ä_åqµ_çÑ_çqµÒ_ä_åq¶_çÑ_çq¶Ò_ä_åq·_çÑ_çq·Ò_ä_åq¸_çÑ_çq¸Ò_ä_åq¹_çÑ_çq¹Ò_ä_åqº_çÑ_çqºÒ_ä_åq»_çÑ_çq»Ò_ä_åq¼_çÑ_çq¼Ò_ä_åq½_çÑ_çq½Ò_ä_åq¾_çÑ_çq¾Ò_ä_åq¿_çÑ_çq¿Ò_ä_åqÀ_çÑ_çqÀÒ_ä_åqÁ_çÑ_çqÁÒ_ä_åqÂ_çÑ_çqÂÒ_ä_åqÃ_çÑ_çqÃÒ_ä_åqÄ_çÑ_çqÄÒ_ä_åqÅ_çÑ_çqÅÒ_ä_åqÆ_çÑ_çqÆÒ_ä_åqÇ_çÑ_çqÇÒ_ä_åqÈ_çÑ_çqÈÒ_ä_åqÉ_çÑ_çqÉÒ_ä_åqÊ_çÑ_çqÊÒ_ä_åqË_çÑ_çqËÒ_ä_åqÌ_çÑ_çqÌÒ_ä_åqÍ_çÑ_çqÍÒ_ä_åqÎ_çÑ_çqÎÒ_ä_åqÏ_çÑ_çqÏÒ_ä_åqÐ_çÑ_çqÐÒ_ä_åqÑ_çÑ_çqÑÒ_ä_åqÒ_çÑ_çqÒÒ_ä_åqÓ_çÑ_çqÓÒ_ä_åqÔ_çÑ_çqÔÒ_ä_åqÕ_çÑ_çqÕÒ_ä_åqÖ_çÑ_çqÖÒ_ä_åq×_çÑ_çq×Ò_ä_åqØ_çÑ_çqØÒ_ä_åqÙ_çÑ_çqÙÒ_ä_åqÚ_çÑ_çqÚÒ_ä_åqÛ_çÑ_çqÛÒ_ä_åqÜ_çÑ_çqÜÒ_ä_åqÝ_çÑ_çqÝÒ_ä_åqÞ_çÑ_çqÞÒ_ä_åqß_çÑ_çqßÒ_ä_åqà_çÑ_çqàÒ_ä_åqá_çÑ_çqáÒ_ä_åqâ_çÑ_çqâÒ_ä_åqã_çÑ_çqãÒ_ä_åqä_çÑ_çqäÒ_ä_åqå_çÑ_çqåÒ_ä_åqæ_çÑ_çqæÒ_ä_åqç_çÑ_çqçÒ_ä_åqè_çÑ_çqèÒ_ä_åqé_çÑ_çqéÒ_ä_åqê_çÑ_çqêÒ_ä_åqë_çÑ_çqëÒ_ä_åqì_çÑ_çqìÒ_ä_åqí_çÑ_çqíÒ_ä_åqî_çÑ_çqîÒ_ä_åqï_çÑ_çqïÒ_ä_åqð_çÑ_çqðÒ_ä_åqñ_çÑ_çqñÒ_ä_åqò_çÑ_çqòÒ_ä_åqó_çÑ_çqóÒ_ä_åqô_çÑ_çqôÒ_ä_åqõ_çÑ_çqõÒ_ä_åqö_çÑ_çqöÒ_ä_åq÷_çÑ_çq÷Ò_ä_åqø_çÑ_çqøÒ_ä_åqù_çÑ_çqùÒ_ä_åqú_çÑ_çqúÒ_ä_åqû_çÑ_çqûÒ_ä_åqü_çÑ_çqüÒ_ä_åqý_çÑ_çqýÒ_ä_åqþ_çÑ_çqþÒ_ä_åqÿ_çÑ_çqÿÒ_ä_år_çÑ_çrÒ_ä_år_çÑ_çrÒ_ä_år_çÑ_çrÒ_ä_år_çÑ_çrÒ_ä_år_çÑ_çrÒ_ä_år_çÑ_çrÒ_ä_år_çÑ_çrÒ_ä_år_çÑ_çrÒ_ä_år_çÑ_çrÒ_ä_år _çÑ_çr Ò_ä_år _çÑ_çr Ò_ä_år _çÑ_çr Ò_ä_år _çÑ_çr Ò_ä_år _çÑ_çr Ò_ä_år_çÑ_çrÒ_ä_år_çÑ_çrÒ_ä_år_çÑ_çrÒ_ä_år_çÑ_çrÒ_ä_år_çÑ_çrÒ_ä_år_çÑ_çrÒ_ä_år_çÑ_çrÒ_ä_år_çÑ_çrÒ_ä_år_çÑ_çrÒ_ä_år_çÑ_çrÒ_ä_år_çÑ_çrÒ_ä_år_çÑ_çrÒ_ä_år_çÑ_çrÒ_ä_år_çÑ_çrÒ_ä_år_çÑ_çrÒ_ä_år_çÑ_çrÒ_ä_år_çÑ_çrÒ_ä_år_çÑ_çrÒ_ä_år _çÑ_çr Ò_ä_år!_çÑ_çr!Ò_ä_år"_çÑ_çr"Ò_ä_år#_çÑ_çr#Ò_ä_år$_çÑ_çr$Ò_ä_år%_çÑ_çr%Ò_ä_år&_çÑ_çr&Ò_ä_år'_çÑ_çr'Ò_ä_år(_çÑ_çr(Ò_ä_år)_çÑ_çr)Ò_ä_år*_çÑ_çr*Ò_ä_år+_çÑ_çr+Ò_ä_år,_çÑ_çr,Ò_ä_år-_çÑ_çr-Ò_ä_år._çÑ_çr.Ò_ä_år/_çÑ_çr/Ò_ä_år0_çÑ_çr0Ò_ä_år1_çÑ_çr1Ò_ä_år2_çÑ_çr2Ò_ä_år3_çÑ_çr3Ò_ä_år4_çÑ_çr4Ò_ä_år5_çÑ_çr5Ò_ä_år6_çÑ_çr6Ò_ä_år7_çÑ_çr7Ò_ä_år8_çÑ_çr8Ò_ä_år9_çÑ_çr9Ò_ä_år:_çÑ_çr:Ò_ä_år;_çÑ_çr;Ò_ä_år<_çÑ_çr<Ò_ä_år=_çÑ_çr=Ò_ä_år>_çÑ_çr>Ò_ä_år?_çÑ_çr?Ò_ä_år@_çÑ_çr@Ò_ä_årA_çÑ_çrAÒ_ä_årB_çÑ_çrBÒ_ä_årC_çÑ_çrCÒ_ä_årD_çÑ_çrDÒ_ä_årE_çÑ_çrEÒ_ä_årF_çÑ_çrFÒ_ä_årG_çÑ_çrGÒ_ä_årH_çÑ_çrHÒ_ä_årI_çÑ_çrIÒ_ä_årJ_çÑ_çrJÒ_ä_årK_çÑ_çrKÒ_ä_årL_çÑ_çrLÒ_ä_årM_çÑ_çrMÒ_ä_årN_çÑ_çrNÒ_ä_årO_çÑ_çrOÒ_ä_årP_çÑ_çrPÒ_ä_årQ_çÑ_çrQÒ_ä_årR_çÑ_çrRÒ_ä_årS_çÑ_çrSÒ_ä_årT_çÑ_çrTÒ_ä_årU_çÑ_çrUÒ_ä_årV_çÑ_çrVÒ_ä_årW_çÑ_çrWÒ_ä_årX_çÑ_çrXÒ_ä_årY_çÑ_çrYÒ_ä_årZ_çÑ_çrZÒ_ä_år[_çÑ_çr[Ò_ä_år\_çÑ_çr\Ò_ä_år]_çÑ_çr]Ò_ä_år^_çÑ_çr^Ò_ä_år__çÑ_çr_Ò_ä_år`_çÑ_çr`Ò_ä_åra_çÑ_çraÒ_ä_årb_çÑ_çrbÒ_ä_årc_çÑ_çrcÒ_ä_ård_çÑ_çrdÒ_ä_åre_çÑ_çreÒ_ä_årf_çÑ_çrfÒ_ä_årg_çÑ_çrgÒ_ä_årh_çÑ_çrhÒ_ä_åri_çÑ_çriÒ_ä_årj_çÑ_çrjÒ_ä_årk_çÑ_çrkÒ_ä_årl_çÑ_çrlÒ_ä_årm_çÑ_çrmÒ_ä_årn_çÑ_çrnÒ_ä_åro_çÑ_çroÒ_ä_årp_çÑ_çrpÒ_ä_årq_çÑ_çrqÒ_ä_årr_çÑ_çrrÒ_ä_års_çÑ_çrsÒ_ä_årt_çÑ_çrtÒ_ä_åru_çÑ_çruÒ_ä_årv_çÑ_çrvÒ_ä_årw_çÑ_çrwÒ_ä_årx_çÑ_çrxÒ_ä_åry_çÑ_çryÒ_ä_årz_çÑ_çrzÒ_ä_år{_çÑ_çr{Ò_ä_år|_çÑ_çr|Ò_ä_år}_çÑ_çr}Ò_ä_år~_çÑ_çr~Ò_ä_år_çÑ_çrÒ_ä_år€_çÑ_çr€Ò_ä_år_çÑ_çrÒ_ä_år‚_çÑ_çr‚Ò_ä_årƒ_çÑ_çrƒÒ_ä_år„_çÑ_çr„Ò_ä_år…_çÑ_çr…Ò_ä_år†_çÑ_çr†Ò_ä_år‡_çÑ_çr‡Ò_ä_årˆ_çÑ_çrˆÒ_ä_år‰_çÑ_çr‰Ò_ä_årŠ_çÑ_çrŠÒ_ä_år‹_çÑ_çr‹Ò_ä_årŒ_çÑ_çrŒÒ_ä_år_çÑ_çrÒ_ä_årŽ_çÑ_çrŽÒ_ä_år_çÑ_çrÒ_ä_år_çÑ_çrÒ_ä_år‘_çÑ_çr‘Ò_ä_år’_çÑ_çr’Ò_ä_år“_çÑ_çr“Ò_ä_år”_çÑ_çr”Ò_ä_år•_çÑ_çr•Ò_ä_år–_çÑ_çr–Ò_ä_år—_çÑ_çr—Ò_ä_år˜_çÑ_çr˜Ò_ä_år™_çÑ_çr™Ò_ä_årš_çÑ_çršÒ_ä_år›_çÑ_çr›Ò_ä_årœ_çÑ_çrœÒ_ä_år_çÑ_çrÒ_ä_årž_çÑ_çržÒ_ä_årŸ_çÑ_çrŸÒ_ä_år _çÑ_çr Ò_ä_år¡_çÑ_çr¡Ò_ä_år¢_çÑ_çr¢Ò_ä_år£_çÑ_çr£Ò_ä_år¤_çÑ_çr¤Ò_ä_år¥_çÑ_çr¥Ò_ä_år¦_çÑ_çr¦Ò_ä_år§_çÑ_çr§Ò_ä_år¨_çÑ_çr¨Ò_ä_år©_çÑ_çr©Ò_ä_årª_çÑ_çrªÒ_ä_år«_çÑ_çr«Ò_ä_år¬_çÑ_çr¬Ò_ä_år­_çÑ_çr­Ò_ä_år®_çÑ_çr®Ò_ä_år¯_çÑ_çr¯Ò_ä_år°_çÑ_çr°Ò_ä_år±_çÑ_çr±Ò_ä_år²_çÑ_çr²Ò_ä_år³_çÑ_çr³Ò_ä_år´_çÑ_çr´Ò_ä_årµ_çÑ_çrµÒ_ä_år¶_çÑ_çr¶Ò_ä_år·_çÑ_çr·Ò_ä_år¸_çÑ_çr¸Ò_ä_år¹_çÑ_çr¹Ò_ä_årº_çÑ_çrºÒ_ä_år»_çÑ_çr»Ò_ä_år¼_çÑ_çr¼Ò_ä_år½_çÑ_çr½Ò_ä_år¾_çÑ_çr¾Ò_ä_år¿_çÑ_çr¿Ò_ä_årÀ_çÑ_çrÀÒ_ä_årÁ_çÑ_çrÁÒ_ä_årÂ_çÑ_çrÂÒ_ä_årÃ_çÑ_çrÃÒ_ä_årÄ_çÑ_çrÄÒ_ä_årÅ_çÑ_çrÅÒ_ä_årÆ_çÑ_çrÆÒ_ä_årÇ_çÑ_çrÇÒ_ä_årÈ_çÑ_çrÈÒ_ä_årÉ_çÑ_çrÉÒ_ä_årÊ_çÑ_çrÊÒ_ä_årË_çÑ_çrËÒ_ä_årÌ_çÑ_çrÌÒ_ä_årÍ_çÑ_çrÍÒ_ä_årÎ_çÑ_çrÎÒ_ä_årÏ_çÑ_çrÏÒ_ä_årÐ_çÑ_çrÐÒ_ä_årÑ_çÑ_çrÑÒ_ä_årÒ_çÑ_çrÒÒ_ä_årÓ_çÑ_çrÓÒ_ä_årÔ_çÑ_çrÔÒ_ä_årÕ_çÑ_çrÕÒ_ä_årÖ_çÑ_çrÖÒ_ä_år×_çÑ_çr×Ò_ä_årØ_çÑ_çrØÒ_ä_årÙ_çÑ_çrÙÒ_ä_årÚ_çÑ_çrÚÒ_ä_årÛ_çÑ_çrÛÒ_ä_årÜ_çÑ_çrÜÒ_ä_årÝ_çÑ_çrÝÒ_ä_årÞ_çÑ_çrÞÒ_ä_årß_çÑ_çrßÒ_ä_årà_çÑ_çràÒ_ä_årá_çÑ_çráÒ_ä_årâ_çÑ_çrâÒ_ä_årã_çÑ_çrãÒ_ä_årä_çÑ_çräÒ_ä_årå_çÑ_çråÒ_ä_åræ_çÑ_çræÒ_ä_årç_çÑ_çrçÒ_ä_årè_çÑ_çrèÒ_ä_åré_çÑ_çréÒ_ä_årê_çÑ_çrêÒ_ä_årë_çÑ_çrëÒ_ä_årì_çÑ_çrìÒ_ä_årí_çÑ_çríÒ_ä_årî_çÑ_çrîÒ_ä_årï_çÑ_çrïÒ_ä_årð_çÑ_çrðÒ_ä_årñ_çÑ_çrñÒ_ä_årò_çÑ_çròÒ_ä_åró_çÑ_çróÒ_ä_årô_çÑ_çrôÒ_ä_årõ_çÑ_çrõÒ_ä_årö_çÑ_çröÒ_ä_år÷_çÑ_çr÷Ò_ä_årø_çÑ_çrøÒ_ä_årù_çÑ_çrùÒ_ä_årú_çÑ_çrúÒ_ä_årû_çÑ_çrûÒ_ä_årü_çÑ_çrüÒ_ä_årý_çÑ_çrýÒ_ä_årþ_çÑ_çrþÒ_ä_årÿ_çÑ_çrÿÒ_ä_ås_çÑ_çsÒ_ä_ås_çÑ_çsÒ_ä_ås_çÑ_çsÒ_ä_ås_çÑ_çsÒ_ä_ås_çÑ_çsÒ_ä_ås_çÑ_çsÒ_ä_ås_çÑ_çsÒ_ä_ås_çÑ_çsÒ_ä_ås_çÑ_çsWLocalIdTGUIDF­_$8422784a-2cfc-489e-a2d7-0922fff4e106FbFZF·F[F¸F\F®F¯FcF ÛF°FËF±FÌF²F ÜFÍFÆF¹F ÝF ÞF]FÎFÇFÏFÈFÉFºF ßFÊF àFdF»FÐF¼F^FeF áFfFÑFgFÒF âF ãFÓF½FhFiF¾F_FÔFÕFÖF×F`FjF äF³F åF´FkF¿F æF çFØF èF éFlF êF ëFaFbFÙFcFmFdFµF ìFeF íFÀFfF îFgF¶F ïFÚF ðFhF·F ñFiF òFjFnFÛFkF¸F¹FoFÜFºFpFÝFqFÞFÁF»FrFßFlFàFáFâFmFãFnF¼FoF½FpFäFqFÂFåFsFÃFæFtFuFçFvFèFwFéFrFxFêFÄFëF¾F¿FìFsF óF ôF õFyFÀF öFÁF ÷FÂF øFÃFÅFÄFÆFÇFzFÈF{FíFÉFÅFîFtF ùF|F úF ûFuFÆF}F üFïFðFÇFñFÈFòFÉFóFÊFÊF ýFËFvFwF þF~FÌF ÿF F FËF FÍFxFôFÎFÏFyFÌF FÍFÎF F FF F F FõFÏFÐFzFÑFÐFÒF€F FF F‚F{FƒFöFÓF FF}F~FÑF„FFÒF€F FF F…F÷F‚FøFÔFƒF F†F„F FùF F‡F…FÓF FˆFúF‰F FûF F†F‡FˆF‰FŠF F‹F FŒFFŽFüFFÕFF F FÖFŠF‘F‹FýFŒFþF FF’FÔF F“FÕF×FØF FÿF”FÖF F•F F–FF F—F F˜F FÙF×FÚFF™FFšFØF›F FœFFŽFFÙF !FžF "FŸFÚF #F $FÛF F %FFÛFFFÜF &F‘F 'FÝF (F’FFÞF¡FFÜF¢F )FF *F +F ,FÝF -FF .F FÞF /F“F£F¤F”F 0F¥FßF¦F•FàF§F 1F–FáF—F˜FßFâFàF™FãF 2FäF FšF 3F 4F¨F 5F 6FåF 7F F©F F›F FFæFFªF 8FáF 9FF :F«FâF¬FãFçFäFåF­FæF®FœFçFF¯F ;F°FžFèFŸF±FèF FéF¡F²FêFëF¢FìF³FíFîF FêF´F ?F¦FëF @FìF AF BF§FðFñF¨FíFòFîFóF CFïFFðF©FªFôF«FFõF DF¬FñF­F®F EF¯FµFFöFòF FF GFF÷FóFF HF°FF±F²FFôF¶F IFF³F JF´FFõF KFFF LFµFF·F¶FF F!F MF NFøFöF OF"F PF·F÷F¸F¹F¸F QFºF RFøF»F SFùF TFúF¼FùF UF#F$F¹F%FûF½F&FúFûF¾F VF WFüF'FüF XF(FýFºF)F*FþF+F YF ZF¿F [F \FýFÀF ]FÿF ^F»FÁFÂF _F `FF aF bF cFþFÃF dFÿFF eF fFFFF gFFF hFF iFF¼FF½FÄFFFF jFFÅFÆFÇF kFF¾F,FÈF F lF FÉF F F FÊF mFF nFËF oFÌF pFFÍFFÎFFÏF qF F rF¿FÀF F sF-F F tF.F FÐF uF vF wF xF F yFFÁF/F zF0FFÂF1FÃF2FF {FÄFFFFF3FÑFÅF |FÒFFÓFÔF }F4FÕF5FÖF ~F6FÆF7F F8F €FÇF9F×F:FFÈFØF;F FFÙFF ‚FÉFF …FÊF?FËF@FÚF †F ‡FFFAFFBFÛFCFÜFÌFF ˆFFÝFÍFDF ‰FFÞFFßFàFFáFFÎFâFEFFãFäFFFåFGFFFFæFFFFçF ŠFFèFéF ‹FHFêFÏFÜFIFJFëFKFìFÑF ŒF FFíFLFîF FïFMF!FÝFNF"FÓFOF ŽFÔF#F$FðFñFÕFòFóFÖFPFôF×FõFØFöFÙFÚFF FÛFF÷FÜF FÝF%F ‘F ’FF “FFQFÞFRFFßFSF F ”F •F&F!FøFTF"FàFUFVFáFWFXFYFZF#F$F[F%FùF&FúF –FûFâFãFüFäF'FýF\F'F —FåF(FþF]FÿF)FæF(F ˜F^FFçFèF*F)F_F*FéFêFëF+F ™FìFíFîF,F šFïFðF-FñF.FòF/F0FóF1F2FôF ›F œF F žF ŸF  F ¡FõFöF+FF,F ¢F÷F £FøF-F`F.F ¤F ¥F3F ¦FaFbF/FcFF §FFdFF ¨FFeFùF ©FFúF ªFFF «F FûF ¬FfF ­F ®FgFhFüFiF4FjFýFþFÿFF ¯FF F °FF0F ±F ²F F5F F ³F6F ´F F µFF1F7F2F ¶FkF ·F ¸F ¹F3F8F4F9FFlFmFF ºF:F;F »FFnF ¼FF5F ½FoF ¾F ¿FpF ÀFFF?FF@FFFFqFF6FFrFFF FsFAFtF7FBFFuFCFvFDFF8F9F ÁF ÂFEFFFFF ÃF ÄFF ÅF ÆF ÇFF ÈFF ÉF F ÊFGFFHFwFIFFJFxF F!F F ËFKF"F F:F ÌF#F F$F;F%FF?F@F ÍF(F)F*F ÎF+FAFBF ÏFLFMFCFNFFOFDFPFEFQF,FyFFFFzF{FRF-FF|FSFF}F.FGF/F~FHFF ÐF€FTFUFF0FIF1F‚F ÑF ÒFVF2F3F4FƒFWF5FJF6FKF ÓF„F7F8F9F…F:F;F†FFXFYFˆF‰FŠF?FF@FZF ÔFAF ÕF[FBF‹F ÖFCFLF ×FDF ØFEFFFGFHFIFJFKFLF ÙFMF ÚFNFOFŒFPF ÛFMF\FQF ÜF]FRF^FSFFTFŽF ÝFFUF ÞFVFNFWF ßFF àF áFF âFXFYFZF[F\F]F ãFFF_F^FOF äFPFQF åFFF_FF`F`FRFFSF‘FTFaF’FUF æF çFVFaF èF éF“FbF êFcF ëF”F ìF íFWFF•F îFdFeFXFFYFZF[FF–FfF—F\F ïF]F^F_F ðF ñFgF˜F òF óF ôFhF™FiFšF›F õFjFœFF öFbFžF ÷FŸFkF FlFmFnF¡FoFpFcFdFqFrFFsFtF¢F F£FeF¤FfF¥F!FuFvFgFwF¦F"F`FxF#FaF§FyFzF{F|F}F~FhFF¨F©FbF€FFcF‚FƒF„FªF…F«F†F¬FdF øF­F ùFiF$F úF ûF üFjFkF ýF®F¯F þF°F±FeF ÿF%F‡FfF FgFhFlF²F FiFmFnF FoFjFpF&F³F FqFrF'F F´F FsFµF FtFuFˆF(FvF‰F¶FŠF·F¸FwF¹FºFxFyF‹F FzF{FŒFkF FF»F FlF F|F F}F F F~FmFF¼FnFoF)FpFqF€FŽF*FF+FrF‚F½F F¾F FƒF¿F F„F F…FsF FF†FÀF FtF FÁF,F-F F.F/FÂF‡FuFˆF0FvF1FwF‰F2FÃFÄF3FÅF4FÆFÇFÈFxFÉFÊFŠFF FyF‹F FËF FŒF FFzFŽF FÌF F FF{F F5FÍF|F F}F6F~F7FF‘F8F F€FF‘F9FF’F“F’F‚F“F”FÎF F•F”F•FÏF !FÐF:FÑFƒF–F„F—FÒF "F˜F;F™FF $F—FF %FžF…F†F˜F &F™F‡F 'FšF›FˆFœFŸF×F‰F (FFØF )FÙFÚFŠF?FžF@FŸFAFÐF‹F *F¡F F +F¡F¢FBF£FÒF£FÛF¤FÜF ,F¥FÝF¤F -F¦F .FŒF /FF 0FŽF 1FF§F 2FCF¥FÞF 3F¨FßF 4F 5F 6F 7F 8FDF 9FEF¦F§F :FFFàF ;FGF©FªFHF«FáF¨FF¬F‘FIF­FJFKF®FâFãFäF¯F°FLF©FMF±FåF F ?F«F•FRF–FµFéF—F @FSF˜FêF¬F AFTFëF™FUF­F BF¶FšF·F®F¸F CF¹F¯F DFºF°F›F EF»F±FœF¼F²FF FFVF½FìFžFWF¾FŸF GF¿F HF IFÀFÁF³FXFÂF JFÃFÄFíF F KF´F LF¡F¢F£FYF MFµFîF¤F¥F¦F¶FïF·F¸F¹FðFºF§F¨FÅFñFòF NF©F OFÆF»F PF QFZFóF RF¼FªF SF½FôFÇFõF TFöFÈF÷F«FÉF FøF¬F UFÊF­F VFùF WF XF YFÌFúF ZF¾F [FËFÌFÍFÎFÏFÐFÑFÍF \FÒFÓF¿FÀFûFÎFÔFüFÕFýF[F ]F ^FþF\F _F `FÿF®F aF bF¯F cFÏF dF F eF FÁFÐFÑF F°FÂFÒF±F fF F F gF]F²FÖFÃFÓF hFÔF F³F iF^F´F jF_F`FÄFµFÅF F¶F!F F&F F·F'F×FÆF¸F F F kFØF¹FºFÇFØF F»FÈF FÉFÙFÙF¼F lFÊFÚF F mF F nFËFÛFaFÜF oF F pF qFÌFÚFÍF F½F¾FÝF¿FÞFßF rF sF tF uFÎFàFÀFÁF vFÂFbFcFÃFÄFÅFÏF F wFÆFÇF F F xFÐFÛF yFÜFÑFdFÒFÓF FeFÝF FÔFÈFáFfFÕF zFÉFÞF {F F |FÖFgFâF×FãFÊFØFhFËFiF F FÌFäFÍFÙF FÎFÚF FåF FÛFÏF }FßFÜFæFÐF ~F F FÝF FàFjFÞFÑFÒFkF FlFçFmFßFàFèF F FÓF !FéFáF "F #F $F %FÔF €FêF F &F ‚FëFÕFìFÖF ƒFnFíFoF „FîF …FpF 'FâFqFãF (FïF )F×FðFñFòFäF *FåFóF +FrFæF ,F -FçF .FèF /F 0F †F ‡FsFéF 1F ˆFtF 2F ‰FuF 3F ŠFêF ‹F 4F 5FôF ŒF FõF 6F ŽFëFöFìF FvFíF÷FîFØFøFïF 7FwFáFðFùFúFâFÙFûF 8FãFñFüFäF 9F FxFýFyFòFÚF :FÛFåFæFÜFçFèFþFóFôFéFÿFzFêFëFFFÝFÞFF{FFF ;FFFõFF|FöF÷F}FøF F F –FßFàF FFîFF ?FF @FáFFFïFF AFðF‚FFñFâFãFF BFäF CFF DFåF EF —FFFƒFòFFF„F FF…FFF ˜F ™F†F GF šFFFFF HF‡F ›FFæFFóFFçF IFFFFèF FéFˆFêF!FëF JFìF"FíFôF KFõF LF#F œFöF F$FF%F žFîFïF MF ŸF&F÷FøFðFùFúF'F NF OFF  F(FûFüFýFþFFÿF PFñF)FF*FòFóFôF+FFõFF F FöF F QF÷F,F F RF-F ¡F.F F SF/F TFøF UF0FFF1F2F ¢FF VF3FùFF WFúF4FFFF XFFF5FFûFüF £F6FF YFýF7FFþF8FF9FF ZF ¤FF [F ¥F:F \FF ¦F §FFFF ¨F‰FF ©FŠF;F ªFFF ]F «F‹F FF ^F ¬FÿF ­F!FFŒF"F ®F ¯FFF °FF ³F?F _F ´F@FFAF µFBF#FFCF$FDF `F ¶F ·F F%F aF ¸FEF F bF ¹FFFGF F&F F'F cFF(F ºF)FFF*F+F dFF,F eFŽFF-FFFFFFHF.F FIFJF »FKF F ¼FFLF/F ½FFF ¾FF fF0FMF F ¿FNF F1F FOF gFFFF‘F hF ÀF2F iFPF jFF ÁFF kF lF ÂF mFFF nFFFQF3FFRFFSF4F oF ÃFTF5F pF ÄF6F7F ÅFF ÆF ÇF ÈF’FUFF ÉF8F ÊF ËF ÌF9FF qFVF rF:F sFWF;F F tF“FF ÍF”FF ÐF wF ÑFFYFF?F@F xF ÒFZFAFBF[FF\FF]FCF yF^F ÓF_FF ÔF`FaFDFF zF {FF ÕFbF ÖFcFEF ×FFFdF FGF |F!F }F"F•F ØF ~F F–FeFHF#F F ÙFIF ÚF ÛFfFJF!F—F$F ÜF ÝF˜F €F%F&F F™FšF›F"F ÞFœF#F$F ßFKF'F%F ‚F(FF)F àFžF*FŸF&F F+F,F ƒFgF-F¡F.F'F „F/F0F1F …F¢F2FLF3F †FhFMF ‡F áF âF4FNF ãF£FiF ˆF äF¤FjF ‰F ŠF¥FkFlF5F åF¦F ‹FmF§FnF ŒFoF FpF6F ŽFqF F(F)FOF FrF ‘F ’F æF7F “F çFPF ”F •F –F èF —F ˜F8F éF9F ™F*F êF¨F šF©FªFsF ›F œF:F F ëF«F žF ŸF+F ìF  FQF ¡F íF îF ¢FRFtF £F¬F ¤F;F ¥FF?F/F0FSFTF1F@FUFAFuFBF ©FVF ðFCFWFßF­FÞFvFãFwF2F ñF3F ªF4FxFGFXF «F®F ¬F¯F ­F ®FYF5F ¯FZF6FäF °FåF[F7FæF\F8F òFçFLF]FMFNFOFyFPF óF^F_F ôFzF`F õFaFbF öF°FQFRFSFcFTFUFVF ÷F±FWFXFYF ±F ²F øFdFeFfFgF ùF{F úFZFhF ûFiF²FjF³F9F:F´F ³FµF üF ýF þF|F[F ÿF F F F¶F F·F}F¸F F F F\F¹F F F F F F F ´F F F F F F µFkF~F F ¶F FF ·F F ¸F;F€F]FF?F‚F@FAF F F ¹FBF ºFCF »F FºF_FmF F`FaFDF ¼F ½F ¾FEF»FbF¼F ¿FcFdFFF F½FƒFeFnF¾FfF„FoF FpFgFqFhFrFGFsF¿FHFIF FJFÀF ÀFtF FiFKFÁFuF FLF FMFvFÂFNF F ÁFwF…F ÂF !F†F "F‡FjF #FkF $F ÃF %FlF &FÃFxF ÄFyF 'FzF{FOF ÅFmF|FnF}FPF~FQFÄFRF (FSF )FoFTFÅFUF *FVF ÆFF +F ,FpF -FWFqF .F ÇFXF /FYF ÈF 0F ÉFÆFZF ÊFrF ËFsF 1FtF€F[F 2F ÌF ÍF ÎFÇFuFF‚F ÏF\FÈF]F 3F^F 4F_F ÐF`FƒF 5F„F 6F ÑFˆF ÒFvF…FaFwF†FbF ÓF ÔF 7F‡F 8F ÕFˆF 9FxF‰F‰F ÖFŠF‹F :FÉFŒFyFzFF{FcFŽF|F}FF~FF€FFŠFF ×F‘F‹F ØF’F‚FdF“F”F ;FÊFŒFeFƒF„F•F…F†F–F ÙF‡F—FËF˜FfF™FgFÌFÍFˆFšF FžF ?F ÛFŸF ÜFÑF @FŒFÒFF F AFÓF¡F¢F£F¤FhFiFÔF BF ÝF CF DFŽFFFjFÕFF‘F ÞF EFFÖFŽF“FF×FFF FF‘F•F¥FkF–FØF’F ßF“FÙF—FÚF”F¦F˜F•F àF§F áF¨FlF âF–F ãF™F©F—FšF›FÛFmFœFnFÜFªF˜FFoF äF«F åFžFpFÝFŸFqF FrF æF¡FsF çF¢F£F GF™F èF¤F¬F éF¥FÞF­F êF®F HF¦F¯F§F°F ëF±FßF²F ìF¨F IFàF³FáF´FtFâFµF JFãF íF©FF KFF¸F LF îFšF¹F›FºFäF»FœFªF MF NF«F¼F OF½F PFåF¾F¿FÀFuF ïFvF QF¬FwF­FÁFÂF RF®FæF ðF SF¯FFÃF TFÄFÅF UF ñFÆF VF òFÇF óF°FžFŸF±FçF²FèFFÉF WF ôFxF õFFFF öF³FÍFyF F ÷F¡F´FµFéF XFêF¢FëFÎFzF¶FìF·FÏFÐFÑFíF£F øF{FîF ùFÒF úFïF YF¤FðFñF¥F¦F|FòF§F ûF}FóFÓF~F¨F üFôFÔF©FªF ýFF¸FÕFÖF ZFõF þF€F [F ÿF×F \F«F FØFöF F¹FF÷F‚F’FÙFƒF„F…F»F¬FøF­F FÚFùF®F†FúF¯F F”F°FÛFÜF FÝF±FDF²FÞFßF ]F³FàFáFâF‡F ^FEFãFˆF _FäFåF `FæFFFûFçFÀFèFüF´FéFêFHF‰F aFIF bFëFµFìFíFýF¶FJFîFïF cFðFñFþFKFÿF·F dF¸F FòFÅF eFF fFFFŠF gFF F‹F FŒFF hF F iF jFF¹F kF FºF FÆF»F FF lF mFF¼F F nFŽFÇF oFFÈFóFFF F‘FÉF’F½FF½F“F¾F¿FôF¾FÍFõFÁF¿FÀF FöF F”F÷F FøF FùF•FúF–FûF F F pFÁFüF—F˜FÂF F™FšFÃF›F FœFÄF FÂF FFÒF FžFÓF F F F F F FFÃFýFF FFþFÿFF FF FÄF qFÅF FŸFÔFÕFÖFFÊF FÆF rFËF¡F¢F sF£FFÇF FÈF¤F¥FF tFÉF¦FÊF§FF FF F !F¨FF©F uFFªFF "F vFFÌFÚFF #F«FÎFFËF¬FÏF­FÐFÑF wF×FØFFFFF xFÙFFºFÌF $FÛF¼FFFàFáFâFÍFÎF %F®F yF¯F°FFÏF±FÐF²F zFÑFÒF³FÓFÔFFF FFÕF F F!F"F#F$FÖF×F F F FØF´FF {F |F%F&F &FÙFµF }F¶F'FÚF(FÛF·F 'F¸F (F¹FºF ~F)F»F FÜF )F €F*F F ‚F ƒF *F+F¼F,F-FF.F „F +FF/F0F1F ,F …F2F3F †F4F -FF5FFÝFFF ‡F6F .FÞF ˆF ‰F7F /F ŠF½F 0F¾F8F¿F ‹F 1F 2F9F 3F ŒFßF 4F FÀF ŽFàF F F 5FÁF ‘F:F 6FF ’F 7F;F 8F “FáF 9FÂF :FF ;FF ”FâF FF ?FF –FF @FÃFF AFãF —FäFåFFFÄFFçF?FèFÅF@FéF DF ˜FAF FBF EFCF FF ™F šFDFÆF ›FEFêFFFëFGFÇF!F"F œFHF F#F žFIF$F ŸFÈF  FJF ¡F%F&FKF ¢F £F ¤F GF ¥FLF ¦FìFíF §F HF ¨F IFîFÉFMFÊF ©F JF ªFËFNFÌFÍFïFÎFÏF «F KFOFÐFÑF LFÒFÓFPF MFÔFQFÕFRF ¬F'FSFÖF ­FTF ®F×FUF ¯FVF(FWFXF °FYFZFØF ±F NFÙF ²F)F[F ³F\FðFñFÚF ´F]FÛF*F µF+F ¶F,FÜFÝF ·F-FÞF ¸F.F OF ¹F/F0FßF ºF PF »F ¼F QF RF1F SF TFàFòF UFáF2F^FF VF WF3F4F_F ½F5F ¾F`FF6FF7FóFôF8F ¿F9F:F;FåF ÀFæFçFFýF [FêF?F@F ÈFþF ÉFëF ÊFAF \FìF ËFBFíFîFCFÿF ]F ÌFeFF ^FïFDFEFFFðFñFfF _F ÍFFFFFgFGFF `F aFòFFóFF ÎFHFFhF FôFIF ÏFõF bF ÐF cFöFJF dF ÑF eF ÒF F ÓFKFLF÷FøF fFùFMF gFNFOFiFPFjF hF F F iFkF F jFúFQFlFRFmFF kFnFoFûFSF lFüF mF nF oF pFýFþFÿF ÔF qF ÕF ÖF rF ×F ØFF sF ÙF tF ÚF ÛF ÜF ÝFpFqF ÞFF ßFrFF àFFTFUFFFF uFFFF áFVF âFsFF vF wFFF ãFtF äFuF FvF åFWF xFXF yFYFwFxFyFzF æF zF F F çF èF {F F éF F êF{FF |F ëFFFF }F ìF íF|F ~FF îFF ïF}FF~F ðFF F ñFZF òF[F óF ôFF õF €F öFF F\F ‚FF ƒFF ÷FFFF „F øF]F …F^F€FF_FFF`FF ùF †F ‡FFFF úF F!F ˆF"F#F ‰F‚F ŠFF ‹F ŒFF ûF FFƒF„FaF…FFF†F ŽFbF‡FcFF üFˆF F‰F ýFŠFF$FFFdFFeFFfF%F FgF&F'F F!F"FhF þFiF ‘F ÿFFjF(F#F)F$F*F%FkF+F&F'FF,F ’FlFmFnF “F‹FŒF(F-FFŽF.F)F*FoF+FFF,FpF/F ”F-F •F‘F –F’F0F —F1F.FqF ˜F“F ™F/FrF0FF šFF ›FF”F œFsF•F F–FF—F2FF˜F žF™F ŸFFF  F1FtF ¡F ¢FuFvFwF3F4F FšF2FxF›F3FhF4F5F6F FœFiF FFjF7F FkFlF £FžF5F F6F8FFFŸFmFFF F7F9F:F;FFFyF¡F8FF>F?F@FrFF|F}FAFF~FBFF?F€FF@F‚FƒF„F ¤F…FCFFAFFFsF§FDFtFEF ¥F†FFFF‡FuF¨F©F ¦FGF §FˆFHF ¨F‰FBFªFIFvF«FwFCFŠFDF‹FJF¬F­FŒFKF ©FLFxF®FyFFzFŽF{F|F}FEFF¯F~FFF€FF ªFF°FMF «FFF ¬F ­FFFF±F ®F FNF!F‘F"F²FOF³F ¯F’F´F °FFF#F ±F ²FGF“FPF$FQF%F&F ³FµFRF ´FSF µFTFUF‚FƒF„F”F…F ¶F•F†F–FVF‡F'FWFHF—F¶F˜F·F¸FˆF(F™FXF ·FIFšFYFJFZF‰F ¸FKF)F›FŠF*FœF‹F ¹FLF ºFFŒFMFžF[FNF\FOFF+F »F,F¹FŸFŽFFºF-F»F]F¼F F½F^F¾F_F ¼F.FF`FaF‘F’F/F0F ½FPF1F¿F ¾F¡F ¿FÀFÁF2FÂF3FbF¢FQF4FcFRFSFÃFdF5FeFTFÄF£F6FÅF7FÆFfF ÀF8FÇFÈFgF ÁF9FUF:FVF¤F;FFWF§F¨F ÂF©F?F ÃF“FªF@F«FAF ÄFBF ÅFCFDF”FÉF ÆFEF•F–FFFXF—F ÇF ÈF˜FYFGFHF™F ÉFIFšF ÊF ËF¬F›FœF ÌF ÍFZF ÎFFÊFJFžF ÏFKF ÐFŸF[F­FLF ÑFMF F ÒF®F¯F ÓFNF ÔFOF ÕFPF ÖF ×FQF ØF°F¡F±FRF¢FSF ÙFTF²F³F£FUF¤F\F ÚF]F¥F¦F§F´F^FVF_F¨FWF©F`FªFXFµF«F¬FaF¶FY(7U^M"M$M-™¹™Â™Ë™Ô™Ý™æ™ï™øšš ššš%š.š7š@šIšRš[šdšmšvššˆš‘ššš£š¬šµš¾šÇšÐšÙšâšëšôšý››››!›*›3›<›E›N›W›`›i›r›{›„››–›Ÿ›¨›±›º›Ã›Ì›Õ›Þ›ç›ð›ùœœ œœœ&œ/œ8œAœJœSœ\œeœnœwœ€œ‰œ’œ›œ¤œ­œ¶œ¿œÈœÑœÚœãœìœõœþ"+4=FOXajs|…Ž— ©²»ÄÍÖßèñúžž žžž'ž0ž9žBžKžTž]žfžožxžžŠž“žœž¥ž®ž·žÀžÉžÒžÛžäžížöžÿŸŸŸŸ#Ÿ,Ÿ5Ÿ>ŸGŸPŸYŸbŸkŸtŸ}Ÿ†ŸŸ˜Ÿ¡ŸªŸ³Ÿ¼ŸÅŸÎŸ×ŸàŸéŸòŸû      ( 1 : C L U ^ g p y ‚ ‹ ”  ¦ ¯ ¸ Á Ê Ó Ü å î ÷¡¡ ¡¡¡$¡-¡6¡?¡H¡Q¡Z¡c¡l¡u¡~¡‡¡¡™¡¢¡«¡´¡½¡Æ¡Ï¡Ø¡á¡ê¡ó¡ü¢¢¢¢ ¢)¢2¢;¢D¢M¢V¢_¢h¢q¢z¢ƒ¢Œ¢•¢ž¢§¢°¢¹¢Â¢Ë¢Ô¢Ý¢æ¢ï¢ø££ £££%£.£7£@£I£R£[£d£m£v££ˆ£‘£š£££¬£µ£¾£Ç£Ð£Ù£â£ë£ô£ý¤¤¤¤!¤*¤3¤<¤E¤N¤W¤`¤i¤r¤{¤„¤¤–¤Ÿ¤¨¤±¤º¤Ã¤Ì¤Õ¤Þ¤ç¤ð¤ù¥¥ ¥¥¥&¥/¥8¥A¥J¥S¥\¥e¥n¥w¥€¥‰¥’¥›¥¤¥­¥¶¥¿¥È¥Ñ¥Ú¥ã¥ì¥õ¥þ¦¦¦¦"¦+¦4¦=¦F¦O¦X¦a¦j¦s¦|¦…¦Ž¦—¦ ¦©¦²¦»¦Ä¦Í¦Ö¦ß¦è¦ñ¦ú§§ §§§'§0§9§B§K§T§]§f§o§x§§Š§“§œ§¥§®§·§À§É§Ò§Û§ä§í§ö§ÿ¨¨¨¨#¨,¨5¨>¨G¨P¨Y¨b¨k¨t¨}¨†¨¨˜¨¡¨ª¨³¨¼¨Å¨Î¨×¨à¨é¨ò¨û©© ©©©(©1©:©C©L©U©^©g©p©y©‚©‹©”©©¦©¯©¸©Á©Ê©Ó©Ü©å©î©÷ªª ªªª$ª-ª6ª?ªHªQªZªcªlªuª~ª‡ªª™ª¢ª«ª´ª½ªÆªÏªØªáªêªóªü«««« «)«2«;«D«M«V«_«h«q«z«ƒ«Œ«•«ž«§«°«¹«Â«Ë«Ô«Ý«æ«ï«ø¬¬ ¬¬¬%¬.¬7¬@¬I¬R¬[¬d¬m¬v¬¬ˆ¬‘¬š¬£¬¬¬µ¬¾¬Ç¬Ð¬Ù¬â¬ë¬ô¬ý­­­­!­*­3­<­E­N­W­`­i­r­{­„­­–­Ÿ­¨­±­º­Ã­Ì­Õ­Þ­ç­ð­ù®® ®®®&®/®8®A®J®S®\®e®n®w®€®‰®’®›®¤®­®¶®¿®È®Ñ®Ú®ã®ì®õ®þ¯¯¯¯"¯+¯4¯=¯F¯O¯X¯a¯j¯s¯|¯…¯Ž¯—¯ ¯©¯²¯»¯Ä¯Í¯Ö¯ß¯è¯ñ¯ú°° °°°'°0°9°B°K°T°]°f°o°x°°Š°“°œ°¥°®°·°À°É°Ò°Û°ä°í°ö°ÿ±±±±#±,±5±>±G±P±Y±b±k±t±}±†±±˜±¡±ª±³±¼±Å±Î±×±à±é±ò±û²² ²²²(²1²:²C²L²U²^²g²p²y²‚²‹²”²²¦²¯²¸²Á²Ê²Ó²Ü²å²î²÷³³ ³³³$³-³6³?³H³Q³Z³c³l³u³~³‡³³™³¢³«³´³½³Æ³Ï³Ø³á³ê³ó³ü´´´´ ´)´2´;´D´M´V´_´h´q´z´ƒ´Œ´•´ž´§´°´¹´Â´Ë´Ô´Ý´æ´ï´øµµ µµµ%µ.µ7µ@µIµRµ[µdµmµvµµˆµ‘µšµ£µ¬µµµ¾µÇµÐµÙµâµëµôµý¶¶¶¶!¶*¶3¶<¶E¶N¶W¶`¶i¶r¶{¶„¶¶–¶Ÿ¶¨¶±¶º¶Ã¶Ì¶Õ¶Þ¶ç¶ð¶ù·· ···&·/·8·A·J·S·\·e·n·w·€·‰·’·›·¤·­·¶·¿·È·Ñ·Ú·ã·ì·õ·þ¸¸¸¸"¸+¸4¸=¸F¸O¸X¸a¸j¸s¸|¸…¸Ž¸—¸ ¸©¸²¸»¸Ä¸Í¸Ö¸ß¸è¸ñ¸ú¹¹ ¹¹¹'¹0¹9¹B¹K¹T¹]¹f¹o¹x¹¹Š¹“¹œ¹¥¹®¹·¹À¹É¹Ò¹Û¹ä¹í¹ö¹ÿºººº#º,º5º>ºGºPºYºbºkºtº}º†ºº˜º¡ºªº³º¼ºÅºÎº×ºàºéºòºû»» »»»(»1»:»C»L»U»^»g»p»y»‚»‹»”»»¦»¯»¸»Á»Ê»Ó»Ü»å»î»÷¼¼ ¼¼¼$¼-¼6¼?¼H¼Q¼Z¼c¼l¼u¼~¼‡¼¼™¼¢¼«¼´¼½¼Æ¼Ï¼Ø¼á¼ê¼ó¼ü½½½½ ½)½2½;½D½M½V½_½h½q½z½ƒ½Œ½•½ž½§½°½¹½Â½Ë½Ô½Ý½æ½ï½ø¾¾ ¾¾¾%¾.¾7¾@¾I¾R¾[¾d¾m¾v¾¾ˆ¾‘¾š¾£¾¬¾µ¾¾¾Ç¾Ð¾Ù¾â¾ë¾ô¾ý¿¿¿¿!¿*¿3¿<¿E¿N¿W¿`¿i¿r¿{¿„¿¿–¿Ÿ¿¨¿±¿º¿Ã¿Ì¿Õ¿Þ¿ç¿ð¿ùÀÀ ÀÀÀ&À/À8ÀAÀJÀSÀ\ÀeÀnÀwÀ€À‰À’À›À¤À­À¶À¿ÀÈÀÑÀÚÀãÀìÀõÀþÁÁÁÁ"Á+Á4Á=ÁFÁOÁXÁaÁjÁsÁ|Á…ÁŽÁ—Á Á©Á²Á»ÁÄÁÍÁÖÁßÁèÁñÁú ÂÂÂ'Â0Â9ÂBÂKÂTÂ]ÂfÂoÂxŠ“œ¥®·ÂÀÂÉÂÒÂÛÂäÂíÂöÂÿÃÃÃÃ#Ã,Ã5Ã>ÃGÃPÃYÃbÃkÃtÃ}ÆÃØáêóüÃÅÃÎÃ×ÃàÃéÃòÃûÄÄ ÄÄÄ(Ä1Ä:ÄCÄLÄUÄ^ÄgÄpÄyĂċĔÄĦįĸÄÁÄÊÄÓÄÜÄåÄîÄ÷ÅÅ ÅÅÅ$Å-Å6Å?ÅHÅQÅZÅcÅlÅuÅ~ŇÅřŢūŴŽůÅÏÅØÅáÅêÅóÅüÆÆÆÆ Æ)Æ2Æ;ÆDÆMÆVÆ_ÆhÆqÆzƃƌƕƞƧưƹÆÂÆËÆÔÆÝÆæÆïÆøÇÇ ÇÇÇ%Ç.Ç7Ç@ÇIÇRÇ[ÇdÇmÇvÇLjǑǚǣǬǵǾÇÇÇÐÇÙÇâÇëÇôÇýÈÈÈÈ!È*È3È<ÈEÈNÈWÈ`ÈiÈrÈ{È„ÈȖȟȨȱȺÈÃÈÌÈÕÈÞÈçÈðÈùÉÉ ÉÉÉ&É/É8ÉAÉJÉSÉ\ÉeÉnÉwɀɉɒɛɤɭɶɿÉÈÉÑÉÚÉãÉìÉõÉþÊÊÊÊ"Ê+Ê4Ê=ÊFÊOÊXÊaÊjÊsÊ|ʅʎʗʠʩʲʻÊÄÊÍÊÖÊßÊèÊñÊúËË ËËË'Ë0Ë9ËBËKËTË]ËfËoËxËˊ˓˜˥ˮ˷ËÀËÉËÒËÛËäËíËöËÿÌÌÌÌ#Ì,Ì5Ì>ÌGÌPÌYÌbÌkÌtÌ}̆Ì̡̘̪̳̼ÌÅÌÎÌ×ÌàÌéÌòÌûÍÍ ÍÍÍ(Í1Í:ÍCÍLÍUÍ^ÍgÍpÍy͔͂͋Íͦͯ͸ÍÁÍÊÍÓÍÜÍåÍîÍ÷ÎÎ ÎÎÎ$Î-Î6Î?ÎHÎQÎZÎcÎlÎuÎ~·ÎÎ™Î¢Î«Î´Î½ÎÆÎÏÎØÎáÎêÎóÎüÏÏÏÏ Ï)Ï2Ï;ÏDÏMÏVÏ_ÏhÏqÏzσόϕϞϧϰϹÏÂÏËÏÔÏÝÏæÏïÏøÐÐ ÐÐÐ%Ð.Ð7Ð@ÐIÐRÐ[ÐdÐmÐvÐЈБКУЬеоÐÇÐÐÐÙÐâÐëÐôÐýÑÑÑÑ!Ñ*Ñ3Ñ<ÑEÑNÑWÑ`ÑiÑrÑ{Ñ„ÑіџѨѱѺÑÃÑÌÑÕÑÞÑçÑðÑùÒÒ ÒÒÒ&Ò/Ò8ÒAÒJÒSÒ\ÒeÒnÒwÒ€Ò‰Ò’Ò›Ò¤Ò­Ò¶Ò¿ÒÈÒÑÒÚÒãÒìÒõÒþÓÓÓÓ"Ó+Ó4Ó=ÓFÓOÓXÓaÓjÓsÓ|Ó…ÓŽÓ—Ó Ó©Ó²Ó»ÓÄÓÍÓÖÓßÓèÓñÓúÔÔ ÔÔÔ'Ô0Ô9ÔBÔKÔTÔ]ÔfÔoÔxÔԊԓԜԥԮԷÔÀÔÉÔÒÔÛÔäÔíÔöÔÿÕÕÕÕ#Õ,Õ5Õ>ÕGÕPÕYÕbÕkÕtÕ}Õ†ÕÕ˜Õ¡ÕªÕ³Õ¼ÕÅÕÎÕ×ÕàÕéÕòÕûÖÖ ÖÖÖ(Ö1Ö:ÖCÖLÖUÖ^ÖgÖpÖyÖ‚Ö‹Ö”ÖÖ¦Ö¯Ö¸ÖÁÖÊÖÓÖÜÖåÖîÖ÷×× ×××$×-×6×?×H×Q×Z×c×l×u×~ׇ×יע׫״׽ׯ×Ïר×á×ê×ó×üØØØØ Ø)Ø2Ø;ØDØMØVØ_ØhØqØz؃،ؕ؞اذعØÂØËØÔØÝØæØïØøÙÙ ÙÙÙ%Ù.Ù7Ù@ÙIÙRÙ[ÙdÙmÙvÙوّٚ٣٬ٵپÙÇÙÐÙÙÙâÙëÙôÙýÚÚÚÚ!Ú*Ú3Ú<ÚEÚNÚWÚ`ÚiÚrÚ{Ú„ÚÚ–ÚŸÚ¨Ú±ÚºÚÃÚÌÚÕÚÞÚçÚðÚùÛÛ ÛÛÛ&Û/Û8ÛAÛJÛSÛ\ÛeÛnÛwÛ€Û‰Û’Û›Û¤Û­Û¶Û¿ÛÈÛÑÛÚÛãÛìÛõÛþÜÜÜÜ"Ü+Ü4Ü=ÜFÜOÜXÜaÜjÜsÜ|܅܎ܗܠܩܻܲÜÄÜÍÜÖÜßÜèÜñÜúÝÝ ÝÝÝ'Ý0Ý9ÝBÝKÝTÝ]ÝfÝoÝxÝ݊ݓݜݥݮݷÝÀÝÉÝÒÝÛÝäÝíÝöÝÿÞÞÞÞ#Þ,Þ5Þ>ÞGÞPÞYÞbÞkÞtÞ}Þ†ÞÞ˜Þ¡ÞªÞ³Þ¼ÞÅÞÎÞ×ÞàÞéÞòÞûßß ßßß(ß1ß:ßCßLßUß^ßgßpßy߂ߋߔßߦ߯߸ßÁßÊßÓßÜßåßîß÷àà ààà$à-à6à?àHàQàZàcàlàuà~à‡àà™à¢à«à´à½àÆàÏàØàáàêàóàüáááá á)á2á;áDáMáVá_áháqázáƒáŒá•ážá§á°á¹áÂáËáÔáÝáæáïáøââ âââ%â.â7â@âIâRâ[âdâmâvââˆâ‘âšâ£â¬âµâ¾âÇâÐâÙâââëâôâýãããã!ã*ã3ã<ãEãNãWã`ãiãrã{ã„ãã–ãŸã¨ã±ãºãÃãÌãÕãÞãçãðãùää äää&ä/ä8äAäJäSä\äeänäwä€ä‰ä’ä›ä¤ä­ä¶ä¿äÈäÑäÚäãäìäõäþåååå"å+å4å=åFåOåXåaåjåså|å…åŽå—å å©å²å»åÄåÍåÖåßåèåñåúææ æææ'æ0æ9æBæKæTæ]æfæoæxææŠæ“æœæ¥æ®æ·æÀæÉæÒæÛæäæíæöæÿçççç#ç,ç5ç>çGçPçYçbçkçtç}ç†çç˜ç¡çªç³ç¼çÅçÎç×çàçéçòçûèè èèè(è1è:èCèLèUè^ègèpèyè‚è‹è”èè¦è¯è¸èÁèÊèÓèÜèåèîè÷éé ééé$é-é6é?éHéQéZécéléué~é‡éé™é¢é«é´é½éÆéÏéØéáéêéóéüêêêê ê)ê2ê;êDêMêVê_êhêqêzêƒêŒê•êžê§ê°ê¹êÂêËêÔêÝêæêïêøëë ëëë%ë.ë7ë@ëIëRë[ëdëmëvëëˆë‘ëšë£ë¬ëµë¾ëÇëÐëÙëâëëëôëýìììì!ì*ì3ì<ìEìNìWì`ìiìrì{ì„ìì–ìŸì¨ì±ìºìÃìÌìÕìÞìçìðìùíí ííí&í/í8íAíJíSí\íeíníwí€í‰í’í›í¤í­í¶í¿íÈíÑíÚíãíìíõíþîîîî"î+î4î=îFîOîXîaîjîsî|î…îŽî—î î©î²î»îÄîÍîÖîßîèîñîúïï ïïï'ï0ï9ïBïKïTï]ïfïoïxïïŠï“ïœï¥ï®ï·ïÀïÉïÒïÛïäïíïöïÿðððð#ð,ð5ð>ðGðPðYðbðkðtð}ð†ðð˜ð¡ðªð³ð¼ðÅðÎð×ðàðéðòðûññ ñññ(ñ1ñ:ñCñLñUñ^ñgñpñyñ‚ñ‹ñ”ññ¦ñ¯ñ¸ñÁñÊñÓñÜñåñîñ÷òò òòò$ò-ò6ò?òHòQòZòcòlòuò~ò‡òò™ò¢ò«ò´ò½òÆòÏòØòáòêòóòüóóóó ó)ó2ó;óDóMóVó_óhóqózóƒóŒó•óžó§ó°ó¹óÂóËóÔóÝóæóïóøôô ôôô%ô.ô7ô@ôIôRô[ôdômôvôôˆô‘ôšô£ô¬ôµô¾ôÇôÐôÙôâôëôôôýõõõõ!õ*õ3õ<õEõNõWõ`õiõrõ{õ„õõ–õŸõ¨õ±õºõÃõÌõÕõÞõçõðõùöö ööö&ö/ö8öAöJöSö\öeönöwö€ö‰ö’ö›ö¤ö­ö¶ö¿öÈöÑöÚöãöìöõöþ÷÷÷÷"÷+÷4÷=÷F÷O÷X÷a÷j÷s÷|÷…÷Ž÷—÷ ÷©÷²÷»÷Ä÷Í÷Ö÷ß÷è÷ñ÷úøø øøø'ø0ø9øBøKøTø]øføoøxøøŠø“øœø¥ø®ø·øÀøÉøÒøÛøäøíøöøÿùùùù#ù,ù5ù>ùGùPùYùbùkùtù}ù†ùù˜ù¡ùªù³ù¼ùÅùÎù×ùàùéùòùûúú úúú(ú1ú:úCúLúUú^úgúpúyú‚ú‹ú”úú¦ú¯ú¸úÁúÊúÓúÜúåúîú÷ûû ûûû$û-û6û?ûHûQûZûcûlûuû~û‡ûû™û¢û«û´û½ûÆûÏûØûáûêûóûüüüüü ü)ü2ü;üDüMüVü_ühüqüzüƒüŒü•üžü§ü°ü¹üÂüËüÔüÝüæüïüøýý ýýý%ý.ý7ý@ýIýRý[ýdýmývýýˆý‘ýšý£ý¬ýµý¾ýÇýÐýÙýâýëýôýýþþþþ!þ*þ3þ<þEþNþWþ`þiþrþ{þ„þþ–þŸþ¨þ±þºþÃþÌþÕþÞþçþðþùÿÿ ÿÿÿ&ÿ/ÿ8ÿAÿJÿSÿ\ÿeÿnÿwÿ€ÿ‰ÿ’ÿ›ÿ¤ÿ­ÿ¶ÿ¿ÿÈÿÑÿÚÿãÿìÿõÿþ"+4=FOXajs|…Ž— ©²»ÄÍÖßèñú '09BKT]foxŠ“œ¥®·ÀÉÒÛäíöÿ#,5>GPYbkt}†˜¡ª³¼ÅÎ×àéòû (1:CLU^gpy‚‹”¦¯¸ÁÊÓÜåî÷ $-6?HQZclu~‡™¢«´½ÆÏØáêóü )2;DMV_hqzƒŒ•ž§°¹ÂËÔÝæïø %.7@IR[dmvˆ‘𣬵¾ÇÐÙâëôý!*3<ENW`ir{„–Ÿ¨±ºÃÌÕÞçðù &/8AJS\enw€‰’›¤­¶¿ÈÑÚãìõþ    " + 4 = F O X a j s | … Ž —   © ² » Ä Í Ö ß è ñ ú     ' 0 9 B K T ] f o x  Š “ œ ¥ ® · À É Ò Û ä í ö ÿ    # , 5 > G P Y b k t } †  ˜ ¡ ª ³ ¼ Å Î × à é ò û     ( 1 : C L U ^ g p y ‚ ‹ ”  ¦ ¯ ¸ Á Ê Ó Ü å î ÷     $ - 6 ? H Q Z c l u ~ ‡  ™ ¢ « ´ ½ Æ Ï Ø á ê ó ü )2;DMV_hqzƒŒ•ž§°¹ÂËÔÝæïø %.7@IR[dmvˆ‘𣬵¾ÇÐÙâëôý!*3<ENW`ir{„–Ÿ¨±ºÃÌÕÞçðù &/8AJS\enw€‰’›¤­¶¿ÈÑÚãìõþ"+4=FOXajs|…Ž— ©²»ÄÍÖßèñú '09BKT]foxŠ“œ¥®·ÀÉÒÛäíöÿ#,5>GPYbkt}†˜¡ª³¼ÅÎ×àéòû (1:CLU^gpy‚‹”¦¯¸ÁÊÓÜåî÷ $-6?HQZclu~‡™¢«´½ÆÏØáêóü )2;DMV_hqzƒŒ•ž§°¹ÂËÔÝæïø %.7@IR[dmvˆ‘𣬵¾ÇÐÙâëôý!*3<ENW`ir{„–Ÿ¨±ºÃÌÕÞçðù &/8AJS\enw€‰’›¤­¶¿ÈÑÚãìõþ"+4=FOXajs|…Ž— ©²»ÄÍÖßèñú '09BKT]foxŠ“œ¥®·ÀÉÒÛäíöÿ#,5>GPYbkt}†˜¡ª³¼ÅÎ×àéòû (1:CLU^gpy‚‹”¦¯¸ÁÊÓÜåî÷ $-6?HQZclu~‡™¢«´½ÆÏØáêóü     ) 2 ; D M V _ h q z ƒ Œ • ž § ° ¹ Â Ë Ô Ý æ ï ø!! !!!%!.!7!@!I!R![!d!m!v!!ˆ!‘!š!£!¬!µ!¾!Ç!Ð!Ù!â!ë!ô!ý""""!"*"3"<"E"N"W"`"i"r"{"„""–"Ÿ"¨"±"º"Ã"Ì"Õ"Þ"ç"ð"ù## ###&#/#8#A#J#S#\#e#n#w#€#‰#’#›#¤#­#¶#¿#È#Ñ#Ú#ã#ì#õ#þ$$$$"$+$4$=$F$O$X$a$j$s$|$…$Ž$—$ $©$²$»$Ä$Í$Ö$ß$è$ñ$ú%% %%%'%0%9%B%K%T%]%f%o%x%%Š%“%œ%¥%®%·%À%É%Ò%Û%ä%í%ö%ÿ&&&&#&,&5&>&G&P&Y&b&k&t&}&†&&˜&¡&ª&³&¼&Å&Î&×&à&é&ò&û'' '''('1':'C'L'U'^'g'p'y'‚'‹'”''¦'¯'¸'Á'Ê'Ó'Ü'å'î'÷(( ((($(-(6(?(H(Q(Z(c(l(u(~(‡((™(¢(«(´(½(Æ(Ï(Ø(á(ê(ó(ü)))) )))2);)D)M)V)_)h)q)z)ƒ)Œ)•)ž)§)°)¹)Â)Ë)Ô)Ý)æ)ï)ø** ***%*.*7*@*I*R*[*d*m*v**ˆ*‘*š*£*¬*µ*¾*Ç*Ð*Ù*â*ë*ô*ý++++!+*+3+<+E+N+W+`+i+r+{+„++–+Ÿ+¨+±+º+Ã+Ì+Õ+Þ+ç+ð+ù,, ,,,&,/,8,A,J,S,\,e,n,w,€,‰,’,›,¤,­,¶,¿,È,Ñ,Ú,ã,ì,õ,þ----"-+-4-=-F-O-X-a-j-s-|-…-Ž-—- -©-²-»-Ä-Í-Ö-ß-è-ñ-ú.. ...'.0.9.B.K.T.].f.o.x..Š.“.œ.¥.®.·.À.É.Ò.Û.ä.í.ö.ÿ////#/,/5/>/G/P/Y/b/k/t/}/†//˜/¡/ª/³/¼/Å/Î/×/à/é/ò/û00 000(010:0C0L0U0^0g0p0y0‚0‹0”00¦0¯0¸0Á0Ê0Ó0Ü0å0î0÷11 111$1-161?1H1Q1Z1c1l1u1~1‡11™1¢1«1´1½1Æ1Ï1Ø1á1ê1ó1ü2222 2)222;2D2M2V2_2h2q2z2ƒ2Œ2•2ž2§2°2¹2Â2Ë2Ô2Ý2æ2ï2ø33 333%3.373@3I3R3[3d3m3v33ˆ3‘3š3£3¬3µ3¾3Ç3Ð3Ù3â3ë3ô3ý4444!4*434<4E4N4W4`4i4r4{4„44–4Ÿ4¨4±4º4Ã4Ì4Õ4Þ4ç4ð4ù55 555&5/585A5J5S5\5e5n5w5€5‰5’5›5¤5­5¶5¿5È5Ñ5Ú5ã5ì5õ5þ6666"6+646=6F6O6X6a6j6s6|6…6Ž6—6 6©6²6»6Ä6Í6Ö6ß6è6ñ6ú77 777'70797B7K7T7]7f7o7x77Š7“7œ7¥7®7·7À7É7Ò7Û7ä7í7ö7ÿ8888#8,858>8G8P8Y8b8k8t8}8†88˜8¡8ª8³8¼8Å8Î8×8à8é8ò8û99 999(919:9C9L9U9^9g9p9y9‚9‹9”99¦9¯9¸9Á9Ê9Ó9Ü9å9î9÷:: :::$:-:6:?:H:Q:Z:c:l:u:~:‡::™:¢:«:´:½:Æ:Ï:Ø:á:ê:ó:ü;;;; ;);2;;;D;M;V;_;h;q;z;ƒ;Œ;•;ž;§;°;¹;Â;Ë;Ô;Ý;æ;ï;ø<< <<<%<.<7<@> >>>&>/>8>A>J>S>\>e>n>w>€>‰>’>›>¤>­>¶>¿>È>Ñ>Ú>ã>ì>õ>þ????"?+?4?=?F?O?X?a?j?s?|?…?Ž?—? ?©?²?»?Ä?Í?Ö?ß?è?ñ?ú@@ @@@'@0@9@B@K@T@]@f@o@x@@Š@“@œ@¥@®@·@À@É@Ò@Û@ä@í@ö@ÿAAAA#A,A5A>AGAPAYAbAkAtA}A†AA˜A¡AªA³A¼AÅAÎA×AàAéAòAûBB BBB(B1B:BCBLBUB^BgBpByB‚B‹B”BB¦B¯B¸BÁBÊBÓBÜBåBîB÷CC CCC$C-C6C?CHCQCZCcClCuC~C‡CC™C¢C«C´C½CÆCÏCØCáCêCóCüDDDD D)D2D;DDDMDVD_DhDqDzDƒDŒD•DžD§D°D¹DÂDËDÔDÝDæDïDøEE EEE%E.E7E@EIERE[EdEmEvEEˆE‘EšE£E¬EµE¾EÇEÐEÙEâEëEôEýFFFF!F*F3F<FEFNFWF`FiFkFmFoFqFsFuFwFyF{F}FFFƒF…F‡F‰F‹FFF‘F“F•F—F™F›FFŸF¡F£F¥F§F¬F±F¶F»FÀFÅFÊFÏFÔFÙFÞFãFèFíFòF÷FüGGGG GGGGG#G%G'G,G1G3G8G=GBGGGLGQGVG[G`GeGjGoGtGyG~GƒGˆGG’G—GœG¡G¦G«G°GµGºG¿GÄGÉGÎGÓGØGÝGâGçGìGñGöGûHHH HHHHH#H(H-H2H7H<HAHFHKHPHUHZH_HdHiHnHsHxH}H‚H‡HŒH‘H–H›H H¥HªH¯H´H¹H¾HÃHÈHÍHÒH×HÜHáHæHëHðHõHúHÿII IIIII"I'I,I1I6I;I@IEIJIOITIYI^IcIhImIrIwI|II†I‹II•IšIŸI¤I©I®I³I¸I½IÂIÇIÌIÑIÖIÛIàIåIêIïIôIùIþJJJ JJJJ!J&J+J0J5J:J?JDJIJNJSJXJ]JbJgJlJqJvJ{J€J…JŠJJ”J™JžJ£J¨J­J²J·J¼JÁJÆJËJÐJÕJÚJßJäJéJîJóJøJýKKK KKKK K%K*K/K4K9K>KCKHKMKRKWK\KaKfKkKpKuKzKK„K‰KŽK“K˜KK¢K§K¬K±K¶K»KÀKÅKÊKÏKÔKÙKÞKãKèKíKòK÷KüLLL LLLLL$L)L.L3L8L=LBLGLLLQLVL[L`LeLjLoLtLyL~LƒLˆLL’L—LœL¡L¦L«L°LµLºL¿LÄLÉLÎLÓLØLÝLâLçLìLñLöLûMMM MMMMM#M(M-M2M7M<MAMFMKMPMUMZM_MdMiMnMsMxM}M‚M‡MŒM‘M–M›M M¥MªM¯M´M¹M¾MÃMÈMÍMÒM×MÜMáMæMëMðMõMúMÿNN NNNNN"N'N,N1N6N;N@NENJNONTNYN^NcNhNmNrNwN|NN†N‹NN•NšNŸN¤N©N®N³N¸N½NÂNÇNÌNÑNÖNÛNàNåNêNïNôNùNþOOO OOOO!O&O+O0O5O:O?ODOIONOSOXO]ObOgOlOqOvO{O€O…OŠOO”O™OžO£O¨O­O²O·O¼OÁOÆOËOÐOÕOÚOßOäOéOîOóOøOýPPP PPPP P%P*P/P4P9P>PCPHPMPRPWP\PaPfPkPpPuPzPP„P‰PŽP“P˜PP¢P§P¬P±P¶P»PÀPÅPÊPÏPÔPÙPÞPãPèPíPòP÷PüQQQ QQQQQ$Q)Q.Q3Q8Q=QBQGQLQQQVQ[Q`QeQjQoQtQyQ~QƒQˆQQ’Q—QœQ¡Q¦Q«Q°QµQºQ¿QÄQÉQÎQÓQØQÝQâQçQìQñQöQûRRR RRRRR#R(R-R2R7R<RARFRKRPRURZR_RdRiRnRsRxR}R‚R‡RŒR‘R–R›R R¥RªR¯R´R¹R¾RÃRÈRÍRÒR×RÜRáRæRëRðRõRúRÿSS SSSSS"S'S,S1S6S;S@SESJSOSTSYS^ScShSmSrSwS|SS†S‹SS•SšSŸS¤S©S®S³S¸S½SÂSÇSÌSÑSÖSÛSàSåSêSïSôSùSþTTT TTTT!T&T+T0T5T:T?TDTITNTSTXT]TbTgTlTqTvT{T€T…TŠTT”T™TžT£T¨T­T²T·T¼TÁTÆTËTÐTÕTÚTßTäTéTîTóTøTýUUU UUUU U%U*U/U4U9U>UCUHUMURUWU\UaUfUkUpUuUzUU„U‰UŽU“U˜UU¢U§U¬U±U¶U»UÀUÅUÊUÏUÔUÙUÞUãUèUíUòU÷UüVVV VVVVV$V)V.V3V8V=VBVGVLVQVVV[V`VeVjVoVtVyV~VƒVˆVV’V—VœV¡V¦V«V°VµVºV¿VÄVÉVÎVÓVØVÝVâVçVìVñVöVûWWW WWWWW#W(W-W2W7W<WAWFWKWPWUWZW_WdWiWnWsWxW}W‚W‡WŒW‘W–W›W W¥WªW¯W´W¹W¾WÃWÈWÍWÒW×WÜWáWæWëWðWõWúWÿXX XXXXX"X'X,X1X6X;X@XEXJXOXTXYX^XcXhXmXrXwX|XX†X‹XX•XšXŸX¤X©X®X³X¸X½XÂXÇXÌXÑXÖXÛXàXåXêXïXôXùXþYYY YYYY!Y&Y+Y0Y5Y:Y?YDYIYNYSYXY]YbYgYlYqYvY{Y€Y…YŠYY”Y™YžY£Y¨Y­Y²Y·Y¼YÁYÆYËYÐYÕYÚYßYäYéYîYóYøYýZZZ ZZZZ Z%Z*Z/Z4Z9Z>ZCZHZMZRZWZ\ZaZfZkZpZuZzZZ„Z‰ZŽZ“Z˜ZZ¢Z§Z¬Z±Z¶Z»ZÀZÅZÊZÏZÔZÙZÞZãZèZíZòZ÷Zü[[[ [[[[[$[)[.[3[8[=[B[G[L[Q[V[[[`[e[j[o[t[y[~[ƒ[ˆ[[’[—[œ[¡[¦[«[°[µ[º[¿[Ä[É[Î[Ó[Ø[Ý[â[ç[ì[ñ[ö[û\\\ \\\\\#\(\-\2\7\<\A\F\K\P\U\Z\_\d\i\n\s\x\}\‚\‡\Œ\‘\–\›\ \¥\ª\¯\´\¹\¾\Ã\È\Í\Ò\×\Ü\á\æ\ë\ð\õ\ú\ÿ]] ]]]]]"]'],]1]6];]@]E]J]O]T]Y]^]c]h]m]r]w]|]]†]‹]]•]š]Ÿ]¤]©]®]³]¸]½]Â]Ç]Ì]Ñ]Ö]Û]à]å]ê]ï]ô]ù]þ^^^ ^^^^!^&^+^0^5^:^?^D^I^N^S^X^]^b^g^l^q^v^{^€^…^Š^^”^™^ž^£^¨^­^²^·^¼^Á^Æ^Ë^Ð^Õ^Ú^ß^ä^é^î^ó^ø^ý___ ____ _%_*_/_4_9_>_C_H_M_R_W_\_a_f_k_p_u_z__„_‰_Ž_“_˜__¢_§_¬_±_¶_»_À_Å_Ê_Ï_Ô_Ù_Þ_ã_è_í_ò_÷_ü``` `````$`)`.`3`8`=`B`G`L`Q`V`[```e`j`o`t`y`~`ƒ`ˆ``’`—`œ`¡`¦`«`°`µ`º`¿`Ä`É`Î`Ó`Ø`Ý`â`ç`ì`ñ`ö`ûaaa aaaaa#a(a-a2a7a<aAaFaKaPaUaZa_adaianasaxa}a‚a‡aŒa‘a–a›a a¥aªa¯a´a¹a¾aÃaÈaÍaÒa×aÜaáaæaëaðaõaúaÿbb bbbbb"b'b,b1b6b;b@bEbJbObTbYb^bcbhbmbrbwb|bb†b‹bb•bšbŸb¤b©b®b³b¸b½bÂbÇbÌbÑbÖbÛbàbåbêbïbôbùbþccc cccc!c&c+c0c5c:c?cDcIcNcScXc]cbcgclcqcvc{c€c…cŠcc”c™cžc£c¨c­c²c·c¼cÁcÆcËcÐcÕcÚcßcäcécîcócøcýddd dddd d%d*d/d4d9d>dCdHdMdRdWd\dadfdkdpdudzdd„d‰dŽd“d˜dd¢d§d¬d±d¶d»dÀdÅdÊdÏdÔdÙdÞdãdèdídòd÷düeee eeeee$e)e.e3e8e=eBeGeLeQeVe[e`eeejeoeteye~eƒeˆee’e—eœe¡e¦e«e°eµeºe¿eÄeÉeÎeÓeØeÝeâeçeìeñeöeûfff fffff#f(f-f2f7f<fAfFfKfPfUfZf_fdfifnfsfxf}f‚f‡fŒf‘f–f›f f¥fªf¯f´f¹f¾fÃfÈfÍfÒf×fÜfáfæfëfðfõfúfÿgg ggggg"g'g,g1g6g;g@gEgJgOgTgYg^gcghgmgrgwg|gg†g‹gg•gšgŸg¤g©g®g³g¸g½gÂgÇgÌgÑgÖgÛgàgågêgïgôgùgþhhh hhhh!h&h+h0h5h:h?hDhIhNhShXh]hbhghlhqhvh{h€h…hŠhh”h™hžh£h¨h­h²h·h¼hÁhÆhËhÐhÕhÚhßhähéhîhóhøhýiii iiii i%i*i/i4i9i>iCiHiMiRiWi\iaifikipiuizii„i‰iŽi“i˜ii¢i§i¬i±i¶i»iÀiÅiÊiÏiÔiÙiÞiãièiíiòi÷iüjjj jjjjj"j'j,j1j6j;j@jEjJjOjTjWj\jajfjkjpjujzjj„j‰jŽj‘j–j›j j¥jªj¯j²j·j¼jÁjÆjËjÐjÕjÚjßjäjéjîjójøjýkkk kkkkk#k&k)k.k3k8k;k@kEkJkOkTkYk^kckhkkkpkskxk}k‚k‡kŒk‘k–k›k k¥kªk¯k´k·k¼k¿kÄkÉkÌkÑkÖkÛkàkåkêkïkôkùkþlll lllll"l'l,l1l4l9l>lClHlMlPlUlXl]lblglllqlvl{l€l…lŠll’l•l˜ll¢l§l¬l±l´l¹l¾lÃlÈlÍlÒl×lÜlálælëlðlõlúlÿmm mmmmm"m'm,m1m6m;m@mEmJmOmRmWm\mamfmkmpmumzmm„m‡mŒmm”m™mžm£m¨m­m²m·mºm¿mÄmÉmÎmÓmØmÛmàmåmêmïmômùmünnn nnnnn$n)n.n3n8n=nBnEnJnOnTnWn\nanfnknnnsnxn}n‚n‡nŒn‘n”n™nžn£n¦n«n®n³n¸n½nÀnÅnÊnÍnÒn×nÜnánænënðnónønýoooo ooooo"o'o,o1o6o;o@oEoJoOoToYo^ocohomorowo|oo†o‹oo•ošoo¢o§oªo¯o´o¹o¼oÁoÆoËoÐoÓoØoÝoàoåoêoïoôoùoüoÿpp p ppppp#p(p-p2p5p:p?pDpIpNpSpXp]pbpgpjpoptpyp|pp†p‹pŽp‘p–p›pžp£p¦p©p®p±p´p¹p¼pÁpÆpËpÐpÕpÚpÝpâpçpìpñpôpùpþqqq qqqqq$q)q,q1q6q;q@qEqHqMqRqWqZq_qdqgqlqoqtqyq~qq†q‰qŽq“q˜q›q q¥qªq­q²q·q¼q¿qÄqÉqÎqÓqØqÛqàqåqèqëqðqõqúqýrrr rrrrr#r(r+r0r5r:r=rBrErJrMrRrWr\r_rbrgrjrortryr|rr†r‹rŽr“r˜rr¢r§rªr¯r´r¹r¼rÁrÄrÉrÎrÓrØrÝràrårêrïrôrùrüsss sssss"s's,s1s6s;s>sCsFsKsPsUsXs]sbsgslsqsvs{s€s…sˆss’s•sšss¢s§sªs¯s´s¹s¼sÁsÆsÉsÌsÑsÖsÛsÞsãsèsísòsõsúsÿtt ttttt t%t*t-t2t7t<t?tDtItLtQtTtYt^tcthtmtrtutztt„t‰tŽt“t˜tt¢t§t¬t±t´t¹t¾tÃtÈtÍtÒt×tÜtátætëtðtõtútÿuu uuuuu u%u(u-u2u7u:u?uBuGuLuOuTuWu\u_uduiuluqutuyu~uƒuˆuu’u—ušuŸu¤u©u¬u¯u´u¹u¾uÃuÈuÍuÒu×uÜuáuæuëuðuõuúuÿvv vvvvv"v'v,v/v4v9v<v?vDvGvLvQvVvYv^vcvhvmvrvwv|vv„v‰vŽv‘v–v›v v£v¨v­v²v·v¼vÁvÆvËvÐvÓvØvÝvâvçvìvñvövûwww wwwww!w$w)w,w1w6w;w>wCwHwMwRwWw\wawfwkwpwuwxw}w‚w‡wŒw‘w–w›w w¥w¨w­w²w·wºw¿wÄwÉwÎwÓwØwÝwâwçwìwñwöwûxxxx xxxx!x&x+x0x5x8x=xBxGxLxQxTxYx^xaxfxixnxqxvx{x~xƒx†x‹xx“x–x›x x¥xªx¯x´x·x¼x¿xÄxÉxÎxÑxÖxÛxàxåxêxïxôxùxþyyy yyyyy$y)y.y1y6y;y@yEyJyOyTyYy^ycyhymyrywy|yy†y‹yy•yšyŸy¤y©y®y³y¸y½yÂyÇyÌyÑyÖyÛyàyåyèyíyòy÷yüzzz zzzzz$z)z.z1z6z;z@zEzJzOzTzYz\zazfzkznzszxz}z€zƒzˆzz’z—zšzŸz¢z§zªz¯z²z·z¼z¿zÄzÉzÎzÓzØzÛzàzåzêzïzôzùzþ{{{ {{{{!{&{+{0{5{:{?{D{I{N{Q{V{[{`{e{j{o{t{y{~{ƒ{ˆ{{’{—{œ{¡{¦{©{®{³{¸{½{Â{Ç{Ì{Ñ{Ö{Û{à{å{ê{ï{ô{ù{þ||| ||||!|$|)|.|3|8|=|B|G|L|Q|T|Y|\|a|f|k|p|u|x|}|‚|‡|Œ|‘|–|›| |¥|ª|¯|´|¹|¾|Ã|È|Í|Ò|×|Ü|á|æ|ë|ð|õ|ú|ÿ}}} }}}} }#}(}-}2}7}<}A}F}K}P}U}Z}_}d}i}n}s}x}}}‚}‡}Œ}‘}–}›} }¥}¨}­}²}·}¼}Á}Æ}Ë}Ð}Õ}Ú}ß}ä}é}î}ó}ø}û~~~ ~~~~~#~&~+~0~5~:~?~D~I~N~S~X~]~b~g~l~q~v~{~€~…~Š~~’~—~œ~Ÿ~¤~©~®~³~¶~»~À~Å~Ê~Ï~Ô~×~Ü~á~ä~é~î~ó~ø~ý  %*/49>CHMRW\afkpuz}‚‡Œ‘”™ž£¨­²·¼ÁÆËÐÕÚßäéîóøý€€€ €€€€ €%€*€/€4€7€<€A€D€I€L€Q€V€[€`€e€j€o€t€y€~€ƒ€ˆ€€’€—€œ€¡€¦€«€°€µ€º€¿€Ä€É€Î€Ó€Ø€Ý€â€ç€ì€ñ€ö€û #(-27<AFKPUZ_dinsx}‚‡Œ‘–› ¥ª¯´¹¾ÃÈÍÒ×Üáæëðóøý‚‚‚ ‚‚‚‚ ‚%‚*‚/‚4‚9‚>‚C‚F‚K‚P‚U‚Z‚_‚d‚i‚n‚s‚x‚}‚‚‚‡‚Œ‚‘‚–‚›‚ ‚¥‚ª‚­‚²‚·‚¼‚¿‚Ăɂ΂ӂ؂݂â‚ç‚ê‚ï‚ô‚ù‚þƒƒƒ ƒƒƒƒ!ƒ&ƒ+ƒ0ƒ5ƒ:ƒ?ƒDƒIƒNƒSƒXƒ]ƒbƒgƒlƒqƒvƒ{ƒ€ƒ…ƒŠƒƒ”ƒ™ƒžƒ£ƒ¨ƒ­ƒ²ƒ·ƒ¼ƒÁƒÆƒËƒÐƒÕƒÚƒßƒäƒéƒîƒóƒøƒý„„„ „„„„„#„(„-„2„7„:„?„B„G„J„O„T„W„\„a„f„k„p„s„x„{„€„…„Š„„’„—„š„Ÿ„¤„©„®„³„¸„»„À„Å„Ê„Í„Ò„×„Ü„á„æ„ë„ð„õ„ø„ý……… ………… …%…*…/…4…9…>…C…H…M…R…W…Z…_…d…i…n…s…x…}…‚…‡…Œ…‘…–…›… …¥…ª…¯…´…¹…¾…Ã…È…Í…Ò…×…Ü…á…æ…ë…ð…õ…ú…ÿ†† ††††† †#†(†-†2†5†:†?†D†I†N†S†X†]†b†g†l†q†v†{†€†…†Š††”†™†ž†£†¨†­†²†·†¼†¿†Ä†É†Î†Ó†Ø†Ý†â†ç†ì†ñ†ö†û†þ‡‡‡ ‡‡‡‡‡$‡)‡.‡3‡8‡=‡B‡G‡L‡Q‡V‡Y‡^‡a‡f‡k‡p‡u‡z‡}‡‚‡‡‡Œ‡‘‡–‡›‡ ‡¥‡ª‡¯‡²‡·‡¼‡Á‡Æ‡Ë‡Ð‡Õ‡Ú‡Ý‡â‡ç‡ê‡í‡ò‡÷‡ú‡ÿˆˆ ˆˆˆˆˆ ˆ%ˆ(ˆ+ˆ0ˆ5ˆ:ˆ?ˆDˆIˆNˆSˆXˆ]ˆbˆgˆlˆoˆtˆyˆ~ˆƒˆˆˆˆ’ˆ—ˆœˆ¡ˆ¦ˆ«ˆ°ˆµˆ¸ˆ½ˆÀˆÅˆÊˆÏˆÒˆ×ˆÜˆßˆäˆéˆìˆñˆöˆû‰‰‰‰ ‰‰‰‰‰"‰'‰,‰1‰6‰;‰@‰E‰J‰O‰T‰Y‰^‰c‰h‰m‰r‰w‰|‰‰„‰‰‰Ž‰“‰˜‰‰¢‰§‰ª‰¯‰´‰¹‰¼‰Á‰Æ‰Ë‰Ð‰Õ‰Ú‰ß‰ä‰é‰ì‰ñ‰ô‰ù‰þŠŠŠ ŠŠŠŠ!Š&Š+Š0Š5Š:Š?ŠDŠIŠNŠSŠXŠ]Š`ŠeŠjŠmŠrŠwŠzŠŠ„ЉŠŽŠ“Š–Š›Š Š¥ŠªНŠ´йоŠÃŠÈŠÍŠÒŠ×ŠÜŠáŠæŠéŠîŠóŠøŠý‹‹‹ ‹‹‹‹‹‹$‹)‹.‹3‹8‹=‹B‹G‹L‹Q‹V‹[‹`‹e‹h‹m‹r‹w‹|‹‹†‹‹‹‹•‹š‹Ÿ‹¤‹©‹¬‹±‹¶‹»‹À‹Å‹Ê‹Ï‹Ô‹Ù‹Þ‹ã‹è‹í‹ð‹õ‹ú‹ÿŒŒ ŒŒŒŒŒ"Œ%Œ*Œ-Œ2Œ7Œ<ŒAŒFŒKŒPŒUŒXŒ]ŒbŒgŒlŒqŒvŒ{Œ~ŒƒŒ†Œ‹ŒŒ•ŒšŒŒ¢Œ¥ŒªŒ¯Œ´Œ¹Œ¾ŒÃŒÈŒÍŒÒŒ×ŒÜŒáŒæŒëŒðŒõŒúŒÿ  %*/49>CHMRW\afknsx}‚‡Œ‘–™œ¡¦«°µº½ÂÅÊÏÒÕÚÝàåêïô÷üŽŽŽ ŽŽŽŽŽ Ž%Ž*Ž-Ž2Ž7Ž<ŽAŽFŽKŽPŽSŽXŽ]ŽbŽgŽjŽoŽrŽwŽ|ŽކŽ‹ŽŽ•ŽšŽŸޤާެޱ޶Ž»ŽÀŽÅŽÊŽÏŽÔŽÙŽÞŽãŽèŽíŽòŽ÷Žü $).38;@EJOTW\afkpuz„‰Ž“˜¢§ª¯´¹¾ÁÆËÐÕÚßäéîóøý #(+05:?DINSX]bglotwz„‰Ž‘–› ¥ª¯²·º¿ÄÇÌÑÖÛàåêïôùþ‘‘‘ ‘‘‘‘‘"‘'‘,‘1‘6‘;‘@‘E‘J‘O‘T‘Y‘^‘c‘h‘m‘r‘w‘|‘‘†‘‹‘‘•‘š‘‘ ‘¥‘ª‘¯‘´‘·‘¼‘Á‘ƑˑБՑڑߑä‘é‘ì‘ñ‘ö‘û’’’ ’’’’’#’(’-’2’7’<’A’F’K’P’U’Z’_’d’i’n’s’x’}’‚’‡’Œ’‘’–’›’ ’¥’ª’¯’´’¹’¾’Á’Ä’É’Î’Ó’Ø’Ý’â’ç’ì’ñ’ö’û“““ “““““#“(“-“2“7“<“A“F“K“P“U“Z“_“b“g“l“q“v“{“€“…“Š““”“™“ž“£“¨“­“²“·“¼“¿““Ǔ̓ѓ֓ۓà“å“ê“ï“ô“ù“þ””” ” ”””””!”$”)”.”3”8”;”@”E”H”M”R”W”\”a”f”i”n”s”x”}”‚”…”Š””””™”ž”£”¨”­”²”·”¼”¿”ĔɔΔє֔۔à”å”è”ë”ð”õ”ú”ÿ••• •••••!•&•+•.•3•6•;•@•C•H•K•P•U•Z•_•d•i•n•s•x•}•‚•‡•Œ••”•™•ž•£•¨•­•²•·•¼•Á•ƕ˕ЕՕڕݕà•å•ê•í•ò•÷•ü––– –––––"–'–,–1–6–;–@–E–J–O–T–Y–^–c–h–m–r–w–z––„–‰–Ž–“–˜––¢–§–¬–¯–´–¹–¾–ÖȖ͖Җזܖߖä–é–î–ó–ø–ý——— —————#—(—-—2—7—<—A—F—K—P—U—Z—_—d—i—n—s—x—}—‚—‡—Œ—‘—–—›— —¥—ª—­—²—·—º—¿—Â—Ç—Ì—Ñ—Ö—Û—Þ—ã—æ—ë—ð—ó—ø—ý˜˜˜ ˜˜˜˜˜#˜&˜+˜0˜5˜8˜=˜B˜G˜L˜Q˜V˜[˜`˜e˜j˜o˜t˜y˜~˜ƒ˜ˆ˜˜’˜—˜š˜Ÿ˜¢˜§˜¬˜±˜´˜¹˜¼˜Á˜Ä˜Ç˜Ì˜Ï˜Ò˜×˜Ü˜á˜æ˜ë˜ð˜õ˜ú˜ÿ™™ ™™™™™"™'™,™1™6™;™@™E™J™O™T™Y™^™c™f™k™p™u™z™™„™‰™Œ™‘™–™™™œ™¡™¦™«™°™µ™º™¿™Ä™É™Î™Ñ™Ö™Ù™Þ™á™æ™ë™î™ó™ø™ýššš ššššš#š(š+š0š5š8š=šBšGšLšQšVš[š`šcšhšmšršwš|šš„š‰šŒš‘š–š›š š¥šªš¯š´š¹š¾šÃšÈšÍšÒš×šÜšášæšëšðšõšøšý››› ›››› ›%›*›/›4›9›>›C›F›I›N›S›X›]›b›g›l›q›v›{›€›…›Š››”›™›ž›£›¨›­›²›·›º›¿›Â›Ç›Ì›Ñ›Ö›Û›à›å›ê›í›ò›÷›üœœœ œœœœœ"œ'œ*œ/œ2œ7œ<œ?œDœGœLœOœTœYœ^œcœfœkœnœqœvœ{œ€œ…œˆœœ’œ•œšœŸœ¤œ©œ®œ³œ¸œ½œÂœÇœÊœÏœÔœÙœÞœãœèœëœðœóœøœý !&+.38=BEJOTY^chkpuz}‚…Š”™ž£¨­²·¼ÁÆËÐÕÚßäéìñöûžžž žžžžž#ž&ž+ž0ž5ž:ž=žBžGžLžQžVž[ž`žežjžožtžwž|žž„ž‰žŽž“ž–ž›žžž£ž¦ž©ž®ž³ž¸ž½žÂžÇžÌžÑžÖžÙžÞžãžæžëžðžõžúžÿŸŸ ŸŸŸŸŸ Ÿ%Ÿ(Ÿ-Ÿ0Ÿ5Ÿ:Ÿ?ŸDŸIŸNŸSŸXŸ]ŸbŸgŸlŸqŸvŸ{Ÿ€ŸƒŸˆŸ‹ŸŸ•ŸšŸŸŸ¤Ÿ©Ÿ®Ÿ³Ÿ¸Ÿ½ŸÂŸÇŸÊŸÏŸÔŸÙŸÜŸáŸäŸéŸîŸóŸöŸùŸþ        ! & + 0 5 : ? D I L Q V [ ^ c h m p u x } ‚ ‡ Œ ‘ – › ž £ ¨ ­ ² µ º ¿ Ä É Î Ó Ø Ý â ç ì ñ ö û¡¡¡ ¡¡¡¡¡#¡(¡-¡2¡7¡<¡A¡F¡K¡P¡U¡Z¡_¡d¡i¡n¡s¡x¡}¡‚¡‡¡Œ¡‘¡–¡›¡ ¡¥¡ª¡¯¡´¡¹¡¾¡Ã¡È¡Í¡Ò¡×¡Ü¡á¡æ¡ë¡ð¡õ¡ú¡ÿ¢¢ ¢¢¢¢¢"¢'¢,¢1¢6¢;¢@¢E¢J¢O¢T¢Y¢^¢c¢h¢m¢r¢w¢|¢¢†¢‹¢¢•¢š¢Ÿ¢¤¢©¢®¢³¢¸¢½¢Â¢Ç¢Ì¢Ñ¢Ö¢Û¢à¢å¢ê¢ï¢ô¢ù¢þ££££*£;£L£]£n£££¡£²£Ã£Ô£å£ö¤¤¤)¤:¤K¤\¤m¤~¤¤ ¤±¤Â¤Ó¤ä¤õ¥¥¥(¥9¥J¥[¥l¥}¥Ž¥Ÿ¥°¥Á¥Ò¥ã¥ô¦¦¦'¦8¦I¦Z¦k¦|¦¦ž¦¯¦À¦Ñ¦â¦ó§§§&§7§H§Y§j§{§Œ§§®§¿§Ð§á§ò¨¨¨%¨6¨G¨X¨i¨z¨‹¨œ¨­¨¾¨Ï¨à¨ñ©©©$©5©F©W©h©y©Š©›©¬©½©Î©ß©ðªªª#ª4ªEªVªgªxª‰ªšª«ª¼ªÍªÞªï«««"«3«D«U«f«w«ˆ«™«ª«»«Ì«Ý«î«ÿ¬¬!¬2¬C¬T¬e¬v¬‡¬˜¬©¬º¬Ë¬Ü¬í¬þ­­ ­1­B­S­d­u­†­—­¨­¹­Ê­Û­ì­ý®®®0®A®R®c®t®…®–®§®¸®É®Ú®ë®ü¯ ¯¯/¯@¯Q¯b¯s¯„¯•¯¦¯·¯È¯Ù¯ê¯û° °°.°?°P°a°r°ƒ°”°¥°¶°Ç°Ø°é°ú± ±±-±>±O±`±q±‚±“±¤±µ±Æ±×±è±ù² ²²,²=²N²_²p²²’²£²´²Å²Ö²ç²ø³ ³³+³<³M³^³o³€³‘³¢³³³Ä³Õ³æ³÷´´´*´;´L´]´n´´´¡´²´Ã´Ô´å´öµµµ)µ:µKµ\µmµ~µµ µ±µÂµÓµäµõ¶¶¶(¶9¶J¶[¶l¶}¶Ž¶Ÿ¶°¶Á¶Ò¶ã¶ô···'·8·I·Z·k·|··ž·¯·À·Ñ·â·ó¸¸¸&¸7¸H¸Y¸j¸{¸Œ¸¸®¸¿¸Ð¸á¸ò¹¹¹%¹6¹G¹X¹i¹z¹‹¹œ¹­¹¾¹Ï¹à¹ñººº$º5ºFºWºhºyºŠº›º¬º½ºÎºßºð»»»#»4»E»V»g»x»‰»š»«»¼»Í»Þ»ï¼¼¼"¼3¼D¼U¼f¼w¼ˆ¼™¼ª¼»¼Ì¼Ý¼î¼ÿ½½!½2½C½T½e½v½‡½˜½©½º½Ë½Ü½í½þ¾¾ ¾1¾B¾S¾d¾u¾†¾—¾¨¾¹¾Ê¾Û¾ì¾ý¿¿¿0¿A¿R¿c¿t¿…¿–¿§¿¸¿É¿Ú¿ë¿üÀ ÀÀ/À@ÀQÀbÀsÀ„À•À¦À·ÀÈÀÙÀêÀûÁ ÁÁ.Á?ÁPÁaÁrÁƒÁ”Á¥Á¶ÁÇÁØÁéÁú ÂÂ-Â>ÂOÂ`Âq‚“¤µÂÆÂ×ÂèÂùà ÃÃ,Ã=ÃNÃ_ÃpÃÃ’ãôÃÅÃÖÃçÃøÄ ÄÄ+Ä<ÄMÄ^ÄoĀđĢijÄÄÄÕÄæÄ÷ÅÅÅ*Å;ÅLÅ]ÅnÅÅÅ¡ŲÅÃÅÔÅåÅöÆÆÆ)Æ:ÆKÆ\ÆmÆ~ÆÆ ƱÆÂÆÓÆäÆõÇÇÇ(Ç9ÇJÇ[ÇlÇ}ÇŽÇŸǰÇÁÇÒÇãÇôÈÈÈ'È8ÈIÈZÈkÈ|ÈÈžȯÈÀÈÑÈâÈóÉÉÉ&É7ÉHÉYÉjÉ{ÉŒÉɮɿÉÐÉáÉòÊÊÊ%Ê6ÊGÊXÊiÊzʋʜʭʾÊÏÊàÊñËËË$Ë5ËFËWËhËyËŠË›ˬ˽ËÎËßËðÌÌÌ#Ì4ÌEÌVÌgÌx̫̼̉̚ÌÍÌÞÌïÍÍÍ"Í3ÍDÍUÍfÍw͈Í™ͪÍ»ÍÌÍÝÍîÍÿÎÎ!Î2ÎCÎTÎeÎv·ΘΩκÎËÎÜÎíÎþÏÏ Ï1ÏBÏSÏdÏuφÏ—ϨϹÏÊÏÛÏìÏýÐÐÐ0ÐAÐRÐcÐtÐ…ЖЧиÐÉÐÚÐëÐüÑ ÑÑ/Ñ@ÑQÑbÑsфѕѦÑ·ÑÈÑÙÑêÑûÒ ÒÒ.Ò?ÒPÒaÒrÒƒÒ”Ò¥Ò¶ÒÇÒØÒéÒúÓ ÓÓ-Ó>ÓOÓ`ÓqÓ‚Ó“Ó¤ÓµÓÆÓ×ÓèÓùÔ ÔÔ,Ô=ÔNÔ_ÔpÔÔ’Ô£Ô´ÔÅÔÖÔçÔøÕ ÕÕ+Õ<ÕMÕ^ÕoÕ€Õ‘Õ¢Õ³ÕÄÕÕÕæÕ÷ÖÖÖ*Ö;ÖLÖ]ÖnÖÖÖ¡Ö²ÖÃÖÔÖåÖö×××)×:×K×\×m×~×× ×±×Â×Ó×ä×õØØØ(Ø9ØJØ[ØlØ}ØŽØŸذØÁØÒØãØôÙÙÙ'Ù8ÙIÙZÙkÙ|ÙÙžÙ¯ÙÀÙÑÙâÙóÚÚÚ&Ú7ÚHÚYÚjÚ{ÚŒÚÚ®Ú¿ÚÐÚáÚòÛÛÛ%Û6ÛGÛXÛiÛzۋۭۜ۾ÛÏÛàÛñÜÜÜ$Ü5ÜFÜWÜhÜyÜŠÜ›ܬܽÜÎÜßÜðÝÝÝ#Ý4ÝEÝVÝgÝx݉ݚݫݼÝÍÝÞÝïÞÞÞ"Þ3ÞDÞUÞfÞwÞˆÞ™ÞªÞ»ÞÌÞÝÞîÞÿßß!ß2ßCßTßeßv߇ߘß©ߺßËßÜßíßþàà à1àBàSàdàuà†à—à¨à¹àÊàÛàìàýááá0áAáRácátá…á–á§á¸áÉáÚáëáüâ ââ/â@âQâbâsâ„â•â¦â·âÈâÙâêâûã ãã.ã?ãPãaãrãƒã”ã¥ã¶ãÇãØãéãúä ää-ä>äOä`äqä‚ä“ä¤äµäÆä×äèäùå åå,å=åNå_åpåå’å£å´åÅåÖåçåøæ ææ+æ<æMæ^æoæ€æ‘æ¢æ³æÄæÕæææ÷ççç*ç;çLç]çnççç¡ç²çÃçÔçåçöèèè)è:èKè\èmè~èè è±èÂèÓèäèõééé(é9éJé[élé}éŽéŸé°éÁéÒéãéôêêê'ê8êIêZêkê|êêžê¯êÀêÑêâêóëëë&ë7ëHëYëjë{ëŒëë®ë¿ëÐëáëòììì%ì6ìGìXìiìzì‹ìœì­ì¾ìÏìàìñííí$í5íFíWíhíyíŠí›í¬í½íÎíßíðîîî#î4îEîVîgîxî‰îšî«î¼îÍîÞîïïïï"ï3ïDïUïfïwïˆï™ïªï»ïÌïÝïîïÿðð!ð2ðCðTðeðvð‡ð˜ð©ðºðËðÜðíðþññ ñ1ñBñSñdñuñ†ñ—ñ¨ñ¹ñÊñÛñìñýòòò0òAòRòcòtò…ò–ò§ò¸òÉòÚòëòüó óó/ó@óQóbósó„ó•ó¦ó·óÈóÙóêóûô ôô.ô?ôPôaôrôƒô”ô¥ô¶ôÇôØôéôúõ õõ-õ>õOõ`õqõ‚õ“õ¤õµõÆõ×õèõùö öö,ö=öNö_öpöö’ö£ö´öÅöÖöçöø÷ ÷÷+÷<÷M÷^÷o÷€÷‘÷¢÷³÷Ä÷Õ÷æ÷÷øøø*ø;øLø]ønøøø¡ø²øÃøÔøåøöùùù)ù:ùKù\ùmù~ùù ù±ùÂùÓùäùõúúú(ú9úJú[úlú}úŽúŸú°úÁúÒúãúôûûû'û8ûIûZûkû|ûûžû¯ûÀûÑûâûóüüü&ü7üHüYüjü{üŒüü®ü¿üÐüáüòýýý%ý6ýGýXýiýzý‹ýœý­ý¾ýÏýàýñþþþ$þ5þFþWþhþyþŠþ›þ¬þ½þÎþßþðÿÿÿ#ÿ4ÿEÿVÿgÿxÿ‰ÿšÿ«ÿ¼ÿÍÿÞÿï"3DUfwˆ™ª»ÌÝîÿ!2CTev‡˜©ºËÜíþ 1BSdu†—¨¹ÊÛìý0ARct…–§¸ÉÚëü /@Qbs„•¦·ÈÙêû .?Parƒ”¥¶ÇØéú ->O`q‚“¤µÆ×èù ,=N_p’£´ÅÖçø +<M^o€‘¢³ÄÕæ÷   * ; L ] n   ¡ ² Ã Ô å ö   ) : K \ m ~    ± Â Ó ä õ   ( 9 J [ l } Ž Ÿ ° Á Ò ã ô   ' 8 I Z k |  ž ¯ À Ñ â ó   & 7 H Y j { Œ  ® ¿ Ð á ò%6GXiz‹œ­¾Ïàñ$5FWhyŠ›¬½Îßð#4EVgx‰š«¼ÍÞï"3DUfwˆ™ª»ÌÝîÿ!2CTev‡˜©ºËÜíþ 1BSdu†—¨¹ÊÛìý0ARct…–§¸ÉÚëü /@Qbs„•¦·ÈÙêû .?Parƒ”¥¶ÇØéú ->O`q‚“¤µÆ×èù ,=N_p’£´ÅÖçø +<M^o€‘¢³ÄÕæ÷*;L]n¡²ÃÔåö):K\m~ ±ÂÓäõ(9J[l}ŽŸ°ÁÒãô'8IZk|ž¯ÀÑâó&7HYj{Œ®¿Ðáò%6GXiz‹œ­¾Ïàñ   $ 5 F W h y Š › ¬ ½ Î ß ð!!!#!4!E!V!g!x!‰!š!«!¼!Í!Þ!ï"""""3"D"U"f"w"ˆ"™"ª"»"Ì"Ý"î"ÿ##!#2#C#T#e#v#‡#˜#©#º#Ë#Ü#í#þ$$ $1$B$S$d$u$†$—$¨$¹$Ê$Û$ì$ý%%%0%A%R%c%t%…%–%§%¸%É%Ú%ë%ü& &&/&@&Q&b&s&„&•&¦&·&È&Ù&ê&û' ''.'?'P'a'r'ƒ'”'¥'¶'Ç'Ø'é'ú( ((-(>(O(`(q(‚(“(¤(µ(Æ(×(è(ù) )),)=)N)_)p))’)£)´)Å)Ö)ç)ø* **+*<*M*^*o*€*‘*¢*³*Ä*Õ*æ*÷+++*+;+L+]+n+++¡+²+Ã+Ô+å+ö,,,),:,K,\,m,~,, ,±,Â,Ó,ä,õ---(-9-J-[-l-}-Ž-Ÿ-°-Á-Ò-ã-ô...'.8.I.Z.k.|..ž.¯.À.Ñ.â.ó///&/7/H/Y/j/{/Œ//®/¿/Ð/á/ò000%060G0X0i0z0‹0œ0­0¾0Ï0à0ñ111$151F1W1h1y1Š1›1¬1½1Î1ß1ð222#242E2V2g2x2‰2š2«2¼2Í2Þ2ï333"333D3U3f3w3ˆ3™3ª3»3Ì3Ý3î3ÿ44!424C4T4e4v4‡4˜4©4º4Ë4Ü4í4þ55 515B5S5d5u5†5—5¨5¹5Ê5Û5ì5ý66606A6R6c6t6…6–6§6¸6É6Ú6ë6ü7 77/7@7Q7b7s7„7•7¦7·7È7Ù7ê7û8 88.8?8P8a8r8ƒ8”8¥8¶8Ç8Ø8é8ú9 99-9>9O9`9q9‚9“9¤9µ9Æ9×9è9ù: ::,:=:N:_:p::’:£:´:Å:Ö:ç:ø; ;;+;<;M;^;o;€;‘;¢;³;Ä;Õ;æ;÷<<<*<;>>(>9>J>[>l>}>Ž>Ÿ>°>Á>Ò>ã>ô???'?8?I?Z?k?|??ž?¯?À?Ñ?â?ó@@@&@7@H@Y@j@{@Œ@@®@¿@Ð@á@òAAA%A6AGAXAiAzA‹AœA­A¾AÏAàAñBBB$B5BFBWBhByBŠB›B¬B½BÎBßBðCCC#C4CECVCgCxC‰CšC«C¼CÍCÞCïDDD"D3DDDUDfDwDˆD™DªD»DÌDÝDîDÿEE!E2ECETEeEvE‡E˜E©EºEËEÜEíEþFF F1FBFSFdFuF†F—F¨F¹FÊFÛFìFýGGG0GAGRGcGtG…G–G§G¸GÉGÚGëGüH HH/H@HQHbHsH„H•H¦H·HÈHÙHêHûI II.I?IPIaIrIƒI”I¥I¶IÇIØIéIúJ JJ-J>JOJ`JqJ‚J“J¤JµJÆJ×JèJùK KK,K=KNK_KpKK’K£K´KÅKÖKçKøL LL+L<LML^LoL€L‘L¢L³LÄLÕLæL÷MMM*M;MLM]MnMMM¡M²MÃMÔMåMöNNN)N:NKN\NmN~NN N±NÂNÓNäNõOOO(O9OJO[OlO}OŽOŸO°OÁOÒOãOôPPP'P8PIPZPkP|PPžP¯PÀPÑPâPóQQQ&Q7QHQYQjQ{QŒQQ®Q¿QÐQáQòRRR%R6RGRXRiRzR‹RœR­R¾RÏRàRñSSS$S5SFSWShSySŠS›S¬S½SÎSßSðTTT#T4TETVTgTxT‰TšT«T¼TÍTÞTïUUU"U3UDUUUfUwUˆU™UªU»UÌUÝUîUÿVV!V2VCVTVeVvV‡V˜V©VºVËVÜVíVþWW W1WBWSWdWuW†W—W¨W¹WÊWÛWìWýXXX0XAXRXcXtX…X–X§X¸XÉXÚXëXüY YY/Y@YQYbYsY„Y•Y¦Y·YÈYÙYêYûZ ZZ.Z?ZPZaZrZƒZ”Z¥Z¶ZÇZØZéZú[ [[-[>[O[`[q[‚[“[¤[µ[Æ[×[è[ù\ \\,\=\N\_\p\\’\£\´\Å\Ö\ç\ø] ]]+]<]M]^]o]€]‘]¢]³]Ä]Õ]æ]÷^^^*^;^L^]^n^^^¡^²^Ã^Ô^å^ö___)_:_K_\_m_~__ _±_Â_Ó_ä_õ```(`9`J`[`l`}`Ž`Ÿ`°`Á`Ò`ã`ôaaa'a8aIaZaka|aaža¯aÀaÑaâaóbbb&b7bHbYbjb{bŒbb®b¿bÐbábòccc%c6cGcXciczc‹cœc­c¾cÏcàcñddd$d5dFdWdhdydŠd›d¬d½dÎdßdðeee#e4eEeVegexe‰eše«e¼eÍeÞeïfff"f3fDfUfffwfˆf™fªf»fÌfÝfîfÿgg!g2gCgTgegvg‡g˜g©gºgËgÜgígþhh h1hBhShdhuh†h—h¨h¹hÊhÛhìhýiii0iAiRiciti…i–i§i¸iÉiÚiëiüj jj/j@jQjbjsj„j•j¦j·jÈjÙjêjûk kk.k?kPkakrkƒk”k¥k¶kÇkØkékúl ll-l>lOl`lql‚l“l¤lµlÆl×lèlùm mm,m=mNm_mpmm’m£m´mÅmÖmçmøn nn+n<nMn^non€n‘n¢n³nÄnÕnæn÷ooo*o;oLo]onooo¡o²oÃoÔoåoöppp)p:pKp\pmp~pp p±pÂpÓpäpõqqq(q9qJq[qlq}qŽqŸq°qÁqÒqãqôrrr'r8rIrZrkr|rržr¯rÀrÑrârósss&s7sHsYsjs{sŒss®s¿sÐsásòttt%t6tGtXtitzt‹tœt­t¾tÏtàtñuuu$u5uFuWuhuyuŠu›u¬u½uÎußuðvvv#v4vEvVvgvxv‰všv«v¼vÍvÞvïwww"w3wDwUwfwwwˆw™wªw»wÌwÝwîwÿxx!x2xCxTxexvx‡x˜x©xºxËxÜxíxþyy y1yBySydyuy†y—y¨y¹yÊyÛyìyýzzz0zAzRzcztz…z–z§z¸zÉzÚzëzü{ {{/{@{Q{b{s{„{•{¦{·{È{Ù{ê{û| ||.|?|P|a|r|ƒ|”|¥|¶|Ç|Ø|é|ú} }}-}>}O}`}q}‚}“}¤}µ}Æ}×}è}ù~ ~~,~=~N~_~p~~’~£~´~Å~Ö~ç~ø +<M^o€‘¢³ÄÕæ÷€€€*€;€L€]€n€€€¡€²€Ã€Ô€å€ö):K\m~ ±ÂÓäõ‚‚‚(‚9‚J‚[‚l‚}‚Ž‚Ÿ‚°‚Á‚Ò‚ã‚ôƒƒƒ'ƒ8ƒIƒZƒkƒ|ƒƒžƒ¯ƒÀƒÑƒâƒó„„„&„7„H„Y„j„{„Œ„„®„¿„Єá„ò………%…6…G…X…i…z…‹…œ…­…¾…Ï…à…ñ†††$†5†F†W†h†y†Š†›†¬†½†Î†ß†ð‡‡‡#‡4‡E‡V‡g‡x‡‰‡š‡«‡¼‡Í‡Þ‡ïˆˆˆ"ˆ3ˆDˆUˆfˆwˆˆˆ™ˆªˆ»ˆÌˆÝˆîˆÿ‰‰!‰2‰C‰T‰e‰v‰‡‰˜‰©‰º‰Ë‰Ü‰í‰þŠŠ Š1ŠBŠSŠdŠuІŠ—ЍйŠÊŠÛŠìŠý‹‹‹0‹A‹R‹c‹t‹…‹–‹§‹¸‹É‹Ú‹ë‹üŒ ŒŒ/Œ@ŒQŒbŒsŒ„Œ•Œ¦Œ·ŒÈŒÙŒêŒû .?Parƒ”¥¶ÇØéúŽ ŽŽ-Ž>ŽOŽ`Žqނޓޤ޵ŽÆŽ×ŽèŽù ,=N_p’£´ÅÖçø +<M^o€‘¢³ÄÕæ÷‘‘‘*‘;‘L‘]‘n‘‘‘¡‘²‘Ñԑå‘ö’’’)’:’K’\’m’~’’ ’±’Â’Ó’ä’õ“““(“9“J“[“l“}“Ž“Ÿ“°“Á“Ò“ã“ô”””'”8”I”Z”k”|””ž”¯”À”Ñ”â”ó•••&•7•H•Y•j•{•Œ••®•¿•Еá•ò–––%–6–G–X–i–z–‹–œ–­–¾–Ï–à–ñ———$—5—F—W—h—y—Š—›—¬—½—Ηߗ𘘘#˜4˜E˜V˜g˜x˜‰˜š˜«˜¼˜Í˜Þ˜ï™™™"™3™D™U™f™w™ˆ™™™ª™»™Ì™Ý™î™ÿšš!š2šCšTšešvš‡š˜š©šºšËšÜšíšþ›› ›1›B›S›d›u›†›—›¨›¹›Ê›Û›ì›ýœœœ0œAœRœcœtœ…œ–œ§œ¸œÉœÚœëœü /@Qbs„•¦·ÈÙêûž žž.ž?žPžažržƒž”ž¥ž¶žÇžØžéžúŸ ŸŸ-Ÿ>ŸOŸ`ŸqŸ‚Ÿ“Ÿ¤ŸµŸÆŸ×ŸèŸù    , = N _ p  ’ £ ´ Å Ö ç ø¡ ¡¡+¡<¡M¡^¡o¡€¡‘¡¢¡³¡Ä¡Õ¡æ¡÷¢¢¢*¢;¢L¢]¢n¢¢¢¡¢²¢Ã¢Ô¢å¢ö£££)£:£K£\£m£~££ £±£Â£Ó£ä£õ¤¤¤(¤9¤J¤[¤l¤}¤Ž¤Ÿ¤°¤Á¤Ò¤ã¤ô¥¥¥'¥8¥I¥Z¥k¥|¥¥ž¥¯¥À¥Ñ¥â¥ó¦¦¦&¦7¦H¦Y¦j¦{¦Œ¦¦®¦¿¦Ð¦á¦ò§§§%§6§G§X§i§z§‹§œ§­§¾§Ï§à§ñ¨¨¨$¨5¨F¨W¨h¨y¨Š¨›¨¬¨½¨Î¨ß¨ð©©©#©4©E©V©g©x©‰©š©«©¼©Í©Þ©ïªªª"ª3ªDªUªfªwªˆª™ªªª»ªÌªÝªîªÿ««!«2«C«T«e«v«‡«˜«©«º«Ë«Ü«í«þ¬¬ ¬1¬B¬S¬d¬u¬†¬—¬¨¬¹¬Ê¬Û¬ì¬ý­­­0­A­R­c­t­…­–­§­¸­É­Ú­ë­ü® ®®/®@®Q®b®s®„®•®¦®·®È®Ù®ê®û¯ ¯¯.¯?¯P¯a¯r¯ƒ¯”¯¥¯¶¯Ç¯Ø¯é¯ú° °°-°>°O°`°q°‚°“°¤°µ°Æ°×°è°ù± ±±,±=±N±_±p±±’±£±´±Å±Ö±ç±ø² ²²+²<²M²^²o²€²‘²¢²³²Ä²Õ²æ²÷³³³*³;³L³]³n³³³¡³²³Ã³Ô³å³ö´´´)´:´K´\´m´~´´ ´±´Â´Ó´ä´õµµµ(µ9µJµ[µlµ}µŽµŸµ°µÁµÒµãµô¶¶¶'¶8¶I¶Z¶k¶|¶¶ž¶¯¶À¶Ñ¶â¶ó···&·7·H·Y·j·{·Œ··®·¿·Ð·á·ò¸¸¸%¸6¸G¸X¸i¸z¸‹¸œ¸­¸¾¸Ï¸à¸ñ¹¹¹$¹5¹F¹W¹h¹y¹Š¹›¹¬¹½¹Î¹ß¹ðººº#º4ºEºVºgºxº‰ºšº«º¼ºÍºÞºï»»»"»3»D»U»f»w»ˆ»™»ª»»»Ì»Ý»î»ÿ¼¼!¼2¼C¼T¼e¼v¼‡¼˜¼©¼º¼Ë¼Ü¼í¼þ½½ ½1½B½S½d½u½†½—½¨½¹½Ê½Û½ì½ý¾¾¾0¾A¾R¾c¾t¾…¾–¾§¾¸¾É¾Ú¾ë¾ü¿ ¿¿/¿@¿Q¿b¿s¿„¿•¿¦¿·¿È¿Ù¿ê¿ûÀ ÀÀ.À?ÀPÀaÀrÀƒÀ”À¥À¶ÀÇÀØÀéÀúÁ ÁÁ-Á>ÁOÁ`ÁqÁ‚Á“Á¤ÁµÁÆÁ×ÁèÁù ÂÂ,Â=ÂNÂ_ÂpÂÂ’£´ÂÅÂÖÂçÂøà ÃÃ+Ã<ÃMÃ^ÃoÀÑâóÃÄÃÕÃæÃ÷ÄÄÄ*Ä;ÄLÄ]ÄnÄÄÄ¡IJÄÃÄÔÄåÄöÅÅÅ)Å:ÅKÅ\ÅmÅ~ÅÅ űÅÂÅÓÅäÅõÆÆÆ(Æ9ÆJÆ[ÆlÆ}ÆŽÆŸưÆÁÆÒÆãÆôÇÇÇ'Ç8ÇIÇZÇkÇ|ÇÇžǯÇÀÇÑÇâÇóÈÈÈ&È7ÈHÈYÈjÈ{ÈŒÈȮȿÈÐÈáÈòÉÉÉ%É6ÉGÉXÉiÉzɋɜɭɾÉÏÉàÉñÊÊÊ$Ê5ÊFÊWÊhÊyÊŠÊ›ʬʽÊÎÊßÊðËËË#Ë4ËEËVËgËxˉ˚˫˼ËÍËÞËïÌÌÌ"Ì3ÌDÌUÌfÌẅÌ™̪Ì»ÌÌÌÝÌîÌÿÍÍ!Í2ÍCÍTÍeÍv͇͘Í©ͺÍËÍÜÍíÍþÎÎ Î1ÎBÎSÎdÎuΆΗΨιÎÊÎÛÎìÎýÏÏÏ0ÏAÏRÏcÏtÏ…Ï–ϧϸÏÉÏÚÏëÏüÐ ÐÐ/Ð@ÐQÐbÐsЄЕЦзÐÈÐÙÐêÐûÑ ÑÑ.Ñ?ÑPÑaÑrуєѥѶÑÇÑØÑéÑúÒ ÒÒ-Ò>ÒOÒ`ÒqÒ‚Ò“Ò¤ÒµÒÆÒ×ÒèÒùÓ ÓÓ,Ó=ÓNÓ_ÓpÓÓ’Ó£Ó´ÓÅÓÖÓçÓøÔ ÔÔ+Ô<ÔMÔ^ÔoÔ€Ô‘Ô¢Ô³ÔÄÔÕÔæÔ÷ÕÕÕ*Õ;ÕLÕ]ÕnÕÕÕ¡Õ²ÕÃÕÔÕåÕöÖÖÖ)Ö:ÖKÖ\ÖmÖ~ÖÖ Ö±ÖÂÖÓÖäÖõ×××(×9×J×[×l×}׎ן×°×Á×Ò×ã×ôØØØ'Ø8ØIØZØkØ|ØØžدØÀØÑØâØóÙÙÙ&Ù7ÙHÙYÙjÙ{ÙŒÙٮٿÙÐÙáÙòÚÚÚ%Ú6ÚGÚXÚiÚzڋڜڭھÚÏÚàÚñÛÛÛ$Û5ÛFÛWÛhÛyÛŠÛ›Û¬Û½ÛÎÛßÛðÜÜÜ#Ü4ÜEÜVÜgÜx܉ܚܫܼÜÍÜÞÜïÝÝÝ"Ý3ÝDÝUÝfÝw݈Ý™ݪÝ»ÝÌÝÝÝîÝÿÞÞ!Þ2ÞCÞTÞeÞvÞ‡Þ˜Þ©ÞºÞËÞÜÞíÞþßß ß1ßBßSßdßu߆ß—ߨß¹ßÊßÛßìßýààà0àAàRàcàtà…à–à§à¸àÉàÚàëàüá áá/á@áQábásá„á•á¦á·áÈáÙáêáûâ ââ.â?âPâaârâƒâ”â¥â¶âÇâØâéâúã ãã-ã>ãOã`ãqã‚ã“ã¤ãµãÆã×ãèãùä ää,ä=äNä_äpää’ä£ä´äÅäÖäçäøå åå+å<åMå^åoå€å‘å¢å³åÄåÕåæå÷æææ*æ;æLæ]ænæææ¡æ²æÃæÔæåæöççç)ç:çKç\çmç~çç ç±çÂçÓçäçõèèè(è9èJèRè\ècè{è„è‰è’è—è è¥è®è³è¼èÁèÊèÏèØèÝèæèëèôèùéééééé#é,é1é:é?éHéMéVé[édéiéréwé€é…éŽé“éœé¡éªé¯é¸é½éÆéËéÔéÙéâéçéðéõéþêê êêêê(ê-ê6ê;êDêIêRêWê`êeênêsê|êêŠêê˜êê¦ê«ê´ê¹êÂêÇêÐêÕêÞêãêìêñêúêÿëë ëëë$ë)ë2ë7ë@ëEëNëSë\ëaëjëoëxë}ë†ë‹ë”ë™ë¢ë§ë°ëµë¾ëÃëÌëÑëÚëßëèëíëöëûìì ììì ì%ì.ì3ì<ìAìJìOìXì]ìfìkìtìyì‚ì‡ìì•ìžì£ì¬ì±ìºì¿ìÈìÍìÖìÛìäìéìòì÷íííííí!í*í/í8í=íFíKíTíYíbígípíuí~íƒíŒí‘íšíŸí¨í­í¶í»íÄíÉíÒí×íàíåíîíóíüîî îîîî&î+î4î9îBîGîPîUî^îcîlîqîzîîˆîî–î›î¤î©î²î·îÀîÅîÎîÓîÜîáîêîïîøîýïï ïïï"ï'ï0ï5ï>ïCïLïQïZï_ïhïmïvï{ï„ï‰ï’ï—ï ï¥ï®ï³ï¼ïÁïÊïÏïØïÝïæïëïôïùðððððð#ð,ð1ð:ð?ðHðMðVð[ðdðiðrðwð€ð…ðŽð“ðœð¡ðªð¯ð¸ð½ðÆðËðÔðÙðâðçðððõðþññ ññññ(ñ-ñ6ñ;ñDñIñRñWñ`ñeñnñsñ|ññŠññ˜ññ¦ñ«ñ´ñ¹ñÂñÇñÐñÕñÞñãñìñññúñÿòò òòò$ò)ò2ò7ò@òEòNòSò\òaòjòoòxò}ò†ò‹ò”ò™ò¢ò§ò°òµò¾òÃòÌòÑòÚòßòèòíòöòûóó óóó ó%ó.ó3ó<óAóJóOóXó]ófókótóyó‚ó‡óó•óžó£ó¬ó±óºó¿óÈóÍóÖóÛóäóéóòó÷ôôôôôô!ô*ô/ô8ô=ôFôKôTôYôbôgôpôuô~ôƒôŒô‘ôšôŸô¨ô­ô¶ô»ôÄôÉôÒô×ôàôåôîôóôüõõ õõõõ&õ+õ4õ9õBõGõPõUõ^õcõlõqõzõõˆõõ–õ›õ¤õ©õ²õ·õÀõÅõÎõÓõÜõáõêõïõøõýöö ööö"ö'ö0ö5ö>öCöLöQöZö_öhömövö{ö„ö‰ö’ö—ö ö¥ö®ö³ö¼öÁöÊöÏöØöÝöæöëöôöù÷÷÷÷÷÷#÷,÷1÷:÷?÷H÷M÷V÷[÷d÷i÷r÷w÷€÷…÷Ž÷“÷œ÷¡÷ª÷¯÷¸÷½÷Æ÷Ë÷Ô÷Ù÷â÷ç÷ð÷õ÷þøø øøøø(ø-ø6ø;øDøIøRøWø`øeønøsø|øøŠøø˜øø¦ø«ø´ø¹øÂøÇøÐøÕøÞøãøìøñøúøÿùù ùùù$ù)ù2ù7ù@ùEùNùSù\ùaùjùoùxù}ù†ù‹ù”ù™ù¢ù§ù°ùµù¾ùÃùÌùÑùÚùßùèùíùöùûúú úúú ú%ú.ú3ú<úAúJúOúXú]úfúkútúyú‚ú‡úú•úžú£ú¬ú±úºú¿úÈúÍúÖúÛúäúéúòú÷ûûûûûû!û*û/û8û=ûFûKûTûYûbûgûpûuû~ûƒûŒû‘ûšûŸû¨û­û¶û»ûÄûÉûÒû×ûàûåûîûóûüüü üüüü&ü+ü4ü9üBüGüPüUü^ücülüqüzüüˆüü–ü›ü¤ü©ü²ü·üÀüÅüÎüÓüÜüáüêüïüøüýýý ýýý"ý'ý0ý5ý>ýCýLýQýZý_ýhýmývý{ý„ý‰ý’ý—ý ý¥ý®ý³ý¼ýÁýÊýÏýØýÝýæýëýôýùþþþþþþ#þ,þ1þ:þ?þHþMþVþ[þdþiþrþwþ€þ…þŽþ“þœþ¡þªþ¯þ¸þ½þÆþËþÔþÙþâþçþðþõþþÿÿ ÿÿÿÿ(ÿ-ÿ6ÿ;ÿDÿIÿRÿWÿ`ÿeÿnÿsÿ|ÿÿŠÿÿ˜ÿÿ¦ÿ«ÿ´ÿ¹ÿÂÿÇÿÐÿÕÿÞÿãÿìÿñÿúÿÿ $)27@ENS\ajox}†‹”™¢§°µ¾ÃÌÑÚßèíöû  %.3<AJOX]fkty‚‡•ž£¬±º¿ÈÍÖÛäéò÷!*/8=FKTYbgpu~ƒŒ‘šŸ¨­¶»ÄÉÒ×àåîóü &+49BGPU^clqzˆ–›¤©²·ÀÅÎÓÜáêïøý "'05>CLQZ_hmv{„‰’— ¥®³¼ÁÊÏØÝæëôù#,1:?HMV[dirw€…Ž“œ¡ª¯¸½ÆËÔÙâçðõþ (-6;DIRW`ens|Š˜¦«´¹ÂÇÐÕÞãìñúÿ $)27@ENS\ajox}†‹”™¢§°µ¾ÃÌÑÚßèíöû  %.3<AJOX]fkty‚‡•ž£¬±º¿ÈÍÖÛäéò÷      ! * / 8 = F K T Y b g p u ~ ƒ Œ ‘ š Ÿ ¨ ­ ¶ » Ä É Ò × à å î ó ü      & + 4 9 B G P U ^ c l q z  ˆ  – › ¤ © ² · À Å Î Ó Ü á ê ï ø ý     " ' 0 5 > C L Q Z _ h m v { „ ‰ ’ —   ¥ ® ³ ¼ Á Ê Ï Ø Ý æ ë ô ù      # , 1 : ? H M V [ d i r w € … Ž “ œ ¡ ª ¯ ¸ ½ Æ Ë Ô Ù â ç ð õ þ      ( - 6 ; D I R W ` e n s |  Š  ˜  ¦ « ´ ¹ Â Ç Ð Õ Þ ã ì ñ ú ÿ $)27@ENS\ajox}†‹”™¢§°µ¾ÃÌÑÚßèíöû  %.3<AJOX]fkty‚‡•ž£¬±º¿ÈÍÖÛäéò÷!*/8=FKTYbgpu~ƒŒ‘šŸ¨­¶»ÄÉÒ×àåîóü &+49BGPU^clqzˆ–›¤©²·ÀÅÎÓÜáêïøý "'05>CLQZ_hmv{„‰’— ¥®³¼ÁÊÏØÝæëôù#,1:?HMV[dirw€…Ž“œ¡ª¯¸½ÆËÔÙâçðõþ (-6;DIRW`ens|Š˜¦«´¹ÂÇÐÕÞãìñúÿ $)27@ENS\ajox}†‹”™¢§°µ¾ÃÌÑÚßèíöû  %.3<AJOX]fkty‚‡•ž£¬±º¿ÈÍÖÛäéò÷!*/8=FKTYbgpu~ƒŒ‘šŸ¨­¶»ÄÉÒ×àåîóü &+49BGPU^clqzˆ–›¤©²·ÀÅÎÓÜáêïøý "'05>CLQZ_hmv{„‰’— ¥®³¼ÁÊÏØÝæëôù#,1:?HMV[dirw€…Ž“œ¡ª¯¸½ÆËÔÙâçðõþ (-6;DIRW`ens|Š˜¦«´¹ÂÇÐÕÞãìñúÿ $)27@ENS\ajox}†‹”™¢§°µ¾ÃÌÑÚßèíöû  %.3<AJOX]fkty‚‡•ž£¬±º¿ÈÍÖÛäéò÷!*/8=FKTYbgpu~ƒŒ‘šŸ¨­¶»ÄÉÒ×àåîóü &+49BGPU^clqzˆ–›¤©²·ÀÅÎÓÜáêïøý     " ' 0 5 > C L Q Z _ h m v { „ ‰ ’ —   ¥ ® ³ ¼ Á Ê Ï Ø Ý æ ë ô ù!!!!!!#!,!1!:!?!H!M!V![!d!i!r!w!€!…!Ž!“!œ!¡!ª!¯!¸!½!Æ!Ë!Ô!Ù!â!ç!ð!õ!þ"" """"("-"6";"D"I"R"W"`"e"n"s"|""Š""˜""¦"«"´"¹"Â"Ç"Ð"Õ"Þ"ã"ì"ñ"ú"ÿ## ###$#)#2#7#@#E#N#S#\#a#j#o#x#}#†#‹#”#™#¢#§#°#µ#¾#Ã#Ì#Ñ#Ú#ß#è#í#ö#û$$ $$$ $%$.$3$<$A$J$O$X$]$f$k$t$y$‚$‡$$•$ž$£$¬$±$º$¿$È$Í$Ö$Û$ä$é$ò$÷%%%%%%!%*%/%8%=%F%K%T%Y%b%g%p%u%~%ƒ%Œ%‘%š%Ÿ%¨%­%¶%»%Ä%É%Ò%×%à%å%î%ó%ü&& &&&&&&+&4&9&B&G&P&U&^&c&l&q&z&&ˆ&&–&›&¤&©&²&·&À&Å&Î&Ó&Ü&á&ê&ï&ø&ý'' '''"'''0'5'>'C'L'Q'Z'_'h'm'v'{'„'‰'’'—' '¥'®'³'¼'Á'Ê'Ï'Ø'Ý'æ'ë'ô'ù((((((#(,(1(:(?(H(M(V([(d(i(r(w(€(…(Ž(“(œ(¡(ª(¯(¸(½(Æ(Ë(Ô(Ù(â(ç(ð(õ(þ)) ))))()-)6);)D)I)R)W)`)e)n)s)|))Š))˜))¦)«)´)¹)Â)Ç)Ð)Õ)Þ)ã)ì)ñ)ú)ÿ** ***$*)*2*7*@*E*N*S*\*a*j*o*x*}*†*‹*”*™*¢*§*°*µ*¾*Ã*Ì*Ñ*Ú*ß*è*í*ö*û++ +++ +%+.+3+<+A+J+O+X+]+f+k+t+y+‚+‡++•+ž+£+¬+±+º+¿+È+Í+Ö+Û+ä+é+ò+÷,,,,,,!,*,/,8,=,F,K,T,Y,b,g,p,u,~,ƒ,Œ,‘,š,Ÿ,¨,­,¶,»,Ä,É,Ò,×,à,å,î,ó,ü-- ----&-+-4-9-B-G-P-U-^-c-l-q-z--ˆ--–-›-¤-©-²-·-À-Å-Î-Ó-Ü-á-ê-ï-ø-ý.. ...".'.0.5.>.C.L.Q.Z._.h.m.v.{.„.‰.’.—. .¥.®.³.¼.Á.Ê.Ï.Ø.Ý.æ.ë.ô.ù//////#/,/1/:/?/H/M/V/[/d/i/r/w/€/…/Ž/“/œ/¡/ª/¯/¸/½/Æ/Ë/Ô/Ù/â/ç/ð/õ/þ00 0000(0-060;0D0I0R0W0`0e0n0s0|00Š00˜00¦0«0´0¹0Â0Ç0Ð0Õ0Þ0ã0ì0ñ0ú0ÿ11 111$1)12171@1E1N1S1\1a1j1o1x1}1†1‹1”1™1¢1§1°1µ1¾1Ã1Ì1Ñ1Ú1ß1è1í1ö1û22 222 2%2.232<2A2J2O2X2]2f2k2t2y2‚2‡22•2ž2£2¬2±2º2¿2È2Í2Ö2Û2ä2é2ò2÷333333!3*3/383=3F3K3T3Y3b3g3p3u3~3ƒ3Œ3‘3š3Ÿ3¨3­3¶3»3Ä3É3Ò3×3à3å3î3ó3ü44 4444&4+44494B4G4P4U4^4c4l4q4z44ˆ44–4›4¤4©4²4·4À4Å4Î4Ó4Ü4á4ê4ï4ø4ý55 555"5'50555>5C5L5Q5Z5_5h5m5v5{5„5‰5’5—5 5¥5®5³5¼5Á5Ê5Ï5Ø5Ý5æ5ë5ô5ù666666#6,616:6?6H6M6V6[6d6i6r6w6€6…6Ž6“6œ6¡6ª6¯6¸6½6Æ6Ë6Ô6Ù6â6ç6ð6õ6þ77 7777(7-767;7D7I7R7W7`7e7n7s7|77Š77˜77¦7«7´7¹7Â7Ç7Ð7Õ7Þ7ã7ì7ñ7ú7ÿ88 888$8)82878@8E8N8S8\8a8j8o8x8}8†8‹8”8™8¢8§8°8µ8¾8Ã8Ì8Ñ8Ú8ß8è8í8ö8û99 999 9%9.939<9A9J9O9X9]9f9k9t9y9‚9‡99•9ž9£9¬9±9º9¿9È9Í9Ö9Û9ä9é9ò9÷::::::!:*:/:8:=:F:K:T:Y:b:g:p:u:~:ƒ:Œ:‘:š:Ÿ:¨:­:¶:»:Ä:É:Ò:×:à:å:î:ó:ü;; ;;;;&;+;4;9;B;G;P;U;^;c;l;q;z;;ˆ;;–;›;¤;©;²;·;À;Å;Î;Ó;Ü;á;ê;ï;ø;ý<< <<<"<'<0<5<>> >>>>(>->6>;>D>I>R>W>`>e>n>s>|>>Š>>˜>>¦>«>´>¹>Â>Ç>Ð>Õ>Þ>ã>ì>ñ>ú>ÿ?? ???$?)?2?7?@?E?N?S?\?a?j?o?x?}?†?‹?”?™?¢?§?°?µ?¾?Ã?Ì?Ñ?Ú?ß?è?í?ö?û@@ @@@ @%@.@3@<@A@J@O@X@]@f@k@t@y@‚@‡@@•@ž@£@¬@±@º@¿@È@Í@Ö@Û@ä@é@ò@÷AAAAAA!A*A/A8A=AFAKATAYAbAgApAuA~AƒAŒA‘AšAŸA¨A­A¶A»AÄAÉAÒA×AàAåAîAóAüBB BBBB&B+B4B9BBBGBPBUB^BcBlBqBzBBˆBB–B›B¤B©B²B·BÀBÅBÎBÓBÜBáBêBïBøBýCC CCC"C'C0C5C>CCCLCQCZC_ChCmCvC{C„C‰C’C—C C¥C®C³C¼CÁCÊCÏCØCÝCæCëCôCùDDDDDD#D,D1D:D?DHDMDVD[DdDiDrDwD€D…DŽD“DœD¡DªD¯D¸D½DÆDËDÔDÙDâDçDðDõDþEE EEEE(E-E6E;EDEIEREWE`EeEnEsE|EEŠEE˜EE¦E«E´E¹EÂEÇEÐEÕEÞEãEìEñEúEÿFF FFF$F)F2F7F@FEFNFSF\FaFjFoFxF}F†F‹F”F™F¢F§F°FµF¾FÃFÌFÑFÚFßFèFíFöFûGG GGG G%G.G3G<GAGJGOGXG]GfGkGtGyG‚G‡GG•GžG£G¬G±GºG¿GÈGÍGÖGÛGäGéGòG÷HHHHHH!H*H/H8H=HFHKHTHYHbHgHpHuH~HƒHŒH‘HšHŸH¨H­H¶H»HÄHÉHÒH×HàHåHîHóHüII IIII&I+I4I9IBIGIPIUI^IcIlIqIzIIˆII–I›I¤I©I²I·IÀIÅIÎIÓIÜIáIêIïIøIýJJ JJJ"J'J0J5J>JCJLJQJZJ_JhJmJvJ{J„J‰J’J—J J¥J®J³J¼JÁJÊJÏJØJÝJæJëJôJùKKKKKK#K,K1K:K?KHKMKVK[KdKiKrKwK€K…KŽK“KœK¡KªK¯K¸K½KÆKËKÔKÙKâKçKðKõKþLL LLLL(L-L6L;LDLILRLWL`LeLnLsL|LLŠLL˜LL¦L«L´L¹LÂLÇLÐLÕLÞLãLìLñLúLÿMM MMM$M)M2M7M@MEMNMSM\MaMjMoMxM}M†M‹M”M™M¢M§M°MµM¾MÃMÌMÑMÚMßMèMíMöMûNN NNN N%N.N3N<NANJNONXN]NfNkNtNyN‚N‡NN•NžN£N¬N±NºN¿NÈNÍNÖNÛNäNéNòN÷OOOOOO!O*O/O8O=OFOKOTOYObOgOpOuO~OƒOŒO‘OšOŸO¨O­O¶O»OÄOÉOÒO×OàOåOîOóOüPP PPPP&P+P4P9PBPGPPPUP^PcPlPqPzPPˆPP–P›P¤P©P²P·P¼PÅPÎPÓPÜPáPæPïPøPýQQ QQQ"Q'Q0Q5Q>QCQLQQQZQ_QhQmQvQ{Q„Q‰Q’Q—Q Q¥Q®Q³Q¼QÁQÊQÏQØQÝQæQëQôQùRRRRRR#R,R1R:R?RHRMRVR[RdRiRrRwR€R…RŽR“RœR¡RªR¯R¸R½RÆRËRÔRÙRâRçRðRõRþSS SSSS(S-S6S;SDSISRSWS`SeSnSsS|SSŠSS˜SS¦S«S´S¹SÂSÇSÐSÕSÞSãSìSñSúSÿTT TTT$T)T2T7T@TETNTST\TaTjToTxT}T†T‹T”T™T¢T§T°TµT¾TÃTÌTÑTÚTßTèTíTöTûUU UUU U%U.U3U<UAUJUOUXU]UfUkUtUyU‚U‡UU•UžU£U¬U±UºU¿UÈUÍUÖUÛUäUéUòU÷VVVVVV!V*V/V8V=VFVKVTVYVbVgVpVuV~VƒVŒV‘VšVŸV¨V­V¶V»VÄVÉVÒV×VàVåVîVóVüWW WWWW&W+W4W9WBWGWPWUW^WcWlWqWzWWˆWW–W›W¤W©W²W·WÀWÅWÎWÓWÜWáWêWïWøWýXX XXX"X'X0X5X>XCXLXQXZX_XhXmXvX{X„X‰X’X—X X¥X®X³X¼XÁXÊXÏXØXÝXæXëXôXùYYYYYY#Y,Y1Y:Y?YHYMYVY[YdYiYrYwY€Y…YŽY“YœY¡YªY¯Y¸Y½YÆYËYÔYÙYâYçYðYõYþZZ ZZZZ(Z-Z6Z;ZDZIZRZWZ`ZeZnZsZ|ZZŠZZ˜ZZ¦Z«Z´Z¹ZÂZÇZÐZÕZÞZãZìZñZúZÿ[[ [[[$[)[2[7[@[E[N[S[\[a[j[o[x[}[†[‹[”[™[¢[§[°[µ[¾[Ã[Ì[Ñ[Ú[ß[è[í[ö[û\\ \\\ \%\.\3\<\A\J\O\X\]\f\k\t\y\‚\‡\\•\ž\£\¬\±\º\¿\È\Í\Ö\Û\ä\é\ò\÷]]]]]]!]*]/]8]=]F]K]T]Y]b]g]p]u]~]ƒ]Œ]‘]š]Ÿ]¨]­]¶]»]Ä]É]Ò]×]à]å]î]ó]ü^^ ^^^^&^+^4^9^B^G^P^U^^^c^l^q^z^^ˆ^^–^›^¤^©^²^·^À^Å^Î^Ó^Ü^á^ê^ï^ø^ý__ ___"_'_0_5_>_C_L_Q_Z___h_m_v_{_„_‰_’_—_ _¥_®_³_¼_Á_Ê_Ï_Ø_Ý_æ_ë_ô_ù``````#`,`1`:`?`H`M`V`[`d`i`r`w`€`…`Ž`“`œ`¡`ª`¯`¸`½`Æ`Ë`Ô`Ù`â`ç`ð`õ`þaa aaaa(a-a6a;aDaIaRaWa`aeanasa|aaŠaa˜aa¦a«a´a¹aÂaÇaÐaÕaÞaãaìañaúaÿbb bbb$b)b2b7b@bEbNbSb\babjbobxb}b†b‹b”b™b¢b§b°bµb¾bÃbÌbÑbÚbßbèbíböbûcc ccc c%c.c3c<cAcJcOcXc]cfckctcyc‚c‡cc•cžc£c¬c±cºc¿cÈcÍcÖcÛcäcécòc÷dddddd!d*d/d8d=dFdKdTdYdbdgdpdud~dƒdŒd‘dšdŸd¨d­d¶d»dÄdÉdÒd×dàdådîdódüee eeee&e+e4e9eBeGePeUe^eceleqezeeˆee–e›e¤e©e²e·eÀeÅeÎeÓeÜeáeêeïeøeýff fff"f'f0f5f>fCfLfQfZf_fhfmfvf{f„f‰f’f—f f¥f®f³f¼fÁfÊfÏfØfÝfæfëfôfùgggggg#g,g1g:g?gHgMgVg[gdgigrgwg€g…gŽg“gœg¡gªg¯g¸g½gÆgËgÔgÙgâgçgðgõgþhh hhhh(h-h6h;hDhIhRhWh`hehnhsh|hhŠhh˜hh¦h«h´h¹hÂhÇhÐhÕhÞhãhìhñhúhÿii iii$i)i2i7i@iEiNiSi\iaijioixi}i†i‹i”i™i¢i§i°iµi¾iÃiÌiÑiÚißièiíiöiûjj jjj j%j.j3j<jAjJjOjXj]jfjkjtjyj‚j‡jj•jžj£j¬j±jºj¿jÈjÍjÖjÛjäjéjòj÷kkkkkk!k*k/k8k=kFkKkTkYkbkgkpkuk~kƒkŒk‘kškŸk¨k­k¶k»kÄkÉkÒk×kàkåkîkóküll llll&l+l4l9lBlGlPlUl^lclllqlzllˆll–l›l¤l©l²l·lÀlÅlÎlÓlÜlálêlïlølýmm mmm"m'm0m5m>mCmLmQmZm_mhmmmvm{m„m‰m’m—m m¥m®m³m¼mÁmÊmÏmØmÝmæmëmômùnnnnnn#n,n1n:n?nHnMnVn[ndninrnwn€n…nŽn“nœn¡nªn¯n¸n½nÆnËnÔnÙnânçnðnõnþoo oooo(o-o6o;oDoIoRoWo`oeonoso|ooŠoo˜oo¦o«o´o¹oÂoÇoÐoÕoÞoãoìoñoúoÿpp ppp$p)p2p7p@pEpNpSp\papjpopxp}p†p‹p”p™p¢p§p°pµp¾pÃpÌpÑpÚpßpèpípöpûqq qqq q%q.q3q<qAqJqOqXq]qfqkqtqyq‚q‡qq•qžq£q¬q±qºq¿qÈqÍqÖqÛqäqéqòq÷rrrrrr!r*r/r8r=rFrKrTrYrbrgrprur~rƒrŒr‘ršrŸr¨r­r¶r»rÄrÉrÒr×ràrårîrórüss ssss&s+s4s9sBsGsPsUs^scslsqszssˆss–s›s¤s©s²s·sÀsÅsÎsÓsÜsásêsïsøsýtt ttt"t't0t5t>tCtLtQtZt_thtmtvt{t„t‰t’t—t t¥t®t³t¼tÁtÊtÏtØtÝtætëtôtùuuuuuu#u,u1u:u?uHuMuVu[uduiuruwu€u…uŽu“uœu¡uªu¯u¸u½uÆuËuÔuÙuâuçuðuõuþvv vvvv(v-v6v;vDvIvRvWv`vevnvsv|vvŠvv˜vv¦v«v´v¹vÂvÇvÐvÕvÞvãvìvñvúvÿww www$w)w2w7w@wEwNwSw\wawjwowxw}w†w‹w”w™w¢w§w°wµw¾wÃwÌwÑwÚwßwèwíwöwûxx xxx x%x.x3x<xAxJxOxXx]xfxkxtxyx‚x‡xx•xžx£x¬x±xºx¿xÈxÍxÖxÛxäxéxòx÷yyyyyy!y*y/y8y=yFyKyTyYybygypyuy~yƒyŒy‘yšyŸy¨y­y¶y»yÄyÉyÒy×yàyåyîyóyüzz zzzz&z+z4z9zBzGzPzUz^zczlzqzzzzˆzz–z›z¤z©z²z·zÀzÅzÎzÓzÜzázêzïzøzý{{ {{{"{'{0{5{>{C{L{Q{Z{_{h{m{v{{{„{‰{’{—{ {¥{®{³{¼{Á{Ê{Ï{Ø{Ý{æ{ë{ô{ù||||||#|,|1|:|?|H|M|V|[|d|i|r|w|€|…|Ž|“|œ|¡|ª|¯|¸|½|Æ|Ë|Ô|Ù|â|ç|ð|õ|þ}} }}}}(}-}6};}D}I}R}W}`}e}n}s}|}}Š}}˜}}¦}«}´}¹}Â}Ç}Ð}Õ}Þ}ã}ì}ñ}ú}ÿ~~ ~~~$~)~2~7~@~E~N~S~\~a~j~o~x~}~†~‹~”~™~¢~§~°~µ~¾~Ã~Ì~Ñ~Ú~ß~è~í~ö~û  %.3<AJOX]fkty‚‡•ž£¬±º¿ÈÍÖÛäéò÷€€€€€€!€*€/€8€=€F€K€T€Y€b€g€p€u€~€ƒ€Œ€‘€š€Ÿ€¨€­€¶€»€Ä€É€Ò€×€à€å€î€ó€ü &+49BGPU^clqzˆ–›¤©²·ÀÅÎÓÜáêïøý‚‚ ‚‚‚"‚'‚0‚5‚>‚C‚L‚Q‚Z‚_‚h‚m‚v‚{‚„‚‰‚’‚—‚ ‚¥‚®‚³‚¼‚Á‚ʂς؂݂æ‚ë‚ô‚ùƒƒƒƒƒƒ#ƒ,ƒ1ƒ:ƒ?ƒHƒMƒVƒ[ƒdƒiƒrƒwƒ€ƒ…ƒŽƒ“ƒœƒ¡ƒªƒ¯ƒ¸ƒ½ƒÆƒËƒÔƒÙƒâƒçƒðƒõƒþ„„ „„„„(„-„6„;„D„I„R„W„`„e„n„s„|„„Š„„˜„„¦„«„´„¹„„DŽЄՄބã„ì„ñ„ú„ÿ…… ………$…)…2…7…@…E…N…S…\…a…j…o…x…}…†…‹…”…™…¢…§…°…µ…¾…Ã…Ì…Ñ…Ú…ß…è…í…ö…û†† ††† †%†.†3†<†A†J†O†X†]†f†k†t†y†‚†‡††•†ž†£†¬†±†º†¿†È†Í†Ö†Û†ä†é†ò†÷‡‡‡‡‡‡!‡*‡/‡8‡=‡F‡K‡T‡Y‡b‡g‡p‡u‡~‡ƒ‡Œ‡‘‡š‡Ÿ‡¨‡­‡¶‡»‡Ä‡É‡Ò‡×‡à‡å‡î‡ó‡üˆˆ ˆˆˆˆ&ˆ+ˆ4ˆ9ˆBˆGˆPˆUˆ^ˆcˆlˆqˆzˆˆˆˆˆ–ˆ›ˆ¤ˆ©ˆ²ˆ·ˆÀˆÅˆÎˆÓˆÜˆáˆêˆïˆøˆý‰‰ ‰‰‰"‰'‰0‰5‰>‰C‰L‰Q‰Z‰_‰h‰m‰v‰{‰„‰‰‰’‰—‰ ‰¥‰®‰³‰¼‰Á‰Ê‰Ï‰Ø‰Ý‰æ‰ë‰ô‰ùŠŠŠŠŠŠ#Š,Š1Š:Š?ŠHŠMŠVŠ[ŠdŠiŠrŠwŠ€Š…ŠŽŠ“ŠœŠ¡ŠªНЏнŠÆŠËŠÔŠÙŠâŠçŠðŠõŠþ‹‹ ‹‹‹‹(‹-‹6‹;‹D‹I‹R‹W‹`‹e‹n‹s‹|‹‹Š‹‹˜‹‹¦‹«‹´‹¹‹Â‹Ç‹Ð‹Õ‹Þ‹ã‹ì‹ñ‹ú‹ÿŒŒ ŒŒŒ$Œ)Œ2Œ7Œ@ŒEŒNŒSŒ\ŒaŒjŒoŒxŒ}Œ†Œ‹Œ”Œ™Œ¢Œ§Œ°ŒµŒ¾ŒÃŒÌŒÑŒÚŒßŒèŒíŒöŒû  %.3<AJOX]fkty‚‡•ž£¬±º¿ÈÍÖÛäéò÷ŽŽŽŽŽŽ!Ž*Ž/Ž8Ž=ŽFŽKŽTŽYŽbŽgŽpŽuŽ~ŽƒŽŒŽ‘ŽšŽŸލŽ­޶Ž»ŽÄŽÉŽÒŽ×ŽàŽåŽîŽóŽü &+49BGPU^clqzˆ–›¤©²·ÀÅÎÓÜáêïøý "'05>CLQZ_hmv{„‰’— ¥®³¼ÁÊÏØÝæëôù‘‘‘‘‘‘#‘,‘1‘:‘?‘H‘M‘V‘[‘d‘i‘r‘w‘€‘…‘Ž‘“‘œ‘¡‘ª‘¯‘¸‘½‘Ƒˑԑّâ‘ç‘ð‘õ‘þ’’ ’’’’(’-’6’;’D’I’R’W’`’e’n’s’|’’Š’’˜’’¦’«’´’¹’Â’Ç’Ð’Õ’Þ’ã’ì’ñ’ú’ÿ““ “““$“)“2“7“@“E“N“S“\“a“j“o“x“}“†“‹“”“™“¢“§“°“µ“¾“Ó̓ѓړߓè“í“ö“û”” ””” ”%”.”3”<”A”J”O”X”]”f”k”t”y”‚”‡””•”ž”£”¬”±”º”¿”Ȕ͔֔۔ä”é”ò”÷••••••!•*•/•8•=•F•K•T•Y•b•g•p•u•~•ƒ•Œ•‘•š•Ÿ•¨•­•¶•»•ĕɕҕוà•å•î•ó•ü–– ––––&–+–4–9–B–G–P–U–^–c–l–q–z––ˆ––––›–¤–©–²–·–À–ŖΖӖܖá–ê–ï–ø–ý—— ———"—'—0—5—>—C—L—Q—Z—_—h—m—v—{—„—‰—’——— —¥—®—³—¼—Á—Ê—Ï—Ø—Ý—æ—ë—ô—ù˜˜˜˜˜˜#˜,˜1˜:˜?˜H˜M˜V˜[˜d˜i˜r˜w˜€˜…˜Ž˜“˜œ˜¡˜ª˜¯˜¸˜½˜Æ˜Ë˜Ô˜Ù˜â˜ç˜ð˜õ˜þ™™ ™™™™(™-™6™;™D™I™R™W™`™e™n™s™|™™Š™™˜™™¦™«™´™¹™Â™Ç™Ð™Õ™Þ™ã™ì™ñ™ú™ÿšš ššš$š)š2š7š@šEšNšSš\šašjšošxš}š†š‹š”š™š¢š§š°šµš¾šÃšÌšÑšÚšßšèšíšöšû›› ››› ›%›.›3›<›A›J›O›X›]›f›k›t›y›‚›‡››•›ž›£›¬›±›º›¿›È›Í›Ö›Û›ä›é›ò›÷œœœœœœ!œ*œ/œ8œ=œFœKœTœYœbœgœpœuœ~œƒœŒœ‘œšœŸœ¨œ­œ¶œ»œÄœÉœÒœ×œàœåœîœóœü &+49BGPU^clqzˆ–›¤©²·ÀÅÎÓÜáêïøýžž žžž"ž'ž0ž5ž>žCžLžQžZž_žhžmžvž{ž„ž‰ž’ž—ž ž¥ž®ž³ž¼žÁžÊžÏžØžÝžæžëžôžùŸŸŸŸŸŸ#Ÿ,Ÿ1Ÿ:Ÿ?ŸHŸMŸVŸ[ŸdŸiŸrŸwŸ€Ÿ…ŸŽŸ“ŸœŸ¡ŸªŸ¯Ÿ¸Ÿ½ŸÆŸËŸÔŸÙŸâŸçŸðŸõŸþ       ( - 6 ; D I R W ` e n s |  Š  ˜  ¦ « ´ ¹ Â Ç Ð Õ Þ ã ì ñ ú ÿ¡¡ ¡¡¡$¡)¡2¡7¡@¡E¡N¡S¡\¡a¡j¡o¡x¡}¡†¡‹¡”¡™¡¢¡§¡°¡µ¡¾¡Ã¡Ì¡Ñ¡Ú¡ß¡è¡í¡ö¡û¢¢ ¢¢¢ ¢%¢.¢3¢<¢A¢J¢O¢X¢]¢f¢k¢t¢y¢‚¢‡¢¢•¢ž¢£¢¬¢±¢º¢¿¢È¢Í¢Ö¢Û¢ä¢é¢ò¢÷££££££!£*£/£8£=£F£K£T£Y£b£g£p£u£~£ƒ£Œ£‘£š£Ÿ£¨£­£¶£»£Ä£É£Ò£×£à£å£î£ó£ü¤¤ ¤¤¤¤&¤+¤4¤9¤B¤G¤P¤U¤^¤c¤l¤q¤z¤¤ˆ¤¤–¤›¤¤¤©¤²¤·¤À¤Å¤Î¤Ó¤Ü¤á¤ê¤ï¤ø¤ý¥¥ ¥¥¥"¥'¥0¥5¥>¥C¥L¥Q¥Z¥_¥h¥m¥v¥{¥„¥‰¥’¥—¥ ¥¥¥®¥³¥¼¥Á¥Ê¥Ï¥Ø¥Ý¥æ¥ë¥ô¥ù¦¦¦¦¦¦#¦,¦1¦:¦?¦H¦M¦V¦[¦d¦i¦r¦w¦€¦…¦Ž¦“¦œ¦¡¦ª¦¯¦¸¦½¦Æ¦Ë¦Ô¦Ù¦â¦ç¦ð¦õ¦þ§§ §§§§(§-§6§;§D§I§R§W§`§e§n§s§|§§Š§§˜§§¦§«§´§¹§Â§Ç§Ð§Õ§Þ§ã§ì§ñ§ú§ÿ¨¨ ¨¨¨$¨)¨2¨7¨@¨E¨N¨S¨\¨a¨j¨o¨x¨}¨†¨‹¨”¨™¨¢¨§¨°¨µ¨¾¨Ã¨Ì¨Ñ¨Ú¨ß¨è¨í¨ö¨û©© ©©© ©%©.©3©<©A©J©O©X©]©f©k©t©y©‚©‡©©•©ž©£©¬©±©º©¿©È©Í©Ö©Û©ä©é©ò©÷ªªªªªª!ª*ª/ª8ª=ªFªKªTªYªbªgªpªuª~ªƒªŒª‘ªšªŸª¨ª­ª¶ª»ªÄªÉªÒª×ªàªåªîªóªü«« ««««&«+«4«9«B«G«P«U«^«c«l«q«z««ˆ««–«›«¤«©«²«·«À«Å«Î«Ó«Ü«á«ê«ï«ø«ý¬¬ ¬¬¬"¬'¬0¬5¬>¬C¬L¬Q¬Z¬_¬h¬m¬v¬{¬„¬‰¬’¬—¬ ¬¥¬®¬³¬¼¬Á¬Ê¬Ï¬Ø¬Ý¬æ¬ë¬ô¬ù­­­­­­#­,­1­:­?­H­M­V­[­d­i­r­w­€­…­Ž­“­œ­¡­ª­¯­¸­½­Æ­Ë­Ô­Ù­â­ç­ð­õ­þ®® ®®®®(®-®6®;®D®I®R®W®`®e®n®s®|®®Š®®˜®®¦®«®´®¹®Â®Ç®Ð®Õ®Þ®ã®ì®ñ®ú®ÿ¯¯ ¯¯¯$¯)¯2¯7¯@¯E¯N¯S¯\¯a¯j¯o¯x¯}¯†¯‹¯”¯™¯¢¯§¯°¯µ¯¾¯Ã¯Ì¯Ñ¯Ú¯ß¯è¯í¯ö¯û°° °°° °%°.°3°<°A°J°O°X°]°f°k°t°y°‚°‡°°•°ž°£°¬°±°º°¿°È°Í°Ö°Û°ä°é°ò°÷±±±±±±!±*±/±8±=±F±K±T±Y±b±g±p±u±~±ƒ±Œ±‘±š±Ÿ±¨±­±¶±»±Ä±É±Ò±×±à±å±î±ó±ü²² ²²²²&²+²4²9²B²G²P²U²^²c²l²q²z²²ˆ²²–²›²¤²©²²²·²À²Å²Î²Ó²Ü²á²ê²ï²ø²ý³³ ³³³"³'³0³5³>³C³L³Q³Z³_³h³m³v³{³„³‰³’³—³ ³¥³®³³³¼³Á³Ê³Ï³Ø³Ý³æ³ë³ô³ù´´´´´´#´,´1´:´?´H´M´V´[´d´i´r´w´€´…´Ž´“´œ´¡´ª´¯´¸´½´Æ´Ë´Ô´Ù´â´ç´ð´õ´þµµ µµµµ(µ-µ6µ;µDµIµRµWµ`µeµnµsµ|µµŠµµ˜µµ¦µ«µ´µ¹µÂµÇµÐµÕµÞµãµìµñµúµÿ¶¶ ¶¶¶$¶)¶2¶7¶@¶E¶N¶S¶\¶a¶j¶o¶x¶}¶†¶‹¶”¶™¶¢¶§¶°¶µ¶¾¶Ã¶Ì¶Ñ¶Ú¶ß¶è¶í¶ö¶û·· ··· ·%·.·3·<·A·J·O·X·]·f·k·t·y·‚·‡··•·ž·£·¬·±·º·¿·È·Í·Ö·Û·ä·é·ò·÷¸¸¸¸¸¸!¸*¸/¸8¸=¸F¸K¸T¸Y¸b¸g¸p¸u¸~¸ƒ¸Œ¸‘¸š¸Ÿ¸¨¸­¸¶¸»¸Ä¸É¸Ò¸×¸à¸å¸î¸ó¸ü¹¹ ¹¹¹¹&¹+¹4¹9¹B¹G¹P¹U¹^¹c¹l¹q¹z¹¹ˆ¹¹–¹›¹¤¹©¹²¹·¹À¹Å¹Î¹Ó¹Ü¹á¹ê¹ï¹ø¹ýºº ººº"º'º0º5º>ºCºLºQºZº_ºhºmºvº{º„º‰º’º—º º¥º®º³º¼ºÁºÊºÏºØºÝºæºëºôºù»»»»»»#»,»1»:»?»H»M»V»[»d»i»r»w»€»…»Ž»“»œ»¡»ª»¯»¸»½»Æ»Ë»Ô»Ù»â»ç»ð»õ»þ¼¼ ¼¼¼¼(¼-¼6¼;¼D¼I¼R¼W¼`¼e¼n¼s¼|¼¼Š¼¼˜¼¼¦¼«¼´¼¹¼Â¼Ç¼Ð¼Õ¼Þ¼ã¼ì¼ñ¼ú¼ÿ½½ ½½½$½)½2½7½@½E½N½S½\½a½j½o½x½}½†½‹½”½™½¢½§½°½µ½¾½Ã½Ì½Ñ½Ú½ß½è½í½ö½û¾¾ ¾¾¾ ¾%¾.¾3¾<¾A¾J¾O¾X¾]¾f¾k¾t¾y¾‚¾‡¾¾•¾ž¾£¾¬¾±¾º¾¿¾È¾Í¾Ö¾Û¾ä¾é¾ò¾÷¿¿¿¿¿¿!¿*¿/¿8¿=¿F¿K¿T¿Y¿b¿g¿p¿u¿~¿ƒ¿Œ¿‘¿š¿Ÿ¿¨¿­¿¶¿»¿Ä¿É¿Ò¿×¿à¿å¿î¿ó¿üÀÀ ÀÀÀÀ&À+À4À9ÀBÀGÀPÀUÀ^ÀcÀlÀqÀzÀÀˆÀÀ–À›À¤À©À²À·ÀÀÀÅÀÎÀÓÀÜÀáÀêÀïÀøÀýÁÁ ÁÁÁ"Á'Á0Á5Á>ÁCÁLÁQÁZÁ_ÁhÁmÁvÁ{Á„Á‰Á’Á—Á Á¥Á®Á³Á¼ÁÁÁÊÁÏÁØÁÝÁæÁëÁôÁùÂÂÂÂÂÂ#Â,Â1Â:Â?ÂHÂMÂVÂ[ÂdÂiÂrÂw€Â…ÂŽ“œ¡ª¯¸½ÂÆÂËÂÔÂÙÂâÂçÂðÂõÂþÃà ÃÃÃÃ(Ã-Ã6Ã;ÃDÃIÃRÃWÃ`ÃeÃnÃsÃ|ÃÊÃØÃæëôùÃÂÃÇÃÐÃÕÃÞÃãÃìÃñÃúÃÿÄÄ ÄÄÄ$Ä)Ä2Ä7Ä@ÄEÄNÄSÄ\ÄaÄjÄoÄxÄ}ĆċĔęĢħİĵľÄÃÄÌÄÑÄÚÄßÄèÄíÄöÄûÅÅ ÅÅÅ Å%Å.Å3Å<ÅAÅJÅOÅXÅ]ÅfÅkÅtÅyÅ‚ŇÅŕŞţŬűźÅ¿ÅÈÅÍÅÖÅÛÅäÅéÅòÅ÷ÆÆÆÆÆÆ!Æ*Æ/Æ8Æ=ÆFÆKÆTÆYÆbÆgÆpÆuÆ~ƃƌƑƚƟƨÆ­ƶÆ»ÆÄÆÉÆÒÆ×ÆàÆåÆîÆóÆüÇÇ ÇÇÇÇ&Ç+Ç4Ç9ÇBÇGÇPÇUÇ^ÇcÇlÇqÇzÇLjÇÇ–Ç›ǤÇ©DzÇ·ÇÀÇÅÇÎÇÓÇÜÇáÇêÇïÇøÇýÈÈ ÈÈÈ"È'È0È5È>ÈCÈLÈQÈZÈ_ÈhÈmÈvÈ{È„ȉȒȗȠȥȮȳȼÈÁÈÊÈÏÈØÈÝÈæÈëÈôÈùÉÉÉÉÉÉ#É,É1É:É?ÉHÉMÉVÉ[ÉdÉiÉrÉwɀɅɎɓɜɡɪɯɸɽÉÆÉËÉÔÉÙÉâÉçÉðÉõÉþÊÊ ÊÊÊÊ(Ê-Ê6Ê;ÊDÊIÊRÊWÊ`ÊeÊnÊsÊ|ÊÊŠÊʘÊʦʫʴʹÊÂÊÇÊÐÊÕÊÞÊãÊìÊñÊúÊÿËË ËËË$Ë)Ë2Ë7Ë@ËEËNËSË\ËaËjËoËxË}ˆË‹Ë”˙ˢ˧˰˵˾ËÃËÌËÑËÚËßËèËíËöËûÌÌ ÌÌÌ Ì%Ì.Ì3Ì<ÌAÌJÌOÌXÌ]ÌfÌkÌtÌyÌ‚̇Ì̞̣̬̱̺̕Ì¿ÌÈÌÍÌÖÌÛÌäÌéÌòÌ÷ÍÍÍÍÍÍ!Í*Í/Í8Í=ÍFÍKÍTÍYÍbÍgÍpÍuÍ~͚̓͌͑ͨ͟Í­ͶÍ»ÍÄÍÉÍÒÍ×ÍàÍåÍîÍóÍüÎÎ ÎÎÎÎ&Î+Î4Î9ÎBÎGÎPÎUÎ^ÎcÎlÎqÎzÎΈÎΖΛΤΩβηÎÀÎÅÎÎÎÓÎÜÎáÎêÎïÎøÎýÏÏ ÏÏÏ"Ï'Ï0Ï5Ï>ÏCÏLÏQÏZÏ_ÏhÏmÏvÏ{Ï„ωϒϗϠϥϮϳϼÏÁÏÊÏÏÏØÏÝÏæÏëÏôÏùÐÐÐÐÐÐ#Ð,Ð1Ð:Ð?ÐHÐMÐVÐ[ÐdÐiÐrÐwЀÐ…ÐŽГМСЪЯинÐÆÐËÐÔÐÙÐâÐçÐðÐõÐþÑÑ ÑÑÑÑ(Ñ-Ñ6Ñ;ÑDÑIÑRÑWÑ`ÑeÑnÑsÑ|ÑÑŠÑјÑѦѫѴѹÑÂÑÇÑÐÑÕÑÞÑãÑìÑñÑúÑÿÒÒ ÒÒÒ$Ò)Ò2Ò7Ò@ÒEÒNÒSÒ\ÒaÒjÒoÒxÒ}Ò†Ò‹Ò”Ò™Ò¢Ò§Ò°ÒµÒ¾ÒÃÒÌÒÑÒÚÒßÒèÒíÒöÒûÓÓ ÓÓÓ Ó%Ó.Ó3Ó<ÓAÓJÓOÓXÓ]ÓfÓkÓtÓyÓ‚Ó‡ÓÓ•ÓžÓ£Ó¬Ó±ÓºÓ¿ÓÈÓÍÓÖÓÛÓäÓéÓòÓ÷ÔÔÔÔÔÔ!Ô*Ô/Ô8Ô=ÔFÔKÔTÔYÔbÔgÔpÔuÔ~ԃԌԑԚԟԨԭԶԻÔÄÔÉÔÒÔ×ÔàÔåÔîÔóÔüÕÕ ÕÕÕÕ&Õ+Õ4Õ9ÕBÕGÕPÕUÕ^ÕcÕlÕqÕzÕÕˆÕÕ–Õ›Õ¤Õ©Õ²Õ·ÕÀÕÅÕÎÕÓÕÜÕáÕêÕïÕøÕýÖÖ ÖÖÖ"Ö'Ö0Ö5Ö>ÖCÖLÖQÖZÖ_ÖhÖmÖvÖ{Ö„Ö‰Ö’Ö—Ö Ö¥Ö®Ö³Ö¼ÖÁÖÊÖÏÖØÖÝÖæÖëÖôÖù××××××#×,×1×:×?×H×M×V×[×d×i×r×w×€×…׎דלסתׯ׸×½ׯ×Ë×Ô×Ù×â×ç×ð×õ×þØØ ØØØØ(Ø-Ø6Ø;ØDØIØRØWØ`ØeØnØsØ|ØØŠØؘØئثشعØÂØÇØÐØÕØÞØãØìØñØúØÿÙÙ ÙÙÙ$Ù)Ù2Ù7Ù@ÙEÙNÙSÙ\ÙaÙjÙoÙxÙ}نًٔٙ٢٧ٰٵپÙÃÙÌÙÑÙÚÙßÙèÙíÙöÙûÚÚ ÚÚÚ Ú%Ú.Ú3Ú<ÚAÚJÚOÚXÚ]ÚfÚkÚtÚyÚ‚Ú‡ÚÚ•ÚžÚ£Ú¬Ú±ÚºÚ¿ÚÈÚÍÚÖÚÛÚäÚéÚòÚ÷ÛÛÛÛÛÛ!Û*Û/Û8Û=ÛFÛKÛTÛYÛbÛgÛpÛuÛ~ۃیۑۭۚ۟ۨ۶ۻÛÄÛÉÛÒÛ×ÛàÛåÛîÛóÛüÜÜ ÜÜÜÜ&Ü+Ü4Ü9ÜBÜGÜPÜUÜ^ÜcÜlÜqÜzÜ܈ÜÜ–Ü›ܤÜ©ܲÜ·ÜÀÜÅÜÎÜÓÜÜÜáÜêÜïÜøÜýÝÝ ÝÝÝ"Ý'Ý0Ý5Ý>ÝCÝLÝQÝZÝ_ÝhÝmÝvÝ{Ý„݉ݒݗݠݥݮݳݼÝÁÝÊÝÏÝØÝÝÝæÝëÝôÝùÞÞÞÞÞÞ#Þ,Þ1Þ:Þ?ÞHÞMÞVÞ[ÞdÞiÞrÞwÞ€Þ…ÞŽÞ“ÞœÞ¡ÞªÞ¯Þ¸Þ½ÞÆÞËÞÔÞÙÞâÞçÞðÞõÞþßß ßßßß(ß-ß6ß;ßDßIßRßWß`ßeßnßsß|ßߊßߘßߦ߫ߴ߹ßÂßÇßÐßÕßÞßãßìßñßúßÿàà ààà$à)à2à7à@àEàNàSà\àaàjàoàxà}à†à‹à”à™à¢à§à°àµà¾àÃàÌàÑàÚàßàèàíàöàûáá ááá á%á.á3á<áAáJáOáXá]áfákátáyá‚á‡áá•ážá£á¬á±áºá¿áÈáÍáÖáÛáäáéáòá÷ââââââ!â*â/â8â=âFâKâTâYâbâgâpâuâ~âƒâŒâ‘âšâŸâ¨â­â¶â»âÄâÉâÒâ×âàâåâîâóâüãã ãããã&ã+ã4ã9ãBãGãPãUã^ãcãlãqãzããˆãã–ã›ã¤ã©ã²ã·ãÀãÅãÎãÓãÜãáãêãïãøãýää äää"ä'ä0ä5ä>äCäLäQäZä_ähämävä{ä„ä‰ä’ä—ä ä¥ä®ä³ä¼äÁäÊäÏäØäÝäæäëäôäùåååååå#å,å1å:å?åHåMåVå[ådåiåråwå€å…åŽå“åœå¡åªå¯å¸å½åÆåËåÔåÙåâåçåðåõåþææ ææææ(æ-æ6æ;æDæIæRæWæ`æeænæsæ|ææŠææ˜ææ¦æ«æ´æ¹æÂæÇæÐæÕæÞæãæìæñæúæÿçç ççç$ç)ç2ç7ç@çEçNçSç\çaçjçoçxç}ç†ç‹ç”ç™ç¢ç§ç°çµç¾çÃçÌçÑçÚçßçèçíçöçûèè èèè è%è.è3è<èAèJèOèXè]èfèkètèyè‚è‡èè•èžè£è¬è±èºè¿èÈèÍèÖèÛèäèéèòè÷éééééé!é*é/é8é=éFéKéTéYébégépéué~éƒéŒé‘éšéŸé¨é­é¶é»éÄéÉéÒé×éàéåéîéóéüêê êêêê&ê+ê4ê9êBêGêPêUê^êcêlêqêzêêˆêê–ê›ê¤ê©ê²ê·êÀêÅêÎêÓêÜêáêêêïêøêýëë ëëë"ë'ë0ë5ë>ëCëLëQëZë_ëhëmëvë{ë„ë‰ë’ë—ë ë¥ë®ë³ë¼ëÁëÊëÏëØëÝëæëëëôëùìììììì#ì,ì1ì:ì?ìHìMìVì[ìdìiìrìwì€ì…ìŽì“ìœì¡ìªì¯ì¸ì½ìÆìËìÔìÙìâìçìðìõìþíí íííí(í-í6í;íDíIíRíWí`íeínísí|ííŠíí˜íí¦í«í´í¹íÂíÇíÐíÕíÞíãíìíñíúíÿîî îîî$î)î2î7î@îEîNîSî\îaîjîoîxî}î†î‹î”î™î¢î§î°îµî¾îÃîÌîÑîÚîßîèîíîöîûïï ïïï ï%ï.ï3ï<ïAïJïOïXï]ïfïkïtïyï‚ï‡ïï•ïžï£ï¬ï±ïºï¿ïÈïÍïÖïÛïäïéïòï÷ðððððð!ð*ð/ð8ð=ðFðKðTðYðbðgðpðuð~ðƒðŒð‘ðšðŸð¨ð­ð¶ð»ðÄðÉðÒð×ðàðåðîðóðüññ ññññ&ñ+ñ4ñ9ñBñGñPñUñ^ñcñlñqñzññˆññ–ñ›ñ¤ñ©ñ²ñ·ñÀñÅñÎñÓñÜñáñêñïñøñýòò òòò"ò'ò0ò5ò>òCòLòQòZò_òhòmòvò{ò„ò‰ò’ò—ò ò¥ò®ò³ò¼òÁòÊòÏòØòÝòæòëòôòùóóóóóó#ó,ó1ó:ó?óHóMóVó[ódóiórówó€ó…óŽó“óœó¡óªó¯ó¸ó½óÆóËóÔóÙóâóçóðóõóþôô ôôôô(ô-ô6ô;ôDôIôRôWô_ôdôkô’ô™ô ô§ô®ôµô¼ôÃôÊôÑôØôßôæôíôôôûõõ õõõõ%õ,õ3õ:õAõHõOõVõ]õdõkõrõyõ€õ‡õŽõ•õœõ£õªõ±õ¸õ¿õÆõÍõÔõÛõâõéõðõ÷õþöö ööö!ö(ö/ö6ö=öDöKöRöYö`ögönöuö|öƒöŠö‘ö˜öŸö¦ö­ö´ö»öÂöÉöÐö×öÞöåöìöóöú÷÷÷÷÷÷$÷+÷2÷9÷@÷G÷N÷U÷\÷c÷j÷q÷x÷÷†÷÷”÷›÷¢÷©÷°÷·÷¾÷Å÷Ì÷Ó÷Ú÷á÷è÷ï÷ö÷ýøø øøø ø'ø.ø5ø<øCøJøQøXø_øfømøtø{ø‚ø‰øø—øžø¥ø¬ø³øºøÁøÈøÏøÖøÝøäøëøòøùùùùùùù#ù*ù1ù8ù?ùFùMùTù[ùbùiùpùwù~ù…ùŒù“ùšù¡ù¨ù¯ù¶ù½ùÄùËùÒùÙùàùçùîùõùüúú úúúú&ú-ú4ú;úBúIúPúWú^úeúlúsúzúúˆúú–úú¤ú«ú²ú¹úÀúÇúÎúÕúÜúãúêúñúøúÿûû ûûû"û)û0û7û>ûEûLûSûZûaûhûoûvû}û„û‹û’û™û û§û®ûµû¼ûÃûÊûÑûØûßûæûíûôûûüü üüüü%ü,ü3ü:üAüHüOüVü]üdükürüyü€ü‡üŽü•üœü£üªü±ü¸ü¿üÆüÍüÔüÛüâüéüðü÷üþýý ýýý!ý(ý/ý6ý=ýDýKýRýYý`ýgýnýuý|ýƒýŠý‘ý˜ýŸý¦ý­ý´ý»ýÂýÉýÐý×ýÞýåýìýóýúþþþþþþ$þ+þ2þ9þ@þGþNþUþ\þcþjþqþxþþ†þþ”þ›þ¢þ©þ°þ·þ¾þÅþÌþÓþÚþáþèþïþöþýÿÿ ÿÿÿ ÿ'ÿ.ÿ5ÿ<ÿCÿJÿQÿXÿ_ÿfÿmÿtÿ{ÿ‚ÿ‰ÿÿ—ÿžÿ¥ÿ¬ÿ³ÿºÿÁÿÈÿÏÿÖÿÝÿäÿëÿòÿù#*18?FMT[bipw~…Œ“𡍝¶½ÄËÒÙàçîõü &-4;BIPW^elszˆ–¤«²¹ÀÇÎÕÜãêñøÿ ")07>ELSZahov}„‹’™ §®µ¼ÃÊÑØßæíôû %,3:AHOV]dkry€‡Ž•œ£ª±¸¿ÆÍÔÛâéð÷þ !(/6=DKRY`gnu|ƒŠ‘˜Ÿ¦­´»ÂÉÐ×Þåìóú$+29@GNU\cjqx†”›¢©°·¾ÅÌÓÚáèïöý  '.5<CJQX_fmt{‚‰—ž¥¬³ºÁÈÏÖÝäëòù#*18?FMT[bipw~…Œ“𡍝¶½ÄËÒÙàçîõü &-4;BIPW^elszˆ–¤«²¹ÀÇÎÕÜãêñøÿ     " ) 0 7 > E L S Z a h o v } „ ‹ ’ ™   § ® µ ¼ Ã Ê Ñ Ø ß æ í ô û      % , 3 : A H O V ] d k r y € ‡ Ž • œ £ ª ± ¸ ¿ Æ Í Ô Û â é ð ÷ þ     ! ( / 6 = D K R Y ` g n u | ƒ Š ‘ ˜ Ÿ ¦ ­ ´ » Â É Ð × Þ å ì ó ú      $ + 2 9 @ G N U \ c j q x  †  ” › ¢ © ° · ¾ Å Ì Ó Ú á è ï ö ý      ' . 5 < C J Q X _ f m t { ‚ ‰  — ž ¥ ¬ ³ º Á È Ï Ö Ý ä ë ò ù#*18?FMT[bipw~…Œ“𡍝¶½ÄËÒÙàçîõü &-4;BIPW^elszˆ–¤«²¹ÀÇÎÕÜãêñøÿ ")07>ELSZahov}„‹’™ §®µ¼ÃÊÑØßæíôû %,3:AHOV]dkry€‡Ž•œ£ª±¸¿ÆÍÔÛâéð÷þ !(/6=DKRY`gnu|ƒŠ‘˜Ÿ¦­´»ÂÉÐ×Þåìóú$+29@GNU\cjqx†”›¢©°·¾ÅÌÓÚáèïöý  '.5<CJQX_fmt{‚‰—ž¥¬³ºÁÈÏÖÝäëòù#*18?FMT[bipw~…Œ“𡍝¶½ÄËÒÙàçîõü &-4;BIPW^elszˆ–¤«²¹ÀÇÎÕÜãêñøÿ ")07>ELSZahov}„‹’™ §®µ¼ÃÊÑØßæíôû %,3:AHOV]dkry€‡Ž•œ£ª±¸¿ÆÍÔÛâéð÷þ !(/6=DKRY`gnu|ƒŠ‘˜Ÿ¦­´»ÂÉÐ×Þåìóú$+29@GNU\cjqx†”›¢©°·¾ÅÌÓÚáèïöý  '.5<CJQX_fmt{‚‰—ž¥¬³ºÁÈÏÖÝäëòù#*18?FMT[bipw~…Œ“𡍝¶½ÄËÒÙàçîõü &-4;BIPW^elszˆ–¤«²¹ÀÇÎÕÜãêñøÿ ")07>ELSZahov}„‹’™ §®µ¼ÃÊÑØßæíôû %,3:AHOV]dkry€‡Ž•œ£ª±¸¿ÆÍÔÛâéð÷þ     ! ( / 6 = D K R Y ` g n u | ƒ Š ‘ ˜ Ÿ ¦ ­ ´ » Â É Ð × Þ å ì ó ú!!!!!!$!+!2!9!@!G!N!U!\!c!j!q!x!!†!!”!›!¢!©!°!·!¾!Å!Ì!Ó!Ú!á!è!ï!ö!ý"" """ "'"."5"<"C"J"Q"X"_"f"m"t"{"‚"‰""—"ž"¥"¬"³"º"Á"È"Ï"Ö"Ý"ä"ë"ò"ù########*#1#8#?#F#M#T#[#b#i#p#w#~#…#Œ#“#š#¡#¨#¯#¶#½#Ä#Ë#Ò#Ù#à#ç#î#õ#ü$$ $$$$&$-$4$;$B$I$P$W$^$e$l$s$z$$ˆ$$–$$¤$«$²$¹$À$Ç$Î$Õ$Ü$ã$ê$ñ$ø$ÿ%% %%%"%)%0%7%>%E%L%S%Z%a%h%o%v%}%„%‹%’%™% %§%®%µ%¼%Ã%Ê%Ñ%Ø%ß%æ%í%ô%û&& &&&&%&,&3&:&A&H&O&V&]&d&k&r&y&€&‡&Ž&•&œ&£&ª&±&¸&¿&Æ&Í&Ô&Û&â&é&ð&÷&þ'' '''!'('/'6'='D'K'R'Y'`'g'n'u'|'ƒ'Š'‘'˜'Ÿ'¦'­'´'»'Â'É'Ð'×'Þ'å'ì'ó'ú(((((($(+(2(9(@(G(N(U(\(c(j(q(x((†((”(›(¢(©(°(·(¾(Å(Ì(Ó(Ú(á(è(ï(ö(ý)) ))) )').)5)<)C)J)Q)X)_)f)m)t){)‚)‰))—)ž)¥)¬)³)º)Á)È)Ï)Ö)Ý)ä)ë)ò)ù******#***1*8*?*F*M*T*[*b*i*p*w*~*…*Œ*“*š*¡*¨*¯*¶*½*Ä*Ë*Ò*Ù*à*ç*î*õ*ü++ ++++&+-+4+;+B+I+P+W+^+e+l+s+z++ˆ++–++¤+«+²+¹+À+Ç+Î+Õ+Ü+ã+ê+ñ+ø+ÿ,, ,,,",),0,7,>,E,L,S,Z,a,h,o,v,},„,‹,’,™, ,§,®,µ,¼,Ã,Ê,Ñ,Ø,ß,æ,í,ô,û-- ----%-,-3-:-A-H-O-V-]-d-k-r-y-€-‡-Ž-•-œ-£-ª-±-¸-¿-Æ-Í-Ô-Û-â-é-ð-÷-þ.. ...!.(./.6.=.D.K.R.Y.`.g.n.u.|.ƒ.Š.‘.˜.Ÿ.¦.­.´.».Â.É.Ð.×.Þ.å.ì.ó.ú//////$/+/2/9/@/G/N/U/\/c/j/q/x//†//”/›/¢/©/°/·/¾/Å/Ì/Ó/Ú/á/è/ï/ö/ý00 000 0'0.050<0C0J0Q0X0_0f0m0t0{0‚0‰00—0ž0¥0¬0³0º0Á0È0Ï0Ö0Ý0ä0ë0ò0ù111111#1*11181?1F1M1T1[1b1i1p1w1~1…1Œ1“1š1¡1¨1¯1¶1½1Ä1Ë1Ò1Ù1à1ç1î1õ1ü22 2222&2-242;2B2I2P2W2^2e2l2s2z22ˆ22–22¤2«2²2¹2À2Ç2Î2Õ2Ü2ã2ê2ñ2ø2ÿ33 333"3)30373>3E3L3S3Z3a3h3o3v3}3„3‹3’3™3 3§3®3µ3¼3Ã3Ê3Ñ3Ø3ß3æ3í3ô3û44 4444%4,434:4A4H4O4V4]4d4k4r4y4€4‡4Ž4•4œ4£4ª4±4¸4¿4Æ4Í4Ô4Û4â4é4ð4÷4þ55 555!5(5/565=5D5K5R5Y5`5g5n5u5|5ƒ5Š5‘5˜5Ÿ5¦5­5´5»5Â5É5Ð5×5Þ5å5ì5ó5ú666666$6+62696@6G6N6U6\6c6j6q6x66†66”6›6¢6©6°6·6¾6Å6Ì6Ó6Ú6á6è6ï6ö6ý77 777 7'7.757<7C7J7Q7X7_7f7m7t7{7‚7‰77—7ž7¥7¬7³7º7Á7È7Ï7Ö7Ý7ä7ë7ò7ù888888#8*81888?8F8M8T8[8b8i8p8w8~8…8Œ8“8š8¡8¨8¯8¶8½8Ä8Ë8Ò8Ù8à8ç8î8õ8ü99 9999&9-949;9B9I9P9W9^9e9l9s9z99ˆ99–99¤9«9²9¹9À9Ç9Î9Õ9Ü9ã9ê9ñ9ø9ÿ:: :::":):0:7:>:E:L:S:Z:a:h:o:v:}:„:‹:’:™: :§:®:µ:¼:Ã:Ê:Ñ:Ø:ß:æ:í:ô:û;; ;;;;%;,;3;:;A;H;O;V;];d;k;r;y;€;‡;Ž;•;œ;£;ª;±;¸;¿;Æ;Í;Ô;Û;â;é;ð;÷;þ<< <<> >>> >'>.>5><>C>J>Q>X>_>f>m>t>{>‚>‰>>—>ž>¥>¬>³>º>Á>È>Ï>Ö>Ý>ä>ë>ò>ù??????#?*?1?8???F?M?T?[?b?i?p?w?~?…?Œ?“?š?¡?¨?¯?¶?½?Ä?Ë?Ò?Ù?à?ç?î?õ?ü@@ @@@@&@-@4@;@B@I@P@W@^@e@l@s@z@@ˆ@@–@@¤@«@²@¹@À@Ç@Î@Õ@Ü@ã@ê@ñ@ø@ÿAA AAA"A)A0A7A>AEALASAZAaAhAoAvA}A„A‹A’A™A A§A®AµA¼AÃAÊAÑAØAßAæAíAôAûBB BBBB%B,B3B:BABHBOBVB]BdBkBrByB€B‡BŽB•BœB£BªB±B¸B¿BÆBÍBÔBÛBâBéBðB÷BþCC CCC!C(C/C6C=CDCKCRCYC`CgCnCuC|CƒCŠC‘C˜CŸC¦C­C´C»CÂCÉCÐC×CÞCåCìCóCúDDDDDD$D+D2D9D@DGDNDUD\DcDjDqDxDD†DD”D›D¢D©D°D·D¾DÅDÌDÓDÚDáDèDïDöDýEE EEE E'E.E5E<ECEJEQEXE_EfEmEtE{E‚E‰EE—EžE¥E¬E³EºEÁEÈEÏEÖEÝEäEëEòEùFFFFFF#F*F1F8F?FFFMFTF[FbFiFpFwF~F…FŒF“FšF¡F¨F¯F¶F½FÄFËFÒFÙFàFçFîFõFüGG GGGG&G-G4G;GBGIGPGWG^GeGlGsGzGGˆGG–GG¤G«G²G¹GÀGÇGÎGÕGÜGãGêGñGøGÿHH HHH"H)H0H7H>HEHLHSHZHaHhHoHvH}H„H‹H’H™H H§H®HµH¼HÃHÊHÑHØHßHæHíHôHûII IIII%I,I3I:IAIHIOIVI]IdIkIrIyI€I‡IŽI•IœI£IªI±I¸I¿IÆIÍIÔIÛIâIéIðI÷IþJJ JJJ!J(J/J6J=JDJKJRJYJ`JgJnJuJ|JƒJŠJ‘J˜JŸJ¦J­J´J»JÂJÉJÐJ×JÞJåJìJóJúKKKKKK$K+K2K9K@KGKNKUK\KcKjKqKxKK†KK”K›K¢K©K°K·K¾KÅKÌKÓKÚKáKèKïKöKýLL LLL L'L.L5L<LCLJLQLXL_LfLmLtL{L‚L‰LL—LžL¥L¬L³LºLÁLÈLÏLÖLÝLäLëLòLùMMMMMM#M*M1M8M?MFMMMTM[MbMiMpMwM~M…MŒM“MšM¡M¨M¯M¶M½MÄMËMÒMÙMàMçMîMõMüNN NNNN&N-N4N;NBNINPNWN^NeNlNsNzNNˆNN–NN¤N«N²N¹NÀNÇNÎNÕNÜNãNêNñNøNÿOO OOO"O)O0O7O>OEOLOSOZOaOhOoOvO}O„O‹O’O™O O§O®OµO¼OÃOÊOÑOØOßOæOíOôOûPP PPPP%P,P3P:PAPHPOPVP]PdPkPrPyP€P‡PŽP•PœP£PªP±P¸P¿PÆPÍPÔPÛPâPéPðP÷PþQQ QQQ!Q(Q/Q6Q=QDQKQRQYQ`QgQnQuQ|QƒQŠQ‘Q˜QŸQ¦Q­Q´Q»QÂQÉQÐQ×QÞQåQìQóQúRRRRRR$R+R2R9R@RGRNRUR\RcRjRqRxRR†RR”R›R¢R©R°R·R¾RÅRÌRÓRÚRáRèRïRöRýSS SSS S'S.S5S<SCSJSQSXS_SfSmStS{S‚S‰SS—SžS¥S¬S³SºSÁSÈSÏSÖSÝSäSëSòSùTTTTTT#T*T1T8T?TFTMTTT[TbTiTpTwT~T…TŒT“TšT¡T¨T¯T¶T½TÄTËTÒTÙTàTçTîTõTüUU UUUU&U-U4U;UBUIUPUWU^UeUlUsUzUUˆUU–UU¤U«U²U¹UÀUÇUÎUÕUÜUãUêUñUøUÿVV VVV"V)V0V7V>VEVLVSVZVaVhVoVvV}V„V‹V’V™V V§V®VµV¼VÃVÊVÑVØVßVæVíVôVûWW WWWW%W,W3W:WAWHWOWVW]WdWkWrWyW€W‡WŽW•WœW£WªW±W¸W¿WÆWÍWÔWÛWâWéWðW÷WþXX XXX!X(X/X6X=XDXKXRXYX`XgXnXuX|XƒXŠX‘X˜XŸX¦X­X´X»XÂXÉXÐX×XÞXåXìXóXúYYYYYY$Y+Y2Y9Y@YGYNYUY\YcYjYqYxYY†YY”Y›Y¢Y©Y°Y·Y¾YÅYÌYÓYÚYáYèYïYöYýZZ ZZZ Z'Z.Z5Z<ZCZJZQZXZ_ZfZmZtZ{Z‚Z‰ZZ—ZžZ¥Z¬Z³ZºZÁZÈZÏZÖZÝZäZëZòZù[[[[[[#[*[1[8[?[F[M[T[[[b[i[p[w[~[…[Œ[“[š[¡[¨[¯[¶[½[Ä[Ë[Ò[Ù[à[ç[î[õ[ü\\ \\\\&\-\4\;\B\I\P\W\^\e\l\s\z\\ˆ\\–\\¤\«\²\¹\À\Ç\Î\Õ\Ü\ã\ê\ñ\ø\ÿ]] ]]]"])]0]7]>]E]L]S]Z]a]h]o]v]}]„]‹]’]™] ]§]®]µ]¼]Ã]Ê]Ñ]Ø]ß]æ]í]ô]û^^ ^^^^%^,^3^:^A^H^O^V^]^d^k^r^y^€^‡^Ž^•^œ^£^ª^±^¸^¿^Æ^Í^Ô^Û^â^é^ð^÷^þ__ ___!_(_/_6_=_D_K_R_Y_`_g_n_u_|_ƒ_Š_‘_˜_Ÿ_¦_­_´_»_Â_É_Ð_×_Þ_å_ì_ó_ú``````$`+`2`9`@`G`N`U`\`c`j`q`x``†``”`›`¢`©`°`·`¾`Å`Ì`Ó`Ú`á`è`ï`ö`ýaa aaa a'a.a5a<aCaJaQaXa_afamata{a‚a‰aa—aža¥a¬a³aºaÁaÈaÏaÖaÝaäaëaòaùbbbbbb#b*b1b8b?bFbMbTb[bbbibpbwb~b…bŒb“bšb¡b¨b¯b¶b½bÄbËbÒbÙbàbçbîbõbücc cccc&c-c4c;cBcIcPcWc^ceclcsczccˆcc–cc¤c«c²c¹cÀcÇcÎcÕcÜcãcêcñcøcÿdd ddd"d)d0d7d>dEdLdSdZdadhdodvd}d„d‹d’d™d d§d®dµd¼dÃdÊdÑdØdßdædídôdûee eeee%e,e3e:eAeHeOeVe]edekereye€e‡eŽe•eœe£eªe±e¸e¿eÆeÍeÔeÛeâeéeðe÷eþff fff!f(f/f6f=fDfKfRfYf`fgfnfuf|fƒfŠf‘f˜fŸf¦f­f´f»fÂfÉfÐf×fÞfåfìfófúgggggg$g+g2g9g@gGgNgUg\gcgjgqgxgg†gg”g›g¢g©g°g·g¾gÅgÌgÓgÚgágègïgögýhh hhh h'h.h5h<hChJhQhXh_hfhmhth{h‚h‰hh—hžh¥h¬h³hºhÁhÈhÏhÖhÝhähëhòhùiiiiii#i*i1i8i?iFiMiTi[ibiiipiwi~i…iŒi“iši¡i¨i¯i¶i½iÄiËiÒiÙiàiçiîiõiüjj jjjj&j-j4j;jBjIjPjWj^jejljsjzjjˆjj–jj¤j«j²j¹jÀjÇjÎjÕjÜjãjêjñjøjÿkk kkk"k)k0k7k>kEkLkSkZkakhkokvk}k„k‹k’k™k k§k®kµk¼kÃkÊkÑkØkßkækíkôkûll llll%l,l3l:lAlHlOlVl]ldlklrlyl€l‡lŽl•lœl£lªl±l¸l¿lÆlÍlÔlÛlâlélðl÷lþmm mmm!m(m/m6m=mDmKmRmYm`mgmnmum|mƒmŠm‘m˜mŸm¦m­m´m»mÂmÉmÐm×mÞmåmìmómúnnnnnn$n+n2n9n@nGnNnUn\ncnjnqnxnn†nn”n›n¢n©n°n·n¾nÅnÌnÓnÚnánènïnönýoo ooo o'o.o5o<oCoJoQoXo_ofomoto{o‚o‰oo—ožo¥o¬o³oºoÁoÈoÏoÖoÝoäoëoòoùpppppp#p*p1p8p?pFpMpTp[pbpipppwp~p…pŒp“pšp¡p¨p¯p¶p½pÄpËpÒpÙpàpçpîpõpüqq qqqq&q-q4q;qBqIqPqWq^qeqlqsqzqqˆqq–qq¤q«q²q¹qÀqÇqÎqÕqÜqãqêqñqøqÿrr rrr"r)r0r7r>rErLrSrZrarhrorvr}r„r‹r’r™r r§r®rµr¼rÃrÊrÑrØrßrærírôrûss ssss%s,s3s:sAsHsOsVs]sdsksrsys€s‡sŽs•sœs£sªs±s¸s¿sÆsÍsÔsÛsâsésðs÷sþtt ttt!t(t/t6t=tDtKtRtYt`tgtntut|tƒtŠt‘t˜tŸt¦t­t´t»tÂtÉtÐt×tÞtåtìtótúuuuuuu$u+u2u9u@uGuNuUu\ucujuquxuu†uu”u›u¢u©u°u·u¾uÅuÌuÓuÚuáuèuïuöuývv vvv v'v.v5v<vCvJvQvXv_vfvmvtv{v‚v‰vv—vžv¥v¬v³vºvÁvÈvÏvÖvÝvävëvòvùwwwwww#w*w1w8w?wFwMwTw[wbwiwpwww~w…wŒw“wšw¡w¨w¯w¶w½wÄwËwÒwÙwàwçwîwõwüxx xxxx&x-x4x;xBxIxPxWx^xexlxsxzxxˆxx–xx¤x«x²x¹xÀxÇxÎxÕxÜxãxêxñxøxÿyy yyy"y)y0y7y>yEyLySyZyayhyoyvy}y„y‹y’y™y y§y®yµy¼yÃyÊyÑyØyßyæyíyôyûzz zzzz%z,z3z:zAzHzOzVz]zdzkzrs zygnustep-base-1.29.0/Tests/base/PropertyLists/test00.m000066400000000000000000000070301435650067400223660ustar00rootroot00000000000000#import "Testing.h" #import #import #import #import #import static BOOL test_parse(NSString *string, id result) { return [[string propertyList] isEqual: result]; } int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS(test_parse(@"ariosto",@"ariosto"), "We can parse a string"); PASS(test_parse(@"\"ariosto\"",@"ariosto"), "We can parse a quoted string"); PASS(test_parse(@"\"ari\\033osto\"",@"ari\033osto"), "We can parse a quoted string with octal escape"); PASS(test_parse(@"(ariosto)", [NSArray arrayWithObject: @"ariosto"]), "We can parse a simple array with a single object"); PASS(test_parse(@"(\"ariosto\")", [NSArray arrayWithObject: @"ariosto"]), "We can parse a simple array with a single object between \"s"); PASS(test_parse(@"(ariosto, boccaccio)", [NSArray arrayWithObjects: @"ariosto", @"boccaccio", nil]), "We can parse a simple array with two objects"); PASS(test_parse(@"(ariosto, boccaccio, \"leopardi\")", [NSArray arrayWithObjects: @"ariosto", @"boccaccio", @"leopardi", nil]), "We can parse a simple array with three objects, with \"s"); PASS(test_parse(@"(ariosto /* I like this one */, boccaccio)", [NSArray arrayWithObjects: @"ariosto", @"boccaccio", nil]), "We can parse a simple array with two objects and a C comment"); PASS(test_parse(@"(ariosto, // I like this one\n boccaccio)", [NSArray arrayWithObjects: @"ariosto", @"boccaccio", nil]), "We can parse a simple array with two objects and a C++ comment"); PASS(test_parse(@"{}", [NSDictionary dictionary]), "We can parse an empty dictionary"); PASS(test_parse(@"{author = ariosto; title = \"orlando furioso\"; }", [NSDictionary dictionaryWithObjectsAndKeys: @"ariosto", @"author", @"orlando furioso", @"title", nil]), "We can parse a simple dictionary with a two key value pairs"); PASS(test_parse(@"{/* -*-c-*- */ author = ariosto; title = \"orlando furioso\"; }", [NSDictionary dictionaryWithObjectsAndKeys: @"ariosto", @"author", @"orlando furioso", @"title", nil]), "We can parse a simple dictionary with a two key value pairs and a C comment"); PASS(test_parse(@"{// -*-c-*-\n author = ariosto; title = \"orlando furioso\";}", [NSDictionary dictionaryWithObjectsAndKeys: @"ariosto", @"author", @"orlando furioso", @"title", nil]), "We can parse a simple dictionary with a two key value pairs and a C++ comment"); PASS(test_parse(@"((ariosto))", [NSArray arrayWithObject: [NSArray arrayWithObject: @"ariosto"]]), "We can parse an array containing a single array"); PASS(test_parse(@"({author = ariosto;})", [NSArray arrayWithObject: [NSDictionary dictionaryWithObject: @"ariosto" forKey: @"author"]]), "We can parse an array containing a single dictionary"); PASS(test_parse(@"((farinata), dante)", [NSArray arrayWithObjects: [NSArray arrayWithObject: @"farinata"], @"dante", nil]), "We can parse an array containing an array and a string"); PASS(test_parse(@"((farinata), {author = ariosto;})", [NSArray arrayWithObjects: [NSArray arrayWithObject: @"farinata"], [NSDictionary dictionaryWithObject: @"ariosto" forKey: @"author"],nil]), "We can parse an array containing an array and a dictionary"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/PropertyLists/test01.m000066400000000000000000000270631435650067400223770ustar00rootroot00000000000000#import "Testing.h" #import #import #import #import #import #import #import #import static BOOL test_parse_unparse(id object) { return [[[object description] propertyList] isEqual: object]; } static BOOL test_parse_unparse_xml(id object) { NSPropertyListFormat format; NSData *d; id u; d = [NSPropertyListSerialization dataFromPropertyList: object format: NSPropertyListXMLFormat_v1_0 errorDescription: 0]; u = [NSPropertyListSerialization propertyListFromData: d mutabilityOption: NSPropertyListImmutable format: &format errorDescription: 0]; return [u isEqual: object]; } static BOOL test_parse_unparse_openstep(id object) { NSPropertyListFormat format; NSData *d; id u; d = [NSPropertyListSerialization dataFromPropertyList: object format: NSPropertyListOpenStepFormat errorDescription: 0]; u = [NSPropertyListSerialization propertyListFromData: d mutabilityOption: NSPropertyListImmutable format: &format errorDescription: 0]; return [u isEqual: object]; } static BOOL test_parse_unparse_binary(id object) { NSPropertyListFormat format; NSData *d; id u; d = [NSPropertyListSerialization dataFromPropertyList: object format: NSPropertyListBinaryFormat_v1_0 errorDescription: 0]; u = [NSPropertyListSerialization propertyListFromData: d mutabilityOption: NSPropertyListImmutable format: &format errorDescription: 0]; return [u isEqual: object]; } #if defined(GNUSTEP_BASE_LIBRARY) static BOOL test_parse_unparse_binary_old(id object) { NSPropertyListFormat format; NSData *d; id u; d = [NSPropertyListSerialization dataFromPropertyList: object format: NSPropertyListGNUstepBinaryFormat errorDescription: 0]; u = [NSPropertyListSerialization propertyListFromData: d mutabilityOption: NSPropertyListImmutable format: &format errorDescription: 0]; return [u isEqual: object]; } static BOOL test_parse_unparse_gnustep(id object) { NSPropertyListFormat format; NSData *d; id u; d = [NSPropertyListSerialization dataFromPropertyList: object format: NSPropertyListGNUstepFormat errorDescription: 0]; u = [NSPropertyListSerialization propertyListFromData: d mutabilityOption: NSPropertyListImmutable format: &format errorDescription: 0]; return [u isEqual: object]; } #endif int main() { BOOL (*func)(id); int i; NSAutoreleasePool *arp = [NSAutoreleasePool new]; for (i = 0; i < 6; i++) { switch (i) { case 0: func = test_parse_unparse; NSLog(@"test descriptions"); break; case 1: func = test_parse_unparse_xml; NSLog(@"test XML"); break; case 2: func = test_parse_unparse_binary; NSLog(@"test binary"); break; case 3: func = test_parse_unparse_openstep; NSLog(@"test OpenStep"); break; case 4: #if defined(GNUSTEP_BASE_LIBRARY) func = test_parse_unparse_gnustep; NSLog(@"test GNUStep text"); #else func = 0; #endif case 5: #if defined(GNUSTEP_BASE_LIBRARY) func = test_parse_unparse_binary_old; NSLog(@"test GNUStep old binary"); #else func = 0; #endif break; } if (func == 0) continue; PASS(func(@"ariosto"), "We can generate a property list from a string"); PASS(func([@"ariosto" dataUsingEncoding: NSASCIIStringEncoding]), "We can generate a property list from data"); PASS(func([NSArray array]), "We can generate a property list from an empty array"); PASS(func([NSArray arrayWithObject: @"Palinuro"]), "We can generate a property list from an array with a single object"); PASS(func([NSArray arrayWithObjects: @"Palinuro", @"Enea", nil]), "We can generate a property list from an array with two objects"); PASS(func([NSArray arrayWithObjects: @"Palinuro", @"Enea", @"Eurialo e Niso", nil]), "We can generate a property list from " "an array with three objects and \"s"); PASS(func([NSDictionary dictionary]), "We can generate a property list from an empty dictionary"); PASS(func([NSDictionary dictionaryWithObject: @"Virgilio" forKey: @"Autore"]), "We can generate a property list from a " "dictionary with a single key/value pair"); PASS(func([NSDictionary dictionaryWithObjectsAndKeys: @"Virgilio", @"Autore", @"Eneide", @"Titolo", nil]), "We can generate a property list from a " "dictionary with two key/value pairs"); PASS(func([NSDictionary dictionaryWithObjectsAndKeys: @"Virgilio", @"Autore", [NSArray arrayWithObject: @"Molte"], @"Opere", nil]), "We can generate a property list from a " "dictionary with an array inside"); { id object = [NSMutableDictionary dictionary]; id objectA = [NSArray arrayWithObject: @"Ciao,"]; id objectB = [NSArray arrayWithObject: objectA]; id objectC = [NSDictionary dictionary]; id objectD = [NSArray arrayWithObject: [NSArray arrayWithObject: [NSDictionary dictionaryWithObject: [NSArray arrayWithObject: @"Ciao,"] forKey: @"Ciao,"]]]; [object setObject: objectA forKey: @"Utinam"]; [object setObject: objectB forKey: @"bbb"]; [object setObject: objectC forKey: @"ccc"]; [object setObject: objectD forKey: @"Auri;"]; PASS(func(object), "We can generate a medium-size property list (1)"); } { id object; id objectA; id objectA_A; id objectA_B; id objectB; id objectB_A; id objectB_A_A; id objectB_A_B; id objectB_B; /* objectA */ objectA_A = [NSMutableDictionary dictionary]; [objectA_A setObject: @"1 2 3 4 5 6 7 8 9 0" forKey: @"numeri"]; [objectA_A setObject: @"A B C D E F G H I J" forKey: @"lettere"]; objectA_B = [NSMutableDictionary dictionary]; [objectA_B setObject: @"3.1415296" forKey: @"PI greco"]; [objectA_B setObject: @"0" forKey: @"zero"]; [objectA_B setObject: @"1" forKey: @"uno"]; objectA = [NSMutableDictionary dictionary]; [objectA setObject: objectA_A forKey: @"Informazioni Utili"]; [objectA setObject: objectA_B forKey: @"Costanti Numeriche"]; /* objectB */ objectB_A = [NSMutableDictionary dictionary]; objectB_A_A = [NSMutableArray array]; [objectB_A_A addObject: @"1"]; [objectB_A_A addObject: @"2"]; [objectB_A_A addObject: @"3"]; [objectB_A_A addObject: @"4"]; [objectB_A_A addObject: @"5"]; [objectB_A_A addObject: @"6"]; [objectB_A_A addObject: @"7"]; [objectB_A_A addObject: @"8"]; [objectB_A_A addObject: @"9"]; [objectB_A_A addObject: @"0"]; if (func == test_parse_unparse_binary || func == test_parse_unparse_xml) { [objectB_A_A addObject: [NSNumber numberWithInteger: 1]]; [objectB_A_A addObject: [NSNumber numberWithInteger: 2]]; [objectB_A_A addObject: [NSNumber numberWithInteger: 3]]; [objectB_A_A addObject: [NSNumber numberWithInteger: 4]]; [objectB_A_A addObject: [NSNumber numberWithInteger: 5]]; [objectB_A_A addObject: [NSNumber numberWithInteger: 6]]; [objectB_A_A addObject: [NSNumber numberWithInteger: 7]]; [objectB_A_A addObject: [NSNumber numberWithInteger: 8]]; [objectB_A_A addObject: [NSNumber numberWithInteger: 9]]; [objectB_A_A addObject: [NSNumber numberWithInteger: 0]]; [objectB_A_A addObject: [NSNumber numberWithShort: 1]]; [objectB_A_A addObject: [NSNumber numberWithShort: 2]]; [objectB_A_A addObject: [NSNumber numberWithShort: 3]]; [objectB_A_A addObject: [NSNumber numberWithShort: 4]]; [objectB_A_A addObject: [NSNumber numberWithShort: 5]]; [objectB_A_A addObject: [NSNumber numberWithShort: 6]]; [objectB_A_A addObject: [NSNumber numberWithShort: 7]]; [objectB_A_A addObject: [NSNumber numberWithShort: 8]]; [objectB_A_A addObject: [NSNumber numberWithShort: 9]]; [objectB_A_A addObject: [NSNumber numberWithShort: 0]]; [objectB_A_A addObject: [NSNumber numberWithFloat: 1]]; [objectB_A_A addObject: [NSNumber numberWithFloat: 2]]; [objectB_A_A addObject: [NSNumber numberWithFloat: 3]]; [objectB_A_A addObject: [NSNumber numberWithFloat: 4]]; [objectB_A_A addObject: [NSNumber numberWithFloat: 5]]; [objectB_A_A addObject: [NSNumber numberWithFloat: 6]]; [objectB_A_A addObject: [NSNumber numberWithFloat: 7]]; [objectB_A_A addObject: [NSNumber numberWithFloat: 8]]; [objectB_A_A addObject: [NSNumber numberWithFloat: 9]]; [objectB_A_A addObject: [NSNumber numberWithFloat: 0]]; } [objectB_A setObject: objectB_A_A forKey: @"numeri"]; objectB_A_B = [NSMutableArray array]; [objectB_A_B addObject: @"A"]; [objectB_A_B addObject: @"B"]; [objectB_A_B addObject: @"C"]; [objectB_A_B addObject: @"D"]; [objectB_A_B addObject: @"E"]; [objectB_A_B addObject: @"F"]; [objectB_A_B addObject: @"G"]; [objectB_A_B addObject: @"H"]; [objectB_A_B addObject: @"I"]; [objectB_A_B addObject: @"J"]; [objectB_A setObject: objectB_A_B forKey: @"letterine"]; objectB_B = [NSMutableDictionary dictionary]; [objectB_B setObject: @"3.1415296" forKey: @"PI greca"]; [objectB_B setObject: @"0" forKey: @"el zero"]; [objectB_B setObject: @"1" forKey: @"el uno"]; objectB = [NSMutableDictionary dictionary]; [objectB setObject: objectB_A forKey: @"Informazioni Utili"]; [objectB setObject: objectB_B forKey: @"Costanti Numeriche"]; /* object */ object = [NSMutableDictionary dictionary]; [object setObject: objectA forKey: @"Un dizionario"]; [object setObject: objectB forKey: @"Un altro dizionario"]; PASS(func(object), "We can generate a medium-size property list (2)"); } PASS(func([NSData data]), "We can generate a property list from an empty data"); PASS(func([@"Questo e` un test" dataUsingEncoding: 1]), "We can generate a property list from very simple data"); PASS(func([[[NSProcessInfo processInfo] globallyUniqueString] dataUsingEncoding: 7]), "We can generate a property list from very simple data (2)"); PASS(func([NSMutableArray arrayWithObject: [@"*()3\"#@Q``''" dataUsingEncoding: 1]]), "We can generate a property list from an " "array containing very simple data"); { id object = [NSMutableArray array]; [object addObject: [@"*()3\"#@Q``''" dataUsingEncoding: 1]]; [object addObject: @"nicola \" , ; <"]; [object addObject: @""]; [object addObject: @"nicola@"]; [object addObject: @"nicola "]; [object addObject: @"nicola="]; [object addObject: [NSArray arrayWithObject: @"="]]; [object addObject: [NSDictionary dictionary]]; PASS(func(object), "We can generate a property list from an array containing various things"); } } #if defined(GNUSTEP_BASE_LIBRARY) { NSData *d = [NSData dataWithContentsOfFile: @"props"]; NSPropertyListFormat format; id u; u = [NSPropertyListSerialization propertyListFromData: d mutabilityOption: NSPropertyListImmutable format: &format errorDescription: 0]; PASS(nil != u, "parses complex plist"); } #endif #if defined(GNUSTEP_BASE_LIBRARY) { NSData *d = [NSData dataWithContentsOfFile: @"cyclic.plist"]; NSPropertyListFormat format; id u = nil; PASS_EXCEPTION( u = [NSPropertyListSerialization propertyListFromData: d mutabilityOption: NSPropertyListImmutable format: &format errorDescription: 0];, NSGenericException, "Does not crash on binary plist with cyclic references." ); PASS(nil == u, "Rejects cyclic plist"); } #endif [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/PropertyLists/xml.m000066400000000000000000000313571435650067400220600ustar00rootroot00000000000000/* Contributed by Michael Werle */ #import #import "Testing.h" #define kTestCaseCount (6) typedef struct { const char *plist; size_t plistLength; const char *text; size_t textLength; } TestCase; static const TestCase sTestCases[kTestCaseCount]; static BOOL RunTestCase(const TestCase *testCase, unsigned idx); int main (int argc, const char * argv[]) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; unsigned i; for (i = 0; i < kTestCaseCount; i++) { PASS((RunTestCase(&sTestCases[i], i + 1)), "xml propertylist parse test %d", i) } [pool release]; return 0; } static BOOL RunTestCase(const TestCase *testCase, unsigned idx) { NSData *data = nil; NSString *errorDesc = nil; id plist = nil; NSString *plistValue = nil; NSString *expectedValue = nil; NS_DURING { data = [NSData dataWithBytes: testCase->plist length: testCase->plistLength]; if (data == nil) { NSLog(@"Test case %u FAILED: could not construct plist data.", idx); return NO; } plist = [NSPropertyListSerialization propertyListFromData: data mutabilityOption: NSPropertyListImmutable format: NULL errorDescription: &errorDesc]; if (plist == nil) { NSLog(@"Test case %u FAILED: could not parse property list." @" Error string: %@", idx, errorDesc); return NO; } if (![plist isKindOfClass: [NSArray class]] || [plist count] != 1) { NSLog(@"Test case %u FAILED: plist content is not array with " @"one member.", idx); return NO; } plistValue = [plist objectAtIndex: 0]; if (![plistValue isKindOfClass: [NSString class]]) { NSLog(@"Test case %u FAILED: plist content is not an " @"array with one string.", idx); return NO; } data = [NSData dataWithBytes: testCase->text length: testCase->textLength]; if (data == nil) { NSLog(@"Test case %u FAILED: could not construct string data.", idx); return NO; } expectedValue = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding]; [expectedValue autorelease]; if (expectedValue == nil) { NSLog(@"Test case %u FAILED: could not construct string from data " @"(must be UTF-8).", idx); return NO; } if ([plistValue compare: expectedValue options: 0] != NSOrderedSame) { NSLog(@"Test case %u FAILED: read string is wrong (expected \"%@\", " @"got \"%@\").", idx, expectedValue, plistValue); return NO; } } NS_HANDLER { NSLog(@"Test case %u FAILED: exception thrown - %@ : %@", idx, [localException name], [localException reason]); return NO; } NS_ENDHANDLER return YES; } /* Test data follows. Data entries are UTF-8 strings, expressed as byte arrays to minimize risk of encoding problems. */ // Cyrillic string. static const char sTestPlist1[] = { 0x3C, 0x3F, 0x78, 0x6D, 0x6C, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3D, 0x22, 0x31, 0x2E, 0x30, 0x22, 0x20, 0x65, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x3D, 0x22, 0x55, 0x54, 0x46, 0x2D, 0x38, 0x22, 0x3F, 0x3E, 0x0A, 0x3C, 0x21, 0x44, 0x4F, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, 0x70, 0x6C, 0x69, 0x73, 0x74, 0x20, 0x50, 0x55, 0x42, 0x4C, 0x49, 0x43, 0x20, 0x22, 0x2D, 0x2F, 0x2F, 0x47, 0x4E, 0x55, 0x73, 0x74, 0x65, 0x70, 0x2F, 0x2F, 0x44, 0x54, 0x44, 0x20, 0x70, 0x6C, 0x69, 0x73, 0x74, 0x20, 0x30, 0x2E, 0x39, 0x2F, 0x2F, 0x45, 0x4E, 0x22, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x67, 0x6E, 0x75, 0x73, 0x74, 0x65, 0x70, 0x2E, 0x6F, 0x72, 0x67, 0x2F, 0x70, 0x6C, 0x69, 0x73, 0x74, 0x2D, 0x30, 0x5F, 0x39, 0x2E, 0x78, 0x6D, 0x6C, 0x22, 0x3E, 0x0A, 0x3C, 0x70, 0x6C, 0x69, 0x73, 0x74, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3D, 0x22, 0x30, 0x2E, 0x39, 0x22, 0x3E, 0x0A, 0x3C, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3E, 0x0A, 0x09, 0x3C, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3E, 0xD0, 0x93, 0xD0, 0xBE, 0xD0, 0xB2, 0xD0, 0xBE, 0xD1, 0x80, 0xD0, 0xB8, 0xD1, 0x82, 0x20, 0xD1, 0x81, 0xD1, 0x82, 0xD0, 0xB0, 0xD0, 0xBD, 0xD1, 0x86, 0xD0, 0xB8, 0xD1, 0x8F, 0x20, 0x4C, 0x61, 0x65, 0x6E, 0x69, 0x6E, 0x2E, 0x20, 0xD0, 0x9C, 0xD1, 0x8B, 0x20, 0xD0, 0xB7, 0xD0, 0xB0, 0xD0, 0xB3, 0xD1, 0x80, 0xD1, 0x83, 0xD0, 0xB7, 0xD0, 0xB8, 0xD0, 0xBB, 0xD0, 0xB8, 0x20, 0xD1, 0x81, 0xD1, 0x82, 0xD1, 0x8B, 0xD0, 0xBA, 0xD0, 0xBE, 0xD0, 0xB2, 0xD0, 0xBE, 0xD1, 0x87, 0xD0, 0xBD, 0xD1, 0x8B, 0xD0, 0xB5, 0x20, 0xD0, 0xB8, 0xD0, 0xBD, 0xD1, 0x81, 0xD1, 0x82, 0xD1, 0x80, 0xD1, 0x83, 0xD0, 0xBA, 0xD1, 0x86, 0xD0, 0xB8, 0xD0, 0xB8, 0x20, 0xD0, 0xBD, 0xD0, 0xB0, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3E, 0x0A, 0x3C, 0x2F, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3E, 0x0A, 0x3C, 0x2F, 0x70, 0x6C, 0x69, 0x73, 0x74, 0x3E, 0x0A }; static const char sTestText1[] = { 0xD0, 0x93, 0xD0, 0xBE, 0xD0, 0xB2, 0xD0, 0xBE, 0xD1, 0x80, 0xD0, 0xB8, 0xD1, 0x82, 0x20, 0xD1, 0x81, 0xD1, 0x82, 0xD0, 0xB0, 0xD0, 0xBD, 0xD1, 0x86, 0xD0, 0xB8, 0xD1, 0x8F, 0x20, 0x4C, 0x61, 0x65, 0x6E, 0x69, 0x6E, 0x2E, 0x20, 0xD0, 0x9C, 0xD1, 0x8B, 0x20, 0xD0, 0xB7, 0xD0, 0xB0, 0xD0, 0xB3, 0xD1, 0x80, 0xD1, 0x83, 0xD0, 0xB7, 0xD0, 0xB8, 0xD0, 0xBB, 0xD0, 0xB8, 0x20, 0xD1, 0x81, 0xD1, 0x82, 0xD1, 0x8B, 0xD0, 0xBA, 0xD0, 0xBE, 0xD0, 0xB2, 0xD0, 0xBE, 0xD1, 0x87, 0xD0, 0xBD, 0xD1, 0x8B, 0xD0, 0xB5, 0x20, 0xD0, 0xB8, 0xD0, 0xBD, 0xD1, 0x81, 0xD1, 0x82, 0xD1, 0x80, 0xD1, 0x83, 0xD0, 0xBA, 0xD1, 0x86, 0xD0, 0xB8, 0xD0, 0xB8, 0x20, 0xD0, 0xBD, 0xD0, 0xB0, 0x20 }; // "A & B", using & static const char sTestPlist2[] = { 0x3C, 0x3F, 0x78, 0x6D, 0x6C, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3D, 0x22, 0x31, 0x2E, 0x30, 0x22, 0x20, 0x65, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x3D, 0x22, 0x55, 0x54, 0x46, 0x2D, 0x38, 0x22, 0x3F, 0x3E, 0x0A, 0x3C, 0x21, 0x44, 0x4F, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, 0x70, 0x6C, 0x69, 0x73, 0x74, 0x20, 0x50, 0x55, 0x42, 0x4C, 0x49, 0x43, 0x20, 0x22, 0x2D, 0x2F, 0x2F, 0x47, 0x4E, 0x55, 0x73, 0x74, 0x65, 0x70, 0x2F, 0x2F, 0x44, 0x54, 0x44, 0x20, 0x70, 0x6C, 0x69, 0x73, 0x74, 0x20, 0x30, 0x2E, 0x39, 0x2F, 0x2F, 0x45, 0x4E, 0x22, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x67, 0x6E, 0x75, 0x73, 0x74, 0x65, 0x70, 0x2E, 0x6F, 0x72, 0x67, 0x2F, 0x70, 0x6C, 0x69, 0x73, 0x74, 0x2D, 0x30, 0x5F, 0x39, 0x2E, 0x78, 0x6D, 0x6C, 0x22, 0x3E, 0x0A, 0x3C, 0x70, 0x6C, 0x69, 0x73, 0x74, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3D, 0x22, 0x30, 0x2E, 0x39, 0x22, 0x3E, 0x0A, 0x3C, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3E, 0x0A, 0x09, 0x3C, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3E, 0x41, 0x20, 0x26, 0x61, 0x6D, 0x70, 0x3B, 0x20, 0x42, 0x3C, 0x2F, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3E, 0x0A, 0x3C, 0x2F, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3E, 0x0A, 0x3C, 0x2F, 0x70, 0x6C, 0x69, 0x73, 0x74, 0x3E, 0x0A }; static const char sTestText2[] = { 0x41, 0x20, 0x26, 0x20, 0x42 }; // Euro symbol (U+20AC), literal static const char sTestPlist3[] = { 0x3C, 0x3F, 0x78, 0x6D, 0x6C, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3D, 0x22, 0x31, 0x2E, 0x30, 0x22, 0x20, 0x65, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x3D, 0x22, 0x55, 0x54, 0x46, 0x2D, 0x38, 0x22, 0x3F, 0x3E, 0x0A, 0x3C, 0x21, 0x44, 0x4F, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, 0x70, 0x6C, 0x69, 0x73, 0x74, 0x20, 0x50, 0x55, 0x42, 0x4C, 0x49, 0x43, 0x20, 0x22, 0x2D, 0x2F, 0x2F, 0x47, 0x4E, 0x55, 0x73, 0x74, 0x65, 0x70, 0x2F, 0x2F, 0x44, 0x54, 0x44, 0x20, 0x70, 0x6C, 0x69, 0x73, 0x74, 0x20, 0x30, 0x2E, 0x39, 0x2F, 0x2F, 0x45, 0x4E, 0x22, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x67, 0x6E, 0x75, 0x73, 0x74, 0x65, 0x70, 0x2E, 0x6F, 0x72, 0x67, 0x2F, 0x70, 0x6C, 0x69, 0x73, 0x74, 0x2D, 0x30, 0x5F, 0x39, 0x2E, 0x78, 0x6D, 0x6C, 0x22, 0x3E, 0x0A, 0x3C, 0x70, 0x6C, 0x69, 0x73, 0x74, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3D, 0x22, 0x30, 0x2E, 0x39, 0x22, 0x3E, 0x0A, 0x3C, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3E, 0x0A, 0x09, 0x3C, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3E, 0xE2, 0x82, 0xAC, 0x3C, 0x2F, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3E, 0x0A, 0x3C, 0x2F, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3E, 0x0A, 0x3C, 0x2F, 0x70, 0x6C, 0x69, 0x73, 0x74, 0x3E, 0x0A }; static const char sTestText3[] = { 0xE2, 0x82, 0xAC }; // Euro symbol (U+20AC), escaped as € static const char sTestPlist4[] = { 0x3C, 0x3F, 0x78, 0x6D, 0x6C, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3D, 0x22, 0x31, 0x2E, 0x30, 0x22, 0x20, 0x65, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x3D, 0x22, 0x55, 0x54, 0x46, 0x2D, 0x38, 0x22, 0x3F, 0x3E, 0x0A, 0x3C, 0x21, 0x44, 0x4F, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, 0x70, 0x6C, 0x69, 0x73, 0x74, 0x20, 0x50, 0x55, 0x42, 0x4C, 0x49, 0x43, 0x20, 0x22, 0x2D, 0x2F, 0x2F, 0x47, 0x4E, 0x55, 0x73, 0x74, 0x65, 0x70, 0x2F, 0x2F, 0x44, 0x54, 0x44, 0x20, 0x70, 0x6C, 0x69, 0x73, 0x74, 0x20, 0x30, 0x2E, 0x39, 0x2F, 0x2F, 0x45, 0x4E, 0x22, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x67, 0x6E, 0x75, 0x73, 0x74, 0x65, 0x70, 0x2E, 0x6F, 0x72, 0x67, 0x2F, 0x70, 0x6C, 0x69, 0x73, 0x74, 0x2D, 0x30, 0x5F, 0x39, 0x2E, 0x78, 0x6D, 0x6C, 0x22, 0x3E, 0x0A, 0x3C, 0x70, 0x6C, 0x69, 0x73, 0x74, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3D, 0x22, 0x30, 0x2E, 0x39, 0x22, 0x3E, 0x0A, 0x3C, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3E, 0x0A, 0x09, 0x3C, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3E, 0xE2, 0x82, 0xAC, 0x3C, 0x2F, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3E, 0x0A, 0x3C, 0x2F, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3E, 0x0A, 0x3C, 0x2F, 0x70, 0x6C, 0x69, 0x73, 0x74, 0x3E, 0x0A }; static const char sTestText4[] = { 0xE2, 0x82, 0xAC }; // Cruzeiro symbol (U+20A2), literal static const char sTestPlist5[] = { 0x3C, 0x3F, 0x78, 0x6D, 0x6C, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3D, 0x22, 0x31, 0x2E, 0x30, 0x22, 0x20, 0x65, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x3D, 0x22, 0x55, 0x54, 0x46, 0x2D, 0x38, 0x22, 0x3F, 0x3E, 0x0A, 0x3C, 0x21, 0x44, 0x4F, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, 0x70, 0x6C, 0x69, 0x73, 0x74, 0x20, 0x50, 0x55, 0x42, 0x4C, 0x49, 0x43, 0x20, 0x22, 0x2D, 0x2F, 0x2F, 0x47, 0x4E, 0x55, 0x73, 0x74, 0x65, 0x70, 0x2F, 0x2F, 0x44, 0x54, 0x44, 0x20, 0x70, 0x6C, 0x69, 0x73, 0x74, 0x20, 0x30, 0x2E, 0x39, 0x2F, 0x2F, 0x45, 0x4E, 0x22, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x67, 0x6E, 0x75, 0x73, 0x74, 0x65, 0x70, 0x2E, 0x6F, 0x72, 0x67, 0x2F, 0x70, 0x6C, 0x69, 0x73, 0x74, 0x2D, 0x30, 0x5F, 0x39, 0x2E, 0x78, 0x6D, 0x6C, 0x22, 0x3E, 0x0A, 0x3C, 0x70, 0x6C, 0x69, 0x73, 0x74, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3D, 0x22, 0x30, 0x2E, 0x39, 0x22, 0x3E, 0x0A, 0x3C, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3E, 0x0A, 0x09, 0x3C, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3E, 0xE2, 0x82, 0xA2, 0x3C, 0x2F, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3E, 0x0A, 0x3C, 0x2F, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3E, 0x0A, 0x3C, 0x2F, 0x70, 0x6C, 0x69, 0x73, 0x74, 0x3E, 0x0A }; static const char sTestText5[] = { 0xE2, 0x82, 0xA2 }; // "test " with trailing space static const char sTestPlist6[] = { 0x3C, 0x3F, 0x78, 0x6D, 0x6C, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3D, 0x22, 0x31, 0x2E, 0x30, 0x22, 0x20, 0x65, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x3D, 0x22, 0x55, 0x54, 0x46, 0x2D, 0x38, 0x22, 0x3F, 0x3E, 0x0A, 0x3C, 0x21, 0x44, 0x4F, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, 0x70, 0x6C, 0x69, 0x73, 0x74, 0x20, 0x50, 0x55, 0x42, 0x4C, 0x49, 0x43, 0x20, 0x22, 0x2D, 0x2F, 0x2F, 0x47, 0x4E, 0x55, 0x73, 0x74, 0x65, 0x70, 0x2F, 0x2F, 0x44, 0x54, 0x44, 0x20, 0x70, 0x6C, 0x69, 0x73, 0x74, 0x20, 0x30, 0x2E, 0x39, 0x2F, 0x2F, 0x45, 0x4E, 0x22, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x67, 0x6E, 0x75, 0x73, 0x74, 0x65, 0x70, 0x2E, 0x6F, 0x72, 0x67, 0x2F, 0x70, 0x6C, 0x69, 0x73, 0x74, 0x2D, 0x30, 0x5F, 0x39, 0x2E, 0x78, 0x6D, 0x6C, 0x22, 0x3E, 0x0A, 0x3C, 0x70, 0x6C, 0x69, 0x73, 0x74, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3D, 0x22, 0x30, 0x2E, 0x39, 0x22, 0x3E, 0x0A, 0x3C, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3E, 0x0A, 0x09, 0x3C, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3E, 0x74, 0x65, 0x73, 0x74, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3E, 0x0A, 0x3C, 0x2F, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3E, 0x0A, 0x3C, 0x2F, 0x70, 0x6C, 0x69, 0x73, 0x74, 0x3E, 0x0A }; static const char sTestText6[] = { 0x74, 0x65, 0x73, 0x74, 0x20 }; static const TestCase sTestCases[kTestCaseCount] = { { sTestPlist1, sizeof sTestPlist1, sTestText1, sizeof sTestText1 }, { sTestPlist2, sizeof sTestPlist2, sTestText2, sizeof sTestText2 }, { sTestPlist3, sizeof sTestPlist3, sTestText3, sizeof sTestText3 }, { sTestPlist4, sizeof sTestPlist4, sTestText4, sizeof sTestText4 }, { sTestPlist5, sizeof sTestPlist5, sTestText5, sizeof sTestText5 }, { sTestPlist6, sizeof sTestPlist6, sTestText6, sizeof sTestText6 } }; gnustep-base-1.29.0/Tests/base/TestInfo000066400000000000000000000000001435650067400176720ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/Unicode/000077500000000000000000000000001435650067400176145ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/Unicode/TestInfo000066400000000000000000000000001435650067400212600ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/Unicode/test00.m000066400000000000000000000014501435650067400211110ustar00rootroot00000000000000#import "Testing.h" #import #import #import #import int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSString *bstr = @"\"Hello---@?pP-l\\U00a6&\\U00e4\\U00a6\""; NSData *adat; NSString *cstr; /* Prepare UTF-8 string from plist style c-string. */ bstr = [bstr propertyList]; adat = [bstr dataUsingEncoding: NSUTF8StringEncoding]; PASS((adat != nil && [adat isKindOfClass: [NSData class]]), "We can convert from UTF8 Encoding"); cstr = [[NSString alloc] initWithData: adat encoding: NSUTF8StringEncoding]; PASS((cstr != nil && [cstr isKindOfClass: [NSString class]]), "We can convert to UTF8 Encoding"); [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/coding/000077500000000000000000000000001435650067400174715ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/coding/NSArray.1.32bit000066400000000000000000000002201435650067400220060ustar00rootroot00000000000000GNUstep archive00002a94:00000003:00000003:00000000:01NSArray1NSObject&0±&01NSString&%quux!gnustep-base-1.29.0/Tests/base/coding/NSArray.1.64bit000066400000000000000000000002251435650067400220200ustar00rootroot00000000000000GNUstep archive000f4240:00000003:00000003:00000000:01NSArray1NSObject&0±&01NSString&% quux!gnustep-base-1.29.0/Tests/base/coding/NSAttributedString.0.32bit000066400000000000000000000002551435650067400242350ustar00rootroot00000000000000GNUstep archive00002a94:00000004:00000004:00000000:01NSArray1NSObject&01NSAttributedString01NSString&0±&%quux!gnustep-base-1.29.0/Tests/base/coding/NSAttributedString.0.64bit000066400000000000000000000002621435650067400242400ustar00rootroot00000000000000GNUstep archive000f4240:00000004:00000004:00000000:01NSArray1NSObject&01NSAttributedString01NSString&0±&% quux!gnustep-base-1.29.0/Tests/base/coding/NSCharacterSet.0.32bit000066400000000000000000000203751435650067400233140ustar00rootroot00000000000000GNUstep archive00002af9:00000008:00000004:00000000:01NSArray1NSObject&01NSBitmapCharSet1NSCharacterSet01 NSDataMalloc1 NSDataStatic1NSData&   ‚·01NSString&%quux!gnustep-base-1.29.0/Tests/base/coding/NSCharacterSet.0.64bit000066400000000000000000000203321435650067400233120ustar00rootroot00000000000000GNUstep archive000f4240:00000006:00000004:00000000:01NSArray1NSObject&01NSBitmapCharSet1NSCharacterSet01NSData&   ‚·01NSString&% quux!gnustep-base-1.29.0/Tests/base/coding/NSData.0.32bit000066400000000000000000000003711435650067400216070ustar00rootroot00000000000000GNUstep archive00002af9:00000006:00000003:00000000:01NSArray1NSObject&01 NSDataMalloc1 NSDataStatic1NSData&,,ÿþWe need constant data01NSString&%quux!gnustep-base-1.29.0/Tests/base/coding/NSData.0.64bit000066400000000000000000000003261435650067400216140ustar00rootroot00000000000000GNUstep archive000f4240:00000004:00000003:00000000:01NSArray1NSObject&01NSData&,,ÿþWe need constant data01NSString&% quux!gnustep-base-1.29.0/Tests/base/coding/NSDate.1.32bit000066400000000000000000000002411435650067400216100ustar00rootroot00000000000000GNUstep archive00002af9:00000004:00000003:00000000:01NSArray1NSObject&01NSDate Aè¶ð01NSString&%quux!gnustep-base-1.29.0/Tests/base/coding/NSDate.1.64bit000066400000000000000000000002461435650067400216220ustar00rootroot00000000000000GNUstep archive000f4240:00000004:00000003:00000000:01NSArray1NSObject&01NSDate Aè¶ð01NSString&% quux!gnustep-base-1.29.0/Tests/base/coding/NSDateFormatter.0.32bit000066400000000000000000000002671435650067400235030ustar00rootroot00000000000000GNUstep archive00002a94:00000005:00000003:00000000:01NSArray1NSObject&01NSDateFormatter1 NSFormatter01NSString&%quux!gnustep-base-1.29.0/Tests/base/coding/NSDateFormatter.0.64bit000066400000000000000000000003371435650067400235060ustar00rootroot00000000000000GNUstep archive000f4240:00000005:00000004:00000000:01NSArray1NSObject&01NSDateFormatter1 NSFormatter01NSString&%yyyyMMdd hh:mm a0±&% quux!gnustep-base-1.29.0/Tests/base/coding/NSDictionary.0.32bit000066400000000000000000000002431435650067400230410ustar00rootroot00000000000000GNUstep archive00002a94:00000004:00000003:00000000:01NSArray1NSObject&01 NSDictionary&01NSString&%quux!gnustep-base-1.29.0/Tests/base/coding/NSDictionary.0.64bit000066400000000000000000000002501435650067400230440ustar00rootroot00000000000000GNUstep archive000f4240:00000004:00000003:00000000:01NSArray1NSObject&01 NSDictionary&01NSString&% quux!gnustep-base-1.29.0/Tests/base/coding/NSException.0.32bit000066400000000000000000000002401435650067400226670ustar00rootroot00000000000000GNUstep archive00002a94:00000004:00000003:00000000:01NSArray1NSObject&01 NSException01NSString&%quux!gnustep-base-1.29.0/Tests/base/coding/NSException.0.64bit000066400000000000000000000003411435650067400226760ustar00rootroot00000000000000GNUstep archive000f4240:00000004:00000005:00000000:01NSArray1NSObject&01 NSException01NSString&% Test0±&% Testing0±&% quux!gnustep-base-1.29.0/Tests/base/coding/NSMutableData.0.32bit000066400000000000000000000003711435650067400231210ustar00rootroot00000000000000GNUstep archive00002af9:00000006:00000003:00000000:01NSArray1NSObject&01 NSDataMalloc1 NSDataStatic1NSData&,,ÿþWe need constant data01NSString&%quux!gnustep-base-1.29.0/Tests/base/coding/NSMutableData.0.64bit000066400000000000000000000003261435650067400231260ustar00rootroot00000000000000GNUstep archive000f4240:00000004:00000003:00000000:01NSArray1NSObject&01NSData&,,ÿþWe need constant data01NSString&% quux!gnustep-base-1.29.0/Tests/base/coding/NSNotification.0.32bit000066400000000000000000000002711435650067400233630ustar00rootroot00000000000000GNUstep archive00002a94:00000005:00000003:00000000:01NSArray1NSObject&01GSNotification1NSNotification01NSString&%quux!gnustep-base-1.29.0/Tests/base/coding/NSNotification.0.64bit000066400000000000000000000002761435650067400233750ustar00rootroot00000000000000GNUstep archive000f4240:00000005:00000003:00000000:01NSArray1NSObject&01GSNotification1NSNotification01NSString&% quux!gnustep-base-1.29.0/Tests/base/coding/NSNull.0.32bit000066400000000000000000000002301435650067400216420ustar00rootroot00000000000000GNUstep archive00002a94:00000004:00000003:00000000:01NSArray1NSObject&01NSNull01NSString&%quux!gnustep-base-1.29.0/Tests/base/coding/NSNull.0.64bit000066400000000000000000000002351435650067400216540ustar00rootroot00000000000000GNUstep archive000f4240:00000004:00000003:00000000:01NSArray1NSObject&01NSNull01NSString&% quux!gnustep-base-1.29.0/Tests/base/coding/NSNumber.0.32bit000066400000000000000000000002601435650067400221630ustar00rootroot00000000000000GNUstep archive00002af9:00000005:00000003:00000000:01NSArray1NSObject&01NSNumber1NSValuei%01NSString&%quux!gnustep-base-1.29.0/Tests/base/coding/NSNumber.0.64bit000066400000000000000000000002651435650067400221750ustar00rootroot00000000000000GNUstep archive000f4240:00000005:00000003:00000000:01NSArray1NSObject&01NSNumber1NSValuei%01NSString&% quux!gnustep-base-1.29.0/Tests/base/coding/NSObject.0.32bit000066400000000000000000000002131435650067400221370ustar00rootroot00000000000000GNUstep archive00002a94:00000003:00000003:00000000:01NSArray1NSObject&0±01NSString&%quux!gnustep-base-1.29.0/Tests/base/coding/NSObject.0.64bit000066400000000000000000000002201435650067400221420ustar00rootroot00000000000000GNUstep archive000f4240:00000003:00000003:00000000:01NSArray1NSObject&0±01NSString&% quux!gnustep-base-1.29.0/Tests/base/coding/NSSet.0.32bit000066400000000000000000000002341435650067400214670ustar00rootroot00000000000000GNUstep archive00002a94:00000004:00000003:00000000:01NSArray1NSObject&01NSSet&01NSString&%quux!gnustep-base-1.29.0/Tests/base/coding/NSSet.0.64bit000066400000000000000000000002411435650067400214720ustar00rootroot00000000000000GNUstep archive000f4240:00000004:00000003:00000000:01NSArray1NSObject&01NSSet&01NSString&% quux!gnustep-base-1.29.0/Tests/base/coding/NSString.1.32bit000066400000000000000000000002201435650067400221760ustar00rootroot00000000000000GNUstep archive00002a94:00000003:00000003:00000000:01NSArray1NSObject&01NSString&0±&%quux!gnustep-base-1.29.0/Tests/base/coding/NSString.1.64bit000066400000000000000000000002251435650067400222100ustar00rootroot00000000000000GNUstep archive000f4240:00000003:00000003:00000000:01NSArray1NSObject&01NSString&0±&% quux!gnustep-base-1.29.0/Tests/base/coding/NSTableView.3.32bit000066400000000000000000000015311435650067400226220ustar00rootroot00000000000000GNUstep archive00002a94:0000000d:00000012:00000000:01NSArray1NSObject&01 NSTableView1 NSControl1NSView1 NSResponder%  ?€  ?€&01NSMutableArray&%01NSCell01 NSString&01 NSFont%&&&&&&&&0±&01 NSColor0 ± &%NSNamedColorSpace0 ± &%System0 ± & % gridColor0 ± ° ° 0 ± &%controlBackgroundColor01 NSTableHeaderView%  A°  A°&0±&01 GSTableCornerView%  A˜ A°  A˜ A°&0±&%% A€’ @ @@0± &%quux!gnustep-base-1.29.0/Tests/base/coding/NSURL.0.32bit000066400000000000000000000003031435650067400213730ustar00rootroot00000000000000GNUstep archive00002a94:00000004:00000004:00000000:01NSArray1NSObject&01NSURL01NSString&%http://www.gnustep.org/0±&%quux!gnustep-base-1.29.0/Tests/base/coding/NSURL.0.64bit000066400000000000000000000003371435650067400214070ustar00rootroot00000000000000GNUstep archive000f4240:00000004:00000004:00000000:01NSArray1NSObject&01NSURL01NSString&% http://www.gnustep.org/0±&% quux!gnustep-base-1.29.0/Tests/base/coding/NSValue.3.32bit000066400000000000000000000003041435650067400220110ustar00rootroot00000000000000GNUstep archive00002e7f:00000004:00000003:00000000:01NSArray1NSObject&01NSValue&  {_NSSize=dd} ?ñ™™™™™š ?ó33333301NSString&%quux!gnustep-base-1.29.0/Tests/base/coding/NSValue.3.64bit000066400000000000000000000003111435650067400220140ustar00rootroot00000000000000GNUstep archive000f4240:00000004:00000003:00000000:01NSArray1NSObject&01NSValue&  {_NSSize=dd} ?ñ™™™™™š ?ó33333301NSString&% quux!gnustep-base-1.29.0/Tests/base/coding/TestInfo000066400000000000000000000000001435650067400211350ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/coding/basictypes.m000066400000000000000000000157541435650067400220310ustar00rootroot00000000000000#include "Testing.h" #include #include #include #include #include #include #include #include #include @interface Model : NSObject { int cint; unsigned int cuint; NSInteger nsint; NSUInteger nsuint; NSInteger a[4]; } @end @implementation Model -(void)setValues { cint = -1234567890; cuint = 1234567890; nsint = -1234567890; nsuint = 1234567890; a[0] = 1; a[1] = 1000; a[2] = 1000000; a[3] = 100000000; } - (BOOL)testCInt:(Model *)o { return (cint == o->cint) ? YES : NO; } - (BOOL)testCUInt:(Model *)o { return (cuint == o->cuint) ? YES : NO; } - (BOOL)testNSInteger:(Model *)o { return (nsint == o->nsint) ? YES : NO; } - (BOOL)testNSUInteger:(Model *)o { return (nsuint == o->nsuint) ? YES : NO; } - (BOOL)testArray:(Model *)o { return (a[0] == o->a[0] && a[1] == o->a[1] && a[2] == o->a[2] && a[3] == o->a[3]) ? YES : NO; } -(void)encodeWithCoder:(NSCoder *)coder { [coder encodeArrayOfObjCType: @encode(NSInteger) count: 4 at: a]; [coder encodeValueOfObjCType: @encode(int) at: &cint]; [coder encodeValueOfObjCType: @encode(unsigned int) at: &cuint]; [coder encodeValueOfObjCType: @encode(NSInteger) at: &nsint]; [coder encodeValueOfObjCType: @encode(NSUInteger) at: &nsuint]; } -(id)initWithCoder:(NSCoder *)coder { long long ia[4]; [coder decodeArrayOfObjCType: @encode(long long) count: 4 at: ia]; a[0] = ia[0]; a[1] = ia[1]; a[2] = ia[2]; a[3] = ia[3]; /* encoded as int - decoded as NSInteger. */ [coder decodeValueOfObjCType: @encode(NSInteger) at: &nsint]; /* encoded as unsinged int - decoded as NSUInteger. */ [coder decodeValueOfObjCType: @encode(NSUInteger) at: &nsuint]; /* encoded as NSInteger - decoded as int. */ [coder decodeValueOfObjCType: @encode(int) at: &cint]; /* encoded as NSUInteger - decoded as unsigned int. */ [coder decodeValueOfObjCType: @encode(unsigned int) at: &cuint]; return self; } @end static NSFileManager *fm; NSString *str = @"Do not taunt happy fun ball"; #define TEST_DECL(testType,testName) \ void testWriteBasicType_##testName (char *typeName, testType *toEncode) \ { \ NSData *data; \ NSMutableData *mData; \ NSString *fileName; \ long typeSize = sizeof(testType); \ fileName = [[NSString stringWithFormat:@"%s-%li.type",typeName,typeSize] retain]; \ if (![fm isReadableFileAtPath:fileName]) \ { \ NSArchiver *arch; \ mData = [[NSMutableData alloc] init]; \ arch = [[NSArchiver alloc] initForWritingWithMutableData: mData]; \ [arch encodeValueOfObjCType:@encode(testType) at:toEncode]; \ [arch encodeObject:str]; \ [mData writeToFile:fileName atomically:YES]; \ data = [NSData dataWithContentsOfFile:fileName]; \ PASS([data isEqual:mData], \ "can write %s of size %li", typeName, typeSize); \ [fileName release]; \ [mData release]; \ [arch release]; \ } \ } \ void testReadBasicType_##testName (char *pre, testType *expect, testType *toDecode) \ { \ NSData *data; \ NSUnarchiver *unArch; \ NSString *str2; \ NSString *fileName; \ long typeSize = sizeof(testType); \ fileName = [[NSString stringWithFormat:@"%s-%li.type",pre,typeSize] retain]; \ if ([fm isReadableFileAtPath:fileName]) \ { \ data = [NSData dataWithContentsOfFile:fileName]; \ unArch = [[NSUnarchiver alloc] initForReadingWithData:data]; \ NS_DURING \ [unArch decodeValueOfObjCType:@encode(testType) at:toDecode]; \ NS_HANDLER \ NSLog(@"%@ %@", [localException name], [localException reason]); \ PASS(0, "can unarchive %s from %s", pre, [fileName UTF8String]); \ NS_ENDHANDLER \ str2 = [unArch decodeObject]; \ PASS((VAL_TEST(*expect,*toDecode) && [str isEqual:str2]), \ "can unarchive %s from %s", pre, [fileName UTF8String]); \ } \ else \ { \ PASS(1 == 2, "Archive %s not found.", [fileName UTF8String]); \ } \ } #define VAL_TEST(testX,testY) testX == testY TEST_DECL(int, int); TEST_DECL(unsigned int, uint); TEST_DECL(long, long); TEST_DECL(unsigned long, ulong); TEST_DECL(long long, llong); TEST_DECL(unsigned long long, ullong); TEST_DECL(signed char, schar); TEST_DECL(unsigned char, uchar); TEST_DECL(short, short); TEST_DECL(unsigned short, ushort); #undef VAL_TEST #define VAL_TEST(testx, testy) EQ(testx,testy) TEST_DECL(float, float); TEST_DECL(double, double); TEST_DECL(BOOL, BOOL); int main() { NSAutoreleasePool *pool = [NSAutoreleasePool new]; id obj1, obj2; NSData *data; int i = 2147483647; int i2; unsigned int ui = 4294967295U; unsigned int ui2; long l = 2147483647L; long l2; long long ll = 9223372036854775807LL; long long ll2; unsigned long long ull = 18446744073709551615ULL; unsigned long long ull2; unsigned long ul = 4294967295UL; unsigned long ul2; signed char c = 127; signed char c2; unsigned char uc = 255; unsigned char uc2; short s = 32767; short s2; unsigned short us = 65535; unsigned short us2; float f = 3.40282347e+38F; float f2; double d = 1.7976931348623157e+308; double d2; BOOL b = YES; BOOL b2; fm = [NSFileManager defaultManager]; testWriteBasicType_int("int", &i); testReadBasicType_int("int", &i, &i2); testWriteBasicType_uint("uint", &ui); testReadBasicType_uint("uint", &ui, &ui2); testWriteBasicType_long("long", &l); testReadBasicType_long("long", &l, &l2); testWriteBasicType_ulong("ulong", &ul); testReadBasicType_ulong("ulong", &ul, &ul2); testWriteBasicType_llong("llong", &ll); testReadBasicType_llong("llong", &ll, &ll2); testWriteBasicType_ullong("ullong", &ull); testReadBasicType_ullong("ullong", &ull, &ull2); testWriteBasicType_schar("schar", &c); testReadBasicType_schar("schar", &c, &c2); testWriteBasicType_uchar("uchar", &uc); testReadBasicType_uchar("uchar", &uc, &uc2); testWriteBasicType_short("short", &s); testReadBasicType_short("short", &s, &s2); testWriteBasicType_float("float", &f); testReadBasicType_float("float", &f, &f2); testWriteBasicType_double("double", &d); testReadBasicType_double("double", &d, &d2); testWriteBasicType_ushort("ushort", &us); testReadBasicType_ushort("ushort", &us, &us2); testWriteBasicType_BOOL("BOOL", &b); testReadBasicType_BOOL("BOOL", &b, &b2); obj1 = [Model new]; [obj1 setValues]; data = [NSArchiver archivedDataWithRootObject: obj1]; obj2 = [NSUnarchiver unarchiveObjectWithData: data]; PASS([obj1 testCInt:obj2], "archiving as int - dearchiving as NSInteger"); PASS([obj1 testCUInt:obj2], "archiving as unsigned int - dearchiving as NSUInteger"); PASS([obj1 testNSInteger:obj2], "archiving as NSInteger - dearchiving as int"); PASS([obj1 testNSUInteger:obj2], "archiving as NSUInteger - dearchiving as unsigned int"); PASS([obj1 testArray:obj2], "archiving as NSInteger array - dearchiving as long long"); [pool release]; pool = nil; return 0; } gnustep-base-1.29.0/Tests/base/coding/decoding.m000066400000000000000000000162731435650067400214340ustar00rootroot00000000000000/* copyright 2004 Alexander Malmberg */ #include "Testing.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include @interface NSObject (Equality) - (BOOL) testEquality: (id)other; @end @interface NSObject (DecodingTests) + (NSObject*) createTestInstance; + (BOOL) verifyTestInstance: (NSObject *)instance ofVersion: (int)version; - (BOOL) testEquality; @end @implementation NSObject (DecodingTests) + (NSObject *) createTestInstance { if (self == [NSException class]) { return [[NSException alloc] initWithName: @"Test" reason: @"Testing" userInfo: nil]; } else { return [[self alloc] init]; } } + (BOOL) verifyTestInstance: (NSObject *)instance ofVersion: (int)version { id o; if (instance == nil) return NO; o = [self createTestInstance]; if (YES == [o respondsToSelector: @selector(testEquality:)]) return [o testEquality: instance]; if (NO == [instance testEquality]) return YES; return [o isEqual: instance]; } - (BOOL) testEquality { static IMP impNSObject = 0; /* By default, assume that every class that overrides NSObject's isEqual: implementation can compare archived instances. subclasses for which this doesn't hold can simply override this method in a category and return a constant YES/NO. */ if (!impNSObject) { impNSObject = [NSObject instanceMethodForSelector:@selector(isEqual:)]; } return [self methodForSelector:@selector(isEqual:)] == impNSObject ? NO : YES; } @end @implementation NSCharacterSet (DecodingTests) + (NSObject *) createTestInstance { return [[self characterSetWithCharactersInString: @"qwertzuiop"] retain]; } @end @implementation NSValue (DecodingTests) + (NSObject *) createTestInstance { return [[self valueWithSize: NSMakeSize(1.1, 1.2)] retain]; } - (BOOL) testEquality: (id)other { if (strcmp([self objCType], @encode(NSSize)) == 0) { NSSize mSize = [self sizeValue]; NSSize oSize = [other sizeValue]; if (EQ(mSize.height, oSize.height) && EQ(mSize.width, oSize.width)) return YES; return NO; } return [self isEqual: other]; } @end @implementation NSNumber (DecodingTests) + (NSObject *) createTestInstance { return [[self numberWithInt: 1] retain]; } @end @implementation NSData (DecodingTests) + (NSObject *) createTestInstance { NSString *source = @"We need constant data"; NSData *data = [source dataUsingEncoding: NSUnicodeStringEncoding]; if (NSHostByteOrder() == NS_BigEndian) { NSMutableData *m = [data mutableCopy]; uint8_t *p = (uint8_t*)[m mutableBytes]; uint8_t *e = p + [m length]; while (p < e) { uint8_t tmp = p[0]; p[0] = p[1]; p[1] = tmp; p += 2; } return m; } else { return [data retain]; } } @end @implementation NSDate (DecodingTests) + (NSObject *) createTestInstance { return [[NSDate dateWithTimeIntervalSince1970: 4294967296.0] retain]; } @end @implementation NSURL (DecodingTests) + (NSObject *) createTestInstance { return [[self alloc] initWithString: @"http://www.gnustep.org/"]; } @end /* If set, we write out new .data files for the current versions for classes that don't have them. */ BOOL update; void test(Class class) { NS_DURING { /* In order to catch decoders that don't consume all the data that they should, we decode/encode an array that includes the object and a string. We verify that the string was correctly decoded, although any errors will likely be caught by crashes in the unarchiver. */ NSString *sentinel = @"quux!"; int v = [class version]; NSObject *instance; NSArray *decodedInstance; NSData *d; NSString *filename; instance = [class createTestInstance]; d = [NSArchiver archivedDataWithRootObject: [NSArray arrayWithObjects: instance, sentinel, nil]]; decodedInstance = [NSUnarchiver unarchiveObjectWithData: d]; NSCAssert([sentinel isEqual: [decodedInstance objectAtIndex: 1]], NSInternalInconsistencyException); PASS([class verifyTestInstance: [decodedInstance objectAtIndex: 0] ofVersion: v], "decoding current version of class %s", POBJECT(class)); for (; v >= 0; v--) { int w; for (w = 0; w < 2; w++) { const char *width; if (0 == w) { if (YES == update && 4 != sizeof(void*)) { continue; // Can't write a 32bit update. } width = "32bit"; } else { if (YES == update && 8 != sizeof(void*)) { continue; // Can't write a 64bit update. } width = "64bit"; } filename = [NSString stringWithFormat: @"%@.%i.%s", class, v, width]; d = [NSData dataWithContentsOfFile: filename]; if (!d) { if (v == [class version]) { if (!update) PASS(0, "%s has %s reference data for current version", POBJECT(class), width) else [NSArchiver archiveRootObject: [NSArray arrayWithObjects: instance, sentinel, nil] toFile: filename]; } continue; } decodedInstance = [NSUnarchiver unarchiveObjectWithData: d]; NSCAssert([sentinel isEqual: [decodedInstance objectAtIndex: 1]], NSInternalInconsistencyException); PASS([class verifyTestInstance: [decodedInstance objectAtIndex: 0] ofVersion: v], "decoding %s version %i of class %s", width, v, POBJECT(class)); } } } NS_HANDLER { PASS(0, "decoding class %s: %s", POBJECT(class), POBJECT(localException)); } NS_ENDHANDLER } int main(int argc, char **argv) { NSAutoreleasePool *arp = [NSAutoreleasePool new]; update = argc == 2 && !strcmp(argv[1], "--update"); #define T(c) test([c class]); T(NSArray) T(NSAttributedString) T(NSCharacterSet) T(NSData) T(NSMutableData) T(NSDate) T(NSDateFormatter) T(NSDictionary) T(NSException) T(NSNotification) T(NSNull) T(NSObject) T(NSSet) T(NSString) T(NSURL) T(NSValue) T(NSNumber) [arp release]; arp = nil; return 0; } gnustep-base-1.29.0/Tests/base/headers/000077500000000000000000000000001435650067400176415ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/headers/GSLock.m000066400000000000000000000003541435650067400211430ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of GNUstepBase/GSLock.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/GSMime.m000066400000000000000000000003541435650067400211420ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of GNUstepBase/GSMime.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/GSObjCRuntime.m000066400000000000000000000003721435650067400224340ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of GNUstepBase/GSObjCRuntime.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/GSXML.m000066400000000000000000000003521435650067400207110ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of GNUstepBase/GSXML.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSArchiver.m000066400000000000000000000003621435650067400220240ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSArchiver.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSArray.m000066400000000000000000000003541435650067400213400ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSArray.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSAttributedString.m000066400000000000000000000004021435650067400235520ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSAttributedString.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSAutoreleasePool.m000066400000000000000000000004001435650067400233550ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSAutoreleasePool.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSBundle.m000066400000000000000000000003561435650067400214750ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSBundle.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSByteOrder.m000066400000000000000000000003641435650067400221620ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSByteOrder.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSCalendarDate.m000066400000000000000000000003721435650067400225710ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSCalendarDate.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSCharacterSet.m000066400000000000000000000003721435650067400226320ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSCharacterSet.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSClassDescription.m000066400000000000000000000004021435650067400235250ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSClassDescription.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSCoder.m000066400000000000000000000003541435650067400213160ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSCoder.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSComparisonPredicate.m000066400000000000000000000004101435650067400242060ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSComparisonPredicate.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSCompoundPredicate.m000066400000000000000000000004041435650067400236630ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSCompoundPredicate.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSConnection.m000066400000000000000000000003661435650067400223640ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSConnection.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSData.m000066400000000000000000000003521435650067400211310ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSData.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSDate.m000066400000000000000000000003521435650067400211350ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSDate.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSDateFormatter.m000066400000000000000000000003741435650067400230250ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSDateFormatter.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSDebug.m000066400000000000000000000003541435650067400213100ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSDebug.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSDecimal.m000066400000000000000000000003601435650067400216150ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSDecimal.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSDecimalNumber.m000066400000000000000000000003741435650067400227730ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSDecimalNumber.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSDictionary.m000066400000000000000000000003661435650067400223720ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSDictionary.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSDistantObject.m000066400000000000000000000003741435650067400230210ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSDistantObject.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSDistributedLock.m000066400000000000000000000004001435650067400233450ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSDistributedLock.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSDistributedNotificationCenter.m000066400000000000000000000004341435650067400262530ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSDistributedNotificationCenter.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSEnumerator.m000066400000000000000000000003661435650067400224060ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSEnumerator.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSError.m000066400000000000000000000003541435650067400213530ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSError.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSException.m000066400000000000000000000003641435650067400222210ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSException.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSExpression.m000066400000000000000000000003661435650067400224240ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSExpression.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSFileHandle.m000066400000000000000000000003661435650067400222600ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSFileHandle.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSFileManager.m000066400000000000000000000003701435650067400224320ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSFileManager.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSFormatter.m000066400000000000000000000003641435650067400222260ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSFormatter.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSGeometry.m000066400000000000000000000003621435650067400220540ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSGeometry.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSHTTPCookie.m000066400000000000000000000003661435650067400221760ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSHTTPCookie.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSHTTPCookieStorage.m000066400000000000000000000004041435650067400235140ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSHTTPCookieStorage.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSHashTable.m000066400000000000000000000003641435650067400221160ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSHashTable.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSHost.m000066400000000000000000000003521435650067400211750ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSHost.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSIndexPath.m000066400000000000000000000003641435650067400221470ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSIndexPath.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSIndexSet.m000066400000000000000000000003621435650067400220040ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSIndexSet.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSInvocation.m000066400000000000000000000003661435650067400223760ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSInvocation.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSKeyValueCoding.m000066400000000000000000000003761435650067400231370ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSKeyValueCoding.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSKeyValueObserving.m000066400000000000000000000004041435650067400236620ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSKeyValueObserving.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSKeyedArchiver.m000066400000000000000000000003741435650067400230110ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSKeyedArchiver.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSLock.m000066400000000000000000000003521435650067400211500ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSLock.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSMapTable.m000066400000000000000000000003621435650067400217460ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSMapTable.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSMethodSignature.m000066400000000000000000000004001435650067400233540ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSMethodSignature.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSNotification.m000066400000000000000000000003721435650067400227100ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSNotification.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSNotificationQueue.m000066400000000000000000000004041435650067400237110ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSNotificationQueue.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSNull.m000066400000000000000000000003521435650067400211720ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSNull.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSNumberFormatter.m000066400000000000000000000004001435650067400233660ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSNumberFormatter.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSObjCRuntime.m000066400000000000000000000003701435650067400224410ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSObjCRuntime.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSObject.m000066400000000000000000000003561435650067400214720ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSObject.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSPathUtilities.m000066400000000000000000000003741435650067400230540ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSPathUtilities.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSPort.m000066400000000000000000000003521435650067400212040ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSPort.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSPortCoder.m000066400000000000000000000003641435650067400221640ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSPortCoder.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSPortMessage.m000066400000000000000000000003701435650067400225110ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSPortMessage.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSPortNameServer.m000066400000000000000000000003761435650067400232020ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSPortNameServer.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSPredicate.m000066400000000000000000000003641435650067400221630ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSPredicate.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSProcessInfo.m000066400000000000000000000003701435650067400225120ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSProcessInfo.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSPropertyList.m000066400000000000000000000003721435650067400227420ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSPropertyList.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSProtocolChecker.m000066400000000000000000000004001435650067400233400ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSProtocolChecker.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSProxy.m000066400000000000000000000003541435650067400214030ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSProxy.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSRange.m000066400000000000000000000003541435650067400213160ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSRange.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSRunLoop.m000066400000000000000000000003601435650067400216550ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSRunLoop.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSScanner.m000066400000000000000000000003601435650067400216500ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSScanner.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSSerialization.m000066400000000000000000000003741435650067400231010ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSSerialization.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSSet.m000066400000000000000000000003501435650067400210110ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSSet.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSSortDescriptor.m000066400000000000000000000003761435650067400232540ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSSortDescriptor.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSStream.m000066400000000000000000000003561435650067400215170ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSStream.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSString.m000066400000000000000000000003561435650067400215320ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSString.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSTask.m000066400000000000000000000003521435650067400211620ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSTask.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSThread.m000066400000000000000000000003561435650067400214730ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSThread.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSTimeZone.m000066400000000000000000000003621435650067400220130ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSTimeZone.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSTimer.m000066400000000000000000000003541435650067400213420ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSTimer.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSURL.m000066400000000000000000000003501435650067400207200ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSURL.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSURLAuthenticationChallenge.m000066400000000000000000000004261435650067400254270ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSURLAuthenticationChallenge.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSURLCache.m000066400000000000000000000003621435650067400216470ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSURLCache.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSURLConnection.m000066400000000000000000000003741435650067400227460ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSURLConnection.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSURLCredential.m000066400000000000000000000003741435650067400227210ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSURLCredential.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSURLCredentialStorage.m000066400000000000000000000004121435650067400242370ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSURLCredentialStorage.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSURLDownload.m000066400000000000000000000003701435650067400224120ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSURLDownload.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSURLError.m000066400000000000000000000003621435650067400217350ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSURLError.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSURLHandle.m000066400000000000000000000003641435650067400220410ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSURLHandle.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSURLProtectionSpace.m000066400000000000000000000004061435650067400237450ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSURLProtectionSpace.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSURLProtocol.m000066400000000000000000000003701435650067400224440ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSURLProtocol.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSURLRequest.m000066400000000000000000000003661435650067400223000ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSURLRequest.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSURLResponse.m000066400000000000000000000003701435650067400224410ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSURLResponse.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSUndoManager.m000066400000000000000000000003701435650067400224600ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSUndoManager.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSUserDefaults.m000066400000000000000000000003721435650067400226700ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSUserDefaults.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSValue.m000066400000000000000000000003541435650067400213360ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSValue.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSXMLParser.m000066400000000000000000000003641435650067400221000ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSXMLParser.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/NSZone.m000066400000000000000000000003521435650067400211730ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/NSZone.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/ObjCXX.mm000066400000000000000000000004101435650067400212640ustar00rootroot00000000000000#include "Testing.h" #include @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of Foundation/Foundation.h works in an Objective-C++ program"); [arp release]; return 0; } gnustep-base-1.29.0/Tests/base/headers/TestInfo000066400000000000000000000000001435650067400213050ustar00rootroot00000000000000gnustep-base-1.29.0/Tests/base/headers/Unicode.m000066400000000000000000000003561435650067400214110ustar00rootroot00000000000000#include #include "ObjectTesting.h" @class NSAutoreleasePool; int main() { NSAutoreleasePool *arp = [NSAutoreleasePool new]; PASS (1, "include of GNUstepBase/Unicode.h works"); [arp release]; return 0; } gnustep-base-1.29.0/Tools/000077500000000000000000000000001435650067400153125ustar00rootroot00000000000000gnustep-base-1.29.0/Tools/.cvsignore000066400000000000000000000000341435650067400173070ustar00rootroot00000000000000shared_debug_obj shared_obj gnustep-base-1.29.0/Tools/AGSHtml.h000066400000000000000000000054251435650067400167300ustar00rootroot00000000000000#ifndef _INCLUDED_AGSHTML_H #define _INCLUDED_AGSHTML_H /** AGSHtml ... a class to output html for a gsdoc file Copyright (C) 2001 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: October 2001 This file is part of the GNUstep Project This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. You should have received a copy of the GNU General Public License along with this program; see the file COPYINGv3. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #import "Foundation/NSObject.h" #import "AGSIndex.h" @class NSMutableString; @class NSString; @interface AGSHtml : NSObject { NSString *project; AGSIndex *localRefs; AGSIndex *globalRefs; AGSIndex *projectRefs; NSMutableString *indent; NSString *base; // Not retained NSString *unit; // Not retained NSString *category; // Not retained NSString *classname; // Not retained NSString *heading; // Not retained NSString *nextFile; // Not retained NSString *prevFile; // Not retained NSString *upFile; // Not retained unsigned chap; unsigned sect; unsigned ssect; unsigned sssect; BOOL isContentsDoc; BOOL ivarsAtEnd; } - (void) decIndent; - (void) incIndent; - (NSString*) makeAnchor: (NSString*)r ofType: (NSString*)t name: (NSString*)n; - (NSString*) makeLink: (NSString*)r ofType: (NSString*)t isRef: (BOOL)f; - (NSString*) makeLink: (NSString*)r ofType: (NSString*)t inUnit: (NSString*)u isRef: (BOOL)f; - (void) outputIndex: (NSString*)type scope: (NSString*)scope title: (NSString*)title style: (NSString*)style target: (NSString*)target to: (NSMutableString*)buf; - (NSString*) outputDocument: (GSXMLNode*)node; - (void) outputNode: (GSXMLNode*)node to: (NSMutableString*)buf; - (void) outputNodeList: (GSXMLNode*)node to: (NSMutableString*)buf; - (GSXMLNode*) outputBlock: (GSXMLNode*)node to: (NSMutableString*)buf inPara: (BOOL)flag; - (GSXMLNode*) outputList: (GSXMLNode*)node to: (NSMutableString*)buf; - (GSXMLNode*) outputText: (GSXMLNode*)node to: (NSMutableString*)buf; - (void) outputUnit: (GSXMLNode*)node to: (NSMutableString*)buf; - (void) outputVersion: (NSDictionary*)prop to: (NSMutableString*)buf; - (NSString*) protocolRef: (NSString*)t; - (void) setGlobalRefs: (AGSIndex*)r; - (void) setLocalRefs: (AGSIndex*)r; - (void) setProjectRefs: (AGSIndex*)r; - (void) setInstanceVariablesAtEnd: (BOOL)val; - (NSString*) typeRef: (NSString*)t; @end #endif gnustep-base-1.29.0/Tools/AGSHtml.m000066400000000000000000002101221435650067400167250ustar00rootroot00000000000000/** AGSHtml ... a class to output html for a gsdoc file Copyright (C) 2001 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: October 2001 This file is part of the GNUstep Project This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. You should have received a copy of the GNU General Public License along with this program; see the file COPYINGv3. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #import "common.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSArray.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSSet.h" #import "Foundation/NSUserDefaults.h" #import "AGSHtml.h" #import "GNUstepBase/NSString+GNUstepBase.h" #import "GNUstepBase/NSMutableString+GNUstepBase.h" /* * Define constants for use if we are built with apple Foundation */ #ifndef GS_API_OSSPEC #define GS_API_OSSPEC 10000 #endif #ifndef GS_API_OPENSTEP #define GS_API_OPENSTEP 40000 #endif #ifndef GS_API_MACOSX #define GS_API_MACOSX 100000 #endif static int XML_ELEMENT_NODE; static int XML_ENTITY_REF_NODE; static int XML_TEXT_NODE; static GSXMLNode *firstElement(GSXMLNode *nodes) { if (nodes == nil) { return nil; } if ([nodes type] == XML_ELEMENT_NODE) { return nodes; } return [nodes nextElement]; } @implementation AGSHtml static NSMutableSet *textNodes = nil; static NSString *tocFont = nil; static NSString *mainFont = nil; + (void) initialize { if (self == [AGSHtml class]) { /* * Cache XML node information. */ XML_ELEMENT_NODE = [GSXMLNode typeFromDescription: @"XML_ELEMENT_NODE"]; XML_ENTITY_REF_NODE = [GSXMLNode typeFromDescription: @"XML_ENTITY_REF_NODE"]; XML_TEXT_NODE = [GSXMLNode typeFromDescription: @"XML_TEXT_NODE"]; textNodes = [NSMutableSet new]; [textNodes addObject: @"br"]; [textNodes addObject: @"code"]; [textNodes addObject: @"em"]; [textNodes addObject: @"email"]; [textNodes addObject: @"entry"]; [textNodes addObject: @"file"]; [textNodes addObject: @"label"]; [textNodes addObject: @"prjref"]; [textNodes addObject: @"ref"]; [textNodes addObject: @"site"]; [textNodes addObject: @"strong"]; [textNodes addObject: @"uref"]; [textNodes addObject: @"url"]; [textNodes addObject: @"var"]; [textNodes addObject: @"footnote"]; // default fonts tocFont = @"sans"; mainFont = @"serif"; } } - (void) dealloc { RELEASE(project); RELEASE(globalRefs); RELEASE(localRefs); RELEASE(projectRefs); RELEASE(indent); DEALLOC } - (void) decIndent { unsigned len = [indent length]; if (len >= 2) { [indent deleteCharactersInRange: NSMakeRange(len - 2, 2)]; } } - (void) incIndent { [indent appendString: @" "]; } - (id) init { indent = [[NSMutableString alloc] initWithCapacity: 64]; project = RETAIN([[NSUserDefaults standardUserDefaults] stringForKey: @"Project"]); return self; } /** * Calls -makeLink:ofType:isRef: or -makeLink:ofType:inUnit:isRef: to * create the first part of an anchor, and fills in the text content * of the anchor with n (the specified name). Returns an entire anchor * string as a result.
* This method is used to create all the anchors in the html output. */ - (NSString*) makeAnchor: (NSString*)r ofType: (NSString*)t name: (NSString*)n { NSString *s; if (n == nil) { n = @""; } if ([t isEqualToString: @"method"] || [t isEqualToString: @"ivariable"]) { s = [self makeLink: r ofType: t inUnit: nil isRef: NO]; } else { s = [self makeLink: r ofType: t isRef: NO]; } if (s != nil) { n = [s stringByAppendingFormat: @"%@", n]; } return n; } /** * Make a link for the element r with the specified type. Only the start of * the html element is returned (<a ...>). * If the boolean f is YES, then the link is a reference to somewhere, * and the method will return nil if the destination is not found in the index. * If f is NO, then the link is an anchor for some element being output, and * the method is guaranteed to succeed and return the link. */ - (NSString*) makeLink: (NSString*)r ofType: (NSString*)t isRef: (BOOL)f { NSString *s; NSString *kind = (f == YES) ? @"rel=\"gsdoc\" href" : @"name"; NSString *hash = (f == YES) ? @"#" : @""; if (f == NO || (s = [localRefs globalRef: r type: t]) != nil) { s = [NSString stringWithFormat: @"", kind, hash, t, r]; } else if ((s = [globalRefs globalRef: r type: t]) != nil) { s = [s stringByAppendingPathExtension: @"html"]; s = [NSString stringWithFormat: @"", kind, s, hash, t, r]; } return [s stringByReplacingString: @":" withString: @"$"]; } /** * Make a link for the element r, with the specified type t, * in a particular unit u. Only the start of * the html element is returned (<a ...>).
* If the boolean f is YES, then the link is a reference to somewhere, * otherwise the link is an anchor for some element being output.
* If there is an error, the method returns nil. */ - (NSString*) makeLink: (NSString*)r ofType: (NSString*)t inUnit: (NSString*)u isRef: (BOOL)f { NSString *s = nil; NSString *kind = (f == YES) ? @"rel=\"gsdoc\" href" : @"name"; NSString *hash = (f == YES) ? @"#" : @""; if (f == NO) { if (u == nil) { u = unit; s = base; } } else if (u == nil) { NSString *tmp = unit; s = [localRefs unitRef: r type: t unit: &tmp]; if (s == nil) { tmp = u; s = [localRefs unitRef: r type: t unit: &tmp]; if (s == nil) { tmp = unit; s = [globalRefs unitRef: r type: t unit: &tmp]; if (s == nil) { tmp = nil; s = [globalRefs unitRef: r type: t unit: &tmp]; } } } u = tmp; } if (s == nil) { NSString *tmp = u; /* * Simply look up the reference. */ s = [localRefs unitRef: r type: t unit: &u]; if (s == nil) { u = tmp; s = [globalRefs unitRef: r type: t unit: &u]; } } if (s != nil) { NSString *sep = @""; if ([t isEqual: @"ivariable"] == YES) { sep = @"*"; } if ([s isEqual: base] == YES) { s = [NSString stringWithFormat: @"
", kind, hash, t, u, sep, r]; } else { s = [s stringByAppendingPathExtension: @"html"]; s = [NSString stringWithFormat: @"", kind, s, hash, t, u, sep, r]; } } return [s stringByReplacingString: @":" withString: @"$"]; } - (NSString*) outputDocument: (GSXMLNode*)node { NSMutableString *buf; if (localRefs == nil) { localRefs = [AGSIndex new]; [localRefs makeRefs: node]; } buf = [NSMutableString stringWithCapacity: 4096]; /* Declaration */ [buf appendString: @"\n"]; [buf appendString: @"\n"]; [self incIndent]; [self outputNodeList: node to: buf]; [self decIndent]; [buf appendString: @"\n"]; return buf; } - (void) outputIndex: (NSString*)type scope: (NSString*)scope title: (NSString*)title style: (NSString*)style target: (NSString*)target to: (NSMutableString*)buf { NSDictionary *refs = [localRefs refs]; NSDictionary *dict; NSArray *a; unsigned c; unsigned i; BOOL isBareStyle = [@"bare" isEqualToString: style]; if (globalRefs != nil && [scope isEqual: @"global"] == YES) { refs = [globalRefs refs]; } else if (projectRefs != nil && [scope isEqual: @"project"] == YES) { refs = [projectRefs refs]; } if ([type isEqualToString: @"method"] == YES) { if (unit == nil) { refs = nil; // Can't index methods outside a unit. } dict = [refs objectForKey: @"unitmethods"]; dict = [dict objectForKey: unit]; } else if ([type isEqualToString: @"ivariable"] == YES) { if (unit == nil) { refs = nil; // Can't index instance variables outside a class. } dict = [refs objectForKey: @"classvars"]; dict = [dict objectForKey: unit]; } else { dict = [refs objectForKey: type]; } if ([type isEqual: @"title"] == YES) { if ([dict count] > 1) { if (!isBareStyle) { [buf appendString: indent]; [buf appendFormat: @"%@ Index\n", title]; [buf appendString: indent]; [buf appendString: @"\n"]; } } } else if ([dict count] > 0) { NSString *sep = @""; NSString *u = unit; BOOL isInUnit = NO; if (unit != nil) { if ([type isEqual: @"method"] || [type isEqual: @"ivariable"]) { isInUnit = YES; if ([type isEqual: @"ivariable"]) { sep = @"*"; // List ivars in class } else if (classname != nil && category == nil) { NSArray *catNames; NSDictionary *d; /* * For a class, we want to list methods in any associated * categories as well as those of the class itself. */ d = [refs objectForKey: @"categories"]; d = [d objectForKey: classname]; catNames = [d allKeys]; if ((c = [catNames count]) > 0) { NSMutableDictionary *m = [dict mutableCopy]; NSDictionary *unitDict; unitDict = [refs objectForKey: @"unitmethods"]; for (i = 0; i < c; i++) { NSString *catName = [catNames objectAtIndex: i]; NSDictionary *catDict; NSString *cName; NSEnumerator *enumerator; NSString *mname; cName = [classname stringByAppendingFormat: @"(%@)", catName]; catDict = [unitDict objectForKey: cName]; enumerator = [catDict keyEnumerator]; /* * Add category references to the dictionary, * prefixing them with the category they belong to. */ while ((mname = [enumerator nextObject]) != nil) { NSString *file = [catDict objectForKey: mname]; NSString *ref = [NSString stringWithFormat: @"(%@)%@", catName, mname]; [m setObject: file forKey: ref]; } } dict = AUTORELEASE(m); } } } } [buf appendString: indent]; if (!isBareStyle) { [buf appendFormat: @"%@\n", title]; } [buf appendString: indent]; if (!isBareStyle) { [buf appendString: @"
    "]; [self incIndent]; } [buf appendString: @"\n"]; a = [dict allKeys]; a = [a sortedArrayUsingSelector: @selector(compare:)]; c = [a count]; for (i = 0; i < c; i++) { NSString *ref = [a objectAtIndex: i]; NSString *file = [dict objectForKey: ref]; NSString *text = ref; ref = [ref stringByReplacingString: @":" withString: @"$"]; /* * If a reference to a method contains a leading category name, * we don't want it in the visible method name, however if it's * actually a formal protocol name, we need to make it look right * by changing the round brackets to angle brackets. */ if ([text hasPrefix: @"("] == YES) { NSRange r = [text rangeOfString: @")"]; if (NSMaxRange(r) == [text length]) // A formal protocol { text = [text stringByReplacingString: @"(" withString: @"<"]; text = [text stringByReplacingString: @")" withString: @">"]; } else // Category name in brackets followed by class name { text = [text substringFromIndex: NSMaxRange(r)]; } } [buf appendString: indent]; if (!isBareStyle) { [buf appendString: @"
  • "]; } [buf appendString: @"%@", file, type, u, sep, ref, text]; } else { if (([type isEqual: @"protocol"] == YES) && ([text hasPrefix: @"<"] == NO)) { // it's an informal protocol, detected earlier as an // unimplemented category of NSObject; make proper link text = [text stringByDeletingPrefix: @"NSObject"]; [buf appendFormat: @"href=\"%@.html#%@$%@\">%@", file, @"category", ref, text]; } else { [buf appendFormat: @"href=\"%@.html#%@$%@\">%@", file, type, ref, text]; } } if (!isBareStyle) { [buf appendString: @"
  • "]; } else { [buf appendString: @"
    "]; } [buf appendString: @"\n"]; } if (!isBareStyle) { [self decIndent]; [buf appendString: indent]; [buf appendString: @"
"]; } [buf appendString: @"\n"]; } } - (void) outputNode: (GSXMLNode*)node to: (NSMutableString*)buf { ENTER_POOL GSXMLNode *children = [node firstChild]; if ([node type] == XML_ELEMENT_NODE) { NSString *name = [node name]; NSDictionary *prop = [node attributes]; if ([name isEqual: @"back"] == YES) { // Open back division [buf appendString: indent]; [buf appendString: @"
\n"]; [self incIndent]; [self outputNodeList: children to: buf]; // Close back division [self decIndent]; [buf appendString: indent]; [buf appendString: @"
\n"]; } else if ([name isEqual: @"body"] == YES) { /* Should already be in html body */ [self outputNodeList: children to: buf]; [buf appendString: indent]; [buf appendString: @"
\n"]; if (prevFile != nil) { [buf appendString: indent]; [buf appendFormat: @"Prev\n", prevFile]; } if (upFile != nil) { [buf appendString: indent]; [buf appendFormat: @"Up\n", upFile]; } if (nextFile != nil) { [buf appendString: indent]; [buf appendFormat: @"Next\n", nextFile]; } [self decIndent]; [buf appendString: indent]; [buf appendString: indent]; [buf appendString: @"\n"]; [buf appendString: @"\n"]; } else if ([name isEqual: @"br"] == YES) { [buf appendString: @"
"]; } else if ([name isEqual: @"category"] == YES) { NSString *s; category = [prop objectForKey: @"name"]; classname = [prop objectForKey: @"class"]; unit = [NSString stringWithFormat: @"%@(%@)", classname, category]; [buf appendString: indent]; [buf appendString: @"

"]; [buf appendString: [self typeRef: classname]]; [buf appendString: @"("]; s = [self makeAnchor: unit ofType: @"category" name: category]; [buf appendString: s]; [buf appendString: @")

\n"]; [self outputUnit: node to: buf]; unit = nil; classname = nil; category = nil; } else if ([name isEqual: @"chapter"] == YES) { heading = @"h1"; chap++; sect = 0; ssect = 0; sssect = 0; [self outputNodeList: children to: buf]; heading = nil; } else if ([name isEqual: @"class"] == YES) { NSString *sup = [prop objectForKey: @"super"]; classname = [prop objectForKey: @"name"]; unit = classname; [buf appendString: indent]; [buf appendString: @"

"]; [buf appendString: [self makeAnchor: classname ofType: @"class" name: classname]]; if (sup != nil) { sup = [self typeRef: sup]; if (sup != nil) { [buf appendString: @" : "]; [buf appendString: sup]; } } [buf appendString: @"

\n"]; [self outputUnit: node to: buf]; unit = nil; classname = nil; } else if ([name isEqual: @"code"] == YES) { [buf appendString: @""]; [self outputText: children to: buf]; [buf appendString: @""]; } else if ([name isEqual: @"constant"] == YES) { NSString *nam; NSString *str; NSString *s; nam = [prop objectForKey: @"name"]; str = [prop objectForKey: @"type"]; str = [self typeRef: str]; str = [str stringByAppendingFormat: @" %@", nam]; /* * Output heading. */ [buf appendString: indent]; [buf appendString: @"

"]; s = [self makeLink: nam ofType: @"constant" isRef: NO]; if (s != nil) { [buf appendString: s]; [buf appendString: nam]; [buf appendString: @""]; } else { [buf appendString: nam]; } [buf appendString: @"

\n"]; [buf appendString: indent]; [buf appendString: str]; [buf appendString: @";
\n"]; node = firstElement(children); if ([[node name] isEqual: @"declared"] == YES) { [self outputNode: node to: buf]; node = [node nextElement]; } children = node; if ([[children name] isEqual: @"standards"]) { node = [node nextElement]; } [self outputVersion: prop to: buf]; if ([[node name] isEqual: @"desc"]) { [self outputNode: node to: buf]; } [buf appendString: indent]; [buf appendString: @"
\n"]; } else if ([name isEqual: @"contents"] == YES) { NSDictionary *dict; dict = [[localRefs refs] objectForKey: @"contents"]; if ([dict count] > 1) { NSArray *a; unsigned i; unsigned l = 0; [buf appendString: indent]; [buf appendString: @"
\n"]; [buf appendString: indent]; [buf appendString: @"

Contents -

\n"]; a = [dict allKeys]; a = [a sortedArrayUsingSelector: @selector(compare:)]; for (i = 0; i < [a count]; i++) { NSString *k = [a objectAtIndex: i]; NSString *v = [dict objectForKey: k]; unsigned pos = 3; if ([k hasSuffix: @"000"] == YES) { pos = 2; if ([k hasSuffix: @"000000"] == YES) { pos = 1; if ([k hasSuffix: @"000"] == YES) { pos = 0; } } if (l == pos) { [buf appendString: indent]; [buf appendString: @"
    \n"]; [self incIndent]; } else { while (l > pos + 1) { [self decIndent]; [buf appendString: indent]; [buf appendString: @"\n"]; [self decIndent]; [buf appendString: indent]; [buf appendString: @"
\n"]; l--; } if (l == pos + 1) { [self decIndent]; [buf appendString: indent]; [buf appendString: @"\n"]; l--; } } } [buf appendString: indent]; [buf appendString: @"
  • \n"]; [self incIndent]; [buf appendString: indent]; [buf appendFormat: @"%@\n", k, v]; if (pos == 3) { [self decIndent]; [buf appendString: indent]; [buf appendString: @"
  • \n"]; } else { l++; } } while (l > 0) { [self decIndent]; [buf appendString: indent]; [buf appendString: @"\n"]; [self decIndent]; [buf appendString: indent]; [buf appendString: @"\n"]; l--; } [buf appendString: indent]; [buf appendString: @"
    \n"]; } } else if ([name isEqual: @"declared"] == YES) { [buf appendString: indent]; [buf appendString: @"
    \n"]; [self incIndent]; [buf appendString: indent]; [buf appendString: @"
    \n"]; [self incIndent]; [buf appendString: indent]; [buf appendString: @"
    Declared in:
    \n"]; [buf appendString: indent]; [buf appendString: @"
    "]; [self outputText: [node firstChild] to: buf]; [buf appendString: @"
    \n"]; [self decIndent]; [buf appendString: indent]; [buf appendString: @"
    \n"]; [self decIndent]; [buf appendString: indent]; [buf appendString: @"
    \n"]; } else if ([name isEqual: @"desc"] == YES) { [buf appendString: indent]; [buf appendString: @"
    \n"]; [self incIndent]; while (children != nil) { children = [self outputBlock: children to: buf inPara: YES]; } [self decIndent]; [buf appendString: indent]; [buf appendString: @"
    \n"]; } else if ([name isEqual: @"em"] == YES) { [buf appendString: @""]; [self outputText: children to: buf]; [buf appendString: @""]; } else if ([name isEqual: @"email"] == YES) { NSString *ename; ename = [prop objectForKey: @"address"]; if (ename == nil) { [buf appendString: @""]; } else { [buf appendFormat: @"", ename]; } // // [node firstChild] doesn't look like it points to // the mail address. // not sure _where_ it points to though... // #if 0 [self outputText: [node firstChild] to: buf]; #endif if (ename == nil) { [buf appendString: @""]; } else { [buf appendFormat: @"%@", ename]; } } else if ([name isEqual: @"embed"] == YES) { [self outputBlock: node to: buf inPara: NO]; } else if ([name isEqual: @"entry"]) { NSString *text; NSString *val; text = [children escapedContent]; val = [prop objectForKey: @"id"]; if (val == nil) { val = text; if (val == nil) val = @""; } [buf appendString: [self makeAnchor: val ofType: @"label" name: @""]]; } else if ([name isEqual: @"example"] == YES) { [self outputBlock: node to: buf inPara: NO]; } else if ([name isEqual: @"file"] == YES) { [buf appendString: @""]; [self outputText: children to: buf]; [buf appendString: @""]; } else if ([name isEqual: @"footnote"] == YES) { [buf appendString: @"
    "]; [self outputText: children to: buf]; [buf appendString: @"
    "]; } else if ([name isEqual: @"front"] == YES) { // Open front division [buf appendString: indent]; [buf appendString: @"
    \n"]; [self incIndent]; [self outputNodeList: children to: buf]; // Close front division [self decIndent]; [buf appendString: indent]; [buf appendString: @"
    \n"]; } else if ([name isEqual: @"function"] == YES) { NSString *fun; NSString *str; NSString *s; GSXMLNode *tmp = children; BOOL hadArg = NO; fun = [prop objectForKey: @"name"]; str = [prop objectForKey: @"type"]; str = [self typeRef: str]; str = [str stringByAppendingFormat: @" %@(", fun]; children = nil; while (tmp != nil) { if ([tmp type] == XML_ELEMENT_NODE) { if ([[tmp name] isEqual: @"arg"] == YES) { GSXMLNode *t = [tmp firstChild]; NSString *s; if (hadArg == YES) { str = [str stringByAppendingString: @", "]; } s = [[tmp attributes] objectForKey: @"type"]; s = [self typeRef: s]; str = [str stringByAppendingString: s]; str = [str stringByAppendingString: @" "]; while (t != nil) { if ([t type] == XML_TEXT_NODE) { NSString *content = [t escapedContent]; if (content == nil) content = @""; str = [str stringByAppendingString: content]; } t = [t next]; } str = [str stringByAppendingString: @""]; hadArg = YES; } else if ([[tmp name] isEqual: @"vararg"] == YES) { str = [str stringByAppendingString: @",..."]; children = [tmp nextElement]; break; } else { children = tmp; break; } } tmp = [tmp nextElement]; } /* * Output function heading. */ [buf appendString: indent]; [buf appendString: @"

    "]; s = [self makeLink: fun ofType: @"function" isRef: NO]; if (s != nil) { [buf appendString: s]; [buf appendString: fun]; [buf appendString: @""]; } else { [buf appendString: fun]; } [buf appendString: @"

    \n"]; [buf appendString: indent]; [buf appendString: str]; [buf appendString: @");
    \n"]; node = firstElement(children); if ([[node name] isEqual: @"declared"] == YES) { [self outputNode: node to: buf]; node = [node nextElement]; } children = node; if ([[children name] isEqual: @"standards"]) { node = [node nextElement]; } [self outputVersion: prop to: buf]; if ([[node name] isEqual: @"desc"]) { [self outputNode: node to: buf]; } [buf appendString: indent]; [buf appendString: @"
    \n"]; } else if ([name isEqual: @"gsdoc"] == YES) { base = [prop objectForKey: @"base"]; if (base == nil) { NSLog(@"No 'base' document name supplied in gsdoc element"); } else { NSString *stylesheetURL = [prop objectForKey: @"stylesheeturl"]; nextFile = [prop objectForKey: @"next"]; nextFile = [nextFile stringByAppendingPathExtension: @"html"]; prevFile = [prop objectForKey: @"prev"]; prevFile = [prevFile stringByAppendingPathExtension: @"html"]; upFile = [prop objectForKey: @"up"]; upFile = [upFile stringByAppendingPathExtension: @"html"]; // special formatting for table-of-contents frames; ultimately // this should be moved to stylesheet isContentsDoc = ((stylesheetURL != nil) && ([stylesheetURL rangeOfString: @"gsdoc_contents"].length > 0)) ? YES : NO; [self outputNodeList: children to: buf]; } } else if ([name isEqual: @"head"] == YES) { NSString *headerTag; [buf appendString: indent]; [buf appendString: @"\n"]; [self incIndent]; children = firstElement(children); [buf appendString: indent]; [buf appendString: @""]; [self incIndent]; [self outputText: [children firstChild] to: buf]; [self decIndent]; [buf appendString: @"\n"]; #if 0 /** Css : TODO print.css **/ [buf appendString:@"\n"]; [buf appendString:@"\n"]; /** Robots **/ [buf appendString:@"\n"]; #endif [self decIndent]; [buf appendString: indent]; [buf appendString: @"\n"]; [buf appendString: indent]; [buf appendString: @"\n"]; [self incIndent]; // special formatting for table-of-contents frames; ultimately // this should be moved to stylesheet if (isContentsDoc) { [buf appendString: indent]; [buf appendFormat: @"\n", tocFont]; } else { [buf appendString: indent]; [buf appendFormat: @"\n", mainFont]; } if (prevFile != nil) { [buf appendString: indent]; [buf appendFormat: @"Prev\n", prevFile]; } if (upFile != nil) { [buf appendString: indent]; [buf appendFormat: @"Up\n", upFile]; } if (nextFile != nil) { [buf appendString: indent]; [buf appendFormat: @"Next\n", nextFile]; } if (prevFile != nil || upFile != nil || nextFile != nil) { [buf appendString: indent]; [buf appendString: @"
    \n"]; } [buf appendString: indent]; if (isContentsDoc) { headerTag = @"h2"; } else { headerTag = @"h1"; } [buf appendFormat: @"<%@>", headerTag, base]; [self outputText: [children firstChild] to: buf]; [buf appendFormat: @"\n", headerTag]; children = [children nextElement]; if ([[children name] isEqual: @"author"] == YES) { [buf appendString: indent]; [buf appendString: @"

    Authors

    \n"]; [buf appendString: indent]; [buf appendString: @"
    \n"]; [self incIndent]; while ([[children name] isEqual: @"author"] == YES) { GSXMLNode *author = children; GSXMLNode *tmp; GSXMLNode *email = nil; GSXMLNode *url = nil; GSXMLNode *desc = nil; children = [children nextElement]; tmp = [author firstChildElement]; if ([[tmp name] isEqual: @"email"] == YES) { email = tmp; tmp = [tmp nextElement]; } if ([[tmp name] isEqual: @"url"] == YES) { url = tmp; tmp = [tmp nextElement]; } if ([[tmp name] isEqual: @"desc"] == YES) { desc = tmp; } [buf appendString: indent]; if (url == nil) { [buf appendString: @"
    "]; [buf appendString: [[[author attributes] objectForKey: @"name"] stringByEscapingXML]]; } else { [buf appendString: @"
    "]; [buf appendString: [[[author attributes] objectForKey: @"name"] stringByEscapingXML]]; [buf appendString: @""]; } if (email != nil) { // // Add a beautifier ' ' otherwise we'll get a //
    John Doe(\n"]; [buf appendString: indent]; [buf appendString: @"
    \n"]; if (desc != nil) { [self incIndent]; [self outputNode: desc to: buf]; [self decIndent]; } [buf appendString: indent]; [buf appendString: @"
    \n"]; } [self decIndent]; [buf appendString: indent]; [buf appendString: @"
    \n"]; } if ([[children name] isEqual: @"version"] == YES) { [buf appendString: indent]; [buf appendString: @"

    Version: "]; [self outputText: [children firstChild] to: buf]; [buf appendString: @"

    \n"]; children = [children nextElement]; } if ([[children name] isEqual: @"date"] == YES) { [buf appendString: indent]; [buf appendString: @"

    Date: "]; [self outputText: [children firstChild] to: buf]; [buf appendString: @"

    \n"]; children = [children nextElement]; } if ([[children name] isEqual: @"abstract"] == YES) { GSXMLNode *tmp = [children firstChild]; [buf appendString: indent]; [buf appendString: @"
    \n"]; [self incIndent]; while (tmp != nil) { tmp = [self outputBlock: tmp to: buf inPara: NO]; } [self decIndent]; [buf appendString: indent]; [buf appendString: @"
    \n"]; children = [children nextElement]; } if ([[children name] isEqual: @"copy"] == YES) { [buf appendString: indent]; [buf appendString: @"

    Copyright: (C) "]; [self outputText: [children firstChild] to: buf]; [buf appendString: @"

    \n"]; } } else if ([name isEqual: @"heading"] == YES) { if (heading == nil) { } else { [buf appendString: indent]; [buf appendString: @"<"]; [buf appendString: heading]; [buf appendString: @">"]; [buf appendFormat: @"
    ", chap, sect, ssect, sssect]; [self outputText: children to: buf]; [buf appendString: @"\n"]; heading = nil; } } else if ([name isEqual: @"index"] == YES) { NSString *scope = [prop objectForKey: @"scope"]; NSString *type = [prop objectForKey: @"type"]; NSString *target = [prop objectForKey: @"target"]; NSString *title = [type capitalizedString]; NSString *style = [prop objectForKey: @"style"]; [self outputIndex: type scope: scope title: title style: style target: target to: buf ]; } else if ([name isEqual: @"ivar"] == YES) // %phrase { [buf appendString: @""]; [self outputText: children to: buf]; [buf appendString: @""]; } else if ([name isEqual: @"ivariable"] == YES) { NSString *n = [prop objectForKey: @"name"]; NSString *t = [prop objectForKey: @"type"]; NSString *v = [prop objectForKey: @"validity"]; NSString *s; GSXMLNode *tmp; tmp = children = firstElement(children); [buf appendString: indent]; [buf appendString: @"

    "]; s = [self makeLink: n ofType: @"ivariable" inUnit: nil isRef: NO]; if (s != nil) { [buf appendString: s]; [buf appendString: n]; [buf appendString: @""]; } else { [buf appendString: n]; } [buf appendString: @"

    \n"]; if (v == nil) { v = @"public"; } [buf appendFormat: @"%@@%@ %@ %@;
    \n", indent, v, t, n]; /* if ([[children name] isEqual: @"desc"] == YES) { children = [children nextElement]; } */ /* * List standards with which ivar complies */ [self outputVersion: prop to: buf]; if ([[tmp name] isEqual: @"desc"]) { [self outputNode: tmp to: buf]; } [buf appendString: indent]; [buf appendString: @"
    \n"]; } else if ([name isEqual: @"label"] == YES) // %anchor { NSString *text; NSString *val; text = [children escapedContent]; val = [prop objectForKey: @"id"]; if (val == nil) { val = text; if (val == nil) val = @""; } [buf appendString: [self makeAnchor: val ofType: @"label" name: text]]; } else if ([name isEqual: @"macro"] == YES) { NSString *mac; NSString *str; NSString *s; GSXMLNode *tmp = children; BOOL hadArg = NO; mac = [prop objectForKey: @"name"]; str = [NSString stringWithFormat: @" %@", mac]; children = nil; while (tmp != nil) { if ([tmp type] == XML_ELEMENT_NODE) { if ([[tmp name] isEqual: @"arg"] == YES) { GSXMLNode *t = [tmp firstChild]; if (hadArg == YES) { str = [str stringByAppendingString: @", "]; } else { str = [str stringByAppendingString: @"("]; } str = [str stringByAppendingString: @""]; while (t != nil) { if ([t type] == XML_TEXT_NODE) { NSString *content = [t escapedContent]; if (content == nil) content = @""; str = [str stringByAppendingString: content]; } t = [t next]; } str = [str stringByAppendingString: @""]; hadArg = YES; } else if ([[tmp name] isEqual: @"vararg"] == YES) { if (hadArg == YES) { str = [str stringByAppendingString: @",..."]; } else { str = [str stringByAppendingString: @"(..."]; } children = [tmp nextElement]; hadArg = YES; break; } else { children = tmp; break; } } tmp = [tmp nextElement]; } /* * Output macro heading. */ [buf appendString: indent]; [buf appendString: @"

    "]; s = [self makeLink: mac ofType: @"macro" isRef: NO]; if (s != nil) { [buf appendString: s]; [buf appendString: mac]; [buf appendString: @""]; } else { [buf appendString: mac]; } [buf appendString: @"

    \n"]; [buf appendString: indent]; [buf appendString: str]; if (hadArg == YES) { [buf appendString: @")"]; } [buf appendString: @"
    \n"]; node = firstElement(children); if ([[node name] isEqual: @"declared"] == YES) { [self outputNode: node to: buf]; node = [node nextElement]; } children = node; if ([[children name] isEqual: @"standards"]) { node = [node nextElement]; } [self outputVersion: prop to: buf]; if ([[node name] isEqual: @"desc"]) { [self outputNode: node to: buf]; } [buf appendString: indent]; [buf appendString: @"
    \n"]; } else if ([name isEqual: @"method"] == YES) { NSString *sel; NSString *str; GSXMLNode *tmp = children; BOOL hadArg = NO; [buf appendString:@"
    \n"]; sel = [prop objectForKey: @"factory"]; str = [prop objectForKey: @"type"]; if (sel != nil && [sel boolValue] == YES) { sel = @"+"; str = [NSString stringWithFormat: @"+ (%@) ", [self typeRef: str]]; } else { sel = @"-"; str = [NSString stringWithFormat: @"- (%@) ", [self typeRef: str]]; } children = nil; while (tmp != nil) { if ([tmp type] == XML_ELEMENT_NODE) { if ([[tmp name] isEqual: @"sel"] == YES) { GSXMLNode *t = [tmp firstChild]; str = [str stringByAppendingString: @""]; while (t != nil) { if ([t type] == XML_TEXT_NODE) { NSString *content = [t escapedContent]; if (content == nil) content = @""; sel = [sel stringByAppendingString: content]; // these nbsp added for readability, but must // be removed below when making href link sel = [sel stringByAppendingString: @" "]; if (hadArg == YES) { str = [str stringByAppendingString: @" "]; } str = [str stringByAppendingString: content]; } t = [t next]; } str = [str stringByAppendingString: @""]; } else if ([[tmp name] isEqual: @"arg"] == YES) { GSXMLNode *t = [tmp firstChild]; NSString *s; s = [[tmp attributes] objectForKey: @"type"]; s = [self typeRef: s]; str = [str stringByAppendingFormat: @" (%@)", s]; while (t != nil) { if ([t type] == XML_TEXT_NODE) { NSString *content = [t escapedContent]; if (content == nil) content = @""; str = [str stringByAppendingString: content]; } t = [t next]; } hadArg = YES; // Say we have found an arg. } else if ([[tmp name] isEqual: @"vararg"] == YES) { sel = [sel stringByAppendingString: @",..."]; str = [str stringByAppendingString: @",..."]; children = [tmp nextElement]; break; } else { children = tmp; break; } } tmp = [tmp nextElement]; } if ([sel length] > 1) { NSString *s; NSMutableString *linkRef; /* * Output selector heading. */ [buf appendString: indent]; [buf appendString: @"

    "]; // get rid of nbsps put in for readability above linkRef = [NSMutableString stringWithCapacity: [sel length]]; [linkRef setString:sel]; [linkRef replaceString: @" " withString: @""]; s = [self makeLink: linkRef ofType: @"method" inUnit: nil isRef: NO]; if (s != nil) { [buf appendString: s]; [buf appendString: [sel substringFromIndex: 1]]; [buf appendString: @""]; } else { [buf appendString: [sel substringFromIndex: 1]]; } [buf appendString: @"

    \n"]; [buf appendString: indent]; [buf appendString: str]; [buf appendString: @";
    \n"]; node = firstElement(children); /* * List standards with which method complies */ children = node; if ([[children name] isEqual: @"standards"]) { node = [node nextElement]; } [self outputVersion: prop to: buf]; if ((str = [prop objectForKey: @"init"]) != nil && [str boolValue] == YES) { [buf appendString: @"This is a designated initialiser " @"for the class.
    \n"]; } str = [prop objectForKey: @"override"]; if ([str isEqual: @"subclass"] == YES) { [buf appendString: @"Subclasses must " @"override this method.
    \n"]; } else if ([str isEqual: @"dummy"] == YES) { [buf appendString: @"An empty method provided for subclasses " @"to override.
    \n"]; } else if ([str isEqual: @"never"] == YES) { [buf appendString: @"Subclasses must NOT " @"override this method.
    \n"]; } if ([[node name] isEqual: @"desc"]) { [self outputNode: node to: buf]; } [buf appendString: indent]; [buf appendString: @"
    \n"]; } [buf appendString:@"
    \n"]; } else if ([name isEqual: @"p"] == YES) { [self outputBlock: node to: buf inPara: NO]; } else if ([name isEqual: @"prjref"] == YES) { NSLog(@"Element '%@' not implemented", name); // FIXME } else if ([name isEqual: @"ref"] == YES) // %xref { NSString *type = [prop objectForKey: @"type"]; NSString *r = [prop objectForKey: @"id"]; GSXMLNode *tmp = [node firstChild]; NSString *c = [prop objectForKey: @"class"]; NSString *s; // fill in default value if ((type == nil) || [type isEqual: @""]) { type = @"label"; } if ([type isEqual: @"method"] || [type isEqual: @"ivariable"]) { s = [self makeLink: r ofType: type inUnit: c isRef: YES]; } else { s = [self makeLink: r ofType: type isRef: YES]; /** * As a special case, if we have a reference to a function, * and we can't find it, we check to see if there is actually * a macro of that name and refer to that instead. */ if (s == nil && [type isEqual: @"function"] == YES) { s = [self makeLink: r ofType: @"macro" isRef: YES]; } } if (s == nil) { if (c == nil) { NSLog(@"Location of %@ '%@' (referenced from %@) " @"not found or not unique.", type, r, base); } else { NSLog(@"Location of the %@ version of %@ '%@' (referenced " @"from %@) not found.", c, type, r, base); } if (tmp == nil) { [buf appendString: r]; } else { [self outputText: tmp to: buf]; } [buf appendString: @"\n"]; } else { [buf appendString: s]; if (tmp == nil) { [buf appendString: r]; } else { [self outputText: tmp to: buf]; } [buf appendString: @"\n"]; } } else if ([name isEqual: @"protocol"] == YES) { NSString *value = [prop objectForKey: @"name"]; unit = [NSString stringWithFormat: @"(%@)", value]; [buf appendString: indent]; [buf appendString: @"

    "]; [buf appendString: [self makeAnchor: unit ofType: @"protocol" name: value]]; [buf appendString: @"

    \n"]; [self outputUnit: node to: buf]; unit = nil; } else if ([name isEqual: @"EOEntity"] == YES || [name isEqual: @"EOModel"] == YES) { NSLog(@"Element '%@' not implemented", name); // FIXME } else if ([name isEqual: @"section"] == YES) { heading = @"h2"; sect++; ssect = 0; sssect = 0; [self outputNodeList: children to: buf]; heading = @"h1"; } else if ([name isEqual: @"site"] == YES) { [buf appendString: @""]; [self outputText: children to: buf]; [buf appendString: @""]; } else if ([name isEqual: @"standards"]) { } else if ([name isEqual: @"strong"] == YES) { [buf appendString: @""]; [self outputText: children to: buf]; [buf appendString: @""]; } else if ([name isEqual: @"subsect"] == YES) { heading = @"h3"; ssect++; sssect = 0; [self outputNodeList: children to: buf]; heading = @"h2"; } else if ([name isEqual: @"subsubsect"] == YES) { heading = @"h4"; sssect++; [self outputNodeList: children to: buf]; heading = @"h3"; } else if ([name isEqual: @"type"] == YES) { NSString *nam; NSString *str; NSString *s; nam = [prop objectForKey: @"name"]; str = [prop objectForKey: @"type"]; str = [self typeRef: str]; str = [NSString stringWithFormat: @"typedef %@ %@", str, nam]; /* * Output typedef heading. */ [buf appendString: indent]; [buf appendString: @"

    "]; s = [self makeLink: nam ofType: @"type" isRef: NO]; if (s != nil) { [buf appendString: s]; [buf appendString: nam]; [buf appendString: @""]; } else { [buf appendString: nam]; } [buf appendString: @"

    \n"]; [buf appendString: indent]; [buf appendString: str]; [buf appendString: @";
    \n"]; node = firstElement(children); if (node != nil && [[node name] isEqual: @"declared"] == YES) { [self outputNode: node to: buf]; node = [node nextElement]; } children = node; if ([[children name] isEqual: @"standards"]) { node = [node nextElement]; } [self outputVersion: prop to: buf]; if (node != nil && [[node name] isEqual: @"desc"] == YES) { [self outputNode: node to: buf]; } [buf appendString: indent]; [buf appendString: @"
    \n"]; } else if ([name isEqual: @"uref"] == YES) { [buf appendString: @""]; [self outputText: children to: buf]; [buf appendString: @""]; } else if ([name isEqual: @"url"] == YES) { // create an HREF as before but use the URL itself as marker text [buf appendString: @""]; [buf appendString: [prop objectForKey: @"url"]]; [buf appendString: @""]; } else if ([name isEqual: @"var"] == YES) // %phrase { [buf appendString: @""]; [self outputText: children to: buf]; [buf appendString: @""]; } else if ([name isEqual: @"variable"] == YES) { NSString *nam; NSString *str; NSString *s; nam = [prop objectForKey: @"name"]; str = [prop objectForKey: @"type"]; str = [self typeRef: str]; str = [str stringByAppendingFormat: @" %@", nam]; /* * Output variable heading. */ [buf appendString: indent]; [buf appendString: @"

    "]; s = [self makeLink: nam ofType: @"variable" isRef: NO]; if (s != nil) { [buf appendString: s]; [buf appendString: nam]; [buf appendString: @""]; } else { [buf appendString: nam]; } [buf appendString: @"

    \n"]; [buf appendString: indent]; [buf appendString: str]; [buf appendString: @";
    \n"]; node = firstElement(children); if ([[node name] isEqual: @"declared"] == YES) { [self outputNode: node to: buf]; node = [node nextElement]; } children = node; if ([[children name] isEqual: @"standards"]) { node = [node nextElement]; } [self outputVersion: prop to: buf]; if ([[node name] isEqual: @"desc"]) { [self outputNode: node to: buf]; } [buf appendString: indent]; [buf appendString: @"
    \n"]; } else { GSXMLNode *tmp; /* * Try outputting as any of the list elements. */ tmp = [self outputList: node to: buf]; if (tmp == node) { NSLog(@"Element '%@' not implemented", name); // FIXME } } } LEAVE_POOL } /** * Output all the nodes from this one onwards ... try to output * as text first, if not possible, call the main method to output * each node. */ - (void) outputNodeList: (GSXMLNode*)node to: (NSMutableString*)buf { while (node != nil) { GSXMLNode *next = [node nextElement]; GSXMLNode *tmp; tmp = [self outputText: node to: buf]; if (tmp == node) { [self outputNode: node to: buf]; node = next; } else { node = tmp; } } } /** * Outputs zero or more nodes at the same level as long as the nodes * are valid %block elements. Returns nil or the first node not output. * The value of flag is used to control paragraph nesting ... if YES * we close a paragraph before opening a new one, and open again once * the new paragraph closes. */ - (GSXMLNode*) outputBlock: (GSXMLNode*)node to: (NSMutableString*)buf inPara: (BOOL)flag { if (node != nil && [node type] == XML_ELEMENT_NODE) { GSXMLNode *tmp = node; NSString *n; node = [self outputList: node to: buf]; if (node != tmp) { return node; } n = [node name]; if ([n isEqual: @"p"] == YES) { if (flag == YES) { [self decIndent]; [buf appendString: indent]; [buf appendString: @"

    \n"]; } [buf appendString: indent]; [buf appendString: @"

    \n"]; [self incIndent]; [self outputText: [node firstChild] to: buf]; [self decIndent]; [buf appendString: indent]; [buf appendString: @"

    \n"]; if (flag == YES) { [buf appendString: indent]; [buf appendString: @"

    \n"]; [self incIndent]; } return [node next]; } else if ([n isEqual: @"example"] == YES) { GSXMLNode *c = [node firstChild]; [buf appendString: @"

    "];
    	  [self outputText: c to: buf];
    	  [buf appendString: @"
    \n"]; return [node next]; } else if ([n isEqual: @"embed"] == YES) { NSLog(@"Element 'embed' not supported"); return [node next]; } else if ([n isEqual: @"index"] == YES) { [self outputNode: node to: buf]; return [node next]; } else if ([textNodes member: n] != nil) { [buf appendString: indent]; node = [self outputText: node to: buf]; [buf appendString: @"\n"]; return node; } else { NSLog(@"Non-block element '%@' in block ...", n); NSLog(@"%@",node); return nil; } } [buf appendString: indent]; node = [self outputText: node to: buf]; [buf appendString: @"\n"]; return node; } /** * Outputs a node as long as it is a * valid %list element. Returns next node at this level. */ - (GSXMLNode*) outputList: (GSXMLNode*)node to: (NSMutableString*)buf { NSString *name = [node name]; GSXMLNode *children = [node firstChildElement]; if ([name isEqual: @"list"] == YES) { [buf appendString: indent]; [buf appendString: @"
      \n"]; [self incIndent]; while (children != nil) { GSXMLNode *tmp = [children firstChild]; [buf appendString: indent]; [buf appendString: @"
    • \n"]; [self incIndent]; while (tmp != nil) { tmp = [self outputBlock: tmp to: buf inPara: NO]; } [self decIndent]; [buf appendString: indent]; [buf appendString: @"
    • \n"]; children = [children nextElement]; } [self decIndent]; [buf appendString: indent]; [buf appendString: @"
    \n"]; } else if ([name isEqual: @"enum"] == YES) { [buf appendString: indent]; [buf appendString: @"
      \n"]; [self incIndent]; while (children != nil) { GSXMLNode *tmp = [children firstChild]; [buf appendString: indent]; [buf appendString: @"
    1. \n"]; [self incIndent]; while (tmp != nil) { tmp = [self outputBlock: tmp to: buf inPara: NO]; } [self decIndent]; [buf appendString: indent]; [buf appendString: @"
    2. \n"]; children = [children nextElement]; } [self decIndent]; [buf appendString: indent]; [buf appendString: @"
    \n"]; } else if ([name isEqual: @"deflist"] == YES) { [buf appendString: indent]; [buf appendString: @"
    \n"]; [self incIndent]; while (children != nil) { GSXMLNode *tmp; [buf appendString: indent]; [buf appendString: @"
    "]; [self outputText: [children firstChild] to: buf]; [buf appendString: @"
    \n"]; children = [children nextElement]; [buf appendString: indent]; [buf appendString: @"
    \n"]; [self incIndent]; tmp = [children firstChild]; while (tmp != nil) { tmp = [self outputBlock: tmp to: buf inPara: NO]; } [self decIndent]; [buf appendString: indent]; [buf appendString: @"
    \n"]; children = [children nextElement]; } [self decIndent]; [buf appendString: indent]; [buf appendString: @"
    \n"]; } else if ([name isEqual: @"qalist"] == YES) { [buf appendString: indent]; [buf appendString: @"
    \n"]; [self incIndent]; while (children != nil) { GSXMLNode *tmp; [buf appendString: indent]; [buf appendString: @"
    "]; [self outputText: [children firstChild] to: buf]; [buf appendString: @"
    \n"]; children = [children nextElement]; [buf appendString: indent]; [buf appendString: @"
    \n"]; [self incIndent]; tmp = [children firstChild]; while (tmp != nil) { tmp = [self outputBlock: tmp to: buf inPara: NO]; } [self decIndent]; [buf appendString: indent]; [buf appendString: @"
    \n"]; children = [children nextElement]; } [self decIndent]; [buf appendString: indent]; [buf appendString: @"
    \n"]; } else if ([name isEqual: @"dictionary"] == YES) { [buf appendString: indent]; [buf appendString: @"
    {\n"]; [self incIndent]; // all children should be dictionaryItems w/key and value attributes; // if the value attribute is absent, the content is the value for (; children != nil; children = [children nextElement]) { GSXMLNode *dItem = children; NSDictionary *dProp = [dItem attributes]; NSString *value = [dProp objectForKey: @"value"]; GSXMLNode *dChild; if (![@"dictionaryItem" isEqualToString: [dItem name]]) { continue; } [buf appendString: indent]; [buf appendString: @"
    "]; [buf appendString: [[dProp objectForKey: @"key"] stringByEscapingXML]]; [buf appendString: @" =
    \n"]; [buf appendString: indent]; [buf appendString: @"
    \n"]; [self incIndent]; if (value != nil) { [buf appendString: [value stringByEscapingXML]]; } else { dChild = [dItem firstChildElement]; if ( dChild == nil ) { // no elements, just text contents dChild = [dItem firstChild]; [buf appendString: indent]; } [self outputBlock: dChild to: buf inPara: NO]; //PENDING use returne value for dItem? } [buf appendString: @"\n"]; [self decIndent]; [buf appendString: indent]; [buf appendString: @";
    \n"]; } [self decIndent]; [buf appendString: indent]; [buf appendString: @"
    }\n"]; } else { return node; // Not a list } node = [node next]; return node; } /** * Outputs zero or more nodes at the same level as long as the nodes * are valid %text elements. Returns nil or the first node not output. */ - (GSXMLNode*) outputText: (GSXMLNode*)node to: (NSMutableString*)buf { while (node != nil) { if ([node type] == XML_TEXT_NODE) { NSString *str = [node escapedContent]; if (str == nil) str = @""; [buf appendString: str]; } else if ([node type] == XML_ENTITY_REF_NODE) { [buf appendString: @"&"]; [buf appendString: [node name]]; [buf appendString: @";"]; } else if ([node type] == XML_ELEMENT_NODE) { NSString *name = [node name]; if ([textNodes member: name] != nil) { [self outputNode: node to: buf]; } else { return node; // Not a text node. } } node = [node next]; } return node; } - (void) outputUnit: (GSXMLNode*)node to: (NSMutableString*)buf { NSArray *a; NSMutableString *ivarBuf = ivarsAtEnd ? (id)[NSMutableString stringWithCapacity: 1024] : nil; NSDictionary *prop = [node attributes]; node = [node firstChildElement]; if (node != nil && [[node name] isEqual: @"declared"] == YES) { [self outputNode: node to: buf]; node = [node nextElement]; } if (node != nil && [[node name] isEqual: @"conform"] == YES) { [buf appendString: indent]; [buf appendString: @"
    \n"]; [self incIndent]; [buf appendString: indent]; [buf appendString: @"
    \n"]; [self incIndent]; [buf appendString: indent]; [buf appendString: @"
    Conforms to:
    \n"]; while (node != nil && [[node name] isEqual: @"conform"] == YES) { NSString *text = [[node firstChild] escapedContent]; if (text == nil) text = @""; [buf appendString: indent]; [buf appendString: @"
    "]; [buf appendString: [self protocolRef: text]]; [buf appendString: @"
    \n"]; node = [node nextElement]; } [self decIndent]; [buf appendString: indent]; [buf appendString: @"
    \n"]; [self decIndent]; [buf appendString: indent]; [buf appendString: @"
    \n"]; } while (node != nil && [[node name] isEqual: @"desc"] == NO) { node = [node nextElement]; } [self outputVersion: prop to: buf]; if (node != nil && [[node name] isEqual: @"desc"] == YES) { [self outputNode: node to: buf]; node = [node nextElement]; } if (node != nil && [[node name] isEqual: @"ivariable"] == YES) { NSMutableString *ibuf = buf; /* * If want instance variables at end, throw it all into an alternate * buffer and just put a link here; later alt buf must be appended. */ if (ivarsAtEnd) { ibuf = ivarBuf; [buf appendString: indent]; [buf appendString: @"
    \n"]; [buf appendString: indent]; [buf appendFormat: @"Instance Variables\n", classname]; [buf appendString: indent]; [buf appendString: @"

    \n"]; [ibuf appendFormat: @"", classname]; } [ibuf appendString: indent]; [ibuf appendString: @"

    \n"]; [ibuf appendString: indent]; [ibuf appendFormat: @"

    Instance Variables for %@ Class

    \n", classname]; while (node != nil && [[node name] isEqual: @"ivariable"] == YES) { [self outputNode: node to: ibuf]; node = [node nextElement]; } [ibuf appendString: indent]; [ibuf appendString: @"


    \n"]; } a = [localRefs methodsInUnit: unit]; if ([a count] > 0) { [self outputIndex: @"method" scope: @"global" title: @"Method summary" style: nil target: nil to: buf]; [buf appendString: indent]; [buf appendString: @"
    \n"]; while (node != nil) { if ([[node name] isEqual: @"method"] == YES) { [self outputNode: node to: buf]; } node = [node nextElement]; } } // if had ivars docs, insert them now if (ivarsAtEnd) { [buf appendString: ivarBuf]; } } - (void) outputVersion: (NSDictionary*)prop to: (NSMutableString*)buf { NSString *ovadd = [prop objectForKey: @"ovadd"]; NSString *gvadd = [prop objectForKey: @"gvadd"]; NSString *ovdep = [prop objectForKey: @"ovdep"]; NSString *gvdep = [prop objectForKey: @"gvdep"]; NSString *ovrem = [prop objectForKey: @"ovrem"]; NSString *gvrem = [prop objectForKey: @"gvrem"]; const char *str; int maj; int min; int sub; if ([ovadd length] > 0) { int add; int dep; int rem; str = [ovadd UTF8String]; if (str != 0 && sscanf(str, "%d.%d.%d", &maj, &min, &sub) == 3) add = maj * 10000 + min * 100 + sub; else add = 0; str = [ovdep UTF8String]; if (str != 0 && sscanf(str, "%d.%d.%d", &maj, &min, &sub) == 3) dep = maj * 10000 + min * 100 + sub; else dep = 0; str = [ovrem UTF8String]; if (str != 0 && sscanf(str, "%d.%d.%d", &maj, &min, &sub) == 3) rem = maj * 10000 + min * 100 + sub; else rem = 0; [buf appendString: indent]; [buf appendString: @"
    \n"]; [buf appendString: @"Availability: "]; if (add < GS_API_OSSPEC) { [buf appendString: @"Not in OpenStep/MacOS-X"]; } else if (add < GS_API_OPENSTEP) { [buf appendString: @"OpenStep"]; } else if (add < GS_API_MACOSX) { [buf appendString: @"OPENSTEP "]; [buf appendString: ovadd]; } else { [buf appendString: @"MacOS-X "]; [buf appendString: ovadd]; } if (dep > add) { [buf appendString: @" deprecated at "]; if (dep < GS_API_MACOSX) { [buf appendString: @"OPENSTEP "]; [buf appendString: ovdep]; } else { [buf appendString: @"MacOS-X "]; [buf appendString: ovdep]; } } if (rem > add) { [buf appendString: @" removed at "]; if (rem < GS_API_MACOSX) { [buf appendString: @"OPENSTEP "]; [buf appendString: ovrem]; } else { [buf appendString: @"MacOS-X "]; [buf appendString: ovrem]; } } if ([gvadd length] > 0) { [buf appendString: @", "]; [buf appendString: project]; if ([gvadd isEqualToString: @"0.0.0"] == NO) { [buf appendString: @" "]; [buf appendString: gvadd]; } if ([gvdep length] > 0) { [buf appendString: @" deprecated at "]; [buf appendString: gvdep]; } if ([gvrem length] > 0) { [buf appendString: @" Likely to be changed/moved/removed at "]; [buf appendString: gvrem]; } } [buf appendString:@"
    \n"]; [buf appendString: @"
    \n"]; } else if ([gvadd length] > 0) { [buf appendString: indent]; [buf appendString: @"
    \n"]; [buf appendString: @"Availability: "]; [buf appendString: project]; if ([gvadd isEqualToString: @"0.0.0"] == NO) { [buf appendString: @" "]; [buf appendString: gvadd]; } if ([gvdep length] > 0) { [buf appendString: @" deprecated at "]; [buf appendString: gvdep]; } [buf appendString: @"
    \n"]; if ([gvrem length] > 0) { [buf appendString: @" Likely to be changed/moved/removed at "]; [buf appendString: gvrem]; } [buf appendString:@"
    \n"]; [buf appendString: @"
    \n"]; } } /** * Try to make a link to the documentation for the supplied protocol. */ - (NSString*) protocolRef: (NSString*)t { NSString *n; NSString *s; t = [t stringByTrimmingSpaces]; n = [NSString stringWithFormat: @"(%@)", t]; s = [self makeLink: n ofType: @"protocol" isRef: YES]; if (s != nil) { s = [s stringByAppendingString: t]; t = [s stringByAppendingString: @"
    "]; } return t; } - (void) setGlobalRefs: (AGSIndex*)r { ASSIGN(globalRefs, r); } - (void) setLocalRefs: (AGSIndex*)r { ASSIGN(localRefs, r); } - (void) setProjectRefs: (AGSIndex*)r { ASSIGN(projectRefs, r); } - (void) setInstanceVariablesAtEnd: (BOOL)val { ivarsAtEnd = val; } /** * Assuming that the supplied string contains type information (as used * in a method declaration or type cast), we make an attempt at extracting * the basic type, and seeing if we can find a documented declaration for * it. If we can, we return a modified version of the string containing * a link to the appropriate documentation. Otherwise, we just return the * plain type string. In all cases, we strip leading and trailing white space. */ - (NSString*) typeRef: (NSString*)t { NSString *str = [t stringByTrimmingSpaces]; NSString *s; unsigned end = [str length]; unsigned start; NSMutableString *ms = nil; NSRange er; NSRange sr; if (end == 0) { return nil; } t = str; while (end > 0) { unichar c = [t characterAtIndex: end-1]; if (c != '*' && !isspace(c)) { break; } end--; } start = end; while (start > 0) { unichar c = [t characterAtIndex: start-1]; if (c != '_' && !isalnum(c)) { break; } start--; } t = [str substringWithRange: NSMakeRange(start, end - start)]; s = [self makeLink: t ofType: @"type" isRef: YES]; if (s == nil) { s = [self makeLink: t ofType: @"class" isRef: YES]; } s = [s stringByAppendingFormat: @"%@", t]; if (s != nil && [str length] == [t length]) { return s; } /* * Look for protocol spec. */ sr = [str rangeOfString: @"<"]; if (sr.length == 0) { sr = [str rangeOfString: @"<"]; } if (sr.length == 0) { sr = [str rangeOfString: @"<"]; } er = [str rangeOfString: @">"]; if (er.length == 0) { er = [str rangeOfString: @">"]; } if (er.length == 0) { er = [str rangeOfString: @">"]; } /* * Substitute in protocol references. */ if (sr.length > 0 && er.length > 0 && er.location > sr.location) { NSString *pString; NSRange r; NSArray *protocols; unsigned i; r = NSMakeRange(NSMaxRange(sr), er.location - NSMaxRange(sr)); pString = [str substringWithRange: r]; protocols = [pString componentsSeparatedByString: @","]; ms = [str mutableCopy]; pString = @""; for (i = 0; i < [protocols count]; i++) { NSString *p = [protocols objectAtIndex: i]; NSString *l; l = [self makeLink: [NSString stringWithFormat: @"(%@)", p] ofType: @"protocol" isRef: YES]; if (l != nil) { p = [l stringByAppendingFormat: @"%@", p]; } if (i > 0) { pString = [pString stringByAppendingString: @","]; } pString = [pString stringByAppendingString: p]; } [ms replaceCharactersInRange: r withString: pString]; } /* * Substitute in basic type reference. */ if (s != nil) { if (ms == nil) { ms = [str mutableCopy]; } [ms replaceCharactersInRange: NSMakeRange(start, end - start) withString: s]; } if (ms != nil) { str = AUTORELEASE(ms); } return str; } @end gnustep-base-1.29.0/Tools/AGSIndex.h000066400000000000000000000042121435650067400170640ustar00rootroot00000000000000#ifndef _INCLUDED_AGSINDEX_H #define _INCLUDED_AGSINDEX_H /** AGSIndex ... a class to create references for a gsdoc file Copyright (C) 2001 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: October 2001 This file is part of the GNUstep Project This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. You should have received a copy of the GNU General Public License along with this program; see the file COPYINGv3. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #import "Foundation/NSObject.h" #import "GNUstepBase/GSXML.h" @class NSDictionary; @class NSMutableArray; @class NSMutableDictionary; @class NSString; @interface AGSIndex : NSObject { NSMutableDictionary *refs; NSString *base; // Not retained NSString *unit; // Not retained NSString *classname; // Not retained NSString *category; // Not retained unsigned chap; unsigned sect; unsigned ssect; unsigned sssect; } - (NSString*) globalRef: (NSString*)ref type: (NSString*)type; - (void) makeRefs: (GSXMLNode*)node; - (void) mergeRefs: (NSDictionary*)more override: (BOOL)flag; - (void) addInformalProtocols: (NSArray *)protocolNames; - (NSArray*) methodsInUnit: (NSString*)aUnit; - (NSMutableDictionary*) refs; - (void) setDirectory: (NSString*)path; - (void) setGlobalRef: (NSString*)ref type: (NSString*)type; - (void) setOutputs: (NSArray*)a forHeader: (NSString*)h; - (void) setRelationship: (NSString*)r from: (NSString*)from to: (NSString*)to; - (void) setSources: (NSArray*)a forHeader: (NSString*)h; - (void) setUnitRef: (NSString*)ref type: (NSString*)type; - (NSMutableArray*) outputsForHeader: (NSString*)h; - (NSMutableArray*) sourcesForHeader: (NSString*)h; - (NSDictionary*) unitRef: (NSString*)ref type: (NSString*)type; - (NSString*) unitRef: (NSString*)ref type: (NSString*)type unit: (NSString**)u; @end #endif gnustep-base-1.29.0/Tools/AGSIndex.m000066400000000000000000000451371435650067400171040ustar00rootroot00000000000000/** AGSIndex ... a class to create references for a gsdoc file Copyright (C) 2001 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: October 2001 This file is part of the GNUstep Project This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. You should have received a copy of the GNU General Public License along with this program; see the file COPYINGv3. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #import "common.h" #import "Foundation/NSArray.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSDictionary.h" #import "AGSIndex.h" #import "GNUstepBase/NSString+GNUstepBase.h" #import "GNUstepBase/NSMutableString+GNUstepBase.h" static int XML_ELEMENT_NODE; static int XML_TEXT_NODE; static void mergeDictionaries(NSMutableDictionary *dst, NSDictionary *src, BOOL override) { static NSMutableArray *stack = nil; NSEnumerator *e = [src keyEnumerator]; NSString *k; id s; id d; if (stack == nil) { stack = [[NSMutableArray alloc] initWithCapacity: 8]; } while ((k = [e nextObject]) != nil) { if ([k isEqualToString: @"contents"] == YES) { continue; // Makes no sense to merge file contents. } s = [src objectForKey: k]; d = [dst objectForKey: k]; [stack addObject: k]; if (d == nil) { if ([s isKindOfClass: [NSString class]] == YES) { [dst setObject: s forKey: k]; } else if ([s isKindOfClass: [NSArray class]] == YES) { [dst setObject: s forKey: k]; } else if ([s isKindOfClass: [NSDictionary class]] == YES) { d = [[NSMutableDictionary alloc] initWithCapacity: [s count]]; [dst setObject: d forKey: k]; RELEASE(d); } else { NSLog(@"Unexpected class in merge %@ ignored", stack); d = nil; } } if (d != nil) { if ([d isKindOfClass: [NSString class]] == YES) { if ([s isKindOfClass: [NSString class]] == NO) { NSLog(@"Class mismatch in merge for %@.", stack); } else if ([d isEqual: s] == NO) { if (override == YES) { [dst setObject: s forKey: k]; } else { NSLog(@"String mismatch in merge for %@. S:%@, D:%@", stack, s, d); [dst setObject: s forKey: k]; } } } else if ([d isKindOfClass: [NSArray class]] == YES) { if ([s isKindOfClass: [NSArray class]] == NO) { NSLog(@"Class mismatch in merge for %@.", stack); } else if ([d isEqual: s] == NO) { if (override == YES) { [dst setObject: s forKey: k]; } else { NSLog(@"Array mismatch in merge for %@. S:%@, D:%@", stack, s, d); } } } else if ([d isKindOfClass: [NSDictionary class]] == YES) { if ([s isKindOfClass: [NSDictionary class]] == NO) { NSLog(@"Class mismatch in merge for %@.", stack); } else { mergeDictionaries(d, s, override); } } } [stack removeLastObject]; } } static void setDirectory(NSMutableDictionary *dict, NSString *path) { NSArray *a = [dict allKeys]; NSEnumerator *e = [a objectEnumerator]; NSString *k; while ((k = [e nextObject]) != nil) { id o = [dict objectForKey: k]; if ([o isKindOfClass: [NSString class]] == YES) { o = [path stringByAppendingPathComponent: [o lastPathComponent]]; [dict setObject: o forKey: k]; } else if ([o isKindOfClass: [NSDictionary class]] == YES) { setDirectory(o, path); } } } /** * This class is used to build and manipulate a dictionary of * cross-reference information.
    * The references are held in a nested dictionary * with strings at the leaves (persisted to 'projectName'.igsdoc) -
    * method : method-name - { class-name file-name }
    * method : method-name - { protocol-name file-name }
    * ivariable : variable-name - { class-name file-name }
    * class : class-name - file-name
    * category : category-name - file-name
    * protocol : protocol-name - file-name
    * function : function-name - file-name
    * type : type-name - file-name
    * constant : constant-name - file-name
    * variable : variable-name - file-name
    * entry : entry-name - { file-name ref }
    * label : label-name - { file-name ref }
    * contents : ref - text
    * super : class-name - superclass-name
    * categories : class-name - { category-name file-name }
    * unitmethods : unit-name - method-name
    * classvars : class-name - variables-name
    * title : file-name - text
    * source : file-name - array-of-source-files
    */ @implementation AGSIndex + (void) initialize { if (self == [AGSIndex class]) { /* * Cache XML node information. */ XML_ELEMENT_NODE = [GSXMLNode typeFromDescription: @"XML_ELEMENT_NODE"]; XML_TEXT_NODE = [GSXMLNode typeFromDescription: @"XML_TEXT_NODE"]; } } - (void) dealloc { RELEASE(refs); [super dealloc]; } - (NSString*) globalRef: (NSString*)ref type: (NSString*)type { NSDictionary *t; t = [refs objectForKey: type]; return [t objectForKey: ref]; } - (id) init { refs = [[NSMutableDictionary alloc] initWithCapacity: 8]; return self; } /** * Given the root node of a gsdoc document, we traverse the tree * looking for interesting nodes, and recording their names in a * dictionary of references. */ - (void) makeRefs: (GSXMLNode*)node { GSXMLNode *children = [node firstChild]; GSXMLNode *next = [node next]; BOOL newUnit = NO; if ([node type] == XML_ELEMENT_NODE) { NSString *name = [node name]; NSDictionary *prop = [node attributes]; // special case- if has an id of "_main" this gsdoc is from a tool // file; add an entry to the index to indicate so if (([name isEqual: @"chapter"] || [name isEqual: @"section"]) && [@"_main" isEqual: [prop objectForKey: @"id"]] == YES) { [self setGlobalRef: base type: @"tool"]; } if ([name isEqual: @"category"] == YES) { newUnit = YES; classname = [prop objectForKey: @"class"]; category = [prop objectForKey: @"name"]; unit = classname; /* * Add this category to the list of those for the class. */ [self setUnitRef: category type: @"categories"]; unit = [NSString stringWithFormat: @"%@(%@)", classname, category]; [self setGlobalRef: unit type: @"category"]; } else if ([name isEqual: @"chapter"] == YES) { chap++; sect = 0; ssect = 0; sssect = 0; } else if ([name isEqual: @"class"] == YES) { NSString *tmp; newUnit = YES; classname = [prop objectForKey: @"name"]; unit = classname; tmp = [prop objectForKey: @"super"]; if (tmp != nil) { [self setRelationship: @"super" from: unit to: tmp]; } [self setGlobalRef: unit type: @"class"]; } else if ([name isEqual: @"gsdoc"] == YES) { base = [prop objectForKey: @"base"]; if (base == nil) { NSLog(@"No 'base' document name supplied in gsdoc element"); return; } } else if ([name isEqual: @"heading"] == YES) { NSMutableDictionary *d; NSString *k; NSString *c; d = [refs objectForKey: @"contents"]; if (d == nil) { d = [[NSMutableDictionary alloc] initWithCapacity: 8]; [refs setObject: d forKey: @"contents"]; RELEASE(d); } k = [NSString stringWithFormat: @"%03u%03u%03u%03u", chap, sect, ssect, sssect]; c = [[children content] stringByTrimmingSpaces]; if (c == nil) c = @""; [d setObject: c forKey: k]; children = nil; } else if ([name isEqual: @"ivariable"] == YES) { NSString *tmp = [prop objectForKey: @"name"]; [self setUnitRef: tmp type: @"ivariable"]; [self setUnitRef: tmp type: @"classvars"]; } else if ([name isEqual: @"entry"] || [name isEqual: @"label"]) { NSMutableDictionary *all; NSString *text; NSString *val; text = [[children content] stringByTrimmingSpaces]; if (text == nil) text = @""; children = nil; all = [refs objectForKey: name]; if (all == nil) { all = [[NSMutableDictionary alloc] initWithCapacity: 8]; [refs setObject: all forKey: name]; RELEASE(all); } val = [prop objectForKey: @"id"]; if (val == nil) { val = text; } [all setObject: base forKey: val]; } else if ([name isEqual: @"method"] == YES) { NSString *sel = @""; GSXMLNode *tmp = children; sel = [prop objectForKey: @"factory"]; if (sel != nil && [sel boolValue] == YES) { sel = @"+"; } else { sel = @"-"; } children = nil; while (tmp != nil) { if ([tmp type] == XML_ELEMENT_NODE) { if ([[tmp name] isEqual: @"sel"] == YES) { GSXMLNode *t = [tmp firstChild]; while (t != nil) { if ([t type] == XML_TEXT_NODE) { NSString *s; s = [[t content] stringByTrimmingSpaces]; if (s == nil) s = @""; sel = [sel stringByAppendingString: s]; } t = [t next]; } } else if ([[tmp name] isEqual: @"vararg"] == YES) { sel = [sel stringByAppendingString: @",..."]; children = [tmp next]; break; } else if ([[tmp name] isEqual: @"arg"] == NO) { children = tmp; break; } } tmp = [tmp next]; } if ([sel length] > 1) { [self setUnitRef: sel type: @"method"]; [self setUnitRef: sel type: @"unitmethods"]; } } else if ([name isEqual: @"protocol"] == YES) { newUnit = YES; unit = [NSString stringWithFormat: @"(%@)", [prop objectForKey: @"name"]]; [self setGlobalRef: unit type: @"protocol"]; } else if ([name isEqual: @"constant"] == YES || [name isEqual: @"EOEntity"] == YES || [name isEqual: @"EOModel"] == YES || [name isEqual: @"function"] == YES || [name isEqual: @"macro"] == YES || [name isEqual: @"type"] == YES || [name isEqual: @"variable"] == YES) { NSString *tmp = [prop objectForKey: @"name"]; [self setGlobalRef: tmp type: name]; children = nil; } else if ([name isEqual: @"section"] == YES) { //FIXME- this info needs to be placed into the "label" refs somehow sect++; ssect = 0; sssect = 0; } else if ([name isEqual: @"subsect"] == YES) { ssect++; sssect = 0; } else if ([name isEqual: @"subsubsect"] == YES) { sssect++; } else if ([name isEqual: @"title"] == YES) { NSMutableDictionary *d; NSString *s; d = [refs objectForKey: @"title"]; if (d == nil) { d = [[NSMutableDictionary alloc] initWithCapacity: 8]; [refs setObject: d forKey: @"title"]; RELEASE(d); } s = [[children content] stringByTrimmingSpaces]; if (s == nil) s = @""; [d setObject: s forKey: base]; children = nil; } else { } } if (children != nil) { [self makeRefs: children]; } if (newUnit == YES) { unit = nil; category = nil; classname = nil; } if (next != nil) { [self makeRefs: next]; } } /** * Merge a dictionary containing references into the current * index. The flag may be used to specify that references * being merged in should override any pre-existing values. */ - (void) mergeRefs: (NSDictionary*)more override: (BOOL)flag { mergeDictionaries(refs, more, flag); } /** * Informal protocols are not explicitly marked in source, but are * inferred to be those categories of NSObject that receive no * implementation. [AGSOutput] finds and accumulates them; autogsdoc * passes them here, where each entry is found in the 'category' * section of our refs and copied over to the protocol section. */ - (void) addInformalProtocols: (NSArray *)protocolNames { NSString *name; NSString *file; NSEnumerator *pnames = [protocolNames objectEnumerator]; //PENDING, should we worry about not overriding entries? while ((name = [pnames nextObject]) != nil) { NSMutableDictionary *d; d = [refs objectForKey: @"category"]; file = [d objectForKey: name]; if (file != nil) { d = [refs objectForKey: @"protocol"]; [d setObject: file forKey: name]; } else { NSLog(@"Category entry not found for informal protocol '%@'", name); } } } - (NSArray*) methodsInUnit: (NSString*)aUnit { NSDictionary *d = [refs objectForKey: @"unitmethods"]; d = [d objectForKey: aUnit]; return [d allKeys]; } /** * Return a list of output files for the header */ - (NSMutableArray*) outputsForHeader: (NSString*)h { NSDictionary *dict = [refs objectForKey: @"output"]; NSArray *array = [dict objectForKey: h]; if (array == nil) { return [NSMutableArray arrayWithCapacity: 2]; } return AUTORELEASE([array mutableCopy]); } - (NSMutableDictionary*) refs { return refs; } - (void) setDirectory: (NSString*)path { if (path != nil) { ENTER_POOL setDirectory(refs, path); LEAVE_POOL } } - (void) setGlobalRef: (NSString*)ref type: (NSString*)type { NSMutableDictionary *t; NSString *old; t = [refs objectForKey: type]; if (t == nil) { t = [NSMutableDictionary new]; [refs setObject: t forKey: type]; RELEASE(t); } old = [t objectForKey: ref]; if (old != nil && [old isEqual: base] == NO) { NSLog(@"Warning ... %@ %@ appears in %@ and %@ ... using the latter", type, ref, old, base); } [t setObject: base forKey: ref]; } /** * Set up an array listing the output files for a particular header. */ - (void) setOutputs: (NSArray*)a forHeader: (NSString*)h { NSMutableDictionary *dict; dict = [refs objectForKey: @"output"]; if (dict == nil) { dict = [NSMutableDictionary new]; [refs setObject: dict forKey: @"output"]; RELEASE(dict); } [dict setObject: a forKey: h]; } - (void) setRelationship: (NSString*)r from: (NSString*)from to: (NSString*)to { NSMutableDictionary *dict; dict = [refs objectForKey: r]; if (dict == nil) { dict = [NSMutableDictionary new]; [refs setObject: dict forKey: r]; RELEASE(dict); } [dict setObject: to forKey: from]; } /** * Set up an array listing the source files for a particular header. */ - (void) setSources: (NSArray*)a forHeader: (NSString*)h { NSMutableDictionary *dict; dict = [refs objectForKey: @"source"]; if (dict == nil) { dict = [NSMutableDictionary new]; [refs setObject: dict forKey: @"source"]; RELEASE(dict); } [dict setObject: a forKey: h]; } /** * Set up a reference for something inside a unit (class, category or protocol) * We store 'method' and 'ivariable' by ref then unit (class), * but we store 'unitmethods' * and 'classvars' by unit then ref. */ - (void) setUnitRef: (NSString*)ref type: (NSString*)type { NSMutableDictionary *t; NSMutableDictionary *r; NSString *u = unit; NSString *old; if ([type isEqualToString: @"method"] || [type isEqualToString: @"ivariable"]) { // type ... ref ... unit ... file } else { u = ref; ref = unit; } t = [refs objectForKey: type]; if (t == nil) { t = [NSMutableDictionary new]; [refs setObject: t forKey: type]; RELEASE(t); } r = [t objectForKey: ref]; if (r == nil) { r = [NSMutableDictionary new]; [t setObject: r forKey: ref]; RELEASE(r); } old = [r objectForKey: u]; if (old != nil && [old isEqual: base] == NO) { NSLog(@"Warning ... %@ %@ %@ appears in %@ and %@ ... using the latter", type, ref, u, old, base); } [r setObject: base forKey: u]; } /** * Return a list of source files for the header. */ - (NSMutableArray*) sourcesForHeader: (NSString*)h { NSDictionary *dict = [refs objectForKey: @"source"]; NSArray *array = [dict objectForKey: h]; if (array == nil) { return [NSMutableArray arrayWithCapacity: 2]; } return AUTORELEASE([array mutableCopy]); } /** * Return a dictionary containing info on all the units containing the * specified method or instance variable. */ - (NSDictionary*) unitRef: (NSString*)ref type: (NSString*)type { NSDictionary *t; t = [refs objectForKey: type]; return [t objectForKey: ref]; } /** * Return the name of the file containing the ref and return * the unit name in which it was found. If not found, return nil for both. */ - (NSString*) unitRef: (NSString*)ref type: (NSString*)type unit: (NSString**)u { NSString *s; NSDictionary *t; /** * If ref does not occur in the index, this method returns nil. */ t = [self unitRef: ref type: type]; if (t == nil) { *u = nil; return nil; } if (*u == nil) { NSEnumerator *e; NSString *n; unsigned count = 0; /** * If the method was given no unit to look in, then it will succeed * and return a value if (and only if) the required reference is * defined only in one unit (excluding protocols). * In the case where it is in two units (one of them a protocol) * the class is taken in preference to the protocol. */ e = [t keyEnumerator]; while ((n = [e nextObject]) != nil) { *u = n; if ([n hasPrefix: @"("] == NO) { if (count++ > 0) { *u = nil; // More than one match break; } } } if (*u != nil) { return [t objectForKey: *u]; } return nil; } /** * If ref exists in the unit specified, the method will succeed and * return the name of the file in which the reference is located. */ s = [t objectForKey: *u]; if (s != nil) { return s; } /** * If the unit that the method has been asked to look in is a * protocol which is not found, the lookup must fail. */ if ([*u hasPrefix: @"("] == YES) { *u = nil; return nil; } /* * If unit is a category, method was probably indexed under the class, * so work with the class instead of the category. */ if ([*u length] > 0 && [*u characterAtIndex: [*u length] - 1] == ')') { *u = [*u substringToIndex: [*u rangeOfString: @"("].location]; s = [t objectForKey: *u]; if (s != nil) { return s; } } /** * Try all superclasses in turn. */ while (*u != nil) { *u = [self globalRef: *u type: @"super"]; if (*u != nil) { s = [t objectForKey: *u]; if (s != nil) { return s; } } } return nil; } @end gnustep-base-1.29.0/Tools/AGSOutput.h000066400000000000000000000045671435650067400173320ustar00rootroot00000000000000#ifndef _INCLUDED_AGSOUTPUT_H #define _INCLUDED_AGSOUTPUT_H /** AGSOutput ... a class to output gsdoc source Copyright (C) 2001 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: October 2001 This file is part of the GNUstep Project This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. You should have received a copy of the GNU General Public License along with this program; see the file COPYINGv3. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "Foundation/NSObject.h" @class NSArray; @class NSCharacterSet; @class NSDictionary; @class NSMutableArray; @interface AGSOutput : NSObject { NSDictionary *info; // Not retained. NSCharacterSet *identifier; // Legit char in identifier NSCharacterSet *identStart; // Legit initial char of identifier NSCharacterSet *spaces; // All blank characters NSCharacterSet *spacenl; // Blanks excluding newline NSArray *args; // Not retained. NSMutableArray *informalProtocols; // built up as discovered BOOL verbose; BOOL warn; } - (NSString*) checkComment: (NSString*)comment unit: (NSString*)unit info: (NSMutableDictionary*)d; - (unsigned) fitWords: (NSArray*)a from: (unsigned)start to: (unsigned)end maxSize: (unsigned)limit output: (NSMutableString*)buf; - (NSArray*) output: (NSMutableDictionary*)d; - (void) outputDecl: (NSMutableDictionary*)d kind: (NSString*)kind to: (NSMutableString*)str; - (void) outputFunction: (NSMutableDictionary*)d to: (NSMutableString*)str; - (void) outputInstanceVariable: (NSMutableDictionary*)d to: (NSMutableString*)str for: (NSString*)unit; - (void) outputMacro: (NSMutableDictionary*)d to: (NSMutableString*)str; - (void) outputMethod: (NSMutableDictionary*)d to: (NSMutableString*)str for: (NSString*)unit; - (void) outputUnit: (NSMutableDictionary*)d to: (NSMutableString*)str; - (unsigned) reformat: (NSString*)str withIndent: (unsigned)ind to: (NSMutableString*)buf; - (NSArray*) split: (NSString*)str; - (NSArray*) informalProtocols; @end #endif gnustep-base-1.29.0/Tools/AGSOutput.m000066400000000000000000001636651435650067400173440ustar00rootroot00000000000000/** AGSOutput ... a class to output gsdoc source Copyright (C) 2001 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: October 2001 This file is part of the GNUstep Project This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. You should have received a copy of the GNU General Public License along with this program; see the file COPYINGv3. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #import "common.h" #import "Foundation/NSArray.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSCharacterSet.h" #import "Foundation/NSData.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSFileManager.h" #import "Foundation/NSPathUtilities.h" #import "Foundation/NSUserDefaults.h" #import "AGSOutput.h" #import "GNUstepBase/NSString+GNUstepBase.h" #import "GNUstepBase/NSMutableString+GNUstepBase.h" @interface AGSOutput (Private) - (NSString*) mergeMarkup: (NSString*)markup ofKind: (NSString*)kind; @end static NSString *escapeType(NSString *str) { str = [str stringByReplacingString: @"<" withString: @"<"]; str = [str stringByReplacingString: @">" withString: @">"]; return str; } static BOOL snuggleEnd(NSString *t) { static NSCharacterSet *set = nil; if ([t hasPrefix: @" * The AGSOutput class *

    This is a really great class ... but it's not really reusable since it's * far too special purpose.

    * *

    Here is the afterword for the class.

    *

    And here is some automated cross referencing ... * A method in a protocol: [(NSCopying)-copyWithZone:], a class: * [NSString], a protocol: [(NSCopying)], and a * category: [NSRunLoop(GNUstepExtensions)]. *

    *
    * And finally, here is the actual class description ... outside the chapter. * This is the class description for AGSOutput, including some * sample uses of GSDoc, such as cross-references (see [NSString]). * Functions, like escapeType(), are automatically referenced (if they are * found). */ @implementation AGSOutput - (void) appendVersions: (NSString*)versions to: (NSMutableString*)str { if ([versions length] > 0) { [str appendString: versions]; } } - (NSString*) checkComment: (NSString*)comment unit: (NSString*)unit info: (NSMutableDictionary*)d { NSString *empty = [d objectForKey: @"Empty"]; BOOL hadComment = ([comment length] == 0 ? NO : YES); if (hadComment == NO) { comment = @"Description forthcoming."; if (warn == YES) { NSString *name = [d objectForKey: @"Name"]; NSString *type = [d objectForKey: @"Type"]; if (unit == nil) { if (type == nil) { NSLog(@"Warning - No comments for %@", name); } else { NSLog(@"Warning - No comments for %@ %@", type, name); } } else { if ([d objectForKey: @"ReturnType"] != nil) { NSLog(@"Warning - No comments for [%@ %@]", unit, name); } else { NSLog(@"Warning - No comments for instance variable %@ in %@", name, unit); } } } } if (empty != nil && [empty boolValue] == YES) { #if 0 static NSString *today = nil; if (today == nil) { NSCalendarDate *d = [NSCalendarDate date]; today = RETAIN([d descriptionWithCalendarFormat: @"%d-%m-%Y"]); } if (hadComment == NO) { comment = @""; } comment = [NSString stringWithFormat: @"Not implemented (as of %@).
    " @"Please help us by producing an implementation of this " @"and donating it to the GNUstep project.
    " @"You can check the task manager at " @"https://savannah.gnu.org/projects/gnustep " @"to see if anyone is already working on it.
    ", today, comment]; #else NSString *name = [d objectForKey: @"Name"]; NSLog(@"Warning - No implementation for [%@ %@]", unit, name); #endif } return comment; } - (void) dealloc { DESTROY(identifier); DESTROY(identStart); DESTROY(spaces); DESTROY(spacenl); DESTROY(informalProtocols); [super dealloc]; } - (unsigned) fitWords: (NSArray*)a from: (unsigned)start to: (unsigned)end maxSize: (unsigned)limit output: (NSMutableString*)buf { unsigned size = 0; unsigned nest = 0; unsigned i; int lastOk = -1; BOOL addSpace = NO; for (i = start; size < limit && i < end; i++) { NSString *t = [a objectAtIndex: i]; BOOL forceNewline = [t hasPrefix: @"

    "]; BOOL elementEndReached = (nest == 0 && [t hasPrefix: @""] == YES) { addSpace = YES; } else { nest++; addSpace = NO; } } else { if (snuggleStart(t) == NO) { addSpace = YES; } else { addSpace = NO; } } /* * Record whether the word we just checked was at nesting level 0 * and had not exceeded the line length limit. */ if (nest == 0 && size <= limit) { lastOk = i; } } return lastOk + 1; } - (id) init { NSMutableCharacterSet *m; m = [[NSCharacterSet controlCharacterSet] mutableCopy]; [m addCharactersInString: @" "]; spacenl = [m copy]; [m removeCharactersInString: @"\n"]; spaces = [m copy]; RELEASE(m); identifier = RETAIN([NSCharacterSet characterSetWithCharactersInString: @"_0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"]); identStart = RETAIN([NSCharacterSet characterSetWithCharactersInString: @"_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"]); informalProtocols = [NSMutableArray new]; verbose = [[NSUserDefaults standardUserDefaults] boolForKey: @"Verbose"]; warn = [[NSUserDefaults standardUserDefaults] boolForKey: @"Warn"]; return self; } /** * Return an array containing the names of any files modified as * a result of outputing the specified data structure. */ - (NSArray*) output: (NSMutableDictionary*)d { NSMutableString *str = [NSMutableString stringWithCapacity: 10240]; NSDictionary *classes; NSDictionary *categories; NSDictionary *protocols; NSDictionary *functions; NSDictionary *types; NSDictionary *variables; NSDictionary *constants; NSDictionary *macros; NSMutableArray *files; NSArray *authors; NSString *base; NSString *tmp; NSString *file; NSString *dest; unsigned chapters = 0; files = [NSMutableArray arrayWithCapacity: 5]; info = d; base = [info objectForKey: @"base"]; file = base; if ([[file pathExtension] isEqualToString: @"gsdoc"] == NO) { file = [file stringByAppendingPathExtension: @"gsdoc"]; } dest = [info objectForKey: @"directory"]; if ([dest length] > 0 && [file isAbsolutePath] == NO) { file = [dest stringByAppendingPathComponent: file]; } classes = [info objectForKey: @"Classes"]; categories = [info objectForKey: @"Categories"]; protocols = [info objectForKey: @"Protocols"]; functions = [info objectForKey: @"Functions"]; types = [info objectForKey: @"Types"]; variables = [info objectForKey: @"Variables"]; constants = [info objectForKey: @"Constants"]; macros = [info objectForKey: @"Macros"]; [str appendString: @"\n"]; [str appendString: @"\n"]; [str appendFormat: @"\n"]; [str appendString: @" \n"]; /* * A title is mandatory in the head element ... obtain it * from the info dictionary. Guess at a title if necessary. */ tmp = [info objectForKey: @"title"]; if (tmp != nil) { [self reformat: tmp withIndent: 4 to: str]; } else { [str appendString: @" "]; if ([classes count] == 1) { [str appendString: [[classes allKeys] lastObject]]; [str appendString: @" class documentation"]; } else { [str appendFormat: @"%@ documentation", [info objectForKey: @"base"]]; } [str appendString: @"\n"]; } /* * The author element is compulsory ... fill in. */ authors = [info objectForKey: @"authors"]; if (authors == nil) { tmp = [NSString stringWithFormat: @"Generated by %@", NSUserName()]; [str appendString: @" \n"]; } else { unsigned i; for (i = 0; i < [authors count]; i++) { NSString *author = [authors objectAtIndex: i]; [self reformat: author withIndent: 4 to: str]; } } /* * The version element is optional ... fill in if available. */ tmp = [info objectForKey: @"version"]; if (tmp != nil) { [self reformat: tmp withIndent: 4 to: str]; } /* * The date element is optional ... fill in if available. */ tmp = [info objectForKey: @"date"]; if (tmp != nil) { [self reformat: tmp withIndent: 4 to: str]; } /* * The abstract element is optional ... fill in if available. */ tmp = [info objectForKey: @"abstract"]; if (tmp != nil) { [self reformat: tmp withIndent: 4 to: str]; } /* * The copy element is optional ... fill in if available. */ tmp = [info objectForKey: @"copy"]; if (tmp != nil) { [self reformat: tmp withIndent: 4 to: str]; } [str appendString: @" \n"]; [str appendString: @" \n"]; // Output document forward if available. tmp = [info objectForKey: @"front"]; if (tmp == nil) { [self reformat: @"" withIndent: 4 to: str]; } else { [self reformat: tmp withIndent: 4 to: str]; } // Output document main chapter if available tmp = [info objectForKey: @"chapter"]; if (tmp != nil) { [self reformat: tmp withIndent: 4 to: str]; chapters++; } if ([classes count] > 0) { NSArray *names; unsigned i; unsigned c = [classes count]; chapters += c; names = [classes allKeys]; names = [names sortedArrayUsingSelector: @selector(compare:)]; for (i = 0; i < c; i++) { NSString *name = [names objectAtIndex: i]; NSMutableDictionary *d = [classes objectForKey: name]; [self outputUnit: d to: str]; } } if ([categories count] > 0) { NSArray *names; unsigned i; unsigned c = [categories count]; chapters += c; names = [categories allKeys]; names = [names sortedArrayUsingSelector: @selector(compare:)]; for (i = 0; i < c; i++) { NSString *name = [names objectAtIndex: i]; NSMutableDictionary *d = [categories objectForKey: name]; [self outputUnit: d to: str]; } } if ([protocols count] > 0) { NSArray *names; unsigned i; unsigned c = [protocols count]; chapters += c; names = [protocols allKeys]; names = [names sortedArrayUsingSelector: @selector(compare:)]; for (i = 0; i < c; i++) { NSString *name = [names objectAtIndex: i]; NSMutableDictionary *d = [protocols objectForKey: name]; [self outputUnit: d to: str]; } } if ([types count] > 0) { NSMutableString *m = [NSMutableString new]; NSArray *names; unsigned i; unsigned c = [types count]; [m appendString: @" \n"]; [m appendFormat: @" %@ types\n", base]; [m appendString: @"

    \n"]; names = [types allKeys]; names = [names sortedArrayUsingSelector: @selector(compare:)]; for (i = 0; i < c; i++) { NSString *name = [names objectAtIndex: i]; NSMutableDictionary *d = [types objectForKey: name]; [self outputDecl: d kind: @"type" to: m]; } [m appendString: @" \n"]; tmp = [self mergeMarkup: m ofKind: @"Typedefs"]; if (tmp == nil) { [str appendString: m]; chapters++; } else { [files addObject: tmp]; } RELEASE(m); } if ([constants count] > 0) { NSMutableString *m = [NSMutableString new]; NSArray *names; unsigned i; unsigned c = [constants count]; [m appendString: @" \n"]; [m appendFormat: @" %@ constants\n", base]; [m appendString: @"

    \n"]; names = [constants allKeys]; names = [names sortedArrayUsingSelector: @selector(compare:)]; for (i = 0; i < c; i++) { NSString *name = [names objectAtIndex: i]; NSMutableDictionary *d = [constants objectForKey: name]; [self outputDecl: d kind: @"constant" to: m]; } [m appendString: @"
    \n"]; tmp = [self mergeMarkup: m ofKind: @"Constants"]; if (tmp == nil) { [str appendString: m]; chapters++; } else { [files addObject: tmp]; } RELEASE(m); } if ([macros count] > 0) { NSMutableString *m = [NSMutableString new]; NSArray *names; unsigned i; unsigned c = [macros count]; [m appendString: @" \n"]; [m appendFormat: @" %@ macros\n", base]; [m appendString: @"

    \n"]; names = [macros allKeys]; names = [names sortedArrayUsingSelector: @selector(compare:)]; for (i = 0; i < c; i++) { NSString *name = [names objectAtIndex: i]; NSMutableDictionary *d = [macros objectForKey: name]; [self outputMacro: d to: m]; } [m appendString: @"
    \n"]; tmp = [self mergeMarkup: m ofKind: @"Macros"]; if (tmp == nil) { [str appendString: m]; chapters++; } else { [files addObject: tmp]; } RELEASE(m); } if ([variables count] > 0) { NSMutableString *m = [NSMutableString new]; NSArray *names; unsigned i; unsigned c = [variables count]; [m appendString: @" \n"]; [m appendFormat: @" %@ variables\n", base]; [m appendString: @"

    \n"]; names = [variables allKeys]; names = [names sortedArrayUsingSelector: @selector(compare:)]; for (i = 0; i < c; i++) { NSString *name = [names objectAtIndex: i]; NSMutableDictionary *d = [variables objectForKey: name]; [self outputDecl: d kind: @"variable" to: m]; } [m appendString: @"
    \n"]; tmp = [self mergeMarkup: m ofKind: @"Variables"]; if (tmp == nil) { [str appendString: m]; chapters++; } else { [files addObject: tmp]; } RELEASE(m); } if ([functions count] > 0) { NSMutableString *m = [NSMutableString new]; NSArray *names; unsigned i; unsigned c = [functions count]; [m appendString: @" \n"]; [m appendFormat: @" %@ functions\n", base]; [m appendString: @"

    \n"]; names = [functions allKeys]; names = [names sortedArrayUsingSelector: @selector(compare:)]; for (i = 0; i < c; i++) { NSString *name = [names objectAtIndex: i]; NSMutableDictionary *d = [functions objectForKey: name]; [self outputFunction: d to: m]; } [m appendString: @"
    \n"]; tmp = [self mergeMarkup: m ofKind: @"Functions"]; if (tmp == nil) { [str appendString: m]; chapters++; } else { [files addObject: tmp]; } RELEASE(m); } if (chapters > 0) { NSData *d; // Output document appendix if available. tmp = [info objectForKey: @"back"]; if (tmp != nil) { [self reformat: tmp withIndent: 4 to: str]; } [str appendString: @" \n"]; [str appendString: @"\n"]; d = [str dataUsingEncoding: NSUTF8StringEncoding]; if ([d writeToFile: file atomically: YES] == YES) { [files addObject: file]; } else { files = nil; } } return files; } /** * Uses -split: and -reformat:withIndent:to:. */ - (void) outputDecl: (NSMutableDictionary*)d kind: (NSString*)kind to: (NSMutableString*)str { NSString *pref = [d objectForKey: @"Prefix"]; NSString *type = [d objectForKey: @"BaseType"]; NSString *name = [d objectForKey: @"Name"]; NSString *comment = [d objectForKey: @"Comment"]; NSString *declared = [d objectForKey: @"Declared"]; if (warn == YES && [[d objectForKey: @"Implemented"] isEqual: @"YES"] == NO) { NSLog(@"Warning ... %@ %@ is not implemented where expected", kind, name); } [str appendFormat: @" <%@ type=\"", kind]; [str appendString: escapeType(type)]; if ([pref length] > 0) { [str appendString: pref]; } [str appendString: @"\" name=\""]; [str appendString: name]; [str appendString: @"\""]; [self appendVersions: [d objectForKey: @"Versions"] to: str]; [str appendString: @">\n"]; if (declared != nil) { [str appendString: @" "]; [str appendString: declared]; [str appendString: @"\n"]; } [str appendString: @" \n"]; comment = [self checkComment: comment unit: nil info: d]; [self reformat: comment withIndent: 10 to: str]; [str appendString: @" \n"]; [str appendFormat: @" \n", kind]; } /** * Uses -split: and -reformat:withIndent:to:. */ - (void) outputFunction: (NSMutableDictionary*)d to: (NSMutableString*)str { NSArray *aa = [d objectForKey: @"Args"]; NSString *pref = [d objectForKey: @"Prefix"]; NSString *type = [d objectForKey: @"BaseType"]; NSString *name = [d objectForKey: @"Name"]; NSString *comment = [d objectForKey: @"Comment"]; NSString *declared = [d objectForKey: @"Declared"]; unsigned i = [aa count]; if (warn == YES && [[d objectForKey: @"Implemented"] isEqual: @"YES"] == NO) { NSLog(@"Warning ... function %@ is not implemented where expected", name); } /** * Place the names of function arguments in a temporary array 'args' * so that they will be highlighted if they appear in the function * description. */ if (i > 0) { NSMutableArray *tmp = [NSMutableArray arrayWithCapacity: i]; while (i-- > 0) { NSString *n; NSDictionary *d; d = [aa objectAtIndex: i]; n = [d objectForKey: @"Name"]; if (n != nil) { [tmp addObject: n]; } } if ([tmp count] > 0) { args = tmp; } } [str appendString: @" 0) { [str appendString: pref]; } [str appendString: @"\" name=\""]; [str appendString: name]; [str appendString: @"\""]; [self appendVersions: [d objectForKey: @"Versions"] to: str]; [str appendString: @">\n"]; for (i = 0; i < [aa count]; i++) { NSDictionary *a = [aa objectAtIndex: i]; NSString *s = [a objectForKey: @"BaseType"]; [str appendString: @" "]; [str appendString: [a objectForKey: @"Name"]]; [str appendString: @"\n"]; } if ([[d objectForKey: @"VarArgs"] boolValue] == YES) { [str appendString: @" \n"]; } if (declared != nil) { [str appendString: @" "]; [str appendString: declared]; [str appendString: @"\n"]; } [str appendString: @" \n"]; comment = [self checkComment: comment unit: nil info: d]; [self reformat: comment withIndent: 10 to: str]; [str appendString: @" \n"]; [str appendString: @" \n"]; args = nil; } /** * Output the gsdoc code for an instance variable. */ - (void) outputInstanceVariable: (NSMutableDictionary*)d to: (NSMutableString*)str for: (NSString*)unit { NSString *pref = [d objectForKey: @"Prefix"]; NSString *type = [d objectForKey: @"BaseType"]; NSString *validity = [d objectForKey: @"Validity"]; NSString *name = [d objectForKey: @"Name"]; NSString *comment = [d objectForKey: @"Comment"]; [str appendString: @" 0) { [str appendString: pref]; } [str appendString: @"\" name=\""]; [str appendString: name]; if (validity != nil) { [str appendString: @"\" validity=\""]; [str appendString: validity]; } [str appendString: @"\""]; [self appendVersions: [d objectForKey: @"Versions"] to: str]; [str appendString: @">\n"]; [str appendString: @" \n"]; comment = [self checkComment: comment unit: unit info: d]; [self reformat: comment withIndent: 12 to: str]; [str appendString: @" \n"]; [str appendString: @" \n"]; } /** * Uses -split: and -reformat:withIndent:to:. */ - (void) outputMacro: (NSMutableDictionary*)d to: (NSMutableString*)str { NSString *name = [d objectForKey: @"Name"]; NSString *comment = [d objectForKey: @"Comment"]; NSString *declared = [d objectForKey: @"Declared"]; unsigned i; [str appendString: @" \n"]; /* * Storing the argument names array in the 'args' ivar ensures that * when we output comments, the argument names are highlighted. */ args = [d objectForKey: @"Args"]; for (i = 0; i < [args count]; i++) { NSString *s = [args objectAtIndex: i]; [str appendString: @" "]; [str appendString: s]; [str appendString: @"\n"]; } if ([[d objectForKey: @"VarArgs"] boolValue] == YES) { [str appendString: @" \n"]; } if (declared != nil) { [str appendString: @" "]; [str appendString: declared]; [str appendString: @"\n"]; } [str appendString: @" \n"]; comment = [self checkComment: comment unit: nil info: d]; [self reformat: comment withIndent: 10 to: str]; [str appendString: @" \n"]; [str appendString: @" \n"]; args = nil; } /** * Uses -split: and -reformat:withIndent:to:. * Also has fun with YES, NO, and nil. */ - (void) outputMethod: (NSMutableDictionary*)d to: (NSMutableString*)str for: (NSString*)unit { NSArray *sels = [d objectForKey: @"Sels"]; NSArray *types = [d objectForKey: @"Types"]; NSString *name = [d objectForKey: @"Name"]; NSString *comment; unsigned i; BOOL isInitialiser = NO; NSString *override = nil; if (warn == YES && unit != nil && [[d objectForKey: @"Implemented"] isEqual: @"YES"] == NO) { NSLog(@"Warning ... method %@ %@ is not implemented where expected", unit, name); } args = [d objectForKey: @"Args"]; // Used when splitting. comment = [d objectForKey: @"Comment"]; /** * Check special markup which should be removed from the text * actually placed in the gsdoc method documentation ... the * special markup is included in the gsdoc markup differently. */ if (comment != nil) { NSMutableString *m = nil; NSRange r; do { r = [comment rangeOfString: @""]; if (r.length == 0) r = [comment rangeOfString: @""]; if (r.length == 0) r = [comment rangeOfString: @""]; if (r.length > 0) { if (m == nil) { m = [comment mutableCopy]; } [m deleteCharactersInRange: r]; comment = m; isInitialiser = YES; } } while (r.length > 0); do { r = [comment rangeOfString: @""]; if (r.length == 0) r = [comment rangeOfString: @""]; if (r.length == 0) r = [comment rangeOfString: @""]; if (r.length > 0) { if (m == nil) { m = [comment mutableCopy]; } [m deleteCharactersInRange: r]; comment = m; override = @"subclass"; /* * If a method should be overridden by subclasses, * we don't treat it as unimplemented. */ [d setObject: @"NO" forKey: @"Empty"]; } } while (r.length > 0); do { r = [comment rangeOfString: @""]; if (r.length == 0) r = [comment rangeOfString: @""]; if (r.length == 0) r = [comment rangeOfString: @""]; if (r.length > 0) { if (m == nil) { m = [comment mutableCopy]; } [m deleteCharactersInRange: r]; comment = m; override = @"dummy"; /* * If a method should be overridden by subclasses, * we don't treat it as unimplemented. */ [d setObject: @"NO" forKey: @"Empty"]; } } while (r.length > 0); do { r = [comment rangeOfString: @""]; if (r.length == 0) r = [comment rangeOfString: @""]; if (r.length == 0) r = [comment rangeOfString: @""]; if (r.length > 0) { if (m == nil) { m = [comment mutableCopy]; } [m deleteCharactersInRange: r]; comment = m; override = @"never"; } } while (r.length > 0); if (m != nil) { IF_NO_ARC([m autorelease];) } } [str appendString: @" \n"]; for (i = 0; i < [sels count]; i++) { [str appendString: @" "]; [str appendString: [sels objectAtIndex: i]]; [str appendString: @"\n"]; if (i < [args count]) { [str appendString: @" "]; [str appendString: [args objectAtIndex: i]]; [str appendString: @"\n"]; } } if ([[d objectForKey: @"VarArgs"] boolValue] == YES) { [str appendString: @" \n"]; } [str appendString: @" \n"]; comment = [self checkComment: comment unit: unit info: d]; [self reformat: comment withIndent: 12 to: str]; [str appendString: @" \n"]; [str appendString: @" \n"]; args = nil; } - (void) outputUnit: (NSMutableDictionary*)d to: (NSMutableString*)str { NSString *name = [d objectForKey: @"Name"]; NSString *type = [d objectForKey: @"Type"]; NSString *kind = type; NSMutableDictionary *methods = [d objectForKey: @"Methods"]; NSMutableDictionary *ivars = [d objectForKey: @"InstanceVariables"]; NSString *comment = [d objectForKey: @"Comment"]; NSString *unitName = nil; NSArray *names; NSArray *protocols; NSString *tmp; NSString *unit = nil; NSRange r; unsigned ind; unsigned i; unsigned j; if ([[d objectForKey: @"Implemented"] isEqual: @"YES"] == NO) { if ([name hasPrefix: @"NSObject("] == YES) { NSEnumerator *e = [methods objectEnumerator]; NSMutableDictionary *m; /* * Assume an unimplemented category of NSObject is an * informal protocol, and stop warnings being issued * about unimplemented methods. */ unitName = name; kind = @"informal protocol"; while ((m = [e nextObject]) != nil) { [m setObject: @"YES" forKey: @"Implemented"]; } [informalProtocols addObject: name]; } else if (warn == YES) { NSLog(@"Warning ... unit %@ is not implemented where expected", name); } } else { unitName = name; } /* * Make sure we have a 'unit' part and a class 'desc' part (comment) * to be output. */ if (comment != nil) { r = [comment rangeOfString: @""]; if (r.length > 0) { unsigned pos = r.location; r = [comment rangeOfString: @""]; if (r.length == 0 || r.location < pos) { NSLog(@"Unterminated in comment for %@", name); return; } if (pos == 0) { if (NSMaxRange(r) == [comment length]) { unit = comment; comment = nil; } else { unit = [comment substringToIndex: NSMaxRange(r)]; comment = [comment substringFromIndex: NSMaxRange(r)]; } } else { if (NSMaxRange(r) == [comment length]) { unit = [comment substringFromIndex: pos]; comment = [comment substringToIndex: pos]; } else { unsigned end = NSMaxRange(r); r = NSMakeRange(pos, end-pos); unit = [comment substringWithRange: r]; comment = [[comment substringToIndex: pos] stringByAppendingString: [comment substringFromIndex: end]]; } } unit = [unit stringByReplacingString: @"unit>" withString: @"chapter>"]; } } if (unit == nil) { unit = [NSString stringWithFormat: @" \n Software documentation " @"for the %@ %@\n \n", name, kind]; } /* * Get the range of the location in the chapter where the class * details should get substituted in. If there is nowhere marked, * create a zero length range just before the end of the chapter. */ r = [unit rangeOfString: @""]; if (r.length == 0) { r = [unit rangeOfString: @""]; } if (r.length == 0) { r = [unit rangeOfString: @""]; r.length = 0; } /* * Output first part of chapter and note indentation. */ ind = [self reformat: [unit substringToIndex: r.location] withIndent: 4 to: str]; for (j = 0; j < ind; j++) [str appendString: @" "]; [str appendString: @"<"]; [str appendString: type]; [str appendString: @" name=\""]; if ([type isEqual: @"category"] == YES) { [str appendString: [d objectForKey: @"Category"]]; } else { [str appendString: name]; } tmp = [d objectForKey: @"BaseClass"]; if (tmp != nil) { if ([type isEqual: @"class"] == YES) { [str appendString: @"\" super=\""]; } else if ([type isEqual: @"category"] == YES) { [str appendString: @"\" class=\""]; } [str appendString: tmp]; } [str appendString: @"\""]; [self appendVersions: [d objectForKey: @"Versions"] to: str]; [str appendString: @">\n"]; ind += 2; for (j = 0; j < ind; j++) [str appendString: @" "]; [str appendString: @""]; [str appendString: [d objectForKey: @"Declared"]]; [str appendString: @"\n"]; protocols = [d objectForKey: @"Protocols"]; if ([protocols count] > 0) { for (i = 0; i < [protocols count]; i++) { for (j = 0; j < ind; j++) [str appendString: @" "]; [str appendString: @""]; [str appendString: [protocols objectAtIndex: i]]; [str appendString: @"\n"]; } } for (j = 0; j < ind; j++) [str appendString: @" "]; [str appendString: @"\n"]; comment = [self checkComment: comment unit: nil info: d]; [self reformat: comment withIndent: ind + 2 to: str]; for (j = 0; j < ind; j++) [str appendString: @" "]; [str appendString: @"\n"]; names = [[ivars allKeys] sortedArrayUsingSelector: @selector(compare:)]; for (i = 0; i < [names count]; i++) { NSString *vName = [names objectAtIndex: i]; [self outputInstanceVariable: [ivars objectForKey: vName] to: str for: unitName]; } names = [[methods allKeys] sortedArrayUsingSelector: @selector(compare:)]; for (i = 0; i < [names count]; i++) { NSString *mName = [names objectAtIndex: i]; [self outputMethod: [methods objectForKey: mName] to: str for: unitName]; } ind -= 2; for (j = 0; j < ind; j++) [str appendString: @" "]; [str appendString: @"\n"]; /* * Output tail end of chapter. */ [self reformat: [unit substringFromIndex: NSMaxRange(r)] withIndent: ind to: str]; } - (unsigned) reformat: (NSString*)str withIndent: (unsigned)ind to: (NSMutableString*)buf { ENTER_POOL unsigned l = [str length]; NSRange r = [str rangeOfString: @"...
    sequences and output them literally. * All other text has reformatting applied as necessary. */ while (r.length > 0) { NSString *tmp; if (r.location > i) { /* * There was some text before the example - call this method * recursively to format and output it. */ tmp = [str substringWithRange: NSMakeRange(i, r.location - i)]; [self reformat: tmp withIndent: ind to: buf]; i = r.location; } /* * Now find the end of the example, and output the whole example * literally as it appeared in the comment. */ r = [str rangeOfString: @"" options: NSLiteralSearch range: NSMakeRange(i, l - i)]; if (r.length == 0) { NSLog(@"unterminated "); return ind; } tmp = [str substringWithRange: NSMakeRange(i, NSMaxRange(r) - i)]; [buf appendString: tmp]; [buf appendString: @"\n"]; /* * Set up the start location and search for another example so * we will loop round again if necessary. */ i = NSMaxRange(r); r = [str rangeOfString: @" 0) { str = [str substringWithRange: NSMakeRange(i, l - i)]; } /* * Split the string up into parts separated by newlines. */ a = [self split: str]; for (i = 0; i < [a count]; i++) { unsigned int j; str = [a objectAtIndex: i]; if ([str hasPrefix: @" 2) { /* * decrement indentation after the end of an element. */ ind -= 2; } for (j = 0; j < ind; j++) { [buf appendString: @" "]; } [buf appendString: str]; [buf appendString: @"\n"]; } else { unsigned size = 70 - ind - [str length]; unsigned end; for (j = 0; j < ind; j++) { [buf appendString: @" "]; } end = [self fitWords: a from: i to: [a count] maxSize: size output: nil]; if (end <= i) { [buf appendString: str]; if ([str hasPrefix: @"<"] == YES && [str hasSuffix: @" />"] == NO) { ind += 2; } } else { [self fitWords: a from: i to: end maxSize: size output: buf]; i = end - 1; } [buf appendString: @"\n"]; } } LEAVE_POOL return ind; } /** * Split comment text into an array of words (to be reformatted) and * insert markup for cross referencing and highlighting. */ - (NSArray*) split: (NSString*)str { NSMutableArray *a = [NSMutableArray arrayWithCapacity: 128]; unsigned l = [str length]; NSMutableData *data; unichar *ptr; unichar *end; unichar *buf; /** * Phase 1 ... we take the supplied string and check for white space. * Any white space sequence is deleted and treated as a word separator * except within xml element markup. The format of element start and * end marks is tidied for consistency. The resulting data is made * into an array of strings, each containing either an element start * or end tag, or one of the whitespace separated words. * What about str? */ data = [[NSMutableData alloc] initWithLength: l * sizeof(unichar)]; ptr = buf = [data mutableBytes]; [str getCharacters: buf]; end = buf + l; while (ptr < end) { if ([spacenl characterIsMember: *ptr] == YES) { if (ptr != buf) { NSString *tmp; tmp = [NSString stringWithCharacters: buf length: ptr - buf]; [a addObject: tmp]; buf = ptr; } ptr++; buf++; } else if (*ptr == '<') { BOOL elideSpace = YES; unichar *optr = ptr; if (ptr != buf) { NSString *tmp; tmp = [NSString stringWithCharacters: buf length: ptr - buf]; [a addObject: tmp]; buf = ptr; } while (ptr < end && *ptr != '>') { /* * We convert whitespace sequences inside element markup * to single space characters unless protected by quotes. */ if ([spacenl characterIsMember: *ptr] == YES) { if (elideSpace == NO) { *optr++ = ' '; elideSpace = YES; } ptr++; } else if (*ptr == '"') { while (ptr < end && *ptr != '"') { *optr++ = *ptr++; } if (ptr < end) { *optr++ = *ptr++; } elideSpace = NO; } else { /* * We want param=value sequences to be standardised to * not have spaces around the equals sign. */ if (*ptr == '=') { elideSpace = YES; if (optr[-1] == ' ') { optr--; } } else { elideSpace = NO; } *optr++ = *ptr++; } } if (*ptr == '>') { /* * remove space immediately before closing bracket. */ if (optr[-1] == ' ') { optr--; } *optr++ = *ptr++; } if (optr != buf) { NSString *tmp; /* * Ensure that elements with no content ('/>' endings) * are standardised to have a space before their terminators. */ if (optr[-2] == '/' && optr[-3] != ' ') { unsigned len = optr - buf; unichar c[len + 1]; memcpy(c, buf, (len+1)*sizeof(unichar)); c[len-2] = ' '; c[len-1] = '/'; c[len] = '>'; tmp = [NSString stringWithCharacters: c length: len+1]; } else { tmp = [NSString stringWithCharacters: buf length: optr - buf]; } [a addObject: tmp]; } buf = ptr; } else { ptr++; } } if (ptr != buf) { NSString *tmp; tmp = [NSString stringWithCharacters: buf length: ptr - buf]; [a addObject: tmp]; } /* * Phase 2 ... the array of words is checked to see if a word contains * a well known constant, or a method or function name specification. * Where these special cases apply, the array of words is modified to * insert extra gsdoc markup to highlight the constants and to create * references to where the named methods or functions are documented. */ for (l = 0; l < [a count]; l++) { static NSArray *constants = nil; static NSArray *types = nil; unsigned count; NSString *tmp = [a objectAtIndex: l]; unsigned pos; NSRange r; if (constants == nil) { constants = [[NSArray alloc] initWithObjects: @"YES", @"NO", @"nil", nil]; } if (types == nil) { types = [[NSArray alloc] initWithObjects: @"Class", @"SEL", @"char", @"double", @"float", @"id", @"int", @"long", @"short", @"signed", @"unichar", @"unsigned", @"void", nil]; } if (l == 0 || [[a objectAtIndex: l-1] isEqual: @""] == NO) { /* * Ensure that well known constants are rendered as 'code' */ count = [constants count]; for (pos = 0; pos < count; pos++) { NSString *c = [constants objectAtIndex: pos]; r = [tmp rangeOfString: c]; if (r.length > 0) { NSString *start; NSString *end; if (r.location > 0) { start = [tmp substringToIndex: r.location]; } else { start = nil; } if (NSMaxRange(r) < [tmp length]) { end = [tmp substringFromIndex: NSMaxRange(r)]; } else { end = nil; } if ((start == nil || snuggleStart(start) == YES) && (end == nil || snuggleEnd(end) == YES)) { NSString *sub; if (start != nil || end != nil) { sub = [tmp substringWithRange: r]; } else { sub = nil; } if (start != nil) { [a insertObject: start atIndex: l++]; } [a insertObject: @"" atIndex: l++]; if (sub != nil) { [a replaceObjectAtIndex: l withObject: sub]; } l++; [a insertObject: @"" atIndex: l]; if (end != nil) { [a insertObject: end atIndex: ++l]; } } } } } if (l == 0 || [[a objectAtIndex: l-1] isEqual: @""] == NO) { /* * Ensure that well known types are rendered as 'strong' */ count = [types count]; for (pos = 0; pos < count; pos++) { NSString *t = [types objectAtIndex: pos]; r = [tmp rangeOfString: t]; if (r.length > 0) { NSString *start; NSString *end; if (r.location > 0) { start = [tmp substringToIndex: r.location]; } else { start = nil; } if (NSMaxRange(r) < [tmp length]) { end = [tmp substringFromIndex: NSMaxRange(r)]; } else { end = nil; } if ((start == nil || snuggleStart(start) == YES) && (end == nil || snuggleEnd(end) == YES)) { NSString *sub; if (start != nil || end != nil) { sub = [tmp substringWithRange: r]; } else { sub = nil; } if (start != nil) { [a insertObject: start atIndex: l++]; } [a insertObject: @"" atIndex: l++]; if (sub != nil) { [a replaceObjectAtIndex: l withObject: sub]; } l++; [a insertObject: @"" atIndex: l]; if (end != nil) { [a insertObject: end atIndex: ++l]; } } } } } /* * Ensure that method arguments are rendered as 'var' */ if (l == 0 || [[a objectAtIndex: l-1] isEqual: @""] == NO) { count = [args count]; for (pos = 0; pos < count; pos++) { NSString *c = [args objectAtIndex: pos]; r = [tmp rangeOfString: c]; if (r.length > 0) { NSString *start; NSString *end; if (r.location > 0) { start = [tmp substringToIndex: r.location]; } else { start = nil; } if (NSMaxRange(r) < [tmp length]) { end = [tmp substringFromIndex: NSMaxRange(r)]; } else { end = nil; } if ((start == nil || snuggleStart(start) == YES) && (end == nil || snuggleEnd(end) == YES)) { NSString *sub; if (start != nil || end != nil) { sub = [tmp substringWithRange: r]; } else { sub = nil; } if (start != nil) { [a insertObject: start atIndex: l++]; } [a insertObject: @"" atIndex: l++]; if (sub != nil) { [a replaceObjectAtIndex: l withObject: sub]; } l++; [a insertObject: @"" atIndex: l]; if (end != nil) { [a insertObject: end atIndex: ++l]; } } } } } /* * Ensure that methods are rendered as references. * First look for format with class name in square brackets. * If that's all there is, we make a class reference. */ r = [tmp rangeOfString: @"["]; if (r.length > 0 && (0 == r.location || isspace([tmp characterAtIndex: r.location - 1]))) { unsigned sPos = NSMaxRange(r); pos = sPos; r = NSMakeRange(pos, [tmp length] - pos); r = [tmp rangeOfString: @"]" options: NSLiteralSearch range: r]; if (r.length > 0) { unsigned ePos = r.location; NSString *cName = nil; NSString *mName = nil; unichar c = 0; BOOL isProtocol = NO; if (pos < ePos && [identStart characterIsMember: (c = [tmp characterAtIndex: pos])] == YES) { /* * Look for class or category name. */ pos++; while (pos < ePos) { c = [tmp characterAtIndex: pos]; if ([identifier characterIsMember: c] == NO) { break; } pos++; } if (c == '(') { pos++; if (pos < ePos && [identStart characterIsMember: (c = [tmp characterAtIndex: pos])] == YES) { while (pos < ePos) { c = [tmp characterAtIndex: pos]; if ([identifier characterIsMember: c] == NO) { break; } pos++; } if (c == ')') { pos++; r = NSMakeRange(sPos, pos - sPos); cName = [tmp substringWithRange: r]; if (pos < ePos) { c = [tmp characterAtIndex: pos]; } } } if (cName == nil) { pos = ePos; // Bad class name! } } else { r = NSMakeRange(sPos, pos - sPos); cName = [tmp substringWithRange: r]; } } else if (pos < ePos && (c = [tmp characterAtIndex: pos]) == '(') { /* * Look for protocol name. */ pos++; while (pos < ePos) { c = [tmp characterAtIndex: pos]; if (c == ')') { pos++; r = NSMakeRange(sPos, pos - sPos); cName = [tmp substringWithRange: r]; if (pos < ePos) { c = [tmp characterAtIndex: pos]; } break; } pos++; } isProtocol = YES; } if (pos < ePos && (c == '+' || c == '-')) { unsigned mStart = pos; pos++; if (pos < ePos && [identStart characterIsMember: (c = [tmp characterAtIndex: pos])] == YES) { while (pos < ePos) { c = [tmp characterAtIndex: pos]; if (c != ':' && [identifier characterIsMember: c] == NO) { break; } pos++; } /* * Varags methods end with ',...' */ if (ePos - pos >= 4 && [[tmp substringWithRange: NSMakeRange(pos, 4)] isEqual: @",..."]) { pos += 4; } /* * The end of the method name should be immediately * before the closing square bracket at 'ePos' */ if (pos == ePos && pos - mStart > 1) { r = NSMakeRange(mStart, pos - mStart); mName = [tmp substringWithRange: r]; } } } if (mName != nil) { NSString *start; NSString *end; NSString *sub; NSString *ref; if (sPos > 0) { start = [tmp substringToIndex: sPos]; if ([start isEqualToString: @"["] == YES) { start = nil; } else if ([start hasSuffix: @"["] == YES) { start = [start substringToIndex: [start length] - 1]; } } else { start = nil; } if (ePos < [tmp length]) { end = [tmp substringFromIndex: ePos]; if ([end isEqualToString: @"]"] == YES) { end = nil; } else if ([end hasPrefix: @"]"] == YES) { end = [end substringFromIndex: 1]; } } else { end = nil; } if (start != nil || end != nil) { sub = [tmp substringWithRange: NSMakeRange(sPos, ePos - sPos)]; } else { sub = nil; } if (start != nil) { [a insertObject: start atIndex: l++]; } if (cName == nil) { ref = [NSString stringWithFormat: @"", mName]; } else if (isProtocol == YES) { ref = [NSString stringWithFormat: @"", mName, cName]; if (isProtocol == YES) { if (sub == nil) { sub = tmp; } sub = [sub stringByReplacingString: @"(" withString: @"<"]; sub = [sub stringByReplacingString: @")" withString: @">"]; } } else { ref = [NSString stringWithFormat: @"", mName, cName]; sub = [NSString stringWithFormat: @"[%@ %@]", cName, mName]; } [a insertObject: ref atIndex: l++]; if (sub != nil) { [a replaceObjectAtIndex: l withObject: sub]; } l++; [a insertObject: @"" atIndex: l]; if (end != nil) { [a insertObject: end atIndex: ++l]; } } else if (pos == ePos && cName != nil) { NSString *ref; if (isProtocol == YES) { NSRange r; r = NSMakeRange(1, [cName length] - 2); cName = [cName substringWithRange: r]; ref = [NSString stringWithFormat: @"<%@>", cName, cName]; } else if ([cName hasSuffix: @")"] == YES) { ref = [NSString stringWithFormat: @"%@", cName, cName]; } else { ref = [NSString stringWithFormat: @"%@", cName, cName]; } [a replaceObjectAtIndex: l withObject: ref]; if (ePos < [tmp length]) { NSString *end = [tmp substringFromIndex: ePos]; if ([end isEqualToString: @"]"] == YES) { end = nil; } if ([end hasPrefix: @"]"] == YES) { end = [end substringFromIndex: 1]; } if ([end length] > 0) { [a insertObject: end atIndex: ++l]; } } } } continue; } /* * Now handle bare method names for current class ... outside brackets. */ if ([tmp hasPrefix: @"-"] || [tmp hasPrefix: @"+"]) { unsigned ePos = [tmp length]; NSString *mName = nil; unsigned c; pos = 1; if (pos < ePos && [identStart characterIsMember: (c = [tmp characterAtIndex: pos])] == YES) { while (pos < ePos) { c = [tmp characterAtIndex: pos]; if (c != ':' && [identifier characterIsMember: c] == NO) { break; } pos++; } /* * Varags methods end with ',...' */ if (ePos - pos >= 4 && [[tmp substringWithRange: NSMakeRange(pos, 4)] isEqual: @",..."]) { pos += 4; if (pos < ePos) { c = [tmp characterAtIndex: pos]; } } if (pos > 1 && (pos == ePos || c == ',' || c == '.' || c == ';')) { NSString *end; NSString *sub; NSString *ref; mName = [tmp substringWithRange: NSMakeRange(0, pos)]; if (pos < [tmp length]) { end = [tmp substringFromIndex: pos]; sub = [tmp substringToIndex: pos]; } else { end = nil; sub = nil; } ref = [NSString stringWithFormat: @"", mName]; [a insertObject: ref atIndex: l++]; if (sub != nil) { [a replaceObjectAtIndex: l withObject: sub]; } l++; [a insertObject: @"" atIndex: l]; if (end != nil) { [a insertObject: end atIndex: ++l]; } } } continue; } /* * Now handle function names. Anything ending in '()' is assumed to * be a referencable function name except 'main()' ... which is special. * NB. A comma, fullstop, or semicolon following '()' is counted as if * the text ended in '()' */ r = [tmp rangeOfString: @"()"]; if (r.length > 0) { unsigned c = [tmp characterAtIndex: 0]; unsigned len = [tmp length]; NSString *str = [tmp substringToIndex: r.location]; BOOL ok = NO; if ([identStart characterIsMember: c] == YES && [str isEqual: @"main"] == NO) { ok = YES; if (len > NSMaxRange(r)) { NSString *end; end = [tmp substringFromIndex: NSMaxRange(r)]; c = [end characterAtIndex: 0]; if (c == ',' || c == '.' || c == ';') { [a insertObject: end atIndex: l + 1]; tmp = [tmp substringToIndex: NSMaxRange(r)]; [a replaceObjectAtIndex: l withObject: tmp]; } else { ok = NO; } } } if (ok == YES) { str = [NSString stringWithFormat: @"", str]; [a insertObject: str atIndex: l++]; l++; // Point past the function name in the array. [a insertObject: @"" atIndex: l++]; continue; } } } return a; } - (NSArray*) informalProtocols { return informalProtocols; } @end @implementation AGSOutput (Private) - (NSString*) mergeMarkup: (NSString*)markup ofKind: (NSString*)kind { NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; NSString *key = [kind stringByAppendingString: @"Template"]; NSString *name = [ud stringForKey: key]; NSData *d; NSString *file; NSFileManager *mgr; NSString *base; NSString *tmp; NSMutableString *str; NSRange range; NSRange start; NSRange end; NSString *dest; dest = [info objectForKey: @"directory"]; if ([name length] == 0) { return nil; // No common document. } file = [name stringByAppendingPathExtension: @"gsdoc"]; if ([dest length] > 0 && [file isAbsolutePath] == NO) { file = [dest stringByAppendingPathComponent: file]; } mgr = [NSFileManager defaultManager]; base = [info objectForKey: @"base"]; /* * Load the current file that info should be merged into. */ if ([mgr isReadableFileAtPath: file] == YES) { str = [NSMutableString stringWithContentsOfFile: file]; } else { tmp = [name stringByAppendingPathExtension: @"template"]; if ([mgr isReadableFileAtPath: tmp] == YES) { str = [NSMutableString stringWithContentsOfFile: tmp]; } else { NSString *up = [ud stringForKey: @"Up"]; /* * No pre-existing file, and no blank template available ... * Generate a standard template. */ str = [[NSMutableString alloc] initWithCapacity: 1024]; [str appendString: @"\n"]; [str appendString: @"\n"]; [str appendString: @"\n"]; [str appendString: @" \n"]; [str appendString: @" "]; [str appendString: kind]; [str appendString: @"\n"]; tmp = [NSString stringWithFormat: @"Generated by %@", NSUserName()]; [str appendString: @" \n"]; [str appendString: @" \n"]; [str appendString: @" \n"]; [str appendString: @" \n"]; [str appendString: @" \n"]; [str appendString: @"\n"]; } } /* * Locate start and end points for all markup of this 'kind'. */ tmp = [NSString stringWithFormat: @"\n", kind]; start = [str rangeOfString: tmp]; if (start.length == 0) { start = [str rangeOfString: @""]; if (start.length == 0) { start = [str rangeOfString: @""]; } if (start.length == 0) { NSLog(@"No or markup in %@ document", kind); return nil; } [str insertString: tmp atIndex: start.location]; start.length = [tmp length]; } tmp = [NSString stringWithFormat: @"\n", kind]; end = [str rangeOfString: tmp]; if (end.length == 0) { end.location = NSMaxRange(start); end.length = [tmp length]; [str insertString: tmp atIndex: end.location]; } else if (end.location <= start.location) { NSLog(@"End marker comes before start marker in %@ document", kind); return nil; } /* * Now locate start and end points for markup for this file. */ tmp = [NSString stringWithFormat: @"\n", base, kind]; start = [str rangeOfString: tmp]; if (start.length == 0) { start.location = end.location; // Insert before end of section. start.length = [tmp length]; [str insertString: tmp atIndex: end.location]; } tmp = [NSString stringWithFormat: @"\n", base, kind]; end = [str rangeOfString: tmp]; if (end.length == 0) { end.location = NSMaxRange(start); end.length = [tmp length]; [str insertString: tmp atIndex: end.location]; } range = NSMakeRange(NSMaxRange(start), end.location - NSMaxRange(start)); [str replaceCharactersInRange: range withString: markup]; d = [str dataUsingEncoding: NSUTF8StringEncoding]; if ([d writeToFile: file atomically: YES] == NO) { NSLog(@"Unable to write %@ markup to %@", kind, file); return nil; } return file; } @end gnustep-base-1.29.0/Tools/AGSParser.h000066400000000000000000000100701435650067400172500ustar00rootroot00000000000000#ifndef _INCLUDED_AGSPARSER_H #define _INCLUDED_AGSPARSER_H /** AGSParser ...a class to get documention info from ObjC source Copyright (C) 2001 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: October 2001 This file is part of the GNUstep Project This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. You should have received a copy of the GNU General Public License along with this program; see the file COPYINGv3. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This is the AGSParser class ... and some autogsdoc examples. The AGSParser class is designed to produce a property-list which can be handled by AGSOutput ... one class is not much use without the other. */ #import "Foundation/NSObject.h" #include @class NSArray; @class NSCharacterSet; @class NSDictionary; @class NSMutableArray; @class NSMutableDictionary; @class NSString; @interface AGSParser : NSObject { /* * The following items are used for logging/debug purposes. */ NSString *fileName; /** The file being parsed. */ NSString *unitName; /** The unit being parsed. */ NSString *itemName; /** The item being parsed. */ NSArray *lines; /** The line number mapping. */ /* * The next few ivars represent the data currently being parsed. */ unichar *buffer; unsigned length; unsigned pos; BOOL inHeader; BOOL commentsRead; BOOL haveOutput; BOOL haveSource; BOOL inInstanceVariables; BOOL inArgList; BOOL documentInstanceVariables; BOOL documentAllInstanceVariables; BOOL verbose; BOOL warn; BOOL standards; BOOL inUnclosedExample; NSDictionary *wordMap; NSString *declared; /** Where classes were declared. */ NSMutableArray *ifStack; /** Track preprocessor conditionals. */ NSString *comment; /** Documentation accumulator. */ NSMutableDictionary *info; /** All information parsed. */ NSMutableDictionary *orderedSymbolDeclsByUnit; NSMutableArray *source; /** Names of source files. */ NSCharacterSet *identifier; /** Legit char in identifier */ NSCharacterSet *identStart; /** Legit initial char of identifier */ NSCharacterSet *spaces; /** All blank characters */ NSCharacterSet *spacenl; /** Blanks excluding newline */ } - (NSMutableDictionary*) info; - (NSDictionary *) orderedSymbolDeclarationsByUnit; - (id) init; /** Simple initialiser */ - (NSMutableArray*) outputs; - (unsigned) parseComment; - (NSMutableDictionary*) parseDeclaration; - (NSMutableDictionary*) parseFile: (NSString*)name isSource: (BOOL)isSource; - (NSString*) parseIdentifier; - (NSMutableDictionary*) parseImplementation; - (NSMutableDictionary*) parseInterface; - (NSMutableDictionary*) parseInstanceVariables; - (NSMutableDictionary*) parseMacro; - (NSMutableDictionary*) parseMethodIsDeclaration: (BOOL)flag; - (NSMutableDictionary*) parseMethodsAreDeclarations: (BOOL)flag; - (NSString*) parseMethodType; - (unsigned) parsePreprocessor; - (NSMutableDictionary*) parseProtocol; - (NSMutableArray*) parseProtocolList; - (unsigned) parseSpace: (NSCharacterSet*)spaceSet; - (unsigned) parseSpace; - (NSString*) parseVersion; - (void) reset; - (void) setDeclared: (NSString*)name; - (void) setDocumentInstanceVariables: (BOOL)flag; - (void) setDocumentAllInstanceVariables: (BOOL)flag; - (void) setGenerateStandards: (BOOL)flag; - (void) setStandards: (NSMutableDictionary*)dict; - (void) setWordMap: (NSDictionary*)map; - (void) setupBuffer; - (unsigned) skipArray; - (unsigned) skipBlock; - (unsigned) skipBlock: (BOOL*)isEmpty; - (unsigned) skipLiteral; - (unsigned) skipRemainderOfLine; - (unsigned) skipSpaces; - (unsigned) skipStatement; - (unsigned) skipStatementLine; - (unsigned) skipToEndOfLine; - (unsigned) skipUnit; - (NSMutableArray*) sources; @end #endif gnustep-base-1.29.0/Tools/AGSParser.m000066400000000000000000003171221435650067400172650ustar00rootroot00000000000000/* Copyright (C) 2001 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: October 2001 This file is part of the GNUstep Project This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. You should have received a copy of the GNU General Public License along with this program; see the file COPYINGv3. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #import "common.h" #import "Foundation/NSArray.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSCharacterSet.h" #import "Foundation/NSData.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSException.h" #import "Foundation/NSFileManager.h" #import "Foundation/NSUserDefaults.h" #import "Foundation/NSScanner.h" #import "Foundation/NSSet.h" #import "Foundation/NSValue.h" #import "AGSParser.h" #import "GNUstepBase/NSString+GNUstepBase.h" #import "GNUstepBase/NSMutableString+GNUstepBase.h" /** * The AGSParser class parses Objective-C header and source files * to produce a property-list which can be handled by [AGSOutput]. */ @implementation AGSParser /** * Method to add the comment from the main() function to the end * of the initial chapter in the output document. We do this to * support the use of autogsdoc to document tools. */ - (void) addMain: (NSString*)c { NSString *chap; NSString *toolName; NSString *secHeading; BOOL createSec = NO; NSMutableString *m; NSRange r; chap = [info objectForKey: @"chapter"]; toolName = [[fileName lastPathComponent] stringByDeletingPathExtension]; if (chap == nil) { chap = [NSString stringWithFormat: @"%@", toolName]; } else { createSec = YES; } m = [chap mutableCopy]; r = [m rangeOfString: @""]; r.length = 0; if (createSec) { [m replaceCharactersInRange: r withString: @"\n"]; } [m replaceCharactersInRange: r withString: c]; if (createSec) { secHeading = [NSString stringWithFormat: @"
    \n%@\n", toolName]; //The %@ tool [m replaceCharactersInRange: r withString: secHeading]; } [info setObject: m forKey: @"chapter"]; RELEASE(m); } /** * Append a comment (with leading and trailing space stripped) * to an information dictionary.
    * If the dictionary is nil, accumulate in the comment ivar instead.
    * If the comment is empty, ignore it.
    * If there is no comment in the dictionary, simply set the new value.
    * If a comment already exists then the new comment text is appended to * it with a separating line break inserted if necessary.
    */ - (void) appendComment: (NSString*)s to: (NSMutableDictionary*)d { s = [s stringByTrimmingSpaces]; if ([s length] > 0) { NSString *old; if (d == nil) { old = comment; } else { old = [d objectForKey: @"Comment"]; } if (old != nil) { if ([old hasSuffix: @"

    "] == NO && [old hasSuffix: @"
    "] == NO && [old hasSuffix: @"
    "] == NO) { s = [old stringByAppendingFormat: @"
    %@", s]; } else { s = [old stringByAppendingString: s]; } } if (d == nil) { ASSIGN(comment, s); } else { [d setObject: s forKey: @"Comment"]; } } } - (void) dealloc { DESTROY(wordMap); DESTROY(ifStack); DESTROY(declared); DESTROY(info); DESTROY(orderedSymbolDeclsByUnit); DESTROY(comment); DESTROY(identifier); DESTROY(identStart); DESTROY(spaces); DESTROY(spacenl); DESTROY(source); DESTROY(itemName); DESTROY(unitName); [super dealloc]; } - (NSMutableDictionary*) info { return info; } /** Returns the methods, functions and C data types in their header declaration order, by organizing them into arrays as described below. Methods are grouped by class, category or protocol references. For example, valid keys could be ClassName, ClassName(CategoryName) and (ProtocolName). Functions and C data types are grouped by header file names. For example, AGParser.h would a valid key. TODO: Collect functions and C data types. Only methods are currently included in the returned dictionary. */ - (NSDictionary *) orderedSymbolDeclarationsByUnit { return orderedSymbolDeclsByUnit; } - (id) init { NSMutableCharacterSet *m; m = [[NSCharacterSet controlCharacterSet] mutableCopy]; [m addCharactersInString: @" "]; spacenl = [m copy]; [m removeCharactersInString: @"\n"]; spaces = [m copy]; RELEASE(m); identifier = RETAIN([NSCharacterSet characterSetWithCharactersInString: @"_0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"]); identStart = RETAIN([NSCharacterSet characterSetWithCharactersInString: @"_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"]); info = [[NSMutableDictionary alloc] initWithCapacity: 6]; orderedSymbolDeclsByUnit = [[NSMutableDictionary alloc] init]; source = [NSMutableArray new]; verbose = [[NSUserDefaults standardUserDefaults] boolForKey: @"Verbose"]; warn = [[NSUserDefaults standardUserDefaults] boolForKey: @"Warn"]; documentInstanceVariables = YES; ifStack = [[NSMutableArray alloc] initWithCapacity: 4]; [ifStack addObject: [NSDictionary dictionary]]; return self; } - (void) log: (NSString*)fmt arguments: (va_list)args { const char *msg; int where; /* * Take the current position in the character buffer and * step through the lines array to find which line of the * original document it was on. * NB. Each item in the array represents the position *after* * a newline in the original data - so the zero'th array * element contains the character position of the start of * line two in human readable numbering (ie starting from 1). */ for (where = [lines count] - 1; where >= 0; where--) { NSNumber *num = [lines objectAtIndex: where]; if ([num intValue] <= (int)pos) { break; } } where += 2; if (unitName != nil) { if (itemName != nil) { fmt = [NSString stringWithFormat: @"%@:%u %@(%@): %@", fileName, where, unitName, itemName, fmt]; } else { fmt = [NSString stringWithFormat: @"%@:%u %@: %@", fileName, where, unitName, fmt]; } } else { fmt = [NSString stringWithFormat: @"%@:%u %@", fileName, where, fmt]; } fmt = AUTORELEASE([[NSString alloc] initWithFormat: fmt arguments: args]); if ([fmt hasSuffix: @"\n"] == NO) { fmt = [fmt stringByAppendingString: @"\n"]; } msg = [fmt lossyCString]; fwrite(msg, strlen(msg), 1, stderr); } - (void) log: (NSString*)fmt, ... { va_list ap; va_start (ap, fmt); [self log: fmt arguments: ap]; va_end (ap); } - (void) parseArgsInto: (NSMutableDictionary*)d { BOOL wasInArgList = inArgList; NSMutableArray *a = nil; NSAssert([d objectForKey: @"Args"] == nil, NSInternalInconsistencyException); a = [[NSMutableArray alloc] initWithCapacity: 4]; [d setObject: a forKey: @"Args"]; RELEASE(a); inArgList = YES; pos++; // Step past opening '(' while ([self parseSpace] < length && buffer[pos] != ')') { if (buffer[pos] == ',') { pos++; } else if (buffer[pos] == '.') { pos += 3; // Skip '...' [d setObject: @"YES" forKey: @"VarArgs"]; } else { NSMutableDictionary *m; m = [self parseDeclaration]; if (m == nil) { break; } if ([[m objectForKey: @"BaseType"] isEqual: @"void"] == YES && [m objectForKey: @"Prefix"] == nil) { continue; // C++ style empty arg list. eg. 'int foo(void);' } [a addObject: m]; } } if (pos < length) { pos++; // Step past closing ')' } inArgList = wasInArgList; } /** * Return the list of known output files depending on this source/header. */ - (NSMutableArray*) outputs { NSUserDefaults *defs = [NSUserDefaults standardUserDefaults]; NSMutableArray *output = [NSMutableArray arrayWithCapacity: 6]; NSString *basic = [info objectForKey: @"Header"]; NSString *names[5] = { @"Functions", @"Typedefs", @"Variables", @"Macros", @"Constants" }; unsigned i; basic = [basic lastPathComponent]; basic = [basic stringByDeletingPathExtension]; basic = [basic stringByAppendingPathExtension: @"gsdoc"]; /** * If there are any classes, categories, or protocols, there will be * an output file for them whose name is based on the name of the header. */ if ([[info objectForKey: @"Classes"] count] > 0 || [[info objectForKey: @"Categories"] count] > 0 || [[info objectForKey: @"Protocols"] count] > 0) { [output addObject: basic]; } /** * If there are any constants, variables, typedefs or functions, there * will either be a shared output file for them (defined by a template * name set in the user defaults system), or they will go in the same * file as classes etc. */ for (i = 0; i < sizeof(names) / sizeof(NSString*); i++) { NSString *base = names[i]; if ([[info objectForKey: base] count] > 0) { NSString *file; base = [base stringByAppendingString: @"Template"]; file = [defs stringForKey: base]; if ([file length] == 0) { if ([output containsObject: basic] == NO) { [output addObject: basic]; } } else { if ([[file pathExtension] isEqual: @"gsdoc"] == NO) { file = [file stringByAppendingPathExtension: @"gsdoc"]; } if ([output containsObject: file] == NO) { [output addObject: file]; } } } } return output; } /* When the paragraph string contains a GSDoc block element which is not a text element (in the GSDoc DTD sense), we return NO, otherwise we return YES. A GSDoc or HTML paragraph content is limited to text elements (see GSDoc DTD). e.g. 'list' or 'example' cannot belong to a 'p' element. Any other non-block elements are considered valid. Whether or not they can be embedded within a paragraph in the final output is the doc writer responsability. For 'item' and 'answer' which can contain arbitrary block elements, explicit 'p' tags should be used, because we won't wrap 'patata' and 'patati' as two paragraphs in the example below: patata patati When starts a paragraph, \n\n sequence are allowed in the example. In the example below, bla or bla\n wouldn't be handled correctly unlike: bla patati patata */ - (BOOL) canWrapWithParagraphMarkup: (NSString *)para { NSScanner *scanner = [NSScanner scannerWithString: para]; NSSet *blockTags = [NSSet setWithObjects: @"list", @"enum", @"item", @"deflist", @"term", @"qalist", @"question", @"answer", @"p", @"example", @"embed", @"index", nil]; NSMutableCharacterSet *skippedChars = (id)[NSMutableCharacterSet punctuationCharacterSet]; if (inUnclosedExample) { /* We don't need to check block element presence within an example, since an example content is limited to PCDATA. */ [scanner scanUpToString: @"" intoString: NULL]; if ([scanner scanString: @"" intoString: NULL]) { inUnclosedExample = NO; } return NO; } /* Set up the scanner to treat opening and closing tags in the same way. Punctuation character set includes '/' but not '<' and '>' */ [skippedChars formUnionWithCharacterSet: [scanner charactersToBeSkipped]]; [scanner setCharactersToBeSkipped: AUTORELEASE([skippedChars copy])]; while (![scanner isAtEnd]) { NSString *tag = @""; BOOL foundBlockTag = NO; [scanner scanUpToString: @"<" intoString: NULL]; if (![scanner scanString: @"<" intoString: NULL]) return YES; [scanner scanUpToString: @">" intoString: &tag]; foundBlockTag = [blockTags containsObject: tag]; if (foundBlockTag) { /* When the first block tag is and the example is unclosed in the current paragraph, we stop to insert

    tags in the next paragraphs until we reach */ if ([tag isEqualToString: @"example"]) { [scanner setCharactersToBeSkipped: [NSCharacterSet whitespaceAndNewlineCharacterSet]]; [scanner scanUpToString: @"" intoString: NULL]; inUnclosedExample = ([scanner scanString: @"" intoString: NULL] == NO); } return NO; } } return YES; } // NOTE: We could be able to eliminate that if -parseComment processes the // first comment tags before calling -generateParagraphMarkups: - (BOOL) shouldInsertParagraphMarkupInFirstComment: (NSString *)aComment { NSArray *firstCommentTags = [NSArray arrayWithObjects: @"", @"<abstract>", @"<author>", @"<copy>", @"<version>", @"<date>", @"Author:", @"By:", @"Copyright (C)", @"Revision:", @"Date:", nil]; NSEnumerator *e = [firstCommentTags objectEnumerator]; NSString *tag = nil; while ((tag = [e nextObject]) != nil) { if ([aComment rangeOfString: tag options: NSCaseInsensitiveSearch].location != NSNotFound) { return NO; } } return YES; } - (NSString *) generateParagraphMarkupForString: (NSString *)aComment { NSMutableString *formattedComment = [NSMutableString stringWithCapacity: [aComment length] + 100]; NSArray *paras = [aComment componentsSeparatedByString: @"\n\n"]; NSEnumerator *e = [paras objectEnumerator]; NSString *para = nil; BOOL isFirstComment = (commentsRead == NO); if (isFirstComment && ![self shouldInsertParagraphMarkupInFirstComment: aComment]) { return aComment; } while ((para = [e nextObject]) != nil) { NSString *newPara = para; /* -canWrapWithParagraph: can change its value */ BOOL wasInUnclosedExample = inUnclosedExample; if ([self canWrapWithParagraphMarkup: para]) { newPara = [NSString stringWithFormat: @"<p>%@</p>", para]; } else if (wasInUnclosedExample) { newPara = [NSString stringWithFormat: @"\n\n%@", para]; } [formattedComment appendString: newPara]; } return formattedComment; } /** * In spite of its trivial name, this is one of the key methods - * it parses and skips past comments, but it also recognizes special * comments (with an additional asterisk after the start of the block * comment) and extracts their contents, accumulating them into the * 'comment' instance variable.<br /> * When the data provided by a comment is appended to the data * stored in the 'comment' instance variable, a line break (<br />)is * automatically forced to separate it from the proceding info.<br /> * In addition, the first extracted documentation is checked for the * prsence of file header markup, which is extracted into the 'info' * dictionary. */ - (unsigned) parseComment { if (buffer[pos + 1] == '/') { return [self skipRemainderOfLine]; } else if (buffer[pos + 1] == '*') { unichar *start = 0; BOOL isDocumentation = NO; BOOL skippedFirstLine = NO; NSRange r; BOOL ignore = NO; /* Jump back here if we have ignored data up to a new comment. */ comment: pos += 2; /* Skip opening part */ /* * Only comments starting with slash and TWO asterisks are special. */ if (pos < length - 2 && buffer[pos] == '*' && buffer[pos + 1] != '*') { isDocumentation = YES; pos++; /* * Ignore first line of comment if it is empty. */ if ([self skipSpaces] < length && buffer[pos] == '\n') { pos++; skippedFirstLine = YES; } } /* * Find end of comment. */ start = &buffer[pos]; while (pos < length) { unichar c = buffer[pos++]; if (c == '*' && pos < length && buffer[pos] == '/') { pos++; // Position after trailing slash. break; } } if (isDocumentation == YES) { unichar *end = &buffer[pos - 1]; unichar *ptr = start; unichar *newLine = ptr; BOOL stripAsterisks = NO; /* * Remove any asterisks immediately before end of comment. */ while (end > start && end[-1] == '*') { end--; } /* * Remove any trailing whitespace in the comment, but ensure that * there is a final newline. */ while (end > start && [spacenl characterIsMember: end[-1]] == YES) { end--; } *end++ = '\n'; /* * If second line in the comment starts with whitespace followed * by an asterisk, we assume all the lines in the comment start * in a similar way, and everything up to and including the * asterisk on each line should be stripped. * Otherwise we take the comment verbatim. */ if (skippedFirstLine == NO) { while (ptr < end && *ptr != '\n') { ptr++; } ptr++; // Step past the end of the first line. } while (ptr < end) { unichar c = *ptr++; if (c == '\n') { break; } else if (c == '*') { stripAsterisks = YES; break; } else if ([spaces characterIsMember: c] == NO) { break; } } if (stripAsterisks == YES) { /* * Strip parts of lines up to leading asterisks. */ ptr = start; while (ptr < end) { unichar c = *ptr++; if (c == '\n') { newLine = ptr; } else if (c == '*' && newLine != 0) { unichar *out = newLine; while (ptr < end) { *out++ = *ptr++; } end = out; ptr = newLine; newLine = 0; } else if ([spaces characterIsMember: c] == NO) { newLine = 0; } } } /* * If we have something for documentation, accumulate it in the * 'comment' ivar. */ if (end > start) { NSString *tmp; NSRange r; NSUserDefaults *defs = [NSUserDefaults standardUserDefaults]; tmp = [NSString stringWithCharacters: start length: end - start]; /* * If the comment does not contain block markup already and we * were asked to generate it, we insert <p> tags to get an * explicit paragraph structure. */ if ([defs boolForKey: @"GenerateParagraphMarkup"]) { // FIXME: Should follow <ignore> processing and be called // just before using -appendComment:to: tmp = [self generateParagraphMarkupForString: tmp]; } recheck: if (YES == ignore) { r = [tmp rangeOfString: @"</ignore>"]; if (r.length > 0) { tmp = [tmp substringFromIndex: NSMaxRange(r)]; ignore = NO; } } if (NO == ignore) { r = [tmp rangeOfString: @"<ignore>"]; if (r.length > 0) { [self appendComment: [tmp substringToIndex: r.location] to: nil]; tmp = [tmp substringFromIndex: NSMaxRange(r)]; ignore = YES; goto recheck; } [self appendComment: tmp to: nil]; } } /* * We're in the first comment of a file; perform special processing. */ if (commentsRead == NO && comment != nil) { unsigned commentLength = [comment length]; NSMutableArray *authors; NSEnumerator *enumerator; NSArray *keys; NSString *key; authors = (NSMutableArray*)[info objectForKey: @"authors"]; /* * Scan through for more authors */ r = NSMakeRange(0, commentLength); while (r.length > 0) { r = [comment rangeOfString: @"<author " options: NSLiteralSearch range: r]; if (r.length > 0) { unsigned i = r.location; r = NSMakeRange(i, commentLength - i); r = [comment rangeOfString: @"</author>" options: NSLiteralSearch range: r]; if (r.length > 0) { NSString *author; r = NSMakeRange(i, NSMaxRange(r) - i); author = [comment substringWithRange: r]; i = NSMaxRange(r); r = NSMakeRange(i, commentLength - i); /* * There may be more than one author * of a document. */ if (authors == nil) { authors = [NSMutableArray new]; [info setObject: authors forKey: @"authors"]; RELEASE(authors); } if ([authors containsObject: author] == NO) { [authors addObject: author]; } } else { [self log: @"unterminated <author> in comment"]; } } } /* * In addition to fully specified author elements in the * comment, we look for lines of the formats - * Author: name <email> * Author: name * By: name <email> * By: name */ r = NSMakeRange(0, commentLength); while (r.length > 0) { NSString *term = @"\n"; NSRange a; NSRange b; /* * Look for 'Author:' or 'By:' and use whichever we * find first. */ a = [comment rangeOfString: @"author:" options: NSCaseInsensitiveSearch range: r]; b = [comment rangeOfString: @"by:" options: NSCaseInsensitiveSearch range: r]; if (a.length > 0) { if (b.length > 0 && b.location < a.location) { r = b; } else { r = a; /* * A line '$Author$' is an RCS tag and is * terminated by the second dollar rather than * by a newline. */ if (r.location > 0 && [comment characterAtIndex: r.location-1] == '$') { term = @"$"; } } } else { r = b; } if (r.length > 0) { unsigned i = NSMaxRange(r); NSString *line; NSString *author; r = NSMakeRange(i, commentLength - i); r = [comment rangeOfString: term options: NSLiteralSearch range: r]; if (r.length == 0) { r.location = commentLength; } r = NSMakeRange(i, NSMaxRange(r) - i); line = [comment substringWithRange: r]; line = [line stringByTrimmingSpaces]; i = NSMaxRange(r); r = [line rangeOfString: @"<"]; if (r.length > 0) { NSString *name; NSString *mail; name = [line substringToIndex: r.location]; name = [name stringByTrimmingSpaces]; mail = [line substringFromIndex: r.location+1]; r = [mail rangeOfString: @">"]; if (r.length > 0) { mail = [mail substringToIndex: r.location]; } author = [NSString stringWithFormat: @"<author name=\"%@\"><email address=\"%@\">" @"%@</email></author>", name, mail, mail]; } else { author = [NSString stringWithFormat: @"<author name=\"%@\"></author>", line]; } r = NSMakeRange(i, commentLength - i); if (authors == nil) { authors = [NSMutableArray new]; [info setObject: authors forKey: @"authors"]; RELEASE(authors); } if ([authors containsObject: author] == NO) { [authors addObject: author]; } } } /* * Lines of the form 'AutogsdocSource: ...' are used as the * names of source files to provide documentation information. * whitespace around a filename is stripped. */ r = NSMakeRange(0, commentLength); while (r.length > 0) { /* * Look for 'AutogsdocSource:' lines. */ r = [comment rangeOfString: @"AutogsdocSource:" options: NSCaseInsensitiveSearch range: r]; if (r.length > 0) { unsigned i = NSMaxRange(r); NSString *line; r = NSMakeRange(i, commentLength - i); r = [comment rangeOfString: @"\n" options: NSLiteralSearch range: r]; if (r.length == 0) { r.location = commentLength; } r = NSMakeRange(i, NSMaxRange(r) - i); line = [comment substringWithRange: r]; line = [line stringByTrimmingSpaces]; if (haveSource == NO) { haveSource = YES; [source removeAllObjects]; // remove default. } if ([line length] > 0 && [source containsObject: line] == NO) { NSFileManager *mgr; /* * See if the path given exists, and add it to * the list of source files parsed for this * header. */ mgr = [NSFileManager defaultManager]; if ([line isAbsolutePath] == YES) { if ([mgr isReadableFileAtPath: line] == NO) { [self log: @"AutogsdocSource: %@ not found!", line]; line = nil; } } else { NSString *p; /* * Try forming a path relative to the header. */ p = [info objectForKey: @"Header"]; p = [p stringByDeletingLastPathComponent]; p = [p stringByAppendingPathComponent: line]; if ([mgr isReadableFileAtPath: p] == YES) { line = p; } else if ([mgr isReadableFileAtPath: line] == NO) { NSUserDefaults *defs; NSString *ddir; NSString *old = p; defs = [NSUserDefaults standardUserDefaults]; ddir = [defs stringForKey: @"DocumentationDirectory"]; if ([ddir length] > 0) { p = [ddir stringByAppendingPathComponent: line]; if ([mgr isReadableFileAtPath: p] == YES) { line = p; } else { [self log: @"AutogsdocSource: %@ not " @"found (tried %@ and %@ too)!", line, old, p]; line = nil; } } else { [self log: @"AutogsdocSource: %@ not " @"found (tried %@ too)!", line, old]; line = nil; } } } if (line != nil) { [source addObject: line]; } } i = NSMaxRange(r); r = NSMakeRange(i, commentLength - i); } } /** * There are various sections we can extract from the * document - at most one of each. * If date and version are not supplied RCS Date and Revision * tags will be extracted where available. */ keys = [NSArray arrayWithObjects: @"abstract", // Abstract for document head @"back", // Appendix for document body @"chapter", // Chapter at start of document @"copy", // Copyright for document head @"date", // date for document head @"front", // Forward for document body @"title", // Title for document head @"version", // Version for document head nil]; enumerator = [keys objectEnumerator]; while ((key = [enumerator nextObject]) != nil) { NSString *s = [NSString stringWithFormat: @"<%@>", key]; NSString *e = [NSString stringWithFormat: @"</%@>", key]; /* * Read date information if available */ r = [comment rangeOfString: s]; if (r.length > 0) { unsigned i = r.location; r = NSMakeRange(i, commentLength - i); r = [comment rangeOfString: e options: NSLiteralSearch range: r]; if (r.length > 0) { NSString *val; r = NSMakeRange(i, NSMaxRange(r) - i); val = [comment substringWithRange: r]; [info setObject: val forKey: key]; } else { [self log: @"unterminated %@ in comment", s]; } } } /* * If no <copy> ... </copy> then try Copyright: */ if ([info objectForKey: @"copy"] == nil) { r = NSMakeRange(0, commentLength); while (r.length > 0) { /* * Look for 'Copyright:' */ r = [comment rangeOfString: @"copyright (c)" options: NSCaseInsensitiveSearch range: r]; if (r.length > 0) { unsigned i = NSMaxRange(r); NSString *line; r = NSMakeRange(i, commentLength - i); r = [comment rangeOfString: @"\n" options: NSLiteralSearch range: r]; if (r.length == 0) { r.location = commentLength; } r = NSMakeRange(i, NSMaxRange(r) - i); line = [comment substringWithRange: r]; line = [line stringByTrimmingSpaces]; line = [NSString stringWithFormat: @"<copy>%@</copy>", line]; [info setObject: line forKey: @"copy"]; } } } /* * If no <date> ... </date> then try RCS info. */ if ([info objectForKey: @"date"] == nil) { r = [comment rangeOfString: @"$Date:"]; if (r.length > 0) { unsigned i = NSMaxRange(r); NSString *date; r = NSMakeRange(i, commentLength - i); r = [comment rangeOfString: @"$" options: NSLiteralSearch range: r]; if (r.length > 0) { r = NSMakeRange(i, r.location - i); date = [comment substringWithRange: r]; date = [date stringByTrimmingSpaces]; date = [NSString stringWithFormat: @"<date>%@</date>", date]; [info setObject: date forKey: @"date"]; } } } /* * If no <version> ... </version> then try RCS info. */ if ([info objectForKey: @"version"] == nil) { r = [comment rangeOfString: @"$Revision:"]; if (r.length > 0) { unsigned i = NSMaxRange(r); NSString *version; r = NSMakeRange(i, commentLength - i); r = [comment rangeOfString: @"$" options: NSLiteralSearch range: r]; if (r.length > 0) { r = NSMakeRange(i, r.location - i); version = [comment substringWithRange: r]; version = [version stringByTrimmingSpaces]; version = [NSString stringWithFormat: @"<version>%@</version>", version]; [info setObject: version forKey: @"version"]; } } } } commentsRead = YES; } if (YES == ignore) { while (pos < length) { switch (buffer[pos]) { case '\'': case '"': [self skipLiteral]; break; case '/': if (pos + 1 < length) { if (buffer[pos + 1] == '/') { [self skipRemainderOfLine]; } else if (buffer[pos + 1] == '*') { goto comment; } } pos++; break; default: pos++; break; } } } } return pos; } - (void) parseDeclaratorInto: (NSMutableDictionary*)d { NSMutableString *p = nil; NSMutableString *s = nil; while ([self parseSpace] < length) { while (pos < length && buffer[pos] == '*') { if (p == nil && (p = [d objectForKey: @"Prefix"]) == nil) { p = [NSMutableString new]; [d setObject: p forKey: @"Prefix"]; RELEASE(p); } else if ([p hasSuffix: @"("] == NO && [p hasSuffix: @"*"] == NO) { [p appendString: @" "]; } [p appendString: @"*"]; pos++; } if (buffer[pos] == '(') { if (p == nil && (p = [d objectForKey: @"Prefix"]) == nil) { p = [NSMutableString new]; [d setObject: p forKey: @"Prefix"]; RELEASE(p); } else if ([p hasSuffix: @"("] == NO && [p hasSuffix: @"*"] == NO) { [p appendString: @" "]; } [p appendString: @"("]; pos++; [self parseDeclaratorInto: d]; if ([self parseSpace] < length && buffer[pos] == '(') { [self parseArgsInto: d]; // parse function args. } if ([self parseSpace] < length && buffer[pos] == ')') { if (s == nil && (s = [d objectForKey: @"Suffix"]) == nil) { s = [NSMutableString new]; [d setObject: s forKey: @"Suffix"]; RELEASE(s); } [s appendString: @")"]; pos++; return; } else { [self log: @"missing ')' in declarator."]; return; } } else { NSString *t; t = [self parseIdentifier]; if (t == nil) { return; } if ([t isEqualToString: @"const"] || [t isEqualToString: @"volatile"]) { if (p == nil && (p = [d objectForKey: @"Prefix"]) == nil) { p = [NSMutableString new]; [d setObject: p forKey: @"Prefix"]; RELEASE(p); } else if ([p hasSuffix: @"("] == NO) { [p appendString: @" "]; } [p appendString: t]; } else { [d setObject: t forKey: @"Name"]; return; } } } } - (NSMutableDictionary*) parseDeclaration { NSMutableDictionary *d = [NSMutableDictionary dictionary]; CREATE_AUTORELEASE_POOL(arp); static NSSet *qualifiers = nil; static NSSet *keep = nil; NSMutableString *t = nil; NSMutableArray *a; NSString *s; BOOL isTypedef = NO; BOOL isPointer = NO; BOOL isFunction = NO; BOOL baseConstant = NO; BOOL needScalarType = NO; if (qualifiers == nil) { qualifiers = [NSSet setWithObjects: @"auto", @"const", @"extern", @"inline", @"long", @"register", @"short", @"signed", @"static", @"typedef", @"unsigned", @"volatile", nil]; IF_NO_ARC([qualifiers retain];) keep = [NSSet setWithObjects: @"const", @"long", @"short", @"signed", @"unsigned", @"volatile", nil]; IF_NO_ARC([keep retain];) } a = [NSMutableArray array]; while ((s = [self parseIdentifier]) != nil) { if (inHeader == NO && [s isEqualToString: @"static"] == YES) { /* * We don't want to document static declarations unless they * occur in a public header. */ [self skipStatementLine]; goto fail; } if (([s isEqual: @"__attribute__"] == YES) || ([s isEqual: @"__asm__"] == YES)) { if ([self skipSpaces] < length && buffer[pos] == '(') { unsigned start = pos; [self skipBlock]; // Skip the attributes if (YES == verbose) { NSString *attr; attr = [NSString stringWithCharacters: buffer + start length: pos - start]; [self log: @"skip %@ %@", s, attr]; } } else { [self log: @"strange format %@", s]; } continue; } if ([s isEqualToString: @"GS_EXPORT"] == YES) { s = @"extern"; } if ([qualifiers member: s] == nil) { break; } else { if ([s isEqualToString: @"extern"] == YES && [self skipSpaces] < length - 3 && buffer[pos] == '\"' && buffer[pos+1] == 'C' && buffer[pos+2] == '\"') { /* * Found 'extern "C" ...' * Which is for C++ and should be ignored */ pos += 3; if ([self skipSpaces] < length && buffer[pos] == '{') { pos++; [self skipSpaces]; } IF_NO_ARC(DESTROY(arp);) return nil; } if ([s isEqualToString: @"typedef"] == YES) { isTypedef = YES; } if ([keep member: s] != nil) { [a addObject: s]; if ([s isEqual: @"const"] == NO && [s isEqual: @"volatile"] == NO) { needScalarType = YES; } } } } /** * We handle struct, union, and enum declarations by skipping the * stuff enclosed in curly braces. If there was an identifier * after the keyword we use it as the struct name, otherwise we * use '...' to denote a nameless type. */ if ([s isEqualToString: @"struct"] == YES || [s isEqualToString: @"union"] == YES || [s isEqualToString: @"enum"] == YES || [s isEqualToString: @"NS_ENUM"] == YES || [s isEqualToString: @"NS_OPTIONS"] == YES) { BOOL isEnum = NO; NSString *tmp = s; if ([s isEqualToString: @"NS_ENUM"] || [s isEqualToString: @"NS_OPTIONS"]) { if ([self parseSpace] < length && buffer[pos] == '(') { pos++; [self parseSpace]; s = [self parseIdentifier]; if (nil != s && [self parseSpace] < length && buffer[pos] == ',') { tmp = [tmp stringByAppendingFormat: @"(%@)", s]; pos++; [self parseSpace]; s = [self parseIdentifier]; if (nil != s && [self parseSpace] < length && buffer[pos] == ')') { isEnum = YES; pos++; [d setObject: s forKey: @"Name"]; s = tmp; } } } if (NO == isEnum) { [self log: @"messed up NS_ENUM/NS_OPTIONS declaration"]; [arp drain]; return nil; } } else { isEnum = [s isEqualToString: @"enum"]; s = [self parseIdentifier]; if (s == nil) { s = [NSString stringWithFormat: @"%@ ...", tmp]; } else { s = [NSString stringWithFormat: @"%@ %@", tmp, s]; /* * It's possible to declare a struct, union, or enum without * giving it a name beyond after the declaration, in this case * we can use something like 'struct foo' as the name. */ [d setObject: s forKey: @"Name"]; } } /* We parse enum and options comment of the form: * <introComment> enum { <comment1> field1, <comment2> field2 } bla; */ if (isEnum && [self parseSpace] < length && buffer[pos] == '{') { NSString *ident; NSString *introComment; NSMutableString *fieldComments = [NSMutableString string]; BOOL foundFieldComment = NO; /* We want to be able to parse new comments while retaining the originally parsed comment for the enum/union/struct. */ introComment = [comment copy]; DESTROY(comment); pos++; /* Skip '{' */ [fieldComments appendString: @"<deflist>"]; // TODO: We should put the parsed field into the doc index and // let AGSOutput generate the deflist. while (buffer[pos] != '}') { /* A comment belongs with the declaration following it, unless it begins on the same line as a declaration. Six combinations can be parsed: - fieldDecl, - <comment> fieldDecl, - fieldDecl, <comment> - <comment> fieldDecl, <comment> - fieldDecl } - <comment> fieldDecl } */ /* Parse any space and comments before the identifier into * 'comment' and get the identifier in 'ident'. */ ident = [self parseIdentifier]; /* Skip the left-hand side such as ' = aValue' */ while (pos < length && buffer[pos] != ',' && buffer[pos] != '}') { pos++; } if (buffer[pos] == ',') { /* Parse any more space on the same line as the identifier * appending it to the 'comment' ivar */ [self parseSpace: spaces]; pos++; } if (ident != nil) { foundFieldComment = YES; [fieldComments appendString: @"<term><em>"]; [fieldComments appendString: ident]; [fieldComments appendString: @"</em></term>"]; [fieldComments appendString: @"<desc>"]; // NOTE: We could add a 'Description forthcoming' if nil if (comment != nil) { [fieldComments appendString: comment]; } [fieldComments appendString: @"</desc>\n"]; } DESTROY(comment); } [fieldComments appendString: @"</deflist>"]; /* Restore the comment as initially parsed before -parseDeclaration was called and add the comments parsed per field into a deflist. */ ASSIGN(comment, introComment); if (foundFieldComment) { NSString *enumComment = [comment stringByAppendingFormat: @"\n\n%@", fieldComments]; ASSIGN(comment, enumComment); } pos++; /* Skip closing curly brace */ } [a addObject: s]; s = nil; } else { if (s == nil) { /* * If there is no identifier here, the line must have been * something like 'unsigned *length' so we must set the default * base type of 'int' */ [a addObject: @"int"]; } else if (needScalarType == YES && [s isEqualToString: @"char"] == NO && [s isEqualToString: @"int"] == NO) { /* * If we had something like 'unsigned' in the qualifiers, we must * have a 'char' or an 'int', and if we didn't find one we should * insert one and use what we found as the variable name. */ [a addObject: @"int"]; } else { [a addObject: s]; s = nil; // s used as baseType } } /* * Now build a string containing the base type in a standardised form. */ t = [NSMutableString new]; if ([a containsObject: @"const"] == YES) { [t appendString: @"const"]; [t appendString: @" "]; [a removeObject: @"const"]; baseConstant = YES; } else if ([a containsObject: @"volatile"] == YES) { [t appendString: @"volatile"]; [t appendString: @" "]; [a removeObject: @"volatile"]; } if ([a containsObject: @"signed"] == YES) { [t appendString: @"signed"]; [t appendString: @" "]; [a removeObject: @"signed"]; } else if ([a containsObject: @"unsigned"] == YES) { [t appendString: @"unsigned"]; [t appendString: @" "]; [a removeObject: @"unsigned"]; } if ([a containsObject: @"short"] == YES) { [t appendString: @"short"]; [t appendString: @" "]; [a removeObject: @"short"]; } else if ([a containsObject: @"long"] == YES) { unsigned c = [a count]; /* * There may be more than one 'long' in a type spec */ while (c-- > 0) { NSString *tmp = [a objectAtIndex: c]; if ([tmp isEqual: @"long"] == YES) { [t appendString: tmp]; [t appendString: @" "]; [a removeObjectAtIndex: c]; } } } if ([a count] != 1) { [self log: @"odd values in declaration base type - '%@'", a]; [t appendString: [a componentsJoinedByString: @" "]]; } else { [t appendString: [a objectAtIndex: 0]]; } [a removeAllObjects]; // Parsed base type /* * Handle protocol specification if necessary */ if ([self parseSpace] < length && buffer[pos] == '<') { NSString *p; do { pos++; p = [self parseIdentifier]; if (p != nil) { [a addObject: p]; } } while ([self parseSpace] < length && buffer[pos] == ','); pos++; [self parseSpace]; [a sortUsingSelector: @selector(compare:)]; [t appendString: @"<"]; [t appendString: [a componentsJoinedByString: @","]]; [t appendString: @">"]; [a removeAllObjects]; } [d setObject: t forKey: @"BaseType"]; RELEASE(t); /* * Set the 'Kind' of declaration ... one of 'Types', 'Functions', * 'Variables', or 'Constants' * We may override this later. */ if (isTypedef == YES) { [d setObject: @"Types" forKey: @"Kind"]; [d setObject: @"YES" forKey: @"Implemented"]; } else if (baseConstant == YES) { [d setObject: @"Constants" forKey: @"Kind"]; [d setObject: @"YES" forKey: @"Implemented"]; } else { [d setObject: @"Variables" forKey: @"Kind"]; } if (s == nil) { [self parseDeclaratorInto: d]; /* * There may have been '*' and 'const' applied to the declarator * which will change whether it is a constant or a variable, and * whether it is a pointer to something. * If the last thing to be applied was a '*' it is a variable * which points to a constant. If the last thing was 'const' * then it is a constant (and may be a pointer too). */ s = [d objectForKey: @"Prefix"]; if (s != nil) { NSRange r; r = [s rangeOfString: @"*" options: NSBackwardsSearch|NSLiteralSearch]; if (r.length > 0) { unsigned p = r.location; isPointer = YES; if (isTypedef == NO) { r = [s rangeOfString: @"const" options: NSBackwardsSearch|NSLiteralSearch]; if (r.length > 0 && r.location >= p) { [d setObject: @"Constants" forKey: @"Kind"]; } } } } } else { [d setObject: s forKey: @"Name"]; } if ([self parseSpace] < length) { if (buffer[pos] == '[') { NSMutableString *suffix; if ((suffix = [d objectForKey: @"Suffix"]) == nil) { suffix = [NSMutableString new]; [d setObject: suffix forKey: @"Suffix"]; RELEASE(suffix); } while (buffer[pos] == '[') { unsigned old = pos; if ([self skipArray] == old) { break; } [suffix appendString: @"[]"]; } } else if (buffer[pos] == '(') { [self parseArgsInto: d]; } } if ([d objectForKey: @"Args"] != nil) { /* * If the declaration looked like this int (*foo)() then * 'isPointer' will be YES and 'Suffix' will contain the * bracket after 'foo'. In this case, what we have is a * variable or constant pointer to a function. * Otherwise, we have a function declaration and the * 'Kind' should be set to 'function'. */ if (isPointer == NO || [d objectForKey: @"Suffix"] == nil) { [d setObject: @"Functions" forKey: @"Kind"]; isFunction = YES; } } if ([self parseSpace] < length) { if (inArgList == YES) { if (buffer[pos] == ')' || buffer[pos] == ',') { [arp drain]; return d; } else { [self log: @"Unexpected char (%c) in arg list", buffer[pos]]; [self skipStatement]; goto fail; } } else { if (isFunction == YES) { NSString *ident = [self parseIdentifier]; if ([ident isEqual: @"__attribute__"] == YES) { if ([self skipSpaces] < length && buffer[pos] == '(') { unsigned start = pos; NSString *attr; [self skipBlock]; // Skip the attributes attr = [NSString stringWithCharacters: buffer + start length: pos - start]; if ([attr rangeOfString: @"deprecated"].length > 0) { [self appendComment: @"<em>Warning</em> this is " @"<em>deprecated</em> and may be removed in " @"future versions" to: nil]; } } else { [self log: @"strange format function attributes"]; } } else if ([ident length] > 0) { [self log: @"ignoring '%@' in function declaration", ident]; } } if (buffer[pos] == '_') { NSString *ident = [self parseIdentifier]; if ([ident isEqualToString: @"__attribute__"] == YES) { [self skipSpaces]; if (pos < length && buffer[pos] == '(') { unsigned start = pos; NSString *attr; [self skipBlock]; attr = [NSString stringWithCharacters: buffer + start length: pos - start]; if ([attr rangeOfString: @"deprecated"].length > 0) { [self appendComment: @"<em>Warning</em> this is " @"<em>deprecated</em> and may be removed in " @"future versions" to: nil]; } [self skipSpaces]; } } else { [self log: @"Underscore is not from __attribute__"]; goto fail; } if (pos >= length) { [self log: @"Unexpected end of declaration"]; goto fail; } } if (buffer[pos] == ';') { [self skipStatement]; } else if (buffer[pos] == ',') { [self log: @"ignoring multiple comma separated declarations"]; [self skipStatement]; } else if (buffer[pos] == '=') { [self skipStatement]; } else if (buffer[pos] == '{') { /* * Inline functions may be implemented in the header. */ if (isFunction == YES) { [d setObject: @"YES" forKey: @"Implemented"]; } [self skipBlock]; } else if (buffer[pos] == '}') { pos++; // Ignore extraneous '}' [self skipSpaces]; } else { [self log: @"Unexpected char (%c) in declaration", buffer[pos]]; [self skipStatement]; goto fail; } /* * Read in any comment on the same line in case it * contains documentation for the declaration. */ if ([self skipSpaces] < length && buffer[pos] == '/') { [self parseComment]; } } if (comment != nil) { [self appendComment: comment to: d]; } DESTROY(comment); [arp drain]; if (inArgList == NO) { /* * This is a top-level declaration, so let's tidy up ready for * linking into the documentation tree. */ if ([d objectForKey: @"Name"] == nil) { NSString *t = [d objectForKey: @"BaseType"]; /* * Don't bother to warn about nameless enumerations. */ if (verbose == YES && [t isEqual: @"enum ..."] == NO) { [self log: @"parse declaration with no name - %@", d]; } return nil; } } [self setStandards: d]; return d; } else { [self log: @"unexpected end of data parsing declaration"]; } fail: DESTROY(comment); [arp drain]; return nil; } - (NSMutableDictionary*) parseFile: (NSString*)name isSource: (BOOL)isSource { NSString *token; NSMutableDictionary *nDecl; if (isSource == YES) { inHeader = NO; } else { inHeader = YES; } commentsRead = NO; ASSIGNCOPY(fileName, name); if (declared == nil) { ASSIGN(declared, [fileName lastPathComponent]); } /** * If this is parsing a header file (isSource == NO) then we reset the * list of known source files associated with the header before proceeding. */ [source removeAllObjects]; if (isSource == NO) { NSFileManager *mgr = [NSFileManager defaultManager]; NSString *path; [info setObject: fileName forKey: @"Header"]; [source removeAllObjects]; /** * We initially assume that the location of a source file is the * same as the header, but if there is no file at that location, * we expect the source to be in the documentatation directory * or the current directory instead. */ path = [fileName stringByDeletingPathExtension]; path = [path stringByAppendingPathExtension: @"m"]; if ([mgr isReadableFileAtPath: path] == NO) { path = [path lastPathComponent]; if ([mgr isReadableFileAtPath: path] == NO) { NSUserDefaults *defs; NSString *ddir; defs = [NSUserDefaults standardUserDefaults]; ddir = [defs stringForKey: @"DocumentationDirectory"]; if ([ddir length] > 0) { path = [ddir stringByAppendingPathComponent: path]; if ([mgr isReadableFileAtPath: path] == NO) { path = nil; // No default source file found. } } else { path = nil; // No default source file found. } } } if (path != nil) { [source addObject: path]; } } DESTROY(unitName); DESTROY(itemName); DESTROY(comment); [self setupBuffer]; while ([self parseSpace] < length) { unichar c = buffer[pos++]; switch (c) { case '#': /* * Some preprocessor directive ... must be on one line ... skip * past it and delete any comment accumulated while doing so. */ [self parsePreprocessor]; DESTROY(comment); break; case '@': token = [self parseIdentifier]; if (token != nil) { if ([token isEqual: @"interface"] == YES) { if (isSource == YES) { [self skipUnit]; DESTROY(comment); } else { [self parseInterface]; } } else if ([token isEqual: @"protocol"] == YES) { if (isSource == YES) { [self skipUnit]; DESTROY(comment); } else { [self parseProtocol]; } } else if ([token isEqual: @"implementation"] == YES) { if (isSource == YES) { [self parseImplementation]; } else { [self skipUnit]; DESTROY(comment); } } else { [self skipStatementLine]; } } break; default: /* * Must be some sort of declaration ... */ pos--; nDecl = [self parseDeclaration]; if (nDecl != nil) { NSString *name = [nDecl objectForKey: @"Name"]; NSString *kind = [nDecl objectForKey: @"Kind"]; NSMutableDictionary *dict = [info objectForKey: kind]; if (isSource == NO) { /* * Ensure that we have an entry for this declaration. */ if (dict == nil) { dict = [NSMutableDictionary new]; [info setObject: dict forKey: kind]; RELEASE(dict); } [dict setObject: nDecl forKey: name]; } else { NSMutableDictionary *oDecl = [dict objectForKey: name]; if (oDecl != nil) { NSString *oc = [oDecl objectForKey: @"Comment"]; NSString *nc = [nDecl objectForKey: @"Comment"]; /* * If the old comment from the header parsing is * the same as the new comment from the source * parsing, assume we parsed the same file as both * source and header ... otherwise append the new * comment. */ if ([oc isEqual: nc] == NO) { [self appendComment: nc to: oDecl]; } [oDecl setObject: @"YES" forKey: @"Implemented"]; if ([kind isEqualToString: @"Functions"] == YES) { NSArray *a1 = [oDecl objectForKey: @"Args"]; NSArray *a2 = [nDecl objectForKey: @"Args"]; if ([a1 isEqual: a2] == NO) { [self log: @"Function %@ args mismatch - " @"%@ %@", name, a1, a2]; } /* * A main function is not documented as a * function, but as a special case its * comments are added to the 'front' * section of the documentation. */ if ([name isEqual: @"main"] == YES) { NSString *c; c = [oDecl objectForKey: @"Comment"]; if (c != nil) { [self addMain: c]; } [dict removeObjectForKey: name]; } } } } } break; } } return info; } - (NSMutableDictionary*) parseImplementation { NSString *nc = nil; NSString *name; NSString *base = nil; NSString *category = nil; NSDictionary *methods = nil; NSMutableDictionary *d; NSMutableDictionary *dict = nil; CREATE_AUTORELEASE_POOL(arp); /* * Record any class documentation for this class */ nc = AUTORELEASE(comment); comment = nil; if ((name = [self parseIdentifier]) == nil || [self parseSpace] >= length) { [self log: @"implementation with bad name"]; goto fail; } ASSIGNCOPY(unitName, name); /* * After the class name, we may have a category name or * a base class, but not both. */ if (buffer[pos] == '(') { pos++; if ((category = [self parseIdentifier]) == nil || [self parseSpace] >= length || buffer[pos++] != ')' || [self parseSpace] >= length) { [self log: @"interface with bad category"]; goto fail; } name = [name stringByAppendingFormat: @"(%@)", category]; ASSIGN(unitName, name); } else if (buffer[pos] == ':') { pos++; if ((base = [self parseIdentifier]) == nil || [self parseSpace] >= length) { [self log: @"@interface with bad base class"]; goto fail; } } if (category == nil) { d = [info objectForKey: @"Classes"]; } else { d = [info objectForKey: @"Categories"]; } dict = [d objectForKey: unitName]; if (dict == nil) { /* * If the implementation found does not correspond to an * interface found in the header file, it should not be * documented, and we skip it. */ [self skipUnit]; DESTROY(comment); [arp drain]; return [NSMutableDictionary dictionary]; } else { NSString *oc = [dict objectForKey: @"Comment"]; [dict setObject: @"YES" forKey: @"Implemented"]; /* * Append any comment we have for this ... if it's not just a copy * because we've parsed the same file twice. */ if ([oc isEqual: nc] == NO) { [self appendComment: nc to: dict]; } /* * Update base class if necessary. */ if (base != nil) { if ([base isEqual: [dict objectForKey: @"BaseClass"]] == NO) { [self log: @"implementation base class differs from interface"]; } [dict setObject: base forKey: @"BaseClass"]; } } methods = [self parseMethodsAreDeclarations: NO]; if (methods != nil && [methods count] > 0) { // [dict setObject: methods forKey: @"Methods"]; } // [self log: @"Found implementation %@", dict]; DESTROY(unitName); DESTROY(comment); [arp drain]; return dict; fail: DESTROY(unitName); DESTROY(comment); [arp drain]; return nil; } - (NSMutableDictionary*) parseInterface { NSString *name; NSString *base = nil; NSString *category = nil; NSDictionary *methods = nil; NSMutableDictionary *d; NSMutableDictionary *dict; CREATE_AUTORELEASE_POOL(arp); dict = [NSMutableDictionary dictionaryWithCapacity: 8]; /* * Record any class documentation for this class */ if (comment != nil) { [self appendComment: comment to: dict]; DESTROY(comment); } if ((name = [self parseIdentifier]) == nil || [self parseSpace] >= length) { [self log: @"interface with bad name"]; goto fail; } ASSIGNCOPY(unitName, name); [dict setObject: @"class" forKey: @"Type"]; [self setStandards: dict]; /* * After the class name, we may have a category name or * a base class, but not both. */ if (buffer[pos] == '(') { pos++; if ((category = [self parseIdentifier]) == nil || [self parseSpace] >= length || buffer[pos++] != ')' || [self parseSpace] >= length) { [self log: @"interface with bad category"]; goto fail; } [dict setObject: category forKey: @"Category"]; [dict setObject: name forKey: @"BaseClass"]; name = [name stringByAppendingFormat: @"(%@)", category]; ASSIGN(unitName, name); [dict setObject: @"category" forKey: @"Type"]; if ([category length] >= 7 && [category compare: @"Private" options: NSCaseInsensitiveSearch range: NSMakeRange(0, 7)] == NSOrderedSame) { NSString *c; c = @"<em>Warning</em> this category is <em>private</em>, which " @"means that the methods are for internal use by the package. " @"You should not use them in external code."; [self appendComment: c to: dict]; } } else if (buffer[pos] == ':') { pos++; if ((base = [self parseIdentifier]) == nil || [self parseSpace] >= length) { [self log: @"@interface with bad base class"]; goto fail; } [dict setObject: base forKey: @"BaseClass"]; } [dict setObject: name forKey: @"Name"]; /* * Interfaces or categories may conform to protocols. */ if (buffer[pos] == '<') { NSArray *protocols = [self parseProtocolList]; if (protocols == nil) { goto fail; } else if ([protocols count] > 0) { [dict setObject: protocols forKey: @"Protocols"]; } } /* * Interfaces may have instance variables, but categories may not. */ if (buffer[pos] == '{' && category == nil) { NSDictionary *ivars = [self parseInstanceVariables]; if (ivars == nil) { goto fail; } else if ([ivars count] > 0) { [dict setObject: ivars forKey: @"InstanceVariables"]; } DESTROY(comment); // Ignore any ivar comments. } methods = [self parseMethodsAreDeclarations: YES]; if (methods != nil && [methods count] > 0) { [dict setObject: methods forKey: @"Methods"]; } [dict setObject: declared forKey: @"Declared"]; if (category == nil) { d = [info objectForKey: @"Classes"]; if (d == nil) { d = [[NSMutableDictionary alloc] initWithCapacity: 4]; [info setObject: d forKey: @"Classes"]; RELEASE(d); } } else { d = [info objectForKey: @"Categories"]; if (d == nil) { d = [[NSMutableDictionary alloc] initWithCapacity: 4]; [info setObject: d forKey: @"Categories"]; RELEASE(d); } } [d setObject: dict forKey: unitName]; // [self log: @"Found interface %@", dict]; DESTROY(unitName); DESTROY(comment); [arp drain]; return dict; fail: DESTROY(unitName); DESTROY(comment); [arp drain]; return nil; } /** * Attempt to parse an identifier/keyword (with optional whitespace in * front of it). Perform mappings using the wordMap dictionary. If a * mapping produces an empty string, we treat it as if we had read * whitespace and try again. * If we read end of data, or anything which is invalid inside an * identifier, we return nil. * If we read a GS_GENERIC... macro, we return its first argument. */ - (NSString*) parseIdentifier { unsigned start; try: [self parseSpace]; if (pos >= length || [identStart characterIsMember: buffer[pos]] == NO) { return nil; } start = pos; while (pos < length) { if ([identifier characterIsMember: buffer[pos]] == NO) { NSString *tmp; NSString *val; tmp = [[NSString alloc] initWithCharacters: &buffer[start] length: pos - start]; if ([tmp isEqual: @"GS_GENERIC_CLASS"] || [tmp isEqual: @"GS_GENERIC_TYPE"]) { [self skipSpaces]; if (pos < length && buffer[pos] == '(') { pos++; /* Found a GS_GENERIC_ macro ... the first * identifier inside the macro arguments is the * name we want to return. */ RELEASE(tmp); tmp = RETAIN([self parseIdentifier]); while (pos < length) { if (buffer[pos++] == ')') { break; } } } } val = [wordMap objectForKey: tmp]; if (val == nil) { return AUTORELEASE(tmp); // No mapping found. } RELEASE(tmp); if ([val length] > 0) { if ([val isEqualToString: @"//"] == YES) { [self skipToEndOfLine]; return [self parseIdentifier]; } return val; // Got mapped identifier. } goto try; // Mapping removed the identifier. } pos++; } return nil; } - (NSMutableDictionary*) parseInstanceVariables { NSString *validity = @"protected"; NSMutableDictionary *ivars; BOOL shouldDocument = documentInstanceVariables; DESTROY(comment); inInstanceVariables = YES; ivars = [NSMutableDictionary dictionaryWithCapacity: 8]; pos++; while ([self parseSpace] < length && buffer[pos] != '}') { if (buffer[pos] == '@') { NSString *token; pos++; if ((token = [self parseIdentifier]) == nil || [self parseSpace] >= length) { [self log: @"interface with bad validity directive"]; goto fail; } if ([token isEqual: @"private"] == YES) { ASSIGN(validity, token); shouldDocument = documentInstanceVariables && documentAllInstanceVariables; } else if ([token isEqual: @"protected"] == YES) { ASSIGN(validity, token); shouldDocument = documentInstanceVariables; } else if ([token isEqual: @"package"] == YES) { ASSIGN(validity, token); shouldDocument = documentInstanceVariables; } else if ([token isEqual: @"public"] == YES) { ASSIGN(validity, token); shouldDocument = documentInstanceVariables; } else { [self log: @"interface with bad validity (%@)", token]; goto fail; } } else if (buffer[pos] == '#') { [self parsePreprocessor]; // Ignore preprocessor directive. DESTROY(comment); } else if (shouldDocument == YES) { NSMutableDictionary *iv = [self parseDeclaration]; if (iv != nil) { if ([validity isEqual: @"private"] == NO) { NSString *n = [iv objectForKey: @"Name"]; if ([n hasPrefix: @"_"] == YES) { NSString *c; c = @"<em>Warning</em> the underscore at the start of " @"the name of this instance variable indicates that, " @"even though it is not technically <em>private</em>, " @"it is intended for internal use within the package, " @"and you should not use the variable in other code."; [self appendComment: c to: iv]; } } [iv setObject: validity forKey: @"Validity"]; [ivars setObject: iv forKey: [iv objectForKey: @"Name"]]; } } else { [self skipStatement]; } } inInstanceVariables = NO; if (pos >= length) { [self log: @"interface with bad instance variables"]; return nil; } pos++; // Step past closing bracket. return ivars; fail: DESTROY(comment); inInstanceVariables = NO; return nil; } /** * Parse a macro definition ... we are expected to have read #define already */ - (NSMutableDictionary*) parseMacro { NSMutableDictionary *dict; NSMutableArray *a = nil; NSString *name; dict = [[NSMutableDictionary alloc] initWithCapacity: 4]; [self parseSpace: spaces]; name = [self parseIdentifier]; if (nil == name) { // [self log: @"Missing name in #define"]; return nil; } [self parseSpace: spaces]; if (pos < length && buffer[pos] == '(') { a = [[NSMutableArray alloc] initWithCapacity: 4]; pos++; // Step past opening '(' while ([self parseSpace: spaces] < length && buffer[pos] != ')') { if (buffer[pos] == ',') { pos++; } else if (buffer[pos] == '.') { pos += 3; // Skip '...' [dict setObject: @"YES" forKey: @"VarArgs"]; } else { NSString *s; s = [self parseIdentifier]; if (s == nil) { break; } [a addObject: s]; } } if (pos < length) { pos++; // Step past closing ')' } } /* * Now parse macro body (to end of line) gathering any comments. */ [self parseSpace: spaces]; while (pos < length) { unsigned c = buffer[pos]; if (c == '\n') { break; } else if (c == '/') { unsigned save = pos; if ([self parseComment] == save) { pos++; // Step past '/' } } else if (c == '\'' || c == '"') { [self skipLiteral]; } else if ([spaces characterIsMember: c] == NO) { pos++; } else { [self parseSpace: spaces]; } } /** * It's common to have macros which don't need commenting ... * like the ones used to protect a header against multiple * inclusion for instance. For this reason, we ignore any * macro which is not preceded by a documentation comment. */ if ([comment length] > 0) { [dict setObject: name forKey: @"Name"]; if (a != nil) { [dict setObject: a forKey: @"Args"]; } /* A macro is implemented as soon as it is defined. */ [dict setObject: @"YES" forKey: @"Implemented"]; [self appendComment: comment to: dict]; } else { DESTROY(dict); } RELEASE(a); [self setStandards: dict]; return AUTORELEASE(dict); } - (NSMutableDictionary*) parseMethodIsDeclaration: (BOOL)flag { CREATE_AUTORELEASE_POOL(arp); NSMutableDictionary *method; NSMutableString *mname; NSString *token; NSMutableArray *types = nil; NSMutableArray *args = nil; NSMutableArray *sels = [NSMutableArray arrayWithCapacity: 2]; unichar term; method = [[NSMutableDictionary alloc] initWithCapacity: 4]; if (buffer[pos++] == '-') { mname = [NSMutableString stringWithUTF8String: "-"]; } else { mname = [NSMutableString stringWithUTF8String: "+"]; } [method setObject: sels forKey: @"Sels"]; // Parts of selector. /* * Parse return type ... defaults to 'id' */ if ([self parseSpace] >= length) { [self log: @"error parsing method return type"]; goto fail; } if (buffer[pos] == '(') { if ((token = [self parseMethodType]) == nil || [self parseSpace] >= length) { [self log: @"error parsing method return type"]; goto fail; } [method setObject: token forKey: @"ReturnType"]; } else { [method setObject: @"id" forKey: @"ReturnType"]; } if (flag == YES) { term = ';'; } else { term = '{'; } while (buffer[pos] != term) { token = [self parseIdentifier]; if ([token isEqual: @"__attribute__"] == YES) { if ([self skipSpaces] < length && buffer[pos] == '(') { unsigned start = pos; NSString *attr; [self skipBlock]; // Skip the attributes attr = [NSString stringWithCharacters: buffer + start length: pos - start]; if ([attr rangeOfString: @"deprecated"].length > 0) { [self appendComment: @"<em>Warning</em> this is " @"<em>deprecated</em> and may be removed in " @"future versions" to: nil]; } } else { [self log: @"strange format function attributes"]; } continue; } if ([self parseSpace] >= length) { [self log: @"error at method name component"]; goto fail; } if (buffer[pos] == ':') { NSString *arg; NSString *type = @"id"; pos++; if (token == nil) { [sels addObject: @":"]; } else { [mname appendString: token]; [sels addObject: [token stringByAppendingString: @":"]]; } [mname appendString: @":"]; if ([self parseSpace] >= length) { [self log: @"error parsing method argument"]; goto fail; } if (buffer[pos] == '(') { if ((type = [self parseMethodType]) == nil || [self parseSpace] >= length) { [self log: @"error parsing method arguument type"]; goto fail; } } if ((arg = [self parseIdentifier]) == nil || [self parseSpace] >= length) { [self log: @"error parsing method argument name"]; goto fail; } if (types == nil) { types = [NSMutableArray arrayWithCapacity: 2]; [method setObject: types forKey: @"Types"]; } [types addObject: type]; if (args == nil) { args = [NSMutableArray arrayWithCapacity: 2]; [method setObject: args forKey: @"Args"]; } [args addObject: arg]; if (buffer[pos] == ',') { [method setObject: @"YES" forKey: @"VarArgs"]; [mname appendString: @",..."]; while ([self parseSpace] < length) { if (buffer[pos] == term) { break; } pos++; } if (buffer[pos] != term) { [self log: @"error skipping varargs"]; goto fail; } } } else if (token != nil) { [sels addObject: token]; [mname appendString: token]; if (buffer[pos] != term) { unsigned saved = pos; /* * As a special case, try to cope with a method name separated * from its body by a semicolon ... a common bug since the * compiler doesn't pick it up! */ if (term == '{' && buffer[pos] == ';') { pos++; if ([self parseSpace] >= length || buffer[pos] != term) { pos = saved; } } if (buffer[pos] == term) { [self log: @"error in method definition ... " @"semicolon after name"]; } else { [self log: @"error parsing method name"]; goto fail; } } } else { unsigned saved = pos; /* * As a special case, try to cope with a method name separated * from its body by a semicolon ... a common bug since the * compiler doesn't pick it up! */ if (term == '{' && buffer[pos] == ';') { pos++; if ([self parseSpace] >= length || buffer[pos] != term) { pos = saved; } } if (buffer[pos] == term) { [self log: @"error in method definition ... " @"semicolon after name"]; } else { [self log: @"error parsing method name"]; goto fail; } } } [method setObject: mname forKey: @"Name"]; if (flag == YES) { [self setStandards: method]; } ASSIGNCOPY(itemName, mname); if (term == ';') { /* * Skip past the closing semicolon of the method declaration, * and read in any comment on the same line in case it * contains documentation for the method. */ pos++; if ([self skipSpaces] < length && buffer[pos] == '/') { [self parseComment]; } } else if (term == '{') { BOOL isEmpty; [self skipBlock: &isEmpty]; if (isEmpty == YES) { [method setObject: @"YES" forKey: @"Empty"]; } else { [method setObject: @"NO" forKey: @"Empty"]; } } /* * Store any available documentation information in the method. * If the method is already documented, append new information. */ if (comment != nil) { [self appendComment: comment to: method]; DESTROY(comment); } if (flag == YES && [itemName length] > 1 && [itemName characterAtIndex: 1] == '_') { NSString *c; c = @"<em>Warning</em> the underscore at the start of the name " @"of this method indicates that it is private, for internal use only, " @" and you should not use the method in your code."; [self appendComment: c to: method]; } DESTROY(itemName); [arp drain]; IF_NO_ARC([method autorelease];) return method; fail: DESTROY(itemName); DESTROY(comment); [arp drain]; RELEASE(method); return nil; } - (void) addOrderedSymbolDeclaration: (NSString *)aMethodOrFunc toUnit: (NSString *)aUnitName { NSMutableArray *orderedSymbolDecls = [orderedSymbolDeclsByUnit objectForKey: aUnitName]; if (orderedSymbolDecls == nil) { orderedSymbolDecls = [NSMutableArray array]; [orderedSymbolDeclsByUnit setObject: orderedSymbolDecls forKey: aUnitName]; } [orderedSymbolDecls addObject: aMethodOrFunc]; } - (NSMutableDictionary*) parseMethodsAreDeclarations: (BOOL)flag { NSMutableDictionary *methods; NSMutableDictionary *method; NSMutableDictionary *exist; NSString *token; BOOL optionalMethods = NO; if (flag == YES) { methods = [NSMutableDictionary dictionaryWithCapacity: 8]; } else { /* * Get a list of known methods. */ if ([unitName hasPrefix: @"("]) { exist = nil; // A protocol ... no method implementations. } else if ([unitName hasSuffix: @")"]) { exist = [info objectForKey: @"Categories"]; } else { exist = [info objectForKey: @"Classes"]; } exist = [exist objectForKey: unitName]; exist = [exist objectForKey: @"Methods"]; /* * If there were no methods in the interface, we can't * document any now so we may as well skip to the end. */ if (exist == nil) { [self skipUnit]; DESTROY(comment); return [NSMutableDictionary dictionary]; // Empty dictionary. } methods = exist; } while ([self parseSpace] < length) { unichar c = buffer[pos++]; switch (c) { case '-': case '+': pos--; method = [self parseMethodIsDeclaration: flag]; if (method == nil) { return nil; } if (YES == optionalMethods) { [method setObject: @"YES" forKey: @"Optional"]; } token = [method objectForKey: @"Name"]; if (flag == YES) { /* * Just record the method. */ [methods setObject: method forKey: token]; [self addOrderedSymbolDeclaration: token toUnit: unitName]; } else if ((exist = [methods objectForKey: token]) != nil) { NSArray *a0; NSArray *a1; NSString *c0; NSString *c1; NSString *e; /* * Merge info from implementation into existing version. */ a0 = [exist objectForKey: @"Args"]; a1 = [method objectForKey: @"Args"]; if (a0 != nil) { if ([a0 isEqual: a1] == NO) { ASSIGNCOPY(itemName, token); [self log: @"method args in interface %@ don't match " @"those in implementation %@", a0, a1]; DESTROY(itemName); [exist setObject: a1 forKey: @"Args"]; } } a0 = [exist objectForKey: @"Types"]; a1 = [method objectForKey: @"Types"]; if (a0 != nil) { if ([a0 isEqual: a1] == NO) { ASSIGNCOPY(itemName, token); [self log: @"method types in interface %@ don't match " @"those in implementation %@", a0, a1]; DESTROY(itemName); [exist setObject: a1 forKey: @"Types"]; } } /* * If the old comment from the header parsing is * the same as the new comment from the source * parsing, assume we parsed the same file as both * source and header ... otherwise append the new * comment. */ c0 = [exist objectForKey: @"Comment"]; c1 = [method objectForKey: @"Comment"]; if ([c0 isEqual: c1] == NO) { [self appendComment: c1 to: exist]; } [exist setObject: @"YES" forKey: @"Implemented"]; /* * Record if the implementation is not empty. */ e = [method objectForKey: @"Empty"]; if (e != nil) { [exist setObject: e forKey: @"Empty"]; } } DESTROY(comment); // Don't want this. break; case '@': if ((token = [self parseIdentifier]) == nil) { [self log: @"method list with error after '@'"]; [self skipStatementLine]; return nil; } if ([token isEqual: @"end"] == YES) { return methods; } else if ([token isEqual: @"optional"] == YES) { /* marking remaining methods as optional. */ optionalMethods = YES; continue; } else if ([token isEqual: @"required"] == YES) { /* marking remaining methods as required. */ optionalMethods = NO; continue; } else if ([token isEqual: @"class"] == YES) { /* * Pre-declaration of one or more classes ... rather like a * normal C statement, it ends with a semicolon. */ [self skipStatementLine]; } else { [self log: @"@method list with unknown directive '%@'", token]; [self skipStatementLine]; } DESTROY(comment); // Don't want this. break; case '#': /* * Some preprocessor directive ... must be on one line ... skip * past it and delete any comment accumulated while doing so. */ [self parsePreprocessor]; DESTROY(comment); break; default: /* * Some statement other than a method ... skip and delete comments. */ if (flag == YES) { [self log: @"interface with bogus line ... we expect methods"]; [self skipStatementLine]; } else { pos--; [self parseDeclaration]; } DESTROY(comment); // Don't want this. break; } } [self log: @"method list prematurely ended"]; return nil; } - (NSString*) parseMethodType { unichar *start; unichar *ptr; unsigned nest = 0; pos++; if ([self parseSpace] >= length) { return nil; } ptr = start = &buffer[pos]; while (pos < length) { unichar c = buffer[pos++]; if (c == '(') { /* * Remove any whitespace before an opening bracket. */ if (ptr > start && ptr[-1] == ' ') { ptr--; } *ptr++ = '('; nest++; } else if (c == ')') { /* * Remove any whitespace before a closing bracket. */ if (ptr > start && ptr[-1] == ' ') { ptr--; } if (nest > 0) { *ptr++ = ')'; nest--; } else { break; } } else if ([spacenl characterIsMember: c] == NO) { /* * If this character is not part of a name, and the previous * character written was a space, we know we can get rid of * the space to standardise the type format to use a minimal * number of spaces. */ if (ptr > start && ptr[-1] == ' ') { if ([identifier characterIsMember: c] == NO) { ptr--; } } *ptr++ = c; } else { /* * Don't retain whitespace if we know we don't need it * because the previous character was not part of a name. */ if (ptr > start && [identifier characterIsMember: ptr[-1]] == YES) { *ptr++ = ' '; } } } if ([self parseSpace] >= length) { return nil; } /* * Strip trailing space ... leading space we never copied in the * first place. */ if (ptr > start && [spacenl characterIsMember: ptr[-1]] == YES) { ptr--; } if (ptr > start) { return [NSString stringWithCharacters: start length: ptr - start]; } else { return nil; } } /** * Parse a preprocessor statement, handling preprocessor * conditionals in a rudimentary way. We keep track of the * level of conditional nesting, and we also track the use of * #ifdef and #ifndef with some well-known constants to tell * us which standards are currently supported. */ - (unsigned) parsePreprocessor { [self parseSpace: spaces]; if (pos < length && buffer[pos] != '\n') { NSString *directive = [self parseIdentifier]; if ([directive isEqual: @"define"] == YES && inHeader == YES) { NSMutableDictionary *defn; defn = [self parseMacro]; if (defn != nil) { NSMutableDictionary *dict = [info objectForKey: @"Macros"]; NSString *name = [defn objectForKey: @"Name"]; NSMutableDictionary *odef; odef = [dict objectForKey: name]; if (odef == nil) { if (dict == nil) { dict = [[NSMutableDictionary alloc] initWithCapacity: 8]; [info setObject: dict forKey: @"Macros"]; RELEASE(dict); } [dict setObject: defn forKey: name]; } else { NSString *oc = [odef objectForKey: @"Comment"]; NSString *nc = [defn objectForKey: @"Comment"]; /* * If the old comment from the header parsing is * the same as the new comment from the source * parsing, assume we parsed the same file as both * source and header ... otherwise append the new * comment. */ if ([oc isEqual: nc] == NO) { [self appendComment: nc to: odef]; } } } } else if ([directive isEqual: @"endif"] == YES) { if ([ifStack count] <= 1) { [self log: @"Unexpected #endif (no matching #if)"]; } else { [ifStack removeLastObject]; } } else if ([directive isEqual: @"elif"] == YES) { if ([ifStack count] <= 1) { [self log: @"Unexpected #else (no matching #if)"]; } else { [ifStack removeLastObject]; [ifStack addObject: [ifStack lastObject]]; } } else if ([directive isEqual: @"else"] == YES) { if ([ifStack count] <= 1) { [self log: @"Unexpected #else (no matching #if)"]; } else { [ifStack removeLastObject]; [ifStack addObject: [ifStack lastObject]]; } } else if ([directive isEqual: @"if"] == YES) { NSMutableDictionary *top; NSString *arg; BOOL hadOstep = NO; BOOL hadGstep = NO; top = [[ifStack lastObject] mutableCopy]; while ((arg = [self parseIdentifier]) != nil) { BOOL openstep; NSString *ver; if ([arg isEqual: @"OS_API_VERSION"] == YES) { openstep = YES; if (hadOstep == YES) { [self log: @"multiple grouped OS_API_VERSION() calls"]; return [self skipRemainderOfLine]; } hadOstep = YES; [top removeObjectForKey: @"ovadd"]; [top removeObjectForKey: @"ovdep"]; [top removeObjectForKey: @"ovrem"]; } else if ([arg isEqual: @"GS_API_VERSION"] == YES) { openstep = NO; if (hadGstep == YES) { [self log: @"multiple grouped GS_API_VERSION() calls"]; return [self skipRemainderOfLine]; } hadGstep = YES; [top removeObjectForKey: @"gvadd"]; [top removeObjectForKey: @"gvdep"]; [top removeObjectForKey: @"gvrem"]; } else { break; } [self parseSpace: spaces]; if (pos < length && buffer[pos] == '(') { pos++; } ver = [self parseVersion]; if ([ver length] == 0) { ver = @"1.0.0"; } if (openstep) { [top setObject: ver forKey: @"ovadd"]; } else { [top setObject: ver forKey: @"gvadd"]; } [self parseSpace: spaces]; if (pos < length && buffer[pos] == ',') { pos++; } ver = [self parseVersion]; if ([ver length] == 0) { ver = @"99.99.99"; } if ([ver isEqualToString: @"99.99.99"] == NO) { if (openstep) { [top setObject: ver forKey: @"ovrem"]; } else { [top setObject: ver forKey: @"gvrem"]; } } [self parseSpace: spaces]; if (pos < length && buffer[pos] == ',') { pos++; ver = [self parseVersion]; if ([ver length] == 0) { ver = @"99.99.99"; } if ([ver isEqualToString: @"99.99.99"] == NO) { if (openstep) { [top setObject: ver forKey: @"ovdep"]; } else { [top setObject: ver forKey: @"gvdep"]; } } [self parseSpace: spaces]; } if (pos < length && buffer[pos] == ')') { pos++; } [self parseSpace: spaces]; if (pos < length-1 && buffer[pos] == '&' && buffer[pos+1] == '&') { pos += 2; } else { break; // may only join version macros with && } } [ifStack addObject: top]; RELEASE(top); } else if ([directive hasPrefix: @"if"] == YES) { BOOL isIfDef = [directive isEqual: @"ifdef"]; [self parseSpace: spaces]; if (pos < length && buffer[pos] != '\n') { NSMutableDictionary *top; NSString *arg; top = [[ifStack lastObject] mutableCopy]; arg = [self parseIdentifier]; if ([arg isEqual: @"NO_GNUSTEP"] == YES) { if (isIfDef == YES) { [self log: @"Unexpected #ifdef NO_GNUSTEP (nonsense)"]; } else { [top removeObjectForKey: @"MacOS-X"]; [top setObject: @"NotMacOS-X" forKey: @"NotMacOS-X"]; [top removeObjectForKey: @"OpenStep"]; [top setObject: @"NotOpenStep" forKey: @"NotOpenStep"]; } } else if ([arg isEqual: @"STRICT_MACOS_X"] == YES) { if (isIfDef == YES) { [top removeObjectForKey: @"NotMacOS-X"]; [top setObject: @"MacOS-X" forKey: @"MacOS-X"]; } else { [top removeObjectForKey: @"MacOS-X"]; [top setObject: @"NotMacOS-X" forKey: @"NotMacOS-X"]; } } else if ([arg isEqual: @"STRICT_OPENSTEP"] == YES) { if (isIfDef == YES) { [top removeObjectForKey: @"NotOpenStep"]; [top setObject: @"OpenStep" forKey: @"OpenStep"]; } else { [top removeObjectForKey: @"OpenStep"]; [top setObject: @"NotOpenStep" forKey: @"NotOpenStep"]; } } [ifStack addObject: top]; RELEASE(top); } } } return [self skipRemainderOfLine]; } - (NSMutableDictionary*) parseProtocol { NSString *name; NSDictionary *methods = nil; NSMutableDictionary *dict; NSMutableDictionary *d; CREATE_AUTORELEASE_POOL(arp); dict = [[NSMutableDictionary alloc] initWithCapacity: 8]; /* * Record any protocol documentation for this protocol */ if (comment != nil) { [dict setObject: comment forKey: @"Comment"]; DESTROY(comment); } if ((name = [self parseIdentifier]) == nil || [self parseSpace] >= length) { [self log: @"protocol with bad name"]; goto fail; } /* * If there is a comma, this must be a forward declaration of a list * of protocols ... so we can ignore it. Otherwise, if we found a * semicolon, we have a single forward declaration to ignore. */ if (pos < length && (buffer[pos] == ',' || buffer[pos] == ';')) { [self skipStatement]; return nil; } [dict setObject: name forKey: @"Name"]; [self setStandards: dict]; DESTROY(unitName); unitName = [[NSString alloc] initWithFormat: @"(%@)", name]; /* * Protocols may themselves conform to protocols. */ if (buffer[pos] == '<') { NSArray *protocols = [self parseProtocolList]; if (protocols == nil) { goto fail; } else if ([protocols count] > 0) { [dict setObject: protocols forKey: @"Protocols"]; } } [dict setObject: @"protocol" forKey: @"Type"]; methods = [self parseMethodsAreDeclarations: YES]; if (methods != nil && [methods count] > 0) { NSEnumerator *e = [methods objectEnumerator]; NSMutableDictionary *m; /* * Mark methods as implemented because protocol methods have no * implementation separate from their declaration. */ while ((m = [e nextObject]) != nil) { [m setObject: @"YES" forKey: @"Implemented"]; } [dict setObject: methods forKey: @"Methods"]; } [dict setObject: declared forKey: @"Declared"]; d = [info objectForKey: @"Protocols"]; if (d == nil) { d = [[NSMutableDictionary alloc] initWithCapacity: 4]; [info setObject: d forKey: @"Protocols"]; RELEASE(d); } /* * A protocol has no separate implementation, so mark it as implemented. */ [dict setObject: @"YES" forKey: @"Implemented"]; [d setObject: dict forKey: unitName]; // [self log: @"Found protocol %@", dict]; DESTROY(unitName); DESTROY(comment); [arp drain]; IF_NO_ARC([dict autorelease];) return dict; fail: DESTROY(unitName); DESTROY(comment); [arp drain]; RELEASE(dict); return nil; } - (NSMutableArray*) parseProtocolList { NSMutableArray *protocols; NSString *p; protocols = [NSMutableArray arrayWithCapacity: 2]; pos++; while ((p = [self parseIdentifier]) != nil && [self parseSpace] < length) { if ([protocols containsObject: p] == NO) { [protocols addObject: p]; } if (buffer[pos] == ',') { pos++; } else { break; } } if (pos >= length || buffer[pos] != '>' || ++pos >= length || [self parseSpace] >= length || [protocols count] == 0) { [self log: @"bad protocol list"]; return nil; } return protocols; } /** * Skip past any whitespace characters (as defined by the supplied set) * including comments.<br /> * Calls parseComment if neccesary, ensuring that any documentation * in comments is appended to our 'comment' ivar. */ - (unsigned) parseSpace: (NSCharacterSet*)spaceSet { BOOL tryAgain; do { unsigned start; tryAgain = NO; while (pos < length) { unichar c = buffer[pos]; if (c == '/') { unsigned old = pos; if ([self parseComment] > old) { continue; // Found a comment ... act as if it was a space. } break; } if ([spaceSet characterIsMember: c] == NO) { break; // Not whitespace ... done. } pos++; // Step past space character. } start = pos; if (pos < length && [identifier characterIsMember: buffer[pos]] == YES) { while (pos < length) { if ([identifier characterIsMember: buffer[pos]] == NO) { NSString *tmp; NSString *val; tmp = [[NSString alloc] initWithCharacters: &buffer[start] length: pos - start]; if ([tmp isEqualToString: @"NS_FORMAT_ARGUMENT"] || [tmp isEqualToString: @"NS_FORMAT_FUNCTION"]) { /* These macros need to be skipped as they appear inside * method declarations. */ val = @""; [self skipSpaces]; [self skipBlock]; } else { val = [wordMap objectForKey: tmp]; } RELEASE(tmp); if (val == nil) { pos = start; // No mapping found } else if ([val length] > 0) { if ([val isEqualToString: @"//"] == YES) { [self skipToEndOfLine]; tryAgain = YES; } else { pos = start; // Not mapped to a comment. } } else { tryAgain = YES; // Identifier ignored. } break; } pos++; } } } while (tryAgain == YES); return pos; } - (unsigned) parseSpace { return [self parseSpace: spacenl]; } - (NSString*) parseVersion { static NSDictionary *known = nil; unsigned i; NSString *str; NSString *tmp; while (pos < length && [spaces characterIsMember: buffer[pos]] == YES) { pos++; } if (pos >= length || buffer[pos] == '\n') { return nil; } if (!isdigit(buffer[pos])) { str = [self parseIdentifier]; } else { i = pos; while (pos < length) { if (!isdigit(buffer[pos])) { break; } pos++; } str = [NSString stringWithCharacters: &buffer[i] length: pos - i]; } if (nil == known) { known = [[NSDictionary alloc] initWithObjectsAndKeys: @"0", @"GS_API_NONE", @"999999", @"GS_API_LATEST", @"10000", @"GS_API_OSSPEC", @"40000", @"GS_API_OPENSTEP", @"100000", @"GS_API_MACOSX", @"100100", @"MAC_OS_X_VERSION_10_1", @"100200", @"MAC_OS_X_VERSION_10_2", @"100300", @"MAC_OS_X_VERSION_10_3", @"100400", @"MAC_OS_X_VERSION_10_4", @"100500", @"MAC_OS_X_VERSION_10_5", @"100600", @"MAC_OS_X_VERSION_10_6", @"100700", @"MAC_OS_X_VERSION_10_7", @"100800", @"MAC_OS_X_VERSION_10_8", @"100800", @"MAC_OS_X_VERSION_10_8", nil]; } tmp = [known objectForKey: str]; if (nil != tmp) { str = tmp; } i = [str intValue]; return [NSString stringWithFormat: @"%d.%d.%d", i/10000, (i/100)%100, i%100]; } - (void) reset { [source removeAllObjects]; [info removeAllObjects]; haveOutput = NO; haveSource = NO; DESTROY(declared); DESTROY(comment); DESTROY(fileName); DESTROY(unitName); DESTROY(itemName); DESTROY(lines); buffer = 0; length = 0; pos = 0; } /** * Set the name of the file in which classes are to be documented as * being declared. The default value of this is the last part of the * path of the source file being parsed. */ - (void) setDeclared: (NSString*)name { ASSIGN(declared, name); } /** * This method is used to enable (or disable) documentation of all * instance variables. If it is turned off, only those instance * variables that are explicitly declared 'public' or 'protected' * will be documented. */ - (void) setDocumentAllInstanceVariables: (BOOL)flag { documentAllInstanceVariables = flag; } /** * This method is used to enable (or disable) documentation of instance * variables. If it is turned off, instance variables will not be documented. */ - (void) setDocumentInstanceVariables: (BOOL)flag { documentInstanceVariables = flag; } /** * Turn on or off parsing of preprocessor conditional compilation info * indicating the standards complied with. When this is turned on, we * assume that all standards are complied with by default.<br /> * You should only turn this on while parsing the GNUstep source code. */ - (void) setGenerateStandards: (BOOL)flag { if (flag == YES) { [ifStack replaceObjectAtIndex: 0 withObject: [NSDictionary dictionaryWithObjectsAndKeys: @"OpenStep", @"OpenStep", @"MacOS-X", @"MacOS-X", @"GNUstep", @"GNUstep", nil]]; } standards = flag; } /** * Store the current standards information derived from preprocessor * conditionals in the supplied dictionary ... this will be used by * the AGSOutput class to put standards markup in the gsdoc output. */ - (void) setStandards: (NSMutableDictionary*)dict { if (standards == YES) { NSDictionary *top = [ifStack lastObject]; if ([top count] > 0) { NSString *vInfo = nil; NSString *gvadd = [top objectForKey: @"gvadd"]; NSString *ovadd = [top objectForKey: @"ovadd"]; if (ovadd != nil || gvadd != nil) { NSMutableString *m = [NSMutableString stringWithCapacity: 64]; NSString *s; if (ovadd != nil) { [m appendFormat: @" ovadd=\"%@\"", ovadd]; if ((s = [top objectForKey: @"ovdep"]) != nil) { [m appendFormat: @" ovdep=\"%@\"", s]; } if ((s = [top objectForKey: @"ovrem"]) != nil) { [m appendFormat: @" ovrem=\"%@\"", s]; } } if (gvadd != nil) { [m appendFormat: @" gvadd=\"%@\"", gvadd]; if ((s = [top objectForKey: @"gvdep"]) != nil) { [m appendFormat: @" gvdep=\"%@\"", s]; } if ((s = [top objectForKey: @"gvrem"]) != nil) { [m appendFormat: @" gvrem=\"%@\"", s]; } } vInfo = m; } else if ([top objectForKey: @"NotOpenStep"] && [top objectForKey: @"NotMacOS-X"]) { vInfo = @" gvadd=\"0.0.0\""; // GNUstep } else if ([top objectForKey: @"NotOpenStep"] && ![top objectForKey: @"NotMacOS-X"]) { vInfo = @" ovadd=\"10.0.0\""; // MacOS-X } else if (![top objectForKey: @"NotOpenStep"] && [top objectForKey: @"NotMacOS-X"]) { vInfo = @" ovadd=\"1.0.0\" ovrem=\"4.0.0\""; // OpenStep only } else if ([top objectForKey: @"OpenStep"] && ![top objectForKey: @"NotMacOS-X"]) { vInfo = @" ovadd=\"1.0.0\""; // OpenStep } if (vInfo != nil) { [dict setObject: vInfo forKey: @"Versions"]; } } } } /** * Sets up a dictionary used for mapping identifiers/keywords to other * words. This is used to help cope with cases where C preprocessor * definitions are confusing the parsing process. */ - (void) setWordMap: (NSDictionary*)map { ASSIGNCOPY(wordMap, map); } /** * Read in the file to be parsed and store it in a temporary unicode * buffer. Perform basic transformations on the buffer to simplify * the parsing process later - including stripping out of escaped * end-of-line sequences. Create mapping information to convert * positions in the new character buffer to line numbers in the * original data (for logging purposes). */ - (void) setupBuffer { NSString *contents; NSMutableData *data; unichar *end; unichar *inptr; unichar *outptr; NSMutableArray *a; CREATE_AUTORELEASE_POOL(arp); contents = [NSString stringWithContentsOfFile: fileName]; length = [contents length]; data = [[NSMutableData alloc] initWithLength: length * sizeof(unichar)]; buffer = [data mutableBytes]; [contents getCharacters: buffer]; outptr = buffer; end = &buffer[length]; a = [NSMutableArray arrayWithCapacity: 1024]; for (inptr = buffer; inptr < end; outptr++, inptr++) { unichar c = *inptr; *outptr = c; /* * Perform ansi trigraph substitution. * Don't know why I bothered ... will probably never be used. */ if (c == '?' && (inptr < end - 2) && inptr[1] == '?') { BOOL changed = YES; switch (inptr[2]) { case '=': *outptr = '#'; break; case '/': *outptr = '\\'; break; case '\'': *outptr = '^'; break; case '(': *outptr = '['; break; case ')': *outptr = ']'; break; case '!': *outptr = '|'; break; default: *outptr = '?'; changed = NO; break; } if (changed == YES) { inptr += 2; } } else if (c == '\\') { /* * Backslash-end-of-line sequences are removed. */ if (inptr < end - 1) { if (inptr[1] == '\n') { inptr++; outptr--; [a addObject: [NSNumber numberWithInt: outptr - buffer]]; } else if (inptr[1] == '\r') { inptr++; outptr--; if (inptr[1] == '\n') { inptr++; } [a addObject: [NSNumber numberWithInt: outptr - buffer]]; } } } else if (c == '\r') { /* * Convert cr-fl or single cr to single lf */ if (inptr < end - 1) { if (inptr[1] == '\n') { inptr++; } *outptr = '\n'; } else { outptr--; // Ignore trailing carriage return. } [a addObject: [NSNumber numberWithInt: outptr - buffer]]; } else if (c == '\n') { [a addObject: [NSNumber numberWithInt: outptr - buffer]]; } } length = outptr - buffer; [data setLength: length*sizeof(unichar)]; buffer = [data mutableBytes]; pos = 0; ASSIGN(lines, [NSArray arrayWithArray: a]); [arp drain]; IF_NO_ARC([data autorelease];) } /** * Skip until we encounter an ']' marking the end of an array. * Expect the current character position to be pointing to the * '[' at the start of an array. */ - (unsigned) skipArray { pos++; while ([self parseSpace] < length) { unichar c = buffer[pos++]; switch (c) { case '#': // preprocessor directive. [self parsePreprocessor]; break; case '\'': case '"': pos--; [self skipLiteral]; break; case '[': pos--; [self skipArray]; break; case ']': return pos; } } return pos; } /** * Skip a bracketed block. * Expect the current character position to be pointing to the * bracket at the start of a block. */ - (unsigned) skipBlock { return [self skipBlock: 0]; } - (unsigned) skipBlock: (BOOL*)isEmpty { unichar term = '}'; BOOL empty = YES; if (buffer[pos] == '(') { term = ')'; } else if (buffer[pos] == '[') { term = ']'; } pos++; while ([self parseSpace] < length) { unichar c = buffer[pos++]; switch (c) { case '#': // preprocessor directive. [self parsePreprocessor]; break; case '\'': case '"': empty = NO; pos--; [self skipLiteral]; break; case '{': empty = NO; pos--; [self skipBlock]; break; case '(': empty = NO; pos--; [self skipBlock]; break; case '[': empty = NO; pos--; [self skipBlock]; break; default: if (c == term) { if (isEmpty != 0) { *isEmpty = empty; } return pos; } empty = NO; } } if (isEmpty != 0) { *isEmpty = empty; } return pos; } - (unsigned) skipLiteral { unichar term = buffer[pos++]; while (pos < length) { unichar c = buffer[pos++]; if (c == '\\') { pos++; } else if (c == term) { break; } } return pos; } - (unsigned) skipRemainderOfLine { while (pos < length) { if (buffer[pos++] == '\n') { break; } } return pos; } - (unsigned) skipSpaces { while (pos < length) { unichar c = buffer[pos]; if ([spaces characterIsMember: c] == NO) { break; } pos++; } return pos; } /** * Skip until we encounter a semicolon or closing brace. * Strictly speaking, we don't skip all statements that way, * since we only skip part of an if...else statement. */ - (unsigned) skipStatement { while ([self parseSpace] < length) { unichar c = buffer[pos++]; switch (c) { case '#': // preprocessor directive. [self parsePreprocessor]; break; case '\'': case '"': pos--; [self skipLiteral]; break; case '{': pos--; [self skipBlock]; return pos; case ';': return pos; // At end of statement case '}': [self log: @"Argh ... read '}' when looking for ';'"]; return --pos; // No statement to skip. break; } } return pos; } /** * Special method to skip a statement and up to the end of the last * line it was on, discarding any comments so they don't get used by * the next construct that actually needs documenting. */ - (unsigned) skipStatementLine { [self skipStatement]; if (buffer[pos-1] == ';' || buffer[pos-1] == '}') { [self skipRemainderOfLine]; } DESTROY(comment); return pos; } - (unsigned) skipToEndOfLine { while (pos < length) { if (buffer[pos++] == '\n') { pos--; break; } } return pos; } /** * Skip until we encounter an '@end' marking the end of an interface, * implementation, or protocol. */ - (unsigned) skipUnit { while ([self parseSpace] < length) { unichar c = buffer[pos++]; switch (c) { case '#': // preprocessor directive. [self parsePreprocessor]; break; case '\'': case '"': pos--; [self skipLiteral]; break; case '@': [self parseSpace]; if (pos < length - 3) { if (buffer[pos] == 'e' && buffer[pos+1] == 'n' && buffer[pos+2] == 'd') { pos += 3; return pos; } } break; } } return pos; } - (NSMutableArray*) sources { return AUTORELEASE([source mutableCopy]); } @end ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gnustep-base-1.29.0/Tools/BaseTools.gsdoc�����������������������������������������������������������0000664�0000000�0000000�00000004505�14356500674�0020232�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0"?> <!DOCTYPE gsdoc PUBLIC "-//GNUstep//DTD gsdoc 1.0.3//EN" "http://www.gnustep.org/gsdoc-1_0_3.xml"> <!-- Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. --> <gsdoc base="BaseTools"> <head> <title>Base Tools 2005 Free Software Foundation, Inc.

    The Base Tools are command line utilities that come with the GNUstep base distribution.

    Parses Objective-C source to autogenerate GSDoc, and converts GSDoc to HTML. Converts text files between unicode and other encodings. Supports viewing/modification of GNUstep user defaults database. GNUstep distributed notification center. GNUstep distributed object mapper. Converts a binary serialized property list (class instance) to a text representation. Merges text property lists into a single property list. Checks that each file contains a valid text representation of a property list. Converts a text representation of a property list to a binary serialized representation.. Can verify strings-file format, and convert strings files between different encodings. A simple XML format verifier and DTD validator. gnustep-base-1.29.0/Tools/DocMakefile000066400000000000000000000056711435650067400174110ustar00rootroot00000000000000# # Makefile for GNUstep Base Tools documentation. # # Copyright (C) 2004 Free Software Foundation, Inc. # # Written by: Adrian Robert # # This file is part of the GNUstep Base Library. # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public # License as published by the Free Software Foundation; either # version 2 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 # General Public License for more details. # # You should have received a copy of the GNU General Public # License along with this library; if not, write to the Free # Software Foundation, Inc., 51 Franklin Street, Fifth Floor, # Boston, MA 02111 USA # MAKEFILE_NAME = DocMakefile include $(GNUSTEP_MAKEFILES)/common.make include ../config.mak DOCUMENT_NAME = BaseTools BaseTools_DOC_INSTALL_DIR = Developer BaseTools_AGSDOC_FILES = \ ../Tools/BaseTools.gsdoc \ ../Tools/gsdoc.gsdoc \ ../Tools/gdomap.gsdoc \ AGSHtml.h \ AGSIndex.h \ AGSOutput.h \ AGSParser.h \ autogsdoc.m \ cvtenc.m \ defaults.m \ gdnc.m \ gdomap.c \ gspath.m \ pldes.m \ plser.m \ plmerge.m \ plparse.m \ pl2link.m \ sfparse.m \ xmlparse.m # # Hack ... using the -DocumentationDirectory flag overrides the value # used by the make package, and puts our output in the documentation # directory. # BaseTools_AGSDOC_FLAGS = \ -MakeFrames YES \ -DocumentationDirectory ../Documentation/BaseTools \ -HeaderDirectory ../Tools \ -Standards YES \ -DTDs ../Tools \ -WordMap '{\ WINAPI="";\ }' -Up BaseTools # Use local version of autogsdoc in case it is not installed AUTOGSDOC=../Tools/$(GNUSTEP_OBJ_DIR_NAME)/autogsdoc BASE_MAKE_LOADED=yes include $(GNUSTEP_MAKEFILES)/documentation.make # # Ensure that our destination subdirectory exists in the Documentation # directory, and temporarily copy the base source file here for autogsdoc # to use. # before-all:: ../Documentation/BaseTools \ ../Documentation/BaseTools/gsdoc.gsdoc \ ../Documentation/BaseTools/gdomap.gsdoc cp -f ../Tools/BaseTools.gsdoc ../Documentation/BaseTools ../Documentation/BaseTools: $(MKDIRS) ../Documentation/BaseTools ../Documentation/BaseTools/gsdoc.gsdoc: ../Tools/gsdoc.gsdoc cp -f ../Tools/gsdoc.gsdoc ../Documentation/BaseTools ../Documentation/BaseTools/gdomap.gsdoc: ../Tools/gdomap.gsdoc cp -f ../Tools/gdomap.gsdoc ../Documentation/BaseTools # # Work around our screwy doc generation implementation, sigh... # before-clean:: if [ -e obj ]; then \ mv obj obj-save-link; \ fi # # Clean up temporary files used while generating documentation. # after-clean:: if [ -d BaseTools ]; then \ $(RM) BaseTools/stamp; \ $(RM) BaseTools/dependencies; \ rmdir BaseTools; \ fi if [ -e obj-save-link ]; then \ mv obj-save-link obj; \ fi gnustep-base-1.29.0/Tools/GNUmakefile000066400000000000000000000103431435650067400173650ustar00rootroot00000000000000# # Tools makefile for GNUstep Base Library # Copyright (C) 1997 Free Software Foundation, Inc. # # Written by: Richard Frith-Macdonald # # This file is part of the GNUstep Base Library. # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public # License as published by the Free Software Foundation; either # version 2 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 # General Public License for more details. # # You should have received a copy of the GNU General Public # License along with this library; if not, write to the Free # Software Foundation, Inc., 51 Franklin Street, Fifth Floor, # Boston, MA 02111 USA. ifeq ($(GNUSTEP_MAKEFILES),) GNUSTEP_MAKEFILES := $(shell gnustep-config --variable=GNUSTEP_MAKEFILES 2>/dev/null) ifeq ($(GNUSTEP_MAKEFILES),) $(warning ) $(warning Unable to obtain GNUSTEP_MAKEFILES setting from gnustep-config!) $(warning Perhaps gnustep-make is not properly installed,) $(warning so gnustep-config is not in your PATH.) $(warning ) $(warning Your PATH is currently $(PATH)) $(warning ) endif endif ifeq ($(GNUSTEP_MAKEFILES),) $(error You need to set GNUSTEP_MAKEFILES before compiling!) endif PACKAGE_NAME = gnustep-base GNUSTEP_LOCAL_ADDITIONAL_MAKEFILES=../base.make include $(GNUSTEP_MAKEFILES)/common.make -include ../Version -include ../config.mak ADDITIONAL_CPPFLAGS = -DGNUSTEP_BASE_INTERNAL=1 # DTDs to install dtddir = $(GNUSTEP_LIBRARY)/DTDs DTD_FILES = plist-0_9.dtd \ gsdoc-0_6_5.dtd \ gsdoc-0_6_6.dtd \ gsdoc-0_6_7.dtd \ gsdoc-1_0_0.dtd \ gsdoc-1_0_1.dtd \ gsdoc-1_0_2.dtd \ gsdoc-1_0_3.dtd \ gsdoc-1_0_4.dtd \ gsdoc-1_0_1.rnc # Manual pages to install MAN1_PAGES = gdnc.1 autogsdoc.1 cvtenc.1 defaults.1 gspath.1 \ pldes.1 sfparse.1 xmlparse.1 HTMLLinker.1 plutil.1 MAN7_PAGES = gsdoc.7 MAN8_PAGES = gdomap.8 # The application to be compiled ifeq ($(add),yes) TOOL_NAME = autogsdoc cvtenc plmerge sfparse xmlparse else TOOL_NAME = autogsdoc cvtenc gdnc gspath defaults pl plmerge plutil \ plparse sfparse pldes plget plser pl2link xmlparse HTMLLinker # gdomap is currently not supported on Windows MSVC or Android (which # can be either "linux-android" or "linux-androideabi") ifneq ($(GNUSTEP_TARGET_OS), windows) ifneq ($(findstring android, $(GNUSTEP_TARGET_OS)), android) CTOOL_NAME = gdomap endif endif SUBPROJECTS = make_strings endif TEST_TOOL_NAME = locale_alias # The source files to be compiled autogsdoc_OBJC_FILES = autogsdoc.m AGSParser.m AGSOutput.m AGSIndex.m AGSHtml.m cvtenc_OBJC_FILES = cvtenc.m gdomap_C_FILES = gdomap.c gdnc_OBJC_FILES = gdnc.m gspath_OBJC_FILES = gspath.m defaults_OBJC_FILES = defaults.m dread_OBJC_FILES = dread.m dremove_OBJC_FILES = dremove.m dwrite_OBJC_FILES = dwrite.m pl_OBJC_FILES = pl.m pldes_OBJC_FILES = pldes.m plget_OBJC_FILES = plget.m plser_OBJC_FILES = plser.m plmerge_OBJC_FILES = plmerge.m plparse_OBJC_FILES = plparse.m plutil_OBJC_FILES = NSPropertyList+PLUtil.m plutil.m sfparse_OBJC_FILES = sfparse.m pl2link_OBJC_FILES = pl2link.m locale_alias_OBJC_FILES = locale_alias.m xmlparse_OBJC_FILES = xmlparse.m HTMLLinker_OBJC_FILES = HTMLLinker.m ifeq ($(OBJC_RUNTIME_LIB), ng) AGSHtml.m_FILE_FLAGS+= -fobjc-arc endif # Reset this variable (defined in config.mak) to avoid useless linkage # against the libraries gnustep-base uses. CONFIG_SYSTEM_LIBS := DOCUMENT_NAME = autogsdoc # Documentation rules for autogsdoc autogsdoc_AGSDOC_FLAGS = -Up autogsdoc autogsdoc_AGSDOC_FILES = autogsdoc.m \ AGSParser.h AGSOutput.h AGSIndex.h AGSHtml.h autogsdoc_DOC_INSTALL_DIR = Developer/Tools # Use local version of autogsdoc in case it is not installed AUTOGSDOC=./$(GNUSTEP_OBJ_DIR_NAME)/autogsdoc include Makefile.preamble include $(GNUSTEP_MAKEFILES)/tool.make #include $(GNUSTEP_MAKEFILES)/test-tool.make include $(GNUSTEP_MAKEFILES)/ctool.make include $(GNUSTEP_MAKEFILES)/aggregate.make ifeq ($(GNUSTEP_BASE_HAVE_LIBXML),1) ifeq ($(doc),yes) include $(GNUSTEP_MAKEFILES)/documentation.make endif endif include Makefile.postamble gnustep-base-1.29.0/Tools/HTMLLinker.1000066400000000000000000000035271435650067400173140ustar00rootroot00000000000000.TH HTMLLinker 1 "August 16, 2009" "GNUstep" "GNUstep System Manual" .SH NAME HTMLLinker \- tool to fix up href references in HTML files .SH SYNOPSIS .B HTMLLinker .RI [ options ] .I input files [ .B -l .I relocation file ] [ .B -d .I destination file ] .br .SH DESCRIPTION .B HTMLLinker is a tool to fix href references in HTML files, typically API reference manuals generated by extracting the docstrings from source code by tools such as .BR autogsdoc (1). .PP .B HTMLLinker accepts the following options (multiple .I input files\fR,\fR .I -l and .I -d options are allowed): .SH OPTIONS .TP .B --help Prints a short list of available options. .TP .B --version Displays version information. .TP .B --verbose Prints additional information while processing. .TP .BI -Warn " [YES|NO]" Print additional information about unresolved links. .TP .BI -LinksMarker " [xxx]" Only fix links with attribute \fBrel\f\=\fIxxx\fR .TP .B -FixupAllLinks YES Attempt to fix all links (not only those that are marked with \fI-LinksMarker\fR. .TP .B -PathMappingsFile \fIfile\fR Read the relocation mappings from .I file (in dictionary format). .TP .B -PathMappings '{"\fIpath\fR\fB"="\fR\fIanother_path\fR\fB";}'\fR Use the specified path mappings. .TP .BI -BuildRelocationFileForDir " dir" Build a relocation file for the directory .I dir and save it into \fIdir\fR/table.htmlink. This option is special and prevents any other processing by the linker. .SH SEE ALSO .BR autogsdoc (1), .BR GNUstep (7). .SH AUTHORS .B HTMLLinker was written by Nicola Pero . .P This manual page was added by Yavor Doganov . .SH COPYRIGHT Copyright (C) 2009 Free Software Foundation, Inc. .P Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. gnustep-base-1.29.0/Tools/HTMLLinker.gsdoc000066400000000000000000000441771435650067400202610ustar00rootroot00000000000000 The HTMLLinker tool
    Introduction

    The GNUstep HTML linker is able to fixup links from one HTML document to other HTML ones. By link we mean the standard <a href="NSString.html#DescriptionOfNSString"> tag. By fixing up a link we mean to modify the path in the href so that it points to the actual file on disk. For example, if you the DescriptionOfNSString location is in the file NSStringOverview.html in the directory /home/nicola/Doc, when the linker fixes up the <a href="NSString.html#DescriptionOfNSString"> link, it will replace it with <a href="/home/nicola/Doc/NSStringOverview.html#DescriptionOfNSString">. Please note that when fixing up the link, the linker modifies both the path and the file name that the link points to, but not the location inside the file (the DescriptionOfNSString in the example).

    Practical Usage of the linker The typical usage of the linker is with maintaining cross-references in software documentation. You need to establish some sort of convention used by all your software documentation for the link names. For example, suppose that your documentation is about C libraries. For each C function, you might decide to tag its documentation in the files with the name function$function_name. For example, the place in the doc where it documents the start_library() function would have the HTML tag <a name="function$start_library">. Having established this convention, in any HTML file in your documentation in which you want to create a link to the documentation for the start_library() function, you use the code <a rel="dynamic" href="#function$start_library"> (please note that you ignore the problem of locating the actual file which contains the documentation for the start_library() function, that is precisely what the linker will do for you). Whenever you install the documentation for a new project, you first create a relocation file for the project documentation, by running
          HTMLLinker -BuildRelocationFileForDir Documentation
        
    if for example the project documentation is in the Documentation subdirectory. This will create a Documentation/table.htmlink file, which contains a list of all names found in the project documentation, and for each of them, the file in which it's found. Then, you install the project documentation (say for example that it's installed into /opt/gnustep/Local/Documentation/MyProject), and once it's installed, you can run the linker to update all links so that they point to the actual files
          HTMLLinker /opt/gnustep/Local/Documentation/MyProject \
                  -l /opt/gnustep/Local/Documentation/MyProject \
                  -l /opt/gnustep/Local/Documentation/MyOtherProject
        
    This will fixup all links in MyProject's HTML files by using the relocation files of both MyProject and MyOtherProject, so all links to anything which is documented inside those files will be generated correctly.
    Usage of the tool with autogsdoc You can use the tool with documentation generated by autogsdoc to perform the linking (or to relink it). Make sure to use the option -LinksMarker gsdoc because autogsdoc marks the links to be fixed up by the linker by using rel="gsdoc".
    Modes of operation The HTML linker works in two phases:
    • The first (called generation of the relocation table) preprocesses a given set of HTML files so that it can be the destination of links. It builds a relocation table for the given set of HTML files. This relocation table simply maps all names (as in <a name="xxx">) in the files to the file in which the name is found. The HTML files are not touched. The linker is able to merge this dynamically generated relocation table with pregenerated relocation tables loaded from files (called relocation files).
    • The second (called linking) links a given file to the available HTML files on disk, by using the relocation table to modify the HTML links in the file so that they point to existing files.
    The HTML linker can also be run in a special mode, to generate a relocation file for later reuse. In this mode, the HTML linker will build the relocation table for all files in a directory, then save the relocation table into a table.htmlink file in that directory for later reuse. There are three kinds of files:
    • input files: these are HTML files which are modified as a consequence of linking; they have their links fixed up.
    • destination files: these are HTML files which are read to produce relocation tables.
    • relocation files: these files are not HTML files - they are only created and read by the linker (unless you have a tool which can manage them), and are in a specific - very simple - format. They are used to save relocation information for later reuse, so that the linker can run faster. Normally, they have a .htmlink extension.
    Linker behaviour The linker keeps a main relocation table, which is empty at the beginning. When run, the linker performs the following steps:
    1. the linker reads and parses all relocation files specified on the command line, and merges the relocation tables found there into the main relocation table.
    2. the linker reads and parses all destination files specified on the command line, and builds a relocation table for them, merging it into the main relocation table.
    3. if any input files are specified on the command line, the linker links the files using the relocation table.
    Specifying input, destination and relocation files All command line arguments which do not begin with a hypen (-), and which are not the values of defaults (for example, not the YES in -Warn YES, because that is the value of the default -Warn), are interpreted as input files. Each destination file is specified by using a -d option, and each relocation file by using a -l option. If a directory is specified as an input (or destination) file, the linker will recurse into the directory and add to the list of input (or destination) files all files in the directory (and in the directory's subdirectories, no matter how deeply nested) which have one of the following extensions: .html, .HTML, .htm or .HTM. If a directory is specified as a relocation file, the linker will add to the list of relocation files all files in the directory which have the extension .htmlink. A typical invocation of the linker is as follows:
          HTMLLinker -BuildRelocationFileForDir Doc
        
    Builds a relocation file for the documentation in the directory Doc. After this has been done, the directory Doc can be used as a -l argument.
          HTMLLinker test.html -l Doc
        
    Links the file test.html using the relocation file just generated in the Doc directory. What is a link A link is an anchor tag with and href, such as <a href="dest.html#location">. The destination file of the link is the file specified in the href; dest.html in the example. The destination file is ignored by the linker; the name of the link (which is everything which follows the #) is used to perform the linking. Which links are fixed up Normally, the linker will only fixup links which have the rel attribute set to dynamic, as in the following example: <a href="nicola.html" rel="dynamic">. In this way, you can specify in your HTML document which links you want to be fixed up, and which you don't want to be. You can change the type of links to be fixed up by using the -LinksMarker options, as in -LinksMarker gsdoc, which causes the linker to fixup all links with the rel attribute set to gsdoc rather than dynamic. In certain situations you might want to force the linker to attempt to fixup all links; you can run the linker with the -FixupAllLinks YES option to cause this behaviour. As a special exception, links which obviously are not to be fixed up, such as links beginning with mailto: or news:, or links without a name, are never fixed up. How links are fixed up When the HTML linker encounters a link which needs to be fixed up (say <a href="dest.html#location">), it searches the relocation table for a destination file which contains the location name. If no such file is found, the HTML linker emits a warning, and replaces the link in the file with a link to the destination without the filename. In the example, it would simply emit <a href="#location">. If the destination file is found in the list, instead, the HTML linker replaces the link with the full path to the destination file on disk. For example, if - according to the relocation table, the file /home/nicola/Doc/dest.html contains the name location, the HTML linker will fixup the link to be <a href="/home/nicola/Doc/dest.html#location"> (as a special exception, if there is a path mapping which matches the path to the destination file, it's applied to the path in the link. See below for a detailed explanation of path mappings). It's important to notice that you must have unique link names for the linker to work properly. For example, if you have two different destination files containing the same name, say NSObject.html and NSString.html both containing the name init, then the linker can't resolve <a href="#init">, because it has no way to know if you meant the link to point to the first or the second destination file! You should choose names better so that they uniquely specify what they represent contents, for example NSObject_i_init and NSString_i_init if the first link is in the place documenting the -init method of the NSObject class and the second one the one of the NSString class. Then all links will clearly refer to one place or the other one, and no confusion will arise. If there are multiple destination files for a link, the linker will guess which one is the right one, and that might not give the desired result. How links are checked When a link is fixed up, the linker implicitly checks that the link is correct, because if the link name can't be found in the relocation tables, a warning is issued. Path mappings Path mappings are an additional feature of the HTML linker which can be used when exporting documentation to be served by a web server. If you are not putting your documentation on a web server but simply reading it from the filesystem, then you don't need the path mappings. The issue with exporting documentation to a web server is that you refer to files using paths which are not necessarily the same paths where the files are on disk. For example, suppose that you have some HTML documentation in /opt/doc/base and some other HTML documentation in /opt/doc/gui. The HTML files in the two documentation directories refer to each other. You can run the HTML linker and fixup all links, and we are happy. But now suppose that you set up a web server; the web server, for example, will serve URLs beginning with /Base (meaning as in requests from a browser of the form http://www.server.org/Base) by taking files from /opt/doc/base, and URLs beginning with Gui by taking files from /opt/doc/gui. To fixup the links in this case, you need path mappings. A path mapping specifies that a certain directory on disk is to be referred in some different way in links. In the example, you would pass
         -PathMapping '{ "/opt/doc/base"="/Base"; "/opt/doc/gui"="/Gui"; }'
        
    to the linker. Each path mapping maps a path on disk to a virtual path. For example, it maps the path on disk /opt/doc/base to the virtual path /Base. Each time the linker fixes up a link, after finding the destination file, it checks the list of path mappings. If the path to the destination file begins with the path on disk of one of the path mappings, then that path on disk is replaced with the corresponding virtual path in the path to the destination file before the path to the destination file is written out in the link. For example, if you have the path mapping explained above, and if the linker is fixing up the link <a href="hi.html#nicola">, where the destination file is /opt/doc/base/nicola/hi.html, then the destination path matches the path mapping for /opt/doc/base, so the path mapping is applied and the link is fixed up to be <a href="/Base/nicola/hi.html#nicola"> rather than <a href="/opt/doc/base/nicola/hi.html#nicola"> as it would normally have been without the path mapping. Specifying path mappings
    On the command line
    Each path mapping specifies a mapping of a path on disk to a web server alias. The first way to specify the mappings is on the command line, in the form of a dictionary argument to the -PathMappings, as in
         -PathMappings '{ "/opt/doc/base"="/Base"; "/opt/doc/gui"="/Gui"; }'
        
    where /opt/doc/base and /opt/doc/gui are the paths on disk and /Base and /Gui are the corresponding web server URL paths.
    In a path mappings file
    The other way to specify mappings is to write them into a file, in the format of a dictionary, as, for example, in a file containing the following lines
          { 
            "/opt/doc/base"="/Base"; 
            "/opt/doc/gui"="/Gui"; 
          }
        
    and then tell the linker to read the path mappings from that file, by giving the filename as option to the -PathMappingsFile. For example, if the file containing the mappings is called mappings, then you need to pass
          -PathMappingsFile mappings
        
    to the linker to have it read mappings from the file.
    Command line path mappings override file path mappings
    Both command line path mappings and path mappings from a file can be used at the same time; in case of conflict, command line path mappings override path mappings from the file.

    Summary of all the options

    Each of the options beginning with a single hypen (-) require an argument, as in
          HTMLLinker Documentation -LinksMarker gsdoc -d Documentation
        
    which sets LinksMarker to gsdoc. The options might be anywhere on the command line. Options which do not begin with a single hypen (such as --help) do not require an argument, as in
          HTMLLinker --help
        

    -d

    Followed by a destination HTML file, or a directory containing destination HTML files.

    -l

    Followed by a relocation file, or a directory containing relocation files.

    -FixupAllLinks

    If set to NO (the default) only links containing the rel attribute set to dynamic (or whatever specified as LinksMarkers)are fixed up in the input files. If set to YES, all links are fixed up.

    -LinksMarker

    If set (and if FixupAllLinks is NO), only links with the rel attribute set to its value are processed. By default it is set to dynamic.

    -PathMappings

    If set to a dictionary, read the dictionary as path mappings. See above for more details of path mappings.

    -PathMappingsFile

    If set to a string, consider it to be the name of a file; read path mappings from that file. The file must contain the path mappings in the form of a dictionary. See above for more details on path mappings.

    -Verbose

    If set to YES prints some more messages than if set to NO (the default).

    --help

    Prints a quick explanation of the command line syntax and exits.

    --version

    Prints the version and exits.
    gnustep-base-1.29.0/Tools/HTMLLinker.m000066400000000000000000001016511435650067400174050ustar00rootroot00000000000000/** The GNUstep HTML Linker HTMLLinker. A tool to fix up href references in html files Copyright (C) 2002,2007 Free Software Foundation, Inc. Written by: Nicola Pero Date: January 2002 This file is part of the GNUstep Project This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. You should have received a copy of the GNU General Public License along with this program; see the file COPYINGv3. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* * See the HTMLLinker.html file for documentation on how to use the tool. */ #import "common.h" #import "Foundation/NSArray.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSFileManager.h" #import "Foundation/NSPathUtilities.h" #import "Foundation/NSProcessInfo.h" #import "Foundation/NSUserDefaults.h" /* For convenience, cached for the whole tool. */ /* [NSFileManager defaultManager] */ static NSFileManager *fileManager = nil; /* [[NSFileManager defaulManager] currentDirectoryPath] */ static NSString *currentPath = nil; static int verbose = 0; /* Enumerate all .html (or .htmlink) files in a directory and subdirectories. */ @interface HTMLDirectoryEnumerator : NSEnumerator { NSDirectoryEnumerator *e; NSString *basePath; BOOL looksForHTMLLinkFiles; BOOL returnsAbsolutePaths; } - (id)initWithBasePath: (NSString *)path; - (void)setReturnsAbsolutePaths: (BOOL)flag; - (void)setLooksForHTMLLinkFiles: (BOOL)flag; @end @implementation HTMLDirectoryEnumerator : NSEnumerator - (id)initWithBasePath: (NSString *)path { ASSIGN (e, [fileManager enumeratorAtPath: path]); ASSIGN (basePath, path); return [super init]; } - (void)dealloc { RELEASE (e); RELEASE (basePath); [super dealloc]; } - (void)setReturnsAbsolutePaths: (BOOL)flag { returnsAbsolutePaths = flag; } - (void)setLooksForHTMLLinkFiles: (BOOL)flag { looksForHTMLLinkFiles = YES; } - (id)nextObject { NSString *s; while ((s = [e nextObject]) != nil) { BOOL found = NO; NSString *extension = [s pathExtension]; if (looksForHTMLLinkFiles) { if ([extension isEqualToString: @"htmlink"]) { found = YES; } } else if ([extension isEqualToString: @"html"] || [extension isEqualToString: @"HTML"] || [extension isEqualToString: @"htm"] || [extension isEqualToString: @"HTM"]) { found = YES; } if ([[[e fileAttributes] fileType] isEqual: NSFileTypeDirectory] && verbose) { GSPrintf(stdout, @" traversing %@\n", s); } if (found) { if (returnsAbsolutePaths) { /* NSDirectoryEnumerator returns the relative path, we return the absolute. */ return [basePath stringByAppendingPathComponent: s]; } else { return s; } } } return nil; } @end /* The HTMLLinker class is very simple and is the core of the linker. It just keeps a relocation, and is able to fixup a link by using the relocation table. */ @interface HTMLLinker : NSObject { BOOL warn; BOOL hasPathMappings; NSMutableDictionary *pathMappings; NSMutableDictionary *relocationTable; } - (id)initWithWarnFlag: (BOOL)v; - (void)registerRelocationFile: (NSString *)pathOnDisk; - (void)registerDestinationFile: (NSString *)pathOnDisk; /* Register a new path mapping. */ - (void)registerPathMappings: (NSDictionary *)dict; /* Resolve the link 'link' by fixing it up using the relocation table. Return the resolved link. 'logFile' is only used to print error messages. It is the file in which the link is originally found; if there is problem resolving the link, the warning message printed out states that the problem is in file 'logFile'. */ - (NSString *)resolveLink: (NSString *)link logFile: (NSString *)logFile; @end /* All the parsing code is in the following class. It's not a real parser in the sense that it is just performing its minimal duty in the quickest possible way, so calling this a parser is a bit of a exaggeration ... this code can run very quickly through an HTML string, extracting the tags or fixing up the tags. No more HTML parsing than this is done. Remarkably, this does not need XML support in the base library, so you can use the HTML linker on any system. This class was written in order to perform its trivial, mechanical duty /very fast/. You want to be able to run the linker often and on a lot of files and still be happy. FIXME - Need to implement support for newer HTML where you can use id="name" in any tag. */ @interface HTMLParser : NSObject { /* The HTML code that we work on. */ unichar *chars; unsigned length; } /* Init with some HTML code to parse. */ - (id)initWithCode: (NSString *)HTML; /* Extract all the tags from the HTML code, and return a list of them. */ - (NSArray *)names; /* Fix up all the links in the HTML code by feeding each of them to the provided HTMLLinker; return the fixed up HTML code. If linksMarker is nil, attempts to fix up all links in the HTML code; if it is not-nil, only attempt to fixup links with rel=marker. logFile is the file we are fixing up; it's only used when a warning is issued because there is problem in the linking - the warning message is displayed as being about links in the file logFile. */ - (NSString *)resolveLinksUsingHTMLLinker: (HTMLLinker *)linker logFile: (NSString *)logFile linksMarker: (NSString *)marker; @end @implementation HTMLParser - (id)initWithCode: (NSString *)HTML { length = [HTML length]; chars = malloc (sizeof(unichar) * length); [HTML getCharacters: chars]; return [super init]; } - (void)dealloc { free (chars); [super dealloc]; } - (NSArray *)names { NSMutableArray *names = AUTORELEASE ([NSMutableArray new]); unsigned i = 0; while (i + 3 < length) { /* We ignore anything except stuff which begins with "') { break; } /* I suppose i == s might happen if the file contains */ if (i != s) { /* If name != nil we already found it so don't bother. */ if (name == nil) { NSString *attribute; attribute = [NSString stringWithCharacters: &chars[s] length: (i - s)]; /* Lowercase name so that eg, HREF and href are the same. */ attribute = [attribute lowercaseString]; if ([attribute isEqualToString: @"name"]) { isNameAttribute = YES; } } } /* Skip spaces. */ while (i < length && (chars[i] == ' ' || chars[i] == '\n' || chars[i] == '\r' || chars[i] == '\t')) { i++; } if (i == length) { break; } /* Read the '=' */ if (chars[i] == '=') { i++; } else { /* No '=' -- go on with the next attribute. */ continue; } if (i == length) { break; } /* Skip spaces. */ while (i < length && (chars[i] == ' ' || chars[i] == '\n' || chars[i] == '\r' || chars[i] == '\t')) { i++; } if (i == length) { break; } /* Read the value. */ if (chars[i] == '"') { /* Skip the '"', then read up to a '"'. */ i++; if (i == length) { break; } s = i; while (i < length && (chars[i] != '"')) { i++; } } else if (chars[i] == '\'') { /* Skip the '\'', then read up to a '\''. */ i++; if (i == length) { break; } s = i; while (i < length && (chars[i] != '\'')) { i++; } } else { /* Read up to a space or '>'. */ s = i; while (i < length && (chars[i] != ' ' && chars[i] != '\n' && chars[i] != '\r' && chars[i] != '\t' && chars[i] != '>')) { i++; } } if (name == nil && isNameAttribute) { if (i == s) { /* I suppose this might happen if the file contains */ name = @""; } else { name = [NSString stringWithCharacters: &chars[s] length: (i - s)]; } } } if (name != nil) { [names addObject: name]; } } i++; } return names; } - (NSString *)resolveLinksUsingHTMLLinker: (HTMLLinker *)linker logFile: (NSString *)logFile linksMarker: (NSString *)marker { /* We represent the output as a linked list. Each element in the linked list represents a string; concatenating all the strings in the linked list, you obtain the output. The trick is that these strings in the linked list might actually be pointers inside the chars array ... we are never copying stuff from the chars array - just keeping pointers to substrings inside it - till we generate the final string at the end ... for speed and efficiency reasons of course. */ struct stringFragment { unichar *chars; unsigned length; BOOL needsFreeing; struct stringFragment *next; } *head, *tail; /* The index of the beginning of the last string fragment (the tail). */ unsigned tailIndex = 0; /* The temporary index. */ unsigned i = 0; /* The total number of chars in the output string. We don't know this beforehand because each time we fix up a link, we might add or remove characters from the output. We update totalNumberOfChars each time we close a stringFragment. */ unsigned totalNumberOfChars = 0; /* Initialize the linked list. */ head = malloc (sizeof (struct stringFragment)); head->chars = chars; head->length = 0; head->needsFreeing = NO; head->next = NULL; /* The last string fragment is the first one at the beginning. */ tail = head; while (i + 3 < length) { /* We ignore anything except stuff which begins with "') { break; } /* I suppose i == s might happen if the file contains */ if (i != s) { /* If href != nil && rel != nil we already found it so don't bother. */ if (href == nil || rel == nil) { NSString *attribute; attribute = [NSString stringWithCharacters: &chars[s] length: (i - s)]; /* Lowercase name so that eg, HREF and href are the same. */ attribute = [attribute lowercaseString]; if (href == nil && [attribute isEqualToString: @"href"]) { isHrefAttribute = YES; } else if (rel == nil && [attribute isEqualToString: @"rel"]) { isRelAttribute = YES; } } } /* Skip spaces. */ while (i < length && (chars[i] == ' ' || chars[i] == '\n' || chars[i] == '\r' || chars[i] == '\t')) { i++; } if (i == length) { break; } /* Read the '=' */ if (chars[i] == '=') { i++; } else { /* No '=' -- go on with the next attribute. */ continue; } if (i == length) { break; } /* Skip spaces. */ while (i < length && (chars[i] == ' ' || chars[i] == '\n' || chars[i] == '\r' || chars[i] == '\t')) { i++; } if (i == length) { break; } /* Read the value. */ if (isHrefAttribute) { /* Remeber that href starts here. */ hrefStart = i; } if (chars[i] == '"') { /* Skip the '"', then read up to a '"'. */ i++; if (i == length) { break; } s = i; while (i < length && (chars[i] != '"')) { i++; } if (isHrefAttribute) { /* Remeber that href ends here. We don't want the ending " because we already insert those by our own. */ hrefEnd = i + 1; } } else if (chars[i] == '\'') { /* Skip the '\'', then read up to a '\''. */ i++; if (i == length) { break; } s = i; while (i < length && (chars[i] != '\'')) { i++; } if (isHrefAttribute) { hrefEnd = i + 1; } } else { /* Read up to a space or '>'. */ s = i; while (i < length && (chars[i] != ' ' && chars[i] != '\n' && chars[i] != '\r' && chars[i] != '\t' && chars[i] != '>')) { i++; } if (isHrefAttribute) { /* We do want the ending space. */ hrefEnd = i; } } if (i == length) { break; } if (hrefEnd >= length) { hrefEnd = length - 1; } if (isRelAttribute) { if (i == s) { /* I suppose this might happen if the file contains */ rel = @""; } else { rel = [NSString stringWithCharacters: &chars[s] length: (i - s)]; } } if (isHrefAttribute) { if (i == s) { /* I suppose this might happen if the file contains */ href = @""; } else { href = [NSString stringWithCharacters: &chars[s] length: (i - s)]; } } } if (href != nil && ((marker == nil) || [rel isEqualToString: marker])) { /* Ok - fixup the link. */ NSString *link; struct stringFragment *s; link = [linker resolveLink: href logFile: logFile]; /* Add " before and after the link. */ link = [NSString stringWithFormat: @"\"%@\"", link]; /* Close the previous string fragment at hrefStart. */ tail->length = hrefStart - tailIndex; totalNumberOfChars += tail->length; /* Insert immediately afterwards a string fragment containing the fixed up link. */ s = malloc (sizeof (struct stringFragment)); s->length = [link length]; s->chars = malloc (sizeof(unichar) * s->length); [link getCharacters: s->chars]; s->needsFreeing = YES; s->next = NULL; tail->next = s; tail = s; totalNumberOfChars += tail->length; /* Now prepare the new tail to start just after the end of the original href in the original HTML code. */ s = malloc (sizeof (struct stringFragment)); s->length = 0; s->chars = &chars[hrefEnd]; s->needsFreeing = NO; s->next = NULL; tail->next = s; tail = s; tailIndex = hrefEnd; } } i++; } /* Close the last open string fragment. */ tail->length = length - tailIndex; totalNumberOfChars += tail->length; /* Generate the output. */ { NSString *result; /* Allocate space for the whole output in a single chunk now that we know how big it should be. */ unichar *outputChars = malloc (sizeof(unichar) * totalNumberOfChars); unsigned j = 0; /* Copy into the output all the string fragments, destroying each of them as we go on. */ while (head != NULL) { struct stringFragment *s; memcpy (&outputChars[j], head->chars, sizeof(unichar) * head->length); j += head->length; if (head->needsFreeing) { free (head->chars); } s = head->next; free (head); head = s; } result = [NSString stringWithCharacters: outputChars length: totalNumberOfChars]; free(outputChars); return result; } } @end @implementation HTMLLinker - (id)initWithWarnFlag: (BOOL)v { warn = v; relocationTable = [NSMutableDictionary new]; pathMappings = [NSMutableDictionary new]; return [super init]; } - (void)dealloc { RELEASE (relocationTable); RELEASE (pathMappings); [super dealloc]; } - (void)registerRelocationFile: (NSString *)pathOnDisk { /* We only accept absolute paths. */ if (![pathOnDisk isAbsolutePath]) { pathOnDisk = [currentPath stringByAppendingPathComponent: pathOnDisk]; } /* Check if it's a directory; if it is, enumerate all .htmlink files inside it, and add all of them. */ { BOOL isDir; if (![fileManager fileExistsAtPath: pathOnDisk isDirectory: &isDir]) { NSLog (@"Warning - relocation file '%@' not found - ignored", pathOnDisk); return; } else { if (isDir) { HTMLDirectoryEnumerator *e; NSString *filename; e = [HTMLDirectoryEnumerator alloc]; e = [[e initWithBasePath: pathOnDisk] autorelease]; [e setLooksForHTMLLinkFiles: YES]; [e setReturnsAbsolutePaths: YES]; while ((filename = [e nextObject]) != nil) { [self registerRelocationFile: filename]; } return; } } } /* Now, read the mappings in the file. */ { NSString *file = [NSString stringWithContentsOfFile: pathOnDisk]; NSString *path = [pathOnDisk stringByDeletingLastPathComponent]; NSDictionary *d = [file propertyList]; NSEnumerator *e = [d keyEnumerator]; NSString *name; while ((name = [e nextObject]) != nil) { NSString *v = [d objectForKey: name]; NSString *filePath; filePath = [path stringByAppendingPathComponent: v]; if (hasPathMappings) { /* Manage pathMappings: try to match any of the pathMappings against pathOnDisk, and perform the path mapping if we can match. */ NSEnumerator *en = [pathMappings keyEnumerator]; NSString *key; while ((key = [en nextObject])) { if ([filePath hasPrefix: key]) { NSString *value = [pathMappings objectForKey: key]; filePath = [filePath substringFromIndex: [key length]]; filePath = [value stringByAppendingPathComponent: filePath]; break; } } } [relocationTable setObject: filePath forKey: name]; } } } - (void)registerDestinationFile: (NSString *)pathOnDisk { NSString *fullPath = pathOnDisk; /* We only accept absolute paths. */ if (![pathOnDisk isAbsolutePath]) { pathOnDisk = [currentPath stringByAppendingPathComponent: pathOnDisk]; } /* Check if it's a directory; if it is, enumerate all HTML files inside it, and add all of them. */ { BOOL isDir; if (![fileManager fileExistsAtPath: pathOnDisk isDirectory: &isDir]) { NSLog (@"Warning - destination file '%@' not found - ignored", pathOnDisk); return; } else { if (isDir) { HTMLDirectoryEnumerator *e; NSString *filename; e = [HTMLDirectoryEnumerator alloc]; e = [[e initWithBasePath: pathOnDisk] autorelease]; [e setReturnsAbsolutePaths: YES]; while ((filename = [e nextObject]) != nil) { [self registerDestinationFile: filename]; } return; } } } if (hasPathMappings) { /* Manage pathMappings: try to match any of the pathMappings against pathOnDisk, and perform the path mapping if we can match. */ NSEnumerator *e = [pathMappings keyEnumerator]; NSString *key; while ((key = [e nextObject])) { if ([pathOnDisk hasPrefix: key]) { NSString *value = [pathMappings objectForKey: key]; fullPath = [pathOnDisk substringFromIndex: [key length]]; fullPath = [value stringByAppendingPathComponent: fullPath]; break; } } } /* Now, read all the names from the file. */ { NSString *file = [NSString stringWithContentsOfFile: pathOnDisk]; HTMLParser *p = [[HTMLParser alloc] initWithCode: file]; NSArray *names = [p names]; unsigned i, count; RELEASE (p); count = [names count]; for (i = 0; i < count; i++) { NSString *name = [names objectAtIndex: i]; [relocationTable setObject: fullPath forKey: name]; } } } - (void)registerPathMappings: (NSDictionary *)dict { NSEnumerator *e = [dict keyEnumerator]; NSString *key; while ((key = [e nextObject])) { NSString *value = [dict objectForKey: key]; [pathMappings setObject: value forKey: key]; } hasPathMappings = YES; } - (NSString *)resolveLink: (NSString *)link logFile: (NSString *)logFile { NSString *fileLink; NSString *nameLink; NSString *relocatedFileLink; NSString *file; /* Do nothing if this is evidently *not* a dynamical link to fixup. */ if ([link hasPrefix: @"mailto:"] || [link hasPrefix: @"news:"]) { return link; } { /* Break the link string into fileLink (everything which is before the `#'), and nameLink (everything which is after the `#', `#' not included). For example, if link is 'NSObject_Class.html#isa', then fileLink is 'NSObject_Class.html' and nameLink is 'isa'. */ /* Look for the #. */ NSRange hashRange = [link rangeOfString: @"#"]; if (hashRange.location == NSNotFound) { fileLink = link; nameLink = nil; } else { fileLink = [link substringToIndex: hashRange.location]; if (hashRange.location + 1 < [link length]) { nameLink = [link substringFromIndex: (hashRange.location + 1)]; } else { nameLink = nil; } } } /* Now lookup nameLink. */ /* If it's "", it is not something we can fixup. */ if (nameLink == nil || [nameLink isEqualToString: @""]) { relocatedFileLink = fileLink; } else { /* Now simply look it up in our relocation table. */ file = [relocationTable objectForKey: nameLink]; /* Not found - leave it unfixed. */ if (file == nil) { if (warn && [fileLink length] > 0) { GSPrintf(stderr, @"%@: Unresolved reference to '%@'\n", logFile, nameLink); } relocatedFileLink = fileLink; } else { relocatedFileLink = file; } } /* Now build up the final relocated link, and return it. */ if (nameLink != nil) { return [NSString stringWithFormat: @"%@#%@", relocatedFileLink, nameLink]; } else { return relocatedFileLink; } } @end static NSDictionary * build_relocation_table_for_directory (NSString *dir) { BOOL isDir; if (verbose) GSPrintf(stdout, @" Building relcation table for %@\n", dir); /* Check if it's a directory; if it is, enumerate all HTML files inside it, and add all of them. */ if (![fileManager fileExistsAtPath: dir isDirectory: &isDir]) { NSLog (@"%@ does not exist - exiting", dir); exit (1); } else if (!isDir) { NSLog (@"%@ is not a directory - exiting", dir); exit (1); } else { HTMLDirectoryEnumerator *e; NSString *filename; NSMutableDictionary *relocationTable; relocationTable = [NSMutableDictionary new]; IF_NO_ARC ([relocationTable autorelease];) e = [HTMLDirectoryEnumerator alloc]; e = [[e initWithBasePath: dir] autorelease]; /* The relocation table for a directory is relative to the directory top, so that the whole directory can be moved around without having to regenerate the .htmlink file. */ [e setReturnsAbsolutePaths: NO]; while ((filename = [e nextObject]) != nil) { NSString *fullPath; NSString *file; HTMLParser *p; NSArray *names; unsigned i, count; fullPath = [dir stringByAppendingPathComponent: filename]; file = [NSString stringWithContentsOfFile: fullPath]; p = [[HTMLParser alloc] initWithCode: file]; names = [p names]; RELEASE (p); count = [names count]; for (i = 0; i < count; i++) { NSString *name = [names objectAtIndex: i]; [relocationTable setObject: filename forKey: name]; } } return relocationTable; } } static void print_help_and_exit () { printf ("GNUstep HTMLLinker\n"); printf ("Usage: HTMLLinker [options] input_files [-l relocation_file] [-d destination_file]\n"); printf ("Multiple input files, and multiple -l and -d options are allowed.\n"); printf (" `options' include:\n"); printf (" --help: print this message;\n"); printf (" --version: print version information;\n"); printf (" --verbose: print information while processing;\n"); printf (" -Warn NO: do not print warnings about unresolved links;\n"); printf (" -LinksMarker xxx: only fixup links with attribute rel=xxx;\n"); printf (" -FixupAllLinks YES: attempt to fixup all links (not only ones with the marker);\n"); printf (" -PathMappingsFile file: read path mappings from file (a dictionary);\n"); printf (" -PathMappings '{\"/usr/doc\"=\"/Doc\";}': use the supplied path mappings;\n"); printf (" -BuildRelocationFileForDir yyy: build a relocation file for the dir yyy\n"); printf (" and save it into yyy/table.htmlink. This option is special\n"); printf (" and prevents any other processing by the linker.\n"); exit (0); } static void print_version_and_exit () { printf ("GNUstep HTMLLinker (gnustep-base version %d.%d.%d)\n", GNUSTEP_BASE_MAJOR_VERSION, GNUSTEP_BASE_MINOR_VERSION, GNUSTEP_BASE_SUBMINOR_VERSION); exit (0); } int main (int argc, char** argv, char** env) { NSUserDefaults *userDefs; NSArray *args; NSMutableArray *inputFiles; unsigned i, count; BOOL warn; NSString *linksMarker; HTMLLinker *linker; CREATE_AUTORELEASE_POOL(pool); #ifdef GS_PASS_ARGUMENTS GSInitializeProcess(argc, argv, env); #endif /* Set up the cache. */ fileManager = [NSFileManager defaultManager]; currentPath = [fileManager currentDirectoryPath]; /* Read basic defaults. */ userDefs = [NSUserDefaults standardUserDefaults]; /* defaults are - -Warn YES -LinksMarker dynamic -FixupAllLinks NO */ [userDefs registerDefaults: [NSDictionary dictionaryWithObjectsAndKeys: @"dynamic", @"LinksMarker", @"YES", @"Warn", nil]]; warn = [userDefs boolForKey: @"Warn"]; linksMarker = [userDefs stringForKey: @"LinksMarker"]; /* If -BuildRelocationFileForDir xxx is passed on the command line, build a relocation file for the directory xxx and save it in xxx/table.htmlink. */ { NSString *relFile; relFile = [userDefs stringForKey: @"BuildRelocationFileForDir"]; if (relFile != nil) { NSDictionary *table; NSString *outputFile; outputFile = [relFile stringByAppendingPathComponent: @"table.htmlink"]; table = build_relocation_table_for_directory (relFile); [table writeToFile: outputFile atomically: YES]; exit (0); } } /* Create the linker object. */ linker = [[HTMLLinker alloc] initWithWarnFlag: warn]; /* First, read all path mappings (before reading any destination file / relocation file, so we can relocate properly. */ /* Read path mappings from PathMappingsFile if specified. */ { NSString *pathMapFile = [userDefs stringForKey: @"PathMappingsFile"]; if (pathMapFile != nil) { NSDictionary *mappings; mappings = [NSDictionary dictionaryWithContentsOfFile: pathMapFile]; if (mappings == nil) { NSLog (@"Warning - %@ does not contain a dictionary - ignored", pathMapFile); } else { [linker registerPathMappings: mappings]; } } } /* Add PathMappings specified on the command line if any. */ { NSDictionary *paths = [userDefs dictionaryForKey: @"PathMappings"]; if (paths != nil) { [linker registerPathMappings: paths]; } } /* All non-options on the command line are: input files destination files if they come after a -d relocation files if they come after a -l Directories as input files or destination files means 'all .html, .htm, .HTML, .HTM files in the directory and subdirectories'. */ args = [[NSProcessInfo processInfo] arguments]; count = [args count]; inputFiles = AUTORELEASE ([NSMutableArray new]); for (i = 1; i < count; i++) { NSString *arg = [args objectAtIndex: i]; if ([arg characterAtIndex: 0] == '-') { NSString *opt; opt = ([arg characterAtIndex: 1] == '-') ? [arg substringFromIndex: 2] : [arg substringFromIndex: 1]; if ([opt isEqualToString: @"help"] || [opt isEqualToString: @"h"]) { print_help_and_exit (); } else if ([opt isEqualToString: @"version"] || [opt isEqualToString: @"V"]) { print_version_and_exit (); } else if ([opt isEqualToString: @"verbose"] || [opt isEqualToString: @"v"]) { verbose++; } else if ([opt isEqualToString: @"d"]) { if ((i + 1) < count) { i++; /* Register a destination file. */ [linker registerDestinationFile: [args objectAtIndex: i]]; } else { NSLog (@"Missing argument to -d"); } } else if ([opt isEqualToString: @"l"]) { if ((i + 1) < count) { i++; /* Register a destination file. */ [linker registerRelocationFile: [args objectAtIndex: i]]; } else { NSLog (@"Missing argument to -l"); } } else { /* A GNUstep default - skip it and the next argument. */ if ((i + 1) < count) { i++; continue; } } } else { BOOL isDir; if (![fileManager fileExistsAtPath: arg isDirectory: &isDir]) { NSLog (@"Warning - input file '%@' not found - ignored", arg); } else { if (isDir) { HTMLDirectoryEnumerator *e; NSString *filename; e = [[[HTMLDirectoryEnumerator alloc] initWithBasePath: arg] autorelease]; [e setReturnsAbsolutePaths: YES]; while ((filename = [e nextObject]) != nil) { [inputFiles addObject: filename]; } } else { [inputFiles addObject: arg]; } } } } count = [inputFiles count]; if (count == 0) { NSLog (@"No input files specified."); } for (i = 0; i < count; i++) { NSString *inputFile; NSString *inputFileContents; HTMLParser *parser; inputFile = [inputFiles objectAtIndex: i]; if (verbose) GSPrintf(stdout, @" %@\n", inputFile); inputFileContents = [NSString stringWithContentsOfFile: inputFile]; parser = [[HTMLParser alloc] initWithCode: inputFileContents]; inputFileContents = [parser resolveLinksUsingHTMLLinker: linker logFile: inputFile linksMarker: linksMarker]; [inputFileContents writeToFile: inputFile atomically: YES]; RELEASE (parser); } RELEASE (linker); [pool drain]; return 0; } gnustep-base-1.29.0/Tools/Makefile.postamble000066400000000000000000000121531435650067400207410ustar00rootroot00000000000000# -*-makefile-*- # # Makefile.postamble # # Copyright (C) 2005, Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # This program is distributed in the # hope that it will be useful, but WITHOUT ANY WARRANTY; without even # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. # # Project specific makefile rules # # Uncomment the targets you want. # The double colons (::) are important, do not make them single colons # otherwise the normal makefile rules will not be performed. # # Things to do before compiling # before-all:: # Things to do after compiling # after-all:: # Things to do before installing before-install:: # Things to do after installing after-install:: $(ECHO_NOTHING)if [ ! -f $(dtddir) ]; then \ $(MKDIRS) $(dtddir); \ fi; \ for file in $(DTD_FILES); do \ $(INSTALL_DATA) $$file $(dtddir)/$$file; \ done; \ if [ ! -f $(GNUSTEP_DOC_MAN) ]; then \ $(MKDIRS) $(GNUSTEP_DOC_MAN); \ fi; \ if [ ! -f $(GNUSTEP_DOC_MAN)/man1 ]; then \ $(MKDIRS) $(GNUSTEP_DOC_MAN)/man1; \ fi; \ for file in $(MAN1_PAGES) __done; do \ if [ $$file != __done ]; then \ $(INSTALL_DATA) $$file $(GNUSTEP_DOC_MAN)/man1/$$file; \ which gzip && rm -f $(GNUSTEP_DOC_MAN)/man1/$$file.gz \ && gzip -9 $(GNUSTEP_DOC_MAN)/man1/$$file; \ fi; \ done; \ if [ ! -f $(GNUSTEP_DOC_MAN)/man8 ]; then \ $(MKDIRS) $(GNUSTEP_DOC_MAN)/man8; \ fi; \ for file in $(MAN8_PAGES); do \ $(INSTALL_DATA) $$file $(GNUSTEP_DOC_MAN)/man8/$$file; \ which gzip && rm -f $(GNUSTEP_DOC_MAN)/man8/$$file.gz \ && gzip -9 $(GNUSTEP_DOC_MAN)/man8/$$file; \ done$(END_ECHO) ifeq ($(GNUSTEP_GDOMAP_PORT_OVERRIDE),no) ifeq ($(GNUSTEP_INSTALL_GDOMAP_AS_SETUID),no) $(ECHO_NOTHING)echo ""; \ echo "Note: gdomap has not been made setuid to root, so you must"; \ echo "start it up as root. Most often this is done at system boot"; \ echo "by executing 'gdomap -p' in the startup scripts."; \ echo ""$(END_ECHO) else $(ECHO_NOTHING)echo ""; \ if [ "`$(WHOAMI)`" != "root" ]; then \ echo ""; \ echo "************************************************************"; \ echo "WARNING: gdomap has not been made setuid to root ..."; \ echo "NOTE: Unless gdomap is started as root at system boot time,"; \ echo "it MUST either be installed owned by root and with the"; \ echo "'s-bit' or you must have defined 'GDOMAP_PORT_OVERRIDE' in"; \ echo "gdomap.h before compiling gdomap.c and NSPortNameServer.m"; \ echo "If either of those cases applies, ignore this message."; \ echo "************************************************************"; \ echo ""; \ else \ echo "Making gdomap in $(GNUSTEP_TOOLS)/$(GNUSTEP_TARGET_DIR) setuid to root"; \ echo "WARNING: if possible, you should remove the setuid flag and"; \ echo "WARNING: have gdomap started as root at machine boot time."; \ $(INSTALL) -m 05755 $(GNUSTEP_OBJ_DIR)/gdomap $(GNUSTEP_TOOLS)/$(GNUSTEP_TARGET_DIR); \ fi; \ echo "************************************************************"; \ echo "WARNING: if gdomap is started automatically, it will probe"; \ echo "all machines on your network periodically so that it can make"; \ echo "services on remote systems available to your local programs"; \ echo "If this is not what you want, gdomap must be started with the"; \ echo "-p flag (to disable probing) or the -c flag (to specify which"; \ echo "remote systems should be probed), and you should add this"; \ echo "startup command to your system boot scripts!"; \ echo "************************************************************"; \ $(END_ECHO) endif endif # Things to do before uninstalling before-uninstall:: for file in $(DTD_FILES); do \ rm -f $(dtddir)/$$file; \ done -rmdir $(dtddir) for file in $(MAN1_PAGES); do \ rm -f $(GNUSTEP_DOC_MAN)/man1/$$file.gz; \ done; -rmdir $(GNUSTEP_DOC_MAN)/man1; for file in $(MAN8_PAGES); do \ rm -f $(GNUSTEP_DOC_MAN)/man8/$$file.gz; \ done; -rmdir $(GNUSTEP_DOC_MAN)/man8; -rmdir $(GNUSTEP_DOC_MAN); # Things to do after uninstalling # after-uninstall:: # Things to do before cleaning # before-clean:: # Things to do after cleaning # after-clean:: # Things to do before distcleaning # before-distclean:: # Things to do after distcleaning # after-distclean:: # Things to do before checking # before-check:: # Things to do after checking # after-check:: # # If building with the Apple Foundation, we don't include the base 'Headers' # directory in the includes path, but we need the additions headers so we # link to them from the current directory. # ifeq ($(FOUNDATION_LIB),apple) before-all:: rm -f GNUstepBase ln -s ../Headers/GNUstepBase GNUstepBase after-clean:: rm -f GNUstepBase endif gnustep-base-1.29.0/Tools/Makefile.preamble000066400000000000000000000042421435650067400205420ustar00rootroot00000000000000# # Tools makefile for the GNUstep Base Library # # Copyright (C) 1997 Free Software Foundation, Inc. # # Written by: Scott Christley # # This file is part of the GNUstep Base Library. # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public # License as published by the Free Software Foundation; either # version 2 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 # General Public License for more details. # # You should have received a copy of the GNU General Public # License along with this library; if not, write to the Free # Software Foundation, Inc., 51 Franklin Street, Fifth Floor, # Boston, MA 02111 USA. # # # Makefile.preamble # # Project specific makefile variables, and additional # # Do not put any Makefile rules in this file, instead they should # be put into Makefile.postamble. # # # Flags dealing with compiling and linking # # Additional flags to pass to the preprocessor ADDITIONAL_CPPFLAGS += $(DEFS) $(WARN_FLAGS) ifneq ($(GNUSTEP_GDOMAP_PORT_OVERRIDE),no) ADDITIONAL_CPPFLAGS += -DGDOMAP_PORT_OVERRIDE=$(GNUSTEP_GDOMAP_PORT_OVERRIDE) endif # Additional flags to pass to the Objective-C compiler #ADDITIONAL_OBJCFLAGS += # Additional flags to pass to the C compiler #ADDITIONAL_CFLAGS += # Additional include directories the compiler should search ADDITIONAL_INCLUDE_DIRS += -I../Source/$(GNUSTEP_TARGET_DIR) -I../Source/ ifeq ($(FOUNDATION_LIB),gnu) ADDITIONAL_INCLUDE_DIRS += -I../Headers endif # Additional LDFLAGS to pass to the linker ifeq ($(GNUSTEP_TARGET_OS),windows) ADDITIONAL_LDFLAGS += -Wl,/subsystem:console endif # Additional library directories the linker should search ADDITIONAL_LIB_DIRS += -L../Source/$(GNUSTEP_OBJ_DIR) # # Flags dealing with installing and uninstalling # # Additional directories to be created during installation #ADDITIONAL_INSTALL_DIRS += ifeq ($(add),yes) ADDITIONAL_TOOL_LIBS = -lgnustep-baseadd endif gnustep-base-1.29.0/Tools/NSPropertyList+PLUtil.h000066400000000000000000000033571435650067400215610ustar00rootroot00000000000000/** Permit handling JSON as plists, and writing Objective-C literals. Copyright (C) 2020 Free Software Foundation, Inc. Written by: Mingye Wang Created: feb 2020 This file is part of the GNUstep Objective-C Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #import "Foundation/NSPropertyList.h" /** Extra types supported by plutil. */ enum _PLUExtentedFormats { NSPropertyListJSONFormat = NSPropertyListBinaryFormat_v1_0 + 100, /** https://clang.llvm.org/docs/ObjectiveCLiterals.html */ NSPropertyListObjectiveCFormat, /** https://docs.swift.org/swift-book/ReferenceManual/zzSummaryOfTheGrammar.html */ NSPropertyListSwiftFormat, }; @interface NSPropertyListSerialization (PLUtilAdditions) + (NSData *) _pdataFromPropertyList: (id)aPropertyList format: (NSPropertyListFormat)aFormat errorDescription: (NSString **)anErrorString; + (id) _ppropertyListWithData: (NSData *)data options: (NSPropertyListReadOptions)anOption format: (NSPropertyListFormat *)aFormat error: (out NSError **)error; + (void) load; @end gnustep-base-1.29.0/Tools/NSPropertyList+PLUtil.m000066400000000000000000000076451435650067400215720ustar00rootroot00000000000000/** Permit handling JSON as plists, and writing Objective-C literals. Copyright (C) 2020 Free Software Foundation, Inc. Written by: Mingye Wang Created: feb 2020 This file is part of the GNUstep Objective-C Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #import "NSPropertyList+PLUtil.h" #import "GNUstepBase/GSObjCRuntime.h" #import "Foundation/NSData.h" #import "Foundation/NSError.h" #import "Foundation/NSUserDefaults.h" #import "Foundation/NSJSONSerialization.h" static IMP originalRead = 0; static IMP originalWrite = 0; @implementation NSPropertyListSerialization (PLUtilAdditions) + (NSData*) _pdataFromPropertyList: (id)aPropertyList format: (NSPropertyListFormat)aFormat errorDescription: (NSString **)anErrorString { NSError *myError = nil; NSData *dest; NSDictionary *loc; loc = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]; switch (aFormat) { case NSPropertyListJSONFormat: dest = [NSJSONSerialization dataWithJSONObject: aPropertyList options: loc != nil ? NSJSONWritingPrettyPrinted : 0 error: &myError]; if (myError != nil && anErrorString != NULL) { *anErrorString = [myError description]; } return dest; case NSPropertyListObjectiveCFormat: case NSPropertyListSwiftFormat: *anErrorString = @"Not implemented"; return nil; default: return (*originalWrite)(self, _cmd, aPropertyList, aFormat, anErrorString); } } + (id) _ppropertyListWithData: (NSData *)data options: (NSPropertyListReadOptions)anOption format: (NSPropertyListFormat *)aFormat error: (out NSError **)error; { NSError *myError = nil; NSPropertyListFormat format; NSJSONReadingOptions jsonOptions = NSJSONReadingAllowFragments; id prop; prop = (*originalRead)(self, _cmd, data, anOption, &format, &myError); if (nil == prop) { if (format == NSPropertyListOpenStepFormat || format == NSPropertyListGNUstepFormat) // rescue as json when we know it is not anything else { switch (anOption) { case NSPropertyListMutableContainersAndLeaves: jsonOptions |= NSJSONReadingMutableLeaves; /* FALLTHROUGH */ case NSPropertyListMutableContainers: jsonOptions |= NSJSONReadingMutableContainers; } format = NSPropertyListJSONFormat; prop = [NSJSONSerialization JSONObjectWithData: data options: jsonOptions error: &myError]; } } if (error != NULL) { *error = myError; } if (aFormat != NULL) { *aFormat = format; } return prop; } + (void) load { Method replacementRead; Method replacementWrite; replacementRead = class_getClassMethod(self, @selector(_ppropertyListWithData:options:format:error:)); replacementWrite = class_getClassMethod(self, @selector(_pdataFromPropertyList:format:errorDescription:)); originalRead = class_replaceMethod(object_getClass(self), @selector(propertyListWithData:options:format:error:), method_getImplementation(replacementRead), method_getTypeEncoding(replacementRead)); originalWrite = class_replaceMethod(object_getClass(self), @selector(dataFromPropertyList:format:errorDescription:), method_getImplementation(replacementWrite), method_getTypeEncoding(replacementWrite)); } @end gnustep-base-1.29.0/Tools/autogsdoc.1000066400000000000000000000601751435650067400173750ustar00rootroot00000000000000.\"autogsdoc(1) man page .\"written by Adrian Robert .\"Copyright (C) 2005 Free Software Foundation, Inc. .\"Copying and distribution of this file, with or without modification, .\"are permitted in any medium without royalty provided the copyright .\"notice and this notice are preserved. .\" .\"Process this file with .\"groff -man -Tascii autogsdoc.1 .\" .TH AUTOGSDOC 1 "March 2004" GNUstep "GNUstep System Manual" .SH NAME autogsdoc \- GNUstep API documentation generator and XML\->HTML converter .SH SYNOPSIS .B autogsdoc .RB [ -Files .IR filename ] .RB [ -GenerateHtml .IR YES|no ] .RB [ -Clean .IR yes|NO ] .RB [ -CleanTemplates .IR yes|NO ] .RB [ -IgnoreDependencies .IR yes|NO ] .RB [ -MakeDependencies .IR yes|NO ] .RB [ -ShowDependencies .IR yes|NO ] .RB [ -HeaderDirectory .IR path ] .RB [ -DocumentationDirectory .IR path ] .RB [ -Declared .IR location ] .RB [ -Project .IR title ] .RB [ -Standards .IR yes|NO ] .RB [ -DocumentAllInstanceVariables .IR yes|NO ] .RB [ -DocumentInstanceVariables .IR YES|no ] .RB [ -InstanceVariablesAtEnd .IR yes|NO ] .RB [ -ConstantsTemplate .IR filename ] .RB [ -FunctionsTemplate .IR filename ] .RB [ -MacrosTemplate .IR filename ] .RB [ -TypedefsTemplate .IR filename ] .RB [ -VariablesTemplate .IR filename ] .RB [ -SystemProjects .IR string ] .RB [ -LocalProjects .IR string ] .RB [ -Projects .IR dictString ] .RB [ -Verbose .IR yes|NO ] .RB [ -Warn .IR yes|NO ] .RB [ -WordMap .IR dictString ] .IR [ files ] .SH DESCRIPTION The autogsdoc tool is a command-line utility that helps developers produce reference documentation for GNUstep APIs. It also enables developers to write and maintain other documentation in XML and have it converted to HTML. In detail, autogsdoc will: .IP - 2 Extract special comments describing the public interfaces of classes, categories, protocols, functions, and macros from Objective C source code (header files and optionally source files) into GSDoc XML files. .IP - 2 Convert GSDoc XML files, whether generated from source code or written manually by developers, into HTML. .IP - 2 Construct indices based on GSDoc XML file sets, and convert those to HTML as well. .P The most common usage this is to run the command with one or more header file names as arguments ... the tool will automatically parse corresponding source files in the same directory as the headers (or the current directory, or the directory specified using the DocumentationDirectory default), and produce GSDoc and HTML files as output. For best results this mode should be run from the directory containing the source files. (Note that since C is a subset of Objective C, this tool can operate to document functions and other C structures in plain C source.) .P GSDoc files may also be given directly in addition or by themselves, and will be converted to HTML. See the GSDoc HTML documentation or the gsdoc(7) man page for information on the GSDoc format. .P Finally, HTML files may be given on the command line. Cross-references to other parts of code documentation found within them will be rewritten based on what is found in the project currently. .SH SOURCE CODE MARKUP .P The source code parser will automatically produce GSDoc documents listing the methods in the classes found in the source files, and it will include text from specially formatted comments from the source files. .P Any comment beginning with slash and .I two asterisks rather than the common slash and single asterisk, is taken to be GSDoc markup, to be use as the description of the class or method following it. This comment text is reformatted and then inserted into the output. .RS 0 Where multiple comments are associated with the same item, they are joined together with a line break (
    ) between each if necessary. .P The tool can easily be used to document programs as well as libraries, simply by giving it the name of the source file containing the main() function of the program - it takes the special comments from that function and handles them specially, inserting them as a section at the end of the first chapter of the document (it creates the first chapter if necessary). .P .B Options are described in the section .I Arguments and Defaults below. .SH EXTRA MARKUP .P There are some cases where special extra processing is performed, predominantly in the first comment found in the source file, from which various chunks of GSDoc markup may be extracted and placed into appropriate locations in the output document - .IP "\fBAutogsdocSource:" 4 In any line where .I AutogsdocSource: is found, the remainder of the line is taken as a source file name to be used instead of making the assumption that each .h file processed uses a .m file of the same name. You may supply multiple .I AutogsdocSource: lines where a header file declares items which are defined in multiple source files. If a file name is absolute, it is used just as supplied. If on the other hand, it is a relative path, the software looks for the source file first relative to the location of the header file, and if not found there, relative to the current directory in which autogsdoc is running, and finally relative to the directory specified by the .I DocumentationDirectory default. .IP "\fB" 4 An abstract of the content of the document ... placed in the head of the GSDoc output. .IP "\fB" 4 A description of the author of the code - may be repeated to handle the case where a document has multiple authors. Placed in the head of the GSDoc output. As an aid to readability of the source, some special additional processing is performed related to the document author - Any line of the form .SM 'Author: name ', or .SM 'By: name ', or .SM 'Author: name' or .SM 'By: name' will be recognised and converted to an .I author element, possibly containing an .I email element. .IP "\fB" 4 Placed in the GSDoc output just before the end of the body of the document - intended to be used for appendices, index etc.. .IP "\fB" 4 Placed immediately before any generated class documentation ... intended to be used to provide overall description of how the code being documented works. Any documentation for the main() function of a program is inserted as a section at the end of this chapter. .IP "\fB" 4 Copyright of the content of the document ... placed in the head of the GSDoc output. As an aid to readability of the source, some special additional processing is performed - Any line of the form 'Copyright (C) text' will be recognised and converted to a .I copy element. .IP "\fB" 4 Date of the revision of the document ... placed in the head of the GSDoc output. If this is omitted the tool will try to construct a value from the RCS Date tag (if available). .IP "\fB" 4 Inserted into the document at the start of the body ... intended to provide for introduction or contents pages etc. .IP "\fB" 4 Title of the document ... placed in the head of the GSDoc output. If this is omitted the tool will generate a (probably poor) title of its own - so you should include this markup manually. .IP "\fB<version>" 4 Version identifier of the document ... placed in the head of the GSDoc output. If this is omitted the tool will try to construct a value from the RCS Revision tag (if available). .P .B NB The markup just described may be used within class, category, or protocol documentation ... if so, it is extracted and wrapped round the rest of the documentation for the class as the class's chapter. The rest of the class documentation is normally inserted at the end of the chapter, but may instead be substituted in in place of the <unit> pseudo-element within the <chapter> element. .SH METHOD MARKUP .P In comments being used to provide text for a method description, the following markup is removed from the text and handled specially - .IP "\fB<init>" 4 The method is marked as being the designated initialiser for the class. .IP "\fB<override-subclass>" 4 The method is marked as being one which subclasses must override (e.g. an abstract method). .IP "\fB<override-never>" 4 The method is marked as being one which subclasses should .I NOT override. .IP "\fB<standards>" 4 The markup is removed from the description and placed .I after it in the GSDoc output - so that the method is described as conforming (or not conforming) to the specified standards. .SH AUTOMATED MARKUP .P Generally, the text in comments is reformatted to standardise and indent it nicely ... the reformatting is .I not performed on any text inside an <example> element. When the text is reformatted, it is broken into whitespace separated \*(lqwords\*(rq which are then subjected to some extra processing ... .IP "" 4 Certain well known constants such as YES, NO, and nil are enclosed in <code> \&... </code> markup. .IP "" 4 The names of method arguments within method descriptions are enclosed in <var> ... </var> markup. .IP "" 4 Method names (beginning with a plus or minus) are enclosed in <ref...> \&... </ref> markup. E.g. "\-init" (without the quotes) would be wrapped in a GSDoc reference element to point to the init method of the current class or, if only one known class had an init method, it would refer to the method of that class. Note the fact that the method name must be surrounded by whitespace to be recognized (though a comma, fullstop, or semicolon at the end of the specifier will act like whitespace). .IP "" 4 Method specifiers including class names (beginning and ending with square brackets) are enclosed in <ref...> ... </ref> markup. e.g. '[NSObject-init]', will create a reference to the init method of NSObject (either the class proper, or any of its categories), while \&'[(NSCopying)-copyWithZone:]', creates a reference to a method in the NSCopying protocol. Note that no spaces must appear between the square brackets in these specifiers. Protocol names are enclosed in round brackets rather than the customary angle brackets, because GSDoc is an XML language, and XML treats angle brackets specially. .IP "" 4 Function names (ending with '()') other than 'main()' are enclosed in <ref...> ... </ref> markup. E.g. "NSLogv()" (without the quotes) would be wrapped in a GSDoc reference element to point to the documentation of the NSLog function. Note the fact that the function name must be surrounded by whitespace (though a comma, fullstop, or semicolon at the end of the specifier will also act as a whitespace terminator). .SH ARGUMENTS AND DEFAULTS .P The tool accepts certain user defaults (which can of course be supplied as command-line arguments by prepending '\-' before the default name and giving the value afterwards, as in \-Clean YES): .IP "\fBClean" 4 If this boolean value is set to YES, then rather than generating documentation, the tool removes all GSDoc files generated in the project, and all html files generated from them (as well as any which would be generated from GSDoc files listed explicitly), and finally removes the project index file. The only exception to this is that template GSDoc files (i.e. those specified using "\-ConstantsTemplate ...", "\-FunctionsTemplate ..." arguments etc) are not deleted unless the CleanTemplates flag is set. .IP "\fBCleanTemplates" 4 This flag specifies whether template GSDoc files are to be removed along with other files when the Clean option is specified. The default is for them not to be removed ... since these templates may have been produced manually and just had data inserted into them. .IP "\fBConstantsTemplate" 4 Specify the name of a template document into which documentation about constants should be inserted from all files in the project. This is useful if constants in the source code are scattered around many files, and you need to group them into one place. You are responsible for ensuring that the basic template document (into which individual constant documentation is inserted) contains all the other information you want, but as a convenience autogsdoc will generate a simple template (which you may then edit) for you if the file does not exist. Insertion takes place immediately before the .I back element (or if that does not exist, immediately before the end of the .I body element) in the template. .IP "\fBDeclared" 4 Specify where headers are to be documented as being found. The actual name produced in the documentation is formed by appending the last component of the header file name to the value of this default. If this default is not specified, the full name of the header file (as supplied on the command line), with the HeaderDirectory default prepended, is used. A typical usage of this might be '"\-Declared Foundation"' when generating documentation for the GNUstep base library. This would result in the documentation saying that NSString is declared in 'Foundation/NSString.h' .IP "\fBDocumentAllInstanceVariables" 4 This flag permits you to generate documentation for all instance variables. Normally, only those explicitly declared 'public' or \&'protected' will be documented. .IP "\fBDocumentInstanceVariables" 4 This flag permits you to turn off documentation for instance variables completely. Normally, explicitly declared 'public' or 'protected' instance variables will be documented. .IP "\fBInstanceVariablesAtEnd" 4 This flag, if set, directs the HTML generator to place instance variable documentation at the end of the class, instead of the beginning. This is useful if you use a lot of protected instance variables which are only going to be of secondary interest to general users of the class. .IP "\fBDocumentationDirectory" 4 May be used to specify the directory in which generated documentation is to be placed. If this is not set, output is placed in the current directory. This directory is also used as a last resort to locate source files (not headers), and more importantly, it is used as the .I first and only resort to locate any .gsdoc files that are passed in on the command line. Any path information given for these files is .B removed and they are searched for in 'DocumentationDirectory' (even though they may not have been autogenerated). .IP "\fBFiles" 4 Specifies the name of a file containing a list of file names as a property list array .I (name1,name2,...) format. If this is present, filenames in the program argument list are ignored and the names in this file are used as the list of names to process. .IP "\fBFunctionsTemplate" 4 Specify the name of a template document into which documentation about functions should be inserted from all files in the project. This is useful if function source code is scattered around many files, and you need to group it into one place. You are responsible for ensuring that the basic template document (into which individual function documentation is inserted) contains all the other information you want, but as a convenience autogsdoc will generate a simple template (which you may then edit) for you if the file does not exist. Insertion takes place immediately before the .I back element (or if that does not exist, immediately before the end of the .I body element) in the template. .IP "\fBGenerateHtml" 4 May be used to specify if HTML output is to be generated. Defaults to YES. .IP "\fBHeaderDirectory" 4 May be used to specify the directory to be searched for header files. When supplied, this value is prepended to relative header names, otherwise the relative header names are interpreted relative to the current directory. Header files specified as absolute paths are not influenced by this default. .IP "\fBIgnoreDependencies" 4 A boolean value which may be used to specify that the program should ignore file modification times and regenerate files anyway. Provided for use in conjunction with the 'make' system, which is expected to manage dependency checking itsself. .IP "\fBLocalProjects" 4 This value is used to control the automatic inclusion of local external projects into the indexing system for generation of cross-references in final document output. If set to 'None', then no local project references are done, otherwise, the 'Local' GNUstep documentation directory is recursively searched for files with a '.igsdoc' extension, and the indexing information from those files is used. The value of this string is also used to generate the filenames in the cross reference ... if it is an empty string, the path to use is assumed to be a file in the same directory where the igsdoc file was found, otherwise it is used as a prefix to the name in the index. NB. Local projects with the same name as the project currently being documented will .I not be included by this mechanism. If you wish to include such projects, you must do so explicitly using .I "-Projects ..." .IP "\fBMacrosTemplate" 4 Specify the name of a template document into which documentation about macros should be inserted from all files in the project. This is useful if macro code is scattered around many files, and you need to group it into one place. You are responsible for ensuring that the basic template document (into which individual macro documentation is inserted) contains all the other information you want, but as a convenience autogsdoc will generate a simple template (which you may then edit) for you if the file does not exist. Insertion takes place immediately before the .I back element (or if that does not exist, immediately before the end of the .I body element) in the template. .IP "\fBMakeDependencies" 4 A filename to be used to output dependency information for make. This will take the form of listing all header and source files known for the project as dependencies of the project name (see \&'Project'). .IP "\fBProject" 4 May be used to specify the name of this project ... determines the name of the index reference file produced as part of the documentation to provide information enabling other projects to cross-reference to items in this project. .IP "\fBProjects" 4 This value may be supplied as a dictionary containing the paths to the igsdoc index/reference files used by external projects, along with values to be used to map the filenames found in the indexes. For example, if a project index (igsdoc) file says that the class \&'Foo' is found in the file 'Foo', and the path associated with that project index is '/usr/doc/proj', Then generated html output may reference the class as being in \&'/usr/doc/prj/Foo.html' . Note that a dictionary may be given on the command line by using the standard PropertyList format (not the XML format of OS X), using semicolons as line-separators, and enclosing it in single quotes. .IP "\fBShowDependencies" 4 A boolean value which may be used to specify that the program should log which files are being regenerated because of their dependencies on other files. .IP "\fBStandards" 4 A boolean value used to specify whether the program should insert information about standards complience into the documentation. This should only be used when documenting the GNUstep libraries and tools themselves as it assumes that the code being documented is part of GNUstep and possibly complies with the OpenStep standard or implements MacOS-X compatible methods. .IP "\fBSystemProjects" 4 This value is used to control the automatic inclusion of system external projects into the indexing system for generation of cross-references in final document output. If set to 'None', then no system project references are done, otherwise, the 'System' GNUstep documentation directory is recursively searched for files with a '.igsdoc' extension, and the indexing information from those files is used. The value of this string is also used to generate the filenames in the cross reference ... if it is an empty string, the path to use is assumed to be a file in the same directory where the igsdoc file was found, otherwise it is used as a prefix to the name in the index. NB. System projects with the same name as the project currently being documented will .I not be included by this mechanism. If you wish to include such projects, you must do so explicitly using .I "-Projects ..." .IP "\fBTypedefsTemplate" 4 Specify the name of a template document into which documentation about typedefs should be inserted from all files in the project. This is useful if typedef source code is scattered around many files, and you need to group it into one place. You are responsible for ensuring that the basic template document (into which individual typedef documentation is inserted) contains all the other information you want, but as a convenience autogsdoc will generate a simple template (which you may then edit) for you if the file does not exist. Insertion takes place immediately before the .I back element (or if that does not exist, immediately before the end of the .I body element) in the template. .IP "\fBUp" 4 A string used to supply the name to be used in the 'up' link from generated GSDoc documents. This should normally be the name of a file which contains an index of the contents of a project. If this is missing or set to an empty string, then no 'up' link will be provided in the documents. .IP "\fBVariablesTemplate" 4 Specify the name of a template document into which documentation about variables should be inserted from all files in the project. This is useful if variable source code is scattered around many files, and you need to group it into one place. You are responsible for ensuring that the basic template document (into which individual variable documentation is inserted) contains all the other information you want, but as a convenience autogsdoc will generate a simple template (which you may then edit) for you if the file does not exist. Insertion takes place immediately before the .I back element (or if that does not exist, immediately before the end of the .I body element) in the template. .IP "\fBVerbose" 4 A boolean used to specify whether you want verbose debug/warning output to be produced. .IP "\fBWarn" 4 A boolean used to specify whether you want standard warning output (e.g. report of undocumented methods) produced. .IP "\fBWordMap" 4 This value is a dictionary used to map identifiers/keywords found in the source files to other words. Generally you will not have to use this, but it is sometimes helpful to avoid the parser being confused by the use of C preprocessor macros. You can effectively redefine the macro to something less confusing. The value you map the identifier to must be one of - Another identifier, An empty string - the value is ignored, Two slashes ('//') - the rest of the line is ignored. Note that a dictionary may be given on the command line by using the standard PropertyList format (not the XML format of OS X), using semicolons as line-separators, and enclosing it in single quotes. .SH INTER-DOCUMENT LINKAGE .P The 'Up' default is used to specify the name of a document which should be used as the 'up' link for any other documents used. This name must not include a path or extension. Generally, the document referred to by this default should be a hand-edited GSDoc document which should have a <em>back</em> section containing a project index. e.g. .P <?xml version="1.0"?> .RS 0 <!DOCTYPE gsdoc PUBLIC "-//GNUstep//DTD gsdoc 1.0.3//EN" .RS 0 "http://www.gnustep.org/gsdoc-1_0_3.xml"> .RS 0 <gsdoc base="index"> .RS 0 <head> .RS 0 <title>My project reference .RS 0 .RS 0 .RS 0 .RS 0 .RS 0 My project reference .RS 0 .RS 0 .RS 0 .RS 0 .RS 0 .RS 0 .RS 0 .P .RS 0 .SH FILES Source: .h, .m, .c .RS 0 GSDoc: .gsdoc .RS 0 Index: .igsdoc .RS 0 HTML: .html .SH BUGS Several GSDoc elements are not rendered properly into HTML yet. These are: , , . .SH DIAGNOSTICS .P Error messages and warnings can come from each of the stages of the pipeline: top-level control, source parsing, GSDoc parsing, and indexing. .SH SEE ALSO .P gsdoc(7), GNUstep(7) .P .SH HISTORY Autogsdoc combined the capabilities of two earlier tools, 'autodoc' and 'gsdoc', which performed the source->GSDoc and GSDoc->HTML translations respectively. These earlier tools and the GSDoc format were developed for GNUstep based on the earlier GDML SGML language. .P This manual page first appeared in gnustep-base 1.9.2 (March 2004). .P .SH AUTHORS .B autogsdoc was written by Richard Frith-Macdonald .P This manual page added by Adrian Robert . gnustep-base-1.29.0/Tools/autogsdoc.m000066400000000000000000002406661435650067400174760ustar00rootroot00000000000000/** This tool produces GSDoc files from source files. Autogsdoc ... a tool to make documentation from source code Copyright (C) 2001-2016 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: October 2001 This file is part of the GNUstep Project This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. You should have received a copy of the GNU General Public License along with this program; see the file COPYINGv3. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. The autogsdoc tool
    Overview

    The autogsdoc tool is a command-line utility that helps developers produce reference documentation for GNUstep APIs. It also enables developers to write and maintain other documentation in XML and have it converted to HTML. In detail, autogsdoc will:

    Extract special comments describing the public interfaces of classes, categories, protocols, functions, and macros from Objective C source code (header files and optionally source files) into GSDoc XML files. (Note that since C is a subset of Objective C, this tool can operate to document functions and other C structures in plain C source.) Convert GSDoc XML files, whether generated from source code or written manually by developers, into HTML. Construct indices based on GSDoc XML file sets, and convert those to HTML as well.

    synopsis: autogsdoc (options) (files)
        (options) described below
        (files) .h, .m, .gsdoc, and/or .html files, in any order.

    The most common usage this is to run the command with one or more header file names as arguments ... the tool will automatically parse corresponding source files in the same directory as the headers (or the current directory, or the directory specified using the DocumentationDirectory default), and produce GSDoc and HTML files as output. For best results this mode should be run from the directory containing the source files.

    GSDoc files may also be given directly in addition or by themselves, and will be converted to HTML. See the GSDoc reference for information on the GSDoc format.

    Finally, HTML files may be given on the command line. Cross-references to other parts of code documentation found within them will be rewritten based on what is found in the project currently.

    Source Code Markup

    The source code parser will automatically produce GSDoc documents listing the methods in the classes found in the source files, and it will include text from specially formatted comments from the source files.

    Any comment beginning with slash and two asterisks rather than the common slash and single asterisk, is taken to be GSDoc markup, to be use as the description of the class or method following it. This comment text is reformatted and then inserted into the output.
    Where multiple comments are associated with the same item, they are joined together with a line break (<br />) between each if necessary.
    Within a comment the special markup <ignore> and </ignore> may be used to tell autogsdoc to completely ignore the sourcecode between these two pieces of markup (ie. the parser will skip from the point just before it is told to start ignoring, to just after the point where it is told to stop (or end of file if that occurs first).

    The tool can easily be used to document programs as well as libraries, simply by giving it the name of the source file containing the main() function of the program - it takes the special comments from that function and handles them specially, inserting them as a section at the end of the first chapter of the document (it creates the first chapter if necessary).

    Options are described in the section Arguments and Defaults below.

    Extra markup

    There are some cases where special extra processing is performed, predominantly in the first comment found in the source file, from which various chunks of GSDoc markup may be extracted and placed into appropriate locations in the output document -

    AutogsdocSource:  In any line where AutogsdocSource:  is found, the remainder of the line is taken as a source file name to be used instead of making the assumption that each .h file processed uses a  .m file of the same name. You may supply multiple AutogsdocSource:  lines where a header file declares items which are defined in multiple source files.
    If a file name is absolute, it is used just as supplied.
    If on the other hand, it is a relative path, the software looks for the source file first relative to the location of the header file, and if not found there, relative to the current directory in which autogsdoc is running, and finally relative to the directory specified by the DocumentationDirectory default.
    <abstract> An abstract of the content of the document ... placed in the head of the GSDoc output. <author> A description of the author of the code - may be repeated to handle the case where a document has multiple authors. Placed in the head of the GSDoc output.
    As an aid to readability of the source, some special additional processing is performed related to the document author -
    Any line of the form 'Author: name <email-address>', or 'By: name <email-address>', or 'Author: name' or 'By: name' will be recognised and converted to an author element, possibly containing an email element.
    <back> Placed in the GSDoc output just before the end of the body of the document - intended to be used for appendices, index etc.. <chapter> Placed immediately before any generated class documentation ... intended to be used to provide overall description of how the code being documented works.
    Any documentation for the main() function of a program is inserted as a section at the end of this chapter.
    <copy> Copyright of the content of the document ... placed in the head of the GSDoc output.
    As an aid to readability of the source, some special additional processing is performed -
    Any line of the form 'Copyright (C) text' will be recognised and converted to a copy element.
    <date> Date of the revision of the document ... placed in the head of the GSDoc output. If this is omitted the tool will try to construct a value from the RCS Date tag (if available). <front> Inserted into the document at the start of the body ... intended to provide for introduction or contents pages etc. <title> Title of the document ... placed in the head of the GSDoc output. If this is omitted the tool will generate a (probably poor) title of its own - so you should include this markup manually. <version> Version identifier of the document ... placed in the head of the GSDoc output. If this is omitted the tool will try to construct a value from the RCS Revision tag (if available).

    NBThe markup just described may be used within class, category, or protocol documentation ... if so, it is extracted and wrapped round the rest of the documentation for the class as the class's chapter. The rest of the class documentation is normally inserted at the end of the chapter, but may instead be substituted in in place of the <unit /> pseudo-element within the <chapter> element.

    Method markup

    In comments being used to provide text for a method description, the following markup is removed from the text and handled specially -

    <init /> The method is marked as being the designated initialiser for the class. <override-subclass /> The method is marked as being one which subclasses must override (e.g. an abstract method). <override-dummy /> The method is marked as being one which is a dummy implementation intended for subclasses to override, though not one they are forced to implement. <override-never /> The method is marked as being one which subclasses should NOT override.
    Automated markup

    Generally, the text in comments is reformatted to standardise and indent it nicely ... the reformatting is not performed on any text inside an <example> element.
    When the text is reformatted, it is broken into whitespace separated 'words' which are then subjected to some extra processing ...

    Certain well known constants such as YES, NO, and nil are enclosed in <code> ... </code> markup. The names of method arguments within method descriptions are enclosed in <var> ... </var> markup. Method names (beginning with a plus or minus) are enclosed in <ref...> ... </ref> markup.
    e.g. "-init" (without the quotes) would be wrapped in a GSDoc reference element to point to the init method of the current class or, if only one known class had an init method, it would refer to the method of that class.
    Note the fact that the method name must be surrounded by whitespace to be recognized (though a comma, fullstop, or semicolon at the end of the specifier will act like whitespace).
    Method specifiers including class names (beginning and ending with square brackets) are enclosed in <ref...> ... </ref> markup.
    e.g. [NSObject-init], will create a reference to the init method of NSObject (either the class proper, or any of its categories), while
    [(NSCopying)-copyWithZone:], creates a reference to a method in the NSCopying protocol.
    Note that no spaces must appear between the square brackets in these specifiers.
    Protocol names are enclosed in round brackets rather than the customary angle brackets, because GSDoc is an XML language, and XML treats angle brackets specially.
    Class names (and also protocol and category names) enclosed in square brackets are also cross referenced.
    Protocol names are enclosed in round brackets rather than the customary angle brackets, because GSDoc is an XML language, and XML treats angle brackets specially.
    Function names (ending with '()') other than 'main()' are enclosed in <ref...> ... </ref> markup.
    e.g. "NSLogv()" (without the quotes) would be wrapped in a GSDoc reference element to point to the documentation of the NSLog function.
    Note the fact that the function name must be surrounded by whitespace (though a comma, fullstop, or semicolon at the end of the specifier will also act as a whitespace terminator).
    Arguments and Defaults

    The tool accepts certain user defaults (which can of course be supplied as command-line arguments by prepending '-' before the default name and giving the value afterwards, as in -Clean YES):

    Clean If this boolean value is set to YES, then rather than generating documentation, the tool removes all GSDoc files generated in the project, and all html files generated from them (as well as any which would be generated from GSDoc files listed explicitly), and finally removes the project index file.
    The only exception to this is that template GSDoc files (i.e. those specified using "-ConstantsTemplate ...", "-FunctionsTemplate ..." arguments etc) are not deleted unless the CleanTemplates flag is set.
    CleanTemplates This flag specifies whether template GSDoc files are to be removed along with other files when the Clean option is specified. The default is for them not to be removed ... since these templates may have been produced manually and just had data inserted into them. ConstantsTemplate Specify the name of a template document into which documentation about constants should be inserted from all files in the project.
    This is useful if constants in the source code are scattered around many files, and you need to group them into one place.
    You are responsible for ensuring that the basic template document (into which individual constant documentation is inserted) contains all the other information you want, but as a convenience autogsdoc will generate a simple template (which you may then edit) for you if the file does not exist.
    Insertion takes place immediately before the back element (or if that does not exist, immediately before the end of the body element) in the template.
    Declared Specify where headers are to be documented as being found.
    The actual name produced in the documentation is formed by appending the last component of the header file name to the value of this default.
    If this default is not specified, the full name of the header file (as supplied on the command line), with the HeaderDirectory default prepended, is used.
    A typical usage of this might be "-Declared Foundation" when generating documentation for the GNUstep base library. This would result in the documentation saying that NSString is declared in Foundation/NSString.h
    DocumentAllInstanceVariables This flag permits you to generate documentation for all instance variables. Normally, only those explicitly declared 'public' or 'protected' will be documented. DocumentInstanceVariables This flag permits you to turn off documentation for instance variables completely. Normally, explicitly declared 'public' or 'protected' instance variables will be documented. InstanceVariablesAtEnd This flag, if set, directs the HTML generator to place instance variable documentation at the end of the class, instead of the beginning. This is useful if you use a lot of protected instance variables which are only going to be of secondary interest to general users of the class. DocumentationDirectory May be used to specify the directory in which generated documentation is to be placed. If this is not set, output is placed in the current directory. This directory is also used as a last resort to locate source files (not headers), and more importantly, it is used as the first and only resort to locate any .gsdoc files that are passed in on the command line. Any path information given for these files is removed and they are searched for in DocumentationDirectory (even though they may not have been autogenerated). Files Specifies the name of a file containing a list of file names as a property list array (name1,name2,...) format. If this is present, filenames in the program argument list are ignored and the names in this file are used as the list of names to process. FunctionsTemplate Specify the name of a template document into which documentation about functions should be inserted from all files in the project.
    This is useful if function source code is scattered around many files, and you need to group it into one place.
    You are responsible for ensuring that the basic template document (into which individual function documentation is inserted) contains all the other information you want, but as a convenience autogsdoc will generate a simple template (which you may then edit) for you if the file does not exist.
    Insertion takes place immediately before the back element (or if that does not exist, immediately before the end of the body element) in the template.
    GenerateHtml May be used to specify if HTML output is to be generated. Defaults to YES. HeaderDirectory May be used to specify the directory to be searched for header files. When supplied, this value is prepended to relative header names, otherwise the relative header names are interpreted relative to the current directory.
    Header files specified as absolute paths are not influenced by this default.
    IgnoreDependencies A boolean value which may be used to specify that the program should ignore file modification times and regenerate files anyway. Provided for use in conjunction with the make system, which is expected to manage dependency checking itself. LocalProjects This value is used to control the automatic inclusion of local external projects into the indexing system for generation of cross-references in final document output.
    If set to 'None', then no local project references are done, otherwise, the 'Local' GNUstep documentation directory is recursively searched for files with a .igsdoc extension, and the indexing information from those files is used.
    The value of this string is also used to generate the filenames in the cross reference ... if it is an empty string, the path to use is assumed to be a file in the same directory where the igsdoc file was found, otherwise it is used as a prefix to the name in the index.
    NB. Local projects with the same name as the project currently being documented will not be included by this mechanism. If you wish to include such projects, you must do so explicitly using "-Projects ..."
    MacrosTemplate Specify the name of a template document into which documentation about macros should be inserted from all files in the project.
    This is useful if macro code is scattered around many files, and you need to group it into one place.
    You are responsible for ensuring that the basic template document (into which individual macro documentation is inserted) contains all the other information you want, but as a convenience autogsdoc will generate a simple template (which you may then edit) for you if the file does not exist.
    Insertion takes place immediately before the back element (or if that does not exist, immediately before the end of the body element) in the template.
    MakeDependencies A filename to be used to output dependency information for make. This will take the form of listing all header and source files known for the project as dependencies of the project name (see Project). Project Specifies the name of this project ... determines the name of the index reference file produced as part of the documentation to provide information enabling other projects to cross-reference to items in this project. If not set, 'Untitled' is used. Projects This value may be supplied as a dictionary containing the paths to the igsdoc index/reference files used by external projects, along with values to be used to map the filenames found in the indexes.
    For example, if a project index (igsdoc) file says that the class Foo is found in the file Foo, and the path associated with that project index is /usr/doc/proj, Then generated html output may reference the class as being in /usr/doc/prj/Foo.html . Note that a dictionary may be given on the command line by using the standard PropertyList format (not the XML format of OS X), using semicolons as line-separators, and enclosing it in single quotes.
    ShowDependencies A boolean value which may be used to specify that the program should log which files are being regenerated because of their dependencies on other files. Standards A boolean value used to specify whether the program should insert information about standards complience into the documentation. This should only be used when documenting the GNUstep libraries and tools themselves as it assumes that the code being documented is part of GNUstep and possibly complies with the OpenStep standard or implements MacOS-X compatible methods. SystemProjects This value is used to control the automatic inclusion of system external projects into the indexing system for generation of cross-references in final document output.
    If set to 'None', then no system project references are done, otherwise, the 'System' GNUstep documentation directory is recursively searched for files with a .igsdoc extension, and the indexing information from those files is used.
    The value of this string is also used to generate the filenames in the cross reference ... if it is an empty string, the path to use is assumed to be a file in the same directory where the igsdoc file was found, otherwise it is used as a prefix to the name in the index.
    NB. System projects with the same name as the project currently being documented will not be included by this mechanism. If you wish to include such projects, you must do so explicitly using "-Projects ..."
    TypedefsTemplate Specify the name of a template document into which documentation about typedefs should be inserted from all files in the project.
    This is useful if typedef source code is scattered around many files, and you need to group it into one place.
    You are responsible for ensuring that the basic template document (into which individual typedef documentation is inserted) contains all the other information you want, but as a convenience autogsdoc will generate a simple template (which you may then edit) for you if the file does not exist.
    Insertion takes place immediately before the back element (or if that does not exist, immediately before the end of the body element) in the template.
    Up A string used to supply the name to be used in the 'up' link from generated GSDoc documents. This should normally be the name of a file which contains an index of the contents of a project.
    If this is missing or set to an empty string, then no 'up' link will be provided in the documents.
    VariablesTemplate Specify the name of a template document into which documentation about variables should be inserted from all files in the project.
    This is useful if variable source code is scattered around many files, and you need to group it into one place.
    You are responsible for ensuring that the basic template document (into which individual variable documentation is inserted) contains all the other information you want, but as a convenience autogsdoc will generate a simple template (which you may then edit) for you if the file does not exist.
    Insertion takes place immediately before the back element (or if that does not exist, immediately before the end of the body element) in the template.
    Verbose A boolean used to specify whether you want verbose debug/warning output to be produced. Warn A boolean used to specify whether you want standard warning output (e.g. report of undocumented methods) produced. WordMap This value is a dictionary used to map identifiers/keywords found in the source files to other words. Generally you will not have to use this, but it is sometimes helpful to avoid the parser being confused by the use of C preprocessor macros. You can effectively redefine the macro to something less confusing.
    The value you map the identifier to must be one of -
    Another identifier,
    An empty string - the value is ignored,
    Two slashes ('//') - the rest of the line is ignored.
    Note that a dictionary may be given on the command line by using the standard PropertyList format (not the XML format of OS X), using semicolons as line-separators, and enclosing it in single quotes.
    Inter-document linkage

    The 'Up' default is used to specify the name of a document which should be used as the 'up' link for any other documents used.
    This name must not include a path or extension.
    Generally, the document referred to by this default should be a hand-edited GSDoc document which should have a back section containing a project index. e.g.

    <?xml version="1.0"?> <!DOCTYPE gsdoc PUBLIC "-//GNUstep//DTD gsdoc 1.0.4//EN" "http://www.gnustep.org/gsdoc-1_0_4.dtd"> <gsdoc base="index"> <head> <title>My project reference</title> <author name="my name"></author> </head> <body> <chapter> <heading>My project reference</heading> </chapter> <back> <index scope="project" type="title" /> </back> </body> </gsdoc>
    Implementation Notes

    The autogsdoc tool internally makes use of the following four classes-

    Parses source code comments to an internal representation. Converts internal representation of source comments to a gsdoc document. Internal representation of an igsdoc file, representing indices of a project's files. Converts gsdoc XML to HTML, using AGSIndex instances.
    */ #import "common.h" #import "Foundation/NSArray.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSData.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSFileManager.h" #import "Foundation/NSPathUtilities.h" #import "Foundation/NSProcessInfo.h" #import "Foundation/NSSet.h" #import "Foundation/NSUserDefaults.h" #import "AGSParser.h" #import "AGSOutput.h" #import "AGSIndex.h" #import "AGSHtml.h" #import "GNUstepBase/GSObjCRuntime.h" #import "GNUstepBase/NSString+GNUstepBase.h" #import "GNUstepBase/NSMutableString+GNUstepBase.h" /** Invokes the autogsdoc tool. */ int main(int argc, char **argv, char **env) { NSProcessInfo *proc; unsigned i; NSDictionary *argsRecognized; NSUserDefaults *defs; NSFileManager *mgr; NSString *documentationDirectory; NSString *declared; NSString *headerDirectory; NSString *project; NSString *refsName; NSDictionary *originalIndex; AGSIndex *projectRefs; AGSIndex *globalRefs; NSDate *rDate = nil; NSString *refsFile; id obj; unsigned count; unsigned firstFile = 1; BOOL generateHtml = YES; BOOL ignoreDependencies = NO; BOOL showDependencies = NO; BOOL verbose = NO; BOOL warn = NO; BOOL instanceVarsAtEnd = YES; NSArray *files = nil; NSMutableArray *sFiles = nil; // Source NSMutableArray *gFiles = nil; // GSDOC NSMutableArray *hFiles = nil; // HTML NSString *symbolDeclsFile = nil; NSMutableDictionary *symbolDecls = nil; NSMutableSet *deps = nil; NSAutoreleasePool *outer = nil; NSAutoreleasePool *pool = nil; NSString *arg; NSString *opt; NSSet *argSet; NSArray *argsGiven; NSArray *informalProtocols = nil; /* Overall process in this file is as follows: 1) Get/test defaults and arguments. 2) Init filename list, and move .h/.m into "source files", .gsdoc into "gsdoc files", and .html into "html files". 3) Load existing .igsdoc file (PropertyList/Dictionary format) if found, initializing an AGSIndex from it. Also load existing OrderedSymbolDeclarations.plist if found. 4) Clean if desired: 4a) Build list of all template files, and remove generated content from them if not cleaning templates. 4b) Figure out generated files from index file (if none assumes none generated) and remove them (but not template files unless supposed to). 4c) Remove index file. 4d) Remove HTML files corresponding to .gsdoc files in current list. 4e) Remove the OrderedSymbolDeclarations plist file 5) Start with "source files".. for each one (hereafter called a "header file"): 5a) Parse declarations (in .h or .m) using an AGSParser object. 5b) Determine (possibly multiple) dependent .m files corresponding to a .h and parse them. 5c) Feed parser results to an AGSOutput instance. Finally write the OrderedSymbolDeclarations.plist built by the parser. 6) Move to "gsdoc files" (including both command-line given ones and just-generated ones).. and generate the index; for each one: 6a) Remove any path specification and search in documentationDirectory then CWD for it. 6b) Parse the file, call [localRefs makeRefs: root], [projectRefs mergeRefs: localRefs] to make indices. 7) Write the .igsdoc file. 8) Build index references to external projects. 9) Create HTML frames auxiliary files. 10) If needed, re-pass through the "gsdoc files" to generate HTML. 10a) Find files as before. 10b) Parse as before. 10c) Feed the DOM tree to an AGSHtml instance, and dump the result to a file. 11) For HTML files that were given on the command line, adjust all cross reference HREFs to paths given in arguments. 12) If MakeDependencies was requested, list all header and source files as colon-dependencies of the project name. */ #ifdef GS_PASS_ARGUMENTS GSInitializeProcess(argc, argv, env); #endif outer = [NSAutoreleasePool new]; #ifndef HAVE_LIBXML NSLog(@"ERROR: The GNUstep Base Library was built\n" @" without an available libxml library. Autogsdoc needs the libxml\n" @" library to function. Aborting"); exit(EXIT_FAILURE); #endif /* * 1) Get/test defaults and arguments. */ defs = [NSUserDefaults standardUserDefaults]; [defs registerDefaults: [NSDictionary dictionaryWithObjectsAndKeys: @"Untitled", @"Project", nil]]; // BEGIN test for any unrecognized arguments, or "--help" argsRecognized = [NSDictionary dictionaryWithObjectsAndKeys: @"\t\t\tBOOL\t(NO)\n\tproduce verbose output", @"Verbose", @"\t\t\tBOOL\t(NO)\n\tproduce warnings", @"Warn", @"\tBOOL\t(NO)\n\tignore file mod times (always generate)", @"IgnoreDependencies", @"\t\tBOOL\t(NO)\n\tlog files being regenerated due to dependencies", @"ShowDependencies", @"\t\tBOOL\t(YES)\n\tgenerate HTML output " @"(as opposed to just gsdoc from source)", @"GenerateHtml", @"\t\t\tSTR\t(\"\")\n\tspecify where headers " @"are to be documented as being found", @"Declared", @"\t\t\tSTR\t(\"Untitled\")\n\thead title name of this documentation", @"Project", @"\t\tSTR\t(.)\n\tdirectory to search for .h files", @"HeaderDirectory", @"\tSTR\t(.)\n\tdirectory to place generated files and " @"search for gsdoc files", @"DocumentationDirectory", @"\t\t\tSTR\t(\"\")\n\tname of file containing filenames to document", @"Files", @"\t\t\tBOOL\t(NO)\n\tremove all generated files", @"Clean", @"\t\tBOOL\t(NO)\n\tremove template files when cleaning", @"CleanTemplates", @"\t\t\tSTR\t(\"\")\n\tfilename to link to from generated HTML", @"Up", @"\t\t\tspecial\t(nil)\n\tdictionary used to preprocess (see docs)", @"WordMap", @"\t\t\tBOOL\t(NO)\n\twhether to insert information on " @"standards compliance", @"Standards", @"BOOL\t(NO)\n\tdocument private instance variables", @"DocumentAllInstanceVariables", @"\tBOOL\t(YES)\n\tdocument instance variables at all", @"DocumentInstanceVariables", @"\tBOOL\t(YES)\n\tput instance variable docs at end of class", @"InstanceVariablesAtEnd", @"\t\tSTR\t(\"None\")\n\twhether to include other projects in index", @"LocalProjects", @"\t\tSTR\t(\"None\")\n\twhether to include system projects in index", @"SystemProjects", @"\t\t\tSTR\t(\"None\")\n\texplicit list of other projects to index", @"Projects", @"\t\tSTR\t(\"\")\n\tfile to output dependency info for 'make' into", @"MakeDependencies", @"\t\tSTR\t(\"\")\n\tfile into which docs for constants " @"should be consolidated", @"ConstantsTemplate", @"\t\tSTR\t(\"\")\n\tfile into which docs for functions " @"should be consolidated", @"FunctionsTemplate", @"\t\tSTR\t(\"\")\n\tfile into which docs for macros " @"should be consolidated", @"MacrosTemplate", @"\t\tSTR\t(\"\")\n\tfile into which docs for typedefs " @"should be consolidated", @"TypedefsTemplate", @"\t\tSTR\t(\"\")\n\tfile into which docs for variables " @"should be consolidated", @"VariablesTemplate", @"\t\tBOOL\t(NO)\n\tif YES, create documentation pages " @"for display in HTML frames", @"MakeFrames", @"\t\tString\t(nil)\n\tIf set, look for DTDs in the given directory", @"DTDs", @"\tBOOL\t(NO)\n\tif YES, wrap paragraphs delimited by \\n\\n in " @"

    tags when possible", @"GenerateParagraphMarkup", nil]; argSet = [NSSet setWithArray: [argsRecognized allKeys]]; argsGiven = [[NSProcessInfo processInfo] arguments]; for (i = 0; i < [argsGiven count]; i++) { arg = [argsGiven objectAtIndex: i]; if ([arg characterAtIndex: 0] == '-') { opt = ([arg characterAtIndex: 1] == '-') ? [arg substringFromIndex: 2] : [arg substringFromIndex: 1]; } else { continue; } if (![argSet containsObject: opt] || [@"help" isEqual: opt]) { NSArray *args = [argsRecognized allKeys]; GSPrintf(stderr, @"Usage:\n"); GSPrintf(stderr, [NSString stringWithFormat: @" %@ [options] [files]\n", [argsGiven objectAtIndex: 0]]); GSPrintf(stderr, @"\n Options:\n"); for (i = 0; i < [args count]; i++) { arg = [args objectAtIndex: i]; GSPrintf(stderr, [NSString stringWithFormat: @" -%@\t%@\n\n", arg, [argsRecognized objectForKey: arg]]); } GSPrintf(stderr, @"\n Files:\n"); GSPrintf(stderr, @" [.h files]\t\tMust be in 'HeaderDirectory'\n"); GSPrintf(stderr, @" [.m files]\t\tAbsolute or relative path (from here)\n"); GSPrintf(stderr, @" [.gsdoc files]\tMust be in 'DocumentationDirectory'\n\n"); exit(1); } } mgr = [NSFileManager defaultManager]; if ([GSXMLParser respondsToSelector: @selector(setDTDs:)]) { [GSXMLParser setDTDs: [defs stringForKey: @"DTDs"]]; } verbose = [defs boolForKey: @"Verbose"]; warn = [defs boolForKey: @"Warn"]; if (YES == warn) { verbose = YES; // Do we want this? } ignoreDependencies = [defs boolForKey: @"IgnoreDependencies"]; showDependencies = [defs boolForKey: @"ShowDependencies"]; if (ignoreDependencies == YES) { if (showDependencies == YES) { showDependencies = NO; NSLog(@"ShowDependencies(YES) used with IgnoreDependencies(YES)"); } } obj = [defs objectForKey: @"GenerateHtml"]; if (obj != nil) { generateHtml = [defs boolForKey: @"GenerateHtml"]; } obj = [defs objectForKey: @"InstanceVariablesAtEnd"]; if (obj != nil) { instanceVarsAtEnd = [defs boolForKey: @"InstanceVariablesAtEnd"]; } declared = [defs stringForKey: @"Declared"]; project = [defs stringForKey: @"Project"]; refsName = [[project stringByAppendingPathExtension: @"igsdoc"] copy]; headerDirectory = [defs stringForKey: @"HeaderDirectory"]; if (headerDirectory == nil) { headerDirectory = @""; } documentationDirectory = [defs stringForKey: @"DocumentationDirectory"]; if (documentationDirectory == nil) { documentationDirectory = @""; } if ([documentationDirectory length] > 0 && [mgr fileExistsAtPath: documentationDirectory] == NO) { [mgr createDirectoryAtPath: documentationDirectory withIntermediateDirectories: YES attributes: nil error: NULL]; } symbolDeclsFile = [documentationDirectory stringByAppendingPathComponent: @"OrderedSymbolDeclarations.plist"]; proc = [NSProcessInfo processInfo]; if (proc == nil) { NSLog(@"unable to get process information!"); exit(EXIT_FAILURE); } /* * 2) Build an array of files to be processed. */ obj = [defs stringForKey: @"Files"]; if (obj != nil) { files = [NSArray arrayWithContentsOfFile: obj]; if (files == nil) { NSLog(@"Failed to load files from '%@'", obj); exit(EXIT_FAILURE); } firstFile = 0; // Not an argument list ... read from index 0 } else { files = [proc arguments]; firstFile = 1; // An argument list ... ignore the program name. } sFiles = [NSMutableArray array]; gFiles = [NSMutableArray array]; hFiles = [NSMutableArray array]; count = [files count]; if (verbose == YES) { NSLog(@"Proc ... %@", proc); NSLog(@"Name ... %@", [proc processName]); NSLog(@"Files ... %@", files); NSLog(@"HeaderDirectory ... %@", headerDirectory); NSLog(@"DocumentationDirectory ... %@", documentationDirectory); } for (i = firstFile; i < count; i++) { NSString *arg = [files objectAtIndex: i]; if ([arg hasPrefix: @"-"] == YES) { i++; // a default } else if ([arg hasSuffix: @".h"] == YES) { [sFiles addObject: arg]; } else if (([arg hasSuffix: @".m"] == YES) || ([arg hasSuffix: @".c"] == YES)) { [sFiles addObject: arg]; } else if ([arg hasSuffix: @".gsdoc"] == YES) { [gFiles addObject: arg]; } else if ([arg hasSuffix: @".html"] == YES) { [hFiles addObject: arg]; } else { // Skip this value ... not a known file type. NSLog(@"Unknown argument '%@' ... ignored", arg); } } /* * Note explicitly supplied gsdoc files for dependencies later. */ deps = [NSMutableSet setWithCapacity: 1024]; [deps addObjectsFromArray: gFiles]; /* * 3) Load old project indexing information from the .igsdoc file if * present and determine when the indexing information was last * updated (never ==> distant past). */ refsFile = [documentationDirectory stringByAppendingPathComponent: project]; refsFile = [refsFile stringByAppendingPathExtension: @"igsdoc"]; projectRefs = [AGSIndex new]; originalIndex = nil; rDate = [NSDate distantPast]; if ([mgr isReadableFileAtPath: refsFile] == YES) { originalIndex = [[NSDictionary alloc] initWithContentsOfFile: refsFile]; if (originalIndex == nil) { NSLog(@"Unable to read project file '%@'", refsFile); } else { NSDictionary *dict; [projectRefs mergeRefs: originalIndex override: NO]; dict = [mgr fileAttributesAtPath: refsFile traverseLink: YES]; rDate = [dict fileModificationDate]; } } /* * Load old OrderedSymbolDeclarations.plist to merge it later */ if ([mgr isReadableFileAtPath: symbolDeclsFile]) { symbolDecls = [NSMutableDictionary dictionaryWithContentsOfFile: symbolDeclsFile]; if (symbolDeclsFile == nil) { NSLog(@"Unable to read ordered symbols file '%@'", symbolDeclsFile); } } if (symbolDecls == nil) { symbolDecls = [NSMutableDictionary dictionary]; } /* * 4) Clean if desired: */ if ([defs boolForKey: @"Clean"] == YES) { NSDictionary *output; NSEnumerator *enumerator; NSArray *outputNames; NSMutableSet *allPaths; NSMutableSet *templates = nil; NSSet *preserve = nil; NSString *path; NSArray *keys = [NSArray arrayWithObjects: @"Constants", @"Functions", @"Macros", @"Typedefs", @"Variables", nil]; /* * 4a) Build a set of all template files. */ templates = AUTORELEASE([NSMutableSet new]); enumerator = [keys objectEnumerator]; while ((path = [enumerator nextObject]) != nil) { path = [path stringByAppendingString: @"Template"]; path = [defs stringForKey: path]; if (path != nil) { path = [path stringByAppendingPathExtension: @"gsdoc"]; if ([path isAbsolutePath] == NO) { path = [documentationDirectory stringByAppendingPathComponent: path]; } [templates addObject: path]; } } /* * 4b) Unless we are supposed to clean templates, we preserve any * template gsdoc files, but remove any generated content. */ if ([defs boolForKey: @"CleanTemplates"] == NO) { preserve = templates; enumerator = [templates objectEnumerator]; while ((path = [enumerator nextObject]) != nil) { if ([mgr isReadableFileAtPath: path] == YES) { NSMutableString *ms; NSEnumerator *e = [keys objectEnumerator]; NSString *k; unsigned length; ms = [[NSMutableString alloc] initWithContentsOfFile: path]; if (ms == nil) { NSLog(@"Cleaning ... failed to read '%@'", path); continue; } length = [ms length]; while ((k = [e nextObject]) != nil) { NSString *ss; NSString *es; NSRange sr; NSRange er; ss = [NSString stringWithFormat: @"", k]; sr = [ms rangeOfString: ss]; es = [NSString stringWithFormat: @"", k]; er = [ms rangeOfString: es]; if (sr.length > 0 && er.length > 0 && er.location > sr.location) { NSRange r; r.location = sr.location; r.length = NSMaxRange(er) - r.location; [ms replaceCharactersInRange: r withString: @""]; } } if ([ms length] != length) { if ([ms writeToFile: path atomically: YES] == NO) { NSLog(@"Cleaning ... failed to write '%@'", path); } } } } } /* * 4b) Build a list of all generated gsdoc files, then remove them * and their corresponding html documents. */ output = [[projectRefs refs] objectForKey: @"output"]; enumerator = [output objectEnumerator]; allPaths = [[NSMutableSet alloc] initWithSet: templates]; while ((outputNames = [enumerator nextObject]) != nil) { [allPaths addObjectsFromArray: outputNames]; } enumerator = [allPaths objectEnumerator]; while ((path = [enumerator nextObject]) != nil) { /* * Delete any gsdoc files which are not in the preserve set. */ if ([preserve member: path] == nil) { if ([mgr fileExistsAtPath: path] == YES) { if ([mgr removeFileAtPath: path handler: nil] == NO) { NSLog(@"Cleaning ... failed to remove %@", path); } } } path = [path stringByDeletingPathExtension]; path = [path stringByAppendingPathExtension: @"html"]; if ([mgr fileExistsAtPath: path] == YES) { if ([mgr removeFileAtPath: path handler: nil] == NO) { NSLog(@"Cleaning ... failed to remove %@", path); } } } RELEASE(allPaths); /* * 4c) Remove the project index file. */ if ([mgr fileExistsAtPath: refsFile] == YES) { if ([mgr removeFileAtPath: refsFile handler: nil] == NO) { NSLog(@"Cleaning ... failed to remove %@", refsFile); } } /* * 4d) Remove any HTML documents resulting from gsdoc files which * were specified on the command line rather than generated. */ enumerator = [gFiles objectEnumerator]; while ((path = [enumerator nextObject]) != nil) { path = [path lastPathComponent]; path = [path stringByDeletingPathExtension]; path = [path stringByAppendingPathExtension: @"html"]; path = [documentationDirectory stringByAppendingPathComponent: path]; if ([mgr fileExistsAtPath: path] == YES) { if ([mgr removeFileAtPath: path handler: nil] == NO) { NSLog(@"Cleaning ... failed to remove %@", path); } } } /* * 4e) Remove the OrderedSymbolDeclarations plist file. */ if ([mgr fileExistsAtPath: symbolDeclsFile]) { if ([mgr removeFileAtPath: symbolDeclsFile handler: nil] == NO) { NSLog(@"Cleaning ... failed to remove %@", symbolDeclsFile); } } return 0; } if ([sFiles count] == 0 && [gFiles count] == 0 && [hFiles count] == 0) { NSLog(@"No .h, .m, .c, .gsdoc, or .html filename arguments found ... giving up"); return 1; } /* * 5) Start with "source files".. for each one (hereafter called a * "header file"): * a) Parse declarations (in .h or .m/.c) using an AGSParser object. * b) Determine (possibly multiple) dependent .m/.c files corresponding to * a .h and parse them. * c) Feed parser results to an AGSOutput instance. */ count = [sFiles count]; if (count > 0) { AGSParser *parser; AGSOutput *output; NSString *up; NSMutableDictionary *wm; up = [defs stringForKey: @"Up"]; pool = [NSAutoreleasePool new]; parser = [AGSParser new]; wm = [[defs dictionaryForKey: @"WordMap"] mutableCopy]; if (nil == wm) { wm = [NSMutableDictionary new]; } if ([defs boolForKey: @"DisableDefaultWords"] == NO) { [wm setObject: @"//" forKey: @"DEFINE_BLOCK_TYPE"]; [wm setObject: @"" forKey: @"GS_ATTRIB_DEPRECATED"]; [wm setObject: @"" forKey: @"GS_DECLARE"]; [wm setObject: @"" forKey: @"GS_DEPRECATED_FUNC"]; [wm setObject: @"extern" forKey: @"GS_EXPORT"]; [wm setObject: @"" forKey: @"GS_GC_STRONG"]; [wm setObject: @"" forKey: @"GS_GEOM_ATTR"]; [wm setObject: @"extern" forKey: @"GS_GEOM_SCOPE"]; [wm setObject: @"" forKey: @"GS_NORETURN_METHOD"]; [wm setObject: @"" forKey: @"GS_RANGE_ATTR"]; [wm setObject: @"extern" forKey: @"GS_RANGE_SCOPE"]; [wm setObject: @"" forKey: @"GS_ROOT_CLASS"]; [wm setObject: @"static" forKey: @"GS_STATIC_INLINE"]; [wm setObject: @"" forKey: @"GS_UNUSED_ARG"]; [wm setObject: @"" forKey: @"GS_UNUSED_FUNC"]; [wm setObject: @"" forKey: @"GS_UNUSED_IVAR"]; [wm setObject: @"" forKey: @"GS_ZONE_ATTR"]; [wm setObject: @"extern" forKey: @"GS_ZONE_SCOPE"]; [wm setObject: @"" forKey: @"NS_AUTOMATED_REFCOUNT_UNAVAILABLE"]; [wm setObject: @"" forKey: @"NS_CONSUMED"]; [wm setObject: @"" forKey: @"NS_CONSUMES_SELF"]; [wm setObject: @"" forKey: @"NS_RETURNS_NOT_RETAINED"]; [wm setObject: @"" forKey: @"NS_RETURNS_RETAINED"]; [wm setObject: @"" forKey: @"__strong"]; [wm setObject: @"" forKey: @"__weak"]; } [parser setWordMap: wm]; RELEASE(wm); output = [AGSOutput new]; if ([defs boolForKey: @"Standards"] == YES) { [parser setGenerateStandards: YES]; } if ([defs boolForKey: @"DocumentAllInstanceVariables"] == YES) { [parser setDocumentAllInstanceVariables: YES]; } if ([defs objectForKey: @"DocumentInstanceVariables"] != nil && [defs boolForKey: @"DocumentInstanceVariables"] == NO) { [parser setDocumentInstanceVariables: NO]; } for (i = 0; i < count; i++) { NSString *hfile = [sFiles objectAtIndex: i]; NSString *gsdocfile; NSString *file; NSString *sourceName = nil; NSMutableArray *a; NSDictionary *attrs; NSDate *sDate = nil; NSDate *gDate = nil; unsigned j; if (pool != nil) { RELEASE(pool); pool = [NSAutoreleasePool new]; } /* * Note the name of the header file without path or extension. * This will be used to generate the output file. */ file = [hfile stringByDeletingPathExtension]; file = [file lastPathComponent]; /* * Ensure that header file name is set up using the * header directory specified unless it is absolute. */ if ([hfile isAbsolutePath] == NO) { if ([headerDirectory length] > 0 && [[hfile pathExtension] isEqual: @"h"] == YES) { hfile = [headerDirectory stringByAppendingPathComponent: hfile]; } } gsdocfile = [documentationDirectory stringByAppendingPathComponent: file]; gsdocfile = [gsdocfile stringByAppendingPathExtension: @"gsdoc"]; if (ignoreDependencies == NO) { NSDate *d; /* * Ask existing project info (.gsdoc file) for dependency * information. Then check the dates on the source files * and the header file. */ a = [projectRefs sourcesForHeader: hfile]; [a insertObject: hfile atIndex: 0]; [projectRefs setSources: a forHeader: hfile]; for (j = 0; j < [a count]; j++) { NSString *sfile = [a objectAtIndex: j]; attrs = [mgr fileAttributesAtPath: sfile traverseLink: YES]; d = [attrs fileModificationDate]; if (sDate == nil || [d earlierDate: sDate] == sDate) { sDate = d; IF_NO_ARC([[sDate retain] autorelease];) } } if (verbose == YES) { NSLog(@"Saved sources for %@ are %@ ... %@", hfile, a, sDate); } /* * Ask existing project info (.gsdoc file) for dependency * information. Then check the dates on the output files. * If none are set, assume the default. */ a = [projectRefs outputsForHeader: hfile]; if ([a count] == 0) { [a insertObject: gsdocfile atIndex: 0]; [projectRefs setOutputs: a forHeader: hfile]; } for (j = 0; j < [a count]; j++) { NSString *ofile = [a objectAtIndex: j]; attrs = [mgr fileAttributesAtPath: ofile traverseLink: YES]; d = [attrs fileModificationDate]; if (gDate == nil || [d laterDate: gDate] == gDate) { gDate = d; IF_NO_ARC([[gDate retain] autorelease];) } } if (verbose == YES) { NSLog(@"Saved outputs for %@ are %@ ... %@", hfile, a, gDate); } } if (gDate == nil || [sDate earlierDate: gDate] == gDate) { NSArray *modified; if (showDependencies == YES) { NSLog(@"%@: source %@, gsdoc %@ ==> regenerate", file, sDate, gDate); } [parser reset]; /* * Try to parse header to see what needs documenting. * If the header given was actually a .m/.c file, this will * parse that file for declarations rather than definitions. */ if ([mgr isReadableFileAtPath: hfile] == NO) { NSLog(@"No readable header at '%@' ... skipping", hfile); continue; } if (declared != nil) { [parser setDeclared: [declared stringByAppendingPathComponent: [hfile lastPathComponent]]]; } [parser parseFile: hfile isSource: NO]; /* * Record dependency information. */ a = [parser outputs]; if ([a count] > 0) { /* * Adjust the location of the output files to be in the * documentation directory. */ for (j = 0; j < [a count]; j++) { NSString *s = [a objectAtIndex: j]; if ([s isAbsolutePath] == NO) { s = [documentationDirectory stringByAppendingPathComponent: s]; [a replaceObjectAtIndex: j withObject: s]; } } if (verbose == YES) { NSLog(@"Computed outputs for %@ are %@", hfile, a); } [projectRefs setOutputs: a forHeader: hfile]; } a = [parser sources]; /* * Collect any matching .m files provided as autogsdoc arguments * for the current header (hfile). */ sourceName = [[hfile lastPathComponent] stringByDeletingPathExtension]; sourceName = [sourceName stringByAppendingPathExtension: @"m"]; for (j = 0; j < [sFiles count]; j++) { NSString *sourcePath = [sFiles objectAtIndex: j]; if ([sourcePath hasSuffix: sourceName] && [mgr isReadableFileAtPath: sourcePath]) { [a addObject: sourcePath]; } } if ([a count] > 0) { [projectRefs setSources: a forHeader: hfile]; } if (verbose == YES) { NSLog(@"Computed sources for %@ are %@", hfile, a); } for (j = 0; j < [a count]; j++) { NSString *sfile = [a objectAtIndex: j]; /* * If we can read a source file, parse it for any * additional information on items found in the header. */ if ([mgr isReadableFileAtPath: sfile] == YES) { [parser parseFile: sfile isSource: YES]; } else { NSLog(@"No readable source at '%@' ... ignored", sfile); } } /* * Set up linkage for this file. */ [[parser info] setObject: file forKey: @"base"]; [[parser info] setObject: documentationDirectory forKey: @"directory"]; /* * Only produce linkage if the up link is not empty. * Do not add an up link if this *is* the up link document. */ if ([up length] > 0 && [up isEqual: file] == NO) { [[parser info] setObject: up forKey: @"up"]; } modified = [output output: [parser info]]; if (modified == nil) { NSLog(@"Sorry unable to write %@", gsdocfile); } else { unsigned c = [modified count]; while (c-- > 0) { NSString *f; f = [[modified objectAtIndex: c] lastPathComponent]; if ([gFiles containsObject: f] == NO) { [gFiles addObject: f]; } } } } else { /* * Add the .h file to the list of those to process. */ [gFiles addObject: [hfile lastPathComponent]]; } } /* * Ask the parser for the OrderedSymbolDeclarations plist, merge with * the previously output plist and save it */ [symbolDecls addEntriesFromDictionary: [parser orderedSymbolDeclarationsByUnit]]; [symbolDecls writeToFile: symbolDeclsFile atomically: YES]; informalProtocols = RETAIN([output informalProtocols]); DESTROY(pool); DESTROY(parser); DESTROY(output); } /* * 6) Now move to "gsdoc files" (including both command-line given ones and * just-generated ones).. and generate the index. * */ count = [gFiles count]; if (count > 0) { NSDictionary *projectIndex; CREATE_AUTORELEASE_POOL(arp); for (i = 0; i < count; i++) { NSString *arg = [gFiles objectAtIndex: i]; NSString *gsdocfile; NSString *file; NSDictionary *attrs; NSDate *gDate = nil; if (arp != nil) { RELEASE(arp); arp = [NSAutoreleasePool new]; } /* * 6a) Chop off any path specification that might be there (for files * given on the command line) and search for the file only in * 'DocumentationDirectory' or the CWD (which is assumed to be * the directory with the source files, though this will not be * true if path information was given for them on the command * line). */ file = [[arg lastPathComponent] stringByDeletingPathExtension]; gsdocfile = [documentationDirectory stringByAppendingPathComponent: file]; gsdocfile = [gsdocfile stringByAppendingPathExtension: @"gsdoc"]; /* * If our source file is a gsdoc file ... it may be located * in the current (input) directory rather than the documentation * (output) directory. */ if ([mgr isReadableFileAtPath: gsdocfile] == NO) { gsdocfile = [file stringByAppendingPathExtension: @"gsdoc"]; } if (ignoreDependencies == NO) { attrs = [mgr fileAttributesAtPath: gsdocfile traverseLink: YES]; gDate = [attrs fileModificationDate]; IF_NO_ARC([[gDate retain] autorelease];) } /* * 6b) Now we try to process the gsdoc data to make index info * unless the project index is already more up to date than * this file (or the gsdoc file does not exist of course). */ if (gDate != nil && [gDate earlierDate: rDate] == rDate) { if (showDependencies == YES) { NSLog(@"%@: gsdoc %@, index %@ ==> regenerate", file, gDate, rDate); } if ([mgr isReadableFileAtPath: gsdocfile] == YES) { GSXMLNode *root; GSXMLParser *parser; AGSIndex *localRefs; // This parses the file for index info parser = [GSXMLParser parserWithContentsOfFile: gsdocfile]; [parser doValidityChecking: YES]; [parser keepBlanks: NO]; [parser substituteEntities: NO]; if ([parser parse] == NO) { NSLog(@"WARNING %@ is not a valid document", gsdocfile); } root = [[parser document] root]; if (![[root name] isEqualToString: @"gsdoc"]) { NSLog(@"not a gsdoc document - because name node is %@", [root name]); return 1; } localRefs = AUTORELEASE([AGSIndex new]); // This is the main call that computes index information [localRefs makeRefs: root]; /* * accumulate index info in project references */ [projectRefs mergeRefs: [localRefs refs] override: NO]; } else { NSLog(@"File '%@' not found in $DocumentationDirectory or '.' ... skipping indexing", gsdocfile); } } } if (informalProtocols != nil) { [projectRefs addInformalProtocols: informalProtocols]; DESTROY(informalProtocols); } DESTROY(arp); /* * 7) Save project references if they have been modified * (into an .igsdoc file named for the project). */ projectIndex = [projectRefs refs]; if (projectIndex != nil && [originalIndex isEqual: projectIndex] == NO) { if ([projectIndex writeToFile: refsFile atomically: YES] == NO) { NSLog(@"Sorry unable to write %@", refsFile); } } DESTROY(originalIndex); } globalRefs = [AGSIndex new]; /* * 8) If we are either generating html output, or relocating existing * html documents, we must build up the indexing information needed * for any cross-referencing etc.. This comes from the "xxxProjects" * defaults. Each of these is used to find a project directory, in * which an .igsdoc index cache file is searched for. If found, its * contents are read in and merged with the current project (but NOT * merged into its index file). */ if (generateHtml == YES || [hFiles count] > 0) { NSMutableDictionary *projects; NSString *systemProjects; NSString *localProjects; CREATE_AUTORELEASE_POOL (pool); localProjects = [defs stringForKey: @"LocalProjects"]; if (localProjects == nil) { localProjects = @""; } systemProjects = [defs stringForKey: @"SystemProjects"]; if (systemProjects == nil) { systemProjects = @""; } projects = [[defs dictionaryForKey: @"Projects"] mutableCopy]; IF_NO_ARC([projects autorelease];) /* * Merge any system project references. */ if ([systemProjects caseInsensitiveCompare: @"None"] != NSOrderedSame) { NSString *base = [NSSearchPathForDirectoriesInDomains( NSDocumentationDirectory, NSSystemDomainMask, NO) lastObject]; base = [base stringByStandardizingPath]; if (base != nil) { NSDirectoryEnumerator *enumerator = [mgr enumeratorAtPath: base]; NSString *file; if ([systemProjects isEqual: @""] == YES) { systemProjects = base; // Absolute path } while ((file = [enumerator nextObject]) != nil) { NSString *ext = [file pathExtension]; if ([ext isEqualToString: @"igsdoc"] == YES && [[file lastPathComponent] isEqual: refsName] == NO) { NSString *key; NSString *val; if (projects == nil) { projects = [NSMutableDictionary dictionary]; } key = [base stringByAppendingPathComponent: file]; val = [file stringByDeletingLastPathComponent]; val = [systemProjects stringByAppendingPathComponent: val]; [projects setObject: val forKey: key]; } } } } /* * Merge any local project references. */ if ([localProjects caseInsensitiveCompare: @"None"] != NSOrderedSame) { NSString *base = [NSSearchPathForDirectoriesInDomains( NSDocumentationDirectory, NSLocalDomainMask, NO) lastObject]; base = [base stringByStandardizingPath]; if (base != nil) { NSDirectoryEnumerator *enumerator; NSString *file; enumerator = [mgr enumeratorAtPath: base]; if ([localProjects isEqual: @""] == YES) { localProjects = base; // Absolute path } while ((file = [enumerator nextObject]) != nil) { NSString *ext = [file pathExtension]; if ([ext isEqualToString: @"igsdoc"] == YES && [[file lastPathComponent] isEqual: refsName] == NO) { NSString *key; NSString *val; if (projects == nil) { projects = [NSMutableDictionary dictionary]; } key = [base stringByAppendingPathComponent: file]; val = [file stringByDeletingLastPathComponent]; val = [localProjects stringByAppendingPathComponent: val]; [projects setObject: val forKey: key]; } } } } /* * Merge any "plain project" references. */ if (projects != nil) { NSEnumerator *e = [projects keyEnumerator]; NSString *k; while ((k = [e nextObject]) != nil) { if ([mgr isReadableFileAtPath: k] == NO) { NSLog(@"Unable to read project file '%@'", k); } else { NSDictionary *dict; dict = [[NSDictionary alloc] initWithContentsOfFile: k]; if (dict == nil) { NSLog(@"Unable to read project file '%@'", k); } else { AGSIndex *tmp; NSString *p; tmp = [AGSIndex new]; [tmp mergeRefs: dict override: NO]; RELEASE(dict); /* * Adjust path to external project files ... */ p = [projects objectForKey: k]; if ([p isEqual: @""] == YES) { p = [k stringByDeletingLastPathComponent]; } [tmp setDirectory: p]; [globalRefs mergeRefs: [tmp refs] override: YES]; RELEASE(tmp); } } } } /* * Accumulate project index info into global index */ [globalRefs mergeRefs: [projectRefs refs] override: YES]; RELEASE(pool); } /* * 9) If we are generating HTML frames, create the gsdoc files specifying * indices that we will use. */ if ([defs boolForKey: @"MakeFrames"] == YES) { int i; int cap = 1360; NSArray *idxTypes = [NSArray arrayWithObjects: @"class", @"protocol", @"constant", @"function", @"macro", @"type", @"variable", @"tool", nil]; NSString *idxIndexFile; NSMutableString *idxIndex= [NSMutableString stringWithCapacity: 5*cap]; NSString *framesetFile; NSMutableString *frameset = [NSMutableString stringWithCapacity: cap]; NSMutableString *tocSkel = [NSMutableString stringWithCapacity: cap]; NSString *prjFile = [NSString stringWithFormat: @"%@.gsdoc",project]; // skeleton for table of contents files [tocSkel setString: @"\n" @"\n" @"\n" @" \n" @" [typeU]\n" @" \n" @" \n" @" \n" @" \n" @" \n" @" \n" @"\n"]; [tocSkel replaceString: @"[prjName]" withString: project]; // file for top-left frame (header only; rest appended below) idxIndexFile = [@"MainIndex" stringByAppendingPathExtension: @"html"]; [idxIndex setString: @"\n \n" @" Index

    \n" @" "]; // this becomes index.html framesetFile = [@"index" stringByAppendingPathExtension: @"html"]; [frameset setString: @"\n" @"\n" @" \n" @" \n" @" Autogsdoc-generated Documentation for [prjName]\n" @" \n" @" \n" @" \n" @" \n" @" \n" @" \n" @" \n" @" \n" @" \n" @"\n"]; [frameset replaceString: @"[prjName]" withString: project]; // generate the table of contents gsdoc files for (i = 0; i < [idxTypes count]; i++) { NSString *gsdocFile; NSString *htmlFile; NSMutableString *contents; NSString *typeL = [idxTypes objectAtIndex: i]; NSString *typeU = [typeL capitalizedString]; contents = [NSMutableString stringWithCapacity: cap]; [contents setString: tocSkel]; typeU = [@"Class" isEqualToString: typeU] ? [typeU stringByAppendingString: @"es"] : [typeU stringByAppendingString: @"s"]; [contents replaceString: @"[typeL]" withString: typeL]; [contents replaceString: @"[typeU]" withString: typeU]; gsdocFile = [[typeU stringByAppendingString: @"TOC"] stringByAppendingPathExtension: @"gsdoc"]; htmlFile = [[typeU stringByAppendingString: @"TOC"] stringByAppendingPathExtension: @"html"]; if ([[projectRefs refs] objectForKey: typeL] != nil) { [contents writeToFile: [documentationDirectory stringByAppendingPathComponent: gsdocFile] atomically: YES]; [gFiles addObject: gsdocFile]; [idxIndex appendFormat: @"
    %@
    \n", htmlFile, typeU]; } } [idxIndex appendString: @"
    \n"]; [idxIndex appendFormat: @" (intro) ", project]; [idxIndex appendFormat: @" (unframe)\n", project]; [idxIndex appendString: @"
    \n \n\n"]; [idxIndex writeToFile: [documentationDirectory stringByAppendingPathComponent: idxIndexFile] atomically: YES]; [frameset writeToFile: [documentationDirectory stringByAppendingPathComponent: framesetFile] atomically: YES]; // it is possible that .gsdoc does not exist; if that is the // case, generate one now as a placeholder for (i = 0; i < [gFiles count]; i++) { NSString *fname = [gFiles objectAtIndex: i]; if ([fname rangeOfString: prjFile].length > 0) break; } if (i == [gFiles count]) { NSMutableString *prjFileContents = [NSMutableString stringWithCapacity: cap]; NSLog(@"\n\nNOTE: Generating a simple introductory page for your" @" project.\nTo replace this with a custom version, edit the gsdoc file \n" @"named %@ in the documentation output directory.\n" @"Then include this file in the arguments to autogsdoc.\n\n", prjFile); [prjFileContents setString: @"\n" @"\n" @"\n" @" \n" @" The [prjName] Project\n" @" \n" @" \n" @" \n" @"

    The index below lists the major components of the [prjName] \n" @" documentation.

    \n" @" \n" @" \n" @" \n" @"\n"]; [prjFileContents replaceString: @"[prjName]" withString: project]; [prjFileContents writeToFile: [documentationDirectory stringByAppendingPathComponent: prjFile] atomically: YES]; [gFiles addObject: prjFile]; } } /* * 10) Next pass ... generate html output from gsdoc files if required. */ count = [gFiles count]; if (generateHtml == YES && count > 0) { pool = [NSAutoreleasePool new]; for (i = 0; i < count; i++) { NSString *arg = [gFiles objectAtIndex: i]; NSString *gsdocfile; NSString *htmlfile; NSString *file; NSString *generated; NSDictionary *attrs; NSDate *gDate = nil; NSDate *hDate = nil; if (pool != nil) { RELEASE(pool); pool = [NSAutoreleasePool new]; } /* * 10a) As before in connection with (6a), drop path information * and look for gsdoc files in 'documentationDirectory' or * CWD. */ file = [[arg lastPathComponent] stringByDeletingPathExtension]; gsdocfile = [documentationDirectory stringByAppendingPathComponent: file]; gsdocfile = [gsdocfile stringByAppendingPathExtension: @"gsdoc"]; htmlfile = [documentationDirectory stringByAppendingPathComponent: file]; htmlfile = [htmlfile stringByAppendingPathExtension: @"html"]; /* * If the gsdoc file name was specified as a source file, * it may be in the source directory rather than the documentation * directory. */ if ([mgr isReadableFileAtPath: gsdocfile] == NO && [arg hasSuffix: @".gsdoc"] == YES) { gsdocfile = [file stringByAppendingPathExtension: @"gsdoc"]; } if (ignoreDependencies == NO) { /* * When were the files last modified? */ attrs = [mgr fileAttributesAtPath: gsdocfile traverseLink: YES]; gDate = [attrs fileModificationDate]; IF_NO_ARC([[gDate retain] autorelease];) attrs = [mgr fileAttributesAtPath: htmlfile traverseLink: YES]; hDate = [attrs fileModificationDate]; IF_NO_ARC([[hDate retain] autorelease];) } if ([mgr isReadableFileAtPath: gsdocfile] == YES) { if (hDate == nil || [gDate earlierDate: hDate] == hDate) { NSData *d; GSXMLNode *root; GSXMLParser *parser; AGSIndex *localRefs; AGSHtml *html; if (showDependencies == YES) { NSLog(@"%@: gsdoc %@, html %@ ==> regenerate", file, gDate, hDate); } // 10b) parse the .gsdoc file parser = [GSXMLParser parserWithContentsOfFile: gsdocfile]; [parser doValidityChecking: YES]; [parser keepBlanks: NO]; [parser substituteEntities: NO]; if ([parser parse] == NO) { NSLog(@"WARNING %@ is not a valid document", gsdocfile); } root = [[parser document] root]; if (![[root name] isEqualToString: @"gsdoc"]) { NSLog(@"not a gsdoc document - because name node is %@", [root name]); return 1; } localRefs = AUTORELEASE([AGSIndex new]); [localRefs makeRefs: root]; /* * 10c) Feed the XML tree to an AGSHtml instance, and dump * the result to a file. */ html = AUTORELEASE([AGSHtml new]); [html setGlobalRefs: globalRefs]; [html setProjectRefs: projectRefs]; [html setLocalRefs: localRefs]; [html setInstanceVariablesAtEnd: instanceVarsAtEnd]; generated = [html outputDocument: root]; d = [generated dataUsingEncoding: NSUTF8StringEncoding]; if ([d writeToFile: htmlfile atomically: YES] == NO) { NSLog(@"Sorry unable to write %@", htmlfile); } } } else if ([arg hasSuffix: @".gsdoc"] == YES) { NSLog(@"File '%@' not found in $DocumentationDirectory or '.' ... skipping", gsdocfile); } } RELEASE(pool); } /* * 11) Relocate existing html documents if required ... adjust all cross * referencing within those documents. This entails searching for * links, parsing the key, and replacing the * contents as per our current index info (which may have changed). */ count = [hFiles count]; if (count > 0) { pool = [NSAutoreleasePool new]; for (i = 0; i < count; i++) { NSString *file = [hFiles objectAtIndex: i]; NSString *src; NSString *dst; if (pool != nil) { RELEASE(pool); pool = [NSAutoreleasePool new]; } file = [file lastPathComponent]; src = file; dst = [documentationDirectory stringByAppendingPathComponent: file]; /* * If we can't find the file in the source directory, assume * it is in the documentation directory already, and just needs * cross-refs rebuilding. */ if ([mgr isReadableFileAtPath: src] == NO) { src = dst; } if ([mgr isReadableFileAtPath: src] == YES) { NSData *d; NSMutableString *s; NSRange r; unsigned l; unsigned p; AGSHtml *html; html = AUTORELEASE([AGSHtml new]); [html setGlobalRefs: globalRefs]; [html setProjectRefs: projectRefs]; [html setLocalRefs: nil]; [html setInstanceVariablesAtEnd: instanceVarsAtEnd]; s = [NSMutableString stringWithContentsOfFile: src]; l = [s length]; p = 0; r = NSMakeRange(p, l); r = [s rangeOfString: @" 0) { NSRange replace; NSString *repstr; NSString *href; NSString *type; NSString *unit = nil; replace.location = r.location; p = NSMaxRange(r); r = [s rangeOfString: @"\">" options: NSLiteralSearch range: NSMakeRange(p, l - p)]; if (r.length == 0) { NSLog(@"Unterminated gsdoc rel at %u", p); break; } else { replace = NSMakeRange(replace.location, NSMaxRange(r) - replace.location); href = [s substringWithRange: NSMakeRange(p, r.location - p)]; p = NSMaxRange(replace); } /* * Skip past the '#' to the local reference. */ r = [href rangeOfString: @"#" options: NSLiteralSearch]; if (r.length == 0) { NSLog(@"Missing '#' in href at %lu", (unsigned long)replace.location); break; } href = [href substringFromIndex: NSMaxRange(r)]; /* * Split out the reference type information. */ r = [href rangeOfString: @"$" options: NSLiteralSearch]; if (r.length == 0) { NSLog(@"Missing '$' in href at %lu", (unsigned long)replace.location); break; } type = [href substringToIndex: r.location]; href = [href substringFromIndex: NSMaxRange(r)]; /* * Parse unit name from method or instance variable link. */ if ([type isEqual: @"method"] == YES || [type isEqual: @"ivariable"] == YES) { if ([type isEqual: @"method"] == YES) { r = [href rangeOfString: @"-" options: NSLiteralSearch]; if (r.length == 0) { r = [href rangeOfString: @"+" options: NSLiteralSearch]; } if (r.length > 0) { unit = [href substringToIndex: r.location]; href = [href substringFromIndex: NSMaxRange(r)-1]; } } else { r = [href rangeOfString: @"*" options: NSLiteralSearch]; if (r.length > 0) { unit = [href substringToIndex: r.location]; href = [href substringFromIndex: NSMaxRange(r)]; } } if (unit == nil) { NSLog(@"Missing unit name terminator at %lu", (unsigned long)replace.location); break; } } if (unit == nil) { repstr = [html makeLink: href ofType: type isRef: YES]; } else { repstr = [html makeLink: href ofType: type inUnit: unit isRef: YES]; } if (verbose == YES) { NSLog(@"Replace %@ with %@", [s substringWithRange: replace], repstr ? (id)repstr : (id)@"self"); } if (repstr != nil) { int offset = [repstr length] - replace.length; p += offset; l += offset; [s replaceCharactersInRange: replace withString: repstr]; } r = [s rangeOfString: @" 0 && [mgr fileExistsAtPath: file] == NO) { [mgr createDirectoryAtPath: file withIntermediateDirectories: YES attributes: nil error: NULL]; } [depend writeToFile: stamp atomically: YES]; } RELEASE(outer); return 0; } gnustep-base-1.29.0/Tools/cvtenc.1000066400000000000000000000041271435650067400166620ustar00rootroot00000000000000.\"Copyright (C) 2005 Free Software Foundation, Inc. .\"Copying and distribution of this file, with or without modification, .\"are permitted in any medium without royalty provided the copyright .\"notice and this notice are preserved. .TH CVTENC "1" "February 2004" "GNUstep" "GNUstep System Manual" .SH NAME cvtenc \- file encoding converter .SH SYNOPSIS .B cvtenc [\fB-Encoding\fR \fIencoding\fR] [\fB-EscapeIn\fR \fIyes|NO\fR] [\fB-EscapeOut\fR \fIyes|NO\fR] \fIfilename\fR .SH DESCRIPTION .P Converts a file encoded in a specified or default non-unicode encoding to unicode (UTF16), or, if the file is already in unicode, converts it to a specified or default non-unicode encoding. The converted text is printed to standard out. If the filename is a hyphen then this tool reads from standard input. .SH OPTIONS .IP "\fB\-Encoding\fR \fI encoding\fR" 4 Specify non-unicode encoding to be used. The direction of conversion depends on whether the file given as input is recognized as unicode (from the higher order bytes). To get a list of available encodings, enter "list" for the encoding. If this is not specified, the default encoding for the current locale is used. .IP "\fB\-EscapeIn\fR \fIYES|NO\fR" 4 Specify '\-EscapeIn YES' (the default is 'NO') to parse the input for \\u escape sequences (as in property lists). .IP "\fB\-EscapeOut\fR \fIYES|NO\fR" 4 Specify '\-EscapeOut YES' (the default is 'NO') to generate \\u escape sequences (as in property lists) in the output. Note, this might produce unexpected results for some encodings. .IP "\fB\-Unicode\fR \fIIN|OUT\fR" 4 Specify '\-Unicode IN' (or '\-Unicode OUT') to control the direction of conversion rather than having the tool guess it on the basis of the content it reads. Using '\-Unicode IN' means that the tool reads UTF16 data and writes C-String data, while using '\-Unicode OUT' merans that the tool reads C-String data and writes UTF16 data. .SH HISTORY .RS 0 Written in 2002. Minr update in 2010. .P This manual page first appeared in gnustep-base 1.9.2 (March 2004). .P .SH AUTHORS .B cvtenc was written by Richard Frith-Macdonald gnustep-base-1.29.0/Tools/cvtenc.m000066400000000000000000000213761435650067400167630ustar00rootroot00000000000000/** This tool converts a file containing a string to a C String encoding. Copyright (C) 2002 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: April 2002 This file is part of the GNUstep Project This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. You should have received a copy of the GNU General Public License along with this program; see the file COPYINGv3. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #import "common.h" #import "Foundation/NSArray.h" #import "Foundation/NSData.h" #import "Foundation/NSException.h" #import "Foundation/NSString.h" #import "Foundation/NSProcessInfo.h" #import "Foundation/NSUserDefaults.h" #import "Foundation/NSFileHandle.h" #import "Foundation/NSAutoreleasePool.h" #import "GNUstepBase/NSString+GNUstepBase.h" #import "GNUstepBase/GSMime.h" #ifdef NeXT_Foundation_LIBRARY #import "GNUstepBase/Additions.h" #endif #include /** Return whether value ch between min and max. */ #define inrange(ch,min,max) ((ch)>=(min) && (ch)<=(max)) /** Convert hex digit in ascii to decimal equivalent. */ #define char2num(ch) \ inrange(ch,'0','9') \ ? ((ch)-0x30) \ : (inrange(ch,'a','f') \ ? ((ch)-0x57) : ((ch)-0x37)) /**

    Converts a file encoded in a specified or default non-unicode encoding * to unicode, or, if the file is already in unicode, converts it to a * specified or default non-unicode encoding. The converted text is * printed to standard out.

    */ int main(int argc, char** argv, char **env) { NSAutoreleasePool *pool; NSProcessInfo *proc; NSArray *args; unsigned i; BOOL found = NO; BOOL eIn; BOOL eOut; NSString *n; NSStringEncoding enc = 0; #ifdef GS_PASS_ARGUMENTS GSInitializeProcess(argc, argv, env); #endif pool = [NSAutoreleasePool new]; proc = [NSProcessInfo processInfo]; if (proc == nil) { NSLog(@"defaults: unable to get process information!\n"); [pool release]; exit(EXIT_SUCCESS); } args = [proc arguments]; eIn = [[NSUserDefaults standardUserDefaults] boolForKey: @"EscapeIn"]; eOut = [[NSUserDefaults standardUserDefaults] boolForKey: @"EscapeOut"]; n = [[NSUserDefaults standardUserDefaults] stringForKey: @"Encoding"]; if (n == nil) { enc = [NSString defaultCStringEncoding]; } else if (0 == (enc = [GSMimeDocument encodingFromCharset: n])) { const NSStringEncoding *e; NSMutableString *names; names = [NSMutableString stringWithCapacity: 1024]; e = [NSString availableStringEncodings]; while (*e != 0) { NSString *name = [NSString localizedNameOfStringEncoding: *e]; [names appendFormat: @" '%@'\n", name]; if ([n isEqual: name] == YES) { enc = *e; break; } e++; } if (enc == 0) { NSLog(@"defaults: unable to find encoding '%@'!\n" @"Localised encoding names are -\n%@", n, names); [pool release]; exit(EXIT_SUCCESS); } } n = [[NSUserDefaults standardUserDefaults] stringForKey: @"Unicode"]; n = [[n stringByTrimmingSpaces] lowercaseString]; if ([n length] > 0) { if ([n isEqual: @"in"] || [n isEqual: @"i"]) { n = @"i"; } else if ([n isEqual: @"out"] || [n isEqual: @"o"]) { n = @"o"; } else { n = nil; } } else { n = nil; } for (i = 1; found == NO && i < [args count]; i++) { NSString *file = [args objectAtIndex: i]; if ([file hasPrefix: @"-"] == YES && NO == [file isEqual: @"-"]) { i++; continue; } found = YES; NS_DURING { NSData *myData; if (YES == [file isEqual: @"-"]) { myData = [[[NSFileHandle fileHandleWithStandardInput] readDataToEndOfFile] retain]; } else { myData = [[NSData alloc] initWithContentsOfFile: file]; } if (myData == nil) { NSLog(@"File read operation failed for %@.", file); } else { unsigned l = [myData length]; const unichar *b = (const unichar*)[myData bytes]; NSStringEncoding iEnc; NSStringEncoding oEnc; NSString *myString; if (nil == n) { if (l > 1 && (*b == 0xFFFE || *b == 0xFEFF)) { iEnc = NSUnicodeStringEncoding; oEnc = enc; } else { iEnc = enc; oEnc = NSUnicodeStringEncoding; } } else if ([n isEqualToString: @"i"]) { /* Unicode (UTF16) in */ iEnc = NSUnicodeStringEncoding; oEnc = enc; } else { /* Unicode (UTF16) out */ iEnc = enc; oEnc = NSUnicodeStringEncoding; } myString = [[NSString alloc] initWithData: myData encoding: iEnc]; RELEASE(myData); if (myString == nil) { NSLog(@"Encoding input conversion failed for %@.", file); } else { if (eIn == YES) { unsigned l = [myString length]; unichar *u; NSZone *z = NSDefaultMallocZone(); unsigned i = 0; unsigned o = 0; u = NSZoneMalloc(z, sizeof(unichar)*l); [myString getCharacters: u]; while (i < l) { unichar c = u[i++]; if (c == '\\' && i <= l - 6) { c = u[i++]; if (c == 'u' || c == 'U') { unichar v; v = 0; c = u[i++]; v |= char2num(c); v <<= 4; c = u[i++]; v |= char2num(c); v <<= 4; c = u[i++]; v |= char2num(c); v <<= 4; c = u[i++]; v |= char2num(c); c = v; } else { u[o++] = '\\'; } } u[o++] = c; } RELEASE(myString); myString = [[NSString alloc] initWithCharactersNoCopy: u length: o freeWhenDone: YES]; } if (eOut == YES) { unsigned l = [myString length]; unichar *u; char *c; NSZone *z = NSDefaultMallocZone(); unsigned o = 0; unsigned i; u = NSZoneMalloc(z, sizeof(unichar)*l); c = NSZoneMalloc(z, 6*l); [myString getCharacters: u]; for (i = 0; i < l; i++) { if (u[i] < 128) { c[o++] = u[i]; } else { unsigned v = u[i]; c[o++] = '\\'; c[o++] = 'U'; c[3] = "0123456789abcdef"[v & 0xf]; v /= 16; c[2] = "0123456789abcdef"[v & 0xf]; v /= 16; c[1] = "0123456789abcdef"[v & 0xf]; v /= 16; c[0] = "0123456789abcdef"[v & 0xf]; o += 4; } } NSZoneFree(z, u); myData = [[[NSData alloc] initWithBytesNoCopy: c length: o] autorelease]; } else if (eIn == YES) { myData = [myString dataUsingEncoding: iEnc allowLossyConversion: NO]; } else { myData = [myString dataUsingEncoding: oEnc allowLossyConversion: NO]; } RELEASE(myString); if (myData == nil) { NSLog(@"Encoding output conversion failed for %@.", file); } else { NSFileHandle *out; ENTER_POOL out = [NSFileHandle fileHandleWithStandardOutput]; [out writeData: myData]; [out synchronizeFile]; LEAVE_POOL } } } } NS_HANDLER { NSLog(@"Converting '%@' - %@", file, [localException reason]); } NS_ENDHANDLER } if (found == NO) { NSLog(@"\nThis utility expects a filename as an argument.\n" @"It reads the file, and writes it to STDOUT after converting it\n" @"to unicode (UTF16) from C-string encoding or vice versa.\n" @"You can use '-' as the filename argument to read from STDIN.\n" @"You can supply a '-Encoding name' option to specify the C-string\n" @"encoding to be used, if you don't want to use the default.\n" @"If you supply an unknown encoding the tool will print a list\n" @"of all the known encodings.\n" @"You can supply a '-EscapeIn YES' option to specify that input\n" @"should be parsed for \\U escape sequences (as in property lists).\n" @"You can supply a '-EscapeOut YES' option to specify that output\n" @"should be ascii with \\U escape sequences (for property lists).\n" @"You can supply a '-Unicode in/out' option to specify that the\n" @"conversion is from/to unicode (UTF16). This suppresses the normal\n" @"behavior of guessing the direction of conversion from the content\n" @"of the incoming data.\n"); } [pool release]; return 0; } gnustep-base-1.29.0/Tools/defaults.1000066400000000000000000000055571435650067400172170ustar00rootroot00000000000000.\"Copyright (C) 2005 Free Software Foundation, Inc. .\"Copying and distribution of this file, with or without modification, .\"are permitted in any medium without royalty provided the copyright .\"notice and this notice are preserved. .TH DEFAULTS "1" "February 2004" "GNUstep" "GNUstep System Manual" .SH NAME defaults - read or modify GNUstep user defaults .SH SYNOPSIS .B defaults [ action ] .SH DESCRIPTION The 'defaults' command lets you to read and modify a user's defaults. .PP This program replaces the old NeXTstep style dread, dwrite, and dremove programs. .PP If you have access to another user's defaults database, you may include \&'\-u username' before any other options to use that user's database rather than your own. .PP defaults read [ domain [ key] ] .IP read the named default from the specified domain. If no 'key' is given - read all defaults from the domain. If no 'domain' is given - read all defaults from all domains. A domain is either an application name, or "NSGlobalDomain", for system level defauts. (Running programs can access two other domains, "NSArgumentDomain", for command line arguments, "NSRegistrationDomain", a second-chance domain in which "defaults for defaults" can be registered, and possibly domains for specific locales.) .PP defaults readkey key .IP read the named default from all domains. .PP defaults write domain key value .IP write 'value' as default 'key' in the specified domain. \&'value' must be a property list in single quotes. .PP defaults write domain dictionary .IP write 'dictionary' as a replacement for the specified domain. \&'dictionary' must be a property list in single quotes. .PP defaults write .IP reads standard input for defaults in the format produced by \&'defaults read' and writes them to the database. .PP defaults delete [ domain [ key] ] .IP remove the specified default(s) from the domain. If no 'key' is given - delete the entire domain. .PP defaults delete .IP read standard input for a series of lines containing pairs of domains and keys for defaults to be deleted. .PP defaults domains .IP lists the domains in the database (one per line) .PP defaults find word .IP searches domain names, default names, and default value strings for those equal to the specified word and lists them on standard output. .PP defaults plist .IP output some information about property lists .PP defaults help .IP list options for the defaults command. .SH FILES .IP ~/GNUstep/Defaults/.GNUstepDefaults holds defaults for a user .SH BUGS None known. .SH DIAGNOSTICS .P Hopefully self-explanatory. .P .SH HISTORY The 'defaults' command appeared in OpenStep and combined the capabilities of the earlier NeXTstep commands 'dread', 'dwrite', and 'dremove'. .RS 0 The GNUstep version was written in 1998. .P This manual page first appeared in gnustep-base 1.9.2 (March 2004). .P .SH AUTHORS .B defaults was written by Richard Frith-Macdonald gnustep-base-1.29.0/Tools/defaults.m000066400000000000000000000501521435650067400173020ustar00rootroot00000000000000/** This tool mimics the OPENSTEP command line tool for handling defaults. Copyright (C) 1997 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: January 1998 This file is part of the GNUstep Project This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. You should have received a copy of the GNU General Public License along with this program; see the file COPYINGv3. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #import "common.h" #import "Foundation/NSArray.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSException.h" #import "Foundation/NSProcessInfo.h" #import "Foundation/NSUserDefaults.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSPathUtilities.h" #define GSEXIT_SUCCESS EXIT_SUCCESS #define GSEXIT_FAILURE EXIT_FAILURE #define GSEXIT_NOTFOUND 2 static NSString *input(char **ptr) { NSString *result = nil; char *tmp = *ptr; char *start; while (*tmp != '\0' && isspace(*tmp)) { tmp++; } start = tmp; if (*start == '\'') { start = ++tmp; while (*tmp != '\0') { if (*tmp++ == '\'') { if (*tmp == '\'') { memmove(&tmp[-1], tmp, strlen(tmp) + 1); } else { tmp[-1] = '\0'; *ptr = tmp; result = [NSString stringWithUTF8String: start]; break; } } } } else { while (*tmp != '\0' && !isspace(*tmp)) { tmp++; } *tmp++ = '\0'; *ptr = tmp; result = [NSString stringWithUTF8String: start]; } return result; } static void output(const char *ptr) { const char *tmp; for (tmp = ptr; *tmp; tmp++) { if (isspace(*tmp)) { break; } } if (tmp == ptr || *tmp != '\0') { putchar('\''); while (*ptr) { if (*ptr == '\'') { putchar('\''); } putchar(*ptr); ptr++; } putchar('\''); } else { fputs(ptr, stdout); } } /**

    This tool mimics the OPENSTEP command line tool for handling defaults. Please see the man page for more information.

    */ int main(int argc, char** argv, char **env) { NSAutoreleasePool *pool; NSUserDefaults *defs; NSProcessInfo *proc; NSArray *args; NSArray *domains; NSMutableDictionary *domain; NSString *owner = nil; NSString *name = nil; NSString *value; NSString *user = nil; BOOL found = NO; unsigned int i; int derror = 0; #ifdef GS_PASS_ARGUMENTS GSInitializeProcess(argc, argv, env); #endif //[NSObject enableDoubleReleaseCheck: YES]; pool = [NSAutoreleasePool new]; proc = [NSProcessInfo processInfo]; if (proc == nil) { GSPrintf(stderr, @"defaults: unable to get process information!\n"); [pool release]; exit(GSEXIT_FAILURE); } args = [proc arguments]; for (i = 1; i < [args count]; i++) { if ([[args objectAtIndex: i] isEqual: @"--help"] || [[args objectAtIndex: i] isEqual: @"help"]) { printf( "The 'defaults' command lets you to read and modify a user's defaults.\n\n" "This program replaces the old NeXTstep style dread, dwrite, and dremove\n" "programs.\n\n" "If you have access to another user's defaults database, you may include\n" "'-u username' before any other options to use that user's database rather\n" "than your own.\n\n"); printf( "defaults read [ domain [ key] ]\n" " read the named default from the specified domain.\n" " If no 'key' is given - read all defaults from the domain.\n" " If no 'domain' is given - read all defaults from all domains.\n\n"); printf( "defaults readkey key\n" " read the named default from all domains.\n\n"); printf( "defaults write domain key value\n" " write 'value' as default 'key' in the specified domain.\n" " 'value' must be a property list in single quotes.\n\n"); printf( "defaults write domain dictionary\n" " write 'dictionary' as a replacement for the specified domain.\n" " 'dictionary' must be a property list in single quotes.\n\n"); printf( "defaults write\n" " reads standard input for defaults in the format produced by\n" " 'defaults read' and writes them to the database.\n\n"); printf( "defaults delete [ domain [ key] ]\n" " remove the specified default(s) from the domain.\n" " If no 'key' is given - delete the entire domain.\n\n"); printf( "defaults delete\n" " read standard input for a series of lines containing pairs of domains\n" " and keys for defaults to be deleted.\n\n"); printf( "defaults domains\n" " lists the domains in the database (one per line)\n\n"); printf( "defaults find word\n" " searches domain names, default names, and default value strings for\n" " those equal to the specified word and lists them on standard output.\n\n"); printf( "defaults plist\n" " output some information about property lists\n\n"); printf( "defaults help\n" " list options for the defaults command.\n\n"); [pool release]; exit(GSEXIT_SUCCESS); } else if ([[args objectAtIndex: i] isEqual: @"plist"]) { printf( "A property list is a method of providing structured information consisting\n" "of strings, arrays, dictionaries, and binary data.\n\n" "The defaults system allows you to work with a human-readable form of a\n" "property list which is set as the value of a default.\n\n"); printf( "In a property list, strings appear as plain text (as long as they contain\n" "no special characters), and inside quotation marks otherwise.\n" "Special characters inside a quoted string are 'escaped' by a backslash.\n" "This escape mechanism is used to permit the double quote mark to appear\n" "inside a quoted string.\n" "Unicode characters are represented as four digit hexadecimal numbers\n" "prefixed by \\U\n" "Arrays appear as a comma separated list of items delimited by brackets.\n" "Dictionaries appear as a series of key-value pairs, each pair is followed\n" "by a semicolon and the whole dictionary is delimited by curly brackets.\n" "Data is encoded as hexadecimal digits delimited by angle brackets.\n\n"); printf( "In output from 'defaults read' the defaults values are represented as\n" "property lists enclosed in single quotes. If a value actually contains\n" "a string with a single quite mark in it, that quote is repeated.\n" "Similarly, if 'defaults write' is reading a defaults value from stdin\n" "it expects to receive the value in single quotes with any internal\n" "single quote marks repeated.\n\n"); printf( "Here is an example of a dictionary encoded as a text property list -\n\n"); printf( "{\n" " Name = \"My Application\";\n" " Author = \"Just me and \\\"my other half\\\"\";\n" " Modules = (\n" " Main,\n" " \"'Input output'\",\n" " Computation\n" " );\n" " Checksum = <01014b5b 123a8b20>\n" "}\n\n"); printf( "And as output from the command 'defaults read foo bar' -\n\n"); printf( "foo bar '{\n" " Name = \"My Application\";\n" " Author = \"Just me and \\\"my other half\\\"\";\n" " Modules = (\n" " Main,\n" " \"''Input output''\",\n" " Computation\n" " );\n" " Checksum = <01014b5b 123a8b20>\n" "}'\n\n"); [pool release]; exit(GSEXIT_SUCCESS); } } i = 1; if ([args count] <= i) { GSPrintf(stderr, @"defaults: too few arguments supplied!\n"); [pool release]; exit(GSEXIT_FAILURE); } if ([[args objectAtIndex: i] isEqual: @"-u"]) { if ([args count] > ++i) { user = [args objectAtIndex: i++]; } else { GSPrintf(stderr, @"defaults: no name supplied for -u option!\n"); [pool release]; exit(GSEXIT_FAILURE); } } if (user) { GSSetUserName(user); defs = [[NSUserDefaults alloc] initWithUser: user]; } else { defs = [NSUserDefaults standardUserDefaults]; } if (defs == nil) { GSPrintf(stderr, @"defaults: unable to access defaults database!\n"); [pool release]; exit(GSEXIT_FAILURE); } /* We don't want this tool in the defaults database - so remove it. */ [defs removePersistentDomainForName: [proc processName]]; if ([args count] <= i) { GSPrintf(stderr, @"defaults: too few arguments supplied!\n"); [pool release]; exit(GSEXIT_FAILURE); } if ([[args objectAtIndex: i] isEqual: @"read"] || [[args objectAtIndex: i] isEqual: @"readkey"]) { NSDictionary *locale = [defs dictionaryRepresentation]; if ([[args objectAtIndex: i] isEqual: @"read"]) { if ([args count] == ++i) { name = nil; owner = nil; } else { owner = [args objectAtIndex: i++]; if ([args count] > i) { name = [args objectAtIndex: i]; } } } else { if ([args count] == ++i) { GSPrintf(stderr, @"defaults: too few arguments supplied!\n"); [pool release]; exit(GSEXIT_FAILURE); } owner = nil; name = [args objectAtIndex: i]; } domains = [defs persistentDomainNames]; for (i = 0; i < [domains count]; i++) { NSString *domainName = [domains objectAtIndex: i]; if (owner == nil || [owner isEqual: domainName]) { NSDictionary *dom; dom = [defs persistentDomainForName: domainName]; if (dom) { if (name == nil) { NSEnumerator *enumerator; NSString *key; enumerator = [dom keyEnumerator]; while ((key = [enumerator nextObject]) != nil) { id obj = [dom objectForKey: key]; const char *ptr; ptr = [domainName UTF8String]; output(ptr); putchar(' '); ptr = [key UTF8String]; output(ptr); putchar(' '); ptr = [[obj descriptionWithLocale: locale indent: 0] UTF8String]; output(ptr); putchar('\n'); } } else { id obj = [dom objectForKey: name]; if (obj) { const char *ptr; ptr = [domainName UTF8String]; output(ptr); putchar(' '); ptr = [name UTF8String]; output(ptr); putchar(' '); ptr = [[obj descriptionWithLocale: locale indent: 0] UTF8String]; output(ptr); putchar('\n'); found = YES; } } } } } domains = [defs volatileDomainNames]; for (i = 0; i < [domains count]; i++) { NSString *domainName = [domains objectAtIndex: i]; #if 0 if (owner == nil || [owner isEqual: domainName]) #else if ([owner isEqual: domainName]) #endif { NSDictionary *dom; dom = [defs volatileDomainForName: domainName]; if (dom) { if (name == nil) { NSEnumerator *enumerator; NSString *key; enumerator = [dom keyEnumerator]; while ((key = [enumerator nextObject]) != nil) { id obj = [dom objectForKey: key]; const char *ptr; ptr = [domainName UTF8String]; output(ptr); putchar(' '); ptr = [key UTF8String]; output(ptr); putchar(' '); ptr = [[obj descriptionWithLocale: locale indent: 0] UTF8String]; output(ptr); putchar('\n'); } } else { id obj = [dom objectForKey: name]; if (obj) { const char *ptr; ptr = [domainName UTF8String]; output(ptr); putchar(' '); ptr = [name UTF8String]; output(ptr); putchar(' '); ptr = [[obj descriptionWithLocale: locale indent: 0] UTF8String]; output(ptr); putchar('\n'); found = YES; } } } } } if (found == NO && name != nil) { GSPrintf(stderr, @"defaults read: couldn't read default\n"); derror = GSEXIT_NOTFOUND; } } else if ([[args objectAtIndex: i] isEqual: @"write"]) { id obj; if ([args count] == ++i) { int size = BUFSIZ; int got; int off = 0; char *buf = malloc(size); char *ptr; /* * Read from stdin - grow buffer as necessary since defaults * values are quoted property lists which may be huge. */ while ((got = fread(buf + off, 1, BUFSIZ, stdin)) == BUFSIZ) { off += BUFSIZ; size += BUFSIZ; buf = realloc(buf, size); if (buf == 0) { GSPrintf(stderr, @"defaults write: out of memory loading defaults\n"); [pool release]; exit(GSEXIT_FAILURE); } } buf[off + got] = '\0'; ptr = buf; for (;;) { unichar c; /* * Expect domain name as a space delimited string. */ while (isspace(*ptr)) { ptr++; } if (*ptr == '\0') { break; /* At end ... quit. */ } owner = input(&ptr); if ([owner length] == 0) { GSPrintf(stderr, @"defaults write: invalid input - nul domain name\n"); [pool release]; exit(GSEXIT_FAILURE); } name = input(&ptr); if ([name length] == 0) { GSPrintf(stderr, @"defaults write: invalid input - nul default name.\n"); [pool release]; exit(GSEXIT_FAILURE); } /* * Expect defaults value as a quoted property list which * may cover multiple lines. */ obj = input(&ptr); if (obj == nil) { GSPrintf(stderr, @"defaults write: invalid input - " @"empty property list\n"); [pool release]; exit(GSEXIT_FAILURE); } c = 0; if ([obj length] > 0) { c = [obj characterAtIndex: 0]; } if (c == '(' || c == '{' || c == '<' || c == '"') { id tmp; NS_DURING tmp = [obj propertyList]; NS_HANDLER NSLog(@"Failed to parse '%@' ... '%@'", obj, localException); tmp = nil; NS_ENDHANDLER if (tmp == nil) { GSPrintf(stderr, @"defaults write: invalid input - " @"bad property list\n"); [pool release]; exit(GSEXIT_FAILURE); } else { obj = tmp; } } domain = [[defs persistentDomainForName: owner] mutableCopy]; if (domain == nil) { domain = [NSMutableDictionary dictionaryWithCapacity:1]; } [domain setObject: obj forKey: name]; [defs setPersistentDomain: domain forName: owner]; } } else { owner = [args objectAtIndex: i++]; if ([args count] <= i) { GSPrintf(stderr, @"defaults: no dictionary or key for write!\n"); [pool release]; exit(GSEXIT_FAILURE); } name = [args objectAtIndex: i++]; if ([args count] > i) { const char *ptr; value = [args objectAtIndex: i]; ptr = [value UTF8String]; if (*ptr == '(' || *ptr == '{' || *ptr == '<' || *ptr == '"') { NS_DURING obj = [value propertyList]; NS_HANDLER NSLog(@"Failed to parse '%@' ... '%@'", value, localException); obj = nil; NS_ENDHANDLER if (obj == nil) { GSPrintf(stderr, @"defaults write: invalid input - " @"bad property list\n"); [pool release]; exit(GSEXIT_FAILURE); } } else { obj = value; } domain = [[defs persistentDomainForName: owner] mutableCopy]; if (domain == nil) { domain = [NSMutableDictionary dictionaryWithCapacity:1]; } [domain setObject: obj forKey: name]; [defs setPersistentDomain: domain forName: owner]; } else { domain = [name propertyList]; if (domain == nil || [domain isKindOfClass: [NSDictionary class]] == NO) { GSPrintf(stderr, @"defaults write: domain is not a dictionary!\n"); [pool release]; exit(GSEXIT_FAILURE); } } } if ([defs synchronize] == NO) { GSPrintf(stderr, @"defaults: unable to write to defaults database\n"); } } else if ([[args objectAtIndex: i] isEqual: @"delete"]) { if ([args count] == ++i) { int size = BUFSIZ; int got; int off = 0; char *buf = malloc(size); char *ptr; while ((got = fread(buf + off, 1, BUFSIZ, stdin)) == BUFSIZ) { off += BUFSIZ; size += BUFSIZ; buf = realloc(buf, size); if (buf == 0) { GSPrintf(stderr, @"defaults write: out of memory reading domains\n"); [pool release]; exit(GSEXIT_FAILURE); } } buf[off + got] = '\0'; ptr = buf; for (;;) { while (*ptr && isspace(*ptr)) { ptr++; } if (*ptr == '\0') { break; // Read all } owner = input(&ptr); if ([owner length] == 0) { GSPrintf(stderr, @"defaults delete: invalid input - empty domain name\n"); [pool release]; exit(GSEXIT_FAILURE); } name = input(&ptr); if ([name length] == 0) { GSPrintf(stderr, @"defaults delete: invalid input - empty key\n"); [pool release]; exit(GSEXIT_FAILURE); } domain = [[defs persistentDomainForName: owner] mutableCopy]; if (domain == nil) { GSPrintf(stderr, @"defaults delete: couldn't remove " @"value from non-existent domain %s\n", [owner UTF8String]); } else if ([domain objectForKey: name] == nil) { GSPrintf(stderr, @"defaults delete: couldn't remove non-existent value %s " @"from domain %s\n", [name UTF8String], [owner UTF8String]); } else { [domain removeObjectForKey: name]; [defs setPersistentDomain: domain forName: owner]; } } } else { owner = [args objectAtIndex: i++]; if ([args count] > i) { name = [args objectAtIndex: i]; } else { name = nil; } if (name) { domain = [[defs persistentDomainForName: owner] mutableCopy]; if (domain == nil) { GSPrintf(stderr, @"defaults delete: couldn't remove " @"value from non-existent domain %s\n", [owner UTF8String]); } else if ([domain objectForKey: name] == nil) { GSPrintf(stderr, @"defaults delete: couldn't remove non-existent value %s " @"from domain %s\n", [name UTF8String], [owner UTF8String]); } else { [domain removeObjectForKey: name]; [defs setPersistentDomain: domain forName: owner]; } } else { if ([defs persistentDomainForName: owner] == nil) { GSPrintf(stderr, @"defaults delete: couldn't remove " @"non-existent domain %s\n", [owner UTF8String]); } else { [defs removePersistentDomainForName: owner]; } } } if ([defs synchronize] == NO) { GSPrintf(stderr, @"defaults: unable to write to defaults database\n"); } } else if ([[args objectAtIndex: i] isEqual: @"domains"]) { domains = [defs persistentDomainNames]; for (i = 0; i < [domains count]; i++) { NSString *domainName = [domains objectAtIndex: i]; output([domainName UTF8String]); putchar('\n'); } } else if ([[args objectAtIndex: i] isEqual: @"find"]) { if ([args count] == ++i) { GSPrintf(stderr, @"defaults: no arguments for find!\n"); [pool release]; exit(GSEXIT_FAILURE); } name = [args objectAtIndex: i]; domains = [defs persistentDomainNames]; for (i = 0; i < [domains count]; i++) { NSString *domainName = [domains objectAtIndex: i]; NSDictionary *dom; if ([domainName isEqual: name]) { GSPrintf(stderr, @"%s\n", [domainName UTF8String]); found = YES; } dom = [defs persistentDomainForName: domainName]; if (dom) { NSEnumerator *enumerator; NSString *key; enumerator = [dom keyEnumerator]; while ((key = [enumerator nextObject]) != nil) { id obj = [dom objectForKey: key]; if ([key isEqual: name]) { GSPrintf(stderr, @"%s %s\n", [domainName UTF8String], [key UTF8String]); found = YES; } if ([obj isKindOfClass: [NSString class]]) { if ([obj isEqual: name]) { GSPrintf(stderr, @"%s %s %s\n", [domainName UTF8String], [key UTF8String], [obj UTF8String]); found = YES; } } } } } if (found == NO) { GSPrintf(stderr, @"defaults find: couldn't find value\n"); derror = GSEXIT_NOTFOUND; } } else { GSPrintf(stderr, @"defaults: unknown option supplied!\n"); derror = GSEXIT_FAILURE; } [pool release]; exit(derror); } gnustep-base-1.29.0/Tools/gdnc.1000066400000000000000000000047311435650067400163140ustar00rootroot00000000000000.\"gdnc(1) man page .\"put together by Martin Brecher .\"Copyright (C) 2005 Free Software Foundation, Inc. .\"Copying and distribution of this file, with or without modification, .\"are permitted in any medium without royalty provided the copyright .\"notice and this notice are preserved. .\" .\"Process this file with .\"groff -man -Tascii gdnc.1 .\" .TH GDNC 1 "August 2003" GNUstep "GNUstep System Manual" .SH NAME gdnc \- GNUstep Distributed Notification Center .SH SYNOPSIS .B gdnc .P .SH DESCRIPTION The gdnc daemon is used by GNUstep programs to send notifications and messages to one another. By default it uses private inter-process communications accessible only to the curtrent user on the machine on which it is running (where the operating system supports them). .P Every user needs to have his own instance of .B gdnc running. While .B gdnc will be started automatically as soon as it is needed, it is recommended to start .B gdnc in a personal login script like ~/.bashrc or ~/.cshrc. Alternatively (if you have no command-line tools which use distributed notifications) you can launch gdnc when your windowing system or the window manager is started. For example, on systems with X11 you can launch .B gdnc from your .xinitrc script or alternatively - if you are running Window Maker - put it in Window Maker's autostart script. See the .I GNUstep Build Guide for a sample startup script. .P .SH OPTIONS To attach .B gdnc to a remote session use the .IP "\fB-NSHost \fIhostname" argument. .P To run a copy of the server to handle public notifications (available to all users on the local machine) .IP "\fB-GSPublic YES" .P To run a copy of the server to handle network-public notifications (available to all users able to connect to the local machine on the network) .IP "\fB-GSNetwork YES" .P .SH DIAGNOSTICS .B gdomap -L GDNCServer will lookup instances of gdnc which were launched with the NSHost, GSPublic, or GSNetwork command line arguments. .P Alternatively, .B gdomap -N will list all registered names on the local host. .P .SH SEE ALSO gdomap(8), GNUstep(7), gpbs(1) .PP .I The GNUstep Build Guide example startup script: .P .SH HISTORY Work on .B gdnc started October 1998. .PP This manual page first appeared in gnustep-base 1.7.2 (July 2003). .P .SH AUTHORS .B gdnc was written by Richard Frith-Macdonald . .PP This man page was written by Martin Brecher . gnustep-base-1.29.0/Tools/gdnc.h000066400000000000000000000035111435650067400163760ustar00rootroot00000000000000/* Include for GNUstep Distributed NotificationCenter Copyright (C) 1998 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: October 1998 This file is part of the GNUstep Project This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #define GDNC_SERVICE @"GDNCServer" #define GDNC_NETWORK @"GDNCNetwork" @protocol GDNCClient - (oneway void) postNotificationName: (NSString*)name object: (NSString*)object userInfo: (NSData*)info selector: (NSString*)aSelector to: (uint64_t)observer; @end @protocol GDNCProtocol - (void) addObserver: (uint64_t)anObserver selector: (NSString*)aSelector name: (NSString*)notificationname object: (NSString*)anObject suspensionBehavior: (NSNotificationSuspensionBehavior)suspensionBehavior for: (id)client; - (oneway void) postNotificationName: (NSString*)notificationName object: (NSString*)anObject userInfo: (NSData*)d deliverImmediately: (BOOL)deliverImmediately for: (id)client; - (void) registerClient: (id)client; - (void) removeObserver: (uint64_t)anObserver name: (NSString*)notificationname object: (NSString*)anObject for: (id)client; - (void) setSuspended: (BOOL)flag for: (id)client; - (void) unregisterClient: (id)client; @end gnustep-base-1.29.0/Tools/gdnc.m000066400000000000000000000750001435650067400164050ustar00rootroot00000000000000/* Copyright (C) 1998 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: October 1998 This file is part of the GNUstep Project This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #import "common.h" #include #ifdef _WIN32 #include #endif #import "Foundation/NSArray.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSBundle.h" #import "Foundation/NSConnection.h" #import "Foundation/NSData.h" #import "Foundation/NSDistantObject.h" #import "Foundation/NSDistributedNotificationCenter.h" #import "Foundation/NSException.h" #import "Foundation/NSHashTable.h" #import "Foundation/NSHost.h" #import "Foundation/NSNotification.h" #import "Foundation/NSPort.h" #import "Foundation/NSPortNameServer.h" #import "Foundation/NSProcessInfo.h" #import "Foundation/NSRunLoop.h" #import "Foundation/NSTask.h" #import "Foundation/NSTimer.h" #import "Foundation/NSUserDefaults.h" #if defined(__MINGW__) #include "process.h" #endif #if defined(HAVE_SYS_FCNTL_H) # include #elif defined(HAVE_FCNTL_H) # include #endif #ifdef HAVE_SYSLOG_H #include #endif #if defined(HAVE_SYS_SIGNAL_H) # include #elif defined(HAVE_SIGNAL_H) # include #endif #ifndef NSIG #define NSIG 32 #endif static BOOL debugging = NO; static BOOL is_daemon = NO; /* Currently running as daemon. */ static BOOL auto_stop = NO; /* Should we shut down when unused? */ static NSTimer *timer = nil; /* When to shut down. */ #if defined(HAVE_SYSLOG) || defined(HAVE_SLOGF) # if defined(HAVE_SLOGF) # include # include # define LOG_CRIT _SLOG_CRITICAL # define LOG_DEBUG _SLOG_DEBUG1 # define LOG_ERR _SLOG_ERROR # define LOG_INFO _SLOG_INFO # define LOG_WARNING _SLOG_WARNING # define syslog(prio, msg,...) slogf(_SLOG_SETCODE(_SLOG_SYSLOG, 0), prio, msg, __VA_ARGS__) # endif static int log_priority = LOG_DEBUG; static void gdnc_log (int prio, const char *ebuf) { if (is_daemon) { # if defined(HAVE_SLOGF) // Let's not have 0 as the value for prio. It means "shutdown" on QNX syslog (prio ? prio : log_priority, "%s", ebuf); # else syslog (log_priority | prio, "%s", ebuf); # endif } else if (prio == LOG_INFO) { write (1, ebuf, strlen (ebuf)); write (1, "\n", 1); } else { write (2, ebuf, strlen (ebuf)); write (2, "\n", 1); } if (prio == LOG_CRIT) { if (is_daemon) { syslog (LOG_CRIT, "%s", "exiting."); } else { fprintf (stderr, "exiting.\n"); fflush (stderr); } exit(EXIT_FAILURE); } } #else #define LOG_CRIT 2 #define LOG_DEBUG 0 #define LOG_ERR 1 #define LOG_INFO 0 #define LOG_WARNING 0 static void gdnc_log (int prio, const char *ebuf) { write (2, ebuf, strlen (ebuf)); write (2, "\n", 1); if (prio == LOG_CRIT) { fprintf (stderr, "exiting.\n"); fflush (stderr); exit(EXIT_FAILURE); } } #endif static void ihandler(int sig) { static BOOL beenHere = NO; BOOL action; NSString *e; /* * Deal with recursive call of handler. */ if (beenHere == YES) { abort(); } beenHere = YES; /* * If asked to terminate, do so cleanly. */ if (sig == SIGTERM) { exit(EXIT_FAILURE); } #ifdef DEBUG action = YES; // abort() by default. #else action = NO; // exit() by default. #endif e = [[[NSProcessInfo processInfo] environment] objectForKey: @"CRASH_ON_ABORT"]; if (e != nil) { action = [e boolValue]; } if (action == YES) { abort(); } else { fprintf(stderr, "gdnc killed by signal %d\n", sig); exit(sig); } } #include "gdnc.h" /* * The following dummy class is here solely as a workaround for pre 3.3 * versions of gcc where protocols didn't work properly unless implemented * in the source where the '@protocol()' directive is used. */ @interface NSDistributedNotificationCenterGDNCDummy : NSObject - (oneway void) postNotificationName: (NSString*)name object: (NSString*)object userInfo: (NSData*)info selector: (NSString*)aSelector to: (uint64_t)observer; @end @implementation NSDistributedNotificationCenterGDNCDummy - (oneway void) postNotificationName: (NSString*)name object: (NSString*)object userInfo: (NSData*)info selector: (NSString*)aSelector to: (uint64_t)observer { return; } @end @interface GDNCNotification : NSObject { @public NSString *name; NSString *object; NSData *info; } + (GDNCNotification*) notificationWithName: (NSString*)notificationName object: (NSString*)notificationObject data: (NSData*)notificationData; @end @implementation GDNCNotification - (void) dealloc { RELEASE(name); RELEASE(object); RELEASE(info); [super dealloc]; } - (NSString*) description { return [NSString stringWithFormat: @"%@ Name:'%@' Object:'%@' Info:'%@'", [super description], name, object, info]; } + (GDNCNotification*) notificationWithName: (NSString*)notificationName object: (NSString*)notificationObject data: (NSData*)notificationData { GDNCNotification *tmp = [GDNCNotification alloc]; tmp->name = RETAIN(notificationName); tmp->object = RETAIN(notificationObject); tmp->info = RETAIN(notificationData); return AUTORELEASE(tmp); } @end /* * Information about a notification observer. */ @interface GDNCClient : NSObject { @public BOOL suspended; id client; NSMutableArray *observers; } @end @implementation GDNCClient - (void) dealloc { RELEASE(observers); [super dealloc]; } - (id) init { observers = [NSMutableArray new]; return self; } @end /* * Information about a notification observer. */ @interface GDNCObserver : NSObject { @public uint64_t observer; NSString *notificationName; NSString *notificationObject; NSString *selector; GDNCClient *client; NSMutableArray *queue; NSNotificationSuspensionBehavior behavior; } @end @implementation GDNCObserver - (void) dealloc { RELEASE(queue); RELEASE(selector); RELEASE(notificationName); RELEASE(notificationObject); [super dealloc]; } - (id) init { queue = [[NSMutableArray alloc] initWithCapacity: 1]; return self; } @end @interface GDNCServer : NSObject { NSConnection *conn; NSMapTable *connections; NSHashTable *allObservers; NSMutableDictionary *observersForNames; NSMutableDictionary *observersForObjects; } - (void) addObserver: (uint64_t)anObserver selector: (NSString*)aSelector name: (NSString*)notificationName object: (NSString*)anObject suspensionBehavior: (NSNotificationSuspensionBehavior)suspensionBehavior for: (id)client; - (BOOL) connection: (NSConnection*)ancestor shouldMakeNewConnection: (NSConnection*)newConn; - (id) connectionBecameInvalid: (NSNotification*)notification; - (oneway void) postNotificationName: (NSString*)notificationName object: (NSString*)notificationObject userInfo: (NSData*)d deliverImmediately: (BOOL)deliverImmediately for: (id)client; - (void) removeObserver: (GDNCObserver*)observer; - (void) removeObserversForClients: (NSMapTable*)clients; - (void) removeObserver: (uint64_t)anObserver name: (NSString*)notificationName object: (NSString*)notificationObject for: (id)client; - (void) setSuspended: (BOOL)flag for: (id)client; @end @implementation GDNCServer - (void) autoStop: (NSTimer*)t { if (t == timer) { timer = nil; } if (auto_stop == YES && NSCountMapTable(connections) == 0) { /* There is nothing else using this process, stop. */ exit(EXIT_SUCCESS); } } - (void) dealloc { NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; NSMapEnumerator enumerator; NSConnection *connection; NSMapTable *clients; if (conn) { [nc removeObserver: self name: NSConnectionDidDieNotification object: conn]; DESTROY(conn); } /* * Free all the client map tables in the connections map table and * ignore notifications from those connections. */ enumerator = NSEnumerateMapTable(connections); while (NSNextMapEnumeratorPair(&enumerator, (void**)&connection, (void**)&clients) == YES) { [nc removeObserver: self name: NSConnectionDidDieNotification object: connection]; [self removeObserversForClients: clients]; NSFreeMapTable(clients); } /* * Now free the connections map itself and the table of observers. */ NSFreeMapTable(connections); NSFreeHashTable(allObservers); /* * And release the maps of notification names and objects. */ RELEASE(observersForNames); RELEASE(observersForObjects); [super dealloc]; } - (id) init { NSString *hostname; NSString *service; BOOL isNetwork = NO; BOOL isPublic = NO; NSPort *port; NSPortNameServer *ns; NSUserDefaults *defs; connections = NSCreateMapTable(NSObjectMapKeyCallBacks, NSNonOwnedPointerMapValueCallBacks, 0); allObservers = NSCreateHashTable(NSNonOwnedPointerHashCallBacks, 0); observersForNames = [NSMutableDictionary new]; observersForObjects = [NSMutableDictionary new]; defs = [NSUserDefaults standardUserDefaults]; hostname = [defs stringForKey: @"NSHost"]; if ([hostname length] > 0 || [defs boolForKey: @"GSPublic"] == YES) { if (hostname == nil || [hostname isEqualToString: @"localhost"] == YES || [hostname isEqualToString: @"127.0.0.1"] == YES) { hostname = @""; } isPublic = YES; } else if ([defs boolForKey: @"GSNetwork"] == YES) { isNetwork = YES; } if (isNetwork) { service = GDNC_NETWORK; ns = [NSSocketPortNameServer sharedInstance]; port = (NSPort*)[NSSocketPort port]; } else if (isPublic) { service = GDNC_SERVICE; ns = [NSSocketPortNameServer sharedInstance]; port = (NSPort*)[NSSocketPort port]; } else { NSUserDefaults *defs = [NSUserDefaults standardUserDefaults]; if ([defs objectForKey: @"NSPortIsMessagePort"] != nil && [defs boolForKey: @"NSPortIsMessagePort"] == NO) { ns = [NSSocketPortNameServer sharedInstance]; port = (NSPort*)[NSSocketPort port]; } else { ns = [NSMessagePortNameServer sharedInstance]; port = (NSPort*)[NSMessagePort port]; } hostname = @""; service = GDNC_SERVICE; } conn = [[NSConnection alloc] initWithReceivePort: port sendPort: nil]; [conn setRootObject: self]; if ([hostname length] == 0 || [[NSHost hostWithName: hostname] isEqual: [NSHost currentHost]] == YES) { if ([conn registerName: service withNameServer: ns] == NO) { NSLog(@"gdnc - unable to register with name server as %@ - quiting.", service); DESTROY(self); return self; } } else { NSHost *host = [NSHost hostWithName: hostname]; NSPort *port = [conn receivePort]; NSArray *a; unsigned c; if (host == nil) { NSLog(@"gdnc - unknown NSHost argument ... %@ - quiting.", hostname); DESTROY(self); return self; } a = [host names]; c = [a count]; while (c-- > 0) { NSString *name = [a objectAtIndex: c]; name = [service stringByAppendingFormat: @"-%@", name]; if ([ns registerPort: port forName: name] == NO) { NSLog(@"gdnc - failed to register as %@", name); } } a = [host addresses]; c = [a count]; while (c-- > 0) { NSString *name = [a objectAtIndex: c]; name = [service stringByAppendingFormat: @"-%@", name]; if ([ns registerPort: port forName: name] == NO) { NSLog(@"gdnc - failed to register as %@", name); } } } /* * Get notifications for new connections and connection losses. */ [conn setDelegate: self]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(connectionBecameInvalid:) name: NSConnectionDidDieNotification object: conn]; return self; } - (void) addObserver: (uint64_t)anObserver selector: (NSString*)aSelector name: (NSString*)notificationName object: (NSString*)anObject suspensionBehavior: (NSNotificationSuspensionBehavior)suspensionBehavior for: (id)client { GDNCClient *info; NSMapTable *clients; GDNCObserver *obs; NSConnection *connection; if (debugging) NSLog(@"Adding observer %llu for %@ %@", (unsigned long long)anObserver, notificationName, anObject); connection = [(NSDistantObject*)client connectionForProxy]; clients = (NSMapTable*)NSMapGet(connections, connection); if (clients == 0) { [NSException raise: NSInvalidArgumentException format: @"Unknown connection for new observer"]; } info = (GDNCClient*)NSMapGet(clients, client); if (info == nil) { [NSException raise: NSInvalidArgumentException format: @"Unknown client for new observer"]; } /* * Create new observer info and add to array of observers for this * client and the table of all observers. */ obs = [GDNCObserver new]; obs->observer = anObserver; obs->client = info; obs->behavior = suspensionBehavior; obs->selector = [aSelector copy]; [info->observers addObject: obs]; RELEASE(obs); NSHashInsert(allObservers, obs); /* * Now add the observer to the lists of observers interested in it's * particular notification names and objects. */ if (anObject) { NSMutableArray *objList; objList = [observersForObjects objectForKey: anObject]; if (objList == nil) { objList = [NSMutableArray new]; [observersForObjects setObject: objList forKey: anObject]; RELEASE(objList); } /* * If possible use an existing string as the key. */ if ([objList count] > 0) { GDNCObserver *tmp = [objList objectAtIndex: 0]; anObject = tmp->notificationObject; } obs->notificationObject = RETAIN(anObject); [objList addObject: obs]; } if (notificationName) { NSMutableArray *namList; namList = [observersForNames objectForKey: notificationName]; if (namList == nil) { namList = [NSMutableArray new]; [observersForNames setObject: namList forKey: notificationName]; RELEASE(namList); } /* * If possible use an existing string as the key. */ if ([namList count] > 0) { GDNCObserver *tmp = [namList objectAtIndex: 0]; notificationName = tmp->notificationName; } obs->notificationName = RETAIN(notificationName); [namList addObject: obs]; } } - (BOOL) connection: (NSConnection*)ancestor shouldMakeNewConnection: (NSConnection*)newConn { NSMapTable *table; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(connectionBecameInvalid:) name: NSConnectionDidDieNotification object: newConn]; [newConn setDelegate: self]; /* * Create a new map table entry for this connection with a value that * is a table (normally with a single entry) containing registered * clients (proxies for NSDistributedNotificationCenter objects). */ table = NSCreateMapTable(NSObjectMapKeyCallBacks, NSObjectMapValueCallBacks, 0); NSMapInsert(connections, newConn, table); if (nil != timer) { [timer invalidate]; timer = nil; } return YES; } - (id) connectionBecameInvalid: (NSNotification*)notification { id connection = [notification object]; [[NSNotificationCenter defaultCenter] removeObserver: self name: NSConnectionDidDieNotification object: connection]; if (connection == conn) { NSLog(@"argh - gdnc server root connection has been destroyed."); exit(EXIT_FAILURE); } else { NSMapTable *table; /* * Remove all clients registered via this connection * (should normally only be 1) - then the connection. */ table = NSMapGet(connections, connection); NSMapRemove(connections, connection); if (table != 0) { [self removeObserversForClients: table]; NSFreeMapTable(table); } if (auto_stop == YES && NSCountMapTable(connections) == 0) { /* There is nothing left using this notification center, * so schedule the auto_stop to occur in a short while * if nothing has connected to us. */ if (nil != timer) { [timer invalidate]; } timer = [NSTimer scheduledTimerWithTimeInterval: 15.0 target: self selector: @selector(autoStop:) userInfo: nil repeats: NO]; } } return nil; } - (void) registerClient: (id)client { NSMapTable *table; GDNCClient *info; table = NSMapGet(connections, [(NSDistantObject*)client connectionForProxy]); if (table == 0) { [NSException raise: NSInternalInconsistencyException format: @"registration with unknown connection"]; } if (NSMapGet(table, client) != 0) { [NSException raise: NSInternalInconsistencyException format: @"registration with registered client"]; } info = [GDNCClient new]; if ([(id)client isProxy] == YES) { Protocol *p = @protocol(GDNCClient); [(id)client setProtocolForProxy: p]; } info->client = client; NSMapInsert(table, client, info); RELEASE(info); } - (oneway void) postNotificationName: (NSString*)notificationName object: (NSString*)notificationObject userInfo: (NSData*)d deliverImmediately: (BOOL)deliverImmediately for: (id)client { NSMutableArray *observers = [NSMutableArray array]; NSMutableArray *byName; NSMutableArray *byObject; unsigned pos; GDNCNotification *notification; byName = [observersForNames objectForKey: notificationName]; byObject = [observersForObjects objectForKey: notificationObject]; /* * Build up a list of all those observers that should get sent this. */ for (pos = [byName count]; pos > 0; pos--) { GDNCObserver *obs = [byName objectAtIndex: pos - 1]; if (obs->notificationObject == nil || [obs->notificationObject isEqual: notificationObject]) { [observers addObject: obs]; } } for (pos = [byObject count]; pos > 0; pos--) { GDNCObserver *obs = [byObject objectAtIndex: pos - 1]; if (obs->notificationName == nil || [obs->notificationName isEqual: notificationName]) { if ([observers indexOfObjectIdenticalTo: obs] == NSNotFound) { [observers addObject: obs]; } } } if ([observers count] == 0) { return; } /* * Build notification object to queue for observer. */ notification = [GDNCNotification notificationWithName: notificationName object: notificationObject data: d]; /* * Add the object to the queue for this observer depending on suspension * state of the client NSDistributedNotificationCenter etc. */ for (pos = [observers count]; pos > 0; pos--) { GDNCObserver *obs = [observers objectAtIndex: pos - 1]; if (obs->client->suspended == NO || deliverImmediately == YES) { [obs->queue addObject: notification]; } else { switch (obs->behavior) { case NSNotificationSuspensionBehaviorDrop: break; case NSNotificationSuspensionBehaviorCoalesce: [obs->queue removeAllObjects]; [obs->queue addObject: notification]; break; case NSNotificationSuspensionBehaviorHold: [obs->queue addObject: notification]; break; case NSNotificationSuspensionBehaviorDeliverImmediately: [obs->queue addObject: notification]; break; } } } /* * Now perform the actual posting of the notification to the observers in * our array. */ for (pos = [observers count]; pos > 0; pos--) { GDNCObserver *obs = [observers objectAtIndex: pos - 1]; if (obs->client->suspended == NO || deliverImmediately == YES) { /* * Post notifications to the observer until: * an exception (obs is set to nil) * the queue is empty ([obs->queue count] == 0) * the observer is removed (obs is not in allObservers) */ while (obs != nil && [obs->queue count] > 0 && NSHashGet(allObservers, obs) != 0) { GDNCNotification *n; n = RETAIN([obs->queue objectAtIndex: 0]); NS_DURING { [obs->queue removeObjectAtIndex: 0]; if (debugging) NSLog(@"Posting to observer %llu with %@", (unsigned long long)obs->observer, n); [obs->client->client postNotificationName: n->name object: n->object userInfo: n->info selector: obs->selector to: obs->observer]; } NS_HANDLER { obs = nil; NSLog(@"Problem posting notification to client: %@", localException); } NS_ENDHANDLER RELEASE(n); } } } } - (void) removeObserver: (GDNCObserver*)observer { if (debugging) NSLog(@"Removing observer %llu for %@ %@", (unsigned long long)observer->observer, observer->notificationName, observer->notificationObject); if (observer->notificationObject) { NSMutableArray *objList; objList= [observersForObjects objectForKey: observer->notificationObject]; if (objList != nil) { [objList removeObjectIdenticalTo: observer]; } } if (observer->notificationName) { NSMutableArray *namList; namList = [observersForNames objectForKey: observer->notificationName]; if (namList != nil) { [namList removeObjectIdenticalTo: observer]; } } NSHashRemove(allObservers, observer); [observer->client->observers removeObjectIdenticalTo: observer]; } - (void) removeObserversForClients: (NSMapTable*)clients { NSMapEnumerator enumerator; NSObject *client; GDNCClient *info; enumerator = NSEnumerateMapTable(clients); while (NSNextMapEnumeratorPair(&enumerator, (void**)&client, (void**)&info) == YES) { while ([info->observers count] > 0) { [self removeObserver: [info->observers objectAtIndex: 0]]; } } } - (void) removeObserver: (uint64_t)anObserver name: (NSString*)notificationName object: (NSString*)notificationObject for: (id)client { if (anObserver == 0) { if (notificationName == nil) { NSMutableArray *observers; /* * No notification name - so remove all with matching object. */ observers = [observersForObjects objectForKey: notificationObject]; while ([observers count] > 0) { GDNCObserver *obs; obs = [observers objectAtIndex: 0]; [self removeObserver: obs]; } } else if (notificationObject == nil) { NSMutableArray *observers; /* * No notification object - so remove all with matching name. */ observers = [observersForObjects objectForKey: notificationName]; while ([observers count] > 0) { GDNCObserver *obs; obs = [observers objectAtIndex: 0]; [self removeObserver: obs]; } } else { NSMutableArray *byName; NSMutableArray *byObject; unsigned pos; /* * Remove observers that match both name and object. */ byName = [observersForObjects objectForKey: notificationName]; byObject = [observersForObjects objectForKey: notificationName]; for (pos = [byName count]; pos > 0; pos--) { GDNCObserver *obs; obs = [byName objectAtIndex: pos - 1]; if ([byObject indexOfObjectIdenticalTo: obs] != NSNotFound) { [self removeObserver: obs]; } } for (pos = [byObject count]; pos > 0; pos--) { GDNCObserver *obs; obs = [byObject objectAtIndex: pos - 1]; if ([byName indexOfObjectIdenticalTo: obs] != NSNotFound) { [self removeObserver: obs]; } } } } else { NSMapTable *table; GDNCClient *info; /* * If an observer object (as an unsigned) was specified then * the observer MUST be from this client - so we can look * through the per-client list of objects. */ table = NSMapGet(connections, [(NSDistantObject*)client connectionForProxy]); if (table == 0) { [NSException raise: NSInternalInconsistencyException format: @"removeObserver with unknown connection"]; } info = (GDNCClient*)NSMapGet(table, client); if (info != nil) { unsigned pos = [info->observers count]; while (pos > 0) { GDNCObserver *obs = [info->observers objectAtIndex: --pos]; if (obs->observer == anObserver) { if (notificationName == nil || [notificationName isEqual: obs->notificationName]) { if (notificationObject == nil || [notificationObject isEqual: obs->notificationObject]) { [self removeObserver: obs]; } } } } } } } - (void) setSuspended: (BOOL)flag for: (id)client { NSMapTable *table; GDNCClient *info; table = NSMapGet(connections, [(NSDistantObject*)client connectionForProxy]); if (table == 0) { [NSException raise: NSInternalInconsistencyException format: @"setSuspended: with unknown connection"]; } info = (GDNCClient*)NSMapGet(table, client); if (info == nil) { [NSException raise: NSInternalInconsistencyException format: @"setSuspended: with unregistered client"]; } info->suspended = flag; } - (void) unregisterClient: (id)client { NSMapTable *table; GDNCClient *info; table = NSMapGet(connections, [(NSDistantObject*)client connectionForProxy]); if (table == 0) { [NSException raise: NSInternalInconsistencyException format: @"unregistration with unknown connection"]; } info = (GDNCClient*)NSMapGet(table, client); if (info == nil) { [NSException raise: NSInternalInconsistencyException format: @"unregistration with unregistered client"]; } while ([info->observers count] > 0) { [self removeObserver: [info->observers objectAtIndex: 0]]; } NSMapRemove(table, client); } @end /**

    The gdnc daemon is used by GNUstep programs to send notifications and messages to one another, in conjunction with the Base library Notification-related classes.

    Every user needs to have his own instance of gdnc running. While gdnc will be started automatically as soon as it is needed, it is recommended to start gdnc in a personal login script like ~/.bashrc or ~/.cshrc. Alternatively (if you have no command-line tools which use distributed notifications) you can launch gdnc when your windowing system or the window manager is started. For example, on systems with X11 you can launch gdnc from your .xinitrc script or alternatively - if you are running Window Maker - put it in Window Maker's autostart script. See the GNUstep Build Guide for a sample startup script.

    Please see the man page for more information.

    */ int main(int argc, char** argv, char** env) { GDNCServer *server; BOOL subtask = YES; NSProcessInfo *pInfo; NSMutableArray *args; CREATE_AUTORELEASE_POOL(pool); #ifdef GS_PASS_ARGUMENTS GSInitializeProcess(argc, argv, env); #endif //[NSObject enableDoubleReleaseCheck: YES]; pInfo = [NSProcessInfo processInfo]; args = AUTORELEASE([[pInfo arguments] mutableCopy]); if ([[pInfo arguments] containsObject: @"--help"] == YES) { printf("gdnc\n\n"); printf("GNU Distributed Notification Center\n"); printf("--help\tfor help\n"); printf("--no-fork\tavoid fork() to make debugging easy\n"); printf("--verbose\tMore verbose debug output\n"); exit(EXIT_SUCCESS); } if ([[pInfo arguments] containsObject: @"--auto"] == YES) { auto_stop = YES; } if ([[pInfo arguments] containsObject: @"--daemon"] == YES) { subtask = NO; is_daemon = YES; } if ([[pInfo arguments] containsObject: @"-f"] == YES || [[pInfo arguments] containsObject: @"--no-fork"] == YES) { subtask = NO; } if ([[pInfo arguments] containsObject: @"--verbose"] == YES) { debugging = YES; } if ([[NSUserDefaults standardUserDefaults] boolForKey: @"debug"] == YES) { subtask = NO; debugging = YES; } if (subtask) { NSFileHandle *null; NSTask *t; t = [NSTask new]; NS_DURING { [args removeObjectAtIndex: 0]; [args addObject: @"--daemon"]; [t setLaunchPath: [[NSBundle mainBundle] executablePath]]; [t setArguments: args]; [t setEnvironment: [pInfo environment]]; null = [NSFileHandle fileHandleWithNullDevice]; [t setStandardInput: null]; [t setStandardOutput: null]; [t setStandardError: null]; [t launch]; DESTROY(t); } NS_HANDLER { gdnc_log(LOG_CRIT, [[localException description] UTF8String]); DESTROY(t); } NS_ENDHANDLER exit(EXIT_FAILURE); } RELEASE(pool); { CREATE_AUTORELEASE_POOL(pool); NSUserDefaults *defs; int sym; for (sym = 0; sym < NSIG; sym++) { if (sym == SIGABRT) continue; #ifdef SIGPROF if (sym == SIGPROF) continue; #endif signal(sym, ihandler); } #ifndef _WIN32 signal(SIGPIPE, SIG_IGN); signal(SIGTTOU, SIG_IGN); signal(SIGTTIN, SIG_IGN); signal(SIGHUP, SIG_IGN); #endif signal(SIGTERM, ihandler); /* * Make gdnc logging go to syslog unless overridden by user. */ defs = [NSUserDefaults standardUserDefaults]; [defs registerDefaults: [NSDictionary dictionaryWithObjectsAndKeys: @"YES", @"GSLogSyslog", nil]]; server = [GDNCServer new]; /* * Close standard input, output, and error to run as daemon. */ [[NSFileHandle fileHandleWithStandardInput] closeFile]; [[NSFileHandle fileHandleWithStandardOutput] closeFile]; #ifndef __MINGW__ if (debugging == NO) { [[NSFileHandle fileHandleWithStandardError] closeFile]; } #endif RELEASE(pool); } if (server != nil) { CREATE_AUTORELEASE_POOL(pool); [[NSRunLoop currentRunLoop] run]; RELEASE(pool); } exit(EXIT_SUCCESS); } gnustep-base-1.29.0/Tools/gdomap.8000066400000000000000000000121621435650067400166540ustar00rootroot00000000000000.\"gdomap(8) man page .\"put together by Martin Brecher .\"Copyright (C) 2005 Free Software Foundation, Inc. .\" .\"Process this file with .\"groff -man -Tascii gdomap.8 .\" .TH GDOMAP 8 "August 2003" GNUstep "GNUstep System Manual" .SH NAME gdomap \- GNUstep Distributed Objects name server .SH SYNOPSIS .B gdomap .RB [ "-C\fP" | "-H\fP" ] .RB [ -I .IR pidfile ] .RB [ -L .IR name ] .RB [ -M .IR name ] .RB [ -N ] .RB [ -P .IR number ] .RB [ -R .IR name ] .RB [ -S ] .RB [ -T .IR type ] .RB [ -U .IR name ] .RB [ -a .IR file ] .RB [ -c .IR file ] .RB [ -d ] .RB [ -f ] .RB [-i .IR seconds ] .RB [-j .IR path ] .RB [ -p ] .SH DESCRIPTION .B gdomap The gdomap daemon is used by GNUstep programs to look up distributed objects of processes running across the network (and between different user accounts on a single machine). The daemon is NOT used for lookup where two processes belonging to the same user are using a host-local connection. This manual page explains the usage of gdomap. For design and implementation information (and special notes for packagers), please see the HTML documentation installed in $GNUSTEP_SYSTEM_DOC, under Command-line Tools. .P Usually the gdomap daemon is started at system boot time and binds itself to port 538. See the .I GNUstep Build Guide for a sample startup script. .P By default gdomap probes every machine on the local network to see if there is a copy of gdomap running on it. This is done for class-C networks and subnets of class-C networks. If your host is on a class-B or class-A net then the default behaviour is to treat it as a class-C net and probe only the hosts that would be expected on a class-C network of the same number. .P If you are running on a class-A or class-B network, or if your net has a large number of hosts which will not have gdomap on them - you may want to supply a configuration file listing the hosts to be probed explicitly, rather than getting gdomap to probe all hosts on the local net. .P You may also want to supply the .I configuration file so that hosts which are not actually on your local network can still be found when your code tries to connect to a host using @"*" as the host name. NB. this functionality does not exist in OpenStep. .P A .I configuration file consists of a list of IP addresses to be probed. The IP addresses should be in standard 'dot' notation, one per line. Empty lines are permitted in the configuration file. Anything on a line after a hash ('#') is ignored. You tell gdomap about the config file with the '\-c' command line option. .PP gdomap uses the SIOCGIFCONF ioctl to build a list of IP addresses and netmasks for the network interface cards on your machine. On some operating systems, this facility is not available (or is broken), so you must tell gdomap the addresses and masks of the interfaces using the '\-a' command line option. The file named with '\-a' should contain a series of lines with space separated pairs of addresses and masks in 'dot' notation. You must NOT include loopback interfaces in this list. If you want to support broadcasting of probe information on a network, you may supply the broadcast address as a third item on the line. If your operating system has some other method of giving you a list of network interfaces and masks, please send me example code so that I can implement it in gdomap. .SH OPTIONS .IP "\fB-C" help about configuration .IP "\fB-H" general help .IP "\fB-I" pid file to write pid .IP "\fB-L \fIname" perform lookup for name then quit. .IP "\fB-M \fIname" machine name for .B -L and .B -N .IP "\fB-N" list all names registered on host .IP "\fB-P \fInumber" port number required for .B -R option. .IP "\fB-R \fIname" register name locally then quit. .B -S .IP "\fB-S" list the addresses of all gdomap servers known to host .IP "\fB-T \fItype" port type for .B -L , .B -R and .B -U options - tcp_gdo, udp_gdo, tcp_foreign, udp_foreign. .IP "\fB-U \fIname" unregister name locally then quit. .IP "\fB-a \fIfile" use config file for interface list. .IP "\fB-c \fIfile" use config file for probe. .IP "\fB-d" extra debug logging (normally via syslog). .IP "\fB-f" avoid fork() to make debugging easy .IP "\fB-i \fIseconds" re-probe at this interval (roughly), min 60 .IP "\fB-j \fIpath" place the process in a chroot jail at this path rather than in /tmp .IP "\fB-p" disable probing for other servers .PP .SH FILES Use the .B -c option to specify a configuration file for gdomap. See under .B DESCRIPTION for possible configurations. .SH DIAGNOSTICS Kill with SIGUSR1 to obtain a dump of all known peers in /tmp/gdomap.dump .P .B gdomap -N lists all registered names on the local host. .SH SEE ALSO .B gdomap -C gives above instructions on how to set up gdomap. .P gdnc(1), GNUstep(7), gpbs(1) .P .I The GNUstep Build Guide example rc script: .P .SH HISTORY Work on .B gdomap started in October 1996. .PP This manual page first appeared in gnustep-base 1.7.1 (June 2003). .P .SH AUTHORS .B gdomap was written by Richard Frith-Macdonald .PP This manual page was put together by Martin Brecher . gnustep-base-1.29.0/Tools/gdomap.c000066400000000000000000003633321435650067400167370ustar00rootroot00000000000000/* This is a simple name server for GNUstep Distributed Objects Copyright (C) 1996, 1997, 1998, 2002 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: October 1996 This file is part of the GNUstep Base Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ /* Ported to mingw 07/12/00 by Bjorn Giesler */ #include "config.h" #if !defined(__MINGW__) # if defined(__MINGW32__) || defined(__MINGW64__) # define __MINGW__ # endif #endif #include #include #include #include /* for gethostname() */ #include #ifndef __MINGW__ #include /* for MAXHOSTNAMELEN */ #include #include #include #include /* for inet_ntoa() */ #endif /* !__MINGW__ */ #include #include #include /* for strchr() */ #include /* for strchr() */ #include #if defined(__MINGW__) #include #include #include #include #include #include #else #include #include #include #include #include #include #if defined(HAVE_TIME_H) #include #endif #if defined(HAVE_PWD_H) #include #endif #if defined(HAVE_GRP_H) #include #endif #if HAVE_GETOPT_H #include #endif /* * Stuff for setting the sockets into non-blocking mode. */ #if defined(__POSIX_SOURCE) || defined(__EXT_POSIX1_198808) #define NBLK_OPT O_NONBLOCK #else #define NBLK_OPT FNDELAY #endif #include #include #if !defined(SIOCGIFCONF) || defined(__CYGWIN__) #include #ifndef SIOCGIFCONF #include #endif #endif #if defined(__svr4__) #if defined(HAVE_SYS_STROPTS_H) #include #endif #endif #endif /* !__MINGW__ */ #if defined(HAVE_SYSLOG_H) #include #elif defined(HAVE_SYS_SLOG_H) # include # if defined(HAVE_SYS_SLOGCODES_H) # include # endif #endif #if HAVE_STRERROR #define lastErr() strerror(errno) #else #if defined(__MINGW__) static errbuf[BUFSIZ]; #define lastErr() (sprintf(errbuf, "WSAGetLastError()=%d", WSAGetLastError()), errbuf) #else static errbuf[BUFSIZ]; #define lastErr() (sprintf(errbuf, "%m"), errbuf) #endif #endif #include "gdomap.h" /* * ABOUT THIS PROGRAM * * This is a simple name server for GNUstep Distributed Objects * The server program listens on a well known port (service name 'gdomap') * * The officially assigned port is 538. On most systems port numbers * under 1024 can only be used by root (for security). So this program * needs to be run as root. * * This is UNIX code - I have no idea how portable to other OSs it may be. * * For detailed information about the communication protocol used - see * the include file. */ /* For IRIX machines, which don't define this */ #ifndef IPPORT_USERRESERVED #define IPPORT_USERRESERVED 5000 #endif /* IPPORT_USERRESERVED */ #define QUEBACKLOG (16) /* How many coonections to queue. */ #define MAX_IFACE (256) /* How many network interfaces. */ #define IASIZE (sizeof(struct in_addr)) #define MAX_EXTRA ((GDO_NAME_MAX_LEN - 2 * IASIZE)/IASIZE) #define ROUND(V, A) \ ({ __typeof__(V) __v=(V); __typeof__(A) __a=(A); \ __a*((__v+__a-1)/__a); }) typedef unsigned char *uptr; #ifndef __MINGW__ static int is_daemon = 0; /* Currently running as daemon. */ #endif static int in_config = 0; /* Reading config file. */ static int debug = 0; /* Extra debug gdomap_logging. */ static int nobcst = 0; /* turn off broadcast probing. */ static int nofork = 0; /* turn off fork() for debugging. */ static int noprobe = 0; /* disable probe for unknown servers. */ static int interval = 600; /* Minimum time (sec) between probes. */ static char *pidfile = NULL; /* file to write PID to */ static int udp_sent = 0; static int tcp_sent = 0; static int udp_read = 0; static int tcp_read = 0; static int soft_int = 0; static long last_probe; static struct in_addr loopback; static unsigned short my_port; /* Set in init_iface() */ static struct in_addr class_a_mask; static struct in_addr class_b_mask; static uint32_t class_a_net; static uint32_t class_b_net; static uint32_t class_c_net; struct in_addr class_c_mask; static char *local_hostname = 0; /* * Predeclare some of the functions used. */ static void dump_stats(); #ifndef __MINGW__ static void dump_tables(); #endif static void handle_accept(); static void handle_io(); static void handle_read(int); static void handle_recv(); static void handle_request(int); static void handle_send(); static void handle_write(int); static void init_iface(); static void load_iface(const char* from); static void init_ports(); static void init_probe(); static void queue_msg(struct sockaddr_in* a, uptr d, unsigned l); static void queue_pop(); static void queue_probe(struct in_addr* to, struct in_addr *from, int num_extras, struct in_addr* extra, int is_reply); char *xgethostname (void); #if defined(__MINGW__) #ifndef HAVE_GETOPT /* A simple implementation of getopt() */ static int indexof(char c, char *string) { int i; for (i = 0; i < strlen(string); i++) { if (string[i] == c) { return i; } } return -1; } static char *optarg; static char getopt(int argc, char **argv, char *options) { static int argi; static char *arg; int index; char retval = '\0'; optarg = NULL; if (argi == 0) { argi = 1; } while (argi < argc) { arg = argv[argi]; if (strlen(arg) == 2) { if (arg[0] == '-') { if ((index = indexof(arg[1], options)) != -1) { retval = arg[1]; if (index < strlen(options)) { if (options[index+1] == ':') { if (argi < argc-1) { argi++; optarg = argv[argi]; } else { return -1; /* ':' given, but argv exhausted */ } } } } } } argi++; return retval; } return -1; } #endif #endif static char ebuf[2048]; #if defined(HAVE_SYSLOG) || defined(HAVE_SLOGF) # if defined(HAVE_SLOGF) # define LOG_CRIT _SLOG_CRITICAL # define LOG_DEBUG _SLOG_DEBUG1 # define LOG_ERR _SLOG_ERROR # define LOG_INFO _SLOG_INFO # define LOG_WARNING _SLOG_WARNING # define syslog(prio, msg,...) slogf(_SLOG_SETCODE(_SLOG_SYSLOG, 0), prio, msg, __VA_ARGS__) # endif static int log_priority = 0; static void gdomap_log (int prio) { if (in_config) { #ifndef __MINGW__ if (geteuid () != getuid ()) { strcpy(ebuf, "problem with config file"); } #endif } if (is_daemon) { #if defined(HAVE_SLOGF) // QNX doesn't like 0 as the prio. It means "shutdown" to them. syslog (prio ? log_priority : prio, "%s", ebuf); # else syslog (log_priority | prio, "%s", ebuf); #endif } else if (prio == LOG_INFO) { write (1, ebuf, strlen (ebuf)); write (1, "\n", 1); } else { write (2, ebuf, strlen (ebuf)); write (2, "\n", 1); } if (prio == LOG_CRIT) { if (is_daemon) { syslog (LOG_CRIT, "%s", "exiting."); } else { fprintf (stderr, "exiting.\n"); fflush (stderr); } exit(EXIT_FAILURE); } } #else #define LOG_CRIT 2 #define LOG_DEBUG 0 #define LOG_ERR 1 #define LOG_INFO 0 #define LOG_WARNING 0 void gdomap_log (int prio) { if (in_config) { #ifndef __MINGW__ if (geteuid () != getuid ()) { strcpy(ebuf, "problem with config file"); } #endif } write (2, ebuf, strlen (ebuf)); write (2, "\n", 1); if (prio == LOG_CRIT) { fprintf (stderr, "exiting.\n"); fflush (stderr); exit(EXIT_FAILURE); } } #endif /* * Structure for linked list of addresses to probe rather than * probing entire network. */ typedef struct plstruct { struct plstruct *next; int direct; struct in_addr addr; } plentry; static plentry *plist = 0; /* * Variables used for determining if a connection is from a process * on the local host. */ static int interfaces = 0; /* Number of interfaces. */ static struct in_addr *addr; /* Address of each interface. */ static unsigned char *bcok; /* Broadcast OK for interface? */ static struct in_addr *bcst; /* Broadcast for interface. */ static struct in_addr *mask; /* Netmask of each interface. */ static int is_local_host(struct in_addr a) { int i; for (i = 0; i < interfaces; i++) { if (a.s_addr == addr[i].s_addr) { return 1; } } return 0; } static int is_probe_host(struct in_addr a) { if (plist) { plentry *p; /* Hosts explicitly configured to be probed are ones we treat * as being part of our LAN and therefore trusted. */ for (p = plist; p != 0; p = p->next) { if (a.s_addr == p->addr.s_addr) { return 1; } } } return 0; } static int is_local_net(struct in_addr a) { int i; for (i = 0; i < interfaces; i++) { if ((mask[i].s_addr & addr[i].s_addr) == (mask[i].s_addr & a.s_addr)) { return 1; } } return 0; } /* * Variables used for handling non-blocking I/O on channels. */ static int tcp_desc = -1; /* Socket for incoming TCP connections. */ static int udp_desc = -1; /* Socket for UDP communications. */ static fd_set read_fds; /* Descriptors which are readable. */ static fd_set write_fds; /* Descriptors which are writable. */ /* Internal info structures. Rewritten Wed Jul 12 14:51:19 2000 by Bjoern Giesler to work on Win32. */ typedef struct { #if defined(__MINGW__) SOCKET s; #else int s; #endif /* __MINGW__ */ struct sockaddr_in addr; /* Address of process making request. */ socklen_t pos; /* Position reading data. */ union { gdo_req r; unsigned char b[GDO_REQ_SIZE]; } buf; } RInfo; /* State of reading each request. */ typedef struct { #if defined(__MINGW__) SOCKET s; #else int s; #endif /* __MINGW__ */ int len; /* Length of data to be written. */ int pos; /* Amount of data already written. */ char* buf; /* Buffer for data. */ } WInfo; static RInfo *_rInfo = NULL; static unsigned _rInfoCapacity = 0; static unsigned _rInfoCount = 0; static WInfo *_wInfo = NULL; static unsigned _wInfoCapacity = 0; static unsigned _wInfoCount = 0; static void #if defined(__MINGW__) delRInfo(SOCKET s) #else delRInfo(int s) #endif /* __MINGW__ */ { unsigned int i; for (i = 0; i < _rInfoCount; i++) { if (_rInfo[i].s == s) { break; } } if (i == _rInfoCount) { snprintf(ebuf, sizeof(ebuf), "%s requested unallocated RInfo struct (socket %ld)", __FUNCTION__, (long int)s); gdomap_log(LOG_ERR); return; } _rInfoCount--; if (i != _rInfoCount) /* not last element */ { memmove(&(_rInfo[i]), &(_rInfo[i+1]), (_rInfoCount-i)*sizeof(RInfo)); } } static RInfo * #if defined(__MINGW__) getRInfo(SOCKET s, int make) #else getRInfo(int s, int make) #endif { unsigned int i; for (i = 0; i < _rInfoCount; i++) { if (_rInfo[i].s == s) { break; } } if (i == _rInfoCount) { if (make) { if (_rInfoCount >= _rInfoCapacity) { RInfo *tmp; _rInfoCapacity = _rInfoCount + 1; tmp = (RInfo *)calloc(_rInfoCapacity, sizeof(RInfo)); if (_rInfoCount > 0) { memcpy(tmp, _rInfo, sizeof(RInfo)*_rInfoCount); free(_rInfo); } _rInfo = tmp; } _rInfoCount++; _rInfo[_rInfoCount-1].s = s; return &(_rInfo[_rInfoCount-1]); } return NULL; } return &(_rInfo[i]); } static void #if defined(__MINGW__) delWInfo(SOCKET s) #else delWInfo(int s) #endif /* __MINGW__ */ { unsigned int i; for (i = 0; i < _wInfoCount; i++) { if (_wInfo[i].s == s) { break; } } if (i == _wInfoCount) { snprintf(ebuf, sizeof(ebuf), "%s requested unallocated WInfo struct (socket %ld)", __FUNCTION__, (long int)s); gdomap_log(LOG_ERR); return; } _wInfoCount--; if (i != _wInfoCount) /* not last element */ { memmove(&(_wInfo[i]), &(_wInfo[i+1]), (_wInfoCount-i)*sizeof(WInfo)); } } static WInfo * #if defined(__MINGW__) getWInfo(SOCKET s, int make) #else getWInfo(int s, int make) #endif { unsigned int i; for (i = 0; i < _wInfoCount; i++) { if (_wInfo[i].s == s) { break; } } if (i == _wInfoCount) { if (make) { if (_wInfoCount >= _wInfoCapacity) { WInfo *tmp; _wInfoCapacity = _wInfoCount + 1; tmp = (WInfo *)calloc(_wInfoCapacity, sizeof(WInfo)); if (_wInfoCount > 0) { memcpy(tmp, _wInfo, sizeof(WInfo)*_wInfoCount); free(_wInfo); } _wInfo = tmp; } _wInfoCount++; _wInfo[_wInfoCount-1].s = s; return &(_wInfo[_wInfoCount-1]); } return NULL; } return &(_wInfo[i]); } static struct u_data { struct sockaddr_in addr; /* Address to send to. */ int pos; /* Number of bytes already sent. */ int len; /* Length of data to send. */ uptr dat; /* Data to be sent. */ struct u_data *next; /* Next message to send. */ } *u_queue = 0; static int udp_pending = 0; /* * Name - queue_msg() * Purpose - Add a message to the queue of those to be sent * on the UDP socket. */ static void queue_msg(struct sockaddr_in* a, uptr d, unsigned l) { struct u_data* entry = (struct u_data*)malloc(sizeof(struct u_data)); memcpy(&entry->addr, a, sizeof(*a)); entry->pos = 0; entry->len = l; entry->dat = malloc(l); memcpy(entry->dat, d, l); entry->next = 0; if (u_queue) { struct u_data* tmp = u_queue; while (tmp->next) { tmp = tmp->next; } tmp->next = entry; } else { u_queue = entry; } udp_pending++; } static void queue_pop() { struct u_data* tmp = u_queue; if (tmp) { u_queue = tmp->next; free(tmp->dat); free(tmp); udp_pending--; } } /* * Primitive mapping stuff. */ typedef struct { uptr name; /* Service name registered. */ unsigned int port; /* Port it was mapped to. */ unsigned short size; /* Number of bytes in name. */ unsigned char net; /* Type of port registered. */ unsigned char svc; /* Type of port registered. */ } map_ent; static int map_used = 0; static int map_size = 0; static map_ent **map = 0; static int compare(uptr n0, int l0, uptr n1, int l1) { if (l0 == l1) { return memcmp(n0, n1, l0); } else if (l0 < l1) { return -1; } return 1; } /* * Name - map_add() * Purpose - Create a new map entry structure and insert it * into the map in the appropriate position. */ static map_ent* map_add(uptr n, unsigned char l, unsigned int p, unsigned char t) { map_ent *m; int i; m = (map_ent*)malloc(sizeof(map_ent)); if (0 == m) { perror("no memory for map entry"); exit(EXIT_FAILURE); } m->port = p; m->name = (unsigned char*)malloc(l); if (0 == m->name) { perror("no memory for map entry name"); exit(EXIT_FAILURE); } m->size = l; m->net = (t & GDO_NET_MASK); m->svc = (t & GDO_SVC_MASK); memcpy(m->name, n, l); if (map_used == map_size) { map_size += 16; if (map) { map = (map_ent**)realloc(map, map_size * sizeof(map_ent*)); } else { map = (map_ent**)calloc(map_size, sizeof(map_ent*)); } if (0 == map) { perror("no memory for map"); exit(EXIT_FAILURE); } } for (i = 0; i < map_used; i++) { if (compare(map[i]->name, map[i]->size, m->name, m->size) > 0) { int j; for (j = map_used; j > i; j--) { map[j] = map[j-1]; } break; } } map[i] = m; map_used++; if (debug > 2) { snprintf(ebuf, sizeof(ebuf), "Added port %d to map for %.*s", m->port, m->size, m->name); gdomap_log(LOG_DEBUG); } return m; } /* * Name - map_by_name() * Purpose - Search the map for an entry for a particular name */ static map_ent* map_by_name(uptr n, int s) { int lower = 0; int upper = map_used; int index; if (debug > 2) { snprintf(ebuf, sizeof(ebuf), "Searching map for %.*s", s, n); gdomap_log(LOG_DEBUG); } for (index = upper/2; upper != lower; index = lower + (upper - lower)/2) { int i = compare(map[index]->name, map[index]->size, n, s); if (i < 0) { lower = index + 1; } else if (i > 0) { upper = index; } else { break; } } if (indexname,map[index]->size,n,s) == 0) { if (debug > 2) { snprintf(ebuf, sizeof(ebuf), "Found port %d for %.*s", map[index]->port, s, n); gdomap_log(LOG_DEBUG); } return map[index]; } if (debug > 2) { snprintf(ebuf, sizeof(ebuf), "Failed to find map entry for %.*s", s, n); gdomap_log(LOG_DEBUG); } return 0; } /* * Name - map_by_port() * Purpose - Search the map for an entry for a particular port */ static map_ent* map_by_port(unsigned p, unsigned char t) { int index; if (debug > 2) { snprintf(ebuf, sizeof(ebuf), "Searching map for %u:%x", p, t); gdomap_log(LOG_DEBUG); } for (index = 0; index < map_used; index++) { map_ent *e = map[index]; if (e->port == p && (e->net | e->svc) == t) { break; } } if (index < map_used) { if (debug > 2) { snprintf(ebuf, sizeof(ebuf), "Found port %d with name %s", map[index]->port, map[index]->name); gdomap_log(LOG_DEBUG); } return map[index]; } if (debug > 2) { snprintf(ebuf, sizeof(ebuf), "Failed to find map entry for %u:%x", p, t); gdomap_log(LOG_DEBUG); } return 0; } /* * Name - map_del() * Purpose - Remove a mapping entry from the map and release * the memory it uses. */ static void map_del(map_ent* e) { int i; if (debug > 2) { snprintf(ebuf, sizeof(ebuf), "Removing port %d from map for %.*s", e->port, e->size, e->name); gdomap_log(LOG_DEBUG); } for (i = 0; i < map_used; i++) { if (map[i] == e) { int j; free(e->name); free(e); for (j = i + 1; j < map_used; j++) { map[j-1] = map[j]; } map_used--; return; } } } /* * Variables and functions for keeping track of the IP addresses of * hosts which are running the name server. */ static uint32_t prb_used = 0; static uint32_t prb_size = 0; typedef struct { struct in_addr sin; time_t when; } prb_type; static prb_type **prb = 0; /* * Name - prb_add() * Purpose - Create a new probe entry in the list. * The new entry is always placed at the end of the list * so that the list remains in the order in which hosts * have been contancted. */ static void prb_add(struct in_addr *p) { prb_type *n = 0; unsigned int i; if (is_local_host(*p) != 0) { return; } if (is_local_net(*p) == 0 && is_probe_host(*p) == 0) { return; } /* * If we already have an entry for this address, remove it from the list * ready for re-insertion in the correct place. */ i = prb_used; while (i-- > 0) { if (memcmp(&prb[i]->sin, p, IASIZE) == 0) { n = prb[i]; prb_used--; while (i++ < prb_used) { prb[i-1] = prb[i]; } break; } } /* * Create a new entry structure if necessary. * Set the current time in the structure, so we know when we last had contact. */ if (0 == n) { n = (prb_type*)calloc(sizeof(prb_type), 1); n->sin = *p; } n->when = time(0); /* * Grow the list if we need more space. */ if (prb_used >= prb_size) { prb_size = prb_used + 16; if (prb) { prb = (prb_type**)realloc(prb, prb_size * sizeof(prb_type*)); } else { prb = (prb_type**)calloc(prb_size * sizeof(prb_type*), 1); } } /* * Append the new item at the end of the list. */ prb[prb_used++] = n; } /* * Name - prb_del() * Purpose - Remove an entry from the list. */ static void prb_del(struct in_addr *p) { unsigned int i = prb_used; while (i-- > 0) { if (memcmp(&prb[i]->sin, p, IASIZE) == 0) { free(prb[i]); prb_used--; while (i++ < prb_used) { prb[i - 1] = prb[i]; } return; } } } /* * Remove any server from which we have had no messages in the last * thirty minutes (as long as we have sent as probe in that time). */ static void prb_tim(time_t when) { int i = prb_used; when -= 1800; while (i-- > 0) { if (noprobe == 0 && prb[i]->when < when && prb[i]->when < last_probe) { prb_del(&prb[i]->sin); } } } /* * Name - clear_chan() * Purpose - Release all resources associated with a channel * and remove it from the list of requests being * serviced. */ static void clear_chan(int desc) { #if defined(__MINGW__) if (desc != INVALID_SOCKET) #else if (desc >= 0 && desc < FD_SETSIZE) #endif { WInfo *wi; FD_CLR(desc, &write_fds); if (desc == tcp_desc || desc == udp_desc) { FD_SET(desc, &read_fds); } else { FD_CLR(desc, &read_fds); #if defined(__MINGW__) closesocket(desc); #else close(desc); #endif } if ((wi = getWInfo(desc, 0)) != 0) { if (wi->buf) { free(wi->buf); wi->buf = 0; } wi->len = 0; wi->pos = 0; } if (!(desc == tcp_desc || desc == udp_desc)) { if (wi != 0) { delWInfo(desc); } delRInfo(desc); } } } static void dump_stats() { int tcp_pending = 0; unsigned int i; for (i = 0; i < _wInfoCount; i++) { if (_wInfo[i].len > 0) { tcp_pending++; } } snprintf(ebuf, sizeof(ebuf), "tcp messages waiting for send - %d", tcp_pending); gdomap_log(LOG_INFO); snprintf(ebuf, sizeof(ebuf), "udp messages waiting for send - %d", udp_pending); gdomap_log(LOG_INFO); snprintf(ebuf, sizeof(ebuf), "size of name-to-port map - %d", map_used); gdomap_log(LOG_INFO); snprintf(ebuf, sizeof(ebuf), "number of known name servers - %"PRIu32, prb_used); gdomap_log(LOG_INFO); snprintf(ebuf, sizeof(ebuf), "TCP %d read, %d sent", tcp_read, tcp_sent); gdomap_log(LOG_INFO); snprintf(ebuf, sizeof(ebuf), "UDP %d read, %d sent", udp_read, udp_sent); gdomap_log(LOG_INFO); } #ifndef __MINGW__ static void dump_tables() { FILE *fptr; soft_int++; if (access(".", W_OK) != 0) { snprintf(ebuf, sizeof(ebuf), "Failed to access gdomap.dump file for output\n"); gdomap_log(LOG_ERR); return; } fptr = fopen("gdomap.dump", "w"); if (fptr != 0) { fprintf(fptr, "\n"); fprintf(fptr, "Known nameserver addresses\n"); fprintf(fptr, "==========================\n"); if (prb_used == 0) { fprintf(fptr, "None.\n"); } else { unsigned int i; for (i = 0; i < prb_used; i++) { fprintf(fptr, "%16s %s\n", inet_ntoa(prb[i]->sin), (const char*)ctime(&prb[i]->when)); } } fprintf(fptr, "\n"); fclose(fptr); } else { snprintf(ebuf, sizeof(ebuf), "Failed to open gdomap.dump file for output\n"); gdomap_log(LOG_ERR); } } #endif /* * Name - init_iface() * Purpose - Build up an array of the IP addresses supported on * the network interfaces of this machine. */ static void init_iface() { #if defined(__MINGW__) INTERFACE_INFO InterfaceList[20]; DWORD nBytesReturned; int i, countActive, nNumInterfaces; SOCKET desc = WSASocket(PF_INET, SOCK_RAW, AF_INET, 0, 0, 0); if (desc == INVALID_SOCKET) { snprintf(ebuf, sizeof(ebuf), "Failed to get a socket. Error %d\n", WSAGetLastError()); gdomap_log(LOG_CRIT); exit(EXIT_FAILURE); } memset((void*)InterfaceList, '\0', sizeof(InterfaceList)); if (WSAIoctl(desc, SIO_GET_INTERFACE_LIST, 0, 0, (void*)InterfaceList, sizeof(InterfaceList), &nBytesReturned, 0, 0) == SOCKET_ERROR) { snprintf(ebuf, sizeof(ebuf), "Failed WSAIoctl. Error %d\n", WSAGetLastError()); gdomap_log(LOG_CRIT); exit(EXIT_FAILURE); } nNumInterfaces = nBytesReturned / sizeof(INTERFACE_INFO); /* * See how many active entries there are. */ countActive = 0; for (i = 0; i < nNumInterfaces; i++) { u_long nFlags = InterfaceList[i].iiFlags; if ((nFlags & IFF_UP) && (InterfaceList[i].iiAddress.Address.sa_family == AF_INET)) { countActive++; } } /* * Allocate enough space for all interfaces. */ if (addr != 0) free(addr); addr = (struct in_addr*)malloc((countActive+1)*IASIZE); if (bcok != 0) free(bcok); bcok = (unsigned char*)malloc((countActive+1)*sizeof(unsigned char)); if (bcst != 0) free(bcst); bcst = (struct in_addr*)malloc((countActive+1)*IASIZE); if (mask != 0) free(mask); mask = (struct in_addr*)malloc((countActive+1)*IASIZE); for (i = 0; i < nNumInterfaces; i++) { u_long nFlags = InterfaceList[i].iiFlags; if ((nFlags & IFF_UP) && (InterfaceList[i].iiAddress.Address.sa_family == AF_INET)) { int broadcast = 0; int pointopoint = 0; int loopback = 0; if (nFlags & IFF_BROADCAST) { broadcast = 1; } if (nFlags & IFF_POINTTOPOINT) { pointopoint = 1; } if (nFlags & IFF_LOOPBACK) { loopback = 1; } addr[interfaces] = ((struct sockaddr_in*) &(InterfaceList[i].iiAddress))->sin_addr; mask[interfaces] = ((struct sockaddr_in*) &(InterfaceList[i].iiNetmask))->sin_addr; bcst[interfaces] = ((struct sockaddr_in*) &(InterfaceList[i].iiBroadcastAddress))->sin_addr; bcok[interfaces] = (broadcast | pointopoint); if (addr[interfaces].s_addr == 0) { addr[interfaces].s_addr = htonl(0x8f000001); fprintf(stderr, "Bad iface addr (0.0.0.0) guess (%s)\n", inet_ntoa(addr[interfaces])); } if (mask[interfaces].s_addr == 0) { mask[interfaces].s_addr = htonl(0xffffff00); fprintf(stderr, "Bad iface mask (0.0.0.0) guess (%s)\n", inet_ntoa(mask[interfaces])); } if (bcst[interfaces].s_addr == 0) { u_long l = ntohl(addr[interfaces].s_addr); bcst[interfaces].s_addr = htonl(l | 0xff); fprintf(stderr, "Bad iface bcst (0.0.0.0) guess (%s)\n", inet_ntoa(bcst[interfaces])); } interfaces++; } } closesocket(desc); #else #if defined(SIOCGIFCONF) struct ifconf ifc; struct ifreq ifreq; void *final; void *ifr_ptr; char buf[MAX_IFACE * sizeof(struct ifreq)]; int desc; if ((desc = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("socket for init_iface"); exit(EXIT_FAILURE); } // QNX seems to disagree about what it means to be SysV r4. #if defined(__svr4__) && !defined(__QNXNTO__) { struct strioctl ioc; ioc.ic_cmd = SIOCGIFCONF; ioc.ic_timout = 0; ioc.ic_len = sizeof(buf); ioc.ic_dp = buf; if (ioctl(desc, I_STR, (char*)&ioc) < 0) { ioc.ic_len = 0; } ifc.ifc_len = ioc.ic_len; ifc.ifc_buf = ioc.ic_dp; } #else ifc.ifc_len = sizeof(buf); ifc.ifc_buf = buf; if (ioctl(desc, SIOCGIFCONF, (char*)&ifc) < 0) { ifc.ifc_len = 0; } #endif /* * Find the IP address of each active network interface. */ if (ifc.ifc_len == 0) { int res = errno; snprintf(ebuf, sizeof(ebuf), "SIOCGIFCONF for init_iface found no active interfaces; %s", lastErr()); gdomap_log(LOG_ERR); if (res == EINVAL) { snprintf(ebuf, sizeof(ebuf), "Either you have too many network interfaces on your machine (in which case\n" "you need to change the 'MAX_IFACE' constant in gdomap.c and rebuild it), or\n" "your system is buggy, and you need to use the '-a' command line flag for\n" "gdomap to manually set the interface addresses and masks to be used.\n" "Try 'gdomap -C' for more information.\n"); gdomap_log(LOG_INFO); } close(desc); exit(EXIT_FAILURE); } /* * We cannot know the number of interfaces in advance, thus we * need to malloc to MAX_IFACE toensure sufficient space */ if (addr != 0) free(addr); addr = (struct in_addr*)malloc((MAX_IFACE+1)*IASIZE); if (bcok != 0) free(bcok); bcok = (unsigned char*)malloc((MAX_IFACE+1)*sizeof(unsigned char)); if (bcst != 0) free(bcst); bcst = (struct in_addr*)malloc((MAX_IFACE+1)*IASIZE); if (mask != 0) free(mask); mask = (struct in_addr*)malloc((MAX_IFACE+1)*IASIZE); final = &ifc.ifc_buf[ifc.ifc_len]; for (ifr_ptr = ifc.ifc_req; ifr_ptr < final;) { ifreq = *(struct ifreq*)ifr_ptr; #if defined(HAVE_SA_LEN) ifr_ptr += sizeof(ifreq) - sizeof(ifreq.ifr_addr) + ROUND(ifreq.ifr_addr.sa_len, sizeof(struct ifreq*)); #else ifr_ptr += sizeof(ifreq); #endif if (ioctl(desc, SIOCGIFFLAGS, (char *)&ifreq) < 0) { snprintf(ebuf, sizeof(ebuf), "SIOCGIFFLAGS: %s", lastErr()); gdomap_log(LOG_ERR); } else if (ifreq.ifr_flags & IFF_UP) { /* interface is up */ int broadcast = 0; int pointopoint = 0; int loopback = 0; if (ifreq.ifr_flags & IFF_BROADCAST) { broadcast = 1; } #if defined(IFF_POINTOPOINT) if (ifreq.ifr_flags & IFF_POINTOPOINT) { pointopoint = 1; } #endif #if defined(IFF_LOOPBACK) if (ifreq.ifr_flags & IFF_LOOPBACK) { loopback = 1; } #endif if (ioctl(desc, SIOCGIFADDR, (char *)&ifreq) < 0) { snprintf(ebuf, sizeof(ebuf), "SIOCGIFADDR: %s", lastErr()); gdomap_log(LOG_ERR); } else if (ifreq.ifr_addr.sa_family == AF_INET) { /* IP interface */ if (interfaces >= MAX_IFACE) { snprintf(ebuf, sizeof(ebuf), "You have too many network interfaces on your machine (in which case you need\n" "to change the 'MAX_IFACE' constant in gdomap.c and rebuild it), or your\n" "system is buggy, and you need to use the '-a' command line flag for\n" "gdomap to manually set the interface addresses and masks to be used.\n" "Try 'gdomap -C' for more information.\n"); gdomap_log(LOG_INFO); close(desc); exit(EXIT_FAILURE); } addr[interfaces] = ((struct sockaddr_in *)&ifreq.ifr_addr)->sin_addr; bcok[interfaces] = (broadcast | pointopoint); #if defined(IFF_POINTOPOINT) if (pointopoint) { if (ioctl(desc, SIOCGIFDSTADDR, (char*)&ifreq) < 0) { snprintf(ebuf, sizeof(ebuf), "SIOCGIFADDR: %s", lastErr()); gdomap_log(LOG_ERR); bcok[interfaces] = 0; } else { bcst[interfaces] = ((struct sockaddr_in *)&ifreq.ifr_dstaddr)->sin_addr; } } else #endif { if (!loopback && ioctl(desc, SIOCGIFBRDADDR, (char*)&ifreq) < 0) { snprintf(ebuf, sizeof(ebuf), "SIOCGIFBRDADDR: %s", lastErr()); gdomap_log(LOG_ERR); bcok[interfaces] = 0; } else { bcst[interfaces] = ((struct sockaddr_in*)&ifreq.ifr_broadaddr)->sin_addr; } } if (ioctl(desc, SIOCGIFNETMASK, (char *)&ifreq) < 0) { snprintf(ebuf, sizeof(ebuf), "SIOCGIFNETMASK: %s", lastErr()); gdomap_log(LOG_ERR); /* * If we can't get a netmask - assume a class-c * network. */ mask[interfaces] = class_c_mask; } else { /* * Some systems don't have ifr_netmask */ #ifdef ifr_netmask mask[interfaces] = ((struct sockaddr_in *)&ifreq.ifr_netmask)->sin_addr; #else mask[interfaces] = ((struct sockaddr_in *)&ifreq.ifr_addr)->sin_addr; #endif } interfaces++; } } } close(desc); #endif /* SIOCGIFCONF */ #endif /* MINGW */ if (interfaces == 0) { snprintf(ebuf, sizeof(ebuf), "I can't find any network interfaces on this platform - " "use the '-a' flag to load interface details from a file instead.\n" "Try 'gdomap -C' for more information.\n"); gdomap_log(LOG_CRIT); exit(EXIT_FAILURE); } } /* * Name - load_iface() * Purpose - Read addresses and netmasks for interfaces on this * machine from a file. */ static void load_iface(const char* from) { FILE *fptr; char buf[128]; int line = 0; int num_iface = 0; in_config = 1; /* Can we open the fiel with current privs */ fptr = fopen(from, "rt"); if (fptr == 0) { snprintf(ebuf, sizeof(ebuf), "Unable to open address config - '%s'", from); gdomap_log(LOG_CRIT); exit(EXIT_FAILURE); } /* Should we be opening it? */ if (access(from, R_OK) != 0) { fclose(fptr); snprintf(ebuf, sizeof(ebuf), "Unable to access address config - '%s'", from); gdomap_log(LOG_CRIT); exit(EXIT_FAILURE); } while (fgets(buf, sizeof(buf), fptr) != 0) { char *ptr = buf; line++; /* * Strip leading white space. */ while (isspace(*ptr)) { ptr++; } if (ptr != buf) { memmove(buf, ptr, strlen(ptr) + 1); } /* * Strip comments. */ ptr = strchr(buf, '#'); if (ptr) { *ptr = '\0'; } /* * Strip trailing white space. */ ptr = buf; while (*ptr) { ptr++; } while (ptr > buf && isspace(ptr[-1])) { ptr--; } *ptr = '\0'; /* * Ignore blank lines. */ if (*buf == '\0') { continue; } if (num_iface++ > 1000) { snprintf(ebuf, sizeof(ebuf), "Too many network interfaces found"); gdomap_log(LOG_CRIT); exit(EXIT_FAILURE); } } fseek(fptr, 0, 0); if (num_iface == 0) { snprintf(ebuf, sizeof(ebuf), "No network interfaces found"); gdomap_log(LOG_CRIT); exit(EXIT_FAILURE); } num_iface++; addr = (struct in_addr*)malloc((num_iface+1)*IASIZE); mask = (struct in_addr*)malloc((num_iface+1)*IASIZE); bcok = (unsigned char*)malloc((num_iface+1)*sizeof(unsigned char)); bcst = (struct in_addr*)malloc((num_iface+1)*IASIZE); addr[interfaces].s_addr = inet_addr("127.0.0.1"); mask[interfaces].s_addr = inet_addr("255.255.255.0"); bcok[interfaces] = 0; bcst[interfaces].s_addr = inet_addr("127.0.0.255"); interfaces++; while (fgets(buf, sizeof(buf), fptr) != 0) { char *ptr = buf; char *msk; line++; /* * Strip leading white space. */ while (isspace(*ptr)) { ptr++; } if (ptr != buf) { memmove(buf, ptr, strlen(ptr) + 1); } /* * Strip comments. */ ptr = strchr(buf, '#'); if (ptr) { *ptr = '\0'; } /* * Strip trailing white space. */ ptr = buf; while (*ptr) { ptr++; } while (ptr > buf && isspace(ptr[-1])) { ptr--; } *ptr = '\0'; /* * Ignore blank lines. */ if (*buf == '\0') { continue; } ptr = buf; while (*ptr && (isdigit(*ptr) || (*ptr == '.'))) { ptr++; } while (isspace(*ptr)) { *ptr++ = '\0'; } msk = ptr; while (*ptr && (isdigit(*ptr) || (*ptr == '.'))) { ptr++; } while (isspace(*ptr)) { *ptr++ = '\0'; } addr[interfaces].s_addr = inet_addr(buf); mask[interfaces].s_addr = inet_addr(msk); if (isdigit(*ptr)) { bcok[interfaces] = 1; bcst[interfaces].s_addr = inet_addr(ptr); } else { bcok[interfaces] = 0; bcst[interfaces].s_addr = inet_addr("0.0.0.0"); } if (addr[interfaces].s_addr == (uint32_t)-1) { snprintf(ebuf, sizeof(ebuf), "line %d of '%s' bad address (%s)", line, from, buf); gdomap_log(LOG_CRIT); exit(EXIT_FAILURE); } else if (mask[interfaces].s_addr == (uint32_t)-1) { snprintf(ebuf, sizeof(ebuf), "line %d of '%s' bad netmask (%s)", line, from, ptr); gdomap_log(LOG_CRIT); exit(EXIT_FAILURE); } else { interfaces++; } } fclose(fptr); in_config = 0; } /* * Name - init_my_port() * Purpose - Establish our well-known port (my_port). */ static void init_my_port() { /* * First we determine the port for the 'gdomap' service - ideally * this should be the default port, since we should have registered * this with the appropriate authority and have it reserved for us. */ #if defined(GDOMAP_PORT_OVERRIDE) my_port = htons(GDOMAP_PORT_OVERRIDE); #else struct servent *sp; my_port = htons(GDOMAP_PORT); if ((sp = getservbyname("gdomap", "tcp")) == 0) { if (debug) { snprintf(ebuf, sizeof(ebuf), "Unable to find service 'gdomap'"); gdomap_log(LOG_WARNING); snprintf(ebuf, sizeof(ebuf), "On a unix host it should be in /etc/services " "as 'gdomap %d/tcp' and 'gdomap %d/udp'\n", GDOMAP_PORT, GDOMAP_PORT); gdomap_log(LOG_INFO); } } else { unsigned short tcp_port = sp->s_port; if ((sp = getservbyname("gdomap", "udp")) == 0) { if (debug) { snprintf(ebuf, sizeof(ebuf), "Unable to find service 'gdomap'"); snprintf(ebuf, sizeof(ebuf), "On a unix host it should be in /etc/services " "as 'gdomap %d/tcp' and 'gdomap %d/udp'\n", GDOMAP_PORT, GDOMAP_PORT); gdomap_log(LOG_INFO); } } else if (sp->s_port != tcp_port) { snprintf(ebuf, sizeof(ebuf), "UDP and TCP service entries differ. " "Using the TCP entry for both!"); gdomap_log(LOG_WARNING); } if (tcp_port != my_port) { snprintf(ebuf, sizeof(ebuf), "gdomap not running on normal port"); gdomap_log(LOG_WARNING); } my_port = tcp_port; } #endif } /* * Name - init_ports() * Purpose - Set up the ports for accepting incoming requests. */ static void init_ports() { int r; struct sockaddr_in sa; #if defined(__MINGW__) DWORD dummy; #endif /* __MINGW__ */ /* * Now we set up the sockets to accept incoming connections and set * options on it so that if this program is killed, we can restart * immediately and not find the socket addresses hung. */ udp_desc = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); #if defined(__MINGW__) if (udp_desc == INVALID_SOCKET) #else if (udp_desc < 0) #endif { snprintf(ebuf, sizeof(ebuf), "Unable to create UDP socket"); gdomap_log(LOG_CRIT); exit(EXIT_FAILURE); } else if (debug) { snprintf(ebuf, sizeof(ebuf), "Opened UDP socket %d", udp_desc); gdomap_log(LOG_DEBUG); } #if 0 && defined(SO_EXCLUSIVEADDRUSE) r = 1; if ((setsockopt(udp_desc,SOL_SOCKET,SO_REUSEADDR,(char*)&r,sizeof(r)))<0) { snprintf(ebuf, sizeof(ebuf), "Unable to set 're-use' on UDP socket"); gdomap_log(LOG_WARNING); } r = 1; if ((setsockopt (udp_desc,SOL_SOCKET,SO_EXCLUSIVEADDRUSE,(char*)&r,sizeof(r)))<0) { snprintf(ebuf, sizeof(ebuf), "Unable to set 'exclusive-use' on UDP socket"); gdomap_log(LOG_WARNING); } #endif #ifndef BROKEN_SO_REUSEADDR /* * Under decent systems, SO_REUSEADDR means that the port can be reused * immediately that this process exits. Under some it means * that multiple processes can serve the same port simultaneously. * We don't want that broken behavior! */ r = 1; if ((setsockopt(udp_desc,SOL_SOCKET,SO_REUSEADDR,(char*)&r,sizeof(r)))<0) { snprintf(ebuf, sizeof(ebuf), "Unable to set 're-use' on UDP socket"); gdomap_log(LOG_WARNING); } #endif if (nobcst == 0) { r = 1; if ((setsockopt(udp_desc,SOL_SOCKET,SO_BROADCAST,(char*)&r,sizeof(r)))<0) { nobcst++; snprintf(ebuf, sizeof(ebuf), "Unable to use 'broadcast' for probes"); gdomap_log(LOG_WARNING); } } #if defined(__MINGW__) dummy = 1; if (ioctlsocket(udp_desc, FIONBIO, &dummy) < 0) { snprintf(ebuf, sizeof(ebuf), "Unable to handle UDP socket non-blocking"); gdomap_log(LOG_CRIT); exit(EXIT_FAILURE); } #else /* !__MINGW__ */ if ((r = fcntl(udp_desc, F_GETFL, 0)) >= 0) { r |= NBLK_OPT; if (fcntl(udp_desc, F_SETFL, r) < 0) { snprintf(ebuf, sizeof(ebuf), "Unable to set UDP socket non-blocking"); gdomap_log(LOG_CRIT); exit(EXIT_FAILURE); } } else { snprintf(ebuf, sizeof(ebuf), "Unable to handle UDP socket non-blocking"); gdomap_log(LOG_CRIT); exit(EXIT_FAILURE); } #endif /* * Now we bind our address to the socket and prepare to accept incoming * connections by listening on it. */ memset(&sa, '\0', sizeof(sa)); sa.sin_family = AF_INET; sa.sin_addr.s_addr = htonl(INADDR_ANY); sa.sin_port = my_port; if (bind(udp_desc, (void*)&sa, sizeof(sa)) < 0) { snprintf(ebuf, sizeof(ebuf), "Unable to bind address to UDP socket. Perhaps gdomap is already running"); gdomap_log(LOG_ERR); if (errno == EACCES) { snprintf(ebuf, sizeof(ebuf), "You probably need to run gdomap as root/system administrator (recommended),\n" "or run the nameserver on a non-standard port that does not require root\n" "privilege (poor option and last resort!!!)"); gdomap_log(LOG_INFO); } exit(EXIT_FAILURE); } /* * Now we do the TCP socket. */ tcp_desc = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); #if defined(__MINGW__) if (tcp_desc == INVALID_SOCKET) #else if (tcp_desc < 0) #endif { snprintf(ebuf, sizeof(ebuf), "Unable to create TCP socket"); gdomap_log(LOG_CRIT); exit(EXIT_FAILURE); } else if (debug) { snprintf(ebuf, sizeof(ebuf), "Opened TDP socket %d", tcp_desc); gdomap_log(LOG_DEBUG); } #if 0 && defined(SO_EXCLUSIVEADDRUSE) r = 1; if ((setsockopt(tcp_desc,SOL_SOCKET,SO_REUSEADDR,(char*)&r,sizeof(r)))<0) { snprintf(ebuf, sizeof(ebuf), "Unable to set 're-use' on TCP socket"); gdomap_log(LOG_WARNING); } r = 1; if ((setsockopt (tcp_desc,SOL_SOCKET,SO_EXCLUSIVEADDRUSE,(char*)&r,sizeof(r)))<0) { snprintf(ebuf, sizeof(ebuf), "Unable to set 'exclusive-use' on TCP socket"); gdomap_log(LOG_WARNING); } #endif #ifndef BROKEN_SO_REUSEADDR /* * Under decent systems, SO_REUSEADDR means that the port can be reused * immediately that this process exits. Under some it means * that multiple processes can serve the same port simultaneously. * We don't want that broken behavior! */ r = 1; if ((setsockopt(tcp_desc,SOL_SOCKET,SO_REUSEADDR,(char*)&r,sizeof(r)))<0) { snprintf(ebuf, sizeof(ebuf), "Unable to set 're-use' on TCP socket"); gdomap_log(LOG_WARNING); } #endif #if defined(__MINGW__) dummy = 1; if (ioctlsocket(tcp_desc, FIONBIO, &dummy) < 0) { snprintf(ebuf, sizeof(ebuf), "Unable to handle TCP socket non-blocking"); gdomap_log(LOG_CRIT); exit(EXIT_FAILURE); } #else /* !__MINGW__ */ if ((r = fcntl(tcp_desc, F_GETFL, 0)) >= 0) { r |= NBLK_OPT; if (fcntl(tcp_desc, F_SETFL, r) < 0) { snprintf(ebuf, sizeof(ebuf), "Unable to set TCP socket non-blocking"); gdomap_log(LOG_CRIT); exit(EXIT_FAILURE); } } else { snprintf(ebuf, sizeof(ebuf), "Unable to handle TCP socket non-blocking"); gdomap_log(LOG_CRIT); exit(EXIT_FAILURE); } #endif /* __MINGW__ */ memset(&sa, '\0', sizeof(sa)); sa.sin_family = AF_INET; sa.sin_addr.s_addr = htonl(INADDR_ANY); sa.sin_port = my_port; if (bind(tcp_desc, (void*)&sa, sizeof(sa)) < 0) { snprintf(ebuf, sizeof(ebuf), "Unable to bind address to TCP socket. Perhaps gdomap is already running"); gdomap_log(LOG_ERR); if (errno == EACCES) { snprintf(ebuf, sizeof(ebuf), "You probably need to run gdomap as root/system administrator (recommended),\n" "or run the nameserver on a non-standard port that does not require root\n" "privilege (poor option and last resort!!!)"); gdomap_log(LOG_INFO); } exit(EXIT_FAILURE); } if (listen(tcp_desc, QUEBACKLOG) < 0) { snprintf(ebuf, sizeof(ebuf), "Unable to listen for connections on TCP socket"); gdomap_log(LOG_CRIT); exit(EXIT_FAILURE); } /* * Set up masks to say we are interested in these descriptors. */ memset(&read_fds, '\0', sizeof(read_fds)); memset(&write_fds, '\0', sizeof(write_fds)); getRInfo(tcp_desc, 1); getRInfo(udp_desc, 1); FD_SET(tcp_desc, &read_fds); FD_SET(udp_desc, &read_fds); #ifndef __MINGW__ /* * Turn off pipe signals so we don't get interrupted if we attempt * to write a response to a process which has died. */ signal(SIGPIPE, SIG_IGN); /* * Enable table dumping to /tmp/gdomap.dump */ signal(SIGUSR1, dump_tables); #endif /* !__MINGW__ */ } static int other_addresses_on_net(struct in_addr old, struct in_addr **extra) { int numExtra = 0; int iface; for (iface = 0; iface < interfaces; iface++) { if (addr[iface].s_addr == old.s_addr) { continue; } if ((addr[iface].s_addr & mask[iface].s_addr) == (old.s_addr & mask[iface].s_addr)) { numExtra++; } } if (numExtra > 0) { struct in_addr *addrs; addrs = (struct in_addr*)malloc(sizeof(struct in_addr)*numExtra); *extra = addrs; numExtra = 0; for (iface = 0; iface < interfaces; iface++) { if (addr[iface].s_addr == old.s_addr) { continue; } if ((addr[iface].s_addr & mask[iface].s_addr) == (old.s_addr & mask[iface].s_addr)) { addrs[numExtra].s_addr = addr[iface].s_addr; numExtra++; } } } return numExtra; } /* * Name - init_probe() * Purpose - Send a request to all hosts on the local network * to see if there is a name server running on them. */ static void init_probe() { uint32_t nlist[interfaces]; int nlist_size = 0; int iface; int i; if (noprobe > 0) { return; } if (debug > 2) { snprintf(ebuf, sizeof(ebuf), "Initiating probe requests."); gdomap_log(LOG_DEBUG); } /* * Make a list of the different networks to which we must send. */ for (iface = 0; iface < interfaces; iface++) { uint32_t net = (addr[iface].s_addr & mask[iface].s_addr); if (addr[iface].s_addr == loopback.s_addr) { continue; /* Skip loopback */ } for (i = 0; i < nlist_size; i++) { if (net == nlist[i]) { break; } } if (i == nlist_size) { nlist[i] = net; nlist_size++; } } for (i = 0; i < nlist_size; i++) { int broadcast = 0; int elen = 0; struct in_addr *other = 0; struct in_addr sin = { 0 }; int high = 0; int low = 0; uint32_t net = 0; int j; struct in_addr b; /* * Build up a list of addresses that we serve on this network. */ for (iface = 0; iface < interfaces; iface++) { if ((addr[iface].s_addr & mask[iface].s_addr) == nlist[i]) { sin = addr[iface]; if (bcok[iface]) { /* * Simple broadcast for this address. */ b.s_addr = bcst[iface].s_addr; broadcast = 1; } else { uint32_t ha; /* full host address. */ uint32_t hm; /* full netmask. */ ha = ntohl(addr[iface].s_addr); hm = ntohl(mask[iface].s_addr); /* * Make sure that our netmasks are restricted * to class-c networks and subnets of those * networks - we don't want to be probing * more than a couple of hundred hosts! */ if ((mask[iface].s_addr | class_c_mask.s_addr) != mask[iface].s_addr) { snprintf(ebuf, sizeof(ebuf), "netmask %s will be " "treated as 255.255.255.0 for ", inet_ntoa(mask[iface])); strncat(ebuf, inet_ntoa(addr[iface]), sizeof(ebuf) - strlen(ebuf) - 1); gdomap_log(LOG_WARNING); hm |= ~255; } net = ha & hm & ~255; /* class-c net number. */ low = ha & hm & 255; /* low end of subnet. */ high = low | (255 & ~hm); /* high end of subnet. */ elen = other_addresses_on_net(sin, &other); } break; } } if (plist) { plentry *p; /* * Now start probes for servers on machines in our probe config * list for which we have a direct connection. */ for (p = plist; p != 0; p = p->next) { if ((p->addr.s_addr & mask[iface].s_addr) == (addr[iface].s_addr & mask[iface].s_addr)) { unsigned int len = elen; p->direct = 1; /* Kick off probe. */ if (is_local_host(p->addr)) { continue; /* Don't probe self. */ } while (len > MAX_EXTRA) { len -= MAX_EXTRA; queue_probe(&p->addr, &sin, MAX_EXTRA, &other[len], 0); } queue_probe(&p->addr, &sin, len, other, 0); } } } else if (broadcast) { /* * Now broadcast probe on this network. */ queue_probe(&b, &sin, 0, 0, 0); } else { /* * Now start probes for servers on machines which may be on * any network for which we have an interface. * * Assume 'low' and 'high' are not valid host addresses as 'low' * is the network address and 'high' is the broadcast address. */ for (j = low + 1; j < high; j++) { struct in_addr a; unsigned int len = elen; a.s_addr = htonl(net + j); if (is_local_host(a)) { continue; /* Don't probe self - that's silly. */ } /* Kick off probe. */ while (len > MAX_EXTRA) { len -= MAX_EXTRA; queue_probe(&a, &sin, MAX_EXTRA, &other[len], 0); } queue_probe(&a, &sin, len, other, 0); } } if (other != NULL) { free(other); } } if (plist) { plentry *p; int indirect = 0; /* * Are there any hosts for which we do not have a direct * network connection, and to which we have therefore not * queued a probe? */ for (p = plist; p != 0; p = p->next) { if (p->direct == 0) { indirect = 1; } } if (indirect) { struct in_addr *other = 0; int elen; /* * Queue probes for indirect connections to hosts from our * primary interface and let the routing system handle it. */ elen = other_addresses_on_net(addr[0], &other); for (p = plist; p != 0; p = p->next) { if (p->direct == 0) { unsigned int len = elen; if (is_local_host(p->addr)) { continue; /* Don't probe self. */ } /* Kick off probe. */ while (len > MAX_EXTRA) { len -= MAX_EXTRA; queue_probe(&p->addr, addr, MAX_EXTRA, &other[len], 0); } queue_probe(&p->addr, addr, len, other, 0); } } if (0 != other) { free(other); } } } if (debug > 2) { snprintf(ebuf, sizeof(ebuf), "Probe requests initiated."); gdomap_log(LOG_DEBUG); } last_probe = time(0); } /* * Name - handle_accept() * Purpose - Handle an incoming connection, setting up resources * for the request. Ensure that the channel is in * non-blocking mode so that we can't hang. */ static void handle_accept() { struct sockaddr_in sa; socklen_t len = sizeof(sa); int desc; memset(&sa, '\0', len); desc = accept(tcp_desc, (void*)&sa, &len); if (desc >= 0) { RInfo *ri; #if defined(__MINGW__) DWORD dummy = 1; #else int r; #endif /* !__MINGW__ */ FD_SET(desc, &read_fds); ri = getRInfo(desc, 1); ri->pos = 0; memcpy((char*)&ri->addr, (char*)&sa, sizeof(sa)); if (debug) { snprintf(ebuf, sizeof(ebuf), "accept from %s(%d) to chan %d", inet_ntoa(sa.sin_addr), ntohs(sa.sin_port), desc); gdomap_log(LOG_DEBUG); } /* * Ensure that the connection is non-blocking. */ #if defined(__MINGW__) if (ioctlsocket(desc, FIONBIO, &dummy) < 0) { if (debug) { snprintf(ebuf, sizeof(ebuf), "failed to set chan %d non-blocking", desc); gdomap_log(LOG_DEBUG); } clear_chan(desc); } #else /* !__MINGW__ */ if ((r = fcntl(desc, F_GETFL, 0)) >= 0) { r |= NBLK_OPT; if (fcntl(desc, F_SETFL, r) < 0) { if (debug) { snprintf(ebuf, sizeof(ebuf), "failed to set chan %d non-blocking", desc); gdomap_log(LOG_DEBUG); } clear_chan(desc); } } else { if (debug) { snprintf(ebuf, sizeof(ebuf), "failed to set chan %d non-blocking", desc); gdomap_log(LOG_DEBUG); } clear_chan(desc); } #endif /* __MINGW__ */ } else if (debug) { snprintf(ebuf, sizeof(ebuf), "accept failed - errno %d", #if defined(__MINGW__) WSAGetLastError()); #else errno); #endif /* __MINGW__ */ gdomap_log(LOG_DEBUG); } } /* * Name - handle_io() * Purpose - Main loop to handle I/O on multiple simultaneous * connections. All non-blocking stuff. */ static void handle_io() { struct timeval timeout; void *to; int rval = 0; int i; fd_set rfds; fd_set wfds; while (rval >= 0) { rfds = read_fds; wfds = write_fds; to = 0; /* * If there is anything waiting to be sent on the UDP socket * we must check to see if it is writable. */ if (u_queue != 0) { FD_SET(udp_desc, &wfds); } timeout.tv_sec = 10; timeout.tv_usec = 0; to = &timeout; soft_int = 0; rval = select(FD_SETSIZE, &rfds, &wfds, 0, to); if (rval < 0) { /* * Let's handle any error return. */ if (errno == EBADF) { fd_set efds; /* * Almost certainly lost a connection - try each * descriptor in turn to see which one it is. * Remove descriptor from bitmask and close it. * If the error is on the listener socket we die. */ memset(&efds, '\0', sizeof(efds)); for (i = 0; i < FD_SETSIZE; i++) { if (FD_ISSET(i, &rfds) || FD_ISSET(i, &wfds)) { FD_SET(i, &efds); timeout.tv_sec = 0; timeout.tv_usec = 0; to = &timeout; rval = select(FD_SETSIZE, &efds, 0, 0, to); FD_CLR(i, &efds); if (rval < 0 && errno == EBADF) { clear_chan(i); if (i == tcp_desc || i == udp_desc) { snprintf(ebuf, sizeof(ebuf), "Fatal error on socket."); gdomap_log(LOG_CRIT); exit(EXIT_FAILURE); } } } } rval = 0; } else if (soft_int > 0) { /* * We were interrupted - but it was one we were expecting. */ rval = 0; } else if (errno == EINTR) { rval = 0; } else { snprintf(ebuf, sizeof(ebuf), "Interrupted in select: %s",strerror(errno)); gdomap_log(LOG_CRIT); exit(EXIT_FAILURE); } } else if (rval == 0) { long now = time(0); /* * Let's handle a timeout. */ prb_tim(now); /* Remove dead servers */ if (udp_pending == 0 && (now - last_probe) >= interval) { /* * If there is no output pending on the udp channel and * it is at least five minutes since we sent out a probe * we can re-probe the network for other name servers. */ init_probe(); } } else { /* * Got some descriptor activity - deal with it. */ #if defined(__MINGW__) /* read file descriptors */ for (i = 0; i < rfds.fd_count; i++) { if (rfds.fd_array[i] == tcp_desc) { handle_accept(); } else if (rfds.fd_array[i] == udp_desc) { handle_recv(); } else { handle_read(rfds.fd_array[i]); } if (debug > 2) { dump_stats(); } } for (i = 0; i < wfds.fd_count; i++) { if (wfds.fd_array[i] == udp_desc) { handle_send(); } else { handle_write(wfds.fd_array[i]); } } #else /* !__MINGW__ */ for (i = 0; i < FD_SETSIZE; i++) { if (FD_ISSET(i, &rfds)) { if (i == tcp_desc) { handle_accept(); } else if (i == udp_desc) { handle_recv(); } else { handle_read(i); } if (debug > 2) { dump_stats(); } } /* Look for a descriptor found to be writeable and which * was not closed (due to reading eof etc) */ if (FD_ISSET(i, &wfds) && (FD_ISSET(i, &write_fds) || i == udp_desc)) { if (i == udp_desc) { handle_send(); } else { handle_write(i); } } } #endif /* __MINGW__ */ } } } /* * Name - handle_read() * Purpose - Read a request from a channel. This may be called in * many stages if the read is blocking. */ static void handle_read(int desc) { RInfo *ri; uptr ptr; int nothingRead = 1; int done = 0; int r; ri = getRInfo(desc, 0); if (0 == ri) { snprintf(ebuf, sizeof(ebuf), "request not found on descriptor %d", desc); gdomap_log(LOG_DEBUG); return; } ptr = ri->buf.b; while (ri->pos < GDO_REQ_SIZE && done == 0) { #if defined(__MINGW__) r = recv(desc, (char *)&ptr[ri->pos], GDO_REQ_SIZE - ri->pos, 0); #else r = read(desc, &ptr[ri->pos], GDO_REQ_SIZE - ri->pos); #endif if (r > 0) { nothingRead = 0; ri->pos += r; } else { done = 1; } } if (ri->pos == GDO_REQ_SIZE) { tcp_read++; handle_request(desc); } #if defined(__MINGW__) else if (WSAGetLastError() != WSAEWOULDBLOCK || nothingRead == 1) #else else if (errno != EWOULDBLOCK || nothingRead == 1) #endif { /* * If there is an error or end-of-file on the descriptor then * we must close it down. */ clear_chan(desc); } } /* * Name - handle_recv() * Purpose - Read a request from the UDP socket. */ static void handle_recv() { RInfo *ri; uptr ptr; struct sockaddr_in* addr; socklen_t len = sizeof(struct sockaddr_in); int r; ri = getRInfo(udp_desc, 0); if (0 == ri) { snprintf(ebuf, sizeof(ebuf), "request not found on descriptor %d", udp_desc); gdomap_log(LOG_DEBUG); return; } addr = &(ri->addr); ptr = ri->buf.b; r = recvfrom(udp_desc, (char *)ptr, GDO_REQ_SIZE, 0, (void*)addr, &len); if (r == GDO_REQ_SIZE) { udp_read++; ri->pos = GDO_REQ_SIZE; if (debug) { snprintf(ebuf, sizeof(ebuf), "recvfrom %s", inet_ntoa(addr->sin_addr)); gdomap_log(LOG_DEBUG); } if (is_local_host(addr->sin_addr) == 1) { if (debug) { snprintf(ebuf, sizeof(ebuf), "recvfrom packet from self discarded"); gdomap_log(LOG_DEBUG); } return; } handle_request(udp_desc); } else { if (debug) { snprintf(ebuf, sizeof(ebuf), "recvfrom returned %d - %s", r, lastErr()); gdomap_log(LOG_DEBUG); } } } /* * Name - handle_request() * Purpose - Once we have read a full request, we come here * to take action depending on the request type. */ static void handle_request(int desc) { RInfo *ri; WInfo *wi; unsigned char type; unsigned char size; unsigned char ptype; uint32_t port; unsigned char *buf; map_ent *m; ri = getRInfo(desc, 0); if (0 == ri) { snprintf(ebuf, sizeof(ebuf), "request not found on descriptor %d", desc); gdomap_log(LOG_DEBUG); return; } type = ri->buf.r.rtype; size = ri->buf.r.nsize; ptype = ri->buf.r.ptype; port = ntohl(ri->buf.r.port); buf = (unsigned char*)ri->buf.r.name; FD_CLR(desc, &read_fds); FD_SET(desc, &write_fds); if (debug > 1) { if (desc == udp_desc) { snprintf(ebuf, sizeof(ebuf), "request type '%c' on UDP chan", type); gdomap_log(LOG_DEBUG); } else { snprintf(ebuf, sizeof(ebuf), "request type '%c' from chan %d", type, desc); gdomap_log(LOG_DEBUG); } if (type == GDO_PROBE || type == GDO_PREPLY || type == GDO_SERVERS || type == GDO_NAMES) { /* fprintf(stderr, "\n"); */ } else { snprintf(ebuf, sizeof(ebuf), " name: '%.*s' port: %"PRIu32, size, buf, port); gdomap_log(LOG_DEBUG); } } wi = getWInfo(desc, 1); wi->pos = 0; if (ptype != GDO_TCP_GDO && ptype != GDO_TCP_FOREIGN && ptype != GDO_UDP_GDO && ptype != GDO_UDP_FOREIGN) { if (ptype != 0 || (type != GDO_PROBE && type != GDO_PREPLY && type != GDO_SERVERS && type != GDO_NAMES)) { if (debug) { snprintf(ebuf, sizeof(ebuf), "Illegal port type in request"); gdomap_log(LOG_DEBUG); } clear_chan(desc); return; } } /* * The default return value is a four byte number set to zero. * We assume that malloc returns data aligned on a 4 byte boundary. */ wi->len = 4; wi->buf = (char*)malloc(4); wi->buf[0] = 0; wi->buf[1] = 0; wi->buf[2] = 0; wi->buf[3] = 0; if (type == GDO_REGISTER) { /* * See if this is a request from a local process. */ if (is_local_host(ri->addr.sin_addr) == 0) { snprintf(ebuf, sizeof(ebuf), "Illegal attempt to register!"); gdomap_log(LOG_ERR); clear_chan(desc); /* Only local progs may register. */ return; } /* * What should we do if we already have the name registered? * Simple algorithm - * We check to see if we can bind to the old port, * and if we can we assume that the original process * has gone away and permit a new registration for the * same name. * This is not foolproof - if the machine has more * than one IP address, we could bind to the port on * one address even though the server is using it on * another. * Also - the operating system is not guaranteed to * let us bind to the port if another process has only * recently stopped using it. * Also - what if an old server used the port that the * new one is using? In this case the registration * attempt will be refused even though it shouldn't be! * On the other hand - the occasional registration * failure MUST be better than permitting a process to * grab a name already in use! If a server fails to * register a name/port combination, it can always be * coded to retry on a different port. */ m = map_by_name(buf, size); if (m != 0 && port == m->port) { /* * Special case - we already have this name registered for this * port - so everything is already ok. */ if (debug) { snprintf(ebuf, sizeof(ebuf), "Already registered ... success"); gdomap_log(LOG_DEBUG); } *(uint32_t*)wi->buf = htonl(port); } else if (m != 0) { int sock = -1; if ((ptype & GDO_NET_MASK) == GDO_NET_TCP) { sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); } else if ((ptype & GDO_NET_MASK) == GDO_NET_UDP) { sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); } if (sock < 0) { perror("unable to create new socket"); } else { #ifndef BROKEN_SO_REUSEADDR int r = 1; /* * Under decent systems, SO_REUSEADDR means that the port can * be reused immediately that this process exits. Under some * it means that multiple processes can serve the same port * simultaneously. * We don't want that broken behavior! */ if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*)&r, sizeof(r)) < 0) { perror("unable to set socket options"); } else #endif { struct sockaddr_in sa; int result; short p = m->port; memset(&sa, '\0', sizeof(sa)); sa.sin_family = AF_INET; sa.sin_addr.s_addr = htonl(INADDR_ANY); sa.sin_port = htons(p); result = bind(sock, (void*)&sa, sizeof(sa)); if (result == 0) { if (debug > 1) { snprintf(ebuf, sizeof(ebuf), "re-register from %d to %"PRIu32, m->port, port); gdomap_log(LOG_DEBUG); } m->port = port; m->net = (ptype & GDO_NET_MASK); m->svc = (ptype & GDO_SVC_MASK); port = htonl(m->port); *(uint32_t*)wi->buf = port; } } #if defined(__MINGW__) /* closesocket(sock); */ #else close(sock); #endif } } else if (port == 0) { /* Port not provided! */ if (debug) { snprintf(ebuf, sizeof(ebuf), "Port not provided in request!"); gdomap_log(LOG_DEBUG); } *(uint32_t*)wi->buf = 0; } else { /* Use port provided in request. */ if (debug) { snprintf(ebuf, sizeof(ebuf), "Registered on port %"PRIu32, port); gdomap_log(LOG_DEBUG); } m = map_add(buf, size, port, ptype); port = htonl(m->port); *(uint32_t*)wi->buf = port; } } else if (type == GDO_LOOKUP) { m = map_by_name(buf, size); if (m != 0 && (m->net | m->svc) != ptype) { if (debug > 1) { snprintf(ebuf, sizeof(ebuf), "requested service is of wrong type"); gdomap_log(LOG_DEBUG); } m = 0; /* Name exists but is of wrong type. */ } if (m) { int sock = -1; /* * We check to see if we can bind to the old port, and if we can * we assume that the process has gone away and remove it from * the map. * This is not foolproof - if the machine has more * than one IP address, we could bind to the port on * one address even though the server is using it on * another. */ if ((ptype & GDO_NET_MASK) == GDO_NET_TCP) { sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); } else if ((ptype & GDO_NET_MASK) == GDO_NET_UDP) { sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); } if (sock < 0) { perror("unable to create new socket"); } else { #ifndef BROKEN_SO_REUSEADDR int r = 1; /* * Under decent systems, SO_REUSEADDR means that the port can * be reused immediately that this process exits. Under some * it means that multiple processes can serve the same port * simultaneously. * We don't want that broken behavior! */ if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*)&r, sizeof(r)) < 0) { perror("unable to set socket options"); } else #endif { struct sockaddr_in sa; int result; unsigned short p = (unsigned short)m->port; memset(&sa, '\0', sizeof(sa)); sa.sin_family = AF_INET; #if defined(__MINGW__) /* COMMENT: (3 Nov 2004 by Wim Oudshoorn): The comment below might be true. But using addr[0].s_addr has on windows 2003 server (and some other versions of windows.) exactly the same sympton as it tries to avoid. The funny thing is that the original line, just using INADDR_ANY seems to work on windows. However, I assume the FIXME below was put there for a reason. But for now I just revert it because the platform independent code seems to work. */ /* FIXME: This must not be INADDR_ANY on Win, otherwise the system will try to bind on any of the local addresses (including 127.0.0.1), which works. - bjoern */ /* sa.sin_addr.s_addr = addr[0].s_addr; */ sa.sin_addr.s_addr = htonl(INADDR_ANY); #else sa.sin_addr.s_addr = htonl(INADDR_ANY); #endif /* __MINGW__ */ sa.sin_port = htons(p); result = bind(sock, (void*)&sa, sizeof(sa)); if (result == 0) { map_del(m); m = 0; } } #if defined(__MINGW__) closesocket(sock); #else close(sock); #endif } } if (m) { /* Lookup found live server. */ *(uint32_t*)wi->buf = htonl(m->port); } else { /* Not found. */ if (debug > 1) { snprintf(ebuf, sizeof(ebuf), "requested service not found"); gdomap_log(LOG_DEBUG); } *(unsigned short*)wi->buf = 0; } } else if (type == GDO_UNREG) { /* * See if this is a request from a local process. */ if (is_local_host(ri->addr.sin_addr) == 0) { snprintf(ebuf, sizeof(ebuf), "Illegal attempt to un-register!"); gdomap_log(LOG_ERR); clear_chan(desc); return; } if (port == 0 || size > 0) { m = map_by_name(buf, size); if (m) { if ((m->net | m->svc) != ptype) { if (debug) { snprintf(ebuf, sizeof(ebuf), "Attempted unregister with wrong type"); gdomap_log(LOG_DEBUG); } } else { *(uint32_t*)wi->buf = htonl(m->port); map_del(m); } } else { if (debug > 1) { snprintf(ebuf, sizeof(ebuf), "requested service not found"); gdomap_log(LOG_DEBUG); } } } else { *(uint32_t*)wi->buf = 0; while ((m = map_by_port(port, ptype)) != 0) { *(uint32_t*)wi->buf = htonl(m->port); map_del(m); } } } else if (type == GDO_SERVERS) { unsigned int i; unsigned int j; /* See if this is a request from a local process. * * This request is only useful locally. Do not allow remote * requests for the server list. Our response can be large, * so it would make a great UDP amplification attack. */ if (is_local_host(ri->addr.sin_addr) == 0) { snprintf(ebuf, sizeof(ebuf), "Illegal attempt to list servers!"); gdomap_log(LOG_ERR); clear_chan(desc); return; } free(wi->buf); wi->buf = (char*)calloc(sizeof(uint32_t) + (prb_used+1)*IASIZE, 1); *(uint32_t*)wi->buf = htonl(prb_used+1); memcpy(&wi->buf[4], &ri->addr.sin_addr, IASIZE); /* * Copy the addresses of the hosts we have probed into the buffer. * During the copy, reverse the order of the addresses so that the * address we have contacted most recently is first. This should * ensure that the client process will attempt to contact live * hosts before dead ones. */ for (i = 0, j = prb_used; i < prb_used; i++) { memcpy(&wi->buf[4+(i+1)*IASIZE], &prb[--j]->sin, IASIZE); } wi->len = 4 + (prb_used+1)*IASIZE; } else if (type == GDO_NAMES) { int bytes = 0; uptr ptr; int i; free(wi->buf); /* * Size buffer for names. */ for (i = 0; i < map_used; i++) { bytes += 2 + map[i]->size; } /* * Allocate with space for number of names and set it up. */ wi->buf = (char*)malloc(4 + bytes); *(uint32_t*)wi->buf = htonl(bytes); ptr = (uptr)wi->buf; ptr += 4; for (i = 0; i < map_used; i++) { ptr[0] = (unsigned char)map[i]->size; ptr[1] = (unsigned char)(map[i]->net | map[i]->svc); memcpy(&ptr[2], map[i]->name, ptr[0]); ptr += 2 + ptr[0]; } wi->len = 4 + bytes; } else if (type == GDO_PROBE) { /* * If the client is a name server, we add it to the list. */ if (ri->addr.sin_port == my_port) { struct in_addr sin; memcpy(&sin, ri->buf.r.name, IASIZE); if (debug > 2) { snprintf(ebuf, sizeof(ebuf), "Probe from '%s'", inet_ntoa(sin)); gdomap_log(LOG_DEBUG); } prb_add(&sin); /* * Irrespective of what we are told to do - we also add the * interface from which this packet arrived so we have a * route we KNOW we can use. */ prb_add(&ri->addr.sin_addr); #if 0 { struct in_addr *ptr; uint32_t net; int c; #if defined(__MINGW__) if (IN_CLASSA(sin.s_addr)) { net = sin.s_addr & IN_CLASSA_NET; } else if (IN_CLASSB(sin.s_addr)) { net = sin.s_addr & IN_CLASSB_NET; } else if (IN_CLASSC(sin.s_addr)) { net = sin.s_addr & IN_CLASSC_NET; } #else net = inet_netof(sin); #endif ptr = (struct in_addr*)&ri->buf.r.name[2*IASIZE]; c = (ri->buf.r.nsize - 2*IASIZE)/IASIZE; while (c-- > 0) { if (debug > 2) { snprintf(ebuf, sizeof(ebuf), "Add server '%s'", inet_ntoa(*ptr)); gdomap_log(LOG_DEBUG); } prb_add(ptr); ptr++; } } #endif } /* * For a UDP request from another name server, we send a reply * packet. We shouldn't be getting probes from anywhere else, * but just to be nice, we send back our port number anyway. */ if (desc == udp_desc && ri->addr.sin_port == my_port) { struct in_addr laddr; struct in_addr raddr; struct in_addr *other = 0; unsigned int elen; void *rbuf = ri->buf.r.name; void *wbuf; int i; gdo_req *r; free(wi->buf); r = (gdo_req*)calloc(GDO_REQ_SIZE, 1); wi->buf = (char*)r; wbuf = r->name; r->rtype = GDO_PREPLY; r->nsize = IASIZE*2; memcpy(&raddr, rbuf, IASIZE); memcpy(&laddr, rbuf+IASIZE, IASIZE); if (debug > 2) { snprintf(ebuf, sizeof(ebuf), "Probe sent remote '%s'", inet_ntoa(raddr)); snprintf(ebuf, sizeof(ebuf), "Probe sent local '%s'", inet_ntoa(laddr)); } memcpy(wbuf+IASIZE, &raddr, IASIZE); /* * If the other end did not tell us which of our addresses it was * probing, try to select one on the same network to send back. * otherwise, respond with the address it was probing. */ if (is_local_host(laddr) == 0 || laddr.s_addr == loopback.s_addr) { for (i = 0; i < interfaces; i++) { if (addr[i].s_addr == loopback.s_addr) { continue; } if ((mask[i].s_addr & addr[i].s_addr) == (mask[i].s_addr & ri->addr.sin_addr.s_addr)) { laddr = addr[i]; memcpy(wbuf, &laddr, IASIZE); break; } } } else { memcpy(wbuf, &laddr, IASIZE); } wi->len = GDO_REQ_SIZE; elen = other_addresses_on_net(laddr, &other); if (elen > 0) { while (elen > MAX_EXTRA) { elen -= MAX_EXTRA; queue_probe(&raddr, &laddr, MAX_EXTRA, &other[elen], 1); } queue_probe(&raddr, &laddr, elen, other, 1); } if (0 != other) { free(other); } } else { port = my_port; *(uint32_t*)wi->buf = htonl(port); } } else if (type == GDO_PREPLY) { /* * This should really be a reply by UDP to a probe we sent * out earlier. We should add the name server to our list. */ if (ri->addr.sin_port == my_port) { struct in_addr sin; memcpy(&sin, &ri->buf.r.name, IASIZE); if (debug > 2) { snprintf(ebuf, sizeof(ebuf), "Probe reply from '%s'", inet_ntoa(sin)); gdomap_log(LOG_DEBUG); } prb_add(&sin); /* * Irrespective of what we are told to do - we also add the * interface from which this packet arrived so we have a * route we KNOW we can use. */ prb_add(&ri->addr.sin_addr); } /* * Because this is really a reply to us, we don't want to reply * to it or we would get a feedback loop. */ clear_chan(desc); return; } else { snprintf(ebuf, sizeof(ebuf), "Illegal operation code received!"); gdomap_log(LOG_ERR); clear_chan(desc); return; } /* * If the request was via UDP, we send a response back by queuing * rather than letting the normal 'write_handler()' function do it. */ if (desc == udp_desc) { queue_msg(&ri->addr, (unsigned char*)wi->buf, wi->len); clear_chan(desc); } } /* * Name - handle_send() * Purpose - Send any pending message on UDP socket. * The code is designed to send the message in parts if * the 'sendto()' function returns a positive integer * indicating that only part of the message has been * written. This should never happen - but I coded it * this way in case we have to run on a system which * implements sendto() badly (I used such a system * many years ago). */ static void handle_send() { struct u_data* entry = u_queue; if (entry) { int r; r = sendto(udp_desc, (const char *)&entry->dat[entry->pos], entry->len - entry->pos, 0, (void*)&entry->addr, sizeof(entry->addr)); /* * 'r' is the number of bytes sent. This should be the number * of bytes we asked to send, or -1 to indicate failure. */ if (r > 0) { entry->pos += r; } /* * If we haven't written all the data, it should have been * because we blocked. Anything else is a major problem * so we remove the message from the queue. */ if (entry->pos != entry->len) { #if defined(__MINGW__) if (WSAGetLastError() != WSAEWOULDBLOCK) #else if (errno != EWOULDBLOCK) #endif { if (debug) { snprintf(ebuf, sizeof(ebuf), "failed sendto on %d for %s - %s", udp_desc, inet_ntoa(entry->addr.sin_addr), strerror(errno)); gdomap_log(LOG_DEBUG); } queue_pop(); } } else { udp_sent++; if (debug > 1) { snprintf(ebuf, sizeof(ebuf), "performed sendto for %s", inet_ntoa(entry->addr.sin_addr)); gdomap_log(LOG_DEBUG); } /* * If we have sent the entire message - remove it from queue. */ if (entry->pos == entry->len) { queue_pop(); } } } } /* * Name - handle_write() * Purpose - Write data to a channel. When all writing for the * channel is complete, close the channel down. * * This is all probably totally paranoid - the reply * to any request is so short that the write operation * should not block so there shouldn't be any need to * handle non-blocking I/O. */ static void handle_write(int desc) { WInfo *wi; char *ptr; int len; int r; wi = getWInfo(desc, 0); if (wi == 0) { snprintf(ebuf, sizeof(ebuf), "handle_write for unknown descriptor (%d)", desc); gdomap_log(LOG_ERR); return; } ptr = wi->buf; len = wi->len; #if defined(__MINGW__) r = send(desc, &ptr[wi->pos], len - wi->pos, 0); #else r = write(desc, &ptr[wi->pos], len - wi->pos); #endif if (r < 0) { if (debug > 1) { snprintf(ebuf, sizeof(ebuf), "Failed write on chan %d - closing", desc); gdomap_log(LOG_DEBUG); } /* * Failure - close connection silently. */ clear_chan(desc); } else { wi->pos += r; if (wi->pos >= len) { tcp_sent++; if (debug > 1) { snprintf(ebuf, sizeof(ebuf), "Completed write on chan %d - closing", desc); gdomap_log(LOG_DEBUG); } /* * Success - written all information. */ clear_chan(desc); } } } /* * Name - tryRead() * Purpose - Attempt to read from a non blocking channel. * Time out in specified time. * If length of data is zero then just wait for * descriptor to be readable. * If the length is negative then attempt to * read the absolute value of length but return * as soon as anything is read. * * Return -1 on failure * Return -2 on timeout * Return number of bytes read */ static int tryRead(int desc, int tim, unsigned char* dat, int len) { struct timeval timeout; fd_set fds; void *to; int rval; int pos = 0; time_t when = 0; int neg = 0; if (len < 0) { neg = 1; len = -len; } /* * First time round we do a select with an instant timeout to see * if the descriptor is already readable. */ timeout.tv_sec = 0; timeout.tv_usec = 0; for (;;) { to = &timeout; memset(&fds, '\0', sizeof(fds)); FD_SET(desc, &fds); rval = select(FD_SETSIZE, &fds, 0, 0, to); if (rval == 0) { time_t now = time(0); if (when == 0) { when = now; } else if (now - when >= tim) { return -2; /* Timed out. */ } else { /* * Set the timeout for a new call to select next time * round the loop. */ timeout.tv_sec = tim - (now - when); timeout.tv_usec = 0; } } else if (rval < 0) { return -1; /* Error in select. */ } else if (len > 0) { #if defined(__MINGW__) rval = recv(desc, (char *)&dat[pos], len - pos, 0); #else rval = read(desc, &dat[pos], len - pos); #endif if (rval < 0) { #if defined(__MINGW__) if (WSAGetLastError() != WSAEWOULDBLOCK) #else if (errno != EWOULDBLOCK) #endif { return -1; /* Error in read. */ } } else if (rval == 0) { return -1; /* End of file. */ } else { pos += rval; if (pos == len || neg == 1) { return pos; /* Read as needed. */ } } } else { return 0; /* Not actually asked to read. */ } } } /* * Name - tryWrite() * Purpose - Attempt to write to a non blocking channel. * Time out in specified time. * If length of data is zero then just wait for * descriptor to be writable. * If the length is negative then attempt to * write the absolute value of length but return * as soon as anything is written. * * Return -1 on failure * Return -2 on timeout * Return number of bytes written */ static int tryWrite(int desc, int tim, unsigned char* dat, int len) { struct timeval timeout; fd_set fds; void *to; int rval; int pos = 0; time_t when = 0; int neg = 0; if (len < 0) { neg = 1; len = -len; } /* * First time round we do a select with an instant timeout to see * if the descriptor is already writable. */ timeout.tv_sec = 0; timeout.tv_usec = 0; for (;;) { to = &timeout; memset(&fds, '\0', sizeof(fds)); FD_SET(desc, &fds); rval = select(FD_SETSIZE, 0, &fds, 0, to); if (rval == 0) { time_t now = time(0); if (when == 0) { when = now; } else if (now - when >= tim) { return -2; /* Timed out. */ } else { /* Set the timeout for a new call to select next time round * the loop. */ timeout.tv_sec = tim - (now - when); timeout.tv_usec = 0; } } else if (rval < 0) { return -1; /* Error in select. */ } else if (len > 0) { #if defined(__MINGW__) /* FIXME: Is this correct? */ rval = send(desc, (const char*)&dat[pos], len - pos, 0); #else void (*ifun)(); /* * Should be able to write this short a message immediately, but * if the connection is lost we will get a signal we must trap. */ ifun = signal(SIGPIPE, (void(*)(int))SIG_IGN); rval = write(desc, &dat[pos], len - pos); signal(SIGPIPE, ifun); #endif if (rval <= 0) { #if defined(__MINGW__) if (WSAGetLastError() != WSAEWOULDBLOCK) #else if (errno != EWOULDBLOCK) #endif { return -1; /* Error in write. */ } } else { pos += rval; if (pos == len || neg == 1) { return pos; /* Written as needed. */ } } } else { return 0; /* Not actually asked to write. */ } } } /* * Name - tryHost() * Purpose - Perform a name server operation with a given * request packet to a server at specified address. * On error - return non-zero with reason in 'errno' */ static int tryHost(unsigned char op, unsigned char len, const unsigned char *name, int ptype, struct sockaddr_in *addr, unsigned short *p, uptr *v) { int desc = socket(AF_INET, SOCK_STREAM, 0); int e = 0; uint32_t port = *p; gdo_req msg; struct sockaddr_in sin; #if defined(__MINGW__) DWORD dummy; #endif /* __MINGW__ */ *p = 0; if (desc < 0) { return 1; /* Couldn't create socket. */ } #if defined(__MINGW__) dummy = 1; if (ioctlsocket(desc, FIONBIO, &dummy) < 0) { e = WSAGetLastError(); closesocket(desc); WSASetLastError(e); return 2; /* Couldn't set non-blocking. */ } #else /* !__MINGW__ */ if ((e = fcntl(desc, F_GETFL, 0)) >= 0) { e |= NBLK_OPT; if (fcntl(desc, F_SETFL, e) < 0) { e = errno; close(desc); errno = e; return 2; /* Couldn't set non-blocking. */ } } else { e = errno; close(desc); errno = e; return 2; /* Couldn't set non-blocking. */ } #endif /* __MINGW__ */ memcpy(&sin, addr, sizeof(sin)); if (connect(desc, (struct sockaddr*)&sin, sizeof(sin)) != 0) { #if defined(__MINGW__) if (WSAGetLastError() == WSAEWOULDBLOCK) #else if (errno == EINPROGRESS) #endif { e = tryWrite(desc, 10, 0, 0); if (e == -2) { e = errno; #if defined(__MINGW__) closesocket(desc); #else close(desc); #endif errno = e; return 3; /* Connect timed out. */ } else if (e == -1) { e = errno; #if defined(__MINGW__) closesocket(desc); #else close(desc); #endif errno = e; return 3; /* Select failed. */ } } else { e = errno; #if defined(__MINGW__) closesocket(desc); #else close(desc); #endif errno = e; return 3; /* Failed connect. */ } } memset((char*)&msg, '\0', GDO_REQ_SIZE); msg.rtype = op; msg.nsize = len; msg.ptype = ptype; if (op != GDO_REGISTER) { port = 0; } msg.port = htonl(port); if (name && len) { memcpy(msg.name, name, len); } e = tryWrite(desc, 10, (uptr)&msg, GDO_REQ_SIZE); if (e != GDO_REQ_SIZE) { #if defined(__MINGW__) e = WSAGetLastError(); closesocket(desc); WSASetLastError(e); #else e = errno; close(desc); errno = e; #endif return 4; } e = tryRead(desc, 3, (uptr)&port, 4); if (e != 4) { #if defined(__MINGW__) e = WSAGetLastError(); closesocket(desc); WSASetLastError(e); #else e = errno; close(desc); errno = e; #endif return 5; /* Read timed out. */ } port = ntohl(port); if (port > 0xffff) { if (GDO_NAMES == op) { if (port > 10000000) { snprintf(ebuf, sizeof(ebuf), "Insanely large list of registered names"); gdomap_log(LOG_ERR); close(desc); return 5; // Unreasonable number of registrations } } else { snprintf(ebuf, sizeof(ebuf), "Port number of incoming message is out of range"); gdomap_log(LOG_ERR); close(desc); return 5; // Unreasonable port number } } /* * Special case for GDO_SERVERS - allocate buffer and read list. */ if (op == GDO_SERVERS) { int len = port * sizeof(struct in_addr); uptr b; b = (uptr)malloc(len); if (tryRead(desc, 3, b, len) != len) { free(b); #if defined(__MINGW__) e = WSAGetLastError(); closesocket(desc); WSASetLastError(e); #else e = errno; close(desc); errno = e; #endif return 5; } if (0 != v) { *v = b; } } /* * Special case for GDO_NAMES - allocate buffer and read list. */ else if (op == GDO_NAMES) { int len = port; uptr ptr; uptr b; b = (uptr)malloc(len); if (tryRead(desc, 3, b, len) != len) { free(b); #if defined(__MINGW__) e = WSAGetLastError(); closesocket(desc); WSASetLastError(e); #else e = errno; close(desc); errno = e; #endif return 5; } /* * Count the number of registered names and return them. */ ptr = b; port = 0; while (ptr < (b + len)) { ptr += 2 + ptr[0]; port++; } if ((port & 0xffff) != port) { snprintf(ebuf, sizeof(ebuf), "Insanely large number of registered names"); gdomap_log(LOG_ERR); port = 0; } if (0 != v) { *v = b; } } *p = (unsigned short)port; #if defined(__MINGW__) closesocket(desc); #else close(desc); #endif errno = 0; return 0; } /* * Name - nameFail() * Purpose - If given a failure status from tryHost() * raise an appropriate exception. */ static void nameFail(int why) { switch (why) { case 0: break; case 1: snprintf(ebuf, sizeof(ebuf), "failed to contact name server - socket - %s", strerror(errno)); gdomap_log(LOG_ERR); break; case 2: snprintf(ebuf, sizeof(ebuf), "failed to contact name server - socket - %s", strerror(errno)); gdomap_log(LOG_ERR); break; case 3: snprintf(ebuf, sizeof(ebuf), "failed to contact name server - socket - %s", strerror(errno)); gdomap_log(LOG_ERR); break; case 4: snprintf(ebuf, sizeof(ebuf), "failed to contact name server - socket - %s", strerror(errno)); gdomap_log(LOG_ERR); break; } } /* * Name - nameServer() * Purpose - Perform name server lookup or registration. * Return success/failure status and set up an * address structure for use in bind or connect. * Restrictions - 0xffff byte name limit * Uses old style host lookup - only handles the * primary network interface for each host! */ static int nameServer(const char* name, const char* host, int op, int ptype, struct sockaddr_in* addr, int pnum, int max) { struct sockaddr_in sin; unsigned short p; unsigned short port = 0; int len = strlen(name); int multi = 0; int found = 0; int rval; char *first_dot = 0; if (len == 0) { snprintf(ebuf, sizeof(ebuf), "no name specified."); gdomap_log(LOG_ERR); return -1; } if (len > 0xffff) { snprintf(ebuf, sizeof(ebuf), "name length to large."); gdomap_log(LOG_ERR); return -1; } memset((char*)&sin, '\0', sizeof(sin)); sin.sin_family = AF_INET; #if GDOMAP_PORT_OVERRIDE p = htons(GDOMAP_PORT_OVERRIDE); #else { struct servent *sp; /* * Ensure we have port number to connect to name server. * The TCP service name 'gdomap' overrides the default port. */ if ((sp = getservbyname("gdomap", "tcp")) != 0) { p = sp->s_port; /* Network byte order. */ } else { p = htons(GDOMAP_PORT); } } #endif sin.sin_port = p; /* * The host name '*' matches any host on the local network. */ if (host && host[0] == '*' && host[1] == '\0') { multi = 1; } /* * If no host name is given, we use the name of the local host. * NB. This should always be the case for operations other than lookup. */ if (multi || host == 0 || *host == '\0') { first_dot = strchr(local_hostname, '.'); if (first_dot) { *first_dot = '\0'; } host = local_hostname; } #if HAVE_GETADDRINFO { struct addrinfo hints; struct addrinfo *info; int err; memset(&hints, '\0', sizeof(hints)); hints.ai_family = AF_INET; if (getaddrinfo(host, NULL, &hints, &info) != 0 && first_dot != 0) { *first_dot = '.'; if ((err = getaddrinfo(host, NULL, &hints, &info)) != 0) { snprintf(ebuf, sizeof(ebuf), "getaddrinfo('%s') failed: %s", host, gai_strerror(err)); gdomap_log(LOG_ERR); return -1; } } sin.sin_addr = ((struct sockaddr_in *)info->ai_addr)->sin_addr; freeaddrinfo(info); } #else { struct hostent *hp; if ((hp = gethostbyname(host)) == 0 && first_dot != 0) { *first_dot = '.'; hp = gethostbyname(host); } if (hp == 0) { snprintf(ebuf, sizeof(ebuf), "gethostbyname('%s') failed: %s", host, strerror(errno)); gdomap_log(LOG_ERR); return -1; } if (hp->h_addrtype != AF_INET) { snprintf(ebuf, sizeof(ebuf), "non-internet network not supported for %s", host); gdomap_log(LOG_ERR); return -1; } memcpy(&sin.sin_addr, hp->h_addr, hp->h_length); } #endif if (multi) { unsigned short num; struct in_addr *b; /* * A host name of '*' is a special case which should do lookup on * all machines on the local network until one is found which has * the specified server on it. */ rval = tryHost(GDO_SERVERS, 0, 0, ptype, &sin, &num, (uptr*)&b); if (0 == rval) { int i; for (i = 0; found == 0 && i < num; i++) { memset((char*)&sin, '\0', sizeof(sin)); sin.sin_family = AF_INET; sin.sin_port = p; memcpy(&sin.sin_addr, &b[i], sizeof(struct in_addr)); if (sin.sin_addr.s_addr == 0) { continue; } if (tryHost(GDO_LOOKUP, len, (unsigned char*)name, ptype, &sin, &port, 0)==0) { if (port != 0) { memset((char*)&addr[found], '\0', sizeof(*addr)); memcpy(&addr[found].sin_addr, &sin.sin_addr, sizeof(sin.sin_addr)); addr[found].sin_family = AF_INET; addr[found].sin_port = htons(port); found++; if (found == max) { break; } } } } free(b); return found; } else { snprintf(ebuf, sizeof(ebuf), "failed to contact gdomap on %s(%s) - %s", local_hostname, inet_ntoa(sin.sin_addr), strerror(errno)); gdomap_log(LOG_ERR); return -1; } } else { if (op == GDO_REGISTER) { port = (unsigned short)pnum; if (port == 0 || htons(port) == p) { snprintf(ebuf, sizeof(ebuf), "attempted registration with bad port (%d).", port); gdomap_log(LOG_ERR); return -1; } } rval = tryHost(op, len, (unsigned char*)name, ptype, &sin, &port, 0); if (rval != 0) { snprintf(ebuf, sizeof(ebuf), "failed to contact gdomap on %s(%s) - %s", local_hostname, inet_ntoa(sin.sin_addr), strerror(errno)); gdomap_log(LOG_ERR); return -1; } nameFail(rval); } if (op == GDO_REGISTER) { if (port == 0 || (pnum != 0 && port != pnum)) { snprintf(ebuf, sizeof(ebuf), "service already registered."); gdomap_log(LOG_ERR); return -1; } } if (port == 0) { return 0; } memset((char*)addr, '\0', sizeof(*addr)); memcpy(&addr->sin_addr, &sin.sin_addr, sizeof(sin.sin_addr)); addr->sin_family = AF_INET; addr->sin_port = htons(port); return 1; } static void lookup(const char *name, const char *host, int ptype) { struct sockaddr_in sin[100]; int found; int i; found = nameServer(name, host, GDO_LOOKUP, ptype, sin, 0, 100); for (i = 0; i < found; i++) { snprintf(ebuf, sizeof(ebuf), "Found %s on '%s' port %d", name, inet_ntoa(sin[i].sin_addr), ntohs(sin[i].sin_port)); gdomap_log(LOG_INFO); } if (found == 0) { snprintf(ebuf, sizeof(ebuf), "Unable to find %s.", name); gdomap_log(LOG_INFO); } } static void donames(const char *host) { struct sockaddr_in sin; unsigned short p; unsigned short num = 0; int rval; uptr b; char *first_dot = 0; if (host == 0 || *host == '\0') { /* * If no host name is given, we use the name of the local host. */ first_dot = strchr(local_hostname, '.'); if (first_dot) { *first_dot = '\0'; } host = local_hostname; } memset((char*)&sin, '\0', sizeof(sin)); sin.sin_family = AF_INET; #if GDOMAP_PORT_OVERRIDE p = htons(GDOMAP_PORT_OVERRIDE); #else { struct servent *sp; /* * Ensure we have port number to connect to name server. * The TCP service name 'gdomap' overrides the default port. */ if ((sp = getservbyname("gdomap", "tcp")) != 0) { p = sp->s_port; /* Network byte order. */ } else { p = htons(GDOMAP_PORT); } } #endif sin.sin_port = p; #if HAVE_GETADDRINFO { struct addrinfo hints; struct addrinfo *info; int err; memset(&hints, '\0', sizeof(hints)); hints.ai_family = AF_INET; if ((err = getaddrinfo(host, NULL, &hints, &info) != 0) && first_dot != 0) { *first_dot = '.'; err = getaddrinfo(host, NULL, &hints, &info); } if (err != 0) { snprintf(ebuf, sizeof(ebuf), "getaddrinfo('%s') failed: %s", host, gai_strerror(err)); gdomap_log(LOG_ERR); return; } sin.sin_addr = ((struct sockaddr_in *)info->ai_addr)->sin_addr; freeaddrinfo(info); } #else { struct hostent *hp; if ((hp = gethostbyname(host)) == 0 && first_dot != 0) { *first_dot = '.'; hp = gethostbyname(host); } if (hp == 0) { snprintf(ebuf, sizeof(ebuf), "gethostbyname('%s') failed: %s", host, strerror(errno)); gdomap_log(LOG_ERR); return; } if (hp->h_addrtype != AF_INET) { snprintf(ebuf, sizeof(ebuf), "non-internet network not supported for %s", host); gdomap_log(LOG_ERR); return; } memcpy(&sin.sin_addr, hp->h_addr, hp->h_length); } #endif rval = tryHost(GDO_NAMES, 0, 0, 0, &sin, &num, (uptr*)&b); if (rval != 0) { snprintf(ebuf, sizeof(ebuf), "failed to contact gdomap on %s(%s) - %s", local_hostname, inet_ntoa(sin.sin_addr), strerror(errno)); gdomap_log(LOG_ERR); return; } if (num == 0) { snprintf(ebuf, sizeof(ebuf), "No names currently registered with gdomap"); gdomap_log(LOG_INFO); } else { uptr p = b; snprintf(ebuf, sizeof(ebuf), "Registered names are -"); gdomap_log(LOG_INFO); while (num-- > 0) { char buf[256]; memcpy(buf, &p[2], p[0]); buf[p[0]] = '\0'; snprintf(ebuf, sizeof(ebuf), " %s", buf); gdomap_log(LOG_INFO); p += 2 + p[0]; } } free(b); } static void doservers(const char *host) { struct sockaddr_in sin; unsigned short p; unsigned short num = 0; int rval; uptr b; char *first_dot = 0; if (host == 0 || *host == '\0') { /* * If no host name is given, we use the name of the local host. */ first_dot = strchr(local_hostname, '.'); if (first_dot) { *first_dot = '\0'; } host = local_hostname; } memset((char*)&sin, '\0', sizeof(sin)); sin.sin_family = AF_INET; #if GDOMAP_PORT_OVERRIDE p = htons(GDOMAP_PORT_OVERRIDE); #else { struct servent *sp; /* * Ensure we have port number to connect to name server. * The TCP service name 'gdomap' overrides the default port. */ if ((sp = getservbyname("gdomap", "tcp")) != 0) { p = sp->s_port; /* Network byte order. */ } else { p = htons(GDOMAP_PORT); } } #endif sin.sin_port = p; #if HAVE_GETADDRINFO { struct addrinfo hints; struct addrinfo *info; int err; memset(&hints, '\0', sizeof(hints)); hints.ai_family = AF_INET; if ((err = getaddrinfo(host, NULL, &hints, &info) != 0) && first_dot != 0) { *first_dot = '.'; err = getaddrinfo(host, NULL, &hints, &info); } if (err != 0) { snprintf(ebuf, sizeof(ebuf), "getaddrinfo('%s') failed: %s", host, gai_strerror(err)); gdomap_log(LOG_ERR); return; } sin.sin_addr = ((struct sockaddr_in *)info->ai_addr)->sin_addr; freeaddrinfo(info); } #else { struct hostent *hp; if ((hp = gethostbyname(host)) == 0 && first_dot != 0) { *first_dot = '.'; hp = gethostbyname(host); } if (hp == 0) { snprintf(ebuf, sizeof(ebuf), "gethostbyname('%s') failed: %s", host, strerror(errno)); gdomap_log(LOG_ERR); return; } if (hp->h_addrtype != AF_INET) { snprintf(ebuf, sizeof(ebuf), "non-internet network not supported for %s", host); gdomap_log(LOG_ERR); return; } memcpy(&sin.sin_addr, hp->h_addr, hp->h_length); } #endif rval = tryHost(GDO_SERVERS, 0, 0, 0, &sin, &num, (uptr*)&b); if (rval != 0) { snprintf(ebuf, sizeof(ebuf), "failed to contact gdomap on %s(%s) - %s", local_hostname, inet_ntoa(sin.sin_addr), strerror(errno)); gdomap_log(LOG_ERR); return; } if (num == 0) { snprintf(ebuf, sizeof(ebuf), "No servers currently known to gdomap"); gdomap_log(LOG_INFO); } else { struct in_addr *p = (struct in_addr*)(b + 4); snprintf(ebuf, sizeof(ebuf), "Known servers are -"); gdomap_log(LOG_INFO); while (num-- > 0) { snprintf(ebuf, sizeof(ebuf), " %s", inet_ntoa(*p)); gdomap_log(LOG_INFO); p++; } } free(b); } static void doregister(const char *name, int port, int ptype) { struct sockaddr_in sin; int found; int i; found = nameServer(name, 0, GDO_REGISTER, ptype, &sin, port, 1); for (i = 0; i < found; i++) { snprintf(ebuf, sizeof(ebuf), "Registered %s on '%s' port %d", name, inet_ntoa(sin.sin_addr), ntohs(sin.sin_port)); gdomap_log(LOG_INFO); } if (found == 0) { snprintf(ebuf, sizeof(ebuf), "Unable to register %s on port %d.", name, port); gdomap_log(LOG_ERR); } } static void unregister(const char *name, int port, int ptype) { struct sockaddr_in sin; int found; int i; found = nameServer(name, 0, GDO_UNREG, ptype, &sin, port, 1); for (i = 0; i < found; i++) { snprintf(ebuf, sizeof(ebuf), "Unregistered %s on '%s' port %d", name, inet_ntoa(sin.sin_addr), ntohs(sin.sin_port)); gdomap_log(LOG_INFO); } if (found == 0) { snprintf(ebuf, sizeof(ebuf), "Unable to unregister %s.", name); gdomap_log(LOG_INFO); } } static void do_help(int argc, char **argv, char *options) { /* * Where argc > 0 we check to see if there is a '--help' argument * and do nothing if there isn't. */ if (argc > 0) { int i; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "--help") == 0) { break; } } if (i == argc) { return; // --help not found ... } } printf("%s -[%s]\n", argv[0], options); printf("GNU Distributed Objects name server\n"); printf("-C help about interfaces and configuration\n"); printf("-H general help\n"); printf("-I pid file to write pid\n"); printf("-L name perform lookup for name then quit.\n"); printf("-M name machine name for -L and -N\n"); printf("-N list all names registered on host\n"); printf("-P number port number required for R option.\n"); printf("-R name register name locally then quit.\n"); printf("-S list all gdomap servers known to host\n"); printf("-T type port type for L, R and U options -\n"); printf(" tcp_gdo, udp_gdo,\n"); printf(" tcp_foreign, udp_foreign.\n"); printf("-U name unregister name locally then quit.\n"); printf("-a file use config file for interface list.\n"); printf("-c file use config file for probe.\n"); printf("-d extra debug logging (normally via syslog).\n"); printf("-f avoid fork() to make debugging easy\n"); printf("-i seconds re-probe at this interval (roughly), min 60\n"); #if !defined(__MINGW__) printf("-j path specify a jail directory the process is to\n"); printf(" run in (if omitted, /tmp is used).\n"); #endif printf("-p disable probing for other servers\n"); printf("\n"); printf("Kill with SIGUSR1 to obtain a dump of all known peers\n"); printf("in /tmp/gdomap.dump\n"); printf("\n"); exit(EXIT_SUCCESS); } #if defined(__MINGW__) static char* quoteArg(const char *arg) { int len = strlen(arg); int in; int out = 0; int quote = 0; char *ptr = malloc(len*2+3); /* * Check for white space ... if present, must quote argument. */ for (in = 0; in < len; in++) { if (isspace(arg[in])) { quote = 1; break; } } if (quote) { ptr[out++] = '"'; } for (in = 0; in < len; in++) { if (arg[in] == '\\') { int pos = in + 1; // Step past any backslashes while (pos < len && ptr[pos] == '\\') { pos++; } // If backslashes precede a quote ... double them. if (pos < len && ptr[pos] == '"') { int num = pos - in; while (num-- > 0) { ptr[out++] = '\\'; } } // Copy the original backslashes while (in < pos) { ptr[out++] = arg[in++]; } // Copy the character after the backslashes if (in < len) { ptr[out++] = arg[in]; } } else if (arg[in] == '"') { ptr[out++] = '\\'; // Escape the quote. ptr[out++] = arg[in]; } else { ptr[out++] = arg[in]; } } if (quote) { ptr[out++] = '"'; } ptr[out] = '\0'; return ptr; } #endif /** * (A dummy comment to help autogsdoc realize this is a command-line tool.) */ #if GS_FAKE_MAIN /* Since we don't link gnustep-base, the main function below has to be * the real main function. */ #undef main #endif int main(int argc, char** argv) { extern char *optarg; #if defined(__MINGW__) char *options = "-CHI:L:M:NP:R:ST:U:a:bc:dfi:p"; #else char *options = "-CHI:L:M:NP:R:ST:U:a:bc:dfi:j:p"; const char *jail = 0; #endif int c; int ptype = GDO_TCP_GDO; int port = 0; const char *machine = 0; const char *lookupf = 0; int donamesf = 0; int doserversf = 0; #if defined(__MINGW__) WORD wVersionRequested; WSADATA wsaData; wVersionRequested = MAKEWORD(2, 2); WSAStartup(wVersionRequested, &wsaData); #else int forked = 0; #endif local_hostname = xgethostname(); if (!local_hostname) { snprintf(ebuf, sizeof(ebuf), "gethostname() failed: %s", strerror(errno)); gdomap_log(LOG_CRIT); exit(EXIT_FAILURE); } /* * Would use inet_aton(), but older systems don't have it. */ loopback.s_addr = inet_addr("127.0.0.1"); #if defined(__MINGW__) class_a_net = IN_CLASSA_NET; class_a_mask.s_addr = class_a_net; class_b_net = IN_CLASSB_NET; class_b_mask.s_addr = class_b_net; class_c_net = IN_CLASSC_NET; class_c_mask.s_addr = class_c_net; #else class_a_net = inet_network("255.0.0.0"); class_a_mask = inet_makeaddr(class_a_net, 0); class_b_net = inet_network("255.255.0.0"); class_b_mask = inet_makeaddr(class_b_net, 0); class_c_net = inet_network("255.255.255.0"); class_c_mask = inet_makeaddr(class_c_net, 0); #endif do_help(argc, argv, options); while ((c = getopt(argc, argv, options)) != -1) { switch(c) { case 'H': do_help(0, argv, options); exit(EXIT_SUCCESS); case 'C': printf("\n"); printf( "Gdomap normally probes every machine on the local network to see if there\n" "is a copy of gdomap running on it. This is done for class-C networks and\n" "subnets of class-C networks. If your host is on a class-B or class-A net\n" "then the default behaviour is to treat it as a class-C net and probe only\n" "the hosts that would be expected on a class-C network of the same number.\n"); printf("\n"); printf( "If you are running on a class-A or class-B network, or if your net has a\n" "large number of hosts which will not have gdomap on them - you may want to\n" "supply a configuration file listing the hosts to be probed explicitly,\n" "rather than getting gdomap to probe all hosts on the local net.\n"); printf("\n"); printf( "You may also want to supply the configuration file so that hosts which are\n" "not actually on your local network can still be found when your code tries\n" "to connect to a host using @\"*\" as the host name. NB. this functionality\n" "does not exist in OpenStep.\n"); printf("\n"); printf( "A configuration file consists of a list of IP addresses to be probed.\n" "The IP addresses should be in standard 'dot' notation, one per line.\n" "Empty lines are permitted in the configuration file.\n" "Anything on a line after a hash ('#') is ignored.\n" "You tell gdomap about the config file with the '-c' command line option.\n"); printf("\n"); printf("\n"); printf( "gdomap uses the SIOCGIFCONF ioctl to build a list of IP addresses and\n" "netmasks for the network interface cards on your machine. On some operating\n" "systems, this facility is not available (or is broken), so you must tell\n" "gdomap the addresses and masks of the interfaces using the '-a' command line\n" "option. The file named with '-a' should contain a series of lines with\n" "space separated pairs of addresses and masks in 'dot' notation, eg.\n" "192.168.1.2 255.255.255.0\n" "You must NOT include loopback interfaces in this list.\n" "If you want to support broadcasting of probe information on a network,\n" "you may supply the broadcast address as a third item on the line, eg.\n" "192.168.1.9 255.255.255.0 192.168.1.255\n" "If your operating system has some other method of giving you a list of\n" "network interfaces and masks, please send me example code so that I can\n" "implement it in gdomap.\n"); printf("\n"); exit(EXIT_SUCCESS); case 'L': lookupf = optarg; break; case 'M': machine = optarg; break; case 'N': donamesf = 1; break; case 'P': port = atoi(optarg); break; case 'R': if (machine && *machine) { fprintf(stderr, "-M flag is ignored for registration.\n"); fprintf(stderr, "Registration will take place locally.\n"); } doregister(optarg, port, ptype); exit(EXIT_SUCCESS); case 'S': doserversf = 1; break; case 'T': if (strcmp(optarg, "tcp_gdo") == 0) { ptype = GDO_TCP_GDO; } else if (strcmp(optarg, "udp_gdo") == 0) { ptype = GDO_UDP_GDO; } else if (strcmp(optarg, "tcp_foreign") == 0) { ptype = GDO_TCP_FOREIGN; } else if (strcmp(optarg, "udp_foreign") == 0) { ptype = GDO_UDP_FOREIGN; } else { fprintf(stderr, "Warning - -P selected unknown type -"); fprintf(stderr, " using tcp_gdo.\n"); ptype = GDO_TCP_GDO; } break; case 'U': if (machine && *machine) { fprintf(stderr, "-M flag is ignored for unregistration.\n"); fprintf(stderr, "Operation will take place locally.\n"); } unregister(optarg, port, ptype); exit(EXIT_SUCCESS); case 'a': load_iface(optarg); break; case 'b': nobcst++; break; case 'c': { FILE *fptr; int line = 0; int count = 0; char buf[128]; in_config = 1; /* First see if we *can* access the file. */ fptr = fopen(optarg, "rt"); if (fptr == 0) { snprintf(ebuf, sizeof(ebuf), "Unable to open probe config - '%s'\n", optarg); gdomap_log(LOG_CRIT); exit(EXIT_FAILURE); } /* Now check that we *should* be accessing it. */ if (access(optarg, R_OK) != 0) { fclose(fptr); snprintf(ebuf, sizeof(ebuf), "Unable to access probe config - '%s'\n", optarg); gdomap_log(LOG_CRIT); exit(EXIT_FAILURE); } while (fgets(buf, sizeof(buf), fptr) != 0) { char *ptr = buf; plentry *prb; line++; /* * Strip leading white space. */ while (isspace(*ptr)) { ptr++; } if (ptr != buf) { memmove(buf, ptr, strlen(ptr) + 1); } /* * Strip comments. */ ptr = strchr(buf, '#'); if (ptr) { *ptr = '\0'; } /* * Strip trailing white space. */ ptr = buf; while (*ptr) { ptr++; } while (ptr > buf && isspace(ptr[-1])) { ptr--; } *ptr = '\0'; /* * Ignore blank lines. */ if (*buf == '\0') { continue; } if (count++ > 1000) { snprintf(ebuf, sizeof(ebuf), "Too many probe configurations found"); gdomap_log(LOG_CRIT); exit(EXIT_FAILURE); } prb = (plentry*)malloc(sizeof(plentry)); memset((char*)prb, '\0', sizeof(plentry)); prb->addr.s_addr = inet_addr(buf); if (prb->addr.s_addr == (uint32_t)-1) { snprintf(ebuf, sizeof(ebuf), "line %d of '%s' (%s) is not a valid address\n", line, optarg, buf); free(prb); gdomap_log(LOG_CRIT); exit(EXIT_FAILURE); } else { /* * Add this address at the end of the list. */ if (plist == 0) { plist = prb; } else { plentry *tmp = plist; while (tmp->next) { if (tmp->addr.s_addr == prb->addr.s_addr) { snprintf(ebuf, sizeof(ebuf), "'%s' repeat in '%s'\n", buf, optarg); free(prb); gdomap_log(LOG_CRIT); exit(EXIT_FAILURE); break; } tmp = tmp->next; } if (tmp->next == 0) { tmp->next = prb; } } } } fclose(fptr); in_config = 0; } break; case 'I': pidfile = optarg; break; case 'd': debug++; break; case 'f': nofork++; break; case 'i': interval = atoi(optarg); if (interval < 60) { interval = 60; } break; #if !defined(__MINGW__) case 'j': jail = optarg; break; #endif case 'p': noprobe++; break; default: printf("%s - GNU Distributed Objects name server\n", argv[0]); printf("-H for help\n"); exit(EXIT_SUCCESS); } } if (donamesf || doserversf || lookupf) { if (donamesf) { donames(machine); } if (doserversf) { doservers(machine); } if (lookupf) { lookup(lookupf, machine, ptype); } exit (0); } #if defined(__MINGW__) /* On Win32, we don't fork */ if (nofork == 0) { char **a = malloc((argc+2) * sizeof(char*)); int i; for (i = 0; i < argc; i++) { a[i] = quoteArg(argv[i]); } a[argc] = "-f"; a[argc+1] = 0; if (_spawnv(_P_NOWAIT, argv[0], (const char* const*)a) == -1) { fprintf(stderr, "gdomap - spawn '%s' failed - bye.\n", argv[0]); exit(EXIT_FAILURE); } if (debug) { snprintf(ebuf, sizeof(ebuf), "initialisation complete."); gdomap_log(LOG_DEBUG); } exit(EXIT_SUCCESS); } #else if (nofork == 0) { /* * Now fork off child process to run in background. */ switch (fork()) { case -1: fprintf(stderr, "gdomap - fork failed - bye.\n"); exit(EXIT_FAILURE); case 0: /* * Try to run in background. */ forked = 1; #if defined(NeXT) setpgrp(0, getpid()); #else setsid(); #endif break; default: if (debug) { snprintf(ebuf, sizeof(ebuf), "initialisation complete."); gdomap_log(LOG_DEBUG); } exit(EXIT_SUCCESS); } } /* * Ensure we don't have any open file descriptors which may refer * to sockets bound to ports we may try to use. * * Use '/dev/null' for stdin and stdout. Assume stderr is ok. */ for (c = 0; c < FD_SETSIZE; c++) { if (is_daemon || (c != 2)) { (void)close(c); } } if (open("/dev/null", O_RDONLY) != 0) { snprintf(ebuf, sizeof(ebuf), "failed to open stdin from /dev/null (%s)\n", strerror(errno)); gdomap_log(LOG_CRIT); exit(EXIT_FAILURE); } if (open("/dev/null", O_WRONLY) != 1) { snprintf(ebuf, sizeof(ebuf), "failed to open stdout from /dev/null (%s)\n", strerror(errno)); gdomap_log(LOG_CRIT); exit(EXIT_FAILURE); } if (is_daemon && open("/dev/null", O_WRONLY) != 2) { snprintf(ebuf, sizeof(ebuf), "failed to open stderr from /dev/null (%s)\n", strerror(errno)); gdomap_log(LOG_CRIT); exit(EXIT_FAILURE); } if (debug) { snprintf(ebuf, sizeof(ebuf), "Closed descriptors"); gdomap_log(LOG_DEBUG); } if (forked) { is_daemon = 1; #if defined(HAVE_SYSLOG) #if defined(SYSLOG_4_2) openlog ("gdomap", LOG_NDELAY); log_priority = LOG_DAEMON; #elif !defined(HAVE_SLOGF) openlog ("gdomap", LOG_NDELAY, LOG_DAEMON); #endif #endif } #endif /* !__MINGW__ */ init_my_port(); /* Determine port to listen on. */ init_ports(); /* Create ports to handle requests. */ if (interfaces == 0) { init_iface(); /* Build up list of network interfaces. */ } if (!is_local_host(loopback)) { snprintf(ebuf, sizeof(ebuf), "I can't find the loopback interface on this machine."); gdomap_log(LOG_ERR); snprintf(ebuf, sizeof(ebuf), "Perhaps you should correct your machine configuration or use the -a flag.\n" "Try 'gdomap -C' for more information.\n"); gdomap_log(LOG_INFO); if (interfaces < MAX_IFACE) { addr[interfaces].s_addr = loopback.s_addr; mask[interfaces] = class_c_mask; interfaces++; snprintf(ebuf, sizeof(ebuf), "I am assuming loopback interface on 127.0.0.1"); gdomap_log(LOG_INFO); } else { snprintf(ebuf, sizeof(ebuf), "You have too many network interfaces to add the loopback interface on " "127.0.0.1 - you need to change the 'MAX_IFACE' constant in gdomap.c and " "rebuild it."); gdomap_log(LOG_CRIT); exit(EXIT_FAILURE); } } /* Write the pidfile, but only if the user is root. This allows us to write to restricted directories without allowing normal users to mess it up. Because we are writing as root, we must be careful to create/open the file in exclusive mode */ if (pidfile) { FILE *fptr; #ifndef __MINGW__ if (getuid () == 0) #endif { int desc = open(pidfile, O_EXCL|O_CREAT|O_WRONLY, 0644); fptr = fdopen(desc, "w"); if (fptr == 0) { snprintf(ebuf, sizeof(ebuf), "Unable to create new pid file - '%s'", pidfile); gdomap_log(LOG_CRIT); exit(EXIT_FAILURE); } fprintf(fptr, "%d\n", (int) getpid()); fclose(fptr); chmod(pidfile, 0644); } #ifndef __MINGW__ else { snprintf(ebuf, sizeof(ebuf), "Only root user can write to pid file\n"); gdomap_log(LOG_WARNING); } #endif } { #ifndef __MINGW__ uid_t uid = -2; gid_t gid = -2; #endif #if defined(HAVE_PWD_H) #if defined(HAVE_GETPWNAM) struct passwd *pw = getpwnam("nobody"); if (pw != 0) { uid = pw->pw_uid; gid = pw->pw_gid; } #endif #endif #if !defined(__svr4__) /* * As another level of paranoia - jail this process to a directory */ #ifndef __MINGW__ if (0 == jail) { jail = "/tmp"; /* Not great, but better than nothing */ } if (chdir(jail) < 0) { snprintf(ebuf, sizeof(ebuf), "Unable to change directory to %s", jail); gdomap_log(LOG_CRIT); exit(EXIT_FAILURE); } if (geteuid() == 0) { if (chroot(jail) < 0) { snprintf(ebuf, sizeof(ebuf), "Unable to change root to %s", jail); gdomap_log(LOG_CRIT); exit(EXIT_FAILURE); } chdir("/"); } #endif /* __MINGW__ */ #endif /* __svr4__ */ #ifndef __MINGW__ /* * Try to become a 'safe' user now that we have * done everything that needs root priv. * * Try to be the user who launched us ... so they can kill us too. * Otherwise default to user nobody. */ if (getuid () != 0) { uid = getuid(); gid = getgid(); } /* The call to setgroups may fail if we don't have that capability ... * but in that case we aren't too bothered anyway. */ setgroups (1, &gid); if (setgid (gid) < 0) { snprintf(ebuf, sizeof(ebuf), "Failed setgid(%d) - %s", gid, strerror(errno)); gdomap_log(LOG_CRIT); exit(EXIT_FAILURE); } if (setuid (uid) < 0) { snprintf(ebuf, sizeof(ebuf), "Failed setuid(%d) - %s", uid, strerror(errno)); gdomap_log(LOG_CRIT); exit(EXIT_FAILURE); } if (getuid () == 0) { snprintf(ebuf, sizeof(ebuf), "Still running as root after trying to change"); gdomap_log(LOG_CRIT); exit(EXIT_FAILURE); } #endif /* __MINGW__ */ } init_probe(); /* Probe other name servers on net. */ if (debug) { snprintf(ebuf, sizeof(ebuf), "entering main loop.\n"); gdomap_log(LOG_DEBUG); } handle_io(); return 0; } /* * Name - queue_probe() * Purpose - Send a probe request to a specified host so we * can see if a name server is running on it. * We don't bother to check to see if it worked. */ static void queue_probe(struct in_addr* to, struct in_addr* from, int l, struct in_addr* e, int f) { struct sockaddr_in sin; gdo_req msg; if (debug > 2) { snprintf(ebuf, sizeof(ebuf), "Probing for server on '%s' from '", inet_ntoa(*to)); strncat(ebuf, inet_ntoa(*from), sizeof(ebuf) - strlen(ebuf) - 1); strncat(ebuf, "'", sizeof(ebuf) - strlen(ebuf) - 1); gdomap_log(LOG_DEBUG); if (l > 0) { int i; snprintf(ebuf, sizeof(ebuf), " %d additional local addresses sent -", l); gdomap_log(LOG_DEBUG); for (i = 0; i < l; i++) { snprintf(ebuf, sizeof(ebuf), " '%s'", inet_ntoa(e[i])); gdomap_log(LOG_DEBUG); } } } memset(&sin, '\0', sizeof(sin)); sin.sin_family = AF_INET; memcpy(&sin.sin_addr, to, sizeof(*to)); sin.sin_port = my_port; memset((char*)&msg, '\0', GDO_REQ_SIZE); if (f) { msg.rtype = GDO_PREPLY; } else { msg.rtype = GDO_PROBE; } msg.nsize = 2*IASIZE; msg.ptype = 0; msg.dummy = 0; msg.port = 0; memcpy(msg.name, from, IASIZE); memcpy(&msg.name[IASIZE], to, IASIZE); if (l > 0) { memcpy(&msg.name[msg.nsize], e, l*IASIZE); msg.nsize += l*IASIZE; } queue_msg(&sin, (uptr)&msg, GDO_REQ_SIZE); } /* Copyright (c) 2001 Neal H Walfield . This file is placed into the public domain. Its distribution is unlimited. THIS SOFTWARE IS PROVIDED ``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 OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* NAME xgethostname - get the host name. SYNOPSIS char *xgethostname (void); DESCRIPTION The xhostname function is intended to replace gethostname(2), a function used to access the host name. The old interface is inflexable given that it assumes the existance of the MAXHOSTNAMELEN macro, which neither POSIX nor the proposed Single Unix Specification version 3 guarantee to be defined. RETURN VALUE On success, a malloced, null terminated (possibly truncated) string containing the host name is returned. On failure, NULL is returned and errno is set. */ char * xgethostname (void) { int size = 0; int addnull = 0; char *buf; int err; #if defined(MAXHOSTNAMELEN) size = MAXHOSTNAMELEN; addnull = 1; #else /* MAXHOSTNAMELEN */ #if defined(_SC_HOST_NAME_MAX) size = sysconf (_SC_HOST_NAME_MAX); addnull = 1; #endif /* _SC_HOST_NAME_MAX */ #if defined(INTERNET_MAX_HOST_NAME_LENGTH) size = INTERNET_MAX_HOST_NAME_LENGTH; addnull = 1; #endif if (size <= 0) size = 256; #endif /* MAXHOSTNAMELEN */ buf = malloc (size + addnull); if (! buf) { errno = ENOMEM; return NULL; } err = gethostname (buf, size); while (err == -1 && errno == ENAMETOOLONG) { free (buf); size *= 2; buf = malloc (size + addnull); if (! buf) { errno = ENOMEM; return NULL; } err = gethostname (buf, size); } if (err) { if (buf) free (buf); errno = err; return NULL; } if (addnull) buf[size] = '\0'; return buf; } gnustep-base-1.29.0/Tools/gdomap.gsdoc000066400000000000000000000350041435650067400176040ustar00rootroot00000000000000 gdomap documentation richard@brainstorm.co.uk 1998 Free Software Foundation, Inc. gdomap

    The gdomap daemon is used by GNUstep programs to look up distributed objects of processes running across the network (and between different user accounts on a single machine). The deamon is NOT used for lookup where two processes belonging to the same user are using a host-local connection.

    If you are packaging GNUstep for inclusion in a software distribution you may want to skip to the final section of this document.

    Usually the gdomap daemon is started at system boot time and binds itself to port 538. (See the GNUstep Build Guide for a sample startup script.) It expects to receive fixed-size request packets for registering, deregistering, and looking up distributed objects servers. The response packets vary in length depending on the type and content of the information requested. In addition, limited support for federation is provided by a rudimentary gdomap-gdomap communications protocol.

    What follows is a description of gdomap from a developer perspective. For information pertinent for users, such as how to configure and start up gdomap, please see the man page for more information ("man 8 gdomap").

    The name server is intended to work with both the UDP and the TCP protocols. It is intended that the TCP interface be used by GNUstep programs, while the UDP interface is intended primarily for communication between name servers on different machines.

    Usage Scenario

    A complete distributed-objects "conversation" between a client and a server looks like the outline below. The gdomap daemon only plays a role in the "pre-" and "post-" phases. Everything else is conducted "peer-to-peer" between the two GNUstep processes.

    Pre-conversation Server registers an object as being available as the 'root object' on a particular port with a specific name. Client looks up a port by name. Conversation Client connects to the port and asks for the root object. Server returns proxy to root object. Client then proceeds to send messages to the object. Server sends message responses except where methods are declared 'oneway'. The server may also send messages to the client and have the client send responses. Eventually, the client or the server disconnects by invalidating port or connection or just exiting. Post-conversation On shutdown, the server unregisters the service name and port it used.
    How it Works and Why

    The fixed size of a request packet was chosen for maximum ease and speed of implementation of a non-blocking name server. The server knows how much it needs to read and can therefore usually do a read as a single operation since it doesn't have to read a little, figure out request length, allocate a buffer, and read the rest.

    The server name length (bytes) is specified - no assumptions should be made about whether the name contains nul characters or indeed about the name at all. This is future-proofing.

    Why UDP as well as TCP? The OpenStep specification says that a connection may be established to any host on the local network which supplys a named service if the host name is specified as '*'.

    This means that the application must poll to see if it can find a server with the name it wants. The polling could take a huge amount of time!

    To make this all easier - the server is capable of supplying a list of those hosts on the local network which it knows to have (or have had) a name server running on them.

    The application then need only poll those name servers to find the service it wants.

    However - to give the application a list of hosts, the name server must have got the information from somewhere. To gather the information the server has to poll the machines on the net which would take ages using TCP since attempts to talk to machines which are down or do not exist will take a while to time out.

    To make things speedy, the server sends out GDO_PROBE requests on UDP to all the machines on the net when it starts up. Each machine which has a name server notes that the new name server has started up and sends back a GDOPREPLY packet so that the new name server will know about it.

    Things are never perfect though - if a name server dies, the other name servers won't know, and will continue to tell applications that it is there.

    Port type codes - these are used to say what the port is for so that clients can look up only the names that are relevant to them. This is to permit the name server to be used for multiple communications protocols (at the moment, tcp or udp) and for different systems (distributed objects or others). This guarantees that if one app is using DO over UDP, its services will not be found by an app which is using DO over TCP.

    Communications Protocol

    The communications protocol is identical for both TCP and UDP and consists of a simple request-response sequence.

    Each request is a single message consisting of -

    a single byte request type a single byte giving name length, a single byte specifying the type of port being registered or looked up, or a nul byte for probe operations. a single nul byte. a four byte port number in network byte order must be present for register operations, otherwise this is zero. a service name of 0 to GDO_NAME_MAX_LEN bytes (or two IP addresses in network byte order and an optional list of additional addresses for probe operations) 0 to GDO_NAME_MAX_LEN nul bytes padding the service name to its full size. a terminating nul byte.

    The total is always sent in a packet with everything after the service name (except the final byte) cleared to nul bytes.

    Each response consists of at least 4 bytes and depends on the corresponding Request Type and where it came from as follows -

    GDO_LOOKUP Looks up the server name and returns its port number. Response is the port number in network byte order, or zero if the named server was not registered. GDO_REGISTER Registers the given server name with a port number. This service is only available to processes on the same host as the name server. Response is the port number in network byte order, or zero if the named server was already registered. GDO_UNREG Un-register the server name and return old port number. If the server name is of length zero, and the port is non-zero then all names for the port are unregistered. This service is only available to a process on the same host as this name server. Response is the old port number in network byte order, or zero if the name could not be un-registered. If multiple names were unregistered the response is the port for those names. GDO_SERVERS Return a list of the known servers on the local net. Response is an unsigned long (in network byte order) saying how many servers the name server knows about, followed by a list of their IP addresses in network byte order. NB. This response may not be possible over UDP as the response length may exceed the maximum UDP packet size. GDO_NAMES Return a list of registered names known to the server. Response is an unsigned long (in network byte order) saying how many bytes of data are to follow, followed by a list of the names each preceeded by the name length (a single byte) and port type (a byte). NB. This response may not be possible over UDP as the response length may exceed the maximum UDP packet size.

    The following are used for communications between name servers -

    GDO_PROBE Requests a response Passes two IP addresses in the name field - first the address of the sender, next that of the recipient. The packet may (optionally) include a variable number of addresses (as specified by the name length minus the size of the two addresses), each of which is an internet address on which the sender is also listening. For a request from a name server via UDP there is no response, but a GDO_REPLY request is sent. For a request from a non-name-server, or a TCP connect, the response is the port number of this server in network byte order. GDO_PREPLY Replies to a GDO_PROBE via UDP from a name server. The format of the message is as for GDO_PROBE. No response is sent.
    Notes for Packagers

    The gdomap process is a system daemon used to coordinate services between different machines. As such it should be started (as root) at system boot time (if inter-host messaging is desired), and you need to write the appropriate startup scripts for your system and put them in place when the package is installed.
    Alternatively you may install gdomap setuid to run as root, and GNUstep programs will launch it on demand ... but this is not recommended as it provides lass control than when you write a proper startup script.

    The default operation of gdomap is to probe the hosts on the local network to find other machines with copies of gdomap running, so that all the machines on the network can be kept informed of the seervices provided by GNUstep servers.
    This probing may be considered unfriendly by other users of the LAN, so it is usually better to provide a configuration file specifying the IP addresses of machines to be probed, and start up gdomap at boot time with the command line option to tell it to read the file.

    gnustep-base-1.29.0/Tools/gdomap.h000066400000000000000000000224671435650067400167450ustar00rootroot00000000000000/* Include for communications with GNUstep Distributed Objects name server. Copyright (C) 1996, 1997 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: October 1996 This file is part of the GNUstep Project. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* * About the GNU Distributed Objects name-server * * The name server is intended to work with both the UDP and the TCP * protocols. It is intended that the TCP interface be used by * GNUstep programs, while the UDP interface is intended primarily * for communication between name servers on different machines. * * The communications protocol is identical for both TCP and UDP and * consists of a simple request-response sequence. * * Each request is a single message consisting of - * a single byte request type, * a single byte giving name length, * a single byte specifying the type of port being registered * or looked up, or a nul byte for probe operations. * a single nul byte. * a four byte port number in network byte order must be * present for register operations, otherwise this is zero. * a service name of 0 to GDO_NAME_MAX_LEN bytes (or two IP * addresses in network byte order and an optional list of * additional addresseso for probe operations) * 0 to GDO_NAME_MAX_LEN nul bytes padding the service name to its * full size. * a terminating nul byte. * The total is always sent in a packet with everything after the * service name (except the final byte) cleared to nul bytes. * * Each response consists of at least 4 bytes and depends on the * corresponding request type and where it came from as follows - * * Request type Effect * * GDO_LOOKUP Looks up the server name and returns its port number. * Response is the port number in network byte order, * or zero if the named server was not registered. * * GDO_REGISTER Registers the given server name with a port number. * This service is only available to processes on the * same host as the name server. * Response is the port number in network byte order, * or zero if the named server was already registered. * * GDO_UNREG Un-register the server name and return old port number. * If the server name is of length zero, and the port is * non-zero then all names for the port are unregistered. * This service is only available to a process on the * same host as this name server. * Response is the old port number in network byte order, * or zero if the name could not be un-registered. * If multiple names were unregistered the response is * the port for those names. * * GDO_SERVERS Return a list of the known servers on the local net. * Response is an unsigned long (in network byte order) * saying how many servers the name server knows about, * followed by a list of their IP addresses in network * byte order. * NB. This response may not be possible over UDP as the * response length may exceed the maximum UDP packet size. * * GDO_NAMES Return a list of registered names known to the server. * Response is an unsigned long (in network byte order) * saying how many bytes of data are to follow, * followed by a list of the names each preceded by the * name length (a single byte) and port type (a byte). * NB. This response may not be possible over UDP as the * response length may exceed the maximum UDP packet size. * * The following are used for communications between name servers - * * GDO_PROBE Requests a response * Passes two IP addresses in the name field - first the * address of the sender, next that of the recipient. * The packet may (optionally) include a variable number * of addresses (as specified by the name length minus the * size of the two addresses), each of which is an internet * address on which the sender is also listening. * For a request from a name server via UDP there is no * response, but a GDO_REPLY request is sent. * For a request from a non-name-server, or a TCP * connect, the response is the port number of this * server in network byte order. * * GDO_PREPLY Replies to a GDO_PROBE via UDP from a name server. * The format of the message is as for GDO_PROBE. * No response is sent. * * * HOW IT WORKS AND WHY (implementation notes) * * 1. The fixed size of a request packet was chosen for maximum * ease and speed of implementation of a non-blocking name server. * The server knows how much it needs to read and can therefore * usually do a read as a single operation since it doesn't have * to read a little, figure out request length, allocate a buffer, * and read the rest. * * The server name length (bytes) is specified - no assumptions * should be made about whether the name contains nul characters * or indeed about the name at all. This is future-proofing. * * 2. Why UDP as well as TCP? * The OpenStep specification says that a connection may be * established to any host on the local network which supplys a * named service if the host name is specified as '*' * * This means that the application must poll to see if it can * find a server with the name it wants. The polling could take * a huge amount of time! * * To make this all easier - the server is capable of supplying * a list of those hosts on the local network which it knows to * have (or have had) a name server running on them. * * The application then need only poll those name servers to find * the service it wants. * * However - to give the application a list of hosts, the name * server must have got the information from somewhere. * To gather the information the server has to poll the machines * on the net which would take ages using TCP since attempts to * talk to machines which are down or do not exist will take a * while to time out. * * To make things speedy, the server sends out GDO_PROBE requests * on UDP to all the machines on the net when it starts up. * Each machine which has a name server notes that the new name * server has started up and sends back a GDOPREPLY packet so * that the new name server will know about it. * * Things are never perfect though - if a name server dies, the * other name servers won't know, and will continute to tell * applications that it is there. * * 3. Port type codes - these are used to say what the port is for so * that clients can look up only the names that are relevant to them. * This is to permit the name server to be used for multiple * communications protocols (at the moment, tcp or udp) and for * different systems (distributed objects or others). * This guarantees that if one app is using DO over UDP, its services * will not be found by an app which is using DO over TCP. */ #define GDOMAP_PORT (538) /* The well-known port for name server. */ /* * Request type codes */ #define GDO_REGISTER 'R' #define GDO_LOOKUP 'L' #define GDO_UNREG 'U' #define GDO_SERVERS 'S' #define GDO_PROBE 'P' #define GDO_PREPLY 'p' #define GDO_NAMES 'N' /* * Port type codes */ #define GDO_NET_MASK 0x70 /* Network protocol of port. */ #define GDO_NET_TCP 0x10 #define GDO_NET_UDP 0x20 #define GDO_SVC_MASK 0x0f /* High level protocol of port. */ #define GDO_SVC_GDO 0x01 #define GDO_SVC_FOREIGN 0x02 /* tcp/ip distributed object server. */ #define GDO_TCP_GDO (GDO_NET_TCP|GDO_SVC_GDO) /* udp/ip distributed object server. */ #define GDO_UDP_GDO (GDO_NET_UDP|GDO_SVC_GDO) /* tcp/ip simple socket connection. */ #define GDO_TCP_FOREIGN (GDO_NET_TCP|GDO_SVC_FOREIGN) /* udp/ip simple socket connection. */ #define GDO_UDP_FOREIGN (GDO_NET_UDP|GDO_SVC_FOREIGN) #define GDO_NAME_MAX_LEN 255 /* Max length registered name. */ /* * Structure to hold a request. */ typedef struct { unsigned char rtype; /* Type of request being made. */ unsigned char nsize; /* Length of the name to use. */ unsigned char ptype; /* Type of port registered. */ unsigned char dummy; unsigned int port; unsigned char name[GDO_NAME_MAX_LEN+1]; } gdo_req; #define GDO_REQ_SIZE sizeof(gdo_req) /* Size of a request packet. */ /* * If you have a fascist sysadmin who will not let you run gdomap * as root and will not even let you modify /etc/services to point * gdomap to another port, you can uncomment the next #define to * run gdomap on port 6006 (or modify this to a port of your choice). * Whatever port you choose, you should make sure that no other * processes running on your network use that number! * * When you have done this you must recompile gdomap.c and * NSPortNameServer.m and re-install the base library with * the new NSPortNameServer.o * * NB. Doing this will render your system unable to communicate with * other systems which have not performed the same remapping. You * should not do it unless you have no choice. */ /* #define GDOMAP_PORT_OVERRIDE 6006 */ gnustep-base-1.29.0/Tools/gsdoc-0_6_5.dtd000066400000000000000000000241451435650067400177220ustar00rootroot00000000000000 gnustep-base-1.29.0/Tools/gsdoc-0_6_6.dtd000066400000000000000000000337301435650067400177230ustar00rootroot00000000000000 gnustep-base-1.29.0/Tools/gsdoc-0_6_7.dtd000066400000000000000000000340211435650067400177160ustar00rootroot00000000000000 gnustep-base-1.29.0/Tools/gsdoc-1_0_0.dtd000066400000000000000000000340541435650067400177100ustar00rootroot00000000000000 gnustep-base-1.29.0/Tools/gsdoc-1_0_1.dtd000066400000000000000000000341631435650067400177120ustar00rootroot00000000000000 gnustep-base-1.29.0/Tools/gsdoc-1_0_1.rnc000066400000000000000000000513331435650067400177170ustar00rootroot00000000000000# # XML Document Type Definition for GNUstep Documentation Markup # Language (gsdoc). # # Written by Richard Frith-Macdonald # Based on GDML by 1997 Yoo C. Chung # This is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later # version. # # This document is distributed in the hope that it will be # useful, but WITHOUT ANY WARRANTY; without even the implied # warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General # Public License along with this software; if not, write to the # Software Foundation, Inc., 51 Franklin Street, Fifth Floor, # Boston, MA 02111 USA. ############################################################################# # Note, the normative form of this document is the DTD. # This Relax-NG version generated by Adrian Robert using the trang tool. # It can be used for realtime validation and autocompletion with the # emacs nxml-mode by James Clark. Get it from # http://www.thaiopensource.com/download/ . # # Set it up with '(load "nxml-mode-20040910/rng-auto.el")' in your .emacs. # While you're at it, put insert this as well: # (setq auto-mode-alist (cons '("\\.gsdoc$" . nxml-mode) auto-mode-alist)) # # Fire up a new emacs and hit 'alt-x customize-apropos rng', then add a file # "/pathToHome/[username]/.schemas.xml" to 'Rng Schema Locating Files'. # Then make a file in your home directory called ".schemas.xml" and put in # it the following lines: # # # # # # # (Replace GNUSTEP_SYSTEM_LIBRARY by the correct real path on your system.) # # Voila, whenever you edit a .gsdoc file its validity will be continuously # checked, errors will be highlighted, and you can complete tags and # attributes using 'ctrl-enter'. 'Ctrl-c ctrl-f' autocloses tags. ############################################################################# # gsdoc is an XML language - Typical usage: # # # # # ***** Character entities. ***** # General purpose characters for gsdoc. # copyright symbol # trademark symbol # ellipsis (...) # non breakable space # ampersand # apos # quotation mark (") # lesser than symbol # greater than symbol namespace a = "http://relaxng.org/ns/compatibility/annotations/1.0" # ***** Entity declarations. ***** # Boolean values for attributes boolean = "yes" | "no" # Entity for phrase elements. phrase = element.var | element.ivar | element.em | element.code | element.strong | element.file | element.site # Entity for cross references. xref = element.ref | element.uref | element.url | element.email | element.prjref # Entity for anchors. anchor = element.label | element.entry # Entity for simple text level elements. \text = text | xref | anchor | phrase | element.footnote | element.br # Entity for list elements. \list = element.list | element.enum | element.deflist | element.qalist | element.dictionary # Entity for block level elements. block = \text | \list | element.p | element.example | element.embed | element.index # Entity for definition elements and blocks. defblock = \text | \list | element.heading | element.p | element.example | element.embed | element.index | element.class | element.category | element.protocol | element.function | element.macro | element.type | element.variable | element.constant | element.EOModel | element.EOEntity # ********** End entity declarations # Used for describing something. element.desc = element desc { attlist.desc, block* } attlist.desc &= empty # A footnote. element.footnote = element footnote { attlist.footnote, \text* } attlist.footnote &= empty # ***** Phrase elements. ***** # The content is a metasyntactic variable or argument name. element.var = element var { attlist.var, \text* } attlist.var &= empty # The content is a metasyntactic ivariable name. element.ivar = element ivar { attlist.ivar, \text* } attlist.ivar &= empty # Emphasize the content. element.em = element em { attlist.em, \text* } attlist.em &= empty # The content is too important that simple emphasizing isn't enough. element.strong = element strong { attlist.strong, \text* } attlist.strong &= empty # The content is either a name for code (e.g. class names), or a # relatively short code fragment. element.code = element code { attlist.code, \text* } attlist.code &= empty # The content is a file name. element.file = element file { attlist.file, text* } attlist.file &= empty # The content is a fully qualified domain name on the Internet. element.site = element site { attlist.site, text* } attlist.site &= empty # ***** List elements. ***** # An item in a list. element.item = element item { attlist.item, block* } attlist.item &= empty # An enumerated list. element.enum = element enum { attlist.enum, element.item+ } attlist.enum &= empty # A ordinary, unnumbered list. element.list = element list { attlist.list, element.item+ } attlist.list &= empty # A term to defined in a definition list. element.term = element term { attlist.term, \text* } attlist.term &= empty # A definition list. element.deflist = element deflist { attlist.deflist, (element.term, element.desc)+ } attlist.deflist &= empty # A question for a question and answer list. element.question = element question { attlist.question, \text* } attlist.question &= empty # An answer for a question and answer list. element.answer = element answer { attlist.answer, block* } attlist.answer &= empty # A question and answer list. element.qalist = element qalist { attlist.qalist, (element.question, element.answer)+ } attlist.qalist &= empty # ********** # ***** Cross references. ***** # A reference. # ID of the reference. # TYPE of reference, if implied, a reference to a label. # CLASS specific class for a method, may be one of the following formats - # classname, classname(categoryname), (protocolname) element.ref = element ref { attlist.ref, \text* } attlist.ref &= attribute id { text }, [ a:defaultValue = "label" ] attribute type { "class" | "category" | "protocol" | "method" | "ivariable" | "function" | "type" | "macro" | "variable" | "constant" | "label" | "EOModel" | "EOEntity" | "tool" }?, attribute class { text }? # An e-mail address. element.email = element email { attlist.email, \text* } attlist.email &= attribute address { text }? # A URL. element.url = element url { attlist.url, empty } attlist.url &= attribute url { text }? # A reference to a URL. # The text contained appears in the output. element.uref = element uref { attlist.uref, \text* } attlist.uref &= attribute url { text } # A reference to a project. # The text contained appears in the output. element.prjref = element prjref { attlist.prjref, \text* } attlist.prjref &= attribute prjname { text }?, attribute file { text }? # ***** Anchors. ***** # An anchor for a general reference. # The text contained appears in the output. # If the id attribute is omitted, the text is used in its place. element.label = element label { attlist.label, \text* } attlist.label &= attribute id { text }? # An entry for the general index. # The text that is contained appears in the index, and never in # the text itself. # If the id attribute is omitted, the text is used in its place. element.entry = element entry { attlist.entry, \text* } attlist.entry &= attribute id { text }? # Entity for standard elements. element.GNUstep = element GNUstep { attlist.GNUstep, empty } attlist.GNUstep &= empty element.OpenStep = element OpenStep { attlist.OpenStep, empty } attlist.OpenStep &= empty element.NotOpenStep = element NotOpenStep { attlist.NotOpenStep, empty } attlist.NotOpenStep &= empty element.MacOS-X = element MacOS-X { attlist.MacOS-X, empty } attlist.MacOS-X &= empty element.NotMacOS-X = element NotMacOS-X { attlist.NotMacOS-X, empty } attlist.NotMacOS-X &= empty # A standard that something is or isn't compliant with. standard = element.GNUstep | element.OpenStep | element.NotOpenStep | element.MacOS-X | element.NotMacOS-X element.standards = element standards { attlist.standards, standard* } attlist.standards &= empty # ***** Argument elements. ***** # An argument. element.arg = element arg { attlist.arg, text* } attlist.arg &= attribute type { text }? # Denotes that the rest of the arguments is a variable list, # like in printf(). element.vararg = element vararg { attlist.vararg, empty } attlist.vararg &= empty # ***** Method elements. ***** # A component for a method selector. element.sel = element sel { attlist.sel, text* } attlist.sel &= empty # A method. If there is no DESC, it is understood that the element # is used to override some information from the same method in the # superclass. # If factory not set, instance method element.method = element method { attlist.method, ((element.sel, element.arg?), (element.sel, element.arg)*, element.vararg?), element.desc?, element.standards? } attlist.method &= attribute type { text }?, [ a:defaultValue = "no" ] attribute factory { boolean }?, [ a:defaultValue = "no" ] attribute init { boolean }?, attribute override { "subclass" | "never" }? # ***** Elements for definitions of classes, functions, etc. ***** # Show what header file something lives in. element.declared = element declared { attlist.declared, text* } attlist.declared &= empty # A macro definition. element.macro = element macro { attlist.macro, (element.arg*, element.vararg?), element.declared?, element.desc?, element.standards? } attlist.macro &= attribute name { text } # A type definition. element.type = element type { attlist.type, element.declared?, element.desc?, element.standards? } attlist.type &= attribute name { text }, attribute type { text } # Variable definition. # VALUE may be set for a constant or a default value element.variable = element variable { attlist.variable, element.declared?, element.desc?, element.standards? } attlist.variable &= attribute name { text }, attribute type { text }, attribute value { text }? # Ivariable definition. element.ivariable = element ivariable { attlist.ivariable, element.desc?, element.standards? } attlist.ivariable &= attribute name { text }, attribute type { text }, [ a:defaultValue = "public" ] attribute validity { "public" | "protected" | "private" }? # Constant definition. # VALUE may be set for a constant or a default value element.constant = element constant { attlist.constant, element.declared?, element.desc?, element.standards? } attlist.constant &= attribute name { text }, attribute type { text }, attribute value { text }?, attribute role { "except" | "defaults" | "notify" | "key" }? # A function definition. element.function = element function { attlist.function, (element.arg*, element.vararg?), element.declared?, element.desc?, element.standards? } attlist.function &= attribute name { text }, attribute type { text } # Protocol definition. element.protocol = element protocol { attlist.protocol, element.declared?, element.conform*, element.desc?, element.method*, element.standards? } attlist.protocol &= attribute name { text } # Category definition. element.category = element category { attlist.category, element.declared?, element.conform*, element.desc?, element.method*, element.standards? } attlist.category &= attribute name { text }, attribute class { text } # Show a protocol a class conforms to. element.conform = element conform { attlist.conform, text* } attlist.conform &= empty element.class = element class { attlist.class, element.declared?, element.conform*, element.desc?, element.ivariable*, element.method*, element.standards? } attlist.class &= attribute name { text }, attribute super { text }? # ***** Elements for definitions of EOModels, etc. ***** # a dictionary Item. element.dictionaryItem = element dictionaryItem { attlist.dictionaryItem, block* } attlist.dictionaryItem &= attribute key { text }, attribute value { text }? # a dictionary element.dictionary = element dictionary { attlist.dictionary, element.dictionaryItem+ } attlist.dictionary &= empty element.EOConnectionDictionary = element EOConnectionDictionary { attlist.EOConnectionDictionary, element.dictionaryItem+ } attlist.EOConnectionDictionary &= empty element.EOUserDictionary = element EOUserDictionary { attlist.EOUserDictionary, element.dictionaryItem+ } attlist.EOUserDictionary &= empty # EORelationshipComponent element.EORelationshipComponent = element EORelationshipComponent { attlist.EORelationshipComponent, element.EORelationshipComponent* } attlist.EORelationshipComponent &= attribute definition { text } # EOJoin element.EOJoin = element EOJoin { attlist.EOJoin, element.desc? } attlist.EOJoin &= attribute relationshipName { text }?, attribute joinOperator { text }, attribute joinSemantic { text }, attribute sourceAttribute { text }, attribute destinationAttribute { text } # EORelationship element.EORelationship = element EORelationship { attlist.EORelationship, (element.EORelationshipComponent | element.EOJoin*), element.EOUserDictionary?, element.desc? } attlist.EORelationship &= attribute entityName { text }, attribute destinationEntityName { text }, attribute name { text }, attribute isToMany { text }? # EOAttributeRef element.EOAttributeRef = element EOAttributeRef { attlist.EOAttributeRef, empty } attlist.EOAttributeRef &= attribute name { text } # EOPrimaryKeyAttributes element.EOPrimaryKeyAttributes = element EOPrimaryKeyAttributes { attlist.EOPrimaryKeyAttributes, element.EOAttributeRef+ } attlist.EOPrimaryKeyAttributes &= empty # EOClassProperties element.EOClassProperties = element EOClassProperties { attlist.EOClassProperties, element.EOAttributeRef+ } attlist.EOClassProperties &= empty # EOAttributesUsedForLocking element.EOAttributesUsedForLocking = element EOAttributesUsedForLocking { attlist.EOAttributesUsedForLocking, element.EOAttributeRef+ } attlist.EOAttributesUsedForLocking &= empty # EOAttribute element.EOAttribute = element EOAttribute { attlist.EOAttribute, element.EOUserDictionary?, element.desc? } attlist.EOAttribute &= attribute columnName { text }?, attribute definition { text }?, attribute externalType { text }?, attribute name { text }, attribute valueClassName { text }?, attribute valueType { text }?, attribute entityName { text }?, attribute isReadOnly { text }?, attribute isDerived { text }?, attribute isFlattened { text }? # EOEntity element.EOEntity = element EOEntity { attlist.EOEntity, element.EOAttribute*, element.EOAttributesUsedForLocking?, element.EOClassProperties?, element.EOPrimaryKeyAttributes?, element.EORelationship*, element.EOUserDictionary?, element.desc? } attlist.EOEntity &= attribute name { text }, attribute externalName { text }?, attribute className { text }?, attribute modelName { text }?, attribute isReadOnly { text }? # EOModel element.EOModel = element EOModel { attlist.EOModel, element.EOConnectionDictionary?, (element.EOEntity+ | element.list), element.EOUserDictionary?, element.desc? } attlist.EOModel &= attribute name { text }, attribute version { text }?, attribute adaptorName { text }, attribute adaptorClassName { text } # ***** Elements for ordinary block level elements. ***** # A line break. element.br = element br { attlist.br, empty } attlist.br &= empty # A paragraph. element.p = element p { attlist.p, \text* } attlist.p &= empty # An example. element.example = element example { attlist.example, text* } attlist.example &= attribute caption { text }? # An embedded object. If it is of a type that the SGML processor # cannot handle, then use the content, which is ignored otherwise. # refer - method of referring to object (default is file) # src - the reference to the object # type - Internet media type of the objec # title - optional title describing object element.embed = element embed { attlist.embed, block* } attlist.embed &= attribute refer { "file" | "url" }?, attribute src { text }, attribute type { text }?, attribute title { text }? # ***** Elements for document structure such as chapters. ***** # A heading for chapters, sections, ... element.heading = element heading { attlist.heading, \text* } attlist.heading &= empty # A subsubsection. element.subsubsect = element subsubsect { attlist.subsubsect, defblock* } attlist.subsubsect &= attribute id { text }? # A subsection. element.subsect = element subsect { attlist.subsect, (defblock | element.subsubsect)* } attlist.subsect &= attribute id { text }? # A section. element.section = element section { attlist.section, (defblock | element.subsect)* } attlist.section &= attribute id { text }? # A chapter. element.chapter = element chapter { attlist.chapter, (defblock | element.section)* } attlist.chapter &= attribute id { text }? # ***** Elements that make searching for things easier. ***** # Table of contents. element.contents = element contents { attlist.contents, empty } attlist.contents &= empty # Index ... generates an index of the specified type of elements. # 'scope' determines whether the index is generated for the current file # or for the whole of the current project, or for everything the software # can find (global) ... if the document is processed in a standalone manner, # the scope if always file. For method or ivariable indexing, if the index # is inside a class, protocol, or category, only indexes for that unit # should be generated. # 'type' determines the type of entry listed in the index. The 'title' # type really only makes sense for a project scope index as it produces # a list of the files in the project (by title). element.index = element index { attlist.index, empty } attlist.index &= [ a:defaultValue = "label" ] attribute type { "class" | "category" | "protocol" | "method" | "ivariable" | "function" | "type" | "macro" | "variable" | "constant" | "EOModel" | "EOEntity" | "label" | "title" | "tool" }?, [ a:defaultValue = "file" ] attribute scope { "file" | "project" | "global" }?, [ a:defaultValue = "normal" ] attribute style { "normal" | "bare" }?, attribute target { text }? # ***** Elements that describe the document itself. ***** # Copyright of the document. element.copy = element copy { attlist.copy, \text* } attlist.copy &= empty # An abstract. element.abstract = element abstract { attlist.abstract, \text* } attlist.abstract &= empty # The version of the document. element.version = element version { attlist.version, \text* } attlist.version &= empty # The date the document was written. element.date = element date { attlist.date, \text* } attlist.date &= empty # An author. element.author = element author { attlist.author, element.email?, element.url?, element.desc? } attlist.author &= attribute name { text } # The title of the document. element.title = element title { attlist.title, \text* } attlist.title &= empty # ***** The topmost structures for the document body. ***** # Unnumbered parts appearing in the front, such as a preface. element.front = element front { attlist.front, element.contents?, element.chapter* } attlist.front &= empty # Unnumbered parts appearing in the back, such as an afterword and/or # indices. element.back = element back { attlist.back, element.chapter*, element.index* } attlist.back &= empty # ***** The topmost structures for the document. ***** # The head containing general information about the document. element.head = element head { attlist.head, element.title, element.author*, element.version?, element.date?, element.abstract?, element.copy? } attlist.head &= empty # The main part of the document. element.body = element body { attlist.body, element.front?, element.chapter+, element.back? } attlist.body &= empty # ********** # The entire document. element.gsdoc = element gsdoc { attlist.gsdoc, element.head, element.body } attlist.gsdoc &= attribute base { text }?, attribute next { text }?, attribute prev { text }?, attribute up { text }?, attribute stylesheeturl { text }? start = element.gsdoc gnustep-base-1.29.0/Tools/gsdoc-1_0_2.dtd000066400000000000000000000367231435650067400177170ustar00rootroot00000000000000 gnustep-base-1.29.0/Tools/gsdoc-1_0_3.dtd000066400000000000000000000367311435650067400177170ustar00rootroot00000000000000 gnustep-base-1.29.0/Tools/gsdoc-1_0_4.dtd000066400000000000000000000367411435650067400177210ustar00rootroot00000000000000 gnustep-base-1.29.0/Tools/gsdoc.7000066400000000000000000000037211435650067400165040ustar00rootroot00000000000000.\"gsdoc(1) man page .\"written by Adrian Robert .\"Copyright (C) 2005 Free Software Foundation, Inc. .\" .\"Process this file with .\"groff -man -Tascii gsdoc.7 .\" .TH GSDOC 1 "March 2004" GNUstep "GNUstep System Manual" .SH NAME GSDoc \- GNUstep XML documentation format .SH DESCRIPTION GSDoc is an XML language designed specifically for writing documentation for the GNUstep project. In practice, that means that it is designed for writing about software, and in particular, for writing about Objective-C classes. .SH DEFINITION The GSDoc markup language is defined by an SGML DTD, that specifies the tags that may be used in marking up a GSDoc document, and how and where those tags may be placed. The reader is encouraged to consult the DTD directly on any points that the other documentation leaves unclear. The DTD is stored under \fIGNUSTEP_SYSTEM_LIBRARY/DTDs\fR in a standard GNUstep installation... where GNUSTEP_SYSTEM_LIBRARY is defined in the GNUstep configuration file (GNUstep.conf). .SH USAGE GSDoc may be written by hand, but it is primarily autogenerated from Objective-C source files by a tool called \fIautogsdoc\fR. See the man page for that tool for more information. This tool also converts GSDoc into HTML for viewing. In the future it is planned to convert the XML into HTML, texinfo, man page, and other formats using XSLT. .SH OTHER DOCUMENTATION The primary documentation source for GSDoc is the GNUstep system HTML documentation, under the Tools section. In a standard GNUstep installation this should be found under \fIGNUSTEP_SYSTEM_DOC/Developer/Tools\fR... where GNUSTEP_SYSTEM_DOC is defined in the GNUstep configuration file (GNUstep.conf). .SH SEE ALSO .P autogsdoc(1), GNUstep(7) .P .SH HISTORY The GSDoc format was developed for GNUstep based on the earlier GDML SGML language. .P This manual page first appeared in gnustep-base 1.9.2 (March 2004). .P .SH AUTHORS .B gsdoc was defined by Richard Frith-Macdonald gnustep-base-1.29.0/Tools/gsdoc.gsdoc000066400000000000000000001174641435650067400174470ustar00rootroot00000000000000 GNUstep Documentation XML markup language (GSDoc) A person who devotes far too much time to GNUstep development. 1.0.3 6 Nov, 2006 This documents the GNUstep Documentation markup language. Free Software Foundation, Inc. Introduction

    The GNUstep documentation markup language (GSDoc) is an XML language designed specifically for writing documentation for the GNUstep project. In practice, that means that it is designed for writing about software, and in particular, for writing about Objective-C classes.

    This document itself is an example, as well as a test case, of GSDoc itself.

    Why another documentation language?

    There are several reasons for producing the new markup language -

    There were no existing markup languages that dealt well with documenting software written in the Objective-C language, except the GDML language - which has no easy to use support software. While the DocBook system works nicely for general software documentation, it requires a relatively large amount of support software and comes with a lot of baggage that's not directly useful for GNUstep. The GNU info system comes with easy to use, lightweight conversion tools, but is particularly ill suited to Objective-C documentation because the colon character using in Objective-C method names is used in info markup. LinuxDoc, while being a nice basic system, seems to be in the process of being replaced by DocBook.

    So, with only one markup language available that supported Objective-C, and with XML software becoming available, the decision was to take GDML and update it to be an XML language, in the hope that this would -

    Provide optimal support for GNUstep documentation. Minimize the amount of work needed for development of software tools. Provide future-proofing in that documentation written in one XML language should be quite easy to convert to another if necessary.
    The gsdoc DTD and what it means

    The GSDoc markup language is defined by an SGML DTD, that specifies the tags that may be used in marking up a GSDoc document, and how and where those tags may be placed. The reader is encouraged to consult the DTD directly on any points that the present document leaves unclear. The DTD is stored under GNUSTEP_SYSTEM_LIBRARY/DTDs in a standard GNUstep installation. .. where GNUSTEP_SYSTEM_LIBRARY is defined in the GNUstep configuration file (GNUstep.conf).

    The gsdoc DTD defines an XML language - that is, a markup language that conforms to a specific subset of SGML features defined as XML. The advantage of XML is that it provides most of the useful features of SGML while being much more light-weight (easy to use) because you can forget about the rest of SGML. As XML looks set to become increasingly popular, we can hope that documentation written with an XML language will be easily imported into XML software tools as they become available, so we will not (in the GNUstep project) need to devote a lot of time and effort to maintaining documentation tools.

    Element reference

    The allowable elements in GSDoc documents are described below, broken into sections by usage context.

    gnustep-base-1.29.0/Tools/gspath.1000066400000000000000000000030231435650067400166600ustar00rootroot00000000000000.\"gspath(1) man page .\"put together by Richard Frith-Macdoanld .\"Copyright (C) 2005 Free Software Foundation, Inc. .\"Copying and distribution of this file, with or without modification, .\"are permitted in any medium without royalty provided the copyright .\"notice and this notice are preserved. .\" .\"Process this file with .\"groff -man -Tascii gspath.1 .\" .TH GSPATH 1 "July 2005" GNUstep "GNUstep System Manual" .SH NAME gspath \- Utility to display standard directory/path information .SH SYNOPSIS .B gspath .P .SH DESCRIPTION This utility can be used to print out a single directory or path in order for external applications to know what paths the GNUstep system is using. It was written to provide information for the GNUstep make package. .P The .B gspath usility is called with exactly one argument, which determines what it prints. .P .SH Arguments To display the path to the defaults directory for the current user, use the .B defaults argument. .P To display the directory search path needed to locate dynamic libraries, use the .B libpath argument. .P To display the directory search path needed to locate commmand-line programs, use the .B path argument. .P To display the GNUstep home directory of the current user, use the .B user argument. .P .SH HISTORY Work on .B gspath started July 2005. .PP This manual page first appeared in gnustep-base 1.11.1 (July 2005). .P .SH AUTHORS .B gspath was written by Richard Frith-Macdonald . .PP This man page was written by Richard Frith-Macdonald . gnustep-base-1.29.0/Tools/gspath.m000066400000000000000000000117131435650067400167610ustar00rootroot00000000000000/** This utility provides path/directory layout information for GNUstep. Copyright (C) 2005 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: July 2005 This file is part of the GNUstep Project This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. You should have received a copy of the GNU General Public License along with this program; see the file COPYINGv3. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #import "common.h" #import "Foundation/NSArray.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSPathUtilities.h" #import "Foundation/NSProcessInfo.h" #import "Foundation/NSUserDefaults.h" /**

    The 'gspath' utility prints out various items of path/directory information (one item at a time).
    The program always takes a single argument ... selecting the information to be printed.

    The arguments and their meanings are -
    defaults The GNUstep defaults directory of the current user devpath A path specification which may be used to add the root(s) of the GNUstep development environment on the current system. libpath A path specification which may be used to add all the standard GNUstep directories where dynamic libraries are normally stored.
    you might do 'LD_LIBRARY_PATH=$LD_LIBRARY_PATH:`gspath libpath`' to make use of this.
    path A path specification which may be used to add all the standard GNUstep directories where command-line programs are normally stored.
    you might do 'PATH=$PATH:`gspath path`' to make use of this.
    user The GNUstep home directory of the current user
    */ int main(int argc, char** argv, char **env) { NSAutoreleasePool *pool; NSProcessInfo *proc; NSArray *args; #ifdef GS_PASS_ARGUMENTS GSInitializeProcess(argc, argv, env); #endif pool = [NSAutoreleasePool new]; proc = [NSProcessInfo processInfo]; if (proc == nil) { GSPrintf(stderr, @"gspath: unable to get process information!\n"); [pool drain]; return 1; } args = [proc arguments]; if ([args count] == 2) { BOOL ok = YES; NSString *name = [[args objectAtIndex: 1] lowercaseString]; NSString *sep; #ifdef __MINGW__ sep = @";"; #else sep = @":"; #endif if ([name isEqualToString: @"defaults"] == YES) { GSPrintf(stdout, @"%@", GSDefaultsRootForUser(nil)); } else if ([name isEqualToString: @"path"] == YES) { NSArray *directories; NSString *path; directories = NSSearchPathForDirectoriesInDomains (GSToolsDirectory, NSAllDomainsMask, YES); path = [directories componentsJoinedByString: sep]; GSPrintf(stdout, @"%@", path); } else if ([name isEqualToString: @"devpath"] == YES) { NSArray *directories; NSString *path; directories = NSSearchPathForDirectoriesInDomains (NSDeveloperDirectory, NSAllDomainsMask, YES); path = [directories componentsJoinedByString: sep]; GSPrintf(stdout, @"%@", path); } else if ([name isEqualToString: @"libpath"] == YES) { NSArray *directories; NSString *path; directories = NSSearchPathForDirectoriesInDomains (GSLibrariesDirectory, NSAllDomainsMask, YES); path = [directories componentsJoinedByString: sep]; GSPrintf(stdout, @"%@", path); } else if ([name isEqualToString: @"user"] == YES) { GSPrintf(stdout, @"%@", NSHomeDirectory()); } else { ok = NO; // Unrecognised option } if (ok == YES) { [pool drain]; return 0; } } GSPrintf(stderr, @"The 'gspath' utility prints out various items of path/directory\n" @"information (one item at a time).\n" @"The program always takes a single argument ... selecting the information\n" @"to be printed.\n\n" @"The arguments and their meanings are -\n\n" @"defaults\n" @" The GNUstep defaults directory of the current user.\n\n" @"devpath\n" @" A path specification which may be used to add the root(s) of\n" @" the GNUstep development environment on the current system.\n\n" @"libpath\n" @" A path specification which may be used to add all the standard GNUstep\n" @" directories where dynamic libraries are normally stored.\n\n" @" you might do 'LD_LIBRARY_PATH=$LD_LIBRARY_PATH:`gspath libpath`' to make\n" @" use of this.\n\n" @"path\n" @" A path specification which may be used to add all the standard GNUstep\n" @" directories where command-line programs are normally stored.\n" @" you might do 'PATH=$PATH:`gspath path`' to make use of this.\n\n" @"user\n" @" The GNUstep home directory of the current user\n\n" ); [pool drain]; return 1; } gnustep-base-1.29.0/Tools/locale_alias.m000066400000000000000000000065151435650067400201070ustar00rootroot00000000000000/* locale_alias - Test program to create a file of locale to language name aliases Copyright (C) 2005 Free Software Foundation, Inc. Written: Adam Fedor Date: Oct 2000 AFAIK: This only works on machines that support setlocale. The files created may require hand editing. This file is part of the GNUstep Project This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. You should have received a copy of the GNU General Public License along with this program; see the file COPYINGv3. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #import "common.h" #include #include #include #include #include #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSDictionary.h" #import "GNUstepBase/GSLocale.h" #define MAXSTRING 100 static int debug=1; NSMutableDictionary *dict; int loc_read_file(const char *dir, const char *file) { FILE *fp; char name[1000], *s; char buf[1000]; char locale[MAXSTRING], language[MAXSTRING], country[MAXSTRING]; if (strcmp(file, "POSIX") == 0) return 0; snprintf(name, sizeof(name), "%s/%s", dir, file); fp = fopen(name, "r"); if (fp == NULL) return -1; language[0] = '\0'; country[0] = '\0'; while (NULL != fgets(buf, MAXSTRING, fp)) { if (strstr(buf, "anguage") != NULL) { sscanf(&buf[2], "%s", language); } if ((s = strstr(buf, "ocale for")) != NULL) { strncpy(country, s + 10, sizeof(country) - 1); country[sizeof(country) - 1] = '\0'; s = strchr(country, '\n'); if (s) *s = '\0'; } if (strlen(language) > 0) break; } strncpy(locale, file, sizeof(locale) - 1); locale[sizeof(locale) - 1] = '\0'; if (strlen(country) > 0 && strcmp(country, language) != 0) { strncat(country, language, sizeof(country) - 1 - strlen(country)); [dict setObject: [NSString stringWithUTF8String: country] forKey: [NSString stringWithUTF8String: locale]]; } locale[2] = '\0'; [dict setObject: [NSString stringWithUTF8String: language] forKey: [NSString stringWithUTF8String: locale]]; fclose(fp); return 0; } /* Go through all the files in the directory */ int loc_get_files(const char *dir) { struct dirent *dp; DIR *dirp; dirp = opendir(dir); while ((dp = readdir(dirp)) != NULL) { if (isalpha((dp->d_name)[0])) { if (debug) printf(" checking %s ...\n", dp->d_name); loc_read_file(dir, dp->d_name); } } closedir(dirp); return 0; } int main(int argc, char *argv[]) { NSString *lang; char *l; CREATE_AUTORELEASE_POOL(pool); l = setlocale(LC_ALL, ""); printf("Locale is %s\n", l); /* Create Locale.aliases */ dict = [NSMutableDictionary dictionary]; loc_get_files("/usr/share/i18n/locales"); [dict writeToFile: @"Locale.aliases" atomically: NO]; /* Write out a skeleton file from the current locale */ dict = GSDomainFromDefaultLocale(); lang = GSLanguageFromLocale(GSSetLocale(0,NULL)); if (lang == nil) lang = @"Locale"; if (dict) [dict writeToFile: lang atomically: NO]; DESTROY(pool); return 0; } gnustep-base-1.29.0/Tools/make_strings/000077500000000000000000000000001435650067400200005ustar00rootroot00000000000000gnustep-base-1.29.0/Tools/make_strings/.cvsignore000066400000000000000000000000051435650067400217730ustar00rootroot00000000000000*obj gnustep-base-1.29.0/Tools/make_strings/GNUmakefile000066400000000000000000000025131435650067400220530ustar00rootroot00000000000000# # make_strings makefile for GNUstep Base Library # Copyright (C) 2002 Free Software Foundation, Inc. # # Written by: Adam Fedor # # This file is part of the GNUstep Base Library. # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public # License as published by the Free Software Foundation; either # version 2 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 # General Public License for more details. # # You should have received a copy of the GNU General Public # License along with this library; if not, write to the Free # Software Foundation, Inc., 51 Franklin Street, Fifth Floor, # Boston, MA 02111 USA. PACKAGE_NAME = gnustep-base GNUSTEP_LOCAL_ADDITIONAL_MAKEFILES=../../base.make include $(GNUSTEP_MAKEFILES)/common.make include ../../config.mak VERSION = 0.4.2 TOOL_NAME = make_strings MAN1_PAGES = make_strings.1 make_strings_OBJC_FILES = \ make_strings.m \ SourceEntry.m \ StringsEntry.m \ StringsFile.m CONFIG_SYSTEM_LIBS := include GNUmakefile.preamble include $(GNUSTEP_MAKEFILES)/tool.make include GNUmakefile.postamble gnustep-base-1.29.0/Tools/make_strings/GNUmakefile.postamble000066400000000000000000000047731435650067400240520ustar00rootroot00000000000000# -*-makefile-*- # # Makefile.postamble # # Copyright (C) 2005, Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # This program is distributed in the # hope that it will be useful, but WITHOUT ANY WARRANTY; without even # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. # # Project specific makefile rules # # Uncomment the targets you want. # The double colons (::) are important, do not make them single colons # otherwise the normal makefile rules will not be performed. # # Things to do before compiling # before-all:: # Things to do after compiling # after-all:: # Things to do before installing before-install:: # Things to do after installing after-install:: if [ ! -f $(GNUSTEP_DOC_MAN) ]; then \ $(MKDIRS) $(GNUSTEP_DOC_MAN); \ fi; \ if [ ! -f $(GNUSTEP_DOC_MAN)/man1 ]; then \ $(MKDIRS) $(GNUSTEP_DOC_MAN)/man1; \ fi; \ for file in $(MAN1_PAGES) __done; do \ if [ $$file != __done ]; then \ $(INSTALL_DATA) $$file $(GNUSTEP_DOC_MAN)/man1/$$file; \ which gzip && rm -f $(GNUSTEP_DOC_MAN)/man1/$$file.gz \ && gzip -9 $(GNUSTEP_DOC_MAN)/man1/$$file; \ fi; \ done; \ # Things to do before uninstalling before-uninstall:: for file in $(MAN1_PAGES); do \ rm -f $(GNUSTEP_DOC_MAN)/man1/$$file.gz; \ done; -rmdir $(GNUSTEP_DOC_MAN)/man1; -rmdir $(GNUSTEP_DOC_MAN); # Things to do after uninstalling # after-uninstall:: # Things to do before cleaning # before-clean:: # Things to do after cleaning # after-clean:: # Things to do before distcleaning # before-distclean:: # Things to do after distcleaning # after-distclean:: # Things to do before checking # before-check:: # Things to do after checking # after-check:: # # If building with the Apple Foundation, we don't include the base 'Headers' # directory in the includes path, but we need the additions headers so we # link to them from the current directory. # ifeq ($(FOUNDATION_LIB),apple) before-all:: rm -f GNUstepBase ln -s ../Headers/GNUstepBase GNUstepBase after-clean:: rm -f GNUstepBase endif gnustep-base-1.29.0/Tools/make_strings/GNUmakefile.preamble000066400000000000000000000036441435650067400236470ustar00rootroot00000000000000# # Tools makefile for the GNUstep Base Library # # Copyright (C) 1997 Free Software Foundation, Inc. # # Written by: Scott Christley # # This file is part of the GNUstep Base Library. # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public # License as published by the Free Software Foundation; either # version 2 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 # General Public License for more details. # # You should have received a copy of the GNU General Public # License along with this library; if not, write to the Free # Software Foundation, Inc., 51 Franklin Street, Fifth Floor, # Boston, MA 02111 USA. # # # Makefile.preamble # # Project specific makefile variables, and additional # # Do not put any Makefile rules in this file, instead they should # be put into Makefile.postamble. # # # Flags dealing with compiling and linking # # Additional flags to pass to the preprocessor ADDITIONAL_CPPFLAGS += # Additional flags to pass to the Objective-C compiler ADDITIONAL_OBJCFLAGS += $(WARN_FLAGS) # Additional flags to pass to the C compiler #ADDITIONAL_CFLAGS += # Additional include directories the compiler should search ADDITIONAL_INCLUDE_DIRS += -I../../Source/$(GNUSTEP_TARGET_DIR) -I../../Source/ ifeq ($(FOUNDATION_LIB),gnu) ADDITIONAL_INCLUDE_DIRS += -I../../Headers endif # Additional LDFLAGS to pass to the linker #ADDITIONAL_LDFLAGS += # Additional library directories the linker should search ADDITIONAL_LIB_DIRS += -L../../Source/$(GNUSTEP_OBJ_DIR) # # Flags dealing with installing and uninstalling # # Additional directories to be created during installation #ADDITIONAL_INSTALL_DIRS += gnustep-base-1.29.0/Tools/make_strings/README000066400000000000000000000015661435650067400206700ustar00rootroot00000000000000make_strings ============ Copyright (C) 2005, Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. If you are a translator, you're probably looking for Using.txt . Description ----------- make_strings parses Objective-C files and builds lists of localizable strings. It then creates new .strings files or merges the strings with existing .strings files. It's fairly intelligent when matching old and new strings, and produces .strings files that are (supposed to be) easy for a translator to work with. Instructions on how to use it when translating can be found in Using.txt . Installing ---------- make_strings requires gnustep-make and gnustep-base. Running: make should compile, and: make install should install it. gnustep-base-1.29.0/Tools/make_strings/SourceEntry.h000066400000000000000000000021151435650067400224320ustar00rootroot00000000000000/* SourceEntry Copyright (C) 2002 Free Software Foundation, Inc. Written by: Alexander Malmberg Created: 2002 This file is part of the GNUstep Project This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. You should have received a copy of the GNU General Public License along with this program; see the file COPYINGv3. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef SourceEntry_h #define SourceEntry_h @interface SourceEntry : NSObject { NSString *file,*comment,*key; unsigned int line; } /* TODO: very cryptic error message if duplicate name in argument list, gcc issue */ - initWithKey: (NSString *)k comment: (NSString *)c file: (NSString *)f line: (unsigned int)l; -(NSString *) file; -(NSString *) comment; -(NSString *) key; -(unsigned int) line; @end #endif gnustep-base-1.29.0/Tools/make_strings/SourceEntry.m000066400000000000000000000025741435650067400224500ustar00rootroot00000000000000/* SourceEntry Copyright (C) 2002 Free Software Foundation, Inc. Written by: Alexander Malmberg Created: 2002 This file is part of the GNUstep Project This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. You should have received a copy of the GNU General Public License along with this program; see the file COPYINGv3. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include "SourceEntry.h" @implementation SourceEntry - initWithKey: (NSString *)k comment: (NSString *)c file: (NSString *)f line: (unsigned int)l { self=[super init]; ASSIGN(file,f); ASSIGN(comment,c); ASSIGN(key,k); line=l; return self; } -(void) dealloc { DESTROY(file); DESTROY(comment); DESTROY(key); [super dealloc]; } -(NSString *) description { return [NSString stringWithFormat: @"(key='%@' comment='%@' at '%@':%i)", key,comment,file,line]; } -(NSString *) file { return file; } -(NSString *) comment { return comment; } -(NSString *) key { return key; } -(unsigned int) line { return line; } @end gnustep-base-1.29.0/Tools/make_strings/StringsEntry.h000066400000000000000000000032701435650067400226260ustar00rootroot00000000000000/* StringsEntry Copyright (C) 2002 Free Software Foundation, Inc. Written by: Alexander Malmberg Created: 2002 This file is part of the GNUstep Project This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. You should have received a copy of the GNU General Public License along with this program; see the file COPYINGv3. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef StringsEntry_h #define StringsEntry_h @class SourceEntry; @interface StringsEntry : NSObject { NSString *key,*comment,*translated; NSString *user_comment; #define FLAG_UNTRANSLATED 0x01 #define FLAG_UNMATCHED 0x02 int flags; NSString *file; unsigned int line; } + stringsEntryFromSourceEntry: (SourceEntry *)se; - initWithKey: (NSString *)k comment: (NSString *)c translated: (NSString *)t userComment: (NSString *)uc flags: (int)flags file: (NSString *)filename line: (int)line; -(NSString *) key; -(NSString *) comment; -(NSString *) translated; -(NSString *) userComment; -(int) flags; -(NSString *) file; -(unsigned int) line; -(int) compareFileLine: (StringsEntry *)e; -(int) compareFileKeyComment: (StringsEntry *)e; -(void) setKey: (NSString *)k; -(void) setComment: (NSString *)c; -(void) setTranslated: (NSString *)t; -(void) setUserComment: (NSString *)uc; -(void) setFlags: (int)f; -(void) addFlag: (int)f; -(void) setFile: (NSString *)f; -(void) setLine: (unsigned int)l; @end #endif gnustep-base-1.29.0/Tools/make_strings/StringsEntry.m000066400000000000000000000061041435650067400226320ustar00rootroot00000000000000/* StringsEntry Copyright (C) 2002 Free Software Foundation, Inc. Written by: Alexander Malmberg Created: 2002 This file is part of the GNUstep Project This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. You should have received a copy of the GNU General Public License along with this program; see the file COPYINGv3. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include "StringsEntry.h" #include "SourceEntry.h" @implementation StringsEntry + stringsEntryFromSourceEntry: (SourceEntry *)e { return AUTORELEASE([[self alloc] initWithKey: [e key] comment: [e comment] translated: [e key] userComment: nil flags: FLAG_UNTRANSLATED file: [e file] line: [e line]]); } - initWithKey: (NSString *)k comment: (NSString *)c translated: (NSString *)t userComment: (NSString *)uc flags: (int)f file: (NSString *)filename line: (int)l { self=[super init]; ASSIGN(key,k); ASSIGN(comment,c); ASSIGN(translated,t); ASSIGN(user_comment,uc); flags=f; ASSIGN(file,filename); line=l; return self; } -(void) dealloc { DESTROY(key); DESTROY(comment); DESTROY(translated); DESTROY(user_comment); DESTROY(file); [super dealloc]; } -(NSString *) key { return key; } -(NSString *) comment { return comment; } -(NSString *) translated { return translated; } -(NSString *) userComment { return user_comment; } -(int) flags { return flags; } -(NSString *) file { return file; } -(unsigned int) line { return line; } -(int) compareFileLine: (StringsEntry *)e { int res=[[self file] compare: [e file]]; if (res!=NSOrderedSame) return res; if ([self line]<[e line]) return NSOrderedAscending; else return NSOrderedDescending; } -(int) compareFileKeyComment: (StringsEntry *)e { int res; res=[[self file] compare: [e file]]; if (res!=NSOrderedSame) return res; res=[[self key] compare: [e key]]; if (res!=NSOrderedSame) return res; if (![self comment]) return NSOrderedAscending; if (![e comment]) return NSOrderedDescending; return [[self comment] compare: [e comment]]; } -(void) setKey: (NSString *)k { ASSIGN(key,k); } -(void) setComment: (NSString *)c { ASSIGN(comment,c); } -(void) setTranslated: (NSString *)t { ASSIGN(translated,t); } -(void) setUserComment: (NSString *)uc { ASSIGN(user_comment,uc); } -(void) setFlags: (int)f { flags=f; } -(void) addFlag: (int)f { flags|=f; } -(void) setFile: (NSString *)f { ASSIGN(file,f); } -(void) setLine: (unsigned int)l { line=l; } -(NSString *) description { return [NSString stringWithFormat: @"(key='%@' comment='%@' at '%@':%i userComment='%@' translated='%@' flags=%02x)", key,comment,file,line,user_comment,translated,flags]; } @end gnustep-base-1.29.0/Tools/make_strings/StringsFile.h000066400000000000000000000024051435650067400224030ustar00rootroot00000000000000/* StringsFile Copyright (C) 2002 Free Software Foundation, Inc. Written by: Alexander Malmberg Created: 2002 This file is part of the GNUstep Project This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. You should have received a copy of the GNU General Public License along with this program; see the file COPYINGv3. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef StringsFile_h #define StringsFile_h @class StringsEntry; @class SourceEntry; @class NSMutableArray; @interface StringsFile : NSObject { @public NSMutableArray *strings; NSString *global_comment; @private /** These are used for aggressive matching **/ /* Contains all keys for which there is a translation */ NSMutableArray *keys_translated; /* Contains all keys that appeared in the source */ NSMutableArray *keys_matched; } - init; - initWithFile: (NSString *)filename; -(BOOL) writeToFile: (NSString *)filename; -(void) addSourceEntry: (SourceEntry *)e; @end #endif gnustep-base-1.29.0/Tools/make_strings/StringsFile.m000066400000000000000000000403671435650067400224210ustar00rootroot00000000000000/* StringsFile Copyright (C) 2002 Free Software Foundation, Inc. Written by: Alexander Malmberg Created: 2002 This file is part of the GNUstep Project This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. You should have received a copy of the GNU General Public License along with this program; see the file COPYINGv3. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #import "common.h" #import "Foundation/NSString.h" #import "Foundation/NSArray.h" #import "Foundation/NSFileManager.h" #import "Foundation/NSData.h" #import "Foundation/NSDate.h" #include "StringsFile.h" #include "StringsEntry.h" #include "SourceEntry.h" #include "make_strings.h" static NSString *parse_string(NSString **ptr) { NSString *str = *ptr; NSString *ret; int i,c; unichar ch; c = [str length]; for (i = 0; i < c; i++) { ch = [str characterAtIndex: i]; if (ch == '\\') { if (i == c) { fprintf(stderr,"parse error, \\ without second character\n"); exit(1); } i++; } if (ch == '\"') break; } if (i == c) { fprintf(stderr,"parse error, unterminated string\n"); exit(1); } ret = [str substringToIndex: i]; str = [str substringFromIndex: i+1]; *ptr = str; return ret; } #define DUMMY @"" @implementation StringsFile - (BOOL) isTranslated: (NSString *)key { return [keys_translated containsObject: key]; } - (void) addTranslated: (NSString *)key { if (![self isTranslated: key]) [keys_translated addObject: key]; } - (BOOL) isMatched: (NSString *)key { return [keys_matched containsObject: key]; } - (void) addMatched: (NSString *)key { if (![self isMatched: key]) [keys_matched addObject: key]; } - init { self = [super init]; strings = [[NSMutableArray alloc] init]; keys_translated = [[NSMutableArray alloc] init]; keys_matched = [[NSMutableArray alloc] init]; return self; } - (void) dealloc { DESTROY(global_comment); DESTROY(strings); [super dealloc]; } - initWithFile: (NSString *)filename { NSString *str; self = [self init]; str = [NSString stringWithContentsOfFile: filename]; if (!str) return self; { StringsEntry *se = nil; NSMutableArray *update_list = [[NSMutableArray alloc] init]; NSArray *lines; NSString *l; NSUInteger i,c,pos; NSMutableDictionary *dummy_entries = [[NSMutableDictionary alloc] init]; NSMutableString *user_comment = [[NSMutableString alloc] init]; NSString *key,*trans; /* this is a bit yucky, but it works */ lines = [str componentsSeparatedByString: @"/*"]; c = [lines count]; for (i = 0; i < c; i++) { l = [lines objectAtIndex: i]; /* First entry has everything before the first comment and needs to be handled specially. */ if (i) { /* Parse special comments. */ if ([l hasPrefix: @"**"]) { /* It's one of our banners, just ignore it. If it's the first one we put all comments so far in the global user comment. */ if (user_comment) { if (![user_comment isEqual: @""]) global_comment = [user_comment copy]; DESTROY(user_comment); } } else if ([l hasPrefix: @" File: "]) { se = [[StringsEntry alloc] init]; [se addFlag: FLAG_UNMATCHED]; /* TODO: ? */ [update_list addObject: se]; [se release]; l = [l substringFromIndex: 7]; pos = [l rangeOfString: @":"].location; [se setFile: [l substringToIndex: pos]]; l = [l substringFromIndex: pos+1]; [se setLine: [l intValue]]; } else if ([l hasPrefix: @" Flag: untranslated */"]) [se addFlag: FLAG_UNTRANSLATED]; else if ([l hasPrefix: @" Flag: unmatched */"]) [se addFlag: FLAG_UNMATCHED]; /* this is essentially a noop */ else if ([l hasPrefix: @" Comment: "]) { l = [l substringFromIndex: 10]; pos = [l rangeOfString: @" */"].location; if (pos == NSNotFound) continue; [se setComment: [l substringToIndex: pos]]; } else { pos = [l rangeOfString: @"*/"].location; if (pos == NSNotFound) { fprintf(stderr,"parse error in '%s', missing '*\'\n", [filename cString]); pos = [l length]; } if ([user_comment length]) [user_comment appendString: @"\n"]; [user_comment appendString: [l substringToIndex: pos]]; } pos = [l rangeOfString: @"*/"].location; if (pos == NSNotFound) continue; l = [l substringFromIndex: pos+2]; } while (1) { pos = [l rangeOfString: @"\""].location; if (pos == NSNotFound) break; l = [l substringFromIndex: pos+1]; key = parse_string(&l); pos = [l rangeOfString: @"="].location; if (pos == NSNotFound) { fprintf(stderr,"parse error in '%s', expecting '='\n", [filename cString]); exit(1); } l = [l substringFromIndex: pos+1]; pos = [l rangeOfString: @"\""].location; if (pos == NSNotFound) { fprintf(stderr,"parse error in '%s', expecting second string\n", [filename cString]); exit(1); } l = [l substringFromIndex: pos+1]; trans = parse_string(&l); pos = [l rangeOfString: @";"].location; if (pos == NSNotFound) { fprintf(stderr,"parse error in '%s', expecting ';'\n", [filename cString]); exit(1); } l = [l substringFromIndex: pos+1]; if (![update_list count]) { /* we're probably parsing a file not created by us */ if (![dummy_entries objectForKey: key]) { se = [[StringsEntry alloc] init]; [se setFile: DUMMY]; [se setFlags: FLAG_UNMATCHED]; [update_list addObject: se]; [se release]; [dummy_entries setObject: se forKey: key]; } } [update_list makeObjectsPerformSelector: @selector(setKey:) withObject: key]; [update_list makeObjectsPerformSelector: @selector(setTranslated:) withObject: trans]; { int i,c = [update_list count]; for (i = 0; i < c; i++) { // printf("%4i : %@\n",i,[update_list objectAtIndex: i]); se = [update_list objectAtIndex: i]; if (!([se flags] & FLAG_UNTRANSLATED)) { [self addTranslated: key]; break; } } } [strings addObjectsFromArray: update_list]; [update_list removeAllObjects]; se = nil; } } DESTROY(user_comment); DESTROY(dummy_entries); DESTROY(update_list); } return self; } - (void) _writeTo: (NSMutableString *)str entryHead: (StringsEntry *)se { if ([se file]) { [str appendString: @"/* File: "]; [str appendString: [se file]]; [str appendString: [NSString stringWithFormat: @":%i */\n",[se line]]]; } if ([se comment]) { [str appendString: @"/* Comment: "]; [str appendString: [se comment]]; [str appendString: @" */\n"]; } } - (void) _writeTo: (NSMutableString *)str entryFlags: (StringsEntry *)se { int flags = [se flags]; if (!flags) return; if (flags & FLAG_UNMATCHED) [str appendString: @"/* Flag: unmatched */\n"]; else if (flags & FLAG_UNTRANSLATED) [str appendString: @"/* Flag: untranslated */\n"]; else { fprintf(stderr,"unknown flag %08x\n",flags); } } - (void) _writeTo: (NSMutableString *)str entryKey: (StringsEntry *)se { [str appendString: @"\""]; [str appendString: [se key]]; /* Try to write a nice readable output ... key and value with whitrespace * around the '=' charactger, or wrap to a new line with a two space indent. */ if ([[se key] length] + [[se translated] length] < 70) [str appendString: @"\" = \""]; else [str appendString: @"\"\n = \""]; [str appendString: [se translated]]; [str appendString: @"\";\n"]; } - (void) _writeTo: (NSMutableString *)str manyEntries: (NSMutableArray *)list { int i,c; StringsEntry *tr,*cur; [list sortUsingSelector: @selector(compareFileLine:)]; c = [list count]; if (!c) return; cur = tr = nil; for (i = 0; i < c; i++) { cur = [list objectAtIndex: i]; [self _writeTo: str entryHead: cur]; if ([cur flags]) [self _writeTo: str entryFlags: cur]; if (!([cur flags] & FLAG_UNTRANSLATED)) tr = cur; } if (tr) [self _writeTo: str entryKey: tr]; else [self _writeTo: str entryKey: cur]; } - (BOOL) _shouldIgnore: (StringsEntry *)se { if (([se flags] & (FLAG_UNMATCHED|FLAG_UNTRANSLATED)) == (FLAG_UNMATCHED|FLAG_UNTRANSLATED)) return YES; if (aggressive_import && [[se file] isEqual: DUMMY] && [self isMatched: [se key]]) return YES; if (aggressive_remove && ([se flags] & FLAG_UNMATCHED) && [self isMatched: [se key]]) return YES; return NO; } - (BOOL) _writeString: (NSString *)str toFile: (NSString *)filename { BOOL isAscii = YES; NSUInteger len = [str length]; NSUInteger i; for (i = 0; i < len; i++) { unichar u = [str characterAtIndex: i]; if (u > 127) { isAscii = NO; break; } } if (isAscii) { return [str writeToFile: filename atomically: YES]; } else { NSData *d = [str dataUsingEncoding: NSUTF8StringEncoding]; NSMutableData *md = [[NSMutableData alloc] initWithCapacity: [d length] + 3]; // Add BOM at the beginning of the file char bytes[] = {0xEF, 0xBB, 0xBF}; BOOL result; [md appendBytes: bytes length: 3]; [md appendData: d]; result = [md writeToFile: filename atomically: YES]; [md release]; return result; } } - (BOOL) writeToFile: (NSString *)filename { unsigned int i,c; BOOL result; NSMutableString *str = [[NSMutableString alloc] initWithCapacity: 32*1024]; StringsEntry *se; NSMutableArray *strings_left = [strings mutableCopy]; NSMutableArray *str_list = [[NSMutableArray alloc] init]; NSMutableArray *dup_list = [[NSMutableArray alloc] init]; NSMutableArray *un_list = [[NSMutableArray alloc] init]; StringsEntry *cur,*c2; int single_file,wrote_banner,unflags; int un_count = 0; if (global_comment && ![global_comment isEqual: @""]) { [str appendString: @"/*"]; [str appendString: global_comment]; [str appendString: @"*/\n\n"]; } [str appendString: [NSString stringWithFormat: @"/***\n" @"%@\n" @"updated by make_strings %@\n" @"add comments above this one\n" @"***/\n", filename,[NSDate dateWithTimeIntervalSinceNow: 0]]]; wrote_banner = 0; /* First, output all keys that appear in multiple places (unless all appearances are in one file and none are marked unmatched or untranslated). Collect unmatched or untranslated single entries in un_list and matched translated (single/multiple in one file) entries in str_list. */ while ([strings_left count]) { cur = [strings_left objectAtIndex: 0]; if ([self _shouldIgnore: cur]) { [strings_left removeObjectAtIndex: 0]; continue; } [dup_list addObject: cur]; [strings_left removeObjectAtIndex: 0]; single_file = 1; unflags = [cur flags]; for (i = 0; i < [strings_left count]; i++) { c2 = [strings_left objectAtIndex: i]; if ([self _shouldIgnore: c2]) { [strings_left removeObjectAtIndex: i]; i--; continue; } if ([[cur key] isEqual: [c2 key]]) { unflags |= [c2 flags]; [dup_list addObject: c2]; [strings_left removeObjectAtIndex: i]; if (single_file) if (![[cur file] isEqual: [c2 file]]) single_file = 0; i--; } } if (single_file && !unflags) { [str_list addObjectsFromArray: dup_list]; [dup_list removeAllObjects]; continue; } if ([dup_list count] == 1) { [un_list addObjectsFromArray: dup_list]; [dup_list removeAllObjects]; continue; } if (unflags) un_count += [dup_list count]; if (!wrote_banner) { [str appendString: @"\n\n/*** Keys found in multiple places ***/\n"]; wrote_banner = 1; } [str appendString: @"\n"]; [self _writeTo: str manyEntries: dup_list]; [dup_list removeAllObjects]; } DESTROY(strings_left); /* Now output all single unmatched or untranslated entries. Order by line and file so key changes and movements are easy to spot and fix. */ if ([un_list count]) { [str appendString: @"\n\n/*** Unmatched/untranslated keys ***/\n"]; [un_list sortUsingSelector: @selector(compareFileLine:)]; c = [un_list count]; un_count += c; for (i = 0; i < c; i++) { se = [un_list objectAtIndex: i]; [str appendString: @"\n"]; [self _writeTo: str entryHead: se]; [self _writeTo: str entryFlags: se]; [self _writeTo: str entryKey: se]; } } /* Finally, output all matched and translated entries ordered by file. The translator should never have to touch these strings (unless there are typos or something). */ if ([str_list count]) { NSString *last_filename = nil; [str_list sortUsingSelector: @selector(compareFileKeyComment:)]; c = [str_list count]; for (i = 0; i < c; i++) { se = [str_list objectAtIndex: i]; if (!last_filename || ![last_filename isEqual: [se file]]) { last_filename = [se file]; [str appendString: [NSString stringWithFormat: @"\n\n/*** Strings from %@ ***/\n", last_filename]]; } [self _writeTo: str entryHead: se]; if (i == c - 1 || ![[se key] isEqual: [[str_list objectAtIndex: i + 1] key]]) [self _writeTo: str entryKey: se]; } } DESTROY(str_list); DESTROY(dup_list); { NSString *backupname = [filename stringByAppendingString: @"~"]; [[NSFileManager defaultManager] removeFileAtPath: backupname handler: nil]; [[NSFileManager defaultManager] movePath: filename toPath: backupname handler: nil]; result = [self _writeString: str toFile: filename]; if (!result) fprintf(stderr,"Error saving '%s'!\n",[filename cString]); } DESTROY(str); DESTROY(un_list); if (un_count) fprintf(stderr,"'%s': %i untranslated or unmatched messages\n", [filename cString],un_count); return result; } - (void) addSourceEntry: (SourceEntry *)e { /* First try to find a match among our unmatched strings. We consider two entries to match if they have the same key, file and comment. This could be extended, but the risk of errors increases. */ int i,c; StringsEntry *se; c = [strings count]; [self addMatched: [e key]]; /* Look for exact matches. If we find an exact match (same file, key, and comment) we mark the StringsEntry matched and don't add the SourceEntry. */ for (i = 0; i < c; i++) { se = [strings objectAtIndex: i]; if (!([se flags] & FLAG_UNMATCHED)) continue; if (![[se key] isEqual: [e key]]) continue; if (([se flags] & FLAG_UNMATCHED) && [[se file] isEqual: [e file]]) { if ((![se comment] && ![e comment]) || ([[se comment] isEqual: [e comment]])) { [se setFlags: [se flags] & ~FLAG_UNMATCHED]; [se setLine: [e line]]; return; } } } if (aggressive_match) { /* If aggressive match is enabled, we try to find an existing and translated StringsEntry. If we find we add a new StringsEntry from the SourceEntry with the same translation and marked as translated. */ for (i = 0; i < c; i++) { se = [strings objectAtIndex: i]; if ([se flags] & FLAG_UNTRANSLATED) continue; if (![[se key] isEqual: [e key]]) continue; { StringsEntry *se2 = [StringsEntry stringsEntryFromSourceEntry: e]; [se2 setFlags: 0]; [se2 setTranslated: [se translated]]; [strings addObject: se2]; return; } } } /* No match, add a new, untranslated StringsEntry. */ [strings addObject: [StringsEntry stringsEntryFromSourceEntry: e]]; } @end gnustep-base-1.29.0/Tools/make_strings/Using.txt000066400000000000000000000262041435650067400216320ustar00rootroot00000000000000Translator's guide to make_strings ================================== Copyright (C) 2002 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is meant to be a fairly complete description of what a translator needs to do to work with make_strings. Please send comments, suggestions, bug reports etc. to . TODO: application developer's guide basically: use some function around all strings, like _() or NSLocalizedString() if you want a comment; don't forget to take care of static strings with __() or NSLocalizedStaticString(). Table of contents ----------------- 1. Basic stuff 1.1. Invoking make_strings 1.2. What make_strings parses 2. The .strings files 3. Normal tasks 3.1. Creating the initial .strings files 3.2. Updating the .strings files 4. Special cases 4.1. Importing an existing .strings files 1. Basic stuff ============== 1.1. Invoking make_strings -------------------------- (In the future, running 'make strings' will (hopefully) be enough to do all this.) The syntax for running make_strings is: make_strings [--help] to see some very basic help, or: make_strings [--verbose] [--aggressive-import] [--aggressive-match] -L "Languages" file1.m file2.h ... The --verbose flag makes make_strings print some information while running. The -L flag tells make_strings which languages to process. You can have many -L flags, or you can specify many languages in one -L flag. You'll need to specify at least one language. The --aggressive-match flag is described in section 3.2. It causes matching to be done on key only. The --aggressive-import flag is described in section 4.1. It activates --aggressive-match and automatically removes dummy entries created through importing .strings files not created by make_strings. All other arguments are considered filenames and are added to the list of files to parse for strings. When make_strings is finished, it will print a message for each .strings file that has untranslated or unmatched strings (and thus needs to be updated). Examples: make_strings -L English -L "Swedish German" menu.m menu.h whatever.m foo.c will parse the specified files and update the .strings files in English.lproj/, Swedish.lproj/ and German.lproj/. 1.2. What make_strings parses ----------------------------- make_strings has a decent parser of c-like languages. It shouldn't have any problems grabbing strings for a valid objective-c or c file. Currently the following functions are handled: _(key) NSLocalizedString(key,comment) NSLocalizedStringFromTable(key,table,comment) NSLocalizedStringFromTableInBundle(key,table,bundle,comment) __(key) NSLocalizedStaticString(key,comment) 'Clever' use of cpp can confuse make_strings, so don't do that. Nested calls to localization functions aren't handled, so don't do that either (if you find a case where you really need to do this, explain why to me and I might extend it). The fields make_strings uses must be string constants. Calls to localization functions with important parameters that aren't string constants will be ignored and a warning will be issued. (So note that eg. bundle does not have to be a string constant.) 2. The .strings files ===================== Each language directory contains a number of .strings files. The default is Localizable.strings (and most programs probably won't have any other). A .strings file consists of a number of key/value pairs. The syntax is: "some key" = "some value" ; The key is used in the source code to lookup the translation. The value is the translation. A .strings file can have c-style comments: /* */ . make_strings stores additional information in these to help it handle translations intelligently. Thus, you shouldn't touch the comments except as noted in this file. You can add a comment (or several) above the first make_strings banner and it will be preserved, but anything past the first banner will be discarded. The special comments used are: /* File: file.m:123 */ This starts a new entry (for make_strings). It tells you in which file and at what line the string was found. /* Comment: foo bar zot */ The programmer can associate comments with each localizable string as an aid when translating. /* Flag: unmatched */ This indicates that the string was found in the .strings file, but not in the source code. /* Flag: untranslated */ This indicated that the string was found in the source code, and it couldn't be matched to an existing entry in the .strings file. Flags and comments bind to the previous File: comment. There might be several File: comments for a single key/value pair. That means that the key appears in several places in the source code. The different File: comments mark the different places (and any comments or flag associated with that specific appearance of the key). 3.1. Normal tasks ================= 3.1. Creating the initial .strings files ---------------------------------------- If you want to localize an application (read application or tool) for the first time, or add a new language to an application, you must first create the .lproj directory for that language (if it doesn't already exist). Just run: mkdir Language.lproj where Language is the name of the language (eg. English). To be able to use the translation, you'll also need to add the language to the _LANGUAGES listing in GNUmakefile. Example: SomeProgram_LANGUAGES = English Swedish German You'll also need to make sure all .strings files are in the _LOCALIZED_RESOURCE_FILES list. Most programs use only Localizable.strings. If you're unsure what files to add, run make_strings and check what files it created. Example: SomeProgram_LOCALIZED_RESOURCE_FILES = Localizable.strings To get the initial .strings files, simply run make_strings with the language as a parameter, eg.: make_strings -L German *.[hm] This will create any necessary .strings files in German.lproj/. Open each file in a text editor an proceed according to section 3.2. 3.2. Updating the .strings files -------------------------------- Once you have some .strings files, you can update them anytime by running make_strings with the languages you want to update as arguments. Example: make_strings -L English German Swedish *.[hm] will update the .strings files in English.lproj/, German.lproj/, and Swedish.lproj/. If a .strings file has unmatched or untranslated strings, make_strings will print a message. If no messages are printed, the translations are up-to-date and there's nothing you need to do. If a file needs to be updated, open it in your favorite text editor and search for 'Flag:'. Each flag marks something that needs to be taken care of. When you've taken care of all flags, you're done! There are two flags: /* Flag: untranslated */ This marks a string that doesn't have a (confirmed) translation yet. Enter the translation as the new value for and _remove_the_entire_line_ with the flag. Example: a save menu entry was added /* File: SomeWindow.m:314 */ /* Comment: menu entry for saving a message */ /* Flag: untranslated */ "Save..." = "Save..."; Translate the string and remove the flag: /* File: SomeWindow.m:314 */ /* Comment: menu entry for saving a message */ "Save..." = "Spara..."; A message that is marked as untranslated might appear grouped with other strings with the same key. In that case, translating is as easy as verifying that the existing translation matches the new case and deleting the flag. (If you can't find a translation that matches all cases, you'll need to talk to the application's maintainer so that the different cases can have different keys.) Example: another save menu entry was added /* File: SomeWindow.m:314 */ /* Comment: menu entry for saving a message */ /* File: SomeOtherWindow.m:271 */ /* Flag: untranslated */ "Save..." = "Spara..."; The translation matches, so just remove the flag: /* File: SomeWindow.m:314 */ /* Comment: menu entry for saving a message */ /* File: SomeOtherWindow.m:271 */ "Save..." = "Spara..."; If you're brave, you can use the '--aggressive-match' option. This option will make make_strings assume that matching keys should have matching translations, so it would have resolved the above example automatically. This can save lots of work, but it increases the risk of a mis-translation. /* Flag: unmatched */ This marks a string that existed in the .strings file, but not in the source. This might mean that the string has been removed, or that the string has changed so the match couldn't be found. If the string was removed, simply remove the flag, the File: comment, the Comment: comment if it exists, and the key/value pair if it is no longer used. Example: there used to be a load menu entry, but it has been removed /* File: SomeWindow.m:127 */ /* Flag: unmatched */ "Open..." = "Öppna..."; The translation isn't used anymore, so remove all three lines. Example: one of the save menu entries was removed /* File: SomeWindow.m:314 */ /* Comment: menu entry for saving a message */ /* Flag: unmatched */ /* File: SomeOtherWindow.m:271 */ "Save..." = "Spara..."; Again, remove the File:, Comment: and Flag:. However, the actual key/value pair is still used by the other location, so it should _not_ be removed. /* File: SomeOtherWindow.m:271 */ "Save..." = "Spara..."; If code changes and a string is slightly changed or moved to a different file, there will probably be an untranslated string that matches the unmatched string (although make_strings hasn't been able to match them). Example: someone changed the name of the save menu entry /* File: SomeOtherWindow.m:271 */ /* Flag: unmatched */ "Save..." = "Spara..."; ... /* File: SomeOtherWindow.m:279 */ /* Flag: untranslated */ "Save data..." = "Save data..."; Update the translation, remove the untranslated flag, and remove the unmatched entry. /* File: SomeOtherWindow.m:279 */ "Save data..." = "Spara data..."; 4. Special cases ================ 4.1. Importing an existing .strings files ----------------------------------------- If your project already has a Localizable.strings (created by hand or something) and you want to use make_strings, you'll just need to run make_strings once to convert the files. Each old entry will appear as an unmatched entry from the file , and each entry in the source will appear as an untranslated entry, so things will look like this: /* File: :0 */ /* Flag: unmatched */ /* File: Foo.m:183 */ /* Flag: untranslated */ "Close" = "Stäng"; It's easy (but boring) to check all the entries and remove the dummies and flags. make_strings is by default very careful and won't match things very well (after all, it can't be sure). However, if you're fairly certain that the translation is OK, you can use the '--aggressive-import' option the first time you run make_strings. This option will make make_strings match much more aggressively, and it will greatly reduce the number of untranslated/unmatched strings in the resulting .strings file. (Eg. the above entry would appear as a single matched and translated entry.) --aggressive-import works like --aggressive-match, but also removes any entries from the file that were used to match an existing string. gnustep-base-1.29.0/Tools/make_strings/make_strings.1000066400000000000000000000041401435650067400225470ustar00rootroot00000000000000.TH make_strings 1 "August 16, 2009" "GNUstep" "GNUstep System Manual" .SH NAME make_strings \- tool to build lists of localizable strings from Objective-C files .SH SYNOPSIS .B make_strings .RB [ --help ] .RB [ --verbose ] .RB [ --aggresive-import ] .RB [ --aggressive-match ] .RB [ --aggressive-remove ] .RB [ -L .IR languages ] .I files.[hmc...] .br .SH DESCRIPTION .B make_strings parses Objective-C files and builds lists of localizable strings. It then creates new .I .strings files or merges the strings with existing .I .strings files. It's fairly intelligent when matching old and new strings, and produces .I .strings files that are (supposed to be) easy for a translator to work with. .PP .B make_strings accepts the following options: .SH OPTIONS .TP .B --help Prints a short list of available options. .TP .B --verbose Prints additional information while processing. .TP .BI -L " languages" Specify which languages to process. Multuple .B -L options are accepted, or multiple .I languages defined in one .B -L flag. .TP .B --aggressive-import Activates .B --aggresive-match and automatically removes "dummy" entries that are added by importing .I .strings files which were not created by .B make_strings program. This option is suitable when .B make_strings is run for the first time and there is an existing .I .strings file which contains a fairly accurate translation. .TP .B --aggressive-match This option will make .B make_strings assume that matching keys should have matching translations. This can save lots of work, but it increases the risk of erroneous translation. .TP .B --aggressive-remove Removes obsolete strings/keys. .SH EXAMPLES make_strings \-L "English Swedish Russian" *.[hm] .SH SEE ALSO .BR GNUstep (7). .SH AUTHORS .B make_strings was written Alexander Malmberg . .P This manual page was added by Yavor Doganov . .SH COPYRIGHT Copyright (C) 2009 Free Software Foundation, Inc. .P Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. gnustep-base-1.29.0/Tools/make_strings/make_strings.h000066400000000000000000000016711435650067400226440ustar00rootroot00000000000000/* make_strings Copyright (C) 2002 Free Software Foundation, Inc. Written by: Alexander Malmberg Created: 2002 This file is part of the GNUstep Project This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. You should have received a copy of the GNU General Public License along with this program; see the file COPYINGv3. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef make_strings_h #define make_strings_h @class SourceEntry; @interface NSMutableDictionary (make_strings) -(void) addEntry: (SourceEntry *)e toTable: (NSString *)table; @end extern int verbose,aggressive_import,aggressive_match,aggressive_remove; #endif gnustep-base-1.29.0/Tools/make_strings/make_strings.m000066400000000000000000000310511435650067400226440ustar00rootroot00000000000000/* make_strings Copyright (C) 2002 Free Software Foundation, Inc. Written by: Alexander Malmberg Created: 2002 This file is part of the GNUstep Project This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. You should have received a copy of the GNU General Public License along with this program; see the file COPYINGv3. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #import "common.h" #import "Foundation/NSString.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSEnumerator.h" #import "Foundation/NSArray.h" #include "make_strings.h" #include "StringsFile.h" #include "SourceEntry.h" #include "StringsEntry.h" #ifdef _MSC_VER #define strdup _strdup #endif int verbose, aggressive_import, aggressive_match, aggressive_remove; typedef struct { const char *func_name; int num_args; int key_index, comment_index, table_index; } loc_func_t; /* List of functions we should look for (easy to extend). */ static loc_func_t loc_funcs[]= { {"_" , 1, 0, -1, -1}, {"NSLocalizedString" , 2, 0, 1, -1}, {"NSLocalizedStringFromTable" , 3, 0, 2, 1}, {"NSLocalizedStringFromTableInBundle" , 4, 0, 3, 1}, {"__" , 1, 0, -1, -1}, {"NSLocalizedStaticString" , 2, 0, 1, -1}, {}, }; #define MAX_ARGS 4 static char *nilp = 0; static int isname1(unsigned char ch) { if (ch == '_' || (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) return 1; return 0; } static int isname(unsigned char ch) { if (isname1(ch)) return 1; if (ch >= '0' && ch <= '9') return 1; return 0; } /* This function attempts to parse the specified file and adds any calls to tables. To avoid excessive complexity and to easily handle comments and strings everywhere, it's written as a state machine. Things that can fool it: - Stupid use of pre-processor stuff, like '#define foo bar('. Solution: Don't do that. - Nested localization calls, like: 'NSLocalizedString(@"foo", NSLocalizedString(@"bar", @"zot"))'. Solution: don't do that (with the current functions, there should never be any reason to). */ #define add_arg_ch(ch)\ {\ if (arg_len[num_args]+1 >= arg_size[num_args])\ {\ arg_size[num_args] += 512;\ args[num_args] = realloc(args[num_args], arg_size[num_args]);\ if (!args[num_args])\ {\ NSLog(@"out of memory!\n");\ exit(1);\ }\ }\ args[num_args][arg_len[num_args]++] = ch;\ args[num_args][arg_len[num_args]] = 0;\ } static int ParseFile(const char *filename, NSMutableDictionary *tables) { FILE *f; NSString *filenamestr; /* 0: normal parsing 1: in '//' comment 2: in '/ *' comment 3: in string 5: parsing potentially interesting name 6: parsing uninteresting name 7: got name, wait for '(' 8: parsing arguments */ int state, old_state, skip; int ch, nch; int name = -1; int nindex = 0; int cur_line; unsigned char *args[MAX_ARGS]; int arg_size[MAX_ARGS], arg_len[MAX_ARGS]; int arg_ok[MAX_ARGS]; int num_args; int i; int depth = 0; filenamestr = [NSString stringWithCString: filename encoding: [NSString defaultCStringEncoding]]; if (verbose) printf("Parsing '%s'.\n", filename); f = fopen(filename, "rt"); if (!f) { NSLog(@"Unable to open '%@': %m\n", filenamestr); return 1; } old_state = state = 0; skip = 0; cur_line = 1; num_args = -1; for (i = 0; i < MAX_ARGS; i++) { args[i] = NULL; arg_size[i] = 0; } nch = fgetc(f); while (!feof(f)) { ch = nch; if (ch == EOF) break; nch = fgetc(f); // printf("ch = %02x '%c' state =%i skip =%i\n", ch, ch, state, skip); if (skip) { skip--; continue; } if (ch == '\n') cur_line++; if (state == 3) { if (ch!= '"' && num_args!=-1 && arg_ok[num_args]) add_arg_ch(ch); if (ch == '\\') { if (num_args!= -1 && arg_ok[num_args]) add_arg_ch(nch); skip = 1; } else if (ch == '"') state = old_state; continue; } if (state == 1) { if (ch == '\n' || ch == '\r') state = old_state; continue; } if (state == 2) { if (ch == '*' && nch == '/') { state = old_state; skip = 1; } continue; } if (ch == '"') { old_state = state; state = 3; continue; } if (ch == '/' && nch == '/') { old_state = state; state = 1; continue; } if (ch == '/' && nch == '*') { old_state = state; state = 2; /* skip a character so we'll parse '/ * /' correctly */ skip = 1; continue; } if (state == 0 && isname1(ch)) { for (name = 0;loc_funcs[name].func_name;name++) if (ch == loc_funcs[name].func_name[0]) break; if (loc_funcs[name].func_name) { state = 5; nindex = 1; } else state = 6; continue; } if (state == 6) { if (!isname(ch)) state = 0; continue; } if (state == 5) { if (isname(ch)) { int old_name; if (loc_funcs[name].func_name[nindex] == ch) { nindex++; continue; } old_name = name; for (name++;loc_funcs[name].func_name;name++) { if (!strncmp(loc_funcs[old_name].func_name, loc_funcs[name].func_name, nindex) && loc_funcs[name].func_name[nindex] == ch) break; } if (loc_funcs[name].func_name) nindex++; else state = 6; continue; } if (loc_funcs[name].func_name[nindex]!= 0) { int old_name = name; for (name++;loc_funcs[name].func_name;name++) { if (!strncmp(loc_funcs[old_name].func_name, loc_funcs[name].func_name, nindex) && loc_funcs[name].func_name[nindex] == 0) break; } } if (!loc_funcs[name].func_name) { state = 0; continue; } else { /* printf("found call to '%s' at line %i\n", * loc_funcs[name].func_name, cur_line); */ state = 7; } } if (state == 7) { if (ch == '(') { num_args = 0; depth = 0; state = 8; nilp = "nil"; for (i = 0; i < MAX_ARGS; i++) { arg_len[i] = 0; arg_ok[i] = 1; } /* printf(" start arg list, want %i args\n", * loc_funcs[name].num_args); */ } else if (ch > 32) state = 0; continue; } if (state == 8) { if (depth) { if (ch == ')' || ch == ']' || ch == '}') depth--; continue; } if (ch == '(' || ch == '[' || ch == '{') { arg_ok[num_args] = 0; depth++; continue; } if (ch == ')') { loc_func_t *lf = &loc_funcs[name]; /*{ printf("got call to '%s', %i args\n", loc_funcs[name].func_name, num_args); for (i = 0;ikey_index] && (lf->comment_index == -1 || arg_ok[lf->comment_index]) && (lf->table_index == -1 || arg_ok[lf->table_index])) { SourceEntry *e; NSString *key, *comment, *table; /* TODO: let user specify source file encoding */ key = [NSString stringWithCString: (char*)args[lf->key_index]]; if (lf->comment_index == -1 || !arg_len[lf->comment_index]) comment = nil; else comment = [NSString stringWithCString: (char*)args[lf->comment_index]]; if (lf->table_index == -1 || (arg_ok[lf->table_index] && (args[lf->table_index] == 0 || strcmp("nil", (char*)args[lf->table_index]) == 0))) { table = @"Localizable"; /* TODO: customizable? */ } else { table = [NSString stringWithCString: (char*)args[lf->table_index]]; } e = [[SourceEntry alloc] initWithKey: key comment: comment file: filenamestr line: cur_line]; [tables addEntry: e toTable: table]; [e release]; } else { NSLog(@"unable to parse call to '%s' at %s:%i\n", lf->func_name, filename, cur_line); } num_args = -1; state = 0; continue; } if (ch == ',') { num_args++; if (num_args == MAX_ARGS) state = 0; nilp = "nil"; continue; } if (nilp) { if (ch == *nilp) { nilp++; if (*nilp == '\0') { args[num_args] = (unsigned char *)strdup("nil"); arg_len[num_args] = 3; arg_size[num_args] = 4; nilp = 0; } continue; } } if (ch > 32 && ch != '@') arg_ok[num_args] = 0; continue; } } for (i = 0; i= 0; k--) { NSString *language = [languages objectAtIndex: k]; if ([language isEqualToString: @""]) { [languages removeObjectAtIndex: k]; } } } if (![languages count]) { NSLog (@"No languages specified!\n"); return 1; } if (argc == 1) { NSLog (@"No files specified!\n"); return 1; } source_entries = [[NSMutableDictionary alloc] init]; error = 0; { int i; for (i = 1; i < argc; i++) error += ParseFile (argv[i], source_entries); } if (!error) { int i, c = [languages count]; for (i = 0; i < c; i++) { HandleLanguage ([languages objectAtIndex: i], source_entries); } } DESTROY(arp); if (error) return 1; else return 0; } gnustep-base-1.29.0/Tools/make_strings/test1.m000066400000000000000000000002431435650067400212150ustar00rootroot00000000000000 _(@"foo") _ ( @"foo2" /* test */ ) "_()" " \" _(foo) \" /* comment " _ // test (@ /* comment " */ "test" @ " test2" ) NSLocalizedString(@"Information", @"") gnustep-base-1.29.0/Tools/mkchlog.sh000066400000000000000000000004071435650067400172730ustar00rootroot00000000000000#!/bin/sh svn log -rHEAD --xml --verbose | xsltproc /usr/local/share/svn2cl/svn2cl.xsl - > ChangeLog.new svn up ChangeLog cat ChangeLog >> ChangeLog.new mv ChangeLog.new ChangeLog $EDITOR ChangeLog svn commit -m 'Added ChangeLog entry from last commit' ChangeLog gnustep-base-1.29.0/Tools/pl.m000066400000000000000000000116101435650067400161020ustar00rootroot00000000000000/* pl.m This file is the main driver for the plist parsing program. Copyright (C) 1996,1999,2000 Free Software Foundation, Inc. Author: Gregory John Casamento Date: 17 Jan 2000 This file is part of the GNUstep Project This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. You should have received a copy of the GNU General Public License along with this program; see the file COPYINGv3. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #import "common.h" #import "Foundation/NSArray.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSData.h" #import "Foundation/NSException.h" #import "Foundation/NSFileHandle.h" #import "Foundation/NSFileManager.h" #import "Foundation/NSPathUtilities.h" #import "Foundation/NSProcessInfo.h" #import "Foundation/NSUserDefaults.h" void create_output(id propertyList) { NSFileHandle *fileHandle = nil; NSProcessInfo *processInfo = [NSProcessInfo processInfo]; NSArray *arguments = [processInfo arguments]; NSUInteger outputIndex = 0; // insert your code here outputIndex = [arguments indexOfObject: @"-output"]; if (outputIndex == NSNotFound) { const char *buffer = [[propertyList description] cString]; NSData *outputData; outputData = [NSData dataWithBytes: buffer length: strlen(buffer)]; // setup the file handle. fileHandle = [NSFileHandle fileHandleWithStandardOutput]; // Send the data to stdout [fileHandle writeData: outputData]; puts("\n"); } else { NSData *serializedData = nil; NSFileManager *fileManager = [NSFileManager defaultManager]; // Write in the serialized plist. serializedData = [NSSerializer serializePropertyList: propertyList]; [fileManager createFileAtPath: [arguments objectAtIndex: outputIndex+1] contents: serializedData attributes: nil]; } } id process_plist(NSData *inputData) { id propertyList = nil; NSString *string = nil; // Initialize a string with the contents of the file. string = [NSString stringWithUTF8String: (char *)[inputData bytes]]; // Convert the string into a property list. If there is a parsing error // the property list interpreter will throw an exception. NS_DURING propertyList = [string propertyList]; NS_HANDLER NSLog(@"%@", localException); NS_ENDHANDLER // return the results return propertyList; } NSData *read_input() { NSData *inputData = nil; NSFileHandle *fileHandle = nil; NSProcessInfo *processInfo = [NSProcessInfo processInfo]; NSArray *arguments = [processInfo arguments]; NSUInteger inputIndex = 0; // insert your code here inputIndex = [arguments indexOfObject: @"-input"]; if (inputIndex == NSNotFound) { // setup the file handle. fileHandle = [NSFileHandle fileHandleWithStandardInput]; // Read in the input from the file. inputData = [fileHandle readDataToEndOfFile]; } else { NSData *serializedData = nil; id propertyList = nil; char *buffer = 0; // set up the file handle. fileHandle = [NSFileHandle fileHandleForReadingAtPath: [arguments objectAtIndex: inputIndex+1]]; // read in the serialized plist. serializedData = [fileHandle readDataToEndOfFile]; [fileHandle closeFile]; propertyList = [NSDeserializer deserializePropertyListFromData: serializedData mutableContainers: NO]; if (propertyList != nil) { buffer = (char *)[[propertyList description] cString]; inputData = [NSData dataWithBytes: buffer length: strlen(buffer)]; } else { NSLog(@"%@ is not a serialized property list.", [arguments objectAtIndex: inputIndex+1]); } } return inputData; } int main (int argc, const char *argv[]) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSData *inputData = nil; id propertyList = nil; // put your code here. if (argc == 1 || argc == 3|| argc == 5) { inputData = read_input(); if (inputData != nil) { // If the input data was sucessfully read... propertyList = process_plist( inputData ); if (propertyList != nil) { // If the property list was okay... create_output( propertyList ); } } } else { puts("pl {-input } {-output }"); puts( " - Reads an ASCII property list from standard in, or a serialized one"); puts(" if -input is specified."); puts( " - Writes an ASCII propert list to standard out, or a serialized one"); puts(" if -output is specified."); } [pool drain]; exit(0); // insure the process exit status is 0 return 0; // ...and make main fit the ANSI spec. } gnustep-base-1.29.0/Tools/pl2link.m000066400000000000000000000161061435650067400170470ustar00rootroot00000000000000/* This tool produces a desktop link file for KDE and Gnome out of a GNUstep property list. Copyright (C) 2001, 2011 Free Software Foundation, Inc. Written by: Fred Kiefer Created: December 2001 This file is part of the GNUstep Project This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. You should have received a copy of the GNU General Public License along with this program; see the file COPYINGv3. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #import #import "common.h" #import "Foundation/NSArray.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSData.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSException.h" #import "Foundation/NSFileManager.h" #import "Foundation/NSProcessInfo.h" #import "Foundation/NSPathUtilities.h" #ifdef _MSC_VER #define popen _popen #endif int main(int argc, char** argv, char **env) { NSAutoreleasePool *pool; NSProcessInfo *procinfo; NSArray *args; NSString *sourceName; NSString *destName; NSMutableString *fileContents; NSDictionary *plist = nil; NSArray *list; NSString *entry; NSString *installPath = @""; NSString *appName = @""; #ifdef GS_PASS_ARGUMENTS GSInitializeProcess(argc, argv, env); #endif pool = [NSAutoreleasePool new]; procinfo = [NSProcessInfo processInfo]; if (procinfo == nil) { NSLog(@"plmerge: unable to get process information!"); [pool release]; exit(EXIT_SUCCESS); } args = [procinfo arguments]; if ([args count] < 2) { GSPrintf(stderr, @"Usage: %@ input-file [destination-file]\n", [procinfo processName]); [pool release]; exit(EXIT_SUCCESS); } sourceName = [args objectAtIndex: 1]; if ([args count] > 2) { destName = [args objectAtIndex: 2]; } else { /* Filled in later */ destName = nil; } NS_DURING { fileContents = [NSMutableString stringWithContentsOfFile: sourceName]; plist = [fileContents propertyList]; } NS_HANDLER { GSPrintf(stderr, @"Parsing '%@' - %@\n", sourceName, [localException reason]); } NS_ENDHANDLER if ((plist == nil) || ![plist isKindOfClass: [NSDictionary class]]) { GSPrintf(stderr, @"The source property list must contain an NSDictionary.\n"); [pool release]; exit(EXIT_FAILURE); } fileContents = [NSMutableString stringWithCapacity: 200]; [fileContents appendString: @"[Desktop Entry]\nType=Application\n"]; list = [plist objectForKey: @"FreeDesktopCategories"]; if (list != nil && [list isKindOfClass: [NSArray class]] && [list count] > 0) { [fileContents appendString: @"Categories="]; [fileContents appendString: [list componentsJoinedByString: @";"]]; [fileContents appendString: @";\n"]; } else { [fileContents appendString: @"Categories=X-GNUstep;\n"]; } entry = [plist objectForKey: @"ApplicationName"]; if (entry != nil) { appName = entry; [fileContents appendFormat: @"Name=%@\n", entry]; [fileContents appendFormat: @"StartupWMClass=%@\n", entry]; if (destName == nil) destName = [entry stringByAppendingString: @".desktop"]; } entry = [plist objectForKey: @"ApplicationDescription"]; if (entry != nil) { [fileContents appendFormat: @"Comment=%@\n", entry]; } /* Try to guess where the application will be installed. PS: At the moment, this is only required for NSIcon, so I suppose we could skip it if there is no NSIcon. */ { /* The default installation domain is the local domain. Assume that's the case unless something is specified. */ NSSearchPathDomainMask domain = NSLocalDomainMask; NSString *installDomain; NSArray *installPaths; installDomain = [[procinfo environment] objectForKey: @"GNUSTEP_INSTALLATION_DOMAIN"]; if(installDomain != nil) { if ([installDomain isEqualToString: @"SYSTEM"]) { domain = NSSystemDomainMask; } else if ([installDomain isEqualToString: @"NETWORK"]) { domain = NSNetworkDomainMask; } else if ([installDomain isEqualToString: @"USER"]) { domain = NSUserDomainMask; } /* In all other cases, we leave domain == NSLocalDomainMask. */ } installPaths = NSSearchPathForDirectoriesInDomains (NSApplicationDirectory, domain, YES); if ([installPaths count] > 0) { installPath = [installPaths objectAtIndex: 0]; } else { /* Ahm - this should never happen. */ GSPrintf(stderr, @"Error determining the application installation location\n"); /* Try to get any application installation path. */ installPaths = NSSearchPathForDirectoriesInDomains (NSApplicationDirectory, NSAllDomainsMask, YES); if ([installPaths count] > 0) { installPath = [installPaths objectAtIndex: 0]; GSPrintf(stderr, @"Assuming it will be installed into '%@' (this may be wrong!)\n", installPath); } else { [pool release]; exit(EXIT_FAILURE); } } } entry = [plist objectForKey: @"NSIcon"]; if (entry != nil) { NSString *iconPath = [[[[installPath stringByAppendingPathComponent:appName] stringByAppendingPathExtension:@"app"] stringByAppendingPathComponent:@"Resources"] stringByAppendingPathComponent:entry]; if ([[iconPath pathExtension] isEqualToString: @""]) { [fileContents appendFormat: @"Icon=%@.tiff\n", iconPath]; } else { [fileContents appendFormat: @"Icon=%@\n", iconPath]; } } entry = [plist objectForKey: @"NSExecutable"]; if (entry != nil) { FILE *fp; char line[130]; NSString *execPath = nil; int l = 0; fp = popen("which openapp","r"); fgets(line,sizeof line,fp); l = strlen(line); line[l-1] = '\0'; // Build the string to execute the application... execPath = [NSString stringWithCString: line encoding: NSASCIIStringEncoding]; [fileContents appendFormat: @"Exec=%@ %@\n", execPath, entry]; } list = [plist objectForKey: @"NSTypes"]; if (list != nil) { if([list count] > 0) { unsigned int i; [fileContents appendString: @"MimeType="]; for (i = 0; i < [list count]; i++) { NSArray *types; unsigned int j; plist = [list objectAtIndex: i]; types = [plist objectForKey: @"NSMIMETypes"]; if (types != nil) { for (j = 0; j < [types count]; j++) { entry = [types objectAtIndex: j]; [fileContents appendFormat: @"%@;", entry]; } } } [fileContents appendString: @"\n"]; } } if ([[fileContents dataUsingEncoding: NSUTF8StringEncoding] writeToFile: destName atomically: YES] == NO) { GSPrintf(stderr, @"Error writing property list to '%@'\n", destName); } [pool release]; exit(EXIT_SUCCESS); } gnustep-base-1.29.0/Tools/pldes.1000066400000000000000000000066411435650067400165120ustar00rootroot00000000000000.\"property list tools man page .\"written by Adrian Robert (arobert@cogsci.ucsd.edu) .\"Copyright (C) 2005 Free Software Foundation, Inc. .\"Copying and distribution of this file, with or without modification, .\"are permitted in any medium without royalty provided the copyright .\"notice and this notice are preserved. .\" .\"Process this file with .\"groff -man -Tascii gdnc.1 .\" .TH PLDES 1 "August 2003" GNUstep "GNUstep System Manual" .SH NAME pl, pldes, plser, plmerge, plparse, pl2link \- property list tools .SH SYNOPSIS .nf .BI "pldes " "filename(s)" .nf .BI "plget " "key" [ more keys ] .nf .BI "plser [ " "-format" "fmt" " ] filename(s)" .nf .BI "plmerge [ " "destination-file" " ] [ " "input-file(s)" " ]" .nf .BI "plparse " "filename(s)" .nf .BI "pl2link " "input-file" " [ " "destination-file" " ]" .nf .BI "pl -input [ " "input-file" " ] " " -output [ " "destination-file" " ]" .nf .SH DESCRIPTION .P Property lists in GNUstep are hierarchical lists of values or attribute-value pairs. Programmatically they are represented by instances of the NSString, NSData, NSArray, or NSDictionary (most common) class (which may contain other instances of such classes). These instances can be serialized as binary objects to form a persistent representation. In addition, there are two alternative human-readable representations. The first, utilized in NeXTstep and OpenStep, utilizes a text format with equals signs expressing attribute-value bindings and set braces expressing hierarchical organization. The second, often (uninformatively) referred to as "plist" format, is in XML and is used by Mac OS X. The tools described here are utilities for manipulating the various persistent property list representations as files. .IP "\fBpldes\fR \fIfilename(s)\fR" 4 Converts a binary serialised property list (class instance) to a text representation. .IP "\fBplget\fR \fIkey\fR" 4 Reads a text representation of a dictionary in property list format as standard input, extracts the string value held in that dictionary with the specified key, and writes the result to standard output. Multiple keys may be used to extract values from nested dictionaries. .IP "\fBplser\fR [ \fI-format format\fR ] \fIfilename(s)\fR" 4 Converts a text representation of a property list to a binary serialized representation, or to another selected format. .IP "\fBplmerge\fR [ \fIdestination-file\fR ] [ \fIinput-file(s)\fR ]" 4 Merges text property lists into a single property list .IP "\fBplparse\fR \fIfilename(s)\fR" 4 Checks that each file contains a valid text representation of a property list. .IP "\fBpl2link\fR \fIinput-file\fR [ \fIdestination-file\fR ]" 4 Produces a desktop link file for KDE and Gnome for the given text representation of a property list. .IP "\fBpl\fR \fI-input\fR [ \fIinput-file\fR ]" 4 Takes the serialized plist represented by input-file and outputs it to standard output. .IP "\fBpl\fR \fI-output\fR [ \fIdestination-file\fR ]" 4 Takes a plist from standard input and serializes it into destination-file. .PP .SH SEE ALSO defaults(1) .SH HISTORY Written 1999-2000. .PP This manual page first appeared in gnustep-base 1.9.2 (March 2004). .P .SH AUTHORS .B pldes, plget, plparse, plser were written by Richard Frith-Macdonald . .PP .B plmerge was written by Jonathan Gapen . .PP .B pl2link was written by Fred Kiefer . .PP .B pl was written by Gregory Casamento . gnustep-base-1.29.0/Tools/pldes.m000066400000000000000000000060111435650067400165750ustar00rootroot00000000000000/** This tool converts a serialised property list to a text representation. Copyright (C) 1999 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: may 1999 This file is part of the GNUstep Project This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. You should have received a copy of the GNU General Public License along with this program; see the file COPYINGv3. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #import "common.h" #import "Foundation/NSArray.h" #import "Foundation/NSData.h" #import "Foundation/NSException.h" #import "Foundation/NSProcessInfo.h" #import "Foundation/NSUserDefaults.h" #import "Foundation/NSFileHandle.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSPropertyList.h" /**

    This tool converts a serialised property list to a text * representation. *

    */ int main(int argc, char** argv, char **env) { NSAutoreleasePool *pool; NSProcessInfo *proc; NSArray *args; unsigned i; #ifdef GS_PASS_ARGUMENTS GSInitializeProcess(argc, argv, env); #endif pool = [NSAutoreleasePool new]; proc = [NSProcessInfo processInfo]; if (proc == nil) { NSLog(@"pldes: unable to get process information!\n"); [pool release]; exit(EXIT_SUCCESS); } args = [proc arguments]; if ([args count] <= 1) { GSPrintf(stderr, @"No file names given to deserialize.\n"); } else { NSUserDefaults *defs = [NSUserDefaults standardUserDefaults]; NSDictionary *locale = [defs dictionaryRepresentation]; for (i = 1; i < [args count]; i++) { NSString *file = [args objectAtIndex: i]; NS_DURING { NSData *myData; NSString *myString; id result; NSPropertyListFormat aFormat; NSError *anError; myData = [NSData dataWithContentsOfFile: file]; result = [NSPropertyListSerialization propertyListWithData: myData options: NSPropertyListImmutable format: &aFormat error: &anError]; if (result == nil) { GSPrintf(stderr, @"Loading '%@' - %@\n", file, anError); } else { NSFileHandle *out; myString = [result descriptionWithLocale: locale indent: 0]; out = [NSFileHandle fileHandleWithStandardOutput]; myData = [myString dataUsingEncoding: NSASCIIStringEncoding]; [out writeData: myData]; [out synchronizeFile]; } } NS_HANDLER { GSPrintf(stderr, @"Loading '%@' - %@\n", file, [localException reason]); } NS_ENDHANDLER } } [pool release]; return 0; } gnustep-base-1.29.0/Tools/plget.m000066400000000000000000000066251435650067400166140ustar00rootroot00000000000000/** This tool extracts a string value from a dictionary in a property list. Copyright (C) 1999 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: may 1999 This file is part of the GNUstep Project This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. You should have received a copy of the GNU General Public License along with this program; see the file COPYINGv3. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #import "common.h" #import "Foundation/NSArray.h" #import "Foundation/NSData.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSException.h" #import "Foundation/NSProcessInfo.h" #import "Foundation/NSUserDefaults.h" #import "Foundation/NSFileHandle.h" #import "Foundation/NSAutoreleasePool.h" /**

    This tool extracts a string value from a dictionary in a property list representation.
    It takes one or more argument (the key to be extracted).
    It expects to read the property list from STDIN.
    It writes the string value (if any) on STDOUT
    Where multiple keys are specified, they are used to extract nested values from dictionaries within the outermost dictionary.
    Where the resulting object exists and is not a string, its description is written to STDOUT.

    */ int main(int argc, char** argv, char **env) { CREATE_AUTORELEASE_POOL(pool); NSProcessInfo *proc; NSArray *args; int status = EXIT_SUCCESS; int count; #ifdef GS_PASS_ARGUMENTS GSInitializeProcess(argc, argv, env); #endif proc = [NSProcessInfo processInfo]; if (proc == nil) { NSLog(@"plget: unable to get process information."); RELEASE(pool); exit(EXIT_FAILURE); } args = [proc arguments]; if ((count = [args count]) <= 1) { NSLog(@"plget: no key given to get."); RELEASE(pool); exit(EXIT_FAILURE); } else { NSFileHandle *fileHandle; NSData *inputData; NSString *inputString; NSData *outputData; NS_DURING { int i = 1; id value; fileHandle = [NSFileHandle fileHandleWithStandardInput]; inputData = [fileHandle readDataToEndOfFile]; inputString = [[NSString alloc] initWithData: inputData encoding: NSUTF8StringEncoding]; if (inputString == nil) { inputString = [[NSString alloc] initWithData: inputData encoding: [NSString defaultCStringEncoding]]; } value = [inputString propertyList]; RELEASE(inputString); while (i < count-1) { value = [(NSDictionary*)value objectForKey: [args objectAtIndex: i++]]; } value = [(NSDictionary*)value objectForKey: [args objectAtIndex: i]]; if ([value isKindOfClass: [NSString class]] == NO) { value = [value description]; } outputData = [value dataUsingEncoding: [NSString defaultCStringEncoding]]; if ([outputData length] > 0) { fileHandle = [NSFileHandle fileHandleWithStandardOutput]; [fileHandle writeData: outputData]; } } NS_HANDLER { NSLog(@"Problem: %@", localException); status = EXIT_FAILURE; } NS_ENDHANDLER } RELEASE(pool); return status; } gnustep-base-1.29.0/Tools/plist-0_9.dtd000066400000000000000000000042121435650067400175260ustar00rootroot00000000000000 gnustep-base-1.29.0/Tools/plmerge.m000066400000000000000000000100141435650067400171170ustar00rootroot00000000000000/** This tool merges text property lists into a single property list. Copyright (C) 2000 Free Software Foundation, Inc. Written by: Jonathan Gapen Created: April 2000 This file is part of the GNUstep Project This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. You should have received a copy of the GNU General Public License along with this program; see the file COPYINGv3. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #import "common.h" #import "Foundation/NSArray.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSData.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSException.h" #import "Foundation/NSFileManager.h" #import "Foundation/NSProcessInfo.h" #import "GNUstepBase/Additions.h" /**

    This tool merges text property lists into a single property list.

    */ int main(int argc, char** argv, char **env) { NSAutoreleasePool *pool; NSProcessInfo *procinfo; NSArray *args; NSString *destName; NSString *fileContents; NSMutableDictionary *plist = nil; unsigned i; #ifdef GS_PASS_ARGUMENTS GSInitializeProcess(argc, argv, env); #endif pool = [NSAutoreleasePool new]; procinfo = [NSProcessInfo processInfo]; if (procinfo == nil) { NSLog(@"plmerge: unable to get process information!"); [pool release]; exit(EXIT_SUCCESS); } args = [procinfo arguments]; if ([args count] < 3) { GSPrintf(stderr, @"Usage: %@ [destination-file] [input-file ...]\n", [procinfo processName]); [pool release]; exit(EXIT_SUCCESS); } destName = [args objectAtIndex: 1]; if ([[NSFileManager defaultManager] fileExistsAtPath: destName]) { NS_DURING { fileContents = [NSString stringWithContentsOfFile: destName]; plist = [fileContents propertyList]; } NS_HANDLER { GSPrintf(stderr, @"Parsing '%@' - %@\n", destName, [localException reason]); } NS_ENDHANDLER if ((plist == nil) || ![plist isKindOfClass: [NSDictionary class]]) { GSPrintf(stderr, @"The destination property list must contain an NSDictionary.\n"); [pool release]; exit(EXIT_FAILURE); } plist = [plist mutableCopy]; } else { plist = [NSMutableDictionary new]; } for (i = 2; i < [args count]; i++) { NSString *filename = [args objectAtIndex: i]; NSString *key = filename; id object = nil; NS_DURING { fileContents = [NSString stringWithContentsOfFile: filename]; object = [fileContents propertyList]; } NS_HANDLER { GSPrintf(stderr, @"Parsing '%@' - %@\n", filename, [localException reason]); } NS_ENDHANDLER if ([[filename pathExtension] isEqualToString: @"plist"]) { key = [filename stringByDeletingPathExtension]; } if (object == nil) GSPrintf(stderr, @"Parsing '%@' - nil property list\n", filename); else if ([object isKindOfClass: [NSArray class]] == YES) [plist setObject: object forKey: key]; else if ([object isKindOfClass: [NSData class]] == YES) [plist setObject: object forKey: key]; else if ([object isKindOfClass: [NSDictionary class]] == YES) [plist addEntriesFromDictionary: object]; else if ([object isKindOfClass: [NSString class]] == YES) [plist setObject: object forKey: key]; else GSPrintf(stderr, @"Parsing '%@' - unexpected class - %@\n", filename, [[object class] description]); } if ([plist writeToFile: destName atomically: YES] == NO) GSPrintf(stderr, @"Error writing property list to '%@'\n", destName); RELEASE(plist); [pool release]; exit(EXIT_SUCCESS); } gnustep-base-1.29.0/Tools/plparse.m000066400000000000000000000100221435650067400171310ustar00rootroot00000000000000/** This tool checks that a file contains a valid text property-list. Copyright (C) 1999 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: February 1999 This file is part of the GNUstep Project This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. You should have received a copy of the GNU General Public License along with this program; see the file COPYINGv3. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #import "common.h" #import "Foundation/NSArray.h" #import "Foundation/NSCharacterSet.h" #import "Foundation/NSData.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSException.h" #import "Foundation/NSProcessInfo.h" #import "Foundation/NSUserDefaults.h" #import "Foundation/NSAutoreleasePool.h" /* * If there is any non-ascii characrer in the string, * and the file data did not begin with a unicode BOM to identify * it as unicode data, we return the location of the first * bad character, otherwise return -1; */ static int firstBadCharacter(NSString *file, NSString *content) { static NSCharacterSet *cs = nil; NSData *d; NSRange r; if (cs == nil) { cs = [NSCharacterSet characterSetWithRange: NSMakeRange(1, 127)]; cs = RETAIN([cs invertedSet]); } r = [content rangeOfCharacterFromSet: cs]; if (r.length == 0) { return -1; } d = [NSData dataWithContentsOfFile: file]; if ([d length] > 2) { const unsigned char *ptr = (const unsigned char*)[d bytes]; if ((ptr[0] == 0xff && ptr[1] == 0xfe) // UCS2 || (ptr[0] == 0xfe && ptr[1] == 0xff) // UCS2 || (ptr[0] == 0xef && ptr[1] == 0xbb && ptr[2] == 0xbf)) // UTF8 { return -1; } } return r.location; } /**

    This tool checks that a file contains a valid text property-list.

    */ int main(int argc, char** argv, char **env) { NSAutoreleasePool *pool; NSProcessInfo *proc; NSArray *args; unsigned i; int retval = 0; #ifdef GS_PASS_ARGUMENTS GSInitializeProcess(argc, argv, env); #endif pool = [NSAutoreleasePool new]; proc = [NSProcessInfo processInfo]; if (proc == nil) { NSLog(@"plparse: unable to get process information!\n"); [pool release]; exit(EXIT_FAILURE); } args = [proc arguments]; if ([args count] <= 1) { GSPrintf(stderr, @"No file names given to parse.\n"); } else { for (i = 1; i < [args count]; i++) { NSString *file = [args objectAtIndex: i]; NS_DURING { NSString *myString; id result; int bad; myString = [NSString stringWithContentsOfFile: file]; if (myString == nil) GSPrintf(stderr, @"Parsing '%@' - not valid string\n", file); else if ((bad = firstBadCharacter(file, myString)) >= 0) GSPrintf(stderr, @"Parsing '%@' - bad char '\\U%04x' at %d\n", file, [myString characterAtIndex: bad], bad); else if ((result = [myString propertyList]) == nil) GSPrintf(stderr, @"Parsing '%@' - nil property list\n", file); else if ([result isKindOfClass: [NSDictionary class]] == YES) GSPrintf(stderr, @"Parsing '%@' - a dictionary\n", file); else if ([result isKindOfClass: [NSArray class]] == YES) GSPrintf(stderr, @"Parsing '%@' - an array\n", file); else if ([result isKindOfClass: [NSData class]] == YES) GSPrintf(stderr, @"Parsing '%@' - a data object\n", file); else if ([result isKindOfClass: [NSString class]] == YES) GSPrintf(stderr, @"Parsing '%@' - a string\n", file); else GSPrintf(stderr, @"Parsing '%@' - unexpected class - %@\n", file, [[result class] description]); } NS_HANDLER { GSPrintf(stderr, @"Parsing '%@' - %@\n", file, [localException reason]); retval = 1; } NS_ENDHANDLER } } [pool release]; return retval; } gnustep-base-1.29.0/Tools/plser.m000066400000000000000000000126631435650067400166250ustar00rootroot00000000000000/** This tool converts a text property list to a serialised representation. Copyright (C) 1999 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: may 1999 This file is part of the GNUstep Project This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. You should have received a copy of the GNU General Public License along with this program; see the file COPYINGv3. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #import "common.h" #import "Foundation/NSArray.h" #import "Foundation/NSData.h" #import "Foundation/NSException.h" #import "Foundation/NSProcessInfo.h" #import "Foundation/NSUserDefaults.h" #import "Foundation/NSFileHandle.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSPropertyList.h" #import "Foundation/NSUserDefaults.h" /**

    This tool converts a text property list to a another serialised * representation. *

    */ int main(int argc, char** argv, char **env) { NSAutoreleasePool *pool; NSUserDefaults *defs; NSProcessInfo *proc; NSArray *args; unsigned i; #ifdef GS_PASS_ARGUMENTS GSInitializeProcess(argc, argv, env); #endif pool = [NSAutoreleasePool new]; proc = [NSProcessInfo processInfo]; if (proc == nil) { NSLog(@"plser: unable to get process information!\n"); [pool release]; exit(EXIT_SUCCESS); } defs = [NSUserDefaults standardUserDefaults]; args = [proc arguments]; if ([args count] <= 1 || ([defs objectForKey: @"Format"] != nil && [args count] < 3)) { GSPrintf(stderr, @"No file names given to serialize. Try --help\n"); } else { NSString *fmt = [defs stringForKey: @"Format"]; for (i = 1; i < [args count]; i++) { NSString *file = [args objectAtIndex: i]; if ([file isEqual: @"--help"]) { GSPrintf(stdout, @"This program takes one or more property list files\n"); GSPrintf(stdout, @"as input and reserialises them to stdout.\n"); GSPrintf(stdout, @"The only permitted argument is -Format to\n"); GSPrintf(stdout, @"specify the output format to use... one of:\n"); GSPrintf(stdout, @" NSPropertyListOpenStepFormat\n"); GSPrintf(stdout, @" NSPropertyListXMLFormat_v1_0\n"); GSPrintf(stdout, @" NSPropertyListBinaryFormat_v1_0\n"); GSPrintf(stdout, @" NSPropertyListGNUstepFormat\n"); GSPrintf(stdout, @" NSPropertyListGNUstepBinaryFormat\n"); [pool release]; exit(EXIT_SUCCESS); } if ([file isEqual: @"-Format"]) { i++; continue; } NS_DURING { NSData *myData; id incoming; NSPropertyListFormat inFormat; NSError *anError; myData = [NSData dataWithContentsOfFile: file]; incoming = [NSPropertyListSerialization propertyListWithData: myData options: NSPropertyListImmutable format: &inFormat error: &anError]; if (nil == incoming) { GSPrintf(stderr, @"Loading '%@' - %@\n", file, anError); } else { NSFileHandle *out; NSPropertyListFormat outFormat; outFormat = NSPropertyListGNUstepBinaryFormat; if ([fmt isEqual: @"NSPropertyListOpenStepFormat"]) outFormat = NSPropertyListOpenStepFormat; else if ([fmt isEqual: @"NSPropertyListXMLFormat_v1_0"]) outFormat = NSPropertyListXMLFormat_v1_0; else if ([fmt isEqual: @"NSPropertyListBinaryFormat_v1_0"]) outFormat = NSPropertyListBinaryFormat_v1_0; else if ([fmt isEqual: @"NSPropertyListGNUstepFormat"]) outFormat = NSPropertyListGNUstepFormat; else if ([fmt isEqual: @"NSPropertyListGNUstepBinaryFormat"]) outFormat = NSPropertyListGNUstepBinaryFormat; myData = [NSPropertyListSerialization dataWithPropertyList: incoming format: outFormat options: 0 error: &anError]; #if 0 /* Check serialisation/deserialisation gives original value. */ { id result; result = [NSPropertyListSerialization propertyListWithData: myData options: NSPropertyListImmutable format: 0 error: &anError]; if (NO == [incoming isEqual: result]) { NSLog(@"Lossy conversion"); } } #endif out = [NSFileHandle fileHandleWithStandardOutput]; [out writeData: myData]; [out synchronizeFile]; } } NS_HANDLER { GSPrintf(stderr, @"Loading '%@' - %@\n", file, [localException reason]); } NS_ENDHANDLER } } [pool release]; return 0; } gnustep-base-1.29.0/Tools/plutil.1000066400000000000000000000035201435650067400167050ustar00rootroot00000000000000.\"Copyright (C) 2020 Free Software Foundation, Inc. .\"Copying and distribution of this file, with or without modification, .\"are permitted in any medium without royalty provided the copyright .\"notice and this notice are preserved. .Dd September 23, 2020 .Dt plutil 1 .Os .Sh NAME .Nm plutil .Nd Property list utility .Sh SYNOPSIS .Nm progname .Op Fl command .Op Fl options .Ar file .Sh DESCRIPTION The .Nm utility can be used to edit property lists, to verify the syntax, or to convert from one format to another. If .Ql - is given as the file path, stdin and stdout are used. .Pp The first part is the action to perform, one of: .Bl -tag .It -p Print the whole plist to stdout, in the human-readable GNUStep format. .It -lint Verifies the plist can be parsed. .It -convert Ar FMT Converts the plist to another format. .Ql FMT can be one of: .Bl -tag .It xml1 Apple XML. .It binary1 Apple binary. .It openstep OpenStep (untyped human-readable). .It gnustep GNUStep (typed human-readable). .It json JSON (lossy human-readable). .El The NSPropertyListFormat names are accepted too. .It -insert Ar PATH Ar KEY Ar Value .El The default action is .Ql -lint. .Pp The general options are: .Bl -tag .El .Pp The plutil "keypath" is a dot-separated chain of keys for traversing a plist object. An empty keypath refers to the object itself. The format of keys conform to that of GNUStep plist string literals. .Sh IMPLEMENTATION NOTES .Bl .It Quoted strings in the keypath is a GNUStep extension. .It The Objective-C and Swift literal output formats are not yet implemented. .El .Sh EXIT STATUS .Pp 0 on success. .Sh EXAMPLES .Sh DIAGNOSTICS .Sh SEE ALSO .Xr pl 1 .Xr pldes 1 .Sh AUTHORS .An -nosplit This version of .Nm was written by .An Mingye Wang Aq Mt arthur2e5@aosc.io . .Nm first appeared in Mac OS X 10.2. It received path-related capabilities around Mac OS X 10.13. gnustep-base-1.29.0/Tools/plutil.m000066400000000000000000000427721435650067400170150ustar00rootroot00000000000000/** Property list utility. Copyright (C) 2020 Free Software Foundation, Inc. Written by: Mingye Wang Created: feb 2020 This file is part of the GNUstep Project This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. You should have received a copy of the GNU General Public License along with this program; see the file COPYINGv3. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ // #import "common.h" #include #import "Foundation/NSArray.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSData.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSException.h" #import "Foundation/NSFileHandle.h" #import "Foundation/NSProcessInfo.h" #import "Foundation/NSPropertyList.h" #import "Foundation/NSString.h" #import "Foundation/NSUserDefaults.h" #import "Foundation/NSValue.h" #import "NSPropertyList+PLUtil.h" // From NSPropertyList.m GS_EXPORT void GSPropertyListMake(id, NSDictionary *, BOOL, BOOL, unsigned, id *); // We don't have @[] on gcc #define NARRAY(...) [NSArray arrayWithObjects: __VA_ARGS__, nil] // And no @() or @123 #define NINT(Num) [NSNumber numberWithInt: Num] // Unfortunately we have to define @() for @"" too because a macro later #define NSTR(Str) [NSString stringWithCString: Str] /* Bitmap of 'quotable' characters ... those characters which must be * inside a quoted string if written to an old style property list. * Taken from NSPropertyList.m. */ static const unsigned char quotables[32] = { '\xff', '\xff', '\xff', '\xff', '\x85', '\x13', '\x00', '\x78', '\x00', '\x00', '\x00', '\x38', '\x01', '\x00', '\x00', '\xa8', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', }; #define IS_BIT_SET(a, i) ((((a) & (1 << (i)))) > 0) #define GS_IS_QUOTABLE(X) IS_BIT_SET(quotables[(X) / 8], (X) % 8) /** * Indexes a NSArray or a NSDictionary. */ id plIndex(id obj, NSString *key) { const char *ckey; char *endptr = NULL; NSInteger res; if ([obj isKindOfClass: [NSDictionary class]]) { return [(NSDictionary *) obj objectForKey: key]; } else if ([obj isKindOfClass: [NSArray class]]) { ckey = [key cStringUsingEncoding: [NSString defaultCStringEncoding]]; res = strtoll(ckey, &endptr, 10); if (endptr && *endptr != '\0') { [NSException raise: NSInvalidArgumentException format: @"%@ is not a valid integer", key]; } return [(NSArray *) obj objectAtIndex: res]; } else { [NSException raise: NSInvalidArgumentException format: @"%@ is not indexible", obj]; return nil; } } /** * Mutate obj[key] to leaf. * If leaf is nil, remove. * Else if replace is NO, insert. * Otherwise replace. * * Inserting and replacing are the same for NSMutableDictionary. */ void mutate(id obj, NSString *key, id leaf, BOOL replace) { const char *ckey; char *endptr = NULL; NSInteger res; if ([obj isKindOfClass: [NSMutableDictionary class]]) { if (!leaf) [(NSMutableDictionary *) obj removeObjectForKey: key]; else [(NSMutableDictionary *) obj setObject: leaf forKey: key]; } else if ([obj isKindOfClass: [NSMutableArray class]]) { ckey = [key cStringUsingEncoding: [NSString defaultCStringEncoding]]; res = strtoll(ckey, &endptr, 10); if (endptr && *endptr != '\0') { [NSException raise: NSInvalidArgumentException format: @"%@ is not a valid integer", key]; } if (!leaf) [(NSMutableArray *) obj removeObjectAtIndex: res]; else if (replace) [(NSMutableArray *) obj replaceObjectAtIndex: res withObject: leaf]; else [(NSMutableArray *) obj insertObject: leaf atIndex: res]; } else { [NSException raise: NSInvalidArgumentException format: @"%@ is not indexible", obj]; } } #define KEYPATH_SEP '.' NSString * parseQuotedString(const char *, size_t *); /** * Parses a keypath to its component keys. ISO/IEC 14977 EBNF: *
     * keypath = '' | keypath '.' key;
     * key = quotedString | unquotedStringNotAllowingPeriod;
     * 
    * The definitions of strings follow plist conventions. * The use of quoted strings is a GNUstep extension (I think). */ NSArray * parseKeyPath(const char *keypath) { NSMutableArray *res = [[NSMutableArray alloc] init]; NSString *key = nil; size_t i; size_t j; for (i = 0; keypath[i]; i++) { switch (keypath[i]) { case KEYPATH_SEP: if (key != nil) { [res addObject: key]; key = nil; } break; case '"': key = parseQuotedString(keypath, &i); break; default: j = i; while (keypath[j] && !GS_IS_QUOTABLE(keypath[j]) && keypath[j] != KEYPATH_SEP) { j++; } key = [NSString stringWithCString: &keypath[i] length: (j - i)]; i = j - 1; break; } } return [res copy]; } /** * Parse a quoted string by pretending it is a plist. */ NSString * parseQuotedString(const char *keypath, size_t *i) { const char *begin = &keypath[*i]; const char *end; id parsed; // Select the part of the quoted string that looks like a plist string for (end = begin + 1; *end && *end != '"'; end++) { if (*end == '\\') { if (end[1]) { end += 1; } else { [NSException raise: NSInvalidArgumentException format: @"Premature EOF in keypath"]; } } } if (!*end) { [NSException raise: NSInvalidArgumentException format: @"Premature EOF in keypath"]; } *i = end - keypath + 1; parsed = [[NSString stringWithCString: begin length: end-begin] propertyList]; return (NSString *)parsed; } /** * Index by keypath. */ id plIndexKeypath(id obj, NSString *keypath, int depthOffset) { NSArray *parsedPath = parseKeyPath([keypath cString]); int count = [parsedPath count]; int i; for (i = 0; i < count - depthOffset; i++) obj = plIndex(obj, [parsedPath objectAtIndex: i]); return obj; } /** * Interpret -type value options. * * The -plist type is a GNUStep extension. */ id parseValue(NSString *type, NSString *value) { if ([type isEqual: @"-plist"]) return [value propertyList]; else if ([type isEqual: @"-xml"] || [type isEqual: @"-date"]) { NSData *mydata = [value dataUsingEncoding: [NSString defaultCStringEncoding]]; NSPropertyListFormat aFormat; NSError * anError; id result = [NSPropertyListSerialization propertyListWithData: mydata options: NSPropertyListMutableContainersAndLeaves format: &aFormat error: &anError]; if (result == nil) { GSPrintf(stderr, @"Parsing plist %@: %@\n", value, anError); return nil; } else if ([type isEqual: @"-xml"] && aFormat != NSPropertyListXMLFormat_v1_0) GSPrintf(stderr, @"Warning: parsing XML plist %@: Not an XML (fmt %d)\n", value, aFormat); else if ([type isEqual: @"-date"] && ![result isKindOfClass: [NSDate class]]) GSPrintf(stderr, @"Warning: parsing date %@: Not a date (got %@)\n", value, result); return result; } else if ([type isEqual: @"-bool"]) return [NSNumber numberWithBool: ([value isEqual: @"YES"] || [value isEqual: @"true"])]; else if ([type isEqual: @"-integer"]) return [[NSNumber alloc] initWithLongLong: [value longLongValue]]; else if ([type isEqual: @"-float"]) // We do a step further than NSPropertyList.m and probably Apple, // since notsupporting inf and nan is a bad look // (No hex literals for now unless someone really wants it) return [[NSNumber alloc] initWithDouble: strtod([value cString], 0)]; else if ([type isEqual: @"-data"]) return [[NSData alloc] initWithBase64EncodedData: [value dataUsingEncoding: [NSString defaultCStringEncoding]] options: NSDataBase64DecodingIgnoreUnknownCharacters]; else GSPrintf(stderr, @"Unrecognized type %@\n", type); return nil; } #define SELFMAP(Name) NINT(Name), NSTR(#Name) /** * Translates a string fmt to NSPropertyListFormat. */ NSPropertyListFormat plFormatFromName(NSString *name) { // clang-format off NSDictionary *nameMap = [NSDictionary dictionaryWithObjectsAndKeys: NINT(NSPropertyListXMLFormat_v1_0), @"xml1", NINT(NSPropertyListBinaryFormat_v1_0), @"binary1", NINT(NSPropertyListOpenStepFormat), @"openstep", NINT(NSPropertyListGNUstepFormat), @"gnustep", NINT(NSPropertyListGNUstepBinaryFormat), @"gsbinary", NINT(NSPropertyListJSONFormat), @"json", SELFMAP(NSPropertyListOpenStepFormat), SELFMAP(NSPropertyListXMLFormat_v1_0), SELFMAP(NSPropertyListBinaryFormat_v1_0), SELFMAP(NSPropertyListGNUstepFormat), SELFMAP(NSPropertyListGNUstepBinaryFormat), nil]; id res = [nameMap objectForKey: name]; // clang-format on if (!res) [NSException raise: NSInvalidArgumentException format: @"Invalid fmt %@", name]; return [res intValue]; } /** * Dumps obj to outfile. */ int dumpToFile(id obj, NSPropertyListFormat fmt, NSString *outfile) { NSString *errorString = nil; NSFileHandle *fh; NSData *outdata = [NSPropertyListSerialization dataFromPropertyList: obj format: fmt errorDescription: &errorString]; if (errorString) { GSPrintf(stderr, @"Dumping %@ as format %@ - %@\n", obj, fmt, errorString); return EXIT_FAILURE; } if ([outfile isEqual: @"-"]) fh = [NSFileHandle fileHandleWithStandardOutput]; else fh = [NSFileHandle fileHandleForWritingAtPath: outfile]; [fh writeData: outdata]; [fh synchronizeFile]; return EXIT_SUCCESS; } int plCmdConvert(id obj, NSArray *cmdargs, NSString *outfile) { NSString *fmt = [cmdargs objectAtIndex: 0]; return dumpToFile(obj, plFormatFromName(fmt), outfile); } int plCmdExtract(id obj, NSArray *cmdargs, NSString *outfile) { NSString *keypath = [cmdargs objectAtIndex: 0]; NSString *fmt = [cmdargs objectAtIndex: 1]; obj = plIndexKeypath(obj, keypath, 0); return dumpToFile(obj, plFormatFromName(fmt), outfile); } int plCmdRemove(id obj, NSPropertyListFormat fmt, NSArray *cmdargs, NSString *outfile) { NSString *keypath = [cmdargs objectAtIndex: 0]; NSArray *parsedPath = parseKeyPath([keypath cString]); id leaf = plIndexKeypath(obj, keypath, 1); mutate(leaf, [parsedPath lastObject], nil, false); return dumpToFile(obj, fmt, outfile); } int plCmdInsert(id obj, NSPropertyListFormat fmt, NSArray *cmdargs, NSString *outfile) { NSString *keypath = [cmdargs objectAtIndex: 0]; id newleaf = parseValue([cmdargs objectAtIndex: 1], [cmdargs objectAtIndex: 2]); NSArray *parsedPath = parseKeyPath([keypath cString]); id leaf = plIndexKeypath(obj, keypath, 1); if (!newleaf) return EXIT_FAILURE; mutate(leaf, [parsedPath lastObject], newleaf, false); return dumpToFile(obj, fmt, outfile); } int plCmdReplace(id obj, NSPropertyListFormat fmt, NSArray *cmdargs, NSString *outfile) { NSString *keypath = [cmdargs objectAtIndex: 0]; id newleaf = parseValue([cmdargs objectAtIndex: 1], [cmdargs objectAtIndex: 2]); NSArray *parsedPath = parseKeyPath([keypath cString]); id leaf = plIndexKeypath(obj, keypath, 1); if (!newleaf) return EXIT_FAILURE; mutate(leaf, [parsedPath lastObject], newleaf, true); return dumpToFile(obj, fmt, outfile); } static void print_help(FILE *f) { GSPrintf(f, @"Property list utility\n"); GSPrintf(f, @"Usage: plutil [command] [options] file\n\n"); GSPrintf(f, @"Accepted commands:\n"); GSPrintf( f, @" -p\tPrints the plists in a human-readable form (GNUstep ASCII).\n"); GSPrintf( f, @" -lint\tVerifies the plist can be parsed.\n"); GSPrintf( f, @" -convert FMT\tConverts the plist to another format.\n"); GSPrintf( f, @" -insert PATH KEY VALUE\tInsert KEY=VALUE to the object at PATH.\n"); GSPrintf( f, @" -replace PATH KEY VALUE\tReplace KEY=VALUE for the object at PATH.\n"); GSPrintf( f, @" -remove PATH KEY\tRemove KEY from the object at PATH.\n"); GSPrintf( f, @" -extract PATH KEY\tExtract the KEY from the object at PATH.\n"); GSPrintf(f, @"Accepted options:\n"); GSPrintf( f, @" -s\t(No effect.)\n"); GSPrintf( f, @" -o OUTFILE\tOutput to the file given.\n"); GSPrintf( f, @" -e OUTEXT\tOutput to a file with the given extension.\n"); } typedef enum _Action { ACTION_LINT, ACTION_PRINT, ACTION_CONVERT, ACTION_REPLACE, ACTION_INSERT, ACTION_REMOVE, ACTION_EXTRACT, } Action; /**

    Property list utility. Should act like macOS catalina plutil(1). *

    */ int main(int argc, char **argv, char **env) { int status = EXIT_SUCCESS; do { ENTER_POOL NSProcessInfo *proc; NSArray *args; NSString *arg; NSString *inpath; NSArray *cmdargs = nil; NSDictionary *commands = nil; NSArray *command_rhs; NSString *outpath = nil; NSString *outext = nil; Action action = ACTION_LINT; int count = 0; int i = 1; #ifdef GS_PASS_ARGUMENTS GSInitializeProcess(argc, argv, env); #endif proc = [NSProcessInfo processInfo]; if (proc == nil) { NSLog(@"plutil: unable to get process information."); status = EXIT_FAILURE; break; } args = [proc arguments]; if ((count = [args count]) <= 1) { NSLog(@"plutil: no files given."); status = EXIT_FAILURE; break; } // Parse the COMMAND. // Maps number of args to commands. // clang-format off commands = [NSDictionary dictionaryWithObjectsAndKeys: NARRAY(NINT(ACTION_PRINT), NINT(0)), @"-p", NARRAY(NINT(ACTION_LINT), NINT(0)), @"-lint", NARRAY(NINT(ACTION_CONVERT), NINT(1)), @"-convert", NARRAY(NINT(ACTION_INSERT), NINT(3)), @"-insert", NARRAY(NINT(ACTION_REPLACE), NINT(3)), @"-replace", NARRAY(NINT(ACTION_REMOVE), NINT(1)), @"-remove", NARRAY(NINT(ACTION_EXTRACT), NINT(2)), @"-extract", nil]; // clang-format on NS_DURING { NSData *fileData; NSPropertyListFormat aFormat; NSError *anError; id result; NSMutableString *outStr = nil; NSDictionary *locale; arg = [args objectAtIndex: i]; if (![arg hasPrefix: @"-"]) goto parse_file; command_rhs = [commands objectForKey: arg]; if (command_rhs) { int iwant; NSRange argrange; action = [[command_rhs objectAtIndex: 0] intValue]; iwant = [[command_rhs objectAtIndex: 1] intValue]; argrange.location = i + 1; argrange.length = iwant; cmdargs = [args subarrayWithRange: argrange]; i += 1 + iwant; } // Parse options for (; i < count; i++) { arg = [args objectAtIndex: i]; if (![arg hasPrefix: @"-"] || [arg isEqual: @"-"] || [arg isEqual: @"--"]) { goto parse_file; } else if ([arg caseInsensitiveCompare: @"-help"] == NSOrderedSame || [arg caseInsensitiveCompare: @"--help"] == NSOrderedSame || [arg caseInsensitiveCompare: @"-h"] == NSOrderedSame) { print_help(stdout); break; } else if ([arg isEqual: @"-s"]) { /* NOOP: What the heck is being quiet? */; } else if ([arg isEqual: @"-o"]) { outpath = [args objectAtIndex: ++i]; } else if ([arg isEqual: @"-e"]) { outext = [args objectAtIndex: ++i]; } else { GSPrintf(stderr, @"unrecognized option: %@\n", arg); return EXIT_FAILURE; } } parse_file: inpath = [args objectAtIndex: i]; if (!outpath && !outext && action != ACTION_EXTRACT) { outpath = inpath; } else if (outext) { NSRange dot; dot = [inpath rangeOfString: @"." options: NSBackwardsSearch]; if (dot.length == 0) { dot.location = [inpath length]; } outpath = [NSString stringWithFormat: @"%@.%@", [inpath substringToIndex: dot.location], outext]; } // Open, read, do things. if ([inpath isEqual: @"-"]) { NSFileHandle *fh = [NSFileHandle fileHandleWithStandardInput]; fileData = [fh readDataToEndOfFile]; } else fileData = [NSData dataWithContentsOfFile: inpath]; result = [NSPropertyListSerialization propertyListWithData: fileData options: NSPropertyListMutableContainersAndLeaves format: &aFormat error: &anError]; if (result == nil) { GSPrintf(stderr, @"Loading '%@' - %@\n", inpath, anError); status = EXIT_FAILURE; break; } switch (action) { case ACTION_LINT: break; case ACTION_PRINT: // Not using description because we can GS it locale = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]; GSPropertyListMake(result, locale, NO, NO, 2, &outStr); GSPrintf(stdout, @"%@\n", outStr); break; case ACTION_CONVERT: status = plCmdConvert(result, cmdargs, outpath); break; case ACTION_REPLACE: status = plCmdReplace(result, aFormat, cmdargs, outpath); break; case ACTION_INSERT: status = plCmdInsert(result, aFormat, cmdargs, outpath); break; case ACTION_REMOVE: status = plCmdRemove(result, aFormat, cmdargs, outpath); break; case ACTION_EXTRACT: if (!outpath) outpath = @"-"; status = plCmdExtract(result, cmdargs, outpath); break; } } NS_HANDLER { NSLog(@"Problem: %@", localException); if ([[localException name] isEqual: NSInvalidArgumentException]) print_help(stderr); status = EXIT_FAILURE; break; } NS_ENDHANDLER LEAVE_POOL } while (0); return status; } gnustep-base-1.29.0/Tools/sfparse.1000066400000000000000000000022341435650067400170400ustar00rootroot00000000000000.\"Copyright (C) 2005 Free Software Foundation, Inc. .\"Copying and distribution of this file, with or without modification, .\"are permitted in any medium without royalty provided the copyright .\"notice and this notice are preserved. .TH SFPARSE "1" "February 2004" "GNUstep" "GNUstep System Manual" .SH NAME sfparse \- string file parse .SH SYNOPSIS .B sfparse [ \fI--utf8\fR | \fI--unicode\fR ] \fIfilename\fR .SH DESCRIPTION .P This tool has two different functions. When invoked with just a filename as argument, it checks that a file is a valid strings-file, which basically amounts to seeing whether the file is in proper serialized NSDictionary format (type "\fIdefaults plist\fR" for info on this). .P On the other hand, if one of the two options is given, no such checking is performed, but the file IS converted into the named encoding. .SH OPTIONS .P \fB\-\-unicode\fR - convert an ASCII or UTF8 file to Unicode .P \fB\-\-utf8\fR - convert an ASCII or Unicode to UTF8 .SH HISTORY .RS 0 Written in 1999. .P This manual page first appeared in gnustep-base 1.9.2 (March 2004). .P .SH AUTHORS .B sfparse was written by Richard Frith-Macdonald gnustep-base-1.29.0/Tools/sfparse.m000066400000000000000000000113621435650067400171360ustar00rootroot00000000000000/** This tool checks that a file is a valid strings-file Copyright (C) 1999 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: February 1999 This file is part of the GNUstep Project This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. You should have received a copy of the GNU General Public License along with this program; see the file COPYINGv3. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #import "common.h" #import "Foundation/NSArray.h" #import "Foundation/NSData.h" #import "Foundation/NSDictionary.h" #import "Foundation/NSException.h" #import "Foundation/NSProcessInfo.h" #import "Foundation/NSUserDefaults.h" #import "Foundation/NSAutoreleasePool.h" #import "GNUstepBase/Additions.h" int convert_unicode(NSArray *args) { unsigned int i; for (i = 2; i < [args count]; i++) { NSString *file = [args objectAtIndex: i]; NS_DURING { NSData *data; NSString *myString; NSString *output; data = [NSData dataWithContentsOfFile: file]; myString = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding]; IF_NO_ARC([myString autorelease];) if ([myString length] == 0) { myString = [[[NSString alloc] initWithData: data encoding: [NSString defaultCStringEncoding]] autorelease]; } output = [[file lastPathComponent] stringByAppendingPathExtension: @"unicode"]; data = [myString dataUsingEncoding: NSUnicodeStringEncoding]; [data writeToFile: output atomically: YES]; } NS_HANDLER { GSPrintf(stderr, @"Converting '%@' - %@\n", file, [localException reason]); return 1; } NS_ENDHANDLER } return 0; } int convert_utf8(NSArray *args) { unsigned int i; for (i = 2; i < [args count]; i++) { NSString *file = [args objectAtIndex: i]; NS_DURING { NSData *data; NSString *myString; NSString *output; myString = [NSString stringWithContentsOfFile: file]; output = [[file lastPathComponent] stringByAppendingPathExtension: @"utf8"]; data = [myString dataUsingEncoding: NSUTF8StringEncoding]; [data writeToFile: output atomically: YES]; } NS_HANDLER { GSPrintf(stderr, @"Converting '%@' - %@\n", file, [localException reason]); return 1; } NS_ENDHANDLER } return 0; } /**

    This tool checks that a file is a valid strings-file, and can also convert files to Unicode or UTF-8. If given the '--unicode' option it converts an ASCII or UTF-8 file to unicode. If given the '--utf8' option is converts an ASCII or unicode file to UTF-8.

    */ int main(int argc, char** argv, char **env) { NSAutoreleasePool *pool; NSProcessInfo *proc; NSArray *args; unsigned i; int retval = 0; #ifdef GS_PASS_ARGUMENTS GSInitializeProcess(argc, argv, env); #endif pool = [NSAutoreleasePool new]; proc = [NSProcessInfo processInfo]; if (proc == nil) { GSPrintf(stderr, @"defaults: unable to get process information!\n"); [pool release]; exit(EXIT_FAILURE); } args = [proc arguments]; if ([args count] <= 1 || [[args objectAtIndex: 1] isEqual: @"--help"] || [[args objectAtIndex: 1] isEqual: @"-h"]) { printf("Usage: sfparse [--utf8] filename.\n"); printf("--unicode - convert an ASCII or UTF8 file to Unicode\n"); printf("--utf8 - convert an ASCII or Unicode to UTF8\n"); } else if ([[args objectAtIndex: 1] isEqual: @"--unicode"]) { retval = convert_unicode(args); } else if ([[args objectAtIndex: 1] isEqual: @"--utf8"]) { retval = convert_utf8(args); } else { for (i = 1; i < [args count]; i++) { NSString *file = [args objectAtIndex: i]; NS_DURING { NSString *myString; id result; myString = [NSString stringWithContentsOfFile: file]; result = [myString propertyListFromStringsFileFormat]; if (result == nil) GSPrintf(stderr, @"Parsing '%@' - nil property list\n", file); else if ([result isKindOfClass: [NSDictionary class]] == YES) GSPrintf(stderr, @"Parsing '%@' - seems ok (%d entries)\n", file, [result count]); else GSPrintf(stderr, @"Parsing '%@' - unexpected class - %@\n", file, [[result class] description]); } NS_HANDLER { GSPrintf(stderr, @"Parsing '%@' - %@\n", file, [localException reason]); retval = 1; } NS_ENDHANDLER } } [pool release]; return retval; } gnustep-base-1.29.0/Tools/xmlparse.1000066400000000000000000000014621435650067400172320ustar00rootroot00000000000000.\"Copyright (C) 2005 Free Software Foundation, Inc. .\"Copying and distribution of this file, with or without modification, .\"are permitted in any medium without royalty provided the copyright .\"notice and this notice are preserved. .TH XMLPARSE "1" "February 2004" "GNUstep" "GNUstep System Manual" .SH NAME xmlparse \- error-check and validate XML documents .SH SYNOPSIS .B xmlparse \fIfilename\fR .SH DESCRIPTION .P Parses the given file, validating it against its DTD if found. Prints messages about any errors, otherwise returns silently. (Value 0 is always returned in any case.) The parse of the file is discarded. .SH HISTORY .RS 0 Written in 2003. .P This manual page first appeared in gnustep-base 1.9.2 (March 2004). .P .SH AUTHORS .B xmlparse was written by Richard Frith-Macdonald gnustep-base-1.29.0/Tools/xmlparse.m000066400000000000000000000060441435650067400173270ustar00rootroot00000000000000/** This tool parses and validates xml documents. xmlparse ... a tool to parse xml documents Copyright (C) 2003 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Created: May 2003 This file is part of the GNUstep Project This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. You should have received a copy of the GNU General Public License along with this program; see the file COPYINGv3. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #import "common.h" #import "Foundation/NSArray.h" #import "Foundation/NSAutoreleasePool.h" #import "Foundation/NSPathUtilities.h" #import "Foundation/NSProcessInfo.h" #import "Foundation/NSUserDefaults.h" #import "GNUstepBase/Additions.h" @interface GSXMLParse : GSXMLParser + (NSString*) loadEntity: (NSString*)publicId at: (NSString*)location; @end @implementation GSXMLParse : GSXMLParser + (NSString*) loadEntity: (NSString*)publicId at: (NSString*)location { char buf[BUFSIZ]; NSString *str; int len; GSPrintf(stdout, @"Enter filename to load entity '%@' at '%@': ", publicId, location); fgets(buf, sizeof(buf)-1, stdin); buf[sizeof(buf)-1] = '\0'; len = strlen(buf); // Strip trailing space while (len > 0 && buf[len-1] <= ' ') { buf[--len] = '\0'; } str = [NSString stringWithUTF8String: buf]; return str; } @end /**

    This tool error-checks and validates xml documents. The parse is simply discarded after checking.

    */ int main(int argc, char **argv, char **env) { NSProcessInfo *proc; NSArray *files; unsigned int count; unsigned int i; CREATE_AUTORELEASE_POOL(pool); #ifdef GS_PASS_ARGUMENTS GSInitializeProcess(argc, argv, env); #endif #ifndef HAVE_LIBXML NSLog(@"ERROR: The GNUstep Base Library was built\n" @" without an available libxml library. xmlparse needs the libxml\n" @" library to function. Aborting"); exit(EXIT_FAILURE); #endif proc = [NSProcessInfo processInfo]; if (proc == nil) { NSLog(@"unable to get process information!"); exit(EXIT_FAILURE); } files = [proc arguments]; count = [files count]; for (i = 1; i < count; i++) { NSString *file = [files objectAtIndex: i]; GSXMLNode *root; GSXMLParser *parser; parser = [GSXMLParse parserWithContentsOfFile: file]; [parser substituteEntities: NO]; [parser doValidityChecking: YES]; [parser keepBlanks: NO]; [parser saveMessages: YES]; if ([parser parse] == NO) { NSLog(@"WARNING %@ is not a valid document", file); NSLog(@"Errors: %@", [parser messages]); } root = [[parser document] root]; NSLog(@"Document is %@", [root name]); } RELEASE(pool); return 0; } gnustep-base-1.29.0/Version000066400000000000000000000012141435650067400155600ustar00rootroot00000000000000# This file is included in various Makefile's to get version information. # Compatible with Bourne shell syntax, so it can included there too. # The gcc version required to compile the library. GCC_VERSION=4.0.0 # The version number of this release. MAJOR_VERSION=1 MINOR_VERSION=29 SUBMINOR_VERSION=0 # numeric value should match above VERSION_NUMBER=129.0 GNUSTEP_BASE_VERSION=${MAJOR_VERSION}.${MINOR_VERSION}.${SUBMINOR_VERSION} VERSION=${GNUSTEP_BASE_VERSION} GNUSTEP_BASE_FTP_MACHINE=ftp.gnustep.org GNUSTEP_BASE_FTP_DIRECTORY=pub/gnustep/core GNUSTEP_BASE_SNAP_FTP_MACHINE=ftp.gnustep.org GNUSTEP_BASE_SNAP_FTP_DIRECTORY=pub/daily-snapshots gnustep-base-1.29.0/base.make.in000066400000000000000000000057541435650067400164030ustar00rootroot00000000000000# # base.make # # Makefile flags and configs to build with the base library. # # Copyright (C) 2001 Free Software Foundation, Inc. # # Author: Nicola Pero # Based on code originally in the gnustep make package # # This file is part of the GNUstep Base Library. # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # You should have received a copy of the GNU General Public # License along with this library; see the file COPYING.LIB. # If not, write to the Free Software Foundation, # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ifeq ($(BASE_MAKE_LOADED),) BASE_MAKE_LOADED=yes ifeq ($(FOUNDATION_LIB),gnu) # # FIXME - macro names # AUXILIARY_OBJCFLAGS += @NX_CONST_STRING_OBJCFLAGS@ ifeq ($(shared),no) CONFIG_SYSTEM_LIBS += @LIBS@ CONFIG_SYSTEM_LIB_DIR += @LDIR_FLAGS@ CONFIG_SYSTEM_INCL += @CPPFLAGS@ endif GNUSTEP_BASE_VERSION = @VERSION@ GNUSTEP_BASE_MAJOR_VERSION = @MAJOR_VERSION@ GNUSTEP_BASE_MINOR_VERSION = @MINOR_VERSION@ GNUSTEP_BASE_SUBMINOR_VERSION = @SUBMINOR_VERSION@ FND_LDFLAGS = FND_LIBS = -lgnustep-base FND_DEFINE = -DGNUSTEP_BASE_LIBRARY=1 GNUSTEP_DEFINE = -DGNUSTEP else # # Not using the GNUstep foundation ... must be Apple's # So we need to use the base additions library. # FND_LIBS = -lgnustep-baseadd -framework Foundation endif # Is the ObjC2 runtime real or emulated? # If it's not real, we need to use the emulation ObjectiveC2 headers. OBJC2RUNTIME=@OBJC2RUNTIME@ ifeq ($(OBJC2RUNTIME),0) AUXILIARY_OBJCFLAGS += -I$(GNUSTEP_HEADERS)/ObjectiveC2 AUXILIARY_CFLAGS += -I$(GNUSTEP_HEADERS)/ObjectiveC2 endif # Now we have definitions to show whether important dependencies have # been met ... if thse are 0 then some core functionality is missing. # Has GNUTLS been found (for TLS/SSL support throughout)? GNUSTEP_BASE_HAVE_GNUTLS=@HAVE_GNUTLS@ # Has libxml2 been found (for NSXMLNode and related classes)? GNUSTEP_BASE_HAVE_LIBXML=@HAVE_LIBXML@ # Has ICU been found (for NSCalendar, NSLocale, and other locale related)? GNUSTEP_BASE_HAVE_ICU=@HAVE_ICU@ # The next two are a special case ... we should have either one defined # for netservices. FIXME ... shouldn't these be combined? # Has MDNS been found (one of two options for NSNetServices)? GNUSTEP_BASE_HAVE_MDNS=@HAVE_MDNS@ # Has Avahi been found (one of two options for NSNetServices)? GNUSTEP_BASE_HAVE_AVAHI=@HAVE_AVAHI@ # If we determined that the Objective-C runtime does not support # native Objective-C exceptions, turn them off. This overrides # the USE_OBJC_EXCEPTIONS setting in gnustep-make's config.make. ifeq (@BASE_NATIVE_OBJC_EXCEPTIONS@, 0) USE_OBJC_EXCEPTIONS = no endif endif # BASE_MAKE_LOADED gnustep-base-1.29.0/base.xcodeproj/000077500000000000000000000000001435650067400171205ustar00rootroot00000000000000gnustep-base-1.29.0/base.xcodeproj/project.pbxproj000066400000000000000000012556561435650067400222200ustar00rootroot00000000000000// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 46; objects = { /* Begin PBXBuildFile section */ 180878891618537A006EBD74 /* objc-load.m in Sources */ = {isa = PBXBuildFile; fileRef = 1890700B1610BF3C0003C892 /* objc-load.m */; }; 1837DA141652D18400197E53 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 18394B1C1610D8E300335E85 /* Foundation.framework */; }; 18394B341610D95600335E85 /* Foundation-Prefix.pch in Headers */ = {isa = PBXBuildFile; fileRef = 18394B321610D95600335E85 /* Foundation-Prefix.pch */; settings = {ATTRIBUTES = (Private, ); }; }; 18394B351610D9D000335E85 /* Foundation.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E681610BF3C0003C892 /* Foundation.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B361610D9D000335E85 /* FoundationErrors.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E691610BF3C0003C892 /* FoundationErrors.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B371610D9D000335E85 /* NSAffineTransform.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E6A1610BF3C0003C892 /* NSAffineTransform.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B381610D9D000335E85 /* NSArchiver.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E6B1610BF3C0003C892 /* NSArchiver.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B391610D9D000335E85 /* NSArray.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E6C1610BF3C0003C892 /* NSArray.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B3A1610D9D000335E85 /* NSAttributedString.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E6D1610BF3C0003C892 /* NSAttributedString.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B3B1610D9D000335E85 /* NSAutoreleasePool.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E6E1610BF3C0003C892 /* NSAutoreleasePool.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B3C1610D9D000335E85 /* NSBundle.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E6F1610BF3C0003C892 /* NSBundle.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B3D1610D9D000335E85 /* NSByteOrder.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E701610BF3C0003C892 /* NSByteOrder.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B3E1610D9D000335E85 /* NSCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E711610BF3C0003C892 /* NSCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B3F1610D9D000335E85 /* NSCalendar.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E721610BF3C0003C892 /* NSCalendar.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B401610D9D000335E85 /* NSCalendarDate.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E731610BF3C0003C892 /* NSCalendarDate.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B411610D9D000335E85 /* NSCharacterSet.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E741610BF3C0003C892 /* NSCharacterSet.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B421610D9D000335E85 /* NSClassDescription.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E751610BF3C0003C892 /* NSClassDescription.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B431610D9D000335E85 /* NSCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E761610BF3C0003C892 /* NSCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B441610D9D000335E85 /* NSComparisonPredicate.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E771610BF3C0003C892 /* NSComparisonPredicate.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B451610D9D000335E85 /* NSCompoundPredicate.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E781610BF3C0003C892 /* NSCompoundPredicate.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B461610D9D000335E85 /* NSConnection.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E791610BF3C0003C892 /* NSConnection.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B471610D9D000335E85 /* NSData.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E7A1610BF3C0003C892 /* NSData.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B481610D9D000335E85 /* NSDate.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E7B1610BF3C0003C892 /* NSDate.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B491610D9D000335E85 /* NSDateFormatter.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E7C1610BF3C0003C892 /* NSDateFormatter.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B4A1610D9D000335E85 /* NSDebug.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E7D1610BF3C0003C892 /* NSDebug.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B4B1610D9D000335E85 /* NSDecimal.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E7E1610BF3C0003C892 /* NSDecimal.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B4C1610D9D000335E85 /* NSDecimalNumber.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E7F1610BF3C0003C892 /* NSDecimalNumber.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B4D1610D9D000335E85 /* NSDictionary.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E801610BF3C0003C892 /* NSDictionary.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B4E1610D9D000335E85 /* NSDistantObject.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E811610BF3C0003C892 /* NSDistantObject.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B4F1610D9D000335E85 /* NSDistributedLock.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E821610BF3C0003C892 /* NSDistributedLock.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B501610D9D000335E85 /* NSDistributedNotificationCenter.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E831610BF3C0003C892 /* NSDistributedNotificationCenter.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B511610D9D000335E85 /* NSEnumerator.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E841610BF3C0003C892 /* NSEnumerator.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B521610D9D000335E85 /* NSError.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E851610BF3C0003C892 /* NSError.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B531610D9D000335E85 /* NSErrorRecoveryAttempting.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E861610BF3C0003C892 /* NSErrorRecoveryAttempting.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B541610D9D000335E85 /* NSException.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E871610BF3C0003C892 /* NSException.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B551610D9D000335E85 /* NSExpression.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E881610BF3C0003C892 /* NSExpression.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B561610D9D000335E85 /* NSFileHandle.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E891610BF3C0003C892 /* NSFileHandle.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B571610D9D000335E85 /* NSFileManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E8A1610BF3C0003C892 /* NSFileManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B581610D9D000335E85 /* NSFormatter.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E8B1610BF3C0003C892 /* NSFormatter.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B591610D9D000335E85 /* NSGarbageCollector.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E8C1610BF3C0003C892 /* NSGarbageCollector.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B5A1610D9D000335E85 /* NSGeometry.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E8D1610BF3C0003C892 /* NSGeometry.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B5B1610D9D000335E85 /* NSHTTPCookie.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E8E1610BF3C0003C892 /* NSHTTPCookie.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B5C1610D9D000335E85 /* NSHTTPCookieStorage.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E8F1610BF3C0003C892 /* NSHTTPCookieStorage.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B5D1610D9D000335E85 /* NSHashTable.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E901610BF3C0003C892 /* NSHashTable.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B5E1610D9D000335E85 /* NSHost.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E911610BF3C0003C892 /* NSHost.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B5F1610D9D000335E85 /* NSIndexPath.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E921610BF3C0003C892 /* NSIndexPath.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B601610D9D000335E85 /* NSIndexSet.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E931610BF3C0003C892 /* NSIndexSet.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B611610D9D000335E85 /* NSInvocation.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E941610BF3C0003C892 /* NSInvocation.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B621610D9D000335E85 /* NSJSONSerialization.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E951610BF3C0003C892 /* NSJSONSerialization.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B631610D9D000335E85 /* NSKeyValueCoding.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E961610BF3C0003C892 /* NSKeyValueCoding.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B641610D9D000335E85 /* NSKeyValueObserving.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E971610BF3C0003C892 /* NSKeyValueObserving.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B651610D9D000335E85 /* NSKeyedArchiver.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E981610BF3C0003C892 /* NSKeyedArchiver.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B661610D9D000335E85 /* NSLocale.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E991610BF3C0003C892 /* NSLocale.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B671610D9D000335E85 /* NSLock.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E9A1610BF3C0003C892 /* NSLock.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B681610D9D000335E85 /* NSMapTable.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E9B1610BF3C0003C892 /* NSMapTable.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B691610D9D000335E85 /* NSMethodSignature.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E9C1610BF3C0003C892 /* NSMethodSignature.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B6A1610D9D000335E85 /* NSNetServices.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E9D1610BF3C0003C892 /* NSNetServices.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B6B1610D9D000335E85 /* NSNotification.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E9E1610BF3C0003C892 /* NSNotification.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B6C1610D9D000335E85 /* NSNotificationQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906E9F1610BF3C0003C892 /* NSNotificationQueue.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B6D1610D9D000335E85 /* NSNull.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EA01610BF3C0003C892 /* NSNull.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B6E1610D9D000335E85 /* NSNumberFormatter.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EA11610BF3C0003C892 /* NSNumberFormatter.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B6F1610D9D000335E85 /* NSObjCRuntime.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EA21610BF3C0003C892 /* NSObjCRuntime.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B701610D9D000335E85 /* NSObject.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EA31610BF3C0003C892 /* NSObject.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B711610D9D000335E85 /* NSOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EA41610BF3C0003C892 /* NSOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B721610D9D000335E85 /* NSPathUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EA51610BF3C0003C892 /* NSPathUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B731610D9D000335E85 /* NSPointerArray.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EA61610BF3C0003C892 /* NSPointerArray.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B741610D9D000335E85 /* NSPointerFunctions.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EA71610BF3C0003C892 /* NSPointerFunctions.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B751610D9D000335E85 /* NSPort.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EA81610BF3C0003C892 /* NSPort.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B761610D9D000335E85 /* NSPortCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EA91610BF3C0003C892 /* NSPortCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B771610D9D000335E85 /* NSPortMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EAA1610BF3C0003C892 /* NSPortMessage.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B781610D9D000335E85 /* NSPortNameServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EAB1610BF3C0003C892 /* NSPortNameServer.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B791610D9D000335E85 /* NSPredicate.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EAC1610BF3C0003C892 /* NSPredicate.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B7A1610D9D000335E85 /* NSProcessInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EAD1610BF3C0003C892 /* NSProcessInfo.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B7B1610D9D000335E85 /* NSPropertyList.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EAE1610BF3C0003C892 /* NSPropertyList.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B7C1610D9D000335E85 /* NSProtocolChecker.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EAF1610BF3C0003C892 /* NSProtocolChecker.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B7D1610D9D000335E85 /* NSProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EB01610BF3C0003C892 /* NSProxy.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B7E1610D9D000335E85 /* NSRange.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EB11610BF3C0003C892 /* NSRange.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B7F1610D9D000335E85 /* NSRegularExpression.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EB21610BF3C0003C892 /* NSRegularExpression.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B801610D9D000335E85 /* NSRunLoop.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EB31610BF3C0003C892 /* NSRunLoop.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B811610D9D000335E85 /* NSScanner.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EB41610BF3C0003C892 /* NSScanner.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B821610D9D000335E85 /* NSScriptWhoseTests.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EB51610BF3C0003C892 /* NSScriptWhoseTests.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B831610D9D000335E85 /* NSSerialization.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EB61610BF3C0003C892 /* NSSerialization.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B841610D9D000335E85 /* NSSet.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EB71610BF3C0003C892 /* NSSet.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B851610D9D000335E85 /* NSSortDescriptor.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EB81610BF3C0003C892 /* NSSortDescriptor.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B861610D9D000335E85 /* NSSpellServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EB91610BF3C0003C892 /* NSSpellServer.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B871610D9D000335E85 /* NSStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EBA1610BF3C0003C892 /* NSStream.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B881610D9D000335E85 /* NSString.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EBB1610BF3C0003C892 /* NSString.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B891610D9D000335E85 /* NSTask.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EBC1610BF3C0003C892 /* NSTask.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B8A1610D9D000335E85 /* NSTextCheckingResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EBD1610BF3C0003C892 /* NSTextCheckingResult.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B8B1610D9D000335E85 /* NSThread.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EBE1610BF3C0003C892 /* NSThread.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B8C1610D9D000335E85 /* NSTimeZone.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EBF1610BF3C0003C892 /* NSTimeZone.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B8D1610D9D000335E85 /* NSTimer.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EC01610BF3C0003C892 /* NSTimer.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B8E1610D9D000335E85 /* NSURL.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EC11610BF3C0003C892 /* NSURL.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B8F1610D9D000335E85 /* NSURLAuthenticationChallenge.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EC21610BF3C0003C892 /* NSURLAuthenticationChallenge.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B901610D9D000335E85 /* NSURLCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EC31610BF3C0003C892 /* NSURLCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B911610D9D000335E85 /* NSURLConnection.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EC41610BF3C0003C892 /* NSURLConnection.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B921610D9D000335E85 /* NSURLCredential.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EC51610BF3C0003C892 /* NSURLCredential.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B931610D9D000335E85 /* NSURLCredentialStorage.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EC61610BF3C0003C892 /* NSURLCredentialStorage.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B941610D9D000335E85 /* NSURLDownload.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EC71610BF3C0003C892 /* NSURLDownload.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B951610D9D000335E85 /* NSURLError.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EC81610BF3C0003C892 /* NSURLError.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B961610D9D000335E85 /* NSURLHandle.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EC91610BF3C0003C892 /* NSURLHandle.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B971610D9D000335E85 /* NSURLProtectionSpace.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906ECA1610BF3C0003C892 /* NSURLProtectionSpace.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B981610D9D000335E85 /* NSURLProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906ECB1610BF3C0003C892 /* NSURLProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B991610D9D000335E85 /* NSURLRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906ECC1610BF3C0003C892 /* NSURLRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B9A1610D9D000335E85 /* NSURLResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906ECD1610BF3C0003C892 /* NSURLResponse.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B9B1610D9D000335E85 /* NSUndoManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906ECE1610BF3C0003C892 /* NSUndoManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B9C1610D9D000335E85 /* NSUserDefaults.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906ECF1610BF3C0003C892 /* NSUserDefaults.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B9D1610D9D000335E85 /* NSUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906ED01610BF3C0003C892 /* NSUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B9E1610D9D000335E85 /* NSValue.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906ED11610BF3C0003C892 /* NSValue.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394B9F1610D9D000335E85 /* NSValueTransformer.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906ED21610BF3C0003C892 /* NSValueTransformer.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394BA01610D9D000335E85 /* NSXMLDTD.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906ED31610BF3C0003C892 /* NSXMLDTD.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394BA11610D9D000335E85 /* NSXMLDTDNode.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906ED41610BF3C0003C892 /* NSXMLDTDNode.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394BA21610D9D000335E85 /* NSXMLDocument.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906ED51610BF3C0003C892 /* NSXMLDocument.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394BA31610D9D000335E85 /* NSXMLElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906ED61610BF3C0003C892 /* NSXMLElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394BA41610D9D000335E85 /* NSXMLNode.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906ED71610BF3C0003C892 /* NSXMLNode.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394BA51610D9D000335E85 /* NSXMLNodeOptions.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906ED81610BF3C0003C892 /* NSXMLNodeOptions.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394BA61610D9D000335E85 /* NSXMLParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906ED91610BF3C0003C892 /* NSXMLParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394BA71610D9D000335E85 /* NSZone.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EDA1610BF3C0003C892 /* NSZone.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394BA81610D9ED00335E85 /* NSArray+GNUstepBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EEE1610BF3C0003C892 /* NSArray+GNUstepBase.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394BA91610D9ED00335E85 /* NSAttributedString+GNUstepBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EEF1610BF3C0003C892 /* NSAttributedString+GNUstepBase.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394BAA1610D9ED00335E85 /* NSBundle+GNUstepBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EF01610BF3C0003C892 /* NSBundle+GNUstepBase.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394BAB1610D9ED00335E85 /* NSCalendarDate+GNUstepBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EF11610BF3C0003C892 /* NSCalendarDate+GNUstepBase.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394BAC1610D9ED00335E85 /* NSData+GNUstepBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EF21610BF3C0003C892 /* NSData+GNUstepBase.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394BAD1610D9ED00335E85 /* NSDebug+GNUstepBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EF31610BF3C0003C892 /* NSDebug+GNUstepBase.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394BAE1610D9ED00335E85 /* NSFileHandle+GNUstepBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EF41610BF3C0003C892 /* NSFileHandle+GNUstepBase.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394BAF1610D9ED00335E85 /* NSLock+GNUstepBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EF51610BF3C0003C892 /* NSLock+GNUstepBase.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394BB01610D9ED00335E85 /* NSMutableString+GNUstepBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EF61610BF3C0003C892 /* NSMutableString+GNUstepBase.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394BB11610D9ED00335E85 /* NSNetServices+GNUstepBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EF71610BF3C0003C892 /* NSNetServices+GNUstepBase.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394BB21610D9ED00335E85 /* NSNumber+GNUstepBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EF81610BF3C0003C892 /* NSNumber+GNUstepBase.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394BB31610D9ED00335E85 /* NSObject+GNUstepBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EF91610BF3C0003C892 /* NSObject+GNUstepBase.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394BB41610D9ED00335E85 /* NSProcessInfo+GNUstepBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EFA1610BF3C0003C892 /* NSProcessInfo+GNUstepBase.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394BB51610D9ED00335E85 /* NSStream+GNUstepBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EFB1610BF3C0003C892 /* NSStream+GNUstepBase.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394BB61610D9ED00335E85 /* NSString+GNUstepBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EFC1610BF3C0003C892 /* NSString+GNUstepBase.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394BB71610D9ED00335E85 /* NSTask+GNUstepBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EFD1610BF3C0003C892 /* NSTask+GNUstepBase.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394BB81610D9ED00335E85 /* NSThread+GNUstepBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EFE1610BF3C0003C892 /* NSThread+GNUstepBase.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394BB91610D9ED00335E85 /* NSURL+GNUstepBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906EFF1610BF3C0003C892 /* NSURL+GNUstepBase.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18394C011610EB7F00335E85 /* NSAffineTransform.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F701610BF3C0003C892 /* NSAffineTransform.m */; }; 18394C031610EB7F00335E85 /* NSArray.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F721610BF3C0003C892 /* NSArray.m */; }; 18394C041610EB7F00335E85 /* NSAssertionHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F731610BF3C0003C892 /* NSAssertionHandler.m */; }; 18394C051610EB7F00335E85 /* NSAttributedString.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F741610BF3C0003C892 /* NSAttributedString.m */; }; 18394C061610EB7F00335E85 /* NSAutoreleasePool.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F751610BF3C0003C892 /* NSAutoreleasePool.m */; }; 18394C071610EB7F00335E85 /* NSBundle.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F761610BF3C0003C892 /* NSBundle.m */; }; 18394C081610EB7F00335E85 /* NSCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F771610BF3C0003C892 /* NSCache.m */; }; 18394C091610EB7F00335E85 /* NSCachedURLResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F781610BF3C0003C892 /* NSCachedURLResponse.m */; }; 18394C0A1610EB7F00335E85 /* NSCalendar.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F791610BF3C0003C892 /* NSCalendar.m */; }; 18394C0B1610EB7F00335E85 /* NSCalendarDate.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F7A1610BF3C0003C892 /* NSCalendarDate.m */; }; 18394C0C1610EB7F00335E85 /* NSCallBacks.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F7C1610BF3C0003C892 /* NSCallBacks.m */; }; 18394C0D1610EB7F00335E85 /* NSCharacterSet.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F7D1610BF3C0003C892 /* NSCharacterSet.m */; }; 18394C0E1610EB7F00335E85 /* NSClassDescription.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F7F1610BF3C0003C892 /* NSClassDescription.m */; }; 18394C0F1610EB7F00335E85 /* NSCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F801610BF3C0003C892 /* NSCoder.m */; }; 18394C101610EB7F00335E85 /* NSConcreteHashTable.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F811610BF3C0003C892 /* NSConcreteHashTable.m */; }; 18394C111610EB7F00335E85 /* NSConcreteMapTable.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F821610BF3C0003C892 /* NSConcreteMapTable.m */; }; 18394C121610EB7F00335E85 /* NSConcretePointerFunctions.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F841610BF3C0003C892 /* NSConcretePointerFunctions.m */; }; 18394C131610EB7F00335E85 /* NSConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F851610BF3C0003C892 /* NSConnection.m */; }; 18394C141610EB7F00335E85 /* NSCopyObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F861610BF3C0003C892 /* NSCopyObject.m */; }; 18394C151610EB7F00335E85 /* NSCountedSet.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F871610BF3C0003C892 /* NSCountedSet.m */; }; 18394C171610EB7F00335E85 /* NSDate.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F891610BF3C0003C892 /* NSDate.m */; }; 18394C181610EB7F00335E85 /* NSDateFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F8A1610BF3C0003C892 /* NSDateFormatter.m */; }; 18394C191610EB7F00335E85 /* NSDebug.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F8B1610BF3C0003C892 /* NSDebug.m */; }; 18394C1A1610EB7F00335E85 /* NSDecimal.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F8C1610BF3C0003C892 /* NSDecimal.m */; }; 18394C1B1610EB7F00335E85 /* NSDecimalNumber.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F8D1610BF3C0003C892 /* NSDecimalNumber.m */; }; 18394C1C1610EB7F00335E85 /* NSDictionary.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F8E1610BF3C0003C892 /* NSDictionary.m */; }; 18394C1D1610EB7F00335E85 /* NSDistantObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F8F1610BF3C0003C892 /* NSDistantObject.m */; }; 18394C1E1610EB7F00335E85 /* NSDistributedLock.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F901610BF3C0003C892 /* NSDistributedLock.m */; }; 18394C1F1610EB7F00335E85 /* NSDistributedNotificationCenter.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F911610BF3C0003C892 /* NSDistributedNotificationCenter.m */; }; 18394C201610EB7F00335E85 /* NSEnumerator.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F921610BF3C0003C892 /* NSEnumerator.m */; }; 18394C211610EB7F00335E85 /* NSError.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F931610BF3C0003C892 /* NSError.m */; }; 18394C221610EB7F00335E85 /* NSException.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F941610BF3C0003C892 /* NSException.m */; }; 18394C231610EB7F00335E85 /* NSFileHandle.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F951610BF3C0003C892 /* NSFileHandle.m */; }; 18394C241610EB7F00335E85 /* NSFileManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F961610BF3C0003C892 /* NSFileManager.m */; }; 18394C251610EB7F00335E85 /* NSFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F971610BF3C0003C892 /* NSFormatter.m */; }; 18394C261610EB7F00335E85 /* NSGarbageCollector.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F981610BF3C0003C892 /* NSGarbageCollector.m */; }; 18394C271610EB7F00335E85 /* NSGeometry.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F991610BF3C0003C892 /* NSGeometry.m */; }; 18394C281610EB7F00335E85 /* NSHTTPCookie.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F9A1610BF3C0003C892 /* NSHTTPCookie.m */; }; 18394C291610EB7F00335E85 /* NSHTTPCookieStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F9B1610BF3C0003C892 /* NSHTTPCookieStorage.m */; }; 18394C2A1610EB7F00335E85 /* NSHashTable.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F9C1610BF3C0003C892 /* NSHashTable.m */; }; 18394C2B1610EB7F00335E85 /* NSHost.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F9D1610BF3C0003C892 /* NSHost.m */; }; 18394C2C1610EB7F00335E85 /* NSIndexPath.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F9E1610BF3C0003C892 /* NSIndexPath.m */; }; 18394C2D1610EB7F00335E85 /* NSIndexSet.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F9F1610BF3C0003C892 /* NSIndexSet.m */; }; 18394C2F1610EB7F00335E85 /* NSJSONSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FA11610BF3C0003C892 /* NSJSONSerialization.m */; }; 18394C301610EB7F00335E85 /* NSKeyValueCoding.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FA21610BF3C0003C892 /* NSKeyValueCoding.m */; }; 18394C341610EB7F00335E85 /* NSKeyedArchiver.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FA61610BF3C0003C892 /* NSKeyedArchiver.m */; }; 18394C361610EB7F00335E85 /* NSLocale.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FA81610BF3C0003C892 /* NSLocale.m */; }; 18394C371610EB7F00335E85 /* NSLock.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FA91610BF3C0003C892 /* NSLock.m */; }; 18394C381610EB7F00335E85 /* NSLog.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FAA1610BF3C0003C892 /* NSLog.m */; }; 18394C391610EB7F00335E85 /* NSMapTable.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FAB1610BF3C0003C892 /* NSMapTable.m */; }; 18394C3A1610EB7F00335E85 /* NSMessagePort.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FAC1610BF3C0003C892 /* NSMessagePort.m */; }; 18394C3B1610EB7F00335E85 /* NSMessagePortNameServer.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FAD1610BF3C0003C892 /* NSMessagePortNameServer.m */; }; 18394C3C1610EB7F00335E85 /* NSMethodSignature.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FAE1610BF3C0003C892 /* NSMethodSignature.m */; }; 18394C3D1610EB7F00335E85 /* NSNetServices.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FAF1610BF3C0003C892 /* NSNetServices.m */; }; 18394C3E1610EB7F00335E85 /* NSNotification.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FB01610BF3C0003C892 /* NSNotification.m */; }; 18394C401610EB7F00335E85 /* NSNotificationQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FB21610BF3C0003C892 /* NSNotificationQueue.m */; }; 18394C411610EB7F00335E85 /* NSNull.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FB31610BF3C0003C892 /* NSNull.m */; }; 18394C421610EB7F00335E85 /* NSNumber.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FB41610BF3C0003C892 /* NSNumber.m */; }; 18394C431610EB7F00335E85 /* NSNumberFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FB51610BF3C0003C892 /* NSNumberFormatter.m */; }; 18394C451610EB7F00335E85 /* NSObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FB91610BF3C0003C892 /* NSObject.m */; }; 18394C461610EB7F00335E85 /* NSOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FBA1610BF3C0003C892 /* NSOperation.m */; }; 18394C471610EB7F00335E85 /* NSPage.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FBB1610BF3C0003C892 /* NSPage.m */; }; 18394C481610EB7F00335E85 /* NSPathUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FBC1610BF3C0003C892 /* NSPathUtilities.m */; }; 18394C491610EB7F00335E85 /* NSPipe.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FBD1610BF3C0003C892 /* NSPipe.m */; }; 18394C4A1610EB7F00335E85 /* NSPointerArray.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FBE1610BF3C0003C892 /* NSPointerArray.m */; }; 18394C4B1610EB7F00335E85 /* NSPointerFunctions.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FBF1610BF3C0003C892 /* NSPointerFunctions.m */; }; 18394C4C1610EB7F00335E85 /* NSPort.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FC01610BF3C0003C892 /* NSPort.m */; }; 18394C4E1610EB7F00335E85 /* NSPortMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FC21610BF3C0003C892 /* NSPortMessage.m */; }; 18394C4F1610EB7F00335E85 /* NSPortNameServer.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FC31610BF3C0003C892 /* NSPortNameServer.m */; }; 18394C501610EB7F00335E85 /* NSPredicate.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FC41610BF3C0003C892 /* NSPredicate.m */; }; 18394C511610EB7F00335E85 /* NSProcessInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FC51610BF3C0003C892 /* NSProcessInfo.m */; }; 18394C521610EB7F00335E85 /* NSPropertyList.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FC61610BF3C0003C892 /* NSPropertyList.m */; }; 18394C531610EB7F00335E85 /* NSProtocolChecker.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FC71610BF3C0003C892 /* NSProtocolChecker.m */; }; 18394C541610EB7F00335E85 /* NSProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FC81610BF3C0003C892 /* NSProxy.m */; }; 18394C551610EB7F00335E85 /* NSRange.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FC91610BF3C0003C892 /* NSRange.m */; }; 18394C561610EB7F00335E85 /* NSRegularExpression.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FCA1610BF3C0003C892 /* NSRegularExpression.m */; }; 18394C571610EB7F00335E85 /* NSRunLoop.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FCB1610BF3C0003C892 /* NSRunLoop.m */; }; 18394C581610EB7F00335E85 /* NSScanner.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FCC1610BF3C0003C892 /* NSScanner.m */; }; 18394C591610EB7F00335E85 /* NSSerializer.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FCD1610BF3C0003C892 /* NSSerializer.m */; }; 18394C5A1610EB7F00335E85 /* NSSet.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FCE1610BF3C0003C892 /* NSSet.m */; }; 18394C5B1610EB7F00335E85 /* NSSocketPort.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FCF1610BF3C0003C892 /* NSSocketPort.m */; }; 18394C5C1610EB7F00335E85 /* NSSocketPortNameServer.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FD01610BF3C0003C892 /* NSSocketPortNameServer.m */; }; 18394C5D1610EB7F00335E85 /* NSSortDescriptor.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FD11610BF3C0003C892 /* NSSortDescriptor.m */; }; 18394C5E1610EB7F00335E85 /* NSSpellServer.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FD21610BF3C0003C892 /* NSSpellServer.m */; }; 18394C5F1610EB7F00335E85 /* NSString.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FD31610BF3C0003C892 /* NSString.m */; }; 18394C601610EB7F00335E85 /* NSTask.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FD41610BF3C0003C892 /* NSTask.m */; }; 18394C611610EB7F00335E85 /* NSTextCheckingResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FD51610BF3C0003C892 /* NSTextCheckingResult.m */; }; 18394C621610EB7F00335E85 /* NSThread.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FD61610BF3C0003C892 /* NSThread.m */; }; 18394C631610EB7F00335E85 /* NSTimeZone.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FD71610BF3C0003C892 /* NSTimeZone.m */; }; 18394C641610EB7F00335E85 /* NSTimer.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FD81610BF3C0003C892 /* NSTimer.m */; }; 18394C651610EB7F00335E85 /* NSURL.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FD91610BF3C0003C892 /* NSURL.m */; }; 18394C661610EB7F00335E85 /* NSURLAuthenticationChallenge.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FDA1610BF3C0003C892 /* NSURLAuthenticationChallenge.m */; }; 18394C671610EB7F00335E85 /* NSURLCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FDB1610BF3C0003C892 /* NSURLCache.m */; }; 18394C681610EB7F00335E85 /* NSURLConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FDC1610BF3C0003C892 /* NSURLConnection.m */; }; 18394C691610EB7F00335E85 /* NSURLCredential.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FDD1610BF3C0003C892 /* NSURLCredential.m */; }; 18394C6A1610EB8000335E85 /* NSURLCredentialStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FDE1610BF3C0003C892 /* NSURLCredentialStorage.m */; }; 18394C6B1610EB8000335E85 /* NSURLDownload.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FDF1610BF3C0003C892 /* NSURLDownload.m */; }; 18394C6C1610EB8000335E85 /* NSURLHandle.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FE01610BF3C0003C892 /* NSURLHandle.m */; }; 18394C6D1610EB8000335E85 /* NSURLProtectionSpace.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FE11610BF3C0003C892 /* NSURLProtectionSpace.m */; }; 18394C6E1610EB8000335E85 /* NSURLProtocol.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FE21610BF3C0003C892 /* NSURLProtocol.m */; }; 18394C6F1610EB8000335E85 /* NSURLRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FE31610BF3C0003C892 /* NSURLRequest.m */; }; 18394C701610EB8000335E85 /* NSURLResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FE41610BF3C0003C892 /* NSURLResponse.m */; }; 18394C721610EB8000335E85 /* NSUndoManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FE61610BF3C0003C892 /* NSUndoManager.m */; }; 18394C731610EB8000335E85 /* NSUserDefaults.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FE71610BF3C0003C892 /* NSUserDefaults.m */; }; 18394C741610EB8000335E85 /* NSValue.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FE81610BF3C0003C892 /* NSValue.m */; }; 18394C751610EB8000335E85 /* NSValueTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FE91610BF3C0003C892 /* NSValueTransformer.m */; }; 18394C761610EB8000335E85 /* NSXMLDTD.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FEA1610BF3C0003C892 /* NSXMLDTD.m */; }; 18394C771610EB8000335E85 /* NSXMLDTDNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FEB1610BF3C0003C892 /* NSXMLDTDNode.m */; }; 18394C781610EB8000335E85 /* NSXMLDocument.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FEC1610BF3C0003C892 /* NSXMLDocument.m */; }; 18394C791610EB8000335E85 /* NSXMLElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FED1610BF3C0003C892 /* NSXMLElement.m */; }; 18394C7A1610EB8000335E85 /* NSXMLNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FEE1610BF3C0003C892 /* NSXMLNode.m */; }; 18394C7B1610EB8000335E85 /* NSXMLParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FEF1610BF3C0003C892 /* NSXMLParser.m */; }; 18394C7C1610EB8000335E85 /* NSZone.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FF11610BF3C0003C892 /* NSZone.m */; }; 18394C7D1610EC5E00335E85 /* NSCallBacks.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906F7B1610BF3C0003C892 /* NSCallBacks.h */; settings = {ATTRIBUTES = (Private, ); }; }; 18394C7E1610EC5E00335E85 /* NSCharacterSetData.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906F7E1610BF3C0003C892 /* NSCharacterSetData.h */; settings = {ATTRIBUTES = (Private, ); }; }; 18394C7F1610EC5E00335E85 /* NSConcretePointerFunctions.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906F831610BF3C0003C892 /* NSConcretePointerFunctions.h */; settings = {ATTRIBUTES = (Private, ); }; }; 18394C801610EC5E00335E85 /* NSNumberMethods.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906FB61610BF3C0003C892 /* NSNumberMethods.h */; settings = {ATTRIBUTES = (Private, ); }; }; 18394C811610EC5E00335E85 /* NSXMLPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 18906FF01610BF3C0003C892 /* NSXMLPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; }; 184915A5163056E800B0ED83 /* libffi.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 184915A4163056E800B0ED83 /* libffi.dylib */; }; 1852894F161243FC0016729B /* NSObjCRuntime.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FB71610BF3C0003C892 /* NSObjCRuntime.m */; }; 185289511613861E0016729B /* GSObjCRuntime.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F131610BF3C0003C892 /* GSObjCRuntime.m */; }; 1852895216138A7D0016729B /* NSUnarchiver.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FE51610BF3C0003C892 /* NSUnarchiver.m */; }; 1852895316138C5C0016729B /* NSArchiver.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F711610BF3C0003C892 /* NSArchiver.m */; }; 1852895416138CFB0016729B /* NSData.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F881610BF3C0003C892 /* NSData.m */; }; 1852895516138E6F0016729B /* NSPortCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FC11610BF3C0003C892 /* NSPortCoder.m */; }; 18528957161396130016729B /* GCArray.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F0B1610BF3C0003C892 /* GCArray.m */; }; 18528958161396160016729B /* GCDictionary.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F0C1610BF3C0003C892 /* GCDictionary.m */; }; 185289591613961A0016729B /* GCObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F0D1610BF3C0003C892 /* GCObject.m */; }; 1852895A161396200016729B /* GSFunctions.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F0F1610BF3C0003C892 /* GSFunctions.m */; }; 1852895B161396240016729B /* GSInsensitiveDictionary.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F101610BF3C0003C892 /* GSInsensitiveDictionary.m */; }; 1852895C161396280016729B /* GSLock.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F111610BF3C0003C892 /* GSLock.m */; }; 1852895D1613962B0016729B /* GSMime.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F121610BF3C0003C892 /* GSMime.m */; }; 1852895E161396310016729B /* GSXML.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F141610BF3C0003C892 /* GSXML.m */; }; 1852895F161396450016729B /* GSArray.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F391610BF3C0003C892 /* GSArray.m */; }; 18528960161396450016729B /* GSAttributedString.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F3A1610BF3C0003C892 /* GSAttributedString.m */; }; 18528961161396450016729B /* CXXException.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F351610BF3C0003C892 /* CXXException.m */; }; 18528966161396450016729B /* GSBlocks.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F411610BF3C0003C892 /* GSBlocks.m */; }; 18528967161396450016729B /* GSConcreteValue.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F421610BF3C0003C892 /* GSConcreteValue.m */; }; 18528969161396450016729B /* GSCountedSet.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F441610BF3C0003C892 /* GSCountedSet.m */; }; 1852896A161396450016729B /* GSDictionary.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F451610BF3C0003C892 /* GSDictionary.m */; }; 1852896D161396450016729B /* GSFTPURLHandle.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F491610BF3C0003C892 /* GSFTPURLHandle.m */; }; 1852896E161396450016729B /* GSFileHandle.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F4C1610BF3C0003C892 /* GSFileHandle.m */; }; 1852896F161396450016729B /* GSFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F4D1610BF3C0003C892 /* GSFormat.m */; }; 18528970161396450016729B /* GSHTTPAuthentication.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F4E1610BF3C0003C892 /* GSHTTPAuthentication.m */; }; 18528971161396450016729B /* GSHTTPURLHandle.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F4F1610BF3C0003C892 /* GSHTTPURLHandle.m */; }; 18528972161396450016729B /* GSICUString.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F511610BF3C0003C892 /* GSICUString.m */; }; 18528973161396450016729B /* GSLocale.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F541610BF3C0003C892 /* GSLocale.m */; }; 18528974161396450016729B /* GSMDNSNetServices.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F551610BF3C0003C892 /* GSMDNSNetServices.m */; }; 18528975161396450016729B /* GSQuickSort.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F5C1610BF3C0003C892 /* GSQuickSort.m */; }; 18528976161396450016729B /* GSRunLoopWatcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F5F1610BF3C0003C892 /* GSRunLoopWatcher.m */; }; 18528977161396450016729B /* GSSet.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F601610BF3C0003C892 /* GSSet.m */; }; 18528978161396450016729B /* GSShellSort.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F611610BF3C0003C892 /* GSShellSort.m */; }; 18528979161396450016729B /* GSSocketStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F631610BF3C0003C892 /* GSSocketStream.m */; }; 1852897A161396450016729B /* GSStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F661610BF3C0003C892 /* GSStream.m */; }; 1852897B161396450016729B /* GSString.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F671610BF3C0003C892 /* GSString.m */; }; 1852897C161396450016729B /* GSTLS.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F691610BF3C0003C892 /* GSTLS.m */; }; 1852897D161396450016729B /* GSTimSort.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F6A1610BF3C0003C892 /* GSTimSort.m */; }; 1852897E161396450016729B /* GSValue.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F6C1610BF3C0003C892 /* GSValue.m */; }; 18528984161398FF0016729B /* NSArray+GNUstepBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F171610BF3C0003C892 /* NSArray+GNUstepBase.m */; }; 18528985161398FF0016729B /* NSAttributedString+GNUstepBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F181610BF3C0003C892 /* NSAttributedString+GNUstepBase.m */; }; 18528986161398FF0016729B /* NSBundle+GNUstepBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F191610BF3C0003C892 /* NSBundle+GNUstepBase.m */; }; 18528987161398FF0016729B /* NSCalendarDate+GNUstepBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F1A1610BF3C0003C892 /* NSCalendarDate+GNUstepBase.m */; }; 18528988161398FF0016729B /* NSData+GNUstepBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F1B1610BF3C0003C892 /* NSData+GNUstepBase.m */; }; 18528989161398FF0016729B /* NSDebug+GNUstepBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F1C1610BF3C0003C892 /* NSDebug+GNUstepBase.m */; }; 1852898A161398FF0016729B /* NSError+GNUstepBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F1D1610BF3C0003C892 /* NSError+GNUstepBase.m */; }; 1852898B161398FF0016729B /* NSFileHandle+GNUstepBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F1E1610BF3C0003C892 /* NSFileHandle+GNUstepBase.m */; }; 1852898C161399000016729B /* NSLock+GNUstepBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F1F1610BF3C0003C892 /* NSLock+GNUstepBase.m */; }; 1852898D161399000016729B /* NSMutableString+GNUstepBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F201610BF3C0003C892 /* NSMutableString+GNUstepBase.m */; }; 1852898E161399000016729B /* NSNumber+GNUstepBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F211610BF3C0003C892 /* NSNumber+GNUstepBase.m */; }; 1852898F161399000016729B /* NSObject+GNUstepBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F221610BF3C0003C892 /* NSObject+GNUstepBase.m */; }; 18528990161399000016729B /* NSProcessInfo+GNUstepBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F231610BF3C0003C892 /* NSProcessInfo+GNUstepBase.m */; }; 18528991161399000016729B /* NSPropertyList+GNUstepBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F241610BF3C0003C892 /* NSPropertyList+GNUstepBase.m */; }; 18528992161399000016729B /* NSStream+GNUstepBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F251610BF3C0003C892 /* NSStream+GNUstepBase.m */; }; 18528993161399000016729B /* NSString+GNUstepBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F261610BF3C0003C892 /* NSString+GNUstepBase.m */; }; 18528994161399000016729B /* NSTask+GNUstepBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F271610BF3C0003C892 /* NSTask+GNUstepBase.m */; }; 18528995161399000016729B /* NSThread+GNUstepBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F281610BF3C0003C892 /* NSThread+GNUstepBase.m */; }; 18528996161399000016729B /* NSURL+GNUstepBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F291610BF3C0003C892 /* NSURL+GNUstepBase.m */; }; 18528997161399000016729B /* Unicode.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906F2A1610BF3C0003C892 /* Unicode.m */; }; 18528999161399720016729B /* libxml2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 185289981613996F0016729B /* libxml2.dylib */; }; 1852899B161399D70016729B /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 1852899A161399D40016729B /* libz.dylib */; }; 1852899D161399FB0016729B /* libxslt.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 1852899C161399F80016729B /* libxslt.dylib */; }; 1852899F16139A1B0016729B /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 1852899E16139A180016729B /* libiconv.dylib */; }; 185289A216139AAF0016729B /* NSObject+NSComparisonMethods.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FB81610BF3C0003C892 /* NSObject+NSComparisonMethods.m */; }; 185289A516139AAF0016729B /* externs.m in Sources */ = {isa = PBXBuildFile; fileRef = 189070031610BF3C0003C892 /* externs.m */; }; 185289AA16139AAF0016729B /* preface.m in Sources */ = {isa = PBXBuildFile; fileRef = 1890700C1610BF3C0003C892 /* preface.m */; }; 185289FF1613A8840016729B /* NSNotificationCenter.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FB11610BF3C0003C892 /* NSNotificationCenter.m */; }; 18528A001613AB940016729B /* GSRunLoopCtxt.m in Sources */ = {isa = PBXBuildFile; fileRef = 189070101610BF3C0003C892 /* GSRunLoopCtxt.m */; }; 18528A011613AB940016729B /* NSStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 189070121610BF3C0003C892 /* NSStream.m */; }; 185391931625FD0C0015BDFA /* NSKeyedUnarchiver.m in Sources */ = {isa = PBXBuildFile; fileRef = 18906FA71610BF3C0003C892 /* NSKeyedUnarchiver.m */; }; 18641D1F1678AD34003C6E11 /* GSSocks4Parser.m in Sources */ = {isa = PBXBuildFile; fileRef = 18641D0F1678AD04003C6E11 /* GSSocks4Parser.m */; }; 18641D201678AD39003C6E11 /* GSSocks5Parser.m in Sources */ = {isa = PBXBuildFile; fileRef = 18641D111678AD04003C6E11 /* GSSocks5Parser.m */; }; 18641D211678AD41003C6E11 /* GSSocksParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 18641D131678AD04003C6E11 /* GSSocksParser.m */; }; 18641D221678AD46003C6E11 /* GSSocksParserPrivate.m in Sources */ = {isa = PBXBuildFile; fileRef = 18641D151678AD04003C6E11 /* GSSocksParserPrivate.m */; }; 1890B34116F3BC3300187826 /* GSPrivateHash.m in Sources */ = {isa = PBXBuildFile; fileRef = 1890B34016F3BC3300187826 /* GSPrivateHash.m */; }; 18EA6761172EC6170026AC34 /* GSTypeEncoding.c in Sources */ = {isa = PBXBuildFile; fileRef = 18EA675F172EC6170026AC34 /* GSTypeEncoding.c */; }; 18EA6764172EC7F70026AC34 /* GSTypeEncoding.h in Headers */ = {isa = PBXBuildFile; fileRef = 18EA6763172EC7F70026AC34 /* GSTypeEncoding.h */; }; 18EFCC1F172B0B9A003304CA /* gdnc.m in Sources */ = {isa = PBXBuildFile; fileRef = 1837D9DE1652D0FF00197E53 /* gdnc.m */; }; AD197C05189A4D5F000F6CF9 /* NSInvocation.m in Sources */ = {isa = PBXBuildFile; fileRef = AD197BFF189A4D5F000F6CF9 /* NSInvocation.m */; }; AD197C06189A4D5F000F6CF9 /* NSInvocationOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = AD197C00189A4D5F000F6CF9 /* NSInvocationOperation.m */; }; AD197C07189A4D5F000F6CF9 /* NSKeyValueObserving.m in Sources */ = {isa = PBXBuildFile; fileRef = AD197C01189A4D5F000F6CF9 /* NSKeyValueObserving.m */; }; AD197C08189A4D5F000F6CF9 /* NSMetadata.m in Sources */ = {isa = PBXBuildFile; fileRef = AD197C02189A4D5F000F6CF9 /* NSMetadata.m */; }; AD197C09189A4D5F000F6CF9 /* NSUserNotification.m in Sources */ = {isa = PBXBuildFile; fileRef = AD197C03189A4D5F000F6CF9 /* NSUserNotification.m */; }; AD197C0A189A4D5F000F6CF9 /* NSUUID.m in Sources */ = {isa = PBXBuildFile; fileRef = AD197C04189A4D5F000F6CF9 /* NSUUID.m */; }; AD197C11189A4E98000F6CF9 /* NSInvocationOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = AD197C0C189A4E98000F6CF9 /* NSInvocationOperation.h */; }; AD197C12189A4E98000F6CF9 /* NSMetadata.h in Headers */ = {isa = PBXBuildFile; fileRef = AD197C0D189A4E98000F6CF9 /* NSMetadata.h */; }; AD197C13189A4E98000F6CF9 /* NSUserNotification.h in Headers */ = {isa = PBXBuildFile; fileRef = AD197C0E189A4E98000F6CF9 /* NSUserNotification.h */; }; AD197C14189A4E98000F6CF9 /* NSUUID.h in Headers */ = {isa = PBXBuildFile; fileRef = AD197C0F189A4E98000F6CF9 /* NSUUID.h */; }; /* End PBXBuildFile section */ /* Begin PBXBuildRule section */ 1801C64416B5A8E400999B34 /* PBXBuildRule */ = { isa = PBXBuildRule; compilerSpec = com.apple.compilers.proxy.script; filePatterns = "*.S"; fileType = pattern.proxy; isEditable = 1; outputFiles = ( "${OBJECT_FILE_DIR}/${INPUT_FILE_NAME}.o", ); script = "clang -DNeXT_RUNTIME -c $INPUT_FILE_DIR/$INPUT_FILE_NAME -o $SCRIPT_OUTPUT_FILE_0"; }; /* End PBXBuildRule section */ /* Begin PBXContainerItemProxy section */ 1837DA0F1652D18400197E53 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 18906E371610BC4C0003C892 /* Project object */; proxyType = 1; remoteGlobalIDString = 18394B1B1610D8E300335E85; remoteInfo = Foundation; }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ 1837DA151652D18400197E53 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = /usr/share/man/man1/; dstSubfolderSpec = 0; files = ( ); runOnlyForDeploymentPostprocessing = 1; }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ 1837D9C61652D0FF00197E53 /* .cvsignore */ = {isa = PBXFileReference; lastKnownFileType = text; path = .cvsignore; sourceTree = ""; }; 1837D9C71652D0FF00197E53 /* AGSHtml.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AGSHtml.h; sourceTree = ""; }; 1837D9C81652D0FF00197E53 /* AGSHtml.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AGSHtml.m; sourceTree = ""; }; 1837D9C91652D0FF00197E53 /* AGSIndex.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AGSIndex.h; sourceTree = ""; }; 1837D9CA1652D0FF00197E53 /* AGSIndex.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AGSIndex.m; sourceTree = ""; }; 1837D9CB1652D0FF00197E53 /* AGSOutput.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AGSOutput.h; sourceTree = ""; }; 1837D9CC1652D0FF00197E53 /* AGSOutput.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AGSOutput.m; sourceTree = ""; }; 1837D9CD1652D0FF00197E53 /* AGSParser.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AGSParser.h; sourceTree = ""; }; 1837D9CE1652D0FF00197E53 /* AGSParser.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AGSParser.m; sourceTree = ""; }; 1837D9CF1652D0FF00197E53 /* BaseTools.gsdoc */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = BaseTools.gsdoc; sourceTree = ""; }; 1837D9D01652D0FF00197E53 /* DocMakefile */ = {isa = PBXFileReference; lastKnownFileType = text; path = DocMakefile; sourceTree = ""; }; 1837D9D11652D0FF00197E53 /* GNUmakefile */ = {isa = PBXFileReference; lastKnownFileType = text; path = GNUmakefile; sourceTree = ""; }; 1837D9D21652D0FF00197E53 /* HTMLLinker.gsdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = HTMLLinker.gsdoc; sourceTree = ""; }; 1837D9D31652D0FF00197E53 /* HTMLLinker.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HTMLLinker.m; sourceTree = ""; }; 1837D9D41652D0FF00197E53 /* Makefile.postamble */ = {isa = PBXFileReference; lastKnownFileType = text; path = Makefile.postamble; sourceTree = ""; }; 1837D9D51652D0FF00197E53 /* Makefile.preamble */ = {isa = PBXFileReference; lastKnownFileType = text; path = Makefile.preamble; sourceTree = ""; }; 1837D9D61652D0FF00197E53 /* autogsdoc.1 */ = {isa = PBXFileReference; lastKnownFileType = text.man; path = autogsdoc.1; sourceTree = ""; }; 1837D9D71652D0FF00197E53 /* autogsdoc.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = autogsdoc.m; sourceTree = ""; }; 1837D9D81652D0FF00197E53 /* cvtenc.1 */ = {isa = PBXFileReference; lastKnownFileType = text.man; path = cvtenc.1; sourceTree = ""; }; 1837D9D91652D0FF00197E53 /* cvtenc.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = cvtenc.m; sourceTree = ""; }; 1837D9DA1652D0FF00197E53 /* defaults.1 */ = {isa = PBXFileReference; lastKnownFileType = text.man; path = defaults.1; sourceTree = ""; }; 1837D9DB1652D0FF00197E53 /* defaults.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = defaults.m; sourceTree = ""; }; 1837D9DC1652D0FF00197E53 /* gdnc.1 */ = {isa = PBXFileReference; lastKnownFileType = text.man; path = gdnc.1; sourceTree = ""; }; 1837D9DD1652D0FF00197E53 /* gdnc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = gdnc.h; sourceTree = ""; }; 1837D9DE1652D0FF00197E53 /* gdnc.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = gdnc.m; sourceTree = ""; }; 1837D9DF1652D0FF00197E53 /* gdomap.8 */ = {isa = PBXFileReference; lastKnownFileType = text; path = gdomap.8; sourceTree = ""; }; 1837D9E01652D0FF00197E53 /* gdomap.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = gdomap.c; sourceTree = ""; }; 1837D9E11652D0FF00197E53 /* gdomap.gsdoc */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = gdomap.gsdoc; sourceTree = ""; }; 1837D9E21652D0FF00197E53 /* gdomap.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = gdomap.h; sourceTree = ""; }; 1837D9E31652D0FF00197E53 /* gsdoc-0_6_5.dtd */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = "gsdoc-0_6_5.dtd"; sourceTree = ""; }; 1837D9E41652D0FF00197E53 /* gsdoc-0_6_6.dtd */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = "gsdoc-0_6_6.dtd"; sourceTree = ""; }; 1837D9E51652D0FF00197E53 /* gsdoc-0_6_7.dtd */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = "gsdoc-0_6_7.dtd"; sourceTree = ""; }; 1837D9E61652D0FF00197E53 /* gsdoc-1_0_0.dtd */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = "gsdoc-1_0_0.dtd"; sourceTree = ""; }; 1837D9E71652D0FF00197E53 /* gsdoc-1_0_1.dtd */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = "gsdoc-1_0_1.dtd"; sourceTree = ""; }; 1837D9E81652D0FF00197E53 /* gsdoc-1_0_1.rnc */ = {isa = PBXFileReference; lastKnownFileType = text; path = "gsdoc-1_0_1.rnc"; sourceTree = ""; }; 1837D9E91652D0FF00197E53 /* gsdoc-1_0_2.dtd */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = "gsdoc-1_0_2.dtd"; sourceTree = ""; }; 1837D9EA1652D0FF00197E53 /* gsdoc-1_0_3.dtd */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = "gsdoc-1_0_3.dtd"; sourceTree = ""; }; 1837D9EB1652D0FF00197E53 /* gsdoc.7 */ = {isa = PBXFileReference; lastKnownFileType = text; path = gsdoc.7; sourceTree = ""; }; 1837D9EC1652D0FF00197E53 /* gsdoc.gsdoc */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = gsdoc.gsdoc; sourceTree = ""; }; 1837D9ED1652D0FF00197E53 /* gspath.1 */ = {isa = PBXFileReference; lastKnownFileType = text.man; path = gspath.1; sourceTree = ""; }; 1837D9EE1652D0FF00197E53 /* gspath.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = gspath.m; sourceTree = ""; }; 1837D9EF1652D0FF00197E53 /* locale_alias.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = locale_alias.m; sourceTree = ""; }; 1837D9F11652D0FF00197E53 /* .cvsignore */ = {isa = PBXFileReference; lastKnownFileType = text; path = .cvsignore; sourceTree = ""; }; 1837D9F21652D0FF00197E53 /* GNUmakefile */ = {isa = PBXFileReference; lastKnownFileType = text; path = GNUmakefile; sourceTree = ""; }; 1837D9F31652D0FF00197E53 /* GNUmakefile.preamble */ = {isa = PBXFileReference; lastKnownFileType = text; path = GNUmakefile.preamble; sourceTree = ""; }; 1837D9F41652D0FF00197E53 /* README */ = {isa = PBXFileReference; lastKnownFileType = text; path = README; sourceTree = ""; }; 1837D9F51652D0FF00197E53 /* SourceEntry.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SourceEntry.h; sourceTree = ""; }; 1837D9F61652D0FF00197E53 /* SourceEntry.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SourceEntry.m; sourceTree = ""; }; 1837D9F71652D0FF00197E53 /* StringsEntry.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = StringsEntry.h; sourceTree = ""; }; 1837D9F81652D0FF00197E53 /* StringsEntry.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = StringsEntry.m; sourceTree = ""; }; 1837D9F91652D0FF00197E53 /* StringsFile.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = StringsFile.h; sourceTree = ""; }; 1837D9FA1652D0FF00197E53 /* StringsFile.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = StringsFile.m; sourceTree = ""; }; 1837D9FB1652D0FF00197E53 /* Using.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = Using.txt; sourceTree = ""; }; 1837D9FC1652D0FF00197E53 /* make_strings.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = make_strings.h; sourceTree = ""; }; 1837D9FD1652D0FF00197E53 /* make_strings.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = make_strings.m; sourceTree = ""; }; 1837D9FE1652D0FF00197E53 /* test1.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = test1.m; sourceTree = ""; }; 1837D9FF1652D0FF00197E53 /* mkchlog.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = mkchlog.sh; sourceTree = ""; }; 1837DA001652D0FF00197E53 /* pl.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = pl.m; sourceTree = ""; }; 1837DA011652D0FF00197E53 /* pl2link.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = pl2link.m; sourceTree = ""; }; 1837DA021652D0FF00197E53 /* pldes.1 */ = {isa = PBXFileReference; lastKnownFileType = text.man; path = pldes.1; sourceTree = ""; }; 1837DA031652D0FF00197E53 /* pldes.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = pldes.m; sourceTree = ""; }; 1837DA041652D0FF00197E53 /* plget.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = plget.m; sourceTree = ""; }; 1837DA051652D0FF00197E53 /* plist-0_9.dtd */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = "plist-0_9.dtd"; sourceTree = ""; }; 1837DA061652D0FF00197E53 /* plmerge.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = plmerge.m; sourceTree = ""; }; 1837DA071652D0FF00197E53 /* plparse.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = plparse.m; sourceTree = ""; }; 1837DA081652D0FF00197E53 /* plser.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = plser.m; sourceTree = ""; }; 1837DA091652D0FF00197E53 /* sfparse.1 */ = {isa = PBXFileReference; lastKnownFileType = text.man; path = sfparse.1; sourceTree = ""; }; 1837DA0A1652D0FF00197E53 /* sfparse.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = sfparse.m; sourceTree = ""; }; 1837DA0B1652D0FF00197E53 /* xmlparse.1 */ = {isa = PBXFileReference; lastKnownFileType = text.man; path = xmlparse.1; sourceTree = ""; }; 1837DA0C1652D0FF00197E53 /* xmlparse.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = xmlparse.m; sourceTree = ""; }; 1837DA191652D18400197E53 /* gdnc */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = gdnc; sourceTree = BUILT_PRODUCTS_DIR; }; 18394A9C1610C04600335E85 /* configure */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = configure; sourceTree = SOURCE_ROOT; }; 18394AA31610CC4E00335E85 /* config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = config.h; sourceTree = ""; }; 18394AA41610CC4E00335E85 /* GSConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GSConfig.h; sourceTree = ""; }; 18394B1C1610D8E300335E85 /* Foundation.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Foundation.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 18394B311610D95600335E85 /* Foundation-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "Foundation-Info.plist"; path = "Support/Foundation/Foundation-Info.plist"; sourceTree = SOURCE_ROOT; }; 18394B321610D95600335E85 /* Foundation-Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "Foundation-Prefix.pch"; path = "Support/Foundation/Foundation-Prefix.pch"; sourceTree = SOURCE_ROOT; }; 18394BF51610E73300335E85 /* libobjc.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libobjc.dylib; path = usr/lib/libobjc.dylib; sourceTree = SDKROOT; }; 18394BF71610E84A00335E85 /* libicudata.48.1.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libicudata.48.1.dylib; path = /opt/local/lib/libicudata.48.1.dylib; sourceTree = ""; }; 18394BF91610E85A00335E85 /* libicucore.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libicucore.dylib; path = usr/lib/libicucore.dylib; sourceTree = SDKROOT; }; 18394BFB1610E8FB00335E85 /* libicui18n.48.1.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libicui18n.48.1.dylib; path = /opt/local/lib/libicui18n.48.1.dylib; sourceTree = ""; }; 18394BFD1610E97A00335E85 /* libicuuc.48.1.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libicuuc.48.1.dylib; path = /opt/local/lib/libicuuc.48.1.dylib; sourceTree = ""; }; 184915A4163056E800B0ED83 /* libffi.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libffi.dylib; path = usr/lib/libffi.dylib; sourceTree = SDKROOT; }; 18528980161397F40016729B /* libgnutls.26.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libgnutls.26.dylib; path = /opt/local/lib/libgnutls.26.dylib; sourceTree = ""; }; 185289981613996F0016729B /* libxml2.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libxml2.dylib; path = usr/lib/libxml2.dylib; sourceTree = SDKROOT; }; 1852899A161399D40016729B /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; }; 1852899C161399F80016729B /* libxslt.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libxslt.dylib; path = usr/lib/libxslt.dylib; sourceTree = SDKROOT; }; 1852899E16139A180016729B /* libiconv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libiconv.dylib; path = usr/lib/libiconv.dylib; sourceTree = SDKROOT; }; 185289A016139A470016729B /* libgcrypt.11.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libgcrypt.11.dylib; path = /opt/local/lib/libgcrypt.11.dylib; sourceTree = ""; }; 185289AB1613A06F0016729B /* configure.ac */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = configure.ac; sourceTree = SOURCE_ROOT; }; 185289AE1613A1060016729B /* addlibrarypath.m4 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = addlibrarypath.m4; sourceTree = ""; }; 185289AF1613A1060016729B /* codeset.m4 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = codeset.m4; sourceTree = ""; }; 185289B01613A1060016729B /* config.align.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = config.align.c; sourceTree = ""; }; 185289B11613A1060016729B /* config.builtin_apply.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = config.builtin_apply.c; sourceTree = ""; }; 185289B21613A1060016729B /* config.constant-string-class.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "config.constant-string-class.m"; sourceTree = ""; }; 185289B31613A1060016729B /* config.constant-string-encoding.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "config.constant-string-encoding.c"; sourceTree = ""; }; 185289B41613A1060016729B /* config.ffi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = config.ffi.c; sourceTree = ""; }; 185289B51613A1060016729B /* config.forward.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = config.forward.m; sourceTree = ""; }; 185289B61613A1060016729B /* config.forward2.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = config.forward2.m; sourceTree = ""; }; 185289B71613A1060016729B /* config.initialize.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = config.initialize.m; sourceTree = ""; }; 185289B81613A1060016729B /* config.joinable.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = config.joinable.m; sourceTree = ""; }; 185289B91613A1060016729B /* config.kvmopen.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = config.kvmopen.c; sourceTree = ""; }; 185289BA1613A1060016729B /* config.loadtest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = config.loadtest.m; sourceTree = ""; }; 185289BB1613A1060016729B /* config.nested.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = config.nested.c; sourceTree = ""; }; 185289BC1613A1060016729B /* config.nextcc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = config.nextcc.h; sourceTree = ""; }; 185289BD1613A1060016729B /* config.nextrt.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = config.nextrt.m; sourceTree = ""; }; 185289BE1613A1060016729B /* config.non-fragile-ivars.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "config.non-fragile-ivars.m"; sourceTree = ""; }; 185289BF1613A1060016729B /* config.objc.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = config.objc.m; sourceTree = ""; }; 185289C01613A1060016729B /* config.poll-dev.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "config.poll-dev.c"; sourceTree = ""; }; 185289C11613A1060016729B /* config.poll.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = config.poll.c; sourceTree = ""; }; 185289C21613A1060016729B /* config.printf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = config.printf.c; sourceTree = ""; }; 185289C31613A1060016729B /* config.proccmd.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = config.proccmd.c; sourceTree = ""; }; 185289C41613A1060016729B /* config.psinfo.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = config.psinfo.c; sourceTree = ""; }; 185289C51613A1060016729B /* config.retframe.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = config.retframe.c; sourceTree = ""; }; 185289C61613A1060016729B /* config.reuseaddr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = config.reuseaddr.c; sourceTree = ""; }; 185289C71613A1060016729B /* config.setUncaughtExceptionHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = config.setUncaughtExceptionHandler.m; sourceTree = ""; }; 185289C81613A1060016729B /* config.set_unexpected.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = config.set_unexpected.m; sourceTree = ""; }; 185289C91613A1060016729B /* config.trampoline.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = config.trampoline.c; sourceTree = ""; }; 185289CA1613A1060016729B /* config.unexpected.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = config.unexpected.m; sourceTree = ""; }; 185289CB1613A1060016729B /* config.vasprintf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = config.vasprintf.c; sourceTree = ""; }; 185289CC1613A1060016729B /* config.vsprintf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = config.vsprintf.c; sourceTree = ""; }; 185289CD1613A1060016729B /* config.wprintf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = config.wprintf.c; sourceTree = ""; }; 185289CE1613A1060016729B /* icu.m4 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = icu.m4; sourceTree = ""; }; 185289CF1613A1060016729B /* objc-common.g */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "objc-common.g"; sourceTree = ""; }; 185289D01613A1060016729B /* objc-con-autoload.m4 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "objc-con-autoload.m4"; sourceTree = ""; }; 185289D11613A1060016729B /* objc-sys-dynamic.m4 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "objc-sys-dynamic.m4"; sourceTree = ""; }; 185289D21613A1060016729B /* pathtls.m4 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = pathtls.m4; sourceTree = ""; }; 185289D31613A1060016729B /* pathxml.m4 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = pathxml.m4; sourceTree = ""; }; 185289D41613A1060016729B /* procfs-exe-link.m4 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "procfs-exe-link.m4"; sourceTree = ""; }; 185289D51613A1060016729B /* procfs.m4 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = procfs.m4; sourceTree = ""; }; 1857833F17551CC200CB7160 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 1857834017551CC200CB7160 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 1857834117551CC200CB7160 /* general.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = general.m; sourceTree = ""; }; 18578359175525A400CB7160 /* NSArray.1.32bit */ = {isa = PBXFileReference; lastKnownFileType = file; path = NSArray.1.32bit; sourceTree = ""; }; 1857835A175525A400CB7160 /* NSArray.1.64bit */ = {isa = PBXFileReference; lastKnownFileType = file; path = NSArray.1.64bit; sourceTree = ""; }; 1857835B175525A400CB7160 /* NSAttributedString.0.32bit */ = {isa = PBXFileReference; lastKnownFileType = file; path = NSAttributedString.0.32bit; sourceTree = ""; }; 1857835C175525A400CB7160 /* NSAttributedString.0.64bit */ = {isa = PBXFileReference; lastKnownFileType = file; path = NSAttributedString.0.64bit; sourceTree = ""; }; 1857835D175525A400CB7160 /* NSCharacterSet.0.32bit */ = {isa = PBXFileReference; lastKnownFileType = file; path = NSCharacterSet.0.32bit; sourceTree = ""; }; 1857835E175525A400CB7160 /* NSCharacterSet.0.64bit */ = {isa = PBXFileReference; lastKnownFileType = file; path = NSCharacterSet.0.64bit; sourceTree = ""; }; 1857835F175525A400CB7160 /* NSData.0.32bit */ = {isa = PBXFileReference; lastKnownFileType = file; path = NSData.0.32bit; sourceTree = ""; }; 18578360175525A400CB7160 /* NSData.0.64bit */ = {isa = PBXFileReference; lastKnownFileType = file; path = NSData.0.64bit; sourceTree = ""; }; 18578361175525A400CB7160 /* NSDate.1.32bit */ = {isa = PBXFileReference; lastKnownFileType = file; path = NSDate.1.32bit; sourceTree = ""; }; 18578362175525A400CB7160 /* NSDate.1.64bit */ = {isa = PBXFileReference; lastKnownFileType = file; path = NSDate.1.64bit; sourceTree = ""; }; 18578363175525A400CB7160 /* NSDateFormatter.0.32bit */ = {isa = PBXFileReference; lastKnownFileType = file; path = NSDateFormatter.0.32bit; sourceTree = ""; }; 18578364175525A400CB7160 /* NSDateFormatter.0.64bit */ = {isa = PBXFileReference; lastKnownFileType = file; path = NSDateFormatter.0.64bit; sourceTree = ""; }; 18578365175525A400CB7160 /* NSDictionary.0.32bit */ = {isa = PBXFileReference; lastKnownFileType = file; path = NSDictionary.0.32bit; sourceTree = ""; }; 18578366175525A400CB7160 /* NSDictionary.0.64bit */ = {isa = PBXFileReference; lastKnownFileType = file; path = NSDictionary.0.64bit; sourceTree = ""; }; 18578367175525A400CB7160 /* NSException.0.32bit */ = {isa = PBXFileReference; lastKnownFileType = file; path = NSException.0.32bit; sourceTree = ""; }; 18578368175525A400CB7160 /* NSException.0.64bit */ = {isa = PBXFileReference; lastKnownFileType = file; path = NSException.0.64bit; sourceTree = ""; }; 18578369175525A400CB7160 /* NSMutableData.0.32bit */ = {isa = PBXFileReference; lastKnownFileType = file; path = NSMutableData.0.32bit; sourceTree = ""; }; 1857836A175525A400CB7160 /* NSMutableData.0.64bit */ = {isa = PBXFileReference; lastKnownFileType = file; path = NSMutableData.0.64bit; sourceTree = ""; }; 1857836B175525A400CB7160 /* NSNotification.0.32bit */ = {isa = PBXFileReference; lastKnownFileType = file; path = NSNotification.0.32bit; sourceTree = ""; }; 1857836C175525A400CB7160 /* NSNotification.0.64bit */ = {isa = PBXFileReference; lastKnownFileType = file; path = NSNotification.0.64bit; sourceTree = ""; }; 1857836D175525A400CB7160 /* NSNull.0.32bit */ = {isa = PBXFileReference; lastKnownFileType = file; path = NSNull.0.32bit; sourceTree = ""; }; 1857836E175525A500CB7160 /* NSNull.0.64bit */ = {isa = PBXFileReference; lastKnownFileType = file; path = NSNull.0.64bit; sourceTree = ""; }; 1857836F175525A500CB7160 /* NSNumber.0.32bit */ = {isa = PBXFileReference; lastKnownFileType = file; path = NSNumber.0.32bit; sourceTree = ""; }; 18578370175525A500CB7160 /* NSNumber.0.64bit */ = {isa = PBXFileReference; lastKnownFileType = file; path = NSNumber.0.64bit; sourceTree = ""; }; 18578371175525A500CB7160 /* NSObject.0.32bit */ = {isa = PBXFileReference; lastKnownFileType = file; path = NSObject.0.32bit; sourceTree = ""; }; 18578372175525A500CB7160 /* NSObject.0.64bit */ = {isa = PBXFileReference; lastKnownFileType = file; path = NSObject.0.64bit; sourceTree = ""; }; 18578373175525A500CB7160 /* NSSet.0.32bit */ = {isa = PBXFileReference; lastKnownFileType = file; path = NSSet.0.32bit; sourceTree = ""; }; 18578374175525A500CB7160 /* NSSet.0.64bit */ = {isa = PBXFileReference; lastKnownFileType = file; path = NSSet.0.64bit; sourceTree = ""; }; 18578375175525A500CB7160 /* NSString.1.32bit */ = {isa = PBXFileReference; lastKnownFileType = file; path = NSString.1.32bit; sourceTree = ""; }; 18578376175525A500CB7160 /* NSString.1.64bit */ = {isa = PBXFileReference; lastKnownFileType = file; path = NSString.1.64bit; sourceTree = ""; }; 18578377175525A500CB7160 /* NSTableView.3.32bit */ = {isa = PBXFileReference; lastKnownFileType = file; path = NSTableView.3.32bit; sourceTree = ""; }; 18578378175525A500CB7160 /* NSURL.0.32bit */ = {isa = PBXFileReference; lastKnownFileType = file; path = NSURL.0.32bit; sourceTree = ""; }; 18578379175525A500CB7160 /* NSURL.0.64bit */ = {isa = PBXFileReference; lastKnownFileType = file; path = NSURL.0.64bit; sourceTree = ""; }; 1857837A175525A500CB7160 /* NSValue.3.32bit */ = {isa = PBXFileReference; lastKnownFileType = file; path = NSValue.3.32bit; sourceTree = ""; }; 1857837B175525A500CB7160 /* NSValue.3.64bit */ = {isa = PBXFileReference; lastKnownFileType = file; path = NSValue.3.64bit; sourceTree = ""; }; 18641D0E1678AD04003C6E11 /* GSSocks4Parser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GSSocks4Parser.h; sourceTree = ""; }; 18641D0F1678AD04003C6E11 /* GSSocks4Parser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GSSocks4Parser.m; sourceTree = ""; }; 18641D101678AD04003C6E11 /* GSSocks5Parser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GSSocks5Parser.h; sourceTree = ""; }; 18641D111678AD04003C6E11 /* GSSocks5Parser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GSSocks5Parser.m; sourceTree = ""; }; 18641D121678AD04003C6E11 /* GSSocksParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GSSocksParser.h; sourceTree = ""; }; 18641D131678AD04003C6E11 /* GSSocksParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GSSocksParser.m; sourceTree = ""; }; 18641D141678AD04003C6E11 /* GSSocksParserPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GSSocksParserPrivate.h; sourceTree = ""; }; 18641D151678AD04003C6E11 /* GSSocksParserPrivate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GSSocksParserPrivate.m; sourceTree = ""; }; 18906E621610BEC80003C892 /* README */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README; sourceTree = SOURCE_ROOT; }; 18906E681610BF3C0003C892 /* Foundation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Foundation.h; sourceTree = ""; }; 18906E691610BF3C0003C892 /* FoundationErrors.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FoundationErrors.h; sourceTree = ""; }; 18906E6A1610BF3C0003C892 /* NSAffineTransform.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSAffineTransform.h; sourceTree = ""; }; 18906E6B1610BF3C0003C892 /* NSArchiver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSArchiver.h; sourceTree = ""; }; 18906E6C1610BF3C0003C892 /* NSArray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSArray.h; sourceTree = ""; }; 18906E6D1610BF3C0003C892 /* NSAttributedString.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSAttributedString.h; sourceTree = ""; }; 18906E6E1610BF3C0003C892 /* NSAutoreleasePool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSAutoreleasePool.h; sourceTree = ""; }; 18906E6F1610BF3C0003C892 /* NSBundle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSBundle.h; sourceTree = ""; }; 18906E701610BF3C0003C892 /* NSByteOrder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSByteOrder.h; sourceTree = ""; }; 18906E711610BF3C0003C892 /* NSCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSCache.h; sourceTree = ""; }; 18906E721610BF3C0003C892 /* NSCalendar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSCalendar.h; sourceTree = ""; }; 18906E731610BF3C0003C892 /* NSCalendarDate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSCalendarDate.h; sourceTree = ""; }; 18906E741610BF3C0003C892 /* NSCharacterSet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSCharacterSet.h; sourceTree = ""; }; 18906E751610BF3C0003C892 /* NSClassDescription.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSClassDescription.h; sourceTree = ""; }; 18906E761610BF3C0003C892 /* NSCoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSCoder.h; sourceTree = ""; }; 18906E771610BF3C0003C892 /* NSComparisonPredicate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSComparisonPredicate.h; sourceTree = ""; }; 18906E781610BF3C0003C892 /* NSCompoundPredicate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSCompoundPredicate.h; sourceTree = ""; }; 18906E791610BF3C0003C892 /* NSConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSConnection.h; sourceTree = ""; }; 18906E7A1610BF3C0003C892 /* NSData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSData.h; sourceTree = ""; }; 18906E7B1610BF3C0003C892 /* NSDate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSDate.h; sourceTree = ""; }; 18906E7C1610BF3C0003C892 /* NSDateFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSDateFormatter.h; sourceTree = ""; }; 18906E7D1610BF3C0003C892 /* NSDebug.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSDebug.h; sourceTree = ""; }; 18906E7E1610BF3C0003C892 /* NSDecimal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSDecimal.h; sourceTree = ""; }; 18906E7F1610BF3C0003C892 /* NSDecimalNumber.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSDecimalNumber.h; sourceTree = ""; }; 18906E801610BF3C0003C892 /* NSDictionary.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSDictionary.h; sourceTree = ""; }; 18906E811610BF3C0003C892 /* NSDistantObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSDistantObject.h; sourceTree = ""; }; 18906E821610BF3C0003C892 /* NSDistributedLock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSDistributedLock.h; sourceTree = ""; }; 18906E831610BF3C0003C892 /* NSDistributedNotificationCenter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSDistributedNotificationCenter.h; sourceTree = ""; }; 18906E841610BF3C0003C892 /* NSEnumerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSEnumerator.h; sourceTree = ""; }; 18906E851610BF3C0003C892 /* NSError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSError.h; sourceTree = ""; }; 18906E861610BF3C0003C892 /* NSErrorRecoveryAttempting.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSErrorRecoveryAttempting.h; sourceTree = ""; }; 18906E871610BF3C0003C892 /* NSException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSException.h; sourceTree = ""; }; 18906E881610BF3C0003C892 /* NSExpression.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSExpression.h; sourceTree = ""; }; 18906E891610BF3C0003C892 /* NSFileHandle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSFileHandle.h; sourceTree = ""; }; 18906E8A1610BF3C0003C892 /* NSFileManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSFileManager.h; sourceTree = ""; }; 18906E8B1610BF3C0003C892 /* NSFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSFormatter.h; sourceTree = ""; }; 18906E8C1610BF3C0003C892 /* NSGarbageCollector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSGarbageCollector.h; sourceTree = ""; }; 18906E8D1610BF3C0003C892 /* NSGeometry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSGeometry.h; sourceTree = ""; }; 18906E8E1610BF3C0003C892 /* NSHTTPCookie.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSHTTPCookie.h; sourceTree = ""; }; 18906E8F1610BF3C0003C892 /* NSHTTPCookieStorage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSHTTPCookieStorage.h; sourceTree = ""; }; 18906E901610BF3C0003C892 /* NSHashTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSHashTable.h; sourceTree = ""; }; 18906E911610BF3C0003C892 /* NSHost.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSHost.h; sourceTree = ""; }; 18906E921610BF3C0003C892 /* NSIndexPath.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSIndexPath.h; sourceTree = ""; }; 18906E931610BF3C0003C892 /* NSIndexSet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSIndexSet.h; sourceTree = ""; }; 18906E941610BF3C0003C892 /* NSInvocation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSInvocation.h; sourceTree = ""; }; 18906E951610BF3C0003C892 /* NSJSONSerialization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSJSONSerialization.h; sourceTree = ""; }; 18906E961610BF3C0003C892 /* NSKeyValueCoding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSKeyValueCoding.h; sourceTree = ""; }; 18906E971610BF3C0003C892 /* NSKeyValueObserving.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSKeyValueObserving.h; sourceTree = ""; }; 18906E981610BF3C0003C892 /* NSKeyedArchiver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSKeyedArchiver.h; sourceTree = ""; }; 18906E991610BF3C0003C892 /* NSLocale.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSLocale.h; sourceTree = ""; }; 18906E9A1610BF3C0003C892 /* NSLock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSLock.h; sourceTree = ""; }; 18906E9B1610BF3C0003C892 /* NSMapTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSMapTable.h; sourceTree = ""; }; 18906E9C1610BF3C0003C892 /* NSMethodSignature.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSMethodSignature.h; sourceTree = ""; }; 18906E9D1610BF3C0003C892 /* NSNetServices.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSNetServices.h; sourceTree = ""; }; 18906E9E1610BF3C0003C892 /* NSNotification.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSNotification.h; sourceTree = ""; }; 18906E9F1610BF3C0003C892 /* NSNotificationQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSNotificationQueue.h; sourceTree = ""; }; 18906EA01610BF3C0003C892 /* NSNull.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSNull.h; sourceTree = ""; }; 18906EA11610BF3C0003C892 /* NSNumberFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSNumberFormatter.h; sourceTree = ""; }; 18906EA21610BF3C0003C892 /* NSObjCRuntime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSObjCRuntime.h; sourceTree = ""; }; 18906EA31610BF3C0003C892 /* NSObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSObject.h; sourceTree = ""; }; 18906EA41610BF3C0003C892 /* NSOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSOperation.h; sourceTree = ""; }; 18906EA51610BF3C0003C892 /* NSPathUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSPathUtilities.h; sourceTree = ""; }; 18906EA61610BF3C0003C892 /* NSPointerArray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSPointerArray.h; sourceTree = ""; }; 18906EA71610BF3C0003C892 /* NSPointerFunctions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSPointerFunctions.h; sourceTree = ""; }; 18906EA81610BF3C0003C892 /* NSPort.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSPort.h; sourceTree = ""; }; 18906EA91610BF3C0003C892 /* NSPortCoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSPortCoder.h; sourceTree = ""; }; 18906EAA1610BF3C0003C892 /* NSPortMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSPortMessage.h; sourceTree = ""; }; 18906EAB1610BF3C0003C892 /* NSPortNameServer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSPortNameServer.h; sourceTree = ""; }; 18906EAC1610BF3C0003C892 /* NSPredicate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSPredicate.h; sourceTree = ""; }; 18906EAD1610BF3C0003C892 /* NSProcessInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSProcessInfo.h; sourceTree = ""; }; 18906EAE1610BF3C0003C892 /* NSPropertyList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSPropertyList.h; sourceTree = ""; }; 18906EAF1610BF3C0003C892 /* NSProtocolChecker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSProtocolChecker.h; sourceTree = ""; }; 18906EB01610BF3C0003C892 /* NSProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSProxy.h; sourceTree = ""; }; 18906EB11610BF3C0003C892 /* NSRange.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSRange.h; sourceTree = ""; }; 18906EB21610BF3C0003C892 /* NSRegularExpression.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSRegularExpression.h; sourceTree = ""; }; 18906EB31610BF3C0003C892 /* NSRunLoop.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSRunLoop.h; sourceTree = ""; }; 18906EB41610BF3C0003C892 /* NSScanner.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSScanner.h; sourceTree = ""; }; 18906EB51610BF3C0003C892 /* NSScriptWhoseTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSScriptWhoseTests.h; sourceTree = ""; }; 18906EB61610BF3C0003C892 /* NSSerialization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSSerialization.h; sourceTree = ""; }; 18906EB71610BF3C0003C892 /* NSSet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSSet.h; sourceTree = ""; }; 18906EB81610BF3C0003C892 /* NSSortDescriptor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSSortDescriptor.h; sourceTree = ""; }; 18906EB91610BF3C0003C892 /* NSSpellServer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSSpellServer.h; sourceTree = ""; }; 18906EBA1610BF3C0003C892 /* NSStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSStream.h; sourceTree = ""; }; 18906EBB1610BF3C0003C892 /* NSString.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSString.h; sourceTree = ""; }; 18906EBC1610BF3C0003C892 /* NSTask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSTask.h; sourceTree = ""; }; 18906EBD1610BF3C0003C892 /* NSTextCheckingResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSTextCheckingResult.h; sourceTree = ""; }; 18906EBE1610BF3C0003C892 /* NSThread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSThread.h; sourceTree = ""; }; 18906EBF1610BF3C0003C892 /* NSTimeZone.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSTimeZone.h; sourceTree = ""; }; 18906EC01610BF3C0003C892 /* NSTimer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSTimer.h; sourceTree = ""; }; 18906EC11610BF3C0003C892 /* NSURL.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSURL.h; sourceTree = ""; }; 18906EC21610BF3C0003C892 /* NSURLAuthenticationChallenge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSURLAuthenticationChallenge.h; sourceTree = ""; }; 18906EC31610BF3C0003C892 /* NSURLCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSURLCache.h; sourceTree = ""; }; 18906EC41610BF3C0003C892 /* NSURLConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSURLConnection.h; sourceTree = ""; }; 18906EC51610BF3C0003C892 /* NSURLCredential.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSURLCredential.h; sourceTree = ""; }; 18906EC61610BF3C0003C892 /* NSURLCredentialStorage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSURLCredentialStorage.h; sourceTree = ""; }; 18906EC71610BF3C0003C892 /* NSURLDownload.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSURLDownload.h; sourceTree = ""; }; 18906EC81610BF3C0003C892 /* NSURLError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSURLError.h; sourceTree = ""; }; 18906EC91610BF3C0003C892 /* NSURLHandle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSURLHandle.h; sourceTree = ""; }; 18906ECA1610BF3C0003C892 /* NSURLProtectionSpace.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSURLProtectionSpace.h; sourceTree = ""; }; 18906ECB1610BF3C0003C892 /* NSURLProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSURLProtocol.h; sourceTree = ""; }; 18906ECC1610BF3C0003C892 /* NSURLRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSURLRequest.h; sourceTree = ""; }; 18906ECD1610BF3C0003C892 /* NSURLResponse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSURLResponse.h; sourceTree = ""; }; 18906ECE1610BF3C0003C892 /* NSUndoManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSUndoManager.h; sourceTree = ""; }; 18906ECF1610BF3C0003C892 /* NSUserDefaults.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSUserDefaults.h; sourceTree = ""; }; 18906ED01610BF3C0003C892 /* NSUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSUtilities.h; sourceTree = ""; }; 18906ED11610BF3C0003C892 /* NSValue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSValue.h; sourceTree = ""; }; 18906ED21610BF3C0003C892 /* NSValueTransformer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSValueTransformer.h; sourceTree = ""; }; 18906ED31610BF3C0003C892 /* NSXMLDTD.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSXMLDTD.h; sourceTree = ""; }; 18906ED41610BF3C0003C892 /* NSXMLDTDNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSXMLDTDNode.h; sourceTree = ""; }; 18906ED51610BF3C0003C892 /* NSXMLDocument.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSXMLDocument.h; sourceTree = ""; }; 18906ED61610BF3C0003C892 /* NSXMLElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSXMLElement.h; sourceTree = ""; }; 18906ED71610BF3C0003C892 /* NSXMLNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSXMLNode.h; sourceTree = ""; }; 18906ED81610BF3C0003C892 /* NSXMLNodeOptions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSXMLNodeOptions.h; sourceTree = ""; }; 18906ED91610BF3C0003C892 /* NSXMLParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSXMLParser.h; sourceTree = ""; }; 18906EDA1610BF3C0003C892 /* NSZone.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSZone.h; sourceTree = ""; }; 18906EDC1610BF3C0003C892 /* .cvsignore */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = .cvsignore; sourceTree = ""; }; 18906EDD1610BF3C0003C892 /* Additions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Additions.h; sourceTree = ""; }; 18906EDE1610BF3C0003C892 /* CXXException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CXXException.h; sourceTree = ""; }; 18906EDF1610BF3C0003C892 /* DistributedObjects.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DistributedObjects.h; sourceTree = ""; }; 18906EE01610BF3C0003C892 /* GCObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCObject.h; sourceTree = ""; }; 18906EE11610BF3C0003C892 /* GNUstep.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GNUstep.h; sourceTree = ""; }; 18906EE21610BF3C0003C892 /* GSBlocks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GSBlocks.h; sourceTree = ""; }; 18906EE31610BF3C0003C892 /* GSConfig.h.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = GSConfig.h.in; sourceTree = ""; }; 18906EE41610BF3C0003C892 /* GSFunctions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GSFunctions.h; sourceTree = ""; }; 18906EE51610BF3C0003C892 /* GSIArray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GSIArray.h; sourceTree = ""; }; 18906EE61610BF3C0003C892 /* GSIMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GSIMap.h; sourceTree = ""; }; 18906EE71610BF3C0003C892 /* GSLocale.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GSLocale.h; sourceTree = ""; }; 18906EE81610BF3C0003C892 /* GSLock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GSLock.h; sourceTree = ""; }; 18906EE91610BF3C0003C892 /* GSMime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GSMime.h; sourceTree = ""; }; 18906EEA1610BF3C0003C892 /* GSObjCRuntime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GSObjCRuntime.h; sourceTree = ""; }; 18906EEB1610BF3C0003C892 /* GSUnion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GSUnion.h; sourceTree = ""; }; 18906EEC1610BF3C0003C892 /* GSVersionMacros.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GSVersionMacros.h; sourceTree = ""; }; 18906EED1610BF3C0003C892 /* GSXML.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GSXML.h; sourceTree = ""; }; 18906EEE1610BF3C0003C892 /* NSArray+GNUstepBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSArray+GNUstepBase.h"; path = "../GNUstepBase/NSArray+GNUstepBase.h"; sourceTree = ""; }; 18906EEF1610BF3C0003C892 /* NSAttributedString+GNUstepBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSAttributedString+GNUstepBase.h"; path = "../GNUstepBase/NSAttributedString+GNUstepBase.h"; sourceTree = ""; }; 18906EF01610BF3C0003C892 /* NSBundle+GNUstepBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSBundle+GNUstepBase.h"; path = "../GNUstepBase/NSBundle+GNUstepBase.h"; sourceTree = ""; }; 18906EF11610BF3C0003C892 /* NSCalendarDate+GNUstepBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSCalendarDate+GNUstepBase.h"; path = "../GNUstepBase/NSCalendarDate+GNUstepBase.h"; sourceTree = ""; }; 18906EF21610BF3C0003C892 /* NSData+GNUstepBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSData+GNUstepBase.h"; path = "../GNUstepBase/NSData+GNUstepBase.h"; sourceTree = ""; }; 18906EF31610BF3C0003C892 /* NSDebug+GNUstepBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSDebug+GNUstepBase.h"; path = "../GNUstepBase/NSDebug+GNUstepBase.h"; sourceTree = ""; }; 18906EF41610BF3C0003C892 /* NSFileHandle+GNUstepBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSFileHandle+GNUstepBase.h"; path = "../GNUstepBase/NSFileHandle+GNUstepBase.h"; sourceTree = ""; }; 18906EF51610BF3C0003C892 /* NSLock+GNUstepBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSLock+GNUstepBase.h"; path = "../GNUstepBase/NSLock+GNUstepBase.h"; sourceTree = ""; }; 18906EF61610BF3C0003C892 /* NSMutableString+GNUstepBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSMutableString+GNUstepBase.h"; path = "../GNUstepBase/NSMutableString+GNUstepBase.h"; sourceTree = ""; }; 18906EF71610BF3C0003C892 /* NSNetServices+GNUstepBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSNetServices+GNUstepBase.h"; path = "../GNUstepBase/NSNetServices+GNUstepBase.h"; sourceTree = ""; }; 18906EF81610BF3C0003C892 /* NSNumber+GNUstepBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSNumber+GNUstepBase.h"; path = "../GNUstepBase/NSNumber+GNUstepBase.h"; sourceTree = ""; }; 18906EF91610BF3C0003C892 /* NSObject+GNUstepBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSObject+GNUstepBase.h"; path = "../GNUstepBase/NSObject+GNUstepBase.h"; sourceTree = ""; }; 18906EFA1610BF3C0003C892 /* NSProcessInfo+GNUstepBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSProcessInfo+GNUstepBase.h"; path = "../GNUstepBase/NSProcessInfo+GNUstepBase.h"; sourceTree = ""; }; 18906EFB1610BF3C0003C892 /* NSStream+GNUstepBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSStream+GNUstepBase.h"; path = "../GNUstepBase/NSStream+GNUstepBase.h"; sourceTree = ""; }; 18906EFC1610BF3C0003C892 /* NSString+GNUstepBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSString+GNUstepBase.h"; path = "../GNUstepBase/NSString+GNUstepBase.h"; sourceTree = ""; }; 18906EFD1610BF3C0003C892 /* NSTask+GNUstepBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSTask+GNUstepBase.h"; path = "../GNUstepBase/NSTask+GNUstepBase.h"; sourceTree = ""; }; 18906EFE1610BF3C0003C892 /* NSThread+GNUstepBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSThread+GNUstepBase.h"; path = "../GNUstepBase/NSThread+GNUstepBase.h"; sourceTree = ""; }; 18906EFF1610BF3C0003C892 /* NSURL+GNUstepBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSURL+GNUstepBase.h"; path = "../GNUstepBase/NSURL+GNUstepBase.h"; sourceTree = ""; }; 18906F001610BF3C0003C892 /* Unicode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Unicode.h; sourceTree = ""; }; 18906F011610BF3C0003C892 /* config.h.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = config.h.in; sourceTree = ""; }; 18906F091610BF3C0003C892 /* .cvsignore */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = .cvsignore; sourceTree = ""; }; 18906F0B1610BF3C0003C892 /* GCArray.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCArray.m; sourceTree = ""; }; 18906F0C1610BF3C0003C892 /* GCDictionary.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCDictionary.m; sourceTree = ""; }; 18906F0D1610BF3C0003C892 /* GCObject.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCObject.m; sourceTree = ""; }; 18906F0E1610BF3C0003C892 /* GNUmakefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = GNUmakefile; sourceTree = ""; }; 18906F0F1610BF3C0003C892 /* GSFunctions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GSFunctions.m; sourceTree = ""; }; 18906F101610BF3C0003C892 /* GSInsensitiveDictionary.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GSInsensitiveDictionary.m; sourceTree = ""; }; 18906F111610BF3C0003C892 /* GSLock.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GSLock.m; sourceTree = ""; }; 18906F121610BF3C0003C892 /* GSMime.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GSMime.m; sourceTree = ""; }; 18906F131610BF3C0003C892 /* GSObjCRuntime.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GSObjCRuntime.m; sourceTree = ""; }; 18906F141610BF3C0003C892 /* GSXML.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GSXML.m; sourceTree = ""; }; 18906F151610BF3C0003C892 /* Makefile.postamble */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.postamble; sourceTree = ""; }; 18906F161610BF3C0003C892 /* Makefile.preamble */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.preamble; sourceTree = ""; }; 18906F171610BF3C0003C892 /* NSArray+GNUstepBase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSArray+GNUstepBase.m"; sourceTree = ""; }; 18906F181610BF3C0003C892 /* NSAttributedString+GNUstepBase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSAttributedString+GNUstepBase.m"; sourceTree = ""; }; 18906F191610BF3C0003C892 /* NSBundle+GNUstepBase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSBundle+GNUstepBase.m"; sourceTree = ""; }; 18906F1A1610BF3C0003C892 /* NSCalendarDate+GNUstepBase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSCalendarDate+GNUstepBase.m"; sourceTree = ""; }; 18906F1B1610BF3C0003C892 /* NSData+GNUstepBase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSData+GNUstepBase.m"; sourceTree = ""; }; 18906F1C1610BF3C0003C892 /* NSDebug+GNUstepBase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSDebug+GNUstepBase.m"; sourceTree = ""; }; 18906F1D1610BF3C0003C892 /* NSError+GNUstepBase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSError+GNUstepBase.m"; sourceTree = ""; }; 18906F1E1610BF3C0003C892 /* NSFileHandle+GNUstepBase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSFileHandle+GNUstepBase.m"; sourceTree = ""; }; 18906F1F1610BF3C0003C892 /* NSLock+GNUstepBase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSLock+GNUstepBase.m"; sourceTree = ""; }; 18906F201610BF3C0003C892 /* NSMutableString+GNUstepBase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSMutableString+GNUstepBase.m"; sourceTree = ""; }; 18906F211610BF3C0003C892 /* NSNumber+GNUstepBase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSNumber+GNUstepBase.m"; sourceTree = ""; }; 18906F221610BF3C0003C892 /* NSObject+GNUstepBase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSObject+GNUstepBase.m"; sourceTree = ""; }; 18906F231610BF3C0003C892 /* NSProcessInfo+GNUstepBase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSProcessInfo+GNUstepBase.m"; sourceTree = ""; }; 18906F241610BF3C0003C892 /* NSPropertyList+GNUstepBase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSPropertyList+GNUstepBase.m"; sourceTree = ""; }; 18906F251610BF3C0003C892 /* NSStream+GNUstepBase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSStream+GNUstepBase.m"; sourceTree = ""; }; 18906F261610BF3C0003C892 /* NSString+GNUstepBase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+GNUstepBase.m"; sourceTree = ""; }; 18906F271610BF3C0003C892 /* NSTask+GNUstepBase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSTask+GNUstepBase.m"; sourceTree = ""; }; 18906F281610BF3C0003C892 /* NSThread+GNUstepBase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSThread+GNUstepBase.m"; sourceTree = ""; }; 18906F291610BF3C0003C892 /* NSURL+GNUstepBase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSURL+GNUstepBase.m"; sourceTree = ""; }; 18906F2A1610BF3C0003C892 /* Unicode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Unicode.m; sourceTree = ""; }; 18906F2C1610BF3C0003C892 /* caseconv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = caseconv.h; sourceTree = ""; }; 18906F2D1610BF3C0003C892 /* cop.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cop.h; sourceTree = ""; }; 18906F2E1610BF3C0003C892 /* cyrillic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cyrillic.h; sourceTree = ""; }; 18906F2F1610BF3C0003C892 /* decomp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = decomp.h; sourceTree = ""; }; 18906F301610BF3C0003C892 /* gsm0338.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gsm0338.h; sourceTree = ""; }; 18906F311610BF3C0003C892 /* latin2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = latin2.h; sourceTree = ""; }; 18906F321610BF3C0003C892 /* latin9.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = latin9.h; sourceTree = ""; }; 18906F331610BF3C0003C892 /* nextstep.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = nextstep.h; sourceTree = ""; }; 18906F341610BF3C0003C892 /* thai.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = thai.h; sourceTree = ""; }; 18906F351610BF3C0003C892 /* CXXException.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CXXException.m; sourceTree = ""; }; 18906F361610BF3C0003C892 /* CompatibilityHeaders.make */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CompatibilityHeaders.make; sourceTree = ""; }; 18906F371610BF3C0003C892 /* DocMakefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = DocMakefile; sourceTree = ""; }; 18906F381610BF3C0003C892 /* GNUmakefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = GNUmakefile; sourceTree = ""; }; 18906F391610BF3C0003C892 /* GSArray.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GSArray.m; sourceTree = ""; }; 18906F3A1610BF3C0003C892 /* GSAttributedString.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GSAttributedString.m; sourceTree = ""; }; 18906F3B1610BF3C0003C892 /* GSAvahiClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GSAvahiClient.h; path = Source/GSAvahiClient.h; sourceTree = ""; }; 18906F3C1610BF3C0003C892 /* GSAvahiClient.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GSAvahiClient.m; sourceTree = ""; }; 18906F3D1610BF3C0003C892 /* GSAvahiNetService.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GSAvahiNetService.m; sourceTree = ""; }; 18906F3E1610BF3C0003C892 /* GSAvahiNetServiceBrowser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GSAvahiNetServiceBrowser.m; sourceTree = ""; }; 18906F3F1610BF3C0003C892 /* GSAvahiRunLoopIntegration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GSAvahiRunLoopIntegration.h; path = Source/GSAvahiRunLoopIntegration.h; sourceTree = ""; }; 18906F401610BF3C0003C892 /* GSAvahiRunLoopIntegration.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GSAvahiRunLoopIntegration.m; sourceTree = ""; }; 18906F411610BF3C0003C892 /* GSBlocks.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GSBlocks.m; sourceTree = ""; }; 18906F421610BF3C0003C892 /* GSConcreteValue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GSConcreteValue.m; sourceTree = ""; }; 18906F431610BF3C0003C892 /* GSConcreteValueTemplate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GSConcreteValueTemplate.m; sourceTree = ""; }; 18906F441610BF3C0003C892 /* GSCountedSet.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GSCountedSet.m; sourceTree = ""; }; 18906F451610BF3C0003C892 /* GSDictionary.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GSDictionary.m; sourceTree = ""; }; 18906F461610BF3C0003C892 /* GSDispatch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GSDispatch.h; path = Source/GSDispatch.h; sourceTree = ""; }; 18906F471610BF3C0003C892 /* GSFFCallInvocation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GSFFCallInvocation.m; sourceTree = ""; }; 18906F481610BF3C0003C892 /* GSFFIInvocation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GSFFIInvocation.m; sourceTree = ""; }; 18906F491610BF3C0003C892 /* GSFTPURLHandle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GSFTPURLHandle.m; sourceTree = ""; }; 18906F4A1610BF3C0003C892 /* GSFastEnumeration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GSFastEnumeration.h; path = Source/GSFastEnumeration.h; sourceTree = ""; }; 18906F4B1610BF3C0003C892 /* GSFileHandle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GSFileHandle.h; path = Source/GSFileHandle.h; sourceTree = ""; }; 18906F4C1610BF3C0003C892 /* GSFileHandle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GSFileHandle.m; sourceTree = ""; }; 18906F4D1610BF3C0003C892 /* GSFormat.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GSFormat.m; sourceTree = ""; }; 18906F4E1610BF3C0003C892 /* GSHTTPAuthentication.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GSHTTPAuthentication.m; sourceTree = ""; }; 18906F4F1610BF3C0003C892 /* GSHTTPURLHandle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GSHTTPURLHandle.m; sourceTree = ""; }; 18906F501610BF3C0003C892 /* GSICUString.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GSICUString.h; path = Source/GSICUString.h; sourceTree = ""; }; 18906F511610BF3C0003C892 /* GSICUString.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GSICUString.m; sourceTree = ""; }; 18906F521610BF3C0003C892 /* GSInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GSInternal.h; path = Source/GSInternal.h; sourceTree = ""; }; 18906F531610BF3C0003C892 /* GSInvocation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GSInvocation.h; path = Source/GSInvocation.h; sourceTree = ""; }; 18906F541610BF3C0003C892 /* GSLocale.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GSLocale.m; sourceTree = ""; }; 18906F551610BF3C0003C892 /* GSMDNSNetServices.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GSMDNSNetServices.m; sourceTree = ""; }; 18906F561610BF3C0003C892 /* GSNetServices.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GSNetServices.h; path = Source/GSNetServices.h; sourceTree = ""; }; 18906F571610BF3C0003C892 /* GSNetwork.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GSNetwork.h; path = Source/GSNetwork.h; sourceTree = ""; }; 18906F581610BF3C0003C892 /* GSNumberTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GSNumberTypes.h; path = Source/GSNumberTypes.h; sourceTree = ""; }; 18906F591610BF3C0003C892 /* GSPThread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GSPThread.h; path = Source/GSPThread.h; sourceTree = ""; }; 18906F5A1610BF3C0003C892 /* GSPortPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GSPortPrivate.h; path = Source/GSPortPrivate.h; sourceTree = ""; }; 18906F5B1610BF3C0003C892 /* GSPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GSPrivate.h; path = Source/GSPrivate.h; sourceTree = ""; }; 18906F5C1610BF3C0003C892 /* GSQuickSort.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GSQuickSort.m; sourceTree = ""; }; 18906F5D1610BF3C0003C892 /* GSRunLoopCtxt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GSRunLoopCtxt.h; path = Source/GSRunLoopCtxt.h; sourceTree = ""; }; 18906F5E1610BF3C0003C892 /* GSRunLoopWatcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GSRunLoopWatcher.h; path = Source/GSRunLoopWatcher.h; sourceTree = ""; }; 18906F5F1610BF3C0003C892 /* GSRunLoopWatcher.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GSRunLoopWatcher.m; sourceTree = ""; }; 18906F601610BF3C0003C892 /* GSSet.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GSSet.m; sourceTree = ""; }; 18906F611610BF3C0003C892 /* GSShellSort.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GSShellSort.m; sourceTree = ""; }; 18906F621610BF3C0003C892 /* GSSocketStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GSSocketStream.h; path = Source/GSSocketStream.h; sourceTree = ""; }; 18906F631610BF3C0003C892 /* GSSocketStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GSSocketStream.m; sourceTree = ""; }; 18906F641610BF3C0003C892 /* GSSorting.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GSSorting.h; path = Source/GSSorting.h; sourceTree = ""; }; 18906F651610BF3C0003C892 /* GSStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GSStream.h; path = Source/GSStream.h; sourceTree = ""; }; 18906F661610BF3C0003C892 /* GSStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GSStream.m; sourceTree = ""; }; 18906F671610BF3C0003C892 /* GSString.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GSString.m; sourceTree = ""; }; 18906F681610BF3C0003C892 /* GSTLS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GSTLS.h; path = Source/GSTLS.h; sourceTree = ""; }; 18906F691610BF3C0003C892 /* GSTLS.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GSTLS.m; sourceTree = ""; }; 18906F6A1610BF3C0003C892 /* GSTimSort.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GSTimSort.m; sourceTree = ""; }; 18906F6B1610BF3C0003C892 /* GSURLPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GSURLPrivate.h; path = Source/GSURLPrivate.h; sourceTree = ""; }; 18906F6C1610BF3C0003C892 /* GSValue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GSValue.m; sourceTree = ""; }; 18906F6D1610BF3C0003C892 /* GSeq.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GSeq.h; path = Source/GSeq.h; sourceTree = ""; }; 18906F6E1610BF3C0003C892 /* Makefile.postamble */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.postamble; sourceTree = ""; }; 18906F6F1610BF3C0003C892 /* Makefile.preamble */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.preamble; sourceTree = ""; }; 18906F701610BF3C0003C892 /* NSAffineTransform.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSAffineTransform.m; sourceTree = ""; }; 18906F711610BF3C0003C892 /* NSArchiver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSArchiver.m; sourceTree = ""; }; 18906F721610BF3C0003C892 /* NSArray.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSArray.m; sourceTree = ""; }; 18906F731610BF3C0003C892 /* NSAssertionHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSAssertionHandler.m; sourceTree = ""; }; 18906F741610BF3C0003C892 /* NSAttributedString.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSAttributedString.m; sourceTree = ""; }; 18906F751610BF3C0003C892 /* NSAutoreleasePool.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSAutoreleasePool.m; sourceTree = ""; }; 18906F761610BF3C0003C892 /* NSBundle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSBundle.m; sourceTree = ""; }; 18906F771610BF3C0003C892 /* NSCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSCache.m; sourceTree = ""; }; 18906F781610BF3C0003C892 /* NSCachedURLResponse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSCachedURLResponse.m; sourceTree = ""; }; 18906F791610BF3C0003C892 /* NSCalendar.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSCalendar.m; sourceTree = ""; }; 18906F7A1610BF3C0003C892 /* NSCalendarDate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSCalendarDate.m; sourceTree = ""; }; 18906F7B1610BF3C0003C892 /* NSCallBacks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NSCallBacks.h; path = Source/NSCallBacks.h; sourceTree = ""; }; 18906F7C1610BF3C0003C892 /* NSCallBacks.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSCallBacks.m; sourceTree = ""; }; 18906F7D1610BF3C0003C892 /* NSCharacterSet.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSCharacterSet.m; sourceTree = ""; }; 18906F7E1610BF3C0003C892 /* NSCharacterSetData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NSCharacterSetData.h; path = Source/NSCharacterSetData.h; sourceTree = ""; }; 18906F7F1610BF3C0003C892 /* NSClassDescription.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSClassDescription.m; sourceTree = ""; }; 18906F801610BF3C0003C892 /* NSCoder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSCoder.m; sourceTree = ""; }; 18906F811610BF3C0003C892 /* NSConcreteHashTable.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSConcreteHashTable.m; sourceTree = ""; }; 18906F821610BF3C0003C892 /* NSConcreteMapTable.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSConcreteMapTable.m; sourceTree = ""; }; 18906F831610BF3C0003C892 /* NSConcretePointerFunctions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NSConcretePointerFunctions.h; path = Source/NSConcretePointerFunctions.h; sourceTree = ""; }; 18906F841610BF3C0003C892 /* NSConcretePointerFunctions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSConcretePointerFunctions.m; sourceTree = ""; }; 18906F851610BF3C0003C892 /* NSConnection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSConnection.m; sourceTree = ""; }; 18906F861610BF3C0003C892 /* NSCopyObject.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSCopyObject.m; sourceTree = ""; }; 18906F871610BF3C0003C892 /* NSCountedSet.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSCountedSet.m; sourceTree = ""; }; 18906F881610BF3C0003C892 /* NSData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSData.m; sourceTree = ""; }; 18906F891610BF3C0003C892 /* NSDate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSDate.m; sourceTree = ""; }; 18906F8A1610BF3C0003C892 /* NSDateFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSDateFormatter.m; sourceTree = ""; }; 18906F8B1610BF3C0003C892 /* NSDebug.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSDebug.m; sourceTree = ""; }; 18906F8C1610BF3C0003C892 /* NSDecimal.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSDecimal.m; sourceTree = ""; }; 18906F8D1610BF3C0003C892 /* NSDecimalNumber.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSDecimalNumber.m; sourceTree = ""; }; 18906F8E1610BF3C0003C892 /* NSDictionary.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSDictionary.m; sourceTree = ""; }; 18906F8F1610BF3C0003C892 /* NSDistantObject.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSDistantObject.m; sourceTree = ""; }; 18906F901610BF3C0003C892 /* NSDistributedLock.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSDistributedLock.m; sourceTree = ""; }; 18906F911610BF3C0003C892 /* NSDistributedNotificationCenter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSDistributedNotificationCenter.m; sourceTree = ""; }; 18906F921610BF3C0003C892 /* NSEnumerator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSEnumerator.m; sourceTree = ""; }; 18906F931610BF3C0003C892 /* NSError.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSError.m; sourceTree = ""; }; 18906F941610BF3C0003C892 /* NSException.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSException.m; sourceTree = ""; }; 18906F951610BF3C0003C892 /* NSFileHandle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSFileHandle.m; sourceTree = ""; }; 18906F961610BF3C0003C892 /* NSFileManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSFileManager.m; sourceTree = ""; }; 18906F971610BF3C0003C892 /* NSFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSFormatter.m; sourceTree = ""; }; 18906F981610BF3C0003C892 /* NSGarbageCollector.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSGarbageCollector.m; sourceTree = ""; }; 18906F991610BF3C0003C892 /* NSGeometry.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSGeometry.m; sourceTree = ""; }; 18906F9A1610BF3C0003C892 /* NSHTTPCookie.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSHTTPCookie.m; sourceTree = ""; }; 18906F9B1610BF3C0003C892 /* NSHTTPCookieStorage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSHTTPCookieStorage.m; sourceTree = ""; }; 18906F9C1610BF3C0003C892 /* NSHashTable.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSHashTable.m; sourceTree = ""; }; 18906F9D1610BF3C0003C892 /* NSHost.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSHost.m; sourceTree = ""; }; 18906F9E1610BF3C0003C892 /* NSIndexPath.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSIndexPath.m; sourceTree = ""; }; 18906F9F1610BF3C0003C892 /* NSIndexSet.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSIndexSet.m; sourceTree = ""; }; 18906FA11610BF3C0003C892 /* NSJSONSerialization.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSJSONSerialization.m; sourceTree = ""; }; 18906FA21610BF3C0003C892 /* NSKeyValueCoding.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSKeyValueCoding.m; sourceTree = ""; }; 18906FA31610BF3C0003C892 /* NSKeyValueMutableArray.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSKeyValueMutableArray.m; sourceTree = ""; }; 18906FA41610BF3C0003C892 /* NSKeyValueMutableSet.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSKeyValueMutableSet.m; sourceTree = ""; }; 18906FA61610BF3C0003C892 /* NSKeyedArchiver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSKeyedArchiver.m; sourceTree = ""; }; 18906FA71610BF3C0003C892 /* NSKeyedUnarchiver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSKeyedUnarchiver.m; sourceTree = ""; }; 18906FA81610BF3C0003C892 /* NSLocale.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSLocale.m; sourceTree = ""; }; 18906FA91610BF3C0003C892 /* NSLock.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSLock.m; sourceTree = ""; }; 18906FAA1610BF3C0003C892 /* NSLog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSLog.m; sourceTree = ""; }; 18906FAB1610BF3C0003C892 /* NSMapTable.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSMapTable.m; sourceTree = ""; }; 18906FAC1610BF3C0003C892 /* NSMessagePort.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSMessagePort.m; sourceTree = ""; }; 18906FAD1610BF3C0003C892 /* NSMessagePortNameServer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSMessagePortNameServer.m; sourceTree = ""; }; 18906FAE1610BF3C0003C892 /* NSMethodSignature.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSMethodSignature.m; sourceTree = ""; }; 18906FAF1610BF3C0003C892 /* NSNetServices.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSNetServices.m; sourceTree = ""; }; 18906FB01610BF3C0003C892 /* NSNotification.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSNotification.m; sourceTree = ""; }; 18906FB11610BF3C0003C892 /* NSNotificationCenter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSNotificationCenter.m; sourceTree = ""; }; 18906FB21610BF3C0003C892 /* NSNotificationQueue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSNotificationQueue.m; sourceTree = ""; }; 18906FB31610BF3C0003C892 /* NSNull.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSNull.m; sourceTree = ""; }; 18906FB41610BF3C0003C892 /* NSNumber.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSNumber.m; sourceTree = ""; }; 18906FB51610BF3C0003C892 /* NSNumberFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSNumberFormatter.m; sourceTree = ""; }; 18906FB61610BF3C0003C892 /* NSNumberMethods.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NSNumberMethods.h; path = Source/NSNumberMethods.h; sourceTree = ""; }; 18906FB71610BF3C0003C892 /* NSObjCRuntime.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSObjCRuntime.m; sourceTree = ""; }; 18906FB81610BF3C0003C892 /* NSObject+NSComparisonMethods.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSObject+NSComparisonMethods.m"; sourceTree = ""; }; 18906FB91610BF3C0003C892 /* NSObject.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSObject.m; sourceTree = ""; }; 18906FBA1610BF3C0003C892 /* NSOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSOperation.m; sourceTree = ""; }; 18906FBB1610BF3C0003C892 /* NSPage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSPage.m; sourceTree = ""; }; 18906FBC1610BF3C0003C892 /* NSPathUtilities.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSPathUtilities.m; sourceTree = ""; }; 18906FBD1610BF3C0003C892 /* NSPipe.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSPipe.m; sourceTree = ""; }; 18906FBE1610BF3C0003C892 /* NSPointerArray.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSPointerArray.m; sourceTree = ""; }; 18906FBF1610BF3C0003C892 /* NSPointerFunctions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSPointerFunctions.m; sourceTree = ""; }; 18906FC01610BF3C0003C892 /* NSPort.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSPort.m; sourceTree = ""; }; 18906FC11610BF3C0003C892 /* NSPortCoder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSPortCoder.m; sourceTree = ""; }; 18906FC21610BF3C0003C892 /* NSPortMessage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSPortMessage.m; sourceTree = ""; }; 18906FC31610BF3C0003C892 /* NSPortNameServer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSPortNameServer.m; sourceTree = ""; }; 18906FC41610BF3C0003C892 /* NSPredicate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSPredicate.m; sourceTree = ""; }; 18906FC51610BF3C0003C892 /* NSProcessInfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSProcessInfo.m; sourceTree = ""; }; 18906FC61610BF3C0003C892 /* NSPropertyList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSPropertyList.m; sourceTree = ""; }; 18906FC71610BF3C0003C892 /* NSProtocolChecker.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSProtocolChecker.m; sourceTree = ""; }; 18906FC81610BF3C0003C892 /* NSProxy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSProxy.m; sourceTree = ""; }; 18906FC91610BF3C0003C892 /* NSRange.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSRange.m; sourceTree = ""; }; 18906FCA1610BF3C0003C892 /* NSRegularExpression.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSRegularExpression.m; sourceTree = ""; }; 18906FCB1610BF3C0003C892 /* NSRunLoop.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSRunLoop.m; sourceTree = ""; }; 18906FCC1610BF3C0003C892 /* NSScanner.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSScanner.m; sourceTree = ""; }; 18906FCD1610BF3C0003C892 /* NSSerializer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSSerializer.m; sourceTree = ""; }; 18906FCE1610BF3C0003C892 /* NSSet.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSSet.m; sourceTree = ""; }; 18906FCF1610BF3C0003C892 /* NSSocketPort.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSSocketPort.m; sourceTree = ""; }; 18906FD01610BF3C0003C892 /* NSSocketPortNameServer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSSocketPortNameServer.m; sourceTree = ""; }; 18906FD11610BF3C0003C892 /* NSSortDescriptor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSSortDescriptor.m; sourceTree = ""; }; 18906FD21610BF3C0003C892 /* NSSpellServer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSSpellServer.m; sourceTree = ""; }; 18906FD31610BF3C0003C892 /* NSString.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSString.m; sourceTree = ""; }; 18906FD41610BF3C0003C892 /* NSTask.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSTask.m; sourceTree = ""; }; 18906FD51610BF3C0003C892 /* NSTextCheckingResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSTextCheckingResult.m; sourceTree = ""; }; 18906FD61610BF3C0003C892 /* NSThread.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSThread.m; sourceTree = ""; }; 18906FD71610BF3C0003C892 /* NSTimeZone.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSTimeZone.m; sourceTree = ""; }; 18906FD81610BF3C0003C892 /* NSTimer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSTimer.m; sourceTree = ""; }; 18906FD91610BF3C0003C892 /* NSURL.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSURL.m; sourceTree = ""; }; 18906FDA1610BF3C0003C892 /* NSURLAuthenticationChallenge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSURLAuthenticationChallenge.m; sourceTree = ""; }; 18906FDB1610BF3C0003C892 /* NSURLCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSURLCache.m; sourceTree = ""; }; 18906FDC1610BF3C0003C892 /* NSURLConnection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSURLConnection.m; sourceTree = ""; }; 18906FDD1610BF3C0003C892 /* NSURLCredential.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSURLCredential.m; sourceTree = ""; }; 18906FDE1610BF3C0003C892 /* NSURLCredentialStorage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSURLCredentialStorage.m; sourceTree = ""; }; 18906FDF1610BF3C0003C892 /* NSURLDownload.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSURLDownload.m; sourceTree = ""; }; 18906FE01610BF3C0003C892 /* NSURLHandle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSURLHandle.m; sourceTree = ""; }; 18906FE11610BF3C0003C892 /* NSURLProtectionSpace.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSURLProtectionSpace.m; sourceTree = ""; }; 18906FE21610BF3C0003C892 /* NSURLProtocol.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSURLProtocol.m; sourceTree = ""; }; 18906FE31610BF3C0003C892 /* NSURLRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSURLRequest.m; sourceTree = ""; }; 18906FE41610BF3C0003C892 /* NSURLResponse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSURLResponse.m; sourceTree = ""; }; 18906FE51610BF3C0003C892 /* NSUnarchiver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSUnarchiver.m; sourceTree = ""; }; 18906FE61610BF3C0003C892 /* NSUndoManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSUndoManager.m; sourceTree = ""; }; 18906FE71610BF3C0003C892 /* NSUserDefaults.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSUserDefaults.m; sourceTree = ""; }; 18906FE81610BF3C0003C892 /* NSValue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSValue.m; sourceTree = ""; }; 18906FE91610BF3C0003C892 /* NSValueTransformer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSValueTransformer.m; sourceTree = ""; }; 18906FEA1610BF3C0003C892 /* NSXMLDTD.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSXMLDTD.m; sourceTree = ""; }; 18906FEB1610BF3C0003C892 /* NSXMLDTDNode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSXMLDTDNode.m; sourceTree = ""; }; 18906FEC1610BF3C0003C892 /* NSXMLDocument.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSXMLDocument.m; sourceTree = ""; }; 18906FED1610BF3C0003C892 /* NSXMLElement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSXMLElement.m; sourceTree = ""; }; 18906FEE1610BF3C0003C892 /* NSXMLNode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSXMLNode.m; sourceTree = ""; }; 18906FEF1610BF3C0003C892 /* NSXMLParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSXMLParser.m; sourceTree = ""; }; 18906FF01610BF3C0003C892 /* NSXMLPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NSXMLPrivate.h; path = Source/NSXMLPrivate.h; sourceTree = ""; }; 18906FF11610BF3C0003C892 /* NSZone.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSZone.m; sourceTree = ""; }; 18906FFD1610BF3C0003C892 /* callframe.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = callframe.h; sourceTree = ""; }; 18906FFE1610BF3C0003C892 /* callframe.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = callframe.m; sourceTree = ""; }; 18906FFF1610BF3C0003C892 /* cifframe.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cifframe.h; sourceTree = ""; }; 189070001610BF3C0003C892 /* cifframe.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = cifframe.m; sourceTree = ""; }; 189070011610BF3C0003C892 /* common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = common.h; sourceTree = ""; }; 189070021610BF3C0003C892 /* dld-load.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "dld-load.h"; sourceTree = ""; }; 189070031610BF3C0003C892 /* externs.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = externs.m; sourceTree = ""; }; 189070041610BF3C0003C892 /* hpux-load.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "hpux-load.h"; sourceTree = ""; }; 189070051610BF3C0003C892 /* inet_ntop.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = inet_ntop.m; sourceTree = ""; }; 189070061610BF3C0003C892 /* inet_pton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = inet_pton.m; sourceTree = ""; }; 189070071610BF3C0003C892 /* libgnustep-base-entry.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "libgnustep-base-entry.m"; sourceTree = ""; }; 189070081610BF3C0003C892 /* nstzfile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = nstzfile.h; sourceTree = ""; }; 189070091610BF3C0003C892 /* null-load.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "null-load.h"; sourceTree = ""; }; 1890700A1610BF3C0003C892 /* objc-load.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "objc-load.h"; sourceTree = ""; }; 1890700B1610BF3C0003C892 /* objc-load.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "objc-load.m"; sourceTree = ""; }; 1890700C1610BF3C0003C892 /* preface.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = preface.m; sourceTree = ""; }; 1890700D1610BF3C0003C892 /* simple-load.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "simple-load.h"; sourceTree = ""; }; 1890700F1610BF3C0003C892 /* GNUmakefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = GNUmakefile; sourceTree = ""; }; 189070101610BF3C0003C892 /* GSRunLoopCtxt.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GSRunLoopCtxt.m; sourceTree = ""; }; 189070111610BF3C0003C892 /* Makefile.preamble */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.preamble; sourceTree = ""; }; 189070121610BF3C0003C892 /* NSStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSStream.m; sourceTree = ""; }; 189070141610BF3C0003C892 /* GNUmakefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = GNUmakefile; sourceTree = ""; }; 189070151610BF3C0003C892 /* GSFileHandle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GSFileHandle.m; sourceTree = ""; }; 189070161610BF3C0003C892 /* GSRunLoopCtxt.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GSRunLoopCtxt.m; sourceTree = ""; }; 189070171610BF3C0003C892 /* Makefile.preamble */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.preamble; sourceTree = ""; }; 189070181610BF3C0003C892 /* NSMessagePort.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSMessagePort.m; sourceTree = ""; }; 189070191610BF3C0003C892 /* NSMessagePortNameServer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSMessagePortNameServer.m; sourceTree = ""; }; 1890701A1610BF3C0003C892 /* NSStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSStream.m; sourceTree = ""; }; 1890701B1610BF3C0003C892 /* NSUserDefaults.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSUserDefaults.m; sourceTree = ""; }; 1890701C1610BF3C0003C892 /* win32-def.top */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "win32-def.top"; sourceTree = ""; }; 1890701D1610BF3C0003C892 /* win32-load.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "win32-load.h"; sourceTree = ""; }; 1890B34016F3BC3300187826 /* GSPrivateHash.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GSPrivateHash.m; sourceTree = ""; }; 18D882491729B64E0067E486 /* ChangeStack.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = ChangeStack.plist; sourceTree = ""; }; 18D8824A1729B64E0067E486 /* ComplexDependency.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = ComplexDependency.plist; sourceTree = ""; }; 18D8824B1729B64E0067E486 /* DependencyObservance.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = DependencyObservance.plist; sourceTree = ""; }; 18D8824C1729B64E0067E486 /* DependentNestedProperty.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = DependentNestedProperty.plist; sourceTree = ""; }; 18D8824D1729B64E0067E486 /* NestedProperty.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = NestedProperty.plist; sourceTree = ""; }; 18D8824E1729B64E0067E486 /* NestedPropertyDependency.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = NestedPropertyDependency.plist; sourceTree = ""; }; 18D8824F1729B64E0067E486 /* NestedPropertyLevels.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = NestedPropertyLevels.plist; sourceTree = ""; }; 18D882501729B64E0067E486 /* Observance.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Observance.plist; sourceTree = ""; }; 18D882511729B64E0067E486 /* ObservanceStack.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = ObservanceStack.plist; sourceTree = ""; }; 18D882521729B64E0067E486 /* StackCorruption.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = StackCorruption.plist; sourceTree = ""; }; 18D882531729B64E0067E486 /* test01.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = test01.m; sourceTree = ""; }; 18EA675F172EC6170026AC34 /* GSTypeEncoding.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = GSTypeEncoding.c; sourceTree = ""; }; 18EA6763172EC7F70026AC34 /* GSTypeEncoding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GSTypeEncoding.h; sourceTree = ""; }; 18EFCC00172AF0F0003304CA /* ItemInsertion.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = ItemInsertion.plist; sourceTree = ""; }; 18EFCC01172AF0F0003304CA /* ItemRemoval.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = ItemRemoval.plist; sourceTree = ""; }; 18EFCC02172AF0F0003304CA /* ItemReplacement.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = ItemReplacement.plist; sourceTree = ""; }; 18EFCC03172AF0F0003304CA /* NilValue.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = NilValue.plist; sourceTree = ""; }; 18EFCC04172AF0F0003304CA /* SetComplementation.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = SetComplementation.plist; sourceTree = ""; }; 18EFCC05172AF0F0003304CA /* SetIntersection.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = SetIntersection.plist; sourceTree = ""; }; 18EFCC07172AF0F0003304CA /* SetUnion.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = SetUnion.plist; sourceTree = ""; }; 18EFCC08172AF0F0003304CA /* test02.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = test02.m; sourceTree = ""; }; 18EFCC11172B01B9003304CA /* SetSettingEmpty.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = SetSettingEmpty.plist; sourceTree = ""; }; 18EFCC12172B01B9003304CA /* SetSettingNil.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = SetSettingNil.plist; sourceTree = ""; }; 18EFCC13172B01B9003304CA /* SetSettingNotEmpty.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = SetSettingNotEmpty.plist; sourceTree = ""; }; 18F8D04C17244FE900420DA5 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18F8D04D17244FE900420DA5 /* test00.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = test00.m; sourceTree = ""; }; 18FE1E12162716A200389A13 /* ChangeLog */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ChangeLog; sourceTree = SOURCE_ROOT; }; 18FE1E13162716A200389A13 /* ChangeLog.1 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.man; path = ChangeLog.1; sourceTree = SOURCE_ROOT; }; 18FE1E14162716A200389A13 /* ChangeLog.2 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ChangeLog.2; sourceTree = SOURCE_ROOT; }; 18FE1E281628550000389A13 /* GNUmakefile */ = {isa = PBXFileReference; lastKnownFileType = text; path = GNUmakefile; sourceTree = ""; }; 18FE1E2B1628550000389A13 /* NSGeometry1.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSGeometry1.m; sourceTree = ""; }; 18FE1E2C1628550000389A13 /* NSPathUtilities.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSPathUtilities.m; sourceTree = ""; }; 18FE1E2D1628550000389A13 /* NSZone.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSZone.m; sourceTree = ""; }; 18FE1E2E1628550000389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1E2F1628550000389A13 /* class_hierarchy.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = class_hierarchy.m; sourceTree = ""; }; 18FE1E301628550000389A13 /* clsCreate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = clsCreate.m; sourceTree = ""; }; 18FE1E311628550000389A13 /* properties.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = properties.m; sourceTree = ""; }; 18FE1E321628550000389A13 /* propertyAttrs.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = propertyAttrs.m; sourceTree = ""; }; 18FE1E331628550000389A13 /* runtime.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = runtime.m; sourceTree = ""; }; 18FE1E341628550000389A13 /* GNUmakefile.postamble */ = {isa = PBXFileReference; lastKnownFileType = text; path = GNUmakefile.postamble; sourceTree = ""; }; 18FE1E351628550000389A13 /* GNUmakefile.super */ = {isa = PBXFileReference; lastKnownFileType = text; path = GNUmakefile.super; sourceTree = ""; }; 18FE1E371628550000389A13 /* HTTP1.dat */ = {isa = PBXFileReference; lastKnownFileType = text; path = HTTP1.dat; sourceTree = ""; }; 18FE1E381628550000389A13 /* HTTP2.dat */ = {isa = PBXFileReference; lastKnownFileType = text; path = HTTP2.dat; sourceTree = ""; }; 18FE1E391628550000389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1E3A1628550000389A13 /* build.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = build.m; sourceTree = ""; }; 18FE1E3B1628550000389A13 /* general.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = general.m; sourceTree = ""; }; 18FE1E3C1628550000389A13 /* mime1.dat */ = {isa = PBXFileReference; lastKnownFileType = text; path = mime1.dat; sourceTree = ""; }; 18FE1E3D1628550000389A13 /* mime10.dat */ = {isa = PBXFileReference; lastKnownFileType = text; path = mime10.dat; sourceTree = ""; }; 18FE1E3E1628550000389A13 /* mime2.dat */ = {isa = PBXFileReference; lastKnownFileType = text; path = mime2.dat; sourceTree = ""; }; 18FE1E3F1628550000389A13 /* mime3.dat */ = {isa = PBXFileReference; lastKnownFileType = text; path = mime3.dat; sourceTree = ""; }; 18FE1E401628550000389A13 /* mime4.dat */ = {isa = PBXFileReference; lastKnownFileType = text; path = mime4.dat; sourceTree = ""; }; 18FE1E411628550000389A13 /* mime5.dat */ = {isa = PBXFileReference; lastKnownFileType = text; path = mime5.dat; sourceTree = ""; }; 18FE1E421628550000389A13 /* mime6.dat */ = {isa = PBXFileReference; lastKnownFileType = text; path = mime6.dat; sourceTree = ""; }; 18FE1E431628550000389A13 /* mime7.dat */ = {isa = PBXFileReference; lastKnownFileType = file; path = mime7.dat; sourceTree = ""; }; 18FE1E441628550000389A13 /* mime8.dat */ = {isa = PBXFileReference; lastKnownFileType = text; path = mime8.dat; sourceTree = ""; }; 18FE1E451628550000389A13 /* mime9.dat */ = {isa = PBXFileReference; lastKnownFileType = text; path = mime9.dat; sourceTree = ""; }; 18FE1E461628550000389A13 /* test01.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = test01.m; sourceTree = ""; }; 18FE1E471628550000389A13 /* test02.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = test02.m; sourceTree = ""; }; 18FE1E491628550000389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1E4A1628550000389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1E4C1628550000389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1E4D1628550000389A13 /* general.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = general.m; sourceTree = ""; }; 18FE1E4E1628550000389A13 /* notifications.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = notifications.m; sourceTree = ""; }; 18FE1E501628550000389A13 /* GNUmakefile */ = {isa = PBXFileReference; lastKnownFileType = text; path = GNUmakefile; sourceTree = ""; }; 18FE1E511628550000389A13 /* generic.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = generic.h; sourceTree = ""; }; 18FE1E521628550000389A13 /* generic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = generic.m; sourceTree = ""; }; 18FE1E541628550000389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1E551628550000389A13 /* array.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = array.m; sourceTree = ""; }; 18FE1E561628550000389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1E571628550000389A13 /* mutable.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = mutable.m; sourceTree = ""; }; 18FE1E581628550000389A13 /* nil.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = nil.m; sourceTree = ""; }; 18FE1E591628550000389A13 /* path.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = path.m; sourceTree = ""; }; 18FE1E5B1628550000389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1E5C1628550000389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1E5E1628550000389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1E5F1628550000389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1E601628550000389A13 /* create.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = create.m; sourceTree = ""; }; 18FE1E611628550000389A13 /* general.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = general.m; sourceTree = ""; }; 18FE1E631628550000389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1E641628550000389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1E651628550000389A13 /* blocks.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = blocks.m; sourceTree = ""; }; 18FE1E661628550000389A13 /* create.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = create.m; sourceTree = ""; }; 18FE1E671628550000389A13 /* general.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = general.m; sourceTree = ""; }; 18FE1E681628550000389A13 /* random.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = random.plist; sourceTree = ""; }; 18FE1E691628550000389A13 /* sorted.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = sorted.plist; sourceTree = ""; }; 18FE1E6A1628550000389A13 /* test.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = test.plist; sourceTree = ""; }; 18FE1E6C1628550000389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1E6D1628550000389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1E6E1628550000389A13 /* test00.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = test00.m; sourceTree = ""; }; 18FE1E701628550000389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1E711628550000389A13 /* autorelease_eh.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = autorelease_eh.m; sourceTree = ""; }; 18FE1E721628550000389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1E741628550000389A13 /* blockassign.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = blockassign.m; sourceTree = ""; }; 18FE1E761628550000389A13 /* GNUmakefile.preamble */ = {isa = PBXFileReference; lastKnownFileType = text; path = GNUmakefile.preamble; sourceTree = ""; }; 18FE1E791628550000389A13 /* English */ = {isa = PBXFileReference; lastKnownFileType = text; name = English; path = English.lproj/TextRes.txt; sourceTree = ""; }; 18FE1E7A1628550000389A13 /* French */ = {isa = PBXFileReference; lastKnownFileType = text; name = French; path = French.lproj/TextRes.txt; sourceTree = ""; }; 18FE1E7B1628550000389A13 /* GNUmakefile */ = {isa = PBXFileReference; lastKnownFileType = text; path = GNUmakefile; sourceTree = ""; }; 18FE1E7C1628550000389A13 /* NonLocalRes.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = NonLocalRes.txt; sourceTree = ""; }; 18FE1E7D1628550000389A13 /* TestBundle.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TestBundle.m; sourceTree = ""; }; 18FE1E7E1628550000389A13 /* TestBundleInfo.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = TestBundleInfo.plist; sourceTree = ""; }; 18FE1E7F1628550000389A13 /* de */ = {isa = PBXFileReference; lastKnownFileType = text; name = de; path = de.lproj/TextRes.txt; sourceTree = ""; }; 18FE1E801628550000389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1E811628550000389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1E821628550000389A13 /* create.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = create.m; sourceTree = ""; }; 18FE1E831628550000389A13 /* general.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = general.m; sourceTree = ""; }; 18FE1E851628550000389A13 /* GNUmakefile.preamble */ = {isa = PBXFileReference; lastKnownFileType = text; path = GNUmakefile.preamble; sourceTree = ""; }; 18FE1E861628550000389A13 /* load.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = load.m; sourceTree = ""; }; 18FE1E871628550000389A13 /* resources.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = resources.m; sourceTree = ""; }; 18FE1E881628550000389A13 /* resources2.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = resources2.m; sourceTree = ""; }; 18FE1E8A1628550000389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1E8B1628550000389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1E8C1628550000389A13 /* create.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = create.m; sourceTree = ""; }; 18FE1E8E1628550000389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1E8F1628550000389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1E901628550000389A13 /* test00.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = test00.m; sourceTree = ""; }; 18FE1E911628550000389A13 /* test01.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = test01.m; sourceTree = ""; }; 18FE1E921628550000389A13 /* test02.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = test02.m; sourceTree = ""; }; 18FE1E931628550000389A13 /* western.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = western.h; sourceTree = ""; }; 18FE1E951628550000389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1E961628550000389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1E971628550000389A13 /* class.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = class.m; sourceTree = ""; }; 18FE1E981628550000389A13 /* general.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = general.m; sourceTree = ""; }; 18FE1E991628550000389A13 /* illegalCharacterSet.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = illegalCharacterSet.m; sourceTree = ""; }; 18FE1E9B1628550000389A13 /* GNUmakefile.preamble */ = {isa = PBXFileReference; lastKnownFileType = text; path = GNUmakefile.preamble; sourceTree = ""; }; 18FE1E9D1628550000389A13 /* Connection.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Connection.m; sourceTree = ""; }; 18FE1E9E1628550000389A13 /* GNUmakefile */ = {isa = PBXFileReference; lastKnownFileType = text; path = GNUmakefile; sourceTree = ""; }; 18FE1E9F1628550000389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1EA01628550000389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1EA11628550000389A13 /* connection.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = connection.m; sourceTree = ""; }; 18FE1EA31628550000389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1EA41628550000389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1EA61628550000389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1EA71628550000389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1EA81628550000389A13 /* general.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = general.m; sourceTree = ""; }; 18FE1EAA1628550000389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1EAB1628550000389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1EAC1628550000389A13 /* create.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = create.m; sourceTree = ""; }; 18FE1EAD1628550000389A13 /* general.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = general.m; sourceTree = ""; }; 18FE1EAF1628550000389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1EB01628550000389A13 /* general.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = general.m; sourceTree = ""; }; 18FE1EB21628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1EB31628550100389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1EB41628550100389A13 /* blocks.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = blocks.m; sourceTree = ""; }; 18FE1EB51628550100389A13 /* create.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = create.m; sourceTree = ""; }; 18FE1EB61628550100389A13 /* general.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = general.m; sourceTree = ""; }; 18FE1EB81628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1EB91628550100389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1EBA1628550100389A13 /* basic.m.abort */ = {isa = PBXFileReference; lastKnownFileType = text; path = basic.m.abort; sourceTree = ""; }; 18FE1EBB1628550100389A13 /* mixedException.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = mixedException.mm; sourceTree = ""; }; 18FE1EBC1628550100389A13 /* sillySemantics.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = sillySemantics.mm; sourceTree = ""; }; 18FE1EBD1628550100389A13 /* skipCatchall.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = skipCatchall.mm; sourceTree = ""; }; 18FE1EBE1628550100389A13 /* throwstr.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = throwstr.m; sourceTree = ""; }; 18FE1EC01628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1EC11628550100389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1EC21628550100389A13 /* general.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = general.m; sourceTree = ""; }; 18FE1EC31628550100389A13 /* socket.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = socket.m; sourceTree = ""; }; 18FE1EC61628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1EC71628550100389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1EC81628550100389A13 /* general.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = general.m; sourceTree = ""; }; 18FE1EC91628550100389A13 /* unrepresentable_filenames.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = unrepresentable_filenames.m; sourceTree = ""; }; 18FE1ECB1628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1ECC1628550100389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1ECE1628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1ECF1628550100389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1ED01628550100389A13 /* create.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = create.m; sourceTree = ""; }; 18FE1ED11628550100389A13 /* general.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = general.m; sourceTree = ""; }; 18FE1ED31628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1ED41628550100389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1ED51628550100389A13 /* create.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = create.m; sourceTree = ""; }; 18FE1ED71628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1ED81628550100389A13 /* general.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = general.m; sourceTree = ""; }; 18FE1EDA1628550100389A13 /* GNUmakefile.preamble */ = {isa = PBXFileReference; lastKnownFileType = text; path = GNUmakefile.preamble; sourceTree = ""; }; 18FE1EDB1628550100389A13 /* InvokeProxyProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = InvokeProxyProtocol.h; sourceTree = ""; }; 18FE1EDD1628550100389A13 /* GNUmakefile */ = {isa = PBXFileReference; lastKnownFileType = text; path = GNUmakefile; sourceTree = ""; }; 18FE1EDE1628550100389A13 /* InvokeProxy.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = InvokeProxy.h; sourceTree = ""; }; 18FE1EDF1628550100389A13 /* InvokeProxy.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = InvokeProxy.m; sourceTree = ""; }; 18FE1EE01628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1EE11628550100389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1EE21628550100389A13 /* general.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = general.m; sourceTree = ""; }; 18FE1EE31628550100389A13 /* test01.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = test01.m; sourceTree = ""; }; 18FE1EE51628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1EE61628550100389A13 /* json.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = json.m; sourceTree = ""; }; 18FE1EE81628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1EE91628550100389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1EEA1628550100389A13 /* create.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = create.m; sourceTree = ""; }; 18FE1EEB1628550100389A13 /* general.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = general.m; sourceTree = ""; }; 18FE1EED1628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1EEE1628550100389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1EEF1628550100389A13 /* create.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = create.m; sourceTree = ""; }; 18FE1EF01628550100389A13 /* general.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = general.m; sourceTree = ""; }; 18FE1EF21628550100389A13 /* GNUmakefile.preamble */ = {isa = PBXFileReference; lastKnownFileType = text; path = GNUmakefile.preamble; sourceTree = ""; }; 18FE1EF41628550100389A13 /* GNUmakefile */ = {isa = PBXFileReference; lastKnownFileType = text; path = GNUmakefile; sourceTree = ""; }; 18FE1EF51628550100389A13 /* doubleNSConditionLock.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = doubleNSConditionLock.m; sourceTree = ""; }; 18FE1EF61628550100389A13 /* doubleNSLock.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = doubleNSLock.m; sourceTree = ""; }; 18FE1EF71628550100389A13 /* RecursiveLock.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RecursiveLock.m; sourceTree = ""; }; 18FE1EF81628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1EF91628550100389A13 /* condlock.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = condlock.m; sourceTree = ""; }; 18FE1EFA1628550100389A13 /* doubleLocking.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = doubleLocking.m; sourceTree = ""; }; 18FE1EFB1628550100389A13 /* tryLock.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = tryLock.m; sourceTree = ""; }; 18FE1EFD1628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1EFE1628550100389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1EFF1628550100389A13 /* create.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = create.m; sourceTree = ""; }; 18FE1F001628550100389A13 /* general.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = general.m; sourceTree = ""; }; 18FE1F021628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1F031628550100389A13 /* general.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = general.m; sourceTree = ""; }; 18FE1F051628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1F061628550100389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1F071628550100389A13 /* create.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = create.m; sourceTree = ""; }; 18FE1F081628550100389A13 /* general.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = general.m; sourceTree = ""; }; 18FE1F0A1628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1F0B1628550100389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1F0C1628550100389A13 /* test00.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = test00.m; sourceTree = ""; }; 18FE1F0D1628550100389A13 /* test01.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = test01.m; sourceTree = ""; }; 18FE1F0F1628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1F101628550100389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1F111628550100389A13 /* test00.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = test00.m; sourceTree = ""; }; 18FE1F131628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1F141628550100389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1F151628550100389A13 /* general.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = general.m; sourceTree = ""; }; 18FE1F171628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1F181628550100389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1F191628550100389A13 /* general.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = general.m; sourceTree = ""; }; 18FE1F1B1628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1F1C1628550100389A13 /* blocks.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = blocks.m; sourceTree = ""; }; 18FE1F1D1628550100389A13 /* test0.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = test0.m; sourceTree = ""; }; 18FE1F1E1628550100389A13 /* test1.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = test1.m; sourceTree = ""; }; 18FE1F201628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1F211628550100389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1F231628550100389A13 /* GNUmakefile.preamble */ = {isa = PBXFileReference; lastKnownFileType = text; path = GNUmakefile.preamble; sourceTree = ""; }; 18FE1F241628550100389A13 /* NSMutableString_string.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSMutableString_string.m; sourceTree = ""; }; 18FE1F251628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1F261628550100389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1F281628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1F291628550100389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1F2A1628550100389A13 /* test00.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = test00.m; sourceTree = ""; }; 18FE1F2B1628550100389A13 /* test01.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = test01.m; sourceTree = ""; }; 18FE1F2D1628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1F2E1628550100389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1F2F1628550100389A13 /* basic10_4.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic10_4.m; sourceTree = ""; }; 18FE1F311628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1F321628550100389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1F331628550100389A13 /* initialize.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = initialize.m; sourceTree = ""; }; 18FE1F341628550100389A13 /* objc++.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = "objc++.mm"; sourceTree = ""; }; 18FE1F351628550100389A13 /* test00.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = test00.m; sourceTree = ""; }; 18FE1F361628550100389A13 /* test01.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = test01.m; sourceTree = ""; }; 18FE1F371628550100389A13 /* test02.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = test02.m; sourceTree = ""; }; 18FE1F391628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1F3A1628550100389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1F3B1628550100389A13 /* concurrent.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = concurrent.m; sourceTree = ""; }; 18FE1F3C1628550100389A13 /* threads.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = threads.m; sourceTree = ""; }; 18FE1F3E1628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1F3F1628550100389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1F411628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1F421628550100389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1F431628550100389A13 /* create.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = create.m; sourceTree = ""; }; 18FE1F441628550100389A13 /* general.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = general.m; sourceTree = ""; }; 18FE1F461628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1F471628550100389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1F491628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1F4A1628550100389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1F4B1628550100389A13 /* general.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = general.m; sourceTree = ""; }; 18FE1F4D1628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1F4E1628550100389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1F4F1628550100389A13 /* test00.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = test00.m; sourceTree = ""; }; 18FE1F501628550100389A13 /* test01.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = test01.m; sourceTree = ""; }; 18FE1F521628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1F531628550100389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1F541628550100389A13 /* general.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = general.m; sourceTree = ""; }; 18FE1F551628550100389A13 /* performers.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = performers.m; sourceTree = ""; }; 18FE1F561628550100389A13 /* thread.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = thread.m; sourceTree = ""; }; 18FE1F581628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1F591628550100389A13 /* test00.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = test00.m; sourceTree = ""; }; 18FE1F5A1628550100389A13 /* test01.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = test01.m; sourceTree = ""; }; 18FE1F5C1628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1F5D1628550100389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1F5F1628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1F601628550100389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1F621628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1F631628550100389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1F641628550100389A13 /* memandfile.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = memandfile.m; sourceTree = ""; }; 18FE1F651628550100389A13 /* memandfile_2.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = memandfile_2.m; sourceTree = ""; }; 18FE1F661628550100389A13 /* pipe.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = pipe.m; sourceTree = ""; }; 18FE1F671628550100389A13 /* socket.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = socket.m; sourceTree = ""; }; 18FE1F681628550100389A13 /* socket_cs.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = socket_cs.m; sourceTree = ""; }; 18FE1F6A1628550100389A13 /* NSString_base.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSString_base.m; sourceTree = ""; }; 18FE1F6B1628550100389A13 /* NSString_custom.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSString_custom.m; sourceTree = ""; }; 18FE1F6C1628550100389A13 /* NSString_tests.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NSString_tests.h; sourceTree = ""; }; 18FE1F6D1628550100389A13 /* NSString_zero_hash.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSString_zero_hash.m; sourceTree = ""; }; 18FE1F6E1628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1F6F1628550100389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1F701628550100389A13 /* bom.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = bom.m; sourceTree = ""; }; 18FE1F711628550100389A13 /* boolValue.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = boolValue.m; sourceTree = ""; }; 18FE1F721628550100389A13 /* locale.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = locale.m; sourceTree = ""; }; 18FE1F731628550100389A13 /* nuls_in_strings.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = nuls_in_strings.m; sourceTree = ""; }; 18FE1F741628550100389A13 /* order.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = order.m; sourceTree = ""; }; 18FE1F751628550100389A13 /* regex.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = regex.m; sourceTree = ""; }; 18FE1F761628550100389A13 /* test00.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = test00.m; sourceTree = ""; }; 18FE1F771628550100389A13 /* test01.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = test01.m; sourceTree = ""; }; 18FE1F781628550100389A13 /* test02.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = test02.m; sourceTree = ""; }; 18FE1F791628550100389A13 /* test03.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = test03.m; sourceTree = ""; }; 18FE1F7A1628550100389A13 /* test04.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = test04.m; sourceTree = ""; }; 18FE1F7B1628550100389A13 /* test05.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = test05.m; sourceTree = ""; }; 18FE1F7C1628550100389A13 /* test06.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = test06.m; sourceTree = ""; }; 18FE1F7D1628550100389A13 /* test07.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = test07.m; sourceTree = ""; }; 18FE1F7E1628550100389A13 /* utf8bom.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = utf8bom.txt; sourceTree = ""; }; 18FE1F801628550100389A13 /* GNUmakefile.preamble */ = {isa = PBXFileReference; lastKnownFileType = text; path = GNUmakefile.preamble; sourceTree = ""; }; 18FE1F821628550100389A13 /* GNUmakefile */ = {isa = PBXFileReference; lastKnownFileType = text; path = GNUmakefile; sourceTree = ""; }; 18FE1F831628550100389A13 /* NSZombie.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSZombie.m; sourceTree = ""; }; 18FE1F841628550100389A13 /* processgroup.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = processgroup.m; sourceTree = ""; }; 18FE1F851628550100389A13 /* testcat.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = testcat.m; sourceTree = ""; }; 18FE1F861628550100389A13 /* testecho.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = testecho.m; sourceTree = ""; }; 18FE1F871628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1F881628550100389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1F891628550100389A13 /* general.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = general.m; sourceTree = ""; }; 18FE1F8A1628550100389A13 /* launch.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = launch.m; sourceTree = ""; }; 18FE1F8B1628550100389A13 /* zombie.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = zombie.m; sourceTree = ""; }; 18FE1F8D1628550100389A13 /* lazy_thread.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = lazy_thread.m; sourceTree = ""; }; 18FE1F8F1628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1F901628550100389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1F911628550100389A13 /* create.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = create.m; sourceTree = ""; }; 18FE1F921628550100389A13 /* use.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = use.m; sourceTree = ""; }; 18FE1F941628550100389A13 /* Chunked.dat */ = {isa = PBXFileReference; lastKnownFileType = text; path = Chunked.dat; sourceTree = ""; }; 18FE1F951628550100389A13 /* GNUmakefile.preamble */ = {isa = PBXFileReference; lastKnownFileType = text; path = GNUmakefile.preamble; sourceTree = ""; }; 18FE1F971628550100389A13 /* GNUmakefile */ = {isa = PBXFileReference; lastKnownFileType = text; path = GNUmakefile; sourceTree = ""; }; 18FE1F981628550100389A13 /* capture.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = capture.m; sourceTree = ""; }; 18FE1F991628550100389A13 /* keepalive.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = keepalive.m; sourceTree = ""; }; 18FE1F9A1628550100389A13 /* respond.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = respond.m; sourceTree = ""; }; 18FE1F9B1628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1F9C1628550100389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1F9D1628550100389A13 /* test00.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = test00.m; sourceTree = ""; }; 18FE1F9E1628550100389A13 /* test01.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = test01.m; sourceTree = ""; }; 18FE1FA01628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1FA11628550100389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1FA31628550100389A13 /* GNUmakefile.preamble */ = {isa = PBXFileReference; lastKnownFileType = text; path = GNUmakefile.preamble; sourceTree = ""; }; 18FE1FA51628550100389A13 /* GNUmakefile */ = {isa = PBXFileReference; lastKnownFileType = text; path = GNUmakefile; sourceTree = ""; }; 18FE1FA61628550100389A13 /* StatusServer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = StatusServer.m; sourceTree = ""; }; 18FE1FA71628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1FA81628550100389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1FA91628550100389A13 /* test00.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = test00.m; sourceTree = ""; }; 18FE1FAA1628550100389A13 /* test01.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = test01.m; sourceTree = ""; }; 18FE1FAC1628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1FAD1628550100389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1FAF1628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1FB01628550100389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1FB21628550100389A13 /* NSUndoManager_basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSUndoManager_basic.m; sourceTree = ""; }; 18FE1FB31628550100389A13 /* NSUndoManager_notifications.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSUndoManager_notifications.m; sourceTree = ""; }; 18FE1FB41628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1FB61628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1FB71628550100389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1FB81628550100389A13 /* general.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = general.m; sourceTree = ""; }; 18FE1FBA1628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1FBB1628550100389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1FBC1628550100389A13 /* cdata.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = cdata.m; sourceTree = ""; }; 18FE1FBE1628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1FBF1628550100389A13 /* attributes.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = attributes.m; sourceTree = ""; }; 18FE1FC01628550100389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1FC11628550100389A13 /* children.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = children.m; sourceTree = ""; }; 18FE1FC21628550100389A13 /* transfer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = transfer.m; sourceTree = ""; }; 18FE1FC41628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1FC51628550100389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1FC61628550100389A13 /* children.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = children.m; sourceTree = ""; }; 18FE1FC71628550100389A13 /* description.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = description.m; sourceTree = ""; }; 18FE1FC81628550100389A13 /* kinds.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = kinds.m; sourceTree = ""; }; 18FE1FC91628550100389A13 /* namespaces.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = namespaces.m; sourceTree = ""; }; 18FE1FCC1628550100389A13 /* internal-document.result */ = {isa = PBXFileReference; lastKnownFileType = text; path = "internal-document.result"; sourceTree = ""; }; 18FE1FCD1628550100389A13 /* internal-document.xml */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = "internal-document.xml"; sourceTree = ""; }; 18FE1FCE1628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1FCF1628550100389A13 /* basic.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basic.m; sourceTree = ""; }; 18FE1FD01628550100389A13 /* parse.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = parse.m; sourceTree = ""; }; 18FE1FD21628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1FD31628550100389A13 /* non_ascii.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = non_ascii.m; sourceTree = ""; }; 18FE1FD41628550100389A13 /* non_ascii_utf16.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = non_ascii_utf16.plist; sourceTree = ""; }; 18FE1FD51628550100389A13 /* non_ascii_utf16.strings */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; path = non_ascii_utf16.strings; sourceTree = ""; }; 18FE1FD61628550100389A13 /* non_ascii_utf8.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = non_ascii_utf8.plist; sourceTree = ""; }; 18FE1FD71628550100389A13 /* non_ascii_utf8.strings */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; path = non_ascii_utf8.strings; sourceTree = ""; }; 18FE1FD81628550100389A13 /* test00.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = test00.m; sourceTree = ""; }; 18FE1FD91628550100389A13 /* test01.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = test01.m; sourceTree = ""; }; 18FE1FDA1628550100389A13 /* xml.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = xml.m; sourceTree = ""; }; 18FE1FDB1628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1FDD1628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1FDE1628550100389A13 /* test00.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = test00.m; sourceTree = ""; }; 18FE1FF21628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE1FF31628550100389A13 /* basictypes.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = basictypes.m; sourceTree = ""; }; 18FE1FF41628550100389A13 /* decoding.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = decoding.m; sourceTree = ""; }; 18FE1FF51628550100389A13 /* double-8.type */ = {isa = PBXFileReference; lastKnownFileType = file; path = "double-8.type"; sourceTree = ""; }; 18FE1FF61628550100389A13 /* float-4.type */ = {isa = PBXFileReference; lastKnownFileType = file; path = "float-4.type"; sourceTree = ""; }; 18FE1FF71628550100389A13 /* int-4.type */ = {isa = PBXFileReference; lastKnownFileType = file; path = "int-4.type"; sourceTree = ""; }; 18FE1FF81628550100389A13 /* llong-8.type */ = {isa = PBXFileReference; lastKnownFileType = file; path = "llong-8.type"; sourceTree = ""; }; 18FE1FF91628550100389A13 /* long-4.type */ = {isa = PBXFileReference; lastKnownFileType = file; path = "long-4.type"; sourceTree = ""; }; 18FE1FFA1628550100389A13 /* schar-1.type */ = {isa = PBXFileReference; lastKnownFileType = file; path = "schar-1.type"; sourceTree = ""; }; 18FE1FFB1628550100389A13 /* short-2.type */ = {isa = PBXFileReference; lastKnownFileType = file; path = "short-2.type"; sourceTree = ""; }; 18FE1FFC1628550100389A13 /* uchar-1.type */ = {isa = PBXFileReference; lastKnownFileType = file; path = "uchar-1.type"; sourceTree = ""; }; 18FE1FFD1628550100389A13 /* uint-4.type */ = {isa = PBXFileReference; lastKnownFileType = file; path = "uint-4.type"; sourceTree = ""; }; 18FE1FFE1628550100389A13 /* ullong-8.type */ = {isa = PBXFileReference; lastKnownFileType = file; path = "ullong-8.type"; sourceTree = ""; }; 18FE1FFF1628550100389A13 /* ulong-4.type */ = {isa = PBXFileReference; lastKnownFileType = file; path = "ulong-4.type"; sourceTree = ""; }; 18FE20001628550100389A13 /* ushort-2.type */ = {isa = PBXFileReference; lastKnownFileType = file; path = "ushort-2.type"; sourceTree = ""; }; 18FE20021628550100389A13 /* GSLock.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GSLock.m; sourceTree = ""; }; 18FE20031628550100389A13 /* GSMime.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GSMime.m; sourceTree = ""; }; 18FE20041628550100389A13 /* GSObjCRuntime.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GSObjCRuntime.m; sourceTree = ""; }; 18FE20051628550100389A13 /* GSXML.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GSXML.m; sourceTree = ""; }; 18FE20061628550100389A13 /* NSArchiver.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSArchiver.m; sourceTree = ""; }; 18FE20071628550100389A13 /* NSArray.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSArray.m; sourceTree = ""; }; 18FE20081628550100389A13 /* NSAttributedString.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSAttributedString.m; sourceTree = ""; }; 18FE20091628550100389A13 /* NSAutoreleasePool.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSAutoreleasePool.m; sourceTree = ""; }; 18FE200A1628550100389A13 /* NSBundle.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSBundle.m; sourceTree = ""; }; 18FE200B1628550100389A13 /* NSByteOrder.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSByteOrder.m; sourceTree = ""; }; 18FE200C1628550100389A13 /* NSCalendarDate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSCalendarDate.m; sourceTree = ""; }; 18FE200D1628550100389A13 /* NSCharacterSet.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSCharacterSet.m; sourceTree = ""; }; 18FE200E1628550100389A13 /* NSClassDescription.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSClassDescription.m; sourceTree = ""; }; 18FE200F1628550100389A13 /* NSCoder.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSCoder.m; sourceTree = ""; }; 18FE20101628550100389A13 /* NSComparisonPredicate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSComparisonPredicate.m; sourceTree = ""; }; 18FE20111628550100389A13 /* NSCompoundPredicate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSCompoundPredicate.m; sourceTree = ""; }; 18FE20121628550100389A13 /* NSConnection.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSConnection.m; sourceTree = ""; }; 18FE20131628550100389A13 /* NSData.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSData.m; sourceTree = ""; }; 18FE20141628550100389A13 /* NSDate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSDate.m; sourceTree = ""; }; 18FE20151628550100389A13 /* NSDateFormatter.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSDateFormatter.m; sourceTree = ""; }; 18FE20161628550100389A13 /* NSDebug.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSDebug.m; sourceTree = ""; }; 18FE20171628550100389A13 /* NSDecimal.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSDecimal.m; sourceTree = ""; }; 18FE20181628550100389A13 /* NSDecimalNumber.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSDecimalNumber.m; sourceTree = ""; }; 18FE20191628550100389A13 /* NSDictionary.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSDictionary.m; sourceTree = ""; }; 18FE201A1628550100389A13 /* NSDistantObject.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSDistantObject.m; sourceTree = ""; }; 18FE201B1628550100389A13 /* NSDistributedLock.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSDistributedLock.m; sourceTree = ""; }; 18FE201C1628550100389A13 /* NSDistributedNotificationCenter.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSDistributedNotificationCenter.m; sourceTree = ""; }; 18FE201D1628550100389A13 /* NSEnumerator.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSEnumerator.m; sourceTree = ""; }; 18FE201E1628550100389A13 /* NSError.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSError.m; sourceTree = ""; }; 18FE201F1628550100389A13 /* NSException.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSException.m; sourceTree = ""; }; 18FE20201628550100389A13 /* NSExpression.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSExpression.m; sourceTree = ""; }; 18FE20211628550100389A13 /* NSFileHandle.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSFileHandle.m; sourceTree = ""; }; 18FE20221628550100389A13 /* NSFileManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSFileManager.m; sourceTree = ""; }; 18FE20231628550100389A13 /* NSFormatter.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSFormatter.m; sourceTree = ""; }; 18FE20241628550100389A13 /* NSGeometry.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSGeometry.m; sourceTree = ""; }; 18FE20251628550100389A13 /* NSHTTPCookie.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSHTTPCookie.m; sourceTree = ""; }; 18FE20261628550100389A13 /* NSHTTPCookieStorage.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSHTTPCookieStorage.m; sourceTree = ""; }; 18FE20271628550100389A13 /* NSHashTable.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSHashTable.m; sourceTree = ""; }; 18FE20281628550100389A13 /* NSHost.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSHost.m; sourceTree = ""; }; 18FE20291628550100389A13 /* NSIndexPath.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSIndexPath.m; sourceTree = ""; }; 18FE202A1628550100389A13 /* NSIndexSet.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSIndexSet.m; sourceTree = ""; }; 18FE202B1628550100389A13 /* NSInvocation.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSInvocation.m; sourceTree = ""; }; 18FE202C1628550100389A13 /* NSKeyValueCoding.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSKeyValueCoding.m; sourceTree = ""; }; 18FE202D1628550100389A13 /* NSKeyValueObserving.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSKeyValueObserving.m; sourceTree = ""; }; 18FE202E1628550100389A13 /* NSKeyedArchiver.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSKeyedArchiver.m; sourceTree = ""; }; 18FE202F1628550100389A13 /* NSLock.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSLock.m; sourceTree = ""; }; 18FE20301628550100389A13 /* NSMapTable.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSMapTable.m; sourceTree = ""; }; 18FE20311628550100389A13 /* NSMethodSignature.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSMethodSignature.m; sourceTree = ""; }; 18FE20321628550100389A13 /* NSNotification.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSNotification.m; sourceTree = ""; }; 18FE20331628550100389A13 /* NSNotificationQueue.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSNotificationQueue.m; sourceTree = ""; }; 18FE20341628550100389A13 /* NSNull.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSNull.m; sourceTree = ""; }; 18FE20351628550100389A13 /* NSNumberFormatter.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSNumberFormatter.m; sourceTree = ""; }; 18FE20361628550100389A13 /* NSObjCRuntime.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSObjCRuntime.m; sourceTree = ""; }; 18FE20371628550100389A13 /* NSObject.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSObject.m; sourceTree = ""; }; 18FE20381628550100389A13 /* NSPathUtilities.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSPathUtilities.m; sourceTree = ""; }; 18FE20391628550100389A13 /* NSPort.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSPort.m; sourceTree = ""; }; 18FE203A1628550100389A13 /* NSPortCoder.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSPortCoder.m; sourceTree = ""; }; 18FE203B1628550100389A13 /* NSPortMessage.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSPortMessage.m; sourceTree = ""; }; 18FE203C1628550100389A13 /* NSPortNameServer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSPortNameServer.m; sourceTree = ""; }; 18FE203D1628550100389A13 /* NSPredicate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSPredicate.m; sourceTree = ""; }; 18FE203E1628550100389A13 /* NSProcessInfo.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSProcessInfo.m; sourceTree = ""; }; 18FE203F1628550100389A13 /* NSPropertyList.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSPropertyList.m; sourceTree = ""; }; 18FE20401628550100389A13 /* NSProtocolChecker.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSProtocolChecker.m; sourceTree = ""; }; 18FE20411628550100389A13 /* NSProxy.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSProxy.m; sourceTree = ""; }; 18FE20421628550100389A13 /* NSRange.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSRange.m; sourceTree = ""; }; 18FE20431628550100389A13 /* NSRunLoop.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSRunLoop.m; sourceTree = ""; }; 18FE20441628550100389A13 /* NSScanner.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSScanner.m; sourceTree = ""; }; 18FE20451628550100389A13 /* NSSerialization.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSSerialization.m; sourceTree = ""; }; 18FE20461628550100389A13 /* NSSet.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSSet.m; sourceTree = ""; }; 18FE20471628550100389A13 /* NSSortDescriptor.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSSortDescriptor.m; sourceTree = ""; }; 18FE20481628550100389A13 /* NSStream.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSStream.m; sourceTree = ""; }; 18FE20491628550100389A13 /* NSString.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSString.m; sourceTree = ""; }; 18FE204A1628550100389A13 /* NSTask.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSTask.m; sourceTree = ""; }; 18FE204B1628550100389A13 /* NSThread.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSThread.m; sourceTree = ""; }; 18FE204C1628550100389A13 /* NSTimeZone.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSTimeZone.m; sourceTree = ""; }; 18FE204D1628550100389A13 /* NSTimer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSTimer.m; sourceTree = ""; }; 18FE204E1628550100389A13 /* NSURL.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSURL.m; sourceTree = ""; }; 18FE204F1628550100389A13 /* NSURLAuthenticationChallenge.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSURLAuthenticationChallenge.m; sourceTree = ""; }; 18FE20501628550100389A13 /* NSURLCache.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSURLCache.m; sourceTree = ""; }; 18FE20511628550100389A13 /* NSURLConnection.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSURLConnection.m; sourceTree = ""; }; 18FE20521628550100389A13 /* NSURLCredential.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSURLCredential.m; sourceTree = ""; }; 18FE20531628550100389A13 /* NSURLCredentialStorage.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSURLCredentialStorage.m; sourceTree = ""; }; 18FE20541628550100389A13 /* NSURLDownload.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSURLDownload.m; sourceTree = ""; }; 18FE20551628550100389A13 /* NSURLError.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSURLError.m; sourceTree = ""; }; 18FE20561628550100389A13 /* NSURLHandle.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSURLHandle.m; sourceTree = ""; }; 18FE20571628550100389A13 /* NSURLProtectionSpace.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSURLProtectionSpace.m; sourceTree = ""; }; 18FE20581628550100389A13 /* NSURLProtocol.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSURLProtocol.m; sourceTree = ""; }; 18FE20591628550100389A13 /* NSURLRequest.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSURLRequest.m; sourceTree = ""; }; 18FE205A1628550100389A13 /* NSURLResponse.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSURLResponse.m; sourceTree = ""; }; 18FE205B1628550100389A13 /* NSUndoManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSUndoManager.m; sourceTree = ""; }; 18FE205C1628550100389A13 /* NSUserDefaults.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSUserDefaults.m; sourceTree = ""; }; 18FE205D1628550100389A13 /* NSValue.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSValue.m; sourceTree = ""; }; 18FE205E1628550100389A13 /* NSXMLParser.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSXMLParser.m; sourceTree = ""; }; 18FE205F1628550100389A13 /* NSZone.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSZone.m; sourceTree = ""; }; 18FE20601628550100389A13 /* ObjCXX.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = ObjCXX.mm; sourceTree = ""; }; 18FE20611628550100389A13 /* TestInfo */ = {isa = PBXFileReference; lastKnownFileType = text; path = TestInfo; sourceTree = ""; }; 18FE20621628550100389A13 /* Unicode.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Unicode.m; sourceTree = ""; }; AD197BFF189A4D5F000F6CF9 /* NSInvocation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSInvocation.m; sourceTree = ""; }; AD197C00189A4D5F000F6CF9 /* NSInvocationOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSInvocationOperation.m; sourceTree = ""; }; AD197C01189A4D5F000F6CF9 /* NSKeyValueObserving.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NSKeyValueObserving.m; path = Source/NSKeyValueObserving.m; sourceTree = ""; }; AD197C02189A4D5F000F6CF9 /* NSMetadata.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSMetadata.m; sourceTree = ""; }; AD197C03189A4D5F000F6CF9 /* NSUserNotification.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSUserNotification.m; sourceTree = ""; }; AD197C04189A4D5F000F6CF9 /* NSUUID.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSUUID.m; sourceTree = ""; }; AD197C0B189A4E98000F6CF9 /* MISSING */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = MISSING; path = Headers/Foundation/MISSING; sourceTree = ""; }; AD197C0C189A4E98000F6CF9 /* NSInvocationOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSInvocationOperation.h; sourceTree = ""; }; AD197C0D189A4E98000F6CF9 /* NSMetadata.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSMetadata.h; sourceTree = ""; }; AD197C0E189A4E98000F6CF9 /* NSUserNotification.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSUserNotification.h; sourceTree = ""; }; AD197C0F189A4E98000F6CF9 /* NSUUID.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSUUID.h; sourceTree = ""; }; AD197C15189A51ED000F6CF9 /* GNUmakefile */ = {isa = PBXFileReference; explicitFileType = sourcecode.make; indentWidth = 8; path = GNUmakefile; sourceTree = ""; tabWidth = 8; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 1837DA121652D18400197E53 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 1837DA141652D18400197E53 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 18394B181610D8E300335E85 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 184915A5163056E800B0ED83 /* libffi.dylib in Frameworks */, 1852899F16139A1B0016729B /* libiconv.dylib in Frameworks */, 1852899D161399FB0016729B /* libxslt.dylib in Frameworks */, 1852899B161399D70016729B /* libz.dylib in Frameworks */, 18528999161399720016729B /* libxml2.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 1837D9C51652D0FF00197E53 /* Tools */ = { isa = PBXGroup; children = ( 1837D9C61652D0FF00197E53 /* .cvsignore */, 1837D9C71652D0FF00197E53 /* AGSHtml.h */, 1837D9C81652D0FF00197E53 /* AGSHtml.m */, 1837D9C91652D0FF00197E53 /* AGSIndex.h */, 1837D9CA1652D0FF00197E53 /* AGSIndex.m */, 1837D9CB1652D0FF00197E53 /* AGSOutput.h */, 1837D9CC1652D0FF00197E53 /* AGSOutput.m */, 1837D9CD1652D0FF00197E53 /* AGSParser.h */, 1837D9CE1652D0FF00197E53 /* AGSParser.m */, 1837D9CF1652D0FF00197E53 /* BaseTools.gsdoc */, 1837D9D01652D0FF00197E53 /* DocMakefile */, 1837D9D11652D0FF00197E53 /* GNUmakefile */, 1837D9D21652D0FF00197E53 /* HTMLLinker.gsdoc */, 1837D9D31652D0FF00197E53 /* HTMLLinker.m */, 1837D9D41652D0FF00197E53 /* Makefile.postamble */, 1837D9D51652D0FF00197E53 /* Makefile.preamble */, 1837D9D61652D0FF00197E53 /* autogsdoc.1 */, 1837D9D71652D0FF00197E53 /* autogsdoc.m */, 1837D9D81652D0FF00197E53 /* cvtenc.1 */, 1837D9D91652D0FF00197E53 /* cvtenc.m */, 1837D9DA1652D0FF00197E53 /* defaults.1 */, 1837D9DB1652D0FF00197E53 /* defaults.m */, 1837D9DC1652D0FF00197E53 /* gdnc.1 */, 1837D9DD1652D0FF00197E53 /* gdnc.h */, 1837D9DE1652D0FF00197E53 /* gdnc.m */, 1837D9DF1652D0FF00197E53 /* gdomap.8 */, 1837D9E01652D0FF00197E53 /* gdomap.c */, 1837D9E11652D0FF00197E53 /* gdomap.gsdoc */, 1837D9E21652D0FF00197E53 /* gdomap.h */, 1837D9E31652D0FF00197E53 /* gsdoc-0_6_5.dtd */, 1837D9E41652D0FF00197E53 /* gsdoc-0_6_6.dtd */, 1837D9E51652D0FF00197E53 /* gsdoc-0_6_7.dtd */, 1837D9E61652D0FF00197E53 /* gsdoc-1_0_0.dtd */, 1837D9E71652D0FF00197E53 /* gsdoc-1_0_1.dtd */, 1837D9E81652D0FF00197E53 /* gsdoc-1_0_1.rnc */, 1837D9E91652D0FF00197E53 /* gsdoc-1_0_2.dtd */, 1837D9EA1652D0FF00197E53 /* gsdoc-1_0_3.dtd */, 1837D9EB1652D0FF00197E53 /* gsdoc.7 */, 1837D9EC1652D0FF00197E53 /* gsdoc.gsdoc */, 1837D9ED1652D0FF00197E53 /* gspath.1 */, 1837D9EE1652D0FF00197E53 /* gspath.m */, 1837D9EF1652D0FF00197E53 /* locale_alias.m */, 1837D9F01652D0FF00197E53 /* make_strings */, 1837D9FF1652D0FF00197E53 /* mkchlog.sh */, 1837DA001652D0FF00197E53 /* pl.m */, 1837DA011652D0FF00197E53 /* pl2link.m */, 1837DA021652D0FF00197E53 /* pldes.1 */, 1837DA031652D0FF00197E53 /* pldes.m */, 1837DA041652D0FF00197E53 /* plget.m */, 1837DA051652D0FF00197E53 /* plist-0_9.dtd */, 1837DA061652D0FF00197E53 /* plmerge.m */, 1837DA071652D0FF00197E53 /* plparse.m */, 1837DA081652D0FF00197E53 /* plser.m */, 1837DA091652D0FF00197E53 /* sfparse.1 */, 1837DA0A1652D0FF00197E53 /* sfparse.m */, 1837DA0B1652D0FF00197E53 /* xmlparse.1 */, 1837DA0C1652D0FF00197E53 /* xmlparse.m */, ); path = Tools; sourceTree = ""; }; 1837D9F01652D0FF00197E53 /* make_strings */ = { isa = PBXGroup; children = ( 1837D9F11652D0FF00197E53 /* .cvsignore */, 1837D9F21652D0FF00197E53 /* GNUmakefile */, 1837D9F31652D0FF00197E53 /* GNUmakefile.preamble */, 1837D9F41652D0FF00197E53 /* README */, 1837D9F51652D0FF00197E53 /* SourceEntry.h */, 1837D9F61652D0FF00197E53 /* SourceEntry.m */, 1837D9F71652D0FF00197E53 /* StringsEntry.h */, 1837D9F81652D0FF00197E53 /* StringsEntry.m */, 1837D9F91652D0FF00197E53 /* StringsFile.h */, 1837D9FA1652D0FF00197E53 /* StringsFile.m */, 1837D9FB1652D0FF00197E53 /* Using.txt */, 1837D9FC1652D0FF00197E53 /* make_strings.h */, 1837D9FD1652D0FF00197E53 /* make_strings.m */, 1837D9FE1652D0FF00197E53 /* test1.m */, ); path = make_strings; sourceTree = ""; }; 18394B031610D85D00335E85 /* Additions */ = { isa = PBXGroup; children = ( 18906EEE1610BF3C0003C892 /* NSArray+GNUstepBase.h */, 18906EEF1610BF3C0003C892 /* NSAttributedString+GNUstepBase.h */, 18906EF01610BF3C0003C892 /* NSBundle+GNUstepBase.h */, 18906EF11610BF3C0003C892 /* NSCalendarDate+GNUstepBase.h */, 18906EF21610BF3C0003C892 /* NSData+GNUstepBase.h */, 18906EF31610BF3C0003C892 /* NSDebug+GNUstepBase.h */, 18906EF41610BF3C0003C892 /* NSFileHandle+GNUstepBase.h */, 18906EF51610BF3C0003C892 /* NSLock+GNUstepBase.h */, 18906EF61610BF3C0003C892 /* NSMutableString+GNUstepBase.h */, 18906EF71610BF3C0003C892 /* NSNetServices+GNUstepBase.h */, 18906EF81610BF3C0003C892 /* NSNumber+GNUstepBase.h */, 18906EF91610BF3C0003C892 /* NSObject+GNUstepBase.h */, 18906EFA1610BF3C0003C892 /* NSProcessInfo+GNUstepBase.h */, 18906EFB1610BF3C0003C892 /* NSStream+GNUstepBase.h */, 18906EFC1610BF3C0003C892 /* NSString+GNUstepBase.h */, 18906EFD1610BF3C0003C892 /* NSTask+GNUstepBase.h */, 18906EFE1610BF3C0003C892 /* NSThread+GNUstepBase.h */, 18906EFF1610BF3C0003C892 /* NSURL+GNUstepBase.h */, ); name = Additions; sourceTree = ""; }; 18394B301610D93700335E85 /* Foundation */ = { isa = PBXGroup; children = ( 18394B311610D95600335E85 /* Foundation-Info.plist */, 18394B321610D95600335E85 /* Foundation-Prefix.pch */, ); name = Foundation; sourceTree = ""; }; 18394BF21610DC0B00335E85 /* GNUstepBase */ = { isa = PBXGroup; children = ( 18641D0D1678AD04003C6E11 /* GSSocksParser */, 18906F391610BF3C0003C892 /* GSArray.m */, 18906F3A1610BF3C0003C892 /* GSAttributedString.m */, 18906F351610BF3C0003C892 /* CXXException.m */, 18906F3C1610BF3C0003C892 /* GSAvahiClient.m */, 18906F3D1610BF3C0003C892 /* GSAvahiNetService.m */, 18906F3E1610BF3C0003C892 /* GSAvahiNetServiceBrowser.m */, 18906F401610BF3C0003C892 /* GSAvahiRunLoopIntegration.m */, 18906F411610BF3C0003C892 /* GSBlocks.m */, 18906F421610BF3C0003C892 /* GSConcreteValue.m */, 18906F431610BF3C0003C892 /* GSConcreteValueTemplate.m */, 18906F441610BF3C0003C892 /* GSCountedSet.m */, 18906F451610BF3C0003C892 /* GSDictionary.m */, 18906F471610BF3C0003C892 /* GSFFCallInvocation.m */, 18906F481610BF3C0003C892 /* GSFFIInvocation.m */, 18906F491610BF3C0003C892 /* GSFTPURLHandle.m */, 18906F4C1610BF3C0003C892 /* GSFileHandle.m */, 18906F4D1610BF3C0003C892 /* GSFormat.m */, 18906F4E1610BF3C0003C892 /* GSHTTPAuthentication.m */, 18906F4F1610BF3C0003C892 /* GSHTTPURLHandle.m */, 18906F511610BF3C0003C892 /* GSICUString.m */, 18906F541610BF3C0003C892 /* GSLocale.m */, 18906F551610BF3C0003C892 /* GSMDNSNetServices.m */, 18906F5C1610BF3C0003C892 /* GSQuickSort.m */, 18906F5F1610BF3C0003C892 /* GSRunLoopWatcher.m */, 1890B34016F3BC3300187826 /* GSPrivateHash.m */, 18906F601610BF3C0003C892 /* GSSet.m */, 18906F611610BF3C0003C892 /* GSShellSort.m */, 18906F631610BF3C0003C892 /* GSSocketStream.m */, 18906F661610BF3C0003C892 /* GSStream.m */, 18906F671610BF3C0003C892 /* GSString.m */, 18906F691610BF3C0003C892 /* GSTLS.m */, 18906F6A1610BF3C0003C892 /* GSTimSort.m */, 18906F6C1610BF3C0003C892 /* GSValue.m */, ); name = GNUstepBase; sourceTree = ""; }; 18394BF31610DC4B00335E85 /* Private Headers */ = { isa = PBXGroup; children = ( 18394C001610EB3F00335E85 /* Foundation */, 18394BF41610DC6A00335E85 /* GNUstepBase */, ); name = "Private Headers"; sourceTree = ""; }; 18394BF41610DC6A00335E85 /* GNUstepBase */ = { isa = PBXGroup; children = ( 18906F3B1610BF3C0003C892 /* GSAvahiClient.h */, 18906F3F1610BF3C0003C892 /* GSAvahiRunLoopIntegration.h */, 18906F461610BF3C0003C892 /* GSDispatch.h */, 18906F4A1610BF3C0003C892 /* GSFastEnumeration.h */, 18906F4B1610BF3C0003C892 /* GSFileHandle.h */, 18906F501610BF3C0003C892 /* GSICUString.h */, 18906F521610BF3C0003C892 /* GSInternal.h */, 18906F531610BF3C0003C892 /* GSInvocation.h */, 18906F561610BF3C0003C892 /* GSNetServices.h */, 18906F571610BF3C0003C892 /* GSNetwork.h */, 18906F581610BF3C0003C892 /* GSNumberTypes.h */, 18906F591610BF3C0003C892 /* GSPThread.h */, 18906F5A1610BF3C0003C892 /* GSPortPrivate.h */, 18906F5B1610BF3C0003C892 /* GSPrivate.h */, 18906F5D1610BF3C0003C892 /* GSRunLoopCtxt.h */, 18906F5E1610BF3C0003C892 /* GSRunLoopWatcher.h */, 18906F621610BF3C0003C892 /* GSSocketStream.h */, 18906F641610BF3C0003C892 /* GSSorting.h */, 18906F651610BF3C0003C892 /* GSStream.h */, 18906F681610BF3C0003C892 /* GSTLS.h */, 18906F6B1610BF3C0003C892 /* GSURLPrivate.h */, 18906F6D1610BF3C0003C892 /* GSeq.h */, ); name = GNUstepBase; sourceTree = ""; }; 18394BFF1610E9D600335E85 /* Foundation */ = { isa = PBXGroup; children = ( 18F8D04F1724534E00420DA5 /* KVO */, 18906F701610BF3C0003C892 /* NSAffineTransform.m */, 18906F711610BF3C0003C892 /* NSArchiver.m */, 18906F721610BF3C0003C892 /* NSArray.m */, 18906F731610BF3C0003C892 /* NSAssertionHandler.m */, 18906F741610BF3C0003C892 /* NSAttributedString.m */, 18906F751610BF3C0003C892 /* NSAutoreleasePool.m */, 18906F761610BF3C0003C892 /* NSBundle.m */, 18906F771610BF3C0003C892 /* NSCache.m */, 18906F781610BF3C0003C892 /* NSCachedURLResponse.m */, 18906F791610BF3C0003C892 /* NSCalendar.m */, 18906F7A1610BF3C0003C892 /* NSCalendarDate.m */, 18906F7C1610BF3C0003C892 /* NSCallBacks.m */, 18906F7D1610BF3C0003C892 /* NSCharacterSet.m */, 18906F7F1610BF3C0003C892 /* NSClassDescription.m */, 18906F801610BF3C0003C892 /* NSCoder.m */, 18906F811610BF3C0003C892 /* NSConcreteHashTable.m */, 18906F821610BF3C0003C892 /* NSConcreteMapTable.m */, 18906F841610BF3C0003C892 /* NSConcretePointerFunctions.m */, 18906F851610BF3C0003C892 /* NSConnection.m */, 18906F861610BF3C0003C892 /* NSCopyObject.m */, 18906F871610BF3C0003C892 /* NSCountedSet.m */, 18906F881610BF3C0003C892 /* NSData.m */, 18906F891610BF3C0003C892 /* NSDate.m */, 18906F8A1610BF3C0003C892 /* NSDateFormatter.m */, 18906F8B1610BF3C0003C892 /* NSDebug.m */, 18906F8C1610BF3C0003C892 /* NSDecimal.m */, 18906F8D1610BF3C0003C892 /* NSDecimalNumber.m */, 18906F8E1610BF3C0003C892 /* NSDictionary.m */, 18906F8F1610BF3C0003C892 /* NSDistantObject.m */, 18906F901610BF3C0003C892 /* NSDistributedLock.m */, 18906F911610BF3C0003C892 /* NSDistributedNotificationCenter.m */, 18906F921610BF3C0003C892 /* NSEnumerator.m */, 18906F931610BF3C0003C892 /* NSError.m */, 18906F941610BF3C0003C892 /* NSException.m */, 18906F951610BF3C0003C892 /* NSFileHandle.m */, 18906F961610BF3C0003C892 /* NSFileManager.m */, 18906F971610BF3C0003C892 /* NSFormatter.m */, 18906F981610BF3C0003C892 /* NSGarbageCollector.m */, 18906F991610BF3C0003C892 /* NSGeometry.m */, 18906F9A1610BF3C0003C892 /* NSHTTPCookie.m */, 18906F9B1610BF3C0003C892 /* NSHTTPCookieStorage.m */, 18906F9C1610BF3C0003C892 /* NSHashTable.m */, 18906F9D1610BF3C0003C892 /* NSHost.m */, 18906F9E1610BF3C0003C892 /* NSIndexPath.m */, 18906F9F1610BF3C0003C892 /* NSIndexSet.m */, AD197BFF189A4D5F000F6CF9 /* NSInvocation.m */, AD197C00189A4D5F000F6CF9 /* NSInvocationOperation.m */, 18906FA11610BF3C0003C892 /* NSJSONSerialization.m */, 18906FA21610BF3C0003C892 /* NSKeyValueCoding.m */, 18906FA31610BF3C0003C892 /* NSKeyValueMutableArray.m */, 18906FA41610BF3C0003C892 /* NSKeyValueMutableSet.m */, 18906FA61610BF3C0003C892 /* NSKeyedArchiver.m */, 18906FA71610BF3C0003C892 /* NSKeyedUnarchiver.m */, 18906FA81610BF3C0003C892 /* NSLocale.m */, 18906FA91610BF3C0003C892 /* NSLock.m */, 18906FAA1610BF3C0003C892 /* NSLog.m */, 18906FAB1610BF3C0003C892 /* NSMapTable.m */, 18906FAC1610BF3C0003C892 /* NSMessagePort.m */, 18906FAD1610BF3C0003C892 /* NSMessagePortNameServer.m */, AD197C02189A4D5F000F6CF9 /* NSMetadata.m */, 18906FAE1610BF3C0003C892 /* NSMethodSignature.m */, 18906FAF1610BF3C0003C892 /* NSNetServices.m */, 18906FB01610BF3C0003C892 /* NSNotification.m */, 18906FB11610BF3C0003C892 /* NSNotificationCenter.m */, 18906FB21610BF3C0003C892 /* NSNotificationQueue.m */, 18906FB31610BF3C0003C892 /* NSNull.m */, 18906FB41610BF3C0003C892 /* NSNumber.m */, 18906FB51610BF3C0003C892 /* NSNumberFormatter.m */, 18906FB71610BF3C0003C892 /* NSObjCRuntime.m */, 18906FB91610BF3C0003C892 /* NSObject.m */, 18906FBA1610BF3C0003C892 /* NSOperation.m */, 18906FBB1610BF3C0003C892 /* NSPage.m */, 18906FBC1610BF3C0003C892 /* NSPathUtilities.m */, 18906FBD1610BF3C0003C892 /* NSPipe.m */, 18906FBE1610BF3C0003C892 /* NSPointerArray.m */, 18906FBF1610BF3C0003C892 /* NSPointerFunctions.m */, 18906FC01610BF3C0003C892 /* NSPort.m */, 18906FC11610BF3C0003C892 /* NSPortCoder.m */, 18906FC21610BF3C0003C892 /* NSPortMessage.m */, 18906FC31610BF3C0003C892 /* NSPortNameServer.m */, 18906FC41610BF3C0003C892 /* NSPredicate.m */, 18906FC51610BF3C0003C892 /* NSProcessInfo.m */, 18906FC61610BF3C0003C892 /* NSPropertyList.m */, 18906FC71610BF3C0003C892 /* NSProtocolChecker.m */, 18906FC81610BF3C0003C892 /* NSProxy.m */, 18906FC91610BF3C0003C892 /* NSRange.m */, 18906FCA1610BF3C0003C892 /* NSRegularExpression.m */, 18906FCB1610BF3C0003C892 /* NSRunLoop.m */, 18906FCC1610BF3C0003C892 /* NSScanner.m */, 18906FCD1610BF3C0003C892 /* NSSerializer.m */, 18906FCE1610BF3C0003C892 /* NSSet.m */, 18906FCF1610BF3C0003C892 /* NSSocketPort.m */, 18906FD01610BF3C0003C892 /* NSSocketPortNameServer.m */, 18906FD11610BF3C0003C892 /* NSSortDescriptor.m */, 18906FD21610BF3C0003C892 /* NSSpellServer.m */, 18906FD31610BF3C0003C892 /* NSString.m */, 18906FD41610BF3C0003C892 /* NSTask.m */, 18906FD51610BF3C0003C892 /* NSTextCheckingResult.m */, 18906FD61610BF3C0003C892 /* NSThread.m */, 18906FD71610BF3C0003C892 /* NSTimeZone.m */, 18906FD81610BF3C0003C892 /* NSTimer.m */, 18906FE51610BF3C0003C892 /* NSUnarchiver.m */, 18906FE61610BF3C0003C892 /* NSUndoManager.m */, 18906FD91610BF3C0003C892 /* NSURL.m */, 18906FDA1610BF3C0003C892 /* NSURLAuthenticationChallenge.m */, 18906FDB1610BF3C0003C892 /* NSURLCache.m */, 18906FDC1610BF3C0003C892 /* NSURLConnection.m */, 18906FDD1610BF3C0003C892 /* NSURLCredential.m */, 18906FDE1610BF3C0003C892 /* NSURLCredentialStorage.m */, 18906FDF1610BF3C0003C892 /* NSURLDownload.m */, 18906FE01610BF3C0003C892 /* NSURLHandle.m */, 18906FE11610BF3C0003C892 /* NSURLProtectionSpace.m */, 18906FE21610BF3C0003C892 /* NSURLProtocol.m */, 18906FE31610BF3C0003C892 /* NSURLRequest.m */, 18906FE41610BF3C0003C892 /* NSURLResponse.m */, 18906FE71610BF3C0003C892 /* NSUserDefaults.m */, AD197C03189A4D5F000F6CF9 /* NSUserNotification.m */, AD197C04189A4D5F000F6CF9 /* NSUUID.m */, 18906FE81610BF3C0003C892 /* NSValue.m */, 18906FE91610BF3C0003C892 /* NSValueTransformer.m */, 18906FEA1610BF3C0003C892 /* NSXMLDTD.m */, 18906FEB1610BF3C0003C892 /* NSXMLDTDNode.m */, 18906FEC1610BF3C0003C892 /* NSXMLDocument.m */, 18906FED1610BF3C0003C892 /* NSXMLElement.m */, 18906FEE1610BF3C0003C892 /* NSXMLNode.m */, 18906FEF1610BF3C0003C892 /* NSXMLParser.m */, 18906FF11610BF3C0003C892 /* NSZone.m */, ); name = Foundation; sourceTree = ""; }; 18394C001610EB3F00335E85 /* Foundation */ = { isa = PBXGroup; children = ( 18906F7B1610BF3C0003C892 /* NSCallBacks.h */, 18906F7E1610BF3C0003C892 /* NSCharacterSetData.h */, 18906F831610BF3C0003C892 /* NSConcretePointerFunctions.h */, 18906FB61610BF3C0003C892 /* NSNumberMethods.h */, 18906FF01610BF3C0003C892 /* NSXMLPrivate.h */, ); name = Foundation; sourceTree = ""; }; 185289AD1613A1060016729B /* config */ = { isa = PBXGroup; children = ( 185289AE1613A1060016729B /* addlibrarypath.m4 */, 185289AF1613A1060016729B /* codeset.m4 */, 185289B01613A1060016729B /* config.align.c */, 185289B11613A1060016729B /* config.builtin_apply.c */, 185289B21613A1060016729B /* config.constant-string-class.m */, 185289B31613A1060016729B /* config.constant-string-encoding.c */, 185289B41613A1060016729B /* config.ffi.c */, 185289B51613A1060016729B /* config.forward.m */, 185289B61613A1060016729B /* config.forward2.m */, 185289B71613A1060016729B /* config.initialize.m */, 185289B81613A1060016729B /* config.joinable.m */, 185289B91613A1060016729B /* config.kvmopen.c */, 185289BA1613A1060016729B /* config.loadtest.m */, 185289BB1613A1060016729B /* config.nested.c */, 185289BC1613A1060016729B /* config.nextcc.h */, 185289BD1613A1060016729B /* config.nextrt.m */, 185289BE1613A1060016729B /* config.non-fragile-ivars.m */, 185289BF1613A1060016729B /* config.objc.m */, 185289C01613A1060016729B /* config.poll-dev.c */, 185289C11613A1060016729B /* config.poll.c */, 185289C21613A1060016729B /* config.printf.c */, 185289C31613A1060016729B /* config.proccmd.c */, 185289C41613A1060016729B /* config.psinfo.c */, 185289C51613A1060016729B /* config.retframe.c */, 185289C61613A1060016729B /* config.reuseaddr.c */, 185289C71613A1060016729B /* config.setUncaughtExceptionHandler.m */, 185289C81613A1060016729B /* config.set_unexpected.m */, 185289C91613A1060016729B /* config.trampoline.c */, 185289CA1613A1060016729B /* config.unexpected.m */, 185289CB1613A1060016729B /* config.vasprintf.c */, 185289CC1613A1060016729B /* config.vsprintf.c */, 185289CD1613A1060016729B /* config.wprintf.c */, 185289CE1613A1060016729B /* icu.m4 */, 185289CF1613A1060016729B /* objc-common.g */, 185289D01613A1060016729B /* objc-con-autoload.m4 */, 185289D11613A1060016729B /* objc-sys-dynamic.m4 */, 185289D21613A1060016729B /* pathtls.m4 */, 185289D31613A1060016729B /* pathxml.m4 */, 185289D41613A1060016729B /* procfs-exe-link.m4 */, 185289D51613A1060016729B /* procfs.m4 */, ); path = config; sourceTree = SOURCE_ROOT; }; 1857833D17551CC200CB7160 /* NSNotification */ = { isa = PBXGroup; children = ( 1857833F17551CC200CB7160 /* TestInfo */, 1857834017551CC200CB7160 /* basic.m */, 1857834117551CC200CB7160 /* general.m */, ); path = NSNotification; sourceTree = ""; }; 18641D0D1678AD04003C6E11 /* GSSocksParser */ = { isa = PBXGroup; children = ( 18641D0E1678AD04003C6E11 /* GSSocks4Parser.h */, 18641D0F1678AD04003C6E11 /* GSSocks4Parser.m */, 18641D101678AD04003C6E11 /* GSSocks5Parser.h */, 18641D111678AD04003C6E11 /* GSSocks5Parser.m */, 18641D121678AD04003C6E11 /* GSSocksParser.h */, 18641D131678AD04003C6E11 /* GSSocksParser.m */, 18641D141678AD04003C6E11 /* GSSocksParserPrivate.h */, 18641D151678AD04003C6E11 /* GSSocksParserPrivate.m */, ); path = GSSocksParser; sourceTree = ""; }; 18906E351610BC4C0003C892 = { isa = PBXGroup; children = ( AD197C15189A51ED000F6CF9 /* GNUmakefile */, AD197C0B189A4E98000F6CF9 /* MISSING */, 18906E661610BF3C0003C892 /* Headers */, 18394BF31610DC4B00335E85 /* Private Headers */, 18906F081610BF3C0003C892 /* Source */, 18906E4B1610BC4C0003C892 /* Supporting Files */, 18FE1E271628550000389A13 /* Tests */, 1837D9C51652D0FF00197E53 /* Tools */, 18906E421610BC4C0003C892 /* Products */, 18906E431610BC4C0003C892 /* Libraries */, ); sourceTree = ""; }; 18906E421610BC4C0003C892 /* Products */ = { isa = PBXGroup; children = ( 18394B1C1610D8E300335E85 /* Foundation.framework */, 1837DA191652D18400197E53 /* gdnc */, ); name = Products; sourceTree = ""; }; 18906E431610BC4C0003C892 /* Libraries */ = { isa = PBXGroup; children = ( 184915A4163056E800B0ED83 /* libffi.dylib */, 185289A016139A470016729B /* libgcrypt.11.dylib */, 1852899E16139A180016729B /* libiconv.dylib */, 1852899C161399F80016729B /* libxslt.dylib */, 1852899A161399D40016729B /* libz.dylib */, 185289981613996F0016729B /* libxml2.dylib */, 18528980161397F40016729B /* libgnutls.26.dylib */, 18394BFD1610E97A00335E85 /* libicuuc.48.1.dylib */, 18394BFB1610E8FB00335E85 /* libicui18n.48.1.dylib */, 18394BF91610E85A00335E85 /* libicucore.dylib */, 18394BF71610E84A00335E85 /* libicudata.48.1.dylib */, 18394BF51610E73300335E85 /* libobjc.dylib */, ); name = Libraries; sourceTree = ""; }; 18906E4B1610BC4C0003C892 /* Supporting Files */ = { isa = PBXGroup; children = ( 18394B301610D93700335E85 /* Foundation */, 185289AD1613A1060016729B /* config */, 185289AB1613A06F0016729B /* configure.ac */, 18394A9C1610C04600335E85 /* configure */, 18906E621610BEC80003C892 /* README */, 18FE1E12162716A200389A13 /* ChangeLog */, 18FE1E13162716A200389A13 /* ChangeLog.1 */, 18FE1E14162716A200389A13 /* ChangeLog.2 */, ); name = "Supporting Files"; path = base; sourceTree = ""; }; 18906E661610BF3C0003C892 /* Headers */ = { isa = PBXGroup; children = ( 18906E671610BF3C0003C892 /* Foundation */, 18906EDB1610BF3C0003C892 /* GNUstepBase */, ); path = Headers; sourceTree = ""; }; 18906E671610BF3C0003C892 /* Foundation */ = { isa = PBXGroup; children = ( AD197C0C189A4E98000F6CF9 /* NSInvocationOperation.h */, AD197C0D189A4E98000F6CF9 /* NSMetadata.h */, 18394B031610D85D00335E85 /* Additions */, 18906E681610BF3C0003C892 /* Foundation.h */, 18906E691610BF3C0003C892 /* FoundationErrors.h */, 18906E6A1610BF3C0003C892 /* NSAffineTransform.h */, 18906E6B1610BF3C0003C892 /* NSArchiver.h */, 18906E6C1610BF3C0003C892 /* NSArray.h */, 18906E6D1610BF3C0003C892 /* NSAttributedString.h */, 18906E6E1610BF3C0003C892 /* NSAutoreleasePool.h */, 18906E6F1610BF3C0003C892 /* NSBundle.h */, 18906E701610BF3C0003C892 /* NSByteOrder.h */, 18906E711610BF3C0003C892 /* NSCache.h */, 18906E721610BF3C0003C892 /* NSCalendar.h */, 18906E731610BF3C0003C892 /* NSCalendarDate.h */, 18906E741610BF3C0003C892 /* NSCharacterSet.h */, 18906E751610BF3C0003C892 /* NSClassDescription.h */, 18906E761610BF3C0003C892 /* NSCoder.h */, 18906E771610BF3C0003C892 /* NSComparisonPredicate.h */, 18906E781610BF3C0003C892 /* NSCompoundPredicate.h */, 18906E791610BF3C0003C892 /* NSConnection.h */, 18906E7A1610BF3C0003C892 /* NSData.h */, 18906E7B1610BF3C0003C892 /* NSDate.h */, 18906E7C1610BF3C0003C892 /* NSDateFormatter.h */, 18906E7D1610BF3C0003C892 /* NSDebug.h */, 18906E7E1610BF3C0003C892 /* NSDecimal.h */, 18906E7F1610BF3C0003C892 /* NSDecimalNumber.h */, 18906E801610BF3C0003C892 /* NSDictionary.h */, 18906E811610BF3C0003C892 /* NSDistantObject.h */, 18906E821610BF3C0003C892 /* NSDistributedLock.h */, 18906E831610BF3C0003C892 /* NSDistributedNotificationCenter.h */, 18906E841610BF3C0003C892 /* NSEnumerator.h */, 18906E851610BF3C0003C892 /* NSError.h */, 18906E861610BF3C0003C892 /* NSErrorRecoveryAttempting.h */, 18906E871610BF3C0003C892 /* NSException.h */, 18906E881610BF3C0003C892 /* NSExpression.h */, 18906E891610BF3C0003C892 /* NSFileHandle.h */, 18906E8A1610BF3C0003C892 /* NSFileManager.h */, 18906E8B1610BF3C0003C892 /* NSFormatter.h */, 18906E8C1610BF3C0003C892 /* NSGarbageCollector.h */, 18906E8D1610BF3C0003C892 /* NSGeometry.h */, 18906E8E1610BF3C0003C892 /* NSHTTPCookie.h */, 18906E8F1610BF3C0003C892 /* NSHTTPCookieStorage.h */, 18906E901610BF3C0003C892 /* NSHashTable.h */, 18906E911610BF3C0003C892 /* NSHost.h */, 18906E921610BF3C0003C892 /* NSIndexPath.h */, 18906E931610BF3C0003C892 /* NSIndexSet.h */, 18906E941610BF3C0003C892 /* NSInvocation.h */, 18906E951610BF3C0003C892 /* NSJSONSerialization.h */, 18906E961610BF3C0003C892 /* NSKeyValueCoding.h */, 18906E971610BF3C0003C892 /* NSKeyValueObserving.h */, 18906E981610BF3C0003C892 /* NSKeyedArchiver.h */, 18906E991610BF3C0003C892 /* NSLocale.h */, 18906E9A1610BF3C0003C892 /* NSLock.h */, 18906E9B1610BF3C0003C892 /* NSMapTable.h */, 18906E9C1610BF3C0003C892 /* NSMethodSignature.h */, 18906E9D1610BF3C0003C892 /* NSNetServices.h */, 18906E9E1610BF3C0003C892 /* NSNotification.h */, 18906E9F1610BF3C0003C892 /* NSNotificationQueue.h */, 18906EA01610BF3C0003C892 /* NSNull.h */, 18906EA11610BF3C0003C892 /* NSNumberFormatter.h */, 18906EA21610BF3C0003C892 /* NSObjCRuntime.h */, 18906EA31610BF3C0003C892 /* NSObject.h */, 18906EA41610BF3C0003C892 /* NSOperation.h */, 18906EA51610BF3C0003C892 /* NSPathUtilities.h */, 18906EA61610BF3C0003C892 /* NSPointerArray.h */, 18906EA71610BF3C0003C892 /* NSPointerFunctions.h */, 18906EA81610BF3C0003C892 /* NSPort.h */, 18906EA91610BF3C0003C892 /* NSPortCoder.h */, 18906EAA1610BF3C0003C892 /* NSPortMessage.h */, 18906EAB1610BF3C0003C892 /* NSPortNameServer.h */, 18906EAC1610BF3C0003C892 /* NSPredicate.h */, 18906EAD1610BF3C0003C892 /* NSProcessInfo.h */, 18906EAE1610BF3C0003C892 /* NSPropertyList.h */, 18906EAF1610BF3C0003C892 /* NSProtocolChecker.h */, 18906EB01610BF3C0003C892 /* NSProxy.h */, 18906EB11610BF3C0003C892 /* NSRange.h */, 18906EB21610BF3C0003C892 /* NSRegularExpression.h */, 18906EB31610BF3C0003C892 /* NSRunLoop.h */, 18906EB41610BF3C0003C892 /* NSScanner.h */, 18906EB51610BF3C0003C892 /* NSScriptWhoseTests.h */, 18906EB61610BF3C0003C892 /* NSSerialization.h */, 18906EB71610BF3C0003C892 /* NSSet.h */, 18906EB81610BF3C0003C892 /* NSSortDescriptor.h */, 18906EB91610BF3C0003C892 /* NSSpellServer.h */, 18906EBA1610BF3C0003C892 /* NSStream.h */, 18906EBB1610BF3C0003C892 /* NSString.h */, 18906EBC1610BF3C0003C892 /* NSTask.h */, 18906EBD1610BF3C0003C892 /* NSTextCheckingResult.h */, 18906EBE1610BF3C0003C892 /* NSThread.h */, 18906EBF1610BF3C0003C892 /* NSTimeZone.h */, 18906EC01610BF3C0003C892 /* NSTimer.h */, 18906ECE1610BF3C0003C892 /* NSUndoManager.h */, 18906EC11610BF3C0003C892 /* NSURL.h */, 18906EC21610BF3C0003C892 /* NSURLAuthenticationChallenge.h */, 18906EC31610BF3C0003C892 /* NSURLCache.h */, 18906EC41610BF3C0003C892 /* NSURLConnection.h */, 18906EC51610BF3C0003C892 /* NSURLCredential.h */, 18906EC61610BF3C0003C892 /* NSURLCredentialStorage.h */, 18906EC71610BF3C0003C892 /* NSURLDownload.h */, 18906EC81610BF3C0003C892 /* NSURLError.h */, 18906EC91610BF3C0003C892 /* NSURLHandle.h */, 18906ECA1610BF3C0003C892 /* NSURLProtectionSpace.h */, 18906ECB1610BF3C0003C892 /* NSURLProtocol.h */, 18906ECC1610BF3C0003C892 /* NSURLRequest.h */, 18906ECD1610BF3C0003C892 /* NSURLResponse.h */, AD197C0E189A4E98000F6CF9 /* NSUserNotification.h */, 18906ECF1610BF3C0003C892 /* NSUserDefaults.h */, 18906ED01610BF3C0003C892 /* NSUtilities.h */, AD197C0F189A4E98000F6CF9 /* NSUUID.h */, 18906ED11610BF3C0003C892 /* NSValue.h */, 18906ED21610BF3C0003C892 /* NSValueTransformer.h */, 18906ED31610BF3C0003C892 /* NSXMLDTD.h */, 18906ED41610BF3C0003C892 /* NSXMLDTDNode.h */, 18906ED51610BF3C0003C892 /* NSXMLDocument.h */, 18906ED61610BF3C0003C892 /* NSXMLElement.h */, 18906ED71610BF3C0003C892 /* NSXMLNode.h */, 18906ED81610BF3C0003C892 /* NSXMLNodeOptions.h */, 18906ED91610BF3C0003C892 /* NSXMLParser.h */, 18906EDA1610BF3C0003C892 /* NSZone.h */, ); path = Foundation; sourceTree = ""; }; 18906EDB1610BF3C0003C892 /* GNUstepBase */ = { isa = PBXGroup; children = ( 18394AA31610CC4E00335E85 /* config.h */, 18394AA41610CC4E00335E85 /* GSConfig.h */, 18906EDC1610BF3C0003C892 /* .cvsignore */, 18906EDD1610BF3C0003C892 /* Additions.h */, 18906EDE1610BF3C0003C892 /* CXXException.h */, 18906EDF1610BF3C0003C892 /* DistributedObjects.h */, 18906EE01610BF3C0003C892 /* GCObject.h */, 18906EE11610BF3C0003C892 /* GNUstep.h */, 18906EE21610BF3C0003C892 /* GSBlocks.h */, 18906EE31610BF3C0003C892 /* GSConfig.h.in */, 18906EE41610BF3C0003C892 /* GSFunctions.h */, 18906EE51610BF3C0003C892 /* GSIArray.h */, 18906EE61610BF3C0003C892 /* GSIMap.h */, 18906EE71610BF3C0003C892 /* GSLocale.h */, 18906EE81610BF3C0003C892 /* GSLock.h */, 18906EE91610BF3C0003C892 /* GSMime.h */, 18906EEA1610BF3C0003C892 /* GSObjCRuntime.h */, 18EA6763172EC7F70026AC34 /* GSTypeEncoding.h */, 18906EEB1610BF3C0003C892 /* GSUnion.h */, 18906EEC1610BF3C0003C892 /* GSVersionMacros.h */, 18906EED1610BF3C0003C892 /* GSXML.h */, 18906F001610BF3C0003C892 /* Unicode.h */, 18906F011610BF3C0003C892 /* config.h.in */, ); path = GNUstepBase; sourceTree = ""; }; 18906F081610BF3C0003C892 /* Source */ = { isa = PBXGroup; children = ( 18906F381610BF3C0003C892 /* GNUmakefile */, 18906F6F1610BF3C0003C892 /* Makefile.preamble */, 18906F6E1610BF3C0003C892 /* Makefile.postamble */, 18906F361610BF3C0003C892 /* CompatibilityHeaders.make */, 18906F371610BF3C0003C892 /* DocMakefile */, 18394BFF1610E9D600335E85 /* Foundation */, 18394BF21610DC0B00335E85 /* GNUstepBase */, 18906F091610BF3C0003C892 /* .cvsignore */, 18906F0A1610BF3C0003C892 /* Additions */, 18906FFD1610BF3C0003C892 /* callframe.h */, 18906FFE1610BF3C0003C892 /* callframe.m */, 18906FFF1610BF3C0003C892 /* cifframe.h */, 189070001610BF3C0003C892 /* cifframe.m */, 189070011610BF3C0003C892 /* common.h */, 189070021610BF3C0003C892 /* dld-load.h */, 189070031610BF3C0003C892 /* externs.m */, 189070041610BF3C0003C892 /* hpux-load.h */, 189070051610BF3C0003C892 /* inet_ntop.m */, 189070061610BF3C0003C892 /* inet_pton.m */, 189070071610BF3C0003C892 /* libgnustep-base-entry.m */, 189070081610BF3C0003C892 /* nstzfile.h */, 189070091610BF3C0003C892 /* null-load.h */, 1890700A1610BF3C0003C892 /* objc-load.h */, 1890700B1610BF3C0003C892 /* objc-load.m */, 1890700C1610BF3C0003C892 /* preface.m */, 1890700D1610BF3C0003C892 /* simple-load.h */, 18906FB81610BF3C0003C892 /* NSObject+NSComparisonMethods.m */, 1890700E1610BF3C0003C892 /* unix */, 189070131610BF3C0003C892 /* win32 */, 1890701C1610BF3C0003C892 /* win32-def.top */, 1890701D1610BF3C0003C892 /* win32-load.h */, ); path = Source; sourceTree = ""; }; 18906F0A1610BF3C0003C892 /* Additions */ = { isa = PBXGroup; children = ( 18906F0B1610BF3C0003C892 /* GCArray.m */, 18906F0C1610BF3C0003C892 /* GCDictionary.m */, 18906F0D1610BF3C0003C892 /* GCObject.m */, 18906F0E1610BF3C0003C892 /* GNUmakefile */, 18906F0F1610BF3C0003C892 /* GSFunctions.m */, 18906F101610BF3C0003C892 /* GSInsensitiveDictionary.m */, 18906F111610BF3C0003C892 /* GSLock.m */, 18906F121610BF3C0003C892 /* GSMime.m */, 18906F131610BF3C0003C892 /* GSObjCRuntime.m */, 18EA675F172EC6170026AC34 /* GSTypeEncoding.c */, 18906F141610BF3C0003C892 /* GSXML.m */, 18906F151610BF3C0003C892 /* Makefile.postamble */, 18906F161610BF3C0003C892 /* Makefile.preamble */, 18906F171610BF3C0003C892 /* NSArray+GNUstepBase.m */, 18906F181610BF3C0003C892 /* NSAttributedString+GNUstepBase.m */, 18906F191610BF3C0003C892 /* NSBundle+GNUstepBase.m */, 18906F1A1610BF3C0003C892 /* NSCalendarDate+GNUstepBase.m */, 18906F1B1610BF3C0003C892 /* NSData+GNUstepBase.m */, 18906F1C1610BF3C0003C892 /* NSDebug+GNUstepBase.m */, 18906F1D1610BF3C0003C892 /* NSError+GNUstepBase.m */, 18906F1E1610BF3C0003C892 /* NSFileHandle+GNUstepBase.m */, 18906F1F1610BF3C0003C892 /* NSLock+GNUstepBase.m */, 18906F201610BF3C0003C892 /* NSMutableString+GNUstepBase.m */, 18906F211610BF3C0003C892 /* NSNumber+GNUstepBase.m */, 18906F221610BF3C0003C892 /* NSObject+GNUstepBase.m */, 18906F231610BF3C0003C892 /* NSProcessInfo+GNUstepBase.m */, 18906F241610BF3C0003C892 /* NSPropertyList+GNUstepBase.m */, 18906F251610BF3C0003C892 /* NSStream+GNUstepBase.m */, 18906F261610BF3C0003C892 /* NSString+GNUstepBase.m */, 18906F271610BF3C0003C892 /* NSTask+GNUstepBase.m */, 18906F281610BF3C0003C892 /* NSThread+GNUstepBase.m */, 18906F291610BF3C0003C892 /* NSURL+GNUstepBase.m */, 18906F2A1610BF3C0003C892 /* Unicode.m */, 18906F2B1610BF3C0003C892 /* unicode */, ); path = Additions; sourceTree = ""; }; 18906F2B1610BF3C0003C892 /* unicode */ = { isa = PBXGroup; children = ( 18906F2C1610BF3C0003C892 /* caseconv.h */, 18906F2D1610BF3C0003C892 /* cop.h */, 18906F2E1610BF3C0003C892 /* cyrillic.h */, 18906F2F1610BF3C0003C892 /* decomp.h */, 18906F301610BF3C0003C892 /* gsm0338.h */, 18906F311610BF3C0003C892 /* latin2.h */, 18906F321610BF3C0003C892 /* latin9.h */, 18906F331610BF3C0003C892 /* nextstep.h */, 18906F341610BF3C0003C892 /* thai.h */, ); path = unicode; sourceTree = ""; }; 1890700E1610BF3C0003C892 /* unix */ = { isa = PBXGroup; children = ( 1890700F1610BF3C0003C892 /* GNUmakefile */, 189070101610BF3C0003C892 /* GSRunLoopCtxt.m */, 189070111610BF3C0003C892 /* Makefile.preamble */, 189070121610BF3C0003C892 /* NSStream.m */, ); path = unix; sourceTree = ""; }; 189070131610BF3C0003C892 /* win32 */ = { isa = PBXGroup; children = ( 189070141610BF3C0003C892 /* GNUmakefile */, 189070151610BF3C0003C892 /* GSFileHandle.m */, 189070161610BF3C0003C892 /* GSRunLoopCtxt.m */, 189070171610BF3C0003C892 /* Makefile.preamble */, 189070181610BF3C0003C892 /* NSMessagePort.m */, 189070191610BF3C0003C892 /* NSMessagePortNameServer.m */, 1890701A1610BF3C0003C892 /* NSStream.m */, 1890701B1610BF3C0003C892 /* NSUserDefaults.m */, ); path = win32; sourceTree = ""; }; 18D882481729B64E0067E486 /* test00 */ = { isa = PBXGroup; children = ( 18D882491729B64E0067E486 /* ChangeStack.plist */, 18D8824A1729B64E0067E486 /* ComplexDependency.plist */, 18D8824B1729B64E0067E486 /* DependencyObservance.plist */, 18D8824C1729B64E0067E486 /* DependentNestedProperty.plist */, 18D8824D1729B64E0067E486 /* NestedProperty.plist */, 18D8824E1729B64E0067E486 /* NestedPropertyDependency.plist */, 18D8824F1729B64E0067E486 /* NestedPropertyLevels.plist */, 18D882501729B64E0067E486 /* Observance.plist */, 18D882511729B64E0067E486 /* ObservanceStack.plist */, 18D882521729B64E0067E486 /* StackCorruption.plist */, ); path = test00; sourceTree = ""; }; 18EFCBFF172AF0F0003304CA /* test02 */ = { isa = PBXGroup; children = ( 18EFCC00172AF0F0003304CA /* ItemInsertion.plist */, 18EFCC01172AF0F0003304CA /* ItemRemoval.plist */, 18EFCC02172AF0F0003304CA /* ItemReplacement.plist */, 18EFCC03172AF0F0003304CA /* NilValue.plist */, 18EFCC04172AF0F0003304CA /* SetComplementation.plist */, 18EFCC05172AF0F0003304CA /* SetIntersection.plist */, 18EFCC11172B01B9003304CA /* SetSettingEmpty.plist */, 18EFCC12172B01B9003304CA /* SetSettingNil.plist */, 18EFCC13172B01B9003304CA /* SetSettingNotEmpty.plist */, 18EFCC07172AF0F0003304CA /* SetUnion.plist */, ); path = test02; sourceTree = ""; }; 18F8D04117244FE900420DA5 /* KVO */ = { isa = PBXGroup; children = ( 18D882481729B64E0067E486 /* test00 */, 18EFCBFF172AF0F0003304CA /* test02 */, 18F8D04C17244FE900420DA5 /* TestInfo */, 18F8D04D17244FE900420DA5 /* test00.m */, 18D882531729B64E0067E486 /* test01.m */, 18EFCC08172AF0F0003304CA /* test02.m */, ); path = KVO; sourceTree = ""; }; 18F8D04F1724534E00420DA5 /* KVO */ = { isa = PBXGroup; children = ( AD197C01189A4D5F000F6CF9 /* NSKeyValueObserving.m */, ); path = KVO; sourceTree = ""; }; 18FE1E271628550000389A13 /* Tests */ = { isa = PBXGroup; children = ( 18FE1E281628550000389A13 /* GNUmakefile */, 18FE1E291628550000389A13 /* base */, ); path = Tests; sourceTree = ""; }; 18FE1E291628550000389A13 /* base */ = { isa = PBXGroup; children = ( 18FE1E2A1628550000389A13 /* Functions */, 18FE1E341628550000389A13 /* GNUmakefile.postamble */, 18FE1E351628550000389A13 /* GNUmakefile.super */, 18FE1E361628550000389A13 /* GSMime */, 18FE1E481628550000389A13 /* GSXML */, 18FE1E4B1628550000389A13 /* GarbageCollection */, 18FE1E4F1628550000389A13 /* GenericTests */, 18FE1E531628550000389A13 /* KVC */, 18F8D04117244FE900420DA5 /* KVO */, 18FE1E5A1628550000389A13 /* NSAffineTransform */, 18FE1E5D1628550000389A13 /* NSArchiver */, 18FE1E621628550000389A13 /* NSArray */, 18FE1E6B1628550000389A13 /* NSAttributedString */, 18FE1E6F1628550000389A13 /* NSAutoreleasePool */, 18FE1E731628550000389A13 /* NSBlock */, 18FE1E751628550000389A13 /* NSBundle */, 18FE1E891628550000389A13 /* NSCalendar */, 18FE1E8D1628550000389A13 /* NSCalendarDate */, 18FE1E941628550000389A13 /* NSCharacterSet */, 18FE1E9A1628550000389A13 /* NSConnection */, 18FE1EA21628550000389A13 /* NSCountedSet */, 18FE1EA51628550000389A13 /* NSData */, 18FE1EA91628550000389A13 /* NSDate */, 18FE1EAE1628550000389A13 /* NSDateFormatter */, 18FE1EB11628550000389A13 /* NSDictionary */, 18FE1EB71628550100389A13 /* NSException */, 18FE1EBF1628550100389A13 /* NSFileHandle */, 18FE1EC41628550100389A13 /* NSFileManager */, 18FE1ECA1628550100389A13 /* NSHTTPCookie */, 18FE1ECD1628550100389A13 /* NSHashTable */, 18FE1ED21628550100389A13 /* NSHost */, 18FE1ED61628550100389A13 /* NSIndexPath */, 18FE1ED91628550100389A13 /* NSInvocation */, 18FE1EE41628550100389A13 /* NSJSONSerialization */, 18FE1EE71628550100389A13 /* NSKeyedArchiver */, 18FE1EEC1628550100389A13 /* NSLocale */, 18FE1EF11628550100389A13 /* NSLock */, 18FE1EFC1628550100389A13 /* NSMapTable */, 18FE1F011628550100389A13 /* NSMethodSignature */, 18FE1F041628550100389A13 /* NSMutableArray */, 18FE1F091628550100389A13 /* NSMutableAttributedString */, 18FE1F0E1628550100389A13 /* NSMutableCharacterSet */, 18FE1F121628550100389A13 /* NSMutableData */, 18FE1F161628550100389A13 /* NSMutableDictionary */, 18FE1F1A1628550100389A13 /* NSMutableIndexSet */, 18FE1F1F1628550100389A13 /* NSMutableSet */, 18FE1F221628550100389A13 /* NSMutableString */, 1857833D17551CC200CB7160 /* NSNotification */, 18FE1F271628550100389A13 /* NSNumber */, 18FE1F2C1628550100389A13 /* NSNumberFormatter */, 18FE1F301628550100389A13 /* NSObject */, 18FE1F381628550100389A13 /* NSOperation */, 18FE1F3D1628550100389A13 /* NSOrderedSet */, 18FE1F401628550100389A13 /* NSPointerArray */, 18FE1F451628550100389A13 /* NSPredicate */, 18FE1F481628550100389A13 /* NSProcessInfo */, 18FE1F4C1628550100389A13 /* NSProxy */, 18FE1F511628550100389A13 /* NSRunLoop */, 18FE1F571628550100389A13 /* NSScanner */, 18FE1F5B1628550100389A13 /* NSSet */, 18FE1F5E1628550100389A13 /* NSSortDescriptor */, 18FE1F611628550100389A13 /* NSStream */, 18FE1F691628550100389A13 /* NSString */, 18FE1F7F1628550100389A13 /* NSTask */, 18FE1F8C1628550100389A13 /* NSThread */, 18FE1F8E1628550100389A13 /* NSTimeZone */, 18FE1F931628550100389A13 /* NSURL */, 18FE1F9F1628550100389A13 /* NSURLConnection */, 18FE1FA21628550100389A13 /* NSURLHandle */, 18FE1FAB1628550100389A13 /* NSURLProtocol */, 18FE1FAE1628550100389A13 /* NSURLRequest */, 18FE1FB11628550100389A13 /* NSUndoManager */, 18FE1FB51628550100389A13 /* NSUserDefaults */, 18FE1FB91628550100389A13 /* NSXMLDocument */, 18FE1FBD1628550100389A13 /* NSXMLElement */, 18FE1FC31628550100389A13 /* NSXMLNode */, 18FE1FCA1628550100389A13 /* NSXMLParser */, 18FE1FD11628550100389A13 /* PropertyLists */, 18FE1FDB1628550100389A13 /* TestInfo */, 18FE1FDC1628550100389A13 /* Unicode */, 18FE1FDF1628550100389A13 /* coding */, 18FE20011628550100389A13 /* headers */, ); path = base; sourceTree = ""; }; 18FE1E2A1628550000389A13 /* Functions */ = { isa = PBXGroup; children = ( 18FE1E2B1628550000389A13 /* NSGeometry1.m */, 18FE1E2C1628550000389A13 /* NSPathUtilities.m */, 18FE1E2D1628550000389A13 /* NSZone.m */, 18FE1E2E1628550000389A13 /* TestInfo */, 18FE1E2F1628550000389A13 /* class_hierarchy.m */, 18FE1E301628550000389A13 /* clsCreate.m */, 18FE1E311628550000389A13 /* properties.m */, 18FE1E321628550000389A13 /* propertyAttrs.m */, 18FE1E331628550000389A13 /* runtime.m */, ); path = Functions; sourceTree = ""; }; 18FE1E361628550000389A13 /* GSMime */ = { isa = PBXGroup; children = ( 18FE1E371628550000389A13 /* HTTP1.dat */, 18FE1E381628550000389A13 /* HTTP2.dat */, 18FE1E391628550000389A13 /* TestInfo */, 18FE1E3A1628550000389A13 /* build.m */, 18FE1E3B1628550000389A13 /* general.m */, 18FE1E3C1628550000389A13 /* mime1.dat */, 18FE1E3D1628550000389A13 /* mime10.dat */, 18FE1E3E1628550000389A13 /* mime2.dat */, 18FE1E3F1628550000389A13 /* mime3.dat */, 18FE1E401628550000389A13 /* mime4.dat */, 18FE1E411628550000389A13 /* mime5.dat */, 18FE1E421628550000389A13 /* mime6.dat */, 18FE1E431628550000389A13 /* mime7.dat */, 18FE1E441628550000389A13 /* mime8.dat */, 18FE1E451628550000389A13 /* mime9.dat */, 18FE1E461628550000389A13 /* test01.m */, 18FE1E471628550000389A13 /* test02.m */, ); path = GSMime; sourceTree = ""; }; 18FE1E481628550000389A13 /* GSXML */ = { isa = PBXGroup; children = ( 18FE1E491628550000389A13 /* TestInfo */, 18FE1E4A1628550000389A13 /* basic.m */, ); path = GSXML; sourceTree = ""; }; 18FE1E4B1628550000389A13 /* GarbageCollection */ = { isa = PBXGroup; children = ( 18FE1E4C1628550000389A13 /* TestInfo */, 18FE1E4D1628550000389A13 /* general.m */, 18FE1E4E1628550000389A13 /* notifications.m */, ); path = GarbageCollection; sourceTree = ""; }; 18FE1E4F1628550000389A13 /* GenericTests */ = { isa = PBXGroup; children = ( 18FE1E501628550000389A13 /* GNUmakefile */, 18FE1E511628550000389A13 /* generic.h */, 18FE1E521628550000389A13 /* generic.m */, ); path = GenericTests; sourceTree = ""; }; 18FE1E531628550000389A13 /* KVC */ = { isa = PBXGroup; children = ( 18FE1E541628550000389A13 /* TestInfo */, 18FE1E551628550000389A13 /* array.m */, 18FE1E561628550000389A13 /* basic.m */, 18FE1E571628550000389A13 /* mutable.m */, 18FE1E581628550000389A13 /* nil.m */, 18FE1E591628550000389A13 /* path.m */, ); path = KVC; sourceTree = ""; }; 18FE1E5A1628550000389A13 /* NSAffineTransform */ = { isa = PBXGroup; children = ( 18FE1E5B1628550000389A13 /* TestInfo */, 18FE1E5C1628550000389A13 /* basic.m */, ); path = NSAffineTransform; sourceTree = ""; }; 18FE1E5D1628550000389A13 /* NSArchiver */ = { isa = PBXGroup; children = ( 18FE1E5E1628550000389A13 /* TestInfo */, 18FE1E5F1628550000389A13 /* basic.m */, 18FE1E601628550000389A13 /* create.m */, 18FE1E611628550000389A13 /* general.m */, ); path = NSArchiver; sourceTree = ""; }; 18FE1E621628550000389A13 /* NSArray */ = { isa = PBXGroup; children = ( 18FE1E631628550000389A13 /* TestInfo */, 18FE1E641628550000389A13 /* basic.m */, 18FE1E651628550000389A13 /* blocks.m */, 18FE1E661628550000389A13 /* create.m */, 18FE1E671628550000389A13 /* general.m */, 18FE1E681628550000389A13 /* random.plist */, 18FE1E691628550000389A13 /* sorted.plist */, 18FE1E6A1628550000389A13 /* test.plist */, ); path = NSArray; sourceTree = ""; }; 18FE1E6B1628550000389A13 /* NSAttributedString */ = { isa = PBXGroup; children = ( 18FE1E6C1628550000389A13 /* TestInfo */, 18FE1E6D1628550000389A13 /* basic.m */, 18FE1E6E1628550000389A13 /* test00.m */, ); path = NSAttributedString; sourceTree = ""; }; 18FE1E6F1628550000389A13 /* NSAutoreleasePool */ = { isa = PBXGroup; children = ( 18FE1E701628550000389A13 /* TestInfo */, 18FE1E711628550000389A13 /* autorelease_eh.m */, 18FE1E721628550000389A13 /* basic.m */, ); path = NSAutoreleasePool; sourceTree = ""; }; 18FE1E731628550000389A13 /* NSBlock */ = { isa = PBXGroup; children = ( 18FE1E741628550000389A13 /* blockassign.m */, ); path = NSBlock; sourceTree = ""; }; 18FE1E751628550000389A13 /* NSBundle */ = { isa = PBXGroup; children = ( 18FE1E761628550000389A13 /* GNUmakefile.preamble */, 18FE1E771628550000389A13 /* Resources */, 18FE1E801628550000389A13 /* TestInfo */, 18FE1E811628550000389A13 /* basic.m */, 18FE1E821628550000389A13 /* create.m */, 18FE1E831628550000389A13 /* general.m */, 18FE1E841628550000389A13 /* load */, 18FE1E871628550000389A13 /* resources.m */, 18FE1E881628550000389A13 /* resources2.m */, ); path = NSBundle; sourceTree = ""; }; 18FE1E771628550000389A13 /* Resources */ = { isa = PBXGroup; children = ( 18FE1E781628550000389A13 /* TextRes.txt */, 18FE1E7B1628550000389A13 /* GNUmakefile */, 18FE1E7C1628550000389A13 /* NonLocalRes.txt */, 18FE1E7D1628550000389A13 /* TestBundle.m */, 18FE1E7E1628550000389A13 /* TestBundleInfo.plist */, ); path = Resources; sourceTree = ""; }; 18FE1E841628550000389A13 /* load */ = { isa = PBXGroup; children = ( 18FE1E851628550000389A13 /* GNUmakefile.preamble */, 18FE1E861628550000389A13 /* load.m */, ); path = load; sourceTree = ""; }; 18FE1E891628550000389A13 /* NSCalendar */ = { isa = PBXGroup; children = ( 18FE1E8A1628550000389A13 /* TestInfo */, 18FE1E8B1628550000389A13 /* basic.m */, 18FE1E8C1628550000389A13 /* create.m */, ); path = NSCalendar; sourceTree = ""; }; 18FE1E8D1628550000389A13 /* NSCalendarDate */ = { isa = PBXGroup; children = ( 18FE1E8E1628550000389A13 /* TestInfo */, 18FE1E8F1628550000389A13 /* basic.m */, 18FE1E901628550000389A13 /* test00.m */, 18FE1E911628550000389A13 /* test01.m */, 18FE1E921628550000389A13 /* test02.m */, 18FE1E931628550000389A13 /* western.h */, ); path = NSCalendarDate; sourceTree = ""; }; 18FE1E941628550000389A13 /* NSCharacterSet */ = { isa = PBXGroup; children = ( 18FE1E951628550000389A13 /* TestInfo */, 18FE1E961628550000389A13 /* basic.m */, 18FE1E971628550000389A13 /* class.m */, 18FE1E981628550000389A13 /* general.m */, 18FE1E991628550000389A13 /* illegalCharacterSet.m */, ); path = NSCharacterSet; sourceTree = ""; }; 18FE1E9A1628550000389A13 /* NSConnection */ = { isa = PBXGroup; children = ( 18FE1E9B1628550000389A13 /* GNUmakefile.preamble */, 18FE1E9C1628550000389A13 /* Resources */, 18FE1E9F1628550000389A13 /* TestInfo */, 18FE1EA01628550000389A13 /* basic.m */, 18FE1EA11628550000389A13 /* connection.m */, ); path = NSConnection; sourceTree = ""; }; 18FE1E9C1628550000389A13 /* Resources */ = { isa = PBXGroup; children = ( 18FE1E9D1628550000389A13 /* Connection.m */, 18FE1E9E1628550000389A13 /* GNUmakefile */, ); path = Resources; sourceTree = ""; }; 18FE1EA21628550000389A13 /* NSCountedSet */ = { isa = PBXGroup; children = ( 18FE1EA31628550000389A13 /* TestInfo */, 18FE1EA41628550000389A13 /* basic.m */, ); path = NSCountedSet; sourceTree = ""; }; 18FE1EA51628550000389A13 /* NSData */ = { isa = PBXGroup; children = ( 18FE1EA61628550000389A13 /* TestInfo */, 18FE1EA71628550000389A13 /* basic.m */, 18FE1EA81628550000389A13 /* general.m */, ); path = NSData; sourceTree = ""; }; 18FE1EA91628550000389A13 /* NSDate */ = { isa = PBXGroup; children = ( 18FE1EAA1628550000389A13 /* TestInfo */, 18FE1EAB1628550000389A13 /* basic.m */, 18FE1EAC1628550000389A13 /* create.m */, 18FE1EAD1628550000389A13 /* general.m */, ); path = NSDate; sourceTree = ""; }; 18FE1EAE1628550000389A13 /* NSDateFormatter */ = { isa = PBXGroup; children = ( 18FE1EAF1628550000389A13 /* TestInfo */, 18FE1EB01628550000389A13 /* general.m */, ); path = NSDateFormatter; sourceTree = ""; }; 18FE1EB11628550000389A13 /* NSDictionary */ = { isa = PBXGroup; children = ( 18FE1EB21628550100389A13 /* TestInfo */, 18FE1EB31628550100389A13 /* basic.m */, 18FE1EB41628550100389A13 /* blocks.m */, 18FE1EB51628550100389A13 /* create.m */, 18FE1EB61628550100389A13 /* general.m */, ); path = NSDictionary; sourceTree = ""; }; 18FE1EB71628550100389A13 /* NSException */ = { isa = PBXGroup; children = ( 18FE1EB81628550100389A13 /* TestInfo */, 18FE1EB91628550100389A13 /* basic.m */, 18FE1EBA1628550100389A13 /* basic.m.abort */, 18FE1EBB1628550100389A13 /* mixedException.mm */, 18FE1EBC1628550100389A13 /* sillySemantics.mm */, 18FE1EBD1628550100389A13 /* skipCatchall.mm */, 18FE1EBE1628550100389A13 /* throwstr.m */, ); path = NSException; sourceTree = ""; }; 18FE1EBF1628550100389A13 /* NSFileHandle */ = { isa = PBXGroup; children = ( 18FE1EC01628550100389A13 /* TestInfo */, 18FE1EC11628550100389A13 /* basic.m */, 18FE1EC21628550100389A13 /* general.m */, 18FE1EC31628550100389A13 /* socket.m */, ); path = NSFileHandle; sourceTree = ""; }; 18FE1EC41628550100389A13 /* NSFileManager */ = { isa = PBXGroup; children = ( 18FE1EC51628550100389A13 /* NSFileManagerTestDir */, 18FE1EC61628550100389A13 /* TestInfo */, 18FE1EC71628550100389A13 /* basic.m */, 18FE1EC81628550100389A13 /* general.m */, 18FE1EC91628550100389A13 /* unrepresentable_filenames.m */, ); path = NSFileManager; sourceTree = ""; }; 18FE1EC51628550100389A13 /* NSFileManagerTestDir */ = { isa = PBXGroup; children = ( ); path = NSFileManagerTestDir; sourceTree = ""; }; 18FE1ECA1628550100389A13 /* NSHTTPCookie */ = { isa = PBXGroup; children = ( 18FE1ECB1628550100389A13 /* TestInfo */, 18FE1ECC1628550100389A13 /* basic.m */, ); path = NSHTTPCookie; sourceTree = ""; }; 18FE1ECD1628550100389A13 /* NSHashTable */ = { isa = PBXGroup; children = ( 18FE1ECE1628550100389A13 /* TestInfo */, 18FE1ECF1628550100389A13 /* basic.m */, 18FE1ED01628550100389A13 /* create.m */, 18FE1ED11628550100389A13 /* general.m */, ); path = NSHashTable; sourceTree = ""; }; 18FE1ED21628550100389A13 /* NSHost */ = { isa = PBXGroup; children = ( 18FE1ED31628550100389A13 /* TestInfo */, 18FE1ED41628550100389A13 /* basic.m */, 18FE1ED51628550100389A13 /* create.m */, ); path = NSHost; sourceTree = ""; }; 18FE1ED61628550100389A13 /* NSIndexPath */ = { isa = PBXGroup; children = ( 18FE1ED71628550100389A13 /* TestInfo */, 18FE1ED81628550100389A13 /* general.m */, ); path = NSIndexPath; sourceTree = ""; }; 18FE1ED91628550100389A13 /* NSInvocation */ = { isa = PBXGroup; children = ( 18FE1EDA1628550100389A13 /* GNUmakefile.preamble */, 18FE1EDB1628550100389A13 /* InvokeProxyProtocol.h */, 18FE1EDC1628550100389A13 /* Resources */, 18FE1EE01628550100389A13 /* TestInfo */, 18FE1EE11628550100389A13 /* basic.m */, 18FE1EE21628550100389A13 /* general.m */, 18FE1EE31628550100389A13 /* test01.m */, ); path = NSInvocation; sourceTree = ""; }; 18FE1EDC1628550100389A13 /* Resources */ = { isa = PBXGroup; children = ( 18FE1EDD1628550100389A13 /* GNUmakefile */, 18FE1EDE1628550100389A13 /* InvokeProxy.h */, 18FE1EDF1628550100389A13 /* InvokeProxy.m */, ); path = Resources; sourceTree = ""; }; 18FE1EE41628550100389A13 /* NSJSONSerialization */ = { isa = PBXGroup; children = ( 18FE1EE51628550100389A13 /* TestInfo */, 18FE1EE61628550100389A13 /* json.m */, ); path = NSJSONSerialization; sourceTree = ""; }; 18FE1EE71628550100389A13 /* NSKeyedArchiver */ = { isa = PBXGroup; children = ( 18FE1EE81628550100389A13 /* TestInfo */, 18FE1EE91628550100389A13 /* basic.m */, 18FE1EEA1628550100389A13 /* create.m */, 18FE1EEB1628550100389A13 /* general.m */, ); path = NSKeyedArchiver; sourceTree = ""; }; 18FE1EEC1628550100389A13 /* NSLocale */ = { isa = PBXGroup; children = ( 18FE1EED1628550100389A13 /* TestInfo */, 18FE1EEE1628550100389A13 /* basic.m */, 18FE1EEF1628550100389A13 /* create.m */, 18FE1EF01628550100389A13 /* general.m */, ); path = NSLocale; sourceTree = ""; }; 18FE1EF11628550100389A13 /* NSLock */ = { isa = PBXGroup; children = ( 18FE1EF21628550100389A13 /* GNUmakefile.preamble */, 18FE1EF31628550100389A13 /* Helpers */, 18FE1EF71628550100389A13 /* RecursiveLock.m */, 18FE1EF81628550100389A13 /* TestInfo */, 18FE1EF91628550100389A13 /* condlock.m */, 18FE1EFA1628550100389A13 /* doubleLocking.m */, 18FE1EFB1628550100389A13 /* tryLock.m */, ); path = NSLock; sourceTree = ""; }; 18FE1EF31628550100389A13 /* Helpers */ = { isa = PBXGroup; children = ( 18FE1EF41628550100389A13 /* GNUmakefile */, 18FE1EF51628550100389A13 /* doubleNSConditionLock.m */, 18FE1EF61628550100389A13 /* doubleNSLock.m */, ); path = Helpers; sourceTree = ""; }; 18FE1EFC1628550100389A13 /* NSMapTable */ = { isa = PBXGroup; children = ( 18FE1EFD1628550100389A13 /* TestInfo */, 18FE1EFE1628550100389A13 /* basic.m */, 18FE1EFF1628550100389A13 /* create.m */, 18FE1F001628550100389A13 /* general.m */, ); path = NSMapTable; sourceTree = ""; }; 18FE1F011628550100389A13 /* NSMethodSignature */ = { isa = PBXGroup; children = ( 18FE1F021628550100389A13 /* TestInfo */, 18FE1F031628550100389A13 /* general.m */, ); path = NSMethodSignature; sourceTree = ""; }; 18FE1F041628550100389A13 /* NSMutableArray */ = { isa = PBXGroup; children = ( 18FE1F051628550100389A13 /* TestInfo */, 18FE1F061628550100389A13 /* basic.m */, 18FE1F071628550100389A13 /* create.m */, 18FE1F081628550100389A13 /* general.m */, ); path = NSMutableArray; sourceTree = ""; }; 18FE1F091628550100389A13 /* NSMutableAttributedString */ = { isa = PBXGroup; children = ( 18FE1F0A1628550100389A13 /* TestInfo */, 18FE1F0B1628550100389A13 /* basic.m */, 18FE1F0C1628550100389A13 /* test00.m */, 18FE1F0D1628550100389A13 /* test01.m */, ); path = NSMutableAttributedString; sourceTree = ""; }; 18FE1F0E1628550100389A13 /* NSMutableCharacterSet */ = { isa = PBXGroup; children = ( 18FE1F0F1628550100389A13 /* TestInfo */, 18FE1F101628550100389A13 /* basic.m */, 18FE1F111628550100389A13 /* test00.m */, ); path = NSMutableCharacterSet; sourceTree = ""; }; 18FE1F121628550100389A13 /* NSMutableData */ = { isa = PBXGroup; children = ( 18FE1F131628550100389A13 /* TestInfo */, 18FE1F141628550100389A13 /* basic.m */, 18FE1F151628550100389A13 /* general.m */, ); path = NSMutableData; sourceTree = ""; }; 18FE1F161628550100389A13 /* NSMutableDictionary */ = { isa = PBXGroup; children = ( 18FE1F171628550100389A13 /* TestInfo */, 18FE1F181628550100389A13 /* basic.m */, 18FE1F191628550100389A13 /* general.m */, ); path = NSMutableDictionary; sourceTree = ""; }; 18FE1F1A1628550100389A13 /* NSMutableIndexSet */ = { isa = PBXGroup; children = ( 18FE1F1B1628550100389A13 /* TestInfo */, 18FE1F1C1628550100389A13 /* blocks.m */, 18FE1F1D1628550100389A13 /* test0.m */, 18FE1F1E1628550100389A13 /* test1.m */, ); path = NSMutableIndexSet; sourceTree = ""; }; 18FE1F1F1628550100389A13 /* NSMutableSet */ = { isa = PBXGroup; children = ( 18FE1F201628550100389A13 /* TestInfo */, 18FE1F211628550100389A13 /* basic.m */, ); path = NSMutableSet; sourceTree = ""; }; 18FE1F221628550100389A13 /* NSMutableString */ = { isa = PBXGroup; children = ( 18FE1F231628550100389A13 /* GNUmakefile.preamble */, 18FE1F241628550100389A13 /* NSMutableString_string.m */, 18FE1F251628550100389A13 /* TestInfo */, 18FE1F261628550100389A13 /* basic.m */, ); path = NSMutableString; sourceTree = ""; }; 18FE1F271628550100389A13 /* NSNumber */ = { isa = PBXGroup; children = ( 18FE1F281628550100389A13 /* TestInfo */, 18FE1F291628550100389A13 /* basic.m */, 18FE1F2A1628550100389A13 /* test00.m */, 18FE1F2B1628550100389A13 /* test01.m */, ); path = NSNumber; sourceTree = ""; }; 18FE1F2C1628550100389A13 /* NSNumberFormatter */ = { isa = PBXGroup; children = ( 18FE1F2D1628550100389A13 /* TestInfo */, 18FE1F2E1628550100389A13 /* basic.m */, 18FE1F2F1628550100389A13 /* basic10_4.m */, ); path = NSNumberFormatter; sourceTree = ""; }; 18FE1F301628550100389A13 /* NSObject */ = { isa = PBXGroup; children = ( 18FE1F311628550100389A13 /* TestInfo */, 18FE1F321628550100389A13 /* basic.m */, 18FE1F331628550100389A13 /* initialize.m */, 18FE1F341628550100389A13 /* objc++.mm */, 18FE1F351628550100389A13 /* test00.m */, 18FE1F361628550100389A13 /* test01.m */, 18FE1F371628550100389A13 /* test02.m */, ); path = NSObject; sourceTree = ""; }; 18FE1F381628550100389A13 /* NSOperation */ = { isa = PBXGroup; children = ( 18FE1F391628550100389A13 /* TestInfo */, 18FE1F3A1628550100389A13 /* basic.m */, 18FE1F3B1628550100389A13 /* concurrent.m */, 18FE1F3C1628550100389A13 /* threads.m */, ); path = NSOperation; sourceTree = ""; }; 18FE1F3D1628550100389A13 /* NSOrderedSet */ = { isa = PBXGroup; children = ( 18FE1F3E1628550100389A13 /* TestInfo */, 18FE1F3F1628550100389A13 /* basic.m */, ); path = NSOrderedSet; sourceTree = ""; }; 18FE1F401628550100389A13 /* NSPointerArray */ = { isa = PBXGroup; children = ( 18FE1F411628550100389A13 /* TestInfo */, 18FE1F421628550100389A13 /* basic.m */, 18FE1F431628550100389A13 /* create.m */, 18FE1F441628550100389A13 /* general.m */, ); path = NSPointerArray; sourceTree = ""; }; 18FE1F451628550100389A13 /* NSPredicate */ = { isa = PBXGroup; children = ( 18FE1F461628550100389A13 /* TestInfo */, 18FE1F471628550100389A13 /* basic.m */, ); path = NSPredicate; sourceTree = ""; }; 18FE1F481628550100389A13 /* NSProcessInfo */ = { isa = PBXGroup; children = ( 18FE1F491628550100389A13 /* TestInfo */, 18FE1F4A1628550100389A13 /* basic.m */, 18FE1F4B1628550100389A13 /* general.m */, ); path = NSProcessInfo; sourceTree = ""; }; 18FE1F4C1628550100389A13 /* NSProxy */ = { isa = PBXGroup; children = ( 18FE1F4D1628550100389A13 /* TestInfo */, 18FE1F4E1628550100389A13 /* basic.m */, 18FE1F4F1628550100389A13 /* test00.m */, 18FE1F501628550100389A13 /* test01.m */, ); path = NSProxy; sourceTree = ""; }; 18FE1F511628550100389A13 /* NSRunLoop */ = { isa = PBXGroup; children = ( 18FE1F521628550100389A13 /* TestInfo */, 18FE1F531628550100389A13 /* basic.m */, 18FE1F541628550100389A13 /* general.m */, 18FE1F551628550100389A13 /* performers.m */, 18FE1F561628550100389A13 /* thread.m */, ); path = NSRunLoop; sourceTree = ""; }; 18FE1F571628550100389A13 /* NSScanner */ = { isa = PBXGroup; children = ( 18FE1F581628550100389A13 /* TestInfo */, 18FE1F591628550100389A13 /* test00.m */, 18FE1F5A1628550100389A13 /* test01.m */, ); path = NSScanner; sourceTree = ""; }; 18FE1F5B1628550100389A13 /* NSSet */ = { isa = PBXGroup; children = ( 18FE1F5C1628550100389A13 /* TestInfo */, 18FE1F5D1628550100389A13 /* basic.m */, ); path = NSSet; sourceTree = ""; }; 18FE1F5E1628550100389A13 /* NSSortDescriptor */ = { isa = PBXGroup; children = ( 18FE1F5F1628550100389A13 /* TestInfo */, 18FE1F601628550100389A13 /* basic.m */, ); path = NSSortDescriptor; sourceTree = ""; }; 18FE1F611628550100389A13 /* NSStream */ = { isa = PBXGroup; children = ( 18FE1F621628550100389A13 /* TestInfo */, 18FE1F631628550100389A13 /* basic.m */, 18FE1F641628550100389A13 /* memandfile.m */, 18FE1F651628550100389A13 /* memandfile_2.m */, 18FE1F661628550100389A13 /* pipe.m */, 18FE1F671628550100389A13 /* socket.m */, 18FE1F681628550100389A13 /* socket_cs.m */, ); path = NSStream; sourceTree = ""; }; 18FE1F691628550100389A13 /* NSString */ = { isa = PBXGroup; children = ( 18FE1F6A1628550100389A13 /* NSString_base.m */, 18FE1F6B1628550100389A13 /* NSString_custom.m */, 18FE1F6C1628550100389A13 /* NSString_tests.h */, 18FE1F6D1628550100389A13 /* NSString_zero_hash.m */, 18FE1F6E1628550100389A13 /* TestInfo */, 18FE1F6F1628550100389A13 /* basic.m */, 18FE1F701628550100389A13 /* bom.m */, 18FE1F711628550100389A13 /* boolValue.m */, 18FE1F721628550100389A13 /* locale.m */, 18FE1F731628550100389A13 /* nuls_in_strings.m */, 18FE1F741628550100389A13 /* order.m */, 18FE1F751628550100389A13 /* regex.m */, 18FE1F761628550100389A13 /* test00.m */, 18FE1F771628550100389A13 /* test01.m */, 18FE1F781628550100389A13 /* test02.m */, 18FE1F791628550100389A13 /* test03.m */, 18FE1F7A1628550100389A13 /* test04.m */, 18FE1F7B1628550100389A13 /* test05.m */, 18FE1F7C1628550100389A13 /* test06.m */, 18FE1F7D1628550100389A13 /* test07.m */, 18FE1F7E1628550100389A13 /* utf8bom.txt */, ); path = NSString; sourceTree = ""; }; 18FE1F7F1628550100389A13 /* NSTask */ = { isa = PBXGroup; children = ( 18FE1F801628550100389A13 /* GNUmakefile.preamble */, 18FE1F811628550100389A13 /* Helpers */, 18FE1F871628550100389A13 /* TestInfo */, 18FE1F881628550100389A13 /* basic.m */, 18FE1F891628550100389A13 /* general.m */, 18FE1F8A1628550100389A13 /* launch.m */, 18FE1F8B1628550100389A13 /* zombie.m */, ); path = NSTask; sourceTree = ""; }; 18FE1F811628550100389A13 /* Helpers */ = { isa = PBXGroup; children = ( 18FE1F821628550100389A13 /* GNUmakefile */, 18FE1F831628550100389A13 /* NSZombie.m */, 18FE1F841628550100389A13 /* processgroup.m */, 18FE1F851628550100389A13 /* testcat.m */, 18FE1F861628550100389A13 /* testecho.m */, ); path = Helpers; sourceTree = ""; }; 18FE1F8C1628550100389A13 /* NSThread */ = { isa = PBXGroup; children = ( 18FE1F8D1628550100389A13 /* lazy_thread.m */, ); path = NSThread; sourceTree = ""; }; 18FE1F8E1628550100389A13 /* NSTimeZone */ = { isa = PBXGroup; children = ( 18FE1F8F1628550100389A13 /* TestInfo */, 18FE1F901628550100389A13 /* basic.m */, 18FE1F911628550100389A13 /* create.m */, 18FE1F921628550100389A13 /* use.m */, ); path = NSTimeZone; sourceTree = ""; }; 18FE1F931628550100389A13 /* NSURL */ = { isa = PBXGroup; children = ( 18FE1F941628550100389A13 /* Chunked.dat */, 18FE1F951628550100389A13 /* GNUmakefile.preamble */, 18FE1F961628550100389A13 /* Helpers */, 18FE1F9B1628550100389A13 /* TestInfo */, 18FE1F9C1628550100389A13 /* basic.m */, 18FE1F9D1628550100389A13 /* test00.m */, 18FE1F9E1628550100389A13 /* test01.m */, ); path = NSURL; sourceTree = ""; }; 18FE1F961628550100389A13 /* Helpers */ = { isa = PBXGroup; children = ( 18FE1F971628550100389A13 /* GNUmakefile */, 18FE1F981628550100389A13 /* capture.m */, 18FE1F991628550100389A13 /* keepalive.m */, 18FE1F9A1628550100389A13 /* respond.m */, ); path = Helpers; sourceTree = ""; }; 18FE1F9F1628550100389A13 /* NSURLConnection */ = { isa = PBXGroup; children = ( 18FE1FA01628550100389A13 /* TestInfo */, 18FE1FA11628550100389A13 /* basic.m */, ); path = NSURLConnection; sourceTree = ""; }; 18FE1FA21628550100389A13 /* NSURLHandle */ = { isa = PBXGroup; children = ( 18FE1FA31628550100389A13 /* GNUmakefile.preamble */, 18FE1FA41628550100389A13 /* Helpers */, 18FE1FA71628550100389A13 /* TestInfo */, 18FE1FA81628550100389A13 /* basic.m */, 18FE1FA91628550100389A13 /* test00.m */, 18FE1FAA1628550100389A13 /* test01.m */, ); path = NSURLHandle; sourceTree = ""; }; 18FE1FA41628550100389A13 /* Helpers */ = { isa = PBXGroup; children = ( 18FE1FA51628550100389A13 /* GNUmakefile */, 18FE1FA61628550100389A13 /* StatusServer.m */, ); path = Helpers; sourceTree = ""; }; 18FE1FAB1628550100389A13 /* NSURLProtocol */ = { isa = PBXGroup; children = ( 18FE1FAC1628550100389A13 /* TestInfo */, 18FE1FAD1628550100389A13 /* basic.m */, ); path = NSURLProtocol; sourceTree = ""; }; 18FE1FAE1628550100389A13 /* NSURLRequest */ = { isa = PBXGroup; children = ( 18FE1FAF1628550100389A13 /* TestInfo */, 18FE1FB01628550100389A13 /* basic.m */, ); path = NSURLRequest; sourceTree = ""; }; 18FE1FB11628550100389A13 /* NSUndoManager */ = { isa = PBXGroup; children = ( 18FE1FB21628550100389A13 /* NSUndoManager_basic.m */, 18FE1FB31628550100389A13 /* NSUndoManager_notifications.m */, 18FE1FB41628550100389A13 /* TestInfo */, ); path = NSUndoManager; sourceTree = ""; }; 18FE1FB51628550100389A13 /* NSUserDefaults */ = { isa = PBXGroup; children = ( 18FE1FB61628550100389A13 /* TestInfo */, 18FE1FB71628550100389A13 /* basic.m */, 18FE1FB81628550100389A13 /* general.m */, ); path = NSUserDefaults; sourceTree = ""; }; 18FE1FB91628550100389A13 /* NSXMLDocument */ = { isa = PBXGroup; children = ( 18FE1FBA1628550100389A13 /* TestInfo */, 18FE1FBB1628550100389A13 /* basic.m */, 18FE1FBC1628550100389A13 /* cdata.m */, ); path = NSXMLDocument; sourceTree = ""; }; 18FE1FBD1628550100389A13 /* NSXMLElement */ = { isa = PBXGroup; children = ( 18FE1FBE1628550100389A13 /* TestInfo */, 18FE1FBF1628550100389A13 /* attributes.m */, 18FE1FC01628550100389A13 /* basic.m */, 18FE1FC11628550100389A13 /* children.m */, 18FE1FC21628550100389A13 /* transfer.m */, ); path = NSXMLElement; sourceTree = ""; }; 18FE1FC31628550100389A13 /* NSXMLNode */ = { isa = PBXGroup; children = ( 18FE1FC41628550100389A13 /* TestInfo */, 18FE1FC51628550100389A13 /* basic.m */, 18FE1FC61628550100389A13 /* children.m */, 18FE1FC71628550100389A13 /* description.m */, 18FE1FC81628550100389A13 /* kinds.m */, 18FE1FC91628550100389A13 /* namespaces.m */, ); path = NSXMLNode; sourceTree = ""; }; 18FE1FCA1628550100389A13 /* NSXMLParser */ = { isa = PBXGroup; children = ( 18FE1FCB1628550100389A13 /* ParseData */, 18FE1FCE1628550100389A13 /* TestInfo */, 18FE1FCF1628550100389A13 /* basic.m */, 18FE1FD01628550100389A13 /* parse.m */, ); path = NSXMLParser; sourceTree = ""; }; 18FE1FCB1628550100389A13 /* ParseData */ = { isa = PBXGroup; children = ( 18FE1FCC1628550100389A13 /* internal-document.result */, 18FE1FCD1628550100389A13 /* internal-document.xml */, ); path = ParseData; sourceTree = ""; }; 18FE1FD11628550100389A13 /* PropertyLists */ = { isa = PBXGroup; children = ( 18FE1FD21628550100389A13 /* TestInfo */, 18FE1FD31628550100389A13 /* non_ascii.m */, 18FE1FD41628550100389A13 /* non_ascii_utf16.plist */, 18FE1FD51628550100389A13 /* non_ascii_utf16.strings */, 18FE1FD61628550100389A13 /* non_ascii_utf8.plist */, 18FE1FD71628550100389A13 /* non_ascii_utf8.strings */, 18FE1FD81628550100389A13 /* test00.m */, 18FE1FD91628550100389A13 /* test01.m */, 18FE1FDA1628550100389A13 /* xml.m */, ); path = PropertyLists; sourceTree = ""; }; 18FE1FDC1628550100389A13 /* Unicode */ = { isa = PBXGroup; children = ( 18FE1FDD1628550100389A13 /* TestInfo */, 18FE1FDE1628550100389A13 /* test00.m */, ); path = Unicode; sourceTree = ""; }; 18FE1FDF1628550100389A13 /* coding */ = { isa = PBXGroup; children = ( 18578359175525A400CB7160 /* NSArray.1.32bit */, 1857835A175525A400CB7160 /* NSArray.1.64bit */, 1857835B175525A400CB7160 /* NSAttributedString.0.32bit */, 1857835C175525A400CB7160 /* NSAttributedString.0.64bit */, 1857835D175525A400CB7160 /* NSCharacterSet.0.32bit */, 1857835E175525A400CB7160 /* NSCharacterSet.0.64bit */, 1857835F175525A400CB7160 /* NSData.0.32bit */, 18578360175525A400CB7160 /* NSData.0.64bit */, 18578361175525A400CB7160 /* NSDate.1.32bit */, 18578362175525A400CB7160 /* NSDate.1.64bit */, 18578363175525A400CB7160 /* NSDateFormatter.0.32bit */, 18578364175525A400CB7160 /* NSDateFormatter.0.64bit */, 18578365175525A400CB7160 /* NSDictionary.0.32bit */, 18578366175525A400CB7160 /* NSDictionary.0.64bit */, 18578367175525A400CB7160 /* NSException.0.32bit */, 18578368175525A400CB7160 /* NSException.0.64bit */, 18578369175525A400CB7160 /* NSMutableData.0.32bit */, 1857836A175525A400CB7160 /* NSMutableData.0.64bit */, 1857836B175525A400CB7160 /* NSNotification.0.32bit */, 1857836C175525A400CB7160 /* NSNotification.0.64bit */, 1857836D175525A400CB7160 /* NSNull.0.32bit */, 1857836E175525A500CB7160 /* NSNull.0.64bit */, 1857836F175525A500CB7160 /* NSNumber.0.32bit */, 18578370175525A500CB7160 /* NSNumber.0.64bit */, 18578371175525A500CB7160 /* NSObject.0.32bit */, 18578372175525A500CB7160 /* NSObject.0.64bit */, 18578373175525A500CB7160 /* NSSet.0.32bit */, 18578374175525A500CB7160 /* NSSet.0.64bit */, 18578375175525A500CB7160 /* NSString.1.32bit */, 18578376175525A500CB7160 /* NSString.1.64bit */, 18578377175525A500CB7160 /* NSTableView.3.32bit */, 18578378175525A500CB7160 /* NSURL.0.32bit */, 18578379175525A500CB7160 /* NSURL.0.64bit */, 1857837A175525A500CB7160 /* NSValue.3.32bit */, 1857837B175525A500CB7160 /* NSValue.3.64bit */, 18FE1FF21628550100389A13 /* TestInfo */, 18FE1FF31628550100389A13 /* basictypes.m */, 18FE1FF41628550100389A13 /* decoding.m */, 18FE1FF51628550100389A13 /* double-8.type */, 18FE1FF61628550100389A13 /* float-4.type */, 18FE1FF71628550100389A13 /* int-4.type */, 18FE1FF81628550100389A13 /* llong-8.type */, 18FE1FF91628550100389A13 /* long-4.type */, 18FE1FFA1628550100389A13 /* schar-1.type */, 18FE1FFB1628550100389A13 /* short-2.type */, 18FE1FFC1628550100389A13 /* uchar-1.type */, 18FE1FFD1628550100389A13 /* uint-4.type */, 18FE1FFE1628550100389A13 /* ullong-8.type */, 18FE1FFF1628550100389A13 /* ulong-4.type */, 18FE20001628550100389A13 /* ushort-2.type */, ); path = coding; sourceTree = ""; }; 18FE20011628550100389A13 /* headers */ = { isa = PBXGroup; children = ( 18FE20021628550100389A13 /* GSLock.m */, 18FE20031628550100389A13 /* GSMime.m */, 18FE20041628550100389A13 /* GSObjCRuntime.m */, 18FE20051628550100389A13 /* GSXML.m */, 18FE20061628550100389A13 /* NSArchiver.m */, 18FE20071628550100389A13 /* NSArray.m */, 18FE20081628550100389A13 /* NSAttributedString.m */, 18FE20091628550100389A13 /* NSAutoreleasePool.m */, 18FE200A1628550100389A13 /* NSBundle.m */, 18FE200B1628550100389A13 /* NSByteOrder.m */, 18FE200C1628550100389A13 /* NSCalendarDate.m */, 18FE200D1628550100389A13 /* NSCharacterSet.m */, 18FE200E1628550100389A13 /* NSClassDescription.m */, 18FE200F1628550100389A13 /* NSCoder.m */, 18FE20101628550100389A13 /* NSComparisonPredicate.m */, 18FE20111628550100389A13 /* NSCompoundPredicate.m */, 18FE20121628550100389A13 /* NSConnection.m */, 18FE20131628550100389A13 /* NSData.m */, 18FE20141628550100389A13 /* NSDate.m */, 18FE20151628550100389A13 /* NSDateFormatter.m */, 18FE20161628550100389A13 /* NSDebug.m */, 18FE20171628550100389A13 /* NSDecimal.m */, 18FE20181628550100389A13 /* NSDecimalNumber.m */, 18FE20191628550100389A13 /* NSDictionary.m */, 18FE201A1628550100389A13 /* NSDistantObject.m */, 18FE201B1628550100389A13 /* NSDistributedLock.m */, 18FE201C1628550100389A13 /* NSDistributedNotificationCenter.m */, 18FE201D1628550100389A13 /* NSEnumerator.m */, 18FE201E1628550100389A13 /* NSError.m */, 18FE201F1628550100389A13 /* NSException.m */, 18FE20201628550100389A13 /* NSExpression.m */, 18FE20211628550100389A13 /* NSFileHandle.m */, 18FE20221628550100389A13 /* NSFileManager.m */, 18FE20231628550100389A13 /* NSFormatter.m */, 18FE20241628550100389A13 /* NSGeometry.m */, 18FE20251628550100389A13 /* NSHTTPCookie.m */, 18FE20261628550100389A13 /* NSHTTPCookieStorage.m */, 18FE20271628550100389A13 /* NSHashTable.m */, 18FE20281628550100389A13 /* NSHost.m */, 18FE20291628550100389A13 /* NSIndexPath.m */, 18FE202A1628550100389A13 /* NSIndexSet.m */, 18FE202B1628550100389A13 /* NSInvocation.m */, 18FE202C1628550100389A13 /* NSKeyValueCoding.m */, 18FE202D1628550100389A13 /* NSKeyValueObserving.m */, 18FE202E1628550100389A13 /* NSKeyedArchiver.m */, 18FE202F1628550100389A13 /* NSLock.m */, 18FE20301628550100389A13 /* NSMapTable.m */, 18FE20311628550100389A13 /* NSMethodSignature.m */, 18FE20321628550100389A13 /* NSNotification.m */, 18FE20331628550100389A13 /* NSNotificationQueue.m */, 18FE20341628550100389A13 /* NSNull.m */, 18FE20351628550100389A13 /* NSNumberFormatter.m */, 18FE20361628550100389A13 /* NSObjCRuntime.m */, 18FE20371628550100389A13 /* NSObject.m */, 18FE20381628550100389A13 /* NSPathUtilities.m */, 18FE20391628550100389A13 /* NSPort.m */, 18FE203A1628550100389A13 /* NSPortCoder.m */, 18FE203B1628550100389A13 /* NSPortMessage.m */, 18FE203C1628550100389A13 /* NSPortNameServer.m */, 18FE203D1628550100389A13 /* NSPredicate.m */, 18FE203E1628550100389A13 /* NSProcessInfo.m */, 18FE203F1628550100389A13 /* NSPropertyList.m */, 18FE20401628550100389A13 /* NSProtocolChecker.m */, 18FE20411628550100389A13 /* NSProxy.m */, 18FE20421628550100389A13 /* NSRange.m */, 18FE20431628550100389A13 /* NSRunLoop.m */, 18FE20441628550100389A13 /* NSScanner.m */, 18FE20451628550100389A13 /* NSSerialization.m */, 18FE20461628550100389A13 /* NSSet.m */, 18FE20471628550100389A13 /* NSSortDescriptor.m */, 18FE20481628550100389A13 /* NSStream.m */, 18FE20491628550100389A13 /* NSString.m */, 18FE204A1628550100389A13 /* NSTask.m */, 18FE204B1628550100389A13 /* NSThread.m */, 18FE204C1628550100389A13 /* NSTimeZone.m */, 18FE204D1628550100389A13 /* NSTimer.m */, 18FE204E1628550100389A13 /* NSURL.m */, 18FE204F1628550100389A13 /* NSURLAuthenticationChallenge.m */, 18FE20501628550100389A13 /* NSURLCache.m */, 18FE20511628550100389A13 /* NSURLConnection.m */, 18FE20521628550100389A13 /* NSURLCredential.m */, 18FE20531628550100389A13 /* NSURLCredentialStorage.m */, 18FE20541628550100389A13 /* NSURLDownload.m */, 18FE20551628550100389A13 /* NSURLError.m */, 18FE20561628550100389A13 /* NSURLHandle.m */, 18FE20571628550100389A13 /* NSURLProtectionSpace.m */, 18FE20581628550100389A13 /* NSURLProtocol.m */, 18FE20591628550100389A13 /* NSURLRequest.m */, 18FE205A1628550100389A13 /* NSURLResponse.m */, 18FE205B1628550100389A13 /* NSUndoManager.m */, 18FE205C1628550100389A13 /* NSUserDefaults.m */, 18FE205D1628550100389A13 /* NSValue.m */, 18FE205E1628550100389A13 /* NSXMLParser.m */, 18FE205F1628550100389A13 /* NSZone.m */, 18FE20601628550100389A13 /* ObjCXX.mm */, 18FE20611628550100389A13 /* TestInfo */, 18FE20621628550100389A13 /* Unicode.m */, ); path = headers; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ 18394B191610D8E300335E85 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( 18394B351610D9D000335E85 /* Foundation.h in Headers */, 18394B361610D9D000335E85 /* FoundationErrors.h in Headers */, 18394B371610D9D000335E85 /* NSAffineTransform.h in Headers */, 18394B381610D9D000335E85 /* NSArchiver.h in Headers */, 18394B391610D9D000335E85 /* NSArray.h in Headers */, 18394B3A1610D9D000335E85 /* NSAttributedString.h in Headers */, AD197C14189A4E98000F6CF9 /* NSUUID.h in Headers */, 18394B3B1610D9D000335E85 /* NSAutoreleasePool.h in Headers */, 18394B3C1610D9D000335E85 /* NSBundle.h in Headers */, 18394B3D1610D9D000335E85 /* NSByteOrder.h in Headers */, 18394B3E1610D9D000335E85 /* NSCache.h in Headers */, 18394B3F1610D9D000335E85 /* NSCalendar.h in Headers */, 18394B401610D9D000335E85 /* NSCalendarDate.h in Headers */, 18394B411610D9D000335E85 /* NSCharacterSet.h in Headers */, 18394B421610D9D000335E85 /* NSClassDescription.h in Headers */, 18394B431610D9D000335E85 /* NSCoder.h in Headers */, 18394B441610D9D000335E85 /* NSComparisonPredicate.h in Headers */, 18394B451610D9D000335E85 /* NSCompoundPredicate.h in Headers */, 18394B461610D9D000335E85 /* NSConnection.h in Headers */, 18394B471610D9D000335E85 /* NSData.h in Headers */, 18394B481610D9D000335E85 /* NSDate.h in Headers */, 18394B491610D9D000335E85 /* NSDateFormatter.h in Headers */, 18394B4A1610D9D000335E85 /* NSDebug.h in Headers */, 18394B4B1610D9D000335E85 /* NSDecimal.h in Headers */, 18394B4C1610D9D000335E85 /* NSDecimalNumber.h in Headers */, 18394B4D1610D9D000335E85 /* NSDictionary.h in Headers */, 18394B4E1610D9D000335E85 /* NSDistantObject.h in Headers */, 18394B4F1610D9D000335E85 /* NSDistributedLock.h in Headers */, 18394B501610D9D000335E85 /* NSDistributedNotificationCenter.h in Headers */, 18394B511610D9D000335E85 /* NSEnumerator.h in Headers */, 18394B521610D9D000335E85 /* NSError.h in Headers */, 18394B531610D9D000335E85 /* NSErrorRecoveryAttempting.h in Headers */, 18394B541610D9D000335E85 /* NSException.h in Headers */, 18394B551610D9D000335E85 /* NSExpression.h in Headers */, 18394B561610D9D000335E85 /* NSFileHandle.h in Headers */, 18394B571610D9D000335E85 /* NSFileManager.h in Headers */, 18394B581610D9D000335E85 /* NSFormatter.h in Headers */, 18394B591610D9D000335E85 /* NSGarbageCollector.h in Headers */, 18394B5A1610D9D000335E85 /* NSGeometry.h in Headers */, 18394B5B1610D9D000335E85 /* NSHTTPCookie.h in Headers */, 18394B5C1610D9D000335E85 /* NSHTTPCookieStorage.h in Headers */, 18394B5D1610D9D000335E85 /* NSHashTable.h in Headers */, 18394B5E1610D9D000335E85 /* NSHost.h in Headers */, 18394B5F1610D9D000335E85 /* NSIndexPath.h in Headers */, 18394B601610D9D000335E85 /* NSIndexSet.h in Headers */, 18394B611610D9D000335E85 /* NSInvocation.h in Headers */, 18394B621610D9D000335E85 /* NSJSONSerialization.h in Headers */, 18394B631610D9D000335E85 /* NSKeyValueCoding.h in Headers */, 18394B641610D9D000335E85 /* NSKeyValueObserving.h in Headers */, 18394B651610D9D000335E85 /* NSKeyedArchiver.h in Headers */, 18394B661610D9D000335E85 /* NSLocale.h in Headers */, 18394B671610D9D000335E85 /* NSLock.h in Headers */, 18394B681610D9D000335E85 /* NSMapTable.h in Headers */, 18394B691610D9D000335E85 /* NSMethodSignature.h in Headers */, 18394B6A1610D9D000335E85 /* NSNetServices.h in Headers */, 18394B6B1610D9D000335E85 /* NSNotification.h in Headers */, 18394B6C1610D9D000335E85 /* NSNotificationQueue.h in Headers */, 18394B6D1610D9D000335E85 /* NSNull.h in Headers */, 18394B6E1610D9D000335E85 /* NSNumberFormatter.h in Headers */, 18394B6F1610D9D000335E85 /* NSObjCRuntime.h in Headers */, 18394B701610D9D000335E85 /* NSObject.h in Headers */, 18394B711610D9D000335E85 /* NSOperation.h in Headers */, 18394B721610D9D000335E85 /* NSPathUtilities.h in Headers */, 18394B731610D9D000335E85 /* NSPointerArray.h in Headers */, 18394B741610D9D000335E85 /* NSPointerFunctions.h in Headers */, AD197C12189A4E98000F6CF9 /* NSMetadata.h in Headers */, 18394B751610D9D000335E85 /* NSPort.h in Headers */, 18394B761610D9D000335E85 /* NSPortCoder.h in Headers */, 18394B771610D9D000335E85 /* NSPortMessage.h in Headers */, 18394B781610D9D000335E85 /* NSPortNameServer.h in Headers */, 18394B791610D9D000335E85 /* NSPredicate.h in Headers */, AD197C13189A4E98000F6CF9 /* NSUserNotification.h in Headers */, 18394B7A1610D9D000335E85 /* NSProcessInfo.h in Headers */, 18394B7B1610D9D000335E85 /* NSPropertyList.h in Headers */, 18394B7C1610D9D000335E85 /* NSProtocolChecker.h in Headers */, 18394B7D1610D9D000335E85 /* NSProxy.h in Headers */, 18394B7E1610D9D000335E85 /* NSRange.h in Headers */, 18394B7F1610D9D000335E85 /* NSRegularExpression.h in Headers */, 18394B801610D9D000335E85 /* NSRunLoop.h in Headers */, 18394B811610D9D000335E85 /* NSScanner.h in Headers */, 18394B821610D9D000335E85 /* NSScriptWhoseTests.h in Headers */, 18394B831610D9D000335E85 /* NSSerialization.h in Headers */, 18394B841610D9D000335E85 /* NSSet.h in Headers */, 18394B851610D9D000335E85 /* NSSortDescriptor.h in Headers */, 18394B861610D9D000335E85 /* NSSpellServer.h in Headers */, 18394B871610D9D000335E85 /* NSStream.h in Headers */, 18394B881610D9D000335E85 /* NSString.h in Headers */, 18394B891610D9D000335E85 /* NSTask.h in Headers */, 18394B8A1610D9D000335E85 /* NSTextCheckingResult.h in Headers */, 18394B8B1610D9D000335E85 /* NSThread.h in Headers */, 18394B8C1610D9D000335E85 /* NSTimeZone.h in Headers */, 18394B8D1610D9D000335E85 /* NSTimer.h in Headers */, 18394B8E1610D9D000335E85 /* NSURL.h in Headers */, 18394B8F1610D9D000335E85 /* NSURLAuthenticationChallenge.h in Headers */, 18394B901610D9D000335E85 /* NSURLCache.h in Headers */, 18394B911610D9D000335E85 /* NSURLConnection.h in Headers */, 18394B921610D9D000335E85 /* NSURLCredential.h in Headers */, 18394B931610D9D000335E85 /* NSURLCredentialStorage.h in Headers */, 18394B941610D9D000335E85 /* NSURLDownload.h in Headers */, 18394B951610D9D000335E85 /* NSURLError.h in Headers */, 18394B961610D9D000335E85 /* NSURLHandle.h in Headers */, 18394B971610D9D000335E85 /* NSURLProtectionSpace.h in Headers */, AD197C11189A4E98000F6CF9 /* NSInvocationOperation.h in Headers */, 18394B981610D9D000335E85 /* NSURLProtocol.h in Headers */, 18394B991610D9D000335E85 /* NSURLRequest.h in Headers */, 18394B9A1610D9D000335E85 /* NSURLResponse.h in Headers */, 18394B9B1610D9D000335E85 /* NSUndoManager.h in Headers */, 18394B9C1610D9D000335E85 /* NSUserDefaults.h in Headers */, 18394B9D1610D9D000335E85 /* NSUtilities.h in Headers */, 18394B9E1610D9D000335E85 /* NSValue.h in Headers */, 18394B9F1610D9D000335E85 /* NSValueTransformer.h in Headers */, 18394BA01610D9D000335E85 /* NSXMLDTD.h in Headers */, 18394BA11610D9D000335E85 /* NSXMLDTDNode.h in Headers */, 18394BA21610D9D000335E85 /* NSXMLDocument.h in Headers */, 18394BA31610D9D000335E85 /* NSXMLElement.h in Headers */, 18394BA41610D9D000335E85 /* NSXMLNode.h in Headers */, 18394BA51610D9D000335E85 /* NSXMLNodeOptions.h in Headers */, 18394BA61610D9D000335E85 /* NSXMLParser.h in Headers */, 18394BA71610D9D000335E85 /* NSZone.h in Headers */, 18394BA81610D9ED00335E85 /* NSArray+GNUstepBase.h in Headers */, 18394BA91610D9ED00335E85 /* NSAttributedString+GNUstepBase.h in Headers */, 18394BAA1610D9ED00335E85 /* NSBundle+GNUstepBase.h in Headers */, 18394BAB1610D9ED00335E85 /* NSCalendarDate+GNUstepBase.h in Headers */, 18394BAC1610D9ED00335E85 /* NSData+GNUstepBase.h in Headers */, 18394BAD1610D9ED00335E85 /* NSDebug+GNUstepBase.h in Headers */, 18394BAE1610D9ED00335E85 /* NSFileHandle+GNUstepBase.h in Headers */, 18394BAF1610D9ED00335E85 /* NSLock+GNUstepBase.h in Headers */, 18394BB01610D9ED00335E85 /* NSMutableString+GNUstepBase.h in Headers */, 18394BB11610D9ED00335E85 /* NSNetServices+GNUstepBase.h in Headers */, 18394BB21610D9ED00335E85 /* NSNumber+GNUstepBase.h in Headers */, 18394BB31610D9ED00335E85 /* NSObject+GNUstepBase.h in Headers */, 18394BB41610D9ED00335E85 /* NSProcessInfo+GNUstepBase.h in Headers */, 18394BB51610D9ED00335E85 /* NSStream+GNUstepBase.h in Headers */, 18394BB61610D9ED00335E85 /* NSString+GNUstepBase.h in Headers */, 18394BB71610D9ED00335E85 /* NSTask+GNUstepBase.h in Headers */, 18394BB81610D9ED00335E85 /* NSThread+GNUstepBase.h in Headers */, 18394BB91610D9ED00335E85 /* NSURL+GNUstepBase.h in Headers */, 18394C7D1610EC5E00335E85 /* NSCallBacks.h in Headers */, 18394C7E1610EC5E00335E85 /* NSCharacterSetData.h in Headers */, 18394C7F1610EC5E00335E85 /* NSConcretePointerFunctions.h in Headers */, 18394C801610EC5E00335E85 /* NSNumberMethods.h in Headers */, 18394C811610EC5E00335E85 /* NSXMLPrivate.h in Headers */, 18394B341610D95600335E85 /* Foundation-Prefix.pch in Headers */, 18EA6764172EC7F70026AC34 /* GSTypeEncoding.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ 1837DA0D1652D18400197E53 /* gdnc */ = { isa = PBXNativeTarget; buildConfigurationList = 1837DA161652D18400197E53 /* Build configuration list for PBXNativeTarget "gdnc" */; buildPhases = ( 1837DA101652D18400197E53 /* Sources */, 1837DA121652D18400197E53 /* Frameworks */, 1837DA151652D18400197E53 /* CopyFiles */, ); buildRules = ( ); dependencies = ( 1837DA0E1652D18400197E53 /* PBXTargetDependency */, ); name = gdnc; productName = keepalive; productReference = 1837DA191652D18400197E53 /* gdnc */; productType = "com.apple.product-type.tool"; }; 18394B1B1610D8E300335E85 /* Foundation */ = { isa = PBXNativeTarget; buildConfigurationList = 18394B2D1610D8E400335E85 /* Build configuration list for PBXNativeTarget "Foundation" */; buildPhases = ( 18394B171610D8E300335E85 /* Sources */, 18394B181610D8E300335E85 /* Frameworks */, 18394B191610D8E300335E85 /* Headers */, 18394B1A1610D8E300335E85 /* Resources */, ); buildRules = ( 1801C64416B5A8E400999B34 /* PBXBuildRule */, ); dependencies = ( ); name = Foundation; productName = Foundation; productReference = 18394B1C1610D8E300335E85 /* Foundation.framework */; productType = "com.apple.product-type.framework"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 18906E371610BC4C0003C892 /* Project object */ = { isa = PBXProject; attributes = { LastUpgradeCheck = 0420; }; buildConfigurationList = 18906E3A1610BC4C0003C892 /* Build configuration list for PBXProject "base" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( en, English, French, de, ); mainGroup = 18906E351610BC4C0003C892; productRefGroup = 18906E421610BC4C0003C892 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 18394B1B1610D8E300335E85 /* Foundation */, 1837DA0D1652D18400197E53 /* gdnc */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 18394B1A1610D8E300335E85 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 1837DA101652D18400197E53 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 18EFCC1F172B0B9A003304CA /* gdnc.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 18394B171610D8E300335E85 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 185289A516139AAF0016729B /* externs.m in Sources */, 180878891618537A006EBD74 /* objc-load.m in Sources */, 185289AA16139AAF0016729B /* preface.m in Sources */, 18528A001613AB940016729B /* GSRunLoopCtxt.m in Sources */, 18528A011613AB940016729B /* NSStream.m in Sources */, 1852895F161396450016729B /* GSArray.m in Sources */, 18528960161396450016729B /* GSAttributedString.m in Sources */, 18528961161396450016729B /* CXXException.m in Sources */, 18528966161396450016729B /* GSBlocks.m in Sources */, 18528967161396450016729B /* GSConcreteValue.m in Sources */, 18528969161396450016729B /* GSCountedSet.m in Sources */, 1852896A161396450016729B /* GSDictionary.m in Sources */, 1852896D161396450016729B /* GSFTPURLHandle.m in Sources */, 1852896E161396450016729B /* GSFileHandle.m in Sources */, 1852896F161396450016729B /* GSFormat.m in Sources */, 18528970161396450016729B /* GSHTTPAuthentication.m in Sources */, 18528971161396450016729B /* GSHTTPURLHandle.m in Sources */, 18528972161396450016729B /* GSICUString.m in Sources */, 18528973161396450016729B /* GSLocale.m in Sources */, 18528974161396450016729B /* GSMDNSNetServices.m in Sources */, 18528975161396450016729B /* GSQuickSort.m in Sources */, 18528976161396450016729B /* GSRunLoopWatcher.m in Sources */, 18528977161396450016729B /* GSSet.m in Sources */, 18528978161396450016729B /* GSShellSort.m in Sources */, 18528979161396450016729B /* GSSocketStream.m in Sources */, 1852897A161396450016729B /* GSStream.m in Sources */, 1852897B161396450016729B /* GSString.m in Sources */, 1852897C161396450016729B /* GSTLS.m in Sources */, 1852897D161396450016729B /* GSTimSort.m in Sources */, 1852897E161396450016729B /* GSValue.m in Sources */, 18641D211678AD41003C6E11 /* GSSocksParser.m in Sources */, 18641D221678AD46003C6E11 /* GSSocksParserPrivate.m in Sources */, 18641D1F1678AD34003C6E11 /* GSSocks4Parser.m in Sources */, 18641D201678AD39003C6E11 /* GSSocks5Parser.m in Sources */, 18528957161396130016729B /* GCArray.m in Sources */, 18528958161396160016729B /* GCDictionary.m in Sources */, 185289591613961A0016729B /* GCObject.m in Sources */, 1852895A161396200016729B /* GSFunctions.m in Sources */, 1852895B161396240016729B /* GSInsensitiveDictionary.m in Sources */, 1852895C161396280016729B /* GSLock.m in Sources */, 1852895D1613962B0016729B /* GSMime.m in Sources */, 185289511613861E0016729B /* GSObjCRuntime.m in Sources */, 1852895E161396310016729B /* GSXML.m in Sources */, 18528984161398FF0016729B /* NSArray+GNUstepBase.m in Sources */, 18528985161398FF0016729B /* NSAttributedString+GNUstepBase.m in Sources */, 18528986161398FF0016729B /* NSBundle+GNUstepBase.m in Sources */, 18528987161398FF0016729B /* NSCalendarDate+GNUstepBase.m in Sources */, 18528988161398FF0016729B /* NSData+GNUstepBase.m in Sources */, 18528989161398FF0016729B /* NSDebug+GNUstepBase.m in Sources */, 1852898A161398FF0016729B /* NSError+GNUstepBase.m in Sources */, 1852898B161398FF0016729B /* NSFileHandle+GNUstepBase.m in Sources */, 1852898C161399000016729B /* NSLock+GNUstepBase.m in Sources */, 1852898D161399000016729B /* NSMutableString+GNUstepBase.m in Sources */, 1852898E161399000016729B /* NSNumber+GNUstepBase.m in Sources */, 1852898F161399000016729B /* NSObject+GNUstepBase.m in Sources */, 18528990161399000016729B /* NSProcessInfo+GNUstepBase.m in Sources */, 18528991161399000016729B /* NSPropertyList+GNUstepBase.m in Sources */, 18528992161399000016729B /* NSStream+GNUstepBase.m in Sources */, 18528993161399000016729B /* NSString+GNUstepBase.m in Sources */, 18528994161399000016729B /* NSTask+GNUstepBase.m in Sources */, 18528995161399000016729B /* NSThread+GNUstepBase.m in Sources */, 18528996161399000016729B /* NSURL+GNUstepBase.m in Sources */, 18528997161399000016729B /* Unicode.m in Sources */, 185289A216139AAF0016729B /* NSObject+NSComparisonMethods.m in Sources */, 18394C011610EB7F00335E85 /* NSAffineTransform.m in Sources */, 1852895316138C5C0016729B /* NSArchiver.m in Sources */, 18394C031610EB7F00335E85 /* NSArray.m in Sources */, AD197C0A189A4D5F000F6CF9 /* NSUUID.m in Sources */, 18394C041610EB7F00335E85 /* NSAssertionHandler.m in Sources */, 18394C051610EB7F00335E85 /* NSAttributedString.m in Sources */, 18394C061610EB7F00335E85 /* NSAutoreleasePool.m in Sources */, 18394C071610EB7F00335E85 /* NSBundle.m in Sources */, 18394C081610EB7F00335E85 /* NSCache.m in Sources */, 18394C091610EB7F00335E85 /* NSCachedURLResponse.m in Sources */, 18394C0A1610EB7F00335E85 /* NSCalendar.m in Sources */, 18394C0B1610EB7F00335E85 /* NSCalendarDate.m in Sources */, 18394C0C1610EB7F00335E85 /* NSCallBacks.m in Sources */, 18394C0D1610EB7F00335E85 /* NSCharacterSet.m in Sources */, 18394C0E1610EB7F00335E85 /* NSClassDescription.m in Sources */, 18394C0F1610EB7F00335E85 /* NSCoder.m in Sources */, 18394C101610EB7F00335E85 /* NSConcreteHashTable.m in Sources */, 18394C111610EB7F00335E85 /* NSConcreteMapTable.m in Sources */, 18394C121610EB7F00335E85 /* NSConcretePointerFunctions.m in Sources */, 18394C131610EB7F00335E85 /* NSConnection.m in Sources */, 18394C141610EB7F00335E85 /* NSCopyObject.m in Sources */, 18394C151610EB7F00335E85 /* NSCountedSet.m in Sources */, 1852895416138CFB0016729B /* NSData.m in Sources */, 18394C171610EB7F00335E85 /* NSDate.m in Sources */, 18394C181610EB7F00335E85 /* NSDateFormatter.m in Sources */, 18394C191610EB7F00335E85 /* NSDebug.m in Sources */, 18394C1A1610EB7F00335E85 /* NSDecimal.m in Sources */, 18394C1B1610EB7F00335E85 /* NSDecimalNumber.m in Sources */, 18394C1C1610EB7F00335E85 /* NSDictionary.m in Sources */, 18394C1D1610EB7F00335E85 /* NSDistantObject.m in Sources */, 18394C1E1610EB7F00335E85 /* NSDistributedLock.m in Sources */, 18394C1F1610EB7F00335E85 /* NSDistributedNotificationCenter.m in Sources */, 18394C201610EB7F00335E85 /* NSEnumerator.m in Sources */, 18394C211610EB7F00335E85 /* NSError.m in Sources */, 18394C221610EB7F00335E85 /* NSException.m in Sources */, 18394C231610EB7F00335E85 /* NSFileHandle.m in Sources */, 18394C241610EB7F00335E85 /* NSFileManager.m in Sources */, 18394C251610EB7F00335E85 /* NSFormatter.m in Sources */, 18394C261610EB7F00335E85 /* NSGarbageCollector.m in Sources */, 18394C271610EB7F00335E85 /* NSGeometry.m in Sources */, 18394C281610EB7F00335E85 /* NSHTTPCookie.m in Sources */, 18394C291610EB7F00335E85 /* NSHTTPCookieStorage.m in Sources */, 18394C2A1610EB7F00335E85 /* NSHashTable.m in Sources */, 18394C2B1610EB7F00335E85 /* NSHost.m in Sources */, 18394C2C1610EB7F00335E85 /* NSIndexPath.m in Sources */, 18394C2D1610EB7F00335E85 /* NSIndexSet.m in Sources */, 18394C2F1610EB7F00335E85 /* NSJSONSerialization.m in Sources */, 18394C301610EB7F00335E85 /* NSKeyValueCoding.m in Sources */, 18394C341610EB7F00335E85 /* NSKeyedArchiver.m in Sources */, 185391931625FD0C0015BDFA /* NSKeyedUnarchiver.m in Sources */, 18394C361610EB7F00335E85 /* NSLocale.m in Sources */, AD197C08189A4D5F000F6CF9 /* NSMetadata.m in Sources */, AD197C09189A4D5F000F6CF9 /* NSUserNotification.m in Sources */, 18394C371610EB7F00335E85 /* NSLock.m in Sources */, 18394C381610EB7F00335E85 /* NSLog.m in Sources */, 18394C391610EB7F00335E85 /* NSMapTable.m in Sources */, 18394C3A1610EB7F00335E85 /* NSMessagePort.m in Sources */, 18394C3B1610EB7F00335E85 /* NSMessagePortNameServer.m in Sources */, 18394C3C1610EB7F00335E85 /* NSMethodSignature.m in Sources */, 18394C3D1610EB7F00335E85 /* NSNetServices.m in Sources */, 18394C3E1610EB7F00335E85 /* NSNotification.m in Sources */, 185289FF1613A8840016729B /* NSNotificationCenter.m in Sources */, 18394C401610EB7F00335E85 /* NSNotificationQueue.m in Sources */, AD197C07189A4D5F000F6CF9 /* NSKeyValueObserving.m in Sources */, 18394C411610EB7F00335E85 /* NSNull.m in Sources */, 18394C421610EB7F00335E85 /* NSNumber.m in Sources */, 18394C431610EB7F00335E85 /* NSNumberFormatter.m in Sources */, 1852894F161243FC0016729B /* NSObjCRuntime.m in Sources */, 18394C451610EB7F00335E85 /* NSObject.m in Sources */, 18394C461610EB7F00335E85 /* NSOperation.m in Sources */, 18394C471610EB7F00335E85 /* NSPage.m in Sources */, 18394C481610EB7F00335E85 /* NSPathUtilities.m in Sources */, 18394C491610EB7F00335E85 /* NSPipe.m in Sources */, 18394C4A1610EB7F00335E85 /* NSPointerArray.m in Sources */, 18394C4B1610EB7F00335E85 /* NSPointerFunctions.m in Sources */, AD197C05189A4D5F000F6CF9 /* NSInvocation.m in Sources */, 18394C4C1610EB7F00335E85 /* NSPort.m in Sources */, 1852895516138E6F0016729B /* NSPortCoder.m in Sources */, 18394C4E1610EB7F00335E85 /* NSPortMessage.m in Sources */, 18394C4F1610EB7F00335E85 /* NSPortNameServer.m in Sources */, 18394C501610EB7F00335E85 /* NSPredicate.m in Sources */, 18394C511610EB7F00335E85 /* NSProcessInfo.m in Sources */, 18394C521610EB7F00335E85 /* NSPropertyList.m in Sources */, 18394C531610EB7F00335E85 /* NSProtocolChecker.m in Sources */, 18394C541610EB7F00335E85 /* NSProxy.m in Sources */, 18394C551610EB7F00335E85 /* NSRange.m in Sources */, 18394C561610EB7F00335E85 /* NSRegularExpression.m in Sources */, 18394C571610EB7F00335E85 /* NSRunLoop.m in Sources */, 18394C581610EB7F00335E85 /* NSScanner.m in Sources */, 18394C591610EB7F00335E85 /* NSSerializer.m in Sources */, 18394C5A1610EB7F00335E85 /* NSSet.m in Sources */, 18394C5B1610EB7F00335E85 /* NSSocketPort.m in Sources */, 18394C5C1610EB7F00335E85 /* NSSocketPortNameServer.m in Sources */, 18394C5D1610EB7F00335E85 /* NSSortDescriptor.m in Sources */, 18394C5E1610EB7F00335E85 /* NSSpellServer.m in Sources */, 18394C5F1610EB7F00335E85 /* NSString.m in Sources */, 18394C601610EB7F00335E85 /* NSTask.m in Sources */, 18394C611610EB7F00335E85 /* NSTextCheckingResult.m in Sources */, 18394C621610EB7F00335E85 /* NSThread.m in Sources */, 18394C631610EB7F00335E85 /* NSTimeZone.m in Sources */, 18394C641610EB7F00335E85 /* NSTimer.m in Sources */, 18394C651610EB7F00335E85 /* NSURL.m in Sources */, 18394C661610EB7F00335E85 /* NSURLAuthenticationChallenge.m in Sources */, 18394C671610EB7F00335E85 /* NSURLCache.m in Sources */, 18394C681610EB7F00335E85 /* NSURLConnection.m in Sources */, 18394C691610EB7F00335E85 /* NSURLCredential.m in Sources */, 18394C6A1610EB8000335E85 /* NSURLCredentialStorage.m in Sources */, 18394C6B1610EB8000335E85 /* NSURLDownload.m in Sources */, 18394C6C1610EB8000335E85 /* NSURLHandle.m in Sources */, 18394C6D1610EB8000335E85 /* NSURLProtectionSpace.m in Sources */, 18394C6E1610EB8000335E85 /* NSURLProtocol.m in Sources */, 18394C6F1610EB8000335E85 /* NSURLRequest.m in Sources */, 18394C701610EB8000335E85 /* NSURLResponse.m in Sources */, 1852895216138A7D0016729B /* NSUnarchiver.m in Sources */, 18394C721610EB8000335E85 /* NSUndoManager.m in Sources */, 18394C731610EB8000335E85 /* NSUserDefaults.m in Sources */, 18394C741610EB8000335E85 /* NSValue.m in Sources */, 18394C751610EB8000335E85 /* NSValueTransformer.m in Sources */, 18394C761610EB8000335E85 /* NSXMLDTD.m in Sources */, 18394C771610EB8000335E85 /* NSXMLDTDNode.m in Sources */, 18394C781610EB8000335E85 /* NSXMLDocument.m in Sources */, 18394C791610EB8000335E85 /* NSXMLElement.m in Sources */, 18394C7A1610EB8000335E85 /* NSXMLNode.m in Sources */, 18394C7B1610EB8000335E85 /* NSXMLParser.m in Sources */, 18394C7C1610EB8000335E85 /* NSZone.m in Sources */, 1890B34116F3BC3300187826 /* GSPrivateHash.m in Sources */, AD197C06189A4D5F000F6CF9 /* NSInvocationOperation.m in Sources */, 18EA6761172EC6170026AC34 /* GSTypeEncoding.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ 1837DA0E1652D18400197E53 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 18394B1B1610D8E300335E85 /* Foundation */; targetProxy = 1837DA0F1652D18400197E53 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ 18FE1E781628550000389A13 /* TextRes.txt */ = { isa = PBXVariantGroup; children = ( 18FE1E791628550000389A13 /* English */, 18FE1E7A1628550000389A13 /* French */, 18FE1E7F1628550000389A13 /* de */, ); name = TextRes.txt; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ 1837DA171652D18400197E53 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_LINK_OBJC_RUNTIME = NO; GCC_PRECOMPILE_PREFIX_HEADER = NO; GCC_PREFIX_HEADER = ""; HEADER_SEARCH_PATHS = ( /usr/GNUstep/System/Library/Makefiles/TestFramework/, "$(SRCROOT)/Headers", ); OTHER_CFLAGS = ( "-DGNUSTEP", "-DGNUSTEP_BASE_LIBRARY", ); PRODUCT_NAME = gdnc; }; name = Debug; }; 1837DA181652D18400197E53 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_LINK_OBJC_RUNTIME = NO; GCC_PRECOMPILE_PREFIX_HEADER = NO; GCC_PREFIX_HEADER = ""; HEADER_SEARCH_PATHS = ( /usr/GNUstep/System/Library/Makefiles/TestFramework/, "$(SRCROOT)/Headers", ); OTHER_CFLAGS = ( "-DGNUSTEP", "-DGNUSTEP_BASE_LIBRARY", ); PRODUCT_NAME = gdnc; }; name = Release; }; 18394B2E1610D8E400335E85 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_LINK_OBJC_RUNTIME = NO; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; FRAMEWORK_VERSION = A; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_FAST_OBJC_DISPATCH = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Support/Foundation/Foundation-Prefix.pch"; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL = YES; HEADER_SEARCH_PATHS = ( /opt/local/include, /usr/include/libxml2, /opt/local/include/libxml2, "$(SRCROOT)/Headers", ); INFOPLIST_FILE = "Support/Foundation/Foundation-Info.plist"; LIBRARY_SEARCH_PATHS = /opt/local/lib; OTHER_CFLAGS = ( "-DGNUSTEP", "-DNeXT_RUNTIME", "-pthread", ); OTHER_LDFLAGS = ( "-licudata", "-licui18n", "-licuuc", "-Wl,-reexport_library", /usr/lib/libobjc.dylib, ); PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = framework; }; name = Debug; }; 18394B2F1610D8E400335E85 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CLANG_LINK_OBJC_RUNTIME = NO; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; FRAMEWORK_VERSION = A; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_FAST_OBJC_DISPATCH = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Support/Foundation/Foundation-Prefix.pch"; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL = YES; HEADER_SEARCH_PATHS = ( /opt/local/include, /usr/include/libxml2, /opt/local/include/libxml2, "$(SRCROOT)/Headers", ); INFOPLIST_FILE = "Support/Foundation/Foundation-Info.plist"; LIBRARY_SEARCH_PATHS = /opt/local/lib; OTHER_CFLAGS = ( "-DGNUSTEP", "-DNeXT_RUNTIME", "-pthread", ); OTHER_LDFLAGS = ( "-licudata", "-licui18n", "-licuuc", "-Wl,-reexport_library", /usr/lib/libobjc.dylib, ); PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = framework; }; name = Release; }; 18906E541610BC4C0003C892 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = "$(ARCHS_STANDARD_64_BIT)"; COPY_PHASE_STRIP = NO; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.6; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; }; name = Debug; }; 18906E551610BC4C0003C892 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = "$(ARCHS_STANDARD_64_BIT)"; COPY_PHASE_STRIP = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.6; SDKROOT = macosx; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 1837DA161652D18400197E53 /* Build configuration list for PBXNativeTarget "gdnc" */ = { isa = XCConfigurationList; buildConfigurations = ( 1837DA171652D18400197E53 /* Debug */, 1837DA181652D18400197E53 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 18394B2D1610D8E400335E85 /* Build configuration list for PBXNativeTarget "Foundation" */ = { isa = XCConfigurationList; buildConfigurations = ( 18394B2E1610D8E400335E85 /* Debug */, 18394B2F1610D8E400335E85 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 18906E3A1610BC4C0003C892 /* Build configuration list for PBXProject "base" */ = { isa = XCConfigurationList; buildConfigurations = ( 18906E541610BC4C0003C892 /* Debug */, 18906E551610BC4C0003C892 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 18906E371610BC4C0003C892 /* Project object */; } gnustep-base-1.29.0/config.mak.in000066400000000000000000000061671435650067400165700ustar00rootroot00000000000000# # Extra make variables for base library # # Copyright (C) 2005-2010 Free Software Foundation # Copying and distribution of this file, with or without modification, # are permitted in any medium without royalty provided the copyright # notice and this notice are preserved. WHOAMI=@WHOAMI@ DYNAMIC_LINKER=@DYNAMIC_LINKER@ HAVE_LIBXML=@HAVE_LIBXML@ HAVE_GNUTLS=@HAVE_GNUTLS@ HAVE_BLOCKS=@HAVE_BLOCKS@ WITH_FFI=@WITH_FFI@ NX_CONST_STRING_CLASS=@NX_CONST_STRING_CLASS@ OBJCFLAGS+=@OBJCFLAGS@ OBJC2RUNTIME=@OBJC2RUNTIME@ OBJCSYNC=@OBJCSYNC@ WARN_FLAGS=@WARN_FLAGS@ HAVE_INET_PTON=@HAVE_INET_PTON@ HAVE_INET_NTOP=@HAVE_INET_NTOP@ HAVE_OBJC_SYNC_ENTER=@HAVE_OBJC_SYNC_ENTER@ CONFIG_SYSTEM_INCL += @INCLUDE_FLAGS@ ifeq ($(shared),yes) CONFIG_SYSTEM_LIBS += @LIBS@ CONFIG_SYSTEM_LIB_DIR += @LDIR_FLAGS@ endif GNUSTEP_INSTALL_GDOMAP_AS_SETUID=@GNUSTEP_INSTALL_GDOMAP_AS_SETUID@ GNUSTEP_GDOMAP_PORT_OVERRIDE=@GNUSTEP_GDOMAP_PORT_OVERRIDE@ GNUSTEP_BASE_HAVE_AVAHI=@HAVE_AVAHI@ GNUSTEP_BASE_HAVE_GNUTLS=@HAVE_GNUTLS@ GNUSTEP_BASE_HAVE_ICU=@HAVE_ICU@ GNUSTEP_BASE_HAVE_LIBCURL=@HAVE_LIBCURL@ GNUSTEP_BASE_HAVE_LIBDISPATCH=@HAVE_LIBDISPATCH@ GNUSTEP_BASE_HAVE_LIBDISPATCH_RUNLOOP=@HAVE_LIBDISPATCH_RUNLOOP@ GNUSTEP_BASE_HAVE_LIBXML=@HAVE_LIBXML@ GNUSTEP_BASE_HAVE_MDNS=@HAVE_MDNS@ # Default to building only -baseadd # on non *-gnu-* library combos ifneq ($(FOUNDATION_LIB),gnu) add=yes base=no endif GNUSTEP_BASE_DOMAIN=@GNUSTEP_BASE_DOMAIN@ GNUSTEP_BASE_RELATIVE_PATHS=@GNUSTEP_BASE_RELATIVE_PATHS@ # Any global prefprocessor defines can be added here DEFS= ifeq ($(GNUSTEP_BASE_RELATIVE_PATHS), yes) ifneq ($(GNUSTEP_BASE_DOMAIN), $(GNUSTEP_INSTALLATION_DOMAIN)) $(warning "Error: GNUSTEP_INSTALLATION_DOMAIN does not match GNUSTEP_BASE_DOMAIN") $(warning " ") $(warning "You can install gnustep-base in one of the four domains: SYSTEM, LOCAL, NETWORK or USER.") $(warning " ") $(warning "gnustep-base was configured to be installed into: $(GNUSTEP_BASE_DOMAIN)") $(warning "but it would now being installed into: $(GNUSTEP_INSTALLATION_DOMAIN)") $(warning "That's not right: they must match.") $(warning " ") $(warning "If you want to install into $(GNUSTEP_BASE_DOMAIN), please use") $(warning " ") $(warning " make install GNUSTEP_INSTALLATION_DOMAIN=$(GNUSTEP_BASE_DOMAIN) [plus any other options you need]") $(warning " ") $(warning "Instead, if you want to install into $(GNUSTEP_INSTALLATION_DOMAIN), please reconfigure") $(warning "gnustep-base by doing") $(warning " ") $(warning " ./configure --with-installation-domain=$(GNUSTEP_INSTALLATION_DOMAIN) [plus any other options you need]") $(warning " ") $(warning "and then recompile and reinstall.") # We used to automatically rerun configure here. Unfortunately we # don't know if the right domain that we should be installing into is # GNUSTEP_BASE_DOMAIN (specified or automatically picked up by # configure) or GNUSTEP_INSTALLATION_DOMAIN (specified or # automatically picked up by make install) so the user really has to # spend two minutes checking this and fixing it herself. $(error "Please fix the installation domain then try again. If you are stuck, contact discuss-gnustep@gnu.org for help.") endif endif gnustep-base-1.29.0/config/000077500000000000000000000000001435650067400154575ustar00rootroot00000000000000gnustep-base-1.29.0/config/addlibrarypath.m4000066400000000000000000000012241435650067400207120ustar00rootroot00000000000000dnl librarypath macros dnl Copyright (C) 2005 Free Software Foundation dnl Copying and distribution of this file, with or without modification, dnl are permitted in any medium without royalty provided the copyright dnl notice and this notice are preserved. dnl dnl Written by Andrew Ruder dnl GS_ADD_LIBRARY_PATH dnl Adds -L$1 -Wl,-R$1 on netbsd and -Wl,-rpath,$1 -L$1 elsewhere dnl to LDFLAGS and LDIR_FLAGS AC_DEFUN([GS_ADD_LIBRARY_PATH], [ case "$target_os" in netbsd*) LDFLAGS="$LDFLAGS -L$1 -Wl,-R$1" LDIR_FLAGS="$LDIR_FLAGS -Wl,-R$1 -L$1";; *) LDFLAGS="$LDFLAGS -Wl,-rpath,$1 -L$1" LDIR_FLAGS="$LDIR_FLAGS -Wl,-rpath,$1 -L$1";; esac ]) gnustep-base-1.29.0/config/codeset.m4000066400000000000000000000015761435650067400173600ustar00rootroot00000000000000# codeset.m4 serial AM1 (gettext-0.10.40) dnl Copyright (C) 2000-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Bruno Haible. AC_DEFUN([AM_LANGINFO_CODESET], [ AC_CACHE_CHECK([for nl_langinfo and CODESET], am_cv_langinfo_codeset, [AC_TRY_LINK([#include ], [char* cs = nl_langinfo(CODESET);], am_cv_langinfo_codeset=yes, am_cv_langinfo_codeset=no) ]) if test $am_cv_langinfo_codeset = yes; then AC_DEFINE(HAVE_LANGINFO_CODESET, 1, [Define if you have and nl_langinfo(CODESET).]) fi ]) gnustep-base-1.29.0/config/config.align.c000066400000000000000000000013421435650067400201610ustar00rootroot00000000000000/* This program will most likely crash on systems that need shorts and ints to be word aligned Copyright (C) 2005 Free Software Foundation Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. */ #include int main () { char *buf = malloc(30); void *v; short *sp; short *sq; int *ip; int *iq; int i; for (i = 0 ; i < 30; i++) { buf[i] = i; } v = buf; sp = (short*)(v + 1); sq = (short*)(v + 2); if (*sp == *sq) { return 1; } ip = (int*)(v + 1); iq = (int*)(v + 2); if (*ip == *iq) { return 1; } return 0; } gnustep-base-1.29.0/config/config.builtin_apply.c000066400000000000000000000022031435650067400217370ustar00rootroot00000000000000/* Copyright (C) 2005 Free Software Foundation Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. */ typedef void(*apply_t)(void); /* function pointer */ typedef union { char *arg_ptr; char arg_regs[sizeof (char*)]; } *arglist_t; /* argument frame */ double ret_double3(int i, int j) { static double d = 1.23456; return d; } double ret_double2(int i, int j) { double d = 0.0 + i + j; return d; } double ret_double(int i, int j) { arglist_t argframe; int stack_argsize; int reg_argsize; void *ret; void *(*imp)(); imp = ret_double3; /* void *args = __builtin_apply_args(); */ stack_argsize = 0; reg_argsize = 8; argframe = (arglist_t) alloca(sizeof(char*) + reg_argsize); if (stack_argsize) argframe->arg_ptr = alloca(stack_argsize); else argframe->arg_ptr = 0; ret = __builtin_apply(imp, argframe, 0); __builtin_return(ret); } int main() { double d; d = ret_double3(2, 3); printf("got %f\n", d); d = ret_double(2, 3); printf("got %f\n", d); exit(0); } gnustep-base-1.29.0/config/config.constant-string-class.m000066400000000000000000000045531435650067400233500ustar00rootroot00000000000000/* Test that the compiler supports the -fconstant-string-class option Copyright (C) 2001 Free Software Foundation, Inc. Written by: Nicola Pero Created: June 2001 This file is part of the GNUstep Base Library. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ /* must be compiled compile using -fconstant-string-class=NSConstantString as an option to gcc. If it doesn't work, it means your gcc doesn't support this option. */ #include #include "objc-common.g" #ifdef __OBJC_GNUSTEP_RUNTIME_ABI__ # if __OBJC_GNUSTEP_RUNTIME_ABI__ >= 20 # define GNUSTEP_NEW_STRING_ABI # endif #endif /* Define our custom constant string class */ GS_OBJC_ROOT_CLASS @interface FooConstantString { Class isa; #ifdef GNUSTEP_NEW_STRING_ABI uint32_t flags; uint32_t len; uint32_t size; uint32_t hash; const char * const c_string; #else char *c_string; unsigned int len; #endif } - (char *) customString; @end #ifdef NeXT_RUNTIME /* This structure shouldn't be seen outside the compiler. See Apple Radar 2870817 and the memcpy() in main(). */ struct objc_class _FooConstantStringClassReference; #endif @implementation FooConstantString - (char *) customString { return c_string; } @end int main (int argc, char **argv) { /* Create a test constant string */ FooConstantString *string = @"Antonio Valente"; #ifdef NeXT_RUNTIME /* This memcpy is needed here due to a bug in ObjC gcc when using next runtime. It has to be done once per program and before the first message is sent to a constant string. Can't be moved to the constant string's +initialize since this is already a message. See Apple Radar 2870817 */ memcpy(&_FooConstantStringClassReference, objc_getClass("FooConstantString"), sizeof(_FooConstantStringClassReference)); #endif /* Check that it really works */ if (strcmp ([string customString], "Antonio Valente")) { abort (); } /* Do another, more direct test. */ if (strcmp ([@"JumpMustBeBigEnoughNotToBeATingString" customString], "JumpMustBeBigEnoughNotToBeATingString")) { abort (); } return 0; } gnustep-base-1.29.0/config/config.ffi.c000066400000000000000000000030461435650067400176360ustar00rootroot00000000000000#include #include #include typedef struct cls_struct_combined { float a; float b; float c; float d; } cls_struct_combined; void cls_struct_combined_fn(struct cls_struct_combined arg) { /* printf("GOT %g %g %g %g, EXPECTED 4 5 1 8\n", arg.a, arg.b, arg.c, arg.d); fflush(stdout); */ if (arg.a != 4 || arg.b != 5 || arg.c != 1 || arg.d != 8) abort(); } static void cls_struct_combined_gn(ffi_cif* cif, void* resp, void** args, void* userdata) { struct cls_struct_combined a0; a0 = *(struct cls_struct_combined*)(args[0]); cls_struct_combined_fn(a0); } int main (void) { ffi_cif cif; void *code; ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); ffi_type* cls_struct_fields0[5]; ffi_type cls_struct_type0; ffi_type* dbl_arg_types[5]; struct cls_struct_combined g_dbl = {4.0, 5.0, 1.0, 8.0}; cls_struct_type0.size = 0; cls_struct_type0.alignment = 0; cls_struct_type0.type = FFI_TYPE_STRUCT; cls_struct_type0.elements = cls_struct_fields0; cls_struct_fields0[0] = &ffi_type_float; cls_struct_fields0[1] = &ffi_type_float; cls_struct_fields0[2] = &ffi_type_float; cls_struct_fields0[3] = &ffi_type_float; cls_struct_fields0[4] = NULL; dbl_arg_types[0] = &cls_struct_type0; dbl_arg_types[1] = NULL; if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ffi_type_void, dbl_arg_types) != FFI_OK) abort(); if (ffi_prep_closure_loc(pcl, &cif, cls_struct_combined_gn, NULL, code) != FFI_OK) abort(); ((void(*)(cls_struct_combined)) (code))(g_dbl); exit(0); } gnustep-base-1.29.0/config/config.forward.m000066400000000000000000000001631435650067400205450ustar00rootroot00000000000000 #include "objc-common.g" int main (void) { IMP (*__objc_msg_forward1)(SEL) = __objc_msg_forward; return 0; } gnustep-base-1.29.0/config/config.forward2.m000066400000000000000000000001661435650067400206320ustar00rootroot00000000000000#include "objc-common.g" int main (void) { IMP (*__objc_msg_forward1)(id,SEL) = __objc_msg_forward2; return 0; } gnustep-base-1.29.0/config/config.initialize.m000066400000000000000000000052411435650067400212440ustar00rootroot00000000000000/* Test whether Objective-C runtime +initialize support is thread-safe */ #include "objc-common.g" #include #if defined(_WIN32) #include typedef unsigned thread_id_t; #define CREATE_THREAD(threadId, start, arg) \ _beginthreadex(NULL, 0, start, arg, 0, &threadId) != 0 #define mySleep(X) usleep(1000*(X)) #else #include typedef pthread_t thread_id_t; #define CREATE_THREAD(threadId, start, arg) \ pthread_create(&threadId, 0, start, arg) == 0 #define mySleep(X) sleep(X) #endif #if _MSC_VER // Windows MSVC does not have usleep() (only MinGW does), so we use our own #include #ifdef interface #undef interface // this is defined in windows.h but will break @interface #endif void usleep(__int64 usec) { LARGE_INTEGER ft = {.QuadPart = -(10*usec)}; // convert to 100ns interval HANDLE timer = CreateWaitableTimer(NULL, TRUE, NULL); SetWaitableTimer(timer, &ft, 0, NULL, NULL, 0); WaitForSingleObject(timer, INFINITE); CloseHandle(timer); } #endif /* Use volatile variables so compiler optimisation won't prevent one thread * from seeing changes made by another. */ static volatile unsigned initialize_entered = 0; static volatile unsigned initialize_exited = 0; static volatile unsigned class_entered = 0; static volatile BOOL may_proceed = NO; @interface MyClass : NSObject @end @implementation MyClass + (void) initialize { initialize_entered++; while (NO == may_proceed) ; initialize_exited++; } + (Class) class { class_entered++; return self; } @end static void * test(void *arg) { [MyClass class]; return 0; } int main() { thread_id_t t1; thread_id_t t2; unsigned counter; if (CREATE_THREAD(t1, test, 0)) { for (counter = 0; 0 == initialize_entered && counter < 5; counter++) { mySleep(1); } if (0 == initialize_entered) { fprintf(stderr, "Failed to initialize\n"); return 1; } if (CREATE_THREAD(t2, test, 0)) { /* Wait long enough for t2 to try calling +class */ mySleep(1); if (class_entered > 0) { fprintf(stderr, "class entered prematurely\n"); return 1; } /* Let t1 proceed and wait long enough for it to complete * +initialize and for both threads to call +class */ may_proceed = YES; for (counter = 0; 2 > class_entered && counter < 5; counter++) { mySleep(1); } if (2 == class_entered) { return 0; // OK } fprintf(stderr, "problem with initialize\n"); return 1; } else { fprintf(stderr, "failed to create t2\n"); return 1; } } else { fprintf(stderr, "failed to create t1\n"); return 1; } } gnustep-base-1.29.0/config/config.joinable.m000066400000000000000000000007201435650067400206630ustar00rootroot00000000000000/* Test whether Objective-C runtime uses pthreads and doesn't detach * them properly. If the join attempt succeeds, the thread was created * joinable (which it shouldn't be) and this program returns 0. */ #include "objc-common.g" #include int main() { id o = [NSObject new]; pthread_t tid; void *value_ptr; tid = (pthread_t)objc_thread_detach (@selector(hash), o, nil); return pthread_join (tid, &value_ptr); } gnustep-base-1.29.0/config/config.kvmopen.c000066400000000000000000000005061435650067400205470ustar00rootroot00000000000000/* * Check to see if we can open the kernel memory. */ #include #include #include #include #include int main() { kvm_t *kptr = NULL; /* open the kernel */ kptr = kvm_open(NULL, "/dev/null", NULL, O_RDONLY, "NSProcessInfo"); return (kptr != NULL) ? 0 : 1; } gnustep-base-1.29.0/config/config.loadtest.m000066400000000000000000000004151435650067400207200ustar00rootroot00000000000000 #include "objc-common.g" @interface Test : NSObject +(void) load; +(int) test_result; @end @implementation Test static int test_result = 1; +(void) load {test_result = 0;} +(int) test_result {return test_result;} @end int main (void) { return [Test test_result]; } gnustep-base-1.29.0/config/config.nested.c000066400000000000000000000003611435650067400203510ustar00rootroot00000000000000/* Used by `configure' to test GCC nested functions */ int main() { int a = 2; void nested(int b) { a += b; } void doit(void(*f)(int)) { (*f)(4); } doit(nested); if (a != 6) exit(-1); exit(0); } gnustep-base-1.29.0/config/config.nextcc.h000066400000000000000000000006261435650067400203640ustar00rootroot00000000000000/* * This file is used by configure.in. * Causes cpp error when running NeXT's cc. * No error when running gcc on a NeXT box. */ #if defined(NeXT) #if defined(_NEXT_SOURCE) "Not running NeXT's cc" #else "Running NeXT's cc" #error #endif #else "Not running NeXT's cc" #endif /* This would be useful, but it isn't available in NS3.0: #if defined(NX_CURRENT_COMPILER_RELEASE) */ gnustep-base-1.29.0/config/config.nextrt.m000066400000000000000000000005451435650067400204310ustar00rootroot00000000000000/* A function for testing if the compiler is using the NeXT Objective C runtime or not. With the NeXT runtime this file compiles and links. With the GNU runtime, this file does not link. */ #include "objc-common.g" int libobjects_nextrt_checker () { id o = [[Object alloc] init]; [o self]; objc_msgSend(o, @selector(self)); exit(0); } gnustep-base-1.29.0/config/config.non-fragile-ivars.m000066400000000000000000000004041435650067400224220ustar00rootroot00000000000000/* A program for testing if the compiler is using non-fragile-ivars. * Fails to build or returns 1 if the feature is not availale. */ int main() { #ifndef __has_feature #define __has_feature(x) 0 #endif return __has_feature(objc_nonfragile_abi) ? 0 : 1; } gnustep-base-1.29.0/config/config.objc.m000066400000000000000000000003561435650067400200220ustar00rootroot00000000000000 #include "objc-common.g" GS_OBJC_ROOT_CLASS @interface Test +(int) testResult; @end @implementation Test + (void) initialize { return; } +(int) testResult { return -1; } @end int main (void) { return ([Test testResult] + 1); } gnustep-base-1.29.0/config/config.poll-dev.c000066400000000000000000000010141435650067400206050ustar00rootroot00000000000000/* Mac OS X has a native poll implementation since Mac OS X 10.4, but * this implementation is broken in (at least) OS X 10.4 and 10.5 in * that it does not support devices. */ #include #include #include #include int main() { int fd, n; struct pollfd pollfds[1]; fd = open("/dev/null", O_RDONLY | O_NONBLOCK, 0); pollfds[0].fd = fd; pollfds[0].events = POLLIN; n = poll(pollfds, 1, 0); close(fd); return (n == 1 && !(pollfds[0].revents & POLLNVAL)) ? 0 : 1; } gnustep-base-1.29.0/config/config.poll.c000066400000000000000000000001031435650067400200270ustar00rootroot00000000000000#include #ifdef _POLL_EMUL_H_ int emulating_poll; #endif gnustep-base-1.29.0/config/config.printf.c000066400000000000000000000040231435650067400203700ustar00rootroot00000000000000/* See if we have a broken register_printf function (e.g. an old version of glibc) */ /* Copyright (C) 2005 Free Software Foundation Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. */ #include #include #include /* , with libc-5.3.9 thinks this flag PRINTF_ATSIGN_VA_LIST should be 0, but for me, with libc-5.0.9, it crashes. -mccallum Apparently GNU libc 2.xx needs this to be 0 also, along with Linux libc versions 5.2.xx and higher (including libc6, which is just GNU libc). -chung */ #define PRINTF_ATSIGN_VA_LIST \ (defined(_LINUX_C_LIB_VERSION_MINOR) \ && _LINUX_C_LIB_VERSION_MAJOR <= 5 \ && _LINUX_C_LIB_VERSION_MINOR < 2) #if ! PRINTF_ATSIGN_VA_LIST static int arginfo_func (const struct printf_info *info, size_t n, int *argtypes) { *argtypes = PA_POINTER; return 1; } #endif /* !PRINTF_ATSIGN_VA_LIST */ static int handle_printf_atsign (FILE *stream, const struct printf_info *info, #if PRINTF_ATSIGN_VA_LIST va_list *ap_pointer) #elif defined(_LINUX_C_LIB_VERSION_MAJOR) \ && _LINUX_C_LIB_VERSION_MAJOR < 6 const void **const args) #else /* GNU libc needs the following. */ const void *const *args) #endif { #if ! PRINTF_ATSIGN_VA_LIST const void *ptr = *args; #endif char * string_object; int len; /* xxx This implementation may not pay pay attention to as much of printf_info as it should. */ #if PRINTF_ATSIGN_VA_LIST string_object = va_arg (*ap_pointer, char *); #else string_object = *((char **) ptr); #endif len = fprintf(stream, "%s", string_object); return len; } int main() { char *d = "hi there"; register_printf_function ('@', handle_printf_atsign, #if PRINTF_ATSIGN_VA_LIST 0); #else arginfo_func); #endif printf("test %s = %@\n", d, d); return 0; } gnustep-base-1.29.0/config/config.proccmd.c000066400000000000000000000012751435650067400205230ustar00rootroot00000000000000/* * Check to see if the final cmdline arg recorded in the /proc filesystem * is terminated by a nul. */ /* Copyright (C) 2005 Free Software Foundation Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. */ #include #include int main() { char buf[32]; FILE *fptr; int result = 1; int c; sprintf(buf, "/proc/%d/cmdline", getpid()); fptr = fopen(buf, "r"); if (fptr != 0) { while ((c = fgetc(fptr)) != EOF) { result = c; } fclose(fptr); } if (result != 0) { result = 1; } return result; } gnustep-base-1.29.0/config/config.psinfo.c000066400000000000000000000013331435650067400203650ustar00rootroot00000000000000/* * Check to see if we can read the psinfo struct */ /* Copyright (C) 2005 Free Software Foundation Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. */ #include #include int main() { char *proc_file_name = NULL; FILE *ifp; psinfo_t pinfo; char **vectors; int i, count; // Read commandline proc_file_name = (char*)malloc(sizeof(char) * 2048); sprintf(proc_file_name, "/proc/%d/psinfo", (int) getpid()); ifp = fopen(proc_file_name, "r"); if (ifp == NULL) { return 1; } fread(&pinfo, sizeof(pinfo), 1, ifp); fclose(ifp); return 0; } gnustep-base-1.29.0/config/config.retframe.c000066400000000000000000000012711435650067400206750ustar00rootroot00000000000000/* Find out if __builtin_apply()'s retframe points directly at `char' and `short' return values, or if it points at an `int'-casted version of them. */ /* Copyright (C) 2005 Free Software Foundation Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. */ /* This program exit's with status 0 if it retframe points directly at them. */ char foo () { return 0x1; } char bar () { void *retframe; void *argframe; argframe = __ retframe = __builtin_apply (foo, argframe, 96); __builtin_return (retframe); } main () { /* xxx Not finished... */ } gnustep-base-1.29.0/config/config.reuseaddr.c000066400000000000000000000044401435650067400210470ustar00rootroot00000000000000/* Copyright (C) 2005 Free Software Foundation Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. */ #if defined(__MINGW32__) || defined(__MINGW64__) #include #include #else #include #include #include #include #include #include #include #endif /* __MINGW__ */ #include #include #include #include #include #ifndef INADDR_NONE #define INADDR_NONE -1 #endif // Maximum data in single I/O operation #define NETBUF_SIZE 4096 int main() { struct sockaddr_in sin; int size = sizeof(sin); int status = 1; int port; int net; memset(&sin, '\0', sizeof(sin)); sin.sin_family = AF_INET; sin.sin_addr.s_addr = htonl(INADDR_ANY); sin.sin_port = 0; if ((net = socket(AF_INET, SOCK_STREAM, PF_UNSPEC)) < 0) { fprintf(stderr, "unable to create socket 1\n"); return 2; } if (setsockopt(net, SOL_SOCKET, SO_REUSEADDR, (char *)&status, sizeof(status)) < 0) { fprintf(stderr, "unable to set socket 1 option\n"); (void) close(net); return 1; } if (bind(net, (struct sockaddr *)&sin, sizeof(sin)) < 0) { fprintf(stderr, "unable to bind socket 1\n"); (void) close(net); return 2; } listen(net, 5); if (getsockname(net, (struct sockaddr*)&sin, &size) < 0) { fprintf(stderr, "unable to get socket 1 name\n"); (void) close(net); return 2; } port = sin.sin_port; memset(&sin, '\0', sizeof(sin)); sin.sin_family = AF_INET; sin.sin_addr.s_addr = htonl(INADDR_ANY); sin.sin_port = port; if ((net = socket(AF_INET, SOCK_STREAM, PF_UNSPEC)) < 0) { fprintf(stderr, "unable to create socket 2\n"); return 2; } if (setsockopt(net, SOL_SOCKET, SO_REUSEADDR, (char *)&status, sizeof(status)) < 0) { fprintf(stderr, "unable to set socket 2 option\n"); (void) close(net); return 1; } /* * Now ... this bind should fail unless SO_REUSEADDR is broken. */ if (bind(net, (struct sockaddr *)&sin, sizeof(sin)) < 0) { return 0; } return 1; } gnustep-base-1.29.0/config/config.setUncaughtExceptionHandler.m000066400000000000000000000002041435650067400245440ustar00rootroot00000000000000 #include "objc-common.g" #include int main (void) { objc_setUncaughtExceptionHandler (0); return 0; } gnustep-base-1.29.0/config/config.set_unexpected.m000066400000000000000000000001251435650067400221160ustar00rootroot00000000000000 #include "objc-common.g" int main (void) { objc_set_unexpected(0); return 0; } gnustep-base-1.29.0/config/config.trampoline.c000066400000000000000000000042211435650067400212400ustar00rootroot00000000000000/* Trampoline test */ /* * Copyright 1995-1999, 2001-2002, 2004-2006 Bruno Haible, * * This is free software distributed under the GNU General Public Licence * described in the file COPYING. Contact the author if you don't have this * or can't live with it. There is ABSOLUTELY NO WARRANTY, explicit or implied, * on this software. */ #include #include #include "trampoline_r.h" #define MAGIC1 0x9db9af42 #define MAGIC2 0x614a13c9 #define MAGIC3 0x7aff3cb4 #define MAGIC4 0xa2f9d045 #ifdef __cplusplus typedef int (*function)(...); #else typedef int (*function)(); #endif #if defined(__i386__) int f (void* env, int x) #else int f (int x) #endif { #ifdef __GNUC__ #ifdef __m68k__ #ifdef __NetBSD__ register void* env __asm__("a1"); #else register void* env __asm__("a0"); #endif #endif #ifdef __mips__ register void* env __asm__("$2"); #endif #ifdef __mips64 register void* env __asm__("$2"); #endif #if defined(__sparc__) && !defined(__sparc64__) register void* env __asm__("%g2"); #endif #ifdef __sparc64__ register void* env __asm__("%g5"); #endif #ifdef __alpha__ register void* env __asm__("$1"); #endif #ifdef __hppa__ register void* env __asm__("%r29"); #endif #ifdef __arm__ register void* env __asm__("r12"); #endif #if defined(__powerpc__) || defined(__ppc__) || defined(__ppc64__) #ifdef __NetBSD__ register void* env __asm__("r13"); #else register void* env __asm__("r11"); #endif #endif #ifdef __m88k__ register void* env __asm__("r11"); #endif #ifdef __convex__ register void* env __asm__("s0"); #endif #ifdef __ia64__ register void* env __asm__("r15"); #endif #ifdef __x86_64__ register void* env __asm__("r10"); #endif #ifdef __s390__ register void* env __asm__("r0"); #endif return x + (int)((long*)env)[0] + (int)((long*)env)[1] + MAGIC3; #else return x + MAGIC3; #endif } int main () { function cf = alloc_trampoline_r((function)&f, (void*)MAGIC1, (void*)MAGIC2); #ifdef __GNUC__ if ((*cf)(MAGIC4) == MAGIC1+MAGIC2+MAGIC3+MAGIC4) #else if ((*cf)(MAGIC4) == MAGIC3+MAGIC4) #endif { free_trampoline_r(cf); printf("Works, test1 passed.\n"); exit(0); } else { printf("Doesn't work!\n"); exit(1); } } gnustep-base-1.29.0/config/config.unexpected.m000066400000000000000000000001631435650067400212450ustar00rootroot00000000000000 extern void (*_objc_unexpected_exception)(id); int main (void) { _objc_unexpected_exception = 0; return 0; } gnustep-base-1.29.0/config/config.vasprintf.c000066400000000000000000000012161435650067400211030ustar00rootroot00000000000000/* Exit with status 0 if vasprintf returns the length of the string printed. Some systems return a pointer to the string instead. */ /* Copyright (C) 2005 Free Software Foundation Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. */ #include #include static int func(const char *fmt, ...) { va_list ap; char *buf; int result; va_start(ap, fmt); result = vasprintf(&buf, fmt, ap); va_end(ap); return result; } int main() { if (func("1234", 0) == 4) return 0; return -1; } gnustep-base-1.29.0/config/config.vsprintf.c000066400000000000000000000012171435650067400207430ustar00rootroot00000000000000/* Exit with status 0 if vsprintf returns the length of the string printed. Some systems return a pointer to the string instead. */ /* Copyright (C) 2005 Free Software Foundation Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. */ #include #include static int func(const char *fmt, ...) { va_list ap; char buf[128]; int result; va_start(ap, fmt); result = vsprintf(buf, fmt, ap); va_end(ap); return result; } int main() { if (func("1234", 0) == 4) return 0; return -1; } gnustep-base-1.29.0/config/config.wprintf.c000066400000000000000000000040601435650067400205600ustar00rootroot00000000000000/* See if we have a broken register_printf function (e.g. an old version of glibc) */ /* Copyright (C) 2005 Free Software Foundation Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. */ #include #include #include /* , with libc-5.3.9 thinks this flag PRINTF_ATSIGN_VA_LIST should be 0, but for me, with libc-5.0.9, it crashes. -mccallum Apparently GNU libc 2.xx needs this to be 0 also, along with Linux libc versions 5.2.xx and higher (including libc6, which is just GNU libc). -chung */ #define PRINTF_ATSIGN_VA_LIST \ (defined(_LINUX_C_LIB_VERSION_MINOR) \ && _LINUX_C_LIB_VERSION_MAJOR <= 5 \ && _LINUX_C_LIB_VERSION_MINOR < 2) #if ! PRINTF_ATSIGN_VA_LIST static int arginfo_func (const struct printf_info *info, size_t n, int *argtypes) { *argtypes = PA_POINTER; return 1; } #endif /* !PRINTF_ATSIGN_VA_LIST */ static int handle_printf_atsign (FILE *stream, const struct printf_info *info, #if PRINTF_ATSIGN_VA_LIST va_list *ap_pointer) #elif defined(_LINUX_C_LIB_VERSION_MAJOR) \ && _LINUX_C_LIB_VERSION_MAJOR < 6 const void **const args) #else /* GNU libc needs the following. */ const void *const *args) #endif { #if ! PRINTF_ATSIGN_VA_LIST const void *ptr = *args; #endif char * string_object; int len = 0; /* xxx This implementation may not pay pay attention to as much of printf_info as it should. */ #if PRINTF_ATSIGN_VA_LIST string_object = va_arg (*ap_pointer, char *); #else string_object = *((char **) ptr); #endif if (info->wide == 0) len = fprintf(stream, "%s", string_object); return len; } int main() { char *d = "hi there"; register_printf_function ('@', handle_printf_atsign, #if PRINTF_ATSIGN_VA_LIST 0); #else arginfo_func); #endif printf("test %s = %@\n", d, d); return 0; } gnustep-base-1.29.0/config/objc-common.g000066400000000000000000000024061435650067400200340ustar00rootroot00000000000000/* Common information for all objc runtime tests. */ #include #include #if __GNU_LIBOBJC__ # include # include #else # include #endif #include #ifdef __GNUSTEP_RUNTIME__ #include #endif /* Provide an implementation of NXConstantString for an old libobjc when built stand-alone without an NXConstantString implementation. */ #if !defined(NeXT_RUNTIME) && !defined(__GNUSTEP_RUNTIME__) @implementation NXConstantString - (const char*) cString { return 0; } - (unsigned int) length { return 0; } @end #endif #if HAVE_OBJC_ROOT_CLASS_ATTRIBUTE #define GS_OBJC_ROOT_CLASS __attribute__((objc_root_class)) #else #define GS_OBJC_ROOT_CLASS #endif #if !defined(__APPLE__) /* Provide dummy implementations for NSObject and NSConstantString * for libobjc2 which needs them. */ GS_OBJC_ROOT_CLASS @interface NSObject { id isa; } @end @implementation NSObject + (id)new { NSObject *obj = calloc(sizeof(id), 1); obj->isa = self; return obj; } #if defined(NeXT_RUNTIME) /* The Apple runtime always calls this method */ + (void)initialize { } #endif @end @interface NSConstantString : NSObject @end @implementation NSConstantString @end #endif /* __APPLE__ */ gnustep-base-1.29.0/config/objc-con-autoload.m4000066400000000000000000000030551435650067400212240ustar00rootroot00000000000000AC_DEFUN(OBJC_CON_AUTOLOAD, # Copyright (C) 2005 Free Software Foundation # # Copying and distribution of this file, with or without modification, # are permitted in any medium without royalty provided the copyright # notice and this notice are preserved. #-------------------------------------------------------------------- # Guess if we are using a object file format that supports automatic # loading of constructor functions. # # If this system supports autoloading of constructors, that means that gcc # doesn't have to do it for us via collect2. This routine tests for this # in a very roundabout way by compiling a program with a constructor and # testing the file, via nm, for certain symbols that collect2 includes to # handle loading of constructors. # # Makes the following substitutions: # Defines CON_AUTOLOAD (whether constructor functions are autoloaded) #-------------------------------------------------------------------- [dnl AC_MSG_CHECKING(loading of constructor functions) AC_CACHE_VAL(objc_cv_con_autoload, [dnl AC_TRY_RUN([static int loaded = 0; void cons_functions() __attribute__ ((constructor)); void cons_functions() { loaded = 1; } int main() { return ( (loaded == 1) ? 0 : 1); }], objc_cv_con_autoload=yes, objc_cv_con_autoload=no, objc_cv_con_autoload=no) case "$target_os" in cygwin*) objc_cv_con_autoload=yes;; mingw*) objc_cv_con_autoload=yes;; esac ]) if test $objc_cv_con_autoload = yes; then AC_MSG_RESULT(yes) AC_DEFINE(CON_AUTOLOAD,1,[Define if constructors are automatically loaded]) else AC_MSG_RESULT(no) fi ]) gnustep-base-1.29.0/config/objc-sys-dynamic.m4000066400000000000000000000024031435650067400210730ustar00rootroot00000000000000AC_DEFUN(OBJC_SYS_DYNAMIC_LINKER, [dnl AC_REQUIRE([OBJC_CON_AUTOLOAD])dnl # Copyright (C) 2005 Free Software Foundation # Copying and distribution of this file, with or without modification, # are permitted in any medium without royalty provided the copyright # notice and this notice are preserved. #-------------------------------------------------------------------- # Guess the type of dynamic linker for the system # # Makes the following substitutions: # DYNAMIC_LINKER - cooresponds to the interface that is included # in objc-load.c (i.e. #include "${DYNAMIC_LINKER}-load.h") #-------------------------------------------------------------------- DYNAMIC_LINKER=null AC_CHECK_HEADER(windows.h, DYNAMIC_LINKER=win32) if test $DYNAMIC_LINKER = null; then AC_CHECK_HEADER(dlfcn.h, DYNAMIC_LINKER=simple) fi if test $DYNAMIC_LINKER = null; then AC_CHECK_HEADER(dl.h, DYNAMIC_LINKER=hpux) fi if test $DYNAMIC_LINKER = null; then AC_CHECK_HEADER(dld/defs.h, DYNAMIC_LINKER=dld) fi # NB: This is used as follows: in Source/Makefile.postamble we copy # $(DYNAMIC_LINKER)-load.h into dynamic-load.h AC_MSG_CHECKING([for dynamic linker type]) AC_MSG_RESULT([$DYNAMIC_LINKER]) if test $DYNAMIC_LINKER = simple; then AC_CHECK_LIB(dl, dladdr) fi AC_SUBST(DYNAMIC_LINKER)dnl ]) gnustep-base-1.29.0/config/pathtls.m4000066400000000000000000000114341435650067400174030ustar00rootroot00000000000000dnl Code shamelessly stolen from glib-config by Sebastian Rittau dnl Copyright (C) 2005 Free Software Foundation dnl Copying and distribution of this file, with or without modification, dnl are permitted in any medium without royalty provided the copyright dnl notice and this notice are preserved. dnl AM_PATH_TLS([MINIMUM-VERSION [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) AC_DEFUN(AM_PATH_TLS,[ AC_ARG_WITH(tls-prefix, [ --with-tls-prefix=PFX Prefix where libgnutls is installed (optional)], tls_config_prefix="$withval", tls_config_prefix="") AC_ARG_ENABLE(tlstest, [ --disable-tlstest Do not try to compile and run a test TLS program],, enable_tlstest=yes) if test x$tls_config_prefix != x ; then tls_config_args="$tls_config_args --prefix=$tls_config_prefix" if test x${TLS_CONFIG+set} != xset ; then TLS_CONFIG=$tls_config_prefix/bin/libgnutls-config fi fi if test ! -x "$TLS_CONFIG" ; then unset TLS_CONFIG fi AC_PATH_PROG(TLS_CONFIG, libgnutls-config, no) min_tls_version=ifelse([$1], ,2.0.0, [$1]) AC_MSG_CHECKING(for libgnutls - version >= $min_tls_version) no_tls="" if test "$TLS_CONFIG" = "no" ; then if test x$tls_config_prefix != x ; then TLS_CFLAGS="-I$tls_config_prefix/include" TLS_LIBS="-L$tls_config_prefix/lib -lgnutls -lgcrypt" else TLS_CFLAGS="-I/usr/include" TLS_LIBS="-L/usr/lib -lgnutls -lgcrypt" fi ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $TLS_CFLAGS" LIBS="$TLS_LIBS $LIBS" dnl dnl Now check if the installed libgnutls is sufficiently new. dnl rm -f conf.tlstest AC_TRY_RUN([ #include #include #include int main() { system("touch conf.tlstest"); if (gnutls_check_version("$min_tls_version") == 0) { printf("\n*** An old version of libgnutls (%s) was found.\n", gnutls_check_version(0)); printf("*** You need a version of libtgnuls newer than $min_tls_version.\n"); printf("*** If you have already installed a sufficiently new version, this error\n"); printf("*** probably means that the wrong copy of the libgnutls-config shell script is\n"); printf("*** being found. You can fix this is by removing the old version\n"); printf("*** of libgnutls.\n"); return 1; } return 0; } ],, no_tls=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" else TLS_CFLAGS=`$TLS_CONFIG $tls_config_args --cflags` TLS_LIBS=`$TLS_CONFIG $tls_config_args --libs` tls_config_major_version=`$TLS_CONFIG $tls_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` tls_config_minor_version=`$TLS_CONFIG $tls_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` tls_config_micro_version=`$TLS_CONFIG $tls_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` if test "x$enable_tlstest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $TLS_CFLAGS" LIBS="$TLS_LIBS $LIBS" dnl dnl Now check if the installed libtgnuls is sufficiently new. dnl rm -f conf.tlstest AC_TRY_RUN([ #include #include #include int main() { system("touch conf.tlstest"); if (gnutls_check_version("$min_tls_version") == 0) { printf("\n*** An old version of libgnutls (%s) was found.\n", gnutls_check_version(0)); printf("*** You need a version of libtgnuls newer than $min_tls_version.\n"); printf("*** If you have already installed a sufficiently new version, this error\n"); printf("*** probably means that the wrong copy of the libgnutls-config shell script is\n"); printf("*** being found. You can fix this is by removing the old version\n"); printf("*** of libgnutls.\n"); return 1; } return 0; } ],, no_tls=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi if test "x$no_tls" = x ; then AC_MSG_RESULT(yes) ifelse([$2], , :, [$2]) else AC_MSG_RESULT(no) if test "$TLS_CONFIG" = "no" ; then echo "*** The libgnutls-config script installed by libgnutls could not be found" echo "*** If libtgnuls-config was installed in PREFIX, make sure PREFIX/bin is in" echo "*** your path." else if test -f conf.tlstest ; then : else echo "*** Could not run libtgnuls test program, checking why..." CFLAGS="$CFLAGS $TLS_CFLAGS" LIBS="$LIBS $TLS_LIBS" dnl FIXME: AC_TRY_LINK fi fi TLS_CFLAGS="" TLS_LIBS="" ifelse([$3], , :, [$3]) fi AC_SUBST(TLS_CFLAGS) AC_SUBST(TLS_LIBS) rm -f conf.tlstest ]) gnustep-base-1.29.0/config/pathxml.m4000066400000000000000000000206021435650067400173760ustar00rootroot00000000000000dnl Code shamelessly stolen from glib-config by Sebastian Rittau dnl Copyright (C) 2005 Free Software Foundation dnl Copying and distribution of this file, with or without modification, dnl are permitted in any medium without royalty provided the copyright dnl notice and this notice are preserved. dnl AM_PATH_XML([MINIMUM-VERSION [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) AC_DEFUN(AM_PATH_XML,[ AC_ARG_WITH(xml-prefix, [ --with-xml-prefix=PFX Prefix where libxml is installed (optional)], xml_config_prefix="$withval", xml_config_prefix="") AC_ARG_ENABLE(xmltest, [ --disable-xmltest Do not try to compile and run a test XML program],, enable_xmltest=yes) if test x$xml_config_prefix != x ; then xml_config_args="$xml_config_args --prefix=$xml_config_prefix" if test x${XML2_CONFIG+set} != xset ; then XML2_CONFIG=$xml_config_prefix/bin/xml2-config fi if test x${XML_CONFIG+set} != xset ; then XML_CONFIG=$xml_config_prefix/bin/xml-config fi fi AC_PATH_PROG(XML2_CONFIG, xml2-config, no) if test "$XML2_CONFIG" = "no" ; then AC_PATH_PROG(XML_CONFIG, xml-config, no) else XML_CONFIG=$XML2_CONFIG fi min_xml_version=ifelse([$1], ,2.0.0, [$1]) AC_MSG_CHECKING(for libxml - version >= $min_xml_version) no_xml="" if test "$XML_CONFIG" = "no" ; then XML_CFLAGS="" XML_LIBS="-lxml2" ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $XML_CFLAGS" LIBS="$XML_LIBS $LIBS" dnl dnl Now check if the installed libxml is sufficiently new. dnl rm -f conf.xmltest AC_TRY_RUN([ #include #include #include #include int main() { int xml_major_version, xml_minor_version, xml_micro_version; int major, minor, micro; char *tmp_version; system("touch conf.xmltest"); tmp_version = xmlStrdup("$min_xml_version"); if(sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { printf("%s, bad version string\n", "$min_xml_version"); exit(1); } tmp_version = xmlStrdup(LIBXML_DOTTED_VERSION); if(sscanf(tmp_version, "%d.%d.%d", &xml_major_version, &xml_minor_version, &xml_micro_version) != 3) { printf("%s, bad version string\n", "$min_xml_version"); exit(1); } if ((xml_major_version > major) || ((xml_major_version == major) && (xml_minor_version > minor)) || ((xml_major_version == major) && (xml_minor_version == minor) && (xml_micro_version >= micro))) { return 0; } else { printf("\n*** An old version of libxml (%d.%d.%d) was found.\n", xml_major_version, xml_minor_version, xml_micro_version); printf("*** You need a version of libxml newer than %d.%d.%d. The latest version of\n", major, minor, micro); printf("*** libxml is always available from ftp://ftp.gnome.org.\n"); printf("***\n"); printf("*** If you have already installed a sufficiently new version, this error\n"); printf("*** probably means that the wrong copy of the xml-config shell script is\n"); printf("*** being found. The easiest way to fix this is to remove the old version\n"); printf("*** of libxml, but you can also set the XML_CONFIG environment to point to the\n"); printf("*** correct copy of xml-config. (In this case, you will have to\n"); printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n"); printf("*** so that the correct libraries are found at run-time))\n"); } return 1; } ],, no_xml=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" else XML_CFLAGS=`$XML_CONFIG $xml_config_args --cflags` XML_LIBS=`$XML_CONFIG $xml_config_args --libs` xml_config_major_version=`$XML_CONFIG $xml_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` xml_config_minor_version=`$XML_CONFIG $xml_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` xml_config_micro_version=`$XML_CONFIG $xml_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` if test "x$enable_xmltest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $XML_CFLAGS" LIBS="$XML_LIBS $LIBS" dnl dnl Now check if the installed libxml is sufficiently new. dnl rm -f conf.xmltest AC_TRY_RUN([ #include #include #include #include int main() { int xml_major_version, xml_minor_version, xml_micro_version; int major, minor, micro; char *tmp_version; system("touch conf.xmltest"); tmp_version = xmlStrdup("$min_xml_version"); if(sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { printf("%s, bad version string\n", "$min_xml_version"); exit(1); } tmp_version = xmlStrdup(LIBXML_DOTTED_VERSION); if(sscanf(tmp_version, "%d.%d.%d", &xml_major_version, &xml_minor_version, &xml_micro_version) != 3) { printf("%s, bad version string\n", "$min_xml_version"); exit(1); } if((xml_major_version != $xml_config_major_version) || (xml_minor_version != $xml_config_minor_version) || (xml_micro_version != $xml_config_micro_version)) { printf("\n*** 'xml-config --version' returned %d.%d.%d, but libxml (%d.%d.%d)\n", $xml_config_major_version, $xml_config_minor_version, $xml_config_micro_version, xml_major_version, xml_minor_version, xml_micro_version); printf("*** was found! If xml-config was correct, then it is best\n"); printf("*** to remove the old version of libxml. You may also be able to fix the error\n"); printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n"); printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n"); printf("*** required on your system.\n"); printf("*** If xml-config was wrong, set the environment variable XML_CONFIG\n"); printf("*** to point to the correct copy of xml-config, and remove the file config.cache\n"); printf("*** before re-running configure\n"); } else { if ((xml_major_version > major) || ((xml_major_version == major) && (xml_minor_version > minor)) || ((xml_major_version == major) && (xml_minor_version == minor) && (xml_micro_version >= micro))) { return 0; } else { printf("\n*** An old version of libxml (%d.%d.%d) was found.\n", xml_major_version, xml_minor_version, xml_micro_version); printf("*** You need a version of libxml newer than %d.%d.%d. The latest version of\n", major, minor, micro); printf("*** libxml is always available from ftp://ftp.gnome.org.\n"); printf("***\n"); printf("*** If you have already installed a sufficiently new version, this error\n"); printf("*** probably means that the wrong copy of the xml-config shell script is\n"); printf("*** being found. The easiest way to fix this is to remove the old version\n"); printf("*** of libxml, but you can also set the XML_CONFIG environment to point to the\n"); printf("*** correct copy of xml-config. (In this case, you will have to\n"); printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n"); printf("*** so that the correct libraries are found at run-time))\n"); } } return 1; } ],, no_xml=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi if test "x$no_xml" = x ; then AC_MSG_RESULT(yes) ifelse([$2], , :, [$2]) else AC_MSG_RESULT(no) if test "$XML_CONFIG" = "no" ; then echo "*** The xml-config script installed by libxml could not be found" echo "*** If libxml was installed in PREFIX, make sure PREFIX/bin is in" echo "*** your path, or set the XML_CONFIG environment variable to the" echo "*** full path to xml-config." else if test -f conf.xmltest ; then : else echo "*** Could not run libxml test program, checking why..." CFLAGS="$CFLAGS $XML_CFLAGS" LIBS="$LIBS $XML_LIBS" dnl FIXME: AC_TRY_LINK fi fi XML_CFLAGS="" XML_LIBS="" ifelse([$3], , :, [$3]) fi AC_SUBST(XML_CFLAGS) AC_SUBST(XML_LIBS) rm -f conf.xmltest ]) gnustep-base-1.29.0/config/pkg.m4000066400000000000000000000240111435650067400165000ustar00rootroot00000000000000dnl pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- dnl serial 11 (pkg-config-0.29.1) dnl dnl Copyright © 2004 Scott James Remnant . dnl Copyright © 2012-2015 Dan Nicholson dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, but dnl WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU dnl General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA dnl 02111-1307, USA. dnl dnl As a special exception to the GNU General Public License, if you dnl distribute this file as part of a program that contains a dnl configuration script generated by Autoconf, you may include it under dnl the same distribution terms that you use for the rest of that dnl program. dnl PKG_PREREQ(MIN-VERSION) dnl ----------------------- dnl Since: 0.29 dnl dnl Verify that the version of the pkg-config macros are at least dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's dnl installed version of pkg-config, this checks the developer's version dnl of pkg.m4 when generating configure. dnl dnl To ensure that this macro is defined, also add: dnl m4_ifndef([PKG_PREREQ], dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])]) dnl dnl See the "Since" comment for each macro you use to see what version dnl of the macros you require. m4_defun([PKG_PREREQ], [m4_define([PKG_MACROS_VERSION], [0.29.1]) m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) ])dnl PKG_PREREQ dnl PKG_PROG_PKG_CONFIG([MIN-VERSION]) dnl ---------------------------------- dnl Since: 0.16 dnl dnl Search for the pkg-config tool and set the PKG_CONFIG variable to dnl first found in the path. Checks that the version of pkg-config found dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is dnl used since that's the first version where most current features of dnl pkg-config existed. AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])dnl PKG_PROG_PKG_CONFIG dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) dnl ------------------------------------------------------------------- dnl Since: 0.18 dnl dnl Check to see whether a particular set of modules exists. Similar to dnl PKG_CHECK_MODULES(), but does not set variables or print errors. dnl dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) dnl only at the first occurence in configure.ac, so if the first place dnl it's called might be skipped (such as if it is within an "if", you dnl have to call PKG_CHECK_EXISTS manually AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_default([$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) dnl --------------------------------------------- dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting dnl pkg_failed based on the result. m4_define([_PKG_CONFIG], [if test -n "$$1"; then pkg_cv_[]$1="$$1" elif test -n "$PKG_CONFIG"; then PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes ], [pkg_failed=yes]) else pkg_failed=untried fi[]dnl ])dnl _PKG_CONFIG dnl _PKG_SHORT_ERRORS_SUPPORTED dnl --------------------------- dnl Internal check to see if pkg-config supports short errors. AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])dnl _PKG_SHORT_ERRORS_SUPPORTED dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], dnl [ACTION-IF-NOT-FOUND]) dnl -------------------------------------------------------------- dnl Since: 0.4.0 dnl dnl Note that if there is a possibility the first call to dnl PKG_CHECK_MODULES might not happen, you should be sure to include an dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD m4_default([$4], [AC_MSG_ERROR( [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT])[]dnl ]) elif test $pkg_failed = untried; then AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])[]dnl ]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) $3 fi[]dnl ])dnl PKG_CHECK_MODULES dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], dnl [ACTION-IF-NOT-FOUND]) dnl --------------------------------------------------------------------- dnl Since: 0.29 dnl dnl Checks for existence of MODULES and gathers its build flags with dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags dnl and VARIABLE-PREFIX_LIBS from --libs. dnl dnl Note that if there is a possibility the first call to dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to dnl include an explicit call to PKG_PROG_PKG_CONFIG in your dnl configure.ac. AC_DEFUN([PKG_CHECK_MODULES_STATIC], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl _save_PKG_CONFIG=$PKG_CONFIG PKG_CONFIG="$PKG_CONFIG --static" PKG_CHECK_MODULES($@) PKG_CONFIG=$_save_PKG_CONFIG[]dnl ])dnl PKG_CHECK_MODULES_STATIC dnl PKG_INSTALLDIR([DIRECTORY]) dnl ------------------------- dnl Since: 0.27 dnl dnl Substitutes the variable pkgconfigdir as the location where a module dnl should install pkg-config .pc files. By default the directory is dnl $libdir/pkgconfig, but the default can be changed by passing dnl DIRECTORY. The user can override through the --with-pkgconfigdir dnl parameter. AC_DEFUN([PKG_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([pkgconfigdir], [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, [with_pkgconfigdir=]pkg_default) AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ])dnl PKG_INSTALLDIR dnl PKG_NOARCH_INSTALLDIR([DIRECTORY]) dnl -------------------------------- dnl Since: 0.27 dnl dnl Substitutes the variable noarch_pkgconfigdir as the location where a dnl module should install arch-independent pkg-config .pc files. By dnl default the directory is $datadir/pkgconfig, but the default can be dnl changed by passing DIRECTORY. The user can override through the dnl --with-noarch-pkgconfigdir parameter. AC_DEFUN([PKG_NOARCH_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([noarch-pkgconfigdir], [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, [with_noarch_pkgconfigdir=]pkg_default) AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ])dnl PKG_NOARCH_INSTALLDIR dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) dnl ------------------------------------------- dnl Since: 0.28 dnl dnl Retrieves the value of the pkg-config variable for the given module. AC_DEFUN([PKG_CHECK_VAR], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl _PKG_CONFIG([$1], [variable="][$3]["], [$2]) AS_VAR_COPY([$1], [pkg_cv_][$1]) AS_VAR_IF([$1], [""], [$5], [$4])dnl ])dnl PKG_CHECK_VAR gnustep-base-1.29.0/config/procfs-exe-link.m4000066400000000000000000000023151435650067400207300ustar00rootroot00000000000000dnl AC_SYS_PROCFS_EXE_LINK dnl This macro checks for the existence of a symlink in /proc to the executable dnl file associated with the current process, and defines PROCFS_EXE_LINK to dnl the path it finds. Currently supports Linux and FreeBSD variants. dnl Copyright (C) 2005 Free Software Foundation dnl Copying and distribution of this file, with or without modification, dnl are permitted in any medium without royalty provided the copyright dnl notice and this notice are preserved. AC_DEFUN(AC_SYS_PROCFS_EXE_LINK, [ AC_REQUIRE([AC_SYS_PROCFS]) AC_CACHE_CHECK([link to exe of process in /proc], ac_cv_sys_procfs_exe_link, [if test "$ac_cv_sys_procfs" = yes; then # Linux 2.2.x and up if test -L /proc/self/exe; then ac_cv_sys_procfs_exe_link=/proc/self/exe # FreeBSD 4.x and up elif test -L /proc/curproc/file; then ac_cv_sys_procfs_exe_link=/proc/curproc/file else ac_cv_sys_procfs_exe_link=no fi else ac_cv_sys_procfs_exe_link=no fi]) if test "$ac_cv_sys_procfs_exe_link" != no; then AC_DEFINE_UNQUOTED(PROCFS_EXE_LINK, ["$ac_cv_sys_procfs_exe_link"], [Define as the link to exe of process in /proc filesystem.]) fi ]) gnustep-base-1.29.0/config/procfs.m4000066400000000000000000000054041435650067400172200ustar00rootroot00000000000000dnl procfs macros dnl Copyright (C) 2005 Free Software Foundation dnl Copying and distribution of this file, with or without modification, dnl are permitted in any medium without royalty provided the copyright dnl notice and this notice are preserved. dnl dnl AC_SYS_PROCFS dnl This macro defines HAVE_PROCFS if either it finds a mounted /proc dnl or the user explicitly enables it for cross-compiles. AC_DEFUN(AC_SYS_PROCFS, [ AC_ARG_ENABLE(procfs, [ --enable-procfs Use /proc filesystem (default)], enable_procfs="$enableval", if test "$cross_compiling" = yes; then enable_procfs=cross; else enable_procfs=yes; fi;) AC_CACHE_CHECK([kernel support for /proc filesystem], ac_cv_sys_procfs, [if test "$enable_procfs" = yes; then # Suggested change for the following line was # if test -d /proc/0; then # but it doesn't work on my linux - /proc/0 does not exist, but /proc # works fine if grep 'proc' /proc/mounts >/dev/null 2>/dev/null; then ac_cv_sys_procfs=yes else ac_cv_sys_procfs=no fi case "$target_os" in # Solaris has proc, but it is not readable solaris*) ac_cv_sys_procfs=no;; irix*) ac_cv_sys_procfs=no;; # Cygwin does have proc, but it does not show with mount cygwin*) ac_cv_sys_procfs=yes;; esac elif test "$enable_procfs" = cross; then ac_cv_sys_procfs=no else ac_cv_sys_procfs=no fi]) if test "$enable_procfs" = cross; then AC_MSG_WARN(Cross-compiling: Pass --enable-procfs argument to enable use of /proc filesystem.) fi if test $ac_cv_sys_procfs = yes; then AC_DEFINE(HAVE_PROCFS, 1, [Define if system supports the /proc filesystem]) fi ] ) dnl AC_SYS_PROCFS_PSINFO dnl This macro defines HAVE_PROCFS_PSINFO if it can read the psinfo dnl structure from the /proc/%pid% directory AC_DEFUN(AC_SYS_PROCFS_PSINFO, [ AC_ARG_ENABLE(procfs-psinfo, [ --enable-procfs-psinfo Use /proc/%pid% to get info], enable_procfs_psinfo="$enableval", if test "$cross_compiling" = yes; then enable_procfs_psinfo=cross; else enable_procfs_psinfo=yes; fi;) AC_CACHE_CHECK([support for /proc psinfo struct], ac_cv_sys_procfs_psinfo, [if test "$enable_procfs_psinfo" = yes; then AC_TRY_RUN([#include "$srcdir/config/config.psinfo.c"], ac_cv_sys_procfs_psinfo=yes, ac_cv_sys_procfs_psinfo=no, ac_cv_sys_procfs_psinfo=yes) elif test "$enable_procfs" = cross; then ac_cv_sys_procfs_psinfo=no else ac_cv_sys_procfs_psinfo=no fi]) if test "$enable_procfs" = cross; then AC_MSG_WARN(Cross-compiling: Pass --enable-procfs-psinfo argument to enable use of /proc psinfo information.) fi if test $ac_cv_sys_procfs_psinfo = yes; then AC_DEFINE(HAVE_PROCFS_PSINFO, 1, [Define if system supports reading psinfo from /proc]) fi ] ) gnustep-base-1.29.0/configure000077500000000000000000016321631435650067400161350ustar00rootroot00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME= PACKAGE_TARNAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_BUGREPORT= PACKAGE_URL= ac_unique_file="Source/NSArray.m" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='LTLIBOBJS LIBOBJS GCC_VERSION SUBMINOR_VERSION MINOR_VERSION MAJOR_VERSION VERSION GNUSTEP_INSTALL_GDOMAP_AS_SETUID GNUSTEP_GDOMAP_PORT_OVERRIDE WARN_FLAGS LDIR_FLAGS INCLUDE_FLAGS USE_GMP GS_HAVE_NSURLSESSION HAVE_LIBCURL HAVE_LIBDISPATCH_RUNLOOP HAVE_LIBDISPATCH HAVE_ICU ICU_LIBS ICU_CFLAGS HAVE_AVAHI HAVE_MDNS HAVE_GNUTLS TLS_LIBS TLS_CFLAGS TLS_CONFIG HAVE_LIBXML HAVE_LIBXSLT XSLT_LIBS XSLT_CFLAGS XML_CONFIG XML2_CONFIG XML_LIBS XML_CFLAGS WITH_FFI GS_FAKE_MAIN GS_PASS_ARGUMENTS HAVE_INET_NTOP HAVE_INET_PTON USE_ZLIB DEFINE_UINTPTR_T DEFINE_INTPTR_T DEFINE_UINT64_T DEFINE_INT64_T DEFINE_UINT32_T DEFINE_INT32_T DEFINE_UINT16_T DEFINE_INT16_T DEFINE_UINT8_T DEFINE_INT8_T INCLUDE_INTTYPES HAVE_PTS_STREAM_MODULES OBJCFLAGS HAVE_OBJC_SYNC_ENTER BASE_NATIVE_OBJC_EXCEPTIONS GS_NONFRAGILE HAVE_BLOCKS OBJC2RUNTIME OBJCSYNC NX_CONST_STRING_CLASS NX_CONST_STRING_OBJCFLAGS GS_HAVE_OBJC_ROOT_CLASS_ATTR GS_ALIGNOF_COND_T GS_ALIGNOF_COND_MUTEX_T GS_ALIGNOF_MUTEX_T GS_SIZEOF_COND_T GS_SIZEOF_COND_MUTEX_T GS_SIZEOF_MUTEX_T HAVE_WIN32_THREADS_AND_LOCKS DYNAMIC_LINKER BUGGY_PTR_LIMITS GS_UINTPTR_MAX GS_INTPTR_MIN GS_INTPTR_MAX _GSC_S_LNG_LNG _GSC_S_LNG _GSC_S_INT _GSC_S_SHT GS_FLT64 GS_FLT32 GS_HAVE_I128 GS_UINT128 GS_SINT128 GS_HAVE_I64 GS_UINT64 GS_SINT64 GS_UINT32 GS_SINT32 GS_UINT16 GS_SINT16 GS_UADDR GS_SADDR ac_cv_sizeof_voidp ac_cv_sizeof_double ac_cv_sizeof_float ac_cv_sizeof_long_long ac_cv_sizeof_long ac_cv_sizeof_int ac_cv_sizeof_short GS_UINT8 GS_SINT8 GS_WORDS_BIGENDIAN PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG WHOAMI CLANG_CC EGREP GREP CPP OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC GNUSTEP_BASE_RELATIVE_PATHS GNUSTEP_BASE_DOMAIN target_os target_vendor target_cpu target host_os host_vendor host_cpu host build_os build_vendor build_cpu build BASE_NONFRAGILE_ABI target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir runstatedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking with_cross_compilation_info with_config_file enable_environment_config_file enable_importing_config_file with_default_config with_installation_domain enable_largefile enable_nxconstantstring enable_bfd with_unwind enable_procfs enable_procfs_psinfo enable_pass_arguments enable_fake_main with_include_flags with_library_flags enable_libffi enable_ffcall enable_invocations with_ffi_include with_ffi_library enable_iconv with_libiconv_library with_libiconv_include enable_stricticonv enable_xml with_xml_prefix enable_xmltest enable_xslt enable_tls with_tls_prefix enable_tlstest enable_zeroconf with_zeroconf_api enable_icu enable_libdispatch with_dispatch_include with_dispatch_library with_curl enable_nsurlsession with_gmp_include with_gmp_library with_gdomap_port enable_setuid_gdomap ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR XML_CFLAGS XML_LIBS XSLT_CFLAGS XSLT_LIBS ICU_CFLAGS ICU_LIBS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -runstatedir | --runstatedir | --runstatedi | --runstated \ | --runstate | --runstat | --runsta | --runst | --runs \ | --run | --ru | --r) ac_prev=runstatedir ;; -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ | --run=* | --ru=* | --r=*) runstatedir=$ac_optarg ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures this package to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] --target=TARGET configure for building compilers for TARGET [HOST] _ACEOF fi if test -n "$ac_init_help"; then cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-environment-config-file Disables the use of the GNUSTEP_CONFIG_FILE environment variable to specify/override the location of the GNUstep config file at runtime. This option is occasionally useful to disable the environment variable for sites which wish to 'lock down' users to always work with a specific system-wide configuration. On unix-like systems the default is for this option to be enabled. It is disabled by default on windows systems so that the base library will not use a config file intended for the gnustep-make system (and containing unix-style paths which cannot be used by windows apps). Normally this should be left at its default setting. --disable-importing-config-file Disable importing of an existing GNUstep config file and use inbuilt defaults instead. --disable-largefile omit support for large files --enable-nxconstantstring Enables the use of the NXConstantString class for old compilers. --enable-bfd Enables the use of libbfd to provide symbolic stack traces. Enabling this option provides support for symbolic stack traces on platforms where the backtrace_symbols() function is not available or does not work properly. Enabling this option also has the effect of changing the license of gnustep-base from LGPL to GPL since libbfd uses the GPL license --enable-procfs Use /proc filesystem (default) --enable-procfs-psinfo Use /proc/%pid% to get info --enable-pass-arguments Force user main call to NSProcessInfo initialize --enable-fake-main Force redefine of user main function --disable-libffi Disable use of libffi library --enable-ffcall Enable use of the deprecated ffcall library --disable-invocations Build even if invocation-dependencies are not met --disable-iconv Build even if iconv is not available --enable-stricticonv Build even if iconv is strict --disable-xml Build even if XML-dependencies are not met --disable-xmltest Do not try to compile and run a test XML program --disable-xslt Build even if XSLT-dependency is not met --disable-tls Disable use of GNUTLS --disable-tlstest Do not try to compile and run a test TLS program --disable-zeroconf Disable NSNetServices support --disable-icu Disable International Components for Unicode --disable-libdispatch Disable dispatching blocks via libdispatch --disable-nsurlsession Disable support for NSURLSession --enable-setuid-gdomap Enable installing gdomap as a setuid executable. By default, it is installed as a normal program intended to be started by root at system boot time, but it can also be started up automatically by any user at any time. Use this option if you are happy having the program started automatically on demand. Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-cross-compilation-info=PATH Specify path to the configuration file that contains information for the configure script in case of cross compilation. This information replaces those obtained from running programmes during the configuration phase. --with-config-file=PATH Specify path to the GNUstep config file. This is the location to be used by the base library to locate path information at application or tool runtime. This file might not even exist now; it is not read at configure time. The base library will only read it at runtime. If unspecified, this uses the same value as the GNUstep make package on unix-like systems, but uses ./GNUstep.conf on mingw so that it is relative to the location of the base library DLL. If a leading './' is specified, the path is taken to be relative to the base library linked runtime, not all operating systems can support this, so on some platforms you may need to specify the location of the config file using the GNUSTEP_CONFIG_FILE environment variable at runtime. If a trailing '/' is specified, the path is used for locating domains but no GNUstep config file is read at runtime. --with-default-config=PATH Specify path to a GNUstep config file to be imported at configure time (now) and used to provide default values for the base library to use at runtime if no GNUstep config file is found at runtime. If this is not specified then the path from the gnustep-make package is used. --with-installation-domain=DOMAIN Specify the domain (SYSTEM, LOCAL, NETWORK or USER) into which gnustep-base will be installed. Whenever relative paths are hardcoded into gnustep-base (at the moment, this happens only on MinGW) this option must be used and must match the domain where you will be installing gnustep-base. If this is not specified, the output of gnustep-config --installation-domain-for=gnustep-base (which should normally be LOCAL) is used. --without-unwind Ignore unwind if found and disable it --with-include-flags=FLAGS Specify all include flags at once --with-library-flags=FLAGS Specify all library flags at once --with-ffi-include=PATH Include path for ffi headers --with-ffi-library=PATH Library path for ffi libs --with-libiconv-library=PATH Library path for libiconv libraries --with-libiconv-include=PATH Include path for libiconv header --with-xml-prefix=PFX Prefix where libxml is installed (optional) --with-tls-prefix=PFX Prefix where libgnutls is installed (optional) --with-zeroconf-api=API force use of a specific zeroconf API (mdns or avahi) --with-dispatch-include=PATH Include path for dispatch header --with-dispatch-library=PATH Library path for dispatch lib --with-curl= use curl installed in directory --with-gmp-include=PATH include path for gmp headers --with-gmp-library=PATH library path for gmp libraries --with-gdomap-port=PORT alternative port for gdomap Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path XML_CFLAGS C compiler flags for XML, overriding pkg-config XML_LIBS linker flags for XML, overriding pkg-config XSLT_CFLAGS C compiler flags for XSLT, overriding pkg-config XSLT_LIBS linker flags for XSLT, overriding pkg-config ICU_CFLAGS C compiler flags for ICU, overriding pkg-config ICU_LIBS linker flags for ICU, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF configure generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type # ac_fn_c_compute_int LINENO EXPR VAR INCLUDES # -------------------------------------------- # Tries to find the compile-time value of EXPR in a program that includes # INCLUDES, setting VAR accordingly. Returns whether the value could be # computed ac_fn_c_compute_int () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=0 ac_mid=0 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid; break else as_fn_arith $ac_mid + 1 && ac_lo=$as_val if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) < 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=-1 ac_mid=-1 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=$ac_mid; break else as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else ac_lo= ac_hi= fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid else as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in #(( ?*) eval "$3=\$ac_lo"; ac_retval=0 ;; '') ac_retval=1 ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 static long int longval () { return $2; } static unsigned long int ulongval () { return $2; } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) return 1; if (($2) < 0) { long int i = longval (); if (i != ($2)) return 1; fprintf (f, "%ld", i); } else { unsigned long int i = ulongval (); if (i != ($2)) return 1; fprintf (f, "%lu", i); } /* Do not output a trailing newline, as this causes \r\n confusion on some platforms. */ return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : echo >>conftest.val; read $3 &5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES # ---------------------------------------------------- # Tries to find if the field MEMBER exists in type AGGR, after including # INCLUDES, setting cache variable VAR accordingly. ac_fn_c_check_member () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 $as_echo_n "checking for $2.$3... " >&6; } if eval \${$4+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (sizeof ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else eval "$4=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$4 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_member # ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES # --------------------------------------------- # Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR # accordingly. ac_fn_c_check_decl () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack as_decl_name=`echo $2|sed 's/ *(.*//'` as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 $as_echo_n "checking whether $as_decl_name is declared... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { #ifndef $as_decl_name #ifdef __cplusplus (void) $as_decl_use; #else (void) $as_decl_name; #endif #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_decl cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by $as_me, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # If GNUSTEP_MAKEFILES is undefined, try to use gnustep-config to determine it. if test -z "$GNUSTEP_MAKEFILES"; then GNUSTEP_MAKEFILES=`gnustep-config --variable=GNUSTEP_MAKEFILES 2>&5` fi if test -z "$GNUSTEP_MAKEFILES"; then as_fn_error $? "You must have the gnustep-make package installed and set up the GNUSTEP_MAKEFILES environment variable to contain the path to the makefiles directory before configuring!" "$LINENO" 5 fi # If LIBRARY_COMBO is undefined, try to use gnustep-config to determine it. if test -z "$LIBRARY_COMBO"; then LIBRARY_COMBO=`gnustep-config --variable=LIBRARY_COMBO 2>&5` fi OBJC_RUNTIME_LIB=`echo $LIBRARY_COMBO | tr '-' ' ' | awk '{print $1}'` if test "$OBJC_RUNTIME_LIB" = "ng" -o "$OBJC_RUNTIME_LIB" = "apple"; then nonfragile=yes BASE_NONFRAGILE_ABI=1 else nonfragile=`gnustep-config --objc-flags | grep _NONFRAGILE_ABI 2>&5` if test -z "$nonfragile"; then nonfragile=no BASE_NONFRAGILE_ABI=0 else nonfragile=yes BASE_NONFRAGILE_ABI=1 fi fi MAKECPPFLAGS=`gnustep-config --variable=CPPFLAGS` if test "$CPPFLAGS" = ""; then CPPFLAGS=$MAKECPPFLAGS export CPPFLAGS else if test "$CPPFLAGS" != "$MAKECPPFLAGS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You are running configure with the preprocessor options ($CPPFLAGS) set to a different value from that used by gnustep-make ($MAKECPPFLAGS). To avoid conflicts/problems, reconfigure/reinstall gnustep-make to use CPPFLAGS=$CPPFLAGS or run the gnustep-base configure again with your CPPFLAGS environment variable set to $MAKECPPFLAGS" >&5 $as_echo "$as_me: WARNING: You are running configure with the preprocessor options ($CPPFLAGS) set to a different value from that used by gnustep-make ($MAKECPPFLAGS). To avoid conflicts/problems, reconfigure/reinstall gnustep-make to use CPPFLAGS=$CPPFLAGS or run the gnustep-base configure again with your CPPFLAGS environment variable set to $MAKECPPFLAGS" >&2;} fi fi MAKELDFLAGS=`gnustep-config --variable=LDFLAGS` if test "$LDFLAGS" = ""; then LDFLAGS=$MAKELDFLAGS export LDFLAGS else if test "$LDFLAGS" != "$MAKELDFLAGS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You are running configure with the link options ($LDFLAGS) set to a different value from that used by gnustep-make ($MAKELDFLAGS). To avoid conflicts/problems, reconfigure/reinstall gnustep-make to use LDFLAGS=$LDFLAGS or run the gnustep-base configure again with your LDFLAGS environment variable set to $MAKELDFLAGS" >&5 $as_echo "$as_me: WARNING: You are running configure with the link options ($LDFLAGS) set to a different value from that used by gnustep-make ($MAKELDFLAGS). To avoid conflicts/problems, reconfigure/reinstall gnustep-make to use LDFLAGS=$LDFLAGS or run the gnustep-base configure again with your LDFLAGS environment variable set to $MAKELDFLAGS" >&2;} fi fi # We shouldn't be loading GNUstep.sh here. It would load in a lot of # variables which might get confused with the ones that will be used # at runtime. We will load it later once we have determined (and # saved) the runtime configuration. # This variable might get temporarily overwritten with the # GNUSTEP_MAKEFILES of the runtime configuration, make sure we keep # track of the original one. CURRENT_GNUSTEP_MAKEFILES is the one # that we use to locate the actual gnustep-make installation that # will build the software. CURRENT_GNUSTEP_MAKEFILES="$GNUSTEP_MAKEFILES" #-------------------------------------------------------------------- # Use config.guess, config.sub and install-sh provided by gnustep-make #-------------------------------------------------------------------- ac_aux_dir= for ac_dir in $CURRENT_GNUSTEP_MAKEFILES "$srcdir"/$CURRENT_GNUSTEP_MAKEFILES; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in $CURRENT_GNUSTEP_MAKEFILES \"$srcdir\"/$CURRENT_GNUSTEP_MAKEFILES" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. #-------------------------------------------------------------------- # Use a .h file with #define's, instead of -D command-line switches #-------------------------------------------------------------------- ac_config_headers="$ac_config_headers Headers/GNUstepBase/config.h" #-------------------------------------------------------------------- # Determine the host, build, and target systems #-------------------------------------------------------------------- # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 $as_echo_n "checking target system type... " >&6; } if ${ac_cv_target+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$target_alias" = x; then ac_cv_target=$ac_cv_host else ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5 $as_echo "$ac_cv_target" >&6; } case $ac_cv_target in *-*-*) ;; *) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;; esac target=$ac_cv_target ac_save_IFS=$IFS; IFS='-' set x $ac_cv_target shift target_cpu=$1 target_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: target_os=$* IFS=$ac_save_IFS case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac # The aliases save the names the user supplied, while $host etc. # will get canonicalized. test -n "$target_alias" && test "$program_prefix$program_suffix$program_transform_name" = \ NONENONEs,x,x, && program_prefix=${target_alias}- #-------------------------------------------------------------------- # Setup cross-compilation-information #-------------------------------------------------------------------- # Check whether --with-cross-compilation-info was given. if test "${with_cross_compilation_info+set}" = set; then : withval=$with_cross_compilation_info; cross_result="$withval" else cross_result="no" fi CROSS_CONFIG="./cross.config" if test "$cross_result" != "no" then if test -f "$cross_result" && test -r "$cross_result" then CROSS_CONFIG="$cross_result" else as_fn_error $? "\"Could not load cross-compilation variables from $cross_result\"" "$LINENO" 5 fi fi # import information from the cross-config. . "$CROSS_CONFIG" #--------------------------------------------------------------------- # Location of the GNUstep.conf config file (--with-config-file) #--------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNUstep configuration file to use at runtime" >&5 $as_echo_n "checking for GNUstep configuration file to use at runtime... " >&6; } # This requires gnustep-make > 1.13.0 to work. For gnustep-make = # 1.13.0 we would have to parse # $CURRENT_GNUSTEP_MAKEFILES/$obj_dir/config.make, but $obj_dir is not defined # yet at this stage in config, not sure if it's worth trying to make # it work. For gnustep-make < 1.13.0 we would have to parse # $CURRENT_GNUSTEP_MAKEFILES/config.make. GNUSTEP_MAKE_CONFIG=`(grep '^GNUSTEP_CONFIG_FILE *=' $CURRENT_GNUSTEP_MAKEFILES/config-noarch.make | sed -e 's/GNUSTEP_CONFIG_FILE *= *\(.*\)/\1/') 2>&5` # So, for backwards compatiblity, we try the plain config.make too. # This should work with gnustep-make < 1.13.0, and with 1.13.0 too if # they haven't deleted the file. if test "$GNUSTEP_MAKE_CONFIG" = ""; then GNUSTEP_MAKE_CONFIG=`(grep '^GNUSTEP_CONFIG_FILE *=' $CURRENT_GNUSTEP_MAKEFILES/config.make | sed -e 's/GNUSTEP_CONFIG_FILE *= *\(.*\)/\1/') 2>&5` fi # Check whether --with-config-file was given. if test "${with_config_file+set}" = set; then : withval=$with_config_file; result="$withval" else result="no" fi if test "$result" != "no" then GNUSTEP_TARGET_CONFIG_FILE="$result" fi if test x"$GNUSTEP_TARGET_CONFIG_FILE" = x""; then case "$target_os" in mingw*|windows) GNUSTEP_TARGET_CONFIG_FILE=./GNUstep.conf ;; *) GNUSTEP_TARGET_CONFIG_FILE="$GNUSTEP_MAKE_CONFIG" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_TARGET_CONFIG_FILE" >&5 $as_echo "$GNUSTEP_TARGET_CONFIG_FILE" >&6; } #----------------------------------------------------------------- # Whether the GNUstep.conf file path can be set in the environment # By default this is enabled on unix, but disabled on mswindows # since the normal setup on mswindows is to have the config file # located with the base library dll for runtime configuration and # use the environment variable to control the developer config file # location (used by gnustep-make when building). #----------------------------------------------------------------- case "$target_os" in mingw*|windows) enable_env_config=no;; *) enable_env_config=yes;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the GNUstep.conf file path can be set in the environment" >&5 $as_echo_n "checking whether the GNUstep.conf file path can be set in the environment... " >&6; } # Check whether --enable-environment-config-file was given. if test "${enable_environment_config_file+set}" = set; then : enableval=$enable_environment_config_file; ac_cv_environment_config_file=$enableval else ac_cv_environment_config_file=$enable_env_config fi if test "$ac_cv_environment_config_file" = "yes"; then $as_echo "#define OPTION_NO_ENVIRONMENT 0" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else $as_echo "#define OPTION_NO_ENVIRONMENT 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: no: disabled from the command-line" >&5 $as_echo "no: disabled from the command-line" >&6; } fi #-------------------------------------------------------------------- # We are now trying to determine the default GNUstep paths to be # used at runtime. So all GNUSTEP_xxx variables from now on are to be # considered as 'runtime' ones. They refer to paths that might not # make any sense now, but might make sense once gnustep-base is # installed in its final location. #--------------------------------------------------------------------- # # Set 'standard' defaults for values from configuration file. # case "$target_os" in *) GNUSTEP_SYSTEM_ROOT=/usr/GNUstep/System GNUSTEP_LOCAL_ROOT=/usr/GNUstep/Local GNUSTEP_NETWORK_ROOT=/usr/GNUstep/Local GNUSTEP_USER_DEFAULTS_DIR=GNUstep/Defaults GNUSTEP_USER_CONFIG_FILE=.GNUstep.conf ;; esac #--------------------------------------------------------------------- # Now read/import the existing configuration file, if any #--------------------------------------------------------------------- # Reading/importing an existing configuration file is good as it means # the built-in default paths in the code will match those of your # installation (or of the config file you specify). # It can be annoying in certain cases though; this option lets you # turn it off. { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we should import an existing configuration file now" >&5 $as_echo_n "checking if we should import an existing configuration file now... " >&6; } # Check whether --enable-importing-config-file was given. if test "${enable_importing_config_file+set}" = set; then : enableval=$enable_importing_config_file; ac_cv_importing_config_file=$enableval else ac_cv_importing_config_file="yes" fi if test "$ac_cv_importing_config_file" = "no"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no: disabled from the command-line" >&5 $as_echo "no: disabled from the command-line" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi if test "$ac_cv_importing_config_file" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for default GNUstep configuration file to use" >&5 $as_echo_n "checking for default GNUstep configuration file to use... " >&6; } # Check whether --with-default-config was given. if test "${with_default_config+set}" = set; then : withval=$with_default_config; result="$withval" else result="no" fi if test "$result" != "no" then GNUSTEP_DEFAULT_CONFIG="$result" fi if test "$GNUSTEP_DEFAULT_CONFIG" = ""; then # No file to import has been specified. We need to read the paths # from somewhere though! GNUstep.sh might not have been sourced, # so at this stage we have no knowledge of what the paths must be. # The only place that we can read them from is the gnustep-make # GNUstep.conf file. # So we fall back to useing the make settings for the built-in ones. # However, on mingw these will be msys style paths, and we don't # want that ... so later on we convert these to portable relative # paths based on the directory in which the base library will be # installed. GNUSTEP_DEFAULT_CONFIG="$GNUSTEP_MAKE_CONFIG" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_DEFAULT_CONFIG" >&5 $as_echo "$GNUSTEP_DEFAULT_CONFIG" >&6; } # # Only try importing if the default config file has been specified. # if test "$GNUSTEP_DEFAULT_CONFIG" != ""; then # Make sure we have a slash in the path so that '.' will source it case $GNUSTEP_DEFAULT_CONFIG in /*) ;; *) GNUSTEP_DEFAULT_CONFIG="./$GNUSTEP_DEFAULT_CONFIG" ;; esac # # Use the default config file to override standard values. # if test ! -f "$GNUSTEP_DEFAULT_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: fail: file \"$GNUSTEP_DEFAULT_CONFIG\" does not exist" >&5 $as_echo "fail: file \"$GNUSTEP_DEFAULT_CONFIG\" does not exist" >&6; } # Ohoh ... things are not going well. We are asked to import # a config file that doesn't exist. So all paths might be unset # and who knows what we'll end up hardcoding into gnustep-base. # It looks like we need to make sure the user knows what they # are doing, as there is a high chance they don't and might end # up with a confused/non-working system. As far as we know, the # system might be already screwed. If they don't want to import # a config file (eg, they don't have one and they don't care about # the hardcoded paths) they should just say so. ;-) as_fn_error $? "Please run configure again with the --disable-importing-config-file option or specifying an alternative file using the --with-default-config= option" "$LINENO" 5 exit 1 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: trying to import \"$GNUSTEP_DEFAULT_CONFIG\"" >&5 $as_echo "trying to import \"$GNUSTEP_DEFAULT_CONFIG\"" >&6; } if test -r "$GNUSTEP_DEFAULT_CONFIG" then { $as_echo "$as_me:${as_lineno-$LINENO}: If this fails, please run configure again with the --disable-importing-config-file option or specifying an alternative file using the --with-default-config= option" >&5 $as_echo "$as_me: If this fails, please run configure again with the --disable-importing-config-file option or specifying an alternative file using the --with-default-config= option" >&6;} . "$GNUSTEP_DEFAULT_CONFIG" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: fail: file \"$GNUSTEP_DEFAULT_CONFIG\" is not readable" >&5 $as_echo "fail: file \"$GNUSTEP_DEFAULT_CONFIG\" is not readable" >&6; } as_fn_error $? "Unable to import configuration file at $GNUSTEP_DEFAULT_CONFIG. Please run configure again with a revised/corrected --with-default-config= option or with --disable-importing-config-file." "$LINENO" 5 exit 1 fi fi fi fi # Now we have the problem of what to do if some of the paths were not # set by GNUstep.conf (eg, old gnustep-make), or if no config file was # read, or if the config file was corrupt. We decide that the most # likely case is an old gnustep-make, so by default we configure the # other paths basing on GNUSTEP_*_ROOT. # TODO/FIXME: We should really have better checks once the situation # has stabilized. This is a reasonable hack for now. if test x"$GNUSTEP_MAKEFILES" = x""; then GNUSTEP_MAKEFILES=$GNUSTEP_SYSTEM_ROOT/Library/Makefiles; fi if test x"$GNUSTEP_SYSTEM_USERS_DIR" = x""; then GNUSTEP_SYSTEM_USERS_DIR=/home; fi if test x"$GNUSTEP_NETWORK_USERS_DIR" = x""; then GNUSTEP_NETWORK_USERS_DIR=/home; fi if test x"$GNUSTEP_LOCAL_USERS_DIR" = x""; then GNUSTEP_LOCAL_USERS_DIR=/home; fi if test x"$GNUSTEP_SYSTEM_APPS" = x""; then GNUSTEP_SYSTEM_APPS=$GNUSTEP_SYSTEM_ROOT/Applications; fi if test x"$GNUSTEP_SYSTEM_ADMIN_APPS" = x""; then GNUSTEP_SYSTEM_ADMIN_APPS=$GNUSTEP_SYSTEM_ROOT/Applications/Admin; fi if test x"$GNUSTEP_SYSTEM_WEB_APPS" = x""; then GNUSTEP_SYSTEM_WEB_APPS=$GNUSTEP_SYSTEM_ROOT/WebApplications; fi if test x"$GNUSTEP_SYSTEM_TOOLS" = x""; then GNUSTEP_SYSTEM_TOOLS=$GNUSTEP_SYSTEM_ROOT/Tools; fi if test x"$GNUSTEP_SYSTEM_ADMIN_TOOLS" = x""; then GNUSTEP_SYSTEM_ADMIN_TOOLS=$GNUSTEP_SYSTEM_ROOT/Tools/Admin; fi if test x"$GNUSTEP_SYSTEM_LIBRARY" = x""; then GNUSTEP_SYSTEM_LIBRARY=$GNUSTEP_SYSTEM_ROOT/Library; fi if test x"$GNUSTEP_SYSTEM_LIBRARIES" = x""; then GNUSTEP_SYSTEM_LIBRARIES=$GNUSTEP_SYSTEM_LIBRARY/Libraries; fi if test x"$GNUSTEP_SYSTEM_HEADERS" = x""; then GNUSTEP_SYSTEM_HEADERS=$GNUSTEP_SYSTEM_LIBRARY/Headers; fi if test x"$GNUSTEP_SYSTEM_DOC" = x""; then GNUSTEP_SYSTEM_DOC=$GNUSTEP_SYSTEM_LIBRARY/Documentation; fi if test x"$GNUSTEP_SYSTEM_DOC_MAN" = x""; then GNUSTEP_SYSTEM_DOC_MAN=$GNUSTEP_SYSTEM_LIBRARY/Documentation/man; fi if test x"$GNUSTEP_SYSTEM_DOC_INFO" = x""; then GNUSTEP_SYSTEM_DOC_INFO=$GNUSTEP_SYSTEM_LIBRARY/Documentation/info; fi if test x"$GNUSTEP_NETWORK_APPS" = x""; then GNUSTEP_NETWORK_APPS=$GNUSTEP_NETWORK_ROOT/Applications; fi if test x"$GNUSTEP_NETWORK_ADMIN_APPS" = x""; then GNUSTEP_NETWORK_ADMIN_APPS=$GNUSTEP_NETWORK_ROOT/Applications/Admin; fi if test x"$GNUSTEP_NETWORK_WEB_APPS" = x""; then GNUSTEP_NETWORK_APPS=$GNUSTEP_NETWORK_ROOT/WebApplications; fi if test x"$GNUSTEP_NETWORK_TOOLS" = x""; then GNUSTEP_NETWORK_TOOLS=$GNUSTEP_NETWORK_ROOT/Tools; fi if test x"$GNUSTEP_NETWORK_ADMIN_TOOLS" = x""; then GNUSTEP_NETWORK_ADMIN_TOOLS=$GNUSTEP_NETWORK_ROOT/Tools/Admin; fi if test x"$GNUSTEP_NETWORK_LIBRARY" = x""; then GNUSTEP_NETWORK_LIBRARY=$GNUSTEP_NETWORK_ROOT/Library; fi if test x"$GNUSTEP_NETWORK_LIBRARIES" = x""; then GNUSTEP_NETWORK_LIBRARIES=$GNUSTEP_NETWORK_LIBRARY/Libraries; fi if test x"$GNUSTEP_NETWORK_HEADERS" = x""; then GNUSTEP_NETWORK_HEADERS=$GNUSTEP_NETWORK_LIBRARY/Headers; fi if test x"$GNUSTEP_NETWORK_DOC" = x""; then GNUSTEP_NETWORK_DOC=$GNUSTEP_NETWORK_LIBRARY/Documentation; fi if test x"$GNUSTEP_NETWORK_DOC_MAN" = x""; then GNUSTEP_NETWORK_DOC_MAN=$GNUSTEP_NETWORK_LIBRARY/Documentation/man; fi if test x"$GNUSTEP_NETWORK_DOC_INFO" = x""; then GNUSTEP_NETWORK_DOC_INFO=$GNUSTEP_NETWORK_LIBRARY/Documentation/info; fi if test x"$GNUSTEP_LOCAL_APPS" = x""; then GNUSTEP_LOCAL_APPS=$GNUSTEP_LOCAL_ROOT/Applications; fi if test x"$GNUSTEP_LOCAL_ADMIN_APPS" = x""; then GNUSTEP_LOCAL_ADMIN_APPS=$GNUSTEP_LOCAL_ROOT/Applications/Admin; fi if test x"$GNUSTEP_LOCAL_WEB_APPS" = x""; then GNUSTEP_LOCAL_APPS=$GNUSTEP_LOCAL_ROOT/WebApplications; fi if test x"$GNUSTEP_LOCAL_TOOLS" = x""; then GNUSTEP_LOCAL_TOOLS=$GNUSTEP_LOCAL_ROOT/Tools; fi if test x"$GNUSTEP_LOCAL_ADMIN_TOOLS" = x""; then GNUSTEP_LOCAL_ADMIN_TOOLS=$GNUSTEP_LOCAL_ROOT/Tools/Admin; fi if test x"$GNUSTEP_LOCAL_LIBRARY" = x""; then GNUSTEP_LOCAL_LIBRARY=$GNUSTEP_LOCAL_ROOT/Library; fi if test x"$GNUSTEP_LOCAL_LIBRARIES" = x""; then GNUSTEP_LOCAL_LIBRARIES=$GNUSTEP_LOCAL_LIBRARY/Libraries; fi if test x"$GNUSTEP_LOCAL_HEADERS" = x""; then GNUSTEP_LOCAL_HEADERS=$GNUSTEP_LOCAL_LIBRARY/Headers; fi if test x"$GNUSTEP_LOCAL_DOC" = x""; then GNUSTEP_LOCAL_DOC=$GNUSTEP_LOCAL_LIBRARY/Documentation; fi if test x"$GNUSTEP_LOCAL_DOC_MAN" = x""; then GNUSTEP_LOCAL_DOC_MAN=$GNUSTEP_LOCAL_LIBRARY/Documentation/man; fi if test x"$GNUSTEP_LOCAL_DOC_INFO" = x""; then GNUSTEP_LOCAL_DOC_INFO=$GNUSTEP_LOCAL_LIBRARY/Documentation/info; fi if test x"$GNUSTEP_USER_DIR_APPS" = x""; then GNUSTEP_USER_DIR_APPS=$GNUSTEP_USER_DIR/Applications; fi if test x"$GNUSTEP_USER_DIR_ADMIN_APPS" = x""; then GNUSTEP_USER_DIR_ADMIN_APPS=$GNUSTEP_USER_DIR/Applications/Admin; fi if test x"$GNUSTEP_USER_DIR_WEB_APPS" = x""; then GNUSTEP_USER_DIR_APPS=$GNUSTEP_USER_DIR/WebApplications; fi if test x"$GNUSTEP_USER_DIR_TOOLS" = x""; then GNUSTEP_USER_DIR_TOOLS=$GNUSTEP_USER_DIR/Tools; fi if test x"$GNUSTEP_USER_DIR_ADMIN_TOOLS" = x""; then GNUSTEP_USER_DIR_ADMIN_TOOLS=$GNUSTEP_USER_DIR/Tools/Admin; fi if test x"$GNUSTEP_USER_DIR_LIBRARY" = x""; then GNUSTEP_USER_DIR_LIBRARY=$GNUSTEP_USER_DIR/Library; fi if test x"$GNUSTEP_USER_DIR_LIBRARIES" = x""; then GNUSTEP_USER_DIR_LIBRARIES=$GNUSTEP_USER_DIR/Libraries; fi if test x"$GNUSTEP_USER_DIR_HEADERS" = x""; then GNUSTEP_USER_DIR_HEADERS=$GNUSTEP_USER_DIR/Headers; fi if test x"$GNUSTEP_USER_DIR_DOC" = x""; then GNUSTEP_USER_DIR_DOC=$GNUSTEP_USER_DIR/Documentation; fi if test x"$GNUSTEP_USER_DIR_DOC_MAN" = x""; then GNUSTEP_USER_DIR_DOC_MAN=$GNUSTEP_USER_DIR/Documentation/man; fi if test x"$GNUSTEP_USER_DIR_DOC_INFO" = x""; then GNUSTEP_USER_DIR_DOC_INFO=$GNUSTEP_USER_DIR/Documentation/info; fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNUstep-base installation domain" >&5 $as_echo_n "checking for GNUstep-base installation domain... " >&6; } # Check whether --with-installation-domain was given. if test "${with_installation_domain+set}" = set; then : withval=$with_installation_domain; result="$withval" else result="no" fi if test "$result" = "no" then # Check if gnustep-config supports the option # --installation-domain-for, and use it if available. That option # will automatically use the shell variable GNUSTEP_INSTALLATION_DOMAIN or # the installation-domains.conf files (or the LOCAL default) as appropriate. # Otherwise, if that option is not available just fall back to # using GNUSTEP_INSTALLATION_DOMAIN or (if that was not defiend) LOCAL. if (gnustep-config --help | grep installation-domain) >&5 2>&5 then result=`gnustep-config --installation-domain-for=gnustep-base 2>&5` else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: The 'gnustep-config' script was not found or out of date." >&5 $as_echo "$as_me: WARNING: The 'gnustep-config' script was not found or out of date." >&2;} result=$GNUSTEP_INSTALLATION_DOMAIN if test "$result" = "" then # This case was added on December 2008 and is only for backwards # compatibility with older versions of gnustep-make. result=LOCAL fi fi fi case "$result" in SYSTEM) { $as_echo "$as_me:${as_lineno-$LINENO}: result: SYSTEM" >&5 $as_echo "SYSTEM" >&6; } GNUSTEP_BASE_PATH="$GNUSTEP_SYSTEM_TOOLS";; LOCAL) { $as_echo "$as_me:${as_lineno-$LINENO}: result: LOCAL" >&5 $as_echo "LOCAL" >&6; } GNUSTEP_BASE_PATH="$GNUSTEP_LOCAL_TOOLS";; NETWORK) { $as_echo "$as_me:${as_lineno-$LINENO}: result: NETWORK" >&5 $as_echo "NETWORK" >&6; } GNUSTEP_BASE_PATH="$GNUSTEP_NETWORK_TOOLS";; USER) { $as_echo "$as_me:${as_lineno-$LINENO}: result: USER" >&5 $as_echo "USER" >&6; } GNUSTEP_BASE_PATH="$GNUSTEP_USER_TOOLS";; *) as_fn_error $? "Unknown installation domain '$result' (it should be SYSTEM, LOCAL, NETWORK or USER). Please run configure again with the option --with-installation-domain=LOCAL (or whatever domain you want to install into)." "$LINENO" 5 exit 1;; esac # We store GNUSTEP_BASE_DOMAIN in config.mak so that we can check # at runtime and make sure it is consistent with the # GNUSTEP_INSTALLATION_DOMAIN that is used at runtime. GNUSTEP_BASE_DOMAIN=$result # # If we are on mingw, we now want to convert the paths to relative # paths (relative to libgnustep-base.dll). # case "$target_os" in mingw*|windows) # TODO: Improve this hack. # According to Wikipedia, this is the default for Windows 2000, # Windows XP and Windows Server 2003. For Windows Vista this will # change to C:\Users. The directory name needs to be localized though # (and the disk may need changing as well ?). GNUSTEP_SYSTEM_USERS_DIR="C:\Documents and Settings" GNUSTEP_NETWORK_USERS_DIR="C:\Documents and Settings" GNUSTEP_LOCAL_USERS_DIR="C:\Documents and Settings" # TODO: It would be nice to use the 'short' output of # relative_path.sh, but older versions of relative_path.sh # did not support specifying the type of output and # would abort if they were given more than 2 parameters, # so we can not use the 'short' option if we want gnustep-base # to work with older versions of gnustep-make. # Once everyone has upgraded to gnustep-make >= 2.0.5 (I'd say # two years after it has been released ?), we could switch to the # 'short' output though. GNUSTEP_SYSTEM_APPS=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_SYSTEM_APPS` GNUSTEP_SYSTEM_ADMIN_APPS=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_SYSTEM_ADMIN_APPS` GNUSTEP_SYSTEM_WEB_APPS=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_SYSTEM_WEB_APPS` GNUSTEP_SYSTEM_TOOLS=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_SYSTEM_TOOLS` GNUSTEP_SYSTEM_ADMIN_TOOLS=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_SYSTEM_ADMIN_TOOLS` GNUSTEP_SYSTEM_LIBRARY=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_SYSTEM_LIBRARY` GNUSTEP_SYSTEM_LIBRARIES=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_SYSTEM_LIBRARIES` GNUSTEP_SYSTEM_HEADERS=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_SYSTEM_HEADERS` GNUSTEP_SYSTEM_DOC=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_SYSTEM_DOC` GNUSTEP_SYSTEM_DOC_MAN=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_SYSTEM_DOC_MAN` GNUSTEP_SYSTEM_DOC_INFO=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_SYSTEM_DOC_INFO` GNUSTEP_NETWORK_APPS=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_NETWORK_APPS` GNUSTEP_NETWORK_ADMIN_APPS=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_NETWORK_ADMIN_APPS` GNUSTEP_NETWORK_WEB_APPS=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_NETWORK_WEB_APPS` GNUSTEP_NETWORK_TOOLS=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_NETWORK_TOOLS` GNUSTEP_NETWORK_ADMIN_TOOLS=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_NETWORK_ADMIN_TOOLS` GNUSTEP_NETWORK_LIBRARY=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_NETWORK_LIBRARY` GNUSTEP_NETWORK_LIBRARIES=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_NETWORK_LIBRARIES` GNUSTEP_NETWORK_HEADERS=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_NETWORK_HEADERS` GNUSTEP_NETWORK_DOC=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_NETWORK_DOC` GNUSTEP_NETWORK_DOC_MAN=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_NETWORK_DOC_MAN` GNUSTEP_NETWORK_DOC_INFO=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_NETWORK_DOC_INFO` GNUSTEP_LOCAL_APPS=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_LOCAL_APPS` GNUSTEP_LOCAL_ADMIN_APPS=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_LOCAL_ADMIN_APPS` GNUSTEP_LOCAL_WEB_APPS=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_LOCAL_WEB_APPS` GNUSTEP_LOCAL_TOOLS=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_LOCAL_TOOLS` GNUSTEP_LOCAL_ADMIN_TOOLS=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_LOCAL_ADMIN_TOOLS` GNUSTEP_LOCAL_LIBRARY=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_LOCAL_LIBRARY` GNUSTEP_LOCAL_LIBRARIES=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_LOCAL_LIBRARIES` GNUSTEP_LOCAL_HEADERS=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_LOCAL_HEADERS` GNUSTEP_LOCAL_DOC=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_LOCAL_DOC` GNUSTEP_LOCAL_DOC_MAN=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_LOCAL_DOC_MAN` GNUSTEP_LOCAL_DOC_INFO=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_LOCAL_DOC_INFO` # It would be nice to now store this stuff into a ./GNUstep.conf file # installed with gnustep-base.dll. This would clarify. ;; esac GNUSTEP_BASE_RELATIVE_PATHS=no # Now, check if any of the paths is a relative path. for path in \ "$GNUSTEP_SYSTEM_APPS" "$GNUSTEP_SYSTEM_ADMIN_APPS" "$GNUSTEP_SYSTEM_WEB_APPS" \ "$GNUSTEP_SYSTEM_TOOLS" "$GNUSTEP_SYSTEM_ADMIN_TOOLS" \ "$GNUSTEP_SYSTEM_LIBRARY" "$GNUSTEP_SYSTEM_LIBRARIES" "$GNUSTEP_SYSTEM_HEADERS" \ "$GNUSTEP_SYSTEM_DOC" "$GNUSTEP_SYSTEM_DOC_MAN" "$GNUSTEP_SYSTEM_DOC_INFO" \ "$GNUSTEP_NETWORK_APPS" "$GNUSTEP_NETWORK_ADMIN_APPS" "$GNUSTEP_NETWORK_WEB_APPS" \ "$GNUSTEP_NETWORK_TOOLS" "$GNUSTEP_NETWORK_ADMIN_TOOLS" \ "$GNUSTEP_NETWORK_LIBRARY" "$GNUSTEP_NETWORK_LIBRARIES" "$GNUSTEP_NETWORK_HEADERS" \ "$GNUSTEP_NETWORK_DOC" "$GNUSTEP_NETWORK_DOC_MAN" "$GNUSTEP_NETWORK_DOC_INFO" \ "$GNUSTEP_LOCAL_APPS" "$GNUSTEP_LOCAL_ADMIN_APPS" "$GNUSTEP_LOCAL_WEB_APPS" \ "$GNUSTEP_LOCAL_TOOLS" "$GNUSTEP_LOCAL_ADMIN_TOOLS" \ "$GNUSTEP_LOCAL_LIBRARY" "$GNUSTEP_LOCAL_LIBRARIES" "$GNUSTEP_LOCAL_HEADERS" \ "$GNUSTEP_LOCAL_DOC" "$GNUSTEP_LOCAL_DOC_MAN" "$GNUSTEP_LOCAL_DOC_INFO"; do case "$path" in ./*) GNUSTEP_BASE_RELATIVE_PATHS=yes ;; ../*) GNUSTEP_BASE_RELATIVE_PATHS=yes ;; esac done { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we are hardcoding any relative paths in gnustep-base" >&5 $as_echo_n "checking if we are hardcoding any relative paths in gnustep-base... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_BASE_RELATIVE_PATHS" >&5 $as_echo "$GNUSTEP_BASE_RELATIVE_PATHS" >&6; } # # Now, we want to print out the paths that we're going to hardcode # into gnustep-base. This is to help users in finding # misconfigurations. # { $as_echo "$as_me:${as_lineno-$LINENO}: We store the following filesystem layout into gnustep-base, to be used when no config file is found" >&5 $as_echo "$as_me: We store the following filesystem layout into gnustep-base, to be used when no config file is found" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Makefiles directory" >&5 $as_echo_n "checking for Makefiles directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_MAKEFILES" >&5 $as_echo "$GNUSTEP_MAKEFILES" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for user defaults directory" >&5 $as_echo_n "checking for user defaults directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_USER_DEFAULTS_DIR" >&5 $as_echo "$GNUSTEP_USER_DEFAULTS_DIR" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for user config file" >&5 $as_echo_n "checking for user config file... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_USER_CONFIG_FILE" >&5 $as_echo "$GNUSTEP_USER_CONFIG_FILE" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for System Applications directory" >&5 $as_echo_n "checking for System Applications directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_SYSTEM_APPS" >&5 $as_echo "$GNUSTEP_SYSTEM_APPS" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for System Admin Applications directory" >&5 $as_echo_n "checking for System Admin Applications directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_SYSTEM_ADMIN_APPS" >&5 $as_echo "$GNUSTEP_SYSTEM_ADMIN_APPS" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for System Web Applications directory" >&5 $as_echo_n "checking for System Web Applications directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_SYSTEM_WEB_APPS" >&5 $as_echo "$GNUSTEP_SYSTEM_WEB_APPS" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for System Tools directory" >&5 $as_echo_n "checking for System Tools directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_SYSTEM_TOOLS" >&5 $as_echo "$GNUSTEP_SYSTEM_TOOLS" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for System Admin Tools directory" >&5 $as_echo_n "checking for System Admin Tools directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_SYSTEM_ADMIN_TOOLS" >&5 $as_echo "$GNUSTEP_SYSTEM_ADMIN_TOOLS" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for System Library directory" >&5 $as_echo_n "checking for System Library directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_SYSTEM_LIBRARY" >&5 $as_echo "$GNUSTEP_SYSTEM_LIBRARY" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for System Libraries directory" >&5 $as_echo_n "checking for System Libraries directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_SYSTEM_LIBRARIES" >&5 $as_echo "$GNUSTEP_SYSTEM_LIBRARIES" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for System Headers directory" >&5 $as_echo_n "checking for System Headers directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_SYSTEM_HEADERS" >&5 $as_echo "$GNUSTEP_SYSTEM_HEADERS" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for System Documentation directory" >&5 $as_echo_n "checking for System Documentation directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_SYSTEM_DOC" >&5 $as_echo "$GNUSTEP_SYSTEM_DOC" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for System Info Documentation directory" >&5 $as_echo_n "checking for System Info Documentation directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_SYSTEM_DOC_INFO" >&5 $as_echo "$GNUSTEP_SYSTEM_DOC_INFO" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for System Man Documentation directory" >&5 $as_echo_n "checking for System Man Documentation directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_SYSTEM_DOC_MAN" >&5 $as_echo "$GNUSTEP_SYSTEM_DOC_MAN" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Network Applications directory" >&5 $as_echo_n "checking for Network Applications directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_NETWORK_APPS" >&5 $as_echo "$GNUSTEP_NETWORK_APPS" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Network Admin Applications directory" >&5 $as_echo_n "checking for Network Admin Applications directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_NETWORK_ADMIN_APPS" >&5 $as_echo "$GNUSTEP_NETWORK_ADMIN_APPS" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Network Web Applications directory" >&5 $as_echo_n "checking for Network Web Applications directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_NETWORK_WEB_APPS" >&5 $as_echo "$GNUSTEP_NETWORK_WEB_APPS" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Network Tools directory" >&5 $as_echo_n "checking for Network Tools directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_NETWORK_TOOLS" >&5 $as_echo "$GNUSTEP_NETWORK_TOOLS" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Network Admin Tools directory" >&5 $as_echo_n "checking for Network Admin Tools directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_NETWORK_ADMIN_TOOLS" >&5 $as_echo "$GNUSTEP_NETWORK_ADMIN_TOOLS" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Network Library directory" >&5 $as_echo_n "checking for Network Library directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_NETWORK_LIBRARY" >&5 $as_echo "$GNUSTEP_NETWORK_LIBRARY" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Network Libraries directory" >&5 $as_echo_n "checking for Network Libraries directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_NETWORK_LIBRARIES" >&5 $as_echo "$GNUSTEP_NETWORK_LIBRARIES" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Network Headers directory" >&5 $as_echo_n "checking for Network Headers directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_NETWORK_HEADERS" >&5 $as_echo "$GNUSTEP_NETWORK_HEADERS" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Network Documentation directory" >&5 $as_echo_n "checking for Network Documentation directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_NETWORK_DOC" >&5 $as_echo "$GNUSTEP_NETWORK_DOC" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Network Info Documentation directory" >&5 $as_echo_n "checking for Network Info Documentation directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_NETWORK_DOC_INFO" >&5 $as_echo "$GNUSTEP_NETWORK_DOC_INFO" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Network Man Documentation directory" >&5 $as_echo_n "checking for Network Man Documentation directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_NETWORK_DOC_MAN" >&5 $as_echo "$GNUSTEP_NETWORK_DOC_MAN" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Local Applications directory" >&5 $as_echo_n "checking for Local Applications directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_LOCAL_APPS" >&5 $as_echo "$GNUSTEP_LOCAL_APPS" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Local Admin Applications directory" >&5 $as_echo_n "checking for Local Admin Applications directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_LOCAL_ADMIN_APPS" >&5 $as_echo "$GNUSTEP_LOCAL_ADMIN_APPS" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Local Web Applications directory" >&5 $as_echo_n "checking for Local Web Applications directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_LOCAL_WEB_APPS" >&5 $as_echo "$GNUSTEP_LOCAL_WEB_APPS" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Local Tools directory" >&5 $as_echo_n "checking for Local Tools directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_LOCAL_TOOLS" >&5 $as_echo "$GNUSTEP_LOCAL_TOOLS" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Local Admin Tools directory" >&5 $as_echo_n "checking for Local Admin Tools directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_LOCAL_ADMIN_TOOLS" >&5 $as_echo "$GNUSTEP_LOCAL_ADMIN_TOOLS" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Local Library directory" >&5 $as_echo_n "checking for Local Library directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_LOCAL_LIBRARY" >&5 $as_echo "$GNUSTEP_LOCAL_LIBRARY" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Local Libraries directory" >&5 $as_echo_n "checking for Local Libraries directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_LOCAL_LIBRARIES" >&5 $as_echo "$GNUSTEP_LOCAL_LIBRARIES" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Local Headers directory" >&5 $as_echo_n "checking for Local Headers directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_LOCAL_HEADERS" >&5 $as_echo "$GNUSTEP_LOCAL_HEADERS" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Local Documentation directory" >&5 $as_echo_n "checking for Local Documentation directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_LOCAL_DOC" >&5 $as_echo "$GNUSTEP_LOCAL_DOC" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Local Info Documentation directory" >&5 $as_echo_n "checking for Local Info Documentation directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_LOCAL_DOC_INFO" >&5 $as_echo "$GNUSTEP_LOCAL_DOC_INFO" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Local Man Documentation directory" >&5 $as_echo_n "checking for Local Man Documentation directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_LOCAL_DOC_MAN" >&5 $as_echo "$GNUSTEP_LOCAL_DOC_MAN" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for User Applications directory" >&5 $as_echo_n "checking for User Applications directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_USER_DIR_APPS" >&5 $as_echo "$GNUSTEP_USER_DIR_APPS" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for User Admin Applications directory" >&5 $as_echo_n "checking for User Admin Applications directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_USER_DIR_ADMIN_APPS" >&5 $as_echo "$GNUSTEP_USER_DIR_ADMIN_APPS" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for User Web Applications directory" >&5 $as_echo_n "checking for User Web Applications directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_USER_DIR_WEB_APPS" >&5 $as_echo "$GNUSTEP_USER_DIR_WEB_APPS" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for User Tools directory" >&5 $as_echo_n "checking for User Tools directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_USER_DIR_TOOLS" >&5 $as_echo "$GNUSTEP_USER_DIR_TOOLS" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for User Admin Tools directory" >&5 $as_echo_n "checking for User Admin Tools directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_USER_DIR_ADMIN_TOOLS" >&5 $as_echo "$GNUSTEP_USER_DIR_ADMIN_TOOLS" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for User Library directory" >&5 $as_echo_n "checking for User Library directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_USER_DIR_LIBRARY" >&5 $as_echo "$GNUSTEP_USER_DIR_LIBRARY" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for User Libraries directory" >&5 $as_echo_n "checking for User Libraries directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_USER_DIR_LIBRARIES" >&5 $as_echo "$GNUSTEP_USER_DIR_LIBRARIES" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for User Headers directory" >&5 $as_echo_n "checking for User Headers directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_USER_DIR_HEADERS" >&5 $as_echo "$GNUSTEP_USER_DIR_HEADERS" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for User Documentation directory" >&5 $as_echo_n "checking for User Documentation directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_USER_DIR_DOC" >&5 $as_echo "$GNUSTEP_USER_DIR_DOC" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for User Info Documentation directory" >&5 $as_echo_n "checking for User Info Documentation directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_USER_DIR_DOC_INFO" >&5 $as_echo "$GNUSTEP_USER_DIR_DOC_INFO" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for User Man Documentation directory" >&5 $as_echo_n "checking for User Man Documentation directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_USER_DIR_DOC_MAN" >&5 $as_echo "$GNUSTEP_USER_DIR_DOC_MAN" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for System User directory" >&5 $as_echo_n "checking for System User directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_SYSTEM_USERS_DIR" >&5 $as_echo "$GNUSTEP_SYSTEM_USERS_DIR" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Network User directory" >&5 $as_echo_n "checking for Network User directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_NETWORK_USERS_DIR" >&5 $as_echo "$GNUSTEP_NETWORK_USERS_DIR" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Local User directory" >&5 $as_echo_n "checking for Local User directory... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNUSTEP_LOCAL_USERS_DIR" >&5 $as_echo "$GNUSTEP_LOCAL_USERS_DIR" >&6; } # # Set the default configuration file values in config.h to be hard-coded # into NSPathUtilities.m # GNUSTEP_MAKEFILES=`echo $GNUSTEP_MAKEFILES|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_MAKEFILES "$GNUSTEP_MAKEFILES" _ACEOF GNUSTEP_USER_DEFAULTS_DIR=`echo $GNUSTEP_USER_DEFAULTS_DIR|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_USER_DEFAULTS_DIR "$GNUSTEP_USER_DEFAULTS_DIR" _ACEOF GNUSTEP_USER_CONFIG_FILE=`echo $GNUSTEP_USER_CONFIG_FILE|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_USER_CONFIG_FILE "$GNUSTEP_USER_CONFIG_FILE" _ACEOF GNUSTEP_TARGET_CONFIG_FILE=`echo $GNUSTEP_TARGET_CONFIG_FILE|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_CONFIG_FILE "$GNUSTEP_TARGET_CONFIG_FILE" _ACEOF # # SYSTEM domain paths # GNUSTEP_SYSTEM_APPS=`echo $GNUSTEP_SYSTEM_APPS|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_SYSTEM_APPS "$GNUSTEP_SYSTEM_APPS" _ACEOF GNUSTEP_SYSTEM_ADMIN_APPS=`echo $GNUSTEP_SYSTEM_ADMIN_APPS|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_SYSTEM_ADMIN_APPS "$GNUSTEP_SYSTEM_ADMIN_APPS" _ACEOF GNUSTEP_SYSTEM_WEB_APPS=`echo $GNUSTEP_SYSTEM_WEB_APPS|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_SYSTEM_WEB_APPS "$GNUSTEP_SYSTEM_WEB_APPS" _ACEOF GNUSTEP_SYSTEM_TOOLS=`echo $GNUSTEP_SYSTEM_TOOLS|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_SYSTEM_TOOLS "$GNUSTEP_SYSTEM_TOOLS" _ACEOF GNUSTEP_SYSTEM_ADMIN_TOOLS=`echo $GNUSTEP_SYSTEM_ADMIN_TOOLS|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_SYSTEM_ADMIN_TOOLS "$GNUSTEP_SYSTEM_ADMIN_TOOLS" _ACEOF GNUSTEP_SYSTEM_LIBRARY=`echo $GNUSTEP_SYSTEM_LIBRARY|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_SYSTEM_LIBRARY "$GNUSTEP_SYSTEM_LIBRARY" _ACEOF GNUSTEP_SYSTEM_LIBRARIES=`echo $GNUSTEP_SYSTEM_LIBRARIES|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_SYSTEM_LIBRARIES "$GNUSTEP_SYSTEM_LIBRARIES" _ACEOF GNUSTEP_SYSTEM_HEADERS=`echo $GNUSTEP_SYSTEM_HEADERS|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_SYSTEM_HEADERS "$GNUSTEP_SYSTEM_HEADERS" _ACEOF GNUSTEP_SYSTEM_DOC=`echo $GNUSTEP_SYSTEM_DOC|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_SYSTEM_DOC "$GNUSTEP_SYSTEM_DOC" _ACEOF GNUSTEP_SYSTEM_DOC_MAN=`echo $GNUSTEP_SYSTEM_DOC_MAN|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_SYSTEM_DOC_MAN "$GNUSTEP_SYSTEM_DOC_MAN" _ACEOF GNUSTEP_SYSTEM_DOC_INFO=`echo $GNUSTEP_SYSTEM_DOC_INFO|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_SYSTEM_DOC_INFO "$GNUSTEP_SYSTEM_DOC_INFO" _ACEOF # # NETWORK domain paths # GNUSTEP_NETWORK_APPS=`echo $GNUSTEP_NETWORK_APPS|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_NETWORK_APPS "$GNUSTEP_NETWORK_APPS" _ACEOF GNUSTEP_NETWORK_ADMIN_APPS=`echo $GNUSTEP_NETWORK_ADMIN_APPS|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_NETWORK_ADMIN_APPS "$GNUSTEP_NETWORK_ADMIN_APPS" _ACEOF GNUSTEP_NETWORK_WEB_APPS=`echo $GNUSTEP_NETWORK_WEB_APPS|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_NETWORK_WEB_APPS "$GNUSTEP_NETWORK_WEB_APPS" _ACEOF GNUSTEP_NETWORK_TOOLS=`echo $GNUSTEP_NETWORK_TOOLS|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_NETWORK_TOOLS "$GNUSTEP_NETWORK_TOOLS" _ACEOF GNUSTEP_NETWORK_ADMIN_TOOLS=`echo $GNUSTEP_NETWORK_ADMIN_TOOLS|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_NETWORK_ADMIN_TOOLS "$GNUSTEP_NETWORK_ADMIN_TOOLS" _ACEOF GNUSTEP_NETWORK_LIBRARY=`echo $GNUSTEP_NETWORK_LIBRARY|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_NETWORK_LIBRARY "$GNUSTEP_NETWORK_LIBRARY" _ACEOF GNUSTEP_NETWORK_LIBRARIES=`echo $GNUSTEP_NETWORK_LIBRARIES|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_NETWORK_LIBRARIES "$GNUSTEP_NETWORK_LIBRARIES" _ACEOF GNUSTEP_NETWORK_HEADERS=`echo $GNUSTEP_NETWORK_HEADERS|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_NETWORK_HEADERS "$GNUSTEP_NETWORK_HEADERS" _ACEOF GNUSTEP_NETWORK_DOC=`echo $GNUSTEP_NETWORK_DOC|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_NETWORK_DOC "$GNUSTEP_NETWORK_DOC" _ACEOF GNUSTEP_NETWORK_DOC_MAN=`echo $GNUSTEP_NETWORK_DOC_MAN|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_NETWORK_DOC_MAN "$GNUSTEP_NETWORK_DOC_MAN" _ACEOF GNUSTEP_NETWORK_DOC_INFO=`echo $GNUSTEP_NETWORK_DOC_INFO|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_NETWORK_DOC_INFO "$GNUSTEP_NETWORK_DOC_INFO" _ACEOF # # LOCAL domain paths # GNUSTEP_LOCAL_APPS=`echo $GNUSTEP_LOCAL_APPS|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_LOCAL_APPS "$GNUSTEP_LOCAL_APPS" _ACEOF GNUSTEP_LOCAL_ADMIN_APPS=`echo $GNUSTEP_LOCAL_ADMIN_APPS|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_LOCAL_ADMIN_APPS "$GNUSTEP_LOCAL_ADMIN_APPS" _ACEOF GNUSTEP_LOCAL_WEB_APPS=`echo $GNUSTEP_LOCAL_WEB_APPS|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_LOCAL_WEB_APPS "$GNUSTEP_LOCAL_WEB_APPS" _ACEOF GNUSTEP_LOCAL_TOOLS=`echo $GNUSTEP_LOCAL_TOOLS|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_LOCAL_TOOLS "$GNUSTEP_LOCAL_TOOLS" _ACEOF GNUSTEP_LOCAL_ADMIN_TOOLS=`echo $GNUSTEP_LOCAL_ADMIN_TOOLS|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_LOCAL_ADMIN_TOOLS "$GNUSTEP_LOCAL_ADMIN_TOOLS" _ACEOF GNUSTEP_LOCAL_LIBRARY=`echo $GNUSTEP_LOCAL_LIBRARY|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_LOCAL_LIBRARY "$GNUSTEP_LOCAL_LIBRARY" _ACEOF GNUSTEP_LOCAL_LIBRARIES=`echo $GNUSTEP_LOCAL_LIBRARIES|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_LOCAL_LIBRARIES "$GNUSTEP_LOCAL_LIBRARIES" _ACEOF GNUSTEP_LOCAL_HEADERS=`echo $GNUSTEP_LOCAL_HEADERS|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_LOCAL_HEADERS "$GNUSTEP_LOCAL_HEADERS" _ACEOF GNUSTEP_LOCAL_DOC=`echo $GNUSTEP_LOCAL_DOC|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_LOCAL_DOC "$GNUSTEP_LOCAL_DOC" _ACEOF GNUSTEP_LOCAL_DOC_MAN=`echo $GNUSTEP_LOCAL_DOC_MAN|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_LOCAL_DOC_MAN "$GNUSTEP_LOCAL_DOC_MAN" _ACEOF GNUSTEP_LOCAL_DOC_INFO=`echo $GNUSTEP_LOCAL_DOC_INFO|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_LOCAL_DOC_INFO "$GNUSTEP_LOCAL_DOC_INFO" _ACEOF # # USER_DIR domain paths # GNUSTEP_USER_DIR_APPS=`echo $GNUSTEP_USER_DIR_APPS|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_USER_DIR_APPS "$GNUSTEP_USER_DIR_APPS" _ACEOF GNUSTEP_USER_DIR_ADMIN_APPS=`echo $GNUSTEP_USER_DIR_ADMIN_APPS|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_USER_DIR_ADMIN_APPS "$GNUSTEP_USER_DIR_ADMIN_APPS" _ACEOF GNUSTEP_USER_DIR_WEB_APPS=`echo $GNUSTEP_USER_DIR_WEB_APPS|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_USER_DIR_WEB_APPS "$GNUSTEP_USER_DIR_WEB_APPS" _ACEOF GNUSTEP_USER_DIR_TOOLS=`echo $GNUSTEP_USER_DIR_TOOLS|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_USER_DIR_TOOLS "$GNUSTEP_USER_DIR_TOOLS" _ACEOF GNUSTEP_USER_DIR_ADMIN_TOOLS=`echo $GNUSTEP_USER_DIR_ADMIN_TOOLS|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_USER_DIR_ADMIN_TOOLS "$GNUSTEP_USER_DIR_ADMIN_TOOLS" _ACEOF GNUSTEP_USER_DIR_LIBRARY=`echo $GNUSTEP_USER_DIR_LIBRARY|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_USER_DIR_LIBRARY "$GNUSTEP_USER_DIR_LIBRARY" _ACEOF GNUSTEP_USER_DIR_LIBRARIES=`echo $GNUSTEP_USER_DIR_LIBRARIES|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_USER_DIR_LIBRARIES "$GNUSTEP_USER_DIR_LIBRARIES" _ACEOF GNUSTEP_USER_DIR_HEADERS=`echo $GNUSTEP_USER_DIR_HEADERS|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_USER_DIR_HEADERS "$GNUSTEP_USER_DIR_HEADERS" _ACEOF GNUSTEP_USER_DIR_DOC=`echo $GNUSTEP_USER_DIR_DOC|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_USER_DIR_DOC "$GNUSTEP_USER_DIR_DOC" _ACEOF GNUSTEP_USER_DIR_DOC_MAN=`echo $GNUSTEP_USER_DIR_DOC_MAN|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_USER_DIR_DOC_MAN "$GNUSTEP_USER_DIR_DOC_MAN" _ACEOF GNUSTEP_USER_DIR_DOC_INFO=`echo $GNUSTEP_USER_DIR_DOC_INFO|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_USER_DIR_DOC_INFO "$GNUSTEP_USER_DIR_DOC_INFO" _ACEOF GNUSTEP_TARGET_SYSTEM_USERS_DIR=`echo $GNUSTEP_TARGET_SYSTEM_USERS_DIR|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_SYSTEM_USERS_DIR "$GNUSTEP_TARGET_SYSTEM_USERS_DIR" _ACEOF GNUSTEP_TARGET_NETWORK_USERS_DIR=`echo $GNUSTEP_TARGET_NETWORK_USERS_DIR|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_NETWORK_USERS_DIR "$GNUSTEP_TARGET_NETWORK_USERS_DIR" _ACEOF GNUSTEP_TARGET_LOCAL_USERS_DIR=`echo $GNUSTEP_TARGET_LOCAL_USERS_DIR|sed -e 's/\\\\/\\\\\\\\/g'` cat >>confdefs.h <<_ACEOF #define GNUSTEP_TARGET_LOCAL_USERS_DIR "$GNUSTEP_TARGET_LOCAL_USERS_DIR" _ACEOF # # Now load the values to be used in locating libraries etc used when # building the base library ... as supplied by the gnustep-make package # # It looks like we ought to source the whole GNUstep.sh here, and even # ask it to output all variables! That way we have access to (eg) # GNUSTEP_SYSTEM_HEADERS below. # # We need to unset any values that we really need, or existing settings # would be used by GNUstep.sh # unset GNUSTEP_SYSTEM_HEADERS unset GNUSTEP_SYSTEM_LIBRARIES unset GNUSTEP_NETWORK_HEADERS unset GNUSTEP_NETWORK_LIBRARIES unset GNUSTEP_LOCAL_HEADERS unset GNUSTEP_LOCAL_LIBRARIES GNUSTEP_MAKEFILES="$CURRENT_GNUSTEP_MAKEFILES" GNUSTEP_SH_EXPORT_ALL_VARIABLES=yes . "$CURRENT_GNUSTEP_MAKEFILES/GNUstep.sh" unset GNUSTEP_SH_EXPORT_ALL_VARIABLES # For backwards compatibility, define GNUSTEP_SYSTEM_HEADERS from # GNUSTEP_SYSTEM_ROOT if not set yet. if test x"$GNUSTEP_SYSTEM_HEADERS" = x""; then GNUSTEP_SYSTEM_HEADERS="$GNUSTEP_SYSTEM_ROOT/Library/Headers" fi if test x"$GNUSTEP_SYSTEM_LIBRARIES" = x""; then GNUSTEP_SYSTEM_LIBRARIES="$GNUSTEP_SYSTEM_ROOT/Library/Libraries" fi if test x"$GNUSTEP_NETWORK_HEADERS" = x""; then GNUSTEP_NETWORK_HEADERS="$GNUSTEP_NETWORK_ROOT/Library/Headers" fi if test x"$GNUSTEP_NETWORK_LIBRARIES" = x""; then GNUSTEP_NETWORK_LIBRARIES="$GNUSTEP_NETWORK_ROOT/Library/Libraries" fi if test x"$GNUSTEP_LOCAL_HEADERS" = x""; then GNUSTEP_LOCAL_HEADERS="$GNUSTEP_LOCAL_ROOT/Library/Headers" fi if test x"$GNUSTEP_LOCAL_LIBRARIES" = x""; then GNUSTEP_LOCAL_LIBRARIES="$GNUSTEP_LOCAL_ROOT/Library/Libraries" fi # # Add standard library and header directories for configure to use to locate # plain C developer headers/libraries which have been installed in the # GNUstep hierarchy. These take precedence # if test x"$GNUSTEP_IS_FLATTENED" = x"yes"; then CPPFLAGS="$CPPFLAGS -I$GNUSTEP_LOCAL_HEADERS" CPPFLAGS="$CPPFLAGS -I$GNUSTEP_NETWORK_HEADERS" CPPFLAGS="$CPPFLAGS -I$GNUSTEP_SYSTEM_HEADERS" LDFLAGS="$LDFLAGS -L$GNUSTEP_LOCAL_LIBRARIES" LDFLAGS="$LDFLAGS -L$GNUSTEP_NETWORK_LIBRARIES" LDFLAGS="$LDFLAGS -L$GNUSTEP_SYSTEM_LIBRARIES" else # FIXME: Cross-compiling should read the target from the configure # options and use it. GNUSTEP_TARGET_* variables do not exist in # this context (so "$GNUSTEP_TARGET_CPU" will always be "") if test x"$GNUSTEP_TARGET_CPU" = x""; then ARCH="$GNUSTEP_HOST_CPU-$GNUSTEP_HOST_OS" else ARCH=$GNUSTEP_TARGET_CPU-$GNUSTEP_TARGET_OS fi ALIB="$ARCH/$LIBRARY_COMBO" CPPFLAGS="$CPPFLAGS -I$GNUSTEP_LOCAL_HEADERS/$ALIB" CPPFLAGS="$CPPFLAGS -I$GNUSTEP_LOCAL_HEADERS/$ARCH" CPPFLAGS="$CPPFLAGS -I$GNUSTEP_LOCAL_HEADERS" CPPFLAGS="$CPPFLAGS -I$GNUSTEP_NETWORK_HEADERS/$ALIB" CPPFLAGS="$CPPFLAGS -I$GNUSTEP_NETWORK_HEADERS/$ARCH" CPPFLAGS="$CPPFLAGS -I$GNUSTEP_NETWORK_HEADERS" CPPFLAGS="$CPPFLAGS -I$GNUSTEP_SYSTEM_HEADERS/$ALIB" CPPFLAGS="$CPPFLAGS -I$GNUSTEP_SYSTEM_HEADERS/$ARCH" CPPFLAGS="$CPPFLAGS -I$GNUSTEP_SYSTEM_HEADERS" LDFLAGS="$LDFLAGS -L$GNUSTEP_LOCAL_LIBRARIES/$ALIB" LDFLAGS="$LDFLAGS -L$GNUSTEP_LOCAL_LIBRARIES/$ARCH" LDFLAGS="$LDFLAGS -L$GNUSTEP_LOCAL_LIBRARIES" LDFLAGS="$LDFLAGS -L$GNUSTEP_NETWORK_LIBRARIES/$ALIB" LDFLAGS="$LDFLAGS -L$GNUSTEP_NETWORK_LIBRARIES/$ARCH" LDFLAGS="$LDFLAGS -L$GNUSTEP_NETWORK_LIBRARIES" LDFLAGS="$LDFLAGS -L$GNUSTEP_SYSTEM_LIBRARIES/$ALIB" LDFLAGS="$LDFLAGS -L$GNUSTEP_SYSTEM_LIBRARIES/$ARCH" LDFLAGS="$LDFLAGS -L$GNUSTEP_SYSTEM_LIBRARIES" fi #-------------------------------------------------------------------- # Find the compiler #-------------------------------------------------------------------- MAKECC=`gnustep-config --variable=CC` MAKECPP=`gnustep-config --variable=CPP` MAKECXX=`gnustep-config --variable=CXX` if test "$CC" = ""; then CC=$MAKECC export CC else if test "$CC" != "$MAKECC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You are running configure with the compiler ($CC) set to a different value from that used by gnustep-make ($MAKECC). To avoid conflicts/problems, reconfigure/reinstall gnustep-make to use CC=$CC or run the gnustep-base configure again with your CC environment variable set to $MAKECC" >&5 $as_echo "$as_me: WARNING: You are running configure with the compiler ($CC) set to a different value from that used by gnustep-make ($MAKECC). To avoid conflicts/problems, reconfigure/reinstall gnustep-make to use CC=$CC or run the gnustep-base configure again with your CC environment variable set to $MAKECC" >&2;} fi fi if test "$CPP" = ""; then CPP=$MAKECPP export CPP else if test "$CPP" != "$MAKECPP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You are running configure with the preprocessor ($CPP) set to a different value from that used by gnustep-make ($MAKECPP). To avoid conflicts/problems, reconfigure/reinstall gnustep-make to use CPP=$CPP or run the gnustep-base configure again with your CPP environment variable set to $MAKECPP" >&5 $as_echo "$as_me: WARNING: You are running configure with the preprocessor ($CPP) set to a different value from that used by gnustep-make ($MAKECPP). To avoid conflicts/problems, reconfigure/reinstall gnustep-make to use CPP=$CPP or run the gnustep-base configure again with your CPP environment variable set to $MAKECPP" >&2;} fi fi if test "$CXX" = ""; then CXX=$MAKECXX export CXX else if test "$CXX" != "$MAKECXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You are running configure with the compiler ($CXX) set to a different value from that used by gnustep-make ($MAKECXX). To avoid conflicts/problems, reconfigure/reinstall gnustep-make to use CXX=$CXX or run the gnustep-base configure again with your CXX environment variable set to $MAKECXX" >&5 $as_echo "$as_me: WARNING: You are running configure with the compiler ($CXX) set to a different value from that used by gnustep-make ($MAKECXX). To avoid conflicts/problems, reconfigure/reinstall gnustep-make to use CXX=$CXX or run the gnustep-base configure again with your CXX environment variable set to $MAKECXX" >&2;} fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default" if test "x$ac_cv_header_minix_config_h" = xyes; then : MINIX=yes else MINIX= fi if test "$MINIX" = yes; then $as_echo "#define _POSIX_SOURCE 1" >>confdefs.h $as_echo "#define _POSIX_1_SOURCE 2" >>confdefs.h $as_echo "#define _MINIX 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 $as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; } if ${ac_cv_safe_to_define___extensions__+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # define __EXTENSIONS__ 1 $ac_includes_default int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_safe_to_define___extensions__=yes else ac_cv_safe_to_define___extensions__=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5 $as_echo "$ac_cv_safe_to_define___extensions__" >&6; } test $ac_cv_safe_to_define___extensions__ = yes && $as_echo "#define __EXTENSIONS__ 1" >>confdefs.h $as_echo "#define _ALL_SOURCE 1" >>confdefs.h $as_echo "#define _GNU_SOURCE 1" >>confdefs.h $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h $as_echo "#define _TANDEM_SOURCE 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler is clang" >&5 $as_echo_n "checking whether the compiler is clang... " >&6; } if test ! x"${GCC}" = x"yes" ; then CLANG_CC=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else if "${CC}" -v 2>&1 | grep -q 'clang version'; then CLANG_CC=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else CLANG_CC=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi # Large file support needed by NSData/NSFileHandle. # These macros must be called after AC_USE_SYSTEM_EXTENSIONS because # the `fseeko' declaration may be hidden by default on some systems. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGEFILE_SOURCE value needed for large files" >&5 $as_echo_n "checking for _LARGEFILE_SOURCE value needed for large files... " >&6; } if ${ac_cv_sys_largefile_source+:} false; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* for off_t */ #include int main () { int (*fp) (FILE *, off_t, int) = fseeko; return fseeko (stdin, 0, 0) && fp (stdin, 0, 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_sys_largefile_source=no; break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGEFILE_SOURCE 1 #include /* for off_t */ #include int main () { int (*fp) (FILE *, off_t, int) = fseeko; return fseeko (stdin, 0, 0) && fp (stdin, 0, 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_sys_largefile_source=1; break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_cv_sys_largefile_source=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_source" >&5 $as_echo "$ac_cv_sys_largefile_source" >&6; } case $ac_cv_sys_largefile_source in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _LARGEFILE_SOURCE $ac_cv_sys_largefile_source _ACEOF ;; esac rm -rf conftest* # We used to try defining _XOPEN_SOURCE=500 too, to work around a bug # in glibc 2.1.3, but that breaks too many other things. # If you want fseeko and ftello with glibc, upgrade to a fixed glibc. if test $ac_cv_sys_largefile_source != unknown; then $as_echo "#define HAVE_FSEEKO 1" >>confdefs.h fi # Check whether --enable-largefile was given. if test "${enable_largefile+set}" = set; then : enableval=$enable_largefile; fi if test "$enable_largefile" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 $as_echo_n "checking for special C compiler options needed for large files... " >&6; } if ${ac_cv_sys_largefile_CC+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_sys_largefile_CC=no if test "$GCC" != yes; then ac_save_CC=$CC while :; do # IRIX 6.2 and later do not support large files by default, # so use the C compiler's -n32 option if that helps. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : break fi rm -f core conftest.err conftest.$ac_objext CC="$CC -n32" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_largefile_CC=' -n32'; break fi rm -f core conftest.err conftest.$ac_objext break done CC=$ac_save_CC rm -f conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5 $as_echo "$ac_cv_sys_largefile_CC" >&6; } if test "$ac_cv_sys_largefile_CC" != no; then CC=$CC$ac_cv_sys_largefile_CC fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 $as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } if ${ac_cv_sys_file_offset_bits+:} false; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_file_offset_bits=no; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _FILE_OFFSET_BITS 64 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_file_offset_bits=64; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_sys_file_offset_bits=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5 $as_echo "$ac_cv_sys_file_offset_bits" >&6; } case $ac_cv_sys_file_offset_bits in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits _ACEOF ;; esac rm -rf conftest* if test $ac_cv_sys_file_offset_bits = unknown; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 $as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; } if ${ac_cv_sys_large_files+:} false; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_large_files=no; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGE_FILES 1 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_large_files=1; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_sys_large_files=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5 $as_echo "$ac_cv_sys_large_files" >&6; } case $ac_cv_sys_large_files in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _LARGE_FILES $ac_cv_sys_large_files _ACEOF ;; esac rm -rf conftest* fi fi ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_default" if test "x$ac_cv_type_off_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define off_t long int _ACEOF fi #-------------------------------------------------------------------- # Check how to enable builtins for atomic operations #-------------------------------------------------------------------- ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports atomic operations" >&5 $as_echo_n "checking whether the compiler supports atomic operations... " >&6; }; cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ typedef int atomic; int main () { atomic x; atomic y; __sync_bool_compare_and_swap(&x, y, y + 1); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : have_atomic=yes else have_atomic=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext; if test "$have_atomic" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; }; $as_echo "#define USE_ATOMIC_BUILTINS 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; }; if test "$CC" = "gcc"; then saved_CFLAGS="$CFLAGS"; ATOMIC_CFLAGS=""; # FIXME: Forcing -march=i568 for any i568 or later CPU is a # stop gap measure to make the compiler emit native assembly # for atomic operations on i586 or latter processors (GCC by # default emits code compatible with the original i386 and # requires library functions to emulate atomic operations). # When gnustep-make takes care of this kind of target setting, # the check can safely be removed. case "$target_cpu" in i586*|i686*|i786*) ATOMIC_CFLAGS="-march=i586" CFLAGS="$saved_CFLAGS $ATOMIC_CFLAGS" ;; x86_64) ATOMIC_CFLAGS="-march=x86-64" CFLAGS="$saved_CFLAGS $ATOMIC_CFLAGS" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether CC supports atomic operations with -march" >&5 $as_echo_n "checking whether CC supports atomic operations with -march... " >&6; }; cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ typedef int atomic; int main () { atomic x; atomic y; __sync_bool_compare_and_swap(&x, y, y+1); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : need_march=yes else need_march=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext; if test "$need_march" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; }; OBJCFLAGS="$OBJCFLAGS $ATOMIC_CFLAGS"; $as_echo "#define USE_ATOMIC_BUILTINS 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; }; saved_LDFLAGS="$LDFLAGS"; LDFLAGS="$saved_LDFLAGS -lgcc"; { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether CC supports atomic operations using libgcc" >&5 $as_echo_n "checking whether CC supports atomic operations using libgcc... " >&6; }; cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ typedef int atomic; int main () { atomic x; atomic y; __sync_bool_compare_and_swap(&x, y, y+1); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : atomic_in_libgcc=yes else atomic_in_libgcc=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext; if test "$atomic_in_libgcc" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; }; LIBS="$LIBS -lgcc"; $as_echo "#define USE_ATOMIC_BUILTINS 1" >>confdefs.h else LDFLAGS="$saved_LDFLAGS"; { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; }; fi fi fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Extract the first word of "whoami", so it can be a program name with args. set dummy whoami; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_WHOAMI+:} false; then : $as_echo_n "(cached) " >&6 else case $WHOAMI in [\\/]* | ?:[\\/]*) ac_cv_path_WHOAMI="$WHOAMI" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_dummy="$PATH:/usr/ucb" for as_dir in $as_dummy do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_WHOAMI="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_WHOAMI" && ac_cv_path_WHOAMI="echo" ;; esac fi WHOAMI=$ac_cv_path_WHOAMI if test -n "$WHOAMI"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WHOAMI" >&5 $as_echo "$WHOAMI" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi # If the modern mechanism failswe may havew an older pkg-config # so try looking it up the old fashioned way. if test -z "$PKG_CONFIG"; then # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi #-------------------------------------------------------------------- # specific target_os options #-------------------------------------------------------------------- INCLUDE_FLAGS="$CPPFLAGS" LDIR_FLAGS="$LDFLAGS" # This is just for configuring. Later, in config.make, INCLUDE_FLAGS # goes in CONFIG_SYSTEM_INCL and LIBS goes in CONFIG_SYSTEM_LIBS case "$target_os" in freebsd* | openbsd* ) CPPFLAGS="$CPPFLAGS -I/usr/local/include" LDFLAGS="$LDFLAGS -L/usr/local/lib";; netbsd*) CPPFLAGS="$CPPFLAGS -I/usr/pkg/include" LDFLAGS="$LDFLAGS -Wl,-R/usr/pkg/lib -L/usr/pkg/lib";; linux-android* ) # link against libandroid for native application APIs LIBS="$LIBS -landroid";; esac #-------------------------------------------------------------------- # Set Apple/Darwin/OSX/NeXT information for other tests #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking the Objective-C runtime" >&5 $as_echo_n "checking the Objective-C runtime... " >&6; } if test "$OBJC_RUNTIME_LIB" = "nx" -o "$OBJC_RUNTIME_LIB" = "apple"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: NeXT" >&5 $as_echo "NeXT" >&6; } OBJCFLAGS="$OBJCFLAGS -fnext-runtime -DNeXT_RUNTIME" elif test "$OBJC_RUNTIME_LIB" = "ng"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: Next Gen" >&5 $as_echo "Next Gen" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: GNU" >&5 $as_echo "GNU" >&6; } if test "$CLANG_CC" = "yes"; then OBJCFLAGS="$OBJCFLAGS -fobjc-runtime=gcc" fi fi LIBOBJC=`gnustep-config --objc-libs` if test "$LIBOBJC" = ""; then as_fn_error $? "The command 'gnustep-config --objc-libs' (provided by the gnustep-make package) returned no Objective-C library. Unable to continue configuring without Objective-C support." "$LINENO" 5 exit 1 fi #-------------------------------------------------------------------- # Miscellaneous flags #-------------------------------------------------------------------- # Check to see if the libobjc library is in our GNUSTEP_SYSTEM_LIBRARIES. # If so, there are probably other libraries that we want there also, so # leave the proper includes in CPPFLAGS and LDFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking for custom shared objc library" >&5 $as_echo_n "checking for custom shared objc library... " >&6; } if ${gs_cv_objc_libdir+:} false; then : $as_echo_n "(cached) " >&6 else gs_cv_objc_libdir=NONE gs_cv_objc_incdir=NONE # Try GNUSTEP_SYSTEM_LIBRARIES first if test "$GNUSTEP_IS_FLATTENED" = yes; then GNUSTEP_LDIR="$GNUSTEP_SYSTEM_LIBRARIES" GNUSTEP_HDIR="$GNUSTEP_SYSTEM_HEADERS" else GNUSTEP_LDIR="$GNUSTEP_SYSTEM_LIBRARIES/$obj_dir" GNUSTEP_HDIR="$GNUSTEP_SYSTEM_HEADERS/$LIBRARY_COMBO" fi if test -f "$GNUSTEP_HDIR/objc/objc.h"; then if test -f "$GNUSTEP_LDIR/libobjc.a" -o -f "$GNUSTEP_LDIR/libobjc.so" -o -f "$GNUSTEP_LDIR/libobjc.dll.a" -o -f "$GNUSTEP_LDIR/libobjc-gnu.dylib" -o -f "$GNUSTEP_LDIR/objc.lib"; then gs_cv_objc_libdir="$GNUSTEP_LDIR" gs_cv_objc_incdir="$GNUSTEP_HDIR" fi fi # Try GNUSTEP_NETWORK_LIBRARIES second (override GNUSTEP_SYSTEM if # found) if test "$GNUSTEP_IS_FLATTENED" = yes; then GNUSTEP_LDIR="$GNUSTEP_NETWORK_LIBRARIES" GNUSTEP_HDIR="$GNUSTEP_NETWORK_HEADERS" else GNUSTEP_LDIR="$GNUSTEP_NETWORK_LIBRARIES/$obj_dir" GNUSTEP_HDIR="$GNUSTEP_NETWORK_HEADERS/$LIBRARY_COMBO" fi if test -f "$GNUSTEP_HDIR/objc/objc.h"; then if test -f "$GNUSTEP_LDIR/libobjc.a" -o -f "$GNUSTEP_LDIR/libobjc.so" -o -f "$GNUSTEP_LDIR/libobjc.dll.a" -o -f "$GNUSTEP_LDIR/libobjc-gnu.dylib" -o -f "$GNUSTEP_LDIR/objc.lib"; then gs_cv_objc_libdir="$GNUSTEP_LDIR" gs_cv_objc_incdir="$GNUSTEP_HDIR" fi fi # Try GNUSTEP_LOCAL_LIBRARIES third (override GNUSTEP_SYSTEM and # GNUSTEP_NETWORK if found) if test "$GNUSTEP_IS_FLATTENED" = yes; then GNUSTEP_LDIR="$GNUSTEP_LOCAL_LIBRARIES" GNUSTEP_HDIR="$GNUSTEP_LOCAL_HEADERS" else GNUSTEP_LDIR="$GNUSTEP_LOCAL_LIBRARIES/$obj_dir" GNUSTEP_HDIR="$GNUSTEP_LOCAL_HEADERS/$LIBRARY_COMBO" fi if test -f "$GNUSTEP_HDIR/objc/objc.h"; then if test -f "$GNUSTEP_LDIR/libobjc.a" -o -f "$GNUSTEP_LDIR/libobjc.so" -o -f "$GNUSTEP_LDIR/libobjc.dll.a" -o -f "$GNUSTEP_LDIR/libobjc-gnu.dylib" -o -f "$GNUSTEP_LDIR/objc.lib"; then gs_cv_objc_libdir="$GNUSTEP_LDIR" gs_cv_objc_incdir="$GNUSTEP_HDIR" fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gs_cv_objc_libdir" >&5 $as_echo "$gs_cv_objc_libdir" >&6; } if test "$gs_cv_objc_libdir" != "NONE"; then # # The following one is so that headers of custom libraries into # $GNUSTEP_HDIR are used before the standard ones # INCLUDE_FLAGS="$INCLUDE_FLAGS -I$gs_cv_objc_incdir" LDIR_FLAGS="$LDIR_FLAGS -L$gs_cv_objc_libdir/$LIBRARY_COMBO -L$gs_cv_objc_libdir" CPPFLAGS="$CPPFLAGS -I$gs_cv_objc_incdir" LDFLAGS="$LDFLAGS -L$gs_cv_objc_libdir" # add to path on Windows for config checks to find DLL at runtime case $host_os in mingw*|windows) PATH=$PATH:$gs_cv_objc_libdir;; esac fi #-------------------------------------------------------------------- # Check if Objective-C is installed #-------------------------------------------------------------------- for ac_header in objc/runtime.h do : ac_fn_c_check_header_mongrel "$LINENO" "objc/runtime.h" "ac_cv_header_objc_runtime_h" "$ac_includes_default" if test "x$ac_cv_header_objc_runtime_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_OBJC_RUNTIME_H 1 _ACEOF fi done for ac_header in objc/objc.h do : ac_fn_c_check_header_mongrel "$LINENO" "objc/objc.h" "ac_cv_header_objc_objc_h" "$ac_includes_default" if test "x$ac_cv_header_objc_objc_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_OBJC_OBJC_H 1 _ACEOF fi done if test $ac_cv_header_objc_objc_h = no; then echo "Check to make sure you have the Objective-C runtime library" echo "and its headers installed." as_fn_error $? "Could not find Objective-C headers" "$LINENO" 5 fi #-------------------------------------------------------------------- # Check for strange network stuff used by gdomap #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: for gdomap network details" >&5 $as_echo "$as_me: for gdomap network details" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: checking for variable length socket addresses" >&5 $as_echo_n "checking for variable length socket addresses... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { struct ifreq s; s.ifr_addr.sa_len = 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : sa_len=1 else sa_len=0 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $sa_len = 1; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5 $as_echo "found" >&6; } $as_echo "#define HAVE_SA_LEN 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for compiler visibility attribute support" >&5 $as_echo_n "checking for compiler visibility attribute support... " >&6; } saved_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int foo() __attribute__ ((visibility("internal"))); int foo(){ return 1; } int main(){ return foo(); } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5 $as_echo "found" >&6; } gs_visibility=1 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not present" >&5 $as_echo "not present" >&6; } gs_visibility=0 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat >>confdefs.h <<_ACEOF #define HAVE_VISIBILITY_ATTRIBUTE $gs_visibility _ACEOF CFLAGS="$saved_CFLAGS" #-------------------------------------------------------------------- # Check if system has buggy SO_REUSEADDR #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether SO_REUSEADDR is broken" >&5 $as_echo_n "checking whether SO_REUSEADDR is broken... " >&6; } if test "$cross_compiling" = yes; then : reuseaddr_ok="$cross_reuseaddr_ok" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include "$srcdir/config/config.reuseaddr.c" _ACEOF if ac_fn_c_try_run "$LINENO"; then : reuseaddr_ok=1 else reuseaddr_ok=0 fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi if test $reuseaddr_ok = 0; then $as_echo "#define BROKEN_SO_REUSEADDR 1" >>confdefs.h echo echo "The SO_REUSEADDR socket option for controlling re-use of network" echo "sockets immediately after shutdown appears to be broken on this" echo "machine. Networking code will be built without using this" echo "feature." echo "The effect of this lack is that when a network service is shut" echo "down, it cannot be re-started on the same network port until" echo "an operating-system timeout has expired." echo "For servers other than gdomap, GNUstep does not normally need" echo "a particular network port, so the problem is unlikely to arise." { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi #-------------------------------------------------------------------- # Check for thread flags for libobjc. #-------------------------------------------------------------------- # { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objc threading flags" >&5 $as_echo_n "checking for objc threading flags... " >&6; } # # Get them from gnustep-make which contains the real code to get them # objc_threaded=`grep objc_threaded: $CURRENT_GNUSTEP_MAKEFILES/$lobj_dir/config.make | sed -e 's/objc_threaded:=//'` # { $as_echo "$as_me:${as_lineno-$LINENO}: result: $objc_threaded" >&5 $as_echo "$objc_threaded" >&6; } #-------------------------------------------------------------------- # Byte order information needed for foundation headers. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 $as_echo_n "checking whether byte ordering is bigendian... " >&6; } if ${ac_cv_c_bigendian+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_bigendian=unknown # See if we're dealing with a universal compiler. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __APPLE_CC__ not a universal capable compiler #endif typedef int dummy; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # Check for potential -arch flags. It is not universal unless # there are at least two -arch flags with different values. ac_arch= ac_prev= for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do if test -n "$ac_prev"; then case $ac_word in i?86 | x86_64 | ppc | ppc64) if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then ac_arch=$ac_word else ac_cv_c_bigendian=universal break fi ;; esac ac_prev= elif test "x$ac_word" = "x-arch"; then ac_prev=arch fi done fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_c_bigendian = unknown; then # See if sys/param.h defines the BYTE_ORDER macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ && LITTLE_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if BYTE_ORDER != BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to _BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #ifndef _BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # Compile a test program. if test "$cross_compiling" = yes; then : # Try to guess by grepping values from an object file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; int use_ascii (int i) { return ascii_mm[i] + ascii_ii[i]; } short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; int use_ebcdic (int i) { return ebcdic_mm[i] + ebcdic_ii[i]; } extern int foo; int main () { return use_ascii (foo) == use_ebcdic (foo); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then ac_cv_c_bigendian=yes fi if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then if test "$ac_cv_c_bigendian" = unknown; then ac_cv_c_bigendian=no else # finding both strings is unlikely to happen, but who knows? ac_cv_c_bigendian=unknown fi fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* Are we little or big endian? From Harbison&Steele. */ union { long int l; char c[sizeof (long int)]; } u; u.l = 1; return u.c[sizeof (long int) - 1] == 1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_bigendian=no else ac_cv_c_bigendian=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 $as_echo "$ac_cv_c_bigendian" >&6; } case $ac_cv_c_bigendian in #( yes) $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h ;; #( no) ;; #( universal) $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h ;; #( *) as_fn_error $? "unknown endianness presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; esac if test $ac_cv_c_bigendian = yes; then GS_WORDS_BIGENDIAN=1 else GS_WORDS_BIGENDIAN=0 fi #-------------------------------------------------------------------- # Type size information needed for foundation headers. #-------------------------------------------------------------------- # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void*" >&5 $as_echo_n "checking size of void*... " >&6; } if ${ac_cv_sizeof_voidp+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void*))" "ac_cv_sizeof_voidp" "$ac_includes_default"; then : else if test "$ac_cv_type_voidp" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (void*) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_voidp=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_voidp" >&5 $as_echo "$ac_cv_sizeof_voidp" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_VOIDP $ac_cv_sizeof_voidp _ACEOF GS_SINT8="signed char" GS_UINT8="unsigned char" # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of short" >&5 $as_echo_n "checking size of short... " >&6; } if ${ac_cv_sizeof_short+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short" "$ac_includes_default"; then : else if test "$ac_cv_type_short" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (short) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_short=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_short" >&5 $as_echo "$ac_cv_sizeof_short" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_SHORT $ac_cv_sizeof_short _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5 $as_echo_n "checking size of int... " >&6; } if ${ac_cv_sizeof_int+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int" "$ac_includes_default"; then : else if test "$ac_cv_type_int" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (int) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_int=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5 $as_echo "$ac_cv_sizeof_int" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_INT $ac_cv_sizeof_int _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5 $as_echo_n "checking size of long... " >&6; } if ${ac_cv_sizeof_long+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long" "$ac_includes_default"; then : else if test "$ac_cv_type_long" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (long) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_long=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5 $as_echo "$ac_cv_sizeof_long" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_LONG $ac_cv_sizeof_long _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long long" >&5 $as_echo_n "checking size of long long... " >&6; } if ${ac_cv_sizeof_long_long+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long long))" "ac_cv_sizeof_long_long" "$ac_includes_default"; then : else if test "$ac_cv_type_long_long" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (long long) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_long_long=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_long" >&5 $as_echo "$ac_cv_sizeof_long_long" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of float" >&5 $as_echo_n "checking size of float... " >&6; } if ${ac_cv_sizeof_float+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (float))" "ac_cv_sizeof_float" "$ac_includes_default"; then : else if test "$ac_cv_type_float" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (float) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_float=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_float" >&5 $as_echo "$ac_cv_sizeof_float" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_FLOAT $ac_cv_sizeof_float _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of double" >&5 $as_echo_n "checking size of double... " >&6; } if ${ac_cv_sizeof_double+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (double))" "ac_cv_sizeof_double" "$ac_includes_default"; then : else if test "$ac_cv_type_double" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (double) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_double=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_double" >&5 $as_echo "$ac_cv_sizeof_double" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_DOUBLE $ac_cv_sizeof_double _ACEOF if test $ac_cv_sizeof_voidp = $ac_cv_sizeof_int; then GS_SADDR="int" GS_UADDR="unsigned int" else if test $ac_cv_sizeof_voidp = $ac_cv_sizeof_long; then GS_SADDR="long" GS_UADDR="unsigned long" else if test $ac_cv_sizeof_voidp = $ac_cv_sizeof_long_long; then GS_SADDR="long long" GS_UADDR="unsigned long long" else as_fn_error $? "Unable to find integer of same size as void*" "$LINENO" 5 fi fi fi if test $ac_cv_sizeof_short = 2; then GS_SINT16="signed short" GS_UINT16="unsigned short" else if test $ac_cv_sizeof_int = 2; then GS_SINT16="signed int" GS_UINT16="unsigned int" else as_fn_error $? "Unable to determine type for 16-bit integer" "$LINENO" 5 fi fi if test $ac_cv_sizeof_int = 4; then GS_SINT32="signed int" GS_UINT32="unsigned int" else if test $ac_cv_sizeof_long = 4; then GS_SINT32="signed long" GS_UINT32="unsigned long" else if test $ac_cv_sizeof_short = 4; then GS_SINT32="signed short" GS_UINT32="unsigned short" else as_fn_error $? "Unable to determine type for 32-bit integer" "$LINENO" 5 fi fi fi GS_HAVE_I64=1 if test $ac_cv_sizeof_int = 8; then GS_SINT64="signed int" GS_UINT64="unsigned int" else if test $ac_cv_sizeof_long = 8; then GS_SINT64="signed long" GS_UINT64="unsigned long" else if test $ac_cv_sizeof_long_long = 8; then GS_SINT64="signed long long" GS_UINT64="unsigned long long" else # 64-bit ints not supported - but we need a dummy type for byte-swapping # of 64-bit values arriving from another system. GS_SINT64="struct { gsu8 a8; }" GS_UINT64="struct { gsu8 a8; }" GS_HAVE_I64=0 fi fi fi GS_HAVE_I128=1 if test $ac_cv_sizeof_long = 16; then GS_SINT128="signed long" GS_UINT128="unsigned long" else if test $ac_cv_sizeof_long_long = 16; then GS_SINT128="signed long long" GS_UINT128="unsigned long long" else # 128-bit ints not supported - but we need a dummy type for byte-swapping # of 128-bit values arriving from another system. GS_SINT128="struct { gsu8 a[16]; }" GS_UINT128="struct { gsu8 a[16]; }" GS_HAVE_I128=0 fi fi if test $ac_cv_sizeof_float = 4; then GS_FLT32="float" else as_fn_error $? "Unable to determine type for 32-bit float" "$LINENO" 5 fi if test $ac_cv_sizeof_double = 8; then GS_FLT64="double" else as_fn_error $? "Unable to determine type for 64-bit float" "$LINENO" 5 fi #-------------------------------------------------------------------- # Type-size information for encoding into archives using NSArchiver etc. #-------------------------------------------------------------------- if test $ac_cv_sizeof_short = 2; then _GSC_S_SHT=_GSC_I16 else _GSC_S_SHT=_GSC_I32 fi if test $ac_cv_sizeof_int = 2; then _GSC_S_INT=_GSC_I16 else if test $ac_cv_sizeof_int = 4; then _GSC_S_INT=_GSC_I32 else if test $ac_cv_sizeof_int = 8; then _GSC_S_INT=_GSC_I64 else if test $ac_cv_sizeof_int = 16; then _GSC_S_INT=_GSC_I128 fi fi fi fi if test $ac_cv_sizeof_long = 4; then _GSC_S_LNG=_GSC_I32 else if test $ac_cv_sizeof_long = 8; then _GSC_S_LNG=_GSC_I64 else if test $ac_cv_sizeof_long = 16; then _GSC_S_LNG=_GSC_I128 fi fi fi if test $ac_cv_sizeof_long_long = 4; then _GSC_S_LNG_LNG=_GSC_I32 else if test $ac_cv_sizeof_long_long = 8; then _GSC_S_LNG_LNG=_GSC_I64 else if test $ac_cv_sizeof_long_long = 16; then _GSC_S_LNG_LNG=_GSC_I128 fi fi fi #-------------------------------------------------------------------- # Limit information needed for foundation headers. #-------------------------------------------------------------------- ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working INTPTR_MAX, INTPTR_MIN, UINTPTR_MAX" >&5 $as_echo_n "checking for working INTPTR_MAX, INTPTR_MIN, UINTPTR_MAX... " >&6; }; cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { int imax = INTPTR_MAX; int imin = INTPTR_MIN; unsigned umax = UINTPTR_MAX; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : have_valid_ptr_limits=yes else have_valid_ptr_limits=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext; if test "$have_valid_ptr_limits" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; }; BUGGY_PTR_LIMITS=0 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; }; BUGGY_PTR_LIMITS=1 case "$target_os" in solaris*) case "$target_cpu" in sparc64*|x86_64*) GS_INTPTR_MAX="INT64_MAX" GS_INTPTR_MIN="INT64_MIN" GS_UINTPTR_MAX="UINT64_MAX" ;; sparc*|i386*|i586*|i686*) GS_INTPTR_MAX="INT32_MAX" GS_INTPTR_MIN="INT32_MIN" GS_UINTPTR_MAX="UINT32_MAX" ;; *) ;; esac ;; # support for other OS's with broken macros to be added here (HP-UX, IRIX being known) *) ;; esac fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu #-------------------------------------------------------------------- # Setup dynamic linking #-------------------------------------------------------------------- # Copyright (C) 2005 Free Software Foundation # # Copying and distribution of this file, with or without modification, # are permitted in any medium without royalty provided the copyright # notice and this notice are preserved. #-------------------------------------------------------------------- # Guess if we are using a object file format that supports automatic # loading of constructor functions. # # If this system supports autoloading of constructors, that means that gcc # doesn't have to do it for us via collect2. This routine tests for this # in a very roundabout way by compiling a program with a constructor and # testing the file, via nm, for certain symbols that collect2 includes to # handle loading of constructors. # # Makes the following substitutions: # Defines CON_AUTOLOAD (whether constructor functions are autoloaded) #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking loading of constructor functions" >&5 $as_echo_n "checking loading of constructor functions... " >&6; } if ${objc_cv_con_autoload+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : objc_cv_con_autoload=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ static int loaded = 0; void cons_functions() __attribute__ ((constructor)); void cons_functions() { loaded = 1; } int main() { return ( (loaded == 1) ? 0 : 1); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : objc_cv_con_autoload=yes else objc_cv_con_autoload=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi case "$target_os" in cygwin*) objc_cv_con_autoload=yes;; mingw*) objc_cv_con_autoload=yes;; esac fi if test $objc_cv_con_autoload = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define CON_AUTOLOAD 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Copyright (C) 2005 Free Software Foundation # Copying and distribution of this file, with or without modification, # are permitted in any medium without royalty provided the copyright # notice and this notice are preserved. #-------------------------------------------------------------------- # Guess the type of dynamic linker for the system # # Makes the following substitutions: # DYNAMIC_LINKER - cooresponds to the interface that is included # in objc-load.c (i.e. #include "${DYNAMIC_LINKER}-load.h") #-------------------------------------------------------------------- DYNAMIC_LINKER=null ac_fn_c_check_header_mongrel "$LINENO" "windows.h" "ac_cv_header_windows_h" "$ac_includes_default" if test "x$ac_cv_header_windows_h" = xyes; then : DYNAMIC_LINKER=win32 fi if test $DYNAMIC_LINKER = null; then ac_fn_c_check_header_mongrel "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default" if test "x$ac_cv_header_dlfcn_h" = xyes; then : DYNAMIC_LINKER=simple fi fi if test $DYNAMIC_LINKER = null; then ac_fn_c_check_header_mongrel "$LINENO" "dl.h" "ac_cv_header_dl_h" "$ac_includes_default" if test "x$ac_cv_header_dl_h" = xyes; then : DYNAMIC_LINKER=hpux fi fi if test $DYNAMIC_LINKER = null; then ac_fn_c_check_header_mongrel "$LINENO" "dld/defs.h" "ac_cv_header_dld_defs_h" "$ac_includes_default" if test "x$ac_cv_header_dld_defs_h" = xyes; then : DYNAMIC_LINKER=dld fi fi # NB: This is used as follows: in Source/Makefile.postamble we copy # $(DYNAMIC_LINKER)-load.h into dynamic-load.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dynamic linker type" >&5 $as_echo_n "checking for dynamic linker type... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DYNAMIC_LINKER" >&5 $as_echo "$DYNAMIC_LINKER" >&6; } if test $DYNAMIC_LINKER = simple; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dladdr in -ldl" >&5 $as_echo_n "checking for dladdr in -ldl... " >&6; } if ${ac_cv_lib_dl_dladdr+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dladdr (); int main () { return dladdr (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dladdr=yes else ac_cv_lib_dl_dladdr=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dladdr" >&5 $as_echo "$ac_cv_lib_dl_dladdr" >&6; } if test "x$ac_cv_lib_dl_dladdr" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBDL 1 _ACEOF LIBS="-ldl $LIBS" fi fi # NOTE: libdl should be in LIBS now if it's available. for ac_func in dladdr do : ac_fn_c_check_func "$LINENO" "dladdr" "ac_cv_func_dladdr" if test "x$ac_cv_func_dladdr" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLADDR 1 _ACEOF fi done for ac_func in gethostbyname do : ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" if test "x$ac_cv_func_gethostbyname" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETHOSTBYNAME 1 _ACEOF fi done if test "$ac_cv_func_gethostbyname" = "no"; then # QNX has gethostbyname and friends in libsocket { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lsocket" >&5 $as_echo_n "checking for gethostbyname in -lsocket... " >&6; } if ${ac_cv_lib_socket_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsocket $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_socket_gethostbyname=yes else ac_cv_lib_socket_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_gethostbyname" >&5 $as_echo "$ac_cv_lib_socket_gethostbyname" >&6; } if test "x$ac_cv_lib_socket_gethostbyname" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBSOCKET 1 _ACEOF LIBS="-lsocket $LIBS" fi fi for ac_func in getaddrinfo do : ac_fn_c_check_func "$LINENO" "getaddrinfo" "ac_cv_func_getaddrinfo" if test "x$ac_cv_func_getaddrinfo" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETADDRINFO 1 _ACEOF fi done #-------------------------------------------------------------------- # Windows: check if we have native threading APIs and SRW locks #-------------------------------------------------------------------- HAVE_WIN32_THREADS_AND_LOCKS=0 case "$target_os" in mingw*|windows) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for native Windows threads and locks" >&5 $as_echo_n "checking for native Windows threads and locks... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define GS_USE_WIN32_THREADS_AND_LOCKS 1 #include "$srcdir/Source/GSPThread.h" _ACEOF if ac_fn_c_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_WIN32_THREADS_AND_LOCKS=1 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ;; esac #-------------------------------------------------------------------- # Check for pthread.h #-------------------------------------------------------------------- if test $HAVE_WIN32_THREADS_AND_LOCKS = 0; then for ac_header in pthread.h do : ac_fn_c_check_header_mongrel "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default" if test "x$ac_cv_header_pthread_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_PTHREAD_H 1 _ACEOF fi done for ac_header in pthread_np.h do : ac_fn_c_check_header_compile "$LINENO" "pthread_np.h" "ac_cv_header_pthread_np_h" "$ac_includes_default #ifdef HAVE_PTHREAD_H #include #endif " if test "x$ac_cv_header_pthread_np_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_PTHREAD_NP_H 1 _ACEOF fi done if test $ac_cv_header_pthread_h = yes ; then # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of pthread_mutex_t" >&5 $as_echo_n "checking size of pthread_mutex_t... " >&6; } if ${ac_cv_sizeof_pthread_mutex_t+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (pthread_mutex_t))" "ac_cv_sizeof_pthread_mutex_t" "$ac_includes_default #include "; then : else if test "$ac_cv_type_pthread_mutex_t" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (pthread_mutex_t) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_pthread_mutex_t=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_pthread_mutex_t" >&5 $as_echo "$ac_cv_sizeof_pthread_mutex_t" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_PTHREAD_MUTEX_T $ac_cv_sizeof_pthread_mutex_t _ACEOF GS_SIZEOF_MUTEX_T=$ac_cv_sizeof_pthread_mutex_t if test $ac_cv_sizeof_pthread_mutex_t = 0 ; then as_fn_error $? "Unable to find size of pthread_mutex_t (required)." "$LINENO" 5 fi GS_SIZEOF_COND_MUTEX_T=$ac_cv_sizeof_pthread_mutex_t # pthread_mutex_t.__data.__owner is non-standard since pthread_mutex_t is # nominally an opaque type. We must not rely on this for anything other # than debug output! ac_fn_c_check_member "$LINENO" "pthread_mutex_t" "__data.__owner" "ac_cv_member_pthread_mutex_t___data___owner" "$ac_includes_default #include " if test "x$ac_cv_member_pthread_mutex_t___data___owner" = xyes; then : fi if test $ac_cv_member_pthread_mutex_t___data___owner = yes ; then $as_echo "#define HAVE_PTHREAD_MUTEX_OWNER 1" >>confdefs.h fi # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of pthread_cond_t" >&5 $as_echo_n "checking size of pthread_cond_t... " >&6; } if ${ac_cv_sizeof_pthread_cond_t+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (pthread_cond_t))" "ac_cv_sizeof_pthread_cond_t" "$ac_includes_default #include "; then : else if test "$ac_cv_type_pthread_cond_t" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (pthread_cond_t) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_pthread_cond_t=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_pthread_cond_t" >&5 $as_echo "$ac_cv_sizeof_pthread_cond_t" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_PTHREAD_COND_T $ac_cv_sizeof_pthread_cond_t _ACEOF if test $ac_cv_sizeof_pthread_cond_t = 0 ; then as_fn_error $? "Unable to find size of pthread_cond_t (required)." "$LINENO" 5 fi GS_SIZEOF_COND_T=$ac_cv_sizeof_pthread_cond_t # The cast to long int works around a bug in the HP C Compiler, # see AC_CHECK_SIZEOF for more information. { $as_echo "$as_me:${as_lineno-$LINENO}: checking alignment of pthread_mutex_t" >&5 $as_echo_n "checking alignment of pthread_mutex_t... " >&6; } if ${ac_cv_alignof_pthread_mutex_t+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) offsetof (ac__type_alignof_, y)" "ac_cv_alignof_pthread_mutex_t" "$ac_includes_default #include #ifndef offsetof # define offsetof(type, member) ((char *) &((type *) 0)->member - (char *) 0) #endif typedef struct { char x; pthread_mutex_t y; } ac__type_alignof_;"; then : else if test "$ac_cv_type_pthread_mutex_t" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute alignment of pthread_mutex_t See \`config.log' for more details" "$LINENO" 5; } else ac_cv_alignof_pthread_mutex_t=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_alignof_pthread_mutex_t" >&5 $as_echo "$ac_cv_alignof_pthread_mutex_t" >&6; } cat >>confdefs.h <<_ACEOF #define ALIGNOF_PTHREAD_MUTEX_T $ac_cv_alignof_pthread_mutex_t _ACEOF GS_ALIGNOF_MUTEX_T=$ac_cv_alignof_pthread_mutex_t if test $ac_cv_alignof_pthread_mutex_t = 0 ; then as_fn_error $? "Unable to find align of pthread_mutex_t (required)." "$LINENO" 5 fi GS_ALIGNOF_COND_MUTEX_T=$ac_cv_alignof_pthread_mutex_t # The cast to long int works around a bug in the HP C Compiler, # see AC_CHECK_SIZEOF for more information. { $as_echo "$as_me:${as_lineno-$LINENO}: checking alignment of pthread_cond_t" >&5 $as_echo_n "checking alignment of pthread_cond_t... " >&6; } if ${ac_cv_alignof_pthread_cond_t+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) offsetof (ac__type_alignof_, y)" "ac_cv_alignof_pthread_cond_t" "$ac_includes_default #include #ifndef offsetof # define offsetof(type, member) ((char *) &((type *) 0)->member - (char *) 0) #endif typedef struct { char x; pthread_cond_t y; } ac__type_alignof_;"; then : else if test "$ac_cv_type_pthread_cond_t" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute alignment of pthread_cond_t See \`config.log' for more details" "$LINENO" 5; } else ac_cv_alignof_pthread_cond_t=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_alignof_pthread_cond_t" >&5 $as_echo "$ac_cv_alignof_pthread_cond_t" >&6; } cat >>confdefs.h <<_ACEOF #define ALIGNOF_PTHREAD_COND_T $ac_cv_alignof_pthread_cond_t _ACEOF if test $ac_cv_alignof_pthread_cond_t = 0 ; then as_fn_error $? "Unable to find align of pthread_cond_t (required)." "$LINENO" 5 fi GS_ALIGNOF_COND_T=$ac_cv_alignof_pthread_cond_t else as_fn_error $? "Unable to find pthread.h (needed for thread support)." "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_join in -lpthread" >&5 $as_echo_n "checking for pthread_join in -lpthread... " >&6; } if ${ac_cv_lib_pthread_pthread_join+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_join (); int main () { return pthread_join (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthread_pthread_join=yes else ac_cv_lib_pthread_pthread_join=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_join" >&5 $as_echo "$ac_cv_lib_pthread_pthread_join" >&6; } if test "x$ac_cv_lib_pthread_pthread_join" = xyes; then : pthread_ok=yes else pthread_ok=no fi if test $pthread_ok = yes ; then LIBS="$LIBS -lpthread" else case "$target_os" in mingw*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_join in -lpthreadGC2" >&5 $as_echo_n "checking for pthread_join in -lpthreadGC2... " >&6; } if ${ac_cv_lib_pthreadGC2_pthread_join+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthreadGC2 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_join (); int main () { return pthread_join (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthreadGC2_pthread_join=yes else ac_cv_lib_pthreadGC2_pthread_join=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthreadGC2_pthread_join" >&5 $as_echo "$ac_cv_lib_pthreadGC2_pthread_join" >&6; } if test "x$ac_cv_lib_pthreadGC2_pthread_join" = xyes; then : pthread_ok=yes else pthread_ok=no fi if test $pthread_ok = yes ; then LIBS="$LIBS -lpthreadGC2" fi ;; windows) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_join in -lpthreadVC2" >&5 $as_echo_n "checking for pthread_join in -lpthreadVC2... " >&6; } if ${ac_cv_lib_pthreadVC2_pthread_join+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthreadVC2 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_join (); int main () { return pthread_join (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthreadVC2_pthread_join=yes else ac_cv_lib_pthreadVC2_pthread_join=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthreadVC2_pthread_join" >&5 $as_echo "$ac_cv_lib_pthreadVC2_pthread_join" >&6; } if test "x$ac_cv_lib_pthreadVC2_pthread_join" = xyes; then : pthread_ok=yes else pthread_ok=no fi if test $pthread_ok = yes ; then LIBS="$LIBS -lpthreadVC2" fi ;; nto*|qnx*|*android*) # Android and QNX have pthread in libc instead of libpthread { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_join in -lc" >&5 $as_echo_n "checking for pthread_join in -lc... " >&6; } if ${ac_cv_lib_c_pthread_join+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lc $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_join (); int main () { return pthread_join (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_c_pthread_join=yes else ac_cv_lib_c_pthread_join=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_pthread_join" >&5 $as_echo "$ac_cv_lib_c_pthread_join" >&6; } if test "x$ac_cv_lib_c_pthread_join" = xyes; then : pthread_ok=yes else pthread_ok=no fi if test $pthread_ok = yes ; then LIBS="$LIBS -lc" fi ;; esac fi if test $pthread_ok = no ; then as_fn_error $? "Unable to find pthread library (needed for thread support)." "$LINENO" 5 fi # Check threading extensions for ac_func in pthread_getthreadid_np pthread_main_np do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done # Typically need librt on Solaris for sched_yield { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sched_yield in -lrt" >&5 $as_echo_n "checking for sched_yield in -lrt... " >&6; } if ${ac_cv_lib_rt_sched_yield+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lrt $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char sched_yield (); int main () { return sched_yield (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_rt_sched_yield=yes else ac_cv_lib_rt_sched_yield=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_sched_yield" >&5 $as_echo "$ac_cv_lib_rt_sched_yield" >&6; } if test "x$ac_cv_lib_rt_sched_yield" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBRT 1 _ACEOF LIBS="-lrt $LIBS" fi # Check if we can name pthreads { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_setname_np()" >&5 $as_echo_n "checking for pthread_setname_np()... " >&6; } if ${gs_cv_pthread_setname_np+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { pthread_setname_np("name"); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gs_cv_pthread_setname_np=darwin else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { pthread_setname_np(pthread_self(), "name"); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gs_cv_pthread_setname_np=glibc else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { pthread_setname_np(pthread_self(), "%s", "name"); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gs_cv_pthread_setname_np=netbsd else gs_cv_pthread_setname_np=none fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gs_cv_pthread_setname_np" >&5 $as_echo "$gs_cv_pthread_setname_np" >&6; } case $gs_cv_pthread_setname_np in darwin) $as_echo "#define PTHREAD_SETNAME(a) pthread_setname_np(a)" >>confdefs.h ;; glibc) $as_echo "#define PTHREAD_SETNAME(a) pthread_setname_np(pthread_self(),a)" >>confdefs.h ;; netbsd) $as_echo "#define PTHREAD_SETNAME(a) pthread_setname_np(pthread_self(),\"%s\",a)" >>confdefs.h ;; esac # Check if we have spinlock support for ac_func in pthread_spin_lock do : ac_fn_c_check_func "$LINENO" "pthread_spin_lock" "ac_cv_func_pthread_spin_lock" if test "x$ac_cv_func_pthread_spin_lock" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_PTHREAD_SPIN_LOCK 1 _ACEOF fi done fi #-------------------------------------------------------------------- # Check Win32 lock sizes #-------------------------------------------------------------------- if test $HAVE_WIN32_THREADS_AND_LOCKS = 1; then # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of gs_mutex_t" >&5 $as_echo_n "checking size of gs_mutex_t... " >&6; } if ${ac_cv_sizeof_gs_mutex_t+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (gs_mutex_t))" "ac_cv_sizeof_gs_mutex_t" "$ac_includes_default #define GS_USE_WIN32_THREADS_AND_LOCKS 1 #include \"Source/GSPThread.h\" "; then : else if test "$ac_cv_type_gs_mutex_t" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (gs_mutex_t) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_gs_mutex_t=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_gs_mutex_t" >&5 $as_echo "$ac_cv_sizeof_gs_mutex_t" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_GS_MUTEX_T $ac_cv_sizeof_gs_mutex_t _ACEOF GS_SIZEOF_MUTEX_T=$ac_cv_sizeof_gs_mutex_t if test $ac_cv_sizeof_gs_mutex_t = 0 ; then as_fn_error $? "Unable to find size of gs_mutex_t (required)." "$LINENO" 5 fi # The cast to long int works around a bug in the HP C Compiler, # see AC_CHECK_SIZEOF for more information. { $as_echo "$as_me:${as_lineno-$LINENO}: checking alignment of gs_mutex_t" >&5 $as_echo_n "checking alignment of gs_mutex_t... " >&6; } if ${ac_cv_alignof_gs_mutex_t+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) offsetof (ac__type_alignof_, y)" "ac_cv_alignof_gs_mutex_t" "$ac_includes_default #define GS_USE_WIN32_THREADS_AND_LOCKS 1 #include \"Source/GSPThread.h\" #ifndef offsetof # define offsetof(type, member) ((char *) &((type *) 0)->member - (char *) 0) #endif typedef struct { char x; gs_mutex_t y; } ac__type_alignof_;"; then : else if test "$ac_cv_type_gs_mutex_t" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute alignment of gs_mutex_t See \`config.log' for more details" "$LINENO" 5; } else ac_cv_alignof_gs_mutex_t=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_alignof_gs_mutex_t" >&5 $as_echo "$ac_cv_alignof_gs_mutex_t" >&6; } cat >>confdefs.h <<_ACEOF #define ALIGNOF_GS_MUTEX_T $ac_cv_alignof_gs_mutex_t _ACEOF GS_ALIGNOF_MUTEX_T=$ac_cv_alignof_gs_mutex_t if test $ac_cv_alignof_gs_mutex_t = 0 ; then as_fn_error $? "Unable to find align of gs_mutex_t (required)." "$LINENO" 5 fi # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of CONDITION_VARIABLE" >&5 $as_echo_n "checking size of CONDITION_VARIABLE... " >&6; } if ${ac_cv_sizeof_CONDITION_VARIABLE+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (CONDITION_VARIABLE))" "ac_cv_sizeof_CONDITION_VARIABLE" "$ac_includes_default #include "; then : else if test "$ac_cv_type_CONDITION_VARIABLE" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (CONDITION_VARIABLE) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_CONDITION_VARIABLE=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_CONDITION_VARIABLE" >&5 $as_echo "$ac_cv_sizeof_CONDITION_VARIABLE" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_CONDITION_VARIABLE $ac_cv_sizeof_CONDITION_VARIABLE _ACEOF GS_SIZEOF_COND_T=$ac_cv_sizeof_CONDITION_VARIABLE if test $ac_cv_sizeof_CONDITION_VARIABLE = 0 ; then as_fn_error $? "Unable to find size of CONDITION_VARIABLE (required)." "$LINENO" 5 fi # The cast to long int works around a bug in the HP C Compiler, # see AC_CHECK_SIZEOF for more information. { $as_echo "$as_me:${as_lineno-$LINENO}: checking alignment of CONDITION_VARIABLE" >&5 $as_echo_n "checking alignment of CONDITION_VARIABLE... " >&6; } if ${ac_cv_alignof_CONDITION_VARIABLE+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) offsetof (ac__type_alignof_, y)" "ac_cv_alignof_CONDITION_VARIABLE" "$ac_includes_default #include #ifndef offsetof # define offsetof(type, member) ((char *) &((type *) 0)->member - (char *) 0) #endif typedef struct { char x; CONDITION_VARIABLE y; } ac__type_alignof_;"; then : else if test "$ac_cv_type_CONDITION_VARIABLE" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute alignment of CONDITION_VARIABLE See \`config.log' for more details" "$LINENO" 5; } else ac_cv_alignof_CONDITION_VARIABLE=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_alignof_CONDITION_VARIABLE" >&5 $as_echo "$ac_cv_alignof_CONDITION_VARIABLE" >&6; } cat >>confdefs.h <<_ACEOF #define ALIGNOF_CONDITION_VARIABLE $ac_cv_alignof_CONDITION_VARIABLE _ACEOF GS_ALIGNOF_COND_T=$ac_cv_alignof_CONDITION_VARIABLE if test $ac_cv_alignof_CONDITION_VARIABLE = 0 ; then as_fn_error $? "Unable to find align of CONDITION_VARIABLE (required)." "$LINENO" 5 fi # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of SRWLOCK" >&5 $as_echo_n "checking size of SRWLOCK... " >&6; } if ${ac_cv_sizeof_SRWLOCK+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (SRWLOCK))" "ac_cv_sizeof_SRWLOCK" "$ac_includes_default #include "; then : else if test "$ac_cv_type_SRWLOCK" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (SRWLOCK) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_SRWLOCK=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_SRWLOCK" >&5 $as_echo "$ac_cv_sizeof_SRWLOCK" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_SRWLOCK $ac_cv_sizeof_SRWLOCK _ACEOF GS_SIZEOF_COND_MUTEX_T=$ac_cv_sizeof_SRWLOCK if test $ac_cv_sizeof_SRWLOCK = 0 ; then as_fn_error $? "Unable to find size of SRWLOCK (required)." "$LINENO" 5 fi # The cast to long int works around a bug in the HP C Compiler, # see AC_CHECK_SIZEOF for more information. { $as_echo "$as_me:${as_lineno-$LINENO}: checking alignment of SRWLOCK" >&5 $as_echo_n "checking alignment of SRWLOCK... " >&6; } if ${ac_cv_alignof_SRWLOCK+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) offsetof (ac__type_alignof_, y)" "ac_cv_alignof_SRWLOCK" "$ac_includes_default #include #ifndef offsetof # define offsetof(type, member) ((char *) &((type *) 0)->member - (char *) 0) #endif typedef struct { char x; SRWLOCK y; } ac__type_alignof_;"; then : else if test "$ac_cv_type_SRWLOCK" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute alignment of SRWLOCK See \`config.log' for more details" "$LINENO" 5; } else ac_cv_alignof_SRWLOCK=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_alignof_SRWLOCK" >&5 $as_echo "$ac_cv_alignof_SRWLOCK" >&6; } cat >>confdefs.h <<_ACEOF #define ALIGNOF_SRWLOCK $ac_cv_alignof_SRWLOCK _ACEOF GS_ALIGNOF_COND_MUTEX_T=$ac_cv_alignof_SRWLOCK if test $ac_cv_alignof_SRWLOCK = 0 ; then as_fn_error $? "Unable to find align of SRWLOCK (required)." "$LINENO" 5 fi fi #-------------------------------------------------------------------- # One of these function needed by NSThread.m and objc initialize test #-------------------------------------------------------------------- for ac_func in nanosleep usleep Sleep do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objc_root_class attribute support" >&5 $as_echo_n "checking for objc_root_class attribute support... " >&6; } saved_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -Werror $OBJCFLAGS -x objective-c" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ __attribute__((objc_root_class)) @interface RootObject @end @implementation RootObject @end _ACEOF if ac_fn_c_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5 $as_echo "found" >&6; } gs_objc_root_class_attr=1 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not present" >&5 $as_echo "not present" >&6; } gs_objc_root_class_attr=0 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext GS_HAVE_OBJC_ROOT_CLASS_ATTR=$gs_objc_root_class_attr cat >>confdefs.h <<_ACEOF #define HAVE_OBJC_ROOT_CLASS_ATTRIBUTE $gs_objc_root_class_attr _ACEOF CFLAGS=$saved_CFLAGS #-------------------------------------------------------------------- # Check whether we can get the system thread ID #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gettid()" >&5 $as_echo_n "checking for gettid()... " >&6; } if ${ac_cv_gettid+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_gettid=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _GNU_SOURCE #include #include #include int main(int argc, char **argv) { pid_t t = syscall(SYS_gettid); return t == -1 ? 1 : 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_gettid=yes else ac_cv_gettid=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gettid" >&5 $as_echo "$ac_cv_gettid" >&6; } if test "$ac_cv_gettid" = "yes"; then $as_echo "#define HAVE_GETTID 1" >>confdefs.h fi #-------------------------------------------------------------------- # Check whether Objective-C /really/ works #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether objc really works" >&5 $as_echo_n "checking whether objc really works... " >&6; } saved_LIBS="$LIBS" saved_CPPFLAGS="$CPPFLAGS" LIBS="$LIBS $LIBOBJC" CPPFLAGS="$CPPFLAGS $OBJCFLAGS -x objective-c" if test x"$objc_threaded" != x""; then LIBS="$LIBS $objc_threaded" fi LIBS="$LIBS $extra_LIBS" if ${gs_cv_objc_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : gs_cv_objc_works="$cross_gs_cv_objc_works" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include "$srcdir/config/config.objc.m" _ACEOF if ac_fn_c_try_run "$LINENO"; then : gs_cv_objc_works=yes else gs_cv_objc_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi if test $gs_cv_objc_works = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } echo "I don't seem to be able to use your Objective-C compiler to produce" echo "working binaries! Please check your Objective-C compiler installation." echo "If you are using gcc-3.x make sure that your compiler's libgcc_s and libobjc" echo "can be found by the dynamic linker - usually that requires you to play" echo "with LD_LIBRARY_PATH or /etc/ld.so.conf." echo "Please refer to your compiler installation instructions for more help." as_fn_error $? "The Objective-C compiler does not work or is not installed properly." "$LINENO" 5 fi # Don't revert any Objective-C flags as they are used in the next test #--------------------------------------------------------------------- # See if we are using a compiler which allows us to change the class # to be used for constant strings by using the -fconstant-string-class # option. If that is the case, we change it to NSConstantString. # Unless we are building for the apple runtime (ie only building base # additions library and not implementing a constant string class). #--------------------------------------------------------------------- if test "$OBJC_RUNTIME_LIB" = "nx" -o "$OBJC_RUNTIME_LIB" = "apple"; then NX_CONST_STRING_OBJCFLAGS="" NX_CONST_STRING_CLASS=NXConstantString else strclass_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -fconstant-string-class=FooConstantString" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the compiler supports -fconstant-string-class" >&5 $as_echo_n "checking if the compiler supports -fconstant-string-class... " >&6; } if ${gs_cv_objc_compiler_supports_constant_string_class+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : gs_cv_objc_compiler_supports_constant_string_class="$cross_gs_cv_objc_compiler_supports_constant_string_class" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include "$srcdir/config/config.constant-string-class.m" _ACEOF if ac_fn_c_try_run "$LINENO"; then : gs_cv_objc_compiler_supports_constant_string_class=yes else gs_cv_objc_compiler_supports_constant_string_class=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi if test $gs_cv_objc_compiler_supports_constant_string_class = yes; then NX_CONST_STRING_OBJCFLAGS="-fconstant-string-class=NSConstantString" NX_CONST_STRING_CLASS=NSConstantString { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } # Check whether --enable-nxconstantstring was given. if test "${enable_nxconstantstring+set}" = set; then : enableval=$enable_nxconstantstring; else enable_nxconstantstring=no fi if test $enable_nxconstantstring = yes; then NX_CONST_STRING_OBJCFLAGS="" NX_CONST_STRING_CLASS=NXConstantString { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You have enabled the use of NXConstantString as the string class in gnustep-base. The objective-c runtime library typically implements its own class of the same name, so you must either enforce a link order which ensures that the gnustep-base implementation is used, or (better) you must remove the class from the runtime library!" >&5 $as_echo "$as_me: WARNING: You have enabled the use of NXConstantString as the string class in gnustep-base. The objective-c runtime library typically implements its own class of the same name, so you must either enforce a link order which ensures that the gnustep-base implementation is used, or (better) you must remove the class from the runtime library!" >&2;} else as_fn_error $? "Your compiler does not appear to implement the -fconstant-string-class option needed for support of strings. Please check for a more recent version or consider using --enable-nxconstantstring" "$LINENO" 5 fi fi CPPFLAGS="$strclass_CPPFLAGS" fi # Don't revert any Objective-C flags as they are used in the next test #--------------------------------------------------------------------- # Guess if we are using a compiler which has the (GNU extension) +load # method which is executed before main. # Defines HAVE_LOAD_METHOD if +load methods are called before main. # Needed by NSProcessInfo.m #--------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if +load method is executed before main" >&5 $as_echo_n "checking if +load method is executed before main... " >&6; } if ${gs_cv_objc_load_method_worked+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : gs_cv_objc_load_method_worked="$cross_gs_cv_objc_load_method_worked" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include "$srcdir/config/config.loadtest.m" _ACEOF if ac_fn_c_try_run "$LINENO"; then : gs_cv_objc_load_method_worked=yes else gs_cv_objc_load_method_worked=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi if test $gs_cv_objc_load_method_worked = yes; then $as_echo "#define HAVE_LOAD_METHOD 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Don't revert any Objective-C flags as they are used in the next test #-------------------------------------------------------------------- # Check for thread synchronisation support in runtime #-------------------------------------------------------------------- if test "$host_os" = windows -a "$OBJC_RUNTIME_LIB" = "ng"; then # On Windows MSVC, AC_CHECK_FUNCS() will throw linker errors ("relocation # against symbol in discarded section") as the file won't contain any actual # ObjC code, so we just assume the function is there. { $as_echo "$as_me:${as_lineno-$LINENO}: assuming objc_sync_enter() on Windows MSVC" >&5 $as_echo "$as_me: assuming objc_sync_enter() on Windows MSVC" >&6;} OBJCSYNC=1 else for ac_func in objc_sync_enter do : ac_fn_c_check_func "$LINENO" "objc_sync_enter" "ac_cv_func_objc_sync_enter" if test "x$ac_cv_func_objc_sync_enter" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_OBJC_SYNC_ENTER 1 _ACEOF fi done if test $ac_cv_func_objc_sync_enter = yes ; then OBJCSYNC=1 else OBJCSYNC=0 if test "$OBJC_RUNTIME_LIB" = "ng"; then as_fn_error $? "The objc runtime library does not appear to have synchronisation support. Try re-configuring gnustep-make with a CPPFLAGS variable containing a -L point to specify the directory containing the correct libobjc, or using the --with-objc-lib-flag=... option." "$LINENO" 5 fi fi fi # Don't revert any Objective-C flags as they are used in the next test #-------------------------------------------------------------------- # Check for ObjC2 support in runtime #-------------------------------------------------------------------- if test "$cross_compiling" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: \"Cross compiling! Using predefined OBJC2RUNTIME variable\"" >&5 $as_echo "$as_me: \"Cross compiling! Using predefined OBJC2RUNTIME variable\"" >&6;} OBJC2RUNTIME="$cross_objc2_runtime" elif test "$host_os" = windows -a "$OBJC_RUNTIME_LIB" = "ng"; then # On Windows MSVC, AC_CHECK_FUNCS() will throw linker errors ("relocation # against symbol in discarded section") as the file won't contain any actual # ObjC code, so we just assume the function is there. { $as_echo "$as_me:${as_lineno-$LINENO}: assuming objc_setProperty() on Windows MSVC" >&5 $as_echo "$as_me: assuming objc_setProperty() on Windows MSVC" >&6;} OBJC2RUNTIME=1 else for ac_func in objc_setProperty do : ac_fn_c_check_func "$LINENO" "objc_setProperty" "ac_cv_func_objc_setProperty" if test "x$ac_cv_func_objc_setProperty" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_OBJC_SETPROPERTY 1 _ACEOF fi done if test $ac_cv_func_objc_setProperty = yes ; then OBJC2RUNTIME=1 else OBJC2RUNTIME=0 if test "$OBJC_RUNTIME_LIB" = "ng"; then as_fn_error $? "The objc runtime library does not appear to have property support. Try re-configuring gnustep-make with a CPPFLAGS variable containing a -L point to specify the directory containing the correct libobjc, or using the --with-objc-lib-flag=... option." "$LINENO" 5 fi fi fi #-------------------------------------------------------------------- # Check for blocks support in runtime #-------------------------------------------------------------------- if test "$host_os" = windows -a "$OBJC_RUNTIME_LIB" = "ng"; then # On Windows MSVC, AC_CHECK_FUNCS() will throw linker errors ("relocation # against symbol in discarded section") as the file won't contain any actual # ObjC code, so we just assume the function is there. { $as_echo "$as_me:${as_lineno-$LINENO}: assuming _Block_copy() on Windows MSVC" >&5 $as_echo "$as_me: assuming _Block_copy() on Windows MSVC" >&6;} HAVE_BLOCKS=1 else for ac_func in _Block_copy do : ac_fn_c_check_func "$LINENO" "_Block_copy" "ac_cv_func__Block_copy" if test "x$ac_cv_func__Block_copy" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE__BLOCK_COPY 1 _ACEOF fi done if test $ac_cv_func__Block_copy = yes ; then HAVE_BLOCKS=1 else HAVE_BLOCKS=0 if test "$OBJC_RUNTIME_LIB" = "ng"; then as_fn_error $? "The objc runtime library does not appear to have blocks support. Try re-configuring gnustep-make with a CPPFLAGS variable containing a -L point to specify the directory containing the correct libobjc, or using the --with-objc-lib-flag=... option." "$LINENO" 5 fi fi fi # Don't revert any Objective-C flags as they are used in the next test GS_NONFRAGILE=0 if test "$nonfragile" = "yes"; then if test "$host_os" = windows -a "$OBJC_RUNTIME_LIB" = "ng"; then # On Windows MSVC, AC_CHECK_FUNCS() will throw linker errors ("relocation # against symbol in discarded section") as the file won't contain any actual # ObjC code, so we just assume the function is there. { $as_echo "$as_me:${as_lineno-$LINENO}: assuming non-fragile-abi support on Windows MSVC" >&5 $as_echo "$as_me: assuming non-fragile-abi support on Windows MSVC" >&6;} GS_NONFRAGILE=1 else saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $OBJCFLAGS -x objective-c" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-fragile-abi support" >&5 $as_echo_n "checking for non-fragile-abi support... " >&6; } if test "$cross_compiling" = yes; then : non_fragile="$cross_non_fragile" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include "$srcdir/config/config.non-fragile-ivars.m" _ACEOF if ac_fn_c_try_run "$LINENO"; then : non_fragile=yes else non_fragile=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi CPPFLAGS="$saved_CPPFLAGS" if test $non_fragile = yes; then GS_NONFRAGILE=1 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $non_fragile" >&5 $as_echo "$non_fragile" >&6; } fi fi # Don't revert any Objective-C flags as they are used in the next test #-------------------------------------------------------------------- # get_uninstalled_dtable used by behavior.m and objc-load.m #-------------------------------------------------------------------- cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "objc_get_uninstalled_dtable" >/dev/null 2>&1; then : $as_echo "#define HAVE_OBJC_GET_UNINSTALLED_DTABLE 1" >>confdefs.h fi rm -f conftest* # Don't revert any Objective-C flags as they are used in the next test #-------------------------------------------------------------------- # Native Objective-C exceptions #-------------------------------------------------------------------- if test "$OBJC_RUNTIME_LIB" = "ng"; then exceptions=yes else # Determine if native Objective-C exceptions are enabled # in gnustep-make. They are enabled if the compiler supports it; they # are disabled if it doesn't. And, of course, the user may have # forced one behaviour or the other. Note that we go and look at the # actual config.make file to be able to know what was configured in # gnustep-make regardless of any gnustep-base that is currently # installed. We can't use `gnustep-config --objc-flags` because that # may report native exceptions as disabled because the currently # installed gnustep-base has them disabled. if grep USE_OBJC_EXCEPTIONS $CURRENT_GNUSTEP_MAKEFILES/$lobj_dir/config.make | grep yes >&5 2>&5; then exceptions=yes else exceptions=no fi fi # At this point, if exceptions=no, then native exceptions are disabled # and won't be used. If exceptions=yes, we need to check if they work # and if the runtime has proper support for them. If it does, we'll # happily use them; if it doesn't, we'll automatically disable them # because they don't work. ;-) #-------------------------------------------------------------------- # One of these is needed by for handling uncaught exceptions #-------------------------------------------------------------------- # TODO: These checks are not really needed if native exceptions are # disabled. So maybe we should not run them at all in that case. On # the other hand, that case is going to become more and more unusual. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objc_setUncaughtExceptionHandler() in runtime" >&5 $as_echo_n "checking for objc_setUncaughtExceptionHandler() in runtime... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include "$srcdir/config/config.setUncaughtExceptionHandler.m" _ACEOF if ac_fn_c_try_link "$LINENO"; then : have_set_uncaught_exception_handler=yes else have_set_uncaught_exception_handler=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test $have_set_uncaught_exception_handler = yes; then $as_echo "#define HAVE_SET_UNCAUGHT_EXCEPTION_HANDLER 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_set_uncaught_exception_handler" >&5 $as_echo "$have_set_uncaught_exception_handler" >&6; } # Don't revert any Objective-C flags as they are used in the next test { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objc_set_unexpected() in runtime" >&5 $as_echo_n "checking for objc_set_unexpected() in runtime... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include "$srcdir/config/config.set_unexpected.m" _ACEOF if ac_fn_c_try_link "$LINENO"; then : have_set_unexpected=yes else have_set_unexpected=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test $have_set_unexpected = yes; then $as_echo "#define HAVE_SET_UNEXPECTED 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_set_unexpected" >&5 $as_echo "$have_set_unexpected" >&6; } # Don't revert any Objective-C flags as they are used in the next test { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _objc_unexpected_exception in runtime" >&5 $as_echo_n "checking for _objc_unexpected_exception in runtime... " >&6; } if test "$host_os" = windows -a "$OBJC_RUNTIME_LIB" = "ng"; then # On Windows MSVC, AC_CHECK_FUNCS() will throw linker errors ("relocation # against symbol in discarded section") as the file won't contain any actual # ObjC code, so we just assume the function is there. { $as_echo "$as_me:${as_lineno-$LINENO}: assuming _objc_unexpected_exception() on Windows MSVC" >&5 $as_echo "$as_me: assuming _objc_unexpected_exception() on Windows MSVC" >&6;} have_unexpected=yes else if test "$cross_compiling" = yes; then : have_unexpected="$cross_have_unexpected" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include "$srcdir/config/config.unexpected.m" _ACEOF if ac_fn_c_try_run "$LINENO"; then : have_unexpected=yes else have_unexpected=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi if test $have_unexpected = yes; then $as_echo "#define HAVE_UNEXPECTED 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_unexpected" >&5 $as_echo "$have_unexpected" >&6; } # TODO: It would also be nice to actually test that native Objective-C # exceptions work. if test "$exceptions" = "yes"; then if test x"$have_set_uncaught_exception_handler" = x"no"; then if test x"$have_set_unexpected" = x"no"; then if test x"$have_unexpected" = x"no"; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling native Objective-C exceptions because the ObjC runtime" >&5 $as_echo "$as_me: Disabling native Objective-C exceptions because the ObjC runtime" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: has no way to set an uncaught exception handler. Please install" >&5 $as_echo "$as_me: has no way to set an uncaught exception handler. Please install" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: a recent Objective-C runtime if you want to use them." >&5 $as_echo "$as_me: a recent Objective-C runtime if you want to use them." >&6;} exceptions="no"; fi fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable native Objective-C exceptions" >&5 $as_echo_n "checking whether to enable native Objective-C exceptions... " >&6; } if test "$exceptions" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } BASE_NATIVE_OBJC_EXCEPTIONS=1 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } BASE_NATIVE_OBJC_EXCEPTIONS=0 fi # Don't revert any Objective-C flags as they are used in the next test #-------------------------------------------------------------------- # Function needed by @synchronize directive #-------------------------------------------------------------------- HAVE_OBJC_SYNC_ENTER=no if test "$host_os" = windows -a "$OBJC_RUNTIME_LIB" = "ng"; then # On Windows MSVC, AC_CHECK_FUNCS() will throw linker errors ("relocation # against symbol in discarded section") as the file won't contain any actual # ObjC code, so we just assume the function is there. { $as_echo "$as_me:${as_lineno-$LINENO}: assuming objc_sync_enter() on Windows MSVC" >&5 $as_echo "$as_me: assuming objc_sync_enter() on Windows MSVC" >&6;} HAVE_OBJC_SYNC_ENTER=yes else for ac_func in objc_sync_enter do : ac_fn_c_check_func "$LINENO" "objc_sync_enter" "ac_cv_func_objc_sync_enter" if test "x$ac_cv_func_objc_sync_enter" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_OBJC_SYNC_ENTER 1 _ACEOF fi done if test $ac_cv_func_objc_sync_enter = yes ; then HAVE_OBJC_SYNC_ENTER=yes fi fi # Don't revert any Objective-C flags as they are used in the next test { $as_echo "$as_me:${as_lineno-$LINENO}: checking for thread-safe +initialize in runtime" >&5 $as_echo_n "checking for thread-safe +initialize in runtime... " >&6; } if test "$cross_compiling" = yes; then : safe_initialize="$cross_safe_initialize" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include "$srcdir/config/config.initialize.m" _ACEOF if ac_fn_c_try_run "$LINENO"; then : safe_initialize=yes else safe_initialize=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi if test $safe_initialize = yes; then $as_echo "#define HAVE_INITIALIZE 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Your ObjectiveC runtime does not support thread-safe class initialisation. Please use a different runtime if you intend to use threads." >&5 $as_echo "$as_me: WARNING: Your ObjectiveC runtime does not support thread-safe class initialisation. Please use a different runtime if you intend to use threads." >&2;} fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $safe_initialize" >&5 $as_echo "$safe_initialize" >&6; } LIBS="$saved_LIBS" CPPFLAGS="$saved_CPPFLAGS" #-------------------------------------------------------------------- # Generic settings needed by NSZone.m #-------------------------------------------------------------------- ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 $as_echo_n "checking for inline... " >&6; } if ${ac_cv_c_inline+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __cplusplus typedef int foo_t; static $ac_kw foo_t static_foo () {return 0; } $ac_kw foo_t foo () {return 0; } #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_inline=$ac_kw fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test "$ac_cv_c_inline" != no && break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 $as_echo "$ac_cv_c_inline" >&6; } case $ac_cv_c_inline in inline | yes) ;; *) case $ac_cv_c_inline in no) ac_val=;; *) ac_val=$ac_cv_c_inline;; esac cat >>confdefs.h <<_ACEOF #ifndef __cplusplus #define inline $ac_val #endif _ACEOF ;; esac #-------------------------------------------------------------------- # Following header checks needed for bzero in Storage.m and other places #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi for ac_header in string.h memory.h alloca.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done #-------------------------------------------------------------------- # Following header check needed NSConnection.h #-------------------------------------------------------------------- for ac_header in float.h do : ac_fn_c_check_header_mongrel "$LINENO" "float.h" "ac_cv_header_float_h" "$ac_includes_default" if test "x$ac_cv_header_float_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_FLOAT_H 1 _ACEOF fi done #-------------------------------------------------------------------- # Header files and functions for files and filesystems #-------------------------------------------------------------------- for ac_header in sys/stat.h sys/vfs.h sys/statfs.h sys/statvfs.h pwd.h grp.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in sys/cdefs.h sys/syslimits.h sys/param.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # Twisted header checks for some BSDs with stupid interdependencies for ac_header in sys/syslimits.h do : ac_fn_c_check_header_compile "$LINENO" "sys/syslimits.h" "ac_cv_header_sys_syslimits_h" "#if HAVE_SYS_CDEFS_H #include #endif #include " if test "x$ac_cv_header_sys_syslimits_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_SYSLIMITS_H 1 _ACEOF fi done for ac_header in sys/param.h do : ac_fn_c_check_header_compile "$LINENO" "sys/param.h" "ac_cv_header_sys_param_h" "#if HAVE_SYS_CDEFS_H #include #endif #if HAVE_SYS_SYSLIMITS_H #include #endif " if test "x$ac_cv_header_sys_param_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_PARAM_H 1 _ACEOF fi done for ac_header in sys/mount.h do : ac_fn_c_check_header_compile "$LINENO" "sys/mount.h" "ac_cv_header_sys_mount_h" "#if HAVE_SYS_CDEFS_H #include #endif #if HAVE_SYS_SYSLIMITS_H #include #endif #if HAVE_SYS_PARAM_H #include #endif " if test "x$ac_cv_header_sys_mount_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_MOUNT_H 1 _ACEOF fi done for ac_header in sys/types.h windows.h locale.h langinfo.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done saved_LIBS="$LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lm" >&5 $as_echo_n "checking for main in -lm... " >&6; } if ${ac_cv_lib_m_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_main=yes else ac_cv_lib_m_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_main" >&5 $as_echo "$ac_cv_lib_m_main" >&6; } if test "x$ac_cv_lib_m_main" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBM 1 _ACEOF LIBS="-lm $LIBS" fi for ac_func in utimensat statvfs link symlink readlink geteuid getlogin getpwnam getpwnam_r getpwuid getpwuid_r getgrgid getgrgid_r getgrnam getgrnam_r rint getopt malloc_usable_size do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done LIBS="$saved_LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pw_gecos field in struct passwd" >&5 $as_echo_n "checking for pw_gecos field in struct passwd... " >&6; } if ${ac_cv_have_pw_gecos_in_struct_passwd+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { struct passwd p; p.pw_gecos = 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_have_pw_gecos_in_struct_passwd="yes" else ac_cv_have_pw_gecos_in_struct_passwd="no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_pw_gecos_in_struct_passwd" >&5 $as_echo "$ac_cv_have_pw_gecos_in_struct_passwd" >&6; } if test "x$ac_cv_have_pw_gecos_in_struct_passwd" = "xyes" ; then $as_echo "#define HAVE_PW_GECOS_IN_PASSWD 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for currency_symbol field in struct lconv" >&5 $as_echo_n "checking for currency_symbol field in struct lconv... " >&6; } if ${ac_cv_have_currency_symbol_in_struct_lconv+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { struct lconv l; l.currency_symbol = NULL; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_have_currency_symbol_in_struct_lconv="yes" else ac_cv_have_currency_symbol_in_struct_lconv="no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_currency_symbol_in_struct_lconv" >&5 $as_echo "$ac_cv_have_currency_symbol_in_struct_lconv" >&6; } if test "x$ac_cv_have_currency_symbol_in_struct_lconv" = "xyes" ; then $as_echo "#define HAVE_CURRENCY_SYMBOL_IN_LCONV 1" >>confdefs.h fi #-------------------------------------------------------------------- # These two headers (functions) needed by Time.m #-------------------------------------------------------------------- for ac_header in time.h sys/time.h tzfile.h sys/rusage.h ucbinclude/sys/resource.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in time ctime tzset do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done #-------------------------------------------------------------------- # These headers/functions needed by GSTcpPort.m #-------------------------------------------------------------------- for ac_header in sys/socket.h netinet/in.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_c_check_type "$LINENO" "socklen_t" "ac_cv_type_socklen_t" "$ac_includes_default" if test "x$ac_cv_type_socklen_t" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SOCKLEN_T 1 _ACEOF fi #-------------------------------------------------------------------- # These headers/functions needed for stacktrace in NSException.m #-------------------------------------------------------------------- # Check whether --enable-bfd was given. if test "${enable_bfd+set}" = set; then : enableval=$enable_bfd; else enable_bfd=no fi if test $enable_bfd = yes ; then $as_echo "#define USE_BFD 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You enabled bfd, which causes gnustep-base to link with libbfd. This makes the license GPL rather than the normal LGPL." >&5 $as_echo "$as_me: WARNING: You enabled bfd, which causes gnustep-base to link with libbfd. This makes the license GPL rather than the normal LGPL." >&2;} fi for ac_header in bfd.h do : ac_fn_c_check_header_mongrel "$LINENO" "bfd.h" "ac_cv_header_bfd_h" "$ac_includes_default" if test "x$ac_cv_header_bfd_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_BFD_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libintl_fprintf in -lintl" >&5 $as_echo_n "checking for libintl_fprintf in -lintl... " >&6; } if ${ac_cv_lib_intl_libintl_fprintf+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char libintl_fprintf (); int main () { return libintl_fprintf (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_libintl_fprintf=yes else ac_cv_lib_intl_libintl_fprintf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_libintl_fprintf" >&5 $as_echo "$ac_cv_lib_intl_libintl_fprintf" >&6; } if test "x$ac_cv_lib_intl_libintl_fprintf" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBINTL 1 _ACEOF LIBS="-lintl $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dyn_string_append in -liberty" >&5 $as_echo_n "checking for dyn_string_append in -liberty... " >&6; } if ${ac_cv_lib_iberty_dyn_string_append+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-liberty $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dyn_string_append (); int main () { return dyn_string_append (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_iberty_dyn_string_append=yes else ac_cv_lib_iberty_dyn_string_append=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_iberty_dyn_string_append" >&5 $as_echo "$ac_cv_lib_iberty_dyn_string_append" >&6; } if test "x$ac_cv_lib_iberty_dyn_string_append" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBIBERTY 1 _ACEOF LIBS="-liberty $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gzseek in -lz" >&5 $as_echo_n "checking for gzseek in -lz... " >&6; } if ${ac_cv_lib_z_gzseek+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lz $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gzseek (); int main () { return gzseek (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_z_gzseek=yes else ac_cv_lib_z_gzseek=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_gzseek" >&5 $as_echo "$ac_cv_lib_z_gzseek" >&6; } if test "x$ac_cv_lib_z_gzseek" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBZ 1 _ACEOF LIBS="-lz $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bfd_openr in -lbfd" >&5 $as_echo_n "checking for bfd_openr in -lbfd... " >&6; } if ${ac_cv_lib_bfd_bfd_openr+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lbfd $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char bfd_openr (); int main () { return bfd_openr (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_bfd_bfd_openr=yes else ac_cv_lib_bfd_bfd_openr=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bfd_bfd_openr" >&5 $as_echo "$ac_cv_lib_bfd_bfd_openr" >&6; } if test "x$ac_cv_lib_bfd_bfd_openr" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBBFD 1 _ACEOF LIBS="-lbfd $LIBS" fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { bfd_section_vma(0); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : bfd_section_vma=1 else bfd_section_vma=0 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $bfd_section_vma = 1; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: bfd_section_vma found" >&5 $as_echo "bfd_section_vma found" >&6; } $as_echo "#define HAVE_BFD_SECTION_VMA 1" >>confdefs.h fi case "$target_os" in mingw*) for ac_header in dbghelp.h do : ac_fn_c_check_header_mongrel "$LINENO" "dbghelp.h" "ac_cv_header_dbghelp_h" "$ac_includes_default" if test "x$ac_cv_header_dbghelp_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DBGHELP_H 1 _ACEOF fi done ;; *) for ac_header in execinfo.h do : ac_fn_c_check_header_mongrel "$LINENO" "execinfo.h" "ac_cv_header_execinfo_h" "$ac_includes_default" if test "x$ac_cv_header_execinfo_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_EXECINFO_H 1 _ACEOF fi done for ac_func in backtrace do : ac_fn_c_check_func "$LINENO" "backtrace" "ac_cv_func_backtrace" if test "x$ac_cv_func_backtrace" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_BACKTRACE 1 _ACEOF fi done ;; esac for ac_func in __builtin_extract_return_address do : ac_fn_c_check_func "$LINENO" "__builtin_extract_return_address" "ac_cv_func___builtin_extract_return_address" if test "x$ac_cv_func___builtin_extract_return_address" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE___BUILTIN_EXTRACT_RETURN_ADDRESS 1 _ACEOF fi done # Enable unwind if found by default # Check whether --with-unwind was given. if test "${with_unwind+set}" = set; then : withval=$with_unwind; fi if test "x$with_unwind" != "xno"; then : for ac_header in unwind.h do : ac_fn_c_check_header_mongrel "$LINENO" "unwind.h" "ac_cv_header_unwind_h" "$ac_includes_default" if test "x$ac_cv_header_unwind_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_UNWIND_H 1 _ACEOF fi done for ac_func in _Unwind_GetIP do : ac_fn_c_check_func "$LINENO" "_Unwind_GetIP" "ac_cv_func__Unwind_GetIP" if test "x$ac_cv_func__Unwind_GetIP" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE__UNWIND_GETIP 1 _ACEOF fi done else have_unwind=no fi if test "x$ac_cv_func__Unwind_GetIP" = "xyes"; then : have_unwind=yes else have_unwind=no fi if test "x$have_unwind" = "xyes"; then : $as_echo "#define WITH_UNWIND 1" >>confdefs.h else if test "x$with_unwind" = "xyes"; then : as_fn_error $? "unwind requested but not found" "$LINENO" 5 fi fi #-------------------------------------------------------------------- # These headers/functions needed by NSLog.m #-------------------------------------------------------------------- for ac_header in syslog.h sys/slog.h sys/slogcodes.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in syslog do : ac_fn_c_check_func "$LINENO" "syslog" "ac_cv_func_syslog" if test "x$ac_cv_func_syslog" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYSLOG 1 _ACEOF fi done if test "$ac_cv_header_sys_slog_h" = "yes"; then oldLibs="$LIBS"; LIBS="$LIBS -l:libc.a"; for ac_func in slogf do : ac_fn_c_check_func "$LINENO" "slogf" "ac_cv_func_slogf" if test "x$ac_cv_func_slogf" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SLOGF 1 _ACEOF fi done if test "$ac_cv_func_slogf" = "no"; then LIBS="$oldLibs" fi fi #-------------------------------------------------------------------- # These headers/functions needed by NSRunLoop.m #-------------------------------------------------------------------- for ac_header in poll.h do : ac_fn_c_check_header_mongrel "$LINENO" "poll.h" "ac_cv_header_poll_h" "$ac_includes_default" if test "x$ac_cv_header_poll_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_POLL_H 1 _ACEOF fi done for ac_func in poll do : ac_fn_c_check_func "$LINENO" "poll" "ac_cv_func_poll" if test "x$ac_cv_func_poll" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_POLL 1 _ACEOF fi done have_poll=no if test $ac_cv_header_poll_h = yes; then have_poll=yes { $as_echo "$as_me:${as_lineno-$LINENO}: checking for poll emulation" >&5 $as_echo_n "checking for poll emulation... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include "config/config.poll.c" _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "emulating_poll" >/dev/null 2>&1; then : have_poll=no fi rm -f conftest* if test $have_poll = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if poll supports devices" >&5 $as_echo_n "checking if poll supports devices... " >&6; } if test "$cross_compiling" = yes; then : have_poll="$cross_have_poll" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include "$srcdir/config/config.poll-dev.c"i _ACEOF if ac_fn_c_try_run "$LINENO"; then : else have_poll=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi if test $have_poll = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define HAVE_POLL_F 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi fi #-------------------------------------------------------------------- # This function needed by StdioStream.m #-------------------------------------------------------------------- for ac_func in vsprintf vasprintf snprintf vsnprintf do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done if test $ac_cv_func_vsprintf = yes ; then if test "$cross_compiling" = yes; then : VSPRINTF_RETURNS_LENGTH="$cross_VSPRINTF_RETURNS_LENGTH" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include "$srcdir/config/config.vsprintf.c" _ACEOF if ac_fn_c_try_run "$LINENO"; then : VSPRINTF_RETURNS_LENGTH=1 else VSPRINTF_RETURNS_LENGTH=0 fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi cat >>confdefs.h <<_ACEOF #define VSPRINTF_RETURNS_LENGTH $VSPRINTF_RETURNS_LENGTH _ACEOF fi if test $ac_cv_func_vasprintf = yes ; then if test "$cross_compiling" = yes; then : VASPRINTF_RETURNS_LENGTH="$cross_VASPRINTF_RETURNS_LENGTH" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include "$srcdir/config/config.vasprintf.c" _ACEOF if ac_fn_c_try_run "$LINENO"; then : VASPRINTF_RETURNS_LENGTH=1 else VASPRINTF_RETURNS_LENGTH=0 fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi cat >>confdefs.h <<_ACEOF #define VASPRINTF_RETURNS_LENGTH $VASPRINTF_RETURNS_LENGTH _ACEOF fi #-------------------------------------------------------------------- # This function needed by NSFileManager.m #-------------------------------------------------------------------- for ac_func in getcwd do : ac_fn_c_check_func "$LINENO" "getcwd" "ac_cv_func_getcwd" if test "x$ac_cv_func_getcwd" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETCWD 1 _ACEOF fi done ac_header_dirent=no for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 $as_echo_n "checking for $ac_hdr that defines DIR... " >&6; } if eval \${$as_ac_Header+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include <$ac_hdr> int main () { if ((DIR *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_ac_Header=yes" else eval "$as_ac_Header=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$as_ac_Header { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 _ACEOF ac_header_dirent=$ac_hdr; break fi done # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. if test $ac_header_dirent = dirent.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if ${ac_cv_search_opendir+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' dir; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_opendir+:} false; then : break fi done if ${ac_cv_search_opendir+:} false; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if ${ac_cv_search_opendir+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' x; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_opendir+:} false; then : break fi done if ${ac_cv_search_opendir+:} false; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi fi # Look for file creation and modification date on NetBSD, FreeBSD, Darwin ac_fn_c_check_member "$LINENO" "struct stat" "st_mtim" "ac_cv_member_struct_stat_st_mtim" "#include " if test "x$ac_cv_member_struct_stat_st_mtim" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STAT_ST_MTIM 1 _ACEOF fi ac_fn_c_check_member "$LINENO" "struct stat" "st_birthtime" "ac_cv_member_struct_stat_st_birthtime" "#include " if test "x$ac_cv_member_struct_stat_st_birthtime" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STAT_ST_BIRTHTIME 1 _ACEOF fi ac_fn_c_check_member "$LINENO" "struct stat" "st_birthtimespec" "ac_cv_member_struct_stat_st_birthtimespec" "#include " if test "x$ac_cv_member_struct_stat_st_birthtimespec" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC 1 _ACEOF fi ac_fn_c_check_member "$LINENO" "struct stat" "st_birthtim" "ac_cv_member_struct_stat_st_birthtim" "#include " if test "x$ac_cv_member_struct_stat_st_birthtim" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STAT_ST_BIRTHTIM 1 _ACEOF fi ac_fn_c_check_member "$LINENO" "struct stat64" "st_birthtimespec" "ac_cv_member_struct_stat64_st_birthtimespec" "#include " if test "x$ac_cv_member_struct_stat64_st_birthtimespec" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STAT64_ST_BIRTHTIMESPEC 1 _ACEOF fi #-------------------------------------------------------------------- # This function needed by gdomap.c #-------------------------------------------------------------------- for ac_header in getopt.h do : ac_fn_c_check_header_mongrel "$LINENO" "getopt.h" "ac_cv_header_getopt_h" "$ac_includes_default" if test "x$ac_cv_header_getopt_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETOPT_H 1 _ACEOF fi done #-------------------------------------------------------------------- # This function needed by NSPage.m #-------------------------------------------------------------------- for ac_func in posix_memalign valloc do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done #-------------------------------------------------------------------- # This function needed by Time.m #-------------------------------------------------------------------- for ac_func in times do : ac_fn_c_check_func "$LINENO" "times" "ac_cv_func_times" if test "x$ac_cv_func_times" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_TIMES 1 _ACEOF fi done #-------------------------------------------------------------------- # These functions needed by NSData.m and GSFFIInvocation.m #-------------------------------------------------------------------- for ac_func in mkstemp do : ac_fn_c_check_func "$LINENO" "mkstemp" "ac_cv_func_mkstemp" if test "x$ac_cv_func_mkstemp" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_MKSTEMP 1 _ACEOF fi done for ac_func in shmctl do : ac_fn_c_check_func "$LINENO" "shmctl" "ac_cv_func_shmctl" if test "x$ac_cv_func_shmctl" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SHMCTL 1 _ACEOF fi done for ac_func in mmap do : ac_fn_c_check_func "$LINENO" "mmap" "ac_cv_func_mmap" if test "x$ac_cv_func_mmap" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_MMAP 1 _ACEOF fi done for ac_func in mprotect do : ac_fn_c_check_func "$LINENO" "mprotect" "ac_cv_func_mprotect" if test "x$ac_cv_func_mprotect" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_MPROTECT 1 _ACEOF fi done for ac_header in sys/mman.h do : ac_fn_c_check_header_mongrel "$LINENO" "sys/mman.h" "ac_cv_header_sys_mman_h" "$ac_includes_default" if test "x$ac_cv_header_sys_mman_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_MMAN_H 1 _ACEOF fi done #-------------------------------------------------------------------- # These functions needed by NSTask.m #-------------------------------------------------------------------- for ac_func in killpg setpgrp setpgid setsid grantpt do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done if test "x$ac_cv_func_setpgrp" = xyes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether setpgrp takes no argument" >&5 $as_echo_n "checking whether setpgrp takes no argument... " >&6; } if ${ac_cv_func_setpgrp_void+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : as_fn_error $? "cannot check setpgrp when cross compiling" "$LINENO" 5 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* If this system has a BSD-style setpgrp which takes arguments, setpgrp(1, 1) will fail with ESRCH and return -1, in that case exit successfully. */ return setpgrp (1,1) != -1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_setpgrp_void=no else ac_cv_func_setpgrp_void=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_setpgrp_void" >&5 $as_echo "$ac_cv_func_setpgrp_void" >&6; } if test $ac_cv_func_setpgrp_void = yes; then $as_echo "#define SETPGRP_VOID 1" >>confdefs.h fi fi HAVE_PTS_STREAM_MODULES=0 case "${target}" in *-sysv-*) HAVE_PTS_STREAM_MODULES=1 ;; esac cat >>confdefs.h <<_ACEOF #define HAVE_PTS_STREAM_MODULES $HAVE_PTS_STREAM_MODULES _ACEOF for ac_header in fcntl.h inttypes.h libc.h limits.h malloc.h memory.h signal.h stdint.h string.h sys/fcntl.h sys/file.h sys/filio.h sys/inttypes.h sys/ioctl.h sys/signal.h sys/stropts.h sys/wait.h unistd.h utime.h stdlib.h stdbool.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done if test $ac_cv_header_inttypes_h = yes; then INCLUDE_INTTYPES="#include " elif test $ac_cv_header_sys_inttypes_h = yes; then INCLUDE_INTTYPES="#include " elif test $ac_cv_header_stdint_h = yes; then INCLUDE_INTTYPES="#include " else INCLUDE_INTTYPES="no" fi if test "$INCLUDE_INTTYPES" = "no"; then INCLUDE_INTTYPES="" DEFINE_INT8_T="#define int8_t gss8" DEFINE_UINT8_T="#define uint8_t gsu8" DEFINE_INT16_T="#define int16_t gss16" DEFINE_UINT16_T="#define uint16_t gsu16" DEFINE_INT32_T="#define int32_t gss32" DEFINE_UINT32_T="#define uint32_t gsu32" DEFINE_INT64_T="#define int64_t gss64" DEFINE_UINT64_T="#define uint64_t gsu64" DEFINE_INTPTR_T="#define intptr_t gssaddr" DEFINE_UINTPTR_T="#define uintptr_t gsuaddr" else DEFINE_INT8_T="" DEFINE_UINT8_T="" DEFINE_INT16_T="" DEFINE_UINT16_T="" DEFINE_INT32_T="" DEFINE_UINT32_T="" DEFINE_INT64_T="" DEFINE_UINT64_T="" DEFINE_INTPTR_T="" DEFINE_UINTPTR_T="" fi #-------------------------------------------------------------------- # These used by GSFileHandle.m and distributed objects # On some systems we need -lnsl ... so check for that case. #-------------------------------------------------------------------- for ac_header in ws2tcpip.h do : ac_fn_c_check_header_mongrel "$LINENO" "ws2tcpip.h" "ac_cv_header_ws2tcpip_h" "$ac_includes_default" if test "x$ac_cv_header_ws2tcpip_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_WS2TCPIP_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing inet_ntop" >&5 $as_echo_n "checking for library containing inet_ntop... " >&6; } if ${ac_cv_search_inet_ntop+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char inet_ntop (); int main () { return inet_ntop (); ; return 0; } _ACEOF for ac_lib in '' nsl Ws2_32; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_inet_ntop=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_inet_ntop+:} false; then : break fi done if ${ac_cv_search_inet_ntop+:} false; then : else ac_cv_search_inet_ntop=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_inet_ntop" >&5 $as_echo "$ac_cv_search_inet_ntop" >&6; } ac_res=$ac_cv_search_inet_ntop if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi for ac_func in gethostbyaddr_r inet_aton inet_pton inet_ntop sigaction do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done USE_ZLIB=0 for ac_header in zlib.h do : ac_fn_c_check_header_mongrel "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default" if test "x$ac_cv_header_zlib_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_ZLIB_H 1 _ACEOF fi done if test $ac_cv_header_zlib_h = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gzseek in -lz" >&5 $as_echo_n "checking for gzseek in -lz... " >&6; } if ${ac_cv_lib_z_gzseek+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lz $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gzseek (); int main () { return gzseek (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_z_gzseek=yes else ac_cv_lib_z_gzseek=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_gzseek" >&5 $as_echo "$ac_cv_lib_z_gzseek" >&6; } if test "x$ac_cv_lib_z_gzseek" = xyes; then : zlib_ok=yes else zlib_ok=no fi if test "$zlib_ok" = yes; then LIBS="$LIBS -lz" USE_ZLIB=1 fi fi HAVE_INET_PTON=no if test $ac_cv_func_inet_pton = yes ; then HAVE_INET_PTON=yes fi HAVE_INET_NTOP=no if test $ac_cv_func_inet_ntop = yes ; then HAVE_INET_NTOP=yes fi #-------------------------------------------------------------------- # For setting thread stack size #-------------------------------------------------------------------- for ac_header in sys/resource.h do : ac_fn_c_check_header_mongrel "$LINENO" "sys/resource.h" "ac_cv_header_sys_resource_h" "$ac_includes_default" if test "x$ac_cv_header_sys_resource_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_RESOURCE_H 1 _ACEOF fi done for ac_func in setrlimit do : ac_fn_c_check_func "$LINENO" "setrlimit" "ac_cv_func_setrlimit" if test "x$ac_cv_func_setrlimit" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SETRLIMIT 1 _ACEOF fi done #-------------------------------------------------------------------- # One of these functions needed by NSDebug.m and NSProcessInfo.m #-------------------------------------------------------------------- for ac_func in strerror do : ac_fn_c_check_func "$LINENO" "strerror" "ac_cv_func_strerror" if test "x$ac_cv_func_strerror" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRERROR 1 _ACEOF fi done ac_fn_c_check_decl "$LINENO" "strerror_r" "ac_cv_have_decl_strerror_r" "$ac_includes_default" if test "x$ac_cv_have_decl_strerror_r" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_STRERROR_R $ac_have_decl _ACEOF for ac_func in strerror_r do : ac_fn_c_check_func "$LINENO" "strerror_r" "ac_cv_func_strerror_r" if test "x$ac_cv_func_strerror_r" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRERROR_R 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether strerror_r returns char *" >&5 $as_echo_n "checking whether strerror_r returns char *... " >&6; } if ${ac_cv_func_strerror_r_char_p+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_func_strerror_r_char_p=no if test $ac_cv_have_decl_strerror_r = yes; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { char buf[100]; char x = *strerror_r (0, buf, sizeof buf); char *p = strerror_r (0, buf, sizeof buf); return !p || x; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_func_strerror_r_char_p=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else # strerror_r is not declared. Choose between # systems that have relatively inaccessible declarations for the # function. BeOS and DEC UNIX 4.0 fall in this category, but the # former has a strerror_r that returns char*, while the latter # has a strerror_r that returns `int'. # This test should segfault on the DEC system. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default extern char *strerror_r (); int main () { char buf[100]; char x = *strerror_r (0, buf, sizeof buf); return ! isalpha (x); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_strerror_r_char_p=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strerror_r_char_p" >&5 $as_echo "$ac_cv_func_strerror_r_char_p" >&6; } if test $ac_cv_func_strerror_r_char_p = yes; then $as_echo "#define STRERROR_R_CHAR_P 1" >>confdefs.h fi #-------------------------------------------------------------------- # Needed by NSDebug.m #-------------------------------------------------------------------- for ac_func in sigsetjmp do : ac_fn_c_check_func "$LINENO" "sigsetjmp" "ac_cv_func_sigsetjmp" if test "x$ac_cv_func_sigsetjmp" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SIGSETJMP 1 _ACEOF fi done #-------------------------------------------------------------------- # This type needed by GSFormat #-------------------------------------------------------------------- ac_fn_c_check_type "$LINENO" "uintmax_t" "ac_cv_type_uintmax_t" "$ac_includes_default" if test "x$ac_cv_type_uintmax_t" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_UINTMAX_T 1 _ACEOF fi for ac_header in wchar.h do : ac_fn_c_check_header_mongrel "$LINENO" "wchar.h" "ac_cv_header_wchar_h" "$ac_includes_default" if test "x$ac_cv_header_wchar_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_WCHAR_H 1 _ACEOF fi done #-------------------------------------------------------------------- # Check if short and int values need to be word aligned #-------------------------------------------------------------------- saved_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -O0" { $as_echo "$as_me:${as_lineno-$LINENO}: checking short/int needs to be word aligned" >&5 $as_echo_n "checking short/int needs to be word aligned... " >&6; } if test "$cross_compiling" = yes; then : NEED_WORD_ALIGNMENT="$cross_NEED_WORD_ALIGNMENT" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include "$srcdir/config/config.align.c" _ACEOF if ac_fn_c_try_run "$LINENO"; then : NEED_WORD_ALIGNMENT=0 else NEED_WORD_ALIGNMENT=1 fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi CFLAGS="$saved_CFLAGS" cat >>confdefs.h <<_ACEOF #define NEED_WORD_ALIGNMENT $NEED_WORD_ALIGNMENT _ACEOF if test $NEED_WORD_ALIGNMENT = 1; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi #-------------------------------------------------------------------- # This needed by NSString for handling of %@ printf directive. #-------------------------------------------------------------------- for ac_func in register_printf_specifier do : ac_fn_c_check_func "$LINENO" "register_printf_specifier" "ac_cv_func_register_printf_specifier" if test "x$ac_cv_func_register_printf_specifier" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_REGISTER_PRINTF_SPECIFIER 1 _ACEOF fi done ac_fn_c_check_func "$LINENO" "register_printf_function" "ac_cv_func_register_printf_function" if test "x$ac_cv_func_register_printf_function" = xyes; then : register_printf=1 else register_printf=0 fi if test $register_printf = 1; then if test "$cross_compiling" = yes; then : working_register_printf="$cross_working_register_printf" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include "$srcdir/config/config.printf.c" _ACEOF if ac_fn_c_try_run "$LINENO"; then : working_register_printf=1 else working_register_printf=0 fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi if test $working_register_printf = 1; then $as_echo "#define HAVE_REGISTER_PRINTF_FUNCTION 1" >>confdefs.h if test "$cross_compiling" = yes; then : wide_register_printf="$cross_wide_register_printf" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include "$srcdir/config/config.wprintf.c" _ACEOF if ac_fn_c_try_run "$LINENO"; then : wide_register_printf=1 else wide_register_printf=0 fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi if test $wide_register_printf = 1; then $as_echo "#define HAVE_WIDE_PRINTF_FUNCTION 1" >>confdefs.h fi fi fi #-------------------------------------------------------------------- # This function needed by NSString. #-------------------------------------------------------------------- for ac_func in realpath do : ac_fn_c_check_func "$LINENO" "realpath" "ac_cv_func_realpath" if test "x$ac_cv_func_realpath" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_REALPATH 1 _ACEOF fi done #-------------------------------------------------------------------- # Check if the C Library defines extern char *program_invocation_name # Used in critical cases by NSProcessInfo.m #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking program_invocation_name in C Library" >&5 $as_echo_n "checking program_invocation_name in C Library... " >&6; } if ${gs_cv_program_invocation_name_worked+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : gs_cv_program_invocation_name_worked="$cross_gs_cv_program_invocation_name_worked" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (int argc, char *argv[]) { extern char *program_invocation_name; return (strcmp (program_invocation_name, argv[0])); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gs_cv_program_invocation_name_worked=yes else gs_cv_program_invocation_name_worked=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi if test $gs_cv_program_invocation_name_worked = yes; then $as_echo "#define HAVE_PROGRAM_INVOCATION_NAME 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi #-------------------------------------------------------------------- # Check for uname header used by NSProcessInfo.m #-------------------------------------------------------------------- for ac_header in sys/utsname.h do : ac_fn_c_check_header_mongrel "$LINENO" "sys/utsname.h" "ac_cv_header_sys_utsname_h" "$ac_includes_default" if test "x$ac_cv_header_sys_utsname_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_UTSNAME_H 1 _ACEOF fi done #-------------------------------------------------------------------- # Check for sysctlbyname used by NSProcessInfo.m #-------------------------------------------------------------------- for ac_header in sys/sysctl.h do : ac_fn_c_check_header_mongrel "$LINENO" "sys/sysctl.h" "ac_cv_header_sys_sysctl_h" "$ac_includes_default" if test "x$ac_cv_header_sys_sysctl_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_SYSCTL_H 1 _ACEOF fi done for ac_func in sysctlbyname do : ac_fn_c_check_func "$LINENO" "sysctlbyname" "ac_cv_func_sysctlbyname" if test "x$ac_cv_func_sysctlbyname" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYSCTLBYNAME 1 _ACEOF fi done #-------------------------------------------------------------------- # Defines HAVE_PROCFS if the kernel supports the /proc filesystem. # Needed by NSProcessInfo.m #-------------------------------------------------------------------- for ac_header in procfs.h do : ac_fn_c_check_header_mongrel "$LINENO" "procfs.h" "ac_cv_header_procfs_h" "$ac_includes_default" if test "x$ac_cv_header_procfs_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_PROCFS_H 1 _ACEOF fi done # Check whether --enable-procfs was given. if test "${enable_procfs+set}" = set; then : enableval=$enable_procfs; enable_procfs="$enableval" else if test "$cross_compiling" = yes; then enable_procfs=cross; else enable_procfs=yes; fi; fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking kernel support for /proc filesystem" >&5 $as_echo_n "checking kernel support for /proc filesystem... " >&6; } if ${ac_cv_sys_procfs+:} false; then : $as_echo_n "(cached) " >&6 else if test "$enable_procfs" = yes; then # Suggested change for the following line was # if test -d /proc/0; then # but it doesn't work on my linux - /proc/0 does not exist, but /proc # works fine if grep 'proc' /proc/mounts >/dev/null 2>/dev/null; then ac_cv_sys_procfs=yes else ac_cv_sys_procfs=no fi case "$target_os" in # Solaris has proc, but it is not readable solaris*) ac_cv_sys_procfs=no;; irix*) ac_cv_sys_procfs=no;; # Cygwin does have proc, but it does not show with mount cygwin*) ac_cv_sys_procfs=yes;; esac elif test "$enable_procfs" = cross; then ac_cv_sys_procfs=no else ac_cv_sys_procfs=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_procfs" >&5 $as_echo "$ac_cv_sys_procfs" >&6; } if test "$enable_procfs" = cross; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Cross-compiling: Pass --enable-procfs argument to enable use of /proc filesystem." >&5 $as_echo "$as_me: WARNING: Cross-compiling: Pass --enable-procfs argument to enable use of /proc filesystem." >&2;} fi if test $ac_cv_sys_procfs = yes; then $as_echo "#define HAVE_PROCFS 1" >>confdefs.h fi # Check whether --enable-procfs-psinfo was given. if test "${enable_procfs_psinfo+set}" = set; then : enableval=$enable_procfs_psinfo; enable_procfs_psinfo="$enableval" else if test "$cross_compiling" = yes; then enable_procfs_psinfo=cross; else enable_procfs_psinfo=yes; fi; fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking support for /proc psinfo struct" >&5 $as_echo_n "checking support for /proc psinfo struct... " >&6; } if ${ac_cv_sys_procfs_psinfo+:} false; then : $as_echo_n "(cached) " >&6 else if test "$enable_procfs_psinfo" = yes; then if test "$cross_compiling" = yes; then : ac_cv_sys_procfs_psinfo=yes else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include "$srcdir/config/config.psinfo.c" _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_sys_procfs_psinfo=yes else ac_cv_sys_procfs_psinfo=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi elif test "$enable_procfs" = cross; then ac_cv_sys_procfs_psinfo=no else ac_cv_sys_procfs_psinfo=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_procfs_psinfo" >&5 $as_echo "$ac_cv_sys_procfs_psinfo" >&6; } if test "$enable_procfs" = cross; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Cross-compiling: Pass --enable-procfs-psinfo argument to enable use of /proc psinfo information." >&5 $as_echo "$as_me: WARNING: Cross-compiling: Pass --enable-procfs-psinfo argument to enable use of /proc psinfo information." >&2;} fi if test $ac_cv_sys_procfs_psinfo = yes; then $as_echo "#define HAVE_PROCFS_PSINFO 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking link to exe of process in /proc" >&5 $as_echo_n "checking link to exe of process in /proc... " >&6; } if ${ac_cv_sys_procfs_exe_link+:} false; then : $as_echo_n "(cached) " >&6 else if test "$ac_cv_sys_procfs" = yes; then # Linux 2.2.x and up if test -L /proc/self/exe; then ac_cv_sys_procfs_exe_link=/proc/self/exe # FreeBSD 4.x and up elif test -L /proc/curproc/file; then ac_cv_sys_procfs_exe_link=/proc/curproc/file else ac_cv_sys_procfs_exe_link=no fi else ac_cv_sys_procfs_exe_link=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_procfs_exe_link" >&5 $as_echo "$ac_cv_sys_procfs_exe_link" >&6; } if test "$ac_cv_sys_procfs_exe_link" != no; then cat >>confdefs.h <<_ACEOF #define PROCFS_EXE_LINK "$ac_cv_sys_procfs_exe_link" _ACEOF fi #-------------------------------------------------------------------- # Check if /proc/$$/cmdline terminates the last argument with a nul #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking /proc/$$/cmdline terminated by nul" >&5 $as_echo_n "checking /proc/$$/cmdline terminated by nul... " >&6; } if test "$cross_compiling" = yes; then : CMDLINE_TERMINATED="$cross_CMDLINE_TERMINATED" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include "$srcdir/config/config.proccmd.c" _ACEOF if ac_fn_c_try_run "$LINENO"; then : CMDLINE_TERMINATED=1 else CMDLINE_TERMINATED=0 fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi cat >>confdefs.h <<_ACEOF #define CMDLINE_TERMINATED $CMDLINE_TERMINATED _ACEOF if test $CMDLINE_TERMINATED = 1; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi #-------------------------------------------------------------------- # If /proc doesn't work, try kvm (on FreeBSD, for instance) #-------------------------------------------------------------------- have_kvm_env=0 save_LIBS="$LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for kvm_getenvv in -lkvm" >&5 $as_echo_n "checking for kvm_getenvv in -lkvm... " >&6; } if ${ac_cv_lib_kvm_kvm_getenvv+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lkvm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char kvm_getenvv (); int main () { return kvm_getenvv (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_kvm_kvm_getenvv=yes else ac_cv_lib_kvm_kvm_getenvv=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_kvm_kvm_getenvv" >&5 $as_echo "$ac_cv_lib_kvm_kvm_getenvv" >&6; } if test "x$ac_cv_lib_kvm_kvm_getenvv" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBKVM 1 _ACEOF LIBS="-lkvm $LIBS" fi if test "$ac_cv_lib_kvm_kvm_getenvv" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can access kernel memory" >&5 $as_echo_n "checking if we can access kernel memory... " >&6; } if test "$cross_compiling" = yes; then : have_kvm_env="$cross_have_kvm_env" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include "$srcdir/config/config.kvmopen.c" _ACEOF if ac_fn_c_try_run "$LINENO"; then : have_kvm_env=1 else have_kvm_env=0 fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi if test $have_kvm_env = 1; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define HAVE_KVM_ENV 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } # Reset LIBS since we don't need kvm LIBS="$save_LIBS" fi fi #-------------------------------------------------------------------- # Include redefinition of main () only if needed. # On some systems - force redefinition to be used as the /proc stuff # doesn't work. Allow NSProcessInfo initialization method also. #-------------------------------------------------------------------- PASS_ARG=no case "$target_os" in cygwin*) PASS_ARG=yes;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking use of pass-through arguments" >&5 $as_echo_n "checking use of pass-through arguments... " >&6; } # Check whether --enable-pass-arguments was given. if test "${enable_pass_arguments+set}" = set; then : enableval=$enable_pass_arguments; else enable_pass_arguments=$PASS_ARG fi if test "$enable_pass_arguments" = "yes"; then GS_PASS_ARGUMENTS=1 else GS_PASS_ARGUMENTS=0 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_pass_arguments" >&5 $as_echo "$enable_pass_arguments" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking use of fake-main definition" >&5 $as_echo_n "checking use of fake-main definition... " >&6; } # Check whether --enable-fake-main was given. if test "${enable_fake_main+set}" = set; then : enableval=$enable_fake_main; else enable_fake_main=no fi if test "$enable_pass_arguments" = "no"; then case "$target_os" in freebsd2*) enable_fake_main=yes;; freebsd*) ;; kfreebsd*) enable_fake_main=yes;; netbsd*) enable_fake_main=yes;; openbsd*) enable_fake_main=yes;; *sysv*) enable_fake_main=yes;; esac fi GS_FAKE_MAIN=0 if test "$enable_fake_main" = "yes"; then GS_FAKE_MAIN=1 elif test "$enable_pass_arguments" = "no"; then if test "$gs_cv_objc_load_method_worked" = yes -a \( "$ac_cv_sys_procfs" = yes -o "$have_kvm_env" = 1 -o "$ac_cv_sys_procfs_psinfo" = yes \); then GS_FAKE_MAIN=0 if test "$have_kvm_env" = "1"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Using libkvm which is known to be buggy on some systems consider configuring with --enable-fake-main instead." >&5 $as_echo "$as_me: WARNING: Using libkvm which is known to be buggy on some systems consider configuring with --enable-fake-main instead." >&2;} fi else case "$target_os" in darwin* ) ;; * ) GS_FAKE_MAIN=1 enable_fake_main=yes esac fi fi case "$target_os" in mingw*|windows) enable_fake_main=no; GS_FAKE_MAIN=0;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_fake_main" >&5 $as_echo "$enable_fake_main" >&6; } #-------------------------------------------------------------------- # Simple way to add a bunch of paths to the flags #-------------------------------------------------------------------- # Check whether --with-include-flags was given. if test "${with_include_flags+set}" = set; then : withval=$with_include_flags; include_flags="$withval" else include_flags="no" fi if test ${include_flags} != "no"; then CPPFLAGS="$CPPFLAGS ${include_flags}" INCLUDE_FLAGS="$INCLUDE_FLAGS ${include_flags}" fi # Check whether --with-library-flags was given. if test "${with_library_flags+set}" = set; then : withval=$with_library_flags; library_flags="$withval" else library_flags="no" fi if test ${library_flags} != "no"; then LDFLAGS="$LDFLAGS ${library_flags}" LDIR_FLAGS="$LDIR_FLAGS ${library_flags}" fi #-------------------------------------------------------------------- # Check for FFI interface libraries for invocations # We enable ffi by default now, as it's the only well supported # library nowadays. #-------------------------------------------------------------------- do_broken_libffi=no do_broken_libffcall=no do_enable_libffi=yes do_enable_libffcall=no case "$target_cpu" in sparc64*) case "$target_os" in solaris*) do_broken_libffcall=yes; do_enable_libffi=yes; do_enable_libffcall=no;; *) ;; esac ;; *) ;; esac if test "$exceptions" = "yes"; then # ffcall will mess up native exceptions, so we must disable it. do_broken_libffcall=yes do_enable_libffcall=no fi # Check whether --enable-libffi was given. if test "${enable_libffi+set}" = set; then : enableval=$enable_libffi; else enable_libffi=$do_enable_libffi fi # Check whether --enable-ffcall was given. if test "${enable_ffcall+set}" = set; then : enableval=$enable_ffcall; else enable_ffcall=$do_enable_libffcall fi if test $enable_ffcall = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ffcall has been enabled ... this is deprecated ... please install and use a recent libffi if possible" >&5 $as_echo "$as_me: WARNING: ffcall has been enabled ... this is deprecated ... please install and use a recent libffi if possible" >&2;} fi # Check whether --enable-invocations was given. if test "${enable_invocations+set}" = set; then : enableval=$enable_invocations; else enable_invocations=yes fi # DO isn't used on apple-apple-apple if test $LIBRARY_COMBO = apple-apple-apple; then enable_invocations=no fi # Check whether --with-ffi-include was given. if test "${with_ffi_include+set}" = set; then : withval=$with_ffi_include; ffi_incdir="$withval" else ffi_incdir="no" fi if test ${ffi_incdir} != "no"; then CPPFLAGS="$CPPFLAGS -I${ffi_incdir}" INCLUDE_FLAGS="$INCLUDE_FLAGS -I${ffi_incdir}" fi # Check whether --with-ffi-library was given. if test "${with_ffi_library+set}" = set; then : withval=$with_ffi_library; ffi_libdir="$withval" else ffi_libdir="no" fi if test ${ffi_libdir} != "no"; then case "$target_os" in netbsd*) LDFLAGS="$LDFLAGS -L${ffi_libdir} -Wl,-R${ffi_libdir}" LDIR_FLAGS="$LDIR_FLAGS -Wl,-R${ffi_libdir} -L${ffi_libdir}";; *) LDFLAGS="$LDFLAGS -Wl,-rpath,${ffi_libdir} -L${ffi_libdir}" LDIR_FLAGS="$LDIR_FLAGS -Wl,-rpath,${ffi_libdir} -L${ffi_libdir}";; esac fi if test "$do_broken_libffi" = "no"; then if test -n "$PKG_CONFIG"; then if $PKG_CONFIG --exists libffi; then pkg_config_libffi=yes ffi_CFLAGS=`$PKG_CONFIG --cflags libffi`; CPPFLAGS="$CPPFLAGS $ffi_CFLAGS" INCLUDE_FLAGS="$INCLUDE_FLAGS $ffi_CFLAGS" fi fi ac_fn_c_check_header_mongrel "$LINENO" "ffi.h" "ac_cv_header_ffi_h" "$ac_includes_default" if test "x$ac_cv_header_ffi_h" = xyes; then : have_libffi=yes else have_libffi=no fi else have_libffi=no fi if test "$do_broken_libffcall" = "no"; then for ac_header in callback.h do : ac_fn_c_check_header_mongrel "$LINENO" "callback.h" "ac_cv_header_callback_h" "$ac_includes_default" if test "x$ac_cv_header_callback_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_CALLBACK_H 1 _ACEOF have_ffcall=yes else have_ffcall=no fi done else have_ffcall=no fi if test $have_ffcall = no; then enable_ffcall=no # If we don't have ffcall but do have libffi, use libffi if test $have_libffi = yes; then enable_libffi=yes fi fi if test $have_libffi = no; then enable_libffi=no # If we don't have libffi but do have ffcall, use ffcall if test $have_ffcall = yes; then if test $enable_ffcall = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ffi support seems to be missing on this system ... please install a recent libffi" >&5 $as_echo "$as_me: WARNING: ffi support seems to be missing on this system ... please install a recent libffi" >&2;} fi fi fi have_forward_hook=yes saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $OBJCFLAGS -x objective-c" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for forwarding callback in runtime" >&5 $as_echo_n "checking for forwarding callback in runtime... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include "$srcdir/config/config.forward2.m" _ACEOF if ac_fn_c_try_compile "$LINENO"; then : have_forward_hook=yes else have_forward_hook=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $have_forward_hook = yes; then $as_echo "#define HAVE_FORWARD2 1" >>confdefs.h else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include "$srcdir/config/config.forward.m" _ACEOF if ac_fn_c_try_compile "$LINENO"; then : have_forward_hook=yes else have_forward_hook=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_forward_hook" >&5 $as_echo "$have_forward_hook" >&6; } if test $have_forward_hook = no; then enable_libffi=no enable_ffcall=no fi CPPFLAGS="$saved_CPPFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking FFI library usage" >&5 $as_echo_n "checking FFI library usage... " >&6; } WITH_FFI=none if test $enable_libffi = yes; then $as_echo "#define USE_LIBFFI 1" >>confdefs.h WITH_FFI=libffi if test "$pkg_config_libffi" = "yes"; then ffi_LIBS=`pkg-config --libs libffi` else ffi_LIBS=-lffi fi LIBS="$ffi_LIBS $LIBS" if test "$cross_compiling" = yes; then : ffi_ok="$cross_ffi_ok" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include "$srcdir/config/config.ffi.c" _ACEOF if ac_fn_c_try_run "$LINENO"; then : ffi_ok="yes" else ffi_ok="no" fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi if test $ffi_ok = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: libffi" >&5 $as_echo "libffi" >&6; } if test $do_broken_libffi = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ffi may be broken on this system ... try enabling ffcall" >&5 $as_echo "$as_me: WARNING: ffi may be broken on this system ... try enabling ffcall" >&2;} fi for ac_func in ffi_prep_closure_loc do : ac_fn_c_check_func "$LINENO" "ffi_prep_closure_loc" "ac_cv_func_ffi_prep_closure_loc" if test "x$ac_cv_func_ffi_prep_closure_loc" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_FFI_PREP_CLOSURE_LOC 1 _ACEOF fi done else as_fn_error $? "The ffi library (libffi) does not appear to be working. Perhaps it's missing or you need a more recent version. Version 3.0.9 or later should work, and you can find a link to it n the list of packages for download at http://www.gnustep.org/resources/sources.html" "$LINENO" 5 fi elif test $enable_ffcall = yes; then $as_echo "#define USE_FFCALL 1" >>confdefs.h WITH_FFI=ffcall LIBS="-lcallback -lavcall $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ffi_ok="yes" else ffi_ok="no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test $ffi_ok = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: ffcall" >&5 $as_echo "ffcall" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ffcall is broken on some systems and is deprecated ... try enabling ffi" >&5 $as_echo "$as_me: WARNING: ffcall is broken on some systems and is deprecated ... try enabling ffi" >&2;} else ffi_ok=no fi if test $enable_ffcall = yes -a $ffi_ok = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if ffcall trampolines work" >&5 $as_echo_n "checking if ffcall trampolines work... " >&6; } if test "$cross_compiling" = yes; then : have_working_trampoline=yes else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include "$srcdir/config/config.trampoline.c" _ACEOF if ac_fn_c_try_run "$LINENO"; then : have_working_trampoline=yes else have_working_trampoline=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_working_trampoline" >&5 $as_echo "$have_working_trampoline" >&6; } fi if test $ffi_ok = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } echo if test $have_forward_hook = no; then echo "You do not have an up-to-date libobjc library installed" elif test "$have_working_trampoline" = no; then echo "You have ffcall, but it does not work properly. Most likely because" echo "your system's security policy is blocking some parts of ffcall" echo "we recommend installing libffi instead." else echo "You do not have either ffcall or libffi installed/enabled, or configure needs" echo "--with-ffi-include and/or --with-ffi-library flags so GNUstep can find them," echo "or you have ffcall but gnustep-make is configured to use native exceptions" echo "(native exceptions are not compatible with ffcall)." fi echo "GNUstep requires libffi (or ffcall) and proper libobjc hooks to do" echo "invocations and DO." echo "(This does not apply on apple-apple-apple systems where DO is" echo "not compatible with other GNUstep systems.)" if test $enable_invocations = yes; then echo echo "You most likely do not want to build base without invocation support." echo "Many things (including Distributed Objects and undo/redo), won't work" echo "at all without invocations." echo "If you really want to build -base without invocation support," echo "add --disable-invocations to the configure arguments." echo "For more information, read the GNUstep build guide, ffcall section:" echo "http://gnustep.made-it.com/BuildGuide/index.html" as_fn_error $? "Incomplete support for ffi functionality." "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Incomplete support for ffi funtionality." >&5 $as_echo "$as_me: WARNING: Incomplete support for ffi funtionality." >&2;} fi #-------------------------------------------------------------------- # Check for iconv support (for Unicode conversion). #-------------------------------------------------------------------- # Do this before checking for xml2, as xml2 may require iconv. # # We need to find an iconv library that matches the installed iconv.h header # (if any). It is important to check header/library compatibility. It's # fairly common to have iconv support both in libc and from libiconv. In that # case, a naive check that iconv() is in libc will succeed, but if we use # libiconv's iconv.h, it will redefine iconv() to functions that exist # only in libiconv, and we'll get link errors. # # Some versions of iconv don't support the '//TRANSLIT' option, which is # needed for a lossy conversion (where we pick the closest equivalent for # any character present in the source string which does not exist in the # destination characterset), so we check for support of that first. # First, check if there's a working iconv in libc (ie. if the test program # runs without any extra flags). # Check whether --enable-iconv was given. if test "${enable_iconv+set}" = set; then : enableval=$enable_iconv; else enable_iconv=yes fi if test $enable_iconv = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking iconv support" >&5 $as_echo_n "checking iconv support... " >&6; } if test "$cross_compiling" = yes; then : found_iconv="$cross_found_iconv_libc"; if test "$found_iconv" = "yes"; then $as_echo "#define HAVE_ICONV 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, in libc (via cross.config)" >&5 $as_echo "yes, in libc (via cross.config)" >&6; } fi else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main(int argc,char **argv) { return iconv_open("UTF-8//TRANSLIT","ASCII") == -1 ? 1 : 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : # libc has a working iconv. $as_echo "#define HAVE_ICONV 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, in libc" >&5 $as_echo "yes, in libc" >&6; } found_iconv=yes else found_iconv=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi if test $found_iconv = no ; then # libc doesn't have a working iconv with translit. # Try adding -liconv and any user supplied directory. # Check whether --with-libiconv-library was given. if test "${with_libiconv_library+set}" = set; then : withval=$with_libiconv_library; libiconv_libdir="$withval" else libiconv_libdir="no" fi if test "$libiconv_libdir" != "no"; then case "$target_os" in netbsd*) LDFLAGS="$LDFLAGS -L${libiconv_libdir} -Wl,-R${libiconv_libdir}" LDIR_FLAGS="$LDIR_FLAGS -Wl,-R${libiconv_libdir} -L${libiconv_libdir}";; *) LDFLAGS="$LDFLAGS -Wl,-rpath,${libiconv_libdir} -L${libiconv_libdir}" LDIR_FLAGS="$LDIR_FLAGS -Wl,-rpath,${libiconv_libdir} -L${libiconv_libdir}";; esac fi # Check whether --with-libiconv-include was given. if test "${with_libiconv_include+set}" = set; then : withval=$with_libiconv_include; libiconv_incdir="$withval" else libiconv_incdir="no" fi if test ${libiconv_incdir} != "no"; then CPPFLAGS="$CPPFLAGS -I${libiconv_incdir}" INCLUDE_FLAGS="$INCLUDE_FLAGS -I${libiconv_incdir}" fi old_LIBS="$LIBS" LIBS="-liconv $LIBS" if test "$cross_compiling" = yes; then : found_iconv="$cross_found_iconv_liconv"; if test "$found_iconv" = "yes"; then $as_echo "#define HAVE_ICONV 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, -liconv (via cross.config)" >&5 $as_echo "yes, -liconv (via cross.config)" >&6; } else LIBS="$old_LIBS" fi else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main(int argc,char **argv) { return iconv_open("UTF-8//TRANSLIT","ASCII") == -1 ? 1 : 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : # -liconv works. $as_echo "#define HAVE_ICONV 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, -liconv" >&5 $as_echo "yes, -liconv" >&6; } found_iconv=yes else found_iconv=no LIBS="$old_LIBS" fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi if test $found_iconv = no ; then # -liconv with translit didn't work. Try giconv.h and -lgiconv. # BSDs install this lib as libgiconv. old_LIBS="$LIBS" LIBS="-lgiconv $LIBS" if test "$cross_compiling" = yes; then : found_iconv="$cross_found_iconv_lgiconv"; if test "$found_iconv" = "yes"; then $as_echo "#define HAVE_ICONV 1" >>confdefs.h $as_echo "#define HAVE_GICONV 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, -lgiconv (via cross.config)" >&5 $as_echo "yes, -lgiconv (via cross.config)" >&6; } else LIBS="$old_LIBS" fi else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main(int argc,char **argv) { return iconv_open("UTF-8//TRANSLIT","ASCII") == -1 ? 1 : 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : $as_echo "#define HAVE_ICONV 1" >>confdefs.h $as_echo "#define HAVE_GICONV 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, -lgiconv" >&5 $as_echo "yes, -lgiconv" >&6; } found_iconv=yes else found_iconv=no LIBS="$old_LIBS" fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi # Check whether --enable-stricticonv was given. if test "${enable_stricticonv+set}" = set; then : enableval=$enable_stricticonv; else enable_stricticonv=no fi if test $enable_stricticonv = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking non-lossy iconv support" >&5 $as_echo_n "checking non-lossy iconv support... " >&6; } if test "$cross_compiling" = yes; then : { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run test program while cross compiling See \`config.log' for more details" "$LINENO" 5; } else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main(int argc,char **argv) { return iconv_open("UTF-8","ASCII") == -1 ? 1 : 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : # libc has a working iconv. $as_echo "#define HAVE_ICONV 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, in libc" >&5 $as_echo "yes, in libc" >&6; } found_iconv=yes else found_iconv=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi if test $found_iconv = no ; then # libc doesn't have a working iconv. Try adding -liconv and any user # supplied directory. # Check whether --with-libiconv-library was given. if test "${with_libiconv_library+set}" = set; then : withval=$with_libiconv_library; libiconv_libdir="$withval" else libiconv_libdir="no" fi if test "$libiconv_libdir" != "no"; then case "$target_os" in netbsd*) LDFLAGS="$LDFLAGS -L${libiconv_libdir} -Wl,-R${libiconv_libdir}" LDIR_FLAGS="$LDIR_FLAGS -Wl,-R${libiconv_libdir} -L${libiconv_libdir}";; *) LDFLAGS="$LDFLAGS -Wl,-rpath,${libiconv_libdir} -L${libiconv_libdir}" LDIR_FLAGS="$LDIR_FLAGS -Wl,-rpath,${libiconv_libdir} -L${libiconv_libdir}";; esac fi old_LIBS="$LIBS" LIBS="-liconv $LIBS" if test "$cross_compiling" = yes; then : { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run test program while cross compiling See \`config.log' for more details" "$LINENO" 5; } else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main(int argc,char **argv) { return iconv_open("UTF-8","ASCII") == -1 ? 1 : 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : # -liconv works. $as_echo "#define HAVE_ICONV 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, -liconv" >&5 $as_echo "yes, -liconv" >&6; } found_iconv=yes else found_iconv=no LIBS="$old_LIBS" fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi if test $found_iconv = no ; then # -liconv didn't work. Try giconv.h and -lgiconv. # BSDs install this lib as libgiconv. old_LIBS="$LIBS" LIBS="-lgiconv $LIBS" if test "$cross_compiling" = yes; then : { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run test program while cross compiling See \`config.log' for more details" "$LINENO" 5; } else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main(int argc,char **argv) { return iconv_open("UTF-8","ASCII") == -1 ? 1 : 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : $as_echo "#define HAVE_ICONV 1" >>confdefs.h $as_echo "#define HAVE_GICONV 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, -lgiconv" >&5 $as_echo "yes, -lgiconv" >&6; } found_iconv=yes else found_iconv=no LIBS="$old_LIBS" fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi if test $found_iconv = no ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } echo echo "You do not appear to have usable iconv header/library." echo "Building without them will disable much characterset support." echo "If you really want to build gnustep-base without character conversion" echo " support, please add --disable-iconv to the configure arguments." as_fn_error $? "Missing support for character conversion functionality." "$LINENO" 5 fi fi #-------------------------------------------------------------------- # Check recent libxml2 for GSXML and NSXMLNode # See DEPENDENCIES POLICY at the start of this file. #-------------------------------------------------------------------- # Check whether --enable-xml was given. if test "${enable_xml+set}" = set; then : enableval=$enable_xml; else enable_xml=yes fi HAVE_LIBXML=0 if test $enable_xml = yes; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XML" >&5 $as_echo_n "checking for XML... " >&6; } if test -n "$XML_CFLAGS"; then pkg_cv_XML_CFLAGS="$XML_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libxml-2.0 >= 2.3.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "libxml-2.0 >= 2.3.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_XML_CFLAGS=`$PKG_CONFIG --cflags "libxml-2.0 >= 2.3.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$XML_LIBS"; then pkg_cv_XML_LIBS="$XML_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libxml-2.0 >= 2.3.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "libxml-2.0 >= 2.3.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_XML_LIBS=`$PKG_CONFIG --libs "libxml-2.0 >= 2.3.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then XML_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libxml-2.0 >= 2.3.0" 2>&1` else XML_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libxml-2.0 >= 2.3.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$XML_PKG_ERRORS" >&5 # Check whether --with-xml-prefix was given. if test "${with_xml_prefix+set}" = set; then : withval=$with_xml_prefix; xml_config_prefix="$withval" else xml_config_prefix="" fi # Check whether --enable-xmltest was given. if test "${enable_xmltest+set}" = set; then : enableval=$enable_xmltest; else enable_xmltest=yes fi if test x$xml_config_prefix != x ; then xml_config_args="$xml_config_args --prefix=$xml_config_prefix" if test x${XML2_CONFIG+set} != xset ; then XML2_CONFIG=$xml_config_prefix/bin/xml2-config fi if test x${XML_CONFIG+set} != xset ; then XML_CONFIG=$xml_config_prefix/bin/xml-config fi fi # Extract the first word of "xml2-config", so it can be a program name with args. set dummy xml2-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_XML2_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $XML2_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_XML2_CONFIG="$XML2_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_XML2_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_XML2_CONFIG" && ac_cv_path_XML2_CONFIG="no" ;; esac fi XML2_CONFIG=$ac_cv_path_XML2_CONFIG if test -n "$XML2_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XML2_CONFIG" >&5 $as_echo "$XML2_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$XML2_CONFIG" = "no" ; then # Extract the first word of "xml-config", so it can be a program name with args. set dummy xml-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_XML_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $XML_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_XML_CONFIG="$XML_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_XML_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_XML_CONFIG" && ac_cv_path_XML_CONFIG="no" ;; esac fi XML_CONFIG=$ac_cv_path_XML_CONFIG if test -n "$XML_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XML_CONFIG" >&5 $as_echo "$XML_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else XML_CONFIG=$XML2_CONFIG fi min_xml_version=2.3.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libxml - version >= $min_xml_version" >&5 $as_echo_n "checking for libxml - version >= $min_xml_version... " >&6; } no_xml="" if test "$XML_CONFIG" = "no" ; then XML_CFLAGS="" XML_LIBS="-lxml2" ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $XML_CFLAGS" LIBS="$XML_LIBS $LIBS" rm -f conf.xmltest if test "$cross_compiling" = yes; then : echo $ac_n "cross compiling; assumed OK... $ac_c" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main() { int xml_major_version, xml_minor_version, xml_micro_version; int major, minor, micro; char *tmp_version; system("touch conf.xmltest"); tmp_version = xmlStrdup("$min_xml_version"); if(sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { printf("%s, bad version string\n", "$min_xml_version"); exit(1); } tmp_version = xmlStrdup(LIBXML_DOTTED_VERSION); if(sscanf(tmp_version, "%d.%d.%d", &xml_major_version, &xml_minor_version, &xml_micro_version) != 3) { printf("%s, bad version string\n", "$min_xml_version"); exit(1); } if ((xml_major_version > major) || ((xml_major_version == major) && (xml_minor_version > minor)) || ((xml_major_version == major) && (xml_minor_version == minor) && (xml_micro_version >= micro))) { return 0; } else { printf("\n*** An old version of libxml (%d.%d.%d) was found.\n", xml_major_version, xml_minor_version, xml_micro_version); printf("*** You need a version of libxml newer than %d.%d.%d. The latest version of\n", major, minor, micro); printf("*** libxml is always available from ftp://ftp.gnome.org.\n"); printf("***\n"); printf("*** If you have already installed a sufficiently new version, this error\n"); printf("*** probably means that the wrong copy of the xml-config shell script is\n"); printf("*** being found. The easiest way to fix this is to remove the old version\n"); printf("*** of libxml, but you can also set the XML_CONFIG environment to point to the\n"); printf("*** correct copy of xml-config. (In this case, you will have to\n"); printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n"); printf("*** so that the correct libraries are found at run-time))\n"); } return 1; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else no_xml=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" else XML_CFLAGS=`$XML_CONFIG $xml_config_args --cflags` XML_LIBS=`$XML_CONFIG $xml_config_args --libs` xml_config_major_version=`$XML_CONFIG $xml_config_args --version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` xml_config_minor_version=`$XML_CONFIG $xml_config_args --version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` xml_config_micro_version=`$XML_CONFIG $xml_config_args --version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` if test "x$enable_xmltest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $XML_CFLAGS" LIBS="$XML_LIBS $LIBS" rm -f conf.xmltest if test "$cross_compiling" = yes; then : echo $ac_n "cross compiling; assumed OK... $ac_c" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main() { int xml_major_version, xml_minor_version, xml_micro_version; int major, minor, micro; char *tmp_version; system("touch conf.xmltest"); tmp_version = xmlStrdup("$min_xml_version"); if(sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { printf("%s, bad version string\n", "$min_xml_version"); exit(1); } tmp_version = xmlStrdup(LIBXML_DOTTED_VERSION); if(sscanf(tmp_version, "%d.%d.%d", &xml_major_version, &xml_minor_version, &xml_micro_version) != 3) { printf("%s, bad version string\n", "$min_xml_version"); exit(1); } if((xml_major_version != $xml_config_major_version) || (xml_minor_version != $xml_config_minor_version) || (xml_micro_version != $xml_config_micro_version)) { printf("\n*** 'xml-config --version' returned %d.%d.%d, but libxml (%d.%d.%d)\n", $xml_config_major_version, $xml_config_minor_version, $xml_config_micro_version, xml_major_version, xml_minor_version, xml_micro_version); printf("*** was found! If xml-config was correct, then it is best\n"); printf("*** to remove the old version of libxml. You may also be able to fix the error\n"); printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n"); printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n"); printf("*** required on your system.\n"); printf("*** If xml-config was wrong, set the environment variable XML_CONFIG\n"); printf("*** to point to the correct copy of xml-config, and remove the file config.cache\n"); printf("*** before re-running configure\n"); } else { if ((xml_major_version > major) || ((xml_major_version == major) && (xml_minor_version > minor)) || ((xml_major_version == major) && (xml_minor_version == minor) && (xml_micro_version >= micro))) { return 0; } else { printf("\n*** An old version of libxml (%d.%d.%d) was found.\n", xml_major_version, xml_minor_version, xml_micro_version); printf("*** You need a version of libxml newer than %d.%d.%d. The latest version of\n", major, minor, micro); printf("*** libxml is always available from ftp://ftp.gnome.org.\n"); printf("***\n"); printf("*** If you have already installed a sufficiently new version, this error\n"); printf("*** probably means that the wrong copy of the xml-config shell script is\n"); printf("*** being found. The easiest way to fix this is to remove the old version\n"); printf("*** of libxml, but you can also set the XML_CONFIG environment to point to the\n"); printf("*** correct copy of xml-config. (In this case, you will have to\n"); printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n"); printf("*** so that the correct libraries are found at run-time))\n"); } } return 1; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else no_xml=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi if test "x$no_xml" = x ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } enable_libxml=yes else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if test "$XML_CONFIG" = "no" ; then echo "*** The xml-config script installed by libxml could not be found" echo "*** If libxml was installed in PREFIX, make sure PREFIX/bin is in" echo "*** your path, or set the XML_CONFIG environment variable to the" echo "*** full path to xml-config." else if test -f conf.xmltest ; then : else echo "*** Could not run libxml test program, checking why..." CFLAGS="$CFLAGS $XML_CFLAGS" LIBS="$LIBS $XML_LIBS" fi fi XML_CFLAGS="" XML_LIBS="" enable_libxml=no fi rm -f conf.xmltest elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } # Check whether --with-xml-prefix was given. if test "${with_xml_prefix+set}" = set; then : withval=$with_xml_prefix; xml_config_prefix="$withval" else xml_config_prefix="" fi # Check whether --enable-xmltest was given. if test "${enable_xmltest+set}" = set; then : enableval=$enable_xmltest; else enable_xmltest=yes fi if test x$xml_config_prefix != x ; then xml_config_args="$xml_config_args --prefix=$xml_config_prefix" if test x${XML2_CONFIG+set} != xset ; then XML2_CONFIG=$xml_config_prefix/bin/xml2-config fi if test x${XML_CONFIG+set} != xset ; then XML_CONFIG=$xml_config_prefix/bin/xml-config fi fi # Extract the first word of "xml2-config", so it can be a program name with args. set dummy xml2-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_XML2_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $XML2_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_XML2_CONFIG="$XML2_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_XML2_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_XML2_CONFIG" && ac_cv_path_XML2_CONFIG="no" ;; esac fi XML2_CONFIG=$ac_cv_path_XML2_CONFIG if test -n "$XML2_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XML2_CONFIG" >&5 $as_echo "$XML2_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$XML2_CONFIG" = "no" ; then # Extract the first word of "xml-config", so it can be a program name with args. set dummy xml-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_XML_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $XML_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_XML_CONFIG="$XML_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_XML_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_XML_CONFIG" && ac_cv_path_XML_CONFIG="no" ;; esac fi XML_CONFIG=$ac_cv_path_XML_CONFIG if test -n "$XML_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XML_CONFIG" >&5 $as_echo "$XML_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else XML_CONFIG=$XML2_CONFIG fi min_xml_version=2.3.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libxml - version >= $min_xml_version" >&5 $as_echo_n "checking for libxml - version >= $min_xml_version... " >&6; } no_xml="" if test "$XML_CONFIG" = "no" ; then XML_CFLAGS="" XML_LIBS="-lxml2" ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $XML_CFLAGS" LIBS="$XML_LIBS $LIBS" rm -f conf.xmltest if test "$cross_compiling" = yes; then : echo $ac_n "cross compiling; assumed OK... $ac_c" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main() { int xml_major_version, xml_minor_version, xml_micro_version; int major, minor, micro; char *tmp_version; system("touch conf.xmltest"); tmp_version = xmlStrdup("$min_xml_version"); if(sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { printf("%s, bad version string\n", "$min_xml_version"); exit(1); } tmp_version = xmlStrdup(LIBXML_DOTTED_VERSION); if(sscanf(tmp_version, "%d.%d.%d", &xml_major_version, &xml_minor_version, &xml_micro_version) != 3) { printf("%s, bad version string\n", "$min_xml_version"); exit(1); } if ((xml_major_version > major) || ((xml_major_version == major) && (xml_minor_version > minor)) || ((xml_major_version == major) && (xml_minor_version == minor) && (xml_micro_version >= micro))) { return 0; } else { printf("\n*** An old version of libxml (%d.%d.%d) was found.\n", xml_major_version, xml_minor_version, xml_micro_version); printf("*** You need a version of libxml newer than %d.%d.%d. The latest version of\n", major, minor, micro); printf("*** libxml is always available from ftp://ftp.gnome.org.\n"); printf("***\n"); printf("*** If you have already installed a sufficiently new version, this error\n"); printf("*** probably means that the wrong copy of the xml-config shell script is\n"); printf("*** being found. The easiest way to fix this is to remove the old version\n"); printf("*** of libxml, but you can also set the XML_CONFIG environment to point to the\n"); printf("*** correct copy of xml-config. (In this case, you will have to\n"); printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n"); printf("*** so that the correct libraries are found at run-time))\n"); } return 1; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else no_xml=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" else XML_CFLAGS=`$XML_CONFIG $xml_config_args --cflags` XML_LIBS=`$XML_CONFIG $xml_config_args --libs` xml_config_major_version=`$XML_CONFIG $xml_config_args --version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` xml_config_minor_version=`$XML_CONFIG $xml_config_args --version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` xml_config_micro_version=`$XML_CONFIG $xml_config_args --version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` if test "x$enable_xmltest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $XML_CFLAGS" LIBS="$XML_LIBS $LIBS" rm -f conf.xmltest if test "$cross_compiling" = yes; then : echo $ac_n "cross compiling; assumed OK... $ac_c" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main() { int xml_major_version, xml_minor_version, xml_micro_version; int major, minor, micro; char *tmp_version; system("touch conf.xmltest"); tmp_version = xmlStrdup("$min_xml_version"); if(sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { printf("%s, bad version string\n", "$min_xml_version"); exit(1); } tmp_version = xmlStrdup(LIBXML_DOTTED_VERSION); if(sscanf(tmp_version, "%d.%d.%d", &xml_major_version, &xml_minor_version, &xml_micro_version) != 3) { printf("%s, bad version string\n", "$min_xml_version"); exit(1); } if((xml_major_version != $xml_config_major_version) || (xml_minor_version != $xml_config_minor_version) || (xml_micro_version != $xml_config_micro_version)) { printf("\n*** 'xml-config --version' returned %d.%d.%d, but libxml (%d.%d.%d)\n", $xml_config_major_version, $xml_config_minor_version, $xml_config_micro_version, xml_major_version, xml_minor_version, xml_micro_version); printf("*** was found! If xml-config was correct, then it is best\n"); printf("*** to remove the old version of libxml. You may also be able to fix the error\n"); printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n"); printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n"); printf("*** required on your system.\n"); printf("*** If xml-config was wrong, set the environment variable XML_CONFIG\n"); printf("*** to point to the correct copy of xml-config, and remove the file config.cache\n"); printf("*** before re-running configure\n"); } else { if ((xml_major_version > major) || ((xml_major_version == major) && (xml_minor_version > minor)) || ((xml_major_version == major) && (xml_minor_version == minor) && (xml_micro_version >= micro))) { return 0; } else { printf("\n*** An old version of libxml (%d.%d.%d) was found.\n", xml_major_version, xml_minor_version, xml_micro_version); printf("*** You need a version of libxml newer than %d.%d.%d. The latest version of\n", major, minor, micro); printf("*** libxml is always available from ftp://ftp.gnome.org.\n"); printf("***\n"); printf("*** If you have already installed a sufficiently new version, this error\n"); printf("*** probably means that the wrong copy of the xml-config shell script is\n"); printf("*** being found. The easiest way to fix this is to remove the old version\n"); printf("*** of libxml, but you can also set the XML_CONFIG environment to point to the\n"); printf("*** correct copy of xml-config. (In this case, you will have to\n"); printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n"); printf("*** so that the correct libraries are found at run-time))\n"); } } return 1; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else no_xml=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi if test "x$no_xml" = x ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } enable_libxml=yes else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if test "$XML_CONFIG" = "no" ; then echo "*** The xml-config script installed by libxml could not be found" echo "*** If libxml was installed in PREFIX, make sure PREFIX/bin is in" echo "*** your path, or set the XML_CONFIG environment variable to the" echo "*** full path to xml-config." else if test -f conf.xmltest ; then : else echo "*** Could not run libxml test program, checking why..." CFLAGS="$CFLAGS $XML_CFLAGS" LIBS="$LIBS $XML_LIBS" fi fi XML_CFLAGS="" XML_LIBS="" enable_libxml=no fi rm -f conf.xmltest else XML_CFLAGS=$pkg_cv_XML_CFLAGS XML_LIBS=$pkg_cv_XML_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } enable_libxml=yes fi if test $enable_libxml = yes; then CPPFLAGS="$CPPFLAGS $XML_CFLAGS" INCLUDE_FLAGS="$INCLUDE_FLAGS $XML_CFLAGS" LIBS="$XML_LIBS $LIBS" HAVE_LIBXML=1 $as_echo "#define HAVE_LIBXML 1" >>confdefs.h for ac_header in libxml/SAX2.h do : ac_fn_c_check_header_mongrel "$LINENO" "libxml/SAX2.h" "ac_cv_header_libxml_SAX2_h" "$ac_includes_default" if test "x$ac_cv_header_libxml_SAX2_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBXML_SAX2_H 1 _ACEOF fi done #-------------------------------------------------------------------- # Check for (optional) libxslt #-------------------------------------------------------------------- # Check whether --enable-xslt was given. if test "${enable_xslt+set}" = set; then : enableval=$enable_xslt; else enable_xslt=yes fi if test $enable_xslt = yes; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XSLT" >&5 $as_echo_n "checking for XSLT... " >&6; } if test -n "$XSLT_CFLAGS"; then pkg_cv_XSLT_CFLAGS="$XSLT_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libxslt >= 1.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "libxslt >= 1.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_XSLT_CFLAGS=`$PKG_CONFIG --cflags "libxslt >= 1.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$XSLT_LIBS"; then pkg_cv_XSLT_LIBS="$XSLT_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libxslt >= 1.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "libxslt >= 1.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_XSLT_LIBS=`$PKG_CONFIG --libs "libxslt >= 1.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then XSLT_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libxslt >= 1.0" 2>&1` else XSLT_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libxslt >= 1.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$XSLT_PKG_ERRORS" >&5 xslt_ok=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } xslt_ok=no else XSLT_CFLAGS=$pkg_cv_XSLT_CFLAGS XSLT_LIBS=$pkg_cv_XSLT_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } xslt_ok=yes fi if test "$xslt_ok" = "yes"; then for ac_header in libxslt/xslt.h do : ac_fn_c_check_header_mongrel "$LINENO" "libxslt/xslt.h" "ac_cv_header_libxslt_xslt_h" "$ac_includes_default" if test "x$ac_cv_header_libxslt_xslt_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBXSLT_XSLT_H 1 _ACEOF xslt_ok=yes else xslt_ok=no fi done fi if test "$xslt_ok" = "yes"; then CPPFLAGS="$CPPFLAGS $XSLT_CFLAGS" INCLUDE_FLAGS="$INCLUDE_FLAGS $XSLT_CFLAGS" LIBS="$XSLT_LIBS $LIBS" HAVE_LIBXSLT=1 $as_echo "#define HAVE_LIBXSLT 1" >>confdefs.h else echo echo "You do not appear to have usable libxslt headers/library." echo "Building without them will disable the XSLT extensions." echo "If you really want to build gnustep-base without XSLT support," echo "add --disable-xslt to the configure arguments to avoid warning." { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Missing support for XSLT functionality." >&5 $as_echo "$as_me: WARNING: Missing support for XSLT functionality." >&2;} fi else HAVE_LIBXSLT=0 { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Disabled support for XSLT funtionality." >&5 $as_echo "$as_me: WARNING: Disabled support for XSLT funtionality." >&2;} fi else echo echo "You do not appear to have usable libxml2 headers/library." echo "Building without them will disable the GSXML and NSXMLNode." echo "If you really want to build gnustep-base without XML DOM support" echo " (though NSXMLParser is unaffected), please" echo "add --disable-xml to the configure arguments." as_fn_error $? "Missing support for XML DOM functionality." "$LINENO" 5 fi else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: XML functionality disabled." >&5 $as_echo "$as_me: WARNING: XML functionality disabled." >&2;} fi #-------------------------------------------------------------------- # Check recent libgnutls for SSL streams. # See DEPENDENCIES POLICY at the start of this file. #-------------------------------------------------------------------- # Check whether --enable-tls was given. if test "${enable_tls+set}" = set; then : enableval=$enable_tls; else enable_tls=yes fi if test $enable_tls = yes; then HAVE_GNUTLS=0 # Save CFLAGS and LIBS as AM_PATH_TLS clobbers these variables regardless # of the success of the macro. saved_LIBS="$LIBS" saved_CFLAGS="$CFLAGS" if test -n "$PKG_CONFIG"; then if pkg-config --exists gnutls; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking gnutls support" >&5 $as_echo_n "checking gnutls support... " >&6; } HAVE_GNUTLS=1 TLS_CFLAGS=`$PKG_CONFIG --cflags gnutls` TLS_LIBS=`$PKG_CONFIG --libs gnutls` fi fi if test $HAVE_GNUTLS = 0; then # AM_PATH_TLS(2.0.1, enable_libgnutls=yes, enable_libgnutls=no) # Check whether --with-tls-prefix was given. if test "${with_tls_prefix+set}" = set; then : withval=$with_tls_prefix; tls_config_prefix="$withval" else tls_config_prefix="" fi # Check whether --enable-tlstest was given. if test "${enable_tlstest+set}" = set; then : enableval=$enable_tlstest; else enable_tlstest=yes fi if test x$tls_config_prefix != x ; then tls_config_args="$tls_config_args --prefix=$tls_config_prefix" if test x${TLS_CONFIG+set} != xset ; then TLS_CONFIG=$tls_config_prefix/bin/libgnutls-config fi fi if test ! -x "$TLS_CONFIG" ; then unset TLS_CONFIG fi # Extract the first word of "libgnutls-config", so it can be a program name with args. set dummy libgnutls-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_TLS_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $TLS_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_TLS_CONFIG="$TLS_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_TLS_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_TLS_CONFIG" && ac_cv_path_TLS_CONFIG="no" ;; esac fi TLS_CONFIG=$ac_cv_path_TLS_CONFIG if test -n "$TLS_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TLS_CONFIG" >&5 $as_echo "$TLS_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi min_tls_version=1.4.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libgnutls - version >= $min_tls_version" >&5 $as_echo_n "checking for libgnutls - version >= $min_tls_version... " >&6; } no_tls="" if test "$TLS_CONFIG" = "no" ; then if test x$tls_config_prefix != x ; then TLS_CFLAGS="-I$tls_config_prefix/include" TLS_LIBS="-L$tls_config_prefix/lib -lgnutls -lgcrypt" else TLS_CFLAGS="-I/usr/include" TLS_LIBS="-L/usr/lib -lgnutls -lgcrypt" fi ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $TLS_CFLAGS" LIBS="$TLS_LIBS $LIBS" rm -f conf.tlstest if test "$cross_compiling" = yes; then : echo $ac_n "cross compiling; assumed OK... $ac_c" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main() { system("touch conf.tlstest"); if (gnutls_check_version("$min_tls_version") == 0) { printf("\n*** An old version of libgnutls (%s) was found.\n", gnutls_check_version(0)); printf("*** You need a version of libtgnuls newer than $min_tls_version.\n"); printf("*** If you have already installed a sufficiently new version, this error\n"); printf("*** probably means that the wrong copy of the libgnutls-config shell script is\n"); printf("*** being found. You can fix this is by removing the old version\n"); printf("*** of libgnutls.\n"); return 1; } return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else no_tls=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" else TLS_CFLAGS=`$TLS_CONFIG $tls_config_args --cflags` TLS_LIBS=`$TLS_CONFIG $tls_config_args --libs` tls_config_major_version=`$TLS_CONFIG $tls_config_args --version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` tls_config_minor_version=`$TLS_CONFIG $tls_config_args --version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` tls_config_micro_version=`$TLS_CONFIG $tls_config_args --version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` if test "x$enable_tlstest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $TLS_CFLAGS" LIBS="$TLS_LIBS $LIBS" rm -f conf.tlstest if test "$cross_compiling" = yes; then : echo $ac_n "cross compiling; assumed OK... $ac_c" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main() { system("touch conf.tlstest"); if (gnutls_check_version("$min_tls_version") == 0) { printf("\n*** An old version of libgnutls (%s) was found.\n", gnutls_check_version(0)); printf("*** You need a version of libtgnuls newer than $min_tls_version.\n"); printf("*** If you have already installed a sufficiently new version, this error\n"); printf("*** probably means that the wrong copy of the libgnutls-config shell script is\n"); printf("*** being found. You can fix this is by removing the old version\n"); printf("*** of libgnutls.\n"); return 1; } return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else no_tls=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi if test "x$no_tls" = x ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } enable_libgnutls=yes else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if test "$TLS_CONFIG" = "no" ; then echo "*** The libgnutls-config script installed by libgnutls could not be found" echo "*** If libtgnuls-config was installed in PREFIX, make sure PREFIX/bin is in" echo "*** your path." else if test -f conf.tlstest ; then : else echo "*** Could not run libtgnuls test program, checking why..." CFLAGS="$CFLAGS $TLS_CFLAGS" LIBS="$LIBS $TLS_LIBS" fi fi TLS_CFLAGS="" TLS_LIBS="" enable_libgnutls=no fi rm -f conf.tlstest if test $enable_libgnutls = yes; then HAVE_GNUTLS=1 else HAVE_GNUTLS=0 fi fi if test $HAVE_GNUTLS = 1; then if ! pkg-config --atleast-version=2.12 gnutls; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gcry_control in -lgcrypt" >&5 $as_echo_n "checking for gcry_control in -lgcrypt... " >&6; } if ${ac_cv_lib_gcrypt_gcry_control+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lgcrypt $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gcry_control (); int main () { return gcry_control (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_gcrypt_gcry_control=yes else ac_cv_lib_gcrypt_gcry_control=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gcrypt_gcry_control" >&5 $as_echo "$ac_cv_lib_gcrypt_gcry_control" >&6; } if test "x$ac_cv_lib_gcrypt_gcry_control" = xyes; then : have_gcrypt=yes else have_gcrypt=no fi if test "$have_gcrypt" = "no"; then HAVE_GNUTLS=0 else TLS_LIBS="$TLS_LIBS -lgcrypt" fi fi fi if test $HAVE_GNUTLS = 0; then # Restore the CFLAGS and LIBS because AM_PATH_TLS messes them LIBS="$saved_LIBS" CFLAGS="$saved_CFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } echo echo "You do not appear to have usable libgnutls headers/library." echo "Building without them will disable SSL/TLS/HTTPS in NSStream," echo "NSFileHandle, NSURLHandle and NSURLConnection." echo "If you really want to build gnustep-base without TLS support," echo "add --disable-tls to the configure arguments." as_fn_error $? "Missing support for TLS functionality." "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CPPFLAGS="$CPPFLAGS $TLS_CFLAGS" INCLUDE_FLAGS="$INCLUDE_FLAGS $TLS_CFLAGS" LIBS="$TLS_LIBS $LIBS" for ac_func in gnutls_transport_set_errno do : ac_fn_c_check_func "$LINENO" "gnutls_transport_set_errno" "ac_cv_func_gnutls_transport_set_errno" if test "x$ac_cv_func_gnutls_transport_set_errno" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GNUTLS_TRANSPORT_SET_ERRNO 1 _ACEOF fi done if test "$ac_cv_func_gnutls_transport_set_errno" = "no"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Missing support for thread-safe error handling in GNUTLS. Please check that you have the most recent version installed (2.0 or later chould be fine)." >&5 $as_echo "$as_me: WARNING: Missing support for thread-safe error handling in GNUTLS. Please check that you have the most recent version installed (2.0 or later chould be fine)." >&2;} fi for ac_func in gnutls_x509_privkey_import2 do : ac_fn_c_check_func "$LINENO" "gnutls_x509_privkey_import2" "ac_cv_func_gnutls_x509_privkey_import2" if test "x$ac_cv_func_gnutls_x509_privkey_import2" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GNUTLS_X509_PRIVKEY_IMPORT2 1 _ACEOF fi done fi else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Disabled support for TLS funtionality." >&5 $as_echo "$as_me: WARNING: Disabled support for TLS funtionality." >&2;} HAVE_GNUTLS=0 fi if test $HAVE_GNUTLS = 1; then cat >>confdefs.h <<_ACEOF #define HAVE_GNUTLS $HAVE_GNUTLS _ACEOF fi #-------------------------------------------------------------------- # Check for NSNetServices # See DEPENDENCIES POLICY at the start of this file. #-------------------------------------------------------------------- HAVE_MDNS=0 HAVE_AVAHI=0 # Check whether --enable-zeroconf was given. if test "${enable_zeroconf+set}" = set; then : enableval=$enable_zeroconf; else enable_zeroconf=yes fi # Check whether --with-zeroconf-api was given. if test "${with_zeroconf_api+set}" = set; then : withval=$with_zeroconf_api; zeroconf_api="$withval" else zeroconf_api="any" fi if test $enable_zeroconf = yes; then if test "$zeroconf_api" = "any" || test "$zeroconf_api" = "mdns"; then for ac_header in dns_sd.h do : ac_fn_c_check_header_mongrel "$LINENO" "dns_sd.h" "ac_cv_header_dns_sd_h" "$ac_includes_default" if test "x$ac_cv_header_dns_sd_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DNS_SD_H 1 _ACEOF have_mdns=yes else have_mdns=no fi done if test "$have_mdns" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for DNSServiceBrowse in -ldns_sd" >&5 $as_echo_n "checking for DNSServiceBrowse in -ldns_sd... " >&6; } if ${ac_cv_lib_dns_sd_DNSServiceBrowse+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldns_sd $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char DNSServiceBrowse (); int main () { return DNSServiceBrowse (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dns_sd_DNSServiceBrowse=yes else ac_cv_lib_dns_sd_DNSServiceBrowse=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dns_sd_DNSServiceBrowse" >&5 $as_echo "$ac_cv_lib_dns_sd_DNSServiceBrowse" >&6; } if test "x$ac_cv_lib_dns_sd_DNSServiceBrowse" = xyes; then : have_mdns=yes else have_mdns=no fi if test "$have_mdns" = "yes"; then MDNS_LIBS="-ldns_sd" HAVE_MDNS=1 fi fi fi if test "$zeroconf_api" = "any" || test "$zeroconf_api" = "avahi"; then for ac_header in avahi-client/client.h do : ac_fn_c_check_header_mongrel "$LINENO" "avahi-client/client.h" "ac_cv_header_avahi_client_client_h" "$ac_includes_default" if test "x$ac_cv_header_avahi_client_client_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_AVAHI_CLIENT_CLIENT_H 1 _ACEOF have_avahi=yes else have_avahi=no fi done if test "$have_avahi" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for avahi_client_new in -lavahi-client" >&5 $as_echo_n "checking for avahi_client_new in -lavahi-client... " >&6; } if ${ac_cv_lib_avahi_client_avahi_client_new+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lavahi-client $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char avahi_client_new (); int main () { return avahi_client_new (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_avahi_client_avahi_client_new=yes else ac_cv_lib_avahi_client_avahi_client_new=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_avahi_client_avahi_client_new" >&5 $as_echo "$ac_cv_lib_avahi_client_avahi_client_new" >&6; } if test "x$ac_cv_lib_avahi_client_avahi_client_new" = xyes; then : have_avahi=yes else have_avahi=no fi if test "$have_avahi" = "yes"; then AVAHI_LIBS="-lavahi-common -lavahi-client" HAVE_AVAHI=1 fi fi fi # If we have both APIs, prefer Avahi, because the mDNS API # is most certainly the compatability one if test "$have_avahi" = "yes" && test "$have_mdns" = "yes"; then LIBS="$AVAHI_LIBS $LIBS" HAVE_MDNS=0 else # One of those will be empty. LIBS="$AVAHI_LIBS $MDNS_LIBS $LIBS" fi fi #-------------------------------------------------------------------- # Check for International Components for Unicode # See DEPENDENCIES POLICY at the start of this file. #-------------------------------------------------------------------- HAVE_ICU=0 # Check whether --enable-icu was given. if test "${enable_icu+set}" = set; then : enableval=$enable_icu; else enable_icu=yes fi if test "x$enable_icu" = "xyes"; then : case "$target_os" in mingw*|windows) # check for ICU bundled with Windows 10 old_LIBS="$LIBS" LIBS="-licu $LIBS" for ac_header in icu.h do : ac_fn_c_check_header_mongrel "$LINENO" "icu.h" "ac_cv_header_icu_h" "$ac_includes_default" if test "x$ac_cv_header_icu_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_ICU_H 1 _ACEOF if test "$cross_compiling" = yes; then : { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run test program while cross compiling See \`config.log' for more details" "$LINENO" 5; } else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { return udat_countAvailable() > 0 ? 0 : 1; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : HAVE_ICU=1 fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi done LIBS="$old_LIBS" if test $HAVE_ICU = 1; then ICU_LIBS=-licu { $as_echo "$as_me:${as_lineno-$LINENO}: Using system-provided ICU DLL (requires Windows 10 version 1903 or later)" >&5 $as_echo "$as_me: Using system-provided ICU DLL (requires Windows 10 version 1903 or later)" >&6;} fi ;; esac if test $HAVE_ICU = 0; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ICU" >&5 $as_echo_n "checking for ICU... " >&6; } if test -n "$ICU_CFLAGS"; then pkg_cv_ICU_CFLAGS="$ICU_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"icu-i18n > 49.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "icu-i18n > 49.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_ICU_CFLAGS=`$PKG_CONFIG --cflags "icu-i18n > 49.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$ICU_LIBS"; then pkg_cv_ICU_LIBS="$ICU_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"icu-i18n > 49.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "icu-i18n > 49.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_ICU_LIBS=`$PKG_CONFIG --libs "icu-i18n > 49.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then ICU_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "icu-i18n > 49.0" 2>&1` else ICU_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "icu-i18n > 49.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$ICU_PKG_ERRORS" >&5 HAVE_ICU=0 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_ICU=0 else ICU_CFLAGS=$pkg_cv_ICU_CFLAGS ICU_LIBS=$pkg_cv_ICU_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } for ac_header in unicode/uloc.h unicode/ulocdata.h unicode/ucol.h unicode/ucurr.h unicode/uregex.h unicode/ucal.h unicode/unorm2.h unicode/unum.h unicode/udat.h unicode/udatpg.h unicode/ustring.h unicode/usearch.h unicode/ucnv.h unicode/utext.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF HAVE_ICU=1 fi done fi fi if test $HAVE_ICU = 0; then as_fn_error $? "No useable ICU installation found" "$LINENO" 5 fi LIBS="$LIBS $ICU_LIBS" fi #-------------------------------------------------------------------- # Check for libdispatch # See DEPENDENCIES POLICY at the start of this file. #-------------------------------------------------------------------- HAVE_LIBDISPATCH=0 # Check whether --enable-libdispatch was given. if test "${enable_libdispatch+set}" = set; then : enableval=$enable_libdispatch; enable_libdispatch=$enableval else enable_libdispatch=yes fi if test $enable_libdispatch = yes; then # Check whether --with-dispatch-include was given. if test "${with_dispatch_include+set}" = set; then : withval=$with_dispatch_include; dispatch_incdir="$withval" else dispatch_incdir="no" fi if test ${dispatch_incdir} != "no"; then CPPFLAGS="$CPPFLAGS -I${dispatch_incdir}" INCLUDE_FLAGS="$INCLUDE_FLAGS -I${dispatch_incdir}" fi # Check whether --with-dispatch-library was given. if test "${with_dispatch_library+set}" = set; then : withval=$with_dispatch_library; dispatch_libdir="$withval" else dispatch_libdir="no" fi if test ${dispatch_libdir} != "no"; then case "$target_os" in netbsd*) LDFLAGS="$LDFLAGS -L${dispatch_libdir} -Wl,-R${dispatch_libdir}" LDIR_FLAGS="$LDIR_FLAGS -Wl,-R${dispatch_libdir} -L${dispatch_libdir}";; *) LDFLAGS="$LDFLAGS -Wl,-rpath,${dispatch_libdir} -L${dispatch_libdir}" LDIR_FLAGS="$LDIR_FLAGS -Wl,-rpath,${dispatch_libdir} -L${dispatch_libdir}";; esac fi for ac_header in dispatch/dispatch.h do : ac_fn_c_check_header_mongrel "$LINENO" "dispatch/dispatch.h" "ac_cv_header_dispatch_dispatch_h" "$ac_includes_default" if test "x$ac_cv_header_dispatch_dispatch_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DISPATCH_DISPATCH_H 1 _ACEOF have_dispatch=yes else have_dispatch=no fi done if test "$have_dispatch" = "yes"; then # check for private header which includes runloop integration functions in # the Swift corelibs libdispatch release for ac_header in dispatch/private.h do : ac_fn_c_check_header_mongrel "$LINENO" "dispatch/private.h" "ac_cv_header_dispatch_private_h" "$ac_includes_default" if test "x$ac_cv_header_dispatch_private_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DISPATCH_PRIVATE_H 1 _ACEOF fi done else for ac_header in dispatch.h do : ac_fn_c_check_header_mongrel "$LINENO" "dispatch.h" "ac_cv_header_dispatch_h" "$ac_includes_default" if test "x$ac_cv_header_dispatch_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DISPATCH_H 1 _ACEOF have_dispatch=yes else have_dispatch=no fi done fi if test "$have_dispatch" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dispatch_queue_create in -ldispatch" >&5 $as_echo_n "checking for dispatch_queue_create in -ldispatch... " >&6; } if ${ac_cv_lib_dispatch_dispatch_queue_create+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldispatch $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dispatch_queue_create (); int main () { return dispatch_queue_create (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dispatch_dispatch_queue_create=yes else ac_cv_lib_dispatch_dispatch_queue_create=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dispatch_dispatch_queue_create" >&5 $as_echo "$ac_cv_lib_dispatch_dispatch_queue_create" >&6; } if test "x$ac_cv_lib_dispatch_dispatch_queue_create" = xyes; then : have_dispatch=yes else have_dispatch=no fi if test "$have_dispatch" = "yes"; then saveLIBS="$LIBS" LIBS="-lobjc -ldispatch"; # This check is needed because libdispatch might be linked against a # version of libBlocksRuntime that defines symbols conflicting with libobjc { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we can link libdispatch and libobjc at the same time" >&5 $as_echo_n "checking whether we can link libdispatch and libobjc at the same time... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : have_dispatch=yes else have_dispatch=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$have_dispatch" = "yes"; then LIBS="$saveLIBS -ldispatch"; { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; }; HAVE_LIBDISPATCH=1; else LIBS="$saveLIBS"; { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; }; fi fi else HAVE_LIBDISPATCH=0; # just ignore libdispatch if it's not there fi fi HAVE_LIBDISPATCH_RUNLOOP=0 if test $HAVE_LIBDISPATCH = 1; then # We check whether we have a variant of libdispatch that allows runloop # integration for ac_func in dispatch_main_queue_drain_np dispatch_get_main_queue_handle_np do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done if test "$ac_cv_func_dispatch_main_queue_drain_np" = "yes" && test "$ac_cv_func_dispatch_get_main_queue_handle_np" = "yes"; then HAVE_LIBDISPATCH_RUNLOOP=1 fi # Check for "_4CF" variants of runloop integration functions provided by the # Swift corelibs libdispatch release for ac_func in _dispatch_main_queue_callback_4CF _dispatch_get_main_queue_handle_4CF do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done if test "$ac_cv_func__dispatch_main_queue_callback_4CF" = "yes" && test "$ac_cv_func__dispatch_get_main_queue_handle_4CF" = "yes"; then HAVE_LIBDISPATCH_RUNLOOP=1 fi fi #-------------------------------------------------------------------- # Check for libcurl # See DEPENDENCIES POLICY at the start of this file. #-------------------------------------------------------------------- CURL_CONFIG="curl-config" # Check whether --with-curl was given. if test "${with_curl+set}" = set; then : withval=$with_curl; fi if test "$with_curl" != ""; then CURL_CONFIG="$with_curl/bin/curl-config" fi HAVE_LIBCURL=0 SKIP_CURL_CONFIG=0 curl_all=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libcurl" >&5 $as_echo_n "checking for libcurl... " >&6; } case "$target_os" in windows) SKIP_CURL_CONFIG=1;; esac # When compiling libs-base in an MSYS2 environment on Windows MSVC, compilation may fail: # Curl is preinstalled on MSYS2 and bundles the curl-config script. The MSYS2 curl library # and a different (MSVC) curl library might interfere and produce an incorrect configuration. # # Skip the curl-config check on Windows. if eval $CURL_CONFIG --version 2>/dev/null >/dev/null && test "$SKIP_CURL_CONFIG" == "0"; then curl_ver=`$CURL_CONFIG --version | sed -e "s/libcurl //g"` curl_maj=`echo $curl_ver | sed -e "s/^\(.*\)\.\(.*\)\.\(.*\)$/\1/"` curl_min=`echo $curl_ver | sed -e "s/^\(.*\)\.\(.*\)\.\(.*\)$/\2/"` if test $curl_maj -lt 7 -o \( $curl_maj -eq 7 -a $curl_min -lt 66 \); then { $as_echo "$as_me:${as_lineno-$LINENO}: result: FAILED (version too old to use" >&5 $as_echo "FAILED (version too old to use" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes ... version $curl_ver" >&5 $as_echo "yes ... version $curl_ver" >&6; } for ac_header in curl/curl.h do : ac_fn_c_check_header_mongrel "$LINENO" "curl/curl.h" "ac_cv_header_curl_curl_h" "$ac_includes_default" if test "x$ac_cv_header_curl_curl_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_CURL_CURL_H 1 _ACEOF curl_ok=yes else curl_ok=no fi done if test "$curl_ok" = yes; then HAVE_LIBCURL=1 CURLCFLAGS=`$CURL_CONFIG --cflags` CURLLIBS=`$CURL_CONFIG --libs` CFLAGS="$CFLAGS $CURLCFLAGS" LIBS="$LIBS $CURLLIBS" curl_all=yes fi fi else if test -n "$PKG_CONFIG"; then if pkg-config --exists libcurl; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes ... via pkg-config" >&5 $as_echo "yes ... via pkg-config" >&6; } if $PKG_CONFIG --atleast-version 2.66.0 libcurl; then for ac_header in curl/curl.h do : ac_fn_c_check_header_mongrel "$LINENO" "curl/curl.h" "ac_cv_header_curl_curl_h" "$ac_includes_default" if test "x$ac_cv_header_curl_curl_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_CURL_CURL_H 1 _ACEOF curl_ok=yes else curl_ok=no fi done if test "$curl_ok" = yes; then HAVE_LIBCURL=1 CURLCFLAGS=`$PKG_CONFIG --cflags libcurl` CURLLIBS=`$PKG_CONFIG --libs libcurl` CFLAGS="$CFLAGS $CURLCFLAGS" LIBS="$LIBS $CURLLIBS" curl_all=yes fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: FAILED (version too old to use" >&5 $as_echo "FAILED (version too old to use" >&6; } curl_all=no fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: FAILED (libcurl not found via pkg-config)" >&5 $as_echo "FAILED (libcurl not found via pkg-config)" >&6; } curl_all=no fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: FAILED (curl-config and pkg-config not found)" >&5 $as_echo "FAILED (curl-config and pkg-config not found)" >&6; } fi fi #-------------------------------------------------------------------- # Check dependencies of NSURLSession API #-------------------------------------------------------------------- nsurlsessiondefault=no if test "$OBJC_RUNTIME_LIB" = "ng" -a $HAVE_BLOCKS = 1 -a $HAVE_LIBDISPATCH = 1 -a $HAVE_LIBCURL = 1; then nsurlsessiondefault=yes fi GS_HAVE_NSURLSESSION=0 # Check whether --enable-nsurlsession was given. if test "${enable_nsurlsession+set}" = set; then : enableval=$enable_nsurlsession; else enable_nsurlsession=$nsurlsessiondefault fi if test $enable_nsurlsession = yes; then if test "$OBJC_RUNTIME_LIB" != "ng"; then as_fn_error $? "Missing ng runtime (needed for NSURLSession). To build without NSURLSession support, please run configure again with the --disable-nsurlsession option." "$LINENO" 5 fi if test $HAVE_BLOCKS = 0; then as_fn_error $? "Missing blocks support (needed for NSURLSession). To build without NSURLSession support, please run configure again with the --disable-nsurlsession option." "$LINENO" 5 fi if test $HAVE_LIBDISPATCH = 0; then as_fn_error $? "Missing libdispatch (needed for NSURLSession). To build without NSURLSession support, please run configure again with the --disable-nsurlsession option." "$LINENO" 5 fi # Check for dispatch_queue_create_with_target needed for NSURLSession for ac_func in dispatch_queue_create_with_target do : ac_fn_c_check_func "$LINENO" "dispatch_queue_create_with_target" "ac_cv_func_dispatch_queue_create_with_target" if test "x$ac_cv_func_dispatch_queue_create_with_target" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DISPATCH_QUEUE_CREATE_WITH_TARGET 1 _ACEOF fi done if test $HAVE_LIBCURL = 0; then as_fn_error $? "Missing libcurl (needed for NSURLSession). To build without NSURLSession support, please run configure again with the --disable-nsurlsession option." "$LINENO" 5 fi GS_HAVE_NSURLSESSION=1 fi #-------------------------------------------------------------------- # Check GMP for NSDecimal #-------------------------------------------------------------------- # Check whether --with-gmp-include was given. if test "${with_gmp_include+set}" = set; then : withval=$with_gmp_include; gmp_incdir="$withval" else gmp_incdir="no" fi # Check whether --with-gmp-library was given. if test "${with_gmp_library+set}" = set; then : withval=$with_gmp_library; gmp_libdir="$withval" else gmp_libdir="no" fi libs_temp=$LIBS if test "$gmp_incdir" != "no"; then CPPFLAGS="$CPPFLAGS -I$gmp_incdir" INCLUDE_FLAGS="$INCLUDE_FLAGS -I$gmp_incdir" fi if test "$gmp_libdir" != "no"; then case "$target_os" in netbsd*) LDFLAGS="$LDFLAGS -L${gmp_libdir} -Wl,-R${gmp_libdir}" LDIR_FLAGS="$LDIR_FLAGS -Wl,-R${gmp_libdir} -L${gmp_libdir}";; *) LDFLAGS="$LDFLAGS -Wl,-rpath,${gmp_libdir} -L${gmp_libdir}" LDIR_FLAGS="$LDIR_FLAGS -Wl,-rpath,${gmp_libdir} -L${gmp_libdir}";; esac fi USE_GMP=0 for ac_header in gmp.h do : ac_fn_c_check_header_mongrel "$LINENO" "gmp.h" "ac_cv_header_gmp_h" "$ac_includes_default" if test "x$ac_cv_header_gmp_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GMP_H 1 _ACEOF fi done if test $ac_cv_header_gmp_h = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mpf_abs in -lgmp" >&5 $as_echo_n "checking for mpf_abs in -lgmp... " >&6; } if ${ac_cv_lib_gmp_mpf_abs+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lgmp $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char mpf_abs (); int main () { return mpf_abs (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_gmp_mpf_abs=yes else ac_cv_lib_gmp_mpf_abs=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gmp_mpf_abs" >&5 $as_echo "$ac_cv_lib_gmp_mpf_abs" >&6; } if test "x$ac_cv_lib_gmp_mpf_abs" = xyes; then : gmp_ok=yes else gmp_ok=no fi if test "$gmp_ok" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __gmpf_abs in -lgmp" >&5 $as_echo_n "checking for __gmpf_abs in -lgmp... " >&6; } if ${ac_cv_lib_gmp___gmpf_abs+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lgmp $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char __gmpf_abs (); int main () { return __gmpf_abs (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_gmp___gmpf_abs=yes else ac_cv_lib_gmp___gmpf_abs=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gmp___gmpf_abs" >&5 $as_echo "$ac_cv_lib_gmp___gmpf_abs" >&6; } if test "x$ac_cv_lib_gmp___gmpf_abs" = xyes; then : gmp_ok=yes else gmp_ok=no fi fi if test "$gmp_ok" = yes; then LIBS="-lgmp $LIBS" USE_GMP=1 fi fi #-------------------------------------------------------------------- # Check whether nl_langinfo(CODESET) is supported, needed by Unicode.m. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nl_langinfo and CODESET" >&5 $as_echo_n "checking for nl_langinfo and CODESET... " >&6; } if ${am_cv_langinfo_codeset+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { char* cs = nl_langinfo(CODESET); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_langinfo_codeset=yes else am_cv_langinfo_codeset=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_langinfo_codeset" >&5 $as_echo "$am_cv_langinfo_codeset" >&6; } if test $am_cv_langinfo_codeset = yes; then $as_echo "#define HAVE_LANGINFO_CODESET 1" >>confdefs.h fi #-------------------------------------------------------------------- # Check for -Wdeclaration-after-statement #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -Wdeclaration-after-statement" >&5 $as_echo_n "checking whether the compiler supports -Wdeclaration-after-statement... " >&6; } saved_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -Wdeclaration-after-statement" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : HAS_W_DECL_AFTER_STATEMENT=yes else HAS_W_DECL_AFTER_STATEMENT=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$saved_CFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAS_W_DECL_AFTER_STATEMENT" >&5 $as_echo "$HAS_W_DECL_AFTER_STATEMENT" >&6; } if test x"$HAS_W_DECL_AFTER_STATEMENT" = x"yes"; then WARN_FLAGS="-Wall -Wdeclaration-after-statement" else WARN_FLAGS=-Wall fi #-------------------------------------------------------------------- # Check if we should use an alternative gdomap port #-------------------------------------------------------------------- # Check whether --with-gdomap-port was given. if test "${with_gdomap_port+set}" = set; then : withval=$with_gdomap_port; gdomap_port="$withval" else gdomap_port="no" fi if test "$gdomap_port" = "no"; then GNUSTEP_GDOMAP_PORT_OVERRIDE="$gdomap_port" else GNUSTEP_GDOMAP_PORT_OVERRIDE="$gdomap_port" fi #-------------------------------------------------------------------- # Check if we should install gdomap as setuid #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we should install gdomap as setuid" >&5 $as_echo_n "checking if we should install gdomap as setuid... " >&6; } # Check whether --enable-setuid-gdomap was given. if test "${enable_setuid_gdomap+set}" = set; then : enableval=$enable_setuid_gdomap; ac_cv_setuid_gdomap=$enableval else ac_cv_setuid_gdomap="no" fi if test "$ac_cv_setuid_gdomap" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; }; GNUSTEP_INSTALL_GDOMAP_AS_SETUID="yes" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; }; GNUSTEP_INSTALL_GDOMAP_AS_SETUID="no" fi #-------------------------------------------------------------------- # Record the version #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the version of gnustep-base we are compiling" >&5 $as_echo_n "checking for the version of gnustep-base we are compiling... " >&6; } if test -f "Version"; then . ./Version fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $VERSION" >&5 $as_echo "$VERSION" >&6; } #-------------------------------------------------------------------- # Write the Makefiles #-------------------------------------------------------------------- ac_config_files="$ac_config_files config.mak base.make Headers/GNUstepBase/GSConfig.h" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by $as_me, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ config.status configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "Headers/GNUstepBase/config.h") CONFIG_HEADERS="$CONFIG_HEADERS Headers/GNUstepBase/config.h" ;; "config.mak") CONFIG_FILES="$CONFIG_FILES config.mak" ;; "base.make") CONFIG_FILES="$CONFIG_FILES base.make" ;; "Headers/GNUstepBase/GSConfig.h") CONFIG_FILES="$CONFIG_FILES Headers/GNUstepBase/GSConfig.h" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi gnustep-base-1.29.0/configure.ac000066400000000000000000004425331435650067400165130ustar00rootroot00000000000000# configure.ac for GNU Objective-C library # Process this file with autoconf to produce a configure script. # # Copyright (C) 1993,1994, 1995, 1996, 1997 Free Software Foundation, Inc. # # Written by: Andrew Kachites McCallum # Dept. of Computer Science, U. of Rochester, Rochester, NY 14627 # # This file is part of the GNU Objective-C library. # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public # License as published by the Free Software Foundation; either # version 2 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 # General Public License for more details. # # You should have received a copy of the GNU General Public # License along with this library; if not, write to the Free # Software Foundation, Inc., 51 Franklin Street, Fifth Floor, # Boston, MA 02111 USA # # DEPENDENCIES POLICY # # Generally the aim in the base library is to minimise dependencies on # external libraries which may not come as standard on all systems, and # you should not, as a rule, add such dependencies. # # However, in some cases there are large areas of functionality where it # would just be too much effort to implement things ourselves and it makes # sense to use external software to do the job. # # In such cases this configure.ac script should include options to allow # people to build with the dependency or to disable those parts of the # base library which require the external dependency and build without it. # The configure script should support a --disable-xxx option in such a case, # where 'xxx' is the name of the dependency. # # If a major dependency is NOT specifically disabled, the configuration # process must fail with an error message ... all builds of gnustep-base # should support all expected functionality unless the person configuring # and building is very certain they don't want it. # # Where a dependency is introduced this script should do this by setting # HAVE_XXX to 1 or 0 and calling AC_SUBST(XXX) to substitute the information # into the make files: # config.mak.in: used to build the base library itsself # base.make.in: the makefile fragment used to build software which uses base # These files then define GNUSTEP_BASE_HAVE_XXX to 1 or 0 so that the variable # may be used to control conditional compilation of particular files. # # In addition the values should be substituted into the header file # Headers/GNUstepBase/GSConfig.h.in so that it can define a # preprocessor constant of the form GS_USE_XXX to 1 or 0, providing a # standard mechanism for parts of a particular file to compile to make # use of the external code or not. # This file is included by all the base library source code, and may also # be included by code which uses the base library. # builtin(include, config/objc-con-autoload.m4)dnl builtin(include, config/objc-sys-dynamic.m4)dnl builtin(include, config/procfs-exe-link.m4)dnl builtin(include, config/procfs.m4)dnl builtin(include, config/pathxml.m4)dnl builtin(include, config/pathtls.m4)dnl builtin(include, config/codeset.m4)dnl builtin(include, config/addlibrarypath.m4)dnl builtin(include, config/pkg.m4)dnl AC_INIT AC_PREREQ([2.60]) AC_CONFIG_SRCDIR([Source/NSArray.m]) # If GNUSTEP_MAKEFILES is undefined, try to use gnustep-config to determine it. if test -z "$GNUSTEP_MAKEFILES"; then GNUSTEP_MAKEFILES=`gnustep-config --variable=GNUSTEP_MAKEFILES 2>&5` fi if test -z "$GNUSTEP_MAKEFILES"; then AC_MSG_ERROR([You must have the gnustep-make package installed and set up the GNUSTEP_MAKEFILES environment variable to contain the path to the makefiles directory before configuring!]) fi # If LIBRARY_COMBO is undefined, try to use gnustep-config to determine it. if test -z "$LIBRARY_COMBO"; then LIBRARY_COMBO=`gnustep-config --variable=LIBRARY_COMBO 2>&5` fi OBJC_RUNTIME_LIB=`echo $LIBRARY_COMBO | tr '-' ' ' | awk '{print $1}'` if test "$OBJC_RUNTIME_LIB" = "ng" -o "$OBJC_RUNTIME_LIB" = "apple"; then nonfragile=yes BASE_NONFRAGILE_ABI=1 else nonfragile=`gnustep-config --objc-flags | grep _NONFRAGILE_ABI 2>&5` if test -z "$nonfragile"; then nonfragile=no BASE_NONFRAGILE_ABI=0 else nonfragile=yes BASE_NONFRAGILE_ABI=1 fi fi AC_SUBST(BASE_NONFRAGILE_ABI) MAKECPPFLAGS=`gnustep-config --variable=CPPFLAGS` if test "$CPPFLAGS" = ""; then CPPFLAGS=$MAKECPPFLAGS export CPPFLAGS else if test "$CPPFLAGS" != "$MAKECPPFLAGS"; then AC_MSG_WARN([You are running configure with the preprocessor options ($CPPFLAGS) set to a different value from that used by gnustep-make ($MAKECPPFLAGS). To avoid conflicts/problems, reconfigure/reinstall gnustep-make to use CPPFLAGS=$CPPFLAGS or run the gnustep-base configure again with your CPPFLAGS environment variable set to $MAKECPPFLAGS]) fi fi MAKELDFLAGS=`gnustep-config --variable=LDFLAGS` if test "$LDFLAGS" = ""; then LDFLAGS=$MAKELDFLAGS export LDFLAGS else if test "$LDFLAGS" != "$MAKELDFLAGS"; then AC_MSG_WARN([You are running configure with the link options ($LDFLAGS) set to a different value from that used by gnustep-make ($MAKELDFLAGS). To avoid conflicts/problems, reconfigure/reinstall gnustep-make to use LDFLAGS=$LDFLAGS or run the gnustep-base configure again with your LDFLAGS environment variable set to $MAKELDFLAGS]) fi fi # We shouldn't be loading GNUstep.sh here. It would load in a lot of # variables which might get confused with the ones that will be used # at runtime. We will load it later once we have determined (and # saved) the runtime configuration. # This variable might get temporarily overwritten with the # GNUSTEP_MAKEFILES of the runtime configuration, make sure we keep # track of the original one. CURRENT_GNUSTEP_MAKEFILES is the one # that we use to locate the actual gnustep-make installation that # will build the software. CURRENT_GNUSTEP_MAKEFILES="$GNUSTEP_MAKEFILES" #-------------------------------------------------------------------- # Use config.guess, config.sub and install-sh provided by gnustep-make #-------------------------------------------------------------------- AC_CONFIG_AUX_DIR($CURRENT_GNUSTEP_MAKEFILES) #-------------------------------------------------------------------- # Use a .h file with #define's, instead of -D command-line switches #-------------------------------------------------------------------- AC_CONFIG_HEADER(Headers/GNUstepBase/config.h) #-------------------------------------------------------------------- # Determine the host, build, and target systems #-------------------------------------------------------------------- AC_CANONICAL_TARGET([]) #-------------------------------------------------------------------- # Setup cross-compilation-information #-------------------------------------------------------------------- AC_ARG_WITH(cross-compilation-info, [ --with-cross-compilation-info=PATH Specify path to the configuration file that contains information for the configure script in case of cross compilation. This information replaces those obtained from running programmes during the configuration phase.], cross_result="$withval", cross_result="no" ) CROSS_CONFIG="./cross.config" if test "$cross_result" != "no" then if test -f "$cross_result" && test -r "$cross_result" then CROSS_CONFIG="$cross_result" else AC_MSG_ERROR(["Could not load cross-compilation variables from $cross_result"]) fi fi # import information from the cross-config. . "$CROSS_CONFIG" #--------------------------------------------------------------------- # Location of the GNUstep.conf config file (--with-config-file) #--------------------------------------------------------------------- AC_MSG_CHECKING([for GNUstep configuration file to use at runtime]) # This requires gnustep-make > 1.13.0 to work. For gnustep-make = # 1.13.0 we would have to parse # $CURRENT_GNUSTEP_MAKEFILES/$obj_dir/config.make, but $obj_dir is not defined # yet at this stage in config, not sure if it's worth trying to make # it work. For gnustep-make < 1.13.0 we would have to parse # $CURRENT_GNUSTEP_MAKEFILES/config.make. GNUSTEP_MAKE_CONFIG=`(grep '^GNUSTEP_CONFIG_FILE *=' $CURRENT_GNUSTEP_MAKEFILES/config-noarch.make | sed -e 's/GNUSTEP_CONFIG_FILE *= *\(.*\)/\1/') 2>&5` # So, for backwards compatiblity, we try the plain config.make too. # This should work with gnustep-make < 1.13.0, and with 1.13.0 too if # they haven't deleted the file. if test "$GNUSTEP_MAKE_CONFIG" = ""; then GNUSTEP_MAKE_CONFIG=`(grep '^GNUSTEP_CONFIG_FILE *=' $CURRENT_GNUSTEP_MAKEFILES/config.make | sed -e 's/GNUSTEP_CONFIG_FILE *= *\(.*\)/\1/') 2>&5` fi AC_ARG_WITH(config-file, [ --with-config-file=PATH Specify path to the GNUstep config file. This is the location to be used by the base library to locate path information at application or tool runtime. This file might not even exist now; it is not read at configure time. The base library will only read it at runtime. If unspecified, this uses the same value as the GNUstep make package on unix-like systems, but uses ./GNUstep.conf on mingw so that it is relative to the location of the base library DLL. If a leading './' is specified, the path is taken to be relative to the base library linked runtime, not all operating systems can support this, so on some platforms you may need to specify the location of the config file using the GNUSTEP_CONFIG_FILE environment variable at runtime. If a trailing '/' is specified, the path is used for locating domains but no GNUstep config file is read at runtime.], result="$withval", result="no" ) if test "$result" != "no" then GNUSTEP_TARGET_CONFIG_FILE="$result" fi if test x"$GNUSTEP_TARGET_CONFIG_FILE" = x""; then case "$target_os" in mingw*|windows) GNUSTEP_TARGET_CONFIG_FILE=./GNUstep.conf ;; *) GNUSTEP_TARGET_CONFIG_FILE="$GNUSTEP_MAKE_CONFIG" ;; esac fi AC_MSG_RESULT($GNUSTEP_TARGET_CONFIG_FILE) #----------------------------------------------------------------- # Whether the GNUstep.conf file path can be set in the environment # By default this is enabled on unix, but disabled on mswindows # since the normal setup on mswindows is to have the config file # located with the base library dll for runtime configuration and # use the environment variable to control the developer config file # location (used by gnustep-make when building). #----------------------------------------------------------------- case "$target_os" in mingw*|windows) enable_env_config=no;; *) enable_env_config=yes;; esac AC_MSG_CHECKING([whether the GNUstep.conf file path can be set in the environment]) AC_ARG_ENABLE(environment-config-file, [ --disable-environment-config-file Disables the use of the GNUSTEP_CONFIG_FILE environment variable to specify/override the location of the GNUstep config file at runtime. This option is occasionally useful to disable the environment variable for sites which wish to 'lock down' users to always work with a specific system-wide configuration. On unix-like systems the default is for this option to be enabled. It is disabled by default on windows systems so that the base library will not use a config file intended for the gnustep-make system (and containing unix-style paths which cannot be used by windows apps). Normally this should be left at its default setting.], ac_cv_environment_config_file=$enableval, ac_cv_environment_config_file=$enable_env_config) if test "$ac_cv_environment_config_file" = "yes"; then AC_DEFINE(OPTION_NO_ENVIRONMENT, 0, [Enable GNUSTEP_CONFIG_FILE environment variable]) AC_MSG_RESULT([yes]) else AC_DEFINE(OPTION_NO_ENVIRONMENT, 1, [Disable GNUSTEP_CONFIG_FILE environment variable]) AC_MSG_RESULT([no: disabled from the command-line]) fi #-------------------------------------------------------------------- # We are now trying to determine the default GNUstep paths to be # used at runtime. So all GNUSTEP_xxx variables from now on are to be # considered as 'runtime' ones. They refer to paths that might not # make any sense now, but might make sense once gnustep-base is # installed in its final location. #--------------------------------------------------------------------- # # Set 'standard' defaults for values from configuration file. # case "$target_os" in *) GNUSTEP_SYSTEM_ROOT=/usr/GNUstep/System GNUSTEP_LOCAL_ROOT=/usr/GNUstep/Local GNUSTEP_NETWORK_ROOT=/usr/GNUstep/Local GNUSTEP_USER_DEFAULTS_DIR=GNUstep/Defaults GNUSTEP_USER_CONFIG_FILE=.GNUstep.conf ;; esac #--------------------------------------------------------------------- # Now read/import the existing configuration file, if any #--------------------------------------------------------------------- # Reading/importing an existing configuration file is good as it means # the built-in default paths in the code will match those of your # installation (or of the config file you specify). # It can be annoying in certain cases though; this option lets you # turn it off. AC_MSG_CHECKING([if we should import an existing configuration file now]) AC_ARG_ENABLE(importing-config-file, [ --disable-importing-config-file Disable importing of an existing GNUstep config file and use inbuilt defaults instead.], ac_cv_importing_config_file=$enableval, ac_cv_importing_config_file="yes") if test "$ac_cv_importing_config_file" = "no"; then AC_MSG_RESULT([no: disabled from the command-line]) else AC_MSG_RESULT([yes]) fi if test "$ac_cv_importing_config_file" = "yes" ; then AC_MSG_CHECKING([for default GNUstep configuration file to use]) AC_ARG_WITH(default-config, [ --with-default-config=PATH Specify path to a GNUstep config file to be imported at configure time (now) and used to provide default values for the base library to use at runtime if no GNUstep config file is found at runtime. If this is not specified then the path from the gnustep-make package is used.], result="$withval", result="no" ) if test "$result" != "no" then GNUSTEP_DEFAULT_CONFIG="$result" fi if test "$GNUSTEP_DEFAULT_CONFIG" = ""; then # No file to import has been specified. We need to read the paths # from somewhere though! GNUstep.sh might not have been sourced, # so at this stage we have no knowledge of what the paths must be. # The only place that we can read them from is the gnustep-make # GNUstep.conf file. # So we fall back to useing the make settings for the built-in ones. # However, on mingw these will be msys style paths, and we don't # want that ... so later on we convert these to portable relative # paths based on the directory in which the base library will be # installed. GNUSTEP_DEFAULT_CONFIG="$GNUSTEP_MAKE_CONFIG" fi AC_MSG_RESULT($GNUSTEP_DEFAULT_CONFIG) # # Only try importing if the default config file has been specified. # if test "$GNUSTEP_DEFAULT_CONFIG" != ""; then # Make sure we have a slash in the path so that '.' will source it case $GNUSTEP_DEFAULT_CONFIG in /*) ;; *) GNUSTEP_DEFAULT_CONFIG="./$GNUSTEP_DEFAULT_CONFIG" ;; esac # # Use the default config file to override standard values. # if test ! -f "$GNUSTEP_DEFAULT_CONFIG"; then AC_MSG_RESULT([fail: file "$GNUSTEP_DEFAULT_CONFIG" does not exist]) # Ohoh ... things are not going well. We are asked to import # a config file that doesn't exist. So all paths might be unset # and who knows what we'll end up hardcoding into gnustep-base. # It looks like we need to make sure the user knows what they # are doing, as there is a high chance they don't and might end # up with a confused/non-working system. As far as we know, the # system might be already screwed. If they don't want to import # a config file (eg, they don't have one and they don't care about # the hardcoded paths) they should just say so. ;-) AC_MSG_ERROR([Please run configure again with the --disable-importing-config-file option or specifying an alternative file using the --with-default-config= option]) exit 1 else AC_MSG_RESULT([trying to import "$GNUSTEP_DEFAULT_CONFIG"]) if test -r "$GNUSTEP_DEFAULT_CONFIG" then AC_MSG_NOTICE([If this fails, please run configure again with the --disable-importing-config-file option or specifying an alternative file using the --with-default-config= option]) . "$GNUSTEP_DEFAULT_CONFIG" else AC_MSG_RESULT([fail: file "$GNUSTEP_DEFAULT_CONFIG" is not readable]) AC_MSG_ERROR([Unable to import configuration file at $GNUSTEP_DEFAULT_CONFIG. Please run configure again with a revised/corrected --with-default-config= option or with --disable-importing-config-file.]) exit 1 fi fi fi fi # Now we have the problem of what to do if some of the paths were not # set by GNUstep.conf (eg, old gnustep-make), or if no config file was # read, or if the config file was corrupt. We decide that the most # likely case is an old gnustep-make, so by default we configure the # other paths basing on GNUSTEP_*_ROOT. # TODO/FIXME: We should really have better checks once the situation # has stabilized. This is a reasonable hack for now. if test x"$GNUSTEP_MAKEFILES" = x""; then GNUSTEP_MAKEFILES=$GNUSTEP_SYSTEM_ROOT/Library/Makefiles; fi if test x"$GNUSTEP_SYSTEM_USERS_DIR" = x""; then GNUSTEP_SYSTEM_USERS_DIR=/home; fi if test x"$GNUSTEP_NETWORK_USERS_DIR" = x""; then GNUSTEP_NETWORK_USERS_DIR=/home; fi if test x"$GNUSTEP_LOCAL_USERS_DIR" = x""; then GNUSTEP_LOCAL_USERS_DIR=/home; fi if test x"$GNUSTEP_SYSTEM_APPS" = x""; then GNUSTEP_SYSTEM_APPS=$GNUSTEP_SYSTEM_ROOT/Applications; fi if test x"$GNUSTEP_SYSTEM_ADMIN_APPS" = x""; then GNUSTEP_SYSTEM_ADMIN_APPS=$GNUSTEP_SYSTEM_ROOT/Applications/Admin; fi if test x"$GNUSTEP_SYSTEM_WEB_APPS" = x""; then GNUSTEP_SYSTEM_WEB_APPS=$GNUSTEP_SYSTEM_ROOT/WebApplications; fi if test x"$GNUSTEP_SYSTEM_TOOLS" = x""; then GNUSTEP_SYSTEM_TOOLS=$GNUSTEP_SYSTEM_ROOT/Tools; fi if test x"$GNUSTEP_SYSTEM_ADMIN_TOOLS" = x""; then GNUSTEP_SYSTEM_ADMIN_TOOLS=$GNUSTEP_SYSTEM_ROOT/Tools/Admin; fi if test x"$GNUSTEP_SYSTEM_LIBRARY" = x""; then GNUSTEP_SYSTEM_LIBRARY=$GNUSTEP_SYSTEM_ROOT/Library; fi if test x"$GNUSTEP_SYSTEM_LIBRARIES" = x""; then GNUSTEP_SYSTEM_LIBRARIES=$GNUSTEP_SYSTEM_LIBRARY/Libraries; fi if test x"$GNUSTEP_SYSTEM_HEADERS" = x""; then GNUSTEP_SYSTEM_HEADERS=$GNUSTEP_SYSTEM_LIBRARY/Headers; fi if test x"$GNUSTEP_SYSTEM_DOC" = x""; then GNUSTEP_SYSTEM_DOC=$GNUSTEP_SYSTEM_LIBRARY/Documentation; fi if test x"$GNUSTEP_SYSTEM_DOC_MAN" = x""; then GNUSTEP_SYSTEM_DOC_MAN=$GNUSTEP_SYSTEM_LIBRARY/Documentation/man; fi if test x"$GNUSTEP_SYSTEM_DOC_INFO" = x""; then GNUSTEP_SYSTEM_DOC_INFO=$GNUSTEP_SYSTEM_LIBRARY/Documentation/info; fi if test x"$GNUSTEP_NETWORK_APPS" = x""; then GNUSTEP_NETWORK_APPS=$GNUSTEP_NETWORK_ROOT/Applications; fi if test x"$GNUSTEP_NETWORK_ADMIN_APPS" = x""; then GNUSTEP_NETWORK_ADMIN_APPS=$GNUSTEP_NETWORK_ROOT/Applications/Admin; fi if test x"$GNUSTEP_NETWORK_WEB_APPS" = x""; then GNUSTEP_NETWORK_APPS=$GNUSTEP_NETWORK_ROOT/WebApplications; fi if test x"$GNUSTEP_NETWORK_TOOLS" = x""; then GNUSTEP_NETWORK_TOOLS=$GNUSTEP_NETWORK_ROOT/Tools; fi if test x"$GNUSTEP_NETWORK_ADMIN_TOOLS" = x""; then GNUSTEP_NETWORK_ADMIN_TOOLS=$GNUSTEP_NETWORK_ROOT/Tools/Admin; fi if test x"$GNUSTEP_NETWORK_LIBRARY" = x""; then GNUSTEP_NETWORK_LIBRARY=$GNUSTEP_NETWORK_ROOT/Library; fi if test x"$GNUSTEP_NETWORK_LIBRARIES" = x""; then GNUSTEP_NETWORK_LIBRARIES=$GNUSTEP_NETWORK_LIBRARY/Libraries; fi if test x"$GNUSTEP_NETWORK_HEADERS" = x""; then GNUSTEP_NETWORK_HEADERS=$GNUSTEP_NETWORK_LIBRARY/Headers; fi if test x"$GNUSTEP_NETWORK_DOC" = x""; then GNUSTEP_NETWORK_DOC=$GNUSTEP_NETWORK_LIBRARY/Documentation; fi if test x"$GNUSTEP_NETWORK_DOC_MAN" = x""; then GNUSTEP_NETWORK_DOC_MAN=$GNUSTEP_NETWORK_LIBRARY/Documentation/man; fi if test x"$GNUSTEP_NETWORK_DOC_INFO" = x""; then GNUSTEP_NETWORK_DOC_INFO=$GNUSTEP_NETWORK_LIBRARY/Documentation/info; fi if test x"$GNUSTEP_LOCAL_APPS" = x""; then GNUSTEP_LOCAL_APPS=$GNUSTEP_LOCAL_ROOT/Applications; fi if test x"$GNUSTEP_LOCAL_ADMIN_APPS" = x""; then GNUSTEP_LOCAL_ADMIN_APPS=$GNUSTEP_LOCAL_ROOT/Applications/Admin; fi if test x"$GNUSTEP_LOCAL_WEB_APPS" = x""; then GNUSTEP_LOCAL_APPS=$GNUSTEP_LOCAL_ROOT/WebApplications; fi if test x"$GNUSTEP_LOCAL_TOOLS" = x""; then GNUSTEP_LOCAL_TOOLS=$GNUSTEP_LOCAL_ROOT/Tools; fi if test x"$GNUSTEP_LOCAL_ADMIN_TOOLS" = x""; then GNUSTEP_LOCAL_ADMIN_TOOLS=$GNUSTEP_LOCAL_ROOT/Tools/Admin; fi if test x"$GNUSTEP_LOCAL_LIBRARY" = x""; then GNUSTEP_LOCAL_LIBRARY=$GNUSTEP_LOCAL_ROOT/Library; fi if test x"$GNUSTEP_LOCAL_LIBRARIES" = x""; then GNUSTEP_LOCAL_LIBRARIES=$GNUSTEP_LOCAL_LIBRARY/Libraries; fi if test x"$GNUSTEP_LOCAL_HEADERS" = x""; then GNUSTEP_LOCAL_HEADERS=$GNUSTEP_LOCAL_LIBRARY/Headers; fi if test x"$GNUSTEP_LOCAL_DOC" = x""; then GNUSTEP_LOCAL_DOC=$GNUSTEP_LOCAL_LIBRARY/Documentation; fi if test x"$GNUSTEP_LOCAL_DOC_MAN" = x""; then GNUSTEP_LOCAL_DOC_MAN=$GNUSTEP_LOCAL_LIBRARY/Documentation/man; fi if test x"$GNUSTEP_LOCAL_DOC_INFO" = x""; then GNUSTEP_LOCAL_DOC_INFO=$GNUSTEP_LOCAL_LIBRARY/Documentation/info; fi if test x"$GNUSTEP_USER_DIR_APPS" = x""; then GNUSTEP_USER_DIR_APPS=$GNUSTEP_USER_DIR/Applications; fi if test x"$GNUSTEP_USER_DIR_ADMIN_APPS" = x""; then GNUSTEP_USER_DIR_ADMIN_APPS=$GNUSTEP_USER_DIR/Applications/Admin; fi if test x"$GNUSTEP_USER_DIR_WEB_APPS" = x""; then GNUSTEP_USER_DIR_APPS=$GNUSTEP_USER_DIR/WebApplications; fi if test x"$GNUSTEP_USER_DIR_TOOLS" = x""; then GNUSTEP_USER_DIR_TOOLS=$GNUSTEP_USER_DIR/Tools; fi if test x"$GNUSTEP_USER_DIR_ADMIN_TOOLS" = x""; then GNUSTEP_USER_DIR_ADMIN_TOOLS=$GNUSTEP_USER_DIR/Tools/Admin; fi if test x"$GNUSTEP_USER_DIR_LIBRARY" = x""; then GNUSTEP_USER_DIR_LIBRARY=$GNUSTEP_USER_DIR/Library; fi if test x"$GNUSTEP_USER_DIR_LIBRARIES" = x""; then GNUSTEP_USER_DIR_LIBRARIES=$GNUSTEP_USER_DIR/Libraries; fi if test x"$GNUSTEP_USER_DIR_HEADERS" = x""; then GNUSTEP_USER_DIR_HEADERS=$GNUSTEP_USER_DIR/Headers; fi if test x"$GNUSTEP_USER_DIR_DOC" = x""; then GNUSTEP_USER_DIR_DOC=$GNUSTEP_USER_DIR/Documentation; fi if test x"$GNUSTEP_USER_DIR_DOC_MAN" = x""; then GNUSTEP_USER_DIR_DOC_MAN=$GNUSTEP_USER_DIR/Documentation/man; fi if test x"$GNUSTEP_USER_DIR_DOC_INFO" = x""; then GNUSTEP_USER_DIR_DOC_INFO=$GNUSTEP_USER_DIR/Documentation/info; fi AC_MSG_CHECKING([for GNUstep-base installation domain]) AC_ARG_WITH(installation-domain, [ --with-installation-domain=DOMAIN Specify the domain (SYSTEM, LOCAL, NETWORK or USER) into which gnustep-base will be installed. Whenever relative paths are hardcoded into gnustep-base (at the moment, this happens only on MinGW) this option must be used and must match the domain where you will be installing gnustep-base. If this is not specified, the output of gnustep-config --installation-domain-for=gnustep-base (which should normally be LOCAL) is used.], result="$withval", result="no" ) if test "$result" = "no" then # Check if gnustep-config supports the option # --installation-domain-for, and use it if available. That option # will automatically use the shell variable GNUSTEP_INSTALLATION_DOMAIN or # the installation-domains.conf files (or the LOCAL default) as appropriate. # Otherwise, if that option is not available just fall back to # using GNUSTEP_INSTALLATION_DOMAIN or (if that was not defiend) LOCAL. if (gnustep-config --help | grep installation-domain) >&5 2>&5 then result=`gnustep-config --installation-domain-for=gnustep-base 2>&5` else AC_MSG_WARN([The 'gnustep-config' script was not found or out of date.]) result=$GNUSTEP_INSTALLATION_DOMAIN if test "$result" = "" then # This case was added on December 2008 and is only for backwards # compatibility with older versions of gnustep-make. result=LOCAL fi fi fi case "$result" in SYSTEM) AC_MSG_RESULT([SYSTEM]) GNUSTEP_BASE_PATH="$GNUSTEP_SYSTEM_TOOLS";; LOCAL) AC_MSG_RESULT([LOCAL]) GNUSTEP_BASE_PATH="$GNUSTEP_LOCAL_TOOLS";; NETWORK) AC_MSG_RESULT([NETWORK]) GNUSTEP_BASE_PATH="$GNUSTEP_NETWORK_TOOLS";; USER) AC_MSG_RESULT([USER]) GNUSTEP_BASE_PATH="$GNUSTEP_USER_TOOLS";; *) AC_MSG_ERROR([Unknown installation domain '$result' (it should be SYSTEM, LOCAL, NETWORK or USER). Please run configure again with the option --with-installation-domain=LOCAL (or whatever domain you want to install into).]) exit 1;; esac # We store GNUSTEP_BASE_DOMAIN in config.mak so that we can check # at runtime and make sure it is consistent with the # GNUSTEP_INSTALLATION_DOMAIN that is used at runtime. GNUSTEP_BASE_DOMAIN=$result AC_SUBST(GNUSTEP_BASE_DOMAIN) # # If we are on mingw, we now want to convert the paths to relative # paths (relative to libgnustep-base.dll). # case "$target_os" in mingw*|windows) # TODO: Improve this hack. # According to Wikipedia, this is the default for Windows 2000, # Windows XP and Windows Server 2003. For Windows Vista this will # change to C:\Users. The directory name needs to be localized though # (and the disk may need changing as well ?). GNUSTEP_SYSTEM_USERS_DIR="C:\Documents and Settings" GNUSTEP_NETWORK_USERS_DIR="C:\Documents and Settings" GNUSTEP_LOCAL_USERS_DIR="C:\Documents and Settings" # TODO: It would be nice to use the 'short' output of # relative_path.sh, but older versions of relative_path.sh # did not support specifying the type of output and # would abort if they were given more than 2 parameters, # so we can not use the 'short' option if we want gnustep-base # to work with older versions of gnustep-make. # Once everyone has upgraded to gnustep-make >= 2.0.5 (I'd say # two years after it has been released ?), we could switch to the # 'short' output though. GNUSTEP_SYSTEM_APPS=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_SYSTEM_APPS` GNUSTEP_SYSTEM_ADMIN_APPS=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_SYSTEM_ADMIN_APPS` GNUSTEP_SYSTEM_WEB_APPS=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_SYSTEM_WEB_APPS` GNUSTEP_SYSTEM_TOOLS=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_SYSTEM_TOOLS` GNUSTEP_SYSTEM_ADMIN_TOOLS=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_SYSTEM_ADMIN_TOOLS` GNUSTEP_SYSTEM_LIBRARY=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_SYSTEM_LIBRARY` GNUSTEP_SYSTEM_LIBRARIES=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_SYSTEM_LIBRARIES` GNUSTEP_SYSTEM_HEADERS=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_SYSTEM_HEADERS` GNUSTEP_SYSTEM_DOC=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_SYSTEM_DOC` GNUSTEP_SYSTEM_DOC_MAN=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_SYSTEM_DOC_MAN` GNUSTEP_SYSTEM_DOC_INFO=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_SYSTEM_DOC_INFO` GNUSTEP_NETWORK_APPS=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_NETWORK_APPS` GNUSTEP_NETWORK_ADMIN_APPS=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_NETWORK_ADMIN_APPS` GNUSTEP_NETWORK_WEB_APPS=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_NETWORK_WEB_APPS` GNUSTEP_NETWORK_TOOLS=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_NETWORK_TOOLS` GNUSTEP_NETWORK_ADMIN_TOOLS=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_NETWORK_ADMIN_TOOLS` GNUSTEP_NETWORK_LIBRARY=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_NETWORK_LIBRARY` GNUSTEP_NETWORK_LIBRARIES=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_NETWORK_LIBRARIES` GNUSTEP_NETWORK_HEADERS=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_NETWORK_HEADERS` GNUSTEP_NETWORK_DOC=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_NETWORK_DOC` GNUSTEP_NETWORK_DOC_MAN=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_NETWORK_DOC_MAN` GNUSTEP_NETWORK_DOC_INFO=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_NETWORK_DOC_INFO` GNUSTEP_LOCAL_APPS=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_LOCAL_APPS` GNUSTEP_LOCAL_ADMIN_APPS=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_LOCAL_ADMIN_APPS` GNUSTEP_LOCAL_WEB_APPS=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_LOCAL_WEB_APPS` GNUSTEP_LOCAL_TOOLS=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_LOCAL_TOOLS` GNUSTEP_LOCAL_ADMIN_TOOLS=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_LOCAL_ADMIN_TOOLS` GNUSTEP_LOCAL_LIBRARY=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_LOCAL_LIBRARY` GNUSTEP_LOCAL_LIBRARIES=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_LOCAL_LIBRARIES` GNUSTEP_LOCAL_HEADERS=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_LOCAL_HEADERS` GNUSTEP_LOCAL_DOC=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_LOCAL_DOC` GNUSTEP_LOCAL_DOC_MAN=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_LOCAL_DOC_MAN` GNUSTEP_LOCAL_DOC_INFO=`$GNUSTEP_MAKEFILES/relative_path.sh $GNUSTEP_BASE_PATH $GNUSTEP_LOCAL_DOC_INFO` # It would be nice to now store this stuff into a ./GNUstep.conf file # installed with gnustep-base.dll. This would clarify. ;; esac GNUSTEP_BASE_RELATIVE_PATHS=no # Now, check if any of the paths is a relative path. for path in \ "$GNUSTEP_SYSTEM_APPS" "$GNUSTEP_SYSTEM_ADMIN_APPS" "$GNUSTEP_SYSTEM_WEB_APPS" \ "$GNUSTEP_SYSTEM_TOOLS" "$GNUSTEP_SYSTEM_ADMIN_TOOLS" \ "$GNUSTEP_SYSTEM_LIBRARY" "$GNUSTEP_SYSTEM_LIBRARIES" "$GNUSTEP_SYSTEM_HEADERS" \ "$GNUSTEP_SYSTEM_DOC" "$GNUSTEP_SYSTEM_DOC_MAN" "$GNUSTEP_SYSTEM_DOC_INFO" \ "$GNUSTEP_NETWORK_APPS" "$GNUSTEP_NETWORK_ADMIN_APPS" "$GNUSTEP_NETWORK_WEB_APPS" \ "$GNUSTEP_NETWORK_TOOLS" "$GNUSTEP_NETWORK_ADMIN_TOOLS" \ "$GNUSTEP_NETWORK_LIBRARY" "$GNUSTEP_NETWORK_LIBRARIES" "$GNUSTEP_NETWORK_HEADERS" \ "$GNUSTEP_NETWORK_DOC" "$GNUSTEP_NETWORK_DOC_MAN" "$GNUSTEP_NETWORK_DOC_INFO" \ "$GNUSTEP_LOCAL_APPS" "$GNUSTEP_LOCAL_ADMIN_APPS" "$GNUSTEP_LOCAL_WEB_APPS" \ "$GNUSTEP_LOCAL_TOOLS" "$GNUSTEP_LOCAL_ADMIN_TOOLS" \ "$GNUSTEP_LOCAL_LIBRARY" "$GNUSTEP_LOCAL_LIBRARIES" "$GNUSTEP_LOCAL_HEADERS" \ "$GNUSTEP_LOCAL_DOC" "$GNUSTEP_LOCAL_DOC_MAN" "$GNUSTEP_LOCAL_DOC_INFO"; do case "$path" in ./*) GNUSTEP_BASE_RELATIVE_PATHS=yes ;; ../*) GNUSTEP_BASE_RELATIVE_PATHS=yes ;; esac done AC_MSG_CHECKING([if we are hardcoding any relative paths in gnustep-base]) AC_MSG_RESULT($GNUSTEP_BASE_RELATIVE_PATHS) AC_SUBST(GNUSTEP_BASE_RELATIVE_PATHS) # # Now, we want to print out the paths that we're going to hardcode # into gnustep-base. This is to help users in finding # misconfigurations. # AC_MSG_NOTICE([We store the following filesystem layout into gnustep-base, to be used when no config file is found]) AC_MSG_CHECKING([for Makefiles directory]) AC_MSG_RESULT($GNUSTEP_MAKEFILES) AC_MSG_CHECKING([for user defaults directory]) AC_MSG_RESULT($GNUSTEP_USER_DEFAULTS_DIR) AC_MSG_CHECKING([for user config file]) AC_MSG_RESULT($GNUSTEP_USER_CONFIG_FILE) AC_MSG_CHECKING([for System Applications directory]) AC_MSG_RESULT($GNUSTEP_SYSTEM_APPS) AC_MSG_CHECKING([for System Admin Applications directory]) AC_MSG_RESULT($GNUSTEP_SYSTEM_ADMIN_APPS) AC_MSG_CHECKING([for System Web Applications directory]) AC_MSG_RESULT($GNUSTEP_SYSTEM_WEB_APPS) AC_MSG_CHECKING([for System Tools directory]) AC_MSG_RESULT($GNUSTEP_SYSTEM_TOOLS) AC_MSG_CHECKING([for System Admin Tools directory]) AC_MSG_RESULT($GNUSTEP_SYSTEM_ADMIN_TOOLS) AC_MSG_CHECKING([for System Library directory]) AC_MSG_RESULT($GNUSTEP_SYSTEM_LIBRARY) AC_MSG_CHECKING([for System Libraries directory]) AC_MSG_RESULT($GNUSTEP_SYSTEM_LIBRARIES) AC_MSG_CHECKING([for System Headers directory]) AC_MSG_RESULT($GNUSTEP_SYSTEM_HEADERS) AC_MSG_CHECKING([for System Documentation directory]) AC_MSG_RESULT($GNUSTEP_SYSTEM_DOC) AC_MSG_CHECKING([for System Info Documentation directory]) AC_MSG_RESULT($GNUSTEP_SYSTEM_DOC_INFO) AC_MSG_CHECKING([for System Man Documentation directory]) AC_MSG_RESULT($GNUSTEP_SYSTEM_DOC_MAN) AC_MSG_CHECKING([for Network Applications directory]) AC_MSG_RESULT($GNUSTEP_NETWORK_APPS) AC_MSG_CHECKING([for Network Admin Applications directory]) AC_MSG_RESULT($GNUSTEP_NETWORK_ADMIN_APPS) AC_MSG_CHECKING([for Network Web Applications directory]) AC_MSG_RESULT($GNUSTEP_NETWORK_WEB_APPS) AC_MSG_CHECKING([for Network Tools directory]) AC_MSG_RESULT($GNUSTEP_NETWORK_TOOLS) AC_MSG_CHECKING([for Network Admin Tools directory]) AC_MSG_RESULT($GNUSTEP_NETWORK_ADMIN_TOOLS) AC_MSG_CHECKING([for Network Library directory]) AC_MSG_RESULT($GNUSTEP_NETWORK_LIBRARY) AC_MSG_CHECKING([for Network Libraries directory]) AC_MSG_RESULT($GNUSTEP_NETWORK_LIBRARIES) AC_MSG_CHECKING([for Network Headers directory]) AC_MSG_RESULT($GNUSTEP_NETWORK_HEADERS) AC_MSG_CHECKING([for Network Documentation directory]) AC_MSG_RESULT($GNUSTEP_NETWORK_DOC) AC_MSG_CHECKING([for Network Info Documentation directory]) AC_MSG_RESULT($GNUSTEP_NETWORK_DOC_INFO) AC_MSG_CHECKING([for Network Man Documentation directory]) AC_MSG_RESULT($GNUSTEP_NETWORK_DOC_MAN) AC_MSG_CHECKING([for Local Applications directory]) AC_MSG_RESULT($GNUSTEP_LOCAL_APPS) AC_MSG_CHECKING([for Local Admin Applications directory]) AC_MSG_RESULT($GNUSTEP_LOCAL_ADMIN_APPS) AC_MSG_CHECKING([for Local Web Applications directory]) AC_MSG_RESULT($GNUSTEP_LOCAL_WEB_APPS) AC_MSG_CHECKING([for Local Tools directory]) AC_MSG_RESULT($GNUSTEP_LOCAL_TOOLS) AC_MSG_CHECKING([for Local Admin Tools directory]) AC_MSG_RESULT($GNUSTEP_LOCAL_ADMIN_TOOLS) AC_MSG_CHECKING([for Local Library directory]) AC_MSG_RESULT($GNUSTEP_LOCAL_LIBRARY) AC_MSG_CHECKING([for Local Libraries directory]) AC_MSG_RESULT($GNUSTEP_LOCAL_LIBRARIES) AC_MSG_CHECKING([for Local Headers directory]) AC_MSG_RESULT($GNUSTEP_LOCAL_HEADERS) AC_MSG_CHECKING([for Local Documentation directory]) AC_MSG_RESULT($GNUSTEP_LOCAL_DOC) AC_MSG_CHECKING([for Local Info Documentation directory]) AC_MSG_RESULT($GNUSTEP_LOCAL_DOC_INFO) AC_MSG_CHECKING([for Local Man Documentation directory]) AC_MSG_RESULT($GNUSTEP_LOCAL_DOC_MAN) AC_MSG_CHECKING([for User Applications directory]) AC_MSG_RESULT($GNUSTEP_USER_DIR_APPS) AC_MSG_CHECKING([for User Admin Applications directory]) AC_MSG_RESULT($GNUSTEP_USER_DIR_ADMIN_APPS) AC_MSG_CHECKING([for User Web Applications directory]) AC_MSG_RESULT($GNUSTEP_USER_DIR_WEB_APPS) AC_MSG_CHECKING([for User Tools directory]) AC_MSG_RESULT($GNUSTEP_USER_DIR_TOOLS) AC_MSG_CHECKING([for User Admin Tools directory]) AC_MSG_RESULT($GNUSTEP_USER_DIR_ADMIN_TOOLS) AC_MSG_CHECKING([for User Library directory]) AC_MSG_RESULT($GNUSTEP_USER_DIR_LIBRARY) AC_MSG_CHECKING([for User Libraries directory]) AC_MSG_RESULT($GNUSTEP_USER_DIR_LIBRARIES) AC_MSG_CHECKING([for User Headers directory]) AC_MSG_RESULT($GNUSTEP_USER_DIR_HEADERS) AC_MSG_CHECKING([for User Documentation directory]) AC_MSG_RESULT($GNUSTEP_USER_DIR_DOC) AC_MSG_CHECKING([for User Info Documentation directory]) AC_MSG_RESULT($GNUSTEP_USER_DIR_DOC_INFO) AC_MSG_CHECKING([for User Man Documentation directory]) AC_MSG_RESULT($GNUSTEP_USER_DIR_DOC_MAN) AC_MSG_CHECKING([for System User directory]) AC_MSG_RESULT($GNUSTEP_SYSTEM_USERS_DIR) AC_MSG_CHECKING([for Network User directory]) AC_MSG_RESULT($GNUSTEP_NETWORK_USERS_DIR) AC_MSG_CHECKING([for Local User directory]) AC_MSG_RESULT($GNUSTEP_LOCAL_USERS_DIR) # # Set the default configuration file values in config.h to be hard-coded # into NSPathUtilities.m # GNUSTEP_MAKEFILES=`echo $GNUSTEP_MAKEFILES|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_MAKEFILES, "$GNUSTEP_MAKEFILES", [Built in default value for GNUstep Makefiles]) GNUSTEP_USER_DEFAULTS_DIR=`echo $GNUSTEP_USER_DEFAULTS_DIR|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_USER_DEFAULTS_DIR, "$GNUSTEP_USER_DEFAULTS_DIR", [Built in default value for GNUstep user defaults directory]) GNUSTEP_USER_CONFIG_FILE=`echo $GNUSTEP_USER_CONFIG_FILE|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_USER_CONFIG_FILE, "$GNUSTEP_USER_CONFIG_FILE", [Built in default value for GNUstep user config file]) GNUSTEP_TARGET_CONFIG_FILE=`echo $GNUSTEP_TARGET_CONFIG_FILE|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_CONFIG_FILE, "$GNUSTEP_TARGET_CONFIG_FILE", [Built in default value for GNUstep config file]) # # SYSTEM domain paths # GNUSTEP_SYSTEM_APPS=`echo $GNUSTEP_SYSTEM_APPS|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_SYSTEM_APPS, "$GNUSTEP_SYSTEM_APPS", [Built in default value for GNUstep system apps]) GNUSTEP_SYSTEM_ADMIN_APPS=`echo $GNUSTEP_SYSTEM_ADMIN_APPS|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_SYSTEM_ADMIN_APPS, "$GNUSTEP_SYSTEM_ADMIN_APPS", [Built in default value for GNUstep system apps]) GNUSTEP_SYSTEM_WEB_APPS=`echo $GNUSTEP_SYSTEM_WEB_APPS|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_SYSTEM_WEB_APPS, "$GNUSTEP_SYSTEM_WEB_APPS", [Built in default value for GNUstep web apps]) GNUSTEP_SYSTEM_TOOLS=`echo $GNUSTEP_SYSTEM_TOOLS|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_SYSTEM_TOOLS, "$GNUSTEP_SYSTEM_TOOLS", [Built in default value for GNUstep system tools]) GNUSTEP_SYSTEM_ADMIN_TOOLS=`echo $GNUSTEP_SYSTEM_ADMIN_TOOLS|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_SYSTEM_ADMIN_TOOLS, "$GNUSTEP_SYSTEM_ADMIN_TOOLS", [Built in default value for GNUstep system tools]) GNUSTEP_SYSTEM_LIBRARY=`echo $GNUSTEP_SYSTEM_LIBRARY|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_SYSTEM_LIBRARY, "$GNUSTEP_SYSTEM_LIBRARY", [Built in default value for GNUstep system library]) GNUSTEP_SYSTEM_LIBRARIES=`echo $GNUSTEP_SYSTEM_LIBRARIES|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_SYSTEM_LIBRARIES, "$GNUSTEP_SYSTEM_LIBRARIES", [Built in default value for GNUstep system libraries]) GNUSTEP_SYSTEM_HEADERS=`echo $GNUSTEP_SYSTEM_HEADERS|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_SYSTEM_HEADERS, "$GNUSTEP_SYSTEM_HEADERS", [Built in default value for GNUstep system headers]) GNUSTEP_SYSTEM_DOC=`echo $GNUSTEP_SYSTEM_DOC|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_SYSTEM_DOC, "$GNUSTEP_SYSTEM_DOC", [Built in default value for GNUstep system documentation]) GNUSTEP_SYSTEM_DOC_MAN=`echo $GNUSTEP_SYSTEM_DOC_MAN|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_SYSTEM_DOC_MAN, "$GNUSTEP_SYSTEM_DOC_MAN", [Built in default value for GNUstep system manpages documentation]) GNUSTEP_SYSTEM_DOC_INFO=`echo $GNUSTEP_SYSTEM_DOC_INFO|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_SYSTEM_DOC_INFO, "$GNUSTEP_SYSTEM_DOC_INFO", [Built in default value for GNUstep system info documentation]) # # NETWORK domain paths # GNUSTEP_NETWORK_APPS=`echo $GNUSTEP_NETWORK_APPS|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_NETWORK_APPS, "$GNUSTEP_NETWORK_APPS", [Built in default value for GNUstep network apps]) GNUSTEP_NETWORK_ADMIN_APPS=`echo $GNUSTEP_NETWORK_ADMIN_APPS|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_NETWORK_ADMIN_APPS, "$GNUSTEP_NETWORK_ADMIN_APPS", [Built in default value for GNUstep network apps]) GNUSTEP_NETWORK_WEB_APPS=`echo $GNUSTEP_NETWORK_WEB_APPS|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_NETWORK_WEB_APPS, "$GNUSTEP_NETWORK_WEB_APPS", [Built in default value for GNUstep network web apps]) GNUSTEP_NETWORK_TOOLS=`echo $GNUSTEP_NETWORK_TOOLS|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_NETWORK_TOOLS, "$GNUSTEP_NETWORK_TOOLS", [Built in default value for GNUstep network tools]) GNUSTEP_NETWORK_ADMIN_TOOLS=`echo $GNUSTEP_NETWORK_ADMIN_TOOLS|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_NETWORK_ADMIN_TOOLS, "$GNUSTEP_NETWORK_ADMIN_TOOLS", [Built in default value for GNUstep system tools]) GNUSTEP_NETWORK_LIBRARY=`echo $GNUSTEP_NETWORK_LIBRARY|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_NETWORK_LIBRARY, "$GNUSTEP_NETWORK_LIBRARY", [Built in default value for GNUstep network library]) GNUSTEP_NETWORK_LIBRARIES=`echo $GNUSTEP_NETWORK_LIBRARIES|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_NETWORK_LIBRARIES, "$GNUSTEP_NETWORK_LIBRARIES", [Built in default value for GNUstep network libraries]) GNUSTEP_NETWORK_HEADERS=`echo $GNUSTEP_NETWORK_HEADERS|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_NETWORK_HEADERS, "$GNUSTEP_NETWORK_HEADERS", [Built in default value for GNUstep network headers]) GNUSTEP_NETWORK_DOC=`echo $GNUSTEP_NETWORK_DOC|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_NETWORK_DOC, "$GNUSTEP_NETWORK_DOC", [Built in default value for GNUstep network documentation]) GNUSTEP_NETWORK_DOC_MAN=`echo $GNUSTEP_NETWORK_DOC_MAN|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_NETWORK_DOC_MAN, "$GNUSTEP_NETWORK_DOC_MAN", [Built in default value for GNUstep network manpages documentation]) GNUSTEP_NETWORK_DOC_INFO=`echo $GNUSTEP_NETWORK_DOC_INFO|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_NETWORK_DOC_INFO, "$GNUSTEP_NETWORK_DOC_INFO", [Built in default value for GNUstep network info documentation]) # # LOCAL domain paths # GNUSTEP_LOCAL_APPS=`echo $GNUSTEP_LOCAL_APPS|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_LOCAL_APPS, "$GNUSTEP_LOCAL_APPS", [Built in default value for GNUstep local apps]) GNUSTEP_LOCAL_ADMIN_APPS=`echo $GNUSTEP_LOCAL_ADMIN_APPS|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_LOCAL_ADMIN_APPS, "$GNUSTEP_LOCAL_ADMIN_APPS", [Built in default value for GNUstep local apps]) GNUSTEP_LOCAL_WEB_APPS=`echo $GNUSTEP_LOCAL_WEB_APPS|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_LOCAL_WEB_APPS, "$GNUSTEP_LOCAL_WEB_APPS", [Built in default value for GNUstep local web apps]) GNUSTEP_LOCAL_TOOLS=`echo $GNUSTEP_LOCAL_TOOLS|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_LOCAL_TOOLS, "$GNUSTEP_LOCAL_TOOLS", [Built in default value for GNUstep local tools]) GNUSTEP_LOCAL_ADMIN_TOOLS=`echo $GNUSTEP_LOCAL_ADMIN_TOOLS|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_LOCAL_ADMIN_TOOLS, "$GNUSTEP_LOCAL_ADMIN_TOOLS", [Built in default value for GNUstep local tools]) GNUSTEP_LOCAL_LIBRARY=`echo $GNUSTEP_LOCAL_LIBRARY|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_LOCAL_LIBRARY, "$GNUSTEP_LOCAL_LIBRARY", [Built in default value for GNUstep local library]) GNUSTEP_LOCAL_LIBRARIES=`echo $GNUSTEP_LOCAL_LIBRARIES|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_LOCAL_LIBRARIES, "$GNUSTEP_LOCAL_LIBRARIES", [Built in default value for GNUstep local libraries]) GNUSTEP_LOCAL_HEADERS=`echo $GNUSTEP_LOCAL_HEADERS|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_LOCAL_HEADERS, "$GNUSTEP_LOCAL_HEADERS", [Built in default value for GNUstep local headers]) GNUSTEP_LOCAL_DOC=`echo $GNUSTEP_LOCAL_DOC|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_LOCAL_DOC, "$GNUSTEP_LOCAL_DOC", [Built in default value for GNUstep local documentation]) GNUSTEP_LOCAL_DOC_MAN=`echo $GNUSTEP_LOCAL_DOC_MAN|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_LOCAL_DOC_MAN, "$GNUSTEP_LOCAL_DOC_MAN", [Built in default value for GNUstep local manpages documentation]) GNUSTEP_LOCAL_DOC_INFO=`echo $GNUSTEP_LOCAL_DOC_INFO|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_LOCAL_DOC_INFO, "$GNUSTEP_LOCAL_DOC_INFO", [Built in default value for GNUstep local info documentation]) # # USER_DIR domain paths # GNUSTEP_USER_DIR_APPS=`echo $GNUSTEP_USER_DIR_APPS|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_USER_DIR_APPS, "$GNUSTEP_USER_DIR_APPS", [Built in default value for GNUstep user_dir apps]) GNUSTEP_USER_DIR_ADMIN_APPS=`echo $GNUSTEP_USER_DIR_ADMIN_APPS|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_USER_DIR_ADMIN_APPS, "$GNUSTEP_USER_DIR_ADMIN_APPS", [Built in default value for GNUstep user_dir admin apps]) GNUSTEP_USER_DIR_WEB_APPS=`echo $GNUSTEP_USER_DIR_WEB_APPS|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_USER_DIR_WEB_APPS, "$GNUSTEP_USER_DIR_WEB_APPS", [Built in default value for GNUstep user_dir web apps]) GNUSTEP_USER_DIR_TOOLS=`echo $GNUSTEP_USER_DIR_TOOLS|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_USER_DIR_TOOLS, "$GNUSTEP_USER_DIR_TOOLS", [Built in default value for GNUstep user_dir tools]) GNUSTEP_USER_DIR_ADMIN_TOOLS=`echo $GNUSTEP_USER_DIR_ADMIN_TOOLS|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_USER_DIR_ADMIN_TOOLS, "$GNUSTEP_USER_DIR_ADMIN_TOOLS", [Built in default value for GNUstep user_dir tools]) GNUSTEP_USER_DIR_LIBRARY=`echo $GNUSTEP_USER_DIR_LIBRARY|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_USER_DIR_LIBRARY, "$GNUSTEP_USER_DIR_LIBRARY", [Built in default value for GNUstep user_dir library]) GNUSTEP_USER_DIR_LIBRARIES=`echo $GNUSTEP_USER_DIR_LIBRARIES|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_USER_DIR_LIBRARIES, "$GNUSTEP_USER_DIR_LIBRARIES", [Built in default value for GNUstep user_dir libraries]) GNUSTEP_USER_DIR_HEADERS=`echo $GNUSTEP_USER_DIR_HEADERS|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_USER_DIR_HEADERS, "$GNUSTEP_USER_DIR_HEADERS", [Built in default value for GNUstep user_dir headers]) GNUSTEP_USER_DIR_DOC=`echo $GNUSTEP_USER_DIR_DOC|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_USER_DIR_DOC, "$GNUSTEP_USER_DIR_DOC", [Built in default value for GNUstep user_dir documentation]) GNUSTEP_USER_DIR_DOC_MAN=`echo $GNUSTEP_USER_DIR_DOC_MAN|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_USER_DIR_DOC_MAN, "$GNUSTEP_USER_DIR_DOC_MAN", [Built in default value for GNUstep user_dir manpages documentation]) GNUSTEP_USER_DIR_DOC_INFO=`echo $GNUSTEP_USER_DIR_DOC_INFO|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_USER_DIR_DOC_INFO, "$GNUSTEP_USER_DIR_DOC_INFO", [Built in default value for GNUstep user_dir info documentation]) GNUSTEP_TARGET_SYSTEM_USERS_DIR=`echo $GNUSTEP_TARGET_SYSTEM_USERS_DIR|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_SYSTEM_USERS_DIR, "$GNUSTEP_TARGET_SYSTEM_USERS_DIR", [Built in default value for GNUstep System Users directory]) GNUSTEP_TARGET_NETWORK_USERS_DIR=`echo $GNUSTEP_TARGET_NETWORK_USERS_DIR|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_NETWORK_USERS_DIR, "$GNUSTEP_TARGET_NETWORK_USERS_DIR", [Built in default value for GNUstep Network Users directory]) GNUSTEP_TARGET_LOCAL_USERS_DIR=`echo $GNUSTEP_TARGET_LOCAL_USERS_DIR|sed -e 's/\\\\/\\\\\\\\/g'` AC_DEFINE_UNQUOTED(GNUSTEP_TARGET_LOCAL_USERS_DIR, "$GNUSTEP_TARGET_LOCAL_USERS_DIR", [Built in default value for GNUstep Local Users directory]) # # Now load the values to be used in locating libraries etc used when # building the base library ... as supplied by the gnustep-make package # # It looks like we ought to source the whole GNUstep.sh here, and even # ask it to output all variables! That way we have access to (eg) # GNUSTEP_SYSTEM_HEADERS below. # # We need to unset any values that we really need, or existing settings # would be used by GNUstep.sh # unset GNUSTEP_SYSTEM_HEADERS unset GNUSTEP_SYSTEM_LIBRARIES unset GNUSTEP_NETWORK_HEADERS unset GNUSTEP_NETWORK_LIBRARIES unset GNUSTEP_LOCAL_HEADERS unset GNUSTEP_LOCAL_LIBRARIES GNUSTEP_MAKEFILES="$CURRENT_GNUSTEP_MAKEFILES" GNUSTEP_SH_EXPORT_ALL_VARIABLES=yes . "$CURRENT_GNUSTEP_MAKEFILES/GNUstep.sh" unset GNUSTEP_SH_EXPORT_ALL_VARIABLES # For backwards compatibility, define GNUSTEP_SYSTEM_HEADERS from # GNUSTEP_SYSTEM_ROOT if not set yet. if test x"$GNUSTEP_SYSTEM_HEADERS" = x""; then GNUSTEP_SYSTEM_HEADERS="$GNUSTEP_SYSTEM_ROOT/Library/Headers" fi if test x"$GNUSTEP_SYSTEM_LIBRARIES" = x""; then GNUSTEP_SYSTEM_LIBRARIES="$GNUSTEP_SYSTEM_ROOT/Library/Libraries" fi if test x"$GNUSTEP_NETWORK_HEADERS" = x""; then GNUSTEP_NETWORK_HEADERS="$GNUSTEP_NETWORK_ROOT/Library/Headers" fi if test x"$GNUSTEP_NETWORK_LIBRARIES" = x""; then GNUSTEP_NETWORK_LIBRARIES="$GNUSTEP_NETWORK_ROOT/Library/Libraries" fi if test x"$GNUSTEP_LOCAL_HEADERS" = x""; then GNUSTEP_LOCAL_HEADERS="$GNUSTEP_LOCAL_ROOT/Library/Headers" fi if test x"$GNUSTEP_LOCAL_LIBRARIES" = x""; then GNUSTEP_LOCAL_LIBRARIES="$GNUSTEP_LOCAL_ROOT/Library/Libraries" fi # # Add standard library and header directories for configure to use to locate # plain C developer headers/libraries which have been installed in the # GNUstep hierarchy. These take precedence # if test x"$GNUSTEP_IS_FLATTENED" = x"yes"; then CPPFLAGS="$CPPFLAGS -I$GNUSTEP_LOCAL_HEADERS" CPPFLAGS="$CPPFLAGS -I$GNUSTEP_NETWORK_HEADERS" CPPFLAGS="$CPPFLAGS -I$GNUSTEP_SYSTEM_HEADERS" LDFLAGS="$LDFLAGS -L$GNUSTEP_LOCAL_LIBRARIES" LDFLAGS="$LDFLAGS -L$GNUSTEP_NETWORK_LIBRARIES" LDFLAGS="$LDFLAGS -L$GNUSTEP_SYSTEM_LIBRARIES" else # FIXME: Cross-compiling should read the target from the configure # options and use it. GNUSTEP_TARGET_* variables do not exist in # this context (so "$GNUSTEP_TARGET_CPU" will always be "") if test x"$GNUSTEP_TARGET_CPU" = x""; then ARCH="$GNUSTEP_HOST_CPU-$GNUSTEP_HOST_OS" else ARCH=$GNUSTEP_TARGET_CPU-$GNUSTEP_TARGET_OS fi ALIB="$ARCH/$LIBRARY_COMBO" CPPFLAGS="$CPPFLAGS -I$GNUSTEP_LOCAL_HEADERS/$ALIB" CPPFLAGS="$CPPFLAGS -I$GNUSTEP_LOCAL_HEADERS/$ARCH" CPPFLAGS="$CPPFLAGS -I$GNUSTEP_LOCAL_HEADERS" CPPFLAGS="$CPPFLAGS -I$GNUSTEP_NETWORK_HEADERS/$ALIB" CPPFLAGS="$CPPFLAGS -I$GNUSTEP_NETWORK_HEADERS/$ARCH" CPPFLAGS="$CPPFLAGS -I$GNUSTEP_NETWORK_HEADERS" CPPFLAGS="$CPPFLAGS -I$GNUSTEP_SYSTEM_HEADERS/$ALIB" CPPFLAGS="$CPPFLAGS -I$GNUSTEP_SYSTEM_HEADERS/$ARCH" CPPFLAGS="$CPPFLAGS -I$GNUSTEP_SYSTEM_HEADERS" LDFLAGS="$LDFLAGS -L$GNUSTEP_LOCAL_LIBRARIES/$ALIB" LDFLAGS="$LDFLAGS -L$GNUSTEP_LOCAL_LIBRARIES/$ARCH" LDFLAGS="$LDFLAGS -L$GNUSTEP_LOCAL_LIBRARIES" LDFLAGS="$LDFLAGS -L$GNUSTEP_NETWORK_LIBRARIES/$ALIB" LDFLAGS="$LDFLAGS -L$GNUSTEP_NETWORK_LIBRARIES/$ARCH" LDFLAGS="$LDFLAGS -L$GNUSTEP_NETWORK_LIBRARIES" LDFLAGS="$LDFLAGS -L$GNUSTEP_SYSTEM_LIBRARIES/$ALIB" LDFLAGS="$LDFLAGS -L$GNUSTEP_SYSTEM_LIBRARIES/$ARCH" LDFLAGS="$LDFLAGS -L$GNUSTEP_SYSTEM_LIBRARIES" fi #-------------------------------------------------------------------- # Find the compiler #-------------------------------------------------------------------- MAKECC=`gnustep-config --variable=CC` MAKECPP=`gnustep-config --variable=CPP` MAKECXX=`gnustep-config --variable=CXX` if test "$CC" = ""; then CC=$MAKECC export CC else if test "$CC" != "$MAKECC"; then AC_MSG_WARN([You are running configure with the compiler ($CC) set to a different value from that used by gnustep-make ($MAKECC). To avoid conflicts/problems, reconfigure/reinstall gnustep-make to use CC=$CC or run the gnustep-base configure again with your CC environment variable set to $MAKECC]) fi fi if test "$CPP" = ""; then CPP=$MAKECPP export CPP else if test "$CPP" != "$MAKECPP"; then AC_MSG_WARN([You are running configure with the preprocessor ($CPP) set to a different value from that used by gnustep-make ($MAKECPP). To avoid conflicts/problems, reconfigure/reinstall gnustep-make to use CPP=$CPP or run the gnustep-base configure again with your CPP environment variable set to $MAKECPP]) fi fi if test "$CXX" = ""; then CXX=$MAKECXX export CXX else if test "$CXX" != "$MAKECXX"; then AC_MSG_WARN([You are running configure with the compiler ($CXX) set to a different value from that used by gnustep-make ($MAKECXX). To avoid conflicts/problems, reconfigure/reinstall gnustep-make to use CXX=$CXX or run the gnustep-base configure again with your CXX environment variable set to $MAKECXX]) fi fi AC_PROG_CC AC_PROG_CPP AC_USE_SYSTEM_EXTENSIONS AC_MSG_CHECKING(whether the compiler is clang) if test ! x"${GCC}" = x"yes" ; then CLANG_CC=no AC_MSG_RESULT(no) else if "${CC}" -v 2>&1 | grep -q 'clang version'; then CLANG_CC=yes AC_MSG_RESULT(yes) else CLANG_CC=no AC_MSG_RESULT(no) fi fi AC_SUBST(CLANG_CC) # Large file support needed by NSData/NSFileHandle. # These macros must be called after AC_USE_SYSTEM_EXTENSIONS because # the `fseeko' declaration may be hidden by default on some systems. AC_FUNC_FSEEKO AH_BOTTOM([ /* Define `fseeko' to `fseek' if the former is missing. Likewise for `ftello'. */ #if !HAVE_FSEEKO # define fseeko fseek # define ftello ftell #endif ]) AC_SYS_LARGEFILE AC_TYPE_OFF_T #-------------------------------------------------------------------- # Check how to enable builtins for atomic operations #-------------------------------------------------------------------- AC_LANG_PUSH(C) AC_MSG_CHECKING([whether the compiler supports atomic operations]); AC_LINK_IFELSE([AC_LANG_PROGRAM([[typedef int atomic;]], [[atomic x; atomic y; __sync_bool_compare_and_swap(&x, y, y + 1);]])], have_atomic=yes, have_atomic=no); if test "$have_atomic" = "yes"; then AC_MSG_RESULT([yes]); AC_DEFINE(USE_ATOMIC_BUILTINS,1, [Define if the compiler provides builtins for atomic operations]) else AC_MSG_RESULT([no]); if test "$CC" = "gcc"; then saved_CFLAGS="$CFLAGS"; ATOMIC_CFLAGS=""; # FIXME: Forcing -march=i568 for any i568 or later CPU is a # stop gap measure to make the compiler emit native assembly # for atomic operations on i586 or latter processors (GCC by # default emits code compatible with the original i386 and # requires library functions to emulate atomic operations). # When gnustep-make takes care of this kind of target setting, # the check can safely be removed. case "$target_cpu" in i586*|i686*|i786*) ATOMIC_CFLAGS="-march=i586" CFLAGS="$saved_CFLAGS $ATOMIC_CFLAGS" ;; x86_64) ATOMIC_CFLAGS="-march=x86-64" CFLAGS="$saved_CFLAGS $ATOMIC_CFLAGS" ;; esac AC_MSG_CHECKING([whether CC supports atomic operations with -march]); AC_LINK_IFELSE([AC_LANG_PROGRAM([[typedef int atomic;]], [[atomic x; atomic y; __sync_bool_compare_and_swap(&x, y, y+1);]])], need_march=yes, need_march=no); if test "$need_march" = "yes"; then AC_MSG_RESULT([yes]); OBJCFLAGS="$OBJCFLAGS $ATOMIC_CFLAGS"; AC_DEFINE(USE_ATOMIC_BUILTINS,1, [Define if the compiler provides builtins for atomic operations]) else AC_MSG_RESULT([no]); saved_LDFLAGS="$LDFLAGS"; LDFLAGS="$saved_LDFLAGS -lgcc"; AC_MSG_CHECKING([whether CC supports atomic operations using libgcc]); AC_LINK_IFELSE([AC_LANG_PROGRAM([[typedef int atomic;]], [[atomic x; atomic y; __sync_bool_compare_and_swap(&x, y, y+1);]])], atomic_in_libgcc=yes, atomic_in_libgcc=no); if test "$atomic_in_libgcc" = "yes"; then AC_MSG_RESULT([yes]); LIBS="$LIBS -lgcc"; AC_DEFINE(USE_ATOMIC_BUILTINS,1, [Define if the compiler provides builtins for atomic operations]) else LDFLAGS="$saved_LDFLAGS"; AC_MSG_RESULT([no]); fi fi fi fi AC_LANG_POP(C) AC_PATH_PROG(WHOAMI, whoami, echo, $PATH:/usr/ucb) PKG_PROG_PKG_CONFIG # If the modern mechanism failswe may havew an older pkg-config # so try looking it up the old fashioned way. if test -z "$PKG_CONFIG"; then AC_PATH_PROG(PKG_CONFIG,pkg-config,,) fi #-------------------------------------------------------------------- # specific target_os options #-------------------------------------------------------------------- INCLUDE_FLAGS="$CPPFLAGS" LDIR_FLAGS="$LDFLAGS" # This is just for configuring. Later, in config.make, INCLUDE_FLAGS # goes in CONFIG_SYSTEM_INCL and LIBS goes in CONFIG_SYSTEM_LIBS case "$target_os" in freebsd* | openbsd* ) CPPFLAGS="$CPPFLAGS -I/usr/local/include" LDFLAGS="$LDFLAGS -L/usr/local/lib";; netbsd*) CPPFLAGS="$CPPFLAGS -I/usr/pkg/include" LDFLAGS="$LDFLAGS -Wl,-R/usr/pkg/lib -L/usr/pkg/lib";; linux-android* ) # link against libandroid for native application APIs LIBS="$LIBS -landroid";; esac #-------------------------------------------------------------------- # Set Apple/Darwin/OSX/NeXT information for other tests #-------------------------------------------------------------------- AC_MSG_CHECKING(the Objective-C runtime) if test "$OBJC_RUNTIME_LIB" = "nx" -o "$OBJC_RUNTIME_LIB" = "apple"; then AC_MSG_RESULT(NeXT) OBJCFLAGS="$OBJCFLAGS -fnext-runtime -DNeXT_RUNTIME" elif test "$OBJC_RUNTIME_LIB" = "ng"; then AC_MSG_RESULT(Next Gen) else AC_MSG_RESULT(GNU) if test "$CLANG_CC" = "yes"; then OBJCFLAGS="$OBJCFLAGS -fobjc-runtime=gcc" fi fi LIBOBJC=`gnustep-config --objc-libs` if test "$LIBOBJC" = ""; then AC_MSG_ERROR([The command 'gnustep-config --objc-libs' (provided by the gnustep-make package) returned no Objective-C library. Unable to continue configuring without Objective-C support.]) exit 1 fi #-------------------------------------------------------------------- # Miscellaneous flags #-------------------------------------------------------------------- # Check to see if the libobjc library is in our GNUSTEP_SYSTEM_LIBRARIES. # If so, there are probably other libraries that we want there also, so # leave the proper includes in CPPFLAGS and LDFLAGS AC_MSG_CHECKING(for custom shared objc library) AC_CACHE_VAL(gs_cv_objc_libdir, [dnl gs_cv_objc_libdir=NONE gs_cv_objc_incdir=NONE # Try GNUSTEP_SYSTEM_LIBRARIES first if test "$GNUSTEP_IS_FLATTENED" = yes; then GNUSTEP_LDIR="$GNUSTEP_SYSTEM_LIBRARIES" GNUSTEP_HDIR="$GNUSTEP_SYSTEM_HEADERS" else GNUSTEP_LDIR="$GNUSTEP_SYSTEM_LIBRARIES/$obj_dir" GNUSTEP_HDIR="$GNUSTEP_SYSTEM_HEADERS/$LIBRARY_COMBO" fi if test -f "$GNUSTEP_HDIR/objc/objc.h"; then if test -f "$GNUSTEP_LDIR/libobjc.a" -o -f "$GNUSTEP_LDIR/libobjc.so" -o -f "$GNUSTEP_LDIR/libobjc.dll.a" -o -f "$GNUSTEP_LDIR/libobjc-gnu.dylib" -o -f "$GNUSTEP_LDIR/objc.lib"; then gs_cv_objc_libdir="$GNUSTEP_LDIR" gs_cv_objc_incdir="$GNUSTEP_HDIR" fi fi # Try GNUSTEP_NETWORK_LIBRARIES second (override GNUSTEP_SYSTEM if # found) if test "$GNUSTEP_IS_FLATTENED" = yes; then GNUSTEP_LDIR="$GNUSTEP_NETWORK_LIBRARIES" GNUSTEP_HDIR="$GNUSTEP_NETWORK_HEADERS" else GNUSTEP_LDIR="$GNUSTEP_NETWORK_LIBRARIES/$obj_dir" GNUSTEP_HDIR="$GNUSTEP_NETWORK_HEADERS/$LIBRARY_COMBO" fi if test -f "$GNUSTEP_HDIR/objc/objc.h"; then if test -f "$GNUSTEP_LDIR/libobjc.a" -o -f "$GNUSTEP_LDIR/libobjc.so" -o -f "$GNUSTEP_LDIR/libobjc.dll.a" -o -f "$GNUSTEP_LDIR/libobjc-gnu.dylib" -o -f "$GNUSTEP_LDIR/objc.lib"; then gs_cv_objc_libdir="$GNUSTEP_LDIR" gs_cv_objc_incdir="$GNUSTEP_HDIR" fi fi # Try GNUSTEP_LOCAL_LIBRARIES third (override GNUSTEP_SYSTEM and # GNUSTEP_NETWORK if found) if test "$GNUSTEP_IS_FLATTENED" = yes; then GNUSTEP_LDIR="$GNUSTEP_LOCAL_LIBRARIES" GNUSTEP_HDIR="$GNUSTEP_LOCAL_HEADERS" else GNUSTEP_LDIR="$GNUSTEP_LOCAL_LIBRARIES/$obj_dir" GNUSTEP_HDIR="$GNUSTEP_LOCAL_HEADERS/$LIBRARY_COMBO" fi if test -f "$GNUSTEP_HDIR/objc/objc.h"; then if test -f "$GNUSTEP_LDIR/libobjc.a" -o -f "$GNUSTEP_LDIR/libobjc.so" -o -f "$GNUSTEP_LDIR/libobjc.dll.a" -o -f "$GNUSTEP_LDIR/libobjc-gnu.dylib" -o -f "$GNUSTEP_LDIR/objc.lib"; then gs_cv_objc_libdir="$GNUSTEP_LDIR" gs_cv_objc_incdir="$GNUSTEP_HDIR" fi fi ]) AC_MSG_RESULT($gs_cv_objc_libdir) if test "$gs_cv_objc_libdir" != "NONE"; then # # The following one is so that headers of custom libraries into # $GNUSTEP_HDIR are used before the standard ones # INCLUDE_FLAGS="$INCLUDE_FLAGS -I$gs_cv_objc_incdir" LDIR_FLAGS="$LDIR_FLAGS -L$gs_cv_objc_libdir/$LIBRARY_COMBO -L$gs_cv_objc_libdir" CPPFLAGS="$CPPFLAGS -I$gs_cv_objc_incdir" LDFLAGS="$LDFLAGS -L$gs_cv_objc_libdir" # add to path on Windows for config checks to find DLL at runtime case $host_os in mingw*|windows) PATH=$PATH:$gs_cv_objc_libdir;; esac fi #-------------------------------------------------------------------- # Check if Objective-C is installed #-------------------------------------------------------------------- AC_CHECK_HEADERS(objc/runtime.h) AC_CHECK_HEADERS(objc/objc.h) if test $ac_cv_header_objc_objc_h = no; then echo "Check to make sure you have the Objective-C runtime library" echo "and its headers installed." AC_MSG_ERROR(Could not find Objective-C headers) fi #-------------------------------------------------------------------- # Check for strange network stuff used by gdomap #-------------------------------------------------------------------- AC_MSG_NOTICE(for gdomap network details) AC_MSG_CHECKING(for variable length socket addresses) AC_TRY_COMPILE([ #include #include #include ], [struct ifreq s; s.ifr_addr.sa_len = 0;], sa_len=1, sa_len=0) if test $sa_len = 1; then AC_MSG_RESULT([found]) AC_DEFINE(HAVE_SA_LEN,1, [Define if your system has variable length network addresses]) else AC_MSG_RESULT([not found]) fi AC_MSG_CHECKING(for compiler visibility attribute support) saved_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -Werror" AC_COMPILE_IFELSE([AC_LANG_SOURCE([ #include int foo() __attribute__ ((visibility("internal"))); int foo(){ return 1; } int main(){ return foo(); }])], AC_MSG_RESULT([found]) gs_visibility=1, AC_MSG_RESULT([not present]) gs_visibility=0 ) AC_DEFINE_UNQUOTED(HAVE_VISIBILITY_ATTRIBUTE,$gs_visibility, [Says whether the visibility attribute works]) CFLAGS="$saved_CFLAGS" #-------------------------------------------------------------------- # Check if system has buggy SO_REUSEADDR #-------------------------------------------------------------------- AC_MSG_CHECKING(whether SO_REUSEADDR is broken) AC_TRY_RUN([#include "$srcdir/config/config.reuseaddr.c"], reuseaddr_ok=1, reuseaddr_ok=0, reuseaddr_ok="$cross_reuseaddr_ok") if test $reuseaddr_ok = 0; then AC_DEFINE(BROKEN_SO_REUSEADDR,1, [Define if SO_REUSEADDR is broken on this system]) echo echo "The SO_REUSEADDR socket option for controlling re-use of network" echo "sockets immediately after shutdown appears to be broken on this" echo "machine. Networking code will be built without using this" echo "feature." echo "The effect of this lack is that when a network service is shut" echo "down, it cannot be re-started on the same network port until" echo "an operating-system timeout has expired." echo "For servers other than gdomap, GNUstep does not normally need" echo "a particular network port, so the problem is unlikely to arise." AC_MSG_RESULT(yes) else AC_MSG_RESULT(no) fi #-------------------------------------------------------------------- # Check for thread flags for libobjc. #-------------------------------------------------------------------- # AC_MSG_CHECKING(for objc threading flags) # # Get them from gnustep-make which contains the real code to get them # objc_threaded=`grep objc_threaded: $CURRENT_GNUSTEP_MAKEFILES/$lobj_dir/config.make | sed -e 's/objc_threaded:=//'` # AC_MSG_RESULT($objc_threaded) #-------------------------------------------------------------------- # Byte order information needed for foundation headers. #-------------------------------------------------------------------- AC_C_BIGENDIAN if test $ac_cv_c_bigendian = yes; then GS_WORDS_BIGENDIAN=1 else GS_WORDS_BIGENDIAN=0 fi AC_SUBST(GS_WORDS_BIGENDIAN) #-------------------------------------------------------------------- # Type size information needed for foundation headers. #-------------------------------------------------------------------- AC_CHECK_SIZEOF(void*) GS_SINT8="signed char" GS_UINT8="unsigned char" AC_SUBST(GS_SINT8) AC_SUBST(GS_UINT8) AC_CHECK_SIZEOF(short) AC_SUBST(ac_cv_sizeof_short) AC_CHECK_SIZEOF(int) AC_SUBST(ac_cv_sizeof_int) AC_CHECK_SIZEOF(long) AC_SUBST(ac_cv_sizeof_long) AC_CHECK_SIZEOF(long long) AC_SUBST(ac_cv_sizeof_long_long) AC_CHECK_SIZEOF(float) AC_SUBST(ac_cv_sizeof_float) AC_CHECK_SIZEOF(double) AC_SUBST(ac_cv_sizeof_double) AC_SUBST(ac_cv_sizeof_voidp) if test $ac_cv_sizeof_voidp = $ac_cv_sizeof_int; then GS_SADDR="int" GS_UADDR="unsigned int" else if test $ac_cv_sizeof_voidp = $ac_cv_sizeof_long; then GS_SADDR="long" GS_UADDR="unsigned long" else if test $ac_cv_sizeof_voidp = $ac_cv_sizeof_long_long; then GS_SADDR="long long" GS_UADDR="unsigned long long" else AC_MSG_ERROR([Unable to find integer of same size as void*]) fi fi fi AC_SUBST(GS_SADDR) AC_SUBST(GS_UADDR) if test $ac_cv_sizeof_short = 2; then GS_SINT16="signed short" GS_UINT16="unsigned short" else if test $ac_cv_sizeof_int = 2; then GS_SINT16="signed int" GS_UINT16="unsigned int" else AC_MSG_ERROR([Unable to determine type for 16-bit integer]) fi fi AC_SUBST(GS_SINT16) AC_SUBST(GS_UINT16) if test $ac_cv_sizeof_int = 4; then GS_SINT32="signed int" GS_UINT32="unsigned int" else if test $ac_cv_sizeof_long = 4; then GS_SINT32="signed long" GS_UINT32="unsigned long" else if test $ac_cv_sizeof_short = 4; then GS_SINT32="signed short" GS_UINT32="unsigned short" else AC_MSG_ERROR([Unable to determine type for 32-bit integer]) fi fi fi AC_SUBST(GS_SINT32) AC_SUBST(GS_UINT32) GS_HAVE_I64=1 if test $ac_cv_sizeof_int = 8; then GS_SINT64="signed int" GS_UINT64="unsigned int" else if test $ac_cv_sizeof_long = 8; then GS_SINT64="signed long" GS_UINT64="unsigned long" else if test $ac_cv_sizeof_long_long = 8; then GS_SINT64="signed long long" GS_UINT64="unsigned long long" else # 64-bit ints not supported - but we need a dummy type for byte-swapping # of 64-bit values arriving from another system. GS_SINT64="struct { gsu8 a[8]; }" GS_UINT64="struct { gsu8 a[8]; }" GS_HAVE_I64=0 fi fi fi AC_SUBST(GS_SINT64) AC_SUBST(GS_UINT64) AC_SUBST(GS_HAVE_I64) GS_HAVE_I128=1 if test $ac_cv_sizeof_long = 16; then GS_SINT128="signed long" GS_UINT128="unsigned long" else if test $ac_cv_sizeof_long_long = 16; then GS_SINT128="signed long long" GS_UINT128="unsigned long long" else # 128-bit ints not supported - but we need a dummy type for byte-swapping # of 128-bit values arriving from another system. GS_SINT128="struct { gsu8 a[[16]]; }" GS_UINT128="struct { gsu8 a[[16]]; }" GS_HAVE_I128=0 fi fi AC_SUBST(GS_SINT128) AC_SUBST(GS_UINT128) AC_SUBST(GS_HAVE_I128) if test $ac_cv_sizeof_float = 4; then GS_FLT32="float" else AC_MSG_ERROR([Unable to determine type for 32-bit float]) fi AC_SUBST(GS_FLT32) if test $ac_cv_sizeof_double = 8; then GS_FLT64="double" else AC_MSG_ERROR([Unable to determine type for 64-bit float]) fi AC_SUBST(GS_FLT64) #-------------------------------------------------------------------- # Type-size information for encoding into archives using NSArchiver etc. #-------------------------------------------------------------------- if test $ac_cv_sizeof_short = 2; then _GSC_S_SHT=_GSC_I16 else _GSC_S_SHT=_GSC_I32 fi AC_SUBST(_GSC_S_SHT) if test $ac_cv_sizeof_int = 2; then _GSC_S_INT=_GSC_I16 else if test $ac_cv_sizeof_int = 4; then _GSC_S_INT=_GSC_I32 else if test $ac_cv_sizeof_int = 8; then _GSC_S_INT=_GSC_I64 else if test $ac_cv_sizeof_int = 16; then _GSC_S_INT=_GSC_I128 fi fi fi fi AC_SUBST(_GSC_S_INT) if test $ac_cv_sizeof_long = 4; then _GSC_S_LNG=_GSC_I32 else if test $ac_cv_sizeof_long = 8; then _GSC_S_LNG=_GSC_I64 else if test $ac_cv_sizeof_long = 16; then _GSC_S_LNG=_GSC_I128 fi fi fi AC_SUBST(_GSC_S_LNG) if test $ac_cv_sizeof_long_long = 4; then _GSC_S_LNG_LNG=_GSC_I32 else if test $ac_cv_sizeof_long_long = 8; then _GSC_S_LNG_LNG=_GSC_I64 else if test $ac_cv_sizeof_long_long = 16; then _GSC_S_LNG_LNG=_GSC_I128 fi fi fi AC_SUBST(_GSC_S_LNG_LNG) #-------------------------------------------------------------------- # Limit information needed for foundation headers. #-------------------------------------------------------------------- AC_LANG_PUSH(C) AC_MSG_CHECKING([for working INTPTR_MAX, INTPTR_MIN, UINTPTR_MAX]); AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[#include ]], [[int imax = INTPTR_MAX; int imin = INTPTR_MIN; unsigned umax = UINTPTR_MAX;]])], have_valid_ptr_limits=yes, have_valid_ptr_limits=no); if test "$have_valid_ptr_limits" = "yes"; then AC_MSG_RESULT([yes]); BUGGY_PTR_LIMITS=0 else AC_MSG_RESULT([no]); BUGGY_PTR_LIMITS=1 case "$target_os" in solaris*) case "$target_cpu" in sparc64*|x86_64*) GS_INTPTR_MAX="INT64_MAX" GS_INTPTR_MIN="INT64_MIN" GS_UINTPTR_MAX="UINT64_MAX" ;; sparc*|i386*|i586*|i686*) GS_INTPTR_MAX="INT32_MAX" GS_INTPTR_MIN="INT32_MIN" GS_UINTPTR_MAX="UINT32_MAX" ;; *) ;; esac ;; # support for other OS's with broken macros to be added here (HP-UX, IRIX being known) *) ;; esac AC_SUBST(GS_INTPTR_MAX) AC_SUBST(GS_INTPTR_MIN) AC_SUBST(GS_UINTPTR_MAX) fi AC_SUBST(BUGGY_PTR_LIMITS) AC_LANG_POP(C) #-------------------------------------------------------------------- # Setup dynamic linking #-------------------------------------------------------------------- OBJC_SYS_DYNAMIC_LINKER() # NOTE: libdl should be in LIBS now if it's available. AC_CHECK_FUNCS(dladdr) AC_CHECK_FUNCS(gethostbyname) if test "$ac_cv_func_gethostbyname" = "no"; then # QNX has gethostbyname and friends in libsocket AC_CHECK_LIB(socket, gethostbyname) fi AC_CHECK_FUNCS(getaddrinfo) #-------------------------------------------------------------------- # Windows: check if we have native threading APIs and SRW locks #-------------------------------------------------------------------- HAVE_WIN32_THREADS_AND_LOCKS=0 case "$target_os" in mingw*|windows) AC_MSG_CHECKING(for native Windows threads and locks) AC_COMPILE_IFELSE( [AC_LANG_SOURCE([ #define GS_USE_WIN32_THREADS_AND_LOCKS 1 #include "$srcdir/Source/GSPThread.h" ])], AC_MSG_RESULT([yes]) HAVE_WIN32_THREADS_AND_LOCKS=1, AC_MSG_RESULT([no])) ;; esac AC_SUBST(HAVE_WIN32_THREADS_AND_LOCKS) #-------------------------------------------------------------------- # Check for pthread.h #-------------------------------------------------------------------- if test $HAVE_WIN32_THREADS_AND_LOCKS = 0; then AC_CHECK_HEADERS([pthread.h]) AC_CHECK_HEADERS([pthread_np.h],[],[],[AC_INCLUDES_DEFAULT #ifdef HAVE_PTHREAD_H #include #endif ]) if test $ac_cv_header_pthread_h = yes ; then AC_CHECK_SIZEOF(pthread_mutex_t,,[AC_INCLUDES_DEFAULT #include ]) GS_SIZEOF_MUTEX_T=$ac_cv_sizeof_pthread_mutex_t if test $ac_cv_sizeof_pthread_mutex_t = 0 ; then AC_MSG_ERROR([Unable to find size of pthread_mutex_t (required).]) fi AC_SUBST(GS_SIZEOF_MUTEX_T) GS_SIZEOF_COND_MUTEX_T=$ac_cv_sizeof_pthread_mutex_t AC_SUBST(GS_SIZEOF_COND_MUTEX_T) # pthread_mutex_t.__data.__owner is non-standard since pthread_mutex_t is # nominally an opaque type. We must not rely on this for anything other # than debug output! AC_CHECK_MEMBER([pthread_mutex_t.__data.__owner],,,[AC_INCLUDES_DEFAULT #include ]) if test $ac_cv_member_pthread_mutex_t___data___owner = yes ; then AC_DEFINE(HAVE_PTHREAD_MUTEX_OWNER, 1, [Define if you have pthread_mutex_t.__data.__owner]) fi AC_CHECK_SIZEOF(pthread_cond_t,,[AC_INCLUDES_DEFAULT #include ]) if test $ac_cv_sizeof_pthread_cond_t = 0 ; then AC_MSG_ERROR([Unable to find size of pthread_cond_t (required).]) fi GS_SIZEOF_COND_T=$ac_cv_sizeof_pthread_cond_t AC_SUBST(GS_SIZEOF_COND_T) AC_CHECK_ALIGNOF(pthread_mutex_t,[AC_INCLUDES_DEFAULT #include ]) GS_ALIGNOF_MUTEX_T=$ac_cv_alignof_pthread_mutex_t if test $ac_cv_alignof_pthread_mutex_t = 0 ; then AC_MSG_ERROR([Unable to find align of pthread_mutex_t (required).]) fi AC_SUBST(GS_ALIGNOF_MUTEX_T) GS_ALIGNOF_COND_MUTEX_T=$ac_cv_alignof_pthread_mutex_t AC_SUBST(GS_ALIGNOF_COND_MUTEX_T) AC_CHECK_ALIGNOF(pthread_cond_t,[AC_INCLUDES_DEFAULT #include ]) if test $ac_cv_alignof_pthread_cond_t = 0 ; then AC_MSG_ERROR([Unable to find align of pthread_cond_t (required).]) fi GS_ALIGNOF_COND_T=$ac_cv_alignof_pthread_cond_t AC_SUBST(GS_ALIGNOF_COND_T) else AC_MSG_ERROR([Unable to find pthread.h (needed for thread support).]) fi AC_CHECK_LIB(pthread, pthread_join, pthread_ok=yes, pthread_ok=no) if test $pthread_ok = yes ; then LIBS="$LIBS -lpthread" else case "$target_os" in mingw*) AC_CHECK_LIB(pthreadGC2, pthread_join, pthread_ok=yes, pthread_ok=no) if test $pthread_ok = yes ; then LIBS="$LIBS -lpthreadGC2" fi ;; windows) AC_CHECK_LIB(pthreadVC2, pthread_join, pthread_ok=yes, pthread_ok=no) if test $pthread_ok = yes ; then LIBS="$LIBS -lpthreadVC2" fi ;; nto*|qnx*|*android*) # Android and QNX have pthread in libc instead of libpthread AC_CHECK_LIB(c, pthread_join, pthread_ok=yes, pthread_ok=no) if test $pthread_ok = yes ; then LIBS="$LIBS -lc" fi ;; esac fi if test $pthread_ok = no ; then AC_MSG_ERROR([Unable to find pthread library (needed for thread support).]) fi # Check threading extensions AC_CHECK_FUNCS(pthread_getthreadid_np pthread_main_np) # Typically need librt on Solaris for sched_yield AC_CHECK_LIB(rt, sched_yield) # Check if we can name pthreads AC_CACHE_CHECK([for pthread_setname_np()], gs_cv_pthread_setname_np, [AC_LINK_IFELSE( [AC_LANG_PROGRAM([#include ], [pthread_setname_np("name");])], [gs_cv_pthread_setname_np=darwin], [AC_LINK_IFELSE( [AC_LANG_PROGRAM([#include ], [pthread_setname_np(pthread_self(), "name");])], [gs_cv_pthread_setname_np=glibc], [AC_LINK_IFELSE( [AC_LANG_PROGRAM([#include ], [pthread_setname_np(pthread_self(), "%s", "name");])], [gs_cv_pthread_setname_np=netbsd], [gs_cv_pthread_setname_np=none])])])]) case $gs_cv_pthread_setname_np in darwin) AC_DEFINE(PTHREAD_SETNAME(a), pthread_setname_np(a), [Description: Define set name function for pthread with one arg]) ;; glibc) AC_DEFINE(PTHREAD_SETNAME(a), pthread_setname_np(pthread_self(),a), [Description: Define setname function for pthread with two args]) ;; netbsd) AC_DEFINE(PTHREAD_SETNAME(a), pthread_setname_np(pthread_self(),"%s",a), [Description: Define setname function for pthread with three args]) ;; esac # Check if we have spinlock support AC_CHECK_FUNCS(pthread_spin_lock) fi #-------------------------------------------------------------------- # Check Win32 lock sizes #-------------------------------------------------------------------- if test $HAVE_WIN32_THREADS_AND_LOCKS = 1; then AC_CHECK_SIZEOF(gs_mutex_t,,[AC_INCLUDES_DEFAULT #define GS_USE_WIN32_THREADS_AND_LOCKS 1 #include "Source/GSPThread.h"]) GS_SIZEOF_MUTEX_T=$ac_cv_sizeof_gs_mutex_t if test $ac_cv_sizeof_gs_mutex_t = 0 ; then AC_MSG_ERROR([Unable to find size of gs_mutex_t (required).]) fi AC_SUBST(GS_SIZEOF_MUTEX_T) AC_CHECK_ALIGNOF(gs_mutex_t,[AC_INCLUDES_DEFAULT #define GS_USE_WIN32_THREADS_AND_LOCKS 1 #include "Source/GSPThread.h"]) GS_ALIGNOF_MUTEX_T=$ac_cv_alignof_gs_mutex_t if test $ac_cv_alignof_gs_mutex_t = 0 ; then AC_MSG_ERROR([Unable to find align of gs_mutex_t (required).]) fi AC_SUBST(GS_ALIGNOF_MUTEX_T) AC_CHECK_SIZEOF(CONDITION_VARIABLE,,[AC_INCLUDES_DEFAULT #include ]) GS_SIZEOF_COND_T=$ac_cv_sizeof_CONDITION_VARIABLE if test $ac_cv_sizeof_CONDITION_VARIABLE = 0 ; then AC_MSG_ERROR([Unable to find size of CONDITION_VARIABLE (required).]) fi AC_SUBST(GS_SIZEOF_COND_T) AC_CHECK_ALIGNOF(CONDITION_VARIABLE,[AC_INCLUDES_DEFAULT #include ]) GS_ALIGNOF_COND_T=$ac_cv_alignof_CONDITION_VARIABLE if test $ac_cv_alignof_CONDITION_VARIABLE = 0 ; then AC_MSG_ERROR([Unable to find align of CONDITION_VARIABLE (required).]) fi AC_SUBST(GS_ALIGNOF_COND_T) AC_CHECK_SIZEOF(SRWLOCK,,[AC_INCLUDES_DEFAULT #include ]) GS_SIZEOF_COND_MUTEX_T=$ac_cv_sizeof_SRWLOCK if test $ac_cv_sizeof_SRWLOCK = 0 ; then AC_MSG_ERROR([Unable to find size of SRWLOCK (required).]) fi AC_SUBST(GS_SIZEOF_COND_MUTEX_T) AC_CHECK_ALIGNOF(SRWLOCK,[AC_INCLUDES_DEFAULT #include ]) GS_ALIGNOF_COND_MUTEX_T=$ac_cv_alignof_SRWLOCK if test $ac_cv_alignof_SRWLOCK = 0 ; then AC_MSG_ERROR([Unable to find align of SRWLOCK (required).]) fi AC_SUBST(GS_ALIGNOF_COND_MUTEX_T) fi #-------------------------------------------------------------------- # One of these function needed by NSThread.m and objc initialize test #-------------------------------------------------------------------- AC_CHECK_FUNCS(nanosleep usleep Sleep) AC_MSG_CHECKING(for objc_root_class attribute support) saved_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -Werror $OBJCFLAGS -x objective-c" AC_COMPILE_IFELSE([AC_LANG_SOURCE([ __attribute__((objc_root_class)) @interface RootObject @end @implementation RootObject @end])], AC_MSG_RESULT([found]) gs_objc_root_class_attr=1, AC_MSG_RESULT([not present]) gs_objc_root_class_attr=0 ) GS_HAVE_OBJC_ROOT_CLASS_ATTR=$gs_objc_root_class_attr AC_SUBST(GS_HAVE_OBJC_ROOT_CLASS_ATTR) AC_DEFINE_UNQUOTED(HAVE_OBJC_ROOT_CLASS_ATTRIBUTE,$gs_objc_root_class_attr, [Says whether the objc_root_class attribute works]) CFLAGS=$saved_CFLAGS #-------------------------------------------------------------------- # Check whether we can get the system thread ID #-------------------------------------------------------------------- AC_CACHE_CHECK([for gettid()], ac_cv_gettid, [AC_TRY_RUN(#define _GNU_SOURCE #include #include #include int main(int argc, char **argv) { pid_t t = syscall(SYS_gettid); return t == -1 ? 1 : 0; }, [ac_cv_gettid=yes], [ac_cv_gettid=no], [ac_cv_gettid=no])]) if test "$ac_cv_gettid" = "yes"; then AC_DEFINE(HAVE_GETTID, 1, [Define if you have gettid()]) fi #-------------------------------------------------------------------- # Check whether Objective-C /really/ works #-------------------------------------------------------------------- AC_MSG_CHECKING(whether objc really works) saved_LIBS="$LIBS" saved_CPPFLAGS="$CPPFLAGS" LIBS="$LIBS $LIBOBJC" CPPFLAGS="$CPPFLAGS $OBJCFLAGS -x objective-c" if test x"$objc_threaded" != x""; then LIBS="$LIBS $objc_threaded" fi LIBS="$LIBS $extra_LIBS" AC_CACHE_VAL(gs_cv_objc_works, AC_TRY_RUN([#include "$srcdir/config/config.objc.m"], gs_cv_objc_works=yes, gs_cv_objc_works=no, gs_cv_objc_works="$cross_gs_cv_objc_works") ) if test $gs_cv_objc_works = yes; then AC_MSG_RESULT(yes) else AC_MSG_RESULT(no) echo "I don't seem to be able to use your Objective-C compiler to produce" echo "working binaries! Please check your Objective-C compiler installation." echo "If you are using gcc-3.x make sure that your compiler's libgcc_s and libobjc" echo "can be found by the dynamic linker - usually that requires you to play" echo "with LD_LIBRARY_PATH or /etc/ld.so.conf." echo "Please refer to your compiler installation instructions for more help." AC_MSG_ERROR(The Objective-C compiler does not work or is not installed properly.) fi # Don't revert any Objective-C flags as they are used in the next test #--------------------------------------------------------------------- # See if we are using a compiler which allows us to change the class # to be used for constant strings by using the -fconstant-string-class # option. If that is the case, we change it to NSConstantString. # Unless we are building for the apple runtime (ie only building base # additions library and not implementing a constant string class). #--------------------------------------------------------------------- if test "$OBJC_RUNTIME_LIB" = "nx" -o "$OBJC_RUNTIME_LIB" = "apple"; then NX_CONST_STRING_OBJCFLAGS="" NX_CONST_STRING_CLASS=NXConstantString else strclass_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -fconstant-string-class=FooConstantString" AC_MSG_CHECKING(if the compiler supports -fconstant-string-class) AC_CACHE_VAL(gs_cv_objc_compiler_supports_constant_string_class, AC_TRY_RUN([#include "$srcdir/config/config.constant-string-class.m"], gs_cv_objc_compiler_supports_constant_string_class=yes, gs_cv_objc_compiler_supports_constant_string_class=no, gs_cv_objc_compiler_supports_constant_string_class="$cross_gs_cv_objc_compiler_supports_constant_string_class") ) if test $gs_cv_objc_compiler_supports_constant_string_class = yes; then NX_CONST_STRING_OBJCFLAGS="-fconstant-string-class=NSConstantString" NX_CONST_STRING_CLASS=NSConstantString AC_MSG_RESULT(yes) else AC_MSG_RESULT(no) AC_ARG_ENABLE(nxconstantstring, [ --enable-nxconstantstring Enables the use of the NXConstantString class for old compilers.],, enable_nxconstantstring=no) if test $enable_nxconstantstring = yes; then NX_CONST_STRING_OBJCFLAGS="" NX_CONST_STRING_CLASS=NXConstantString AC_MSG_WARN([You have enabled the use of NXConstantString as the string class in gnustep-base. The objective-c runtime library typically implements its own class of the same name, so you must either enforce a link order which ensures that the gnustep-base implementation is used, or (better) you must remove the class from the runtime library!]) else AC_MSG_ERROR([Your compiler does not appear to implement the -fconstant-string-class option needed for support of strings. Please check for a more recent version or consider using --enable-nxconstantstring]) fi fi CPPFLAGS="$strclass_CPPFLAGS" fi AC_SUBST(NX_CONST_STRING_OBJCFLAGS) AC_SUBST(NX_CONST_STRING_CLASS) # Don't revert any Objective-C flags as they are used in the next test #--------------------------------------------------------------------- # Guess if we are using a compiler which has the (GNU extension) +load # method which is executed before main. # Defines HAVE_LOAD_METHOD if +load methods are called before main. # Needed by NSProcessInfo.m #--------------------------------------------------------------------- AC_MSG_CHECKING(if +load method is executed before main) AC_CACHE_VAL(gs_cv_objc_load_method_worked, AC_TRY_RUN([#include "$srcdir/config/config.loadtest.m"], gs_cv_objc_load_method_worked=yes, gs_cv_objc_load_method_worked=no, gs_cv_objc_load_method_worked="$cross_gs_cv_objc_load_method_worked") ) if test $gs_cv_objc_load_method_worked = yes; then AC_DEFINE(HAVE_LOAD_METHOD,1, [Define if your Obj-C compiler calls +load methods before main]) AC_MSG_RESULT(yes) else AC_MSG_RESULT(no) fi # Don't revert any Objective-C flags as they are used in the next test #-------------------------------------------------------------------- # Check for thread synchronisation support in runtime #-------------------------------------------------------------------- if test "$host_os" = windows -a "$OBJC_RUNTIME_LIB" = "ng"; then # On Windows MSVC, AC_CHECK_FUNCS() will throw linker errors ("relocation # against symbol in discarded section") as the file won't contain any actual # ObjC code, so we just assume the function is there. AC_MSG_NOTICE([assuming objc_sync_enter() on Windows MSVC]) OBJCSYNC=1 else AC_CHECK_FUNCS(objc_sync_enter) if test $ac_cv_func_objc_sync_enter = yes ; then OBJCSYNC=1 else OBJCSYNC=0 if test "$OBJC_RUNTIME_LIB" = "ng"; then AC_MSG_ERROR([The objc runtime library does not appear to have synchronisation support. Try re-configuring gnustep-make with a CPPFLAGS variable containing a -L point to specify the directory containing the correct libobjc, or using the --with-objc-lib-flag=... option.]) fi fi fi AC_SUBST(OBJCSYNC) # Don't revert any Objective-C flags as they are used in the next test #-------------------------------------------------------------------- # Check for ObjC2 support in runtime #-------------------------------------------------------------------- if test "$cross_compiling" = "yes"; then AC_MSG_NOTICE(["Cross compiling! Using predefined OBJC2RUNTIME variable"]) OBJC2RUNTIME="$cross_objc2_runtime" elif test "$host_os" = windows -a "$OBJC_RUNTIME_LIB" = "ng"; then # On Windows MSVC, AC_CHECK_FUNCS() will throw linker errors ("relocation # against symbol in discarded section") as the file won't contain any actual # ObjC code, so we just assume the function is there. AC_MSG_NOTICE([assuming objc_setProperty() on Windows MSVC]) OBJC2RUNTIME=1 else AC_CHECK_FUNCS(objc_setProperty) if test $ac_cv_func_objc_setProperty = yes ; then OBJC2RUNTIME=1 else OBJC2RUNTIME=0 if test "$OBJC_RUNTIME_LIB" = "ng"; then AC_MSG_ERROR([The objc runtime library does not appear to have property support. Try re-configuring gnustep-make with a CPPFLAGS variable containing a -L point to specify the directory containing the correct libobjc, or using the --with-objc-lib-flag=... option.]) fi fi fi AC_SUBST(OBJC2RUNTIME) #-------------------------------------------------------------------- # Check for blocks support in runtime #-------------------------------------------------------------------- if test "$host_os" = windows -a "$OBJC_RUNTIME_LIB" = "ng"; then # On Windows MSVC, AC_CHECK_FUNCS() will throw linker errors ("relocation # against symbol in discarded section") as the file won't contain any actual # ObjC code, so we just assume the function is there. AC_MSG_NOTICE([assuming _Block_copy() on Windows MSVC]) HAVE_BLOCKS=1 else AC_CHECK_FUNCS(_Block_copy) if test $ac_cv_func__Block_copy = yes ; then HAVE_BLOCKS=1 else HAVE_BLOCKS=0 if test "$OBJC_RUNTIME_LIB" = "ng"; then AC_MSG_ERROR([The objc runtime library does not appear to have blocks support. Try re-configuring gnustep-make with a CPPFLAGS variable containing a -L point to specify the directory containing the correct libobjc, or using the --with-objc-lib-flag=... option.]) fi fi fi AC_SUBST(HAVE_BLOCKS) # Don't revert any Objective-C flags as they are used in the next test GS_NONFRAGILE=0 if test "$nonfragile" = "yes"; then if test "$host_os" = windows -a "$OBJC_RUNTIME_LIB" = "ng"; then # On Windows MSVC, AC_CHECK_FUNCS() will throw linker errors ("relocation # against symbol in discarded section") as the file won't contain any actual # ObjC code, so we just assume the function is there. AC_MSG_NOTICE([assuming non-fragile-abi support on Windows MSVC]) GS_NONFRAGILE=1 else saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $OBJCFLAGS -x objective-c" AC_MSG_CHECKING(for non-fragile-abi support) AC_RUN_IFELSE([AC_LANG_SOURCE( [[#include "$srcdir/config/config.non-fragile-ivars.m"]])], non_fragile=yes, non_fragile=no, non_fragile="$cross_non_fragile") CPPFLAGS="$saved_CPPFLAGS" if test $non_fragile = yes; then GS_NONFRAGILE=1 fi AC_MSG_RESULT($non_fragile) fi fi AC_SUBST(GS_NONFRAGILE) # Don't revert any Objective-C flags as they are used in the next test #-------------------------------------------------------------------- # get_uninstalled_dtable used by behavior.m and objc-load.m #-------------------------------------------------------------------- AC_EGREP_HEADER(objc_get_uninstalled_dtable, objc/objc-api.h, AC_DEFINE(HAVE_OBJC_GET_UNINSTALLED_DTABLE,1, [ Define if objc-api.h defines this function]),) # Don't revert any Objective-C flags as they are used in the next test #-------------------------------------------------------------------- # Native Objective-C exceptions #-------------------------------------------------------------------- if test "$OBJC_RUNTIME_LIB" = "ng"; then exceptions=yes else # Determine if native Objective-C exceptions are enabled # in gnustep-make. They are enabled if the compiler supports it; they # are disabled if it doesn't. And, of course, the user may have # forced one behaviour or the other. Note that we go and look at the # actual config.make file to be able to know what was configured in # gnustep-make regardless of any gnustep-base that is currently # installed. We can't use `gnustep-config --objc-flags` because that # may report native exceptions as disabled because the currently # installed gnustep-base has them disabled. if grep USE_OBJC_EXCEPTIONS $CURRENT_GNUSTEP_MAKEFILES/$lobj_dir/config.make | grep yes >&5 2>&5; then exceptions=yes else exceptions=no fi fi # At this point, if exceptions=no, then native exceptions are disabled # and won't be used. If exceptions=yes, we need to check if they work # and if the runtime has proper support for them. If it does, we'll # happily use them; if it doesn't, we'll automatically disable them # because they don't work. ;-) #-------------------------------------------------------------------- # One of these is needed by for handling uncaught exceptions #-------------------------------------------------------------------- # TODO: These checks are not really needed if native exceptions are # disabled. So maybe we should not run them at all in that case. On # the other hand, that case is going to become more and more unusual. AC_MSG_CHECKING(for objc_setUncaughtExceptionHandler() in runtime) AC_LINK_IFELSE([AC_LANG_SOURCE( [[#include "$srcdir/config/config.setUncaughtExceptionHandler.m"]])], have_set_uncaught_exception_handler=yes, have_set_uncaught_exception_handler=no) if test $have_set_uncaught_exception_handler = yes; then AC_DEFINE(HAVE_SET_UNCAUGHT_EXCEPTION_HANDLER,1, [Define if libobjc has the objc_setUncaughtExceptionHandler() function]) fi AC_MSG_RESULT($have_set_uncaught_exception_handler) # Don't revert any Objective-C flags as they are used in the next test AC_MSG_CHECKING(for objc_set_unexpected() in runtime) AC_LINK_IFELSE( [AC_LANG_SOURCE([[#include "$srcdir/config/config.set_unexpected.m"]])], have_set_unexpected=yes, have_set_unexpected=no) if test $have_set_unexpected = yes; then AC_DEFINE(HAVE_SET_UNEXPECTED,1, [Define if libobjc has the objc_set_unexpected() function]) fi AC_MSG_RESULT($have_set_unexpected) # Don't revert any Objective-C flags as they are used in the next test AC_MSG_CHECKING(for _objc_unexpected_exception in runtime) if test "$host_os" = windows -a "$OBJC_RUNTIME_LIB" = "ng"; then # On Windows MSVC, AC_CHECK_FUNCS() will throw linker errors ("relocation # against symbol in discarded section") as the file won't contain any actual # ObjC code, so we just assume the function is there. AC_MSG_NOTICE([assuming _objc_unexpected_exception() on Windows MSVC]) have_unexpected=yes else AC_RUN_IFELSE( [AC_LANG_SOURCE([[#include "$srcdir/config/config.unexpected.m"]])], have_unexpected=yes, have_unexpected=no, have_unexpected="$cross_have_unexpected") fi if test $have_unexpected = yes; then AC_DEFINE(HAVE_UNEXPECTED,1, [Define if libobjc has the _objc_unexpected_exception callback]) fi AC_MSG_RESULT($have_unexpected) # TODO: It would also be nice to actually test that native Objective-C # exceptions work. if test "$exceptions" = "yes"; then if test x"$have_set_uncaught_exception_handler" = x"no"; then if test x"$have_set_unexpected" = x"no"; then if test x"$have_unexpected" = x"no"; then AC_MSG_NOTICE([Disabling native Objective-C exceptions because the ObjC runtime]) AC_MSG_NOTICE([has no way to set an uncaught exception handler. Please install]) AC_MSG_NOTICE([a recent Objective-C runtime if you want to use them.]) exceptions="no"; fi fi fi fi AC_MSG_CHECKING(whether to enable native Objective-C exceptions) if test "$exceptions" = "yes"; then AC_MSG_RESULT(yes) BASE_NATIVE_OBJC_EXCEPTIONS=1 else AC_MSG_RESULT(no) BASE_NATIVE_OBJC_EXCEPTIONS=0 fi AC_SUBST(BASE_NATIVE_OBJC_EXCEPTIONS) # Don't revert any Objective-C flags as they are used in the next test #-------------------------------------------------------------------- # Function needed by @synchronize directive #-------------------------------------------------------------------- HAVE_OBJC_SYNC_ENTER=no if test "$host_os" = windows -a "$OBJC_RUNTIME_LIB" = "ng"; then # On Windows MSVC, AC_CHECK_FUNCS() will throw linker errors ("relocation # against symbol in discarded section") as the file won't contain any actual # ObjC code, so we just assume the function is there. AC_MSG_NOTICE([assuming objc_sync_enter() on Windows MSVC]) HAVE_OBJC_SYNC_ENTER=yes else AC_CHECK_FUNCS(objc_sync_enter) if test $ac_cv_func_objc_sync_enter = yes ; then HAVE_OBJC_SYNC_ENTER=yes fi fi AC_SUBST(HAVE_OBJC_SYNC_ENTER) # Don't revert any Objective-C flags as they are used in the next test AC_MSG_CHECKING(for thread-safe +initialize in runtime) AC_RUN_IFELSE( [AC_LANG_SOURCE([[#include "$srcdir/config/config.initialize.m"]])], safe_initialize=yes, safe_initialize=no, safe_initialize="$cross_safe_initialize") if test $safe_initialize = yes; then AC_DEFINE(HAVE_INITIALIZE,1, [Define if libobjc has thread-safe +initialize support]) else AC_MSG_WARN([Your ObjectiveC runtime does not support thread-safe class initialisation. Please use a different runtime if you intend to use threads.]) fi AC_MSG_RESULT($safe_initialize) LIBS="$saved_LIBS" CPPFLAGS="$saved_CPPFLAGS" AC_SUBST(OBJCFLAGS) #-------------------------------------------------------------------- # Generic settings needed by NSZone.m #-------------------------------------------------------------------- AC_TYPE_SIZE_T AC_C_INLINE #-------------------------------------------------------------------- # Following header checks needed for bzero in Storage.m and other places #-------------------------------------------------------------------- AC_HEADER_STDC AC_CHECK_HEADERS(string.h memory.h alloca.h) #-------------------------------------------------------------------- # Following header check needed NSConnection.h #-------------------------------------------------------------------- AC_CHECK_HEADERS(float.h) #-------------------------------------------------------------------- # Header files and functions for files and filesystems #-------------------------------------------------------------------- AC_CHECK_HEADERS(sys/stat.h sys/vfs.h sys/statfs.h sys/statvfs.h pwd.h grp.h) AC_CHECK_HEADERS(sys/cdefs.h sys/syslimits.h sys/param.h) # Twisted header checks for some BSDs with stupid interdependencies AC_CHECK_HEADERS([sys/syslimits.h], [], [], [#if HAVE_SYS_CDEFS_H #include #endif #include ]) AC_CHECK_HEADERS([sys/param.h], [], [], [#if HAVE_SYS_CDEFS_H #include #endif #if HAVE_SYS_SYSLIMITS_H #include #endif ]) AC_CHECK_HEADERS([sys/mount.h], [], [], [#if HAVE_SYS_CDEFS_H #include #endif #if HAVE_SYS_SYSLIMITS_H #include #endif #if HAVE_SYS_PARAM_H #include #endif ]) AC_CHECK_HEADERS(sys/types.h windows.h locale.h langinfo.h) saved_LIBS="$LIBS" AC_CHECK_LIB(m, main) AC_CHECK_FUNCS(utimensat statvfs link symlink readlink geteuid getlogin getpwnam getpwnam_r getpwuid getpwuid_r getgrgid getgrgid_r getgrnam getgrnam_r rint getopt malloc_usable_size) LIBS="$saved_LIBS" AC_CACHE_CHECK([for pw_gecos field in struct passwd], ac_cv_have_pw_gecos_in_struct_passwd, [ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include ]], [[ struct passwd p; p.pw_gecos = 0; ]])], [ ac_cv_have_pw_gecos_in_struct_passwd="yes" ], [ ac_cv_have_pw_gecos_in_struct_passwd="no" ]) ]) if test "x$ac_cv_have_pw_gecos_in_struct_passwd" = "xyes" ; then AC_DEFINE([HAVE_PW_GECOS_IN_PASSWD], [1], [Define if you have pw_gecos field in struct passwd]) fi AC_CACHE_CHECK([for currency_symbol field in struct lconv], ac_cv_have_currency_symbol_in_struct_lconv, [ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include ]], [[ struct lconv l; l.currency_symbol = NULL; ]])], [ ac_cv_have_currency_symbol_in_struct_lconv="yes" ], [ ac_cv_have_currency_symbol_in_struct_lconv="no" ]) ]) if test "x$ac_cv_have_currency_symbol_in_struct_lconv" = "xyes" ; then AC_DEFINE([HAVE_CURRENCY_SYMBOL_IN_LCONV], [1], [Define if you have currency_symbol field in struct lconv]) fi #-------------------------------------------------------------------- # These two headers (functions) needed by Time.m #-------------------------------------------------------------------- dnl AC_REPLACE_FUNCS(getrusage gettimeofday) AC_CHECK_HEADERS(time.h sys/time.h tzfile.h sys/rusage.h ucbinclude/sys/resource.h) AC_CHECK_FUNCS(time ctime tzset) #-------------------------------------------------------------------- # These headers/functions needed by GSTcpPort.m #-------------------------------------------------------------------- AC_CHECK_HEADERS(sys/socket.h netinet/in.h) AC_CHECK_TYPES([socklen_t]) dnl AC_REPLACE_FUNCS(recvfrom) #-------------------------------------------------------------------- # These headers/functions needed for stacktrace in NSException.m #-------------------------------------------------------------------- AC_ARG_ENABLE(bfd, [ --enable-bfd Enables the use of libbfd to provide symbolic stack traces. Enabling this option provides support for symbolic stack traces on platforms where the backtrace_symbols() function is not available or does not work properly. Enabling this option also has the effect of changing the license of gnustep-base from LGPL to GPL since libbfd uses the GPL license],, enable_bfd=no) if test $enable_bfd = yes ; then AC_DEFINE(USE_BFD,1, [Define to use bfd library for stack traces]) AC_MSG_WARN([You enabled bfd, which causes gnustep-base to link with libbfd. This makes the license GPL rather than the normal LGPL.]) fi AC_CHECK_HEADERS(bfd.h) AC_CHECK_LIB(intl, libintl_fprintf) AC_CHECK_LIB(iberty, dyn_string_append) AC_CHECK_LIB(z, gzseek) AC_CHECK_LIB(bfd, bfd_openr) AC_TRY_COMPILE([ #include ], [bfd_section_vma(0);], bfd_section_vma=1, bfd_section_vma=0) if test $bfd_section_vma = 1; then AC_MSG_RESULT([bfd_section_vma found]) AC_DEFINE([HAVE_BFD_SECTION_VMA], [1], [Have bfd_section_vma]) fi case "$target_os" in mingw*) AC_CHECK_HEADERS(dbghelp.h) ;; *) AC_CHECK_HEADERS(execinfo.h) AC_CHECK_FUNCS(backtrace) ;; esac AC_CHECK_FUNCS(__builtin_extract_return_address) # Enable unwind if found by default AC_ARG_WITH(unwind, AS_HELP_STRING([--without-unwind], [Ignore unwind if found and disable it])) AS_IF([test "x$with_unwind" != "xno"], [AC_CHECK_HEADERS(unwind.h)] [AC_CHECK_FUNCS(_Unwind_GetIP)], [have_unwind=no]) AS_IF([test "x$ac_cv_func__Unwind_GetIP" = "xyes"], [have_unwind=yes], [have_unwind=no]) AS_IF([test "x$have_unwind" = "xyes"], [AC_DEFINE([WITH_UNWIND], [1], [Have and use Unwind library])], [AS_IF([test "x$with_unwind" = "xyes"], [AC_MSG_ERROR([unwind requested but not found]) ]) ]) #-------------------------------------------------------------------- # These headers/functions needed by NSLog.m #-------------------------------------------------------------------- AC_CHECK_HEADERS(syslog.h sys/slog.h sys/slogcodes.h) AC_CHECK_FUNCS(syslog) if test "$ac_cv_header_sys_slog_h" = "yes"; then oldLibs="$LIBS"; LIBS="$LIBS -l:libc.a"; AC_CHECK_FUNCS(slogf) if test "$ac_cv_func_slogf" = "no"; then LIBS="$oldLibs" fi fi #-------------------------------------------------------------------- # These headers/functions needed by NSRunLoop.m #-------------------------------------------------------------------- AC_CHECK_HEADERS(poll.h) AC_CHECK_FUNCS(poll) have_poll=no if test $ac_cv_header_poll_h = yes; then have_poll=yes AC_MSG_CHECKING(for poll emulation) AC_EGREP_CPP(emulating_poll, [#include "config/config.poll.c"], have_poll=no,) if test $have_poll = yes; then AC_MSG_RESULT(no) AC_MSG_CHECKING([if poll supports devices]) AC_TRY_RUN([#include "$srcdir/config/config.poll-dev.c"i], ,have_poll=no, have_poll="$cross_have_poll" ) if test $have_poll = yes; then AC_MSG_RESULT(yes) AC_DEFINE(HAVE_POLL_F,1, [ Define if poll is NOT emulated via select]) else AC_MSG_RESULT(no) fi else AC_MSG_RESULT(yes) fi fi #-------------------------------------------------------------------- # This function needed by StdioStream.m #-------------------------------------------------------------------- AC_CHECK_FUNCS(vsprintf vasprintf snprintf vsnprintf) if test $ac_cv_func_vsprintf = yes ; then AC_TRY_RUN([#include "$srcdir/config/config.vsprintf.c"], VSPRINTF_RETURNS_LENGTH=1, VSPRINTF_RETURNS_LENGTH=0, VSPRINTF_RETURNS_LENGTH="$cross_VSPRINTF_RETURNS_LENGTH") AC_DEFINE_UNQUOTED(VSPRINTF_RETURNS_LENGTH, $VSPRINTF_RETURNS_LENGTH, [Define if vsprintf returns the length printed]) fi if test $ac_cv_func_vasprintf = yes ; then AC_TRY_RUN([#include "$srcdir/config/config.vasprintf.c"], VASPRINTF_RETURNS_LENGTH=1, VASPRINTF_RETURNS_LENGTH=0, VASPRINTF_RETURNS_LENGTH="$cross_VASPRINTF_RETURNS_LENGTH") AC_DEFINE_UNQUOTED(VASPRINTF_RETURNS_LENGTH, $VASPRINTF_RETURNS_LENGTH, [Define if vasprintf returns the length printed]) fi #-------------------------------------------------------------------- # This function needed by NSFileManager.m #-------------------------------------------------------------------- AC_CHECK_FUNCS(getcwd) AC_HEADER_DIRENT # Look for file creation and modification date on NetBSD, FreeBSD, Darwin AC_CHECK_MEMBERS([struct stat.st_mtim, struct stat.st_birthtime, struct stat.st_birthtimespec, struct stat.st_birthtim, struct stat64.st_birthtimespec], ,,[#include ]) #-------------------------------------------------------------------- # This function needed by gdomap.c #-------------------------------------------------------------------- AC_CHECK_HEADERS(getopt.h) #-------------------------------------------------------------------- # This function needed by NSPage.m #-------------------------------------------------------------------- AC_CHECK_FUNCS(posix_memalign valloc) #-------------------------------------------------------------------- # This function needed by Time.m #-------------------------------------------------------------------- AC_CHECK_FUNCS(times) #-------------------------------------------------------------------- # These functions needed by NSData.m and GSFFIInvocation.m #-------------------------------------------------------------------- AC_CHECK_FUNCS(mkstemp) AC_CHECK_FUNCS(shmctl) AC_CHECK_FUNCS(mmap) AC_CHECK_FUNCS(mprotect) AC_CHECK_HEADERS(sys/mman.h) #-------------------------------------------------------------------- # These functions needed by NSTask.m #-------------------------------------------------------------------- AC_CHECK_FUNCS(killpg setpgrp setpgid setsid grantpt) if test "x$ac_cv_func_setpgrp" = xyes; then AC_FUNC_SETPGRP fi HAVE_PTS_STREAM_MODULES=0 case "${target}" in *-sysv-*) HAVE_PTS_STREAM_MODULES=1 ;; esac AC_DEFINE_UNQUOTED(HAVE_PTS_STREAM_MODULES, $HAVE_PTS_STREAM_MODULES, [Define this if you work on sysv]) AC_SUBST(HAVE_PTS_STREAM_MODULES) AC_CHECK_HEADERS(dnl fcntl.h dnl inttypes.h dnl libc.h dnl limits.h dnl malloc.h dnl memory.h dnl signal.h dnl stdint.h dnl string.h dnl sys/fcntl.h dnl sys/file.h dnl sys/filio.h dnl sys/inttypes.h dnl sys/ioctl.h dnl sys/signal.h dnl sys/stropts.h dnl sys/wait.h dnl unistd.h dnl utime.h dnl stdlib.h dnl stdbool.h dnl ) if test $ac_cv_header_inttypes_h = yes; then INCLUDE_INTTYPES="#include " elif test $ac_cv_header_sys_inttypes_h = yes; then INCLUDE_INTTYPES="#include " elif test $ac_cv_header_stdint_h = yes; then INCLUDE_INTTYPES="#include " else INCLUDE_INTTYPES="no" fi if test "$INCLUDE_INTTYPES" = "no"; then INCLUDE_INTTYPES="" DEFINE_INT8_T="#define int8_t gss8" DEFINE_UINT8_T="#define uint8_t gsu8" DEFINE_INT16_T="#define int16_t gss16" DEFINE_UINT16_T="#define uint16_t gsu16" DEFINE_INT32_T="#define int32_t gss32" DEFINE_UINT32_T="#define uint32_t gsu32" DEFINE_INT64_T="#define int64_t gss64" DEFINE_UINT64_T="#define uint64_t gsu64" DEFINE_INTPTR_T="#define intptr_t gssaddr" DEFINE_UINTPTR_T="#define uintptr_t gsuaddr" else DEFINE_INT8_T="" DEFINE_UINT8_T="" DEFINE_INT16_T="" DEFINE_UINT16_T="" DEFINE_INT32_T="" DEFINE_UINT32_T="" DEFINE_INT64_T="" DEFINE_UINT64_T="" DEFINE_INTPTR_T="" DEFINE_UINTPTR_T="" fi AC_SUBST(INCLUDE_INTTYPES) AC_SUBST(DEFINE_INT8_T) AC_SUBST(DEFINE_UINT8_T) AC_SUBST(DEFINE_INT16_T) AC_SUBST(DEFINE_UINT16_T) AC_SUBST(DEFINE_INT32_T) AC_SUBST(DEFINE_UINT32_T) AC_SUBST(DEFINE_INT64_T) AC_SUBST(DEFINE_UINT64_T) AC_SUBST(DEFINE_INTPTR_T) AC_SUBST(DEFINE_UINTPTR_T) #-------------------------------------------------------------------- # These used by GSFileHandle.m and distributed objects # On some systems we need -lnsl ... so check for that case. #-------------------------------------------------------------------- AC_CHECK_HEADERS(ws2tcpip.h) AC_SEARCH_LIBS([inet_ntop],[nsl Ws2_32]) AC_CHECK_FUNCS(gethostbyaddr_r inet_aton inet_pton inet_ntop sigaction) USE_ZLIB=0 AC_CHECK_HEADERS(zlib.h) if test $ac_cv_header_zlib_h = yes; then AC_CHECK_LIB(z, gzseek, zlib_ok=yes, zlib_ok=no) if test "$zlib_ok" = yes; then LIBS="$LIBS -lz" USE_ZLIB=1 fi fi AC_SUBST(USE_ZLIB) HAVE_INET_PTON=no if test $ac_cv_func_inet_pton = yes ; then HAVE_INET_PTON=yes fi AC_SUBST(HAVE_INET_PTON) HAVE_INET_NTOP=no if test $ac_cv_func_inet_ntop = yes ; then HAVE_INET_NTOP=yes fi AC_SUBST(HAVE_INET_NTOP) #-------------------------------------------------------------------- # For setting thread stack size #-------------------------------------------------------------------- AC_CHECK_HEADERS(sys/resource.h) AC_CHECK_FUNCS(setrlimit) #-------------------------------------------------------------------- # One of these functions needed by NSDebug.m and NSProcessInfo.m #-------------------------------------------------------------------- AC_CHECK_FUNCS(strerror) AC_FUNC_STRERROR_R #-------------------------------------------------------------------- # Needed by NSDebug.m #-------------------------------------------------------------------- AC_CHECK_FUNCS(sigsetjmp) #-------------------------------------------------------------------- # This type needed by GSFormat #-------------------------------------------------------------------- AC_CHECK_TYPES([uintmax_t]) AC_CHECK_HEADERS(wchar.h) #-------------------------------------------------------------------- # Check if short and int values need to be word aligned #-------------------------------------------------------------------- saved_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -O0" AC_MSG_CHECKING(short/int needs to be word aligned) AC_TRY_RUN([#include "$srcdir/config/config.align.c"], NEED_WORD_ALIGNMENT=0, NEED_WORD_ALIGNMENT=1, NEED_WORD_ALIGNMENT="$cross_NEED_WORD_ALIGNMENT") CFLAGS="$saved_CFLAGS" AC_DEFINE_UNQUOTED(NEED_WORD_ALIGNMENT, $NEED_WORD_ALIGNMENT, [Define if your system needs to have short/int word aligned]) if test $NEED_WORD_ALIGNMENT = 1; then AC_MSG_RESULT(yes) else AC_MSG_RESULT(no) fi #-------------------------------------------------------------------- # This needed by NSString for handling of %@ printf directive. #-------------------------------------------------------------------- AC_CHECK_FUNCS(register_printf_specifier) AC_CHECK_FUNC(register_printf_function, register_printf=1, register_printf=0) if test $register_printf = 1; then AC_TRY_RUN([#include "$srcdir/config/config.printf.c"], working_register_printf=1, working_register_printf=0, working_register_printf="$cross_working_register_printf") if test $working_register_printf = 1; then AC_DEFINE(HAVE_REGISTER_PRINTF_FUNCTION,1, [Define if you have the register_printf_function function]) AC_TRY_RUN([#include "$srcdir/config/config.wprintf.c"], wide_register_printf=1, wide_register_printf=0, wide_register_printf="$cross_wide_register_printf") if test $wide_register_printf = 1; then AC_DEFINE(HAVE_WIDE_PRINTF_FUNCTION,1, [Define if register_printf_function supports wide characters]) fi fi fi #-------------------------------------------------------------------- # This function needed by NSString. #-------------------------------------------------------------------- AC_CHECK_FUNCS(realpath) #-------------------------------------------------------------------- # Check if the C Library defines extern char *program_invocation_name # Used in critical cases by NSProcessInfo.m #-------------------------------------------------------------------- AC_MSG_CHECKING(program_invocation_name in C Library) AC_CACHE_VAL(gs_cv_program_invocation_name_worked, [AC_TRY_RUN([ #include int main (int argc, char *argv[]) { extern char *program_invocation_name; return (strcmp (program_invocation_name, argv[0])); } ], gs_cv_program_invocation_name_worked=yes, gs_cv_program_invocation_name_worked=no, gs_cv_program_invocation_name_worked="$cross_gs_cv_program_invocation_name_worked")]) if test $gs_cv_program_invocation_name_worked = yes; then AC_DEFINE(HAVE_PROGRAM_INVOCATION_NAME,1, [Define if your Lib C defines program_invocation_name]) AC_MSG_RESULT(yes) else AC_MSG_RESULT(no) fi #-------------------------------------------------------------------- # Check for uname header used by NSProcessInfo.m #-------------------------------------------------------------------- AC_CHECK_HEADERS(sys/utsname.h) #-------------------------------------------------------------------- # Check for sysctlbyname used by NSProcessInfo.m #-------------------------------------------------------------------- AC_CHECK_HEADERS(sys/sysctl.h) AC_CHECK_FUNCS(sysctlbyname) #-------------------------------------------------------------------- # Defines HAVE_PROCFS if the kernel supports the /proc filesystem. # Needed by NSProcessInfo.m #-------------------------------------------------------------------- AC_CHECK_HEADERS(procfs.h) AC_SYS_PROCFS AC_SYS_PROCFS_PSINFO AC_SYS_PROCFS_EXE_LINK #-------------------------------------------------------------------- # Check if /proc/$$/cmdline terminates the last argument with a nul #-------------------------------------------------------------------- AC_MSG_CHECKING(/proc/$$/cmdline terminated by nul) AC_TRY_RUN([#include "$srcdir/config/config.proccmd.c"], CMDLINE_TERMINATED=1, CMDLINE_TERMINATED=0, CMDLINE_TERMINATED="$cross_CMDLINE_TERMINATED") AC_DEFINE_UNQUOTED(CMDLINE_TERMINATED, $CMDLINE_TERMINATED, [Define if your system terminates the final argument in /proc/$$/cmdline]) if test $CMDLINE_TERMINATED = 1; then AC_MSG_RESULT(yes) else AC_MSG_RESULT(no) fi #-------------------------------------------------------------------- # If /proc doesn't work, try kvm (on FreeBSD, for instance) #-------------------------------------------------------------------- have_kvm_env=0 save_LIBS="$LIBS" AC_CHECK_LIB(kvm, kvm_getenvv) if test "$ac_cv_lib_kvm_kvm_getenvv" = yes; then AC_MSG_CHECKING(if we can access kernel memory) AC_TRY_RUN([#include "$srcdir/config/config.kvmopen.c"], have_kvm_env=1, have_kvm_env=0, have_kvm_env="$cross_have_kvm_env") if test $have_kvm_env = 1; then AC_MSG_RESULT(yes) AC_DEFINE(HAVE_KVM_ENV, 1, [Define if you can access the kernel via kvm_open]) else AC_MSG_RESULT(no) # Reset LIBS since we don't need kvm LIBS="$save_LIBS" fi fi #-------------------------------------------------------------------- # Include redefinition of main () only if needed. # On some systems - force redefinition to be used as the /proc stuff # doesn't work. Allow NSProcessInfo initialization method also. #-------------------------------------------------------------------- PASS_ARG=no case "$target_os" in cygwin*) PASS_ARG=yes;; esac AC_MSG_CHECKING(use of pass-through arguments) AC_ARG_ENABLE(pass-arguments, [ --enable-pass-arguments Force user main call to NSProcessInfo initialize],, enable_pass_arguments=$PASS_ARG) if test "$enable_pass_arguments" = "yes"; then GS_PASS_ARGUMENTS=1 else GS_PASS_ARGUMENTS=0 fi AC_SUBST(GS_PASS_ARGUMENTS) AC_MSG_RESULT($enable_pass_arguments) AC_MSG_CHECKING(use of fake-main definition) AC_ARG_ENABLE(fake-main, [ --enable-fake-main Force redefine of user main function],, enable_fake_main=no) if test "$enable_pass_arguments" = "no"; then case "$target_os" in freebsd2*) enable_fake_main=yes;; freebsd*) ;; kfreebsd*) enable_fake_main=yes;; netbsd*) enable_fake_main=yes;; openbsd*) enable_fake_main=yes;; *sysv*) enable_fake_main=yes;; esac fi GS_FAKE_MAIN=0 if test "$enable_fake_main" = "yes"; then GS_FAKE_MAIN=1 elif test "$enable_pass_arguments" = "no"; then if test "$gs_cv_objc_load_method_worked" = yes -a \( "$ac_cv_sys_procfs" = yes -o "$have_kvm_env" = 1 -o "$ac_cv_sys_procfs_psinfo" = yes \); then GS_FAKE_MAIN=0 if test "$have_kvm_env" = "1"; then AC_MSG_WARN([Using libkvm which is known to be buggy on some systems consider configuring with --enable-fake-main instead.]) fi else case "$target_os" in darwin* ) ;; * ) GS_FAKE_MAIN=1 enable_fake_main=yes esac fi fi case "$target_os" in mingw*|windows) enable_fake_main=no; GS_FAKE_MAIN=0;; esac AC_SUBST(GS_FAKE_MAIN) AC_MSG_RESULT($enable_fake_main) #-------------------------------------------------------------------- # Simple way to add a bunch of paths to the flags #-------------------------------------------------------------------- AC_ARG_WITH(include-flags, [ --with-include-flags=FLAGS Specify all include flags at once], include_flags="$withval", include_flags="no") if test ${include_flags} != "no"; then CPPFLAGS="$CPPFLAGS ${include_flags}" INCLUDE_FLAGS="$INCLUDE_FLAGS ${include_flags}" fi AC_ARG_WITH(library-flags, [ --with-library-flags=FLAGS Specify all library flags at once], library_flags="$withval", library_flags="no") if test ${library_flags} != "no"; then LDFLAGS="$LDFLAGS ${library_flags}" LDIR_FLAGS="$LDIR_FLAGS ${library_flags}" fi #-------------------------------------------------------------------- # Check for FFI interface libraries for invocations # We enable ffi by default now, as it's the only well supported # library nowadays. #-------------------------------------------------------------------- do_broken_libffi=no do_broken_libffcall=no do_enable_libffi=yes do_enable_libffcall=no case "$target_cpu" in sparc64*) case "$target_os" in solaris*) do_broken_libffcall=yes; do_enable_libffi=yes; do_enable_libffcall=no;; *) ;; esac ;; *) ;; esac if test "$exceptions" = "yes"; then # ffcall will mess up native exceptions, so we must disable it. do_broken_libffcall=yes do_enable_libffcall=no fi AC_ARG_ENABLE(libffi, [ --disable-libffi Disable use of libffi library],, enable_libffi=$do_enable_libffi) AC_ARG_ENABLE(ffcall, [ --enable-ffcall Enable use of the deprecated ffcall library],, enable_ffcall=$do_enable_libffcall) if test $enable_ffcall = yes; then AC_MSG_WARN([ffcall has been enabled ... this is deprecated ... please install and use a recent libffi if possible]) fi AC_ARG_ENABLE(invocations, [ --disable-invocations Build even if invocation-dependencies are not met],, enable_invocations=yes) # DO isn't used on apple-apple-apple if test $LIBRARY_COMBO = apple-apple-apple; then enable_invocations=no fi AC_ARG_WITH(ffi-include, [ --with-ffi-include=PATH Include path for ffi headers], ffi_incdir="$withval", ffi_incdir="no") if test ${ffi_incdir} != "no"; then CPPFLAGS="$CPPFLAGS -I${ffi_incdir}" INCLUDE_FLAGS="$INCLUDE_FLAGS -I${ffi_incdir}" fi AC_ARG_WITH(ffi-library, [ --with-ffi-library=PATH Library path for ffi libs], ffi_libdir="$withval", ffi_libdir="no") if test ${ffi_libdir} != "no"; then GS_ADD_LIBRARY_PATH([${ffi_libdir}]) fi if test "$do_broken_libffi" = "no"; then if test -n "$PKG_CONFIG"; then if $PKG_CONFIG --exists libffi; then pkg_config_libffi=yes ffi_CFLAGS=`$PKG_CONFIG --cflags libffi`; CPPFLAGS="$CPPFLAGS $ffi_CFLAGS" INCLUDE_FLAGS="$INCLUDE_FLAGS $ffi_CFLAGS" fi fi AC_CHECK_HEADER(ffi.h, have_libffi=yes, have_libffi=no) else have_libffi=no fi if test "$do_broken_libffcall" = "no"; then AC_CHECK_HEADERS(callback.h, have_ffcall=yes, have_ffcall=no) else have_ffcall=no fi if test $have_ffcall = no; then enable_ffcall=no # If we don't have ffcall but do have libffi, use libffi if test $have_libffi = yes; then enable_libffi=yes fi fi if test $have_libffi = no; then enable_libffi=no # If we don't have libffi but do have ffcall, use ffcall if test $have_ffcall = yes; then if test $enable_ffcall = no; then AC_MSG_WARN([ffi support seems to be missing on this system ... please install a recent libffi]) fi fi fi have_forward_hook=yes saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $OBJCFLAGS -x objective-c" AC_MSG_CHECKING(for forwarding callback in runtime) AC_COMPILE_IFELSE( [AC_LANG_SOURCE([[#include "$srcdir/config/config.forward2.m"]])], have_forward_hook=yes, have_forward_hook=no) if test $have_forward_hook = yes; then AC_DEFINE(HAVE_FORWARD2,1, [Define if libobjc has the __objc_msg_forward2 function]) else AC_COMPILE_IFELSE( [AC_LANG_SOURCE([[#include "$srcdir/config/config.forward.m"]])], have_forward_hook=yes, have_forward_hook=no) fi AC_MSG_RESULT($have_forward_hook) if test $have_forward_hook = no; then enable_libffi=no enable_ffcall=no fi CPPFLAGS="$saved_CPPFLAGS" AC_MSG_CHECKING(FFI library usage) WITH_FFI=none if test $enable_libffi = yes; then AC_DEFINE(USE_LIBFFI,1, [Define if using the libffi library for invocations]) WITH_FFI=libffi if test "$pkg_config_libffi" = "yes"; then ffi_LIBS=`pkg-config --libs libffi` else ffi_LIBS=-lffi fi LIBS="$ffi_LIBS $LIBS" AC_TRY_RUN([#include "$srcdir/config/config.ffi.c"], ffi_ok="yes",ffi_ok="no",ffi_ok="$cross_ffi_ok") if test $ffi_ok = yes; then AC_MSG_RESULT(libffi) if test $do_broken_libffi = yes; then AC_MSG_WARN([ffi may be broken on this system ... try enabling ffcall]) fi AC_CHECK_FUNCS(ffi_prep_closure_loc) else AC_MSG_ERROR([The ffi library (libffi) does not appear to be working. Perhaps it's missing or you need a more recent version. Version 3.0.9 or later should work, and you can find a link to it n the list of packages for download at http://www.gnustep.org/resources/sources.html]) fi elif test $enable_ffcall = yes; then AC_DEFINE(USE_FFCALL,1, [Define if using the ffcall library for invocations]) WITH_FFI=ffcall LIBS="-lcallback -lavcall $LIBS" AC_TRY_LINK([#include ], , ffi_ok="yes", ffi_ok="no") if test $ffi_ok = yes; then AC_MSG_RESULT(ffcall) fi AC_MSG_WARN([ffcall is broken on some systems and is deprecated ... try enabling ffi]) else ffi_ok=no fi if test $enable_ffcall = yes -a $ffi_ok = yes; then AC_MSG_CHECKING(if ffcall trampolines work) AC_RUN_IFELSE( [AC_LANG_SOURCE([[#include "$srcdir/config/config.trampoline.c"]])], have_working_trampoline=yes, have_working_trampoline=no, have_working_trampoline=yes) AC_MSG_RESULT($have_working_trampoline) fi if test $ffi_ok = no; then AC_MSG_RESULT(none) echo if test $have_forward_hook = no; then echo "You do not have an up-to-date libobjc library installed" elif test "$have_working_trampoline" = no; then echo "You have ffcall, but it does not work properly. Most likely because" echo "your system's security policy is blocking some parts of ffcall" echo "we recommend installing libffi instead." else echo "You do not have either ffcall or libffi installed/enabled, or configure needs" echo "--with-ffi-include and/or --with-ffi-library flags so GNUstep can find them," echo "or you have ffcall but gnustep-make is configured to use native exceptions" echo "(native exceptions are not compatible with ffcall)." fi echo "GNUstep requires libffi (or ffcall) and proper libobjc hooks to do" echo "invocations and DO." echo "(This does not apply on apple-apple-apple systems where DO is" echo "not compatible with other GNUstep systems.)" if test $enable_invocations = yes; then echo echo "You most likely do not want to build base without invocation support." echo "Many things (including Distributed Objects and undo/redo), won't work" echo "at all without invocations." echo "If you really want to build -base without invocation support," echo "add --disable-invocations to the configure arguments." echo "For more information, read the GNUstep build guide, ffcall section:" echo "http://gnustep.made-it.com/BuildGuide/index.html" AC_MSG_ERROR([Incomplete support for ffi functionality.]) fi AC_MSG_WARN([Incomplete support for ffi funtionality.]) fi AC_SUBST(WITH_FFI) #-------------------------------------------------------------------- # Check for iconv support (for Unicode conversion). #-------------------------------------------------------------------- # Do this before checking for xml2, as xml2 may require iconv. # # We need to find an iconv library that matches the installed iconv.h header # (if any). It is important to check header/library compatibility. It's # fairly common to have iconv support both in libc and from libiconv. In that # case, a naive check that iconv() is in libc will succeed, but if we use # libiconv's iconv.h, it will redefine iconv() to functions that exist # only in libiconv, and we'll get link errors. # # Some versions of iconv don't support the '//TRANSLIT' option, which is # needed for a lossy conversion (where we pick the closest equivalent for # any character present in the source string which does not exist in the # destination characterset), so we check for support of that first. # First, check if there's a working iconv in libc (ie. if the test program # runs without any extra flags). AC_ARG_ENABLE(iconv, [ --disable-iconv Build even if iconv is not available],, enable_iconv=yes) if test $enable_iconv = yes; then AC_MSG_CHECKING(iconv support) AC_RUN_IFELSE([AC_LANG_SOURCE([#include int main(int argc,char **argv) { return iconv_open("UTF-8//TRANSLIT","ASCII") == -1 ? 1 : 0; }])] , # libc has a working iconv. AC_DEFINE(HAVE_ICONV,1, [Define if you have this function]) AC_MSG_RESULT([[yes, in libc]]) found_iconv=yes , found_iconv=no , found_iconv="$cross_found_iconv_libc"; if test "$found_iconv" = "yes"; then AC_DEFINE(HAVE_ICONV,1, [Define if you have this function]) AC_MSG_RESULT([[yes, in libc (via cross.config)]]) fi ) if test $found_iconv = no ; then # libc doesn't have a working iconv with translit. # Try adding -liconv and any user supplied directory. AC_ARG_WITH(libiconv-library, [ --with-libiconv-library=PATH Library path for libiconv libraries], libiconv_libdir="$withval", libiconv_libdir="no") if test "$libiconv_libdir" != "no"; then GS_ADD_LIBRARY_PATH([${libiconv_libdir}]) fi AC_ARG_WITH(libiconv-include, [ --with-libiconv-include=PATH Include path for libiconv header], libiconv_incdir="$withval", libiconv_incdir="no") if test ${libiconv_incdir} != "no"; then CPPFLAGS="$CPPFLAGS -I${libiconv_incdir}" INCLUDE_FLAGS="$INCLUDE_FLAGS -I${libiconv_incdir}" fi old_LIBS="$LIBS" LIBS="-liconv $LIBS" AC_RUN_IFELSE([AC_LANG_SOURCE([#include int main(int argc,char **argv) { return iconv_open("UTF-8//TRANSLIT","ASCII") == -1 ? 1 : 0; }])] , # -liconv works. AC_DEFINE(HAVE_ICONV,1, [Define if you have this function]) AC_MSG_RESULT([[yes, -liconv]]) found_iconv=yes , found_iconv=no LIBS="$old_LIBS" , found_iconv="$cross_found_iconv_liconv"; if test "$found_iconv" = "yes"; then AC_DEFINE(HAVE_ICONV,1, [Define if you have this function]) AC_MSG_RESULT([[yes, -liconv (via cross.config)]]) else LIBS="$old_LIBS" fi ) fi if test $found_iconv = no ; then # -liconv with translit didn't work. Try giconv.h and -lgiconv. # BSDs install this lib as libgiconv. old_LIBS="$LIBS" LIBS="-lgiconv $LIBS" AC_RUN_IFELSE([AC_LANG_SOURCE([#include int main(int argc,char **argv) { return iconv_open("UTF-8//TRANSLIT","ASCII") == -1 ? 1 : 0; }])] , AC_DEFINE(HAVE_ICONV,1, [Define if you have this function]) AC_DEFINE(HAVE_GICONV,1, [Define if you have this function]) AC_MSG_RESULT([[yes, -lgiconv]]) found_iconv=yes , found_iconv=no LIBS="$old_LIBS" , found_iconv="$cross_found_iconv_lgiconv"; if test "$found_iconv" = "yes"; then AC_DEFINE(HAVE_ICONV,1, [Define if you have this function]) AC_DEFINE(HAVE_GICONV,1, [Define if you have this function]) AC_MSG_RESULT([[yes, -lgiconv (via cross.config)]]) else LIBS="$old_LIBS" fi ) fi AC_ARG_ENABLE(stricticonv, [ --enable-stricticonv Build even if iconv is strict],, enable_stricticonv=no) if test $enable_stricticonv = yes; then AC_MSG_CHECKING(non-lossy iconv support) AC_RUN_IFELSE([AC_LANG_SOURCE([#include int main(int argc,char **argv) { return iconv_open("UTF-8","ASCII") == -1 ? 1 : 0; }])] , # libc has a working iconv. AC_DEFINE(HAVE_ICONV,1, [Define if you have this function]) AC_MSG_RESULT([[yes, in libc]]) found_iconv=yes , found_iconv=no ) if test $found_iconv = no ; then # libc doesn't have a working iconv. Try adding -liconv and any user # supplied directory. AC_ARG_WITH(libiconv-library, [ --with-libiconv-library=PATH Library path for libiconv libraries], libiconv_libdir="$withval", libiconv_libdir="no") if test "$libiconv_libdir" != "no"; then GS_ADD_LIBRARY_PATH([${libiconv_libdir}]) fi old_LIBS="$LIBS" LIBS="-liconv $LIBS" AC_RUN_IFELSE([AC_LANG_SOURCE([#include int main(int argc,char **argv) { return iconv_open("UTF-8","ASCII") == -1 ? 1 : 0; }])] , # -liconv works. AC_DEFINE(HAVE_ICONV,1, [Define if you have this function]) AC_MSG_RESULT([[yes, -liconv]]) found_iconv=yes , found_iconv=no LIBS="$old_LIBS" ) fi if test $found_iconv = no ; then # -liconv didn't work. Try giconv.h and -lgiconv. # BSDs install this lib as libgiconv. old_LIBS="$LIBS" LIBS="-lgiconv $LIBS" AC_RUN_IFELSE([AC_LANG_SOURCE([#include int main(int argc,char **argv) { return iconv_open("UTF-8","ASCII") == -1 ? 1 : 0; }])] , AC_DEFINE(HAVE_ICONV,1, [Define if you have this function]) AC_DEFINE(HAVE_GICONV,1, [Define if you have this function]) AC_MSG_RESULT([[yes, -lgiconv]]) found_iconv=yes , found_iconv=no LIBS="$old_LIBS" ) fi fi if test $found_iconv = no ; then AC_MSG_RESULT([[no]]) echo echo "You do not appear to have usable iconv header/library." echo "Building without them will disable much characterset support." echo "If you really want to build gnustep-base without character conversion" echo " support, please add --disable-iconv to the configure arguments." AC_MSG_ERROR([Missing support for character conversion functionality.]) fi fi #-------------------------------------------------------------------- # Check recent libxml2 for GSXML and NSXMLNode # See DEPENDENCIES POLICY at the start of this file. #-------------------------------------------------------------------- AC_ARG_ENABLE(xml, [ --disable-xml Build even if XML-dependencies are not met],, enable_xml=yes) HAVE_LIBXML=0 if test $enable_xml = yes; then PKG_CHECK_MODULES([XML], [libxml-2.0 >= 2.3.0], [enable_libxml=yes], [ AM_PATH_XML(2.3.0, enable_libxml=yes, enable_libxml=no) ]) if test $enable_libxml = yes; then CPPFLAGS="$CPPFLAGS $XML_CFLAGS" INCLUDE_FLAGS="$INCLUDE_FLAGS $XML_CFLAGS" LIBS="$XML_LIBS $LIBS" HAVE_LIBXML=1 AC_DEFINE(HAVE_LIBXML,1,[Define if libxml available]) AC_CHECK_HEADERS(libxml/SAX2.h) #-------------------------------------------------------------------- # Check for (optional) libxslt #-------------------------------------------------------------------- AC_ARG_ENABLE(xslt, [ --disable-xslt Build even if XSLT-dependency is not met],, enable_xslt=yes) if test $enable_xslt = yes; then PKG_CHECK_MODULES([XSLT], [libxslt >= 1.0], [xslt_ok=yes], [xslt_ok=no]) if test "$xslt_ok" = "yes"; then AC_CHECK_HEADERS(libxslt/xslt.h, xslt_ok=yes, xslt_ok=no) fi if test "$xslt_ok" = "yes"; then CPPFLAGS="$CPPFLAGS $XSLT_CFLAGS" INCLUDE_FLAGS="$INCLUDE_FLAGS $XSLT_CFLAGS" LIBS="$XSLT_LIBS $LIBS" HAVE_LIBXSLT=1 AC_DEFINE(HAVE_LIBXSLT,1,[Define if libxslt available]) else echo echo "You do not appear to have usable libxslt headers/library." echo "Building without them will disable the XSLT extensions." echo "If you really want to build gnustep-base without XSLT support," echo "add --disable-xslt to the configure arguments to avoid warning." AC_MSG_WARN([Missing support for XSLT functionality.]) fi else HAVE_LIBXSLT=0 AC_MSG_WARN([Disabled support for XSLT funtionality.]) fi AC_SUBST(HAVE_LIBXSLT) else echo echo "You do not appear to have usable libxml2 headers/library." echo "Building without them will disable the GSXML and NSXMLNode." echo "If you really want to build gnustep-base without XML DOM support" echo " (though NSXMLParser is unaffected), please" echo "add --disable-xml to the configure arguments." AC_MSG_ERROR([Missing support for XML DOM functionality.]) fi else AC_MSG_WARN([XML functionality disabled.]) fi AC_SUBST(HAVE_LIBXML) #-------------------------------------------------------------------- # Check recent libgnutls for SSL streams. # See DEPENDENCIES POLICY at the start of this file. #-------------------------------------------------------------------- AC_ARG_ENABLE(tls, [ --disable-tls Disable use of GNUTLS],, enable_tls=yes) if test $enable_tls = yes; then HAVE_GNUTLS=0 # Save CFLAGS and LIBS as AM_PATH_TLS clobbers these variables regardless # of the success of the macro. saved_LIBS="$LIBS" saved_CFLAGS="$CFLAGS" if test -n "$PKG_CONFIG"; then if pkg-config --exists gnutls; then AC_MSG_CHECKING(gnutls support) HAVE_GNUTLS=1 TLS_CFLAGS=`$PKG_CONFIG --cflags gnutls` TLS_LIBS=`$PKG_CONFIG --libs gnutls` fi fi if test $HAVE_GNUTLS = 0; then # AM_PATH_TLS(2.0.1, enable_libgnutls=yes, enable_libgnutls=no) AM_PATH_TLS(1.4.0, enable_libgnutls=yes, enable_libgnutls=no) if test $enable_libgnutls = yes; then HAVE_GNUTLS=1 else HAVE_GNUTLS=0 fi fi if test $HAVE_GNUTLS = 1; then if ! pkg-config --atleast-version=2.12 gnutls; then AC_CHECK_LIB(gcrypt, gcry_control, have_gcrypt=yes, have_gcrypt=no) if test "$have_gcrypt" = "no"; then HAVE_GNUTLS=0 else TLS_LIBS="$TLS_LIBS -lgcrypt" fi fi fi if test $HAVE_GNUTLS = 0; then # Restore the CFLAGS and LIBS because AM_PATH_TLS messes them LIBS="$saved_LIBS" CFLAGS="$saved_CFLAGS" AC_MSG_RESULT(no) echo echo "You do not appear to have usable libgnutls headers/library." echo "Building without them will disable SSL/TLS/HTTPS in NSStream," echo "NSFileHandle, NSURLHandle and NSURLConnection." echo "If you really want to build gnustep-base without TLS support," echo "add --disable-tls to the configure arguments." AC_MSG_ERROR([Missing support for TLS functionality.]) else AC_MSG_RESULT(yes) CPPFLAGS="$CPPFLAGS $TLS_CFLAGS" INCLUDE_FLAGS="$INCLUDE_FLAGS $TLS_CFLAGS" LIBS="$TLS_LIBS $LIBS" AC_CHECK_FUNCS(gnutls_transport_set_errno) if test "$ac_cv_func_gnutls_transport_set_errno" = "no"; then AC_MSG_WARN([Missing support for thread-safe error handling in GNUTLS. Please check that you have the most recent version installed (2.0 or later chould be fine).]) fi AC_CHECK_FUNCS(gnutls_x509_privkey_import2) fi else AC_MSG_WARN([Disabled support for TLS funtionality.]) HAVE_GNUTLS=0 fi if test $HAVE_GNUTLS = 1; then AC_DEFINE_UNQUOTED(HAVE_GNUTLS,$HAVE_GNUTLS,[Define if libgnutls available]) fi AC_SUBST(HAVE_GNUTLS) #-------------------------------------------------------------------- # Check for NSNetServices # See DEPENDENCIES POLICY at the start of this file. #-------------------------------------------------------------------- HAVE_MDNS=0 HAVE_AVAHI=0 AC_ARG_ENABLE(zeroconf, [ --disable-zeroconf Disable NSNetServices support],, enable_zeroconf=yes) AC_ARG_WITH(zeroconf-api, [ --with-zeroconf-api=API force use of a specific zeroconf API (mdns or avahi)], zeroconf_api="$withval", zeroconf_api="any") if test $enable_zeroconf = yes; then if test "$zeroconf_api" = "any" || test "$zeroconf_api" = "mdns"; then AC_CHECK_HEADERS(dns_sd.h, have_mdns=yes, have_mdns=no) if test "$have_mdns" = "yes"; then AC_CHECK_LIB(dns_sd, DNSServiceBrowse, have_mdns=yes, have_mdns=no) if test "$have_mdns" = "yes"; then MDNS_LIBS="-ldns_sd" HAVE_MDNS=1 fi fi fi if test "$zeroconf_api" = "any" || test "$zeroconf_api" = "avahi"; then AC_CHECK_HEADERS(avahi-client/client.h, have_avahi=yes, have_avahi=no) if test "$have_avahi" = "yes"; then AC_CHECK_LIB(avahi-client, avahi_client_new, have_avahi=yes, have_avahi=no) if test "$have_avahi" = "yes"; then AVAHI_LIBS="-lavahi-common -lavahi-client" HAVE_AVAHI=1 fi fi fi # If we have both APIs, prefer Avahi, because the mDNS API # is most certainly the compatability one if test "$have_avahi" = "yes" && test "$have_mdns" = "yes"; then LIBS="$AVAHI_LIBS $LIBS" HAVE_MDNS=0 else # One of those will be empty. LIBS="$AVAHI_LIBS $MDNS_LIBS $LIBS" fi fi AC_SUBST(HAVE_MDNS) AC_SUBST(HAVE_AVAHI) #-------------------------------------------------------------------- # Check for International Components for Unicode # See DEPENDENCIES POLICY at the start of this file. #-------------------------------------------------------------------- HAVE_ICU=0 AC_ARG_ENABLE(icu, [ --disable-icu Disable International Components for Unicode],, enable_icu=yes) AS_IF([test "x$enable_icu" = "xyes"], [ case "$target_os" in mingw*|windows) # check for ICU bundled with Windows 10 old_LIBS="$LIBS" LIBS="-licu $LIBS" AC_CHECK_HEADERS([icu.h], AC_RUN_IFELSE([AC_LANG_SOURCE([ #include int main () { return udat_countAvailable() > 0 ? 0 : 1; }])], HAVE_ICU=1)) LIBS="$old_LIBS" if test $HAVE_ICU = 1; then ICU_LIBS=-licu AC_MSG_NOTICE([Using system-provided ICU DLL (requires Windows 10 version 1903 or later)]) fi ;; esac if test $HAVE_ICU = 0; then PKG_CHECK_MODULES([ICU], [icu-i18n > 49.0], [ AC_CHECK_HEADERS([unicode/uloc.h unicode/ulocdata.h unicode/ucol.h unicode/ucurr.h unicode/uregex.h unicode/ucal.h unicode/unorm2.h unicode/unum.h unicode/udat.h unicode/udatpg.h unicode/ustring.h unicode/usearch.h unicode/ucnv.h unicode/utext.h], HAVE_ICU=1)], [HAVE_ICU=0]) fi if test $HAVE_ICU = 0; then AC_MSG_ERROR([No useable ICU installation found]) fi LIBS="$LIBS $ICU_LIBS" ]) AC_SUBST(HAVE_ICU) #-------------------------------------------------------------------- # Check for libdispatch # See DEPENDENCIES POLICY at the start of this file. #-------------------------------------------------------------------- HAVE_LIBDISPATCH=0 AC_ARG_ENABLE(libdispatch, [ --disable-libdispatch Disable dispatching blocks via libdispatch], enable_libdispatch=$enableval, enable_libdispatch=yes) if test $enable_libdispatch = yes; then AC_ARG_WITH(dispatch-include, [ --with-dispatch-include=PATH Include path for dispatch header], dispatch_incdir="$withval", dispatch_incdir="no") if test ${dispatch_incdir} != "no"; then CPPFLAGS="$CPPFLAGS -I${dispatch_incdir}" INCLUDE_FLAGS="$INCLUDE_FLAGS -I${dispatch_incdir}" fi AC_ARG_WITH(dispatch-library, [ --with-dispatch-library=PATH Library path for dispatch lib], dispatch_libdir="$withval", dispatch_libdir="no") if test ${dispatch_libdir} != "no"; then GS_ADD_LIBRARY_PATH([${dispatch_libdir}]) fi AC_CHECK_HEADERS(dispatch/dispatch.h, have_dispatch=yes, have_dispatch=no) if test "$have_dispatch" = "yes"; then # check for private header which includes runloop integration functions in # the Swift corelibs libdispatch release AC_CHECK_HEADERS(dispatch/private.h) else AC_CHECK_HEADERS(dispatch.h, have_dispatch=yes, have_dispatch=no) fi if test "$have_dispatch" = "yes"; then AC_CHECK_LIB(dispatch, dispatch_queue_create, have_dispatch=yes, have_dispatch=no) if test "$have_dispatch" = "yes"; then saveLIBS="$LIBS" LIBS="-lobjc -ldispatch"; # This check is needed because libdispatch might be linked against a # version of libBlocksRuntime that defines symbols conflicting with libobjc AC_MSG_CHECKING(whether we can link libdispatch and libobjc at the same time) AC_TRY_LINK(,,have_dispatch=yes, have_dispatch=no) if test "$have_dispatch" = "yes"; then LIBS="$saveLIBS -ldispatch"; AC_MSG_RESULT(yes); HAVE_LIBDISPATCH=1; else LIBS="$saveLIBS"; AC_MSG_RESULT(no); fi fi else HAVE_LIBDISPATCH=0; # just ignore libdispatch if it's not there fi fi AC_SUBST(HAVE_LIBDISPATCH) HAVE_LIBDISPATCH_RUNLOOP=0 if test $HAVE_LIBDISPATCH = 1; then # We check whether we have a variant of libdispatch that allows runloop # integration AC_CHECK_FUNCS(dispatch_main_queue_drain_np dispatch_get_main_queue_handle_np) if test "$ac_cv_func_dispatch_main_queue_drain_np" = "yes" && test "$ac_cv_func_dispatch_get_main_queue_handle_np" = "yes"; then HAVE_LIBDISPATCH_RUNLOOP=1 fi # Check for "_4CF" variants of runloop integration functions provided by the # Swift corelibs libdispatch release AC_CHECK_FUNCS(_dispatch_main_queue_callback_4CF _dispatch_get_main_queue_handle_4CF) if test "$ac_cv_func__dispatch_main_queue_callback_4CF" = "yes" && test "$ac_cv_func__dispatch_get_main_queue_handle_4CF" = "yes"; then HAVE_LIBDISPATCH_RUNLOOP=1 fi fi AC_SUBST(HAVE_LIBDISPATCH_RUNLOOP) #-------------------------------------------------------------------- # Check for libcurl # See DEPENDENCIES POLICY at the start of this file. #-------------------------------------------------------------------- CURL_CONFIG="curl-config" AC_ARG_WITH(curl, AS_HELP_STRING([--with-curl=], [use curl installed in directory ])) if test "$with_curl" != ""; then CURL_CONFIG="$with_curl/bin/curl-config" fi HAVE_LIBCURL=0 SKIP_CURL_CONFIG=0 curl_all=no AC_MSG_CHECKING([for libcurl]) case "$target_os" in windows) SKIP_CURL_CONFIG=1;; esac # When compiling libs-base in an MSYS2 environment on Windows MSVC, compilation may fail: # Curl is preinstalled on MSYS2 and bundles the curl-config script. The MSYS2 curl library # and a different (MSVC) curl library might interfere and produce an incorrect configuration. # # Skip the curl-config check on Windows. if eval $CURL_CONFIG --version 2>/dev/null >/dev/null && test "$SKIP_CURL_CONFIG" == "0"; then curl_ver=`$CURL_CONFIG --version | sed -e "s/libcurl //g"` curl_maj=`echo $curl_ver | sed -e "s/^\(.*\)\.\(.*\)\.\(.*\)$/\1/"` curl_min=`echo $curl_ver | sed -e "s/^\(.*\)\.\(.*\)\.\(.*\)$/\2/"` if test $curl_maj -lt 7 -o \( $curl_maj -eq 7 -a $curl_min -lt 66 \); then AC_MSG_RESULT([FAILED (version too old to use]) else AC_MSG_RESULT(yes ... version $curl_ver) AC_CHECK_HEADERS(curl/curl.h, curl_ok=yes, curl_ok=no) if test "$curl_ok" = yes; then HAVE_LIBCURL=1 CURLCFLAGS=`$CURL_CONFIG --cflags` CURLLIBS=`$CURL_CONFIG --libs` CFLAGS="$CFLAGS $CURLCFLAGS" LIBS="$LIBS $CURLLIBS" curl_all=yes fi fi else if test -n "$PKG_CONFIG"; then if pkg-config --exists libcurl; then AC_MSG_RESULT(yes ... via pkg-config) if $PKG_CONFIG --atleast-version 2.66.0 libcurl; then AC_CHECK_HEADERS(curl/curl.h, curl_ok=yes, curl_ok=no) if test "$curl_ok" = yes; then HAVE_LIBCURL=1 CURLCFLAGS=`$PKG_CONFIG --cflags libcurl` CURLLIBS=`$PKG_CONFIG --libs libcurl` CFLAGS="$CFLAGS $CURLCFLAGS" LIBS="$LIBS $CURLLIBS" curl_all=yes fi else AC_MSG_RESULT([FAILED (version too old to use]) curl_all=no fi else AC_MSG_RESULT([FAILED (libcurl not found via pkg-config)]) curl_all=no fi else AC_MSG_RESULT([FAILED (curl-config and pkg-config not found)]) fi fi AC_SUBST(HAVE_LIBCURL) #-------------------------------------------------------------------- # Check dependencies of NSURLSession API #-------------------------------------------------------------------- nsurlsessiondefault=no if test "$OBJC_RUNTIME_LIB" = "ng" -a $HAVE_BLOCKS = 1 -a $HAVE_LIBDISPATCH = 1 -a $HAVE_LIBCURL = 1; then nsurlsessiondefault=yes fi GS_HAVE_NSURLSESSION=0 AC_ARG_ENABLE(nsurlsession, [ --disable-nsurlsession Disable support for NSURLSession],, enable_nsurlsession=$nsurlsessiondefault) if test $enable_nsurlsession = yes; then if test "$OBJC_RUNTIME_LIB" != "ng"; then AC_MSG_ERROR([Missing ng runtime (needed for NSURLSession). To build without NSURLSession support, please run configure again with the --disable-nsurlsession option.]) fi if test $HAVE_BLOCKS = 0; then AC_MSG_ERROR([Missing blocks support (needed for NSURLSession). To build without NSURLSession support, please run configure again with the --disable-nsurlsession option.]) fi if test $HAVE_LIBDISPATCH = 0; then AC_MSG_ERROR([Missing libdispatch (needed for NSURLSession). To build without NSURLSession support, please run configure again with the --disable-nsurlsession option.]) fi # Check for dispatch_queue_create_with_target needed for NSURLSession AC_CHECK_FUNCS(dispatch_queue_create_with_target) if test $HAVE_LIBCURL = 0; then AC_MSG_ERROR([Missing libcurl (needed for NSURLSession). To build without NSURLSession support, please run configure again with the --disable-nsurlsession option.]) fi GS_HAVE_NSURLSESSION=1 fi AC_SUBST(GS_HAVE_NSURLSESSION) #-------------------------------------------------------------------- # Check GMP for NSDecimal #-------------------------------------------------------------------- AC_ARG_WITH(gmp-include, [ --with-gmp-include=PATH include path for gmp headers], gmp_incdir="$withval", gmp_incdir="no") AC_ARG_WITH(gmp-library, [ --with-gmp-library=PATH library path for gmp libraries], gmp_libdir="$withval", gmp_libdir="no") libs_temp=$LIBS if test "$gmp_incdir" != "no"; then CPPFLAGS="$CPPFLAGS -I$gmp_incdir" INCLUDE_FLAGS="$INCLUDE_FLAGS -I$gmp_incdir" fi if test "$gmp_libdir" != "no"; then GS_ADD_LIBRARY_PATH([${gmp_libdir}]) fi USE_GMP=0 AC_CHECK_HEADERS(gmp.h) if test $ac_cv_header_gmp_h = yes; then AC_CHECK_LIB(gmp, mpf_abs, gmp_ok=yes, gmp_ok=no) if test "$gmp_ok" = no; then AC_CHECK_LIB(gmp, __gmpf_abs, gmp_ok=yes, gmp_ok=no) fi if test "$gmp_ok" = yes; then LIBS="-lgmp $LIBS" USE_GMP=1 fi fi AC_SUBST(USE_GMP) #-------------------------------------------------------------------- # Check whether nl_langinfo(CODESET) is supported, needed by Unicode.m. #-------------------------------------------------------------------- AM_LANGINFO_CODESET AC_SUBST(INCLUDE_FLAGS) AC_SUBST(LDIR_FLAGS) #-------------------------------------------------------------------- # Check for -Wdeclaration-after-statement #-------------------------------------------------------------------- AC_MSG_CHECKING(whether the compiler supports -Wdeclaration-after-statement) saved_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -Wdeclaration-after-statement" AC_COMPILE_IFELSE([AC_LANG_PROGRAM()],HAS_W_DECL_AFTER_STATEMENT=yes,HAS_W_DECL_AFTER_STATEMENT=no) CFLAGS="$saved_CFLAGS" AC_MSG_RESULT($HAS_W_DECL_AFTER_STATEMENT) if test x"$HAS_W_DECL_AFTER_STATEMENT" = x"yes"; then WARN_FLAGS="-Wall -Wdeclaration-after-statement" else WARN_FLAGS=-Wall fi AC_SUBST(WARN_FLAGS) #-------------------------------------------------------------------- # Check if we should use an alternative gdomap port #-------------------------------------------------------------------- AC_ARG_WITH(gdomap-port, [ --with-gdomap-port=PORT alternative port for gdomap], gdomap_port="$withval", gdomap_port="no") if test "$gdomap_port" = "no"; then GNUSTEP_GDOMAP_PORT_OVERRIDE="$gdomap_port" else GNUSTEP_GDOMAP_PORT_OVERRIDE="$gdomap_port" fi AC_SUBST(GNUSTEP_GDOMAP_PORT_OVERRIDE) #-------------------------------------------------------------------- # Check if we should install gdomap as setuid #-------------------------------------------------------------------- AC_MSG_CHECKING([if we should install gdomap as setuid]) AC_ARG_ENABLE(setuid-gdomap,[ --enable-setuid-gdomap Enable installing gdomap as a setuid executable. By default, it is installed as a normal program intended to be started by root at system boot time, but it can also be started up automatically by any user at any time. Use this option if you are happy having the program started automatically on demand. ], ac_cv_setuid_gdomap=$enableval, ac_cv_setuid_gdomap="no") if test "$ac_cv_setuid_gdomap" = "yes"; then AC_MSG_RESULT(yes); GNUSTEP_INSTALL_GDOMAP_AS_SETUID="yes" else AC_MSG_RESULT(no); GNUSTEP_INSTALL_GDOMAP_AS_SETUID="no" fi AC_SUBST(GNUSTEP_INSTALL_GDOMAP_AS_SETUID) #-------------------------------------------------------------------- # Record the version #-------------------------------------------------------------------- AC_MSG_CHECKING(for the version of gnustep-base we are compiling) if test -f "Version"; then . ./Version fi AC_MSG_RESULT($VERSION) AC_SUBST(VERSION) AC_SUBST(MAJOR_VERSION) AC_SUBST(MINOR_VERSION) AC_SUBST(SUBMINOR_VERSION) AC_SUBST(GCC_VERSION) #-------------------------------------------------------------------- # Write the Makefiles #-------------------------------------------------------------------- AC_CONFIG_FILES([config.mak base.make Headers/GNUstepBase/GSConfig.h]) AC_OUTPUT gnustep-base-1.29.0/cross.config000066400000000000000000000015411435650067400165330ustar00rootroot00000000000000# This configuration file contains the default values for AC_TRY_RUN # or AC_RUN_IFELSE checks performed by the configure script. cross_utf8literal_ok=no cross_reuseaddr_ok=0 cross_gs_cv_objc_works=yes cross_gs_cv_objc_compiler_supports_constant_string_class=no cross_gs_cv_objc_load_method_worked=no cross_have_poll=no cross_VSPRINTF_RETURNS_LENGTH=1 cross_VASPRINTF_RETURNS_LENGTH=1 cross_NEED_WORD_ALIGNMENT=1 cross_working_register_printf=1 cross_wide_register_printf=1 cross_gs_cv_program_invocation_name_worked=no cross_CMDLINE_TERMINATED=0 cross_have_kvm_env=0 cross_ffi_ok=yes cross_non_fragile=no cross_have_unexpected=no cross_safe_initialize=no cross_found_iconv_libc=no cross_found_iconv_liconv=no cross_found_iconv_lgiconv=no cross_objc2_runtime=0 # Enable for true cross build if test "$cross_compiling"="yes"; then ac_cv_func_setpgrp_void=yes fi gnustep-base-1.29.0/gnustep-base.script.spec.in000066400000000000000000000022241435650067400213730ustar00rootroot00000000000000%post if [ $1 = 1 ]; then # if [ -z "$GNUSTEP_MAKEFILES" ]; then # . %{gs_root}/Library/Makefiles/GNUstep.sh # fi #============================================================== # Add lines for gdomap into /etc/services, if not already there #============================================================== grep -q '^gdomap' /etc/services \ || (echo "gdomap 538/tcp # GNUstep distributed objects" >> /etc/services \ && echo "gdomap 538/udp # GNUstep distributed objects" >> /etc/services) # # Need to add paths to ld.so.conf in gnustep-make if we want to do this # #%ifos Linux #/sbin/ldconfig #%endif fi %postun if [ $1 = 0 ]; then # if [ -z "$GNUSTEP_SYSTEM_ROOT" ]; then # . %{gs_root}/Library/Makefiles/GNUstep.sh # fi #========================================= # Remove lines for gdomap in /etc/services #========================================= mv -f /etc/services /etc/services.orig grep -v "^gdomap 538" /etc/services.orig > /etc/services rm -f /etc/services.orig # # Need to add paths to ld.so.conf in gnustep-make if we want to do this # #%ifos Linux #/sbin/ldconfig #%endif fi gnustep-base-1.29.0/gnustep-base.spec.in000066400000000000000000000017161435650067400200750ustar00rootroot00000000000000Release: 1 Source: ftp://ftp.gnustep.org/pub/gnustep/core/%{gs_name}-%{gs_version}.tar.gz License: LGPL Group: Development/Libraries Summary: GNUstep Base library package Packager: GNUstep Development Vendor: The GNUstep Project URL: http://www.gnustep.org/ Requires: gnustep-make >= 2.0.0 %description The GNUstep Base Library is a powerful fast library of general-purpose, non-graphical Objective C classes, inspired by the superb OpenStep API but implementing Apple and GNU additions to the API as well. It includes for example classes for unicode strings, arrays, dictionaries, sets, byte streams, typed coders, invocations, notifications, notification dispatchers, scanners, tasks, files, networking, threading, remote object messaging support (distributed objects), event loops, loadable bundles, attributed unicode strings, xml, mime, user defaults. This package includes development headers too. #Library combo is %{libcombo}. gnustep-base-1.29.0/gnustep-base.spec.old000066400000000000000000000136561435650067400202530ustar00rootroot00000000000000# This package is not relocatable %define ver 0.6.5 %define date 20000217 %define prefix /usr %define gsr %{prefix}/GNUstep %define libcombo gnu-gnu-gnu-xgps Name: gnustep-base Version: %{ver} Release: 1 Source: ftp://ftp.gnustep.org/pub/gnustep/core/gstep-base-%{ver}.tar.gz Copyright: GPL Group: Development/Tools Summary: GNUstep Base library package Packager: Christopher Seawood Distribution: Seawood's Random RPMS (%{_buildsym}) Vendor: The Seawood Project URL: http://www.gnustep.org/ BuildRoot: /var/tmp/build-%{name} Conflicts: gnustep-core Requires: gnustep-make %description The GNUstep Base Library is a library of general-purpose, non-graphical Objective C objects. For example, it includes classes for strings, object collections, byte streams, typed coders, invocations, notifications, notification dispatchers, moments in time, network ports, remote object messaging support (distributed objects), event loops, and random number generators. Library combo is %{libcombo}. %{_buildblurb} %package devel Summary: GNUstep Base headers and development libs. Group: Development/Libraries Requires: %{name} = %{ver}, gnustep-make-devel Conflicts: gnustep-core %description devel Header files required to build applications against the GNUstep Base library. Library combo is %{libcombo}. %{_buildblurb} %prep %setup -q -n gstep-%{ver}/base %patch -p2 -b .unicode %build if [ -z "$GNUSTEP_SYSTEM_ROOT" ]; then . %{gsr}/Makefiles/GNUstep.sh fi CFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%{gsr} --with-library-combo=%{libcombo} make %install rm -rf $RPM_BUILD_ROOT if [ -z "$GNUSTEP_SYSTEM_ROOT" ]; then . %{gsr}/Makefiles/GNUstep.sh fi make install GNUSTEP_INSTALLATION_DIR=${RPM_BUILD_ROOT}%{gsr} %ifos Linux cat > mygnustep.init.in << EOF #!/bin/sh # # gnustep daemons # # chkconfig: 2345 35 65 # description: Starts gnustep daemons # # Source function library. . /etc/rc.d/init.d/functions case "\$1" in start) echo -n "Starting gnustep services: " daemon %{gsr}/Tools/GSARCH/GSOS/gdomap echo touch /var/lock/subsys/gnustep ;; stop) echo -n "Stopping gnustep services: " killproc gdomap echo rm -f /var/lock/subsys/gnustep ;; status) status gdomap ;; restart|reload) \$0 stop \$0 start ;; *) echo "Usage: gnustep {start|stop|status|restart|reload}" exit 1 esac EOF sed -e "s|GSARCH|${GNUSTEP_HOST_CPU}|g" -e "s|GSOS|${GNUSTEP_HOST_OS}|g" < mygnustep.init.in > mygnustep.init mkdir -p ${RPM_BUILD_ROOT}/etc/rc.d/init.d mv mygnustep.init ${RPM_BUILD_ROOT}/etc/rc.d/init.d/gnustep %endif cat > filelist.rpm.in << EOF %defattr (-, bin, bin) %doc ANNOUNCE AUTHORS COPYING* ChangeLog* INSTALL* NEWS README Version %config %{gsr}/Libraries/Resources/NSTimeZones/localtime %ifos Linux %config /etc/rc.d/init.d/gnustep %endif %dir %{gsr}/Libraries %dir %{gsr}/Libraries/Resources %dir %{gsr}/Libraries/Resources/NSTimeZones %dir %{gsr}/Libraries/GSARCH %dir %{gsr}/Libraries/GSARCH/GSOS %dir %{gsr}/Libraries/GSARCH/GSOS/%{libcombo} %dir %{gsr}/Tools %dir %{gsr}/Tools/GSARCH %dir %{gsr}/Tools/GSARCH/GSOS %dir %{gsr}/Tools/GSARCH/GSOS/%{libcombo} %{gsr}/Libraries/Resources/NSCharacterSets %{gsr}/Libraries/Resources/NSTimeZones/README %{gsr}/Libraries/Resources/NSTimeZones/abbreviations %{gsr}/Libraries/Resources/NSTimeZones/regions %{gsr}/Libraries/Resources/NSTimeZones/zones %{gsr}/Libraries/Resources/NSTimeZones/*.m %{gsr}/Libraries/GSARCH/GSOS/%{libcombo}/lib*.so.* %{gsr}/Tools/dread %{gsr}/Tools/dwrite %{gsr}/Tools/dremove %{gsr}/Tools/gdnc %{gsr}/Tools/plparse %{gsr}/Tools/sfparse %{gsr}/Tools/pldes %{gsr}/Tools/plser %{gsr}/Tools/GSARCH/GSOS/%{libcombo}/* %attr(4755, root, root) %{gsr}/Tools/GSARCH/GSOS/gdomap EOF cat > filelist-devel.rpm.in << EOF %defattr(-, bin, bin) %dir %{gsr}/Headers %dir %{gsr}/Headers/gnustep %{gsr}/Headers/gnustep/Foundation %{gsr}/Headers/gnustep/base %{gsr}/Headers/gnustep/unicode %{gsr}/Headers/GSARCH %{gsr}/Libraries/GSARCH/GSOS/%{libcombo}/lib*.so EOF sed -e "s|GSARCH|${GNUSTEP_HOST_CPU}|" -e "s|GSOS|${GNUSTEP_HOST_OS}|" < filelist.rpm.in > filelist.rpm sed -e "s|GSARCH|${GNUSTEP_HOST_CPU}|" -e "s|GSOS|${GNUSTEP_HOST_OS}|" < filelist-devel.rpm.in > filelist-devel.rpm echo 'GMT' > $RPM_BUILD_ROOT/%{gsr}/Libraries/Resources/NSTimeZones/localtime %post if [ -z "$GNUSTEP_SYSTEM_ROOT" ]; then . %{gsr}/Makefiles/GNUstep.sh fi grep -q '^gdomap' /etc/services || (echo "gdomap 538/tcp # GNUstep distrib objects" >> /etc/services && echo "gdomap 538/udp # GNUstep distrib objects" >> /etc/services) %ifos Linux grep -q '%{gsr}/Libraries/$GNUSTEP_HOST_CPU/$GNUSTEP_HOST_OS/gnu-gnu-gnu-xgps' /etc/ld.so.conf || echo "%{gsr}/Libraries/$GNUSTEP_HOST_CPU/$GNUSTEP_HOST_OS/%{libcombo}" >> /etc/ld.so.conf /sbin/ldconfig /sbin/chkconfig --add gnustep %endif %preun if [ -z "$GNUSTEP_SYSTEM_ROOT" ]; then . %{gsr}/Makefiles/GNUstep.sh fi if [ $1 = 0 ]; then /sbin/chkconfig --del gnustep mv -f /etc/services /etc/services.orig grep -v "^gdomap 538" /etc/services.orig > /etc/services rm -f /etc/services.orig fi %postun if [ -z "$GNUSTEP_SYSTEM_ROOT" ]; then . %{gsr}/Makefiles/GNUstep.sh fi if [ $1 = 0 ]; then %ifos Linux mv -f /etc/ld.so.conf /etc/ld.so.conf.orig grep -v "^%{gsr}/Libraries/$GNUSTEP_HOST_CPU/$GNUSTEP_HOST_OS/%{libcombo}$" /etc/ld.so.conf.orig > /etc/ld.so.conf rm -f /etc/ld.so.conf.orig /sbin/ldconfig %endif fi %clean rm -rf $RPM_BUILD_ROOT %files -f filelist.rpm %files -f filelist-devel.rpm devel %changelog * Sat Sep 18 1999 Christopher Seawood - Version 0.6.0 - Added unicode patch to make sure unicode headers were installed * Sat Aug 07 1999 Christopher Seawood - Updated to cvs dawn_6 branch * Fri Jun 25 1999 Christopher Seawood - Split into separate rpm from gnustep-core - Build from cvs snapshot - Added header patch - Split into main & -devel packages gnustep-base-1.29.0/install.sh000077500000000000000000000002331435650067400162150ustar00rootroot00000000000000#! /bin/sh PREFIX=$1 MAKE=${2-make} . $PREFIX/System/Library/Makefiles/GNUstep.sh $MAKE GNUSTEP_INSTALLATION_DOMAIN=SYSTEM messages=yes install exit 0 gnustep-base-1.29.0/macosx/000077500000000000000000000000001435650067400155045ustar00rootroot00000000000000gnustep-base-1.29.0/macosx/English.lproj/000077500000000000000000000000001435650067400202225ustar00rootroot00000000000000gnustep-base-1.29.0/macosx/English.lproj/InfoPlist.strings000066400000000000000000000010141435650067400235400ustar00rootroot00000000000000þÿ/* Localized versions of Info.plist keys */ CFBundleName = "gnustep"; CFBundleShortVersionString = "gnustep version 1.5.1"; CFBundleGetInfoString = "gnustep version 1.5.1, Copyright (c) 2003 GNUStep."; NSHumanReadableCopyright = "Copyright (c) 2003 GNUStep."; gnustep-base-1.29.0/macosx/GNUstepBase/000077500000000000000000000000001435650067400176245ustar00rootroot00000000000000gnustep-base-1.29.0/macosx/GNUstepBase/preface.h000066400000000000000000000102421435650067400214010ustar00rootroot00000000000000/* General purpose definitions for the GNU Objective-C Library. Copyright (C) 1993, 1994, 1995, 1996 Free Software Foundation, Inc. Written by: Andrew Kachites McCallum Created: May 1993 This file is part of the GNUstep Base Library. 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 3 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #ifndef __preface_h_OBJECTS_INCLUDE #define __preface_h_OBJECTS_INCLUDE #include #include #include #if NeXT_RUNTIME #include #include #include #ifndef _C_ATOM #define _C_ATOM '%' #endif #define _F_CONST 0x01 #define _F_IN 0x01 #define _F_OUT 0x02 #define _F_INOUT 0x03 #define _F_BYCOPY 0x04 #define _F_ONEWAY 0x08 #define _C_CONST 'r' #define _C_IN 'n' #define _C_INOUT 'N' #define _C_OUT 'o' #define _C_BYCOPY 'O' #define _C_ONEWAY 'V' #else /* GNU Objective C Runtime */ #include #include #include #include /* #include */ #endif /* * Hack for older compiler versions that don't have all defines * needed in objc-api.h */ #ifndef _C_LNG_LNG #define _C_LNG_LNG 'q' #endif #ifndef _C_ULNG_LNG #define _C_ULNG_LNG 'Q' #endif #include /* Hack to get rid of warning in GNU libc 2.0.3. */ /* The following group of lines maintained by the gstep-base configure */ #define GNUSTEP_BASE_VERSION @VERSION@ #define GNUSTEP_BASE_MAJOR_VERSION 1 #define GNUSTEP_BASE_MINOR_VERSION 6 #define GNUSTEP_BASE_SUBMINOR_VERSION 0 #define GNUSTEP_BASE_GCC_VERSION @GCC_VERSION@ #if 0 extern const char o_version[]; extern const char o_gcc_version[]; #if NeXT_cc extern const char o_NeXT_cc_version[]; #endif #endif #define OBJC_MALLOC(VAR, TYPE, NUM) \ ((VAR) = (TYPE *) objc_malloc ((unsigned)(NUM)*sizeof(TYPE))) #define OBJC_VALLOC(VAR, TYPE, NUM) \ ((VAR) = (TYPE *) objc_valloc ((unsigned)(NUM)*sizeof(TYPE))) #define OBJC_ATOMIC_MALLOC(VAR, TYPE, NUM) \ ((VAR) = (TYPE *) objc_atomic_malloc ((unsigned)(NUM)*sizeof(TYPE))) #define OBJC_REALLOC(VAR, TYPE, NUM) \ ((VAR) = (TYPE *) objc_realloc ((VAR), (unsigned)(NUM)*sizeof(TYPE))) #define OBJC_CALLOC(VAR, TYPE, NUM) \ ((VAR) = (TYPE *) objc_calloc ((unsigned)(NUM), sizeof(TYPE))) #define OBJC_FREE(PTR) objc_free (PTR) #ifndef MAX #define MAX(a,b) \ ({__typeof__(a) _MAX_a = (a); __typeof__(b) _MAX_b = (b); \ _MAX_a > _MAX_b ? _MAX_a : _MAX_b; }) #endif #ifndef MIN #define MIN(a,b) \ ({__typeof__(a) _MIN_a = (a); __typeof__(b) _MIN_b = (b); \ _MIN_a < _MIN_b ? _MIN_a : _MIN_b; }) #endif #ifndef ABS #define ABS(a) \ ({__typeof__(a) _ABS_a = (a); \ _ABS_a < 0 ? -_ABS_a : _ABS_a; }) #endif #ifndef STRINGIFY #define STRINGIFY(s) XSTRINGIFY(s) #define XSTRINGIFY(s) #s #endif #ifndef OBJC_STRINGIFY #define OBJC_STRINGIFY(s) OBJC_XSTRINGIFY(s) #define OBJC_XSTRINGIFY(s) @#s #endif #ifndef PTR2LONG #define PTR2LONG(P) (((char*)(P))-(char*)0) #endif #ifndef LONG2PTR #define LONG2PTR(L) (((char*)0)+(L)) #endif #if VSPRINTF_RETURNS_LENGTH #define VSPRINTF_LENGTH(VSPF_CALL) (VSPF_CALL) #else #define VSPRINTF_LENGTH(VSPF_CALL) strlen((VSPF_CALL)) #endif /* VSPRINTF_RETURNS_LENGTH */ #if VASPRINTF_RETURNS_LENGTH #define VASPRINTF_LENGTH(VASPF_CALL) (VASPF_CALL) #else #define VASPRINTF_LENGTH(VASPF_CALL) strlen((VASPF_CALL)) #endif /* VSPRINTF_RETURNS_LENGTH */ #endif /* __preface_h_OBJECTS_INCLUDE */ gnustep-base-1.29.0/macosx/README000066400000000000000000000015631435650067400163710ustar00rootroot00000000000000 ProjectBuilder Project for GNUstep Additions Framework on MacOSX --------------------------------------------------------------- This a MacOSX ProjectBuilder project for building the GNUstep Additions Framework, written by Stephane Corthesy . If builds a library that contains classes and extensions found in the GNUstep base library, but that are not found in the MacOSX Foundation framework. Currently updated for Mac OS X 10.3 Note that the GNUstep developers do NOT maintain this project as we do not normally have access to MacOSX machines. Thus it is possible this project will be out of date with the actual sources. However, it is always possible to build the Additions library with the standard GNUstep make system (install gnustep-make first, then build gnustep-base with make base=no add=yes). Volunteers to help maintain this project are welcome. gnustep-base-1.29.0/macosx/config.h000066400000000000000000000034601435650067400171250ustar00rootroot00000000000000/* config.h.in Copyright (C) 2002 Free Software Foundation, Inc. Author: Mirko Viviani Date: September 2002 This file is part of the GNUstep Database Library. 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 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 Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __config_h__ #define __config_h__ #ifndef GNUSTEP_BASE_MAJOR_VERSION #define GNUSTEP_BASE_MAJOR_VERSION 1 #define GNUSTEP_BASE_MINOR_VERSION 6 #define GNUSTEP_BASE_SUBMINOR_VERSION 0 #endif /* Define if Foundation implements KeyValueCoding. */ #define FOUNDATION_HAS_KVC 1 #ifndef HAVE_LIBC_H #define HAVE_LIBC_H 1 #endif #ifndef NeXT_RUNTIME #define NeXT_RUNTIME 1 #endif #ifndef NeXT_Foundation_LIBRARY #define NeXT_Foundation_LIBRARY 1 #endif #ifndef HAVE_WCHAR_H #define HAVE_WCHAR_H 1 #endif #ifndef HAVE_STRERROR #define HAVE_STRERROR 1 #endif #ifndef HAVE_LIBXML #define HAVE_LIBXML 1 #endif #ifndef HAVE_ICONV #define HAVE_ICONV 1 #endif #ifndef HAVE_INET_ATON #define HAVE_INET_ATON 1 #endif #ifndef RCS_ID #define RCS_ID(name) \ static const char rcsId[] = name; \ static const char *__rcsId_hack() {__rcsId_hack(); return rcsId;} #endif #endif /* __config_h__ */ gnustep-base-1.29.0/macosx/gnustep.pbproj/000077500000000000000000000000001435650067400204645ustar00rootroot00000000000000gnustep-base-1.29.0/macosx/gnustep.pbproj/project.pbxproj000066400000000000000000001220221435650067400235370ustar00rootroot00000000000000// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 39; objects = { 014CEA440018CDF011CA2923 = { buildRules = ( ); buildSettings = { COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; GCC_GENERATE_DEBUGGING_SYMBOLS = YES; GCC_OPTIMIZATION_LEVEL = 0; OPTIMIZATION_CFLAGS = "-O0"; ZERO_LINK = YES; }; isa = PBXBuildStyle; name = Development; }; 014CEA450018CDF011CA2923 = { buildRules = ( ); buildSettings = { COPY_PHASE_STRIP = YES; GCC_ENABLE_FIX_AND_CONTINUE = NO; ZERO_LINK = NO; }; isa = PBXBuildStyle; name = Deployment; }; //010 //011 //012 //013 //014 //030 //031 //032 //033 //034 034768DFFF38A50411DB9C8B = { children = ( 034768E0FF38A50411DB9C8B, 55AB58710408D27700000001, 554DDE7F04310FB500000001, ); isa = PBXGroup; name = Products; refType = 4; sourceTree = ""; }; 034768E0FF38A50411DB9C8B = { expectedFileType = wrapper.framework; fallbackIsa = PBXFileReference; isa = PBXFrameworkReference; path = GNUstepBase.framework; refType = 3; sourceTree = BUILT_PRODUCTS_DIR; }; //030 //031 //032 //033 //034 //080 //081 //082 //083 //084 0867D690FE84028FC02AAC07 = { buildSettings = { }; buildStyles = ( 014CEA440018CDF011CA2923, 014CEA450018CDF011CA2923, ); hasScannedForEncodings = 1; isa = PBXProject; mainGroup = 0867D691FE84028FC02AAC07; productRefGroup = 034768DFFF38A50411DB9C8B; projectDirPath = ""; targets = ( 0867D69CFE84028FC02AAC07, 55AB58700408D27700000001, 554DDE7E04310FB500000001, ); }; 0867D691FE84028FC02AAC07 = { children = ( 5566CC2804324D9F00000002, 5566CC2904324DA700000002, 556FFDF103EC37C700000001, 08FB77AEFE84172EC02AAC07, 32C88DFF0371C24200C91783, 089C1665FE841158C02AAC07, 554DDE790430F9DB00000001, 0867D69AFE84028FC02AAC07, 034768DFFF38A50411DB9C8B, ); isa = PBXGroup; name = gnustep; refType = 4; sourceTree = ""; }; 0867D69AFE84028FC02AAC07 = { children = ( 1058C7B0FEA5585E11CA2CBB, 1058C7B2FEA5585E11CA2CBB, ); isa = PBXGroup; name = "External Frameworks and Libraries"; refType = 4; sourceTree = ""; }; 0867D69BFE84028FC02AAC07 = { expectedFileType = wrapper.framework; fallbackIsa = PBXFileReference; isa = PBXFrameworkReference; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; refType = 0; sourceTree = ""; }; 0867D69CFE84028FC02AAC07 = { buildPhases = ( 0867D69DFE84028FC02AAC07, 55CF467D03E3694000000001, 0867D69EFE84028FC02AAC07, 0867D69FFE84028FC02AAC07, 0867D6A0FE84028FC02AAC07, 0867D6A2FE84028FC02AAC07, 55AB58490408D05A00000001, 55AB588E0408DB4700000001, 55AB58EB0408EADB00000001, 554DDE87043110C200000001, ); buildSettings = { DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; FRAMEWORK_SEARCH_PATHS = ""; FRAMEWORK_VERSION = A; HEADER_SEARCH_PATHS = ". /sw/include /sw/include/libxml2"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LIBRARY_SEARCH_PATHS = "/usr/local/lib /sw/lib"; OPTIMIZATION_CFLAGS = "-O0"; OTHER_LDFLAGS = "-seg1addr 0x58000000 -headerpad_max_install_names"; PRECOMPILE_PREFIX_HEADER = YES; PREFIX_HEADER = config.h; PRODUCT_NAME = GNUstepBase; SECTORDER_FLAGS = ""; WARNING_CFLAGS = "-Wmost -Wno-four-char-constants -Wno-unknown-pragmas"; WRAPPER_EXTENSION = framework; }; dependencies = ( ); isa = PBXFrameworkTarget; name = gnustep; productInstallPath = "$(LOCAL_LIBRARY_DIR)/Frameworks"; productName = gnustep; productReference = 034768E0FF38A50411DB9C8B; productSettingsXML = " CFBundleDevelopmentRegion English CFBundleExecutable GNUstepBase CFBundleIconFile CFBundleIdentifier CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType FMWK CFBundleSignature ???? CFBundleVersion 1.6.0 NSPrincipalClass "; }; 0867D69DFE84028FC02AAC07 = { buildActionMask = 2147483647; files = ( 55F7D7E303E49D7700000001, 556FFD2303EC2ECE00000001, 556FFD2403EC2ECE00000001, 556FFD2503EC2ECE00000001, 556FFD2603EC2ECE00000001, 556FFD2703EC2ECE00000001, 556FFD2803EC2ECE00000001, 556FFD2903EC2ECE00000001, 556FFD2A03EC2ECE00000001, 556FFD2B03EC2ECE00000001, 556FFD9203EC36E500000001, 556FFD9703EC36E500000001, 556FFD9803EC36E500000001, 556FFD9903EC36E500000001, 556FFDA103EC36E500000001, 556FFDA203EC36E500000001, 556FFDA403EC36E500000001, 556FFDE903EC36E500000001, 556FFDEB03EC36E500000001, 556FFDEE03EC36E500000001, 555FEDB803EC450500000001, 555112B403FEC81600000001, EFEFAC3D055D9BC400B39730, ); isa = PBXHeadersBuildPhase; runOnlyForDeploymentPostprocessing = 0; }; 0867D69EFE84028FC02AAC07 = { buildActionMask = 2147483647; files = ( 089C1668FE841158C02AAC07, ); isa = PBXResourcesBuildPhase; runOnlyForDeploymentPostprocessing = 0; }; 0867D69FFE84028FC02AAC07 = { buildActionMask = 2147483647; files = ( 55CF466B03E367A500000001, 55F7D5D003E4072000000001, 55F7D5D403E47F9300000001, 55F7D5D603E48A2800000001, 55F7D5D703E48A7500000001, 55F7D5D903E48B8600000001, 55F7D5DA03E48B8700000001, 55F7D5E003E48C8300000001, 55F7D5E303E48D0A00000001, 555112B803FEC83800000001, 55AB58310408CDFC00000001, 55AB58320408CDFD00000001, EFEFAC3F055D9BF400B39730, ); isa = PBXSourcesBuildPhase; runOnlyForDeploymentPostprocessing = 0; }; 0867D6A0FE84028FC02AAC07 = { buildActionMask = 2147483647; files = ( 55CF467E03E369AE00000001, 55AB58330408CE0100000001, 55AB58340408CE0200000001, 55AB58350408CE0300000001, ); isa = PBXFrameworksBuildPhase; runOnlyForDeploymentPostprocessing = 0; }; 0867D6A2FE84028FC02AAC07 = { buildActionMask = 2147483647; files = ( ); isa = PBXRezBuildPhase; runOnlyForDeploymentPostprocessing = 0; }; 089C1665FE841158C02AAC07 = { children = ( 55AB58E50408EA4D00000001, 55AB588D0408D85E00000001, 089C1666FE841158C02AAC07, 55AB585B0408D08700000001, ); isa = PBXGroup; name = Resources; refType = 4; sourceTree = ""; }; 089C1666FE841158C02AAC07 = { children = ( 089C1667FE841158C02AAC07, ); isa = PBXVariantGroup; name = InfoPlist.strings; refType = 4; sourceTree = ""; }; 089C1667FE841158C02AAC07 = { expectedFileType = text.plist.strings; fileEncoding = 10; isa = PBXFileReference; name = English; path = English.lproj/InfoPlist.strings; refType = 4; sourceTree = ""; }; 089C1668FE841158C02AAC07 = { fileRef = 089C1666FE841158C02AAC07; isa = PBXBuildFile; settings = { }; }; 08FB77AEFE84172EC02AAC07 = { children = ( 55CF465F03E367A500000001, 55CF466003E367A500000001, 55CF466103E367A500000001, 55CF466203E367A500000001, EFEFAC3E055D9BF400B39730, 55CF466303E367A500000001, 55CF466503E367A500000001, 55CF466603E367A500000001, 55CF466703E367A500000001, 55CF466803E367A500000001, 55CF466903E367A500000001, EFF20035050D035500A80103, 55CF466A03E367A500000001, ); isa = PBXGroup; name = Source; path = ../Source; refType = 2; sourceTree = SOURCE_ROOT; }; //080 //081 //082 //083 //084 //100 //101 //102 //103 //104 1058C7B0FEA5585E11CA2CBB = { children = ( 0867D69BFE84028FC02AAC07, 556FFD2C03EC331600000001, 559CDB7E040587E100000001, 559CDB8004058ACF00000001, 55AB58870408D30500000001, ); isa = PBXGroup; name = "Linked Frameworks"; refType = 4; sourceTree = ""; }; 1058C7B2FEA5585E11CA2CBB = { children = ( ); isa = PBXGroup; name = "Other Frameworks"; refType = 4; sourceTree = ""; }; //100 //101 //102 //103 //104 //320 //321 //322 //323 //324 32C88DFF0371C24200C91783 = { children = ( 55F7D7E003E49D7700000001, 555112B603FEC83800000001, 55E1346E043268A100000002, ); isa = PBXGroup; name = "Other Sources"; refType = 4; sourceTree = ""; }; //320 //321 //322 //323 //324 //550 //551 //552 //553 //554 554DDE790430F9DB00000001 = { children = ( 55AB58740408D2A800000001, 554DDE820431104D00000001, ); isa = PBXGroup; name = Tools; path = ../Tools; refType = 4; sourceTree = ""; }; 554DDE7A04310FB500000001 = { buildActionMask = 2147483647; files = ( ); isa = PBXHeadersBuildPhase; runOnlyForDeploymentPostprocessing = 0; }; 554DDE7B04310FB500000001 = { buildActionMask = 2147483647; files = ( 554DDE840431106D00000001, ); isa = PBXSourcesBuildPhase; runOnlyForDeploymentPostprocessing = 0; }; 554DDE7C04310FB500000001 = { buildActionMask = 2147483647; files = ( 554DDE890431135200000001, ); isa = PBXFrameworksBuildPhase; runOnlyForDeploymentPostprocessing = 0; }; 554DDE7D04310FB500000001 = { buildActionMask = 2147483647; files = ( ); isa = PBXRezBuildPhase; runOnlyForDeploymentPostprocessing = 0; }; 554DDE7E04310FB500000001 = { buildPhases = ( 554DDE7A04310FB500000001, 554DDE7B04310FB500000001, 554DDE7C04310FB500000001, 554DDE7D04310FB500000001, ); buildSettings = { INSTALL_PATH = /usr/local/bin; OTHER_CFLAGS = ""; OTHER_LDFLAGS = ""; OTHER_REZFLAGS = ""; PRECOMPILE_PREFIX_HEADER = YES; PREFIX_HEADER = config.h; PRODUCT_NAME = HTMLLinker; REZ_EXECUTABLE = YES; SECTORDER_FLAGS = ""; WARNING_CFLAGS = "-Wmost -Wno-four-char-constants -Wno-unknown-pragmas"; }; dependencies = ( 554DDE8104310FBF00000001, ); isa = PBXToolTarget; name = HTMLLinker; productInstallPath = /usr/local/bin; productName = HTMLLinker; productReference = 554DDE7F04310FB500000001; }; 554DDE7F04310FB500000001 = { expectedFileType = "compiled.mach-o.executable"; fallbackIsa = PBXFileReference; isa = PBXExecutableFileReference; path = HTMLLinker; refType = 3; sourceTree = BUILT_PRODUCTS_DIR; }; 554DDE8104310FBF00000001 = { isa = PBXTargetDependency; target = 0867D69CFE84028FC02AAC07; targetProxy = EFF06DE3054E5BDA002EC6F5; }; 554DDE820431104D00000001 = { children = ( 554DDE85043110AA00000001, 554DDE830431106D00000001, ); isa = PBXGroup; name = HTMLLinker; refType = 4; sourceTree = ""; }; 554DDE830431106D00000001 = { expectedFileType = file; fileEncoding = 30; isa = PBXFileReference; path = HTMLLinker.m; refType = 4; sourceTree = ""; }; 554DDE840431106D00000001 = { fileRef = 554DDE830431106D00000001; isa = PBXBuildFile; settings = { }; }; 554DDE85043110AA00000001 = { expectedFileType = file; fileEncoding = 30; isa = PBXFileReference; path = HTMLLinker.html; refType = 4; sourceTree = ""; }; 554DDE87043110C200000001 = { buildActionMask = 2147483647; dstPath = English.lproj/Documentation; dstSubfolderSpec = 7; files = ( ); isa = PBXCopyFilesBuildPhase; runOnlyForDeploymentPostprocessing = 0; }; 554DDE890431135200000001 = { fileRef = 0867D69BFE84028FC02AAC07; isa = PBXBuildFile; settings = { }; }; 555112B303FEC81600000001 = { expectedFileType = sourcecode.c.h; fileEncoding = 30; isa = PBXFileReference; path = "thr-mach.h"; refType = 4; sourceTree = ""; }; 555112B403FEC81600000001 = { fileRef = 555112B303FEC81600000001; isa = PBXBuildFile; settings = { ATTRIBUTES = ( Public, ); }; }; 555112B603FEC83800000001 = { expectedFileType = sourcecode.c.objc; fileEncoding = 30; isa = PBXFileReference; name = "thr-pthread.m"; path = "../Source/thr-pthread.m"; refType = 4; sourceTree = ""; }; 555112B803FEC83800000001 = { fileRef = 555112B603FEC83800000001; isa = PBXBuildFile; settings = { }; }; 555FEDB703EC450500000001 = { expectedFileType = sourcecode.c.h; fileEncoding = 30; isa = PBXFileReference; name = GSCompatibility.h; path = ../../../Source/Additions/GSCompatibility.h; refType = 4; sourceTree = ""; }; 555FEDB803EC450500000001 = { fileRef = 555FEDB703EC450500000001; isa = PBXBuildFile; settings = { ATTRIBUTES = ( Public, ); }; }; 5566CC2804324D9F00000002 = { expectedFileType = text; fileEncoding = 30; isa = PBXFileReference; name = README; path = ../macosx/README; refType = 4; sourceTree = ""; }; 5566CC2904324DA700000002 = { children = ( 55F7D7D803E49C1000000001, 55F7D7D903E49C1000000001, 55F7D7DA03E49C1000000001, 55F7D7DB03E49C1000000001, 55F7D7DC03E49C1000000001, 55F7D7DD03E49C1000000001, 55F7D7DE03E49C1000000001, 55F7D7DF03E49C1000000001, ); isa = PBXGroup; name = Documentation; path = ../Documentation; refType = 2; sourceTree = SOURCE_ROOT; }; 556FFD1903EC2ECE00000001 = { children = ( 556FFD1A03EC2ECE00000001, 556FFD1B03EC2ECE00000001, 556FFD1C03EC2ECE00000001, 556FFD1D03EC2ECE00000001, 556FFD1E03EC2ECE00000001, 556FFD1F03EC2ECE00000001, 556FFD2003EC2ECE00000001, 556FFD2103EC2ECE00000001, 556FFD2203EC2ECE00000001, ); isa = PBXGroup; name = unicode; path = Additions/GNUstepBase/unicode; refType = 4; sourceTree = ""; }; 556FFD1A03EC2ECE00000001 = { expectedFileType = sourcecode.c.h; fileEncoding = 30; isa = PBXFileReference; path = caseconv.h; refType = 4; sourceTree = ""; }; 556FFD1B03EC2ECE00000001 = { expectedFileType = sourcecode.c.h; fileEncoding = 30; isa = PBXFileReference; path = cop.h; refType = 4; sourceTree = ""; }; 556FFD1C03EC2ECE00000001 = { expectedFileType = sourcecode.c.h; fileEncoding = 30; isa = PBXFileReference; path = cyrillic.h; refType = 4; sourceTree = ""; }; 556FFD1D03EC2ECE00000001 = { expectedFileType = sourcecode.c.h; fileEncoding = 30; isa = PBXFileReference; path = decomp.h; refType = 4; sourceTree = ""; }; 556FFD1E03EC2ECE00000001 = { expectedFileType = sourcecode.c.h; fileEncoding = 30; isa = PBXFileReference; path = gsm0338.h; refType = 4; sourceTree = ""; }; 556FFD1F03EC2ECE00000001 = { expectedFileType = sourcecode.c.h; fileEncoding = 30; isa = PBXFileReference; path = latin2.h; refType = 4; sourceTree = ""; }; 556FFD2003EC2ECE00000001 = { expectedFileType = sourcecode.c.h; fileEncoding = 30; isa = PBXFileReference; path = latin9.h; refType = 4; sourceTree = ""; }; 556FFD2103EC2ECE00000001 = { expectedFileType = sourcecode.c.h; fileEncoding = 30; isa = PBXFileReference; path = nextstep.h; refType = 4; sourceTree = ""; }; 556FFD2203EC2ECE00000001 = { expectedFileType = sourcecode.c.h; fileEncoding = 30; isa = PBXFileReference; path = thai.h; refType = 4; sourceTree = ""; }; 556FFD2303EC2ECE00000001 = { fileRef = 556FFD1A03EC2ECE00000001; isa = PBXBuildFile; settings = { }; }; 556FFD2403EC2ECE00000001 = { fileRef = 556FFD1B03EC2ECE00000001; isa = PBXBuildFile; settings = { }; }; 556FFD2503EC2ECE00000001 = { fileRef = 556FFD1C03EC2ECE00000001; isa = PBXBuildFile; settings = { }; }; 556FFD2603EC2ECE00000001 = { fileRef = 556FFD1D03EC2ECE00000001; isa = PBXBuildFile; settings = { }; }; 556FFD2703EC2ECE00000001 = { fileRef = 556FFD1E03EC2ECE00000001; isa = PBXBuildFile; settings = { }; }; 556FFD2803EC2ECE00000001 = { fileRef = 556FFD1F03EC2ECE00000001; isa = PBXBuildFile; settings = { }; }; 556FFD2903EC2ECE00000001 = { fileRef = 556FFD2003EC2ECE00000001; isa = PBXBuildFile; settings = { }; }; 556FFD2A03EC2ECE00000001 = { fileRef = 556FFD2103EC2ECE00000001; isa = PBXBuildFile; settings = { }; }; 556FFD2B03EC2ECE00000001 = { fileRef = 556FFD2203EC2ECE00000001; isa = PBXBuildFile; settings = { }; }; 556FFD2C03EC331600000001 = { expectedFileType = "compiled.mach-o.dylib"; isa = PBXFileReference; name = libiconv.dylib; path = /sw/lib/libiconv.dylib; refType = 0; sourceTree = ""; }; 556FFD2E03EC36E500000001 = { children = ( 556FFD3103EC36E500000001, 556FFD3603EC36E500000001, EFEFAC3C055D9BC400B39730, 556FFD3703EC36E500000001, 556FFD3803EC36E500000001, 556FFD4003EC36E500000001, 556FFD4103EC36E500000001, 556FFD4303EC36E500000001, 556FFD8803EC36E500000001, 556FFD8A03EC36E500000001, 556FFD8B03EC36E500000001, 556FFD8D03EC36E500000001, 555FEDB703EC450500000001, 555112B303FEC81600000001, ); isa = PBXGroup; name = GNUstepBase; path = Additions/GNUstepBase; refType = 4; sourceTree = ""; }; 556FFD3103EC36E500000001 = { expectedFileType = sourcecode.c.h; fileEncoding = 30; isa = PBXFileReference; path = behavior.h; refType = 4; sourceTree = ""; }; 556FFD3603EC36E500000001 = { expectedFileType = sourcecode.c.h; fileEncoding = 30; isa = PBXFileReference; path = GCObject.h; refType = 4; sourceTree = ""; }; 556FFD3703EC36E500000001 = { expectedFileType = sourcecode.c.h; fileEncoding = 30; isa = PBXFileReference; path = GNUstep.h; refType = 4; sourceTree = ""; }; 556FFD3803EC36E500000001 = { expectedFileType = sourcecode.c.h; fileEncoding = 30; isa = PBXFileReference; path = GSCategories.h; refType = 4; sourceTree = ""; }; 556FFD4003EC36E500000001 = { expectedFileType = sourcecode.c.h; fileEncoding = 30; isa = PBXFileReference; path = GSMime.h; refType = 4; sourceTree = ""; }; 556FFD4103EC36E500000001 = { expectedFileType = sourcecode.c.h; fileEncoding = 30; isa = PBXFileReference; path = GSObjCRuntime.h; refType = 4; sourceTree = ""; }; 556FFD4303EC36E500000001 = { expectedFileType = sourcecode.c.h; fileEncoding = 30; isa = PBXFileReference; path = GSXML.h; refType = 4; sourceTree = ""; }; 556FFD8803EC36E500000001 = { expectedFileType = sourcecode.c.h; fileEncoding = 30; isa = PBXFileReference; path = "objc-gnu2next.h"; refType = 4; sourceTree = ""; }; 556FFD8A03EC36E500000001 = { expectedFileType = sourcecode.c.h; fileEncoding = 30; isa = PBXFileReference; name = preface.h; path = GNUstepBase/preface.h; refType = 2; sourceTree = SOURCE_ROOT; }; 556FFD8B03EC36E500000001 = { expectedFileType = text; fileEncoding = 30; isa = PBXFileReference; path = preface.h.in; refType = 4; sourceTree = ""; }; 556FFD8D03EC36E500000001 = { expectedFileType = sourcecode.c.h; fileEncoding = 30; isa = PBXFileReference; path = Unicode.h; refType = 4; sourceTree = ""; }; 556FFD9203EC36E500000001 = { fileRef = 556FFD3103EC36E500000001; isa = PBXBuildFile; settings = { ATTRIBUTES = ( Public, ); }; }; 556FFD9703EC36E500000001 = { fileRef = 556FFD3603EC36E500000001; isa = PBXBuildFile; settings = { ATTRIBUTES = ( Public, ); }; }; 556FFD9803EC36E500000001 = { fileRef = 556FFD3703EC36E500000001; isa = PBXBuildFile; settings = { ATTRIBUTES = ( Public, ); }; }; 556FFD9903EC36E500000001 = { fileRef = 556FFD3803EC36E500000001; isa = PBXBuildFile; settings = { ATTRIBUTES = ( Public, ); }; }; 556FFDA103EC36E500000001 = { fileRef = 556FFD4003EC36E500000001; isa = PBXBuildFile; settings = { ATTRIBUTES = ( Public, ); }; }; 556FFDA203EC36E500000001 = { fileRef = 556FFD4103EC36E500000001; isa = PBXBuildFile; settings = { ATTRIBUTES = ( Public, ); }; }; 556FFDA403EC36E500000001 = { fileRef = 556FFD4303EC36E500000001; isa = PBXBuildFile; settings = { ATTRIBUTES = ( Public, ); }; }; 556FFDE903EC36E500000001 = { fileRef = 556FFD8803EC36E500000001; isa = PBXBuildFile; settings = { ATTRIBUTES = ( Public, ); }; }; 556FFDEB03EC36E500000001 = { fileRef = 556FFD8A03EC36E500000001; isa = PBXBuildFile; settings = { ATTRIBUTES = ( Public, ); }; }; 556FFDEE03EC36E500000001 = { fileRef = 556FFD8D03EC36E500000001; isa = PBXBuildFile; settings = { ATTRIBUTES = ( Public, ); }; }; 556FFDF103EC37C700000001 = { children = ( 556FFD2E03EC36E500000001, 556FFD1903EC2ECE00000001, ); isa = PBXGroup; name = Headers; path = ../Headers; refType = 2; sourceTree = SOURCE_ROOT; }; 559CDB7E040587E100000001 = { expectedFileType = archive.ar; isa = PBXFileReference; name = libxml2.a; path = /sw/lib/libxml2.a; refType = 0; sourceTree = ""; }; 559CDB8004058ACF00000001 = { expectedFileType = "compiled.mach-o.dylib"; isa = PBXFileReference; name = libz.dylib; path = /usr/lib/libz.dylib; refType = 0; sourceTree = ""; }; 55AB58310408CDFC00000001 = { fileRef = 55CF466903E367A500000001; isa = PBXBuildFile; settings = { }; }; 55AB58320408CDFD00000001 = { fileRef = 55CF466A03E367A500000001; isa = PBXBuildFile; settings = { }; }; 55AB58330408CE0100000001 = { fileRef = 556FFD2C03EC331600000001; isa = PBXBuildFile; settings = { }; }; 55AB58340408CE0200000001 = { fileRef = 559CDB7E040587E100000001; isa = PBXBuildFile; settings = { }; }; 55AB58350408CE0300000001 = { fileRef = 559CDB8004058ACF00000001; isa = PBXBuildFile; settings = { }; }; 55AB58490408D05A00000001 = { buildActionMask = 2147483647; dstPath = Languages; dstSubfolderSpec = 7; files = ( 55AB586B0408D09400000001, ); isa = PBXCopyFilesBuildPhase; runOnlyForDeploymentPostprocessing = 0; }; 55AB585B0408D08700000001 = { children = ( 55AB58660408D08700000001, ); isa = PBXGroup; name = Languages; path = ../Resources/Languages; refType = 4; sourceTree = ""; }; 55AB58660408D08700000001 = { expectedFileType = text; fileEncoding = 30; isa = PBXFileReference; path = Locale.encodings; refType = 4; sourceTree = ""; }; 55AB586B0408D09400000001 = { fileRef = 55AB58660408D08700000001; isa = PBXBuildFile; settings = { }; }; 55AB586C0408D27700000001 = { buildActionMask = 2147483647; files = ( 55AB587E0408D2DB00000001, 55AB58800408D2DB00000001, 55AB58820408D2DB00000001, 55AB58840408D2DB00000001, ); isa = PBXHeadersBuildPhase; runOnlyForDeploymentPostprocessing = 0; }; 55AB586D0408D27700000001 = { buildActionMask = 2147483647; files = ( 55AB587F0408D2DB00000001, 55AB58810408D2DB00000001, 55AB58830408D2DB00000001, 55AB58850408D2DB00000001, 55AB58860408D2DB00000001, ); isa = PBXSourcesBuildPhase; runOnlyForDeploymentPostprocessing = 0; }; 55AB586E0408D27700000001 = { buildActionMask = 2147483647; files = ( 55AB58880408D30500000001, 55AB58890408D30A00000001, 55AB588A0408D30D00000001, 55AB588B0408D30E00000001, 55AB588C0408D30F00000001, ); isa = PBXFrameworksBuildPhase; runOnlyForDeploymentPostprocessing = 0; }; 55AB586F0408D27700000001 = { buildActionMask = 2147483647; files = ( ); isa = PBXRezBuildPhase; runOnlyForDeploymentPostprocessing = 0; }; 55AB58700408D27700000001 = { buildPhases = ( 55AB586C0408D27700000001, 55AB586D0408D27700000001, 55AB586E0408D27700000001, 55AB586F0408D27700000001, ); buildSettings = { INSTALL_PATH = /usr/local/bin; LIBRARY_SEARCH_PATHS = /sw/lib; OTHER_CFLAGS = ""; OTHER_LDFLAGS = ""; OTHER_REZFLAGS = ""; PRECOMPILE_PREFIX_HEADER = YES; PREFIX_HEADER = config.h; PRODUCT_NAME = autogsdoc; REZ_EXECUTABLE = YES; SECTORDER_FLAGS = ""; WARNING_CFLAGS = "-Wmost -Wno-four-char-constants -Wno-unknown-pragmas"; }; dependencies = ( 55AB58730408D28300000001, ); isa = PBXToolTarget; name = autogsdoc; productInstallPath = /usr/local/bin; productName = autogsdoc; productReference = 55AB58710408D27700000001; }; 55AB58710408D27700000001 = { expectedFileType = "compiled.mach-o.executable"; fallbackIsa = PBXFileReference; isa = PBXExecutableFileReference; path = autogsdoc; refType = 3; sourceTree = BUILT_PRODUCTS_DIR; }; 55AB58730408D28300000001 = { isa = PBXTargetDependency; target = 0867D69CFE84028FC02AAC07; targetProxy = EFF06DE4054E5BDA002EC6F5; }; 55AB58740408D2A800000001 = { children = ( 55AB58750408D2DB00000001, 55AB58760408D2DB00000001, 55AB58770408D2DB00000001, 55AB58780408D2DB00000001, 55AB58790408D2DB00000001, 55AB587A0408D2DB00000001, 55AB587B0408D2DB00000001, 55AB587C0408D2DB00000001, 55AB587D0408D2DB00000001, ); isa = PBXGroup; name = autogsdoc; path = ""; refType = 4; sourceTree = ""; }; 55AB58750408D2DB00000001 = { expectedFileType = sourcecode.c.h; fileEncoding = 30; isa = PBXFileReference; path = AGSHtml.h; refType = 4; sourceTree = ""; }; 55AB58760408D2DB00000001 = { expectedFileType = sourcecode.c.objc; fileEncoding = 30; isa = PBXFileReference; path = AGSHtml.m; refType = 4; sourceTree = ""; }; 55AB58770408D2DB00000001 = { expectedFileType = sourcecode.c.h; fileEncoding = 30; isa = PBXFileReference; path = AGSIndex.h; refType = 4; sourceTree = ""; }; 55AB58780408D2DB00000001 = { expectedFileType = sourcecode.c.objc; fileEncoding = 30; isa = PBXFileReference; path = AGSIndex.m; refType = 4; sourceTree = ""; }; 55AB58790408D2DB00000001 = { expectedFileType = sourcecode.c.h; fileEncoding = 30; isa = PBXFileReference; path = AGSOutput.h; refType = 4; sourceTree = ""; }; 55AB587A0408D2DB00000001 = { expectedFileType = sourcecode.c.objc; fileEncoding = 30; isa = PBXFileReference; path = AGSOutput.m; refType = 4; sourceTree = ""; }; 55AB587B0408D2DB00000001 = { expectedFileType = sourcecode.c.h; fileEncoding = 30; isa = PBXFileReference; path = AGSParser.h; refType = 4; sourceTree = ""; }; 55AB587C0408D2DB00000001 = { expectedFileType = sourcecode.c.objc; fileEncoding = 30; isa = PBXFileReference; path = AGSParser.m; refType = 4; sourceTree = ""; }; 55AB587D0408D2DB00000001 = { expectedFileType = sourcecode.c.objc; fileEncoding = 30; isa = PBXFileReference; path = autogsdoc.m; refType = 4; sourceTree = ""; }; 55AB587E0408D2DB00000001 = { fileRef = 55AB58750408D2DB00000001; isa = PBXBuildFile; settings = { }; }; 55AB587F0408D2DB00000001 = { fileRef = 55AB58760408D2DB00000001; isa = PBXBuildFile; settings = { }; }; 55AB58800408D2DB00000001 = { fileRef = 55AB58770408D2DB00000001; isa = PBXBuildFile; settings = { }; }; 55AB58810408D2DB00000001 = { fileRef = 55AB58780408D2DB00000001; isa = PBXBuildFile; settings = { }; }; 55AB58820408D2DB00000001 = { fileRef = 55AB58790408D2DB00000001; isa = PBXBuildFile; settings = { }; }; 55AB58830408D2DB00000001 = { fileRef = 55AB587A0408D2DB00000001; isa = PBXBuildFile; settings = { }; }; 55AB58840408D2DB00000001 = { fileRef = 55AB587B0408D2DB00000001; isa = PBXBuildFile; settings = { }; }; 55AB58850408D2DB00000001 = { fileRef = 55AB587C0408D2DB00000001; isa = PBXBuildFile; settings = { }; }; 55AB58860408D2DB00000001 = { fileRef = 55AB587D0408D2DB00000001; isa = PBXBuildFile; settings = { }; }; 55AB58870408D30500000001 = { expectedFileType = file; fallbackIsa = PBXFileReference; isa = PBXFrameworkReference; path = gnustep.framework; refType = 3; sourceTree = BUILT_PRODUCTS_DIR; }; 55AB58880408D30500000001 = { fileRef = 55AB58870408D30500000001; isa = PBXBuildFile; settings = { }; }; 55AB58890408D30A00000001 = { fileRef = 0867D69BFE84028FC02AAC07; isa = PBXBuildFile; settings = { }; }; 55AB588A0408D30D00000001 = { fileRef = 556FFD2C03EC331600000001; isa = PBXBuildFile; settings = { }; }; 55AB588B0408D30E00000001 = { fileRef = 559CDB7E040587E100000001; isa = PBXBuildFile; settings = { }; }; 55AB588C0408D30F00000001 = { fileRef = 559CDB8004058ACF00000001; isa = PBXBuildFile; settings = { }; }; 55AB588D0408D85E00000001 = { children = ( 55AB588F0408DB7200000001, 55AB58900408DB7200000001, 55AB58910408DB7200000001, 55AB58920408DB7200000001, 55AB58EA0408EA8100000001, ); isa = PBXGroup; name = DTDs; refType = 4; sourceTree = ""; }; 55AB588E0408DB4700000001 = { buildActionMask = 2147483647; dstPath = DTDs; dstSubfolderSpec = 7; files = ( 55AB58930408DB7A00000001, 55AB58940408DB7A00000001, 55AB58950408DB7A00000001, 55AB58960408DB7A00000001, 55AB58EE0408EB0300000001, ); isa = PBXCopyFilesBuildPhase; runOnlyForDeploymentPostprocessing = 0; }; 55AB588F0408DB7200000001 = { expectedFileType = text.plist.xml; fileEncoding = 30; isa = PBXFileReference; name = "gsdoc-0_6_5.dtd"; path = "../Tools/gsdoc-0_6_5.dtd"; refType = 4; sourceTree = ""; }; 55AB58900408DB7200000001 = { expectedFileType = text.plist.xml; fileEncoding = 30; isa = PBXFileReference; name = "gsdoc-0_6_6.dtd"; path = "../Tools/gsdoc-0_6_6.dtd"; refType = 4; sourceTree = ""; }; 55AB58910408DB7200000001 = { expectedFileType = text.plist.xml; fileEncoding = 30; isa = PBXFileReference; name = "gsdoc-0_6_7.dtd"; path = "../Tools/gsdoc-0_6_7.dtd"; refType = 4; sourceTree = ""; }; 55AB58920408DB7200000001 = { expectedFileType = text.plist.xml; fileEncoding = 30; isa = PBXFileReference; name = "gsdoc-1_0_0.dtd"; path = "../Tools/gsdoc-1_0_0.dtd"; refType = 4; sourceTree = ""; }; 55AB58930408DB7A00000001 = { fileRef = 55AB588F0408DB7200000001; isa = PBXBuildFile; settings = { }; }; 55AB58940408DB7A00000001 = { fileRef = 55AB58900408DB7200000001; isa = PBXBuildFile; settings = { }; }; 55AB58950408DB7A00000001 = { fileRef = 55AB58910408DB7200000001; isa = PBXBuildFile; settings = { }; }; 55AB58960408DB7A00000001 = { fileRef = 55AB58920408DB7200000001; isa = PBXBuildFile; settings = { }; }; 55AB58E50408EA4D00000001 = { children = ( 55AB58E60408EA8100000001, 55AB58E70408EA8100000001, 55AB58E80408EA8100000001, 55AB58E90408EA8100000001, ); isa = PBXGroup; name = DocTemplates; refType = 4; sourceTree = ""; }; 55AB58E60408EA8100000001 = { expectedFileType = text.plist.xml; fileEncoding = 30; isa = PBXFileReference; name = AutoDocTemplate.gsdoc; path = ../Tools/AutoDocTemplate.gsdoc; refType = 4; sourceTree = ""; }; 55AB58E70408EA8100000001 = { expectedFileType = text.plist.xml; fileEncoding = 30; isa = PBXFileReference; name = gnustep.gsdoc; path = ../Tools/gnustep.gsdoc; refType = 4; sourceTree = ""; }; 55AB58E80408EA8100000001 = { expectedFileType = text.plist.xml; fileEncoding = 30; isa = PBXFileReference; name = gsdoc.gsdoc; path = ../Tools/gsdoc.gsdoc; refType = 4; sourceTree = ""; }; 55AB58E90408EA8100000001 = { expectedFileType = text.plist.xml; fileEncoding = 30; isa = PBXFileReference; name = indextemplate.gsdoc; path = ../Tools/indextemplate.gsdoc; refType = 4; sourceTree = ""; }; 55AB58EA0408EA8100000001 = { expectedFileType = text.plist.xml; fileEncoding = 30; isa = PBXFileReference; name = "plist-0_9.dtd"; path = "../Tools/plist-0_9.dtd"; refType = 4; sourceTree = ""; }; 55AB58EB0408EADB00000001 = { buildActionMask = 2147483647; dstPath = DocTemplates; dstSubfolderSpec = 7; files = ( 55AB58EC0408EAEE00000001, 55AB58ED0408EAEE00000001, ); isa = PBXCopyFilesBuildPhase; runOnlyForDeploymentPostprocessing = 0; }; 55AB58EC0408EAEE00000001 = { fileRef = 55AB58E60408EA8100000001; isa = PBXBuildFile; settings = { }; }; 55AB58ED0408EAEE00000001 = { fileRef = 55AB58E90408EA8100000001; isa = PBXBuildFile; settings = { }; }; 55AB58EE0408EB0300000001 = { fileRef = 55AB58EA0408EA8100000001; isa = PBXBuildFile; settings = { }; }; 55CF465F03E367A500000001 = { expectedFileType = sourcecode.c.objc; fileEncoding = 30; isa = PBXFileReference; name = behavior.m; path = ../Source/Additions/behavior.m; refType = 2; sourceTree = SOURCE_ROOT; }; 55CF466003E367A500000001 = { expectedFileType = sourcecode.c.objc; fileEncoding = 30; isa = PBXFileReference; name = GCArray.m; path = ../Source/Additions/GCArray.m; refType = 2; sourceTree = SOURCE_ROOT; }; 55CF466103E367A500000001 = { expectedFileType = sourcecode.c.objc; fileEncoding = 30; isa = PBXFileReference; name = GCDictionary.m; path = ../Source/Additions/GCDictionary.m; refType = 2; sourceTree = SOURCE_ROOT; }; 55CF466203E367A500000001 = { expectedFileType = sourcecode.c.objc; fileEncoding = 30; isa = PBXFileReference; name = GCObject.m; path = ../Source/Additions/GCObject.m; refType = 2; sourceTree = SOURCE_ROOT; }; 55CF466303E367A500000001 = { expectedFileType = sourcecode.c.objc; fileEncoding = 30; isa = PBXFileReference; name = GSCategories.m; path = ../Source/Additions/GSCategories.m; refType = 2; sourceTree = SOURCE_ROOT; }; 55CF466503E367A500000001 = { expectedFileType = sourcecode.c.objc; fileEncoding = 30; isa = PBXFileReference; name = GSCompatibility.m; path = ../Source/Additions/GSCompatibility.m; refType = 2; sourceTree = SOURCE_ROOT; }; 55CF466603E367A500000001 = { expectedFileType = sourcecode.c.objc; fileEncoding = 30; isa = PBXFileReference; name = GSMime.m; path = ../Source/Additions/GSMime.m; refType = 2; sourceTree = SOURCE_ROOT; }; 55CF466703E367A500000001 = { expectedFileType = sourcecode.c.objc; fileEncoding = 30; isa = PBXFileReference; name = GSNextRuntime.m; path = ../Source/Additions/GSNextRuntime.m; refType = 2; sourceTree = SOURCE_ROOT; }; 55CF466803E367A500000001 = { expectedFileType = sourcecode.c.objc; fileEncoding = 30; isa = PBXFileReference; name = GSObjCRuntime.m; path = ../Source/Additions/GSObjCRuntime.m; refType = 2; sourceTree = SOURCE_ROOT; }; 55CF466903E367A500000001 = { expectedFileType = sourcecode.c.objc; fileEncoding = 30; isa = PBXFileReference; name = GSXML.m; path = ../Source/Additions/GSXML.m; refType = 2; sourceTree = SOURCE_ROOT; }; 55CF466A03E367A500000001 = { expectedFileType = sourcecode.c.objc; fileEncoding = 30; isa = PBXFileReference; name = Unicode.m; path = ../Source/Additions/Unicode.m; refType = 2; sourceTree = SOURCE_ROOT; }; 55CF466B03E367A500000001 = { fileRef = 55CF465F03E367A500000001; isa = PBXBuildFile; settings = { }; }; 55CF467D03E3694000000001 = { buildActionMask = 12; files = ( ); isa = PBXShellScriptBuildPhase; runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "myHeaderDir=\"${BUILD_ROOT}/`dirname ${INNER_PRODUCT_SUBPATH}`/Headers\"\nmkdir ${myHeaderDir}/base\ncd ${myHeaderDir}/base\ntest -f behavior.h || ln -s ../behavior.h .\ntest -f objc-gnu2next.h || ln -s ../objc-gnu2next.h .\ntest -f preface.h || ln -s ../preface.h .\ntest -f GCObject.h || ln -s ../GCObject.h .\ntest -f GNUstep.h || ln -s ../GNUstep.h .\ntest -f GSCategories.h || ln -s ../GSCategories.h .\ntest -f GSCompatibility.h || ln -s ../GSCompatibility.h .\ntest -f GSMime.h || ln -s ../GSMime.h .\ntest -f GSXML.h || ln -s ../GSXML.h .\ntest -f GSObjCRuntime.h || ln -s ../GSObjCRuntime.h .\ntest -f Unicode.h || ln -s ../Unicode.h .\ntest -f thr-mach.h || ln -s ../thr-mach.h ."; }; 55CF467E03E369AE00000001 = { fileRef = 0867D69BFE84028FC02AAC07; isa = PBXBuildFile; settings = { }; }; 55E1346E043268A100000002 = { expectedFileType = sourcecode.c.h; fileEncoding = 30; isa = PBXFileReference; name = GSPrivate.h; path = ../Source/GSPrivate.h; refType = 4; sourceTree = ""; }; 55F7D5D003E4072000000001 = { fileRef = 55CF466703E367A500000001; isa = PBXBuildFile; settings = { }; }; 55F7D5D403E47F9300000001 = { fileRef = 55CF466803E367A500000001; isa = PBXBuildFile; settings = { }; }; 55F7D5D603E48A2800000001 = { fileRef = 55CF466203E367A500000001; isa = PBXBuildFile; settings = { }; }; 55F7D5D703E48A7500000001 = { fileRef = 55CF466503E367A500000001; isa = PBXBuildFile; settings = { }; }; 55F7D5D903E48B8600000001 = { fileRef = 55CF466003E367A500000001; isa = PBXBuildFile; settings = { }; }; 55F7D5DA03E48B8700000001 = { fileRef = 55CF466103E367A500000001; isa = PBXBuildFile; settings = { }; }; 55F7D5E003E48C8300000001 = { fileRef = 55CF466303E367A500000001; isa = PBXBuildFile; settings = { }; }; 55F7D5E303E48D0A00000001 = { fileRef = 55CF466603E367A500000001; isa = PBXBuildFile; settings = { }; }; 55F7D7D803E49C1000000001 = { expectedFileType = text; fileEncoding = 30; isa = PBXFileReference; name = ANNOUNCE; path = ../ANNOUNCE; refType = 4; sourceTree = ""; }; 55F7D7D903E49C1000000001 = { expectedFileType = file; fileEncoding = 30; isa = PBXFileReference; name = BUGS; path = ../BUGS; refType = 4; sourceTree = ""; }; 55F7D7DA03E49C1000000001 = { expectedFileType = text; fileEncoding = 30; isa = PBXFileReference; name = ChangeLog; path = ../ChangeLog; refType = 4; sourceTree = ""; }; 55F7D7DB03E49C1000000001 = { expectedFileType = text; fileEncoding = 30; isa = PBXFileReference; name = COPYING; path = ../COPYING; refType = 4; sourceTree = ""; }; 55F7D7DC03E49C1000000001 = { expectedFileType = text; fileEncoding = 30; isa = PBXFileReference; name = COPYING.LIB; path = ../COPYING.LIB; refType = 4; sourceTree = ""; }; 55F7D7DD03E49C1000000001 = { expectedFileType = text; fileEncoding = 30; isa = PBXFileReference; name = INSTALL; path = ../INSTALL; refType = 4; sourceTree = ""; }; 55F7D7DE03E49C1000000001 = { expectedFileType = text; fileEncoding = 30; isa = PBXFileReference; name = NEWS; path = ../NEWS; refType = 4; sourceTree = ""; }; 55F7D7DF03E49C1000000001 = { expectedFileType = text; fileEncoding = 30; isa = PBXFileReference; name = README; path = ../README; refType = 4; sourceTree = ""; }; 55F7D7E003E49D7700000001 = { expectedFileType = sourcecode.c.h; fileEncoding = 30; isa = PBXFileReference; path = config.h; refType = 2; sourceTree = SOURCE_ROOT; }; 55F7D7E303E49D7700000001 = { fileRef = 55F7D7E003E49D7700000001; isa = PBXBuildFile; settings = { }; }; //550 //551 //552 //553 //554 //EF0 //EF1 //EF2 //EF3 //EF4 EFEFAC3C055D9BC400B39730 = { expectedFileType = sourcecode.c.h; fileEncoding = 30; isa = PBXFileReference; path = GSLock.h; refType = 4; sourceTree = ""; }; EFEFAC3D055D9BC400B39730 = { fileRef = EFEFAC3C055D9BC400B39730; isa = PBXBuildFile; settings = { }; }; EFEFAC3E055D9BF400B39730 = { expectedFileType = sourcecode.c.objc; fileEncoding = 30; isa = PBXFileReference; name = GSLock.m; path = Additions/GSLock.m; refType = 4; sourceTree = ""; }; EFEFAC3F055D9BF400B39730 = { fileRef = EFEFAC3E055D9BF400B39730; isa = PBXBuildFile; settings = { }; }; EFF06DE3054E5BDA002EC6F5 = { containerPortal = 0867D690FE84028FC02AAC07; isa = PBXContainerItemProxy; proxyType = 1; remoteGlobalIDString = 0867D69CFE84028FC02AAC07; remoteInfo = gnustep; }; EFF06DE4054E5BDA002EC6F5 = { containerPortal = 0867D690FE84028FC02AAC07; isa = PBXContainerItemProxy; proxyType = 1; remoteGlobalIDString = 0867D69CFE84028FC02AAC07; remoteInfo = gnustep; }; EFF20035050D035500A80103 = { expectedFileType = sourcecode.c.objc; fileEncoding = 30; isa = PBXFileReference; path = NSDecimal.m; refType = 4; sourceTree = ""; }; }; rootObject = 0867D690FE84028FC02AAC07; } gnustep-base-1.29.0/standalone.conf000066400000000000000000000073701435650067400172200ustar00rootroot00000000000000# # Standalone file system layout # # This is a *deployment* layout for standalone application deployment, # with all the libraries and executables stored in one place. # If changing this layout, please also update the corresponding file in # gnustep-make (FilesystemLayouts/standalone). # # You can configure gnustep-base using # --with-config-file=./GNUstep.conf --with-default-config=standalone.conf # to provide built-in path information from this file, but permit it to be # overridden by a GNUstep.conf file at runtime. # # You can configure gnustep-base using # --with-config-file=./ --with-default-config=standalone.conf # to tell if to ignore any GNUstep.conf file and always use the built-in # location information obtained from this file. # # This tells gnustep-make to put the 'standalone' directory in your home # directory. It's not actually used for a deployed application, but this # matches the configuration you would have used when building your code. GNUSTEP_DEFAULT_PREFIX=~ # These are only used to implement the NSUserDirectory API. # They are used literally, without the default prefix. GNUSTEP_SYSTEM_USERS_DIR=/home GNUSTEP_NETWORK_USERS_DIR=/home GNUSTEP_LOCAL_USERS_DIR=/home # This is used by gnustep-make when building/installing systems and is not # actually relevant to a deployed application. GNUSTEP_MAKEFILES=./Makefiles # The following path settings are designed to find all resources relative to # the configured location of the GNUstep config file, which should itself # be found at a location relative to the gnustep-base library. # So normally, the '.' in these paths represents the 'standalone' directory # you will have copied into your application. # The paths locate all binaries (libraries and executables) in the same # directory, but puts documentation and headers in subdirectories since # you may wish to delete those rather then distribute them with your app. GNUSTEP_SYSTEM_APPS=./ GNUSTEP_SYSTEM_ADMIN_APPS=./ GNUSTEP_SYSTEM_WEB_APPS=./ GNUSTEP_SYSTEM_TOOLS=./ GNUSTEP_SYSTEM_ADMIN_TOOLS=./ GNUSTEP_SYSTEM_LIBRARY=./ GNUSTEP_SYSTEM_HEADERS=./include GNUSTEP_SYSTEM_LIBRARIES=./ GNUSTEP_SYSTEM_DOC=./Documentation GNUSTEP_SYSTEM_DOC_MAN=./man GNUSTEP_SYSTEM_DOC_INFO=./info GNUSTEP_NETWORK_APPS=./ GNUSTEP_NETWORK_ADMIN_APPS=./ GNUSTEP_NETWORK_WEB_APPS=./ GNUSTEP_NETWORK_TOOLS=./ GNUSTEP_NETWORK_ADMIN_TOOLS=./ GNUSTEP_NETWORK_LIBRARY=./ GNUSTEP_NETWORK_HEADERS=./include GNUSTEP_NETWORK_LIBRARIES=./ GNUSTEP_NETWORK_DOC=./Documentation GNUSTEP_NETWORK_DOC_MAN=./man GNUSTEP_NETWORK_DOC_INFO=./info GNUSTEP_LOCAL_APPS=./ GNUSTEP_LOCAL_ADMIN_APPS=./ GNUSTEP_LOCAL_WEB_APPS=./ GNUSTEP_LOCAL_TOOLS=./ GNUSTEP_LOCAL_ADMIN_TOOLS=./ GNUSTEP_LOCAL_LIBRARY=./ GNUSTEP_LOCAL_HEADERS=./include GNUSTEP_LOCAL_LIBRARIES=./ GNUSTEP_LOCAL_DOC=./Documentation GNUSTEP_LOCAL_DOC_MAN=./man GNUSTEP_LOCAL_DOC_INFO=./info # For a standalone deployment we use the normal directory layout for # user resources, but hide that in .GNUstep rather than the normal # GNUstep directory since we assume that a standalone deployment implies # that the target system is non-gnustep and the user won't be expecting # to see GNUstep in their home directory. GNUSTEP_USER_DIR_APPS=.GNUstep/Applications GNUSTEP_USER_DIR_ADMIN_APPS=.GNUstep/Applications/Admin GNUSTEP_USER_DIR_WEB_APPS=.GNUstep/WebApplications GNUSTEP_USER_DIR_TOOLS=.GNUstep/Tools GNUSTEP_USER_DIR_ADMIN_TOOLS=.GNUstep/Tools/Admin GNUSTEP_USER_DIR_LIBRARY=.GNUstep/Library GNUSTEP_USER_DIR_HEADERS=.GNUstep/Library/Headers GNUSTEP_USER_DIR_LIBRARIES=.GNUstep/Library/Libraries GNUSTEP_USER_DIR_DOC=.GNUstep/Library/Documentation GNUSTEP_USER_DIR_DOC_MAN=.GNUstep/Library/Documentation/man GNUSTEP_USER_DIR_DOC_INFO=.GNUstep/Library/Documentation/info GNUSTEP_USER_CONFIG_FILE=.GNUstep.conf GNUSTEP_USER_DEFAULTS_DIR=.GNUstep/Defaults